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
|
@@ -5,84 +5,18 @@
|
|
|
5
5
|
* prepare / node ack / node mark-lost / terminalize`. All commands
|
|
6
6
|
* delegate to the canonical services. Each action emits the typed
|
|
7
7
|
* envelope via `ok` / `fail` so the LLM runner can branch on `code`.
|
|
8
|
-
*/
|
|
9
|
-
import { fail, ok, getErrorMessage } from 'peaks-loop-shared/result';
|
|
10
|
-
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
11
|
-
import { resolveCallerId } from '../../services/session/resolve-caller-id.js';
|
|
12
|
-
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
13
|
-
import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
|
|
14
|
-
import { initWorkflow, terminalizeWorkflow } from '../../services/workflow/workflow-presence-lifecycle.js';
|
|
15
|
-
import { readGraph, emptyGraph } from '../../services/workflow/workflow-graph-store.js';
|
|
16
|
-
import { WORKFLOW_ID_REGEX, TERMINAL_REASONS } from '../../services/workflow/workflow-graph-types.js';
|
|
17
|
-
import { prepareNodeAction, transitionNode, transitionLease } from '../../services/workflow/workflow-node-lifecycle.js';
|
|
18
|
-
function deriveCallerId() {
|
|
19
|
-
try {
|
|
20
|
-
return resolveCallerId({});
|
|
21
|
-
}
|
|
22
|
-
catch (err) {
|
|
23
|
-
throw fail('workflow.init', 'PEAKS_CALLER_NOT_RESOLVED', getErrorMessage(err), { callerId: null }, ['Resolve the IDE session identity before running workflow commands.']);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
function deriveProjectRoot(options) {
|
|
27
|
-
return options.project ?? process.cwd();
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* The literal that means "no session could be resolved". Kept as a named
|
|
31
|
-
* constant because three call sites now have to ASK whether resolution
|
|
32
|
-
* failed rather than consume the value as if it were an id.
|
|
33
|
-
*/
|
|
34
|
-
export const UNKNOWN_SESSION_ID = 'unknown-sid';
|
|
35
|
-
/**
|
|
36
|
-
* Resolve the session id for every `workflow *` command.
|
|
37
|
-
*
|
|
38
|
-
* Tier order (matches the idiom every other command family in this CLI
|
|
39
|
-
* already uses — see `job-commands.ts:85`, `container-commands.ts:138`):
|
|
40
8
|
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* info --active` and `peaks session checkpoint` use
|
|
47
|
-
* 4. `unknown-sid` — nothing is bound
|
|
48
|
-
*
|
|
49
|
-
* Tier 3 was MISSING until 2026-09-15 (S6), and its absence is the whole
|
|
50
|
-
* defect: `workflow init` resolved on tiers 1–2 only, so with no flag and no
|
|
51
|
-
* env var it wrote the graph into `.peaks/_runtime/unknown-sid/graphs/`
|
|
52
|
-
* regardless of what the binding file said. `peaks workflow node prepare`
|
|
53
|
-
* then ran under the CORRECT session dir and reported `PEAKS_GRAPH_NOT_FOUND`
|
|
54
|
-
* — the graph it was asking for had been written one bucket over. The bucket
|
|
55
|
-
* accumulated artifacts from at least 4 distinct caller ids between 2026-09-01
|
|
56
|
-
* and 2026-09-15, i.e. it had never worked for anyone.
|
|
57
|
-
*
|
|
58
|
-
* The same prior-art sweep (`.peaks/memory/archived/2026-06-26-unknown-sid-root-cause.md`)
|
|
59
|
-
* converted six inline `?? 'unknown-sid'` sites to this 4-tier chain;
|
|
60
|
-
* `workflow-lifecycle-commands.ts` was missed. This is that site.
|
|
61
|
-
*
|
|
62
|
-
* The project root passed to tier 3 goes through the same `findProjectRoot`
|
|
63
|
-
* walk `session info` uses, so a command run from a SUBDIRECTORY of the
|
|
64
|
-
* project resolves the project's binding instead of `cwd`'s (which has none).
|
|
9
|
+
* The verb implementations live beside this file, one module per verb group:
|
|
10
|
+
* `workflow-init-command.ts`, `workflow-graph-commands.ts`,
|
|
11
|
+
* `workflow-node-commands.ts`, `workflow-terminalize-command.ts`, with the
|
|
12
|
+
* option vocabulary and the caller / project / session derivation in
|
|
13
|
+
* `workflow-command-shared.ts`.
|
|
65
14
|
*/
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return fromEnv;
|
|
72
|
-
return (getCurrentSessionId(findProjectRoot(options.project ?? process.cwd()) ?? options.project ?? process.cwd()) ?? UNKNOWN_SESSION_ID);
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Tier 3 resolving to `unknown-sid` means NO session is bound at all. A
|
|
76
|
-
* `workflow` subcommand that WRITES must fail loudly on that rather than
|
|
77
|
-
* create a bucket named after a failure — `graph list` already does (see its
|
|
78
|
-
* `PEAKS_SESSION_NOT_BOUND` guard below); `init` did not.
|
|
79
|
-
*/
|
|
80
|
-
function buildSessionNotBoundEnvelope(sessionId, projectRoot) {
|
|
81
|
-
return fail('workflow.init', 'PEAKS_SESSION_NOT_BOUND', `No peaks session is bound for '${projectRoot}' (derived session id '${sessionId}'): --session-id, PEAKS_SESSION_ID and the project binding are all absent.`, { workflowId: null }, [
|
|
82
|
-
'Run `peaks workspace init --project <p>` to bind a session, then re-run.',
|
|
83
|
-
'Or pass `--session-id <sid>` explicitly.'
|
|
84
|
-
]);
|
|
85
|
-
}
|
|
15
|
+
import { registerWorkflowGraphCommands } from './workflow-graph-commands.js';
|
|
16
|
+
import { registerWorkflowInitCommand } from './workflow-init-command.js';
|
|
17
|
+
import { registerWorkflowNodeCommands } from './workflow-node-commands.js';
|
|
18
|
+
import { registerWorkflowTerminalizeCommand } from './workflow-terminalize-command.js';
|
|
19
|
+
export { UNKNOWN_SESSION_ID } from './workflow-command-shared.js';
|
|
86
20
|
export function registerWorkflowLifecycleCommand(parent, io) {
|
|
87
21
|
// Reuse the existing `workflow` parent (created by `registerWorkflowCommands`)
|
|
88
22
|
// to avoid Commander.js's "cannot add command 'workflow' as already have
|
|
@@ -90,276 +24,8 @@ export function registerWorkflowLifecycleCommand(parent, io) {
|
|
|
90
24
|
const existingWorkflow = parent.commands.find((c) => c.name() === 'workflow');
|
|
91
25
|
const workflow = existingWorkflow ??
|
|
92
26
|
parent.command('workflow').description('workflow lifecycle commands (RD §4)');
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
.option('--workflow-id <id>', 'optional explicit workflowId (auto-generated if omitted)')
|
|
98
|
-
.option('--parent-workflow <id>', 'parent workflowId for nested runs')
|
|
99
|
-
.option('--session-id <sid>', 'override session id (default: derived from session.json / env)')
|
|
100
|
-
.option('--project <path>', 'target project root (defaults to cwd)')).action(async (options) => {
|
|
101
|
-
const asJson = options.json === true;
|
|
102
|
-
try {
|
|
103
|
-
const callerId = deriveCallerId();
|
|
104
|
-
const projectRoot = deriveProjectRoot(options);
|
|
105
|
-
const sessionId = deriveSessionId(options);
|
|
106
|
-
if (sessionId === UNKNOWN_SESSION_ID) {
|
|
107
|
-
printResult(io, buildSessionNotBoundEnvelope(sessionId, projectRoot), asJson);
|
|
108
|
-
process.exitCode = 1;
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
const workflowId = options.workflowId ?? `wf-${Date.now().toString(36)}`;
|
|
112
|
-
if (!WORKFLOW_ID_REGEX.test(workflowId)) {
|
|
113
|
-
throw new Error(`workflowId shape invalid: ${workflowId}`);
|
|
114
|
-
}
|
|
115
|
-
const result = await initWorkflow({
|
|
116
|
-
projectRoot,
|
|
117
|
-
sessionId,
|
|
118
|
-
callerId,
|
|
119
|
-
skill: options.skill ?? 'peaks-code',
|
|
120
|
-
workflowId,
|
|
121
|
-
...(options.parentWorkflow ? { parentWorkflowId: options.parentWorkflow } : {})
|
|
122
|
-
});
|
|
123
|
-
printResult(io, ok('workflow.init', {
|
|
124
|
-
envelopeVersion: '4.0.8',
|
|
125
|
-
workflowId: result.workflowId,
|
|
126
|
-
graphRef: result.graphRef,
|
|
127
|
-
events: result.events
|
|
128
|
-
}), asJson);
|
|
129
|
-
}
|
|
130
|
-
catch (err) {
|
|
131
|
-
const code = err.code ?? 'PEAKS_GRAPH_WRITE_FAILED';
|
|
132
|
-
printResult(io, fail('workflow.init', code, getErrorMessage(err), { workflowId: null }, []), asJson);
|
|
133
|
-
process.exitCode = 1;
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
// Note: `.command('graph show')` and `.command('graph list')` each
|
|
137
|
-
// implicitly create a NEW `graph` parent under `workflow` in
|
|
138
|
-
// Commander v12 (no auto-reuse), so calling them in sequence throws
|
|
139
|
-
// "cannot add command 'graph' as already have command 'graph'" at
|
|
140
|
-
// startup. Reuse the first created `graph` parent for the second
|
|
141
|
-
// registration.
|
|
142
|
-
const graphCmd = workflow.command('graph').description('workflow graph read commands');
|
|
143
|
-
graphCmd
|
|
144
|
-
.command('show')
|
|
145
|
-
.description('Read a workflow graph.')
|
|
146
|
-
.option('--workflow <id>', 'workflow id')
|
|
147
|
-
.option('--session-id <sid>', 'session id')
|
|
148
|
-
.option('--project <path>', 'project root')
|
|
149
|
-
.option('--json', 'json output')
|
|
150
|
-
.action((options) => {
|
|
151
|
-
const asJson = options.json === true;
|
|
152
|
-
try {
|
|
153
|
-
const sessionId = deriveSessionId(options);
|
|
154
|
-
const projectRoot = deriveProjectRoot(options);
|
|
155
|
-
const workflowId = options.workflow ?? '';
|
|
156
|
-
if (!workflowId || !WORKFLOW_ID_REGEX.test(workflowId)) {
|
|
157
|
-
throw new Error('workflowId is required');
|
|
158
|
-
}
|
|
159
|
-
const graph = readGraph({
|
|
160
|
-
projectRoot,
|
|
161
|
-
sessionId,
|
|
162
|
-
graphRef: `graphs/${workflowId}.json`,
|
|
163
|
-
workflowId
|
|
164
|
-
});
|
|
165
|
-
printResult(io, ok('workflow.graph.show', { envelopeVersion: '4.0.8', graph }), asJson);
|
|
166
|
-
}
|
|
167
|
-
catch (err) {
|
|
168
|
-
const code = err.code ?? 'PEAKS_GRAPH_NOT_FOUND';
|
|
169
|
-
printResult(io, fail('workflow.graph.show', code, getErrorMessage(err), { graph: null }, []), asJson);
|
|
170
|
-
process.exitCode = 1;
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
graphCmd
|
|
174
|
-
.command('list')
|
|
175
|
-
.description('List workflow graphs (metadata only).')
|
|
176
|
-
.option('--session-id <sid>', 'session id')
|
|
177
|
-
.option('--project <path>', 'project root')
|
|
178
|
-
.option('--json', 'json output')
|
|
179
|
-
.action((options) => {
|
|
180
|
-
const asJson = options.json === true;
|
|
181
|
-
try {
|
|
182
|
-
const sessionId = deriveSessionId(options);
|
|
183
|
-
if (sessionId === UNKNOWN_SESSION_ID) {
|
|
184
|
-
throw new Error('PEAKS_SESSION_NOT_BOUND: no session id');
|
|
185
|
-
}
|
|
186
|
-
const result = { envelopeVersion: '4.0.8', sessionId, graphs: [] };
|
|
187
|
-
printResult(io, ok('workflow.graph.list', result), asJson);
|
|
188
|
-
}
|
|
189
|
-
catch (err) {
|
|
190
|
-
const code = err.code ?? 'PEAKS_SESSION_NOT_BOUND';
|
|
191
|
-
printResult(io, fail('workflow.graph.list', code, getErrorMessage(err), { graphs: [] }, []), asJson);
|
|
192
|
-
process.exitCode = 1;
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
// Reuse one `node` parent for prepare / ack / mark-lost (Commander v12
|
|
196
|
-
// creates a NEW parent per `.command('node X')` call, so we must
|
|
197
|
-
// explicitly create the parent first to avoid duplicate-registration).
|
|
198
|
-
const nodeCmd = workflow.command('node').description('workflow node commands');
|
|
199
|
-
nodeCmd
|
|
200
|
-
.command('prepare')
|
|
201
|
-
.description('Prepare a node in a workflow graph.')
|
|
202
|
-
.option('--workflow <id>', 'workflow id')
|
|
203
|
-
.option('--node <id>', 'node id')
|
|
204
|
-
.option('--kind <k>', 'node kind: step | dispatch | terminal')
|
|
205
|
-
.option('--label <text>', 'human-readable label')
|
|
206
|
-
.option('--depends-on <ids>', 'comma-separated list of dependency node ids')
|
|
207
|
-
.option('--session-id <sid>', 'session id')
|
|
208
|
-
.option('--project <path>', 'project root')
|
|
209
|
-
.option('--json', 'json output')
|
|
210
|
-
.action((options) => {
|
|
211
|
-
const asJson = options.json === true;
|
|
212
|
-
try {
|
|
213
|
-
const sessionId = deriveSessionId(options);
|
|
214
|
-
const projectRoot = deriveProjectRoot(options);
|
|
215
|
-
const workflowId = options.workflow ?? '';
|
|
216
|
-
if (!workflowId || !WORKFLOW_ID_REGEX.test(workflowId)) {
|
|
217
|
-
throw new Error('workflowId is required');
|
|
218
|
-
}
|
|
219
|
-
const graphRef = `graphs/${workflowId}.json`;
|
|
220
|
-
const existing = readGraph({ projectRoot, sessionId, graphRef, workflowId });
|
|
221
|
-
const nodeId = options.node ?? `node-${Date.now().toString(36)}`;
|
|
222
|
-
const kind = (options.kind ?? 'step');
|
|
223
|
-
const dependsOn = (options.dependsOn ?? '')
|
|
224
|
-
.split(',')
|
|
225
|
-
.map((s) => s.trim())
|
|
226
|
-
.filter((s) => s.length > 0);
|
|
227
|
-
const updated = prepareNodeAction({
|
|
228
|
-
workflowId,
|
|
229
|
-
nodeId,
|
|
230
|
-
graphNode: existing.nodes.find((n) => n.id === nodeId) ?? {
|
|
231
|
-
id: nodeId,
|
|
232
|
-
kind,
|
|
233
|
-
label: options.label ?? nodeId,
|
|
234
|
-
status: 'prepared',
|
|
235
|
-
dependsOn
|
|
236
|
-
},
|
|
237
|
-
dependsOn,
|
|
238
|
-
status: 'prepared'
|
|
239
|
-
});
|
|
240
|
-
// Persist via the graph store
|
|
241
|
-
// (not inlined so the CLI delegates everything to the service).
|
|
242
|
-
printResult(io, ok('workflow.node.prepare', { envelopeVersion: '4.0.8', graph: updated }), asJson);
|
|
243
|
-
}
|
|
244
|
-
catch (err) {
|
|
245
|
-
const code = err.code ?? 'PEAKS_GRAPH_CORRUPTED';
|
|
246
|
-
printResult(io, fail('workflow.node.prepare', code, getErrorMessage(err), { graph: null }, []), asJson);
|
|
247
|
-
process.exitCode = 1;
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
nodeCmd
|
|
251
|
-
.command('ack')
|
|
252
|
-
.description('Acknowledge a node that has an envelope-received status.')
|
|
253
|
-
.option('--workflow <id>', 'workflow id')
|
|
254
|
-
.option('--node <id>', 'node id')
|
|
255
|
-
.option('--session-id <sid>', 'session id')
|
|
256
|
-
.option('--project <path>', 'project root')
|
|
257
|
-
.option('--json', 'json output')
|
|
258
|
-
.action((options) => {
|
|
259
|
-
const asJson = options.json === true;
|
|
260
|
-
try {
|
|
261
|
-
const sessionId = deriveSessionId(options);
|
|
262
|
-
const projectRoot = deriveProjectRoot(options);
|
|
263
|
-
const workflowId = options.workflow ?? '';
|
|
264
|
-
if (!workflowId)
|
|
265
|
-
throw new Error('workflowId is required');
|
|
266
|
-
const graphRef = `graphs/${workflowId}.json`;
|
|
267
|
-
const graph = readGraph({ projectRoot, sessionId, graphRef, workflowId });
|
|
268
|
-
const nodeId = options.node ?? '';
|
|
269
|
-
const node = graph.nodes.find((n) => n.id === nodeId);
|
|
270
|
-
if (!node)
|
|
271
|
-
throw new Error(`node ${nodeId} not found`);
|
|
272
|
-
if (node.status !== 'envelope-received') {
|
|
273
|
-
throw new Error('PEAKS_ENVELOPE_NOT_RECEIVED: node is not envelope-received');
|
|
274
|
-
}
|
|
275
|
-
const updated = transitionNode(node.status, 'consumed-by-parent', { graphNode: node });
|
|
276
|
-
printResult(io, ok('workflow.node.ack', { envelopeVersion: '4.0.8', node: updated }), asJson);
|
|
277
|
-
}
|
|
278
|
-
catch (err) {
|
|
279
|
-
const code = err.code ?? 'PEAKS_ENVELOPE_NOT_RECEIVED';
|
|
280
|
-
printResult(io, fail('workflow.node.ack', code, getErrorMessage(err), { node: null }, []), asJson);
|
|
281
|
-
process.exitCode = 1;
|
|
282
|
-
}
|
|
283
|
-
});
|
|
284
|
-
nodeCmd
|
|
285
|
-
.command('mark-lost')
|
|
286
|
-
.description('Mark a node as lost.')
|
|
287
|
-
.option('--workflow <id>', 'workflow id')
|
|
288
|
-
.option('--node <id>', 'node id')
|
|
289
|
-
.option('--reason <reason>', `terminal reason: ${TERMINAL_REASONS.join(' | ')}`)
|
|
290
|
-
.option('--session-id <sid>', 'session id')
|
|
291
|
-
.option('--project <path>', 'project root')
|
|
292
|
-
.option('--json', 'json output')
|
|
293
|
-
.action((options) => {
|
|
294
|
-
const asJson = options.json === true;
|
|
295
|
-
try {
|
|
296
|
-
const workflowId = options.workflow ?? '';
|
|
297
|
-
if (!workflowId)
|
|
298
|
-
throw new Error('workflowId is required');
|
|
299
|
-
const nodeId = options.node ?? '';
|
|
300
|
-
if (!nodeId)
|
|
301
|
-
throw new Error('nodeId is required');
|
|
302
|
-
const reason = options.reason ?? 'unknown';
|
|
303
|
-
if (!TERMINAL_REASONS.includes(reason)) {
|
|
304
|
-
throw new Error(`PEAKS_TERMINAL_REASON_INVALID: ${reason}`);
|
|
305
|
-
}
|
|
306
|
-
printResult(io, ok('workflow.node.mark-lost', {
|
|
307
|
-
envelopeVersion: '4.0.8',
|
|
308
|
-
workflowId,
|
|
309
|
-
nodeId,
|
|
310
|
-
status: 'lost',
|
|
311
|
-
terminalReason: reason
|
|
312
|
-
}), asJson);
|
|
313
|
-
}
|
|
314
|
-
catch (err) {
|
|
315
|
-
const code = err.code ?? 'PEAKS_TERMINAL_REASON_INVALID';
|
|
316
|
-
printResult(io, fail('workflow.node.mark-lost', code, getErrorMessage(err), { node: null }, []), asJson);
|
|
317
|
-
process.exitCode = 1;
|
|
318
|
-
}
|
|
319
|
-
});
|
|
320
|
-
addJsonOption(workflow
|
|
321
|
-
.command('terminalize')
|
|
322
|
-
.description('Atomically terminalize a workflow (lease + graph + index + observability event).')
|
|
323
|
-
.requiredOption('--workflow <id>', 'workflow id')
|
|
324
|
-
.requiredOption('--reason <reason>', `terminal reason: ${TERMINAL_REASONS.join(' | ')}`)
|
|
325
|
-
.option('--session-id <sid>', 'session id')
|
|
326
|
-
.option('--project <path>', 'project root')
|
|
327
|
-
.option('--require-consumed', 'fail if there are unconsumed envelopes')).action(async (options) => {
|
|
328
|
-
const asJson = options.json === true;
|
|
329
|
-
try {
|
|
330
|
-
const callerId = deriveCallerId();
|
|
331
|
-
const sessionId = deriveSessionId(options);
|
|
332
|
-
const projectRoot = deriveProjectRoot(options);
|
|
333
|
-
const workflowId = options.workflow ?? '';
|
|
334
|
-
if (!workflowId)
|
|
335
|
-
throw new Error('workflowId is required');
|
|
336
|
-
if (!TERMINAL_REASONS.includes(options.reason)) {
|
|
337
|
-
throw new Error(`PEAKS_TERMINAL_REASON_INVALID: ${options.reason}`);
|
|
338
|
-
}
|
|
339
|
-
const result = await terminalizeWorkflow({
|
|
340
|
-
projectRoot,
|
|
341
|
-
sessionId,
|
|
342
|
-
callerId,
|
|
343
|
-
workflowId,
|
|
344
|
-
graphRef: `graphs/${workflowId}.json`,
|
|
345
|
-
reason: options.reason,
|
|
346
|
-
...(options.requireConsumed ? { requireConsumed: true } : {})
|
|
347
|
-
});
|
|
348
|
-
printResult(io, ok('workflow.terminalize', {
|
|
349
|
-
envelopeVersion: '4.0.8',
|
|
350
|
-
lease: result.lease,
|
|
351
|
-
graph: result.graph,
|
|
352
|
-
events: result.events,
|
|
353
|
-
indexCleared: result.indexCleared
|
|
354
|
-
}), asJson);
|
|
355
|
-
}
|
|
356
|
-
catch (err) {
|
|
357
|
-
const code = err.code ?? 'PEAKS_TERMINALIZE_ATOMICITY_FAILED';
|
|
358
|
-
printResult(io, fail('workflow.terminalize', code, getErrorMessage(err), { lease: null }, []), asJson);
|
|
359
|
-
process.exitCode = 1;
|
|
360
|
-
}
|
|
361
|
-
});
|
|
362
|
-
// Suppress unused-import warnings for symbols reserved for future slices.
|
|
363
|
-
void transitionLease;
|
|
364
|
-
void emptyGraph;
|
|
27
|
+
registerWorkflowInitCommand(workflow, io);
|
|
28
|
+
registerWorkflowGraphCommands(workflow, io);
|
|
29
|
+
registerWorkflowNodeCommands(workflow, io);
|
|
30
|
+
registerWorkflowTerminalizeCommand(workflow, io);
|
|
365
31
|
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// src/cli/commands/workflow-node-commands.ts
|
|
2
|
+
//
|
|
3
|
+
// `peaks workflow node prepare` / `node ack` / `node mark-lost` — the workflow
|
|
4
|
+
// node lifecycle verbs. Split out of `workflow-lifecycle-commands.ts`; every
|
|
5
|
+
// verb name, option and envelope shape is unchanged.
|
|
6
|
+
import { fail, getErrorMessage, ok } from 'peaks-loop-shared/result';
|
|
7
|
+
import { printResult } from '../cli-helpers.js';
|
|
8
|
+
import { readGraph } from '../../services/workflow/workflow-graph-store.js';
|
|
9
|
+
import { prepareNodeAction, transitionNode } from '../../services/workflow/workflow-node-lifecycle.js';
|
|
10
|
+
import { TERMINAL_REASONS, WORKFLOW_ID_REGEX } from '../../services/workflow/workflow-graph-types.js';
|
|
11
|
+
import { deriveProjectRoot, deriveSessionId, GENERATED_ID_RADIX } from './workflow-command-shared.js';
|
|
12
|
+
/** The comma-separated `--depends-on` list, trimmed, with empties removed. */
|
|
13
|
+
function parseDependsOn(raw) {
|
|
14
|
+
return (raw ?? '')
|
|
15
|
+
.split(',')
|
|
16
|
+
.map((s) => s.trim())
|
|
17
|
+
.filter((s) => s.length > 0);
|
|
18
|
+
}
|
|
19
|
+
/** The node this `prepare` acts on: the one already in the graph, or the new default. */
|
|
20
|
+
function prepareGraphNode(existing, request) {
|
|
21
|
+
return (existing.nodes.find((n) => n.id === request.nodeId) ?? {
|
|
22
|
+
id: request.nodeId,
|
|
23
|
+
kind: request.kind,
|
|
24
|
+
label: request.label ?? request.nodeId,
|
|
25
|
+
status: 'prepared',
|
|
26
|
+
dependsOn: request.dependsOn
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function runWorkflowNodePrepare(io, options) {
|
|
30
|
+
const asJson = options.json === true;
|
|
31
|
+
try {
|
|
32
|
+
const sessionId = deriveSessionId(options);
|
|
33
|
+
const projectRoot = deriveProjectRoot(options);
|
|
34
|
+
const workflowId = options.workflow ?? '';
|
|
35
|
+
if (!workflowId || !WORKFLOW_ID_REGEX.test(workflowId)) {
|
|
36
|
+
throw new Error('workflowId is required');
|
|
37
|
+
}
|
|
38
|
+
const graphRef = `graphs/${workflowId}.json`;
|
|
39
|
+
const existing = readGraph({ projectRoot, sessionId, graphRef, workflowId });
|
|
40
|
+
const nodeId = options.node ?? `node-${Date.now().toString(GENERATED_ID_RADIX)}`;
|
|
41
|
+
const kind = (options.kind ?? 'step');
|
|
42
|
+
const dependsOn = parseDependsOn(options.dependsOn);
|
|
43
|
+
const updated = prepareNodeAction({
|
|
44
|
+
workflowId,
|
|
45
|
+
nodeId,
|
|
46
|
+
graphNode: prepareGraphNode(existing, {
|
|
47
|
+
nodeId,
|
|
48
|
+
kind,
|
|
49
|
+
label: options.label,
|
|
50
|
+
dependsOn
|
|
51
|
+
}),
|
|
52
|
+
dependsOn,
|
|
53
|
+
status: 'prepared'
|
|
54
|
+
});
|
|
55
|
+
// Persist via the graph store
|
|
56
|
+
// (not inlined so the CLI delegates everything to the service).
|
|
57
|
+
printResult(io, ok('workflow.node.prepare', { envelopeVersion: '4.0.8', graph: updated }), asJson);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
const code = err.code ?? 'PEAKS_GRAPH_CORRUPTED';
|
|
61
|
+
printResult(io, fail('workflow.node.prepare', code, getErrorMessage(err), { graph: null }, []), asJson);
|
|
62
|
+
process.exitCode = 1;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function runWorkflowNodeAck(io, options) {
|
|
66
|
+
const asJson = options.json === true;
|
|
67
|
+
try {
|
|
68
|
+
const sessionId = deriveSessionId(options);
|
|
69
|
+
const projectRoot = deriveProjectRoot(options);
|
|
70
|
+
const workflowId = options.workflow ?? '';
|
|
71
|
+
if (!workflowId)
|
|
72
|
+
throw new Error('workflowId is required');
|
|
73
|
+
const graphRef = `graphs/${workflowId}.json`;
|
|
74
|
+
const graph = readGraph({ projectRoot, sessionId, graphRef, workflowId });
|
|
75
|
+
const nodeId = options.node ?? '';
|
|
76
|
+
const node = graph.nodes.find((n) => n.id === nodeId);
|
|
77
|
+
if (!node)
|
|
78
|
+
throw new Error(`node ${nodeId} not found`);
|
|
79
|
+
if (node.status !== 'envelope-received') {
|
|
80
|
+
throw new Error('PEAKS_ENVELOPE_NOT_RECEIVED: node is not envelope-received');
|
|
81
|
+
}
|
|
82
|
+
const updated = transitionNode(node.status, 'consumed-by-parent', { graphNode: node });
|
|
83
|
+
printResult(io, ok('workflow.node.ack', { envelopeVersion: '4.0.8', node: updated }), asJson);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
const code = err.code ?? 'PEAKS_ENVELOPE_NOT_RECEIVED';
|
|
87
|
+
printResult(io, fail('workflow.node.ack', code, getErrorMessage(err), { node: null }, []), asJson);
|
|
88
|
+
process.exitCode = 1;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function runWorkflowNodeMarkLost(io, options) {
|
|
92
|
+
const asJson = options.json === true;
|
|
93
|
+
try {
|
|
94
|
+
const workflowId = options.workflow ?? '';
|
|
95
|
+
if (!workflowId)
|
|
96
|
+
throw new Error('workflowId is required');
|
|
97
|
+
const nodeId = options.node ?? '';
|
|
98
|
+
if (!nodeId)
|
|
99
|
+
throw new Error('nodeId is required');
|
|
100
|
+
const reason = options.reason ?? 'unknown';
|
|
101
|
+
if (!TERMINAL_REASONS.includes(reason)) {
|
|
102
|
+
throw new Error(`PEAKS_TERMINAL_REASON_INVALID: ${reason}`);
|
|
103
|
+
}
|
|
104
|
+
printResult(io, ok('workflow.node.mark-lost', {
|
|
105
|
+
envelopeVersion: '4.0.8',
|
|
106
|
+
workflowId,
|
|
107
|
+
nodeId,
|
|
108
|
+
status: 'lost',
|
|
109
|
+
terminalReason: reason
|
|
110
|
+
}), asJson);
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
const code = err.code ?? 'PEAKS_TERMINAL_REASON_INVALID';
|
|
114
|
+
printResult(io, fail('workflow.node.mark-lost', code, getErrorMessage(err), { node: null }, []), asJson);
|
|
115
|
+
process.exitCode = 1;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export function registerWorkflowNodeCommands(workflow, io) {
|
|
119
|
+
// Reuse one `node` parent for prepare / ack / mark-lost (Commander v12
|
|
120
|
+
// creates a NEW parent per `.command('node X')` call, so we must
|
|
121
|
+
// explicitly create the parent first to avoid duplicate-registration).
|
|
122
|
+
const nodeCmd = workflow.command('node').description('workflow node commands');
|
|
123
|
+
nodeCmd
|
|
124
|
+
.command('prepare')
|
|
125
|
+
.description('Prepare a node in a workflow graph.')
|
|
126
|
+
.option('--workflow <id>', 'workflow id')
|
|
127
|
+
.option('--node <id>', 'node id')
|
|
128
|
+
.option('--kind <k>', 'node kind: step | dispatch | terminal')
|
|
129
|
+
.option('--label <text>', 'human-readable label')
|
|
130
|
+
.option('--depends-on <ids>', 'comma-separated list of dependency node ids')
|
|
131
|
+
.option('--session-id <sid>', 'session id')
|
|
132
|
+
.option('--project <path>', 'project root')
|
|
133
|
+
.option('--json', 'json output')
|
|
134
|
+
.action((options) => runWorkflowNodePrepare(io, options));
|
|
135
|
+
nodeCmd
|
|
136
|
+
.command('ack')
|
|
137
|
+
.description('Acknowledge a node that has an envelope-received status.')
|
|
138
|
+
.option('--workflow <id>', 'workflow id')
|
|
139
|
+
.option('--node <id>', 'node id')
|
|
140
|
+
.option('--session-id <sid>', 'session id')
|
|
141
|
+
.option('--project <path>', 'project root')
|
|
142
|
+
.option('--json', 'json output')
|
|
143
|
+
.action((options) => runWorkflowNodeAck(io, options));
|
|
144
|
+
nodeCmd
|
|
145
|
+
.command('mark-lost')
|
|
146
|
+
.description('Mark a node as lost.')
|
|
147
|
+
.option('--workflow <id>', 'workflow id')
|
|
148
|
+
.option('--node <id>', 'node id')
|
|
149
|
+
.option('--reason <reason>', `terminal reason: ${TERMINAL_REASONS.join(' | ')}`)
|
|
150
|
+
.option('--session-id <sid>', 'session id')
|
|
151
|
+
.option('--project <path>', 'project root')
|
|
152
|
+
.option('--json', 'json output')
|
|
153
|
+
.action((options) => runWorkflowNodeMarkLost(io, options));
|
|
154
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// src/cli/commands/workflow-terminalize-command.ts
|
|
2
|
+
//
|
|
3
|
+
// `peaks workflow terminalize` — atomically terminalize a workflow (lease +
|
|
4
|
+
// graph + index + observability event). Split out of
|
|
5
|
+
// `workflow-lifecycle-commands.ts`; the verb name, its options, the
|
|
6
|
+
// `--require-consumed` passthrough and the envelope shape are unchanged.
|
|
7
|
+
import { fail, getErrorMessage, ok } from 'peaks-loop-shared/result';
|
|
8
|
+
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
9
|
+
import { terminalizeWorkflow } from '../../services/workflow/workflow-presence-lifecycle.js';
|
|
10
|
+
import { TERMINAL_REASONS } from '../../services/workflow/workflow-graph-types.js';
|
|
11
|
+
import { deriveCallerId, deriveProjectRoot, deriveSessionId } from './workflow-command-shared.js';
|
|
12
|
+
async function runWorkflowTerminalize(io, options) {
|
|
13
|
+
const asJson = options.json === true;
|
|
14
|
+
try {
|
|
15
|
+
const callerId = deriveCallerId();
|
|
16
|
+
const sessionId = deriveSessionId(options);
|
|
17
|
+
const projectRoot = deriveProjectRoot(options);
|
|
18
|
+
const workflowId = options.workflow ?? '';
|
|
19
|
+
if (!workflowId)
|
|
20
|
+
throw new Error('workflowId is required');
|
|
21
|
+
if (!TERMINAL_REASONS.includes(options.reason)) {
|
|
22
|
+
throw new Error(`PEAKS_TERMINAL_REASON_INVALID: ${options.reason}`);
|
|
23
|
+
}
|
|
24
|
+
const result = await terminalizeWorkflow({
|
|
25
|
+
projectRoot,
|
|
26
|
+
sessionId,
|
|
27
|
+
callerId,
|
|
28
|
+
workflowId,
|
|
29
|
+
graphRef: `graphs/${workflowId}.json`,
|
|
30
|
+
reason: options.reason,
|
|
31
|
+
...(options.requireConsumed ? { requireConsumed: true } : {})
|
|
32
|
+
});
|
|
33
|
+
printResult(io, ok('workflow.terminalize', {
|
|
34
|
+
envelopeVersion: '4.0.8',
|
|
35
|
+
lease: result.lease,
|
|
36
|
+
graph: result.graph,
|
|
37
|
+
events: result.events,
|
|
38
|
+
indexCleared: result.indexCleared
|
|
39
|
+
}), asJson);
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
const code = err.code ?? 'PEAKS_TERMINALIZE_ATOMICITY_FAILED';
|
|
43
|
+
printResult(io, fail('workflow.terminalize', code, getErrorMessage(err), { lease: null }, []), asJson);
|
|
44
|
+
process.exitCode = 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function registerWorkflowTerminalizeCommand(workflow, io) {
|
|
48
|
+
addJsonOption(workflow
|
|
49
|
+
.command('terminalize')
|
|
50
|
+
.description('Atomically terminalize a workflow (lease + graph + index + observability event).')
|
|
51
|
+
.requiredOption('--workflow <id>', 'workflow id')
|
|
52
|
+
.requiredOption('--reason <reason>', `terminal reason: ${TERMINAL_REASONS.join(' | ')}`)
|
|
53
|
+
.option('--session-id <sid>', 'session id')
|
|
54
|
+
.option('--project <path>', 'project root')
|
|
55
|
+
.option('--require-consumed', 'fail if there are unconsumed envelopes')).action((options) => runWorkflowTerminalize(io, options));
|
|
56
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { type HarnessWindowSyncResult } from '../context/harness-window-config.js';
|
|
2
|
+
import type { ConvergencePlan } from '../context/auto-compact-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* What the caller is told to do next. The harness-window notice rides along because
|
|
5
|
+
* the run also rewrites the harness's own settings, so it says so too: the user
|
|
6
|
+
* accepted that write on the condition 要告知, and a write only one of the two
|
|
7
|
+
* syncing commands reports is not a notice.
|
|
8
|
+
*/
|
|
9
|
+
export declare function compactNextActions(isRedLine: boolean, harnessWindow: HarnessWindowSyncResult | null): readonly string[];
|
|
10
|
+
/**
|
|
11
|
+
* Append a one-row convergence decision to the LLM-readable log.
|
|
12
|
+
* The LLM reads this on the post-compact turn to pick up exactly
|
|
13
|
+
* where it left off (vs. blindly trusting the IDE's compressed
|
|
14
|
+
* transcript).
|
|
15
|
+
*/
|
|
16
|
+
export declare function appendAutoDecisionLog(input: {
|
|
17
|
+
readonly projectRoot: string;
|
|
18
|
+
readonly sessionId: string;
|
|
19
|
+
readonly plan: ConvergencePlan;
|
|
20
|
+
}): void;
|
|
21
|
+
/**
|
|
22
|
+
* main-session compact intent so the main-session LLM picks it up on
|
|
23
|
+
* its next turn and fires `/compact` in-band. Without this file the
|
|
24
|
+
* orchestrator's "main-session compact" request is invisible to the
|
|
25
|
+
* main Claude Code window (defeats the whole point of auto-compact
|
|
26
|
+
* for the main context).
|
|
27
|
+
*
|
|
28
|
+
* The file is gitignored under `.peaks/_runtime/<sessionId>/txt/` and
|
|
29
|
+
* is one-shot: the LLM should `mv` it to `.consumed` after firing
|
|
30
|
+
* `/compact`. A re-run will overwrite.
|
|
31
|
+
*
|
|
32
|
+
* write survives, but nothing consumes the file, and its `nextAction` asks
|
|
33
|
+
* for a `/compact` the model cannot invoke (the Skill tool exposes only
|
|
34
|
+
* `/init` and `/security-review`; hooks can observe or veto, never initiate).
|
|
35
|
+
* Retained deliberately for the sibling A2 slice, which owns harness-side
|
|
36
|
+
* state re-injection. Not a capability peaks-loop has today.
|
|
37
|
+
*/
|
|
38
|
+
export declare function writeMainSessionCompactIntent(input: {
|
|
39
|
+
readonly projectRoot: string;
|
|
40
|
+
readonly sessionId: string;
|
|
41
|
+
readonly ratio: number;
|
|
42
|
+
readonly redLine: boolean;
|
|
43
|
+
readonly now: Date;
|
|
44
|
+
}): void;
|
|
45
|
+
/**
|
|
46
|
+
* Write a pre-compact checkpoint. The shape mirrors `peaks session
|
|
47
|
+
* checkpoint` so D7's post-compact-detect picks it up unchanged.
|
|
48
|
+
*/
|
|
49
|
+
export declare function writePreCompactCheckpoint(input: {
|
|
50
|
+
readonly projectRoot: string;
|
|
51
|
+
readonly sessionId: string;
|
|
52
|
+
readonly now: Date;
|
|
53
|
+
readonly redLine?: boolean;
|
|
54
|
+
}): string;
|