@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
package/dist/cli/gate/enable.js
CHANGED
|
@@ -1,19 +1,30 @@
|
|
|
1
|
-
// `harness gate enable
|
|
1
|
+
// `harness gate enable`: restore the live `gate disable` snapshot.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
// merges
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
3
|
+
// There is one live `harness.gate-disable.*.json` per settings.json (a
|
|
4
|
+
// second disable merges into it). Enable puts every removed group back at
|
|
5
|
+
// its recorded index and atomically rewrites settings.json, then retires the
|
|
6
|
+
// snapshot (renamed to `*.restored.json`, kept for audit, never applied
|
|
7
|
+
// again). A group the file already holds unchanged is never spliced in a
|
|
8
|
+
// second time. A group with the same event and matcher but other content may
|
|
9
|
+
// be another hook that shares the matcher, so enable refuses while there is
|
|
10
|
+
// one and names both groups' commands; `--force` takes it as back. When
|
|
11
|
+
// settings.json has been edited since the snapshot was taken (the recorded
|
|
12
|
+
// `settingsAfterSha256` no longer matches the on-disk content), the groups
|
|
13
|
+
// that are still missing are put back only if that gives exactly the
|
|
14
|
+
// pre-disable file (what a crash between the two disable writes leaves
|
|
15
|
+
// behind); otherwise enable refuses, and `--force` puts them back into the
|
|
16
|
+
// file as it is and keeps the edits. A file that already matches the
|
|
17
|
+
// pre-disable state, or already holds every group unchanged, has nothing to
|
|
18
|
+
// restore: the snapshot is retired. A directory holding several live
|
|
19
|
+
// snapshots (version 1 releases left one per disable) is handled one
|
|
20
|
+
// snapshot per call, newest first; the result names the ones still live, and
|
|
21
|
+
// the live snapshots of other settings files beside it, so the caller can
|
|
22
|
+
// refuse an all-clear.
|
|
12
23
|
import * as fs from "node:fs";
|
|
13
24
|
import * as os from "node:os";
|
|
14
25
|
import * as path from "node:path";
|
|
15
26
|
import { atomicWriteFile } from "../../io/atomic-write.js";
|
|
16
|
-
import {
|
|
27
|
+
import { changedLabel, claudeEnableRefusal, groupLabel, isReadOnlyWriteError, listLiveSnapshots, missingLabel, nextEnableSnapshots, parseSettingsHooks, planRestore, readOnlyLinkTargetText, readOnlyWritablePlace, resolveSettingsEntry, restoredSettingsText, retireSnapshot, settingsFlag, settingsOwnEntry, sha256Hex, } from "./snapshot.js";
|
|
17
28
|
const DEFAULT_SETTINGS_REL = path.join(".claude", "settings.json");
|
|
18
29
|
export class GateEnableError extends Error {
|
|
19
30
|
constructor(message) {
|
|
@@ -28,14 +39,15 @@ function resolveSettingsPath(opts) {
|
|
|
28
39
|
const home = opts.homeDir ?? os.homedir();
|
|
29
40
|
return path.join(home, DEFAULT_SETTINGS_REL);
|
|
30
41
|
}
|
|
31
|
-
|
|
42
|
+
/** `missingWayOut` ends the message when the file is not there: what to do with the live snapshot waiting for it. */
|
|
43
|
+
function readCurrentSettings(settingsPath, missingWayOut) {
|
|
32
44
|
let raw;
|
|
33
45
|
try {
|
|
34
46
|
raw = fs.readFileSync(settingsPath, "utf8");
|
|
35
47
|
}
|
|
36
48
|
catch (err) {
|
|
37
49
|
if (err.code === "ENOENT") {
|
|
38
|
-
throw new GateEnableError(`settings file not found: ${settingsPath}
|
|
50
|
+
throw new GateEnableError(`settings file not found: ${settingsPath}; cannot restore into a missing target. ${missingWayOut}`);
|
|
39
51
|
}
|
|
40
52
|
throw new GateEnableError(`cannot read ${settingsPath}: ${err.message}`);
|
|
41
53
|
}
|
|
@@ -50,78 +62,138 @@ function readCurrentSettings(settingsPath) {
|
|
|
50
62
|
throw new GateEnableError(`${settingsPath} is not a JSON object; refusing to operate.`);
|
|
51
63
|
}
|
|
52
64
|
const obj = parsed;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
throw new GateEnableError(`${settingsPath} \`hooks.${event}\` is not an array; refusing to operate.`);
|
|
62
|
-
}
|
|
63
|
-
hooks[event] = groups.slice();
|
|
64
|
-
}
|
|
65
|
+
// One shared walk of the `hooks` field (the doctor reads the same shape
|
|
66
|
+
// through it); the two failure reasons keep their exact messages here.
|
|
67
|
+
const parsedHooks = parseSettingsHooks(obj);
|
|
68
|
+
if (!parsedHooks.ok) {
|
|
69
|
+
const event = parsedHooks.reason === "event-not-array" ? parsedHooks.event : "";
|
|
70
|
+
throw new GateEnableError(parsedHooks.reason === "hooks-not-object"
|
|
71
|
+
? `${settingsPath} \`hooks\` field is not an object.`
|
|
72
|
+
: `${settingsPath} \`hooks.${event}\` is not an array; refusing to operate.`);
|
|
65
73
|
}
|
|
66
|
-
return { raw, obj, hooks };
|
|
67
|
-
}
|
|
68
|
-
function reinsertRemoved(hooks, snapshot) {
|
|
69
|
-
// Sort removed entries by event, then by ascending index, so we splice
|
|
70
|
-
// them back in growing order — that way an earlier insertion never
|
|
71
|
-
// shifts a later insertion's target index past the array end.
|
|
72
|
-
const sorted = [...snapshot.removed].sort((a, b) => {
|
|
73
|
-
if (a.event !== b.event)
|
|
74
|
-
return a.event < b.event ? -1 : 1;
|
|
75
|
-
return a.index - b.index;
|
|
76
|
-
});
|
|
77
|
-
let inserted = 0;
|
|
78
|
-
for (const entry of sorted) {
|
|
79
|
-
const arr = hooks[entry.event] ?? [];
|
|
80
|
-
const idx = Math.min(entry.index, arr.length);
|
|
81
|
-
arr.splice(idx, 0, entry.group);
|
|
82
|
-
hooks[entry.event] = arr;
|
|
83
|
-
inserted += 1;
|
|
84
|
-
}
|
|
85
|
-
return inserted;
|
|
74
|
+
return { raw, obj, hooks: parsedHooks.hooks };
|
|
86
75
|
}
|
|
87
76
|
export function gateEnable(opts = {}) {
|
|
88
77
|
const settingsPath = resolveSettingsPath(opts);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
const
|
|
78
|
+
// Reads and writes go to the file itself, so a settings.json that is a
|
|
79
|
+
// symlink stays one; the snapshots of either spelling are found by the listing.
|
|
80
|
+
const entry = resolveSettingsEntry(settingsPath);
|
|
81
|
+
const found = listLiveSnapshots(settingsPath);
|
|
82
|
+
if (!found.ok) {
|
|
83
|
+
throw new GateEnableError(`${found.reason}. Nothing was restored: a live snapshot that cannot be read, or that records no target, may ` +
|
|
84
|
+
`name groups still removed from ${settingsPath}. Move ${found.path} aside (or rename it to ` +
|
|
85
|
+
`*.restored.json once its groups are back; if it names groups that are still removed, put them back by ` +
|
|
86
|
+
`hand first, the snapshot's settingsBackupPath names the file as it was before the disable) and run ` +
|
|
87
|
+
`\`harness gate enable ${settingsFlag(settingsPath)}\` again.`);
|
|
88
|
+
}
|
|
89
|
+
const foreign = found.skippedForeign;
|
|
90
|
+
const [newest] = nextEnableSnapshots(found.live);
|
|
91
|
+
const older = found.live.filter((l) => l !== newest);
|
|
92
|
+
if (newest === undefined) {
|
|
93
|
+
return { mode: "no-snapshots", settingsPath, foreign };
|
|
94
|
+
}
|
|
95
|
+
const snapshot = newest.snapshot;
|
|
96
|
+
const remaining = older.map((l) => l.path);
|
|
97
|
+
const current = readCurrentSettings(entry, `The snapshot ${newest.path} stays live. Restore the file from ${snapshot.settingsBackupPath} (the file as it ` +
|
|
98
|
+
`was before the disable), then run \`harness gate enable ${settingsFlag(settingsPath)}\` again.`);
|
|
101
99
|
const currentSha = sha256Hex(current.raw);
|
|
102
100
|
if (currentSha === snapshot.settingsBeforeSha256) {
|
|
103
|
-
// The current file already matches the pre-disable state: nothing
|
|
104
|
-
//
|
|
105
|
-
return {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
101
|
+
// The current file already matches the pre-disable state: nothing to
|
|
102
|
+
// restore. The snapshot is spent, so retire it and never offer it again.
|
|
103
|
+
return {
|
|
104
|
+
mode: "already-restored",
|
|
105
|
+
settingsPath,
|
|
106
|
+
snapshotPath: retireApplied(newest.path, settingsPath, 0),
|
|
107
|
+
remaining,
|
|
108
|
+
foreign,
|
|
109
|
+
alreadyBack: [],
|
|
110
|
+
accepted: [],
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
const plan = planRestore(current.hooks, snapshot);
|
|
114
|
+
const alreadyBack = plan.alreadyBack.map((r) => groupLabel(r.event, r.group));
|
|
115
|
+
const accepted = plan.changed.map(changedLabel);
|
|
116
|
+
const refusal = claudeEnableRefusal(currentSha, current.obj, plan, snapshot);
|
|
117
|
+
if (refusal === "changed-group" && !opts.force) {
|
|
118
|
+
// A group with the matcher of the gate's but other content may be another
|
|
119
|
+
// hook entirely: taking it for the gate's would leave the gate off.
|
|
120
|
+
throw new GateEnableError(`${settingsPath} holds ${accepted.length} hook group(s) with the event and matcher of a group the snapshot ` +
|
|
121
|
+
`${newest.path} removed but with other content (${accepted.join("; ")}). Such a group may be another hook ` +
|
|
122
|
+
`that shares the matcher, so it does not count as back.` +
|
|
123
|
+
(plan.restored.length > 0
|
|
124
|
+
? ` ${plan.restored.length} more hook group(s) it removed are missing ` +
|
|
125
|
+
`(${plan.restored.map(missingLabel).join("; ")}).`
|
|
126
|
+
: "") +
|
|
127
|
+
` Nothing was changed and the snapshot stays live. If the file's group stands in for the snapshot's, run ` +
|
|
128
|
+
`\`harness gate enable --force ${settingsFlag(settingsPath)}\`: it takes it as back (the snapshot's group is not put back), puts the ` +
|
|
129
|
+
`missing groups back and keeps every other edit. Otherwise make the file hold the snapshot's group ` +
|
|
130
|
+
`(${snapshot.settingsBackupPath} has it) and run \`harness gate enable ${settingsFlag(settingsPath)}\` again.`);
|
|
131
|
+
}
|
|
132
|
+
if (plan.restored.length === 0) {
|
|
133
|
+
// Every group the snapshot names is back in the file (by hand, or an
|
|
134
|
+
// apply re-rendered it): the snapshot is spent whatever else was edited.
|
|
135
|
+
return {
|
|
136
|
+
mode: "already-restored",
|
|
137
|
+
settingsPath,
|
|
138
|
+
snapshotPath: retireApplied(newest.path, settingsPath, 0),
|
|
139
|
+
remaining,
|
|
140
|
+
foreign,
|
|
141
|
+
alreadyBack,
|
|
142
|
+
accepted,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
const newSettings = restoredSettingsText(current.obj, plan.hooks);
|
|
146
|
+
// The file is not the state the snapshot left, and the groups still missing
|
|
147
|
+
// do not add up to the pre-disable file: an edit would be written over
|
|
148
|
+
// without the operator having seen it.
|
|
149
|
+
if (refusal === "edited-settings" && !opts.force) {
|
|
150
|
+
throw new GateEnableError(`settings.json has been edited since the snapshot was taken (current sha ${currentSha.slice(0, 12)}..., ` +
|
|
151
|
+
`snapshot's post-disable sha ${snapshot.settingsAfterSha256.slice(0, 12)}...), and ` +
|
|
152
|
+
`${plan.restored.length} hook group(s) it removed are still missing ` +
|
|
153
|
+
`(${plan.restored.map(missingLabel).join("; ")}). Nothing was changed and the ` +
|
|
154
|
+
`snapshot ${newest.path} stays live. Inspect the diff against ${snapshot.settingsBackupPath}, then run ` +
|
|
155
|
+
`\`harness gate enable --force ${settingsFlag(settingsPath)}\`: it puts the missing groups back, leaves a group that is already ` +
|
|
156
|
+
`there alone and keeps every other edit.`);
|
|
157
|
+
}
|
|
158
|
+
try {
|
|
159
|
+
atomicWriteFile(entry, newSettings);
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
if (entry === settingsOwnEntry(settingsPath) || !isReadOnlyWriteError(err))
|
|
163
|
+
throw err;
|
|
164
|
+
// A copy in place of the link would not find the snapshot, which sits beside the file. Moving the snapshot
|
|
165
|
+
// aside needs the directory writable too, so the by-hand way defers that step.
|
|
166
|
+
throw new GateEnableError(`${readOnlyLinkTargetText(settingsPath, entry, err)} Nothing was changed and the snapshot ${newest.path} stays ` +
|
|
167
|
+
`live. Make ${readOnlyWritablePlace(entry, err)} writable and run \`harness gate enable${opts.force ? " --force" : ""} ` +
|
|
168
|
+
`${settingsFlag(settingsPath)}\` again; or by hand: put the groups back (the snapshot lists them; ` +
|
|
169
|
+
`${snapshot.settingsBackupPath} is the file as it was before the disable), then move the snapshot aside ` +
|
|
170
|
+
`(rename it to *.restored.json) once you can write its directory.`);
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
mode: "restored",
|
|
174
|
+
settingsPath,
|
|
175
|
+
snapshotPath: retireApplied(newest.path, settingsPath, plan.restored.length),
|
|
176
|
+
restoredCount: plan.restored.length,
|
|
177
|
+
remaining,
|
|
178
|
+
foreign,
|
|
179
|
+
alreadyBack,
|
|
180
|
+
accepted,
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Retires the snapshot this call applied (or found applied). A failed rename
|
|
185
|
+
* is reported with what was done and the way out instead of a bare errno: a
|
|
186
|
+
* snapshot left live is harmless (the next enable finds its groups back and
|
|
187
|
+
* retires it), but the operator must know it is still there.
|
|
188
|
+
*/
|
|
189
|
+
function retireApplied(snapPath, settingsPath, restoredCount) {
|
|
190
|
+
try {
|
|
191
|
+
return retireSnapshot(snapPath);
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
throw new GateEnableError(`${restoredCount > 0 ? `restored ${restoredCount} hook group(s) into ${settingsPath}` : `${settingsPath} needed no write`}, ` +
|
|
195
|
+
`but cannot retire the snapshot ${snapPath} (${err.message}). Move it out of the directory by ` +
|
|
196
|
+
`hand (or rename it to *.restored.json) so it is never applied again.`);
|
|
197
|
+
}
|
|
124
198
|
}
|
|
125
|
-
/** Test-helper: re-export for the test suite to inspect snapshot pickup. */
|
|
126
|
-
export { listSnapshots };
|
|
127
199
|
//# sourceMappingURL=enable.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enable.js","sourceRoot":"","sources":["../../../src/cli/gate/enable.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"enable.js","sourceRoot":"","sources":["../../../src/cli/gate/enable.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** Why a link chain stops where it does. */
|
|
2
|
+
export type LinkChainEnd =
|
|
3
|
+
/** The last path exists and is not a symlink. */
|
|
4
|
+
"target"
|
|
5
|
+
/** The last path does not exist: a symlink leads to a file that is gone, or to a directory that is gone, or the path itself is absent. */
|
|
6
|
+
| "dangling"
|
|
7
|
+
/** The hop budget ran out while every hop was still a symlink. */
|
|
8
|
+
| "loop"
|
|
9
|
+
/** A hop could not be read (no permission, a directory on the way that is a file). */
|
|
10
|
+
| "unreadable";
|
|
11
|
+
export interface LinkChain {
|
|
12
|
+
/**
|
|
13
|
+
* The path itself, then each path its symlink text leads to, ending at the
|
|
14
|
+
* first path that is not a symlink or at the point where the chain cannot
|
|
15
|
+
* be walked.
|
|
16
|
+
*/
|
|
17
|
+
chain: string[];
|
|
18
|
+
end: LinkChainEnd;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Walks the symlink chain of `start` one hop at a time, resolving each hop
|
|
22
|
+
* the way the kernel does. A relative link text is appended, as written, to
|
|
23
|
+
* the physical directory that holds the link (an absolute text is taken as
|
|
24
|
+
* written), and everything but the last name of that path is then resolved by
|
|
25
|
+
* the native `realpath`, which walks `..`, `.` and empty segments through the
|
|
26
|
+
* real directories one step at a time. Nothing is folded lexically: `d/..` is
|
|
27
|
+
* the parent of the directory `d` leads to, not the directory holding `d`,
|
|
28
|
+
* whether the text is relative or absolute (the JavaScript `realpath` and
|
|
29
|
+
* `path.resolve` fold `d/..` away before they look at `d`). The last name is
|
|
30
|
+
* kept as written, since it may be the next link. When the directory part
|
|
31
|
+
* leads nowhere (a directory on the way is gone), the chain ends dangling at
|
|
32
|
+
* that path as the link wrote it, never at a lexical guess of where it might
|
|
33
|
+
* have led. A trailing separator asks the kernel for a directory: over a real
|
|
34
|
+
* directory it walks to it, over a link it hops on and carries the directory
|
|
35
|
+
* requirement to where the chain lands (a chain ending at a file then ends
|
|
36
|
+
* unreadable, the kernel's `ENOTDIR`), and a same-named file ends unreadable
|
|
37
|
+
* at the text as written.
|
|
38
|
+
*/
|
|
39
|
+
export declare function walkLinkChain(start: string): LinkChain;
|
|
40
|
+
/** The hops of `walkLinkChain`, for a caller that only looks beside each of them. */
|
|
41
|
+
export declare function linkChain(start: string): string[];
|
|
42
|
+
/**
|
|
43
|
+
* A path spelled with a `..` segment, replaced by its directory as the kernel
|
|
44
|
+
* resolves it plus the same last name. Joining a name to a directory (and
|
|
45
|
+
* `path.resolve`, `path.normalize`) folds `..` lexically, which leads
|
|
46
|
+
* elsewhere when the name before it is a directory link (`via/..` is the
|
|
47
|
+
* parent of where `via` leads, not the directory that holds `via`). `..` is
|
|
48
|
+
* the only segment such a fold moves (`.` and empty segments fold to the same
|
|
49
|
+
* directory), so every other spelling is kept as given. A directory that
|
|
50
|
+
* cannot be resolved leaves the spelling as given: nothing can be read or
|
|
51
|
+
* written through it.
|
|
52
|
+
*/
|
|
53
|
+
export declare function kernelEntry(spelled: string): string;
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// One walker for the chain of symlinks a gate path leads through, shared by the
|
|
2
|
+
// Claude and the Codex gate. A snapshot or an installer backup sits beside the
|
|
3
|
+
// spelling the gate was run through, which may be any hop of the chain or its
|
|
4
|
+
// target, so both gates have to find the same hops from the same path.
|
|
5
|
+
import * as fs from "node:fs";
|
|
6
|
+
import * as path from "node:path";
|
|
7
|
+
/** More hops than any real dotfiles setup, so a loop ends quickly. */
|
|
8
|
+
const MAX_HOPS = 40;
|
|
9
|
+
/** How a failed step of the walk ends the chain: nothing at the path, or a path that cannot be read. */
|
|
10
|
+
function endOf(err) {
|
|
11
|
+
return err.code === "ENOENT" ? "dangling" : "unreadable";
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Walks the symlink chain of `start` one hop at a time, resolving each hop
|
|
15
|
+
* the way the kernel does. A relative link text is appended, as written, to
|
|
16
|
+
* the physical directory that holds the link (an absolute text is taken as
|
|
17
|
+
* written), and everything but the last name of that path is then resolved by
|
|
18
|
+
* the native `realpath`, which walks `..`, `.` and empty segments through the
|
|
19
|
+
* real directories one step at a time. Nothing is folded lexically: `d/..` is
|
|
20
|
+
* the parent of the directory `d` leads to, not the directory holding `d`,
|
|
21
|
+
* whether the text is relative or absolute (the JavaScript `realpath` and
|
|
22
|
+
* `path.resolve` fold `d/..` away before they look at `d`). The last name is
|
|
23
|
+
* kept as written, since it may be the next link. When the directory part
|
|
24
|
+
* leads nowhere (a directory on the way is gone), the chain ends dangling at
|
|
25
|
+
* that path as the link wrote it, never at a lexical guess of where it might
|
|
26
|
+
* have led. A trailing separator asks the kernel for a directory: over a real
|
|
27
|
+
* directory it walks to it, over a link it hops on and carries the directory
|
|
28
|
+
* requirement to where the chain lands (a chain ending at a file then ends
|
|
29
|
+
* unreadable, the kernel's `ENOTDIR`), and a same-named file ends unreadable
|
|
30
|
+
* at the text as written.
|
|
31
|
+
*/
|
|
32
|
+
export function walkLinkChain(start) {
|
|
33
|
+
const chain = [start];
|
|
34
|
+
let current = start;
|
|
35
|
+
let requireDir = false;
|
|
36
|
+
for (let hop = 0; hop < MAX_HOPS; hop++) {
|
|
37
|
+
let raw;
|
|
38
|
+
try {
|
|
39
|
+
const text = fs.readlinkSync(current);
|
|
40
|
+
const linkDir = fs.realpathSync.native(path.dirname(current));
|
|
41
|
+
// Appended as written: `path.join` would fold `d/..` before the kernel's walk below.
|
|
42
|
+
raw = path.isAbsolute(text) ? text : `${linkDir}${path.sep}${text}`;
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
// `readlink` answers EINVAL for anything that exists and is not a symlink.
|
|
46
|
+
if (err.code !== "EINVAL")
|
|
47
|
+
return { chain, end: endOf(err) };
|
|
48
|
+
if (requireDir) {
|
|
49
|
+
// A trailing separator earlier in the chain asked for a directory and
|
|
50
|
+
// the chain landed on a non-link: a same-named file answers that
|
|
51
|
+
// lookup ENOTDIR, unreadable, as reading through the link does.
|
|
52
|
+
try {
|
|
53
|
+
if (!fs.statSync(current).isDirectory())
|
|
54
|
+
return { chain, end: "unreadable" };
|
|
55
|
+
}
|
|
56
|
+
catch (statErr) {
|
|
57
|
+
return { chain, end: endOf(statErr) };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { chain, end: "target" };
|
|
61
|
+
}
|
|
62
|
+
let next;
|
|
63
|
+
try {
|
|
64
|
+
// The kernel's own lookup first: the native `realpath` of macOS walks
|
|
65
|
+
// `file/..` back to the file's directory, where the kernel answers ENOTDIR.
|
|
66
|
+
fs.statSync(path.dirname(raw));
|
|
67
|
+
if (raw.endsWith(path.sep)) {
|
|
68
|
+
// A trailing separator asks the kernel for a directory: strip every
|
|
69
|
+
// trailing separator (an all-separator text is the root). A link hops
|
|
70
|
+
// on and carries the directory requirement to where the chain lands
|
|
71
|
+
// (a loop still ends loop, a dangling link is followed to its missing
|
|
72
|
+
// target, a link to a file ends unreadable above), while a same-named
|
|
73
|
+
// file answers ENOTDIR, unreadable.
|
|
74
|
+
const stripped = raw.replace(/\/+$/, "") || path.sep;
|
|
75
|
+
if (fs.lstatSync(stripped).isSymbolicLink()) {
|
|
76
|
+
requireDir = true;
|
|
77
|
+
raw = stripped;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
fs.statSync(raw);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
next = path.join(fs.realpathSync.native(path.dirname(raw)), path.basename(raw));
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
chain.push(raw);
|
|
87
|
+
return { chain, end: endOf(err) };
|
|
88
|
+
}
|
|
89
|
+
chain.push(next);
|
|
90
|
+
current = next;
|
|
91
|
+
}
|
|
92
|
+
return { chain, end: "loop" };
|
|
93
|
+
}
|
|
94
|
+
/** The hops of `walkLinkChain`, for a caller that only looks beside each of them. */
|
|
95
|
+
export function linkChain(start) {
|
|
96
|
+
return walkLinkChain(start).chain;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* A path spelled with a `..` segment, replaced by its directory as the kernel
|
|
100
|
+
* resolves it plus the same last name. Joining a name to a directory (and
|
|
101
|
+
* `path.resolve`, `path.normalize`) folds `..` lexically, which leads
|
|
102
|
+
* elsewhere when the name before it is a directory link (`via/..` is the
|
|
103
|
+
* parent of where `via` leads, not the directory that holds `via`). `..` is
|
|
104
|
+
* the only segment such a fold moves (`.` and empty segments fold to the same
|
|
105
|
+
* directory), so every other spelling is kept as given. A directory that
|
|
106
|
+
* cannot be resolved leaves the spelling as given: nothing can be read or
|
|
107
|
+
* written through it.
|
|
108
|
+
*/
|
|
109
|
+
export function kernelEntry(spelled) {
|
|
110
|
+
if (!spelled.split(path.sep).includes(".."))
|
|
111
|
+
return spelled;
|
|
112
|
+
const dir = path.dirname(spelled);
|
|
113
|
+
try {
|
|
114
|
+
// The kernel's own lookup first: the native `realpath` of macOS walks `file/..` back to the file's directory.
|
|
115
|
+
fs.statSync(dir);
|
|
116
|
+
return path.join(fs.realpathSync.native(dir), path.basename(spelled));
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return spelled;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=link-chain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-chain.js","sourceRoot":"","sources":["../../../src/cli/gate/link-chain.ts"],"names":[],"mappings":"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"}
|