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
|
@@ -1,283 +1,113 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* The `--from-dag` path of `peaks sub-agent dispatch`.
|
|
2
3
|
*
|
|
3
|
-
* Pulled out of `dispatch-commands.ts` to honor the
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* Pulled out of `dispatch-commands.ts` to honor the file-size cap (Karpathy #2
|
|
5
|
+
* Simplicity First). The single-dispatch action stays in `dispatch-commands.ts`;
|
|
6
|
+
* the DAG-dispatch path lives here because the two share no logic — the
|
|
7
|
+
* warm-path single dispatch does NOT load slice-dag / dag-orchestrator /
|
|
8
|
+
* contract-store (slice 9 perf), while the `--from-dag` codepath loads all
|
|
9
|
+
* three on first call.
|
|
9
10
|
*
|
|
10
|
-
* 2.7.0 slice-dag-dispatcher MVP: read a SliceDag from a file and run
|
|
11
|
-
*
|
|
12
|
-
* that emits the per-IDE `buildToolCall` envelope for each topological
|
|
13
|
-
* level.
|
|
11
|
+
* 2.7.0 slice-dag-dispatcher MVP: read a SliceDag from a file and run it
|
|
12
|
+
* through `runLayeredDag`. The orchestrator's `runSlice` is a thin wrapper
|
|
13
|
+
* that emits the per-IDE `buildToolCall` envelope for each topological level.
|
|
14
14
|
*
|
|
15
15
|
* 1.2 MVP scope: this dispatches the FIRST topological level synchronously
|
|
16
|
-
* (returns the dispatch specs); subsequent levels are not surfaced in
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
16
|
+
* (returns the dispatch specs); subsequent levels are not surfaced in the CLI
|
|
17
|
+
* envelope because the LLM-side runner must actually execute each
|
|
18
|
+
* `buildToolCall` and write the resulting contract before level 2+ can be
|
|
19
|
+
* safely auto-advanced. The LLM re-invokes `peaks sub-agent dispatch --from-dag
|
|
20
|
+
* <file> --batch-id <id>` after writing level-1 contracts, which causes
|
|
21
|
+
* `runLayeredDag` to plan level 2+ with the level-1 ancestor contracts spliced
|
|
22
|
+
* into their dispatch prompts.
|
|
23
23
|
*
|
|
24
|
-
* Internally,
|
|
25
|
-
* cancel-on-fail path is exercised end-to-end during the MVP emit; only
|
|
26
|
-
*
|
|
24
|
+
* Internally, `runLayeredDag` DOES iterate all levels so its join-barrier +
|
|
25
|
+
* cancel-on-fail path is exercised end-to-end during the MVP emit; only the
|
|
26
|
+
* CLI envelope is filtered to level-1 toolCalls (see `firstLevelIds`).
|
|
27
27
|
*/
|
|
28
|
-
import { randomUUID } from 'node:crypto';
|
|
29
28
|
import { printResult } from '../cli-helpers.js';
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import { planFileOverlapWaves } from '../../services/dispatch/file-overlap-wave-planner.js';
|
|
29
|
+
import { buildDagSuccessEnvelope } from './dispatch-dag-envelope.js';
|
|
30
|
+
import { emitDagFailure } from './dispatch-dag-failure.js';
|
|
31
|
+
import { assertGraphNodesMapped, loadDagRuntime, readDagOrFail, resolveDagIds, topologicalLevelsOrFail } from './dispatch-dag-preflight.js';
|
|
32
|
+
import { makeCliRunner, makeNoopWriter, planFirstLevelWaves, resolveDagDispatcher } from './dispatch-dag-runners.js';
|
|
35
33
|
export async function runDispatchFromDag(role, options, asJson, io) {
|
|
36
34
|
if (!options.fromDag)
|
|
37
35
|
return;
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
'unknown-sid';
|
|
44
|
-
const rid = options.requestId ?? 'unknown-rid';
|
|
45
|
-
const batchId = options.batchId ?? randomUUID();
|
|
46
|
-
// Slice 9 (dispatch CLI latency): the --from-dag codepath loads three
|
|
47
|
-
// heavy modules (slice-dag, dag-orchestrator, contract-store) that
|
|
48
|
-
// transitively import 10+ more services. They are NOT touched by the
|
|
49
|
-
// warm-path single-dispatch action, so we lazy-load them here only
|
|
50
|
-
// when --from-dag is actually requested. The dynamic-import promise
|
|
51
|
-
// resolves on first call, then ESM caches the module for subsequent
|
|
52
|
-
// calls in the same process.
|
|
53
|
-
const [{ readFileSync }, sliceDagMod, dagOrchestratorMod, contractStoreMod] = await Promise.all([
|
|
54
|
-
import('node:fs'),
|
|
55
|
-
import('../../services/dispatch/slice-dag.js'),
|
|
56
|
-
import('../../services/code/dag-orchestrator.js'),
|
|
57
|
-
import('../../services/dispatch/contract-store.js')
|
|
58
|
-
]);
|
|
59
|
-
const { validateDag, topologicalLevels, isSliceComplexity } = sliceDagMod;
|
|
60
|
-
const { runLayeredDag } = dagOrchestratorMod;
|
|
61
|
-
const { listContracts, hashContract } = contractStoreMod;
|
|
62
|
-
let dag;
|
|
63
|
-
try {
|
|
64
|
-
const raw = readFileSync(options.fromDag, 'utf8');
|
|
65
|
-
const parsed = JSON.parse(raw);
|
|
66
|
-
validateDag(parsed);
|
|
67
|
-
dag = parsed;
|
|
68
|
-
}
|
|
69
|
-
catch (err) {
|
|
70
|
-
printResult(io, fail('sub-agent.dispatch', 'INVALID_DAG', `failed to read or validate DAG from ${options.fromDag}: ${err.message}`, { role, toolCall: null, dispatchRecordPath: null }, [
|
|
71
|
-
'Check the JSON file at the given path; the DAG must have {nodes, edges} and pass validateDag().'
|
|
72
|
-
]), asJson);
|
|
73
|
-
process.exitCode = 1;
|
|
36
|
+
const scope = { role, asJson, io };
|
|
37
|
+
const ids = resolveDagIds(options);
|
|
38
|
+
const runtime = await loadDagRuntime();
|
|
39
|
+
const dag = readDagOrFail(runtime, options.fromDag, scope);
|
|
40
|
+
if (dag === null)
|
|
74
41
|
return;
|
|
75
|
-
|
|
76
|
-
// Slice 4.0.8 RD §4 D4c: each DAG node must map to an explicitly
|
|
77
|
-
// prepared workflow graph node before sub-agent dispatch. Reject
|
|
78
|
-
// unmapped nodes with PEAKS_GRAPH_NODE_REQUIRED. The mapping is
|
|
79
|
-
// carried via the `graphNode` annotation on each DAG node, OR — as
|
|
80
|
-
// a back-compat fallback for DAGs without the annotation — the
|
|
81
|
-
// DAG node id itself is treated as the graph node id. Either way,
|
|
82
|
-
// the graph node must be prepared (RD §3 D4c) before the dispatch
|
|
83
|
-
// CLI runs.
|
|
84
|
-
for (const node of dag.nodes) {
|
|
85
|
-
const graphNodeId = node.graphNode;
|
|
86
|
-
const candidate = typeof graphNodeId === 'string' && graphNodeId.length > 0 ? graphNodeId : node.id;
|
|
87
|
-
if (typeof candidate !== 'string' || candidate.length === 0) {
|
|
88
|
-
printResult(io, fail('sub-agent.dispatch', 'PEAKS_GRAPH_NODE_REQUIRED', `DAG node ${node.id} has no graph-node mapping (RD §4 D4c)`, { role, toolCall: null, dispatchRecordPath: null, dagNodeId: node.id }, [
|
|
89
|
-
'Annotate the DAG node with `graphNode: "<id>"` so each dispatch can bind a prepared graph node.'
|
|
90
|
-
]), asJson);
|
|
91
|
-
process.exitCode = 1;
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
// MVP (1.2): the orchestrator iterates topological levels + join
|
|
96
|
-
// barrier + cancel-on-fail end-to-end. The CLI's runner returns `done`
|
|
97
|
-
// for every leaf (so runDag's cancel-on-fail path is exercised when a
|
|
98
|
-
// leaf actually fails); the CLI envelope filters `emittedToolCalls` to
|
|
99
|
-
// the first level only (see `firstLevelIds`). The LLM-side runner
|
|
100
|
-
// re-invokes `--from-dag` for level 2+ after writing level-1
|
|
101
|
-
// contracts via `peaks contract write`.
|
|
102
|
-
let levelArr;
|
|
103
|
-
try {
|
|
104
|
-
levelArr = topologicalLevels(dag);
|
|
105
|
-
}
|
|
106
|
-
catch (err) {
|
|
107
|
-
printResult(io, fail('sub-agent.dispatch', 'INVALID_DAG', `topologicalLevels failed for ${options.fromDag}: ${err.message}`, { role, toolCall: null, dispatchRecordPath: null }, [
|
|
108
|
-
'The DAG passed validateDag() but topologicalLevels threw (likely a cycle that slipped past validateDag, or a runtime invariant).',
|
|
109
|
-
'Inspect the DAG file with the editor and re-invoke dispatch. (No peaks scan dag CLI ships in 2.7.0; if you need a programmatic DAG validator, import validateDag / topologicalLevels from src/services/dispatch/slice-dag.ts directly.)'
|
|
110
|
-
]), asJson);
|
|
111
|
-
process.exitCode = 1;
|
|
42
|
+
if (assertGraphNodesMapped(dag, scope) === null)
|
|
112
43
|
return;
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
44
|
+
const levelArr = topologicalLevelsOrFail(runtime, dag, options.fromDag, scope);
|
|
45
|
+
if (levelArr === null)
|
|
46
|
+
return;
|
|
47
|
+
const dispatched = resolveDagDispatcher(ids.projectRoot);
|
|
48
|
+
if (!dispatched.dispatcher.supportsRole(role)) {
|
|
49
|
+
emitDagFailure(io, asJson, {
|
|
50
|
+
role,
|
|
51
|
+
code: 'IDE_NOT_SUPPORTED',
|
|
52
|
+
message: `IDE ${dispatched.ide} does not support role "${role}"`,
|
|
53
|
+
nextActions: [
|
|
54
|
+
'Switch to a registered IDE (e.g. claude-code) or pick a role the current IDE supports.'
|
|
55
|
+
]
|
|
56
|
+
});
|
|
126
57
|
return;
|
|
127
58
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
59
|
+
await runLevels({ runtime, dag, levelArr, dispatched, ids, scope, fromDag: options.fromDag });
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Run every topological level through `runLayeredDag` and print the level-1
|
|
63
|
+
* envelope. Upstream contracts are read first so downstream-level prompts get
|
|
64
|
+
* auto-injected ancestors via `formatContractInjection` (empty at level-1 emit
|
|
65
|
+
* time, which is when the LLM re-invokes with fresh level-1 contracts).
|
|
66
|
+
*/
|
|
67
|
+
async function runLevels(run) {
|
|
68
|
+
const { runtime, dag, levelArr, dispatched, ids, scope, fromDag } = run;
|
|
69
|
+
const existingContracts = runtime.listContracts(ids.projectRoot, ids.sid);
|
|
136
70
|
const firstLevelIds = new Set(levelArr[0] ?? []);
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
const firstLevelWaves = firstLevelDescriptors.length > 0 && firstLevelDescriptors.every((d) => d.files.length > 0)
|
|
146
|
-
? planFileOverlapWaves(firstLevelDescriptors).waves
|
|
147
|
-
: null;
|
|
148
|
-
const emittedToolCalls = [];
|
|
149
|
-
const emittedSliceIds = [];
|
|
150
|
-
// CLI runner: emit the per-slice `buildToolCall` envelope, then return
|
|
151
|
-
// `done` with an empty `publicSurface` placeholder. The orchestrator
|
|
152
|
-
// treats the slice as "CLI-emitted, awaiting LLM-side execution" and
|
|
153
|
-
// advances to the next topological level (or breaks on failure). The
|
|
154
|
-
// placeholder surface is intentionally empty: the real public surface
|
|
155
|
-
// arrives later via `peaks contract write` from the LLM-side runner,
|
|
156
|
-
// and overwrites the CLI placeholder contract written by `noopWriter`.
|
|
157
|
-
// Why not `cancelled`? Returning `cancelled` here short-circuits
|
|
158
|
-
// runDag's join-barrier + cancel-on-fail path — the orchestrator
|
|
159
|
-
// breaks out after the first level with a cancellation, which hides
|
|
160
|
-
// the real cancel-on-fail semantics from the test suite (and from any
|
|
161
|
-
// future caller that wants to use `runDag` end-to-end from the CLI).
|
|
162
|
-
// Returning `done` exercises the full happy path; cancel-on-fail
|
|
163
|
-
// semantics will be covered when 1.3 lands real per-IDE await.
|
|
164
|
-
const cliRunner = async (spec) => {
|
|
165
|
-
const toolCall = dispatcher.buildToolCall({
|
|
166
|
-
role: spec.role,
|
|
167
|
-
prompt: spec.prompt,
|
|
168
|
-
requestId: rid,
|
|
169
|
-
sessionId: sid
|
|
170
|
-
});
|
|
171
|
-
if (firstLevelIds.has(spec.sliceId)) {
|
|
172
|
-
emittedToolCalls.push(toolCall);
|
|
173
|
-
emittedSliceIds.push(spec.sliceId);
|
|
174
|
-
}
|
|
175
|
-
return {
|
|
176
|
-
status: 'done',
|
|
177
|
-
publicSurface: {
|
|
178
|
-
exports: [],
|
|
179
|
-
types: [],
|
|
180
|
-
publicSignatures: []
|
|
181
|
-
}
|
|
182
|
-
};
|
|
183
|
-
};
|
|
184
|
-
// CLI noop writer — the orchestrator collects a `SliceContract` per
|
|
185
|
-
// emitted toolCall so downstream re-invocations (level 2+) can splice
|
|
186
|
-
// ancestor contracts via `formatContractInjection`. We don't write to
|
|
187
|
-
// disk here (the LLM-side runner does that via `peaks contract write`
|
|
188
|
-
// after each toolCall resolves), but the returned placeholder MUST be
|
|
189
|
-
// shape-valid: the `contractHash` field has to be a real SHA-256 hex
|
|
190
|
-
// string so formatContractInjection + downstream validators don't
|
|
191
|
-
// reject the placeholder. The placeholder hash is computed from the
|
|
192
|
-
// slice identity only (`sliceId|sessionId`) — it's deterministic,
|
|
193
|
-
// stable, and collision-free for the MVP run, but obviously does NOT
|
|
194
|
-
// represent the slice's actual public surface. The LLM-side runner's
|
|
195
|
-
// `peaks contract write` call will overwrite this with a content-based
|
|
196
|
-
// hash once the slice finishes.
|
|
197
|
-
const noopWriter = (sliceId, _publicSurface) => {
|
|
198
|
-
const partial = {
|
|
199
|
-
sliceId,
|
|
200
|
-
sessionId: sid,
|
|
201
|
-
exports: [],
|
|
202
|
-
types: [],
|
|
203
|
-
publicSignatures: []
|
|
204
|
-
};
|
|
205
|
-
return {
|
|
206
|
-
sliceId,
|
|
207
|
-
sessionId: sid,
|
|
208
|
-
completedAt: new Date(0).toISOString(), // epoch sentinel = "placeholder, not yet finished"
|
|
209
|
-
exports: [],
|
|
210
|
-
types: [],
|
|
211
|
-
publicSignatures: [],
|
|
212
|
-
contractHash: hashContract(partial)
|
|
213
|
-
};
|
|
214
|
-
};
|
|
215
|
-
// runLayeredDag IS in the path: validates the DAG, iterates all
|
|
216
|
-
// topological levels (foundation/upstreamSync slices prioritized within
|
|
217
|
-
// each level by `topologicalLevels`), runs the join barrier after
|
|
218
|
-
// each level, and triggers cancel-on-fail rollback if any leaf
|
|
219
|
-
// returns `failed` (or `cancelled`, once 1.3 lands). The CLI
|
|
220
|
-
// envelope below filters `emittedToolCalls` / `emittedSliceIds` to
|
|
221
|
-
// the first level — see the `firstLevelIds` filter inside `cliRunner`.
|
|
71
|
+
const emissions = { toolCalls: [], sliceIds: [] };
|
|
72
|
+
const runSlice = makeCliRunner({
|
|
73
|
+
firstLevelIds,
|
|
74
|
+
dispatcher: dispatched.dispatcher,
|
|
75
|
+
ids,
|
|
76
|
+
emissions
|
|
77
|
+
});
|
|
78
|
+
const writeContractFn = makeNoopWriter(runtime.hashContract, ids.sid);
|
|
222
79
|
try {
|
|
223
|
-
await runLayeredDag(dag, {
|
|
224
|
-
projectRoot,
|
|
225
|
-
sessionId: sid,
|
|
80
|
+
await runtime.runLayeredDag(dag, {
|
|
81
|
+
projectRoot: ids.projectRoot,
|
|
82
|
+
sessionId: ids.sid,
|
|
226
83
|
existingContracts,
|
|
227
|
-
runSlice
|
|
228
|
-
writeContractFn
|
|
84
|
+
runSlice,
|
|
85
|
+
writeContractFn
|
|
229
86
|
});
|
|
230
87
|
}
|
|
231
88
|
catch (err) {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
89
|
+
emitDagFailure(scope.io, scope.asJson, {
|
|
90
|
+
role: scope.role,
|
|
91
|
+
code: 'INVALID_DAG',
|
|
92
|
+
message: `runLayeredDag failed for ${fromDag}: ${err.message}`,
|
|
93
|
+
nextActions: [
|
|
94
|
+
'runLayeredDag threw DagPlanError; the DAG passed validateDag() but failed at topologicalLevels or contractStore dispatch.',
|
|
95
|
+
'Inspect the DAG file and re-run.'
|
|
96
|
+
]
|
|
97
|
+
});
|
|
241
98
|
return;
|
|
242
99
|
}
|
|
243
|
-
printResult(io,
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
batchId,
|
|
249
|
-
dispatchCount: emittedSliceIds.length,
|
|
100
|
+
printResult(scope.io, buildDagSuccessEnvelope({
|
|
101
|
+
role: scope.role,
|
|
102
|
+
ide: dispatched.dispatcher.label,
|
|
103
|
+
fromDag,
|
|
104
|
+
batchId: ids.batchId,
|
|
250
105
|
levelsTotal: levelArr.length,
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
firstLevelWaves,
|
|
255
|
-
toolCalls: emittedToolCalls,
|
|
106
|
+
emittedSliceIds: emissions.sliceIds,
|
|
107
|
+
emittedToolCalls: emissions.toolCalls,
|
|
108
|
+
firstLevelWaves: planFirstLevelWaves(dag, levelArr),
|
|
256
109
|
existingContractCount: existingContracts.length,
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
// v2.15.0 follow-up — G12/G11/G2: per-slice metadata (foundation /
|
|
261
|
-
// upstreamSync / complexity) for downstream scheduling decisions.
|
|
262
|
-
sliceMeta: emittedSliceIds.map((id) => {
|
|
263
|
-
const node = dag.nodes.find((n) => n.id === id);
|
|
264
|
-
return {
|
|
265
|
-
id,
|
|
266
|
-
foundation: node?.foundation === true,
|
|
267
|
-
upstreamSync: node?.upstreamSync === true,
|
|
268
|
-
complexity: node?.complexity !== undefined && isSliceComplexity(node.complexity)
|
|
269
|
-
? node.complexity
|
|
270
|
-
: null
|
|
271
|
-
};
|
|
272
|
-
}),
|
|
273
|
-
nextActions: [
|
|
274
|
-
'Execute each toolCall in your IDE; on completion, write the slice contract to .peaks/_runtime/<sid>/dispatch/contracts/<slice-id>.json.',
|
|
275
|
-
'Re-invoke `peaks sub-agent dispatch --from-dag <file>` with the same batch-id to advance to the next level once all current-level slices have written contracts.'
|
|
276
|
-
]
|
|
277
|
-
}, [], [
|
|
278
|
-
'MVP (1.2) plans the first level via runLayeredDag orchestrator (cancel-on-fail path active); the LLM drives subsequent levels by re-invoking this command after contract writes.',
|
|
279
|
-
existingContracts.length > 0
|
|
280
|
-
? `Injected ${existingContracts.length} upstream contract(s) into downstream-level prompts via formatContractInjection.`
|
|
281
|
-
: 'No upstream contracts found; first-level prompts have empty ancestor blocks.'
|
|
282
|
-
]), asJson);
|
|
110
|
+
dag,
|
|
111
|
+
isSliceComplexity: runtime.isSliceComplexity
|
|
112
|
+
}), scope.asJson);
|
|
283
113
|
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { FinalReviewOutput } from '../../services/final-review/final-review-types.js';
|
|
2
|
+
import { type ProgramIO } from '../cli-helpers.js';
|
|
3
|
+
/** The two inputs a refusal envelope names, plus why it was refused. */
|
|
4
|
+
export type PrepareRefusal = {
|
|
5
|
+
readonly rid: string;
|
|
6
|
+
readonly code: string;
|
|
7
|
+
readonly message: string;
|
|
8
|
+
readonly sessionId: string;
|
|
9
|
+
readonly auditGoalPath: string;
|
|
10
|
+
readonly nextActions: string[];
|
|
11
|
+
};
|
|
12
|
+
/** Print one refusal envelope and mark the process failed. */
|
|
13
|
+
export declare function emitPrepareFailure(io: ProgramIO, json: boolean | undefined, refusal: PrepareRefusal, missingEnv?: readonly string[]): void;
|
|
14
|
+
/** Where a resolved run reads its audit goal from. */
|
|
15
|
+
export type PrepareGoalPath = {
|
|
16
|
+
readonly sessionId: string;
|
|
17
|
+
readonly auditGoalPath: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Stub path: surface a structured "scaffold ready" envelope.
|
|
21
|
+
*
|
|
22
|
+
* The service is NOT called here — the stub runner answers the audit-goal
|
|
23
|
+
* shape, not the 4-dim review shape, so running it through
|
|
24
|
+
* `prepareFinalReview()` would only manufacture a malformed review. The
|
|
25
|
+
* envelope confirms the route is wired end-to-end and reports the audit-goal
|
|
26
|
+
* path the service WOULD read.
|
|
27
|
+
*/
|
|
28
|
+
export declare function emitStubEnvelope(io: ProgramIO, rid: string, goal: PrepareGoalPath, json: boolean | undefined): void;
|
|
29
|
+
/** The success envelope of a real-provider run. */
|
|
30
|
+
export declare function emitReviewEnvelope(io: ProgramIO, result: {
|
|
31
|
+
readonly rid: string;
|
|
32
|
+
readonly goal: PrepareGoalPath;
|
|
33
|
+
readonly model: string;
|
|
34
|
+
readonly review: FinalReviewOutput;
|
|
35
|
+
readonly json: boolean | undefined;
|
|
36
|
+
}): void;
|
|
37
|
+
/**
|
|
38
|
+
* Map a thrown error to the CLI's error code. The LLM-layer errors already
|
|
39
|
+
* carry codes precise enough to act on (`LLM_CREDENTIAL_MISSING`,
|
|
40
|
+
* `LLM_REQUEST_FAILED`, …), so they are passed through rather than flattened
|
|
41
|
+
* into one opaque failure.
|
|
42
|
+
*/
|
|
43
|
+
export declare function finalReviewErrorCode(error: unknown): string;
|
|
44
|
+
export declare function finalReviewNextActions(code: string): string[];
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// src/cli/commands/final-review-command-envelopes.ts
|
|
2
|
+
//
|
|
3
|
+
// Every envelope `peaks prepare-final-review` can print, and the error-code
|
|
4
|
+
// mapping behind the failure one. Split out of `final-review-commands.ts`; the
|
|
5
|
+
// codes, messages, data fields and next-action strings are unchanged.
|
|
6
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
7
|
+
import { IncompleteFinalReviewError } from '../../services/final-review/final-review-service.js';
|
|
8
|
+
import { LlmBindingError, LlmRequestError } from '../../services/llm/anthropic-runner.js';
|
|
9
|
+
import { printResult } from '../cli-helpers.js';
|
|
10
|
+
import { emptyFinalReviewData } from './final-review-command-shared.js';
|
|
11
|
+
/** Print one refusal envelope and mark the process failed. */
|
|
12
|
+
export function emitPrepareFailure(io, json, refusal, missingEnv) {
|
|
13
|
+
printResult(io, fail('final-review.prepare', refusal.code, refusal.message, emptyFinalReviewData(refusal.rid, refusal.sessionId, refusal.auditGoalPath, missingEnv), refusal.nextActions), json ?? false);
|
|
14
|
+
process.exitCode = 1;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Stub path: surface a structured "scaffold ready" envelope.
|
|
18
|
+
*
|
|
19
|
+
* The service is NOT called here — the stub runner answers the audit-goal
|
|
20
|
+
* shape, not the 4-dim review shape, so running it through
|
|
21
|
+
* `prepareFinalReview()` would only manufacture a malformed review. The
|
|
22
|
+
* envelope confirms the route is wired end-to-end and reports the audit-goal
|
|
23
|
+
* path the service WOULD read.
|
|
24
|
+
*/
|
|
25
|
+
export function emitStubEnvelope(io, rid, goal, json) {
|
|
26
|
+
const data = {
|
|
27
|
+
status: 'scaffold-only',
|
|
28
|
+
rid,
|
|
29
|
+
sessionId: goal.sessionId,
|
|
30
|
+
auditGoalPath: goal.auditGoalPath,
|
|
31
|
+
serviceWired: true,
|
|
32
|
+
providerBinding: 'stub'
|
|
33
|
+
};
|
|
34
|
+
const envelope = ok('final-review.prepare', data, [], [
|
|
35
|
+
'Stub provider: no 4-dim review was performed. This envelope only proves the route is wired and reachable.',
|
|
36
|
+
`Audit-goal file is present at: ${goal.auditGoalPath}`,
|
|
37
|
+
'Re-run with `--llm-provider anthropic` to produce a real review.'
|
|
38
|
+
]);
|
|
39
|
+
printResult(io, envelope, json ?? false);
|
|
40
|
+
}
|
|
41
|
+
/** The success envelope of a real-provider run. */
|
|
42
|
+
export function emitReviewEnvelope(io, result) {
|
|
43
|
+
const { rid, goal, model, review, json } = result;
|
|
44
|
+
const data = {
|
|
45
|
+
status: 'review-complete',
|
|
46
|
+
rid,
|
|
47
|
+
sessionId: goal.sessionId,
|
|
48
|
+
auditGoalPath: goal.auditGoalPath,
|
|
49
|
+
serviceWired: true,
|
|
50
|
+
providerBinding: 'anthropic-messages-api',
|
|
51
|
+
model,
|
|
52
|
+
review
|
|
53
|
+
};
|
|
54
|
+
const envelope = ok('final-review.prepare', data, review.allPass
|
|
55
|
+
? []
|
|
56
|
+
: [
|
|
57
|
+
`Dimensions needing human attention: ${review.needsAttention.join(', ') || 'none flagged'}.`
|
|
58
|
+
], [
|
|
59
|
+
`4-dim review produced by anthropic-messages-api (model: ${model}).`,
|
|
60
|
+
`allPass: ${String(review.allPass)}.`
|
|
61
|
+
]);
|
|
62
|
+
printResult(io, envelope, json ?? false);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Map a thrown error to the CLI's error code. The LLM-layer errors already
|
|
66
|
+
* carry codes precise enough to act on (`LLM_CREDENTIAL_MISSING`,
|
|
67
|
+
* `LLM_REQUEST_FAILED`, …), so they are passed through rather than flattened
|
|
68
|
+
* into one opaque failure.
|
|
69
|
+
*/
|
|
70
|
+
export function finalReviewErrorCode(error) {
|
|
71
|
+
if (error instanceof LlmBindingError ||
|
|
72
|
+
error instanceof LlmRequestError ||
|
|
73
|
+
error instanceof IncompleteFinalReviewError) {
|
|
74
|
+
return error.code;
|
|
75
|
+
}
|
|
76
|
+
return 'FINAL_REVIEW_FAILED';
|
|
77
|
+
}
|
|
78
|
+
export function finalReviewNextActions(code) {
|
|
79
|
+
switch (code) {
|
|
80
|
+
case 'LLM_CREDENTIAL_MISSING':
|
|
81
|
+
return [
|
|
82
|
+
'Export ANTHROPIC_AUTH_TOKEN (or ANTHROPIC_API_KEY) in the environment that launches peaks, then re-run.',
|
|
83
|
+
'For an offline scaffold instead of a review, re-run with `--llm-provider stub` — it performs NO review.'
|
|
84
|
+
];
|
|
85
|
+
case 'LLM_MODEL_MISSING':
|
|
86
|
+
return [
|
|
87
|
+
'Export ANTHROPIC_MODEL (or CLAUDE_CODE_SUBAGENT_MODEL) in the environment that launches peaks, then re-run.'
|
|
88
|
+
];
|
|
89
|
+
case 'LLM_REQUEST_FAILED':
|
|
90
|
+
return [
|
|
91
|
+
'Check ANTHROPIC_BASE_URL and network reachability, then re-run — a transport failure produces no review.'
|
|
92
|
+
];
|
|
93
|
+
case 'INCOMPLETE_FINAL_REVIEW':
|
|
94
|
+
return [
|
|
95
|
+
'The LLM reply was not valid JSON or omitted a required dimension; re-run so the gate is never read as complete.'
|
|
96
|
+
];
|
|
97
|
+
default:
|
|
98
|
+
return ['Re-run with `--llm-provider stub` to validate the CLI route without a real LLM.'];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { FinalReviewOutput } from '../../services/final-review/final-review-types.js';
|
|
2
|
+
/** Whitelist of supported `--llm-provider` values for `peaks prepare-final-review`. */
|
|
3
|
+
export declare const SUPPORTED_LLM_PROVIDERS: readonly ["anthropic", "stub"];
|
|
4
|
+
export type SupportedLlmProvider = (typeof SUPPORTED_LLM_PROVIDERS)[number];
|
|
5
|
+
/**
|
|
6
|
+
* Default stays `stub` (unlike `peaks audit goal`, whose default is the real
|
|
7
|
+
* provider): the scaffold route is what CI and the registered e2e contract
|
|
8
|
+
* exercise without credentials, and the stub envelope is labelled
|
|
9
|
+
* `status: 'scaffold-only'` / `providerBinding: 'stub'` so it can never be
|
|
10
|
+
* read as a review.
|
|
11
|
+
*/
|
|
12
|
+
export declare const DEFAULT_LLM_PROVIDER: SupportedLlmProvider;
|
|
13
|
+
export declare function isSupportedLlmProvider(value: string): value is SupportedLlmProvider;
|
|
14
|
+
export type FinalReviewStatus = 'scaffold-only' | 'review-complete' | 'not-applicable';
|
|
15
|
+
/**
|
|
16
|
+
* Which LLM produced this envelope. `unknown` is reserved for failure
|
|
17
|
+
* envelopes, where no binding was ever established.
|
|
18
|
+
*/
|
|
19
|
+
export type FinalReviewProviderBinding = 'stub' | 'anthropic-messages-api' | 'unknown';
|
|
20
|
+
export interface FinalReviewData {
|
|
21
|
+
readonly status: FinalReviewStatus;
|
|
22
|
+
readonly rid: string;
|
|
23
|
+
readonly sessionId: string;
|
|
24
|
+
readonly auditGoalPath: string;
|
|
25
|
+
readonly serviceWired: boolean;
|
|
26
|
+
readonly providerBinding: FinalReviewProviderBinding;
|
|
27
|
+
/** Model id the bound provider answered with (real-provider runs only). */
|
|
28
|
+
readonly model?: string;
|
|
29
|
+
/** The 4-dim review the service produced (real-provider runs only). */
|
|
30
|
+
readonly review?: FinalReviewOutput;
|
|
31
|
+
/**
|
|
32
|
+
* Environment variables that were absent when binding failed. Surfaced on
|
|
33
|
+
* `data` because `fail()` redacts `message` through
|
|
34
|
+
* `redactSensitiveErrorMessage`, whose catch-all pattern matches the words
|
|
35
|
+
* `token` / `api_key` and would blank out the very names an operator needs.
|
|
36
|
+
*/
|
|
37
|
+
readonly missingEnv?: readonly string[];
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Empty placeholder used by `fail()` envelopes. `status` is
|
|
41
|
+
* `'not-applicable'` on the error path so consumers can tell
|
|
42
|
+
* "this is a placeholder on a failure" apart from "this is a real
|
|
43
|
+
* scaffold-only success".
|
|
44
|
+
*/
|
|
45
|
+
export declare function emptyFinalReviewData(rid: string, sessionId: string, auditGoalPath: string, missingEnv?: readonly string[]): FinalReviewData;
|
|
46
|
+
export type PrepareFinalReviewOptions = {
|
|
47
|
+
project: string;
|
|
48
|
+
sessionId: string;
|
|
49
|
+
llmProvider?: string;
|
|
50
|
+
base?: string;
|
|
51
|
+
json?: boolean;
|
|
52
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// src/cli/commands/final-review-command-shared.ts
|
|
2
|
+
//
|
|
3
|
+
// What `peaks prepare-final-review` reports: the envelope's data shape, its
|
|
4
|
+
// provider vocabulary, and the placeholder a failure carries. Split out of
|
|
5
|
+
// `final-review-commands.ts`; every value and every field name is unchanged.
|
|
6
|
+
/** Whitelist of supported `--llm-provider` values for `peaks prepare-final-review`. */
|
|
7
|
+
export const SUPPORTED_LLM_PROVIDERS = ['anthropic', 'stub'];
|
|
8
|
+
/**
|
|
9
|
+
* Default stays `stub` (unlike `peaks audit goal`, whose default is the real
|
|
10
|
+
* provider): the scaffold route is what CI and the registered e2e contract
|
|
11
|
+
* exercise without credentials, and the stub envelope is labelled
|
|
12
|
+
* `status: 'scaffold-only'` / `providerBinding: 'stub'` so it can never be
|
|
13
|
+
* read as a review.
|
|
14
|
+
*/
|
|
15
|
+
export const DEFAULT_LLM_PROVIDER = 'stub';
|
|
16
|
+
export function isSupportedLlmProvider(value) {
|
|
17
|
+
return SUPPORTED_LLM_PROVIDERS.includes(value);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Empty placeholder used by `fail()` envelopes. `status` is
|
|
21
|
+
* `'not-applicable'` on the error path so consumers can tell
|
|
22
|
+
* "this is a placeholder on a failure" apart from "this is a real
|
|
23
|
+
* scaffold-only success".
|
|
24
|
+
*/
|
|
25
|
+
export function emptyFinalReviewData(rid, sessionId, auditGoalPath, missingEnv) {
|
|
26
|
+
return {
|
|
27
|
+
status: 'not-applicable',
|
|
28
|
+
rid,
|
|
29
|
+
sessionId,
|
|
30
|
+
auditGoalPath,
|
|
31
|
+
serviceWired: false,
|
|
32
|
+
providerBinding: 'unknown',
|
|
33
|
+
...(missingEnv === undefined ? {} : { missingEnv })
|
|
34
|
+
};
|
|
35
|
+
}
|