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,137 @@
|
|
|
1
|
+
// src/services/mcp/tool-core.ts
|
|
2
|
+
//
|
|
3
|
+
// What both tool handlers are made of: the result shape, the argument-to-argv
|
|
4
|
+
// step, and the one place a CLI execution becomes an outcome. Split out of
|
|
5
|
+
// `tools.ts` because that file had grown past the repo's 300-line cap, and the
|
|
6
|
+
// cap is measured per file rather than per concept.
|
|
7
|
+
//
|
|
8
|
+
// ERRORS ARE NEVER FLATTENED HERE, either. A CLI failure becomes a `failure`
|
|
9
|
+
// string on the outcome, never an absent value: a read tool that answers
|
|
10
|
+
// "nothing there" when it actually failed is worse than one that errors, because
|
|
11
|
+
// the reader believes the empty answer (spec §9 rule 3).
|
|
12
|
+
import { executeCliArgv } from './cli-executor.js';
|
|
13
|
+
/** How much of one memory note's description travels back. */
|
|
14
|
+
export const MEMORY_EXCERPT_CHARS = 120;
|
|
15
|
+
/** Hard ceiling on matches returned, independent of what the CLI was asked for. */
|
|
16
|
+
export const MEMORY_MAX_RETURNED = 50;
|
|
17
|
+
/**
|
|
18
|
+
* Hand-written parameter defaults — the one place this module can drift from the
|
|
19
|
+
* whitelist (spec §8.1 asks such places to be visible). `project` is a MANDATORY
|
|
20
|
+
* option of `peaks request show`, and a status caller should not have to repeat
|
|
21
|
+
* the directory the server already runs in. Nothing else is defaulted: every
|
|
22
|
+
* other placeholder is either required by the caller or defaulted in the data.
|
|
23
|
+
*/
|
|
24
|
+
function defaultFor(param, context) {
|
|
25
|
+
return param === 'project' ? (context.cwd ?? process.cwd()) : undefined;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* A transported argument as the guard's input. The JSON transport carries
|
|
29
|
+
* numbers for integer parameters and the guard can only judge a string, so
|
|
30
|
+
* coercion happens here, at the boundary — and a wrong JSON type is NOT
|
|
31
|
+
* stringified into something that looks like data: it becomes the empty string,
|
|
32
|
+
* which the guard already refuses by name (`EMPTY`).
|
|
33
|
+
*/
|
|
34
|
+
function asGuardInput(supplied) {
|
|
35
|
+
if (typeof supplied === 'string')
|
|
36
|
+
return supplied;
|
|
37
|
+
if (typeof supplied === 'number')
|
|
38
|
+
return String(supplied);
|
|
39
|
+
return '';
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The values to render one entry with, or `undefined` when the caller did not
|
|
43
|
+
* supply enough for this entry to run. A value the caller DID supply is always
|
|
44
|
+
* present — it is handed to the guard, which is what decides whether it is
|
|
45
|
+
* allowed, so nothing supplied can be silently skipped.
|
|
46
|
+
*/
|
|
47
|
+
export function valuesForEntry(entry, args, context) {
|
|
48
|
+
const values = {};
|
|
49
|
+
for (const [name, spec] of Object.entries(entry.params)) {
|
|
50
|
+
const supplied = args[name];
|
|
51
|
+
if (supplied !== undefined) {
|
|
52
|
+
values[name] = asGuardInput(supplied);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const fallback = spec.default === undefined ? defaultFor(name, context) : String(spec.default);
|
|
56
|
+
if (fallback === undefined)
|
|
57
|
+
return undefined;
|
|
58
|
+
values[name] = fallback;
|
|
59
|
+
}
|
|
60
|
+
return values;
|
|
61
|
+
}
|
|
62
|
+
/** True when the CLI process itself failed, or its stdout was not a JSON envelope. */
|
|
63
|
+
function failureReasonOf(execution, envelope) {
|
|
64
|
+
const called = `peaks ${execution.argv.join(' ')}`;
|
|
65
|
+
if (execution.launchError !== undefined) {
|
|
66
|
+
return `The peaks CLI could not be started: ${execution.launchError}`;
|
|
67
|
+
}
|
|
68
|
+
if (execution.timedOut) {
|
|
69
|
+
return `The peaks CLI did not finish in time and was killed: ${called}`;
|
|
70
|
+
}
|
|
71
|
+
if (execution.exitCode !== 0) {
|
|
72
|
+
return `The peaks CLI exited with code ${String(execution.exitCode)}: ${called}`;
|
|
73
|
+
}
|
|
74
|
+
if (envelope === undefined) {
|
|
75
|
+
return `The peaks CLI printed no JSON on stdout: ${called}`;
|
|
76
|
+
}
|
|
77
|
+
if (isFailedEnvelope(envelope)) {
|
|
78
|
+
return `The peaks CLI reported failure: ${called}`;
|
|
79
|
+
}
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
function isFailedEnvelope(value) {
|
|
83
|
+
return typeof value === 'object' && value !== null && 'ok' in value && value.ok === false;
|
|
84
|
+
}
|
|
85
|
+
function parseStdout(stdout) {
|
|
86
|
+
try {
|
|
87
|
+
return { parsed: true, value: JSON.parse(stdout) };
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return { parsed: false };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** Render the outcomes as a tool result, failing the call when any argv failed. */
|
|
94
|
+
export function resultOf(outcomes) {
|
|
95
|
+
const payload = {};
|
|
96
|
+
for (const outcome of outcomes) {
|
|
97
|
+
payload[outcome.key] =
|
|
98
|
+
outcome.envelope === undefined
|
|
99
|
+
? { ok: false, message: outcome.failure ?? 'no output', argv: outcome.execution.argv }
|
|
100
|
+
: outcome.envelope;
|
|
101
|
+
}
|
|
102
|
+
const failures = outcomes.filter((outcome) => outcome.failure !== undefined);
|
|
103
|
+
if (failures.length === 0) {
|
|
104
|
+
return { content: [{ type: 'text', text: JSON.stringify(payload) }] };
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
content: [
|
|
108
|
+
{
|
|
109
|
+
type: 'text',
|
|
110
|
+
text: JSON.stringify({
|
|
111
|
+
...payload,
|
|
112
|
+
failures: failures.map((outcome) => ({ key: outcome.key, reason: outcome.failure }))
|
|
113
|
+
})
|
|
114
|
+
}
|
|
115
|
+
],
|
|
116
|
+
isError: true
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/** A refused call: the parameter guard said no, before anything was executed. */
|
|
120
|
+
export function rejectedResult(entry, reason) {
|
|
121
|
+
return {
|
|
122
|
+
content: [{ type: 'text', text: JSON.stringify({ entry: entry.id, reason }) }],
|
|
123
|
+
isError: true
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/** Execute one already-validated argv and keep its whole outcome. */
|
|
127
|
+
export async function runArgv(key, argv, context) {
|
|
128
|
+
const execute = context.execute ??
|
|
129
|
+
((args) => executeCliArgv(args, context.cwd === undefined ? {} : { cwd: context.cwd }));
|
|
130
|
+
const execution = await execute(argv);
|
|
131
|
+
const parsed = parseStdout(execution.stdout);
|
|
132
|
+
const envelope = parsed.parsed ? parsed.value : undefined;
|
|
133
|
+
const failure = failureReasonOf(execution, envelope);
|
|
134
|
+
return failure === undefined
|
|
135
|
+
? { key, execution, envelope }
|
|
136
|
+
: { key, execution, envelope, failure };
|
|
137
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { McpToolDefinition } from './surface.js';
|
|
2
|
+
import { type ToolCallContext, type ToolCallResult } from './tool-core.js';
|
|
3
|
+
/**
|
|
4
|
+
* `peaks_status`: run every argv the caller supplied enough for, and return each
|
|
5
|
+
* CLI envelope verbatim under the id of the whitelist entry that produced it.
|
|
6
|
+
*/
|
|
7
|
+
export declare function callStatusTool(tool: McpToolDefinition, args: Readonly<Record<string, unknown>>, context: ToolCallContext): Promise<ToolCallResult>;
|
|
8
|
+
type ToolHandler = (tool: McpToolDefinition, args: Readonly<Record<string, unknown>>, context: ToolCallContext) => Promise<ToolCallResult>;
|
|
9
|
+
/** Tools the surface declares that no handler can serve. Non-empty = refuse to start. */
|
|
10
|
+
export declare function missingHandlers(tools: readonly McpToolDefinition[]): readonly string[];
|
|
11
|
+
/** Route a `tools/call` to its handler, or `undefined` for a tool nobody serves. */
|
|
12
|
+
export declare function handlerFor(name: string): ToolHandler | undefined;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// src/services/mcp/tools.ts
|
|
2
|
+
//
|
|
3
|
+
// `peaks_status`, and the table that routes a `tools/call` to its handler. The
|
|
4
|
+
// result shape, the argument-to-argv step and the outcome rendering live in
|
|
5
|
+
// `tool-core.ts`; the bounded memory tool lives in `memory-tool.ts`.
|
|
6
|
+
//
|
|
7
|
+
// The composite is a pipe with a shape, never a judge (spec §3.2): "a composite
|
|
8
|
+
// tool may arrange and reshape; it may not CONCLUDE." Each CLI envelope is
|
|
9
|
+
// embedded VERBATIM under the whitelist entry id that produced it, so the whole
|
|
10
|
+
// result is an identity transform of the calls it ran. A key is absent when its
|
|
11
|
+
// argv did not run — exactly "subset"; no branch fabricates a value no argv
|
|
12
|
+
// returned.
|
|
13
|
+
import { buildArgv } from '../readonly-surface/argv-guard.js';
|
|
14
|
+
import { callMemorySearchTool } from './memory-tool.js';
|
|
15
|
+
import { rejectedResult, resultOf, runArgv, valuesForEntry } from './tool-core.js';
|
|
16
|
+
/**
|
|
17
|
+
* `peaks_status`: run every argv the caller supplied enough for, and return each
|
|
18
|
+
* CLI envelope verbatim under the id of the whitelist entry that produced it.
|
|
19
|
+
*/
|
|
20
|
+
export async function callStatusTool(tool, args, context) {
|
|
21
|
+
// Every argv is BUILT before any is run. Executing as we go meant a refused
|
|
22
|
+
// placeholder left the earlier argv of the same call already executed — a
|
|
23
|
+
// caller's malformed input would have reached the CLI's read path anyway.
|
|
24
|
+
const plan = [];
|
|
25
|
+
for (const entry of tool.entries) {
|
|
26
|
+
const values = valuesForEntry(entry, args, context);
|
|
27
|
+
if (values === undefined)
|
|
28
|
+
continue;
|
|
29
|
+
const built = buildArgv(entry, values);
|
|
30
|
+
if (!built.ok) {
|
|
31
|
+
return rejectedResult(entry, `Parameter ${built.param} was refused: ${built.message}`);
|
|
32
|
+
}
|
|
33
|
+
plan.push({ id: entry.id, argv: built.argv });
|
|
34
|
+
}
|
|
35
|
+
const outcomes = [];
|
|
36
|
+
for (const step of plan) {
|
|
37
|
+
outcomes.push(await runArgv(step.id, step.argv, context));
|
|
38
|
+
}
|
|
39
|
+
return resultOf(outcomes);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Tool name -> handler, spelled out rather than derived. A tool the whitelist
|
|
43
|
+
* declares but this table does not name cannot be served, and `missingHandlers`
|
|
44
|
+
* below turns that into a refusal to start instead of a call that answers with
|
|
45
|
+
* whatever the fallback branch happened to do.
|
|
46
|
+
*/
|
|
47
|
+
const TOOL_HANDLERS = {
|
|
48
|
+
peaks_status: callStatusTool,
|
|
49
|
+
peaks_memory_search: callMemorySearchTool
|
|
50
|
+
};
|
|
51
|
+
/** Tools the surface declares that no handler can serve. Non-empty = refuse to start. */
|
|
52
|
+
export function missingHandlers(tools) {
|
|
53
|
+
return tools.map((tool) => tool.name).filter((name) => !(name in TOOL_HANDLERS));
|
|
54
|
+
}
|
|
55
|
+
/** Route a `tools/call` to its handler, or `undefined` for a tool nobody serves. */
|
|
56
|
+
export function handlerFor(name) {
|
|
57
|
+
return TOOL_HANDLERS[name];
|
|
58
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { PlaceholderSpec, ReadOnlyWhitelistEntry } from './readonly-whitelist.js';
|
|
2
|
+
/** Upper bound on any single placeholder value, whatever its type. */
|
|
3
|
+
export declare const READONLY_VALUE_MAX_LENGTH = 200;
|
|
4
|
+
export type GuardRejection = {
|
|
5
|
+
readonly ok: false;
|
|
6
|
+
readonly param: string;
|
|
7
|
+
readonly code: GuardRejectionCode;
|
|
8
|
+
readonly message: string;
|
|
9
|
+
};
|
|
10
|
+
export type GuardRejectionCode = 'NOT_A_STRING' | 'EMPTY' | 'TOO_LONG' | 'FLAG_SHAPED' | 'CONTROL_CHARACTER' | 'WHITESPACE' | 'PATTERN_MISMATCH' | 'NOT_IN_ENUM' | 'NOT_AN_INTEGER' | 'OUT_OF_RANGE' | 'NOT_ABSOLUTE';
|
|
11
|
+
export type GuardResult = {
|
|
12
|
+
readonly ok: true;
|
|
13
|
+
readonly value: string;
|
|
14
|
+
} | GuardRejection;
|
|
15
|
+
/** The process options that keep the array from being re-parsed by a shell. */
|
|
16
|
+
export declare function readonlySpawnOptions(): {
|
|
17
|
+
readonly shell: false;
|
|
18
|
+
};
|
|
19
|
+
/** Validate one placeholder value against its spec. */
|
|
20
|
+
export declare function validatePlaceholderValue(param: string, spec: PlaceholderSpec, raw: unknown): GuardResult;
|
|
21
|
+
export type BuildArgvResult = {
|
|
22
|
+
readonly ok: true;
|
|
23
|
+
readonly argv: string[];
|
|
24
|
+
} | GuardRejection;
|
|
25
|
+
/**
|
|
26
|
+
* Render a whitelist entry into a concrete argv ARRAY.
|
|
27
|
+
*
|
|
28
|
+
* The output is never a string: literals and validated values are pushed as
|
|
29
|
+
* separate elements, so no value can contribute token boundaries. A parameter the
|
|
30
|
+
* entry does not declare is refused rather than appended.
|
|
31
|
+
*/
|
|
32
|
+
export declare function buildArgv(entry: ReadOnlyWhitelistEntry, values: Readonly<Record<string, string>>): BuildArgvResult;
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parameter-injection guard for the read-only surface.
|
|
3
|
+
*
|
|
4
|
+
* THE ATTACK. An argv template has placeholder slots (`request show <rid>`). If a
|
|
5
|
+
* placeholder value is pasted into a command LINE, the value `--apply` stops being
|
|
6
|
+
* a request id and becomes a flag - the semantics of the call are inverted by its
|
|
7
|
+
* own data. Two independent defences, both required (spec §8.1):
|
|
8
|
+
*
|
|
9
|
+
* 1. TYPE WHITELIST - every placeholder declares a type, and the value must
|
|
10
|
+
* satisfy it. No type admits a leading `-`, so a flag-shaped value is never a
|
|
11
|
+
* legal value of any placeholder.
|
|
12
|
+
* 2. ARRAY PASSING - `buildArgv` returns `string[]`. The caller passes the array
|
|
13
|
+
* to the process API with shell parsing disabled (`readonlySpawnOptions`), so
|
|
14
|
+
* no value is ever re-tokenized by a shell.
|
|
15
|
+
*
|
|
16
|
+
* Defence 2 alone is not enough: `spawn(..., {shell:false})` still hands `--apply`
|
|
17
|
+
* to the CLI as a real flag. Defence 1 alone is not enough: a caller that joins
|
|
18
|
+
* the array into a string reintroduces the shell. Hence both.
|
|
19
|
+
*/
|
|
20
|
+
import { isAbsolute } from 'node:path';
|
|
21
|
+
/** Fallback pattern for a `slug` placeholder that declares none. */
|
|
22
|
+
const DEFAULT_SLUG_PATTERN = '^[a-z0-9][a-z0-9-]*$';
|
|
23
|
+
/** Upper bound on any single placeholder value, whatever its type. */
|
|
24
|
+
export const READONLY_VALUE_MAX_LENGTH = 200;
|
|
25
|
+
/** The process options that keep the array from being re-parsed by a shell. */
|
|
26
|
+
export function readonlySpawnOptions() {
|
|
27
|
+
return { shell: false };
|
|
28
|
+
}
|
|
29
|
+
function reject(param, code, message) {
|
|
30
|
+
return { ok: false, param, code, message };
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Control characters, matched by Unicode category rather than by a literal range:
|
|
34
|
+
* a hand-written `\x00-\x1f` class is a lint error (`no-control-regex`) precisely
|
|
35
|
+
* because such a range in a pattern is usually a bug, and `\p{Cc}` says what is
|
|
36
|
+
* meant without spelling out code points.
|
|
37
|
+
*/
|
|
38
|
+
function hasControlCharacter(value) {
|
|
39
|
+
return /\p{Cc}/u.test(value);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* The rules that hold for EVERY type, before any type-specific rule runs. A
|
|
43
|
+
* leading `-` is refused here, so no type can carry a flag into the argv.
|
|
44
|
+
*/
|
|
45
|
+
function precheckCommon(param, raw) {
|
|
46
|
+
if (typeof raw !== 'string') {
|
|
47
|
+
return reject(param, 'NOT_A_STRING', `Parameter ${param} must be a string.`);
|
|
48
|
+
}
|
|
49
|
+
if (raw.length === 0)
|
|
50
|
+
return reject(param, 'EMPTY', `Parameter ${param} must not be empty.`);
|
|
51
|
+
if (raw.length > READONLY_VALUE_MAX_LENGTH) {
|
|
52
|
+
return reject(param, 'TOO_LONG', `Parameter ${param} exceeds ${READONLY_VALUE_MAX_LENGTH} characters.`);
|
|
53
|
+
}
|
|
54
|
+
if (raw.startsWith('-')) {
|
|
55
|
+
return reject(param, 'FLAG_SHAPED', `Parameter ${param} must not look like a flag: ${raw}`);
|
|
56
|
+
}
|
|
57
|
+
if (hasControlCharacter(raw)) {
|
|
58
|
+
return reject(param, 'CONTROL_CHARACTER', `Parameter ${param} must not contain control characters.`);
|
|
59
|
+
}
|
|
60
|
+
return { ok: true, value: raw };
|
|
61
|
+
}
|
|
62
|
+
function checkToken(param, value) {
|
|
63
|
+
if (/\s/.test(value)) {
|
|
64
|
+
return reject(param, 'WHITESPACE', `Parameter ${param} must be a single token.`);
|
|
65
|
+
}
|
|
66
|
+
return { ok: true, value };
|
|
67
|
+
}
|
|
68
|
+
function checkSlug(param, value, spec) {
|
|
69
|
+
const asToken = checkToken(param, value);
|
|
70
|
+
if (!asToken.ok)
|
|
71
|
+
return asToken;
|
|
72
|
+
const pattern = new RegExp(spec.pattern ?? DEFAULT_SLUG_PATTERN);
|
|
73
|
+
if (!pattern.test(value)) {
|
|
74
|
+
return reject(param, 'PATTERN_MISMATCH', `Parameter ${param} must match ${pattern.source}: ${value}`);
|
|
75
|
+
}
|
|
76
|
+
return { ok: true, value };
|
|
77
|
+
}
|
|
78
|
+
function checkEnum(param, value, spec) {
|
|
79
|
+
if (spec.values === undefined || !spec.values.includes(value)) {
|
|
80
|
+
return reject(param, 'NOT_IN_ENUM', `Parameter ${param} must be one of: ${(spec.values ?? []).join(', ')}`);
|
|
81
|
+
}
|
|
82
|
+
return { ok: true, value };
|
|
83
|
+
}
|
|
84
|
+
function checkInteger(param, value, spec) {
|
|
85
|
+
if (!/^[0-9]+$/.test(value)) {
|
|
86
|
+
return reject(param, 'NOT_AN_INTEGER', `Parameter ${param} must be an integer: ${value}`);
|
|
87
|
+
}
|
|
88
|
+
const parsed = Number.parseInt(value, 10);
|
|
89
|
+
const min = spec.min ?? 0;
|
|
90
|
+
const max = spec.max ?? Number.MAX_SAFE_INTEGER;
|
|
91
|
+
if (parsed < min || parsed > max) {
|
|
92
|
+
return reject(param, 'OUT_OF_RANGE', `Parameter ${param} must be between ${min} and ${max}.`);
|
|
93
|
+
}
|
|
94
|
+
return { ok: true, value };
|
|
95
|
+
}
|
|
96
|
+
function checkPath(param, value) {
|
|
97
|
+
// Spaces are legal in a path and irrelevant under array passing; the absolute
|
|
98
|
+
// check is what keeps `--apply` and a bare word out.
|
|
99
|
+
if (!isAbsolute(value)) {
|
|
100
|
+
return reject(param, 'NOT_ABSOLUTE', `Parameter ${param} must be an absolute path.`);
|
|
101
|
+
}
|
|
102
|
+
return { ok: true, value };
|
|
103
|
+
}
|
|
104
|
+
const TYPE_CHECKS = {
|
|
105
|
+
token: (param, value) => checkToken(param, value),
|
|
106
|
+
slug: (param, value, spec) => checkSlug(param, value, spec),
|
|
107
|
+
enum: (param, value, spec) => checkEnum(param, value, spec),
|
|
108
|
+
integer: (param, value, spec) => checkInteger(param, value, spec),
|
|
109
|
+
path: (param, value) => checkPath(param, value)
|
|
110
|
+
};
|
|
111
|
+
/** Validate one placeholder value against its spec. */
|
|
112
|
+
export function validatePlaceholderValue(param, spec, raw) {
|
|
113
|
+
const prechecked = precheckCommon(param, raw);
|
|
114
|
+
if (!prechecked.ok)
|
|
115
|
+
return prechecked;
|
|
116
|
+
return TYPE_CHECKS[spec.type](param, prechecked.value, spec);
|
|
117
|
+
}
|
|
118
|
+
function missingParam(param) {
|
|
119
|
+
return reject(param, 'EMPTY', `Parameter ${param} was not supplied.`);
|
|
120
|
+
}
|
|
121
|
+
/** A value is required for every placeholder present in the template. */
|
|
122
|
+
function resolveParamValue(param, declared, values) {
|
|
123
|
+
if (declared === undefined)
|
|
124
|
+
return missingParam(param);
|
|
125
|
+
const supplied = values[param];
|
|
126
|
+
// Every placeholder in this surface is required (introspected), and a missing
|
|
127
|
+
// OPTIONAL value could only be honoured by also dropping the flag literal the
|
|
128
|
+
// loop has already pushed. Refusing is the honest answer.
|
|
129
|
+
if (supplied === undefined)
|
|
130
|
+
return missingParam(param);
|
|
131
|
+
return validatePlaceholderValue(param, declared, supplied);
|
|
132
|
+
}
|
|
133
|
+
function unknownParams(entry, values) {
|
|
134
|
+
for (const name of Object.keys(values)) {
|
|
135
|
+
if (!(name in entry.params)) {
|
|
136
|
+
return reject(name, 'NOT_A_STRING', `Entry ${entry.id} declares no parameter ${name}.`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Render a whitelist entry into a concrete argv ARRAY.
|
|
143
|
+
*
|
|
144
|
+
* The output is never a string: literals and validated values are pushed as
|
|
145
|
+
* separate elements, so no value can contribute token boundaries. A parameter the
|
|
146
|
+
* entry does not declare is refused rather than appended.
|
|
147
|
+
*/
|
|
148
|
+
export function buildArgv(entry, values) {
|
|
149
|
+
const unexpected = unknownParams(entry, values);
|
|
150
|
+
if (unexpected !== undefined)
|
|
151
|
+
return unexpected;
|
|
152
|
+
const argv = [];
|
|
153
|
+
for (const segment of entry.argv) {
|
|
154
|
+
if (segment.kind === 'literal') {
|
|
155
|
+
argv.push(segment.value);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const resolved = resolveParamValue(segment.name, entry.params[segment.name], values);
|
|
159
|
+
if (!resolved.ok)
|
|
160
|
+
return resolved;
|
|
161
|
+
argv.push(resolved.value);
|
|
162
|
+
}
|
|
163
|
+
return { ok: true, argv };
|
|
164
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Where the generator writes the artifact, relative to the package root. */
|
|
3
|
+
export declare const READONLY_WHITELIST_RELATIVE_PATH = "contracts/readonly-argv-whitelist.json";
|
|
4
|
+
declare const PlaceholderSpecSchema: z.ZodObject<{
|
|
5
|
+
type: z.ZodEnum<{
|
|
6
|
+
enum: "enum";
|
|
7
|
+
path: "path";
|
|
8
|
+
token: "token";
|
|
9
|
+
slug: "slug";
|
|
10
|
+
integer: "integer";
|
|
11
|
+
}>;
|
|
12
|
+
pattern: z.ZodOptional<z.ZodString>;
|
|
13
|
+
values: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
14
|
+
min: z.ZodOptional<z.ZodNumber>;
|
|
15
|
+
max: z.ZodOptional<z.ZodNumber>;
|
|
16
|
+
default: z.ZodOptional<z.ZodNumber>;
|
|
17
|
+
binding: z.ZodObject<{
|
|
18
|
+
kind: z.ZodEnum<{
|
|
19
|
+
option: "option";
|
|
20
|
+
positional: "positional";
|
|
21
|
+
}>;
|
|
22
|
+
token: z.ZodString;
|
|
23
|
+
required: z.ZodBoolean;
|
|
24
|
+
}, z.core.$strip>;
|
|
25
|
+
constraintSource: z.ZodEnum<{
|
|
26
|
+
introspected: "introspected";
|
|
27
|
+
handwritten: "handwritten";
|
|
28
|
+
}>;
|
|
29
|
+
}, z.core.$strip>;
|
|
30
|
+
declare const EntrySchema: z.ZodObject<{
|
|
31
|
+
id: z.ZodString;
|
|
32
|
+
tool: z.ZodString;
|
|
33
|
+
commandPath: z.ZodArray<z.ZodString>;
|
|
34
|
+
argv: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
35
|
+
kind: z.ZodLiteral<"literal">;
|
|
36
|
+
value: z.ZodString;
|
|
37
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
38
|
+
kind: z.ZodLiteral<"param">;
|
|
39
|
+
name: z.ZodString;
|
|
40
|
+
}, z.core.$strip>]>>;
|
|
41
|
+
params: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
42
|
+
type: z.ZodEnum<{
|
|
43
|
+
enum: "enum";
|
|
44
|
+
path: "path";
|
|
45
|
+
token: "token";
|
|
46
|
+
slug: "slug";
|
|
47
|
+
integer: "integer";
|
|
48
|
+
}>;
|
|
49
|
+
pattern: z.ZodOptional<z.ZodString>;
|
|
50
|
+
values: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
51
|
+
min: z.ZodOptional<z.ZodNumber>;
|
|
52
|
+
max: z.ZodOptional<z.ZodNumber>;
|
|
53
|
+
default: z.ZodOptional<z.ZodNumber>;
|
|
54
|
+
binding: z.ZodObject<{
|
|
55
|
+
kind: z.ZodEnum<{
|
|
56
|
+
option: "option";
|
|
57
|
+
positional: "positional";
|
|
58
|
+
}>;
|
|
59
|
+
token: z.ZodString;
|
|
60
|
+
required: z.ZodBoolean;
|
|
61
|
+
}, z.core.$strip>;
|
|
62
|
+
constraintSource: z.ZodEnum<{
|
|
63
|
+
introspected: "introspected";
|
|
64
|
+
handwritten: "handwritten";
|
|
65
|
+
}>;
|
|
66
|
+
}, z.core.$strip>>;
|
|
67
|
+
introspection: z.ZodObject<{
|
|
68
|
+
optionTokens: z.ZodArray<z.ZodString>;
|
|
69
|
+
positionalCount: z.ZodNumber;
|
|
70
|
+
}, z.core.$strip>;
|
|
71
|
+
}, z.core.$strip>;
|
|
72
|
+
declare const WhitelistSchema: z.ZodObject<{
|
|
73
|
+
schemaVersion: z.ZodLiteral<1>;
|
|
74
|
+
source: z.ZodString;
|
|
75
|
+
readOnlyDefinition: z.ZodString;
|
|
76
|
+
entries: z.ZodArray<z.ZodObject<{
|
|
77
|
+
id: z.ZodString;
|
|
78
|
+
tool: z.ZodString;
|
|
79
|
+
commandPath: z.ZodArray<z.ZodString>;
|
|
80
|
+
argv: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
|
|
81
|
+
kind: z.ZodLiteral<"literal">;
|
|
82
|
+
value: z.ZodString;
|
|
83
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
84
|
+
kind: z.ZodLiteral<"param">;
|
|
85
|
+
name: z.ZodString;
|
|
86
|
+
}, z.core.$strip>]>>;
|
|
87
|
+
params: z.ZodRecord<z.ZodString, z.ZodObject<{
|
|
88
|
+
type: z.ZodEnum<{
|
|
89
|
+
enum: "enum";
|
|
90
|
+
path: "path";
|
|
91
|
+
token: "token";
|
|
92
|
+
slug: "slug";
|
|
93
|
+
integer: "integer";
|
|
94
|
+
}>;
|
|
95
|
+
pattern: z.ZodOptional<z.ZodString>;
|
|
96
|
+
values: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
97
|
+
min: z.ZodOptional<z.ZodNumber>;
|
|
98
|
+
max: z.ZodOptional<z.ZodNumber>;
|
|
99
|
+
default: z.ZodOptional<z.ZodNumber>;
|
|
100
|
+
binding: z.ZodObject<{
|
|
101
|
+
kind: z.ZodEnum<{
|
|
102
|
+
option: "option";
|
|
103
|
+
positional: "positional";
|
|
104
|
+
}>;
|
|
105
|
+
token: z.ZodString;
|
|
106
|
+
required: z.ZodBoolean;
|
|
107
|
+
}, z.core.$strip>;
|
|
108
|
+
constraintSource: z.ZodEnum<{
|
|
109
|
+
introspected: "introspected";
|
|
110
|
+
handwritten: "handwritten";
|
|
111
|
+
}>;
|
|
112
|
+
}, z.core.$strip>>;
|
|
113
|
+
introspection: z.ZodObject<{
|
|
114
|
+
optionTokens: z.ZodArray<z.ZodString>;
|
|
115
|
+
positionalCount: z.ZodNumber;
|
|
116
|
+
}, z.core.$strip>;
|
|
117
|
+
}, z.core.$strip>>;
|
|
118
|
+
}, z.core.$strip>;
|
|
119
|
+
export type PlaceholderSpec = z.infer<typeof PlaceholderSpecSchema>;
|
|
120
|
+
export type ReadOnlyWhitelistEntry = z.infer<typeof EntrySchema>;
|
|
121
|
+
export type ReadOnlyWhitelist = z.infer<typeof WhitelistSchema>;
|
|
122
|
+
/** Absolute path of the generated artifact for a package root. */
|
|
123
|
+
export declare function resolveReadOnlyWhitelistPath(root?: string): string;
|
|
124
|
+
/** Parse + validate the artifact text. Throws a zod error when the shape drifts. */
|
|
125
|
+
export declare function parseReadOnlyWhitelist(text: string): ReadOnlyWhitelist;
|
|
126
|
+
/** Read + validate the artifact. The only supported way to obtain it. */
|
|
127
|
+
export declare function loadReadOnlyWhitelist(root?: string): ReadOnlyWhitelist;
|
|
128
|
+
/** The param names an entry expects, in argv order. */
|
|
129
|
+
export declare function paramNamesOf(entry: ReadOnlyWhitelistEntry): string[];
|
|
130
|
+
/**
|
|
131
|
+
* The tool names the surface declares, in first-appearance order.
|
|
132
|
+
*
|
|
133
|
+
* This is the pre-tool interceptor's view of "what may be called", and it is
|
|
134
|
+
* computed HERE rather than in the MCP module on purpose: the interceptor must
|
|
135
|
+
* keep working when `src/services/mcp/` is deleted (spec §1), so it cannot reach
|
|
136
|
+
* into it for the answer. Grouping the entries by their `tool` field is the whole
|
|
137
|
+
* computation, and both readers do it from the same DATA.
|
|
138
|
+
*/
|
|
139
|
+
export declare function toolIdsOf(whitelist: ReadOnlyWhitelist): string[];
|
|
140
|
+
/**
|
|
141
|
+
* Match a CONCRETE argv against the entries. A param slot consumes exactly one
|
|
142
|
+
* token, so `--apply` in a param slot still MATCHES here - refusing it is the
|
|
143
|
+
* validator's job (`argv-guard.ts`), not the matcher's. Keeping the two separate
|
|
144
|
+
* is what stops a rejected value from silently re-routing to another entry.
|
|
145
|
+
*/
|
|
146
|
+
export declare function matchReadOnlyEntry(whitelist: ReadOnlyWhitelist, argv: readonly string[]): ReadOnlyWhitelistEntry | undefined;
|
|
147
|
+
export {};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The read-only argv whitelist, as DATA.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS IS A LOADER AND NOT AN IMPORT. The generated whitelist is read by two
|
|
5
|
+
* consumers that must survive the removal of the MCP module (spec §1): the
|
|
6
|
+
* pre-tool interceptor and, later, the MCP server. If either `import`ed the
|
|
7
|
+
* generated artifact it would become a static edge between them, and deleting
|
|
8
|
+
* the MCP module would break the gate. So the artifact stays a `.json` file and
|
|
9
|
+
* every reader goes through the filesystem. `tests/unit/standards/no-mcp-source-import.test.ts`
|
|
10
|
+
* pins that no module may `import` it.
|
|
11
|
+
*
|
|
12
|
+
* The shape is `{ schemaVersion, source, readOnlyDefinition, entries[] }`. Each
|
|
13
|
+
* entry is a full argv template (flags included) plus typed placeholders - the
|
|
14
|
+
* key is the WHOLE argv, never the top-level verb, because each named command
|
|
15
|
+
* family mixes read and write subcommands.
|
|
16
|
+
*/
|
|
17
|
+
import { readFileSync } from 'node:fs';
|
|
18
|
+
import { join } from 'node:path';
|
|
19
|
+
import { z } from 'zod';
|
|
20
|
+
import { repoRoot } from 'peaks-loop-shared/paths';
|
|
21
|
+
/** Where the generator writes the artifact, relative to the package root. */
|
|
22
|
+
export const READONLY_WHITELIST_RELATIVE_PATH = 'contracts/readonly-argv-whitelist.json';
|
|
23
|
+
const PlaceholderBindingSchema = z.object({
|
|
24
|
+
/** `option` when the value is the argument of a flag, `positional` otherwise. */
|
|
25
|
+
kind: z.enum(['option', 'positional']),
|
|
26
|
+
/** The flag token (`--role`) or the positional name (`request-id`). */
|
|
27
|
+
token: z.string().min(1),
|
|
28
|
+
required: z.boolean()
|
|
29
|
+
});
|
|
30
|
+
const PlaceholderSpecSchema = z.object({
|
|
31
|
+
type: z.enum(['slug', 'enum', 'token', 'integer', 'path']),
|
|
32
|
+
pattern: z.string().min(1).optional(),
|
|
33
|
+
values: z.array(z.string().min(1)).min(1).optional(),
|
|
34
|
+
min: z.number().int().optional(),
|
|
35
|
+
max: z.number().int().optional(),
|
|
36
|
+
default: z.number().int().optional(),
|
|
37
|
+
/**
|
|
38
|
+
* Where the placeholder lives and whether the REGISTRY makes it mandatory.
|
|
39
|
+
* A placeholder present in the template is always supplied a value; this
|
|
40
|
+
* field carries the introspected fact, not the template's demand.
|
|
41
|
+
*/
|
|
42
|
+
binding: PlaceholderBindingSchema,
|
|
43
|
+
/** `introspected` when the registry supplied the constraint, else `handwritten`. */
|
|
44
|
+
constraintSource: z.enum(['introspected', 'handwritten'])
|
|
45
|
+
});
|
|
46
|
+
const ArgvSegmentSchema = z.union([
|
|
47
|
+
z.object({ kind: z.literal('literal'), value: z.string().min(1) }),
|
|
48
|
+
z.object({ kind: z.literal('param'), name: z.string().min(1) })
|
|
49
|
+
]);
|
|
50
|
+
const EntrySchema = z.object({
|
|
51
|
+
id: z.string().min(1),
|
|
52
|
+
tool: z.string().min(1),
|
|
53
|
+
commandPath: z.array(z.string().min(1)).min(1),
|
|
54
|
+
argv: z.array(ArgvSegmentSchema).min(1),
|
|
55
|
+
params: z.record(z.string(), PlaceholderSpecSchema),
|
|
56
|
+
introspection: z.object({
|
|
57
|
+
optionTokens: z.array(z.string().min(1)),
|
|
58
|
+
positionalCount: z.number().int().gte(0)
|
|
59
|
+
})
|
|
60
|
+
});
|
|
61
|
+
const WhitelistSchema = z.object({
|
|
62
|
+
schemaVersion: z.literal(1),
|
|
63
|
+
source: z.string().min(1),
|
|
64
|
+
readOnlyDefinition: z.string().min(1),
|
|
65
|
+
entries: z.array(EntrySchema).min(1)
|
|
66
|
+
});
|
|
67
|
+
/** Absolute path of the generated artifact for a package root. */
|
|
68
|
+
export function resolveReadOnlyWhitelistPath(root = repoRoot) {
|
|
69
|
+
return join(root, READONLY_WHITELIST_RELATIVE_PATH);
|
|
70
|
+
}
|
|
71
|
+
/** Parse + validate the artifact text. Throws a zod error when the shape drifts. */
|
|
72
|
+
export function parseReadOnlyWhitelist(text) {
|
|
73
|
+
return WhitelistSchema.parse(JSON.parse(text));
|
|
74
|
+
}
|
|
75
|
+
/** Read + validate the artifact. The only supported way to obtain it. */
|
|
76
|
+
export function loadReadOnlyWhitelist(root = repoRoot) {
|
|
77
|
+
return parseReadOnlyWhitelist(readFileSync(resolveReadOnlyWhitelistPath(root), 'utf8'));
|
|
78
|
+
}
|
|
79
|
+
/** The param names an entry expects, in argv order. */
|
|
80
|
+
export function paramNamesOf(entry) {
|
|
81
|
+
return entry.argv.flatMap((segment) => (segment.kind === 'param' ? [segment.name] : []));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The tool names the surface declares, in first-appearance order.
|
|
85
|
+
*
|
|
86
|
+
* This is the pre-tool interceptor's view of "what may be called", and it is
|
|
87
|
+
* computed HERE rather than in the MCP module on purpose: the interceptor must
|
|
88
|
+
* keep working when `src/services/mcp/` is deleted (spec §1), so it cannot reach
|
|
89
|
+
* into it for the answer. Grouping the entries by their `tool` field is the whole
|
|
90
|
+
* computation, and both readers do it from the same DATA.
|
|
91
|
+
*/
|
|
92
|
+
export function toolIdsOf(whitelist) {
|
|
93
|
+
return [...new Set(whitelist.entries.map((entry) => entry.tool))];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Match a CONCRETE argv against the entries. A param slot consumes exactly one
|
|
97
|
+
* token, so `--apply` in a param slot still MATCHES here - refusing it is the
|
|
98
|
+
* validator's job (`argv-guard.ts`), not the matcher's. Keeping the two separate
|
|
99
|
+
* is what stops a rejected value from silently re-routing to another entry.
|
|
100
|
+
*/
|
|
101
|
+
export function matchReadOnlyEntry(whitelist, argv) {
|
|
102
|
+
return whitelist.entries.find((entry) => {
|
|
103
|
+
if (entry.argv.length !== argv.length)
|
|
104
|
+
return false;
|
|
105
|
+
return entry.argv.every((segment, index) => segment.kind === 'literal' ? segment.value === argv[index] : true);
|
|
106
|
+
});
|
|
107
|
+
}
|