create-agent-rig 0.9.1 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +462 -3
- package/README.md +267 -305
- package/package.json +8 -14
- package/packages/cli/dist/commands/create.js +56 -88
- package/packages/cli/dist/commands/doctor.js +213 -0
- package/packages/cli/dist/commands/init.js +111 -50
- package/packages/cli/dist/commands/integrations.js +468 -0
- package/packages/cli/dist/commands/setup-wizard.js +61 -0
- package/packages/cli/dist/commands/uninstall.js +1223 -0
- package/packages/cli/dist/commands/upgrade.js +508 -101
- package/packages/cli/dist/index.js +658 -47
- package/packages/cli/dist/integrations/declaration.js +158 -0
- package/packages/cli/dist/integrations/doctor-guards.js +126 -0
- package/packages/cli/dist/integrations/doctor-workflow.js +25 -0
- package/packages/cli/dist/integrations/mcp-json.js +107 -0
- package/packages/cli/dist/integrations/memory-doctor.js +124 -0
- package/packages/cli/dist/integrations/registry.js +22 -0
- package/packages/cli/dist/integrations/spawn.js +228 -0
- package/packages/cli/dist/integrations/spec-kit.js +280 -0
- package/packages/cli/dist/integrations/verify.js +193 -0
- package/packages/cli/dist/integrations/windows-job.js +275 -0
- package/packages/cli/dist/lib/elevated-paths.js +74 -0
- package/packages/cli/dist/lib/install-set.js +1 -44
- package/packages/cli/dist/lib/manifest.js +64 -5
- package/packages/cli/dist/lib/prompts.js +0 -23
- package/packages/cli/dist/lib/safe-path.js +193 -2
- package/packages/cli/dist/lib/safe-text.js +78 -0
- package/packages/cli/dist/lib/substitute.js +1 -52
- package/packages/cli/dist/lib/summary.js +5 -5
- package/packages/cli/dist/templates.js +4 -14
- package/scripts/prepare.mjs +28 -12
- package/templates/agent-os/subagent-routing.json +4 -4
- package/templates/agent-os/universal/.agents/skills/check-premises/SKILL.md +45 -12
- package/templates/agent-os/universal/.agents/skills/loop/SKILL.md +31 -6
- package/templates/agent-os/universal/.agents/skills/new-invariant/SKILL.md +5 -5
- package/templates/agent-os/universal/.agents/skills/pr-ship/SKILL.md +1 -1
- package/templates/agent-os/universal/.agents/skills/worktree-task/SKILL.md +3 -3
- package/templates/agent-os/universal/.claude/agents/code-reviewer.md +8 -6
- package/templates/agent-os/universal/.claude/agents/implementation-agent.md +41 -0
- package/templates/agent-os/universal/.claude/agents/prose-reviewer.md +8 -4
- package/templates/agent-os/universal/.claude/agents/security-scanner.md +4 -2
- package/templates/agent-os/universal/.claude/agents/test-writer.md +2 -2
- package/templates/agent-os/universal/.claude/hooks/gate-stop-dod.mjs +4 -2
- package/templates/agent-os/universal/.claude/hooks/inject-rules.mjs +83 -4
- package/templates/agent-os/universal/.claude/rules/autonomy.md +55 -27
- package/templates/agent-os/universal/.claude/rules/invariants.md +9 -8
- package/templates/agent-os/universal/.claude/rules/workflow.md +59 -22
- package/templates/agent-os/universal/.claude/scripts/decision-router.mjs +1 -1
- package/templates/agent-os/universal/.claude/scripts/detect-missed-gate.mjs +12 -9
- package/templates/agent-os/universal/.claude/scripts/doctor.mjs +100 -2
- package/templates/agent-os/universal/.claude/scripts/lib/claim-records.mjs +236 -6
- package/templates/agent-os/universal/.claude/scripts/queue/state.mjs +2 -2
- package/templates/agent-os/universal/.claude/scripts/reconcile-external-prs.mjs +4 -3
- package/templates/agent-os/universal/.claude/scripts/revalidate.mjs +16 -0
- package/templates/agent-os/universal/.claude/settings.json +0 -8
- package/templates/agent-os/universal/.claude/skills/check-premises/SKILL.md +45 -12
- package/templates/agent-os/universal/.claude/skills/loop/SKILL.md +31 -6
- package/templates/agent-os/universal/.claude/skills/new-invariant/SKILL.md +5 -5
- package/templates/agent-os/universal/.claude/skills/pr-ship/SKILL.md +1 -1
- package/templates/agent-os/universal/.claude/skills/worktree-task/SKILL.md +3 -3
- package/templates/agent-os/universal/.codex/agents/code-reviewer.toml +2 -2
- package/templates/agent-os/universal/.codex/agents/implementation-agent.toml +6 -0
- package/templates/agent-os/universal/.codex/agents/prose-reviewer.toml +2 -2
- package/templates/agent-os/universal/.codex/agents/security-scanner.toml +1 -1
- package/templates/agent-os/universal/.codex/agents/test-writer.toml +1 -1
- package/templates/agent-os/universal/.codex/hooks.json +0 -10
- package/templates/agent-os/universal/AGENTS.md +208 -107
- package/templates/agent-os/universal/CLAUDE.md +15 -162
- package/templates/agent-os/universal/PLAN.md +17 -10
- package/templates/agent-os/universal/docs/decisions/agents-md-canonical.md +313 -0
- package/templates/agent-os/universal/docs/decisions/codex-adapter.md +15 -10
- package/templates/agent-os/universal/docs/decisions/review-lanes.md +12 -8
- package/templates/agent-os/universal/docs/decisions/session-start-wire-format.md +206 -0
- package/templates/agent-os/universal/docs/decisions/subagent-routing.md +6 -3
- package/templates/agent-os/universal/docs/decisions/workflow-layer-split.md +235 -0
- package/templates/agent-os/universal/layers.json +25 -30
- package/templates/hash-history.json +112 -40
- package/templates/release-ledger.json +3 -1
- package/packages/cli/dist/lib/composition.js +0 -20
- package/packages/cli/dist/lib/targets.js +0 -28
- package/packages/cli/dist/policy/benchmark/corpus.js +0 -165
- package/packages/cli/dist/policy/core/adapter.js +0 -18
- package/packages/cli/dist/policy/core/coverage.js +0 -253
- package/packages/cli/dist/policy/core/decision-record.js +0 -287
- package/packages/cli/dist/policy/core/declaration.js +0 -127
- package/packages/cli/dist/policy/core/evidence-matrix.js +0 -94
- package/packages/cli/dist/policy/core/probe.js +0 -442
- package/packages/cli/dist/policy/core/registry.js +0 -115
- package/packages/cli/dist/policy/core/validation.js +0 -275
- package/packages/cli/dist/policy/core/vocabulary.js +0 -123
- package/packages/cli/dist/policy/harness/claude.js +0 -47
- package/packages/cli/dist/policy/harness/codex.js +0 -87
- package/packages/cli/dist/policy/harness/index.js +0 -15
- package/packages/cli/dist/policy/harness/shared-hooks.js +0 -28
- package/packages/cli/dist/policy/index.js +0 -17
- package/templates/agent-os/init/AGENTS.md +0 -201
- package/templates/agent-os/init/CLAUDE.md +0 -201
- package/templates/agent-os/stack/aws-cdk/.agents/skills/post-deploy-verify/SKILL.md +0 -105
- package/templates/agent-os/stack/aws-cdk/.agents/skills/ro-debug/SKILL.md +0 -117
- package/templates/agent-os/stack/aws-cdk/.claude/agents/cdk-diff-reviewer.md +0 -89
- package/templates/agent-os/stack/aws-cdk/.claude/rules/aws-cdk.md +0 -105
- package/templates/agent-os/stack/aws-cdk/.claude/skills/post-deploy-verify/SKILL.md +0 -105
- package/templates/agent-os/stack/aws-cdk/.claude/skills/ro-debug/SKILL.md +0 -117
- package/templates/agent-os/stack/aws-cdk/.codex/agents/cdk-diff-reviewer.toml +0 -6
- package/templates/agent-os/stack/node-ts/.claude/hooks/dod-checks.json +0 -1
- package/templates/agent-os/stack/node-ts/.claude/rules/node-ts.md +0 -85
- package/templates/agent-os/universal/.claude/hooks/guard-core-purity.mjs +0 -89
- package/templates/agent-os/universal/.claude/hooks/guard-web-boundary.mjs +0 -68
- package/templates/agent-os/universal/.claude/rules/architecture.md +0 -81
- package/templates/skeleton/aws-serverless/.github/workflows/ci.yml +0 -28
- package/templates/skeleton/aws-serverless/.github/workflows/deploy.yml +0 -90
- package/templates/skeleton/aws-serverless/README.md +0 -181
- package/templates/skeleton/aws-serverless/apps/web/next.config.mjs +0 -17
- package/templates/skeleton/aws-serverless/apps/web/package.json +0 -19
- package/templates/skeleton/aws-serverless/apps/web/src/app/layout.tsx +0 -17
- package/templates/skeleton/aws-serverless/apps/web/src/app/page.tsx +0 -96
- package/templates/skeleton/aws-serverless/apps/web/src/lib/api.ts +0 -36
- package/templates/skeleton/aws-serverless/apps/web/src/lib/validate.ts +0 -23
- package/templates/skeleton/aws-serverless/apps/web/test/shared-validation.test.ts +0 -38
- package/templates/skeleton/aws-serverless/apps/web/tsconfig.json +0 -14
- package/templates/skeleton/aws-serverless/eslint.config.mjs +0 -20
- package/templates/skeleton/aws-serverless/gitignore +0 -56
- package/templates/skeleton/aws-serverless/infra/bin/app.ts +0 -79
- package/templates/skeleton/aws-serverless/infra/cdk.json +0 -3
- package/templates/skeleton/aws-serverless/infra/lib/app-stack.ts +0 -248
- package/templates/skeleton/aws-serverless/infra/lib/web-stack.ts +0 -45
- package/templates/skeleton/aws-serverless/infra/package.json +0 -18
- package/templates/skeleton/aws-serverless/infra/test/allowed-origins.test.ts +0 -301
- package/templates/skeleton/aws-serverless/infra/test/app-composition.test.ts +0 -137
- package/templates/skeleton/aws-serverless/infra/test/app-stack.test.ts +0 -120
- package/templates/skeleton/aws-serverless/infra/test/web-stack.test.ts +0 -44
- package/templates/skeleton/aws-serverless/package.json +0 -30
- package/templates/skeleton/aws-serverless/packages/core/package.json +0 -11
- package/templates/skeleton/aws-serverless/packages/core/src/events.ts +0 -14
- package/templates/skeleton/aws-serverless/packages/core/src/index.ts +0 -15
- package/templates/skeleton/aws-serverless/packages/core/src/note.ts +0 -69
- package/templates/skeleton/aws-serverless/packages/core/test/events.test.ts +0 -23
- package/templates/skeleton/aws-serverless/packages/core/test/note.test.ts +0 -101
- package/templates/skeleton/aws-serverless/packages/db/package.json +0 -14
- package/templates/skeleton/aws-serverless/packages/db/src/client.ts +0 -17
- package/templates/skeleton/aws-serverless/packages/db/src/index.ts +0 -2
- package/templates/skeleton/aws-serverless/packages/db/src/note-model.ts +0 -52
- package/templates/skeleton/aws-serverless/packages/db/test/note-model.test.ts +0 -91
- package/templates/skeleton/aws-serverless/packages/shared/package.json +0 -11
- package/templates/skeleton/aws-serverless/packages/shared/src/env.ts +0 -17
- package/templates/skeleton/aws-serverless/packages/shared/src/errors.ts +0 -33
- package/templates/skeleton/aws-serverless/packages/shared/src/index.ts +0 -3
- package/templates/skeleton/aws-serverless/packages/shared/src/logger.ts +0 -20
- package/templates/skeleton/aws-serverless/packages/shared/test/env.test.ts +0 -26
- package/templates/skeleton/aws-serverless/packages/shared/test/errors.test.ts +0 -28
- package/templates/skeleton/aws-serverless/packages/shared/test/logger.test.ts +0 -19
- package/templates/skeleton/aws-serverless/pnpm-lock.yaml +0 -2855
- package/templates/skeleton/aws-serverless/pnpm-workspace.yaml +0 -14
- package/templates/skeleton/aws-serverless/services/api/package.json +0 -15
- package/templates/skeleton/aws-serverless/services/api/src/adapters/sqs-publisher.ts +0 -26
- package/templates/skeleton/aws-serverless/services/api/src/handlers/create-note.ts +0 -69
- package/templates/skeleton/aws-serverless/services/api/src/handlers/list-notes.ts +0 -37
- package/templates/skeleton/aws-serverless/services/api/src/list-main.ts +0 -12
- package/templates/skeleton/aws-serverless/services/api/src/main.ts +0 -21
- package/templates/skeleton/aws-serverless/services/api/src/usecases/create-note.ts +0 -41
- package/templates/skeleton/aws-serverless/services/api/src/usecases/list-notes.ts +0 -14
- package/templates/skeleton/aws-serverless/services/api/test/create-note.handler.test.ts +0 -211
- package/templates/skeleton/aws-serverless/services/api/test/create-note.usecase.test.ts +0 -45
- package/templates/skeleton/aws-serverless/services/api/test/list-notes.test.ts +0 -122
- package/templates/skeleton/aws-serverless/services/api/test/sqs-publisher.test.ts +0 -22
- package/templates/skeleton/aws-serverless/services/worker/package.json +0 -12
- package/templates/skeleton/aws-serverless/services/worker/src/handlers/note-created.ts +0 -15
- package/templates/skeleton/aws-serverless/services/worker/src/main.ts +0 -7
- package/templates/skeleton/aws-serverless/services/worker/src/usecases/process-note-created.ts +0 -37
- package/templates/skeleton/aws-serverless/services/worker/test/note-created.test.ts +0 -61
- package/templates/skeleton/aws-serverless/tsconfig.base.json +0 -15
- package/templates/skeleton/aws-serverless/tsconfig.json +0 -16
- package/templates/skeleton/aws-serverless/vitest.config.ts +0 -14
- package/templates/skeleton/node-service/.github/workflows/ci.yml +0 -27
- package/templates/skeleton/node-service/.github/workflows/deploy.yml +0 -29
- package/templates/skeleton/node-service/README.md +0 -104
- package/templates/skeleton/node-service/apps/web/next.config.mjs +0 -17
- package/templates/skeleton/node-service/apps/web/package.json +0 -19
- package/templates/skeleton/node-service/apps/web/src/app/layout.tsx +0 -17
- package/templates/skeleton/node-service/apps/web/src/app/page.tsx +0 -96
- package/templates/skeleton/node-service/apps/web/src/lib/api.ts +0 -29
- package/templates/skeleton/node-service/apps/web/src/lib/validate.ts +0 -23
- package/templates/skeleton/node-service/apps/web/test/shared-validation.test.ts +0 -38
- package/templates/skeleton/node-service/apps/web/tsconfig.json +0 -14
- package/templates/skeleton/node-service/eslint.config.mjs +0 -20
- package/templates/skeleton/node-service/gitignore +0 -54
- package/templates/skeleton/node-service/package.json +0 -30
- package/templates/skeleton/node-service/packages/core/package.json +0 -11
- package/templates/skeleton/node-service/packages/core/src/events.ts +0 -14
- package/templates/skeleton/node-service/packages/core/src/index.ts +0 -15
- package/templates/skeleton/node-service/packages/core/src/note.ts +0 -69
- package/templates/skeleton/node-service/packages/core/test/events.test.ts +0 -23
- package/templates/skeleton/node-service/packages/core/test/note.test.ts +0 -101
- package/templates/skeleton/node-service/packages/db/package.json +0 -12
- package/templates/skeleton/node-service/packages/db/src/index.ts +0 -1
- package/templates/skeleton/node-service/packages/db/src/note-store.ts +0 -100
- package/templates/skeleton/node-service/packages/db/test/note-store.test.ts +0 -100
- package/templates/skeleton/node-service/packages/shared/package.json +0 -11
- package/templates/skeleton/node-service/packages/shared/src/env.ts +0 -17
- package/templates/skeleton/node-service/packages/shared/src/errors.ts +0 -33
- package/templates/skeleton/node-service/packages/shared/src/index.ts +0 -3
- package/templates/skeleton/node-service/packages/shared/src/logger.ts +0 -20
- package/templates/skeleton/node-service/packages/shared/test/env.test.ts +0 -26
- package/templates/skeleton/node-service/packages/shared/test/errors.test.ts +0 -28
- package/templates/skeleton/node-service/packages/shared/test/logger.test.ts +0 -19
- package/templates/skeleton/node-service/pnpm-lock.yaml +0 -2402
- package/templates/skeleton/node-service/pnpm-workspace.yaml +0 -13
- package/templates/skeleton/node-service/scripts/build-artifact.mjs +0 -34
- package/templates/skeleton/node-service/services/api/package.json +0 -17
- package/templates/skeleton/node-service/services/api/src/adapters/spool-publisher.ts +0 -23
- package/templates/skeleton/node-service/services/api/src/handlers/create-note.ts +0 -40
- package/templates/skeleton/node-service/services/api/src/handlers/list-notes.ts +0 -23
- package/templates/skeleton/node-service/services/api/src/main.ts +0 -40
- package/templates/skeleton/node-service/services/api/src/server.ts +0 -172
- package/templates/skeleton/node-service/services/api/src/static-dir.ts +0 -20
- package/templates/skeleton/node-service/services/api/src/usecases/create-note.ts +0 -30
- package/templates/skeleton/node-service/services/api/src/usecases/list-notes.ts +0 -14
- package/templates/skeleton/node-service/services/api/test/artifact.test.ts +0 -92
- package/templates/skeleton/node-service/services/api/test/create-note.handler.test.ts +0 -64
- package/templates/skeleton/node-service/services/api/test/create-note.usecase.test.ts +0 -43
- package/templates/skeleton/node-service/services/api/test/list-notes.test.ts +0 -48
- package/templates/skeleton/node-service/services/api/test/package-manager.test.ts +0 -40
- package/templates/skeleton/node-service/services/api/test/package-manager.ts +0 -51
- package/templates/skeleton/node-service/services/api/test/server.test.ts +0 -208
- package/templates/skeleton/node-service/services/api/test/spool-publisher.test.ts +0 -32
- package/templates/skeleton/node-service/services/api/test/static-dir.test.ts +0 -29
- package/templates/skeleton/node-service/services/worker/package.json +0 -16
- package/templates/skeleton/node-service/services/worker/src/main.ts +0 -28
- package/templates/skeleton/node-service/services/worker/src/spool.ts +0 -60
- package/templates/skeleton/node-service/services/worker/src/usecases/process-note-created.ts +0 -38
- package/templates/skeleton/node-service/services/worker/test/process-note-created.test.ts +0 -34
- package/templates/skeleton/node-service/services/worker/test/spool.test.ts +0 -76
- package/templates/skeleton/node-service/tsconfig.base.json +0 -15
- package/templates/skeleton/node-service/tsconfig.json +0 -13
- package/templates/skeleton/node-service/vitest.config.ts +0 -12
package/CHANGELOG.md
CHANGED
|
@@ -14,6 +14,466 @@ second recorded departure; its own entry states the direction and the reason,
|
|
|
14
14
|
and this paragraph deliberately does not restate them — a numbering rule with
|
|
15
15
|
two copies of its exceptions is the shape 0.8.0 exists to remove.
|
|
16
16
|
|
|
17
|
+
## 0.10.1
|
|
18
|
+
|
|
19
|
+
**A fixes-only patch on 0.10.0.** Every entry corrects existing behaviour or
|
|
20
|
+
states a rule the rulebook already follows; nothing is added to what `create`,
|
|
21
|
+
`init` or `upgrade` install beyond the corrected files, and no agent, skill,
|
|
22
|
+
hook or routing row is new.
|
|
23
|
+
|
|
24
|
+
### Fixed
|
|
25
|
+
|
|
26
|
+
- **`upgrade` no longer crashes on a directory where a rig-owned file
|
|
27
|
+
belongs.** A tracked path that is a directory or another non-regular entry
|
|
28
|
+
is reported as a conflict with a reason and left untouched, in `--dry-run`
|
|
29
|
+
and `--yes` alike, instead of ending in an `EISDIR` stack trace (RP-189).
|
|
30
|
+
- **`upgrade` re-checks a leftover `AGENTS.md.rig-new` before removing it.**
|
|
31
|
+
The file is removed only while it still holds exactly the rendered
|
|
32
|
+
`AGENTS.md` bytes, so one edited after the plan was shown is kept, one
|
|
33
|
+
removed in the meantime no longer crashes the run, and the closing notice
|
|
34
|
+
reports a removal only when one happened (RP-202).
|
|
35
|
+
- **`upgrade --dry-run` exits 1 where the real run refuses** a non-file at
|
|
36
|
+
`AGENTS.md.rig-new`, instead of 0 (RP-202).
|
|
37
|
+
- **The Stop gate's budget is measured on the monotonic clock.**
|
|
38
|
+
`gate-stop-dod` computed its shared deadline from the wall clock, so a clock
|
|
39
|
+
step lengthened or shortened it (RP-204).
|
|
40
|
+
|
|
41
|
+
### Rulebook
|
|
42
|
+
|
|
43
|
+
- `workflow.md` states the review-findings rule as a Core section of its own:
|
|
44
|
+
a blocking finding closes by a fix the reviewer reads again, or by evidence
|
|
45
|
+
the reviewer can re-check that its premise is false — with or without the
|
|
46
|
+
opt-in workflow layer (RP-194).
|
|
47
|
+
- `check-premises` treats a claim about an external API, CLI or library as a
|
|
48
|
+
premise: backed by a four-part record (version, authoritative source, date,
|
|
49
|
+
quote or pointer), it holds or is `PREMISE FALSE`; without one it stays
|
|
50
|
+
`UNVERIFIABLE` (RP-194).
|
|
51
|
+
|
|
52
|
+
### Generator repository (not a rig-facing change)
|
|
53
|
+
|
|
54
|
+
- `packages/cli/src/commands/integrations.ts` is a declared elevated path.
|
|
55
|
+
- `scripts/memory-conformance.mjs` names why a rig spawn failed — exit code or
|
|
56
|
+
signal plus the child's error code — instead of a bare "exit 1" (RP-188).
|
|
57
|
+
- `docs/decisions/agent-roles-1.0.md` records the 1.0 agent-role targets; it
|
|
58
|
+
is repository-local and not shipped.
|
|
59
|
+
|
|
60
|
+
## 0.10.0
|
|
61
|
+
|
|
62
|
+
Platforms: the packed release candidate is accepted on Linux, Windows and
|
|
63
|
+
macOS on Apple silicon (`scripts/release-acceptance.mjs`, dispatched on the
|
|
64
|
+
exact release commit; `e2e.yml` gains a `macos-e2e` job for it). Every CI job
|
|
65
|
+
now runs on a GitHub-hosted image; `e2e.yml` no longer has a runner switch.
|
|
66
|
+
On Windows, Spec Kit 1.0.8 rewrites `.claude/settings.json` and `.codex/config.toml` with CRLF line endings, so
|
|
67
|
+
`doctor` reports `rig-owned-files` as `warn` after Spec Kit setup there.
|
|
68
|
+
Ownership hashes cover exact bytes (`docs/decisions/raw-byte-ownership.md`), so
|
|
69
|
+
where a Codex MCP provider is also wired, `doctor` reports that wiring as
|
|
70
|
+
`drift` and a later `setup` change to a Codex MCP provider refuses with the
|
|
71
|
+
managed fragment for a manual merge instead of overwriting the file.
|
|
72
|
+
|
|
73
|
+
`doctor [--json]` aggregates Rig file integrity, installed guards, optional
|
|
74
|
+
workflow mechanisms, MCP wiring, pinned offline Spec Kit status and the
|
|
75
|
+
machine's custom Memory diagnosis. It preserves the existing versioned
|
|
76
|
+
`ok`/`warn`/`fail` contract and keeps connectivity and trust unobserved.
|
|
77
|
+
|
|
78
|
+
A new project gets an `implementation-agent` for the Green step of TDD, pinned
|
|
79
|
+
like the other roles (`claude-sonnet-5` / `gpt-5.6-terra`, `high`) in
|
|
80
|
+
`.claude/agents/` and `.codex/agents/`. Ordinary implementation no longer falls
|
|
81
|
+
to the unnamed general-purpose subagent, which remains for ad-hoc work.
|
|
82
|
+
|
|
83
|
+
Basic Memory is available as an optional, wiring-only MCP preview for Claude Code
|
|
84
|
+
and Codex. Rig records only its project MCP wiring; it never installs, updates,
|
|
85
|
+
inspects, synchronizes, or removes Basic Memory data. `uvx` remains a launcher
|
|
86
|
+
observation rather than a runtime, connectivity, or trust verification.
|
|
87
|
+
|
|
88
|
+
`setup` now offers a provider/harness wizard and delegates Spec Kit setup to
|
|
89
|
+
the pinned official CLI after an explicit plan and consent. Existing external
|
|
90
|
+
installations use `setup add spec-kit --adopt`; updates and removal use the
|
|
91
|
+
official integration lifecycle without destructive force. Spec Kit retains
|
|
92
|
+
its files and manifests; Rig records intent after authoritative status succeeds.
|
|
93
|
+
|
|
94
|
+
`setup apply` and `setup remove` manage explicitly selected Figma and Atlassian
|
|
95
|
+
MCP configuration through Claude Code's documented project config. Dry-run and
|
|
96
|
+
consent apply before changes; existing user entries are preserved. Ownership
|
|
97
|
+
hashes live alongside provider selection in `.rig/integrations.json`.
|
|
98
|
+
Authorization stays with the provider and harness. Codex uses whole-file
|
|
99
|
+
rendering from the installed release baseline and a rolling intent hash; a
|
|
100
|
+
manual edit refuses rather than being merged or overwritten.
|
|
101
|
+
|
|
102
|
+
**`AGENTS.md` is now the canonical rulebook; `CLAUDE.md` is a short
|
|
103
|
+
compatibility shim.** A new project gets the full rulebook text in
|
|
104
|
+
`AGENTS.md` and a `CLAUDE.md` that is just an `@AGENTS.md` import (Claude
|
|
105
|
+
Code's own import syntax) plus Claude-Code-specific notes — never a second
|
|
106
|
+
copy of the rulebook. This is not a claim that Claude Code always reads
|
|
107
|
+
`AGENTS.md` on its own: that support is version- and configuration-dependent,
|
|
108
|
+
and the shim exists precisely for the sessions where it is not active (see
|
|
109
|
+
`docs/decisions/agents-md-canonical.md` for what is verified and what is
|
|
110
|
+
not). Provider-specific wiring (`.claude/settings.json`, `.claude/agents/`,
|
|
111
|
+
`.codex/hooks.json`, `.codex/config.toml`) is unaffected.
|
|
112
|
+
|
|
113
|
+
Migrating an existing rig: `upgrade` treats both files as the ordinary
|
|
114
|
+
manifest-tracked paths they always were, with one deliberate coupling. An
|
|
115
|
+
untouched pair is replaced with the new shim/canonical split. A `CLAUDE.md`
|
|
116
|
+
or `AGENTS.md` the user edited is reported as a conflict and kept exactly as
|
|
117
|
+
edited, never force-shimmed or overwritten — and if the kept CLAUDE.md is not
|
|
118
|
+
already the `@AGENTS.md` shim, the reason also says it **shadows AGENTS.md**
|
|
119
|
+
(by Claude Code's own default, a `CLAUDE.md` is read _instead of_ `AGENTS.md`,
|
|
120
|
+
not alongside it) and names the fix. A file the user deleted stays deleted.
|
|
121
|
+
**Security fix, content-based since round 5:** CLAUDE.md is held back —
|
|
122
|
+
kept as its old, still-readable content, never replaced with the shim —
|
|
123
|
+
only when the on-disk AGENTS.md genuinely cannot serve as the rulebook:
|
|
124
|
+
absent, or present but carrying no non-empty `elevated-paths` block. A
|
|
125
|
+
CUSTOMISED AGENTS.md that still carries a readable block lets the shim
|
|
126
|
+
through — the shim then imports the user's own rulebook, which is the whole
|
|
127
|
+
point of it — and AGENTS.md itself stays a perfectly ordinary, quiet
|
|
128
|
+
conflict, because a customised `elevated-paths` block is this project's own
|
|
129
|
+
designed steady state, not a broken rulebook (an earlier version of this
|
|
130
|
+
rule keyed on AGENTS.md's verdict alone, which could not tell the two
|
|
131
|
+
apart). Without the hold at all, an unreadable AGENTS.md combined with an
|
|
132
|
+
untouched CLAUDE.md would silently install a shim over a rulebook that may
|
|
133
|
+
carry no `elevated-paths` declaration at all. Holding CLAUDE.md back
|
|
134
|
+
re-vouches it for its own current bytes — the same mechanism that lets a
|
|
135
|
+
later `upgrade` resolve cleanly — which means a later `uninstall` reads it
|
|
136
|
+
as rig-owned and unedited and **removes it**, not "leaves it in place" the
|
|
137
|
+
way an ordinary, never-vouched conflict does; the decision record's
|
|
138
|
+
uninstall column and a dedicated test cover this.
|
|
139
|
+
|
|
140
|
+
The one always-reachable remedy for a genuinely unreadable AGENTS.md:
|
|
141
|
+
`upgrade` WRITES the already-rendered content to a real sibling file,
|
|
142
|
+
`AGENTS.md.rig-new` (never recorded in the manifest, and appearing ONLY in
|
|
143
|
+
the genuinely held-back state — never for an ordinary, readable conflict),
|
|
144
|
+
instead of printing it to stdout for a verbatim paste — measured (gate cycle
|
|
145
|
+
3, round 3's own remedy) not to survive a real copy-paste byte-for-byte. Its
|
|
146
|
+
status (`would-write` / `identical` / `differs` / `unsafe`) is decided
|
|
147
|
+
entirely at plan time, so a dry run and a real run agree, and a symlink or
|
|
148
|
+
directory at the path is refused BEFORE anything else is written. `mv
|
|
149
|
+
AGENTS.md.rig-new AGENTS.md` is printed only for bytes this run wrote or
|
|
150
|
+
verified — for a pre-existing, differing rescue file the remedy is `rm` (or
|
|
151
|
+
restoring AGENTS.md some other way), never `mv`, since that file is not this
|
|
152
|
+
run's bytes. The instruction is the short, delimited, LAST thing the run
|
|
153
|
+
prints, not buried between the plan and the consent prompt. Once AGENTS.md
|
|
154
|
+
resolves and the rig is no longer held back, a leftover matching rescue file
|
|
155
|
+
is cleaned up and the run says so; unrelated clutter at the path (a stray
|
|
156
|
+
directory or symlink) on an otherwise healthy rig is never touched and never
|
|
157
|
+
mentioned. **Round 4, security disclosure:** `uninstall` removing CLAUDE.md
|
|
158
|
+
or AGENTS.md while the other of the pair is not a clean removal now says so,
|
|
159
|
+
naming which file stays and as what — a bare `- CLAUDE.md` line previously
|
|
160
|
+
did not. See `docs/decisions/agents-md-canonical.md`, "The remedy that
|
|
161
|
+
actually works", for what was measured and what did not work.
|
|
162
|
+
|
|
163
|
+
Pinned by `packages/cli/test/upgrade.test.ts`'s describe block "RP-186:
|
|
164
|
+
AGENTS.md becomes canonical, CLAUDE.md becomes its shim" (untouched pair,
|
|
165
|
+
edited/deleted each side, the shadow-note cases, the held-back cases, the
|
|
166
|
+
rescue-file state machine, the held-back uninstall case, and the re-derived
|
|
167
|
+
4×3 pristine/edited-with-block/edited-without-block/deleted grid across both
|
|
168
|
+
files), `packages/cli/test/uninstall.test.ts`'s pair-disclosure and
|
|
169
|
+
rescue-file tests, `packages/cli/test/cli-report.test.ts`'s CLI-boundary
|
|
170
|
+
tests for the rescue file (an independent oracle, never `plan.contents`) and
|
|
171
|
+
for the quiet, customised-AGENTS.md conflict, and
|
|
172
|
+
`test/e2e/agents-md-migration.test.ts` (the same migration, including the
|
|
173
|
+
rescue-file remedy end to end and the customised-rulebook case, against a
|
|
174
|
+
rig built from the actual pre-RP-186 payload).
|
|
175
|
+
|
|
176
|
+
**Breaking: the application skeletons are removed, exactly as 0.9.0
|
|
177
|
+
announced.** `create <dir>` no longer takes `--target` and no longer
|
|
178
|
+
scaffolds `aws-serverless` or `node-service` — there is one payload, the same
|
|
179
|
+
one `init` installs, and `create` is now a thin wrapper: `mkdir` → `git init`
|
|
180
|
+
→ that install → the pristine baseline commit. The product is a package
|
|
181
|
+
manager for repository-scoped Claude Code and Codex configuration, never an
|
|
182
|
+
application generator (owner ruling, 2026-09-13). The universal layer's
|
|
183
|
+
create-only "architecture group" (`.claude/rules/architecture.md`,
|
|
184
|
+
`guard-core-purity`, `guard-web-boundary`, and the monorepo-shaped
|
|
185
|
+
`CLAUDE.md`/`AGENTS.md` map) is retired along with it — it was an
|
|
186
|
+
application-shape promise a harness configurator has no business making.
|
|
187
|
+
`templates/agent-os/stack/*` (the node-ts and aws-cdk overlays) and
|
|
188
|
+
`templates/agent-os/init/*` (the override layer `init` used to shadow
|
|
189
|
+
`universal` with) are deleted; the init flavour's map and process-only scope
|
|
190
|
+
_is_ the universal layer now.
|
|
191
|
+
|
|
192
|
+
Migration for a repository this tool already generated: nothing breaks.
|
|
193
|
+
`upgrade` still recognises your rig, still refreshes the files it installed
|
|
194
|
+
and you did not touch, and still leaves your application code alone — it was
|
|
195
|
+
never part of any install set, before or after this release. A path from a
|
|
196
|
+
retired layer (an aws-cdk or node-ts rule, an architecture hook) gets a new
|
|
197
|
+
verdict, `retired`: never written, never deleted, dropped from the manifest,
|
|
198
|
+
and reported as no longer shipped — it is yours now. `upgrade`'s `--dry-run`
|
|
199
|
+
output and its summary line both show a `retired` count when there is one.
|
|
200
|
+
The full pre-0.10 migration path is pinned in `test/e2e/upgrade.test.ts` ›
|
|
201
|
+
"retires the deleted stack overlay, and preserves the application and the
|
|
202
|
+
process layer".
|
|
203
|
+
|
|
204
|
+
**Fixed: Codex rejected the `SessionStart` rules refresh.** `inject-rules`
|
|
205
|
+
printed plain text opening with `[agent-os]`, and Codex 0.154.0 was measured
|
|
206
|
+
failing the hook with `hook returned invalid session start JSON output`, so
|
|
207
|
+
that session started without the autonomy rules. The hook now prints one JSON object —
|
|
208
|
+
`hookSpecificOutput.additionalContext`, the shape both harnesses document —
|
|
209
|
+
carrying the same text, character for character, that Claude Code received
|
|
210
|
+
before. It also waits for that write to finish instead of exiting over it,
|
|
211
|
+
and a stdout failure other than an abandoned reader is reported on stderr
|
|
212
|
+
with a non-zero exit rather than looking like a healthy session
|
|
213
|
+
(`docs/decisions/session-start-wire-format.md`). That decision record now
|
|
214
|
+
ships with the hook that cites it — the process layer's manifest
|
|
215
|
+
(`layers.json`) had omitted it, so a generated rig received the hook's
|
|
216
|
+
citation but not the file it pointed at.
|
|
217
|
+
|
|
218
|
+
**Breaking: the workflow layer (queue/loop/pr-ship/run-state/journal/
|
|
219
|
+
revalidation/claim-records/PR-lifecycle helpers) is now an experimental,
|
|
220
|
+
opt-in install (RP-180).** A default `init`/`create` installs Lean Core only
|
|
221
|
+
— rules, gates, stop rules, the review-gate agents and their hooks — and
|
|
222
|
+
never the autonomous, cooperative multi-session machinery on top of it. Pass
|
|
223
|
+
`--layer workflow` to `init` or to `create-agent-rig <dir>` to install it too;
|
|
224
|
+
a rig that already has it keeps it on a plain re-run of `init` with no flag.
|
|
225
|
+
`RigManifest` gains a `layers` field recording the choice, and `upgrade`
|
|
226
|
+
refreshes only the layer(s) a rig recorded. Migration for an existing rig:
|
|
227
|
+
nothing breaks and nothing is deleted — a manifest written before this field
|
|
228
|
+
existed carries no `layers` key, and that absence is read as "every layer,"
|
|
229
|
+
exactly what every release before this one installed, so `upgrade` keeps
|
|
230
|
+
managing the workflow files a rig already has. Revalidation and claim-records
|
|
231
|
+
keep their existing behavior unchanged (RP-53's freeze through the RP-26 gate
|
|
232
|
+
on 2026-10-27) — this release only relocates their install-time layer.
|
|
233
|
+
`uninstall` (RP-181) needs no layer awareness of its own: it walks
|
|
234
|
+
`manifest.files` and `manifest.kept` directly, and those two records already
|
|
235
|
+
reflect exactly what a given install wrote, by construction — a Core-only
|
|
236
|
+
rig's manifest simply has no workflow-layer entries in `files` for
|
|
237
|
+
`uninstall` to find, and an inherited pre-0.10 rig's workflow files are
|
|
238
|
+
recorded in `files` exactly as every other installed path is (its manifest
|
|
239
|
+
carries no `layers` key, read as "every layer" the same way `upgrade` reads
|
|
240
|
+
it), so `uninstall` removes them under the same byte-hash check as anything
|
|
241
|
+
else it owns. Nothing about the layer split widens or narrows what
|
|
242
|
+
`uninstall` was already willing to remove.
|
|
243
|
+
|
|
244
|
+
**This repository's own node-ts conventions move out of the shipped
|
|
245
|
+
package**, into `scripts/dogfood/` — a repo-local overlay `sync-agent-os.mjs`
|
|
246
|
+
composes into this repository's own rulebook, same as before, just no longer
|
|
247
|
+
a template any generated rig receives.
|
|
248
|
+
|
|
249
|
+
### Added
|
|
250
|
+
|
|
251
|
+
- **Setup MCP ownership (RP-22)** uses one schema-v1
|
|
252
|
+
`.rig/integrations.json` for intent and Claude entry hashes. The
|
|
253
|
+
`list | add | apply | remove` commands replace the intermediate receipt
|
|
254
|
+
and `setup verify` surface. See `docs/command-contract.md`,
|
|
255
|
+
"setup integrations", and the command-level regressions in
|
|
256
|
+
`packages/cli/test/integrations-intent.test.ts`. The published
|
|
257
|
+
`setup --memory-root` interface remains compatible.
|
|
258
|
+
- **`uninstall [dir] [--dry-run] [--yes] [--json]`** removes what a rig
|
|
259
|
+
installed, file by file, against the evidence `.claude/.rig-manifest.json`
|
|
260
|
+
carries and nothing else: a path is removed only when its bytes on disk
|
|
261
|
+
still match the recorded hash exactly (compared as raw bytes, never a
|
|
262
|
+
UTF-8-decoded string — ADR-RP-003), the path is a plain file the whole way
|
|
263
|
+
down from the repository root (never a symlinked ancestor or a symlink
|
|
264
|
+
itself), and the path is itself one of the EXACT paths this release
|
|
265
|
+
actually installs — a boundary drawn at a top-level directory would let a
|
|
266
|
+
manifest pair almost any path under `.claude/`, `.rig/`, `docs/` or
|
|
267
|
+
`journal/` with its true hash and have it removed. Anything under `.git` is
|
|
268
|
+
refused outright, for the whole run, for any segment that NORMALISES to
|
|
269
|
+
`.git` (case folded, a Windows alternate-data-stream suffix stripped,
|
|
270
|
+
trailing dots and spaces stripped) at any depth — not only a literal
|
|
271
|
+
top-level `.git` — regardless of the hash a manifest pairs it with; the same
|
|
272
|
+
refusal covers a manifest that lists one path under both `files` and
|
|
273
|
+
`kept`, which this tool's own writer never produces. An edited,
|
|
274
|
+
already-deleted, foreign, `init`-kept, or otherwise unrecognised file is
|
|
275
|
+
reported and left in place, and so is modified hook wiring
|
|
276
|
+
(`.claude/settings.json`, `.codex/hooks.json`), which names the hooks still
|
|
277
|
+
referenced — and so is a hook file such wiring still calls, even when that
|
|
278
|
+
hook file's own bytes are pristine, naming the wiring file that holds it, so
|
|
279
|
+
a kept settings file is never left pointing at a hook `uninstall` just
|
|
280
|
+
deleted. The manifest itself is read, and later removed, through the same
|
|
281
|
+
symlink-safe per-segment check every other manifest-owned path gets, never
|
|
282
|
+
a plain lexical one. It prints the plan, then asks before removing anything
|
|
283
|
+
— `--yes` up front, a prompt on a terminal, an outright refusal off one, and
|
|
284
|
+
always required with `--json`, which never prompts, never deletes
|
|
285
|
+
unattended, and reports an unplanned filesystem error (not only its own
|
|
286
|
+
refusals) as the same one JSON object rather than a bare stack trace. The
|
|
287
|
+
manifest is deleted last, and only once nothing was preserved: a CRLF
|
|
288
|
+
checkout, an edit, or any other conflict keeps the manifest even after
|
|
289
|
+
every removal that WAS planned succeeded, because the rig still owns bytes
|
|
290
|
+
it did not remove and the manifest is the only record naming them. A run
|
|
291
|
+
interrupted partway also keeps it and reports what finished and what a
|
|
292
|
+
re-run still owes — including the manifest itself, whenever a clean re-run
|
|
293
|
+
really would go on to delete it — so a repeat run is safe, and a repeat run
|
|
294
|
+
that finds no manifest at all is a no-op, exit 0. `.rig/` itself is never
|
|
295
|
+
removed, empty or not; the one manifest-owned file the rig installs
|
|
296
|
+
directly inside it is removed like any other file when it is pristine.
|
|
297
|
+
`--json` prints one JSON object and nothing else on stdout — `removed` is
|
|
298
|
+
always what was actually deleted, and `planned` carries the plan's own
|
|
299
|
+
answer regardless of outcome — documented next to the other command
|
|
300
|
+
contracts in `docs/command-contract.md` ("## uninstall (RP-181)"). A
|
|
301
|
+
successful removal names its own next step (`git add -A` and a commit) —
|
|
302
|
+
`uninstall` never touches git history itself. Selected MCP wiring and
|
|
303
|
+
delegated Spec Kit removal have their own lifecycle, `setup remove`;
|
|
304
|
+
`uninstall` touches only files the Rig manifest names (RP-181).
|
|
305
|
+
- **`uninstall` re-verifies bytes twice more, and gains `--detach`.** A plan
|
|
306
|
+
can go stale in the window a confirmation prompt sits in: each `remove`
|
|
307
|
+
action now carries the plan's own recorded hash, re-read and compared
|
|
308
|
+
immediately before that one file's removal — a mismatch skips that file
|
|
309
|
+
(reported `preserved`, reason "changed since planning"), never aborts the
|
|
310
|
+
run, and never deletes it. The manifest's own bytes are checked the same
|
|
311
|
+
way at two points: once before the first removal (a mismatch refuses the
|
|
312
|
+
whole apply, nothing removed) and once immediately before the manifest's
|
|
313
|
+
own deletion (a mismatch keeps the manifest and reports an honest partial
|
|
314
|
+
result — what finished, and that the manifest is what a re-run still owes).
|
|
315
|
+
`--json`'s payload now names which of three outcomes a completed,
|
|
316
|
+
non-dry-run reached — `uninstalled`, `partial`, `detached`; a `--dry-run`
|
|
317
|
+
preview names none of them, since it has no end state to name — and folds
|
|
318
|
+
any
|
|
319
|
+
changed-since-planning path into `preserved` rather than a separate,
|
|
320
|
+
easy-to-miss list. **`--detach`** performs the identical safe cleanup and
|
|
321
|
+
then removes the manifest anyway, leaving every preserved (or
|
|
322
|
+
changed-since-planning) path for the user and printing the complete
|
|
323
|
+
handover list — it never forces away a conflicting or modified file, and
|
|
324
|
+
there is no `--force`. A hook file a wiring file still calls survives even
|
|
325
|
+
when that protection is only discoverable at apply time — a symlinked
|
|
326
|
+
wiring file (whose referenced hooks cannot be safely read, so every owned
|
|
327
|
+
hook is protected instead of a guessed subset) or one edited inside the
|
|
328
|
+
confirmation-prompt window, re-checked immediately before the first hook
|
|
329
|
+
removal, since hook files sort ahead of the wiring that references them.
|
|
330
|
+
**Protection also now follows a hook's own imports to a fixed point**: a
|
|
331
|
+
wired hook is not self-contained (`guard-bash.mjs` imports
|
|
332
|
+
`.claude/hooks/lib/hook-input.mjs`, `.claude/scripts/stop-flag.mjs`,
|
|
333
|
+
`.claude/scripts/lib/shell-tools.mjs`, …), and protecting only the
|
|
334
|
+
directly-named hook while deleting what it imports left every one of
|
|
335
|
+
those dying at module resolution with exit 1 — silently inert, since a
|
|
336
|
+
`PreToolUse` hook that exits non-2 is non-blocking. Every REAL read this
|
|
337
|
+
walk performs is gated by the same symlink-safe check every other read in
|
|
338
|
+
this command gets, not the purely lexical containment alone: a hook file
|
|
339
|
+
swapped for a symlink to an unbounded or blocking special file — reachable
|
|
340
|
+
from nothing worse than `git clone`ing a hostile branch, before consent —
|
|
341
|
+
no longer makes the walk's own read hang or exhaust the heap; the file
|
|
342
|
+
stays protected regardless, since that is recorded before the read is
|
|
343
|
+
attempted. A `kept` wiring file (a pre-existing `.claude/settings.json`
|
|
344
|
+
`init` never took ownership of — the ordinary "starts from an existing
|
|
345
|
+
repository" path) now protects its hooks too: it used to protect NONE of
|
|
346
|
+
them, silently, because the pass that decides this read only `files`'
|
|
347
|
+
hashes and a `kept` path has none. **The reason a protected hook reports
|
|
348
|
+
now names WHY its wiring file survives, not only THAT it does** — a `kept`
|
|
349
|
+
wiring file's hook used to say "which was preserved as edited" too, which
|
|
350
|
+
is false (nobody edited it; the rig never wrote it), and told a
|
|
351
|
+
contradictory story two lines apart from `.claude/settings.json`'s own
|
|
352
|
+
"user-owned (kept by init)" verdict in the same report. It now reads
|
|
353
|
+
"which init found already in place and never took ownership of"; a hook
|
|
354
|
+
whose wiring file could not be safely read at all (itself a symlink) now
|
|
355
|
+
says so ("which could not be safely read…") instead of "edited" too. A
|
|
356
|
+
file reached only through another protected file's own import, rather
|
|
357
|
+
than named by the wiring file directly, now gets its own reason wording
|
|
358
|
+
naming the immediate importer, since the wiring file itself may never
|
|
359
|
+
mention it at all. **A hook file that cannot itself be safely read (a
|
|
360
|
+
symlink) now protects the conservative superset of every owned `.mjs`
|
|
361
|
+
path, not only itself.** Two dependencies in the shipped tree have exactly
|
|
362
|
+
ONE hook that imports them — `.claude/scripts/lib/secrets.mjs` (only
|
|
363
|
+
`guard-secret-file.mjs`) and `.claude/scripts/unattended-flag.mjs` (only
|
|
364
|
+
`guard-rulebook.mjs`) — so symlinking that one seeder used to drop the
|
|
365
|
+
dependency's protection entirely: measured end to end through a real
|
|
366
|
+
`git commit` and a fresh `git clone`, the credential guard went from
|
|
367
|
+
blocking a credential write (exit 2) to dying at module resolution (exit 1,
|
|
368
|
+
non-blocking for `PreToolUse`) once its own import was gone, wiring still
|
|
369
|
+
in place and still claiming to enforce it. **The sweep that protects a
|
|
370
|
+
dependency it could not trace now says so, instead of claiming it as a
|
|
371
|
+
confirmed reference.** Reusing the "still referenced by … which was
|
|
372
|
+
preserved as edited" wording for a swept-in path made the sentence that
|
|
373
|
+
sounds most certain describe the files the command was least sure about:
|
|
374
|
+
in one reproduced run, of 84 owned paths under one preserved wiring file,
|
|
375
|
+
only ~7 were genuinely referenced by it, and ~30 were swept in by caution
|
|
376
|
+
alone — including a test fixture no hook could ever import — all reported
|
|
377
|
+
with the identical, fully-confident wording. A fifth reason string now
|
|
378
|
+
names the file whose own unreadability triggered the sweep instead
|
|
379
|
+
("protected because `<file>` could not be read…"), and the plain-text
|
|
380
|
+
summary adds a one-line roll-up — how many `preserved` paths were
|
|
381
|
+
genuinely traced versus kept only as a precaution — once any are.
|
|
382
|
+
Which wording a hook gets does not depend on where the unreadable file
|
|
383
|
+
sits in the wiring file's own order: a hook the wiring names, or one a
|
|
384
|
+
readable file imports, is reported as referenced or imported whether the
|
|
385
|
+
precaution sweep ran before or after the command reached it. The sweep
|
|
386
|
+
itself is also
|
|
387
|
+
now narrower: it fires on a file that could not be SAFELY READ, never on one that is simply gone. Sweeping on absence bought
|
|
388
|
+
nothing (an absent file has no imports that can fail to resolve, because
|
|
389
|
+
the module that would make them is itself gone) and cost a real one: an
|
|
390
|
+
ordinary "I turned this hook off by hand" deletion, with the wiring still
|
|
391
|
+
naming it, used to turn 83 planned removals into 40 planned / 43
|
|
392
|
+
preserved on a repository that had done nothing hostile at all. Two other
|
|
393
|
+
apply-time-only fixes in the same area: the removal loop now re-reads a
|
|
394
|
+
wiring file's bytes fresh, immediately before that file's own removal,
|
|
395
|
+
instead of reusing a copy `protectedHooksFor` read before the loop even
|
|
396
|
+
started (an edit landing in that window was previously missed); and a
|
|
397
|
+
filesystem error surfacing from the new apply-time hook-protection re-check
|
|
398
|
+
itself is now caught the same way `planUninstall`'s own errors are, so
|
|
399
|
+
`--json` still gets its one promised object rather than a bare stack trace.
|
|
400
|
+
A manifest key with more path segments than any real path this release ever
|
|
401
|
+
installs no longer reaches the native path-join call that segment count
|
|
402
|
+
could otherwise overflow — reported the same honest, per-path `preserved`
|
|
403
|
+
way any other unowned path is (deeper than any path this release could ever
|
|
404
|
+
own), rather than aborting the whole run, `--dry-run` included, through a
|
|
405
|
+
message that used to claim the path "resolves outside" the repository,
|
|
406
|
+
which was simply false for one that never left it lexically at all; the
|
|
407
|
+
genuine `..`/absolute escape check is unweakened and still aborts the whole
|
|
408
|
+
run exactly as before.
|
|
409
|
+
Every ancestor check now makes two independent tests per segment, not one:
|
|
410
|
+
the existing symlink/type classification, and a separate `realpath`
|
|
411
|
+
containment check that does not read that classification at all — the
|
|
412
|
+
second is what makes the containment guarantee hold for a Windows
|
|
413
|
+
directory junction (or any future reparse-point kind) by construction,
|
|
414
|
+
rather than resting on `isSymbolicLink()` reporting it correctly, which is
|
|
415
|
+
the one part of this that a Windows-only test in the `windows-e2e` lane
|
|
416
|
+
(`packages/cli/test/uninstall.test.ts`, gated by `onlyOnWindows`) actually
|
|
417
|
+
measures — this repository's own development environment cannot build a
|
|
418
|
+
junction to verify it directly. Also: a manifest segment with a very long
|
|
419
|
+
run of trailing dots or spaces no longer costs quadratic time to
|
|
420
|
+
normalise (a hostile committed manifest could otherwise hang
|
|
421
|
+
`uninstall --dry-run`); `rigOwnedPaths` reads the bare install-manifest
|
|
422
|
+
list rather than rendering every template's content just to learn which
|
|
423
|
+
paths exist.
|
|
424
|
+
|
|
425
|
+
### Generator (not a rig-facing change)
|
|
426
|
+
|
|
427
|
+
**Generator-only (RP-178): nothing a newly scaffolded project receives changes.**
|
|
428
|
+
No file under `templates/` moved. This entry records what changed inside the
|
|
429
|
+
generator's own repository, ahead of 0.10.0.
|
|
430
|
+
|
|
431
|
+
- **The speculative policy-declaration library and its benchmark are gone.**
|
|
432
|
+
`packages/cli/src/policy/` (a declaration schema, registry, decision-record
|
|
433
|
+
format and per-harness adapters, RP-36/RP-76) and
|
|
434
|
+
`scripts/policy-benchmark*.mjs` (the child-process benchmark that measured
|
|
435
|
+
it) shipped nothing a CLI command, an installed hook, or the sync scripts
|
|
436
|
+
ever called — its own module header said so. Removed as dead code, along
|
|
437
|
+
with `contracts/session-messaging/` (its sole remaining consumer) and the
|
|
438
|
+
vitest `benchmark` project. RP-157, RP-160 and RP-161 are closed by
|
|
439
|
+
deletion rather than by fix, since all three findings were against this
|
|
440
|
+
unreachable surface; the consumer graph behind each deletion is on pull
|
|
441
|
+
request #227.
|
|
442
|
+
- **`docs/compatibility.md`** replaces the removed framework's claim to be a
|
|
443
|
+
compatibility check: a Claude Code × Codex × capability matrix — every
|
|
444
|
+
wired hook, the Windows command strings, skills/agents delivery, and the
|
|
445
|
+
optional external-subsystem contract — with one status vocabulary for the
|
|
446
|
+
matrix (SUPPORTED, DEGRADED, UNSUPPORTED, NOT-APPLICABLE, UNVERIFIED).
|
|
447
|
+
`test/template/compatibility-matrix.test.ts` refuses a status outside it,
|
|
448
|
+
a measured status without a test pointer, and a pointer whose test file is
|
|
449
|
+
gone or no longer contains the quoted test name. Windows is stated as
|
|
450
|
+
measured: the Claude Code wiring and most Codex `commandWindows` scripts
|
|
451
|
+
are UNVERIFIED there.
|
|
452
|
+
- **`test/template/guard-acceptance.test.ts`** invokes the retained
|
|
453
|
+
`PreToolUse` guards through the real `.claude/settings.json` /
|
|
454
|
+
`.codex/hooks.json` wiring strings on POSIX, with one allowed and one
|
|
455
|
+
denied fixture per guard for each harness that wires it, in the payload
|
|
456
|
+
shape that harness sends (Codex edits arrive as `apply_patch`); the denied
|
|
457
|
+
one must exit exactly 2 and name its reason. It is the wiring a generated
|
|
458
|
+
project actually runs, not a parallel path. The guard list is derived from
|
|
459
|
+
the two wiring files, so a newly wired guard with no fixture and no
|
|
460
|
+
reasoned exception fails the suite, and so does one without a
|
|
461
|
+
`docs/compatibility.md` row. `guard-subagent-model` is Claude-only and
|
|
462
|
+
runs through the Claude Code wiring alone.
|
|
463
|
+
- **Meta-tests that pinned shape instead of behaviour were removed or cut
|
|
464
|
+
down to the assertion that survives review as real**, each with its own
|
|
465
|
+
reason recorded in the pull request: a citation count nothing rereads
|
|
466
|
+
(RP-82, `generator-neutrality.test.ts`), an exact skip-site count that
|
|
467
|
+
named the deleted benchmark files, and the project-count/ordering
|
|
468
|
+
assertions that named the deleted `benchmark` vitest project.
|
|
469
|
+
- **RP-110: the CI spawn-baseline diagnostic is removed** from the
|
|
470
|
+
`windows-smoke` job. It measured bare `node` startup, which stayed flat
|
|
471
|
+
across a red run and its green rerun while their wall clocks differed by
|
|
472
|
+
roughly half, so it read "healthy" on the run it was built to diagnose — a
|
|
473
|
+
diagnostic that argues against the correct conclusion is worse than none.
|
|
474
|
+
No replacement baseline was added, per the ticket's own accepted
|
|
475
|
+
resolution.
|
|
476
|
+
|
|
17
477
|
## 0.9.1
|
|
18
478
|
|
|
19
479
|
**A patch, numbered by the owner.** Every entry corrects existing behaviour;
|
|
@@ -150,9 +610,8 @@ and the two template checks on Linux and `windows-smoke` (the CLI's unit
|
|
|
150
610
|
project) on Windows; in `e2e.yml`, the Linux `e2e` job — the full suite with
|
|
151
611
|
the e2e installs and the benchmark — when the pull request touches the CLI,
|
|
152
612
|
the templates, the e2e harness or that workflow. The full suite on Windows
|
|
153
|
-
runs in `e2e.yml` on master, nightly and by dispatch only
|
|
154
|
-
`
|
|
155
|
-
request can reach (`docs/runners.md`).
|
|
613
|
+
runs in `e2e.yml` on master, nightly and by dispatch only
|
|
614
|
+
(`docs/runners.md`).
|
|
156
615
|
|
|
157
616
|
## 0.8.0
|
|
158
617
|
|