@lannguyensi/harness 0.63.0 → 1.0.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 +90 -0
- package/README.md +46 -42
- package/dist/cli/add/index.js +17 -21
- package/dist/cli/add/index.js.map +1 -1
- package/dist/cli/adopt/derive.d.ts +2 -2
- package/dist/cli/adopt/derive.js +2 -19
- package/dist/cli/adopt/derive.js.map +1 -1
- package/dist/cli/adopt/index.d.ts +1 -1
- package/dist/cli/adopt/index.js +1 -12
- package/dist/cli/adopt/index.js.map +1 -1
- package/dist/cli/apply/apply.d.ts +20 -35
- package/dist/cli/apply/apply.js +61 -136
- package/dist/cli/apply/apply.js.map +1 -1
- package/dist/cli/apply/generate-codex-config.js +10 -58
- package/dist/cli/apply/generate-codex-config.js.map +1 -1
- package/dist/cli/apply/generate-memory-index.js +1 -2
- package/dist/cli/apply/generate-memory-index.js.map +1 -1
- package/dist/cli/apply/generate-opencode-config.d.ts +2 -10
- package/dist/cli/apply/generate-opencode-config.js +74 -113
- package/dist/cli/apply/generate-opencode-config.js.map +1 -1
- package/dist/cli/apply/generate-settings.d.ts +11 -64
- package/dist/cli/apply/generate-settings.js +27 -132
- package/dist/cli/apply/generate-settings.js.map +1 -1
- package/dist/cli/apply/index.d.ts +1 -1
- package/dist/cli/apply/index.js +1 -1
- package/dist/cli/apply/index.js.map +1 -1
- package/dist/cli/apply/install-codex-config.d.ts +153 -1
- package/dist/cli/apply/install-codex-config.js +445 -70
- package/dist/cli/apply/install-codex-config.js.map +1 -1
- package/dist/cli/apply/next-steps.d.ts +7 -0
- package/dist/cli/apply/next-steps.js +13 -1
- package/dist/cli/apply/next-steps.js.map +1 -1
- package/dist/cli/bounded-stdin.d.ts +0 -23
- package/dist/cli/bounded-stdin.js +2 -49
- package/dist/cli/bounded-stdin.js.map +1 -1
- package/dist/cli/describe.d.ts +1 -1
- package/dist/cli/describe.js +0 -3
- package/dist/cli/describe.js.map +1 -1
- package/dist/cli/diff/engine.d.ts +0 -11
- package/dist/cli/diff/engine.js +1 -17
- package/dist/cli/diff/engine.js.map +1 -1
- package/dist/cli/diff/index.js +14 -25
- package/dist/cli/diff/index.js.map +1 -1
- package/dist/cli/doctor/claude-mcp.d.ts +4 -19
- package/dist/cli/doctor/claude-mcp.js +11 -22
- package/dist/cli/doctor/claude-mcp.js.map +1 -1
- package/dist/cli/doctor/codex.d.ts +12 -14
- package/dist/cli/doctor/codex.js +31 -144
- package/dist/cli/doctor/codex.js.map +1 -1
- package/dist/cli/doctor/format.js +23 -338
- package/dist/cli/doctor/format.js.map +1 -1
- package/dist/cli/doctor/hook-liveness.d.ts +56 -0
- package/dist/cli/doctor/hook-liveness.js +455 -0
- package/dist/cli/doctor/hook-liveness.js.map +1 -0
- package/dist/cli/doctor/index.d.ts +13 -87
- package/dist/cli/doctor/index.js +57 -705
- package/dist/cli/doctor/index.js.map +1 -1
- package/dist/cli/doctor/opencode.d.ts +2 -1
- package/dist/cli/doctor/opencode.js.map +1 -1
- package/dist/cli/doctor/types.d.ts +21 -378
- package/dist/cli/doctor/types.js.map +1 -1
- package/dist/cli/drain-stdio.d.ts +31 -0
- package/dist/cli/drain-stdio.js +76 -0
- package/dist/cli/drain-stdio.js.map +1 -0
- package/dist/cli/export.d.ts +3 -1
- package/dist/cli/export.js +7 -16
- package/dist/cli/export.js.map +1 -1
- package/dist/cli/gate/codex-disable.d.ts +29 -0
- package/dist/cli/gate/codex-disable.js +195 -0
- package/dist/cli/gate/codex-disable.js.map +1 -0
- package/dist/cli/gate/codex-enable.d.ts +41 -0
- package/dist/cli/gate/codex-enable.js +127 -0
- package/dist/cli/gate/codex-enable.js.map +1 -0
- package/dist/cli/gate/codex-snapshot.d.ts +208 -0
- package/dist/cli/gate/codex-snapshot.js +402 -0
- package/dist/cli/gate/codex-snapshot.js.map +1 -0
- package/dist/cli/gate/disable.d.ts +9 -0
- package/dist/cli/gate/disable.js +263 -28
- package/dist/cli/gate/disable.js.map +1 -1
- package/dist/cli/gate/enable.d.ts +26 -6
- package/dist/cli/gate/enable.js +152 -80
- package/dist/cli/gate/enable.js.map +1 -1
- package/dist/cli/gate/link-chain.d.ts +53 -0
- package/dist/cli/gate/link-chain.js +122 -0
- package/dist/cli/gate/link-chain.js.map +1 -0
- package/dist/cli/gate/snapshot.d.ts +289 -12
- package/dist/cli/gate/snapshot.js +481 -22
- package/dist/cli/gate/snapshot.js.map +1 -1
- package/dist/cli/index.d.ts +0 -9
- package/dist/cli/index.js +15 -2607
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/composer.d.ts +3 -6
- package/dist/cli/init/composer.js +6 -370
- package/dist/cli/init/composer.js.map +1 -1
- package/dist/cli/init/dependencies.d.ts +1 -2
- package/dist/cli/init/dependencies.js +4 -80
- package/dist/cli/init/dependencies.js.map +1 -1
- package/dist/cli/init/detect.js +5 -4
- package/dist/cli/init/detect.js.map +1 -1
- package/dist/cli/init/interactive.d.ts +1 -23
- package/dist/cli/init/interactive.js +33 -247
- package/dist/cli/init/interactive.js.map +1 -1
- package/dist/cli/init/profiles.d.ts +2 -2
- package/dist/cli/init/profiles.js +51 -243
- package/dist/cli/init/profiles.js.map +1 -1
- package/dist/cli/init/templates.d.ts +2 -37
- package/dist/cli/init/templates.js +25 -1237
- package/dist/cli/init/templates.js.map +1 -1
- package/dist/cli/list.d.ts +1 -1
- package/dist/cli/list.js +1 -38
- package/dist/cli/list.js.map +1 -1
- package/dist/cli/loader.d.ts +15 -1
- package/dist/cli/loader.js +56 -39
- package/dist/cli/loader.js.map +1 -1
- package/dist/cli/main.js +7 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/migrate-home/index.js +2 -2
- package/dist/cli/migrate-home/index.js.map +1 -1
- package/dist/cli/pack/add.js +1 -1
- package/dist/cli/pack/add.js.map +1 -1
- package/dist/cli/pack/hook-bootstrap.d.ts +5 -164
- package/dist/cli/pack/hook-bootstrap.js +15 -291
- package/dist/cli/pack/hook-bootstrap.js.map +1 -1
- package/dist/cli/pack/hook-branch-protection.d.ts +28 -21
- package/dist/cli/pack/hook-branch-protection.js +365 -340
- package/dist/cli/pack/hook-branch-protection.js.map +1 -1
- package/dist/cli/pack/index.d.ts +0 -1
- package/dist/cli/pack/index.js +0 -1
- package/dist/cli/pack/index.js.map +1 -1
- package/dist/cli/pack/list.js +1 -6
- package/dist/cli/pack/list.js.map +1 -1
- package/dist/cli/pack/mutate.d.ts +7 -9
- package/dist/cli/pack/mutate.js +6 -9
- package/dist/cli/pack/mutate.js.map +1 -1
- package/dist/cli/pack/reseed.d.ts +2 -2
- package/dist/cli/pack/reseed.js +16 -22
- package/dist/cli/pack/reseed.js.map +1 -1
- package/dist/cli/register-gate-group.d.ts +5 -0
- package/dist/cli/register-gate-group.js +348 -0
- package/dist/cli/register-gate-group.js.map +1 -0
- package/dist/cli/register-inspect-group.d.ts +6 -0
- package/dist/cli/register-inspect-group.js +189 -0
- package/dist/cli/register-inspect-group.js.map +1 -0
- package/dist/cli/register-operator-lifecycle.d.ts +5 -0
- package/dist/cli/register-operator-lifecycle.js +20 -0
- package/dist/cli/register-operator-lifecycle.js.map +1 -0
- package/dist/cli/register-pack-group.d.ts +5 -0
- package/dist/cli/register-pack-group.js +134 -0
- package/dist/cli/register-pack-group.js.map +1 -0
- package/dist/cli/register-setup-group.d.ts +5 -0
- package/dist/cli/register-setup-group.js +495 -0
- package/dist/cli/register-setup-group.js.map +1 -0
- package/dist/cli/remove/index.d.ts +0 -14
- package/dist/cli/remove/index.js +2 -115
- package/dist/cli/remove/index.js.map +1 -1
- package/dist/cli/remove/mutate.d.ts +0 -2
- package/dist/cli/remove/mutate.js +1 -19
- package/dist/cli/remove/mutate.js.map +1 -1
- package/dist/cli/remove/register.d.ts +5 -0
- package/dist/cli/remove/register.js +25 -0
- package/dist/cli/remove/register.js.map +1 -0
- package/dist/cli/shell-quote.d.ts +7 -0
- package/dist/cli/shell-quote.js +17 -0
- package/dist/cli/shell-quote.js.map +1 -0
- package/dist/cli/uninstall/index.d.ts +4 -2
- package/dist/cli/uninstall/index.js +15 -7
- package/dist/cli/uninstall/index.js.map +1 -1
- package/dist/cli/uninstall/register.d.ts +5 -0
- package/dist/cli/uninstall/register.js +171 -0
- package/dist/cli/uninstall/register.js.map +1 -0
- package/dist/cli/uninstall/snapshot.d.ts +15 -0
- package/dist/cli/uninstall/snapshot.js +38 -0
- package/dist/cli/uninstall/snapshot.js.map +1 -1
- package/dist/cli/validate/checks.d.ts +0 -77
- package/dist/cli/validate/checks.js +3 -1049
- package/dist/cli/validate/checks.js.map +1 -1
- package/dist/cli/validate/index.js +19 -15
- package/dist/cli/validate/index.js.map +1 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.js +0 -3
- package/dist/index.js.map +1 -1
- package/dist/io/claude-mcp.d.ts +1 -1
- package/dist/io/claude-mcp.js +27 -14
- package/dist/io/claude-mcp.js.map +1 -1
- package/dist/io/harness-lock.js +2 -2
- package/dist/io/harness-lock.js.map +1 -1
- package/dist/io/lock.d.ts +0 -26
- package/dist/io/lock.js +10 -27
- package/dist/io/lock.js.map +1 -1
- package/dist/io/merge-settings.js +6 -4
- package/dist/io/merge-settings.js.map +1 -1
- package/dist/io/project-name.d.ts +22 -39
- package/dist/io/project-name.js +25 -42
- package/dist/io/project-name.js.map +1 -1
- package/dist/io/read-regular-file.d.ts +103 -40
- package/dist/io/read-regular-file.js +196 -35
- package/dist/io/read-regular-file.js.map +1 -1
- package/dist/io/restart-hints.js +3 -6
- package/dist/io/restart-hints.js.map +1 -1
- package/dist/io/version-compare.d.ts +1 -3
- package/dist/io/version-compare.js +1 -3
- package/dist/io/version-compare.js.map +1 -1
- package/dist/io/write-regular-file.d.ts +30 -0
- package/dist/io/write-regular-file.js +85 -0
- package/dist/io/write-regular-file.js.map +1 -0
- package/dist/overrides/index.d.ts +1 -0
- package/dist/overrides/index.js +1 -0
- package/dist/overrides/index.js.map +1 -1
- package/dist/overrides/merge-layers.d.ts +43 -0
- package/dist/overrides/merge-layers.js +76 -0
- package/dist/overrides/merge-layers.js.map +1 -0
- package/dist/overrides/merge.d.ts +16 -0
- package/dist/overrides/merge.js +21 -8
- package/dist/overrides/merge.js.map +1 -1
- package/dist/policy-packs/builtin/branch-protection-runtime.d.ts +4 -69
- package/dist/policy-packs/builtin/branch-protection-runtime.js +12 -84
- package/dist/policy-packs/builtin/branch-protection-runtime.js.map +1 -1
- package/dist/policy-packs/builtin/branch-protection.d.ts +7 -30
- package/dist/policy-packs/builtin/branch-protection.js +56 -89
- package/dist/policy-packs/builtin/branch-protection.js.map +1 -1
- package/dist/policy-packs/config-check.d.ts +7 -5
- package/dist/policy-packs/config-check.js +2 -2
- package/dist/policy-packs/config-check.js.map +1 -1
- package/dist/policy-packs/expand.d.ts +1 -3
- package/dist/policy-packs/expand.js +5 -42
- package/dist/policy-packs/expand.js.map +1 -1
- package/dist/policy-packs/index.d.ts +3 -3
- package/dist/policy-packs/index.js +2 -2
- package/dist/policy-packs/index.js.map +1 -1
- package/dist/policy-packs/registry.d.ts +9 -38
- package/dist/policy-packs/registry.js +5 -65
- package/dist/policy-packs/registry.js.map +1 -1
- package/dist/policy-packs/runtime.d.ts +0 -4
- package/dist/policy-packs/runtime.js +9 -22
- package/dist/policy-packs/runtime.js.map +1 -1
- package/dist/policy-packs/types.d.ts +0 -19
- package/dist/policy-packs/ux-compare.d.ts +1 -11
- package/dist/policy-packs/ux-compare.js +6 -42
- package/dist/policy-packs/ux-compare.js.map +1 -1
- package/dist/policy-packs/ux-drift-check.d.ts +5 -5
- package/dist/policy-packs/ux-drift-check.js +17 -22
- package/dist/policy-packs/ux-drift-check.js.map +1 -1
- package/dist/policy-packs/version-check.d.ts +5 -26
- package/dist/policy-packs/version-check.js +19 -74
- package/dist/policy-packs/version-check.js.map +1 -1
- package/dist/probes/memory.d.ts +1 -1
- package/dist/probes/memory.js +1 -1
- package/dist/probes/memory.js.map +1 -1
- package/dist/runtime/agent-facing.d.ts +9 -0
- package/dist/runtime/agent-facing.js +28 -14
- package/dist/runtime/agent-facing.js.map +1 -1
- package/dist/runtime/bounded-text.d.ts +15 -0
- package/dist/runtime/bounded-text.js +27 -0
- package/dist/runtime/bounded-text.js.map +1 -0
- package/dist/runtime/git-branch.d.ts +125 -0
- package/dist/runtime/git-branch.js +381 -0
- package/dist/runtime/git-branch.js.map +1 -0
- package/dist/runtime/hermetic-spawn-guard.d.ts +2 -2
- package/dist/runtime/hermetic-spawn-guard.js +24 -34
- package/dist/runtime/hermetic-spawn-guard.js.map +1 -1
- package/dist/runtime/home-dir.js +3 -2
- package/dist/runtime/home-dir.js.map +1 -1
- package/dist/runtime/tool-name-aliases.d.ts +0 -6
- package/dist/runtime/tool-name-aliases.js +5 -18
- package/dist/runtime/tool-name-aliases.js.map +1 -1
- package/dist/schema/grounding.d.ts +7 -54
- package/dist/schema/grounding.js +10 -12
- package/dist/schema/grounding.js.map +1 -1
- package/dist/schema/hooks.d.ts +39 -136
- package/dist/schema/hooks.js +3 -6
- package/dist/schema/hooks.js.map +1 -1
- package/dist/schema/index.d.ts +114 -3828
- package/dist/schema/index.js +41 -80
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/memory.d.ts +54 -131
- package/dist/schema/memory.js +2 -2
- package/dist/schema/memory.js.map +1 -1
- package/dist/schema/policy-packs.d.ts +3 -45
- package/dist/schema/policy-packs.js +7 -13
- package/dist/schema/policy-packs.js.map +1 -1
- package/dist/schema/policy-ux.d.ts +7 -0
- package/dist/schema/policy-ux.js +18 -0
- package/dist/schema/policy-ux.js.map +1 -0
- package/dist/schema/removed-keys.d.ts +185 -0
- package/dist/schema/removed-keys.js +531 -0
- package/dist/schema/removed-keys.js.map +1 -0
- package/dist/schema/tools.d.ts +30 -268
- package/dist/schema/tools.js +4 -4
- package/dist/schema/tools.js.map +1 -1
- package/package.json +5 -16
- package/dist/cli/approve/branch-protection.d.ts +0 -69
- package/dist/cli/approve/branch-protection.js +0 -144
- package/dist/cli/approve/branch-protection.js.map +0 -1
- package/dist/cli/approve/risk.d.ts +0 -112
- package/dist/cli/approve/risk.js +0 -197
- package/dist/cli/approve/risk.js.map +0 -1
- package/dist/cli/approve/stdin-report.d.ts +0 -57
- package/dist/cli/approve/stdin-report.js +0 -145
- package/dist/cli/approve/stdin-report.js.map +0 -1
- package/dist/cli/approve/understanding.d.ts +0 -410
- package/dist/cli/approve/understanding.js +0 -996
- package/dist/cli/approve/understanding.js.map +0 -1
- package/dist/cli/audit.d.ts +0 -80
- package/dist/cli/audit.js +0 -252
- package/dist/cli/audit.js.map +0 -1
- package/dist/cli/delegate/index.d.ts +0 -76
- package/dist/cli/delegate/index.js +0 -443
- package/dist/cli/delegate/index.js.map +0 -1
- package/dist/cli/doctor/auto-approve-mode.d.ts +0 -37
- package/dist/cli/doctor/auto-approve-mode.js +0 -80
- package/dist/cli/doctor/auto-approve-mode.js.map +0 -1
- package/dist/cli/doctor/bypass-without-auto-approve.d.ts +0 -38
- package/dist/cli/doctor/bypass-without-auto-approve.js +0 -95
- package/dist/cli/doctor/bypass-without-auto-approve.js.map +0 -1
- package/dist/cli/doctor/codex-config-drift.d.ts +0 -28
- package/dist/cli/doctor/codex-config-drift.js +0 -240
- package/dist/cli/doctor/codex-config-drift.js.map +0 -1
- package/dist/cli/doctor/rogue-ledger.d.ts +0 -53
- package/dist/cli/doctor/rogue-ledger.js +0 -153
- package/dist/cli/doctor/rogue-ledger.js.map +0 -1
- package/dist/cli/doctor/session-start-preflight-setup-version.d.ts +0 -83
- package/dist/cli/doctor/session-start-preflight-setup-version.js +0 -114
- package/dist/cli/doctor/session-start-preflight-setup-version.js.map +0 -1
- package/dist/cli/doctor/settings-drift.d.ts +0 -25
- package/dist/cli/doctor/settings-drift.js +0 -213
- package/dist/cli/doctor/settings-drift.js.map +0 -1
- package/dist/cli/doctor/toolchain-parity.d.ts +0 -63
- package/dist/cli/doctor/toolchain-parity.js +0 -154
- package/dist/cli/doctor/toolchain-parity.js.map +0 -1
- package/dist/cli/doctor/ug-auto-approvals.d.ts +0 -40
- package/dist/cli/doctor/ug-auto-approvals.js +0 -91
- package/dist/cli/doctor/ug-auto-approvals.js.map +0 -1
- package/dist/cli/doctor/ug-delegations.d.ts +0 -26
- package/dist/cli/doctor/ug-delegations.js +0 -121
- package/dist/cli/doctor/ug-delegations.js.map +0 -1
- package/dist/cli/doctor/ug-inflight.d.ts +0 -35
- package/dist/cli/doctor/ug-inflight.js +0 -57
- package/dist/cli/doctor/ug-inflight.js.map +0 -1
- package/dist/cli/doctor/understanding-mode-env.d.ts +0 -51
- package/dist/cli/doctor/understanding-mode-env.js +0 -98
- package/dist/cli/doctor/understanding-mode-env.js.map +0 -1
- package/dist/cli/dry-run.d.ts +0 -46
- package/dist/cli/dry-run.js +0 -250
- package/dist/cli/dry-run.js.map +0 -1
- package/dist/cli/event-input.d.ts +0 -28
- package/dist/cli/event-input.js +0 -73
- package/dist/cli/event-input.js.map +0 -1
- package/dist/cli/explain-action.d.ts +0 -20
- package/dist/cli/explain-action.js +0 -27
- package/dist/cli/explain-action.js.map +0 -1
- package/dist/cli/explain-policy.d.ts +0 -135
- package/dist/cli/explain-policy.js +0 -266
- package/dist/cli/explain-policy.js.map +0 -1
- package/dist/cli/explain.d.ts +0 -31
- package/dist/cli/explain.js +0 -159
- package/dist/cli/explain.js.map +0 -1
- package/dist/cli/gc/index.d.ts +0 -63
- package/dist/cli/gc/index.js +0 -566
- package/dist/cli/gc/index.js.map +0 -1
- package/dist/cli/pack/approve-escape.d.ts +0 -19
- package/dist/cli/pack/approve-escape.js +0 -190
- package/dist/cli/pack/approve-escape.js.map +0 -1
- package/dist/cli/pack/auto-approve-path.d.ts +0 -146
- package/dist/cli/pack/auto-approve-path.js +0 -462
- package/dist/cli/pack/auto-approve-path.js.map +0 -1
- package/dist/cli/pack/hook-codex-post-tool-use.d.ts +0 -25
- package/dist/cli/pack/hook-codex-post-tool-use.js +0 -160
- package/dist/cli/pack/hook-codex-post-tool-use.js.map +0 -1
- package/dist/cli/pack/hook-codex-pre-tool-use.d.ts +0 -48
- package/dist/cli/pack/hook-codex-pre-tool-use.js +0 -474
- package/dist/cli/pack/hook-codex-pre-tool-use.js.map +0 -1
- package/dist/cli/pack/hook-codex-stop.d.ts +0 -35
- package/dist/cli/pack/hook-codex-stop.js +0 -329
- package/dist/cli/pack/hook-codex-stop.js.map +0 -1
- package/dist/cli/pack/hook-codex-user-prompt-submit.d.ts +0 -24
- package/dist/cli/pack/hook-codex-user-prompt-submit.js +0 -93
- package/dist/cli/pack/hook-codex-user-prompt-submit.js.map +0 -1
- package/dist/cli/pack/hook-post-merge-gate-record.d.ts +0 -37
- package/dist/cli/pack/hook-post-merge-gate-record.js +0 -190
- package/dist/cli/pack/hook-post-merge-gate-record.js.map +0 -1
- package/dist/cli/pack/hook-post-merge-gate.d.ts +0 -34
- package/dist/cli/pack/hook-post-merge-gate.js +0 -277
- package/dist/cli/pack/hook-post-merge-gate.js.map +0 -1
- package/dist/cli/pack/hook-post-tool-use.d.ts +0 -45
- package/dist/cli/pack/hook-post-tool-use.js +0 -137
- package/dist/cli/pack/hook-post-tool-use.js.map +0 -1
- package/dist/cli/pack/hook-pre-tool-use.d.ts +0 -92
- package/dist/cli/pack/hook-pre-tool-use.js +0 -1328
- package/dist/cli/pack/hook-pre-tool-use.js.map +0 -1
- package/dist/cli/pack/hook-runtime-reality.d.ts +0 -63
- package/dist/cli/pack/hook-runtime-reality.js +0 -210
- package/dist/cli/pack/hook-runtime-reality.js.map +0 -1
- package/dist/cli/pack/hook-solution-acceptance-writeguard.d.ts +0 -32
- package/dist/cli/pack/hook-solution-acceptance-writeguard.js +0 -337
- package/dist/cli/pack/hook-solution-acceptance-writeguard.js.map +0 -1
- package/dist/cli/pack/hook-solution-acceptance.d.ts +0 -157
- package/dist/cli/pack/hook-solution-acceptance.js +0 -530
- package/dist/cli/pack/hook-solution-acceptance.js.map +0 -1
- package/dist/cli/pack/hook-stay-in-scope.d.ts +0 -37
- package/dist/cli/pack/hook-stay-in-scope.js +0 -128
- package/dist/cli/pack/hook-stay-in-scope.js.map +0 -1
- package/dist/cli/pack/hook-subagent-start.d.ts +0 -23
- package/dist/cli/pack/hook-subagent-start.js +0 -88
- package/dist/cli/pack/hook-subagent-start.js.map +0 -1
- package/dist/cli/pack/hook-subagent-stop.d.ts +0 -19
- package/dist/cli/pack/hook-subagent-stop.js +0 -41
- package/dist/cli/pack/hook-subagent-stop.js.map +0 -1
- package/dist/cli/pack/hook-track-active-claim.d.ts +0 -27
- package/dist/cli/pack/hook-track-active-claim.js +0 -275
- package/dist/cli/pack/hook-track-active-claim.js.map +0 -1
- package/dist/cli/pack/transcript-report-scan.d.ts +0 -71
- package/dist/cli/pack/transcript-report-scan.js +0 -359
- package/dist/cli/pack/transcript-report-scan.js.map +0 -1
- package/dist/cli/pack/understanding-report-schema-hint.d.ts +0 -26
- package/dist/cli/pack/understanding-report-schema-hint.js +0 -120
- package/dist/cli/pack/understanding-report-schema-hint.js.map +0 -1
- package/dist/cli/pack/upgrade.d.ts +0 -32
- package/dist/cli/pack/upgrade.js +0 -273
- package/dist/cli/pack/upgrade.js.map +0 -1
- package/dist/cli/pause/index.d.ts +0 -113
- package/dist/cli/pause/index.js +0 -251
- package/dist/cli/pause/index.js.map +0 -1
- package/dist/cli/pause-check.d.ts +0 -22
- package/dist/cli/pause-check.js +0 -54
- package/dist/cli/pause-check.js.map +0 -1
- package/dist/cli/policy/intercept.d.ts +0 -233
- package/dist/cli/policy/intercept.js +0 -1020
- package/dist/cli/policy/intercept.js.map +0 -1
- package/dist/cli/policy/risk-envelope-enrichment.d.ts +0 -40
- package/dist/cli/policy/risk-envelope-enrichment.js +0 -108
- package/dist/cli/policy/risk-envelope-enrichment.js.map +0 -1
- package/dist/cli/record/index.d.ts +0 -81
- package/dist/cli/record/index.js +0 -348
- package/dist/cli/record/index.js.map +0 -1
- package/dist/cli/resolve-env.d.ts +0 -32
- package/dist/cli/resolve-env.js +0 -47
- package/dist/cli/resolve-env.js.map +0 -1
- package/dist/cli/session-export/index.d.ts +0 -46
- package/dist/cli/session-export/index.js +0 -169
- package/dist/cli/session-export/index.js.map +0 -1
- package/dist/cli/session-export/redact.d.ts +0 -22
- package/dist/cli/session-export/redact.js +0 -47
- package/dist/cli/session-export/redact.js.map +0 -1
- package/dist/cli/session-export/transcript.d.ts +0 -24
- package/dist/cli/session-export/transcript.js +0 -164
- package/dist/cli/session-export/transcript.js.map +0 -1
- package/dist/cli/session-start/branch-check.d.ts +0 -18
- package/dist/cli/session-start/branch-check.js +0 -140
- package/dist/cli/session-start/branch-check.js.map +0 -1
- package/dist/cli/session-start/index.d.ts +0 -121
- package/dist/cli/session-start/index.js +0 -591
- package/dist/cli/session-start/index.js.map +0 -1
- package/dist/cli/session-start/shared-options.d.ts +0 -103
- package/dist/cli/session-start/shared-options.js +0 -107
- package/dist/cli/session-start/shared-options.js.map +0 -1
- package/dist/cli/session-start/stale-base-check.d.ts +0 -46
- package/dist/cli/session-start/stale-base-check.js +0 -352
- package/dist/cli/session-start/stale-base-check.js.map +0 -1
- package/dist/cli/session-start/toolchain-parity.d.ts +0 -267
- package/dist/cli/session-start/toolchain-parity.js +0 -797
- package/dist/cli/session-start/toolchain-parity.js.map +0 -1
- package/dist/cli/smoke/assertions.d.ts +0 -46
- package/dist/cli/smoke/assertions.js +0 -170
- package/dist/cli/smoke/assertions.js.map +0 -1
- package/dist/cli/smoke/index.d.ts +0 -76
- package/dist/cli/smoke/index.js +0 -245
- package/dist/cli/smoke/index.js.map +0 -1
- package/dist/cli/smoke/runner.d.ts +0 -55
- package/dist/cli/smoke/runner.js +0 -134
- package/dist/cli/smoke/runner.js.map +0 -1
- package/dist/cli/smoke/stream-parser.d.ts +0 -65
- package/dist/cli/smoke/stream-parser.js +0 -115
- package/dist/cli/smoke/stream-parser.js.map +0 -1
- package/dist/cli/test-risk.d.ts +0 -26
- package/dist/cli/test-risk.js +0 -34
- package/dist/cli/test-risk.js.map +0 -1
- package/dist/io/display-path.d.ts +0 -11
- package/dist/io/display-path.js +0 -29
- package/dist/io/display-path.js.map +0 -1
- package/dist/io/duration.d.ts +0 -5
- package/dist/io/duration.js +0 -50
- package/dist/io/duration.js.map +0 -1
- package/dist/io/extract.d.ts +0 -79
- package/dist/io/extract.js +0 -226
- package/dist/io/extract.js.map +0 -1
- package/dist/io/ledger-record.d.ts +0 -83
- package/dist/io/ledger-record.js +0 -301
- package/dist/io/ledger-record.js.map +0 -1
- package/dist/io/read-json-dir-entries.d.ts +0 -36
- package/dist/io/read-json-dir-entries.js +0 -48
- package/dist/io/read-json-dir-entries.js.map +0 -1
- package/dist/io/safe-json-parse.d.ts +0 -5
- package/dist/io/safe-json-parse.js +0 -21
- package/dist/io/safe-json-parse.js.map +0 -1
- package/dist/policies/index.d.ts +0 -5
- package/dist/policies/index.js +0 -6
- package/dist/policies/index.js.map +0 -1
- package/dist/policies/ledger-client.d.ts +0 -113
- package/dist/policies/ledger-client.js +0 -500
- package/dist/policies/ledger-client.js.map +0 -1
- package/dist/policies/producers.d.ts +0 -12
- package/dist/policies/producers.js +0 -61
- package/dist/policies/producers.js.map +0 -1
- package/dist/policies/requires.d.ts +0 -75
- package/dist/policies/requires.js +0 -240
- package/dist/policies/requires.js.map +0 -1
- package/dist/policies/timestamp.d.ts +0 -14
- package/dist/policies/timestamp.js +0 -36
- package/dist/policies/timestamp.js.map +0 -1
- package/dist/policy-packs/builtin/permission-profiles.d.ts +0 -11
- package/dist/policy-packs/builtin/permission-profiles.js +0 -74
- package/dist/policy-packs/builtin/permission-profiles.js.map +0 -1
- package/dist/policy-packs/builtin/post-merge-gate-runtime.d.ts +0 -286
- package/dist/policy-packs/builtin/post-merge-gate-runtime.js +0 -397
- package/dist/policy-packs/builtin/post-merge-gate-runtime.js.map +0 -1
- package/dist/policy-packs/builtin/post-merge-gate.d.ts +0 -56
- package/dist/policy-packs/builtin/post-merge-gate.js +0 -347
- package/dist/policy-packs/builtin/post-merge-gate.js.map +0 -1
- package/dist/policy-packs/builtin/solution-acceptance-reconnect.d.ts +0 -50
- package/dist/policy-packs/builtin/solution-acceptance-reconnect.js +0 -151
- package/dist/policy-packs/builtin/solution-acceptance-reconnect.js.map +0 -1
- package/dist/policy-packs/builtin/solution-acceptance-runtime.d.ts +0 -323
- package/dist/policy-packs/builtin/solution-acceptance-runtime.js +0 -672
- package/dist/policy-packs/builtin/solution-acceptance-runtime.js.map +0 -1
- package/dist/policy-packs/builtin/solution-acceptance.d.ts +0 -45
- package/dist/policy-packs/builtin/solution-acceptance.js +0 -226
- package/dist/policy-packs/builtin/solution-acceptance.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/active-claim.d.ts +0 -25
- package/dist/policy-packs/builtin/understanding-before-execution/active-claim.js +0 -94
- package/dist/policy-packs/builtin/understanding-before-execution/active-claim.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.d.ts +0 -35
- package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.js +0 -86
- package/dist/policy-packs/builtin/understanding-before-execution/auto-approve-default.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/auto-approve.d.ts +0 -210
- package/dist/policy-packs/builtin/understanding-before-execution/auto-approve.js +0 -361
- package/dist/policy-packs/builtin/understanding-before-execution/auto-approve.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.d.ts +0 -304
- package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.js +0 -734
- package/dist/policy-packs/builtin/understanding-before-execution/delegation-markers.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/expiry-reason.d.ts +0 -36
- package/dist/policy-packs/builtin/understanding-before-execution/expiry-reason.js +0 -73
- package/dist/policy-packs/builtin/understanding-before-execution/expiry-reason.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/index.d.ts +0 -19
- package/dist/policy-packs/builtin/understanding-before-execution/index.js +0 -83
- package/dist/policy-packs/builtin/understanding-before-execution/index.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/inflight-records.d.ts +0 -135
- package/dist/policy-packs/builtin/understanding-before-execution/inflight-records.js +0 -618
- package/dist/policy-packs/builtin/understanding-before-execution/inflight-records.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/ledger.d.ts +0 -25
- package/dist/policy-packs/builtin/understanding-before-execution/ledger.js +0 -56
- package/dist/policy-packs/builtin/understanding-before-execution/ledger.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/lifecycle.d.ts +0 -20
- package/dist/policy-packs/builtin/understanding-before-execution/lifecycle.js +0 -93
- package/dist/policy-packs/builtin/understanding-before-execution/lifecycle.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/markers.d.ts +0 -126
- package/dist/policy-packs/builtin/understanding-before-execution/markers.js +0 -245
- package/dist/policy-packs/builtin/understanding-before-execution/markers.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/measured-permission-modes.d.ts +0 -29
- package/dist/policy-packs/builtin/understanding-before-execution/measured-permission-modes.js +0 -82
- package/dist/policy-packs/builtin/understanding-before-execution/measured-permission-modes.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.d.ts +0 -71
- package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.js +0 -175
- package/dist/policy-packs/builtin/understanding-before-execution/permission-mode-observations.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.d.ts +0 -620
- package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.js +0 -1047
- package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/post-tool-use-boundary.d.ts +0 -128
- package/dist/policy-packs/builtin/understanding-before-execution/post-tool-use-boundary.js +0 -213
- package/dist/policy-packs/builtin/understanding-before-execution/post-tool-use-boundary.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/stay-in-scope-config.d.ts +0 -129
- package/dist/policy-packs/builtin/understanding-before-execution/stay-in-scope-config.js +0 -166
- package/dist/policy-packs/builtin/understanding-before-execution/stay-in-scope-config.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution/task-markers.d.ts +0 -164
- package/dist/policy-packs/builtin/understanding-before-execution/task-markers.js +0 -275
- package/dist/policy-packs/builtin/understanding-before-execution/task-markers.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.d.ts +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.js +0 -10
- package/dist/policy-packs/builtin/understanding-before-execution-runtime.js.map +0 -1
- package/dist/policy-packs/builtin/understanding-before-execution.d.ts +0 -526
- package/dist/policy-packs/builtin/understanding-before-execution.js +0 -1074
- package/dist/policy-packs/builtin/understanding-before-execution.js.map +0 -1
- package/dist/policy-packs/permission-translator.d.ts +0 -9
- package/dist/policy-packs/permission-translator.js +0 -76
- package/dist/policy-packs/permission-translator.js.map +0 -1
- package/dist/runtime/action-envelope.d.ts +0 -64
- package/dist/runtime/action-envelope.js +0 -46
- package/dist/runtime/action-envelope.js.map +0 -1
- package/dist/runtime/approval-signing.d.ts +0 -111
- package/dist/runtime/approval-signing.js +0 -384
- package/dist/runtime/approval-signing.js.map +0 -1
- package/dist/runtime/bash-match-facts.d.ts +0 -60
- package/dist/runtime/bash-match-facts.js +0 -196
- package/dist/runtime/bash-match-facts.js.map +0 -1
- package/dist/runtime/bash-match-registry.d.ts +0 -112
- package/dist/runtime/bash-match-registry.js +0 -406
- package/dist/runtime/bash-match-registry.js.map +0 -1
- package/dist/runtime/bash-prefix-parse.d.ts +0 -31
- package/dist/runtime/bash-prefix-parse.js +0 -576
- package/dist/runtime/bash-prefix-parse.js.map +0 -1
- package/dist/runtime/command-normalize.d.ts +0 -658
- package/dist/runtime/command-normalize.js +0 -2410
- package/dist/runtime/command-normalize.js.map +0 -1
- package/dist/runtime/deletion-target-resolve.d.ts +0 -28
- package/dist/runtime/deletion-target-resolve.js +0 -1078
- package/dist/runtime/deletion-target-resolve.js.map +0 -1
- package/dist/runtime/destructive-shell-floor.d.ts +0 -19
- package/dist/runtime/destructive-shell-floor.js +0 -611
- package/dist/runtime/destructive-shell-floor.js.map +0 -1
- package/dist/runtime/environment-resolver.d.ts +0 -36
- package/dist/runtime/environment-resolver.js +0 -138
- package/dist/runtime/environment-resolver.js.map +0 -1
- package/dist/runtime/git-context.d.ts +0 -201
- package/dist/runtime/git-context.js +0 -422
- package/dist/runtime/git-context.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -12
- package/dist/runtime/index.js +0 -13
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/intercept.d.ts +0 -494
- package/dist/runtime/intercept.js +0 -1313
- package/dist/runtime/intercept.js.map +0 -1
- package/dist/runtime/kube-context.d.ts +0 -16
- package/dist/runtime/kube-context.js +0 -63
- package/dist/runtime/kube-context.js.map +0 -1
- package/dist/runtime/kubectl-target-parse.d.ts +0 -31
- package/dist/runtime/kubectl-target-parse.js +0 -249
- package/dist/runtime/kubectl-target-parse.js.map +0 -1
- package/dist/runtime/ledger-add.d.ts +0 -16
- package/dist/runtime/ledger-add.js +0 -150
- package/dist/runtime/ledger-add.js.map +0 -1
- package/dist/runtime/ledger-writer.d.ts +0 -27
- package/dist/runtime/ledger-writer.js +0 -46
- package/dist/runtime/ledger-writer.js.map +0 -1
- package/dist/runtime/pause-sentinel.d.ts +0 -60
- package/dist/runtime/pause-sentinel.js +0 -156
- package/dist/runtime/pause-sentinel.js.map +0 -1
- package/dist/runtime/pending-approval.d.ts +0 -23
- package/dist/runtime/pending-approval.js +0 -67
- package/dist/runtime/pending-approval.js.map +0 -1
- package/dist/runtime/read-only-bash.d.ts +0 -141
- package/dist/runtime/read-only-bash.js +0 -2204
- package/dist/runtime/read-only-bash.js.map +0 -1
- package/dist/runtime/recovery-git-commit.d.ts +0 -22
- package/dist/runtime/recovery-git-commit.js +0 -284
- package/dist/runtime/recovery-git-commit.js.map +0 -1
- package/dist/runtime/reject-malformed-session-id.d.ts +0 -8
- package/dist/runtime/reject-malformed-session-id.js +0 -16
- package/dist/runtime/reject-malformed-session-id.js.map +0 -1
- package/dist/runtime/risk-classifier.d.ts +0 -38
- package/dist/runtime/risk-classifier.js +0 -311
- package/dist/runtime/risk-classifier.js.map +0 -1
- package/dist/runtime/session-id.d.ts +0 -113
- package/dist/runtime/session-id.js +0 -193
- package/dist/runtime/session-id.js.map +0 -1
- package/dist/runtime/shell-word.d.ts +0 -62
- package/dist/runtime/shell-word.js +0 -410
- package/dist/runtime/shell-word.js.map +0 -1
- package/dist/runtime/task-providers/agent-tasks.d.ts +0 -103
- package/dist/runtime/task-providers/agent-tasks.js +0 -245
- package/dist/runtime/task-providers/agent-tasks.js.map +0 -1
- package/dist/runtime/when-eval.d.ts +0 -62
- package/dist/runtime/when-eval.js +0 -212
- package/dist/runtime/when-eval.js.map +0 -1
- package/dist/runtime/workflow-policies.d.ts +0 -207
- package/dist/runtime/workflow-policies.js +0 -596
- package/dist/runtime/workflow-policies.js.map +0 -1
- package/dist/schema/audit.d.ts +0 -71
- package/dist/schema/audit.js +0 -32
- package/dist/schema/audit.js.map +0 -1
- package/dist/schema/doctor.d.ts +0 -25
- package/dist/schema/doctor.js +0 -23
- package/dist/schema/doctor.js.map +0 -1
- package/dist/schema/environments.d.ts +0 -215
- package/dist/schema/environments.js +0 -101
- package/dist/schema/environments.js.map +0 -1
- package/dist/schema/extract.d.ts +0 -9
- package/dist/schema/extract.js +0 -86
- package/dist/schema/extract.js.map +0 -1
- package/dist/schema/permission-profiles.d.ts +0 -2292
- package/dist/schema/permission-profiles.js +0 -60
- package/dist/schema/permission-profiles.js.map +0 -1
- package/dist/schema/policies.d.ts +0 -974
- package/dist/schema/policies.js +0 -298
- package/dist/schema/policies.js.map +0 -1
- package/dist/schema/requires.d.ts +0 -131
- package/dist/schema/requires.js +0 -88
- package/dist/schema/requires.js.map +0 -1
- package/dist/schema/risk.d.ts +0 -144
- package/dist/schema/risk.js +0 -194
- package/dist/schema/risk.js.map +0 -1
- package/dist/schema/session-start-preflight.d.ts +0 -10
- package/dist/schema/session-start-preflight.js +0 -106
- package/dist/schema/session-start-preflight.js.map +0 -1
- package/dist/schema/stale-base-check.d.ts +0 -18
- package/dist/schema/stale-base-check.js +0 -37
- package/dist/schema/stale-base-check.js.map +0 -1
- package/dist/schema/toolchain-parity.d.ts +0 -21
- package/dist/schema/toolchain-parity.js +0 -48
- package/dist/schema/toolchain-parity.js.map +0 -1
- package/dist/schema/workflows.d.ts +0 -519
- package/dist/schema/workflows.js +0 -81
- package/dist/schema/workflows.js.map +0 -1
- package/scripts/runtime-reality-docker-probe.mjs +0 -71
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { packAdd, packList, packRemove, packReseed } from "./pack/index.js";
|
|
2
|
+
import { runPackHookBranchProtectionCli } from "./pack/hook-branch-protection.js";
|
|
3
|
+
import { HarnessExitError } from "./exit-codes.js";
|
|
4
|
+
export function registerPackGroup(program, io) {
|
|
5
|
+
const { stdout, stderr } = io;
|
|
6
|
+
// `harness pack` subtree (Phase 6 #3): managed CRUD over policy_packs[].
|
|
7
|
+
const packCmd = program
|
|
8
|
+
.command("pack")
|
|
9
|
+
.description("Manage policy_packs[] entries (add / remove / list / reseed)");
|
|
10
|
+
packCmd
|
|
11
|
+
.command("add <name>")
|
|
12
|
+
.description("Insert a new policy_packs entry. <name> must be a known builtin (see docs/policy-packs/).")
|
|
13
|
+
.option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
|
|
14
|
+
.option("--source <src>", "pack source (default: builtin)")
|
|
15
|
+
.option("--description <text>", "operator-facing description")
|
|
16
|
+
.option("--disabled", "register as enabled: false")
|
|
17
|
+
.option("--dry-run", "print the unified diff and exit without writing")
|
|
18
|
+
.action(async (name, options) => {
|
|
19
|
+
const entry = { name };
|
|
20
|
+
if (options.source !== undefined)
|
|
21
|
+
entry.source = options.source;
|
|
22
|
+
if (options.disabled === true)
|
|
23
|
+
entry.enabled = false;
|
|
24
|
+
if (options.description !== undefined)
|
|
25
|
+
entry.description = options.description;
|
|
26
|
+
const result = await packAdd(entry, {
|
|
27
|
+
configPath: options.config,
|
|
28
|
+
dryRun: options.dryRun,
|
|
29
|
+
});
|
|
30
|
+
if (options.dryRun) {
|
|
31
|
+
stdout(result.diff);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
stdout(`added policy_packs entry ${JSON.stringify(result.name)} to ${result.path}\n`);
|
|
35
|
+
});
|
|
36
|
+
packCmd
|
|
37
|
+
.command("remove <name>")
|
|
38
|
+
.description("Remove a policy_packs entry. Refuses without --force when applied state " +
|
|
39
|
+
"is recorded in .last-apply.")
|
|
40
|
+
.option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
|
|
41
|
+
.option("--dry-run", "print the unified diff and exit without writing")
|
|
42
|
+
.option("--force", "remove the manifest entry AND clean up the on-disk pack files + .last-apply state")
|
|
43
|
+
.action(async (name, options) => {
|
|
44
|
+
const result = await packRemove(name, {
|
|
45
|
+
configPath: options.config,
|
|
46
|
+
dryRun: options.dryRun,
|
|
47
|
+
force: options.force,
|
|
48
|
+
});
|
|
49
|
+
if (result.cleanedFiles.length > 0) {
|
|
50
|
+
stderr(`(forced cleanup — removed ${result.cleanedFiles.length} pack file(s) and pruned .last-apply)\n`);
|
|
51
|
+
}
|
|
52
|
+
if (options.dryRun) {
|
|
53
|
+
stdout(result.diff);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
stdout(`removed policy_packs entry ${JSON.stringify(result.name)} from ${result.path}\n`);
|
|
57
|
+
});
|
|
58
|
+
// `harness pack reseed <name>` (task 68b9ad9c): pull the shipped
|
|
59
|
+
// builtin template's config.ux into an already-
|
|
60
|
+
// installed manifest. Explicit-only, mirroring add/remove — never
|
|
61
|
+
// invoked by `apply`, so an upgrade never silently rewrites an
|
|
62
|
+
// operator's deliberate ux customisation. Paired with the `harness
|
|
63
|
+
// doctor` divergence warning (src/policy-packs/ux-drift-check.ts).
|
|
64
|
+
packCmd
|
|
65
|
+
.command("reseed <name>")
|
|
66
|
+
.description("Pull the shipped builtin template's config.ux for <name> into " +
|
|
67
|
+
"the manifest, preserving other config keys (protected_branches, ...). No-op if " +
|
|
68
|
+
"already up to date. See `harness doctor` for a divergence warning.")
|
|
69
|
+
.option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
|
|
70
|
+
.option("--dry-run", "print the unified diff and exit without writing")
|
|
71
|
+
.action(async (name, options) => {
|
|
72
|
+
const result = await packReseed(name, {
|
|
73
|
+
configPath: options.config,
|
|
74
|
+
dryRun: options.dryRun,
|
|
75
|
+
});
|
|
76
|
+
if (result.fieldsChanged.length === 0) {
|
|
77
|
+
stdout(`policy_packs entry ${JSON.stringify(result.name)} already matches the shipped template; nothing to reseed.\n`);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (options.dryRun) {
|
|
81
|
+
stdout(result.diff);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
stdout(`reseeded ${result.fieldsChanged.map((f) => `config.${f}`).join(", ")} for policy_packs entry ${JSON.stringify(result.name)} in ${result.path}\n`);
|
|
85
|
+
});
|
|
86
|
+
// `harness pack hook` runtime sub-tree (Phase 6 #4): wired by pack hook
|
|
87
|
+
// contributions in settings.json; reads tool-event JSON from stdin and
|
|
88
|
+
// emits Claude Code deny JSON on block.
|
|
89
|
+
const packHookCmd = packCmd
|
|
90
|
+
.command("hook")
|
|
91
|
+
.description("Pack runtime hook entrypoints (called by Claude Code via settings.json)");
|
|
92
|
+
packHookCmd
|
|
93
|
+
.command("branch-protection")
|
|
94
|
+
.description("PreToolUse blocker for the branch-protection pack: read tool-event JSON from stdin, ask git " +
|
|
95
|
+
"(`git -C <dir> symbolic-ref -q HEAD`) for the branch of every directory the call writes into, " +
|
|
96
|
+
"and refuse when git names a protected branch or cannot answer. Claude Code gets a JSON deny " +
|
|
97
|
+
"envelope on stdout; `--runtime codex` exits 2 with the reason on stderr.")
|
|
98
|
+
.option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
|
|
99
|
+
.option("--project <name>", "apply per-project overrides")
|
|
100
|
+
.option("--cwd <path>", "override cwd resolution (default: stdin event.cwd then process.cwd())")
|
|
101
|
+
.option("--runtime <name>", "block contract: claude-code (default) or codex")
|
|
102
|
+
.action(async (options) => {
|
|
103
|
+
const cliOpts = {};
|
|
104
|
+
if (options.config)
|
|
105
|
+
cliOpts.configPath = options.config;
|
|
106
|
+
if (options.project)
|
|
107
|
+
cliOpts.project = options.project;
|
|
108
|
+
if (options.cwd)
|
|
109
|
+
cliOpts.cwd = options.cwd;
|
|
110
|
+
if (options.runtime !== undefined)
|
|
111
|
+
cliOpts.runtime = options.runtime;
|
|
112
|
+
const result = await runPackHookBranchProtectionCli(cliOpts);
|
|
113
|
+
if (result.exitCode !== 0) {
|
|
114
|
+
throw new HarnessExitError("", result.exitCode);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
packCmd
|
|
118
|
+
.command("list")
|
|
119
|
+
.description("Print policy_packs entries as a flat table or JSON.")
|
|
120
|
+
.option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
|
|
121
|
+
.option("--project <name>", "apply per-project overrides")
|
|
122
|
+
.option("--enabled-only", "skip entries with enabled: false")
|
|
123
|
+
.option("--json", "emit JSON array instead of an aligned text table")
|
|
124
|
+
.action((options) => {
|
|
125
|
+
const result = packList({
|
|
126
|
+
...(options.config !== undefined ? { configPath: options.config } : {}),
|
|
127
|
+
...(options.project !== undefined ? { project: options.project } : {}),
|
|
128
|
+
...(options.enabledOnly === true ? { enabledOnly: true } : {}),
|
|
129
|
+
...(options.json === true ? { json: true } : {}),
|
|
130
|
+
});
|
|
131
|
+
stdout(result.output);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=register-pack-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-pack-group.js","sourceRoot":"","sources":["../../src/cli/register-pack-group.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import { add } from "./add/index.js";
|
|
3
|
+
import { adopt } from "./adopt/index.js";
|
|
4
|
+
import { apply, CODEX_CONFIG_BASENAME, CodexInstallRefusalError, DRIFT_HINT_MESSAGE, formatNextSteps, formatRuntimeLine, OPENCODE_CONFIG_BASENAME, SETTINGS_BASENAME, } from "./apply/index.js";
|
|
5
|
+
import { isRuntime, KNOWN_RUNTIMES } from "../policy-packs/index.js";
|
|
6
|
+
import { exportManifest } from "./export.js";
|
|
7
|
+
import { EX_FAIL, EX_USAGE, HarnessExitError } from "./exit-codes.js";
|
|
8
|
+
import { detect as detectInit } from "./init/detect.js";
|
|
9
|
+
import { init, isTemplate, KNOWN_TEMPLATES } from "./init/index.js";
|
|
10
|
+
import { runInteractive } from "./init/interactive.js";
|
|
11
|
+
export function registerSetupGroup(program, io) {
|
|
12
|
+
const { stdout, stderr } = io;
|
|
13
|
+
program
|
|
14
|
+
.command("init")
|
|
15
|
+
.description("Bootstrap a starter harness.yaml from a template")
|
|
16
|
+
.option("--template <name>", `template to instantiate: ${KNOWN_TEMPLATES.join(" | ")} (default: minimal)`)
|
|
17
|
+
.option("--force", "overwrite an existing manifest")
|
|
18
|
+
.option("--config <path>", "manifest path to write (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
|
|
19
|
+
.option("--probe", "skip writing, print a JSON snapshot of detected runtimes (Claude Code, Codex), the existing ~/.harness/harness.yaml (or legacy ~/.claude/harness.yaml), and MCP servers registered in the Claude Code user-scope registry (~/.claude.json, or $CLAUDE_CONFIG_DIR/.claude.json). Read-only.")
|
|
20
|
+
.option("--interactive", "run the guided wizard (detect environment, pick profile, preview + write). Mutually exclusive with --probe / --template.")
|
|
21
|
+
.action(async (options) => {
|
|
22
|
+
if (options.probe && options.interactive) {
|
|
23
|
+
throw new HarnessExitError("--probe and --interactive are mutually exclusive", EX_USAGE);
|
|
24
|
+
}
|
|
25
|
+
if (options.probe) {
|
|
26
|
+
if (options.template !== undefined || options.force || options.config !== undefined) {
|
|
27
|
+
throw new HarnessExitError("--probe is read-only; pass it without --template / --force / --config", EX_USAGE);
|
|
28
|
+
}
|
|
29
|
+
const result = await detectInit();
|
|
30
|
+
stdout(`${JSON.stringify(result, null, 2)}\n`);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (options.interactive) {
|
|
34
|
+
if (options.template !== undefined || options.config !== undefined) {
|
|
35
|
+
throw new HarnessExitError("--interactive owns its own template + path choices; do not combine with --template / --config", EX_USAGE);
|
|
36
|
+
}
|
|
37
|
+
// Thread --force into the wizard's forceOverwrite: without it
|
|
38
|
+
// an existing manifest makes the wizard re-prompt, and
|
|
39
|
+
// `harness init --interactive --force` looked like it should
|
|
40
|
+
// overwrite non-interactively but the flag never reached
|
|
41
|
+
// runInteractive (harness/418cebd4).
|
|
42
|
+
const r = await runInteractive({
|
|
43
|
+
stdout,
|
|
44
|
+
stderr,
|
|
45
|
+
...(options.force ? { forceOverwrite: true } : {}),
|
|
46
|
+
});
|
|
47
|
+
if (r.aborted) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (r.validateClean === false) {
|
|
51
|
+
throw new HarnessExitError(`manifest written but failed harness validate; see stderr for diagnostics`, EX_FAIL);
|
|
52
|
+
}
|
|
53
|
+
if (r.binResolutionClean === false) {
|
|
54
|
+
throw new HarnessExitError(`manifest written but one or more declared MCP/CLI binaries do not resolve on PATH; see stderr for diagnostics and remediation hints`, EX_FAIL);
|
|
55
|
+
}
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (options.template !== undefined && !isTemplate(options.template)) {
|
|
59
|
+
throw new HarnessExitError(`unknown template "${options.template}"; expected one of ${KNOWN_TEMPLATES.join(", ")}`, EX_USAGE);
|
|
60
|
+
}
|
|
61
|
+
const result = await init({
|
|
62
|
+
template: options.template,
|
|
63
|
+
force: options.force,
|
|
64
|
+
configPath: options.config,
|
|
65
|
+
});
|
|
66
|
+
if (result.stderr)
|
|
67
|
+
stderr(result.stderr);
|
|
68
|
+
stdout(result.stdout);
|
|
69
|
+
});
|
|
70
|
+
const addCmd = program
|
|
71
|
+
.command("add")
|
|
72
|
+
.description("Insert a new entry into harness.yaml (managed mutation)");
|
|
73
|
+
function addCommonOptions(c) {
|
|
74
|
+
return c
|
|
75
|
+
.option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
|
|
76
|
+
.option("--dry-run", "print the unified diff and exit without writing");
|
|
77
|
+
}
|
|
78
|
+
function parseBlocking(s) {
|
|
79
|
+
if (s === "false")
|
|
80
|
+
return false;
|
|
81
|
+
if (s === "soft" || s === "hard")
|
|
82
|
+
return s;
|
|
83
|
+
throw new HarnessExitError(`invalid --blocking value "${s}"; expected one of false, soft, hard`, EX_USAGE);
|
|
84
|
+
}
|
|
85
|
+
function parseIntFlag(s, label) {
|
|
86
|
+
const n = Number.parseInt(s, 10);
|
|
87
|
+
if (!Number.isFinite(n) || String(n) !== s.trim()) {
|
|
88
|
+
throw new HarnessExitError(`invalid ${label} value "${s}"; expected an integer`, EX_USAGE);
|
|
89
|
+
}
|
|
90
|
+
return n;
|
|
91
|
+
}
|
|
92
|
+
async function runAdd(action, opts) {
|
|
93
|
+
const result = await add(action, { configPath: opts.config, dryRun: opts.dryRun });
|
|
94
|
+
for (const w of result.warnings) {
|
|
95
|
+
stderr(`warning: ${w}\n`);
|
|
96
|
+
}
|
|
97
|
+
if (opts.dryRun) {
|
|
98
|
+
stdout(result.diff);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
stdout(`added ${result.type} ${JSON.stringify(result.name)} to ${result.path}\n`);
|
|
102
|
+
}
|
|
103
|
+
addCommonOptions(addCmd
|
|
104
|
+
.command("mcp <name>")
|
|
105
|
+
.description("Add an MCP server entry under tools.mcp[]")
|
|
106
|
+
.option("--command <cmd>", "argv-style command; comma-separated for multi-token")
|
|
107
|
+
.option("--health-verb <v>", "MCP verb to invoke for liveness")
|
|
108
|
+
.option("--health-timeout-ms <n>", "verb timeout in ms (default 5000 when --health-verb is set)")
|
|
109
|
+
.option("--enabled <bool>", "true|false (default true)")).action(async (name, options) => {
|
|
110
|
+
const command = options.command
|
|
111
|
+
? options.command.includes(",")
|
|
112
|
+
? options.command.split(",").map((s) => s.trim())
|
|
113
|
+
: options.command
|
|
114
|
+
: "";
|
|
115
|
+
if (!command) {
|
|
116
|
+
throw new HarnessExitError("harness add mcp: --command is required", EX_USAGE);
|
|
117
|
+
}
|
|
118
|
+
const entry = {
|
|
119
|
+
name,
|
|
120
|
+
command,
|
|
121
|
+
};
|
|
122
|
+
if (options.healthVerb !== undefined) {
|
|
123
|
+
const timeoutMs = options.healthTimeoutMs
|
|
124
|
+
? parseIntFlag(options.healthTimeoutMs, "--health-timeout-ms")
|
|
125
|
+
: 5000;
|
|
126
|
+
entry.health = {
|
|
127
|
+
verb: options.healthVerb,
|
|
128
|
+
timeout_ms: timeoutMs,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
if (options.enabled !== undefined) {
|
|
132
|
+
if (options.enabled !== "true" && options.enabled !== "false") {
|
|
133
|
+
throw new HarnessExitError(`invalid --enabled value "${options.enabled}"; expected true or false`, EX_USAGE);
|
|
134
|
+
}
|
|
135
|
+
entry.enabled = options.enabled === "true";
|
|
136
|
+
}
|
|
137
|
+
await runAdd({ type: "mcp", entry: entry }, { config: options.config, dryRun: options.dryRun });
|
|
138
|
+
});
|
|
139
|
+
addCommonOptions(addCmd
|
|
140
|
+
.command("cli <name>")
|
|
141
|
+
.description("Add a CLI tool entry under tools.cli[]")
|
|
142
|
+
.requiredOption("--binary <b>", "binary name on PATH or absolute path")
|
|
143
|
+
.option("--required", "validate fails if the binary is missing")
|
|
144
|
+
.option("--min-version <v>", "minimum semver")).action(async (name, options) => {
|
|
145
|
+
const entry = {
|
|
146
|
+
name,
|
|
147
|
+
binary: options.binary,
|
|
148
|
+
};
|
|
149
|
+
if (options.required)
|
|
150
|
+
entry.required = true;
|
|
151
|
+
if (options.minVersion !== undefined)
|
|
152
|
+
entry.min_version = options.minVersion;
|
|
153
|
+
await runAdd({ type: "cli", entry }, { config: options.config, dryRun: options.dryRun });
|
|
154
|
+
});
|
|
155
|
+
addCommonOptions(addCmd
|
|
156
|
+
.command("skill <name>")
|
|
157
|
+
.description("Enable a skill by name under tools.skills.enabled[]")).action(async (name, options) => {
|
|
158
|
+
await runAdd({ type: "skill", entry: name }, { config: options.config, dryRun: options.dryRun });
|
|
159
|
+
});
|
|
160
|
+
addCommonOptions(addCmd
|
|
161
|
+
.command("hook <name>")
|
|
162
|
+
.description("Add a hook entry under hooks[]")
|
|
163
|
+
.requiredOption("--event <e>", "runtime event (e.g. SessionStart, PreToolUse)")
|
|
164
|
+
.requiredOption("--command <c>", "shell command (executable path or script with args)")
|
|
165
|
+
.option("--match <r>", "tool-name regex filter (PreToolUse / PostToolUse only)")
|
|
166
|
+
.option("--blocking <m>", "false | soft | hard (default false)")
|
|
167
|
+
.option("--budget-ms <n>", "timeout in ms (default 30000)")).action(async (name, options) => {
|
|
168
|
+
const entry = {
|
|
169
|
+
name,
|
|
170
|
+
event: options.event,
|
|
171
|
+
command: options.command,
|
|
172
|
+
blocking: options.blocking !== undefined ? parseBlocking(options.blocking) : false,
|
|
173
|
+
};
|
|
174
|
+
if (options.match !== undefined)
|
|
175
|
+
entry.match = options.match;
|
|
176
|
+
if (options.budgetMs !== undefined) {
|
|
177
|
+
entry.budget_ms = parseIntFlag(options.budgetMs, "--budget-ms");
|
|
178
|
+
}
|
|
179
|
+
await runAdd({ type: "hook", entry }, { config: options.config, dryRun: options.dryRun });
|
|
180
|
+
});
|
|
181
|
+
program
|
|
182
|
+
.command("export")
|
|
183
|
+
.description("Emit the effective merged manifest as a single self-contained YAML " +
|
|
184
|
+
"(or JSON). --sanitize redacts /home/<user>/ paths and env values whose " +
|
|
185
|
+
"key looks credential-shaped.")
|
|
186
|
+
.option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
|
|
187
|
+
.option("--project <name>", "apply per-project overrides for this project name")
|
|
188
|
+
.option("--sanitize", "redact /home/<user>/ paths and credential-shaped env values")
|
|
189
|
+
.option("--json", "emit JSON instead of YAML")
|
|
190
|
+
.option("-o, --output <file>", "write to <file> atomically instead of stdout")
|
|
191
|
+
.action((options) => {
|
|
192
|
+
const result = exportManifest({
|
|
193
|
+
configPath: options.config,
|
|
194
|
+
project: options.project,
|
|
195
|
+
sanitize: options.sanitize,
|
|
196
|
+
json: options.json,
|
|
197
|
+
outputPath: options.output,
|
|
198
|
+
});
|
|
199
|
+
for (const w of result.warnings) {
|
|
200
|
+
stderr(`warning: ${w}\n`);
|
|
201
|
+
}
|
|
202
|
+
if (result.wroteTo === null) {
|
|
203
|
+
stdout(result.output);
|
|
204
|
+
if (!result.output.endsWith("\n"))
|
|
205
|
+
stdout("\n");
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
stderr(`wrote ${result.wroteTo}\n`);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
program
|
|
212
|
+
.command("adopt <file>")
|
|
213
|
+
.description("Capture hand-edits into the manifest. Hooks are diffed against <file> " +
|
|
214
|
+
"(today: ~/.claude/settings.json). MCP servers are ALWAYS diffed " +
|
|
215
|
+
"against the effective Claude Code registry (top-level mcpServers in " +
|
|
216
|
+
"~/.claude.json, respecting CLAUDE_CONFIG_DIR) regardless of <file> — " +
|
|
217
|
+
"Claude Code does not read <file>'s mcpServers block at runtime. " +
|
|
218
|
+
"Prompts y/N before writing.")
|
|
219
|
+
.option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
|
|
220
|
+
.option("--yes", "skip the confirmation prompt (for non-interactive use)")
|
|
221
|
+
.action(async (file, options) => {
|
|
222
|
+
const result = await adopt(file, { configPath: options.config, yes: options.yes });
|
|
223
|
+
if (result.deadSettingsMcpNames.length > 0) {
|
|
224
|
+
stderr(`⚠ ${file} has a dead \`mcpServers\` block (${result.deadSettingsMcpNames.join(", ")}); ` +
|
|
225
|
+
"Claude Code does not read this file for MCP registration — adopt diffed against the " +
|
|
226
|
+
"effective registry instead. Safe to remove by hand.\n");
|
|
227
|
+
}
|
|
228
|
+
if (result.registryReadError !== undefined) {
|
|
229
|
+
stderr(`⚠ could not read the Claude Code MCP registry: ${result.registryReadError}; ` +
|
|
230
|
+
"treated as empty for MCP drift purposes.\n");
|
|
231
|
+
}
|
|
232
|
+
if (result.outcome === "no-drift") {
|
|
233
|
+
stdout(`nothing to adopt (no drift between ${file} and ${result.manifestPath})\n`);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
if (result.outcome === "declined") {
|
|
237
|
+
stdout(`adoption declined; ${result.manifestPath} unchanged\n`);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
const parts = [];
|
|
241
|
+
if (result.hookDriftCount > 0) {
|
|
242
|
+
parts.push(`${result.hookDriftCount} hook${result.hookDriftCount === 1 ? "" : "s"}` +
|
|
243
|
+
` (${result.adoptedNames.join(", ")})`);
|
|
244
|
+
}
|
|
245
|
+
if (result.mcpDriftCount > 0) {
|
|
246
|
+
const mcpFrag = `${result.mcpDriftCount} MCP server${result.mcpDriftCount === 1 ? "" : "s"}` +
|
|
247
|
+
` (${result.adoptedMcpNames.join(", ")})`;
|
|
248
|
+
parts.push(result.replacedMcpNames.length > 0
|
|
249
|
+
? `${mcpFrag}; replaced existing manifest entry for: ${result.replacedMcpNames.join(", ")}`
|
|
250
|
+
: mcpFrag);
|
|
251
|
+
}
|
|
252
|
+
stdout(`adopted ${parts.join(" + ")} from ${result.settingsPath} into ${result.manifestPath}\n`);
|
|
253
|
+
});
|
|
254
|
+
program
|
|
255
|
+
.command("apply")
|
|
256
|
+
.description("Regenerate harness.generated/ outputs (settings.json + MEMORY.md index) " +
|
|
257
|
+
"from the manifest. Refuses to overwrite hand-edits without --overwrite-drift; " +
|
|
258
|
+
"use `harness adopt <file>` to capture them back into the manifest instead.")
|
|
259
|
+
.option("--config <path>", "manifest path (default: ~/.harness/harness.yaml; legacy fallback ~/.claude/harness.yaml)")
|
|
260
|
+
.option("--project <name>", "apply per-project overrides for this project name")
|
|
261
|
+
.option("--dry-run", "print the would-be diff + restart hints; do not write")
|
|
262
|
+
.option("--overwrite-drift", "discard any on-disk hand-edits to harness.generated/ files (prompts for `yes`; pair with --yes for non-interactive runs)")
|
|
263
|
+
.option("--yes", "with --overwrite-drift, skip the confirmation prompt (for non-interactive use)")
|
|
264
|
+
.option("--strict-lock", "refuse with exit 1 (no write) when harness.lock asset drift is detected; dry-run wins")
|
|
265
|
+
.option("--target <path>", "additionally write the generated settings.json to <path> (e.g. .claude/settings.local.json); " +
|
|
266
|
+
"claude-code only: without --runtime it implies claude-code, with --runtime codex or opencode it is refused")
|
|
267
|
+
.option("--merge", "with --target, merge into an existing target file: replaces its `hooks` key, drops `mcpServers` entries an earlier apply wrote, preserves every other key")
|
|
268
|
+
.option("--force", "with --target, overwrite an existing target file (no merge)")
|
|
269
|
+
.option("--runtime <runtime>", `policy-pack adapter runtime (${KNOWN_RUNTIMES.join(" | ")}; default: claude-code with --target, ` +
|
|
270
|
+
"otherwise the runtime of the last apply (inferred from its files for an older record), " +
|
|
271
|
+
"or claude-code when there is none; --install follows the same default). " +
|
|
272
|
+
"Selects which adapter shape policy-pack hooks expand into and which artefacts apply writes. " +
|
|
273
|
+
"`codex` emits harness.generated/codex/config.toml in place of settings.json. " +
|
|
274
|
+
"`opencode` emits harness.generated/opencode/opencode.json (MCP servers only; not auto-installed).")
|
|
275
|
+
.option("--install", "with --runtime codex, merge the generated hook block into ~/.codex/config.toml")
|
|
276
|
+
.option("--codex-config <path>", "with --runtime codex --install, override the Codex config path (default ~/.codex/config.toml)")
|
|
277
|
+
.option("--quiet", "suppress the post-apply Next-steps hint")
|
|
278
|
+
.option("--json", "emit a structured JSON summary instead of prose (implies --quiet)")
|
|
279
|
+
.action(async (options) => {
|
|
280
|
+
let runtime;
|
|
281
|
+
if (options.runtime !== undefined) {
|
|
282
|
+
if (!isRuntime(options.runtime)) {
|
|
283
|
+
stderr(`unknown --runtime ${JSON.stringify(options.runtime)}; expected one of ${KNOWN_RUNTIMES.join(", ")}\n`);
|
|
284
|
+
throw new HarnessExitError("", EX_USAGE);
|
|
285
|
+
}
|
|
286
|
+
runtime = options.runtime;
|
|
287
|
+
}
|
|
288
|
+
// --json is documented as implying --quiet. Normalize early so any
|
|
289
|
+
// future fall-through path (or new prose branch) honors it without
|
|
290
|
+
// depending on the JSON early-return below as the only chokepoint.
|
|
291
|
+
if (options.json)
|
|
292
|
+
options.quiet = true;
|
|
293
|
+
// `apply()` throws `CodexInstallRefusalError` (rather than
|
|
294
|
+
// returning a refuse `outcome`, the way `target-exists-refuse` /
|
|
295
|
+
// `drift-refuse` do) for a codex-install refusal, because the
|
|
296
|
+
// refusal is detected deep inside `planCodexConfigInstall`, before
|
|
297
|
+
// an `ApplyResult` can be assembled. Catch it here so `--json`
|
|
298
|
+
// still gets a structured error on stdout the same way every
|
|
299
|
+
// other refusal does, instead of only the plain-text message
|
|
300
|
+
// `run()`'s top-level catch would otherwise print.
|
|
301
|
+
let result;
|
|
302
|
+
try {
|
|
303
|
+
result = await apply({
|
|
304
|
+
...(options.config !== undefined ? { configPath: options.config } : {}),
|
|
305
|
+
...(options.project !== undefined ? { project: options.project } : {}),
|
|
306
|
+
...(options.dryRun ? { dryRun: true } : {}),
|
|
307
|
+
...(options.overwriteDrift ? { overwriteDrift: true } : {}),
|
|
308
|
+
...(options.yes ? { yes: true } : {}),
|
|
309
|
+
...(options.strictLock ? { strictLock: true } : {}),
|
|
310
|
+
...(options.target !== undefined ? { target: options.target } : {}),
|
|
311
|
+
...(options.merge ? { merge: true } : {}),
|
|
312
|
+
...(options.force ? { force: true } : {}),
|
|
313
|
+
...(runtime !== undefined ? { runtime } : {}),
|
|
314
|
+
...(options.install ? { installCodex: true } : {}),
|
|
315
|
+
...(options.codexConfig !== undefined
|
|
316
|
+
? { codexConfigPath: options.codexConfig }
|
|
317
|
+
: {}),
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
if (err instanceof CodexInstallRefusalError && options.json) {
|
|
322
|
+
stdout(`${JSON.stringify({ outcome: "codex-install-refuse", configPath: err.configPath, error: err.message }, null, 2)}\n`);
|
|
323
|
+
throw new HarnessExitError("", EX_FAIL);
|
|
324
|
+
}
|
|
325
|
+
throw err;
|
|
326
|
+
}
|
|
327
|
+
if (options.json) {
|
|
328
|
+
// Machine-readable: one JSON object on stdout regardless of
|
|
329
|
+
// outcome. Refusals still set the non-zero exit below; consumers
|
|
330
|
+
// should check both `outcome` in the JSON and the process exit.
|
|
331
|
+
stdout(`${JSON.stringify(result, null, 2)}\n`);
|
|
332
|
+
if (result.outcome === "target-exists-refuse" ||
|
|
333
|
+
result.outcome === "lock-drift-refuse" ||
|
|
334
|
+
result.outcome === "drift-refuse") {
|
|
335
|
+
throw new HarnessExitError("", EX_FAIL);
|
|
336
|
+
}
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
if (result.outcome === "target-exists-refuse") {
|
|
340
|
+
stderr(`target ${result.targetPath} exists; pass --merge to merge into it, or --force to overwrite\n`);
|
|
341
|
+
throw new HarnessExitError("", EX_FAIL);
|
|
342
|
+
}
|
|
343
|
+
if (result.outcome === "lock-drift-refuse") {
|
|
344
|
+
for (const d of result.lockDrift) {
|
|
345
|
+
if (d.reason === "missing") {
|
|
346
|
+
stderr(`asset drift detected: ${d.entry.path} missing since last apply\n`);
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
stderr(`asset drift detected: ${d.entry.path} changed since last apply\n`);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
stderr("--strict-lock: refusing to overwrite the lock; re-run without --strict-lock to acknowledge, or revert the upstream asset edit\n");
|
|
353
|
+
throw new HarnessExitError("", EX_FAIL);
|
|
354
|
+
}
|
|
355
|
+
if (result.outcome === "drift-refuse") {
|
|
356
|
+
for (const f of result.files) {
|
|
357
|
+
if (f.diff) {
|
|
358
|
+
stderr(`drift detected in ${f.path}:\n`);
|
|
359
|
+
stderr(f.diff);
|
|
360
|
+
if (!f.diff.endsWith("\n"))
|
|
361
|
+
stderr("\n");
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
stderr(`${DRIFT_HINT_MESSAGE}\n`);
|
|
365
|
+
throw new HarnessExitError("", EX_FAIL);
|
|
366
|
+
}
|
|
367
|
+
if (result.outcome === "drift-discarded") {
|
|
368
|
+
stdout("overwrite-drift declined; nothing written\n");
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
const changedFiles = result.files.filter((f) => f.changed);
|
|
372
|
+
// Name a reused or switched runtime before the file list, in the
|
|
373
|
+
// dry-run and the real apply alike (agent-tasks b9e6d63c).
|
|
374
|
+
const runtimeLine = formatRuntimeLine(result);
|
|
375
|
+
if (runtimeLine !== null)
|
|
376
|
+
stdout(`${runtimeLine}\n`);
|
|
377
|
+
if (result.outcome === "no-changes") {
|
|
378
|
+
stdout("no changes\n");
|
|
379
|
+
}
|
|
380
|
+
else if (result.outcome === "would-apply") {
|
|
381
|
+
stdout(`would apply ${changedFiles.length} file(s):\n`);
|
|
382
|
+
for (const f of changedFiles) {
|
|
383
|
+
stdout(` ${f.path}\n`);
|
|
384
|
+
}
|
|
385
|
+
if (result.codexConfigInstall?.changed) {
|
|
386
|
+
stdout(` ${result.codexConfigInstall.configPath} (Codex install)\n`);
|
|
387
|
+
for (const id of result.codexConfigInstall.removedHookIds) {
|
|
388
|
+
stdout(` removing hook block: ${id}\n`);
|
|
389
|
+
}
|
|
390
|
+
for (const section of result.codexConfigInstall.foreignSectionsPreserved) {
|
|
391
|
+
stdout(` preserving foreign section: ${section}\n`);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
stdout(`applied ${changedFiles.length} file(s):\n`);
|
|
397
|
+
for (const f of changedFiles) {
|
|
398
|
+
stdout(` ${f.path}\n`);
|
|
399
|
+
}
|
|
400
|
+
if (result.targetPath && (result.targetWritten || result.targetInSync)) {
|
|
401
|
+
if (result.targetWritten) {
|
|
402
|
+
if (result.targetMergeSummary) {
|
|
403
|
+
stdout(`${result.targetMergeSummary}\n`);
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
stdout(`wrote target: ${result.targetPath}\n`);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
// Idempotent re-apply: the merge was a no-op because the
|
|
411
|
+
// target already held the merged content. Report it as
|
|
412
|
+
// success, not silence.
|
|
413
|
+
stdout(`target already in sync: ${result.targetPath}\n`);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
if (result.codexConfigInstall?.written) {
|
|
417
|
+
stdout(`${result.codexConfigInstall.summary}\n`);
|
|
418
|
+
for (const id of result.codexConfigInstall.removedHookIds) {
|
|
419
|
+
stdout(` removed hook block: ${id}\n`);
|
|
420
|
+
}
|
|
421
|
+
for (const section of result.codexConfigInstall.foreignSectionsPreserved) {
|
|
422
|
+
stdout(` preserved foreign section: ${section}\n`);
|
|
423
|
+
}
|
|
424
|
+
if (result.codexConfigInstall.backupPath) {
|
|
425
|
+
stdout(`backup written to ${result.codexConfigInstall.backupPath}\n`);
|
|
426
|
+
}
|
|
427
|
+
for (const retired of result.codexConfigInstall.supersededSnapshots ?? []) {
|
|
428
|
+
stdout(`retired gate snapshot as ${retired}: the install replaced the hooks block it was taken from\n`);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
stdout(`harness.lock written to ${result.lockPath}\n`);
|
|
432
|
+
if (!options.quiet) {
|
|
433
|
+
// `formatNextSteps` collapses to the single "wired into ..."
|
|
434
|
+
// line when it receives `targetPath`. Pass it whenever the
|
|
435
|
+
// target ended this run in sync — written this run, OR
|
|
436
|
+
// already byte-identical (`targetInSync`). Gating on
|
|
437
|
+
// `targetWritten` alone misclassified an idempotent
|
|
438
|
+
// re-apply as "nothing is wired" and looped the operator
|
|
439
|
+
// through redundant apply commands.
|
|
440
|
+
// `anyChanged` softens the no-target lede when the generated
|
|
441
|
+
// manifest is already up to date (avoids over-claiming
|
|
442
|
+
// "nothing is wired" against operators who wired a target
|
|
443
|
+
// on a previous run).
|
|
444
|
+
const generatedSettingsPath = path.join(result.generatedDir, SETTINGS_BASENAME);
|
|
445
|
+
const codexConfigPath = path.join(result.generatedDir, CODEX_CONFIG_BASENAME);
|
|
446
|
+
const opencodeConfigPath = path.join(result.generatedDir, OPENCODE_CONFIG_BASENAME);
|
|
447
|
+
const anyChanged = result.files.some((f) => f.changed);
|
|
448
|
+
stdout(formatNextSteps({
|
|
449
|
+
generatedSettingsPath,
|
|
450
|
+
codexConfigPath,
|
|
451
|
+
opencodeConfigPath,
|
|
452
|
+
anyChanged,
|
|
453
|
+
runtime: result.runtime,
|
|
454
|
+
...(options.codexConfig !== undefined ? { codexInstallTarget: options.codexConfig } : {}),
|
|
455
|
+
...((result.targetWritten || result.targetInSync) && result.targetPath
|
|
456
|
+
? { targetPath: result.targetPath }
|
|
457
|
+
: {}),
|
|
458
|
+
// Pass the --install outcome through whenever one was
|
|
459
|
+
// requested this run (written or a no-op), so the codex
|
|
460
|
+
// lede reflects reality instead of always claiming
|
|
461
|
+
// "nothing is installed yet".
|
|
462
|
+
...(result.codexConfigInstall !== undefined
|
|
463
|
+
? {
|
|
464
|
+
codexInstall: {
|
|
465
|
+
configPath: result.codexConfigInstall.configPath,
|
|
466
|
+
written: result.codexConfigInstall.written,
|
|
467
|
+
...(result.codexConfigInstall.backupPath !== undefined
|
|
468
|
+
? { backupPath: result.codexConfigInstall.backupPath }
|
|
469
|
+
: {}),
|
|
470
|
+
},
|
|
471
|
+
}
|
|
472
|
+
: {}),
|
|
473
|
+
}));
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
for (const d of result.lockDrift) {
|
|
477
|
+
if (d.reason === "missing") {
|
|
478
|
+
stderr(`asset drift detected: ${d.entry.path} missing since last apply\n`);
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
stderr(`asset drift detected: ${d.entry.path} changed since last apply\n`);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
for (const w of result.warnings) {
|
|
485
|
+
stderr(`warning: ${w}\n`);
|
|
486
|
+
}
|
|
487
|
+
for (const w of result.codexConfigInstall?.snapshotWarnings ?? []) {
|
|
488
|
+
stderr(`warning: ${w}\n`);
|
|
489
|
+
}
|
|
490
|
+
for (const h of result.restartHints) {
|
|
491
|
+
stderr(`restart hint: ${h}\n`);
|
|
492
|
+
}
|
|
493
|
+
});
|
|
494
|
+
}
|
|
495
|
+
//# sourceMappingURL=register-setup-group.js.map
|