@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
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
// Toolchain-parity doctor section (task 13919613, doctor companion to
|
|
2
|
-
// `harness session-start toolchain-parity`). Reuses the Collector +
|
|
3
|
-
// Comparator core straight from src/cli/session-start/toolchain-parity.ts
|
|
4
|
-
// (`collectLocalSnapshot`, `compareToPeer`, `parseSnapshotJson`,
|
|
5
|
-
// `formatSnapshotAge`, the real collectors, `sanitizeProfileName`,
|
|
6
|
-
// `defaultMachineStateDir`) — see that module's header for the full
|
|
7
|
-
// rationale of what each collected field means and how a peer comparison
|
|
8
|
-
// is computed. No comparison logic is re-implemented here.
|
|
9
|
-
//
|
|
10
|
-
// Unlike the SessionStart producer, this check is READ-ONLY: it never
|
|
11
|
-
// writes a snapshot file (that stays the producer's job — the thing that
|
|
12
|
-
// actually keeps the machine-state directory populated for every OTHER
|
|
13
|
-
// machine to compare against) and never touches the ledger. It only
|
|
14
|
-
// answers "if I compared my current live toolchain against whatever peer
|
|
15
|
-
// snapshots already exist, right now, what would I see?" — an on-demand
|
|
16
|
-
// read of the same comparison SessionStart runs automatically.
|
|
17
|
-
//
|
|
18
|
-
// Advisory only: drift is always a warning, never an error, and this is
|
|
19
|
-
// not any kind of gate (constraint carried over verbatim from the
|
|
20
|
-
// producer's own contract).
|
|
21
|
-
import * as fs from "node:fs";
|
|
22
|
-
import * as os from "node:os";
|
|
23
|
-
import * as path from "node:path";
|
|
24
|
-
import { collectLocalSnapshot, compareToPeer, defaultMachineStateDir, formatSnapshotAge, parseSnapshotJson, realNodeVersionSpawn, realNpmGlobalsSpawn, realReadMcpServerNames, realReadOwKitVersion, sanitizeProfileName, } from "../session-start/toolchain-parity.js";
|
|
25
|
-
// Same ceilings as the producer's own defaults (see that module's
|
|
26
|
-
// timeout-constants comment for the full budget derivation) — doctor
|
|
27
|
-
// pays the same worst-case spawn cost when it actually collects.
|
|
28
|
-
const DEFAULT_NODE_TIMEOUT_MS = 2_000;
|
|
29
|
-
const DEFAULT_NPM_GLOBALS_TIMEOUT_MS = 4_000;
|
|
30
|
-
/**
|
|
31
|
-
* A peer JSON filename (minus its `.json` suffix) is untrusted,
|
|
32
|
-
* cross-machine-synced content (agent-memory-sync populates this
|
|
33
|
-
* directory from other machines) — the same class of content the
|
|
34
|
-
* producer's `note()` choke point CR/LF-strips before ever reaching a
|
|
35
|
-
* stderr line (task c1b5ade5 R2b). This module hands its section back as
|
|
36
|
-
* STRUCTURED data (profile strings, drift `message` strings assembled by
|
|
37
|
-
* the reused `compareToPeer`), so the equivalent choke point lives at the
|
|
38
|
-
* doctor FORMAT layer (`formatToolchainParitySection` in format.ts) —
|
|
39
|
-
* every string this section produces that could carry a peer-controlled
|
|
40
|
-
* value gets CR/LF-stripped there, at the point it actually becomes
|
|
41
|
-
* terminal output, not here.
|
|
42
|
-
*/
|
|
43
|
-
function peerLabelFromFileName(fileName) {
|
|
44
|
-
return fileName.replace(/\.json$/, "") || fileName;
|
|
45
|
-
}
|
|
46
|
-
export async function runDoctorToolchainParity(manifest, opts = {}) {
|
|
47
|
-
const config = manifest.toolchain_parity;
|
|
48
|
-
const now = opts.now ?? new Date();
|
|
49
|
-
const cwd = opts.cwd ?? process.cwd();
|
|
50
|
-
const machineStateDir = config.machine_state_dir ?? defaultMachineStateDir();
|
|
51
|
-
const profile = config.profile ?? sanitizeProfileName(os.hostname());
|
|
52
|
-
const sanitizedProfile = sanitizeProfileName(profile);
|
|
53
|
-
const ownFileName = `${sanitizedProfile}.json`;
|
|
54
|
-
const workspaceRoot = config.workspace_root ?? cwd;
|
|
55
|
-
const noPeers = (message) => ({
|
|
56
|
-
status: "no-peers",
|
|
57
|
-
message,
|
|
58
|
-
profile,
|
|
59
|
-
peers: [],
|
|
60
|
-
driftTotal: 0,
|
|
61
|
-
unparseablePeers: [],
|
|
62
|
-
});
|
|
63
|
-
// Peer-existence check runs BEFORE any collection: there is nothing to
|
|
64
|
-
// compare the local live snapshot against without at least one peer
|
|
65
|
-
// file, so this order avoids paying the node/npm spawn cost (and, in
|
|
66
|
-
// `--shallow` mode, avoids the spawn-skip branch entirely having to be
|
|
67
|
-
// reached) in the common "first machine, no peer has run session-start
|
|
68
|
-
// toolchain-parity yet" case.
|
|
69
|
-
let entries;
|
|
70
|
-
try {
|
|
71
|
-
entries = fs.readdirSync(machineStateDir);
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
return noPeers(`no peer snapshots found (machine-state dir ${machineStateDir} does not exist yet); ` +
|
|
75
|
-
"normal for the first machine, or before any peer has run `harness session-start toolchain-parity`");
|
|
76
|
-
}
|
|
77
|
-
const peerFiles = entries.filter((name) => name.endsWith(".json") && name !== ownFileName).sort();
|
|
78
|
-
if (peerFiles.length === 0) {
|
|
79
|
-
return noPeers(`no peer snapshots found in ${machineStateDir}; nothing to compare (normal for the first ` +
|
|
80
|
-
"machine, or before any peer has run `harness session-start toolchain-parity`)");
|
|
81
|
-
}
|
|
82
|
-
if (opts.shallow) {
|
|
83
|
-
return {
|
|
84
|
-
status: "skipped",
|
|
85
|
-
message: "harness doctor --shallow does not collect a live toolchain snapshot to compare",
|
|
86
|
-
profile,
|
|
87
|
-
peers: [],
|
|
88
|
-
driftTotal: 0,
|
|
89
|
-
unparseablePeers: [],
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
const runNodeVersion = opts.runNodeVersion ?? realNodeVersionSpawn;
|
|
93
|
-
const runNpmGlobals = opts.runNpmGlobals ?? realNpmGlobalsSpawn;
|
|
94
|
-
const readOwKitVersion = opts.readOwKitVersion ?? realReadOwKitVersion;
|
|
95
|
-
const readMcpServerNames = opts.readMcpServerNames ?? realReadMcpServerNames;
|
|
96
|
-
const { snapshot: localSnapshot } = await collectLocalSnapshot({
|
|
97
|
-
profile,
|
|
98
|
-
now,
|
|
99
|
-
workspaceRoot,
|
|
100
|
-
nodeTimeoutMs: opts.nodeTimeoutMs ?? DEFAULT_NODE_TIMEOUT_MS,
|
|
101
|
-
npmTimeoutMs: opts.npmTimeoutMs ?? DEFAULT_NPM_GLOBALS_TIMEOUT_MS,
|
|
102
|
-
runNodeVersion,
|
|
103
|
-
runNpmGlobals,
|
|
104
|
-
readOwKitVersion,
|
|
105
|
-
readMcpServerNames,
|
|
106
|
-
});
|
|
107
|
-
const peers = [];
|
|
108
|
-
const unparseablePeers = [];
|
|
109
|
-
let driftTotal = 0;
|
|
110
|
-
for (const fileName of peerFiles) {
|
|
111
|
-
const filePath = path.join(machineStateDir, fileName);
|
|
112
|
-
let raw;
|
|
113
|
-
try {
|
|
114
|
-
raw = fs.readFileSync(filePath, "utf8");
|
|
115
|
-
}
|
|
116
|
-
catch {
|
|
117
|
-
unparseablePeers.push(peerLabelFromFileName(fileName));
|
|
118
|
-
continue;
|
|
119
|
-
}
|
|
120
|
-
const parsed = parseSnapshotJson(raw);
|
|
121
|
-
if (!parsed.ok) {
|
|
122
|
-
unparseablePeers.push(peerLabelFromFileName(fileName));
|
|
123
|
-
continue;
|
|
124
|
-
}
|
|
125
|
-
const comparison = compareToPeer(localSnapshot, parsed.snapshot, now);
|
|
126
|
-
driftTotal += comparison.drift.length;
|
|
127
|
-
peers.push({
|
|
128
|
-
peerProfile: comparison.peerProfile,
|
|
129
|
-
status: comparison.drift.length === 0 ? "ok" : "drift",
|
|
130
|
-
driftCount: comparison.drift.length,
|
|
131
|
-
ageMs: comparison.ageMs,
|
|
132
|
-
ageLabel: formatSnapshotAge(comparison.ageMs),
|
|
133
|
-
drift: comparison.drift,
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
if (peers.length === 0) {
|
|
137
|
-
return {
|
|
138
|
-
...noPeers(`no comparable peer snapshots (all ${peerFiles.length} peer file(s) in ${machineStateDir} ` +
|
|
139
|
-
"were unreadable/corrupt)"),
|
|
140
|
-
unparseablePeers,
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
return {
|
|
144
|
-
status: driftTotal === 0 ? "ok" : "drift",
|
|
145
|
-
message: driftTotal === 0
|
|
146
|
-
? `toolchain parity ok against ${peers.length} peer(s)`
|
|
147
|
-
: `${driftTotal} drift item(s) found across ${peers.length} peer(s)`,
|
|
148
|
-
profile,
|
|
149
|
-
peers,
|
|
150
|
-
driftTotal,
|
|
151
|
-
unparseablePeers,
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
//# sourceMappingURL=toolchain-parity.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toolchain-parity.js","sourceRoot":"","sources":["../../../src/cli/doctor/toolchain-parity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
/** Default doctor window when `--recent-sessions` is not passed. */
|
|
2
|
-
export declare const DEFAULT_RECENT_SESSIONS = 20;
|
|
3
|
-
export interface AutoApprovalListingEntry {
|
|
4
|
-
sessionId: string;
|
|
5
|
-
mode: string;
|
|
6
|
-
harness: string;
|
|
7
|
-
approvedAt: string;
|
|
8
|
-
}
|
|
9
|
-
export interface UgAutoApprovalsSection {
|
|
10
|
-
/** Whether `<generatedDir>/.approvals/` exists at all. */
|
|
11
|
-
approvalsDirPresent: boolean;
|
|
12
|
-
/** The `recentSessions` window that was applied. */
|
|
13
|
-
windowSize: number;
|
|
14
|
-
/** Auto approvals among the newest `windowSize` session markers. */
|
|
15
|
-
autoApprovedCount: number;
|
|
16
|
-
/** Per-mode breakdown of `autoApprovedCount` (e.g. `{bypassPermissions: 3}`). */
|
|
17
|
-
byMode: Record<string, number>;
|
|
18
|
-
/** Per-harness breakdown of `autoApprovedCount` (e.g. `{"claude-code": 3}`). */
|
|
19
|
-
byHarness: Record<string, number>;
|
|
20
|
-
/** `(sessionId, mode, approvedAt)` for each auto approval in the window, newest first. */
|
|
21
|
-
entries: AutoApprovalListingEntry[];
|
|
22
|
-
/**
|
|
23
|
-
* Session markers whose body could not be read as JSON with a
|
|
24
|
-
* parseable `approvedAt` (corrupt file, non-JSON content, missing
|
|
25
|
-
* `approvedAt`). Excluded from the window (there is no timestamp to
|
|
26
|
-
* sort them by) and never counted as auto approvals; surfaced as a
|
|
27
|
-
* single summary count instead of per-file noise.
|
|
28
|
-
*/
|
|
29
|
-
unreadableCount: number;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Build the auto-approval listing + last-N metric. Pure filesystem read;
|
|
33
|
-
* never throws for ordinary "nothing to see" states (missing
|
|
34
|
-
* `.approvals/`, empty directory, every marker unreadable) — those all
|
|
35
|
-
* resolve to an empty-ish section rather than an exception, mirroring
|
|
36
|
-
* the rest of doctor's read-only checks.
|
|
37
|
-
*/
|
|
38
|
-
export declare function buildUgAutoApprovals(generatedDir: string, opts: {
|
|
39
|
-
recentSessions: number;
|
|
40
|
-
}): UgAutoApprovalsSection;
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
// Doctor visibility half of ADR docs/decisions/2026-08-27-ug-auto-mode-approval.md
|
|
2
|
-
// slice 1 (agent-tasks 74b4b17d): the "auto approvals in the last N
|
|
3
|
-
// sessions" listing named in the ADR's "Audit and doctor" section and
|
|
4
|
-
// slice 1 acceptance criterion 7.
|
|
5
|
-
//
|
|
6
|
-
// Scans `<generatedDir>/.approvals/` for SESSION markers (skips the
|
|
7
|
-
// per-task markers named `task-<id>` and the branch-protection markers
|
|
8
|
-
// named `branch-protection-<sid>`, neither of which is a session
|
|
9
|
-
// approval), sorts the readable ones newest-first by `approvedAt`,
|
|
10
|
-
// takes the newest `recentSessions` of them, and reports how many of
|
|
11
|
-
// THOSE were minted by the auto path (`approvedBy` starting with
|
|
12
|
-
// `auto-mode:`, see auto-approve.ts's `parseAutoApprovedBy`).
|
|
13
|
-
//
|
|
14
|
-
// This is an AUDIT SURFACE, not a security check: it never verifies a
|
|
15
|
-
// marker's HMAC signature (that is `checkApprovalMarker`'s job at gate
|
|
16
|
-
// time; a forged marker still gets rejected there regardless of what
|
|
17
|
-
// this listing shows) and it never blocks or writes anything.
|
|
18
|
-
import * as path from "node:path";
|
|
19
|
-
import { readJsonDirEntriesRejectingSymlinks } from "../../io/read-json-dir-entries.js";
|
|
20
|
-
import { BRANCH_PROTECTION_MARKER_PREFIX } from "../../policy-packs/builtin/branch-protection-runtime.js";
|
|
21
|
-
import { APPROVAL_MARKER_DIRNAME, APPROVAL_MARKER_TASK_PREFIX, parseAutoApprovedBy, } from "../../policy-packs/builtin/understanding-before-execution/index.js";
|
|
22
|
-
/** Default doctor window when `--recent-sessions` is not passed. */
|
|
23
|
-
export const DEFAULT_RECENT_SESSIONS = 20;
|
|
24
|
-
function emptySection(windowSize) {
|
|
25
|
-
return {
|
|
26
|
-
approvalsDirPresent: false,
|
|
27
|
-
windowSize,
|
|
28
|
-
autoApprovedCount: 0,
|
|
29
|
-
byMode: {},
|
|
30
|
-
byHarness: {},
|
|
31
|
-
entries: [],
|
|
32
|
-
unreadableCount: 0,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Build the auto-approval listing + last-N metric. Pure filesystem read;
|
|
37
|
-
* never throws for ordinary "nothing to see" states (missing
|
|
38
|
-
* `.approvals/`, empty directory, every marker unreadable) — those all
|
|
39
|
-
* resolve to an empty-ish section rather than an exception, mirroring
|
|
40
|
-
* the rest of doctor's read-only checks.
|
|
41
|
-
*/
|
|
42
|
-
export function buildUgAutoApprovals(generatedDir, opts) {
|
|
43
|
-
const windowSize = opts.recentSessions;
|
|
44
|
-
const dir = path.join(generatedDir, APPROVAL_MARKER_DIRNAME);
|
|
45
|
-
// A symlink / non-regular / raced-away entry is not a session marker this
|
|
46
|
-
// listing owns an opinion about; the shared reader skips it silently
|
|
47
|
-
// rather than counting it as "unreadable" (that count is for a FILE we
|
|
48
|
-
// expected to be a marker but could not parse).
|
|
49
|
-
const { dirPresent, entries: readable, unreadableCount } = readJsonDirEntriesRejectingSymlinks(dir, {
|
|
50
|
-
skip: (name) => name.startsWith(APPROVAL_MARKER_TASK_PREFIX) || name.startsWith(BRANCH_PROTECTION_MARKER_PREFIX),
|
|
51
|
-
parse: (raw, name) => {
|
|
52
|
-
if (raw === null || typeof raw !== "object" || Array.isArray(raw))
|
|
53
|
-
return null;
|
|
54
|
-
const obj = raw;
|
|
55
|
-
const approvedAt = obj["approvedAt"];
|
|
56
|
-
if (typeof approvedAt !== "string" || Number.isNaN(Date.parse(approvedAt)))
|
|
57
|
-
return null;
|
|
58
|
-
return { sessionId: name, approvedAt, approvedBy: obj["approvedBy"] };
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
if (!dirPresent)
|
|
62
|
-
return emptySection(windowSize);
|
|
63
|
-
readable.sort((a, b) => Date.parse(b.approvedAt) - Date.parse(a.approvedAt));
|
|
64
|
-
const windowed = readable.slice(0, windowSize);
|
|
65
|
-
const byMode = {};
|
|
66
|
-
const byHarness = {};
|
|
67
|
-
const entries = [];
|
|
68
|
-
for (const m of windowed) {
|
|
69
|
-
const parsedAuto = parseAutoApprovedBy(m.approvedBy);
|
|
70
|
-
if (parsedAuto === null)
|
|
71
|
-
continue;
|
|
72
|
-
byMode[parsedAuto.mode] = (byMode[parsedAuto.mode] ?? 0) + 1;
|
|
73
|
-
byHarness[parsedAuto.harness] = (byHarness[parsedAuto.harness] ?? 0) + 1;
|
|
74
|
-
entries.push({
|
|
75
|
-
sessionId: m.sessionId,
|
|
76
|
-
mode: parsedAuto.mode,
|
|
77
|
-
harness: parsedAuto.harness,
|
|
78
|
-
approvedAt: m.approvedAt,
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
return {
|
|
82
|
-
approvalsDirPresent: true,
|
|
83
|
-
windowSize,
|
|
84
|
-
autoApprovedCount: entries.length,
|
|
85
|
-
byMode,
|
|
86
|
-
byHarness,
|
|
87
|
-
entries,
|
|
88
|
-
unreadableCount,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
//# sourceMappingURL=ug-auto-approvals.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ug-auto-approvals.js","sourceRoot":"","sources":["../../../src/cli/doctor/ug-auto-approvals.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export interface UgDelegationsSection {
|
|
2
|
-
/** Whether `<generatedDir>/.delegations/` exists at all. */
|
|
3
|
-
delegationsDirPresent: boolean;
|
|
4
|
-
/** Delegation files found in `.delegations/`, readable or not. */
|
|
5
|
-
total: number;
|
|
6
|
-
/** Of `total`, how many parsed with an `expires` segment in the past. */
|
|
7
|
-
expired: number;
|
|
8
|
-
/** Of `total`, how many were not valid JSON, or failed `parseDelegationApprovedBy`. */
|
|
9
|
-
unreadable: number;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Build the delegations-on-disk doctor metric. Pure filesystem read;
|
|
13
|
-
* never throws for "nothing to see" states (missing `.delegations/`,
|
|
14
|
-
* empty directory, every file unreadable), those all resolve to a
|
|
15
|
-
* zero-ish section, mirroring `buildUgAutoApprovals`. `total`/`expired`/
|
|
16
|
-
* `unreadable` read `0` for both an EMPTY and a MISSING directory; only
|
|
17
|
-
* `delegationsDirPresent` tells them apart, the same way
|
|
18
|
-
* `approvalsDirPresent` does for `buildUgAutoApprovals`, doctor's
|
|
19
|
-
* render layer uses it to stay silent when there is truly nothing on
|
|
20
|
-
* disk (`format.ts`'s own "no line for a check that found nothing"
|
|
21
|
-
* convention) while still rendering the zero-count line for a
|
|
22
|
-
* `harness delegate`-touched, now-empty directory.
|
|
23
|
-
*/
|
|
24
|
-
export declare function buildUgDelegations(generatedDir: string, opts?: {
|
|
25
|
-
now?: Date;
|
|
26
|
-
}): UgDelegationsSection;
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
// Doctor visibility for slice 3 delegations (ADR
|
|
2
|
-
// docs/decisions/2026-08-27-ug-auto-mode-approval.md, "Audit and
|
|
3
|
-
// doctor", agent-tasks 37ad0b05): "delegations on disk: <count>
|
|
4
|
-
// (<count> expired)" from `<generatedDir>/.delegations/`, distinct from
|
|
5
|
-
// the `.approvals/` auto-approval listing in `ug-auto-approvals.ts`.
|
|
6
|
-
//
|
|
7
|
-
// SEPARATE DIRECTORY, DELIBERATELY: a delegation never lands in
|
|
8
|
-
// `.approvals/` (delegation-markers.ts's module header), so this scan
|
|
9
|
-
// reads `DELEGATION_MARKER_DIRNAME` (".delegations") only and never
|
|
10
|
-
// touches the approvals directory `ug-auto-approvals.ts` owns. Mirrors
|
|
11
|
-
// that module's read-only-audit shape (no signature verification here
|
|
12
|
-
// either; a forged delegation still gets rejected by the dedicated
|
|
13
|
-
// verifier at gate time, `delegation-markers.ts`'s `verifyDelegation`)
|
|
14
|
-
// but does not share its code: the two scans read different
|
|
15
|
-
// directories, filter differently (no task-marker / branch-protection
|
|
16
|
-
// prefix skip here), and count differently (an approval count vs. an
|
|
17
|
-
// expiry count), so a shared helper would mostly be parameters threading
|
|
18
|
-
// through an otherwise-empty shell. `npm run check:duplication` is the
|
|
19
|
-
// backstop if that stops being true.
|
|
20
|
-
import * as fs from "node:fs";
|
|
21
|
-
import * as path from "node:path";
|
|
22
|
-
import { readRegularFileRejectingSymlink } from "../../io/read-regular-file.js";
|
|
23
|
-
import { safeJsonParse } from "../../io/safe-json-parse.js";
|
|
24
|
-
import { DELEGATION_MARKER_DIRNAME, parseDelegationApprovedBy, } from "../../policy-packs/builtin/understanding-before-execution/index.js";
|
|
25
|
-
function emptySection() {
|
|
26
|
-
return { delegationsDirPresent: false, total: 0, expired: 0, unreadable: 0 };
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* A delegation filename is always a session id: a UUID handed out by
|
|
30
|
-
* Claude Code or Codex, or (in this repo's own test fixtures) a short
|
|
31
|
-
* alnum/hyphen placeholder. Neither ever contains a literal `.` or
|
|
32
|
-
* starts with one. Filtering on that BEFORE the read is what keeps
|
|
33
|
-
* filesystem debris that happens to sit next to `.delegations/` files
|
|
34
|
-
* (macOS's `.DS_Store`, a stray `foo.txt`) from counting toward `total`
|
|
35
|
-
* at all: without it, such a file reads as valid-but-not-JSON and rolls
|
|
36
|
-
* into `unreadable`, which flips this metric's doctor line from
|
|
37
|
-
* informational (ℹ) straight to a WARNING (⚠) for debris that was never
|
|
38
|
-
* a delegation to begin with. Mirrors the same non-empty/no-traversal
|
|
39
|
-
* shape family `rejectMalformedSessionId` pins for a delegation's own
|
|
40
|
-
* filename on the write side (`delegationMarkerPathFor`), tightened to
|
|
41
|
-
* additionally exclude a dot, which is the part that actually
|
|
42
|
-
* discriminates a stray dotfile from a real session id.
|
|
43
|
-
*/
|
|
44
|
-
const SESSION_ID_BASENAME_RE = /^[A-Za-z0-9][A-Za-z0-9_-]*$/;
|
|
45
|
-
/**
|
|
46
|
-
* Build the delegations-on-disk doctor metric. Pure filesystem read;
|
|
47
|
-
* never throws for "nothing to see" states (missing `.delegations/`,
|
|
48
|
-
* empty directory, every file unreadable), those all resolve to a
|
|
49
|
-
* zero-ish section, mirroring `buildUgAutoApprovals`. `total`/`expired`/
|
|
50
|
-
* `unreadable` read `0` for both an EMPTY and a MISSING directory; only
|
|
51
|
-
* `delegationsDirPresent` tells them apart, the same way
|
|
52
|
-
* `approvalsDirPresent` does for `buildUgAutoApprovals`, doctor's
|
|
53
|
-
* render layer uses it to stay silent when there is truly nothing on
|
|
54
|
-
* disk (`format.ts`'s own "no line for a check that found nothing"
|
|
55
|
-
* convention) while still rendering the zero-count line for a
|
|
56
|
-
* `harness delegate`-touched, now-empty directory.
|
|
57
|
-
*/
|
|
58
|
-
export function buildUgDelegations(generatedDir, opts = {}) {
|
|
59
|
-
const now = opts.now ?? new Date();
|
|
60
|
-
const dir = path.join(generatedDir, DELEGATION_MARKER_DIRNAME);
|
|
61
|
-
let dirStat;
|
|
62
|
-
try {
|
|
63
|
-
dirStat = fs.lstatSync(dir);
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
return emptySection();
|
|
67
|
-
}
|
|
68
|
-
if (!dirStat.isDirectory())
|
|
69
|
-
return emptySection();
|
|
70
|
-
let dirents;
|
|
71
|
-
try {
|
|
72
|
-
dirents = fs.readdirSync(dir, { withFileTypes: true });
|
|
73
|
-
}
|
|
74
|
-
catch {
|
|
75
|
-
return emptySection();
|
|
76
|
-
}
|
|
77
|
-
let total = 0;
|
|
78
|
-
let expired = 0;
|
|
79
|
-
let unreadable = 0;
|
|
80
|
-
for (const d of dirents) {
|
|
81
|
-
// Not a session-id-shaped basename: never a delegation file (a
|
|
82
|
-
// stray dotfile, an extensioned file, a directory, ...), skip
|
|
83
|
-
// before even reading it. The once-per-session adoption ledger is
|
|
84
|
-
// never nested under here: `.delegation-adoptions/` is a SIBLING of
|
|
85
|
-
// `.delegations/` (see delegation-markers.ts's module header), so
|
|
86
|
-
// this filter has no ledger-shaped entry to reason about; an
|
|
87
|
-
// ordinary session-id-named directory would still fall through to
|
|
88
|
-
// the `not-regular` skip below, same as any other directory would.
|
|
89
|
-
if (!SESSION_ID_BASENAME_RE.test(d.name))
|
|
90
|
-
continue;
|
|
91
|
-
const full = path.join(dir, d.name);
|
|
92
|
-
const read = readRegularFileRejectingSymlink(full);
|
|
93
|
-
// A symlink / non-regular / raced-away entry is not a delegation
|
|
94
|
-
// file this metric owns an opinion about; skip silently, same
|
|
95
|
-
// reasoning as `buildUgAutoApprovals`.
|
|
96
|
-
if (read.kind === "symlink" || read.kind === "not-regular" || read.kind === "missing") {
|
|
97
|
-
continue;
|
|
98
|
-
}
|
|
99
|
-
total++;
|
|
100
|
-
if (read.kind === "unreadable") {
|
|
101
|
-
unreadable++;
|
|
102
|
-
continue;
|
|
103
|
-
}
|
|
104
|
-
const parsed = safeJsonParse(read.content);
|
|
105
|
-
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
106
|
-
unreadable++;
|
|
107
|
-
continue;
|
|
108
|
-
}
|
|
109
|
-
const obj = parsed;
|
|
110
|
-
const segments = parseDelegationApprovedBy(obj["approvedBy"]);
|
|
111
|
-
if (!segments.ok) {
|
|
112
|
-
unreadable++;
|
|
113
|
-
continue;
|
|
114
|
-
}
|
|
115
|
-
if (Date.parse(segments.value.expiresAt) <= now.getTime()) {
|
|
116
|
-
expired++;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
return { delegationsDirPresent: true, total, expired, unreadable };
|
|
120
|
-
}
|
|
121
|
-
//# sourceMappingURL=ug-delegations.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ug-delegations.js","sourceRoot":"","sources":["../../../src/cli/doctor/ug-delegations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
export interface UgInflightSection {
|
|
2
|
-
/** Whether `<generatedDir>/.inflight/` exists at all. */
|
|
3
|
-
inflightDirPresent: boolean;
|
|
4
|
-
/** Records found and readable, across every session directory. */
|
|
5
|
-
total: number;
|
|
6
|
-
/**
|
|
7
|
-
* Of `total`, how many have an `approvedAt` older than the staleness
|
|
8
|
-
* window, or dated implausibly far in the future (clock skew or
|
|
9
|
-
* tampering — this is an audit listing, not a trust decision, so
|
|
10
|
-
* either counts as stale, mirroring `listInflightRecords`'s own doc).
|
|
11
|
-
*/
|
|
12
|
-
stale: number;
|
|
13
|
-
/** Entries gc/doctor could not make sense of (debris, unreadable, missing/bad approvedAt). */
|
|
14
|
-
skipped: number;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Build the in-flight-records-on-disk doctor metric. Pure filesystem
|
|
18
|
-
* read, never throws: a missing or empty `.inflight/` resolves to a
|
|
19
|
-
* zero-ish section, mirroring `buildUgDelegations`. `inflightDirPresent`
|
|
20
|
-
* is the only field that tells "missing" and "present but empty" apart,
|
|
21
|
-
* same convention `delegationsDirPresent` follows — doctor's render
|
|
22
|
-
* layer uses it to stay silent when there is truly nothing on disk.
|
|
23
|
-
*
|
|
24
|
-
* lstat, not `existsSync` (which follows a symlink to whatever it
|
|
25
|
-
* points at): a symlinked `.inflight/` reads as absent here, the same
|
|
26
|
-
* way a symlinked record file already reads as absent one level down.
|
|
27
|
-
* Still needed even though `listInflightRecords` now applies the same
|
|
28
|
-
* lstat guard internally: this function's own check is what decides
|
|
29
|
-
* `inflightDirPresent`, a flag `listInflightRecords`'s return shape has
|
|
30
|
-
* no room for, and that doctor's render layer needs to tell "absent"
|
|
31
|
-
* apart from "present but empty".
|
|
32
|
-
*/
|
|
33
|
-
export declare function buildUgInflight(generatedDir: string, opts?: {
|
|
34
|
-
now?: Date;
|
|
35
|
-
}): UgInflightSection;
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
// Doctor visibility for in-flight subagent records (subagent-gate
|
|
2
|
-
// slice 1, docs/decisions/2026-08-27-ug-auto-mode-approval.md
|
|
3
|
-
// "Invariants", "Threat model", "Delegation marker shape"): "in-flight
|
|
4
|
-
// subagent records on disk: <count> (<count> stale)" from
|
|
5
|
-
// `<generatedDir>/.inflight/`, distinct from the `.delegations/`
|
|
6
|
-
// listing in `ug-delegations.ts` and the `.approvals/` one in
|
|
7
|
-
// `ug-auto-approvals.ts`.
|
|
8
|
-
//
|
|
9
|
-
// Thin wrapper around `listInflightRecords`, which already owns the
|
|
10
|
-
// filesystem walk, the staleness computation and the tolerant-of-
|
|
11
|
-
// debris posture; this file only shapes that result into the section
|
|
12
|
-
// `harness doctor`'s report type expects, mirroring how
|
|
13
|
-
// `ug-delegations.ts` sits beside `delegation-markers.ts`'s own reader.
|
|
14
|
-
import * as fs from "node:fs";
|
|
15
|
-
import * as path from "node:path";
|
|
16
|
-
import { INFLIGHT_RECORD_DIRNAME, listInflightRecords, } from "../../policy-packs/builtin/understanding-before-execution/index.js";
|
|
17
|
-
function emptySection() {
|
|
18
|
-
return { inflightDirPresent: false, total: 0, stale: 0, skipped: 0 };
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Build the in-flight-records-on-disk doctor metric. Pure filesystem
|
|
22
|
-
* read, never throws: a missing or empty `.inflight/` resolves to a
|
|
23
|
-
* zero-ish section, mirroring `buildUgDelegations`. `inflightDirPresent`
|
|
24
|
-
* is the only field that tells "missing" and "present but empty" apart,
|
|
25
|
-
* same convention `delegationsDirPresent` follows — doctor's render
|
|
26
|
-
* layer uses it to stay silent when there is truly nothing on disk.
|
|
27
|
-
*
|
|
28
|
-
* lstat, not `existsSync` (which follows a symlink to whatever it
|
|
29
|
-
* points at): a symlinked `.inflight/` reads as absent here, the same
|
|
30
|
-
* way a symlinked record file already reads as absent one level down.
|
|
31
|
-
* Still needed even though `listInflightRecords` now applies the same
|
|
32
|
-
* lstat guard internally: this function's own check is what decides
|
|
33
|
-
* `inflightDirPresent`, a flag `listInflightRecords`'s return shape has
|
|
34
|
-
* no room for, and that doctor's render layer needs to tell "absent"
|
|
35
|
-
* apart from "present but empty".
|
|
36
|
-
*/
|
|
37
|
-
export function buildUgInflight(generatedDir, opts = {}) {
|
|
38
|
-
const dir = path.join(generatedDir, INFLIGHT_RECORD_DIRNAME);
|
|
39
|
-
let stat;
|
|
40
|
-
try {
|
|
41
|
-
stat = fs.lstatSync(dir);
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
return emptySection();
|
|
45
|
-
}
|
|
46
|
-
if (!stat.isDirectory()) {
|
|
47
|
-
return emptySection();
|
|
48
|
-
}
|
|
49
|
-
const result = listInflightRecords(generatedDir, opts.now);
|
|
50
|
-
return {
|
|
51
|
-
inflightDirPresent: true,
|
|
52
|
-
total: result.total,
|
|
53
|
-
stale: result.stale,
|
|
54
|
-
skipped: result.skipped.length,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=ug-inflight.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ug-inflight.js","sourceRoot":"","sources":["../../../src/cli/doctor/ug-inflight.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,8DAA8D;AAC9D,uEAAuE;AACvE,0DAA0D;AAC1D,iEAAiE;AACjE,8DAA8D;AAC9D,0BAA0B;AAC1B,EAAE;AACF,oEAAoE;AACpE,kEAAkE;AAClE,qEAAqE;AACrE,wDAAwD;AACxD,wEAAwE;AAExE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EACL,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,oEAAoE,CAAC;AAkB5E,SAAS,YAAY;IACnB,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AACvE,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe,CAAC,YAAoB,EAAE,OAAuB,EAAE;IAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,uBAAuB,CAAC,CAAC;IAC7D,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;IACD,MAAM,MAAM,GAAG,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3D,OAAO;QACL,kBAAkB,EAAE,IAAI;QACxB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;KAC/B,CAAC;AACJ,CAAC"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { type Mode } from "../../policy-packs/builtin/understanding-before-execution.js";
|
|
2
|
-
import type { Manifest } from "../../schema/index.js";
|
|
3
|
-
import type { PolicyPack } from "../../schema/policy-packs.js";
|
|
4
|
-
export interface UnderstandingModeEnvDivergence {
|
|
5
|
-
/** `UNDERSTANDING_GATE_MODE`, normalised (trim + lowercase, mirrors `resolveMode`'s own normalisation). */
|
|
6
|
-
envMode: Mode;
|
|
7
|
-
/** `policy_packs[understanding-before-execution].config.mode`, resolved via the config-only (GENERATION-path) resolver. */
|
|
8
|
-
configMode: Mode;
|
|
9
|
-
/**
|
|
10
|
-
* Short headline, rendered as the `⚠` line itself. Mirrors the
|
|
11
|
-
* npm-global-bin-off-PATH advisory's rendering idiom (`format.ts`'s
|
|
12
|
-
* Environment section): a one-line headline plus indented {@link detail}
|
|
13
|
-
* lines underneath, instead of one long sentence crammed onto the `⚠`
|
|
14
|
-
* line.
|
|
15
|
-
*/
|
|
16
|
-
message: string;
|
|
17
|
-
/**
|
|
18
|
-
* 2-3 indented lines rendered directly under {@link message} by
|
|
19
|
-
* `format.ts`. Carries the explanation and remediation the old
|
|
20
|
-
* single-line `message` used to carry inline.
|
|
21
|
-
*/
|
|
22
|
-
detail: string[];
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Pure: manifest + env in, a divergence report out (or `undefined` when
|
|
26
|
-
* there is nothing to flag). Only fires when:
|
|
27
|
-
* - the `understanding-before-execution` pack is declared AND enabled
|
|
28
|
-
* (a pack that never runs has no live mode for the env to diverge
|
|
29
|
-
* from — mirrors the enabled-gate other doctor sections use, e.g.
|
|
30
|
-
* `buildGrounding`'s `groundingServer` lookup in `index.ts`);
|
|
31
|
-
* - `UNDERSTANDING_GATE_MODE` is set to a non-empty value AND, once
|
|
32
|
-
* trimmed/lower-cased the same way `resolveMode` normalises it,
|
|
33
|
-
* resolves to a recognised {@link Mode}. An env value the live
|
|
34
|
-
* runtime would itself reject (unset, empty, or unrecognised) cannot
|
|
35
|
-
* diverge from anything — the live resolver falls back to
|
|
36
|
-
* `config.mode` in that case too, so there is no enforcement gap to
|
|
37
|
-
* warn about.
|
|
38
|
-
* - the normalised env mode differs from the resolved `config.mode`.
|
|
39
|
-
*/
|
|
40
|
-
/**
|
|
41
|
-
* Shared gate for the understanding-gate doctor sub-checks that only
|
|
42
|
-
* make sense when the pack is actually live: this divergence advisory,
|
|
43
|
-
* and (ADR docs/decisions/2026-08-27-ug-auto-mode-approval.md slice 1,
|
|
44
|
-
* agent-tasks 74b4b17d) the auto-approval listing and settings-drift
|
|
45
|
-
* checks. Declared-but-disabled counts as not enabled, mirroring the
|
|
46
|
-
* `p.enabled !== false` gate `checkUnderstandingModeEnvDivergence` uses
|
|
47
|
-
* inline below.
|
|
48
|
-
*/
|
|
49
|
-
export declare function findEnabledUnderstandingPack(manifest: Manifest): PolicyPack | undefined;
|
|
50
|
-
export declare function isUnderstandingPackEnabled(manifest: Manifest): boolean;
|
|
51
|
-
export declare function checkUnderstandingModeEnvDivergence(manifest: Manifest, env: NodeJS.ProcessEnv): UnderstandingModeEnvDivergence | undefined;
|