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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// src/cli/commands/baseline-rollback-commands.ts
|
|
2
|
+
//
|
|
3
|
+
// `peaks baseline rollback` and `peaks baseline reset` — the two destructive
|
|
4
|
+
// baseline operations, both gated behind `--confirm`. Split out of
|
|
5
|
+
// `baseline-commands.ts`; every refusal code, message and data field is
|
|
6
|
+
// unchanged.
|
|
7
|
+
import { copyFileSync, existsSync, mkdirSync, rmSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { readBaselineFile } from '../../services/capability-baseline/store.js';
|
|
10
|
+
import { CURRENT_DIR, fail, HISTORY_DIR, ok } from './baseline-command-shared.js';
|
|
11
|
+
function runRollback(io, opts) {
|
|
12
|
+
const projectRoot = opts.project ?? '.';
|
|
13
|
+
if (opts.confirm !== true) {
|
|
14
|
+
fail(io, 'HUMAN_NL_DECISION_REQUIRED', 'rollback requires the user to approve via AskUserQuestion. The LLM must surface a multi-choice prompt, then re-run with --confirm.');
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (!opts.to) {
|
|
18
|
+
fail(io, 'MISSING_ARG', '--to is required');
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const source = HISTORY_DIR(projectRoot, opts.to);
|
|
22
|
+
const from = join(source, 'capability-baseline.json');
|
|
23
|
+
const fromLock = join(source, 'capability-baseline.lock');
|
|
24
|
+
if (!existsSync(from) || !existsSync(fromLock)) {
|
|
25
|
+
fail(io, 'BASELINE_HISTORY_GAP', `no frozen baseline recorded for version ${opts.to}`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const r = readBaselineFile(projectRoot);
|
|
29
|
+
if (!r.ok) {
|
|
30
|
+
fail(io, r.error.code, r.error.message);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
mkdirSync(CURRENT_DIR(projectRoot), { recursive: true });
|
|
34
|
+
copyFileSync(from, join(CURRENT_DIR(projectRoot), 'capability-baseline.json'));
|
|
35
|
+
copyFileSync(fromLock, join(CURRENT_DIR(projectRoot), 'capability-baseline.lock'));
|
|
36
|
+
// Re-read through the locked store so a tampered history entry cannot be
|
|
37
|
+
// installed: the copy is only reported successful if it verifies.
|
|
38
|
+
const after = readBaselineFile(projectRoot);
|
|
39
|
+
if (!after.ok) {
|
|
40
|
+
fail(io, after.error.code, after.error.message);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
ok(io, 'baseline.rollback', {
|
|
44
|
+
fromVersion: r.file.version,
|
|
45
|
+
toVersion: after.file.version,
|
|
46
|
+
historyPath: source
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function runReset(io, opts) {
|
|
50
|
+
const projectRoot = opts.project ?? '.';
|
|
51
|
+
if (opts.confirm !== true) {
|
|
52
|
+
fail(io, 'HUMAN_NL_DECISION_REQUIRED', 'reset requires the user to approve via AskUserQuestion. The LLM must surface a multi-choice prompt, then re-run with --confirm.');
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const r = readBaselineFile(projectRoot);
|
|
56
|
+
// A missing baseline is already "wiped" — but an unreadable one (hash
|
|
57
|
+
// mismatch / unsigned lock) must not be silently discarded.
|
|
58
|
+
if (!r.ok && r.error.code !== 'BASELINE_NOT_FOUND') {
|
|
59
|
+
fail(io, r.error.code, r.error.message);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const wipedVersion = r.ok ? r.file.version : null;
|
|
63
|
+
rmSync(join(CURRENT_DIR(projectRoot), 'capability-baseline.json'), { force: true });
|
|
64
|
+
rmSync(join(CURRENT_DIR(projectRoot), 'capability-baseline.lock'), { force: true });
|
|
65
|
+
ok(io, 'baseline.reset', {
|
|
66
|
+
wipedVersion,
|
|
67
|
+
nextAction: 're-freeze with `baseline freeze --from <path>`'
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
export function registerBaselineRollbackCommand(baseline, io) {
|
|
71
|
+
baseline
|
|
72
|
+
.command('rollback')
|
|
73
|
+
.description("Roll the baseline back to a historical version. --confirm records the user's approval.")
|
|
74
|
+
.option('--to <version>', 'Historical version to roll back to')
|
|
75
|
+
.option('--confirm', "Record the user's approval (collected via AskUserQuestion) for this rollback")
|
|
76
|
+
.option('--project <path>', 'Project root', '.')
|
|
77
|
+
.option('--json', 'Emit JSON envelope')
|
|
78
|
+
.action((opts) => runRollback(io, opts));
|
|
79
|
+
}
|
|
80
|
+
export function registerBaselineResetCommand(baseline, io) {
|
|
81
|
+
baseline
|
|
82
|
+
.command('reset')
|
|
83
|
+
.description("Wipe the current baseline and require a re-freeze. --confirm records the user's approval.")
|
|
84
|
+
.option('--confirm', "Record the user's approval (collected via AskUserQuestion) for the wipe")
|
|
85
|
+
.option('--project <path>', 'Project root', '.')
|
|
86
|
+
.option('--json', 'Emit JSON envelope')
|
|
87
|
+
.action((opts) => runReset(io, opts));
|
|
88
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import { type ProgramIO } from '../cli-helpers.js';
|
|
3
|
+
export type ClassifyDowngradeOptions = {
|
|
4
|
+
project: string;
|
|
5
|
+
level: string;
|
|
6
|
+
reason: string;
|
|
7
|
+
json?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function registerClassifyDowngradeCommand(classify: Command, io: ProgramIO): void;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// src/cli/commands/classify-downgrade-command.ts
|
|
2
|
+
//
|
|
3
|
+
// `peaks classify downgrade` — REFUSED per spec §4: the CLI never downgrades a
|
|
4
|
+
// classification unilaterally. Extracted from
|
|
5
|
+
// `governance-classify-contract-commands.ts`; the registered name, description,
|
|
6
|
+
// options, refusal code and exit code (2) are unchanged.
|
|
7
|
+
import { fail } from 'peaks-loop-shared/result';
|
|
8
|
+
import { printResult } from '../cli-helpers.js';
|
|
9
|
+
export function registerClassifyDowngradeCommand(classify, io) {
|
|
10
|
+
classify
|
|
11
|
+
.command('downgrade')
|
|
12
|
+
.description('REFUSED per spec §4 — peaks-loop never downgrades a classification; ask the user to override explicitly')
|
|
13
|
+
.requiredOption('--level <level>', 'attempted level')
|
|
14
|
+
.requiredOption('--reason <text>', 'reason for the attempt (always rejected)')
|
|
15
|
+
.requiredOption('--project <path>', 'target project root')
|
|
16
|
+
.option('--json', 'print machine-readable JSON envelope')
|
|
17
|
+
.action((options) => {
|
|
18
|
+
printResult(io, fail('classify.downgrade', 'DOWNGRADE_REFUSED', 'peaks classify downgrade is refused per spec §4. Use --override (with reason) on `classify run` to force a level; the CLI never downgrades a classification unilaterally.', { attemptedLevel: options.level, reason: options.reason }, ['Use `peaks classify run --override <level> --reason "<text>"` instead']), options.json);
|
|
19
|
+
process.exitCode = 2;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import { type ProgramIO } from '../cli-helpers.js';
|
|
3
|
+
export type ClassifyRunOptions = {
|
|
4
|
+
project: string;
|
|
5
|
+
override?: string;
|
|
6
|
+
reason?: string;
|
|
7
|
+
json?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function registerClassifyRunCommand(classify: Command, io: ProgramIO): void;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// src/cli/commands/classify-run-command.ts
|
|
2
|
+
//
|
|
3
|
+
// `peaks classify run` — classify the current diff (git diff HEAD) into one of
|
|
4
|
+
// the 5 task levels, with an optional `--override` + `--reason`. Extracted from
|
|
5
|
+
// `governance-classify-contract-commands.ts`; the registered name, description,
|
|
6
|
+
// options, refusal codes, audit write and envelope are unchanged.
|
|
7
|
+
//
|
|
8
|
+
// `loadPreferences` is synchronous, so the action is too — the merged file said
|
|
9
|
+
// `await loadPreferences(...)`, which `@typescript-eslint/await-thenable`
|
|
10
|
+
// flagged as an await of a non-Promise. Dropping the keyword pair changes no
|
|
11
|
+
// byte of the envelope (the equivalence harness re-measured it).
|
|
12
|
+
import { fail, getErrorMessage, ok } from 'peaks-loop-shared/result';
|
|
13
|
+
import { classifyTask } from '../../services/classify/classify-service.js';
|
|
14
|
+
import { TASK_LEVELS } from '../../services/classify/classify-types.js';
|
|
15
|
+
import { loadPreferences } from '../../services/preferences/preferences-service.js';
|
|
16
|
+
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
17
|
+
import { appendAuditEntry, CLASSIFY_AUDIT_FILE, getSignalsFromGitDiff, isTaskLevel } from './classify-signals.js';
|
|
18
|
+
export function registerClassifyRunCommand(classify, io) {
|
|
19
|
+
addJsonOption(classify
|
|
20
|
+
.command('run')
|
|
21
|
+
.description('Classify the current diff (git diff HEAD) into one of 5 task levels')
|
|
22
|
+
.requiredOption('--project <path>', 'target project root')
|
|
23
|
+
.option('--override <level>', 'force a level (one of typo|bug|feature|refactor|migration); requires --reason')
|
|
24
|
+
.option('--reason <text>', 'reason for the override (mandatory when --override is set)')).action((options) => {
|
|
25
|
+
const envelope = classifyRunEnvelope(options);
|
|
26
|
+
printResult(io, envelope, options.json);
|
|
27
|
+
if (!envelope.ok)
|
|
28
|
+
process.exitCode = 1;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function classifyRunEnvelope(options) {
|
|
32
|
+
try {
|
|
33
|
+
const prefs = loadPreferences(options.project);
|
|
34
|
+
const signals = getSignalsFromGitDiff(options.project);
|
|
35
|
+
const override = readOverride(options);
|
|
36
|
+
if (override.envelope !== null)
|
|
37
|
+
return override.envelope;
|
|
38
|
+
const result = classifyTask(override.level === undefined
|
|
39
|
+
? { signals, conservatism: prefs.classifyConservatism }
|
|
40
|
+
: {
|
|
41
|
+
signals,
|
|
42
|
+
conservatism: prefs.classifyConservatism,
|
|
43
|
+
override: { level: override.level, reason: override.reason }
|
|
44
|
+
}, prefs.classifyRules.feature_threshold_files, prefs.classifyRules.feature_threshold_lines);
|
|
45
|
+
appendAuditEntry(options.project, result.audit);
|
|
46
|
+
return ok('classify.run', result, [], [
|
|
47
|
+
`gate set for level "${result.level}": ${result.gateSet.stages.join(', ')}`,
|
|
48
|
+
`audit log: .peaks/_runtime/${CLASSIFY_AUDIT_FILE}`
|
|
49
|
+
]);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
return fail('classify.run', 'CLASSIFY_RUN_FAILED', getErrorMessage(error), { projectRoot: options.project }, ['Run peaks classify --help for usage']);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** The two refusals `--override` / `--reason` can earn, in the order they fire. */
|
|
56
|
+
function readOverride(options) {
|
|
57
|
+
const empty = { level: undefined, reason: '', envelope: null };
|
|
58
|
+
if (options.override === undefined)
|
|
59
|
+
return empty;
|
|
60
|
+
if (!isTaskLevel(options.override)) {
|
|
61
|
+
return {
|
|
62
|
+
...empty,
|
|
63
|
+
envelope: fail('classify.run', 'INVALID_LEVEL', `level must be one of: ${TASK_LEVELS.join(', ')}`, { provided: options.override }, ['Pass one of typo, bug, feature, refactor, migration'])
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (options.reason === undefined || options.reason.length === 0) {
|
|
67
|
+
return {
|
|
68
|
+
...empty,
|
|
69
|
+
envelope: fail('classify.run', 'REASON_REQUIRED', '--reason is required when --override is set', {}, ['Provide a non-empty reason for the override'])
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return { level: options.override, reason: options.reason, envelope: null };
|
|
73
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type ClassifySignals, type TaskLevel } from '../../services/classify/classify-types.js';
|
|
2
|
+
export declare const CLASSIFY_AUDIT_FILE = "classify-audit.jsonl";
|
|
3
|
+
export declare function getSignalsFromGitDiff(projectRoot: string): ClassifySignals;
|
|
4
|
+
export declare function appendAuditEntry(projectRoot: string, entry: unknown): void;
|
|
5
|
+
export declare function isTaskLevel(value: string): value is TaskLevel;
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// src/cli/commands/classify-signals.ts
|
|
2
|
+
//
|
|
3
|
+
// What `peaks classify` reads and writes outside its own envelope: the diff
|
|
4
|
+
// signals the heuristic classifies, the audit-log append, and the task-level
|
|
5
|
+
// guard. Extracted from `governance-classify-contract-commands.ts` (which had
|
|
6
|
+
// merged `classify-classify-commands.ts` verbatim); the parsing, the audit file
|
|
7
|
+
// name and the level guard are unchanged.
|
|
8
|
+
//
|
|
9
|
+
// `child_process` is a static import here rather than the CJS `require` the
|
|
10
|
+
// merged file used inside `getSignalsFromGitDiff`: the module specifier is a
|
|
11
|
+
// Node builtin, so a top-level import cannot fail where the `require` could, and
|
|
12
|
+
// the call itself — arguments, `windowsHide`, and the zeros fallback when git is
|
|
13
|
+
// unavailable — is byte-for-byte the same.
|
|
14
|
+
import { execFileSync } from 'node:child_process';
|
|
15
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
import { TASK_LEVELS } from '../../services/classify/classify-types.js';
|
|
18
|
+
export const CLASSIFY_AUDIT_FILE = 'classify-audit.jsonl';
|
|
19
|
+
export function getSignalsFromGitDiff(projectRoot) {
|
|
20
|
+
// Use git diff --stat to extract file count + line count. Fall back to
|
|
21
|
+
// zeros if git is unavailable (e.g. fresh repo with no commits).
|
|
22
|
+
let stdout;
|
|
23
|
+
try {
|
|
24
|
+
stdout = execFileSync('git', ['diff', '--shortstat', 'HEAD'], {
|
|
25
|
+
cwd: projectRoot,
|
|
26
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
27
|
+
maxBuffer: 32 * 1024 * 1024,
|
|
28
|
+
windowsHide: true
|
|
29
|
+
}).toString('utf8');
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return {
|
|
33
|
+
filesChanged: 0,
|
|
34
|
+
linesChanged: 0,
|
|
35
|
+
touchesDependencies: false,
|
|
36
|
+
touchesMigrationScripts: false,
|
|
37
|
+
isPureRefactor: true,
|
|
38
|
+
keywords: []
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
const lines = stdout.split('\n').filter((l) => l.trim().length > 0);
|
|
42
|
+
const filesChanged = lines.length;
|
|
43
|
+
let added = 0;
|
|
44
|
+
let removed = 0;
|
|
45
|
+
let touchesDependencies = false;
|
|
46
|
+
let touchesMigrationScripts = false;
|
|
47
|
+
for (const line of lines) {
|
|
48
|
+
const match = /(\d+)\s+insertion.*?(\d+)\s+deletion/.exec(line);
|
|
49
|
+
if (match) {
|
|
50
|
+
added += Number(match[1]);
|
|
51
|
+
removed += Number(match[2]);
|
|
52
|
+
}
|
|
53
|
+
if (/(package\.json|pnpm-lock\.yaml|yarn\.lock|requirements\.txt|go\.mod)/.test(line)) {
|
|
54
|
+
touchesDependencies = true;
|
|
55
|
+
}
|
|
56
|
+
if (/(migrate|codemod|backfill|schema)/.test(line)) {
|
|
57
|
+
touchesMigrationScripts = true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// isPureRefactor: heuristic — if added lines / removed lines < 0.1 OR
|
|
61
|
+
// no new exports were added, treat as refactor. For L2.2 the signal is
|
|
62
|
+
// binary (true/false). Default: true (no behavior change is the safe
|
|
63
|
+
// assumption; flip to false when keyword 'add' / 'new' / 'feature' present).
|
|
64
|
+
const isPureRefactor = true;
|
|
65
|
+
return {
|
|
66
|
+
filesChanged,
|
|
67
|
+
linesChanged: added + removed,
|
|
68
|
+
touchesDependencies,
|
|
69
|
+
touchesMigrationScripts,
|
|
70
|
+
isPureRefactor,
|
|
71
|
+
keywords: []
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
export function appendAuditEntry(projectRoot, entry) {
|
|
75
|
+
const auditDir = join(projectRoot, '.peaks/_runtime');
|
|
76
|
+
if (!existsSync(auditDir)) {
|
|
77
|
+
try {
|
|
78
|
+
mkdirSync(auditDir, { recursive: true });
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
/* ignore */
|
|
82
|
+
} // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
83
|
+
}
|
|
84
|
+
const auditPath = join(auditDir, CLASSIFY_AUDIT_FILE);
|
|
85
|
+
let body = '';
|
|
86
|
+
try {
|
|
87
|
+
if (existsSync(auditPath)) {
|
|
88
|
+
body = readFileSync(auditPath, 'utf8');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
/* ignore */
|
|
93
|
+
} // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
94
|
+
body += JSON.stringify(entry) + '\n';
|
|
95
|
+
try {
|
|
96
|
+
writeFileSync(auditPath, body);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
/* best-effort */
|
|
100
|
+
} // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
101
|
+
}
|
|
102
|
+
export function isTaskLevel(value) {
|
|
103
|
+
return TASK_LEVELS.includes(value);
|
|
104
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
2
2
|
import { fail, ok } from 'peaks-loop-shared/result';
|
|
3
|
-
import { evaluateEmitHandoff, JOB_NOT_INITIALIZED, JOB_REMAINING_BLOCKED } from '../../services/code/emit-handoff.js';
|
|
3
|
+
import { evaluateEmitHandoff, JOB_COMPLETED_NO_SEDIMENT, JOB_NOT_INITIALIZED, JOB_REMAINING_BLOCKED } from '../../services/code/emit-handoff.js';
|
|
4
4
|
import { readActiveSid } from './code-runtime-session.js';
|
|
5
5
|
export function registerCodeEmitHandoffCommand(code, io) {
|
|
6
6
|
// v3.1.2 Step 11 / final handoff — Size-fear ban.
|
|
@@ -13,7 +13,9 @@ export function registerCodeEmitHandoffCommand(code, io) {
|
|
|
13
13
|
.requiredOption('--project <path>', 'target project root')
|
|
14
14
|
.option('--session-id <sid>', 'override session id (default: read from active presence)')
|
|
15
15
|
.option('--job-id <jid>', 'override job id (default: read from job-shape.json decision.suggestedJobId)')
|
|
16
|
-
.option('--force-under-job', 'override the remaining>0 block (explicit user approval required)')
|
|
16
|
+
.option('--force-under-job', 'override the remaining>0 block (explicit user approval required)')
|
|
17
|
+
.option('--force-no-sediment <reason>', 'override the no-sediment block on a COMPLETED Job: supply the reason the ' +
|
|
18
|
+
'user approved a no-sediment outcome. A blank reason does not override.')).action((opts) => runEmitHandoff(opts, io));
|
|
17
19
|
}
|
|
18
20
|
function runEmitHandoff(opts, io) {
|
|
19
21
|
try {
|
|
@@ -30,6 +32,8 @@ function runEmitHandoff(opts, io) {
|
|
|
30
32
|
evalInput.jobId = opts.jobId;
|
|
31
33
|
if (opts.forceUnderJob === true)
|
|
32
34
|
evalInput.forceUnderJob = true;
|
|
35
|
+
if (opts.forceNoSediment !== undefined)
|
|
36
|
+
evalInput.forceNoSedimentReason = opts.forceNoSediment;
|
|
33
37
|
const verdict = evaluateEmitHandoff(evalInput);
|
|
34
38
|
reportEmitHandoffVerdict(verdict, io, opts.json);
|
|
35
39
|
}
|
|
@@ -54,7 +58,15 @@ function reportEmitHandoffVerdict(verdict, io, json) {
|
|
|
54
58
|
printEmitHandoffBlockNotInitialized(verdict, io, json);
|
|
55
59
|
return;
|
|
56
60
|
}
|
|
57
|
-
|
|
61
|
+
if (verdict.kind === 'block-remaining') {
|
|
62
|
+
printEmitHandoffBlockRemaining(verdict, io, json);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (verdict.kind === 'allow-forced-no-sediment') {
|
|
66
|
+
printEmitHandoffAllowForcedNoSediment(verdict, io, json);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
printEmitHandoffBlockNoSediment(verdict, io, json);
|
|
58
70
|
}
|
|
59
71
|
function printEmitHandoffNoSession(io, json) {
|
|
60
72
|
const envelope = ok('code.emit-handoff', { allow: true, mode: 'no-session' }, [], ['No active session id; gate passes through (single-rid mode).']);
|
|
@@ -91,6 +103,31 @@ function printEmitHandoffBlockRemaining(verdict, io, json) {
|
|
|
91
103
|
printResult(io, envelope, json);
|
|
92
104
|
process.exitCode = 1;
|
|
93
105
|
}
|
|
106
|
+
function printEmitHandoffAllowForcedNoSediment(verdict, io, json) {
|
|
107
|
+
const envelope = ok('code.emit-handoff', {
|
|
108
|
+
allow: true,
|
|
109
|
+
mode: 'job-forced-no-sediment',
|
|
110
|
+
remaining: verdict.remaining,
|
|
111
|
+
sedimentState: verdict.sedimentState,
|
|
112
|
+
approvedNoSedimentReason: verdict.reason
|
|
113
|
+
}, [], [
|
|
114
|
+
`Job is complete (remaining=0) and the session sedimented no memory (${verdict.sedimentState}); the user explicitly approved a no-sediment outcome — "${verdict.reason}". Handoff allowed.`
|
|
115
|
+
]);
|
|
116
|
+
printResult(io, envelope, json);
|
|
117
|
+
}
|
|
118
|
+
function printEmitHandoffBlockNoSediment(verdict, io, json) {
|
|
119
|
+
const why = verdict.sedimentState === 'none'
|
|
120
|
+
? 'the session sedimented no memory'
|
|
121
|
+
: 'the memory index could not be read, so it cannot be shown that the session sedimented any memory';
|
|
122
|
+
const blockMessage = `BLOCKED: Job ${verdict.jobId} is complete (remaining=0) but ${why}. Step 11 requires at least one memory in the project memory store, or an explicit user-approved no-sediment outcome. Run \`peaks memory extract --apply\` (or record a non-handoff memory with the user's help), then re-run.`;
|
|
123
|
+
const envelope = fail('code.emit-handoff', JOB_COMPLETED_NO_SEDIMENT, blockMessage, { jobId: verdict.jobId, sedimentState: verdict.sedimentState }, [
|
|
124
|
+
'Sediment the session: run `peaks memory extract --project <root> --artifact .peaks/_runtime/<sessionId>/txt/handoff.md --apply --json`, then `peaks memory reindex --project <root> --apply --json`.',
|
|
125
|
+
'Ask the user whether a no-sediment outcome is acceptable; only then re-run with `--force-no-sediment "<the reason the user gave>"`.'
|
|
126
|
+
]);
|
|
127
|
+
io.stderr(`${blockMessage}\n`);
|
|
128
|
+
printResult(io, envelope, json);
|
|
129
|
+
process.exitCode = 1;
|
|
130
|
+
}
|
|
94
131
|
function reportEmitHandoffFailure(io, err, json) {
|
|
95
132
|
printResult(io, fail('code.emit-handoff', 'EMIT_HANDOFF_FAILED', getErrorMessage(err), null, [
|
|
96
133
|
'Verify the project path and try again'
|
|
@@ -41,14 +41,19 @@ function runGateStep08(opts, io) {
|
|
|
41
41
|
printGateStep08AllowSingle(context, io, opts.json);
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
//
|
|
47
|
-
// signal for the PreToolUse hook.
|
|
44
|
+
if (verdict.kind === 'block-missing-decision') {
|
|
45
|
+
// Block: the prompt matched the backup regex, so the LLM is treated as
|
|
46
|
+
// having skipped `peaks code detect-job` on a Job-shaped request.
|
|
47
|
+
// Exit code 2 is the load-bearing signal for the PreToolUse hook.
|
|
48
48
|
printGateStep08Blocked(verdict, context, io, opts.json);
|
|
49
49
|
return;
|
|
50
50
|
}
|
|
51
|
-
|
|
51
|
+
if (verdict.kind === 'block-no-decision-with-ledger') {
|
|
52
|
+
printGateStep08BlockedWithLedger(verdict, context, io, opts.json);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// allow-no-decision-recorded — no decision and no ledger. This is a
|
|
56
|
+
// normal non-Job session and the gate must let it through.
|
|
52
57
|
printGateStep08Undecided(verdict, context, io, opts.json);
|
|
53
58
|
}
|
|
54
59
|
catch (err) {
|
|
@@ -118,6 +123,20 @@ function printGateStep08Blocked(verdict, context, io, json) {
|
|
|
118
123
|
printResult(io, envelope, json);
|
|
119
124
|
process.exitCode = 2;
|
|
120
125
|
}
|
|
126
|
+
function printGateStep08BlockedWithLedger(verdict, context, io, json) {
|
|
127
|
+
const blockMessage = `BLOCKED: ${verdict.reason}`;
|
|
128
|
+
const envelope = fail('code.gate-step-08', 'STEP_08_BLOCKED_WITH_LEDGER', blockMessage, {
|
|
129
|
+
ledgerJobIds: verdict.ledgerJobIds,
|
|
130
|
+
backupRegex: STEP_08_BACKUP_REGEX.toString()
|
|
131
|
+
}, [
|
|
132
|
+
'Run `peaks code detect-job --is-job true --rationale <text> --suggested-job-id <slug>` (or `--is-job false`) to record the Job-shape verdict the Job ledger presumes.',
|
|
133
|
+
'Then re-run the Bash tool call.',
|
|
134
|
+
...context.hintActions
|
|
135
|
+
]);
|
|
136
|
+
io.stderr(`${blockMessage}\n`);
|
|
137
|
+
printResult(io, envelope, json);
|
|
138
|
+
process.exitCode = 2;
|
|
139
|
+
}
|
|
121
140
|
function printGateStep08Undecided(verdict, context, io, json) {
|
|
122
141
|
const envelope = ok('code.gate-step-08', {
|
|
123
142
|
allow: true,
|
|
@@ -125,10 +144,7 @@ function printGateStep08Undecided(verdict, context, io, json) {
|
|
|
125
144
|
decision: null,
|
|
126
145
|
nextSlice: null,
|
|
127
146
|
promptSource: verdict.promptSource
|
|
128
|
-
}, [], [
|
|
129
|
-
'No job-shape.json AND no backup-regex match on prompt → allow (most prompts are not Job-shaped).',
|
|
130
|
-
...context.hintActions
|
|
131
|
-
]);
|
|
147
|
+
}, [], [verdict.reason, ...context.hintActions]);
|
|
132
148
|
printResult(io, envelope, json);
|
|
133
149
|
}
|
|
134
150
|
function reportGateStep08Failure(io, err, json) {
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type Command } from 'commander';
|
|
2
|
+
import type { CommonCodegraphOptions } from './codegraph-command-runtime.js';
|
|
3
|
+
export interface CodegraphIndexOptions extends CommonCodegraphOptions {
|
|
4
|
+
force?: boolean;
|
|
5
|
+
quiet?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface CodegraphQueryOptions extends CommonCodegraphOptions {
|
|
8
|
+
json?: boolean;
|
|
9
|
+
limit?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface CodegraphFilesOptions extends CommonCodegraphOptions {
|
|
12
|
+
json?: boolean;
|
|
13
|
+
maxDepth?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface CodegraphAffectedOptions extends CommonCodegraphOptions {
|
|
16
|
+
json?: boolean;
|
|
17
|
+
rid?: string;
|
|
18
|
+
writeEnvelope?: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function addPeaksJsonOption(command: Command): Command;
|
|
21
|
+
export declare function addProjectOption(command: Command): Command;
|
|
22
|
+
export declare function parsePositiveInteger(value: string): number;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// src/cli/commands/codegraph-command-options.ts
|
|
2
|
+
//
|
|
3
|
+
// The option shapes every `peaks codegraph <verb>` shares, plus the three
|
|
4
|
+
// option-attaching helpers. Split out of `codegraph-commands.ts` so each verb
|
|
5
|
+
// group can live in its own module without re-declaring them.
|
|
6
|
+
import { InvalidArgumentError } from 'commander';
|
|
7
|
+
export function addPeaksJsonOption(command) {
|
|
8
|
+
return command.option('--peaks-json', 'print Peaks error envelope as machine-readable JSON');
|
|
9
|
+
}
|
|
10
|
+
export function addProjectOption(command) {
|
|
11
|
+
return addPeaksJsonOption(command.requiredOption('--project <path>', 'target project root'));
|
|
12
|
+
}
|
|
13
|
+
export function parsePositiveInteger(value) {
|
|
14
|
+
if (!/^\d+$/.test(value)) {
|
|
15
|
+
throw new InvalidArgumentError('must be a positive integer');
|
|
16
|
+
}
|
|
17
|
+
const parsed = Number(value);
|
|
18
|
+
if (!Number.isSafeInteger(parsed) || parsed < 1) {
|
|
19
|
+
throw new InvalidArgumentError('must be a positive integer');
|
|
20
|
+
}
|
|
21
|
+
return parsed;
|
|
22
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import {
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import type { ProgramIO } from '../cli-helpers.js';
|
|
3
3
|
export { rewriteBareCodegraphHints } from './codegraph-command-runtime.js';
|
|
4
4
|
export { attributeUpstreamUpToDateLine } from './codegraph-status-command.js';
|
|
5
5
|
export declare function registerCodegraphCommands(program: Command, io: ProgramIO): void;
|