@seanmars/tospec 0.19.0-beta.7 → 0.20.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 (429) hide show
  1. package/CHANGELOG.md +60 -231
  2. package/README.md +69 -82
  3. package/assets/dashboard/app.js +14 -3
  4. package/assets/dashboard/style.css +7 -0
  5. package/assets/rules/tospec/decision.md +3 -0
  6. package/dist/cli/index.d.ts.map +1 -1
  7. package/dist/cli/index.js +227 -86
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/commands/config.d.ts +9 -17
  10. package/dist/commands/config.d.ts.map +1 -1
  11. package/dist/commands/config.js +366 -107
  12. package/dist/commands/config.js.map +1 -1
  13. package/dist/commands/dashboard.d.ts +57 -99
  14. package/dist/commands/dashboard.d.ts.map +1 -1
  15. package/dist/commands/dashboard.js +224 -282
  16. package/dist/commands/dashboard.js.map +1 -1
  17. package/dist/commands/decision.d.ts +41 -19
  18. package/dist/commands/decision.d.ts.map +1 -1
  19. package/dist/commands/decision.js +385 -79
  20. package/dist/commands/decision.js.map +1 -1
  21. package/dist/commands/metrics.d.ts +28 -51
  22. package/dist/commands/metrics.d.ts.map +1 -1
  23. package/dist/commands/metrics.js +62 -93
  24. package/dist/commands/metrics.js.map +1 -1
  25. package/dist/commands/shared-output.d.ts +18 -21
  26. package/dist/commands/shared-output.d.ts.map +1 -1
  27. package/dist/commands/shared-output.js +49 -23
  28. package/dist/commands/shared-output.js.map +1 -1
  29. package/dist/commands/show.d.ts +7 -0
  30. package/dist/commands/show.d.ts.map +1 -1
  31. package/dist/commands/show.js +29 -7
  32. package/dist/commands/show.js.map +1 -1
  33. package/dist/commands/validate.d.ts +43 -45
  34. package/dist/commands/validate.d.ts.map +1 -1
  35. package/dist/commands/validate.js +262 -129
  36. package/dist/commands/validate.js.map +1 -1
  37. package/dist/commands/workflow/index.d.ts +6 -10
  38. package/dist/commands/workflow/index.d.ts.map +1 -1
  39. package/dist/commands/workflow/index.js +6 -10
  40. package/dist/commands/workflow/index.js.map +1 -1
  41. package/dist/commands/workflow/instructions.d.ts +21 -8
  42. package/dist/commands/workflow/instructions.d.ts.map +1 -1
  43. package/dist/commands/workflow/instructions.js +254 -95
  44. package/dist/commands/workflow/instructions.js.map +1 -1
  45. package/dist/commands/workflow/new-change.d.ts +4 -5
  46. package/dist/commands/workflow/new-change.d.ts.map +1 -1
  47. package/dist/commands/workflow/new-change.js +90 -25
  48. package/dist/commands/workflow/new-change.js.map +1 -1
  49. package/dist/commands/workflow/schemas.d.ts +3 -5
  50. package/dist/commands/workflow/schemas.d.ts.map +1 -1
  51. package/dist/commands/workflow/schemas.js +37 -11
  52. package/dist/commands/workflow/schemas.js.map +1 -1
  53. package/dist/commands/workflow/shared.d.ts +48 -21
  54. package/dist/commands/workflow/shared.d.ts.map +1 -1
  55. package/dist/commands/workflow/shared.js +36 -33
  56. package/dist/commands/workflow/shared.js.map +1 -1
  57. package/dist/commands/workflow/status.d.ts +10 -6
  58. package/dist/commands/workflow/status.d.ts.map +1 -1
  59. package/dist/commands/workflow/status.js +81 -42
  60. package/dist/commands/workflow/status.js.map +1 -1
  61. package/dist/commands/workflow/templates.d.ts +10 -3
  62. package/dist/commands/workflow/templates.d.ts.map +1 -1
  63. package/dist/commands/workflow/templates.js +39 -40
  64. package/dist/commands/workflow/templates.js.map +1 -1
  65. package/dist/core/archive.d.ts +26 -21
  66. package/dist/core/archive.d.ts.map +1 -1
  67. package/dist/core/archive.js +378 -235
  68. package/dist/core/archive.js.map +1 -1
  69. package/dist/core/artifact-graph/graph.d.ts +25 -42
  70. package/dist/core/artifact-graph/graph.d.ts.map +1 -1
  71. package/dist/core/artifact-graph/graph.js +45 -63
  72. package/dist/core/artifact-graph/graph.js.map +1 -1
  73. package/dist/core/artifact-graph/index.d.ts +1 -1
  74. package/dist/core/artifact-graph/index.d.ts.map +1 -1
  75. package/dist/core/artifact-graph/index.js +1 -1
  76. package/dist/core/artifact-graph/index.js.map +1 -1
  77. package/dist/core/artifact-graph/instruction-loader.d.ts +97 -103
  78. package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -1
  79. package/dist/core/artifact-graph/instruction-loader.js +146 -119
  80. package/dist/core/artifact-graph/instruction-loader.js.map +1 -1
  81. package/dist/core/artifact-graph/outputs.d.ts +9 -23
  82. package/dist/core/artifact-graph/outputs.d.ts.map +1 -1
  83. package/dist/core/artifact-graph/outputs.js +45 -38
  84. package/dist/core/artifact-graph/outputs.js.map +1 -1
  85. package/dist/core/artifact-graph/resolver.d.ts +44 -63
  86. package/dist/core/artifact-graph/resolver.d.ts.map +1 -1
  87. package/dist/core/artifact-graph/resolver.js +85 -86
  88. package/dist/core/artifact-graph/resolver.js.map +1 -1
  89. package/dist/core/artifact-graph/schema.d.ts +0 -6
  90. package/dist/core/artifact-graph/schema.d.ts.map +1 -1
  91. package/dist/core/artifact-graph/schema.js +7 -32
  92. package/dist/core/artifact-graph/schema.js.map +1 -1
  93. package/dist/core/artifact-graph/state.d.ts +1 -8
  94. package/dist/core/artifact-graph/state.d.ts.map +1 -1
  95. package/dist/core/artifact-graph/state.js +2 -17
  96. package/dist/core/artifact-graph/state.js.map +1 -1
  97. package/dist/core/artifact-graph/stub-detection.d.ts +12 -0
  98. package/dist/core/artifact-graph/stub-detection.d.ts.map +1 -0
  99. package/dist/core/artifact-graph/stub-detection.js +39 -0
  100. package/dist/core/artifact-graph/stub-detection.js.map +1 -0
  101. package/dist/core/artifact-graph/types.d.ts +4 -0
  102. package/dist/core/artifact-graph/types.d.ts.map +1 -1
  103. package/dist/core/artifact-graph/types.js +30 -10
  104. package/dist/core/artifact-graph/types.js.map +1 -1
  105. package/dist/core/available-tools.d.ts +3 -12
  106. package/dist/core/available-tools.d.ts.map +1 -1
  107. package/dist/core/available-tools.js +4 -13
  108. package/dist/core/available-tools.js.map +1 -1
  109. package/dist/core/change-metadata/schema.d.ts +1 -1
  110. package/dist/core/change-metadata/schema.d.ts.map +1 -1
  111. package/dist/core/change-metadata/schema.js +10 -7
  112. package/dist/core/change-metadata/schema.js.map +1 -1
  113. package/dist/core/change-presenter.d.ts +23 -18
  114. package/dist/core/change-presenter.d.ts.map +1 -1
  115. package/dist/core/change-presenter.js +102 -43
  116. package/dist/core/change-presenter.js.map +1 -1
  117. package/dist/core/change-status-policy.d.ts +8 -1
  118. package/dist/core/change-status-policy.d.ts.map +1 -1
  119. package/dist/core/change-status-policy.js +25 -1
  120. package/dist/core/change-status-policy.js.map +1 -1
  121. package/dist/core/codex-metrics.d.ts +25 -45
  122. package/dist/core/codex-metrics.d.ts.map +1 -1
  123. package/dist/core/codex-metrics.js +44 -88
  124. package/dist/core/codex-metrics.js.map +1 -1
  125. package/dist/core/codex-residue.d.ts +14 -15
  126. package/dist/core/codex-residue.d.ts.map +1 -1
  127. package/dist/core/codex-residue.js +18 -22
  128. package/dist/core/codex-residue.js.map +1 -1
  129. package/dist/core/command-generation/adapters/claude.d.ts +2 -9
  130. package/dist/core/command-generation/adapters/claude.d.ts.map +1 -1
  131. package/dist/core/command-generation/adapters/claude.js +2 -12
  132. package/dist/core/command-generation/adapters/claude.js.map +1 -1
  133. package/dist/core/command-generation/adapters/index.d.ts +1 -9
  134. package/dist/core/command-generation/adapters/index.d.ts.map +1 -1
  135. package/dist/core/command-generation/adapters/index.js +1 -9
  136. package/dist/core/command-generation/adapters/index.js.map +1 -1
  137. package/dist/core/command-generation/generator.d.ts +0 -17
  138. package/dist/core/command-generation/generator.d.ts.map +1 -1
  139. package/dist/core/command-generation/generator.js +0 -17
  140. package/dist/core/command-generation/generator.js.map +1 -1
  141. package/dist/core/command-generation/index.d.ts +2 -5
  142. package/dist/core/command-generation/index.d.ts.map +1 -1
  143. package/dist/core/command-generation/index.js +0 -9
  144. package/dist/core/command-generation/index.js.map +1 -1
  145. package/dist/core/command-generation/types.d.ts +10 -36
  146. package/dist/core/command-generation/types.d.ts.map +1 -1
  147. package/dist/core/command-generation/types.js +0 -6
  148. package/dist/core/command-generation/types.js.map +1 -1
  149. package/dist/core/command-generation/yaml.d.ts +3 -18
  150. package/dist/core/command-generation/yaml.d.ts.map +1 -1
  151. package/dist/core/command-generation/yaml.js +5 -23
  152. package/dist/core/command-generation/yaml.js.map +1 -1
  153. package/dist/core/config-prompts.d.ts +2 -4
  154. package/dist/core/config-prompts.d.ts.map +1 -1
  155. package/dist/core/config-prompts.js +2 -7
  156. package/dist/core/config-prompts.js.map +1 -1
  157. package/dist/core/config-schema.d.ts +8 -53
  158. package/dist/core/config-schema.d.ts.map +1 -1
  159. package/dist/core/config-schema.js +49 -62
  160. package/dist/core/config-schema.js.map +1 -1
  161. package/dist/core/config.d.ts +39 -26
  162. package/dist/core/config.d.ts.map +1 -1
  163. package/dist/core/config.js +36 -22
  164. package/dist/core/config.js.map +1 -1
  165. package/dist/core/dashboard-activity.d.ts +7 -9
  166. package/dist/core/dashboard-activity.d.ts.map +1 -1
  167. package/dist/core/dashboard-activity.js +26 -24
  168. package/dist/core/dashboard-activity.js.map +1 -1
  169. package/dist/core/dashboard-data.d.ts +40 -22
  170. package/dist/core/dashboard-data.d.ts.map +1 -1
  171. package/dist/core/dashboard-data.js +62 -70
  172. package/dist/core/dashboard-data.js.map +1 -1
  173. package/dist/core/global-config.d.ts +24 -53
  174. package/dist/core/global-config.d.ts.map +1 -1
  175. package/dist/core/global-config.js +38 -67
  176. package/dist/core/global-config.js.map +1 -1
  177. package/dist/core/init.d.ts +25 -19
  178. package/dist/core/init.d.ts.map +1 -1
  179. package/dist/core/init.js +168 -181
  180. package/dist/core/init.js.map +1 -1
  181. package/dist/core/list.d.ts +1 -1
  182. package/dist/core/list.d.ts.map +1 -1
  183. package/dist/core/list.js +121 -28
  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 +25 -0
  190. package/dist/core/markdown-render.d.ts.map +1 -0
  191. package/dist/core/markdown-render.js +94 -0
  192. package/dist/core/markdown-render.js.map +1 -0
  193. package/dist/core/migrate.d.ts +29 -14
  194. package/dist/core/migrate.d.ts.map +1 -1
  195. package/dist/core/migrate.js +184 -122
  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 +31 -22
  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 +11 -7
  229. package/dist/core/root-selection.d.ts.map +1 -1
  230. package/dist/core/root-selection.js +7 -8
  231. package/dist/core/root-selection.js.map +1 -1
  232. package/dist/core/rules.d.ts +6 -1
  233. package/dist/core/rules.d.ts.map +1 -1
  234. package/dist/core/rules.js +23 -2
  235. package/dist/core/rules.js.map +1 -1
  236. package/dist/core/schema-names.d.ts +16 -0
  237. package/dist/core/schema-names.d.ts.map +1 -0
  238. package/dist/core/schema-names.js +16 -0
  239. package/dist/core/schema-names.js.map +1 -0
  240. package/dist/core/schemas/base.schema.d.ts +3 -0
  241. package/dist/core/schemas/base.schema.d.ts.map +1 -1
  242. package/dist/core/schemas/base.schema.js +22 -6
  243. package/dist/core/schemas/base.schema.js.map +1 -1
  244. package/dist/core/schemas/change.schema.d.ts +16 -0
  245. package/dist/core/schemas/change.schema.d.ts.map +1 -1
  246. package/dist/core/schemas/change.schema.js +41 -10
  247. package/dist/core/schemas/change.schema.js.map +1 -1
  248. package/dist/core/schemas/spec.schema.d.ts +2 -0
  249. package/dist/core/schemas/spec.schema.d.ts.map +1 -1
  250. package/dist/core/shared/index.d.ts +3 -8
  251. package/dist/core/shared/index.d.ts.map +1 -1
  252. package/dist/core/shared/index.js +3 -8
  253. package/dist/core/shared/index.js.map +1 -1
  254. package/dist/core/shared/rules-generation.d.ts +19 -8
  255. package/dist/core/shared/rules-generation.d.ts.map +1 -1
  256. package/dist/core/shared/rules-generation.js +117 -50
  257. package/dist/core/shared/rules-generation.js.map +1 -1
  258. package/dist/core/shared/skill-generation.d.ts +28 -43
  259. package/dist/core/shared/skill-generation.d.ts.map +1 -1
  260. package/dist/core/shared/skill-generation.js +82 -51
  261. package/dist/core/shared/skill-generation.js.map +1 -1
  262. package/dist/core/shared/tool-detection.d.ts +39 -61
  263. package/dist/core/shared/tool-detection.d.ts.map +1 -1
  264. package/dist/core/shared/tool-detection.js +88 -80
  265. package/dist/core/shared/tool-detection.js.map +1 -1
  266. package/dist/core/skill-metrics.d.ts +36 -63
  267. package/dist/core/skill-metrics.d.ts.map +1 -1
  268. package/dist/core/skill-metrics.js +34 -73
  269. package/dist/core/skill-metrics.js.map +1 -1
  270. package/dist/core/spec-presenter.js +6 -6
  271. package/dist/core/spec-presenter.js.map +1 -1
  272. package/dist/core/specs-apply.d.ts +22 -23
  273. package/dist/core/specs-apply.d.ts.map +1 -1
  274. package/dist/core/specs-apply.js +166 -193
  275. package/dist/core/specs-apply.js.map +1 -1
  276. package/dist/core/templates/fragments/interview.d.ts +2 -6
  277. package/dist/core/templates/fragments/interview.d.ts.map +1 -1
  278. package/dist/core/templates/fragments/interview.js +2 -6
  279. package/dist/core/templates/fragments/interview.js.map +1 -1
  280. package/dist/core/templates/fragments/next-step.d.ts +4 -8
  281. package/dist/core/templates/fragments/next-step.d.ts.map +1 -1
  282. package/dist/core/templates/fragments/next-step.js +4 -8
  283. package/dist/core/templates/fragments/next-step.js.map +1 -1
  284. package/dist/core/templates/fragments/validate.d.ts +13 -0
  285. package/dist/core/templates/fragments/validate.d.ts.map +1 -0
  286. package/dist/core/templates/fragments/validate.js +13 -0
  287. package/dist/core/templates/fragments/validate.js.map +1 -0
  288. package/dist/core/templates/fragments/verify.d.ts +9 -12
  289. package/dist/core/templates/fragments/verify.d.ts.map +1 -1
  290. package/dist/core/templates/fragments/verify.js +9 -12
  291. package/dist/core/templates/fragments/verify.js.map +1 -1
  292. package/dist/core/templates/index.d.ts +0 -6
  293. package/dist/core/templates/index.d.ts.map +1 -1
  294. package/dist/core/templates/index.js +0 -7
  295. package/dist/core/templates/index.js.map +1 -1
  296. package/dist/core/templates/skill-templates.d.ts +1 -5
  297. package/dist/core/templates/skill-templates.d.ts.map +1 -1
  298. package/dist/core/templates/skill-templates.js +0 -5
  299. package/dist/core/templates/skill-templates.js.map +1 -1
  300. package/dist/core/templates/types.d.ts +3 -7
  301. package/dist/core/templates/types.d.ts.map +1 -1
  302. package/dist/core/templates/types.js +0 -3
  303. package/dist/core/templates/types.js.map +1 -1
  304. package/dist/core/templates/workflows/apply.d.ts +3 -9
  305. package/dist/core/templates/workflows/apply.d.ts.map +1 -1
  306. package/dist/core/templates/workflows/apply.js +11 -13
  307. package/dist/core/templates/workflows/apply.js.map +1 -1
  308. package/dist/core/templates/workflows/archive.d.ts +0 -6
  309. package/dist/core/templates/workflows/archive.d.ts.map +1 -1
  310. package/dist/core/templates/workflows/archive.js +19 -6
  311. package/dist/core/templates/workflows/archive.js.map +1 -1
  312. package/dist/core/templates/workflows/decision.js +4 -4
  313. package/dist/core/templates/workflows/decision.js.map +1 -1
  314. package/dist/core/templates/workflows/explore.js +1 -1
  315. package/dist/core/templates/workflows/grill.d.ts.map +1 -1
  316. package/dist/core/templates/workflows/grill.js +0 -2
  317. package/dist/core/templates/workflows/grill.js.map +1 -1
  318. package/dist/core/templates/workflows/issue.d.ts +0 -6
  319. package/dist/core/templates/workflows/issue.d.ts.map +1 -1
  320. package/dist/core/templates/workflows/issue.js +3 -2
  321. package/dist/core/templates/workflows/issue.js.map +1 -1
  322. package/dist/core/templates/workflows/propose.d.ts +0 -6
  323. package/dist/core/templates/workflows/propose.d.ts.map +1 -1
  324. package/dist/core/templates/workflows/propose.js +2 -2
  325. package/dist/core/templates/workflows/propose.js.map +1 -1
  326. package/dist/core/templates/workflows/sync.d.ts +2 -8
  327. package/dist/core/templates/workflows/sync.d.ts.map +1 -1
  328. package/dist/core/templates/workflows/sync.js +4 -3
  329. package/dist/core/templates/workflows/sync.js.map +1 -1
  330. package/dist/core/templates/workflows/update.d.ts +0 -6
  331. package/dist/core/templates/workflows/update.d.ts.map +1 -1
  332. package/dist/core/templates/workflows/update.js +9 -2
  333. package/dist/core/templates/workflows/update.js.map +1 -1
  334. package/dist/core/update.d.ts +23 -23
  335. package/dist/core/update.d.ts.map +1 -1
  336. package/dist/core/update.js +139 -118
  337. package/dist/core/update.js.map +1 -1
  338. package/dist/core/user-state-migration.d.ts +13 -15
  339. package/dist/core/user-state-migration.d.ts.map +1 -1
  340. package/dist/core/user-state-migration.js +16 -20
  341. package/dist/core/user-state-migration.js.map +1 -1
  342. package/dist/core/validation/constants.d.ts +4 -10
  343. package/dist/core/validation/constants.d.ts.map +1 -1
  344. package/dist/core/validation/constants.js +25 -20
  345. package/dist/core/validation/constants.js.map +1 -1
  346. package/dist/core/validation/prose-length.d.ts +15 -0
  347. package/dist/core/validation/prose-length.d.ts.map +1 -0
  348. package/dist/core/validation/prose-length.js +29 -0
  349. package/dist/core/validation/prose-length.js.map +1 -0
  350. package/dist/core/validation/purpose-placeholder.d.ts +9 -16
  351. package/dist/core/validation/purpose-placeholder.d.ts.map +1 -1
  352. package/dist/core/validation/purpose-placeholder.js +30 -44
  353. package/dist/core/validation/purpose-placeholder.js.map +1 -1
  354. package/dist/core/validation/section-validator.d.ts +4 -4
  355. package/dist/core/validation/section-validator.d.ts.map +1 -1
  356. package/dist/core/validation/section-validator.js +43 -7
  357. package/dist/core/validation/section-validator.js.map +1 -1
  358. package/dist/core/validation/task-numbering.d.ts +6 -3
  359. package/dist/core/validation/task-numbering.d.ts.map +1 -1
  360. package/dist/core/validation/task-numbering.js +23 -11
  361. package/dist/core/validation/task-numbering.js.map +1 -1
  362. package/dist/core/validation/types.d.ts +18 -0
  363. package/dist/core/validation/types.d.ts.map +1 -1
  364. package/dist/core/validation/types.js +12 -1
  365. package/dist/core/validation/types.js.map +1 -1
  366. package/dist/core/validation/validator.d.ts +43 -63
  367. package/dist/core/validation/validator.d.ts.map +1 -1
  368. package/dist/core/validation/validator.js +500 -267
  369. package/dist/core/validation/validator.js.map +1 -1
  370. package/dist/prompts/searchable-multi-select.d.ts +3 -8
  371. package/dist/prompts/searchable-multi-select.d.ts.map +1 -1
  372. package/dist/prompts/searchable-multi-select.js +16 -39
  373. package/dist/prompts/searchable-multi-select.js.map +1 -1
  374. package/dist/utils/change-metadata.d.ts +11 -50
  375. package/dist/utils/change-metadata.d.ts.map +1 -1
  376. package/dist/utils/change-metadata.js +48 -67
  377. package/dist/utils/change-metadata.js.map +1 -1
  378. package/dist/utils/change-utils.d.ts +30 -54
  379. package/dist/utils/change-utils.d.ts.map +1 -1
  380. package/dist/utils/change-utils.js +133 -91
  381. package/dist/utils/change-utils.js.map +1 -1
  382. package/dist/utils/file-lock.d.ts +39 -0
  383. package/dist/utils/file-lock.d.ts.map +1 -0
  384. package/dist/utils/file-lock.js +149 -0
  385. package/dist/utils/file-lock.js.map +1 -0
  386. package/dist/utils/file-system.d.ts +12 -32
  387. package/dist/utils/file-system.d.ts.map +1 -1
  388. package/dist/utils/file-system.js +16 -40
  389. package/dist/utils/file-system.js.map +1 -1
  390. package/dist/utils/frontmatter.d.ts +7 -11
  391. package/dist/utils/frontmatter.d.ts.map +1 -1
  392. package/dist/utils/frontmatter.js +11 -11
  393. package/dist/utils/frontmatter.js.map +1 -1
  394. package/dist/utils/interactive.d.ts +4 -9
  395. package/dist/utils/interactive.d.ts.map +1 -1
  396. package/dist/utils/interactive.js +2 -4
  397. package/dist/utils/interactive.js.map +1 -1
  398. package/dist/utils/item-discovery.d.ts +15 -10
  399. package/dist/utils/item-discovery.d.ts.map +1 -1
  400. package/dist/utils/item-discovery.js +42 -47
  401. package/dist/utils/item-discovery.js.map +1 -1
  402. package/dist/utils/link.d.ts +9 -18
  403. package/dist/utils/link.d.ts.map +1 -1
  404. package/dist/utils/link.js +9 -18
  405. package/dist/utils/link.js.map +1 -1
  406. package/dist/utils/requirement-diff.d.ts +13 -23
  407. package/dist/utils/requirement-diff.d.ts.map +1 -1
  408. package/dist/utils/requirement-diff.js +13 -23
  409. package/dist/utils/requirement-diff.js.map +1 -1
  410. package/dist/utils/spec-files.d.ts +7 -20
  411. package/dist/utils/spec-files.d.ts.map +1 -1
  412. package/dist/utils/spec-files.js +26 -51
  413. package/dist/utils/spec-files.js.map +1 -1
  414. package/dist/utils/task-progress.d.ts +11 -9
  415. package/dist/utils/task-progress.d.ts.map +1 -1
  416. package/dist/utils/task-progress.js +53 -32
  417. package/dist/utils/task-progress.js.map +1 -1
  418. package/dist/utils/timestamp.d.ts +5 -8
  419. package/dist/utils/timestamp.d.ts.map +1 -1
  420. package/dist/utils/timestamp.js +5 -8
  421. package/dist/utils/timestamp.js.map +1 -1
  422. package/package.json +2 -3
  423. package/schemas/decision/templates/decision.md +3 -1
  424. package/schemas/decision/templates/index.md +2 -2
  425. package/schemas/issue/schema.yaml +8 -1
  426. package/schemas/issue/templates/spec.md +27 -2
  427. package/schemas/sdd/schema.yaml +20 -1
  428. package/schemas/sdd/templates/spec.md +27 -2
  429. /package/assets/rules/tospec/{single-sourc-of-truth.md → single-source-of-truth.md} +0 -0
@@ -1,9 +1,6 @@
1
1
  /**
2
- * New Change Command
3
- *
4
- * Creates a new change directory with optional description and schema in the
5
- * resolved Tospec root. Initiative linking and workspace affected areas are
6
- * no longer part of this command.
2
+ * `tospec new change` — creates a change directory with an optional description
3
+ * and schema in the resolved Tospec root.
7
4
  */
8
5
  export interface NewChangeOptions {
9
6
  description?: string;
@@ -15,5 +12,7 @@ export interface NewChangeOptions {
15
12
  areas?: string;
16
13
  json?: boolean;
17
14
  }
15
+ /** The `--json` null-shape; shared by the commander table and both catch sites. */
16
+ export declare const NEW_CHANGE_FAILURE_PAYLOAD: Record<string, unknown>;
18
17
  export declare function newChangeCommand(name: string | undefined, options: NewChangeOptions): Promise<void>;
19
18
  //# sourceMappingURL=new-change.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"new-change.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/new-change.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoBH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA2DD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoEzG"}
1
+ {"version":3,"file":"new-change.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/new-change.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiBH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAyFD,mFAAmF;AACnF,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAgC,CAAC;AAEhG,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmHzG"}
@@ -1,19 +1,14 @@
1
1
  /**
2
- * New Change Command
3
- *
4
- * Creates a new change directory with optional description and schema in the
5
- * resolved Tospec root. Initiative linking and workspace affected areas are
6
- * no longer part of this command.
2
+ * `tospec new change` — creates a change directory with an optional description
3
+ * and schema in the resolved Tospec root.
7
4
  */
8
5
  import path from 'path';
6
+ import { existsSync } from 'fs';
9
7
  import { createChange, validateChangeName } from '../../utils/change-utils.js';
10
8
  import { formatChangeLocation } from '../../core/planning-home.js';
11
9
  import { resolveRootForCommand, RootSelectionError, toPlanningHome, toRootOutput, } from '../../core/root-selection.js';
12
- import { validateSchemaExists } from './shared.js';
10
+ import { validateSchemaExists, assertChangeSchema } from './shared.js';
13
11
  import { emitSuccess, emitFailure } from '../shared-output.js';
14
- // -----------------------------------------------------------------------------
15
- // Command Implementation
16
- // -----------------------------------------------------------------------------
17
12
  function assertRemovedOptionsAbsent(options) {
18
13
  if (options.initiative !== undefined) {
19
14
  throw new RootSelectionError('--initiative is no longer supported. Tospec changes are always repo-local.', 'initiative_option_removed', { target: 'change.options' });
@@ -32,18 +27,68 @@ function parseDecisionsOption(value) {
32
27
  .filter(Boolean);
33
28
  return decisions.length > 0 ? { decisions } : undefined;
34
29
  }
30
+ /**
31
+ * Refuses a `--decisions` entry that names no existing ADR. Checked at creation
32
+ * because nothing downstream does: validate ignores the field, and archive only
33
+ * follows it into the ticket's Related Decisions links, where a typo becomes a
34
+ * dead link.
35
+ */
36
+ function assertDecisionsExist(projectRoot, decisions) {
37
+ const decisionsDir = path.join(projectRoot, 'tospec', 'decisions');
38
+ const missing = decisions.filter((file) => !existsSync(path.join(decisionsDir, file)));
39
+ if (missing.length === 0)
40
+ return;
41
+ throw new Error(`No such decision record(s) in tospec/decisions/: ${missing.join(', ')}. ` +
42
+ 'Pass the filename as tospec decision new reported it, or run tospec decision list.');
43
+ }
35
44
  function printCreatedChangeHuman(payload, root) {
36
- // A relative path is only honest when the root is where the user
37
- // stands; a distant ancestor root gets the absolute path.
38
- const location = root.path === process.cwd()
45
+ // A relative path is only honest when the root is where the user stands.
46
+ // Forward slashes on every platform: the message is read as a POSIX-style
47
+ // project path, and mixing `\` with the trailing `/` looked like a typo.
48
+ const location = toPosixPath(root.path === process.cwd()
39
49
  ? formatChangeLocation(toPlanningHome(root), payload.change.id)
40
- : payload.change.path;
50
+ : payload.change.path);
41
51
  console.log(`Created change '${payload.change.id}' at ${location}/`);
42
52
  console.log(`Schema: ${payload.change.schema}`);
53
+ // The CLI owns the ticket's timestamped filename, so this is the only place a
54
+ // human learns which file to open.
55
+ if (payload.change.ticketPath) {
56
+ console.log(`Ticket: ${toDisplayPath(root, payload.change.ticketPath)}`);
57
+ }
43
58
  console.log(`Next: ${`tospec status --change ${payload.change.id}`}`);
44
59
  }
60
+ /** Root-relative while the user stands in the root; absolute otherwise. */
61
+ function toDisplayPath(root, absolutePath) {
62
+ return toPosixPath(root.path === process.cwd() ? path.relative(root.path, absolutePath) : absolutePath);
63
+ }
64
+ function toPosixPath(p) {
65
+ return p.replace(/\\/g, '/');
66
+ }
67
+ /** The `--json` null-shape; shared by the commander table and both catch sites. */
68
+ export const NEW_CHANGE_FAILURE_PAYLOAD = { change: null, root: null };
45
69
  export async function newChangeCommand(name, options) {
70
+ // Root resolution first: validating arguments before it makes a rejected name
71
+ // report `root: null`, while `list --type bogus` and `templates --schema
72
+ // nosuch` — argument failures of the same kind — both report the root.
73
+ let resolvedRoot = null;
74
+ const failurePayload = () => ({
75
+ change: null,
76
+ root: resolvedRoot ? toRootOutput(resolvedRoot) : null,
77
+ });
46
78
  try {
79
+ // Writes must not scaffold a tree: the implicit fallback would silently
80
+ // create `tospec/` in whatever directory the user happened to be in,
81
+ // while `list` and `status` refuse there. `tospec init` is the only
82
+ // command that creates a root.
83
+ resolvedRoot = await resolveRootForCommand(options, {
84
+ json: options.json,
85
+ allowImplicitRoot: false,
86
+ failurePayload: failurePayload(),
87
+ });
88
+ if (!resolvedRoot) {
89
+ return;
90
+ }
91
+ const root = resolvedRoot;
47
92
  if (!name) {
48
93
  throw new Error('Missing required argument <name>');
49
94
  }
@@ -52,17 +97,14 @@ export async function newChangeCommand(name, options) {
52
97
  throw new Error(validation.error);
53
98
  }
54
99
  assertRemovedOptionsAbsent(options);
55
- const root = await resolveRootForCommand(options, {
56
- json: options.json,
57
- failurePayload: { change: null },
58
- });
59
- if (!root) {
60
- return;
61
- }
62
100
  const projectRoot = root.path;
63
- // Validate schema if provided
64
101
  if (options.schema) {
65
102
  validateSchemaExists(options.schema, projectRoot);
103
+ assertChangeSchema(options.schema);
104
+ }
105
+ const parsedDecisions = parseDecisionsOption(options.decisions);
106
+ if (parsedDecisions) {
107
+ assertDecisionsExist(projectRoot, parsedDecisions.decisions);
66
108
  }
67
109
  const resolvedSchema = options.schema ?? root.defaultSchema;
68
110
  if (!options.json) {
@@ -72,11 +114,11 @@ export async function newChangeCommand(name, options) {
72
114
  schema: options.schema,
73
115
  defaultSchema: root.defaultSchema,
74
116
  changesDir: root.changesDir,
75
- // --description fills the ticket stub's `## Summary` (see writeTicketStub).
117
+ // --description fills the ticket stub's `## Summary`.
76
118
  ...(options.description ? { description: options.description } : {}),
77
119
  metadata: {
78
120
  ...(options.goal ? { goal: options.goal } : {}),
79
- ...(parseDecisionsOption(options.decisions) ?? {}),
121
+ ...(parsedDecisions ?? {}),
80
122
  },
81
123
  });
82
124
  const payload = {
@@ -85,18 +127,41 @@ export async function newChangeCommand(name, options) {
85
127
  path: result.changeDir,
86
128
  metadataPath: path.join(result.changeDir, '.tospec.yaml'),
87
129
  schema: result.schema,
130
+ // The CLI owns the ticket's timestamped filename, so reporting it is
131
+ // the only way a caller can open the stub it must fill in.
132
+ ...(result.ticketPath ? { ticketPath: result.ticketPath } : {}),
88
133
  },
89
134
  root: toRootOutput(root),
90
135
  };
136
+ // A `--description` that could not be applied is reported, never dropped.
137
+ const diagnostics = [];
138
+ if (result.ticketSummaryKept) {
139
+ diagnostics.push({
140
+ severity: 'warning',
141
+ code: 'ticket_summary_kept',
142
+ message: `--description was not applied: ticket ${path.basename(result.ticketPath ?? '')} already has a Summary. Edit it directly to change the summary.`,
143
+ });
144
+ }
145
+ if (result.ticketsUnsupported) {
146
+ // No ticket.md in the schema, and nothing else stores a one-line summary,
147
+ // so the text is gone; naming where it can live is all that remains.
148
+ diagnostics.push({
149
+ severity: 'warning',
150
+ code: 'ticket_unsupported',
151
+ message: `--description was not applied: schema '${result.schema}' ships no ticket.md, so this change has no ticket to summarize. Put the summary in the change's own artifact instead.`,
152
+ });
153
+ }
91
154
  if (options.json) {
92
- emitSuccess({ change: payload.change }, payload.root);
155
+ emitSuccess({ change: payload.change, ...(diagnostics.length ? { status: diagnostics } : {}) }, payload.root);
93
156
  return;
94
157
  }
158
+ for (const diagnostic of diagnostics)
159
+ console.error(`Warning: ${diagnostic.message}`);
95
160
  printCreatedChangeHuman(payload, root);
96
161
  }
97
162
  catch (error) {
98
163
  if (options.json) {
99
- emitFailure(true, { change: null }, error, 'change_error');
164
+ emitFailure(true, failurePayload(), error, 'change_error');
100
165
  return;
101
166
  }
102
167
  throw error;
@@ -1 +1 @@
1
- {"version":3,"file":"new-change.js","sourceRoot":"","sources":["../../../src/commands/workflow/new-change.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"new-change.js","sourceRoot":"","sources":["../../../src/commands/workflow/new-change.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,6 @@
1
- /**
2
- * Schemas Command
3
- *
4
- * Lists available workflow schemas with descriptions.
5
- */
1
+ /** `tospec schemas` — the available workflow schemas, with descriptions. */
2
+ /** The `--json` null-shape; shared by the commander table and the catch block. */
3
+ export declare const SCHEMAS_FAILURE_PAYLOAD: Record<string, unknown>;
6
4
  export interface SchemasOptions {
7
5
  json?: boolean;
8
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/schemas.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAUH,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAMD,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B3E"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/schemas.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAM5E,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAG3D,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA2D3E"}
@@ -1,26 +1,39 @@
1
- /**
2
- * Schemas Command
3
- *
4
- * Lists available workflow schemas with descriptions.
5
- */
1
+ /** `tospec schemas` — the available workflow schemas, with descriptions. */
6
2
  import { listSchemasWithInfo } from '../../core/artifact-graph/index.js';
7
3
  import { emitSuccess } from '../shared-output.js';
8
4
  import { resolveRootForCommand, toRootOutput } from '../../core/root-selection.js';
9
- // -----------------------------------------------------------------------------
10
- // Command Implementation
11
- // -----------------------------------------------------------------------------
5
+ /** The `--json` null-shape; shared by the commander table and the catch block. */
6
+ export const SCHEMAS_FAILURE_PAYLOAD = {
7
+ schemas: null,
8
+ root: null,
9
+ };
12
10
  export async function schemasCommand(options) {
13
- // Same root resolution as every other command (report 4.3).
14
11
  const root = await resolveRootForCommand(options, {
15
12
  json: options.json,
16
- failurePayload: { schemas: null },
13
+ failurePayload: SCHEMAS_FAILURE_PAYLOAD,
17
14
  });
18
15
  if (!root) {
19
16
  return;
20
17
  }
21
18
  const schemas = listSchemasWithInfo(root.path);
19
+ // A schema that failed to load stays in the list carrying its reason rather
20
+ // than vanishing: the author most likely to hit this just wrote it, and an
21
+ // absent row answers none of their questions. Same rule `list` applies to an
22
+ // unreadable change — see
23
+ // tospec/decisions/20260917_234821-batch-commands-degrade-per-item.md.
24
+ const status = schemas
25
+ .filter((schema) => schema.error !== undefined)
26
+ .map((schema) => ({
27
+ severity: 'error',
28
+ code: 'schema_unreadable',
29
+ message: `Schema '${schema.name}' could not be loaded: ${schema.error}`,
30
+ target: schema.path,
31
+ fix: `Fix ${schema.name}'s schema.yaml, or remove the directory.`,
32
+ }));
22
33
  if (options.json) {
23
- emitSuccess({ schemas }, toRootOutput(root));
34
+ emitSuccess({ schemas, ...(status.length ? { status } : {}) }, toRootOutput(root));
35
+ if (status.length)
36
+ process.exitCode = 1;
24
37
  return;
25
38
  }
26
39
  console.log('Available schemas:');
@@ -34,9 +47,22 @@ export async function schemasCommand(options) {
34
47
  sourceLabel = ' (user override)';
35
48
  }
36
49
  console.log(` ${schema.name}${sourceLabel}`);
50
+ if (schema.error !== undefined) {
51
+ console.log(` unreadable: ${schema.error}`);
52
+ console.log();
53
+ continue;
54
+ }
37
55
  console.log(` ${schema.description}`);
38
56
  console.log(` Artifacts: ${schema.artifacts.join(' → ')}`);
39
57
  console.log();
40
58
  }
59
+ if (status.length) {
60
+ for (const entry of status) {
61
+ console.error(`Error: ${entry.message}`);
62
+ if (entry.fix)
63
+ console.error(`Fix: ${entry.fix}`);
64
+ }
65
+ process.exitCode = 1;
66
+ }
41
67
  }
42
68
  //# sourceMappingURL=schemas.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/commands/workflow/schemas.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAUnF,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC1D,4DAA4D;IAC5D,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE;QAChD,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;KAClC,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,WAAW,GAAG,YAAY,CAAC;QAC7B,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACpC,WAAW,GAAG,kBAAkB,CAAC;QACnC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../src/commands/workflow/schemas.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,WAAW,EAA0B,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEnF,kFAAkF;AAClF,MAAM,CAAC,MAAM,uBAAuB,GAA4B;IAC9D,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,IAAI;CACX,CAAC;AAMF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC1D,MAAM,IAAI,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE;QAChD,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,cAAc,EAAE,uBAAuB;KACxC,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IACD,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/C,4EAA4E;IAC5E,2EAA2E;IAC3E,6EAA6E;IAC7E,0BAA0B;IAC1B,uEAAuE;IACvE,MAAM,MAAM,GAAwB,OAAO;SACxC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC;SAC9C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChB,QAAQ,EAAE,OAAgB;QAC1B,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,WAAW,MAAM,CAAC,IAAI,0BAA0B,MAAM,CAAC,KAAK,EAAE;QACvE,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,GAAG,EAAE,OAAO,MAAM,CAAC,IAAI,0CAA0C;KAClE,CAAC,CAAC,CAAC;IAEN,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,WAAW,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QACnF,IAAI,MAAM,CAAC,MAAM;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAClC,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,WAAW,GAAG,YAAY,CAAC;QAC7B,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACpC,WAAW,GAAG,kBAAkB,CAAC;QACnC,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC,CAAC;QAC9C,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzC,IAAI,KAAK,CAAC,GAAG;gBAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -1,9 +1,7 @@
1
- /**
2
- * Shared Types and Utilities for Artifact Workflow Commands
3
- *
4
- * This module contains types, constants, and validation helpers used across
5
- * multiple artifact workflow commands.
6
- */
1
+ /** Types, constants and validation helpers shared by the workflow commands. */
2
+ import { DEFAULT_SCHEMA } from '../../core/schema-names.js';
3
+ import type { ArtifactStatusValue } from '../../core/change-status-policy.js';
4
+ import type { ProjectConfigDiagnostic } from '../../core/project-config.js';
7
5
  export interface ChangeCommandStatus {
8
6
  severity: 'error' | 'warning';
9
7
  code: string;
@@ -12,7 +10,12 @@ export interface ChangeCommandStatus {
12
10
  fix?: string;
13
11
  }
14
12
  export interface TaskItem {
13
+ /**
14
+ * The task's own number from the file ("1.2"), not its position in the list;
15
+ * the ordinal only when the file numbers nothing.
16
+ */
15
17
  id: string;
18
+ /** The task text with that number stripped — `id` + `description` is the line. */
16
19
  description: string;
17
20
  done: boolean;
18
21
  }
@@ -28,31 +31,55 @@ export interface ApplyInstructions {
28
31
  };
29
32
  tasks: TaskItem[];
30
33
  state: 'blocked' | 'all_done' | 'ready';
34
+ /** Artifacts `apply.requires` insists on that do not exist; these block. */
31
35
  missingArtifacts?: string[];
36
+ /**
37
+ * Schema artifacts absent from the change that `apply.requires` does not
38
+ * insist on. The state stays `ready`, but the instruction may refer to them,
39
+ * so the caller is told which references have no file behind them.
40
+ */
41
+ missingContext?: string[];
32
42
  instruction: string;
43
+ /**
44
+ * Project context from `tospec/config.yaml`, as every artifact's instructions
45
+ * carry it. The apply skill makes a single `tospec instructions apply` call
46
+ * and treats it as the whole briefing, so what is missing here is missing for
47
+ * good.
48
+ */
49
+ context?: string;
50
+ /** Rules configured under the `apply` key of `rules:`, if any. */
51
+ rules?: string[];
52
+ /**
53
+ * Problems with the project's config, in the same shape the artifact
54
+ * instructions report them.
55
+ */
56
+ configWarnings?: ProjectConfigDiagnostic[];
33
57
  }
34
- export declare const DEFAULT_SCHEMA = "sdd";
35
- /**
36
- * Gets the status indicator for an artifact.
37
- */
38
- export declare function getStatusIndicator(status: 'done' | 'ready' | 'blocked' | 'skipped' | 'stub'): string;
39
- /**
40
- * Returns the list of available change directory names under tospec/changes/.
41
- * Excludes the archive directory and hidden directories.
42
- */
58
+ export { DEFAULT_SCHEMA };
59
+ export declare function getStatusIndicator(status: ArtifactStatusValue): string;
60
+ /** Change directory names under `tospec/changes/`, minus `archive` and dotdirs. */
43
61
  export declare function getAvailableChanges(projectRoot: string, changesDir?: string): Promise<string[]>;
44
62
  /**
45
- * Validates that a change exists and returns available changes if not.
46
- * Checks directory existence directly to support scaffolded changes (without proposal.md).
63
+ * Resolves a change name, listing what is available when it does not exist.
64
+ * Tests the directory rather than an artifact, so a scaffolded change (no
65
+ * proposal.md yet) still counts.
47
66
  */
48
67
  export declare function validateChangeExists(changeName: string | undefined, projectRoot: string, changesDir?: string, hints?: {
49
68
  newChangeHint?: string;
50
69
  }): Promise<string>;
51
70
  /**
52
- * Validates that a schema exists and returns available schemas if not.
53
- *
54
- * @param schemaName - The schema name to validate
55
- * @param projectRoot - Optional project root for project-local schema resolution
71
+ * Validates that a schema is usable, not merely present on disk. A directory
72
+ * check alone lets `new change --schema <name>` succeed against a schema.yaml
73
+ * that does not parse, leaving a change nothing can read.
56
74
  */
57
75
  export declare function validateSchemaExists(schemaName: string, projectRoot?: string): string;
76
+ /**
77
+ * Refuses the decision schema for commands that operate on a change: its
78
+ * artifact belongs in `tospec/decisions/`, so pointed at a change it produces a
79
+ * directory `decision list` never sees and a `decision.md` archive never merges.
80
+ *
81
+ * `templates --schema decision` does not call this — listing that schema's
82
+ * templates is what `decision new` itself needs.
83
+ */
84
+ export declare function assertChangeSchema(schemaName: string): void;
58
85
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/shared.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;IACxC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD,eAAO,MAAM,cAAc,QAAQ,CAAC;AAMpC;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAapG;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,UAAU,SAA8C,GACvD,OAAO,CAAC,MAAM,EAAE,CAAC,CAWnB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,WAAW,EAAE,MAAM,EACnB,UAAU,SAA8C,EACxD,KAAK,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACrC,OAAO,CAAC,MAAM,CAAC,CAsCjB;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CASrF"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/shared.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAM/E,OAAO,EAAwB,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB;;;OAGG;IACH,EAAE,EAAE,MAAM,CAAC;IACX,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,QAAQ,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;IACxC,4EAA4E;IAC5E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;OAGG;IACH,cAAc,CAAC,EAAE,uBAAuB,EAAE,CAAC;CAC5C;AAID,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAgBtE;AAED,mFAAmF;AACnF,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,UAAU,SAA8C,GACvD,OAAO,CAAC,MAAM,EAAE,CAAC,CAUnB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,WAAW,EAAE,MAAM,EACnB,UAAU,SAA8C,EACxD,KAAK,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAO,GACrC,OAAO,CAAC,MAAM,CAAC,CAqCjB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAWrF;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAO3D"}
@@ -1,23 +1,12 @@
1
- /**
2
- * Shared Types and Utilities for Artifact Workflow Commands
3
- *
4
- * This module contains types, constants, and validation helpers used across
5
- * multiple artifact workflow commands.
6
- */
1
+ /** Types, constants and validation helpers shared by the workflow commands. */
7
2
  import path from 'path';
8
3
  import * as fs from 'fs';
9
- import { getSchemaDir, listSchemas } from '../../core/artifact-graph/index.js';
4
+ import { getSchemaDir, listLoadableSchemas, resolveSchema } from '../../core/artifact-graph/index.js';
10
5
  import { validateChangeName } from '../../utils/change-utils.js';
11
- // -----------------------------------------------------------------------------
12
- // Constants
13
- // -----------------------------------------------------------------------------
14
- export const DEFAULT_SCHEMA = 'sdd';
15
- // -----------------------------------------------------------------------------
16
- // Utility Functions
17
- // -----------------------------------------------------------------------------
18
- /**
19
- * Gets the status indicator for an artifact.
20
- */
6
+ import { DECISION_SCHEMA_NAME, DEFAULT_SCHEMA } from '../../core/schema-names.js';
7
+ // Defined in core/schema-names so this module and decision.ts share it without
8
+ // importing each other; re-exported because the workflow barrel publishes it.
9
+ export { DEFAULT_SCHEMA };
21
10
  export function getStatusIndicator(status) {
22
11
  switch (status) {
23
12
  case 'done':
@@ -26,20 +15,19 @@ export function getStatusIndicator(status) {
26
15
  return '[ ]';
27
16
  case 'blocked':
28
17
  return '[-]';
18
+ // Both mean "not written and not required" and call for the same next move,
19
+ // so they share a marker; the label beside it says which.
29
20
  case 'skipped':
21
+ case 'optional':
30
22
  return '[~]';
31
23
  case 'stub':
32
24
  return '[!]';
33
25
  }
34
26
  }
35
- /**
36
- * Returns the list of available change directory names under tospec/changes/.
37
- * Excludes the archive directory and hidden directories.
38
- */
27
+ /** Change directory names under `tospec/changes/`, minus `archive` and dotdirs. */
39
28
  export async function getAvailableChanges(projectRoot, changesDir = path.join(projectRoot, 'tospec', 'changes')) {
40
- const changesPath = changesDir;
41
29
  try {
42
- const entries = await fs.promises.readdir(changesPath, { withFileTypes: true });
30
+ const entries = await fs.promises.readdir(changesDir, { withFileTypes: true });
43
31
  return entries
44
32
  .filter((e) => e.isDirectory() && e.name !== 'archive' && !e.name.startsWith('.'))
45
33
  .map((e) => e.name);
@@ -51,11 +39,12 @@ export async function getAvailableChanges(projectRoot, changesDir = path.join(pr
51
39
  }
52
40
  }
53
41
  /**
54
- * Validates that a change exists and returns available changes if not.
55
- * Checks directory existence directly to support scaffolded changes (without proposal.md).
42
+ * Resolves a change name, listing what is available when it does not exist.
43
+ * Tests the directory rather than an artifact, so a scaffolded change (no
44
+ * proposal.md yet) still counts.
56
45
  */
57
46
  export async function validateChangeExists(changeName, projectRoot, changesDir = path.join(projectRoot, 'tospec', 'changes'), hints = {}) {
58
- // Hints must stay pasteable: callers with a selected store pass a
47
+ // Hints must stay pasteable: a caller with a selected store passes a
59
48
  // store-carrying hint so following it lands in the same root.
60
49
  const newChangeHint = hints.newChangeHint ?? 'tospec new change <name>';
61
50
  if (!changeName) {
@@ -65,12 +54,11 @@ export async function validateChangeExists(changeName, projectRoot, changesDir =
65
54
  }
66
55
  throw new Error(`Missing required option --change. Available changes:\n ${available.join('\n ')}`);
67
56
  }
68
- // Validate change name format to prevent path traversal
57
+ // Name format first: this value is about to be joined onto a directory.
69
58
  const nameValidation = validateChangeName(changeName);
70
59
  if (!nameValidation.valid) {
71
60
  throw new Error(`Invalid change name '${changeName}': ${nameValidation.error}`);
72
61
  }
73
- // Check directory existence directly
74
62
  const changePath = path.join(changesDir, changeName);
75
63
  const exists = fs.existsSync(changePath) && fs.statSync(changePath).isDirectory();
76
64
  if (!exists) {
@@ -83,17 +71,32 @@ export async function validateChangeExists(changeName, projectRoot, changesDir =
83
71
  return changeName;
84
72
  }
85
73
  /**
86
- * Validates that a schema exists and returns available schemas if not.
87
- *
88
- * @param schemaName - The schema name to validate
89
- * @param projectRoot - Optional project root for project-local schema resolution
74
+ * Validates that a schema is usable, not merely present on disk. A directory
75
+ * check alone lets `new change --schema <name>` succeed against a schema.yaml
76
+ * that does not parse, leaving a change nothing can read.
90
77
  */
91
78
  export function validateSchemaExists(schemaName, projectRoot) {
92
79
  const schemaDir = getSchemaDir(schemaName, projectRoot);
93
80
  if (!schemaDir) {
94
- const availableSchemas = listSchemas(projectRoot);
81
+ // Loadable, not merely present, so the list is advice that works.
82
+ const availableSchemas = listLoadableSchemas(projectRoot);
95
83
  throw new Error(`Schema '${schemaName}' not found. Available schemas:\n ${availableSchemas.join('\n ')}`);
96
84
  }
85
+ resolveSchema(schemaName, projectRoot);
97
86
  return schemaName;
98
87
  }
88
+ /**
89
+ * Refuses the decision schema for commands that operate on a change: its
90
+ * artifact belongs in `tospec/decisions/`, so pointed at a change it produces a
91
+ * directory `decision list` never sees and a `decision.md` archive never merges.
92
+ *
93
+ * `templates --schema decision` does not call this — listing that schema's
94
+ * templates is what `decision new` itself needs.
95
+ */
96
+ export function assertChangeSchema(schemaName) {
97
+ if (schemaName === DECISION_SCHEMA_NAME) {
98
+ throw new Error(`Schema '${DECISION_SCHEMA_NAME}' records an architecture decision, not a change. ` +
99
+ 'Use: tospec decision new <topic>');
100
+ }
101
+ }
99
102
  //# sourceMappingURL=shared.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/commands/workflow/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/commands/workflow/shared.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,4 @@
1
- /**
2
- * Status Command
3
- *
4
- * Displays artifact completion status for a change.
5
- */
1
+ /** `tospec status` — artifact completion for one change, or for every change. */
6
2
  import { type ChangeStatus } from '../../core/artifact-graph/index.js';
7
3
  export interface StatusOptions {
8
4
  change?: string;
@@ -13,9 +9,17 @@ export interface StatusOptions {
13
9
  /**
14
10
  * The `--all --json` failure null-shape. Root selection resolves inside this
15
11
  * module while thrown errors are caught by the CLI wrapper, so both call sites
16
- * reference this one constant rather than each spelling the shape out.
12
+ * reference this one constant.
17
13
  */
18
14
  export declare const BATCH_STATUS_FAILURE_PAYLOAD: Record<string, unknown>;
15
+ /**
16
+ * The single-change `--json` failure null-shape. Flat payload, like
17
+ * `instructions` and `show`, so it nulls a key its success output really carries
18
+ * (`changeName`) — otherwise a caller cannot tell this envelope from an
19
+ * unrelated error document.
20
+ * decisions/20260917_155623-flat-json-payloads-null-a-real-success-key.md
21
+ */
22
+ export declare const STATUS_FAILURE_PAYLOAD: Record<string, unknown>;
19
23
  export declare function statusCommand(options: StatusOptions): Promise<void>;
20
24
  export declare function printStatusText(status: ChangeStatus): void;
21
25
  //# sourceMappingURL=status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,oCAAoC,CAAC;AAa5C,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AASD;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAqB,CAAC;AAMvF,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmHzE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAmC1D"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/status.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAQjF,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,oCAAoC,CAAC;AAY5C,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AASD;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAiC,CAAC;AAEnG;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAoC,CAAC;AAEhG,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6IzE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAmD1D"}