@seanmars/tospec 0.19.0-beta.8 → 0.21.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 (423) hide show
  1. package/CHANGELOG.md +89 -296
  2. package/README.md +69 -82
  3. package/assets/dashboard/app.js +11 -0
  4. package/assets/dashboard/style.css +7 -0
  5. package/bin/tospec.js +1 -1
  6. package/dist/cli/index.d.ts +6 -1
  7. package/dist/cli/index.d.ts.map +1 -1
  8. package/dist/cli/index.js +120 -112
  9. package/dist/cli/index.js.map +1 -1
  10. package/dist/commands/config.d.ts +9 -17
  11. package/dist/commands/config.d.ts.map +1 -1
  12. package/dist/commands/config.js +300 -145
  13. package/dist/commands/config.js.map +1 -1
  14. package/dist/commands/dashboard.d.ts +57 -99
  15. package/dist/commands/dashboard.d.ts.map +1 -1
  16. package/dist/commands/dashboard.js +252 -330
  17. package/dist/commands/dashboard.js.map +1 -1
  18. package/dist/commands/decision.d.ts +38 -27
  19. package/dist/commands/decision.d.ts.map +1 -1
  20. package/dist/commands/decision.js +301 -131
  21. package/dist/commands/decision.js.map +1 -1
  22. package/dist/commands/metrics.d.ts +28 -51
  23. package/dist/commands/metrics.d.ts.map +1 -1
  24. package/dist/commands/metrics.js +62 -93
  25. package/dist/commands/metrics.js.map +1 -1
  26. package/dist/commands/shared-output.d.ts +12 -27
  27. package/dist/commands/shared-output.d.ts.map +1 -1
  28. package/dist/commands/shared-output.js +22 -45
  29. package/dist/commands/shared-output.js.map +1 -1
  30. package/dist/commands/show.d.ts +4 -7
  31. package/dist/commands/show.d.ts.map +1 -1
  32. package/dist/commands/show.js +23 -11
  33. package/dist/commands/show.js.map +1 -1
  34. package/dist/commands/validate.d.ts +34 -58
  35. package/dist/commands/validate.d.ts.map +1 -1
  36. package/dist/commands/validate.js +228 -142
  37. package/dist/commands/validate.js.map +1 -1
  38. package/dist/commands/workflow/index.d.ts +1 -5
  39. package/dist/commands/workflow/index.d.ts.map +1 -1
  40. package/dist/commands/workflow/index.js +1 -5
  41. package/dist/commands/workflow/index.js.map +1 -1
  42. package/dist/commands/workflow/instructions.d.ts +14 -24
  43. package/dist/commands/workflow/instructions.d.ts.map +1 -1
  44. package/dist/commands/workflow/instructions.js +230 -132
  45. package/dist/commands/workflow/instructions.js.map +1 -1
  46. package/dist/commands/workflow/new-change.d.ts +2 -5
  47. package/dist/commands/workflow/new-change.d.ts.map +1 -1
  48. package/dist/commands/workflow/new-change.js +75 -34
  49. package/dist/commands/workflow/new-change.js.map +1 -1
  50. package/dist/commands/workflow/schemas.d.ts +1 -5
  51. package/dist/commands/workflow/schemas.d.ts.map +1 -1
  52. package/dist/commands/workflow/schemas.js +6 -17
  53. package/dist/commands/workflow/schemas.js.map +1 -1
  54. package/dist/commands/workflow/shared.d.ts +37 -42
  55. package/dist/commands/workflow/shared.d.ts.map +1 -1
  56. package/dist/commands/workflow/shared.js +23 -54
  57. package/dist/commands/workflow/shared.js.map +1 -1
  58. package/dist/commands/workflow/status.d.ts +7 -17
  59. package/dist/commands/workflow/status.d.ts.map +1 -1
  60. package/dist/commands/workflow/status.js +57 -72
  61. package/dist/commands/workflow/status.js.map +1 -1
  62. package/dist/commands/workflow/templates.d.ts +8 -8
  63. package/dist/commands/workflow/templates.d.ts.map +1 -1
  64. package/dist/commands/workflow/templates.js +32 -46
  65. package/dist/commands/workflow/templates.js.map +1 -1
  66. package/dist/core/archive.d.ts +33 -31
  67. package/dist/core/archive.d.ts.map +1 -1
  68. package/dist/core/archive.js +322 -284
  69. package/dist/core/archive.js.map +1 -1
  70. package/dist/core/artifact-graph/graph.d.ts +25 -42
  71. package/dist/core/artifact-graph/graph.d.ts.map +1 -1
  72. package/dist/core/artifact-graph/graph.js +45 -63
  73. package/dist/core/artifact-graph/graph.js.map +1 -1
  74. package/dist/core/artifact-graph/index.d.ts +1 -1
  75. package/dist/core/artifact-graph/index.d.ts.map +1 -1
  76. package/dist/core/artifact-graph/index.js +1 -1
  77. package/dist/core/artifact-graph/index.js.map +1 -1
  78. package/dist/core/artifact-graph/instruction-loader.d.ts +54 -120
  79. package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -1
  80. package/dist/core/artifact-graph/instruction-loader.js +129 -111
  81. package/dist/core/artifact-graph/instruction-loader.js.map +1 -1
  82. package/dist/core/artifact-graph/outputs.d.ts +9 -23
  83. package/dist/core/artifact-graph/outputs.d.ts.map +1 -1
  84. package/dist/core/artifact-graph/outputs.js +45 -38
  85. package/dist/core/artifact-graph/outputs.js.map +1 -1
  86. package/dist/core/artifact-graph/resolver.d.ts +36 -81
  87. package/dist/core/artifact-graph/resolver.d.ts.map +1 -1
  88. package/dist/core/artifact-graph/resolver.js +60 -101
  89. package/dist/core/artifact-graph/resolver.js.map +1 -1
  90. package/dist/core/artifact-graph/schema.d.ts +0 -6
  91. package/dist/core/artifact-graph/schema.d.ts.map +1 -1
  92. package/dist/core/artifact-graph/schema.js +7 -32
  93. package/dist/core/artifact-graph/schema.js.map +1 -1
  94. package/dist/core/artifact-graph/state.d.ts +1 -8
  95. package/dist/core/artifact-graph/state.d.ts.map +1 -1
  96. package/dist/core/artifact-graph/state.js +2 -17
  97. package/dist/core/artifact-graph/state.js.map +1 -1
  98. package/dist/core/artifact-graph/stub-detection.d.ts +6 -14
  99. package/dist/core/artifact-graph/stub-detection.d.ts.map +1 -1
  100. package/dist/core/artifact-graph/stub-detection.js +13 -16
  101. package/dist/core/artifact-graph/stub-detection.js.map +1 -1
  102. package/dist/core/artifact-graph/types.d.ts +4 -0
  103. package/dist/core/artifact-graph/types.d.ts.map +1 -1
  104. package/dist/core/artifact-graph/types.js +46 -11
  105. package/dist/core/artifact-graph/types.js.map +1 -1
  106. package/dist/core/available-tools.d.ts +3 -12
  107. package/dist/core/available-tools.d.ts.map +1 -1
  108. package/dist/core/available-tools.js +4 -13
  109. package/dist/core/available-tools.js.map +1 -1
  110. package/dist/core/change-metadata/schema.d.ts +1 -1
  111. package/dist/core/change-metadata/schema.d.ts.map +1 -1
  112. package/dist/core/change-metadata/schema.js +10 -7
  113. package/dist/core/change-metadata/schema.js.map +1 -1
  114. package/dist/core/change-presenter.d.ts +16 -27
  115. package/dist/core/change-presenter.d.ts.map +1 -1
  116. package/dist/core/change-presenter.js +53 -53
  117. package/dist/core/change-presenter.js.map +1 -1
  118. package/dist/core/change-status-policy.d.ts +4 -8
  119. package/dist/core/change-status-policy.d.ts.map +1 -1
  120. package/dist/core/change-status-policy.js +9 -17
  121. package/dist/core/change-status-policy.js.map +1 -1
  122. package/dist/core/codex-metrics.d.ts +25 -45
  123. package/dist/core/codex-metrics.d.ts.map +1 -1
  124. package/dist/core/codex-metrics.js +44 -88
  125. package/dist/core/codex-metrics.js.map +1 -1
  126. package/dist/core/codex-residue.d.ts +14 -15
  127. package/dist/core/codex-residue.d.ts.map +1 -1
  128. package/dist/core/codex-residue.js +18 -22
  129. package/dist/core/codex-residue.js.map +1 -1
  130. package/dist/core/command-generation/adapters/claude.d.ts +2 -9
  131. package/dist/core/command-generation/adapters/claude.d.ts.map +1 -1
  132. package/dist/core/command-generation/adapters/claude.js +2 -12
  133. package/dist/core/command-generation/adapters/claude.js.map +1 -1
  134. package/dist/core/command-generation/adapters/index.d.ts +1 -9
  135. package/dist/core/command-generation/adapters/index.d.ts.map +1 -1
  136. package/dist/core/command-generation/adapters/index.js +1 -9
  137. package/dist/core/command-generation/adapters/index.js.map +1 -1
  138. package/dist/core/command-generation/generator.d.ts +0 -17
  139. package/dist/core/command-generation/generator.d.ts.map +1 -1
  140. package/dist/core/command-generation/generator.js +0 -17
  141. package/dist/core/command-generation/generator.js.map +1 -1
  142. package/dist/core/command-generation/index.d.ts +2 -5
  143. package/dist/core/command-generation/index.d.ts.map +1 -1
  144. package/dist/core/command-generation/index.js +0 -9
  145. package/dist/core/command-generation/index.js.map +1 -1
  146. package/dist/core/command-generation/types.d.ts +10 -36
  147. package/dist/core/command-generation/types.d.ts.map +1 -1
  148. package/dist/core/command-generation/types.js +0 -6
  149. package/dist/core/command-generation/types.js.map +1 -1
  150. package/dist/core/command-generation/yaml.d.ts +3 -18
  151. package/dist/core/command-generation/yaml.d.ts.map +1 -1
  152. package/dist/core/command-generation/yaml.js +5 -23
  153. package/dist/core/command-generation/yaml.js.map +1 -1
  154. package/dist/core/config-prompts.d.ts +2 -4
  155. package/dist/core/config-prompts.d.ts.map +1 -1
  156. package/dist/core/config-prompts.js +2 -7
  157. package/dist/core/config-prompts.js.map +1 -1
  158. package/dist/core/config-schema.d.ts +7 -41
  159. package/dist/core/config-schema.d.ts.map +1 -1
  160. package/dist/core/config-schema.js +35 -74
  161. package/dist/core/config-schema.js.map +1 -1
  162. package/dist/core/config.d.ts +25 -49
  163. package/dist/core/config.d.ts.map +1 -1
  164. package/dist/core/config.js +22 -45
  165. package/dist/core/config.js.map +1 -1
  166. package/dist/core/dashboard-activity.d.ts +7 -9
  167. package/dist/core/dashboard-activity.d.ts.map +1 -1
  168. package/dist/core/dashboard-activity.js +34 -25
  169. package/dist/core/dashboard-activity.js.map +1 -1
  170. package/dist/core/dashboard-data.d.ts +35 -22
  171. package/dist/core/dashboard-data.d.ts.map +1 -1
  172. package/dist/core/dashboard-data.js +57 -72
  173. package/dist/core/dashboard-data.js.map +1 -1
  174. package/dist/core/global-config.d.ts +24 -53
  175. package/dist/core/global-config.d.ts.map +1 -1
  176. package/dist/core/global-config.js +38 -67
  177. package/dist/core/global-config.js.map +1 -1
  178. package/dist/core/init.d.ts +12 -28
  179. package/dist/core/init.d.ts.map +1 -1
  180. package/dist/core/init.js +93 -169
  181. package/dist/core/init.js.map +1 -1
  182. package/dist/core/list.d.ts.map +1 -1
  183. package/dist/core/list.js +95 -41
  184. package/dist/core/list.js.map +1 -1
  185. package/dist/core/local-server.d.ts +41 -83
  186. package/dist/core/local-server.d.ts.map +1 -1
  187. package/dist/core/local-server.js +53 -98
  188. package/dist/core/local-server.js.map +1 -1
  189. package/dist/core/markdown-render.d.ts +15 -23
  190. package/dist/core/markdown-render.d.ts.map +1 -1
  191. package/dist/core/markdown-render.js +25 -34
  192. package/dist/core/markdown-render.js.map +1 -1
  193. package/dist/core/migrate.d.ts +19 -16
  194. package/dist/core/migrate.d.ts.map +1 -1
  195. package/dist/core/migrate.js +162 -136
  196. package/dist/core/migrate.js.map +1 -1
  197. package/dist/core/parsers/change-parser.d.ts +7 -10
  198. package/dist/core/parsers/change-parser.d.ts.map +1 -1
  199. package/dist/core/parsers/change-parser.js +48 -56
  200. package/dist/core/parsers/change-parser.js.map +1 -1
  201. package/dist/core/parsers/markdown-parser.d.ts +8 -9
  202. package/dist/core/parsers/markdown-parser.d.ts.map +1 -1
  203. package/dist/core/parsers/markdown-parser.js +23 -30
  204. package/dist/core/parsers/markdown-parser.js.map +1 -1
  205. package/dist/core/parsers/requirement-blocks.d.ts +43 -15
  206. package/dist/core/parsers/requirement-blocks.d.ts.map +1 -1
  207. package/dist/core/parsers/requirement-blocks.js +142 -70
  208. package/dist/core/parsers/requirement-blocks.js.map +1 -1
  209. package/dist/core/parsers/requirement-text.d.ts +73 -79
  210. package/dist/core/parsers/requirement-text.d.ts.map +1 -1
  211. package/dist/core/parsers/requirement-text.js +137 -79
  212. package/dist/core/parsers/requirement-text.js.map +1 -1
  213. package/dist/core/parsers/spec-structure.d.ts.map +1 -1
  214. package/dist/core/parsers/spec-structure.js +10 -6
  215. package/dist/core/parsers/spec-structure.js.map +1 -1
  216. package/dist/core/profiles.d.ts +3 -10
  217. package/dist/core/profiles.d.ts.map +1 -1
  218. package/dist/core/profiles.js +5 -12
  219. package/dist/core/profiles.js.map +1 -1
  220. package/dist/core/project-config.d.ts +43 -44
  221. package/dist/core/project-config.d.ts.map +1 -1
  222. package/dist/core/project-config.js +107 -82
  223. package/dist/core/project-config.js.map +1 -1
  224. package/dist/core/project-layout.d.ts +9 -17
  225. package/dist/core/project-layout.d.ts.map +1 -1
  226. package/dist/core/project-layout.js +16 -26
  227. package/dist/core/project-layout.js.map +1 -1
  228. package/dist/core/root-selection.d.ts +8 -14
  229. package/dist/core/root-selection.d.ts.map +1 -1
  230. package/dist/core/root-selection.js +3 -6
  231. package/dist/core/root-selection.js.map +1 -1
  232. package/dist/core/rules.d.ts.map +1 -1
  233. package/dist/core/rules.js +2 -3
  234. package/dist/core/rules.js.map +1 -1
  235. package/dist/core/schema-names.d.ts +16 -0
  236. package/dist/core/schema-names.d.ts.map +1 -0
  237. package/dist/core/schema-names.js +16 -0
  238. package/dist/core/schema-names.js.map +1 -0
  239. package/dist/core/schemas/base.schema.d.ts.map +1 -1
  240. package/dist/core/schemas/base.schema.js +6 -12
  241. package/dist/core/schemas/base.schema.js.map +1 -1
  242. package/dist/core/schemas/change.schema.d.ts +8 -0
  243. package/dist/core/schemas/change.schema.d.ts.map +1 -1
  244. package/dist/core/schemas/change.schema.js +41 -10
  245. package/dist/core/schemas/change.schema.js.map +1 -1
  246. package/dist/core/shared/index.d.ts +2 -7
  247. package/dist/core/shared/index.d.ts.map +1 -1
  248. package/dist/core/shared/index.js +2 -7
  249. package/dist/core/shared/index.js.map +1 -1
  250. package/dist/core/shared/rules-generation.d.ts +5 -15
  251. package/dist/core/shared/rules-generation.d.ts.map +1 -1
  252. package/dist/core/shared/rules-generation.js +33 -37
  253. package/dist/core/shared/rules-generation.js.map +1 -1
  254. package/dist/core/shared/skill-generation.d.ts +28 -43
  255. package/dist/core/shared/skill-generation.d.ts.map +1 -1
  256. package/dist/core/shared/skill-generation.js +82 -51
  257. package/dist/core/shared/skill-generation.js.map +1 -1
  258. package/dist/core/shared/tool-detection.d.ts +35 -76
  259. package/dist/core/shared/tool-detection.d.ts.map +1 -1
  260. package/dist/core/shared/tool-detection.js +73 -93
  261. package/dist/core/shared/tool-detection.js.map +1 -1
  262. package/dist/core/skill-metrics.d.ts +36 -63
  263. package/dist/core/skill-metrics.d.ts.map +1 -1
  264. package/dist/core/skill-metrics.js +34 -73
  265. package/dist/core/skill-metrics.js.map +1 -1
  266. package/dist/core/spec-presenter.d.ts.map +1 -1
  267. package/dist/core/spec-presenter.js +5 -10
  268. package/dist/core/spec-presenter.js.map +1 -1
  269. package/dist/core/specs-apply.d.ts +16 -31
  270. package/dist/core/specs-apply.d.ts.map +1 -1
  271. package/dist/core/specs-apply.js +146 -195
  272. package/dist/core/specs-apply.js.map +1 -1
  273. package/dist/core/templates/fragments/interview.d.ts +2 -6
  274. package/dist/core/templates/fragments/interview.d.ts.map +1 -1
  275. package/dist/core/templates/fragments/interview.js +2 -6
  276. package/dist/core/templates/fragments/interview.js.map +1 -1
  277. package/dist/core/templates/fragments/next-step.d.ts +4 -8
  278. package/dist/core/templates/fragments/next-step.d.ts.map +1 -1
  279. package/dist/core/templates/fragments/next-step.js +4 -8
  280. package/dist/core/templates/fragments/next-step.js.map +1 -1
  281. package/dist/core/templates/fragments/validate.d.ts +13 -0
  282. package/dist/core/templates/fragments/validate.d.ts.map +1 -0
  283. package/dist/core/templates/fragments/validate.js +13 -0
  284. package/dist/core/templates/fragments/validate.js.map +1 -0
  285. package/dist/core/templates/fragments/verify.d.ts +9 -12
  286. package/dist/core/templates/fragments/verify.d.ts.map +1 -1
  287. package/dist/core/templates/fragments/verify.js +9 -12
  288. package/dist/core/templates/fragments/verify.js.map +1 -1
  289. package/dist/core/templates/index.d.ts +0 -6
  290. package/dist/core/templates/index.d.ts.map +1 -1
  291. package/dist/core/templates/index.js +0 -7
  292. package/dist/core/templates/index.js.map +1 -1
  293. package/dist/core/templates/skill-templates.d.ts +1 -5
  294. package/dist/core/templates/skill-templates.d.ts.map +1 -1
  295. package/dist/core/templates/skill-templates.js +0 -5
  296. package/dist/core/templates/skill-templates.js.map +1 -1
  297. package/dist/core/templates/types.d.ts +3 -7
  298. package/dist/core/templates/types.d.ts.map +1 -1
  299. package/dist/core/templates/types.js +0 -3
  300. package/dist/core/templates/types.js.map +1 -1
  301. package/dist/core/templates/workflows/apply.d.ts +3 -9
  302. package/dist/core/templates/workflows/apply.d.ts.map +1 -1
  303. package/dist/core/templates/workflows/apply.js +11 -13
  304. package/dist/core/templates/workflows/apply.js.map +1 -1
  305. package/dist/core/templates/workflows/archive.d.ts +0 -6
  306. package/dist/core/templates/workflows/archive.d.ts.map +1 -1
  307. package/dist/core/templates/workflows/archive.js +16 -5
  308. package/dist/core/templates/workflows/archive.js.map +1 -1
  309. package/dist/core/templates/workflows/decision.js +3 -3
  310. package/dist/core/templates/workflows/decision.js.map +1 -1
  311. package/dist/core/templates/workflows/explore.js +1 -1
  312. package/dist/core/templates/workflows/grill.d.ts.map +1 -1
  313. package/dist/core/templates/workflows/grill.js +0 -2
  314. package/dist/core/templates/workflows/grill.js.map +1 -1
  315. package/dist/core/templates/workflows/issue.d.ts +0 -6
  316. package/dist/core/templates/workflows/issue.d.ts.map +1 -1
  317. package/dist/core/templates/workflows/issue.js +3 -2
  318. package/dist/core/templates/workflows/issue.js.map +1 -1
  319. package/dist/core/templates/workflows/propose.d.ts +0 -6
  320. package/dist/core/templates/workflows/propose.d.ts.map +1 -1
  321. package/dist/core/templates/workflows/propose.js +2 -2
  322. package/dist/core/templates/workflows/propose.js.map +1 -1
  323. package/dist/core/templates/workflows/sync.d.ts +2 -8
  324. package/dist/core/templates/workflows/sync.d.ts.map +1 -1
  325. package/dist/core/templates/workflows/sync.js +4 -3
  326. package/dist/core/templates/workflows/sync.js.map +1 -1
  327. package/dist/core/templates/workflows/update.d.ts +0 -6
  328. package/dist/core/templates/workflows/update.d.ts.map +1 -1
  329. package/dist/core/templates/workflows/update.js +9 -2
  330. package/dist/core/templates/workflows/update.js.map +1 -1
  331. package/dist/core/update.d.ts +10 -36
  332. package/dist/core/update.d.ts.map +1 -1
  333. package/dist/core/update.js +59 -126
  334. package/dist/core/update.js.map +1 -1
  335. package/dist/core/user-state-migration.d.ts +13 -15
  336. package/dist/core/user-state-migration.d.ts.map +1 -1
  337. package/dist/core/user-state-migration.js +30 -23
  338. package/dist/core/user-state-migration.js.map +1 -1
  339. package/dist/core/validation/constants.d.ts +4 -10
  340. package/dist/core/validation/constants.d.ts.map +1 -1
  341. package/dist/core/validation/constants.js +25 -25
  342. package/dist/core/validation/constants.js.map +1 -1
  343. package/dist/core/validation/prose-length.d.ts +15 -0
  344. package/dist/core/validation/prose-length.d.ts.map +1 -0
  345. package/dist/core/validation/prose-length.js +29 -0
  346. package/dist/core/validation/prose-length.js.map +1 -0
  347. package/dist/core/validation/purpose-placeholder.d.ts +9 -16
  348. package/dist/core/validation/purpose-placeholder.d.ts.map +1 -1
  349. package/dist/core/validation/purpose-placeholder.js +30 -44
  350. package/dist/core/validation/purpose-placeholder.js.map +1 -1
  351. package/dist/core/validation/section-validator.d.ts +4 -4
  352. package/dist/core/validation/section-validator.d.ts.map +1 -1
  353. package/dist/core/validation/section-validator.js +30 -12
  354. package/dist/core/validation/section-validator.js.map +1 -1
  355. package/dist/core/validation/task-numbering.d.ts +6 -3
  356. package/dist/core/validation/task-numbering.d.ts.map +1 -1
  357. package/dist/core/validation/task-numbering.js +23 -11
  358. package/dist/core/validation/task-numbering.js.map +1 -1
  359. package/dist/core/validation/types.d.ts +18 -0
  360. package/dist/core/validation/types.d.ts.map +1 -1
  361. package/dist/core/validation/types.js +12 -1
  362. package/dist/core/validation/types.js.map +1 -1
  363. package/dist/core/validation/validator.d.ts +42 -68
  364. package/dist/core/validation/validator.d.ts.map +1 -1
  365. package/dist/core/validation/validator.js +474 -285
  366. package/dist/core/validation/validator.js.map +1 -1
  367. package/dist/prompts/searchable-multi-select.d.ts +3 -8
  368. package/dist/prompts/searchable-multi-select.d.ts.map +1 -1
  369. package/dist/prompts/searchable-multi-select.js +16 -39
  370. package/dist/prompts/searchable-multi-select.js.map +1 -1
  371. package/dist/utils/change-metadata.d.ts +11 -50
  372. package/dist/utils/change-metadata.d.ts.map +1 -1
  373. package/dist/utils/change-metadata.js +48 -67
  374. package/dist/utils/change-metadata.js.map +1 -1
  375. package/dist/utils/change-utils.d.ts +24 -76
  376. package/dist/utils/change-utils.d.ts.map +1 -1
  377. package/dist/utils/change-utils.js +95 -142
  378. package/dist/utils/change-utils.js.map +1 -1
  379. package/dist/utils/file-lock.d.ts +39 -0
  380. package/dist/utils/file-lock.d.ts.map +1 -0
  381. package/dist/utils/file-lock.js +149 -0
  382. package/dist/utils/file-lock.js.map +1 -0
  383. package/dist/utils/file-system.d.ts +12 -32
  384. package/dist/utils/file-system.d.ts.map +1 -1
  385. package/dist/utils/file-system.js +41 -45
  386. package/dist/utils/file-system.js.map +1 -1
  387. package/dist/utils/frontmatter.d.ts +7 -11
  388. package/dist/utils/frontmatter.d.ts.map +1 -1
  389. package/dist/utils/frontmatter.js +11 -11
  390. package/dist/utils/frontmatter.js.map +1 -1
  391. package/dist/utils/interactive.d.ts +4 -9
  392. package/dist/utils/interactive.d.ts.map +1 -1
  393. package/dist/utils/interactive.js +2 -4
  394. package/dist/utils/interactive.js.map +1 -1
  395. package/dist/utils/item-discovery.d.ts +10 -20
  396. package/dist/utils/item-discovery.d.ts.map +1 -1
  397. package/dist/utils/item-discovery.js +31 -55
  398. package/dist/utils/item-discovery.js.map +1 -1
  399. package/dist/utils/link.d.ts +9 -18
  400. package/dist/utils/link.d.ts.map +1 -1
  401. package/dist/utils/link.js +9 -18
  402. package/dist/utils/link.js.map +1 -1
  403. package/dist/utils/requirement-diff.d.ts +13 -23
  404. package/dist/utils/requirement-diff.d.ts.map +1 -1
  405. package/dist/utils/requirement-diff.js +13 -23
  406. package/dist/utils/requirement-diff.js.map +1 -1
  407. package/dist/utils/spec-files.d.ts +7 -20
  408. package/dist/utils/spec-files.d.ts.map +1 -1
  409. package/dist/utils/spec-files.js +26 -51
  410. package/dist/utils/spec-files.js.map +1 -1
  411. package/dist/utils/task-progress.d.ts +11 -9
  412. package/dist/utils/task-progress.d.ts.map +1 -1
  413. package/dist/utils/task-progress.js +53 -32
  414. package/dist/utils/task-progress.js.map +1 -1
  415. package/dist/utils/timestamp.d.ts +5 -8
  416. package/dist/utils/timestamp.d.ts.map +1 -1
  417. package/dist/utils/timestamp.js +5 -8
  418. package/dist/utils/timestamp.js.map +1 -1
  419. package/package.json +2 -3
  420. package/schemas/issue/schema.yaml +8 -1
  421. package/schemas/issue/templates/spec.md +20 -3
  422. package/schemas/sdd/schema.yaml +20 -1
  423. package/schemas/sdd/templates/spec.md +20 -3
@@ -3,17 +3,12 @@ import path from 'path';
3
3
  import { frontmatterString } from './frontmatter.js';
4
4
  /**
5
5
  * Every ticket in the active `tospec/tickets/` index whose frontmatter `change:`
6
- * names this change, sorted by filename — which is the `yyyyMMdd_HHmmss` stamp,
7
- * so oldest first. Scans only the active folder (non-recursive), so archived
8
- * tickets under `tickets/archive/` are excluded.
6
+ * names this change, oldest first (the filename is the `yyyyMMdd_HHmmss` stamp).
7
+ * Non-recursive, so `tickets/archive/` is excluded.
9
8
  *
10
- * Plural because the index can hold more than one: a change abandoned with
11
- * `rm -rf` leaves its ticket behind, and recreating the change under the same
12
- * name used to add a second (round 4 report 6). Callers that can report the
13
- * ambiguity should; `findTicketPath` picks for those that cannot.
14
- *
15
- * Limitation: linear scan of tickets/; fine at repo scale (one ticket per change).
16
- * Add an index if a project ever accumulates thousands of active changes.
9
+ * Plural because the index can hold more than one: `rm -rf` on a change leaves
10
+ * its ticket behind, and recreating the name adds a second. Callers that can
11
+ * report the ambiguity should; `findTicketPath` picks for the rest.
17
12
  */
18
13
  export async function findTicketPaths(root, changeName) {
19
14
  const ticketsPath = path.join(root, 'tospec', 'tickets');
@@ -41,29 +36,20 @@ export async function findTicketPaths(root, changeName) {
41
36
  return matches.sort((a, b) => path.basename(a).localeCompare(path.basename(b)));
42
37
  }
43
38
  /**
44
- * The ticket to treat as this change's, when there is more than one.
45
- *
46
39
  * The newest wins: a second ticket exists because the change was recreated, so
47
- * the later stamp is the one that describes the change on disk. Taking the
48
- * first `readdir` entry instead meant archive filed the run under a ticket
49
- * belonging to the abandoned attempt and left the real one stranded in the
50
- * active list forever (round 4 report 6).
40
+ * the later stamp describes the change on disk. Taking the first `readdir` entry
41
+ * files the run under the abandoned attempt's ticket.
51
42
  */
52
43
  export async function findTicketPath(root, changeName) {
53
44
  const matches = await findTicketPaths(root, changeName);
54
45
  return matches.length === 0 ? undefined : matches[matches.length - 1];
55
46
  }
56
- /**
57
- * Active change directory names under `changesDir`, sorted, excluding `archive`
58
- * and dot-directories. The one rule for "which changes exist": list, archive
59
- * and status each filtered slightly differently, so a stray `.tmp/` showed up
60
- * in some listings and not others.
61
- */
62
- export async function listActiveChangeDirs(changesDir) {
47
+ /** Sorted names of the non-dot subdirectories of `dir`; [] when it cannot be read. */
48
+ async function listSubdirectories(dir) {
63
49
  try {
64
- const entries = await fs.readdir(changesDir, { withFileTypes: true });
50
+ const entries = await fs.readdir(dir, { withFileTypes: true });
65
51
  return entries
66
- .filter((entry) => entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'archive')
52
+ .filter((entry) => entry.isDirectory() && !entry.name.startsWith('.'))
67
53
  .map((entry) => entry.name)
68
54
  .sort();
69
55
  }
@@ -71,43 +57,33 @@ export async function listActiveChangeDirs(changesDir) {
71
57
  return [];
72
58
  }
73
59
  }
60
+ /**
61
+ * The one rule for "which changes exist". Filtered separately per command, a
62
+ * stray `.tmp/` shows up in some listings and not others.
63
+ */
64
+ export async function listActiveChangeDirs(changesDir) {
65
+ const names = await listSubdirectories(changesDir);
66
+ return names.filter((name) => name !== 'archive');
67
+ }
74
68
  export async function getActiveChangeIds(root = process.cwd()) {
75
69
  return listActiveChangeDirs(path.join(root, 'tospec', 'changes'));
76
70
  }
71
+ /** A capability directory counts as a spec only once it holds a `spec.md`. */
77
72
  export async function getSpecIds(root = process.cwd()) {
78
73
  const specsPath = path.join(root, 'tospec', 'specs');
79
- const result = [];
80
- try {
81
- const entries = await fs.readdir(specsPath, { withFileTypes: true });
82
- for (const entry of entries) {
83
- if (!entry.isDirectory() || entry.name.startsWith('.'))
84
- continue;
85
- const specFile = path.join(specsPath, entry.name, 'spec.md');
86
- try {
87
- await fs.access(specFile);
88
- result.push(entry.name);
89
- }
90
- catch {
91
- // ignore
92
- }
74
+ const names = await listSubdirectories(specsPath);
75
+ const present = await Promise.all(names.map(async (name) => {
76
+ try {
77
+ await fs.access(path.join(specsPath, name, 'spec.md'));
78
+ return name;
93
79
  }
94
- }
95
- catch {
96
- // ignore
97
- }
98
- return result.sort();
80
+ catch {
81
+ return null;
82
+ }
83
+ }));
84
+ return present.filter((name) => name !== null);
99
85
  }
100
86
  export async function getArchivedChangeIds(root = process.cwd()) {
101
- const archivePath = path.join(root, 'tospec', 'changes', 'archive');
102
- try {
103
- const entries = await fs.readdir(archivePath, { withFileTypes: true });
104
- return entries
105
- .filter((entry) => entry.isDirectory() && !entry.name.startsWith('.'))
106
- .map((entry) => entry.name)
107
- .sort();
108
- }
109
- catch {
110
- return [];
111
- }
87
+ return listSubdirectories(path.join(root, 'tospec', 'changes', 'archive'));
112
88
  }
113
89
  //# sourceMappingURL=item-discovery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"item-discovery.js","sourceRoot":"","sources":["../../src/utils/item-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,UAAkB;IACpE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACjD,IAAI,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,UAAU;gBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9E,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY,EAAE,UAAkB;IACnE,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACxD,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACxE,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,UAAkB;IAC3D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtE,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;aACjG,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aAC1B,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAI,GAAW,OAAO,CAAC,GAAG,EAAE;IACnE,OAAO,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAI,GAAW,OAAO,CAAC,GAAG,EAAE;IAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC7D,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAI,GAAW,OAAO,CAAC,GAAG,EAAE;IACrE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aACrE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;aAC1B,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"item-discovery.js","sourceRoot":"","sources":["../../src/utils/item-discovery.ts"],"names":[],"mappings":"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"}
@@ -1,26 +1,17 @@
1
1
  /**
2
2
  * How init/update deliver skill dirs from the canonical `.agents/skills/` into
3
- * each dependent tool's directory.
4
- *
5
- * Copying, deliberately, and not a link of any kind — see
6
- * tospec/decisions/20260914_205300-copy-dependent-skill-dirs-for-cross-platform-teams.md.
7
- * A link has no cross-platform spelling: Windows needs a junction (git walks
8
- * through it and records ordinary files) while POSIX gets a symlink (git records
9
- * mode 120000 holding the target path). A repository that commits its generated
10
- * skills therefore ends up with tracked content that depends on which OS last
11
- * ran the command, and a 120000 blob checked out with `core.symlinks=false`
12
- * becomes a text file where a skill directory belongs, loading nothing. Live
13
- * edit propagation is not worth a mixed-platform team trading diffs over it.
3
+ * each dependent tool's directory: a copy, never a link. A link has no
4
+ * cross-platform spelling (Windows junction vs POSIX symlink record differently
5
+ * in git), so a repo committing its generated skills would track content that
6
+ * depends on which OS last ran the command.
7
+ * tospec/decisions/20260914_205300-copy-dependent-skill-dirs-for-cross-platform-teams.md
14
8
  */
15
9
  /**
16
10
  * Recursively copies a directory, replacing any existing dest. The `rm` first
17
- * is what makes it a replace rather than a merge: `cp` alone would leave
18
- * files that the source no longer generates.
19
- *
20
- * It is also the migration off the link era: `fs.rm(recursive)` on a junction or
21
- * symlink unlinks it and leaves the target intact, so a project whose tool dirs
22
- * are still links becomes plain copies on the next `tospec update`, with no
23
- * separate migration step and no risk to the canonical directory.
11
+ * makes it a replace rather than a merge, since `cp` alone leaves files the
12
+ * source no longer generates. It is also the migration off the link era:
13
+ * `fs.rm(recursive)` on a junction or symlink unlinks it and leaves the target
14
+ * intact, so link-based tool dirs become plain copies on the next update.
24
15
  */
25
16
  export declare function copyDir(src: string, dest: string): Promise<void>;
26
17
  //# sourceMappingURL=link.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/utils/link.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH;;;;;;;;;GASG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtE"}
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../src/utils/link.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;GAMG;AACH,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGtE"}
@@ -1,27 +1,18 @@
1
1
  /**
2
2
  * How init/update deliver skill dirs from the canonical `.agents/skills/` into
3
- * each dependent tool's directory.
4
- *
5
- * Copying, deliberately, and not a link of any kind — see
6
- * tospec/decisions/20260914_205300-copy-dependent-skill-dirs-for-cross-platform-teams.md.
7
- * A link has no cross-platform spelling: Windows needs a junction (git walks
8
- * through it and records ordinary files) while POSIX gets a symlink (git records
9
- * mode 120000 holding the target path). A repository that commits its generated
10
- * skills therefore ends up with tracked content that depends on which OS last
11
- * ran the command, and a 120000 blob checked out with `core.symlinks=false`
12
- * becomes a text file where a skill directory belongs, loading nothing. Live
13
- * edit propagation is not worth a mixed-platform team trading diffs over it.
3
+ * each dependent tool's directory: a copy, never a link. A link has no
4
+ * cross-platform spelling (Windows junction vs POSIX symlink record differently
5
+ * in git), so a repo committing its generated skills would track content that
6
+ * depends on which OS last ran the command.
7
+ * tospec/decisions/20260914_205300-copy-dependent-skill-dirs-for-cross-platform-teams.md
14
8
  */
15
9
  import * as fs from 'node:fs';
16
10
  /**
17
11
  * Recursively copies a directory, replacing any existing dest. The `rm` first
18
- * is what makes it a replace rather than a merge: `cp` alone would leave
19
- * files that the source no longer generates.
20
- *
21
- * It is also the migration off the link era: `fs.rm(recursive)` on a junction or
22
- * symlink unlinks it and leaves the target intact, so a project whose tool dirs
23
- * are still links becomes plain copies on the next `tospec update`, with no
24
- * separate migration step and no risk to the canonical directory.
12
+ * makes it a replace rather than a merge, since `cp` alone leaves files the
13
+ * source no longer generates. It is also the migration off the link era:
14
+ * `fs.rm(recursive)` on a junction or symlink unlinks it and leaves the target
15
+ * intact, so link-based tool dirs become plain copies on the next update.
25
16
  */
26
17
  export async function copyDir(src, dest) {
27
18
  await fs.promises.rm(dest, { recursive: true, force: true });
@@ -1 +1 @@
1
- {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/utils/link.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,IAAY;IACrD,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/E,CAAC"}
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../src/utils/link.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,IAAY;IACrD,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/E,CAAC"}
@@ -1,10 +1,8 @@
1
1
  /**
2
- * Requirement-level diffing for `tospec show <change> --diff`.
3
- *
4
- * A delta spec says what changes but not what it changes *from*: a MODIFIED
5
- * block restates the whole requirement, so reading one tells you nothing about
6
- * which line moved. Pairing each block with its main-spec counterpart is the
7
- * only way to review a delta without opening two files side by side.
2
+ * Requirement-level diffing for `tospec show <change> --diff`. A MODIFIED block
3
+ * restates the whole requirement, so reading one says nothing about which line
4
+ * moved; pairing it with its main-spec counterpart makes a delta reviewable
5
+ * without opening two files side by side.
8
6
  */
9
7
  /** A main-spec requirement block, and how its header matched the delta's. */
10
8
  export interface MatchedRequirementBlock {
@@ -19,29 +17,21 @@ export interface MatchedRequirementBlock {
19
17
  exact: boolean;
20
18
  }
21
19
  /**
22
- * The raw markdown block for a requirement in a main spec, or null when no
23
- * header matches either way.
24
- *
25
- * Delegates to extractRequirementsSection(), which already handles code fences,
26
- * section boundaries and header parsing. Lookup is exact first, then the shared
27
- * case/whitespace fold, so a header that differs only in spelling still shows
28
- * its diff — flagged inexact rather than silently treated as a match.
20
+ * Null when no header matches either way. Exact lookup first, then the shared
21
+ * case/whitespace fold, so a header differing only in spelling still shows its diff
22
+ * — flagged inexact rather than silently treated as a match.
29
23
  */
30
24
  export declare function extractRequirementBlock(specContent: string, requirementName: string): MatchedRequirementBlock | null;
31
25
  /**
32
- * A unified diff between a main-spec requirement block and the delta block that
33
- * replaces it. A null main block diffs against the empty string, so every line
34
- * reads as an addition.
35
- *
36
- * structuredPatch keeps the unified hunk ranges; the synthetic file headers are
37
- * omitted because the caller labels the block itself.
26
+ * A unified diff between a main-spec requirement block and the delta block replacing
27
+ * it. A null main block diffs against the empty string, so every line reads as an
28
+ * addition. File headers are omitted because the caller labels the block itself.
38
29
  */
39
30
  export declare function diffRequirementBlock(baseBlock: string | null, deltaBlock: string, label: string): string;
40
31
  /**
41
- * Maps a RENAMED TO name (folded) back to the original main-spec name.
42
- *
43
- * Renames apply in source order, so a chain A -> B -> C maps C back to A — the
44
- * block a later MODIFIED C actually replaces in the main spec.
32
+ * Maps a RENAMED TO name (folded) back to the original main-spec name. Renames apply
33
+ * in source order, so a chain A -> B -> C maps C back to A: the block a later
34
+ * MODIFIED C actually replaces.
45
35
  */
46
36
  export declare function buildRenameMap(renames: Array<{
47
37
  from: string;
@@ -1 +1 @@
1
- {"version":3,"file":"requirement-diff.d.ts","sourceRoot":"","sources":["../../src/utils/requirement-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,6EAA6E;AAC7E,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,GACtB,uBAAuB,GAAG,IAAI,CAiBhC;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,MAAM,CAMR;AAMD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAShG"}
1
+ {"version":3,"file":"requirement-diff.d.ts","sourceRoot":"","sources":["../../src/utils/requirement-diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,6EAA6E;AAC7E,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,GACtB,uBAAuB,GAAG,IAAI,CAiBhC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,GACZ,MAAM,CAMR;AAMD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAShG"}
@@ -1,21 +1,15 @@
1
1
  /**
2
- * Requirement-level diffing for `tospec show <change> --diff`.
3
- *
4
- * A delta spec says what changes but not what it changes *from*: a MODIFIED
5
- * block restates the whole requirement, so reading one tells you nothing about
6
- * which line moved. Pairing each block with its main-spec counterpart is the
7
- * only way to review a delta without opening two files side by side.
2
+ * Requirement-level diffing for `tospec show <change> --diff`. A MODIFIED block
3
+ * restates the whole requirement, so reading one says nothing about which line
4
+ * moved; pairing it with its main-spec counterpart makes a delta reviewable
5
+ * without opening two files side by side.
8
6
  */
9
7
  import { formatPatch, OMIT_HEADERS, structuredPatch } from 'diff';
10
8
  import { extractRequirementsSection, foldRequirementName, normalizeRequirementName, } from '../core/parsers/requirement-blocks.js';
11
9
  /**
12
- * The raw markdown block for a requirement in a main spec, or null when no
13
- * header matches either way.
14
- *
15
- * Delegates to extractRequirementsSection(), which already handles code fences,
16
- * section boundaries and header parsing. Lookup is exact first, then the shared
17
- * case/whitespace fold, so a header that differs only in spelling still shows
18
- * its diff — flagged inexact rather than silently treated as a match.
10
+ * Null when no header matches either way. Exact lookup first, then the shared
11
+ * case/whitespace fold, so a header differing only in spelling still shows its diff
12
+ * — flagged inexact rather than silently treated as a match.
19
13
  */
20
14
  export function extractRequirementBlock(specContent, requirementName) {
21
15
  const parts = extractRequirementsSection(specContent);
@@ -34,12 +28,9 @@ export function extractRequirementBlock(specContent, requirementName) {
34
28
  return folded;
35
29
  }
36
30
  /**
37
- * A unified diff between a main-spec requirement block and the delta block that
38
- * replaces it. A null main block diffs against the empty string, so every line
39
- * reads as an addition.
40
- *
41
- * structuredPatch keeps the unified hunk ranges; the synthetic file headers are
42
- * omitted because the caller labels the block itself.
31
+ * A unified diff between a main-spec requirement block and the delta block replacing
32
+ * it. A null main block diffs against the empty string, so every line reads as an
33
+ * addition. File headers are omitted because the caller labels the block itself.
43
34
  */
44
35
  export function diffRequirementBlock(baseBlock, deltaBlock, label) {
45
36
  const base = ensureTrailingNewline(baseBlock ?? '');
@@ -51,10 +42,9 @@ function ensureTrailingNewline(s) {
51
42
  return s.endsWith('\n') ? s : s + '\n';
52
43
  }
53
44
  /**
54
- * Maps a RENAMED TO name (folded) back to the original main-spec name.
55
- *
56
- * Renames apply in source order, so a chain A -> B -> C maps C back to A — the
57
- * block a later MODIFIED C actually replaces in the main spec.
45
+ * Maps a RENAMED TO name (folded) back to the original main-spec name. Renames apply
46
+ * in source order, so a chain A -> B -> C maps C back to A: the block a later
47
+ * MODIFIED C actually replaces.
58
48
  */
59
49
  export function buildRenameMap(renames) {
60
50
  const map = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"requirement-diff.js","sourceRoot":"","sources":["../../src/utils/requirement-diff.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAClE,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,uCAAuC,CAAC;AAe/C;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAAmB,EACnB,eAAuB;IAEvB,MAAM,KAAK,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,MAAM,GAAmC,IAAI,CAAC;IAElD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,YAAY,EAAE,CAAC;YAC1D,MAAM,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAwB,EACxB,UAAkB,EAClB,KAAa;IAEb,MAAM,IAAI,GAAG,qBAAqB,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAEzD,OAAO,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,qBAAqB,CAAC,CAAS;IACtC,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAA4C;IACzE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjB,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"requirement-diff.js","sourceRoot":"","sources":["../../src/utils/requirement-diff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAClE,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,uCAAuC,CAAC;AAe/C;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAAmB,EACnB,eAAuB;IAEvB,MAAM,KAAK,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,wBAAwB,CAAC,eAAe,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACrD,IAAI,MAAM,GAAmC,IAAI,CAAC;IAElD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,mBAAmB,CAAC,IAAI,CAAC,KAAK,YAAY,EAAE,CAAC;YAC1D,MAAM,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAwB,EACxB,UAAkB,EAClB,KAAa;IAEb,MAAM,IAAI,GAAG,qBAAqB,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAEzD,OAAO,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,qBAAqB,CAAC,CAAS;IACtC,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAA4C;IACzE,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjB,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,31 +1,18 @@
1
1
  /**
2
2
  * Every `spec.md` under a change's `specs/` directory, at any depth.
3
3
  *
4
- * Deliberately recursive even though the supported layout is exactly
4
+ * Recursive even though the supported layout is exactly
5
5
  * `specs/<capability>/spec.md`: the merge path reads one level, so anything
6
- * deeper is a file that would be applied by nobody. Finding it is what lets the
7
- * validator report it and archive refuse — the original defect was that the
8
- * merge path and the discovery path each answered "is there a delta spec here"
9
- * on their own, and disagreed silently.
10
- *
11
- * Shared so that answer has exactly one definition. See
6
+ * deeper would be applied by nobody, and finding it lets the validator report it
7
+ * and archive refuse.
12
8
  * tospec/decisions/20260730_014309-delta-spec-layout-one-level.md
13
- *
14
- * Returns absolute paths, sorted by code point for deterministic issue ordering
15
- * (not localeCompare — that follows the process ICU locale and would order
16
- * differently on CI than locally).
17
9
  */
18
10
  export declare function findSpecFiles(specsDir: string): Promise<string[]>;
19
11
  /**
20
- * Every `*.md` under a change's `specs/` directory, at any depth — unlike
21
- * {@link findSpecFiles}, basename is not filtered.
22
- *
23
- * Exists so the validator can see the same misplacement class it already
24
- * catches (wrong depth, dot-directory) when the mistake is a wrong *basename*
25
- * instead: `specs/<capability>/spec.md`'s wrong-basename sibling is invisible
26
- * to `findSpecFiles`, which drops it before any guard loop runs. The merge
27
- * path (`findSpecUpdates`) must keep reading only `spec.md` — this walker is
28
- * for validation to report the file, not for merge to read it.
12
+ * Every `*.md` under a change's `specs/` directory, at any depth. Unlike
13
+ * {@link findSpecFiles} the basename is not filtered, so the validator can
14
+ * report a file whose mistake is a wrong *basename*. The merge path
15
+ * (`findSpecUpdates`) must keep reading only `spec.md`.
29
16
  */
30
17
  export declare function findAllMarkdownFiles(specsDir: string): Promise<string[]>;
31
18
  //# sourceMappingURL=spec-files.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spec-files.d.ts","sourceRoot":"","sources":["../../src/utils/spec-files.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBvE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsB9E"}
1
+ {"version":3,"file":"spec-files.d.ts","sourceRoot":"","sources":["../../src/utils/spec-files.ts"],"names":[],"mappings":"AAiCA;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAEvE;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE9E"}
@@ -1,78 +1,53 @@
1
1
  import { promises as fs } from 'node:fs';
2
2
  import path from 'node:path';
3
3
  /**
4
- * Every `spec.md` under a change's `specs/` directory, at any depth.
5
- *
6
- * Deliberately recursive even though the supported layout is exactly
7
- * `specs/<capability>/spec.md`: the merge path reads one level, so anything
8
- * deeper is a file that would be applied by nobody. Finding it is what lets the
9
- * validator report it and archive refuse — the original defect was that the
10
- * merge path and the discovery path each answered "is there a delta spec here"
11
- * on their own, and disagreed silently.
12
- *
13
- * Shared so that answer has exactly one definition. See
14
- * tospec/decisions/20260730_014309-delta-spec-layout-one-level.md
15
- *
16
- * Returns absolute paths, sorted by code point for deterministic issue ordering
17
- * (not localeCompare — that follows the process ICU locale and would order
18
- * differently on CI than locally).
4
+ * Absolute paths of every accepted file under `dir`, at any depth, sorted by
5
+ * code point — not localeCompare, which follows the process ICU locale and
6
+ * would order issues differently on CI than locally. A missing or unreadable
7
+ * directory means "no files".
19
8
  */
20
- export async function findSpecFiles(specsDir) {
9
+ async function findFiles(dir, accept) {
21
10
  const results = [];
22
- const walk = async (dir) => {
11
+ const walk = async (current) => {
23
12
  let entries;
24
13
  try {
25
- entries = await fs.readdir(dir, { withFileTypes: true });
14
+ entries = await fs.readdir(current, { withFileTypes: true });
26
15
  }
27
16
  catch {
28
- // A missing or unreadable specs/ means "no delta specs" to every caller.
29
17
  return;
30
18
  }
31
19
  for (const entry of entries) {
32
- const full = path.join(dir, entry.name);
20
+ const full = path.join(current, entry.name);
33
21
  if (entry.isDirectory()) {
34
22
  await walk(full);
35
23
  }
36
- else if (entry.isFile() && entry.name === 'spec.md') {
24
+ else if (entry.isFile() && accept(entry.name)) {
37
25
  results.push(full);
38
26
  }
39
27
  }
40
28
  };
41
- await walk(specsDir);
29
+ await walk(dir);
42
30
  return results.sort();
43
31
  }
44
32
  /**
45
- * Every `*.md` under a change's `specs/` directory, at any depth — unlike
46
- * {@link findSpecFiles}, basename is not filtered.
33
+ * Every `spec.md` under a change's `specs/` directory, at any depth.
47
34
  *
48
- * Exists so the validator can see the same misplacement class it already
49
- * catches (wrong depth, dot-directory) when the mistake is a wrong *basename*
50
- * instead: `specs/<capability>/spec.md`'s wrong-basename sibling is invisible
51
- * to `findSpecFiles`, which drops it before any guard loop runs. The merge
52
- * path (`findSpecUpdates`) must keep reading only `spec.md` — this walker is
53
- * for validation to report the file, not for merge to read it.
35
+ * Recursive even though the supported layout is exactly
36
+ * `specs/<capability>/spec.md`: the merge path reads one level, so anything
37
+ * deeper would be applied by nobody, and finding it lets the validator report it
38
+ * and archive refuse.
39
+ * tospec/decisions/20260730_014309-delta-spec-layout-one-level.md
40
+ */
41
+ export async function findSpecFiles(specsDir) {
42
+ return findFiles(specsDir, (name) => name === 'spec.md');
43
+ }
44
+ /**
45
+ * Every `*.md` under a change's `specs/` directory, at any depth. Unlike
46
+ * {@link findSpecFiles} the basename is not filtered, so the validator can
47
+ * report a file whose mistake is a wrong *basename*. The merge path
48
+ * (`findSpecUpdates`) must keep reading only `spec.md`.
54
49
  */
55
50
  export async function findAllMarkdownFiles(specsDir) {
56
- const results = [];
57
- const walk = async (dir) => {
58
- let entries;
59
- try {
60
- entries = await fs.readdir(dir, { withFileTypes: true });
61
- }
62
- catch {
63
- return;
64
- }
65
- for (const entry of entries) {
66
- const full = path.join(dir, entry.name);
67
- if (entry.isDirectory()) {
68
- await walk(full);
69
- }
70
- else if (entry.isFile() && entry.name.toLowerCase().endsWith('.md')) {
71
- results.push(full);
72
- }
73
- }
74
- };
75
- await walk(specsDir);
76
- return results.sort();
51
+ return findFiles(specsDir, (name) => name.toLowerCase().endsWith('.md'));
77
52
  }
78
53
  //# sourceMappingURL=spec-files.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spec-files.js","sourceRoot":"","sources":["../../src/utils/spec-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,IAAI,GAAG,KAAK,EAAE,GAAW,EAAiB,EAAE;QAChD,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,yEAAyE;YACzE,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB;IACzD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,IAAI,GAAG,KAAK,EAAE,GAAW,EAAiB,EAAE;QAChD,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACxC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"spec-files.js","sourceRoot":"","sources":["../../src/utils/spec-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;GAKG;AACH,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,MAAiC;IACrE,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,IAAI,GAAG,KAAK,EAAE,OAAe,EAAiB,EAAE;QACpD,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB;IAClD,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,QAAgB;IACzD,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3E,CAAC"}
@@ -13,18 +13,14 @@ export interface TaskItem extends ParsedTask {
13
13
  }
14
14
  export declare function parseTasksFromContent(content: string): ParsedTask[];
15
15
  /**
16
- * Absolute paths of the files holding a change's tracked tasks: every file
17
- * matched by the tracked-tasks artifact's `generates` glob — the same
18
- * file-resolution `tospec status` uses (`resolveArtifactOutputs`) — so tasks are
19
- * no longer blind to nested `tasks.md` files (#1202). Falls back to a single
20
- * top-level `tasks.md` when the schema is unresolvable, no tracked-tasks
21
- * artifact is found, or the glob matches no file.
16
+ * Absolute paths of the files holding a change's tracked tasks, through the same
17
+ * `resolveArtifactOutputs` glob resolution `tospec status` uses. Falls back to a
18
+ * single top-level `tasks.md` when nothing resolves.
22
19
  */
23
20
  export declare function resolveTaskFiles(changeDir: string, projectRoot: string): string[];
24
21
  /**
25
- * Lists every task of a change, in file order. Files that can't be read (absent
26
- * `tasks.md`, or vanished between glob and read) contribute nothing rather than
27
- * throwing.
22
+ * Every task of a change, in file order. Files that cannot be read contribute
23
+ * nothing rather than throwing.
28
24
  */
29
25
  export declare function listTasksForChange(changesDir: string, changeName: string, projectRoot: string): Promise<TaskItem[]>;
30
26
  /** Computes a change's task progress across its tracked task files. Never throws. */
@@ -36,5 +32,11 @@ export declare function getTaskProgressForChange(changesDir: string, changeName:
36
32
  * 409, which is what a stale client sees when the file moved under it.
37
33
  */
38
34
  export declare function setTaskDone(file: string, line: number, done: boolean): Promise<void>;
35
+ /**
36
+ * "Tasks done", not "Complete": this counts checkboxes, while `tospec status`
37
+ * answers whether the change's artifacts exist. A change with only a finished
38
+ * `tasks.md` read as `✓ Complete` in `list` and `1/4 artifacts complete` in
39
+ * `status`, and the word was what made them look contradictory.
40
+ */
39
41
  export declare function formatTaskStatus(progress: TaskProgress): string;
40
42
  //# sourceMappingURL=task-progress.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"task-progress.d.ts","sourceRoot":"","sources":["../../src/utils/task-progress.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAS,SAAQ,UAAU;IAC1C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAanE;AAgCD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAOjF;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAarB;AAED,qFAAqF;AACrF,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAGvB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1F;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAI/D"}
1
+ {"version":3,"file":"task-progress.d.ts","sourceRoot":"","sources":["../../src/utils/task-progress.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAS,SAAQ,UAAU;IAC1C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAoBnE;AA8BD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAOjF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAarB;AAED,qFAAqF;AACrF,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAGvB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAkB1F;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAI/D"}