@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,106 @@
1
+ import { DEFAULT_CONFIG } from '../foundation/config.js';
2
+ import { resolveScope } from '../run/scope.js';
3
+ import { getSpecDetailsFromFolder } from '../status/show.js';
4
+ import { deriveSpecState } from '../status/state.js';
5
+ import { numericIdOf, resolveChangeFolder, slugOf } from './web-data-folders.js';
6
+ import { readBriefMetadata, readManifestMetadata, readPlannerAttribution, readRejection, } from './web-data-lifecycle.js';
7
+ import { observeTaskFile } from './web-data-observations.js';
8
+ function groupRecertifications(details) {
9
+ const grouped = new Map();
10
+ for (const row of details.recertifications) {
11
+ const entry = {
12
+ taskNumber: row.taskNumber,
13
+ timestamp: row.timestamp,
14
+ outcome: row.outcome,
15
+ actor: 'human',
16
+ differingPaths: row.differingPaths,
17
+ attribution: row.attribution.map((item) => ({
18
+ path: item.path,
19
+ attribution: item.attribution,
20
+ })),
21
+ verify: row.verify,
22
+ exitCode: row.exitCode,
23
+ timedOut: row.timedOut,
24
+ };
25
+ const rows = grouped.get(row.taskNumber) ?? [];
26
+ rows.push(entry);
27
+ grouped.set(row.taskNumber, rows);
28
+ }
29
+ return grouped;
30
+ }
31
+ function webTasks(details, recertifications, taskObservations, resolvedScopes, lockStarts, nowMs) {
32
+ const tasks = [];
33
+ for (const task of details.tasks) {
34
+ const observation = taskObservations.get(task.taskNumber) ?? {
35
+ attempts: 0,
36
+ cost: null,
37
+ costCoverage: { reported: 0, total: 0 },
38
+ duration: null,
39
+ };
40
+ const startedAt = task.status === 'running' ? lockStarts.get(task.taskNumber) : undefined;
41
+ const runningStart = startedAt !== undefined ? new Date(startedAt).toISOString() : null;
42
+ const runningElapsedSeconds = startedAt !== undefined ? Math.max(0, Math.round((nowMs - startedAt) / 1000)) : null;
43
+ tasks.push({
44
+ taskNumber: task.taskNumber,
45
+ title: task.title,
46
+ declaredScope: [...task.scope],
47
+ resolvedScope: resolvedScopes.get(task.taskNumber) ?? [],
48
+ acceptance: [...task.acceptance],
49
+ verify: task.verify,
50
+ state: task.status,
51
+ attempts: observation.attempts,
52
+ reason: task.deadReason ?? task.regressedReason ?? null,
53
+ runningStart,
54
+ runningElapsedSeconds,
55
+ duration: observation.duration,
56
+ cost: observation.cost,
57
+ costCoverage: observation.costCoverage,
58
+ recertifications: recertifications.get(task.taskNumber) ?? [],
59
+ result: task.resultContent ?? null,
60
+ });
61
+ }
62
+ return tasks;
63
+ }
64
+ /**
65
+ * Resolves one unambiguous active, archived, or rejected change by numeric id
66
+ * or folder key and returns its proposal, brief, and task-level evidence.
67
+ * Missing or malformed optional history becomes null or empty without hiding
68
+ * valid sibling evidence.
69
+ */
70
+ export async function getWebChange(projectRoot, selector, config = DEFAULT_CONFIG, now = new Date()) {
71
+ const folder = await resolveChangeFolder(projectRoot, selector, config);
72
+ const details = await getSpecDetailsFromFolder(projectRoot, folder.folderPath, folder.location, config);
73
+ const brief = await readBriefMetadata(folder.folderPath);
74
+ const manifest = await readManifestMetadata(folder.folderPath);
75
+ const planner = await readPlannerAttribution(brief, manifest);
76
+ const taskObservations = new Map();
77
+ const resolvedScopes = new Map();
78
+ const lockStarts = new Map();
79
+ for (const task of details.tasks) {
80
+ taskObservations.set(task.taskNumber, await observeTaskFile(folder.folderPath, task.taskNumber));
81
+ resolvedScopes.set(task.taskNumber, await resolveScope(projectRoot, task.scope));
82
+ }
83
+ const derived = await deriveSpecState(projectRoot, folder.folderPath).catch(() => null);
84
+ for (const task of derived?.tasks ?? []) {
85
+ if (task.status === 'running' && task.lock)
86
+ lockStarts.set(task.taskNumber, task.lock.startedAt);
87
+ }
88
+ return {
89
+ folderKey: folder.folderKey,
90
+ id: numericIdOf(folder.folderKey),
91
+ slug: slugOf(folder.folderKey),
92
+ title: details.title || folder.folderKey,
93
+ state: folder.location,
94
+ location: folder.location,
95
+ planner,
96
+ brief: brief.body,
97
+ goal: details.goal,
98
+ rejection: folder.location === 'rejected' ? await readRejection(folder.folderPath) : null,
99
+ dependsOn: [...details.dependsOn],
100
+ reads: [...details.features.reads],
101
+ writes: [...details.features.writes],
102
+ asOf: now.toISOString(),
103
+ tasks: webTasks(details, groupRecertifications(details), taskObservations, resolvedScopes, lockStarts, now.getTime()),
104
+ };
105
+ }
106
+ //# sourceMappingURL=web-data-change.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-data-change.js","sourceRoot":"","sources":["../../../src/core/web/web-data-change.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type OsqConfig } from '../foundation/config.js';
2
+ import { type WebLocation } from './web-data-types.js';
3
+ /** One discovered change folder with its deterministic identity. */
4
+ export interface DiscoveredChangeFolder {
5
+ readonly folderKey: string;
6
+ readonly folderPath: string;
7
+ readonly location: WebLocation;
8
+ readonly numericId: number | null;
9
+ readonly slug: string;
10
+ }
11
+ /** One discovered living capability folder. */
12
+ export interface DiscoveredCapabilityFolder {
13
+ readonly id: string;
14
+ readonly folderPath: string;
15
+ }
16
+ /** Leading digit run of a folder key, or null when it has none. */
17
+ export declare function numericIdOf(folderKey: string): number | null;
18
+ /** Folder key without its leading numeric id and separator. */
19
+ export declare function slugOf(folderKey: string): string;
20
+ /**
21
+ * Every active, archived, and rejected change folder that carries a resolvable
22
+ * change document, ordered independently of directory enumeration.
23
+ */
24
+ export declare function listChangeFolders(projectRoot: string, config?: OsqConfig): Promise<DiscoveredChangeFolder[]>;
25
+ /**
26
+ * Current `openspec/specs/<id>/spec.md` capability folders, ordered by id.
27
+ */
28
+ export declare function listCapabilityFolders(projectRoot: string, config?: OsqConfig): Promise<DiscoveredCapabilityFolder[]>;
29
+ /** Read the complete UTF-8 text of a capability node, or null when unreadable. */
30
+ export declare function readCapabilitySpec(folderPath: string): Promise<string | null>;
31
+ /**
32
+ * Resolve one change by exact folder key or unambiguous numeric id across every
33
+ * location. An exact key wins only when unique; numeric lookup collects every
34
+ * matching folder before deciding.
35
+ */
36
+ export declare function resolveChangeFolder(projectRoot: string, selector: string, config?: OsqConfig): Promise<DiscoveredChangeFolder>;
37
+ /** Compare two folder keys deterministically for stable output ordering. */
38
+ export declare function compareFolderKeys(a: string, b: string): number;
39
+ //# sourceMappingURL=web-data-folders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-data-folders.d.ts","sourceRoot":"","sources":["../../../src/core/web/web-data-folders.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAIzE,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAErE,oEAAoE;AACpE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,+CAA+C;AAC/C,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAID,mEAAmE;AACnE,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG5D;AAED,+DAA+D;AAC/D,wBAAgB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhD;AA2CD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,SAA0B,GACjC,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAUnC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,SAA0B,GACjC,OAAO,CAAC,0BAA0B,EAAE,CAAC,CAavC;AAED,kFAAkF;AAClF,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAEnF;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,SAA0B,GACjC,OAAO,CAAC,sBAAsB,CAAC,CA2BjC;AAED,4EAA4E;AAC5E,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9D"}
@@ -0,0 +1,125 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { DEFAULT_CONFIG } from '../foundation/config.js';
4
+ import { resolveChangeDoc } from '../spec/parser.js';
5
+ import { getArchiveDir, getChangesDir, getRejectedDir, getSpecsDir } from '../status/layout.js';
6
+ import { compareNumericPrefix } from '../status/state.js';
7
+ import { WebDataError } from './web-data-types.js';
8
+ const LOCATION_ORDER = ['active', 'archived', 'rejected'];
9
+ /** Leading digit run of a folder key, or null when it has none. */
10
+ export function numericIdOf(folderKey) {
11
+ const match = folderKey.match(/^(\d+)/);
12
+ return match ? Number.parseInt(match[1], 10) : null;
13
+ }
14
+ /** Folder key without its leading numeric id and separator. */
15
+ export function slugOf(folderKey) {
16
+ return folderKey.replace(/^\d+-?/, '');
17
+ }
18
+ async function isDirectory(target) {
19
+ const stat = await fs.stat(target).catch(() => null);
20
+ return stat?.isDirectory() ?? false;
21
+ }
22
+ async function listDirectory(dir) {
23
+ return fs.readdir(dir).catch(() => []);
24
+ }
25
+ /** Discover change folders under one canonical location directory. */
26
+ async function discoverLocation(dir, location, skip) {
27
+ const folders = [];
28
+ for (const entry of await listDirectory(dir)) {
29
+ if (entry.startsWith('_') || entry.startsWith('.') || skip.has(entry))
30
+ continue;
31
+ const folderPath = path.join(dir, entry);
32
+ if (!(await isDirectory(folderPath)))
33
+ continue;
34
+ if (!(await resolveChangeDoc(folderPath)))
35
+ continue;
36
+ folders.push({
37
+ folderKey: entry,
38
+ folderPath,
39
+ location,
40
+ numericId: numericIdOf(entry),
41
+ slug: slugOf(entry),
42
+ });
43
+ }
44
+ return folders;
45
+ }
46
+ function compareFolders(a, b) {
47
+ const idA = a.numericId ?? Number.POSITIVE_INFINITY;
48
+ const idB = b.numericId ?? Number.POSITIVE_INFINITY;
49
+ if (idA !== idB)
50
+ return idA - idB;
51
+ const keyOrder = a.folderKey.localeCompare(b.folderKey);
52
+ if (keyOrder !== 0)
53
+ return keyOrder;
54
+ return LOCATION_ORDER.indexOf(a.location) - LOCATION_ORDER.indexOf(b.location);
55
+ }
56
+ /**
57
+ * Every active, archived, and rejected change folder that carries a resolvable
58
+ * change document, ordered independently of directory enumeration.
59
+ */
60
+ export async function listChangeFolders(projectRoot, config = DEFAULT_CONFIG) {
61
+ const changesDir = getChangesDir(config.paths.openspecRoot, projectRoot);
62
+ const archiveDir = getArchiveDir(config.paths.openspecRoot, projectRoot);
63
+ const rejectedDir = getRejectedDir(config.paths.openspecRoot, projectRoot);
64
+ const skip = new Set([path.basename(archiveDir), path.basename(rejectedDir)]);
65
+ const active = await discoverLocation(changesDir, 'active', skip);
66
+ const archived = await discoverLocation(archiveDir, 'archived', new Set());
67
+ const rejected = await discoverLocation(rejectedDir, 'rejected', new Set());
68
+ return [...active, ...archived, ...rejected].sort(compareFolders);
69
+ }
70
+ /**
71
+ * Current `openspec/specs/<id>/spec.md` capability folders, ordered by id.
72
+ */
73
+ export async function listCapabilityFolders(projectRoot, config = DEFAULT_CONFIG) {
74
+ const specsDir = getSpecsDir(config.paths.openspecRoot, projectRoot);
75
+ const folders = [];
76
+ for (const entry of await listDirectory(specsDir)) {
77
+ if (entry.startsWith('_') || entry.startsWith('.'))
78
+ continue;
79
+ const folderPath = path.join(specsDir, entry);
80
+ if (!(await isDirectory(folderPath)))
81
+ continue;
82
+ const specPath = path.join(folderPath, 'spec.md');
83
+ const stat = await fs.stat(specPath).catch(() => null);
84
+ if (!stat?.isFile())
85
+ continue;
86
+ folders.push({ id: entry, folderPath });
87
+ }
88
+ return folders.sort((a, b) => a.id.localeCompare(b.id));
89
+ }
90
+ /** Read the complete UTF-8 text of a capability node, or null when unreadable. */
91
+ export async function readCapabilitySpec(folderPath) {
92
+ return fs.readFile(path.join(folderPath, 'spec.md'), 'utf8').catch(() => null);
93
+ }
94
+ /**
95
+ * Resolve one change by exact folder key or unambiguous numeric id across every
96
+ * location. An exact key wins only when unique; numeric lookup collects every
97
+ * matching folder before deciding.
98
+ */
99
+ export async function resolveChangeFolder(projectRoot, selector, config = DEFAULT_CONFIG) {
100
+ const folders = await listChangeFolders(projectRoot, config);
101
+ const trimmed = selector.trim();
102
+ if (!trimmed)
103
+ throw new WebDataError('not-found', 'Change selector is empty');
104
+ const exact = folders.filter((folder) => folder.folderKey === trimmed);
105
+ if (exact.length === 1)
106
+ return exact[0];
107
+ if (exact.length > 1) {
108
+ throw new WebDataError('ambiguous', `Change selector "${trimmed}" matches folders in more than one location`);
109
+ }
110
+ if (/^\d+$/.test(trimmed)) {
111
+ const numeric = Number.parseInt(trimmed, 10);
112
+ const matches = folders.filter((folder) => folder.numericId === numeric);
113
+ if (matches.length === 1)
114
+ return matches[0];
115
+ if (matches.length > 1) {
116
+ throw new WebDataError('ambiguous', `Change id "${trimmed}" matches ${matches.length} preserved folders`);
117
+ }
118
+ }
119
+ throw new WebDataError('not-found', `Change "${trimmed}" was not found`);
120
+ }
121
+ /** Compare two folder keys deterministically for stable output ordering. */
122
+ export function compareFolderKeys(a, b) {
123
+ return compareNumericPrefix(a, b);
124
+ }
125
+ //# sourceMappingURL=web-data-folders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-data-folders.js","sourceRoot":"","sources":["../../../src/core/web/web-data-folders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type OsqConfig } from '../foundation/config.js';
2
+ import type { WebGraph } from './web-data-types.js';
3
+ /**
4
+ * Derives the deterministic capability/change graph from the current project
5
+ * tree on every call. No index is stored and no missing evidence is estimated.
6
+ */
7
+ export declare function getWebGraph(projectRoot: string, config?: OsqConfig): Promise<WebGraph>;
8
+ //# sourceMappingURL=web-data-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-data-graph.d.ts","sourceRoot":"","sources":["../../../src/core/web/web-data-graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAqBzE,OAAO,KAAK,EAAoC,QAAQ,EAAgB,MAAM,qBAAqB,CAAC;AAsHpG;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,SAA0B,GACjC,OAAO,CAAC,QAAQ,CAAC,CAOnB"}
@@ -0,0 +1,113 @@
1
+ import { DEFAULT_CONFIG } from '../foundation/config.js';
2
+ import { parseSpecMdFromFolder } from '../spec/parser.js';
3
+ import { deriveSpecState } from '../status/state.js';
4
+ import { listCapabilityFolders, listChangeFolders, readCapabilitySpec, slugOf, } from './web-data-folders.js';
5
+ import { countTasks, listDeltaCapabilities, readApprovedAt, readBriefMetadata, readCreatedAt, readLandedAt, readManifestMetadata, readPlannerAttribution, readRejection, } from './web-data-lifecycle.js';
6
+ import { observeExecution, observePlanning } from './web-data-observations.js';
7
+ async function readProposalFields(folderPath) {
8
+ const spec = await parseSpecMdFromFolder(folderPath);
9
+ if (!spec)
10
+ return null;
11
+ return { title: spec.title, dependsOn: spec.dependsOn, reads: spec.features.reads };
12
+ }
13
+ function edgeKey(kind, from, to) {
14
+ return `${kind}:${from}->${to}`;
15
+ }
16
+ /**
17
+ * Done tasks for one change folder, using the same marker derivation as
18
+ * `osq status`. A folder whose state cannot be derived counts zero.
19
+ */
20
+ async function countDoneTasks(projectRoot, folderPath) {
21
+ const derived = await deriveSpecState(projectRoot, folderPath).catch(() => null);
22
+ if (!derived)
23
+ return 0;
24
+ return derived.tasks.filter((task) => task.status === 'done').length;
25
+ }
26
+ /** One present change for a numeric or key dependency declaration, if unique. */
27
+ function resolveDependency(dependency, folders) {
28
+ const numeric = /^\d+$/.test(dependency) ? Number.parseInt(dependency, 10) : null;
29
+ const matches = folders.filter((folder) => folder.folderKey === dependency || (numeric !== null && folder.numericId === numeric));
30
+ return matches.length === 1 ? matches[0].folderKey : null;
31
+ }
32
+ async function capabilityNodes(projectRoot, config) {
33
+ const folders = await listCapabilityFolders(projectRoot, config);
34
+ const nodes = [];
35
+ for (const folder of folders) {
36
+ const spec = await readCapabilitySpec(folder.folderPath);
37
+ if (spec === null)
38
+ continue;
39
+ nodes.push({ kind: 'capability', id: folder.id, folderKey: folder.id, spec });
40
+ }
41
+ return nodes;
42
+ }
43
+ async function changeNodes(projectRoot, config) {
44
+ const folders = await listChangeFolders(projectRoot, config);
45
+ const nodes = [];
46
+ for (const folder of folders) {
47
+ const proposal = await readProposalFields(folder.folderPath);
48
+ const brief = await readBriefMetadata(folder.folderPath);
49
+ const manifest = await readManifestMetadata(folder.folderPath);
50
+ const execution = await observeExecution(folder.folderPath);
51
+ const planning = await observePlanning(folder.folderPath);
52
+ const landed = folder.location === 'archived' ? await readLandedAt(folder.folderPath) : null;
53
+ const rejection = folder.location === 'rejected' ? await readRejection(folder.folderPath) : null;
54
+ nodes.push({
55
+ kind: 'change',
56
+ folderKey: folder.folderKey,
57
+ id: folder.numericId,
58
+ slug: slugOf(folder.folderKey),
59
+ title: proposal?.title || folder.folderKey,
60
+ state: folder.location,
61
+ created: await readCreatedAt(brief, manifest),
62
+ approved: await readApprovedAt(manifest),
63
+ landed,
64
+ rejection,
65
+ planner: await readPlannerAttribution(brief, manifest),
66
+ taskCount: await countTasks(folder.folderPath),
67
+ doneCount: await countDoneTasks(projectRoot, folder.folderPath),
68
+ attempts: execution.attempts,
69
+ execution: execution.observation,
70
+ planning,
71
+ });
72
+ }
73
+ return nodes;
74
+ }
75
+ async function graphEdges(folders, capabilityIds) {
76
+ const edges = new Map();
77
+ const add = (kind, from, to) => {
78
+ const key = edgeKey(kind, from, to);
79
+ if (!edges.has(key))
80
+ edges.set(key, { key, kind, from, to });
81
+ };
82
+ for (const folder of folders) {
83
+ const proposal = await readProposalFields(folder.folderPath);
84
+ if (!proposal)
85
+ continue;
86
+ for (const dependency of [...new Set(proposal.dependsOn)]) {
87
+ const target = resolveDependency(dependency, folders);
88
+ if (target)
89
+ add('depends_on', folder.folderKey, target);
90
+ }
91
+ for (const capability of [...new Set(proposal.reads)]) {
92
+ if (capabilityIds.has(capability))
93
+ add('reads', folder.folderKey, capability);
94
+ }
95
+ for (const capability of await listDeltaCapabilities(folder.folderPath)) {
96
+ add('writes', folder.folderKey, capability);
97
+ }
98
+ }
99
+ return [...edges.values()].sort((a, b) => a.key.localeCompare(b.key));
100
+ }
101
+ /**
102
+ * Derives the deterministic capability/change graph from the current project
103
+ * tree on every call. No index is stored and no missing evidence is estimated.
104
+ */
105
+ export async function getWebGraph(projectRoot, config = DEFAULT_CONFIG) {
106
+ const capabilities = await capabilityNodes(projectRoot, config);
107
+ const changes = await changeNodes(projectRoot, config);
108
+ const capabilityIds = new Set(capabilities.map((node) => node.id));
109
+ const folders = await listChangeFolders(projectRoot, config);
110
+ const edges = await graphEdges(folders, capabilityIds);
111
+ return { capabilities, changes, edges };
112
+ }
113
+ //# sourceMappingURL=web-data-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-data-graph.js","sourceRoot":"","sources":["../../../src/core/web/web-data-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { readPlanningSessions } from '../report/planning.js';
2
+ /** Recorded brief metadata: nullable planner, creation date, and body. */
3
+ export interface BriefMetadata {
4
+ readonly planner: string | null;
5
+ readonly date: string | null;
6
+ readonly body: string | null;
7
+ }
8
+ /** Recorded manifest lifecycle metadata. */
9
+ export interface ManifestMetadata {
10
+ readonly createdAt: string | null;
11
+ readonly approvedAt: string | null;
12
+ readonly planner: string | null;
13
+ }
14
+ /** A recorded rejection, from the typed event or its preserved marker. */
15
+ export interface RejectionMetadata {
16
+ readonly reason: string;
17
+ readonly timestamp: string;
18
+ }
19
+ /** Reads `brief.md`, returning nullable planner, date, and body. */
20
+ export declare function readBriefMetadata(folderPath: string): Promise<BriefMetadata>;
21
+ /** Reads `.run/manifest.json`, tolerating absence and malformed JSON. */
22
+ export declare function readManifestMetadata(folderPath: string): Promise<ManifestMetadata | null>;
23
+ /** Change-creation time: brief date first, then manifest creation, else null. */
24
+ export declare function readCreatedAt(brief: BriefMetadata, manifest: ManifestMetadata | null): Promise<string | null>;
25
+ /** Approval time from the manifest, or null when unreported. */
26
+ export declare function readApprovedAt(manifest: ManifestMetadata | null): Promise<string | null>;
27
+ /** Planner attribution from the manifest, then the brief, else null. */
28
+ export declare function readPlannerAttribution(brief: BriefMetadata, manifest: ManifestMetadata | null): Promise<string | null>;
29
+ /** Authoritative archive time from the change-level `archived` event. */
30
+ export declare function readLandedAt(folderPath: string): Promise<string | null>;
31
+ /**
32
+ * Rejection metadata from the typed `rejected` event, falling back to the
33
+ * preserved `.run/rejected.md` marker. A missing reason or timestamp is null.
34
+ */
35
+ export declare function readRejection(folderPath: string): Promise<RejectionMetadata | null>;
36
+ /** Delta capability folders under `<change>/specs`, sorted and deduplicated. */
37
+ export declare function listDeltaCapabilities(folderPath: string): Promise<string[]>;
38
+ /** Number of parseable `tasks/<n>.md` files in one change folder. */
39
+ export declare function countTasks(folderPath: string): Promise<number>;
40
+ /** Resolvable change-document presence, used to reject non-change folders. */
41
+ export declare function hasChangeDocument(folderPath: string): Promise<boolean>;
42
+ export { readPlanningSessions };
43
+ //# sourceMappingURL=web-data-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-data-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/core/web/web-data-lifecycle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAG7D,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,4CAA4C;AAC5C,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,0EAA0E;AAC1E,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAiBD,oEAAoE;AACpE,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CASlF;AAED,yEAAyE;AACzE,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAkB/F;AAED,iFAAiF;AACjF,wBAAsB,aAAa,CACjC,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,gBAAgB,GAAG,IAAI,GAChC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAExB;AAED,gEAAgE;AAChE,wBAAsB,cAAc,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE9F;AAED,wEAAwE;AACxE,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,gBAAgB,GAAG,IAAI,GAChC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAExB;AAED,yEAAyE;AACzE,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgB7E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA0BzF;AAED,gFAAgF;AAChF,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAMjF;AAED,qEAAqE;AACrE,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGpE;AAED,8EAA8E;AAC9E,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5E;AAED,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,141 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { readPlanningSessions } from '../report/planning.js';
4
+ import { parseFrontmatter, resolveChangeDoc } from '../spec/parser.js';
5
+ function asRecord(value) {
6
+ return value && typeof value === 'object' && !Array.isArray(value)
7
+ ? value
8
+ : null;
9
+ }
10
+ function validIso(value) {
11
+ if (typeof value !== 'string')
12
+ return null;
13
+ return Number.isFinite(Date.parse(value)) ? value : null;
14
+ }
15
+ function trimmedOrNull(value) {
16
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
17
+ }
18
+ /** Reads `brief.md`, returning nullable planner, date, and body. */
19
+ export async function readBriefMetadata(folderPath) {
20
+ const content = await fs.readFile(path.join(folderPath, 'brief.md'), 'utf8').catch(() => null);
21
+ if (content === null)
22
+ return { planner: null, date: null, body: null };
23
+ const { data, body } = parseFrontmatter(content);
24
+ return {
25
+ planner: trimmedOrNull(data.planner),
26
+ date: validIso(data.date) ?? trimmedOrNull(data.date),
27
+ body,
28
+ };
29
+ }
30
+ /** Reads `.run/manifest.json`, tolerating absence and malformed JSON. */
31
+ export async function readManifestMetadata(folderPath) {
32
+ const content = await fs
33
+ .readFile(path.join(folderPath, '.run', 'manifest.json'), 'utf8')
34
+ .catch(() => null);
35
+ if (content === null)
36
+ return null;
37
+ let parsed;
38
+ try {
39
+ parsed = JSON.parse(content);
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ const record = asRecord(parsed);
45
+ if (!record)
46
+ return null;
47
+ return {
48
+ createdAt: validIso(record.createdAt),
49
+ approvedAt: validIso(record.approvedAt),
50
+ planner: trimmedOrNull(record.planner),
51
+ };
52
+ }
53
+ /** Change-creation time: brief date first, then manifest creation, else null. */
54
+ export async function readCreatedAt(brief, manifest) {
55
+ return brief.date ?? manifest?.createdAt ?? null;
56
+ }
57
+ /** Approval time from the manifest, or null when unreported. */
58
+ export async function readApprovedAt(manifest) {
59
+ return manifest?.approvedAt ?? null;
60
+ }
61
+ /** Planner attribution from the manifest, then the brief, else null. */
62
+ export async function readPlannerAttribution(brief, manifest) {
63
+ return manifest?.planner ?? brief.planner ?? null;
64
+ }
65
+ /** Authoritative archive time from the change-level `archived` event. */
66
+ export async function readLandedAt(folderPath) {
67
+ const content = await fs
68
+ .readFile(path.join(folderPath, '.run', 'events', 'change.jsonl'), 'utf8')
69
+ .catch(() => null);
70
+ if (content === null)
71
+ return null;
72
+ let found = null;
73
+ for (const line of content.split('\n')) {
74
+ if (!line.trim())
75
+ continue;
76
+ try {
77
+ const event = asRecord(JSON.parse(line));
78
+ if (event?.type !== 'archived')
79
+ continue;
80
+ const timestamp = validIso(event.timestamp);
81
+ if (timestamp)
82
+ found = timestamp;
83
+ }
84
+ catch { }
85
+ }
86
+ return found;
87
+ }
88
+ /**
89
+ * Rejection metadata from the typed `rejected` event, falling back to the
90
+ * preserved `.run/rejected.md` marker. A missing reason or timestamp is null.
91
+ */
92
+ export async function readRejection(folderPath) {
93
+ const eventsContent = await fs
94
+ .readFile(path.join(folderPath, '.run', 'events', 'change.jsonl'), 'utf8')
95
+ .catch(() => null);
96
+ if (eventsContent !== null) {
97
+ for (const line of eventsContent.split('\n')) {
98
+ if (!line.trim())
99
+ continue;
100
+ try {
101
+ const event = asRecord(JSON.parse(line));
102
+ if (event?.type !== 'rejected')
103
+ continue;
104
+ const data = asRecord(event.data) ?? {};
105
+ const reason = trimmedOrNull(data.reason);
106
+ const timestamp = validIso(data.timestamp) ?? validIso(event.timestamp);
107
+ if (reason && timestamp)
108
+ return { reason, timestamp };
109
+ }
110
+ catch { }
111
+ }
112
+ }
113
+ const marker = await fs
114
+ .readFile(path.join(folderPath, '.run', 'rejected.md'), 'utf8')
115
+ .catch(() => null);
116
+ if (marker === null)
117
+ return null;
118
+ const { data } = parseFrontmatter(marker);
119
+ const reason = trimmedOrNull(data.reason);
120
+ const timestamp = validIso(data.timestamp);
121
+ return reason && timestamp ? { reason, timestamp } : null;
122
+ }
123
+ /** Delta capability folders under `<change>/specs`, sorted and deduplicated. */
124
+ export async function listDeltaCapabilities(folderPath) {
125
+ const deltasDir = path.join(folderPath, 'specs');
126
+ const entries = await fs.readdir(deltasDir, { withFileTypes: true }).catch(() => []);
127
+ return [
128
+ ...new Set(entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name)),
129
+ ].sort();
130
+ }
131
+ /** Number of parseable `tasks/<n>.md` files in one change folder. */
132
+ export async function countTasks(folderPath) {
133
+ const entries = await fs.readdir(path.join(folderPath, 'tasks')).catch(() => []);
134
+ return entries.filter((entry) => entry.endsWith('.md')).length;
135
+ }
136
+ /** Resolvable change-document presence, used to reject non-change folders. */
137
+ export async function hasChangeDocument(folderPath) {
138
+ return (await resolveChangeDoc(folderPath)) !== null;
139
+ }
140
+ export { readPlanningSessions };
141
+ //# sourceMappingURL=web-data-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-data-lifecycle.js","sourceRoot":"","sources":["../../../src/core/web/web-data-lifecycle.ts"],"names":[],"mappings":"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"}