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
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Exposes the `prepareFinalReview()` service (W2 T9 on
|
|
6
6
|
* `feature/slice-topology-multipass`) via the CLI surface. The service
|
|
7
|
-
* depends on an injected `LlmRunner`;
|
|
7
|
+
* depends on an injected `LlmRunner`; the binding lives in
|
|
8
|
+
* `final-review-prepare-command.ts`:
|
|
8
9
|
* - `--llm-provider stub` (default) returns a structured "scaffold ready"
|
|
9
10
|
* envelope WITHOUT calling the service, so CI can verify the route
|
|
10
11
|
* offline. It performs no review, and says so in every hint it emits.
|
|
@@ -23,33 +24,12 @@
|
|
|
23
24
|
* - `peaks audit goal` — propose a 6-dim goal from a human need
|
|
24
25
|
* - `peaks prepare-final-review` — produce a 4-dim review evidence
|
|
25
26
|
* pack for human acceptance
|
|
27
|
+
*
|
|
28
|
+
* This file is the registration module only; the run body it dispatches to
|
|
29
|
+
* lives in `final-review-prepare-command.ts` and the envelope vocabulary in
|
|
30
|
+
* `final-review-command-shared.ts`.
|
|
26
31
|
*/
|
|
27
32
|
import type { Command } from 'commander';
|
|
28
33
|
import { type ProgramIO } from '../cli-helpers.js';
|
|
29
|
-
import type { FinalReviewOutput } from '../../services/final-review/final-review-types.js';
|
|
30
|
-
export type FinalReviewStatus = 'scaffold-only' | 'review-complete' | 'not-applicable';
|
|
31
|
-
/**
|
|
32
|
-
* Which LLM produced this envelope. `unknown` is reserved for failure
|
|
33
|
-
* envelopes, where no binding was ever established.
|
|
34
|
-
*/
|
|
35
|
-
export type FinalReviewProviderBinding = 'stub' | 'anthropic-messages-api' | 'unknown';
|
|
36
|
-
export interface FinalReviewData {
|
|
37
|
-
readonly status: FinalReviewStatus;
|
|
38
|
-
readonly rid: string;
|
|
39
|
-
readonly sessionId: string;
|
|
40
|
-
readonly auditGoalPath: string;
|
|
41
|
-
readonly serviceWired: boolean;
|
|
42
|
-
readonly providerBinding: FinalReviewProviderBinding;
|
|
43
|
-
/** Model id the bound provider answered with (real-provider runs only). */
|
|
44
|
-
readonly model?: string;
|
|
45
|
-
/** The 4-dim review the service produced (real-provider runs only). */
|
|
46
|
-
readonly review?: FinalReviewOutput;
|
|
47
|
-
/**
|
|
48
|
-
* Environment variables that were absent when binding failed. Surfaced on
|
|
49
|
-
* `data` because `fail()` redacts `message` through
|
|
50
|
-
* `redactSensitiveErrorMessage`, whose catch-all pattern matches the words
|
|
51
|
-
* `token` / `api_key` and would blank out the very names an operator needs.
|
|
52
|
-
*/
|
|
53
|
-
readonly missingEnv?: readonly string[];
|
|
54
|
-
}
|
|
55
34
|
export declare function registerFinalReviewCommands(program: Command, io: ProgramIO): void;
|
|
35
|
+
export { emptyFinalReviewData, isSupportedLlmProvider, type FinalReviewData, type FinalReviewProviderBinding, type FinalReviewStatus, type PrepareFinalReviewOptions } from './final-review-command-shared.js';
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Exposes the `prepareFinalReview()` service (W2 T9 on
|
|
6
6
|
* `feature/slice-topology-multipass`) via the CLI surface. The service
|
|
7
|
-
* depends on an injected `LlmRunner`;
|
|
7
|
+
* depends on an injected `LlmRunner`; the binding lives in
|
|
8
|
+
* `final-review-prepare-command.ts`:
|
|
8
9
|
* - `--llm-provider stub` (default) returns a structured "scaffold ready"
|
|
9
10
|
* envelope WITHOUT calling the service, so CI can verify the route
|
|
10
11
|
* offline. It performs no review, and says so in every hint it emits.
|
|
@@ -23,91 +24,14 @@
|
|
|
23
24
|
* - `peaks audit goal` — propose a 6-dim goal from a human need
|
|
24
25
|
* - `peaks prepare-final-review` — produce a 4-dim review evidence
|
|
25
26
|
* pack for human acceptance
|
|
27
|
+
*
|
|
28
|
+
* This file is the registration module only; the run body it dispatches to
|
|
29
|
+
* lives in `final-review-prepare-command.ts` and the envelope vocabulary in
|
|
30
|
+
* `final-review-command-shared.ts`.
|
|
26
31
|
*/
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
31
|
-
import { fail, ok } from 'peaks-loop-shared/result';
|
|
32
|
-
import { createAnthropicRunner, LlmBindingError, LlmRequestError, resolveAnthropicConfig } from '../../services/llm/anthropic-runner.js';
|
|
33
|
-
import { IncompleteFinalReviewError, prepareFinalReview } from '../../services/final-review/final-review-service.js';
|
|
34
|
-
/** Whitelist of supported `--llm-provider` values for `peaks prepare-final-review`. */
|
|
35
|
-
const SUPPORTED_LLM_PROVIDERS = ['anthropic', 'stub'];
|
|
36
|
-
/**
|
|
37
|
-
* Default stays `stub` (unlike `peaks audit goal`, whose default is the real
|
|
38
|
-
* provider): the scaffold route is what CI and the registered e2e contract
|
|
39
|
-
* exercise without credentials, and the stub envelope is labelled
|
|
40
|
-
* `status: 'scaffold-only'` / `providerBinding: 'stub'` so it can never be
|
|
41
|
-
* read as a review.
|
|
42
|
-
*/
|
|
43
|
-
const DEFAULT_LLM_PROVIDER = 'stub';
|
|
44
|
-
function isSupportedLlmProvider(value) {
|
|
45
|
-
return SUPPORTED_LLM_PROVIDERS.includes(value);
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Empty placeholder used by `fail()` envelopes. `status` is
|
|
49
|
-
* `'not-applicable'` on the error path so consumers can tell
|
|
50
|
-
* "this is a placeholder on a failure" apart from "this is a real
|
|
51
|
-
* scaffold-only success".
|
|
52
|
-
*/
|
|
53
|
-
function emptyFinalReviewData(rid, sessionId, auditGoalPath, missingEnv) {
|
|
54
|
-
return {
|
|
55
|
-
status: 'not-applicable',
|
|
56
|
-
rid,
|
|
57
|
-
sessionId,
|
|
58
|
-
auditGoalPath,
|
|
59
|
-
serviceWired: false,
|
|
60
|
-
providerBinding: 'unknown',
|
|
61
|
-
...(missingEnv === undefined ? {} : { missingEnv })
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
function validateProjectRoot(projectArg) {
|
|
65
|
-
const projectRoot = resolve(projectArg);
|
|
66
|
-
if (!existsSync(projectRoot)) {
|
|
67
|
-
return {
|
|
68
|
-
ok: false,
|
|
69
|
-
code: 'PROJECT_NOT_FOUND',
|
|
70
|
-
message: `project path does not exist: ${projectArg}`
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
let stat;
|
|
74
|
-
try {
|
|
75
|
-
stat = statSync(projectRoot);
|
|
76
|
-
}
|
|
77
|
-
catch (error) {
|
|
78
|
-
return { ok: false, code: 'INVALID_PROJECT', message: getErrorMessage(error) };
|
|
79
|
-
}
|
|
80
|
-
if (!stat.isDirectory()) {
|
|
81
|
-
return {
|
|
82
|
-
ok: false,
|
|
83
|
-
code: 'INVALID_PROJECT',
|
|
84
|
-
message: `project path is not a directory: ${projectArg}`
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
return { ok: true, projectRoot };
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Validate the session id. Rejects empty, path-traversal (`..`), and
|
|
91
|
-
* any segment separator (`/`, `\`) so the caller cannot escape
|
|
92
|
-
* `.peaks/_runtime/<sessionId>/audit-goal/` via CLI flags.
|
|
93
|
-
*/
|
|
94
|
-
function validateSessionId(sessionId) {
|
|
95
|
-
if (sessionId.length === 0) {
|
|
96
|
-
return {
|
|
97
|
-
ok: false,
|
|
98
|
-
code: 'MISSING_REQUIRED_FLAG',
|
|
99
|
-
message: '`--session-id` is required and must be a non-empty string'
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
if (sessionId.includes('..') || sessionId.includes('/') || sessionId.includes('\\')) {
|
|
103
|
-
return {
|
|
104
|
-
ok: false,
|
|
105
|
-
code: 'INVALID_SESSION_ID',
|
|
106
|
-
message: '`--session-id` must not contain path-traversal or path-separator characters (rejected: "..", "/", "\\")'
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
return { ok: true, sessionId };
|
|
110
|
-
}
|
|
32
|
+
import { addJsonOption } from '../cli-helpers.js';
|
|
33
|
+
import { DEFAULT_LLM_PROVIDER, SUPPORTED_LLM_PROVIDERS } from './final-review-command-shared.js';
|
|
34
|
+
import { runPrepareFinalReview } from './final-review-prepare-command.js';
|
|
111
35
|
export function registerFinalReviewCommands(program, io) {
|
|
112
36
|
addJsonOption(program
|
|
113
37
|
.command('prepare-final-review <rid>')
|
|
@@ -115,159 +39,8 @@ export function registerFinalReviewCommands(program, io) {
|
|
|
115
39
|
.requiredOption('--project <path>', 'target project root')
|
|
116
40
|
.requiredOption('--session-id <sid>', 'session id whose .peaks/_runtime/<sid>/audit-goal/<rid>.json is the approved goal source')
|
|
117
41
|
.option('--llm-provider <name>', `LLM provider name: ${SUPPORTED_LLM_PROVIDERS.join(' | ')} (default: ${DEFAULT_LLM_PROVIDER} — performs no review)`, DEFAULT_LLM_PROVIDER)
|
|
118
|
-
.option('--base <ref>', 'base ref for the pre/post baseline diff (`existing-functionality-intact`); default: merge-base with origin/HEAD, then origin/main, then origin/master, then HEAD~1 — pass this explicitly when none of those resolve')).action(
|
|
119
|
-
// 1. Project root must exist and be a directory.
|
|
120
|
-
const projectValidation = validateProjectRoot(options.project);
|
|
121
|
-
if (!projectValidation.ok) {
|
|
122
|
-
printResult(io, fail('final-review.prepare', projectValidation.code, projectValidation.message, emptyFinalReviewData(rid, options.sessionId, ''), ['Verify the project path exists and is a directory']), options.json);
|
|
123
|
-
process.exitCode = 1;
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
// 2. Session id must be a safe single-segment string.
|
|
127
|
-
const sessionValidation = validateSessionId(options.sessionId);
|
|
128
|
-
if (!sessionValidation.ok) {
|
|
129
|
-
printResult(io, fail('final-review.prepare', sessionValidation.code, sessionValidation.message, emptyFinalReviewData(rid, options.sessionId, ''), [
|
|
130
|
-
'Pass a non-empty `--session-id` whose value is a single segment (no "..", "/", or "\\")'
|
|
131
|
-
]), options.json);
|
|
132
|
-
process.exitCode = 1;
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
// 3. Compute the audit-goal path the service WOULD read. We do this
|
|
136
|
-
// in two places: the pre-flight existence check (here) and the
|
|
137
|
-
// stub-path envelope (below). The service computes it identically
|
|
138
|
-
// at `src/services/final-review/final-review-service.ts:45-52`.
|
|
139
|
-
//
|
|
140
|
-
// Rid axis. The rid is the CLI positional and it is the FILENAME
|
|
141
|
-
// segment below, so it is checked here, at the join. Added 2026-09-14
|
|
142
|
-
// (repair R1): this join was a second-slot hole — the `--session-id`
|
|
143
|
-
// validation above passed and the rid slot escaped. Found by the
|
|
144
|
-
// widened rule D, not by a human reading the file.
|
|
145
|
-
if (!REQUEST_ID_PATTERN.test(rid)) {
|
|
146
|
-
printResult(io, fail('final-review.prepare', 'RID_INVALID', `Invalid request id: ${rid} (expected letters, digits, dots, underscores, or dashes)`, emptyFinalReviewData(rid, options.sessionId, ''), ['Pass the rid of the slice, e.g. 2026-09-14-some-slug']), options.json);
|
|
147
|
-
process.exitCode = 1;
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
const auditGoalPath = join(projectValidation.projectRoot, '.peaks', '_runtime', sessionValidation.sessionId, 'audit-goal', `${rid}.json`);
|
|
151
|
-
// 4. Pre-flight: if the audit-goal file is missing, surface a 404
|
|
152
|
-
// BEFORE the stub/provider check so the caller learns the real
|
|
153
|
-
// reason their request can't proceed.
|
|
154
|
-
if (!existsSync(auditGoalPath)) {
|
|
155
|
-
printResult(io, fail('final-review.prepare', 'AUDIT_GOAL_NOT_FOUND', `audit-goal file not found at expected path: ${auditGoalPath}`, emptyFinalReviewData(rid, sessionValidation.sessionId, auditGoalPath), [
|
|
156
|
-
'Run `peaks audit goal --project <path> --need <text>` first to produce the approved goal JSON.',
|
|
157
|
-
'Confirm `--session-id` matches the session that wrote the goal.'
|
|
158
|
-
]), options.json);
|
|
159
|
-
process.exitCode = 1;
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
// 5. Provider check: unknown names fail loudly — a silent fallback to
|
|
163
|
-
// `stub` would hand the caller a scaffold envelope that reads as a
|
|
164
|
-
// review route, which is the defect class this gate exists to stop.
|
|
165
|
-
const provider = options.llmProvider ?? DEFAULT_LLM_PROVIDER;
|
|
166
|
-
if (!isSupportedLlmProvider(provider)) {
|
|
167
|
-
printResult(io, fail('final-review.prepare', 'LLM_PROVIDER_NOT_IMPLEMENTED', `LLM provider "${provider}" is not implemented. Supported providers: ${SUPPORTED_LLM_PROVIDERS.join(', ')}.`, emptyFinalReviewData(rid, sessionValidation.sessionId, auditGoalPath), [
|
|
168
|
-
`Re-run with \`--llm-provider anthropic\` for a real 4-dim review, or \`--llm-provider ${DEFAULT_LLM_PROVIDER}\` for an offline scaffold.`
|
|
169
|
-
]), options.json);
|
|
170
|
-
process.exitCode = 1;
|
|
171
|
-
return;
|
|
172
|
-
}
|
|
173
|
-
// 6. Stub path: surface a structured "scaffold ready" envelope.
|
|
174
|
-
// We DO NOT call the service here — the stub runner answers the
|
|
175
|
-
// audit-goal shape, not the 4-dim review shape, so running it through
|
|
176
|
-
// `prepareFinalReview()` would only manufacture a malformed review.
|
|
177
|
-
// The envelope confirms the route is wired end-to-end and reports the
|
|
178
|
-
// audit-goal path the service WOULD read.
|
|
179
|
-
if (provider === 'stub') {
|
|
180
|
-
const data = {
|
|
181
|
-
status: 'scaffold-only',
|
|
182
|
-
rid,
|
|
183
|
-
sessionId: sessionValidation.sessionId,
|
|
184
|
-
auditGoalPath,
|
|
185
|
-
serviceWired: true,
|
|
186
|
-
providerBinding: 'stub'
|
|
187
|
-
};
|
|
188
|
-
const envelope = ok('final-review.prepare', data, [], [
|
|
189
|
-
'Stub provider: no 4-dim review was performed. This envelope only proves the route is wired and reachable.',
|
|
190
|
-
`Audit-goal file is present at: ${auditGoalPath}`,
|
|
191
|
-
'Re-run with `--llm-provider anthropic` to produce a real review.'
|
|
192
|
-
]);
|
|
193
|
-
printResult(io, envelope, options.json);
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
// 7. Real provider path: bind a real `LlmRunner` and run the service.
|
|
197
|
-
// Binding happens INSIDE the try so an absent credential surfaces as
|
|
198
|
-
// `LlmBindingError`'s own code instead of escaping as a crash. No
|
|
199
|
-
// envelope is emitted on that path — a "successful" empty review would
|
|
200
|
-
// be worse than an error.
|
|
201
|
-
try {
|
|
202
|
-
const config = resolveAnthropicConfig();
|
|
203
|
-
const llmRunner = createAnthropicRunner(config);
|
|
204
|
-
const review = await prepareFinalReview(rid, {
|
|
205
|
-
projectRoot: projectValidation.projectRoot,
|
|
206
|
-
sessionId: sessionValidation.sessionId,
|
|
207
|
-
llmRunner,
|
|
208
|
-
...(options.base === undefined ? {} : { baseRef: options.base })
|
|
209
|
-
});
|
|
210
|
-
const data = {
|
|
211
|
-
status: 'review-complete',
|
|
212
|
-
rid,
|
|
213
|
-
sessionId: sessionValidation.sessionId,
|
|
214
|
-
auditGoalPath,
|
|
215
|
-
serviceWired: true,
|
|
216
|
-
providerBinding: 'anthropic-messages-api',
|
|
217
|
-
model: config.model,
|
|
218
|
-
review
|
|
219
|
-
};
|
|
220
|
-
const envelope = ok('final-review.prepare', data, review.allPass
|
|
221
|
-
? []
|
|
222
|
-
: [
|
|
223
|
-
`Dimensions needing human attention: ${review.needsAttention.join(', ') || 'none flagged'}.`
|
|
224
|
-
], [
|
|
225
|
-
`4-dim review produced by anthropic-messages-api (model: ${config.model}).`,
|
|
226
|
-
`allPass: ${String(review.allPass)}.`
|
|
227
|
-
]);
|
|
228
|
-
printResult(io, envelope, options.json);
|
|
229
|
-
}
|
|
230
|
-
catch (error) {
|
|
231
|
-
const code = finalReviewErrorCode(error);
|
|
232
|
-
printResult(io, fail('final-review.prepare', code, getErrorMessage(error), emptyFinalReviewData(rid, sessionValidation.sessionId, auditGoalPath, error instanceof LlmBindingError ? error.missingEnv : undefined), finalReviewNextActions(code)), options.json);
|
|
233
|
-
process.exitCode = 1;
|
|
234
|
-
}
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Map a thrown error to the CLI's error code. The LLM-layer errors already
|
|
239
|
-
* carry codes precise enough to act on (`LLM_CREDENTIAL_MISSING`,
|
|
240
|
-
* `LLM_REQUEST_FAILED`, …), so they are passed through rather than flattened
|
|
241
|
-
* into one opaque failure.
|
|
242
|
-
*/
|
|
243
|
-
function finalReviewErrorCode(error) {
|
|
244
|
-
if (error instanceof LlmBindingError ||
|
|
245
|
-
error instanceof LlmRequestError ||
|
|
246
|
-
error instanceof IncompleteFinalReviewError) {
|
|
247
|
-
return error.code;
|
|
248
|
-
}
|
|
249
|
-
return 'FINAL_REVIEW_FAILED';
|
|
250
|
-
}
|
|
251
|
-
function finalReviewNextActions(code) {
|
|
252
|
-
switch (code) {
|
|
253
|
-
case 'LLM_CREDENTIAL_MISSING':
|
|
254
|
-
return [
|
|
255
|
-
'Export ANTHROPIC_AUTH_TOKEN (or ANTHROPIC_API_KEY) in the environment that launches peaks, then re-run.',
|
|
256
|
-
'For an offline scaffold instead of a review, re-run with `--llm-provider stub` — it performs NO review.'
|
|
257
|
-
];
|
|
258
|
-
case 'LLM_MODEL_MISSING':
|
|
259
|
-
return [
|
|
260
|
-
'Export ANTHROPIC_MODEL (or CLAUDE_CODE_SUBAGENT_MODEL) in the environment that launches peaks, then re-run.'
|
|
261
|
-
];
|
|
262
|
-
case 'LLM_REQUEST_FAILED':
|
|
263
|
-
return [
|
|
264
|
-
'Check ANTHROPIC_BASE_URL and network reachability, then re-run — a transport failure produces no review.'
|
|
265
|
-
];
|
|
266
|
-
case 'INCOMPLETE_FINAL_REVIEW':
|
|
267
|
-
return [
|
|
268
|
-
'The LLM reply was not valid JSON or omitted a required dimension; re-run so the gate is never read as complete.'
|
|
269
|
-
];
|
|
270
|
-
default:
|
|
271
|
-
return ['Re-run with `--llm-provider stub` to validate the CLI route without a real LLM.'];
|
|
272
|
-
}
|
|
42
|
+
.option('--base <ref>', 'base ref for the pre/post baseline diff (`existing-functionality-intact`); default: merge-base with origin/HEAD, then origin/main, then origin/master, then HEAD~1 — pass this explicitly when none of those resolve')).action((rid, options) => runPrepareFinalReview(rid, options, io));
|
|
273
43
|
}
|
|
44
|
+
// Re-export for tests / external consumers: the envelope vocabulary and the
|
|
45
|
+
// types this command's surface is documented with.
|
|
46
|
+
export { emptyFinalReviewData, isSupportedLlmProvider } from './final-review-command-shared.js';
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
// src/cli/commands/final-review-prepare-command.ts
|
|
2
|
+
//
|
|
3
|
+
// The body of `peaks prepare-final-review`: the two input validations, the
|
|
4
|
+
// audit-goal path resolution, the provider check, the stub scaffold route and
|
|
5
|
+
// the real-provider route. Split out of `final-review-commands.ts`; every
|
|
6
|
+
// envelope code, message, `data` field and next-action string is unchanged.
|
|
7
|
+
//
|
|
8
|
+
// The input validations and the `_runtime` join below live in ONE module on
|
|
9
|
+
// purpose: rule D is file-scoped, so a join whose id slot is checked two
|
|
10
|
+
// modules away is a join the guard cannot see.
|
|
11
|
+
import { existsSync, statSync } from 'node:fs';
|
|
12
|
+
import { join, resolve } from 'node:path';
|
|
13
|
+
import { REQUEST_ID_PATTERN } from '../../services/artifacts/request-artifact-service.js';
|
|
14
|
+
import { createAnthropicRunner, LlmBindingError, resolveAnthropicConfig } from '../../services/llm/anthropic-runner.js';
|
|
15
|
+
import { prepareFinalReview } from '../../services/final-review/final-review-service.js';
|
|
16
|
+
import { getErrorMessage } from '../cli-helpers.js';
|
|
17
|
+
import { DEFAULT_LLM_PROVIDER, isSupportedLlmProvider, SUPPORTED_LLM_PROVIDERS } from './final-review-command-shared.js';
|
|
18
|
+
import { emitPrepareFailure, emitReviewEnvelope, emitStubEnvelope, finalReviewErrorCode, finalReviewNextActions } from './final-review-command-envelopes.js';
|
|
19
|
+
function validateProjectRoot(projectArg) {
|
|
20
|
+
const projectRoot = resolve(projectArg);
|
|
21
|
+
if (!existsSync(projectRoot)) {
|
|
22
|
+
return {
|
|
23
|
+
ok: false,
|
|
24
|
+
code: 'PROJECT_NOT_FOUND',
|
|
25
|
+
message: `project path does not exist: ${projectArg}`
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
let stat;
|
|
29
|
+
try {
|
|
30
|
+
stat = statSync(projectRoot);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return { ok: false, code: 'INVALID_PROJECT', message: getErrorMessage(error) };
|
|
34
|
+
}
|
|
35
|
+
if (!stat.isDirectory()) {
|
|
36
|
+
return {
|
|
37
|
+
ok: false,
|
|
38
|
+
code: 'INVALID_PROJECT',
|
|
39
|
+
message: `project path is not a directory: ${projectArg}`
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
return { ok: true, projectRoot };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Validate the session id. Rejects empty, path-traversal (`..`), and
|
|
46
|
+
* any segment separator (`/`, `\`) so the caller cannot escape
|
|
47
|
+
* `.peaks/_runtime/<sessionId>/audit-goal/` via CLI flags.
|
|
48
|
+
*/
|
|
49
|
+
function validateSessionId(sessionId) {
|
|
50
|
+
if (sessionId.length === 0) {
|
|
51
|
+
return {
|
|
52
|
+
ok: false,
|
|
53
|
+
code: 'MISSING_REQUIRED_FLAG',
|
|
54
|
+
message: '`--session-id` is required and must be a non-empty string'
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (sessionId.includes('..') || sessionId.includes('/') || sessionId.includes('\\')) {
|
|
58
|
+
return {
|
|
59
|
+
ok: false,
|
|
60
|
+
code: 'INVALID_SESSION_ID',
|
|
61
|
+
message: '`--session-id` must not contain path-traversal or path-separator characters (rejected: "..", "/", "\\")'
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return { ok: true, sessionId };
|
|
65
|
+
}
|
|
66
|
+
/** The refusal for an audit goal the pre-flight did not find on disk. */
|
|
67
|
+
function auditGoalMissingRefusal(rid, sessionId, auditGoalPath) {
|
|
68
|
+
return {
|
|
69
|
+
rid,
|
|
70
|
+
code: 'AUDIT_GOAL_NOT_FOUND',
|
|
71
|
+
message: `audit-goal file not found at expected path: ${auditGoalPath}`,
|
|
72
|
+
sessionId,
|
|
73
|
+
auditGoalPath,
|
|
74
|
+
nextActions: [
|
|
75
|
+
'Run `peaks audit goal --project <path> --need <text>` first to produce the approved goal JSON.',
|
|
76
|
+
'Confirm `--session-id` matches the session that wrote the goal.'
|
|
77
|
+
]
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Resolve the audit-goal path, or the refusal that replaces it.
|
|
82
|
+
*
|
|
83
|
+
* The `rid` axis is checked HERE, at the join: the rid is the CLI positional
|
|
84
|
+
* and it is the FILENAME segment, so the `--session-id` validation does not
|
|
85
|
+
* cover it (added 2026-09-14, repair R1 — a second-slot hole, found by the
|
|
86
|
+
* widened rule D rather than by a human reading the file).
|
|
87
|
+
*
|
|
88
|
+
* The audit-goal existence pre-flight sits here too, so the caller learns the
|
|
89
|
+
* real reason its request cannot proceed BEFORE the provider check.
|
|
90
|
+
*/
|
|
91
|
+
function resolveAuditGoalPath(rid, options, projectRoot) {
|
|
92
|
+
const sessionValidation = validateSessionId(options.sessionId);
|
|
93
|
+
if (!sessionValidation.ok) {
|
|
94
|
+
return {
|
|
95
|
+
rid,
|
|
96
|
+
code: sessionValidation.code,
|
|
97
|
+
message: sessionValidation.message,
|
|
98
|
+
sessionId: options.sessionId,
|
|
99
|
+
auditGoalPath: '',
|
|
100
|
+
nextActions: [
|
|
101
|
+
'Pass a non-empty `--session-id` whose value is a single segment (no "..", "/", or "\\")'
|
|
102
|
+
]
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
if (!REQUEST_ID_PATTERN.test(rid)) {
|
|
106
|
+
return {
|
|
107
|
+
rid,
|
|
108
|
+
code: 'RID_INVALID',
|
|
109
|
+
message: `Invalid request id: ${rid} (expected letters, digits, dots, underscores, or dashes)`,
|
|
110
|
+
sessionId: sessionValidation.sessionId,
|
|
111
|
+
auditGoalPath: '',
|
|
112
|
+
nextActions: ['Pass the rid of the slice, e.g. 2026-09-14-some-slug']
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
const auditGoalPath = join(projectRoot, '.peaks', '_runtime', sessionValidation.sessionId, 'audit-goal', `${rid}.json`);
|
|
116
|
+
if (!existsSync(auditGoalPath)) {
|
|
117
|
+
return auditGoalMissingRefusal(rid, sessionValidation.sessionId, auditGoalPath);
|
|
118
|
+
}
|
|
119
|
+
return { projectRoot, sessionId: sessionValidation.sessionId, auditGoalPath };
|
|
120
|
+
}
|
|
121
|
+
/** Resolve the three inputs the run needs, or the refusal that replaces them. */
|
|
122
|
+
function resolvePrepareInputs(rid, options) {
|
|
123
|
+
const projectValidation = validateProjectRoot(options.project);
|
|
124
|
+
if (!projectValidation.ok) {
|
|
125
|
+
return {
|
|
126
|
+
rid,
|
|
127
|
+
code: projectValidation.code,
|
|
128
|
+
message: projectValidation.message,
|
|
129
|
+
sessionId: options.sessionId,
|
|
130
|
+
auditGoalPath: '',
|
|
131
|
+
nextActions: ['Verify the project path exists and is a directory']
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
return resolveAuditGoalPath(rid, options, projectValidation.projectRoot);
|
|
135
|
+
}
|
|
136
|
+
function isRefusal(value) {
|
|
137
|
+
return !('projectRoot' in value);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Real provider path: bind a real `LlmRunner` and run the service.
|
|
141
|
+
*
|
|
142
|
+
* Binding happens INSIDE the try so an absent credential surfaces as
|
|
143
|
+
* `LlmBindingError`'s own code instead of escaping as a crash. No envelope is
|
|
144
|
+
* emitted on that path — a "successful" empty review would be worse than an
|
|
145
|
+
* error.
|
|
146
|
+
*/
|
|
147
|
+
async function runRealReview(io, rid, inputs, options) {
|
|
148
|
+
const { json } = options;
|
|
149
|
+
try {
|
|
150
|
+
const config = resolveAnthropicConfig();
|
|
151
|
+
const llmRunner = createAnthropicRunner(config);
|
|
152
|
+
const review = await prepareFinalReview(rid, {
|
|
153
|
+
projectRoot: inputs.projectRoot,
|
|
154
|
+
sessionId: inputs.sessionId,
|
|
155
|
+
llmRunner,
|
|
156
|
+
...(options.base === undefined ? {} : { baseRef: options.base })
|
|
157
|
+
});
|
|
158
|
+
emitReviewEnvelope(io, { rid, goal: inputs, model: config.model, review, json });
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
const code = finalReviewErrorCode(error);
|
|
162
|
+
emitPrepareFailure(io, json, {
|
|
163
|
+
rid,
|
|
164
|
+
code,
|
|
165
|
+
message: getErrorMessage(error),
|
|
166
|
+
sessionId: inputs.sessionId,
|
|
167
|
+
auditGoalPath: inputs.auditGoalPath,
|
|
168
|
+
nextActions: finalReviewNextActions(code)
|
|
169
|
+
}, error instanceof LlmBindingError ? error.missingEnv : undefined);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export async function runPrepareFinalReview(rid, options, io) {
|
|
173
|
+
const inputs = resolvePrepareInputs(rid, options);
|
|
174
|
+
if (isRefusal(inputs)) {
|
|
175
|
+
emitPrepareFailure(io, options.json, inputs);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
// Unknown provider names fail loudly — a silent fallback to `stub` would hand
|
|
179
|
+
// the caller a scaffold envelope that reads as a review route, which is the
|
|
180
|
+
// defect class this gate exists to stop.
|
|
181
|
+
const provider = options.llmProvider ?? DEFAULT_LLM_PROVIDER;
|
|
182
|
+
if (!isSupportedLlmProvider(provider)) {
|
|
183
|
+
emitPrepareFailure(io, options.json, {
|
|
184
|
+
rid,
|
|
185
|
+
code: 'LLM_PROVIDER_NOT_IMPLEMENTED',
|
|
186
|
+
message: `LLM provider "${provider}" is not implemented. Supported providers: ${SUPPORTED_LLM_PROVIDERS.join(', ')}.`,
|
|
187
|
+
sessionId: inputs.sessionId,
|
|
188
|
+
auditGoalPath: inputs.auditGoalPath,
|
|
189
|
+
nextActions: [
|
|
190
|
+
`Re-run with \`--llm-provider anthropic\` for a real 4-dim review, or \`--llm-provider ${DEFAULT_LLM_PROVIDER}\` for an offline scaffold.`
|
|
191
|
+
]
|
|
192
|
+
});
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (provider === 'stub') {
|
|
196
|
+
emitStubEnvelope(io, rid, inputs, options.json);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
await runRealReview(io, rid, inputs, options);
|
|
200
|
+
}
|
|
@@ -1,18 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* The `peaks contract` / `peaks classify` entry point.
|
|
2
3
|
*
|
|
3
4
|
* Pre-merge originals (now deleted):
|
|
4
|
-
* - src/cli/commands/contract-commands.ts
|
|
5
|
+
* - src/cli/commands/contract-commands.ts (167 lines)
|
|
5
6
|
* - src/cli/commands/classify-classify-commands.ts (190 lines)
|
|
6
7
|
*
|
|
7
|
-
* Both
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* Both `register*Commands` functions are preserved **verbatim** (function name,
|
|
9
|
+
* signature, body). The merge was a structural refactor only — no behavior
|
|
10
|
+
* change — and `autoRegisterAllCommands` discovers both exports from this single
|
|
11
|
+
* file. This module is now the entry point and no longer holds the verbs:
|
|
11
12
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
13
|
+
* `contract-write-command.ts` `peaks contract write`
|
|
14
|
+
* `classify-run-command.ts` `peaks classify run`
|
|
15
|
+
* `classify-downgrade-command.ts` `peaks classify downgrade` (always refused)
|
|
16
|
+
* `classify-signals.ts` the diff signals + the audit log
|
|
14
17
|
*/
|
|
15
18
|
import type { Command } from 'commander';
|
|
16
|
-
import {
|
|
17
|
-
export
|
|
19
|
+
import type { ProgramIO } from '../cli-helpers.js';
|
|
20
|
+
export { registerContractCommands } from './contract-write-command.js';
|
|
21
|
+
/**
|
|
22
|
+
* peaks classify CLI (Slice L1a + L1b).
|
|
23
|
+
*
|
|
24
|
+
* Subcommands:
|
|
25
|
+
* - peaks classify run --project <path> [--override <level> --reason "<text>"]
|
|
26
|
+
* Classify the current diff via the heuristic + return a JSON envelope
|
|
27
|
+
* with the chosen level, gate set, and audit log.
|
|
28
|
+
* - peaks classify downgrade --level <level> --reason "<text>" --project <path>
|
|
29
|
+
* Always refused (per spec §4: "peaks classify downgrade" always errors
|
|
30
|
+
* out). LLM may ask; the CLI never grants.
|
|
31
|
+
*/
|
|
18
32
|
export declare function registerClassifyCommands(program: Command, io: ProgramIO): void;
|