@matteeh/osq 0.1.0 → 0.2.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 (627) 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-capability.d.ts +17 -0
  260. package/dist/core/spec/digest-capability.d.ts.map +1 -0
  261. package/dist/core/spec/digest-capability.js +89 -0
  262. package/dist/core/spec/digest-capability.js.map +1 -0
  263. package/dist/core/spec/digest-flags.d.ts +22 -0
  264. package/dist/core/spec/digest-flags.d.ts.map +1 -0
  265. package/dist/core/spec/digest-flags.js +194 -0
  266. package/dist/core/spec/digest-flags.js.map +1 -0
  267. package/dist/core/spec/digest-verify-starts.d.ts +5 -0
  268. package/dist/core/spec/digest-verify-starts.d.ts.map +1 -0
  269. package/dist/core/spec/digest-verify-starts.js +31 -0
  270. package/dist/core/spec/digest-verify-starts.js.map +1 -0
  271. package/dist/core/spec/digest.d.ts +43 -0
  272. package/dist/core/spec/digest.d.ts.map +1 -0
  273. package/dist/core/spec/digest.js +175 -0
  274. package/dist/core/spec/digest.js.map +1 -0
  275. package/dist/core/spec/hasher.d.ts +11 -0
  276. package/dist/core/spec/hasher.d.ts.map +1 -0
  277. package/dist/core/{hasher.js → spec/hasher.js} +27 -3
  278. package/dist/core/spec/hasher.js.map +1 -0
  279. package/dist/core/spec/linter.d.ts +79 -0
  280. package/dist/core/spec/linter.d.ts.map +1 -0
  281. package/dist/core/spec/linter.js +826 -0
  282. package/dist/core/spec/linter.js.map +1 -0
  283. package/dist/core/spec/migrate.d.ts +54 -0
  284. package/dist/core/spec/migrate.d.ts.map +1 -0
  285. package/dist/core/spec/migrate.js +297 -0
  286. package/dist/core/spec/migrate.js.map +1 -0
  287. package/dist/core/spec/openspec-version.d.ts +30 -0
  288. package/dist/core/spec/openspec-version.d.ts.map +1 -0
  289. package/dist/core/spec/openspec-version.js +118 -0
  290. package/dist/core/spec/openspec-version.js.map +1 -0
  291. package/dist/core/spec/parser.d.ts +82 -0
  292. package/dist/core/spec/parser.d.ts.map +1 -0
  293. package/dist/core/spec/parser.js +221 -0
  294. package/dist/core/spec/parser.js.map +1 -0
  295. package/dist/core/spec/verify-paths.d.ts +18 -0
  296. package/dist/core/spec/verify-paths.d.ts.map +1 -0
  297. package/dist/core/spec/verify-paths.js +139 -0
  298. package/dist/core/spec/verify-paths.js.map +1 -0
  299. package/dist/core/spec/verify-starts.d.ts +45 -0
  300. package/dist/core/spec/verify-starts.d.ts.map +1 -0
  301. package/dist/core/spec/verify-starts.js +61 -0
  302. package/dist/core/spec/verify-starts.js.map +1 -0
  303. package/dist/core/status/inbox-cursor.d.ts +10 -0
  304. package/dist/core/status/inbox-cursor.d.ts.map +1 -0
  305. package/dist/core/status/inbox-cursor.js +33 -0
  306. package/dist/core/status/inbox-cursor.js.map +1 -0
  307. package/dist/core/status/inbox-projection.d.ts +15 -0
  308. package/dist/core/status/inbox-projection.d.ts.map +1 -0
  309. package/dist/core/status/inbox-projection.js +20 -0
  310. package/dist/core/status/inbox-projection.js.map +1 -0
  311. package/dist/core/status/inbox-text.d.ts +4 -0
  312. package/dist/core/status/inbox-text.d.ts.map +1 -0
  313. package/dist/core/status/inbox-text.js +48 -0
  314. package/dist/core/status/inbox-text.js.map +1 -0
  315. package/dist/core/status/inbox.d.ts +53 -0
  316. package/dist/core/status/inbox.d.ts.map +1 -0
  317. package/dist/core/status/inbox.js +167 -0
  318. package/dist/core/status/inbox.js.map +1 -0
  319. package/dist/core/status/layout.d.ts +29 -0
  320. package/dist/core/status/layout.d.ts.map +1 -0
  321. package/dist/core/status/layout.js +77 -0
  322. package/dist/core/status/layout.js.map +1 -0
  323. package/dist/core/status/queue-parser.d.ts +13 -0
  324. package/dist/core/status/queue-parser.d.ts.map +1 -0
  325. package/dist/core/status/queue-parser.js +88 -0
  326. package/dist/core/status/queue-parser.js.map +1 -0
  327. package/dist/core/status/queue-planning.d.ts +62 -0
  328. package/dist/core/status/queue-planning.d.ts.map +1 -0
  329. package/dist/core/status/queue-planning.js +158 -0
  330. package/dist/core/status/queue-planning.js.map +1 -0
  331. package/dist/core/status/queue-report-detail.d.ts +50 -0
  332. package/dist/core/status/queue-report-detail.d.ts.map +1 -0
  333. package/dist/core/status/queue-report-detail.js +140 -0
  334. package/dist/core/status/queue-report-detail.js.map +1 -0
  335. package/dist/core/status/queue-report.d.ts +14 -0
  336. package/dist/core/status/queue-report.d.ts.map +1 -0
  337. package/dist/core/status/queue-report.js +41 -0
  338. package/dist/core/status/queue-report.js.map +1 -0
  339. package/dist/core/status/queue-state.d.ts +53 -0
  340. package/dist/core/status/queue-state.d.ts.map +1 -0
  341. package/dist/core/status/queue-state.js +167 -0
  342. package/dist/core/status/queue-state.js.map +1 -0
  343. package/dist/core/status/queue.d.ts +7 -0
  344. package/dist/core/status/queue.d.ts.map +1 -0
  345. package/dist/core/status/queue.js +4 -0
  346. package/dist/core/status/queue.js.map +1 -0
  347. package/dist/core/status/show.d.ts +102 -0
  348. package/dist/core/status/show.d.ts.map +1 -0
  349. package/dist/core/status/show.js +704 -0
  350. package/dist/core/status/show.js.map +1 -0
  351. package/dist/core/status/state.d.ts +56 -0
  352. package/dist/core/status/state.d.ts.map +1 -0
  353. package/dist/core/status/state.js +187 -0
  354. package/dist/core/status/state.js.map +1 -0
  355. package/dist/core/status/status.d.ts +23 -0
  356. package/dist/core/status/status.d.ts.map +1 -0
  357. package/dist/core/status/status.js +173 -0
  358. package/dist/core/status/status.js.map +1 -0
  359. package/dist/core/web/web-data-change.d.ts +10 -0
  360. package/dist/core/web/web-data-change.d.ts.map +1 -0
  361. package/dist/core/web/web-data-change.js +106 -0
  362. package/dist/core/web/web-data-change.js.map +1 -0
  363. package/dist/core/web/web-data-folders.d.ts +39 -0
  364. package/dist/core/web/web-data-folders.d.ts.map +1 -0
  365. package/dist/core/web/web-data-folders.js +125 -0
  366. package/dist/core/web/web-data-folders.js.map +1 -0
  367. package/dist/core/web/web-data-graph.d.ts +8 -0
  368. package/dist/core/web/web-data-graph.d.ts.map +1 -0
  369. package/dist/core/web/web-data-graph.js +113 -0
  370. package/dist/core/web/web-data-graph.js.map +1 -0
  371. package/dist/core/web/web-data-lifecycle.d.ts +43 -0
  372. package/dist/core/web/web-data-lifecycle.d.ts.map +1 -0
  373. package/dist/core/web/web-data-lifecycle.js +141 -0
  374. package/dist/core/web/web-data-lifecycle.js.map +1 -0
  375. package/dist/core/web/web-data-observations.d.ts +30 -0
  376. package/dist/core/web/web-data-observations.d.ts.map +1 -0
  377. package/dist/core/web/web-data-observations.js +181 -0
  378. package/dist/core/web/web-data-observations.js.map +1 -0
  379. package/dist/core/web/web-data-tokens.d.ts +29 -0
  380. package/dist/core/web/web-data-tokens.d.ts.map +1 -0
  381. package/dist/core/web/web-data-tokens.js +62 -0
  382. package/dist/core/web/web-data-tokens.js.map +1 -0
  383. package/dist/core/web/web-data-types.d.ts +156 -0
  384. package/dist/core/web/web-data-types.d.ts.map +1 -0
  385. package/dist/core/web/web-data-types.js +15 -0
  386. package/dist/core/web/web-data-types.js.map +1 -0
  387. package/dist/core/web/web-data.d.ts +10 -0
  388. package/dist/core/web/web-data.d.ts.map +1 -0
  389. package/dist/core/web/web-data.js +8 -0
  390. package/dist/core/web/web-data.js.map +1 -0
  391. package/dist/core/web/web-events.d.ts +54 -0
  392. package/dist/core/web/web-events.d.ts.map +1 -0
  393. package/dist/core/web/web-events.js +162 -0
  394. package/dist/core/web/web-events.js.map +1 -0
  395. package/dist/core/web/web-export.d.ts +18 -0
  396. package/dist/core/web/web-export.d.ts.map +1 -0
  397. package/dist/core/web/web-export.js +112 -0
  398. package/dist/core/web/web-export.js.map +1 -0
  399. package/dist/core/web/web-server.d.ts +34 -0
  400. package/dist/core/web/web-server.d.ts.map +1 -0
  401. package/dist/core/web/web-server.js +182 -0
  402. package/dist/core/web/web-server.js.map +1 -0
  403. package/dist/core/web/web-static.d.ts +20 -0
  404. package/dist/core/web/web-static.d.ts.map +1 -0
  405. package/dist/core/web/web-static.js +104 -0
  406. package/dist/core/web/web-static.js.map +1 -0
  407. package/dist/harness/{agy.d.ts → agy/agy.d.ts} +8 -6
  408. package/dist/harness/agy/agy.d.ts.map +1 -0
  409. package/dist/harness/{agy.js → agy/agy.js} +49 -34
  410. package/dist/harness/agy/agy.js.map +1 -0
  411. package/dist/harness/claude/claude-turns.d.ts +29 -0
  412. package/dist/harness/claude/claude-turns.d.ts.map +1 -0
  413. package/dist/harness/claude/claude-turns.js +162 -0
  414. package/dist/harness/claude/claude-turns.js.map +1 -0
  415. package/dist/harness/claude/claude-usage.d.ts +12 -0
  416. package/dist/harness/claude/claude-usage.d.ts.map +1 -0
  417. package/dist/harness/claude/claude-usage.js +144 -0
  418. package/dist/harness/claude/claude-usage.js.map +1 -0
  419. package/dist/harness/codex/codex-observe-usage.d.ts +6 -0
  420. package/dist/harness/codex/codex-observe-usage.d.ts.map +1 -0
  421. package/dist/harness/codex/codex-observe-usage.js +215 -0
  422. package/dist/harness/codex/codex-observe-usage.js.map +1 -0
  423. package/dist/harness/codex/codex-prompt.d.ts +17 -0
  424. package/dist/harness/codex/codex-prompt.d.ts.map +1 -0
  425. package/dist/harness/codex/codex-prompt.js +43 -0
  426. package/dist/harness/codex/codex-prompt.js.map +1 -0
  427. package/dist/harness/codex/codex-stream.d.ts +23 -0
  428. package/dist/harness/codex/codex-stream.d.ts.map +1 -0
  429. package/dist/harness/codex/codex-stream.js +182 -0
  430. package/dist/harness/codex/codex-stream.js.map +1 -0
  431. package/dist/harness/codex/codex-usage.d.ts +26 -0
  432. package/dist/harness/codex/codex-usage.d.ts.map +1 -0
  433. package/dist/harness/codex/codex-usage.js +122 -0
  434. package/dist/harness/codex/codex-usage.js.map +1 -0
  435. package/dist/harness/codex/codex.d.ts +16 -0
  436. package/dist/harness/codex/codex.d.ts.map +1 -0
  437. package/dist/harness/codex/codex.js +92 -0
  438. package/dist/harness/codex/codex.js.map +1 -0
  439. package/dist/harness/index.d.ts +11 -2
  440. package/dist/harness/index.d.ts.map +1 -1
  441. package/dist/harness/index.js +24 -9
  442. package/dist/harness/index.js.map +1 -1
  443. package/dist/harness/mock.d.ts +5 -2
  444. package/dist/harness/mock.d.ts.map +1 -1
  445. package/dist/harness/mock.js +10 -11
  446. package/dist/harness/mock.js.map +1 -1
  447. package/dist/harness/opencode/opencode-observe-usage.d.ts +4 -0
  448. package/dist/harness/opencode/opencode-observe-usage.d.ts.map +1 -0
  449. package/dist/harness/opencode/opencode-observe-usage.js +100 -0
  450. package/dist/harness/opencode/opencode-observe-usage.js.map +1 -0
  451. package/dist/harness/opencode/opencode-usage.d.ts +24 -0
  452. package/dist/harness/opencode/opencode-usage.d.ts.map +1 -0
  453. package/dist/harness/opencode/opencode-usage.js +181 -0
  454. package/dist/harness/opencode/opencode-usage.js.map +1 -0
  455. package/dist/harness/{opencode.d.ts → opencode/opencode.d.ts} +10 -7
  456. package/dist/harness/opencode/opencode.d.ts.map +1 -0
  457. package/dist/harness/{opencode.js → opencode/opencode.js} +159 -70
  458. package/dist/harness/opencode/opencode.js.map +1 -0
  459. package/dist/harness/pi/pi-args.d.ts +9 -0
  460. package/dist/harness/pi/pi-args.d.ts.map +1 -0
  461. package/dist/harness/pi/pi-args.js +33 -0
  462. package/dist/harness/pi/pi-args.js.map +1 -0
  463. package/dist/harness/pi/pi-stream.d.ts +27 -0
  464. package/dist/harness/pi/pi-stream.d.ts.map +1 -0
  465. package/dist/harness/pi/pi-stream.js +176 -0
  466. package/dist/harness/pi/pi-stream.js.map +1 -0
  467. package/dist/harness/pi/pi-tools.d.ts +5 -0
  468. package/dist/harness/pi/pi-tools.d.ts.map +1 -0
  469. package/dist/harness/pi/pi-tools.js +31 -0
  470. package/dist/harness/pi/pi-tools.js.map +1 -0
  471. package/dist/harness/pi/pi.d.ts +11 -0
  472. package/dist/harness/pi/pi.d.ts.map +1 -0
  473. package/dist/harness/pi/pi.js +109 -0
  474. package/dist/harness/pi/pi.js.map +1 -0
  475. package/dist/harness/prompt.d.ts +11 -0
  476. package/dist/harness/prompt.d.ts.map +1 -0
  477. package/dist/harness/prompt.js +105 -0
  478. package/dist/harness/prompt.js.map +1 -0
  479. package/dist/harness/types.d.ts +289 -8
  480. package/dist/harness/types.d.ts.map +1 -1
  481. package/dist/harness/types.js +125 -0
  482. package/dist/harness/types.js.map +1 -1
  483. package/dist/index.d.ts +13 -2
  484. package/dist/index.d.ts.map +1 -1
  485. package/dist/index.js +8 -1
  486. package/dist/index.js.map +1 -1
  487. package/dist/watcher/archive-verify.d.ts +9 -0
  488. package/dist/watcher/archive-verify.d.ts.map +1 -0
  489. package/dist/watcher/archive-verify.js +80 -0
  490. package/dist/watcher/archive-verify.js.map +1 -0
  491. package/dist/watcher/archiver.d.ts +14 -2
  492. package/dist/watcher/archiver.d.ts.map +1 -1
  493. package/dist/watcher/archiver.js +112 -33
  494. package/dist/watcher/archiver.js.map +1 -1
  495. package/dist/watcher/attempt.d.ts +19 -0
  496. package/dist/watcher/attempt.d.ts.map +1 -0
  497. package/dist/watcher/attempt.js +94 -0
  498. package/dist/watcher/attempt.js.map +1 -0
  499. package/dist/watcher/auto-retry.d.ts +11 -0
  500. package/dist/watcher/auto-retry.d.ts.map +1 -0
  501. package/dist/watcher/auto-retry.js +180 -0
  502. package/dist/watcher/auto-retry.js.map +1 -0
  503. package/dist/watcher/build-project.d.ts +11 -0
  504. package/dist/watcher/build-project.d.ts.map +1 -0
  505. package/dist/watcher/build-project.js +36 -0
  506. package/dist/watcher/build-project.js.map +1 -0
  507. package/dist/watcher/build.d.ts +27 -0
  508. package/dist/watcher/build.d.ts.map +1 -0
  509. package/dist/watcher/build.js +165 -0
  510. package/dist/watcher/build.js.map +1 -0
  511. package/dist/watcher/change-verify.d.ts +25 -0
  512. package/dist/watcher/change-verify.d.ts.map +1 -0
  513. package/dist/watcher/change-verify.js +57 -0
  514. package/dist/watcher/change-verify.js.map +1 -0
  515. package/dist/watcher/dev.d.ts +51 -0
  516. package/dist/watcher/dev.d.ts.map +1 -0
  517. package/dist/watcher/dev.js +124 -0
  518. package/dist/watcher/dev.js.map +1 -0
  519. package/dist/watcher/failure-reason.d.ts +7 -0
  520. package/dist/watcher/failure-reason.d.ts.map +1 -0
  521. package/dist/watcher/failure-reason.js +2 -0
  522. package/dist/watcher/failure-reason.js.map +1 -0
  523. package/dist/watcher/fingerprint.d.ts +19 -0
  524. package/dist/watcher/fingerprint.d.ts.map +1 -0
  525. package/dist/watcher/fingerprint.js +82 -0
  526. package/dist/watcher/fingerprint.js.map +1 -0
  527. package/dist/watcher/heartbeat.d.ts +33 -0
  528. package/dist/watcher/heartbeat.d.ts.map +1 -0
  529. package/dist/watcher/heartbeat.js +135 -0
  530. package/dist/watcher/heartbeat.js.map +1 -0
  531. package/dist/watcher/lock.d.ts +10 -0
  532. package/dist/watcher/lock.d.ts.map +1 -0
  533. package/dist/watcher/lock.js +14 -0
  534. package/dist/watcher/lock.js.map +1 -0
  535. package/dist/watcher/loop.d.ts +26 -6
  536. package/dist/watcher/loop.d.ts.map +1 -1
  537. package/dist/watcher/loop.js +154 -37
  538. package/dist/watcher/loop.js.map +1 -1
  539. package/dist/watcher/measures.d.ts +46 -0
  540. package/dist/watcher/measures.d.ts.map +1 -0
  541. package/dist/watcher/measures.js +203 -0
  542. package/dist/watcher/measures.js.map +1 -0
  543. package/dist/watcher/outcome.d.ts +34 -0
  544. package/dist/watcher/outcome.d.ts.map +1 -0
  545. package/dist/watcher/outcome.js +131 -0
  546. package/dist/watcher/outcome.js.map +1 -0
  547. package/dist/watcher/regression.d.ts +43 -0
  548. package/dist/watcher/regression.d.ts.map +1 -0
  549. package/dist/watcher/regression.js +178 -0
  550. package/dist/watcher/regression.js.map +1 -0
  551. package/dist/watcher/runner.d.ts +6 -68
  552. package/dist/watcher/runner.d.ts.map +1 -1
  553. package/dist/watcher/runner.js +74 -523
  554. package/dist/watcher/runner.js.map +1 -1
  555. package/dist/watcher/spawn.d.ts +48 -0
  556. package/dist/watcher/spawn.d.ts.map +1 -0
  557. package/dist/watcher/spawn.js +135 -0
  558. package/dist/watcher/spawn.js.map +1 -0
  559. package/dist/watcher/task-verify.d.ts +59 -0
  560. package/dist/watcher/task-verify.d.ts.map +1 -0
  561. package/dist/watcher/task-verify.js +108 -0
  562. package/dist/watcher/task-verify.js.map +1 -0
  563. package/dist/watcher/verify.d.ts +44 -0
  564. package/dist/watcher/verify.d.ts.map +1 -0
  565. package/dist/watcher/verify.js +156 -0
  566. package/dist/watcher/verify.js.map +1 -0
  567. package/package.json +21 -9
  568. package/templates/PLANNER.md +77 -0
  569. package/templates/openspec/config.yaml +24 -0
  570. package/templates/openspec/schemas/osq/README.md +30 -0
  571. package/templates/openspec/schemas/osq/schema.yaml +133 -0
  572. package/templates/openspec/schemas/osq/templates/proposal.md +66 -0
  573. package/templates/openspec/schemas/osq/templates/spec.md +13 -0
  574. package/templates/openspec/schemas/osq/templates/tasks.md +11 -0
  575. package/templates/proposal.md +66 -0
  576. package/templates/tasks.md +5 -0
  577. package/ui/dist/assets/index-CZYeQ8la.js +9 -0
  578. package/ui/dist/assets/index-D6zVSjO7.css +1 -0
  579. package/ui/dist/index.html +14 -0
  580. package/dist/core/approve.d.ts +0 -11
  581. package/dist/core/approve.d.ts.map +0 -1
  582. package/dist/core/approve.js +0 -52
  583. package/dist/core/approve.js.map +0 -1
  584. package/dist/core/config.d.ts.map +0 -1
  585. package/dist/core/config.js.map +0 -1
  586. package/dist/core/hasher.d.ts +0 -4
  587. package/dist/core/hasher.d.ts.map +0 -1
  588. package/dist/core/hasher.js.map +0 -1
  589. package/dist/core/init.d.ts +0 -12
  590. package/dist/core/init.d.ts.map +0 -1
  591. package/dist/core/init.js +0 -151
  592. package/dist/core/init.js.map +0 -1
  593. package/dist/core/linter.d.ts +0 -8
  594. package/dist/core/linter.d.ts.map +0 -1
  595. package/dist/core/linter.js +0 -100
  596. package/dist/core/linter.js.map +0 -1
  597. package/dist/core/lock.d.ts.map +0 -1
  598. package/dist/core/lock.js.map +0 -1
  599. package/dist/core/logger.d.ts.map +0 -1
  600. package/dist/core/logger.js.map +0 -1
  601. package/dist/core/new.d.ts.map +0 -1
  602. package/dist/core/new.js +0 -79
  603. package/dist/core/new.js.map +0 -1
  604. package/dist/core/parser.d.ts +0 -32
  605. package/dist/core/parser.d.ts.map +0 -1
  606. package/dist/core/parser.js +0 -87
  607. package/dist/core/parser.js.map +0 -1
  608. package/dist/core/report.d.ts +0 -54
  609. package/dist/core/report.d.ts.map +0 -1
  610. package/dist/core/report.js +0 -475
  611. package/dist/core/report.js.map +0 -1
  612. package/dist/core/show.d.ts +0 -50
  613. package/dist/core/show.d.ts.map +0 -1
  614. package/dist/core/show.js +0 -374
  615. package/dist/core/show.js.map +0 -1
  616. package/dist/core/state.d.ts +0 -25
  617. package/dist/core/state.d.ts.map +0 -1
  618. package/dist/core/state.js +0 -180
  619. package/dist/core/state.js.map +0 -1
  620. package/dist/core/status.d.ts +0 -10
  621. package/dist/core/status.d.ts.map +0 -1
  622. package/dist/core/status.js +0 -106
  623. package/dist/core/status.js.map +0 -1
  624. package/dist/harness/agy.d.ts.map +0 -1
  625. package/dist/harness/agy.js.map +0 -1
  626. package/dist/harness/opencode.d.ts.map +0 -1
  627. package/dist/harness/opencode.js.map +0 -1
@@ -0,0 +1,203 @@
1
+ import crypto from 'node:crypto';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { SCOPE_RESOLVER_VERSION, resolveScope } from '../core/run/scope.js';
5
+ import { resolveChangeDoc } from '../core/spec/parser.js';
6
+ import { appendHarnessEvent } from '../harness/types.js';
7
+ const IGNORED_DIRS = new Set('node_modules dist .git .run coverage .nyc_output .vscode .idea'.split(' '));
8
+ const SCRIPT_EXTENSION_REGEX = /\.(?:ts|tsx|js|mjs|cjs)$/;
9
+ function countLines(content) {
10
+ return content.split('\n').length;
11
+ }
12
+ function toPosix(value) {
13
+ return value.split(path.sep).join('/');
14
+ }
15
+ function relativePosix(projectRoot, filePath) {
16
+ return toPosix(path.relative(projectRoot, filePath));
17
+ }
18
+ function hashContent(content) {
19
+ return `sha256:${crypto.createHash('sha256').update(content, 'utf8').digest('hex')}`;
20
+ }
21
+ /** Snapshot every resolved scoped file's content hash and line count in one pass. */
22
+ export async function snapshotScope(projectRoot, scope) {
23
+ const hashes = {};
24
+ const lines = {};
25
+ for (const { relativePath, absolutePath } of await resolveScope(projectRoot, scope)) {
26
+ const content = absolutePath ? await fs.readFile(absolutePath, 'utf8').catch(() => null) : null;
27
+ hashes[relativePath] = content === null ? null : hashContent(content);
28
+ lines[relativePath] = content === null ? 0 : countLines(content);
29
+ }
30
+ return { hashes, lines };
31
+ }
32
+ /** Line count of every existing file in `scope`; missing files contribute nothing. */
33
+ export async function gatherScopeCounts(projectRoot, scope) {
34
+ const { hashes, lines } = await snapshotScope(projectRoot, scope);
35
+ const files = Object.values(hashes).filter((hash) => hash !== null).length;
36
+ const total = Object.values(lines).reduce((sum, count) => sum + count, 0);
37
+ return { files, lines: total };
38
+ }
39
+ /** Recursively total all text files and their lines, skipping ignored directories. */
40
+ export async function gatherRepoCounts(projectRoot) {
41
+ let files = 0;
42
+ let lines = 0;
43
+ const walk = async (dir) => {
44
+ const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);
45
+ for (const entry of entries) {
46
+ const fullPath = path.join(dir, entry.name);
47
+ if (entry.isDirectory()) {
48
+ if (!IGNORED_DIRS.has(entry.name))
49
+ await walk(fullPath);
50
+ continue;
51
+ }
52
+ if (!entry.isFile())
53
+ continue;
54
+ const content = await fs.readFile(fullPath, 'utf8').catch(() => null);
55
+ if (content === null || content.includes('\u0000'))
56
+ continue;
57
+ files += 1;
58
+ lines += countLines(content);
59
+ }
60
+ };
61
+ await walk(projectRoot);
62
+ return { files, lines };
63
+ }
64
+ async function listTsFiles(dir) {
65
+ const entries = await fs.readdir(dir, { withFileTypes: true }).catch(() => []);
66
+ const files = [];
67
+ for (const entry of entries) {
68
+ const fullPath = path.join(dir, entry.name);
69
+ if (entry.isDirectory())
70
+ files.push(...(await listTsFiles(fullPath)));
71
+ else if (entry.isFile() && entry.name.endsWith('.ts'))
72
+ files.push(fullPath);
73
+ }
74
+ return files;
75
+ }
76
+ function importSpecifier(fromDir, targetPath) {
77
+ const relative = toPosix(path.relative(fromDir, targetPath)).replace(SCRIPT_EXTENSION_REGEX, '');
78
+ return relative.startsWith('.') ? relative : `./${relative}`;
79
+ }
80
+ /** Count of non-scoped `src/**` TypeScript files that import at least one resolved scoped file. */
81
+ export async function countImportFanIn(projectRoot, scope) {
82
+ const srcDir = path.join(projectRoot, 'src');
83
+ const scopePaths = (await resolveScope(projectRoot, scope))
84
+ .map((entry) => entry.absolutePath)
85
+ .filter((resolved) => resolved?.startsWith(srcDir + path.sep) === true);
86
+ const scoped = new Set(scopePaths.map((resolved) => relativePosix(projectRoot, resolved)));
87
+ let importers = 0;
88
+ for (const file of await listTsFiles(srcDir)) {
89
+ if (scoped.has(relativePosix(projectRoot, file)))
90
+ continue;
91
+ const content = await fs.readFile(file, 'utf8').catch(() => '');
92
+ if (!content)
93
+ continue;
94
+ const dir = path.dirname(file);
95
+ if (scopePaths.some((target) => content.includes(importSpecifier(dir, target))))
96
+ importers += 1;
97
+ }
98
+ return importers;
99
+ }
100
+ /** Whitespace-delimited word count; empty and whitespace-only input yield 0. */
101
+ export function countWords(text) {
102
+ return text.split(/\s+/).filter((word) => word.length > 0).length;
103
+ }
104
+ /** Requirement and scenario header counts across a change's delta spec files. */
105
+ export async function countDeltaRequirementsAndScenarios(specFolderPath) {
106
+ const specsDir = path.join(specFolderPath, 'specs');
107
+ const entries = await fs.readdir(specsDir, { withFileTypes: true }).catch(() => []);
108
+ let requirements = 0;
109
+ let scenarios = 0;
110
+ for (const entry of entries) {
111
+ if (!entry.isDirectory())
112
+ continue;
113
+ const content = await fs
114
+ .readFile(path.join(specsDir, entry.name, 'spec.md'), 'utf8')
115
+ .catch(() => '');
116
+ requirements += (content.match(/^###\s+Requirement:/gm) ?? []).length;
117
+ scenarios += (content.match(/^####\s+Scenario:/gm) ?? []).length;
118
+ }
119
+ return { requirements, scenarios };
120
+ }
121
+ /** `sha256:<hex>` of a file's UTF-8 content, or `null` when it cannot be read. */
122
+ export async function hashFileForMeasures(filePath) {
123
+ const content = await fs.readFile(filePath, 'utf8').catch(() => null);
124
+ return content === null ? null : hashContent(content);
125
+ }
126
+ /** Map of project-relative scoped path to its current content hash. */
127
+ export async function snapshotScopeHashes(projectRoot, scope) {
128
+ return (await snapshotScope(projectRoot, scope)).hashes;
129
+ }
130
+ /** Map of project-relative scoped path to its current line count; missing files are 0. */
131
+ export async function snapshotScopeLines(projectRoot, scope) {
132
+ return (await snapshotScope(projectRoot, scope)).lines;
133
+ }
134
+ /** The single emission path for both start and end measures events. */
135
+ export async function emitMeasures(specFolderPath, taskNumber, data) {
136
+ await appendHarnessEvent(specFolderPath, taskNumber, {
137
+ type: 'measures',
138
+ timestamp: new Date().toISOString(),
139
+ data,
140
+ });
141
+ }
142
+ /** Collect the raw start-phase baselines for a task. */
143
+ export async function gatherStartMeasures(projectRoot, specFolderPath, taskData) {
144
+ const proposalDoc = await resolveChangeDoc(specFolderPath);
145
+ const proposalContent = proposalDoc
146
+ ? await fs.readFile(proposalDoc.path, 'utf8').catch(() => '')
147
+ : '';
148
+ const [scopeCounts, repoCounts, importFanIn, delta] = await Promise.all([
149
+ gatherScopeCounts(projectRoot, taskData.scope),
150
+ gatherRepoCounts(projectRoot),
151
+ countImportFanIn(projectRoot, taskData.scope),
152
+ countDeltaRequirementsAndScenarios(specFolderPath),
153
+ ]);
154
+ return {
155
+ phase: 'start',
156
+ scopeResolver: SCOPE_RESOLVER_VERSION,
157
+ scopeFiles: scopeCounts.files,
158
+ scopeLines: scopeCounts.lines,
159
+ repoFiles: repoCounts.files,
160
+ repoLines: repoCounts.lines,
161
+ importFanIn,
162
+ proposalWords: countWords(proposalContent),
163
+ taskWords: countWords(taskData.raw),
164
+ deltaRequirements: delta.requirements,
165
+ deltaScenarios: delta.scenarios,
166
+ };
167
+ }
168
+ /** End-phase diff: changed file count, absolute line delta, and before/after hashes. */
169
+ export async function gatherEndMeasures(startMeasures, before, projectRoot, scope) {
170
+ const after = await snapshotScope(projectRoot, scope);
171
+ const scopeHashes = {};
172
+ let changedFiles = 0;
173
+ let changedLines = 0;
174
+ for (const key of new Set([...Object.keys(before.hashes), ...Object.keys(after.hashes)])) {
175
+ const beforeHash = before.hashes[key] ?? null;
176
+ const afterHash = after.hashes[key] ?? null;
177
+ scopeHashes[key] = { before: beforeHash, after: afterHash };
178
+ if (beforeHash !== afterHash) {
179
+ changedFiles += 1;
180
+ changedLines += Math.abs((after.lines[key] ?? 0) - (before.lines[key] ?? 0));
181
+ }
182
+ }
183
+ return { ...startMeasures, phase: 'end', changedFiles, changedLines, scopeHashes };
184
+ }
185
+ /** Create the start/end measures emitter pair for one task run. */
186
+ export function createTaskMeasures(projectRoot, specFolderPath, taskNumber, taskData) {
187
+ let start = null;
188
+ let before = null;
189
+ return {
190
+ async emitStart() {
191
+ before = await snapshotScope(projectRoot, taskData.scope);
192
+ start = await gatherStartMeasures(projectRoot, specFolderPath, taskData);
193
+ await emitMeasures(specFolderPath, taskNumber, start);
194
+ },
195
+ async emitEnd() {
196
+ if (!start || !before)
197
+ return;
198
+ const end = await gatherEndMeasures(start, before, projectRoot, taskData.scope);
199
+ await emitMeasures(specFolderPath, taskNumber, end);
200
+ },
201
+ };
202
+ }
203
+ //# sourceMappingURL=measures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measures.js","sourceRoot":"","sources":["../../src/watcher/measures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type Logger } from '../core/foundation/logger.js';
2
+ import { type HarnessEvent, type RegressedEventData } from '../harness/types.js';
3
+ import type { RunTaskFailureReason } from './failure-reason.js';
4
+ export type { RunTaskFailureReason } from './failure-reason.js';
5
+ export interface RunTaskResult {
6
+ success: boolean;
7
+ reason?: RunTaskFailureReason;
8
+ error?: string;
9
+ }
10
+ /** Tick `taskNumber`'s checkbox, supporting flat and grouped (`## <n>.`) numbering. Pure. */
11
+ export declare function tickTaskCheckboxContent(content: string, taskNumber: string): string;
12
+ export declare function tickTaskCheckbox(specFolderPath: string, taskNumber: string): Promise<void>;
13
+ export declare function recordLifecycleEvent(specFolderPath: string, taskNumber: string, event: HarnessEvent, summary: string, logger?: Logger, level?: 'info' | 'verbose'): Promise<void>;
14
+ export declare function recordDeadEvent(specFolderPath: string, taskNumber: string, reason: RunTaskFailureReason): Promise<void>;
15
+ export declare function recordRegressedEvent(specFolderPath: string, target: string, data: RegressedEventData): Promise<void>;
16
+ export declare function recordDoneEvent(specFolderPath: string, taskNumber: string): Promise<void>;
17
+ export declare function formatReapedMarker(reason: 'crashed' | 'timeout', pid: number, startedAt: number, reapedAt?: number): string;
18
+ export declare function writeDeadMarker(runDir: string, taskNumber: string, content: string, projectRoot?: string): Promise<void>;
19
+ /** Write the `.run/regressed/<target>.md` marker, creating the directory when needed. */
20
+ export declare function writeRegressedMarker(runDir: string, target: string, content: string): Promise<void>;
21
+ export interface DoneMarkerMetadata {
22
+ scopeHash: string;
23
+ buildStamp: string;
24
+ exitCode: number;
25
+ fileHashes?: Record<string, string | null>;
26
+ /** Recorded deterministic resolver version; defaults to the current version. */
27
+ scopeResolver?: number;
28
+ /** Short HEAD commit of the project being watched, or null outside git. */
29
+ projectCommit?: string | null;
30
+ }
31
+ export declare function writeDoneMarker(runDir: string, taskNumber: string, metadata?: DoneMarkerMetadata): Promise<void>;
32
+ /** Task-outcome line: verified, dead, or regressed with reason and elapsed seconds. */
33
+ export declare function formatTaskOutcomeLine(taskNumber: string, success: boolean, reason: RunTaskFailureReason | undefined, elapsedSeconds: number, symbols: boolean, extra?: string): string;
34
+ //# sourceMappingURL=outcome.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outcome.d.ts","sourceRoot":"","sources":["../../src/watcher/outcome.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,kBAAkB,EAExB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AACD,6FAA6F;AAC7F,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CA8BnF;AACD,wBAAsB,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhG;AACD,wBAAsB,oBAAoB,CACxC,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,YAAY,EACnB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,GAAE,MAAM,GAAG,SAAkB,GACjC,OAAO,CAAC,IAAI,CAAC,CAOf;AACD,wBAAsB,eAAe,CACnC,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAMf;AACD,wBAAsB,oBAAoB,CACxC,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,IAAI,CAAC,CAMf;AACD,wBAAsB,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM/F;AACD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,MAAmB,GAC5B,MAAM,CAWR;AAWD,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAEf;AACD,yFAAyF;AACzF,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAEf;AACD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3C,gFAAgF;IAChF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAKD,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,kBAAkB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAQf;AACD,uFAAuF;AACvF,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,oBAAoB,GAAG,SAAS,EACxC,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,OAAO,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CASR"}
@@ -0,0 +1,131 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { resolveSymbol } from '../core/foundation/logger.js';
4
+ import { SCOPE_RESOLVER_VERSION } from '../core/run/scope.js';
5
+ import { appendHarnessEvent, } from '../harness/types.js';
6
+ import { addFingerprint } from './fingerprint.js';
7
+ /** Tick `taskNumber`'s checkbox, supporting flat and grouped (`## <n>.`) numbering. Pure. */
8
+ export function tickTaskCheckboxContent(content, taskNumber) {
9
+ const target = Number.parseInt(taskNumber, 10);
10
+ if (Number.isNaN(target)) {
11
+ return content;
12
+ }
13
+ const lines = content.split('\n');
14
+ let sectionNumber = null;
15
+ let changed = false;
16
+ const updated = lines.map((line) => {
17
+ // Any `## ` heading resets the section scope; only a numeric heading
18
+ // associates unnumbered items with a task.
19
+ const headingMatch = line.match(/^##\s+(\S.*?)\s*$/);
20
+ if (headingMatch) {
21
+ const numeric = headingMatch[1].match(/^(\d+)[.)]?(?:\s|$)/);
22
+ sectionNumber = numeric ? Number.parseInt(numeric[1], 10) : null;
23
+ return line;
24
+ }
25
+ const itemMatch = line.match(/^(\s*-\s+\[)([ xX])(\]\s*)((?:(\d+)[.)]\s+)?)(.*)$/);
26
+ if (!itemMatch) {
27
+ return line;
28
+ }
29
+ const [, prefix, mark, close, numberedPrefix, itemNumber, rest] = itemMatch;
30
+ const identifier = itemNumber ? Number.parseInt(itemNumber, 10) : sectionNumber;
31
+ if (identifier !== target || mark.toLowerCase() === 'x') {
32
+ return line;
33
+ }
34
+ changed = true;
35
+ return `${prefix}x${close}${numberedPrefix}${rest}`;
36
+ });
37
+ return changed ? updated.join('\n') : content;
38
+ }
39
+ export async function tickTaskCheckbox(specFolderPath, taskNumber) {
40
+ const tasksMdPath = path.join(specFolderPath, 'tasks.md');
41
+ let content = '';
42
+ try {
43
+ content = await fs.readFile(tasksMdPath, 'utf8');
44
+ }
45
+ catch {
46
+ return;
47
+ }
48
+ const updated = tickTaskCheckboxContent(content, taskNumber);
49
+ if (updated !== content) {
50
+ await fs.writeFile(tasksMdPath, updated, 'utf8');
51
+ }
52
+ }
53
+ export async function recordLifecycleEvent(specFolderPath, taskNumber, event, summary, logger, level = 'info') {
54
+ await appendHarnessEvent(specFolderPath, taskNumber, event);
55
+ if (level === 'verbose') {
56
+ logger?.verbose(summary);
57
+ }
58
+ else {
59
+ logger?.info(summary);
60
+ }
61
+ }
62
+ export async function recordDeadEvent(specFolderPath, taskNumber, reason) {
63
+ await appendHarnessEvent(specFolderPath, taskNumber, {
64
+ type: 'dead',
65
+ timestamp: new Date().toISOString(),
66
+ data: { task: taskNumber, reason },
67
+ });
68
+ }
69
+ export async function recordRegressedEvent(specFolderPath, target, data) {
70
+ await appendHarnessEvent(specFolderPath, target, {
71
+ type: 'regressed',
72
+ timestamp: new Date().toISOString(),
73
+ data: { task: target, ...data },
74
+ });
75
+ }
76
+ export async function recordDoneEvent(specFolderPath, taskNumber) {
77
+ await appendHarnessEvent(specFolderPath, taskNumber, {
78
+ type: 'done',
79
+ timestamp: new Date().toISOString(),
80
+ data: { task: taskNumber },
81
+ });
82
+ }
83
+ export function formatReapedMarker(reason, pid, startedAt, reapedAt = Date.now()) {
84
+ return [
85
+ '---',
86
+ `reason: ${reason}`,
87
+ `pid: ${pid}`,
88
+ `started_at: ${new Date(startedAt).toISOString()}`,
89
+ `reaped_at: ${new Date(reapedAt).toISOString()}`,
90
+ '---',
91
+ `Task execution terminated by watcher reaper (${reason}).`,
92
+ '',
93
+ ].join('\n');
94
+ }
95
+ async function writeMarkerFile(runDir, kind, name, content) {
96
+ const dir = path.join(runDir, kind);
97
+ await fs.mkdir(dir, { recursive: true });
98
+ await fs.writeFile(path.join(dir, name), content, 'utf8');
99
+ }
100
+ export async function writeDeadMarker(runDir, taskNumber, content, projectRoot) {
101
+ await writeMarkerFile(runDir, 'dead', `${taskNumber}.md`, addFingerprint(content, projectRoot));
102
+ }
103
+ /** Write the `.run/regressed/<target>.md` marker, creating the directory when needed. */
104
+ export async function writeRegressedMarker(runDir, target, content) {
105
+ await writeMarkerFile(runDir, 'regressed', `${target}.md`, content);
106
+ }
107
+ /** Frontmatter line for the watched project's commit, null when absent. */
108
+ function formatProjectCommit(projectCommit) {
109
+ return projectCommit ? `project_commit: "${projectCommit}"\n` : 'project_commit: null\n';
110
+ }
111
+ export async function writeDoneMarker(runDir, taskNumber, metadata) {
112
+ const doneDir = path.join(runDir, 'done');
113
+ await fs.mkdir(doneDir, { recursive: true });
114
+ const stamp = `${new Date().toISOString()}\n`;
115
+ const frontmatter = metadata
116
+ ? `---\nscope_resolver: ${metadata.scopeResolver ?? SCOPE_RESOLVER_VERSION}\nscope_hash: "${metadata.scopeHash}"\nbuild_stamp: "${metadata.buildStamp}"\n${formatProjectCommit(metadata.projectCommit)}exit_code: ${metadata.exitCode}\nscope_files: ${JSON.stringify(metadata.fileHashes ?? {})}\n---\n`
117
+ : '';
118
+ await fs.writeFile(path.join(doneDir, taskNumber), `${frontmatter}${stamp}`, 'utf8');
119
+ }
120
+ /** Task-outcome line: verified, dead, or regressed with reason and elapsed seconds. */
121
+ export function formatTaskOutcomeLine(taskNumber, success, reason, elapsedSeconds, symbols, extra) {
122
+ if (success) {
123
+ return `${resolveSymbol('✓', '[ok]', symbols)} task ${taskNumber} verified (elapsed: ${elapsedSeconds}s)`;
124
+ }
125
+ const detail = extra ? `, ${extra}` : '';
126
+ if (reason === 'regressed') {
127
+ return `${resolveSymbol('?', '[regressed]', symbols)} task ${taskNumber} regressed (reason: ${reason}${detail}, elapsed: ${elapsedSeconds}s)`;
128
+ }
129
+ return `${resolveSymbol('✗', '[dead]', symbols)} task ${taskNumber} dead (reason: ${reason}${detail}, elapsed: ${elapsedSeconds}s)`;
130
+ }
131
+ //# sourceMappingURL=outcome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outcome.js","sourceRoot":"","sources":["../../src/watcher/outcome.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { OsqConfig } from '../core/foundation/config.js';
2
+ import { type StaleTaskAudit } from '../core/run/scope-hash.js';
3
+ import { type DoneMarkerMetadata, type RunTaskResult } from './outcome.js';
4
+ export { computeTaskScopeHash } from '../core/run/scope-hash.js';
5
+ export type { ScopeHashResult } from '../core/run/scope-hash.js';
6
+ /** Outcome of comparing a previously completed task's scope to the tree. */
7
+ export interface ScopeRegressionResult {
8
+ regressed: true;
9
+ taskNumber: string;
10
+ differingPaths: string[];
11
+ recordedHash: string;
12
+ currentHash: string;
13
+ }
14
+ export interface ScopeAuditOptions {
15
+ projectRoot: string;
16
+ specFolderPath: string;
17
+ eligibleTaskNumbers: readonly string[];
18
+ verifyTimeoutSeconds: number;
19
+ /** When false, detect and attribute only; never verify or write artifacts. */
20
+ record?: boolean;
21
+ }
22
+ export interface ScopeAuditResult {
23
+ stale: StaleTaskAudit[];
24
+ }
25
+ /**
26
+ * Pre-lock scope recertification audit. Compares every eligible automated done
27
+ * marker's recorded resolver-aware scope hash and version against the current
28
+ * tree in one pass, verifies each stale task under the configured timeout, and
29
+ * records one regression marker and typed event per stale task. Already-active
30
+ * regressions are reported without re-verification or duplicate writes.
31
+ */
32
+ export declare function auditScopeRegressions(options: ScopeAuditOptions): Promise<ScopeAuditResult>;
33
+ /** Legacy first-match detection export: detection only, never writes artifacts. */
34
+ export declare function checkDoneTasksScopeHashes(projectRoot: string, specFolderPath: string, currentTaskNumber: string): Promise<ScopeRegressionResult | null>;
35
+ /** Resolve the metadata written to the done marker after a passing task. */
36
+ export declare function buildDoneMetadata(projectRoot: string, scope: string[]): Promise<DoneMarkerMetadata>;
37
+ /**
38
+ * Defensive pre-spawn guard for direct `runTask` callers: record and report
39
+ * every stale earlier task without spawning. The watcher cycle audits before
40
+ * `runTask`; this keeps direct calls safe.
41
+ */
42
+ export declare function guardScopeRegression(projectRoot: string, specFolderPath: string, currentTaskNumber: string, config: OsqConfig): Promise<RunTaskResult | null>;
43
+ //# sourceMappingURL=regression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regression.d.ts","sourceRoot":"","sources":["../../src/watcher/regression.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAEL,KAAK,cAAc,EASpB,MAAM,2BAA2B,CAAC;AAKnC,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAGnB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,4EAA4E;AAC5E,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,IAAI,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,8EAA8E;IAC9E,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsGjG;AAQD,mFAAmF;AACnF,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAqBvC;AAED,4EAA4E;AAC5E,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,kBAAkB,CAAC,CAc7B;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,iBAAiB,EAAE,MAAM,EACzB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAkB/B"}
@@ -0,0 +1,178 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { SCOPE_RESOLVER_VERSION, attributeScopePaths, buildScopeRegressionMarker, computeTaskScopeHash, findDifferingPaths, listCanonicalDoneNumbers, parseActiveStaleTask, readDoneMarker, readFileChangedPaths, } from '../core/run/scope-hash.js';
4
+ import { parseTaskMd } from '../core/spec/parser.js';
5
+ import { compareNumericPrefix } from '../core/status/state.js';
6
+ import { resolveProjectCommit } from './build-project.js';
7
+ import { resolveBuildInfo } from './build.js';
8
+ import { recordRegressedEvent, writeRegressedMarker, } from './outcome.js';
9
+ import { runVerificationGateResult } from './verify.js';
10
+ export { computeTaskScopeHash } from '../core/run/scope-hash.js';
11
+ /**
12
+ * Pre-lock scope recertification audit. Compares every eligible automated done
13
+ * marker's recorded resolver-aware scope hash and version against the current
14
+ * tree in one pass, verifies each stale task under the configured timeout, and
15
+ * records one regression marker and typed event per stale task. Already-active
16
+ * regressions are reported without re-verification or duplicate writes.
17
+ */
18
+ export async function auditScopeRegressions(options) {
19
+ const { projectRoot, specFolderPath, eligibleTaskNumbers, verifyTimeoutSeconds } = options;
20
+ const record = options.record ?? true;
21
+ const runDir = path.join(specFolderPath, '.run');
22
+ const doneInfo = new Map();
23
+ const changesByPath = new Map();
24
+ const completionHashes = new Map();
25
+ for (const number of await listCanonicalDoneNumbers(runDir)) {
26
+ const info = await readDoneMarker(runDir, number);
27
+ if (!info)
28
+ continue;
29
+ doneInfo.set(number, info);
30
+ completionHashes.set(number, info.scopeFiles);
31
+ for (const filePath of await readFileChangedPaths(specFolderPath, number)) {
32
+ const tasks = changesByPath.get(filePath) ?? new Set();
33
+ tasks.add(number);
34
+ changesByPath.set(filePath, tasks);
35
+ }
36
+ }
37
+ const stale = [];
38
+ for (const taskNumber of [...new Set(eligibleTaskNumbers)].sort(compareNumericPrefix)) {
39
+ const recorded = doneInfo.get(taskNumber);
40
+ if (!recorded)
41
+ continue;
42
+ const taskContent = await fs
43
+ .readFile(path.join(specFolderPath, 'tasks', `${taskNumber}.md`), 'utf8')
44
+ .catch(() => null);
45
+ if (taskContent === null)
46
+ continue;
47
+ const taskData = parseTaskMd(taskContent);
48
+ const current = await computeTaskScopeHash(projectRoot, taskData.scope);
49
+ if (current.hash === recorded.scopeHash && recorded.scopeResolver === SCOPE_RESOLVER_VERSION) {
50
+ continue;
51
+ }
52
+ // A matching aggregate hash is a version-only upgrade: report no differing
53
+ // path from the legacy per-file projection rather than inventing one.
54
+ const differing = current.hash === recorded.scopeHash
55
+ ? []
56
+ : findDifferingPaths(recorded.scopeFiles, current.fileHashes);
57
+ const base = {
58
+ differingPaths: differing.map((entry) => entry.display),
59
+ attribution: attributeScopePaths(taskNumber, differing, current.fileHashes, changesByPath, completionHashes),
60
+ recordedHash: recorded.scopeHash,
61
+ currentHash: current.hash,
62
+ };
63
+ const active = await fs
64
+ .readFile(path.join(runDir, 'regressed', `${taskNumber}.md`), 'utf8')
65
+ .catch(() => null);
66
+ if (active !== null) {
67
+ stale.push(parseActiveStaleTask(taskNumber, active, base));
68
+ continue;
69
+ }
70
+ const gate = record
71
+ ? await runVerificationGateResult(projectRoot, taskData.verify, verifyTimeoutSeconds, {
72
+ specFolderPath,
73
+ taskNumber,
74
+ })
75
+ : null;
76
+ const audit = {
77
+ taskNumber,
78
+ ...base,
79
+ verifyCommand: taskData.verify,
80
+ exitCode: gate?.exitCode ?? 1,
81
+ duration: gate?.duration ?? 0,
82
+ output: gate?.output ?? '',
83
+ timedOut: gate?.timedOut ?? false,
84
+ verificationPassed: gate?.passed ?? false,
85
+ alreadyActive: false,
86
+ };
87
+ if (gate) {
88
+ const marker = buildScopeRegressionMarker(audit).replace('\n---\n', `\nrecorded_resolver: ${JSON.stringify(recorded.scopeResolver)}\ncurrent_resolver: ${SCOPE_RESOLVER_VERSION}\n---\n`);
89
+ await writeRegressedMarker(runDir, taskNumber, marker);
90
+ await recordRegressedEvent(specFolderPath, taskNumber, {
91
+ reason: 'scope_regression',
92
+ differingPaths: audit.differingPaths,
93
+ attribution: audit.attribution,
94
+ recordedHash: audit.recordedHash,
95
+ currentHash: audit.currentHash,
96
+ command: audit.verifyCommand,
97
+ exitCode: audit.exitCode,
98
+ duration: audit.duration,
99
+ output: audit.output,
100
+ timedOut: audit.timedOut,
101
+ verificationPassed: audit.verificationPassed,
102
+ recordedResolver: recorded.scopeResolver,
103
+ currentResolver: SCOPE_RESOLVER_VERSION,
104
+ });
105
+ }
106
+ stale.push(audit);
107
+ }
108
+ return { stale };
109
+ }
110
+ async function eligibleEarlierTasks(runDir, currentTask) {
111
+ return (await listCanonicalDoneNumbers(runDir)).filter((number) => Number.parseInt(number, 10) < currentTask);
112
+ }
113
+ /** Legacy first-match detection export: detection only, never writes artifacts. */
114
+ export async function checkDoneTasksScopeHashes(projectRoot, specFolderPath, currentTaskNumber) {
115
+ const currentTask = Number.parseInt(currentTaskNumber, 10);
116
+ if (Number.isNaN(currentTask))
117
+ return null;
118
+ const eligible = await eligibleEarlierTasks(path.join(specFolderPath, '.run'), currentTask);
119
+ const audit = await auditScopeRegressions({
120
+ projectRoot,
121
+ specFolderPath,
122
+ eligibleTaskNumbers: eligible,
123
+ verifyTimeoutSeconds: 0,
124
+ record: false,
125
+ });
126
+ const first = audit.stale[0];
127
+ return first
128
+ ? {
129
+ regressed: true,
130
+ taskNumber: first.taskNumber,
131
+ differingPaths: first.differingPaths,
132
+ recordedHash: first.recordedHash,
133
+ currentHash: first.currentHash,
134
+ }
135
+ : null;
136
+ }
137
+ /** Resolve the metadata written to the done marker after a passing task. */
138
+ export async function buildDoneMetadata(projectRoot, scope) {
139
+ const [scopeHash, buildInfo, projectCommit] = await Promise.all([
140
+ computeTaskScopeHash(projectRoot, scope),
141
+ resolveBuildInfo(),
142
+ resolveProjectCommit(projectRoot),
143
+ ]);
144
+ return {
145
+ scopeHash: scopeHash.hash,
146
+ buildStamp: buildInfo.commit,
147
+ projectCommit,
148
+ exitCode: 0,
149
+ fileHashes: scopeHash.fileHashes,
150
+ scopeResolver: SCOPE_RESOLVER_VERSION,
151
+ };
152
+ }
153
+ /**
154
+ * Defensive pre-spawn guard for direct `runTask` callers: record and report
155
+ * every stale earlier task without spawning. The watcher cycle audits before
156
+ * `runTask`; this keeps direct calls safe.
157
+ */
158
+ export async function guardScopeRegression(projectRoot, specFolderPath, currentTaskNumber, config) {
159
+ const currentTask = Number.parseInt(currentTaskNumber, 10);
160
+ if (Number.isNaN(currentTask))
161
+ return null;
162
+ const eligible = await eligibleEarlierTasks(path.join(specFolderPath, '.run'), currentTask);
163
+ const audit = await auditScopeRegressions({
164
+ projectRoot,
165
+ specFolderPath,
166
+ eligibleTaskNumbers: eligible,
167
+ verifyTimeoutSeconds: config.timeouts.verifyTimeoutSeconds ?? 600,
168
+ });
169
+ const first = audit.stale[0];
170
+ return first
171
+ ? {
172
+ success: false,
173
+ reason: 'regressed',
174
+ error: `Scope of task ${first.taskNumber} changed: ${first.differingPaths.join(', ')}`,
175
+ }
176
+ : null;
177
+ }
178
+ //# sourceMappingURL=regression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regression.js","sourceRoot":"","sources":["../../src/watcher/regression.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,sBAAsB,EAEtB,mBAAmB,EACnB,0BAA0B,EAC1B,oBAAoB,EACpB,kBAAkB,EAClB,wBAAwB,EACxB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAGL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAyBjE;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAA0B;IACpE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC;IAC3F,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsD,CAAC;IAC/E,MAAM,aAAa,GAAG,IAAI,GAAG,EAAuB,CAAC;IACrD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAyC,CAAC;IAC1E,KAAK,MAAM,MAAM,IAAI,MAAM,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC3B,gBAAgB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,KAAK,MAAM,QAAQ,IAAI,MAAM,oBAAoB,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,CAAC;YAC1E,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;YAC/D,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAClB,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,KAAK,MAAM,UAAU,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACtF,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,QAAQ;YAAE,SAAS;QACxB,MAAM,WAAW,GAAG,MAAM,EAAE;aACzB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,GAAG,UAAU,KAAK,CAAC,EAAE,MAAM,CAAC;aACxE,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,WAAW,KAAK,IAAI;YAAE,SAAS;QACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxE,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,aAAa,KAAK,sBAAsB,EAAE,CAAC;YAC7F,SAAS;QACX,CAAC;QAED,2EAA2E;QAC3E,sEAAsE;QACtE,MAAM,SAAS,GACb,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,SAAS;YACjC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG;YACX,cAAc,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;YACvD,WAAW,EAAE,mBAAmB,CAC9B,UAAU,EACV,SAAS,EACT,OAAO,CAAC,UAAU,EAClB,aAAa,EACb,gBAAgB,CACjB;YACD,YAAY,EAAE,QAAQ,CAAC,SAAS;YAChC,WAAW,EAAE,OAAO,CAAC,IAAI;SAC1B,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,EAAE;aACpB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,UAAU,KAAK,CAAC,EAAE,MAAM,CAAC;aACpE,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YAC3D,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,MAAM;YACjB,CAAC,CAAC,MAAM,yBAAyB,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,EAAE,oBAAoB,EAAE;gBAClF,cAAc;gBACd,UAAU;aACX,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC;QACT,MAAM,KAAK,GAAmB;YAC5B,UAAU;YACV,GAAG,IAAI;YACP,aAAa,EAAE,QAAQ,CAAC,MAAM;YAC9B,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,CAAC;YAC7B,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,CAAC;YAC7B,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE;YAC1B,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,KAAK;YACjC,kBAAkB,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK;YACzC,aAAa,EAAE,KAAK;SACrB,CAAC;QACF,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,MAAM,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC,OAAO,CACtD,SAAS,EACT,wBAAwB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,uBAAuB,sBAAsB,SAAS,CACrH,CAAC;YACF,MAAM,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;YACvD,MAAM,oBAAoB,CAAC,cAAc,EAAE,UAAU,EAAE;gBACrD,MAAM,EAAE,kBAAkB;gBAC1B,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,OAAO,EAAE,KAAK,CAAC,aAAa;gBAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;gBAC5C,gBAAgB,EAAE,QAAQ,CAAC,aAAa;gBACxC,eAAe,EAAE,sBAAsB;aACxC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,MAAc,EAAE,WAAmB;IACrE,OAAO,CAAC,MAAM,wBAAwB,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CACpD,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,WAAW,CACtD,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,WAAmB,EACnB,cAAsB,EACtB,iBAAyB;IAEzB,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC;IAC5F,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC;QACxC,WAAW;QACX,cAAc;QACd,mBAAmB,EAAE,QAAQ;QAC7B,oBAAoB,EAAE,CAAC;QACvB,MAAM,EAAE,KAAK;KACd,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,KAAK;QACV,CAAC,CAAC;YACE,SAAS,EAAE,IAAI;YACf,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B;QACH,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,WAAmB,EACnB,KAAe;IAEf,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9D,oBAAoB,CAAC,WAAW,EAAE,KAAK,CAAC;QACxC,gBAAgB,EAAE;QAClB,oBAAoB,CAAC,WAAW,CAAC;KAClC,CAAC,CAAC;IACH,OAAO;QACL,SAAS,EAAE,SAAS,CAAC,IAAI;QACzB,UAAU,EAAE,SAAS,CAAC,MAAM;QAC5B,aAAa;QACb,QAAQ,EAAE,CAAC;QACX,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,aAAa,EAAE,sBAAsB;KACtC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,WAAmB,EACnB,cAAsB,EACtB,iBAAyB,EACzB,MAAiB;IAEjB,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC;IAC5F,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC;QACxC,WAAW;QACX,cAAc;QACd,mBAAmB,EAAE,QAAQ;QAC7B,oBAAoB,EAAE,MAAM,CAAC,QAAQ,CAAC,oBAAoB,IAAI,GAAG;KAClE,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,KAAK;QACV,CAAC,CAAC;YACE,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,WAAW;YACnB,KAAK,EAAE,iBAAiB,KAAK,CAAC,UAAU,aAAa,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACvF;QACH,CAAC,CAAC,IAAI,CAAC;AACX,CAAC"}