@seanmars/tospec 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +114 -0
  3. package/assets/dashboard/app.js +1032 -0
  4. package/assets/dashboard/chart.umd.js +14 -0
  5. package/assets/dashboard/index.html +30 -0
  6. package/assets/dashboard/style.css +675 -0
  7. package/bin/tospec.js +5 -0
  8. package/dist/cli/index.d.ts +5 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +330 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/commands/config.d.ts +36 -0
  13. package/dist/commands/config.d.ts.map +1 -0
  14. package/dist/commands/config.js +486 -0
  15. package/dist/commands/config.js.map +1 -0
  16. package/dist/commands/dashboard.d.ts +40 -0
  17. package/dist/commands/dashboard.d.ts.map +1 -0
  18. package/dist/commands/dashboard.js +385 -0
  19. package/dist/commands/dashboard.js.map +1 -0
  20. package/dist/commands/shared-output.d.ts +24 -0
  21. package/dist/commands/shared-output.d.ts.map +1 -0
  22. package/dist/commands/shared-output.js +51 -0
  23. package/dist/commands/shared-output.js.map +1 -0
  24. package/dist/commands/show.d.ts +17 -0
  25. package/dist/commands/show.d.ts.map +1 -0
  26. package/dist/commands/show.js +164 -0
  27. package/dist/commands/show.js.map +1 -0
  28. package/dist/commands/validate.d.ts +51 -0
  29. package/dist/commands/validate.d.ts.map +1 -0
  30. package/dist/commands/validate.js +416 -0
  31. package/dist/commands/validate.js.map +1 -0
  32. package/dist/commands/workflow/index.d.ts +17 -0
  33. package/dist/commands/workflow/index.d.ts.map +1 -0
  34. package/dist/commands/workflow/index.js +12 -0
  35. package/dist/commands/workflow/index.js.map +1 -0
  36. package/dist/commands/workflow/instructions.d.ts +35 -0
  37. package/dist/commands/workflow/instructions.d.ts.map +1 -0
  38. package/dist/commands/workflow/instructions.js +359 -0
  39. package/dist/commands/workflow/instructions.js.map +1 -0
  40. package/dist/commands/workflow/new-change.d.ts +17 -0
  41. package/dist/commands/workflow/new-change.d.ts.map +1 -0
  42. package/dist/commands/workflow/new-change.js +97 -0
  43. package/dist/commands/workflow/new-change.js.map +1 -0
  44. package/dist/commands/workflow/schemas.d.ts +10 -0
  45. package/dist/commands/workflow/schemas.d.ts.map +1 -0
  46. package/dist/commands/workflow/schemas.js +33 -0
  47. package/dist/commands/workflow/schemas.js.map +1 -0
  48. package/dist/commands/workflow/shared.d.ts +63 -0
  49. package/dist/commands/workflow/shared.d.ts.map +1 -0
  50. package/dist/commands/workflow/shared.js +111 -0
  51. package/dist/commands/workflow/shared.js.map +1 -0
  52. package/dist/commands/workflow/status.d.ts +14 -0
  53. package/dist/commands/workflow/status.d.ts.map +1 -0
  54. package/dist/commands/workflow/status.js +77 -0
  55. package/dist/commands/workflow/status.js.map +1 -0
  56. package/dist/commands/workflow/templates.d.ts +16 -0
  57. package/dist/commands/workflow/templates.d.ts.map +1 -0
  58. package/dist/commands/workflow/templates.js +60 -0
  59. package/dist/commands/workflow/templates.js.map +1 -0
  60. package/dist/core/archive.d.ts +33 -0
  61. package/dist/core/archive.d.ts.map +1 -0
  62. package/dist/core/archive.js +585 -0
  63. package/dist/core/archive.js.map +1 -0
  64. package/dist/core/artifact-graph/graph.d.ts +56 -0
  65. package/dist/core/artifact-graph/graph.d.ts.map +1 -0
  66. package/dist/core/artifact-graph/graph.js +141 -0
  67. package/dist/core/artifact-graph/graph.js.map +1 -0
  68. package/dist/core/artifact-graph/index.d.ts +9 -0
  69. package/dist/core/artifact-graph/index.d.ts.map +1 -0
  70. package/dist/core/artifact-graph/index.js +14 -0
  71. package/dist/core/artifact-graph/index.js.map +1 -0
  72. package/dist/core/artifact-graph/instruction-loader.d.ts +188 -0
  73. package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -0
  74. package/dist/core/artifact-graph/instruction-loader.js +243 -0
  75. package/dist/core/artifact-graph/instruction-loader.js.map +1 -0
  76. package/dist/core/artifact-graph/outputs.d.ts +14 -0
  77. package/dist/core/artifact-graph/outputs.d.ts.map +1 -0
  78. package/dist/core/artifact-graph/outputs.js +39 -0
  79. package/dist/core/artifact-graph/outputs.js.map +1 -0
  80. package/dist/core/artifact-graph/resolver.d.ts +81 -0
  81. package/dist/core/artifact-graph/resolver.d.ts.map +1 -0
  82. package/dist/core/artifact-graph/resolver.js +257 -0
  83. package/dist/core/artifact-graph/resolver.js.map +1 -0
  84. package/dist/core/artifact-graph/schema.d.ts +13 -0
  85. package/dist/core/artifact-graph/schema.d.ts.map +1 -0
  86. package/dist/core/artifact-graph/schema.js +108 -0
  87. package/dist/core/artifact-graph/schema.js.map +1 -0
  88. package/dist/core/artifact-graph/state.d.ts +12 -0
  89. package/dist/core/artifact-graph/state.d.ts.map +1 -0
  90. package/dist/core/artifact-graph/state.js +31 -0
  91. package/dist/core/artifact-graph/state.js.map +1 -0
  92. package/dist/core/artifact-graph/types.d.ts +55 -0
  93. package/dist/core/artifact-graph/types.d.ts.map +1 -0
  94. package/dist/core/artifact-graph/types.js +38 -0
  95. package/dist/core/artifact-graph/types.js.map +1 -0
  96. package/dist/core/available-tools.d.ts +17 -0
  97. package/dist/core/available-tools.d.ts.map +1 -0
  98. package/dist/core/available-tools.js +43 -0
  99. package/dist/core/available-tools.js.map +1 -0
  100. package/dist/core/change-metadata/index.d.ts +2 -0
  101. package/dist/core/change-metadata/index.d.ts.map +1 -0
  102. package/dist/core/change-metadata/index.js +2 -0
  103. package/dist/core/change-metadata/index.js.map +1 -0
  104. package/dist/core/change-metadata/schema.d.ts +12 -0
  105. package/dist/core/change-metadata/schema.d.ts.map +1 -0
  106. package/dist/core/change-metadata/schema.js +15 -0
  107. package/dist/core/change-metadata/schema.js.map +1 -0
  108. package/dist/core/change-presenter.d.ts +24 -0
  109. package/dist/core/change-presenter.d.ts.map +1 -0
  110. package/dist/core/change-presenter.js +135 -0
  111. package/dist/core/change-presenter.js.map +1 -0
  112. package/dist/core/change-status-policy.d.ts +35 -0
  113. package/dist/core/change-status-policy.d.ts.map +1 -0
  114. package/dist/core/change-status-policy.js +34 -0
  115. package/dist/core/change-status-policy.js.map +1 -0
  116. package/dist/core/command-generation/adapters/claude.d.ts +14 -0
  117. package/dist/core/command-generation/adapters/claude.d.ts.map +1 -0
  118. package/dist/core/command-generation/adapters/claude.js +38 -0
  119. package/dist/core/command-generation/adapters/claude.js.map +1 -0
  120. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  121. package/dist/core/command-generation/adapters/cursor.d.ts.map +1 -0
  122. package/dist/core/command-generation/adapters/cursor.js +31 -0
  123. package/dist/core/command-generation/adapters/cursor.js.map +1 -0
  124. package/dist/core/command-generation/adapters/index.d.ts +8 -0
  125. package/dist/core/command-generation/adapters/index.d.ts.map +1 -0
  126. package/dist/core/command-generation/adapters/index.js +8 -0
  127. package/dist/core/command-generation/adapters/index.js.map +1 -0
  128. package/dist/core/command-generation/generator.d.ts +21 -0
  129. package/dist/core/command-generation/generator.d.ts.map +1 -0
  130. package/dist/core/command-generation/generator.js +27 -0
  131. package/dist/core/command-generation/generator.js.map +1 -0
  132. package/dist/core/command-generation/index.d.ts +22 -0
  133. package/dist/core/command-generation/index.d.ts.map +1 -0
  134. package/dist/core/command-generation/index.js +24 -0
  135. package/dist/core/command-generation/index.js.map +1 -0
  136. package/dist/core/command-generation/registry.d.ts +24 -0
  137. package/dist/core/command-generation/registry.d.ts.map +1 -0
  138. package/dist/core/command-generation/registry.js +38 -0
  139. package/dist/core/command-generation/registry.js.map +1 -0
  140. package/dist/core/command-generation/types.d.ts +56 -0
  141. package/dist/core/command-generation/types.d.ts.map +1 -0
  142. package/dist/core/command-generation/types.js +8 -0
  143. package/dist/core/command-generation/types.js.map +1 -0
  144. package/dist/core/command-generation/yaml.d.ts +22 -0
  145. package/dist/core/command-generation/yaml.d.ts.map +1 -0
  146. package/dist/core/command-generation/yaml.js +38 -0
  147. package/dist/core/command-generation/yaml.js.map +1 -0
  148. package/dist/core/config-prompts.d.ts +9 -0
  149. package/dist/core/config-prompts.d.ts.map +1 -0
  150. package/dist/core/config-prompts.js +34 -0
  151. package/dist/core/config-prompts.js.map +1 -0
  152. package/dist/core/config-schema.d.ts +87 -0
  153. package/dist/core/config-schema.d.ts.map +1 -0
  154. package/dist/core/config-schema.js +239 -0
  155. package/dist/core/config-schema.js.map +1 -0
  156. package/dist/core/config.d.ts +19 -0
  157. package/dist/core/config.d.ts.map +1 -0
  158. package/dist/core/config.js +14 -0
  159. package/dist/core/config.js.map +1 -0
  160. package/dist/core/converters/json-converter.d.ts +6 -0
  161. package/dist/core/converters/json-converter.d.ts.map +1 -0
  162. package/dist/core/converters/json-converter.js +51 -0
  163. package/dist/core/converters/json-converter.js.map +1 -0
  164. package/dist/core/dashboard-activity.d.ts +50 -0
  165. package/dist/core/dashboard-activity.d.ts.map +1 -0
  166. package/dist/core/dashboard-activity.js +147 -0
  167. package/dist/core/dashboard-activity.js.map +1 -0
  168. package/dist/core/dashboard-data.d.ts +100 -0
  169. package/dist/core/dashboard-data.d.ts.map +1 -0
  170. package/dist/core/dashboard-data.js +368 -0
  171. package/dist/core/dashboard-data.js.map +1 -0
  172. package/dist/core/global-config.d.ts +51 -0
  173. package/dist/core/global-config.d.ts.map +1 -0
  174. package/dist/core/global-config.js +124 -0
  175. package/dist/core/global-config.js.map +1 -0
  176. package/dist/core/id.d.ts +17 -0
  177. package/dist/core/id.d.ts.map +1 -0
  178. package/dist/core/id.js +30 -0
  179. package/dist/core/id.js.map +1 -0
  180. package/dist/core/init.d.ts +34 -0
  181. package/dist/core/init.d.ts.map +1 -0
  182. package/dist/core/init.js +495 -0
  183. package/dist/core/init.js.map +1 -0
  184. package/dist/core/list.d.ts +12 -0
  185. package/dist/core/list.d.ts.map +1 -0
  186. package/dist/core/list.js +192 -0
  187. package/dist/core/list.js.map +1 -0
  188. package/dist/core/migrate.d.ts +52 -0
  189. package/dist/core/migrate.d.ts.map +1 -0
  190. package/dist/core/migrate.js +300 -0
  191. package/dist/core/migrate.js.map +1 -0
  192. package/dist/core/parsers/change-parser.d.ts +19 -0
  193. package/dist/core/parsers/change-parser.d.ts.map +1 -0
  194. package/dist/core/parsers/change-parser.js +204 -0
  195. package/dist/core/parsers/change-parser.js.map +1 -0
  196. package/dist/core/parsers/markdown-parser.d.ts +29 -0
  197. package/dist/core/parsers/markdown-parser.d.ts.map +1 -0
  198. package/dist/core/parsers/markdown-parser.js +181 -0
  199. package/dist/core/parsers/markdown-parser.js.map +1 -0
  200. package/dist/core/parsers/requirement-blocks.d.ts +37 -0
  201. package/dist/core/parsers/requirement-blocks.d.ts.map +1 -0
  202. package/dist/core/parsers/requirement-blocks.js +201 -0
  203. package/dist/core/parsers/requirement-blocks.js.map +1 -0
  204. package/dist/core/parsers/requirement-text.d.ts +55 -0
  205. package/dist/core/parsers/requirement-text.d.ts.map +1 -0
  206. package/dist/core/parsers/requirement-text.js +136 -0
  207. package/dist/core/parsers/requirement-text.js.map +1 -0
  208. package/dist/core/parsers/spec-structure.d.ts +9 -0
  209. package/dist/core/parsers/spec-structure.d.ts.map +1 -0
  210. package/dist/core/parsers/spec-structure.js +88 -0
  211. package/dist/core/parsers/spec-structure.js.map +1 -0
  212. package/dist/core/planning-home.d.ts +16 -0
  213. package/dist/core/planning-home.d.ts.map +1 -0
  214. package/dist/core/planning-home.js +67 -0
  215. package/dist/core/planning-home.js.map +1 -0
  216. package/dist/core/profiles.d.ts +24 -0
  217. package/dist/core/profiles.d.ts.map +1 -0
  218. package/dist/core/profiles.js +27 -0
  219. package/dist/core/profiles.js.map +1 -0
  220. package/dist/core/project-config.d.ts +100 -0
  221. package/dist/core/project-config.d.ts.map +1 -0
  222. package/dist/core/project-config.js +389 -0
  223. package/dist/core/project-config.js.map +1 -0
  224. package/dist/core/references.d.ts +40 -0
  225. package/dist/core/references.d.ts.map +1 -0
  226. package/dist/core/references.js +11 -0
  227. package/dist/core/references.js.map +1 -0
  228. package/dist/core/root-selection.d.ts +57 -0
  229. package/dist/core/root-selection.d.ts.map +1 -0
  230. package/dist/core/root-selection.js +98 -0
  231. package/dist/core/root-selection.js.map +1 -0
  232. package/dist/core/schemas/base.schema.d.ts +13 -0
  233. package/dist/core/schemas/base.schema.d.ts.map +1 -0
  234. package/dist/core/schemas/base.schema.js +18 -0
  235. package/dist/core/schemas/base.schema.js.map +1 -0
  236. package/dist/core/schemas/change.schema.d.ts +73 -0
  237. package/dist/core/schemas/change.schema.d.ts.map +1 -0
  238. package/dist/core/schemas/change.schema.js +31 -0
  239. package/dist/core/schemas/change.schema.js.map +1 -0
  240. package/dist/core/schemas/index.d.ts +4 -0
  241. package/dist/core/schemas/index.d.ts.map +1 -0
  242. package/dist/core/schemas/index.js +4 -0
  243. package/dist/core/schemas/index.js.map +1 -0
  244. package/dist/core/schemas/spec.schema.d.ts +18 -0
  245. package/dist/core/schemas/spec.schema.d.ts.map +1 -0
  246. package/dist/core/schemas/spec.schema.js +15 -0
  247. package/dist/core/schemas/spec.schema.js.map +1 -0
  248. package/dist/core/shared/index.d.ts +8 -0
  249. package/dist/core/shared/index.d.ts.map +1 -0
  250. package/dist/core/shared/index.js +8 -0
  251. package/dist/core/shared/index.js.map +1 -0
  252. package/dist/core/shared/skill-generation.d.ts +63 -0
  253. package/dist/core/shared/skill-generation.d.ts.map +1 -0
  254. package/dist/core/shared/skill-generation.js +125 -0
  255. package/dist/core/shared/skill-generation.js.map +1 -0
  256. package/dist/core/shared/tool-detection.d.ts +96 -0
  257. package/dist/core/shared/tool-detection.d.ts.map +1 -0
  258. package/dist/core/shared/tool-detection.js +207 -0
  259. package/dist/core/shared/tool-detection.js.map +1 -0
  260. package/dist/core/spec-presenter.d.ts +17 -0
  261. package/dist/core/spec-presenter.d.ts.map +1 -0
  262. package/dist/core/spec-presenter.js +98 -0
  263. package/dist/core/spec-presenter.js.map +1 -0
  264. package/dist/core/specs-apply.d.ts +78 -0
  265. package/dist/core/specs-apply.d.ts.map +1 -0
  266. package/dist/core/specs-apply.js +429 -0
  267. package/dist/core/specs-apply.js.map +1 -0
  268. package/dist/core/templates/index.d.ts +8 -0
  269. package/dist/core/templates/index.d.ts.map +1 -0
  270. package/dist/core/templates/index.js +9 -0
  271. package/dist/core/templates/index.js.map +1 -0
  272. package/dist/core/templates/skill-templates.d.ts +14 -0
  273. package/dist/core/templates/skill-templates.d.ts.map +1 -0
  274. package/dist/core/templates/skill-templates.js +13 -0
  275. package/dist/core/templates/skill-templates.js.map +1 -0
  276. package/dist/core/templates/types.d.ts +20 -0
  277. package/dist/core/templates/types.d.ts.map +1 -0
  278. package/dist/core/templates/types.js +5 -0
  279. package/dist/core/templates/types.js.map +1 -0
  280. package/dist/core/templates/workflows/apply.d.ts +10 -0
  281. package/dist/core/templates/workflows/apply.d.ts.map +1 -0
  282. package/dist/core/templates/workflows/apply.js +81 -0
  283. package/dist/core/templates/workflows/apply.js.map +1 -0
  284. package/dist/core/templates/workflows/archive.d.ts +10 -0
  285. package/dist/core/templates/workflows/archive.d.ts.map +1 -0
  286. package/dist/core/templates/workflows/archive.js +75 -0
  287. package/dist/core/templates/workflows/archive.js.map +1 -0
  288. package/dist/core/templates/workflows/explore.d.ts +10 -0
  289. package/dist/core/templates/workflows/explore.d.ts.map +1 -0
  290. package/dist/core/templates/workflows/explore.js +75 -0
  291. package/dist/core/templates/workflows/explore.js.map +1 -0
  292. package/dist/core/templates/workflows/issue.d.ts +10 -0
  293. package/dist/core/templates/workflows/issue.d.ts.map +1 -0
  294. package/dist/core/templates/workflows/issue.js +89 -0
  295. package/dist/core/templates/workflows/issue.js.map +1 -0
  296. package/dist/core/templates/workflows/propose.d.ts +10 -0
  297. package/dist/core/templates/workflows/propose.d.ts.map +1 -0
  298. package/dist/core/templates/workflows/propose.js +77 -0
  299. package/dist/core/templates/workflows/propose.js.map +1 -0
  300. package/dist/core/templates/workflows/sync.d.ts +14 -0
  301. package/dist/core/templates/workflows/sync.d.ts.map +1 -0
  302. package/dist/core/templates/workflows/sync.js +86 -0
  303. package/dist/core/templates/workflows/sync.js.map +1 -0
  304. package/dist/core/templates/workflows/update.d.ts +10 -0
  305. package/dist/core/templates/workflows/update.d.ts.map +1 -0
  306. package/dist/core/templates/workflows/update.js +99 -0
  307. package/dist/core/templates/workflows/update.js.map +1 -0
  308. package/dist/core/templates/workflows/verify.d.ts +9 -0
  309. package/dist/core/templates/workflows/verify.d.ts.map +1 -0
  310. package/dist/core/templates/workflows/verify.js +44 -0
  311. package/dist/core/templates/workflows/verify.js.map +1 -0
  312. package/dist/core/update.d.ts +46 -0
  313. package/dist/core/update.d.ts.map +1 -0
  314. package/dist/core/update.js +296 -0
  315. package/dist/core/update.js.map +1 -0
  316. package/dist/core/validation/constants.d.ts +34 -0
  317. package/dist/core/validation/constants.d.ts.map +1 -0
  318. package/dist/core/validation/constants.js +40 -0
  319. package/dist/core/validation/constants.js.map +1 -0
  320. package/dist/core/validation/section-validator.d.ts +19 -0
  321. package/dist/core/validation/section-validator.d.ts.map +1 -0
  322. package/dist/core/validation/section-validator.js +59 -0
  323. package/dist/core/validation/section-validator.js.map +1 -0
  324. package/dist/core/validation/types.d.ts +18 -0
  325. package/dist/core/validation/types.d.ts.map +1 -0
  326. package/dist/core/validation/types.js +2 -0
  327. package/dist/core/validation/types.js.map +1 -0
  328. package/dist/core/validation/validator.d.ts +51 -0
  329. package/dist/core/validation/validator.d.ts.map +1 -0
  330. package/dist/core/validation/validator.js +469 -0
  331. package/dist/core/validation/validator.js.map +1 -0
  332. package/dist/index.d.ts +2 -0
  333. package/dist/index.d.ts.map +1 -0
  334. package/dist/index.js +2 -0
  335. package/dist/index.js.map +1 -0
  336. package/dist/prompts/searchable-multi-select.d.ts +28 -0
  337. package/dist/prompts/searchable-multi-select.d.ts.map +1 -0
  338. package/dist/prompts/searchable-multi-select.js +158 -0
  339. package/dist/prompts/searchable-multi-select.js.map +1 -0
  340. package/dist/ui/welcome-screen.d.ts +5 -0
  341. package/dist/ui/welcome-screen.d.ts.map +1 -0
  342. package/dist/ui/welcome-screen.js +22 -0
  343. package/dist/ui/welcome-screen.js.map +1 -0
  344. package/dist/utils/change-metadata.d.ts +55 -0
  345. package/dist/utils/change-metadata.d.ts.map +1 -0
  346. package/dist/utils/change-metadata.js +141 -0
  347. package/dist/utils/change-metadata.js.map +1 -0
  348. package/dist/utils/change-utils.d.ts +73 -0
  349. package/dist/utils/change-utils.d.ts.map +1 -0
  350. package/dist/utils/change-utils.js +194 -0
  351. package/dist/utils/change-utils.js.map +1 -0
  352. package/dist/utils/command-references.d.ts +18 -0
  353. package/dist/utils/command-references.d.ts.map +1 -0
  354. package/dist/utils/command-references.js +20 -0
  355. package/dist/utils/command-references.js.map +1 -0
  356. package/dist/utils/file-system.d.ts +41 -0
  357. package/dist/utils/file-system.d.ts.map +1 -0
  358. package/dist/utils/file-system.js +320 -0
  359. package/dist/utils/file-system.js.map +1 -0
  360. package/dist/utils/index.d.ts +6 -0
  361. package/dist/utils/index.d.ts.map +1 -0
  362. package/dist/utils/index.js +9 -0
  363. package/dist/utils/index.js.map +1 -0
  364. package/dist/utils/interactive.d.ts +18 -0
  365. package/dist/utils/interactive.d.ts.map +1 -0
  366. package/dist/utils/interactive.js +21 -0
  367. package/dist/utils/interactive.js.map +1 -0
  368. package/dist/utils/item-discovery.d.ts +14 -0
  369. package/dist/utils/item-discovery.d.ts.map +1 -0
  370. package/dist/utils/item-discovery.js +104 -0
  371. package/dist/utils/item-discovery.js.map +1 -0
  372. package/dist/utils/link.d.ts +22 -0
  373. package/dist/utils/link.d.ts.map +1 -0
  374. package/dist/utils/link.js +85 -0
  375. package/dist/utils/link.js.map +1 -0
  376. package/dist/utils/match.d.ts +3 -0
  377. package/dist/utils/match.d.ts.map +1 -0
  378. package/dist/utils/match.js +22 -0
  379. package/dist/utils/match.js.map +1 -0
  380. package/dist/utils/shell-detection.d.ts +20 -0
  381. package/dist/utils/shell-detection.d.ts.map +1 -0
  382. package/dist/utils/shell-detection.js +41 -0
  383. package/dist/utils/shell-detection.js.map +1 -0
  384. package/dist/utils/task-progress.d.ts +32 -0
  385. package/dist/utils/task-progress.d.ts.map +1 -0
  386. package/dist/utils/task-progress.js +129 -0
  387. package/dist/utils/task-progress.js.map +1 -0
  388. package/dist/utils/timestamp.d.ts +9 -0
  389. package/dist/utils/timestamp.d.ts.map +1 -0
  390. package/dist/utils/timestamp.js +18 -0
  391. package/dist/utils/timestamp.js.map +1 -0
  392. package/package.json +55 -0
  393. package/schemas/issue/schema.yaml +34 -0
  394. package/schemas/issue/templates/spec.md +13 -0
  395. package/schemas/issue/templates/task.md +21 -0
  396. package/schemas/issue/templates/ticket.md +2 -0
  397. package/schemas/sdd/schema.yaml +55 -0
  398. package/schemas/sdd/templates/design.md +15 -0
  399. package/schemas/sdd/templates/proposal.md +15 -0
  400. package/schemas/sdd/templates/spec.md +13 -0
  401. package/schemas/sdd/templates/tasks.md +11 -0
  402. package/schemas/sdd/templates/ticket.md +2 -0
@@ -0,0 +1,585 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ import { getTaskProgressForChange, formatTaskStatus } from '../utils/task-progress.js';
4
+ import { Validator } from './validation/validator.js';
5
+ import { deltaSpecsRequired, validateArtifactSections } from '../commands/validate.js';
6
+ import { isRootSelectionError, resolveTospecRoot, toRootOutput, } from './root-selection.js';
7
+ import { findSpecUpdates, buildUpdatedSpec, writeUpdatedSpec, } from './specs-apply.js';
8
+ import { formatTimestamp } from '../utils/timestamp.js';
9
+ import { findTicketPath } from '../utils/item-discovery.js';
10
+ /**
11
+ * Archive directory names are always CLI-generated from this — agents must
12
+ * never assemble the timestamp themselves. Alias of the shared
13
+ * `formatTimestamp` (ticket filenames use the same helper).
14
+ */
15
+ export const formatArchiveStamp = formatTimestamp;
16
+ /**
17
+ * Extracts the first `結論: PASS|FAIL` conclusion line from a sync-report.md
18
+ * body, per the format `tospec-sync`'s instruction produces. Returns null
19
+ * when no conclusion line is found (unparseable report).
20
+ */
21
+ export function parseSyncReportConclusion(content) {
22
+ const conclusionLine = content
23
+ .split(/\r?\n/)
24
+ .map((line) => line.trim())
25
+ .find((line) => line.startsWith('結論:'));
26
+ if (!conclusionLine)
27
+ return null;
28
+ // Reject an unfilled template such as `結論: PASS | FAIL`; only an
29
+ // unambiguous conclusion (optionally followed by a parenthetical note) is
30
+ // machine-authoritative enough to open the archive gate.
31
+ const match = conclusionLine.match(/^結論:\s*(PASS|FAIL)(?:\s*\([^)]*\))?\s*$/);
32
+ return match ? match[1] : null;
33
+ }
34
+ async function listActiveChangeNames(changesDir) {
35
+ try {
36
+ const entries = await fs.readdir(changesDir, { withFileTypes: true });
37
+ return entries
38
+ .filter((entry) => entry.isDirectory() && entry.name !== 'archive')
39
+ .map((entry) => entry.name)
40
+ .sort();
41
+ }
42
+ catch {
43
+ return [];
44
+ }
45
+ }
46
+ /**
47
+ * JSON mode is non-interactive: any point where the human flow would prompt or
48
+ * print prose instead throws this error, which becomes a machine-readable
49
+ * status entry with a non-zero exit code.
50
+ */
51
+ class ArchiveBlockedError extends Error {
52
+ diagnostic;
53
+ constructor(code, message, fix) {
54
+ super(message);
55
+ this.name = 'ArchiveBlockedError';
56
+ this.diagnostic = {
57
+ severity: 'error',
58
+ code,
59
+ message,
60
+ ...(fix ? { fix } : {}),
61
+ };
62
+ }
63
+ }
64
+ function toArchiveDiagnostic(error) {
65
+ if (error instanceof ArchiveBlockedError) {
66
+ return error.diagnostic;
67
+ }
68
+ if (isRootSelectionError(error)) {
69
+ return error.diagnostic;
70
+ }
71
+ return {
72
+ severity: 'error',
73
+ code: 'archive_error',
74
+ message: error instanceof Error ? error.message : String(error),
75
+ };
76
+ }
77
+ /**
78
+ * Recursively copy a directory. Used when fs.rename fails (e.g. EPERM on Windows).
79
+ */
80
+ async function copyDirRecursive(src, dest) {
81
+ await fs.mkdir(dest, { recursive: true });
82
+ const entries = await fs.readdir(src, { withFileTypes: true });
83
+ for (const entry of entries) {
84
+ const srcPath = path.join(src, entry.name);
85
+ const destPath = path.join(dest, entry.name);
86
+ if (entry.isDirectory()) {
87
+ await copyDirRecursive(srcPath, destPath);
88
+ }
89
+ else {
90
+ await fs.copyFile(srcPath, destPath);
91
+ }
92
+ }
93
+ }
94
+ /**
95
+ * Move a directory from src to dest. On Windows, fs.rename() often fails with
96
+ * EPERM when the directory is non-empty or another process has it open (IDE,
97
+ * file watcher, antivirus). Fall back to copy-then-remove when rename fails
98
+ * with EPERM or EXDEV.
99
+ */
100
+ async function moveDirectory(src, dest) {
101
+ try {
102
+ await fs.rename(src, dest);
103
+ }
104
+ catch (err) {
105
+ const code = err?.code;
106
+ if (code === 'EPERM' || code === 'EXDEV') {
107
+ await copyDirRecursive(src, dest);
108
+ await fs.rm(src, { recursive: true, force: true });
109
+ }
110
+ else {
111
+ throw err;
112
+ }
113
+ }
114
+ }
115
+ /**
116
+ * After a ticket moves into tickets/archive/, its `ref` still points at the
117
+ * change's pre-archive location. Rewrite the `ref:` frontmatter line to the
118
+ * archived change path (project-root-relative), keeping the referenced filename
119
+ * (proposal.md or task.md). No-op if the line is absent or has no path.
120
+ */
121
+ async function retargetTicketRef(ticketFile, archiveName) {
122
+ const content = await fs.readFile(ticketFile, 'utf-8');
123
+ const updated = content.replace(/^(ref:[ \t]*).*\/([^/\r\n]+)[ \t]*$/m, `$1tospec/changes/archive/${archiveName}/$2`);
124
+ if (updated !== content) {
125
+ await fs.writeFile(ticketFile, updated);
126
+ }
127
+ }
128
+ /** Like moveDirectory but for a single file (copyFile fallback on Windows EPERM/EXDEV). */
129
+ async function moveFile(src, dest) {
130
+ try {
131
+ await fs.rename(src, dest);
132
+ }
133
+ catch (err) {
134
+ const code = err?.code;
135
+ if (code === 'EPERM' || code === 'EXDEV') {
136
+ await fs.copyFile(src, dest);
137
+ await fs.rm(src, { force: true });
138
+ }
139
+ else {
140
+ throw err;
141
+ }
142
+ }
143
+ }
144
+ export class ArchiveCommand {
145
+ async execute(changeName, options = {}) {
146
+ const json = !!options.json;
147
+ let root;
148
+ try {
149
+ root = await resolveTospecRoot();
150
+ }
151
+ catch (error) {
152
+ if (json && isRootSelectionError(error)) {
153
+ this.printJsonFailure(undefined, toArchiveDiagnostic(error));
154
+ return;
155
+ }
156
+ throw error;
157
+ }
158
+ if (json) {
159
+ try {
160
+ const result = await this.run(changeName, options, root, true);
161
+ if (!result) {
162
+ return;
163
+ }
164
+ console.log(JSON.stringify({ archive: result, root: toRootOutput(root) }, null, 2));
165
+ }
166
+ catch (error) {
167
+ this.printJsonFailure(root, toArchiveDiagnostic(error));
168
+ }
169
+ return;
170
+ }
171
+ await this.run(changeName, options, root, false);
172
+ }
173
+ printJsonFailure(root, diagnostic) {
174
+ console.log(JSON.stringify({
175
+ archive: null,
176
+ ...(root ? { root: toRootOutput(root) } : {}),
177
+ status: [diagnostic],
178
+ }, null, 2));
179
+ process.exitCode = 1;
180
+ }
181
+ /**
182
+ * Shared archive flow. In human mode (json=false) prompts and prose match
183
+ * the historical behavior and cancellations return null. In JSON mode no
184
+ * prose reaches stdout and every blocked path throws.
185
+ */
186
+ async run(changeName, options, root, json) {
187
+ const changesDir = root.changesDir;
188
+ const archiveDir = root.archiveDir;
189
+ const mainSpecsDir = root.specsDir;
190
+ // Check if changes directory exists
191
+ try {
192
+ await fs.access(changesDir);
193
+ }
194
+ catch {
195
+ throw new Error("No Tospec changes directory found. Run 'tospec init' first.");
196
+ }
197
+ // Get change name interactively if not provided
198
+ if (!changeName) {
199
+ if (json) {
200
+ throw new ArchiveBlockedError('archive_change_name_required', 'A change name is required: archive --json is non-interactive.', 'tospec archive <change-name> --json');
201
+ }
202
+ const selectedChange = await this.selectChange(changesDir);
203
+ if (!selectedChange) {
204
+ console.log('No change selected. Aborting.');
205
+ return null;
206
+ }
207
+ changeName = selectedChange;
208
+ }
209
+ const changeDir = path.join(changesDir, changeName);
210
+ // Verify change exists
211
+ try {
212
+ const stat = await fs.stat(changeDir);
213
+ if (!stat.isDirectory()) {
214
+ throw new Error(`Change '${changeName}' not found.`);
215
+ }
216
+ }
217
+ catch {
218
+ const available = await listActiveChangeNames(changesDir);
219
+ throw new ArchiveBlockedError('archive_change_not_found', available.length > 0
220
+ ? `Change '${changeName}' not found. Available changes: ${available.join(', ')}`
221
+ : `Change '${changeName}' not found. No active changes exist in this root.`);
222
+ }
223
+ // --require-sync gate: the machine-checkable half of the tospec-sync
224
+ // workflow (the semantic half — does the report's content actually reflect
225
+ // reality — is the sync agent's job, not ours).
226
+ if (options.requireSync) {
227
+ const syncReportPath = path.join(changeDir, 'sync-report.md');
228
+ let syncReportContent;
229
+ try {
230
+ syncReportContent = await fs.readFile(syncReportPath, 'utf-8');
231
+ }
232
+ catch {
233
+ throw new ArchiveBlockedError('SYNC_REPORT_MISSING', `sync-report.md not found for change '${changeName}'.`, 'Run tospec-sync first, or omit --require-sync.');
234
+ }
235
+ const conclusion = parseSyncReportConclusion(syncReportContent);
236
+ if (conclusion !== 'PASS') {
237
+ throw new ArchiveBlockedError('SYNC_REPORT_FAILED', `sync-report.md for change '${changeName}' does not report a PASS conclusion (found: ${conclusion ?? 'unparseable'}).`, 'Resolve the flagged Requirement(s) via tospec-apply, then re-run tospec-sync.');
238
+ }
239
+ }
240
+ const skipValidation = options.validate === false || options.noValidate === true;
241
+ // Validate specs and change before archiving
242
+ if (!skipValidation) {
243
+ const validator = new Validator();
244
+ let hasValidationErrors = false;
245
+ // Validate proposal.md (informative only; human mode prints warnings)
246
+ if (!json) {
247
+ const changeFile = path.join(changeDir, 'proposal.md');
248
+ try {
249
+ await fs.access(changeFile);
250
+ const changeReport = await validator.validateChange(changeFile);
251
+ // Proposal validation is informative only (do not block archive)
252
+ if (!changeReport.valid) {
253
+ console.log(`\nProposal warnings in proposal.md (non-blocking):`);
254
+ for (const issue of changeReport.issues) {
255
+ const symbol = issue.level === 'ERROR' ? '⚠' : (issue.level === 'WARNING' ? '⚠' : 'ℹ');
256
+ console.log(` ${symbol} ${issue.message}`);
257
+ }
258
+ }
259
+ }
260
+ catch {
261
+ // Change file doesn't exist, skip validation
262
+ }
263
+ }
264
+ // Run the same schema-driven structural validation as `tospec validate`.
265
+ // Archive must not bypass required sections merely because it historically
266
+ // validated only proposal.md and delta specs.
267
+ const sectionIssues = await validateArtifactSections(root.path, changeDir);
268
+ const sectionErrors = sectionIssues.filter((issue) => issue.level === 'ERROR');
269
+ if (sectionErrors.length > 0) {
270
+ hasValidationErrors = true;
271
+ if (!json) {
272
+ console.log(`\nValidation errors in change artifacts:`);
273
+ for (const issue of sectionErrors) {
274
+ console.log(` ✗ ${issue.path}: ${issue.message}`);
275
+ }
276
+ }
277
+ }
278
+ // Validate delta-formatted spec files. A required specs artifact must be
279
+ // present; an optional one (issue workflow) may legitimately be absent.
280
+ const changeSpecsDir = path.join(changeDir, 'specs');
281
+ let hasDeltaSpecs = false;
282
+ try {
283
+ const candidates = await fs.readdir(changeSpecsDir, { withFileTypes: true });
284
+ for (const c of candidates) {
285
+ if (c.isDirectory()) {
286
+ try {
287
+ const candidatePath = path.join(changeSpecsDir, c.name, 'spec.md');
288
+ await fs.access(candidatePath);
289
+ const content = await fs.readFile(candidatePath, 'utf-8');
290
+ if (/^##\s+(ADDED|MODIFIED|REMOVED|RENAMED)\s+Requirements/m.test(content)) {
291
+ hasDeltaSpecs = true;
292
+ break;
293
+ }
294
+ }
295
+ catch { }
296
+ }
297
+ }
298
+ }
299
+ catch { }
300
+ const requireDeltaSpecs = await deltaSpecsRequired(root.path, changeDir);
301
+ if (hasDeltaSpecs || requireDeltaSpecs) {
302
+ const deltaReport = await validator.validateChangeDeltaSpecs(changeDir);
303
+ if (!deltaReport.valid) {
304
+ hasValidationErrors = true;
305
+ if (!json) {
306
+ console.log(`\nValidation errors in change delta specs:`);
307
+ for (const issue of deltaReport.issues) {
308
+ if (issue.level === 'ERROR') {
309
+ console.log(` ✗ ${issue.message}`);
310
+ }
311
+ else if (issue.level === 'WARNING') {
312
+ console.log(` ⚠ ${issue.message}`);
313
+ }
314
+ }
315
+ }
316
+ }
317
+ }
318
+ if (hasValidationErrors) {
319
+ if (json) {
320
+ throw new ArchiveBlockedError('archive_validation_failed', `Validation failed for change '${changeName}'.`, `Run ${`tospec validate ${changeName}`} for details, fix the errors, or rerun with --no-validate.`);
321
+ }
322
+ console.log('\nValidation failed. Please fix the errors before archiving.');
323
+ console.log('To skip validation (not recommended), use --no-validate flag.');
324
+ process.exitCode = 1;
325
+ return null;
326
+ }
327
+ }
328
+ else if (json) {
329
+ if (!options.yes) {
330
+ throw new ArchiveBlockedError('archive_confirmation_required', 'Skipping validation requires confirmation: rerun with --yes.', 'tospec archive <change-name> --json --no-validate --yes');
331
+ }
332
+ }
333
+ else {
334
+ // Log warning when validation is skipped
335
+ const timestamp = new Date().toISOString();
336
+ if (!options.yes) {
337
+ const { confirm } = await import('@inquirer/prompts');
338
+ const proceed = await confirm({
339
+ message: '⚠️ WARNING: Skipping validation may archive invalid specs. Continue? (y/N)',
340
+ default: false
341
+ });
342
+ if (!proceed) {
343
+ console.log('Archive cancelled.');
344
+ return null;
345
+ }
346
+ }
347
+ else {
348
+ console.log(`\n⚠️ WARNING: Skipping validation may archive invalid specs.`);
349
+ }
350
+ console.log(`[${timestamp}] Validation skipped for change: ${changeName}`);
351
+ console.log(`Affected files: ${changeDir}`);
352
+ }
353
+ // Show progress and check for incomplete tasks
354
+ const progress = await getTaskProgressForChange(changesDir, changeName, path.resolve(changesDir, '..', '..'));
355
+ if (!json) {
356
+ const status = formatTaskStatus(progress);
357
+ console.log(`Task status: ${status}`);
358
+ }
359
+ const incompleteTasks = Math.max(progress.total - progress.completed, 0);
360
+ const hasNoTrackedTasks = progress.total === 0;
361
+ if (hasNoTrackedTasks) {
362
+ if (json) {
363
+ if (!options.yes) {
364
+ throw new ArchiveBlockedError('archive_tasks_missing', `No tracked task checkboxes were found for change '${changeName}'.`, 'Create the schema-tracked tasks file with checkboxes, or rerun with --yes.');
365
+ }
366
+ }
367
+ else if (!options.yes) {
368
+ const { confirm } = await import('@inquirer/prompts');
369
+ const proceed = await confirm({
370
+ message: 'Warning: no tracked task checkboxes were found. Continue?',
371
+ default: false
372
+ });
373
+ if (!proceed) {
374
+ console.log('Archive cancelled.');
375
+ return null;
376
+ }
377
+ }
378
+ else {
379
+ console.log('Warning: no tracked task checkboxes were found. Continuing due to --yes flag.');
380
+ }
381
+ }
382
+ else if (incompleteTasks > 0) {
383
+ if (json) {
384
+ if (!options.yes) {
385
+ throw new ArchiveBlockedError('archive_tasks_incomplete', `${incompleteTasks} incomplete task(s) found for change '${changeName}'.`, 'Complete the tasks or rerun with --yes.');
386
+ }
387
+ }
388
+ else if (!options.yes) {
389
+ const { confirm } = await import('@inquirer/prompts');
390
+ const proceed = await confirm({
391
+ message: `Warning: ${incompleteTasks} incomplete task(s) found. Continue?`,
392
+ default: false
393
+ });
394
+ if (!proceed) {
395
+ console.log('Archive cancelled.');
396
+ return null;
397
+ }
398
+ }
399
+ else {
400
+ console.log(`Warning: ${incompleteTasks} incomplete task(s) found. Continuing due to --yes flag.`);
401
+ }
402
+ }
403
+ // Handle spec updates unless skipSpecs flag is set
404
+ let specsUpdated = false;
405
+ let totals;
406
+ if (options.skipSpecs) {
407
+ if (!json) {
408
+ console.log('Skipping spec updates (--skip-specs flag provided).');
409
+ }
410
+ }
411
+ else {
412
+ // Find specs to update
413
+ const specUpdates = await findSpecUpdates(changeDir, mainSpecsDir);
414
+ if (specUpdates.length > 0) {
415
+ if (!json) {
416
+ console.log('\nSpecs to update:');
417
+ for (const update of specUpdates) {
418
+ const status = update.exists ? 'update' : 'create';
419
+ const capability = path.basename(path.dirname(update.target));
420
+ console.log(` ${capability}: ${status}`);
421
+ }
422
+ }
423
+ let shouldUpdateSpecs = true;
424
+ if (!options.yes) {
425
+ if (json) {
426
+ throw new ArchiveBlockedError('archive_confirmation_required', `Updating ${specUpdates.length} spec(s) requires confirmation: rerun with --yes.`, 'tospec archive <change-name> --json --yes');
427
+ }
428
+ const { confirm } = await import('@inquirer/prompts');
429
+ shouldUpdateSpecs = await confirm({
430
+ message: 'Proceed with spec updates?',
431
+ default: true
432
+ });
433
+ if (!shouldUpdateSpecs) {
434
+ console.log('Skipping spec updates. Proceeding with archive.');
435
+ }
436
+ }
437
+ if (shouldUpdateSpecs) {
438
+ // Prepare all updates first (validation pass, no writes)
439
+ const prepared = [];
440
+ try {
441
+ for (const update of specUpdates) {
442
+ const built = await buildUpdatedSpec(update, changeName, { silent: json });
443
+ prepared.push({ update, rebuilt: built.rebuilt, counts: built.counts });
444
+ }
445
+ }
446
+ catch (err) {
447
+ if (json) {
448
+ throw new ArchiveBlockedError('archive_spec_update_failed', String(err.message || err), 'Fix the change delta specs and rerun. No files were changed.');
449
+ }
450
+ console.log(String(err.message || err));
451
+ console.log('Aborted. No files were changed.');
452
+ process.exitCode = 1;
453
+ return null;
454
+ }
455
+ // Validate every rebuilt spec before writing any of them, so a
456
+ // late validation failure really does leave all targets unchanged.
457
+ if (!skipValidation) {
458
+ for (const p of prepared) {
459
+ const specName = path.basename(path.dirname(p.update.target));
460
+ const report = await new Validator().validateSpecContent(specName, p.rebuilt);
461
+ if (!report.valid) {
462
+ if (json) {
463
+ throw new ArchiveBlockedError('archive_spec_validation_failed', `Rebuilt spec for '${specName}' failed validation. No files were changed.`, `Run ${`tospec validate ${specName}`} after fixing the change deltas.`);
464
+ }
465
+ console.log(`\nValidation errors in rebuilt spec for ${specName} (will not write changes):`);
466
+ for (const issue of report.issues) {
467
+ if (issue.level === 'ERROR')
468
+ console.log(` ✗ ${issue.message}`);
469
+ else if (issue.level === 'WARNING')
470
+ console.log(` ⚠ ${issue.message}`);
471
+ }
472
+ console.log('Aborted. No files were changed.');
473
+ process.exitCode = 1;
474
+ return null;
475
+ }
476
+ }
477
+ }
478
+ // All validations passed; write files and display counts
479
+ const writeTotals = { added: 0, modified: 0, removed: 0, renamed: 0 };
480
+ for (const p of prepared) {
481
+ await writeUpdatedSpec(p.update, p.rebuilt, p.counts, {
482
+ silent: json,
483
+ });
484
+ writeTotals.added += p.counts.added;
485
+ writeTotals.modified += p.counts.modified;
486
+ writeTotals.removed += p.counts.removed;
487
+ writeTotals.renamed += p.counts.renamed;
488
+ }
489
+ specsUpdated = true;
490
+ totals = writeTotals;
491
+ if (!json) {
492
+ console.log(`Totals: + ${writeTotals.added}, ~ ${writeTotals.modified}, - ${writeTotals.removed}, → ${writeTotals.renamed}`);
493
+ console.log('Specs updated successfully.');
494
+ }
495
+ }
496
+ }
497
+ }
498
+ // Create archive directory with date prefix
499
+ const archiveName = `${formatArchiveStamp(new Date())}-${changeName}`;
500
+ const archivePath = path.join(archiveDir, archiveName);
501
+ // Check if archive already exists
502
+ let archiveExists = false;
503
+ try {
504
+ await fs.access(archivePath);
505
+ archiveExists = true;
506
+ }
507
+ catch (error) {
508
+ if (error.code !== 'ENOENT') {
509
+ throw error;
510
+ }
511
+ }
512
+ if (archiveExists) {
513
+ throw new ArchiveBlockedError('archive_target_exists', `Archive '${archiveName}' already exists.`);
514
+ }
515
+ // Create archive directory if needed
516
+ await fs.mkdir(archiveDir, { recursive: true });
517
+ // Move change to archive (uses copy+remove on EPERM/EXDEV, e.g. Windows)
518
+ await moveDirectory(changeDir, archivePath);
519
+ // The change's ticket lives in the global tospec/tickets/ index (outside the
520
+ // change dir), so move it alongside into tickets/archive/ to keep the active
521
+ // index limited to in-flight changes.
522
+ const ticketPath = await findTicketPath(root.path, changeName);
523
+ if (ticketPath) {
524
+ const ticketArchiveDir = path.join(root.path, 'tospec', 'tickets', 'archive');
525
+ await fs.mkdir(ticketArchiveDir, { recursive: true });
526
+ const archivedTicketPath = path.join(ticketArchiveDir, path.basename(ticketPath));
527
+ await moveFile(ticketPath, archivedTicketPath);
528
+ await retargetTicketRef(archivedTicketPath, archiveName);
529
+ }
530
+ if (!json) {
531
+ console.log(`Change '${changeName}' archived as '${archiveName}'.`);
532
+ }
533
+ return {
534
+ change: changeName,
535
+ archivedAs: archiveName,
536
+ path: archivePath,
537
+ specsUpdated,
538
+ ...(totals ? { totals } : {}),
539
+ };
540
+ }
541
+ async selectChange(changesDir) {
542
+ const { select } = await import('@inquirer/prompts');
543
+ // Get all directories in changes (excluding archive)
544
+ const entries = await fs.readdir(changesDir, { withFileTypes: true });
545
+ const changeDirs = entries
546
+ .filter(entry => entry.isDirectory() && entry.name !== 'archive')
547
+ .map(entry => entry.name)
548
+ .sort();
549
+ if (changeDirs.length === 0) {
550
+ console.log('No active changes found.');
551
+ return null;
552
+ }
553
+ // Build choices with progress inline to avoid duplicate lists
554
+ let choices = changeDirs.map(name => ({ name, value: name }));
555
+ try {
556
+ const progressList = [];
557
+ for (const id of changeDirs) {
558
+ const progress = await getTaskProgressForChange(changesDir, id, path.resolve(changesDir, '..', '..'));
559
+ const status = formatTaskStatus(progress);
560
+ progressList.push({ id, status });
561
+ }
562
+ const nameWidth = Math.max(...progressList.map(p => p.id.length));
563
+ choices = progressList.map(p => ({
564
+ name: `${p.id.padEnd(nameWidth)} ${p.status}`,
565
+ value: p.id
566
+ }));
567
+ }
568
+ catch {
569
+ // If anything fails, fall back to simple names
570
+ choices = changeDirs.map(name => ({ name, value: name }));
571
+ }
572
+ try {
573
+ const answer = await select({
574
+ message: 'Select a change to archive',
575
+ choices
576
+ });
577
+ return answer;
578
+ }
579
+ catch (error) {
580
+ // User cancelled (Ctrl+C)
581
+ return null;
582
+ }
583
+ }
584
+ }
585
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/core/archive.ts"],"names":[],"mappings":"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"}