peaks-loop 4.1.3 → 4.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +56 -0
- package/README-en.md +1 -1
- package/README.md +1 -1
- package/dist/cli/commands/asset-command-shared.d.ts +12 -0
- package/dist/cli/commands/asset-command-shared.js +45 -0
- package/dist/cli/commands/asset-commands.d.ts +6 -1
- package/dist/cli/commands/asset-commands.js +11 -372
- package/dist/cli/commands/asset-crystallize-command.d.ts +3 -0
- package/dist/cli/commands/asset-crystallize-command.js +60 -0
- package/dist/cli/commands/asset-crystallize-payload.d.ts +47 -0
- package/dist/cli/commands/asset-crystallize-payload.js +85 -0
- package/dist/cli/commands/asset-crystallize-runner.d.ts +3 -0
- package/dist/cli/commands/asset-crystallize-runner.js +133 -0
- package/dist/cli/commands/asset-dispose-command.d.ts +3 -0
- package/dist/cli/commands/asset-dispose-command.js +99 -0
- package/dist/cli/commands/asset-status-command.d.ts +3 -0
- package/dist/cli/commands/asset-status-command.js +100 -0
- package/dist/cli/commands/baseline-audit-command.d.ts +3 -0
- package/dist/cli/commands/baseline-audit-command.js +64 -0
- package/dist/cli/commands/baseline-command-shared.d.ts +23 -0
- package/dist/cli/commands/baseline-command-shared.js +39 -0
- package/dist/cli/commands/baseline-commands.js +33 -313
- package/dist/cli/commands/baseline-freeze-commands.d.ts +4 -0
- package/dist/cli/commands/baseline-freeze-commands.js +81 -0
- package/dist/cli/commands/baseline-guard-command.d.ts +3 -0
- package/dist/cli/commands/baseline-guard-command.js +52 -0
- package/dist/cli/commands/baseline-read-commands.d.ts +5 -0
- package/dist/cli/commands/baseline-read-commands.js +72 -0
- package/dist/cli/commands/baseline-rollback-commands.d.ts +4 -0
- package/dist/cli/commands/baseline-rollback-commands.js +88 -0
- package/dist/cli/commands/classify-downgrade-command.d.ts +9 -0
- package/dist/cli/commands/classify-downgrade-command.js +21 -0
- package/dist/cli/commands/classify-run-command.d.ts +9 -0
- package/dist/cli/commands/classify-run-command.js +73 -0
- package/dist/cli/commands/classify-signals.d.ts +5 -0
- package/dist/cli/commands/classify-signals.js +104 -0
- package/dist/cli/commands/code-emit-handoff-command.js +40 -3
- package/dist/cli/commands/code-gate-step-08-command.js +25 -9
- package/dist/cli/commands/codegraph-command-options.d.ts +22 -0
- package/dist/cli/commands/codegraph-command-options.js +22 -0
- package/dist/cli/commands/codegraph-commands.d.ts +2 -2
- package/dist/cli/commands/codegraph-commands.js +14 -397
- package/dist/cli/commands/codegraph-config-restore-command.d.ts +3 -0
- package/dist/cli/commands/codegraph-config-restore-command.js +200 -0
- package/dist/cli/commands/codegraph-proxy-commands.d.ts +10 -0
- package/dist/cli/commands/codegraph-proxy-commands.js +159 -0
- package/dist/cli/commands/codegraph-repair-commands.d.ts +3 -0
- package/dist/cli/commands/codegraph-repair-commands.js +94 -0
- package/dist/cli/commands/codegraph-status-command.d.ts +1 -1
- package/dist/cli/commands/codegraph-status-command.js +27 -214
- package/dist/cli/commands/codegraph-status-integrity.d.ts +44 -0
- package/dist/cli/commands/codegraph-status-integrity.js +121 -0
- package/dist/cli/commands/codegraph-status-json.d.ts +5 -0
- package/dist/cli/commands/codegraph-status-json.js +127 -0
- package/dist/cli/commands/container-command-shared.d.ts +60 -0
- package/dist/cli/commands/container-command-shared.js +52 -0
- package/dist/cli/commands/container-commands.d.ts +1 -1
- package/dist/cli/commands/container-commands.js +4 -216
- package/dist/cli/commands/container-release-command.d.ts +3 -0
- package/dist/cli/commands/container-release-command.js +105 -0
- package/dist/cli/commands/container-spawn-command.d.ts +3 -0
- package/dist/cli/commands/container-spawn-command.js +148 -0
- package/dist/cli/commands/context-check-command.d.ts +3 -0
- package/dist/cli/commands/context-check-command.js +81 -0
- package/dist/cli/commands/context-commands.d.ts +2 -7
- package/dist/cli/commands/context-commands.js +6 -276
- package/dist/cli/commands/context-layer-command.d.ts +3 -0
- package/dist/cli/commands/context-layer-command.js +34 -0
- package/dist/cli/commands/context-layer-fetchers.d.ts +15 -0
- package/dist/cli/commands/context-layer-fetchers.js +162 -0
- package/dist/cli/commands/context-status-command.d.ts +17 -0
- package/dist/cli/commands/context-status-command.js +41 -0
- package/dist/cli/commands/contract-write-command.d.ts +3 -0
- package/dist/cli/commands/contract-write-command.js +144 -0
- package/dist/cli/commands/core/doctor-bindings.d.ts +17 -0
- package/dist/cli/commands/core/doctor-bindings.js +30 -0
- package/dist/cli/commands/core/doctor-command.d.ts +4 -18
- package/dist/cli/commands/core/doctor-command.js +2 -323
- package/dist/cli/commands/core/doctor-logs.d.ts +8 -0
- package/dist/cli/commands/core/doctor-logs.js +32 -0
- package/dist/cli/commands/core/doctor-probes.d.ts +3 -0
- package/dist/cli/commands/core/doctor-probes.js +55 -0
- package/dist/cli/commands/core/doctor-run-command.d.ts +12 -0
- package/dist/cli/commands/core/doctor-run-command.js +172 -0
- package/dist/cli/commands/core/doctor-summary.d.ts +7 -0
- package/dist/cli/commands/core/doctor-summary.js +39 -0
- package/dist/cli/commands/core/memory-command-shared.d.ts +25 -0
- package/dist/cli/commands/core/memory-command-shared.js +20 -0
- package/dist/cli/commands/core/memory-command.d.ts +1 -1
- package/dist/cli/commands/core/memory-command.js +6 -227
- package/dist/cli/commands/core/memory-delegated-verbs.d.ts +4 -0
- package/dist/cli/commands/core/memory-delegated-verbs.js +178 -0
- package/dist/cli/commands/core/memory-extract-command.d.ts +3 -0
- package/dist/cli/commands/core/memory-extract-command.js +90 -0
- package/dist/cli/commands/core/memory-sync-command.d.ts +3 -0
- package/dist/cli/commands/core/memory-sync-command.js +38 -0
- package/dist/cli/commands/core/session-command.d.ts +1 -1
- package/dist/cli/commands/core/session-command.js +12 -206
- package/dist/cli/commands/core/session-info-command.d.ts +3 -0
- package/dist/cli/commands/core/session-info-command.js +142 -0
- package/dist/cli/commands/core/session-verb-commands.d.ts +5 -0
- package/dist/cli/commands/core/session-verb-commands.js +58 -0
- package/dist/cli/commands/core/standards-command.d.ts +1 -24
- package/dist/cli/commands/core/standards-command.js +33 -201
- package/dist/cli/commands/core/standards-init-command.d.ts +3 -0
- package/dist/cli/commands/core/standards-init-command.js +87 -0
- package/dist/cli/commands/core/standards-lint.d.ts +24 -0
- package/dist/cli/commands/core/standards-lint.js +57 -0
- package/dist/cli/commands/core/standards-migrate-command.d.ts +3 -0
- package/dist/cli/commands/core/standards-migrate-command.js +57 -0
- package/dist/cli/commands/cron-scheduler-commands.d.ts +5 -1
- package/dist/cli/commands/cron-scheduler-commands.js +36 -206
- package/dist/cli/commands/cron-scheduler-run-once-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-run-once-command.js +35 -0
- package/dist/cli/commands/cron-scheduler-shared.d.ts +6 -0
- package/dist/cli/commands/cron-scheduler-shared.js +48 -0
- package/dist/cli/commands/cron-scheduler-start-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-start-command.js +65 -0
- package/dist/cli/commands/cron-scheduler-status-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-status-command.js +46 -0
- package/dist/cli/commands/cron-scheduler-stop-command.d.ts +7 -0
- package/dist/cli/commands/cron-scheduler-stop-command.js +61 -0
- package/dist/cli/commands/dispatch-dag-envelope.d.ts +41 -0
- package/dist/cli/commands/dispatch-dag-envelope.js +49 -0
- package/dist/cli/commands/dispatch-dag-failure.d.ts +18 -0
- package/dist/cli/commands/dispatch-dag-failure.js +16 -0
- package/dist/cli/commands/dispatch-dag-preflight.d.ts +51 -0
- package/dist/cli/commands/dispatch-dag-preflight.js +105 -0
- package/dist/cli/commands/dispatch-dag-runners.d.ts +48 -0
- package/dist/cli/commands/dispatch-dag-runners.js +73 -0
- package/dist/cli/commands/dispatch-from-dag.d.ts +27 -0
- package/dist/cli/commands/dispatch-from-dag.js +87 -257
- package/dist/cli/commands/final-review-command-envelopes.d.ts +44 -0
- package/dist/cli/commands/final-review-command-envelopes.js +100 -0
- package/dist/cli/commands/final-review-command-shared.d.ts +52 -0
- package/dist/cli/commands/final-review-command-shared.js +35 -0
- package/dist/cli/commands/final-review-commands.d.ts +7 -27
- package/dist/cli/commands/final-review-commands.js +13 -240
- package/dist/cli/commands/final-review-prepare-command.d.ts +3 -0
- package/dist/cli/commands/final-review-prepare-command.js +200 -0
- package/dist/cli/commands/governance-classify-contract-commands.d.ts +23 -9
- package/dist/cli/commands/governance-classify-contract-commands.js +26 -269
- package/dist/cli/commands/hooks-command-shared.d.ts +42 -0
- package/dist/cli/commands/hooks-command-shared.js +32 -0
- package/dist/cli/commands/hooks-commands.d.ts +20 -0
- package/dist/cli/commands/hooks-commands.js +75 -309
- package/dist/cli/commands/hooks-install-envelopes.d.ts +6 -0
- package/dist/cli/commands/hooks-install-envelopes.js +144 -0
- package/dist/cli/commands/hooks-status-command.d.ts +3 -0
- package/dist/cli/commands/hooks-status-command.js +93 -0
- package/dist/cli/commands/hooks-uninstall-command.d.ts +3 -0
- package/dist/cli/commands/hooks-uninstall-command.js +43 -0
- package/dist/cli/commands/loop-command-shared.d.ts +31 -0
- package/dist/cli/commands/loop-command-shared.js +15 -0
- package/dist/cli/commands/loop-commands.d.ts +12 -17
- package/dist/cli/commands/loop-commands.js +56 -238
- package/dist/cli/commands/loop-export-command.d.ts +3 -0
- package/dist/cli/commands/loop-export-command.js +73 -0
- package/dist/cli/commands/loop-goal-compose-command.d.ts +3 -0
- package/dist/cli/commands/loop-goal-compose-command.js +36 -0
- package/dist/cli/commands/loop-import-command.d.ts +3 -0
- package/dist/cli/commands/loop-import-command.js +86 -0
- package/dist/cli/commands/loop-placeholder-commands.d.ts +3 -0
- package/dist/cli/commands/loop-placeholder-commands.js +52 -0
- package/dist/cli/commands/memory-command-shared.d.ts +59 -0
- package/dist/cli/commands/memory-command-shared.js +39 -0
- package/dist/cli/commands/memory-commands.d.ts +6 -79
- package/dist/cli/commands/memory-commands.js +19 -309
- package/dist/cli/commands/memory-ingest-command.d.ts +3 -0
- package/dist/cli/commands/memory-ingest-command.js +50 -0
- package/dist/cli/commands/memory-list-command.d.ts +16 -0
- package/dist/cli/commands/memory-list-command.js +129 -0
- package/dist/cli/commands/memory-reindex-command.d.ts +9 -0
- package/dist/cli/commands/memory-reindex-command.js +78 -0
- package/dist/cli/commands/memory-rotate-command.d.ts +3 -0
- package/dist/cli/commands/memory-rotate-command.js +55 -0
- package/dist/cli/commands/memory-search-command.d.ts +7 -0
- package/dist/cli/commands/memory-search-command.js +46 -0
- package/dist/cli/commands/openspec-archive-command.d.ts +3 -0
- package/dist/cli/commands/openspec-archive-command.js +55 -0
- package/dist/cli/commands/openspec-command-shared.d.ts +62 -0
- package/dist/cli/commands/openspec-command-shared.js +135 -0
- package/dist/cli/commands/openspec-commands.d.ts +1 -1
- package/dist/cli/commands/openspec-commands.js +33 -306
- package/dist/cli/commands/openspec-from-doctor-command.d.ts +3 -0
- package/dist/cli/commands/openspec-from-doctor-command.js +66 -0
- package/dist/cli/commands/openspec-init-command.d.ts +3 -0
- package/dist/cli/commands/openspec-init-command.js +49 -0
- package/dist/cli/commands/openspec-list-command.d.ts +3 -0
- package/dist/cli/commands/openspec-list-command.js +27 -0
- package/dist/cli/commands/openspec-render-command.d.ts +3 -0
- package/dist/cli/commands/openspec-render-command.js +33 -0
- package/dist/cli/commands/openspec-show-command.d.ts +3 -0
- package/dist/cli/commands/openspec-show-command.js +33 -0
- package/dist/cli/commands/openspec-to-rd-command.d.ts +3 -0
- package/dist/cli/commands/openspec-to-rd-command.js +33 -0
- package/dist/cli/commands/openspec-validate-command.d.ts +3 -0
- package/dist/cli/commands/openspec-validate-command.js +45 -0
- package/dist/cli/commands/playwright-browser-command.d.ts +8 -0
- package/dist/cli/commands/playwright-browser-command.js +61 -0
- package/dist/cli/commands/playwright-commands.d.ts +10 -62
- package/dist/cli/commands/playwright-commands.js +77 -400
- package/dist/cli/commands/playwright-envelope.d.ts +8 -0
- package/dist/cli/commands/playwright-envelope.js +29 -0
- package/dist/cli/commands/playwright-ls-stop-commands.d.ts +4 -0
- package/dist/cli/commands/playwright-ls-stop-commands.js +74 -0
- package/dist/cli/commands/playwright-session-store.d.ts +65 -0
- package/dist/cli/commands/playwright-session-store.js +189 -0
- package/dist/cli/commands/project-commands.d.ts +19 -0
- package/dist/cli/commands/project-commands.js +98 -259
- package/dist/cli/commands/project-context-command.d.ts +3 -0
- package/dist/cli/commands/project-context-command.js +44 -0
- package/dist/cli/commands/project-dashboard-command.d.ts +3 -0
- package/dist/cli/commands/project-dashboard-command.js +74 -0
- package/dist/cli/commands/project-knowledge-command.d.ts +3 -0
- package/dist/cli/commands/project-knowledge-command.js +48 -0
- package/dist/cli/commands/project-memories-show-command.d.ts +3 -0
- package/dist/cli/commands/project-memories-show-command.js +87 -0
- package/dist/cli/commands/project-memory-index-command.d.ts +3 -0
- package/dist/cli/commands/project-memory-index-command.js +31 -0
- package/dist/cli/commands/qa-archive-screenshots-command.d.ts +3 -0
- package/dist/cli/commands/qa-archive-screenshots-command.js +53 -0
- package/dist/cli/commands/qa-commands.d.ts +14 -87
- package/dist/cli/commands/qa-commands.js +17 -315
- package/dist/cli/commands/qa-context-prestep.d.ts +1 -0
- package/dist/cli/commands/qa-context-prestep.js +34 -0
- package/dist/cli/commands/qa-run-command.d.ts +3 -0
- package/dist/cli/commands/qa-run-command.js +105 -0
- package/dist/cli/commands/qa-run-options.d.ts +23 -0
- package/dist/cli/commands/qa-run-options.js +31 -0
- package/dist/cli/commands/qa-run-slice.d.ts +41 -0
- package/dist/cli/commands/qa-run-slice.js +145 -0
- package/dist/cli/commands/release-canary-command.d.ts +28 -0
- package/dist/cli/commands/release-canary-command.js +129 -0
- package/dist/cli/commands/release-command-shared.d.ts +13 -0
- package/dist/cli/commands/release-command-shared.js +18 -0
- package/dist/cli/commands/release-commands.d.ts +10 -18
- package/dist/cli/commands/release-commands.js +25 -298
- package/dist/cli/commands/release-done-command.d.ts +3 -0
- package/dist/cli/commands/release-done-command.js +64 -0
- package/dist/cli/commands/release-hotfix-command.d.ts +3 -0
- package/dist/cli/commands/release-hotfix-command.js +50 -0
- package/dist/cli/commands/release-plan-command.d.ts +3 -0
- package/dist/cli/commands/release-plan-command.js +33 -0
- package/dist/cli/commands/release-precheck-command.d.ts +3 -0
- package/dist/cli/commands/release-precheck-command.js +28 -0
- package/dist/cli/commands/release-promote-command.d.ts +3 -0
- package/dist/cli/commands/release-promote-command.js +34 -0
- package/dist/cli/commands/release-rollback-command.d.ts +3 -0
- package/dist/cli/commands/release-rollback-command.js +33 -0
- package/dist/cli/commands/release-watch-command.d.ts +3 -0
- package/dist/cli/commands/release-watch-command.js +44 -0
- package/dist/cli/commands/sediment-argv-flags.d.ts +54 -0
- package/dist/cli/commands/sediment-argv-flags.js +116 -0
- package/dist/cli/commands/sediment-command-shared.d.ts +15 -0
- package/dist/cli/commands/sediment-command-shared.js +5 -0
- package/dist/cli/commands/sediment-commands.d.ts +35 -59
- package/dist/cli/commands/sediment-commands.js +36 -590
- package/dist/cli/commands/sediment-pool-commands.d.ts +9 -0
- package/dist/cli/commands/sediment-pool-commands.js +185 -0
- package/dist/cli/commands/sediment-query-commands.d.ts +4 -0
- package/dist/cli/commands/sediment-query-commands.js +94 -0
- package/dist/cli/commands/sediment-release-commands.d.ts +8 -0
- package/dist/cli/commands/sediment-release-commands.js +232 -0
- package/dist/cli/commands/sop-advance-command.d.ts +3 -0
- package/dist/cli/commands/sop-advance-command.js +160 -0
- package/dist/cli/commands/sop-check-command.d.ts +3 -0
- package/dist/cli/commands/sop-check-command.js +44 -0
- package/dist/cli/commands/sop-command-shared.d.ts +23 -0
- package/dist/cli/commands/sop-command-shared.js +18 -0
- package/dist/cli/commands/sop-commands.d.ts +15 -1
- package/dist/cli/commands/sop-commands.js +26 -240
- package/dist/cli/commands/sop-init-command.d.ts +3 -0
- package/dist/cli/commands/sop-init-command.js +51 -0
- package/dist/cli/commands/sop-lint-command.d.ts +3 -0
- package/dist/cli/commands/sop-lint-command.js +64 -0
- package/dist/cli/commands/sop-register-command.d.ts +3 -0
- package/dist/cli/commands/sop-register-command.js +48 -0
- package/dist/cli/commands/sop-registry-command.d.ts +3 -0
- package/dist/cli/commands/sop-registry-command.js +30 -0
- package/dist/cli/commands/statusline-command-shared.d.ts +73 -0
- package/dist/cli/commands/statusline-command-shared.js +90 -0
- package/dist/cli/commands/statusline-commands.d.ts +1 -19
- package/dist/cli/commands/statusline-commands.js +48 -287
- package/dist/cli/commands/statusline-compact-command.d.ts +4 -0
- package/dist/cli/commands/statusline-compact-command.js +54 -0
- package/dist/cli/commands/statusline-install-command.d.ts +3 -0
- package/dist/cli/commands/statusline-install-command.js +48 -0
- package/dist/cli/commands/statusline-render-command.d.ts +9 -0
- package/dist/cli/commands/statusline-render-command.js +55 -0
- package/dist/cli/commands/statusline-status-command.d.ts +3 -0
- package/dist/cli/commands/statusline-status-command.js +23 -0
- package/dist/cli/commands/statusline-uninstall-command.d.ts +3 -0
- package/dist/cli/commands/statusline-uninstall-command.js +23 -0
- package/dist/cli/commands/test-command-run-helpers.d.ts +27 -0
- package/dist/cli/commands/test-command-run-helpers.js +73 -0
- package/dist/cli/commands/test-command-runner-resolution.d.ts +57 -0
- package/dist/cli/commands/test-command-runner-resolution.js +183 -0
- package/dist/cli/commands/test-commands.d.ts +8 -56
- package/dist/cli/commands/test-commands.js +26 -249
- package/dist/cli/commands/vm-command-shared.d.ts +23 -0
- package/dist/cli/commands/vm-command-shared.js +23 -0
- package/dist/cli/commands/vm-commands.d.ts +1 -28
- package/dist/cli/commands/vm-commands.js +36 -270
- package/dist/cli/commands/vm-hypervisor-runtime.d.ts +15 -0
- package/dist/cli/commands/vm-hypervisor-runtime.js +64 -0
- package/dist/cli/commands/vm-release-command.d.ts +5 -0
- package/dist/cli/commands/vm-release-command.js +101 -0
- package/dist/cli/commands/vm-spawn-command.d.ts +5 -0
- package/dist/cli/commands/vm-spawn-command.js +177 -0
- package/dist/cli/commands/web-command-shared.d.ts +12 -0
- package/dist/cli/commands/web-command-shared.js +30 -0
- package/dist/cli/commands/web-commands.d.ts +7 -14
- package/dist/cli/commands/web-commands.js +6 -314
- package/dist/cli/commands/web-install-command.d.ts +10 -0
- package/dist/cli/commands/web-install-command.js +116 -0
- package/dist/cli/commands/web-lifecycle-commands.d.ts +9 -30
- package/dist/cli/commands/web-lifecycle-commands.js +14 -322
- package/dist/cli/commands/web-login-command.d.ts +14 -0
- package/dist/cli/commands/web-login-command.js +189 -0
- package/dist/cli/commands/web-op-payload.d.ts +22 -0
- package/dist/cli/commands/web-op-payload.js +89 -0
- package/dist/cli/commands/web-op-refusals.d.ts +37 -0
- package/dist/cli/commands/web-op-refusals.js +73 -0
- package/dist/cli/commands/web-op-runner.d.ts +14 -0
- package/dist/cli/commands/web-op-runner.js +166 -0
- package/dist/cli/commands/web-status-command.d.ts +4 -0
- package/dist/cli/commands/web-status-command.js +32 -0
- package/dist/cli/commands/web-stop-command.d.ts +10 -0
- package/dist/cli/commands/web-stop-command.js +59 -0
- package/dist/cli/commands/web-verb-specs.d.ts +18 -0
- package/dist/cli/commands/web-verb-specs.js +66 -0
- package/dist/cli/commands/workflow-command-shared.d.ts +102 -0
- package/dist/cli/commands/workflow-command-shared.js +74 -0
- package/dist/cli/commands/workflow-graph-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-graph-commands.js +73 -0
- package/dist/cli/commands/workflow-init-command.d.ts +3 -0
- package/dist/cli/commands/workflow-init-command.js +68 -0
- package/dist/cli/commands/workflow-lifecycle-commands.d.ts +9 -59
- package/dist/cli/commands/workflow-lifecycle-commands.js +14 -348
- package/dist/cli/commands/workflow-node-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-node-commands.js +154 -0
- package/dist/cli/commands/workflow-terminalize-command.d.ts +3 -0
- package/dist/cli/commands/workflow-terminalize-command.js +56 -0
- package/dist/services/code/auto-compact-artifacts.d.ts +54 -0
- package/dist/services/code/auto-compact-artifacts.js +135 -0
- package/dist/services/code/auto-compact-attempt.d.ts +46 -0
- package/dist/services/code/auto-compact-attempt.js +88 -0
- package/dist/services/code/auto-compact-decision.d.ts +74 -0
- package/dist/services/code/auto-compact-decision.js +149 -0
- package/dist/services/code/auto-compact-dispatch-gate.d.ts +36 -0
- package/dist/services/code/auto-compact-dispatch-gate.js +86 -0
- package/dist/services/code/auto-compact-envelopes.d.ts +33 -0
- package/dist/services/code/auto-compact-envelopes.js +134 -0
- package/dist/services/code/auto-compact-history.d.ts +46 -0
- package/dist/services/code/auto-compact-history.js +17 -0
- package/dist/services/code/auto-compact-orchestrator.d.ts +11 -240
- package/dist/services/code/auto-compact-orchestrator.js +165 -686
- package/dist/services/code/auto-compact-run-types.d.ts +123 -0
- package/dist/services/code/auto-compact-run-types.js +1 -0
- package/dist/services/code/emit-handoff.d.ts +35 -1
- package/dist/services/code/emit-handoff.js +128 -7
- package/dist/services/code/step-08-gate.d.ts +28 -19
- package/dist/services/code/step-08-gate.js +92 -35
- package/dist/services/config/config-coercion.d.ts +7 -0
- package/dist/services/config/config-coercion.js +156 -0
- package/dist/services/config/config-file-io.d.ts +11 -0
- package/dist/services/config/config-file-io.js +61 -0
- package/dist/services/config/config-get.d.ts +2 -0
- package/dist/services/config/config-get.js +36 -0
- package/dist/services/config/config-global-loader.d.ts +15 -0
- package/dist/services/config/config-global-loader.js +111 -0
- package/dist/services/config/config-nested-path.d.ts +3 -0
- package/dist/services/config/config-nested-path.js +53 -0
- package/dist/services/config/config-primitives.d.ts +16 -0
- package/dist/services/config/config-primitives.js +24 -0
- package/dist/services/config/config-service.d.ts +9 -33
- package/dist/services/config/config-service.js +16 -665
- package/dist/services/config/config-validation.d.ts +19 -0
- package/dist/services/config/config-validation.js +152 -0
- package/dist/services/config/config-workspace.d.ts +10 -0
- package/dist/services/config/config-workspace.js +158 -0
- package/dist/services/skills/hooks-settings-deny-list.d.ts +61 -0
- package/dist/services/skills/hooks-settings-deny-list.js +173 -0
- package/dist/services/skills/hooks-settings-envelopes.d.ts +20 -0
- package/dist/services/skills/hooks-settings-envelopes.js +79 -0
- package/dist/services/skills/hooks-settings-file-shape.d.ts +43 -0
- package/dist/services/skills/hooks-settings-file-shape.js +207 -0
- package/dist/services/skills/hooks-settings-paths.d.ts +34 -0
- package/dist/services/skills/hooks-settings-paths.js +75 -0
- package/dist/services/skills/hooks-settings-read-installed.d.ts +39 -0
- package/dist/services/skills/hooks-settings-read-installed.js +60 -0
- package/dist/services/skills/hooks-settings-service.d.ts +12 -212
- package/dist/services/skills/hooks-settings-service.js +71 -657
- package/dist/services/skills/hooks-settings-types.d.ts +139 -0
- package/dist/services/skills/hooks-settings-types.js +1 -0
- package/dist/services/workspace/claude-settings-template-merge.d.ts +89 -0
- package/dist/services/workspace/claude-settings-template-merge.js +243 -0
- package/dist/services/workspace/claude-settings-template.d.ts +29 -87
- package/dist/services/workspace/claude-settings-template.js +81 -236
- package/package.json +5 -5
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// src/cli/commands/hooks-status-command.ts
|
|
2
|
+
//
|
|
3
|
+
// `peaks hooks status` — report which peaks-managed hook entries are installed.
|
|
4
|
+
// Split out of `hooks-commands.ts`; the verb name, its options, the
|
|
5
|
+
// "read the ACTUAL on-disk entries, not the expected list" ruling and the
|
|
6
|
+
// envelope shape are unchanged.
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { listSuperpowersDenyEntries, readHookStatus, readInstalledEntriesFromSettings } from '../../services/skills/hooks-settings-service.js';
|
|
9
|
+
import { readJsonObjectFile } from '../../services/ide/shared/atomic-json.js';
|
|
10
|
+
import { resolveIdeOptionHelp } from '../../services/ide/ide-registry.js';
|
|
11
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
12
|
+
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
13
|
+
import { resolveIdeForCommand, resolveProjectRoot, resolveScope } from './hooks-command-shared.js';
|
|
14
|
+
/**
|
|
15
|
+
* `permissions.deny` block from a settings.json object and return
|
|
16
|
+
* every peaks-managed entry currently present. Used by `hooks status`
|
|
17
|
+
* to surface Layer 3 governance state without forcing the caller to
|
|
18
|
+
* re-read the file. Tolerant of missing / malformed `permissions` —
|
|
19
|
+
* a missing field returns an empty array, never throws.
|
|
20
|
+
*/
|
|
21
|
+
function readOnDiskDenyEntries(settings) {
|
|
22
|
+
const permissions = settings.permissions;
|
|
23
|
+
if (!permissions || typeof permissions !== 'object' || Array.isArray(permissions))
|
|
24
|
+
return [];
|
|
25
|
+
const deny = permissions.deny;
|
|
26
|
+
if (!Array.isArray(deny))
|
|
27
|
+
return [];
|
|
28
|
+
return deny.filter((d) => typeof d === 'string');
|
|
29
|
+
}
|
|
30
|
+
function runHooksStatus(io, options) {
|
|
31
|
+
const scope = resolveScope(options);
|
|
32
|
+
const projectRoot = resolveProjectRoot(scope, options.project);
|
|
33
|
+
const ide = resolveIdeForCommand(options, projectRoot);
|
|
34
|
+
try {
|
|
35
|
+
const status = readHookStatus(scope, projectRoot, { ide });
|
|
36
|
+
// Slice #014: read the ACTUAL on-disk entries (post-install shape),
|
|
37
|
+
// not the IDE-EXPECTED list. Pre-#014 `listInstalledEntriesForIde`
|
|
38
|
+
// returned the expected list and reported `entries: [Bash, Task]`
|
|
39
|
+
// even when the file only had `Bash`. The new helper reads the
|
|
40
|
+
// file and reports whatever peaks-managed entries are present,
|
|
41
|
+
// including any legacy progress-start entry that a pre-#014
|
|
42
|
+
// install left behind.
|
|
43
|
+
const settingsPath = status.settingsPath;
|
|
44
|
+
const settings = existsSync(settingsPath) ? readJsonObjectFile(settingsPath) : {};
|
|
45
|
+
// The gate-enforce entry is materialized into the machine-local
|
|
46
|
+
// settings file (see `resolveHookTargets`), so the on-disk entry list
|
|
47
|
+
// must be read from both files or `status` would report it missing.
|
|
48
|
+
const localSettings = status.localSettingsPath !== undefined && existsSync(status.localSettingsPath)
|
|
49
|
+
? readJsonObjectFile(status.localSettingsPath)
|
|
50
|
+
: {};
|
|
51
|
+
// entries actually on disk. We read the existing settings.json
|
|
52
|
+
// (above) and surface its `permissions.deny` block. Any entry
|
|
53
|
+
// that matches the current `SUPERPOWERS_DENIED_SKILLS` set is
|
|
54
|
+
// considered "peaks-managed"; user-written entries are passed
|
|
55
|
+
// through verbatim so the envelope reflects reality. The desired
|
|
56
|
+
// list is also included for parity with install / uninstall.
|
|
57
|
+
const onDiskDeny = readOnDiskDenyEntries(settings);
|
|
58
|
+
// `status` reports the state of the world; for an IDE that cannot host a
|
|
59
|
+
// hook the state of the world is "none, and none is possible". The exit
|
|
60
|
+
// code stays 0 (the query succeeded) and the payload carries the finding
|
|
61
|
+
// — `supportsHooks: false` on the data, plus a warning naming the IDE, so
|
|
62
|
+
// the negative fact is not confused with "supported IDE, nothing
|
|
63
|
+
// installed yet".
|
|
64
|
+
const warnings = status.supportsHooks
|
|
65
|
+
? []
|
|
66
|
+
: [
|
|
67
|
+
`IDE '${ide}' cannot host peaks hooks (no HOOK_COMMAND_BY_IDE entry); nothing can be installed for it, which is why none is.`
|
|
68
|
+
];
|
|
69
|
+
printResult(io, ok('hooks.status', {
|
|
70
|
+
...status,
|
|
71
|
+
ide,
|
|
72
|
+
entries: [
|
|
73
|
+
...readInstalledEntriesFromSettings(settings, ide),
|
|
74
|
+
...readInstalledEntriesFromSettings(localSettings, ide)
|
|
75
|
+
],
|
|
76
|
+
permissionsDenyEntries: listSuperpowersDenyEntries(),
|
|
77
|
+
permissionsDenyOnDisk: onDiskDeny
|
|
78
|
+
}, warnings), options.json);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
const message = getErrorMessage(error);
|
|
82
|
+
printResult(io, fail('hooks.status', 'HOOKS_STATUS_FAILED', message, { scope, ide }, [message]), options.json);
|
|
83
|
+
process.exitCode = 1;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export function registerHooksStatusCommand(hooks, io) {
|
|
87
|
+
addJsonOption(hooks
|
|
88
|
+
.command('status')
|
|
89
|
+
.description('Report which peaks-managed hook entries are installed.')
|
|
90
|
+
.option('--global', 'inspect the user-level ~/.claude/settings.json instead of the project')
|
|
91
|
+
.option('--project <path>', 'project root path (auto-detected from cwd when omitted)')
|
|
92
|
+
.option('--ide <id>', resolveIdeOptionHelp())).action((options) => runHooksStatus(io, options));
|
|
93
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// src/cli/commands/hooks-uninstall-command.ts
|
|
2
|
+
//
|
|
3
|
+
// `peaks hooks uninstall` — remove the peaks-managed gate-enforce hook entry
|
|
4
|
+
// (and any legacy progress-start entry a pre-#014 install left behind). Split
|
|
5
|
+
// out of `hooks-commands.ts`; the verb name, its options and the envelope shape
|
|
6
|
+
// are unchanged.
|
|
7
|
+
import { listSuperpowersDenyEntries, removeHookInstall } from '../../services/skills/hooks-settings-service.js';
|
|
8
|
+
import { resolveIdeOptionHelp } from '../../services/ide/ide-registry.js';
|
|
9
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
10
|
+
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
11
|
+
import { resolveIdeForCommand, resolveProjectRoot, resolveScope } from './hooks-command-shared.js';
|
|
12
|
+
function runHooksUninstall(io, options) {
|
|
13
|
+
const scope = resolveScope(options);
|
|
14
|
+
const projectRoot = resolveProjectRoot(scope, options.project);
|
|
15
|
+
const ide = resolveIdeForCommand(options, projectRoot);
|
|
16
|
+
try {
|
|
17
|
+
const result = removeHookInstall(scope, projectRoot, { ide });
|
|
18
|
+
// bookkeeping. `permissionsDenyRemoved` mirrors `removed` (the
|
|
19
|
+
// service strips deny entries on the same atomic write that
|
|
20
|
+
// strips the hook entries; they share the same boolean).
|
|
21
|
+
printResult(io, ok('hooks.uninstall', {
|
|
22
|
+
...result,
|
|
23
|
+
ide,
|
|
24
|
+
permissionsDenyRemoved: result.removed,
|
|
25
|
+
permissionsDenyEntries: listSuperpowersDenyEntries()
|
|
26
|
+
}), options.json);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
const message = getErrorMessage(error);
|
|
30
|
+
printResult(io, fail('hooks.uninstall', 'HOOKS_UNINSTALL_FAILED', message, { scope, ide, removed: false }, [
|
|
31
|
+
message
|
|
32
|
+
]), options.json);
|
|
33
|
+
process.exitCode = 1;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function registerHooksUninstallCommand(hooks, io) {
|
|
37
|
+
addJsonOption(hooks
|
|
38
|
+
.command('uninstall')
|
|
39
|
+
.description('Remove the peaks-managed gate-enforce hook entry from the target settings.json. Any legacy progress-start entry that a pre-#014 install left behind is also removed (sentinel-based scan). Third-party hooks are preserved.')
|
|
40
|
+
.option('--global', 'remove from the user-level ~/.claude/settings.json instead of the project')
|
|
41
|
+
.option('--project <path>', 'project root path (auto-detected from cwd when omitted)')
|
|
42
|
+
.option('--ide <id>', resolveIdeOptionHelp())).action((options) => runHooksUninstall(io, options));
|
|
43
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
export type GoalComposeOptions = {
|
|
3
|
+
project: string;
|
|
4
|
+
goal: string;
|
|
5
|
+
json?: boolean;
|
|
6
|
+
};
|
|
7
|
+
export type LoopDistillOptions = {
|
|
8
|
+
project: string;
|
|
9
|
+
apply: boolean;
|
|
10
|
+
json?: boolean;
|
|
11
|
+
};
|
|
12
|
+
export type LoopPlaceholderOptions = {
|
|
13
|
+
project: string;
|
|
14
|
+
json?: boolean;
|
|
15
|
+
};
|
|
16
|
+
export type LoopExportOptions = {
|
|
17
|
+
loop: string;
|
|
18
|
+
out: string;
|
|
19
|
+
project?: string;
|
|
20
|
+
json?: boolean;
|
|
21
|
+
};
|
|
22
|
+
export type LoopImportOptions = {
|
|
23
|
+
in: string;
|
|
24
|
+
as?: string;
|
|
25
|
+
project?: string;
|
|
26
|
+
json?: boolean;
|
|
27
|
+
};
|
|
28
|
+
/** `--project`, else the nearest project root above cwd, else cwd. */
|
|
29
|
+
export declare function resolveLoopProjectRoot(project: string | undefined): string;
|
|
30
|
+
/** `--project` + `--json`, the option chain `loop export` and `loop import` share. */
|
|
31
|
+
export declare const LOOP_EXPORT_IMPORT_OPTS: (cmd: Command) => Command;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// src/cli/commands/loop-command-shared.ts
|
|
2
|
+
//
|
|
3
|
+
// What the `peaks loop` verbs share: the option types, the `--project` /
|
|
4
|
+
// `--json` chain `export` and `import` both declare, and the project-root
|
|
5
|
+
// resolution. Split out of `loop-commands.ts` so the bundle verbs can live in
|
|
6
|
+
// their own modules without repeating the same eight-line construction.
|
|
7
|
+
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
8
|
+
/** `--project`, else the nearest project root above cwd, else cwd. */
|
|
9
|
+
export function resolveLoopProjectRoot(project) {
|
|
10
|
+
return project ?? findProjectRoot(process.cwd()) ?? process.cwd();
|
|
11
|
+
}
|
|
12
|
+
/** `--project` + `--json`, the option chain `loop export` and `loop import` share. */
|
|
13
|
+
export const LOOP_EXPORT_IMPORT_OPTS = (cmd) => cmd
|
|
14
|
+
.option('--project <path>', 'target project root (defaults to cwd)')
|
|
15
|
+
.option('--json', 'print machine-readable JSON envelope');
|
|
@@ -1,26 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* peaks loop * CLI (Slice #14 + M7 add).
|
|
3
3
|
*
|
|
4
|
-
* Slices:
|
|
5
4
|
* #14 sub-features (L4 Agent Loop integration): distill / preflight /
|
|
6
|
-
* detect-pattern / check-consistency
|
|
5
|
+
* detect-pattern / check-consistency, plus `peaks goal compose`.
|
|
7
6
|
*
|
|
8
|
-
* M7 (2026-07-07 spec §7A.2):
|
|
9
|
-
* peaks loop
|
|
10
|
-
*
|
|
7
|
+
* M7 (2026-07-07 spec §7A.2): `peaks loop export --loop <id> --out <p.tar.gz>`
|
|
8
|
+
* and `peaks loop import --in <p.tar.gz> [--as <loop-id>]`. `export` reads
|
|
9
|
+
* the loop_release + relations + bees + evidence briefs and hard-blocks on
|
|
10
|
+
* `shareable=false`; `import` validates `format_version_major=1` and lands
|
|
11
|
+
* the release as `candidate` (spec §7A.2) — the receiver must run an
|
|
12
|
+
* independent evaluation before promoting to `stable`. M7 only ADDs these
|
|
13
|
+
* two verbs; the existing 14.x surface is not modified.
|
|
11
14
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* `peaks loop import` extracts a bundle, validates
|
|
17
|
-
* format_version_major=1, and lands the release as `candidate`
|
|
18
|
-
* (mandatory landing status per spec §7A.2). The receiver must run
|
|
19
|
-
* an independent evaluation before promoting to `stable`.
|
|
20
|
-
*
|
|
21
|
-
* The existing 14.x commands are kept under the same `loop` parent;
|
|
22
|
-
* M7 only ADDs export / import — it does not modify the existing
|
|
23
|
-
* surface.
|
|
15
|
+
* This module owns the `loop` parent, the registrar order, and `distill` — the
|
|
16
|
+
* one verb that spawns a child process, kept here so the `node:child_process`
|
|
17
|
+
* import stays on the module `tests/unit/spawn-windows-hide-guard.test.ts`
|
|
18
|
+
* pins it to. Every other verb lives beside this file, one module per verb.
|
|
24
19
|
*/
|
|
25
20
|
import type { Command } from 'commander';
|
|
26
21
|
import { type ProgramIO } from '../cli-helpers.js';
|
|
@@ -1,263 +1,81 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* peaks loop * CLI (Slice #14 + M7 add).
|
|
3
3
|
*
|
|
4
|
-
* Slices:
|
|
5
4
|
* #14 sub-features (L4 Agent Loop integration): distill / preflight /
|
|
6
|
-
* detect-pattern / check-consistency
|
|
5
|
+
* detect-pattern / check-consistency, plus `peaks goal compose`.
|
|
7
6
|
*
|
|
8
|
-
* M7 (2026-07-07 spec §7A.2):
|
|
9
|
-
* peaks loop
|
|
10
|
-
*
|
|
7
|
+
* M7 (2026-07-07 spec §7A.2): `peaks loop export --loop <id> --out <p.tar.gz>`
|
|
8
|
+
* and `peaks loop import --in <p.tar.gz> [--as <loop-id>]`. `export` reads
|
|
9
|
+
* the loop_release + relations + bees + evidence briefs and hard-blocks on
|
|
10
|
+
* `shareable=false`; `import` validates `format_version_major=1` and lands
|
|
11
|
+
* the release as `candidate` (spec §7A.2) — the receiver must run an
|
|
12
|
+
* independent evaluation before promoting to `stable`. M7 only ADDs these
|
|
13
|
+
* two verbs; the existing 14.x surface is not modified.
|
|
11
14
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* `peaks loop import` extracts a bundle, validates
|
|
17
|
-
* format_version_major=1, and lands the release as `candidate`
|
|
18
|
-
* (mandatory landing status per spec §7A.2). The receiver must run
|
|
19
|
-
* an independent evaluation before promoting to `stable`.
|
|
20
|
-
*
|
|
21
|
-
* The existing 14.x commands are kept under the same `loop` parent;
|
|
22
|
-
* M7 only ADDs export / import — it does not modify the existing
|
|
23
|
-
* surface.
|
|
15
|
+
* This module owns the `loop` parent, the registrar order, and `distill` — the
|
|
16
|
+
* one verb that spawns a child process, kept here so the `node:child_process`
|
|
17
|
+
* import stays on the module `tests/unit/spawn-windows-hide-guard.test.ts`
|
|
18
|
+
* pins it to. Every other verb lives beside this file, one module per verb.
|
|
24
19
|
*/
|
|
25
|
-
import { existsSync, mkdirSync } from 'node:fs';
|
|
26
|
-
import { join } from 'node:path';
|
|
27
|
-
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
28
20
|
import { fail, ok } from 'peaks-loop-shared/result';
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
21
|
+
import { addJsonOption, getErrorMessage, printResult } from '../cli-helpers.js';
|
|
22
|
+
import { registerLoopExportCommand } from './loop-export-command.js';
|
|
23
|
+
import { registerLoopGoalComposeCommand } from './loop-goal-compose-command.js';
|
|
24
|
+
import { registerLoopImportCommand } from './loop-import-command.js';
|
|
25
|
+
import { registerLoopPlaceholderCommands } from './loop-placeholder-commands.js';
|
|
33
26
|
export function registerLoopCommands(program, io) {
|
|
34
|
-
// 14.5 peaks goal compose —
|
|
35
|
-
//
|
|
36
|
-
|
|
37
|
-
// openclaw adapters will thread it through.
|
|
38
|
-
addJsonOption(program
|
|
39
|
-
.command('goal')
|
|
40
|
-
.description('14.5: compose an autonomous goal (returns the goal envelope that the LLM-side UX layer feeds to peaks sub-agent dispatch)')
|
|
41
|
-
.requiredOption('--project <path>', 'target project root')
|
|
42
|
-
.requiredOption('--goal <text>', 'the high-level goal to compose')).action((options) => {
|
|
43
|
-
try {
|
|
44
|
-
printResult(io, ok('goal.compose', {
|
|
45
|
-
project: options.project,
|
|
46
|
-
goal: options.goal,
|
|
47
|
-
status: 'placeholder',
|
|
48
|
-
nextSteps: [
|
|
49
|
-
'The composed goal is consumed by peaks sub-agent dispatch.',
|
|
50
|
-
'The hermes + openclaw IDE adapters (Slice #0.7) surface this as a goalCommand.'
|
|
51
|
-
]
|
|
52
|
-
}, [], [
|
|
53
|
-
'goal.compose is a thin facade; the LLM-side UX layer decomposes the goal into sub-agent tasks.'
|
|
54
|
-
]), options.json);
|
|
55
|
-
}
|
|
56
|
-
catch (error) {
|
|
57
|
-
printResult(io, fail('goal.compose', 'GOAL_COMPOSE_FAILED', getErrorMessage(error), { project: options.project, goal: options.goal }, ['Verify the project path and --goal value']), options.json);
|
|
58
|
-
process.exitCode = 1;
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
// peaks loop *
|
|
27
|
+
// 14.5 peaks goal compose — a TOP-LEVEL command (not under `peaks loop`),
|
|
28
|
+
// because IDE adapters expose it as `goalCommand`.
|
|
29
|
+
registerLoopGoalComposeCommand(program, io);
|
|
62
30
|
const loop = program
|
|
63
31
|
.command('loop')
|
|
64
32
|
.description('Slice #14: L4 Agent Loop sub-features (distill / preflight / detect-pattern / check-consistency)');
|
|
65
|
-
|
|
33
|
+
registerLoopDistillCommand(loop, io);
|
|
34
|
+
registerLoopPlaceholderCommands(loop, io);
|
|
35
|
+
registerLoopExportCommand(loop, io);
|
|
36
|
+
registerLoopImportCommand(loop, io);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 14.1 distill — delegate to `peaks memory extract` through a dynamic
|
|
40
|
+
* `node:child_process` import (no static import, so the command layer does not
|
|
41
|
+
* load `child_process` for verbs that never spawn). The LLM-side UX layer
|
|
42
|
+
* composes the two commands.
|
|
43
|
+
*/
|
|
44
|
+
function registerLoopDistillCommand(loop, io) {
|
|
66
45
|
addJsonOption(loop
|
|
67
46
|
.command('distill')
|
|
68
47
|
.description('14.1: distill patterns from past sessions into .peaks/memory/ (delegates to peaks memory extract)')
|
|
69
48
|
.requiredOption('--project <path>', 'target project root')
|
|
70
49
|
.option('--apply', 'write extracted memories to .peaks/memory/ (default: dry-run preview)', false)).action(async (options) => {
|
|
71
50
|
try {
|
|
72
|
-
|
|
73
|
-
// Delegate to the existing peaks memory extract CLI via dynamic
|
|
74
|
-
// import (avoids circular); the LLM-side UX layer composes the
|
|
75
|
-
// two commands.
|
|
76
|
-
const { execFileSync } = (await import('node:child_process'));
|
|
77
|
-
const args = ['memory', 'extract', '--project', options.project];
|
|
78
|
-
if (apply)
|
|
79
|
-
args.push('--apply');
|
|
80
|
-
const stdout = execFileSync('node', ['bin/peaks.js', ...args], {
|
|
81
|
-
cwd: options.project,
|
|
82
|
-
stdio: ['ignore', 'pipe', 'ignore'],
|
|
83
|
-
windowsHide: true
|
|
84
|
-
}).toString('utf-8');
|
|
85
|
-
printResult(io, ok('loop.distill', {
|
|
86
|
-
project: options.project,
|
|
87
|
-
apply,
|
|
88
|
-
delegateStdout: stdout.slice(0, 200)
|
|
89
|
-
}, [], [
|
|
90
|
-
apply
|
|
91
|
-
? 'peaks memory extract --apply was invoked'
|
|
92
|
-
: 'peaks memory extract dry-run was invoked',
|
|
93
|
-
'A future slice will inline the memory extract (not via execFileSync).'
|
|
94
|
-
]), options.json);
|
|
51
|
+
printResult(io, ok('loop.distill', await extractMemoryViaDelegate(options), [], distillNextActions(options)), options.json);
|
|
95
52
|
}
|
|
96
53
|
catch (error) {
|
|
97
54
|
printResult(io, fail('loop.distill', 'LOOP_DISTILL_FAILED', getErrorMessage(error), { project: options.project }, ['Verify the project path']), options.json);
|
|
98
55
|
process.exitCode = 1;
|
|
99
56
|
}
|
|
100
57
|
});
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
.
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
status: 'placeholder',
|
|
125
|
-
nextSteps: [
|
|
126
|
-
'Run peaks retrospective search --limit 50 to surface high-frequency patterns.',
|
|
127
|
-
'A future slice will rank by frequency + LLM confidence.'
|
|
128
|
-
]
|
|
129
|
-
}, [], [
|
|
130
|
-
'loop.detect-pattern is a thin facade; the LLM-side UX layer composes peaks retrospective search.'
|
|
131
|
-
]), options.json);
|
|
132
|
-
});
|
|
133
|
-
// 14.4 check-consistency
|
|
134
|
-
addJsonOption(loop
|
|
135
|
-
.command('check-consistency')
|
|
136
|
-
.description('14.4: verify state consistency (placeholder; future slice compares .peaks/_runtime across sessions)')
|
|
137
|
-
.requiredOption('--project <path>', 'target project root')).action((options) => {
|
|
138
|
-
printResult(io, ok('loop.check-consistency', {
|
|
139
|
-
project: options.project,
|
|
140
|
-
status: 'placeholder',
|
|
141
|
-
nextSteps: [
|
|
142
|
-
'Compare .peaks/_runtime/<sid>/session.json across recent sessions for drift.',
|
|
143
|
-
'A future slice will report drift with severity (warn / fail).'
|
|
144
|
-
]
|
|
145
|
-
}, [], ['loop.check-consistency is a thin facade; the LLM-side UX layer composes the drift scan.']), options.json);
|
|
146
|
-
});
|
|
147
|
-
// ---------- M7: peaks loop export / import (spec §7A.2) ----------
|
|
148
|
-
const LOOP_EXPORT_IMPORT_OPTS = (cmd) => cmd
|
|
149
|
-
.option('--project <path>', 'target project root (defaults to cwd)')
|
|
150
|
-
.option('--json', 'print machine-readable JSON envelope');
|
|
151
|
-
LOOP_EXPORT_IMPORT_OPTS(loop
|
|
152
|
-
.command('export')
|
|
153
|
-
.description('M7: export a loop_release as a peaks.bundle/1 tarball (spec §7A.2 / §10 RL-9). Refuses to export when shareable=false.')
|
|
154
|
-
.requiredOption('--loop <id>', 'loop_release id (kebab-case)')
|
|
155
|
-
.requiredOption('--out <path>', 'output .tar.gz path')).action((options) => {
|
|
156
|
-
const asJson = options.json === true;
|
|
157
|
-
try {
|
|
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 result = writeBundle({
|
|
165
|
-
db,
|
|
166
|
-
blobsDir: join(projectRoot, '.peaks', 'blobs'),
|
|
167
|
-
kind: 'loop',
|
|
168
|
-
id: options.loop,
|
|
169
|
-
outPath: options.out
|
|
170
|
-
});
|
|
171
|
-
printResult(io, ok('loop.export', {
|
|
172
|
-
outPath: result.outPath,
|
|
173
|
-
kind: result.kind,
|
|
174
|
-
assetId: result.assetId,
|
|
175
|
-
importedAs: 'candidate'
|
|
176
|
-
}, [], [
|
|
177
|
-
`Receiver must run \`peaks loop import --in ${result.outPath}\` to land this bundle, then run an independent evolution_evaluation before any promote.`
|
|
178
|
-
]), asJson);
|
|
179
|
-
}
|
|
180
|
-
finally {
|
|
181
|
-
db.close();
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
catch (error) {
|
|
185
|
-
if (error instanceof BundleNotShareableError) {
|
|
186
|
-
printResult(io, fail('loop.export', error.code, error.message, { ok: false, loop: options.loop }, ['Set shareable=true on the loop_release row, or share via desktop_visible=false.']), asJson);
|
|
187
|
-
process.exitCode = 1;
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
if (error instanceof BundleAssetNotFoundError) {
|
|
191
|
-
printResult(io, fail('loop.export', error.code, error.message, { ok: false, loop: options.loop }, ['Verify the loop id with `peaks asset status --loop <id>`.']), asJson);
|
|
192
|
-
process.exitCode = 1;
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
printResult(io, fail('loop.export', 'LOOP_EXPORT_FAILED', getErrorMessage(error), { ok: false, loop: options.loop }, ['Verify --loop id and --out path.']), asJson);
|
|
196
|
-
process.exitCode = 1;
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
LOOP_EXPORT_IMPORT_OPTS(loop
|
|
200
|
-
.command('import')
|
|
201
|
-
.description('M7: import a peaks.bundle/1 tarball. Lands as candidate only — promotion requires an evolution_evaluation row (spec §7A.2 / §10 RL-9 / AC-25 / AC-26).')
|
|
202
|
-
.requiredOption('--in <path>', 'input .tar.gz path')
|
|
203
|
-
.option('--as <id>', 'optional rename for the loop id when landing')).action((options) => {
|
|
204
|
-
const asJson = options.json === true;
|
|
205
|
-
try {
|
|
206
|
-
const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
|
|
207
|
-
if (!existsSync(join(projectRoot, '.peaks'))) {
|
|
208
|
-
mkdirSync(join(projectRoot, '.peaks'), { recursive: true });
|
|
209
|
-
}
|
|
210
|
-
const db = openStateDb(join(projectRoot, '.peaks', 'state.db'));
|
|
211
|
-
try {
|
|
212
|
-
const result = readBundle({
|
|
213
|
-
db,
|
|
214
|
-
blobsDir: join(projectRoot, '.peaks', 'blobs'),
|
|
215
|
-
inPath: options.in,
|
|
216
|
-
...(options.as !== undefined ? { asName: options.as } : {})
|
|
217
|
-
});
|
|
218
|
-
printResult(io, ok('loop.import', {
|
|
219
|
-
assetId: result.assetId,
|
|
220
|
-
kind: result.kind,
|
|
221
|
-
importedAs: result.importedAs,
|
|
222
|
-
warnings: result.warnings,
|
|
223
|
-
evidenceBriefCount: result.evidenceBriefCount
|
|
224
|
-
}, result.warnings, [
|
|
225
|
-
`Run an independent evaluation against this release before promoting; peaks loop promote refuses without an evolution_evaluation row.`
|
|
226
|
-
]), asJson);
|
|
227
|
-
}
|
|
228
|
-
finally {
|
|
229
|
-
db.close();
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
catch (error) {
|
|
233
|
-
if (error instanceof BundleMajorVersionMismatchError) {
|
|
234
|
-
printResult(io, fail('loop.import', error.code, error.message, { ok: false, receivedMajor: error.receivedMajor }, [
|
|
235
|
-
'Use the matching peaks.bundle/<major> reader; this peaks build only supports major=1.'
|
|
236
|
-
]), asJson);
|
|
237
|
-
process.exitCode = 1;
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
if (error instanceof BundleSchemaVersionsMismatchError) {
|
|
241
|
-
printResult(io, fail('loop.import', error.code, error.message, { ok: false }, [
|
|
242
|
-
'Source bundle did not declare the canonical schema versions; refuse the bundle.'
|
|
243
|
-
]), asJson);
|
|
244
|
-
process.exitCode = 1;
|
|
245
|
-
return;
|
|
246
|
-
}
|
|
247
|
-
if (error instanceof BundleImportToStableForbiddenError) {
|
|
248
|
-
printResult(io, fail('loop.import', error.code, error.message, { ok: false }, [
|
|
249
|
-
'Bundles always land as candidate; promotion to stable requires an evolution_evaluation row (AC-26).'
|
|
250
|
-
]), asJson);
|
|
251
|
-
process.exitCode = 1;
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
|
-
if (error instanceof BundleMalformedError) {
|
|
255
|
-
printResult(io, fail('loop.import', error.code, error.message, { ok: false, inPath: options.in }, ['Re-export from the source via `peaks loop export`.']), asJson);
|
|
256
|
-
process.exitCode = 1;
|
|
257
|
-
return;
|
|
258
|
-
}
|
|
259
|
-
printResult(io, fail('loop.import', 'LOOP_IMPORT_FAILED', getErrorMessage(error), { ok: false, inPath: options.in }, ['Verify the bundle path and integrity.']), asJson);
|
|
260
|
-
process.exitCode = 1;
|
|
261
|
-
}
|
|
262
|
-
});
|
|
58
|
+
}
|
|
59
|
+
/** Spawn `peaks memory extract` and report the first 200 bytes of its stdout. */
|
|
60
|
+
async function extractMemoryViaDelegate(options) {
|
|
61
|
+
const apply = options.apply === true;
|
|
62
|
+
const { execFileSync } = (await import('node:child_process'));
|
|
63
|
+
const args = ['memory', 'extract', '--project', options.project];
|
|
64
|
+
if (apply)
|
|
65
|
+
args.push('--apply');
|
|
66
|
+
const stdout = execFileSync('node', ['bin/peaks.js', ...args], {
|
|
67
|
+
cwd: options.project,
|
|
68
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
69
|
+
windowsHide: true
|
|
70
|
+
}).toString('utf-8');
|
|
71
|
+
return { project: options.project, apply, delegateStdout: stdout.slice(0, 200) };
|
|
72
|
+
}
|
|
73
|
+
/** The two sentences `loop.distill` tells the caller about what it just ran. */
|
|
74
|
+
function distillNextActions(options) {
|
|
75
|
+
return [
|
|
76
|
+
options.apply === true
|
|
77
|
+
? 'peaks memory extract --apply was invoked'
|
|
78
|
+
: 'peaks memory extract dry-run was invoked',
|
|
79
|
+
'A future slice will inline the memory extract (not via execFileSync).'
|
|
80
|
+
];
|
|
263
81
|
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// src/cli/commands/loop-export-command.ts
|
|
2
|
+
//
|
|
3
|
+
// `peaks loop export` (M7, spec §7A.2) — export a loop_release as a
|
|
4
|
+
// `peaks.bundle/1` tarball, hard-blocked when the source has `shareable=false`.
|
|
5
|
+
// Extracted from `loop-commands.ts`; the registered name, description, options,
|
|
6
|
+
// refusal codes and envelope are unchanged.
|
|
7
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { fail, getErrorMessage, ok } from 'peaks-loop-shared/result';
|
|
10
|
+
import { openStateDb } from '../../services/skillhub/sqlite-store.js';
|
|
11
|
+
import { BundleAssetNotFoundError, BundleNotShareableError, writeBundle } from '../../services/share/bundle-writer.js';
|
|
12
|
+
import { printResult } from '../cli-helpers.js';
|
|
13
|
+
import { LOOP_EXPORT_IMPORT_OPTS, resolveLoopProjectRoot } from './loop-command-shared.js';
|
|
14
|
+
export function registerLoopExportCommand(loop, io) {
|
|
15
|
+
LOOP_EXPORT_IMPORT_OPTS(loop
|
|
16
|
+
.command('export')
|
|
17
|
+
.description('M7: export a loop_release as a peaks.bundle/1 tarball (spec §7A.2 / §10 RL-9). Refuses to export when shareable=false.')
|
|
18
|
+
.requiredOption('--loop <id>', 'loop_release id (kebab-case)')
|
|
19
|
+
.requiredOption('--out <path>', 'output .tar.gz path')).action((options) => {
|
|
20
|
+
const asJson = options.json === true;
|
|
21
|
+
try {
|
|
22
|
+
const result = exportLoopBundle(options);
|
|
23
|
+
printResult(io, ok('loop.export', {
|
|
24
|
+
outPath: result.outPath,
|
|
25
|
+
kind: result.kind,
|
|
26
|
+
assetId: result.assetId,
|
|
27
|
+
importedAs: 'candidate'
|
|
28
|
+
}, [], [
|
|
29
|
+
`Receiver must run \`peaks loop import --in ${result.outPath}\` to land this bundle, then run an independent evolution_evaluation before any promote.`
|
|
30
|
+
]), asJson);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
const refusal = exportRefusal(error, options.loop) ??
|
|
34
|
+
fail('loop.export', 'LOOP_EXPORT_FAILED', getErrorMessage(error), { ok: false, loop: options.loop }, ['Verify --loop id and --out path.']);
|
|
35
|
+
printResult(io, refusal, asJson);
|
|
36
|
+
process.exitCode = 1;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/** Open `<projectRoot>/.peaks/state.db` (creating `.peaks/`) and write the bundle. */
|
|
41
|
+
function exportLoopBundle(options) {
|
|
42
|
+
const projectRoot = resolveLoopProjectRoot(options.project);
|
|
43
|
+
if (!existsSync(join(projectRoot, '.peaks'))) {
|
|
44
|
+
mkdirSync(join(projectRoot, '.peaks'), { recursive: true });
|
|
45
|
+
}
|
|
46
|
+
const db = openStateDb(join(projectRoot, '.peaks', 'state.db'));
|
|
47
|
+
try {
|
|
48
|
+
return writeBundle({
|
|
49
|
+
db,
|
|
50
|
+
blobsDir: join(projectRoot, '.peaks', 'blobs'),
|
|
51
|
+
kind: 'loop',
|
|
52
|
+
id: options.loop,
|
|
53
|
+
outPath: options.out
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
db.close();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/** The two named refusals `writeBundle` raises, or `null` for anything else. */
|
|
61
|
+
function exportRefusal(error, loop) {
|
|
62
|
+
if (error instanceof BundleNotShareableError) {
|
|
63
|
+
return fail('loop.export', error.code, error.message, { ok: false, loop }, [
|
|
64
|
+
'Set shareable=true on the loop_release row, or share via desktop_visible=false.'
|
|
65
|
+
]);
|
|
66
|
+
}
|
|
67
|
+
if (error instanceof BundleAssetNotFoundError) {
|
|
68
|
+
return fail('loop.export', error.code, error.message, { ok: false, loop }, [
|
|
69
|
+
'Verify the loop id with `peaks asset status --loop <id>`.'
|
|
70
|
+
]);
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|