peaks-loop 4.1.2 → 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 +136 -47
- package/CHANGELOG.md +112 -0
- package/README-en.md +1 -1
- package/README.md +1 -1
- package/contracts/readonly-argv-whitelist.json +211 -0
- 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/audit-artifact-runners.d.ts +16 -0
- package/dist/cli/commands/audit-artifact-runners.js +170 -0
- package/dist/cli/commands/audit-command-shared.d.ts +97 -0
- package/dist/cli/commands/audit-command-shared.js +60 -0
- package/dist/cli/commands/audit-commands.d.ts +7 -31
- package/dist/cli/commands/audit-commands.js +64 -473
- package/dist/cli/commands/audit-goal-runners.d.ts +17 -0
- package/dist/cli/commands/audit-goal-runners.js +114 -0
- package/dist/cli/commands/audit-red-lines-runners.d.ts +11 -0
- package/dist/cli/commands/audit-red-lines-runners.js +43 -0
- package/dist/cli/commands/audit-refusal-data.d.ts +23 -0
- package/dist/cli/commands/audit-refusal-data.js +69 -0
- package/dist/cli/commands/audit-static-runners.d.ts +13 -0
- package/dist/cli/commands/audit-static-runners.js +139 -0
- package/dist/cli/commands/await-runners.d.ts +11 -0
- package/dist/cli/commands/await-runners.js +148 -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-auto-compact-command.d.ts +3 -0
- package/dist/cli/commands/code-auto-compact-command.js +124 -0
- package/dist/cli/commands/code-auto-compact-envelope.d.ts +22 -0
- package/dist/cli/commands/code-auto-compact-envelope.js +39 -0
- package/dist/cli/commands/code-context-audit-command.d.ts +3 -0
- package/dist/cli/commands/code-context-audit-command.js +68 -0
- package/dist/cli/commands/code-context-now-command.d.ts +3 -0
- package/dist/cli/commands/code-context-now-command.js +124 -0
- package/dist/cli/commands/code-context-now-envelope.d.ts +66 -0
- package/dist/cli/commands/code-context-now-envelope.js +136 -0
- package/dist/cli/commands/code-context-now-mapping.d.ts +27 -0
- package/dist/cli/commands/code-context-now-mapping.js +43 -0
- package/dist/cli/commands/code-emit-handoff-command.d.ts +3 -0
- package/dist/cli/commands/code-emit-handoff-command.js +136 -0
- package/dist/cli/commands/code-gate-step-08-command.d.ts +3 -0
- package/dist/cli/commands/code-gate-step-08-command.js +155 -0
- package/dist/cli/commands/code-post-compact-detect-command.d.ts +3 -0
- package/dist/cli/commands/code-post-compact-detect-command.js +50 -0
- package/dist/cli/commands/code-runtime-commands.d.ts +9 -43
- package/dist/cli/commands/code-runtime-commands.js +20 -672
- package/dist/cli/commands/code-runtime-session.d.ts +1 -0
- package/dist/cli/commands/code-runtime-session.js +15 -0
- 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/compact-command.d.ts +6 -2
- package/dist/cli/commands/compact-command.js +12 -559
- package/dist/cli/commands/compact-dry-run-command.d.ts +3 -0
- package/dist/cli/commands/compact-dry-run-command.js +87 -0
- package/dist/cli/commands/compact-force-command.d.ts +3 -0
- package/dist/cli/commands/compact-force-command.js +98 -0
- package/dist/cli/commands/compact-harness-window-command.d.ts +3 -0
- package/dist/cli/commands/compact-harness-window-command.js +174 -0
- package/dist/cli/commands/compact-history-command.d.ts +3 -0
- package/dist/cli/commands/compact-history-command.js +89 -0
- package/dist/cli/commands/compact-read-commands.d.ts +3 -0
- package/dist/cli/commands/compact-read-commands.js +123 -0
- package/dist/cli/commands/compact-settle-command.d.ts +3 -0
- package/dist/cli/commands/compact-settle-command.js +130 -0
- package/dist/cli/commands/compact-shared.d.ts +9 -0
- package/dist/cli/commands/compact-shared.js +26 -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/skill-command.d.ts +1 -44
- package/dist/cli/commands/core/skill-command.js +13 -541
- package/dist/cli/commands/core/skill-context-verdict.d.ts +38 -0
- package/dist/cli/commands/core/skill-context-verdict.js +63 -0
- package/dist/cli/commands/core/skill-generated-config-notice.d.ts +41 -0
- package/dist/cli/commands/core/skill-generated-config-notice.js +75 -0
- package/dist/cli/commands/core/skill-heartbeat-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-heartbeat-commands.js +50 -0
- package/dist/cli/commands/core/skill-presence-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-presence-commands.js +123 -0
- package/dist/cli/commands/core/skill-presence-housekeeping-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-presence-housekeeping-commands.js +165 -0
- package/dist/cli/commands/core/skill-registry-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-registry-commands.js +117 -0
- package/dist/cli/commands/core/skill-runbook-command.d.ts +3 -0
- package/dist/cli/commands/core/skill-runbook-command.js +29 -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-command-spec.d.ts +2 -0
- package/dist/cli/commands/dispatch-command-spec.js +62 -0
- package/dist/cli/commands/dispatch-commands.js +159 -775
- 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-detached-branch.d.ts +3 -0
- package/dist/cli/commands/dispatch-detached-branch.js +58 -0
- package/dist/cli/commands/dispatch-envelope.d.ts +36 -0
- package/dist/cli/commands/dispatch-envelope.js +104 -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/dispatch-isolation-lease.d.ts +17 -0
- package/dist/cli/commands/dispatch-isolation-lease.js +149 -0
- package/dist/cli/commands/dispatch-preflight.d.ts +7 -0
- package/dist/cli/commands/dispatch-preflight.js +105 -0
- package/dist/cli/commands/dispatch-prompt-blocks.d.ts +10 -0
- package/dist/cli/commands/dispatch-prompt-blocks.js +56 -0
- package/dist/cli/commands/dispatch-prompt-composition.d.ts +30 -0
- package/dist/cli/commands/dispatch-prompt-composition.js +171 -0
- package/dist/cli/commands/dispatch-record-write.d.ts +24 -0
- package/dist/cli/commands/dispatch-record-write.js +96 -0
- package/dist/cli/commands/dispatch-tool-call.d.ts +15 -0
- package/dist/cli/commands/dispatch-tool-call.js +128 -0
- package/dist/cli/commands/evolution-command-shared.d.ts +78 -0
- package/dist/cli/commands/evolution-command-shared.js +107 -0
- package/dist/cli/commands/evolution-commands.d.ts +11 -1
- package/dist/cli/commands/evolution-commands.js +19 -350
- package/dist/cli/commands/evolution-evaluate-command.d.ts +24 -0
- package/dist/cli/commands/evolution-evaluate-command.js +138 -0
- package/dist/cli/commands/evolution-propose-command.d.ts +23 -0
- package/dist/cli/commands/evolution-propose-command.js +145 -0
- package/dist/cli/commands/evolution-status-command.d.ts +17 -0
- package/dist/cli/commands/evolution-status-command.js +41 -0
- package/dist/cli/commands/evolution-verdict-commands.d.ts +30 -0
- package/dist/cli/commands/evolution-verdict-commands.js +100 -0
- 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/finalize-accumulator.d.ts +44 -0
- package/dist/cli/commands/finalize-accumulator.js +55 -0
- package/dist/cli/commands/finalize-branches.d.ts +34 -0
- package/dist/cli/commands/finalize-branches.js +119 -0
- package/dist/cli/commands/finalize-runners.d.ts +3 -0
- package/dist/cli/commands/finalize-runners.js +92 -0
- package/dist/cli/commands/finalize-selection.d.ts +65 -0
- package/dist/cli/commands/finalize-selection.js +35 -0
- package/dist/cli/commands/gate-commands.js +26 -8
- 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/job-checkpoint-commands.d.ts +3 -0
- package/dist/cli/commands/job-checkpoint-commands.js +157 -0
- package/dist/cli/commands/job-command-shared.d.ts +109 -0
- package/dist/cli/commands/job-command-shared.js +72 -0
- package/dist/cli/commands/job-commands.d.ts +4 -64
- package/dist/cli/commands/job-commands.js +42 -552
- package/dist/cli/commands/job-cost-check-command.d.ts +3 -0
- package/dist/cli/commands/job-cost-check-command.js +41 -0
- package/dist/cli/commands/job-init-status-commands.d.ts +3 -0
- package/dist/cli/commands/job-init-status-commands.js +149 -0
- package/dist/cli/commands/job-run-commands.d.ts +3 -0
- package/dist/cli/commands/job-run-commands.js +97 -0
- package/dist/cli/commands/job-state-root.d.ts +35 -0
- package/dist/cli/commands/job-state-root.js +76 -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-eval-capture-index.d.ts +4 -0
- package/dist/cli/commands/loop-eval-capture-index.js +44 -0
- package/dist/cli/commands/loop-eval-commands.d.ts +8 -5
- package/dist/cli/commands/loop-eval-commands.js +12 -626
- package/dist/cli/commands/loop-eval-eval-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-eval-command.js +168 -0
- package/dist/cli/commands/loop-eval-monotonic-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-monotonic-command.js +90 -0
- package/dist/cli/commands/loop-eval-parents.d.ts +7 -0
- package/dist/cli/commands/loop-eval-parents.js +20 -0
- package/dist/cli/commands/loop-eval-run-code.d.ts +7 -0
- package/dist/cli/commands/loop-eval-run-code.js +40 -0
- package/dist/cli/commands/loop-eval-run-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-run-command.js +113 -0
- package/dist/cli/commands/loop-eval-spec-commands.d.ts +3 -0
- package/dist/cli/commands/loop-eval-spec-commands.js +165 -0
- package/dist/cli/commands/loop-eval-spec-lint-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-spec-lint-command.js +42 -0
- package/dist/cli/commands/loop-eval-workflow-commands.d.ts +3 -0
- package/dist/cli/commands/loop-eval-workflow-commands.js +141 -0
- 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/mcp-commands.d.ts +10 -0
- package/dist/cli/commands/mcp-commands.js +157 -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/request-command-options.d.ts +49 -0
- package/dist/cli/commands/request-command-options.js +1 -0
- package/dist/cli/commands/request-commands.d.ts +3 -9
- package/dist/cli/commands/request-commands.js +17 -522
- package/dist/cli/commands/request-init-command.d.ts +3 -0
- package/dist/cli/commands/request-init-command.js +100 -0
- package/dist/cli/commands/request-lint-command.d.ts +3 -0
- package/dist/cli/commands/request-lint-command.js +50 -0
- package/dist/cli/commands/request-list-command.d.ts +10 -0
- package/dist/cli/commands/request-list-command.js +53 -0
- package/dist/cli/commands/request-repair-status-command.d.ts +3 -0
- package/dist/cli/commands/request-repair-status-command.js +61 -0
- package/dist/cli/commands/request-show-command.d.ts +3 -0
- package/dist/cli/commands/request-show-command.js +56 -0
- package/dist/cli/commands/request-transition-command.d.ts +3 -0
- package/dist/cli/commands/request-transition-command.js +122 -0
- package/dist/cli/commands/request-transition-failures.d.ts +8 -0
- package/dist/cli/commands/request-transition-failures.js +90 -0
- package/dist/cli/commands/request-transition-hooks.d.ts +50 -0
- package/dist/cli/commands/request-transition-hooks.js +115 -0
- package/dist/cli/commands/request-transition-preflight.d.ts +10 -0
- package/dist/cli/commands/request-transition-preflight.js +107 -0
- package/dist/cli/commands/scan-command-shared.d.ts +96 -0
- package/dist/cli/commands/scan-command-shared.js +83 -0
- package/dist/cli/commands/scan-commands.d.ts +3 -2
- package/dist/cli/commands/scan-commands.js +23 -463
- package/dist/cli/commands/scan-inventory-commands.d.ts +3 -0
- package/dist/cli/commands/scan-inventory-commands.js +96 -0
- package/dist/cli/commands/scan-project-commands.d.ts +3 -0
- package/dist/cli/commands/scan-project-commands.js +65 -0
- package/dist/cli/commands/scan-scope-commands.d.ts +3 -0
- package/dist/cli/commands/scan-scope-commands.js +149 -0
- package/dist/cli/commands/scan-scope-helpers.d.ts +8 -0
- package/dist/cli/commands/scan-scope-helpers.js +54 -0
- package/dist/cli/commands/scan-structural-commands.d.ts +3 -0
- package/dist/cli/commands/scan-structural-commands.js +113 -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/share-commands.d.ts +12 -68
- package/dist/cli/commands/share-commands.js +47 -556
- package/dist/cli/commands/share-error-hints.d.ts +14 -0
- package/dist/cli/commands/share-error-hints.js +38 -0
- package/dist/cli/commands/share-identity.d.ts +13 -0
- package/dist/cli/commands/share-identity.js +22 -0
- package/dist/cli/commands/share-record-paths.d.ts +37 -0
- package/dist/cli/commands/share-record-paths.js +68 -0
- package/dist/cli/commands/share-runners.d.ts +3 -0
- package/dist/cli/commands/share-runners.js +158 -0
- package/dist/cli/commands/shared-read-runners.d.ts +3 -0
- package/dist/cli/commands/shared-read-runners.js +51 -0
- package/dist/cli/commands/slice-check-command.d.ts +3 -0
- package/dist/cli/commands/slice-check-command.js +54 -0
- package/dist/cli/commands/slice-commands.d.ts +2 -22
- package/dist/cli/commands/slice-commands.js +18 -517
- package/dist/cli/commands/slice-decompose-artifacts.d.ts +18 -0
- package/dist/cli/commands/slice-decompose-artifacts.js +79 -0
- package/dist/cli/commands/slice-decompose-command.d.ts +3 -0
- package/dist/cli/commands/slice-decompose-command.js +123 -0
- package/dist/cli/commands/slice-list-commands.d.ts +3 -0
- package/dist/cli/commands/slice-list-commands.js +182 -0
- package/dist/cli/commands/slice-pick-command.d.ts +3 -0
- package/dist/cli/commands/slice-pick-command.js +60 -0
- package/dist/cli/commands/slice-plan-command.d.ts +24 -0
- package/dist/cli/commands/slice-plan-command.js +111 -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-commands.d.ts +10 -1
- package/dist/cli/commands/workflow-commands.js +6 -594
- package/dist/cli/commands/workflow-gate-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-gate-commands.js +116 -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-plan-helpers.d.ts +48 -0
- package/dist/cli/commands/workflow-plan-helpers.js +103 -0
- package/dist/cli/commands/workflow-planning-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-planning-commands.js +56 -0
- package/dist/cli/commands/workflow-swarm-actions.d.ts +7 -0
- package/dist/cli/commands/workflow-swarm-actions.js +109 -0
- package/dist/cli/commands/workflow-swarm-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-swarm-commands.js +138 -0
- package/dist/cli/commands/workflow-tech-actions.d.ts +10 -0
- package/dist/cli/commands/workflow-tech-actions.js +150 -0
- package/dist/cli/commands/workflow-terminalize-command.d.ts +3 -0
- package/dist/cli/commands/workflow-terminalize-command.js +56 -0
- package/dist/cli/commands/workspace/init-actions.d.ts +10 -0
- package/dist/cli/commands/workspace/init-actions.js +199 -0
- package/dist/cli/commands/workspace/init-codegraph-stake.d.ts +10 -0
- package/dist/cli/commands/workspace/init-codegraph-stake.js +54 -0
- package/dist/cli/commands/workspace/init-command.d.ts +8 -124
- package/dist/cli/commands/workspace/init-command.js +59 -623
- package/dist/cli/commands/workspace/init-context.d.ts +58 -0
- package/dist/cli/commands/workspace/init-context.js +121 -0
- package/dist/cli/commands/workspace/init-envelope.d.ts +3 -0
- package/dist/cli/commands/workspace/init-envelope.js +34 -0
- package/dist/cli/commands/workspace/init-failures.d.ts +3 -0
- package/dist/cli/commands/workspace/init-failures.js +84 -0
- package/dist/cli/commands/workspace/init-hooks-decision.d.ts +24 -0
- package/dist/cli/commands/workspace/init-hooks-decision.js +189 -0
- package/dist/cli/commands/workspace/init-options.d.ts +102 -0
- package/dist/cli/commands/workspace/init-options.js +1 -0
- package/dist/cli/commands/worktree-lease-commands.d.ts +10 -6
- package/dist/cli/commands/worktree-lease-commands.js +42 -512
- package/dist/cli/commands/worktree-lease-gc-command.d.ts +12 -0
- package/dist/cli/commands/worktree-lease-gc-command.js +117 -0
- package/dist/cli/commands/worktree-lease-git.d.ts +22 -0
- package/dist/cli/commands/worktree-lease-git.js +48 -0
- package/dist/cli/commands/worktree-lease-list-command.d.ts +12 -0
- package/dist/cli/commands/worktree-lease-list-command.js +100 -0
- package/dist/cli/commands/worktree-lease-load.d.ts +37 -0
- package/dist/cli/commands/worktree-lease-load.js +28 -0
- package/dist/cli/commands/worktree-lease-release-command.d.ts +13 -0
- package/dist/cli/commands/worktree-lease-release-command.js +105 -0
- package/dist/cli/commands/worktree-lease-renew-command.d.ts +11 -0
- package/dist/cli/commands/worktree-lease-renew-command.js +99 -0
- package/dist/cli/commands/worktree-lease-session.d.ts +22 -0
- package/dist/cli/commands/worktree-lease-session.js +29 -0
- package/dist/cli/commands/worktree-lease-spawn-command.d.ts +11 -0
- package/dist/cli/commands/worktree-lease-spawn-command.js +119 -0
- package/dist/cli/commands/worktree-lease-status-command.d.ts +11 -0
- package/dist/cli/commands/worktree-lease-status-command.js +86 -0
- package/dist/cli/commands/worktree-lease-store.d.ts +19 -0
- package/dist/cli/commands/worktree-lease-store.js +24 -0
- package/dist/cli/program.js +5 -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/distribution/mcp-install-runner.d.ts +21 -0
- package/dist/services/distribution/mcp-install-runner.js +59 -0
- package/dist/services/distribution/mcp-install.d.ts +95 -0
- package/dist/services/distribution/mcp-install.js +179 -0
- package/dist/services/distribution/plugin-manifest.d.ts +97 -0
- package/dist/services/distribution/plugin-manifest.js +126 -0
- package/dist/services/hooks/mcp-surface-gate.d.ts +19 -0
- package/dist/services/hooks/mcp-surface-gate.js +87 -0
- package/dist/services/ide/adapters/claude-code-adapter.d.ts +4 -35
- package/dist/services/ide/adapters/claude-code-adapter.js +48 -171
- package/dist/services/ide/adapters/claude-code-local-state.d.ts +28 -0
- package/dist/services/ide/adapters/claude-code-local-state.js +112 -0
- package/dist/services/ide/adapters/claude-code-model-window.d.ts +37 -0
- package/dist/services/ide/adapters/claude-code-model-window.js +113 -0
- package/dist/services/ide/ide-mcp-install-types.d.ts +78 -0
- package/dist/services/ide/ide-mcp-install-types.js +104 -0
- package/dist/services/ide/ide-types.d.ts +45 -1
- package/dist/services/ide/mcp-tool-matcher.d.ts +34 -0
- package/dist/services/ide/mcp-tool-matcher.js +84 -0
- package/dist/services/lint/npx-resolver.js +7 -0
- package/dist/services/mcp/cli-executor.d.ts +36 -0
- package/dist/services/mcp/cli-executor.js +97 -0
- package/dist/services/mcp/json-rpc.d.ts +81 -0
- package/dist/services/mcp/json-rpc.js +116 -0
- package/dist/services/mcp/memory-tool.d.ts +3 -0
- package/dist/services/mcp/memory-tool.js +62 -0
- package/dist/services/mcp/server-main.d.ts +1 -0
- package/dist/services/mcp/server-main.js +66 -0
- package/dist/services/mcp/server.d.ts +22 -0
- package/dist/services/mcp/server.js +152 -0
- package/dist/services/mcp/surface.d.ts +62 -0
- package/dist/services/mcp/surface.js +198 -0
- package/dist/services/mcp/tool-core.d.ts +42 -0
- package/dist/services/mcp/tool-core.js +137 -0
- package/dist/services/mcp/tools.d.ts +13 -0
- package/dist/services/mcp/tools.js +58 -0
- package/dist/services/readonly-surface/argv-guard.d.ts +32 -0
- package/dist/services/readonly-surface/argv-guard.js +164 -0
- package/dist/services/readonly-surface/readonly-whitelist.d.ts +147 -0
- package/dist/services/readonly-surface/readonly-whitelist.js +107 -0
- package/dist/services/readonly-surface/whitelist-generator.d.ts +64 -0
- package/dist/services/readonly-surface/whitelist-generator.js +212 -0
- package/dist/services/skills/hooks-codegate-superpowers.d.ts +1 -0
- package/dist/services/skills/hooks-codegate-superpowers.js +26 -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 -649
- 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 +17 -6
- package/scripts/install-skills-bundles.mjs +233 -0
- package/scripts/install-skills-fs.mjs +148 -0
- package/scripts/install-skills-ide.mjs +279 -0
- package/scripts/install-skills-output-style-default.mjs +196 -0
- package/scripts/install-skills-output-styles.mjs +121 -0
- package/scripts/install-skills-report.mjs +42 -0
- package/scripts/install-skills-user-config.mjs +198 -0
- package/scripts/install-skills.mjs +36 -1066
- package/scripts/watch-tree.mjs +140 -0
- package/scripts/watch.mjs +4 -126
- package/skills/peaks-status/SKILL.md +31 -13
|
@@ -1,523 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
* PRD-002b slice 2 — extract CLI listing-pagination + table-format
|
|
14
|
-
* constants. Values are bytewise-identical to the original literals.
|
|
15
|
-
*/
|
|
16
|
-
const SLICE_LIST_DEFAULT_LIMIT = 50;
|
|
17
|
-
const SLICE_LIST_MAX_LIMIT = 500;
|
|
18
|
-
const SLICE_LIST_RID_COL_WIDTH = 34;
|
|
19
|
-
const SLICE_LIST_MTIME_COL_WIDTH = 22;
|
|
20
|
-
const SLICE_LIST_SIZE_COL_WIDTH = 8;
|
|
21
|
-
const SLICE_LIST_PICKED_COL_WIDTH = 6;
|
|
22
|
-
const SLICE_LIST_SEPARATOR_WIDTH = 76;
|
|
1
|
+
import { registerSliceCheckCommand } from './slice-check-command.js';
|
|
2
|
+
import { registerSliceListCommand } from './slice-list-commands.js';
|
|
3
|
+
import { registerSliceDecomposeCommand } from './slice-decompose-command.js';
|
|
4
|
+
import { registerSlicePickCommand } from './slice-pick-command.js';
|
|
5
|
+
import { registerSlicePlanCommand } from './slice-plan-command.js';
|
|
6
|
+
// Published import path preserved (the `-picked.json` envelope validator has
|
|
7
|
+
// always been exported from this module).
|
|
8
|
+
export { parsePickedFile } from './slice-plan-command.js';
|
|
9
|
+
const SLICE_DESCRIPTION = 'Slice lifecycle: check (boundary), decompose (PRD -> 6-stage algorithm), ' +
|
|
10
|
+
'pick (fzf multi-select), plan (apply via peaks request init). ' +
|
|
11
|
+
'`peaks slice check` is the post-micro-cycle boundary gate (4 stages). ' +
|
|
12
|
+
'`decompose/pick/plan` form the new slice-decomposition pipeline.';
|
|
23
13
|
export function registerSliceCommands(program, io) {
|
|
24
|
-
const slice = program
|
|
25
|
-
.command('slice')
|
|
26
|
-
.description('Slice lifecycle: check (boundary), decompose (PRD -> 6-stage algorithm), ' +
|
|
27
|
-
'pick (fzf multi-select), plan (apply via peaks request init). ' +
|
|
28
|
-
'`peaks slice check` is the post-micro-cycle boundary gate (4 stages). ' +
|
|
29
|
-
'`decompose/pick/plan` form the new slice-decomposition pipeline.');
|
|
14
|
+
const slice = program.command('slice').description(SLICE_DESCRIPTION);
|
|
30
15
|
// ---------- peaks slice check (existing) ----------
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
.description('Boundary check for a slice (post-micro-cycle, pre-peaks-qa). ' +
|
|
34
|
-
'Runs 4 stages in order: typecheck -> unit-tests (changed-only by default; ' +
|
|
35
|
-
'use --run-tests for the full suite, or --skip-tests to opt out) -> ' +
|
|
36
|
-
'review-fanout -> gate-verify-pipeline. ' +
|
|
37
|
-
'Each stage reports pass / fail / skipped. ' +
|
|
38
|
-
'Exit 0 only if every stage passes or is skipped.')
|
|
39
|
-
.option('--project <path>', 'target project root', '.')
|
|
40
|
-
.option('--rid <rid>', 'request id; REQUIRED — there is no binding to fall back to, and slice check fails without it')
|
|
41
|
-
.option('--refresh-fanout', 're-run the 3-way review fan-out (peaks-rd) even if the review files already exist', false)
|
|
42
|
-
.option('--run-tests', 'opt in to the FULL test suite at the boundary (default is the changed-only suite via `vitest run --changed`); use the peaks-test skill to run the full suite standalone', false)
|
|
43
|
-
.option('--skip-tests', 'skip the unit-test stage entirely (e.g. docs-only slices); use the peaks-test skill to run the full suite manually if you want a separate check', false)
|
|
44
|
-
.option('--allow-pre-existing-failures', 'opt-in: if the unit-test stage fails, report it as `skipped` with a reason naming the failure count (useful when the repo has unrelated pre-existing failures; the long-term fix is to .skip or coverage.exclude those tests). Only meaningful with --run-tests or the default changed-only mode.', false)).action(async (options) => {
|
|
45
|
-
try {
|
|
46
|
-
const projectRoot = resolveCanonicalProjectRoot(options.project);
|
|
47
|
-
const result = await sliceCheck({
|
|
48
|
-
projectRoot,
|
|
49
|
-
...(options.rid ? { rid: options.rid } : {}),
|
|
50
|
-
refreshFanout: options.refreshFanout === true,
|
|
51
|
-
runTests: options.runTests === true,
|
|
52
|
-
skipTests: options.skipTests === true,
|
|
53
|
-
allowPreExistingFailures: options.allowPreExistingFailures === true
|
|
54
|
-
});
|
|
55
|
-
const warnings = [];
|
|
56
|
-
if (result.stages.some((s) => s.status === 'fail')) {
|
|
57
|
-
warnings.push(`${result.stages.filter((s) => s.status === 'fail').length} of ${result.stages.length} stages failed. 边界 NOT ready -- fix the failures and re-run, or proceed at your own risk.`);
|
|
58
|
-
}
|
|
59
|
-
printResult(io, ok('slice.check', result, warnings, result.nextActions), options.json ?? false);
|
|
60
|
-
if (!result.boundaryReady) {
|
|
61
|
-
process.exitCode = 1;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
catch (error) {
|
|
65
|
-
printResult(io, fail('slice.check', 'SLICE_CHECK_FAILED', getErrorMessage(error), { projectRoot: options.project }, [
|
|
66
|
-
`Verify the project path is a peaks repo and --rid names a slice (letters, digits, dots, underscores or dashes): ${options.rid ?? '(no --rid given)'}`
|
|
67
|
-
]), options.json ?? false);
|
|
68
|
-
process.exitCode = 1;
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
// Read-only listing of every decomposition artifact under
|
|
72
|
-
// .peaks/sc/slice-decomposition/. Used by operators to see what's
|
|
73
|
-
// accumulated; companion to a future `peaks slice cleanup` subcommand.
|
|
74
|
-
// Pure functions (`listDecompositions`, `computeStale`) are kept inline so
|
|
75
|
-
// the listing logic stays co-located with the subcommand (Karpathy #2:
|
|
76
|
-
// simplicity first — no speculative helper file).
|
|
77
|
-
addJsonOption(slice
|
|
78
|
-
.command('ls')
|
|
79
|
-
.description('List slice decomposition artifacts under .peaks/sc/slice-decomposition/. ' +
|
|
80
|
-
'Returns one row per distinct rid with mtime, sizeBytes, pickedPath, and isStale ' +
|
|
81
|
-
'(mtime > 30d). Use --stale-only to filter, --rid <substring> to narrow, ' +
|
|
82
|
-
'--limit <n> to cap. To remove stale entries, use `peaks slice cleanup` (separate slice).')
|
|
83
|
-
.option('--project <path>', 'target project root', '.')
|
|
84
|
-
.option('--limit <n>', 'cap result count (default 50, max 500)', (v) => parseInt(v, 10), SLICE_LIST_DEFAULT_LIMIT)
|
|
85
|
-
.option('--stale-only', 'only include rids older than the stale threshold', false)
|
|
86
|
-
.option('--rid <substring>', 'case-insensitive substring filter on rid', '')).action((options) => {
|
|
87
|
-
try {
|
|
88
|
-
const projectRoot = resolveCanonicalProjectRoot(options.project);
|
|
89
|
-
const limit = Math.max(1, Math.min(SLICE_LIST_MAX_LIMIT, options.limit ?? SLICE_LIST_DEFAULT_LIMIT));
|
|
90
|
-
const all = listDecompositions(projectRoot);
|
|
91
|
-
let filtered = all;
|
|
92
|
-
const ridSub = (options.rid ?? '').toLowerCase();
|
|
93
|
-
if (ridSub.length > 0) {
|
|
94
|
-
filtered = filtered.filter((row) => row.rid.toLowerCase().includes(ridSub));
|
|
95
|
-
}
|
|
96
|
-
if (options.staleOnly === true) {
|
|
97
|
-
filtered = filtered.filter((row) => row.isStale);
|
|
98
|
-
}
|
|
99
|
-
const truncated = filtered.length > limit;
|
|
100
|
-
const page = filtered.slice(0, limit);
|
|
101
|
-
if (options.json === true) {
|
|
102
|
-
const nextActions = [];
|
|
103
|
-
if (truncated) {
|
|
104
|
-
nextActions.push(`Result truncated to ${limit} rows; pass --limit <n> to see more.`);
|
|
105
|
-
}
|
|
106
|
-
if (page.some((r) => r.isStale)) {
|
|
107
|
-
nextActions.push('Some entries are stale (>30d). Use `peaks slice cleanup` to remove them.');
|
|
108
|
-
}
|
|
109
|
-
printResult(io, ok('slice.ls', {
|
|
110
|
-
rids: page,
|
|
111
|
-
truncated,
|
|
112
|
-
totalBeforeFilter: filtered.length,
|
|
113
|
-
totalScanned: all.length
|
|
114
|
-
}, [], nextActions), true);
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
// Plaintext mode: header + table
|
|
118
|
-
const lines = [];
|
|
119
|
-
lines.push('RID'.padEnd(SLICE_LIST_RID_COL_WIDTH) +
|
|
120
|
-
'MTIME'.padEnd(SLICE_LIST_MTIME_COL_WIDTH) +
|
|
121
|
-
'SIZE'.padEnd(SLICE_LIST_SIZE_COL_WIDTH) +
|
|
122
|
-
'PICKED'.padEnd(SLICE_LIST_PICKED_COL_WIDTH) +
|
|
123
|
-
'STALE');
|
|
124
|
-
lines.push('-'.repeat(SLICE_LIST_SEPARATOR_WIDTH));
|
|
125
|
-
for (const r of page) {
|
|
126
|
-
lines.push(r.rid.padEnd(SLICE_LIST_RID_COL_WIDTH) +
|
|
127
|
-
r.mtime.padEnd(SLICE_LIST_MTIME_COL_WIDTH) +
|
|
128
|
-
String(r.sizeBytes).padEnd(SLICE_LIST_SIZE_COL_WIDTH) +
|
|
129
|
-
(r.pickedPath ? 'yes' : 'no').padEnd(SLICE_LIST_PICKED_COL_WIDTH) +
|
|
130
|
-
(r.isStale ? 'yes' : 'no'));
|
|
131
|
-
}
|
|
132
|
-
if (truncated) {
|
|
133
|
-
lines.push(`... (${filtered.length - limit} more, --limit to see more)`);
|
|
134
|
-
}
|
|
135
|
-
if (page.length === 0) {
|
|
136
|
-
lines.push('(no slice decompositions found)');
|
|
137
|
-
}
|
|
138
|
-
process.stdout.write(lines.join('\n') + '\n');
|
|
139
|
-
}
|
|
140
|
-
catch (error) {
|
|
141
|
-
printResult(io, fail('slice.ls', 'SLICE_LS_FAILED', getErrorMessage(error), { projectRoot: options.project }, [
|
|
142
|
-
'Verify the project path is a peaks repo and .peaks/sc/slice-decomposition/ exists or can be created'
|
|
143
|
-
]), options.json ?? false);
|
|
144
|
-
process.exitCode = 1;
|
|
145
|
-
}
|
|
146
|
-
});
|
|
16
|
+
registerSliceCheckCommand(slice, io);
|
|
17
|
+
registerSliceListCommand(slice, io);
|
|
147
18
|
// ---------- peaks slice decompose (NEW) ----------
|
|
148
|
-
|
|
149
|
-
.command('decompose <rid>')
|
|
150
|
-
.description('Run the 6-stage slice-decomposition algorithm on a PRD. ' +
|
|
151
|
-
'Inputs: PRD body + peaks codegraph (project analysis is codegraph-first; structural import edges are the fallback). ' +
|
|
152
|
-
'Outputs: .peaks/sc/slice-decomposition/<rid>.json with critical-path, ' +
|
|
153
|
-
'parallel-batches, and per-slice work estimates. ' +
|
|
154
|
-
'Algorithm is fzf-free. Replay vs hand-derived 2.1.0 dry-run: +-10% on p50. ' +
|
|
155
|
-
'Pass --benchmark to also emit a SliceBenchmark envelope (totalMs, codegraphQueries, ' +
|
|
156
|
-
'p50ConfidenceDistribution, outputJsonBytes) and persist it under ' +
|
|
157
|
-
'.peaks/_runtime/<sid>/benchmarks/<rid>.benchmark.json for cross-version comparison.')
|
|
158
|
-
.option('--project <path>', 'target project root', '.')
|
|
159
|
-
.option('--refresh', 're-run `peaks codegraph index` before reading', false)
|
|
160
|
-
.option('--benchmark', 'record per-run metrics and attach to the result envelope (2.1.1 algorithm optimization comparison)', false)
|
|
161
|
-
.option('--granularity <value>', 'service | file | both | auto. Default "both" keeps the v1 6-stage path; service / file / auto enable v2 multi-pass decomposition (peaks-loop 2.9+) and emit a DecompositionResultV2 envelope via SchemaRouter', 'both')).action(async (rid, options) => {
|
|
162
|
-
// Validate --granularity BEFORE any I/O so invalid values fail fast with a
|
|
163
|
-
// nextActions hint listing the four allowed strings.
|
|
164
|
-
const granularity = options.granularity ?? 'both';
|
|
165
|
-
if (granularity !== 'service' &&
|
|
166
|
-
granularity !== 'file' &&
|
|
167
|
-
granularity !== 'both' &&
|
|
168
|
-
granularity !== 'auto') {
|
|
169
|
-
printResult(io, fail('slice.decompose', 'SLICE_DECOMPOSE_FAILED', `Invalid --granularity '${options.granularity}'.`, { rid, projectRoot: options.project }, [
|
|
170
|
-
`--granularity accepts one of: service, file, both, auto`,
|
|
171
|
-
`Default (omit the flag or pass "both") keeps the existing v1 path.`,
|
|
172
|
-
`Non-default values (service / file / auto) enable v2 multi-pass decomposition (peaks-loop 2.9+).`
|
|
173
|
-
]), options.json ?? false);
|
|
174
|
-
process.exitCode = 1;
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
try {
|
|
178
|
-
const projectRoot = resolveCanonicalProjectRoot(options.project);
|
|
179
|
-
const prdMarkdown = readPrdBody(rid, projectRoot);
|
|
180
|
-
// Non-default granularity takes the v2 path; default ("both") keeps v1.
|
|
181
|
-
if (granularity !== 'both') {
|
|
182
|
-
const v2Result = await multiPassDecompose(rid, prdMarkdown, projectRoot, {
|
|
183
|
-
...(options.refresh ? { refresh: true } : {}),
|
|
184
|
-
granularity
|
|
185
|
-
});
|
|
186
|
-
const outDir = join(projectRoot, '.peaks', 'sc', 'slice-decomposition');
|
|
187
|
-
if (!existsSync(outDir)) {
|
|
188
|
-
mkdirSync(outDir, { recursive: true });
|
|
189
|
-
}
|
|
190
|
-
const outPath = join(outDir, `${rid}.json`);
|
|
191
|
-
writeSchemaResult(outPath, v2Result);
|
|
192
|
-
const nextActions = [
|
|
193
|
-
`Decomposition (v2) written to ${outPath}`,
|
|
194
|
-
`peaks slice pick/plan: v2 schemas require SchemaRouter-aware consumers (peaks-loop 2.9+).`
|
|
195
|
-
];
|
|
196
|
-
printResult(io, ok('slice.decompose', { ...v2Result, outputPath: outPath }, [], nextActions), options.json ?? false);
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
let result;
|
|
200
|
-
let benchmark = null;
|
|
201
|
-
if (options.benchmark === true) {
|
|
202
|
-
const out = await decomposeSlicesWithBenchmark(rid, prdMarkdown, projectRoot, {
|
|
203
|
-
...(options.refresh ? { refresh: true } : {})
|
|
204
|
-
});
|
|
205
|
-
result = out.result;
|
|
206
|
-
benchmark = out.benchmark;
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
result = await decomposeSlices(rid, prdMarkdown, projectRoot, {
|
|
210
|
-
...(options.refresh ? { refresh: true } : {})
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
const outPath = writeDecompositionFile(rid, result, projectRoot);
|
|
214
|
-
const nextActions = [
|
|
215
|
-
`Decomposition written to ${outPath}`,
|
|
216
|
-
`Next: peaks slice pick ${rid} (requires fzf >= 0.38)`,
|
|
217
|
-
`Or manually craft -picked.json from the JSON output, then peaks slice plan ${rid}`
|
|
218
|
-
];
|
|
219
|
-
if (result.pickHint) {
|
|
220
|
-
nextActions.push(result.pickHint);
|
|
221
|
-
}
|
|
222
|
-
if (benchmark !== null) {
|
|
223
|
-
const benchPath = writeBenchmarkArtifact(rid, benchmark, projectRoot);
|
|
224
|
-
nextActions.push(`Benchmark: totalMs=${benchmark.totalMs} codegraphQueries=${benchmark.codegraphQueries} ` +
|
|
225
|
-
`p50Conf={low:${benchmark.p50ConfidenceDistribution.low},mid:${benchmark.p50ConfidenceDistribution.mid},high:${benchmark.p50ConfidenceDistribution.high}} ` +
|
|
226
|
-
`outputJsonBytes=${benchmark.outputJsonBytes}. Persisted to ${benchPath}`);
|
|
227
|
-
}
|
|
228
|
-
printResult(io, ok('slice.decompose', { ...result, outputPath: outPath, ...(benchmark !== null ? { benchmark } : {}) }, [], nextActions), options.json ?? false);
|
|
229
|
-
}
|
|
230
|
-
catch (error) {
|
|
231
|
-
printResult(io, fail('slice.decompose', 'SLICE_DECOMPOSE_FAILED', getErrorMessage(error), { rid, projectRoot: options.project }, [
|
|
232
|
-
'Verify codegraph is initialised (npx codegraph init && npx codegraph index), the rid is correct, and the PRD body is non-empty'
|
|
233
|
-
]), options.json ?? false);
|
|
234
|
-
process.exitCode = 1;
|
|
235
|
-
}
|
|
236
|
-
});
|
|
19
|
+
registerSliceDecomposeCommand(slice, io);
|
|
237
20
|
// ---------- peaks slice pick (NEW) ----------
|
|
238
|
-
|
|
239
|
-
.command('pick <rid>')
|
|
240
|
-
.description('Interactively select which candidate slices to ship, via fzf. ' +
|
|
241
|
-
'Reads .peaks/sc/slice-decomposition/<rid>.json, ' +
|
|
242
|
-
'spawns fzf --multi, parses selection, writes -picked.json. ' +
|
|
243
|
-
'Requires fzf >= 0.38. Algorithm is fzf-free; this is the only fzf dependency.')
|
|
244
|
-
.option('--project <path>', 'target project root', '.')
|
|
245
|
-
.option('--preview', 'render side-by-side preview window in fzf', false)
|
|
246
|
-
.option('--fzf-bin <path>', 'override fzf binary path (default: fzf on PATH)', 'fzf')).action(async (rid, options) => {
|
|
247
|
-
try {
|
|
248
|
-
const projectRoot = resolveCanonicalProjectRoot(options.project);
|
|
249
|
-
const decompPath = join(projectRoot, '.peaks', 'sc', 'slice-decomposition', `${rid}.json`);
|
|
250
|
-
if (!existsSync(decompPath)) {
|
|
251
|
-
throw new Error(`decomposition not found at ${decompPath}. ` +
|
|
252
|
-
`Run \`peaks slice decompose ${rid}\` first.`);
|
|
253
|
-
}
|
|
254
|
-
const parsed = readDecompositionResult(decompPath);
|
|
255
|
-
if ('schemaVersion' in parsed) {
|
|
256
|
-
throw new Error(`decomposition at ${decompPath} is a v2 envelope (schemaVersion: 'v2'). ` +
|
|
257
|
-
`peaks slice pick supports v1 only in peaks-loop 2.9.0. ` +
|
|
258
|
-
`Re-run \`peaks slice decompose ${rid}\` without --granularity to get a v1 file, ` +
|
|
259
|
-
`or upgrade peaks-loop when v2 pick lands.`);
|
|
260
|
-
}
|
|
261
|
-
const decomposition = parsed;
|
|
262
|
-
const result = await pickSlicesInteractive(rid, decomposition, projectRoot, {
|
|
263
|
-
...(options.preview !== undefined ? { preview: options.preview } : {}),
|
|
264
|
-
...(options.fzfBin ? { fzfBin: options.fzfBin } : {})
|
|
265
|
-
});
|
|
266
|
-
const nextActions = [
|
|
267
|
-
`Picked ${result.picked.length} slice(s); written to ${result.outputPath}`,
|
|
268
|
-
`Next: peaks slice plan ${rid} (--apply to call peaks request init for each chosen slice)`
|
|
269
|
-
];
|
|
270
|
-
printResult(io, ok('slice.pick', result, [], nextActions), options.json ?? false);
|
|
271
|
-
}
|
|
272
|
-
catch (error) {
|
|
273
|
-
const msg = getErrorMessage(error);
|
|
274
|
-
if (/brew install fzf|apt-get install fzf|older than required/.test(msg)) {
|
|
275
|
-
process.exitCode = 127;
|
|
276
|
-
}
|
|
277
|
-
else {
|
|
278
|
-
process.exitCode = 1;
|
|
279
|
-
}
|
|
280
|
-
printResult(io, fail('slice.pick', 'SLICE_PICK_FAILED', msg, { rid, projectRoot: options.project }, [
|
|
281
|
-
'Verify the decomposition file exists, fzf >= 0.38 is on PATH, and the rid is correct'
|
|
282
|
-
]), options.json ?? false);
|
|
283
|
-
}
|
|
284
|
-
});
|
|
21
|
+
registerSlicePickCommand(slice, io);
|
|
285
22
|
// ---------- peaks slice plan (NEW) ----------
|
|
286
|
-
|
|
287
|
-
.command('plan <rid>')
|
|
288
|
-
.description('Apply a picked batch: read -picked.json, call `peaks request init` for each chosen slice ' +
|
|
289
|
-
'with --depends-on edges from the decomposition. Dry-run by default; pass --apply to ' +
|
|
290
|
-
'actually create rids.')
|
|
291
|
-
.option('--project <path>', 'target project root', '.')
|
|
292
|
-
.option('--apply', 'actually call peaks request init (default: dry-run only)', false)).action(async (rid, options) => {
|
|
293
|
-
const projectRoot = resolveCanonicalProjectRoot(options.project);
|
|
294
|
-
const pickedPath = join(projectRoot, '.peaks', 'sc', 'slice-decomposition', `${rid}-picked.json`);
|
|
295
|
-
try {
|
|
296
|
-
if (!existsSync(pickedPath)) {
|
|
297
|
-
throw new Error(`picked file not found at ${pickedPath}. ` +
|
|
298
|
-
`Run \`peaks slice pick ${rid}\` first, or manually craft the file.`);
|
|
299
|
-
}
|
|
300
|
-
const picked = parsePickedFile(pickedPath);
|
|
301
|
-
const plan = picked.picked.map((slice, idx) => ({
|
|
302
|
-
newRid: `${rid}-${idx + 1}-${slice.rid}`,
|
|
303
|
-
type: 'feat',
|
|
304
|
-
dependsOn: idx === 0 ? [] : [picked.picked[idx - 1].rid],
|
|
305
|
-
files: slice.files,
|
|
306
|
-
label: slice.label,
|
|
307
|
-
applied: false
|
|
308
|
-
}));
|
|
309
|
-
const nextActions = [
|
|
310
|
-
`Planned ${plan.length} new rids from ${picked.picked.length} picked slices`,
|
|
311
|
-
options.apply
|
|
312
|
-
? 'Apply mode: would call peaks request init for each (v1.1: wire to spawn child)'
|
|
313
|
-
: 'Dry-run: pass --apply to actually create the rids (v1.1: wire to peaks request init spawn)'
|
|
314
|
-
];
|
|
315
|
-
printResult(io, ok('slice.plan', { parentRid: rid, plan, apply: options.apply ?? false }, [], nextActions), options.json ?? false);
|
|
316
|
-
}
|
|
317
|
-
catch (error) {
|
|
318
|
-
const msg = getErrorMessage(error);
|
|
319
|
-
const isEnvelopeError = msg.startsWith('picked envelope at');
|
|
320
|
-
printResult(io, fail('slice.plan', isEnvelopeError ? 'PICKED_ENVELOPE_INVALID' : 'SLICE_PLAN_FAILED', msg, { rid, projectRoot: options.project, pickedPath }, isEnvelopeError
|
|
321
|
-
? [
|
|
322
|
-
'Verify the -picked.json envelope matches the schema: { rid: string, picked: Array<{ rid, files: string[], label }> }'
|
|
323
|
-
]
|
|
324
|
-
: [
|
|
325
|
-
'Verify the picked file exists, the rid is correct, and peaks request init is available'
|
|
326
|
-
]), options.json ?? false);
|
|
327
|
-
process.exitCode = 1;
|
|
328
|
-
}
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
// ---------- helpers ----------
|
|
332
|
-
function readPrdBody(rid, projectRoot) {
|
|
333
|
-
// Search all .peaks/**/prd/requests/*-<rid>.md and .peaks/**/prd/requests/<rid>.md
|
|
334
|
-
const searchRoots = [
|
|
335
|
-
join(projectRoot, '.peaks', '2026'),
|
|
336
|
-
join(projectRoot, '.peaks'),
|
|
337
|
-
join(projectRoot, '.peaks', '_runtime')
|
|
338
|
-
];
|
|
339
|
-
const matchInDir = (dir) => {
|
|
340
|
-
if (!existsSync(dir))
|
|
341
|
-
return null;
|
|
342
|
-
let entries;
|
|
343
|
-
try {
|
|
344
|
-
entries = readdirSync(dir);
|
|
345
|
-
}
|
|
346
|
-
catch {
|
|
347
|
-
// TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
348
|
-
return null;
|
|
349
|
-
}
|
|
350
|
-
for (const entry of entries) {
|
|
351
|
-
if (!entry.endsWith('.md'))
|
|
352
|
-
continue;
|
|
353
|
-
if (entry === `${rid}.md` || entry.endsWith(`-${rid}.md`)) {
|
|
354
|
-
return readFileSync(join(dir, entry), 'utf8');
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
return null;
|
|
358
|
-
};
|
|
359
|
-
for (const root of searchRoots) {
|
|
360
|
-
if (!existsSync(root))
|
|
361
|
-
continue;
|
|
362
|
-
// 1) Direct prd/requests/ at this root
|
|
363
|
-
const direct = matchInDir(join(root, 'prd', 'requests'));
|
|
364
|
-
if (direct !== null)
|
|
365
|
-
return direct;
|
|
366
|
-
// 2) One level of subdirs (e.g. .peaks/_runtime/<sid>/prd/requests/)
|
|
367
|
-
let subdirs;
|
|
368
|
-
try {
|
|
369
|
-
subdirs = readdirSync(root);
|
|
370
|
-
}
|
|
371
|
-
catch {
|
|
372
|
-
continue;
|
|
373
|
-
}
|
|
374
|
-
for (const sub of subdirs) {
|
|
375
|
-
const hit = matchInDir(join(root, sub, 'prd', 'requests'));
|
|
376
|
-
if (hit !== null)
|
|
377
|
-
return hit;
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
throw new Error(`PRD body not found for rid=${rid}. Searched under .peaks/2026/prd/requests/, ` +
|
|
381
|
-
`.peaks/prd/requests/, and .peaks/_runtime/*/prd/requests/. ` +
|
|
382
|
-
`Create the PRD with: peaks request init --role prd --id ${rid} --apply --type refactor`);
|
|
383
|
-
}
|
|
384
|
-
function writeDecompositionFile(rid, result, projectRoot) {
|
|
385
|
-
const dir = join(projectRoot, '.peaks', 'sc', 'slice-decomposition');
|
|
386
|
-
if (!existsSync(dir)) {
|
|
387
|
-
mkdirSync(dir, { recursive: true });
|
|
388
|
-
}
|
|
389
|
-
const outPath = join(dir, `${rid}.json`);
|
|
390
|
-
writeFileSync(outPath, JSON.stringify(result, null, 2), 'utf8');
|
|
391
|
-
return outPath;
|
|
392
|
-
}
|
|
393
|
-
/**
|
|
394
|
-
* Stale threshold for slice decomposition artifacts. Matches the default
|
|
395
|
-
* recorded in .peaks/memory/ for follow-up). If that slice ships with a
|
|
396
|
-
* different default, both must update here.
|
|
397
|
-
*/
|
|
398
|
-
// eslint-disable-next-line no-magic-numbers -- canonical 30-day-in-ms math
|
|
399
|
-
const STALE_THRESHOLD_MS = 30 * 24 * 60 * 60 * 1000;
|
|
400
|
-
/**
|
|
401
|
-
* Enumerate every slice decomposition artifact under
|
|
402
|
-
* `.peaks/sc/slice-decomposition/`. Returns one row per distinct rid.
|
|
403
|
-
* Missing directory is treated as empty (returns []), matching the
|
|
404
|
-
* "fresh peaks repo" UX (AC5+AC6).
|
|
405
|
-
*
|
|
406
|
-
* Sorted by mtime descending so the most recent rid is first (AC3).
|
|
407
|
-
*/
|
|
408
|
-
function listDecompositions(projectRoot) {
|
|
409
|
-
const dir = join(projectRoot, '.peaks', 'sc', 'slice-decomposition');
|
|
410
|
-
if (!existsSync(dir))
|
|
411
|
-
return [];
|
|
412
|
-
const nowMs = Date.now();
|
|
413
|
-
const byRid = new Map();
|
|
414
|
-
for (const entry of readdirSync(dir)) {
|
|
415
|
-
// Skip non-matching files (e.g., stray .DS_Store)
|
|
416
|
-
if (!entry.endsWith('.json'))
|
|
417
|
-
continue;
|
|
418
|
-
let rid;
|
|
419
|
-
let isPicked;
|
|
420
|
-
if (entry.endsWith('-picked.json')) {
|
|
421
|
-
rid = entry.slice(0, -'-picked.json'.length);
|
|
422
|
-
isPicked = true;
|
|
423
|
-
}
|
|
424
|
-
else {
|
|
425
|
-
rid = entry.slice(0, -'.json'.length);
|
|
426
|
-
isPicked = false;
|
|
427
|
-
}
|
|
428
|
-
const absPath = join(dir, entry);
|
|
429
|
-
const st = statSync(absPath);
|
|
430
|
-
const existing = byRid.get(rid);
|
|
431
|
-
if (isPicked) {
|
|
432
|
-
// Picked file is supplementary; only fill in pickedPath on the existing row
|
|
433
|
-
if (existing) {
|
|
434
|
-
byRid.set(rid, { ...existing, pickedPath: absPath });
|
|
435
|
-
}
|
|
436
|
-
else {
|
|
437
|
-
// -picked.json without a corresponding <rid>.json: still surface it
|
|
438
|
-
byRid.set(rid, {
|
|
439
|
-
rid,
|
|
440
|
-
decompositionPath: '',
|
|
441
|
-
pickedPath: absPath,
|
|
442
|
-
mtime: st.mtime.toISOString(),
|
|
443
|
-
sizeBytes: 0,
|
|
444
|
-
isStale: nowMs - st.mtime.getTime() > STALE_THRESHOLD_MS
|
|
445
|
-
});
|
|
446
|
-
}
|
|
447
|
-
continue;
|
|
448
|
-
}
|
|
449
|
-
byRid.set(rid, {
|
|
450
|
-
rid,
|
|
451
|
-
decompositionPath: absPath,
|
|
452
|
-
pickedPath: existing?.pickedPath ?? null,
|
|
453
|
-
mtime: st.mtime.toISOString(),
|
|
454
|
-
sizeBytes: st.size,
|
|
455
|
-
isStale: nowMs - st.mtime.getTime() > STALE_THRESHOLD_MS
|
|
456
|
-
});
|
|
457
|
-
}
|
|
458
|
-
return Array.from(byRid.values()).sort((a, b) => a.mtime < b.mtime ? 1 : a.mtime > b.mtime ? -1 : 0);
|
|
459
|
-
}
|
|
460
|
-
function writeBenchmarkArtifact(rid, benchmark, projectRoot) {
|
|
461
|
-
// Reuse the current session binding if present; otherwise fall back to
|
|
462
|
-
// a deterministic local dir under the project root. The CLI may be
|
|
463
|
-
// invoked from non-CLI contexts (skill layer); we don't require a session.
|
|
464
|
-
const dir = join(projectRoot, '.peaks', '_runtime', 'benchmarks');
|
|
465
|
-
if (!existsSync(dir)) {
|
|
466
|
-
mkdirSync(dir, { recursive: true });
|
|
467
|
-
}
|
|
468
|
-
const outPath = join(dir, `${rid}.benchmark.json`);
|
|
469
|
-
writeFileSync(outPath, JSON.stringify(benchmark, null, 2), 'utf8');
|
|
470
|
-
return outPath;
|
|
471
|
-
}
|
|
472
|
-
/**
|
|
473
|
-
* Validate a -picked.json envelope. Throws a CLI-friendly Error on any
|
|
474
|
-
* shape violation; the catch in the slice.plan action converts it to
|
|
475
|
-
* a fail() envelope with `code: 'PICKED_ENVELOPE_INVALID'`.
|
|
476
|
-
*
|
|
477
|
-
* Schema:
|
|
478
|
-
* { rid: string; picked: Array<{ rid, files: string[], label }> }
|
|
479
|
-
*
|
|
480
|
-
* Rejects: missing rid, missing/invalid picked array, picked[i] missing
|
|
481
|
-
* rid / files / label, picked[i].files empty.
|
|
482
|
-
*/
|
|
483
|
-
export function parsePickedFile(pickedPath) {
|
|
484
|
-
let raw;
|
|
485
|
-
try {
|
|
486
|
-
raw = JSON.parse(readFileSync(pickedPath, 'utf8'));
|
|
487
|
-
}
|
|
488
|
-
catch (err) {
|
|
489
|
-
// JSON.parse errors are always Error-shaped (SyntaxError extends Error),
|
|
490
|
-
// so the cast is safe; we only need `.message`.
|
|
491
|
-
throw new Error(`picked envelope at ${pickedPath} is not valid JSON: ${err.message}`);
|
|
492
|
-
}
|
|
493
|
-
if (typeof raw !== 'object' || raw === null) {
|
|
494
|
-
throw new Error(`picked envelope at ${pickedPath} must be a JSON object, got ${typeof raw}`);
|
|
495
|
-
}
|
|
496
|
-
const obj = raw;
|
|
497
|
-
if (typeof obj.rid !== 'string' || obj.rid.length === 0) {
|
|
498
|
-
throw new Error(`picked envelope at ${pickedPath} is missing required string field 'rid'`);
|
|
499
|
-
}
|
|
500
|
-
if (!Array.isArray(obj.picked)) {
|
|
501
|
-
throw new Error(`picked envelope at ${pickedPath} is missing required array field 'picked'`);
|
|
502
|
-
}
|
|
503
|
-
const picked = obj.picked.map((item, idx) => {
|
|
504
|
-
if (typeof item !== 'object' || item === null) {
|
|
505
|
-
throw new Error(`picked[${idx}] must be an object, got ${typeof item}`);
|
|
506
|
-
}
|
|
507
|
-
const it = item;
|
|
508
|
-
if (typeof it.rid !== 'string' || it.rid.length === 0) {
|
|
509
|
-
throw new Error(`picked[${idx}] is missing required string field 'rid'`);
|
|
510
|
-
}
|
|
511
|
-
if (!Array.isArray(it.files) || it.files.length === 0) {
|
|
512
|
-
throw new Error(`picked[${idx}] is missing or has empty required array field 'files'`);
|
|
513
|
-
}
|
|
514
|
-
if (!it.files.every((f) => typeof f === 'string')) {
|
|
515
|
-
throw new Error(`picked[${idx}].files must contain only strings`);
|
|
516
|
-
}
|
|
517
|
-
if (typeof it.label !== 'string' || it.label.length === 0) {
|
|
518
|
-
throw new Error(`picked[${idx}] is missing required string field 'label'`);
|
|
519
|
-
}
|
|
520
|
-
return { rid: it.rid, files: it.files, label: it.label };
|
|
521
|
-
});
|
|
522
|
-
return { rid: obj.rid, picked };
|
|
23
|
+
registerSlicePlanCommand(slice, io);
|
|
523
24
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DecompositionResult } from '../../services/slice/slice-decompose-types.js';
|
|
2
|
+
export type BenchmarkMetrics = {
|
|
3
|
+
totalMs: number;
|
|
4
|
+
codegraphQueries: number;
|
|
5
|
+
p50ConfidenceDistribution: {
|
|
6
|
+
low: number;
|
|
7
|
+
mid: number;
|
|
8
|
+
high: number;
|
|
9
|
+
};
|
|
10
|
+
inputApproxBytes: {
|
|
11
|
+
prd: number;
|
|
12
|
+
};
|
|
13
|
+
outputJsonBytes: number;
|
|
14
|
+
capturedAt: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function readPrdBody(rid: string, projectRoot: string): string;
|
|
17
|
+
export declare function writeDecompositionFile(rid: string, result: DecompositionResult, projectRoot: string): string;
|
|
18
|
+
export declare function writeBenchmarkArtifact(rid: string, benchmark: unknown, projectRoot: string): string;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Split out of `slice-commands.ts`: the PRD
|
|
2
|
+
// body reader and the two decomposition artifact writers `peaks slice decompose`
|
|
3
|
+
// uses. Kept apart from the command module so both stay well inside the
|
|
4
|
+
// 300-line file cap.
|
|
5
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
export function readPrdBody(rid, projectRoot) {
|
|
8
|
+
// Search all .peaks/**/prd/requests/*-<rid>.md and .peaks/**/prd/requests/<rid>.md
|
|
9
|
+
const searchRoots = [
|
|
10
|
+
join(projectRoot, '.peaks', '2026'),
|
|
11
|
+
join(projectRoot, '.peaks'),
|
|
12
|
+
join(projectRoot, '.peaks', '_runtime')
|
|
13
|
+
];
|
|
14
|
+
const matchInDir = (dir) => {
|
|
15
|
+
if (!existsSync(dir))
|
|
16
|
+
return null;
|
|
17
|
+
let entries;
|
|
18
|
+
try {
|
|
19
|
+
entries = readdirSync(dir);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
for (const entry of entries) {
|
|
26
|
+
if (!entry.endsWith('.md'))
|
|
27
|
+
continue;
|
|
28
|
+
if (entry === `${rid}.md` || entry.endsWith(`-${rid}.md`)) {
|
|
29
|
+
return readFileSync(join(dir, entry), 'utf8');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
};
|
|
34
|
+
for (const root of searchRoots) {
|
|
35
|
+
if (!existsSync(root))
|
|
36
|
+
continue;
|
|
37
|
+
// 1) Direct prd/requests/ at this root
|
|
38
|
+
const direct = matchInDir(join(root, 'prd', 'requests'));
|
|
39
|
+
if (direct !== null)
|
|
40
|
+
return direct;
|
|
41
|
+
// 2) One level of subdirs (e.g. .peaks/_runtime/<sid>/prd/requests/)
|
|
42
|
+
let subdirs;
|
|
43
|
+
try {
|
|
44
|
+
subdirs = readdirSync(root);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
for (const sub of subdirs) {
|
|
50
|
+
const hit = matchInDir(join(root, sub, 'prd', 'requests'));
|
|
51
|
+
if (hit !== null)
|
|
52
|
+
return hit;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
throw new Error(`PRD body not found for rid=${rid}. Searched under .peaks/2026/prd/requests/, ` +
|
|
56
|
+
`.peaks/prd/requests/, and .peaks/_runtime/*/prd/requests/. ` +
|
|
57
|
+
`Create the PRD with: peaks request init --role prd --id ${rid} --apply --type refactor`);
|
|
58
|
+
}
|
|
59
|
+
export function writeDecompositionFile(rid, result, projectRoot) {
|
|
60
|
+
const dir = join(projectRoot, '.peaks', 'sc', 'slice-decomposition');
|
|
61
|
+
if (!existsSync(dir)) {
|
|
62
|
+
mkdirSync(dir, { recursive: true });
|
|
63
|
+
}
|
|
64
|
+
const outPath = join(dir, `${rid}.json`);
|
|
65
|
+
writeFileSync(outPath, JSON.stringify(result, null, 2), 'utf8');
|
|
66
|
+
return outPath;
|
|
67
|
+
}
|
|
68
|
+
export function writeBenchmarkArtifact(rid, benchmark, projectRoot) {
|
|
69
|
+
// Reuse the current session binding if present; otherwise fall back to
|
|
70
|
+
// a deterministic local dir under the project root. The CLI may be
|
|
71
|
+
// invoked from non-CLI contexts (skill layer); we don't require a session.
|
|
72
|
+
const dir = join(projectRoot, '.peaks', '_runtime', 'benchmarks');
|
|
73
|
+
if (!existsSync(dir)) {
|
|
74
|
+
mkdirSync(dir, { recursive: true });
|
|
75
|
+
}
|
|
76
|
+
const outPath = join(dir, `${rid}.benchmark.json`);
|
|
77
|
+
writeFileSync(outPath, JSON.stringify(benchmark, null, 2), 'utf8');
|
|
78
|
+
return outPath;
|
|
79
|
+
}
|