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
|
@@ -27,154 +27,84 @@
|
|
|
27
27
|
* The CLI does NOT bundle `playwright-mcp`; it shells out to
|
|
28
28
|
* `npx playwright-mcp@latest` (G22 / NG3). peaks-loop is the lifecycle
|
|
29
29
|
* orchestrator, not the install medium.
|
|
30
|
+
*
|
|
31
|
+
* The verb implementations live beside this file: `playwright-session-store.ts`
|
|
32
|
+
* (port range, terminal-id derivation, session records, spawn),
|
|
33
|
+
* `playwright-ls-stop-commands.ts` (`ls` / `stop`) and
|
|
34
|
+
* `playwright-browser-command.ts` (`peaks browser action`). Every symbol this
|
|
35
|
+
* path used to export is still exported from it, so importers are unaffected.
|
|
30
36
|
*/
|
|
31
|
-
import { createHash } from 'node:crypto';
|
|
32
|
-
import { spawn } from 'node:child_process';
|
|
33
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from 'node:fs';
|
|
34
|
-
import { join, dirname, resolve } from 'node:path';
|
|
35
37
|
import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
|
|
36
|
-
import { isUnsafePathInput } from '../../shared/path-safety.js';
|
|
37
38
|
import { getErrorMessage } from '../cli-helpers.js';
|
|
38
|
-
import {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
export
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
export function sessionFilePath(projectRoot, terminalId) {
|
|
47
|
-
// Terminal-id axis. The derived id is already sanitised (`deriveTerminalId`),
|
|
48
|
-
// but `--terminal` is caller-supplied and reaches this join unsanitised.
|
|
49
|
-
// Measured (repair cycle 1, item 1): `playwright stop --terminal ../../../../X`
|
|
50
|
-
// read a session record planted OUTSIDE the project root, sent SIGTERM to the
|
|
51
|
-
// pid it named, unlinked that file, and returned `ok: true` — arbitrary
|
|
52
|
-
// process termination plus an arbitrary file delete, one flag away. This is
|
|
53
|
-
// the join every reader/writer of a session record goes through, so this is
|
|
54
|
-
// where the invariant lives.
|
|
55
|
-
if (isUnsafePathInput(terminalId)) {
|
|
56
|
-
throw new Error(`Invalid terminal id: ${terminalId} (must be a single path segment)`);
|
|
57
|
-
}
|
|
58
|
-
return join(playwrightSessionsDir(projectRoot), `${terminalId}.json`);
|
|
59
|
-
}
|
|
60
|
-
/**
|
|
61
|
-
* Derive a stable terminal id from the process environment. Prefers
|
|
62
|
-
* the platform's own terminal-session id (macOS Terminal, Windows
|
|
63
|
-
* Terminal) and falls back to a hash of (ppid, tty).
|
|
64
|
-
*/
|
|
65
|
-
export function deriveTerminalId(env = process.env, ppid = process.ppid) {
|
|
66
|
-
const termSession = env.TERM_SESSION_ID;
|
|
67
|
-
if (termSession && termSession.length > 0) {
|
|
68
|
-
return sanitizeTerminalId(termSession);
|
|
69
|
-
}
|
|
70
|
-
const wtSession = env.WT_SESSION;
|
|
71
|
-
if (wtSession && wtSession.length > 0) {
|
|
72
|
-
return sanitizeTerminalId(`wt-${wtSession}`);
|
|
73
|
-
}
|
|
74
|
-
const tty = env.SSH_TTY ?? 'no-tty';
|
|
75
|
-
const hash = createHash('sha256').update(`${ppid}-${tty}`).digest('hex').slice(0, 16);
|
|
76
|
-
return `tty-${hash}`;
|
|
77
|
-
}
|
|
78
|
-
function sanitizeTerminalId(raw) {
|
|
79
|
-
return raw.replace(/[^a-zA-Z0-9_.-]/g, '_').slice(0, 64);
|
|
80
|
-
}
|
|
39
|
+
import { BROWSERS, DEFAULT_PORT, MAX_PORT, MAX_TCP_PORT, MIN_PORT, defaultUserDataDir, deriveTerminalId, findFreePort, readSession, resolveUserDataDir, sessionFilePath, spawnPlaywrightMcp, writeSession } from './playwright-session-store.js';
|
|
40
|
+
import { registerBrowserActionCommand } from './playwright-browser-command.js';
|
|
41
|
+
import { registerPlaywrightLsCommand, registerPlaywrightStopCommand } from './playwright-ls-stop-commands.js';
|
|
42
|
+
import { emitFailure, emitSuccess } from './playwright-envelope.js';
|
|
43
|
+
// Re-exported so the split is invisible to importers of THIS path.
|
|
44
|
+
export { DEFAULT_PORT, MAX_PORT, PLAYWRIGHT_SESSIONS_DIR, playwrightSessionsDir, sessionFilePath, deriveTerminalId, findFreePort, listSessions, readSession, writeSession, removeSession, spawnPlaywrightMcp, resolveUserDataDir } from './playwright-session-store.js';
|
|
45
|
+
export { registerBrowserActionCommand } from './playwright-browser-command.js';
|
|
81
46
|
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
47
|
+
* Report an already-running session for this terminal. True when the caller
|
|
48
|
+
* must stop: either the reuse arm returned the existing port, or the conflict
|
|
49
|
+
* arm refused. Conflict: G21 / AC18.
|
|
85
50
|
*/
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
51
|
+
function reportExistingSession(json, reuse, existing, terminalId) {
|
|
52
|
+
if (reuse) {
|
|
53
|
+
emitSuccess(json, { reused: true, session: existing }, `reusing existing playwright session on port ${existing.port} (terminal ${terminalId})`);
|
|
54
|
+
return true;
|
|
90
55
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
async function defaultPortProbe(port) {
|
|
94
|
-
return new Promise((resolveProbe) => {
|
|
95
|
-
const net = require('node:net');
|
|
96
|
-
const server = net.createServer();
|
|
97
|
-
server.once('error', () => resolveProbe(false));
|
|
98
|
-
server.once('listening', () => {
|
|
99
|
-
server.close(() => resolveProbe(true));
|
|
100
|
-
});
|
|
101
|
-
server.listen(port, '127.0.0.1');
|
|
102
|
-
});
|
|
56
|
+
emitFailure(json, `CONFLICT: another playwright MCP is already running on port ${existing.port} (terminal ${terminalId}). Reuse it (--reuse) or pick a new port (--port <n>).`, 'CONFLICT');
|
|
57
|
+
return true;
|
|
103
58
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
if (!entry.endsWith('.json'))
|
|
111
|
-
continue;
|
|
112
|
-
try {
|
|
113
|
-
const raw = readFileSync(join(dir, entry), 'utf8');
|
|
114
|
-
const session = JSON.parse(raw);
|
|
115
|
-
out.push(session);
|
|
116
|
-
}
|
|
117
|
-
catch {
|
|
118
|
-
// TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
119
|
-
// skip malformed session file
|
|
120
|
-
}
|
|
59
|
+
/** Resolve the starting port; null (+ envelope) when `--port` is out of range. */
|
|
60
|
+
function resolveStartPort(json, raw) {
|
|
61
|
+
const startPort = typeof raw === 'number' && Number.isFinite(raw) ? raw : DEFAULT_PORT;
|
|
62
|
+
if (startPort < MIN_PORT || startPort > MAX_TCP_PORT) {
|
|
63
|
+
emitFailure(json, `INVALID_PORT: --port must be between ${MIN_PORT} and ${MAX_TCP_PORT} (got ${startPort})`);
|
|
64
|
+
return null;
|
|
121
65
|
}
|
|
122
|
-
return
|
|
66
|
+
return startPort;
|
|
123
67
|
}
|
|
124
|
-
|
|
125
|
-
const path = sessionFilePath(projectRoot, terminalId);
|
|
126
|
-
if (!existsSync(path))
|
|
127
|
-
return null;
|
|
68
|
+
async function runPlaywrightStart(opts) {
|
|
128
69
|
try {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
70
|
+
const projectRoot = resolveCanonicalProjectRoot(opts.project ?? process.cwd());
|
|
71
|
+
const browser = BROWSERS.includes(opts.browser)
|
|
72
|
+
? opts.browser
|
|
73
|
+
: 'chromium';
|
|
74
|
+
const terminalId = deriveTerminalId();
|
|
75
|
+
const existing = readSession(projectRoot, terminalId);
|
|
76
|
+
if (existing && reportExistingSession(opts.json, opts.reuse, existing, terminalId))
|
|
77
|
+
return;
|
|
78
|
+
const startPort = resolveStartPort(opts.json, opts.port);
|
|
79
|
+
if (startPort === null)
|
|
80
|
+
return;
|
|
81
|
+
const port = await findFreePort(startPort, MAX_PORT);
|
|
82
|
+
if (port === null) {
|
|
83
|
+
emitFailure(opts.json, `PORT_EXHAUSTED: no free port in ${startPort}..${MAX_PORT} range`, 'PORT_EXHAUSTED');
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const userDataDir = opts.userDataDir
|
|
87
|
+
? resolveUserDataDir(opts.userDataDir, projectRoot)
|
|
88
|
+
: defaultUserDataDir(projectRoot, terminalId);
|
|
89
|
+
// Spawn the MCP via npx. Detached so it survives our exit.
|
|
90
|
+
const { pid, child } = spawnPlaywrightMcp(port, browser, userDataDir, projectRoot);
|
|
91
|
+
child.unref();
|
|
92
|
+
const session = {
|
|
93
|
+
terminalId,
|
|
94
|
+
port,
|
|
95
|
+
browser,
|
|
96
|
+
userDataDir,
|
|
97
|
+
startedAt: new Date().toISOString(),
|
|
98
|
+
...(pid !== undefined ? { pid } : {})
|
|
99
|
+
};
|
|
100
|
+
writeSession(projectRoot, session);
|
|
101
|
+
emitSuccess(opts.json, { session, sessionFile: sessionFilePath(projectRoot, terminalId) }, `playwright MCP started on port ${port} (browser=${browser}, terminal=${terminalId})`);
|
|
134
102
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
const path = sessionFilePath(projectRoot, session.terminalId);
|
|
138
|
-
const dir = dirname(path);
|
|
139
|
-
if (!existsSync(dir)) {
|
|
140
|
-
mkdirSync(dir, { recursive: true });
|
|
103
|
+
catch (error) {
|
|
104
|
+
emitFailure(opts.json, getErrorMessage(error));
|
|
141
105
|
}
|
|
142
|
-
writeFileSync(path, JSON.stringify(session, null, 2) + '\n', 'utf8');
|
|
143
|
-
}
|
|
144
|
-
export function removeSession(projectRoot, terminalId) {
|
|
145
|
-
const path = sessionFilePath(projectRoot, terminalId);
|
|
146
|
-
if (!existsSync(path))
|
|
147
|
-
return false;
|
|
148
|
-
unlinkSync(path);
|
|
149
|
-
return true;
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Spawn the playwright MCP via npx. We do NOT bundle the binary;
|
|
153
|
-
* we just orchestrate the lifecycle. Returns the child PID so the
|
|
154
|
-
* session file can record it.
|
|
155
|
-
*/
|
|
156
|
-
export function spawnPlaywrightMcp(port, browser, userDataDir, projectRoot) {
|
|
157
|
-
const child = spawn('npx', [
|
|
158
|
-
'playwright-mcp@latest',
|
|
159
|
-
`--port=${port}`,
|
|
160
|
-
`--browser=${browser}`,
|
|
161
|
-
`--user-data-dir=${userDataDir}`
|
|
162
|
-
], {
|
|
163
|
-
cwd: projectRoot,
|
|
164
|
-
env: process.env,
|
|
165
|
-
stdio: 'ignore',
|
|
166
|
-
detached: true,
|
|
167
|
-
windowsHide: true
|
|
168
|
-
});
|
|
169
|
-
return { pid: child.pid, child };
|
|
170
106
|
}
|
|
171
|
-
|
|
172
|
-
const playwright = program
|
|
173
|
-
.command('playwright')
|
|
174
|
-
.description('Multi-terminal Playwright MCP lifecycle. `peaks playwright start` allocates a unique port ' +
|
|
175
|
-
'(8931→8949) and writes a session file; `ls` lists running sessions; `stop` tears them down. ' +
|
|
176
|
-
'Does NOT bundle the playwright-mcp binary (uses `npx playwright-mcp@latest`). ' +
|
|
177
|
-
'(slice 2.5.0 sub-fix C)');
|
|
107
|
+
function registerPlaywrightStartCommand(playwright) {
|
|
178
108
|
playwright
|
|
179
109
|
.command('start')
|
|
180
110
|
.description('Start a Playwright MCP server on a free port; write a session record.')
|
|
@@ -184,273 +114,20 @@ export function registerPlaywrightCommands(program, _io) {
|
|
|
184
114
|
.option('--reuse', 'if a session is already running for this terminal, return its port instead of erroring')
|
|
185
115
|
.option('--project <path>', 'project root (defaults to current directory)', process.cwd())
|
|
186
116
|
.option('--json', 'emit a JSON envelope { ok, data } to stdout')
|
|
187
|
-
.action(
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
process.stdout.write(JSON.stringify({
|
|
200
|
-
ok: true,
|
|
201
|
-
data: { reused: true, session: existing }
|
|
202
|
-
}) + '\n');
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
process.stdout.write(`reusing existing playwright session on port ${existing.port} (terminal ${terminalId})\n`);
|
|
206
|
-
}
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
// Conflict: G21 / AC18
|
|
210
|
-
const msg = `CONFLICT: another playwright MCP is already running on port ${existing.port} (terminal ${terminalId}). Reuse it (--reuse) or pick a new port (--port <n>).`;
|
|
211
|
-
if (opts.json === true) {
|
|
212
|
-
process.stdout.write(JSON.stringify({ ok: false, error: msg, code: 'CONFLICT' }) + '\n');
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
process.stderr.write(msg + '\n');
|
|
216
|
-
}
|
|
217
|
-
process.exitCode = 1;
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
// Port allocation
|
|
221
|
-
const startPort = typeof opts.port === 'number' && Number.isFinite(opts.port) ? opts.port : DEFAULT_PORT;
|
|
222
|
-
if (startPort < 1024 || startPort > 65535) {
|
|
223
|
-
const msg = `INVALID_PORT: --port must be between 1024 and 65535 (got ${startPort})`;
|
|
224
|
-
if (opts.json === true) {
|
|
225
|
-
process.stdout.write(JSON.stringify({ ok: false, error: msg }) + '\n');
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
process.stderr.write(msg + '\n');
|
|
229
|
-
}
|
|
230
|
-
process.exitCode = 1;
|
|
231
|
-
return;
|
|
232
|
-
}
|
|
233
|
-
const port = await findFreePort(startPort, MAX_PORT);
|
|
234
|
-
if (port === null) {
|
|
235
|
-
const msg = `PORT_EXHAUSTED: no free port in ${startPort}..${MAX_PORT} range`;
|
|
236
|
-
if (opts.json === true) {
|
|
237
|
-
process.stdout.write(JSON.stringify({ ok: false, error: msg, code: 'PORT_EXHAUSTED' }) + '\n');
|
|
238
|
-
}
|
|
239
|
-
else {
|
|
240
|
-
process.stderr.write(msg + '\n');
|
|
241
|
-
}
|
|
242
|
-
process.exitCode = 1;
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
// userDataDir default
|
|
246
|
-
const userDataDir = opts.userDataDir
|
|
247
|
-
? resolveUserDataDir(opts.userDataDir, projectRoot)
|
|
248
|
-
: join(projectRoot, '.peaks', '_runtime', 'playwright-userdata', terminalId);
|
|
249
|
-
// Spawn the MCP via npx. Detached so it survives our exit.
|
|
250
|
-
const { pid, child } = spawnPlaywrightMcp(port, browser, userDataDir, projectRoot);
|
|
251
|
-
// Detach: do not wait for it.
|
|
252
|
-
child.unref();
|
|
253
|
-
const session = {
|
|
254
|
-
terminalId,
|
|
255
|
-
port,
|
|
256
|
-
browser,
|
|
257
|
-
userDataDir,
|
|
258
|
-
startedAt: new Date().toISOString(),
|
|
259
|
-
...(pid !== undefined ? { pid } : {})
|
|
260
|
-
};
|
|
261
|
-
writeSession(projectRoot, session);
|
|
262
|
-
if (opts.json === true) {
|
|
263
|
-
process.stdout.write(JSON.stringify({
|
|
264
|
-
ok: true,
|
|
265
|
-
data: { session, sessionFile: sessionFilePath(projectRoot, terminalId) }
|
|
266
|
-
}) + '\n');
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
process.stdout.write(`playwright MCP started on port ${port} (browser=${browser}, terminal=${terminalId})\n`);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
catch (error) {
|
|
273
|
-
if (opts.json === true) {
|
|
274
|
-
process.stdout.write(JSON.stringify({ ok: false, error: getErrorMessage(error) }) + '\n');
|
|
275
|
-
}
|
|
276
|
-
else {
|
|
277
|
-
process.stderr.write(getErrorMessage(error) + '\n');
|
|
278
|
-
}
|
|
279
|
-
process.exitCode = 1;
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
playwright
|
|
283
|
-
.command('ls')
|
|
284
|
-
.description('List running Playwright MCP sessions from .peaks/_runtime/playwright-sessions/*.json')
|
|
285
|
-
.option('--project <path>', 'project root (defaults to current directory)', process.cwd())
|
|
286
|
-
.option('--json', 'emit a JSON envelope { ok, data: { sessions } }')
|
|
287
|
-
.action((opts) => {
|
|
288
|
-
try {
|
|
289
|
-
const projectRoot = resolveCanonicalProjectRoot(opts.project ?? process.cwd());
|
|
290
|
-
const sessions = listSessions(projectRoot);
|
|
291
|
-
if (opts.json === true) {
|
|
292
|
-
process.stdout.write(JSON.stringify({ ok: true, data: { sessions } }) + '\n');
|
|
293
|
-
}
|
|
294
|
-
else if (sessions.length === 0) {
|
|
295
|
-
process.stdout.write('no playwright sessions running\n');
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
298
|
-
for (const s of sessions) {
|
|
299
|
-
process.stdout.write(`port=${s.port}\tbrowser=${s.browser}\tterminal=${s.terminalId}\tpid=${s.pid ?? '?'}\tstarted=${s.startedAt}\n`);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
catch (error) {
|
|
304
|
-
if (opts.json === true) {
|
|
305
|
-
process.stdout.write(JSON.stringify({ ok: false, error: getErrorMessage(error) }) + '\n');
|
|
306
|
-
}
|
|
307
|
-
else {
|
|
308
|
-
process.stderr.write(getErrorMessage(error) + '\n');
|
|
309
|
-
}
|
|
310
|
-
process.exitCode = 1;
|
|
311
|
-
}
|
|
312
|
-
});
|
|
313
|
-
playwright
|
|
314
|
-
.command('stop')
|
|
315
|
-
.description('Stop a running Playwright MCP session (best-effort kill + remove session file).')
|
|
316
|
-
.option('--terminal <id>', "terminal id to stop (default: this shell's derived terminal id)")
|
|
317
|
-
.option('--project <path>', 'project root (defaults to current directory)', process.cwd())
|
|
318
|
-
.option('--json', 'emit a JSON envelope { ok, data }')
|
|
319
|
-
.action((opts) => {
|
|
320
|
-
try {
|
|
321
|
-
const projectRoot = resolveCanonicalProjectRoot(opts.project ?? process.cwd());
|
|
322
|
-
const terminalId = opts.terminal ?? deriveTerminalId();
|
|
323
|
-
const session = readSession(projectRoot, terminalId);
|
|
324
|
-
if (!session) {
|
|
325
|
-
const msg = `NO_SESSION: no playwright session for terminal ${terminalId}`;
|
|
326
|
-
if (opts.json === true) {
|
|
327
|
-
process.stdout.write(JSON.stringify({ ok: false, error: msg }) + '\n');
|
|
328
|
-
}
|
|
329
|
-
else {
|
|
330
|
-
process.stderr.write(msg + '\n');
|
|
331
|
-
}
|
|
332
|
-
process.exitCode = 1;
|
|
333
|
-
return;
|
|
334
|
-
}
|
|
335
|
-
// Best-effort kill
|
|
336
|
-
if (session.pid !== undefined && session.pid !== null) {
|
|
337
|
-
try {
|
|
338
|
-
process.kill(session.pid, 'SIGTERM');
|
|
339
|
-
}
|
|
340
|
-
catch {
|
|
341
|
-
// TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
342
|
-
/* process may have already exited */
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
removeSession(projectRoot, terminalId);
|
|
346
|
-
if (opts.json === true) {
|
|
347
|
-
process.stdout.write(JSON.stringify({ ok: true, data: { stopped: session } }) + '\n');
|
|
348
|
-
}
|
|
349
|
-
else {
|
|
350
|
-
process.stdout.write(`stopped playwright session on port ${session.port} (terminal ${terminalId})\n`);
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
catch (error) {
|
|
354
|
-
if (opts.json === true) {
|
|
355
|
-
process.stdout.write(JSON.stringify({ ok: false, error: getErrorMessage(error) }) + '\n');
|
|
356
|
-
}
|
|
357
|
-
else {
|
|
358
|
-
process.stderr.write(getErrorMessage(error) + '\n');
|
|
359
|
-
}
|
|
360
|
-
process.exitCode = 1;
|
|
361
|
-
}
|
|
362
|
-
});
|
|
117
|
+
.action((opts) => runPlaywrightStart(opts));
|
|
118
|
+
}
|
|
119
|
+
export function registerPlaywrightCommands(program, io) {
|
|
120
|
+
const playwright = program
|
|
121
|
+
.command('playwright')
|
|
122
|
+
.description('Multi-terminal Playwright MCP lifecycle. `peaks playwright start` allocates a unique port ' +
|
|
123
|
+
'(8931→8949) and writes a session file; `ls` lists running sessions; `stop` tears them down. ' +
|
|
124
|
+
'Does NOT bundle the playwright-mcp binary (uses `npx playwright-mcp@latest`). ' +
|
|
125
|
+
'(slice 2.5.0 sub-fix C)');
|
|
126
|
+
registerPlaywrightStartCommand(playwright);
|
|
127
|
+
registerPlaywrightLsCommand(playwright, io);
|
|
128
|
+
registerPlaywrightStopCommand(playwright, io);
|
|
363
129
|
// Slice 3: `peaks browser action <intent> [args...]` — thin wrapper
|
|
364
130
|
// around 5 Playwright MCP intents. One MCP call per invocation; no
|
|
365
131
|
// auto-snapshot between intents. See src/services/qa/browser-wrapper-service.ts.
|
|
366
132
|
registerBrowserActionCommand(program);
|
|
367
133
|
}
|
|
368
|
-
/**
|
|
369
|
-
* Wire `peaks browser action <intent>`. The wrapper is a thin adapter
|
|
370
|
-
* for the 5 intents. The real MCP caller is provided by the IDE / agent
|
|
371
|
-
* harness — this CLI surface is invoked by tests and skills to drive
|
|
372
|
-
* browser flows without hand-shelling the MCP protocol.
|
|
373
|
-
*/
|
|
374
|
-
export function registerBrowserActionCommand(program) {
|
|
375
|
-
const browser = program
|
|
376
|
-
.command('browser')
|
|
377
|
-
.description('Browser action helpers (slice 3: thin Playwright MCP wrapper, 5 intents only)');
|
|
378
|
-
browser
|
|
379
|
-
.command('action')
|
|
380
|
-
.description('Run one of 5 browser intents: navigate, click, fill, snapshot, extract')
|
|
381
|
-
.argument('<intent>', 'one of: navigate, click, fill, snapshot, extract')
|
|
382
|
-
.option('--url <url>', 'URL (navigate)')
|
|
383
|
-
.option('--selector <selector>', 'simple selector: #id, .class, tag, tag#id, tag.class')
|
|
384
|
-
.option('--value <value>', 'value to fill')
|
|
385
|
-
.option('--expression <expr>', 'JS expression to evaluate (extract)')
|
|
386
|
-
.option('--json', 'emit JSON envelope')
|
|
387
|
-
.action(async (intent, opts) => {
|
|
388
|
-
try {
|
|
389
|
-
if (!isSupportedIntent(intent)) {
|
|
390
|
-
throw new Error(`unknown intent "${intent}" — fall back to raw MCP (supported: navigate, click, fill, snapshot, extract)`);
|
|
391
|
-
}
|
|
392
|
-
// The IDE/agent harness bridges `mcp__playwright__browser_*` tools.
|
|
393
|
-
// Outside the harness, we use a pass-through caller that records
|
|
394
|
-
// the intent + args so skills and tests can route the call.
|
|
395
|
-
const result = await runBrowserAction(intent, {
|
|
396
|
-
url: opts.url,
|
|
397
|
-
selector: opts.selector,
|
|
398
|
-
value: opts.value,
|
|
399
|
-
expression: opts.expression
|
|
400
|
-
}, mockOrPassThroughCaller);
|
|
401
|
-
if (opts.json === true) {
|
|
402
|
-
process.stdout.write(JSON.stringify({ ok: true, data: result }) + '\n');
|
|
403
|
-
}
|
|
404
|
-
else {
|
|
405
|
-
process.stdout.write(`intent=${result.intent} ok=${result.ok} elapsedMs=${result.elapsedMs}\n`);
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
catch (error) {
|
|
409
|
-
if (opts.json === true) {
|
|
410
|
-
process.stdout.write(JSON.stringify({ ok: false, error: getErrorMessage(error) }) + '\n');
|
|
411
|
-
}
|
|
412
|
-
else {
|
|
413
|
-
process.stderr.write(getErrorMessage(error) + '\n');
|
|
414
|
-
}
|
|
415
|
-
process.exitCode = 1;
|
|
416
|
-
}
|
|
417
|
-
});
|
|
418
|
-
}
|
|
419
|
-
function isSupportedIntent(value) {
|
|
420
|
-
return (value === 'navigate' ||
|
|
421
|
-
value === 'click' ||
|
|
422
|
-
value === 'fill' ||
|
|
423
|
-
value === 'snapshot' ||
|
|
424
|
-
value === 'extract');
|
|
425
|
-
}
|
|
426
|
-
/**
|
|
427
|
-
* Resolve and validate a caller-supplied `--user-data-dir`. The dir must
|
|
428
|
-
* live under `projectRoot` so a malicious `--user-data-dir /etc/foo`
|
|
429
|
-
* cannot coerce the playwright-mcp browser into writing state to an
|
|
430
|
-
*
|
|
431
|
-
* Resolves `..` segments before checking, so a path like
|
|
432
|
-
* `<projectRoot>/../escape` is correctly normalized and rejected.
|
|
433
|
-
*
|
|
434
|
-
* Throws `Error('INVALID_USER_DATA_DIR: ...')` on validation failure;
|
|
435
|
-
* the action handler catches and emits the JSON envelope.
|
|
436
|
-
*/
|
|
437
|
-
export function resolveUserDataDir(raw, projectRoot) {
|
|
438
|
-
const resolved = resolve(projectRoot, raw);
|
|
439
|
-
const rootResolved = resolve(projectRoot) + (projectRoot.endsWith('/') || projectRoot.endsWith('\\') ? '' : '/');
|
|
440
|
-
// Use the projectRoot + sep as the prefix; require either an exact
|
|
441
|
-
// match or a child path. The `+ '/'` guard prevents sibling-prefix
|
|
442
|
-
// collisions (e.g. /home/A/proj2 passes the check for /home/A/proj).
|
|
443
|
-
if (resolved !== resolve(projectRoot) && !resolved.startsWith(rootResolved)) {
|
|
444
|
-
throw new Error(`INVALID_USER_DATA_DIR: --user-data-dir must resolve to a path under project root ${projectRoot} (got ${resolved})`);
|
|
445
|
-
}
|
|
446
|
-
return resolved;
|
|
447
|
-
}
|
|
448
|
-
/**
|
|
449
|
-
* Pass-through caller used when the CLI surface is invoked outside the
|
|
450
|
-
* harness. In production the IDE/agent harness intercepts the wrapper's
|
|
451
|
-
* output and routes the underlying MCP call. Tests inject a stub via
|
|
452
|
-
* the `runBrowserAction(..., caller)` overload.
|
|
453
|
-
*/
|
|
454
|
-
async function mockOrPassThroughCaller(tool, args) {
|
|
455
|
-
return { tool, args, routedBy: 'peaks-loop-browser-wrapper' };
|
|
456
|
-
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** `{ ok: true, data }` on `--json`, the human line otherwise. */
|
|
2
|
+
export declare function emitSuccess(json: boolean | undefined, data: unknown, text: string): void;
|
|
3
|
+
/**
|
|
4
|
+
* `{ ok: false, error, code? }` on `--json`, the message on stderr otherwise.
|
|
5
|
+
* Always marks the run failed — every call site in the playwright verbs is a
|
|
6
|
+
* failure path.
|
|
7
|
+
*/
|
|
8
|
+
export declare function emitFailure(json: boolean | undefined, message: string, code?: string): void;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// src/cli/commands/playwright-envelope.ts
|
|
2
|
+
//
|
|
3
|
+
// The two envelope writers every `peaks playwright` action handler shares.
|
|
4
|
+
// Split out of `playwright-commands.ts` so the extracted verb modules emit
|
|
5
|
+
// byte-identical envelopes without repeating the branch.
|
|
6
|
+
/** `{ ok: true, data }` on `--json`, the human line otherwise. */
|
|
7
|
+
export function emitSuccess(json, data, text) {
|
|
8
|
+
if (json === true) {
|
|
9
|
+
process.stdout.write(JSON.stringify({ ok: true, data }) + '\n');
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
process.stdout.write(text + '\n');
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* `{ ok: false, error, code? }` on `--json`, the message on stderr otherwise.
|
|
17
|
+
* Always marks the run failed — every call site in the playwright verbs is a
|
|
18
|
+
* failure path.
|
|
19
|
+
*/
|
|
20
|
+
export function emitFailure(json, message, code) {
|
|
21
|
+
if (json === true) {
|
|
22
|
+
const payload = code === undefined ? { ok: false, error: message } : { ok: false, error: message, code };
|
|
23
|
+
process.stdout.write(JSON.stringify(payload) + '\n');
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
process.stderr.write(message + '\n');
|
|
27
|
+
}
|
|
28
|
+
process.exitCode = 1;
|
|
29
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import { type ProgramIO } from '../cli-helpers.js';
|
|
3
|
+
export declare function registerPlaywrightLsCommand(playwright: Command, io: ProgramIO): void;
|
|
4
|
+
export declare function registerPlaywrightStopCommand(playwright: Command, io: ProgramIO): void;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// src/cli/commands/playwright-ls-stop-commands.ts
|
|
2
|
+
//
|
|
3
|
+
// `peaks playwright ls` and `peaks playwright stop`. Split out of
|
|
4
|
+
// `playwright-commands.ts`; the registered names, descriptions, options and
|
|
5
|
+
// envelopes are unchanged.
|
|
6
|
+
import { resolveCanonicalProjectRoot } from '../../services/config/config-service.js';
|
|
7
|
+
import { getErrorMessage } from '../cli-helpers.js';
|
|
8
|
+
import { deriveTerminalId, listSessions, readSession, removeSession } from './playwright-session-store.js';
|
|
9
|
+
import { emitFailure, emitSuccess } from './playwright-envelope.js';
|
|
10
|
+
export function registerPlaywrightLsCommand(playwright, io) {
|
|
11
|
+
// These two verbs write straight to the process streams — a caller-supplied
|
|
12
|
+
// `io` must not intercept a session listing. `io` stays in the signature for
|
|
13
|
+
// the two-argument registrar contract `_register.ts` selects on.
|
|
14
|
+
void io;
|
|
15
|
+
playwright
|
|
16
|
+
.command('ls')
|
|
17
|
+
.description('List running Playwright MCP sessions from .peaks/_runtime/playwright-sessions/*.json')
|
|
18
|
+
.option('--project <path>', 'project root (defaults to current directory)', process.cwd())
|
|
19
|
+
.option('--json', 'emit a JSON envelope { ok, data: { sessions } }')
|
|
20
|
+
.action((opts) => {
|
|
21
|
+
try {
|
|
22
|
+
const projectRoot = resolveCanonicalProjectRoot(opts.project ?? process.cwd());
|
|
23
|
+
const sessions = listSessions(projectRoot);
|
|
24
|
+
if (opts.json === true) {
|
|
25
|
+
process.stdout.write(JSON.stringify({ ok: true, data: { sessions } }) + '\n');
|
|
26
|
+
}
|
|
27
|
+
else if (sessions.length === 0) {
|
|
28
|
+
process.stdout.write('no playwright sessions running\n');
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
for (const s of sessions) {
|
|
32
|
+
process.stdout.write(`port=${s.port}\tbrowser=${s.browser}\tterminal=${s.terminalId}\tpid=${s.pid ?? '?'}\tstarted=${s.startedAt}\n`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
emitFailure(opts.json, getErrorMessage(error));
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export function registerPlaywrightStopCommand(playwright, io) {
|
|
42
|
+
void io;
|
|
43
|
+
playwright
|
|
44
|
+
.command('stop')
|
|
45
|
+
.description('Stop a running Playwright MCP session (best-effort kill + remove session file).')
|
|
46
|
+
.option('--terminal <id>', "terminal id to stop (default: this shell's derived terminal id)")
|
|
47
|
+
.option('--project <path>', 'project root (defaults to current directory)', process.cwd())
|
|
48
|
+
.option('--json', 'emit a JSON envelope { ok, data }')
|
|
49
|
+
.action((opts) => {
|
|
50
|
+
try {
|
|
51
|
+
const projectRoot = resolveCanonicalProjectRoot(opts.project ?? process.cwd());
|
|
52
|
+
const terminalId = opts.terminal ?? deriveTerminalId();
|
|
53
|
+
const session = readSession(projectRoot, terminalId);
|
|
54
|
+
if (!session) {
|
|
55
|
+
emitFailure(opts.json, `NO_SESSION: no playwright session for terminal ${terminalId}`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (session.pid !== undefined && session.pid !== null) {
|
|
59
|
+
try {
|
|
60
|
+
process.kill(session.pid, 'SIGTERM');
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
64
|
+
/* process may have already exited */
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
removeSession(projectRoot, terminalId);
|
|
68
|
+
emitSuccess(opts.json, { stopped: session }, `stopped playwright session on port ${session.port} (terminal ${terminalId})`);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
emitFailure(opts.json, getErrorMessage(error));
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|