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,179 @@
|
|
|
1
|
+
// src/services/distribution/mcp-install.ts
|
|
2
|
+
//
|
|
3
|
+
// The vendor-neutral MCP registration engine (spec §8.3). It owns the SHAPE of
|
|
4
|
+
// an install — delete every scope, then add — and owns no harness's spelling of
|
|
5
|
+
// anything: the server key, the scopes and the argv come from the adapter's
|
|
6
|
+
// `mcpInstall` profile, and the process that runs the argv is an injected
|
|
7
|
+
// runner.
|
|
8
|
+
//
|
|
9
|
+
// WHY DELETE-THEN-ADD AND NOT "CHECK, THEN ADD IF ABSENT". The harness's own
|
|
10
|
+
// register verb is not idempotent: the same name in the same scope fails, and
|
|
11
|
+
// there is no `--force` and no `update` to reach for. A conditional add would
|
|
12
|
+
// therefore have to be right about a state it cannot see — so the engine does
|
|
13
|
+
// the one thing that is right in both states: it removes what is there (a
|
|
14
|
+
// removal that finds nothing is tolerated) and then adds. That is also what
|
|
15
|
+
// makes the install SEMANTICALLY idempotent: two runs produce the same argv in
|
|
16
|
+
// the same order, so the registration left behind has the same CONTENT, even
|
|
17
|
+
// though the second run performed operations the first one did too.
|
|
18
|
+
//
|
|
19
|
+
// WHY THE DELETE SWEEPS EVERY SCOPE. The entry can already exist in a scope the
|
|
20
|
+
// install is not writing to — an earlier install, or a user who moved it. The
|
|
21
|
+
// removal names a scope, and the harness fails on the wrong or empty one, so a
|
|
22
|
+
// targeted delete would leave the old entry behind and the add would then fail
|
|
23
|
+
// on the duplicate it left. Sweeping all declared scopes is the only version of
|
|
24
|
+
// this that is correct for a state the engine cannot enumerate.
|
|
25
|
+
//
|
|
26
|
+
// WHAT "ONLY OURS" MEANS HERE. The engine never reads or writes the
|
|
27
|
+
// harness's configuration file. It runs the harness's own removal and addition,
|
|
28
|
+
// and the only key either of them names is the adapter's `serverName` — so no
|
|
29
|
+
// other entry can be touched by construction. The honest limit of that
|
|
30
|
+
// guarantee is the name itself: an entry the USER named the same thing is
|
|
31
|
+
// indistinguishable from ours, and is the one case this cannot tell apart.
|
|
32
|
+
//
|
|
33
|
+
// NO HARNESS BRANCH, NO PLATFORM BRANCH. Every value is either the caller's or
|
|
34
|
+
// the adapter's. `resolveMcpServerArgv` returns an interpreter and an entry path
|
|
35
|
+
// for the same reason `cli-executor.ts` does: a shipped CLI name is a shim on
|
|
36
|
+
// some platforms, and choosing between the two spellings would be the platform
|
|
37
|
+
// branch this module is forbidden to contain.
|
|
38
|
+
import { dirname, join, resolve } from 'node:path';
|
|
39
|
+
import { fileURLToPath } from 'node:url';
|
|
40
|
+
import { assertMcpInstallProfile, expandMcpArgv } from '../ide/ide-mcp-install-types.js';
|
|
41
|
+
/** `<packageRoot>` — this file's tree is `<root>/src/services/distribution` or `<root>/dist/…`. */
|
|
42
|
+
const PACKAGE_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', '..');
|
|
43
|
+
/**
|
|
44
|
+
* The argv that launches THIS installation's read-only MCP server.
|
|
45
|
+
*
|
|
46
|
+
* An interpreter and an entry path, in array form: the same shape `mcp serve`
|
|
47
|
+
* spawns and the same one the read-only executor uses. A bare CLI name would be
|
|
48
|
+
* a `.cmd` shim on some platforms, and picking a spelling per platform is the
|
|
49
|
+
* branch this tree forbids — resolving the pair needs none.
|
|
50
|
+
*/
|
|
51
|
+
export function resolveMcpServerArgv() {
|
|
52
|
+
return [process.execPath, join(PACKAGE_ROOT, 'bin', 'peaks.js'), 'mcp', 'serve'];
|
|
53
|
+
}
|
|
54
|
+
/** The plan: one removal per declared scope, then the addition. Order is the contract. */
|
|
55
|
+
export function buildMcpInstallPlan(profile, serverArgv) {
|
|
56
|
+
assertMcpInstallProfile(profile);
|
|
57
|
+
const removals = profile.scopes.map((scope) => ({
|
|
58
|
+
operation: 'remove',
|
|
59
|
+
scope,
|
|
60
|
+
command: {
|
|
61
|
+
command: profile.removeArgv[0] ?? '',
|
|
62
|
+
args: expandMcpArgv(profile.removeArgv.slice(1), {
|
|
63
|
+
serverName: profile.serverName,
|
|
64
|
+
scope,
|
|
65
|
+
serverArgv
|
|
66
|
+
})
|
|
67
|
+
}
|
|
68
|
+
}));
|
|
69
|
+
const addition = {
|
|
70
|
+
operation: 'add',
|
|
71
|
+
scope: profile.targetScope,
|
|
72
|
+
command: {
|
|
73
|
+
command: profile.addArgv[0] ?? '',
|
|
74
|
+
args: expandMcpArgv(profile.addArgv.slice(1), {
|
|
75
|
+
serverName: profile.serverName,
|
|
76
|
+
scope: profile.targetScope,
|
|
77
|
+
serverArgv
|
|
78
|
+
})
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
return [...removals, addition];
|
|
82
|
+
}
|
|
83
|
+
/** Every removal, then the addition. A failed removal is a fact, not a failure. */
|
|
84
|
+
export function runMcpInstallPlan(profile, serverArgv, runner) {
|
|
85
|
+
const plan = buildMcpInstallPlan(profile, serverArgv);
|
|
86
|
+
const removed = [];
|
|
87
|
+
const absent = [];
|
|
88
|
+
let detail = '';
|
|
89
|
+
for (const step of plan) {
|
|
90
|
+
const outcome = runner(step.command);
|
|
91
|
+
if (step.operation === 'remove') {
|
|
92
|
+
if (outcome.ok)
|
|
93
|
+
removed.push(step.scope);
|
|
94
|
+
else
|
|
95
|
+
absent.push(step.scope);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (!outcome.ok) {
|
|
99
|
+
return {
|
|
100
|
+
serverName: profile.serverName,
|
|
101
|
+
removed,
|
|
102
|
+
absent,
|
|
103
|
+
added: false,
|
|
104
|
+
ok: false,
|
|
105
|
+
detail: `the registration was not written: ${outcome.detail}`
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
detail = `registered in scope '${step.scope}'`;
|
|
109
|
+
}
|
|
110
|
+
return { serverName: profile.serverName, removed, absent, added: true, ok: true, detail };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* The removal sweep on its own — what `uninstall` is, and all that it is.
|
|
114
|
+
*
|
|
115
|
+
* `exit 0` removed it, `exit != 0` answered "no" (absent, unchanged) — but a run the
|
|
116
|
+
* deadline killed, or one that never launched, ANSWERED NOTHING, and calling that
|
|
117
|
+
* "nothing was there" is the lie this sweep used to tell. Those scopes are `unknown`,
|
|
118
|
+
* and `ok` is false whenever any scope is unknown: with a scope the harness never
|
|
119
|
+
* spoke for, the removal is unconfirmed and the state is not known.
|
|
120
|
+
*/
|
|
121
|
+
export function runMcpUninstallPlan(profile, serverArgv, runner) {
|
|
122
|
+
const plan = buildMcpInstallPlan(profile, serverArgv).filter((step) => step.operation === 'remove');
|
|
123
|
+
const removed = [];
|
|
124
|
+
const absent = [];
|
|
125
|
+
const unknown = [];
|
|
126
|
+
for (const step of plan) {
|
|
127
|
+
const outcome = runner(step.command);
|
|
128
|
+
if (outcome.ok)
|
|
129
|
+
removed.push(step.scope);
|
|
130
|
+
else if (outcome.answered === false)
|
|
131
|
+
unknown.push(step.scope);
|
|
132
|
+
else
|
|
133
|
+
absent.push(step.scope);
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
serverName: profile.serverName,
|
|
137
|
+
removed,
|
|
138
|
+
absent,
|
|
139
|
+
unknown,
|
|
140
|
+
added: false,
|
|
141
|
+
ok: unknown.length === 0,
|
|
142
|
+
detail: unknown.length > 0
|
|
143
|
+
? `the '${profile.serverName}' removal is unconfirmed: ${unknown.length} scope(s) never answered`
|
|
144
|
+
: removed.length === 0
|
|
145
|
+
? `no '${profile.serverName}' registration was present in any declared scope`
|
|
146
|
+
: `removed '${profile.serverName}' from ${removed.length} scope(s)`
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
export const NO_MCP_INSTALL_REASON = 'adapter declares no mcpInstall profile';
|
|
150
|
+
/** Register this adapter's harness, or report that there is nothing to register. */
|
|
151
|
+
export function installMcpForAdapter(adapter, serverArgv, runner) {
|
|
152
|
+
const profile = adapter.mcpInstall;
|
|
153
|
+
if (profile === undefined) {
|
|
154
|
+
return { ideId: adapter.id, skipped: true, reason: NO_MCP_INSTALL_REASON };
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
ideId: adapter.id,
|
|
158
|
+
skipped: false,
|
|
159
|
+
report: runMcpInstallPlan(profile, serverArgv, runner)
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/** The same, for the removal side. */
|
|
163
|
+
export function uninstallMcpForAdapter(adapter, serverArgv, runner) {
|
|
164
|
+
const profile = adapter.mcpInstall;
|
|
165
|
+
if (profile === undefined) {
|
|
166
|
+
return { ideId: adapter.id, skipped: true, reason: NO_MCP_INSTALL_REASON };
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
ideId: adapter.id,
|
|
170
|
+
skipped: false,
|
|
171
|
+
report: runMcpUninstallPlan(profile, serverArgv, runner)
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* The production runner and its deadline live in `mcp-install-runner.ts` — split
|
|
176
|
+
* out only to keep this engine within the file-size cap. They are re-exported, so
|
|
177
|
+
* the boundary is invisible: every caller still imports them from here.
|
|
178
|
+
*/
|
|
179
|
+
export { MCP_INSTALL_TIMEOUT_MS, spawnMcpInstallCommand, spawnMcpInstallRunner } from './mcp-install-runner.js';
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { type SkillMetadata } from '../skills/skill-registry.js';
|
|
2
|
+
/** Where the generator writes, relative to the package root. */
|
|
3
|
+
export declare const PLUGIN_MANIFEST_RELATIVE_PATH = ".claude-plugin/marketplace.json";
|
|
4
|
+
/**
|
|
5
|
+
* The server key peaks registers itself under. It is OUR key, not a harness's —
|
|
6
|
+
* the adapter profiles that name it (`IdeMcpInstallProfile.serverName`) and the
|
|
7
|
+
* tool-name templates that match it (`IdeAdapter.mcp`) must agree with this one,
|
|
8
|
+
* which is why it is declared once.
|
|
9
|
+
*/
|
|
10
|
+
export declare const MCP_SERVER_KEY = "peaks";
|
|
11
|
+
/** The subset of `package.json` this render reads. */
|
|
12
|
+
interface PackageManifest {
|
|
13
|
+
readonly name: string;
|
|
14
|
+
readonly version: string;
|
|
15
|
+
readonly description?: string;
|
|
16
|
+
readonly author?: string;
|
|
17
|
+
readonly homepage?: string;
|
|
18
|
+
readonly repository?: {
|
|
19
|
+
readonly url?: string;
|
|
20
|
+
} | string;
|
|
21
|
+
readonly license?: string;
|
|
22
|
+
readonly keywords?: readonly string[];
|
|
23
|
+
}
|
|
24
|
+
/** One plugin entry's skill list item — the shape `peaks skill:visibility` reads. */
|
|
25
|
+
interface PluginSkillEntry {
|
|
26
|
+
readonly name: string;
|
|
27
|
+
readonly path: string;
|
|
28
|
+
readonly description: string;
|
|
29
|
+
readonly userInvocable?: boolean;
|
|
30
|
+
}
|
|
31
|
+
interface GeneratedPluginManifest {
|
|
32
|
+
readonly metadata: {
|
|
33
|
+
readonly pluginRoot: string;
|
|
34
|
+
readonly version: string;
|
|
35
|
+
};
|
|
36
|
+
readonly plugins: readonly {
|
|
37
|
+
readonly name: string;
|
|
38
|
+
readonly description: string;
|
|
39
|
+
readonly version: string;
|
|
40
|
+
readonly author: {
|
|
41
|
+
readonly name: string;
|
|
42
|
+
};
|
|
43
|
+
readonly homepage: string;
|
|
44
|
+
readonly repository: string;
|
|
45
|
+
readonly license: string;
|
|
46
|
+
readonly keywords: readonly string[];
|
|
47
|
+
/**
|
|
48
|
+
* Declared, and deliberately not brought live: the plugin channel is not
|
|
49
|
+
* published by this slice (PRD non-goal), so this is the statement of what
|
|
50
|
+
* the channel WOULD run, kept true by generation rather than by memory.
|
|
51
|
+
*
|
|
52
|
+
* The command is the CLI's own name and subcommand, with no path in it: a
|
|
53
|
+
* manifest is built on one machine and read on another, so an absolute
|
|
54
|
+
* interpreter path resolved here would be the build host's. The RUNTIME
|
|
55
|
+
* registration is a different artefact with a different consumer and does
|
|
56
|
+
* resolve the pair — see `mcp-install.ts::resolveMcpServerArgv`.
|
|
57
|
+
*/
|
|
58
|
+
readonly mcpServers: Record<string, {
|
|
59
|
+
readonly command: string;
|
|
60
|
+
readonly args: readonly string[];
|
|
61
|
+
}>;
|
|
62
|
+
readonly skills: readonly PluginSkillEntry[];
|
|
63
|
+
}[];
|
|
64
|
+
}
|
|
65
|
+
/** `package.json`, parsed. A missing version is a refusal, not a default. */
|
|
66
|
+
export declare function loadPackageManifest(root?: string): PackageManifest;
|
|
67
|
+
/**
|
|
68
|
+
* The skill entries, in the registry's order.
|
|
69
|
+
*
|
|
70
|
+
* `visibility: internal` is the skill's own declaration that it is an internal
|
|
71
|
+
* role rather than a front door, and it is the ONE source for `userInvocable` —
|
|
72
|
+
* the field is emitted only when it is `false`, which is the contract
|
|
73
|
+
* `skill:visibility` reads ("internal: userInvocable false; public: omitted").
|
|
74
|
+
*/
|
|
75
|
+
export declare function skillEntriesOf(skills: readonly SkillMetadata[]): readonly PluginSkillEntry[];
|
|
76
|
+
/**
|
|
77
|
+
* Render the manifest. `skills` is passed in rather than loaded here so the one
|
|
78
|
+
* caller that must fail loudly on an unreadable SKILL.md can do so once.
|
|
79
|
+
*/
|
|
80
|
+
export declare function generatePluginManifest(manifest: PackageManifest, skills: readonly SkillMetadata[]): GeneratedPluginManifest;
|
|
81
|
+
/** Pretty JSON, newline-terminated — the same serialization contract as the whitelist. */
|
|
82
|
+
export declare function serializePluginManifest(manifest: GeneratedPluginManifest): string;
|
|
83
|
+
/** Absolute path of the committed artifact for a package root. */
|
|
84
|
+
export declare function pluginManifestPath(root?: string): string;
|
|
85
|
+
/**
|
|
86
|
+
* The whole render for a package root: read the two sources, refuse a skill tree
|
|
87
|
+
* that did not fully parse, and serialize.
|
|
88
|
+
*
|
|
89
|
+
* The `failures` refusal is the load-bearing part. `loadSkillRegistry` reports an
|
|
90
|
+
* unreadable `SKILL.md` in a `failures` array instead of throwing, so a render
|
|
91
|
+
* that ignored it would DROP a skill from the manifest and still be
|
|
92
|
+
* byte-stable — a green CI over a manifest that had silently lost entries. A
|
|
93
|
+
* drift assertion cannot be stronger than its input, so the input is required to
|
|
94
|
+
* be complete.
|
|
95
|
+
*/
|
|
96
|
+
export declare function renderPluginManifest(root?: string): Promise<string>;
|
|
97
|
+
export {};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// src/services/distribution/plugin-manifest.ts
|
|
2
|
+
//
|
|
3
|
+
// The plugin/distribution manifest as a GENERATED artefact (spec §4.1). One
|
|
4
|
+
// source, two renders: the whitelist artifact is what the read-only claim is
|
|
5
|
+
// made of, and this file is what the distribution channel is told.
|
|
6
|
+
//
|
|
7
|
+
// WHY IT IS GENERATED. The hand-authored `.claude-plugin/marketplace.json` had
|
|
8
|
+
// rotted in the only two fields anybody could check and nobody did: it declared
|
|
9
|
+
// version `2.0.3` while the package was `4.1.2`, and 12 skills while the tree
|
|
10
|
+
// held 22. Root cause is not carelessness — it is that the current distribution
|
|
11
|
+
// channel is `npm i -g`, so nothing ever read the plugin manifest and no failure
|
|
12
|
+
// could be observed from it. A file whose author is a human and whose reader is
|
|
13
|
+
// nobody will drift; the fix is to remove the human from the loop, not to be
|
|
14
|
+
// more careful.
|
|
15
|
+
//
|
|
16
|
+
// CHANGE THE SOURCE, NOT THIS FILE. Everything below is derived, and
|
|
17
|
+
// `tests/unit/services/distribution/plugin-manifest.test.ts` fails the moment
|
|
18
|
+
// the committed artefact differs from a fresh render. A hand edit is therefore
|
|
19
|
+
// not merely overwritten, it is RED. To change the manifest, change
|
|
20
|
+
// `package.json` (a plugin-level field) or the skill's own `SKILL.md`
|
|
21
|
+
// (a skill entry) and re-run `pnpm plugin:manifest`.
|
|
22
|
+
//
|
|
23
|
+
// DETERMINISM. No timestamp, no `Date`, no unordered iteration: skills come back
|
|
24
|
+
// from `loadSkillRegistry`, which sorts by name, and every plugin-level field is
|
|
25
|
+
// copied from `package.json` in a fixed order. Two consecutive runs are
|
|
26
|
+
// byte-identical, which is what makes the CI equality assertion mean something.
|
|
27
|
+
import { readFileSync } from 'node:fs';
|
|
28
|
+
import { dirname, join, relative } from 'node:path';
|
|
29
|
+
import { repoRoot } from 'peaks-loop-shared/paths';
|
|
30
|
+
import { loadSkillRegistry } from '../skills/skill-registry.js';
|
|
31
|
+
/** Where the generator writes, relative to the package root. */
|
|
32
|
+
export const PLUGIN_MANIFEST_RELATIVE_PATH = '.claude-plugin/marketplace.json';
|
|
33
|
+
/**
|
|
34
|
+
* The server key peaks registers itself under. It is OUR key, not a harness's —
|
|
35
|
+
* the adapter profiles that name it (`IdeMcpInstallProfile.serverName`) and the
|
|
36
|
+
* tool-name templates that match it (`IdeAdapter.mcp`) must agree with this one,
|
|
37
|
+
* which is why it is declared once.
|
|
38
|
+
*/
|
|
39
|
+
export const MCP_SERVER_KEY = 'peaks';
|
|
40
|
+
/** `package.json`, parsed. A missing version is a refusal, not a default. */
|
|
41
|
+
export function loadPackageManifest(root = repoRoot) {
|
|
42
|
+
const parsed = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8'));
|
|
43
|
+
if (typeof parsed.version !== 'string' || parsed.version.length === 0) {
|
|
44
|
+
throw new Error('package.json version must be a non-empty string');
|
|
45
|
+
}
|
|
46
|
+
return parsed;
|
|
47
|
+
}
|
|
48
|
+
/** A repository URL as a manifest reads it: npm's `.git` suffix is not part of the link. */
|
|
49
|
+
function repositoryUrl(manifest) {
|
|
50
|
+
const raw = typeof manifest.repository === 'string' ? manifest.repository : manifest.repository?.url;
|
|
51
|
+
return (raw ?? '').replace(/\.git$/, '');
|
|
52
|
+
}
|
|
53
|
+
/** POSIX-separated, so the artifact is byte-identical whichever OS generated it. */
|
|
54
|
+
function posix(value) {
|
|
55
|
+
return value.split('\\').join('/');
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The skill entries, in the registry's order.
|
|
59
|
+
*
|
|
60
|
+
* `visibility: internal` is the skill's own declaration that it is an internal
|
|
61
|
+
* role rather than a front door, and it is the ONE source for `userInvocable` —
|
|
62
|
+
* the field is emitted only when it is `false`, which is the contract
|
|
63
|
+
* `skill:visibility` reads ("internal: userInvocable false; public: omitted").
|
|
64
|
+
*/
|
|
65
|
+
export function skillEntriesOf(skills) {
|
|
66
|
+
return skills
|
|
67
|
+
.filter((skill) => skill.name.startsWith('peaks-'))
|
|
68
|
+
.map((skill) => ({
|
|
69
|
+
name: skill.name,
|
|
70
|
+
path: `./${posix(relative(repoRoot, dirname(skill.skillPath)))}`,
|
|
71
|
+
description: skill.description,
|
|
72
|
+
...(skill.visibility === 'internal' ? { userInvocable: false } : {})
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Render the manifest. `skills` is passed in rather than loaded here so the one
|
|
77
|
+
* caller that must fail loudly on an unreadable SKILL.md can do so once.
|
|
78
|
+
*/
|
|
79
|
+
export function generatePluginManifest(manifest, skills) {
|
|
80
|
+
return {
|
|
81
|
+
metadata: { pluginRoot: '.', version: manifest.version },
|
|
82
|
+
plugins: [
|
|
83
|
+
{
|
|
84
|
+
name: manifest.name,
|
|
85
|
+
description: manifest.description ?? '',
|
|
86
|
+
version: manifest.version,
|
|
87
|
+
author: { name: manifest.author ?? '' },
|
|
88
|
+
homepage: manifest.homepage ?? '',
|
|
89
|
+
repository: repositoryUrl(manifest),
|
|
90
|
+
license: manifest.license ?? '',
|
|
91
|
+
keywords: [...(manifest.keywords ?? [])],
|
|
92
|
+
mcpServers: {
|
|
93
|
+
[MCP_SERVER_KEY]: { command: MCP_SERVER_KEY, args: ['mcp', 'serve'] }
|
|
94
|
+
},
|
|
95
|
+
skills: skillEntriesOf(skills)
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/** Pretty JSON, newline-terminated — the same serialization contract as the whitelist. */
|
|
101
|
+
export function serializePluginManifest(manifest) {
|
|
102
|
+
return `${JSON.stringify(manifest, null, 2)}\n`;
|
|
103
|
+
}
|
|
104
|
+
/** Absolute path of the committed artifact for a package root. */
|
|
105
|
+
export function pluginManifestPath(root = repoRoot) {
|
|
106
|
+
return join(root, PLUGIN_MANIFEST_RELATIVE_PATH);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* The whole render for a package root: read the two sources, refuse a skill tree
|
|
110
|
+
* that did not fully parse, and serialize.
|
|
111
|
+
*
|
|
112
|
+
* The `failures` refusal is the load-bearing part. `loadSkillRegistry` reports an
|
|
113
|
+
* unreadable `SKILL.md` in a `failures` array instead of throwing, so a render
|
|
114
|
+
* that ignored it would DROP a skill from the manifest and still be
|
|
115
|
+
* byte-stable — a green CI over a manifest that had silently lost entries. A
|
|
116
|
+
* drift assertion cannot be stronger than its input, so the input is required to
|
|
117
|
+
* be complete.
|
|
118
|
+
*/
|
|
119
|
+
export async function renderPluginManifest(root = repoRoot) {
|
|
120
|
+
const skills = await loadSkillRegistry(join(root, 'skills'));
|
|
121
|
+
if (skills.failures.length > 0) {
|
|
122
|
+
const named = skills.failures.map((failure) => failure.skillPath).join(', ');
|
|
123
|
+
throw new Error(`Refusing to render the plugin manifest: unreadable skill(s): ${named}`);
|
|
124
|
+
}
|
|
125
|
+
return serializePluginManifest(generatePluginManifest(loadPackageManifest(root), skills.skills));
|
|
126
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ProgramIO } from '../../cli/cli-helpers.js';
|
|
2
|
+
import type { IdeAdapter } from '../ide/ide-types.js';
|
|
3
|
+
/** The tool names the proven surface declares. */
|
|
4
|
+
export type McpSurfaceLookup = () => readonly string[];
|
|
5
|
+
/** The production lookup. Injectable so a test can make it throw and watch the refusal. */
|
|
6
|
+
export declare function lookupAllowedMcpTools(): readonly string[];
|
|
7
|
+
/** The adapter whose harness sent this payload. */
|
|
8
|
+
export declare function detectAdapter(parsedStdin: unknown): IdeAdapter;
|
|
9
|
+
/** The deny emission, in the shape the host already treats as a hard block. */
|
|
10
|
+
export declare function emitMcpDeny(io: ProgramIO, code: string, reason: string): void;
|
|
11
|
+
/**
|
|
12
|
+
* Run the MCP branch over one parsed hook payload.
|
|
13
|
+
*
|
|
14
|
+
* @returns `true` when the call was BLOCKED (a deny has already been emitted).
|
|
15
|
+
* `false` means "this is not an MCP call for this surface" — every
|
|
16
|
+
* other tool name, and every harness declaring no MCP naming, lands
|
|
17
|
+
* there and keeps the allow/deny result it had before.
|
|
18
|
+
*/
|
|
19
|
+
export declare function handleMcpSurfaceGate(io: ProgramIO, parsedStdin: unknown, lookup?: McpSurfaceLookup, adapterOf?: (payload: unknown) => IdeAdapter): boolean;
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// src/services/hooks/mcp-surface-gate.ts
|
|
2
|
+
//
|
|
3
|
+
// L3 for the read-only MCP surface: the pre-tool branch that covers MCP tool
|
|
4
|
+
// calls (spec §6.1, §6.2, §6.3).
|
|
5
|
+
//
|
|
6
|
+
// WHY IT IS ITS OWN MODULE. It shares an entry point with the Bash and worktree
|
|
7
|
+
// branches but nothing else: different surface (an MCP tool name, not a command
|
|
8
|
+
// text), different failure direction (fail-CLOSED, where the others fail open),
|
|
9
|
+
// and a different thing it polices. Keeping it beside them made the interceptor
|
|
10
|
+
// file carry three unrelated decisions; it lives here so the file that owns the
|
|
11
|
+
// hook's control flow stays the file that owns the hook's control flow.
|
|
12
|
+
//
|
|
13
|
+
// WHAT IT POLICES, AND WHAT IT DOES NOT. It does not second-guess what a tool
|
|
14
|
+
// would return. It answers one question: "is this MCP tool call one the proven
|
|
15
|
+
// surface declares?" It exists for DRIFT — a stale server process, a hand-edited
|
|
16
|
+
// harness config pointing somewhere else, a tool added to a config that was
|
|
17
|
+
// never proved read-only. The read-only proof itself is L2's job; this is the
|
|
18
|
+
// belt over it.
|
|
19
|
+
//
|
|
20
|
+
// FAIL-CLOSED, AND THE ASYMMETRY WITH THE BASH BRANCH IS DELIBERATE. The Bash
|
|
21
|
+
// branch guards command TEXT, where a false block interrupts real work, so it
|
|
22
|
+
// fails open. This branch guards CONFIG CONSISTENCY, where a false block costs
|
|
23
|
+
// one call that should have been consistent while a false allow costs a call
|
|
24
|
+
// that bypassed the chain. The costs are not the same size, so they do not share
|
|
25
|
+
// a direction — and they do not share a `catch` either.
|
|
26
|
+
//
|
|
27
|
+
// IT READS THE SURFACE AS DATA, NEVER AS CODE. The allowed tool names come from
|
|
28
|
+
// the generated whitelist artifact through its loader, so this branch keeps
|
|
29
|
+
// working when `src/services/mcp/` is deleted (spec §1) — which is also what
|
|
30
|
+
// `tests/unit/standards/no-mcp-source-import.test.ts` enforces mechanically.
|
|
31
|
+
import { getErrorMessage } from 'peaks-loop-shared/result';
|
|
32
|
+
import { emitBlock } from './output.js';
|
|
33
|
+
import { getAdapter } from '../ide/ide-registry.js';
|
|
34
|
+
import { detectIdeFromContext, parseClaudeShapeStdin } from '../ide/hook-translator.js';
|
|
35
|
+
import { matchMcpToolName } from '../ide/mcp-tool-matcher.js';
|
|
36
|
+
import { loadReadOnlyWhitelist, toolIdsOf } from '../readonly-surface/readonly-whitelist.js';
|
|
37
|
+
/** The production lookup. Injectable so a test can make it throw and watch the refusal. */
|
|
38
|
+
export function lookupAllowedMcpTools() {
|
|
39
|
+
return toolIdsOf(loadReadOnlyWhitelist());
|
|
40
|
+
}
|
|
41
|
+
/** The adapter whose harness sent this payload. */
|
|
42
|
+
export function detectAdapter(parsedStdin) {
|
|
43
|
+
const ide = detectIdeFromContext({ env: process.env, cwd: process.cwd(), parsedStdin });
|
|
44
|
+
return getAdapter(ide);
|
|
45
|
+
}
|
|
46
|
+
/** The deny emission, in the shape the host already treats as a hard block. */
|
|
47
|
+
export function emitMcpDeny(io, code, reason) {
|
|
48
|
+
emitBlock(io, `[mcp-surface-gate:${code}] ${reason}. Blocked by fail-closed policy — ` +
|
|
49
|
+
'run the read-only command through the CLI instead, or add its argv to ' +
|
|
50
|
+
'contracts/readonly-surface.json and regenerate the whitelist.');
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Run the MCP branch over one parsed hook payload.
|
|
54
|
+
*
|
|
55
|
+
* @returns `true` when the call was BLOCKED (a deny has already been emitted).
|
|
56
|
+
* `false` means "this is not an MCP call for this surface" — every
|
|
57
|
+
* other tool name, and every harness declaring no MCP naming, lands
|
|
58
|
+
* there and keeps the allow/deny result it had before.
|
|
59
|
+
*/
|
|
60
|
+
export function handleMcpSurfaceGate(io, parsedStdin, lookup = lookupAllowedMcpTools, adapterOf = detectAdapter) {
|
|
61
|
+
let adapter;
|
|
62
|
+
try {
|
|
63
|
+
adapter = adapterOf(parsedStdin);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
// Detection itself failed. Falling through would let the call pass
|
|
67
|
+
// unchecked, which is the one outcome this branch exists to prevent.
|
|
68
|
+
emitMcpDeny(io, 'IDE_DETECTION_FAILED', `the harness could not be identified (${getErrorMessage(error)})`);
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
const { toolName } = parseClaudeShapeStdin(parsedStdin);
|
|
72
|
+
const match = toolName === undefined ? undefined : matchMcpToolName(adapter, toolName);
|
|
73
|
+
if (match === undefined)
|
|
74
|
+
return false;
|
|
75
|
+
let allowed;
|
|
76
|
+
try {
|
|
77
|
+
allowed = lookup();
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
emitMcpDeny(io, 'SURFACE_UNREADABLE', `the read-only surface could not be read (${getErrorMessage(error)})`);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
if (allowed.includes(match.toolId))
|
|
84
|
+
return false;
|
|
85
|
+
emitMcpDeny(io, 'NOT_IN_READONLY_SURFACE', `"${toolName}" is not one of the read-only tools this project declares (${allowed.join(', ') || 'none'})`);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
@@ -1,39 +1,8 @@
|
|
|
1
1
|
import type { IdeAdapter } from '../ide-types.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
* `peaks code context-audit` reuses THIS locator instead of re-implementing
|
|
7
|
-
* the recursive find. Returns `null` when the transcript does not exist —
|
|
8
|
-
* callers MUST treat that as "unavailable", never as an error.
|
|
9
|
-
*/
|
|
10
|
-
export declare function resolveClaudeTranscriptPath(outerSessionId: string, projectsDir?: string): string | null;
|
|
11
|
-
/**
|
|
12
|
-
* Resolve the currently-active Claude Code model id from a runtime env map.
|
|
13
|
-
* Returns the first non-empty `CLAUDE_CODE_MODEL_ENV_VARS` value (trimmed), or
|
|
14
|
-
* `undefined` when none is present. Pure + exported for tests; the caller falls
|
|
15
|
-
* back to the transcript `message.model` when this returns undefined.
|
|
16
|
-
*/
|
|
17
|
-
export declare function resolveClaudeModelFromEnv(env: NodeJS.ProcessEnv | undefined): string | undefined;
|
|
18
|
-
/**
|
|
19
|
-
* Model-aware context-window size in tokens.
|
|
20
|
-
*
|
|
21
|
-
* Detection rule (documented):
|
|
22
|
-
* 1. Empty / unknown model → DEFAULT_CONTEXT_WINDOW_TOKENS (200_000).
|
|
23
|
-
* 2. Suffix heuristic — a model id containing `1m` (case-insensitive) is
|
|
24
|
-
* treated as 1M-context.
|
|
25
|
-
* 3. Explicit allowlist — known 1M Claude model ids
|
|
26
|
-
* (ONE_MILLION_CONTEXT_MODELS).
|
|
27
|
-
* 4. Everything else → 200_000 (the safe default).
|
|
28
|
-
*
|
|
29
|
-
* Callers MAY additionally infer ≥1M from the observed token count: if
|
|
30
|
-
* `contextTokens > DEFAULT_CONTEXT_WINDOW_TOKENS`, the model cannot be a
|
|
31
|
-
* 200K model and must be ≥1M (see `readClaudeTranscriptEstimate`).
|
|
32
|
-
*
|
|
33
|
-
* This is the HEURISTIC layer only. Explicit user overrides sit ABOVE it —
|
|
34
|
-
* see `resolveContextWindow`, which is what the probe actually calls.
|
|
35
|
-
*/
|
|
36
|
-
export declare function modelContextWindowTokens(model: string): number;
|
|
2
|
+
import { resolveClaudeTranscriptPath } from './claude-code-local-state.js';
|
|
3
|
+
import { modelContextWindowTokens, resolveClaudeModelFromEnv } from './claude-code-model-window.js';
|
|
4
|
+
export { resolveClaudeTranscriptPath };
|
|
5
|
+
export { modelContextWindowTokens, resolveClaudeModelFromEnv };
|
|
37
6
|
/**
|
|
38
7
|
* the context-window size in tokens. Third-party / proxied models whose id
|
|
39
8
|
* carries no `[1M]` suffix (and is absent from the hardcoded allowlist) are
|