@lannguyensi/harness 0.64.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 +64 -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 -345
- 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 -713
- 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 -387
- 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 +9 -2131
- 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 -245
- 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/{delegate/register.d.ts → register-gate-group.d.ts} +1 -1
- 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 +1 -1
- package/dist/cli/register-operator-lifecycle.js +3 -100
- package/dist/cli/register-operator-lifecycle.js.map +1 -1
- 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-audit-group.d.ts → register-setup-group.d.ts} +1 -1
- 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.js +2 -19
- package/dist/cli/remove/register.js.map +1 -1
- 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.js +6 -4
- package/dist/cli/uninstall/register.js.map +1 -1
- 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 -444
- package/dist/cli/delegate/index.js.map +0 -1
- package/dist/cli/delegate/register.js +0 -90
- package/dist/cli/delegate/register.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/expire-on-tool-match.d.ts +0 -15
- package/dist/cli/doctor/expire-on-tool-match.js +0 -58
- package/dist/cli/doctor/expire-on-tool-match.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 -58
- package/dist/cli/dry-run.js +0 -283
- package/dist/cli/dry-run.js.map +0 -1
- package/dist/cli/enriched-event.d.ts +0 -35
- package/dist/cli/enriched-event.js +0 -60
- package/dist/cli/enriched-event.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 -25
- package/dist/cli/explain-action.js +0 -57
- package/dist/cli/explain-action.js.map +0 -1
- package/dist/cli/explain-policy.d.ts +0 -147
- package/dist/cli/explain-policy.js +0 -248
- 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 -438
- 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 -1022
- 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 -110
- 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/register-audit-group.js +0 -91
- package/dist/cli/register-audit-group.js.map +0 -1
- package/dist/cli/resolve-env.d.ts +0 -32
- package/dist/cli/resolve-env.js +0 -46
- 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 -27
- package/dist/cli/test-risk.js +0 -38
- 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 -643
- 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 -106
- 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 -625
- package/dist/policy-packs/builtin/understanding-before-execution/persisted-reports.js +0 -1076
- 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 -1078
- 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 -623
- package/dist/runtime/intercept.js +0 -1384
- 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 -105
- package/dist/runtime/task-providers/agent-tasks.js +0 -247
- 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
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
// `harness pack hook stay-in-scope` is an optional, informational
|
|
2
|
-
// PostToolUse integration. It reads its complete behavior from the current
|
|
3
|
-
// pack configuration so a stale generated hook safely no-ops after disable.
|
|
4
|
-
import * as fs from "node:fs";
|
|
5
|
-
import * as path from "node:path";
|
|
6
|
-
import { resolveHomeDir } from "../../runtime/home-dir.js";
|
|
7
|
-
import { toolNameMatchesAny } from "../../policy-packs/builtin/understanding-before-execution-runtime.js";
|
|
8
|
-
import { taskIdFromToolResponse } from "../../runtime/task-providers/agent-tasks.js";
|
|
9
|
-
import { evaluateStayInScopeMatch, extractConfiguredParentUrl, resolveStayInScopeConfig, } from "../../policy-packs/builtin/understanding-before-execution/stay-in-scope-config.js";
|
|
10
|
-
import { checkHookPause, loadManifestOrInjected, pickString, readStdin, resolveToolInput, } from "./hook-bootstrap.js";
|
|
11
|
-
const PACK_NAME = "understanding-before-execution";
|
|
12
|
-
export const STAY_IN_SCOPE_DISABLED_ENV = "STAY_IN_SCOPE_DISABLED";
|
|
13
|
-
export const STAY_IN_SCOPE_LOG_ENV = "STAY_IN_SCOPE_LOG";
|
|
14
|
-
export const REMINDERS_SUBDIR = "reminders";
|
|
15
|
-
export const STAY_IN_SCOPE_LOG_BASENAME = "stay-in-scope.log";
|
|
16
|
-
function noop(diagnostic, stderr, partial = {}) {
|
|
17
|
-
stderr.write(`${diagnostic}\n`);
|
|
18
|
-
return { exitCode: 0, matched: false, matchedRule: "none", logged: false, secondOrder: false, logPath: null, diagnostic, ...partial };
|
|
19
|
-
}
|
|
20
|
-
function objectValue(input, key) {
|
|
21
|
-
return typeof input === "object" && input !== null && !Array.isArray(input)
|
|
22
|
-
? input[key]
|
|
23
|
-
: undefined;
|
|
24
|
-
}
|
|
25
|
-
function extractLabels(toolInput) {
|
|
26
|
-
const labels = objectValue(toolInput, "labels");
|
|
27
|
-
return Array.isArray(labels) ? labels.filter((value) => typeof value === "string") : [];
|
|
28
|
-
}
|
|
29
|
-
function extractDescription(toolInput) {
|
|
30
|
-
const description = objectValue(toolInput, "description");
|
|
31
|
-
return typeof description === "string" ? description : "";
|
|
32
|
-
}
|
|
33
|
-
function extractTitle(toolInput) {
|
|
34
|
-
const title = objectValue(toolInput, "title");
|
|
35
|
-
return typeof title === "string" && title.length > 0 ? title : null;
|
|
36
|
-
}
|
|
37
|
-
// Reuses the shared MCP tool_response unwrap (taskIdFromToolResponse) so
|
|
38
|
-
// this hook reads the real Claude Code content-block shape the same way
|
|
39
|
-
// the active-claim tracker does, instead of a second, plain-object-only
|
|
40
|
-
// parser (harness task b5e65f5e).
|
|
41
|
-
function extractTaskId(toolInput, toolResponse) {
|
|
42
|
-
const taskId = objectValue(toolInput, "taskId");
|
|
43
|
-
if (typeof taskId === "string" && taskId.length > 0)
|
|
44
|
-
return taskId;
|
|
45
|
-
const wrappedId = taskIdFromToolResponse(toolResponse);
|
|
46
|
-
return wrappedId.length > 0 ? wrappedId : null;
|
|
47
|
-
}
|
|
48
|
-
function resolveLogPath(opts, env) {
|
|
49
|
-
if (typeof opts.logPath === "string" && opts.logPath.length > 0)
|
|
50
|
-
return opts.logPath;
|
|
51
|
-
const configured = env[STAY_IN_SCOPE_LOG_ENV];
|
|
52
|
-
if (typeof configured === "string" && configured.length > 0)
|
|
53
|
-
return configured;
|
|
54
|
-
const home = resolveHomeDir(opts.homeDir === undefined ? {} : { homeDir: opts.homeDir });
|
|
55
|
-
return path.join(home.path, REMINDERS_SUBDIR, STAY_IN_SCOPE_LOG_BASENAME);
|
|
56
|
-
}
|
|
57
|
-
function appendAuditRow(logPath, record) {
|
|
58
|
-
try {
|
|
59
|
-
fs.mkdirSync(path.dirname(logPath), { recursive: true });
|
|
60
|
-
fs.appendFileSync(logPath, `${JSON.stringify(record)}\n`, "utf8");
|
|
61
|
-
return { ok: true };
|
|
62
|
-
}
|
|
63
|
-
catch (error) {
|
|
64
|
-
return { ok: false, reason: error.message };
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
export async function runPackHookStayInScopeCli(opts = {}) {
|
|
68
|
-
const stdin = opts.stdin ?? process.stdin;
|
|
69
|
-
const stderr = opts.stderr ?? process.stderr;
|
|
70
|
-
const env = opts.env ?? process.env;
|
|
71
|
-
let event;
|
|
72
|
-
try {
|
|
73
|
-
const parsed = JSON.parse((await readStdin(stdin)).trim() || "{}");
|
|
74
|
-
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
75
|
-
return noop("harness pack hook stay-in-scope: malformed event JSON, skipping", stderr);
|
|
76
|
-
}
|
|
77
|
-
event = parsed;
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
return noop("harness pack hook stay-in-scope: malformed event JSON, skipping", stderr);
|
|
81
|
-
}
|
|
82
|
-
if (checkHookPause("stay-in-scope", stderr, opts, opts.generatedDir).paused) {
|
|
83
|
-
return noop("harness paused; stay-in-scope skipping without evaluating.", stderr);
|
|
84
|
-
}
|
|
85
|
-
if (env[STAY_IN_SCOPE_DISABLED_ENV] === "1") {
|
|
86
|
-
return noop(`harness pack hook stay-in-scope: ${STAY_IN_SCOPE_DISABLED_ENV}=1, skipping`, stderr);
|
|
87
|
-
}
|
|
88
|
-
let manifest;
|
|
89
|
-
try {
|
|
90
|
-
({ manifest } = loadManifestOrInjected(opts, opts.manifest));
|
|
91
|
-
}
|
|
92
|
-
catch (error) {
|
|
93
|
-
return noop(`harness pack hook stay-in-scope: manifest load failed (${error.message}), skipping`, stderr);
|
|
94
|
-
}
|
|
95
|
-
const declared = manifest.policy_packs.find((pack) => pack.name === (opts.pack ?? PACK_NAME));
|
|
96
|
-
const config = declared?.enabled ? resolveStayInScopeConfig(declared.config["stay_in_scope"]) : null;
|
|
97
|
-
if (config === null) {
|
|
98
|
-
return noop("harness pack hook stay-in-scope: integration absent, disabled, or invalid, skipping", stderr);
|
|
99
|
-
}
|
|
100
|
-
const toolName = pickString(event.tool_name, event.tool) ?? "";
|
|
101
|
-
if (!toolNameMatchesAny(toolName, config.tools)) {
|
|
102
|
-
return noop(`harness pack hook stay-in-scope: tool ${toolName || "(missing)"} not in watch list, skipping`, stderr);
|
|
103
|
-
}
|
|
104
|
-
const toolInput = resolveToolInput(event);
|
|
105
|
-
const labels = extractLabels(toolInput);
|
|
106
|
-
const description = extractDescription(toolInput);
|
|
107
|
-
const evaluation = evaluateStayInScopeMatch(config, labels, description);
|
|
108
|
-
if (!evaluation.matched) {
|
|
109
|
-
return noop(`harness pack hook stay-in-scope: ${toolName} payload carries no configured marker, skipping`, stderr);
|
|
110
|
-
}
|
|
111
|
-
const taskId = extractTaskId(toolInput, event.tool_response);
|
|
112
|
-
const record = {
|
|
113
|
-
ts: (opts.now ?? new Date()).toISOString(), taskId, title: extractTitle(toolInput), labels,
|
|
114
|
-
parentPrUrl: extractConfiguredParentUrl(config, description, evaluation.parentReference),
|
|
115
|
-
secondOrder: evaluation.secondOrder, matchedRule: evaluation.matchedRule,
|
|
116
|
-
};
|
|
117
|
-
const logPath = resolveLogPath(opts, env);
|
|
118
|
-
const appendResult = appendAuditRow(logPath, record);
|
|
119
|
-
const prefix = evaluation.secondOrder ? "[stay-in-scope: SECOND-ORDER]" : "[stay-in-scope]";
|
|
120
|
-
const taskIdNote = taskId === null ? "" : ` task=${taskId}`;
|
|
121
|
-
const configuredMessage = evaluation.secondOrder ? config.messages.secondOrder : config.messages.reminder;
|
|
122
|
-
stderr.write(`${prefix} follow-up created from review context${taskIdNote}. ${configuredMessage}\n`);
|
|
123
|
-
const logNote = appendResult.ok ? `; audit appended to ${logPath}` : `; audit append FAILED (${appendResult.reason})`;
|
|
124
|
-
const diagnostic = `harness pack hook stay-in-scope: matched=${evaluation.matchedRule} secondOrder=${evaluation.secondOrder}${logNote}`;
|
|
125
|
-
stderr.write(`${diagnostic}\n`);
|
|
126
|
-
return { exitCode: 0, matched: true, matchedRule: evaluation.matchedRule, logged: appendResult.ok, secondOrder: evaluation.secondOrder, logPath: appendResult.ok ? logPath : null, diagnostic };
|
|
127
|
-
}
|
|
128
|
-
//# sourceMappingURL=hook-stay-in-scope.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hook-stay-in-scope.js","sourceRoot":"","sources":["../../../src/cli/pack/hook-stay-in-scope.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { Manifest } from "../../schema/index.js";
|
|
2
|
-
import { type LoaderOptions } from "../loader.js";
|
|
3
|
-
export interface PackHookSubagentStartOptions extends LoaderOptions {
|
|
4
|
-
pack?: string;
|
|
5
|
-
generatedDir?: string;
|
|
6
|
-
stdin?: NodeJS.ReadableStream;
|
|
7
|
-
stderr?: NodeJS.WritableStream;
|
|
8
|
-
manifest?: Manifest;
|
|
9
|
-
/** Override the persisted-report directory (test injection). */
|
|
10
|
-
reportsDir?: string;
|
|
11
|
-
/** Override the issue timestamp for deterministic tests. */
|
|
12
|
-
now?: Date;
|
|
13
|
-
}
|
|
14
|
-
export interface PackHookSubagentStartResult {
|
|
15
|
-
exitCode: number;
|
|
16
|
-
/** Was an in-flight record actually written? */
|
|
17
|
-
recordWritten: boolean;
|
|
18
|
-
sessionId: string | null;
|
|
19
|
-
agentId: string | null;
|
|
20
|
-
/** Diagnostic line emitted to stderr. */
|
|
21
|
-
diagnostic: string;
|
|
22
|
-
}
|
|
23
|
-
export declare function runPackHookSubagentStartCli(opts?: PackHookSubagentStartOptions): Promise<PackHookSubagentStartResult>;
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
// `harness pack hook subagent-start` — write an in-flight record for a
|
|
2
|
-
// newly-started Agent-tool subagent (docs/decisions/2026-08-27-ug-auto-
|
|
3
|
-
// mode-approval.md "TTL, cwd, and subagents").
|
|
4
|
-
//
|
|
5
|
-
// SubagentStart fires on the PARENT session's `session_id` (subagents
|
|
6
|
-
// share it, they never get one of their own); Claude Code additionally
|
|
7
|
-
// carries `agent_id` and `agent_type` on this event. This hook consults
|
|
8
|
-
// the same operator-approval authority the PreToolUse blocker does
|
|
9
|
-
// (`checkOperatorApprovalMarkers`) and, only when it matches, copies
|
|
10
|
-
// that approval into a signed in-flight record keyed by
|
|
11
|
-
// `(session_id, agent_id)` — see inflight-records.ts's module header
|
|
12
|
-
// for why this is a COPY of authority already granted, never a new
|
|
13
|
-
// grant. When the parent holds no valid approval at spawn time, nothing
|
|
14
|
-
// is written and the subagent gets no record to present later. A matched
|
|
15
|
-
// marker whose signed report hash no longer matches any persisted report
|
|
16
|
-
// (the approved report was edited after approval, the same cross-check
|
|
17
|
-
// both PreToolUse hooks apply after a match) counts as no valid
|
|
18
|
-
// approval: the PreToolUse hooks refuse that marker, so a record minted
|
|
19
|
-
// under it would outlive the refusal and open the gate for the subagent.
|
|
20
|
-
//
|
|
21
|
-
// Never blocks: this hook has no gating role of its own (a later slice
|
|
22
|
-
// teaches the PreToolUse blocker to consult the record it produces
|
|
23
|
-
// here). Every error and refusal path resolves to exit 0 + stderr
|
|
24
|
-
// diagnostic, mirroring every other hook in this pack.
|
|
25
|
-
import { checkOperatorApprovalMarkers, defaultReportsDir, rejectMalformedAgentId, verifyMatchedMarkerReport, writeInflightRecord, } from "../../policy-packs/builtin/understanding-before-execution-runtime.js";
|
|
26
|
-
import { pickString, readStdin, resolveSubagentHookContext, } from "./hook-bootstrap.js";
|
|
27
|
-
const PACK_NAME = "understanding-before-execution";
|
|
28
|
-
const HOOK_LABEL = "harness pack hook: subagent-start";
|
|
29
|
-
function noop(diagnostic, stderr, sessionId = null, agentId = null) {
|
|
30
|
-
stderr.write(`${diagnostic}\n`);
|
|
31
|
-
return { exitCode: 0, recordWritten: false, sessionId, agentId, diagnostic };
|
|
32
|
-
}
|
|
33
|
-
export async function runPackHookSubagentStartCli(opts = {}) {
|
|
34
|
-
const stdin = opts.stdin ?? process.stdin;
|
|
35
|
-
const stderr = opts.stderr ?? process.stderr;
|
|
36
|
-
const packName = opts.pack ?? PACK_NAME;
|
|
37
|
-
const raw = await readStdin(stdin);
|
|
38
|
-
let event = {};
|
|
39
|
-
try {
|
|
40
|
-
event = JSON.parse(raw.trim() || "{}");
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
return noop(`${HOOK_LABEL}: malformed event JSON, skipping`, stderr);
|
|
44
|
-
}
|
|
45
|
-
// Pause sentinel checked before anything else, ids resolved, then pack
|
|
46
|
-
// context resolved — same as every other hook in this pack.
|
|
47
|
-
const ctxResult = resolveSubagentHookContext(HOOK_LABEL, "subagent-start", packName, event, rejectMalformedAgentId, { ...opts, stderr });
|
|
48
|
-
if (!ctxResult.ok) {
|
|
49
|
-
return noop(ctxResult.diagnostic, stderr, ctxResult.sessionId, ctxResult.agentId);
|
|
50
|
-
}
|
|
51
|
-
const { sessionId, agentId, declared, generatedDir } = ctxResult.context;
|
|
52
|
-
const agentType = pickString(event.agent_type) ?? "unknown";
|
|
53
|
-
const approval = checkOperatorApprovalMarkers(generatedDir, sessionId, declared.config, stderr);
|
|
54
|
-
if (!approval.matched) {
|
|
55
|
-
const diagnostic = `${HOOK_LABEL}: parent session ${sessionId} holds no valid approval; no in-flight record for agent ${agentId}`;
|
|
56
|
-
stderr.write(`${diagnostic}\n`);
|
|
57
|
-
return { exitCode: 0, recordWritten: false, sessionId, agentId, diagnostic };
|
|
58
|
-
}
|
|
59
|
-
// Same gate-read cross-check as both PreToolUse hooks: a marker whose
|
|
60
|
-
// signed report content is no longer on disk is not an approval, so no
|
|
61
|
-
// record may be copied from it.
|
|
62
|
-
const reportsDir = opts.reportsDir ?? defaultReportsDir();
|
|
63
|
-
const reportHash = verifyMatchedMarkerReport(reportsDir, approval);
|
|
64
|
-
if (!reportHash.ok) {
|
|
65
|
-
const diagnostic = `${HOOK_LABEL}: parent session ${sessionId} approval refused, ${reportHash.detail}; no in-flight record for agent ${agentId}`;
|
|
66
|
-
stderr.write(`${diagnostic}\n`);
|
|
67
|
-
return { exitCode: 0, recordWritten: false, sessionId, agentId, diagnostic };
|
|
68
|
-
}
|
|
69
|
-
const writeOpts = {
|
|
70
|
-
generatedDir,
|
|
71
|
-
sessionId,
|
|
72
|
-
agentId,
|
|
73
|
-
agentType,
|
|
74
|
-
// The marker that actually verified (the session marker when a task
|
|
75
|
-
// marker failed the check and the session marker behind it held).
|
|
76
|
-
parent: { ...approval, source: reportHash.source, detail: reportHash.detail },
|
|
77
|
-
};
|
|
78
|
-
if (opts.now)
|
|
79
|
-
writeOpts.now = opts.now;
|
|
80
|
-
const result = writeInflightRecord(writeOpts);
|
|
81
|
-
if (!result.ok) {
|
|
82
|
-
return noop(`${HOOK_LABEL}: writeInflightRecord failed for agent ${agentId} (${result.reason}: ${result.detail})`, stderr, sessionId, agentId);
|
|
83
|
-
}
|
|
84
|
-
const diagnostic = `${HOOK_LABEL}: wrote in-flight record for agent ${agentId} (parent=${reportHash.source})`;
|
|
85
|
-
stderr.write(`${diagnostic}\n`);
|
|
86
|
-
return { exitCode: 0, recordWritten: true, sessionId, agentId, diagnostic };
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=hook-subagent-start.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hook-subagent-start.js","sourceRoot":"","sources":["../../../src/cli/pack/hook-subagent-start.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { Manifest } from "../../schema/index.js";
|
|
2
|
-
import { type LoaderOptions } from "../loader.js";
|
|
3
|
-
export interface PackHookSubagentStopOptions extends LoaderOptions {
|
|
4
|
-
pack?: string;
|
|
5
|
-
generatedDir?: string;
|
|
6
|
-
stdin?: NodeJS.ReadableStream;
|
|
7
|
-
stderr?: NodeJS.WritableStream;
|
|
8
|
-
manifest?: Manifest;
|
|
9
|
-
}
|
|
10
|
-
export interface PackHookSubagentStopResult {
|
|
11
|
-
exitCode: number;
|
|
12
|
-
/** Was clearInflightRecord actually invoked (ids valid, pack enabled)? */
|
|
13
|
-
cleared: boolean;
|
|
14
|
-
sessionId: string | null;
|
|
15
|
-
agentId: string | null;
|
|
16
|
-
/** Diagnostic line emitted to stderr. */
|
|
17
|
-
diagnostic: string;
|
|
18
|
-
}
|
|
19
|
-
export declare function runPackHookSubagentStopCli(opts?: PackHookSubagentStopOptions): Promise<PackHookSubagentStopResult>;
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
// `harness pack hook subagent-stop` — remove the in-flight record a
|
|
2
|
-
// `subagent-start` invocation wrote for this `(session_id, agent_id)`
|
|
3
|
-
// pair (docs/decisions/2026-08-27-ug-auto-mode-approval.md "TTL, cwd,
|
|
4
|
-
// and subagents"). The subagent has finished; its copy of the parent's
|
|
5
|
-
// approval no longer has anything to authorize.
|
|
6
|
-
//
|
|
7
|
-
// Idempotent and never blocks: a missing record (never written, already
|
|
8
|
-
// cleared, or the parent never had approval to copy) is a no-op, same
|
|
9
|
-
// as `clearInflightRecord` itself. Every path resolves to exit 0 +
|
|
10
|
-
// stderr diagnostic.
|
|
11
|
-
import { clearInflightRecord, rejectMalformedAgentId, } from "../../policy-packs/builtin/understanding-before-execution-runtime.js";
|
|
12
|
-
import { readStdin, resolveSubagentHookContext } from "./hook-bootstrap.js";
|
|
13
|
-
const PACK_NAME = "understanding-before-execution";
|
|
14
|
-
const HOOK_LABEL = "harness pack hook: subagent-stop";
|
|
15
|
-
function noop(diagnostic, stderr, sessionId = null, agentId = null) {
|
|
16
|
-
stderr.write(`${diagnostic}\n`);
|
|
17
|
-
return { exitCode: 0, cleared: false, sessionId, agentId, diagnostic };
|
|
18
|
-
}
|
|
19
|
-
export async function runPackHookSubagentStopCli(opts = {}) {
|
|
20
|
-
const stdin = opts.stdin ?? process.stdin;
|
|
21
|
-
const stderr = opts.stderr ?? process.stderr;
|
|
22
|
-
const packName = opts.pack ?? PACK_NAME;
|
|
23
|
-
const raw = await readStdin(stdin);
|
|
24
|
-
let event = {};
|
|
25
|
-
try {
|
|
26
|
-
event = JSON.parse(raw.trim() || "{}");
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return noop(`${HOOK_LABEL}: malformed event JSON, skipping`, stderr);
|
|
30
|
-
}
|
|
31
|
-
const ctxResult = resolveSubagentHookContext(HOOK_LABEL, "subagent-stop", packName, event, rejectMalformedAgentId, { ...opts, stderr });
|
|
32
|
-
if (!ctxResult.ok) {
|
|
33
|
-
return noop(ctxResult.diagnostic, stderr, ctxResult.sessionId, ctxResult.agentId);
|
|
34
|
-
}
|
|
35
|
-
const { sessionId, agentId, generatedDir } = ctxResult.context;
|
|
36
|
-
clearInflightRecord(generatedDir, sessionId, agentId);
|
|
37
|
-
const diagnostic = `${HOOK_LABEL}: cleared in-flight record for agent ${agentId}`;
|
|
38
|
-
stderr.write(`${diagnostic}\n`);
|
|
39
|
-
return { exitCode: 0, cleared: true, sessionId, agentId, diagnostic };
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=hook-subagent-stop.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hook-subagent-stop.js","sourceRoot":"","sources":["../../../src/cli/pack/hook-subagent-stop.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,sEAAsE;AACtE,sEAAsE;AACtE,uEAAuE;AACvE,gDAAgD;AAChD,EAAE;AACF,wEAAwE;AACxE,sEAAsE;AACtE,mEAAmE;AACnE,qBAAqB;AAErB,OAAO,EACL,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,sEAAsE,CAAC;AAG9E,OAAO,EAAE,SAAS,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAE5E,MAAM,SAAS,GAAG,gCAAgC,CAAC;AACnD,MAAM,UAAU,GAAG,kCAAkC,CAAC;AAyBtD,SAAS,IAAI,CACX,UAAkB,EAClB,MAA6B,EAC7B,YAA2B,IAAI,EAC/B,UAAyB,IAAI;IAE7B,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC;IAChC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAAoC,EAAE;IAEtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;IAExC,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,KAAK,GAA0B,EAAE,CAAC;IACtC,IAAI,CAAC;QACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,CAA0B,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,GAAG,UAAU,kCAAkC,EAAE,MAAM,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,SAAS,GAAG,0BAA0B,CAC1C,UAAU,EACV,eAAe,EACf,QAAQ,EACR,KAAK,EACL,sBAAsB,EACtB,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CACpB,CAAC;IACF,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC;IAE/D,mBAAmB,CAAC,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,GAAG,UAAU,wCAAwC,OAAO,EAAE,CAAC;IAClF,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC;IAChC,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACxE,CAAC"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import type { Manifest } from "../../schema/index.js";
|
|
2
|
-
import { type LoaderOptions } from "../loader.js";
|
|
3
|
-
export declare const TOOL_NAME_TASK_START = "mcp__agent-tasks__task_start";
|
|
4
|
-
export declare const TOOL_NAME_TASK_FINISH = "mcp__agent-tasks__task_finish";
|
|
5
|
-
export declare const TOOL_NAME_TASK_ABANDON = "mcp__agent-tasks__task_abandon";
|
|
6
|
-
export declare const TOOL_NAME_TASKS_TRANSITION = "mcp__agent-tasks__tasks_transition";
|
|
7
|
-
export declare const TOOL_NAME_TASK_MERGE = "mcp__agent-tasks__task_merge";
|
|
8
|
-
export declare const TRACK_ACTIVE_CLAIM_TOOLS: readonly string[];
|
|
9
|
-
export interface PackHookTrackActiveClaimOptions extends LoaderOptions {
|
|
10
|
-
pack?: string;
|
|
11
|
-
generatedDir?: string;
|
|
12
|
-
stdin?: NodeJS.ReadableStream;
|
|
13
|
-
stderr?: NodeJS.WritableStream;
|
|
14
|
-
manifest?: Manifest;
|
|
15
|
-
}
|
|
16
|
-
export interface PackHookTrackActiveClaimResult {
|
|
17
|
-
exitCode: number;
|
|
18
|
-
/** Was the active-claim file written (task_start path)? */
|
|
19
|
-
claimWritten: boolean;
|
|
20
|
-
/** Was the active-claim file cleared (task_finish / abandon path)? */
|
|
21
|
-
claimCleared: boolean;
|
|
22
|
-
/** The taskId acted on, or null when the event carried none. */
|
|
23
|
-
taskId: string | null;
|
|
24
|
-
/** Diagnostic line emitted to stderr. */
|
|
25
|
-
diagnostic: string;
|
|
26
|
-
}
|
|
27
|
-
export declare function runPackHookTrackActiveClaimCli(opts?: PackHookTrackActiveClaimOptions): Promise<PackHookTrackActiveClaimResult>;
|
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
// `harness pack hook track-active-claim` — agent-tasks claim tracking.
|
|
2
|
-
//
|
|
3
|
-
// PostToolUse hook for the understanding-before-execution pack
|
|
4
|
-
// (harness/494fd1e5). Maintains a small file at
|
|
5
|
-
// `<generatedDir>/active-claim` that names the currently-claimed
|
|
6
|
-
// agent-tasks task id. The file lets `harness approve understanding`
|
|
7
|
-
// auto-resolve the task id when --task is absent, so the operator
|
|
8
|
-
// does not have to type the UUID by hand on every approval.
|
|
9
|
-
//
|
|
10
|
-
// File lifecycle:
|
|
11
|
-
// - `mcp__agent-tasks__task_start` with `tool_input.taskId` → write
|
|
12
|
-
// the taskId into the file (atomic).
|
|
13
|
-
// - `mcp__agent-tasks__task_finish` → remove the file UNLESS the
|
|
14
|
-
// resulting status is `review` (v2 semantics keep the work claim
|
|
15
|
-
// there); `mcp__agent-tasks__task_abandon` / `task_merge` → always
|
|
16
|
-
// remove it (idempotent), but ONLY when the current file already
|
|
17
|
-
// names the task id this call acted on (a release verb on an
|
|
18
|
-
// UNRELATED task id keeps the file instead of clearing it, see
|
|
19
|
-
// `releaseResult` below). The release/keep decision is made in ONE
|
|
20
|
-
// place, `claimEffectForAgentTasksTool` (`src/runtime/
|
|
21
|
-
// task-providers/agent-tasks.ts`), which this hook only presents
|
|
22
|
-
// (task c86e3c4a); the id-equality guard and the fail-safe-shape
|
|
23
|
-
// diagnostic are this hook's own presentation detail on top of that
|
|
24
|
-
// decision, not a re-derivation of it.
|
|
25
|
-
//
|
|
26
|
-
// The hook is intentionally separate from `hook-post-tool-use` because
|
|
27
|
-
// the existing marker-expiry hook fires on a configurable list of
|
|
28
|
-
// task-boundary verbs (`expire_on_tool_match`) that does NOT include
|
|
29
|
-
// `task_start`. Folding task_start in there would either expand that
|
|
30
|
-
// matcher's semantics (now "boundary + start") or require a parallel
|
|
31
|
-
// config field. A dedicated hook keeps each surface single-purpose.
|
|
32
|
-
//
|
|
33
|
-
// Failure mode mirrors `hook-post-tool-use`: every error path resolves
|
|
34
|
-
// to no-op + stderr log. The active-claim file is an ergonomic shortcut,
|
|
35
|
-
// not a security-relevant signal — `harness approve understanding`
|
|
36
|
-
// still treats explicit --task as authoritative, and falls back to
|
|
37
|
-
// session-scoped marker when no claim is resolved.
|
|
38
|
-
//
|
|
39
|
-
// Hardcoded agent-tasks tool names: the v2 contract is agent-tasks
|
|
40
|
-
// specific. Operators on Linear / JIRA can ignore this hook (the
|
|
41
|
-
// matcher will never fire for them); a config-driven extension can
|
|
42
|
-
// land later if a second tasking system asks for it.
|
|
43
|
-
//
|
|
44
|
-
// Codex parity (task cf4cdc93): this hook is now also wired on the
|
|
45
|
-
// Codex adapter (`understanding-before-execution.ts`, `runtime ===
|
|
46
|
-
// "codex"` branch), reusing this exact command — no Codex-specific
|
|
47
|
-
// CLI verb needed. The tool-name comparisons below are alias-aware
|
|
48
|
-
// (through the task-provider adapter): a Codex session can emit an
|
|
49
|
-
// MCP tool name in a variant form for the identical tool (server
|
|
50
|
-
// hyphen/underscore swap, the `mcp__server__.tool` dotted form), and
|
|
51
|
-
// the emitted Codex matcher is alias-EXPANDED at `harness apply` time
|
|
52
|
-
// (`expandCodexHookMatchPattern`) so the dispatcher DOES invoke this
|
|
53
|
-
// hook for a variant — a raw `===` here would then silently miss it,
|
|
54
|
-
// the exact bug class task a1348c89 fixed once already for the
|
|
55
|
-
// marker-expiry PostToolUse hook.
|
|
56
|
-
//
|
|
57
|
-
// Review finding on task cf4cdc93 (empirically confirmed, MEDIUM): the
|
|
58
|
-
// event envelope's field NAMES also vary across the tolerated Codex
|
|
59
|
-
// synonyms — `tool` as well as `tool_name`, `raw_input` as well as
|
|
60
|
-
// `tool_input` (`hook-codex-post-tool-use.ts`'s own doc comment and
|
|
61
|
-
// `docs/policy-packs/understanding-before-execution.md`'s wire-format
|
|
62
|
-
// block both document this). A payload shaped `{ tool, raw_input }`
|
|
63
|
-
// (or any mix) used to silently no-op here while the sibling
|
|
64
|
-
// `codex-post-tool-use` hook already handled it via its own
|
|
65
|
-
// `pickString(event.tool_name, event.tool)` / `resolveToolInput`. Now
|
|
66
|
-
// mirrored via the same shared helpers (`hook-bootstrap.ts`).
|
|
67
|
-
import { clearActiveClaim, readActiveClaim, writeActiveClaim, } from "../../policy-packs/builtin/understanding-before-execution-runtime.js";
|
|
68
|
-
import { ACTIVE_CLAIM_TOOL_NAMES, claimEffectForAgentTasksTool, describeToolResponseShape, matchesAgentTasksRuntimeVerb, taskFinishReleaseIsUnreadable, taskIdFromInput, taskIdFromToolResponse, tasksTransitionStatusFromInput, TASK_ABANDON_TOOL, TASK_FINISH_TOOL, TASK_MERGE_TOOL, TASK_START_TOOL, TASKS_TRANSITION_TOOL, } from "../../runtime/task-providers/agent-tasks.js";
|
|
69
|
-
import { resolveGeneratedDir } from "../../runtime/pending-approval.js";
|
|
70
|
-
import { checkHookPause, loadManifestOrInjected, pickString, readStdin, resolveToolInput, } from "./hook-bootstrap.js";
|
|
71
|
-
const PACK_NAME = "understanding-before-execution";
|
|
72
|
-
export const TOOL_NAME_TASK_START = TASK_START_TOOL;
|
|
73
|
-
export const TOOL_NAME_TASK_FINISH = TASK_FINISH_TOOL;
|
|
74
|
-
export const TOOL_NAME_TASK_ABANDON = TASK_ABANDON_TOOL;
|
|
75
|
-
// Legacy v1 verb: takes an explicit `status` param ("open" | "in_progress" |
|
|
76
|
-
// "review" | "done"). Only `done` is a terminal "work claim released" state
|
|
77
|
-
// in v2 semantics (per task_finish docs: "The work claim is cleared when
|
|
78
|
-
// going to done and kept when going to review"). open / review / in_progress
|
|
79
|
-
// keep the claim, so the hook treats them as no-op (PR #200, agent-tasks
|
|
80
|
-
// 9e06175f). Adding this verb closes the marker-GC gap left by PR #198,
|
|
81
|
-
// which fixed the auto-bypass but did not GC the stale markers themselves.
|
|
82
|
-
export const TOOL_NAME_TASKS_TRANSITION = TASKS_TRANSITION_TOOL;
|
|
83
|
-
export const TOOL_NAME_TASK_MERGE = TASK_MERGE_TOOL;
|
|
84
|
-
export const TRACK_ACTIVE_CLAIM_TOOLS = ACTIVE_CLAIM_TOOL_NAMES;
|
|
85
|
-
function noop(diagnostic, stderr) {
|
|
86
|
-
stderr.write(`${diagnostic}\n`);
|
|
87
|
-
return {
|
|
88
|
-
exitCode: 0,
|
|
89
|
-
claimWritten: false,
|
|
90
|
-
claimCleared: false,
|
|
91
|
-
taskId: null,
|
|
92
|
-
diagnostic,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Clear (or keep) the active-claim file after a release-effect verb
|
|
97
|
-
* (task_finish -> non-review, task_abandon, task_merge) and return the
|
|
98
|
-
* standard result shape. Shared by all three, which otherwise
|
|
99
|
-
* byte-duplicate this body.
|
|
100
|
-
*
|
|
101
|
-
* Task c86e3c4a: a release verb used to
|
|
102
|
-
* clear the marker unconditionally, so a caller holding an active-claim
|
|
103
|
-
* WORK marker for task B who then ran task_merge (or finished / abandoned)
|
|
104
|
-
* an UNRELATED task A lost marker B -- including the case of finishing a
|
|
105
|
-
* REVIEW claim on A while B's work claim is what the marker names. Fixed
|
|
106
|
-
* by reading the current marker before clearing and comparing it against
|
|
107
|
-
* the task id this call actually acted on (`tool_input.taskId`, falling
|
|
108
|
-
* back to the tool RESULT's `task.id` when the input carried none): only
|
|
109
|
-
* a match clears. A mismatch keeps the marker and reports the near-miss
|
|
110
|
-
* (`kept active-claim <B>: <verb> on <A>`) instead of silently losing it.
|
|
111
|
-
* When the current marker is absent, or the acted-on id cannot be
|
|
112
|
-
* resolved at all, the comparison is skipped and the old behaviour
|
|
113
|
-
* applies (idempotent clear-of-nothing, or "cannot prove this call is for
|
|
114
|
-
* a different task" -- both favor releasing, matching
|
|
115
|
-
* `claimEffectForAgentTasksTool`'s own fail-safe direction, see its
|
|
116
|
-
* doc comment for what that costs).
|
|
117
|
-
*
|
|
118
|
-
* Also, task c86e3c4a: when the clear is itself the
|
|
119
|
-
* classifier's fail-safe fallback for an unreadable task_finish result
|
|
120
|
-
* (rather than an intentional `done` release), the diagnostic says so by
|
|
121
|
-
* name (`unreadable tool_response, shape=...`) instead of looking
|
|
122
|
-
* identical to a normal release in the operator's stderr trail. This
|
|
123
|
-
* reads `taskFinishReleaseIsUnreadable`/`describeToolResponseShape`
|
|
124
|
-
* purely to LABEL the decision the classifier already made; it does not
|
|
125
|
-
* re-derive the decision itself.
|
|
126
|
-
*/
|
|
127
|
-
function releaseResult(toolName, toolInput, toolResponse, generatedDir, stderr) {
|
|
128
|
-
const actedOnTaskId = taskIdFromInput(toolInput) || taskIdFromToolResponse(toolResponse);
|
|
129
|
-
const currentClaim = readActiveClaim(generatedDir);
|
|
130
|
-
if (currentClaim !== null && actedOnTaskId !== "" && currentClaim !== actedOnTaskId) {
|
|
131
|
-
const diagnostic = `harness pack hook track-active-claim: kept active-claim ${currentClaim}: ${toolName} on ${actedOnTaskId}`;
|
|
132
|
-
stderr.write(`${diagnostic}\n`);
|
|
133
|
-
return {
|
|
134
|
-
exitCode: 0,
|
|
135
|
-
claimWritten: false,
|
|
136
|
-
claimCleared: false,
|
|
137
|
-
taskId: currentClaim,
|
|
138
|
-
diagnostic,
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
clearActiveClaim(generatedDir);
|
|
142
|
-
const unreadable = matchesAgentTasksRuntimeVerb(toolName, ["task_finish"]) &&
|
|
143
|
-
taskFinishReleaseIsUnreadable(toolResponse);
|
|
144
|
-
const diagnostic = unreadable
|
|
145
|
-
? `harness pack hook track-active-claim: cleared active-claim after ${toolName} (unreadable tool_response, shape=${describeToolResponseShape(toolResponse)}, fail-safe release)`
|
|
146
|
-
: `harness pack hook track-active-claim: cleared active-claim after ${toolName}`;
|
|
147
|
-
stderr.write(`${diagnostic}\n`);
|
|
148
|
-
return {
|
|
149
|
-
exitCode: 0,
|
|
150
|
-
claimWritten: false,
|
|
151
|
-
claimCleared: true,
|
|
152
|
-
taskId: actedOnTaskId === "" ? null : actedOnTaskId,
|
|
153
|
-
diagnostic,
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
export async function runPackHookTrackActiveClaimCli(opts = {}) {
|
|
157
|
-
const stdin = opts.stdin ?? process.stdin;
|
|
158
|
-
const stderr = opts.stderr ?? process.stderr;
|
|
159
|
-
const packName = opts.pack ?? PACK_NAME;
|
|
160
|
-
const raw = await readStdin(stdin);
|
|
161
|
-
let event = {};
|
|
162
|
-
try {
|
|
163
|
-
event = JSON.parse(raw.trim() || "{}");
|
|
164
|
-
}
|
|
165
|
-
catch {
|
|
166
|
-
return noop("harness pack hook track-active-claim: malformed event JSON, skipping", stderr);
|
|
167
|
-
}
|
|
168
|
-
// Pause sentinel — skip claim-file mutations while paused.
|
|
169
|
-
if (checkHookPause("track-active-claim", stderr, opts, opts.generatedDir).paused) {
|
|
170
|
-
return noop("harness paused; track-active-claim skipping without evaluating.", stderr);
|
|
171
|
-
}
|
|
172
|
-
const toolName = pickString(event.tool_name, event.tool) ?? "";
|
|
173
|
-
if (toolName === "") {
|
|
174
|
-
return noop("harness pack hook track-active-claim: missing tool_name, skipping", stderr);
|
|
175
|
-
}
|
|
176
|
-
// Loader gate: pack must exist and be enabled. Mirrors the same
|
|
177
|
-
// structure as hook-post-tool-use so a single disabled-pack opt-out
|
|
178
|
-
// suppresses BOTH hooks.
|
|
179
|
-
let manifest;
|
|
180
|
-
let manifestPath;
|
|
181
|
-
try {
|
|
182
|
-
({ manifest, manifestPath } = loadManifestOrInjected(opts, opts.manifest));
|
|
183
|
-
}
|
|
184
|
-
catch (err) {
|
|
185
|
-
return noop(`harness pack hook track-active-claim: manifest load failed (${err.message}), skipping`, stderr);
|
|
186
|
-
}
|
|
187
|
-
const declared = manifest.policy_packs.find((p) => p.name === packName);
|
|
188
|
-
if (!declared) {
|
|
189
|
-
return noop(`harness pack hook track-active-claim: pack "${packName}" not declared in manifest, skipping`, stderr);
|
|
190
|
-
}
|
|
191
|
-
if (!declared.enabled) {
|
|
192
|
-
return noop(`harness pack hook track-active-claim: pack "${packName}" is enabled:false, skipping`, stderr);
|
|
193
|
-
}
|
|
194
|
-
const generatedDir = opts.generatedDir ??
|
|
195
|
-
(manifestPath !== undefined
|
|
196
|
-
? resolveGeneratedDir({
|
|
197
|
-
...(opts.homeDir !== undefined ? { homeDir: opts.homeDir } : {}),
|
|
198
|
-
manifestPath,
|
|
199
|
-
})
|
|
200
|
-
: undefined);
|
|
201
|
-
if (generatedDir === undefined) {
|
|
202
|
-
return noop("harness pack hook track-active-claim: generatedDir unresolvable, skipping", stderr);
|
|
203
|
-
}
|
|
204
|
-
const toolInput = resolveToolInput(event);
|
|
205
|
-
const taskId = taskIdFromInput(toolInput);
|
|
206
|
-
// Single decider: claimEffectForAgentTasksTool (agent-tasks.ts) reads
|
|
207
|
-
// the tool RESULT for task_finish (task.status) to tell a finish that
|
|
208
|
-
// landed on `review` (work claim kept) apart from `done`/anything else
|
|
209
|
-
// (released); task_abandon and task_merge always release; task_start
|
|
210
|
-
// always acquires. This hook only presents that decision below, it
|
|
211
|
-
// does not re-derive it (task c86e3c4a).
|
|
212
|
-
const claimEffect = claimEffectForAgentTasksTool(toolName, toolInput, event.tool_response);
|
|
213
|
-
if (claimEffect === "acquire") {
|
|
214
|
-
if (taskId === "") {
|
|
215
|
-
return noop(`harness pack hook track-active-claim: task_start without tool_input.taskId, skipping`, stderr);
|
|
216
|
-
}
|
|
217
|
-
try {
|
|
218
|
-
writeActiveClaim(generatedDir, taskId);
|
|
219
|
-
}
|
|
220
|
-
catch (err) {
|
|
221
|
-
return noop(`harness pack hook track-active-claim: writeActiveClaim failed for ${taskId}: ${err.message}`, stderr);
|
|
222
|
-
}
|
|
223
|
-
const diagnostic = `harness pack hook track-active-claim: wrote active-claim for ${taskId}`;
|
|
224
|
-
stderr.write(`${diagnostic}\n`);
|
|
225
|
-
return {
|
|
226
|
-
exitCode: 0,
|
|
227
|
-
claimWritten: true,
|
|
228
|
-
claimCleared: false,
|
|
229
|
-
taskId,
|
|
230
|
-
diagnostic,
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
if (claimEffect === "release" &&
|
|
234
|
-
!matchesTransition(toolName)) {
|
|
235
|
-
return releaseResult(toolName, toolInput, event.tool_response, generatedDir, stderr);
|
|
236
|
-
}
|
|
237
|
-
if (matchesAgentTasksRuntimeVerb(toolName, ["task_finish"])) {
|
|
238
|
-
// claimEffect is "none" here (a "release" task_finish already
|
|
239
|
-
// returned above): the decider only returns "none" for task_finish
|
|
240
|
-
// when the resulting status was `review`.
|
|
241
|
-
const diagnostic = `harness pack hook track-active-claim: kept active-claim after ${toolName} (resulting status=review)`;
|
|
242
|
-
stderr.write(`${diagnostic}\n`);
|
|
243
|
-
return {
|
|
244
|
-
exitCode: 0,
|
|
245
|
-
claimWritten: false,
|
|
246
|
-
claimCleared: false,
|
|
247
|
-
taskId: taskId === "" ? null : taskId,
|
|
248
|
-
diagnostic,
|
|
249
|
-
};
|
|
250
|
-
}
|
|
251
|
-
if (matchesTransition(toolName)) {
|
|
252
|
-
const status = tasksTransitionStatusFromInput(toolInput);
|
|
253
|
-
if (claimEffect !== "release") {
|
|
254
|
-
// open / in_progress / review keep the work claim per v2 semantics
|
|
255
|
-
// (see task_finish docs). Malformed / missing status also falls
|
|
256
|
-
// here, since we cannot prove the agent meant to release.
|
|
257
|
-
return noop(`harness pack hook track-active-claim: tasks_transition status=${status || "(missing)"} keeps claim, skipping`, stderr);
|
|
258
|
-
}
|
|
259
|
-
clearActiveClaim(generatedDir);
|
|
260
|
-
const diagnostic = `harness pack hook track-active-claim: cleared active-claim after tasks_transition status=${status}`;
|
|
261
|
-
stderr.write(`${diagnostic}\n`);
|
|
262
|
-
return {
|
|
263
|
-
exitCode: 0,
|
|
264
|
-
claimWritten: false,
|
|
265
|
-
claimCleared: true,
|
|
266
|
-
taskId: taskId === "" ? null : taskId,
|
|
267
|
-
diagnostic,
|
|
268
|
-
};
|
|
269
|
-
}
|
|
270
|
-
return noop(`harness pack hook track-active-claim: tool ${toolName} not tracked, skipping`, stderr);
|
|
271
|
-
}
|
|
272
|
-
function matchesTransition(toolName) {
|
|
273
|
-
return matchesAgentTasksRuntimeVerb(toolName, ["tasks_transition"]);
|
|
274
|
-
}
|
|
275
|
-
//# sourceMappingURL=hook-track-active-claim.js.map
|