docks-kit 0.14.1 → 0.14.3

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/AGENTS.md CHANGED
@@ -7,16 +7,13 @@ Canonical instructions for coding agents working on this project. Compatible wit
7
7
  Portable configuration kit for AI coding agents. Per-tool Single Source of Truth (SoT) directories get deployed to each tool's user-config location via `./docks-kit sync` — clone once and get a consistent AI-assisted dev environment across supported Linux and macOS hosts. The kit focuses on **token efficiency without sacrificing quality**: every setting and hook is tuned to minimize token consumption while preserving rigorous output. When adding or editing anything, ask: *does this change reduce tokens without weakening correctness?*
8
8
 
9
9
  Tool-specific instructions live alongside this file:
10
- - **`CLAUDE.md`** — Claude Code SoT (`SoT/.claude/`), env vars, hooks, plugins, RTK, status line, session management, permission mode, open concerns.
10
+ - **`CLAUDE.md`** — Claude Code SoT (`SoT/.claude/`), env vars, hooks, plugins, status line, session management, permission mode, open concerns.
11
11
  - Codex uses this `AGENTS.md` file plus the Codex SoT under `SoT/.codex/`; no separate root `CODEX.md` is needed.
12
12
 
13
13
 
14
14
  docks-kit runtime and standalone binary support is exactly Linux x64/arm64 and
15
- macOS x64/arm64. Session Relay prebuilt support is Linux x64/arm64 and macOS
16
- arm64 only: x86_64-apple-darwin is no longer published as of Session Relay
17
- 0.16.0; macOS support is aarch64-apple-darwin. Unsupported hosts fail before
18
- the launcher can fall back to Bun source, and Intel macOS hosts fail closed at
19
- the Session Relay install boundary.
15
+ macOS x64/arm64. Unsupported hosts fail before the launcher can fall back to
16
+ Bun source.
20
17
 
21
18
  ## Repository layout (cross-cutting)
22
19
 
@@ -40,13 +37,11 @@ the Session Relay install boundary.
40
37
 
41
38
  Codex SoT notes:
42
39
  - `SoT/.codex/AGENTS.md` deploys to `~/.codex/AGENTS.md` as global Codex instructions.
43
- - `SoT/.codex/config.toml` pins Codex to `model = "gpt-5.6-sol"`, sets normal and plan reasoning to `high` with concise summaries, and sets `model_verbosity = "low"`, `personality`, live top-level `web_search`, workspace-write sandboxing with sandboxed command network access, cross-session `memories` (+ dedicated note tools), `[agents]` subagent limits (`max_threads = 12`, `max_depth = 2` — intentionally above Codex defaults for broad parallel kit work; deeper recursion increases cost and predictability risk), a 128 KiB `project_doc_max_bytes` budget for the repo-side AGENTS.md chain (the global `~/.codex/AGENTS.md` is uncapped and not counted), and enables the four Docks plugins as `docks@docks`, `session-relay@docks`, `plan-lifecycle@docks` (the shared plan lifecycle and an `effect-kit@docks` dependency), and `effect-kit@docks`.
40
+ - `SoT/.codex/config.toml` pins Codex to `model = "gpt-5.6-sol"`, sets normal and plan reasoning to `high` with concise summaries, and sets `model_verbosity = "low"`, `personality`, live top-level `web_search`, workspace-write sandboxing with sandboxed command network access, cross-session `memories` (+ dedicated note tools), `[agents]` subagent limits (`max_threads = 12`, `max_depth = 2` — intentionally above Codex defaults for broad parallel kit work; deeper recursion increases cost and predictability risk), a 128 KiB `project_doc_max_bytes` budget for the repo-side AGENTS.md chain (the global `~/.codex/AGENTS.md` is uncapped and not counted), and enables the three Docks plugins `docks@docks`, `plan-lifecycle@docks` (the shared plan lifecycle and an `effect-kit@docks` dependency), and `effect-kit@docks`.
44
41
  - `SoT/.codex/rules/*.rules` deploys to `~/.codex/rules/` as kit-managed Codex command policy. This is Codex's equivalent of permission allow/prompt/block rules; user-learned approvals in `~/.codex/rules/default.rules` are preserved.
45
42
  - `SoT/.codex/plugins/marketplace.json` deploys to Codex's personal marketplace path at `~/.agents/plugins/marketplace.json`; when the `codex` CLI is available, sync reruns `codex plugin add <plugin@marketplace>` for enabled SoT plugins so stale cached installs are refreshed.
46
- - `docks-kit status` verifies Session Relay only through the supported `codex plugin list --json` inventory. `ready` means installed and enabled for a newly started Codex session; it is not evidence about an old process, lifecycle state, receive-path health, or worker quiescence. The global prompt SoTs carry the owner's standing authorization for Docks cross-company plan review, which never overrides host or platform denial.
47
- - Claude and Codex sync call `sessionRelayCli.ts ensureSessionRelayCli` immediately before their plugin passes. It installs the exact source-pinned precompiled command at `~/.local/bin/session-relay` for Linux x64/arm64 and macOS arm64 only, requires committed digest = same-release `SHA256SUMS` row = downloaded bytes, smoke-tests the staged version, and atomically replaces the stable path. `agents`-only sync never enters this boundary. The three pinned production digests correspond to the `session-relay--v0.16.0` assets and its `SHA256SUMS`; x86_64-apple-darwin is no longer published as of Session Relay 0.16.0.
43
+ - The global prompt SoTs carry the owner's standing authorization for Docks cross-company plan review, which never overrides host or platform denial.
48
44
  - The `codex` CLI binary is upstream-owned, not kit-owned. The official standalone installer keeps package metadata under `$CODEX_HOME/packages/standalone` and places the `codex` symlink in `~/.local/bin` by default; sync only warns with a download-then-run installer command when the CLI is missing. Existing installs can self-update with `codex update`; npm and Homebrew remain upstream alternatives.
49
- - Neither global prompt SoT imports `@RTK.md`; Claude uses the hook-backed RTK integration, while Codex has no kit-managed RTK integration.
50
45
  - Claude runtime settings are an authoring template with sentinels. `claudeRuntime.ts` materializes absolute Bun/script paths only after the shared `bun.ts` bootstrap is ready; `claudeSync.ts` writes all runtime assets before atomically committing settings, then prunes the legacy shell scripts and Stop hook. Native `rate_limits` is the sole quota source, so jq/curl/OAuth caches are not runtime dependencies. A missing Bun defers only this cutover and preserves legacy pointers/files.
51
46
  - Claude's deployed SoT defaults are `model: opus` and `effortLevel: high`; `advisorModel` is deliberately absent/off. `--claude-advisor=on` is the per-machine opt-in and writes `advisorModel: fable` after the settings merge. `opus` is the alias, not a pinned id: the `minimumVersion` floor of 2.1.219 ensures Claude Code can resolve it to the newest Opus its provider offers — Opus 5 on the Anthropic API or Opus 4.6 on Microsoft Foundry — instead of silently capping Anthropic API users at Opus 4.8 under the former 2.1.170 floor. Keeping the alias provides provider portability and tracks future Opus releases; the literal `claude-opus-5` is unavailable on Foundry. The floor also subsumes Fable 5's older 2.1.170 requirement.
52
47
 
@@ -56,10 +51,10 @@ For per-tool SoT layouts (`SoT/.claude/`, `SoT/.codex/`), see the matching SoT d
56
51
 
57
52
  - **Idempotent operations.** Every EngineNative sync step must be safe to re-run. Settings merges, plugin installs, and marketplace adds are all idempotent — re-running with no SoT changes is a no-op.
58
53
  - **Removed bash engine.** The bash engine was removed after the `bash-engine-final` tag. `DOCKS_KIT_ENGINE=bash` must fail with the removed-engine message; engine bugs are fixed forward in EngineNative.
59
- - **Targeted syncs.** `./docks-kit sync` accepts positional targets: `claude`, `codex`, and `agents`. Use the narrowest target that matches the SoT change (for example, `./docks-kit sync codex` for Codex-only config edits); targets can be combined with `--dry-run`, `--skip-rtk`, `--skip-plugin-refresh` (install missing plugins without refreshing existing caches; used by `docks-kit update`), `--reconcile`, `--prune`, `--yes` (auto-accept toolchain prompts), and the deploy-time modifiers `--claude-compact-window=<tokens>` / `--claude-permissive` / `--claude-model=<m>` / `--claude-effort=<level>` / `--claude-advisor=<on|off|default>` / `--codex-model=<m>` / `--codex-effort=<level>` (see `CLAUDE.md` § Deploy-time modifiers).
60
- - **Additive by default.** Keys present in deployed config but absent from SoT are preserved on default sync. This protects user-only additions, but means drift accumulates — neither flag-less reset can clean it up. The one exception is the Claude `removed` manifest (`claude::_removed_manifest`), a curated list of unambiguous kit-owned artifacts that `claude::sync_removals` force-prunes on every sync; see `CLAUDE.md` § Pruning stale artifacts.
54
+ - **Targeted syncs.** `./docks-kit sync` accepts positional targets: `claude`, `codex`, and `agents`. Use the narrowest target that matches the SoT change (for example, `./docks-kit sync codex` for Codex-only config edits); targets can be combined with `--dry-run`, `--skip-bubblewrap` (skip optional bubblewrap bootstrap for the Codex Linux sandbox), `--skip-plugin-refresh` (install missing plugins without refreshing existing caches; used by `docks-kit update`), `--reconcile`, `--prune`, `--yes` (auto-accept toolchain prompts), and the deploy-time modifiers `--claude-compact-window=<tokens>` / `--claude-permissive` / `--claude-model=<m>` / `--claude-effort=<level>` / `--claude-advisor=<on|off|default>` / `--codex-model=<m>` / `--codex-effort=<level>` (see `CLAUDE.md` § Deploy-time modifiers).
55
+ - **Additive by default.** Keys present in deployed config but absent from SoT are preserved on default sync. This protects user-only additions, but means drift accumulates — neither flag-less reset can clean it up. The one exception is the Claude `removed` manifest (`claude::_removed_manifest`), a curated list of unambiguous kit-owned artifacts that `claude::sync_removals` force-prunes on every sync, including the home-relative `~/.local/bin/session-relay` artifact installed outside `~/.claude`; see `CLAUDE.md` § Pruning stale artifacts.
61
56
  - **`--reconcile` / `--prune` are the kit-owned reconcile flags.** Orthogonal — `--reconcile` reconciles the settings layer (SoT-declared keys/tables/arrays win; user-only keys and nested objects are preserved; permissions arrays are replaced wholesale by SoT). `--prune` uninstalls kit-managed installations not in the SoT (plugins, marketplaces, and `~/.agents/skills/*` entries tracked in `~/.agents/.kit-managed-skills`). Combine for a full reset to SoT's kit-managed scope. User-only additions outside the kit's scope (custom env vars, mcpServers, manually-installed skills, third-party plugins not declared in SoT) are always preserved. Each tool's per-tool file documents the specific paths and diff recipes.
62
- - **SOLID-aligned modules.** `cli/src/engine-native/parseArgs.ts` owns flag parsing/validation. `toolchain.ts` owns the verified-version gate over `SoT/toolchain.json`; `sessionRelayCli.ts` owns the closed release manifest, platform mapping, checksum/smoke transaction, and atomic Session Relay replacement; `bun.ts` owns the shared, memoized Bun bootstrap; `claudeRuntime.ts` owns Claude settings materialization. `claudeSync.ts`, `codexSync.ts`, and `skillsSync.ts` own tool-specific sync logic. `index.ts` is the thin orchestrator. The public CLI seam is `cli/src/engine.ts`.
57
+ - **SOLID-aligned modules.** `cli/src/engine-native/parseArgs.ts` owns flag parsing/validation. `toolchain.ts` owns the verified-version gate over `SoT/toolchain.json`; `bun.ts` owns the shared, memoized Bun bootstrap; `claudeRuntime.ts` owns Claude settings materialization. `claudeSync.ts`, `codexSync.ts`, and `skillsSync.ts` own tool-specific sync logic. `index.ts` is the thin orchestrator. The public CLI seam is `cli/src/engine.ts`.
63
58
  - **Small, reviewable changes.** Bundled multi-concern PRs are harder to review and revert. Split an engine/CLI change and a per-tool config change unless the change requires atomicity.
64
59
  - **Dry-run before destructive flags.** Always preview with `./docks-kit sync --dry-run` (or the relevant `diff <(jq -S …)` recipe in the per-tool file) before invoking `--reconcile` or `--prune`. User-added permissions / env vars / plugins absent from SoT will be discarded.
65
60
  - **SoT prompt files are rules, not explanation.** `SoT/.claude/CLAUDE.md` and `SoT/.codex/AGENTS.md` are loaded into every agent session's prompt context — every line costs prompt tokens on every turn for every user. Restrict their content to rules, heuristics, and `<constraint>` blocks the agent must *act on* during a turn. Do NOT add inline source citations (`Source: …`, attributed quotes), "why this rule exists" preface text, version-watermarking trivia (e.g. "Distilled from X v2.0, captured 2025-11-07"), per-bug workarounds, or installation instructions. Provenance, motivation, and historical context belong in `CLAUDE.md` / `AGENTS.md` at the repo root (humans read once) or in commit messages — never in the SoT. For every line, apply the official test: would removing it cause the agent to make mistakes? If not, cut it — over-instruction degrades adherence on current frontier models.
@@ -73,7 +68,7 @@ For per-tool SoT layouts (`SoT/.claude/`, `SoT/.codex/`), see the matching SoT d
73
68
  ## Security
74
69
 
75
70
  - No secrets in SoT. The kit's SoT directories are committed; treat them as declarative config only.
76
- - Treat external installers (RTK, plugin marketplaces) as untrusted input. Prefer download-then-run over `curl … | bash` stream truncation has bitten this kit before (see `CLAUDE.md` § RTK).
71
+ - Treat external plugin marketplaces and installer downloads as untrusted input. Prefer download-then-run over `curl … | bash` so a truncated stream cannot execute a partial script.
77
72
  - **Pin, never float.** Every kit-driven install is pinned to a `SoT/toolchain.json` `verified` version or gated by one — no `@latest` npm/bun installs (Shai-Hulud-class worm surface), no mutable action tags in workflows (commit SHAs only), installer scripts fetched from version tags where upstream supports it. New install surface ⇒ manifest pin first. Details: the `toolchain-context` skill and `cli/docs/toolchain.md`.
78
73
 
79
74
  ## Testing
package/README.md CHANGED
@@ -34,8 +34,8 @@ The executable carries the generated sync payload; no checkout or adjacent
34
34
  `SoT/` directory is required.
35
35
 
36
36
  Prerequisites for source/global installs: Bun; Node/npm for npm-global tools.
37
- `jq` is optional doctor/test tooling. `curl` is used only at requested Linux/macOS
38
- RTK/Bun download boundaries, not as a global sync prerequisite.
37
+ `jq` is optional doctor/test tooling. `curl` is used only when a requested
38
+ Linux/macOS Bun bootstrap must download an installer.
39
39
 
40
40
  ## CLI
41
41
 
@@ -68,7 +68,7 @@ golden-regression coverage for dry-run output, mutation snapshots, and argv logs
68
68
  | `--claude-permissive` | Deploy-time modifier: empty ask/deny (sandboxes only) |
69
69
  | `--claude-plugin=<name>` | Sticky opt-in plugin (supabase, n8n) |
70
70
  | `--codex-model=<m>` | Deploy-time modifier: deployed Codex model |
71
- | `--skip-rtk` | Skip optional tool bootstrap |
71
+ | `--skip-bubblewrap` | Skip optional bubblewrap bootstrap (Codex Linux sandbox) |
72
72
  | `--skip-plugin-refresh` | Install missing plugins but skip refresh-only updates (used automatically by `docks-kit update`) |
73
73
  | `--yes` | Auto-accept toolchain prompts (CI/containers) |
74
74
 
@@ -82,23 +82,11 @@ and a later flag-less sync reverts them. Full reference: `docks-kit docs flags`
82
82
  survive a plain sync. Reconciliation toward the SoT is explicit
83
83
  (`--reconcile` / `--prune`).
84
84
  - **Idempotent** — every step is safe to re-run; no-change syncs are no-ops.
85
- - **Toolchain floors** — external tools (RTK, bun, agent-browser,
85
+ - **Toolchain floors** — external tools (bun, bwrap,
86
86
  effect-solutions, …) install/upgrade against `SoT/toolchain.json`:
87
87
  versions above the kit-verified pin prompt before installing
88
88
  (`--yes` accepts; non-TTY falls back to the pinned verified version
89
89
  when possible). `docks-kit toolchain check` shows the full table.
90
- - **Session Relay CLI** — Claude/Codex syncs ensure the source-pinned
91
- precompiled `session-relay` command in `~/.local/bin` immediately before
92
- Session Relay plugin reconciliation. Linux x64/arm64 and macOS arm64 assets
93
- must match both the committed digest and their release `SHA256SUMS`, then
94
- pass an exact staged version smoke before atomic replacement; failures
95
- preserve any prior command. `x86_64-apple-darwin` is no longer published as
96
- of Session Relay 0.16.0; macOS support is `aarch64-apple-darwin`. The three
97
- production digests are pinned for the tagged `session-relay--v0.16.0` assets
98
- and match the same-release `SHA256SUMS`:
99
- `x86_64-unknown-linux-musl` — `b3ca082dc5ea51e8322be407cdb4bbcaaa05d80bd62c3553f82ab98c1a95498a`
100
- `aarch64-unknown-linux-musl` — `816b6b8bd2d2c2518ea359a5a21502213347b387a1cc576a0fb9cf541e5646ed`
101
- `aarch64-apple-darwin` — `da8b114216c3f2301ad582df8e59b49e91953abcc1112b510466b31637fda825`
102
90
  - **Model catalog** — `SoT/models.json` is the research-verified source for
103
91
  model validation, listings, and pickers.
104
92
  - **Claude runtime** — sync materializes three dependency-free Bun `.mjs`
@@ -126,12 +114,12 @@ and a later flag-less sync reverts them. Full reference: `docks-kit docs flags`
126
114
 
127
115
  ## Platform support
128
116
 
129
- | Platform | Architecture | docks-kit binary | Session Relay prebuilt | Sync engine |
130
- |----------|--------------|------------------|------------------------|-------------|
131
- | Linux | x64 | ✅ | ✅ | ✅ native |
132
- | Linux | arm64 | ✅ | ✅ | ✅ native |
133
- | macOS | x64 | ✅ | ✅ | ✅ native |
134
- | macOS | arm64 | ✅ | ✅ | ✅ native |
117
+ | Platform | Architecture | docks-kit binary | Sync engine |
118
+ |----------|--------------|------------------|-------------|
119
+ | Linux | x64 | ✅ | ✅ native |
120
+ | Linux | arm64 | ✅ | ✅ native |
121
+ | macOS | x64 | ✅ | ✅ native |
122
+ | macOS | arm64 | ✅ | ✅ native |
135
123
 
136
124
  Details: `docks-kit docs platforms`.
137
125
 
@@ -140,7 +128,7 @@ Details: `docks-kit docs platforms`.
140
128
  Tagging `cli-v*` builds four standalone binaries (Linux x64/arm64 and macOS
141
129
  x64/arm64) plus `SHA256SUMS` and attaches them to the GitHub release; npm
142
130
  publishes the exact package tarball through trusted publishing with OIDC provenance.
143
- Package `docks-kit` 0.13.0 bundles the CLI + generated payload, so npm releases
131
+ Package `docks-kit` 0.14.3 bundles the CLI + generated payload, so npm releases
144
132
  are versioned config snapshots without shipping the authoring `SoT/` tree.
145
133
 
146
134
  ## Deeper docs
package/cli/docs/flags.md CHANGED
@@ -18,7 +18,7 @@ docks-kit sync claude agents # two
18
18
  | `--dry-run` | Preview without applying |
19
19
  | `--reconcile` | Settings layer reconciled toward SoT (SoT keys win; user-only keys preserved; permissions arrays replaced) |
20
20
  | `--prune` | Uninstall kit-managed installs not in SoT: plugins, marketplaces, universal skills |
21
- | `--skip-rtk` | Skip optional tool bootstrap (RTK, bubblewrap) |
21
+ | `--skip-bubblewrap` | Skip optional bubblewrap bootstrap (Codex Linux sandbox) |
22
22
  | `--skip-plugin-refresh` | Install missing Claude/Codex plugins but skip refresh-only updates; `docks-kit update` uses this automatically |
23
23
  | `--yes` | Auto-accept toolchain above-verified prompts (containers/CI) |
24
24
  | `--verbose` / `-v` | Also print no-op confirmations (already in sync, up to date, left as-is); accepted on `sync`, `model`, and `toolchain` |
@@ -52,4 +52,3 @@ Old flags exit with a rename hint — there is no compat behavior.
52
52
  | `--680k` | `--claude-compact-window=680k` |
53
53
  | `--permissive` | `--claude-permissive` |
54
54
  | `--supabase` / `--n8n` | `--claude-plugin=supabase` / `--claude-plugin=n8n` |
55
- | `--no-rtk` | `--skip-rtk` |
@@ -94,8 +94,8 @@ sync/config reads.
94
94
  ## Prerequisites
95
95
 
96
96
  - Bun for source/global installs; release binaries embed the runtime
97
- - Node/npm for npm-global tools (agent-browser, LSP servers)
97
+ - Node/npm for npm-global LSP servers
98
98
  - jq is optional doctor/test tooling; sync has no jq runtime dependency
99
- - curl is required only when a requested Linux/macOS RTK/Bun bootstrap must download
99
+ - curl is required only when a requested Linux/macOS Bun bootstrap must download
100
100
  an installer; an already-present Bun does not require it
101
101
  - See `docks-kit toolchain check` for the full picture on this machine
@@ -2,20 +2,15 @@
2
2
 
3
3
  The supported host matrix is exact:
4
4
 
5
- | Platform | Architecture | docks-kit binary | Session Relay prebuilt | Sync engine |
6
- |----------|--------------|------------------|------------------------|-------------|
7
- | Linux | x64 | `docks-kit-linux-x64` | `x86_64-unknown-linux-musl` | EngineNative (TS) |
8
- | Linux | arm64 | `docks-kit-linux-arm64` | `aarch64-unknown-linux-musl` | EngineNative (TS) |
9
- | macOS | x64 | `docks-kit-darwin-x64` | — retired | EngineNative (TS) |
10
- | macOS | arm64 | `docks-kit-darwin-arm64` | `aarch64-apple-darwin` | EngineNative (TS) |
11
-
12
- x86_64-apple-darwin is no longer published as of Session Relay 0.16.0; macOS
13
- support is aarch64-apple-darwin. Intel macOS keeps its docks-kit binary but
14
- fails closed at the Session Relay install boundary.
5
+ | Platform | Architecture | docks-kit binary | Sync engine |
6
+ |----------|--------------|------------------|-------------|
7
+ | Linux | x64 | `docks-kit-linux-x64` | EngineNative (TS) |
8
+ | Linux | arm64 | `docks-kit-linux-arm64` | EngineNative (TS) |
9
+ | macOS | x64 | `docks-kit-darwin-x64` | EngineNative (TS) |
10
+ | macOS | arm64 | `docks-kit-darwin-arm64` | EngineNative (TS) |
15
11
 
16
12
  Windows and every other host are unsupported. The launcher fails before any
17
- Bun-from-source fallback, and Session Relay installation reports the unsupported
18
- host without downloading an asset.
13
+ Bun-from-source fallback.
19
14
 
20
15
  EngineNative is the only supported engine on supported hosts.
21
16
  `DOCKS_KIT_ENGINE=bash` exits with the removed-engine message and points at the
@@ -7,34 +7,28 @@ no target means all three.
7
7
 
8
8
  Order matters — runtime readiness and settings form one transaction:
9
9
 
10
- 1. **RTK** (toolchain-gated): install/upgrade, then `rtk init --global` on
11
- first install. Runs FIRST because rtk init rewrites settings.json — the
12
- later settings merge normalizes whatever it wrote.
13
- 2. Resolve/bootstrap pinned Bun, materialize the sentinel settings template,
10
+ 1. Resolve/bootstrap pinned Bun, materialize the sentinel settings template,
14
11
  and prepare the merged settings bytes without mutation. If Bun remains
15
12
  unavailable, omit only the new runtime pointers and preserve legacy ones.
16
- 3. When ready, write `bin/statusline.mjs`, `bin/session-start.mjs`,
13
+ 2. When ready, write `bin/statusline.mjs`, `bin/session-start.mjs`,
17
14
  `bin/notify.mjs`, and `notification.mp3`; deploy CLAUDE.md; atomically commit
18
15
  settings.
19
- 4. **settings.json merge semantics** — additive: SoT keys win, permissions arrays are
16
+ 3. **settings.json merge semantics** — additive: SoT keys win, permissions arrays are
20
17
  unioned, user-only keys survive. `--reconcile` replaces permissions arrays
21
18
  wholesale instead.
22
- 5. **Removed-artifact pruning** — prune old shell assets, the Stop hook, and
23
- stale kit-owned settings. A flag-less sync removes `advisorModel`; an
24
- explicit advisor state excludes only that key so the modifier owns it.
25
- 6. **Deploy-time modifiers** (`--claude-compact-window`, `--claude-permissive`,
19
+ 4. **Removed-artifact pruning** — prune old shell assets, the Stop hook, stale
20
+ kit-owned settings, retired kit-owned plugin enablement, and the stale
21
+ `~/.local/bin/session-relay` command. A flag-less sync removes
22
+ `advisorModel`; an explicit advisor state excludes only that key so the
23
+ modifier owns it.
24
+ 5. **Deploy-time modifiers** (`--claude-compact-window`, `--claude-permissive`,
26
25
  `--claude-model`, `--claude-effort`, `--claude-advisor`) — deployed file only.
27
- 7. ~/.claude.json (showTurnDuration, user-scoped MCP servers) and connector env
26
+ 6. ~/.claude.json (showTurnDuration, user-scoped MCP servers) and connector env
28
27
  export.
29
- 8. **Session Relay CLI** — ensure the exact source-pinned precompiled command
30
- in `~/.local/bin` for the supported host. A staged asset must match both the
31
- source digest and same-release `SHA256SUMS`, then report exact version before
32
- atomic replacement. Failure stops before Session Relay plugin work and
33
- preserves any prior command.
34
- 9. **Plugins** — seven idempotent passes via the `claude plugin` CLI
28
+ 7. **Plugins** — seven idempotent passes via the `claude plugin` CLI
35
29
  (marketplaces → install → update → [--prune: uninstall/remove] → re-assert
36
30
  SoT enabled-state). Optional opt-ins via `--claude-plugin=<name>`.
37
- 10. LSP server binaries (npm globals).
31
+ 8. LSP server binaries (npm globals).
38
32
 
39
33
  The statusline reads Claude's native `rate_limits`. There is no OAuth request,
40
34
  usage cache, jq/curl runtime dependency, or Stop fetch hook.
@@ -42,18 +36,16 @@ usage cache, jq/curl runtime dependency, or Stop fetch hook.
42
36
  ## codex (→ ~/.codex, ~/.agents/plugins)
43
37
 
44
38
  bubblewrap check (Linux), config.toml merge (top-level keys replaced
45
- per-key, [table] blocks replaced wholesale, user-only keys/tables preserved),
46
- `--codex-model` then `--codex-effort` modifiers, rules, AGENTS.md, personal
47
- marketplace file, `codex plugin add` refresh.
48
- Immediately before `codex plugin add`, the same Session Relay CLI ensure runs;
49
- an ensure failure prevents the plugin pass.
39
+ per-key, [table] blocks replaced wholesale, user-only keys/tables preserved,
40
+ and retired kit-owned `[plugins."<id>"]` tables stripped), `--codex-model`
41
+ then `--codex-effort` modifiers, rules, AGENTS.md, personal marketplace file,
42
+ and `codex plugin add` refresh.
50
43
 
51
44
  ## agents (→ ~/.agents/skills, ~/.claude/skills symlinks)
52
45
 
53
46
  `npx skills add` per missing manifest slug, Claude symlink healing,
54
- CLI binaries (agent-browser, effect-solutions toolchain-gated), and the
47
+ the effect-solutions CLI (toolchain-gated), and the
55
48
  kit-managed snapshot that `--prune` reconciles against.
56
- This target never ensures or downloads Session Relay.
57
49
 
58
50
  ## Reconcile flags
59
51
 
@@ -4,11 +4,11 @@
4
4
 
5
5
  | Field | Meaning |
6
6
  |-------|---------|
7
- | `kind` | `check` (doctor visibility) / `managed` (kit installs + upgrades) / `managed-release` (dedicated source-pinned release transaction) / `pin` (no binary — a version pin for npx-invoked tools, e.g. `skills-cli`) |
8
- | `policy` | `track` (upgrade toward latest, gated by `verified`) / `present` (install when missing, never upgrade) / `exact` (install the declared release only) |
7
+ | `kind` | `check` (doctor visibility) / `managed` (kit installs + upgrades) / `pin` (no binary — a version pin for npx-invoked tools, e.g. `skills-cli`) |
8
+ | `policy` | `track` (upgrade toward latest, gated by `verified`) / `present` (install when missing, never upgrade) |
9
9
  | `floor` | Minimum acceptable version (below → upgrade automatically) |
10
10
  | `verified` | Last kit-tested version — the gate line |
11
- | `pinnable` | Whether an exact version can be installed (rtk: `RTK_VERSION=vX.Y.Z`) |
11
+ | `pinnable` | Whether an exact version can be installed |
12
12
 
13
13
  ## The gate
14
14
 
@@ -26,36 +26,16 @@ now kit-approved" act.
26
26
 
27
27
  ## Managed tools
28
28
 
29
- - **rtk** — PreToolUse hook (supply-chain sensitive: review releases before
30
- bumping `verified`). Runs FIRST in the claude sync so `rtk init`'s
31
- settings rewrite is normalized by the merge that follows. Pinned installs
32
- fetch the installer script from the version tag, not mutable master.
33
29
  - **bun** — policy `present`: bootstrap only (pinned to `verified` via the
34
30
  installer's version argument), never auto-upgraded. `bun.ts` owns one
35
31
  per-engine-run memo shared by Claude runtime, effect-solutions, and direct
36
32
  toolchain ensure on supported Linux/macOS hosts.
37
- - **effect-solutions**, **agent-browser** — policy `track`: self-upgrade
38
- toward npm latest, gated by their `verified` pins.
39
- - **session-relay** — policy `exact`: Claude/Codex sync and
40
- `docks-kit toolchain ensure session-relay` select exactly one of three targets
41
- (`x86_64-unknown-linux-musl`, `aarch64-unknown-linux-musl`,
42
- `aarch64-apple-darwin`). `x86_64-apple-darwin` is no longer published as of
43
- Session Relay 0.16.0; macOS support is `aarch64-apple-darwin`, and Intel
44
- macOS hosts fail closed before any download. The installer downloads the
45
- pinned `session-relay--v0.16.0` asset and same-release `SHA256SUMS`, requires
46
- source pin = selected row = downloaded bytes, chmods/smoke-tests only the
47
- sibling stage, then renames it over `~/.local/bin/session-relay`. Offline,
48
- unsupported-host, checksum, chmod, version, download, or rename failures
49
- preserve an existing command byte-for-byte. The three pinned production
50
- digests correspond to the tagged `session-relay--v0.16.0` assets and match
51
- its `SHA256SUMS`:
52
- `x86_64-unknown-linux-musl` — `b3ca082dc5ea51e8322be407cdb4bbcaaa05d80bd62c3553f82ab98c1a95498a`
53
- `aarch64-unknown-linux-musl` — `816b6b8bd2d2c2518ea359a5a21502213347b387a1cc576a0fb9cf541e5646ed`
54
- `aarch64-apple-darwin` — `da8b114216c3f2301ad582df8e59b49e91953abcc1112b510466b31637fda825`
33
+ - **effect-solutions** — policy `track`: self-upgrades toward npm latest,
34
+ gated by its `verified` pin.
55
35
 
56
36
  jq and curl are `check` rows, not global prerequisites. jq is not consumed by
57
- normal sync. curl is checked only at a requested Linux/macOS RTK/Bun installer
58
- download boundary.
37
+ normal sync. curl is checked only when a requested Linux/macOS Bun bootstrap
38
+ must download an installer.
59
39
 
60
40
  ## Supply-chain stance
61
41
 
@@ -68,9 +48,9 @@ probe falls back to the pinned `verified`, never to an ungated latest.
68
48
 
69
49
  ## Commands
70
50
 
71
- ```
72
- docks-kit toolchain check # doctor table (also inside docks-kit status)
73
- docks-kit toolchain ensure rtk # install/upgrade one tool per policy
74
- docks-kit toolchain ensure session-relay # install exact verified release
75
- docks-kit sync --yes # unattended: auto-accept gates
51
+ ```text
52
+ docks-kit toolchain check # doctor table (also inside docks-kit status)
53
+ docks-kit toolchain ensure bun # ensure one supported managed tool
54
+ docks-kit toolchain ensure effect-solutions # ensure the other supported managed tool
55
+ docks-kit sync --yes # unattended: auto-accept gates
76
56
  ```
@@ -10,7 +10,6 @@ import {
10
10
  sotCodexModel
11
11
  } from "../manifests"
12
12
  import { kitHome } from "../kitHome"
13
- import { sessionRelayReadiness } from "../engine-native/sessionRelayReadiness"
14
13
 
15
14
  const json = Options.boolean("json").pipe(
16
15
  Options.withDescription("Machine-readable output")
@@ -48,12 +47,11 @@ export const statusCommand = Command.make("status", { json }, (config) =>
48
47
  const drift = gatherDrift()
49
48
  const plugins = pluginsView()
50
49
  const skills = skillsView()
51
- const sessionRelay = sessionRelayReadiness()
52
50
  const toolchainTable = yield* engineCapture(["toolchain", "check"])
53
51
 
54
52
  if (config.json) {
55
53
  return yield* Console.log(
56
- JSON.stringify({ kitHome: kitHome(), drift, plugins, skills, sessionRelayReadiness: sessionRelay, toolchainTable }, null, 2)
54
+ JSON.stringify({ kitHome: kitHome(), drift, plugins, skills, toolchainTable }, null, 2)
57
55
  )
58
56
  }
59
57
 
@@ -69,11 +67,6 @@ export const statusCommand = Command.make("status", { json }, (config) =>
69
67
  yield* Console.log(
70
68
  `\nPlugins: ${plugins.length} known (${enabled} SoT-enabled) — details: docks-kit plugins list`
71
69
  )
72
- yield* Console.log(
73
- sessionRelay.state === "ready"
74
- ? `Session Relay: ready for new Codex sessions (v${sessionRelay.version})`
75
- : `Session Relay: unavailable for new Codex sessions (${sessionRelay.reason})`
76
- )
77
70
  const installed = skills.filter((s) => s.installed).length
78
71
  yield* Console.log(
79
72
  `Skills: ${skills.length} known (${installed} installed) — details: docks-kit skills list`
@@ -81,6 +74,6 @@ export const statusCommand = Command.make("status", { json }, (config) =>
81
74
  })
82
75
  ).pipe(
83
76
  Command.withDescription(
84
- "Doctor view: deployed-vs-SoT drift, toolchain, plugin/skill counts, and Session Relay readiness for new Codex sessions."
77
+ "Doctor view: deployed-vs-SoT drift, toolchain, and plugin/skill counts."
85
78
  )
86
79
  )
@@ -49,7 +49,7 @@ const LEGACY_HINTS: Record<string, string> = {
49
49
  "--permissive": "--permissive was renamed to --claude-permissive",
50
50
  "--supabase": "--supabase was renamed to --claude-plugin=supabase",
51
51
  "--n8n": "--n8n was renamed to --claude-plugin=n8n",
52
- "--no-rtk": "--no-rtk was renamed to --skip-rtk",
52
+ "--skip-rtk": "--skip-rtk was renamed to --skip-bubblewrap",
53
53
  "--claude": "--claude was renamed: pass the target as a word, e.g. 'sync claude'",
54
54
  "--codex": "--codex was renamed: pass the target as a word, e.g. 'sync codex'",
55
55
  "--agents": "--agents was renamed: pass the target as a word, e.g. 'sync agents'"
@@ -77,8 +77,8 @@ const reconcile = Options.boolean("reconcile").pipe(
77
77
  const prune = Options.boolean("prune").pipe(
78
78
  Options.withDescription("Uninstall kit-managed installs not in SoT (plugins, marketplaces, universal skills)")
79
79
  )
80
- const skipRtk = Options.boolean("skip-rtk").pipe(
81
- Options.withDescription("Skip optional tool bootstrap (RTK, bubblewrap)")
80
+ const skipBubblewrap = Options.boolean("skip-bubblewrap").pipe(
81
+ Options.withDescription("Skip optional bubblewrap bootstrap (Codex Linux sandbox)")
82
82
  )
83
83
  const skipPluginRefresh = Options.boolean("skip-plugin-refresh").pipe(
84
84
  Options.withDescription("Install missing plugins but skip refresh-only updates for existing plugins")
@@ -131,7 +131,7 @@ export const syncCommand = Command.make(
131
131
  dryRun,
132
132
  reconcile,
133
133
  prune,
134
- skipRtk,
134
+ skipBubblewrap,
135
135
  skipPluginRefresh,
136
136
  yes,
137
137
  verbose,
@@ -175,7 +175,7 @@ export const syncCommand = Command.make(
175
175
  if (config.dryRun) args.push("--dry-run")
176
176
  if (config.reconcile) args.push("--reconcile")
177
177
  if (config.prune) args.push("--prune")
178
- if (config.skipRtk) args.push("--skip-rtk")
178
+ if (config.skipBubblewrap) args.push("--skip-bubblewrap")
179
179
  if (config.skipPluginRefresh) args.push("--skip-plugin-refresh")
180
180
  if (config.yes) args.push("--yes")
181
181
  if (config.verbose) args.push("--verbose")
@@ -2,7 +2,7 @@ import { Args, Command, Options } from "@effect/cli"
2
2
  import { Effect, Option } from "effect"
3
3
  import { bail, engine } from "../engine"
4
4
 
5
- const MANAGED = ["rtk", "bun", "effect-solutions", "agent-browser", "session-relay"]
5
+ const MANAGED = ["bun", "effect-solutions"]
6
6
 
7
7
  const op = Args.text({ name: "op" }).pipe(
8
8
  Args.withDescription("check (default) | ensure <tool>"),
@@ -1,7 +1,7 @@
1
1
  import { Command, Options } from "@effect/cli"
2
2
  import { Console, Effect } from "effect"
3
3
  import { spawnSync } from "node:child_process"
4
- import { existsSync } from "node:fs"
4
+ import { existsSync, readFileSync } from "node:fs"
5
5
  import { join } from "node:path"
6
6
  import { bail, compiled } from "../engine"
7
7
  import { kitHome } from "../kitHome"
@@ -32,6 +32,27 @@ export const updateSyncArgs = (home: string): Array<string> => [
32
32
  "--skip-plugin-refresh"
33
33
  ]
34
34
 
35
+ const readPackageVersion = (home: string): string => {
36
+ try {
37
+ const doc: unknown = JSON.parse(readFileSync(join(home, "package.json"), "utf8"))
38
+ if (doc === null || typeof doc !== "object" || !("version" in doc)) return ""
39
+ return typeof doc.version === "string" ? doc.version : ""
40
+ } catch {
41
+ return ""
42
+ }
43
+ }
44
+
45
+ export const packageUpdateResult = (
46
+ before: string,
47
+ after: string
48
+ ): { alreadyCurrent: boolean; message: string } => {
49
+ if (before === "" || after === "") return { alreadyCurrent: false, message: "" }
50
+ if (before === after) {
51
+ return { alreadyCurrent: true, message: `Already at the latest version (${after}).` }
52
+ }
53
+ return { alreadyCurrent: false, message: `Updated ${before} -> ${after}.` }
54
+ }
55
+
35
56
  const updateCheckout = (home: string, skipSync: boolean) =>
36
57
  Effect.gen(function* () {
37
58
  if (spawnSync("git", ["--version"], { stdio: "ignore" }).status !== 0) {
@@ -52,7 +73,7 @@ const updateCheckout = (home: string, skipSync: boolean) =>
52
73
  const after = git(home, ["rev-parse", "HEAD"]).out
53
74
 
54
75
  if (before === after) {
55
- return yield* Console.log(`Already up to date (${after.slice(0, 7)}, upstream ${upstream.out}).`)
76
+ return yield* Console.log(`Already at the latest version (${after.slice(0, 7)}, upstream ${upstream.out}).`)
56
77
  }
57
78
 
58
79
  const count = git(home, ["rev-list", "--count", `${before}..${after}`]).out
@@ -89,12 +110,17 @@ const updatePackage = (home: string, skipSync: boolean) =>
89
110
  home.includes("\\.bun\\") ||
90
111
  underEnvDir("BUN_INSTALL_GLOBAL_DIR") ||
91
112
  underEnvDir("BUN_INSTALL")
113
+ const beforeVersion = readPackageVersion(home)
92
114
  const res = viaBun
93
115
  ? spawnSync("bun", ["add", "-g", "docks-kit@latest"], { stdio: "inherit" })
94
116
  : spawnSync("npm", ["install", "-g", "docks-kit@latest"], { stdio: "inherit" })
95
117
  if (res.error !== undefined || res.status !== 0) {
96
118
  return yield* bail(`global package update failed (${viaBun ? "bun add -g" : "npm install -g"} docks-kit@latest)`, 1)
97
119
  }
120
+
121
+ const result = packageUpdateResult(beforeVersion, readPackageVersion(home))
122
+ if (result.message !== "") yield* Console.log(result.message)
123
+ if (result.alreadyCurrent) return
98
124
  if (skipSync) return yield* Console.log("Kit updated. Run: docks-kit sync")
99
125
  yield* Console.log("Kit updated - running sync with the new version...")
100
126
  // Chain through the package dir just updated (global installs update in
@@ -27,12 +27,12 @@ explicit removed-engine diagnostic and exits 2 with the recovery tag message.
27
27
  - **Prove-red stays red.** The golden suites compare live native output to a
28
28
  mismatched golden under `--prove-red` and must exit non-zero after printing
29
29
  `prove-red OK`.
30
- - **Step ordering is load-bearing.** The Claude pipeline runs RTK, resolves Bun,
31
- prepares materialized settings, writes runtime assets, commits settings, then
32
- performs readiness-gated legacy cleanup. Modifiers run after the base commit,
33
- removals before plugins, and LSP checks after plugin state.
34
- - **External CLIs stay external.** `claude`, `codex`, `npx`, `npm`, `rtk`,
35
- `bun`, `curl`, and platform package managers are spawned with argv arrays,
30
+ - **Step ordering is load-bearing.** The Claude pipeline resolves Bun, prepares
31
+ materialized settings, writes runtime assets, commits settings, then performs
32
+ readiness-gated legacy cleanup. Modifiers run after the base commit, removals
33
+ before plugins, and LSP checks after plugin state.
34
+ - **External CLIs stay external.** `claude`, `codex`, `npx`, `npm`, `bun`,
35
+ `curl`, and platform package managers are spawned with argv arrays,
36
36
  not shell command strings except where the external installer contract is a
37
37
  shell script.
38
38
  - **Backups precede mutation.** Deployed settings/config files write `.bak`
@@ -55,6 +55,7 @@ warnings, and the summary. Status-quo confirmations exist but are opt-in.
55
55
  | `warn(msg)` | stderr | shown | shown | `[warn]` yellow (`\x1b[1;33m`) |
56
56
  | `change(msg)` | stderr | shown | shown | `[ok]` green (`\x1b[1;32m`) — ONLY after an operation actually mutated |
57
57
  | `verbose(msg)` | stderr | hidden | shown | `[ok]` green — no-op confirmations ("already …", "present", "up to date", "left as-is"), skips |
58
+ | `progress(msg)` | stderr | interactive only | interactive only | dim, transient single-line status with no newline |
58
59
  | `data(line)` | stdout | shown | shown | bare — dry-run report lines, `status --json`, summary block, usage text |
59
60
 
60
61
  - stdout is data, stderr is logs — the logger NEVER writes to stdout
@@ -63,6 +64,15 @@ warnings, and the summary. Status-quo confirmations exist but are opt-in.
63
64
  printed unfiltered at every verbosity.
64
65
  - Prefixes and ANSI codes are stable golden surface; the level controls
65
66
  visibility, not the prefix.
67
+ - `logger.ts` `makeLogger`, at progress sink selection, enables transient
68
+ progress when `LoggerSinks.progress` exists. It also enables progress when no
69
+ stderr sink exists and `process.stderr.isTTY` is `true`. It disables progress
70
+ in every other case. Injected golden sinks therefore keep their existing
71
+ bytes unless the harness supplies a progress sink.
72
+ - Each progress write replaces one terminal line. `clearProgress()` erases a
73
+ pending line and does nothing when no line is pending. Every durable
74
+ `change`, `verbose`, `warn`, `err`, or `echo` write erases the pending line
75
+ before it writes durable output.
66
76
 
67
77
  ### Change detection
68
78
 
@@ -76,9 +86,9 @@ each such skip is an intentional behavior change named in its golden diff.
76
86
  Exactly one deduplicated warn per requested missing tool per run, uniform shape:
77
87
  `[warn] <tool> not installed — <platform-correct install command>`, sourced
78
88
  from the dependency registry (`deps.ts`). jq and curl are optional report rows:
79
- jq has no runtime consumer, while curl warns only at a requested POSIX RTK/Bun
80
- download boundary. A missing Bun defers Claude runtime migration without
81
- deleting working legacy hooks or statusline files.
89
+ jq has no runtime consumer, while curl warns only when a requested POSIX Bun
90
+ bootstrap needs an installer download. A missing Bun defers Claude runtime
91
+ migration without deleting working legacy hooks or statusline files.
82
92
 
83
93
  ### Summary and next steps
84
94
 
@@ -89,10 +99,9 @@ it. The schema below applies to `sync` only.
89
99
 
90
100
  The `--- Sync complete ---` block (stdout, `data`) prints on every run,
91
101
  including dry-run, with the per-target inventory lines (`Claude:`/`Hooks:`/
92
- `RTK:`/`Plugins:`/`Codex:`/`Skills:`). Next-step advice lines print only when
93
- their trigger changed this run (plugins changed → `/reload-plugins` line;
94
- hooks/env changed → restart line; skills changed → discovery line) or under
95
- `--verbose`.
102
+ `Plugins:`/`Codex:`/`Skills:`). Next-step advice lines print only when their
103
+ trigger changed this run (plugins changed → `/reload-plugins` line; hooks/env
104
+ changed → restart line; skills changed → discovery line) or under `--verbose`.
96
105
 
97
106
  ### Platform seam
98
107
 
@@ -118,14 +127,14 @@ active logger binding.
118
127
  | `parseArgs.ts` | engine usage, target selection, flag parsing, legacy rename hints, model flag validation |
119
128
  | `index.ts` | sync orchestration, target dispatch, run summary and next-step blocks |
120
129
  | `../payload.ts` | generated text/byte payload reads and presentation-only source labels |
121
- | `claudeSync.ts` | Claude pipeline: RTK, prepared settings transaction, runtime assets, deploy-time modifiers, `~/.claude.json`, readiness-gated removed artifacts, plugins, optional plugins, LSP binaries |
130
+ | `claudeSync.ts` | Claude pipeline: Bun bootstrap, prepared settings transaction, runtime assets, deploy-time modifiers, `~/.claude.json`, readiness-gated removed artifacts, plugins, optional plugins, LSP binaries |
122
131
  | `bun.ts` | per-run memoized Bun resolution/bootstrap shared by Claude runtime, effect-solutions, and direct toolchain ensure |
123
132
  | `claudeRuntime.ts` | sentinel validation, absolute runtime paths, no-cutover settings projection, and POSIX statusline commands |
124
133
  | `settings.ts` | pure Claude settings merge/reconcile semantics and permission-array union |
125
134
  | `claudeModel.ts` | deployed Claude model modifier and direct `model claude` write path |
126
135
  | `codexSync.ts` | Codex pipeline: bubblewrap check, config merge, rules, AGENTS.md, personal marketplace, plugin refresh |
127
136
  | `codexToml.ts` | line-based top-level TOML replacement and deployed Codex model modifier |
128
- | `skillsSync.ts` | universal skill install/prune, Claude symlink healing, agent-browser/effect-solutions callbacks, managed-skill snapshot |
137
+ | `skillsSync.ts` | universal skill install/prune, Claude symlink healing, effect-solutions callback, managed-skill snapshot |
129
138
  | `toolchain.ts` | tool presence/version probes, verified-version gate, managed install/upgrade orchestration, report table |
130
139
  | `modes.ts` | direct `model` and `toolchain` modes |
131
140
  | `models.ts` | model catalog listing and validation |