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,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The REGISTRATION profile of one harness's MCP entry point (spec §8.3).
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS IS NOT `IdeMcpProfile`. That profile (on `IdeAdapter.mcp`) answers
|
|
5
|
+
* "how does this harness SPELL a peaks tool name", which the pre-tool branch
|
|
6
|
+
* needs. This one answers "how does this harness register a server", which only
|
|
7
|
+
* the distribution path needs. One field would conflate two questions asked by
|
|
8
|
+
* two callers that never run together.
|
|
9
|
+
*
|
|
10
|
+
* WHY IT DECLARES ARGV AND NOT A COMMAND STRING. Registering is the HARNESS's
|
|
11
|
+
* own operation: `peaks mcp install` calls the harness's entry point rather than
|
|
12
|
+
* hand-editing the harness's config file, because that file is full of the
|
|
13
|
+
* user's state and hand-editing it is neither safe nor version-stable (§8.3).
|
|
14
|
+
* The entry is declared as an ARRAY with three placeholders, so the engine that
|
|
15
|
+
* consumes it substitutes values into an array and never builds a command line.
|
|
16
|
+
*
|
|
17
|
+
* WHY add AND remove ARE BOTH DECLARED. A harness's register verb is not
|
|
18
|
+
* idempotent — same name, same scope, and it fails, with no `--force` and no
|
|
19
|
+
* `update` — so the install is delete-then-add (§8.3). Both halves are therefore
|
|
20
|
+
* part of the contract, and `scopes` exists because the entry can already sit in
|
|
21
|
+
* more than one of them: the delete is a sweep, not a targeted call.
|
|
22
|
+
*
|
|
23
|
+
* WHAT IS DELIBERATELY ABSENT: any harness name, any platform name, and any
|
|
24
|
+
* branch on either. A vendor's own spellings belong in its adapter, which is the
|
|
25
|
+
* only module that fills this type in.
|
|
26
|
+
*/
|
|
27
|
+
/** Placeholder for the server key the harness files peaks under. */
|
|
28
|
+
export const MCP_NAME_PLACEHOLDER = '<name>';
|
|
29
|
+
/** Placeholder for one scope the entry can live in; substituted once per removal. */
|
|
30
|
+
export const MCP_SCOPE_PLACEHOLDER = '<scope>';
|
|
31
|
+
/** Placeholder for the launched server argv — the command and every token after it. */
|
|
32
|
+
export const MCP_SERVER_ARGV_PLACEHOLDER = '<server-argv>';
|
|
33
|
+
/** The placeholders an argv template may carry, and nothing else may look like one. */
|
|
34
|
+
export const MCP_ARGV_PLACEHOLDERS = [
|
|
35
|
+
MCP_NAME_PLACEHOLDER,
|
|
36
|
+
MCP_SCOPE_PLACEHOLDER,
|
|
37
|
+
MCP_SERVER_ARGV_PLACEHOLDER
|
|
38
|
+
];
|
|
39
|
+
/**
|
|
40
|
+
* One template's structural requirements: it must carry something, its
|
|
41
|
+
* bracket-shaped tokens must be ones the engine knows how to substitute, and the
|
|
42
|
+
* placeholders the caller needs in it must be there. An unknown placeholder is a
|
|
43
|
+
* refusal rather than a literal, because passing it through would hand the
|
|
44
|
+
* harness an argument that means nothing to it.
|
|
45
|
+
*/
|
|
46
|
+
function assertArgvTemplate(label, argv, required, refuse) {
|
|
47
|
+
if (argv.length === 0)
|
|
48
|
+
refuse(`${label} is empty`);
|
|
49
|
+
for (const token of argv) {
|
|
50
|
+
const bracketShaped = token.startsWith('<') && token.endsWith('>');
|
|
51
|
+
const known = MCP_ARGV_PLACEHOLDERS.includes(token);
|
|
52
|
+
if (bracketShaped && !known)
|
|
53
|
+
refuse(`${label} carries unknown placeholder '${token}'`);
|
|
54
|
+
}
|
|
55
|
+
for (const placeholder of required) {
|
|
56
|
+
if (!argv.includes(placeholder))
|
|
57
|
+
refuse(`${label} does not carry ${placeholder}`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* A declaration that cannot drive an install is a defect in the adapter, and it
|
|
62
|
+
* is reported as one rather than silently producing an argv the harness will
|
|
63
|
+
* reject. That is the whole argument for throwing here: a profile missing its
|
|
64
|
+
* server-argv placeholder would install a registration that launches nothing,
|
|
65
|
+
* and nothing would say so.
|
|
66
|
+
*/
|
|
67
|
+
export function assertMcpInstallProfile(profile) {
|
|
68
|
+
const refuse = (reason) => {
|
|
69
|
+
throw new Error(`IdeMcpInstallProfile is not installable: ${reason}`);
|
|
70
|
+
};
|
|
71
|
+
if (profile.serverName.length === 0)
|
|
72
|
+
refuse('serverName is empty');
|
|
73
|
+
if (profile.scopes.length === 0)
|
|
74
|
+
refuse('scopes is empty');
|
|
75
|
+
if (!profile.scopes.includes(profile.targetScope)) {
|
|
76
|
+
refuse(`targetScope '${profile.targetScope}' is not one of the declared scopes`);
|
|
77
|
+
}
|
|
78
|
+
assertArgvTemplate('addArgv', profile.addArgv, [MCP_NAME_PLACEHOLDER, MCP_SCOPE_PLACEHOLDER, MCP_SERVER_ARGV_PLACEHOLDER], refuse);
|
|
79
|
+
assertArgvTemplate('removeArgv', profile.removeArgv, [MCP_NAME_PLACEHOLDER, MCP_SCOPE_PLACEHOLDER], refuse);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Expand one argv template. A placeholder that stands for SEVERAL tokens expands
|
|
83
|
+
* to all of them, which is why this returns an array and why the launched server
|
|
84
|
+
* argv is passed as one: the caller never joins and never splits.
|
|
85
|
+
*/
|
|
86
|
+
export function expandMcpArgv(argv, values) {
|
|
87
|
+
const expanded = [];
|
|
88
|
+
for (const token of argv) {
|
|
89
|
+
if (token === MCP_NAME_PLACEHOLDER) {
|
|
90
|
+
expanded.push(values.serverName);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (token === MCP_SCOPE_PLACEHOLDER) {
|
|
94
|
+
expanded.push(values.scope);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
if (token === MCP_SERVER_ARGV_PLACEHOLDER) {
|
|
98
|
+
expanded.push(...values.serverArgv);
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
expanded.push(token);
|
|
102
|
+
}
|
|
103
|
+
return expanded;
|
|
104
|
+
}
|
|
@@ -13,12 +13,13 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import type { SubAgentDispatcher } from '../dispatch/sub-agent-dispatcher.js';
|
|
15
15
|
import type { ContextPercentFallbackInput, IdeCompactProfile } from './ide-compact-types.js';
|
|
16
|
+
import type { IdeMcpInstallProfile } from './ide-mcp-install-types.js';
|
|
16
17
|
/**
|
|
17
18
|
* Re-exported so every importer of `./ide-types.js` keeps seeing the whole
|
|
18
19
|
* adapter type surface from the original path (b1 file-size campaign: the two
|
|
19
20
|
* declarations now live in `./ide-compact-types.js`).
|
|
20
21
|
*/
|
|
21
|
-
export type { ContextPercentFallbackInput, IdeCompactProfile };
|
|
22
|
+
export type { ContextPercentFallbackInput, IdeCompactProfile, IdeMcpInstallProfile };
|
|
22
23
|
export type IdeId = 'claude-code' | 'trae' | 'codex' | 'cursor' | 'qoder' | 'tongyi-lingma' | 'hermes' | 'openclaw' | 'zcode';
|
|
23
24
|
export interface IdeCapabilities {
|
|
24
25
|
/** peaks gate enforce 是否适用该 IDE(必备) */
|
|
@@ -171,6 +172,49 @@ export interface IdeAdapter {
|
|
|
171
172
|
* funnelling all vendor signal through this method.
|
|
172
173
|
*/
|
|
173
174
|
readonly resolveCallerId: (env?: NodeJS.ProcessEnv) => string;
|
|
175
|
+
/**
|
|
176
|
+
* How this harness SPELLS the MCP tool names of a peaks server.
|
|
177
|
+
*
|
|
178
|
+
* Optional, like `skillInstall?` / `standardsProfile?` / `compact?`: an adapter
|
|
179
|
+
* that leaves it undefined declares "this harness has no MCP tool surface I can
|
|
180
|
+
* name", and every consumer treats that as "nothing to match" rather than as an
|
|
181
|
+
* error.
|
|
182
|
+
*
|
|
183
|
+
* It exists because one tool has SEVERAL spellings. A server registered
|
|
184
|
+
* directly and the same server arriving through a plugin produce different
|
|
185
|
+
* tool names, and an enforcement matcher written against one of them does not
|
|
186
|
+
* fire on the other — silently. Declaring them here is what lets the
|
|
187
|
+
* pre-tool branch and the installed hook entry agree on the full set.
|
|
188
|
+
*
|
|
189
|
+
* `resolveCallerId` above is the precedent for the placement rule: a vendor's
|
|
190
|
+
* naming convention is vendor signal, and vendor signal is funnelled through
|
|
191
|
+
* the adapter so no other module has to know it.
|
|
192
|
+
*/
|
|
193
|
+
readonly mcp?: IdeMcpProfile;
|
|
194
|
+
/**
|
|
195
|
+
* How this harness REGISTERS an MCP server (spec §8.3), consumed by
|
|
196
|
+
* `peaks mcp install/uninstall`. Optional, like `mcp` above: leaving it
|
|
197
|
+
* undefined declares "no registration entry peaks may call", and the install
|
|
198
|
+
* reads that as "nothing to do". See `ide-mcp-install-types.ts`.
|
|
199
|
+
*/
|
|
200
|
+
readonly mcpInstall?: IdeMcpInstallProfile;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* The MCP naming profile of one harness.
|
|
204
|
+
*
|
|
205
|
+
* Deliberately ONE field. Templates both MATCH a concrete tool name and
|
|
206
|
+
* CONSTRUCT one, which is what lets a conformance test build a call for a
|
|
207
|
+
* channel it has never seen (spec §6.3) instead of restating the harness's
|
|
208
|
+
* naming in the test — a restatement that would go stale the moment a channel
|
|
209
|
+
* is added.
|
|
210
|
+
*/
|
|
211
|
+
export interface IdeMcpProfile {
|
|
212
|
+
/**
|
|
213
|
+
* Tool-name templates. `*` is replaced by the bare MCP tool id, so
|
|
214
|
+
* `mcp__peaks__*` describes every tool of a server registered under the name
|
|
215
|
+
* `peaks` on the direct channel.
|
|
216
|
+
*/
|
|
217
|
+
readonly toolNameTemplates: readonly string[];
|
|
174
218
|
}
|
|
175
219
|
/**
|
|
176
220
|
* Per-IDE standards-file location + format profile. Used by the
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { IdeAdapter, IdeMcpProfile } from './ide-types.js';
|
|
2
|
+
/** The placeholder an adapter's tool-name template uses for the bare tool id. */
|
|
3
|
+
export declare const TOOL_ID_PLACEHOLDER = "*";
|
|
4
|
+
/** A concrete tool name matched back to the adapter template that produced it. */
|
|
5
|
+
export interface McpToolMatch {
|
|
6
|
+
/** The bare tool id — the part the template's placeholder stood for. */
|
|
7
|
+
readonly toolId: string;
|
|
8
|
+
/** The template that matched, so a caller can report which channel fired. */
|
|
9
|
+
readonly template: string;
|
|
10
|
+
}
|
|
11
|
+
/** The declared profile, or an empty one for an adapter that opts out. */
|
|
12
|
+
export declare function mcpProfileOf(adapter: IdeAdapter): IdeMcpProfile | undefined;
|
|
13
|
+
/** Every tool-name template the adapter declares, in declaration order. */
|
|
14
|
+
export declare function mcpToolNameTemplates(adapter: IdeAdapter): readonly string[];
|
|
15
|
+
/** The concrete harness tool name for a tool id under one template. */
|
|
16
|
+
export declare function mcpToolName(template: string, toolId: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* The tool id a concrete name carries under one template, or `undefined`. The
|
|
19
|
+
* template is anchored: an unanchored match would let a longer name smuggle the
|
|
20
|
+
* id (and would make `matchMcpToolName` order-dependent).
|
|
21
|
+
*/
|
|
22
|
+
export declare function mcpToolIdFrom(template: string, toolName: string): string | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Match a concrete harness tool name against every template the adapter
|
|
25
|
+
* declares, in declaration order. This is the ONE entry point the enforcement
|
|
26
|
+
* branch uses, so "which channels are covered" is answered by the adapter alone.
|
|
27
|
+
*/
|
|
28
|
+
export declare function matchMcpToolName(adapter: IdeAdapter, toolName: string): McpToolMatch | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* The PreToolUse `matcher` source covering every declared channel, ready to be
|
|
31
|
+
* joined into a hook entry's matcher field. `*` becomes `.*` and everything else
|
|
32
|
+
* is escaped, so the source matches exactly the names the templates describe.
|
|
33
|
+
*/
|
|
34
|
+
export declare function mcpHookMatcher(adapter: IdeAdapter): string | undefined;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// src/services/ide/mcp-tool-matcher.ts
|
|
2
|
+
//
|
|
3
|
+
// The vendor-translation layer for MCP tool NAMES (spec §6.3, §13).
|
|
4
|
+
//
|
|
5
|
+
// An MCP tool's name is harness-specific AND channel-specific: the very same
|
|
6
|
+
// `peaks_status` tool is spelled one way when the server is registered directly
|
|
7
|
+
// and another way when it arrives through a plugin. A matcher hard-coded against
|
|
8
|
+
// one spelling keeps working on the channel it was written for and SILENTLY
|
|
9
|
+
// stops firing on the other — the failure mode is an enforcement layer that
|
|
10
|
+
// reports nothing because it never ran. So the spellings are declared by the
|
|
11
|
+
// adapter (`IdeAdapter.mcp`) and this module is the only place that turns a
|
|
12
|
+
// declaration into (a) a match against a concrete tool name and (b) the
|
|
13
|
+
// PreToolUse matcher written into the harness's settings.
|
|
14
|
+
//
|
|
15
|
+
// Vendor names do not belong here: every string below is either generic syntax
|
|
16
|
+
// or comes from the adapter. The isolation zone lives in `adapters/`.
|
|
17
|
+
/** The placeholder an adapter's tool-name template uses for the bare tool id. */
|
|
18
|
+
export const TOOL_ID_PLACEHOLDER = '*';
|
|
19
|
+
/** The declared profile, or an empty one for an adapter that opts out. */
|
|
20
|
+
export function mcpProfileOf(adapter) {
|
|
21
|
+
return adapter.mcp;
|
|
22
|
+
}
|
|
23
|
+
/** Every tool-name template the adapter declares, in declaration order. */
|
|
24
|
+
export function mcpToolNameTemplates(adapter) {
|
|
25
|
+
return adapter.mcp?.toolNameTemplates ?? [];
|
|
26
|
+
}
|
|
27
|
+
/** Escape a literal segment so it cannot act as a pattern metacharacter. */
|
|
28
|
+
function escapeLiteral(value) {
|
|
29
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Split a template on its placeholder. A template must carry EXACTLY one
|
|
33
|
+
* placeholder: zero would make the tool id unaddressable, and two would make the
|
|
34
|
+
* captured id ambiguous. Both are adapter bugs, so they throw with the template
|
|
35
|
+
* in the message rather than degrading to a matcher that matches nothing.
|
|
36
|
+
*/
|
|
37
|
+
function splitTemplate(template) {
|
|
38
|
+
const parts = template.split(TOOL_ID_PLACEHOLDER);
|
|
39
|
+
if (parts.length !== 2 || parts[0] === undefined || parts[1] === undefined) {
|
|
40
|
+
throw new Error(`MCP tool-name template '${template}' must contain exactly one '${TOOL_ID_PLACEHOLDER}' placeholder.`);
|
|
41
|
+
}
|
|
42
|
+
return [parts[0], parts[1]];
|
|
43
|
+
}
|
|
44
|
+
/** The concrete harness tool name for a tool id under one template. */
|
|
45
|
+
export function mcpToolName(template, toolId) {
|
|
46
|
+
const [prefix, suffix] = splitTemplate(template);
|
|
47
|
+
return `${prefix}${toolId}${suffix}`;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The tool id a concrete name carries under one template, or `undefined`. The
|
|
51
|
+
* template is anchored: an unanchored match would let a longer name smuggle the
|
|
52
|
+
* id (and would make `matchMcpToolName` order-dependent).
|
|
53
|
+
*/
|
|
54
|
+
export function mcpToolIdFrom(template, toolName) {
|
|
55
|
+
const [prefix, suffix] = splitTemplate(template);
|
|
56
|
+
const pattern = new RegExp(`^${escapeLiteral(prefix)}(.*)${escapeLiteral(suffix)}$`);
|
|
57
|
+
const matched = pattern.exec(toolName);
|
|
58
|
+
return matched?.[1];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Match a concrete harness tool name against every template the adapter
|
|
62
|
+
* declares, in declaration order. This is the ONE entry point the enforcement
|
|
63
|
+
* branch uses, so "which channels are covered" is answered by the adapter alone.
|
|
64
|
+
*/
|
|
65
|
+
export function matchMcpToolName(adapter, toolName) {
|
|
66
|
+
for (const template of mcpToolNameTemplates(adapter)) {
|
|
67
|
+
const toolId = mcpToolIdFrom(template, toolName);
|
|
68
|
+
if (toolId !== undefined)
|
|
69
|
+
return { toolId, template };
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The PreToolUse `matcher` source covering every declared channel, ready to be
|
|
75
|
+
* joined into a hook entry's matcher field. `*` becomes `.*` and everything else
|
|
76
|
+
* is escaped, so the source matches exactly the names the templates describe.
|
|
77
|
+
*/
|
|
78
|
+
export function mcpHookMatcher(adapter) {
|
|
79
|
+
const sources = mcpToolNameTemplates(adapter).map((template) => {
|
|
80
|
+
const [prefix, suffix] = splitTemplate(template);
|
|
81
|
+
return `${escapeLiteral(prefix)}.*${escapeLiteral(suffix)}`;
|
|
82
|
+
});
|
|
83
|
+
return sources.length === 0 ? undefined : sources.join('|');
|
|
84
|
+
}
|
|
@@ -17,6 +17,13 @@ import process from 'node:process';
|
|
|
17
17
|
function locateNpmCliScript(scriptFile) {
|
|
18
18
|
const candidates = process.platform === 'win32'
|
|
19
19
|
? [
|
|
20
|
+
// Standard Windows layout — the installer, the zip, and
|
|
21
|
+
// nvm-for-windows all put `node_modules/npm` beside `node.exe`, so the
|
|
22
|
+
// install is ONE level up from `process.execPath`, not two. This is the
|
|
23
|
+
// `npm` belonging to the very `node` that will run the script, so it is
|
|
24
|
+
// tried first; the three entries after it are the backstop for an `npm`
|
|
25
|
+
// installed elsewhere.
|
|
26
|
+
join(process.execPath, '..', 'node_modules', 'npm', 'bin', scriptFile),
|
|
20
27
|
join(process.execPath, '..', '..', 'node_modules', 'npm', 'bin', scriptFile),
|
|
21
28
|
`C:/nvm4w/nodejs/node_modules/npm/bin/${scriptFile}`,
|
|
22
29
|
`C:/Program Files/nodejs/node_modules/npm/bin/${scriptFile}`
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Ceiling on one CLI execution. Generous for a read, far short of "forever". */
|
|
2
|
+
export declare const DEFAULT_EXECUTION_TIMEOUT_MS = 15000;
|
|
3
|
+
/** How to start this tree's own CLI. */
|
|
4
|
+
export interface CliLaunch {
|
|
5
|
+
readonly command: string;
|
|
6
|
+
readonly argsPrefix: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the platform-neutral launch shape. Uses the shared daemon-supervisor
|
|
10
|
+
* resolvers rather than a second copy of them: the entry path and the
|
|
11
|
+
* TypeScript-loader flags have to agree with every other self-spawn in this
|
|
12
|
+
* tree, and the file that owns them says so in as many words.
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveCliLaunch(): CliLaunch;
|
|
15
|
+
export interface CliExecution {
|
|
16
|
+
/** The concrete argv that was handed to the CLI, without the launch prefix. */
|
|
17
|
+
readonly argv: readonly string[];
|
|
18
|
+
/** Exit status, or `null` when the process died on a signal or was killed. */
|
|
19
|
+
readonly exitCode: number | null;
|
|
20
|
+
readonly stdout: string;
|
|
21
|
+
readonly stderr: string;
|
|
22
|
+
/** True when the deadline fired and the child was killed. */
|
|
23
|
+
readonly timedOut: boolean;
|
|
24
|
+
/** Set ONLY when the process could not be started at all. Never set on timeout. */
|
|
25
|
+
readonly launchError?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ExecuteOptions {
|
|
28
|
+
readonly launch?: CliLaunch;
|
|
29
|
+
readonly timeoutMs?: number;
|
|
30
|
+
readonly cwd?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Run one argv. Always resolves: a failure is a described outcome, never a
|
|
34
|
+
* rejection, because the caller has to report it to the harness either way.
|
|
35
|
+
*/
|
|
36
|
+
export declare function executeCliArgv(argv: readonly string[], options?: ExecuteOptions): Promise<CliExecution>;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// src/services/mcp/cli-executor.ts
|
|
2
|
+
//
|
|
3
|
+
// The one place the MCP server touches the outside world: it runs a concrete
|
|
4
|
+
// argv against the peaks CLI and hands back what happened.
|
|
5
|
+
//
|
|
6
|
+
// THREE RULES, EACH MEASURED INTO THE SHAPE BELOW.
|
|
7
|
+
//
|
|
8
|
+
// 1. NO SHELL, NO PLATFORM BRANCH (spec §8.2). The launch is
|
|
9
|
+
// `node <this tree's CLI entry>` — `process.execPath` plus the argument list
|
|
10
|
+
// that makes this Node interpret that entry. Naming the CLI as a command
|
|
11
|
+
// (`peaks`) is measurably wrong on a platform whose CLI is a batch shim:
|
|
12
|
+
// Node refuses to spawn `.cmd`/`.bat` without a shell, and with a shell the
|
|
13
|
+
// argv array stops being an argv array. `process.execPath` needs neither, so
|
|
14
|
+
// one shape serves every platform and no `if (platform)` exists.
|
|
15
|
+
//
|
|
16
|
+
// 2. THE TIMEOUT IS MANDATORY, NOT OPTIONAL. `peaks job status --watch` never
|
|
17
|
+
// returns. It is outside the read-only surface, but it proves the class: a
|
|
18
|
+
// server that waits forever on a hung child gives its caller no recovery
|
|
19
|
+
// path. A timeout therefore returns a NAMED failure, never an empty success
|
|
20
|
+
// (spec §7.2 + §9 rule 3).
|
|
21
|
+
//
|
|
22
|
+
// 3. THE CHILD GETS NO STDIN. Our stdin is the JSON-RPC transport; a child that
|
|
23
|
+
// inherited it would read our protocol stream and answer the harness itself.
|
|
24
|
+
import { spawn } from 'node:child_process';
|
|
25
|
+
import { readonlySpawnOptions } from '../readonly-surface/argv-guard.js';
|
|
26
|
+
import { cliEntryPath, interpreterArgs } from '../web/daemon-supervisor.js';
|
|
27
|
+
/** Ceiling on one CLI execution. Generous for a read, far short of "forever". */
|
|
28
|
+
export const DEFAULT_EXECUTION_TIMEOUT_MS = 15_000;
|
|
29
|
+
/**
|
|
30
|
+
* Resolve the platform-neutral launch shape. Uses the shared daemon-supervisor
|
|
31
|
+
* resolvers rather than a second copy of them: the entry path and the
|
|
32
|
+
* TypeScript-loader flags have to agree with every other self-spawn in this
|
|
33
|
+
* tree, and the file that owns them says so in as many words.
|
|
34
|
+
*/
|
|
35
|
+
export function resolveCliLaunch() {
|
|
36
|
+
return { command: process.execPath, argsPrefix: interpreterArgs(cliEntryPath()) };
|
|
37
|
+
}
|
|
38
|
+
/** The spawn + drain half: one child, one settlement, whatever happens to it. */
|
|
39
|
+
function runChild(launch, argv, cwd, timeoutMs) {
|
|
40
|
+
return new Promise((resolve) => {
|
|
41
|
+
let stdout = '';
|
|
42
|
+
let stderr = '';
|
|
43
|
+
let timedOut = false;
|
|
44
|
+
let settled = false;
|
|
45
|
+
let launchError;
|
|
46
|
+
const child = spawn(launch.command, [...launch.argsPrefix, ...argv], {
|
|
47
|
+
...readonlySpawnOptions(),
|
|
48
|
+
cwd,
|
|
49
|
+
// stdin must stay ours; stdout/stderr are read as data.
|
|
50
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
51
|
+
// Windows contract: a spawned child must not allocate a console window.
|
|
52
|
+
windowsHide: true
|
|
53
|
+
});
|
|
54
|
+
const deadline = setTimeout(() => {
|
|
55
|
+
timedOut = true;
|
|
56
|
+
child.kill();
|
|
57
|
+
}, timeoutMs);
|
|
58
|
+
const settle = (exitCode) => {
|
|
59
|
+
if (settled)
|
|
60
|
+
return;
|
|
61
|
+
settled = true;
|
|
62
|
+
clearTimeout(deadline);
|
|
63
|
+
const outcome = { argv, exitCode, stdout, stderr, timedOut };
|
|
64
|
+
resolve(launchError === undefined ? outcome : { ...outcome, launchError });
|
|
65
|
+
};
|
|
66
|
+
child.stdout.setEncoding('utf8');
|
|
67
|
+
child.stdout.on('data', (chunk) => {
|
|
68
|
+
stdout += chunk;
|
|
69
|
+
});
|
|
70
|
+
child.stderr.setEncoding('utf8');
|
|
71
|
+
child.stderr.on('data', (chunk) => {
|
|
72
|
+
stderr += chunk;
|
|
73
|
+
});
|
|
74
|
+
child.on('error', (error) => {
|
|
75
|
+
launchError = error.message;
|
|
76
|
+
});
|
|
77
|
+
// `close` (not `exit`) so both pipes are drained before we read them.
|
|
78
|
+
child.on('close', (code) => {
|
|
79
|
+
settle(code);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Run one argv. Always resolves: a failure is a described outcome, never a
|
|
85
|
+
* rejection, because the caller has to report it to the harness either way.
|
|
86
|
+
*/
|
|
87
|
+
export async function executeCliArgv(argv, options = {}) {
|
|
88
|
+
let launch;
|
|
89
|
+
try {
|
|
90
|
+
launch = options.launch ?? resolveCliLaunch();
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
94
|
+
return { argv, exitCode: null, stdout: '', stderr: '', timedOut: false, launchError: message };
|
|
95
|
+
}
|
|
96
|
+
return runChild(launch, argv, options.cwd ?? process.cwd(), options.timeoutMs ?? DEFAULT_EXECUTION_TIMEOUT_MS);
|
|
97
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/** The only JSON-RPC version this server speaks. */
|
|
2
|
+
export declare const JSON_RPC_VERSION: "2.0";
|
|
3
|
+
/** A request/response correlation id. `null` is legal and means "unknown". */
|
|
4
|
+
export type JsonRpcId = string | number | null;
|
|
5
|
+
export interface JsonRpcErrorObject {
|
|
6
|
+
readonly code: number;
|
|
7
|
+
readonly message: string;
|
|
8
|
+
readonly data?: unknown;
|
|
9
|
+
}
|
|
10
|
+
export interface JsonRpcRequest {
|
|
11
|
+
readonly jsonrpc: typeof JSON_RPC_VERSION;
|
|
12
|
+
readonly id: JsonRpcId;
|
|
13
|
+
readonly method: string;
|
|
14
|
+
readonly params?: unknown;
|
|
15
|
+
}
|
|
16
|
+
/** A request WITHOUT an id. JSON-RPC forbids replying to one. */
|
|
17
|
+
export interface JsonRpcNotification {
|
|
18
|
+
readonly jsonrpc: typeof JSON_RPC_VERSION;
|
|
19
|
+
readonly method: string;
|
|
20
|
+
readonly params?: unknown;
|
|
21
|
+
}
|
|
22
|
+
export interface JsonRpcSuccess {
|
|
23
|
+
readonly jsonrpc: typeof JSON_RPC_VERSION;
|
|
24
|
+
readonly id: JsonRpcId;
|
|
25
|
+
readonly result: unknown;
|
|
26
|
+
}
|
|
27
|
+
export interface JsonRpcFailure {
|
|
28
|
+
readonly jsonrpc: typeof JSON_RPC_VERSION;
|
|
29
|
+
readonly id: JsonRpcId;
|
|
30
|
+
readonly error: JsonRpcErrorObject;
|
|
31
|
+
}
|
|
32
|
+
export type JsonRpcResponse = JsonRpcSuccess | JsonRpcFailure;
|
|
33
|
+
/** Standard JSON-RPC codes. The server adds no private codes of its own. */
|
|
34
|
+
export declare const JSON_RPC_PARSE_ERROR = -32700;
|
|
35
|
+
export declare const JSON_RPC_INVALID_REQUEST = -32600;
|
|
36
|
+
export declare const JSON_RPC_METHOD_NOT_FOUND = -32601;
|
|
37
|
+
export declare const JSON_RPC_INVALID_PARAMS = -32602;
|
|
38
|
+
export declare const JSON_RPC_INTERNAL_ERROR = -32603;
|
|
39
|
+
export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
|
|
40
|
+
/** What one decoded line turned out to be. */
|
|
41
|
+
export type DecodedMessage = {
|
|
42
|
+
readonly kind: 'request';
|
|
43
|
+
readonly request: JsonRpcRequest;
|
|
44
|
+
} | {
|
|
45
|
+
readonly kind: 'notification';
|
|
46
|
+
readonly notification: JsonRpcNotification;
|
|
47
|
+
} | {
|
|
48
|
+
readonly kind: 'invalid';
|
|
49
|
+
readonly id: JsonRpcId;
|
|
50
|
+
readonly error: JsonRpcErrorObject;
|
|
51
|
+
};
|
|
52
|
+
export declare function makeError(code: number, message: string, data?: unknown): JsonRpcErrorObject;
|
|
53
|
+
export declare function successResponse(id: JsonRpcId, result: unknown): JsonRpcSuccess;
|
|
54
|
+
export declare function failureResponse(id: JsonRpcId, error: JsonRpcErrorObject): JsonRpcFailure;
|
|
55
|
+
/**
|
|
56
|
+
* Decode one frame.
|
|
57
|
+
*
|
|
58
|
+
* `undefined` means "nothing to answer" — an empty line, which is legal padding
|
|
59
|
+
* and must not be reported as a parse error (an empty line is not a message the
|
|
60
|
+
* peer sent; it is whitespace between messages).
|
|
61
|
+
*/
|
|
62
|
+
export declare function decodeMessage(line: string): DecodedMessage | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Encode one frame for the wire. `JSON.stringify` escapes every newline inside
|
|
65
|
+
* a string, which is what keeps one message on one line.
|
|
66
|
+
*/
|
|
67
|
+
export declare function encodeMessage(message: JsonRpcResponse | JsonRpcNotification): string;
|
|
68
|
+
/**
|
|
69
|
+
* The buffer that turns an arbitrary chunking of bytes into whole lines.
|
|
70
|
+
*
|
|
71
|
+
* Needed because a pipe delivers no framing of its own: one `data` event may
|
|
72
|
+
* carry half a message or three of them, and a server that parsed each event as
|
|
73
|
+
* a message would work on a fast local pipe and fail on a loaded one.
|
|
74
|
+
*/
|
|
75
|
+
export declare class LineDecoder {
|
|
76
|
+
private buffer;
|
|
77
|
+
/** Feed a chunk; get back the complete lines it completed (no trailing newline). */
|
|
78
|
+
push(chunk: string): string[];
|
|
79
|
+
/** Whatever is left when the stream ends. A peer that never sent a newline still sent a message. */
|
|
80
|
+
flush(): string[];
|
|
81
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// src/services/mcp/json-rpc.ts
|
|
2
|
+
//
|
|
3
|
+
// JSON-RPC 2.0 message shapes plus the stdio framing MCP uses, implemented in
|
|
4
|
+
// this tree rather than pulled in as a dependency.
|
|
5
|
+
//
|
|
6
|
+
// WHY NOT THE SDK. peaks-loop ships 12 runtime dependencies to every user
|
|
7
|
+
// globally, and the protocol surface this server needs is four methods and five
|
|
8
|
+
// error codes — all frozen since the first MCP revision. A dependency would be
|
|
9
|
+
// the larger commitment. See the slice report for the exact surface list.
|
|
10
|
+
//
|
|
11
|
+
// THE FRAMING IS NEWLINE-DELIMITED JSON, not LSP's `Content-Length` headers.
|
|
12
|
+
// That is the MCP stdio transport's rule, and it is also why a message may not
|
|
13
|
+
// contain a raw newline: this module therefore serializes with `JSON.stringify`
|
|
14
|
+
// (which escapes newlines inside strings) and never pretty-prints.
|
|
15
|
+
/** The only JSON-RPC version this server speaks. */
|
|
16
|
+
export const JSON_RPC_VERSION = '2.0';
|
|
17
|
+
/** Standard JSON-RPC codes. The server adds no private codes of its own. */
|
|
18
|
+
export const JSON_RPC_PARSE_ERROR = -32700;
|
|
19
|
+
export const JSON_RPC_INVALID_REQUEST = -32600;
|
|
20
|
+
export const JSON_RPC_METHOD_NOT_FOUND = -32601;
|
|
21
|
+
export const JSON_RPC_INVALID_PARAMS = -32602;
|
|
22
|
+
export const JSON_RPC_INTERNAL_ERROR = -32603;
|
|
23
|
+
export function isPlainObject(value) {
|
|
24
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
25
|
+
}
|
|
26
|
+
function isJsonRpcId(value) {
|
|
27
|
+
return typeof value === 'string' || typeof value === 'number' || value === null;
|
|
28
|
+
}
|
|
29
|
+
export function makeError(code, message, data) {
|
|
30
|
+
return data === undefined ? { code, message } : { code, message, data };
|
|
31
|
+
}
|
|
32
|
+
export function successResponse(id, result) {
|
|
33
|
+
return { jsonrpc: JSON_RPC_VERSION, id, result };
|
|
34
|
+
}
|
|
35
|
+
export function failureResponse(id, error) {
|
|
36
|
+
return { jsonrpc: JSON_RPC_VERSION, id, error };
|
|
37
|
+
}
|
|
38
|
+
function invalid(id, code, message) {
|
|
39
|
+
return { kind: 'invalid', id, error: makeError(code, message) };
|
|
40
|
+
}
|
|
41
|
+
/** The message's id when it carries a legal one, else the protocol's `null`. */
|
|
42
|
+
function idOf(parsed) {
|
|
43
|
+
const id = parsed['id'];
|
|
44
|
+
return isJsonRpcId(id) ? id : null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Build the message from a well-formed envelope. The presence of the `id` KEY is
|
|
48
|
+
* the only thing separating a request from a notification — `id: null` is a legal
|
|
49
|
+
* id, so this cannot be written as a null check.
|
|
50
|
+
*/
|
|
51
|
+
function buildMessage(parsed, method) {
|
|
52
|
+
const params = parsed['params'];
|
|
53
|
+
const head = { jsonrpc: JSON_RPC_VERSION, method, ...(params === undefined ? {} : { params }) };
|
|
54
|
+
return 'id' in parsed
|
|
55
|
+
? { kind: 'request', request: { ...head, id: idOf(parsed) } }
|
|
56
|
+
: { kind: 'notification', notification: head };
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Decode one frame.
|
|
60
|
+
*
|
|
61
|
+
* `undefined` means "nothing to answer" — an empty line, which is legal padding
|
|
62
|
+
* and must not be reported as a parse error (an empty line is not a message the
|
|
63
|
+
* peer sent; it is whitespace between messages).
|
|
64
|
+
*/
|
|
65
|
+
export function decodeMessage(line) {
|
|
66
|
+
if (line.trim().length === 0)
|
|
67
|
+
return undefined;
|
|
68
|
+
let parsed;
|
|
69
|
+
try {
|
|
70
|
+
parsed = JSON.parse(line);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return invalid(null, JSON_RPC_PARSE_ERROR, 'Invalid JSON received on the transport.');
|
|
74
|
+
}
|
|
75
|
+
if (!isPlainObject(parsed) || parsed['jsonrpc'] !== JSON_RPC_VERSION) {
|
|
76
|
+
const id = isPlainObject(parsed) ? idOf(parsed) : null;
|
|
77
|
+
return invalid(id, JSON_RPC_INVALID_REQUEST, `Messages must declare jsonrpc "${JSON_RPC_VERSION}".`);
|
|
78
|
+
}
|
|
79
|
+
const method = parsed['method'];
|
|
80
|
+
if (typeof method !== 'string' || method.length === 0) {
|
|
81
|
+
return invalid(idOf(parsed), JSON_RPC_INVALID_REQUEST, 'Messages must carry a non-empty "method".');
|
|
82
|
+
}
|
|
83
|
+
return buildMessage(parsed, method);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Encode one frame for the wire. `JSON.stringify` escapes every newline inside
|
|
87
|
+
* a string, which is what keeps one message on one line.
|
|
88
|
+
*/
|
|
89
|
+
export function encodeMessage(message) {
|
|
90
|
+
return `${JSON.stringify(message)}\n`;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The buffer that turns an arbitrary chunking of bytes into whole lines.
|
|
94
|
+
*
|
|
95
|
+
* Needed because a pipe delivers no framing of its own: one `data` event may
|
|
96
|
+
* carry half a message or three of them, and a server that parsed each event as
|
|
97
|
+
* a message would work on a fast local pipe and fail on a loaded one.
|
|
98
|
+
*/
|
|
99
|
+
export class LineDecoder {
|
|
100
|
+
buffer = '';
|
|
101
|
+
/** Feed a chunk; get back the complete lines it completed (no trailing newline). */
|
|
102
|
+
push(chunk) {
|
|
103
|
+
this.buffer += chunk;
|
|
104
|
+
const lines = this.buffer.split('\n');
|
|
105
|
+
// The last element is either an incomplete line or '' when the chunk ended
|
|
106
|
+
// on a newline. Either way it stays buffered for the next push.
|
|
107
|
+
this.buffer = lines.pop() ?? '';
|
|
108
|
+
return lines;
|
|
109
|
+
}
|
|
110
|
+
/** Whatever is left when the stream ends. A peer that never sent a newline still sent a message. */
|
|
111
|
+
flush() {
|
|
112
|
+
const remainder = this.buffer.trim().length > 0 ? [this.buffer] : [];
|
|
113
|
+
this.buffer = '';
|
|
114
|
+
return remainder;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { McpToolDefinition } from './surface.js';
|
|
2
|
+
import { type ToolCallContext, type ToolCallResult } from './tool-core.js';
|
|
3
|
+
export declare function callMemorySearchTool(tool: McpToolDefinition, args: Readonly<Record<string, unknown>>, context: ToolCallContext): Promise<ToolCallResult>;
|