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,323 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { findProjectRoot } from '../../../services/config/config-safety.js';
|
|
4
|
-
import { loadSkillRegistry } from '../../../services/skills/skill-registry.js';
|
|
5
|
-
import { planStatusLineInstall } from '../../../services/skills/statusline-settings-service.js';
|
|
6
|
-
import { addJsonOption, printResult } from '../../cli-helpers.js';
|
|
7
|
-
import { boundedNames, fitSummaryToBytes } from '../../../services/context/summary-view.js';
|
|
8
|
-
import { fail, ok } from 'peaks-loop-shared/result';
|
|
9
|
-
// slice-3b Option C: the doctor subpackage owns the check pipeline but
|
|
10
|
-
// does NOT import cross-domain utils from the main package (avoids
|
|
11
|
-
// circular deps). The CLI is the natural wiring point — every cross-
|
|
12
|
-
// domain util the doctor used to import directly is now injected as a
|
|
13
|
-
// probe on DoctorOptions at call-site:
|
|
14
|
-
//
|
|
15
|
-
// loadSkills ← loadSkillRegistry (main/services/skills/skill-registry.ts)
|
|
16
|
-
// skillPresenceProbe ← leave as-is; doctor-command does not own the presence probe
|
|
17
|
-
// statusLineInstalledProbe ← defaults to a `planStatusLineInstall` wrapper below
|
|
18
|
-
// projectRootResolver ← findProjectRoot (main/services/config/config-safety.ts)
|
|
19
|
-
// isValidSessionIdProbe ← the regex kept in main/services/workspace/sid-naming-guard.ts
|
|
20
|
-
//
|
|
21
|
-
// Inlining isValidSessionId via the doctor subpackage's default regex
|
|
22
|
-
// (which mirrors the upstream file byte-for-byte) keeps the L3 orphan
|
|
23
|
-
// check behaviour-identical without dragging sid-naming-guard into a
|
|
24
|
-
// workspace package. If sid-naming-guard is ever moved into
|
|
25
|
-
// peaks-loop-shared, swap this for a re-import.
|
|
26
|
-
function doctorIsValidSessionId(sid) {
|
|
27
|
-
return /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])-session-[0-9a-z]{3,6}$/.test(sid);
|
|
28
|
-
}
|
|
29
|
-
function statusLineAlreadyInstalledForScope(scope, projectRoot) {
|
|
30
|
-
try {
|
|
31
|
-
if (scope === 'project') {
|
|
32
|
-
if (projectRoot === undefined)
|
|
33
|
-
return false;
|
|
34
|
-
return planStatusLineInstall('project', projectRoot).alreadyInstalled;
|
|
35
|
-
}
|
|
36
|
-
return planStatusLineInstall('global').alreadyInstalled;
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* the doctor envelope. The `checks` array (one object per check, each with a
|
|
44
|
-
* full message) and the stale-binding instance list collapse to counts +
|
|
45
|
-
* names-of-first-N; the summary counters and log section are scalars and are
|
|
46
|
-
* kept verbatim. ≤ 2 KB by construction.
|
|
47
|
-
*/
|
|
48
|
-
export function buildDoctorSummary(data) {
|
|
49
|
-
const checks = Array.isArray(data.checks)
|
|
50
|
-
? data.checks
|
|
51
|
-
: [];
|
|
52
|
-
const label = (c) => {
|
|
53
|
-
const id = typeof c.id === 'string' ? c.id : 'unknown';
|
|
54
|
-
if (c.ok === true)
|
|
55
|
-
return `ok ${id}`;
|
|
56
|
-
return `${c.severity === 'warning' ? 'warn' : 'FAIL'} ${id}`;
|
|
57
|
-
};
|
|
58
|
-
const failed = checks.filter((c) => c.ok === false);
|
|
59
|
-
const stale = typeof data.staleBinding === 'object' && data.staleBinding !== null
|
|
60
|
-
? data.staleBinding
|
|
61
|
-
: null;
|
|
62
|
-
const view = {
|
|
63
|
-
view: 'summary',
|
|
64
|
-
summary: data.summary,
|
|
65
|
-
checks: boundedNames(checks.map(label)),
|
|
66
|
-
failed: boundedNames(failed.map((c) => `${typeof c.id === 'string' ? c.id : 'unknown'}: ${typeof c.message === 'string' ? c.message : ''}`))
|
|
67
|
-
};
|
|
68
|
-
if (stale !== null) {
|
|
69
|
-
view.staleBinding = {
|
|
70
|
-
ttlMs: stale.ttlMs,
|
|
71
|
-
staleCount: stale.staleCount,
|
|
72
|
-
droppedCount: stale.droppedCount,
|
|
73
|
-
droppedSids: boundedNames(Array.isArray(stale.droppedSids) ? stale.droppedSids.map((s) => String(s)) : [])
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
if (data.logs !== undefined)
|
|
77
|
-
view.logs = data.logs;
|
|
78
|
-
return fitSummaryToBytes(view);
|
|
79
|
-
}
|
|
80
|
-
function doctorStatusLineInstalledProbe() {
|
|
81
|
-
const projectRoot = findProjectRoot(process.cwd());
|
|
82
|
-
// Check both scopes: a user may have installed the statusLine globally, which
|
|
83
|
-
// the project-only check would miss and falsely report as "not installed".
|
|
84
|
-
try {
|
|
85
|
-
if (projectRoot !== null && statusLineAlreadyInstalledForScope('project', projectRoot)) {
|
|
86
|
-
return true;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
catch {
|
|
90
|
-
// TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
91
|
-
/* fall through to global */
|
|
92
|
-
}
|
|
93
|
-
try {
|
|
94
|
-
return statusLineAlreadyInstalledForScope('global');
|
|
95
|
-
}
|
|
96
|
-
catch {
|
|
97
|
-
return false;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
// threshold is exposed as a CLI flag so users can tune it for
|
|
101
|
-
// long-running sessions.
|
|
102
|
-
const STALE_TTL_MS = 5 * 60 * 1000;
|
|
103
|
-
// in the project-level binding. Used by `peaks doctor` and surfaced as
|
|
104
|
-
// a warning in the report. Returns the stale entry descriptors.
|
|
105
|
-
function listStaleInstances(projectRoot, ttlMs = STALE_TTL_MS) {
|
|
106
|
-
const binding = readBinding(projectRoot);
|
|
107
|
-
if (!binding)
|
|
108
|
-
return [];
|
|
109
|
-
const cutoff = Date.now() - ttlMs;
|
|
110
|
-
const stale = [];
|
|
111
|
-
for (const [sid, inst] of Object.entries(binding.instances)) {
|
|
112
|
-
const t = Date.parse(inst.lastHeartbeat);
|
|
113
|
-
if (Number.isFinite(t) && t < cutoff) {
|
|
114
|
-
stale.push({ sid, callerId: inst.callerId, lastHeartbeat: inst.lastHeartbeat });
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
return stale;
|
|
118
|
-
}
|
|
119
|
-
//
|
|
120
|
-
// `buildDoctorLogsSection` reads the on-disk log dir and returns the
|
|
121
|
-
// metadata the doctor needs to render the "logs" block. It is
|
|
122
|
-
// extracted from the inline `peaks doctor --log` action so the
|
|
123
|
-
// command stays small and the helper is unit-testable without
|
|
124
|
-
// spinning up the full program.
|
|
125
|
-
async function buildDoctorLogsSection() {
|
|
126
|
-
// Lazy imports to avoid a circular dep at module-load time
|
|
127
|
-
// (core-artifact-commands is imported very early in program.ts).
|
|
128
|
-
const { resolveLogDir, buildLogFileName } = await import('../../../services/log/logger.js');
|
|
129
|
-
const { statSync, existsSync } = await import('node:fs');
|
|
130
|
-
const { join } = await import('node:path');
|
|
131
|
-
const logDir = resolveLogDir();
|
|
132
|
-
const todayFile = buildLogFileName(new Date());
|
|
133
|
-
const fullPath = join(logDir, todayFile);
|
|
134
|
-
let sizeBytes = 0;
|
|
135
|
-
if (existsSync(fullPath)) {
|
|
136
|
-
try {
|
|
137
|
-
sizeBytes = statSync(fullPath).size;
|
|
138
|
-
}
|
|
139
|
-
catch {
|
|
140
|
-
sizeBytes = 0;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
return {
|
|
144
|
-
logDir,
|
|
145
|
-
todayFile,
|
|
146
|
-
sizeBytes,
|
|
147
|
-
retentionDays: 7,
|
|
148
|
-
level: process.env.PEAKS_LOG_LEVEL ?? 'info'
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
// "logs" section to the doctor output (logDir, today's file name,
|
|
152
|
-
// size, retention policy, level). Useful for the user when they
|
|
153
|
-
// want to attach a quick log snapshot to a bug report without
|
|
154
|
-
// running `peaks log tail` first. The flag is opt-in so the
|
|
155
|
-
// existing doctor output is preserved (P4).
|
|
156
|
-
export function registerDoctorCommand(program, io) {
|
|
157
|
-
addJsonOption(program
|
|
158
|
-
.command('doctor')
|
|
159
|
-
.description('Run repository doctor checks')
|
|
160
|
-
.option('--log', 'include a "logs" section in the doctor output (slice 2026-06-16-cli-logging, AC6)')
|
|
161
|
-
.option('--cleanup-stale', 'drop stale instance entries from the project-level binding (v2.16.0 AC-10)')
|
|
162
|
-
.option('--stale-ttl-ms <ms>', 'stale-binding TTL in milliseconds (default 300000 = 5 minutes, v2.16.0 AC-10)')
|
|
163
|
-
// v2.18.2 PATCH scope (follow-up issue #1): rewrite legacy
|
|
164
|
-
// v2.16.0 / v2.17.0 binding files in place so every existing
|
|
165
|
-
// callerId gets the `${envSignal}#${pid}` suffix introduced in
|
|
166
|
-
// v2.18.0. Mutually exclusive with --cleanup-stale to keep the
|
|
167
|
-
// semantics unambiguous (rebuild = structural change,
|
|
168
|
-
// cleanup-stale = TTL-based prune).
|
|
169
|
-
.option('--rebuild-binding', 'rewrite legacy v2.16.0 / v2.17.0 callerId entries to the v2.18.0+ `#${pid}` format (v2.18.2, follow-up issue #1)')
|
|
170
|
-
// v2.18.2 cycle 2: --project makes the project-root-bound
|
|
171
|
-
// flags (--rebuild-binding, --cleanup-stale, stale-binding
|
|
172
|
-
// scan) addressable for non-current projects. The doctor was
|
|
173
|
-
// hardcoded to findProjectRoot(process.cwd()) which is the
|
|
174
|
-
// wrong default for users inspecting a sibling project.
|
|
175
|
-
.option('--project <path>', 'target project root (defaults to git root or cwd)')
|
|
176
|
-
.option('--summary', 'JSON envelope only: emit check counts + names-of-first-N (≤ 2 KB) instead of the full checks/stale-binding arrays; the default envelope is unchanged')).action(async (options) => {
|
|
177
|
-
// v2.18.2 cycle 2 (Q2 arbitration): --rebuild-binding and
|
|
178
|
-
// --cleanup-stale BOTH mutate the binding file. Running them
|
|
179
|
-
// together is ambiguous (rebuild rewrites callerIds; cleanup
|
|
180
|
-
// prunes entries). Hard-reject the combination so the user
|
|
181
|
-
// gets an actionable error instead of a silent short-circuit.
|
|
182
|
-
if (options.rebuildBinding === true && options.cleanupStale === true) {
|
|
183
|
-
const envelope = fail('doctor.rebuild-binding', 'CONFLICTING_FLAGS', '--rebuild-binding and --cleanup-stale are mutually exclusive', { rebuildBinding: true, cleanupStale: true }, ['Run them in separate `peaks doctor` invocations']);
|
|
184
|
-
printResult(io, envelope, options.json === true);
|
|
185
|
-
process.exitCode = 1;
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
// v2.18.2 cycle 2: --project override, applies to BOTH the
|
|
189
|
-
// --rebuild-binding short-circuit AND the binding-stale scan.
|
|
190
|
-
const projectRoot = options.project !== undefined
|
|
191
|
-
? options.project
|
|
192
|
-
: (findProjectRoot(process.cwd()) ?? process.cwd());
|
|
193
|
-
// v2.18.2: short-circuit on --rebuild-binding so the doctor
|
|
194
|
-
// checks don't run when the user is asking for a single targeted
|
|
195
|
-
// migration. The rebuild is observable in its own right
|
|
196
|
-
// (rewritten/preserved counts) and does not benefit from running
|
|
197
|
-
// the full doctor surface first.
|
|
198
|
-
if (options.rebuildBinding === true) {
|
|
199
|
-
const result = rebuildBindingFromLegacy(projectRoot);
|
|
200
|
-
if (result.errors.length > 0) {
|
|
201
|
-
for (const err of result.errors) {
|
|
202
|
-
io.stderr(` warning: ${err}`);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
const data = {
|
|
206
|
-
rebuilt: !result.noop,
|
|
207
|
-
rewritten: result.rewritten,
|
|
208
|
-
preserved: result.preserved,
|
|
209
|
-
errors: result.errors,
|
|
210
|
-
projectRoot
|
|
211
|
-
};
|
|
212
|
-
const envelope = result.rewritten === 0
|
|
213
|
-
? ok('doctor.rebuild-binding', data, [], result.noop ? ['no legacy callerId entries found — nothing to rewrite'] : [])
|
|
214
|
-
: fail('doctor.rebuild-binding', result.noop ? 'BINDING_REBUILD_NOOP' : 'BINDING_REBUILD_OK', result.noop
|
|
215
|
-
? 'No legacy callerId entries to rewrite'
|
|
216
|
-
: `Rewrote ${result.rewritten} legacy callerId entry/entries (preserved ${result.preserved})`, data, ['Re-run `peaks binding status` to verify the rewritten entries']);
|
|
217
|
-
printResult(io, envelope, options.json === true);
|
|
218
|
-
if (result.errors.length > 0 && result.rewritten === 0) {
|
|
219
|
-
process.exitCode = 1;
|
|
220
|
-
}
|
|
221
|
-
return;
|
|
222
|
-
}
|
|
223
|
-
const report = await runDoctor({
|
|
224
|
-
// slice-3b Option C: wire cross-domain probes at call-site.
|
|
225
|
-
loadSkills: loadSkillRegistry,
|
|
226
|
-
projectRootResolver: () => findProjectRoot(process.cwd()),
|
|
227
|
-
isValidSessionIdProbe: doctorIsValidSessionId,
|
|
228
|
-
statusLineInstalledProbe: doctorStatusLineInstalledProbe
|
|
229
|
-
});
|
|
230
|
-
let logsSection = null;
|
|
231
|
-
if (options.log === true) {
|
|
232
|
-
logsSection = await buildDoctorLogsSection();
|
|
233
|
-
}
|
|
234
|
-
const ttl = options.staleTtlMs !== undefined ? Number(options.staleTtlMs) : STALE_TTL_MS;
|
|
235
|
-
const staleInstances = listStaleInstances(projectRoot, ttl);
|
|
236
|
-
let droppedStale = [];
|
|
237
|
-
if (options.cleanupStale === true) {
|
|
238
|
-
const { dropped } = dropStale(projectRoot, ttl);
|
|
239
|
-
droppedStale = dropped;
|
|
240
|
-
}
|
|
241
|
-
const staleBindingSection = {
|
|
242
|
-
ttlMs: ttl,
|
|
243
|
-
staleCount: staleInstances.length,
|
|
244
|
-
staleInstances,
|
|
245
|
-
droppedCount: droppedStale.length,
|
|
246
|
-
droppedSids: droppedStale
|
|
247
|
-
};
|
|
248
|
-
const fullData = logsSection === null
|
|
249
|
-
? { ...report, staleBinding: staleBindingSection }
|
|
250
|
-
: { ...report, logs: logsSection, staleBinding: staleBindingSection };
|
|
251
|
-
// Slice B: `--summary` is opt-in and affects the JSON envelope only (the
|
|
252
|
-
// human-readable path below already prints one line per check).
|
|
253
|
-
const data = options.summary === true ? buildDoctorSummary(fullData) : fullData;
|
|
254
|
-
// repair cycle: `report.summary.ok` already factors in the
|
|
255
|
-
// severity-aware aggregation in `buildReport` (warnings do NOT
|
|
256
|
-
// flip `ok`). Stale-binding is independent and still escalates.
|
|
257
|
-
const result = report.summary.ok && staleInstances.length === 0
|
|
258
|
-
? ok('doctor', data)
|
|
259
|
-
: fail('doctor', 'DOCTOR_FAILED', staleInstances.length > 0
|
|
260
|
-
? `Found ${staleInstances.length} stale binding instance(s); rerun with --cleanup-stale to drop them`
|
|
261
|
-
: 'One or more doctor checks failed', data, staleInstances.length > 0
|
|
262
|
-
? ['Run `peaks doctor --cleanup-stale` to drop stale entries']
|
|
263
|
-
: ['Fix failed checks and rerun peaks doctor']);
|
|
264
|
-
if (options.json === true) {
|
|
265
|
-
printResult(io, result, true);
|
|
266
|
-
}
|
|
267
|
-
else {
|
|
268
|
-
// Human-readable: one line per check, green/red indicators, no JSON.
|
|
269
|
-
// repair cycle: warn-only findings (severity: 'warning') surface
|
|
270
|
-
// as `! check.ok` with the `! ` (warning) glyph so the operator
|
|
271
|
-
// can tell them apart from real errors without reading JSON.
|
|
272
|
-
for (const check of report.checks) {
|
|
273
|
-
if (check.ok) {
|
|
274
|
-
io.stdout(` + ${check.message}`);
|
|
275
|
-
}
|
|
276
|
-
else if (check.severity === 'warning') {
|
|
277
|
-
io.stdout(` ! ${check.message}`);
|
|
278
|
-
}
|
|
279
|
-
else {
|
|
280
|
-
io.stdout(` × ${check.message}`);
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
if (logsSection !== null) {
|
|
284
|
-
io.stdout('\n logs:');
|
|
285
|
-
io.stdout(` logDir: ${logsSection.logDir}`);
|
|
286
|
-
io.stdout(` todayFile: ${logsSection.todayFile}`);
|
|
287
|
-
io.stdout(` sizeBytes: ${logsSection.sizeBytes}`);
|
|
288
|
-
io.stdout(` retentionDays: ${logsSection.retentionDays}`);
|
|
289
|
-
io.stdout(` level: ${logsSection.level}`);
|
|
290
|
-
}
|
|
291
|
-
io.stdout('\n stale-binding (v2.16.0 AC-10):');
|
|
292
|
-
if (staleInstances.length === 0) {
|
|
293
|
-
io.stdout(' + no stale instances');
|
|
294
|
-
}
|
|
295
|
-
else {
|
|
296
|
-
io.stdout(` × ${staleInstances.length} stale instance(s):`);
|
|
297
|
-
for (const s of staleInstances) {
|
|
298
|
-
io.stdout(` - sid=${s.sid} caller=${s.callerId} lastSeen=${s.lastHeartbeat}`);
|
|
299
|
-
}
|
|
300
|
-
if (droppedStale.length > 0) {
|
|
301
|
-
io.stdout(` cleaned up: ${droppedStale.length}`);
|
|
302
|
-
}
|
|
303
|
-
else {
|
|
304
|
-
io.stdout(' rerun with --cleanup-stale to drop them');
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
io.stdout(`\n ${report.summary.passed} passed, ${report.summary.failed} failed${report.summary.warnings > 0 ? `, ${report.summary.warnings} warning(s)` : ''}`);
|
|
308
|
-
if (!report.summary.ok || staleInstances.length > 0) {
|
|
309
|
-
io.stderr(`\nDOCTOR_FAILED: ${staleInstances.length > 0 ? 'stale binding present' : `${report.summary.failed} check(s) failed`}.`);
|
|
310
|
-
}
|
|
311
|
-
else if (report.summary.warnings > 0) {
|
|
312
|
-
io.stdout(`\n ${report.summary.warnings} warning(s) present — exit code 0 (warn-only).`);
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
// repair cycle: `report.summary.ok` already factors in the
|
|
316
|
-
// severity-aware aggregation in `buildReport` (warnings do NOT
|
|
317
|
-
// flip `ok`). The exit-code gate remains `summary.ok &&
|
|
318
|
-
// !staleInstances` — no separate warning special-case needed here.
|
|
319
|
-
if (!report.summary.ok || staleInstances.length > 0) {
|
|
320
|
-
process.exitCode = 1;
|
|
321
|
-
}
|
|
322
|
-
});
|
|
323
|
-
}
|
|
1
|
+
export { buildDoctorSummary } from './doctor-summary.js';
|
|
2
|
+
export { registerDoctorCommand } from './doctor-run-command.js';
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { existsSync, statSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
//
|
|
4
|
+
// `buildDoctorLogsSection` reads the on-disk log dir and returns the
|
|
5
|
+
// metadata the doctor needs to render the "logs" block. It is
|
|
6
|
+
// extracted from the inline `peaks doctor --log` action so the
|
|
7
|
+
// command stays small and the helper is unit-testable without
|
|
8
|
+
// spinning up the full program.
|
|
9
|
+
export async function buildDoctorLogsSection() {
|
|
10
|
+
// Lazy import to avoid a circular dep at module-load time
|
|
11
|
+
// (core-artifact-commands is imported very early in program.ts).
|
|
12
|
+
const { resolveLogDir, buildLogFileName } = await import('../../../services/log/logger.js');
|
|
13
|
+
const logDir = resolveLogDir();
|
|
14
|
+
const todayFile = buildLogFileName(new Date());
|
|
15
|
+
const fullPath = join(logDir, todayFile);
|
|
16
|
+
let sizeBytes = 0;
|
|
17
|
+
if (existsSync(fullPath)) {
|
|
18
|
+
try {
|
|
19
|
+
sizeBytes = statSync(fullPath).size;
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
sizeBytes = 0;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
logDir,
|
|
27
|
+
todayFile,
|
|
28
|
+
sizeBytes,
|
|
29
|
+
retentionDays: 7,
|
|
30
|
+
level: process.env.PEAKS_LOG_LEVEL ?? 'info'
|
|
31
|
+
};
|
|
32
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { findProjectRoot } from '../../../services/config/config-safety.js';
|
|
2
|
+
import { planStatusLineInstall } from '../../../services/skills/statusline-settings-service.js';
|
|
3
|
+
// slice-3b Option C: the doctor subpackage owns the check pipeline but
|
|
4
|
+
// does NOT import cross-domain utils from the main package (avoids
|
|
5
|
+
// circular deps). The CLI is the natural wiring point — every cross-
|
|
6
|
+
// domain util the doctor used to import directly is now injected as a
|
|
7
|
+
// probe on DoctorOptions at call-site:
|
|
8
|
+
//
|
|
9
|
+
// loadSkills ← loadSkillRegistry (main/services/skills/skill-registry.ts)
|
|
10
|
+
// skillPresenceProbe ← leave as-is; doctor-command does not own the presence probe
|
|
11
|
+
// statusLineInstalledProbe ← defaults to a `planStatusLineInstall` wrapper below
|
|
12
|
+
// projectRootResolver ← findProjectRoot (main/services/config/config-safety.ts)
|
|
13
|
+
// isValidSessionIdProbe ← the regex kept in main/services/workspace/sid-naming-guard.ts
|
|
14
|
+
//
|
|
15
|
+
// Inlining isValidSessionId via the doctor subpackage's default regex
|
|
16
|
+
// (which mirrors the upstream file byte-for-byte) keeps the L3 orphan
|
|
17
|
+
// check behaviour-identical without dragging sid-naming-guard into a
|
|
18
|
+
// workspace package. If sid-naming-guard is ever moved into
|
|
19
|
+
// peaks-loop-shared, swap this for a re-import.
|
|
20
|
+
export function doctorIsValidSessionId(sid) {
|
|
21
|
+
return /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])-session-[0-9a-z]{3,6}$/.test(sid);
|
|
22
|
+
}
|
|
23
|
+
export function statusLineAlreadyInstalledForScope(scope, projectRoot) {
|
|
24
|
+
try {
|
|
25
|
+
if (scope === 'project') {
|
|
26
|
+
if (projectRoot === undefined)
|
|
27
|
+
return false;
|
|
28
|
+
return planStatusLineInstall('project', projectRoot).alreadyInstalled;
|
|
29
|
+
}
|
|
30
|
+
return planStatusLineInstall('global').alreadyInstalled;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function doctorStatusLineInstalledProbe() {
|
|
37
|
+
const projectRoot = findProjectRoot(process.cwd());
|
|
38
|
+
// Check both scopes: a user may have installed the statusLine globally, which
|
|
39
|
+
// the project-only check would miss and falsely report as "not installed".
|
|
40
|
+
try {
|
|
41
|
+
if (projectRoot !== null && statusLineAlreadyInstalledForScope('project', projectRoot)) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
// TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
47
|
+
/* fall through to global */
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
return statusLineAlreadyInstalledForScope('global');
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
import { type ProgramIO } from '../../cli-helpers.js';
|
|
3
|
+
export type DoctorOptions = {
|
|
4
|
+
json?: boolean;
|
|
5
|
+
log?: boolean;
|
|
6
|
+
cleanupStale?: boolean;
|
|
7
|
+
staleTtlMs?: string;
|
|
8
|
+
rebuildBinding?: boolean;
|
|
9
|
+
project?: string;
|
|
10
|
+
summary?: boolean;
|
|
11
|
+
};
|
|
12
|
+
export declare function registerDoctorCommand(program: Command, io: ProgramIO): void;
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { runDoctor } from '../../../services/doctor/index.js';
|
|
2
|
+
import { dropStale, rebuildBindingFromLegacy } from '../../../services/session/binding-store.js';
|
|
3
|
+
import { findProjectRoot } from '../../../services/config/config-safety.js';
|
|
4
|
+
import { loadSkillRegistry } from '../../../services/skills/skill-registry.js';
|
|
5
|
+
import { addJsonOption, printResult } from '../../cli-helpers.js';
|
|
6
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
7
|
+
import { listStaleInstances, staleBindingSection, STALE_TTL_MS } from './doctor-bindings.js';
|
|
8
|
+
import { buildDoctorLogsSection } from './doctor-logs.js';
|
|
9
|
+
import { doctorIsValidSessionId, doctorStatusLineInstalledProbe } from './doctor-probes.js';
|
|
10
|
+
import { buildDoctorSummary } from './doctor-summary.js';
|
|
11
|
+
/** v2.18.2 cycle 2: `--rebuild-binding` and `--cleanup-stale` both mutate the
|
|
12
|
+
* binding, so running them together is ambiguous. Hard-reject the combination
|
|
13
|
+
* so the user gets an actionable error instead of a silent short-circuit. */
|
|
14
|
+
function emitConflictingFlags(io, options) {
|
|
15
|
+
const envelope = fail('doctor.rebuild-binding', 'CONFLICTING_FLAGS', '--rebuild-binding and --cleanup-stale are mutually exclusive', { rebuildBinding: true, cleanupStale: true }, ['Run them in separate `peaks doctor` invocations']);
|
|
16
|
+
printResult(io, envelope, options.json === true);
|
|
17
|
+
process.exitCode = 1;
|
|
18
|
+
}
|
|
19
|
+
/** The `--rebuild-binding` envelope. A rewrite is reported as `fail` when the
|
|
20
|
+
* rebuild was an observable no-op, so the two outcomes stay distinguishable. */
|
|
21
|
+
function rebuildEnvelope(result, data) {
|
|
22
|
+
if (result.rewritten !== 0) {
|
|
23
|
+
return fail('doctor.rebuild-binding', result.noop ? 'BINDING_REBUILD_NOOP' : 'BINDING_REBUILD_OK', result.noop
|
|
24
|
+
? 'No legacy callerId entries to rewrite'
|
|
25
|
+
: `Rewrote ${result.rewritten} legacy callerId entry/entries (preserved ${result.preserved})`, data, ['Re-run `peaks binding status` to verify the rewritten entries']);
|
|
26
|
+
}
|
|
27
|
+
return ok('doctor.rebuild-binding', data, [], result.noop ? ['no legacy callerId entries found — nothing to rewrite'] : []);
|
|
28
|
+
}
|
|
29
|
+
/** `--rebuild-binding`: a single targeted migration, no doctor checks run. */
|
|
30
|
+
function runRebuildBinding(io, options, projectRoot) {
|
|
31
|
+
const result = rebuildBindingFromLegacy(projectRoot);
|
|
32
|
+
for (const err of result.errors) {
|
|
33
|
+
io.stderr(` warning: ${err}`);
|
|
34
|
+
}
|
|
35
|
+
const data = {
|
|
36
|
+
rebuilt: !result.noop,
|
|
37
|
+
rewritten: result.rewritten,
|
|
38
|
+
preserved: result.preserved,
|
|
39
|
+
errors: result.errors,
|
|
40
|
+
projectRoot
|
|
41
|
+
};
|
|
42
|
+
printResult(io, rebuildEnvelope(result, data), options.json === true);
|
|
43
|
+
if (result.errors.length > 0 && result.rewritten === 0) {
|
|
44
|
+
process.exitCode = 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** `report.summary.ok` already factors in severity-aware aggregation (warnings
|
|
48
|
+
* do NOT flip `ok`); the stale-binding count escalates independently. */
|
|
49
|
+
function buildDoctorResult(report, staleInstances, data) {
|
|
50
|
+
if (report.summary.ok && staleInstances.length === 0)
|
|
51
|
+
return ok('doctor', data);
|
|
52
|
+
return fail('doctor', 'DOCTOR_FAILED', staleInstances.length > 0
|
|
53
|
+
? `Found ${staleInstances.length} stale binding instance(s); rerun with --cleanup-stale to drop them`
|
|
54
|
+
: 'One or more doctor checks failed', data, staleInstances.length > 0
|
|
55
|
+
? ['Run `peaks doctor --cleanup-stale` to drop stale entries']
|
|
56
|
+
: ['Fix failed checks and rerun peaks doctor']);
|
|
57
|
+
}
|
|
58
|
+
/** Human-readable: one line per check, green/red/warn indicators, no JSON. */
|
|
59
|
+
function renderChecks(io, report) {
|
|
60
|
+
for (const check of report.checks) {
|
|
61
|
+
if (check.ok)
|
|
62
|
+
io.stdout(` + ${check.message}`);
|
|
63
|
+
else if (check.severity === 'warning')
|
|
64
|
+
io.stdout(` ! ${check.message}`);
|
|
65
|
+
else
|
|
66
|
+
io.stdout(` × ${check.message}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function renderLogsSection(io, logs) {
|
|
70
|
+
io.stdout('\n logs:');
|
|
71
|
+
io.stdout(` logDir: ${logs.logDir}`);
|
|
72
|
+
io.stdout(` todayFile: ${logs.todayFile}`);
|
|
73
|
+
io.stdout(` sizeBytes: ${logs.sizeBytes}`);
|
|
74
|
+
io.stdout(` retentionDays: ${logs.retentionDays}`);
|
|
75
|
+
io.stdout(` level: ${logs.level}`);
|
|
76
|
+
}
|
|
77
|
+
function renderStaleBinding(io, staleInstances, droppedStale) {
|
|
78
|
+
io.stdout('\n stale-binding (v2.16.0 AC-10):');
|
|
79
|
+
if (staleInstances.length === 0) {
|
|
80
|
+
io.stdout(' + no stale instances');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
io.stdout(` × ${staleInstances.length} stale instance(s):`);
|
|
84
|
+
for (const s of staleInstances) {
|
|
85
|
+
io.stdout(` - sid=${s.sid} caller=${s.callerId} lastSeen=${s.lastHeartbeat}`);
|
|
86
|
+
}
|
|
87
|
+
if (droppedStale.length > 0) {
|
|
88
|
+
io.stdout(` cleaned up: ${droppedStale.length}`);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
io.stdout(' rerun with --cleanup-stale to drop them');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function renderDoctorFooter(io, report, staleInstances) {
|
|
95
|
+
const { passed, failed, warnings } = report.summary;
|
|
96
|
+
io.stdout(`\n ${passed} passed, ${failed} failed${warnings > 0 ? `, ${warnings} warning(s)` : ''}`);
|
|
97
|
+
if (!report.summary.ok || staleInstances.length > 0) {
|
|
98
|
+
io.stderr(`\nDOCTOR_FAILED: ${staleInstances.length > 0 ? 'stale binding present' : `${failed} check(s) failed`}.`);
|
|
99
|
+
}
|
|
100
|
+
else if (warnings > 0) {
|
|
101
|
+
io.stdout(`\n ${warnings} warning(s) present — exit code 0 (warn-only).`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function renderDoctorHuman(io, report, sections) {
|
|
105
|
+
renderChecks(io, report);
|
|
106
|
+
if (sections.logs !== null)
|
|
107
|
+
renderLogsSection(io, sections.logs);
|
|
108
|
+
renderStaleBinding(io, sections.staleInstances, sections.droppedStale);
|
|
109
|
+
renderDoctorFooter(io, report, sections.staleInstances);
|
|
110
|
+
}
|
|
111
|
+
async function runDoctorReport(io, options, projectRoot) {
|
|
112
|
+
const report = await runDoctor({
|
|
113
|
+
loadSkills: loadSkillRegistry,
|
|
114
|
+
projectRootResolver: () => findProjectRoot(process.cwd()),
|
|
115
|
+
isValidSessionIdProbe: doctorIsValidSessionId,
|
|
116
|
+
statusLineInstalledProbe: doctorStatusLineInstalledProbe
|
|
117
|
+
});
|
|
118
|
+
const logs = options.log === true ? await buildDoctorLogsSection() : null;
|
|
119
|
+
const ttl = options.staleTtlMs !== undefined ? Number(options.staleTtlMs) : STALE_TTL_MS;
|
|
120
|
+
const staleInstances = listStaleInstances(projectRoot, ttl);
|
|
121
|
+
const droppedStale = options.cleanupStale === true ? dropStale(projectRoot, ttl).dropped : [];
|
|
122
|
+
const staleBinding = staleBindingSection(ttl, staleInstances, droppedStale);
|
|
123
|
+
const fullData = logs === null ? { ...report, staleBinding } : { ...report, logs, staleBinding };
|
|
124
|
+
const data = options.summary === true ? buildDoctorSummary(fullData) : fullData;
|
|
125
|
+
if (options.json === true) {
|
|
126
|
+
printResult(io, buildDoctorResult(report, staleInstances, data), true);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
renderDoctorHuman(io, report, { logs, staleInstances, droppedStale });
|
|
130
|
+
}
|
|
131
|
+
if (!report.summary.ok || staleInstances.length > 0) {
|
|
132
|
+
process.exitCode = 1;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function runDoctorCommand(io, options) {
|
|
136
|
+
if (options.rebuildBinding === true && options.cleanupStale === true) {
|
|
137
|
+
emitConflictingFlags(io, options);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// v2.18.2 cycle 2: --project override, applies to BOTH the
|
|
141
|
+
// --rebuild-binding short-circuit AND the binding-stale scan.
|
|
142
|
+
const projectRoot = options.project !== undefined
|
|
143
|
+
? options.project
|
|
144
|
+
: (findProjectRoot(process.cwd()) ?? process.cwd());
|
|
145
|
+
if (options.rebuildBinding === true) {
|
|
146
|
+
runRebuildBinding(io, options, projectRoot);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
await runDoctorReport(io, options, projectRoot);
|
|
150
|
+
}
|
|
151
|
+
export function registerDoctorCommand(program, io) {
|
|
152
|
+
addJsonOption(program
|
|
153
|
+
.command('doctor')
|
|
154
|
+
.description('Run repository doctor checks')
|
|
155
|
+
.option('--log', 'include a "logs" section in the doctor output (slice 2026-06-16-cli-logging, AC6)')
|
|
156
|
+
.option('--cleanup-stale', 'drop stale instance entries from the project-level binding (v2.16.0 AC-10)')
|
|
157
|
+
.option('--stale-ttl-ms <ms>', 'stale-binding TTL in milliseconds (default 300000 = 5 minutes, v2.16.0 AC-10)')
|
|
158
|
+
// v2.18.2 PATCH scope (follow-up issue #1): rewrite legacy
|
|
159
|
+
// v2.16.0 / v2.17.0 binding files in place so every existing
|
|
160
|
+
// callerId gets the `${envSignal}#${pid}` suffix introduced in
|
|
161
|
+
// v2.18.0. Mutually exclusive with --cleanup-stale to keep the
|
|
162
|
+
// semantics unambiguous (rebuild = structural change,
|
|
163
|
+
// cleanup-stale = TTL-based prune).
|
|
164
|
+
.option('--rebuild-binding', 'rewrite legacy v2.16.0 / v2.17.0 callerId entries to the v2.18.0+ `#${pid}` format (v2.18.2, follow-up issue #1)')
|
|
165
|
+
// v2.18.2 cycle 2: --project makes the project-root-bound
|
|
166
|
+
// flags (--rebuild-binding, --cleanup-stale, stale-binding
|
|
167
|
+
// scan) addressable for non-current projects. The doctor was
|
|
168
|
+
// hardcoded to findProjectRoot(process.cwd()) which is the
|
|
169
|
+
// wrong default for users inspecting a sibling project.
|
|
170
|
+
.option('--project <path>', 'target project root (defaults to git root or cwd)')
|
|
171
|
+
.option('--summary', 'JSON envelope only: emit check counts + names-of-first-N (≤ 2 KB) instead of the full checks/stale-binding arrays; the default envelope is unchanged')).action((options) => runDoctorCommand(io, options));
|
|
172
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* the doctor envelope. The `checks` array (one object per check, each with a
|
|
3
|
+
* full message) and the stale-binding instance list collapse to counts +
|
|
4
|
+
* names-of-first-N; the summary counters and log section are scalars and are
|
|
5
|
+
* kept verbatim. ≤ 2 KB by construction.
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildDoctorSummary(data: Record<string, unknown>): Record<string, unknown>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { boundedNames, fitSummaryToBytes } from '../../../services/context/summary-view.js';
|
|
2
|
+
/**
|
|
3
|
+
* the doctor envelope. The `checks` array (one object per check, each with a
|
|
4
|
+
* full message) and the stale-binding instance list collapse to counts +
|
|
5
|
+
* names-of-first-N; the summary counters and log section are scalars and are
|
|
6
|
+
* kept verbatim. ≤ 2 KB by construction.
|
|
7
|
+
*/
|
|
8
|
+
export function buildDoctorSummary(data) {
|
|
9
|
+
const checks = Array.isArray(data.checks)
|
|
10
|
+
? data.checks
|
|
11
|
+
: [];
|
|
12
|
+
const label = (c) => {
|
|
13
|
+
const id = typeof c.id === 'string' ? c.id : 'unknown';
|
|
14
|
+
if (c.ok === true)
|
|
15
|
+
return `ok ${id}`;
|
|
16
|
+
return `${c.severity === 'warning' ? 'warn' : 'FAIL'} ${id}`;
|
|
17
|
+
};
|
|
18
|
+
const failed = checks.filter((c) => c.ok === false);
|
|
19
|
+
const stale = typeof data.staleBinding === 'object' && data.staleBinding !== null
|
|
20
|
+
? data.staleBinding
|
|
21
|
+
: null;
|
|
22
|
+
const view = {
|
|
23
|
+
view: 'summary',
|
|
24
|
+
summary: data.summary,
|
|
25
|
+
checks: boundedNames(checks.map(label)),
|
|
26
|
+
failed: boundedNames(failed.map((c) => `${typeof c.id === 'string' ? c.id : 'unknown'}: ${typeof c.message === 'string' ? c.message : ''}`))
|
|
27
|
+
};
|
|
28
|
+
if (stale !== null) {
|
|
29
|
+
view.staleBinding = {
|
|
30
|
+
ttlMs: stale.ttlMs,
|
|
31
|
+
staleCount: stale.staleCount,
|
|
32
|
+
droppedCount: stale.droppedCount,
|
|
33
|
+
droppedSids: boundedNames(Array.isArray(stale.droppedSids) ? stale.droppedSids.map((s) => String(s)) : [])
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
if (data.logs !== undefined)
|
|
37
|
+
view.logs = data.logs;
|
|
38
|
+
return fitSummaryToBytes(view);
|
|
39
|
+
}
|