peaks-loop 4.1.3 → 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 +2 -2
- package/CHANGELOG.md +56 -0
- package/README-en.md +1 -1
- package/README.md +1 -1
- 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/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-emit-handoff-command.js +40 -3
- package/dist/cli/commands/code-gate-step-08-command.js +25 -9
- 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/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/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-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-from-dag.d.ts +27 -0
- package/dist/cli/commands/dispatch-from-dag.js +87 -257
- 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/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/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-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/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/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/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-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-terminalize-command.d.ts +3 -0
- package/dist/cli/commands/workflow-terminalize-command.js +56 -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/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 -657
- 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 +5 -5
|
@@ -23,10 +23,11 @@
|
|
|
23
23
|
* it can be unit-tested in isolation and so the on-disk file matches
|
|
24
24
|
* the in-memory template byte-for-byte.
|
|
25
25
|
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
* that matcher's gate is
|
|
29
|
-
*
|
|
26
|
+
* Four `Bash` matchers are emitted: the Step 0.8 mechanical gate, the SOP
|
|
27
|
+
* gate-enforce handler, and the two layer-B feedback hooks. No
|
|
28
|
+
* `Write|Edit|MultiEdit` entry is emitted: that matcher's gate is
|
|
29
|
+
* `peaks code-gate --json`, installed into the committed
|
|
30
|
+
* `.claude/settings.json` by `peaks hooks install`.
|
|
30
31
|
*
|
|
31
32
|
* The previous `Bash` matcher (which whitelisted a fixed `peaks
|
|
32
33
|
* <subcommand>` prefix) was removed in TEMPLATE_VERSION 1.2.0. The
|
|
@@ -40,7 +41,15 @@
|
|
|
40
41
|
* consumer project's `.claude/settings.json` and which exits 0
|
|
41
42
|
* silently for any command not guarded by a registered SOP gate.
|
|
42
43
|
*/
|
|
43
|
-
import { EXTERNAL_GATE_EXEMPT_ENV,
|
|
44
|
+
import { EXTERNAL_GATE_EXEMPT_ENV, resolveHookShell, resolveHookSpec } from '../skills/hooks-codegate-superpowers.js';
|
|
45
|
+
/**
|
|
46
|
+
* The comparison and the entry-level merge live in
|
|
47
|
+
* `claude-settings-template-merge.ts` — they were two thirds of this file's
|
|
48
|
+
* bytes and none of its template shape. Re-exported here so this module stays
|
|
49
|
+
* the single public entry point for the template concern: no caller has to
|
|
50
|
+
* know which half a symbol lives in.
|
|
51
|
+
*/
|
|
52
|
+
export { isRetiredTemplateEntry, mergeTemplateOwnedHooks, templateContentMatches } from './claude-settings-template-merge.js';
|
|
44
53
|
export const CLAUDE_SETTINGS_LOCAL_FILENAME = '.claude/settings.local.json';
|
|
45
54
|
/**
|
|
46
55
|
* Informational version of the offline template shape. Bumped when the
|
|
@@ -98,232 +107,17 @@ export const CLAUDE_SETTINGS_LOCAL_FILENAME = '.claude/settings.local.json';
|
|
|
98
107
|
* `mergeTemplateOwnedHooks` drops the retired entry from
|
|
99
108
|
* existing on-disk files, so an earlier install converges
|
|
100
109
|
* instead of keeping a no-op with a stale absolute path.
|
|
110
|
+
* 1.9.0 — added the two layer-B feedback hook entries
|
|
111
|
+
* (`pre-tool-peaks-current-directory-scope.sh` and
|
|
112
|
+
* `pre-tool-piping-a-test-run-reports-the-pipes-exit-code.sh`),
|
|
113
|
+
* pinned to `shell: bash`. Until now their registration existed only
|
|
114
|
+
* in the generated copies on the machine that hand-wrote them: a
|
|
115
|
+
* fresh clone got the two scripts and no registration, so the
|
|
116
|
+
* promotion they carry was true only locally. See
|
|
117
|
+
* `buildFeedbackHookHandler` for why the pin is `bash` and not the
|
|
118
|
+
* `powershell` its three siblings take.
|
|
101
119
|
*/
|
|
102
|
-
export const TEMPLATE_VERSION = '1.
|
|
103
|
-
/**
|
|
104
|
-
* Compare two serialized template strings: does the on-disk file already
|
|
105
|
-
* declare every entry the generated tree declares?
|
|
106
|
-
*
|
|
107
|
-
* This comparator answers "is each entry the GENERATED tree declares present
|
|
108
|
-
* on disk?", NOT "are the two `hooks` trees identical". Extra on-disk entries
|
|
109
|
-
* are IGNORED, so an entry another writer put in this file never makes it look
|
|
110
|
-
* drifted.
|
|
111
|
-
*
|
|
112
|
-
* That is the deliberate other half of the entry-level merge in
|
|
113
|
-
* `mergeTemplateOwnedHooks` / `workspace-claude-settings-materializer.ts`.
|
|
114
|
-
* `.claude/settings.local.json` has a SECOND writer of `hooks.PreToolUse`:
|
|
115
|
-
* `installAutoCompactHook` appends a `Bash|Task` entry. Under the previous
|
|
116
|
-
* exact-tree rule the merged file carried 4 entries against a 3-entry
|
|
117
|
-
* generated tree, so every `peaks workspace init` answered "drifted",
|
|
118
|
-
* rewrote, and reported `refreshed` forever — precisely the state whole-key
|
|
119
|
-
* ownership existed to prevent, and the reason the merge could not ship alone.
|
|
120
|
-
*
|
|
121
|
-
* Matching is order-insensitive AND multiset-aware: the template declares TWO
|
|
122
|
-
* `Bash` entries, and each must have its own counterpart on disk, so a file
|
|
123
|
-
* carrying only one of them is still reported as drifted (the previous
|
|
124
|
-
* index-by-index loop had the same property; it is load-bearing, not a
|
|
125
|
-
* detail).
|
|
126
|
-
*
|
|
127
|
-
* Returns `true` iff both strings parse to objects whose `hooks.PreToolUse`
|
|
128
|
-
* arrays satisfy that containment, the on-disk file carries NO entry this
|
|
129
|
-
* template has retired (`isRetiredTemplateEntry`), AND the on-disk `env`
|
|
130
|
-
* already carries every exemption the template declares (extra on-disk keys
|
|
131
|
-
* and extra globs are allowed — a user may exempt other trees, and a
|
|
132
|
-
* requirement the file already exceeds must not re-trigger a write).
|
|
133
|
-
*
|
|
134
|
-
* Returns `false` on any `JSON.parse` error, shape mismatch, or
|
|
135
|
-
* missing `hooks.PreToolUse`. Whitespace and key order do NOT affect
|
|
136
|
-
* the result — the comparison is on the parsed AST, not on bytes.
|
|
137
|
-
*
|
|
138
|
-
* This is the comparator `initWorkspace` uses to decide whether to
|
|
139
|
-
* refresh a stale `.peaks/.claude-settings-template.json` on disk.
|
|
140
|
-
*/
|
|
141
|
-
export function templateContentMatches(generated, onDisk) {
|
|
142
|
-
let parsedGenerated;
|
|
143
|
-
let parsedOnDisk;
|
|
144
|
-
try {
|
|
145
|
-
parsedGenerated = JSON.parse(generated);
|
|
146
|
-
}
|
|
147
|
-
catch {
|
|
148
|
-
return false;
|
|
149
|
-
}
|
|
150
|
-
try {
|
|
151
|
-
parsedOnDisk = JSON.parse(onDisk);
|
|
152
|
-
}
|
|
153
|
-
catch {
|
|
154
|
-
return false;
|
|
155
|
-
}
|
|
156
|
-
if (!isTemplateShape(parsedGenerated) || !isTemplateShape(parsedOnDisk)) {
|
|
157
|
-
return false;
|
|
158
|
-
}
|
|
159
|
-
// Multiset containment: consume one on-disk entry per generated entry so a
|
|
160
|
-
// file holding a single copy of a doubly-declared entry still fails.
|
|
161
|
-
const unmatched = [...parsedOnDisk.hooks.PreToolUse];
|
|
162
|
-
for (const required of parsedGenerated.hooks.PreToolUse) {
|
|
163
|
-
const at = unmatched.findIndex((candidate) => sameEntry(required, candidate));
|
|
164
|
-
if (at === -1) {
|
|
165
|
-
return false;
|
|
166
|
-
}
|
|
167
|
-
unmatched.splice(at, 1);
|
|
168
|
-
}
|
|
169
|
-
// A RETIRED entry on disk is drift, and this clause is what makes the
|
|
170
|
-
// retirement in `mergeTemplateOwnedHooks` reach an installed file at all.
|
|
171
|
-
//
|
|
172
|
-
// Containment alone cannot express it: a file still carrying
|
|
173
|
-
// `Write|Edit|MultiEdit` declares every entry the template declares, so
|
|
174
|
-
// `templateContentMatches` answered "current", no rewrite ran, and the merge
|
|
175
|
-
// never got the chance to drop it. Measured on a throwaway project root
|
|
176
|
-
// before this clause existed — init against the rebuilt CLI reported
|
|
177
|
-
// `already-current` and the retired entry survived verbatim. Declaring less
|
|
178
|
-
// is not a retirement; the comparator has to say so.
|
|
179
|
-
//
|
|
180
|
-
// One extra rewrite per affected install, then the fixed point holds: the
|
|
181
|
-
// merge emits no retired entry, so the next comparison finds none and
|
|
182
|
-
// answers `current`.
|
|
183
|
-
if (parsedOnDisk.hooks.PreToolUse.some((entry) => isRetiredTemplateEntry(entry))) {
|
|
184
|
-
return false;
|
|
185
|
-
}
|
|
186
|
-
// A project installed by a release that predates a template-declared
|
|
187
|
-
// exemption still needs the refresh this comparator gates — otherwise the
|
|
188
|
-
// entry would only ever appear on a machine that re-ran `peaks hooks
|
|
189
|
-
// install`. `hasExternalGateExemptions` is the same predicate the installer
|
|
190
|
-
// uses, so the two writers cannot drift apart.
|
|
191
|
-
return hasExternalGateExemptions({ env: parsedOnDisk.env });
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Merge the on-disk `hooks.PreToolUse` list with the template's.
|
|
195
|
-
*
|
|
196
|
-
* the entries IT DECLARES — and nothing else. Every other on-disk entry is
|
|
197
|
-
* carried across verbatim, whatever its matcher, because the template has no
|
|
198
|
-
* opinion about it:
|
|
199
|
-
*
|
|
200
|
-
* - a `matcher` the template does not declare (`Bash|Task`, the auto-compact
|
|
201
|
-
* hook `installAutoCompactHook` appends) is never touched;
|
|
202
|
-
* - surplus entries BEYOND the template's count for a declared matcher (a
|
|
203
|
-
* user's own `Bash` hook) are surplus too, and survive;
|
|
204
|
-
* - an on-disk entry that fills a declared slot is REPLACED by the template's
|
|
205
|
-
* entry for it. That is what makes a hand-edited (or older-release) entry
|
|
206
|
-
* self-heal instead of lingering next to a correct copy of itself.
|
|
207
|
-
*
|
|
208
|
-
* Slot counting is per `matcher` and positional within it: the template
|
|
209
|
-
* declares TWO `Bash` entries, so the first two on-disk `Bash` entries are
|
|
210
|
-
* theirs and a third is the user's. The template's entries are emitted first,
|
|
211
|
-
* in template order, then the preserved ones in their on-disk order — which is
|
|
212
|
-
* a fixed point: re-merging the result yields the result (the template's own
|
|
213
|
-
* entries are encountered first and refill their own slots).
|
|
214
|
-
*
|
|
215
|
-
* Non-conforming entries (no string `matcher`, no `hooks` array) are preserved
|
|
216
|
-
* rather than dropped: guessing at their shape is how a user's entry gets
|
|
217
|
-
* deleted.
|
|
218
|
-
*
|
|
219
|
-
* ONE exception to "preserve what I do not declare": an entry this template
|
|
220
|
-
* used to declare and RETIRED (TEMPLATE_VERSION 1.8.0's `Write|Edit|MultiEdit`
|
|
221
|
-
* gate — see `isRetiredTemplateEntry`) is dropped rather than preserved.
|
|
222
|
-
* Declaring less cannot retire an entry on its own, because preserving
|
|
223
|
-
* undeclared entries is exactly what this function does; without the drop, a
|
|
224
|
-
* pre-1.8.0 install would keep the no-op handler and its version-pinned script
|
|
225
|
-
* path forever. The predicate is narrow enough that only the exact command
|
|
226
|
-
* this template emitted matches.
|
|
227
|
-
*/
|
|
228
|
-
export function mergeTemplateOwnedHooks(onDisk, template) {
|
|
229
|
-
const slots = new Map();
|
|
230
|
-
for (const entry of template) {
|
|
231
|
-
if (!isPreToolUseEntry(entry))
|
|
232
|
-
continue;
|
|
233
|
-
slots.set(entry.matcher, (slots.get(entry.matcher) ?? 0) + 1);
|
|
234
|
-
}
|
|
235
|
-
const taken = new Map();
|
|
236
|
-
const preserved = [];
|
|
237
|
-
for (const entry of onDisk) {
|
|
238
|
-
// Retired by this template — dropped, not carried across.
|
|
239
|
-
if (isRetiredTemplateEntry(entry)) {
|
|
240
|
-
continue;
|
|
241
|
-
}
|
|
242
|
-
// Unowned by construction: not a shape the template could have declared.
|
|
243
|
-
if (!isPreToolUseEntry(entry)) {
|
|
244
|
-
preserved.push(entry);
|
|
245
|
-
continue;
|
|
246
|
-
}
|
|
247
|
-
const declared = slots.get(entry.matcher) ?? 0;
|
|
248
|
-
const used = taken.get(entry.matcher) ?? 0;
|
|
249
|
-
if (used >= declared) {
|
|
250
|
-
preserved.push(entry);
|
|
251
|
-
continue;
|
|
252
|
-
}
|
|
253
|
-
taken.set(entry.matcher, used + 1);
|
|
254
|
-
}
|
|
255
|
-
return [...template, ...preserved];
|
|
256
|
-
}
|
|
257
|
-
/** Structural equality of two `PreToolUse` entries. */
|
|
258
|
-
function sameEntry(a, b) {
|
|
259
|
-
return a.matcher === b.matcher && sameHooksArray(a.hooks, b.hooks);
|
|
260
|
-
}
|
|
261
|
-
function isPreToolUseEntry(value) {
|
|
262
|
-
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
263
|
-
return false;
|
|
264
|
-
}
|
|
265
|
-
const candidate = value;
|
|
266
|
-
return typeof candidate.matcher === 'string' && Array.isArray(candidate.hooks);
|
|
267
|
-
}
|
|
268
|
-
function isTemplateShape(value) {
|
|
269
|
-
if (typeof value !== 'object' || value === null) {
|
|
270
|
-
return false;
|
|
271
|
-
}
|
|
272
|
-
const candidate = value;
|
|
273
|
-
if (typeof candidate.hooks !== 'object' || candidate.hooks === null) {
|
|
274
|
-
return false;
|
|
275
|
-
}
|
|
276
|
-
const hooksObj = candidate.hooks;
|
|
277
|
-
return Array.isArray(hooksObj.PreToolUse);
|
|
278
|
-
}
|
|
279
|
-
function sameHooksArray(a, b) {
|
|
280
|
-
if (a.length !== b.length) {
|
|
281
|
-
return false;
|
|
282
|
-
}
|
|
283
|
-
for (let i = 0; i < a.length; i += 1) {
|
|
284
|
-
const ha = a[i];
|
|
285
|
-
const hb = b[i];
|
|
286
|
-
// `shell` participates in the comparison: it is machine-specific (see
|
|
287
|
-
// `resolveHookShell`), so a file written on one platform must be
|
|
288
|
-
// recognized as drifted on the other instead of silently kept.
|
|
289
|
-
if (ha.type !== hb.type || ha.command !== hb.command || ha.shell !== hb.shell) {
|
|
290
|
-
return false;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
return true;
|
|
294
|
-
}
|
|
295
|
-
/**
|
|
296
|
-
* The retired `Write|Edit|MultiEdit` gate entry, as an on-disk file written by
|
|
297
|
-
* a pre-1.8.0 release holds it.
|
|
298
|
-
*
|
|
299
|
-
* TEMPLATE_VERSION 1.8.0 stopped emitting this entry. Declaring less is not
|
|
300
|
-
* enough on its own: `mergeTemplateOwnedHooks` preserves every on-disk entry
|
|
301
|
-
* the template does not declare — that is the whole point of the entry-level
|
|
302
|
-
* ownership rule (it is what keeps `installAutoCompactHook`'s `Bash|Task`
|
|
303
|
-
* entry alive) — so a project installed by an earlier release would keep the
|
|
304
|
-
* no-op handler, and its `node "C:/…/nvm/v24.14.0/…"` path, forever. This
|
|
305
|
-
* predicate is the retirement: `mergeTemplateOwnedHooks` drops a match.
|
|
306
|
-
*
|
|
307
|
-
* Deliberately narrow. It matches the exact command shape this template used
|
|
308
|
-
* to emit — one handler, `node "<…>/services/hooks/write-gate.js"` — under the
|
|
309
|
-
* exact legacy matcher spelling, so a user's OWN `Write|Edit|MultiEdit` entry
|
|
310
|
-
* (a different command, or more than one handler) is preserved like any other
|
|
311
|
-
* entry the template does not declare. A looser "drop anything on this
|
|
312
|
-
* matcher" rule would delete a user's hook, which is the failure the ownership
|
|
313
|
-
* rule exists to prevent.
|
|
314
|
-
*/
|
|
315
|
-
const RETIRED_WRITE_GATE_MATCHER = 'Write|Edit|MultiEdit';
|
|
316
|
-
const RETIRED_WRITE_GATE_COMMAND = /^node "[^"]*\/services\/hooks\/write-gate\.js"$/;
|
|
317
|
-
export function isRetiredTemplateEntry(entry) {
|
|
318
|
-
if (!isPreToolUseEntry(entry))
|
|
319
|
-
return false;
|
|
320
|
-
if (entry.matcher !== RETIRED_WRITE_GATE_MATCHER)
|
|
321
|
-
return false;
|
|
322
|
-
if (entry.hooks.length !== 1)
|
|
323
|
-
return false;
|
|
324
|
-
const handler = entry.hooks[0];
|
|
325
|
-
return handler.type === 'command' && RETIRED_WRITE_GATE_COMMAND.test(handler.command);
|
|
326
|
-
}
|
|
120
|
+
export const TEMPLATE_VERSION = '1.9.0';
|
|
327
121
|
/**
|
|
328
122
|
* TEMPLATE_VERSION 1.4.0 — the SOP gate-enforce handler, read from the same
|
|
329
123
|
* canonical hook spec `peaks hooks install` uses. Deriving it here (rather
|
|
@@ -347,11 +141,12 @@ function buildGateEnforceHandler() {
|
|
|
347
141
|
* forcing gate is a core feature that PreToolUse hooks can short-
|
|
348
142
|
* circuit but that the `permissions` block cannot.
|
|
349
143
|
*
|
|
350
|
-
* As of TEMPLATE_VERSION 1.
|
|
351
|
-
*
|
|
352
|
-
*
|
|
353
|
-
* (`peaks code-gate --json`) is
|
|
354
|
-
* `.claude/settings.json` by `peaks hooks
|
|
144
|
+
* As of TEMPLATE_VERSION 1.9.0 the template emits four `Bash` matchers: the
|
|
145
|
+
* two above, plus one per layer-B feedback hook (`FEEDBACK_HOOK_SCRIPTS`). The
|
|
146
|
+
* `Write|Edit|MultiEdit` fact-forcing bypass is no longer a hook: it is the
|
|
147
|
+
* `env` exemption above, and that matcher's gate (`peaks code-gate --json`) is
|
|
148
|
+
* installed into the committed `.claude/settings.json` by `peaks hooks
|
|
149
|
+
* install`.
|
|
355
150
|
*/
|
|
356
151
|
export function buildClaudeSettingsLocalJson() {
|
|
357
152
|
return {
|
|
@@ -387,7 +182,15 @@ export function buildClaudeSettingsLocalJson() {
|
|
|
387
182
|
// group and the gate would run twice per Bash call.
|
|
388
183
|
matcher: 'Bash',
|
|
389
184
|
hooks: [buildGateEnforceHandler()]
|
|
390
|
-
}
|
|
185
|
+
},
|
|
186
|
+
...FEEDBACK_HOOK_SCRIPTS.map((script) => ({
|
|
187
|
+
// TEMPLATE_VERSION 1.9.0 — the layer-B feedback hooks, one matcher
|
|
188
|
+
// group each, for the same reason the entry above has its own: a
|
|
189
|
+
// group is peaks-managed only when EVERY handler in it carries a
|
|
190
|
+
// peaks sentinel, and none of these handlers does.
|
|
191
|
+
matcher: 'Bash',
|
|
192
|
+
hooks: [buildFeedbackHookHandler(script)]
|
|
193
|
+
}))
|
|
391
194
|
]
|
|
392
195
|
}
|
|
393
196
|
};
|
|
@@ -420,3 +223,45 @@ function buildBashGateStep08Handler() {
|
|
|
420
223
|
...(shell !== undefined ? { shell } : {})
|
|
421
224
|
};
|
|
422
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* TEMPLATE_VERSION 1.9.0 — the two rules promoted to layer B by hand first: the
|
|
228
|
+
* scripts shipped in `src/services/hooks/`, but the registration existed only in
|
|
229
|
+
* the generated copy on the machine that wrote it. Emitting it here is what makes
|
|
230
|
+
* the promotion a property of the repository rather than of that machine — the
|
|
231
|
+
* layer-B feedback gate reads THIS template's `hooks` block, so a fresh clone had
|
|
232
|
+
* the enforcement and nothing registering it.
|
|
233
|
+
*
|
|
234
|
+
* The filenames are the contract: the layer-B check looks for a hook command that
|
|
235
|
+
* INVOKES A FILE NAMED AFTER THE RULE, so the command has to carry the script's
|
|
236
|
+
* name and cannot be a `peaks` verb that dispatches to it.
|
|
237
|
+
*/
|
|
238
|
+
const FEEDBACK_HOOK_SCRIPTS = [
|
|
239
|
+
'pre-tool-peaks-current-directory-scope.sh',
|
|
240
|
+
'pre-tool-piping-a-test-run-reports-the-pipes-exit-code.sh'
|
|
241
|
+
];
|
|
242
|
+
/** The shell these two handlers are pinned to. See `buildFeedbackHookHandler`. */
|
|
243
|
+
const FEEDBACK_HOOK_SHELL = 'bash';
|
|
244
|
+
/**
|
|
245
|
+
* The handler for one feedback hook, pinned to `shell: 'bash'`.
|
|
246
|
+
*
|
|
247
|
+
* THE PIN IS THE DECISION, and it is deliberately not the `powershell` its three
|
|
248
|
+
* siblings take. Measured on this host, both shapes run the script and both print
|
|
249
|
+
* its refusal to stderr — but they do not report the same exit code:
|
|
250
|
+
*
|
|
251
|
+
* bash "<script>" exit 2 (the script's own code)
|
|
252
|
+
* powershell "<script>" exit 1 (flattened by the shell)
|
|
253
|
+
*
|
|
254
|
+
* Under the Claude Code hook protocol only exit 2 blocks; any other non-zero exit
|
|
255
|
+
* is a NON-BLOCKING ERROR and the tool call goes ahead. So pinning `powershell`
|
|
256
|
+
* here would not be a cosmetic difference on a blocking hook — it would turn the
|
|
257
|
+
* refusal into a log line and let the command through, which is the failure these
|
|
258
|
+
* two entries exist to prevent. `shell` accepts `bash` and `powershell` only, and
|
|
259
|
+
* `bash` is also the interpreter this command already names.
|
|
260
|
+
*/
|
|
261
|
+
function buildFeedbackHookHandler(script) {
|
|
262
|
+
return {
|
|
263
|
+
type: 'command',
|
|
264
|
+
command: `bash "\${CLAUDE_PROJECT_DIR}/src/services/hooks/${script}"`,
|
|
265
|
+
shell: FEEDBACK_HOOK_SHELL
|
|
266
|
+
};
|
|
267
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "peaks-loop",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.4",
|
|
4
4
|
"description": "Loop Engineering CLI — workflow primitive / loop guards / evaluators / slice orchestration",
|
|
5
5
|
"author": "SquabbyZ",
|
|
6
6
|
"keywords": [
|
|
@@ -129,10 +129,10 @@
|
|
|
129
129
|
"picomatch": "4.0.4",
|
|
130
130
|
"yaml": "^2.9.0",
|
|
131
131
|
"zod": "^4.4.3",
|
|
132
|
-
"peaks-loop-internal-runtime": "0.0.
|
|
133
|
-
"peaks-loop-
|
|
134
|
-
"peaks-loop-
|
|
135
|
-
"peaks-loop-shared": "0.0.
|
|
132
|
+
"peaks-loop-internal-runtime": "0.0.44",
|
|
133
|
+
"peaks-loop-shared": "0.0.93",
|
|
134
|
+
"peaks-loop-mut": "0.1.58",
|
|
135
|
+
"peaks-loop-shared-channel": "0.0.61"
|
|
136
136
|
},
|
|
137
137
|
"devDependencies": {
|
|
138
138
|
"@changesets/cli": "2.31.1",
|