@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,194 @@
1
+ import path from 'path';
2
+ import { FileSystemUtils } from './file-system.js';
3
+ import { formatTimestamp } from './timestamp.js';
4
+ import { writeChangeMetadata, validateSchemaName } from './change-metadata.js';
5
+ import { readProjectConfig } from '../core/project-config.js';
6
+ import { resolveSchema, loadTemplate } from '../core/artifact-graph/index.js';
7
+ const DEFAULT_SCHEMA = 'sdd';
8
+ // sdd → requirement, issue → issue; custom schemas leave type unset.
9
+ const SCHEMA_TO_CHANGE_TYPE = {
10
+ sdd: 'requirement',
11
+ issue: 'issue',
12
+ };
13
+ /**
14
+ * Validates that a change name follows kebab-case conventions.
15
+ *
16
+ * Valid names:
17
+ * - Start with a lowercase letter
18
+ * - Contain only lowercase letters, numbers, and hyphens
19
+ * - Do not start or end with a hyphen
20
+ * - Do not contain consecutive hyphens
21
+ *
22
+ * @param name - The change name to validate
23
+ * @returns Validation result with `valid: true` or `valid: false` with an error message
24
+ *
25
+ * @example
26
+ * validateChangeName('add-auth') // { valid: true }
27
+ * validateChangeName('Add-Auth') // { valid: false, error: '...' }
28
+ */
29
+ export function validateChangeName(name) {
30
+ // Pattern: starts with lowercase letter, followed by lowercase letters/numbers,
31
+ // optionally followed by hyphen + lowercase letters/numbers (repeatable)
32
+ const kebabCasePattern = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;
33
+ if (!name) {
34
+ return { valid: false, error: 'Change name cannot be empty' };
35
+ }
36
+ if (!kebabCasePattern.test(name)) {
37
+ // Provide specific error messages for common mistakes
38
+ if (/[A-Z]/.test(name)) {
39
+ return { valid: false, error: 'Change name must be lowercase (use kebab-case)' };
40
+ }
41
+ if (/\s/.test(name)) {
42
+ return { valid: false, error: 'Change name cannot contain spaces (use hyphens instead)' };
43
+ }
44
+ if (/_/.test(name)) {
45
+ return { valid: false, error: 'Change name cannot contain underscores (use hyphens instead)' };
46
+ }
47
+ if (name.startsWith('-')) {
48
+ return { valid: false, error: 'Change name cannot start with a hyphen' };
49
+ }
50
+ if (name.endsWith('-')) {
51
+ return { valid: false, error: 'Change name cannot end with a hyphen' };
52
+ }
53
+ if (/--/.test(name)) {
54
+ return { valid: false, error: 'Change name cannot contain consecutive hyphens' };
55
+ }
56
+ if (/[^a-z0-9-]/.test(name)) {
57
+ return { valid: false, error: 'Change name can only contain lowercase letters, numbers, and hyphens' };
58
+ }
59
+ if (/^[0-9]/.test(name)) {
60
+ return { valid: false, error: 'Change name must start with a letter' };
61
+ }
62
+ return { valid: false, error: 'Change name must follow kebab-case convention (e.g., add-auth, refactor-db)' };
63
+ }
64
+ return { valid: true };
65
+ }
66
+ /**
67
+ * Creates a new change directory with metadata file.
68
+ *
69
+ * @param projectRoot - The root directory of the project (where `tospec/` lives)
70
+ * @param name - The change name (must be valid kebab-case)
71
+ * @param options - Optional settings for the change
72
+ * @throws Error if the change name is invalid
73
+ * @throws Error if the schema name is invalid
74
+ * @throws Error if the change directory already exists
75
+ *
76
+ * @returns Result containing the resolved schema name
77
+ *
78
+ * @example
79
+ * // Creates tospec/changes/add-auth/ with default schema
80
+ * const result = await createChange('/path/to/project', 'add-auth')
81
+ * console.log(result.schema) // 'sdd' or value from config
82
+ *
83
+ * @example
84
+ * // Creates tospec/changes/add-auth/ with custom schema
85
+ * const result = await createChange('/path/to/project', 'add-auth', { schema: 'my-workflow' })
86
+ * console.log(result.schema) // 'my-workflow'
87
+ */
88
+ export async function createChange(projectRoot, name, options = {}) {
89
+ // Validate the name first
90
+ const validation = validateChangeName(name);
91
+ if (!validation.valid) {
92
+ throw new Error(validation.error);
93
+ }
94
+ const defaultSchema = options.defaultSchema ?? DEFAULT_SCHEMA;
95
+ // Determine schema: explicit option → project config → supplied default
96
+ let schemaName;
97
+ if (options.schema) {
98
+ schemaName = options.schema;
99
+ }
100
+ else {
101
+ // Try to read from project config
102
+ try {
103
+ const config = readProjectConfig(projectRoot);
104
+ schemaName = config?.schema ?? defaultSchema;
105
+ }
106
+ catch {
107
+ // If config read fails, use default
108
+ schemaName = defaultSchema;
109
+ }
110
+ }
111
+ // Validate the resolved schema
112
+ validateSchemaName(schemaName, projectRoot);
113
+ // Build the change directory path
114
+ const changeDir = path.join(options.changesDir ?? path.join(projectRoot, 'tospec', 'changes'), name);
115
+ // Check if change already exists
116
+ if (await FileSystemUtils.directoryExists(changeDir)) {
117
+ throw new Error(`Change '${name}' already exists at ${changeDir}`);
118
+ }
119
+ // Creating a change may scaffold or complete the root itself (an
120
+ // implicit root, or a config-only/incomplete clone). Never leave a
121
+ // half-root behind that doctor immediately calls unhealthy: ensure
122
+ // specs/ and changes/archive/ exist, and write a config only when
123
+ // none exists. The config records the PROJECT default schema, never
124
+ // a one-change --schema override.
125
+ const tospecDir = path.join(projectRoot, 'tospec');
126
+ // Create the directory (including parent directories if needed)
127
+ await FileSystemUtils.createDirectory(changeDir);
128
+ await FileSystemUtils.createDirectory(path.join(tospecDir, 'specs'));
129
+ await FileSystemUtils.createDirectory(path.join(tospecDir, 'changes', 'archive'));
130
+ const configPath = path.join(tospecDir, 'config.yaml');
131
+ const configYmlPath = path.join(tospecDir, 'config.yml');
132
+ if (!(await FileSystemUtils.fileExists(configPath)) &&
133
+ !(await FileSystemUtils.fileExists(configYmlPath))) {
134
+ await FileSystemUtils.writeFile(configPath, `schema: ${defaultSchema}\n`);
135
+ }
136
+ // Write metadata file with schema and creation date
137
+ const today = new Date().toISOString().split('T')[0];
138
+ writeChangeMetadata(changeDir, {
139
+ schema: schemaName,
140
+ type: SCHEMA_TO_CHANGE_TYPE[schemaName],
141
+ created: today,
142
+ ...options.metadata,
143
+ }, projectRoot);
144
+ // Generate the ticket stub. The timestamped filename (and its `date` header)
145
+ // are CLI-generated — agents can't reliably reproduce the timestamp.
146
+ await writeTicketStub(projectRoot, name, schemaName, options.description);
147
+ return { schema: schemaName, changeDir };
148
+ }
149
+ /**
150
+ * Writes a ticket stub into the global `tospec/tickets/<yyyyMMdd_HHmmss>-<name>.md`
151
+ * index (outside the change dir). A schema opts in by shipping a `ticket.md`
152
+ * template; schemas without one (e.g. custom schemas) are skipped. The stub
153
+ * carries a yaml header (title/date/type/change/ref) generated here plus the
154
+ * template body. `change:` links the ticket back to its change; `ref` points
155
+ * from tospec/tickets/ at where the change's detail lives (proposal.md or task.md).
156
+ * When `description` is given it replaces the template's `## Summary` placeholder.
157
+ */
158
+ async function writeTicketStub(projectRoot, name, schemaName, description) {
159
+ let schema;
160
+ try {
161
+ schema = resolveSchema(schemaName, projectRoot);
162
+ }
163
+ catch {
164
+ return; // schema unresolvable — nothing to scaffold
165
+ }
166
+ // A schema opts into the global ticket index by shipping a ticket.md template.
167
+ let body;
168
+ try {
169
+ body = loadTemplate(schemaName, 'ticket.md', projectRoot);
170
+ }
171
+ catch {
172
+ return; // no ticket template — this schema doesn't use tickets
173
+ }
174
+ // Fill the `## Summary` placeholder with the provided description; a function
175
+ // replacer keeps `$`-sequences in the text literal. No description → the
176
+ // placeholder stays for the workflow agent to edit.
177
+ const summary = description?.trim();
178
+ if (summary) {
179
+ body = body.replace(/(##[ \t]*Summary[ \t]*\r?\n)\[[^\]]*\]/, (_m, head) => head + summary);
180
+ }
181
+ const stamp = formatTimestamp(new Date());
182
+ const ticketPath = path.join(projectRoot, 'tospec', 'tickets', `${stamp}-${name}.md`);
183
+ // ref points at where the change's details live: proposal.md (sdd) or task.md,
184
+ // as a project-root-relative path (stable whether the ticket sits in
185
+ // tospec/tickets/ or, once archived, tospec/tickets/archive/).
186
+ const hasProposal = schema.artifacts.some((a) => a.id === 'proposal');
187
+ const ref = hasProposal ? `tospec/changes/${name}/proposal.md` : `tospec/changes/${name}/task.md`;
188
+ // date is quoted so yaml keeps it a string (bare yyyyMMdd_HHmmss would parse
189
+ // as an underscore-separated integer under yaml 1.1).
190
+ const header = `---\ntitle: ${name}\ndate: "${stamp}"\ntype: ${schemaName}\nchange: ${name}\nref: ${ref}\n---\n\n`;
191
+ await FileSystemUtils.createDirectory(path.join(projectRoot, 'tospec', 'tickets'));
192
+ await FileSystemUtils.writeFile(ticketPath, header + body);
193
+ }
194
+ //# sourceMappingURL=change-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-utils.js","sourceRoot":"","sources":["../../src/utils/change-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Command Reference Utilities
3
+ *
4
+ * Utilities for transforming command references to tool-specific formats.
5
+ */
6
+ /**
7
+ * Transforms colon-based command references to hyphen-based format.
8
+ * Converts `tospec-` patterns to `/tospec-` for tools that use hyphen syntax.
9
+ *
10
+ * @param text - The text containing command references
11
+ * @returns Text with command references transformed to hyphen format
12
+ *
13
+ * @example
14
+ * transformToHyphenCommands('tospec-new') // returns '/tospec-new'
15
+ * transformToHyphenCommands('Use tospec-apply to implement') // returns 'Use /tospec-apply to implement'
16
+ */
17
+ export declare function transformToHyphenCommands(text: string): string;
18
+ //# sourceMappingURL=command-references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-references.d.ts","sourceRoot":"","sources":["../../src/utils/command-references.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Command Reference Utilities
3
+ *
4
+ * Utilities for transforming command references to tool-specific formats.
5
+ */
6
+ /**
7
+ * Transforms colon-based command references to hyphen-based format.
8
+ * Converts `tospec-` patterns to `/tospec-` for tools that use hyphen syntax.
9
+ *
10
+ * @param text - The text containing command references
11
+ * @returns Text with command references transformed to hyphen format
12
+ *
13
+ * @example
14
+ * transformToHyphenCommands('tospec-new') // returns '/tospec-new'
15
+ * transformToHyphenCommands('Use tospec-apply to implement') // returns 'Use /tospec-apply to implement'
16
+ */
17
+ export function transformToHyphenCommands(text) {
18
+ return text.replace(/\tospec-/g, '/tospec-');
19
+ }
20
+ //# sourceMappingURL=command-references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-references.js","sourceRoot":"","sources":["../../src/utils/command-references.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,41 @@
1
+ export declare class FileSystemUtils {
2
+ /**
3
+ * Converts a path to use forward slashes (POSIX style).
4
+ * Essential for cross-platform compatibility with glob libraries like fast-glob.
5
+ */
6
+ static toPosixPath(p: string): string;
7
+ /**
8
+ * Returns a canonical absolute path when the target exists.
9
+ * Falls back to path.resolve() so callers can still produce a stable absolute path.
10
+ */
11
+ static canonicalizeExistingPath(targetPath: string): string;
12
+ private static isWindowsBasePath;
13
+ private static normalizeSegments;
14
+ static joinPath(basePath: string, ...segments: string[]): string;
15
+ static createDirectory(dirPath: string): Promise<void>;
16
+ static fileExists(filePath: string): Promise<boolean>;
17
+ /**
18
+ * Finds the first existing parent directory by walking up the directory tree.
19
+ * @param dirPath Starting directory path
20
+ * @returns The first existing directory path, or null if root is reached without finding one
21
+ */
22
+ private static findFirstExistingDirectory;
23
+ static canWriteFile(filePath: string): Promise<boolean>;
24
+ static directoryExists(dirPath: string): Promise<boolean>;
25
+ static writeFile(filePath: string, content: string): Promise<void>;
26
+ static readFile(filePath: string): Promise<string>;
27
+ static updateFileWithMarkers(filePath: string, content: string, startMarker: string, endMarker: string): Promise<void>;
28
+ static ensureWritePermissions(dirPath: string): Promise<boolean>;
29
+ }
30
+ /**
31
+ * Removes a marker block from file content.
32
+ * Only removes markers that are on their own lines (ignores inline mentions).
33
+ * Cleans up double blank lines that may result from removal.
34
+ *
35
+ * @param content - File content with markers
36
+ * @param startMarker - The start marker string
37
+ * @param endMarker - The end marker string
38
+ * @returns Content with marker block removed, or original content if markers not found/invalid
39
+ */
40
+ export declare function removeMarkerBlock(content: string, startMarker: string, endMarker: string): string;
41
+ //# sourceMappingURL=file-system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-system.d.ts","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"AAgFA,qBAAa,eAAe;IAC1B;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAIrC;;;OAGG;IACH,MAAM,CAAC,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAa3D,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAIhC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAMhC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM;WAiBnD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAI/C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY3D;;;;OAIG;mBACkB,0BAA0B;WA8BlC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAiChD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAYlD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;WAM3D,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;WAI3C,qBAAqB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;WAiCH,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAsCvE;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,MAAM,CAuCR"}
@@ -0,0 +1,320 @@
1
+ import * as nodeFs from 'fs';
2
+ import path from 'path';
3
+ const fs = nodeFs.promises;
4
+ const { constants: fsConstants } = nodeFs;
5
+ function hasOwnerGroupOrOtherWriteBit(stats) {
6
+ return (stats.mode & 0o222) !== 0;
7
+ }
8
+ function hasOwnerGroupOrOtherExecuteBit(stats) {
9
+ return (stats.mode & 0o111) !== 0;
10
+ }
11
+ async function hasWritableModeAndAccess(targetPath) {
12
+ try {
13
+ const stats = await fs.stat(targetPath);
14
+ // POSIX root can often write despite mode bits, but Tospec should respect
15
+ // explicit read-only file/directory modes when deciding whether an install
16
+ // path is user-writable. This also keeps permission checks deterministic in
17
+ // root-run CI containers. On Windows, chmod mode bits are not authoritative,
18
+ // so rely on fs.access below.
19
+ if (process.platform !== 'win32' && !hasOwnerGroupOrOtherWriteBit(stats)) {
20
+ return false;
21
+ }
22
+ if (process.platform !== 'win32' && stats.isDirectory() && !hasOwnerGroupOrOtherExecuteBit(stats)) {
23
+ return false;
24
+ }
25
+ const accessMode = stats.isDirectory()
26
+ ? fsConstants.W_OK | fsConstants.X_OK
27
+ : fsConstants.W_OK;
28
+ await fs.access(targetPath, accessMode);
29
+ return true;
30
+ }
31
+ catch {
32
+ return false;
33
+ }
34
+ }
35
+ function isMarkerOnOwnLine(content, markerIndex, markerLength) {
36
+ let leftIndex = markerIndex - 1;
37
+ while (leftIndex >= 0 && content[leftIndex] !== '\n') {
38
+ const char = content[leftIndex];
39
+ if (char !== ' ' && char !== '\t' && char !== '\r') {
40
+ return false;
41
+ }
42
+ leftIndex--;
43
+ }
44
+ let rightIndex = markerIndex + markerLength;
45
+ while (rightIndex < content.length && content[rightIndex] !== '\n') {
46
+ const char = content[rightIndex];
47
+ if (char !== ' ' && char !== '\t' && char !== '\r') {
48
+ return false;
49
+ }
50
+ rightIndex++;
51
+ }
52
+ return true;
53
+ }
54
+ function findMarkerIndex(content, marker, fromIndex = 0) {
55
+ let currentIndex = content.indexOf(marker, fromIndex);
56
+ while (currentIndex !== -1) {
57
+ if (isMarkerOnOwnLine(content, currentIndex, marker.length)) {
58
+ return currentIndex;
59
+ }
60
+ currentIndex = content.indexOf(marker, currentIndex + marker.length);
61
+ }
62
+ return -1;
63
+ }
64
+ export class FileSystemUtils {
65
+ /**
66
+ * Converts a path to use forward slashes (POSIX style).
67
+ * Essential for cross-platform compatibility with glob libraries like fast-glob.
68
+ */
69
+ static toPosixPath(p) {
70
+ return p.replace(/\\/g, '/');
71
+ }
72
+ /**
73
+ * Returns a canonical absolute path when the target exists.
74
+ * Falls back to path.resolve() so callers can still produce a stable absolute path.
75
+ */
76
+ static canonicalizeExistingPath(targetPath) {
77
+ try {
78
+ // Prefer the native resolver so Windows short-path aliases are expanded.
79
+ return nodeFs.realpathSync.native(targetPath);
80
+ }
81
+ catch {
82
+ try {
83
+ return nodeFs.realpathSync(targetPath);
84
+ }
85
+ catch {
86
+ return path.resolve(targetPath);
87
+ }
88
+ }
89
+ }
90
+ static isWindowsBasePath(basePath) {
91
+ return /^[A-Za-z]:[\\/]/.test(basePath) || basePath.startsWith('\\');
92
+ }
93
+ static normalizeSegments(segments) {
94
+ return segments
95
+ .flatMap((segment) => segment.split(/[\\/]+/u))
96
+ .filter((part) => part.length > 0);
97
+ }
98
+ static joinPath(basePath, ...segments) {
99
+ const normalizedSegments = this.normalizeSegments(segments);
100
+ if (this.isWindowsBasePath(basePath)) {
101
+ const normalizedBasePath = path.win32.normalize(basePath);
102
+ return normalizedSegments.length
103
+ ? path.win32.join(normalizedBasePath, ...normalizedSegments)
104
+ : normalizedBasePath;
105
+ }
106
+ const posixBasePath = basePath.replace(/\\/g, '/');
107
+ return normalizedSegments.length
108
+ ? path.posix.join(posixBasePath, ...normalizedSegments)
109
+ : path.posix.normalize(posixBasePath);
110
+ }
111
+ static async createDirectory(dirPath) {
112
+ await fs.mkdir(dirPath, { recursive: true });
113
+ }
114
+ static async fileExists(filePath) {
115
+ try {
116
+ await fs.access(filePath);
117
+ return true;
118
+ }
119
+ catch (error) {
120
+ if (error.code !== 'ENOENT') {
121
+ console.debug(`Unable to check if file exists at ${filePath}: ${error.message}`);
122
+ }
123
+ return false;
124
+ }
125
+ }
126
+ /**
127
+ * Finds the first existing parent directory by walking up the directory tree.
128
+ * @param dirPath Starting directory path
129
+ * @returns The first existing directory path, or null if root is reached without finding one
130
+ */
131
+ static async findFirstExistingDirectory(dirPath) {
132
+ let currentDir = dirPath;
133
+ while (true) {
134
+ try {
135
+ const stats = await fs.stat(currentDir);
136
+ if (stats.isDirectory()) {
137
+ return currentDir;
138
+ }
139
+ // Path component exists but is not a directory (edge case)
140
+ console.debug(`Path component ${currentDir} exists but is not a directory`);
141
+ return null;
142
+ }
143
+ catch (error) {
144
+ if (error.code === 'ENOENT') {
145
+ // Directory doesn't exist, move up one level
146
+ const parentDir = path.dirname(currentDir);
147
+ if (parentDir === currentDir) {
148
+ // Reached filesystem root without finding existing directory
149
+ return null;
150
+ }
151
+ currentDir = parentDir;
152
+ }
153
+ else {
154
+ // Unexpected error (permissions, I/O error, etc.)
155
+ console.debug(`Error checking directory ${currentDir}: ${error.message}`);
156
+ return null;
157
+ }
158
+ }
159
+ }
160
+ }
161
+ static async canWriteFile(filePath) {
162
+ try {
163
+ const stats = await fs.stat(filePath);
164
+ if (stats.isDirectory()) {
165
+ return hasWritableModeAndAccess(filePath);
166
+ }
167
+ if (!stats.isFile()) {
168
+ return true;
169
+ }
170
+ return hasWritableModeAndAccess(filePath);
171
+ }
172
+ catch (error) {
173
+ if (error.code === 'ENOENT') {
174
+ // File doesn't exist - find first existing parent directory and check its permissions
175
+ const parentDir = path.dirname(filePath);
176
+ const existingDir = await this.findFirstExistingDirectory(parentDir);
177
+ if (existingDir === null) {
178
+ // No existing parent directory found (edge case)
179
+ return false;
180
+ }
181
+ // Check if the existing parent directory is writable.
182
+ return hasWritableModeAndAccess(existingDir);
183
+ }
184
+ console.debug(`Unable to determine write permissions for ${filePath}: ${error.message}`);
185
+ return false;
186
+ }
187
+ }
188
+ static async directoryExists(dirPath) {
189
+ try {
190
+ const stats = await fs.stat(dirPath);
191
+ return stats.isDirectory();
192
+ }
193
+ catch (error) {
194
+ if (error.code !== 'ENOENT') {
195
+ console.debug(`Unable to check if directory exists at ${dirPath}: ${error.message}`);
196
+ }
197
+ return false;
198
+ }
199
+ }
200
+ static async writeFile(filePath, content) {
201
+ const dir = path.dirname(filePath);
202
+ await this.createDirectory(dir);
203
+ await fs.writeFile(filePath, content, 'utf-8');
204
+ }
205
+ static async readFile(filePath) {
206
+ return await fs.readFile(filePath, 'utf-8');
207
+ }
208
+ static async updateFileWithMarkers(filePath, content, startMarker, endMarker) {
209
+ let existingContent = '';
210
+ if (await this.fileExists(filePath)) {
211
+ existingContent = await this.readFile(filePath);
212
+ const startIndex = findMarkerIndex(existingContent, startMarker);
213
+ const endIndex = startIndex !== -1
214
+ ? findMarkerIndex(existingContent, endMarker, startIndex + startMarker.length)
215
+ : findMarkerIndex(existingContent, endMarker);
216
+ if (startIndex !== -1 && endIndex !== -1) {
217
+ if (endIndex < startIndex) {
218
+ throw new Error(`Invalid marker state in ${filePath}. End marker appears before start marker.`);
219
+ }
220
+ const before = existingContent.substring(0, startIndex);
221
+ const after = existingContent.substring(endIndex + endMarker.length);
222
+ existingContent = before + startMarker + '\n' + content + '\n' + endMarker + after;
223
+ }
224
+ else if (startIndex === -1 && endIndex === -1) {
225
+ existingContent = startMarker + '\n' + content + '\n' + endMarker + '\n\n' + existingContent;
226
+ }
227
+ else {
228
+ throw new Error(`Invalid marker state in ${filePath}. Found start: ${startIndex !== -1}, Found end: ${endIndex !== -1}`);
229
+ }
230
+ }
231
+ else {
232
+ existingContent = startMarker + '\n' + content + '\n' + endMarker;
233
+ }
234
+ await this.writeFile(filePath, existingContent);
235
+ }
236
+ static async ensureWritePermissions(dirPath) {
237
+ try {
238
+ // If directory doesn't exist, check parent directory permissions
239
+ if (!await this.directoryExists(dirPath)) {
240
+ const parentDir = path.dirname(dirPath);
241
+ if (!await this.directoryExists(parentDir)) {
242
+ await this.createDirectory(parentDir);
243
+ }
244
+ return await this.ensureWritePermissions(parentDir);
245
+ }
246
+ const testFile = path.join(dirPath, '.tospec-test-' + Date.now() + '-' + Math.random().toString(36).slice(2));
247
+ await fs.writeFile(testFile, '');
248
+ // On Windows, file may be temporarily locked by antivirus or indexing services.
249
+ // Retry unlink with a small delay if it fails.
250
+ const maxRetries = 3;
251
+ for (let attempt = 0; attempt < maxRetries; attempt++) {
252
+ try {
253
+ await fs.unlink(testFile);
254
+ break;
255
+ }
256
+ catch (unlinkError) {
257
+ if (attempt === maxRetries - 1) {
258
+ // Last attempt failed, but we successfully wrote the file, so permissions are OK
259
+ // Just log and continue - the temp file will be cleaned up eventually
260
+ console.debug(`Could not clean up test file ${testFile}: ${unlinkError.message}`);
261
+ }
262
+ else {
263
+ // Wait briefly before retrying (Windows file lock release)
264
+ await new Promise((resolve) => setTimeout(resolve, 50));
265
+ }
266
+ }
267
+ }
268
+ return true;
269
+ }
270
+ catch (error) {
271
+ console.debug(`Insufficient permissions to write to ${dirPath}: ${error.message}`);
272
+ return false;
273
+ }
274
+ }
275
+ }
276
+ /**
277
+ * Removes a marker block from file content.
278
+ * Only removes markers that are on their own lines (ignores inline mentions).
279
+ * Cleans up double blank lines that may result from removal.
280
+ *
281
+ * @param content - File content with markers
282
+ * @param startMarker - The start marker string
283
+ * @param endMarker - The end marker string
284
+ * @returns Content with marker block removed, or original content if markers not found/invalid
285
+ */
286
+ export function removeMarkerBlock(content, startMarker, endMarker) {
287
+ const startIndex = findMarkerIndex(content, startMarker);
288
+ const endIndex = startIndex !== -1
289
+ ? findMarkerIndex(content, endMarker, startIndex + startMarker.length)
290
+ : findMarkerIndex(content, endMarker);
291
+ if (startIndex === -1 || endIndex === -1 || endIndex <= startIndex) {
292
+ return content;
293
+ }
294
+ // Find the start of the line containing the start marker
295
+ let lineStart = startIndex;
296
+ while (lineStart > 0 && content[lineStart - 1] !== '\n') {
297
+ lineStart--;
298
+ }
299
+ // Find the end of the line containing the end marker
300
+ let lineEnd = endIndex + endMarker.length;
301
+ while (lineEnd < content.length && content[lineEnd] !== '\n') {
302
+ lineEnd++;
303
+ }
304
+ // Include the trailing newline if present
305
+ if (lineEnd < content.length && content[lineEnd] === '\n') {
306
+ lineEnd++;
307
+ }
308
+ const before = content.substring(0, lineStart);
309
+ const after = content.substring(lineEnd);
310
+ // Clean up double blank lines (handle both Unix \n and Windows \r\n)
311
+ let result = before + after;
312
+ result = result.replace(/(\r?\n){3,}/g, '\n\n');
313
+ // Trim trailing whitespace but preserve leading whitespace and original newline style
314
+ if (result.trimEnd() === '') {
315
+ return '';
316
+ }
317
+ const newline = content.includes('\r\n') ? '\r\n' : '\n';
318
+ return result.trimEnd() + newline;
319
+ }
320
+ //# sourceMappingURL=file-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-system.js","sourceRoot":"","sources":["../../src/utils/file-system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { validateChangeName, createChange } from './change-utils.js';
2
+ export type { ValidationResult, CreateChangeOptions } from './change-utils.js';
3
+ export { readChangeMetadata, writeChangeMetadata, resolveSchemaForChange, validateSchemaName, ChangeMetadataError, } from './change-metadata.js';
4
+ export { FileSystemUtils, removeMarkerBlock } from './file-system.js';
5
+ export { transformToHyphenCommands } from './command-references.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACrE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC"}