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
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
|
|
2
|
+
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
3
|
+
import { fail, ok, getErrorMessage } from 'peaks-loop-shared/result';
|
|
4
|
+
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
5
|
+
import { readSessionIdFromHookPayload, readTriggerFromHookPayload, settleCompactFromHarnessEvent } from '../../services/code/compact-event-settle.js';
|
|
6
|
+
import { resolveSessionId } from './compact-shared.js';
|
|
7
|
+
const COMPACT_SETTLE_DESCRIPTION = 'PostCompact hook handler: settle the open compact run because the HARNESS reported a ' +
|
|
8
|
+
'compaction completed, and append an `observed` compact-history row carrying the ' +
|
|
9
|
+
'harness-reported trigger (manual | auto). Reads the hook JSON on stdin; prints nothing ' +
|
|
10
|
+
'and exits 0 when run by the hook. Pass --json for the diagnostic envelope.';
|
|
11
|
+
/**
|
|
12
|
+
* Read the `PostCompact` hook payload from stdin.
|
|
13
|
+
*
|
|
14
|
+
* `PEAKS_HOOK_STDIN` is the test seam, verbatim the one `peaks gate enforce`
|
|
15
|
+
* uses (`gate-commands.ts`) — the CLI side owns `process.stdin`'s lifecycle, so
|
|
16
|
+
* the reader lives with the command rather than in the service.
|
|
17
|
+
*
|
|
18
|
+
* Returns `null` for every shape that is not a JSON object: empty stdin, a TTY
|
|
19
|
+
* (the `--json` diagnostic path run by a human), malformed JSON. A payload that
|
|
20
|
+
* cannot be read is not a failure — it is a payload with no `trigger`, which is
|
|
21
|
+
* an input this path is explicitly designed to accept.
|
|
22
|
+
*/
|
|
23
|
+
async function readHookPayload() {
|
|
24
|
+
const override = process.env.PEAKS_HOOK_STDIN;
|
|
25
|
+
let raw;
|
|
26
|
+
if (override !== undefined) {
|
|
27
|
+
raw = override;
|
|
28
|
+
}
|
|
29
|
+
else if (process.stdin.isTTY) {
|
|
30
|
+
raw = '';
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
raw = await new Promise((resolveStdin) => {
|
|
34
|
+
let data = '';
|
|
35
|
+
process.stdin.setEncoding('utf8');
|
|
36
|
+
process.stdin.on('data', (chunk) => {
|
|
37
|
+
data += chunk;
|
|
38
|
+
});
|
|
39
|
+
process.stdin.on('end', () => resolveStdin(data));
|
|
40
|
+
process.stdin.on('error', () => resolveStdin(data));
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
if (raw.trim().length === 0)
|
|
44
|
+
return null;
|
|
45
|
+
try {
|
|
46
|
+
return JSON.parse(raw);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function reportCompactSettleSessionFailure(io, error, project) {
|
|
54
|
+
printResult(io, fail('compact.settle', error.code, error.message, { projectRoot: project }, error.nextActions), true);
|
|
55
|
+
}
|
|
56
|
+
function buildCompactSettleNextActions(result) {
|
|
57
|
+
return [
|
|
58
|
+
result.settled
|
|
59
|
+
? result.lifecycleWritten
|
|
60
|
+
? result.historyWritten
|
|
61
|
+
? `Settled run ${result.runId}; appended a kind:'observed' row with pathway 'post-compact-hook'.`
|
|
62
|
+
: `Settled run ${result.runId}, but the kind:'observed' row could NOT be appended — check that .peaks/_runtime/<sid>/ is writable.`
|
|
63
|
+
: `The harness reported a compaction for run ${result.runId}, but the lifecycle record could NOT be written — that run is still open, so a later probe will settle it from its own measurement and append the row then. Nothing was recorded for this event: a row here would assert a settlement the store never made.`
|
|
64
|
+
: result.reason === 'different-session'
|
|
65
|
+
? `The hook payload names a different harness session, so this project's open compact run was left alone.`
|
|
66
|
+
: 'No compact run was open, so nothing was settled and no history row was appended.'
|
|
67
|
+
];
|
|
68
|
+
}
|
|
69
|
+
function reportCompactSettleFailure(io, error) {
|
|
70
|
+
printResult(io, fail('compact.settle', 'COMPACT_SETTLE_FAILED', getErrorMessage(error), {}, [
|
|
71
|
+
'Verify the project path and session binding'
|
|
72
|
+
]), true);
|
|
73
|
+
}
|
|
74
|
+
async function runCompactSettle(options, io) {
|
|
75
|
+
// One parse, two fields: reading stdin twice would let the two readers
|
|
76
|
+
// disagree about the payload they were handed.
|
|
77
|
+
const payload = await readHookPayload();
|
|
78
|
+
const trigger = readTriggerFromHookPayload(payload);
|
|
79
|
+
const hookSessionId = readSessionIdFromHookPayload(payload);
|
|
80
|
+
// The hook path returns before any `process.exitCode` assignment below, so
|
|
81
|
+
// the harness never sees a non-zero exit from this command.
|
|
82
|
+
try {
|
|
83
|
+
const project = options.project !== undefined
|
|
84
|
+
? resolveCanonicalProjectRoot(options.project)
|
|
85
|
+
: (findProjectRoot(process.cwd()) ?? process.cwd());
|
|
86
|
+
const session = resolveSessionId(project, options.sessionId);
|
|
87
|
+
if (session.error !== null) {
|
|
88
|
+
if (options.json !== true)
|
|
89
|
+
return;
|
|
90
|
+
reportCompactSettleSessionFailure(io, session.error, project);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const result = settleCompactFromHarnessEvent({
|
|
94
|
+
projectRoot: project,
|
|
95
|
+
sessionId: session.sid,
|
|
96
|
+
trigger,
|
|
97
|
+
hookSessionId
|
|
98
|
+
});
|
|
99
|
+
if (options.json !== true)
|
|
100
|
+
return;
|
|
101
|
+
printResult(io, ok('compact.settle', { projectRoot: project, sessionId: session.sid, trigger: trigger ?? null, ...result }, [], buildCompactSettleNextActions(result)), true);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (options.json !== true)
|
|
105
|
+
return;
|
|
106
|
+
reportCompactSettleFailure(io, error);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export function registerCompactSettleCommand(compact, io) {
|
|
110
|
+
// 8. peaks compact settle [--json]
|
|
111
|
+
//
|
|
112
|
+
// The `PostCompact` hook's transport. Before this command, peaks-loop knew a
|
|
113
|
+
// compaction had landed only because a LATER probe measured a ratio that had
|
|
114
|
+
// fallen — an inference. This command lets the harness's own event settle the
|
|
115
|
+
// run, and records what the harness said the compaction WAS (`manual` /
|
|
116
|
+
// `auto`), which is the one question a ratio can never answer.
|
|
117
|
+
//
|
|
118
|
+
// STDOUT IS CONTEXT HERE. `PostCompact`'s output contract is truncated in the
|
|
119
|
+
// retrievable docs, so the safe assumption is the `SessionStart` one: stdout
|
|
120
|
+
// is added to the model's context. The hook path therefore prints NOTHING and
|
|
121
|
+
// exits 0 for every outcome — success, no open run, unresolvable session,
|
|
122
|
+
// unparseable stdin. An error sentence in the model's context is a false
|
|
123
|
+
// problem handed to it mid-slice. Same discipline as `session reinject`;
|
|
124
|
+
// `--json` is the diagnostic surface, and the hook never passes it.
|
|
125
|
+
addJsonOption(compact
|
|
126
|
+
.command('settle')
|
|
127
|
+
.description(COMPACT_SETTLE_DESCRIPTION)
|
|
128
|
+
.option('--project <path>', 'project root (defaults to git root or cwd)')
|
|
129
|
+
.option('--session-id <sid>', 'override the active session id (defaults to the canonical binding)')).action((options) => runCompactSettle(options, io));
|
|
130
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** The active session id, or the refusal envelope every caller prints the same way. */
|
|
2
|
+
export declare function resolveSessionId(projectRoot: string, explicit: string | undefined): {
|
|
3
|
+
sid: string | null;
|
|
4
|
+
error: {
|
|
5
|
+
code: string;
|
|
6
|
+
message: string;
|
|
7
|
+
nextActions: string[];
|
|
8
|
+
} | null;
|
|
9
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// The session binding every `peaks compact` subcommand resolves through, on its own so
|
|
2
|
+
// the five commands that read it share one fix point.
|
|
3
|
+
import { getSessionIdCanonical } from '../../services/session/session-manager.js';
|
|
4
|
+
/** The active session id, or the refusal envelope every caller prints the same way. */
|
|
5
|
+
export function resolveSessionId(projectRoot, explicit) {
|
|
6
|
+
if (explicit !== undefined && explicit.length > 0) {
|
|
7
|
+
return { sid: explicit, error: null };
|
|
8
|
+
}
|
|
9
|
+
// Statically-imported `getSessionIdCanonical` (see import block
|
|
10
|
+
// at the top of this file). It is the single source of truth for
|
|
11
|
+
// "what session is bound to this project"; we use it instead of
|
|
12
|
+
// re-implementing the resolution here to keep one fix point when
|
|
13
|
+
// the binding layout changes.
|
|
14
|
+
const sid = getSessionIdCanonical(projectRoot) ?? null;
|
|
15
|
+
if (sid === null) {
|
|
16
|
+
return {
|
|
17
|
+
sid: null,
|
|
18
|
+
error: {
|
|
19
|
+
code: 'NO_ACTIVE_SESSION',
|
|
20
|
+
message: 'No active session bound. Run `peaks workspace init --project <repo> --json` to bind one.',
|
|
21
|
+
nextActions: [`peaks workspace init --project ${projectRoot} --json`]
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
return { sid, error: null };
|
|
26
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export declare const DEFAULT_DOCKER_IMAGE = "node:22-slim";
|
|
2
|
+
/**
|
|
3
|
+
* runtime adapter. The container CLI supports both docker and
|
|
4
|
+
* podman as the underlying runtime. The auto-detect order is:
|
|
5
|
+
* 1. `--runtime docker|podman` if explicit
|
|
6
|
+
* 2. docker (most common, ships with Docker Desktop on
|
|
7
|
+
* macOS/Windows, docker.io on Linux)
|
|
8
|
+
* 3. podman (RHEL/Fedora default, runs rootless by default,
|
|
9
|
+
* same CLI surface as docker)
|
|
10
|
+
* Each runtime has the same spawn/release shape; the
|
|
11
|
+
* difference is the binary name (`docker` vs `podman`). The
|
|
12
|
+
* `--cidfile` flag is supported by both.
|
|
13
|
+
*/
|
|
14
|
+
export type ContainerRuntime = 'docker' | 'podman';
|
|
15
|
+
/** A runtime that answered `--version`, or the reason none did. */
|
|
16
|
+
export type ContainerRuntimeProbe = {
|
|
17
|
+
ok: true;
|
|
18
|
+
runtime: ContainerRuntime;
|
|
19
|
+
binary: string;
|
|
20
|
+
} | {
|
|
21
|
+
ok: false;
|
|
22
|
+
stderr: string;
|
|
23
|
+
hint: string;
|
|
24
|
+
};
|
|
25
|
+
export declare function detectContainerRuntime(explicit: ContainerRuntime | undefined): ContainerRuntimeProbe;
|
|
26
|
+
export type ContainerOptions = {
|
|
27
|
+
session?: string;
|
|
28
|
+
project?: string;
|
|
29
|
+
json?: boolean;
|
|
30
|
+
};
|
|
31
|
+
export type SpawnOptions = ContainerOptions & {
|
|
32
|
+
rid: string;
|
|
33
|
+
role: string;
|
|
34
|
+
purpose: string;
|
|
35
|
+
image?: string;
|
|
36
|
+
ttl?: string;
|
|
37
|
+
mount?: string;
|
|
38
|
+
/** Part 43: explicit runtime selector (docker | podman). */
|
|
39
|
+
runtime?: string;
|
|
40
|
+
};
|
|
41
|
+
export type ReleaseOptions = ContainerOptions & {
|
|
42
|
+
leaseId: string;
|
|
43
|
+
};
|
|
44
|
+
export declare function joinPathSession(projectRoot: string, sessionId: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* Resolve the project root and session id every container verb works against.
|
|
47
|
+
* The sid falls back through `PEAKS_SESSION_ID` and the canonical binding
|
|
48
|
+
* before the `unknown-sid` sentinel.
|
|
49
|
+
*/
|
|
50
|
+
export declare function resolveContainerTarget(options: ContainerOptions): {
|
|
51
|
+
projectRoot: string;
|
|
52
|
+
sessionId: string;
|
|
53
|
+
};
|
|
54
|
+
export declare function checkDockerAvailable(): {
|
|
55
|
+
ok: true;
|
|
56
|
+
version: string;
|
|
57
|
+
} | {
|
|
58
|
+
ok: false;
|
|
59
|
+
stderr: string;
|
|
60
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
3
|
+
import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
|
|
4
|
+
export const DEFAULT_DOCKER_IMAGE = 'node:22-slim';
|
|
5
|
+
export function detectContainerRuntime(explicit) {
|
|
6
|
+
const tryOrder = explicit ? [explicit] : ['docker', 'podman'];
|
|
7
|
+
for (const r of tryOrder) {
|
|
8
|
+
try {
|
|
9
|
+
const version = execSync(`${r} --version`, {
|
|
10
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
11
|
+
encoding: 'utf8',
|
|
12
|
+
windowsHide: true
|
|
13
|
+
}).trim();
|
|
14
|
+
return { ok: true, runtime: r, binary: `${r} (${version.split('\n')[0] ?? ''})` };
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
/* try next */
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
ok: false,
|
|
22
|
+
stderr: explicit
|
|
23
|
+
? `explicit --runtime ${explicit} not on PATH`
|
|
24
|
+
: 'neither docker nor podman is on PATH',
|
|
25
|
+
hint: explicit
|
|
26
|
+
? `Install ${explicit} or pass a different --runtime.`
|
|
27
|
+
: 'Install docker (Docker Desktop on macOS / Windows) or podman (RHEL / Fedora).'
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export function joinPathSession(projectRoot, sessionId) {
|
|
31
|
+
return `${projectRoot.replace(/[\\/]+$/, '')}/.peaks/_runtime/${sessionId}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolve the project root and session id every container verb works against.
|
|
35
|
+
* The sid falls back through `PEAKS_SESSION_ID` and the canonical binding
|
|
36
|
+
* before the `unknown-sid` sentinel.
|
|
37
|
+
*/
|
|
38
|
+
export function resolveContainerTarget(options) {
|
|
39
|
+
const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
|
|
40
|
+
const sessionId = options.session ??
|
|
41
|
+
process.env.PEAKS_SESSION_ID ??
|
|
42
|
+
getCurrentSessionId(projectRoot) ??
|
|
43
|
+
'unknown-sid';
|
|
44
|
+
return { projectRoot, sessionId };
|
|
45
|
+
}
|
|
46
|
+
export function checkDockerAvailable() {
|
|
47
|
+
// Part 43: superseded by detectContainerRuntime above; this
|
|
48
|
+
// function is preserved for callers that imported it. The
|
|
49
|
+
// container-commands.ts action handlers all use
|
|
50
|
+
// detectContainerRuntime directly.
|
|
51
|
+
return { ok: false, stderr: 'deprecated — use detectContainerRuntime' };
|
|
52
|
+
}
|
|
@@ -23,5 +23,5 @@
|
|
|
23
23
|
* follow-up rid.
|
|
24
24
|
*/
|
|
25
25
|
import type { Command } from 'commander';
|
|
26
|
-
import {
|
|
26
|
+
import type { ProgramIO } from '../cli-helpers.js';
|
|
27
27
|
export declare function registerContainerCommand(program: Command, io: ProgramIO): void;
|
|
@@ -22,224 +22,12 @@
|
|
|
22
22
|
* allowing docker-related tool calls. The gate bridge is a
|
|
23
23
|
* follow-up rid.
|
|
24
24
|
*/
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import { fail, getErrorMessage, ok } from 'peaks-loop-shared/result';
|
|
28
|
-
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
29
|
-
import { findProjectRoot } from '../../services/config/config-safety.js';
|
|
30
|
-
import { getCurrentSessionId } from '../../services/skills/skill-presence-service.js';
|
|
31
|
-
import { atomicWriteJson } from '../../services/ide/shared/atomic-json.js';
|
|
32
|
-
import { normalizePath } from '../../shared/path-utils.js';
|
|
33
|
-
import { containerLeaseFilePath, deserializeContainerLease, finalizeContainerLease, generateContainerLeaseId, markContainerReleased, ttlForContainerRole } from '../../services/container/container-lease.js';
|
|
34
|
-
const DEFAULT_DOCKER_IMAGE = 'node:22-slim';
|
|
35
|
-
function detectContainerRuntime(explicit) {
|
|
36
|
-
const tryOrder = explicit ? [explicit] : ['docker', 'podman'];
|
|
37
|
-
for (const r of tryOrder) {
|
|
38
|
-
try {
|
|
39
|
-
const version = execSync(`${r} --version`, {
|
|
40
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
41
|
-
encoding: 'utf8',
|
|
42
|
-
windowsHide: true
|
|
43
|
-
}).trim();
|
|
44
|
-
return { ok: true, runtime: r, binary: `${r} (${version.split('\n')[0] ?? ''})` };
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
/* try next */
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return {
|
|
51
|
-
ok: false,
|
|
52
|
-
stderr: explicit
|
|
53
|
-
? `explicit --runtime ${explicit} not on PATH`
|
|
54
|
-
: 'neither docker nor podman is on PATH',
|
|
55
|
-
hint: explicit
|
|
56
|
-
? `Install ${explicit} or pass a different --runtime.`
|
|
57
|
-
: 'Install docker (Docker Desktop on macOS / Windows) or podman (RHEL / Fedora).'
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
function joinPathSession(projectRoot, sessionId) {
|
|
61
|
-
return `${projectRoot.replace(/[\\/]+$/, '')}/.peaks/_runtime/${sessionId}`;
|
|
62
|
-
}
|
|
63
|
-
function checkDockerAvailable() {
|
|
64
|
-
// Part 43: superseded by detectContainerRuntime above; this
|
|
65
|
-
// function is preserved for callers that imported it. The
|
|
66
|
-
// container-commands.ts action handlers all use
|
|
67
|
-
// detectContainerRuntime directly.
|
|
68
|
-
return { ok: false, stderr: 'deprecated — use detectContainerRuntime' };
|
|
69
|
-
}
|
|
25
|
+
import { registerContainerReleaseCommand } from './container-release-command.js';
|
|
26
|
+
import { registerContainerSpawnCommand } from './container-spawn-command.js';
|
|
70
27
|
export function registerContainerCommand(program, io) {
|
|
71
28
|
const cmd = program
|
|
72
29
|
.command('container')
|
|
73
30
|
.description('L4 container isolation: spawn/release container leases (Part 12; pairs with --isolation container on dispatch).');
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
.description('Spawn a container via `docker run` and write a container lease. ' +
|
|
77
|
-
'The lease is the source of truth for the L4 PreToolUse gate (Part 12 follow-up). ' +
|
|
78
|
-
'Default TTL is role-aware (rd=30m / qa=15m / ui=1h); pass --ttl <ms> to override. ' +
|
|
79
|
-
'Default image is `node:22-slim`; pass --image <name> to override.')
|
|
80
|
-
.requiredOption('--rid <rid>', 'peaks request id the lease is associated with')
|
|
81
|
-
.requiredOption('--role <role>', 'sub-agent role (rd | qa | ui | sc | prd | general-purpose)')
|
|
82
|
-
.requiredOption('--purpose <text>', 'why this container was spawned (audit log)')
|
|
83
|
-
.option('--image <name>', `container image (default ${DEFAULT_DOCKER_IMAGE})`)
|
|
84
|
-
.option('--ttl <ms>', 'time-to-live in ms (default role-aware; override with positive number)')
|
|
85
|
-
.option('--mount <path>', 'host path to mount as the container working dir (default: <projectRoot>)')
|
|
86
|
-
.option('--session <sid>', 'override session id')
|
|
87
|
-
.option('--project <path>', 'project root (default: findProjectRoot(cwd))')).action((options) => {
|
|
88
|
-
const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
|
|
89
|
-
const sessionId = options.session ??
|
|
90
|
-
process.env.PEAKS_SESSION_ID ??
|
|
91
|
-
getCurrentSessionId(projectRoot) ??
|
|
92
|
-
'unknown-sid';
|
|
93
|
-
try {
|
|
94
|
-
const explicitRuntime = (() => {
|
|
95
|
-
if (options.runtime === 'docker')
|
|
96
|
-
return 'docker';
|
|
97
|
-
if (options.runtime === 'podman')
|
|
98
|
-
return 'podman';
|
|
99
|
-
return undefined;
|
|
100
|
-
})();
|
|
101
|
-
const runtime = detectContainerRuntime(explicitRuntime);
|
|
102
|
-
if (!runtime.ok) {
|
|
103
|
-
printResult(io, fail('container.spawn', 'CONTAINER_RUNTIME_UNAVAILABLE', `${runtime.stderr}: ${runtime.hint}`, { rid: options.rid, role: options.role, sessionId }, [
|
|
104
|
-
'Install docker (Docker Desktop on macOS / Windows) or podman (RHEL / Fedora).',
|
|
105
|
-
'On Windows, ensure WSL2 backend is enabled and the daemon is running.',
|
|
106
|
-
'Pass --runtime docker|podman to force a specific runtime.'
|
|
107
|
-
]), options.json);
|
|
108
|
-
process.exitCode = 1;
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
const leaseId = generateContainerLeaseId();
|
|
112
|
-
const now = Date.now();
|
|
113
|
-
const ttlMs = options.ttl === undefined
|
|
114
|
-
? ttlForContainerRole(options.role)
|
|
115
|
-
: Number.parseInt(options.ttl, 10);
|
|
116
|
-
if (!Number.isInteger(ttlMs) || ttlMs <= 0) {
|
|
117
|
-
printResult(io, fail('container.spawn', 'INVALID_TTL', '--ttl must be a positive integer (ms)', { ttl: options.ttl }, ['Re-run with --ttl 1800000 (30 min) or omit to use role default.']), options.json);
|
|
118
|
-
process.exitCode = 1;
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
const image = options.image ?? DEFAULT_DOCKER_IMAGE;
|
|
122
|
-
const mount = options.mount ?? projectRoot;
|
|
123
|
-
// `docker run --rm -d` so the container is detached and
|
|
124
|
-
// auto-removed when stopped; --cidfile writes the
|
|
125
|
-
// container id to a file we can read back. The
|
|
126
|
-
// `--label peaks.leaseId=<id>` lets `peaks container
|
|
127
|
-
// list` / `peaks container gc` find orphans by label
|
|
128
|
-
// when the lease file is missing.
|
|
129
|
-
const cidFile = `${normalizePath(joinPathSession(projectRoot, sessionId))}/.${runtime.runtime}-cid-${leaseId}`;
|
|
130
|
-
try {
|
|
131
|
-
execSync(`${runtime.runtime} run --rm -d --cidfile "${cidFile}" --label "peaks.leaseId=${leaseId}" --label "peaks.rid=${options.rid}" -v "${mount}:/work" -w /work ${image} sleep infinity`, { cwd: projectRoot, stdio: 'pipe', encoding: 'utf8', windowsHide: true });
|
|
132
|
-
}
|
|
133
|
-
catch (err) {
|
|
134
|
-
printResult(io, fail('container.spawn', 'DOCKER_RUN_FAILED', getErrorMessage(err), { rid: options.rid, image, runtime: runtime.runtime, sessionId }, [
|
|
135
|
-
'Verify the image name is reachable on the configured registry.',
|
|
136
|
-
'Verify the host path is mounted correctly (Windows: the path must be visible to WSL2).',
|
|
137
|
-
`Run \`${runtime.runtime} ps -a\` to inspect any leftover containers with the peaks.leaseId label.`
|
|
138
|
-
]), options.json);
|
|
139
|
-
process.exitCode = 1;
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
const containerId = readFileSync(cidFile, 'utf8').trim();
|
|
143
|
-
const lease = finalizeContainerLease({
|
|
144
|
-
leaseId,
|
|
145
|
-
rid: options.rid,
|
|
146
|
-
role: options.role,
|
|
147
|
-
path: mount,
|
|
148
|
-
image,
|
|
149
|
-
containerId,
|
|
150
|
-
createdAt: now,
|
|
151
|
-
expiresAt: now + ttlMs,
|
|
152
|
-
purpose: options.purpose
|
|
153
|
-
});
|
|
154
|
-
atomicWriteJson(containerLeaseFilePath(joinPathSession(projectRoot, sessionId), leaseId), lease);
|
|
155
|
-
printResult(io, ok('container.spawn', {
|
|
156
|
-
lease,
|
|
157
|
-
sessionId,
|
|
158
|
-
projectRoot,
|
|
159
|
-
runtime: runtime.runtime,
|
|
160
|
-
runtimeVersion: runtime.binary,
|
|
161
|
-
nextActions: [
|
|
162
|
-
`Container id: ${containerId}`,
|
|
163
|
-
`Image: ${image}`,
|
|
164
|
-
`Lease expires at: ${new Date(lease.expiresAt).toISOString()}`,
|
|
165
|
-
'Run `peaks container release --lease-id <id>` when done'
|
|
166
|
-
]
|
|
167
|
-
}, [], []), options.json);
|
|
168
|
-
}
|
|
169
|
-
catch (err) {
|
|
170
|
-
printResult(io, fail('container.spawn', 'SPAWN_FAILED', getErrorMessage(err), { rid: options.rid, sessionId }, [
|
|
171
|
-
'See error message; if the lease was not written, retry after fixing the underlying issue.'
|
|
172
|
-
]), options.json);
|
|
173
|
-
process.exitCode = 1;
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
addJsonOption(cmd
|
|
177
|
-
.command('release')
|
|
178
|
-
.description('Transition a container lease to released and run `docker rm --force`. Idempotent on already-released leases.')
|
|
179
|
-
.requiredOption('--lease-id <id>', 'lease id returned by `peaks container spawn`')
|
|
180
|
-
.option('--session <sid>', 'override session id')
|
|
181
|
-
.option('--project <path>', 'project root (default: findProjectRoot(cwd))')).action((options) => {
|
|
182
|
-
const projectRoot = options.project ?? findProjectRoot(process.cwd()) ?? process.cwd();
|
|
183
|
-
const sessionId = options.session ??
|
|
184
|
-
process.env.PEAKS_SESSION_ID ??
|
|
185
|
-
getCurrentSessionId(projectRoot) ??
|
|
186
|
-
'unknown-sid';
|
|
187
|
-
try {
|
|
188
|
-
const file = containerLeaseFilePath(joinPathSession(projectRoot, sessionId), options.leaseId);
|
|
189
|
-
if (!existsSync(file)) {
|
|
190
|
-
printResult(io, fail('container.release', 'LEASE_NOT_FOUND', `no lease on disk at ${file}`, { leaseId: options.leaseId, file }, [
|
|
191
|
-
'Run `peaks container list` to inspect active leases.',
|
|
192
|
-
'For a never-spawned lease, this is a no-op — no further action needed.'
|
|
193
|
-
]), options.json);
|
|
194
|
-
process.exitCode = 1;
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
let lease;
|
|
198
|
-
try {
|
|
199
|
-
lease = deserializeContainerLease(readFileSync(file, 'utf8'));
|
|
200
|
-
}
|
|
201
|
-
catch (err) {
|
|
202
|
-
printResult(io, fail('container.release', 'LEASE_FILE_INVALID', getErrorMessage(err), { leaseId: options.leaseId, file }, [
|
|
203
|
-
'Delete the malformed lease file manually and re-issue spawn.',
|
|
204
|
-
'For security, release never fails open on a malformed lease.'
|
|
205
|
-
]), options.json);
|
|
206
|
-
process.exitCode = 1;
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
if (lease.status === 'released') {
|
|
210
|
-
printResult(io, ok('container.release', { lease, sessionId, projectRoot, alreadyReleased: true }, [], [`Lease ${lease.leaseId} already released; nothing to do.`]), options.json);
|
|
211
|
-
return;
|
|
212
|
-
}
|
|
213
|
-
let dockerRmFailed = false;
|
|
214
|
-
try {
|
|
215
|
-
const releaseRuntime = detectContainerRuntime(undefined);
|
|
216
|
-
const runtimeCmd = releaseRuntime.ok ? releaseRuntime.runtime : 'docker';
|
|
217
|
-
execSync(`${runtimeCmd} rm --force "${lease.containerId}"`, {
|
|
218
|
-
cwd: projectRoot,
|
|
219
|
-
stdio: 'pipe',
|
|
220
|
-
encoding: 'utf8',
|
|
221
|
-
windowsHide: true
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
catch {
|
|
225
|
-
dockerRmFailed = true;
|
|
226
|
-
}
|
|
227
|
-
const released = markContainerReleased(lease);
|
|
228
|
-
atomicWriteJson(file, released);
|
|
229
|
-
printResult(io, ok('container.release', { lease: released, sessionId, projectRoot, dockerRmFailed }, dockerRmFailed
|
|
230
|
-
? [
|
|
231
|
-
'docker rm failed (likely the container was already removed); lease marked released.'
|
|
232
|
-
]
|
|
233
|
-
: [], [
|
|
234
|
-
`Lease ${lease.leaseId} marked released.`,
|
|
235
|
-
dockerRmFailed
|
|
236
|
-
? 'Manual `docker ps -a` + `docker rm` may be needed.'
|
|
237
|
-
: `Container ${lease.containerId} removed.`
|
|
238
|
-
]), options.json);
|
|
239
|
-
}
|
|
240
|
-
catch (err) {
|
|
241
|
-
printResult(io, fail('container.release', 'RELEASE_FAILED', getErrorMessage(err), { leaseId: options.leaseId, sessionId }, ['Verify the lease id and re-run.', 'If the lease was never spawned, no-op.']), options.json);
|
|
242
|
-
process.exitCode = 1;
|
|
243
|
-
}
|
|
244
|
-
});
|
|
31
|
+
registerContainerSpawnCommand(cmd, io);
|
|
32
|
+
registerContainerReleaseCommand(cmd, io);
|
|
245
33
|
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { fail, getErrorMessage, ok } from 'peaks-loop-shared/result';
|
|
4
|
+
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
5
|
+
import { atomicWriteJson } from '../../services/ide/shared/atomic-json.js';
|
|
6
|
+
import { containerLeaseFilePath, deserializeContainerLease, markContainerReleased } from '../../services/container/container-lease.js';
|
|
7
|
+
import { detectContainerRuntime, joinPathSession, resolveContainerTarget } from './container-command-shared.js';
|
|
8
|
+
export function registerContainerReleaseCommand(cmd, io) {
|
|
9
|
+
addJsonOption(cmd
|
|
10
|
+
.command('release')
|
|
11
|
+
.description('Transition a container lease to released and run `docker rm --force`. Idempotent on already-released leases.')
|
|
12
|
+
.requiredOption('--lease-id <id>', 'lease id returned by `peaks container spawn`')
|
|
13
|
+
.option('--session <sid>', 'override session id')
|
|
14
|
+
.option('--project <path>', 'project root (default: findProjectRoot(cwd))')).action((options) => runContainerRelease(io, options));
|
|
15
|
+
}
|
|
16
|
+
/** Read + parse the lease file; `null` once the refusal is emitted. */
|
|
17
|
+
function readLease(io, options, file) {
|
|
18
|
+
if (!existsSync(file)) {
|
|
19
|
+
printResult(io, fail('container.release', 'LEASE_NOT_FOUND', `no lease on disk at ${file}`, {
|
|
20
|
+
leaseId: options.leaseId,
|
|
21
|
+
file
|
|
22
|
+
}, [
|
|
23
|
+
'Run `peaks container list` to inspect active leases.',
|
|
24
|
+
'For a never-spawned lease, this is a no-op — no further action needed.'
|
|
25
|
+
]), options.json);
|
|
26
|
+
process.exitCode = 1;
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
return deserializeContainerLease(readFileSync(file, 'utf8'));
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
printResult(io, fail('container.release', 'LEASE_FILE_INVALID', getErrorMessage(err), {
|
|
34
|
+
leaseId: options.leaseId,
|
|
35
|
+
file
|
|
36
|
+
}, [
|
|
37
|
+
'Delete the malformed lease file manually and re-issue spawn.',
|
|
38
|
+
'For security, release never fails open on a malformed lease.'
|
|
39
|
+
]), options.json);
|
|
40
|
+
process.exitCode = 1;
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/** `docker rm --force`, tolerating a container that is already gone. */
|
|
45
|
+
function removeContainer(lease, projectRoot) {
|
|
46
|
+
try {
|
|
47
|
+
const detected = detectContainerRuntime(undefined);
|
|
48
|
+
const runtimeCmd = detected.ok ? detected.runtime : 'docker';
|
|
49
|
+
execSync(`${runtimeCmd} rm --force "${lease.containerId}"`, {
|
|
50
|
+
cwd: projectRoot,
|
|
51
|
+
stdio: 'pipe',
|
|
52
|
+
encoding: 'utf8',
|
|
53
|
+
windowsHide: true
|
|
54
|
+
});
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function runContainerRelease(io, options) {
|
|
62
|
+
const { projectRoot, sessionId } = resolveContainerTarget(options);
|
|
63
|
+
try {
|
|
64
|
+
const file = containerLeaseFilePath(joinPathSession(projectRoot, sessionId), options.leaseId);
|
|
65
|
+
const lease = readLease(io, options, file);
|
|
66
|
+
if (lease === null)
|
|
67
|
+
return;
|
|
68
|
+
if (lease.status === 'released') {
|
|
69
|
+
printResult(io, ok('container.release', { lease, sessionId, projectRoot, alreadyReleased: true }, [], [`Lease ${lease.leaseId} already released; nothing to do.`]), options.json);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const outcome = releaseLease({ options, io, projectRoot, sessionId, file, lease });
|
|
73
|
+
printResult(io, ok('container.release', outcome.data, outcome.warnings, outcome.nextActions), options.json);
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
printResult(io, fail('container.release', 'RELEASE_FAILED', getErrorMessage(err), {
|
|
77
|
+
leaseId: options.leaseId,
|
|
78
|
+
sessionId
|
|
79
|
+
}, ['Verify the lease id and re-run.', 'If the lease was never spawned, no-op.']), options.json);
|
|
80
|
+
process.exitCode = 1;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* `docker rm --force` the container, flip the lease to released and write it
|
|
85
|
+
* back. A failed `docker rm` is reported, not fatal: the lease is the source
|
|
86
|
+
* of truth and it is still marked released.
|
|
87
|
+
*/
|
|
88
|
+
function releaseLease(plan) {
|
|
89
|
+
const { projectRoot, sessionId, file, lease } = plan;
|
|
90
|
+
const dockerRmFailed = removeContainer(lease, projectRoot);
|
|
91
|
+
const released = markContainerReleased(lease);
|
|
92
|
+
atomicWriteJson(file, released);
|
|
93
|
+
return {
|
|
94
|
+
data: { lease: released, sessionId, projectRoot, dockerRmFailed },
|
|
95
|
+
warnings: dockerRmFailed
|
|
96
|
+
? ['docker rm failed (likely the container was already removed); lease marked released.']
|
|
97
|
+
: [],
|
|
98
|
+
nextActions: [
|
|
99
|
+
`Lease ${lease.leaseId} marked released.`,
|
|
100
|
+
dockerRmFailed
|
|
101
|
+
? 'Manual `docker ps -a` + `docker rm` may be needed.'
|
|
102
|
+
: `Container ${lease.containerId} removed.`
|
|
103
|
+
]
|
|
104
|
+
};
|
|
105
|
+
}
|