peaks-loop 4.1.3 → 4.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +56 -0
- package/README-en.md +1 -1
- package/README.md +1 -1
- package/dist/cli/commands/asset-command-shared.d.ts +12 -0
- package/dist/cli/commands/asset-command-shared.js +45 -0
- package/dist/cli/commands/asset-commands.d.ts +6 -1
- package/dist/cli/commands/asset-commands.js +11 -372
- package/dist/cli/commands/asset-crystallize-command.d.ts +3 -0
- package/dist/cli/commands/asset-crystallize-command.js +60 -0
- package/dist/cli/commands/asset-crystallize-payload.d.ts +47 -0
- package/dist/cli/commands/asset-crystallize-payload.js +85 -0
- package/dist/cli/commands/asset-crystallize-runner.d.ts +3 -0
- package/dist/cli/commands/asset-crystallize-runner.js +133 -0
- package/dist/cli/commands/asset-dispose-command.d.ts +3 -0
- package/dist/cli/commands/asset-dispose-command.js +99 -0
- package/dist/cli/commands/asset-status-command.d.ts +3 -0
- package/dist/cli/commands/asset-status-command.js +100 -0
- package/dist/cli/commands/baseline-audit-command.d.ts +3 -0
- package/dist/cli/commands/baseline-audit-command.js +64 -0
- package/dist/cli/commands/baseline-command-shared.d.ts +23 -0
- package/dist/cli/commands/baseline-command-shared.js +39 -0
- package/dist/cli/commands/baseline-commands.js +33 -313
- package/dist/cli/commands/baseline-freeze-commands.d.ts +4 -0
- package/dist/cli/commands/baseline-freeze-commands.js +81 -0
- package/dist/cli/commands/baseline-guard-command.d.ts +3 -0
- package/dist/cli/commands/baseline-guard-command.js +52 -0
- package/dist/cli/commands/baseline-read-commands.d.ts +5 -0
- package/dist/cli/commands/baseline-read-commands.js +72 -0
- package/dist/cli/commands/baseline-rollback-commands.d.ts +4 -0
- package/dist/cli/commands/baseline-rollback-commands.js +88 -0
- package/dist/cli/commands/classify-downgrade-command.d.ts +9 -0
- package/dist/cli/commands/classify-downgrade-command.js +21 -0
- package/dist/cli/commands/classify-run-command.d.ts +9 -0
- package/dist/cli/commands/classify-run-command.js +73 -0
- package/dist/cli/commands/classify-signals.d.ts +5 -0
- package/dist/cli/commands/classify-signals.js +104 -0
- package/dist/cli/commands/code-emit-handoff-command.js +40 -3
- package/dist/cli/commands/code-gate-step-08-command.js +25 -9
- package/dist/cli/commands/codegraph-command-options.d.ts +22 -0
- package/dist/cli/commands/codegraph-command-options.js +22 -0
- package/dist/cli/commands/codegraph-commands.d.ts +2 -2
- package/dist/cli/commands/codegraph-commands.js +14 -397
- package/dist/cli/commands/codegraph-config-restore-command.d.ts +3 -0
- package/dist/cli/commands/codegraph-config-restore-command.js +200 -0
- package/dist/cli/commands/codegraph-proxy-commands.d.ts +10 -0
- package/dist/cli/commands/codegraph-proxy-commands.js +159 -0
- package/dist/cli/commands/codegraph-repair-commands.d.ts +3 -0
- package/dist/cli/commands/codegraph-repair-commands.js +94 -0
- package/dist/cli/commands/codegraph-status-command.d.ts +1 -1
- package/dist/cli/commands/codegraph-status-command.js +27 -214
- package/dist/cli/commands/codegraph-status-integrity.d.ts +44 -0
- package/dist/cli/commands/codegraph-status-integrity.js +121 -0
- package/dist/cli/commands/codegraph-status-json.d.ts +5 -0
- package/dist/cli/commands/codegraph-status-json.js +127 -0
- package/dist/cli/commands/container-command-shared.d.ts +60 -0
- package/dist/cli/commands/container-command-shared.js +52 -0
- package/dist/cli/commands/container-commands.d.ts +1 -1
- package/dist/cli/commands/container-commands.js +4 -216
- package/dist/cli/commands/container-release-command.d.ts +3 -0
- package/dist/cli/commands/container-release-command.js +105 -0
- package/dist/cli/commands/container-spawn-command.d.ts +3 -0
- package/dist/cli/commands/container-spawn-command.js +148 -0
- package/dist/cli/commands/context-check-command.d.ts +3 -0
- package/dist/cli/commands/context-check-command.js +81 -0
- package/dist/cli/commands/context-commands.d.ts +2 -7
- package/dist/cli/commands/context-commands.js +6 -276
- package/dist/cli/commands/context-layer-command.d.ts +3 -0
- package/dist/cli/commands/context-layer-command.js +34 -0
- package/dist/cli/commands/context-layer-fetchers.d.ts +15 -0
- package/dist/cli/commands/context-layer-fetchers.js +162 -0
- package/dist/cli/commands/context-status-command.d.ts +17 -0
- package/dist/cli/commands/context-status-command.js +41 -0
- package/dist/cli/commands/contract-write-command.d.ts +3 -0
- package/dist/cli/commands/contract-write-command.js +144 -0
- package/dist/cli/commands/core/doctor-bindings.d.ts +17 -0
- package/dist/cli/commands/core/doctor-bindings.js +30 -0
- package/dist/cli/commands/core/doctor-command.d.ts +4 -18
- package/dist/cli/commands/core/doctor-command.js +2 -323
- package/dist/cli/commands/core/doctor-logs.d.ts +8 -0
- package/dist/cli/commands/core/doctor-logs.js +32 -0
- package/dist/cli/commands/core/doctor-probes.d.ts +3 -0
- package/dist/cli/commands/core/doctor-probes.js +55 -0
- package/dist/cli/commands/core/doctor-run-command.d.ts +12 -0
- package/dist/cli/commands/core/doctor-run-command.js +172 -0
- package/dist/cli/commands/core/doctor-summary.d.ts +7 -0
- package/dist/cli/commands/core/doctor-summary.js +39 -0
- package/dist/cli/commands/core/memory-command-shared.d.ts +25 -0
- package/dist/cli/commands/core/memory-command-shared.js +20 -0
- package/dist/cli/commands/core/memory-command.d.ts +1 -1
- package/dist/cli/commands/core/memory-command.js +6 -227
- package/dist/cli/commands/core/memory-delegated-verbs.d.ts +4 -0
- package/dist/cli/commands/core/memory-delegated-verbs.js +178 -0
- package/dist/cli/commands/core/memory-extract-command.d.ts +3 -0
- package/dist/cli/commands/core/memory-extract-command.js +90 -0
- package/dist/cli/commands/core/memory-sync-command.d.ts +3 -0
- package/dist/cli/commands/core/memory-sync-command.js +38 -0
- package/dist/cli/commands/core/session-command.d.ts +1 -1
- package/dist/cli/commands/core/session-command.js +12 -206
- package/dist/cli/commands/core/session-info-command.d.ts +3 -0
- package/dist/cli/commands/core/session-info-command.js +142 -0
- package/dist/cli/commands/core/session-verb-commands.d.ts +5 -0
- package/dist/cli/commands/core/session-verb-commands.js +58 -0
- package/dist/cli/commands/core/standards-command.d.ts +1 -24
- package/dist/cli/commands/core/standards-command.js +33 -201
- package/dist/cli/commands/core/standards-init-command.d.ts +3 -0
- package/dist/cli/commands/core/standards-init-command.js +87 -0
- package/dist/cli/commands/core/standards-lint.d.ts +24 -0
- package/dist/cli/commands/core/standards-lint.js +57 -0
- package/dist/cli/commands/core/standards-migrate-command.d.ts +3 -0
- package/dist/cli/commands/core/standards-migrate-command.js +57 -0
- package/dist/cli/commands/cron-scheduler-commands.d.ts +5 -1
- package/dist/cli/commands/cron-scheduler-commands.js +36 -206
- package/dist/cli/commands/cron-scheduler-run-once-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-run-once-command.js +35 -0
- package/dist/cli/commands/cron-scheduler-shared.d.ts +6 -0
- package/dist/cli/commands/cron-scheduler-shared.js +48 -0
- package/dist/cli/commands/cron-scheduler-start-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-start-command.js +65 -0
- package/dist/cli/commands/cron-scheduler-status-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-status-command.js +46 -0
- package/dist/cli/commands/cron-scheduler-stop-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-stop-command.js +61 -0
- package/dist/cli/commands/dispatch-dag-envelope.d.ts +41 -0
- package/dist/cli/commands/dispatch-dag-envelope.js +49 -0
- package/dist/cli/commands/dispatch-dag-failure.d.ts +18 -0
- package/dist/cli/commands/dispatch-dag-failure.js +16 -0
- package/dist/cli/commands/dispatch-dag-preflight.d.ts +51 -0
- package/dist/cli/commands/dispatch-dag-preflight.js +105 -0
- package/dist/cli/commands/dispatch-dag-runners.d.ts +48 -0
- package/dist/cli/commands/dispatch-dag-runners.js +73 -0
- package/dist/cli/commands/dispatch-from-dag.d.ts +27 -0
- package/dist/cli/commands/dispatch-from-dag.js +87 -257
- package/dist/cli/commands/final-review-command-envelopes.d.ts +44 -0
- package/dist/cli/commands/final-review-command-envelopes.js +100 -0
- package/dist/cli/commands/final-review-command-shared.d.ts +52 -0
- package/dist/cli/commands/final-review-command-shared.js +35 -0
- package/dist/cli/commands/final-review-commands.d.ts +7 -27
- package/dist/cli/commands/final-review-commands.js +13 -240
- package/dist/cli/commands/final-review-prepare-command.d.ts +3 -0
- package/dist/cli/commands/final-review-prepare-command.js +200 -0
- package/dist/cli/commands/governance-classify-contract-commands.d.ts +23 -9
- package/dist/cli/commands/governance-classify-contract-commands.js +26 -269
- package/dist/cli/commands/hooks-command-shared.d.ts +42 -0
- package/dist/cli/commands/hooks-command-shared.js +32 -0
- package/dist/cli/commands/hooks-commands.d.ts +20 -0
- package/dist/cli/commands/hooks-commands.js +75 -309
- package/dist/cli/commands/hooks-install-envelopes.d.ts +6 -0
- package/dist/cli/commands/hooks-install-envelopes.js +144 -0
- package/dist/cli/commands/hooks-status-command.d.ts +3 -0
- package/dist/cli/commands/hooks-status-command.js +93 -0
- package/dist/cli/commands/hooks-uninstall-command.d.ts +3 -0
- package/dist/cli/commands/hooks-uninstall-command.js +43 -0
- package/dist/cli/commands/loop-command-shared.d.ts +31 -0
- package/dist/cli/commands/loop-command-shared.js +15 -0
- package/dist/cli/commands/loop-commands.d.ts +12 -17
- package/dist/cli/commands/loop-commands.js +56 -238
- package/dist/cli/commands/loop-export-command.d.ts +3 -0
- package/dist/cli/commands/loop-export-command.js +73 -0
- package/dist/cli/commands/loop-goal-compose-command.d.ts +3 -0
- package/dist/cli/commands/loop-goal-compose-command.js +36 -0
- package/dist/cli/commands/loop-import-command.d.ts +3 -0
- package/dist/cli/commands/loop-import-command.js +86 -0
- package/dist/cli/commands/loop-placeholder-commands.d.ts +3 -0
- package/dist/cli/commands/loop-placeholder-commands.js +52 -0
- package/dist/cli/commands/memory-command-shared.d.ts +59 -0
- package/dist/cli/commands/memory-command-shared.js +39 -0
- package/dist/cli/commands/memory-commands.d.ts +6 -79
- package/dist/cli/commands/memory-commands.js +19 -309
- package/dist/cli/commands/memory-ingest-command.d.ts +3 -0
- package/dist/cli/commands/memory-ingest-command.js +50 -0
- package/dist/cli/commands/memory-list-command.d.ts +16 -0
- package/dist/cli/commands/memory-list-command.js +129 -0
- package/dist/cli/commands/memory-reindex-command.d.ts +9 -0
- package/dist/cli/commands/memory-reindex-command.js +78 -0
- package/dist/cli/commands/memory-rotate-command.d.ts +3 -0
- package/dist/cli/commands/memory-rotate-command.js +55 -0
- package/dist/cli/commands/memory-search-command.d.ts +7 -0
- package/dist/cli/commands/memory-search-command.js +46 -0
- package/dist/cli/commands/openspec-archive-command.d.ts +3 -0
- package/dist/cli/commands/openspec-archive-command.js +55 -0
- package/dist/cli/commands/openspec-command-shared.d.ts +62 -0
- package/dist/cli/commands/openspec-command-shared.js +135 -0
- package/dist/cli/commands/openspec-commands.d.ts +1 -1
- package/dist/cli/commands/openspec-commands.js +33 -306
- package/dist/cli/commands/openspec-from-doctor-command.d.ts +3 -0
- package/dist/cli/commands/openspec-from-doctor-command.js +66 -0
- package/dist/cli/commands/openspec-init-command.d.ts +3 -0
- package/dist/cli/commands/openspec-init-command.js +49 -0
- package/dist/cli/commands/openspec-list-command.d.ts +3 -0
- package/dist/cli/commands/openspec-list-command.js +27 -0
- package/dist/cli/commands/openspec-render-command.d.ts +3 -0
- package/dist/cli/commands/openspec-render-command.js +33 -0
- package/dist/cli/commands/openspec-show-command.d.ts +3 -0
- package/dist/cli/commands/openspec-show-command.js +33 -0
- package/dist/cli/commands/openspec-to-rd-command.d.ts +3 -0
- package/dist/cli/commands/openspec-to-rd-command.js +33 -0
- package/dist/cli/commands/openspec-validate-command.d.ts +3 -0
- package/dist/cli/commands/openspec-validate-command.js +45 -0
- package/dist/cli/commands/playwright-browser-command.d.ts +8 -0
- package/dist/cli/commands/playwright-browser-command.js +61 -0
- package/dist/cli/commands/playwright-commands.d.ts +10 -62
- package/dist/cli/commands/playwright-commands.js +77 -400
- package/dist/cli/commands/playwright-envelope.d.ts +8 -0
- package/dist/cli/commands/playwright-envelope.js +29 -0
- package/dist/cli/commands/playwright-ls-stop-commands.d.ts +4 -0
- package/dist/cli/commands/playwright-ls-stop-commands.js +74 -0
- package/dist/cli/commands/playwright-session-store.d.ts +65 -0
- package/dist/cli/commands/playwright-session-store.js +189 -0
- package/dist/cli/commands/project-commands.d.ts +19 -0
- package/dist/cli/commands/project-commands.js +98 -259
- package/dist/cli/commands/project-context-command.d.ts +3 -0
- package/dist/cli/commands/project-context-command.js +44 -0
- package/dist/cli/commands/project-dashboard-command.d.ts +3 -0
- package/dist/cli/commands/project-dashboard-command.js +74 -0
- package/dist/cli/commands/project-knowledge-command.d.ts +3 -0
- package/dist/cli/commands/project-knowledge-command.js +48 -0
- package/dist/cli/commands/project-memories-show-command.d.ts +3 -0
- package/dist/cli/commands/project-memories-show-command.js +87 -0
- package/dist/cli/commands/project-memory-index-command.d.ts +3 -0
- package/dist/cli/commands/project-memory-index-command.js +31 -0
- package/dist/cli/commands/qa-archive-screenshots-command.d.ts +3 -0
- package/dist/cli/commands/qa-archive-screenshots-command.js +53 -0
- package/dist/cli/commands/qa-commands.d.ts +14 -87
- package/dist/cli/commands/qa-commands.js +17 -315
- package/dist/cli/commands/qa-context-prestep.d.ts +1 -0
- package/dist/cli/commands/qa-context-prestep.js +34 -0
- package/dist/cli/commands/qa-run-command.d.ts +3 -0
- package/dist/cli/commands/qa-run-command.js +105 -0
- package/dist/cli/commands/qa-run-options.d.ts +23 -0
- package/dist/cli/commands/qa-run-options.js +31 -0
- package/dist/cli/commands/qa-run-slice.d.ts +41 -0
- package/dist/cli/commands/qa-run-slice.js +145 -0
- package/dist/cli/commands/release-canary-command.d.ts +28 -0
- package/dist/cli/commands/release-canary-command.js +129 -0
- package/dist/cli/commands/release-command-shared.d.ts +13 -0
- package/dist/cli/commands/release-command-shared.js +18 -0
- package/dist/cli/commands/release-commands.d.ts +10 -18
- package/dist/cli/commands/release-commands.js +25 -298
- package/dist/cli/commands/release-done-command.d.ts +3 -0
- package/dist/cli/commands/release-done-command.js +64 -0
- package/dist/cli/commands/release-hotfix-command.d.ts +3 -0
- package/dist/cli/commands/release-hotfix-command.js +50 -0
- package/dist/cli/commands/release-plan-command.d.ts +3 -0
- package/dist/cli/commands/release-plan-command.js +33 -0
- package/dist/cli/commands/release-precheck-command.d.ts +3 -0
- package/dist/cli/commands/release-precheck-command.js +28 -0
- package/dist/cli/commands/release-promote-command.d.ts +3 -0
- package/dist/cli/commands/release-promote-command.js +34 -0
- package/dist/cli/commands/release-rollback-command.d.ts +3 -0
- package/dist/cli/commands/release-rollback-command.js +33 -0
- package/dist/cli/commands/release-watch-command.d.ts +3 -0
- package/dist/cli/commands/release-watch-command.js +44 -0
- package/dist/cli/commands/sediment-argv-flags.d.ts +54 -0
- package/dist/cli/commands/sediment-argv-flags.js +116 -0
- package/dist/cli/commands/sediment-command-shared.d.ts +15 -0
- package/dist/cli/commands/sediment-command-shared.js +5 -0
- package/dist/cli/commands/sediment-commands.d.ts +35 -59
- package/dist/cli/commands/sediment-commands.js +36 -590
- package/dist/cli/commands/sediment-pool-commands.d.ts +9 -0
- package/dist/cli/commands/sediment-pool-commands.js +185 -0
- package/dist/cli/commands/sediment-query-commands.d.ts +4 -0
- package/dist/cli/commands/sediment-query-commands.js +94 -0
- package/dist/cli/commands/sediment-release-commands.d.ts +8 -0
- package/dist/cli/commands/sediment-release-commands.js +232 -0
- package/dist/cli/commands/sop-advance-command.d.ts +3 -0
- package/dist/cli/commands/sop-advance-command.js +160 -0
- package/dist/cli/commands/sop-check-command.d.ts +3 -0
- package/dist/cli/commands/sop-check-command.js +44 -0
- package/dist/cli/commands/sop-command-shared.d.ts +23 -0
- package/dist/cli/commands/sop-command-shared.js +18 -0
- package/dist/cli/commands/sop-commands.d.ts +15 -1
- package/dist/cli/commands/sop-commands.js +26 -240
- package/dist/cli/commands/sop-init-command.d.ts +3 -0
- package/dist/cli/commands/sop-init-command.js +51 -0
- package/dist/cli/commands/sop-lint-command.d.ts +3 -0
- package/dist/cli/commands/sop-lint-command.js +64 -0
- package/dist/cli/commands/sop-register-command.d.ts +3 -0
- package/dist/cli/commands/sop-register-command.js +48 -0
- package/dist/cli/commands/sop-registry-command.d.ts +3 -0
- package/dist/cli/commands/sop-registry-command.js +30 -0
- package/dist/cli/commands/statusline-command-shared.d.ts +73 -0
- package/dist/cli/commands/statusline-command-shared.js +90 -0
- package/dist/cli/commands/statusline-commands.d.ts +1 -19
- package/dist/cli/commands/statusline-commands.js +48 -287
- package/dist/cli/commands/statusline-compact-command.d.ts +4 -0
- package/dist/cli/commands/statusline-compact-command.js +54 -0
- package/dist/cli/commands/statusline-install-command.d.ts +3 -0
- package/dist/cli/commands/statusline-install-command.js +48 -0
- package/dist/cli/commands/statusline-render-command.d.ts +9 -0
- package/dist/cli/commands/statusline-render-command.js +55 -0
- package/dist/cli/commands/statusline-status-command.d.ts +3 -0
- package/dist/cli/commands/statusline-status-command.js +23 -0
- package/dist/cli/commands/statusline-uninstall-command.d.ts +3 -0
- package/dist/cli/commands/statusline-uninstall-command.js +23 -0
- package/dist/cli/commands/test-command-run-helpers.d.ts +27 -0
- package/dist/cli/commands/test-command-run-helpers.js +73 -0
- package/dist/cli/commands/test-command-runner-resolution.d.ts +57 -0
- package/dist/cli/commands/test-command-runner-resolution.js +183 -0
- package/dist/cli/commands/test-commands.d.ts +8 -56
- package/dist/cli/commands/test-commands.js +26 -249
- package/dist/cli/commands/vm-command-shared.d.ts +23 -0
- package/dist/cli/commands/vm-command-shared.js +23 -0
- package/dist/cli/commands/vm-commands.d.ts +1 -28
- package/dist/cli/commands/vm-commands.js +36 -270
- package/dist/cli/commands/vm-hypervisor-runtime.d.ts +15 -0
- package/dist/cli/commands/vm-hypervisor-runtime.js +64 -0
- package/dist/cli/commands/vm-release-command.d.ts +5 -0
- package/dist/cli/commands/vm-release-command.js +101 -0
- package/dist/cli/commands/vm-spawn-command.d.ts +5 -0
- package/dist/cli/commands/vm-spawn-command.js +177 -0
- package/dist/cli/commands/web-command-shared.d.ts +12 -0
- package/dist/cli/commands/web-command-shared.js +30 -0
- package/dist/cli/commands/web-commands.d.ts +7 -14
- package/dist/cli/commands/web-commands.js +6 -314
- package/dist/cli/commands/web-install-command.d.ts +10 -0
- package/dist/cli/commands/web-install-command.js +116 -0
- package/dist/cli/commands/web-lifecycle-commands.d.ts +9 -30
- package/dist/cli/commands/web-lifecycle-commands.js +14 -322
- package/dist/cli/commands/web-login-command.d.ts +14 -0
- package/dist/cli/commands/web-login-command.js +189 -0
- package/dist/cli/commands/web-op-payload.d.ts +22 -0
- package/dist/cli/commands/web-op-payload.js +89 -0
- package/dist/cli/commands/web-op-refusals.d.ts +37 -0
- package/dist/cli/commands/web-op-refusals.js +73 -0
- package/dist/cli/commands/web-op-runner.d.ts +14 -0
- package/dist/cli/commands/web-op-runner.js +166 -0
- package/dist/cli/commands/web-status-command.d.ts +4 -0
- package/dist/cli/commands/web-status-command.js +32 -0
- package/dist/cli/commands/web-stop-command.d.ts +10 -0
- package/dist/cli/commands/web-stop-command.js +59 -0
- package/dist/cli/commands/web-verb-specs.d.ts +18 -0
- package/dist/cli/commands/web-verb-specs.js +66 -0
- package/dist/cli/commands/workflow-command-shared.d.ts +102 -0
- package/dist/cli/commands/workflow-command-shared.js +74 -0
- package/dist/cli/commands/workflow-graph-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-graph-commands.js +73 -0
- package/dist/cli/commands/workflow-init-command.d.ts +3 -0
- package/dist/cli/commands/workflow-init-command.js +68 -0
- package/dist/cli/commands/workflow-lifecycle-commands.d.ts +9 -59
- package/dist/cli/commands/workflow-lifecycle-commands.js +14 -348
- package/dist/cli/commands/workflow-node-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-node-commands.js +154 -0
- package/dist/cli/commands/workflow-terminalize-command.d.ts +3 -0
- package/dist/cli/commands/workflow-terminalize-command.js +56 -0
- package/dist/services/code/auto-compact-artifacts.d.ts +54 -0
- package/dist/services/code/auto-compact-artifacts.js +135 -0
- package/dist/services/code/auto-compact-attempt.d.ts +46 -0
- package/dist/services/code/auto-compact-attempt.js +88 -0
- package/dist/services/code/auto-compact-decision.d.ts +74 -0
- package/dist/services/code/auto-compact-decision.js +149 -0
- package/dist/services/code/auto-compact-dispatch-gate.d.ts +36 -0
- package/dist/services/code/auto-compact-dispatch-gate.js +86 -0
- package/dist/services/code/auto-compact-envelopes.d.ts +33 -0
- package/dist/services/code/auto-compact-envelopes.js +134 -0
- package/dist/services/code/auto-compact-history.d.ts +46 -0
- package/dist/services/code/auto-compact-history.js +17 -0
- package/dist/services/code/auto-compact-orchestrator.d.ts +11 -240
- package/dist/services/code/auto-compact-orchestrator.js +165 -686
- package/dist/services/code/auto-compact-run-types.d.ts +123 -0
- package/dist/services/code/auto-compact-run-types.js +1 -0
- package/dist/services/code/emit-handoff.d.ts +35 -1
- package/dist/services/code/emit-handoff.js +128 -7
- package/dist/services/code/step-08-gate.d.ts +28 -19
- package/dist/services/code/step-08-gate.js +92 -35
- package/dist/services/config/config-coercion.d.ts +7 -0
- package/dist/services/config/config-coercion.js +156 -0
- package/dist/services/config/config-file-io.d.ts +11 -0
- package/dist/services/config/config-file-io.js +61 -0
- package/dist/services/config/config-get.d.ts +2 -0
- package/dist/services/config/config-get.js +36 -0
- package/dist/services/config/config-global-loader.d.ts +15 -0
- package/dist/services/config/config-global-loader.js +111 -0
- package/dist/services/config/config-nested-path.d.ts +3 -0
- package/dist/services/config/config-nested-path.js +53 -0
- package/dist/services/config/config-primitives.d.ts +16 -0
- package/dist/services/config/config-primitives.js +24 -0
- package/dist/services/config/config-service.d.ts +9 -33
- package/dist/services/config/config-service.js +16 -665
- package/dist/services/config/config-validation.d.ts +19 -0
- package/dist/services/config/config-validation.js +152 -0
- package/dist/services/config/config-workspace.d.ts +10 -0
- package/dist/services/config/config-workspace.js +158 -0
- package/dist/services/skills/hooks-settings-deny-list.d.ts +61 -0
- package/dist/services/skills/hooks-settings-deny-list.js +173 -0
- package/dist/services/skills/hooks-settings-envelopes.d.ts +20 -0
- package/dist/services/skills/hooks-settings-envelopes.js +79 -0
- package/dist/services/skills/hooks-settings-file-shape.d.ts +43 -0
- package/dist/services/skills/hooks-settings-file-shape.js +207 -0
- package/dist/services/skills/hooks-settings-paths.d.ts +34 -0
- package/dist/services/skills/hooks-settings-paths.js +75 -0
- package/dist/services/skills/hooks-settings-read-installed.d.ts +39 -0
- package/dist/services/skills/hooks-settings-read-installed.js +60 -0
- package/dist/services/skills/hooks-settings-service.d.ts +12 -212
- package/dist/services/skills/hooks-settings-service.js +71 -657
- package/dist/services/skills/hooks-settings-types.d.ts +139 -0
- package/dist/services/skills/hooks-settings-types.js +1 -0
- package/dist/services/workspace/claude-settings-template-merge.d.ts +89 -0
- package/dist/services/workspace/claude-settings-template-merge.js +243 -0
- package/dist/services/workspace/claude-settings-template.d.ts +29 -87
- package/dist/services/workspace/claude-settings-template.js +81 -236
- package/package.json +5 -5
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// src/cli/commands/qa-run-slice.ts
|
|
2
|
+
//
|
|
3
|
+
// The pure `peaks qa run` slice: the gate list, the restart detector wiring and
|
|
4
|
+
// the MUT.sig gate, with no commander and no I/O. Extracted from
|
|
5
|
+
// `qa-commands.ts`; the exported names, the gate order and every envelope field
|
|
6
|
+
// are unchanged.
|
|
7
|
+
//
|
|
8
|
+
// The browser-E2E gate is what the restart-loop detector guards, so the slice
|
|
9
|
+
// wires it here: it constructs a `BrowserRestartDetector` (configurable via
|
|
10
|
+
// `--max-browser-restarts` / `--no-restart-detector`) and a `BrowserEventLogger`
|
|
11
|
+
// that writes the per-slice JSONL log to
|
|
12
|
+
// `.peaks/_runtime/<session-id>/qa/browser-events.jsonl`.
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { BrowserRestartDetector } from '../../services/qa/browser-restart-detector.js';
|
|
15
|
+
import { BrowserEventLogger } from '../../services/qa/browser-event-logger.js';
|
|
16
|
+
import { BROWSER_REUSE_HINT } from '../../services/qa/browser-reuse-hint.js';
|
|
17
|
+
import { isUnsafePathInput } from '../../shared/path-safety.js';
|
|
18
|
+
export const DEFAULT_MAX_BROWSER_RESTARTS = 3;
|
|
19
|
+
export function runQaSlice(input) {
|
|
20
|
+
// Sid axis: this is the join for `qa/browser-events.jsonl`. The `qa gate run`
|
|
21
|
+
// action guards before calling in, but the function is exported for tests and
|
|
22
|
+
// states its own contract at the join.
|
|
23
|
+
if (isUnsafePathInput(input.sessionId)) {
|
|
24
|
+
throw new Error(`Invalid session id: ${input.sessionId} (must be a single path segment)`);
|
|
25
|
+
}
|
|
26
|
+
const detector = new BrowserRestartDetector({
|
|
27
|
+
maxRestarts: input.maxRestarts,
|
|
28
|
+
enabled: input.detectorEnabled
|
|
29
|
+
});
|
|
30
|
+
const logPath = join(input.project, '.peaks', '_runtime', input.sessionId, 'qa', 'browser-events.jsonl');
|
|
31
|
+
const logger = new BrowserEventLogger({ filePath: logPath });
|
|
32
|
+
// PRD AC4 + P1: when browser E2E is off, the detector must NOT record events
|
|
33
|
+
// at all (otherwise a user passing both --no-browser AND a hot detector would
|
|
34
|
+
// see spurious detectorTriggered=true and exit code 2).
|
|
35
|
+
if (input.browserEnabled) {
|
|
36
|
+
recordBrowserEvents(detector, logger, input.events, input.sessionId);
|
|
37
|
+
}
|
|
38
|
+
const gates = [
|
|
39
|
+
{ name: 'functional', status: 'passed' },
|
|
40
|
+
{ name: 'security', status: 'passed' },
|
|
41
|
+
browserGateStatus(input.browserEnabled, detector),
|
|
42
|
+
mutationGateStatus(input)
|
|
43
|
+
];
|
|
44
|
+
const halt = detector.shouldHalt();
|
|
45
|
+
return {
|
|
46
|
+
sessionId: input.sessionId,
|
|
47
|
+
project: input.project,
|
|
48
|
+
browserEnabled: input.browserEnabled,
|
|
49
|
+
gates,
|
|
50
|
+
detectorTriggered: halt,
|
|
51
|
+
...(halt ? { diagnostic: detector.diagnostic() } : {}),
|
|
52
|
+
subAgentPromptHint: BROWSER_REUSE_HINT,
|
|
53
|
+
// Surface MUT.sig ONLY when the gate is actually evaluated
|
|
54
|
+
// (mutation enabled AND a report was loaded). --no-mutation or
|
|
55
|
+
// missing report -> undefined, so downstream consumers cannot
|
|
56
|
+
// mistake a skipped gate for a chain-trail anchor.
|
|
57
|
+
...(input.mutationEnabled && input.mutationReport !== null
|
|
58
|
+
? { mutSig: input.mutationReport.sha256 }
|
|
59
|
+
: {})
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Feed one slice's events to the detector, logging a close→navigate pair as a
|
|
64
|
+
* spurious restart. The pairing state is local to the run: a close with no
|
|
65
|
+
* following navigate logs nothing, and a second navigate in a row clears it.
|
|
66
|
+
*/
|
|
67
|
+
function recordBrowserEvents(detector, logger, events, sessionId) {
|
|
68
|
+
let pendingCloseTs = null;
|
|
69
|
+
for (const ev of events) {
|
|
70
|
+
detector.record(ev);
|
|
71
|
+
if (ev.tool === 'browser_close') {
|
|
72
|
+
pendingCloseTs = ev.ts;
|
|
73
|
+
}
|
|
74
|
+
else if (ev.tool === 'browser_navigate' && pendingCloseTs !== null) {
|
|
75
|
+
const deltaMs = Date.parse(ev.ts) - Date.parse(pendingCloseTs);
|
|
76
|
+
logger.append({
|
|
77
|
+
kind: 'spurious_restart',
|
|
78
|
+
ts: ev.ts,
|
|
79
|
+
sessionId,
|
|
80
|
+
closeTs: pendingCloseTs,
|
|
81
|
+
navigateTs: ev.ts,
|
|
82
|
+
deltaMs
|
|
83
|
+
});
|
|
84
|
+
pendingCloseTs = null;
|
|
85
|
+
}
|
|
86
|
+
else if (ev.tool === 'browser_navigate') {
|
|
87
|
+
pendingCloseTs = null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function browserGateStatus(browserEnabled, detector) {
|
|
92
|
+
if (!browserEnabled) {
|
|
93
|
+
return { name: 'browser-e2e', status: 'skipped', reason: '--no-browser' };
|
|
94
|
+
}
|
|
95
|
+
return detector.shouldHalt()
|
|
96
|
+
? { name: 'browser-e2e', status: 'failed', reason: detector.diagnostic() }
|
|
97
|
+
: { name: 'browser-e2e', status: 'passed' };
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Plan 2 / Task 8 — MUT.sig gate.
|
|
101
|
+
* Gate semantics (per spec lines 1292-1341):
|
|
102
|
+
* - `skipped` when peaks-mut was not run (no report) OR --no-mutation
|
|
103
|
+
* - `passed` when the report's `thresholds.passed` is true
|
|
104
|
+
* - `failed` when the report's `thresholds.passed` is false
|
|
105
|
+
* "Skipped" is NOT a failure — the gate is a no-op so existing sessions that
|
|
106
|
+
* have not yet adopted peaks-mut keep passing.
|
|
107
|
+
*/
|
|
108
|
+
function mutationGateStatus(input) {
|
|
109
|
+
if (!input.mutationEnabled) {
|
|
110
|
+
return { name: 'mutation', status: 'skipped', reason: '--no-mutation' };
|
|
111
|
+
}
|
|
112
|
+
const report = input.mutationReport;
|
|
113
|
+
if (report === null) {
|
|
114
|
+
return { name: 'mutation', status: 'skipped', reason: 'peaks mut not run' };
|
|
115
|
+
}
|
|
116
|
+
return report.thresholds.passed
|
|
117
|
+
? { name: 'mutation', status: 'passed', mutSig: report.sha256 }
|
|
118
|
+
: {
|
|
119
|
+
name: 'mutation',
|
|
120
|
+
status: 'failed',
|
|
121
|
+
reason: deriveMutationFailureReason(report),
|
|
122
|
+
mutSig: report.sha256
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Plan 2 / Task 8 — pure helper that explains WHY the mutation gate
|
|
127
|
+
* failed. Used only when the report's `thresholds.passed` is false.
|
|
128
|
+
* Reads the threshold block from the report itself (already
|
|
129
|
+
* CLI-computed by `buildMutReport`) so the message matches what
|
|
130
|
+
* peaks-mut's CLI surface prints.
|
|
131
|
+
*/
|
|
132
|
+
function deriveMutationFailureReason(report) {
|
|
133
|
+
const t = report.thresholds;
|
|
134
|
+
const fragments = [];
|
|
135
|
+
if (report.mutation.killRate < t.mutationKillRateMin) {
|
|
136
|
+
fragments.push(`mutation kill rate ${report.mutation.killRate.toFixed(2)} < ${t.mutationKillRateMin.toFixed(2)}`);
|
|
137
|
+
}
|
|
138
|
+
if (report.assertions.weakRate > t.weakAssertionRateMax) {
|
|
139
|
+
fragments.push(`weak assertion rate ${report.assertions.weakRate.toFixed(2)} > ${t.weakAssertionRateMax.toFixed(2)}`);
|
|
140
|
+
}
|
|
141
|
+
if (fragments.length === 0) {
|
|
142
|
+
return `mutation thresholds failed (MUT.sig=${report.sha256})`;
|
|
143
|
+
}
|
|
144
|
+
return `${fragments.join('; ')} (MUT.sig=${report.sha256})`;
|
|
145
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import { type LayerResult } from '../../services/release/version-precheck-service.js';
|
|
3
|
+
import { type ProgramIO } from '../cli-helpers.js';
|
|
4
|
+
/**
|
|
5
|
+
* The payload an outcome carries. The `error` member is declared so the
|
|
6
|
+
* INVALID_TRANSITION message is read as a `string` rather than as `unknown`
|
|
7
|
+
* off the open index signature.
|
|
8
|
+
*/
|
|
9
|
+
type CanaryPayload = Readonly<Record<string, unknown>> & {
|
|
10
|
+
readonly error?: string;
|
|
11
|
+
};
|
|
12
|
+
type CanaryOutcome = {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
payload: CanaryPayload;
|
|
15
|
+
status: 'PRECHECK_BLOCKER' | 'INVALID_PERCENT' | 'INVALID_TRANSITION' | 'OK';
|
|
16
|
+
blockerLayer?: {
|
|
17
|
+
name: string;
|
|
18
|
+
result: LayerResult;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export declare function executeCanaryAction(opts: {
|
|
22
|
+
percent: string;
|
|
23
|
+
note?: string;
|
|
24
|
+
project?: string;
|
|
25
|
+
json?: boolean;
|
|
26
|
+
}, io: ProgramIO, projectRoot: string): CanaryOutcome;
|
|
27
|
+
export declare function registerReleaseCanaryCommand(release: Command, io: ProgramIO): void;
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// src/cli/commands/release-canary-command.ts
|
|
2
|
+
//
|
|
3
|
+
// `peaks release canary --percent <10|50>` — advance the active release to a
|
|
4
|
+
// canary stage. Split out of `release-commands.ts`; the verb name, its options,
|
|
5
|
+
// the canary percent vocabulary, the precheck gate and every envelope shape are
|
|
6
|
+
// unchanged. `executeCanaryAction` keeps its name and signature (it is the
|
|
7
|
+
// function the cross-cutting e2e harness names) and is re-exported by
|
|
8
|
+
// `release-commands.ts`.
|
|
9
|
+
import { readReleaseState, transitionRelease, writeReleaseState } from '../../services/release/release-state.js';
|
|
10
|
+
import { runAllLayers } from '../../services/release/version-precheck-service.js';
|
|
11
|
+
import { runChangesetHardGate } from '../../services/changeset/changeset-check-service.js';
|
|
12
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
13
|
+
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
14
|
+
import { CANARY_PERCENT_FIRST, CANARY_PERCENT_SECOND, CANARY_PERCENTS, resolveReleaseProjectRoot } from './release-command-shared.js';
|
|
15
|
+
function precheckBlockerOutcome(projectRoot, snapshotAt, name, result) {
|
|
16
|
+
return {
|
|
17
|
+
ok: false,
|
|
18
|
+
status: 'PRECHECK_BLOCKER',
|
|
19
|
+
blockerLayer: { name, result },
|
|
20
|
+
payload: {
|
|
21
|
+
projectRoot,
|
|
22
|
+
precheckSnapshotAt: snapshotAt,
|
|
23
|
+
layer: name,
|
|
24
|
+
message: result.message,
|
|
25
|
+
remediation: result.remediation
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
// precheck-guard via direct function call (not via program.parseAsync with a
|
|
30
|
+
// mocked service). Returns the result envelope for the caller to print.
|
|
31
|
+
export function executeCanaryAction(opts, io, projectRoot) {
|
|
32
|
+
// this function is called (step 0 short-circuits with CHANGESET_BLOCKED).
|
|
33
|
+
// Layers C/D default warning → do not block canary; --strict upgrade would
|
|
34
|
+
const precheck = runAllLayers({ projectRoot, strict: false });
|
|
35
|
+
const blockerEntry = Object.entries(precheck.layers).find(([, l]) => l.status === 'blocker');
|
|
36
|
+
if (blockerEntry !== undefined) {
|
|
37
|
+
const [name, result] = blockerEntry;
|
|
38
|
+
return precheckBlockerOutcome(projectRoot, precheck.snapshotAt, name, result);
|
|
39
|
+
}
|
|
40
|
+
const percent = Number.parseInt(opts.percent, 10);
|
|
41
|
+
if (percent !== CANARY_PERCENT_FIRST && percent !== CANARY_PERCENT_SECOND) {
|
|
42
|
+
return {
|
|
43
|
+
ok: false,
|
|
44
|
+
status: 'INVALID_PERCENT',
|
|
45
|
+
payload: { projectRoot, got: opts.percent }
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
const state = readReleaseState(projectRoot);
|
|
49
|
+
const targetStage = CANARY_PERCENTS[percent];
|
|
50
|
+
const result = transitionRelease(state, targetStage, opts.note);
|
|
51
|
+
if ('error' in result) {
|
|
52
|
+
return {
|
|
53
|
+
ok: false,
|
|
54
|
+
status: 'INVALID_TRANSITION',
|
|
55
|
+
payload: { projectRoot, error: result.error }
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
writeReleaseState(projectRoot, result.state);
|
|
59
|
+
return {
|
|
60
|
+
ok: true,
|
|
61
|
+
status: 'OK',
|
|
62
|
+
payload: {
|
|
63
|
+
projectRoot,
|
|
64
|
+
percent,
|
|
65
|
+
currentStage: targetStage,
|
|
66
|
+
nextAction: percent === CANARY_PERCENT_FIRST
|
|
67
|
+
? 'peaks release canary --percent 50'
|
|
68
|
+
: 'peaks release promote'
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/** The refusal a staged changeset triggers, before the precheck even runs. */
|
|
73
|
+
function changesetBlockedOutcome(gate, projectRoot) {
|
|
74
|
+
return fail('release.canary', 'CHANGESET_BLOCKED', `${gate.stagedFiles.length} staged .changeset/*.md file(s) — refusing canary`, {
|
|
75
|
+
projectRoot,
|
|
76
|
+
state: gate.state,
|
|
77
|
+
stagedFiles: [...gate.stagedFiles],
|
|
78
|
+
snapshotAt: gate.snapshotAt
|
|
79
|
+
}, [
|
|
80
|
+
`Drain pending changesets (coordinating LLM: drain via the standard changeset consumption path), then re-run \`peaks changeset check --project ${projectRoot}\` to confirm clean state.`
|
|
81
|
+
]);
|
|
82
|
+
}
|
|
83
|
+
/** The precheck refusal, with the layer that blocked and where to read the rest. */
|
|
84
|
+
function precheckBlockerEnvelope(projectRoot, result) {
|
|
85
|
+
const layer = result.blockerLayer;
|
|
86
|
+
return fail('release.canary', 'PRECHECK_BLOCKER', `precheck blocker on layer '${layer?.name ?? 'unknown'}': ${layer?.result.message ?? ''}`, result.payload, [
|
|
87
|
+
`Run 'peaks release precheck --project ${projectRoot}' for the full 4-layer envelope.`,
|
|
88
|
+
`Run 'peaks release precheck --strict' to also surface warning-layer issues.`,
|
|
89
|
+
`Remediation: ${layer?.result.remediation ?? ''}`
|
|
90
|
+
]);
|
|
91
|
+
}
|
|
92
|
+
/** The outcome of the canary attempt, printed as the envelope its status selects. */
|
|
93
|
+
function printCanaryOutcome(io, opts, projectRoot, result) {
|
|
94
|
+
const asJson = opts.json ?? false;
|
|
95
|
+
if (result.status === 'PRECHECK_BLOCKER') {
|
|
96
|
+
printResult(io, precheckBlockerEnvelope(projectRoot, result), asJson);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (result.status === 'INVALID_PERCENT') {
|
|
100
|
+
printResult(io, fail('release.canary', 'INVALID_PERCENT', `--percent must be 10 or 50 (got "${opts.percent}")`, result.payload, []), asJson);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (result.status === 'INVALID_TRANSITION') {
|
|
104
|
+
printResult(io, fail('release.canary', 'INVALID_TRANSITION', String(result.payload['error'] ?? ''), result.payload, []), asJson);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
printResult(io, ok('release.canary', result.payload, [], []), asJson);
|
|
108
|
+
}
|
|
109
|
+
function runReleaseCanary(io, opts) {
|
|
110
|
+
const projectRoot = resolveReleaseProjectRoot(opts.project);
|
|
111
|
+
const gate = runChangesetHardGate(projectRoot);
|
|
112
|
+
if (gate.state === 'staged-present') {
|
|
113
|
+
process.exitCode = 1;
|
|
114
|
+
printResult(io, changesetBlockedOutcome(gate, projectRoot), opts.json ?? false);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
printCanaryOutcome(io, opts, projectRoot, executeCanaryAction(opts, io, projectRoot));
|
|
118
|
+
}
|
|
119
|
+
export function registerReleaseCanaryCommand(release, io) {
|
|
120
|
+
addJsonOption(release
|
|
121
|
+
.command('canary')
|
|
122
|
+
.description('Advance the active release to a canary stage. Two percent values supported: ' +
|
|
123
|
+
'10 (first canary, requires stage=planned) and 50 (second canary, requires ' +
|
|
124
|
+
'stage=canary-10). Runs `peaks release precheck` first and refuses with ' +
|
|
125
|
+
'PRECHECK_BLOCKER if any blocker layer (rootVsShared or tagCollision) fails.')
|
|
126
|
+
.requiredOption('--percent <10|50>', 'canary percent (10 or 50)')
|
|
127
|
+
.option('--note <text>', 'optional note for the stage transition')
|
|
128
|
+
.option('--project <path>', 'project root (default: cwd)')).action((opts) => runReleaseCanary(io, opts));
|
|
129
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReleaseStage } from '../../services/release/release-state.js';
|
|
2
|
+
/** The two canary stages the CLI supports, as the `--percent` values that select them. */
|
|
3
|
+
export declare const CANARY_PERCENT_FIRST = 10;
|
|
4
|
+
export declare const CANARY_PERCENT_SECOND = 50;
|
|
5
|
+
export type CanaryPercent = typeof CANARY_PERCENT_FIRST | typeof CANARY_PERCENT_SECOND;
|
|
6
|
+
export declare const CANARY_PERCENTS: Readonly<Record<CanaryPercent, ReleaseStage>>;
|
|
7
|
+
/** `--project <path>`, else the nearest project root, else cwd — unchanged order. */
|
|
8
|
+
export declare function resolveReleaseProjectRoot(project: string | undefined): string;
|
|
9
|
+
/** `--project` + `--json`, the two options every verb in this family declares. */
|
|
10
|
+
export type ReleaseProjectOptions = {
|
|
11
|
+
project?: string;
|
|
12
|
+
json?: boolean;
|
|
13
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// src/cli/commands/release-command-shared.ts
|
|
2
|
+
//
|
|
3
|
+
// What every `peaks release *` verb shares: the project-root resolution and the
|
|
4
|
+
// two canary percents, named so the state machine's vocabulary is not spelled
|
|
5
|
+
// out as literals in each verb. Split out of `release-commands.ts`; the values
|
|
6
|
+
// and the resolution order are unchanged.
|
|
7
|
+
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
8
|
+
/** The two canary stages the CLI supports, as the `--percent` values that select them. */
|
|
9
|
+
export const CANARY_PERCENT_FIRST = 10;
|
|
10
|
+
export const CANARY_PERCENT_SECOND = 50;
|
|
11
|
+
export const CANARY_PERCENTS = {
|
|
12
|
+
[CANARY_PERCENT_FIRST]: 'canary-10',
|
|
13
|
+
[CANARY_PERCENT_SECOND]: 'canary-50'
|
|
14
|
+
};
|
|
15
|
+
/** `--project <path>`, else the nearest project root, else cwd — unchanged order. */
|
|
16
|
+
export function resolveReleaseProjectRoot(project) {
|
|
17
|
+
return project ?? findProjectRoot(process.cwd()) ?? process.cwd();
|
|
18
|
+
}
|
|
@@ -18,24 +18,16 @@
|
|
|
18
18
|
*
|
|
19
19
|
* Real deployment (k8s rollout, LB config, monitoring integration) is
|
|
20
20
|
* OUT OF SCOPE for this slice.
|
|
21
|
+
*
|
|
22
|
+
* The verb implementations live beside this file, one module per verb:
|
|
23
|
+
* `release-plan-command.ts`, `release-canary-command.ts`,
|
|
24
|
+
* `release-promote-command.ts`, `release-watch-command.ts`,
|
|
25
|
+
* `release-done-command.ts`, `release-rollback-command.ts`,
|
|
26
|
+
* `release-hotfix-command.ts`, `release-precheck-command.ts`, with their shared
|
|
27
|
+
* project-root / canary-percent vocabulary in `release-command-shared.ts`.
|
|
21
28
|
*/
|
|
22
29
|
import type { Command } from 'commander';
|
|
23
|
-
import {
|
|
24
|
-
import { type LayerResult } from '../../services/release/version-precheck-service.js';
|
|
25
|
-
import { type ProgramIO } from '../cli-helpers.js';
|
|
26
|
-
export declare function executeCanaryAction(opts: {
|
|
27
|
-
percent: string;
|
|
28
|
-
note?: string;
|
|
29
|
-
project?: string;
|
|
30
|
-
json?: boolean;
|
|
31
|
-
}, io: ProgramIO, projectRoot: string): {
|
|
32
|
-
ok: boolean;
|
|
33
|
-
payload: Readonly<Record<string, unknown>>;
|
|
34
|
-
status: 'PRECHECK_BLOCKER' | 'INVALID_PERCENT' | 'INVALID_TRANSITION' | 'OK';
|
|
35
|
-
blockerLayer?: {
|
|
36
|
-
name: string;
|
|
37
|
-
result: LayerResult;
|
|
38
|
-
};
|
|
39
|
-
};
|
|
30
|
+
import type { ProgramIO } from '../cli-helpers.js';
|
|
40
31
|
export declare function registerReleaseCommands(program: Command, io: ProgramIO): void;
|
|
41
|
-
export {
|
|
32
|
+
export { executeCanaryAction } from './release-canary-command.js';
|
|
33
|
+
export { isReleaseStage } from '../../services/release/release-state.js';
|