From e3e40af149d3614a62d328d6701cc441abd5c6ae Mon Sep 17 00:00:00 2001 From: jason Date: Sun, 7 Jun 2026 01:18:02 -0500 Subject: [PATCH] ver0.5 --- .../BOOTSTRAP.md | 170 ++++++++++++++++++ .../echo-vault-control-2026-06-07/CLAUDE.md | 42 +++++ .../echo-vault-control-2026-06-07/README.md | 17 ++ .../STRUCTURE.md | 78 ++++++++ .../echo-vault-control-2026-06-07/_ABOUT.md | 3 + backup/echo-vault-control-2026-06-07/index.md | 18 ++ echo-memory.plugin | Bin 19882 -> 30697 bytes .../.claude-plugin/plugin.json | 4 +- echo-memory.plugin.src/README.md | 30 +++- .../skills/echo-memory/SKILL.md | 20 ++- .../echo-memory/references/api-reference.md | 1 + .../echo-memory/references/bootstrap.md | 132 +++++++++++--- .../references/operating-contract.md | 36 ++++ .../echo-memory/references/vault-layout.md | 8 +- .../echo-memory/scaffold/README.vault.md | 12 ++ .../scaffold/anchors/current-context.seed.md | 25 +++ .../scaffold/anchors/inbox.seed.md | 3 + .../anchors/operator-preferences.seed.md | 31 ++++ .../skills/echo-memory/scaffold/echo-vault.md | 19 ++ .../templates/context-bundle-template.md | 27 +++ .../templates/semantic-memory-template.md | 23 +++ .../_agent/templates/session-log-template.md | 29 +++ .../templates/working-memory-template.md | 22 +++ .../templates/decisions/decision-template.md | 25 +++ .../journal/templates/daily-note-template.md | 25 +++ .../templates/weekly-review-template.md | 26 +++ .../templates/projects/project-template.md | 31 ++++ 27 files changed, 819 insertions(+), 38 deletions(-) create mode 100644 backup/echo-vault-control-2026-06-07/BOOTSTRAP.md create mode 100644 backup/echo-vault-control-2026-06-07/CLAUDE.md create mode 100644 backup/echo-vault-control-2026-06-07/README.md create mode 100644 backup/echo-vault-control-2026-06-07/STRUCTURE.md create mode 100644 backup/echo-vault-control-2026-06-07/_ABOUT.md create mode 100644 backup/echo-vault-control-2026-06-07/index.md create mode 100644 echo-memory.plugin.src/skills/echo-memory/references/operating-contract.md create mode 100644 echo-memory.plugin.src/skills/echo-memory/scaffold/README.vault.md create mode 100644 echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/current-context.seed.md create mode 100644 echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/inbox.seed.md create mode 100644 echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/operator-preferences.seed.md create mode 100644 echo-memory.plugin.src/skills/echo-memory/scaffold/echo-vault.md create mode 100644 echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/context-bundle-template.md create mode 100644 echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/semantic-memory-template.md create mode 100644 echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/session-log-template.md create mode 100644 echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/working-memory-template.md create mode 100644 echo-memory.plugin.src/skills/echo-memory/scaffold/templates/decisions/decision-template.md create mode 100644 echo-memory.plugin.src/skills/echo-memory/scaffold/templates/journal/templates/daily-note-template.md create mode 100644 echo-memory.plugin.src/skills/echo-memory/scaffold/templates/journal/templates/weekly-review-template.md create mode 100644 echo-memory.plugin.src/skills/echo-memory/scaffold/templates/projects/project-template.md diff --git a/backup/echo-vault-control-2026-06-07/BOOTSTRAP.md b/backup/echo-vault-control-2026-06-07/BOOTSTRAP.md new file mode 100644 index 0000000..429123b --- /dev/null +++ b/backup/echo-vault-control-2026-06-07/BOOTSTRAP.md @@ -0,0 +1,170 @@ +--- +type: reference +status: active +created: 2026-06-02 +updated: 2026-06-07 +tags: [agent, bootstrap, system] +agent_written: true +source_notes: [] +--- + +# BOOTSTRAP.md + +## Purpose +This is the **first file any agent reads** when operating against this vault. It does two things: + +1. **Checks** that the required files and folders exist. +2. **Generates** anything that is missing, using the templates and conventions below. + +Day-to-day operating procedure is **not** defined here — it is owned by the echo-memory skill (see section 3). Run the bootstrap preflight at the start of a session, then follow the skill. The check is cheap, idempotent, and safe to repeat. + +--- + +## 1. Preflight Check + +Verify the following exist. Treat each as `[ ]` until confirmed, then `[x]`. If a path is missing, jump to the matching entry in section 2 (Repair) before continuing. + +### Root control docs +- [ ] `CLAUDE.md` — operating contract and session protocol +- [ ] `BOOTSTRAP.md` — this file +- [ ] `STRUCTURE.md` — layout, taxonomy, frontmatter standard +- [ ] `index.md` — navigation hub +- [ ] `README.md` — human-facing overview +- [ ] `.env.example` — config template for REST/API clients + +### Required folders +- [ ] `inbox/` (with `captures/`, `imports/`, `processing-log/`) +- [ ] `journal/` (with `daily/`, `weekly/`, `monthly/`, `templates/`) +- [ ] `projects/` (with `active/`, `incubating/`, `on-hold/`, `archived/`) +- [ ] `areas/` (with `business/`, `personal/`, `learning/`, `systems/`) +- [ ] `resources/` (with `concepts/`, `references/`, `people/`, `meetings/`, `source-material/`) +- [ ] `decisions/` (with `by-date/`; `by-project/` is **deprecated** — see note below) +- [ ] `reviews/` (with `weekly/`, `monthly/`, `quarterly/`, `annual/`) +- [ ] `archive/` (with `notes/`, `projects/`, `imports/`) +- [ ] `_agent/` (see agent subtree below) + +> **`decisions/by-project/` is deprecated** (0.4.0). Decision notes go in `decisions/by-date/YYYY-MM-DD-.md`; if a decision belongs to an active project, mirror it as a `[[wikilink]]` under that project's `## Key Decisions` heading rather than creating a topical by-project file. + +### Required `_agent/` subtree +- [ ] `_agent/context/` — active context bundles +- [ ] `_agent/memory/working/` — short-lived working memory +- [ ] `_agent/memory/episodic/` — event/session-derived memory +- [ ] `_agent/memory/semantic/` — durable facts, patterns, preferences +- [ ] `_agent/sessions/` — session logs +- [ ] `_agent/templates/` — note templates +- [ ] `_agent/heartbeat/` — liveness / scheduled-run markers +- [ ] `_agent/skills/` (with `active/`, `archived/`) +- [ ] `_agent/outputs/` (with `briefs/`, `drafts/`, `summaries/`, `synthesis/`) + +### Required templates +- [ ] `_agent/templates/session-log-template.md` +- [ ] `_agent/templates/context-bundle-template.md` +- [ ] `_agent/templates/working-memory-template.md` +- [ ] `_agent/templates/semantic-memory-template.md` +- [ ] `journal/templates/daily-note-template.md` +- [ ] `journal/templates/weekly-review-template.md` +- [ ] `projects/project-template.md` +- [ ] `decisions/decision-template.md` + +### Anchor notes (recommended, not blocking) +- [ ] `_agent/context/current-context.md` +- [ ] `_agent/memory/semantic/operator-preferences.md` +- [ ] today's daily note in `journal/daily/YYYY-MM-DD.md` + +A quick way to list the tree for comparison: + +```bash +find . -type d | sort # folders +find . -type f -name '*.md' | sort # notes +``` + +--- + +## 2. Repair (generate what's missing) + +Only create what is missing. **Never overwrite an existing file** during bootstrap — that violates the additive-update principle in [[CLAUDE]]. If a file exists but looks malformed, flag it in the session log instead of replacing it. + +### Missing folders +Create the folder and add a one-line `README.md` inside any leaf folder that would otherwise be empty (Obsidian and git both ignore empty dirs): + +```bash +mkdir -p "" +``` + +### Missing root control docs +- `STRUCTURE.md`, `README.md`, `.env.example` — if absent, note it and reconstruct from the conventions in this file and [[STRUCTURE]]. Do not invent secrets in `.env.example`; use placeholders only. +- `index.md` — rebuild as a link hub pointing at the Start Here docs, active context, operator preferences, and the most recent daily note / session log. + +### Missing templates +Recreate from the canonical frontmatter (section 4). Each template is just frontmatter plus the section headings its note type uses. + +### Missing anchor notes +- `_agent/context/current-context.md` — create an empty context bundle (type `context-bundle`) scoped to the current task. +- today's daily note — create from `journal/templates/daily-note-template.md`. +- `operator-preferences.md` — only create if you have evidence to record; do not fabricate preferences. + +### After repair +Append a line to the daily note's **Agent Log** and write/refresh a session log in `_agent/sessions/` recording what was generated. + +--- + +## 3. How to Operate (after preflight) + +Day-to-day operating procedure is owned by the **echo-memory skill** (`SKILL.md`; canonical source `git.alwisp.com/jason/echo`), not this file. The skill defines: session loading order, search-first-before-write, Inbox Triage, Scope Switching, doc-map-before-first-PATCH, the resilient daily-note Agent Log procedure, idempotent appends, and the monthly Vault Health pass. **If this file and the skill ever disagree on procedure, the skill is authoritative.** BOOTSTRAP's job is limited to the structure preflight (section 1) and repair (section 2). + +The durable reference below binds regardless of client: + +### Memory model (where things live) +- **Working** → `_agent/memory/working/` — transient, time-boxed. +- **Episodic** → `_agent/memory/episodic/` — what happened, when. +- **Semantic** → `_agent/memory/semantic/` — durable facts, patterns, preferences. +- **Context bundles** → `_agent/context/` — task-focused reading lists and state. + +### Safety rules (from [[CLAUDE]]) +- Do not fabricate facts, relationships, or prior decisions. +- Do not mass-restructure the vault unless explicitly asked. +- Do not delete notes unless deletion is explicitly requested and clearly safe. +- Do not store secrets or API keys inside the vault. +- Default to additive updates and explicit status changes. + +--- + +## 4. Canonical Frontmatter + +Every note carries this block. Fill what applies; leave the rest empty rather than guessing. + +```yaml +--- +type: # one of the note types in STRUCTURE.md +status: # active | draft | done | archived +created: # YYYY-MM-DD +updated: # YYYY-MM-DD +tags: [] +agent_written: false +source_notes: [] # plain relative paths as strings — NEVER [[wikilinks]] +--- +``` + +Agent-generated notes set `agent_written: true` and list their `source_notes`. This is the key signal that separates agent-managed content from human-authored content. + +> **No `[[wikilinks]]` in frontmatter.** YAML interprets `[[...]]` as nested lists, so wiki +> links in frontmatter break — they do not render as clickable links in Obsidian's reading +> view. Put every cross-reference in a **`## Related`** section in the note **body** as a +> bulleted list of `[[links]]`. Frontmatter holds scalar/string metadata only; `source_notes` +> values are plain relative paths, not links. (The older `related:` frontmatter field has +> been retired for this reason.) + +--- + +## 5. REST / API Readiness + +Future clients (Obsidian Local REST API, CoWork plugin) may operate without filesystem access. Keep the bootstrap contract portable: stable paths, parseable frontmatter, durable titles, and all state stored in notes rather than hidden conversation memory. Config for those clients lives in a local `.env` derived from `.env.example` — never committed with real values. + +--- + +_This file is the entry point. If you change folder conventions or required files, update both this manifest and [[STRUCTURE]] so they stay in sync._ + +## Related +- [[CLAUDE]] +- [[STRUCTURE]] +- [[index]] diff --git a/backup/echo-vault-control-2026-06-07/CLAUDE.md b/backup/echo-vault-control-2026-06-07/CLAUDE.md new file mode 100644 index 0000000..8dd2ada --- /dev/null +++ b/backup/echo-vault-control-2026-06-07/CLAUDE.md @@ -0,0 +1,42 @@ +# CLAUDE.md + +## Purpose +This vault is a shared memory substrate for human work, Claude Code sessions, and future agent clients that access the vault through the Obsidian Local REST API or a CoWork plugin integration. The vault must remain readable by humans, writable by agents, and structured enough that tools can reliably navigate, synthesize, and update knowledge over time. + +## Core Principles +- Treat the vault as the system of record for long-term memory, not as a scratchpad. +- Prefer Markdown, YAML frontmatter, wiki-links, and stable folder conventions over proprietary structures. +- Write notes so both humans and agents can understand them without hidden context. +- Preserve history instead of silently overwriting important decisions, summaries, or inferred preferences. +- Keep agent-managed content clearly separated from human-authored content when possible. +- Default to additive updates, explicit status changes, and traceable summaries. +- Optimize for portability so the same vault can work with Claude Code, CoWork, MCP-compatible tools, REST API clients, and future agents. + +## What This Agent Is +You are an agent operating against an Obsidian vault that functions as an AI second brain. Your role is to read context, synthesize across notes, create structured outputs, update memory carefully, and leave durable traces of work in the vault rather than keeping important state inside the conversation only. + +## Bootstrap (Start Here) +Before anything else in a new session, read [[BOOTSTRAP]] (`BOOTSTRAP.md`) and run its structure preflight, repairing any missing files/folders. Never overwrite existing files during bootstrap — generate only what is missing. + +## Operating Contract +Day-to-day procedure is defined by the **echo-memory skill** (`SKILL.md`; canonical source `git.alwisp.com/jason/echo`), not by this file. The skill owns: session loading order, search-first-before-write, Inbox Triage, Scope Switching, doc-map-before-first-PATCH, idempotent appends, the resilient daily-note Agent Log procedure, and the monthly Vault Health pass. Run the [[BOOTSTRAP]] preflight first, then follow the skill. **If this file and the skill disagree on procedure, the skill is authoritative.** The principles, memory model, and safety rules in this file are durable and bind regardless of client. + +## Memory Model +- Working memory: `_agent/memory/working/` +- Episodic memory: `_agent/memory/episodic/` +- Semantic memory: `_agent/memory/semantic/` +- Task-focused context bundles: `_agent/context/` + +## REST/API Readiness +Assume future clients may interact through the Obsidian Local REST API instead of direct filesystem access. Keep paths predictable, frontmatter parseable, titles stable, and state stored in notes rather than hidden memory. + +## Safety +- Do not fabricate facts, relationships, or prior decisions. +- Do not mass-restructure the vault unless explicitly asked. +- Do not delete notes unless deletion is explicitly requested and clearly safe. +- Do not store secrets or API keys inside the vault. + +## Related +- [[BOOTSTRAP]] +- [[STRUCTURE]] +- [[index]] diff --git a/backup/echo-vault-control-2026-06-07/README.md b/backup/echo-vault-control-2026-06-07/README.md new file mode 100644 index 0000000..0616584 --- /dev/null +++ b/backup/echo-vault-control-2026-06-07/README.md @@ -0,0 +1,17 @@ +# ECHO Memory Vault + +ECHO is an Obsidian-based memory vault serving as the persistent second brain for Jason Stedwell — operator and architect. It is designed for Claude/CoWork sessions, Claude Code, and any client speaking the Obsidian Local REST API. + +## Included +- Root control docs: `CLAUDE.md`, `STRUCTURE.md`, `BOOTSTRAP.md` +- Core knowledge folders (inbox, journal, projects, areas, resources, decisions, reviews, archive) +- Agent memory and session folders (`_agent/`) +- Canonical templates and seed anchor notes +- `index.md` navigation hub +- `.env.example` for REST client config + +## Operating logic +Day-to-day procedure is owned by the **echo-memory skill** (canonical source `git.alwisp.com/jason/echo`), not the control docs in this vault. `CLAUDE.md` and `BOOTSTRAP.md` cover principles, structure, and safety; the skill is authoritative on procedure. + +## Lineage +ECHO is the successor to Jason's earlier obsidian-memory system and a sibling of the goldbrain vault built for Bryan Gilliom. Same conventions, different operator: in ECHO, "the operator" is Jason. diff --git a/backup/echo-vault-control-2026-06-07/STRUCTURE.md b/backup/echo-vault-control-2026-06-07/STRUCTURE.md new file mode 100644 index 0000000..7558c44 --- /dev/null +++ b/backup/echo-vault-control-2026-06-07/STRUCTURE.md @@ -0,0 +1,78 @@ +# STRUCTURE.md + +## Purpose +This document defines the vault layout, note taxonomy, naming conventions, and frontmatter templates for a memory storage vault designed for Claude Code today and future CoWork plugin access through the Obsidian Local REST API. + +## Recommended Vault Layout + +```text +vault/ +├── CLAUDE.md +├── STRUCTURE.md +├── BOOTSTRAP.md +├── index.md +├── README.md +├── inbox/ +├── journal/ +├── projects/ +├── areas/ +├── resources/ +├── decisions/ +├── reviews/ +├── _agent/ +└── archive/ +``` + +## Note Types +- daily-note +- weekly-note +- monthly-note +- project +- project-update +- area +- concept +- reference +- person +- meeting +- decision +- review +- session-log +- working-memory +- episodic-memory +- semantic-memory +- context-bundle +- skill +- draft +- inbox-item + +## Project Lifecycle +Project notes live in one of four subfolders by state, and `frontmatter.status` MUST match the folder: + +- `projects/active/` — `status: active` (current work) +- `projects/incubating/` — `status: incubating` (idea stage) +- `projects/on-hold/` — `status: on-hold` (paused but kept) +- `projects/archived/` — `status: archived` (done/abandoned) + +Promotion between states = move the file **and** update `status`. Before creating a new project note, search all four subfolders for the slug (the echo-memory skill's mandatory search-first rule) — a duplicate in a non-active folder is the most common drift bug. + +## Decisions +Decision notes live in `decisions/by-date/YYYY-MM-DD-.md`. `decisions/by-project/` is **deprecated** — instead, mirror a project-relevant decision as a `[[wikilink]]` under that project's `## Key Decisions` heading. + +## Core Frontmatter +```yaml +--- +type: +status: +created: +updated: +tags: [] +agent_written: false +source_notes: [] # plain relative paths as strings — NEVER [[wikilinks]] +--- +``` + +> **No `[[wikilinks]]` in frontmatter.** YAML parses `[[...]]` as nested lists, so wiki +> links placed in frontmatter (e.g. an old `related:` field) silently break and do not +> render as clickable links. All cross-references go in a **`## Related`** section in the +> note **body**, as a bulleted list of `[[links]]`. Keep frontmatter to scalar/string +> metadata only. `source_notes`, when used, holds plain relative path strings, not links. diff --git a/backup/echo-vault-control-2026-06-07/_ABOUT.md b/backup/echo-vault-control-2026-06-07/_ABOUT.md new file mode 100644 index 0000000..9cfe154 --- /dev/null +++ b/backup/echo-vault-control-2026-06-07/_ABOUT.md @@ -0,0 +1,3 @@ +Backup of ECHO vault root control docs as they existed before the 0.5.0 self-bootstrap migration (2026-06-07). +These were deleted from the live vault; their logic now lives in the echo-memory plugin. +README.md here is the OLD verbose version (replaced in-vault by a thin signpost). diff --git a/backup/echo-vault-control-2026-06-07/index.md b/backup/echo-vault-control-2026-06-07/index.md new file mode 100644 index 0000000..61edb31 --- /dev/null +++ b/backup/echo-vault-control-2026-06-07/index.md @@ -0,0 +1,18 @@ +# Vault Index + +## Start Here +- [[README]] +- [[CLAUDE]] +- [[STRUCTURE]] +- [[BOOTSTRAP]] + +## Operational Notes +- [[_agent/context/current-context]] — active scope & priorities +- [[_agent/memory/semantic/operator-preferences]] — durable operator profile +- Latest daily note: `journal/daily/` (most recent by date) +- Latest session log: `_agent/sessions/` (most recent by filename) + +## Reference Notes +- [[resources/concepts/agent-memory-model]] +- [[resources/references/obsidian-local-rest-api]] +- [[resources/people/jason-stedwell]] diff --git a/echo-memory.plugin b/echo-memory.plugin index baa57970e1845ca0eda19a0e85c474c2e2bffcf5..f3107f035d32107b69b9d8030d67e511c09c42e0 100644 GIT binary patch literal 30697 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 NP(VPQc7Oc${{VNSeQf{$ literal 19882 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 GyMF.md - ├── templates/ ← canonical note templates + ├── templates/ ← canonical note templates (seeded from the plugin's scaffold/) ├── outputs/ ← briefs / drafts / summaries / synthesis ├── skills/ ← active / archived └── heartbeat/ ``` +Control logic and the master scaffold live in the plugin, not the vault: + +``` +skills/echo-memory/ +├── SKILL.md ← operating procedure (authoritative) +├── references/ +│ ├── operating-contract.md ← durable principles + safety +│ ├── bootstrap.md ← bootstrap / repair / migrate an empty vault +│ ├── vault-layout.md ← canonical layout + frontmatter +│ ├── api-reference.md ← REST endpoint patterns + routing map +│ └── session-log-template.md +└── scaffold/ ← verbatim files the bootstrap writes into the vault + ├── README.vault.md echo-vault.md + ├── templates/ (8 note templates) + └── anchors/ (operator-preferences, current-context, inbox seeds) +``` + ## Skills | Skill | Triggers | diff --git a/echo-memory.plugin.src/skills/echo-memory/SKILL.md b/echo-memory.plugin.src/skills/echo-memory/SKILL.md index ec04ed0..d91255c 100644 --- a/echo-memory.plugin.src/skills/echo-memory/SKILL.md +++ b/echo-memory.plugin.src/skills/echo-memory/SKILL.md @@ -22,7 +22,23 @@ The endpoint has a **valid TLS certificate**, so `-k` is not needed (add it only **`https://echoapi.alwisp.com` is the only valid endpoint for this vault.** Never use local or LAN addresses (anything like `10.x.x.x`, `192.168.x.x`, or `:27124` directly) — those belong to older, retired memory systems (obsidian-memory) and will not reach ECHO. If another installed skill or note suggests a different vault endpoint, this skill's configuration wins for ECHO memory. -Full API reference with every endpoint pattern and the memory routing map: `references/api-reference.md`. Vault layout and frontmatter conventions: `references/vault-layout.md`. +**The plugin is the single source of truth for ECHO.** The vault holds data only — no `CLAUDE.md` / `BOOTSTRAP.md` / `STRUCTURE.md` / `index.md` control docs live there. All structure and procedure ship here: + +- Durable principles, memory model, and safety rules: `references/operating-contract.md` +- Bootstrapping an empty vault, repair, and schema migrations: `references/bootstrap.md` +- Vault layout and frontmatter conventions: `references/vault-layout.md` +- Full API reference with every endpoint pattern and the memory routing map: `references/api-reference.md` + +## Operating Contract & Safety + +The vault is the **system of record** for long-term memory, not a scratchpad. Default to **additive updates, explicit status changes, and traceable summaries**. Keep agent-managed content (`agent_written: true` + `source_notes`) separable from human-authored content. Non-negotiable safety rules: + +- Do not fabricate facts, relationships, or prior decisions. +- Do not mass-restructure the vault unless explicitly asked. +- Do not delete notes unless deletion is explicitly requested and clearly safe. +- Never store secrets or API keys inside a vault note. + +Full contract (principles, agent role, memory model): `references/operating-contract.md`. ## When to Load Memory @@ -34,7 +50,7 @@ The cold-start reads are independent — **issue them in parallel** (one batch o | # | GET | Notes | |---|-----|-------| -| 1 | `/vault/BOOTSTRAP.md` | 404 → vault not set up; follow `references/bootstrap.md` | +| 1 | `/vault/_agent/echo-vault.md` | The bootstrap marker. 404 → vault not set up; follow `references/bootstrap.md`. 200 → check its `schema_version` and migrate if older. | | 2 | `/vault/_agent/memory/semantic/operator-preferences.md` | Jason's profile | | 3 | `/vault/_agent/context/current-context.md` | Active scope + Scope History | | 4 | `/vault/_agent/sessions/` (listing) | Pick the ~5 most recent by reverse lex sort (filenames `YYYY-MM-DD-HHMM-.md`, so lex == chrono); only read the ones whose slugs look relevant | diff --git a/echo-memory.plugin.src/skills/echo-memory/references/api-reference.md b/echo-memory.plugin.src/skills/echo-memory/references/api-reference.md index da54504..7b77444 100644 --- a/echo-memory.plugin.src/skills/echo-memory/references/api-reference.md +++ b/echo-memory.plugin.src/skills/echo-memory/references/api-reference.md @@ -203,5 +203,6 @@ Only on explicit operator request. Deletion is destructive. | Concept / reference note | `resources/concepts/` or `resources/references/` | PUT | | Daily activity / Agent Log | `journal/daily/YYYY-MM-DD.md` | POST / PATCH | | Periodic review | `reviews/{weekly,monthly,quarterly,annual}/` | PUT | +| Bootstrap marker (plugin-owned) | `_agent/echo-vault.md` (`schema_version`, bootstrap date) — the "is this vault set up?" probe | GET / PUT | **Slug rules:** kebab-case, ASCII, ~40 chars max. Every file carries canonical frontmatter (see `vault-layout.md`). diff --git a/echo-memory.plugin.src/skills/echo-memory/references/bootstrap.md b/echo-memory.plugin.src/skills/echo-memory/references/bootstrap.md index 9021d04..f5487c5 100644 --- a/echo-memory.plugin.src/skills/echo-memory/references/bootstrap.md +++ b/echo-memory.plugin.src/skills/echo-memory/references/bootstrap.md @@ -1,37 +1,121 @@ -# Bootstrap Procedure +# Bootstrap & Repair -The ECHO vault ships its **own** `BOOTSTRAP.md` at the vault root — that file is the canonical preflight/repair manifest. This plugin defers to it rather than duplicating the logic. +The **plugin is the single source of truth** for ECHO's structure. Everything needed to stand up a vault ships in this skill under `scaffold/` — there is no dependency on any in-vault control doc and no external/local re-seed path. This makes the vault portable: point the REST API at any empty Obsidian vault, run this procedure, and it becomes a working ECHO vault. -## Normal case — vault already bootstrapped +The vault holds **data only**. It carries no `CLAUDE.md` / `BOOTSTRAP.md` / `STRUCTURE.md` / `index.md`. The "is this vault set up?" signal is a small marker file, `_agent/echo-vault.md`. -ECHO was bootstrapped on 2026-06-05, so this is the expected path. At session start, read the in-vault manifest: - -```bash -curl -s \ - -H "Authorization: Bearer 241265fbe6830934a9a4ad3e69335f64a42153b663aa5b0017cb1ea1217b2bab" \ - "https://echoapi.alwisp.com/vault/BOOTSTRAP.md" +``` +AUTH="Authorization: Bearer 241265fbe6830934a9a4ad3e69335f64a42153b663aa5b0017cb1ea1217b2bab" +BASE="https://echoapi.alwisp.com" ``` -If it returns content (200), the vault is set up. Skim its preflight checklist, then read `CLAUDE.md` for the operating contract and proceed with the loading procedure in `SKILL.md`. The in-vault `BOOTSTRAP.md` describes how to repair any missing folders/files; follow it if something is absent. **Never overwrite an existing file** during repair — generate only what is missing. +--- -## Fresh-vault case — BOOTSTRAP.md returns 404 +## Probe — is the vault bootstrapped? -This would mean the REST API is pointed at an empty or wrong vault. Confirm with Jason once: +At session start, GET the marker: -> "The ECHO vault looks empty — there's no `BOOTSTRAP.md`. That's unexpected (it was bootstrapped 2026-06-05). Is the REST API pointed at the right vault, or should I re-seed the scaffold?" +```bash +curl -s -o /dev/null -w "%{http_code}" -H "$AUTH" "$BASE/vault/_agent/echo-vault.md" +``` -If a re-seed is wanted, create the minimum viable seed with `PUT` (the API creates intermediate directories automatically), then let the vault's own structure grow from there: +- **200** → bootstrapped. Read the marker's `schema_version`; if it is **less than** the plugin's current schema (1), run a migration pass (see *Migrations* below), otherwise proceed straight to the loading procedure in `SKILL.md`. +- **404** → empty/unconfigured vault. Run **Fresh bootstrap** below. (If you expected an existing vault, confirm with the operator once that the REST API is pointed at the right vault before seeding.) -1. `CLAUDE.md` — operating contract and session protocol -2. `BOOTSTRAP.md` — preflight/repair manifest -3. `STRUCTURE.md` — layout, taxonomy, frontmatter standard -4. `index.md` — navigation hub -5. `_agent/memory/semantic/operator-preferences.md` — operator profile (no fabricated facts) -6. `_agent/context/current-context.md` — empty context bundle -7. `inbox/captures/inbox.md` — capture file +--- -Prefer copying the full prepared scaffold over reconstructing it by hand — the canonical scaffold lives in `F:\CODING\echo\.references\goldbrain-obsidian\` (adapt operator references to Jason). +## Fresh bootstrap (empty vault) -## After bootstrap +Idempotent and additive. **Never overwrite an existing file** — GET-probe each path and skip any that already returns `200`. The marker is written **last**, so the vault is only flagged "set up" after every piece is in place. -Tell Jason briefly what was created, append a line to the daily note's **Agent Log**, and write a session log in `_agent/sessions/`. Do not over-explain — he can browse the vault. +Throughout, `{{DATE}}` means today's date (`YYYY-MM-DD`), resolved from the conversation's `currentDate`. Substitute it before PUTting any scaffold file or anchor seed. + +### 1. Folder tree + +The REST API auto-creates parent directories on PUT, so creating the tree = seeding a file into each leaf. Obsidian and git both ignore empty dirs, so drop a one-line `README.md` into any leaf that wouldn't otherwise receive a file. Required tree (leaves marked `→ README`): + +``` +inbox/captures inbox/imports inbox/processing-log +journal/daily journal/weekly journal/monthly journal/templates +projects/active projects/incubating projects/on-hold projects/archived +areas/business areas/personal areas/learning areas/systems +resources/concepts resources/references resources/people resources/meetings resources/source-material +decisions/by-date +reviews/weekly reviews/monthly reviews/quarterly reviews/annual +archive/notes archive/projects archive/imports +_agent/context _agent/memory/working _agent/memory/episodic _agent/memory/semantic +_agent/sessions _agent/templates _agent/heartbeat +_agent/skills/active _agent/skills/archived +_agent/outputs/briefs _agent/outputs/drafts _agent/outputs/summaries _agent/outputs/synthesis +``` + +> `decisions/by-project/` is intentionally **not** created — it is retired. A project-relevant decision is mirrored as a `[[wikilink]]` under that project's `## Key Decisions` heading instead. + +A leaf README is just a one-liner, e.g.: + +```bash +printf '# %s\n\nMemory vault folder. See the echo-memory plugin for conventions.\n' "captures" \ + | curl -s -X PUT -H "$AUTH" -H "Content-Type: text/markdown" --data-binary @- \ + "$BASE/vault/inbox/captures/README.md" +``` + +### 2. Templates + +PUT every file under this skill's `scaffold/templates/` to its mirrored vault path. The tree mirrors 1:1: + +| Scaffold file | Vault path | +|---|---| +| `scaffold/templates/_agent/templates/session-log-template.md` | `_agent/templates/session-log-template.md` | +| `scaffold/templates/_agent/templates/context-bundle-template.md` | `_agent/templates/context-bundle-template.md` | +| `scaffold/templates/_agent/templates/working-memory-template.md` | `_agent/templates/working-memory-template.md` | +| `scaffold/templates/_agent/templates/semantic-memory-template.md` | `_agent/templates/semantic-memory-template.md` | +| `scaffold/templates/journal/templates/daily-note-template.md` | `journal/templates/daily-note-template.md` | +| `scaffold/templates/journal/templates/weekly-review-template.md` | `journal/templates/weekly-review-template.md` | +| `scaffold/templates/projects/project-template.md` | `projects/project-template.md` | +| `scaffold/templates/decisions/decision-template.md` | `decisions/decision-template.md` | + +Templates keep their Obsidian Templater tokens (`{{date:YYYY-MM-DD}}` etc.) verbatim — those are resolved by Templater / by the skill's daily-note routine, not at seed time. + +```bash +curl -s -X PUT -H "$AUTH" -H "Content-Type: text/markdown" \ + --data-binary @scaffold/templates/journal/templates/daily-note-template.md \ + "$BASE/vault/journal/templates/daily-note-template.md" +``` + +### 3. Anchor seeds (only if absent — no fabricated facts) + +Substitute `{{DATE}}` → today, then PUT each: + +| Scaffold file | Vault path | +|---|---| +| `scaffold/anchors/operator-preferences.seed.md` | `_agent/memory/semantic/operator-preferences.md` | +| `scaffold/anchors/current-context.seed.md` | `_agent/context/current-context.md` | +| `scaffold/anchors/inbox.seed.md` | `inbox/captures/inbox.md` | + +The operator-preferences seed is deliberately empty — **do not invent preferences.** Real facts accrue through use. + +### 4. Vault README (human signpost) + +Substitute `{{DATE}}` if present, then PUT `scaffold/README.vault.md` → `/vault/README.md`. This is the only human-facing control doc in the vault and is **not** read by the agent for routing. + +### 5. Marker (write last) + +Substitute `{{DATE}}`, then PUT `scaffold/echo-vault.md` → `/vault/_agent/echo-vault.md`. Once this returns `200`, the vault is bootstrapped. + +### 6. First-run trace + +Create today's daily note from `journal/templates/daily-note-template.md` (resolve the `{{date:…}}` tokens to today), append a one-line `## Agent Log` entry noting the bootstrap, and write a session log in `_agent/sessions/YYYY-MM-DD-HHMM-bootstrap.md`. Tell the operator briefly what was created. + +--- + +## Repair (existing vault, something missing) + +Run the same steps 1–5, but GET-probe each path first and **only create what is missing**. Never overwrite. If a file exists but looks malformed, flag it in the session log rather than replacing it. Repair is safe to run any time and is the right response if the loading procedure hits an unexpected `404` on a structural path. + +--- + +## Migrations (`schema_version` mismatch) + +When the marker's `schema_version` is older than the plugin's, apply the migration steps for each intervening version, then PATCH the marker's `schema_version` frontmatter to the new value. + +- **0 → 1** (control-docs-in-plugin): the vault previously carried root control docs (`CLAUDE.md`, `BOOTSTRAP.md`, `STRUCTURE.md`, `index.md`). Back them up outside the vault, DELETE them, PUT the thin `scaffold/README.vault.md` over the old verbose `README.md`, write the `_agent/echo-vault.md` marker, and scrub now-dangling `[[CLAUDE]]`/`[[BOOTSTRAP]]`/`[[STRUCTURE]]`/`[[index]]` links from the `## Related` sections of `operator-preferences.md` and `current-context.md` (leave historical session logs alone). Confirm with the operator before deleting. diff --git a/echo-memory.plugin.src/skills/echo-memory/references/operating-contract.md b/echo-memory.plugin.src/skills/echo-memory/references/operating-contract.md new file mode 100644 index 0000000..7cfef3a --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/references/operating-contract.md @@ -0,0 +1,36 @@ +# ECHO — Operating Contract + +The durable, client-independent contract for any agent operating against the ECHO vault. These principles and safety rules formerly lived in the vault's `CLAUDE.md`; they now live in the plugin so they survive regardless of what is (or isn't) in the vault. Day-to-day *procedure* — loading order, search-first, triage, scope switching, PATCH/append rules — is owned by `SKILL.md`. This file holds the things that don't change between sessions or clients. + +## What this agent is + +You are an agent operating against an Obsidian vault that functions as a shared, long-term memory substrate for human work, Claude Code / CoWork sessions, and future REST/MCP clients. Your role is to read context, synthesize across notes, produce structured outputs, update memory carefully, and leave durable traces in the vault rather than keeping important state only in the conversation. The vault is the **system of record**, not a scratchpad. + +## Core principles + +- Treat the vault as the system of record for long-term memory. +- Prefer Markdown, YAML frontmatter, wiki-links, and stable folder conventions over proprietary structures. +- Write notes so both humans and agents can understand them without hidden context. +- Preserve history instead of silently overwriting important decisions, summaries, or inferred preferences. +- Keep agent-managed content (`agent_written: true` + `source_notes`) clearly separated from human-authored content. +- Default to **additive updates, explicit status changes, and traceable summaries.** +- Optimize for portability: the same vault should work across Claude Code, CoWork, MCP-compatible tools, and REST API clients. + +## Memory model (where things live) + +- **Working** → `_agent/memory/working/` — transient, time-boxed. +- **Episodic** → `_agent/memory/episodic/` — what happened, when. +- **Semantic** → `_agent/memory/semantic/` — durable facts, patterns, preferences (`operator-preferences.md`). +- **Context bundles** → `_agent/context/` — task-focused reading lists and active state. + +## Safety rules + +- Do not fabricate facts, relationships, or prior decisions. +- Do not mass-restructure the vault unless explicitly asked. +- Do not delete notes unless deletion is explicitly requested and clearly safe. +- Do not store secrets or API keys inside the vault, and never write the API key into a vault note. +- Default to additive updates and explicit status changes over destructive edits. + +## REST/API readiness + +Assume clients may operate without filesystem access, through the Obsidian Local REST API. Keep paths predictable, frontmatter parseable, titles stable, and all state stored in notes rather than hidden conversation memory. Structure must stay portable: a fresh, empty vault is brought fully online by the plugin's bootstrap (`references/bootstrap.md`), so nothing essential should depend on files existing in the vault ahead of time. diff --git a/echo-memory.plugin.src/skills/echo-memory/references/vault-layout.md b/echo-memory.plugin.src/skills/echo-memory/references/vault-layout.md index 9192204..f741a01 100644 --- a/echo-memory.plugin.src/skills/echo-memory/references/vault-layout.md +++ b/echo-memory.plugin.src/skills/echo-memory/references/vault-layout.md @@ -1,15 +1,12 @@ # Vault Layout & Frontmatter Conventions -Mirrors the canonical conventions defined in the vault's own `STRUCTURE.md` and `BOOTSTRAP.md`. If those change, they are the source of truth. +**This document is canonical.** The ECHO vault holds data only — there are no `CLAUDE.md` / `STRUCTURE.md` / `BOOTSTRAP.md` / `index.md` control docs in it. Layout, taxonomy, and frontmatter conventions live here in the plugin; the bootstrap procedure (`references/bootstrap.md`) builds the tree below into any empty vault. ## Folder Map (root-addressed) ``` /vault/ -├── CLAUDE.md ← operating contract + session protocol -├── STRUCTURE.md ← layout, taxonomy, frontmatter standard -├── BOOTSTRAP.md ← preflight/repair manifest (read first) -├── spinup.md index.md README.md +├── README.md ← thin human signpost (NOT read for routing) ├── inbox/ │ ├── captures/ ← quick captures (inbox.md), date-prefixed lines │ ├── imports/ ← raw imported material @@ -36,6 +33,7 @@ Mirrors the canonical conventions defined in the vault's own `STRUCTURE.md` and ├── reviews/ ← weekly / monthly / quarterly / annual ├── archive/ ← notes / projects / imports └── _agent/ + ├── echo-vault.md ← bootstrap marker: schema_version + bootstrap date (plugin-owned; the "is this vault set up?" probe) ├── context/ ← current-context.md and task bundles ├── memory/ │ ├── working/ ← transient, time-boxed diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/README.vault.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/README.vault.md new file mode 100644 index 0000000..4714e4a --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/README.vault.md @@ -0,0 +1,12 @@ +# ECHO Memory Vault + +This Obsidian vault is the persistent memory substrate ("second brain") for its operator. It is read and written across Claude / CoWork sessions through the Obsidian Local REST API. + +**This vault holds data, not logic.** All operating procedure — how the vault is bootstrapped, how notes are routed, the taxonomy, frontmatter conventions, and safety rules — lives in the **`echo-memory` plugin**, which is the single source of truth. There are intentionally no `CLAUDE.md` / `BOOTSTRAP.md` / `STRUCTURE.md` control docs in this vault; updating or porting ECHO means updating or installing the plugin, not editing files here. + +- **Layout:** see the plugin's `references/vault-layout.md`. +- **Operating contract & safety:** see the plugin's `references/operating-contract.md`. +- **Bootstrap / repair:** see the plugin's `references/bootstrap.md`. +- **Version marker:** `_agent/echo-vault.md` records the schema version and bootstrap date. + +Folders: `inbox/`, `journal/`, `projects/`, `areas/`, `resources/`, `decisions/`, `reviews/`, `archive/`, and the agent subtree `_agent/`. diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/current-context.seed.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/current-context.seed.md new file mode 100644 index 0000000..e8d6474 --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/current-context.seed.md @@ -0,0 +1,25 @@ +--- +type: context-bundle +status: active +created: {{DATE}} +updated: {{DATE}} +tags: [agent, context] +agent_written: true +source_notes: [] +scope: +refresh_strategy: on-demand +--- + +# Current Context + +## Scope + + +## Scope History + + +## Active Priorities + +## Open Questions + +## Related diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/inbox.seed.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/inbox.seed.md new file mode 100644 index 0000000..df919f1 --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/inbox.seed.md @@ -0,0 +1,3 @@ +# Inbox — Captures + +Quick captures land here as date-prefixed lines (`- {{DATE}}: `), one per line, via POST. Triage routes durable items to their proper home (see the echo-memory skill's Inbox Triage). Don't delete originals on triage — the processing log is the audit trail. diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/operator-preferences.seed.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/operator-preferences.seed.md new file mode 100644 index 0000000..cde04d4 --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/anchors/operator-preferences.seed.md @@ -0,0 +1,31 @@ +--- +type: semantic-memory +status: active +created: {{DATE}} +updated: {{DATE}} +tags: [agent, semantic-memory, operator] +agent_written: true +source_notes: [] +confidence: low +last_reviewed: {{DATE}} +--- + +# Operator Preferences + +## Operator + + +## Fact / Pattern + + +## Observations + + +## Evidence + +## Recommendation or Implication + +## Review Notes +Seeded empty at bootstrap ({{DATE}}). Raise confidence once preferences are confirmed through day-to-day use. + +## Related diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/echo-vault.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/echo-vault.md new file mode 100644 index 0000000..e83b49f --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/echo-vault.md @@ -0,0 +1,19 @@ +--- +type: reference +status: active +created: {{DATE}} +updated: {{DATE}} +tags: [agent, system, marker] +agent_written: true +source_notes: [] +schema_version: 1 +bootstrapped: {{DATE}} +managed_by: echo-memory-plugin +--- + +# ECHO Vault Marker + +This file marks the vault as bootstrapped by the **echo-memory plugin** and records its schema version. The plugin's loading procedure GETs this file as its "is this vault set up?" probe; a `404` triggers a fresh bootstrap. + +- `schema_version` — bumped by the plugin when the vault layout changes; a mismatch is the hook for a migration pass (see `references/bootstrap.md`). +- Do not hand-edit. The plugin owns this file. diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/context-bundle-template.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/context-bundle-template.md new file mode 100644 index 0000000..0d64b5b --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/context-bundle-template.md @@ -0,0 +1,27 @@ +--- +type: context-bundle +status: active +created: {{date:YYYY-MM-DD}} +updated: {{date:YYYY-MM-DD}} +tags: [agent, context] +agent_written: true +source_notes: [] +scope: +refresh_strategy: on-demand +--- + +# Context Bundle Title + +## Scope + +## Active Priorities + +## Relevant Entities + +## Key Decisions + +## Open Questions + +## Source Notes + +## Related diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/semantic-memory-template.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/semantic-memory-template.md new file mode 100644 index 0000000..45f6988 --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/semantic-memory-template.md @@ -0,0 +1,23 @@ +--- +type: semantic-memory +status: active +created: {{date:YYYY-MM-DD}} +updated: {{date:YYYY-MM-DD}} +tags: [agent, semantic-memory] +agent_written: true +source_notes: [] +confidence: high +last_reviewed: {{date:YYYY-MM-DD}} +--- + +# Semantic Memory Title + +## Fact / Pattern + +## Evidence + +## Recommendation or Implication + +## Review Notes + +## Related diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/session-log-template.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/session-log-template.md new file mode 100644 index 0000000..05e0982 --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/session-log-template.md @@ -0,0 +1,29 @@ +--- +type: session-log +status: complete +created: {{date:YYYY-MM-DDTHH:mm}} +updated: {{date:YYYY-MM-DDTHH:mm}} +tags: [agent, session] +agent_written: true +source_notes: [] +session_date: {{date:YYYY-MM-DD}} +client: claude-code +--- + +# Session Log + +## Goal + +## Notes Read + +## Actions Taken + +## Decisions Made + +## Outputs Created + +## Open Threads + +## Suggested Next Step + +## Related diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/working-memory-template.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/working-memory-template.md new file mode 100644 index 0000000..ca0dc65 --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/_agent/templates/working-memory-template.md @@ -0,0 +1,22 @@ +--- +type: working-memory +status: active +created: {{date:YYYY-MM-DDTHH:mm}} +updated: {{date:YYYY-MM-DDTHH:mm}} +tags: [agent, working-memory] +agent_written: true +source_notes: [] +expires_after: 48h +--- + +# Working Context + +## Active Focus + +## Recent Decisions + +## Open Threads + +## Relevant Links + +## Related diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/decisions/decision-template.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/decisions/decision-template.md new file mode 100644 index 0000000..88b014e --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/decisions/decision-template.md @@ -0,0 +1,25 @@ +--- +type: decision +status: complete +created: {{date:YYYY-MM-DD}} +updated: {{date:YYYY-MM-DD}} +tags: [decision] +agent_written: true +source_notes: [] +decision_date: {{date:YYYY-MM-DD}} +impact: medium +--- + +# Decision Title + +## Context + +## Decision + +## Rationale + +## Consequences + +## Follow-Up + +## Related diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/journal/templates/daily-note-template.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/journal/templates/daily-note-template.md new file mode 100644 index 0000000..5bbe593 --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/journal/templates/daily-note-template.md @@ -0,0 +1,25 @@ +--- +type: daily-note +status: active +created: {{date:YYYY-MM-DD}} +updated: {{date:YYYY-MM-DD}} +tags: [daily, journal] +agent_written: false +source_notes: [] +--- + +# {{date:YYYY-MM-DD}} + +## Top Priorities + +## Schedule / Commitments + +## Open Loops + +## Notes + +## Context for AI + +## Agent Log + +## Related diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/journal/templates/weekly-review-template.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/journal/templates/weekly-review-template.md new file mode 100644 index 0000000..dbfd00a --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/journal/templates/weekly-review-template.md @@ -0,0 +1,26 @@ +--- +type: review +status: active +created: {{date:gggg-[W]WW}} +updated: {{date:gggg-[W]WW}} +tags: [review, weekly] +agent_written: true +source_notes: [] +period: weekly +--- + +# Weekly Review + +## Completed Work + +## Open Loops + +## Stale Projects + +## Decisions + +## Priorities Next Week + +## Agent Notes + +## Related diff --git a/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/projects/project-template.md b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/projects/project-template.md new file mode 100644 index 0000000..0b08cc3 --- /dev/null +++ b/echo-memory.plugin.src/skills/echo-memory/scaffold/templates/projects/project-template.md @@ -0,0 +1,31 @@ +--- +type: project +status: active +created: {{date:YYYY-MM-DD}} +updated: {{date:YYYY-MM-DD}} +tags: [project] +agent_written: false +source_notes: [] +owner: +review_cycle: weekly +--- + +# Project Name + +## Purpose + +## Status + +## Goals + +## Current Context + +## Open Loops + +## Key Decisions + +## Related Notes + +## Session History + +## Related