peaks-loop 4.0.0-beta.9 → 4.0.1

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.
Files changed (552) hide show
  1. package/CHANGELOG.md +910 -141
  2. package/README-en.md +26 -7
  3. package/README.md +75 -6
  4. package/agents/karpathy-reviewer.md +33 -0
  5. package/bin/peaks.js +0 -0
  6. package/dist/cli/cli-helpers.d.ts +31 -6
  7. package/dist/cli/cli-helpers.js +48 -25
  8. package/dist/cli/commands/_register.d.ts +3 -0
  9. package/dist/cli/commands/_register.js +139 -0
  10. package/dist/cli/commands/_super.d.ts +10 -0
  11. package/dist/cli/commands/_super.js +97 -0
  12. package/dist/cli/commands/adapter-commands-s2a.js +1 -1
  13. package/dist/cli/commands/asset-commands.js +33 -16
  14. package/dist/cli/commands/audit-commands.js +2 -2
  15. package/dist/cli/commands/autonomous-swarm-commands.d.ts +12 -0
  16. package/dist/cli/commands/autonomous-swarm-commands.js +120 -0
  17. package/dist/cli/commands/bee-commands.js +1 -1
  18. package/dist/cli/commands/capability-commands.js +1 -1
  19. package/dist/cli/commands/capability-worker-config-sc-commands.js +0 -2
  20. package/dist/cli/commands/changeset-commands.d.ts +13 -0
  21. package/dist/cli/commands/changeset-commands.js +46 -0
  22. package/dist/cli/commands/code-commands.d.ts +11 -1
  23. package/dist/cli/commands/code-commands.js +19 -699
  24. package/dist/cli/commands/code-job-shape-commands.d.ts +9 -0
  25. package/dist/cli/commands/code-job-shape-commands.js +164 -0
  26. package/dist/cli/commands/code-mode-gate-commands.d.ts +9 -0
  27. package/dist/cli/commands/code-mode-gate-commands.js +223 -0
  28. package/dist/cli/commands/code-review-commands.js +2 -2
  29. package/dist/cli/commands/code-run-command.d.ts +12 -0
  30. package/dist/cli/commands/code-run-command.js +68 -0
  31. package/dist/cli/commands/code-runtime-commands.d.ts +11 -0
  32. package/dist/cli/commands/code-runtime-commands.js +391 -0
  33. package/dist/cli/commands/codegraph-commands.js +1 -1
  34. package/dist/cli/commands/compact-command.js +53 -1
  35. package/dist/cli/commands/complexity-commands.js +1 -1
  36. package/dist/cli/commands/config-commands.js +4 -75
  37. package/dist/cli/commands/container-commands.d.ts +28 -0
  38. package/dist/cli/commands/container-commands.js +221 -0
  39. package/dist/cli/commands/context-commands.js +3 -2
  40. package/dist/cli/commands/core/artifacts-command.js +1 -1
  41. package/dist/cli/commands/core/binding-commands.js +1 -1
  42. package/dist/cli/commands/core/doctor-command.js +63 -3
  43. package/dist/cli/commands/core/memory-command.js +1 -1
  44. package/dist/cli/commands/core/profile-command.js +1 -1
  45. package/dist/cli/commands/core/proxy-command.js +1 -1
  46. package/dist/cli/commands/core/session-command.js +9 -7
  47. package/dist/cli/commands/core/skill-command.js +7 -4
  48. package/dist/cli/commands/core/standards-command.js +1 -1
  49. package/dist/cli/commands/cron-commands.d.ts +57 -0
  50. package/dist/cli/commands/cron-commands.js +257 -0
  51. package/dist/cli/commands/cron-scheduler-commands.d.ts +47 -0
  52. package/dist/cli/commands/cron-scheduler-commands.js +284 -0
  53. package/dist/cli/commands/dashboard-commands.d.ts +4 -0
  54. package/dist/cli/commands/dashboard-commands.js +10 -0
  55. package/dist/cli/commands/dashboard-long-run.d.ts +25 -0
  56. package/dist/cli/commands/dashboard-long-run.js +122 -0
  57. package/dist/cli/commands/dashboard-summary.d.ts +12 -0
  58. package/dist/cli/commands/dashboard-summary.js +58 -0
  59. package/dist/cli/commands/dispatch-commands.d.ts +0 -7
  60. package/dist/cli/commands/dispatch-commands.js +372 -8
  61. package/dist/cli/commands/dispatch-from-dag.js +4 -1
  62. package/dist/cli/commands/doc-commands.js +1 -1
  63. package/dist/cli/commands/ecc-commands.d.ts +30 -0
  64. package/dist/cli/commands/ecc-commands.js +119 -0
  65. package/dist/cli/commands/evolution-commands.js +1 -1
  66. package/dist/cli/commands/feedback-commands.js +1 -1
  67. package/dist/cli/commands/final-review-commands.js +1 -1
  68. package/dist/cli/commands/fixture-commands.js +1 -1
  69. package/dist/cli/commands/fork-commands.js +1 -1
  70. package/dist/cli/commands/gate-commands.js +128 -6
  71. package/dist/cli/commands/governance-classify-contract-commands.d.ts +21 -0
  72. package/dist/cli/commands/governance-classify-contract-commands.js +273 -0
  73. package/dist/cli/commands/heartbeat-commands.js +76 -5
  74. package/dist/cli/commands/heartbeat-watch-command.d.ts +31 -0
  75. package/dist/cli/commands/heartbeat-watch-command.js +146 -0
  76. package/dist/cli/commands/hook-handle.js +1 -1
  77. package/dist/cli/commands/hooks-commands.js +126 -10
  78. package/dist/cli/commands/ide-commands.js +1 -1
  79. package/dist/cli/commands/impact-commands.js +1 -1
  80. package/dist/cli/commands/job-commands.js +34 -1
  81. package/dist/cli/commands/lease-metrics-commands.d.ts +67 -0
  82. package/dist/cli/commands/lease-metrics-commands.js +231 -0
  83. package/dist/cli/commands/lease-stats-commands.d.ts +65 -0
  84. package/dist/cli/commands/lease-stats-commands.js +107 -0
  85. package/dist/cli/commands/legacy-commands.js +1 -1
  86. package/dist/cli/commands/log-commands.js +1 -1
  87. package/dist/cli/commands/loop-commands.js +1 -1
  88. package/dist/cli/commands/loop-eval-commands.js +1 -1
  89. package/dist/cli/commands/memory-commands.js +1 -1
  90. package/dist/cli/commands/migrate-1-4-1-command.js +1 -1
  91. package/dist/cli/commands/migrate-v2-10-to-v2-11-command.js +1 -1
  92. package/dist/cli/commands/mut-commands.d.ts +1 -1
  93. package/dist/cli/commands/mut-commands.js +1 -5
  94. package/dist/cli/commands/observability-commands.js +1 -1
  95. package/dist/cli/commands/openspec-commands.js +65 -4
  96. package/dist/cli/commands/perf-audit-commands.js +3 -3
  97. package/dist/cli/commands/perf-commands.js +1 -1
  98. package/dist/cli/commands/polyrepo-commands.js +1 -1
  99. package/dist/cli/commands/prd-blocks-commands.js +1 -1
  100. package/dist/cli/commands/prd-commands.js +4 -2
  101. package/dist/cli/commands/preferences-commands.js +23 -3
  102. package/dist/cli/commands/project-commands.js +1 -1
  103. package/dist/cli/commands/qa-business-review-commands.js +1 -1
  104. package/dist/cli/commands/qa-commands.d.ts +1 -1
  105. package/dist/cli/commands/qa-commands.js +39 -3
  106. package/dist/cli/commands/release-commands.d.ts +15 -0
  107. package/dist/cli/commands/release-commands.js +113 -21
  108. package/dist/cli/commands/request-commands.js +1 -1
  109. package/dist/cli/commands/retrospective-commands.js +1 -1
  110. package/dist/cli/commands/reviewer-commands.js +1 -1
  111. package/dist/cli/commands/role-commands.js +1 -1
  112. package/dist/cli/commands/runtime-commands-helpers.d.ts +7 -0
  113. package/dist/cli/commands/runtime-commands-helpers.js +24 -0
  114. package/dist/cli/commands/runtime-commands.js +1 -2
  115. package/dist/cli/commands/sc-commands.js +4 -2
  116. package/dist/cli/commands/scan-commands.js +1 -1
  117. package/dist/cli/commands/security-audit-commands.js +3 -3
  118. package/dist/cli/commands/sediment-commands.js +10 -1
  119. package/dist/cli/commands/session-24h-mode.d.ts +26 -0
  120. package/dist/cli/commands/session-24h-mode.js +196 -0
  121. package/dist/cli/commands/share-commands.d.ts +19 -0
  122. package/dist/cli/commands/share-commands.js +121 -2
  123. package/dist/cli/commands/skill-conformance-commands.js +1 -1
  124. package/dist/cli/commands/skill-loop-engineering-readiness-commands.js +1 -1
  125. package/dist/cli/commands/skill-search-commands.js +4 -1
  126. package/dist/cli/commands/slice-commands.js +1 -1
  127. package/dist/cli/commands/slice-integrate-commands.js +1 -1
  128. package/dist/cli/commands/slice-review-commands.js +1 -1
  129. package/dist/cli/commands/smoke-commands.js +1 -1
  130. package/dist/cli/commands/sop-commands.js +1 -1
  131. package/dist/cli/commands/spill-demo-command.d.ts +7 -0
  132. package/dist/cli/commands/spill-demo-command.js +29 -0
  133. package/dist/cli/commands/statusline-commands.d.ts +12 -0
  134. package/dist/cli/commands/statusline-commands.js +79 -17
  135. package/dist/cli/commands/sub-agent-commands.js +2 -1
  136. package/dist/cli/commands/sub-agent-shared.d.ts +10 -0
  137. package/dist/cli/commands/sub-agent-shared.js +24 -1
  138. package/dist/cli/commands/swarm-commands.d.ts +13 -0
  139. package/dist/cli/commands/swarm-commands.js +77 -0
  140. package/dist/cli/commands/tech-commands.d.ts +64 -0
  141. package/dist/cli/commands/tech-commands.js +195 -0
  142. package/dist/cli/commands/understand-commands.js +1 -1
  143. package/dist/cli/commands/upgrade-commands.d.ts +2 -0
  144. package/dist/cli/commands/upgrade-commands.js +40 -5
  145. package/dist/cli/commands/user-touchpoint-commands.js +1 -1
  146. package/dist/cli/commands/verdict-aggregate-command.js +1 -1
  147. package/dist/cli/commands/vm-commands.d.ts +31 -0
  148. package/dist/cli/commands/vm-commands.js +274 -0
  149. package/dist/cli/commands/workflow-commands.js +24 -1
  150. package/dist/cli/commands/workflow-plan-commands.js +1 -1
  151. package/dist/cli/commands/workspace/init-command.js +1 -1
  152. package/dist/cli/commands/workspace/migrate-command.js +1 -1
  153. package/dist/cli/commands/workspace/reconcile-command.js +1 -1
  154. package/dist/cli/commands/worktree-auth-commands.d.ts +29 -0
  155. package/dist/cli/commands/worktree-auth-commands.js +652 -0
  156. package/dist/cli/index.js +58 -13
  157. package/dist/cli/program.d.ts +2 -2
  158. package/dist/cli/program.js +86 -281
  159. package/dist/services/24h-mode/decider.d.ts +103 -0
  160. package/dist/services/24h-mode/decider.js +144 -0
  161. package/dist/services/24h-mode/index.d.ts +12 -0
  162. package/dist/services/24h-mode/index.js +12 -0
  163. package/dist/services/24h-mode/state.d.ts +48 -0
  164. package/dist/services/24h-mode/state.js +51 -0
  165. package/dist/services/24h-mode/store.d.ts +27 -0
  166. package/dist/services/24h-mode/store.js +119 -0
  167. package/dist/services/artifacts/artifact-prerequisites.js +1 -1
  168. package/dist/services/artifacts/request-artifact-service.js +1 -1
  169. package/dist/services/artifacts/workspace-service.js +1 -1
  170. package/dist/services/audit/enforcers/lint-bee-runtime-contract.d.ts +25 -0
  171. package/dist/services/audit/enforcers/lint-bee-runtime-contract.js +91 -0
  172. package/dist/services/audit/enforcers/lint-peaks-code-runtime.d.ts +16 -0
  173. package/dist/services/audit/enforcers/lint-peaks-code-runtime.js +31 -0
  174. package/dist/services/audit/enforcers/lint-peaks-skill-runtime.d.ts +23 -0
  175. package/dist/services/audit/enforcers/lint-peaks-skill-runtime.js +59 -0
  176. package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.d.ts +28 -0
  177. package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.js +86 -0
  178. package/dist/services/audit/enforcers/lint-prd-artifact-handoff.d.ts +16 -0
  179. package/dist/services/audit/enforcers/lint-prd-artifact-handoff.js +41 -0
  180. package/dist/services/audit/enforcers/lint-prd-source-snapshot.d.ts +27 -0
  181. package/dist/services/audit/enforcers/lint-prd-source-snapshot.js +47 -0
  182. package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.d.ts +19 -0
  183. package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.js +47 -0
  184. package/dist/services/audit/enforcers/lint-rd-handoff-coverage.d.ts +18 -0
  185. package/dist/services/audit/enforcers/lint-rd-handoff-coverage.js +70 -0
  186. package/dist/services/audit/enforcers/lint-skill-presence-mandatory.d.ts +25 -0
  187. package/dist/services/audit/enforcers/lint-skill-presence-mandatory.js +53 -0
  188. package/dist/services/audit/red-line-catalog-p2-a.d.ts +0 -6
  189. package/dist/services/audit/red-line-catalog-p2-a.js +230 -1
  190. package/dist/services/audit/static-service.d.ts +32 -25
  191. package/dist/services/audit/static-service.js +30 -109
  192. package/dist/services/audit-independent/index.d.ts +2 -0
  193. package/dist/services/audit-independent/index.js +2 -0
  194. package/dist/services/autonomous-swarm/autonomous-swarm-service.d.ts +127 -0
  195. package/dist/services/autonomous-swarm/autonomous-swarm-service.js +446 -0
  196. package/dist/services/changeset/changeset-check-service.d.ts +22 -0
  197. package/dist/services/changeset/changeset-check-service.js +47 -0
  198. package/dist/services/code/auto-compact-modes.d.ts +30 -0
  199. package/dist/services/code/auto-compact-modes.js +38 -0
  200. package/dist/services/code/auto-compact-orchestrator.d.ts +43 -5
  201. package/dist/services/code/auto-compact-orchestrator.js +101 -21
  202. package/dist/services/code/dag-orchestrator.d.ts +30 -1
  203. package/dist/services/code/dag-orchestrator.js +106 -1
  204. package/dist/services/code/status-line-renderer.d.ts +2 -0
  205. package/dist/services/code/status-line-renderer.js +21 -3
  206. package/dist/services/code-review/ocr-service.d.ts +1 -1
  207. package/dist/services/code-review/ocr-service.js +6 -3
  208. package/dist/services/compact-history/compact-history-service.d.ts +41 -0
  209. package/dist/services/compact-history/compact-history-service.js +62 -0
  210. package/dist/services/compact-statusline/compact-statusline-service.d.ts +16 -0
  211. package/dist/services/compact-statusline/compact-statusline-service.js +83 -0
  212. package/dist/services/config/config-service.d.ts +1 -12
  213. package/dist/services/config/config-service.js +3 -72
  214. package/dist/services/config/config-types.d.ts +2 -4
  215. package/dist/services/config/config-types.js +1 -1
  216. package/dist/services/container/container-lease.d.ts +67 -0
  217. package/dist/services/container/container-lease.js +135 -0
  218. package/dist/services/context/auto-compact-dispatcher.d.ts +40 -5
  219. package/dist/services/context/auto-compact-dispatcher.js +32 -102
  220. package/dist/services/context/auto-compact-reader.js +1 -1
  221. package/dist/services/context/auto-compact-types.d.ts +27 -2
  222. package/dist/services/context/auto-compact-types.js +8 -1
  223. package/dist/services/context/build-dispatch-system-prompt.d.ts +75 -0
  224. package/dist/services/context/build-dispatch-system-prompt.js +117 -0
  225. package/dist/services/context/collector.d.ts +2 -2
  226. package/dist/services/context/context-builder.d.ts +4 -4
  227. package/dist/services/context/context-schema.d.ts +48 -48
  228. package/dist/services/context/ide-detect.d.ts +4 -0
  229. package/dist/services/context/ide-detect.js +24 -0
  230. package/dist/services/context/main-session-monitor.d.ts +1 -4
  231. package/dist/services/context/main-session-monitor.js +1 -24
  232. package/dist/services/context/memory-index-reader.d.ts +8 -0
  233. package/dist/services/context/memory-index-reader.js +57 -0
  234. package/dist/services/context/memory-lru-cache.d.ts +12 -0
  235. package/dist/services/context/memory-lru-cache.js +60 -0
  236. package/dist/services/context/memory-preflight-config.d.ts +19 -0
  237. package/dist/services/context/memory-preflight-config.js +25 -0
  238. package/dist/services/context/memory-preflight-service.d.ts +19 -0
  239. package/dist/services/context/memory-preflight-service.js +120 -0
  240. package/dist/services/context/spillover-store.d.ts +23 -0
  241. package/dist/services/context/spillover-store.js +155 -0
  242. package/dist/services/context/spillover-types.d.ts +18 -0
  243. package/dist/services/context/spillover-types.js +1 -0
  244. package/dist/services/crystallization/crystallization-service.d.ts +22 -5
  245. package/dist/services/crystallization/crystallization-service.js +8 -14
  246. package/dist/services/crystallization/crystallization-types.d.ts +6 -6
  247. package/dist/services/crystallization/evidence-brief-builder.d.ts +1 -1
  248. package/dist/services/crystallization/index.d.ts +13 -0
  249. package/dist/services/crystallization/index.js +13 -0
  250. package/dist/services/dashboard/project-dashboard-service.js +2 -2
  251. package/dist/services/dispatch/await-batch.d.ts +70 -0
  252. package/dist/services/dispatch/await-batch.js +272 -0
  253. package/dist/services/dispatch/batch-counter.js +1 -1
  254. package/dist/services/dispatch/dispatch-record-writer.d.ts +126 -4
  255. package/dist/services/dispatch/dispatch-record-writer.js +239 -9
  256. package/dist/services/dispatch/slice-dag.d.ts +46 -0
  257. package/dist/services/dispatch/slice-dag.js +6 -0
  258. package/dist/services/dispatch/stage-enum.d.ts +27 -0
  259. package/dist/services/dispatch/stage-enum.js +48 -0
  260. package/dist/services/dispatch/startup-timeout.d.ts +86 -0
  261. package/dist/services/dispatch/startup-timeout.js +97 -0
  262. package/dist/services/dispatch/sub-agent-dispatcher.js +40 -89
  263. package/dist/services/dispatch/test-tool-detection.d.ts +25 -1
  264. package/dist/services/dispatch/test-tool-detection.js +80 -0
  265. package/dist/services/doctor/doctor-service/checks/check-id-schema.d.ts +18 -0
  266. package/dist/services/doctor/doctor-service/checks/check-id-schema.js +64 -0
  267. package/dist/services/doctor/doctor-service/checks/codegraph-capability.d.ts +14 -0
  268. package/dist/services/doctor/doctor-service/checks/codegraph-capability.js +69 -0
  269. package/dist/services/doctor/doctor-service/checks/dist-source-version.d.ts +32 -0
  270. package/dist/services/doctor/doctor-service/checks/dist-source-version.js +110 -0
  271. package/dist/services/doctor/doctor-service/checks/gateguard-conflict.d.ts +24 -0
  272. package/dist/services/doctor/doctor-service/checks/gateguard-conflict.js +164 -0
  273. package/dist/services/doctor/doctor-service/checks/l3-memory-health.d.ts +16 -0
  274. package/dist/services/doctor/doctor-service/checks/l3-memory-health.js +57 -0
  275. package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.d.ts +19 -0
  276. package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.js +66 -0
  277. package/dist/services/doctor/doctor-service/checks/schema-validity.d.ts +10 -0
  278. package/dist/services/doctor/doctor-service/checks/schema-validity.js +33 -0
  279. package/dist/services/doctor/doctor-service/checks/skill-apply-note.d.ts +20 -0
  280. package/dist/services/doctor/doctor-service/checks/skill-apply-note.js +85 -0
  281. package/dist/services/doctor/doctor-service/checks/skill-existence.d.ts +13 -0
  282. package/dist/services/doctor/doctor-service/checks/skill-existence.js +30 -0
  283. package/dist/services/doctor/doctor-service/checks/skill-name-match.d.ts +10 -0
  284. package/dist/services/doctor/doctor-service/checks/skill-name-match.js +25 -0
  285. package/dist/services/doctor/doctor-service/checks/skill-parse.d.ts +10 -0
  286. package/dist/services/doctor/doctor-service/checks/skill-parse.js +19 -0
  287. package/dist/services/doctor/doctor-service/checks/skill-presence.d.ts +21 -0
  288. package/dist/services/doctor/doctor-service/checks/skill-presence.js +75 -0
  289. package/dist/services/doctor/doctor-service/checks/skill-runbook.d.ts +14 -0
  290. package/dist/services/doctor/doctor-service/checks/skill-runbook.js +47 -0
  291. package/dist/services/doctor/doctor-service/checks/statusline-install.d.ts +14 -0
  292. package/dist/services/doctor/doctor-service/checks/statusline-install.js +32 -0
  293. package/dist/services/doctor/doctor-service/checks/statusline-runtime.d.ts +13 -0
  294. package/dist/services/doctor/doctor-service/checks/statusline-runtime.js +30 -0
  295. package/dist/services/doctor/doctor-service/checks/user-config.d.ts +11 -0
  296. package/dist/services/doctor/doctor-service/checks/user-config.js +27 -0
  297. package/dist/services/doctor/doctor-service/checks/workspace-init.d.ts +16 -0
  298. package/dist/services/doctor/doctor-service/checks/workspace-init.js +34 -0
  299. package/dist/services/doctor/doctor-service/checks/workspace-layout.d.ts +33 -0
  300. package/dist/services/doctor/doctor-service/checks/workspace-layout.js +180 -0
  301. package/dist/services/doctor/doctor-service/index.d.ts +48 -0
  302. package/dist/services/doctor/doctor-service/index.js +254 -0
  303. package/dist/services/doctor/doctor-service/plugin-registry.d.ts +41 -0
  304. package/dist/services/doctor/doctor-service/plugin-registry.js +77 -0
  305. package/dist/services/doctor/doctor-service/report/final-summary.d.ts +20 -0
  306. package/dist/services/doctor/doctor-service/report/final-summary.js +29 -0
  307. package/dist/services/doctor/doctor-service/types.d.ts +245 -0
  308. package/dist/services/doctor/doctor-service/types.js +15 -0
  309. package/dist/services/doctor/doctor-service.d.ts +15 -146
  310. package/dist/services/doctor/doctor-service.js +22 -926
  311. package/dist/services/doctor/index.d.ts +22 -0
  312. package/dist/services/doctor/index.js +22 -0
  313. package/dist/services/env/shell-probe.d.ts +71 -0
  314. package/dist/services/env/shell-probe.js +161 -0
  315. package/dist/services/evolution/evolution-types.d.ts +39 -39
  316. package/dist/services/final-review/final-review-service.d.ts +11 -1
  317. package/dist/services/final-review/index.d.ts +2 -0
  318. package/dist/services/final-review/index.js +1 -0
  319. package/dist/services/hooks/auto-compact-hook-install.d.ts +4 -5
  320. package/dist/services/hooks/auto-compact-hook-install.js +4 -5
  321. package/dist/services/hooks/worktree-authorization-gate.d.ts +205 -0
  322. package/dist/services/hooks/worktree-authorization-gate.js +492 -0
  323. package/dist/services/ide/adapters/claude-code-adapter.js +2 -2
  324. package/dist/services/ide/adapters/qoder-adapter.d.ts +25 -0
  325. package/dist/services/ide/adapters/qoder-adapter.js +57 -0
  326. package/dist/services/ide/adapters/tongyi-lingma-adapter.d.ts +16 -0
  327. package/dist/services/ide/adapters/tongyi-lingma-adapter.js +45 -0
  328. package/dist/services/ide/ide-registry.js +6 -0
  329. package/dist/services/ide/ide-types.d.ts +1 -1
  330. package/dist/services/job/job-types.d.ts +56 -56
  331. package/dist/services/job-snapshot/index.d.ts +8 -0
  332. package/dist/services/job-snapshot/index.js +7 -0
  333. package/dist/services/{job/job-resource-snapshot.d.ts → job-snapshot/snapshot.d.ts} +1 -1
  334. package/dist/services/job-snapshot/types.d.ts +7 -0
  335. package/dist/services/job-snapshot/types.js +1 -0
  336. package/dist/services/karpathy-cost/karpathy-cost-check-service.d.ts +67 -0
  337. package/dist/services/karpathy-cost/karpathy-cost-check-service.js +108 -0
  338. package/dist/services/log/retention.d.ts +16 -0
  339. package/dist/services/log/retention.js +17 -0
  340. package/dist/services/loop/loop-bee-relation-types.d.ts +6 -6
  341. package/dist/services/loop/loop-release-types.d.ts +24 -24
  342. package/dist/services/loop/monotonic-runner.d.ts +17 -11
  343. package/dist/services/loop/monotonic-runner.js +118 -79
  344. package/dist/services/memory/project-memory-service/index/kind-dispatch.d.ts +8 -0
  345. package/dist/services/memory/project-memory-service/index/kind-dispatch.js +253 -0
  346. package/dist/services/memory/project-memory-service/index/ranking.d.ts +6 -0
  347. package/dist/services/memory/project-memory-service/index/ranking.js +171 -0
  348. package/dist/services/memory/project-memory-service/index/search.d.ts +34 -0
  349. package/dist/services/memory/project-memory-service/index/search.js +194 -0
  350. package/dist/services/memory/project-memory-service/index.d.ts +9 -0
  351. package/dist/services/memory/project-memory-service/index.js +24 -0
  352. package/dist/services/memory/project-memory-service/parsers/frontmatter.d.ts +9 -0
  353. package/dist/services/memory/project-memory-service/parsers/frontmatter.js +106 -0
  354. package/dist/services/memory/project-memory-service/parsers/markdown-pure.d.ts +7 -0
  355. package/dist/services/memory/project-memory-service/parsers/markdown-pure.js +96 -0
  356. package/dist/services/memory/project-memory-service/store/atomic-write.d.ts +5 -0
  357. package/dist/services/memory/project-memory-service/store/atomic-write.js +56 -0
  358. package/dist/services/memory/project-memory-service/store/paths.d.ts +8 -0
  359. package/dist/services/memory/project-memory-service/store/paths.js +116 -0
  360. package/dist/services/memory/project-memory-service/types.d.ts +128 -0
  361. package/dist/services/memory/project-memory-service/types.js +9 -0
  362. package/dist/services/memory/project-memory-service.d.ts +1 -167
  363. package/dist/services/memory/project-memory-service.js +19 -816
  364. package/dist/services/migrate-skill-name/schema.d.ts +2 -2
  365. package/dist/services/observability/aggregation.d.ts +27 -0
  366. package/dist/services/observability/aggregation.js +72 -0
  367. package/dist/services/observability/observability-service.d.ts +73 -7
  368. package/dist/services/observability/observability-service.js +87 -1
  369. package/dist/services/openspec/artifact-boundary.d.ts +138 -0
  370. package/dist/services/openspec/artifact-boundary.js +150 -0
  371. package/dist/services/openspec/coverage-evidence-reader.d.ts +191 -0
  372. package/dist/services/openspec/coverage-evidence-reader.js +386 -0
  373. package/dist/services/openspec/openspec-archive-service.d.ts +70 -0
  374. package/dist/services/openspec/openspec-archive-service.js +320 -8
  375. package/dist/services/openspec/openspec-bridge-service.js +1 -1
  376. package/dist/services/openspec/openspec-init-service.js +1 -1
  377. package/dist/services/openspec/openspec-propose-from-doctor-service.js +1 -1
  378. package/dist/services/openspec/openspec-render-service.js +7 -4
  379. package/dist/services/openspec/openspec-scan-service.js +1 -1
  380. package/dist/services/openspec/openspec-validate-service.js +5 -4
  381. package/dist/services/preferences/preferences-service.js +10 -0
  382. package/dist/services/preferences/preferences-types.d.ts +13 -0
  383. package/dist/services/preferences/preferences-types.js +11 -0
  384. package/dist/services/qa/screenshot-archive-service.d.ts +51 -0
  385. package/dist/services/qa/screenshot-archive-service.js +134 -0
  386. package/dist/services/rd/rd-service.js +10 -11
  387. package/dist/services/rd/types.d.ts +32 -32
  388. package/dist/services/rd-swarm/rd-swarm-service.d.ts +60 -0
  389. package/dist/services/rd-swarm/rd-swarm-service.js +93 -0
  390. package/dist/services/recommendations/capability-seed-items.js +0 -1
  391. package/dist/services/recommendations/capability-seed-mappings.js +0 -1
  392. package/dist/services/recommendations/capability-seed-sources.js +0 -1
  393. package/dist/services/release/version-precheck-service.d.ts +51 -0
  394. package/dist/services/release/version-precheck-service.js +257 -0
  395. package/dist/services/scan/acceptance-coverage-service.js +1 -1
  396. package/dist/services/scan/archetype-service.js +1 -1
  397. package/dist/services/scan/existing-system-service.js +1 -1
  398. package/dist/services/scan/libraries-service.js +1 -1
  399. package/dist/services/sediment/json-schema.d.ts +40 -40
  400. package/dist/services/share/bundle-types.d.ts +12 -12
  401. package/dist/services/share/run-state-contract.d.ts +2 -2
  402. package/dist/services/skill/skill-search-service.d.ts +12 -7
  403. package/dist/services/skill/skill-search-service.js +8 -4
  404. package/dist/services/skillhub/migrations/001-initial.sql +71 -0
  405. package/dist/services/skillhub/migrations/002-loop-release.sql +32 -0
  406. package/dist/services/skillhub/migrations/003-loop-bee-relation.sql +35 -0
  407. package/dist/services/skillhub/migrations/004-loop-bee-extension.sql +65 -0
  408. package/dist/services/skillhub/migrations/005-evolution-evaluation.sql +81 -0
  409. package/dist/services/skillhub/migrations/006-crystallization-event.sql +92 -0
  410. package/dist/services/skills/hooks-settings-service.d.ts +75 -0
  411. package/dist/services/skills/hooks-settings-service.js +230 -2
  412. package/dist/services/skills/skill-registry.d.ts +1 -0
  413. package/dist/services/skills/skill-registry.js +6 -4
  414. package/dist/services/skills/skill-runbook-service.js +1 -1
  415. package/dist/services/slice/slice-check-service.js +1 -1
  416. package/dist/services/standards/main-session-monitor-ban-hook.d.ts +14 -0
  417. package/dist/services/standards/main-session-monitor-ban-hook.js +19 -0
  418. package/dist/services/standards/missing-standards-detector.d.ts +25 -0
  419. package/dist/services/standards/missing-standards-detector.js +43 -12
  420. package/dist/services/tech/tech-change-id-service.d.ts +82 -0
  421. package/dist/services/tech/tech-change-id-service.js +117 -0
  422. package/dist/services/understand/understand-hybrid-service.js +1 -1
  423. package/dist/services/understand/understand-scan-service.js +2 -2
  424. package/dist/services/upgrade/upgrade-service.js +4 -3
  425. package/dist/services/verdict/envelopes.d.ts +2 -2
  426. package/dist/services/verdict/envelopes.js +2 -2
  427. package/dist/services/verdict/verdict-aggregator.d.ts +3 -3
  428. package/dist/services/vm/vm-lease.d.ts +40 -0
  429. package/dist/services/vm/vm-lease.js +137 -0
  430. package/dist/services/workflow/autonomous-resume-writer.js +1 -1
  431. package/dist/services/workflow/pipeline-verify-gate-support.d.ts +47 -0
  432. package/dist/services/workflow/pipeline-verify-gate-support.js +194 -0
  433. package/dist/services/workflow/pipeline-verify-service.d.ts +17 -81
  434. package/dist/services/workflow/pipeline-verify-service.js +42 -218
  435. package/dist/services/workflow/pipeline-verify-types.d.ts +90 -0
  436. package/dist/services/workflow/pipeline-verify-types.js +10 -0
  437. package/dist/services/workflow/plan-reader.d.ts +1 -1
  438. package/dist/services/workflow/plan-reader.js +1 -1
  439. package/dist/services/workflow/plan-refresher.d.ts +1 -1
  440. package/dist/services/workflow/plan-refresher.js +1 -1
  441. package/dist/services/workflow/plan-trigger-detector.d.ts +1 -1
  442. package/dist/services/workflow/plan-trigger-detector.js +1 -1
  443. package/dist/services/workflow/workflow-autonomous-resume-helpers.d.ts +1 -1
  444. package/dist/services/workflow/workflow-autonomous-service.d.ts +2 -98
  445. package/dist/services/workflow/workflow-autonomous-types.d.ts +114 -0
  446. package/dist/services/workflow/workflow-autonomous-types.js +21 -0
  447. package/dist/services/workflow/workflow-router-service.js +18 -16
  448. package/dist/services/workflow/workflow-spec-lint.d.ts +13 -0
  449. package/dist/services/workflow/workflow-spec-lint.js +75 -0
  450. package/dist/services/workflow/workflow-spec-types.d.ts +100 -0
  451. package/dist/services/workflow/workflow-spec-types.js +13 -0
  452. package/dist/services/workflow/workflow-spec-yaml.d.ts +17 -0
  453. package/dist/services/workflow/workflow-spec-yaml.js +88 -0
  454. package/dist/services/workflow/workflow-spec.d.ts +11 -91
  455. package/dist/services/workflow/workflow-spec.js +16 -145
  456. package/dist/services/workspace/migrate-service.js +1 -1
  457. package/dist/services/workspace/workspace-service.js +1 -1
  458. package/dist/services/worktree/worktree-lease.d.ts +170 -0
  459. package/dist/services/worktree/worktree-lease.js +242 -0
  460. package/package.json +47 -51
  461. package/scripts/clean-dist.mjs +31 -1
  462. package/scripts/copy-templates.mjs +16 -0
  463. package/scripts/sync-version.mjs +53 -2
  464. package/skills/bee/peaks-perf-audit/SKILL.md +17 -0
  465. package/skills/bee/peaks-prd/SKILL.md +16 -0
  466. package/skills/bee/peaks-prd/test-prompts.json +12 -0
  467. package/skills/bee/peaks-qa/SKILL.md +16 -1
  468. package/skills/bee/peaks-qa/references/qa-sub-agent-dispatch.md +22 -0
  469. package/skills/bee/peaks-qa/test-prompts.json +12 -0
  470. package/skills/bee/peaks-rd/SKILL.md +29 -20
  471. package/skills/bee/peaks-rd/references/rd-sub-agent-dispatch.md +39 -0
  472. package/skills/bee/peaks-rd/test-prompts.json +12 -0
  473. package/skills/bee/peaks-reviewer/SKILL.md +17 -0
  474. package/skills/bee/peaks-sc/SKILL.md +16 -0
  475. package/skills/bee/peaks-security-audit/SKILL.md +17 -0
  476. package/skills/bee/peaks-txt/SKILL.md +16 -0
  477. package/skills/bee/peaks-txt/test-prompts.json +12 -0
  478. package/skills/bee/peaks-ui/SKILL.md +49 -43
  479. package/skills/bee/peaks-ui/test-prompts.json +12 -0
  480. package/skills/peaks-code/SKILL.md +54 -109
  481. package/skills/peaks-code/references/boundaries.md +15 -1
  482. package/skills/peaks-code/references/cron-scheduler-deployment.md +313 -0
  483. package/skills/peaks-code/references/external-skill-invocation.md +27 -0
  484. package/skills/peaks-code/references/lease-dashboard.html +224 -0
  485. package/skills/peaks-code/references/lease-stats.sample.json +26 -0
  486. package/skills/peaks-code/references/peaks-worktree-l2-enforcers.md +208 -0
  487. package/skills/peaks-code/references/periodic-checkpoint.md +4 -4
  488. package/skills/peaks-code/references/runbook.md +63 -1
  489. package/skills/peaks-code/references/startup-sequence.md +110 -0
  490. package/skills/peaks-code/references/step-0-8-gate.md +1 -1
  491. package/skills/peaks-code/references/sub-agent-dispatch.md +92 -1
  492. package/skills/peaks-code/references/worktree-governance.md +123 -0
  493. package/skills/peaks-code/test-prompts.json +12 -0
  494. package/skills/peaks-doctor/SKILL.md +1 -1
  495. package/skills/peaks-ide/SKILL.md +1 -1
  496. package/skills/peaks-solo/SKILL.md +21 -0
  497. package/skills/peaks-solo/references/triage-decision-table.md +6 -0
  498. package/skills/peaks-sop/test-prompts.json +17 -0
  499. package/dist/cli/commands/agent-commands.d.ts +0 -20
  500. package/dist/cli/commands/agent-commands.js +0 -48
  501. package/dist/cli/commands/classify-classify-commands.d.ts +0 -19
  502. package/dist/cli/commands/classify-classify-commands.js +0 -151
  503. package/dist/cli/commands/contract-commands.d.ts +0 -26
  504. package/dist/cli/commands/contract-commands.js +0 -114
  505. package/dist/cli/commands/session-auto-compact-hook-command.d.ts +0 -37
  506. package/dist/cli/commands/session-auto-compact-hook-command.js +0 -127
  507. package/dist/cli/commands/worker-commands.d.ts +0 -3
  508. package/dist/cli/commands/worker-commands.js +0 -52
  509. package/dist/services/agent/ecc-agent-service.d.ts +0 -47
  510. package/dist/services/agent/ecc-agent-service.js +0 -143
  511. package/dist/services/config/provider-service.d.ts +0 -48
  512. package/dist/services/config/provider-service.js +0 -143
  513. package/dist/services/context/dispatch-context-guard.d.ts +0 -27
  514. package/dist/services/context/dispatch-context-guard.js +0 -192
  515. package/dist/services/context/shared-channel.d.ts +0 -93
  516. package/dist/services/context/shared-channel.js +0 -308
  517. package/dist/services/filesystem/file-lock.d.ts +0 -11
  518. package/dist/services/filesystem/file-lock.js +0 -152
  519. package/dist/services/mut/assert-scanner.d.ts +0 -6
  520. package/dist/services/mut/assert-scanner.js +0 -116
  521. package/dist/services/mut/index.d.ts +0 -8
  522. package/dist/services/mut/index.js +0 -7
  523. package/dist/services/mut/mut-runner.d.ts +0 -39
  524. package/dist/services/mut/mut-runner.js +0 -29
  525. package/dist/services/mut/production-stryker.d.ts +0 -2
  526. package/dist/services/mut/production-stryker.js +0 -75
  527. package/dist/services/mut/report-builder.d.ts +0 -11
  528. package/dist/services/mut/report-builder.js +0 -110
  529. package/dist/services/mut/report-loader.d.ts +0 -31
  530. package/dist/services/mut/report-loader.js +0 -78
  531. package/dist/services/mut/thresholds.d.ts +0 -21
  532. package/dist/services/mut/thresholds.js +0 -22
  533. package/dist/services/mut/types.d.ts +0 -336
  534. package/dist/services/mut/types.js +0 -59
  535. package/dist/services/providers/minimax-provider-service.d.ts +0 -24
  536. package/dist/services/providers/minimax-provider-service.js +0 -143
  537. package/dist/services/providers/minimax-worker-service.d.ts +0 -21
  538. package/dist/services/providers/minimax-worker-service.js +0 -83
  539. package/dist/shared/fs.d.ts +0 -4
  540. package/dist/shared/fs.js +0 -26
  541. package/dist/shared/paths.d.ts +0 -6
  542. package/dist/shared/paths.js +0 -50
  543. package/dist/shared/result.d.ts +0 -22
  544. package/dist/shared/result.js +0 -46
  545. package/dist/shared/version.d.ts +0 -1
  546. package/dist/shared/version.js +0 -1
  547. package/examples/video-demo/README.md +0 -142
  548. package/examples/video-demo/out/en-closing-960.png +0 -0
  549. package/examples/video-demo/out/zh-closing-960.png +0 -0
  550. package/examples/video-demo/preview/peaks-loop-demo-en.mp4 +0 -0
  551. package/examples/video-demo/preview/peaks-loop-demo.mp4 +0 -0
  552. /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
+ };