diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 9f973f1..a5417f5 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "tree-ring-memory", - "version": "0.3.1", + "version": "0.3.2", "description": "Local-first memory lifecycle and receipt-backed harness guidance for coding agents using Tree Ring Memory v0.14+.", "author": { "name": "TerminallyLazy", diff --git a/PRIVACY.md b/PRIVACY.md index 5e67fbe..1668030 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -20,5 +20,6 @@ AI host, operating system, source-control provider, or any other tool the user chooses to invoke. Support and privacy questions may be filed at -. -Do not include secrets or private memory content in a public issue. +. +Do not include secrets, vulnerability details, or private memory content in a +public issue. diff --git a/README.md b/README.md index 1a668ca..f1cd715 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This plugin packages one Codex skill that teaches agents when to recall, write, audit, consolidate, and forget project memory using the open-source [Tree Ring Memory](https://github.com/TerminallyLazy/Tree-Ring-Memory) CLI. -Plugin `0.3.1` requires Tree Ring Memory CLI **>= 0.14.0**. The minimum is +Plugin `0.3.2` requires Tree Ring Memory CLI **>= 0.14.0**. The minimum is intentional: v0.14 adds receipt-backed harness readiness on top of the v0.13 schema-v3, coordinated-write, and idempotency contracts used by this guidance. @@ -137,16 +137,18 @@ coordinator should own shared publication: ```bash tree-ring --root .tree-ring policy enable --coordinator release-coordinator -export TREE_RING_COORDINATOR_TOKEN='' +# Set and export TREE_RING_COORDINATOR_TOKEN with a history-safe, no-echo prompt +# supported by your shell, or inject it through an approved secret manager. tree-ring --root .tree-ring policy status tree-ring --root .tree-ring policy audit --limit 100 ``` The capability is printed once. Put it only in `TREE_RING_COORDINATOR_TOKEN`; never pass it as a CLI flag or retain it in -memory, logs, source refs, transcripts, scripts, or committed files. Inject it -only into coordinator processes and launch ordinary workers with the variable -unset. +memory, logs, source refs, transcripts, scripts, or committed files. Do not +paste it into an `export` command; use a history-safe, no-echo prompt supported +by the current shell or approved secret-manager injection. Inject it only into +coordinator processes and launch ordinary workers with the variable unset. In Coordinated mode, the coordinator capability is required for shared or non-agent writes, heartwood creation/promotion, import, persisted DOX/Revolve diff --git a/SECURITY.md b/SECURITY.md index 3e81a3f..d7edd00 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -11,13 +11,17 @@ repository: ## Reporting A Vulnerability -Open a private security advisory on GitHub when available, or open a public -issue with sensitive details removed: +Report vulnerabilities privately through the canonical repository's GitHub +security advisory form: - + -Do not include secrets, tokens, private memory contents, or personal data in a -public issue. +Use the canonical issue tracker only for non-sensitive support: + + + +Never include vulnerability details, secrets, tokens, private memory contents, +or personal data in a public issue. ## Data Handling diff --git a/SUBMISSION.md b/SUBMISSION.md index 32e3514..2561aa1 100644 --- a/SUBMISSION.md +++ b/SUBMISSION.md @@ -7,7 +7,7 @@ - Category: Developer Tools - Short description: Local-first memory lifecycle guidance for coding agents. - Website: -- Support: +- Support: - Privacy: - Terms: - Source: @@ -77,13 +77,15 @@ Long description: ## Release Notes -Version 0.3.1 of the v0.14-compatible skills-only package removes -`interface.screenshots`, which OpenAI ZIP ingestion does not allow for -skills-only plugins. It retains runtime preflight, receipt-backed harness -readiness, exact non-active states, same-host coordination rules, the logo and -composer icon, and explicit privacy-safe fallback when local execution is -unavailable. The plugin has no MCP server, hosted service, credentials, -telemetry, or reviewer account requirement. +Version 0.3.2 of the v0.14-compatible skills-only package keeps coordinator +capabilities out of shell history by requiring a shell-appropriate no-echo +prompt or approved secret-manager injection, and routes support and security +reports through the canonical repository. It retains the v0.3.1 ZIP-ingestion +fix that removed unsupported `interface.screenshots`, plus runtime preflight, +receipt-backed harness readiness, exact non-active states, same-host +coordination rules, the logo and composer icon, and explicit privacy-safe +fallback when local execution is unavailable. The plugin has no MCP server, +hosted service, credentials, telemetry, or reviewer account requirement. ## Review Note diff --git a/TERMS.md b/TERMS.md index 63add90..bf25c83 100644 --- a/TERMS.md +++ b/TERMS.md @@ -17,4 +17,4 @@ availability, accuracy, non-infringement, or data durability, to the maximum extent permitted by law. The limitations in the included MIT License apply. Questions may be filed at -. +. diff --git a/scripts/validate-plugin.sh b/scripts/validate-plugin.sh index ef39b54..8ccbd51 100755 --- a/scripts/validate-plugin.sh +++ b/scripts/validate-plugin.sh @@ -30,8 +30,8 @@ root = Path(".") manifest = json.loads((root / ".codex-plugin/plugin.json").read_text()) if manifest.get("name") != "tree-ring-memory": raise SystemExit("plugin name must remain tree-ring-memory") -if manifest.get("version") != "0.3.1": - raise SystemExit("wrapper version must be 0.3.1") +if manifest.get("version") != "0.3.2": + raise SystemExit("wrapper version must be 0.3.2") interface = manifest.get("interface", {}) prompts = interface.get("defaultPrompt", []) @@ -48,9 +48,22 @@ for key in ("composerIcon", "logo"): if "screenshots" in interface: raise SystemExit("skills-only ZIP manifests must not declare interface.screenshots") -for required in ("PRIVACY.md", "TERMS.md", "SUBMISSION.md"): +for required in ("PRIVACY.md", "SECURITY.md", "TERMS.md", "SUBMISSION.md"): if not (root / required).is_file(): raise SystemExit(f"missing publication material: {required}") + +public_text = "\n".join( + path.read_text(encoding="utf-8") + for path in root.rglob("*") + if path.is_file() + and ".git" not in path.parts + and path != root / "scripts" / "validate-plugin.sh" + and path.suffix.lower() in {".json", ".md", ".py", ".sh", ".toml", ".txt", ".yaml", ".yml"} +) +if "export TREE_RING_COORDINATOR_TOKEN='<" in public_text: + raise SystemExit("token-bearing export example must not appear in the package") +if "tree-ring-memory-codex-plugin/issues" in public_text: + raise SystemExit("support and security links must use the canonical repository") PY assert_contains "$README" 'CLI **>= 0.14.0**' @@ -67,6 +80,7 @@ assert_contains "$SKILL" 'tree-ring integrations status' assert_contains "$SKILL" 'configured-awaiting-proof' assert_contains "$SKILL" '--operation-id' assert_contains "$SKILL" 'TREE_RING_COORDINATOR_TOKEN' +assert_contains "$SKILL" 'history-safe, no-echo' assert_contains "$SKILL" 'same-host local-filesystem processes' assert_contains "$SKILL" 'schema v3 fences' assert_contains "$SKILL" 'operation is unsupported' diff --git a/skills/tree-ring-memory/SKILL.md b/skills/tree-ring-memory/SKILL.md index f12d071..0da8d29 100644 --- a/skills/tree-ring-memory/SKILL.md +++ b/skills/tree-ring-memory/SKILL.md @@ -392,7 +392,8 @@ optional Coordinated policy: ```bash tree-ring --root .tree-ring policy enable --coordinator release-coordinator -export TREE_RING_COORDINATOR_TOKEN='' +# Set and export TREE_RING_COORDINATOR_TOKEN with a history-safe, no-echo prompt +# supported by your shell, or inject it through an approved secret manager. tree-ring --root .tree-ring policy status tree-ring --root .tree-ring policy audit --limit 100 ``` @@ -401,7 +402,9 @@ Enable prints the capability once. Put it only in `TREE_RING_COORDINATOR_TOKEN`; never pass it as a CLI flag or place it in a memory, log, source ref, transcript, or committed file. Tree Ring stores only a hash. `policy status` and `policy audit` are read-only and do not reveal the -capability. Inject it only into coordinator processes, and launch every ordinary +capability. Do not paste it into an `export` command; use a history-safe, +no-echo prompt supported by the current shell or approved secret-manager +injection. Inject it only into coordinator processes, and launch every ordinary worker with `TREE_RING_COORDINATOR_TOKEN` unset so fan-out does not inherit coordinator authority. @@ -428,7 +431,8 @@ replace the environment value with the newly printed capability: ```bash tree-ring --root .tree-ring policy rotate --coordinator release-coordinator-next -export TREE_RING_COORDINATOR_TOKEN='' +# Replace TREE_RING_COORDINATOR_TOKEN through the same history-safe, no-echo +# input path before using the new capability. tree-ring --root .tree-ring policy disable unset TREE_RING_COORDINATOR_TOKEN ```