peaks-loop 4.1.3 → 4.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +56 -0
- package/README-en.md +1 -1
- package/README.md +1 -1
- package/dist/cli/commands/asset-command-shared.d.ts +12 -0
- package/dist/cli/commands/asset-command-shared.js +45 -0
- package/dist/cli/commands/asset-commands.d.ts +6 -1
- package/dist/cli/commands/asset-commands.js +11 -372
- package/dist/cli/commands/asset-crystallize-command.d.ts +3 -0
- package/dist/cli/commands/asset-crystallize-command.js +60 -0
- package/dist/cli/commands/asset-crystallize-payload.d.ts +47 -0
- package/dist/cli/commands/asset-crystallize-payload.js +85 -0
- package/dist/cli/commands/asset-crystallize-runner.d.ts +3 -0
- package/dist/cli/commands/asset-crystallize-runner.js +133 -0
- package/dist/cli/commands/asset-dispose-command.d.ts +3 -0
- package/dist/cli/commands/asset-dispose-command.js +99 -0
- package/dist/cli/commands/asset-status-command.d.ts +3 -0
- package/dist/cli/commands/asset-status-command.js +100 -0
- package/dist/cli/commands/baseline-audit-command.d.ts +3 -0
- package/dist/cli/commands/baseline-audit-command.js +64 -0
- package/dist/cli/commands/baseline-command-shared.d.ts +23 -0
- package/dist/cli/commands/baseline-command-shared.js +39 -0
- package/dist/cli/commands/baseline-commands.js +33 -313
- package/dist/cli/commands/baseline-freeze-commands.d.ts +4 -0
- package/dist/cli/commands/baseline-freeze-commands.js +81 -0
- package/dist/cli/commands/baseline-guard-command.d.ts +3 -0
- package/dist/cli/commands/baseline-guard-command.js +52 -0
- package/dist/cli/commands/baseline-read-commands.d.ts +5 -0
- package/dist/cli/commands/baseline-read-commands.js +72 -0
- package/dist/cli/commands/baseline-rollback-commands.d.ts +4 -0
- package/dist/cli/commands/baseline-rollback-commands.js +88 -0
- package/dist/cli/commands/classify-downgrade-command.d.ts +9 -0
- package/dist/cli/commands/classify-downgrade-command.js +21 -0
- package/dist/cli/commands/classify-run-command.d.ts +9 -0
- package/dist/cli/commands/classify-run-command.js +73 -0
- package/dist/cli/commands/classify-signals.d.ts +5 -0
- package/dist/cli/commands/classify-signals.js +104 -0
- package/dist/cli/commands/code-emit-handoff-command.js +40 -3
- package/dist/cli/commands/code-gate-step-08-command.js +25 -9
- package/dist/cli/commands/codegraph-command-options.d.ts +22 -0
- package/dist/cli/commands/codegraph-command-options.js +22 -0
- package/dist/cli/commands/codegraph-commands.d.ts +2 -2
- package/dist/cli/commands/codegraph-commands.js +14 -397
- package/dist/cli/commands/codegraph-config-restore-command.d.ts +3 -0
- package/dist/cli/commands/codegraph-config-restore-command.js +200 -0
- package/dist/cli/commands/codegraph-proxy-commands.d.ts +10 -0
- package/dist/cli/commands/codegraph-proxy-commands.js +159 -0
- package/dist/cli/commands/codegraph-repair-commands.d.ts +3 -0
- package/dist/cli/commands/codegraph-repair-commands.js +94 -0
- package/dist/cli/commands/codegraph-status-command.d.ts +1 -1
- package/dist/cli/commands/codegraph-status-command.js +27 -214
- package/dist/cli/commands/codegraph-status-integrity.d.ts +44 -0
- package/dist/cli/commands/codegraph-status-integrity.js +121 -0
- package/dist/cli/commands/codegraph-status-json.d.ts +5 -0
- package/dist/cli/commands/codegraph-status-json.js +127 -0
- package/dist/cli/commands/container-command-shared.d.ts +60 -0
- package/dist/cli/commands/container-command-shared.js +52 -0
- package/dist/cli/commands/container-commands.d.ts +1 -1
- package/dist/cli/commands/container-commands.js +4 -216
- package/dist/cli/commands/container-release-command.d.ts +3 -0
- package/dist/cli/commands/container-release-command.js +105 -0
- package/dist/cli/commands/container-spawn-command.d.ts +3 -0
- package/dist/cli/commands/container-spawn-command.js +148 -0
- package/dist/cli/commands/context-check-command.d.ts +3 -0
- package/dist/cli/commands/context-check-command.js +81 -0
- package/dist/cli/commands/context-commands.d.ts +2 -7
- package/dist/cli/commands/context-commands.js +6 -276
- package/dist/cli/commands/context-layer-command.d.ts +3 -0
- package/dist/cli/commands/context-layer-command.js +34 -0
- package/dist/cli/commands/context-layer-fetchers.d.ts +15 -0
- package/dist/cli/commands/context-layer-fetchers.js +162 -0
- package/dist/cli/commands/context-status-command.d.ts +17 -0
- package/dist/cli/commands/context-status-command.js +41 -0
- package/dist/cli/commands/contract-write-command.d.ts +3 -0
- package/dist/cli/commands/contract-write-command.js +144 -0
- package/dist/cli/commands/core/doctor-bindings.d.ts +17 -0
- package/dist/cli/commands/core/doctor-bindings.js +30 -0
- package/dist/cli/commands/core/doctor-command.d.ts +4 -18
- package/dist/cli/commands/core/doctor-command.js +2 -323
- package/dist/cli/commands/core/doctor-logs.d.ts +8 -0
- package/dist/cli/commands/core/doctor-logs.js +32 -0
- package/dist/cli/commands/core/doctor-probes.d.ts +3 -0
- package/dist/cli/commands/core/doctor-probes.js +55 -0
- package/dist/cli/commands/core/doctor-run-command.d.ts +12 -0
- package/dist/cli/commands/core/doctor-run-command.js +172 -0
- package/dist/cli/commands/core/doctor-summary.d.ts +7 -0
- package/dist/cli/commands/core/doctor-summary.js +39 -0
- package/dist/cli/commands/core/memory-command-shared.d.ts +25 -0
- package/dist/cli/commands/core/memory-command-shared.js +20 -0
- package/dist/cli/commands/core/memory-command.d.ts +1 -1
- package/dist/cli/commands/core/memory-command.js +6 -227
- package/dist/cli/commands/core/memory-delegated-verbs.d.ts +4 -0
- package/dist/cli/commands/core/memory-delegated-verbs.js +178 -0
- package/dist/cli/commands/core/memory-extract-command.d.ts +3 -0
- package/dist/cli/commands/core/memory-extract-command.js +90 -0
- package/dist/cli/commands/core/memory-sync-command.d.ts +3 -0
- package/dist/cli/commands/core/memory-sync-command.js +38 -0
- package/dist/cli/commands/core/session-command.d.ts +1 -1
- package/dist/cli/commands/core/session-command.js +12 -206
- package/dist/cli/commands/core/session-info-command.d.ts +3 -0
- package/dist/cli/commands/core/session-info-command.js +142 -0
- package/dist/cli/commands/core/session-verb-commands.d.ts +5 -0
- package/dist/cli/commands/core/session-verb-commands.js +58 -0
- package/dist/cli/commands/core/standards-command.d.ts +1 -24
- package/dist/cli/commands/core/standards-command.js +33 -201
- package/dist/cli/commands/core/standards-init-command.d.ts +3 -0
- package/dist/cli/commands/core/standards-init-command.js +87 -0
- package/dist/cli/commands/core/standards-lint.d.ts +24 -0
- package/dist/cli/commands/core/standards-lint.js +57 -0
- package/dist/cli/commands/core/standards-migrate-command.d.ts +3 -0
- package/dist/cli/commands/core/standards-migrate-command.js +57 -0
- package/dist/cli/commands/cron-scheduler-commands.d.ts +5 -1
- package/dist/cli/commands/cron-scheduler-commands.js +36 -206
- package/dist/cli/commands/cron-scheduler-run-once-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-run-once-command.js +35 -0
- package/dist/cli/commands/cron-scheduler-shared.d.ts +6 -0
- package/dist/cli/commands/cron-scheduler-shared.js +48 -0
- package/dist/cli/commands/cron-scheduler-start-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-start-command.js +65 -0
- package/dist/cli/commands/cron-scheduler-status-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-status-command.js +46 -0
- package/dist/cli/commands/cron-scheduler-stop-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-stop-command.js +61 -0
- package/dist/cli/commands/dispatch-dag-envelope.d.ts +41 -0
- package/dist/cli/commands/dispatch-dag-envelope.js +49 -0
- package/dist/cli/commands/dispatch-dag-failure.d.ts +18 -0
- package/dist/cli/commands/dispatch-dag-failure.js +16 -0
- package/dist/cli/commands/dispatch-dag-preflight.d.ts +51 -0
- package/dist/cli/commands/dispatch-dag-preflight.js +105 -0
- package/dist/cli/commands/dispatch-dag-runners.d.ts +48 -0
- package/dist/cli/commands/dispatch-dag-runners.js +73 -0
- package/dist/cli/commands/dispatch-from-dag.d.ts +27 -0
- package/dist/cli/commands/dispatch-from-dag.js +87 -257
- package/dist/cli/commands/final-review-command-envelopes.d.ts +44 -0
- package/dist/cli/commands/final-review-command-envelopes.js +100 -0
- package/dist/cli/commands/final-review-command-shared.d.ts +52 -0
- package/dist/cli/commands/final-review-command-shared.js +35 -0
- package/dist/cli/commands/final-review-commands.d.ts +7 -27
- package/dist/cli/commands/final-review-commands.js +13 -240
- package/dist/cli/commands/final-review-prepare-command.d.ts +3 -0
- package/dist/cli/commands/final-review-prepare-command.js +200 -0
- package/dist/cli/commands/governance-classify-contract-commands.d.ts +23 -9
- package/dist/cli/commands/governance-classify-contract-commands.js +26 -269
- package/dist/cli/commands/hooks-command-shared.d.ts +42 -0
- package/dist/cli/commands/hooks-command-shared.js +32 -0
- package/dist/cli/commands/hooks-commands.d.ts +20 -0
- package/dist/cli/commands/hooks-commands.js +75 -309
- package/dist/cli/commands/hooks-install-envelopes.d.ts +6 -0
- package/dist/cli/commands/hooks-install-envelopes.js +144 -0
- package/dist/cli/commands/hooks-status-command.d.ts +3 -0
- package/dist/cli/commands/hooks-status-command.js +93 -0
- package/dist/cli/commands/hooks-uninstall-command.d.ts +3 -0
- package/dist/cli/commands/hooks-uninstall-command.js +43 -0
- package/dist/cli/commands/loop-command-shared.d.ts +31 -0
- package/dist/cli/commands/loop-command-shared.js +15 -0
- package/dist/cli/commands/loop-commands.d.ts +12 -17
- package/dist/cli/commands/loop-commands.js +56 -238
- package/dist/cli/commands/loop-export-command.d.ts +3 -0
- package/dist/cli/commands/loop-export-command.js +73 -0
- package/dist/cli/commands/loop-goal-compose-command.d.ts +3 -0
- package/dist/cli/commands/loop-goal-compose-command.js +36 -0
- package/dist/cli/commands/loop-import-command.d.ts +3 -0
- package/dist/cli/commands/loop-import-command.js +86 -0
- package/dist/cli/commands/loop-placeholder-commands.d.ts +3 -0
- package/dist/cli/commands/loop-placeholder-commands.js +52 -0
- package/dist/cli/commands/memory-command-shared.d.ts +59 -0
- package/dist/cli/commands/memory-command-shared.js +39 -0
- package/dist/cli/commands/memory-commands.d.ts +6 -79
- package/dist/cli/commands/memory-commands.js +19 -309
- package/dist/cli/commands/memory-ingest-command.d.ts +3 -0
- package/dist/cli/commands/memory-ingest-command.js +50 -0
- package/dist/cli/commands/memory-list-command.d.ts +16 -0
- package/dist/cli/commands/memory-list-command.js +129 -0
- package/dist/cli/commands/memory-reindex-command.d.ts +9 -0
- package/dist/cli/commands/memory-reindex-command.js +78 -0
- package/dist/cli/commands/memory-rotate-command.d.ts +3 -0
- package/dist/cli/commands/memory-rotate-command.js +55 -0
- package/dist/cli/commands/memory-search-command.d.ts +7 -0
- package/dist/cli/commands/memory-search-command.js +46 -0
- package/dist/cli/commands/openspec-archive-command.d.ts +3 -0
- package/dist/cli/commands/openspec-archive-command.js +55 -0
- package/dist/cli/commands/openspec-command-shared.d.ts +62 -0
- package/dist/cli/commands/openspec-command-shared.js +135 -0
- package/dist/cli/commands/openspec-commands.d.ts +1 -1
- package/dist/cli/commands/openspec-commands.js +33 -306
- package/dist/cli/commands/openspec-from-doctor-command.d.ts +3 -0
- package/dist/cli/commands/openspec-from-doctor-command.js +66 -0
- package/dist/cli/commands/openspec-init-command.d.ts +3 -0
- package/dist/cli/commands/openspec-init-command.js +49 -0
- package/dist/cli/commands/openspec-list-command.d.ts +3 -0
- package/dist/cli/commands/openspec-list-command.js +27 -0
- package/dist/cli/commands/openspec-render-command.d.ts +3 -0
- package/dist/cli/commands/openspec-render-command.js +33 -0
- package/dist/cli/commands/openspec-show-command.d.ts +3 -0
- package/dist/cli/commands/openspec-show-command.js +33 -0
- package/dist/cli/commands/openspec-to-rd-command.d.ts +3 -0
- package/dist/cli/commands/openspec-to-rd-command.js +33 -0
- package/dist/cli/commands/openspec-validate-command.d.ts +3 -0
- package/dist/cli/commands/openspec-validate-command.js +45 -0
- package/dist/cli/commands/playwright-browser-command.d.ts +8 -0
- package/dist/cli/commands/playwright-browser-command.js +61 -0
- package/dist/cli/commands/playwright-commands.d.ts +10 -62
- package/dist/cli/commands/playwright-commands.js +77 -400
- package/dist/cli/commands/playwright-envelope.d.ts +8 -0
- package/dist/cli/commands/playwright-envelope.js +29 -0
- package/dist/cli/commands/playwright-ls-stop-commands.d.ts +4 -0
- package/dist/cli/commands/playwright-ls-stop-commands.js +74 -0
- package/dist/cli/commands/playwright-session-store.d.ts +65 -0
- package/dist/cli/commands/playwright-session-store.js +189 -0
- package/dist/cli/commands/project-commands.d.ts +19 -0
- package/dist/cli/commands/project-commands.js +98 -259
- package/dist/cli/commands/project-context-command.d.ts +3 -0
- package/dist/cli/commands/project-context-command.js +44 -0
- package/dist/cli/commands/project-dashboard-command.d.ts +3 -0
- package/dist/cli/commands/project-dashboard-command.js +74 -0
- package/dist/cli/commands/project-knowledge-command.d.ts +3 -0
- package/dist/cli/commands/project-knowledge-command.js +48 -0
- package/dist/cli/commands/project-memories-show-command.d.ts +3 -0
- package/dist/cli/commands/project-memories-show-command.js +87 -0
- package/dist/cli/commands/project-memory-index-command.d.ts +3 -0
- package/dist/cli/commands/project-memory-index-command.js +31 -0
- package/dist/cli/commands/qa-archive-screenshots-command.d.ts +3 -0
- package/dist/cli/commands/qa-archive-screenshots-command.js +53 -0
- package/dist/cli/commands/qa-commands.d.ts +14 -87
- package/dist/cli/commands/qa-commands.js +17 -315
- package/dist/cli/commands/qa-context-prestep.d.ts +1 -0
- package/dist/cli/commands/qa-context-prestep.js +34 -0
- package/dist/cli/commands/qa-run-command.d.ts +3 -0
- package/dist/cli/commands/qa-run-command.js +105 -0
- package/dist/cli/commands/qa-run-options.d.ts +23 -0
- package/dist/cli/commands/qa-run-options.js +31 -0
- package/dist/cli/commands/qa-run-slice.d.ts +41 -0
- package/dist/cli/commands/qa-run-slice.js +145 -0
- package/dist/cli/commands/release-canary-command.d.ts +28 -0
- package/dist/cli/commands/release-canary-command.js +129 -0
- package/dist/cli/commands/release-command-shared.d.ts +13 -0
- package/dist/cli/commands/release-command-shared.js +18 -0
- package/dist/cli/commands/release-commands.d.ts +10 -18
- package/dist/cli/commands/release-commands.js +25 -298
- package/dist/cli/commands/release-done-command.d.ts +3 -0
- package/dist/cli/commands/release-done-command.js +64 -0
- package/dist/cli/commands/release-hotfix-command.d.ts +3 -0
- package/dist/cli/commands/release-hotfix-command.js +50 -0
- package/dist/cli/commands/release-plan-command.d.ts +3 -0
- package/dist/cli/commands/release-plan-command.js +33 -0
- package/dist/cli/commands/release-precheck-command.d.ts +3 -0
- package/dist/cli/commands/release-precheck-command.js +28 -0
- package/dist/cli/commands/release-promote-command.d.ts +3 -0
- package/dist/cli/commands/release-promote-command.js +34 -0
- package/dist/cli/commands/release-rollback-command.d.ts +3 -0
- package/dist/cli/commands/release-rollback-command.js +33 -0
- package/dist/cli/commands/release-watch-command.d.ts +3 -0
- package/dist/cli/commands/release-watch-command.js +44 -0
- package/dist/cli/commands/sediment-argv-flags.d.ts +54 -0
- package/dist/cli/commands/sediment-argv-flags.js +116 -0
- package/dist/cli/commands/sediment-command-shared.d.ts +15 -0
- package/dist/cli/commands/sediment-command-shared.js +5 -0
- package/dist/cli/commands/sediment-commands.d.ts +35 -59
- package/dist/cli/commands/sediment-commands.js +36 -590
- package/dist/cli/commands/sediment-pool-commands.d.ts +9 -0
- package/dist/cli/commands/sediment-pool-commands.js +185 -0
- package/dist/cli/commands/sediment-query-commands.d.ts +4 -0
- package/dist/cli/commands/sediment-query-commands.js +94 -0
- package/dist/cli/commands/sediment-release-commands.d.ts +8 -0
- package/dist/cli/commands/sediment-release-commands.js +232 -0
- package/dist/cli/commands/sop-advance-command.d.ts +3 -0
- package/dist/cli/commands/sop-advance-command.js +160 -0
- package/dist/cli/commands/sop-check-command.d.ts +3 -0
- package/dist/cli/commands/sop-check-command.js +44 -0
- package/dist/cli/commands/sop-command-shared.d.ts +23 -0
- package/dist/cli/commands/sop-command-shared.js +18 -0
- package/dist/cli/commands/sop-commands.d.ts +15 -1
- package/dist/cli/commands/sop-commands.js +26 -240
- package/dist/cli/commands/sop-init-command.d.ts +3 -0
- package/dist/cli/commands/sop-init-command.js +51 -0
- package/dist/cli/commands/sop-lint-command.d.ts +3 -0
- package/dist/cli/commands/sop-lint-command.js +64 -0
- package/dist/cli/commands/sop-register-command.d.ts +3 -0
- package/dist/cli/commands/sop-register-command.js +48 -0
- package/dist/cli/commands/sop-registry-command.d.ts +3 -0
- package/dist/cli/commands/sop-registry-command.js +30 -0
- package/dist/cli/commands/statusline-command-shared.d.ts +73 -0
- package/dist/cli/commands/statusline-command-shared.js +90 -0
- package/dist/cli/commands/statusline-commands.d.ts +1 -19
- package/dist/cli/commands/statusline-commands.js +48 -287
- package/dist/cli/commands/statusline-compact-command.d.ts +4 -0
- package/dist/cli/commands/statusline-compact-command.js +54 -0
- package/dist/cli/commands/statusline-install-command.d.ts +3 -0
- package/dist/cli/commands/statusline-install-command.js +48 -0
- package/dist/cli/commands/statusline-render-command.d.ts +9 -0
- package/dist/cli/commands/statusline-render-command.js +55 -0
- package/dist/cli/commands/statusline-status-command.d.ts +3 -0
- package/dist/cli/commands/statusline-status-command.js +23 -0
- package/dist/cli/commands/statusline-uninstall-command.d.ts +3 -0
- package/dist/cli/commands/statusline-uninstall-command.js +23 -0
- package/dist/cli/commands/test-command-run-helpers.d.ts +27 -0
- package/dist/cli/commands/test-command-run-helpers.js +73 -0
- package/dist/cli/commands/test-command-runner-resolution.d.ts +57 -0
- package/dist/cli/commands/test-command-runner-resolution.js +183 -0
- package/dist/cli/commands/test-commands.d.ts +8 -56
- package/dist/cli/commands/test-commands.js +26 -249
- package/dist/cli/commands/vm-command-shared.d.ts +23 -0
- package/dist/cli/commands/vm-command-shared.js +23 -0
- package/dist/cli/commands/vm-commands.d.ts +1 -28
- package/dist/cli/commands/vm-commands.js +36 -270
- package/dist/cli/commands/vm-hypervisor-runtime.d.ts +15 -0
- package/dist/cli/commands/vm-hypervisor-runtime.js +64 -0
- package/dist/cli/commands/vm-release-command.d.ts +5 -0
- package/dist/cli/commands/vm-release-command.js +101 -0
- package/dist/cli/commands/vm-spawn-command.d.ts +5 -0
- package/dist/cli/commands/vm-spawn-command.js +177 -0
- package/dist/cli/commands/web-command-shared.d.ts +12 -0
- package/dist/cli/commands/web-command-shared.js +30 -0
- package/dist/cli/commands/web-commands.d.ts +7 -14
- package/dist/cli/commands/web-commands.js +6 -314
- package/dist/cli/commands/web-install-command.d.ts +10 -0
- package/dist/cli/commands/web-install-command.js +116 -0
- package/dist/cli/commands/web-lifecycle-commands.d.ts +9 -30
- package/dist/cli/commands/web-lifecycle-commands.js +14 -322
- package/dist/cli/commands/web-login-command.d.ts +14 -0
- package/dist/cli/commands/web-login-command.js +189 -0
- package/dist/cli/commands/web-op-payload.d.ts +22 -0
- package/dist/cli/commands/web-op-payload.js +89 -0
- package/dist/cli/commands/web-op-refusals.d.ts +37 -0
- package/dist/cli/commands/web-op-refusals.js +73 -0
- package/dist/cli/commands/web-op-runner.d.ts +14 -0
- package/dist/cli/commands/web-op-runner.js +166 -0
- package/dist/cli/commands/web-status-command.d.ts +4 -0
- package/dist/cli/commands/web-status-command.js +32 -0
- package/dist/cli/commands/web-stop-command.d.ts +10 -0
- package/dist/cli/commands/web-stop-command.js +59 -0
- package/dist/cli/commands/web-verb-specs.d.ts +18 -0
- package/dist/cli/commands/web-verb-specs.js +66 -0
- package/dist/cli/commands/workflow-command-shared.d.ts +102 -0
- package/dist/cli/commands/workflow-command-shared.js +74 -0
- package/dist/cli/commands/workflow-graph-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-graph-commands.js +73 -0
- package/dist/cli/commands/workflow-init-command.d.ts +3 -0
- package/dist/cli/commands/workflow-init-command.js +68 -0
- package/dist/cli/commands/workflow-lifecycle-commands.d.ts +9 -59
- package/dist/cli/commands/workflow-lifecycle-commands.js +14 -348
- package/dist/cli/commands/workflow-node-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-node-commands.js +154 -0
- package/dist/cli/commands/workflow-terminalize-command.d.ts +3 -0
- package/dist/cli/commands/workflow-terminalize-command.js +56 -0
- package/dist/services/code/auto-compact-artifacts.d.ts +54 -0
- package/dist/services/code/auto-compact-artifacts.js +135 -0
- package/dist/services/code/auto-compact-attempt.d.ts +46 -0
- package/dist/services/code/auto-compact-attempt.js +88 -0
- package/dist/services/code/auto-compact-decision.d.ts +74 -0
- package/dist/services/code/auto-compact-decision.js +149 -0
- package/dist/services/code/auto-compact-dispatch-gate.d.ts +36 -0
- package/dist/services/code/auto-compact-dispatch-gate.js +86 -0
- package/dist/services/code/auto-compact-envelopes.d.ts +33 -0
- package/dist/services/code/auto-compact-envelopes.js +134 -0
- package/dist/services/code/auto-compact-history.d.ts +46 -0
- package/dist/services/code/auto-compact-history.js +17 -0
- package/dist/services/code/auto-compact-orchestrator.d.ts +11 -240
- package/dist/services/code/auto-compact-orchestrator.js +165 -686
- package/dist/services/code/auto-compact-run-types.d.ts +123 -0
- package/dist/services/code/auto-compact-run-types.js +1 -0
- package/dist/services/code/emit-handoff.d.ts +35 -1
- package/dist/services/code/emit-handoff.js +128 -7
- package/dist/services/code/step-08-gate.d.ts +28 -19
- package/dist/services/code/step-08-gate.js +92 -35
- package/dist/services/config/config-coercion.d.ts +7 -0
- package/dist/services/config/config-coercion.js +156 -0
- package/dist/services/config/config-file-io.d.ts +11 -0
- package/dist/services/config/config-file-io.js +61 -0
- package/dist/services/config/config-get.d.ts +2 -0
- package/dist/services/config/config-get.js +36 -0
- package/dist/services/config/config-global-loader.d.ts +15 -0
- package/dist/services/config/config-global-loader.js +111 -0
- package/dist/services/config/config-nested-path.d.ts +3 -0
- package/dist/services/config/config-nested-path.js +53 -0
- package/dist/services/config/config-primitives.d.ts +16 -0
- package/dist/services/config/config-primitives.js +24 -0
- package/dist/services/config/config-service.d.ts +9 -33
- package/dist/services/config/config-service.js +16 -665
- package/dist/services/config/config-validation.d.ts +19 -0
- package/dist/services/config/config-validation.js +152 -0
- package/dist/services/config/config-workspace.d.ts +10 -0
- package/dist/services/config/config-workspace.js +158 -0
- package/dist/services/skills/hooks-settings-deny-list.d.ts +61 -0
- package/dist/services/skills/hooks-settings-deny-list.js +173 -0
- package/dist/services/skills/hooks-settings-envelopes.d.ts +20 -0
- package/dist/services/skills/hooks-settings-envelopes.js +79 -0
- package/dist/services/skills/hooks-settings-file-shape.d.ts +43 -0
- package/dist/services/skills/hooks-settings-file-shape.js +207 -0
- package/dist/services/skills/hooks-settings-paths.d.ts +34 -0
- package/dist/services/skills/hooks-settings-paths.js +75 -0
- package/dist/services/skills/hooks-settings-read-installed.d.ts +39 -0
- package/dist/services/skills/hooks-settings-read-installed.js +60 -0
- package/dist/services/skills/hooks-settings-service.d.ts +12 -212
- package/dist/services/skills/hooks-settings-service.js +71 -657
- package/dist/services/skills/hooks-settings-types.d.ts +139 -0
- package/dist/services/skills/hooks-settings-types.js +1 -0
- package/dist/services/workspace/claude-settings-template-merge.d.ts +89 -0
- package/dist/services/workspace/claude-settings-template-merge.js +243 -0
- package/dist/services/workspace/claude-settings-template.d.ts +29 -87
- package/dist/services/workspace/claude-settings-template.js +81 -236
- package/package.json +5 -5
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"metadata": {
|
|
3
3
|
"pluginRoot": ".",
|
|
4
|
-
"version": "4.1.
|
|
4
|
+
"version": "4.1.4"
|
|
5
5
|
},
|
|
6
6
|
"plugins": [
|
|
7
7
|
{
|
|
8
8
|
"name": "peaks-loop",
|
|
9
9
|
"description": "Loop Engineering CLI — workflow primitive / loop guards / evaluators / slice orchestration",
|
|
10
|
-
"version": "4.1.
|
|
10
|
+
"version": "4.1.4",
|
|
11
11
|
"author": {
|
|
12
12
|
"name": "SquabbyZ"
|
|
13
13
|
},
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,61 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 4.1.4 — 2026-10-10 (修掉推送门上的一个假绿;`src/cli/commands` 清空超帽;两条"BLOCKING 却拦不住任何东西"的步骤;以及一项被推迟的边界)
|
|
4
|
+
|
|
5
|
+
**版本级别**: 未发布区间 `v4.1.3..HEAD` 共 **17 个 commit**(1 feat / 5 fix / 6 refactor / 2 test / 其余 docs+memory)。取 **patch**,依维护者 2026-07-22 的常设规则"默认版本新增采用最小的版本位"。4 个 workspace 包各 +1 patch(internal-runtime 0.0.43→0.0.44、mut 0.1.57→0.1.58、shared 0.0.92→0.0.93、shared-channel 0.0.60→0.0.61),`CLI_VERSION` 与 `RUNTIME_VERSION` 由 `scripts/sync-version.mjs` 同步。**本版不新增命令族**,所以 4.1.3 那条"新增命令应取 minor"的注记不适用。
|
|
6
|
+
|
|
7
|
+
### 1. 推送门上的一个假绿(1 fix,三轮交付)
|
|
8
|
+
|
|
9
|
+
**leg 2 的分类器会把"新增了 gated 文件却忘了重生成基线"的改动放过去。** 实测 `6a1938a8` 那次推送:leg 2 跑了 601 个测试,**其中没有一条**是钉"每个 in-scope 文件都在 `gate-baseline.json` 里有 `files[]` 行"的那个守卫——它住在 `tests/unit/standards/`,而分类器只把 `src/<area>` 映射到 `tests/unit/<area>`,**没有任何一条路径通向那里**。守卫直到**下一次**推送(改了 `.husky/` 触发全量)才变红,`0c5fe123` 就是那两次提交需要付的修。
|
|
10
|
+
|
|
11
|
+
分类器现在是一个**纯模块**(`scripts/test-changed-classify.mjs`),三条规则旧映射表达不了:
|
|
12
|
+
|
|
13
|
+
- **R1** 基线**内容**动了 ⇒ 跑它的守卫套件(`tests/unit/standards/` + `tests/unit/lint/`),而不是 0 个测试
|
|
14
|
+
- **R2** 任何 `A`/`D`/`R`/`C` ⇒ 跑人口守卫(按 git **status** 判定,不重述 census 的策略目录)
|
|
15
|
+
- **R3** census 的**策略源文件**被改 ⇒ 同样跑(`M src/services/scan/file-size-policy.ts` 会让 44 个 `.md` 突然进 scope)
|
|
16
|
+
|
|
17
|
+
**只有 `generatedAt` 动了的重生成仍然是惰性的(0 测试)——但现在是建立在一个真命题上。** 旧豁免写的理由是"没有测试读它",那是**假的**:读者经由 `tests/unit/standards/_file-size-cap-scan.ts` 的 `BASELINE_PATH` 常量抵达它,而 2026-09-23 那次搜索找的是路径**字符串**,看不见常量间接引用。
|
|
18
|
+
|
|
19
|
+
**第一版实现被 5 路评审否决,而这是本版最有价值的一段记录。** 它把守卫加进**选择集**,于是"没映射到测试 ⇒ 跑全量"那张网永不触发:**新增一个 CI workflow 会一个读 `.github/` 的测试都不跑**(实测有 5 个)。四个来源独立撞上同一缺陷,而 AC5 的验收臂看不见它——**因为那条臂用的正是唯一还能漏下去的形状**(`M README.md`)。修完的形状是:**守卫是映射的加法,不是全量网的替代品**,且那张复现表变成了一组臂。
|
|
20
|
+
|
|
21
|
+
### 2. `src/cli/commands` 清空超帽(6 refactor)
|
|
22
|
+
|
|
23
|
+
**30 个超帽文件 → 0**(目录从 300 走到 440 个跟踪文件)。配方是**拆分与压函数必须在同一次交付里完成**——只拆会把 `eslintFindings` 推高(本仓第一批就这样被拒过 +23/+19),一起做则下降。
|
|
24
|
+
|
|
25
|
+
三个 `src/services` 顶层文件也一并处理(`hooks-settings-service` 1037→300、`auto-compact-orchestrator` 1030→285、`config-service` 1011→253)。
|
|
26
|
+
|
|
27
|
+
**四个 ceiling 全程只降不升**:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
fileSizeOverCap 112 -> 78
|
|
31
|
+
fileSizeExcessLines 30352 -> 22502
|
|
32
|
+
eslintFindings 1951 -> 1760
|
|
33
|
+
eslintErrors 709 -> 590
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 3. 两条"BLOCKING 却拦不住任何东西"的步骤(1 fix)
|
|
37
|
+
|
|
38
|
+
**由一次真实事故追出**:本会话的编排者跑完 4 个 slice、11 个提交,**从未执行 Step 11 的记忆沉淀**,而契约写着它 BLOCKING。追查后是两条可定位的缺陷:
|
|
39
|
+
|
|
40
|
+
- **Step 11 没有任何可执行的拒绝点。** `verify-pipeline` 查 QA 与 Gate H;`emit-handoff` 查 **job 账本**;`gate-step-08` 查 job 叙述——**没有一个查 memory**。唯一"可执行的" Step 11 相关物,断言的是 SKILL.md 里那个**标题**存在。
|
|
41
|
+
- **`gate-step-08` 在输入缺失时 fail-open**,并把"我没有能力判断"说成"我判断了,这不像 Job"。实测:整轮**一次 `Next: slice #N of M` 都没出现**。而这个真空本仓的 drift **D-003** 已记过(`JOB_SHAPE_NOT_DECIDED` 自 4.0.0-beta.6 起不再抛),它只是从另一个角度又咬了一次。
|
|
42
|
+
|
|
43
|
+
修法:`emit-handoff` 增加 `block-no-sediment`(信号取自 `.peaks/memory/index.json`,**peaks 自己的状态,不是裸 mtime**;三值化且 **`unknown` 拒绝**);`gate-step-08` 三态化,**无决定但有账本 ⇒ 拒绝**。**两半都端到端验过**:把 `job-shape.json` 移开 ⇒ exit 2;让 memory index 不可读 ⇒ exit 1。**这里的 fail-closed 语义是"别再声称一个你没做出的判断",不是"拦下每一次 Bash 调用"**——该 hook 跑在每个会话的每次 Bash 上。
|
|
44
|
+
|
|
45
|
+
同时把 5 条反馈记忆提升到强制层(3 条 Layer A 由 CLI 自行生成注册,2 条 Layer B 写成**真的** PreToolUse hook:一条拦会改全局状态的命令,一条拦"把测试运行器管进管道"——后者本会话被犯过两次)。**Layer B 的注册一度只存在于 gitignored 的生成文件里**,所以本版把两条条目加进生成器、**并把它从 475 行压到 299 行**(帽 300)以不抬 ceiling。**`shell` pin 是真正的坑**:照抄旁边那条的约定会让两个 hook 变成非阻断错误从而**静默放行**。
|
|
46
|
+
|
|
47
|
+
### 4. 一项被推迟的边界(1 fix)
|
|
48
|
+
|
|
49
|
+
slice 1 当初**刻意推迟**了 git C-quoting:含非 ASCII/控制字节的路径会被加引号,于是匹配不上任何锚定正则。推迟的理由是它先于本版存在、且当时 0 个受影响路径。本版用 `git diff --name-status -z`(NUL 分隔、不加引号不转义)关掉它,`parseNameStatus` 按 status 字母隐含的字段数消费记录。**对照是真的**:同一份 diff 去掉 `-z` 确实带引号,而 HEAD 的解析器逐字返回那个带引号路径。
|
|
50
|
+
|
|
51
|
+
### 5. 边界取证(2 test)
|
|
52
|
+
|
|
53
|
+
三项"机制存在但从未端到端跑过"的欠账:`format:check` 在 CI runner 上**确实评过**(不是被跳过);PATH 上的 `peaks` 是**已安装构建**而非工作树,且**8 个未推送提交新增的 161 个 src 文件全部不在已安装 dist 里而两边都报 4.1.3**——本地 e2e 覆盖**看起来存在而实际为零**;棘轮唯一的联合判定例外 `COUPLED_SIZE_RISE`**确实能开,而且是有条件的**(双向实测)。
|
|
54
|
+
|
|
55
|
+
审计另外补上了两处此前**没有任何东西能抓到**的行为(`docker rm --force` 的 argv、`docker run` 的 flags),方式是对未驱动路径做**注入式直接调用测试**——评审证明过:五个相同的注册表哈希是**一个维度重复五次**,而它**看不见函数体**。
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
3
59
|
## 4.1.3 — 2026-10-09 (只读 MCP 能力面首次发布:把"只读"做成可证伪的东西;两处"工具在说假话"的修复;三批尺寸债,以及门禁自己被加固)
|
|
4
60
|
|
|
5
61
|
**版本级别**: 未发布区间 `v4.1.2..HEAD` 共 **20 个 commit**(2 feat / 3 fix / 4 refactor / 2 chore(gate) / 2 merge / 其余 docs+memory)。取 **patch**,依维护者 2026-07-22 的常设规则"默认版本新增采用最小的版本位"。
|
package/README-en.md
CHANGED
|
@@ -155,7 +155,7 @@ Every lane opens with **one slash command**.
|
|
|
155
155
|
|
|
156
156
|
| | |
|
|
157
157
|
| --- | --- |
|
|
158
|
-
| **Latest** | [](https://www.npmjs.com/package/peaks-loop) — 4.1.
|
|
158
|
+
| **Latest** | [](https://www.npmjs.com/package/peaks-loop) — 4.1.4 (2026-10-10) |
|
|
159
159
|
| **Domains** | Code (`peaks-code`) · Content (`peaks-content`) · Project health (`peaks-doctor`) · Issue sweep (`peaks-issue-fix-orchestrator`) · Custom SOP (`peaks-sop`) · Cross-domain primitives (`peaks-solo` dispatcher · `peaks-resume` · `peaks-status` · `peaks-test` · `peaks-slice-decompose`) |
|
|
160
160
|
| **Sediment pool** | `~/.peaks/` local pool · twice-clean runs auto-promote to a bee · broken runs come back for you to redefine · the bee grows with your taste |
|
|
161
161
|
| **Test suite** | 285+ cases · 4 packages (peaks-loop / peaks-loop-mut / peaks-loop-shared-channel / peaks-loop-shared) · **0 timeouts** · 14 BDD caller-binding edge cases |
|
package/README.md
CHANGED
|
@@ -175,7 +175,7 @@ npm i -g peaks-loop
|
|
|
175
175
|
|
|
176
176
|
| | |
|
|
177
177
|
| --- | --- |
|
|
178
|
-
| **最新版本** | [](https://www.npmjs.com/package/peaks-loop) — 4.1.
|
|
178
|
+
| **最新版本** | [](https://www.npmjs.com/package/peaks-loop) — 4.1.4(2026-10-10) |
|
|
179
179
|
| **覆盖域** | 代码(`peaks-code`) · 内容(`peaks-content`) · 项目健康(`peaks-doctor`) · 批量修 issue(`peaks-issue-fix-orchestrator`) · 自定义 SOP(`peaks-sop`) · 通用原语(`peaks-solo` 分诊 / `peaks-resume` 续 / `peaks-status` 看 / `peaks-test` 测 / `peaks-slice-decompose` 切片) |
|
|
180
180
|
| **沉淀池** | `~/.peaks/` 本地池 · 跑两次自动晋升成 bee · 跑翻车让你重定义 · bee 跟着你的口味长 |
|
|
181
181
|
| **测试套件** | 1096 cases · 4 packages (peaks-loop 1015 / runtime 39 / mut 22 / shared-channel 20) · **CI 首次全绿**(ubuntu + windows) · 14 BDD caller-binding coverage |
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { openStateDb } from '../../services/skillhub/sqlite-store.js';
|
|
2
|
+
import { CrystallizationService, type CrystallizationTrigger } from '../../services/crystallization/index.js';
|
|
3
|
+
export declare function collectRepeatable(value: string, previous: string[]): string[];
|
|
4
|
+
export declare const DISPOSE_MODES: readonly ["trace_only", "retain", "destroy"];
|
|
5
|
+
export type DisposeMode = (typeof DISPOSE_MODES)[number];
|
|
6
|
+
export declare function parseTriggerFlag(raw: string): CrystallizationTrigger | null;
|
|
7
|
+
/** `--project`, else the nearest project root above cwd, else cwd. */
|
|
8
|
+
export declare function resolveAssetProjectRoot(project: string | undefined): string;
|
|
9
|
+
/** Ensure `<projectRoot>/.peaks/` exists and open its `state.db`. */
|
|
10
|
+
export declare function openAssetDb(projectRoot: string): ReturnType<typeof openStateDb>;
|
|
11
|
+
/** The CrystallizationService wiring every asset verb repeats, built once. */
|
|
12
|
+
export declare function createCrystallizationService(db: ReturnType<typeof openStateDb>): CrystallizationService;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// src/cli/commands/asset-command-shared.ts
|
|
2
|
+
//
|
|
3
|
+
// The flag parsers, project/db bootstrap and service wiring the three
|
|
4
|
+
// `peaks asset` verbs share. Split out of `asset-commands.ts` so each verb can
|
|
5
|
+
// live in its own module without repeating the same twelve-line construction.
|
|
6
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { openStateDb } from '../../services/skillhub/sqlite-store.js';
|
|
9
|
+
import { CrystallizationService, CRYSTALLIZATION_TRIGGERS } from '../../services/crystallization/index.js';
|
|
10
|
+
import { LoopReleaseSchema } from '../../services/loop/loop-release-types.js';
|
|
11
|
+
import { insertLoopRelease } from '../../services/loop/loop-release-store.js';
|
|
12
|
+
import { insertLoopBeeRelation } from '../../services/loop/loop-bee-relation-store.js';
|
|
13
|
+
import { LoopBeeRelationSchema } from '../../services/loop/loop-bee-relation-types.js';
|
|
14
|
+
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
15
|
+
export function collectRepeatable(value, previous) {
|
|
16
|
+
if (Array.isArray(previous))
|
|
17
|
+
return [...previous, value];
|
|
18
|
+
return [value];
|
|
19
|
+
}
|
|
20
|
+
export const DISPOSE_MODES = ['trace_only', 'retain', 'destroy'];
|
|
21
|
+
export function parseTriggerFlag(raw) {
|
|
22
|
+
return CRYSTALLIZATION_TRIGGERS.includes(raw)
|
|
23
|
+
? raw
|
|
24
|
+
: null;
|
|
25
|
+
}
|
|
26
|
+
/** `--project`, else the nearest project root above cwd, else cwd. */
|
|
27
|
+
export function resolveAssetProjectRoot(project) {
|
|
28
|
+
return project ?? findProjectRoot(process.cwd()) ?? process.cwd();
|
|
29
|
+
}
|
|
30
|
+
/** Ensure `<projectRoot>/.peaks/` exists and open its `state.db`. */
|
|
31
|
+
export function openAssetDb(projectRoot) {
|
|
32
|
+
if (!existsSync(join(projectRoot, '.peaks'))) {
|
|
33
|
+
mkdirSync(join(projectRoot, '.peaks'), { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
return openStateDb(join(projectRoot, '.peaks', 'state.db'));
|
|
36
|
+
}
|
|
37
|
+
/** The CrystallizationService wiring every asset verb repeats, built once. */
|
|
38
|
+
export function createCrystallizationService(db) {
|
|
39
|
+
return new CrystallizationService(db, {
|
|
40
|
+
loopReleaseSchema: LoopReleaseSchema,
|
|
41
|
+
loopBeeRelationSchema: LoopBeeRelationSchema,
|
|
42
|
+
insertLoopRelease: insertLoopRelease,
|
|
43
|
+
insertLoopBeeRelation: insertLoopBeeRelation
|
|
44
|
+
});
|
|
45
|
+
}
|
|
@@ -39,7 +39,12 @@
|
|
|
39
39
|
* Defense in depth: the CrystallizationService enforces the
|
|
40
40
|
* pre-run gate and the brief-section guard; the CLI only
|
|
41
41
|
* translates flags into the service payload.
|
|
42
|
+
*
|
|
43
|
+
* The verb implementations live beside this file, one module per verb:
|
|
44
|
+
* `asset-crystallize-command.ts`, `asset-dispose-command.ts`,
|
|
45
|
+
* `asset-status-command.ts`, with their shared bootstrap in
|
|
46
|
+
* `asset-command-shared.ts`.
|
|
42
47
|
*/
|
|
43
48
|
import type { Command } from 'commander';
|
|
44
|
-
import {
|
|
49
|
+
import type { ProgramIO } from '../cli-helpers.js';
|
|
45
50
|
export declare function registerAssetCommands(program: Command, io: ProgramIO): void;
|
|
@@ -39,29 +39,15 @@
|
|
|
39
39
|
* Defense in depth: the CrystallizationService enforces the
|
|
40
40
|
* pre-run gate and the brief-section guard; the CLI only
|
|
41
41
|
* translates flags into the service payload.
|
|
42
|
+
*
|
|
43
|
+
* The verb implementations live beside this file, one module per verb:
|
|
44
|
+
* `asset-crystallize-command.ts`, `asset-dispose-command.ts`,
|
|
45
|
+
* `asset-status-command.ts`, with their shared bootstrap in
|
|
46
|
+
* `asset-command-shared.ts`.
|
|
42
47
|
*/
|
|
43
|
-
import {
|
|
44
|
-
import {
|
|
45
|
-
import {
|
|
46
|
-
import { CrystallizationService, CrystallizationIntegrityError, BriefSectionError, safeRenderRecommendationPayload, CRYSTALLIZATION_TRIGGERS, parseEvidenceBrief } from '../../services/crystallization/index.js';
|
|
47
|
-
import { LoopReleaseSchema } from '../../services/loop/loop-release-types.js';
|
|
48
|
-
import { insertLoopRelease } from '../../services/loop/loop-release-store.js';
|
|
49
|
-
import { insertLoopBeeRelation } from '../../services/loop/loop-bee-relation-store.js';
|
|
50
|
-
import { LoopBeeRelationSchema } from '../../services/loop/loop-bee-relation-types.js';
|
|
51
|
-
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
52
|
-
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
53
|
-
import { fail, ok } from 'peaks-loop-shared/result';
|
|
54
|
-
function collectRepeatable(value, previous) {
|
|
55
|
-
if (Array.isArray(previous))
|
|
56
|
-
return [...previous, value];
|
|
57
|
-
return [value];
|
|
58
|
-
}
|
|
59
|
-
const DISPOSE_MODES = ['trace_only', 'retain', 'destroy'];
|
|
60
|
-
function parseTriggerFlag(raw) {
|
|
61
|
-
return CRYSTALLIZATION_TRIGGERS.includes(raw)
|
|
62
|
-
? raw
|
|
63
|
-
: null;
|
|
64
|
-
}
|
|
48
|
+
import { registerAssetCrystallizeCommand } from './asset-crystallize-command.js';
|
|
49
|
+
import { registerAssetDisposeCommand } from './asset-dispose-command.js';
|
|
50
|
+
import { registerAssetStatusCommand } from './asset-status-command.js';
|
|
65
51
|
export function registerAssetCommands(program, io) {
|
|
66
52
|
// Reuse the existing `asset` parent if one is registered; the
|
|
67
53
|
// add-a-new-subcommand-check-for-existing-top-level-first rule
|
|
@@ -71,354 +57,7 @@ export function registerAssetCommands(program, io) {
|
|
|
71
57
|
program
|
|
72
58
|
.command('asset')
|
|
73
59
|
.description('M5: cross-asset crystallization surface (crystallize / dispose / status — spec §5 / §7.4)');
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
.description('M5: persist a new loop_release + main_bee_release + loop_bee_relation + crystallization_event in a single transaction. Enforces the pre-run gate (task_status=completed AND gates_passed=true AND evidence_collected=true; AC-4 / RL-2) and the brief-section guard (all 4 sections required; AC-15 / RL-7).')
|
|
78
|
-
.requiredOption('--from-task <id>', "the candidate task id (must be 'completed' with gates_passed + evidence_collected)")
|
|
79
|
-
.requiredOption('--loop-id <id>', 'kebab-case loop id, e.g. loop-onboarding-research')
|
|
80
|
-
.requiredOption('--loop-name <name>', 'NL display name')
|
|
81
|
-
.requiredOption('--loop-scenario <text>', 'long-form scenario text (what real problem the loop solves)')
|
|
82
|
-
.requiredOption('--loop-trigger-policy <text>', 'trigger policy (NL intent match)')
|
|
83
|
-
.requiredOption('--loop-interaction-policy <text>', 'interaction policy (Human-NL-Choice-Only is the default)')
|
|
84
|
-
.requiredOption('--loop-feedback-policy <text>', 'feedback policy (what feedback enters long-term memory)')
|
|
85
|
-
.requiredOption('--loop-evolution-policy <text>', 'evolution policy (Darwin-style ratchet rules)')
|
|
86
|
-
.requiredOption('--loop-success-criterion <text>', 'declarative success criterion (repeatable)', collectRepeatable, [])
|
|
87
|
-
.requiredOption('--loop-evaluator-policy <text>', 'evaluator policy line (repeatable)', collectRepeatable, [])
|
|
88
|
-
.requiredOption('--loop-version <semver>', 'loop version (e.g. 0.1.0)')
|
|
89
|
-
.requiredOption('--bee-name <name>', 'main bee name (kebab-case)')
|
|
90
|
-
.requiredOption('--bee-version <semver>', 'bee version (e.g. 0.1.0)')
|
|
91
|
-
.requiredOption('--bee-description <text>', 'main bee description (manifest-level)')
|
|
92
|
-
.requiredOption('--bee-relation-reason <text>', 'NL reason for the main bee relation')
|
|
93
|
-
.requiredOption('--brief-what-happened <text>', 'brief section: what_happened (1-2 sentence factual account)')
|
|
94
|
-
.requiredOption('--brief-why-it-matters <text>', 'brief section: why_it_matters (1-2 sentence explanation)')
|
|
95
|
-
.requiredOption('--brief-what-learned <text>', 'brief section: what_learned (1-2 sentence learning)')
|
|
96
|
-
.requiredOption('--brief-what-action <text>', 'brief section: what_action (1 sentence recommended action)')
|
|
97
|
-
.option('--brief-bullet <bullet>', 'structured bullet supporting the brief (repeatable)', collectRepeatable, [])
|
|
98
|
-
.option('--source-trace <id>', 'workflow trace id backing the brief (repeatable)', collectRepeatable, [])
|
|
99
|
-
.option('--evaluator-summary <text>', 'evaluator one-liner (independent scorers)', '')
|
|
100
|
-
.option('--user-decision-summary <text>', 'user decision summary (NL)', '')
|
|
101
|
-
.option('--bee-intent-raw <text>', 'optional bee user_intent_raw')
|
|
102
|
-
.option('--bee-parent-version <semver>', 'optional parent_version')
|
|
103
|
-
.option('--bee-changelog <text>', 'optional changelog')
|
|
104
|
-
.option('--trigger <name>', `crystallization trigger (one of: ${CRYSTALLIZATION_TRIGGERS.join('|')})`, 'user_explicit')
|
|
105
|
-
.option('--project <path>', 'project root (default: cwd)')).action((options) => {
|
|
106
|
-
try {
|
|
107
|
-
const trigger = parseTriggerFlag(options.trigger);
|
|
108
|
-
if (!trigger) {
|
|
109
|
-
printResult(io, fail('asset.crystallize', 'ASSET_INVALID_TRIGGER', `--trigger must be one of: ${CRYSTALLIZATION_TRIGGERS.join('|')}`, { trigger: options.trigger }, ['Pass a valid --trigger value.']), options.json);
|
|
110
|
-
process.exitCode = 1;
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
// Build the brief from CLI flags and re-validate it through
|
|
114
|
-
// the canonical schema (so a partial brief is caught BEFORE
|
|
115
|
-
// any DB side effects fire).
|
|
116
|
-
const candidateBrief = {
|
|
117
|
-
what_happened: options.briefWhatHappened,
|
|
118
|
-
why_it_matters: options.briefWhyItMatters,
|
|
119
|
-
what_learned: options.briefWhatLearned,
|
|
120
|
-
what_action: options.briefWhatAction
|
|
121
|
-
};
|
|
122
|
-
let brief;
|
|
123
|
-
try {
|
|
124
|
-
brief = parseEvidenceBrief(candidateBrief);
|
|
125
|
-
}
|
|
126
|
-
catch (err) {
|
|
127
|
-
if (err instanceof BriefSectionError) {
|
|
128
|
-
const briefErr = err;
|
|
129
|
-
printResult(io, fail('asset.crystallize', 'MISSING_BRIEF_SECTION', briefErr.message, { findings: [...briefErr.findings], flagsProvided: Object.keys(candidateBrief) }, [
|
|
130
|
-
'Pass ALL FOUR brief sections via --brief-what-happened / --brief-why-it-matters / --brief-what-learned / --brief-what-action.',
|
|
131
|
-
'The CLI refuses to render a recommendation without a complete 4-section brief (spec §4.7 / RL-7).'
|
|
132
|
-
]), options.json);
|
|
133
|
-
process.exitCode = 1;
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
throw err;
|
|
137
|
-
}
|
|
138
|
-
// Render the recommendation envelope up-front so the CLI can
|
|
139
|
-
// refuse to write if any brief section is missing. This is
|
|
140
|
-
// the same code path the crystallization service uses.
|
|
141
|
-
const recommendation = safeRenderRecommendationPayload({
|
|
142
|
-
brief,
|
|
143
|
-
bullets: options.briefBullet ?? [],
|
|
144
|
-
source_trace_pointers: options.sourceTrace ?? [],
|
|
145
|
-
evaluator_summary: {
|
|
146
|
-
one_liner: options.evaluatorSummary ?? '',
|
|
147
|
-
risk_tags: []
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
if (!recommendation.ok) {
|
|
151
|
-
printResult(io, fail('asset.crystallize', recommendation.code ?? 'MISSING_BRIEF_SECTION', 'recommendation envelope rejected — brief is missing one of its 4 sections', { findings: recommendation.findings, briefProvided: candidateBrief }, [
|
|
152
|
-
'Pass ALL FOUR brief sections via the matching CLI flags.',
|
|
153
|
-
'Counts in --brief-bullet may support the brief; they do NOT replace it (spec §4.7 / RL-7).'
|
|
154
|
-
]), options.json);
|
|
155
|
-
process.exitCode = 1;
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
|
|
159
|
-
if (!existsSync(join(projectRoot, '.peaks'))) {
|
|
160
|
-
mkdirSync(join(projectRoot, '.peaks'), { recursive: true });
|
|
161
|
-
}
|
|
162
|
-
const db = openStateDb(join(projectRoot, '.peaks', 'state.db'));
|
|
163
|
-
try {
|
|
164
|
-
const svc = new CrystallizationService(db, {
|
|
165
|
-
loopReleaseSchema: LoopReleaseSchema,
|
|
166
|
-
loopBeeRelationSchema: LoopBeeRelationSchema,
|
|
167
|
-
insertLoopRelease: insertLoopRelease,
|
|
168
|
-
insertLoopBeeRelation: insertLoopBeeRelation
|
|
169
|
-
});
|
|
170
|
-
const result = svc.crystallize({
|
|
171
|
-
task: {
|
|
172
|
-
task_id: options.fromTask,
|
|
173
|
-
task_status: 'completed',
|
|
174
|
-
gates_passed: true,
|
|
175
|
-
evidence_collected: true
|
|
176
|
-
},
|
|
177
|
-
loop_input: {
|
|
178
|
-
id: options.loopId,
|
|
179
|
-
name: options.loopName,
|
|
180
|
-
scenario: options.loopScenario,
|
|
181
|
-
trigger_policy: options.loopTriggerPolicy,
|
|
182
|
-
success_criteria: options.loopSuccessCriterion,
|
|
183
|
-
interaction_policy: options.loopInteractionPolicy,
|
|
184
|
-
feedback_policy: options.loopFeedbackPolicy,
|
|
185
|
-
evolution_policy: options.loopEvolutionPolicy,
|
|
186
|
-
evaluator_policy: options.loopEvaluatorPolicy,
|
|
187
|
-
linked_bees: [],
|
|
188
|
-
run_history: [],
|
|
189
|
-
crystallization_evidence: [],
|
|
190
|
-
lifecycle_status: 'candidate',
|
|
191
|
-
version: options.loopVersion
|
|
192
|
-
},
|
|
193
|
-
bee_input: {
|
|
194
|
-
bee_name: options.beeName,
|
|
195
|
-
version: options.beeVersion,
|
|
196
|
-
description: options.beeDescription,
|
|
197
|
-
...(options.beeIntentRaw !== undefined
|
|
198
|
-
? { user_intent_raw: options.beeIntentRaw }
|
|
199
|
-
: {}),
|
|
200
|
-
...(options.beeParentVersion !== undefined
|
|
201
|
-
? { parent_version: options.beeParentVersion }
|
|
202
|
-
: {}),
|
|
203
|
-
...(options.beeChangelog !== undefined ? { changelog: options.beeChangelog } : {})
|
|
204
|
-
},
|
|
205
|
-
bee_relation_reason: options.beeRelationReason,
|
|
206
|
-
evidence_brief: brief,
|
|
207
|
-
evidence_bullets: options.briefBullet ?? [],
|
|
208
|
-
source_trace_pointers: options.sourceTrace ?? [],
|
|
209
|
-
...(options.evaluatorSummary !== undefined
|
|
210
|
-
? { evaluator_summary: options.evaluatorSummary }
|
|
211
|
-
: {}),
|
|
212
|
-
...(options.userDecisionSummary !== undefined
|
|
213
|
-
? { user_decision_summary: options.userDecisionSummary }
|
|
214
|
-
: {}),
|
|
215
|
-
trigger
|
|
216
|
-
});
|
|
217
|
-
printResult(io, ok('asset.crystallize', {
|
|
218
|
-
recommendation: {
|
|
219
|
-
brief: recommendation.payload.brief,
|
|
220
|
-
bullets: recommendation.payload.bullets,
|
|
221
|
-
source_trace_pointers: recommendation.payload.source_trace_pointers,
|
|
222
|
-
evaluator_summary: recommendation.payload.evaluator_summary
|
|
223
|
-
},
|
|
224
|
-
result,
|
|
225
|
-
nextActions: [
|
|
226
|
-
`Run \`peaks loop show --loop ${result.loop_release_id}\` to inspect the new loop_release.`,
|
|
227
|
-
`Run \`peaks asset dispose --crystallization-event ${result.crystallization_event_id} --mode trace_only\` to retire the event without touching the asset.`
|
|
228
|
-
]
|
|
229
|
-
}, [], [
|
|
230
|
-
'The CLI has surfaced a complete 4-section brief; the LLM should now drive the user through AskUserQuestion picks (spec §5.3).'
|
|
231
|
-
]), options.json);
|
|
232
|
-
}
|
|
233
|
-
finally {
|
|
234
|
-
db.close();
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
catch (err) {
|
|
238
|
-
if (err instanceof CrystallizationIntegrityError) {
|
|
239
|
-
const integrityErr = err;
|
|
240
|
-
printResult(io, fail('asset.crystallize', integrityErr.code, integrityErr.message, { findings: [...integrityErr.findings] }, [
|
|
241
|
-
integrityErr.code === 'CRYSTALLIZATION_PRE_RUN'
|
|
242
|
-
? 'Re-shape the candidate task so task_status=completed AND gates_passed=true AND evidence_collected=true (spec §5 / RL-2).'
|
|
243
|
-
: integrityErr.code === 'MISSING_BRIEF_SECTION'
|
|
244
|
-
? 'Pass ALL FOUR brief sections (RL-7); the CLI refuses to render a recommendation without them.'
|
|
245
|
-
: 'Inspect the failure findings and re-shape the payload.'
|
|
246
|
-
]), options.json);
|
|
247
|
-
process.exitCode = 1;
|
|
248
|
-
return;
|
|
249
|
-
}
|
|
250
|
-
if (err instanceof BriefSectionError) {
|
|
251
|
-
const briefErr = err;
|
|
252
|
-
printResult(io, fail('asset.crystallize', 'MISSING_BRIEF_SECTION', briefErr.message, { findings: [...briefErr.findings] }, ['Pass all 4 brief sections (RL-7).']), options.json);
|
|
253
|
-
process.exitCode = 1;
|
|
254
|
-
return;
|
|
255
|
-
}
|
|
256
|
-
throw err;
|
|
257
|
-
}
|
|
258
|
-
});
|
|
259
|
-
// ---------- peaks asset dispose ----------
|
|
260
|
-
addJsonOption(asset
|
|
261
|
-
.command('dispose')
|
|
262
|
-
.description('M5: dispose a crystallization event. mode=trace_only retires the event but keeps the trace; mode=retain keeps both; mode=destroy retires the event and marks the created/updated assets retired.')
|
|
263
|
-
.requiredOption('--crystallization-event <id>', 'the crystallization event id (returned by `peaks asset crystallize`)')
|
|
264
|
-
.requiredOption(`--mode <mode>`, `dispose mode (one of: ${DISPOSE_MODES.join('|')}; default: trace_only)`, 'trace_only')
|
|
265
|
-
.option('--project <path>', 'project root (default: cwd)')).action((options) => {
|
|
266
|
-
try {
|
|
267
|
-
if (!DISPOSE_MODES.includes(options.mode)) {
|
|
268
|
-
printResult(io, fail('asset.dispose', 'ASSET_INVALID_MODE', `--mode must be one of: ${DISPOSE_MODES.join('|')}`, { mode: options.mode }, ['Pass --mode trace_only / retain / destroy.']), options.json);
|
|
269
|
-
process.exitCode = 1;
|
|
270
|
-
return;
|
|
271
|
-
}
|
|
272
|
-
const mode = options.mode;
|
|
273
|
-
const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
|
|
274
|
-
if (!existsSync(join(projectRoot, '.peaks'))) {
|
|
275
|
-
mkdirSync(join(projectRoot, '.peaks'), { recursive: true });
|
|
276
|
-
}
|
|
277
|
-
const db = openStateDb(join(projectRoot, '.peaks', 'state.db'));
|
|
278
|
-
try {
|
|
279
|
-
const svc = new CrystallizationService(db, {
|
|
280
|
-
loopReleaseSchema: LoopReleaseSchema,
|
|
281
|
-
loopBeeRelationSchema: LoopBeeRelationSchema,
|
|
282
|
-
insertLoopRelease: insertLoopRelease,
|
|
283
|
-
insertLoopBeeRelation: insertLoopBeeRelation
|
|
284
|
-
});
|
|
285
|
-
const existing = svc.read(options.crystallizationEvent);
|
|
286
|
-
if (!existing) {
|
|
287
|
-
printResult(io, fail('asset.dispose', 'ASSET_EVENT_NOT_FOUND', `crystallization event '${options.crystallizationEvent}' not found`, { eventId: options.crystallizationEvent }, ['Verify the event id.']), options.json);
|
|
288
|
-
process.exitCode = 1;
|
|
289
|
-
return;
|
|
290
|
-
}
|
|
291
|
-
// trace_only → retire the event row; the source traces are
|
|
292
|
-
// untouched (workflow traces are immutable per spec §4.3).
|
|
293
|
-
// retain → no DB change; the user wants to keep the event
|
|
294
|
-
// as historical evidence.
|
|
295
|
-
// destroy → retire the event + retire the created/updated
|
|
296
|
-
// assets (no asset delete; retirement only).
|
|
297
|
-
if (mode === 'retain') {
|
|
298
|
-
printResult(io, ok('asset.dispose', {
|
|
299
|
-
crystallization_event_id: existing.id,
|
|
300
|
-
mode,
|
|
301
|
-
lifecycle_status: existing.lifecycle_status,
|
|
302
|
-
note: 'no DB change; event retained as-is'
|
|
303
|
-
}, [], [
|
|
304
|
-
'Run `peaks asset status --loop <id>` to inspect the lifecycle state of the linked assets.'
|
|
305
|
-
]), options.json);
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
const updated = svc.updateStatus(existing.id, 'retired');
|
|
309
|
-
if (mode === 'destroy' && updated) {
|
|
310
|
-
// Retire the created/updated loop_release rows as well.
|
|
311
|
-
// We do NOT delete rows — retirement is a status flip
|
|
312
|
-
// (spec §5.6).
|
|
313
|
-
const retireLoop = db.prepare("UPDATE loop_release SET lifecycle_status = 'retired' WHERE id IN (?, ?)");
|
|
314
|
-
const ids = [
|
|
315
|
-
updated.created_loop_release_id ?? null,
|
|
316
|
-
updated.updated_loop_release_id ?? null
|
|
317
|
-
].filter((x) => x !== null);
|
|
318
|
-
for (const id of ids) {
|
|
319
|
-
retireLoop.run(id, id);
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
printResult(io, ok('asset.dispose', {
|
|
323
|
-
crystallization_event_id: existing.id,
|
|
324
|
-
mode,
|
|
325
|
-
lifecycle_status: updated?.lifecycle_status ?? 'retired',
|
|
326
|
-
retired_assets: mode === 'destroy' ? 'loop_release retired (no rows deleted)' : 'none',
|
|
327
|
-
nextActions: ['Run `peaks asset status` to confirm the lifecycle transition.']
|
|
328
|
-
}, [], []), options.json);
|
|
329
|
-
}
|
|
330
|
-
finally {
|
|
331
|
-
db.close();
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
catch (err) {
|
|
335
|
-
printResult(io, fail('asset.dispose', 'ASSET_DISPOSE_FAILED', getErrorMessage(err), { eventId: options.crystallizationEvent }, ['Verify the event id and --mode flag.']), options.json);
|
|
336
|
-
process.exitCode = 1;
|
|
337
|
-
}
|
|
338
|
-
});
|
|
339
|
-
// ---------- peaks asset status ----------
|
|
340
|
-
addJsonOption(asset
|
|
341
|
-
.command('status')
|
|
342
|
-
.description('M5: list loop + bee lifecycle state. With --loop, returns the loop + all linked bee_releases + all crystallization events referencing them.')
|
|
343
|
-
.option('--loop <id>', 'filter by loop_release id')
|
|
344
|
-
.option('--bee <name>', 'filter by bee_name')
|
|
345
|
-
.option('--project <path>', 'project root (default: cwd)')).action((options) => {
|
|
346
|
-
try {
|
|
347
|
-
const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
|
|
348
|
-
if (!existsSync(join(projectRoot, '.peaks'))) {
|
|
349
|
-
mkdirSync(join(projectRoot, '.peaks'), { recursive: true });
|
|
350
|
-
}
|
|
351
|
-
const db = openStateDb(join(projectRoot, '.peaks', 'state.db'));
|
|
352
|
-
try {
|
|
353
|
-
const svc = new CrystallizationService(db, {
|
|
354
|
-
loopReleaseSchema: LoopReleaseSchema,
|
|
355
|
-
loopBeeRelationSchema: LoopBeeRelationSchema,
|
|
356
|
-
insertLoopRelease: insertLoopRelease,
|
|
357
|
-
insertLoopBeeRelation: insertLoopBeeRelation
|
|
358
|
-
});
|
|
359
|
-
let events = [];
|
|
360
|
-
if (options.loop) {
|
|
361
|
-
events = [
|
|
362
|
-
...svc.list({ created_loop_release_id: options.loop }),
|
|
363
|
-
...svc.list({ updated_loop_release_id: options.loop })
|
|
364
|
-
];
|
|
365
|
-
// Deduplicate by id.
|
|
366
|
-
const seen = new Set();
|
|
367
|
-
events = events.filter((e) => {
|
|
368
|
-
const key = e?.id ?? '';
|
|
369
|
-
if (!key || seen.has(key))
|
|
370
|
-
return false;
|
|
371
|
-
seen.add(key);
|
|
372
|
-
return true;
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
else {
|
|
376
|
-
events = svc.list();
|
|
377
|
-
}
|
|
378
|
-
// Companion queries: loop lifecycle counts + bee lifecycle
|
|
379
|
-
// counts. We compute from the DB so the CLI is the single
|
|
380
|
-
// source of truth.
|
|
381
|
-
const loopCounts = db
|
|
382
|
-
.prepare('SELECT lifecycle_status, COUNT(*) AS n FROM loop_release GROUP BY lifecycle_status')
|
|
383
|
-
.all().reduce((acc, r) => {
|
|
384
|
-
acc[r.lifecycle_status] = r.n;
|
|
385
|
-
return acc;
|
|
386
|
-
}, {});
|
|
387
|
-
const beeCounts = db
|
|
388
|
-
.prepare('SELECT bee_name, COUNT(*) AS n FROM bee_release GROUP BY bee_name ORDER BY bee_name ASC')
|
|
389
|
-
.all().filter((r) => options.bee === undefined || r.bee_name === options.bee);
|
|
390
|
-
printResult(io, ok('asset.status', {
|
|
391
|
-
filters: {
|
|
392
|
-
...(options.loop !== undefined ? { loop: options.loop } : {}),
|
|
393
|
-
...(options.bee !== undefined ? { bee: options.bee } : {})
|
|
394
|
-
},
|
|
395
|
-
crystallization_events: events.length,
|
|
396
|
-
events: events.map((e) => ({
|
|
397
|
-
id: e?.id,
|
|
398
|
-
trigger: e?.trigger,
|
|
399
|
-
lifecycle_status: e?.lifecycle_status,
|
|
400
|
-
created_loop_release_id: e?.created_loop_release_id,
|
|
401
|
-
created_bee_release_id: e?.created_bee_release_id,
|
|
402
|
-
updated_loop_release_id: e?.updated_loop_release_id,
|
|
403
|
-
updated_bee_release_id: e?.updated_bee_release_id,
|
|
404
|
-
created_at: e?.created_at
|
|
405
|
-
})),
|
|
406
|
-
loop_release_counts_by_lifecycle: loopCounts,
|
|
407
|
-
bee_release_counts_by_name: beeCounts,
|
|
408
|
-
nextActions: [
|
|
409
|
-
options.loop
|
|
410
|
-
? `Run \`peaks loop show --loop ${options.loop}\` for the loop detail view.`
|
|
411
|
-
: "Pass --loop <id> to drill into a specific loop's crystallization history."
|
|
412
|
-
]
|
|
413
|
-
}, [], []), options.json);
|
|
414
|
-
}
|
|
415
|
-
finally {
|
|
416
|
-
db.close();
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
catch (err) {
|
|
420
|
-
printResult(io, fail('asset.status', 'ASSET_STATUS_FAILED', getErrorMessage(err), { loop: options.loop, bee: options.bee }, ['Verify the loop / bee identifiers.']), options.json);
|
|
421
|
-
process.exitCode = 1;
|
|
422
|
-
}
|
|
423
|
-
});
|
|
60
|
+
registerAssetCrystallizeCommand(asset, io);
|
|
61
|
+
registerAssetDisposeCommand(asset, io);
|
|
62
|
+
registerAssetStatusCommand(asset, io);
|
|
424
63
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// src/cli/commands/asset-crystallize-command.ts
|
|
2
|
+
//
|
|
3
|
+
// The commander registration for `peaks asset crystallize` — the parent
|
|
4
|
+
// command, its 28 options in their original order, and the action binding.
|
|
5
|
+
// Split out of `asset-commands.ts`; the verb name, every option's flag and
|
|
6
|
+
// description, and the envelope shape are unchanged. The action body lives in
|
|
7
|
+
// `asset-crystallize-runner.ts` and the payload builders in
|
|
8
|
+
// `asset-crystallize-payload.ts`.
|
|
9
|
+
import { CRYSTALLIZATION_TRIGGERS } from '../../services/crystallization/index.js';
|
|
10
|
+
import { addJsonOption } from '../cli-helpers.js';
|
|
11
|
+
import { collectRepeatable } from './asset-command-shared.js';
|
|
12
|
+
import { runAssetCrystallize } from './asset-crystallize-runner.js';
|
|
13
|
+
const CRYSTALLIZE_DESCRIPTION = 'M5: persist a new loop_release + main_bee_release + loop_bee_relation + crystallization_event in a single transaction. Enforces the pre-run gate (task_status=completed AND gates_passed=true AND evidence_collected=true; AC-4 / RL-2) and the brief-section guard (all 4 sections required; AC-15 / RL-7).';
|
|
14
|
+
/** `--from-task` … `--loop-version`: the task + loop_release half. */
|
|
15
|
+
function addLoopPolicyOptions(cmd) {
|
|
16
|
+
return cmd
|
|
17
|
+
.requiredOption('--from-task <id>', "the candidate task id (must be 'completed' with gates_passed + evidence_collected)")
|
|
18
|
+
.requiredOption('--loop-id <id>', 'kebab-case loop id, e.g. loop-onboarding-research')
|
|
19
|
+
.requiredOption('--loop-name <name>', 'NL display name')
|
|
20
|
+
.requiredOption('--loop-scenario <text>', 'long-form scenario text (what real problem the loop solves)')
|
|
21
|
+
.requiredOption('--loop-trigger-policy <text>', 'trigger policy (NL intent match)')
|
|
22
|
+
.requiredOption('--loop-interaction-policy <text>', 'interaction policy (Human-NL-Choice-Only is the default)')
|
|
23
|
+
.requiredOption('--loop-feedback-policy <text>', 'feedback policy (what feedback enters long-term memory)')
|
|
24
|
+
.requiredOption('--loop-evolution-policy <text>', 'evolution policy (Darwin-style ratchet rules)')
|
|
25
|
+
.requiredOption('--loop-success-criterion <text>', 'declarative success criterion (repeatable)', collectRepeatable, [])
|
|
26
|
+
.requiredOption('--loop-evaluator-policy <text>', 'evaluator policy line (repeatable)', collectRepeatable, [])
|
|
27
|
+
.requiredOption('--loop-version <semver>', 'loop version (e.g. 0.1.0)');
|
|
28
|
+
}
|
|
29
|
+
/** `--bee-name` … `--brief-what-action`: the main bee and the 4 brief sections. */
|
|
30
|
+
function addBeeAndBriefOptions(cmd) {
|
|
31
|
+
return cmd
|
|
32
|
+
.requiredOption('--bee-name <name>', 'main bee name (kebab-case)')
|
|
33
|
+
.requiredOption('--bee-version <semver>', 'bee version (e.g. 0.1.0)')
|
|
34
|
+
.requiredOption('--bee-description <text>', 'main bee description (manifest-level)')
|
|
35
|
+
.requiredOption('--bee-relation-reason <text>', 'NL reason for the main bee relation')
|
|
36
|
+
.requiredOption('--brief-what-happened <text>', 'brief section: what_happened (1-2 sentence factual account)')
|
|
37
|
+
.requiredOption('--brief-why-it-matters <text>', 'brief section: why_it_matters (1-2 sentence explanation)')
|
|
38
|
+
.requiredOption('--brief-what-learned <text>', 'brief section: what_learned (1-2 sentence learning)')
|
|
39
|
+
.requiredOption('--brief-what-action <text>', 'brief section: what_action (1 sentence recommended action)');
|
|
40
|
+
}
|
|
41
|
+
/** `--brief-bullet` … `--project`: the repeatable extras and the trigger. */
|
|
42
|
+
function addCrystallizeExtras(cmd) {
|
|
43
|
+
return cmd
|
|
44
|
+
.option('--brief-bullet <bullet>', 'structured bullet supporting the brief (repeatable)', collectRepeatable, [])
|
|
45
|
+
.option('--source-trace <id>', 'workflow trace id backing the brief (repeatable)', collectRepeatable, [])
|
|
46
|
+
.option('--evaluator-summary <text>', 'evaluator one-liner (independent scorers)', '')
|
|
47
|
+
.option('--user-decision-summary <text>', 'user decision summary (NL)', '')
|
|
48
|
+
.option('--bee-intent-raw <text>', 'optional bee user_intent_raw')
|
|
49
|
+
.option('--bee-parent-version <semver>', 'optional parent_version')
|
|
50
|
+
.option('--bee-changelog <text>', 'optional changelog')
|
|
51
|
+
.option('--trigger <name>', `crystallization trigger (one of: ${CRYSTALLIZATION_TRIGGERS.join('|')})`, 'user_explicit')
|
|
52
|
+
.option('--project <path>', 'project root (default: cwd)');
|
|
53
|
+
}
|
|
54
|
+
export function registerAssetCrystallizeCommand(asset, io) {
|
|
55
|
+
const cmd = asset.command('crystallize').description(CRYSTALLIZE_DESCRIPTION);
|
|
56
|
+
addLoopPolicyOptions(cmd);
|
|
57
|
+
addBeeAndBriefOptions(cmd);
|
|
58
|
+
addCrystallizeExtras(cmd);
|
|
59
|
+
addJsonOption(cmd).action((options) => runAssetCrystallize(io, options));
|
|
60
|
+
}
|