diff --git a/README.md b/README.md index c59b041..51c8609 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,9 @@ Tree Ring Memory is a framework-agnostic, local-first memory lifecycle for AI agents. It helps agents decide when to recall, capture, audit, consolidate, and forget project memory without turning memory into an unbounded transcript dump. -Skill package **0.14.1** keeps coordinator capabilities out of shell history -and requires Tree Ring Memory CLI **0.14.0 or newer**. +Skill package **0.15.0** adds authorized verified bootstrap and scope-preserving +updates while keeping coordinator capabilities out of shell history. It +requires Tree Ring Memory CLI **0.15.0 or newer**. ## Install @@ -29,28 +30,31 @@ git clone https://github.com/TerminallyLazy/tree-ring-memory-skill \ ``` The skill is useful on its own as memory lifecycle guidance. To use the full -local store, install the Tree Ring Memory CLI: +local store, run the verified project-local setup from the actual project root +after the user has authorized installation: ```bash -brew tap TerminallyLazy/tree-ring -brew install tree-ring +curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh -s -- --project --init --release latest --no-animation ``` Or use the canonical project install guide: The receipt-backed harness, multi-agent, Coordinated-policy, and schema-v3 -guidance in this skill requires Tree Ring Memory CLI **0.14.0 or newer**. Before +guidance in this skill requires Tree Ring Memory CLI **0.15.0 or newer**. Before a current process opens a pre-v0.13 store, stop all Tree Ring processes, checkpoint and back up the database, and upgrade every CLI, plugin, and bundled worker. Do not use v0.12 against an upgraded schema-v3 root; all mixed-version operation is unsupported. -If the CLI is absent or older, the skill reports the limitation. It does not -install or upgrade software, edit shell configuration, or claim that recall or -another memory action ran without explicit user permission and observed command -output. On a host without local shell access, it remains useful as -memory-lifecycle guidance. +If the CLI is absent or older and the user's request already authorizes Tree +Ring setup, the skill uses the verified project-local bootstrap. Otherwise it +explains the operation and asks before downloading or changing software. Use +`tree-ring update --check` for a read-only check and, with update authorization, +`tree-ring update` to preserve the active scope. It does not edit shell +configuration, change global scope, or claim that recall or another action ran +without the required authorization and observed command output. On a host +without a local shell, it remains guidance-only. ## What It Teaches @@ -92,8 +96,8 @@ memory-lifecycle guidance. ## Source Project - Framework: -- Skill release: -- v0.14 release: +- Skill release: +- v0.15 release: - Claude plugin wrapper: - Skill file: [`SKILL.md`](SKILL.md) diff --git a/SKILL.md b/SKILL.md index b33e5e0..f59704d 100644 --- a/SKILL.md +++ b/SKILL.md @@ -3,7 +3,7 @@ name: tree-ring-memory description: Guides AI agents in using Tree Ring Memory for durable recall, project decisions, user preferences, warnings, future seeds, privacy-safe memory capture, and lifecycle-aware forgetting. license: MIT metadata: - version: "0.14.1" + version: "0.15.0" tags: "memory, agents, recall, privacy, projects, dox, revolve, skills, cli" triggers: "remember this; recall what we decided; what did we learn; tree ring memory; consolidate memory; forget this; project memory; sync DOX; sync Revolve; evidence loop; multi-agent memory" --- @@ -21,23 +21,51 @@ Tree Ring Memory preserves meaningful agent learning like tree rings: - speculative future work stays as seeds - sensitive data is blocked, redacted, or kept out by default -## Runtime Preflight +## Runtime Bootstrap And Updates -Before running a Tree Ring command: +Resolve the actual project root before running Tree Ring. Never initialize a +plugin cache, downloaded package directory, home directory, or arbitrary +working directory by accident. -1. Read project-local `.tree-ring/SKILL.md` and `.tree-ring/CLI.md` when they - exist. They describe the configured root and exact installed commands. -2. Confirm that the local runtime is available: +1. If `/.tree-ring/bin/tree-ring` exists, prefer that binary for + this project. Otherwise check `command -v tree-ring` and run + `tree-ring --version`. +2. Read existing `/.tree-ring/SKILL.md` and `CLI.md` when present. +3. This package targets Tree Ring Memory CLI 0.15.0 or newer. If no compatible + CLI is available and the user's request already authorizes Tree Ring setup, + install the verified current release project-locally from the project root. + Otherwise explain the exact operation and obtain permission before the + network download or software installation: ```bash - tree-ring --version + cd + curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh -s -- --project --init --release latest --no-animation ``` -3. This package targets Tree Ring Memory CLI 0.14.0 or newer. If the command is - missing or older, do not invent results, edit shell configuration, or install - or upgrade software without the user's explicit permission. Explain the - limitation and point to the canonical install guide: - +4. For an existing global CLI, initialize from the project root with + `tree-ring --root .tree-ring init`. For a project-local CLI, use + `.tree-ring/bin/tree-ring --root .tree-ring init`. This must place + `memory.sqlite`, `AGENTS.md`, `SKILL.md`, and `CLI.md` under that project's + `.tree-ring/` directory. +5. Verify the created paths and run the same binary with + `--root .tree-ring integrations status`. Initialization creates safe local + guidance and bridge material; it is not receipt-backed activation proof. + +Check for releases without changing files with `tree-ring update --check`. Run +`tree-ring update` only when the user has authorized an update. It updates the +active binary in its existing project-local, direct, or Homebrew-managed scope, +verifies official release assets, and must not create a second shadowing binary. +After an update, return to each project root and rerun `tree-ring --root +.tree-ring init` (or the project-local equivalent) to backfill managed guidance +without replacing custom files. + +CLIs older than 0.15.0 do not have `tree-ring update`. Upgrade those with the +same manager or prefix that installed them: `brew upgrade tree-ring` for +Homebrew, `--project --release latest` for an existing project-local install, +or `--install-dir --release latest` for another direct +install. Check `command -v tree-ring` and `which -a tree-ring` afterward. Do not +edit a shell profile or change global installation scope without separate user +authorization. If the current host cannot execute a local shell or access project files, use this skill only as memory-lifecycle guidance. Do not claim that recall, capture, diff --git a/scripts/validate.py b/scripts/validate.py index a0a80f6..c89baaf 100755 --- a/scripts/validate.py +++ b/scripts/validate.py @@ -35,20 +35,22 @@ def main() -> None: ): if field not in frontmatter: raise SystemExit(f"missing frontmatter field: {field}") - if not re.search(r'^\s+version:\s*"0\.14\.1"\s*$', frontmatter, re.MULTILINE): - raise SystemExit("SKILL.md must declare version 0.14.1") + if not re.search(r'^\s+version:\s*"0\.15\.0"\s*$', frontmatter, re.MULTILINE): + raise SystemExit("SKILL.md must declare version 0.15.0") if "Claude Code" in frontmatter or "Codex" in frontmatter: raise SystemExit("portable skill frontmatter must remain provider-neutral") required_guidance = [ - "Runtime Preflight", + "Runtime Bootstrap And Updates", + "--project --init --release latest --no-animation", + "tree-ring update --check", "DOX Contract Flow", "tree-ring dox sync --source-root --dry-run", "Certification Boundary", "tree-ring integrations certify --source-root .", "tree-ring recall-quality --source-root .", "full framework release suite", - "0.14.0 or newer", + "0.15.0 or newer", "tree-ring integrations status", "configured-awaiting-proof", "active-isolated", @@ -68,13 +70,13 @@ def main() -> None: if " ".join(marker.split()) not in normalized_body ] if missing: - raise SystemExit("missing v0.14 guidance: " + ", ".join(missing)) + raise SystemExit("missing v0.15 guidance: " + ", ".join(missing)) require_markers( "README.md", [ - "0.14.0 or newer", - "Skill package **0.14.1**", + "0.15.0 or newer", + "Skill package **0.15.0**", "configured-awaiting-proof", "needs-project-mount", "observed command output",