Tree Ring Memory v0.14.0 adds receipt-backed harness activation
https://github.com/TerminallyLazy/Tree-Ring-Memory/releases/tag/v0.14.0
diff --git a/docs/index.html b/docs/index.html
index e1b80d5..f229213 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -28,7 +28,7 @@
"programmingLanguage": "Rust",
"applicationCategory": "DeveloperApplication",
"operatingSystem": "macOS, Linux",
- "version": "0.14.0",
+ "version": "0.15.0",
"image": "https://terminallylazy.github.io/Tree-Ring-Memory/assets/tree-ring-memory-og.png",
"isAccessibleForFree": true
}
@@ -436,19 +436,18 @@ Try it locally.
Feedback flows through GitHub issue #26.
- # Source install (requires Rust and Cargo)
-curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh
+ # Verified prebuilt install (macOS ARM64 or Linux x86_64)
+curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh -s -- --release latest
-# Linux x86_64 prebuilt (glibc 2.36+)
-curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh -s -- \
- --archive-url https://github.com/TerminallyLazy/Tree-Ring-Memory/releases/download/v0.14.0/tree-ring-memory-0.14.0-linux-x86_64.tar.gz \
- --archive-sha256 c72191aca81f195472272a1962df354fe0af04a08b01a7472a1faf987cd177fa
+# Project-local install and initialization
+curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh -s -- --project --init --release latest --no-animation
# macOS ARM64 Homebrew tap
brew tap TerminallyLazy/tree-ring
brew install tree-ring
tree-ring init
+tree-ring update --check
tree-ring remember "Use project-scoped recall before risky changes." --event-type lesson --scope project
tree-ring recall "risky changes"
tree-ring evidence "The eval passed after the fix." --outcome promoted --evidence-ref evals/run-042
diff --git a/docs/integrations/agent-skill.md b/docs/integrations/agent-skill.md
index d8335cd..f0cdf96 100644
--- a/docs/integrations/agent-skill.md
+++ b/docs/integrations/agent-skill.md
@@ -51,6 +51,29 @@ The CLI does not modify a project root `AGENTS.md` automatically. Merge the
generated `.tree-ring/AGENTS.md` guidance manually when you want DOX-aware
agents to encounter Tree Ring Memory instructions before entering `.tree-ring/`.
+## Runtime Bootstrap And Updates
+
+Agents must resolve the real project root before setup. If the user has already
+authorized Tree Ring installation, the safe default is the verified
+project-local release installer, run from that root:
+
+```bash
+curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh -s -- --project --init --release latest --no-animation
+```
+
+Without existing setup authorization, the agent should explain that exact
+operation and ask before downloading or installing software. It must not
+initialize a plugin cache, package directory, home directory, or unrelated
+working directory. Existing project-local installs should use
+`.tree-ring/bin/tree-ring --root .tree-ring init`; global installs should use
+`tree-ring --root .tree-ring init` from the project root.
+
+`tree-ring update --check` checks for a release without changing files. With
+update authorization, `tree-ring update` verifies official assets and preserves
+the active project-local, direct-prefix, or Homebrew scope. Afterward, rerun
+`init` in each project to backfill managed guidance. CLIs older than v0.15 must
+first be upgraded through their existing package manager or install prefix.
+
## Minimal CLI Flow
```bash
diff --git a/docs/llms.txt b/docs/llms.txt
index 5394793..3706378 100644
--- a/docs/llms.txt
+++ b/docs/llms.txt
@@ -5,14 +5,14 @@
Website: https://terminallylazy.github.io/Tree-Ring-Memory/
Repository: https://github.com/TerminallyLazy/Tree-Ring-Memory
-Launch release: https://github.com/TerminallyLazy/Tree-Ring-Memory/releases/tag/v0.14.0
+Launch release: https://github.com/TerminallyLazy/Tree-Ring-Memory/releases/tag/v0.15.0
Launch discussion: https://github.com/TerminallyLazy/Tree-Ring-Memory/discussions/27
Homebrew tap: https://github.com/TerminallyLazy/homebrew-tree-ring
Feedback: https://github.com/TerminallyLazy/Tree-Ring-Memory/issues/26
Feed: https://terminallylazy.github.io/Tree-Ring-Memory/feed.xml
License: MIT
Status: protocol-preview
-Current version: 0.14.0
+Current version: 0.15.0
## Summary
@@ -37,19 +37,18 @@ ideas stay as seeds.
- DOX and Revolve sync adapters.
- Read-only agent-framework discovery.
- Terminal onboarding and a Ratatui operator console.
+- Verified prebuilt bootstrap and scope-preserving CLI updates.
-## Install From Source (Requires Rust and Cargo)
+## Verified Prebuilt Install
```bash
-curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh
+curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh -s -- --release latest
```
-Linux x86_64 prebuilt install (glibc 2.36 or newer):
+Recommended project-local setup from the project root:
```bash
-curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh -s -- \
- --archive-url https://github.com/TerminallyLazy/Tree-Ring-Memory/releases/download/v0.14.0/tree-ring-memory-0.14.0-linux-x86_64.tar.gz \
- --archive-sha256 c72191aca81f195472272a1962df354fe0af04a08b01a7472a1faf987cd177fa
+curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh -s -- --project --init --release latest --no-animation
```
macOS ARM64 Homebrew install:
@@ -59,6 +58,19 @@ brew tap TerminallyLazy/tree-ring
brew install tree-ring
```
+Source install requires Rust and Cargo and omits `--release latest`.
+
+## Update
+
+```bash
+tree-ring update --check
+tree-ring update
+tree-ring --root .tree-ring init
+```
+
+The updater verifies official assets and preserves the active install scope.
+Pre-0.15 CLIs must first be upgraded with their existing manager or prefix.
+
## First Commands
```bash
@@ -91,7 +103,7 @@ writes are explicit.
- Rust article: https://terminallylazy.github.io/Tree-Ring-Memory/launch/rust-native-agent-memory-cli.md
- Press kit: https://terminallylazy.github.io/Tree-Ring-Memory/press-kit.md
- Repository: https://github.com/TerminallyLazy/Tree-Ring-Memory
-- Launch release: https://github.com/TerminallyLazy/Tree-Ring-Memory/releases/tag/v0.14.0
+- Launch release: https://github.com/TerminallyLazy/Tree-Ring-Memory/releases/tag/v0.15.0
- Launch discussion: https://github.com/TerminallyLazy/Tree-Ring-Memory/discussions/27
- Homebrew tap: https://github.com/TerminallyLazy/homebrew-tree-ring
- Feedback issue: https://github.com/TerminallyLazy/Tree-Ring-Memory/issues/26
diff --git a/docs/press-kit.md b/docs/press-kit.md
index 556689f..b0f9e8a 100644
--- a/docs/press-kit.md
+++ b/docs/press-kit.md
@@ -23,10 +23,10 @@ DOX/Revolve adapters, framework discovery, and a terminal TUI.
- Category: AI agents, developer tools, local-first software, Rust CLI
- License: MIT
- Status: protocol-preview
-- Current version: 0.14.0
+- Current version: 0.15.0
- Website:
- Repository:
-- Launch release:
+- Launch release:
- Launch discussion:
- Homebrew tap:
- Feedback:
diff --git a/install.sh b/install.sh
index a5ea022..ec718ba 100755
--- a/install.sh
+++ b/install.sh
@@ -8,6 +8,7 @@ INSTALL_DIR=${TREE_RING_INSTALL_DIR:-""}
SOURCE_DIR=${TREE_RING_SOURCE:-""}
ARCHIVE_URL=${TREE_RING_ARCHIVE_URL:-""}
ARCHIVE_SHA256=${TREE_RING_ARCHIVE_SHA256:-""}
+RELEASE_VERSION=${TREE_RING_RELEASE:-""}
MEMORY_ROOT=${TREE_RING_ROOT:-".tree-ring"}
RUN_INIT=${TREE_RING_INIT:-"0"}
RUN_ONBOARDING=${TREE_RING_ONBOARDING:-"1"}
@@ -45,7 +46,7 @@ Tree Ring Memory installer
Usage:
curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh
- curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh -s -- --project --init
+ curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh -s -- --project --init --release latest
Options:
--global Install to $HOME/.local/bin (default).
@@ -61,6 +62,7 @@ Options:
--repo URL Git repository used by cargo install.
--ref REF Git branch used by cargo install (default main).
--source DIR Install from a local checkout instead of git.
+ --release VERSION Install a verified prebuilt release; use latest for newest.
--archive-url URL Install from a release tarball containing tree-ring.
--archive-sha256 SUM Required SHA-256 for --archive-url.
-h, --help Show this help.
@@ -72,6 +74,7 @@ Environment:
TREE_RING_REPO=https://github.com/TerminallyLazy/Tree-Ring-Memory
TREE_RING_REF=main
TREE_RING_SOURCE=/path/to/checkout
+ TREE_RING_RELEASE=latest
TREE_RING_ARCHIVE_URL=https://example/tree-ring-memory.tar.gz
TREE_RING_ARCHIVE_SHA256=...
TREE_RING_INIT=1
@@ -132,6 +135,11 @@ while [ "$#" -gt 0 ]; do
[ "$#" -gt 0 ] || die "--source requires a value"
SOURCE_DIR=$1
;;
+ --release)
+ shift
+ [ "$#" -gt 0 ] || die "--release requires a value"
+ RELEASE_VERSION=$1
+ ;;
--archive-url)
shift
[ "$#" -gt 0 ] || die "--archive-url requires a value"
@@ -153,6 +161,12 @@ while [ "$#" -gt 0 ]; do
shift
done
+if [ "$RELEASE_VERSION" != "" ] && [ "$SOURCE_DIR" != "" ]; then
+ die "--release cannot be combined with --source"
+fi
+if [ "$RELEASE_VERSION" != "" ] && [ "$ARCHIVE_URL" != "" ]; then
+ die "--release cannot be combined with --archive-url"
+fi
if [ "$ARCHIVE_URL" != "" ] && [ "$ARCHIVE_SHA256" = "" ]; then
die "--archive-sha256 is required with --archive-url"
fi
@@ -208,6 +222,55 @@ download() {
fi
}
+release_platform() {
+ os=$(uname -s)
+ arch=$(uname -m)
+ case "$os/$arch" in
+ Darwin/arm64) printf '%s' "darwin-arm64" ;;
+ Linux/x86_64) printf '%s' "linux-x86_64" ;;
+ *) die "no prebuilt Tree Ring release is available for $os/$arch" ;;
+ esac
+}
+
+resolve_release_archive() {
+ [ "$RELEASE_VERSION" != "" ] || return 0
+ case "$REPO_URL" in
+ https://github.com/*) ;;
+ *) die "--release requires a https://github.com/OWNER/REPO repository URL" ;;
+ esac
+
+ repo_path=${REPO_URL#https://github.com/}
+ repo_path=${repo_path%.git}
+ case "$repo_path" in
+ */*) ;;
+ *) die "could not determine the GitHub repository for --release" ;;
+ esac
+
+ version=$RELEASE_VERSION
+ if [ "$version" = "latest" ]; then
+ release_tmp=$(mktemp "${TMPDIR:-/tmp}/tree-ring-release.XXXXXX")
+ download "https://api.github.com/repos/$repo_path/releases/latest" "$release_tmp"
+ version=$(sed -n 's/^[[:space:]]*"tag_name":[[:space:]]*"v\{0,1\}\([^"]*\)".*/\1/p' "$release_tmp" | head -n 1)
+ rm -f "$release_tmp"
+ [ "$version" != "" ] || die "latest GitHub release did not contain a version tag"
+ else
+ version=${version#v}
+ fi
+ case "$version" in
+ ""|*[!0-9A-Za-z.+-]*) die "invalid release version: $version" ;;
+ esac
+
+ platform=$(release_platform)
+ archive_name="tree-ring-memory-$version-$platform.tar.gz"
+ release_base="$REPO_URL/releases/download/v$version"
+ checksum_tmp=$(mktemp "${TMPDIR:-/tmp}/tree-ring-checksum.XXXXXX")
+ download "$release_base/$archive_name.sha256" "$checksum_tmp"
+ ARCHIVE_SHA256=$(awk 'NR == 1 { print $1 }' "$checksum_tmp")
+ rm -f "$checksum_tmp"
+ [ "$ARCHIVE_SHA256" != "" ] || die "release checksum file was empty"
+ ARCHIVE_URL="$release_base/$archive_name"
+}
+
verify_sha256() {
file=$1
expected=$2
@@ -329,6 +392,7 @@ update_shell_path() {
}
intro
+resolve_release_archive
require_cargo
PREFIX=$(install_prefix)
diff --git a/marketing/README.md b/marketing/README.md
index 3f83042..8fe5bdc 100644
--- a/marketing/README.md
+++ b/marketing/README.md
@@ -309,7 +309,7 @@ python3 marketing/scripts/build-campaign-cards.py
- Repository: `https://github.com/TerminallyLazy/Tree-Ring-Memory`
- Launch page: `https://terminallylazy.github.io/Tree-Ring-Memory/`
-- Launch release: `https://github.com/TerminallyLazy/Tree-Ring-Memory/releases/tag/v0.14.0`
+- Launch release: `https://github.com/TerminallyLazy/Tree-Ring-Memory/releases/tag/v0.15.0`
- Launch discussion: `https://github.com/TerminallyLazy/Tree-Ring-Memory/discussions/27`
- Homebrew tap: `https://github.com/TerminallyLazy/homebrew-tree-ring`
- Agent-Skills.md main repo listing:
diff --git a/plugins/tree-ring-memory/.claude-plugin/plugin.json b/plugins/tree-ring-memory/.claude-plugin/plugin.json
index 2c396f6..870392c 100644
--- a/plugins/tree-ring-memory/.claude-plugin/plugin.json
+++ b/plugins/tree-ring-memory/.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/plugins/tree-ring-memory/.codex-plugin/plugin.json b/plugins/tree-ring-memory/.codex-plugin/plugin.json
index 23e548a..25141b5 100644
--- a/plugins/tree-ring-memory/.codex-plugin/plugin.json
+++ b/plugins/tree-ring-memory/.codex-plugin/plugin.json
@@ -1,7 +1,7 @@
{
"name": "tree-ring-memory",
- "version": "0.3.2",
- "description": "Local-first memory lifecycle and receipt-backed harness guidance for coding agents using Tree Ring Memory v0.14+.",
+ "version": "0.3.3",
+ "description": "Local-first memory lifecycle, project bootstrap, and receipt-backed harness guidance for coding agents using Tree Ring Memory v0.15+.",
"author": {
"name": "TerminallyLazy",
"url": "https://github.com/TerminallyLazy"
@@ -25,7 +25,7 @@
"interface": {
"displayName": "Tree Ring Memory",
"shortDescription": "Local-first memory lifecycle guidance for Codex agents.",
- "longDescription": "Tree Ring Memory gives coding agents a lifecycle-aware practice for project recall, durable decisions, receipt-backed harness readiness, same-host fan-out/fan-in, idempotent worker writes, coordinator-authorized shared publication, explicit forgetting, and privacy-safe memory capture using Tree Ring Memory v0.14 or newer.",
+ "longDescription": "Tree Ring Memory gives coding agents a lifecycle-aware practice for verified project-local setup, project recall, durable decisions, receipt-backed harness readiness, same-host fan-out/fan-in, idempotent worker writes, coordinator-authorized shared publication, explicit forgetting, privacy-safe memory capture, and scope-preserving CLI updates using Tree Ring Memory v0.15 or newer.",
"developerName": "TerminallyLazy",
"category": "Developer Tools",
"capabilities": [
diff --git a/plugins/tree-ring-memory/README.md b/plugins/tree-ring-memory/README.md
index 0fa47db..b07930f 100644
--- a/plugins/tree-ring-memory/README.md
+++ b/plugins/tree-ring-memory/README.md
@@ -4,28 +4,40 @@ This directory is the repository-distributed Tree Ring Memory plugin for
ChatGPT/Codex and Claude Code. It packages instruction files only; the local
Tree Ring Memory CLI remains the runtime and data owner.
-The Codex manifest is version `0.3.2`. The Claude Code manifest is version
-`0.3.1`. Both target Tree Ring Memory CLI `0.14.0` or newer and share the same
+The Codex manifest is version `0.3.3`. The Claude Code manifest is version
+`0.3.2`. Both target Tree Ring Memory CLI `0.15.0` or newer and share the same
reviewed wrapper skill.
The package does not run a background service, scrape chats, install hooks, or
ship an MCP server. The active agent decides when a local, source-linked,
privacy-safe memory action is warranted.
-## Install Tree Ring Memory
+## Install Or Update Tree Ring Memory
-On macOS ARM64:
+The safe default is a verified project-local install. From the actual project
+root, after the user has authorized Tree Ring setup:
```bash
-brew tap TerminallyLazy/tree-ring
-brew install tree-ring
-tree-ring --version
+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
```
-For other platforms, use the
-[canonical installation guide](https://github.com/TerminallyLazy/Tree-Ring-Memory#install).
-The plugin must not install or upgrade the CLI, edit shell configuration, or
-claim a memory action ran without explicit permission and observed output.
+The installer downloads the official platform release and verifies its SHA-256
+asset. A global Homebrew install remains available on macOS ARM64 through
+`brew install tree-ring`. Agents may proceed when the user's request already
+authorizes setup; otherwise they must explain the operation and obtain
+permission before downloading or installing software. They must never
+initialize inside the plugin cache, change global scope, edit shell
+configuration, or claim a memory action ran without the required authorization
+and observed output.
+
+Use `tree-ring update --check` to check without changing files. With update
+authorization, `tree-ring update` preserves the active project-local, direct,
+or Homebrew install scope. Afterward, rerun `tree-ring --root .tree-ring init`
+from each project root so managed guidance is refreshed without overwriting
+custom files. See the
+[canonical installation guide](https://github.com/TerminallyLazy/Tree-Ring-Memory#install)
+for older CLIs and additional platforms.
## Install In ChatGPT And Codex
@@ -61,6 +73,7 @@ The package adds the `tree-ring-memory` skill and these commands:
- `/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`
## DOX And Certification Boundaries
diff --git a/plugins/tree-ring-memory/commands/tree-ring-audit.md b/plugins/tree-ring-memory/commands/tree-ring-audit.md
index 7fb3b61..7bc5f7f 100644
--- a/plugins/tree-ring-memory/commands/tree-ring-audit.md
+++ b/plugins/tree-ring-memory/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/plugins/tree-ring-memory/commands/tree-ring-capture.md b/plugins/tree-ring-memory/commands/tree-ring-capture.md
index 759d776..ae8a291 100644
--- a/plugins/tree-ring-memory/commands/tree-ring-capture.md
+++ b/plugins/tree-ring-memory/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/plugins/tree-ring-memory/commands/tree-ring-certify.md b/plugins/tree-ring-memory/commands/tree-ring-certify.md
index d58fa73..4eb9faf 100644
--- a/plugins/tree-ring-memory/commands/tree-ring-certify.md
+++ b/plugins/tree-ring-memory/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/plugins/tree-ring-memory/commands/tree-ring-dox-sync.md b/plugins/tree-ring-memory/commands/tree-ring-dox-sync.md
index 865d42d..7177832 100644
--- a/plugins/tree-ring-memory/commands/tree-ring-dox-sync.md
+++ b/plugins/tree-ring-memory/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/plugins/tree-ring-memory/commands/tree-ring-recall.md b/plugins/tree-ring-memory/commands/tree-ring-recall.md
index 2eae9c6..816302b 100644
--- a/plugins/tree-ring-memory/commands/tree-ring-recall.md
+++ b/plugins/tree-ring-memory/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/plugins/tree-ring-memory/commands/tree-ring-status.md b/plugins/tree-ring-memory/commands/tree-ring-status.md
index 4e25308..e3f8a0b 100644
--- a/plugins/tree-ring-memory/commands/tree-ring-status.md
+++ b/plugins/tree-ring-memory/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/plugins/tree-ring-memory/commands/tree-ring-update.md b/plugins/tree-ring-memory/commands/tree-ring-update.md
new file mode 100644
index 0000000..bb9053f
--- /dev/null
+++ b/plugins/tree-ring-memory/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/plugins/tree-ring-memory/skills/tree-ring-memory/SKILL.md b/plugins/tree-ring-memory/skills/tree-ring-memory/SKILL.md
index 0da8d29..f59704d 100644
--- a/plugins/tree-ring-memory/skills/tree-ring-memory/SKILL.md
+++ b/plugins/tree-ring-memory/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,
diff --git a/scripts/validate-plugin-packages.py b/scripts/validate-plugin-packages.py
index 2965513..e959546 100644
--- a/scripts/validate-plugin-packages.py
+++ b/scripts/validate-plugin-packages.py
@@ -60,7 +60,7 @@ def validate_codex() -> None:
manifest = load_json(PLUGIN / ".codex-plugin" / "plugin.json")
require(manifest.get("name") == "tree-ring-memory", "Codex manifest name is stale")
- require(manifest.get("version") == "0.3.2", "Codex manifest version is stale")
+ require(manifest.get("version") == "0.3.3", "Codex manifest version is stale")
require(manifest.get("skills") == "./skills/", "Codex skills path is stale")
for unsupported in ("mcpServers", "apps", "hooks"):
require(unsupported not in manifest, f"skills-only Codex plugin must not declare {unsupported}")
@@ -76,7 +76,7 @@ def validate_codex() -> None:
def validate_claude() -> None:
marketplace = load_json(ROOT / ".claude-plugin" / "marketplace.json")
require(marketplace.get("name") == "tree-ring-memory", "Claude marketplace name is stale")
- require(marketplace.get("version") == "0.3.1", "Claude marketplace version is stale")
+ require(marketplace.get("version") == "0.3.2", "Claude marketplace version is stale")
require(isinstance(marketplace.get("owner"), dict), "Claude marketplace owner is required")
entries = marketplace.get("plugins")
require(isinstance(entries, list) and len(entries) == 1, "Claude marketplace must contain one plugin")
@@ -97,6 +97,7 @@ def validate_claude() -> None:
"tree-ring-dox-sync.md",
"tree-ring-recall.md",
"tree-ring-status.md",
+ "tree-ring-update.md",
}
actual_commands = {path.name for path in (PLUGIN / "commands").glob("*.md")}
require(actual_commands == expected_commands, "Claude command package is incomplete")
@@ -107,8 +108,11 @@ def validate_shared_contract() -> None:
require_markers(
skill,
[
- "Runtime Preflight",
- "0.14.0 or newer",
+ "Runtime Bootstrap And Updates",
+ "0.15.0 or newer",
+ "--project --init --release latest --no-animation",
+ "tree-ring update --check",
+ "which -a tree-ring",
"DOX Contract Flow",
"tree-ring dox sync --source-root --dry-run",
"Certification Boundary",
@@ -132,6 +136,15 @@ def validate_shared_contract() -> None:
PLUGIN / "commands" / "tree-ring-certify.md",
["tree-ring integrations certify", "tree-ring recall-quality", "repository-only", "does not execute the suite"],
)
+ require_markers(
+ PLUGIN / "commands" / "tree-ring-update.md",
+ [
+ "tree-ring update --check",
+ "preserve the active",
+ "CLIs older than 0.15.0",
+ "--root .tree-ring init",
+ ],
+ )
require((ROOT / "scripts" / "certify-tree-ring.sh").is_file(), "source certification script is missing")
require(not (PLUGIN / "scripts" / "certify-tree-ring.sh").exists(), "source certification suite must not be bundled")
for filename in ("LICENSE", "PRIVACY.md", "SECURITY.md", "TERMS.md", "README.md"):
diff --git a/skills/tree-ring-memory/SKILL.md b/skills/tree-ring-memory/SKILL.md
index 9d49bae..98c8ed6 100644
--- a/skills/tree-ring-memory/SKILL.md
+++ b/skills/tree-ring-memory/SKILL.md
@@ -1,20 +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
-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"
+license: MIT
+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
@@ -30,6 +21,57 @@ 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 Bootstrap And Updates
+
+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. 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. If no 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
+ cd
+ curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh -s -- --project --init --release latest --no-animation
+ ```
+
+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:
+
+```bash
+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 binary
+that shadows the active one. After an update, return to each project root and
+run `tree-ring --root .tree-ring init` (or the project-local equivalent) to
+backfill managed agent 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 so an
+older shadowing binary is not mistaken for the updated runtime. Do not edit a
+shell profile or change global installation scope without separate user
+authorization.
+
## When To Recall
Recall memory before:
diff --git a/templates/dox/AGENTS.md b/templates/dox/AGENTS.md
index df31adb..d98910a 100644
--- a/templates/dox/AGENTS.md
+++ b/templates/dox/AGENTS.md
@@ -23,6 +23,32 @@ generated guidance instead of duplicating memory data. Prefer project-level
bridges for the current repo. Treat global Tree Ring bridges as explicit user
configuration that affects every project.
+## Runtime Bootstrap And Updates
+
+Resolve the real project root before setup. Never initialize Tree Ring inside a
+plugin cache, package directory, home directory, or incidental working
+directory. Prefer `/.tree-ring/bin/tree-ring` when it exists;
+otherwise use the active `tree-ring` on `PATH`.
+
+When no CLI exists and the user's request already authorizes setup, run the
+official verified-release installer from the project root:
+
+```bash
+curl -fsSL https://raw.githubusercontent.com/TerminallyLazy/Tree-Ring-Memory/main/install.sh | sh -s -- --project --init --release latest --no-animation
+```
+
+Otherwise obtain permission before downloading or installing software. A
+global CLI initializes with `tree-ring --root .tree-ring init`; a project-local
+CLI initializes with `.tree-ring/bin/tree-ring --root .tree-ring init`. Verify
+that the generated files and `memory.sqlite` are under the intended project's
+`.tree-ring/`, then run `integrations status` with the same binary and root.
+
+Use `tree-ring update --check` for a read-only release check and, only after
+update authorization, `tree-ring update`. Preserve the current manager and
+install prefix; never create a second shadowing binary. After updating, rerun
+`init` in each project to safely backfill managed guidance. For a pre-0.15 CLI,
+use the same installer scope or package manager that originally installed it.
+
## Recall Rules
Before substantial work, recall project-scoped memory for: