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 +9 -14
- package/README.md +11 -23
- package/cli/docs/flags.md +1 -2
- package/cli/docs/install.md +2 -2
- package/cli/docs/platforms.md +7 -12
- package/cli/docs/sync-layers.md +17 -25
- package/cli/docs/toolchain.md +12 -32
- package/cli/src/commands/status.ts +2 -9
- package/cli/src/commands/sync.ts +5 -5
- package/cli/src/commands/toolchain.ts +1 -1
- package/cli/src/commands/update.ts +28 -2
- package/cli/src/engine-native/DESIGN.md +24 -15
- package/cli/src/engine-native/claudeSync.ts +84 -116
- package/cli/src/engine-native/codexSync.ts +52 -11
- package/cli/src/engine-native/deps.ts +21 -51
- package/cli/src/engine-native/index.ts +33 -8
- package/cli/src/engine-native/logger.ts +73 -10
- package/cli/src/engine-native/modes.ts +2 -10
- package/cli/src/engine-native/parseArgs.ts +5 -5
- package/cli/src/engine-native/skillsSync.ts +18 -52
- package/cli/src/engine-native/toolchain.ts +7 -5
- package/cli/src/generated/sotPayload.ts +6 -6
- package/package.json +1 -1
- package/cli/src/engine-native/sessionRelayCli.ts +0 -262
- package/cli/src/engine-native/sessionRelayReadiness.ts +0 -94
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,
|
|
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.
|
|
16
|
-
|
|
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
|
|
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
|
-
-
|
|
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-
|
|
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
|
|
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`; `
|
|
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
|
|
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
|
|
38
|
-
|
|
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-
|
|
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 (
|
|
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 |
|
|
130
|
-
|
|
131
|
-
| Linux | x64 | ✅ | ✅
|
|
132
|
-
| Linux | arm64 | ✅ | ✅
|
|
133
|
-
| macOS | x64 | ✅ | ✅
|
|
134
|
-
| macOS | arm64 | ✅ | ✅
|
|
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.
|
|
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-
|
|
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` |
|
package/cli/docs/install.md
CHANGED
|
@@ -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
|
|
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
|
|
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
|
package/cli/docs/platforms.md
CHANGED
|
@@ -2,20 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
The supported host matrix is exact:
|
|
4
4
|
|
|
5
|
-
| Platform | Architecture | docks-kit binary |
|
|
6
|
-
|
|
7
|
-
| Linux | x64 | `docks-kit-linux-x64` |
|
|
8
|
-
| Linux | arm64 | `docks-kit-linux-arm64` |
|
|
9
|
-
| macOS | x64 | `docks-kit-darwin-x64` |
|
|
10
|
-
| macOS | arm64 | `docks-kit-darwin-arm64` |
|
|
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
|
|
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
|
package/cli/docs/sync-layers.md
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
26
|
+
6. ~/.claude.json (showTurnDuration, user-scoped MCP servers) and connector env
|
|
28
27
|
export.
|
|
29
|
-
|
|
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
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
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
|
|
package/cli/docs/toolchain.md
CHANGED
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
| Field | Meaning |
|
|
6
6
|
|-------|---------|
|
|
7
|
-
| `kind` | `check` (doctor visibility) / `managed` (kit installs + upgrades) / `
|
|
8
|
-
| `policy` | `track` (upgrade toward latest, gated by `verified`) / `present` (install when missing, never upgrade)
|
|
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
|
|
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
|
|
38
|
-
|
|
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
|
|
58
|
-
download
|
|
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
|
|
73
|
-
docks-kit toolchain ensure
|
|
74
|
-
docks-kit toolchain ensure
|
|
75
|
-
docks-kit sync --yes
|
|
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,
|
|
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
|
|
77
|
+
"Doctor view: deployed-vs-SoT drift, toolchain, and plugin/skill counts."
|
|
85
78
|
)
|
|
86
79
|
)
|
package/cli/src/commands/sync.ts
CHANGED
|
@@ -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
|
-
"--
|
|
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
|
|
81
|
-
Options.withDescription("Skip optional
|
|
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
|
-
|
|
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.
|
|
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 = ["
|
|
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
|
|
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
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
- **External CLIs stay external.** `claude`, `codex`, `npx`, `npm`, `
|
|
35
|
-
`
|
|
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
|
|
80
|
-
download
|
|
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
|
-
`
|
|
93
|
-
|
|
94
|
-
|
|
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:
|
|
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,
|
|
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 |
|