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
|
@@ -1,324 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* `peaks qa run` — the peaks-qa slice surface, and `peaks qa archive-screenshots`
|
|
3
|
+
* — the Contract 1 remediation. The verbs live beside this file:
|
|
2
4
|
*
|
|
3
|
-
*
|
|
5
|
+
* `qa-run-command.ts` the slice action (I/O + envelope)
|
|
6
|
+
* `qa-run-slice.ts` the pure gate list it drives
|
|
7
|
+
* `qa-run-options.ts` the `--no-X` flag contract
|
|
8
|
+
* `qa-context-prestep.ts` Plan 1 / Task 9 context build
|
|
9
|
+
* `qa-archive-screenshots-command.ts` the stray-screenshot sweep
|
|
4
10
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* specifically is what the restart-loop detector guards. The
|
|
8
|
-
* detector is wired into the slice here:
|
|
9
|
-
*
|
|
10
|
-
* 1. We construct a `BrowserRestartDetector` (configurable via
|
|
11
|
-
* `--max-browser-restarts` / `--no-restart-detector`).
|
|
12
|
-
* 2. We construct a `BrowserEventLogger` that writes the
|
|
13
|
-
* per-slice JSONL log to
|
|
14
|
-
* `.peaks/_runtime/<session-id>/qa/browser-events.jsonl`.
|
|
15
|
-
* 3. The slice entry exposes `runQaSlice` so tests can
|
|
16
|
-
* feed a synthetic event log and assert the diagnostic.
|
|
17
|
-
*
|
|
18
|
-
* CLI surface (PRD G5 + AC4/AC5/AC6):
|
|
19
|
-
* peaks qa run --project <X> [--no-browser] [--max-browser-restarts N]
|
|
20
|
-
* [--no-restart-detector] [--session-id <sid>] [--json]
|
|
21
|
-
*
|
|
22
|
-
* `--no-browser` (G5) skips the browser E2E gate entirely. The
|
|
23
|
-
* resulting gate list marks the browser gate as `status: skipped`
|
|
24
|
-
* with reason `--no-browser`. This is a slice-level opt-out for
|
|
25
|
-
* backend-only or already-covered-by-unit-tests work.
|
|
26
|
-
*/
|
|
27
|
-
import { join, resolve } from 'node:path';
|
|
28
|
-
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
29
|
-
import { fail, ok } from 'peaks-loop-shared/result';
|
|
30
|
-
import { archiveScreenshots } from '../../services/qa/screenshot-archive-service.js';
|
|
31
|
-
import { isUnsafePathInput } from '../../shared/path-safety.js';
|
|
32
|
-
import { getSessionId } from '../../services/session/session-manager.js';
|
|
33
|
-
import { BrowserRestartDetector } from '../../services/qa/browser-restart-detector.js';
|
|
34
|
-
import { BrowserEventLogger } from '../../services/qa/browser-event-logger.js';
|
|
35
|
-
import { BROWSER_REUSE_HINT } from '../../services/qa/browser-reuse-hint.js';
|
|
36
|
-
// Plan 1 / Task 9 — auto-build peaks-context before peaks-qa runs.
|
|
37
|
-
import { buildContext } from '../../services/context/context-builder.js';
|
|
38
|
-
// Plan 1 / Task 10 — production fetcher (replaces mockFetcher).
|
|
39
|
-
import { createDocCacheFetcher } from '../../services/context/doc-cache-fetcher.js';
|
|
40
|
-
// Plan 2 / Task 8 — consume MUT.sig from peaks-mut into verdict envelope.
|
|
41
|
-
import { loadMutReport, mutReportPath } from 'peaks-loop-mut';
|
|
42
|
-
function buildDocFetcher(sid) {
|
|
43
|
-
return createDocCacheFetcher({
|
|
44
|
-
cacheDir: `.peaks/_runtime/${sid}/doc-cache`
|
|
45
|
-
// remoteFetcher wired in a future slice.
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
async function ensureContextForQa(goal, project, sid) {
|
|
49
|
-
const out = `.peaks/_runtime/${sid}/context.json`;
|
|
50
|
-
try {
|
|
51
|
-
await buildContext({
|
|
52
|
-
goal,
|
|
53
|
-
project,
|
|
54
|
-
audience: 'peaks-qa',
|
|
55
|
-
depsMode: 'locked',
|
|
56
|
-
docBudgetTokens: 8000,
|
|
57
|
-
out,
|
|
58
|
-
fetcher: buildDocFetcher(sid)
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
catch (error) {
|
|
62
|
-
// Plan 1 / Task 9 — context is a pre-step, not a precondition.
|
|
63
|
-
// Task 11 will upgrade this to a hard precondition once the qa
|
|
64
|
-
// slice actually consumes context.json.
|
|
65
|
-
const message = error instanceof Error ? error.message : 'unknown context build failure';
|
|
66
|
-
process.stderr.write(`[peaks-context] qa pre-step skipped: ${message}\n`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
export const DEFAULT_MAX_BROWSER_RESTARTS = 3;
|
|
70
|
-
export function runQaSlice(input) {
|
|
71
|
-
// Sid axis: this is the join for `qa/browser-events.jsonl`. The `qa gate run`
|
|
72
|
-
// action guards before calling in, but the function is exported for tests and
|
|
73
|
-
// states its own contract at the join.
|
|
74
|
-
if (isUnsafePathInput(input.sessionId)) {
|
|
75
|
-
throw new Error(`Invalid session id: ${input.sessionId} (must be a single path segment)`);
|
|
76
|
-
}
|
|
77
|
-
const detector = new BrowserRestartDetector({
|
|
78
|
-
maxRestarts: input.maxRestarts,
|
|
79
|
-
enabled: input.detectorEnabled
|
|
80
|
-
});
|
|
81
|
-
const logPath = join(input.project, '.peaks', '_runtime', input.sessionId, 'qa', 'browser-events.jsonl');
|
|
82
|
-
const logger = new BrowserEventLogger({ filePath: logPath });
|
|
83
|
-
let pendingCloseTs = null;
|
|
84
|
-
// PRD AC4 + P1: when browser E2E is off, the detector must NOT
|
|
85
|
-
// record events at all (otherwise a user passing both
|
|
86
|
-
// --no-browser AND a hot detector would see spurious
|
|
87
|
-
// detectorTriggered=true and exit code 2).
|
|
88
|
-
if (input.browserEnabled) {
|
|
89
|
-
for (const ev of input.events) {
|
|
90
|
-
detector.record(ev);
|
|
91
|
-
if (ev.tool === 'browser_close') {
|
|
92
|
-
pendingCloseTs = ev.ts;
|
|
93
|
-
}
|
|
94
|
-
else if (ev.tool === 'browser_navigate' && pendingCloseTs !== null) {
|
|
95
|
-
const closeMs = Date.parse(pendingCloseTs);
|
|
96
|
-
const navMs = Date.parse(ev.ts);
|
|
97
|
-
logger.append({
|
|
98
|
-
kind: 'spurious_restart',
|
|
99
|
-
ts: ev.ts,
|
|
100
|
-
sessionId: input.sessionId,
|
|
101
|
-
closeTs: pendingCloseTs,
|
|
102
|
-
navigateTs: ev.ts,
|
|
103
|
-
deltaMs: navMs - closeMs
|
|
104
|
-
});
|
|
105
|
-
pendingCloseTs = null;
|
|
106
|
-
}
|
|
107
|
-
else if (ev.tool === 'browser_navigate') {
|
|
108
|
-
pendingCloseTs = null;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
const browserGate = input.browserEnabled
|
|
113
|
-
? detector.shouldHalt()
|
|
114
|
-
? { name: 'browser-e2e', status: 'failed', reason: detector.diagnostic() }
|
|
115
|
-
: { name: 'browser-e2e', status: 'passed' }
|
|
116
|
-
: { name: 'browser-e2e', status: 'skipped', reason: '--no-browser' };
|
|
117
|
-
// Plan 2 / Task 8 — MUT.sig gate.
|
|
118
|
-
// Gate semantics (per spec lines 1292-1341):
|
|
119
|
-
// - `skipped` when peaks-mut was not run (no report) OR --no-mutation
|
|
120
|
-
// - `passed` when the report's `thresholds.passed` is true
|
|
121
|
-
// - `failed` when the report's `thresholds.passed` is false
|
|
122
|
-
// "Skipped" is NOT a failure — the gate is a no-op so existing
|
|
123
|
-
// sessions that have not yet adopted peaks-mut keep passing.
|
|
124
|
-
const mutationGate = !input.mutationEnabled
|
|
125
|
-
? { name: 'mutation', status: 'skipped', reason: '--no-mutation' }
|
|
126
|
-
: input.mutationReport === null
|
|
127
|
-
? { name: 'mutation', status: 'skipped', reason: 'peaks mut not run' }
|
|
128
|
-
: input.mutationReport.thresholds.passed
|
|
129
|
-
? {
|
|
130
|
-
name: 'mutation',
|
|
131
|
-
status: 'passed',
|
|
132
|
-
mutSig: input.mutationReport.sha256
|
|
133
|
-
}
|
|
134
|
-
: {
|
|
135
|
-
name: 'mutation',
|
|
136
|
-
status: 'failed',
|
|
137
|
-
reason: deriveMutationFailureReason(input.mutationReport),
|
|
138
|
-
mutSig: input.mutationReport.sha256
|
|
139
|
-
};
|
|
140
|
-
const gates = [
|
|
141
|
-
{ name: 'functional', status: 'passed' },
|
|
142
|
-
{ name: 'security', status: 'passed' },
|
|
143
|
-
browserGate,
|
|
144
|
-
mutationGate
|
|
145
|
-
];
|
|
146
|
-
return {
|
|
147
|
-
sessionId: input.sessionId,
|
|
148
|
-
project: input.project,
|
|
149
|
-
browserEnabled: input.browserEnabled,
|
|
150
|
-
gates,
|
|
151
|
-
detectorTriggered: detector.shouldHalt(),
|
|
152
|
-
...(detector.shouldHalt() ? { diagnostic: detector.diagnostic() } : {}),
|
|
153
|
-
subAgentPromptHint: BROWSER_REUSE_HINT,
|
|
154
|
-
// Surface MUT.sig ONLY when the gate is actually evaluated
|
|
155
|
-
// (mutation enabled AND a report was loaded). --no-mutation or
|
|
156
|
-
// missing report -> undefined, so downstream consumers cannot
|
|
157
|
-
// mistake a skipped gate for a chain-trail anchor.
|
|
158
|
-
...(input.mutationEnabled && input.mutationReport !== null
|
|
159
|
-
? { mutSig: input.mutationReport.sha256 }
|
|
160
|
-
: {})
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* Plan 2 / Task 8 — pure helper that explains WHY the mutation gate
|
|
165
|
-
* failed. Used only when the report's `thresholds.passed` is false.
|
|
166
|
-
* Reads the threshold block from the report itself (already
|
|
167
|
-
* CLI-computed by `buildMutReport`) so the message matches what
|
|
168
|
-
* peaks-mut's CLI surface prints.
|
|
11
|
+
* This module owns only the `qa` parent (hidden) and the registrar order, and
|
|
12
|
+
* re-exports every symbol it used to define so existing importers need no edit.
|
|
169
13
|
*/
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
const fragments = [];
|
|
173
|
-
if (report.mutation.killRate < t.mutationKillRateMin) {
|
|
174
|
-
fragments.push(`mutation kill rate ${report.mutation.killRate.toFixed(2)} < ${t.mutationKillRateMin.toFixed(2)}`);
|
|
175
|
-
}
|
|
176
|
-
if (report.assertions.weakRate > t.weakAssertionRateMax) {
|
|
177
|
-
fragments.push(`weak assertion rate ${report.assertions.weakRate.toFixed(2)} > ${t.weakAssertionRateMax.toFixed(2)}`);
|
|
178
|
-
}
|
|
179
|
-
if (fragments.length === 0) {
|
|
180
|
-
return `mutation thresholds failed (MUT.sig=${report.sha256})`;
|
|
181
|
-
}
|
|
182
|
-
return `${fragments.join('; ')} (MUT.sig=${report.sha256})`;
|
|
183
|
-
}
|
|
184
|
-
function resolveMaxRestarts(raw) {
|
|
185
|
-
if (raw === undefined)
|
|
186
|
-
return DEFAULT_MAX_BROWSER_RESTARTS;
|
|
187
|
-
const n = Number.parseInt(raw, 10);
|
|
188
|
-
if (Number.isNaN(n) || n < 1) {
|
|
189
|
-
return DEFAULT_MAX_BROWSER_RESTARTS;
|
|
190
|
-
}
|
|
191
|
-
return n;
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* Commander 12.x sets `options.X = false` for `--no-X` (POSITIVE form),
|
|
195
|
-
* not `options.noX = true`. Reads use the positive form; the default is
|
|
196
|
-
* `true` and the boolean form is `false` only when the user passes `--no-X`.
|
|
197
|
-
*
|
|
198
|
-
* Exported for unit testing the parser contract in isolation from
|
|
199
|
-
* the rest of the action handler.
|
|
200
|
-
*/
|
|
201
|
-
export function readQaRunOptions(options) {
|
|
202
|
-
return {
|
|
203
|
-
browserEnabled: options.browser !== false,
|
|
204
|
-
detectorEnabled: options.restartDetector !== false,
|
|
205
|
-
maxRestarts: resolveMaxRestarts(options.maxBrowserRestarts),
|
|
206
|
-
mutationEnabled: options.mutation !== false
|
|
207
|
-
};
|
|
208
|
-
}
|
|
14
|
+
import { registerQaArchiveScreenshotsCommand } from './qa-archive-screenshots-command.js';
|
|
15
|
+
import { registerQaRunCommand } from './qa-run-command.js';
|
|
209
16
|
export function registerQaCommands(program, io) {
|
|
210
17
|
const qa = program
|
|
211
18
|
.command('qa', { hidden: true })
|
|
212
19
|
.description('peaks-qa slice: run QA gates (functional / security / browser E2E / mutation) for the active project');
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
.description('Run the peaks-qa slice (PRD 2026-06-16-playwright-restart-loop; Plan 2 mut gate)')
|
|
216
|
-
.option('--project <path>', 'project the gates evaluate against (default: current directory)', '.')
|
|
217
|
-
.option('--session-id <sid>', 'session id; defaults to "ad-hoc" for one-shot runs', 'ad-hoc')
|
|
218
|
-
.option('--no-browser', 'skip the browser E2E gate entirely (PRD G5 / AC4)')
|
|
219
|
-
.option('--max-browser-restarts <n>', 'halt threshold for close->navigate pairs in this slice (default 3, PRD AC5)', String(DEFAULT_MAX_BROWSER_RESTARTS))
|
|
220
|
-
.option('--no-restart-detector', 'disable the restart-loop detector escape hatch (PRD AC6)')
|
|
221
|
-
// Plan 2 / Task 8 — MUT.sig gate opt-out (mirrors --no-browser).
|
|
222
|
-
.option('--no-mutation', 'skip the mutation gate even if .peaks/_runtime/<sid>/mut/mut-report.json exists')).action(async (options) => {
|
|
223
|
-
try {
|
|
224
|
-
const { browserEnabled, detectorEnabled, maxRestarts, mutationEnabled } = readQaRunOptions(options);
|
|
225
|
-
// Plan 1 / Task 9 — pre-build peaks-context before peaks-qa runs.
|
|
226
|
-
// Goal is audience-scoped doc retrieval only; pass a placeholder
|
|
227
|
-
// when the user did not supply one.
|
|
228
|
-
const qaProject = options.project;
|
|
229
|
-
const qaSid = options.sessionId ?? 'ad-hoc';
|
|
230
|
-
// Sid axis. `--session-id` reaches three consumers below — the context
|
|
231
|
-
// pre-build, `loadMutReport`, and `runQaSlice`'s
|
|
232
|
-
// `qa/browser-events.jsonl` join — so one guard at resolution covers all
|
|
233
|
-
// three. (`peaks qa archive-screenshots` has its own, separate join.)
|
|
234
|
-
if (isUnsafePathInput(qaSid)) {
|
|
235
|
-
printResult(io, fail('qa.gate', 'INVALID_SESSION_ID', `Invalid session id: ${qaSid} (must be a single path segment)`, { provided: qaSid }, ['Pass a session id that is a single path segment']), options.json);
|
|
236
|
-
process.exitCode = 1;
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
await ensureContextForQa('qa gate run', qaProject, qaSid);
|
|
240
|
-
// Plan 2 / Task 8 — load peaks-mut's report (MUT.sig) if present.
|
|
241
|
-
// Returns null when peaks-mut was not run; the gate treats that
|
|
242
|
-
// as `skipped`, never as `failed`. loadMutReport itself never
|
|
243
|
-
// throws (per its docstring) so this is safe in the action.
|
|
244
|
-
const mutationReport = mutationEnabled ? await loadMutReport(qaSid) : null;
|
|
245
|
-
// Production slice: no synthetic events to feed; in real
|
|
246
|
-
// dogfood the LLM tool dispatcher would push events into the
|
|
247
|
-
// detector. Here we record an empty event log so the
|
|
248
|
-
// gate-list shape is stable for downstream parsers.
|
|
249
|
-
const result = runQaSlice({
|
|
250
|
-
project: options.project,
|
|
251
|
-
sessionId: options.sessionId ?? 'ad-hoc',
|
|
252
|
-
browserEnabled,
|
|
253
|
-
maxRestarts,
|
|
254
|
-
detectorEnabled,
|
|
255
|
-
events: [],
|
|
256
|
-
mutationReport,
|
|
257
|
-
mutationEnabled
|
|
258
|
-
});
|
|
259
|
-
const mutationGate = result.gates.find((g) => g.name === 'mutation');
|
|
260
|
-
const mutationFailed = mutationGate?.status === 'failed';
|
|
261
|
-
const nextActions = result.detectorTriggered
|
|
262
|
-
? [
|
|
263
|
-
'Stop the slice and inspect the diagnostic above',
|
|
264
|
-
'Re-run with --no-restart-detector if the close/reopen was intentional',
|
|
265
|
-
'See .peaks/memory/playwright-restart-loop-2026-06-16.md'
|
|
266
|
-
]
|
|
267
|
-
: mutationFailed
|
|
268
|
-
? [
|
|
269
|
-
'Re-run peaks mut and address the threshold breaches (see reason)',
|
|
270
|
-
'Re-run with --no-mutation to bypass the gate for this slice',
|
|
271
|
-
`mut-report path: ${mutReportPath(qaSid)}`
|
|
272
|
-
]
|
|
273
|
-
: browserEnabled
|
|
274
|
-
? ['No action required; browser gate passed']
|
|
275
|
-
: ['Browser E2E skipped; run without --no-browser when the slice needs E2E'];
|
|
276
|
-
printResult(io, ok('qa.run', result, [], nextActions), options.json);
|
|
277
|
-
if (result.detectorTriggered || mutationFailed) {
|
|
278
|
-
process.exitCode = 2;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
catch (error) {
|
|
282
|
-
printResult(io, fail('qa.run', 'QA_RUN_FAILED', error instanceof Error ? error.message : 'Unknown error', { project: options.project }, ['Check the project path and rerun']), options.json);
|
|
283
|
-
process.exitCode = 1;
|
|
284
|
-
}
|
|
285
|
-
});
|
|
286
|
-
// Enforces peaks-qa SKILL.md "Hard contracts for browser validation"
|
|
287
|
-
// Contract 1: every Playwright `browser_take_screenshot` MUST land under
|
|
288
|
-
// `.peaks/_runtime/<sessionId>/qa/screenshots/`, not at the project root.
|
|
289
|
-
// When the LLM forgets to pass `filename`, Playwright MCP scatters
|
|
290
|
-
// `.png` files at the repo top level. This subcommand is the
|
|
291
|
-
// remediation: scan `--source` (default: project root) and move stray
|
|
292
|
-
// screenshots into `.peaks/_runtime/<session-id>/qa/screenshots/`.
|
|
293
|
-
addJsonOption(qa
|
|
294
|
-
.command('archive-screenshots')
|
|
295
|
-
.description('Move stray Playwright screenshots (.png/.jpg/.jpeg) from the ' +
|
|
296
|
-
'project root into .peaks/_runtime/<session-id>/qa/screenshots/. ' +
|
|
297
|
-
'Enforces peaks-qa SKILL.md Contract 1.')
|
|
298
|
-
.option('--source <dir>', 'directory to scan for stray screenshots (default: project root)', '.')
|
|
299
|
-
.option('--project <path>', 'project root (default: cwd)', '.')
|
|
300
|
-
.option('--session-id <sid>', 'target session id; defaults to the active session', '')).action((options) => {
|
|
301
|
-
try {
|
|
302
|
-
const projectRoot = resolve(options.project);
|
|
303
|
-
const sid = options.sessionId?.trim() || getSessionId(projectRoot) || 'ad-hoc';
|
|
304
|
-
// Sid axis. Guarded after resolution so the flag value and the session
|
|
305
|
-
// binding are both covered. `archiveScreenshots` cannot do this itself:
|
|
306
|
-
// it only ever sees a fully-resolved `targetDir`.
|
|
307
|
-
if (isUnsafePathInput(sid)) {
|
|
308
|
-
throw new Error(`Invalid session id: ${sid} (must be a single path segment)`);
|
|
309
|
-
}
|
|
310
|
-
const targetDir = join(projectRoot, '.peaks', '_runtime', sid, 'qa', 'screenshots');
|
|
311
|
-
const envelope = archiveScreenshots({ sourceDir: options.source, targetDir });
|
|
312
|
-
printResult(io, ok('qa.archive-screenshots', envelope, [], envelope.moved.length === 0
|
|
313
|
-
? ['No stray screenshots found in ' + envelope.scannedSource]
|
|
314
|
-
: [
|
|
315
|
-
`Moved ${envelope.moved.length} file(s) to ${envelope.targetDir}`,
|
|
316
|
-
'Re-run peaks qa run to verify the gate passes'
|
|
317
|
-
]), options.json);
|
|
318
|
-
}
|
|
319
|
-
catch (error) {
|
|
320
|
-
process.exitCode = 1;
|
|
321
|
-
printResult(io, fail('qa.archive-screenshots', 'ARCHIVE_FAILED', error instanceof Error ? error.message : 'Unknown error', { project: options.project, source: options.source }, ['Verify the source dir exists and is readable']), options.json);
|
|
322
|
-
}
|
|
323
|
-
});
|
|
20
|
+
registerQaRunCommand(qa, io);
|
|
21
|
+
registerQaArchiveScreenshotsCommand(qa, io);
|
|
324
22
|
}
|
|
23
|
+
// Re-export for tests / external consumers; the implementations moved to the
|
|
24
|
+
// modules above with the split.
|
|
25
|
+
export { readQaRunOptions } from './qa-run-options.js';
|
|
26
|
+
export { DEFAULT_MAX_BROWSER_RESTARTS, runQaSlice } from './qa-run-slice.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ensureContextForQa(goal: string, project: string, sid: string): Promise<void>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// src/cli/commands/qa-context-prestep.ts
|
|
2
|
+
//
|
|
3
|
+
// Plan 1 / Task 9 — the peaks-context build that runs BEFORE a peaks-qa slice.
|
|
4
|
+
// Extracted from `qa-commands.ts`; the cache dir, the token budget and the
|
|
5
|
+
// never-block contract are unchanged.
|
|
6
|
+
import { buildContext } from '../../services/context/context-builder.js';
|
|
7
|
+
import { createDocCacheFetcher } from '../../services/context/doc-cache-fetcher.js';
|
|
8
|
+
function buildDocFetcher(sid) {
|
|
9
|
+
return createDocCacheFetcher({
|
|
10
|
+
cacheDir: `.peaks/_runtime/${sid}/doc-cache`
|
|
11
|
+
// remoteFetcher wired in a future slice.
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export async function ensureContextForQa(goal, project, sid) {
|
|
15
|
+
const out = `.peaks/_runtime/${sid}/context.json`;
|
|
16
|
+
try {
|
|
17
|
+
await buildContext({
|
|
18
|
+
goal,
|
|
19
|
+
project,
|
|
20
|
+
audience: 'peaks-qa',
|
|
21
|
+
depsMode: 'locked',
|
|
22
|
+
docBudgetTokens: 8000,
|
|
23
|
+
out,
|
|
24
|
+
fetcher: buildDocFetcher(sid)
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
// Plan 1 / Task 9 — context is a pre-step, not a precondition.
|
|
29
|
+
// Task 11 will upgrade this to a hard precondition once the qa
|
|
30
|
+
// slice actually consumes context.json.
|
|
31
|
+
const message = error instanceof Error ? error.message : 'unknown context build failure';
|
|
32
|
+
process.stderr.write(`[peaks-context] qa pre-step skipped: ${message}\n`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// src/cli/commands/qa-run-command.ts
|
|
2
|
+
//
|
|
3
|
+
// `peaks qa run` — the peaks-qa slice (functional / security / browser E2E /
|
|
4
|
+
// mutation gates) for the active project. Extracted from `qa-commands.ts`:
|
|
5
|
+
//
|
|
6
|
+
// 1. `--no-browser` (G5) skips the browser E2E gate entirely; the resulting
|
|
7
|
+
// gate list marks it `status: skipped`, reason `--no-browser`. This is a
|
|
8
|
+
// slice-level opt-out for backend-only or already-covered-by-unit-tests
|
|
9
|
+
// work.
|
|
10
|
+
// 2. Plan 2 / Task 8 — `loadMutReport` supplies the MUT.sig gate; a missing
|
|
11
|
+
// report is `skipped`, never `failed`.
|
|
12
|
+
// 3. The LLM tool dispatcher would push browser events into the detector in
|
|
13
|
+
// real dogfood; here the slice records an empty event log so the gate-list
|
|
14
|
+
// shape stays stable for downstream parsers.
|
|
15
|
+
//
|
|
16
|
+
// The registered name, description, options, envelope and exit codes are
|
|
17
|
+
// unchanged.
|
|
18
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
19
|
+
import { loadMutReport, mutReportPath } from 'peaks-loop-mut';
|
|
20
|
+
import { isUnsafePathInput } from '../../shared/path-safety.js';
|
|
21
|
+
import { addJsonOption, printResult } from '../cli-helpers.js';
|
|
22
|
+
import { ensureContextForQa } from './qa-context-prestep.js';
|
|
23
|
+
import { readQaRunOptions } from './qa-run-options.js';
|
|
24
|
+
import { DEFAULT_MAX_BROWSER_RESTARTS, runQaSlice } from './qa-run-slice.js';
|
|
25
|
+
export function registerQaRunCommand(qa, io) {
|
|
26
|
+
addJsonOption(qaRunCommand(qa)).action((options) => runQaRun(io, options));
|
|
27
|
+
}
|
|
28
|
+
/** The `run` verb's description and its six options, verbatim. */
|
|
29
|
+
function qaRunCommand(qa) {
|
|
30
|
+
return (qa
|
|
31
|
+
.command('run')
|
|
32
|
+
.description('Run the peaks-qa slice (PRD 2026-06-16-playwright-restart-loop; Plan 2 mut gate)')
|
|
33
|
+
.option('--project <path>', 'project the gates evaluate against (default: current directory)', '.')
|
|
34
|
+
.option('--session-id <sid>', 'session id; defaults to "ad-hoc" for one-shot runs', 'ad-hoc')
|
|
35
|
+
.option('--no-browser', 'skip the browser E2E gate entirely (PRD G5 / AC4)')
|
|
36
|
+
.option('--max-browser-restarts <n>', 'halt threshold for close->navigate pairs in this slice (default 3, PRD AC5)', String(DEFAULT_MAX_BROWSER_RESTARTS))
|
|
37
|
+
.option('--no-restart-detector', 'disable the restart-loop detector escape hatch (PRD AC6)')
|
|
38
|
+
// Plan 2 / Task 8 — MUT.sig gate opt-out (mirrors --no-browser).
|
|
39
|
+
.option('--no-mutation', 'skip the mutation gate even if .peaks/_runtime/<sid>/mut/mut-report.json exists'));
|
|
40
|
+
}
|
|
41
|
+
async function runQaRun(io, options) {
|
|
42
|
+
try {
|
|
43
|
+
const { browserEnabled, detectorEnabled, maxRestarts, mutationEnabled } = readQaRunOptions(options);
|
|
44
|
+
const qaSid = options.sessionId ?? 'ad-hoc';
|
|
45
|
+
// Sid axis. `--session-id` reaches three consumers below — the context
|
|
46
|
+
// pre-build, `loadMutReport`, and `runQaSlice`'s
|
|
47
|
+
// `qa/browser-events.jsonl` join — so one guard at resolution covers all
|
|
48
|
+
// three. (`peaks qa archive-screenshots` has its own, separate join.)
|
|
49
|
+
if (isUnsafePathInput(qaSid)) {
|
|
50
|
+
printResult(io, unsafeSessionEnvelope(qaSid), options.json);
|
|
51
|
+
process.exitCode = 1;
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Plan 1 / Task 9 — pre-build peaks-context before peaks-qa runs.
|
|
55
|
+
// Goal is audience-scoped doc retrieval only; pass a placeholder
|
|
56
|
+
// when the user did not supply one.
|
|
57
|
+
await ensureContextForQa('qa gate run', options.project, qaSid);
|
|
58
|
+
const mutationReport = mutationEnabled
|
|
59
|
+
? await loadMutReport(qaSid)
|
|
60
|
+
: null;
|
|
61
|
+
const result = runQaSlice({
|
|
62
|
+
project: options.project,
|
|
63
|
+
sessionId: qaSid,
|
|
64
|
+
browserEnabled,
|
|
65
|
+
maxRestarts,
|
|
66
|
+
detectorEnabled,
|
|
67
|
+
events: [],
|
|
68
|
+
mutationReport,
|
|
69
|
+
mutationEnabled
|
|
70
|
+
});
|
|
71
|
+
const mutationFailed = result.gates.find((g) => g.name === 'mutation')?.status === 'failed';
|
|
72
|
+
printResult(io, ok('qa.run', result, [], qaRunNextActions({ result, browserEnabled, mutationFailed, qaSid })), options.json);
|
|
73
|
+
if (result.detectorTriggered || mutationFailed) {
|
|
74
|
+
process.exitCode = 2;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
printResult(io, fail('qa.run', 'QA_RUN_FAILED', error instanceof Error ? error.message : 'Unknown error', { project: options.project }, ['Check the project path and rerun']), options.json);
|
|
79
|
+
process.exitCode = 1;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** The refusal for a `--session-id` that is not a single path segment. */
|
|
83
|
+
function unsafeSessionEnvelope(qaSid) {
|
|
84
|
+
return fail('qa.gate', 'INVALID_SESSION_ID', `Invalid session id: ${qaSid} (must be a single path segment)`, { provided: qaSid }, ['Pass a session id that is a single path segment']);
|
|
85
|
+
}
|
|
86
|
+
/** What the caller should do next, by the gate that decided the slice's outcome. */
|
|
87
|
+
function qaRunNextActions(input) {
|
|
88
|
+
if (input.result.detectorTriggered) {
|
|
89
|
+
return [
|
|
90
|
+
'Stop the slice and inspect the diagnostic above',
|
|
91
|
+
'Re-run with --no-restart-detector if the close/reopen was intentional',
|
|
92
|
+
'See .peaks/memory/playwright-restart-loop-2026-06-16.md'
|
|
93
|
+
];
|
|
94
|
+
}
|
|
95
|
+
if (input.mutationFailed) {
|
|
96
|
+
return [
|
|
97
|
+
'Re-run peaks mut and address the threshold breaches (see reason)',
|
|
98
|
+
'Re-run with --no-mutation to bypass the gate for this slice',
|
|
99
|
+
`mut-report path: ${mutReportPath(input.qaSid)}`
|
|
100
|
+
];
|
|
101
|
+
}
|
|
102
|
+
return input.browserEnabled
|
|
103
|
+
? ['No action required; browser gate passed']
|
|
104
|
+
: ['Browser E2E skipped; run without --no-browser when the slice needs E2E'];
|
|
105
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type QaRunOptions = {
|
|
2
|
+
project: string;
|
|
3
|
+
browser?: boolean;
|
|
4
|
+
restartDetector?: boolean;
|
|
5
|
+
maxBrowserRestarts?: string;
|
|
6
|
+
sessionId?: string;
|
|
7
|
+
json?: boolean;
|
|
8
|
+
mutation?: boolean;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Commander 12.x sets `options.X = false` for `--no-X` (POSITIVE form),
|
|
12
|
+
* not `options.noX = true`. Reads use the positive form; the default is
|
|
13
|
+
* `true` and the boolean form is `false` only when the user passes `--no-X`.
|
|
14
|
+
*
|
|
15
|
+
* Exported for unit testing the parser contract in isolation from
|
|
16
|
+
* the rest of the action handler.
|
|
17
|
+
*/
|
|
18
|
+
export declare function readQaRunOptions(options: QaRunOptions): {
|
|
19
|
+
readonly browserEnabled: boolean;
|
|
20
|
+
readonly detectorEnabled: boolean;
|
|
21
|
+
readonly maxRestarts: number;
|
|
22
|
+
readonly mutationEnabled: boolean;
|
|
23
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// src/cli/commands/qa-run-options.ts
|
|
2
|
+
//
|
|
3
|
+
// The `peaks qa run` flag contract, parsed in isolation from the action handler
|
|
4
|
+
// so unit tests can assert it without a project on disk. Extracted from
|
|
5
|
+
// `qa-commands.ts`; every default and every reading is unchanged.
|
|
6
|
+
import { DEFAULT_MAX_BROWSER_RESTARTS } from './qa-run-slice.js';
|
|
7
|
+
function resolveMaxRestarts(raw) {
|
|
8
|
+
if (raw === undefined)
|
|
9
|
+
return DEFAULT_MAX_BROWSER_RESTARTS;
|
|
10
|
+
const n = Number.parseInt(raw, 10);
|
|
11
|
+
if (Number.isNaN(n) || n < 1) {
|
|
12
|
+
return DEFAULT_MAX_BROWSER_RESTARTS;
|
|
13
|
+
}
|
|
14
|
+
return n;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Commander 12.x sets `options.X = false` for `--no-X` (POSITIVE form),
|
|
18
|
+
* not `options.noX = true`. Reads use the positive form; the default is
|
|
19
|
+
* `true` and the boolean form is `false` only when the user passes `--no-X`.
|
|
20
|
+
*
|
|
21
|
+
* Exported for unit testing the parser contract in isolation from
|
|
22
|
+
* the rest of the action handler.
|
|
23
|
+
*/
|
|
24
|
+
export function readQaRunOptions(options) {
|
|
25
|
+
return {
|
|
26
|
+
browserEnabled: options.browser !== false,
|
|
27
|
+
detectorEnabled: options.restartDetector !== false,
|
|
28
|
+
maxRestarts: resolveMaxRestarts(options.maxBrowserRestarts),
|
|
29
|
+
mutationEnabled: options.mutation !== false
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { MutReportJson } from 'peaks-loop-mut';
|
|
2
|
+
import { type BrowserEvent } from '../../services/qa/browser-restart-detector.js';
|
|
3
|
+
export type QaGateStatus = {
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly status: 'passed' | 'skipped' | 'failed';
|
|
6
|
+
readonly reason?: string;
|
|
7
|
+
/**
|
|
8
|
+
* Plan 2 / Task 8 — when the gate consumes an artifact with a
|
|
9
|
+
* deterministic signature, this field carries that signature for
|
|
10
|
+
* downstream audit-trail consumers. Currently set only on the
|
|
11
|
+
* `mutation` gate to MUT.sig (the `sha256` of mut-report.json).
|
|
12
|
+
*/
|
|
13
|
+
readonly mutSig?: string;
|
|
14
|
+
};
|
|
15
|
+
export type QaRunResult = {
|
|
16
|
+
readonly sessionId: string;
|
|
17
|
+
readonly project: string;
|
|
18
|
+
readonly browserEnabled: boolean;
|
|
19
|
+
readonly gates: readonly QaGateStatus[];
|
|
20
|
+
readonly detectorTriggered: boolean;
|
|
21
|
+
readonly diagnostic?: string;
|
|
22
|
+
readonly subAgentPromptHint: string;
|
|
23
|
+
/**
|
|
24
|
+
* Plan 2 / Task 8 — MUT.sig when peaks-mut ran in this session.
|
|
25
|
+
* Undefined when peaks-mut was not run (no mut-report.json) or
|
|
26
|
+
* the user passed --no-mutation.
|
|
27
|
+
*/
|
|
28
|
+
readonly mutSig?: string;
|
|
29
|
+
};
|
|
30
|
+
export type RunQaSliceInput = {
|
|
31
|
+
readonly project: string;
|
|
32
|
+
readonly sessionId: string;
|
|
33
|
+
readonly browserEnabled: boolean;
|
|
34
|
+
readonly maxRestarts: number;
|
|
35
|
+
readonly detectorEnabled: boolean;
|
|
36
|
+
readonly events: readonly BrowserEvent[];
|
|
37
|
+
readonly mutationReport: MutReportJson | null;
|
|
38
|
+
readonly mutationEnabled: boolean;
|
|
39
|
+
};
|
|
40
|
+
export declare const DEFAULT_MAX_BROWSER_RESTARTS = 3;
|
|
41
|
+
export declare function runQaSlice(input: RunQaSliceInput): QaRunResult;
|