@matteeh/osq 0.1.0 → 0.2.0

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 (619) hide show
  1. package/README.md +415 -72
  2. package/dist/cli/approve.d.ts +13 -3
  3. package/dist/cli/approve.d.ts.map +1 -1
  4. package/dist/cli/approve.js +59 -4
  5. package/dist/cli/approve.js.map +1 -1
  6. package/dist/cli/bin.js +0 -0
  7. package/dist/cli/confirm.d.ts +21 -0
  8. package/dist/cli/confirm.d.ts.map +1 -0
  9. package/dist/cli/confirm.js +28 -0
  10. package/dist/cli/confirm.js.map +1 -0
  11. package/dist/cli/doctor.d.ts +13 -0
  12. package/dist/cli/doctor.d.ts.map +1 -0
  13. package/dist/cli/doctor.js +23 -0
  14. package/dist/cli/doctor.js.map +1 -0
  15. package/dist/cli/done.d.ts +12 -0
  16. package/dist/cli/done.d.ts.map +1 -0
  17. package/dist/cli/done.js +26 -0
  18. package/dist/cli/done.js.map +1 -0
  19. package/dist/cli/inbox.d.ts +22 -0
  20. package/dist/cli/inbox.d.ts.map +1 -0
  21. package/dist/cli/inbox.js +41 -0
  22. package/dist/cli/inbox.js.map +1 -0
  23. package/dist/cli/index.d.ts.map +1 -1
  24. package/dist/cli/index.js +127 -8
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/init.d.ts +1 -0
  27. package/dist/cli/init.d.ts.map +1 -1
  28. package/dist/cli/init.js +9 -3
  29. package/dist/cli/init.js.map +1 -1
  30. package/dist/cli/lint.d.ts +26 -0
  31. package/dist/cli/lint.d.ts.map +1 -0
  32. package/dist/cli/lint.js +60 -0
  33. package/dist/cli/lint.js.map +1 -0
  34. package/dist/cli/migrate.d.ts +18 -0
  35. package/dist/cli/migrate.d.ts.map +1 -0
  36. package/dist/cli/migrate.js +42 -0
  37. package/dist/cli/migrate.js.map +1 -0
  38. package/dist/cli/new.js +1 -1
  39. package/dist/cli/new.js.map +1 -1
  40. package/dist/cli/plan-queue.d.ts +50 -0
  41. package/dist/cli/plan-queue.d.ts.map +1 -0
  42. package/dist/cli/plan-queue.js +167 -0
  43. package/dist/cli/plan-queue.js.map +1 -0
  44. package/dist/cli/plan.d.ts +35 -0
  45. package/dist/cli/plan.d.ts.map +1 -0
  46. package/dist/cli/plan.js +153 -0
  47. package/dist/cli/plan.js.map +1 -0
  48. package/dist/cli/queue.d.ts +9 -0
  49. package/dist/cli/queue.d.ts.map +1 -0
  50. package/dist/cli/queue.js +24 -0
  51. package/dist/cli/queue.js.map +1 -0
  52. package/dist/cli/reject.d.ts +8 -0
  53. package/dist/cli/reject.d.ts.map +1 -0
  54. package/dist/cli/reject.js +18 -0
  55. package/dist/cli/reject.js.map +1 -0
  56. package/dist/cli/report.d.ts +1 -1
  57. package/dist/cli/report.d.ts.map +1 -1
  58. package/dist/cli/report.js +141 -14
  59. package/dist/cli/report.js.map +1 -1
  60. package/dist/cli/retry.d.ts +7 -0
  61. package/dist/cli/retry.d.ts.map +1 -0
  62. package/dist/cli/retry.js +29 -0
  63. package/dist/cli/retry.js.map +1 -0
  64. package/dist/cli/serve.d.ts +30 -0
  65. package/dist/cli/serve.d.ts.map +1 -0
  66. package/dist/cli/serve.js +136 -0
  67. package/dist/cli/serve.js.map +1 -0
  68. package/dist/cli/setup.d.ts.map +1 -1
  69. package/dist/cli/setup.js +7 -1
  70. package/dist/cli/setup.js.map +1 -1
  71. package/dist/cli/show.d.ts +2 -1
  72. package/dist/cli/show.d.ts.map +1 -1
  73. package/dist/cli/show.js +20 -3
  74. package/dist/cli/show.js.map +1 -1
  75. package/dist/cli/status.d.ts +1 -1
  76. package/dist/cli/status.d.ts.map +1 -1
  77. package/dist/cli/status.js +2 -2
  78. package/dist/cli/status.js.map +1 -1
  79. package/dist/cli/watch.d.ts +9 -6
  80. package/dist/cli/watch.d.ts.map +1 -1
  81. package/dist/cli/watch.js +15 -2
  82. package/dist/cli/watch.js.map +1 -1
  83. package/dist/core/foundation/config-codex.d.ts +22 -0
  84. package/dist/core/foundation/config-codex.d.ts.map +1 -0
  85. package/dist/core/foundation/config-codex.js +58 -0
  86. package/dist/core/foundation/config-codex.js.map +1 -0
  87. package/dist/core/foundation/config-doctor.d.ts +14 -0
  88. package/dist/core/foundation/config-doctor.d.ts.map +1 -0
  89. package/dist/core/foundation/config-doctor.js +29 -0
  90. package/dist/core/foundation/config-doctor.js.map +1 -0
  91. package/dist/core/foundation/config-env.d.ts +3 -0
  92. package/dist/core/foundation/config-env.d.ts.map +1 -0
  93. package/dist/core/foundation/config-env.js +22 -0
  94. package/dist/core/foundation/config-env.js.map +1 -0
  95. package/dist/core/foundation/config-gates.d.ts +22 -0
  96. package/dist/core/foundation/config-gates.d.ts.map +1 -0
  97. package/dist/core/foundation/config-gates.js +43 -0
  98. package/dist/core/foundation/config-gates.js.map +1 -0
  99. package/dist/core/foundation/config-pi.d.ts +64 -0
  100. package/dist/core/foundation/config-pi.d.ts.map +1 -0
  101. package/dist/core/foundation/config-pi.js +131 -0
  102. package/dist/core/foundation/config-pi.js.map +1 -0
  103. package/dist/core/foundation/config-planning.d.ts +24 -0
  104. package/dist/core/foundation/config-planning.d.ts.map +1 -0
  105. package/dist/core/foundation/config-planning.js +60 -0
  106. package/dist/core/foundation/config-planning.js.map +1 -0
  107. package/dist/core/foundation/config-queue.d.ts +15 -0
  108. package/dist/core/foundation/config-queue.d.ts.map +1 -0
  109. package/dist/core/foundation/config-queue.js +24 -0
  110. package/dist/core/foundation/config-queue.js.map +1 -0
  111. package/dist/core/foundation/config-serve.d.ts +20 -0
  112. package/dist/core/foundation/config-serve.d.ts.map +1 -0
  113. package/dist/core/foundation/config-serve.js +35 -0
  114. package/dist/core/foundation/config-serve.js.map +1 -0
  115. package/dist/core/{config.d.ts → foundation/config.d.ts} +34 -3
  116. package/dist/core/foundation/config.d.ts.map +1 -0
  117. package/dist/core/{config.js → foundation/config.js} +35 -18
  118. package/dist/core/foundation/config.js.map +1 -0
  119. package/dist/core/foundation/doctor-managed.d.ts +13 -0
  120. package/dist/core/foundation/doctor-managed.d.ts.map +1 -0
  121. package/dist/core/foundation/doctor-managed.js +77 -0
  122. package/dist/core/foundation/doctor-managed.js.map +1 -0
  123. package/dist/core/foundation/doctor.d.ts +19 -0
  124. package/dist/core/foundation/doctor.d.ts.map +1 -0
  125. package/dist/core/foundation/doctor.js +187 -0
  126. package/dist/core/foundation/doctor.js.map +1 -0
  127. package/dist/core/foundation/harness-catalog.d.ts +96 -0
  128. package/dist/core/foundation/harness-catalog.d.ts.map +1 -0
  129. package/dist/core/foundation/harness-catalog.js +182 -0
  130. package/dist/core/foundation/harness-catalog.js.map +1 -0
  131. package/dist/core/foundation/init-blocks.d.ts +33 -0
  132. package/dist/core/foundation/init-blocks.d.ts.map +1 -0
  133. package/dist/core/foundation/init-blocks.js +165 -0
  134. package/dist/core/foundation/init-blocks.js.map +1 -0
  135. package/dist/core/foundation/init-managed.d.ts +10 -0
  136. package/dist/core/foundation/init-managed.d.ts.map +1 -0
  137. package/dist/core/foundation/init-managed.js +115 -0
  138. package/dist/core/foundation/init-managed.js.map +1 -0
  139. package/dist/core/foundation/init.d.ts +18 -0
  140. package/dist/core/foundation/init.d.ts.map +1 -0
  141. package/dist/core/foundation/init.js +113 -0
  142. package/dist/core/foundation/init.js.map +1 -0
  143. package/dist/core/{logger.d.ts → foundation/logger.d.ts} +1 -0
  144. package/dist/core/foundation/logger.d.ts.map +1 -0
  145. package/dist/core/{logger.js → foundation/logger.js} +18 -2
  146. package/dist/core/foundation/logger.js.map +1 -0
  147. package/dist/core/{new.d.ts → foundation/new.d.ts} +3 -0
  148. package/dist/core/foundation/new.d.ts.map +1 -0
  149. package/dist/core/foundation/new.js +206 -0
  150. package/dist/core/foundation/new.js.map +1 -0
  151. package/dist/core/foundation/package-root.d.ts +9 -0
  152. package/dist/core/foundation/package-root.d.ts.map +1 -0
  153. package/dist/core/foundation/package-root.js +11 -0
  154. package/dist/core/foundation/package-root.js.map +1 -0
  155. package/dist/core/lifecycle/done.d.ts +17 -0
  156. package/dist/core/lifecycle/done.d.ts.map +1 -0
  157. package/dist/core/lifecycle/done.js +97 -0
  158. package/dist/core/lifecycle/done.js.map +1 -0
  159. package/dist/core/lifecycle/reject.d.ts +26 -0
  160. package/dist/core/lifecycle/reject.d.ts.map +1 -0
  161. package/dist/core/lifecycle/reject.js +83 -0
  162. package/dist/core/lifecycle/reject.js.map +1 -0
  163. package/dist/core/lifecycle/retry-transition.d.ts +23 -0
  164. package/dist/core/lifecycle/retry-transition.d.ts.map +1 -0
  165. package/dist/core/lifecycle/retry-transition.js +41 -0
  166. package/dist/core/lifecycle/retry-transition.js.map +1 -0
  167. package/dist/core/lifecycle/retry.d.ts +18 -0
  168. package/dist/core/lifecycle/retry.d.ts.map +1 -0
  169. package/dist/core/lifecycle/retry.js +179 -0
  170. package/dist/core/lifecycle/retry.js.map +1 -0
  171. package/dist/core/report/approval-flags.d.ts +29 -0
  172. package/dist/core/report/approval-flags.d.ts.map +1 -0
  173. package/dist/core/report/approval-flags.js +138 -0
  174. package/dist/core/report/approval-flags.js.map +1 -0
  175. package/dist/core/report/planning-economics.d.ts +39 -0
  176. package/dist/core/report/planning-economics.d.ts.map +1 -0
  177. package/dist/core/report/planning-economics.js +168 -0
  178. package/dist/core/report/planning-economics.js.map +1 -0
  179. package/dist/core/report/planning-observed.d.ts +59 -0
  180. package/dist/core/report/planning-observed.d.ts.map +1 -0
  181. package/dist/core/report/planning-observed.js +135 -0
  182. package/dist/core/report/planning-observed.js.map +1 -0
  183. package/dist/core/report/planning-records.d.ts +69 -0
  184. package/dist/core/report/planning-records.d.ts.map +1 -0
  185. package/dist/core/report/planning-records.js +149 -0
  186. package/dist/core/report/planning-records.js.map +1 -0
  187. package/dist/core/report/planning-slice-lookup.d.ts +13 -0
  188. package/dist/core/report/planning-slice-lookup.d.ts.map +1 -0
  189. package/dist/core/report/planning-slice-lookup.js +146 -0
  190. package/dist/core/report/planning-slice-lookup.js.map +1 -0
  191. package/dist/core/report/planning-slice-measures.d.ts +17 -0
  192. package/dist/core/report/planning-slice-measures.d.ts.map +1 -0
  193. package/dist/core/report/planning-slice-measures.js +85 -0
  194. package/dist/core/report/planning-slice-measures.js.map +1 -0
  195. package/dist/core/report/planning-slice-record.d.ts +4 -0
  196. package/dist/core/report/planning-slice-record.d.ts.map +1 -0
  197. package/dist/core/report/planning-slice-record.js +66 -0
  198. package/dist/core/report/planning-slice-record.js.map +1 -0
  199. package/dist/core/report/planning-slice-turns.d.ts +13 -0
  200. package/dist/core/report/planning-slice-turns.d.ts.map +1 -0
  201. package/dist/core/report/planning-slice-turns.js +41 -0
  202. package/dist/core/report/planning-slice-turns.js.map +1 -0
  203. package/dist/core/report/planning-slice.d.ts +70 -0
  204. package/dist/core/report/planning-slice.d.ts.map +1 -0
  205. package/dist/core/report/planning-slice.js +147 -0
  206. package/dist/core/report/planning-slice.js.map +1 -0
  207. package/dist/core/report/planning.d.ts +31 -0
  208. package/dist/core/report/planning.d.ts.map +1 -0
  209. package/dist/core/report/planning.js +75 -0
  210. package/dist/core/report/planning.js.map +1 -0
  211. package/dist/core/report/report-events.d.ts +52 -0
  212. package/dist/core/report/report-events.d.ts.map +1 -0
  213. package/dist/core/report/report-events.js +198 -0
  214. package/dist/core/report/report-events.js.map +1 -0
  215. package/dist/core/report/report-pre-spawn.d.ts +25 -0
  216. package/dist/core/report/report-pre-spawn.d.ts.map +1 -0
  217. package/dist/core/report/report-pre-spawn.js +40 -0
  218. package/dist/core/report/report-pre-spawn.js.map +1 -0
  219. package/dist/core/report/report-retries.d.ts +30 -0
  220. package/dist/core/report/report-retries.d.ts.map +1 -0
  221. package/dist/core/report/report-retries.js +100 -0
  222. package/dist/core/report/report-retries.js.map +1 -0
  223. package/dist/core/report/report.d.ts +276 -0
  224. package/dist/core/report/report.d.ts.map +1 -0
  225. package/dist/core/report/report.js +1421 -0
  226. package/dist/core/report/report.js.map +1 -0
  227. package/dist/core/{lock.d.ts → run/lock.d.ts} +6 -0
  228. package/dist/core/run/lock.d.ts.map +1 -0
  229. package/dist/core/{lock.js → run/lock.js} +7 -15
  230. package/dist/core/run/lock.js.map +1 -0
  231. package/dist/core/run/manifest.d.ts +39 -0
  232. package/dist/core/run/manifest.d.ts.map +1 -0
  233. package/dist/core/run/manifest.js +137 -0
  234. package/dist/core/run/manifest.js.map +1 -0
  235. package/dist/core/run/scope-hash.d.ts +71 -0
  236. package/dist/core/run/scope-hash.d.ts.map +1 -0
  237. package/dist/core/run/scope-hash.js +177 -0
  238. package/dist/core/run/scope-hash.js.map +1 -0
  239. package/dist/core/run/scope.d.ts +30 -0
  240. package/dist/core/run/scope.d.ts.map +1 -0
  241. package/dist/core/run/scope.js +193 -0
  242. package/dist/core/run/scope.js.map +1 -0
  243. package/dist/core/run/summary.d.ts +8 -0
  244. package/dist/core/run/summary.d.ts.map +1 -0
  245. package/dist/core/run/summary.js +25 -0
  246. package/dist/core/run/summary.js.map +1 -0
  247. package/dist/core/run/verification.d.ts +23 -0
  248. package/dist/core/run/verification.d.ts.map +1 -0
  249. package/dist/core/run/verification.js +78 -0
  250. package/dist/core/run/verification.js.map +1 -0
  251. package/dist/core/spec/approve.d.ts +31 -0
  252. package/dist/core/spec/approve.d.ts.map +1 -0
  253. package/dist/core/spec/approve.js +111 -0
  254. package/dist/core/spec/approve.js.map +1 -0
  255. package/dist/core/spec/delta.d.ts +77 -0
  256. package/dist/core/spec/delta.d.ts.map +1 -0
  257. package/dist/core/spec/delta.js +581 -0
  258. package/dist/core/spec/delta.js.map +1 -0
  259. package/dist/core/spec/digest-flags.d.ts +21 -0
  260. package/dist/core/spec/digest-flags.d.ts.map +1 -0
  261. package/dist/core/spec/digest-flags.js +194 -0
  262. package/dist/core/spec/digest-flags.js.map +1 -0
  263. package/dist/core/spec/digest-verify-starts.d.ts +5 -0
  264. package/dist/core/spec/digest-verify-starts.d.ts.map +1 -0
  265. package/dist/core/spec/digest-verify-starts.js +31 -0
  266. package/dist/core/spec/digest-verify-starts.js.map +1 -0
  267. package/dist/core/spec/digest.d.ts +42 -0
  268. package/dist/core/spec/digest.d.ts.map +1 -0
  269. package/dist/core/spec/digest.js +170 -0
  270. package/dist/core/spec/digest.js.map +1 -0
  271. package/dist/core/spec/hasher.d.ts +11 -0
  272. package/dist/core/spec/hasher.d.ts.map +1 -0
  273. package/dist/core/{hasher.js → spec/hasher.js} +27 -3
  274. package/dist/core/spec/hasher.js.map +1 -0
  275. package/dist/core/spec/linter.d.ts +79 -0
  276. package/dist/core/spec/linter.d.ts.map +1 -0
  277. package/dist/core/spec/linter.js +826 -0
  278. package/dist/core/spec/linter.js.map +1 -0
  279. package/dist/core/spec/migrate.d.ts +54 -0
  280. package/dist/core/spec/migrate.d.ts.map +1 -0
  281. package/dist/core/spec/migrate.js +297 -0
  282. package/dist/core/spec/migrate.js.map +1 -0
  283. package/dist/core/spec/openspec-version.d.ts +30 -0
  284. package/dist/core/spec/openspec-version.d.ts.map +1 -0
  285. package/dist/core/spec/openspec-version.js +118 -0
  286. package/dist/core/spec/openspec-version.js.map +1 -0
  287. package/dist/core/spec/parser.d.ts +82 -0
  288. package/dist/core/spec/parser.d.ts.map +1 -0
  289. package/dist/core/spec/parser.js +221 -0
  290. package/dist/core/spec/parser.js.map +1 -0
  291. package/dist/core/spec/verify-paths.d.ts +18 -0
  292. package/dist/core/spec/verify-paths.d.ts.map +1 -0
  293. package/dist/core/spec/verify-paths.js +139 -0
  294. package/dist/core/spec/verify-paths.js.map +1 -0
  295. package/dist/core/spec/verify-starts.d.ts +45 -0
  296. package/dist/core/spec/verify-starts.d.ts.map +1 -0
  297. package/dist/core/spec/verify-starts.js +61 -0
  298. package/dist/core/spec/verify-starts.js.map +1 -0
  299. package/dist/core/status/inbox-cursor.d.ts +10 -0
  300. package/dist/core/status/inbox-cursor.d.ts.map +1 -0
  301. package/dist/core/status/inbox-cursor.js +33 -0
  302. package/dist/core/status/inbox-cursor.js.map +1 -0
  303. package/dist/core/status/inbox-projection.d.ts +15 -0
  304. package/dist/core/status/inbox-projection.d.ts.map +1 -0
  305. package/dist/core/status/inbox-projection.js +20 -0
  306. package/dist/core/status/inbox-projection.js.map +1 -0
  307. package/dist/core/status/inbox-text.d.ts +4 -0
  308. package/dist/core/status/inbox-text.d.ts.map +1 -0
  309. package/dist/core/status/inbox-text.js +48 -0
  310. package/dist/core/status/inbox-text.js.map +1 -0
  311. package/dist/core/status/inbox.d.ts +53 -0
  312. package/dist/core/status/inbox.d.ts.map +1 -0
  313. package/dist/core/status/inbox.js +167 -0
  314. package/dist/core/status/inbox.js.map +1 -0
  315. package/dist/core/status/layout.d.ts +29 -0
  316. package/dist/core/status/layout.d.ts.map +1 -0
  317. package/dist/core/status/layout.js +77 -0
  318. package/dist/core/status/layout.js.map +1 -0
  319. package/dist/core/status/queue-parser.d.ts +13 -0
  320. package/dist/core/status/queue-parser.d.ts.map +1 -0
  321. package/dist/core/status/queue-parser.js +88 -0
  322. package/dist/core/status/queue-parser.js.map +1 -0
  323. package/dist/core/status/queue-planning.d.ts +62 -0
  324. package/dist/core/status/queue-planning.d.ts.map +1 -0
  325. package/dist/core/status/queue-planning.js +158 -0
  326. package/dist/core/status/queue-planning.js.map +1 -0
  327. package/dist/core/status/queue-report-detail.d.ts +50 -0
  328. package/dist/core/status/queue-report-detail.d.ts.map +1 -0
  329. package/dist/core/status/queue-report-detail.js +140 -0
  330. package/dist/core/status/queue-report-detail.js.map +1 -0
  331. package/dist/core/status/queue-report.d.ts +14 -0
  332. package/dist/core/status/queue-report.d.ts.map +1 -0
  333. package/dist/core/status/queue-report.js +41 -0
  334. package/dist/core/status/queue-report.js.map +1 -0
  335. package/dist/core/status/queue-state.d.ts +53 -0
  336. package/dist/core/status/queue-state.d.ts.map +1 -0
  337. package/dist/core/status/queue-state.js +167 -0
  338. package/dist/core/status/queue-state.js.map +1 -0
  339. package/dist/core/status/queue.d.ts +7 -0
  340. package/dist/core/status/queue.d.ts.map +1 -0
  341. package/dist/core/status/queue.js +4 -0
  342. package/dist/core/status/queue.js.map +1 -0
  343. package/dist/core/status/show.d.ts +102 -0
  344. package/dist/core/status/show.d.ts.map +1 -0
  345. package/dist/core/status/show.js +704 -0
  346. package/dist/core/status/show.js.map +1 -0
  347. package/dist/core/status/state.d.ts +56 -0
  348. package/dist/core/status/state.d.ts.map +1 -0
  349. package/dist/core/status/state.js +187 -0
  350. package/dist/core/status/state.js.map +1 -0
  351. package/dist/core/status/status.d.ts +23 -0
  352. package/dist/core/status/status.d.ts.map +1 -0
  353. package/dist/core/status/status.js +173 -0
  354. package/dist/core/status/status.js.map +1 -0
  355. package/dist/core/web/web-data-change.d.ts +10 -0
  356. package/dist/core/web/web-data-change.d.ts.map +1 -0
  357. package/dist/core/web/web-data-change.js +106 -0
  358. package/dist/core/web/web-data-change.js.map +1 -0
  359. package/dist/core/web/web-data-folders.d.ts +39 -0
  360. package/dist/core/web/web-data-folders.d.ts.map +1 -0
  361. package/dist/core/web/web-data-folders.js +125 -0
  362. package/dist/core/web/web-data-folders.js.map +1 -0
  363. package/dist/core/web/web-data-graph.d.ts +8 -0
  364. package/dist/core/web/web-data-graph.d.ts.map +1 -0
  365. package/dist/core/web/web-data-graph.js +113 -0
  366. package/dist/core/web/web-data-graph.js.map +1 -0
  367. package/dist/core/web/web-data-lifecycle.d.ts +43 -0
  368. package/dist/core/web/web-data-lifecycle.d.ts.map +1 -0
  369. package/dist/core/web/web-data-lifecycle.js +141 -0
  370. package/dist/core/web/web-data-lifecycle.js.map +1 -0
  371. package/dist/core/web/web-data-observations.d.ts +30 -0
  372. package/dist/core/web/web-data-observations.d.ts.map +1 -0
  373. package/dist/core/web/web-data-observations.js +181 -0
  374. package/dist/core/web/web-data-observations.js.map +1 -0
  375. package/dist/core/web/web-data-tokens.d.ts +29 -0
  376. package/dist/core/web/web-data-tokens.d.ts.map +1 -0
  377. package/dist/core/web/web-data-tokens.js +62 -0
  378. package/dist/core/web/web-data-tokens.js.map +1 -0
  379. package/dist/core/web/web-data-types.d.ts +156 -0
  380. package/dist/core/web/web-data-types.d.ts.map +1 -0
  381. package/dist/core/web/web-data-types.js +15 -0
  382. package/dist/core/web/web-data-types.js.map +1 -0
  383. package/dist/core/web/web-data.d.ts +10 -0
  384. package/dist/core/web/web-data.d.ts.map +1 -0
  385. package/dist/core/web/web-data.js +8 -0
  386. package/dist/core/web/web-data.js.map +1 -0
  387. package/dist/core/web/web-events.d.ts +54 -0
  388. package/dist/core/web/web-events.d.ts.map +1 -0
  389. package/dist/core/web/web-events.js +162 -0
  390. package/dist/core/web/web-events.js.map +1 -0
  391. package/dist/core/web/web-export.d.ts +18 -0
  392. package/dist/core/web/web-export.d.ts.map +1 -0
  393. package/dist/core/web/web-export.js +112 -0
  394. package/dist/core/web/web-export.js.map +1 -0
  395. package/dist/core/web/web-server.d.ts +34 -0
  396. package/dist/core/web/web-server.d.ts.map +1 -0
  397. package/dist/core/web/web-server.js +182 -0
  398. package/dist/core/web/web-server.js.map +1 -0
  399. package/dist/core/web/web-static.d.ts +20 -0
  400. package/dist/core/web/web-static.d.ts.map +1 -0
  401. package/dist/core/web/web-static.js +104 -0
  402. package/dist/core/web/web-static.js.map +1 -0
  403. package/dist/harness/{agy.d.ts → agy/agy.d.ts} +8 -6
  404. package/dist/harness/agy/agy.d.ts.map +1 -0
  405. package/dist/harness/{agy.js → agy/agy.js} +49 -34
  406. package/dist/harness/agy/agy.js.map +1 -0
  407. package/dist/harness/claude/claude-turns.d.ts +29 -0
  408. package/dist/harness/claude/claude-turns.d.ts.map +1 -0
  409. package/dist/harness/claude/claude-turns.js +162 -0
  410. package/dist/harness/claude/claude-turns.js.map +1 -0
  411. package/dist/harness/claude/claude-usage.d.ts +12 -0
  412. package/dist/harness/claude/claude-usage.d.ts.map +1 -0
  413. package/dist/harness/claude/claude-usage.js +144 -0
  414. package/dist/harness/claude/claude-usage.js.map +1 -0
  415. package/dist/harness/codex/codex-observe-usage.d.ts +6 -0
  416. package/dist/harness/codex/codex-observe-usage.d.ts.map +1 -0
  417. package/dist/harness/codex/codex-observe-usage.js +215 -0
  418. package/dist/harness/codex/codex-observe-usage.js.map +1 -0
  419. package/dist/harness/codex/codex-prompt.d.ts +17 -0
  420. package/dist/harness/codex/codex-prompt.d.ts.map +1 -0
  421. package/dist/harness/codex/codex-prompt.js +43 -0
  422. package/dist/harness/codex/codex-prompt.js.map +1 -0
  423. package/dist/harness/codex/codex-stream.d.ts +23 -0
  424. package/dist/harness/codex/codex-stream.d.ts.map +1 -0
  425. package/dist/harness/codex/codex-stream.js +182 -0
  426. package/dist/harness/codex/codex-stream.js.map +1 -0
  427. package/dist/harness/codex/codex-usage.d.ts +26 -0
  428. package/dist/harness/codex/codex-usage.d.ts.map +1 -0
  429. package/dist/harness/codex/codex-usage.js +122 -0
  430. package/dist/harness/codex/codex-usage.js.map +1 -0
  431. package/dist/harness/codex/codex.d.ts +16 -0
  432. package/dist/harness/codex/codex.d.ts.map +1 -0
  433. package/dist/harness/codex/codex.js +92 -0
  434. package/dist/harness/codex/codex.js.map +1 -0
  435. package/dist/harness/index.d.ts +11 -2
  436. package/dist/harness/index.d.ts.map +1 -1
  437. package/dist/harness/index.js +24 -9
  438. package/dist/harness/index.js.map +1 -1
  439. package/dist/harness/mock.d.ts +5 -2
  440. package/dist/harness/mock.d.ts.map +1 -1
  441. package/dist/harness/mock.js +10 -11
  442. package/dist/harness/mock.js.map +1 -1
  443. package/dist/harness/opencode/opencode-observe-usage.d.ts +4 -0
  444. package/dist/harness/opencode/opencode-observe-usage.d.ts.map +1 -0
  445. package/dist/harness/opencode/opencode-observe-usage.js +100 -0
  446. package/dist/harness/opencode/opencode-observe-usage.js.map +1 -0
  447. package/dist/harness/opencode/opencode-usage.d.ts +24 -0
  448. package/dist/harness/opencode/opencode-usage.d.ts.map +1 -0
  449. package/dist/harness/opencode/opencode-usage.js +181 -0
  450. package/dist/harness/opencode/opencode-usage.js.map +1 -0
  451. package/dist/harness/{opencode.d.ts → opencode/opencode.d.ts} +10 -7
  452. package/dist/harness/opencode/opencode.d.ts.map +1 -0
  453. package/dist/harness/{opencode.js → opencode/opencode.js} +159 -70
  454. package/dist/harness/opencode/opencode.js.map +1 -0
  455. package/dist/harness/pi/pi-args.d.ts +9 -0
  456. package/dist/harness/pi/pi-args.d.ts.map +1 -0
  457. package/dist/harness/pi/pi-args.js +33 -0
  458. package/dist/harness/pi/pi-args.js.map +1 -0
  459. package/dist/harness/pi/pi-stream.d.ts +27 -0
  460. package/dist/harness/pi/pi-stream.d.ts.map +1 -0
  461. package/dist/harness/pi/pi-stream.js +176 -0
  462. package/dist/harness/pi/pi-stream.js.map +1 -0
  463. package/dist/harness/pi/pi-tools.d.ts +5 -0
  464. package/dist/harness/pi/pi-tools.d.ts.map +1 -0
  465. package/dist/harness/pi/pi-tools.js +31 -0
  466. package/dist/harness/pi/pi-tools.js.map +1 -0
  467. package/dist/harness/pi/pi.d.ts +11 -0
  468. package/dist/harness/pi/pi.d.ts.map +1 -0
  469. package/dist/harness/pi/pi.js +109 -0
  470. package/dist/harness/pi/pi.js.map +1 -0
  471. package/dist/harness/prompt.d.ts +11 -0
  472. package/dist/harness/prompt.d.ts.map +1 -0
  473. package/dist/harness/prompt.js +105 -0
  474. package/dist/harness/prompt.js.map +1 -0
  475. package/dist/harness/types.d.ts +287 -8
  476. package/dist/harness/types.d.ts.map +1 -1
  477. package/dist/harness/types.js +125 -0
  478. package/dist/harness/types.js.map +1 -1
  479. package/dist/index.d.ts +13 -2
  480. package/dist/index.d.ts.map +1 -1
  481. package/dist/index.js +8 -1
  482. package/dist/index.js.map +1 -1
  483. package/dist/watcher/archive-verify.d.ts +9 -0
  484. package/dist/watcher/archive-verify.d.ts.map +1 -0
  485. package/dist/watcher/archive-verify.js +80 -0
  486. package/dist/watcher/archive-verify.js.map +1 -0
  487. package/dist/watcher/archiver.d.ts +14 -2
  488. package/dist/watcher/archiver.d.ts.map +1 -1
  489. package/dist/watcher/archiver.js +112 -33
  490. package/dist/watcher/archiver.js.map +1 -1
  491. package/dist/watcher/attempt.d.ts +19 -0
  492. package/dist/watcher/attempt.d.ts.map +1 -0
  493. package/dist/watcher/attempt.js +94 -0
  494. package/dist/watcher/attempt.js.map +1 -0
  495. package/dist/watcher/auto-retry.d.ts +11 -0
  496. package/dist/watcher/auto-retry.d.ts.map +1 -0
  497. package/dist/watcher/auto-retry.js +180 -0
  498. package/dist/watcher/auto-retry.js.map +1 -0
  499. package/dist/watcher/build.d.ts +24 -0
  500. package/dist/watcher/build.d.ts.map +1 -0
  501. package/dist/watcher/build.js +169 -0
  502. package/dist/watcher/build.js.map +1 -0
  503. package/dist/watcher/change-verify.d.ts +25 -0
  504. package/dist/watcher/change-verify.d.ts.map +1 -0
  505. package/dist/watcher/change-verify.js +57 -0
  506. package/dist/watcher/change-verify.js.map +1 -0
  507. package/dist/watcher/dev.d.ts +51 -0
  508. package/dist/watcher/dev.d.ts.map +1 -0
  509. package/dist/watcher/dev.js +124 -0
  510. package/dist/watcher/dev.js.map +1 -0
  511. package/dist/watcher/failure-reason.d.ts +7 -0
  512. package/dist/watcher/failure-reason.d.ts.map +1 -0
  513. package/dist/watcher/failure-reason.js +2 -0
  514. package/dist/watcher/failure-reason.js.map +1 -0
  515. package/dist/watcher/fingerprint.d.ts +19 -0
  516. package/dist/watcher/fingerprint.d.ts.map +1 -0
  517. package/dist/watcher/fingerprint.js +53 -0
  518. package/dist/watcher/fingerprint.js.map +1 -0
  519. package/dist/watcher/heartbeat.d.ts +33 -0
  520. package/dist/watcher/heartbeat.d.ts.map +1 -0
  521. package/dist/watcher/heartbeat.js +135 -0
  522. package/dist/watcher/heartbeat.js.map +1 -0
  523. package/dist/watcher/lock.d.ts +10 -0
  524. package/dist/watcher/lock.d.ts.map +1 -0
  525. package/dist/watcher/lock.js +14 -0
  526. package/dist/watcher/lock.js.map +1 -0
  527. package/dist/watcher/loop.d.ts +26 -6
  528. package/dist/watcher/loop.d.ts.map +1 -1
  529. package/dist/watcher/loop.js +154 -37
  530. package/dist/watcher/loop.js.map +1 -1
  531. package/dist/watcher/measures.d.ts +46 -0
  532. package/dist/watcher/measures.d.ts.map +1 -0
  533. package/dist/watcher/measures.js +203 -0
  534. package/dist/watcher/measures.js.map +1 -0
  535. package/dist/watcher/outcome.d.ts +32 -0
  536. package/dist/watcher/outcome.d.ts.map +1 -0
  537. package/dist/watcher/outcome.js +127 -0
  538. package/dist/watcher/outcome.js.map +1 -0
  539. package/dist/watcher/regression.d.ts +43 -0
  540. package/dist/watcher/regression.d.ts.map +1 -0
  541. package/dist/watcher/regression.js +175 -0
  542. package/dist/watcher/regression.js.map +1 -0
  543. package/dist/watcher/runner.d.ts +6 -68
  544. package/dist/watcher/runner.d.ts.map +1 -1
  545. package/dist/watcher/runner.js +74 -523
  546. package/dist/watcher/runner.js.map +1 -1
  547. package/dist/watcher/spawn.d.ts +48 -0
  548. package/dist/watcher/spawn.d.ts.map +1 -0
  549. package/dist/watcher/spawn.js +130 -0
  550. package/dist/watcher/spawn.js.map +1 -0
  551. package/dist/watcher/task-verify.d.ts +59 -0
  552. package/dist/watcher/task-verify.d.ts.map +1 -0
  553. package/dist/watcher/task-verify.js +108 -0
  554. package/dist/watcher/task-verify.js.map +1 -0
  555. package/dist/watcher/verify.d.ts +44 -0
  556. package/dist/watcher/verify.d.ts.map +1 -0
  557. package/dist/watcher/verify.js +156 -0
  558. package/dist/watcher/verify.js.map +1 -0
  559. package/package.json +21 -9
  560. package/templates/PLANNER.md +77 -0
  561. package/templates/openspec/config.yaml +24 -0
  562. package/templates/openspec/schemas/osq/README.md +30 -0
  563. package/templates/openspec/schemas/osq/schema.yaml +133 -0
  564. package/templates/openspec/schemas/osq/templates/proposal.md +66 -0
  565. package/templates/openspec/schemas/osq/templates/spec.md +13 -0
  566. package/templates/openspec/schemas/osq/templates/tasks.md +11 -0
  567. package/templates/proposal.md +66 -0
  568. package/templates/tasks.md +5 -0
  569. package/ui/dist/assets/index-CZYeQ8la.js +9 -0
  570. package/ui/dist/assets/index-D6zVSjO7.css +1 -0
  571. package/ui/dist/index.html +14 -0
  572. package/dist/core/approve.d.ts +0 -11
  573. package/dist/core/approve.d.ts.map +0 -1
  574. package/dist/core/approve.js +0 -52
  575. package/dist/core/approve.js.map +0 -1
  576. package/dist/core/config.d.ts.map +0 -1
  577. package/dist/core/config.js.map +0 -1
  578. package/dist/core/hasher.d.ts +0 -4
  579. package/dist/core/hasher.d.ts.map +0 -1
  580. package/dist/core/hasher.js.map +0 -1
  581. package/dist/core/init.d.ts +0 -12
  582. package/dist/core/init.d.ts.map +0 -1
  583. package/dist/core/init.js +0 -151
  584. package/dist/core/init.js.map +0 -1
  585. package/dist/core/linter.d.ts +0 -8
  586. package/dist/core/linter.d.ts.map +0 -1
  587. package/dist/core/linter.js +0 -100
  588. package/dist/core/linter.js.map +0 -1
  589. package/dist/core/lock.d.ts.map +0 -1
  590. package/dist/core/lock.js.map +0 -1
  591. package/dist/core/logger.d.ts.map +0 -1
  592. package/dist/core/logger.js.map +0 -1
  593. package/dist/core/new.d.ts.map +0 -1
  594. package/dist/core/new.js +0 -79
  595. package/dist/core/new.js.map +0 -1
  596. package/dist/core/parser.d.ts +0 -32
  597. package/dist/core/parser.d.ts.map +0 -1
  598. package/dist/core/parser.js +0 -87
  599. package/dist/core/parser.js.map +0 -1
  600. package/dist/core/report.d.ts +0 -54
  601. package/dist/core/report.d.ts.map +0 -1
  602. package/dist/core/report.js +0 -475
  603. package/dist/core/report.js.map +0 -1
  604. package/dist/core/show.d.ts +0 -50
  605. package/dist/core/show.d.ts.map +0 -1
  606. package/dist/core/show.js +0 -374
  607. package/dist/core/show.js.map +0 -1
  608. package/dist/core/state.d.ts +0 -25
  609. package/dist/core/state.d.ts.map +0 -1
  610. package/dist/core/state.js +0 -180
  611. package/dist/core/state.js.map +0 -1
  612. package/dist/core/status.d.ts +0 -10
  613. package/dist/core/status.d.ts.map +0 -1
  614. package/dist/core/status.js +0 -106
  615. package/dist/core/status.js.map +0 -1
  616. package/dist/harness/agy.d.ts.map +0 -1
  617. package/dist/harness/agy.js.map +0 -1
  618. package/dist/harness/opencode.d.ts.map +0 -1
  619. package/dist/harness/opencode.js.map +0 -1
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Queue planning ceilings. Both values are required together when the block is
3
+ * present; no default session or monetary limit is invented.
4
+ */
5
+ export interface QueueConfig {
6
+ readonly maxPlanningSessions: number;
7
+ readonly maxPlanningCost: number;
8
+ }
9
+ /**
10
+ * Validate an optional `queue` block. When present it is atomic: both ceilings
11
+ * must be finite non-negative numbers. Absence stays valid so repositories that
12
+ * never run a non-print next-item plan need no queue settings.
13
+ */
14
+ export declare function validateQueueConfig(queue: unknown): QueueConfig;
15
+ //# sourceMappingURL=config-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-queue.d.ts","sourceRoot":"","sources":["../../../src/core/foundation/config-queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAiB/D"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Validate an optional `queue` block. When present it is atomic: both ceilings
3
+ * must be finite non-negative numbers. Absence stays valid so repositories that
4
+ * never run a non-print next-item plan need no queue settings.
5
+ */
6
+ export function validateQueueConfig(queue) {
7
+ if (typeof queue !== 'object' || queue === null || Array.isArray(queue)) {
8
+ throw new Error('queue configuration must be an object with the two planning ceilings');
9
+ }
10
+ const record = queue;
11
+ if (record.maxPlanningSessions === undefined || record.maxPlanningCost === undefined) {
12
+ throw new Error('queue.maxPlanningSessions and queue.maxPlanningCost are both required');
13
+ }
14
+ const sessions = record.maxPlanningSessions;
15
+ const cost = record.maxPlanningCost;
16
+ if (typeof sessions !== 'number' || !Number.isFinite(sessions) || sessions < 0) {
17
+ throw new Error('queue.maxPlanningSessions must be a finite non-negative number');
18
+ }
19
+ if (typeof cost !== 'number' || !Number.isFinite(cost) || cost < 0) {
20
+ throw new Error('queue.maxPlanningCost must be a finite non-negative number');
21
+ }
22
+ return { maxPlanningSessions: sessions, maxPlanningCost: cost };
23
+ }
24
+ //# sourceMappingURL=config-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-queue.js","sourceRoot":"","sources":["../../../src/core/foundation/config-queue.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC1F,CAAC;IACD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,IAAI,MAAM,CAAC,mBAAmB,KAAK,SAAS,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACrF,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;IAC3F,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,eAAe,CAAC;IACpC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QAC/E,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;AAClE,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Read-only dashboard server settings. Both values are validated and defaulted
3
+ * here so `defineConfig` owns the merged public configuration.
4
+ */
5
+ export interface ServeConfig {
6
+ /** Loopback port; `0` requests an operating-system-assigned port. */
7
+ readonly port: number;
8
+ /** Debounce window for filesystem invalidation notifications. */
9
+ readonly eventDebounceMs: number;
10
+ }
11
+ export declare const DEFAULT_SERVE_CONFIG: ServeConfig;
12
+ /** A valid selected port is an integer from 0 through 65535 inclusive. */
13
+ export declare function isValidPort(value: number): boolean;
14
+ /**
15
+ * Validate an optional `serve` block over the defaults. A partial block keeps
16
+ * the missing value's default; non-finite, fractional, negative, or
17
+ * out-of-range ports and non-finite or negative debounce values are rejected.
18
+ */
19
+ export declare function validateServeConfig(serve: unknown): ServeConfig;
20
+ //# sourceMappingURL=config-serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-serve.d.ts","sourceRoot":"","sources":["../../../src/core/foundation/config-serve.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,eAAO,MAAM,oBAAoB,EAAE,WAGlC,CAAC;AAEF,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAElD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAsB/D"}
@@ -0,0 +1,35 @@
1
+ export const DEFAULT_SERVE_CONFIG = {
2
+ port: 4173,
3
+ eventDebounceMs: 100,
4
+ };
5
+ /** A valid selected port is an integer from 0 through 65535 inclusive. */
6
+ export function isValidPort(value) {
7
+ return Number.isInteger(value) && value >= 0 && value <= 65535;
8
+ }
9
+ /**
10
+ * Validate an optional `serve` block over the defaults. A partial block keeps
11
+ * the missing value's default; non-finite, fractional, negative, or
12
+ * out-of-range ports and non-finite or negative debounce values are rejected.
13
+ */
14
+ export function validateServeConfig(serve) {
15
+ if (serve === undefined)
16
+ return DEFAULT_SERVE_CONFIG;
17
+ if (typeof serve !== 'object' || serve === null || Array.isArray(serve)) {
18
+ throw new Error('serve configuration must be an object with port and eventDebounceMs');
19
+ }
20
+ const record = serve;
21
+ const port = record.port === undefined ? DEFAULT_SERVE_CONFIG.port : record.port;
22
+ const eventDebounceMs = record.eventDebounceMs === undefined
23
+ ? DEFAULT_SERVE_CONFIG.eventDebounceMs
24
+ : record.eventDebounceMs;
25
+ if (typeof port !== 'number' || !isValidPort(port)) {
26
+ throw new Error('serve.port must be an integer from 0 through 65535');
27
+ }
28
+ if (typeof eventDebounceMs !== 'number' ||
29
+ !Number.isFinite(eventDebounceMs) ||
30
+ eventDebounceMs < 0) {
31
+ throw new Error('serve.eventDebounceMs must be a finite non-negative number');
32
+ }
33
+ return { port, eventDebounceMs };
34
+ }
35
+ //# sourceMappingURL=config-serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-serve.js","sourceRoot":"","sources":["../../../src/core/foundation/config-serve.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,oBAAoB,GAAgB;IAC/C,IAAI,EAAE,IAAI;IACV,eAAe,EAAE,GAAG;CACrB,CAAC;AAEF,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,oBAAoB,CAAC;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;IACzF,CAAC;IACD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IACjF,MAAM,eAAe,GACnB,MAAM,CAAC,eAAe,KAAK,SAAS;QAClC,CAAC,CAAC,oBAAoB,CAAC,eAAe;QACtC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC;IAC7B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,IACE,OAAO,eAAe,KAAK,QAAQ;QACnC,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC;QACjC,eAAe,GAAG,CAAC,EACnB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;AACnC,CAAC"}
@@ -1,3 +1,13 @@
1
+ import { type CodexConfig } from './config-codex.js';
2
+ import { type GatesConfig } from './config-gates.js';
3
+ import { type PiConfig } from './config-pi.js';
4
+ import { type PlanningConfig } from './config-planning.js';
5
+ import { type QueueConfig } from './config-queue.js';
6
+ import { type ServeConfig } from './config-serve.js';
7
+ export type { CodexConfig } from './config-codex.js';
8
+ export type { PiConfig } from './config-pi.js';
9
+ export type { QueueConfig } from './config-queue.js';
10
+ export type { ServeConfig } from './config-serve.js';
1
11
  export interface OsqLimits {
2
12
  readonly maxScopeFiles: number;
3
13
  readonly maxFeatureWrites: number;
@@ -5,16 +15,19 @@ export interface OsqLimits {
5
15
  readonly maxAcceptanceLines: number;
6
16
  }
7
17
  export interface OsqPaths {
8
- readonly specs: string;
9
- readonly archive: string;
10
18
  readonly features: string;
11
19
  readonly decisions: string;
12
20
  readonly templates: string;
21
+ readonly openspecRoot: string;
13
22
  }
14
23
  export interface OsqTimeouts {
15
24
  readonly staleLockSeconds: number;
16
25
  readonly taskTimeoutSeconds: number;
17
26
  readonly verifyTimeoutSeconds: number;
27
+ /** Preflight `--version` probe deadline; defaults to 10 seconds. */
28
+ readonly harnessPreflightSeconds?: number;
29
+ /** Kill grace after SIGTERM before SIGKILL; defaults to 5000 milliseconds. */
30
+ readonly harnessKillGracePeriodMs?: number;
18
31
  }
19
32
  export interface AgyConfig {
20
33
  readonly model?: string;
@@ -29,6 +42,11 @@ export interface OpencodeConfig {
29
42
  export interface LogConfig {
30
43
  readonly heartbeatSeconds?: number;
31
44
  }
45
+ export interface PlannerConfig {
46
+ readonly harness: string;
47
+ readonly model: string;
48
+ readonly agent?: string;
49
+ }
32
50
  export interface OsqConfig {
33
51
  readonly harness: string;
34
52
  readonly maxConcurrency: number;
@@ -37,15 +55,28 @@ export interface OsqConfig {
37
55
  readonly timeouts: OsqTimeouts;
38
56
  readonly agy?: AgyConfig;
39
57
  readonly opencode?: OpencodeConfig;
58
+ readonly codex?: CodexConfig;
59
+ readonly pi?: PiConfig;
40
60
  readonly log?: LogConfig;
61
+ readonly planner?: PlannerConfig;
62
+ readonly planning?: PlanningConfig;
63
+ readonly queue?: QueueConfig;
64
+ readonly serve?: Partial<ServeConfig>;
65
+ readonly gates?: GatesConfig;
41
66
  }
42
- export type OsqUserConfig = Partial<Omit<OsqConfig, 'limits' | 'paths' | 'timeouts' | 'agy' | 'opencode' | 'log'>> & {
67
+ export type OsqUserConfig = Partial<Omit<OsqConfig, 'limits' | 'paths' | 'timeouts' | 'codex' | 'pi' | 'log' | 'planner' | 'planning' | 'queue' | 'gates'>> & {
43
68
  readonly limits?: Partial<OsqLimits>;
44
69
  readonly paths?: Partial<OsqPaths>;
45
70
  readonly timeouts?: Partial<OsqTimeouts>;
46
71
  readonly agy?: Partial<AgyConfig>;
47
72
  readonly opencode?: Partial<OpencodeConfig>;
73
+ readonly codex?: Partial<CodexConfig>;
74
+ readonly pi?: Partial<PiConfig>;
48
75
  readonly log?: Partial<LogConfig>;
76
+ readonly planner?: Partial<PlannerConfig>;
77
+ readonly planning?: Partial<PlanningConfig>;
78
+ readonly queue?: Partial<QueueConfig>;
79
+ readonly gates?: Partial<GatesConfig>;
49
80
  };
50
81
  export declare const DEFAULT_CONFIG: OsqConfig;
51
82
  export declare function defineConfig(config: OsqUserConfig): OsqConfig;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/core/foundation/config.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,19 @@
1
1
  import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { createJiti } from 'jiti';
4
+ import { validateCodexConfig, validatePlannerConfig } from './config-codex.js';
5
+ import { applyHarnessModelEnv } from './config-env.js';
6
+ import { DEFAULT_GATES_CONFIG, validateGatesConfig } from './config-gates.js';
7
+ import { validatePiConfig } from './config-pi.js';
8
+ import { DEFAULT_PLANNING_CONFIG, validatePlanningConfig, } from './config-planning.js';
9
+ import { validateQueueConfig } from './config-queue.js';
10
+ import { DEFAULT_SERVE_CONFIG, validateServeConfig } from './config-serve.js';
4
11
  export const DEFAULT_CONFIG = {
5
12
  harness: 'agy',
6
13
  maxConcurrency: 1,
14
+ serve: DEFAULT_SERVE_CONFIG,
15
+ gates: DEFAULT_GATES_CONFIG,
16
+ planning: DEFAULT_PLANNING_CONFIG,
7
17
  agy: {
8
18
  model: 'gemini-3.8-flash-high',
9
19
  dangerouslySkipPermissions: true,
@@ -23,22 +33,37 @@ export const DEFAULT_CONFIG = {
23
33
  maxAcceptanceLines: 7,
24
34
  },
25
35
  paths: {
26
- specs: 'specs',
27
- archive: 'specs/archive',
28
- features: 'features',
36
+ features: 'openspec/specs',
29
37
  decisions: 'decisions',
30
38
  templates: 'templates',
39
+ openspecRoot: 'openspec',
31
40
  },
32
41
  timeouts: {
33
42
  staleLockSeconds: 2700,
34
43
  taskTimeoutSeconds: 1800,
35
44
  verifyTimeoutSeconds: 600,
45
+ harnessPreflightSeconds: 10,
46
+ harnessKillGracePeriodMs: 5000,
36
47
  },
37
48
  };
38
49
  export function defineConfig(config) {
50
+ const { planner, queue: rawQueue, ...restConfig } = config;
51
+ let validatedPlanner;
52
+ if (planner !== undefined) {
53
+ validatedPlanner = validatePlannerConfig(planner);
54
+ }
55
+ const queue = rawQueue === undefined ? undefined : validateQueueConfig(rawQueue);
56
+ const codex = validateCodexConfig(config.codex);
57
+ const pi = validatePiConfig(config.pi);
58
+ const serve = validateServeConfig(config.serve);
39
59
  return {
40
60
  ...DEFAULT_CONFIG,
41
- ...config,
61
+ ...restConfig,
62
+ serve,
63
+ planning: validatePlanningConfig(config.planning),
64
+ gates: validateGatesConfig(config.gates),
65
+ ...(validatedPlanner ? { planner: validatedPlanner } : {}),
66
+ ...(queue ? { queue } : {}),
42
67
  agy: {
43
68
  ...DEFAULT_CONFIG.agy,
44
69
  ...(config.agy || {}),
@@ -47,6 +72,8 @@ export function defineConfig(config) {
47
72
  ...DEFAULT_CONFIG.opencode,
48
73
  ...(config.opencode || {}),
49
74
  },
75
+ codex,
76
+ pi,
50
77
  log: {
51
78
  ...DEFAULT_CONFIG.log,
52
79
  ...(config.log || {}),
@@ -102,23 +129,13 @@ export async function loadConfig(projectRoot) {
102
129
  }
103
130
  }
104
131
  const harness = userConfig.harness || process.env.OSQ_HARNESS || DEFAULT_CONFIG.harness;
105
- const model = userConfig.agy?.model || process.env.OSQ_MODEL || DEFAULT_CONFIG.agy?.model;
106
- const opencodeModel = userConfig.opencode?.model ||
107
- (harness === 'opencode' && process.env.OSQ_MODEL ? process.env.OSQ_MODEL : undefined) ||
108
- DEFAULT_CONFIG.opencode?.model;
132
+ const envModel = process.env.OSQ_MODEL?.trim();
133
+ const envOverrides = envModel ? applyHarnessModelEnv(userConfig, harness, envModel) : {};
109
134
  return defineConfig({
110
135
  ...userConfig,
111
136
  harness,
112
- agy: {
113
- ...DEFAULT_CONFIG.agy,
114
- ...(userConfig.agy || {}),
115
- ...(model ? { model } : {}),
116
- },
117
- opencode: {
118
- ...DEFAULT_CONFIG.opencode,
119
- ...(userConfig.opencode || {}),
120
- ...(opencodeModel ? { model: opencodeModel } : {}),
121
- },
137
+ ...envOverrides,
138
+ ...(userConfig.planner ? { planner: userConfig.planner } : {}),
122
139
  });
123
140
  }
124
141
  //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/core/foundation/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type OsqConfig } from './config.js';
2
+ export interface ManagedBlocksResult {
3
+ ok: boolean;
4
+ message: string;
5
+ }
6
+ /**
7
+ * Compare each managed file's osq block bytes with the installed canonical
8
+ * values, so marker presence alone never counts as healthy. When opencode is
9
+ * the execution or planner harness, the executor agent file `osq setup` writes
10
+ * is inspected too and repaired by `osq setup`, not `osq init`.
11
+ */
12
+ export declare function checkManagedBlocks(projectRoot: string, config: OsqConfig): Promise<ManagedBlocksResult>;
13
+ //# sourceMappingURL=doctor-managed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-managed.d.ts","sourceRoot":"","sources":["../../../src/core/foundation/doctor-managed.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAS7D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAuCD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,mBAAmB,CAAC,CAoC9B"}
@@ -0,0 +1,77 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { DEFAULT_CONFIG } from './config.js';
4
+ import { CLAUDE_PLAN_COMMAND_PATH, MANAGED_AGENTS_MD_BODY, MANAGED_CLAUDE_PLAN_COMMAND, MANAGED_PLANNER_BLOCK, } from './init-blocks.js';
5
+ import { inspectManagedBlock } from './init-managed.js';
6
+ /**
7
+ * Every planning entry point osq manages. Codex reads `AGENTS.md`, the human
8
+ * planner model reads `PLANNER.md`, and Claude Code expands the command below.
9
+ */
10
+ const MANAGED_FILES = [
11
+ { relPath: 'AGENTS.md', canonical: MANAGED_AGENTS_MD_BODY },
12
+ { relPath: 'PLANNER.md', canonical: MANAGED_PLANNER_BLOCK },
13
+ { relPath: CLAUDE_PLAN_COMMAND_PATH, canonical: MANAGED_CLAUDE_PLAN_COMMAND },
14
+ ];
15
+ const PROBLEM_TEXT = {
16
+ 'missing-block': 'is missing its managed block',
17
+ partial: 'has a partial managed block',
18
+ reversed: 'has a reversed managed block',
19
+ duplicated: 'has duplicate managed blocks',
20
+ stale: 'has a stale managed block',
21
+ };
22
+ /** Relative path of the executor agent file `osq setup` writes for opencode. */
23
+ const OPENCODE_AGENT_DIR = path.join('.opencode', 'agent');
24
+ /** `osq setup` writes the agent file for either harness selection. */
25
+ function opencodeConfigured(config) {
26
+ return config.harness === 'opencode' || config.planner?.harness === 'opencode';
27
+ }
28
+ function opencodeAgentRelPath(config) {
29
+ const configured = config.opencode?.agent;
30
+ const agent = configured ?? DEFAULT_CONFIG.opencode?.agent ?? '';
31
+ return path.join(OPENCODE_AGENT_DIR, `${agent}.md`);
32
+ }
33
+ /**
34
+ * Compare each managed file's osq block bytes with the installed canonical
35
+ * values, so marker presence alone never counts as healthy. When opencode is
36
+ * the execution or planner harness, the executor agent file `osq setup` writes
37
+ * is inspected too and repaired by `osq setup`, not `osq init`.
38
+ */
39
+ export async function checkManagedBlocks(projectRoot, config) {
40
+ const failures = [];
41
+ for (const { relPath, canonical } of MANAGED_FILES) {
42
+ const fullPath = path.join(projectRoot, relPath);
43
+ let content;
44
+ try {
45
+ content = await fs.readFile(fullPath, 'utf8');
46
+ }
47
+ catch {
48
+ failures.push(`${relPath} is missing`);
49
+ continue;
50
+ }
51
+ const problem = inspectManagedBlock(content, canonical);
52
+ if (problem)
53
+ failures.push(`${relPath} ${PROBLEM_TEXT[problem]}`);
54
+ }
55
+ const setupFailures = [];
56
+ if (opencodeConfigured(config)) {
57
+ const relPath = opencodeAgentRelPath(config);
58
+ try {
59
+ const content = await fs.readFile(path.join(projectRoot, relPath), 'utf8');
60
+ const problem = inspectManagedBlock(content, MANAGED_AGENTS_MD_BODY);
61
+ if (problem)
62
+ setupFailures.push(`${relPath} ${PROBLEM_TEXT[problem]}`);
63
+ }
64
+ catch {
65
+ setupFailures.push(`${relPath} is missing`);
66
+ }
67
+ }
68
+ const groups = [
69
+ failures.length > 0 ? `${failures.join('; ')} (run osq init)` : '',
70
+ setupFailures.length > 0 ? `${setupFailures.join('; ')} (run osq setup)` : '',
71
+ ].filter((group) => group !== '');
72
+ if (groups.length === 0) {
73
+ return { ok: true, message: 'managed blocks valid' };
74
+ }
75
+ return { ok: false, message: groups.join('; ') };
76
+ }
77
+ //# sourceMappingURL=doctor-managed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-managed.js","sourceRoot":"","sources":["../../../src/core/foundation/doctor-managed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type OsqConfig } from './config.js';
2
+ export interface DoctorCheckResult {
3
+ name: string;
4
+ ok: boolean;
5
+ message: string;
6
+ /** The check passed but carries a non-failing warning; printed as `[warn]`. */
7
+ warning?: boolean;
8
+ }
9
+ export interface DoctorReport {
10
+ ok: boolean;
11
+ checks: DoctorCheckResult[];
12
+ }
13
+ /** Injectable seam keeps the config check hermetic under test. */
14
+ export interface DoctorDependencies {
15
+ loadConfig?: (projectRoot: string) => Promise<OsqConfig>;
16
+ probeValidator?: (projectRoot: string) => Promise<string>;
17
+ }
18
+ export declare function runDoctorChecks(projectRoot: string, deps?: DoctorDependencies): Promise<DoctorReport>;
19
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/core/foundation/doctor.ts"],"names":[],"mappings":"AAYA,OAAO,EAAkB,KAAK,SAAS,EAAc,MAAM,aAAa,CAAC;AAIzE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAED,kEAAkE;AAClE,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACzD,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3D;AAwLD,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE,kBAAuB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAoBvB"}
@@ -0,0 +1,187 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { isPidRunning } from '../run/lock.js';
4
+ import { OPENSPEC_EXPECTED_VERSION, assessOpenSpecVersion, formatInRangeWarning, } from '../spec/openspec-version.js';
5
+ import { parseFrontmatter } from '../spec/parser.js';
6
+ import { getArchiveDir, getChangesDir } from '../status/layout.js';
7
+ import { harnessBinary, probeVersion } from './config-doctor.js';
8
+ import { DEFAULT_CONFIG, loadConfig } from './config.js';
9
+ import { checkManagedBlocks } from './doctor-managed.js';
10
+ import { findHarness } from './harness-catalog.js';
11
+ function make(name, ok, message) {
12
+ return { name, ok, message };
13
+ }
14
+ const exists = (target) => fs.stat(target).then(() => true, () => false);
15
+ function validConfig(config) {
16
+ return (typeof config.harness === 'string' &&
17
+ config.harness.trim() !== '' &&
18
+ !!config.limits &&
19
+ !!config.paths &&
20
+ typeof config.paths.openspecRoot === 'string' &&
21
+ !!config.timeouts &&
22
+ typeof config.gates?.changeVerifyAfterTask === 'boolean');
23
+ }
24
+ async function checkConfig(projectRoot, deps) {
25
+ try {
26
+ const config = await (deps.loadConfig ?? loadConfig)(projectRoot);
27
+ if (!validConfig(config)) {
28
+ return {
29
+ check: make('config', false, 'configuration is invalid or incomplete'),
30
+ config: DEFAULT_CONFIG,
31
+ };
32
+ }
33
+ return { check: make('config', true, `loaded (harness: ${config.harness})`), config };
34
+ }
35
+ catch (err) {
36
+ const message = err instanceof Error ? err.message : String(err);
37
+ return { check: make('config', false, `failed to load: ${message}`), config: DEFAULT_CONFIG };
38
+ }
39
+ }
40
+ async function checkHarness(projectRoot, config) {
41
+ const bin = harnessBinary(config);
42
+ if (bin === null) {
43
+ return { check: make('harness', true, 'no external executable required'), version: '' };
44
+ }
45
+ try {
46
+ const timeoutSeconds = config.timeouts.harnessPreflightSeconds ?? 10;
47
+ const version = await probeVersion(bin, projectRoot, timeoutSeconds);
48
+ return { check: make('harness', true, `${bin} ${version}`.trim()), version };
49
+ }
50
+ catch (err) {
51
+ const message = err instanceof Error ? err.message : String(err);
52
+ return {
53
+ check: make('harness', false, `binary unavailable: ${bin} (${message})`),
54
+ version: '',
55
+ };
56
+ }
57
+ }
58
+ async function checkValidator(projectRoot, deps) {
59
+ try {
60
+ const local = path.join(projectRoot, 'node_modules', '.bin', 'openspec');
61
+ const bin = (await exists(local)) ? local : 'openspec';
62
+ const raw = deps.probeValidator
63
+ ? await deps.probeValidator(projectRoot)
64
+ : await probeVersion(bin, projectRoot);
65
+ const assessment = await assessOpenSpecVersion(raw);
66
+ if (assessment.status === 'pinned') {
67
+ return make('validator', true, `pinned ${OPENSPEC_EXPECTED_VERSION}`);
68
+ }
69
+ if (assessment.status === 'in-range' && assessment.range !== null) {
70
+ return {
71
+ name: 'validator',
72
+ ok: true,
73
+ warning: true,
74
+ message: formatInRangeWarning(assessment.version, assessment.range),
75
+ };
76
+ }
77
+ return make('validator', false, `openspec version ${assessment.version} differs from pinned ${OPENSPEC_EXPECTED_VERSION}`);
78
+ }
79
+ catch (err) {
80
+ const message = err instanceof Error ? err.message : String(err);
81
+ return make('validator', false, `binary unavailable: openspec (${message})`);
82
+ }
83
+ }
84
+ // PLANNER.md, AGENTS.md, and the Claude command all carry canonical osq
85
+ // managed blocks; doctor compares bytes, not marker presence. The opencode
86
+ // executor agent file is included when either harness selection is opencode and
87
+ // is repaired by `osq setup`, not `osq init`.
88
+ async function checkManaged(projectRoot, config) {
89
+ const result = await checkManagedBlocks(projectRoot, config);
90
+ return make('managed-blocks', result.ok, result.message);
91
+ }
92
+ async function listDirs(root) {
93
+ let entries = [];
94
+ try {
95
+ entries = await fs.readdir(root, { withFileTypes: true });
96
+ }
97
+ catch {
98
+ return [];
99
+ }
100
+ return entries.filter((entry) => entry.isDirectory()).map((entry) => path.join(root, entry.name));
101
+ }
102
+ async function checkLocks(projectRoot, config) {
103
+ const changesDir = getChangesDir(config.paths.openspecRoot, projectRoot);
104
+ const orphaned = [];
105
+ for (const changeDir of await listDirs(changesDir)) {
106
+ const name = path.basename(changeDir);
107
+ if (name === 'archive' || name.startsWith('_') || name.startsWith('.'))
108
+ continue;
109
+ for (const lockDirName of ['running', 'locks']) {
110
+ const lockDir = path.join(changeDir, '.run', lockDirName);
111
+ for (const file of await fs.readdir(lockDir).catch(() => [])) {
112
+ if (!file.endsWith('.pid'))
113
+ continue;
114
+ const lockPath = path.join(lockDir, file);
115
+ let pid = 0;
116
+ try {
117
+ pid = Number(JSON.parse(await fs.readFile(lockPath, 'utf8')).pid);
118
+ }
119
+ catch { }
120
+ if (!isPidRunning(pid))
121
+ orphaned.push(path.relative(projectRoot, lockPath));
122
+ }
123
+ }
124
+ }
125
+ return orphaned.length > 0
126
+ ? make('locks', false, `orphaned lock(s): ${orphaned.join(', ')}`)
127
+ : make('locks', true, 'no orphaned locks');
128
+ }
129
+ async function checkArchives(projectRoot, config) {
130
+ const root = getArchiveDir(config.paths.openspecRoot, projectRoot);
131
+ const corrupt = [];
132
+ for (const archiveDir of await listDirs(root)) {
133
+ const hasProposal = (await exists(path.join(archiveDir, 'proposal.md'))) ||
134
+ (await exists(path.join(archiveDir, 'spec.md')));
135
+ const hasTasks = (await exists(path.join(archiveDir, 'tasks'))) ||
136
+ (await exists(path.join(archiveDir, 'tasks.md')));
137
+ if (!hasProposal || !hasTasks)
138
+ corrupt.push(path.relative(projectRoot, archiveDir));
139
+ }
140
+ return corrupt.length > 0
141
+ ? make('archives', false, `invalid archive(s): ${corrupt.join(', ')}`)
142
+ : make('archives', true, 'all archives valid');
143
+ }
144
+ /** Active change done markers must be automated (`scope_hash`) or manual. */
145
+ async function checkDoneMarkers(projectRoot, config) {
146
+ const changesDir = getChangesDir(config.paths.openspecRoot, projectRoot);
147
+ const invalid = [];
148
+ for (const changeDir of await listDirs(changesDir)) {
149
+ const name = path.basename(changeDir);
150
+ if (name === 'archive' || name.startsWith('_') || name.startsWith('.'))
151
+ continue;
152
+ const doneDir = path.join(changeDir, '.run', 'done');
153
+ for (const marker of await fs.readdir(doneDir).catch(() => [])) {
154
+ const markerPath = path.join(doneDir, marker);
155
+ const { data } = parseFrontmatter(await fs.readFile(markerPath, 'utf8').catch(() => ''));
156
+ const automated = typeof data.scope_hash === 'string';
157
+ const manual = data.manual === true && typeof data.reason === 'string';
158
+ if (!automated && !manual)
159
+ invalid.push(path.relative(projectRoot, markerPath));
160
+ }
161
+ }
162
+ if (invalid.length === 0)
163
+ return make('done-markers', true, 'all done markers verified');
164
+ return make('done-markers', false, `unverified done marker placed by hand: ${invalid.join(', ')}`);
165
+ }
166
+ export async function runDoctorChecks(projectRoot, deps = {}) {
167
+ const { check: configCheck, config } = await checkConfig(projectRoot, deps);
168
+ const harness = await checkHarness(projectRoot, config);
169
+ // A catalog entry may add checks for its own executable after a passing probe.
170
+ const diagnose = harness.check.ok ? findHarness(config.harness)?.diagnose : undefined;
171
+ const extra = diagnose ? await diagnose({ config, projectRoot, version: harness.version }) : [];
172
+ const checks = [
173
+ configCheck,
174
+ harness.check,
175
+ ...extra.map((diagnosis) => ({
176
+ ...make(diagnosis.name, diagnosis.ok, diagnosis.message),
177
+ ...(diagnosis.warning ? { warning: true } : {}),
178
+ })),
179
+ await checkManaged(projectRoot, config),
180
+ await checkLocks(projectRoot, config),
181
+ await checkArchives(projectRoot, config),
182
+ await checkDoneMarkers(projectRoot, config),
183
+ await checkValidator(projectRoot, deps),
184
+ ];
185
+ return { ok: checks.every((check) => check.ok), checks };
186
+ }
187
+ //# sourceMappingURL=doctor.js.map