@b00dea/cockpit 0.0.0-stage → 0.1.0
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 +375 -0
- package/LICENSE +21 -0
- package/README.md +22 -2
- package/bin/cockpit.mjs +33 -0
- package/cockpit.schema.json +2574 -0
- package/dist/autonomy.d.ts +44 -0
- package/dist/autonomy.js +156 -0
- package/dist/bounded-read.d.ts +14 -0
- package/dist/bounded-read.js +42 -0
- package/dist/browser/commands.d.ts +62 -0
- package/dist/browser/commands.js +349 -0
- package/dist/browser/package-paths.d.ts +1 -0
- package/dist/browser/package-paths.js +6 -0
- package/dist/browser/proxy.d.ts +22 -0
- package/dist/browser/proxy.js +37 -0
- package/dist/browser/runtime.d.ts +117 -0
- package/dist/browser/runtime.js +183 -0
- package/dist/browser/surfaces.d.ts +141 -0
- package/dist/browser/surfaces.js +556 -0
- package/dist/browser/ui-gate.d.ts +15 -0
- package/dist/browser/ui-gate.js +18 -0
- package/dist/cli-guard.d.ts +5 -0
- package/dist/cli-guard.js +71 -0
- package/dist/cli-main.d.ts +139 -0
- package/dist/cli-main.js +1405 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +16 -0
- package/dist/command-table.d.ts +113 -0
- package/dist/command-table.js +512 -0
- package/dist/config/load.d.ts +171 -0
- package/dist/config/load.js +345 -0
- package/dist/config/sibling-toml.d.ts +48 -0
- package/dist/config/sibling-toml.js +160 -0
- package/dist/config/surface-tools-toml.d.ts +9 -0
- package/dist/config/surface-tools-toml.js +37 -0
- package/dist/config/verified-write.d.ts +43 -0
- package/dist/config/verified-write.js +89 -0
- package/dist/diagnostics.d.ts +26 -0
- package/dist/diagnostics.js +335 -0
- package/dist/emit.d.ts +22 -0
- package/dist/emit.js +43 -0
- package/dist/entrypoint-kinds.d.ts +3 -0
- package/dist/entrypoint-kinds.js +11 -0
- package/dist/environment/application/destructive.d.ts +6 -0
- package/dist/environment/application/destructive.js +425 -0
- package/dist/environment/application/doctor.d.ts +89 -0
- package/dist/environment/application/doctor.js +235 -0
- package/dist/environment/application/guard.d.ts +43 -0
- package/dist/environment/application/guard.js +622 -0
- package/dist/environment/application/health.d.ts +134 -0
- package/dist/environment/application/health.js +379 -0
- package/dist/environment/application/lifecycle-context.d.ts +228 -0
- package/dist/environment/application/lifecycle-context.js +154 -0
- package/dist/environment/application/lifecycle-state.d.ts +25 -0
- package/dist/environment/application/lifecycle-state.js +201 -0
- package/dist/environment/application/lifecycle.d.ts +17 -0
- package/dist/environment/application/lifecycle.js +729 -0
- package/dist/environment/application/logs.d.ts +45 -0
- package/dist/environment/application/logs.js +127 -0
- package/dist/environment/application/setup.d.ts +129 -0
- package/dist/environment/application/setup.js +741 -0
- package/dist/environment/application/shared.d.ts +11 -0
- package/dist/environment/application/shared.js +61 -0
- package/dist/environment/claims.d.ts +389 -0
- package/dist/environment/claims.js +1709 -0
- package/dist/environment/codex-hook-trust.d.ts +11 -0
- package/dist/environment/codex-hook-trust.js +185 -0
- package/dist/environment/compose-environment.d.ts +1 -0
- package/dist/environment/compose-environment.js +6 -0
- package/dist/environment/compose-ownership.d.ts +21 -0
- package/dist/environment/compose-ownership.js +117 -0
- package/dist/environment/compose-topology.d.ts +117 -0
- package/dist/environment/compose-topology.js +413 -0
- package/dist/environment/contract.d.ts +489 -0
- package/dist/environment/contract.js +761 -0
- package/dist/environment/declaration.d.ts +14 -0
- package/dist/environment/declaration.js +39 -0
- package/dist/environment/destructive-composition.d.ts +29 -0
- package/dist/environment/destructive-composition.js +333 -0
- package/dist/environment/docker-daemon.d.ts +30 -0
- package/dist/environment/docker-daemon.js +78 -0
- package/dist/environment/docker-endpoint.d.ts +10 -0
- package/dist/environment/docker-endpoint.js +19 -0
- package/dist/environment/env-schema-observation.d.ts +46 -0
- package/dist/environment/env-schema-observation.js +241 -0
- package/dist/environment/evidence.d.ts +136 -0
- package/dist/environment/evidence.js +437 -0
- package/dist/environment/executable.d.ts +26 -0
- package/dist/environment/executable.js +167 -0
- package/dist/environment/generated-application/authorities.d.ts +5 -0
- package/dist/environment/generated-application/authorities.js +61 -0
- package/dist/environment/generated-application/bootstrap-skill.d.ts +16 -0
- package/dist/environment/generated-application/bootstrap-skill.js +328 -0
- package/dist/environment/generated-application/check.d.ts +13 -0
- package/dist/environment/generated-application/check.js +189 -0
- package/dist/environment/generated-application/custom-surface.d.ts +26 -0
- package/dist/environment/generated-application/custom-surface.js +289 -0
- package/dist/environment/generated-application/prepare.d.ts +29 -0
- package/dist/environment/generated-application/prepare.js +276 -0
- package/dist/environment/generated-application/publication.d.ts +33 -0
- package/dist/environment/generated-application/publication.js +547 -0
- package/dist/environment/generated-application/shared.d.ts +484 -0
- package/dist/environment/generated-application/shared.js +349 -0
- package/dist/environment/generated-application/surface-observation.d.ts +4 -0
- package/dist/environment/generated-application/surface-observation.js +69 -0
- package/dist/environment/generated-application/surface-outputs.d.ts +71 -0
- package/dist/environment/generated-application/surface-outputs.js +389 -0
- package/dist/environment/generated-application/surfaces.d.ts +3 -0
- package/dist/environment/generated-application/surfaces.js +699 -0
- package/dist/environment/generated-application/sync.d.ts +6 -0
- package/dist/environment/generated-application/sync.js +109 -0
- package/dist/environment/git-observation.d.ts +183 -0
- package/dist/environment/git-observation.js +544 -0
- package/dist/environment/health-composition.d.ts +11 -0
- package/dist/environment/health-composition.js +628 -0
- package/dist/environment/host-observation.d.ts +56 -0
- package/dist/environment/host-observation.js +52 -0
- package/dist/environment/identity.d.ts +48 -0
- package/dist/environment/identity.js +85 -0
- package/dist/environment/init-application.d.ts +308 -0
- package/dist/environment/init-application.js +697 -0
- package/dist/environment/install-policy-observation.d.ts +71 -0
- package/dist/environment/install-policy-observation.js +284 -0
- package/dist/environment/install-policy.d.ts +48 -0
- package/dist/environment/install-policy.js +96 -0
- package/dist/environment/instance.d.ts +33 -0
- package/dist/environment/instance.js +122 -0
- package/dist/environment/instruction-pointer.d.ts +19 -0
- package/dist/environment/instruction-pointer.js +144 -0
- package/dist/environment/lifecycle-composition.d.ts +29 -0
- package/dist/environment/lifecycle-composition.js +675 -0
- package/dist/environment/lifecycle-stage.d.ts +115 -0
- package/dist/environment/lifecycle-stage.js +398 -0
- package/dist/environment/lifecycle.d.ts +75 -0
- package/dist/environment/lifecycle.js +354 -0
- package/dist/environment/logs.d.ts +132 -0
- package/dist/environment/logs.js +519 -0
- package/dist/environment/observations.d.ts +46 -0
- package/dist/environment/observations.js +344 -0
- package/dist/environment/operator-application.d.ts +50 -0
- package/dist/environment/operator-application.js +155 -0
- package/dist/environment/ports.d.ts +182 -0
- package/dist/environment/ports.js +1205 -0
- package/dist/environment/posture-observation.d.ts +68 -0
- package/dist/environment/posture-observation.js +253 -0
- package/dist/environment/read-composition.d.ts +27 -0
- package/dist/environment/read-composition.js +352 -0
- package/dist/environment/readiness-composition.d.ts +38 -0
- package/dist/environment/readiness-composition.js +130 -0
- package/dist/environment/reclaim.d.ts +333 -0
- package/dist/environment/reclaim.js +1835 -0
- package/dist/environment/repository-identity.d.ts +13 -0
- package/dist/environment/repository-identity.js +108 -0
- package/dist/environment/runtime-measurement-record.d.ts +38 -0
- package/dist/environment/runtime-measurement-record.js +111 -0
- package/dist/environment/runtime-measurement.d.ts +27 -0
- package/dist/environment/runtime-measurement.js +224 -0
- package/dist/environment/runtime-probe-residue.d.ts +43 -0
- package/dist/environment/runtime-probe-residue.js +148 -0
- package/dist/environment/runtime-probe.d.ts +72 -0
- package/dist/environment/runtime-probe.js +725 -0
- package/dist/environment/runtime.d.ts +505 -0
- package/dist/environment/runtime.js +2335 -0
- package/dist/environment/seed.d.ts +16 -0
- package/dist/environment/seed.js +43 -0
- package/dist/environment/selftest-application.d.ts +86 -0
- package/dist/environment/selftest-application.js +713 -0
- package/dist/environment/sensitive.d.ts +3 -0
- package/dist/environment/sensitive.js +48 -0
- package/dist/environment/setup-observation.d.ts +62 -0
- package/dist/environment/setup-observation.js +1473 -0
- package/dist/environment/setup.d.ts +43 -0
- package/dist/environment/setup.js +176 -0
- package/dist/environment/sibling-instructions.d.ts +33 -0
- package/dist/environment/sibling-instructions.js +224 -0
- package/dist/environment/sibling-registration.d.ts +45 -0
- package/dist/environment/sibling-registration.js +538 -0
- package/dist/environment/state.d.ts +371 -0
- package/dist/environment/state.js +2013 -0
- package/dist/environment/templates.d.ts +140 -0
- package/dist/environment/templates.js +685 -0
- package/dist/environment/tool-registration.d.ts +9 -0
- package/dist/environment/tool-registration.js +96 -0
- package/dist/environment/upgrade-application.d.ts +19 -0
- package/dist/environment/upgrade-application.js +175 -0
- package/dist/environment-exec/execute.d.ts +102 -0
- package/dist/environment-exec/execute.js +1175 -0
- package/dist/environment-exec/libexec-program.d.ts +6 -0
- package/dist/environment-exec/libexec-program.js +22 -0
- package/dist/environment-exec/verified-digest.d.ts +4 -0
- package/dist/environment-exec/verified-digest.js +16 -0
- package/dist/exact-keys.d.ts +7 -0
- package/dist/exact-keys.js +15 -0
- package/dist/fix-catalogue.d.ts +32 -0
- package/dist/fix-catalogue.js +60 -0
- package/dist/freshness.d.ts +29 -0
- package/dist/freshness.js +75 -0
- package/dist/generated-environment/adopt.d.ts +16 -0
- package/dist/generated-environment/adopt.js +275 -0
- package/dist/generated-environment/command.d.ts +47 -0
- package/dist/generated-environment/command.js +75 -0
- package/dist/generated-environment/transaction.d.ts +186 -0
- package/dist/generated-environment/transaction.js +1770 -0
- package/dist/grading/evaluate.d.ts +71 -0
- package/dist/grading/evaluate.js +403 -0
- package/dist/grading/grade.d.ts +33 -0
- package/dist/grading/grade.js +57 -0
- package/dist/guards/evaluator.d.ts +113 -0
- package/dist/guards/evaluator.js +1226 -0
- package/dist/guards/harness-adapter.d.ts +17 -0
- package/dist/guards/harness-adapter.js +57 -0
- package/dist/guards/host.d.ts +8 -0
- package/dist/guards/host.js +10 -0
- package/dist/guards/invocation-parser.d.ts +66 -0
- package/dist/guards/invocation-parser.js +595 -0
- package/dist/guards/local-identity.d.ts +40 -0
- package/dist/guards/local-identity.js +123 -0
- package/dist/guards/policy-pin.d.ts +13 -0
- package/dist/guards/policy-pin.js +175 -0
- package/dist/guards/protected-locations.d.ts +62 -0
- package/dist/guards/protected-locations.js +461 -0
- package/dist/guards/read-only.d.ts +37 -0
- package/dist/guards/read-only.js +315 -0
- package/dist/init/command.d.ts +40 -0
- package/dist/init/command.js +310 -0
- package/dist/init/derive.d.ts +51 -0
- package/dist/init/derive.js +715 -0
- package/dist/init/draft.d.ts +138 -0
- package/dist/init/draft.js +1205 -0
- package/dist/init/render.d.ts +35 -0
- package/dist/init/render.js +82 -0
- package/dist/init/scaffold.d.ts +53 -0
- package/dist/init/scaffold.js +121 -0
- package/dist/invocation.d.ts +13 -0
- package/dist/invocation.js +20 -0
- package/dist/package-metadata.d.ts +9 -0
- package/dist/package-metadata.js +19 -0
- package/dist/readiness.d.ts +53 -0
- package/dist/readiness.js +88 -0
- package/dist/references/named.d.ts +24 -0
- package/dist/references/named.js +27 -0
- package/dist/refusal.d.ts +15 -0
- package/dist/refusal.js +7 -0
- package/dist/registry-derivation.d.ts +31 -0
- package/dist/registry-derivation.js +32 -0
- package/dist/registry-resolve/command.d.ts +47 -0
- package/dist/registry-resolve/command.js +226 -0
- package/dist/registry-resolve/registry.d.ts +68 -0
- package/dist/registry-resolve/registry.js +292 -0
- package/dist/registry-resolve/render-shell.d.ts +18 -0
- package/dist/registry-resolve/render-shell.js +36 -0
- package/dist/repair.d.ts +29 -0
- package/dist/repair.js +8 -0
- package/dist/schema-json.d.ts +1 -0
- package/dist/schema-json.js +177 -0
- package/dist/schema.d.ts +1322 -0
- package/dist/schema.js +934 -0
- package/dist/setup/command.d.ts +4 -0
- package/dist/setup/command.js +4 -0
- package/dist/sha256.d.ts +1 -0
- package/dist/sha256.js +4 -0
- package/dist/surfaces/adoption.d.ts +41 -0
- package/dist/surfaces/adoption.js +217 -0
- package/dist/surfaces/consumer-instructions.d.ts +20 -0
- package/dist/surfaces/consumer-instructions.js +43 -0
- package/dist/surfaces/contract.d.ts +42 -0
- package/dist/surfaces/contract.js +169 -0
- package/dist/surfaces/core-declarations.d.ts +24 -0
- package/dist/surfaces/core-declarations.js +79 -0
- package/dist/surfaces/development-markers.d.ts +1 -0
- package/dist/surfaces/development-markers.js +18 -0
- package/dist/surfaces/generator-adapter.d.ts +71 -0
- package/dist/surfaces/generator-adapter.js +809 -0
- package/dist/surfaces/harness-registry.d.ts +180 -0
- package/dist/surfaces/harness-registry.js +117 -0
- package/dist/surfaces/mcp.d.ts +95 -0
- package/dist/surfaces/mcp.js +186 -0
- package/dist/surfaces/merge.d.ts +30 -0
- package/dist/surfaces/merge.js +105 -0
- package/dist/surfaces/ownership.d.ts +190 -0
- package/dist/surfaces/ownership.js +795 -0
- package/dist/surfaces/projection.d.ts +136 -0
- package/dist/surfaces/projection.js +681 -0
- package/dist/surfaces/render.d.ts +118 -0
- package/dist/surfaces/render.js +633 -0
- package/dist/surfaces/restrictions.d.ts +130 -0
- package/dist/surfaces/restrictions.js +447 -0
- package/dist/surfaces/selftest.d.ts +162 -0
- package/dist/surfaces/selftest.js +393 -0
- package/dist/surfaces/skill-contract.d.ts +85 -0
- package/dist/surfaces/skill-contract.js +449 -0
- package/dist/surfaces/sync.d.ts +57 -0
- package/dist/surfaces/sync.js +164 -0
- package/dist/team-metadata.d.ts +41 -0
- package/dist/team-metadata.js +512 -0
- package/dist/testing/gates.d.ts +91 -0
- package/dist/testing/gates.js +182 -0
- package/dist/testing/hooks.d.ts +59 -0
- package/dist/testing/hooks.js +139 -0
- package/dist/testing/verdict.d.ts +29 -0
- package/dist/testing/verdict.js +62 -0
- package/dist/work-orders/application.d.ts +99 -0
- package/dist/work-orders/application.js +383 -0
- package/dist/work-orders/composition.d.ts +124 -0
- package/dist/work-orders/composition.js +1010 -0
- package/dist/work-orders/contract.d.ts +61 -0
- package/dist/work-orders/contract.js +122 -0
- package/dist/work-orders/store.d.ts +158 -0
- package/dist/work-orders/store.js +197 -0
- package/docs/README.md +65 -0
- package/docs/architecture.md +136 -0
- package/docs/capability-matrix.md +50 -0
- package/docs/cli-reference.md +599 -0
- package/docs/command-list.md +51 -0
- package/docs/compose-patterns.md +99 -0
- package/docs/concepts.md +171 -0
- package/docs/configuration-essentials.md +172 -0
- package/docs/configuration-reference.md +621 -0
- package/docs/environment.md +760 -0
- package/docs/extending.md +43 -0
- package/docs/faq.md +111 -0
- package/docs/getting-started.md +608 -0
- package/docs/harness-surfaces.md +433 -0
- package/docs/joining-a-team.md +76 -0
- package/docs/release-policy.md +49 -0
- package/docs/safety-and-autonomy.md +419 -0
- package/docs/troubleshooting.md +361 -0
- package/docs/tutorial.md +170 -0
- package/docs/work-and-browser.md +254 -0
- package/libexec/browser-operation.cjs +186 -0
- package/libexec/fence-marker.cjs +101 -0
- package/libexec/fence-marker.d.cts +24 -0
- package/libexec/fenced-group-runner.cjs +77 -0
- package/libexec/fenced-supervisor.cjs +137 -0
- package/libexec/generated-filesystem.cjs +731 -0
- package/libexec/install-filesystem.cjs +225 -0
- package/libexec/rulesync-generator.NOTICE.md +1112 -0
- package/libexec/rulesync-generator.cjs +743 -0
- package/libexec/surface-generator-worker.cjs +266 -0
- package/libexec/surface-output-reader.cjs +99 -0
- package/libexec/surface-scratch-cleanup.cjs +14 -0
- package/libexec/validate-harness-evidence.d.mts +183 -0
- package/libexec/validate-harness-evidence.mjs +1312 -0
- package/package.json +74 -4
- package/surfaces/README.md +33 -0
- package/surfaces/agents/evaluator.agent.md +76 -0
- package/surfaces/guards/bash-guard.sh +48 -0
- package/surfaces/guards/claude.adapter.json +25 -0
- package/surfaces/guards/codex.adapter.json +24 -0
- package/surfaces/guards/opencode.adapter.json +25 -0
- package/surfaces/references/browser.md +63 -0
- package/surfaces/references/test-data-and-personas.md +84 -0
- package/surfaces/references/testing-tiers.md +11 -0
- package/surfaces/skills/cockpit-browser.skill.md +54 -0
- package/surfaces/skills/cockpit-explain.skill.md +32 -0
- package/surfaces/skills/cockpit-fix.skill.md +37 -0
- package/surfaces/skills/cockpit-setup.skill.md +39 -0
- package/surfaces/skills/cockpit-work.skill.md +34 -0
- package/surfaces/skills/collection.json +5 -0
- package/surfaces/skills/procedures/explain.md +61 -0
- package/surfaces/skills/procedures/fix.md +81 -0
- package/surfaces/skills/procedures/setup.md +379 -0
- package/surfaces/skills/procedures/work.md +105 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
# @b00dea/cockpit
|
|
2
|
+
|
|
3
|
+
What changed in each release of cockpit, newest first, for someone deciding whether to upgrade:
|
|
4
|
+
what breaks, what to do about it, and what is new. Changesets writes each entry from the
|
|
5
|
+
changesets merged since the previous release. An entry that needs more than `cockpit sync` ends
|
|
6
|
+
with a line starting `Upgrade:`; the [changeset guide](../../.changeset/README.md) defines that
|
|
7
|
+
convention.
|
|
8
|
+
|
|
9
|
+
Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html). The public surface a
|
|
10
|
+
major version protects is the CLI's commands and flags, the <!-- cockpit:ref consumer=cockpit.toml --> `cockpit.toml` schema, the generated
|
|
11
|
+
file layout, and the overlay contract. Deprecation and migration rules are in the
|
|
12
|
+
[release policy](../../docs/release-policy.md).
|
|
13
|
+
|
|
14
|
+
<!-- Changesets inserts each release above the first version heading, so this heading keeps the introduction above every release. -->
|
|
15
|
+
|
|
16
|
+
## 0.1.0
|
|
17
|
+
|
|
18
|
+
### Minor Changes
|
|
19
|
+
|
|
20
|
+
- 0067955: Initial public release.
|
|
21
|
+
|
|
22
|
+
- One `cockpit.toml` is the policy and the product declaration: sibling repositories, ports, guards, MCP servers, autonomy and work. `cockpit sibling add|remove` edits the repository list and `cockpit tool add|remove` edits `[surfaces] tools`, which defaults to Claude Code, Codex CLI and OpenCode.
|
|
23
|
+
- `cockpit sync` writes the matching instructions, skills, subagents, hooks, permissions and MCP entries for each listed tool, with `--dry-run` previews, and `cockpit check` fails when a generated file no longer matches, locally or in the `cockpit-check` GitHub Action. `sync --adopt <path>` moves a team's existing agent settings file into cockpit and merges it with the generated version.
|
|
24
|
+
- One guard policy refuses pushes to protected branches, reads and edits of declared environment files and secrets directories, and commands against declared hosted databases or vendor hosts. `[[guards.deny]]` and `[[guards.allow]]` add your own command rules. The hook is installed for Claude Code, Codex CLI and OpenCode, fails closed, and also denies agent writes to `.npmrc` and to cockpit's own policy and records. Codex runs the hook only after a person trusts it once per machine; `doctor` and `check` report `CODEX_HOOK_UNTRUSTED` until then. `cockpit selftest` checks that each tool enforces the generated controls, and the capability matrix records dated measurements.
|
|
25
|
+
- Sibling repositories' guides are copied into the root instructions, and the Claude Code and Codex hooks run `cockpit check` as a session starts.
|
|
26
|
+
- `cockpit init` starts in the repository it runs in: a single product repository gets an in-repo cockpit, every listed tool gets the `cockpit-setup` skill, and the interview marks every value it inferred or defaulted. `init` writes a commented `[work.gates]` and `[autonomy]` block, and `--registry` turns an existing shell-script setup into a draft. `init --scaffold-compose` writes one plain `compose.yml` for a small app, once.
|
|
27
|
+
- cockpit runs your own Compose files and generates none. `setup`, `up`, `session`, `sleep`, `down`, `reset`, `preflight`, `doctor` and `logs` run the stack on your live checkouts, with port leases and holders so one agent cannot stop another agent's stack. `environment.seed` with `resettable_volumes` fills and refills the data, and `reset` needs a person by default. `down` and `reset` use only a local Docker context, and `cockpit runtime measure` records the local runtime for this machine only.
|
|
28
|
+
- `[autonomy]` and `[work.gates]` say who may pass each step. Everything defaults to `agent` except `[autonomy] reset` and `mcp_approve`, which default to `person`. `check` and `doctor` report a policy weakening nobody has confirmed, and the guard denies an agent's edit of the policy.
|
|
29
|
+
- Each repository's tracked `.env.schema` is validated with Varlock when it is installed, without reading values. MCP servers are enabled only for the digest recorded under `[mcp.approved]`.
|
|
30
|
+
- Work orders are `workorders/<id>.md` with YAML front-matter. `[work] grading` is `independent` (an evaluator in the first usable of `work.evaluators`, any of Claude Code, Codex CLI or OpenCode, reruns the checks and grades each criterion), `checks` or `self`. `cockpit grade --criteria <file>` grades uncommitted work with no order, and `work verify` checks the records in CI.
|
|
31
|
+
- Declared test stages and gates run with `cockpit test-run`, and only a complete passing gate reports PASS.
|
|
32
|
+
- `cockpit browser drive` and `browser screenshot` visit the application's declared routes with a local browser. `browser.endpoint` may name a loopback browser service from your own Compose file, which publishes the Playwright MCP declaration and the `cockpit-browser` skill. cockpit runs no browser service and no debugger.
|
|
33
|
+
- `cockpit upgrade [<version>] [--dry-run]` moves the exact pin and re-runs `sync`.
|
|
34
|
+
- Teams share one cockpit: the root `package.json` pins the exact cockpit version, `check` refuses a different running version, and cockpit manages its own block in `.gitignore`.
|
|
35
|
+
- Diagnostics name what failed, why it matters and the fix. The package ships the user guide under `docs/` and skills that tell agents how to set up, explain, fix and work in a cockpit; install the adoption skill with `npx skills add b0dea/cockpit --skill adopt-cockpit`.
|
|
36
|
+
- Runs on macOS and Linux. Native Windows is refused at startup; WSL2 should behave like Linux but is untested.
|
|
37
|
+
|
|
38
|
+
### Patch Changes
|
|
39
|
+
|
|
40
|
+
- be5adb5: Every `[autonomy]` and `[work.gates]` decision now defaults to `agent` except `reset` and `mcp_approve`, which default to `person`. The `[autonomy] preset` key is removed, and `cockpit init` writes the defaults as a commented block so one can be flipped to `person`.
|
|
41
|
+
- bc8fa52: Browser screenshots can no longer be committed by accident, and the first screenshot no longer needs the artifact directory to exist.
|
|
42
|
+
|
|
43
|
+
- `cockpit sync` adds every `environment.generated_host_paths` entry, which includes the browser artifact roots such as `.browser/cli`, to the managed `.gitignore` block.
|
|
44
|
+
- The browser screenshot command creates its artifact root, including a missing parent such as `.browser`, before writing into it.
|
|
45
|
+
- When no `browser.harnesses` row is at a measured version, the work application's refusal names the declared and measured harness versions and the `sync` command to run after fixing `cockpit.toml`.
|
|
46
|
+
- 3cd8bbf: `cockpit browser debugger` is removed: it refused in every configuration because the headed browser runner it needed is no longer rendered. `browser drive` and `browser screenshot` are unchanged.
|
|
47
|
+
- cfb2f97: `browser.endpoint` is no longer refused outright: it must be a loopback `ws://` address whose port exactly one service in `environment.compose_files` publishes on loopback, otherwise sync refuses with `GENERATED_BROWSER_ENDPOINT_UNPUBLISHED`.
|
|
48
|
+
- ffb5ba5: A `browser.endpoint` published by the project's own Compose service now publishes the Playwright MCP server and the `cockpit-browser` skill at sync, without a cockpit port lease.
|
|
49
|
+
- 525477b: Removed the browser native-transport receipt validator and the probe specifications it consumed: no command ran or recorded them, and a valid receipt left every transport `human_needed`, so the check changed nothing. The capability matrix now lists browser native transports under "Without a measurement", and the browser reference no longer mentions a record validator.
|
|
50
|
+
- d075210: Browser operations reach only what they should.
|
|
51
|
+
|
|
52
|
+
- Browser operations block requests to loopback and resolver-mapped hosts outside the application origin. Redirects that the browser follows are not routed, so they are not blocked.
|
|
53
|
+
- `up` and `sync` name an unparseable browser project `package.json` or lockfile with the line and column, and no longer quote its contents.
|
|
54
|
+
- 2ec827b: `[browser]` drops the fields only the removed browser runner read: `images.runner`, `artifacts.runner`, `artifacts.debugger` and `headed`. The runner script is no longer shipped, and `cockpit browser debugger` refuses with the reason, since nothing can prepare a headed debugger. `browser drive` and `browser screenshot` keep working through the local project client.
|
|
55
|
+
- 1f884bc: The harness registry no longer records Claude Code, Codex and OpenCode as awaiting a native paired probe dated before their guard firing and instruction loading were measured; what it records as open for them is the person's review of the rendered skills, which the capability matrix shows.
|
|
56
|
+
- 01d2003: `cockpit check` now fails with `POLICY_WEAKENING_UNCONFIRMED` while `[work]`, `[work.gates]` or `[autonomy]` in `cockpit.toml` is weaker than the policy the last sync recorded, instead of leaving the weakening to surface only at the next sync.
|
|
57
|
+
- 6fdd9f4: `check` fails with `GENERATED_HOST_PATH_UNMOUNTED` for an `environment.generated_host_paths` entry that no service bind-mounts, naming the entry and how to fix it. In compose-first mode `up` already refused such a stack, and now `check` says so first. An entry inside a bound directory, such as a sibling mounted whole, reaches the container through that bind and counts as mounted; compose-first `up` no longer refuses it either.
|
|
58
|
+
- b4e7209: The generated `.claude/settings.json` now allows, by prefix, the cockpit commands the shipped skills tell an agent to run and the guard admits, such as `test-run`, `check` and `doctor`. Claude Code's default mode previously refused them in a headless session. Person-only commands such as `sync`, `down` and `work accept` still prompt, the guard hook still decides first, and Claude Code applies the rules only once a person has trusted the workspace.
|
|
59
|
+
|
|
60
|
+
The shipped Fix procedure is now a direct fix: run the declared gate before and after the change, with no intake or source audit. The guides say which cockpit commands a Codex user runs outside Codex's sandbox, that the person commits the cockpit repository, and use `--target <tool>` instead of one tool's target.
|
|
61
|
+
|
|
62
|
+
The vendor-specific identity-provider starter is no longer written into every cockpit; its two general lessons (confirm the roles the provider instance exposes, sign in through the provider's own test helper without a second token helper) are now in the test-data reference.
|
|
63
|
+
- 616736f: Several runtime and lifecycle reports now say what actually happened.
|
|
64
|
+
|
|
65
|
+
- When Docker Engine or Docker Compose prints a version with no numeric X.Y.Z core, `up` and `runtime measure` say which tool printed what, and the fix is to install a release that prints one. The fix used to be "start the configured container runtime", which was already running.
|
|
66
|
+
- When `up` refuses because a running stack's declaration changed, the message names the file that changed (for example `compose.yml`, or `[ports]` in `cockpit.toml`) instead of always naming `cockpit.toml`.
|
|
67
|
+
- When a long-running command keeps only the tail of its output, the tail now starts at a whole UTF-8 character, so the first character is no longer garbled.
|
|
68
|
+
- `logs` now works when Docker Compose prints a vendor suffix such as `2.29.7-desktop.1`. It used to refuse every read on such a runtime.
|
|
69
|
+
- A file listed in `environment.generated_host_paths` is now ignored in the managed `.gitignore` block, as a directory there already was.
|
|
70
|
+
- 3bf2315: Running `dist/cli.js` through a symlinked package directory (npm link, workspaces) now runs the command instead of exiting 0 without output.
|
|
71
|
+
- 57a2ad7: The Codex `writable_roots` that `sync` writes for repositories beside the cockpit no longer depend on the directory you run it from. Run from inside a sibling repository, `sync` used to write a root that pointed at the wrong place, and `check` then reported `.codex/config.toml` as drifted depending on where it ran.
|
|
72
|
+
- f416f24: cockpit runs your own Compose files and no longer generates one.
|
|
73
|
+
|
|
74
|
+
- `[environment.generated]` and `sibling[].derives.generated` are gone, and with them the generated services, dependency volumes and installs, vendor stubs and their TLS probes, the `empty`, `seeded` and `restored` data modes, restore rewrites, persona outputs and `docs/cockpit/environment-decisions.md`. So are the rendered browser runner and its fields: `browser.resources`, `browser.runner_health_measurement` and `browser.images.runner.architectures` are unknown keys. A `cockpit.toml` that still sets one is refused; declare `environment.compose_files` and keep the stack in plain Compose. The new Compose patterns guide shows a vendor stub, a TLS front end and a data restore.
|
|
75
|
+
- `environment.seed = { argv = [...], timeout_seconds = N }`, beside `environment.resettable_volumes`, is the command `up` runs once the stack is healthy, and again whenever one of those volumes is newer than the last successful seed, such as after `reset`. A seed that fails refuses with `DATA_SEED_FAILED`, leaves the stack up, and runs again on the next `up`. Editing it leaves a running stack alone.
|
|
76
|
+
- `npx --no cockpit init <cockpit root> --scaffold-compose <app dir> --port <port>` writes a starting `compose.yml` for a small app once, with an optional `--with postgres,redis`, and never replaces an existing Compose file.
|
|
77
|
+
- A compose-first `up` now refuses with `MACHINE_MEMORY_BELOW_FLOOR`, `MACHINE_CPU_BELOW_FLOOR` or `MACHINE_DISK_BELOW_FLOOR` before starting anything on a machine below the declared `[environment.machine]` floor. Only a generated stack used to be held to it.
|
|
78
|
+
- `examples/synthetic` is gone; the tutorial walks through `examples/compose-first`, and `examples/minimal` runs its own `compose.yml`.
|
|
79
|
+
- da3debb: Refusals from `sibling add`, `sibling remove` and `sync --adopt` when they cannot edit `cockpit.toml` safely now carry a fix: wait for another edit to finish and run the same command again, correct the option the message names, or make the change by hand and preview it with `sync --dry-run`. The printed `--config` path in a `sibling` fix is the one the command was given, and the JSON invocation record names it.
|
|
80
|
+
- 9e4c9af: Sync reads `cockpit.toml` through the ordinary anchored file read, and its unreadable-file refusal is now `GENERATED_CONFIG_SOURCE_UNAVAILABLE`.
|
|
81
|
+
- a6b9a2c: A new Configuration essentials page covers the `cockpit.toml` tables a typical cockpit sets, each with a minimal snippet and a link to its full reference entry.
|
|
82
|
+
|
|
83
|
+
The configuration reference is now one table per TOML table, listing every key with its type, default and constraints. Tables that recur, such as probes and provenance, are listed once and linked, and the JSON Schema is linked instead of printed, so the page is about a tenth of its former length.
|
|
84
|
+
- b65f142: Every `cockpit.toml` field now has an effect, or it is gone.
|
|
85
|
+
|
|
86
|
+
- Removed `cockpit.guide`, which nothing read. A configuration that still sets it is refused as an unknown key, so delete the line.
|
|
87
|
+
- A sibling guide declared under `guides` that does not exist, other than the default `CLAUDE.md` and `AGENTS.md`, now fails `sync` and `check` with `SIBLING_GUIDE_MISSING`. It used to link nothing and say nothing.
|
|
88
|
+
- Browser driver versions accept a semantic-version pre-release, such as the Playwright alpha an MCP image bundles. The runner image must still match `browser.project.driver_version` exactly; the MCP image must share its major.minor.
|
|
89
|
+
- f7bbe8b: Every refusal to load `cockpit.toml` now carries a fix: a missing file names `--config` and `cockpit init`, an unreadable, oversized, non-UTF-8 or unparseable file says what to repair, and a schema mismatch points at the configuration reference. `[testing].native_hooks` may be left out and defaults to `{ install = "inspect" }`, as documented; a declared `native_hook_policy` still needs `native_hooks = { install = "explicit-native" }` beside it.
|
|
90
|
+
- 038d0aa: When `work.evaluators` is not set, `work grade` and `cockpit grade` now try the other listed agent tool first and the tool running the command last, detected from `CLAUDECODE` or `CODEX_THREAD_ID`. A declared list is used as written.
|
|
91
|
+
|
|
92
|
+
`work grade` and `grade --criteria` accept `--evaluator <tool>` to grade one run with only that tool, with no fallback.
|
|
93
|
+
- 3669b51: `doctor` and `init` now say what the project still lacks for cockpit to work, before the first `up` and without guessing.
|
|
94
|
+
|
|
95
|
+
- Before the first bring-up, while the stack sleeps, and (in `doctor`) for a cockpit that declares no runtime, `doctor` and `preflight` run every check that needs no running stack (Git state, sibling presence, the machine floor, the runtime measurement, the env schema, the generated surfaces) and report the rest as not applicable. `STATE_UNSEEDED`, `STACK_NOT_RUNNING` or `ENVIRONMENT_NOT_DECLARED` is listed first instead of replacing every check, and `preflight` still never passes in those states. A container runtime that is missing then is reported as `RUNTIME_UNAVAILABLE` with a fix.
|
|
96
|
+
- `doctor --json` carries `result.readiness`, and the human report has one line per gap. It groups the reported diagnostics under the prerequisites cockpit depends on, each with why cockpit needs it and whether it is required (refused by the command that needs it) or recommended. Every `init` stop carries the same `result.readiness`, the preview included.
|
|
97
|
+
- New warnings: `COCKPIT_NOT_INSTALLED` when cockpit is not installed in the cockpit root or the guard hook runs a copy outside it (every new cockpit, because `init` runs from a temporary install); `SIBLING_REMOTE_UNRECORDED` when a sibling is its own Git repository but `cockpit.toml` records no remote, so a teammate's `setup` cannot obtain it; `SECRET_FILE_TRACKED` when a repository commits a `.env`-style file, named by path only and never read. `init` also warns `SETUP_PATH_TYPE_INVALID` when the cockpit root is not in a Git working tree.
|
|
98
|
+
- `check` and `sync` report a declared sibling that is absent as `SIBLING_MISSING`, with how to obtain it, instead of `GENERATED_SIBLING_ROOT_INVALID` with a raw `realpath ENOENT`.
|
|
99
|
+
- The setup skill's onboarding procedure walks the human through each readiness gap and asks before touching a product repository. The documented `init` stops now include `STATE_UNSEEDED`.
|
|
100
|
+
- 3bfa530: `doctor` now exits 2 when `cockpit.toml` is missing or invalid, instead of exiting 0 with an unavailable verdict. Its human output is a short report, one line per area with the commands that show the detail, instead of thousands of lines, and `--json` reports whether the generated files are current (`freshness.local` holds the check's kind, status and diagnostics) instead of embedding the complete check result.
|
|
101
|
+
- d3609e5: `doctor` warns `COCKPIT_LAUNCHER_UNPROVEN` when the guard cannot prove that `npx --no cockpit` run in the cockpit root starts the installed cockpit (a root `.npmrc`, a `bin` or `directories.bin` in the root `package.json`, or a `node_modules/.bin/cockpit` that is not npm's link), so every printed `npx` command would prompt, and Codex and OpenCode would refuse it. It runs the guard's own check and names `./node_modules/.bin/cockpit <command> --config cockpit.toml` when that spelling is still proven.
|
|
102
|
+
- 23e1e36: `doctor` reports the refusal `check` gives when it cannot check the generated publication (a published port outside `ports.bases`, for one), with its fix, instead of the surface-evidence findings that refusal makes unavailable.
|
|
103
|
+
- b7f0fde: `doctor` now reports a policy that `cockpit.toml` sets weaker than the one the last sync recorded, as `check` already does.
|
|
104
|
+
- fd3ad2f: `doctor` warns with `GUARD_SEARCH_PATH_RELATIVE` when the `PATH` it runs with holds a relative or empty entry, which makes the guard ask before every agent command, and names the entry; readiness lists it as `harness-path-absolute`.
|
|
105
|
+
- bbac384: The guard now denies reading, writing, removing, staging or linking any `.env` or `.env.*` file at any depth, declared or not; before, an agent's edit of an undeclared `.env` was allowed and `cat .env` only prompted. `.env.example`, `.env.sample`, `.env.template`, `.env.schema` and declared templates stay readable and writable, and recursive searches and Git content commands now treat those names as documentation too. The refusal points to `varlock run -- <cmd>` or the `.env.schema`. Claude Code's generated `Read` deny rules now cover `.env` and `.env.*` as well; because Claude applies a deny before any allow, its own Read, Grep and Glob tools also refuse the documentation names, which a shell `cat` still reads.
|
|
106
|
+
- ac05031: When the generated files no longer match `cockpit.toml`, for example after upgrading cockpit, `down` and `reset` still refuse rather than hand Compose a file cockpit did not render from the current declaration, but the refusal now says nothing was stopped and prints the whole recovery: run `sync`, then `down`.
|
|
107
|
+
- 6477cf3: The published `cockpit.schema.json` now holds `[mcp.approved]` server names, `[ports.bases]` names and generated `port_defaults` names to the same key patterns the loader enforces, so an editor flags a key `check` would refuse.
|
|
108
|
+
- 606f5d1: `grade --criteria` accepts an absolute path inside the repository, and refuses a path outside it with a message naming `--criteria` and the rule.
|
|
109
|
+
- 1cbc7ab: The guard now admits the read-only idioms agents use constantly, which headless Codex and OpenCode previously turned into refusals, and every remaining refusal names the command and says what to do instead.
|
|
110
|
+
|
|
111
|
+
- `cd ./api && <command>` and `cd ./api; <command>` judge the command from the directory it runs in, under the same rules. After `;` or `||` a failed `cd` leaves the shell where it was, so the command is judged from both directories. A bare `cd api` is still refused, because both shells resolve it through `CDPATH` first; the refusal says to write `cd ./api`.
|
|
112
|
+
- `echo` and `printf` without options are read-only, and `$?` in their arguments is the previous exit status, not dynamic command construction. A `$?` in any argument that could name a path still asks.
|
|
113
|
+
- `sed -n <range>p <file>` reads like `cat`; any other sed command still asks.
|
|
114
|
+
- `git rev-parse` and `git branch` with listing flags (`-v`, `-vv`, `-a`, `-r`, `--show-current`) are read-only, and `@{u}`, `HEAD@{1}` and `HEAD~1` are Git revisions, not brace or tilde expansion.
|
|
115
|
+
- `git add <paths>` naming a guard control such as `.claude/settings.json` now asks like any other staging instead of being refused outright: staging writes the index, not the file. Committing still requires a person.
|
|
116
|
+
- `git add -A`, `git add .` or a directory that contains `env/.secrets` or a declared environment instance is still refused, and the refusal now says to stage the changed files by name.
|
|
117
|
+
- A command the guard does not admit now names itself, and says how to proceed: a person approves it or runs it in a terminal, tests run through `npx --no cockpit test-run`, and `[guards] allow` admits a command for good. A read outside the configured roots says so.
|
|
118
|
+
- 3ed866f: The guard now admits the commands the shipped skills and guides tell an agent to run, as exact profiles: `test-run` on a declared gate, the `work` subcommands without `--interactive`, `cockpit grade --criteria`, the preview of `work recover`, and, where `browser.request_preapproval` is set, `browser drive` and `browser screenshot`. A file these commands name, such as `--criteria`, is checked as a read, so a declared instance or `.secrets` file is denied and an undeclared `.env` prompts. Before, every one of them prompted, and Codex and OpenCode refused them. `--interactive`, `work recover --apply` and `browser debugger` still need a person, and the safety page says why for each.
|
|
119
|
+
- 7ef0e26: The guard asks Git what an `rg` search and a Git command would print, instead of refusing too much or too little.
|
|
120
|
+
|
|
121
|
+
- A plain `rg needle` at the root of a project with a large ignored `node_modules` asked, and Codex and OpenCode turned that into a denial. The guard now asks Git which files the repository does not ignore, as ripgrep skips the rest, so a gitignored `.env` or dependency tree no longer blocks it; an untracked `.env.local` that is not ignored still asks, and `grep -r` still walks every file.
|
|
122
|
+
- `git diff`, `git show` and `git log -p` printed a tracked `.env*` file, secrets file or declared instance without a prompt. They now ask while the repository's index holds one, unless limited with `-- <path>` to paths that hold none.
|
|
123
|
+
- d86a9e2: The guard now admits `jq` reading files as read-only, like `cat`, unless the filter reads the environment or a module, or the command writes.
|
|
124
|
+
- a5a1d6a: When the guard cannot inspect a path because the filesystem refused, its refusal now names the system error instead of only saying inspection failed.
|
|
125
|
+
- e414443: The guard lets agents read declared templates and search code, and protects the MCP wrapper scripts.
|
|
126
|
+
|
|
127
|
+
- A sibling's declared environment `template` (such as `.env.example`) is readable. Undeclared `.env*` files still need approval, and declared instances are still denied.
|
|
128
|
+
- A recursive search (`rg`, `grep -r`, OpenCode's grep) over a sibling or the cockpit root is allowed when no declared instance or `env/.secrets` exists below it. When one does, the reason names it so the agent can search a narrower path; Codex and OpenCode used to deny every such search with a generic reason.
|
|
129
|
+
- Writing, removing or replacing a generated MCP wrapper script under `.cockpit/mcp/` is a hard denial, like the other guard controls.
|
|
130
|
+
- c29ebf7: The guard answers a default `rg` search faster in a checkout with large ignored directories such as `node_modules`, and stops asking about files ripgrep never reads.
|
|
131
|
+
|
|
132
|
+
- Git now names each ignored directory once instead of listing everything inside it, so the check no longer grows with the size of `node_modules`. Its Git queries for one search, and for several searched paths, run together.
|
|
133
|
+
- An `.ignore` or `.rgignore` file or a `.jj` directory inside an ignored directory no longer makes the guard ask: ripgrep does not enter that directory. The same entries in a directory ripgrep does enter still make it ask.
|
|
134
|
+
- A tree or repository can hold up to 1024 environment files before the guard stops naming them, up from 256. Above that bound it still asks.
|
|
135
|
+
- 019c0ad: The guard no longer lets a recursive search or a shadowed command name read secrets without a prompt.
|
|
136
|
+
|
|
137
|
+
- A recursive search (`rg`, `grep -r`, OpenCode's grep) is allowed only when a bounded walk of its tree finds no `.secrets` directory and no `.env*` file other than a declared template, and every other command in the call is read-only, so none can write one first. `grep -rn API_KEY .` used to print an undeclared sibling `.env.local` that `cat` would have stopped at. A tree too large to walk needs approval; the reason names what was found, so the agent can search a narrower path.
|
|
138
|
+
- `rg -g`, `--glob` and `--iglob` are read-only only as `!` exclusions, because any other glob overrides ripgrep's hidden and ignore filters.
|
|
139
|
+
- While the agent harness's `PATH` holds a relative or empty entry, no command is allowed without a prompt, since a file the agent wrote could run in place of a command or of the interpreter a path-spelled script starts by name. The reason names the entry; remove it from the `PATH` the harness starts with.
|
|
140
|
+
- 1e8c651: The guard no longer allows reads of a declared instance through these spellings:
|
|
141
|
+
|
|
142
|
+
- A `cd` after `||` may not run while the `&&` after it still does, so in `pwd || cd ./src && cat config/active.instance` the `cat` is now judged from both directories and denied.
|
|
143
|
+
- A newline after `&&`, `||` or `|` continues the list, so `pwd |` followed by a `cd` on the next line is refused like any `cd` in a pipeline.
|
|
144
|
+
- `rg` falls back to the guard's own walk when a `.gitignore` holds a line Git and ripgrep may match differently, such as `[[:alpha:]]`, braces, a backslash escape, trailing whitespace, a `**` inside a path component or bytes that are not UTF-8; Git could ignore a file ripgrep then reads.
|
|
145
|
+
- A path or `git -C` directory that leaves a symlink through `..`, such as `cat link/../active.instance`, is no longer judged by its spelling; it is treated like any symlink.
|
|
146
|
+
- `env -C` with `$?`, `cd` or `env -C` with `..` after a directory name, `pushd`, `popd`, zsh's `chdir`, `builtin` and a zsh `=command` word are refused, since the guard cannot see the directory or path they expand to.
|
|
147
|
+
- 7c90129: The guard now authenticates and evaluates in one Node process instead of dispatching a second handler process per tool call, and it asks Git once per checkout instead of repeating identical probes. Run `npx --no cockpit sync` to regenerate `.cockpit/guards/bash-guard.sh`.
|
|
148
|
+
- c78cf3f: `SURFACE_STATE_CONFLICT` on a hand-edited generated file (a skill, `.claude/settings.json`, the text between cockpit's markers in `AGENTS.md`, or the OpenCode root group) carries its own fix: move the edit into `cockpit.toml` or a surface overlay, and ask the person who owns the cockpit before discarding it. A file cockpit has no record of writing gets a fix that asks the person before it is moved or deleted, and a team's own harness settings file names the `sync --adopt` command in the fix rather than in the message.
|
|
149
|
+
- d3d59a8: `init` shows the Compose port and healthcheck findings `check` would report for the drafted `cockpit.toml`, with the exact edit, before the draft is accepted; it still never edits a Compose file.
|
|
150
|
+
- a3d5ba1: `init` inside a product repository now recommends and, under `--accept-preview` or `--accept-defaults`, defaults to an in-repo cockpit instead of refusing.
|
|
151
|
+
- f323d50: A bare `cockpit init` now sets up the current directory for the default tools (Claude Code, Codex CLI and OpenCode). An explicit root and `--target` still choose otherwise.
|
|
152
|
+
- 0d7b90a: `init` no longer proposes values the schema rejects, and say where every inferred port base came from.
|
|
153
|
+
|
|
154
|
+
- Proposed `[testing]` stage and gate ids now lead with their role (`test-api`, `targeted-api`, `full-api`, `affected-api`), so a repository whose directory name starts with a digit gets ids the schema accepts. A name too long to form a 64-character id is reported as a skipped inference instead of being proposed.
|
|
155
|
+
- When `ports.bases` is read from several Compose files, the proposal names each file and the variables it publishes, including the files on both sides of a conflicting default.
|
|
156
|
+
- A Compose file that publishes a literal host port, such as `"8080:80"` or `published: 8080`, is reported as a skipped inference that says to publish it from a variable with a default.
|
|
157
|
+
- 5fda3af: `init` now proposes more of what the product's own files already declare.
|
|
158
|
+
|
|
159
|
+
- A repository with an `origin` remote in `.git/config` is proposed as `acquire = "auto"` with that `remote`, so a teammate's `setup` clones it. A URL that carries credentials is never proposed or shown, and a `.git` file (a worktree or submodule pointer) is not followed; both are reported with the file they came from.
|
|
160
|
+
- A Node lockfile proposes `toolchain = "node"`, and the reason names the `environment.install_policies` row that `setup` then requires.
|
|
161
|
+
- A `start`, `serve` or `dev` script proposes the service command, run by the package manager the lockfile selects, when no Dockerfile sets one.
|
|
162
|
+
- When a sibling's toolchain is left at its default, the reason names the lockfile that was read or the lockfiles that were looked for. It no longer says that nothing was observed.
|
|
163
|
+
- Each runnable-classification reason names its repository's file, so the reasons for several repositories can be told apart.
|
|
164
|
+
- The `environment.machine` question no longer claims that cockpit proposes the floor from the product's files. A person states it, and cockpit never proposes it.
|
|
165
|
+
- 31f3947: `init` no longer strands a cockpit after it writes `cockpit.toml`, and its refusals say what mismatched and how to recover.
|
|
166
|
+
|
|
167
|
+
- Every stop after `cockpit.toml` is written adds `INIT_VERIFICATION_INCOMPLETE`, whose fix says to correct `cockpit.toml` itself and rerun `init --accept-preview <previewSha256>` to finish. `--reset-answer` at that point (`INIT_ANSWER_RESET_UNAVAILABLE`) now names the same recovery, or `sync` once `init` has finished.
|
|
168
|
+
- A plain `sync` run before an interrupted `init` finished adopts the setup skill files `init` published for that cockpit, when they still hold exactly the bytes `init` recorded, instead of refusing them with `SURFACE_STATE_CONFLICT`. When `init` itself cannot take them over, `GENERATED_OWNERSHIP_INVALID` now says why and how to restore them.
|
|
169
|
+
- Remedies that delete a file (`SURFACE_STATE_CONFLICT`, an edited adopted settings file) tell an agent to ask the person who owns the cockpit first. The conflict for a file that already holds what sync would write now says that, instead of "not proof of ownership".
|
|
170
|
+
- A root removed and recreated at the same path no longer resumes the old bootstrap state and fails `GENERATED_OWNERSHIP_INVALID`: when none of the files `init` published, nor `cockpit.toml`, exist, `init` reports `INIT_STATE_RESTARTED` and starts again from the preview.
|
|
171
|
+
- `init` no longer proposes a sibling `remote` that is a local path or other non-https, non-ssh URL, which every `preflight` refused with `GIT_COMPARISON_REMOTE_MISMATCH`; the sibling is proposed with `acquire = "none"` and the reason. A declared remote of that kind now makes `GIT_COMPARISON_REMOTE_MISMATCH` say why it cannot be compared.
|
|
172
|
+
- `DOCUMENT_ESTATE_TOPOLOGY_MISMATCH` names the repositories `init` observed, the declared ones it did not, and the ones the answer omits, and its fix says to add other repositories after `init` with `sibling add`.
|
|
173
|
+
- 354ed7d: `INIT_TARGET_CHANGED` carries a fix: resume the init with the target it was started with, or, after asking the person who owns the machine, delete the named state file that holds only that init's progress and start again with the new target. A plain `sync` that meets a setup file an unfinished init published, which no longer holds what that init recorded, says so and names the `init` command that resumes it.
|
|
174
|
+
- 98bb460: `[[environment.install_policies]]` rows drop `volume`, `install` and `load_probe`. Nothing ran them once cockpit stopped generating the Compose environment, so a row now holds only what takes effect: `toolchain` and `lockfile`, which select the row for a sibling, and the optional `build` and `test` commands the guard allows in that checkout. A configuration that still sets one of the removed fields is refused as an unknown key.
|
|
175
|
+
- eeff55b: An `environment.install_policies` row must declare a `build` command, a `test` command or both. A row with neither admitted nothing and only satisfied setup's lookup for its lockfile.
|
|
176
|
+
- d075210: Work orders are one front-matter contract with a short lifecycle, and `cockpit.toml` says who takes each decision cockpit gates.
|
|
177
|
+
|
|
178
|
+
- A work order is `workorders/<id>.md`. Its YAML front-matter (`id`, `objective`, `scope`, `depends_on`, `gates`, `criteria` with an optional `check` and `source` each, `non_goals`) is the whole contract; the Markdown body is free notes cockpit never reads. One schema validates it and names each field it refuses.
|
|
179
|
+
- The commands are `work status`, `accept` (also accepts a changed contract), `check`, `note` (`--ask` records an open question), `answer`, `grade`, `signoff` (`--partial` or `--abandon` with a note), `recover` and `verify`. An order moves draft, accepted, checked, graded, done; `status` also shows stale, blocked, partial and abandoned. `work grade` reports every change outside `scope`, which fails the grade. `work intake`, `renew`, `resume`, `execute`, `record`, `review`, `sweep`, `reverse`, `programme-mint` and `metrics` are gone, with intent descriptors, source audits, programmes and review lanes.
|
|
180
|
+
- `cockpit grade --criteria <file>` grades uncommitted work against a criteria file with the independent evaluator, and records nothing.
|
|
181
|
+
- `[work]` replaces `[workorders]` and adds `grading`: `independent` (an evaluator grades, the default), `checks` (done only when cockpit ran every criterion's check and all passed) or `self` (the agent reports met or unmet with a note). The record, `work status` and `doctor` say how each order closed. `work.evaluators` is the ordered list of evaluator tools.
|
|
182
|
+
- `[work.gates]` sets who passes `accept`, `amend`, `answer` and `signoff`: `agent`, `person` (the digest typed after `--interactive`, refused as `WORK_PERSON_REQUIRED` without a terminal) or `ci` (counts once the required `work verify` job passes). Removing or rewriting an accepted criterion always needs a person.
|
|
183
|
+
- `[autonomy]` sets who may run a writing `sync`, remove stale generated files, apply `reset --apply` and approve MCP servers, with `preset = "agent"` defaulting every unset field to `agent`. The guard denies an agent's edit of `[work]`, `[work.gates]` or `[autonomy]`, and of `[mcp]` while a person approves servers. A sync that finds a weaker policy than the one it last recorded in `.cockpit/policy.json` writes nothing until a person types its digest (`POLICY_WEAKENING_UNCONFIRMED`).
|
|
184
|
+
- The Claude Code and Codex hooks run `cockpit check` as a session starts, so the agent sees drift and its fix first; Codex runs it once a person trusts the new hook. A stale sibling guide copy names the guide, and its fix is to sync and commit `AGENTS.md` with the guide change.
|
|
185
|
+
- f60e65e: `logs --follow` and large `--tail` reads now return records.
|
|
186
|
+
|
|
187
|
+
- `--follow` is no longer cut off by the ten-second budget of an ordinary read, which made it fail with `EXECUTION_TIMEOUT` and no records. It collects until it is interrupted (exit 130 with the records collected), the container stops, or two hours pass.
|
|
188
|
+
- A read whose output exceeds the 1 MiB limit (64 KiB for stderr) no longer fails with `EXECUTION_STDOUT_LIMIT` and no records. It returns the newest whole records that fit, sets `truncated: true` in the JSON result and warns with `LOGS_TRUNCATED`.
|
|
189
|
+
- 4d97b97: `logs` no longer reports `RUNTIME_UNMEASURED` for failures that have nothing to do with the runtime measurement, and it no longer tells you to run `runtime measure` on a runtime that is already measured.
|
|
190
|
+
|
|
191
|
+
- A failure to read or parse the logs, such as a record that cannot be redacted safely, now reports `EVIDENCE_UNAVAILABLE` and names the cause.
|
|
192
|
+
- When the runtime itself cannot be used, `logs` now reports the actual refusal, including `RUNTIME_UNMEASURED` when the runtime really is unmeasured, instead of `log observation is unavailable`.
|
|
193
|
+
|
|
194
|
+
The `runtime measure` summary names the configuration file you passed instead of always saying `cockpit.toml`.
|
|
195
|
+
- 08cf5b7: An MCP approval now binds the reviewed declaration, not only the server name, and the generated wrapper starts in the right directory under any shell setup.
|
|
196
|
+
|
|
197
|
+
- `[mcp.approved]` maps each server name to the sha256 of its command, arguments, working directory and environment names. A sibling's declaration file is agent-writable, so approving the name alone let a rewritten command start after the next human `sync`. A server whose declaration changed is now generated disabled, and `MCP_NOT_APPROVED` reports the digest to approve once it has been reviewed.
|
|
198
|
+
- The MCP wrapper no longer honours `CDPATH`, which could start the server in another directory and print that path into the JSON-RPC stream, and it resolves a sibling outside the cockpit from the real cockpit directory when the agent was started through a symbolic link.
|
|
199
|
+
|
|
200
|
+
Upgrade: delete `approved = [...]` under `[mcp]`, run `cockpit sync`, review each server it reports as `MCP_NOT_APPROVED`, then add `name = "<sha256>"` under `[mcp.approved]` for each one to enable and run `cockpit sync` again.
|
|
201
|
+
- f855180: `[autonomy] mcp_approve` now defaults to `person`. Under `agent`, `sync` enabled every server a sibling's `derives.mcp_sources` file declared, and that file is one an agent can write, so an agent could have a harness start any command outside the guard. A declared server now stays disabled with `MCP_NOT_APPROVED` until a person records its digest in `[mcp.approved]`, and the guard refuses an agent's edit of `[mcp]` by default. Setting `mcp_approve = "agent"` remains possible; the configuration reference, the safety guide and the block `cockpit init` writes say it lets an agent start processes outside the guard.
|
|
202
|
+
- 5a2bb9f: `runtime measure` no longer removes the running probe of a concurrent measure from another worktree or terminal. It decided whether an earlier measure was still running from directories in its own temporary directory, which agent tools set per session, so a second measure could not see the first and force-removed its probe containers. Probe resources now carry a `dev.b0dea.cockpit.probe-owner` label naming the measuring process, and only resources whose process is gone are removed.
|
|
203
|
+
- b4bb348: On a busy machine, measuring an explicit native hook's cost no longer times out after 10 seconds and reports `native hook cost execution failed: EXECUTION_TIMEOUT`. The measurement now has 60 seconds, so a hook over its `native-hook-ms` cap is reported as one to move to CI.
|
|
204
|
+
- 9b03e49: The launcher now enforces the full Node.js range declared in `engines` and names it in the refusal.
|
|
205
|
+
- 75c1e8e: The guard again counts `npx --no cockpit` as the installed cockpit when the root `package.json` has a `directories` entry that declares no commands. `npm init` writes `directories.doc` in a root holding the `docs/` that `sync` creates, and that made every printed `npx --no cockpit` command prompt (and Codex and OpenCode refuse it) while `./node_modules/.bin/cockpit` was allowed. Only `bin` and `directories.bin` still disqualify npx.
|
|
206
|
+
- cba1ade: The installed guide keeps one table of diagnostic remedies, at the end of `docs/troubleshooting.md`: a code is listed there when every place that raises it gives the same fix, or a troubleshooting section covers it, and every other code's message is its guidance. The CLI reference no longer lists codes under each command, and the per-family remedies in `docs/environment.md` are gone. Moving an existing setup over to cockpit is now a section of `docs/getting-started.md`, and the package no longer ships the reference-page generator.
|
|
207
|
+
- 5eafb68: When `package.json` is not valid JSON, `TEAM_METADATA_UNAVAILABLE` now says where parsing stopped and what shape was expected, the same way the work commands and the browser project check do: `package.json is not valid JSON at line 3, column 1; expected an npm package.json object`. It never quotes the file's contents.
|
|
208
|
+
- fc382fb: The package is published as `@b00dea/cockpit`; install it with `npm install --save-dev @b00dea/cockpit`. The repository stays at github.com/b0dea/cockpit.
|
|
209
|
+
- 2b6edfe: The guard's policy pin no longer lets a shell command past because its executable is spelled as a path or as `node <script>`. `/usr/bin/sed -i … cockpit.toml`, `/bin/cp x cockpit.toml`, `node script.js cockpit.toml`, a path spelled `git`, an `--option=cockpit.toml` operand and a `cockpit session -- …` command that names `cockpit.toml` are now hard denials like `sed -i … cockpit.toml`; only the `--config` operand of a cockpit command is left to the guard's proof that it starts the installed cockpit.
|
|
210
|
+
- 21a2f57: Generated agent surfaces are portable across clones and tolerate the product teams' own edits.
|
|
211
|
+
|
|
212
|
+
- A projected sibling guide is recorded by sibling and by its path inside that sibling, not by an absolute path, file identity or content digest. Editing, checking out or pulling the sibling's guide, or cloning the workspace to another path, no longer makes `check`, `sync` or `down` refuse with `SURFACE_STATE_CONFLICT`; the agent reads the new guide through the same link. A link replaced by a file or pointed elsewhere is still refused.
|
|
213
|
+
- MCP server configs and wrapper scripts no longer contain absolute paths: every harness starts `.cockpit/mcp/<id>.sh` relative to the cockpit root, and the wrapper finds its sibling from its own location, so a clone's `sync` rewrites nothing. Measured with Claude Code 2.1.316, Codex 0.166.0 and OpenCode 1.19.5; start the agent in the cockpit root, as the guard hooks already require.
|
|
214
|
+
- MCP wrappers pass `PATH` and the same non-secret variables product test stages receive, so `npx` and other `#!/usr/bin/env node` servers start.
|
|
215
|
+
- Sibling grants now reach the sibling. Codex resolves a relative `writable_roots` entry from `.codex/`, so the grant is written relative to that directory. OpenCode matches `external_directory` against absolute paths only, so the committed pattern reads the sibling's directory from a machine-local file that `sync` writes under `.cockpit/local/`; OpenCode refuses to start, naming that file, until `sync` has run on the machine.
|
|
216
|
+
- An MCP server missing from `[mcp].approved` is listed in Claude Code's `disabledMcpjsonServers`, because Claude Code ignores `disabled` in `.mcp.json` and offered the server for one-click approval. `sync` and `check` now print `MCP_NOT_APPROVED` for it.
|
|
217
|
+
- A changed core original under an overlay's `replaces.sha256` pin stops `sync` and `check` with `OVERRIDDEN_CORE_CHANGED`, naming the current digest; `sync --dry-run` and `doctor` still preview it.
|
|
218
|
+
- A rules overlay with Rulesync frontmatter (`root: false`, `globs: ["**/*"]`) no longer fails every sync; a rule that narrows itself with `globs` is refused as `SURFACE_RULE_SCOPE_UNSUPPORTED`, because cockpit writes rules overlays into the always-loaded instruction file. A generator failure now leads with the generator's own error.
|
|
219
|
+
- Going over `cockpit.guide_cap` reports `GUIDE_CAP_EXCEEDED` with the measured lines, the harness and the cap, from `sync`, `check` and `preflight`, including when a linked sibling guide grows past it.
|
|
220
|
+
- `preflight` names why it could not read a running stack (for example `GENERATED_ENVIRONMENT_UNAVAILABLE` for a `cockpit.toml` edit that was not synced) instead of a bare `LIFECYCLE_EVIDENCE_INVALID`.
|
|
221
|
+
- `check` tells you to run `sync --interactive` in a terminal for a formerly generated path, since plain `sync` refuses to remove it without a person's approval.
|
|
222
|
+
- The Claude plugin bundle carries the references its `cockpit-setup` skill tells the agent to read.
|
|
223
|
+
- The guide-cost figures rest on the 2026-11-02 instruction-loading measurements and say, for Claude Code, that linked sibling guides are counted even where Claude Code skips them. The capability data marks the Codex and OpenCode instruction measurements as settled, and the Cursor claim now says its instructions reach it only through the root `AGENTS.md`.
|
|
224
|
+
- f416f24: `EXECUTION_PRECONDITION_CHANGED` from `up` and `session` now carries a fix. When `cockpit.toml` or the running stack changes while `up` runs, the refusal says to run `down` and then `up` again.
|
|
225
|
+
- 67cec0a: Product test stages can now run real suites under a build tool.
|
|
226
|
+
|
|
227
|
+
- Each `[testing]` stage takes an optional `timeout_seconds`; the default is far longer than the previous fixed limit. A stage that runs out of time reports that it timed out and names the field to raise.
|
|
228
|
+
- Output past the capture limit no longer makes a stage DEGRADED: cockpit keeps the tail and judges the stage by its exit status. A stage that exits non-zero now reports FAIL instead of DEGRADED.
|
|
229
|
+
- Stages receive `HOME`, `USER`, `LOGNAME`, `TMPDIR`, `LANG`, `LC_ALL`, `LC_CTYPE` and `TZ` from the calling environment, so tools that keep caches under the home directory work. Every other variable is still withheld.
|
|
230
|
+
- 0b40913: `init` now proposes `[testing]` from the product's own test entry points, and a cockpit with no test gate says so instead of pointing agents at a gate that does not exist.
|
|
231
|
+
|
|
232
|
+
- For a runnable product, `init` asks a new `testing` question. It proposes stages and gates from a Bazel workspace, `nx.json`, a `turbo.json` test task, a Makefile `test` target, a `package.json` test script, pytest configuration, `go.mod` or `Cargo.toml`, naming the file each came from. A tool that selects affected tests supplies the targeted gate. Answer `"none"` when the product has no tests yet.
|
|
233
|
+
- With no `[testing]` declared, the generated testing guide tells agents to add a characterization test in the product's existing runner, never to report work as passing, and to ask a person to declare gates.
|
|
234
|
+
- `doctor` warns `TESTING_GATE_UNDECLARED` when a cockpit with a runtime declares no test gate.
|
|
235
|
+
|
|
236
|
+
Upgrade: unattended `init` runs for a runnable product need a `testing` answer in the answers file (a `[testing]` table, or `testing = "none"`).
|
|
237
|
+
- 5cd6fd7: Two warnings about the machine rather than the cockpit now appear only where they apply.
|
|
238
|
+
|
|
239
|
+
- `check` and `doctor` no longer report `CODEX_HOOK_UNTRUSTED` when Codex has never run as this user (no `CODEX_HOME` or `~/.codex`). With no Codex installed, no Codex session can skip the guard hook.
|
|
240
|
+
- `STATE_RECORD_MALFORMED` for state folders that other cockpits, usually earlier versions, left behind is reported once by `doctor` with its cleanup command, and no longer on every `up` and `session`.
|
|
241
|
+
- fca0dcf: Refusals now name their cause the same way everywhere.
|
|
242
|
+
|
|
243
|
+
- A cause cockpit worded itself is shown in full, including where several commands previously reduced it to `Error`.
|
|
244
|
+
- A parser, library or child-process message is no longer copied into a refusal, since it can quote the file or output being read; the refusal names the error class instead, or the line and column for an invalid JSON or TOML file.
|
|
245
|
+
- The `STATE_RECORD_MALFORMED` warning about other cockpits' unreadable state folders now tells the agent to ask the person who owns the machine before deleting them.
|
|
246
|
+
- d79779e: Refusals that come from a caught error now say why. A filesystem or process failure appends its system error, for example `EACCES: permission denied, open '<path>'`. Any other failure appends only its error class, because parser and child-process messages can quote file contents or environment values.
|
|
247
|
+
|
|
248
|
+
- An unparseable `package.json` is reported as `TEAM_METADATA_UNAVAILABLE` with the parse failure. It was previously reported as `COCKPIT_VERSION_MISMATCH` with a missing pin.
|
|
249
|
+
- 52f3020: Refusals no longer repeat a parser's message, which could quote the file's contents. An unparseable `package.json` in team metadata, or a `cockpit.toml` an adoption would leave unparseable, is reported with the line and column where parsing stopped, when the parser gives them. A harness evidence manifest that does not parse is reported with its line, column and expected shape. A state inventory entry that fails for an unexpected reason is reported by its system error or error class only. A `package.json` or `.gitignore` that is not valid UTF-8 is named as such.
|
|
250
|
+
|
|
251
|
+
Refusals that used to drop the filesystem error now name it. This covers a browser screenshot that fails its postcheck, a screenshot artifact root or seeded storage state that cannot be read, and a work grade whose evaluator source or Codex CLI is unavailable.
|
|
252
|
+
- 8d2f923: Several refusals now say what to do in words that work as written:
|
|
253
|
+
|
|
254
|
+
- A failed `setup` clone reports `SETUP_CLONE_FAILED` with the remote, the target directory, git's own error and the siblings already cloned, plus a fix, instead of a bare `EXECUTION_STEP_FAILED`. Any failed execution step now carries a bounded, redacted tail of its stderr in the refusal evidence.
|
|
255
|
+
- `GENERATED_STALE_APPROVAL_REQUIRED` names `sync --interactive` and the digest to type, and a human `sync --dry-run` prints that digest.
|
|
256
|
+
- `runtime measure` with an image that is not local reports `RUNTIME_IMAGE_UNAVAILABLE` and says to pull or build it, instead of telling you to start a runtime that is running.
|
|
257
|
+
- A mistyped `--config` in a cockpit checkout no longer suggests restoring the mistyped path from git; it names the configuration the checkout was synced from.
|
|
258
|
+
- `MACHINE_COLD_START_EXCEEDED` and the machine-floor refusals (`MACHINE_MEMORY_BELOW_FLOOR`, `MACHINE_CPU_BELOW_FLOOR`, `MACHINE_DISK_BELOW_FLOOR`) state the measured value, the declared limit and the field to change.
|
|
259
|
+
- b8ae534: `registry-resolve` now works on a cockpit installed from a tarball packed from source. It validates the registry and adoption file first, records `COCKPIT_SOURCE_REVISION='development'` with a `COCKPIT_REVISION_UNSTAMPED` warning when the package carries no release commit, and refuses only a malformed revision, with a fix. Adoption-file refusals state the expected five-line format, which the adoption guide now documents.
|
|
260
|
+
- 363cb2e: Removed `cockpit.toml` fields that had no effect or could be written only one way. A configuration that still sets one is refused as an unknown key, so delete the line.
|
|
261
|
+
|
|
262
|
+
- `surfaces.harnesses[].features`. `capabilities` must still hold exactly one row for each surface feature.
|
|
263
|
+
- `sibling[].derives.mcp_sources[].format`. Each source is read as a JSON file with an `mcpServers` object, as before.
|
|
264
|
+
- `browser.authentication.states[].source`. Saved sign-in state should still come from seeded users, but cockpit cannot check where it came from.
|
|
265
|
+
|
|
266
|
+
`browser.data.isolated` and `browser.data.reaches_production` stay required. They are your statement about the data the browser uses, and `request_preapproval` is refused unless the data is isolated and does not reach production.
|
|
267
|
+
- 40e1315: A command run with the same option twice now names the repeated option as the diagnostic's target, and every command words the refusal the same way. `init` accepts a repeated `--json`, as every other command already did.
|
|
268
|
+
- 4c782e0: `reset --apply` now decides by the autonomy policy `sync` recorded, as sync and the work commands do: when `cockpit.toml` weakens `[autonomy] reset` (for example from `person` to `agent`) and no person has accepted that weakening at `sync --interactive`, it refuses with `POLICY_WEAKENING_UNCONFIRMED` and resets nothing. It used to read the edited `cockpit.toml` and apply.
|
|
269
|
+
- ac13e35: An applied `reset` now prints what it removed and that the next `up` recreates the volumes and runs `environment.seed` where one is declared; it used to print nothing. `--json` carries the removed targets as `result.targets`.
|
|
270
|
+
- 5da286d: A `reset` preview, or a declined `reset --interactive`, of a stack that is down no longer leaves a claim and port lease behind. The kept claim made every later `up` refuse with `EXECUTION_PRECONDITION_CHANGED` and a "rerun up" fix that repeated the refusal. `down` and `reset` now give back the claim they take on a stopped stack whenever they stop before removing anything, and an `up` refused before it starts a service now restores the port reservation it found instead of keeping its family reserved. If an earlier version already left such a claim, `up` now says to run `down` and then `up`, which clears it.
|
|
271
|
+
- 5025dc5: `environment.resettable_volumes` now names volumes by their Compose key, and a name that matches no declared volume is refused.
|
|
272
|
+
|
|
273
|
+
- `reset` matches each entry against the volume's top-level `volumes:` key in the Compose file within the stack's own Compose project. It previously compared the entry with Docker's volume name, which carries a per-checkout project prefix, so a committed `resettable_volumes = ["data"]` reset nothing.
|
|
274
|
+
- A name no declared volume has is refused instead of skipped: `sync`, `check` and every runtime command, `down` included, refuse with `GENERATED_DECLARATION_INVALID` or `GENERATED_ENVIRONMENT_UNAVAILABLE`, naming the declared keys. An `external` volume is refused too, because Compose does not create it and cockpit cannot label it. A declared volume that does not exist yet, or was already removed, is not an error.
|
|
275
|
+
- A data volume created under an earlier `cockpit.toml` is still reset, together with any of the stack's containers from that configuration that hold it. The preview still binds the exact volume, labels and generation, so a volume replaced before the approval is refused.
|
|
276
|
+
- 4159978: The bundled surface generator is now Rulesync 43.4.2. OpenCode MCP tool switches in `opencode.jsonc`
|
|
277
|
+
now use the names OpenCode itself gives tools, with every character other than a letter, digit,
|
|
278
|
+
`_` or `-` in the server or tool name replaced by `_`. Before, a `disabledTools` entry on a server
|
|
279
|
+
such as `web.search` was written as `web.search_fetch.page`, which OpenCode never matched, so the
|
|
280
|
+
tool stayed enabled. When two switches reduce to the same name, the one that disables now wins.
|
|
281
|
+
`cockpit check` reports the rewritten `opencode.jsonc` as drift until `cockpit sync` runs. The Claude
|
|
282
|
+
Code and Codex CLI surfaces are unchanged.
|
|
283
|
+
- cf02cd3: A test gate that reads the running stack's runtime evidence now captures it. The capture previously refused every time with `EVIDENCE_UNAVAILABLE`.
|
|
284
|
+
|
|
285
|
+
- The stability capture uses its own output limit instead of the larger limit sized for logs, which the capture refused.
|
|
286
|
+
- The content hash follows `/proc/1/exe`, which is a symlink, instead of finding no files and failing.
|
|
287
|
+
- cda8970: `runtime measure` now cleans up after itself and is recorded once per machine.
|
|
288
|
+
|
|
289
|
+
- A measure killed mid-probe left probe containers, a network, a volume and a temporary directory behind. The next `runtime measure` removes this cockpit's own leftovers (matched by label, Compose project and a dead owner), lists what it removed, leaves anything a live measure may own, and refuses to probe when a leftover cannot be removed.
|
|
290
|
+
- Measurements are stored under the per-user state root instead of beside `cockpit.toml`, so every git worktree of a cockpit reuses them. A different runtime, daemon or engine version still matches no row and still needs its own measurement. Existing `.cockpit/local/runtime-measurements.json` records are not read; measure once more.
|
|
291
|
+
- 60db846: A grade answered by the tool running the command now prints a warning naming each tool passed over, its reason and the fix, and a tool absent from PATH is reported as "not on PATH" instead of the last PATH entry tried.
|
|
292
|
+
- b27a80b: Commands run inside a sandbox such as Codex's `workspace-write` now pass where they can and say why where they cannot.
|
|
293
|
+
|
|
294
|
+
- `test-run` no longer reports `DEGRADED` with "repository subject … root is unavailable" inside the sandbox. macOS's `git` warned on stderr because cockpit's Git probes ran without `TMPDIR`; they now pass the temporary directory. When a probe does fail, the reason quotes the command and its first stderr line.
|
|
295
|
+
- `STATE_ROOT_UNAVAILABLE` names the state root, the directory that failed and the error (for example `EPERM`) instead of "requires an absolute usable home directory". A permission failure says to run the command outside the sandbox or let the sandbox write there.
|
|
296
|
+
- `up`, `doctor` and the other lifecycle and health commands forward that refusal instead of reporting `LIFECYCLE_EVIDENCE_INVALID` "state namespace is unavailable" or "doctor observation source is unavailable".
|
|
297
|
+
- 2004442: Every configuration field now carries a one-sentence description, shown as hover text in editors that read `cockpit.schema.json` and as a Meaning column in the configuration reference. The editor schema now requires `observed_on` and `confirmed` evidence on every provenance table, including those under `browser.runner_health_measurement` and `surfaces.adopted`.
|
|
298
|
+
- 4571f68: `work grade` under `[work] grading = "self"` now runs the order's checks and compares its `scope`, as
|
|
299
|
+
`independent` and `checks` already did, and a failed check or a change outside scope fails the grade.
|
|
300
|
+
Before, an agent's own `met` closed an order whose check failed or whose diff reached files the order
|
|
301
|
+
never allowed.
|
|
302
|
+
- f56fb69: `cockpit selftest` no longer asks you to fill probe rows for custom harness cells that it never ran.
|
|
303
|
+
|
|
304
|
+
- `--write-probe-specifications` writes rows for built-in tools only, and warns `SELFTEST_CUSTOM_PROBE_UNSUPPORTED` for each custom harness cell it left out, naming the cell and why. Before, it wrote a `{node}` row for each custom cell, and `selftest` recorded that cell `human_needed` whatever you put in the row.
|
|
305
|
+
- `selftest` records each custom cell `human_needed` with `enforcement_probe_required` without a row, and refuses a probe-specification file with a custom row, naming each one.
|
|
306
|
+
- What breaks: a filled probe-specification file that has custom rows is refused. Delete those rows, or write a new file.
|
|
307
|
+
- 1d69b51: `cockpit selftest` probes now reach a signed-in tool's sign-in.
|
|
308
|
+
|
|
309
|
+
- Each probe inherits `PATH`, `HOME`, `USER`, `LOGNAME`, `TMPDIR`, `LANG`, `LC_ALL`, `LC_CTYPE` and `TZ` and nothing else. Before, it ran with an empty environment, so Claude Code, Codex and OpenCode answered "not logged in" and every cell came back `human_needed` with `authentication_required`.
|
|
310
|
+
- Tokens and every other variable still stay out of the probe, so a tool signed in only through an environment variable still reports `authentication_required`.
|
|
311
|
+
- 4afca91: Rewriting the `cockpit selftest` probe-specification file after a config change keeps the probes you wrote.
|
|
312
|
+
|
|
313
|
+
- `selftest --write-probe-specifications <new file> --probe-specifications <earlier file>` copies each complete row from the earlier file whose cell still exists, and reports how many it kept. Rows for new or changed cells, and rows still partly `null`, start over. Before, the only way forward from a stale file was a new file with every row reset to `null`.
|
|
314
|
+
- The refusal for a stale file now names that command.
|
|
315
|
+
- 284369d: `cockpit selftest` can now be run: `selftest --config <path> --write-probe-specifications <new file>` writes the probe-specification file it needs for the current `cockpit.toml` and generated manifest.
|
|
316
|
+
|
|
317
|
+
- The file has one row per cell that needs evidence. cockpit fills what the generated manifest decides, plus the `--version` and `--help` identity commands, and leaves `invocation`, `candidateCode`, `brokenCode` and skill `sample.features` as `null` for you to write. The command prints where each value came from.
|
|
318
|
+
- The file no longer carries `specificationsSha256`, so you can edit the rows; approving the whole file's SHA-256 at the `--interactive` prompt is what binds them.
|
|
319
|
+
- `selftest` refuses a file that still has a `null` and lists the rows. A missing, malformed or stale file is refused with a fix naming the command that writes a new one.
|
|
320
|
+
- fb4b328: A hold that `up` re-adds inside a `cockpit session`, after a `sleep` there released it, is now tied to the session wrapper's process. Previously it recorded no process, so a wrapper killed afterwards left a hold that no later command released. The wrapper passes its process ID and start time in `COCKPIT_SESSION_PROCESS`; `up` checks that process again and refuses with `CLI_USAGE_INVALID` when the wrapper has ended.
|
|
321
|
+
- b07421c: A `cockpit session` hold now survives a wall-clock step on Linux, and a hold whose start could not be read is released once its process is gone.
|
|
322
|
+
|
|
323
|
+
- On Linux a session is identified by its start in clock ticks since boot, read from `/proc`, instead of the wall-clock start `ps` derives from the boot time. An NTP correction or a resumed VM no longer makes a running session read as gone, so another session's `down` or `reset` can no longer stop its stack, and an `up` inside the session is no longer refused.
|
|
324
|
+
- A session whose start could not be read (no `ps` or `/proc` access) recorded a hold that was never released after a SIGKILL. It is now released once its process ID is gone.
|
|
325
|
+
- eb37dd7: `setup` now refuses with `SETUP_REMOTE_UNRESOLVABLE` when a sibling's declared remote, or an existing checkout's origin, is a relative local path that cannot be resolved (for example it passes through a regular file, loops through symlinks, or is unreadable). The message names the remote and the error code. Previously the error escaped, setup's lifecycle record stayed `started`, and `doctor` and `preflight` lost the cause.
|
|
326
|
+
|
|
327
|
+
`doctor` and `preflight` now include the underlying error when they cannot issue their observation source.
|
|
328
|
+
- e8d3bc8: `setup` now clones a sibling whose `remote` is a relative local path and passes its own check afterwards.
|
|
329
|
+
|
|
330
|
+
- A relative local `remote` resolves against the siblings root before cloning and before it is compared with the checkout's `origin`. Previously Git recorded the absolute path and `setup` failed with `SETUP_REMOTE_MISMATCH`.
|
|
331
|
+
- URL and `host:path` remotes are unchanged.
|
|
332
|
+
- 298f896: `init` now publishes the pre-interview setup skill for every tool in `[surfaces] tools`, not only the first.
|
|
333
|
+
- 729103b: The shipped skills now walk an agent through numbered steps that each end on a check, and handle the cases the CLI really reaches: a guard prompt that Codex and OpenCode turn into a denial, a guard that holds every call after `cockpit.toml` changes or cockpit is reinstalled, Codex's sandbox, a resumed or refused `init`, readiness gaps, a missing evaluator, stale and blocked work orders, person gates, and a stack that will not start. Corrected claims: `tool add --dry-run`, `sibling add` and `setup --write-*` are commands the guard asks about; a removed tool's files are deleted by `sync` as `[autonomy] stale_delete` allows, with a digest only when it refuses; after a manual `npm install` of a new release, a person runs `sync` in a terminal; `--instruction-pointer` opts a sibling in before `setup` shows the block. Every procedure invokes cockpit through `./node_modules/.bin/cockpit`, which runs where the guard cannot prove `npx`.
|
|
334
|
+
- a3b580f: `sync` now copies each active sibling's guides into cockpit's region of the root `AGENTS.md`, under a heading naming the sibling, instead of linking them through `.sibling-*` symlinks, `CLAUDE.local.md` imports, a "read this file" line for Codex and the `opencode.jsonc` `instructions` list. Measured on 2026-11-03, the copy is the one route Claude Code, Codex and OpenCode all load: Claude Code skipped the linked guide in a workspace it had not trusted and Codex only ever saw the line pointing at it. The capability matrix records the runs.
|
|
335
|
+
|
|
336
|
+
A copy goes stale when a sibling edits its guide: `check` and `preflight` then report `GENERATED_ARTIFACT_DRIFT` naming each out-of-date `<sibling>/<guide>` until a person runs `sync` and commits `AGENTS.md`, so a guide edit reaches later agent sessions only after review. `GUIDE_CAP_EXCEEDED` now also fires when cockpit's region of `AGENTS.md` passes 32768 bytes, past which Codex silently drops the rest. A guide containing cockpit's own instruction region markers is refused.
|
|
337
|
+
- b106b94: `doctor` and `init` now warn when a sibling repository's root instruction files leave some agent tool without its instructions: Codex and OpenCode load `AGENTS.md`, Claude Code loads `CLAUDE.md`, and files such as `.cursorrules` or `GEMINI.md` reach none of them. The warnings are `SIBLING_INSTRUCTIONS_AGENTS_ONLY`, `SIBLING_INSTRUCTIONS_CLAUDE_ONLY`, `SIBLING_INSTRUCTIONS_UNLINKED`, `SIBLING_INSTRUCTIONS_MISSING` and `SIBLING_INSTRUCTIONS_TOOL_ONLY`, grouped under the `sibling-instructions` readiness gap.
|
|
338
|
+
|
|
339
|
+
`setup` proposes the two fixes that need no judgement and makes them only with the new `--write-instruction-files` flag, which a person runs after reviewing them: a sibling with only `AGENTS.md` gets a `CLAUDE.md` reading `@AGENTS.md`, and a sibling whose lone `CLAUDE.md` imports nothing else has it moved byte for byte into `AGENTS.md` and replaced by that import. The shipped setup procedure walks an agent through the cases that need a person.
|
|
340
|
+
- ca95dd5: `test-run` judges a stage by its exit status alone. A stage that exits 0 having printed nothing, such as `tsc --noEmit`, `node --check` or a quiet linter, now passes instead of reporting DEGRADED, so it can satisfy a gate. A run blocked by a stopped stack names only the stack, and the `TEST_GATE_UNSATISFIED` fix says what to do for each verdict: fix the product for FAIL, start the stack, make the stage command runnable, raise its timeout or declare its `select` arguments for DEGRADED, rerun VOID once the checkouts stop changing, and run the complete gate for PARTIAL.
|
|
341
|
+
- 851c21c: Each shipped skill now installs only its own procedure (`procedures/setup.md`, `explain.md`, `fix.md` or `work.md`) instead of a full copy of one shared procedure, so a tool's skills directory holds about a third of the lines it did. Bootstrap, secret handling and the other setup steps live in the setup procedure, which the explain and fix procedures point to. The setup procedure gains *Add or remove an agent tool*. The capability matrix says which tools are written by default and which only when listed.
|
|
342
|
+
- 9cd2f06: The shipped skills name the shell tool only of the harnesses in `[surfaces] tools`, so a single-tool cockpit no longer mentions the others.
|
|
343
|
+
- 202c58f: Running stacks recover from the states that used to wedge them.
|
|
344
|
+
|
|
345
|
+
- A `cockpit session` killed without its closing `sleep` no longer holds the stack forever: the session records its process ID and start time, and the next `up`, `sleep`, `down` or `reset` releases a hold whose process is gone. `CLAIM_CO_TENANT` names each remaining holder and its process.
|
|
346
|
+
- `cold_start_seconds` is honoured up to 3600 seconds instead of being cut to five minutes; a larger value is refused by the configuration.
|
|
347
|
+
- Editing the machine floor, postures, `resettable_volumes` or entrypoint derivatives no longer forces a `down`, and a second `up` after the first reports `unchanged` instead of a fresh start.
|
|
348
|
+
- A declaration change on a fully started compose-first stack makes `up` refuse with `LIFECYCLE_PROGRESS_INVALID` instead of recreating its healthy containers.
|
|
349
|
+
- Plain `reset` prints its preview, and the recovery messages for a killed service and an ended session say what to run.
|
|
350
|
+
- d08215c: `sync`, `check` and `up` no longer fail with "surface staging cleanup did not complete" when the temporary directory is reached through a symbolic link (macOS with `TMPDIR` unset or set to `/tmp`), and no longer leave `cockpit-surfaces-*` directories behind.
|
|
351
|
+
- 0001be9: When a state operation fails and its lock then cannot be released, the `STATE_LOCKED` refusal names the operation's error by its class (or by its system error) instead of repeating its message, which could quote the input being parsed.
|
|
352
|
+
- f3b2ab4: `sync` re-reads the Compose files named in `environment.compose_files` before it publishes `compose.cockpit.yml`, and refuses with `GENERATED_SOURCE_CHANGED` when one changed after the override was rendered, instead of publishing an override rendered from the old file.
|
|
353
|
+
- 6c71ac4: `[surfaces] tools` in cockpit.toml lists the agent tools `sync` writes and `check` compares. It defaults to Claude Code, Codex and OpenCode, the tools whose guard is measured; Cursor and Grok Build are written only when listed. A list names at least one of the guarded tools.
|
|
354
|
+
|
|
355
|
+
- `npx --no cockpit tool add <tool> --config cockpit.toml` and `tool remove` edit that list (with `--dry-run` to preview). The next sync writes an added tool's files; a removed tool's files go through the stale-removal approval.
|
|
356
|
+
- Doctor and check report Codex hook trust only when Codex is listed, and sibling instruction findings name only layouts that leave a listed tool without instructions.
|
|
357
|
+
- `init --target` takes one tool or a comma-separated list (`--target claudecode,opencode`) and writes it as `[surfaces] tools`; the first tool gets the setup skill before the interview, and the final sync writes every chosen tool. Readiness reports Codex hook trust only for a cockpit that lists Codex.
|
|
358
|
+
- `workorders.evaluators`, left unset, is the listed tools that can evaluate, in their order, so a cockpit that lists only Claude Code grades with Claude Code and doctor does not ask for Codex.
|
|
359
|
+
- 5384b25: `SURFACE_GENERATOR_TRUST_WARNING` appears only when `sync` writes `.claude/settings.json`, not on every sync and `check`, and it names what the file grants: the additional directories, the approved MCP servers, and the number of command patterns in `permissions.allow`. An empty server list grants nothing and is no longer reported.
|
|
360
|
+
- f240ec6: Git or state read failures no longer leave a check silently clean.
|
|
361
|
+
|
|
362
|
+
- A repository Git refuses to read, such as one owned by another user (`safe.directory`), is reported as unchecked with the command a person may run to trust it, instead of as committing no secret files or as no Git working tree.
|
|
363
|
+
- `doctor` says when it could not read the machine's cockpit state, instead of silently dropping its check for other cockpits' unreadable state.
|
|
364
|
+
- The Codex hook trust warning names why `config.toml` could not be read, such as a file over the size bound, instead of "unknown error".
|
|
365
|
+
- 19c36c4: `cockpit upgrade [<version>] [--dry-run] --config <path>` moves the exact pin in one command: it resolves the latest published release (or the version you name), installs it as an exact dev dependency with the package manager the cockpit root's single lockfile names (npm, pnpm or yarn), runs `sync` in a new process so the new version renders, and prints the `Upgrade:` lines from the installed changelog between the two versions. It refuses with a named code when the registry is unreachable, the version is invalid, the target is not newer than the installed version, or the lockfile is missing or ambiguous. `--dry-run` prints the install and sync commands without running them. An agent may run `upgrade` exactly where `[autonomy] sync` lets it run a writing `sync`, and its sync child decides stale removals by `[autonomy] stale_delete`; `--dry-run` writes nothing and is never gated, for `upgrade` and `sync` alike.
|
|
366
|
+
- f70c223: `check` now warns with `COMPOSE_PORT_ALL_INTERFACES` when a Compose file publishes a port without a host interface, which Docker binds on every interface. Writing `127.0.0.1` (or `0.0.0.0`, when the exposure is intended) silences it. The extended example now binds loopback, and the example READMEs reach the stack through its leased port variable instead of a fixed port.
|
|
367
|
+
- bab0317: The `work` and `browser` commands are no longer marked experimental in `--help`, the CLI reference and the README. Work orders still require the Codex CLI, on `PATH` and signed in, for the independent reviews and grading.
|
|
368
|
+
- 7fcda72: Work-order and browser commands are subcommands, and `cockpit --help` is grouped by stage.
|
|
369
|
+
|
|
370
|
+
- The work-order commands are `cockpit work <subcommand>` (`work status`, `work accept`, `work check`, `work note`, `work answer`, `work grade`, `work signoff`, `work recover`, `work verify`), and the browser commands are `cockpit browser <subcommand>` (`browser drive`, `browser screenshot`, `browser debugger`). Options are unchanged. A hyphenated spelling such as `work-grade` is refused with `CLI_UNKNOWN_COMMAND`, which names the spelling that runs.
|
|
371
|
+
- `cockpit --help` lists the commands under Set up, Generate and verify, Run the stack, Diagnose, and Test and grade, with `work` and `browser` as one entry each; `cockpit work --help` and `cockpit browser --help` list their subcommands. A group run without a subcommand is refused with `CLI_COMMAND_REQUIRED`, which lists them.
|
|
372
|
+
|
|
373
|
+
## 0.0.0
|
|
374
|
+
|
|
375
|
+
The development version. It was never published.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 b0dea
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center"><img src="https://raw.githubusercontent.com/b0dea/cockpit/main/.github/assets/cockpit-logo.png" alt="" width="128"></p>
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
# @b00dea/cockpit
|
|
4
|
+
|
|
5
|
+
This package is the cockpit CLI: where coding agents work on your whole product. From one reviewed
|
|
6
|
+
`cockpit.toml` it gives Claude Code, Codex CLI and OpenCode the same instructions, skills and guard
|
|
7
|
+
hook across every repository of the product, runs the product's own Compose stack on the live
|
|
8
|
+
checkouts with a port lease per checkout, checks work orders against criteria you set, and fails a
|
|
9
|
+
check when any generated file drifts. What each tool actually enforces is in the
|
|
10
|
+
[capability matrix](https://github.com/b0dea/cockpit/blob/main/docs/capability-matrix.md).
|
|
11
|
+
|
|
12
|
+
Install it as an exact, project-local dev dependency (the package is pre-alpha, so pin the version):
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
npm install --save-dev --save-exact @b00dea/cockpit
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Start with the [repository README](https://github.com/b0dea/cockpit#readme) and
|
|
19
|
+
[Getting started](https://github.com/b0dea/cockpit/blob/main/docs/getting-started.md#install-cockpit).
|
|
20
|
+
|
|
21
|
+
The `cockpit` command is the only public interface; the package's exports and type declarations
|
|
22
|
+
serve cockpit's own tooling and are not a stable API. Supported Node.js versions are in `engines`
|
|
23
|
+
in this package's `package.json`.
|
package/bin/cockpit.mjs
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Mirrors package.json "engines.node"; the floor is the 22.x minor, not just the major.
|
|
4
|
+
const supportedRange = '^22.22.0 || ^24.0.0 || ^26.0.0'
|
|
5
|
+
const minimumNode22Minor = 22
|
|
6
|
+
const version = process.versions.node
|
|
7
|
+
const match = typeof version === 'string' && /^([0-9]+)\.([0-9]+)\.[0-9]+(?:[-+].*)?$/.exec(version)
|
|
8
|
+
const major = match ? Number(match[1]) : Number.NaN
|
|
9
|
+
const minor = match ? Number(match[2]) : Number.NaN
|
|
10
|
+
|
|
11
|
+
if (!Number.isInteger(major) || major < 22 || (major === 22 && minor < minimumNode22Minor)) {
|
|
12
|
+
console.error(
|
|
13
|
+
`COCKPIT_NODE_VERSION_UNSUPPORTED: Node.js ${supportedRange} is required; this is ${version}.`,
|
|
14
|
+
)
|
|
15
|
+
process.exitCode = 1
|
|
16
|
+
} else {
|
|
17
|
+
const { runCli } = await import('../dist/cli.js')
|
|
18
|
+
const argv = process.argv.slice(2)
|
|
19
|
+
if (argv[0] !== 'session' && argv[0] !== 'logs') {
|
|
20
|
+
process.exitCode = await runCli(argv)
|
|
21
|
+
} else {
|
|
22
|
+
const controller = new AbortController()
|
|
23
|
+
const abort = () => controller.abort()
|
|
24
|
+
process.once('SIGINT', abort)
|
|
25
|
+
process.once('SIGTERM', abort)
|
|
26
|
+
try {
|
|
27
|
+
process.exitCode = await runCli(argv, process, {}, { signal: controller.signal })
|
|
28
|
+
} finally {
|
|
29
|
+
process.removeListener('SIGINT', abort)
|
|
30
|
+
process.removeListener('SIGTERM', abort)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|