diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 4b03f7c..175cbef 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -4,14 +4,14 @@ "name": "TerminallyLazy", "url": "https://github.com/TerminallyLazy" }, - "description": "Claude Code marketplace for Tree Ring Memory v0.14 local-first recall and receipt-backed harness readiness.", - "version": "0.3.1", + "description": "Claude Code marketplace for Tree Ring Memory v0.15 verified bootstrap, local-first recall, and receipt-backed harness readiness.", + "version": "0.3.2", "plugins": [ { "name": "tree-ring-memory", "source": "./", "displayName": "Tree Ring Memory", - "description": "Local-first memory lifecycle and receipt-backed harness guidance for Claude Code using Tree Ring Memory v0.14+.", + "description": "Local-first memory lifecycle, project bootstrap, and receipt-backed harness guidance for Claude Code using Tree Ring Memory v0.15+.", "author": { "name": "TerminallyLazy", "url": "https://github.com/TerminallyLazy" diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 935db24..3974127 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,8 +1,8 @@ { "name": "tree-ring-memory", "displayName": "Tree Ring Memory", - "version": "0.3.1", - "description": "Local-first memory lifecycle and receipt-backed harness guidance for Claude Code using Tree Ring Memory v0.14+.", + "version": "0.3.2", + "description": "Local-first memory lifecycle, project bootstrap, and receipt-backed harness guidance for Claude Code using Tree Ring Memory v0.15+.", "author": { "name": "TerminallyLazy", "url": "https://github.com/TerminallyLazy" diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 44e69e7..8ee9534 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -10,8 +10,8 @@ permissions: contents: read env: - TREE_RING_VERSION: "0.14.0" - TREE_RING_LINUX_X86_64_SHA256: "c72191aca81f195472272a1962df354fe0af04a08b01a7472a1faf987cd177fa" + TREE_RING_VERSION: "0.15.0" + TREE_RING_LINUX_X86_64_SHA256: "9b47873268dbb94712a49b02bd785cc69507facee1e879e46e6922778b4afbe6" jobs: validate: @@ -19,7 +19,7 @@ jobs: steps: - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5.0.1 - - name: Install checksum-pinned Tree Ring v0.14 + - name: Install checksum-pinned Tree Ring v0.15 shell: bash run: | set -euo pipefail @@ -66,6 +66,6 @@ jobs: npx --yes @anthropic-ai/claude-code@2.1.241 plugin validate \ .claude-plugin/marketplace.json --strict - - name: Smoke Tree Ring v0.14 integration + - name: Smoke Tree Ring v0.15 integration shell: bash - run: bash scripts/smoke_v014.sh + run: bash scripts/smoke_v015.sh diff --git a/README.md b/README.md index a3378b3..6f78945 100644 --- a/README.md +++ b/README.md @@ -24,17 +24,18 @@ action is useful, source-linked, and privacy-safe. coordinator write-policy guidance. - Receipt-backed harness readiness that distinguishes configured bridges from observed use in a fresh Claude Code session. +- Verified project-local CLI bootstrap and scope-preserving update guidance. ## Install Tree Ring Memory -macOS ARM64 with Homebrew: +From the actual project root, after the user has authorized Tree Ring setup: ```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 +.tree-ring/bin/tree-ring --root .tree-ring integrations status --verbose ``` -The plugin requires Tree Ring Memory v0.14.0 or +The plugin requires Tree Ring Memory v0.15.0 or newer: ```bash @@ -47,9 +48,13 @@ Tree Ring process, checkpoint and back up the complete store, and upgrade every CLI, plugin, and bundled worker. Do not use a v0.12 writer against schema v3; all mixed-version operation is unsupported. -If the CLI is missing or older, the plugin reports the limitation. It does not -install or upgrade software, edit shell configuration, or claim that a memory -action ran without explicit user permission and observed command output. +If the CLI is missing or older, the plugin may bootstrap or update it when the +user's request already authorizes Tree Ring setup. Otherwise it explains the +exact operation and asks before downloading or changing software. Use +`tree-ring update --check` for a read-only release check and, with update +authorization, `tree-ring update` to preserve the active install scope. It does +not edit shell configuration, change global scope, or claim that a memory +action ran without the required authorization and observed command output. For other install paths, use the canonical project README: @@ -73,6 +78,7 @@ After installation, Claude Code can use: /tree-ring-memory:tree-ring-status /tree-ring-memory:tree-ring-dox-sync /tree-ring-memory:tree-ring-certify +/tree-ring-memory:tree-ring-update ``` ## Use @@ -127,7 +133,7 @@ workflows need per-host stores plus explicit, source-preserving fan-in. - Framework repo: - Launch page: - Homebrew tap: -- v0.14 release: +- v0.15 release: ## Security diff --git a/SECURITY.md b/SECURITY.md index 7eec461..d352259 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -37,7 +37,7 @@ local filesystem; it does not establish cross-host or network-filesystem safety. ## Harness Readiness -Tree Ring Memory v0.14 reports harness readiness from project-local +Tree Ring Memory v0.15 reports harness readiness from project-local configuration plus privacy-safe preflight receipts. Configuration alone is not activation. The plugin does not manufacture receipts, alter global trust, or hand-author Agent Zero activation capability descriptors. diff --git a/SUBMISSION.md b/SUBMISSION.md index adf24a2..df58728 100644 --- a/SUBMISSION.md +++ b/SUBMISSION.md @@ -5,7 +5,7 @@ - Name: Tree Ring Memory - Plugin identifier: `tree-ring-memory` - Source: -- Release: `v0.3.1` +- Release: `v0.3.2` - Category: Developer Tools / Workflow Orchestration - License: MIT - Homepage: @@ -16,8 +16,8 @@ Description: > Local-first memory lifecycle and receipt-backed harness guidance for Claude > Code. Recall source-linked project decisions, capture privacy-safe lessons, > coordinate same-host workers, inspect activation readiness, and explicitly -> audit or forget stale memory through the open-source Tree Ring Memory v0.14 -> CLI. +> audit or forget stale memory, bootstrap an authorized project-local runtime, +> and preserve installation scope through Tree Ring Memory v0.15 updates. ## Components @@ -34,10 +34,10 @@ claude plugin validate . --strict claude plugin validate .claude-plugin/plugin.json --strict claude plugin validate .claude-plugin/marketplace.json --strict python3 scripts/validate.py -bash scripts/smoke_v014.sh +bash scripts/smoke_v015.sh ``` -The runtime smoke downloads the checksum-pinned public Tree Ring v0.14 Linux +The runtime smoke downloads the checksum-pinned public Tree Ring v0.15 Linux release in CI and exercises schema-v3 inspection, coordinated worker idempotency, coordinator-authorized publication, and receipt-backed harness status without retaining credentials or private data. @@ -52,8 +52,8 @@ status without retaining credentials or private data. fresh receipt and verify it does not call the harness active. 4. Ask it to store a private credential and verify it refuses to request or store the value. -5. Remove the local CLI and verify the plugin explains the limitation without - inventing results or installing software. +5. Remove the local CLI and verify the plugin uses the authorized project-local + bootstrap or asks before downloading software, without inventing results. ## Update Policy diff --git a/commands/tree-ring-audit.md b/commands/tree-ring-audit.md index 7fb3b61..7bc5f7f 100644 --- a/commands/tree-ring-audit.md +++ b/commands/tree-ring-audit.md @@ -10,9 +10,10 @@ Audit memory when work is closing, when privacy may matter, or when older entries may be stale. Read project-local `.tree-ring/SKILL.md` and `.tree-ring/CLI.md` first when -present. Confirm `tree-ring --version` reports 0.14.0 or newer. If the runtime -is missing or older, stop and explain the limitation; do not install, upgrade, -or invent results without explicit user permission. +present. Follow the skill's Runtime Bootstrap And Updates procedure and confirm +the selected project-local or global binary reports 0.15.0 or newer. Bootstrap +or upgrade when the user's request already authorizes it; otherwise obtain +permission before downloading or changing software. Never invent results. Before any current command other than `policy status` or `policy audit` opens an existing pre-v0.13 store, stop every Tree Ring process, checkpoint and back diff --git a/commands/tree-ring-capture.md b/commands/tree-ring-capture.md index 759d776..ae8a291 100644 --- a/commands/tree-ring-capture.md +++ b/commands/tree-ring-capture.md @@ -10,9 +10,11 @@ Capture only durable, useful memory. Do not store transcripts, secrets, credentials, raw chain-of-thought, or unverified claims as truth. Read project-local `.tree-ring/SKILL.md` and `.tree-ring/CLI.md` first when -present. Confirm `tree-ring --version` reports 0.14.0 or newer. If the runtime -is missing or older, stop and explain the limitation; do not install, upgrade, -or invent a stored memory without explicit user permission. +present. Follow the skill's Runtime Bootstrap And Updates procedure and confirm +the selected project-local or global binary reports 0.15.0 or newer. Bootstrap +or upgrade when the user's request already authorizes it; otherwise obtain +permission before downloading or changing software. Never invent a stored +memory. For a single agent or a store in Open mode, use the user's argument as the memory summary: diff --git a/commands/tree-ring-certify.md b/commands/tree-ring-certify.md index d58fa73..4eb9faf 100644 --- a/commands/tree-ring-certify.md +++ b/commands/tree-ring-certify.md @@ -7,9 +7,10 @@ allowed-tools: ["Bash", "Read"] # Tree Ring Certify Read project-local `.tree-ring/SKILL.md` and `.tree-ring/CLI.md` when present, -then confirm `tree-ring --version` reports 0.14.0 or newer. If the runtime is -missing or older, explain the limitation and do not install or upgrade it, -edit shell configuration, or invent certification results. +then follow the skill's Runtime Bootstrap And Updates procedure and confirm the +selected binary reports 0.15.0 or newer. Bootstrap or upgrade when the user's +request already authorizes it; otherwise obtain permission before downloading +or changing software. Never invent certification results. For an installed runtime, choose the requested self-contained evidence path: diff --git a/commands/tree-ring-dox-sync.md b/commands/tree-ring-dox-sync.md index 865d42d..7177832 100644 --- a/commands/tree-ring-dox-sync.md +++ b/commands/tree-ring-dox-sync.md @@ -13,9 +13,10 @@ the current project root when no argument is supplied. directory. Current source contracts are authoritative; a memory summary never overrides them. 2. Read project-local `.tree-ring/SKILL.md` and `.tree-ring/CLI.md` when present, - then confirm `tree-ring --version` reports 0.14.0 or newer. If the runtime is - missing or older, explain the limitation and do not install or upgrade it, - edit shell configuration, or invent adapter results. + then follow the skill's Runtime Bootstrap And Updates procedure and confirm + the selected binary reports 0.15.0 or newer. Bootstrap or upgrade when the + user's request already authorizes it; otherwise obtain permission before + downloading or changing software. Never invent adapter results. 3. Preview without writing: ```bash diff --git a/commands/tree-ring-recall.md b/commands/tree-ring-recall.md index 2eae9c6..816302b 100644 --- a/commands/tree-ring-recall.md +++ b/commands/tree-ring-recall.md @@ -15,9 +15,10 @@ Recall useful project memory before acting on context-dependent work. test -f .tree-ring/CLI.md && sed -n '1,520p' .tree-ring/CLI.md ``` - Confirm `tree-ring --version` reports 0.14.0 or newer. If the runtime is - missing or older, explain the limitation and do not fabricate recall or - install software without explicit user permission. + Follow the skill's Runtime Bootstrap And Updates procedure and confirm the + selected binary reports 0.15.0 or newer. Bootstrap or upgrade when the + user's request already authorizes it; otherwise obtain permission before + downloading or changing software. Never fabricate recall. 2. Use the user's argument as the focused recall query when present: diff --git a/commands/tree-ring-status.md b/commands/tree-ring-status.md index 4e25308..e3f8a0b 100644 --- a/commands/tree-ring-status.md +++ b/commands/tree-ring-status.md @@ -6,15 +6,16 @@ allowed-tools: ["Bash", "Read"] # Tree Ring Status Read project-local `.tree-ring/SKILL.md` and `.tree-ring/CLI.md` when present, -then confirm the local runtime is Tree Ring Memory 0.14.0 or newer: +then follow the skill's Runtime Bootstrap And Updates procedure and confirm the +selected project-local or global runtime is Tree Ring Memory 0.15.0 or newer: ```bash tree-ring --version ``` -If the runtime is missing or older, explain the limitation. Do not install or -upgrade software, edit shell configuration, or invent a status without the -user's explicit permission. +Bootstrap or upgrade when the user's request already authorizes it; otherwise +obtain permission before downloading or changing software. Never invent a +status. Inspect receipt-backed readiness without changing it: diff --git a/commands/tree-ring-update.md b/commands/tree-ring-update.md new file mode 100644 index 0000000..bb9053f --- /dev/null +++ b/commands/tree-ring-update.md @@ -0,0 +1,45 @@ +--- +description: Check for or install a verified Tree Ring Memory CLI update without changing installation scope +argument-hint: "[--check]" +allowed-tools: ["Bash", "Read"] +--- + +# Tree Ring Update + +Resolve the real project root and read project-local `.tree-ring/SKILL.md` and +`.tree-ring/CLI.md` when present. Prefer `.tree-ring/bin/tree-ring` for that +project when it exists; otherwise resolve the active global binary with +`command -v tree-ring`. Use `which -a tree-ring` to detect older shadowing +copies. + +For a read-only release check, run the selected binary: + +```bash +tree-ring update --check +``` + +If the user asked only to check, report the installed version, available +version, executable path, and install method without changing files. If the +user already authorized an update, run `tree-ring update`; otherwise obtain +permission immediately before the update. The updater must preserve the active +project-local, direct-prefix, or Homebrew scope and verify official release +assets. Never install a second copy merely to bypass an older active binary. + +CLIs older than 0.15.0 lack the update command. Upgrade with the same manager or +prefix: `brew upgrade tree-ring` for Homebrew, the official installer with +`--project --release latest` for an existing project-local binary, or +`--install-dir --release latest` for another direct install. +Do not change global scope or edit shell startup files without separate user +authorization. + +After updating, verify the selected binary with `--version`, return to the +actual project root, and run: + +```bash +tree-ring --root .tree-ring init +tree-ring --root .tree-ring integrations status --verbose +``` + +Use `.tree-ring/bin/tree-ring` for both commands when the project has a local +binary. Confirm the files remain under the intended project's `.tree-ring/`. +Initialization refreshes managed guidance but does not prove harness activation. diff --git a/scripts/smoke_v014.sh b/scripts/smoke_v015.sh similarity index 98% rename from scripts/smoke_v014.sh rename to scripts/smoke_v015.sh index 60ed850..5a417cc 100755 --- a/scripts/smoke_v014.sh +++ b/scripts/smoke_v015.sh @@ -7,7 +7,7 @@ if [[ "${tree_ring_bin}" == */* ]]; then else command -v "${tree_ring_bin}" >/dev/null fi -test "$("${tree_ring_bin}" --version)" = "tree-ring 0.14.0" +test "$("${tree_ring_bin}" --version)" = "tree-ring 0.15.0" smoke_base="${RUNNER_TEMP:-${TMPDIR:-/tmp}}" smoke_base="${smoke_base%/}" @@ -255,4 +255,4 @@ snapshot_tree "${store_root}" > "${smoke_dir}/upgraded-before.sha256" snapshot_tree "${store_root}" > "${smoke_dir}/upgraded-after.sha256" cmp "${smoke_dir}/upgraded-before.sha256" "${smoke_dir}/upgraded-after.sha256" -printf 'Tree Ring v0.14 integration smoke passed\n' +printf 'Tree Ring v0.15 integration smoke passed\n' diff --git a/scripts/validate.py b/scripts/validate.py index b6afb46..c11514b 100644 --- a/scripts/validate.py +++ b/scripts/validate.py @@ -9,7 +9,7 @@ ROOT = Path(__file__).resolve().parents[1] -EXPECTED_WRAPPER_VERSION = "0.3.1" +EXPECTED_WRAPPER_VERSION = "0.3.2" UNSAFE_TOKEN_EXPORT = "export TREE_RING_COORDINATOR_TOKEN='<" CANONICAL_ISSUES = "https://github.com/TerminallyLazy/Tree-Ring-Memory/issues" CANONICAL_ADVISORY = "https://github.com/TerminallyLazy/Tree-Ring-Memory/security/advisories/new" @@ -52,7 +52,7 @@ def validate_manifests() -> None: def validate_skill() -> None: - """Validate the bundled skill's v0.14 behavioral contract.""" + """Validate the bundled skill's v0.15 behavioral contract.""" relative = "skills/tree-ring-memory/SKILL.md" text = read(relative) if not text.startswith("---\n"): @@ -60,8 +60,10 @@ def validate_skill() -> None: require_markers( relative, [ - "0.14.0 or newer", - "Runtime Preflight", + "0.15.0 or newer", + "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", @@ -92,7 +94,7 @@ def validate_readme() -> None: require_markers( "README.md", [ - "v0.14.0", + "v0.15.0", "Receipt-Backed Harness Readiness", "configured-awaiting-proof", "needs-user-review", @@ -118,7 +120,7 @@ def validate_commands() -> None: "--operation-id", "--source-ref", "TREE_RING_COORDINATOR_TOKEN", - "0.14.0 or newer", + "0.15.0 or newer", ], ) require_markers( @@ -172,6 +174,15 @@ def validate_commands() -> None: "Do not modify global trust", ], ) + require_markers( + "commands/tree-ring-update.md", + [ + "tree-ring update --check", + "preserve the active", + "CLIs older than 0.15.0", + "--root .tree-ring init", + ], + ) all_markdown = "\n".join( path.read_text(encoding="utf-8") @@ -232,9 +243,9 @@ def validate_security_boundary() -> None: require_markers( "SUBMISSION.md", [ - "v0.3.1", + "v0.3.2", "claude plugin validate . --strict", - "smoke_v014.sh", + "smoke_v015.sh", ], ) skill = read("skills/tree-ring-memory/SKILL.md") @@ -254,21 +265,21 @@ def validate_security_boundary() -> None: def validate_workflow() -> None: - """Validate that CI executes a checksum-pinned v0.14 runtime smoke.""" + """Validate that CI executes a checksum-pinned v0.15 runtime smoke.""" require_markers( ".github/workflows/validate.yml", [ "actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd", - 'TREE_RING_VERSION: "0.14.0"', - "c72191aca81f195472272a1962df354fe0af04a08b01a7472a1faf987cd177fa", + 'TREE_RING_VERSION: "0.15.0"', + "9b47873268dbb94712a49b02bd785cc69507facee1e879e46e6922778b4afbe6", "sha256sum --check --status", - "bash scripts/smoke_v014.sh", + "bash scripts/smoke_v015.sh", ], ) require_markers( - "scripts/smoke_v014.sh", + "scripts/smoke_v015.sh", [ - "tree-ring 0.14.0", + "tree-ring 0.15.0", "integrations status --json --verbose", "fresh configuration must not report active", "TREE_RING_COORDINATOR_TOKEN", diff --git a/skills/tree-ring-memory/SKILL.md b/skills/tree-ring-memory/SKILL.md index 0da8d29..f59704d 100644 --- a/skills/tree-ring-memory/SKILL.md +++ b/skills/tree-ring-memory/SKILL.md @@ -1,21 +1,11 @@ --- 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. -version: 0.14.0 license: MIT -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" +metadata: + 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" --- # Tree Ring Memory @@ -31,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,