@matteeh/osq 0.2.1 → 0.2.2

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 (606) hide show
  1. package/README.md +234 -15
  2. package/dist/cli/approve.d.ts +7 -0
  3. package/dist/cli/approve.d.ts.map +1 -1
  4. package/dist/cli/approve.js +34 -0
  5. package/dist/cli/approve.js.map +1 -1
  6. package/dist/cli/bin.js +2 -3
  7. package/dist/cli/bin.js.map +1 -1
  8. package/dist/cli/check.d.ts +15 -0
  9. package/dist/cli/check.d.ts.map +1 -0
  10. package/dist/cli/check.js +65 -0
  11. package/dist/cli/check.js.map +1 -0
  12. package/dist/cli/index.d.ts.map +1 -1
  13. package/dist/cli/index.js +10 -10
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/cli/init.d.ts.map +1 -1
  16. package/dist/cli/init.js +6 -1
  17. package/dist/cli/init.js.map +1 -1
  18. package/dist/cli/lint.d.ts +3 -0
  19. package/dist/cli/lint.d.ts.map +1 -1
  20. package/dist/cli/lint.js +33 -14
  21. package/dist/cli/lint.js.map +1 -1
  22. package/dist/cli/plan-queue.d.ts +10 -4
  23. package/dist/cli/plan-queue.d.ts.map +1 -1
  24. package/dist/cli/plan-queue.js +20 -19
  25. package/dist/cli/plan-queue.js.map +1 -1
  26. package/dist/cli/plan-sections.d.ts +15 -0
  27. package/dist/cli/plan-sections.d.ts.map +1 -0
  28. package/dist/cli/plan-sections.js +47 -0
  29. package/dist/cli/plan-sections.js.map +1 -0
  30. package/dist/cli/plan.d.ts +1 -0
  31. package/dist/cli/plan.d.ts.map +1 -1
  32. package/dist/cli/plan.js +14 -4
  33. package/dist/cli/plan.js.map +1 -1
  34. package/dist/cli/report.d.ts.map +1 -1
  35. package/dist/cli/report.js +73 -1
  36. package/dist/cli/report.js.map +1 -1
  37. package/dist/cli/run.d.ts +7 -0
  38. package/dist/cli/run.d.ts.map +1 -0
  39. package/dist/cli/run.js +22 -0
  40. package/dist/cli/run.js.map +1 -0
  41. package/dist/cli/verified.d.ts +15 -0
  42. package/dist/cli/verified.d.ts.map +1 -0
  43. package/dist/cli/verified.js +34 -0
  44. package/dist/cli/verified.js.map +1 -0
  45. package/dist/core/foundation/config-agents.d.ts +16 -0
  46. package/dist/core/foundation/config-agents.d.ts.map +1 -0
  47. package/dist/core/foundation/config-agents.js +2 -0
  48. package/dist/core/foundation/config-agents.js.map +1 -0
  49. package/dist/core/foundation/config-claude.d.ts +48 -0
  50. package/dist/core/foundation/config-claude.d.ts.map +1 -0
  51. package/dist/core/foundation/config-claude.js +106 -0
  52. package/dist/core/foundation/config-claude.js.map +1 -0
  53. package/dist/core/foundation/config-codex-resolve.d.ts +10 -0
  54. package/dist/core/foundation/config-codex-resolve.d.ts.map +1 -0
  55. package/dist/core/foundation/config-codex-resolve.js +24 -0
  56. package/dist/core/foundation/config-codex-resolve.js.map +1 -0
  57. package/dist/core/foundation/config-file.d.ts +18 -0
  58. package/dist/core/foundation/config-file.d.ts.map +1 -0
  59. package/dist/core/foundation/config-file.js +46 -0
  60. package/dist/core/foundation/config-file.js.map +1 -0
  61. package/dist/core/foundation/config-gates.d.ts +2 -0
  62. package/dist/core/foundation/config-gates.d.ts.map +1 -1
  63. package/dist/core/foundation/config-gates.js +8 -0
  64. package/dist/core/foundation/config-gates.js.map +1 -1
  65. package/dist/core/foundation/config-opencode.d.ts +25 -0
  66. package/dist/core/foundation/config-opencode.d.ts.map +1 -0
  67. package/dist/core/foundation/config-opencode.js +55 -0
  68. package/dist/core/foundation/config-opencode.js.map +1 -0
  69. package/dist/core/foundation/config-pi.d.ts +10 -0
  70. package/dist/core/foundation/config-pi.d.ts.map +1 -1
  71. package/dist/core/foundation/config-pi.js +13 -0
  72. package/dist/core/foundation/config-pi.js.map +1 -1
  73. package/dist/core/foundation/config-planning.d.ts +12 -1
  74. package/dist/core/foundation/config-planning.d.ts.map +1 -1
  75. package/dist/core/foundation/config-planning.js +29 -1
  76. package/dist/core/foundation/config-planning.js.map +1 -1
  77. package/dist/core/foundation/config-traceability.d.ts +28 -0
  78. package/dist/core/foundation/config-traceability.d.ts.map +1 -0
  79. package/dist/core/foundation/config-traceability.js +63 -0
  80. package/dist/core/foundation/config-traceability.js.map +1 -0
  81. package/dist/core/foundation/config-user.d.ts +32 -0
  82. package/dist/core/foundation/config-user.d.ts.map +1 -0
  83. package/dist/core/foundation/config-user.js +2 -0
  84. package/dist/core/foundation/config-user.js.map +1 -0
  85. package/dist/core/foundation/config-vcs.d.ts +29 -0
  86. package/dist/core/foundation/config-vcs.d.ts.map +1 -0
  87. package/dist/core/foundation/config-vcs.js +57 -0
  88. package/dist/core/foundation/config-vcs.js.map +1 -0
  89. package/dist/core/foundation/config.d.ts +23 -24
  90. package/dist/core/foundation/config.d.ts.map +1 -1
  91. package/dist/core/foundation/config.js +29 -36
  92. package/dist/core/foundation/config.js.map +1 -1
  93. package/dist/core/foundation/decisions-validate.d.ts +16 -0
  94. package/dist/core/foundation/decisions-validate.d.ts.map +1 -0
  95. package/dist/core/foundation/decisions-validate.js +74 -0
  96. package/dist/core/foundation/decisions-validate.js.map +1 -0
  97. package/dist/core/foundation/decisions.d.ts +34 -0
  98. package/dist/core/foundation/decisions.d.ts.map +1 -0
  99. package/dist/core/foundation/decisions.js +152 -0
  100. package/dist/core/foundation/decisions.js.map +1 -0
  101. package/dist/core/foundation/doctor-decisions.d.ts +9 -0
  102. package/dist/core/foundation/doctor-decisions.d.ts.map +1 -0
  103. package/dist/core/foundation/doctor-decisions.js +49 -0
  104. package/dist/core/foundation/doctor-decisions.js.map +1 -0
  105. package/dist/core/foundation/doctor-managed.d.ts.map +1 -1
  106. package/dist/core/foundation/doctor-managed.js +3 -0
  107. package/dist/core/foundation/doctor-managed.js.map +1 -1
  108. package/dist/core/foundation/doctor-prices.d.ts +8 -0
  109. package/dist/core/foundation/doctor-prices.d.ts.map +1 -0
  110. package/dist/core/foundation/doctor-prices.js +25 -0
  111. package/dist/core/foundation/doctor-prices.js.map +1 -0
  112. package/dist/core/foundation/doctor.d.ts.map +1 -1
  113. package/dist/core/foundation/doctor.js +20 -30
  114. package/dist/core/foundation/doctor.js.map +1 -1
  115. package/dist/core/foundation/harness-catalog.d.ts +7 -8
  116. package/dist/core/foundation/harness-catalog.d.ts.map +1 -1
  117. package/dist/core/foundation/harness-catalog.js +26 -41
  118. package/dist/core/foundation/harness-catalog.js.map +1 -1
  119. package/dist/core/foundation/init-blocks.d.ts +1 -1
  120. package/dist/core/foundation/init-blocks.d.ts.map +1 -1
  121. package/dist/core/foundation/init-blocks.js +51 -14
  122. package/dist/core/foundation/init-blocks.js.map +1 -1
  123. package/dist/core/foundation/init.d.ts +4 -0
  124. package/dist/core/foundation/init.d.ts.map +1 -1
  125. package/dist/core/foundation/init.js +7 -0
  126. package/dist/core/foundation/init.js.map +1 -1
  127. package/dist/core/foundation/new.d.ts +4 -1
  128. package/dist/core/foundation/new.d.ts.map +1 -1
  129. package/dist/core/foundation/new.js +18 -8
  130. package/dist/core/foundation/new.js.map +1 -1
  131. package/dist/core/foundation/package-root.d.ts +6 -0
  132. package/dist/core/foundation/package-root.d.ts.map +1 -1
  133. package/dist/core/foundation/package-root.js +6 -0
  134. package/dist/core/foundation/package-root.js.map +1 -1
  135. package/dist/core/foundation/rules-block.d.ts +11 -0
  136. package/dist/core/foundation/rules-block.d.ts.map +1 -0
  137. package/dist/core/foundation/rules-block.js +90 -0
  138. package/dist/core/foundation/rules-block.js.map +1 -0
  139. package/dist/core/foundation/traceability-block.d.ts +13 -0
  140. package/dist/core/foundation/traceability-block.d.ts.map +1 -0
  141. package/dist/core/foundation/traceability-block.js +124 -0
  142. package/dist/core/foundation/traceability-block.js.map +1 -0
  143. package/dist/core/lifecycle/done.d.ts.map +1 -1
  144. package/dist/core/lifecycle/done.js +2 -4
  145. package/dist/core/lifecycle/done.js.map +1 -1
  146. package/dist/core/lifecycle/recertify.d.ts +9 -0
  147. package/dist/core/lifecycle/recertify.d.ts.map +1 -0
  148. package/dist/core/lifecycle/recertify.js +27 -0
  149. package/dist/core/lifecycle/recertify.js.map +1 -0
  150. package/dist/core/lifecycle/reject.d.ts.map +1 -1
  151. package/dist/core/lifecycle/reject.js +3 -4
  152. package/dist/core/lifecycle/reject.js.map +1 -1
  153. package/dist/core/lifecycle/retry.d.ts.map +1 -1
  154. package/dist/core/lifecycle/retry.js +6 -20
  155. package/dist/core/lifecycle/retry.js.map +1 -1
  156. package/dist/core/lifecycle/verification-record.d.ts +42 -0
  157. package/dist/core/lifecycle/verification-record.d.ts.map +1 -0
  158. package/dist/core/lifecycle/verification-record.js +76 -0
  159. package/dist/core/lifecycle/verification-record.js.map +1 -0
  160. package/dist/core/report/approval-flags.d.ts +16 -3
  161. package/dist/core/report/approval-flags.d.ts.map +1 -1
  162. package/dist/core/report/approval-flags.js +59 -22
  163. package/dist/core/report/approval-flags.js.map +1 -1
  164. package/dist/core/report/brief-to-approval.d.ts +7 -0
  165. package/dist/core/report/brief-to-approval.d.ts.map +1 -0
  166. package/dist/core/report/brief-to-approval.js +43 -0
  167. package/dist/core/report/brief-to-approval.js.map +1 -0
  168. package/dist/core/report/planning-price-gaps.d.ts +10 -0
  169. package/dist/core/report/planning-price-gaps.d.ts.map +1 -0
  170. package/dist/core/report/planning-price-gaps.js +37 -0
  171. package/dist/core/report/planning-price-gaps.js.map +1 -0
  172. package/dist/core/report/planning-slice-lookup.d.ts.map +1 -1
  173. package/dist/core/report/planning-slice-lookup.js +3 -9
  174. package/dist/core/report/planning-slice-lookup.js.map +1 -1
  175. package/dist/core/report/recent-disclosures.d.ts +18 -0
  176. package/dist/core/report/recent-disclosures.d.ts.map +1 -0
  177. package/dist/core/report/recent-disclosures.js +105 -0
  178. package/dist/core/report/recent-disclosures.js.map +1 -0
  179. package/dist/core/report/record-disclosures.d.ts +14 -0
  180. package/dist/core/report/record-disclosures.d.ts.map +1 -0
  181. package/dist/core/report/record-disclosures.js +30 -0
  182. package/dist/core/report/record-disclosures.js.map +1 -0
  183. package/dist/core/report/record-estimates.d.ts +25 -0
  184. package/dist/core/report/record-estimates.d.ts.map +1 -0
  185. package/dist/core/report/record-estimates.js +83 -0
  186. package/dist/core/report/record-estimates.js.map +1 -0
  187. package/dist/core/report/record-rework.d.ts +19 -0
  188. package/dist/core/report/record-rework.d.ts.map +1 -0
  189. package/dist/core/report/record-rework.js +50 -0
  190. package/dist/core/report/record-rework.js.map +1 -0
  191. package/dist/core/report/record-verification.d.ts +16 -0
  192. package/dist/core/report/record-verification.d.ts.map +1 -0
  193. package/dist/core/report/record-verification.js +33 -0
  194. package/dist/core/report/record-verification.js.map +1 -0
  195. package/dist/core/report/report-dependencies.d.ts +29 -0
  196. package/dist/core/report/report-dependencies.d.ts.map +1 -0
  197. package/dist/core/report/report-dependencies.js +92 -0
  198. package/dist/core/report/report-dependencies.js.map +1 -0
  199. package/dist/core/report/report-events.d.ts +1 -0
  200. package/dist/core/report/report-events.d.ts.map +1 -1
  201. package/dist/core/report/report-events.js +8 -26
  202. package/dist/core/report/report-events.js.map +1 -1
  203. package/dist/core/report/report-mutation.d.ts +34 -0
  204. package/dist/core/report/report-mutation.d.ts.map +1 -0
  205. package/dist/core/report/report-mutation.js +191 -0
  206. package/dist/core/report/report-mutation.js.map +1 -0
  207. package/dist/core/report/report-scope.d.ts +21 -0
  208. package/dist/core/report/report-scope.d.ts.map +1 -0
  209. package/dist/core/report/report-scope.js +61 -0
  210. package/dist/core/report/report-scope.js.map +1 -0
  211. package/dist/core/report/report-traceability.d.ts +29 -0
  212. package/dist/core/report/report-traceability.d.ts.map +1 -0
  213. package/dist/core/report/report-traceability.js +94 -0
  214. package/dist/core/report/report-traceability.js.map +1 -0
  215. package/dist/core/report/report.d.ts +35 -1
  216. package/dist/core/report/report.d.ts.map +1 -1
  217. package/dist/core/report/report.js +130 -111
  218. package/dist/core/report/report.js.map +1 -1
  219. package/dist/core/report/result-sections.d.ts +30 -0
  220. package/dist/core/report/result-sections.d.ts.map +1 -0
  221. package/dist/core/report/result-sections.js +125 -0
  222. package/dist/core/report/result-sections.js.map +1 -0
  223. package/dist/core/report/scope-size.d.ts +7 -0
  224. package/dist/core/report/scope-size.d.ts.map +1 -0
  225. package/dist/core/report/scope-size.js +22 -0
  226. package/dist/core/report/scope-size.js.map +1 -0
  227. package/dist/core/run/commit-message.d.ts +24 -0
  228. package/dist/core/run/commit-message.d.ts.map +1 -0
  229. package/dist/core/run/commit-message.js +76 -0
  230. package/dist/core/run/commit-message.js.map +1 -0
  231. package/dist/core/run/dead-commit.d.ts +10 -0
  232. package/dist/core/run/dead-commit.d.ts.map +1 -0
  233. package/dist/core/run/dead-commit.js +70 -0
  234. package/dist/core/run/dead-commit.js.map +1 -0
  235. package/dist/core/run/focused-tests.d.ts +43 -0
  236. package/dist/core/run/focused-tests.d.ts.map +1 -0
  237. package/dist/core/run/focused-tests.js +116 -0
  238. package/dist/core/run/focused-tests.js.map +1 -0
  239. package/dist/core/run/manifest-approval.d.ts +7 -0
  240. package/dist/core/run/manifest-approval.d.ts.map +1 -0
  241. package/dist/core/run/manifest-approval.js +30 -0
  242. package/dist/core/run/manifest-approval.js.map +1 -0
  243. package/dist/core/run/manifest.d.ts +11 -1
  244. package/dist/core/run/manifest.d.ts.map +1 -1
  245. package/dist/core/run/manifest.js +52 -11
  246. package/dist/core/run/manifest.js.map +1 -1
  247. package/dist/core/run/mutation-report.d.ts +29 -0
  248. package/dist/core/run/mutation-report.d.ts.map +1 -0
  249. package/dist/core/run/mutation-report.js +107 -0
  250. package/dist/core/run/mutation-report.js.map +1 -0
  251. package/dist/core/run/mutation-run.d.ts +32 -0
  252. package/dist/core/run/mutation-run.d.ts.map +1 -0
  253. package/dist/core/run/mutation-run.js +80 -0
  254. package/dist/core/run/mutation-run.js.map +1 -0
  255. package/dist/core/run/verification.d.ts +12 -1
  256. package/dist/core/run/verification.d.ts.map +1 -1
  257. package/dist/core/run/verification.js +24 -2
  258. package/dist/core/run/verification.js.map +1 -1
  259. package/dist/core/spec/approve-worktree-shared.d.ts +33 -0
  260. package/dist/core/spec/approve-worktree-shared.d.ts.map +1 -0
  261. package/dist/core/spec/approve-worktree-shared.js +59 -0
  262. package/dist/core/spec/approve-worktree-shared.js.map +1 -0
  263. package/dist/core/spec/approve-worktree.d.ts +21 -0
  264. package/dist/core/spec/approve-worktree.d.ts.map +1 -0
  265. package/dist/core/spec/approve-worktree.js +153 -0
  266. package/dist/core/spec/approve-worktree.js.map +1 -0
  267. package/dist/core/spec/approve.d.ts +20 -10
  268. package/dist/core/spec/approve.d.ts.map +1 -1
  269. package/dist/core/spec/approve.js +57 -54
  270. package/dist/core/spec/approve.js.map +1 -1
  271. package/dist/core/spec/capability-impact.d.ts +43 -0
  272. package/dist/core/spec/capability-impact.d.ts.map +1 -0
  273. package/dist/core/spec/capability-impact.js +85 -0
  274. package/dist/core/spec/capability-impact.js.map +1 -0
  275. package/dist/core/spec/decisions-lint.d.ts +18 -0
  276. package/dist/core/spec/decisions-lint.d.ts.map +1 -0
  277. package/dist/core/spec/decisions-lint.js +127 -0
  278. package/dist/core/spec/decisions-lint.js.map +1 -0
  279. package/dist/core/spec/delta.d.ts +6 -0
  280. package/dist/core/spec/delta.d.ts.map +1 -1
  281. package/dist/core/spec/delta.js +73 -5
  282. package/dist/core/spec/delta.js.map +1 -1
  283. package/dist/core/spec/digest-decisions.d.ts +27 -0
  284. package/dist/core/spec/digest-decisions.d.ts.map +1 -0
  285. package/dist/core/spec/digest-decisions.js +86 -0
  286. package/dist/core/spec/digest-decisions.js.map +1 -0
  287. package/dist/core/spec/digest-format.d.ts +4 -0
  288. package/dist/core/spec/digest-format.d.ts.map +1 -0
  289. package/dist/core/spec/digest-format.js +44 -0
  290. package/dist/core/spec/digest-format.js.map +1 -0
  291. package/dist/core/spec/digest.d.ts +5 -3
  292. package/dist/core/spec/digest.d.ts.map +1 -1
  293. package/dist/core/spec/digest.js +14 -33
  294. package/dist/core/spec/digest.js.map +1 -1
  295. package/dist/core/spec/human-steps.d.ts +20 -0
  296. package/dist/core/spec/human-steps.d.ts.map +1 -0
  297. package/dist/core/spec/human-steps.js +52 -0
  298. package/dist/core/spec/human-steps.js.map +1 -0
  299. package/dist/core/spec/impact-lint.d.ts +24 -0
  300. package/dist/core/spec/impact-lint.d.ts.map +1 -0
  301. package/dist/core/spec/impact-lint.js +39 -0
  302. package/dist/core/spec/impact-lint.js.map +1 -0
  303. package/dist/core/spec/import-graph.d.ts +35 -0
  304. package/dist/core/spec/import-graph.d.ts.map +1 -0
  305. package/dist/core/spec/import-graph.js +155 -0
  306. package/dist/core/spec/import-graph.js.map +1 -0
  307. package/dist/core/spec/lint-findings.d.ts +44 -0
  308. package/dist/core/spec/lint-findings.d.ts.map +1 -0
  309. package/dist/core/spec/lint-findings.js +56 -0
  310. package/dist/core/spec/lint-findings.js.map +1 -0
  311. package/dist/core/spec/lint-output.d.ts +53 -0
  312. package/dist/core/spec/lint-output.d.ts.map +1 -0
  313. package/dist/core/spec/lint-output.js +87 -0
  314. package/dist/core/spec/lint-output.js.map +1 -0
  315. package/dist/core/spec/linter.d.ts +14 -4
  316. package/dist/core/spec/linter.d.ts.map +1 -1
  317. package/dist/core/spec/linter.js +271 -111
  318. package/dist/core/spec/linter.js.map +1 -1
  319. package/dist/core/spec/merged-spec-check.d.ts +24 -0
  320. package/dist/core/spec/merged-spec-check.d.ts.map +1 -0
  321. package/dist/core/spec/merged-spec-check.js +95 -0
  322. package/dist/core/spec/merged-spec-check.js.map +1 -0
  323. package/dist/core/spec/openspec-issues.d.ts +58 -0
  324. package/dist/core/spec/openspec-issues.d.ts.map +1 -0
  325. package/dist/core/spec/openspec-issues.js +166 -0
  326. package/dist/core/spec/openspec-issues.js.map +1 -0
  327. package/dist/core/spec/parser.d.ts +1 -0
  328. package/dist/core/spec/parser.d.ts.map +1 -1
  329. package/dist/core/spec/parser.js +16 -6
  330. package/dist/core/spec/parser.js.map +1 -1
  331. package/dist/core/spec/scenario-impact.d.ts +47 -0
  332. package/dist/core/spec/scenario-impact.d.ts.map +1 -0
  333. package/dist/core/spec/scenario-impact.js +130 -0
  334. package/dist/core/spec/scenario-impact.js.map +1 -0
  335. package/dist/core/spec/test-impact.d.ts +28 -0
  336. package/dist/core/spec/test-impact.d.ts.map +1 -0
  337. package/dist/core/spec/test-impact.js +119 -0
  338. package/dist/core/spec/test-impact.js.map +1 -0
  339. package/dist/core/spec/traceability-links.d.ts +50 -0
  340. package/dist/core/spec/traceability-links.d.ts.map +1 -0
  341. package/dist/core/spec/traceability-links.js +120 -0
  342. package/dist/core/spec/traceability-links.js.map +1 -0
  343. package/dist/core/spec/traceability-lint.d.ts +29 -0
  344. package/dist/core/spec/traceability-lint.d.ts.map +1 -0
  345. package/dist/core/spec/traceability-lint.js +143 -0
  346. package/dist/core/spec/traceability-lint.js.map +1 -0
  347. package/dist/core/status/blocked-item.d.ts +8 -0
  348. package/dist/core/status/blocked-item.d.ts.map +1 -0
  349. package/dist/core/status/blocked-item.js +45 -0
  350. package/dist/core/status/blocked-item.js.map +1 -0
  351. package/dist/core/status/change-locations.d.ts +44 -0
  352. package/dist/core/status/change-locations.d.ts.map +1 -0
  353. package/dist/core/status/change-locations.js +138 -0
  354. package/dist/core/status/change-locations.js.map +1 -0
  355. package/dist/core/status/dependency-readiness.d.ts +11 -0
  356. package/dist/core/status/dependency-readiness.d.ts.map +1 -0
  357. package/dist/core/status/dependency-readiness.js +39 -0
  358. package/dist/core/status/dependency-readiness.js.map +1 -0
  359. package/dist/core/status/inbox-projection.d.ts.map +1 -1
  360. package/dist/core/status/inbox-projection.js +23 -4
  361. package/dist/core/status/inbox-projection.js.map +1 -1
  362. package/dist/core/status/inbox-text.d.ts.map +1 -1
  363. package/dist/core/status/inbox-text.js +34 -3
  364. package/dist/core/status/inbox-text.js.map +1 -1
  365. package/dist/core/status/inbox.d.ts +10 -1
  366. package/dist/core/status/inbox.d.ts.map +1 -1
  367. package/dist/core/status/inbox.js +19 -1
  368. package/dist/core/status/inbox.js.map +1 -1
  369. package/dist/core/status/layout.d.ts +6 -0
  370. package/dist/core/status/layout.d.ts.map +1 -1
  371. package/dist/core/status/layout.js +8 -0
  372. package/dist/core/status/layout.js.map +1 -1
  373. package/dist/core/status/next-step.d.ts +17 -0
  374. package/dist/core/status/next-step.d.ts.map +1 -0
  375. package/dist/core/status/next-step.js +85 -0
  376. package/dist/core/status/next-step.js.map +1 -0
  377. package/dist/core/status/pre-spawn-words.d.ts +13 -0
  378. package/dist/core/status/pre-spawn-words.d.ts.map +1 -0
  379. package/dist/core/status/pre-spawn-words.js +26 -0
  380. package/dist/core/status/pre-spawn-words.js.map +1 -0
  381. package/dist/core/status/queue-parser.d.ts +1 -0
  382. package/dist/core/status/queue-parser.d.ts.map +1 -1
  383. package/dist/core/status/queue-parser.js +41 -2
  384. package/dist/core/status/queue-parser.js.map +1 -1
  385. package/dist/core/status/queue-planning.d.ts +1 -0
  386. package/dist/core/status/queue-planning.d.ts.map +1 -1
  387. package/dist/core/status/queue-planning.js +24 -12
  388. package/dist/core/status/queue-planning.js.map +1 -1
  389. package/dist/core/status/queue-report-detail.d.ts.map +1 -1
  390. package/dist/core/status/queue-report-detail.js +5 -3
  391. package/dist/core/status/queue-report-detail.js.map +1 -1
  392. package/dist/core/status/queue-state.d.ts +1 -1
  393. package/dist/core/status/queue-state.d.ts.map +1 -1
  394. package/dist/core/status/queue-state.js +27 -41
  395. package/dist/core/status/queue-state.js.map +1 -1
  396. package/dist/core/status/show.d.ts +25 -0
  397. package/dist/core/status/show.d.ts.map +1 -1
  398. package/dist/core/status/show.js +354 -91
  399. package/dist/core/status/show.js.map +1 -1
  400. package/dist/core/status/state.d.ts.map +1 -1
  401. package/dist/core/status/state.js +1 -23
  402. package/dist/core/status/state.js.map +1 -1
  403. package/dist/core/status/status.d.ts +18 -0
  404. package/dist/core/status/status.d.ts.map +1 -1
  405. package/dist/core/status/status.js +59 -80
  406. package/dist/core/status/status.js.map +1 -1
  407. package/dist/core/status/verification.d.ts +27 -0
  408. package/dist/core/status/verification.d.ts.map +1 -0
  409. package/dist/core/status/verification.js +111 -0
  410. package/dist/core/status/verification.js.map +1 -0
  411. package/dist/core/trace/function-ranges.d.ts +30 -0
  412. package/dist/core/trace/function-ranges.d.ts.map +1 -0
  413. package/dist/core/trace/function-ranges.js +250 -0
  414. package/dist/core/trace/function-ranges.js.map +1 -0
  415. package/dist/core/trace/mutation-pick.d.ts +55 -0
  416. package/dist/core/trace/mutation-pick.d.ts.map +1 -0
  417. package/dist/core/trace/mutation-pick.js +96 -0
  418. package/dist/core/trace/mutation-pick.js.map +1 -0
  419. package/dist/core/trace/scenario-index.d.ts +27 -0
  420. package/dist/core/trace/scenario-index.d.ts.map +1 -0
  421. package/dist/core/trace/scenario-index.js +76 -0
  422. package/dist/core/trace/scenario-index.js.map +1 -0
  423. package/dist/core/trace/scenario-lookup.d.ts +14 -0
  424. package/dist/core/trace/scenario-lookup.d.ts.map +1 -0
  425. package/dist/core/trace/scenario-lookup.js +179 -0
  426. package/dist/core/trace/scenario-lookup.js.map +1 -0
  427. package/dist/core/trace/tag-scan.d.ts +44 -0
  428. package/dist/core/trace/tag-scan.d.ts.map +1 -0
  429. package/dist/core/trace/tag-scan.js +200 -0
  430. package/dist/core/trace/tag-scan.js.map +1 -0
  431. package/dist/core/vcs/doctor-git.d.ts +13 -0
  432. package/dist/core/vcs/doctor-git.d.ts.map +1 -0
  433. package/dist/core/vcs/doctor-git.js +114 -0
  434. package/dist/core/vcs/doctor-git.js.map +1 -0
  435. package/dist/core/vcs/git-vcs-write.d.ts +47 -0
  436. package/dist/core/vcs/git-vcs-write.d.ts.map +1 -0
  437. package/dist/core/vcs/git-vcs-write.js +210 -0
  438. package/dist/core/vcs/git-vcs-write.js.map +1 -0
  439. package/dist/core/vcs/git-vcs.d.ts +40 -0
  440. package/dist/core/vcs/git-vcs.d.ts.map +1 -0
  441. package/dist/core/vcs/git-vcs.js +170 -0
  442. package/dist/core/vcs/git-vcs.js.map +1 -0
  443. package/dist/core/vcs/no-vcs.d.ts +26 -0
  444. package/dist/core/vcs/no-vcs.d.ts.map +1 -0
  445. package/dist/core/vcs/no-vcs.js +62 -0
  446. package/dist/core/vcs/no-vcs.js.map +1 -0
  447. package/dist/core/vcs/select.d.ts +11 -0
  448. package/dist/core/vcs/select.d.ts.map +1 -0
  449. package/dist/core/vcs/select.js +33 -0
  450. package/dist/core/vcs/select.js.map +1 -0
  451. package/dist/core/vcs/snapshot.d.ts +34 -0
  452. package/dist/core/vcs/snapshot.d.ts.map +1 -0
  453. package/dist/core/vcs/snapshot.js +71 -0
  454. package/dist/core/vcs/snapshot.js.map +1 -0
  455. package/dist/core/vcs/vcs.d.ts +55 -0
  456. package/dist/core/vcs/vcs.d.ts.map +1 -0
  457. package/dist/core/vcs/vcs.js +2 -0
  458. package/dist/core/vcs/vcs.js.map +1 -0
  459. package/dist/core/vcs/worktree.d.ts +10 -0
  460. package/dist/core/vcs/worktree.d.ts.map +1 -0
  461. package/dist/core/vcs/worktree.js +25 -0
  462. package/dist/core/vcs/worktree.js.map +1 -0
  463. package/dist/core/web/web-data-folders.d.ts.map +1 -1
  464. package/dist/core/web/web-data-folders.js +18 -33
  465. package/dist/core/web/web-data-folders.js.map +1 -1
  466. package/dist/core/web/web-data-lifecycle.d.ts.map +1 -1
  467. package/dist/core/web/web-data-lifecycle.js +2 -1
  468. package/dist/core/web/web-data-lifecycle.js.map +1 -1
  469. package/dist/core/web/web-events.d.ts +8 -6
  470. package/dist/core/web/web-events.d.ts.map +1 -1
  471. package/dist/core/web/web-events.js +7 -31
  472. package/dist/core/web/web-events.js.map +1 -1
  473. package/dist/core/web/web-server.d.ts.map +1 -1
  474. package/dist/core/web/web-server.js +3 -0
  475. package/dist/core/web/web-server.js.map +1 -1
  476. package/dist/core/web/web-trees.d.ts +27 -0
  477. package/dist/core/web/web-trees.d.ts.map +1 -0
  478. package/dist/core/web/web-trees.js +82 -0
  479. package/dist/core/web/web-trees.js.map +1 -0
  480. package/dist/harness/claude/claude-exec-args.d.ts +13 -0
  481. package/dist/harness/claude/claude-exec-args.d.ts.map +1 -0
  482. package/dist/harness/claude/claude-exec-args.js +61 -0
  483. package/dist/harness/claude/claude-exec-args.js.map +1 -0
  484. package/dist/harness/claude/claude-exec.d.ts +12 -0
  485. package/dist/harness/claude/claude-exec.d.ts.map +1 -0
  486. package/dist/harness/claude/claude-exec.js +79 -0
  487. package/dist/harness/claude/claude-exec.js.map +1 -0
  488. package/dist/harness/claude/claude-stream.d.ts +31 -0
  489. package/dist/harness/claude/claude-stream.d.ts.map +1 -0
  490. package/dist/harness/claude/claude-stream.js +150 -0
  491. package/dist/harness/claude/claude-stream.js.map +1 -0
  492. package/dist/harness/claude/claude-tools.d.ts +5 -0
  493. package/dist/harness/claude/claude-tools.d.ts.map +1 -0
  494. package/dist/harness/claude/claude-tools.js +30 -0
  495. package/dist/harness/claude/claude-tools.js.map +1 -0
  496. package/dist/harness/index.d.ts +1 -0
  497. package/dist/harness/index.d.ts.map +1 -1
  498. package/dist/harness/index.js +3 -0
  499. package/dist/harness/index.js.map +1 -1
  500. package/dist/harness/opencode/opencode-session.d.ts +42 -0
  501. package/dist/harness/opencode/opencode-session.d.ts.map +1 -0
  502. package/dist/harness/opencode/opencode-session.js +123 -0
  503. package/dist/harness/opencode/opencode-session.js.map +1 -0
  504. package/dist/harness/opencode/opencode.d.ts +2 -1
  505. package/dist/harness/opencode/opencode.d.ts.map +1 -1
  506. package/dist/harness/opencode/opencode.js +52 -28
  507. package/dist/harness/opencode/opencode.js.map +1 -1
  508. package/dist/harness/prompt.js +1 -1
  509. package/dist/harness/prompt.js.map +1 -1
  510. package/dist/harness/types.d.ts +112 -1
  511. package/dist/harness/types.d.ts.map +1 -1
  512. package/dist/harness/types.js.map +1 -1
  513. package/dist/index.d.ts +3 -1
  514. package/dist/index.d.ts.map +1 -1
  515. package/dist/index.js +1 -0
  516. package/dist/index.js.map +1 -1
  517. package/dist/testing/index.d.ts +3 -0
  518. package/dist/testing/index.d.ts.map +1 -0
  519. package/dist/testing/index.js +2 -0
  520. package/dist/testing/index.js.map +1 -0
  521. package/dist/testing/scenario.d.ts +29 -0
  522. package/dist/testing/scenario.d.ts.map +1 -0
  523. package/dist/testing/scenario.js +157 -0
  524. package/dist/testing/scenario.js.map +1 -0
  525. package/dist/watcher/archiver.d.ts +2 -1
  526. package/dist/watcher/archiver.d.ts.map +1 -1
  527. package/dist/watcher/archiver.js +27 -2
  528. package/dist/watcher/archiver.js.map +1 -1
  529. package/dist/watcher/auto-recertify.d.ts +27 -0
  530. package/dist/watcher/auto-recertify.d.ts.map +1 -0
  531. package/dist/watcher/auto-recertify.js +113 -0
  532. package/dist/watcher/auto-recertify.js.map +1 -0
  533. package/dist/watcher/auto-retry.d.ts +1 -1
  534. package/dist/watcher/auto-retry.d.ts.map +1 -1
  535. package/dist/watcher/auto-retry.js +3 -11
  536. package/dist/watcher/auto-retry.js.map +1 -1
  537. package/dist/watcher/baseline-key.d.ts +17 -0
  538. package/dist/watcher/baseline-key.d.ts.map +1 -0
  539. package/dist/watcher/baseline-key.js +31 -0
  540. package/dist/watcher/baseline-key.js.map +1 -0
  541. package/dist/watcher/baseline.d.ts +32 -0
  542. package/dist/watcher/baseline.d.ts.map +1 -0
  543. package/dist/watcher/baseline.js +166 -0
  544. package/dist/watcher/baseline.js.map +1 -0
  545. package/dist/watcher/blocked.d.ts +12 -0
  546. package/dist/watcher/blocked.d.ts.map +1 -0
  547. package/dist/watcher/blocked.js +24 -0
  548. package/dist/watcher/blocked.js.map +1 -0
  549. package/dist/watcher/dependencies.d.ts +28 -0
  550. package/dist/watcher/dependencies.d.ts.map +1 -0
  551. package/dist/watcher/dependencies.js +152 -0
  552. package/dist/watcher/dependencies.js.map +1 -0
  553. package/dist/watcher/done-metadata.d.ts +4 -0
  554. package/dist/watcher/done-metadata.d.ts.map +1 -0
  555. package/dist/watcher/done-metadata.js +20 -0
  556. package/dist/watcher/done-metadata.js.map +1 -0
  557. package/dist/watcher/failure-reason.d.ts +1 -1
  558. package/dist/watcher/failure-reason.d.ts.map +1 -1
  559. package/dist/watcher/focused-verify.d.ts +17 -0
  560. package/dist/watcher/focused-verify.d.ts.map +1 -0
  561. package/dist/watcher/focused-verify.js +54 -0
  562. package/dist/watcher/focused-verify.js.map +1 -0
  563. package/dist/watcher/git-guard.d.ts +24 -0
  564. package/dist/watcher/git-guard.d.ts.map +1 -0
  565. package/dist/watcher/git-guard.js +95 -0
  566. package/dist/watcher/git-guard.js.map +1 -0
  567. package/dist/watcher/instructions-drift.d.ts +21 -0
  568. package/dist/watcher/instructions-drift.d.ts.map +1 -0
  569. package/dist/watcher/instructions-drift.js +115 -0
  570. package/dist/watcher/instructions-drift.js.map +1 -0
  571. package/dist/watcher/loop.d.ts.map +1 -1
  572. package/dist/watcher/loop.js +36 -50
  573. package/dist/watcher/loop.js.map +1 -1
  574. package/dist/watcher/measures.d.ts.map +1 -1
  575. package/dist/watcher/measures.js +22 -39
  576. package/dist/watcher/measures.js.map +1 -1
  577. package/dist/watcher/mutation-check.d.ts +42 -0
  578. package/dist/watcher/mutation-check.d.ts.map +1 -0
  579. package/dist/watcher/mutation-check.js +147 -0
  580. package/dist/watcher/mutation-check.js.map +1 -0
  581. package/dist/watcher/regression.d.ts +10 -5
  582. package/dist/watcher/regression.d.ts.map +1 -1
  583. package/dist/watcher/regression.js +29 -22
  584. package/dist/watcher/regression.js.map +1 -1
  585. package/dist/watcher/runner.d.ts.map +1 -1
  586. package/dist/watcher/runner.js +12 -14
  587. package/dist/watcher/runner.js.map +1 -1
  588. package/dist/watcher/spawn.d.ts.map +1 -1
  589. package/dist/watcher/spawn.js +5 -0
  590. package/dist/watcher/spawn.js.map +1 -1
  591. package/dist/watcher/task-verify.d.ts +7 -2
  592. package/dist/watcher/task-verify.d.ts.map +1 -1
  593. package/dist/watcher/task-verify.js +33 -8
  594. package/dist/watcher/task-verify.js.map +1 -1
  595. package/dist/watcher/verify.d.ts +1 -5
  596. package/dist/watcher/verify.d.ts.map +1 -1
  597. package/dist/watcher/verify.js +2 -6
  598. package/dist/watcher/verify.js.map +1 -1
  599. package/package.json +5 -1
  600. package/templates/PLANNER.md +35 -9
  601. package/templates/openspec/config.yaml +1 -1
  602. package/templates/openspec/schemas/osq/schema.yaml +4 -2
  603. package/templates/openspec/schemas/osq/templates/proposal.md +9 -2
  604. package/templates/proposal.md +9 -2
  605. package/ui/dist/assets/{index-CZYeQ8la.js → index-D39uYbbL.js} +1 -1
  606. package/ui/dist/index.html +1 -1
@@ -0,0 +1,76 @@
1
+ /**
2
+ * The scenario index: every scenario call, every exported function with its
3
+ * tags, and every unreadable form, built once from the import graph's files.
4
+ * Nothing is persisted.
5
+ */
6
+ import { readFileSync } from 'node:fs';
7
+ import path from 'node:path';
8
+ import { scanSource, } from './tag-scan.js';
9
+ function sortedUnique(values) {
10
+ return [...new Set(values)].sort();
11
+ }
12
+ function testsNaming(calls, capability, name) {
13
+ return sortedUnique(calls
14
+ .filter((call) => call.capability === capability && call.name === name)
15
+ .map((call) => call.file));
16
+ }
17
+ function scenariosInFile(calls, file) {
18
+ const seen = new Set();
19
+ const scenarios = [];
20
+ for (const call of calls) {
21
+ if (call.file !== file)
22
+ continue;
23
+ const key = `${call.capability}\u0000${call.name}`;
24
+ if (seen.has(key))
25
+ continue;
26
+ seen.add(key);
27
+ scenarios.push({ capability: call.capability, name: call.name });
28
+ }
29
+ return scenarios.sort((a, b) => a.capability.localeCompare(b.capability) || a.name.localeCompare(b.name));
30
+ }
31
+ function coveringTests(graph, calls, functionFile, name) {
32
+ return sortedUnique(calls
33
+ .filter((call) => call.covers === name && graph.importsOf(call.file).includes(functionFile))
34
+ .map((call) => call.file));
35
+ }
36
+ function covers(graph, calls, testFile, functionFile, name) {
37
+ if (!graph.importsOf(testFile).includes(functionFile))
38
+ return false;
39
+ return calls.some((call) => call.file === testFile && call.covers === name);
40
+ }
41
+ function readSource(projectRoot, file) {
42
+ try {
43
+ return readFileSync(path.join(projectRoot, file), 'utf8');
44
+ }
45
+ catch {
46
+ return '';
47
+ }
48
+ }
49
+ /** Read each of `graph.files` once and index its tags, scenario calls, and unreadable forms. */
50
+ export function buildScenarioIndex(projectRoot, graph) {
51
+ const files = [...graph.files];
52
+ const functions = [];
53
+ const calls = [];
54
+ const unreadable = [];
55
+ const scenarioTestFiles = [];
56
+ for (const file of files) {
57
+ const scan = scanSource(file, readSource(projectRoot, file));
58
+ functions.push(...scan.functions);
59
+ calls.push(...scan.calls);
60
+ unreadable.push(...scan.unreadable);
61
+ if (scan.scenarioTestFile)
62
+ scenarioTestFiles.push(file);
63
+ }
64
+ return {
65
+ files,
66
+ scenarioTestFiles,
67
+ functions,
68
+ calls,
69
+ unreadable,
70
+ testsNaming: (capability, name) => testsNaming(calls, capability, name),
71
+ scenariosInFile: (file) => scenariosInFile(calls, file),
72
+ coveringTests: (functionFile, name) => coveringTests(graph, calls, functionFile, name),
73
+ covers: (testFile, functionFile, name) => covers(graph, calls, testFile, functionFile, name),
74
+ };
75
+ }
76
+ //# sourceMappingURL=scenario-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-index.js","sourceRoot":"","sources":["../../../src/core/trace/scenario-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type DeltaScenario, type ScenarioOutcome } from '../spec/delta.js';
2
+ /** Drop every cached spec and reset the read counter. */
3
+ export declare function clearScenarioLookupCache(): void;
4
+ /** How many spec files have been read since the last cache clear. */
5
+ export declare function scenarioSpecReadCount(): number;
6
+ /** Every scenario of one capability's effective spec, for lint. */
7
+ export declare function effectiveScenarios(openspecRoot: string, changeFolder: string | null, capability: string): readonly DeltaScenario[];
8
+ /**
9
+ * The outcomes of one scenario, looked up by capability and exact name. Throws
10
+ * with the exact message when the scenario is missing, duplicated, defined in
11
+ * disagreeing places, or its delta cannot be merged.
12
+ */
13
+ export declare function lookupScenario(capability: string, name: string, cwd: string, env: Record<string, string | undefined>): readonly ScenarioOutcome[];
14
+ //# sourceMappingURL=scenario-lookup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-lookup.d.ts","sourceRoot":"","sources":["../../../src/core/trace/scenario-lookup.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,eAAe,EAIrB,MAAM,kBAAkB,CAAC;AA6B1B,yDAAyD;AACzD,wBAAgB,wBAAwB,IAAI,IAAI,CAG/C;AAED,qEAAqE;AACrE,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAmGD,mEAAmE;AACnE,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,UAAU,EAAE,MAAM,GACjB,SAAS,aAAa,EAAE,CAI1B;AAiED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,SAAS,eAAe,EAAE,CAgB5B"}
@@ -0,0 +1,179 @@
1
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { mergeDelta, parseCapabilitySpec, parseDelta, } from '../spec/delta.js';
4
+ import { isActiveChangeFolderName } from '../status/layout.js';
5
+ const placesCache = new Map();
6
+ let specReads = 0;
7
+ /** Drop every cached spec and reset the read counter. */
8
+ export function clearScenarioLookupCache() {
9
+ placesCache.clear();
10
+ specReads = 0;
11
+ }
12
+ /** How many spec files have been read since the last cache clear. */
13
+ export function scenarioSpecReadCount() {
14
+ return specReads;
15
+ }
16
+ function specFilePath(openspecRoot, capability) {
17
+ return path.join(openspecRoot, 'specs', capability, 'spec.md');
18
+ }
19
+ function deltaFilePath(changeFolder, capability) {
20
+ return path.join(changeFolder, 'specs', capability, 'spec.md');
21
+ }
22
+ function relativeToHolder(openspecRoot, filePath) {
23
+ return path.relative(path.dirname(openspecRoot), filePath);
24
+ }
25
+ function readSpec(filePath) {
26
+ if (!existsSync(filePath))
27
+ return null;
28
+ specReads++;
29
+ return readFileSync(filePath, 'utf8');
30
+ }
31
+ function scenarioList(spec) {
32
+ return spec.requirements.flatMap((requirement) => requirement.scenarios);
33
+ }
34
+ /** The living spec as a place list: one entry, or none when it is absent. */
35
+ function livingPlaces(openspecRoot, capability, content) {
36
+ if (content === null)
37
+ return [];
38
+ return [
39
+ {
40
+ relativePath: relativeToHolder(openspecRoot, specFilePath(openspecRoot, capability)),
41
+ scenarios: scenarioList(parseCapabilitySpec(content)),
42
+ },
43
+ ];
44
+ }
45
+ /** The living spec merged with one change's delta, when the delta exists. */
46
+ function loadEffectivePlaces(openspecRoot, changeFolder, capability) {
47
+ const living = readSpec(specFilePath(openspecRoot, capability));
48
+ if (changeFolder === null)
49
+ return livingPlaces(openspecRoot, capability, living);
50
+ const deltaRaw = readSpec(deltaFilePath(changeFolder, capability));
51
+ if (deltaRaw === null)
52
+ return livingPlaces(openspecRoot, capability, living);
53
+ const merged = mergeDelta(living, capability, parseDelta(deltaRaw));
54
+ return livingPlaces(openspecRoot, capability, merged);
55
+ }
56
+ /** The living spec plus every active change's ADDED/MODIFIED requirements. */
57
+ function loadAllPlaces(openspecRoot, capability) {
58
+ const places = livingPlaces(openspecRoot, capability, readSpec(specFilePath(openspecRoot, capability)));
59
+ const changesDir = path.join(openspecRoot, 'changes');
60
+ if (!existsSync(changesDir))
61
+ return places;
62
+ const names = readdirSync(changesDir, { withFileTypes: true })
63
+ .filter((entry) => entry.isDirectory() && isActiveChangeFolderName(entry.name))
64
+ .map((entry) => entry.name)
65
+ .sort();
66
+ for (const name of names) {
67
+ const filePath = deltaFilePath(path.join(changesDir, name), capability);
68
+ const raw = readSpec(filePath);
69
+ if (raw === null)
70
+ continue;
71
+ const delta = parseDelta(raw);
72
+ const relativePath = relativeToHolder(openspecRoot, filePath);
73
+ for (const requirement of [...delta.added, ...delta.modified]) {
74
+ if (requirement.scenarios.length > 0) {
75
+ places.push({ relativePath, scenarios: requirement.scenarios });
76
+ }
77
+ }
78
+ }
79
+ return places;
80
+ }
81
+ function cachedPlaces(key, produce) {
82
+ const cached = placesCache.get(key);
83
+ if (cached !== undefined)
84
+ return cached;
85
+ const places = produce();
86
+ placesCache.set(key, places);
87
+ return places;
88
+ }
89
+ function effectivePlaces(openspecRoot, changeFolder, capability) {
90
+ const key = `effective\u0000${openspecRoot}\u0000${changeFolder ?? ''}\u0000${capability}`;
91
+ return cachedPlaces(key, () => loadEffectivePlaces(openspecRoot, changeFolder, capability));
92
+ }
93
+ function allPlaces(openspecRoot, capability) {
94
+ const key = `all\u0000${openspecRoot}\u0000\u0000${capability}`;
95
+ return cachedPlaces(key, () => loadAllPlaces(openspecRoot, capability));
96
+ }
97
+ /** Every scenario of one capability's effective spec, for lint. */
98
+ export function effectiveScenarios(openspecRoot, changeFolder, capability) {
99
+ const root = path.resolve(openspecRoot);
100
+ const folder = changeFolder === null ? null : path.resolve(changeFolder);
101
+ return effectivePlaces(root, folder, capability).flatMap((place) => place.scenarios);
102
+ }
103
+ /** The first scenario name that repeats, in document order, or null. */
104
+ function duplicateScenarioName(places) {
105
+ for (const place of places) {
106
+ const seen = new Set();
107
+ for (const scenario of place.scenarios) {
108
+ if (seen.has(scenario.name))
109
+ return scenario.name;
110
+ seen.add(scenario.name);
111
+ }
112
+ }
113
+ return null;
114
+ }
115
+ function definitionsOf(places, name) {
116
+ const definitions = [];
117
+ for (const place of places) {
118
+ for (const scenario of place.scenarios) {
119
+ if (scenario.name === name)
120
+ definitions.push({ place, outcomes: scenario.outcomes });
121
+ }
122
+ }
123
+ return definitions;
124
+ }
125
+ function sameOutcomes(a, b) {
126
+ return JSON.stringify(a) === JSON.stringify(b);
127
+ }
128
+ function resolveDefinitions(capability, name, definitions) {
129
+ const first = definitions[0];
130
+ const conflict = definitions
131
+ .slice(1)
132
+ .find((definition) => !sameOutcomes(first.outcomes, definition.outcomes));
133
+ if (conflict === undefined)
134
+ return first.outcomes;
135
+ throw new Error(`The ${capability} scenario "${name}" differs between ${first.place.relativePath} and ` +
136
+ `${conflict.place.relativePath}; set OSQ_CHANGE to the change folder the test should prove`);
137
+ }
138
+ /** The nearest ancestor of `cwd`, included, that holds `openspec/specs`. */
139
+ function findOpenspecRoot(cwd) {
140
+ const start = path.resolve(cwd);
141
+ let dir = start;
142
+ for (;;) {
143
+ if (existsSync(path.join(dir, 'openspec', 'specs')))
144
+ return path.join(dir, 'openspec');
145
+ const parent = path.dirname(dir);
146
+ if (parent === dir)
147
+ return path.join(start, 'openspec');
148
+ dir = parent;
149
+ }
150
+ }
151
+ function resolveLocation(cwd, env) {
152
+ const raw = env.OSQ_CHANGE?.trim();
153
+ if (raw) {
154
+ const changeFolder = path.resolve(cwd, raw);
155
+ return { openspecRoot: path.dirname(path.dirname(changeFolder)), changeFolder };
156
+ }
157
+ return { openspecRoot: findOpenspecRoot(cwd), changeFolder: null };
158
+ }
159
+ /**
160
+ * The outcomes of one scenario, looked up by capability and exact name. Throws
161
+ * with the exact message when the scenario is missing, duplicated, defined in
162
+ * disagreeing places, or its delta cannot be merged.
163
+ */
164
+ export function lookupScenario(capability, name, cwd, env) {
165
+ const location = resolveLocation(cwd, env);
166
+ const places = location.changeFolder === null
167
+ ? allPlaces(location.openspecRoot, capability)
168
+ : effectivePlaces(location.openspecRoot, location.changeFolder, capability);
169
+ const duplicate = duplicateScenarioName(places);
170
+ if (duplicate !== null) {
171
+ throw new Error(`The ${capability} spec has two scenarios named "${duplicate}"`);
172
+ }
173
+ const definitions = definitionsOf(places, name);
174
+ if (definitions.length === 0) {
175
+ throw new Error(`The ${capability} spec has no scenario "${name}"`);
176
+ }
177
+ return resolveDefinitions(capability, name, definitions);
178
+ }
179
+ //# sourceMappingURL=scenario-lookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenario-lookup.js","sourceRoot":"","sources":["../../../src/core/trace/scenario-lookup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * The tag and scenario call scanner. It reads one file's text with regular
3
+ * expressions over lines, never a TypeScript parser, which would be a fifth
4
+ * runtime dependency.
5
+ */
6
+ /** One scenario a function serves, from a `@scenario` tag. */
7
+ export interface TaggedScenario {
8
+ readonly capability: string;
9
+ readonly name: string;
10
+ }
11
+ /** One exported function the scanner reads, with its tags. */
12
+ export interface ScannedFunction {
13
+ readonly file: string;
14
+ readonly line: number;
15
+ readonly name: string;
16
+ readonly scenarios: readonly TaggedScenario[];
17
+ readonly adrs: readonly string[];
18
+ }
19
+ /** One readable `scenario(...)` call in a scenario test file. */
20
+ export interface ScenarioCall {
21
+ readonly file: string;
22
+ readonly line: number;
23
+ readonly capability: string;
24
+ readonly name: string;
25
+ readonly covers: string;
26
+ }
27
+ /** A tag or scenario call the scanner cannot read, with its 1-based line. */
28
+ export interface UnreadableForm {
29
+ readonly file: string;
30
+ readonly line: number;
31
+ readonly reason: string;
32
+ /** The call's literal capability, present only when that much was readable. */
33
+ readonly capability?: string;
34
+ }
35
+ /** Everything one source file yields. */
36
+ export interface TagScan {
37
+ readonly scenarioTestFile: boolean;
38
+ readonly functions: readonly ScannedFunction[];
39
+ readonly calls: readonly ScenarioCall[];
40
+ readonly unreadable: readonly UnreadableForm[];
41
+ }
42
+ /** Scan one file's text for exported functions with tags, scenario calls, and unreadable forms. */
43
+ export declare function scanSource(file: string, text: string): TagScan;
44
+ //# sourceMappingURL=tag-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-scan.d.ts","sourceRoot":"","sources":["../../../src/core/trace/tag-scan.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,8DAA8D;AAC9D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,8DAA8D;AAC9D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,yCAAyC;AACzC,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,CAAC;CAChD;AAkMD,mGAAmG;AACnG,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ9D"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * The tag and scenario call scanner. It reads one file's text with regular
3
+ * expressions over lines, never a TypeScript parser, which would be a fifth
4
+ * runtime dependency.
5
+ */
6
+ const UNATTACHED = 'tag is not attached to an exported function';
7
+ const BAD_TAG = 'tag is not a valid @scenario or @adr';
8
+ const BAD_SCENARIO = '@scenario is not "<capability>: <name>"';
9
+ const BAD_ADR = '@adr has no digits';
10
+ const BAD_CAPABILITY = 'scenario call capability is not a literal';
11
+ const BAD_NAME = 'scenario call name is not a literal';
12
+ const BAD_COVERS = 'scenario call covers is not an identifier';
13
+ const ALIASED_IMPORT = 'scenario is imported under another name';
14
+ const FUNCTION_DECL = /^\s*export\s+(?:async\s+)?function\s+([A-Za-z_$][\w$]*)/;
15
+ const CONST_DECL = /^\s*export\s+const\s+([A-Za-z_$][\w$]*)(?::(?:=>|[^=])*)?\s*=\s*(?:async\s*)?(?:function\b|(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>)/;
16
+ /** The exported function a declaration line names, or null. */
17
+ function declarationName(line) {
18
+ if (line === undefined)
19
+ return null;
20
+ return (FUNCTION_DECL.exec(line) ?? CONST_DECL.exec(line))?.[1] ?? null;
21
+ }
22
+ /** True when a trimmed comment line holds a tag. */
23
+ function isTagLike(trimmed) {
24
+ const comment = trimmed.startsWith('*') || trimmed.startsWith('//') || trimmed.startsWith('/*');
25
+ return comment && (trimmed.includes('@scenario') || trimmed.includes('@adr'));
26
+ }
27
+ /** A comment line's text with its markers stripped. */
28
+ function cleanTagText(trimmed) {
29
+ return trimmed
30
+ .replace(/^(?:\/\*+|\/\/|\*+)/, '')
31
+ .replace(/\*\/\s*$/, '')
32
+ .trim();
33
+ }
34
+ /** One `@scenario` or `@adr` line, or how it is unreadable. */
35
+ function parseTag(text) {
36
+ if (text.startsWith('@scenario')) {
37
+ const rest = text.slice('@scenario'.length).trim();
38
+ const colon = rest.indexOf(':');
39
+ const capability = colon === -1 ? '' : rest.slice(0, colon).trim();
40
+ const name = colon === -1 ? '' : rest.slice(colon + 1).trim();
41
+ if (capability === '' || name === '')
42
+ return { kind: 'bad', reason: BAD_SCENARIO };
43
+ return { kind: 'scenario', capability, name };
44
+ }
45
+ if (text.startsWith('@adr')) {
46
+ const rest = text.slice('@adr'.length).trim();
47
+ if (!/^\d+$/.test(rest))
48
+ return { kind: 'bad', reason: BAD_ADR };
49
+ return { kind: 'adr', number: rest };
50
+ }
51
+ return { kind: 'bad', reason: BAD_TAG };
52
+ }
53
+ /** Read every comment, attaching tags to the declaration below a doc comment. */
54
+ function collectTags(file, text, unreadable) {
55
+ const lines = text.split('\n');
56
+ const tags = new Map();
57
+ let block = null;
58
+ for (let index = 0; index < lines.length; index += 1) {
59
+ const trimmed = (lines[index] ?? '').trim();
60
+ if (block === null) {
61
+ if (trimmed.startsWith('/**'))
62
+ block = { kind: 'doc', tagLines: [] };
63
+ else if (trimmed.startsWith('/*'))
64
+ block = { kind: 'plain', tagLines: [] };
65
+ else if (trimmed.startsWith('//')) {
66
+ if (isTagLike(trimmed)) {
67
+ unreadable.push(unreadableForm(file, index + 1, parseTag(cleanTagText(trimmed))));
68
+ }
69
+ continue;
70
+ }
71
+ else
72
+ continue;
73
+ }
74
+ if (isTagLike(trimmed))
75
+ block.tagLines.push({ line: index + 1, text: trimmed });
76
+ if (!trimmed.includes('*/'))
77
+ continue;
78
+ const attached = block.kind === 'doc' && declarationName(lines[index + 1]) !== null;
79
+ const accumulator = tags.get(index + 2) ?? { scenarios: [], adrs: [] };
80
+ for (const tagLine of block.tagLines) {
81
+ const tag = parseTag(cleanTagText(tagLine.text));
82
+ if (attached && tag.kind === 'scenario') {
83
+ accumulator.scenarios.push({ capability: tag.capability, name: tag.name });
84
+ }
85
+ else if (attached && tag.kind === 'adr') {
86
+ accumulator.adrs.push(tag.number);
87
+ }
88
+ else {
89
+ unreadable.push(unreadableForm(file, tagLine.line, tag));
90
+ }
91
+ }
92
+ if (attached)
93
+ tags.set(index + 2, accumulator);
94
+ block = null;
95
+ }
96
+ return tags;
97
+ }
98
+ /** A tag line's unreadable form. */
99
+ function unreadableForm(file, line, tag) {
100
+ return { file, line, reason: tag.kind === 'bad' ? tag.reason : UNATTACHED };
101
+ }
102
+ /** Every exported function in the documented forms, with the tags attached to it. */
103
+ function scanFunctions(file, text, tags) {
104
+ const functions = [];
105
+ const lines = text.split('\n');
106
+ for (let index = 0; index < lines.length; index += 1) {
107
+ const name = declarationName(lines[index]);
108
+ if (name === null)
109
+ continue;
110
+ const attached = tags.get(index + 1);
111
+ functions.push({
112
+ file,
113
+ line: index + 1,
114
+ name,
115
+ scenarios: attached?.scenarios ?? [],
116
+ adrs: attached?.adrs ?? [],
117
+ });
118
+ }
119
+ return functions;
120
+ }
121
+ /** The 1-based line of a character offset. */
122
+ function lineOf(text, index) {
123
+ let line = 1;
124
+ for (let position = 0; position < index && position < text.length; position += 1) {
125
+ if (text[position] === '\n')
126
+ line += 1;
127
+ }
128
+ return line;
129
+ }
130
+ const CALL_START = /\bscenario\s*\(/g;
131
+ const READABLE_CALL = /\bscenario\s*\(\s*(['"])((?:[^\\])*?)\1\s*,\s*(['"])((?:[^\\])*?)\3\s*,\s*\{\s*covers\s*:\s*([A-Za-z_$][\w$]*)\s*(?:\}|,)/g;
132
+ const COVERS = /^\s*\{\s*covers\s*:\s*([A-Za-z_$][\w$]*)\s*(?:\}|,)/;
133
+ /** Why a `scenario(` call could not be read, naming the argument that isn't a literal. */
134
+ function callReason(text, start) {
135
+ const after = text.slice(start);
136
+ const first = /^\s*(['"])((?:[^\\])*?)\1\s*,\s*/.exec(after);
137
+ if (first === null)
138
+ return BAD_CAPABILITY;
139
+ const rest = after.slice(first[0].length);
140
+ const second = /^\s*(['"])((?:[^\\])*?)\1\s*,\s*/.exec(rest);
141
+ if (second === null)
142
+ return BAD_NAME;
143
+ return COVERS.test(rest.slice(second[0].length)) ? BAD_TAG : BAD_COVERS;
144
+ }
145
+ /** Read every `scenario(` call, recording the unreadable ones. */
146
+ function scanScenarioCalls(file, text, calls, unreadable) {
147
+ const readable = new Set();
148
+ for (const match of text.matchAll(READABLE_CALL)) {
149
+ const index = match.index ?? 0;
150
+ readable.add(index);
151
+ calls.push({
152
+ file,
153
+ line: lineOf(text, index),
154
+ capability: match[2] ?? '',
155
+ name: match[4] ?? '',
156
+ covers: match[5] ?? '',
157
+ });
158
+ }
159
+ for (const match of text.matchAll(CALL_START)) {
160
+ const index = match.index ?? 0;
161
+ if (readable.has(index))
162
+ continue;
163
+ const start = index + match[0].length;
164
+ const capability = /^\s*(['"])((?:[^\\])*?)\1/.exec(text.slice(start))?.[2];
165
+ unreadable.push({
166
+ file,
167
+ line: lineOf(text, index),
168
+ reason: callReason(text, start),
169
+ capability: capability ?? undefined,
170
+ });
171
+ }
172
+ }
173
+ const TESTING_IMPORT = /(?:from\s*|require\s*\(\s*|import\s*\(\s*)['"]@matteeh\/osq\/testing['"]/;
174
+ const NAMED_TESTING_IMPORT = /import\s*\{([^}]*)\}\s*from\s*['"]@matteeh\/osq\/testing['"]/g;
175
+ /** True when the file imports the testing helper; record an aliased `scenario` import. */
176
+ function scanTestingImport(file, text, unreadable) {
177
+ if (!TESTING_IMPORT.test(text))
178
+ return false;
179
+ for (const match of text.matchAll(NAMED_TESTING_IMPORT)) {
180
+ for (const part of (match[1] ?? '').split(',')) {
181
+ const alias = /^\s*scenario\s+as\s+([A-Za-z_$][\w$]*)\s*$/.exec(part);
182
+ if (alias !== null && alias[1] !== 'scenario') {
183
+ unreadable.push({ file, line: lineOf(text, match.index ?? 0), reason: ALIASED_IMPORT });
184
+ }
185
+ }
186
+ }
187
+ return true;
188
+ }
189
+ /** Scan one file's text for exported functions with tags, scenario calls, and unreadable forms. */
190
+ export function scanSource(file, text) {
191
+ const calls = [];
192
+ const unreadable = [];
193
+ const scenarioTestFile = scanTestingImport(file, text, unreadable);
194
+ const tags = collectTags(file, text, unreadable);
195
+ const functions = scanFunctions(file, text, tags);
196
+ if (scenarioTestFile)
197
+ scanScenarioCalls(file, text, calls, unreadable);
198
+ return { scenarioTestFile, functions, calls, unreadable };
199
+ }
200
+ //# sourceMappingURL=tag-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-scan.js","sourceRoot":"","sources":["../../../src/core/trace/tag-scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { OsqConfig } from '../foundation/config.js';
2
+ import type { DoctorCheckResult } from '../foundation/doctor.js';
3
+ export interface DoctorGitOptions {
4
+ /** Override the git binary; tests use an absent path for the missing case. */
5
+ readonly gitBinary?: string;
6
+ }
7
+ /**
8
+ * The `git` doctor check, the version-control warnings, and, when a
9
+ * redirecting variable is set, the `git-env` warning. All pass with a warning
10
+ * and never change doctor's exit code.
11
+ */
12
+ export declare function checkGit(projectRoot: string, config: OsqConfig, options?: DoctorGitOptions): Promise<DoctorCheckResult[]>;
13
+ //# sourceMappingURL=doctor-git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-git.d.ts","sourceRoot":"","sources":["../../../src/core/vcs/doctor-git.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAuBjE,MAAM,WAAW,gBAAgB;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAkGD;;;;GAIG;AACH,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,SAAS,EACjB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAW9B"}