peaks-loop 4.0.0-beta.9 → 4.0.3
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/CHANGELOG.md +572 -234
- package/README-en.md +67 -30
- package/README.md +67 -30
- package/agents/karpathy-reviewer.md +33 -0
- package/bin/peaks.js +0 -0
- package/dist/cli/cli-helpers.d.ts +31 -6
- package/dist/cli/cli-helpers.js +48 -25
- package/dist/cli/commands/_register.d.ts +3 -0
- package/dist/cli/commands/_register.js +139 -0
- package/dist/cli/commands/_super.d.ts +10 -0
- package/dist/cli/commands/_super.js +97 -0
- package/dist/cli/commands/adapter-commands-s2a.js +1 -1
- package/dist/cli/commands/asset-commands.js +33 -16
- package/dist/cli/commands/audit-commands.js +2 -2
- package/dist/cli/commands/autonomous-swarm-commands.d.ts +12 -0
- package/dist/cli/commands/autonomous-swarm-commands.js +120 -0
- package/dist/cli/commands/bee-commands.js +1 -1
- package/dist/cli/commands/capability-commands.js +1 -1
- package/dist/cli/commands/capability-worker-config-sc-commands.js +0 -2
- package/dist/cli/commands/changeset-commands.d.ts +13 -0
- package/dist/cli/commands/changeset-commands.js +46 -0
- package/dist/cli/commands/code-commands.d.ts +11 -1
- package/dist/cli/commands/code-commands.js +19 -699
- package/dist/cli/commands/code-job-shape-commands.d.ts +9 -0
- package/dist/cli/commands/code-job-shape-commands.js +164 -0
- package/dist/cli/commands/code-mode-gate-commands.d.ts +9 -0
- package/dist/cli/commands/code-mode-gate-commands.js +223 -0
- package/dist/cli/commands/code-review-commands.js +2 -2
- package/dist/cli/commands/code-run-command.d.ts +12 -0
- package/dist/cli/commands/code-run-command.js +68 -0
- package/dist/cli/commands/code-runtime-commands.d.ts +11 -0
- package/dist/cli/commands/code-runtime-commands.js +391 -0
- package/dist/cli/commands/codegraph-commands.js +1 -1
- package/dist/cli/commands/compact-command.js +53 -1
- package/dist/cli/commands/complexity-commands.js +1 -1
- package/dist/cli/commands/config-commands.js +4 -75
- package/dist/cli/commands/container-commands.d.ts +28 -0
- package/dist/cli/commands/container-commands.js +221 -0
- package/dist/cli/commands/context-commands.js +3 -2
- package/dist/cli/commands/core/artifacts-command.js +1 -1
- package/dist/cli/commands/core/binding-commands.js +1 -1
- package/dist/cli/commands/core/doctor-command.js +63 -3
- package/dist/cli/commands/core/memory-command.js +1 -1
- package/dist/cli/commands/core/profile-command.js +1 -1
- package/dist/cli/commands/core/proxy-command.js +1 -1
- package/dist/cli/commands/core/session-command.js +9 -7
- package/dist/cli/commands/core/skill-command.js +7 -4
- package/dist/cli/commands/core/standards-command.js +1 -1
- package/dist/cli/commands/cron-commands.d.ts +57 -0
- package/dist/cli/commands/cron-commands.js +257 -0
- package/dist/cli/commands/cron-scheduler-commands.d.ts +47 -0
- package/dist/cli/commands/cron-scheduler-commands.js +284 -0
- package/dist/cli/commands/dashboard-commands.d.ts +4 -0
- package/dist/cli/commands/dashboard-commands.js +10 -0
- package/dist/cli/commands/dashboard-long-run.d.ts +25 -0
- package/dist/cli/commands/dashboard-long-run.js +122 -0
- package/dist/cli/commands/dashboard-summary.d.ts +12 -0
- package/dist/cli/commands/dashboard-summary.js +58 -0
- package/dist/cli/commands/dispatch-commands.d.ts +0 -7
- package/dist/cli/commands/dispatch-commands.js +372 -8
- package/dist/cli/commands/dispatch-from-dag.js +4 -1
- package/dist/cli/commands/doc-commands.js +1 -1
- package/dist/cli/commands/ecc-commands.d.ts +30 -0
- package/dist/cli/commands/ecc-commands.js +119 -0
- package/dist/cli/commands/evolution-commands.js +1 -1
- package/dist/cli/commands/feedback-commands.js +1 -1
- package/dist/cli/commands/final-review-commands.js +1 -1
- package/dist/cli/commands/fixture-commands.js +1 -1
- package/dist/cli/commands/fork-commands.js +1 -1
- package/dist/cli/commands/gate-commands.js +128 -6
- package/dist/cli/commands/governance-classify-contract-commands.d.ts +21 -0
- package/dist/cli/commands/governance-classify-contract-commands.js +273 -0
- package/dist/cli/commands/heartbeat-commands.js +76 -5
- package/dist/cli/commands/heartbeat-watch-command.d.ts +31 -0
- package/dist/cli/commands/heartbeat-watch-command.js +146 -0
- package/dist/cli/commands/hook-handle.js +1 -1
- package/dist/cli/commands/hooks-commands.js +126 -10
- package/dist/cli/commands/ide-commands.js +1 -1
- package/dist/cli/commands/impact-commands.js +1 -1
- package/dist/cli/commands/job-commands.js +34 -1
- package/dist/cli/commands/lease-metrics-commands.d.ts +67 -0
- package/dist/cli/commands/lease-metrics-commands.js +231 -0
- package/dist/cli/commands/lease-stats-commands.d.ts +65 -0
- package/dist/cli/commands/lease-stats-commands.js +107 -0
- package/dist/cli/commands/legacy-commands.js +1 -1
- package/dist/cli/commands/log-commands.js +1 -1
- package/dist/cli/commands/loop-commands.js +1 -1
- package/dist/cli/commands/loop-eval-commands.js +1 -1
- package/dist/cli/commands/memory-commands.js +1 -1
- package/dist/cli/commands/migrate-1-4-1-command.js +1 -1
- package/dist/cli/commands/migrate-v2-10-to-v2-11-command.js +1 -1
- package/dist/cli/commands/mut-commands.d.ts +1 -1
- package/dist/cli/commands/mut-commands.js +1 -5
- package/dist/cli/commands/observability-commands.js +1 -1
- package/dist/cli/commands/openspec-commands.js +65 -4
- package/dist/cli/commands/perf-audit-commands.js +3 -3
- package/dist/cli/commands/perf-commands.js +1 -1
- package/dist/cli/commands/polyrepo-commands.js +1 -1
- package/dist/cli/commands/prd-blocks-commands.js +1 -1
- package/dist/cli/commands/prd-commands.js +4 -2
- package/dist/cli/commands/preferences-commands.js +23 -3
- package/dist/cli/commands/project-commands.js +1 -1
- package/dist/cli/commands/qa-business-review-commands.js +1 -1
- package/dist/cli/commands/qa-commands.d.ts +1 -1
- package/dist/cli/commands/qa-commands.js +39 -3
- package/dist/cli/commands/release-commands.d.ts +15 -0
- package/dist/cli/commands/release-commands.js +113 -21
- package/dist/cli/commands/request-commands.js +1 -1
- package/dist/cli/commands/retrospective-commands.js +1 -1
- package/dist/cli/commands/reviewer-commands.js +1 -1
- package/dist/cli/commands/role-commands.js +1 -1
- package/dist/cli/commands/runtime-commands-helpers.d.ts +7 -0
- package/dist/cli/commands/runtime-commands-helpers.js +24 -0
- package/dist/cli/commands/runtime-commands.js +1 -2
- package/dist/cli/commands/sc-commands.js +4 -2
- package/dist/cli/commands/scan-commands.js +1 -1
- package/dist/cli/commands/security-audit-commands.js +3 -3
- package/dist/cli/commands/sediment-commands.js +10 -1
- package/dist/cli/commands/session-24h-mode.d.ts +26 -0
- package/dist/cli/commands/session-24h-mode.js +196 -0
- package/dist/cli/commands/share-commands.d.ts +19 -0
- package/dist/cli/commands/share-commands.js +121 -2
- package/dist/cli/commands/skill-conformance-commands.js +1 -1
- package/dist/cli/commands/skill-loop-engineering-readiness-commands.js +1 -1
- package/dist/cli/commands/skill-search-commands.js +4 -1
- package/dist/cli/commands/slice-commands.js +1 -1
- package/dist/cli/commands/slice-integrate-commands.js +1 -1
- package/dist/cli/commands/slice-review-commands.js +1 -1
- package/dist/cli/commands/smoke-commands.js +1 -1
- package/dist/cli/commands/sop-commands.js +1 -1
- package/dist/cli/commands/spill-demo-command.d.ts +7 -0
- package/dist/cli/commands/spill-demo-command.js +29 -0
- package/dist/cli/commands/statusline-commands.d.ts +12 -0
- package/dist/cli/commands/statusline-commands.js +79 -17
- package/dist/cli/commands/sub-agent-commands.js +2 -1
- package/dist/cli/commands/sub-agent-shared.d.ts +10 -0
- package/dist/cli/commands/sub-agent-shared.js +24 -1
- package/dist/cli/commands/swarm-commands.d.ts +13 -0
- package/dist/cli/commands/swarm-commands.js +77 -0
- package/dist/cli/commands/tech-commands.d.ts +64 -0
- package/dist/cli/commands/tech-commands.js +195 -0
- package/dist/cli/commands/understand-commands.js +1 -1
- package/dist/cli/commands/upgrade-commands.d.ts +2 -0
- package/dist/cli/commands/upgrade-commands.js +40 -5
- package/dist/cli/commands/user-touchpoint-commands.js +1 -1
- package/dist/cli/commands/verdict-aggregate-command.js +1 -1
- package/dist/cli/commands/vm-commands.d.ts +31 -0
- package/dist/cli/commands/vm-commands.js +274 -0
- package/dist/cli/commands/workflow-commands.js +24 -1
- package/dist/cli/commands/workflow-plan-commands.js +1 -1
- package/dist/cli/commands/workspace/init-command.js +1 -1
- package/dist/cli/commands/workspace/migrate-command.js +1 -1
- package/dist/cli/commands/workspace/reconcile-command.js +1 -1
- package/dist/cli/commands/worktree-auth-commands.d.ts +29 -0
- package/dist/cli/commands/worktree-auth-commands.js +652 -0
- package/dist/cli/index.js +58 -13
- package/dist/cli/program.d.ts +2 -2
- package/dist/cli/program.js +86 -281
- package/dist/services/24h-mode/decider.d.ts +103 -0
- package/dist/services/24h-mode/decider.js +144 -0
- package/dist/services/24h-mode/index.d.ts +12 -0
- package/dist/services/24h-mode/index.js +12 -0
- package/dist/services/24h-mode/state.d.ts +48 -0
- package/dist/services/24h-mode/state.js +51 -0
- package/dist/services/24h-mode/store.d.ts +27 -0
- package/dist/services/24h-mode/store.js +119 -0
- package/dist/services/artifacts/artifact-prerequisites.js +1 -1
- package/dist/services/artifacts/request-artifact-service.js +1 -1
- package/dist/services/artifacts/workspace-service.js +1 -1
- package/dist/services/audit/enforcers/lint-bee-runtime-contract.d.ts +25 -0
- package/dist/services/audit/enforcers/lint-bee-runtime-contract.js +91 -0
- package/dist/services/audit/enforcers/lint-peaks-code-runtime.d.ts +16 -0
- package/dist/services/audit/enforcers/lint-peaks-code-runtime.js +31 -0
- package/dist/services/audit/enforcers/lint-peaks-skill-runtime.d.ts +23 -0
- package/dist/services/audit/enforcers/lint-peaks-skill-runtime.js +59 -0
- package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.d.ts +28 -0
- package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.js +86 -0
- package/dist/services/audit/enforcers/lint-prd-artifact-handoff.d.ts +16 -0
- package/dist/services/audit/enforcers/lint-prd-artifact-handoff.js +41 -0
- package/dist/services/audit/enforcers/lint-prd-source-snapshot.d.ts +27 -0
- package/dist/services/audit/enforcers/lint-prd-source-snapshot.js +47 -0
- package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.d.ts +19 -0
- package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.js +47 -0
- package/dist/services/audit/enforcers/lint-rd-handoff-coverage.d.ts +18 -0
- package/dist/services/audit/enforcers/lint-rd-handoff-coverage.js +70 -0
- package/dist/services/audit/enforcers/lint-skill-presence-mandatory.d.ts +25 -0
- package/dist/services/audit/enforcers/lint-skill-presence-mandatory.js +53 -0
- package/dist/services/audit/red-line-catalog-p2-a.d.ts +0 -6
- package/dist/services/audit/red-line-catalog-p2-a.js +230 -1
- package/dist/services/audit/static-service.d.ts +32 -25
- package/dist/services/audit/static-service.js +30 -109
- package/dist/services/audit-independent/index.d.ts +2 -0
- package/dist/services/audit-independent/index.js +2 -0
- package/dist/services/autonomous-swarm/autonomous-swarm-service.d.ts +127 -0
- package/dist/services/autonomous-swarm/autonomous-swarm-service.js +446 -0
- package/dist/services/changeset/changeset-check-service.d.ts +22 -0
- package/dist/services/changeset/changeset-check-service.js +47 -0
- package/dist/services/code/auto-compact-modes.d.ts +30 -0
- package/dist/services/code/auto-compact-modes.js +38 -0
- package/dist/services/code/auto-compact-orchestrator.d.ts +43 -5
- package/dist/services/code/auto-compact-orchestrator.js +101 -21
- package/dist/services/code/dag-orchestrator.d.ts +30 -1
- package/dist/services/code/dag-orchestrator.js +106 -1
- package/dist/services/code/status-line-renderer.d.ts +2 -0
- package/dist/services/code/status-line-renderer.js +21 -3
- package/dist/services/code-review/ocr-service.d.ts +1 -1
- package/dist/services/code-review/ocr-service.js +6 -3
- package/dist/services/compact-history/compact-history-service.d.ts +41 -0
- package/dist/services/compact-history/compact-history-service.js +62 -0
- package/dist/services/compact-statusline/compact-statusline-service.d.ts +16 -0
- package/dist/services/compact-statusline/compact-statusline-service.js +83 -0
- package/dist/services/config/config-service.d.ts +1 -12
- package/dist/services/config/config-service.js +3 -72
- package/dist/services/config/config-types.d.ts +2 -4
- package/dist/services/config/config-types.js +1 -1
- package/dist/services/container/container-lease.d.ts +67 -0
- package/dist/services/container/container-lease.js +135 -0
- package/dist/services/context/auto-compact-dispatcher.d.ts +40 -5
- package/dist/services/context/auto-compact-dispatcher.js +32 -102
- package/dist/services/context/auto-compact-reader.js +1 -1
- package/dist/services/context/auto-compact-types.d.ts +27 -2
- package/dist/services/context/auto-compact-types.js +8 -1
- package/dist/services/context/build-dispatch-system-prompt.d.ts +75 -0
- package/dist/services/context/build-dispatch-system-prompt.js +117 -0
- package/dist/services/context/collector.d.ts +2 -2
- package/dist/services/context/context-builder.d.ts +4 -4
- package/dist/services/context/context-schema.d.ts +48 -48
- package/dist/services/context/ide-detect.d.ts +4 -0
- package/dist/services/context/ide-detect.js +24 -0
- package/dist/services/context/main-session-monitor.d.ts +1 -4
- package/dist/services/context/main-session-monitor.js +1 -24
- package/dist/services/context/memory-index-reader.d.ts +8 -0
- package/dist/services/context/memory-index-reader.js +57 -0
- package/dist/services/context/memory-lru-cache.d.ts +12 -0
- package/dist/services/context/memory-lru-cache.js +60 -0
- package/dist/services/context/memory-preflight-config.d.ts +19 -0
- package/dist/services/context/memory-preflight-config.js +25 -0
- package/dist/services/context/memory-preflight-service.d.ts +19 -0
- package/dist/services/context/memory-preflight-service.js +120 -0
- package/dist/services/context/spillover-store.d.ts +23 -0
- package/dist/services/context/spillover-store.js +155 -0
- package/dist/services/context/spillover-types.d.ts +18 -0
- package/dist/services/context/spillover-types.js +1 -0
- package/dist/services/crystallization/crystallization-service.d.ts +22 -5
- package/dist/services/crystallization/crystallization-service.js +8 -14
- package/dist/services/crystallization/crystallization-types.d.ts +6 -6
- package/dist/services/crystallization/evidence-brief-builder.d.ts +1 -1
- package/dist/services/crystallization/index.d.ts +13 -0
- package/dist/services/crystallization/index.js +13 -0
- package/dist/services/dashboard/project-dashboard-service.js +2 -2
- package/dist/services/dispatch/await-batch.d.ts +70 -0
- package/dist/services/dispatch/await-batch.js +272 -0
- package/dist/services/dispatch/batch-counter.js +1 -1
- package/dist/services/dispatch/dispatch-record-writer.d.ts +126 -4
- package/dist/services/dispatch/dispatch-record-writer.js +239 -9
- package/dist/services/dispatch/slice-dag.d.ts +46 -0
- package/dist/services/dispatch/slice-dag.js +6 -0
- package/dist/services/dispatch/stage-enum.d.ts +27 -0
- package/dist/services/dispatch/stage-enum.js +48 -0
- package/dist/services/dispatch/startup-timeout.d.ts +86 -0
- package/dist/services/dispatch/startup-timeout.js +97 -0
- package/dist/services/dispatch/sub-agent-dispatcher.js +40 -89
- package/dist/services/dispatch/test-tool-detection.d.ts +25 -1
- package/dist/services/dispatch/test-tool-detection.js +80 -0
- package/dist/services/doctor/doctor-service/checks/check-id-schema.d.ts +18 -0
- package/dist/services/doctor/doctor-service/checks/check-id-schema.js +64 -0
- package/dist/services/doctor/doctor-service/checks/codegraph-capability.d.ts +14 -0
- package/dist/services/doctor/doctor-service/checks/codegraph-capability.js +69 -0
- package/dist/services/doctor/doctor-service/checks/dist-source-version.d.ts +32 -0
- package/dist/services/doctor/doctor-service/checks/dist-source-version.js +110 -0
- package/dist/services/doctor/doctor-service/checks/gateguard-conflict.d.ts +24 -0
- package/dist/services/doctor/doctor-service/checks/gateguard-conflict.js +164 -0
- package/dist/services/doctor/doctor-service/checks/l3-memory-health.d.ts +16 -0
- package/dist/services/doctor/doctor-service/checks/l3-memory-health.js +57 -0
- package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.d.ts +19 -0
- package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.js +66 -0
- package/dist/services/doctor/doctor-service/checks/schema-validity.d.ts +10 -0
- package/dist/services/doctor/doctor-service/checks/schema-validity.js +33 -0
- package/dist/services/doctor/doctor-service/checks/skill-apply-note.d.ts +20 -0
- package/dist/services/doctor/doctor-service/checks/skill-apply-note.js +85 -0
- package/dist/services/doctor/doctor-service/checks/skill-existence.d.ts +13 -0
- package/dist/services/doctor/doctor-service/checks/skill-existence.js +30 -0
- package/dist/services/doctor/doctor-service/checks/skill-name-match.d.ts +10 -0
- package/dist/services/doctor/doctor-service/checks/skill-name-match.js +25 -0
- package/dist/services/doctor/doctor-service/checks/skill-parse.d.ts +10 -0
- package/dist/services/doctor/doctor-service/checks/skill-parse.js +19 -0
- package/dist/services/doctor/doctor-service/checks/skill-presence.d.ts +21 -0
- package/dist/services/doctor/doctor-service/checks/skill-presence.js +75 -0
- package/dist/services/doctor/doctor-service/checks/skill-runbook.d.ts +14 -0
- package/dist/services/doctor/doctor-service/checks/skill-runbook.js +47 -0
- package/dist/services/doctor/doctor-service/checks/statusline-install.d.ts +14 -0
- package/dist/services/doctor/doctor-service/checks/statusline-install.js +32 -0
- package/dist/services/doctor/doctor-service/checks/statusline-runtime.d.ts +13 -0
- package/dist/services/doctor/doctor-service/checks/statusline-runtime.js +30 -0
- package/dist/services/doctor/doctor-service/checks/user-config.d.ts +11 -0
- package/dist/services/doctor/doctor-service/checks/user-config.js +27 -0
- package/dist/services/doctor/doctor-service/checks/workspace-init.d.ts +16 -0
- package/dist/services/doctor/doctor-service/checks/workspace-init.js +34 -0
- package/dist/services/doctor/doctor-service/checks/workspace-layout.d.ts +33 -0
- package/dist/services/doctor/doctor-service/checks/workspace-layout.js +180 -0
- package/dist/services/doctor/doctor-service/index.d.ts +48 -0
- package/dist/services/doctor/doctor-service/index.js +254 -0
- package/dist/services/doctor/doctor-service/plugin-registry.d.ts +41 -0
- package/dist/services/doctor/doctor-service/plugin-registry.js +77 -0
- package/dist/services/doctor/doctor-service/report/final-summary.d.ts +20 -0
- package/dist/services/doctor/doctor-service/report/final-summary.js +29 -0
- package/dist/services/doctor/doctor-service/types.d.ts +245 -0
- package/dist/services/doctor/doctor-service/types.js +15 -0
- package/dist/services/doctor/doctor-service.d.ts +15 -146
- package/dist/services/doctor/doctor-service.js +22 -926
- package/dist/services/doctor/index.d.ts +22 -0
- package/dist/services/doctor/index.js +22 -0
- package/dist/services/env/shell-probe.d.ts +71 -0
- package/dist/services/env/shell-probe.js +161 -0
- package/dist/services/evolution/evolution-types.d.ts +39 -39
- package/dist/services/final-review/final-review-service.d.ts +11 -1
- package/dist/services/final-review/index.d.ts +2 -0
- package/dist/services/final-review/index.js +1 -0
- package/dist/services/hooks/auto-compact-hook-install.d.ts +4 -5
- package/dist/services/hooks/auto-compact-hook-install.js +4 -5
- package/dist/services/hooks/worktree-authorization-gate.d.ts +205 -0
- package/dist/services/hooks/worktree-authorization-gate.js +492 -0
- package/dist/services/ide/adapters/claude-code-adapter.js +2 -2
- package/dist/services/ide/adapters/qoder-adapter.d.ts +25 -0
- package/dist/services/ide/adapters/qoder-adapter.js +57 -0
- package/dist/services/ide/adapters/tongyi-lingma-adapter.d.ts +16 -0
- package/dist/services/ide/adapters/tongyi-lingma-adapter.js +45 -0
- package/dist/services/ide/ide-registry.js +6 -0
- package/dist/services/ide/ide-types.d.ts +1 -1
- package/dist/services/job/job-types.d.ts +56 -56
- package/dist/services/job-snapshot/index.d.ts +8 -0
- package/dist/services/job-snapshot/index.js +7 -0
- package/dist/services/{job/job-resource-snapshot.d.ts → job-snapshot/snapshot.d.ts} +1 -1
- package/dist/services/job-snapshot/types.d.ts +7 -0
- package/dist/services/job-snapshot/types.js +1 -0
- package/dist/services/karpathy-cost/karpathy-cost-check-service.d.ts +67 -0
- package/dist/services/karpathy-cost/karpathy-cost-check-service.js +108 -0
- package/dist/services/log/retention.d.ts +16 -0
- package/dist/services/log/retention.js +17 -0
- package/dist/services/loop/loop-bee-relation-types.d.ts +6 -6
- package/dist/services/loop/loop-release-types.d.ts +24 -24
- package/dist/services/loop/monotonic-runner.d.ts +17 -11
- package/dist/services/loop/monotonic-runner.js +118 -79
- package/dist/services/memory/project-memory-service/index/kind-dispatch.d.ts +8 -0
- package/dist/services/memory/project-memory-service/index/kind-dispatch.js +253 -0
- package/dist/services/memory/project-memory-service/index/ranking.d.ts +6 -0
- package/dist/services/memory/project-memory-service/index/ranking.js +171 -0
- package/dist/services/memory/project-memory-service/index/search.d.ts +34 -0
- package/dist/services/memory/project-memory-service/index/search.js +194 -0
- package/dist/services/memory/project-memory-service/index.d.ts +9 -0
- package/dist/services/memory/project-memory-service/index.js +24 -0
- package/dist/services/memory/project-memory-service/parsers/frontmatter.d.ts +9 -0
- package/dist/services/memory/project-memory-service/parsers/frontmatter.js +106 -0
- package/dist/services/memory/project-memory-service/parsers/markdown-pure.d.ts +7 -0
- package/dist/services/memory/project-memory-service/parsers/markdown-pure.js +96 -0
- package/dist/services/memory/project-memory-service/store/atomic-write.d.ts +5 -0
- package/dist/services/memory/project-memory-service/store/atomic-write.js +56 -0
- package/dist/services/memory/project-memory-service/store/paths.d.ts +8 -0
- package/dist/services/memory/project-memory-service/store/paths.js +116 -0
- package/dist/services/memory/project-memory-service/types.d.ts +128 -0
- package/dist/services/memory/project-memory-service/types.js +9 -0
- package/dist/services/memory/project-memory-service.d.ts +1 -167
- package/dist/services/memory/project-memory-service.js +19 -816
- package/dist/services/migrate-skill-name/schema.d.ts +2 -2
- package/dist/services/observability/aggregation.d.ts +27 -0
- package/dist/services/observability/aggregation.js +72 -0
- package/dist/services/observability/observability-service.d.ts +73 -7
- package/dist/services/observability/observability-service.js +87 -1
- package/dist/services/openspec/artifact-boundary.d.ts +138 -0
- package/dist/services/openspec/artifact-boundary.js +150 -0
- package/dist/services/openspec/coverage-evidence-reader.d.ts +191 -0
- package/dist/services/openspec/coverage-evidence-reader.js +386 -0
- package/dist/services/openspec/openspec-archive-service.d.ts +70 -0
- package/dist/services/openspec/openspec-archive-service.js +320 -8
- package/dist/services/openspec/openspec-bridge-service.js +1 -1
- package/dist/services/openspec/openspec-init-service.js +1 -1
- package/dist/services/openspec/openspec-propose-from-doctor-service.js +1 -1
- package/dist/services/openspec/openspec-render-service.js +7 -4
- package/dist/services/openspec/openspec-scan-service.js +1 -1
- package/dist/services/openspec/openspec-validate-service.js +5 -4
- package/dist/services/preferences/preferences-service.js +10 -0
- package/dist/services/preferences/preferences-types.d.ts +13 -0
- package/dist/services/preferences/preferences-types.js +11 -0
- package/dist/services/qa/screenshot-archive-service.d.ts +51 -0
- package/dist/services/qa/screenshot-archive-service.js +134 -0
- package/dist/services/rd/rd-service.js +10 -11
- package/dist/services/rd/types.d.ts +32 -32
- package/dist/services/rd-swarm/rd-swarm-service.d.ts +60 -0
- package/dist/services/rd-swarm/rd-swarm-service.js +93 -0
- package/dist/services/recommendations/capability-seed-items.js +0 -1
- package/dist/services/recommendations/capability-seed-mappings.js +0 -1
- package/dist/services/recommendations/capability-seed-sources.js +0 -1
- package/dist/services/release/version-precheck-service.d.ts +51 -0
- package/dist/services/release/version-precheck-service.js +257 -0
- package/dist/services/scan/acceptance-coverage-service.js +1 -1
- package/dist/services/scan/archetype-service.js +1 -1
- package/dist/services/scan/existing-system-service.js +1 -1
- package/dist/services/scan/libraries-service.js +1 -1
- package/dist/services/sediment/json-schema.d.ts +40 -40
- package/dist/services/share/bundle-types.d.ts +12 -12
- package/dist/services/share/run-state-contract.d.ts +2 -2
- package/dist/services/skill/skill-search-service.d.ts +12 -7
- package/dist/services/skill/skill-search-service.js +8 -4
- package/dist/services/skillhub/migrations/001-initial.sql +71 -0
- package/dist/services/skillhub/migrations/002-loop-release.sql +32 -0
- package/dist/services/skillhub/migrations/003-loop-bee-relation.sql +35 -0
- package/dist/services/skillhub/migrations/004-loop-bee-extension.sql +65 -0
- package/dist/services/skillhub/migrations/005-evolution-evaluation.sql +81 -0
- package/dist/services/skillhub/migrations/006-crystallization-event.sql +92 -0
- package/dist/services/skills/hooks-settings-service.d.ts +75 -0
- package/dist/services/skills/hooks-settings-service.js +230 -2
- package/dist/services/skills/skill-registry.d.ts +1 -0
- package/dist/services/skills/skill-registry.js +6 -4
- package/dist/services/skills/skill-runbook-service.js +1 -1
- package/dist/services/slice/slice-check-service.js +1 -1
- package/dist/services/standards/main-session-monitor-ban-hook.d.ts +14 -0
- package/dist/services/standards/main-session-monitor-ban-hook.js +19 -0
- package/dist/services/standards/missing-standards-detector.d.ts +25 -0
- package/dist/services/standards/missing-standards-detector.js +43 -12
- package/dist/services/tech/tech-change-id-service.d.ts +82 -0
- package/dist/services/tech/tech-change-id-service.js +117 -0
- package/dist/services/understand/understand-hybrid-service.js +1 -1
- package/dist/services/understand/understand-scan-service.js +2 -2
- package/dist/services/upgrade/upgrade-service.js +4 -3
- package/dist/services/verdict/envelopes.d.ts +2 -2
- package/dist/services/verdict/envelopes.js +2 -2
- package/dist/services/verdict/verdict-aggregator.d.ts +3 -3
- package/dist/services/vm/vm-lease.d.ts +40 -0
- package/dist/services/vm/vm-lease.js +137 -0
- package/dist/services/workflow/autonomous-resume-writer.js +1 -1
- package/dist/services/workflow/pipeline-verify-gate-support.d.ts +47 -0
- package/dist/services/workflow/pipeline-verify-gate-support.js +194 -0
- package/dist/services/workflow/pipeline-verify-service.d.ts +17 -81
- package/dist/services/workflow/pipeline-verify-service.js +42 -218
- package/dist/services/workflow/pipeline-verify-types.d.ts +90 -0
- package/dist/services/workflow/pipeline-verify-types.js +10 -0
- package/dist/services/workflow/plan-reader.d.ts +1 -1
- package/dist/services/workflow/plan-reader.js +1 -1
- package/dist/services/workflow/plan-refresher.d.ts +1 -1
- package/dist/services/workflow/plan-refresher.js +1 -1
- package/dist/services/workflow/plan-trigger-detector.d.ts +1 -1
- package/dist/services/workflow/plan-trigger-detector.js +1 -1
- package/dist/services/workflow/workflow-autonomous-resume-helpers.d.ts +1 -1
- package/dist/services/workflow/workflow-autonomous-service.d.ts +2 -98
- package/dist/services/workflow/workflow-autonomous-types.d.ts +114 -0
- package/dist/services/workflow/workflow-autonomous-types.js +21 -0
- package/dist/services/workflow/workflow-router-service.js +18 -16
- package/dist/services/workflow/workflow-spec-lint.d.ts +13 -0
- package/dist/services/workflow/workflow-spec-lint.js +75 -0
- package/dist/services/workflow/workflow-spec-types.d.ts +100 -0
- package/dist/services/workflow/workflow-spec-types.js +13 -0
- package/dist/services/workflow/workflow-spec-yaml.d.ts +17 -0
- package/dist/services/workflow/workflow-spec-yaml.js +88 -0
- package/dist/services/workflow/workflow-spec.d.ts +11 -91
- package/dist/services/workflow/workflow-spec.js +16 -145
- package/dist/services/workspace/migrate-service.js +1 -1
- package/dist/services/workspace/workspace-service.js +1 -1
- package/dist/services/worktree/worktree-lease.d.ts +170 -0
- package/dist/services/worktree/worktree-lease.js +242 -0
- package/package.json +91 -51
- package/scripts/clean-dist.mjs +31 -1
- package/scripts/copy-templates.mjs +16 -0
- package/scripts/sync-version.mjs +53 -2
- package/skills/bee/peaks-perf-audit/SKILL.md +17 -0
- package/skills/bee/peaks-prd/SKILL.md +16 -0
- package/skills/bee/peaks-prd/test-prompts.json +12 -0
- package/skills/bee/peaks-qa/SKILL.md +16 -1
- package/skills/bee/peaks-qa/references/qa-sub-agent-dispatch.md +22 -0
- package/skills/bee/peaks-qa/test-prompts.json +12 -0
- package/skills/bee/peaks-rd/SKILL.md +29 -20
- package/skills/bee/peaks-rd/references/rd-sub-agent-dispatch.md +39 -0
- package/skills/bee/peaks-rd/test-prompts.json +12 -0
- package/skills/bee/peaks-reviewer/SKILL.md +17 -0
- package/skills/bee/peaks-sc/SKILL.md +16 -0
- package/skills/bee/peaks-security-audit/SKILL.md +17 -0
- package/skills/bee/peaks-txt/SKILL.md +16 -0
- package/skills/bee/peaks-txt/test-prompts.json +12 -0
- package/skills/bee/peaks-ui/SKILL.md +49 -43
- package/skills/bee/peaks-ui/test-prompts.json +12 -0
- package/skills/peaks-code/SKILL.md +54 -109
- package/skills/peaks-code/references/boundaries.md +15 -1
- package/skills/peaks-code/references/cron-scheduler-deployment.md +313 -0
- package/skills/peaks-code/references/external-skill-invocation.md +27 -0
- package/skills/peaks-code/references/lease-dashboard.html +224 -0
- package/skills/peaks-code/references/lease-stats.sample.json +26 -0
- package/skills/peaks-code/references/peaks-worktree-l2-enforcers.md +208 -0
- package/skills/peaks-code/references/periodic-checkpoint.md +4 -4
- package/skills/peaks-code/references/runbook.md +63 -1
- package/skills/peaks-code/references/startup-sequence.md +110 -0
- package/skills/peaks-code/references/step-0-8-gate.md +1 -1
- package/skills/peaks-code/references/sub-agent-dispatch.md +92 -1
- package/skills/peaks-code/references/worktree-governance.md +123 -0
- package/skills/peaks-code/test-prompts.json +12 -0
- package/skills/peaks-doctor/SKILL.md +1 -1
- package/skills/peaks-ide/SKILL.md +1 -1
- package/skills/peaks-solo/SKILL.md +21 -0
- package/skills/peaks-solo/references/triage-decision-table.md +6 -0
- package/skills/peaks-sop/test-prompts.json +17 -0
- package/dist/cli/commands/agent-commands.d.ts +0 -20
- package/dist/cli/commands/agent-commands.js +0 -48
- package/dist/cli/commands/classify-classify-commands.d.ts +0 -19
- package/dist/cli/commands/classify-classify-commands.js +0 -151
- package/dist/cli/commands/contract-commands.d.ts +0 -26
- package/dist/cli/commands/contract-commands.js +0 -114
- package/dist/cli/commands/session-auto-compact-hook-command.d.ts +0 -37
- package/dist/cli/commands/session-auto-compact-hook-command.js +0 -127
- package/dist/cli/commands/worker-commands.d.ts +0 -3
- package/dist/cli/commands/worker-commands.js +0 -52
- package/dist/services/agent/ecc-agent-service.d.ts +0 -47
- package/dist/services/agent/ecc-agent-service.js +0 -143
- package/dist/services/config/provider-service.d.ts +0 -48
- package/dist/services/config/provider-service.js +0 -143
- package/dist/services/context/dispatch-context-guard.d.ts +0 -27
- package/dist/services/context/dispatch-context-guard.js +0 -192
- package/dist/services/context/shared-channel.d.ts +0 -93
- package/dist/services/context/shared-channel.js +0 -308
- package/dist/services/filesystem/file-lock.d.ts +0 -11
- package/dist/services/filesystem/file-lock.js +0 -152
- package/dist/services/mut/assert-scanner.d.ts +0 -6
- package/dist/services/mut/assert-scanner.js +0 -116
- package/dist/services/mut/index.d.ts +0 -8
- package/dist/services/mut/index.js +0 -7
- package/dist/services/mut/mut-runner.d.ts +0 -39
- package/dist/services/mut/mut-runner.js +0 -29
- package/dist/services/mut/production-stryker.d.ts +0 -2
- package/dist/services/mut/production-stryker.js +0 -75
- package/dist/services/mut/report-builder.d.ts +0 -11
- package/dist/services/mut/report-builder.js +0 -110
- package/dist/services/mut/report-loader.d.ts +0 -31
- package/dist/services/mut/report-loader.js +0 -78
- package/dist/services/mut/thresholds.d.ts +0 -21
- package/dist/services/mut/thresholds.js +0 -22
- package/dist/services/mut/types.d.ts +0 -336
- package/dist/services/mut/types.js +0 -59
- package/dist/services/providers/minimax-provider-service.d.ts +0 -24
- package/dist/services/providers/minimax-provider-service.js +0 -143
- package/dist/services/providers/minimax-worker-service.d.ts +0 -21
- package/dist/services/providers/minimax-worker-service.js +0 -83
- package/dist/shared/fs.d.ts +0 -4
- package/dist/shared/fs.js +0 -26
- package/dist/shared/paths.d.ts +0 -6
- package/dist/shared/paths.js +0 -50
- package/dist/shared/result.d.ts +0 -22
- package/dist/shared/result.js +0 -46
- package/dist/shared/version.d.ts +0 -1
- package/dist/shared/version.js +0 -1
- package/examples/video-demo/README.md +0 -142
- package/examples/video-demo/out/en-closing-960.png +0 -0
- package/examples/video-demo/out/zh-closing-960.png +0 -0
- package/examples/video-demo/preview/peaks-loop-demo-en.mp4 +0 -0
- package/examples/video-demo/preview/peaks-loop-demo.mp4 +0 -0
- /package/dist/services/{job/job-resource-snapshot.js → job-snapshot/snapshot.js} +0 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* doctor-service facade (slice rid-004).
|
|
3
|
+
*
|
|
4
|
+
* Public entrypoint for the code-driven fixed-registry doctor
|
|
5
|
+
* pipeline. Replaces the legacy 1309-line monolithic `runDoctor`
|
|
6
|
+
* with a thin dispatcher that:
|
|
7
|
+
*
|
|
8
|
+
* 1. Resolves all cross-domain injections (project-root resolver,
|
|
9
|
+
* skill loader, sid validator, schema root, presence, etc.)
|
|
10
|
+
* and builds a read-only `DoctorContext` once.
|
|
11
|
+
* 2. Walks the `PLUGINS` array in `plugin-registry.ts` in order,
|
|
12
|
+
* calling each plugin's `run(context)`, flattening the
|
|
13
|
+
* returned `DoctorCheck[]` into the accumulator.
|
|
14
|
+
* 3. Updates `context.accumulatedChecks` after each plugin so the
|
|
15
|
+
* `check-id-schema` self-validation plugin observes the full
|
|
16
|
+
* prior list.
|
|
17
|
+
* 4. Hands the accumulated checks to `report/final-summary.ts`
|
|
18
|
+
* which builds the public `DoctorReport`.
|
|
19
|
+
*
|
|
20
|
+
* The `runDoctor` signature is unchanged from the legacy version;
|
|
21
|
+
* main peaks-loop package imports it via
|
|
22
|
+
* `import { runDoctor } from '../index.js'`.
|
|
23
|
+
*
|
|
24
|
+
* slice-3b Option C: the doctor package stays standalone by
|
|
25
|
+
* accepting the cross-domain utilities as injectable probes. When
|
|
26
|
+
* no injection is provided, the doctor falls back to a safe
|
|
27
|
+
* "no-op / assume healthy" probe so the standalone test suite
|
|
28
|
+
* does not depend on the main package. The CLI wires the main-
|
|
29
|
+
* package implementations at call-site
|
|
30
|
+
* (`src/cli/commands/core/doctor-command.ts`).
|
|
31
|
+
*/
|
|
32
|
+
import { existsSync } from 'node:fs';
|
|
33
|
+
import { dirname, join } from 'node:path';
|
|
34
|
+
import { schemasDir, skillsDir } from 'peaks-loop-shared/paths';
|
|
35
|
+
import { PLUGINS } from './plugin-registry.js';
|
|
36
|
+
import { buildReport } from './report/final-summary.js';
|
|
37
|
+
/**
|
|
38
|
+
* slice-3b Option C: inlined sid regex. The main package's canonical
|
|
39
|
+
* definition lives in `src/services/workspace/sid-naming-guard.ts`. The
|
|
40
|
+
* regex MUST stay byte-identical with that file. If
|
|
41
|
+
* `sid-naming-guard.ts` is ever moved to `peaks-loop-shared`, swap this
|
|
42
|
+
* for a `peaks-loop-shared/workspace/sid-naming-guard` import and drop
|
|
43
|
+
* the inlined copy.
|
|
44
|
+
*/
|
|
45
|
+
const VALID_SID_REGEX = /^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])-session-[0-9a-z]{3,6}$/;
|
|
46
|
+
function defaultIsValidSessionId(sid) {
|
|
47
|
+
return VALID_SID_REGEX.test(sid);
|
|
48
|
+
}
|
|
49
|
+
function defaultProjectRootResolver() {
|
|
50
|
+
// slice-3b Option C: minimal in-package project-root resolver.
|
|
51
|
+
// Mirrors the high-level behaviour of the main package's
|
|
52
|
+
// `findProjectRoot` (src/services/config/config-safety.ts) without
|
|
53
|
+
// pulling in its full safety-validation surface. The CLI may
|
|
54
|
+
// inject a richer resolver at call-site.
|
|
55
|
+
let current = process.cwd();
|
|
56
|
+
let pkgRoot = null;
|
|
57
|
+
while (true) {
|
|
58
|
+
const parent = dirname(current);
|
|
59
|
+
if (parent === current) {
|
|
60
|
+
return pkgRoot;
|
|
61
|
+
}
|
|
62
|
+
if (existsSync(join(current, '.peaks', 'config.json'))) {
|
|
63
|
+
return current;
|
|
64
|
+
}
|
|
65
|
+
if (existsSync(join(current, '.git'))) {
|
|
66
|
+
return current;
|
|
67
|
+
}
|
|
68
|
+
if (pkgRoot === null && existsSync(join(current, 'package.json'))) {
|
|
69
|
+
pkgRoot = current;
|
|
70
|
+
}
|
|
71
|
+
current = parent;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Pure helper extracted so tests can drive the filesystem check
|
|
76
|
+
* without monkey-patching `process.cwd()` or `findProjectRoot`.
|
|
77
|
+
* Returns `true` when EITHER the canonical
|
|
78
|
+
* `.peaks/_runtime/session.json` OR the legacy
|
|
79
|
+
* `.peaks/.session.json` exists.
|
|
80
|
+
*/
|
|
81
|
+
export function isWorkspaceInitializedAt(projectRoot) {
|
|
82
|
+
return (existsSync(join(projectRoot, '.peaks', '_runtime', 'session.json')) ||
|
|
83
|
+
existsSync(join(projectRoot, '.peaks', '.session.json')));
|
|
84
|
+
}
|
|
85
|
+
function defaultWorkspaceInitializedProbe(projectRootResolver) {
|
|
86
|
+
const projectRoot = projectRootResolver();
|
|
87
|
+
if (projectRoot === null)
|
|
88
|
+
return false;
|
|
89
|
+
// Workspace is "initialized" when EITHER the canonical runtime-layer
|
|
90
|
+
// session binding (`.peaks/_runtime/session.json`) OR the legacy
|
|
91
|
+
// top-level binding (`.peaks/.session.json`, kept as read-only
|
|
92
|
+
// back-compat for one minor release) is present.
|
|
93
|
+
return isWorkspaceInitializedAt(projectRoot);
|
|
94
|
+
}
|
|
95
|
+
async function defaultLoadSkills(baseDir, listDirectories, pathExists, readText) {
|
|
96
|
+
// slice-3b Option C: minimal skill-loader. Walks
|
|
97
|
+
// `<baseDir>/*/SKILL.md` (and one level into `bee/`, mirroring the
|
|
98
|
+
// upstream `skill-registry.ts`), parses the frontmatter, and returns
|
|
99
|
+
// `{ skills, failures }`. The CLI may inject a richer loader at
|
|
100
|
+
// call-site.
|
|
101
|
+
const target = baseDir ?? skillsDir;
|
|
102
|
+
if (!(await pathExists(target))) {
|
|
103
|
+
return { skills: [], failures: [] };
|
|
104
|
+
}
|
|
105
|
+
const skills = [];
|
|
106
|
+
const failures = [];
|
|
107
|
+
const directories = await listDirectories(target);
|
|
108
|
+
for (const directory of directories) {
|
|
109
|
+
if (directory === 'bee') {
|
|
110
|
+
const subEntries = await listDirectories(join(target, 'bee'));
|
|
111
|
+
for (const subDir of subEntries) {
|
|
112
|
+
const skillPath = join(target, 'bee', subDir, 'SKILL.md');
|
|
113
|
+
if (!(await pathExists(skillPath)))
|
|
114
|
+
continue;
|
|
115
|
+
try {
|
|
116
|
+
const { name } = parseDoctorSkillFrontmatter(await readText(skillPath));
|
|
117
|
+
skills.push({ name, directory: subDir, skillPath });
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
failures.push({ directory: subDir, skillPath, message: getErrorMessageLite(error) });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const skillPath = join(target, directory, 'SKILL.md');
|
|
126
|
+
if (!(await pathExists(skillPath)))
|
|
127
|
+
continue;
|
|
128
|
+
try {
|
|
129
|
+
const { name } = parseDoctorSkillFrontmatter(await readText(skillPath));
|
|
130
|
+
skills.push({ name, directory, skillPath });
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
failures.push({ directory, skillPath, message: getErrorMessageLite(error) });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
skills.sort((left, right) => left.name.localeCompare(right.name));
|
|
137
|
+
failures.sort((left, right) => left.directory.localeCompare(right.directory));
|
|
138
|
+
return { skills, failures };
|
|
139
|
+
}
|
|
140
|
+
function parseDoctorSkillFrontmatter(body) {
|
|
141
|
+
// slice-3b Option C: minimal SKILL.md frontmatter parser. The
|
|
142
|
+
// doctor only needs `name` and `description` for the
|
|
143
|
+
// skill-name-matches-directory and skill-runbook checks.
|
|
144
|
+
const lines = body.split(/\r?\n/);
|
|
145
|
+
if (lines[0] !== '---') {
|
|
146
|
+
throw new Error('Missing YAML frontmatter opening marker');
|
|
147
|
+
}
|
|
148
|
+
const endIndex = lines.findIndex((line, index) => index > 0 && line === '---');
|
|
149
|
+
if (endIndex === -1) {
|
|
150
|
+
throw new Error('Missing YAML frontmatter closing marker');
|
|
151
|
+
}
|
|
152
|
+
const metadata = {};
|
|
153
|
+
for (let index = 1; index < endIndex; index += 1) {
|
|
154
|
+
const line = lines[index];
|
|
155
|
+
if (line === undefined)
|
|
156
|
+
continue;
|
|
157
|
+
const trimmed = line.trim();
|
|
158
|
+
if (trimmed.length === 0)
|
|
159
|
+
continue;
|
|
160
|
+
const match = /^([A-Za-z0-9_.-]+):\s*(.*)$/.exec(trimmed);
|
|
161
|
+
if (match?.[1] === undefined)
|
|
162
|
+
continue;
|
|
163
|
+
metadata[match[1]] = (match[2] ?? '').trim().replace(/^['"]|['"]$/g, '');
|
|
164
|
+
}
|
|
165
|
+
if (!metadata.name) {
|
|
166
|
+
throw new Error('Missing required frontmatter field: name');
|
|
167
|
+
}
|
|
168
|
+
if (!metadata.description) {
|
|
169
|
+
throw new Error('Missing required frontmatter field: description');
|
|
170
|
+
}
|
|
171
|
+
return { name: metadata.name, description: metadata.description };
|
|
172
|
+
}
|
|
173
|
+
function getErrorMessageLite(error) {
|
|
174
|
+
if (error instanceof Error)
|
|
175
|
+
return error.message;
|
|
176
|
+
return String(error);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Public entrypoint. Walks the `PLUGINS` array, building the
|
|
180
|
+
* `DoctorContext` once at the top and threading it through every
|
|
181
|
+
* plugin. The accumulator is a mutable list shared via
|
|
182
|
+
* `context.accumulatedChecks` so plugins like `check-id-schema`
|
|
183
|
+
* that need to observe the prior list can do so.
|
|
184
|
+
*/
|
|
185
|
+
export async function runDoctor(options = {}) {
|
|
186
|
+
// slice-3b Option C: resolve the cross-domain injections up front.
|
|
187
|
+
const projectRootResolver = options.projectRootResolver ?? defaultProjectRootResolver;
|
|
188
|
+
const isValidSessionId = options.isValidSessionIdProbe ?? defaultIsValidSessionId;
|
|
189
|
+
const fsModule = await import('peaks-loop-shared/fs');
|
|
190
|
+
const listDirectoriesImpl = (target) => fsModule.listDirectories(target);
|
|
191
|
+
const pathExistsImpl = (target) => fsModule.pathExists(target);
|
|
192
|
+
const readTextImpl = (target) => fsModule.readText(target);
|
|
193
|
+
const loadSkills = options.loadSkills ?? ((baseDir) => defaultLoadSkills(baseDir, listDirectoriesImpl, pathExistsImpl, readTextImpl));
|
|
194
|
+
const registry = await loadSkills(options.skillsBaseDir);
|
|
195
|
+
const skills = registry.skills;
|
|
196
|
+
const schemaRoot = options.schemasBaseDir ?? schemasDir;
|
|
197
|
+
// Skill presence: probe once up front, swallowing probe errors.
|
|
198
|
+
let presence = null;
|
|
199
|
+
if (options.skillPresenceProbe !== undefined) {
|
|
200
|
+
try {
|
|
201
|
+
presence = options.skillPresenceProbe();
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
presence = null;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Workspace initialized: probe once up front, swallowing probe errors.
|
|
208
|
+
const workspaceProbe = options.workspaceInitializedProbe ?? (() => defaultWorkspaceInitializedProbe(projectRootResolver));
|
|
209
|
+
let workspaceInitialized = false;
|
|
210
|
+
try {
|
|
211
|
+
workspaceInitialized = workspaceProbe();
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
workspaceInitialized = false;
|
|
215
|
+
}
|
|
216
|
+
// Statusline installed: the legacy code uses a fallback wrapper that
|
|
217
|
+
// returns false when the CLI injects nothing. Replicate that here.
|
|
218
|
+
const statusLineProbe = options.statusLineInstalledProbe ?? (() => false);
|
|
219
|
+
let statusLineInstalled = false;
|
|
220
|
+
try {
|
|
221
|
+
statusLineInstalled = statusLineProbe();
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
statusLineInstalled = false;
|
|
225
|
+
}
|
|
226
|
+
const platform = options.platform ?? process.platform;
|
|
227
|
+
const resolvedL3Root = options.l3ProjectRoot ?? projectRootResolver() ?? process.cwd();
|
|
228
|
+
// Build the context. We use a mutable holder for the accumulator
|
|
229
|
+
// so plugins reading `context.accumulatedChecks` see prior
|
|
230
|
+
// emissions; the dispatcher updates the array reference after
|
|
231
|
+
// each plugin runs.
|
|
232
|
+
const accumulated = [];
|
|
233
|
+
const context = {
|
|
234
|
+
options,
|
|
235
|
+
registry,
|
|
236
|
+
skills,
|
|
237
|
+
schemaRoot,
|
|
238
|
+
presence,
|
|
239
|
+
workspaceInitialized,
|
|
240
|
+
statusLineInstalled,
|
|
241
|
+
platform,
|
|
242
|
+
resolvedL3Root,
|
|
243
|
+
projectRootResolver,
|
|
244
|
+
isValidSessionId,
|
|
245
|
+
accumulatedChecks: accumulated
|
|
246
|
+
};
|
|
247
|
+
for (const plugin of PLUGINS) {
|
|
248
|
+
const emitted = await plugin.run(context);
|
|
249
|
+
for (const check of emitted) {
|
|
250
|
+
accumulated.push(check);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return buildReport(accumulated);
|
|
254
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* doctor-service plugin registry (slice rid-004).
|
|
3
|
+
*
|
|
4
|
+
* Holds the fixed-order, code-driven list of `DoctorCheckPlugin`
|
|
5
|
+
* instances that `runDoctor` iterates. The order is the same as the
|
|
6
|
+
* legacy monolithic function body — preserving the on-disk check
|
|
7
|
+
* ordering keeps the existing `report.checks` array unchanged for
|
|
8
|
+
* every consumer (CLI summary, JSON output, schema self-check).
|
|
9
|
+
*
|
|
10
|
+
* Why code-driven (not data-driven):
|
|
11
|
+
* - Each check has distinct typed inputs (skills, presence, layout
|
|
12
|
+
* probe, gateguard probe, …) and conditional logic that a config
|
|
13
|
+
* table cannot express without losing type safety.
|
|
14
|
+
* - The check ordering is load-bearing — `skill-presence:workspace`
|
|
15
|
+
* depends on `presence` being probed, `doctor-self:check-id-pattern`
|
|
16
|
+
* depends on every prior check's IDs, and `L3:l3-orphan-sessions` /
|
|
17
|
+
* `L3:l3-memory-health` run last so they observe a clean post-F3
|
|
18
|
+
* layout. A config-driven registry would obscure that ordering
|
|
19
|
+
* and force callers to read two files to understand execution
|
|
20
|
+
* flow. Code-driven keeps it auditable in one place.
|
|
21
|
+
* - Adding a check is a code change in any case (the typed probe
|
|
22
|
+
* surface has to grow). A code-driven registry makes the diff
|
|
23
|
+
* self-contained.
|
|
24
|
+
*
|
|
25
|
+
* Adding a new check:
|
|
26
|
+
* 1. Create `checks/<your-check>.ts` exporting
|
|
27
|
+
* `export const check: DoctorCheckPlugin`.
|
|
28
|
+
* 2. Append `check` to the `PLUGINS` array below IN THE EXACT
|
|
29
|
+
* POSITION THE LEGACY MONOLITHIC FUNCTION EMITS IT.
|
|
30
|
+
* 3. If you need new context state, extend `DoctorContext` in
|
|
31
|
+
* `types.ts` and populate it in `index.ts`.
|
|
32
|
+
*/
|
|
33
|
+
import type { DoctorCheckPlugin } from './types.js';
|
|
34
|
+
/**
|
|
35
|
+
* Ordered list of doctor check plugins. The order mirrors the legacy
|
|
36
|
+
* monolithic `runDoctor` function body verbatim — DO NOT REORDER
|
|
37
|
+
* without first re-reading the consumer-side tests in
|
|
38
|
+
* `tests/doctor.test.ts` / `tests/doctor/35-checks-aggregate.test.ts`
|
|
39
|
+
* and updating the expected check-id list.
|
|
40
|
+
*/
|
|
41
|
+
export declare const PLUGINS: ReadonlyArray<DoctorCheckPlugin>;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* doctor-service plugin registry (slice rid-004).
|
|
3
|
+
*
|
|
4
|
+
* Holds the fixed-order, code-driven list of `DoctorCheckPlugin`
|
|
5
|
+
* instances that `runDoctor` iterates. The order is the same as the
|
|
6
|
+
* legacy monolithic function body — preserving the on-disk check
|
|
7
|
+
* ordering keeps the existing `report.checks` array unchanged for
|
|
8
|
+
* every consumer (CLI summary, JSON output, schema self-check).
|
|
9
|
+
*
|
|
10
|
+
* Why code-driven (not data-driven):
|
|
11
|
+
* - Each check has distinct typed inputs (skills, presence, layout
|
|
12
|
+
* probe, gateguard probe, …) and conditional logic that a config
|
|
13
|
+
* table cannot express without losing type safety.
|
|
14
|
+
* - The check ordering is load-bearing — `skill-presence:workspace`
|
|
15
|
+
* depends on `presence` being probed, `doctor-self:check-id-pattern`
|
|
16
|
+
* depends on every prior check's IDs, and `L3:l3-orphan-sessions` /
|
|
17
|
+
* `L3:l3-memory-health` run last so they observe a clean post-F3
|
|
18
|
+
* layout. A config-driven registry would obscure that ordering
|
|
19
|
+
* and force callers to read two files to understand execution
|
|
20
|
+
* flow. Code-driven keeps it auditable in one place.
|
|
21
|
+
* - Adding a check is a code change in any case (the typed probe
|
|
22
|
+
* surface has to grow). A code-driven registry makes the diff
|
|
23
|
+
* self-contained.
|
|
24
|
+
*
|
|
25
|
+
* Adding a new check:
|
|
26
|
+
* 1. Create `checks/<your-check>.ts` exporting
|
|
27
|
+
* `export const check: DoctorCheckPlugin`.
|
|
28
|
+
* 2. Append `check` to the `PLUGINS` array below IN THE EXACT
|
|
29
|
+
* POSITION THE LEGACY MONOLITHIC FUNCTION EMITS IT.
|
|
30
|
+
* 3. If you need new context state, extend `DoctorContext` in
|
|
31
|
+
* `types.ts` and populate it in `index.ts`.
|
|
32
|
+
*/
|
|
33
|
+
import { check as skillExistence } from './checks/skill-existence.js';
|
|
34
|
+
import { check as skillNameMatch } from './checks/skill-name-match.js';
|
|
35
|
+
import { check as skillParse } from './checks/skill-parse.js';
|
|
36
|
+
import { check as skillRunbook } from './checks/skill-runbook.js';
|
|
37
|
+
import { check as skillApplyNote } from './checks/skill-apply-note.js';
|
|
38
|
+
import { check as schemaValidity } from './checks/schema-validity.js';
|
|
39
|
+
import { check as userConfig } from './checks/user-config.js';
|
|
40
|
+
import { check as skillPresence } from './checks/skill-presence.js';
|
|
41
|
+
import { check as workspaceInit } from './checks/workspace-init.js';
|
|
42
|
+
import { check as statuslineInstall } from './checks/statusline-install.js';
|
|
43
|
+
import { check as statuslineRuntime } from './checks/statusline-runtime.js';
|
|
44
|
+
import { check as codegraphCapability } from './checks/codegraph-capability.js';
|
|
45
|
+
import { check as distSourceVersion } from './checks/dist-source-version.js';
|
|
46
|
+
import { check as workspaceLayout } from './checks/workspace-layout.js';
|
|
47
|
+
import { check as gateguardConflict } from './checks/gateguard-conflict.js';
|
|
48
|
+
import { check as checkIdSchema } from './checks/check-id-schema.js';
|
|
49
|
+
import { check as l3OrphanSessions } from './checks/l3-orphan-sessions.js';
|
|
50
|
+
import { check as l3MemoryHealth } from './checks/l3-memory-health.js';
|
|
51
|
+
/**
|
|
52
|
+
* Ordered list of doctor check plugins. The order mirrors the legacy
|
|
53
|
+
* monolithic `runDoctor` function body verbatim — DO NOT REORDER
|
|
54
|
+
* without first re-reading the consumer-side tests in
|
|
55
|
+
* `tests/doctor.test.ts` / `tests/doctor/35-checks-aggregate.test.ts`
|
|
56
|
+
* and updating the expected check-id list.
|
|
57
|
+
*/
|
|
58
|
+
export const PLUGINS = [
|
|
59
|
+
skillExistence, // id prefix "skill:"
|
|
60
|
+
skillNameMatch, // id prefix "skill-name:"
|
|
61
|
+
skillParse, // id prefix "skill-parse:"
|
|
62
|
+
skillRunbook, // id prefix "skill-runbook:"
|
|
63
|
+
skillApplyNote, // id prefix "skill-apply-note:"
|
|
64
|
+
schemaValidity, // id prefix "schema:"
|
|
65
|
+
userConfig, // id "config:user"
|
|
66
|
+
skillPresence, // ids "skill-presence:current" + "skill-presence:freshness"
|
|
67
|
+
workspaceInit, // id "skill-presence:workspace"
|
|
68
|
+
statuslineInstall, // id "statusline:install"
|
|
69
|
+
statuslineRuntime, // id "statusline:runtime"
|
|
70
|
+
codegraphCapability, // id "capability:codegraph"
|
|
71
|
+
distSourceVersion, // id "build:dist-version-matches-source"
|
|
72
|
+
workspaceLayout, // id "build:workspace-layout-canonical"
|
|
73
|
+
gateguardConflict, // id "integration:gateguard-peaks-conflict"
|
|
74
|
+
checkIdSchema, // id "doctor-self:check-id-pattern"
|
|
75
|
+
l3OrphanSessions, // id "L3:l3-orphan-sessions"
|
|
76
|
+
l3MemoryHealth, // id "L3:l3-memory-health"
|
|
77
|
+
];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report aggregator: convert the accumulated `DoctorCheck[]` into the
|
|
3
|
+
* public `DoctorReport` shape (checks + summary).
|
|
4
|
+
*
|
|
5
|
+
* The summary is a pure reduction over the checks — it counts the
|
|
6
|
+
* passing and failing rows, derives `ok = failed === 0`, and
|
|
7
|
+
* returns the `{ checks, summary }` tuple. Kept in its own module
|
|
8
|
+
* so the dispatcher (`index.ts`) stays a thin orchestration loop
|
|
9
|
+
* and the aggregation rule has a single test surface.
|
|
10
|
+
*/
|
|
11
|
+
import type { DoctorCheck, DoctorReport } from '../types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Build the final report from the accumulated checks.
|
|
14
|
+
*
|
|
15
|
+
* Pure function — no I/O, no clock dependency. The dispatcher
|
|
16
|
+
* passes the checks it accumulated across the registry run; this
|
|
17
|
+
* function computes the summary in O(n) and returns the immutable
|
|
18
|
+
* report shape the public API exposes.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildReport(checks: readonly DoctorCheck[]): DoctorReport;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report aggregator: convert the accumulated `DoctorCheck[]` into the
|
|
3
|
+
* public `DoctorReport` shape (checks + summary).
|
|
4
|
+
*
|
|
5
|
+
* The summary is a pure reduction over the checks — it counts the
|
|
6
|
+
* passing and failing rows, derives `ok = failed === 0`, and
|
|
7
|
+
* returns the `{ checks, summary }` tuple. Kept in its own module
|
|
8
|
+
* so the dispatcher (`index.ts`) stays a thin orchestration loop
|
|
9
|
+
* and the aggregation rule has a single test surface.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Build the final report from the accumulated checks.
|
|
13
|
+
*
|
|
14
|
+
* Pure function — no I/O, no clock dependency. The dispatcher
|
|
15
|
+
* passes the checks it accumulated across the registry run; this
|
|
16
|
+
* function computes the summary in O(n) and returns the immutable
|
|
17
|
+
* report shape the public API exposes.
|
|
18
|
+
*/
|
|
19
|
+
export function buildReport(checks) {
|
|
20
|
+
const failed = checks.filter((check) => !check.ok).length;
|
|
21
|
+
return {
|
|
22
|
+
checks: [...checks],
|
|
23
|
+
summary: {
|
|
24
|
+
ok: failed === 0,
|
|
25
|
+
passed: checks.length - failed,
|
|
26
|
+
failed
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* doctor-service types and shared interfaces (slice rid-004).
|
|
3
|
+
*
|
|
4
|
+
* This module is the public type surface for the code-driven fixed
|
|
5
|
+
* registry of doctor checks. Each check is a `DoctorCheckPlugin`
|
|
6
|
+
* that receives a shared `DoctorContext` (built once at the top of
|
|
7
|
+
* `runDoctor`) and returns the `DoctorCheck[]` it emits. The registry
|
|
8
|
+
* in `plugin-registry.ts` lists the plugins in fixed execution order.
|
|
9
|
+
*
|
|
10
|
+
* The legacy `runDoctor` API is preserved end-to-end: the public
|
|
11
|
+
* `DoctorCheck / DoctorReport / DoctorOptions / *Probe` types still
|
|
12
|
+
* flow through the same names so the main package's `import { runDoctor }`
|
|
13
|
+
* keeps working unchanged.
|
|
14
|
+
*/
|
|
15
|
+
export type DoctorCheck = {
|
|
16
|
+
id: string;
|
|
17
|
+
ok: boolean;
|
|
18
|
+
message: string;
|
|
19
|
+
};
|
|
20
|
+
export type DoctorReport = {
|
|
21
|
+
checks: DoctorCheck[];
|
|
22
|
+
summary: {
|
|
23
|
+
ok: boolean;
|
|
24
|
+
passed: number;
|
|
25
|
+
failed: number;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export type CodegraphCapabilityProbe = {
|
|
29
|
+
packagePath: string;
|
|
30
|
+
version: string;
|
|
31
|
+
binaryPath: string;
|
|
32
|
+
binaryExists: boolean;
|
|
33
|
+
};
|
|
34
|
+
export type DistVersionComparison = {
|
|
35
|
+
dist: string | null;
|
|
36
|
+
source: string;
|
|
37
|
+
match: boolean;
|
|
38
|
+
distReadable: boolean;
|
|
39
|
+
};
|
|
40
|
+
export type DistVersionProbe = () => DistVersionComparison;
|
|
41
|
+
export type WorkspaceLayoutInspection = {
|
|
42
|
+
topLevelSessionDirs: string[];
|
|
43
|
+
legacyDotfiles: string[];
|
|
44
|
+
/**
|
|
45
|
+
* Slice 007 — per-change-id top-level dirs (e.g. `.peaks/001-2026-06-06-.../`).
|
|
46
|
+
* The pre-F3 canonical layout put reviewable artifacts under a
|
|
47
|
+
* per-change-id top-level dir; the post-F3 canonical layout
|
|
48
|
+
* consolidates them under `.peaks/_runtime/<sid>/<role>/`. Any
|
|
49
|
+
* leftover per-change-id top-level dir is a regression to flag.
|
|
50
|
+
* Slice 008's migration will consolidate these; until then, the
|
|
51
|
+
* check reports them as `ok: false`.
|
|
52
|
+
*
|
|
53
|
+
* Optional in the type for back-compat with test probes that
|
|
54
|
+
* pre-date the slice 007 broadening; the check itself falls back
|
|
55
|
+
* to an empty array when the field is missing.
|
|
56
|
+
*/
|
|
57
|
+
perChangeIdDirs?: string[];
|
|
58
|
+
};
|
|
59
|
+
export type WorkspaceLayoutProbe = () => WorkspaceLayoutInspection;
|
|
60
|
+
/**
|
|
61
|
+
* 2026-06-10 — `gateguard-fact-force` (a third-party PreToolUse hook,
|
|
62
|
+
* NOT peaks-loop) fires on Edit / Write and demands a 4-fact questionnaire
|
|
63
|
+
* before allowing the edit. When the LLM is in a peaks-qa flow and tries
|
|
64
|
+
* to update `.peaks/_runtime/<sid>/qa/requests/*.md` via the Edit/Write
|
|
65
|
+
* tool, the hook demands facts that are inapplicable to QA envelope
|
|
66
|
+
* templates (no importers, no public API, no data files, user
|
|
67
|
+
* instruction already in the conversation context). The check detects
|
|
68
|
+
* this hook in the user's global and project `.claude/settings.json` and
|
|
69
|
+
* warns when no `.peaks/**` skip is configured. The probe is injected so
|
|
70
|
+
* tests do not depend on the real `~/.claude/settings.json` state.
|
|
71
|
+
*/
|
|
72
|
+
export type GateguardHookLocation = {
|
|
73
|
+
/** Source file the hook was discovered in (`global` or `project .claude/settings.json`). */
|
|
74
|
+
source: 'global' | 'project';
|
|
75
|
+
/** Resolved absolute path to the source file (for the message). */
|
|
76
|
+
sourcePath: string;
|
|
77
|
+
/** The PreToolUse entry that contains a gateguard hook command. */
|
|
78
|
+
entry: {
|
|
79
|
+
matcher?: string;
|
|
80
|
+
hooks: ReadonlyArray<{
|
|
81
|
+
type?: string;
|
|
82
|
+
command?: string;
|
|
83
|
+
}>;
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
export type GateguardProbeResult = {
|
|
87
|
+
/** Absolute path to `~/.claude/settings.json` (or null when the probe could not resolve it). */
|
|
88
|
+
globalSettingsPath: string | null;
|
|
89
|
+
/** Parsed global settings payload (or null when missing / unreadable / malformed). */
|
|
90
|
+
globalSettings: unknown;
|
|
91
|
+
/** Absolute path to the project `.claude/settings.json` (or null when the project root is not in a peaks project). */
|
|
92
|
+
projectSettingsPath: string | null;
|
|
93
|
+
/** Parsed project settings payload (or null when missing / unreadable / malformed). */
|
|
94
|
+
projectSettings: unknown;
|
|
95
|
+
};
|
|
96
|
+
export type GateguardProbe = () => GateguardProbeResult;
|
|
97
|
+
/**
|
|
98
|
+
* Subset of SkillPresence consumed by the doctor (slice-3b: the full
|
|
99
|
+
* `SkillPresence` type lives in `src/services/skills/skill-presence-service.ts`;
|
|
100
|
+
* the doctor only needs `skill / mode / gate / setAt` for the freshness /
|
|
101
|
+
* workspace / statusline checks). The probe-returned object must satisfy
|
|
102
|
+
* this structural shape; the main package reuses the upstream
|
|
103
|
+
* `SkillPresence` directly so callers do not need to remap.
|
|
104
|
+
*/
|
|
105
|
+
export type DoctorSkillPresence = {
|
|
106
|
+
skill: string;
|
|
107
|
+
mode?: string;
|
|
108
|
+
gate?: string;
|
|
109
|
+
setAt: string;
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* Subset of SkillMetadata consumed by the doctor (slice-3b: the full
|
|
113
|
+
* type lives in `src/services/skills/skill-registry.ts`; the doctor only
|
|
114
|
+
* needs `name / directory / skillPath` for the runbook / name-match /
|
|
115
|
+
* schema checks). Failures from upstream have `directory + message`.
|
|
116
|
+
*/
|
|
117
|
+
export type DoctorSkillEntry = {
|
|
118
|
+
name: string;
|
|
119
|
+
directory: string;
|
|
120
|
+
skillPath: string;
|
|
121
|
+
};
|
|
122
|
+
export type DoctorSkillLoadFailure = {
|
|
123
|
+
directory: string;
|
|
124
|
+
skillPath: string;
|
|
125
|
+
message: string;
|
|
126
|
+
};
|
|
127
|
+
export type DoctorSkillsResult = {
|
|
128
|
+
skills: DoctorSkillEntry[];
|
|
129
|
+
failures: DoctorSkillLoadFailure[];
|
|
130
|
+
};
|
|
131
|
+
export type DoctorOptions = {
|
|
132
|
+
schemasBaseDir?: string;
|
|
133
|
+
skillsBaseDir?: string;
|
|
134
|
+
codegraphProbe?: () => CodegraphCapabilityProbe;
|
|
135
|
+
skillPresenceProbe?: () => DoctorSkillPresence | null;
|
|
136
|
+
skillPresenceFreshnessThresholdMs?: number;
|
|
137
|
+
statusLineInstalledProbe?: () => boolean;
|
|
138
|
+
/** Returns true when a Peaks workspace session (.peaks/.session.json) exists. */
|
|
139
|
+
workspaceInitializedProbe?: () => boolean;
|
|
140
|
+
/** Platform string (defaults to process.platform); injectable for tests. */
|
|
141
|
+
platform?: NodeJS.Platform;
|
|
142
|
+
/** Injected for the build:dist-version-matches-source check (defaults to compareDistVersion on disk). */
|
|
143
|
+
distVersionProbe?: DistVersionProbe;
|
|
144
|
+
/** Injected for the build:workspace-layout-canonical check (defaults to inspectWorkspaceLayout on disk). */
|
|
145
|
+
workspaceLayoutProbe?: WorkspaceLayoutProbe;
|
|
146
|
+
/** Injected for the integration:gateguard-peaks-conflict check (defaults to defaultGateguardProbe on disk). */
|
|
147
|
+
gateguardProbe?: GateguardProbe;
|
|
148
|
+
/**
|
|
149
|
+
* Slice 2026-06-13-repair-pre-existing-test-failures: injected
|
|
150
|
+
* root for the L3:l3-memory-health check (defaults to
|
|
151
|
+
* `findProjectRoot(process.cwd())`). Tests use this to point the
|
|
152
|
+
* check at a temp dir without monkey-patching `findProjectRoot`.
|
|
153
|
+
*/
|
|
154
|
+
l3ProjectRoot?: string;
|
|
155
|
+
/**
|
|
156
|
+
* slice-3b Option C: injected project-root resolver.
|
|
157
|
+
* Replaces the legacy direct call to
|
|
158
|
+
* `findProjectRoot(process.cwd())` from
|
|
159
|
+
* `src/services/config/config-safety.ts`. Defaults to a noop
|
|
160
|
+
* (`() => null`) so standalone tests do not depend on the main
|
|
161
|
+
* package; the CLI wires `findProjectRoot(process.cwd())` at
|
|
162
|
+
* call-site.
|
|
163
|
+
*/
|
|
164
|
+
projectRootResolver?: () => string | null;
|
|
165
|
+
/**
|
|
166
|
+
* slice-3b Option C: injected skill loader.
|
|
167
|
+
* Replaces `loadSkillRegistry` from
|
|
168
|
+
* `src/services/skills/skill-registry.ts`. Defaults to a noop
|
|
169
|
+
* `Promise<{ skills: [], failures: [] }>` so standalone tests do
|
|
170
|
+
* not depend on the main package; the CLI wires the real loader
|
|
171
|
+
* at call-site.
|
|
172
|
+
*/
|
|
173
|
+
loadSkills?: (skillsBaseDir?: string) => Promise<DoctorSkillsResult>;
|
|
174
|
+
/**
|
|
175
|
+
* slice-3b Option C: injected sid validator.
|
|
176
|
+
* Replaces `isValidSessionId` from
|
|
177
|
+
* `src/services/workspace/sid-naming-guard.ts`. Defaults to the
|
|
178
|
+
* canonical regex below (kept in sync with the main-package
|
|
179
|
+
* source). The CLI may inject a different implementation but
|
|
180
|
+
* should keep behaviour identical.
|
|
181
|
+
*/
|
|
182
|
+
isValidSessionIdProbe?: (sid: string) => boolean;
|
|
183
|
+
};
|
|
184
|
+
/**
|
|
185
|
+
* Shared context passed to every plugin. The context is built once at
|
|
186
|
+
* the top of `runDoctor` and is read-only for the duration of check
|
|
187
|
+
* execution — plugins must not mutate it.
|
|
188
|
+
*
|
|
189
|
+
* The set of fields is the minimum union of state that the legacy
|
|
190
|
+
* monolithic `runDoctor` derived locally. Each plugin reads only what
|
|
191
|
+
* it needs; nothing forces a plugin to consume every field.
|
|
192
|
+
*/
|
|
193
|
+
export type DoctorContext = {
|
|
194
|
+
/** The options object passed to `runDoctor`. */
|
|
195
|
+
readonly options: DoctorOptions;
|
|
196
|
+
/** Loaded skill registry (skills + failures). Already populated. */
|
|
197
|
+
readonly registry: DoctorSkillsResult;
|
|
198
|
+
/** Skills extracted from the registry (alias for `registry.skills`). */
|
|
199
|
+
readonly skills: DoctorSkillEntry[];
|
|
200
|
+
/** Resolved schema root dir for the schema validity check. */
|
|
201
|
+
readonly schemaRoot: string;
|
|
202
|
+
/** Skill presence result (null when no probe is wired or the probe returned null). */
|
|
203
|
+
readonly presence: DoctorSkillPresence | null;
|
|
204
|
+
/** Workspace initialized boolean (false when probe missing or not yet initialized). */
|
|
205
|
+
readonly workspaceInitialized: boolean;
|
|
206
|
+
/** Statusline installed boolean (false when probe missing or not installed). */
|
|
207
|
+
readonly statusLineInstalled: boolean;
|
|
208
|
+
/** Resolved platform string (defaults to process.platform). */
|
|
209
|
+
readonly platform: NodeJS.Platform;
|
|
210
|
+
/** Resolved L3 project root (defaults to projectRootResolver() ?? process.cwd()). */
|
|
211
|
+
readonly resolvedL3Root: string;
|
|
212
|
+
/** Final injected project-root resolver. */
|
|
213
|
+
readonly projectRootResolver: () => string | null;
|
|
214
|
+
/** Final injected session-id validator. */
|
|
215
|
+
readonly isValidSessionId: (sid: string) => boolean;
|
|
216
|
+
/**
|
|
217
|
+
* Mutable accumulator of checks emitted by prior plugins in the
|
|
218
|
+
* registry. The dispatcher (index.ts) updates this BEFORE each
|
|
219
|
+
* plugin runs so the `check-id-schema` self-validation sees the
|
|
220
|
+
* full prior check list. Reads treat it as a snapshot.
|
|
221
|
+
*
|
|
222
|
+
* The field is intentionally a live mutable reference rather
|
|
223
|
+
* than a per-plugin snapshot — building a snapshot for every
|
|
224
|
+
* plugin would cost O(n²) on the accumulated array size and
|
|
225
|
+
* add nothing the dispatcher cannot already guarantee.
|
|
226
|
+
*/
|
|
227
|
+
readonly accumulatedChecks: readonly DoctorCheck[];
|
|
228
|
+
};
|
|
229
|
+
/**
|
|
230
|
+
* Doctor check plugin contract. Each plugin receives a shared context
|
|
231
|
+
* and returns the `DoctorCheck[]` it emits. Plugins may be sync or
|
|
232
|
+
* async; the registry runs them in order via `await`.
|
|
233
|
+
*
|
|
234
|
+
* Design: the plugin is the smallest possible closure over the
|
|
235
|
+
* context — it owns no mutable state, so the same plugin instance
|
|
236
|
+
* can be safely reused across multiple `runDoctor()` calls. The
|
|
237
|
+
* plugin name doubles as the human-readable identifier in any future
|
|
238
|
+
* `--list-checks` style diagnostic.
|
|
239
|
+
*/
|
|
240
|
+
export type DoctorCheckPlugin = {
|
|
241
|
+
/** Stable identifier (e.g. `skill-existence`). Used by tests and registry debugging. */
|
|
242
|
+
readonly name: string;
|
|
243
|
+
/** Run the check; return every check this plugin emits (typically 1+). */
|
|
244
|
+
run: (context: DoctorContext) => Promise<readonly DoctorCheck[]> | readonly DoctorCheck[];
|
|
245
|
+
};
|