peaks-loop 4.1.2 → 4.1.4
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/.claude-plugin/marketplace.json +136 -47
- package/CHANGELOG.md +112 -0
- package/README-en.md +1 -1
- package/README.md +1 -1
- package/contracts/readonly-argv-whitelist.json +211 -0
- package/dist/cli/commands/asset-command-shared.d.ts +12 -0
- package/dist/cli/commands/asset-command-shared.js +45 -0
- package/dist/cli/commands/asset-commands.d.ts +6 -1
- package/dist/cli/commands/asset-commands.js +11 -372
- package/dist/cli/commands/asset-crystallize-command.d.ts +3 -0
- package/dist/cli/commands/asset-crystallize-command.js +60 -0
- package/dist/cli/commands/asset-crystallize-payload.d.ts +47 -0
- package/dist/cli/commands/asset-crystallize-payload.js +85 -0
- package/dist/cli/commands/asset-crystallize-runner.d.ts +3 -0
- package/dist/cli/commands/asset-crystallize-runner.js +133 -0
- package/dist/cli/commands/asset-dispose-command.d.ts +3 -0
- package/dist/cli/commands/asset-dispose-command.js +99 -0
- package/dist/cli/commands/asset-status-command.d.ts +3 -0
- package/dist/cli/commands/asset-status-command.js +100 -0
- package/dist/cli/commands/audit-artifact-runners.d.ts +16 -0
- package/dist/cli/commands/audit-artifact-runners.js +170 -0
- package/dist/cli/commands/audit-command-shared.d.ts +97 -0
- package/dist/cli/commands/audit-command-shared.js +60 -0
- package/dist/cli/commands/audit-commands.d.ts +7 -31
- package/dist/cli/commands/audit-commands.js +64 -473
- package/dist/cli/commands/audit-goal-runners.d.ts +17 -0
- package/dist/cli/commands/audit-goal-runners.js +114 -0
- package/dist/cli/commands/audit-red-lines-runners.d.ts +11 -0
- package/dist/cli/commands/audit-red-lines-runners.js +43 -0
- package/dist/cli/commands/audit-refusal-data.d.ts +23 -0
- package/dist/cli/commands/audit-refusal-data.js +69 -0
- package/dist/cli/commands/audit-static-runners.d.ts +13 -0
- package/dist/cli/commands/audit-static-runners.js +139 -0
- package/dist/cli/commands/await-runners.d.ts +11 -0
- package/dist/cli/commands/await-runners.js +148 -0
- package/dist/cli/commands/baseline-audit-command.d.ts +3 -0
- package/dist/cli/commands/baseline-audit-command.js +64 -0
- package/dist/cli/commands/baseline-command-shared.d.ts +23 -0
- package/dist/cli/commands/baseline-command-shared.js +39 -0
- package/dist/cli/commands/baseline-commands.js +33 -313
- package/dist/cli/commands/baseline-freeze-commands.d.ts +4 -0
- package/dist/cli/commands/baseline-freeze-commands.js +81 -0
- package/dist/cli/commands/baseline-guard-command.d.ts +3 -0
- package/dist/cli/commands/baseline-guard-command.js +52 -0
- package/dist/cli/commands/baseline-read-commands.d.ts +5 -0
- package/dist/cli/commands/baseline-read-commands.js +72 -0
- package/dist/cli/commands/baseline-rollback-commands.d.ts +4 -0
- package/dist/cli/commands/baseline-rollback-commands.js +88 -0
- package/dist/cli/commands/classify-downgrade-command.d.ts +9 -0
- package/dist/cli/commands/classify-downgrade-command.js +21 -0
- package/dist/cli/commands/classify-run-command.d.ts +9 -0
- package/dist/cli/commands/classify-run-command.js +73 -0
- package/dist/cli/commands/classify-signals.d.ts +5 -0
- package/dist/cli/commands/classify-signals.js +104 -0
- package/dist/cli/commands/code-auto-compact-command.d.ts +3 -0
- package/dist/cli/commands/code-auto-compact-command.js +124 -0
- package/dist/cli/commands/code-auto-compact-envelope.d.ts +22 -0
- package/dist/cli/commands/code-auto-compact-envelope.js +39 -0
- package/dist/cli/commands/code-context-audit-command.d.ts +3 -0
- package/dist/cli/commands/code-context-audit-command.js +68 -0
- package/dist/cli/commands/code-context-now-command.d.ts +3 -0
- package/dist/cli/commands/code-context-now-command.js +124 -0
- package/dist/cli/commands/code-context-now-envelope.d.ts +66 -0
- package/dist/cli/commands/code-context-now-envelope.js +136 -0
- package/dist/cli/commands/code-context-now-mapping.d.ts +27 -0
- package/dist/cli/commands/code-context-now-mapping.js +43 -0
- package/dist/cli/commands/code-emit-handoff-command.d.ts +3 -0
- package/dist/cli/commands/code-emit-handoff-command.js +136 -0
- package/dist/cli/commands/code-gate-step-08-command.d.ts +3 -0
- package/dist/cli/commands/code-gate-step-08-command.js +155 -0
- package/dist/cli/commands/code-post-compact-detect-command.d.ts +3 -0
- package/dist/cli/commands/code-post-compact-detect-command.js +50 -0
- package/dist/cli/commands/code-runtime-commands.d.ts +9 -43
- package/dist/cli/commands/code-runtime-commands.js +20 -672
- package/dist/cli/commands/code-runtime-session.d.ts +1 -0
- package/dist/cli/commands/code-runtime-session.js +15 -0
- package/dist/cli/commands/codegraph-command-options.d.ts +22 -0
- package/dist/cli/commands/codegraph-command-options.js +22 -0
- package/dist/cli/commands/codegraph-commands.d.ts +2 -2
- package/dist/cli/commands/codegraph-commands.js +14 -397
- package/dist/cli/commands/codegraph-config-restore-command.d.ts +3 -0
- package/dist/cli/commands/codegraph-config-restore-command.js +200 -0
- package/dist/cli/commands/codegraph-proxy-commands.d.ts +10 -0
- package/dist/cli/commands/codegraph-proxy-commands.js +159 -0
- package/dist/cli/commands/codegraph-repair-commands.d.ts +3 -0
- package/dist/cli/commands/codegraph-repair-commands.js +94 -0
- package/dist/cli/commands/codegraph-status-command.d.ts +1 -1
- package/dist/cli/commands/codegraph-status-command.js +27 -214
- package/dist/cli/commands/codegraph-status-integrity.d.ts +44 -0
- package/dist/cli/commands/codegraph-status-integrity.js +121 -0
- package/dist/cli/commands/codegraph-status-json.d.ts +5 -0
- package/dist/cli/commands/codegraph-status-json.js +127 -0
- package/dist/cli/commands/compact-command.d.ts +6 -2
- package/dist/cli/commands/compact-command.js +12 -559
- package/dist/cli/commands/compact-dry-run-command.d.ts +3 -0
- package/dist/cli/commands/compact-dry-run-command.js +87 -0
- package/dist/cli/commands/compact-force-command.d.ts +3 -0
- package/dist/cli/commands/compact-force-command.js +98 -0
- package/dist/cli/commands/compact-harness-window-command.d.ts +3 -0
- package/dist/cli/commands/compact-harness-window-command.js +174 -0
- package/dist/cli/commands/compact-history-command.d.ts +3 -0
- package/dist/cli/commands/compact-history-command.js +89 -0
- package/dist/cli/commands/compact-read-commands.d.ts +3 -0
- package/dist/cli/commands/compact-read-commands.js +123 -0
- package/dist/cli/commands/compact-settle-command.d.ts +3 -0
- package/dist/cli/commands/compact-settle-command.js +130 -0
- package/dist/cli/commands/compact-shared.d.ts +9 -0
- package/dist/cli/commands/compact-shared.js +26 -0
- package/dist/cli/commands/container-command-shared.d.ts +60 -0
- package/dist/cli/commands/container-command-shared.js +52 -0
- package/dist/cli/commands/container-commands.d.ts +1 -1
- package/dist/cli/commands/container-commands.js +4 -216
- package/dist/cli/commands/container-release-command.d.ts +3 -0
- package/dist/cli/commands/container-release-command.js +105 -0
- package/dist/cli/commands/container-spawn-command.d.ts +3 -0
- package/dist/cli/commands/container-spawn-command.js +148 -0
- package/dist/cli/commands/context-check-command.d.ts +3 -0
- package/dist/cli/commands/context-check-command.js +81 -0
- package/dist/cli/commands/context-commands.d.ts +2 -7
- package/dist/cli/commands/context-commands.js +6 -276
- package/dist/cli/commands/context-layer-command.d.ts +3 -0
- package/dist/cli/commands/context-layer-command.js +34 -0
- package/dist/cli/commands/context-layer-fetchers.d.ts +15 -0
- package/dist/cli/commands/context-layer-fetchers.js +162 -0
- package/dist/cli/commands/context-status-command.d.ts +17 -0
- package/dist/cli/commands/context-status-command.js +41 -0
- package/dist/cli/commands/contract-write-command.d.ts +3 -0
- package/dist/cli/commands/contract-write-command.js +144 -0
- package/dist/cli/commands/core/doctor-bindings.d.ts +17 -0
- package/dist/cli/commands/core/doctor-bindings.js +30 -0
- package/dist/cli/commands/core/doctor-command.d.ts +4 -18
- package/dist/cli/commands/core/doctor-command.js +2 -323
- package/dist/cli/commands/core/doctor-logs.d.ts +8 -0
- package/dist/cli/commands/core/doctor-logs.js +32 -0
- package/dist/cli/commands/core/doctor-probes.d.ts +3 -0
- package/dist/cli/commands/core/doctor-probes.js +55 -0
- package/dist/cli/commands/core/doctor-run-command.d.ts +12 -0
- package/dist/cli/commands/core/doctor-run-command.js +172 -0
- package/dist/cli/commands/core/doctor-summary.d.ts +7 -0
- package/dist/cli/commands/core/doctor-summary.js +39 -0
- package/dist/cli/commands/core/memory-command-shared.d.ts +25 -0
- package/dist/cli/commands/core/memory-command-shared.js +20 -0
- package/dist/cli/commands/core/memory-command.d.ts +1 -1
- package/dist/cli/commands/core/memory-command.js +6 -227
- package/dist/cli/commands/core/memory-delegated-verbs.d.ts +4 -0
- package/dist/cli/commands/core/memory-delegated-verbs.js +178 -0
- package/dist/cli/commands/core/memory-extract-command.d.ts +3 -0
- package/dist/cli/commands/core/memory-extract-command.js +90 -0
- package/dist/cli/commands/core/memory-sync-command.d.ts +3 -0
- package/dist/cli/commands/core/memory-sync-command.js +38 -0
- package/dist/cli/commands/core/session-command.d.ts +1 -1
- package/dist/cli/commands/core/session-command.js +12 -206
- package/dist/cli/commands/core/session-info-command.d.ts +3 -0
- package/dist/cli/commands/core/session-info-command.js +142 -0
- package/dist/cli/commands/core/session-verb-commands.d.ts +5 -0
- package/dist/cli/commands/core/session-verb-commands.js +58 -0
- package/dist/cli/commands/core/skill-command.d.ts +1 -44
- package/dist/cli/commands/core/skill-command.js +13 -541
- package/dist/cli/commands/core/skill-context-verdict.d.ts +38 -0
- package/dist/cli/commands/core/skill-context-verdict.js +63 -0
- package/dist/cli/commands/core/skill-generated-config-notice.d.ts +41 -0
- package/dist/cli/commands/core/skill-generated-config-notice.js +75 -0
- package/dist/cli/commands/core/skill-heartbeat-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-heartbeat-commands.js +50 -0
- package/dist/cli/commands/core/skill-presence-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-presence-commands.js +123 -0
- package/dist/cli/commands/core/skill-presence-housekeeping-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-presence-housekeeping-commands.js +165 -0
- package/dist/cli/commands/core/skill-registry-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-registry-commands.js +117 -0
- package/dist/cli/commands/core/skill-runbook-command.d.ts +3 -0
- package/dist/cli/commands/core/skill-runbook-command.js +29 -0
- package/dist/cli/commands/core/standards-command.d.ts +1 -24
- package/dist/cli/commands/core/standards-command.js +33 -201
- package/dist/cli/commands/core/standards-init-command.d.ts +3 -0
- package/dist/cli/commands/core/standards-init-command.js +87 -0
- package/dist/cli/commands/core/standards-lint.d.ts +24 -0
- package/dist/cli/commands/core/standards-lint.js +57 -0
- package/dist/cli/commands/core/standards-migrate-command.d.ts +3 -0
- package/dist/cli/commands/core/standards-migrate-command.js +57 -0
- package/dist/cli/commands/cron-scheduler-commands.d.ts +5 -1
- package/dist/cli/commands/cron-scheduler-commands.js +36 -206
- package/dist/cli/commands/cron-scheduler-run-once-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-run-once-command.js +35 -0
- package/dist/cli/commands/cron-scheduler-shared.d.ts +6 -0
- package/dist/cli/commands/cron-scheduler-shared.js +48 -0
- package/dist/cli/commands/cron-scheduler-start-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-start-command.js +65 -0
- package/dist/cli/commands/cron-scheduler-status-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-status-command.js +46 -0
- package/dist/cli/commands/cron-scheduler-stop-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-stop-command.js +61 -0
- package/dist/cli/commands/dispatch-command-spec.d.ts +2 -0
- package/dist/cli/commands/dispatch-command-spec.js +62 -0
- package/dist/cli/commands/dispatch-commands.js +159 -775
- package/dist/cli/commands/dispatch-dag-envelope.d.ts +41 -0
- package/dist/cli/commands/dispatch-dag-envelope.js +49 -0
- package/dist/cli/commands/dispatch-dag-failure.d.ts +18 -0
- package/dist/cli/commands/dispatch-dag-failure.js +16 -0
- package/dist/cli/commands/dispatch-dag-preflight.d.ts +51 -0
- package/dist/cli/commands/dispatch-dag-preflight.js +105 -0
- package/dist/cli/commands/dispatch-dag-runners.d.ts +48 -0
- package/dist/cli/commands/dispatch-dag-runners.js +73 -0
- package/dist/cli/commands/dispatch-detached-branch.d.ts +3 -0
- package/dist/cli/commands/dispatch-detached-branch.js +58 -0
- package/dist/cli/commands/dispatch-envelope.d.ts +36 -0
- package/dist/cli/commands/dispatch-envelope.js +104 -0
- package/dist/cli/commands/dispatch-from-dag.d.ts +27 -0
- package/dist/cli/commands/dispatch-from-dag.js +87 -257
- package/dist/cli/commands/dispatch-isolation-lease.d.ts +17 -0
- package/dist/cli/commands/dispatch-isolation-lease.js +149 -0
- package/dist/cli/commands/dispatch-preflight.d.ts +7 -0
- package/dist/cli/commands/dispatch-preflight.js +105 -0
- package/dist/cli/commands/dispatch-prompt-blocks.d.ts +10 -0
- package/dist/cli/commands/dispatch-prompt-blocks.js +56 -0
- package/dist/cli/commands/dispatch-prompt-composition.d.ts +30 -0
- package/dist/cli/commands/dispatch-prompt-composition.js +171 -0
- package/dist/cli/commands/dispatch-record-write.d.ts +24 -0
- package/dist/cli/commands/dispatch-record-write.js +96 -0
- package/dist/cli/commands/dispatch-tool-call.d.ts +15 -0
- package/dist/cli/commands/dispatch-tool-call.js +128 -0
- package/dist/cli/commands/evolution-command-shared.d.ts +78 -0
- package/dist/cli/commands/evolution-command-shared.js +107 -0
- package/dist/cli/commands/evolution-commands.d.ts +11 -1
- package/dist/cli/commands/evolution-commands.js +19 -350
- package/dist/cli/commands/evolution-evaluate-command.d.ts +24 -0
- package/dist/cli/commands/evolution-evaluate-command.js +138 -0
- package/dist/cli/commands/evolution-propose-command.d.ts +23 -0
- package/dist/cli/commands/evolution-propose-command.js +145 -0
- package/dist/cli/commands/evolution-status-command.d.ts +17 -0
- package/dist/cli/commands/evolution-status-command.js +41 -0
- package/dist/cli/commands/evolution-verdict-commands.d.ts +30 -0
- package/dist/cli/commands/evolution-verdict-commands.js +100 -0
- package/dist/cli/commands/final-review-command-envelopes.d.ts +44 -0
- package/dist/cli/commands/final-review-command-envelopes.js +100 -0
- package/dist/cli/commands/final-review-command-shared.d.ts +52 -0
- package/dist/cli/commands/final-review-command-shared.js +35 -0
- package/dist/cli/commands/final-review-commands.d.ts +7 -27
- package/dist/cli/commands/final-review-commands.js +13 -240
- package/dist/cli/commands/final-review-prepare-command.d.ts +3 -0
- package/dist/cli/commands/final-review-prepare-command.js +200 -0
- package/dist/cli/commands/finalize-accumulator.d.ts +44 -0
- package/dist/cli/commands/finalize-accumulator.js +55 -0
- package/dist/cli/commands/finalize-branches.d.ts +34 -0
- package/dist/cli/commands/finalize-branches.js +119 -0
- package/dist/cli/commands/finalize-runners.d.ts +3 -0
- package/dist/cli/commands/finalize-runners.js +92 -0
- package/dist/cli/commands/finalize-selection.d.ts +65 -0
- package/dist/cli/commands/finalize-selection.js +35 -0
- package/dist/cli/commands/gate-commands.js +26 -8
- package/dist/cli/commands/governance-classify-contract-commands.d.ts +23 -9
- package/dist/cli/commands/governance-classify-contract-commands.js +26 -269
- package/dist/cli/commands/hooks-command-shared.d.ts +42 -0
- package/dist/cli/commands/hooks-command-shared.js +32 -0
- package/dist/cli/commands/hooks-commands.d.ts +20 -0
- package/dist/cli/commands/hooks-commands.js +75 -309
- package/dist/cli/commands/hooks-install-envelopes.d.ts +6 -0
- package/dist/cli/commands/hooks-install-envelopes.js +144 -0
- package/dist/cli/commands/hooks-status-command.d.ts +3 -0
- package/dist/cli/commands/hooks-status-command.js +93 -0
- package/dist/cli/commands/hooks-uninstall-command.d.ts +3 -0
- package/dist/cli/commands/hooks-uninstall-command.js +43 -0
- package/dist/cli/commands/job-checkpoint-commands.d.ts +3 -0
- package/dist/cli/commands/job-checkpoint-commands.js +157 -0
- package/dist/cli/commands/job-command-shared.d.ts +109 -0
- package/dist/cli/commands/job-command-shared.js +72 -0
- package/dist/cli/commands/job-commands.d.ts +4 -64
- package/dist/cli/commands/job-commands.js +42 -552
- package/dist/cli/commands/job-cost-check-command.d.ts +3 -0
- package/dist/cli/commands/job-cost-check-command.js +41 -0
- package/dist/cli/commands/job-init-status-commands.d.ts +3 -0
- package/dist/cli/commands/job-init-status-commands.js +149 -0
- package/dist/cli/commands/job-run-commands.d.ts +3 -0
- package/dist/cli/commands/job-run-commands.js +97 -0
- package/dist/cli/commands/job-state-root.d.ts +35 -0
- package/dist/cli/commands/job-state-root.js +76 -0
- package/dist/cli/commands/loop-command-shared.d.ts +31 -0
- package/dist/cli/commands/loop-command-shared.js +15 -0
- package/dist/cli/commands/loop-commands.d.ts +12 -17
- package/dist/cli/commands/loop-commands.js +56 -238
- package/dist/cli/commands/loop-eval-capture-index.d.ts +4 -0
- package/dist/cli/commands/loop-eval-capture-index.js +44 -0
- package/dist/cli/commands/loop-eval-commands.d.ts +8 -5
- package/dist/cli/commands/loop-eval-commands.js +12 -626
- package/dist/cli/commands/loop-eval-eval-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-eval-command.js +168 -0
- package/dist/cli/commands/loop-eval-monotonic-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-monotonic-command.js +90 -0
- package/dist/cli/commands/loop-eval-parents.d.ts +7 -0
- package/dist/cli/commands/loop-eval-parents.js +20 -0
- package/dist/cli/commands/loop-eval-run-code.d.ts +7 -0
- package/dist/cli/commands/loop-eval-run-code.js +40 -0
- package/dist/cli/commands/loop-eval-run-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-run-command.js +113 -0
- package/dist/cli/commands/loop-eval-spec-commands.d.ts +3 -0
- package/dist/cli/commands/loop-eval-spec-commands.js +165 -0
- package/dist/cli/commands/loop-eval-spec-lint-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-spec-lint-command.js +42 -0
- package/dist/cli/commands/loop-eval-workflow-commands.d.ts +3 -0
- package/dist/cli/commands/loop-eval-workflow-commands.js +141 -0
- package/dist/cli/commands/loop-export-command.d.ts +3 -0
- package/dist/cli/commands/loop-export-command.js +73 -0
- package/dist/cli/commands/loop-goal-compose-command.d.ts +3 -0
- package/dist/cli/commands/loop-goal-compose-command.js +36 -0
- package/dist/cli/commands/loop-import-command.d.ts +3 -0
- package/dist/cli/commands/loop-import-command.js +86 -0
- package/dist/cli/commands/loop-placeholder-commands.d.ts +3 -0
- package/dist/cli/commands/loop-placeholder-commands.js +52 -0
- package/dist/cli/commands/mcp-commands.d.ts +10 -0
- package/dist/cli/commands/mcp-commands.js +157 -0
- package/dist/cli/commands/memory-command-shared.d.ts +59 -0
- package/dist/cli/commands/memory-command-shared.js +39 -0
- package/dist/cli/commands/memory-commands.d.ts +6 -79
- package/dist/cli/commands/memory-commands.js +19 -309
- package/dist/cli/commands/memory-ingest-command.d.ts +3 -0
- package/dist/cli/commands/memory-ingest-command.js +50 -0
- package/dist/cli/commands/memory-list-command.d.ts +16 -0
- package/dist/cli/commands/memory-list-command.js +129 -0
- package/dist/cli/commands/memory-reindex-command.d.ts +9 -0
- package/dist/cli/commands/memory-reindex-command.js +78 -0
- package/dist/cli/commands/memory-rotate-command.d.ts +3 -0
- package/dist/cli/commands/memory-rotate-command.js +55 -0
- package/dist/cli/commands/memory-search-command.d.ts +7 -0
- package/dist/cli/commands/memory-search-command.js +46 -0
- package/dist/cli/commands/openspec-archive-command.d.ts +3 -0
- package/dist/cli/commands/openspec-archive-command.js +55 -0
- package/dist/cli/commands/openspec-command-shared.d.ts +62 -0
- package/dist/cli/commands/openspec-command-shared.js +135 -0
- package/dist/cli/commands/openspec-commands.d.ts +1 -1
- package/dist/cli/commands/openspec-commands.js +33 -306
- package/dist/cli/commands/openspec-from-doctor-command.d.ts +3 -0
- package/dist/cli/commands/openspec-from-doctor-command.js +66 -0
- package/dist/cli/commands/openspec-init-command.d.ts +3 -0
- package/dist/cli/commands/openspec-init-command.js +49 -0
- package/dist/cli/commands/openspec-list-command.d.ts +3 -0
- package/dist/cli/commands/openspec-list-command.js +27 -0
- package/dist/cli/commands/openspec-render-command.d.ts +3 -0
- package/dist/cli/commands/openspec-render-command.js +33 -0
- package/dist/cli/commands/openspec-show-command.d.ts +3 -0
- package/dist/cli/commands/openspec-show-command.js +33 -0
- package/dist/cli/commands/openspec-to-rd-command.d.ts +3 -0
- package/dist/cli/commands/openspec-to-rd-command.js +33 -0
- package/dist/cli/commands/openspec-validate-command.d.ts +3 -0
- package/dist/cli/commands/openspec-validate-command.js +45 -0
- package/dist/cli/commands/playwright-browser-command.d.ts +8 -0
- package/dist/cli/commands/playwright-browser-command.js +61 -0
- package/dist/cli/commands/playwright-commands.d.ts +10 -62
- package/dist/cli/commands/playwright-commands.js +77 -400
- package/dist/cli/commands/playwright-envelope.d.ts +8 -0
- package/dist/cli/commands/playwright-envelope.js +29 -0
- package/dist/cli/commands/playwright-ls-stop-commands.d.ts +4 -0
- package/dist/cli/commands/playwright-ls-stop-commands.js +74 -0
- package/dist/cli/commands/playwright-session-store.d.ts +65 -0
- package/dist/cli/commands/playwright-session-store.js +189 -0
- package/dist/cli/commands/project-commands.d.ts +19 -0
- package/dist/cli/commands/project-commands.js +98 -259
- package/dist/cli/commands/project-context-command.d.ts +3 -0
- package/dist/cli/commands/project-context-command.js +44 -0
- package/dist/cli/commands/project-dashboard-command.d.ts +3 -0
- package/dist/cli/commands/project-dashboard-command.js +74 -0
- package/dist/cli/commands/project-knowledge-command.d.ts +3 -0
- package/dist/cli/commands/project-knowledge-command.js +48 -0
- package/dist/cli/commands/project-memories-show-command.d.ts +3 -0
- package/dist/cli/commands/project-memories-show-command.js +87 -0
- package/dist/cli/commands/project-memory-index-command.d.ts +3 -0
- package/dist/cli/commands/project-memory-index-command.js +31 -0
- package/dist/cli/commands/qa-archive-screenshots-command.d.ts +3 -0
- package/dist/cli/commands/qa-archive-screenshots-command.js +53 -0
- package/dist/cli/commands/qa-commands.d.ts +14 -87
- package/dist/cli/commands/qa-commands.js +17 -315
- package/dist/cli/commands/qa-context-prestep.d.ts +1 -0
- package/dist/cli/commands/qa-context-prestep.js +34 -0
- package/dist/cli/commands/qa-run-command.d.ts +3 -0
- package/dist/cli/commands/qa-run-command.js +105 -0
- package/dist/cli/commands/qa-run-options.d.ts +23 -0
- package/dist/cli/commands/qa-run-options.js +31 -0
- package/dist/cli/commands/qa-run-slice.d.ts +41 -0
- package/dist/cli/commands/qa-run-slice.js +145 -0
- package/dist/cli/commands/release-canary-command.d.ts +28 -0
- package/dist/cli/commands/release-canary-command.js +129 -0
- package/dist/cli/commands/release-command-shared.d.ts +13 -0
- package/dist/cli/commands/release-command-shared.js +18 -0
- package/dist/cli/commands/release-commands.d.ts +10 -18
- package/dist/cli/commands/release-commands.js +25 -298
- package/dist/cli/commands/release-done-command.d.ts +3 -0
- package/dist/cli/commands/release-done-command.js +64 -0
- package/dist/cli/commands/release-hotfix-command.d.ts +3 -0
- package/dist/cli/commands/release-hotfix-command.js +50 -0
- package/dist/cli/commands/release-plan-command.d.ts +3 -0
- package/dist/cli/commands/release-plan-command.js +33 -0
- package/dist/cli/commands/release-precheck-command.d.ts +3 -0
- package/dist/cli/commands/release-precheck-command.js +28 -0
- package/dist/cli/commands/release-promote-command.d.ts +3 -0
- package/dist/cli/commands/release-promote-command.js +34 -0
- package/dist/cli/commands/release-rollback-command.d.ts +3 -0
- package/dist/cli/commands/release-rollback-command.js +33 -0
- package/dist/cli/commands/release-watch-command.d.ts +3 -0
- package/dist/cli/commands/release-watch-command.js +44 -0
- package/dist/cli/commands/request-command-options.d.ts +49 -0
- package/dist/cli/commands/request-command-options.js +1 -0
- package/dist/cli/commands/request-commands.d.ts +3 -9
- package/dist/cli/commands/request-commands.js +17 -522
- package/dist/cli/commands/request-init-command.d.ts +3 -0
- package/dist/cli/commands/request-init-command.js +100 -0
- package/dist/cli/commands/request-lint-command.d.ts +3 -0
- package/dist/cli/commands/request-lint-command.js +50 -0
- package/dist/cli/commands/request-list-command.d.ts +10 -0
- package/dist/cli/commands/request-list-command.js +53 -0
- package/dist/cli/commands/request-repair-status-command.d.ts +3 -0
- package/dist/cli/commands/request-repair-status-command.js +61 -0
- package/dist/cli/commands/request-show-command.d.ts +3 -0
- package/dist/cli/commands/request-show-command.js +56 -0
- package/dist/cli/commands/request-transition-command.d.ts +3 -0
- package/dist/cli/commands/request-transition-command.js +122 -0
- package/dist/cli/commands/request-transition-failures.d.ts +8 -0
- package/dist/cli/commands/request-transition-failures.js +90 -0
- package/dist/cli/commands/request-transition-hooks.d.ts +50 -0
- package/dist/cli/commands/request-transition-hooks.js +115 -0
- package/dist/cli/commands/request-transition-preflight.d.ts +10 -0
- package/dist/cli/commands/request-transition-preflight.js +107 -0
- package/dist/cli/commands/scan-command-shared.d.ts +96 -0
- package/dist/cli/commands/scan-command-shared.js +83 -0
- package/dist/cli/commands/scan-commands.d.ts +3 -2
- package/dist/cli/commands/scan-commands.js +23 -463
- package/dist/cli/commands/scan-inventory-commands.d.ts +3 -0
- package/dist/cli/commands/scan-inventory-commands.js +96 -0
- package/dist/cli/commands/scan-project-commands.d.ts +3 -0
- package/dist/cli/commands/scan-project-commands.js +65 -0
- package/dist/cli/commands/scan-scope-commands.d.ts +3 -0
- package/dist/cli/commands/scan-scope-commands.js +149 -0
- package/dist/cli/commands/scan-scope-helpers.d.ts +8 -0
- package/dist/cli/commands/scan-scope-helpers.js +54 -0
- package/dist/cli/commands/scan-structural-commands.d.ts +3 -0
- package/dist/cli/commands/scan-structural-commands.js +113 -0
- package/dist/cli/commands/sediment-argv-flags.d.ts +54 -0
- package/dist/cli/commands/sediment-argv-flags.js +116 -0
- package/dist/cli/commands/sediment-command-shared.d.ts +15 -0
- package/dist/cli/commands/sediment-command-shared.js +5 -0
- package/dist/cli/commands/sediment-commands.d.ts +35 -59
- package/dist/cli/commands/sediment-commands.js +36 -590
- package/dist/cli/commands/sediment-pool-commands.d.ts +9 -0
- package/dist/cli/commands/sediment-pool-commands.js +185 -0
- package/dist/cli/commands/sediment-query-commands.d.ts +4 -0
- package/dist/cli/commands/sediment-query-commands.js +94 -0
- package/dist/cli/commands/sediment-release-commands.d.ts +8 -0
- package/dist/cli/commands/sediment-release-commands.js +232 -0
- package/dist/cli/commands/share-commands.d.ts +12 -68
- package/dist/cli/commands/share-commands.js +47 -556
- package/dist/cli/commands/share-error-hints.d.ts +14 -0
- package/dist/cli/commands/share-error-hints.js +38 -0
- package/dist/cli/commands/share-identity.d.ts +13 -0
- package/dist/cli/commands/share-identity.js +22 -0
- package/dist/cli/commands/share-record-paths.d.ts +37 -0
- package/dist/cli/commands/share-record-paths.js +68 -0
- package/dist/cli/commands/share-runners.d.ts +3 -0
- package/dist/cli/commands/share-runners.js +158 -0
- package/dist/cli/commands/shared-read-runners.d.ts +3 -0
- package/dist/cli/commands/shared-read-runners.js +51 -0
- package/dist/cli/commands/slice-check-command.d.ts +3 -0
- package/dist/cli/commands/slice-check-command.js +54 -0
- package/dist/cli/commands/slice-commands.d.ts +2 -22
- package/dist/cli/commands/slice-commands.js +18 -517
- package/dist/cli/commands/slice-decompose-artifacts.d.ts +18 -0
- package/dist/cli/commands/slice-decompose-artifacts.js +79 -0
- package/dist/cli/commands/slice-decompose-command.d.ts +3 -0
- package/dist/cli/commands/slice-decompose-command.js +123 -0
- package/dist/cli/commands/slice-list-commands.d.ts +3 -0
- package/dist/cli/commands/slice-list-commands.js +182 -0
- package/dist/cli/commands/slice-pick-command.d.ts +3 -0
- package/dist/cli/commands/slice-pick-command.js +60 -0
- package/dist/cli/commands/slice-plan-command.d.ts +24 -0
- package/dist/cli/commands/slice-plan-command.js +111 -0
- package/dist/cli/commands/sop-advance-command.d.ts +3 -0
- package/dist/cli/commands/sop-advance-command.js +160 -0
- package/dist/cli/commands/sop-check-command.d.ts +3 -0
- package/dist/cli/commands/sop-check-command.js +44 -0
- package/dist/cli/commands/sop-command-shared.d.ts +23 -0
- package/dist/cli/commands/sop-command-shared.js +18 -0
- package/dist/cli/commands/sop-commands.d.ts +15 -1
- package/dist/cli/commands/sop-commands.js +26 -240
- package/dist/cli/commands/sop-init-command.d.ts +3 -0
- package/dist/cli/commands/sop-init-command.js +51 -0
- package/dist/cli/commands/sop-lint-command.d.ts +3 -0
- package/dist/cli/commands/sop-lint-command.js +64 -0
- package/dist/cli/commands/sop-register-command.d.ts +3 -0
- package/dist/cli/commands/sop-register-command.js +48 -0
- package/dist/cli/commands/sop-registry-command.d.ts +3 -0
- package/dist/cli/commands/sop-registry-command.js +30 -0
- package/dist/cli/commands/statusline-command-shared.d.ts +73 -0
- package/dist/cli/commands/statusline-command-shared.js +90 -0
- package/dist/cli/commands/statusline-commands.d.ts +1 -19
- package/dist/cli/commands/statusline-commands.js +48 -287
- package/dist/cli/commands/statusline-compact-command.d.ts +4 -0
- package/dist/cli/commands/statusline-compact-command.js +54 -0
- package/dist/cli/commands/statusline-install-command.d.ts +3 -0
- package/dist/cli/commands/statusline-install-command.js +48 -0
- package/dist/cli/commands/statusline-render-command.d.ts +9 -0
- package/dist/cli/commands/statusline-render-command.js +55 -0
- package/dist/cli/commands/statusline-status-command.d.ts +3 -0
- package/dist/cli/commands/statusline-status-command.js +23 -0
- package/dist/cli/commands/statusline-uninstall-command.d.ts +3 -0
- package/dist/cli/commands/statusline-uninstall-command.js +23 -0
- package/dist/cli/commands/test-command-run-helpers.d.ts +27 -0
- package/dist/cli/commands/test-command-run-helpers.js +73 -0
- package/dist/cli/commands/test-command-runner-resolution.d.ts +57 -0
- package/dist/cli/commands/test-command-runner-resolution.js +183 -0
- package/dist/cli/commands/test-commands.d.ts +8 -56
- package/dist/cli/commands/test-commands.js +26 -249
- package/dist/cli/commands/vm-command-shared.d.ts +23 -0
- package/dist/cli/commands/vm-command-shared.js +23 -0
- package/dist/cli/commands/vm-commands.d.ts +1 -28
- package/dist/cli/commands/vm-commands.js +36 -270
- package/dist/cli/commands/vm-hypervisor-runtime.d.ts +15 -0
- package/dist/cli/commands/vm-hypervisor-runtime.js +64 -0
- package/dist/cli/commands/vm-release-command.d.ts +5 -0
- package/dist/cli/commands/vm-release-command.js +101 -0
- package/dist/cli/commands/vm-spawn-command.d.ts +5 -0
- package/dist/cli/commands/vm-spawn-command.js +177 -0
- package/dist/cli/commands/web-command-shared.d.ts +12 -0
- package/dist/cli/commands/web-command-shared.js +30 -0
- package/dist/cli/commands/web-commands.d.ts +7 -14
- package/dist/cli/commands/web-commands.js +6 -314
- package/dist/cli/commands/web-install-command.d.ts +10 -0
- package/dist/cli/commands/web-install-command.js +116 -0
- package/dist/cli/commands/web-lifecycle-commands.d.ts +9 -30
- package/dist/cli/commands/web-lifecycle-commands.js +14 -322
- package/dist/cli/commands/web-login-command.d.ts +14 -0
- package/dist/cli/commands/web-login-command.js +189 -0
- package/dist/cli/commands/web-op-payload.d.ts +22 -0
- package/dist/cli/commands/web-op-payload.js +89 -0
- package/dist/cli/commands/web-op-refusals.d.ts +37 -0
- package/dist/cli/commands/web-op-refusals.js +73 -0
- package/dist/cli/commands/web-op-runner.d.ts +14 -0
- package/dist/cli/commands/web-op-runner.js +166 -0
- package/dist/cli/commands/web-status-command.d.ts +4 -0
- package/dist/cli/commands/web-status-command.js +32 -0
- package/dist/cli/commands/web-stop-command.d.ts +10 -0
- package/dist/cli/commands/web-stop-command.js +59 -0
- package/dist/cli/commands/web-verb-specs.d.ts +18 -0
- package/dist/cli/commands/web-verb-specs.js +66 -0
- package/dist/cli/commands/workflow-command-shared.d.ts +102 -0
- package/dist/cli/commands/workflow-command-shared.js +74 -0
- package/dist/cli/commands/workflow-commands.d.ts +10 -1
- package/dist/cli/commands/workflow-commands.js +6 -594
- package/dist/cli/commands/workflow-gate-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-gate-commands.js +116 -0
- package/dist/cli/commands/workflow-graph-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-graph-commands.js +73 -0
- package/dist/cli/commands/workflow-init-command.d.ts +3 -0
- package/dist/cli/commands/workflow-init-command.js +68 -0
- package/dist/cli/commands/workflow-lifecycle-commands.d.ts +9 -59
- package/dist/cli/commands/workflow-lifecycle-commands.js +14 -348
- package/dist/cli/commands/workflow-node-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-node-commands.js +154 -0
- package/dist/cli/commands/workflow-plan-helpers.d.ts +48 -0
- package/dist/cli/commands/workflow-plan-helpers.js +103 -0
- package/dist/cli/commands/workflow-planning-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-planning-commands.js +56 -0
- package/dist/cli/commands/workflow-swarm-actions.d.ts +7 -0
- package/dist/cli/commands/workflow-swarm-actions.js +109 -0
- package/dist/cli/commands/workflow-swarm-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-swarm-commands.js +138 -0
- package/dist/cli/commands/workflow-tech-actions.d.ts +10 -0
- package/dist/cli/commands/workflow-tech-actions.js +150 -0
- package/dist/cli/commands/workflow-terminalize-command.d.ts +3 -0
- package/dist/cli/commands/workflow-terminalize-command.js +56 -0
- package/dist/cli/commands/workspace/init-actions.d.ts +10 -0
- package/dist/cli/commands/workspace/init-actions.js +199 -0
- package/dist/cli/commands/workspace/init-codegraph-stake.d.ts +10 -0
- package/dist/cli/commands/workspace/init-codegraph-stake.js +54 -0
- package/dist/cli/commands/workspace/init-command.d.ts +8 -124
- package/dist/cli/commands/workspace/init-command.js +59 -623
- package/dist/cli/commands/workspace/init-context.d.ts +58 -0
- package/dist/cli/commands/workspace/init-context.js +121 -0
- package/dist/cli/commands/workspace/init-envelope.d.ts +3 -0
- package/dist/cli/commands/workspace/init-envelope.js +34 -0
- package/dist/cli/commands/workspace/init-failures.d.ts +3 -0
- package/dist/cli/commands/workspace/init-failures.js +84 -0
- package/dist/cli/commands/workspace/init-hooks-decision.d.ts +24 -0
- package/dist/cli/commands/workspace/init-hooks-decision.js +189 -0
- package/dist/cli/commands/workspace/init-options.d.ts +102 -0
- package/dist/cli/commands/workspace/init-options.js +1 -0
- package/dist/cli/commands/worktree-lease-commands.d.ts +10 -6
- package/dist/cli/commands/worktree-lease-commands.js +42 -512
- package/dist/cli/commands/worktree-lease-gc-command.d.ts +12 -0
- package/dist/cli/commands/worktree-lease-gc-command.js +117 -0
- package/dist/cli/commands/worktree-lease-git.d.ts +22 -0
- package/dist/cli/commands/worktree-lease-git.js +48 -0
- package/dist/cli/commands/worktree-lease-list-command.d.ts +12 -0
- package/dist/cli/commands/worktree-lease-list-command.js +100 -0
- package/dist/cli/commands/worktree-lease-load.d.ts +37 -0
- package/dist/cli/commands/worktree-lease-load.js +28 -0
- package/dist/cli/commands/worktree-lease-release-command.d.ts +13 -0
- package/dist/cli/commands/worktree-lease-release-command.js +105 -0
- package/dist/cli/commands/worktree-lease-renew-command.d.ts +11 -0
- package/dist/cli/commands/worktree-lease-renew-command.js +99 -0
- package/dist/cli/commands/worktree-lease-session.d.ts +22 -0
- package/dist/cli/commands/worktree-lease-session.js +29 -0
- package/dist/cli/commands/worktree-lease-spawn-command.d.ts +11 -0
- package/dist/cli/commands/worktree-lease-spawn-command.js +119 -0
- package/dist/cli/commands/worktree-lease-status-command.d.ts +11 -0
- package/dist/cli/commands/worktree-lease-status-command.js +86 -0
- package/dist/cli/commands/worktree-lease-store.d.ts +19 -0
- package/dist/cli/commands/worktree-lease-store.js +24 -0
- package/dist/cli/program.js +5 -0
- package/dist/services/code/auto-compact-artifacts.d.ts +54 -0
- package/dist/services/code/auto-compact-artifacts.js +135 -0
- package/dist/services/code/auto-compact-attempt.d.ts +46 -0
- package/dist/services/code/auto-compact-attempt.js +88 -0
- package/dist/services/code/auto-compact-decision.d.ts +74 -0
- package/dist/services/code/auto-compact-decision.js +149 -0
- package/dist/services/code/auto-compact-dispatch-gate.d.ts +36 -0
- package/dist/services/code/auto-compact-dispatch-gate.js +86 -0
- package/dist/services/code/auto-compact-envelopes.d.ts +33 -0
- package/dist/services/code/auto-compact-envelopes.js +134 -0
- package/dist/services/code/auto-compact-history.d.ts +46 -0
- package/dist/services/code/auto-compact-history.js +17 -0
- package/dist/services/code/auto-compact-orchestrator.d.ts +11 -240
- package/dist/services/code/auto-compact-orchestrator.js +165 -686
- package/dist/services/code/auto-compact-run-types.d.ts +123 -0
- package/dist/services/code/auto-compact-run-types.js +1 -0
- package/dist/services/code/emit-handoff.d.ts +35 -1
- package/dist/services/code/emit-handoff.js +128 -7
- package/dist/services/code/step-08-gate.d.ts +28 -19
- package/dist/services/code/step-08-gate.js +92 -35
- package/dist/services/config/config-coercion.d.ts +7 -0
- package/dist/services/config/config-coercion.js +156 -0
- package/dist/services/config/config-file-io.d.ts +11 -0
- package/dist/services/config/config-file-io.js +61 -0
- package/dist/services/config/config-get.d.ts +2 -0
- package/dist/services/config/config-get.js +36 -0
- package/dist/services/config/config-global-loader.d.ts +15 -0
- package/dist/services/config/config-global-loader.js +111 -0
- package/dist/services/config/config-nested-path.d.ts +3 -0
- package/dist/services/config/config-nested-path.js +53 -0
- package/dist/services/config/config-primitives.d.ts +16 -0
- package/dist/services/config/config-primitives.js +24 -0
- package/dist/services/config/config-service.d.ts +9 -33
- package/dist/services/config/config-service.js +16 -665
- package/dist/services/config/config-validation.d.ts +19 -0
- package/dist/services/config/config-validation.js +152 -0
- package/dist/services/config/config-workspace.d.ts +10 -0
- package/dist/services/config/config-workspace.js +158 -0
- package/dist/services/distribution/mcp-install-runner.d.ts +21 -0
- package/dist/services/distribution/mcp-install-runner.js +59 -0
- package/dist/services/distribution/mcp-install.d.ts +95 -0
- package/dist/services/distribution/mcp-install.js +179 -0
- package/dist/services/distribution/plugin-manifest.d.ts +97 -0
- package/dist/services/distribution/plugin-manifest.js +126 -0
- package/dist/services/hooks/mcp-surface-gate.d.ts +19 -0
- package/dist/services/hooks/mcp-surface-gate.js +87 -0
- package/dist/services/ide/adapters/claude-code-adapter.d.ts +4 -35
- package/dist/services/ide/adapters/claude-code-adapter.js +48 -171
- package/dist/services/ide/adapters/claude-code-local-state.d.ts +28 -0
- package/dist/services/ide/adapters/claude-code-local-state.js +112 -0
- package/dist/services/ide/adapters/claude-code-model-window.d.ts +37 -0
- package/dist/services/ide/adapters/claude-code-model-window.js +113 -0
- package/dist/services/ide/ide-mcp-install-types.d.ts +78 -0
- package/dist/services/ide/ide-mcp-install-types.js +104 -0
- package/dist/services/ide/ide-types.d.ts +45 -1
- package/dist/services/ide/mcp-tool-matcher.d.ts +34 -0
- package/dist/services/ide/mcp-tool-matcher.js +84 -0
- package/dist/services/lint/npx-resolver.js +7 -0
- package/dist/services/mcp/cli-executor.d.ts +36 -0
- package/dist/services/mcp/cli-executor.js +97 -0
- package/dist/services/mcp/json-rpc.d.ts +81 -0
- package/dist/services/mcp/json-rpc.js +116 -0
- package/dist/services/mcp/memory-tool.d.ts +3 -0
- package/dist/services/mcp/memory-tool.js +62 -0
- package/dist/services/mcp/server-main.d.ts +1 -0
- package/dist/services/mcp/server-main.js +66 -0
- package/dist/services/mcp/server.d.ts +22 -0
- package/dist/services/mcp/server.js +152 -0
- package/dist/services/mcp/surface.d.ts +62 -0
- package/dist/services/mcp/surface.js +198 -0
- package/dist/services/mcp/tool-core.d.ts +42 -0
- package/dist/services/mcp/tool-core.js +137 -0
- package/dist/services/mcp/tools.d.ts +13 -0
- package/dist/services/mcp/tools.js +58 -0
- package/dist/services/readonly-surface/argv-guard.d.ts +32 -0
- package/dist/services/readonly-surface/argv-guard.js +164 -0
- package/dist/services/readonly-surface/readonly-whitelist.d.ts +147 -0
- package/dist/services/readonly-surface/readonly-whitelist.js +107 -0
- package/dist/services/readonly-surface/whitelist-generator.d.ts +64 -0
- package/dist/services/readonly-surface/whitelist-generator.js +212 -0
- package/dist/services/skills/hooks-codegate-superpowers.d.ts +1 -0
- package/dist/services/skills/hooks-codegate-superpowers.js +26 -0
- package/dist/services/skills/hooks-settings-deny-list.d.ts +61 -0
- package/dist/services/skills/hooks-settings-deny-list.js +173 -0
- package/dist/services/skills/hooks-settings-envelopes.d.ts +20 -0
- package/dist/services/skills/hooks-settings-envelopes.js +79 -0
- package/dist/services/skills/hooks-settings-file-shape.d.ts +43 -0
- package/dist/services/skills/hooks-settings-file-shape.js +207 -0
- package/dist/services/skills/hooks-settings-paths.d.ts +34 -0
- package/dist/services/skills/hooks-settings-paths.js +75 -0
- package/dist/services/skills/hooks-settings-read-installed.d.ts +39 -0
- package/dist/services/skills/hooks-settings-read-installed.js +60 -0
- package/dist/services/skills/hooks-settings-service.d.ts +12 -212
- package/dist/services/skills/hooks-settings-service.js +71 -649
- package/dist/services/skills/hooks-settings-types.d.ts +139 -0
- package/dist/services/skills/hooks-settings-types.js +1 -0
- package/dist/services/workspace/claude-settings-template-merge.d.ts +89 -0
- package/dist/services/workspace/claude-settings-template-merge.js +243 -0
- package/dist/services/workspace/claude-settings-template.d.ts +29 -87
- package/dist/services/workspace/claude-settings-template.js +81 -236
- package/package.json +17 -6
- package/scripts/install-skills-bundles.mjs +233 -0
- package/scripts/install-skills-fs.mjs +148 -0
- package/scripts/install-skills-ide.mjs +279 -0
- package/scripts/install-skills-output-style-default.mjs +196 -0
- package/scripts/install-skills-output-styles.mjs +121 -0
- package/scripts/install-skills-report.mjs +42 -0
- package/scripts/install-skills-user-config.mjs +198 -0
- package/scripts/install-skills.mjs +36 -1066
- package/scripts/watch-tree.mjs +140 -0
- package/scripts/watch.mjs +4 -126
- package/skills/peaks-status/SKILL.md +31 -13
|
@@ -1,14 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `peaks hooks *` — the Peaks-managed hook entry in the adapter's settings.json.
|
|
3
|
+
*
|
|
4
|
+
* The `install` verb and the hook-script distribution stay in this file because
|
|
5
|
+
* three source-scanning guards pin file-level facts to this exact path:
|
|
6
|
+
*
|
|
7
|
+
* - `tests/unit/cli/ide-option-help-lists-the-registry.test.ts` needs an
|
|
8
|
+
* `--ide` option declaration here whose help is derived from the registry;
|
|
9
|
+
* - `tests/unit/runtime/vendor-neutral-identity-guard.test.ts` pins the two
|
|
10
|
+
* user-global Claude Code skill-bridge copy targets to this file
|
|
11
|
+
* (`settingsPaths: 2` in its `KNOWN_DEBT` census);
|
|
12
|
+
* - `tests/unit/hooks/gate-enforce-machine-local-shell.test.ts` scans this
|
|
13
|
+
* file for the CJS module-directory global, because this is where the hook
|
|
14
|
+
* script sources are resolved.
|
|
15
|
+
*
|
|
16
|
+
* The other verbs live beside it: `hooks-uninstall-command.ts`,
|
|
17
|
+
* `hooks-status-command.ts`, the two install envelopes in
|
|
18
|
+
* `hooks-install-envelopes.ts`, and the scope / IDE resolution in
|
|
19
|
+
* `hooks-command-shared.ts`.
|
|
20
|
+
*/
|
|
1
21
|
import { existsSync, copyFileSync, mkdirSync } from 'node:fs';
|
|
2
22
|
import { dirname, resolve } from 'node:path';
|
|
3
23
|
import { fileURLToPath } from 'node:url';
|
|
4
|
-
import { fail, ok } from 'peaks-loop-shared/result';
|
|
5
|
-
import { addJsonOption, printResult, getErrorMessage } from '../cli-helpers.js';
|
|
6
|
-
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
7
|
-
import { applyHookInstall, planHookInstall, readHookStatus, readInstalledEntriesFromSettings, removeHookInstall, listSuperpowersDenyEntries } from '../../services/skills/hooks-settings-service.js';
|
|
8
|
-
import { resolveHookEntries, resolveHookSpec } from '../../services/skills/hooks-codegate-superpowers.js';
|
|
9
|
-
import { readJsonObjectFile } from '../../services/ide/shared/atomic-json.js';
|
|
10
|
-
import { detectIdeFromContext } from '../../services/ide/hook-translator.js';
|
|
11
24
|
import { resolveIdeOptionHelp } from '../../services/ide/ide-registry.js';
|
|
25
|
+
import { fail } from 'peaks-loop-shared/result';
|
|
26
|
+
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
27
|
+
import { resolveIdeForCommand, resolveProjectRoot, resolveScope } from './hooks-command-shared.js';
|
|
28
|
+
import { printInstallApplied, printInstallDryRun } from './hooks-install-envelopes.js';
|
|
29
|
+
import { registerHooksStatusCommand } from './hooks-status-command.js';
|
|
30
|
+
import { registerHooksUninstallCommand } from './hooks-uninstall-command.js';
|
|
12
31
|
/**
|
|
13
32
|
* This module's own directory — `<root>/src/cli/commands` in the source tree,
|
|
14
33
|
* `<root>/dist/cli/commands` in a build. Same reason as
|
|
@@ -19,73 +38,17 @@ import { resolveIdeOptionHelp } from '../../services/ide/ide-registry.js';
|
|
|
19
38
|
* `process.argv[1]` names a different file per entry point.
|
|
20
39
|
*/
|
|
21
40
|
const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
|
|
22
|
-
function resolveScope(options) {
|
|
23
|
-
return options.global ? 'global' : 'project';
|
|
24
|
-
}
|
|
25
|
-
function resolveProjectRoot(scope, project) {
|
|
26
|
-
return scope === 'project'
|
|
27
|
-
? (project ?? findProjectRoot(process.cwd()) ?? process.cwd())
|
|
28
|
-
: undefined;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Resolve the IDE the install should target. The CLI user can override with
|
|
32
|
-
* `--ide <id>`. Otherwise we delegate to `detectIdeFromContext` which checks
|
|
33
|
-
* `process.env[adapter.envVar]` → stdin shape → cwd `.trae`/`.claude` →
|
|
34
|
-
* fallback `'claude-code'`. Pass `parsedStdin: null` since `peaks hooks
|
|
35
|
-
* install` is not invoked from inside an IDE hook — there's no stdin payload.
|
|
36
|
-
*/
|
|
37
|
-
function resolveIdeForCommand(options, projectRoot) {
|
|
38
|
-
if (options.ide !== undefined && options.ide.length > 0) {
|
|
39
|
-
return options.ide;
|
|
40
|
-
}
|
|
41
|
-
return detectIdeFromContext({
|
|
42
|
-
env: process.env,
|
|
43
|
-
cwd: projectRoot ?? process.cwd(),
|
|
44
|
-
parsedStdin: null
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
41
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
42
|
+
* `src/services/hooks/pre-tool-superpowers-bridge.sh` from the peaks-loop repo
|
|
43
|
+
* into the user-global `<userHome>/.claude/skills/peaks-code/hooks/` directory.
|
|
44
|
+
* The user-global copy is treated as a build artifact: it MUST be
|
|
45
|
+
* byte-identical to the repo source after install, and the source of truth is
|
|
46
|
+
* the repo file.
|
|
53
47
|
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*/
|
|
59
|
-
function listExpectedEntriesForIde(ide, _skipProgress = false) {
|
|
60
|
-
// Derived from `resolveHookEntries(ide)` — the same function `planHookInstall`
|
|
61
|
-
// / `applyHookInstall` write from — so the summary can only ever report a
|
|
62
|
-
// shape the install actually produces. The previous version was a
|
|
63
|
-
// hand-written literal under a comment claiming it "mirrors the install
|
|
64
|
-
// shape, NOT a hardcoded expected list" (diagnosis 2026-09-15, C4); the
|
|
65
|
-
// literal had drifted from that claim in both directions: it re-typed the
|
|
66
|
-
// code-gate matcher instead of reading `HOOK_CODE_GATE_MATCHER`, and it
|
|
67
|
-
// reported 2 of the 6 entries a claude-code install writes.
|
|
68
|
-
//
|
|
69
|
-
// The filter is the tool-call event. `resolveHookEntries` also returns the
|
|
70
|
-
// once-per-session SessionStart / PostCompact entries; those are not what a
|
|
71
|
-
// per-call hook-entry summary is read for, and leaving them out is the only
|
|
72
|
-
// place this summary is narrower than the install.
|
|
73
|
-
const event = resolveHookSpec(ide).hookEnforceEvent;
|
|
74
|
-
return resolveHookEntries(ide, _skipProgress)
|
|
75
|
-
.filter((entry) => entry.event === event)
|
|
76
|
-
.map((entry) => ({ matcher: entry.matcher, sentinel: entry.sentinel }));
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* superpowers-bridge hook source from the peaks-loop repo
|
|
80
|
-
* (src/services/hooks/pre-tool-superpowers-bridge.sh) into the user-global
|
|
81
|
-
* `<userHome>/.claude/skills/peaks-code/hooks/` directory. The user-global
|
|
82
|
-
* copy is treated as a build artifact: it MUST be byte-identical to the
|
|
83
|
-
* repo source after install, and the source of truth is the repo file.
|
|
84
|
-
*
|
|
85
|
-
* Why this lives in the install command: the install is the single
|
|
86
|
-
* declared surface where the user-global directory is touched. Adding it
|
|
87
|
-
* here keeps the "hooks only ship from src/services/hooks/" invariant
|
|
88
|
-
* (G10 / AC10) — no other code path writes to `~/.claude/skills/peaks-code/hooks/`.
|
|
48
|
+
* Why this lives in the install command: the install is the single declared
|
|
49
|
+
* surface where the user-global directory is touched. Adding it here keeps the
|
|
50
|
+
* "hooks only ship from src/services/hooks/" invariant (G10 / AC10) — no other
|
|
51
|
+
* code path writes to `~/.claude/skills/peaks-code/hooks/`.
|
|
89
52
|
*
|
|
90
53
|
* Failure modes:
|
|
91
54
|
* - Source file missing (build not run yet) → silently skip and emit a
|
|
@@ -100,49 +63,6 @@ function listExpectedEntriesForIde(ide, _skipProgress = false) {
|
|
|
100
63
|
* Returns `{ copied, source, target }` so the install envelope can report
|
|
101
64
|
* it without forcing the caller to inspect the filesystem.
|
|
102
65
|
*/
|
|
103
|
-
/**
|
|
104
|
-
* `permissions.deny` block from a settings.json object and return
|
|
105
|
-
* every peaks-managed entry currently present. Used by `hooks status`
|
|
106
|
-
* to surface Layer 3 governance state without forcing the caller to
|
|
107
|
-
* re-read the file. Tolerant of missing / malformed `permissions` —
|
|
108
|
-
* a missing field returns an empty array, never throws.
|
|
109
|
-
*/
|
|
110
|
-
function readOnDiskDenyEntries(settings) {
|
|
111
|
-
const permissions = settings.permissions;
|
|
112
|
-
if (!permissions || typeof permissions !== 'object' || Array.isArray(permissions))
|
|
113
|
-
return [];
|
|
114
|
-
const deny = permissions.deny;
|
|
115
|
-
if (!Array.isArray(deny))
|
|
116
|
-
return [];
|
|
117
|
-
return deny.filter((d) => typeof d === 'string');
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* One `nextActions` line for a hook-script copy, or `null` when there is
|
|
121
|
-
* nothing to say.
|
|
122
|
-
*
|
|
123
|
-
* Diagnosis 2026-09-15 (C7): the copy failure used to be reported as a single
|
|
124
|
-
* sentence — `'<x> hook not copied (source missing or non-global scope)'` —
|
|
125
|
-
* which merged a real build failure into the expected project-scope no-op.
|
|
126
|
-
* Only `scope === 'global'` copies these scripts at all (see the call sites),
|
|
127
|
-
* so in project scope the sentence described normal behaviour in the wording
|
|
128
|
-
* of a fault, and a healthy `peaks hooks install` read as broken.
|
|
129
|
-
*
|
|
130
|
-
* Scope is therefore what decides the sentence, and it is knowable here — the
|
|
131
|
-
* copy helper cannot tell the two cases apart because both return
|
|
132
|
-
* `copied: false`, but the caller can. Project scope emits no line: there is
|
|
133
|
-
* no action to take, and the envelope's `bridgeHookCopy` / `codeGateHookCopy`
|
|
134
|
-
* field still reports `copied: false` for anyone reading the JSON.
|
|
135
|
-
*/
|
|
136
|
-
function describeHookCopy(label, copy, scope, dryRun) {
|
|
137
|
-
if (scope !== 'global')
|
|
138
|
-
return null;
|
|
139
|
-
if (copy.copied) {
|
|
140
|
-
return dryRun
|
|
141
|
-
? `would copy ${label} from ${copy.source} to ${copy.target}`
|
|
142
|
-
: `Copied ${label}: ${copy.target}`;
|
|
143
|
-
}
|
|
144
|
-
return `${label} NOT copied — source missing at ${copy.source}. Run the build (\`pnpm build\`) so the script ships with the package.`;
|
|
145
|
-
}
|
|
146
66
|
function copyBridgeHookIfPresent(userHome, dryRun = false) {
|
|
147
67
|
const source = resolve(MODULE_DIR, '..', '..', 'services', 'hooks', 'pre-tool-superpowers-bridge.sh');
|
|
148
68
|
const target = resolve(userHome, '.claude', 'skills', 'peaks-code', 'hooks', 'pre-tool-superpowers-bridge.sh');
|
|
@@ -157,6 +77,7 @@ function copyBridgeHookIfPresent(userHome, dryRun = false) {
|
|
|
157
77
|
return { copied: true, source, target };
|
|
158
78
|
}
|
|
159
79
|
/**
|
|
80
|
+
* The same distribution for the code-gate hook
|
|
160
81
|
* source (`src/services/hooks/pre-tool-code-gate.sh`) into the user-
|
|
161
82
|
* global peaks-code hooks dir, mirroring the bridge-hook copy. The
|
|
162
83
|
* hook itself is vendor-neutral (no `claude` / `anthropic` strings in
|
|
@@ -178,6 +99,42 @@ function copyCodeGateHookIfPresent(userHome, dryRun = false) {
|
|
|
178
99
|
copyFileSync(source, target);
|
|
179
100
|
return { copied: true, source, target };
|
|
180
101
|
}
|
|
102
|
+
/** The `{ copied: false, source: '', target: '' }` a non-global scope reports. */
|
|
103
|
+
const NO_COPY = { copied: false, source: '', target: '' };
|
|
104
|
+
/**
|
|
105
|
+
* The two hook-script copies for this scope. Only a global install distributes
|
|
106
|
+
* them; a project install reports the no-op shape the envelope has always
|
|
107
|
+
* carried. In `--dry-run` the copies report what they WOULD do and write
|
|
108
|
+
* nothing — their target is the user's home directory.
|
|
109
|
+
*/
|
|
110
|
+
function hookScriptCopies(scope, dryRun) {
|
|
111
|
+
const home = process.env.USERPROFILE ?? process.env.HOME ?? '';
|
|
112
|
+
return {
|
|
113
|
+
bridgeCopy: scope === 'global' ? copyBridgeHookIfPresent(home, dryRun) : NO_COPY,
|
|
114
|
+
codeGateCopy: scope === 'global' ? copyCodeGateHookIfPresent(home, dryRun) : NO_COPY
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
function runHooksInstall(io, options) {
|
|
118
|
+
const scope = resolveScope(options);
|
|
119
|
+
const projectRoot = resolveProjectRoot(scope, options.project);
|
|
120
|
+
const ide = resolveIdeForCommand(options, projectRoot);
|
|
121
|
+
const skipProgress = options.progress === false;
|
|
122
|
+
const ctx = { scope, projectRoot, ide, skipProgress };
|
|
123
|
+
try {
|
|
124
|
+
const dryRun = options.dryRun === true;
|
|
125
|
+
const copies = hookScriptCopies(scope, dryRun);
|
|
126
|
+
if (dryRun) {
|
|
127
|
+
printInstallDryRun(io, options, ctx, copies);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
printInstallApplied(io, options, ctx, copies);
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
const message = getErrorMessage(error);
|
|
134
|
+
printResult(io, fail('hooks.install', 'HOOKS_INSTALL_FAILED', message, { scope, ide, applied: false, skipProgress }, [message]), options.json);
|
|
135
|
+
process.exitCode = 1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
181
138
|
export function registerHooksCommands(program, io) {
|
|
182
139
|
const hooks = program
|
|
183
140
|
.command('hooks')
|
|
@@ -189,198 +146,7 @@ export function registerHooksCommands(program, io) {
|
|
|
189
146
|
.option('--project <path>', 'project root path (auto-detected from cwd when omitted)')
|
|
190
147
|
.option('--ide <id>', resolveIdeOptionHelp())
|
|
191
148
|
.option('--dry-run', 'show what would change without writing')
|
|
192
|
-
.option('--no-progress', 'skip the progress-start PreToolUse hook entry; install ONLY the gate-enforce entry')).action((options) =>
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
const ide = resolveIdeForCommand(options, projectRoot);
|
|
196
|
-
const skipProgress = options.progress === false;
|
|
197
|
-
try {
|
|
198
|
-
if (options.dryRun === true) {
|
|
199
|
-
const plan = planHookInstall(scope, projectRoot, { ide, skipProgress });
|
|
200
|
-
const dryRunEntries = listExpectedEntriesForIde(ide, skipProgress);
|
|
201
|
-
// `dryRun: true` — a --dry-run must not write anything, and these
|
|
202
|
-
// helpers' target is the user's home directory.
|
|
203
|
-
const bridgeCopy = scope === 'global'
|
|
204
|
-
? copyBridgeHookIfPresent(process.env.USERPROFILE ?? process.env.HOME ?? '', true)
|
|
205
|
-
: { copied: false, source: '', target: '' };
|
|
206
|
-
// code-gate hook script. The runtime gate lives at
|
|
207
|
-
// `peaks code-gate --json` (registered as a PreToolUse entry
|
|
208
|
-
// in the install output); the script is the build artifact
|
|
209
|
-
// distributed alongside the bridge hook.
|
|
210
|
-
const codeGateCopy = scope === 'global'
|
|
211
|
-
? copyCodeGateHookIfPresent(process.env.USERPROFILE ?? process.env.HOME ?? '', true)
|
|
212
|
-
: { copied: false, source: '', target: '' };
|
|
213
|
-
printResult(io, ok('hooks.install', {
|
|
214
|
-
...plan,
|
|
215
|
-
ide,
|
|
216
|
-
applied: false,
|
|
217
|
-
dryRun: true,
|
|
218
|
-
skipProgress,
|
|
219
|
-
entries: dryRunEntries,
|
|
220
|
-
bridgeHookCopy: bridgeCopy,
|
|
221
|
-
codeGateHookCopy: codeGateCopy,
|
|
222
|
-
// Layer 3 deny entries the install WOULD write. The
|
|
223
|
-
// dry-run branch never actually invokes
|
|
224
|
-
// `applyHookInstall`, so the on-disk snapshot is not
|
|
225
|
-
// consulted here — the list is the desired-state
|
|
226
|
-
// constant for clarity in the JSON envelope.
|
|
227
|
-
permissionsDenyEntries: listSuperpowersDenyEntries()
|
|
228
|
-
}, [], [
|
|
229
|
-
`would install ${dryRunEntries.length} peaks-managed hook entries`,
|
|
230
|
-
// Name the target file of every entry: the gate-enforce entry is
|
|
231
|
-
// routed to the machine-local settings file (see
|
|
232
|
-
// `resolveHookTargets`), so a summary that only listed
|
|
233
|
-
// `settingsPath` + the entry names read as if it landed in the
|
|
234
|
-
// committed, shared file.
|
|
235
|
-
...plan.entryTargets.map((entry) => `would write ${entry.matcher || '(no matcher)'} → ${entry.sentinel} to ${entry.settingsPath}`),
|
|
236
|
-
`would write ${listSuperpowersDenyEntries().length} permissions.deny entries (Layer 3 worktree governance)`,
|
|
237
|
-
describeHookCopy('bridge hook', bridgeCopy, scope, true),
|
|
238
|
-
describeHookCopy('code-gate hook', codeGateCopy, scope, true)
|
|
239
|
-
].filter((line) => line !== null)), options.json);
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
const result = applyHookInstall(scope, projectRoot, { ide, skipProgress });
|
|
243
|
-
// Slice #3: build the per-IDE entries summary for the IDE the user
|
|
244
|
-
// targeted, not the slice #1 PEAKS_HOOK_ENTRIES constant (which is the
|
|
245
|
-
// claude-code default). The summary is derived from the install's own
|
|
246
|
-
// entry table — see `listExpectedEntriesForIde`.
|
|
247
|
-
const installedEntries = listExpectedEntriesForIde(ide, skipProgress);
|
|
248
|
-
// the install targets global scope, also copy the superpowers-bridge
|
|
249
|
-
// hook script from src/services/hooks/ to the user-global hooks
|
|
250
|
-
// directory. Project scope does not need this — project's
|
|
251
|
-
// .claude/skills/peaks-code is already a junction into the npm source.
|
|
252
|
-
const bridgeCopy = scope === 'global'
|
|
253
|
-
? copyBridgeHookIfPresent(process.env.USERPROFILE ?? process.env.HOME ?? '')
|
|
254
|
-
: { copied: false, source: '', target: '' };
|
|
255
|
-
// code-gate hook script. The runtime gate lives at
|
|
256
|
-
// `peaks code-gate --json` (registered as a PreToolUse entry
|
|
257
|
-
// in the install output); the script is the build artifact
|
|
258
|
-
// distributed alongside the bridge hook.
|
|
259
|
-
const codeGateCopy = scope === 'global'
|
|
260
|
-
? copyCodeGateHookIfPresent(process.env.USERPROFILE ?? process.env.HOME ?? '')
|
|
261
|
-
: { copied: false, source: '', target: '' };
|
|
262
|
-
const nextActions = result.applied
|
|
263
|
-
? [
|
|
264
|
-
'Restart the IDE (or reload the workspace) so the hook entries take effect',
|
|
265
|
-
`Installed: ${installedEntries.map((e) => `${e.matcher}→${e.sentinel}`).join(', ')}`,
|
|
266
|
-
// write alongside the hook install — single atomic write.
|
|
267
|
-
`Layer 3 deny: wrote ${listSuperpowersDenyEntries().length} permissions.deny entries (worktree governance)`,
|
|
268
|
-
describeHookCopy('bridge hook', bridgeCopy, scope, false),
|
|
269
|
-
describeHookCopy('code-gate hook', codeGateCopy, scope, false)
|
|
270
|
-
].filter((line) => line !== null)
|
|
271
|
-
: [describeHookCopy('bridge hook', bridgeCopy, scope, false)].filter((line) => line !== null);
|
|
272
|
-
// in the JSON envelope so downstream automation (audit / sc) can
|
|
273
|
-
// confirm Layer 3 was applied without re-reading the file. When
|
|
274
|
-
// the install is a no-op (`applied: false`) the deny block was
|
|
275
|
-
// already on disk from a prior install; we still emit the
|
|
276
|
-
// current desired list for symmetry with the dry-run envelope.
|
|
277
|
-
const denyEntries = listSuperpowersDenyEntries();
|
|
278
|
-
printResult(io, ok('hooks.install', {
|
|
279
|
-
...result,
|
|
280
|
-
ide,
|
|
281
|
-
dryRun: false,
|
|
282
|
-
skipProgress,
|
|
283
|
-
entries: installedEntries.map((e) => ({ matcher: e.matcher, sentinel: e.sentinel })),
|
|
284
|
-
bridgeHookCopy: bridgeCopy,
|
|
285
|
-
codeGateHookCopy: codeGateCopy,
|
|
286
|
-
permissionsDenyApplied: result.applied,
|
|
287
|
-
permissionsDenyEntries: denyEntries
|
|
288
|
-
}, [], nextActions), options.json);
|
|
289
|
-
}
|
|
290
|
-
catch (error) {
|
|
291
|
-
const message = getErrorMessage(error);
|
|
292
|
-
printResult(io, fail('hooks.install', 'HOOKS_INSTALL_FAILED', message, { scope, ide, applied: false, skipProgress }, [message]), options.json);
|
|
293
|
-
process.exitCode = 1;
|
|
294
|
-
}
|
|
295
|
-
});
|
|
296
|
-
addJsonOption(hooks
|
|
297
|
-
.command('uninstall')
|
|
298
|
-
.description('Remove the peaks-managed gate-enforce hook entry from the target settings.json. Any legacy progress-start entry that a pre-#014 install left behind is also removed (sentinel-based scan). Third-party hooks are preserved.')
|
|
299
|
-
.option('--global', 'remove from the user-level ~/.claude/settings.json instead of the project')
|
|
300
|
-
.option('--project <path>', 'project root path (auto-detected from cwd when omitted)')
|
|
301
|
-
.option('--ide <id>', resolveIdeOptionHelp())).action((options) => {
|
|
302
|
-
const scope = resolveScope(options);
|
|
303
|
-
const projectRoot = resolveProjectRoot(scope, options.project);
|
|
304
|
-
const ide = resolveIdeForCommand(options, projectRoot);
|
|
305
|
-
try {
|
|
306
|
-
const result = removeHookInstall(scope, projectRoot, { ide });
|
|
307
|
-
// bookkeeping. `permissionsDenyRemoved` mirrors `removed` (the
|
|
308
|
-
// service strips deny entries on the same atomic write that
|
|
309
|
-
// strips the hook entries; they share the same boolean).
|
|
310
|
-
printResult(io, ok('hooks.uninstall', {
|
|
311
|
-
...result,
|
|
312
|
-
ide,
|
|
313
|
-
permissionsDenyRemoved: result.removed,
|
|
314
|
-
permissionsDenyEntries: listSuperpowersDenyEntries()
|
|
315
|
-
}), options.json);
|
|
316
|
-
}
|
|
317
|
-
catch (error) {
|
|
318
|
-
const message = getErrorMessage(error);
|
|
319
|
-
printResult(io, fail('hooks.uninstall', 'HOOKS_UNINSTALL_FAILED', message, { scope, ide, removed: false }, [
|
|
320
|
-
message
|
|
321
|
-
]), options.json);
|
|
322
|
-
process.exitCode = 1;
|
|
323
|
-
}
|
|
324
|
-
});
|
|
325
|
-
addJsonOption(hooks
|
|
326
|
-
.command('status')
|
|
327
|
-
.description('Report which peaks-managed hook entries are installed.')
|
|
328
|
-
.option('--global', 'inspect the user-level ~/.claude/settings.json instead of the project')
|
|
329
|
-
.option('--project <path>', 'project root path (auto-detected from cwd when omitted)')
|
|
330
|
-
.option('--ide <id>', resolveIdeOptionHelp())).action((options) => {
|
|
331
|
-
const scope = resolveScope(options);
|
|
332
|
-
const projectRoot = resolveProjectRoot(scope, options.project);
|
|
333
|
-
const ide = resolveIdeForCommand(options, projectRoot);
|
|
334
|
-
try {
|
|
335
|
-
const status = readHookStatus(scope, projectRoot, { ide });
|
|
336
|
-
// Slice #014: read the ACTUAL on-disk entries (post-install shape),
|
|
337
|
-
// not the IDE-EXPECTED list. Pre-#014 `listInstalledEntriesForIde`
|
|
338
|
-
// returned the expected list and reported `entries: [Bash, Task]`
|
|
339
|
-
// even when the file only had `Bash`. The new helper reads the
|
|
340
|
-
// file and reports whatever peaks-managed entries are present,
|
|
341
|
-
// including any legacy progress-start entry that a pre-#014
|
|
342
|
-
// install left behind.
|
|
343
|
-
const settingsPath = status.settingsPath;
|
|
344
|
-
const settings = existsSync(settingsPath) ? readJsonObjectFile(settingsPath) : {};
|
|
345
|
-
// The gate-enforce entry is materialized into the machine-local
|
|
346
|
-
// settings file (see `resolveHookTargets`), so the on-disk entry list
|
|
347
|
-
// must be read from both files or `status` would report it missing.
|
|
348
|
-
const localSettings = status.localSettingsPath !== undefined && existsSync(status.localSettingsPath)
|
|
349
|
-
? readJsonObjectFile(status.localSettingsPath)
|
|
350
|
-
: {};
|
|
351
|
-
// entries actually on disk. We read the existing settings.json
|
|
352
|
-
// (above) and surface its `permissions.deny` block. Any entry
|
|
353
|
-
// that matches the current `SUPERPOWERS_DENIED_SKILLS` set is
|
|
354
|
-
// considered "peaks-managed"; user-written entries are passed
|
|
355
|
-
// through verbatim so the envelope reflects reality. The desired
|
|
356
|
-
// list is also included for parity with install / uninstall.
|
|
357
|
-
const onDiskDeny = readOnDiskDenyEntries(settings);
|
|
358
|
-
// `status` reports the state of the world; for an IDE that cannot host a
|
|
359
|
-
// hook the state of the world is "none, and none is possible". The exit
|
|
360
|
-
// code stays 0 (the query succeeded) and the payload carries the finding
|
|
361
|
-
// — `supportsHooks: false` on the data, plus a warning naming the IDE, so
|
|
362
|
-
// the negative fact is not confused with "supported IDE, nothing
|
|
363
|
-
// installed yet".
|
|
364
|
-
const warnings = status.supportsHooks
|
|
365
|
-
? []
|
|
366
|
-
: [
|
|
367
|
-
`IDE '${ide}' cannot host peaks hooks (no HOOK_COMMAND_BY_IDE entry); nothing can be installed for it, which is why none is.`
|
|
368
|
-
];
|
|
369
|
-
printResult(io, ok('hooks.status', {
|
|
370
|
-
...status,
|
|
371
|
-
ide,
|
|
372
|
-
entries: [
|
|
373
|
-
...readInstalledEntriesFromSettings(settings, ide),
|
|
374
|
-
...readInstalledEntriesFromSettings(localSettings, ide)
|
|
375
|
-
],
|
|
376
|
-
permissionsDenyEntries: listSuperpowersDenyEntries(),
|
|
377
|
-
permissionsDenyOnDisk: onDiskDeny
|
|
378
|
-
}, warnings), options.json);
|
|
379
|
-
}
|
|
380
|
-
catch (error) {
|
|
381
|
-
const message = getErrorMessage(error);
|
|
382
|
-
printResult(io, fail('hooks.status', 'HOOKS_STATUS_FAILED', message, { scope, ide }, [message]), options.json);
|
|
383
|
-
process.exitCode = 1;
|
|
384
|
-
}
|
|
385
|
-
});
|
|
149
|
+
.option('--no-progress', 'skip the progress-start PreToolUse hook entry; install ONLY the gate-enforce entry')).action((options) => runHooksInstall(io, options));
|
|
150
|
+
registerHooksUninstallCommand(hooks, io);
|
|
151
|
+
registerHooksStatusCommand(hooks, io);
|
|
386
152
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type ProgramIO } from '../cli-helpers.js';
|
|
2
|
+
import type { HookCliOptions, HookScriptCopies, InstallContext } from './hooks-command-shared.js';
|
|
3
|
+
/** The `--dry-run` envelope: what the install WOULD write, and nothing written. */
|
|
4
|
+
export declare function printInstallDryRun(io: ProgramIO, options: HookCliOptions, ctx: InstallContext, copies: HookScriptCopies): void;
|
|
5
|
+
/** The applying envelope: the install's own result plus the copies and the deny state. */
|
|
6
|
+
export declare function printInstallApplied(io: ProgramIO, options: HookCliOptions, ctx: InstallContext, copies: HookScriptCopies): void;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// src/cli/commands/hooks-install-envelopes.ts
|
|
2
|
+
//
|
|
3
|
+
// The two envelopes `peaks hooks install` renders: the `--dry-run` preview and
|
|
4
|
+
// the applied result. Split out of `hooks-commands.ts`; the per-IDE entry
|
|
5
|
+
// summary, the Layer 3 deny lines and every envelope key are unchanged. The
|
|
6
|
+
// hook-script copies are computed by the caller (`hooks-commands.ts`, which owns
|
|
7
|
+
// the two user-global paths) and handed in.
|
|
8
|
+
import { listSuperpowersDenyEntries, planHookInstall, applyHookInstall } from '../../services/skills/hooks-settings-service.js';
|
|
9
|
+
import { resolveHookEntries, resolveHookSpec } from '../../services/skills/hooks-codegate-superpowers.js';
|
|
10
|
+
import { ok } from 'peaks-loop-shared/result';
|
|
11
|
+
import { printResult } from '../cli-helpers.js';
|
|
12
|
+
/**
|
|
13
|
+
* Slice #014: compute the per-IDE peaks hook entries for the install /
|
|
14
|
+
* dry-run RESPONSE SUMMARY. This is the *desired* shape (what the install
|
|
15
|
+
* WOULD write), not what is on disk. The status command uses a different
|
|
16
|
+
* helper (`readInstalledEntriesFromSettings`) that reads the actual
|
|
17
|
+
* settings.json.
|
|
18
|
+
*
|
|
19
|
+
* After slice #014 only the gate-enforce entry is ever installed
|
|
20
|
+
* (the legacy progress-start surface is gone). The summary mirrors
|
|
21
|
+
* the install shape so the JSON envelope doesn't claim a hook the
|
|
22
|
+
* service did not write.
|
|
23
|
+
*/
|
|
24
|
+
function listExpectedEntriesForIde(ide, _skipProgress = false) {
|
|
25
|
+
// Derived from `resolveHookEntries(ide)` — the same function `planHookInstall`
|
|
26
|
+
// / `applyHookInstall` write from — so the summary can only ever report a
|
|
27
|
+
// shape the install actually produces. The previous version was a
|
|
28
|
+
// hand-written literal under a comment claiming it "mirrors the install
|
|
29
|
+
// shape, NOT a hardcoded expected list" (diagnosis 2026-09-15, C4); the
|
|
30
|
+
// literal had drifted from that claim in both directions: it re-typed the
|
|
31
|
+
// code-gate matcher instead of reading `HOOK_CODE_GATE_MATCHER`, and it
|
|
32
|
+
// reported 2 of the 6 entries a claude-code install writes.
|
|
33
|
+
//
|
|
34
|
+
// The filter is the tool-call event. `resolveHookEntries` also returns the
|
|
35
|
+
// once-per-session SessionStart / PostCompact entries; those are not what a
|
|
36
|
+
// per-call hook-entry summary is read for, and leaving them out is the only
|
|
37
|
+
// place this summary is narrower than the install.
|
|
38
|
+
const event = resolveHookSpec(ide).hookEnforceEvent;
|
|
39
|
+
return resolveHookEntries(ide, _skipProgress)
|
|
40
|
+
.filter((entry) => entry.event === event)
|
|
41
|
+
.map((entry) => ({ matcher: entry.matcher, sentinel: entry.sentinel }));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* One `nextActions` line for a hook-script copy, or `null` when there is
|
|
45
|
+
* nothing to say.
|
|
46
|
+
*
|
|
47
|
+
* Diagnosis 2026-09-15 (C7): the copy failure used to be reported as a single
|
|
48
|
+
* sentence — `'<x> hook not copied (source missing or non-global scope)'` —
|
|
49
|
+
* which merged a real build failure into the expected project-scope no-op.
|
|
50
|
+
* Only `scope === 'global'` copies these scripts at all (see the call sites),
|
|
51
|
+
* so in project scope the sentence described normal behaviour in the wording
|
|
52
|
+
* of a fault, and a healthy `peaks hooks install` read as broken.
|
|
53
|
+
*
|
|
54
|
+
* Scope is therefore what decides the sentence, and it is knowable here — the
|
|
55
|
+
* copy helper cannot tell the two cases apart because both return
|
|
56
|
+
* `copied: false`, but the caller can. Project scope emits no line: there is
|
|
57
|
+
* no action to take, and the envelope's `bridgeHookCopy` / `codeGateHookCopy`
|
|
58
|
+
* field still reports `copied: false` for anyone reading the JSON.
|
|
59
|
+
*/
|
|
60
|
+
function describeHookCopy(label, copy, scope, dryRun) {
|
|
61
|
+
if (scope !== 'global')
|
|
62
|
+
return null;
|
|
63
|
+
if (copy.copied) {
|
|
64
|
+
return dryRun
|
|
65
|
+
? `would copy ${label} from ${copy.source} to ${copy.target}`
|
|
66
|
+
: `Copied ${label}: ${copy.target}`;
|
|
67
|
+
}
|
|
68
|
+
return `${label} NOT copied — source missing at ${copy.source}. Run the build (\`pnpm build\`) so the script ships with the package.`;
|
|
69
|
+
}
|
|
70
|
+
/** The `--dry-run` envelope: what the install WOULD write, and nothing written. */
|
|
71
|
+
export function printInstallDryRun(io, options, ctx, copies) {
|
|
72
|
+
const plan = planHookInstall(ctx.scope, ctx.projectRoot, {
|
|
73
|
+
ide: ctx.ide,
|
|
74
|
+
skipProgress: ctx.skipProgress
|
|
75
|
+
});
|
|
76
|
+
const dryRunEntries = listExpectedEntriesForIde(ctx.ide, ctx.skipProgress);
|
|
77
|
+
const { bridgeCopy, codeGateCopy } = copies;
|
|
78
|
+
printResult(io, ok('hooks.install', {
|
|
79
|
+
...plan,
|
|
80
|
+
ide: ctx.ide,
|
|
81
|
+
applied: false,
|
|
82
|
+
dryRun: true,
|
|
83
|
+
skipProgress: ctx.skipProgress,
|
|
84
|
+
entries: dryRunEntries,
|
|
85
|
+
bridgeHookCopy: bridgeCopy,
|
|
86
|
+
codeGateHookCopy: codeGateCopy,
|
|
87
|
+
// Layer 3 deny entries the install WOULD write. The
|
|
88
|
+
// dry-run branch never actually invokes
|
|
89
|
+
// `applyHookInstall`, so the on-disk snapshot is not
|
|
90
|
+
// consulted here — the list is the desired-state
|
|
91
|
+
// constant for clarity in the JSON envelope.
|
|
92
|
+
permissionsDenyEntries: listSuperpowersDenyEntries()
|
|
93
|
+
}, [], [
|
|
94
|
+
`would install ${dryRunEntries.length} peaks-managed hook entries`,
|
|
95
|
+
// Name the target file of every entry: the gate-enforce entry is
|
|
96
|
+
// routed to the machine-local settings file (see
|
|
97
|
+
// `resolveHookTargets`), so a summary that only listed
|
|
98
|
+
// `settingsPath` + the entry names read as if it landed in the
|
|
99
|
+
// committed, shared file.
|
|
100
|
+
...plan.entryTargets.map((entry) => `would write ${entry.matcher || '(no matcher)'} → ${entry.sentinel} to ${entry.settingsPath}`),
|
|
101
|
+
`would write ${listSuperpowersDenyEntries().length} permissions.deny entries (Layer 3 worktree governance)`,
|
|
102
|
+
describeHookCopy('bridge hook', bridgeCopy, ctx.scope, true),
|
|
103
|
+
describeHookCopy('code-gate hook', codeGateCopy, ctx.scope, true)
|
|
104
|
+
].filter((line) => line !== null)), options.json);
|
|
105
|
+
}
|
|
106
|
+
/** The applying envelope: the install's own result plus the copies and the deny state. */
|
|
107
|
+
export function printInstallApplied(io, options, ctx, copies) {
|
|
108
|
+
const result = applyHookInstall(ctx.scope, ctx.projectRoot, {
|
|
109
|
+
ide: ctx.ide,
|
|
110
|
+
skipProgress: ctx.skipProgress
|
|
111
|
+
});
|
|
112
|
+
// Slice #3: build the per-IDE entries summary for the IDE the user
|
|
113
|
+
// targeted, not the slice #1 PEAKS_HOOK_ENTRIES constant (which is the
|
|
114
|
+
// claude-code default). The summary is derived from the install's own
|
|
115
|
+
// entry table — see `listExpectedEntriesForIde`.
|
|
116
|
+
const installedEntries = listExpectedEntriesForIde(ctx.ide, ctx.skipProgress);
|
|
117
|
+
const { bridgeCopy, codeGateCopy } = copies;
|
|
118
|
+
const nextActions = result.applied
|
|
119
|
+
? [
|
|
120
|
+
'Restart the IDE (or reload the workspace) so the hook entries take effect',
|
|
121
|
+
`Installed: ${installedEntries.map((e) => `${e.matcher}→${e.sentinel}`).join(', ')}`,
|
|
122
|
+
// write alongside the hook install — single atomic write.
|
|
123
|
+
`Layer 3 deny: wrote ${listSuperpowersDenyEntries().length} permissions.deny entries (worktree governance)`,
|
|
124
|
+
describeHookCopy('bridge hook', bridgeCopy, ctx.scope, false),
|
|
125
|
+
describeHookCopy('code-gate hook', codeGateCopy, ctx.scope, false)
|
|
126
|
+
].filter((line) => line !== null)
|
|
127
|
+
: [describeHookCopy('bridge hook', bridgeCopy, ctx.scope, false)].filter((line) => line !== null);
|
|
128
|
+
// in the JSON envelope so downstream automation (audit / sc) can
|
|
129
|
+
// confirm Layer 3 was applied without re-reading the file. When
|
|
130
|
+
// the install is a no-op (`applied: false`) the deny block was
|
|
131
|
+
// already on disk from a prior install; we still emit the
|
|
132
|
+
// current desired list for symmetry with the dry-run envelope.
|
|
133
|
+
printResult(io, ok('hooks.install', {
|
|
134
|
+
...result,
|
|
135
|
+
ide: ctx.ide,
|
|
136
|
+
dryRun: false,
|
|
137
|
+
skipProgress: ctx.skipProgress,
|
|
138
|
+
entries: installedEntries.map((e) => ({ matcher: e.matcher, sentinel: e.sentinel })),
|
|
139
|
+
bridgeHookCopy: bridgeCopy,
|
|
140
|
+
codeGateHookCopy: codeGateCopy,
|
|
141
|
+
permissionsDenyApplied: result.applied,
|
|
142
|
+
permissionsDenyEntries: listSuperpowersDenyEntries()
|
|
143
|
+
}, [], nextActions), options.json);
|
|
144
|
+
}
|