@devtrack-solution/codesdd 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/.sdd/skills/curated/api-clean-flask-langgraph/SKILL.md +2751 -0
  2. package/.sdd/skills/curated/devtrack-api/SKILL.md +137 -0
  3. package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +4 -0
  4. package/.sdd/skills/curated/devtrack-api/references/application-presentation.md +381 -0
  5. package/.sdd/skills/curated/devtrack-api/references/architecture-governance.md +219 -0
  6. package/.sdd/skills/curated/devtrack-api/references/domain-modeling.md +359 -0
  7. package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +127 -0
  8. package/.sdd/skills/curated/devtrack-api/references/imports-lint.md +207 -0
  9. package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +167 -0
  10. package/.sdd/skills/curated/devtrack-api/references/typeorm-infrastructure.md +334 -0
  11. package/LICENSE +21 -0
  12. package/README.md +842 -0
  13. package/bin/codesdd.js +10 -0
  14. package/dist/cli/index.d.ts +3 -0
  15. package/dist/cli/index.js +560 -0
  16. package/dist/commands/change.d.ts +35 -0
  17. package/dist/commands/change.js +296 -0
  18. package/dist/commands/completion.d.ts +72 -0
  19. package/dist/commands/completion.js +258 -0
  20. package/dist/commands/config.d.ts +36 -0
  21. package/dist/commands/config.js +552 -0
  22. package/dist/commands/feedback.d.ts +9 -0
  23. package/dist/commands/feedback.js +184 -0
  24. package/dist/commands/schema.d.ts +6 -0
  25. package/dist/commands/schema.js +870 -0
  26. package/dist/commands/sdd/execution.d.ts +3 -0
  27. package/dist/commands/sdd/execution.js +409 -0
  28. package/dist/commands/sdd/shared.d.ts +9 -0
  29. package/dist/commands/sdd/shared.js +84 -0
  30. package/dist/commands/sdd/skills.d.ts +3 -0
  31. package/dist/commands/sdd/skills.js +154 -0
  32. package/dist/commands/sdd.d.ts +3 -0
  33. package/dist/commands/sdd.js +769 -0
  34. package/dist/commands/show.d.ts +14 -0
  35. package/dist/commands/show.js +133 -0
  36. package/dist/commands/spec.d.ts +15 -0
  37. package/dist/commands/spec.js +228 -0
  38. package/dist/commands/validate.d.ts +24 -0
  39. package/dist/commands/validate.js +295 -0
  40. package/dist/commands/workflow/index.d.ts +17 -0
  41. package/dist/commands/workflow/index.js +12 -0
  42. package/dist/commands/workflow/instructions.d.ts +29 -0
  43. package/dist/commands/workflow/instructions.js +383 -0
  44. package/dist/commands/workflow/new-change.d.ts +11 -0
  45. package/dist/commands/workflow/new-change.js +45 -0
  46. package/dist/commands/workflow/schemas.d.ts +10 -0
  47. package/dist/commands/workflow/schemas.js +34 -0
  48. package/dist/commands/workflow/shared.d.ts +57 -0
  49. package/dist/commands/workflow/shared.js +117 -0
  50. package/dist/commands/workflow/status.d.ts +14 -0
  51. package/dist/commands/workflow/status.js +76 -0
  52. package/dist/commands/workflow/templates.d.ts +16 -0
  53. package/dist/commands/workflow/templates.js +68 -0
  54. package/dist/core/archive.d.ts +16 -0
  55. package/dist/core/archive.js +487 -0
  56. package/dist/core/artifact-graph/graph.d.ts +56 -0
  57. package/dist/core/artifact-graph/graph.js +141 -0
  58. package/dist/core/artifact-graph/index.d.ts +7 -0
  59. package/dist/core/artifact-graph/index.js +13 -0
  60. package/dist/core/artifact-graph/instruction-loader.d.ts +143 -0
  61. package/dist/core/artifact-graph/instruction-loader.js +215 -0
  62. package/dist/core/artifact-graph/resolver.d.ts +81 -0
  63. package/dist/core/artifact-graph/resolver.js +258 -0
  64. package/dist/core/artifact-graph/schema.d.ts +13 -0
  65. package/dist/core/artifact-graph/schema.js +108 -0
  66. package/dist/core/artifact-graph/state.d.ts +12 -0
  67. package/dist/core/artifact-graph/state.js +54 -0
  68. package/dist/core/artifact-graph/types.d.ts +45 -0
  69. package/dist/core/artifact-graph/types.js +43 -0
  70. package/dist/core/available-tools.d.ts +16 -0
  71. package/dist/core/available-tools.js +30 -0
  72. package/dist/core/branding.d.ts +8 -0
  73. package/dist/core/branding.js +12 -0
  74. package/dist/core/cli/command-matrix.d.ts +23 -0
  75. package/dist/core/cli/command-matrix.js +123 -0
  76. package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
  77. package/dist/core/command-generation/adapters/amazon-q.js +26 -0
  78. package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
  79. package/dist/core/command-generation/adapters/antigravity.js +26 -0
  80. package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
  81. package/dist/core/command-generation/adapters/auggie.js +27 -0
  82. package/dist/core/command-generation/adapters/claude.d.ts +13 -0
  83. package/dist/core/command-generation/adapters/claude.js +50 -0
  84. package/dist/core/command-generation/adapters/cline.d.ts +14 -0
  85. package/dist/core/command-generation/adapters/cline.js +27 -0
  86. package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
  87. package/dist/core/command-generation/adapters/codebuddy.js +28 -0
  88. package/dist/core/command-generation/adapters/codex.d.ts +16 -0
  89. package/dist/core/command-generation/adapters/codex.js +39 -0
  90. package/dist/core/command-generation/adapters/continue.d.ts +13 -0
  91. package/dist/core/command-generation/adapters/continue.js +28 -0
  92. package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
  93. package/dist/core/command-generation/adapters/costrict.js +27 -0
  94. package/dist/core/command-generation/adapters/crush.d.ts +13 -0
  95. package/dist/core/command-generation/adapters/crush.js +30 -0
  96. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  97. package/dist/core/command-generation/adapters/cursor.js +44 -0
  98. package/dist/core/command-generation/adapters/factory.d.ts +13 -0
  99. package/dist/core/command-generation/adapters/factory.js +27 -0
  100. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  101. package/dist/core/command-generation/adapters/gemini.js +26 -0
  102. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  103. package/dist/core/command-generation/adapters/github-copilot.js +26 -0
  104. package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
  105. package/dist/core/command-generation/adapters/iflow.js +29 -0
  106. package/dist/core/command-generation/adapters/index.d.ts +29 -0
  107. package/dist/core/command-generation/adapters/index.js +29 -0
  108. package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
  109. package/dist/core/command-generation/adapters/kilocode.js +23 -0
  110. package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
  111. package/dist/core/command-generation/adapters/kiro.js +26 -0
  112. package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
  113. package/dist/core/command-generation/adapters/opencode.js +29 -0
  114. package/dist/core/command-generation/adapters/pi.d.ts +14 -0
  115. package/dist/core/command-generation/adapters/pi.js +41 -0
  116. package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
  117. package/dist/core/command-generation/adapters/qoder.js +30 -0
  118. package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
  119. package/dist/core/command-generation/adapters/qwen.js +26 -0
  120. package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
  121. package/dist/core/command-generation/adapters/roocode.js +27 -0
  122. package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
  123. package/dist/core/command-generation/adapters/windsurf.js +51 -0
  124. package/dist/core/command-generation/generator.d.ts +21 -0
  125. package/dist/core/command-generation/generator.js +27 -0
  126. package/dist/core/command-generation/index.d.ts +22 -0
  127. package/dist/core/command-generation/index.js +24 -0
  128. package/dist/core/command-generation/registry.d.ts +36 -0
  129. package/dist/core/command-generation/registry.js +92 -0
  130. package/dist/core/command-generation/types.d.ts +56 -0
  131. package/dist/core/command-generation/types.js +8 -0
  132. package/dist/core/completions/command-registry.d.ts +7 -0
  133. package/dist/core/completions/command-registry.js +461 -0
  134. package/dist/core/completions/completion-provider.d.ts +60 -0
  135. package/dist/core/completions/completion-provider.js +102 -0
  136. package/dist/core/completions/factory.d.ts +64 -0
  137. package/dist/core/completions/factory.js +75 -0
  138. package/dist/core/completions/generators/bash-generator.d.ts +32 -0
  139. package/dist/core/completions/generators/bash-generator.js +174 -0
  140. package/dist/core/completions/generators/fish-generator.d.ts +32 -0
  141. package/dist/core/completions/generators/fish-generator.js +157 -0
  142. package/dist/core/completions/generators/powershell-generator.d.ts +33 -0
  143. package/dist/core/completions/generators/powershell-generator.js +207 -0
  144. package/dist/core/completions/generators/zsh-generator.d.ts +44 -0
  145. package/dist/core/completions/generators/zsh-generator.js +250 -0
  146. package/dist/core/completions/installers/bash-installer.d.ts +87 -0
  147. package/dist/core/completions/installers/bash-installer.js +318 -0
  148. package/dist/core/completions/installers/fish-installer.d.ts +43 -0
  149. package/dist/core/completions/installers/fish-installer.js +143 -0
  150. package/dist/core/completions/installers/powershell-installer.d.ts +88 -0
  151. package/dist/core/completions/installers/powershell-installer.js +327 -0
  152. package/dist/core/completions/installers/zsh-installer.d.ts +125 -0
  153. package/dist/core/completions/installers/zsh-installer.js +452 -0
  154. package/dist/core/completions/templates/bash-templates.d.ts +6 -0
  155. package/dist/core/completions/templates/bash-templates.js +24 -0
  156. package/dist/core/completions/templates/fish-templates.d.ts +7 -0
  157. package/dist/core/completions/templates/fish-templates.js +39 -0
  158. package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
  159. package/dist/core/completions/templates/powershell-templates.js +25 -0
  160. package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
  161. package/dist/core/completions/templates/zsh-templates.js +36 -0
  162. package/dist/core/completions/types.d.ts +79 -0
  163. package/dist/core/completions/types.js +2 -0
  164. package/dist/core/config-prompts.d.ts +9 -0
  165. package/dist/core/config-prompts.js +34 -0
  166. package/dist/core/config-schema.d.ts +86 -0
  167. package/dist/core/config-schema.js +213 -0
  168. package/dist/core/config.d.ts +17 -0
  169. package/dist/core/config.js +33 -0
  170. package/dist/core/converters/json-converter.d.ts +6 -0
  171. package/dist/core/converters/json-converter.js +51 -0
  172. package/dist/core/global-config.d.ts +44 -0
  173. package/dist/core/global-config.js +125 -0
  174. package/dist/core/index.d.ts +2 -0
  175. package/dist/core/index.js +3 -0
  176. package/dist/core/init.d.ts +36 -0
  177. package/dist/core/init.js +576 -0
  178. package/dist/core/legacy-cleanup.d.ts +162 -0
  179. package/dist/core/legacy-cleanup.js +512 -0
  180. package/dist/core/list.d.ts +9 -0
  181. package/dist/core/list.js +173 -0
  182. package/dist/core/migration.d.ts +23 -0
  183. package/dist/core/migration.js +108 -0
  184. package/dist/core/parsers/change-parser.d.ts +13 -0
  185. package/dist/core/parsers/change-parser.js +193 -0
  186. package/dist/core/parsers/markdown-parser.d.ts +22 -0
  187. package/dist/core/parsers/markdown-parser.js +187 -0
  188. package/dist/core/parsers/requirement-blocks.d.ts +37 -0
  189. package/dist/core/parsers/requirement-blocks.js +201 -0
  190. package/dist/core/profile-sync-drift.d.ts +38 -0
  191. package/dist/core/profile-sync-drift.js +201 -0
  192. package/dist/core/profiles.d.ts +26 -0
  193. package/dist/core/profiles.js +41 -0
  194. package/dist/core/project-config.d.ts +64 -0
  195. package/dist/core/project-config.js +223 -0
  196. package/dist/core/schemas/base.schema.d.ts +13 -0
  197. package/dist/core/schemas/base.schema.js +13 -0
  198. package/dist/core/schemas/change.schema.d.ts +73 -0
  199. package/dist/core/schemas/change.schema.js +31 -0
  200. package/dist/core/schemas/index.d.ts +4 -0
  201. package/dist/core/schemas/index.js +4 -0
  202. package/dist/core/schemas/spec.schema.d.ts +18 -0
  203. package/dist/core/schemas/spec.schema.js +15 -0
  204. package/dist/core/sdd/adr-policy.d.ts +7 -0
  205. package/dist/core/sdd/adr-policy.js +47 -0
  206. package/dist/core/sdd/adr.d.ts +4 -0
  207. package/dist/core/sdd/adr.js +27 -0
  208. package/dist/core/sdd/bootstrap.d.ts +28 -0
  209. package/dist/core/sdd/bootstrap.js +353 -0
  210. package/dist/core/sdd/check.d.ts +51 -0
  211. package/dist/core/sdd/check.js +831 -0
  212. package/dist/core/sdd/coordination/coordination-adapters.d.ts +73 -0
  213. package/dist/core/sdd/coordination/coordination-adapters.js +87 -0
  214. package/dist/core/sdd/coordination/index.d.ts +2 -0
  215. package/dist/core/sdd/coordination/index.js +2 -0
  216. package/dist/core/sdd/dedup.d.ts +23 -0
  217. package/dist/core/sdd/dedup.js +62 -0
  218. package/dist/core/sdd/default-bootstrap-files.d.ts +23 -0
  219. package/dist/core/sdd/default-bootstrap-files.js +385 -0
  220. package/dist/core/sdd/default-skills.d.ts +16 -0
  221. package/dist/core/sdd/default-skills.js +427 -0
  222. package/dist/core/sdd/diagnose.d.ts +25 -0
  223. package/dist/core/sdd/diagnose.js +1312 -0
  224. package/dist/core/sdd/docs-sync.d.ts +21 -0
  225. package/dist/core/sdd/docs-sync.js +231 -0
  226. package/dist/core/sdd/domain/helpers.d.ts +6 -0
  227. package/dist/core/sdd/domain/helpers.js +37 -0
  228. package/dist/core/sdd/domain/lifecycle-guardrails.d.ts +22 -0
  229. package/dist/core/sdd/domain/lifecycle-guardrails.js +31 -0
  230. package/dist/core/sdd/domain/lifecycle-hooks.d.ts +16 -0
  231. package/dist/core/sdd/domain/lifecycle-hooks.js +27 -0
  232. package/dist/core/sdd/domain/post-active-validation.d.ts +15 -0
  233. package/dist/core/sdd/domain/post-active-validation.js +71 -0
  234. package/dist/core/sdd/domain/traceability.d.ts +8 -0
  235. package/dist/core/sdd/domain/traceability.js +83 -0
  236. package/dist/core/sdd/domain/transition-engine.d.ts +49 -0
  237. package/dist/core/sdd/domain/transition-engine.js +120 -0
  238. package/dist/core/sdd/fingerprint.d.ts +23 -0
  239. package/dist/core/sdd/fingerprint.js +146 -0
  240. package/dist/core/sdd/import-openspec.d.ts +31 -0
  241. package/dist/core/sdd/import-openspec.js +232 -0
  242. package/dist/core/sdd/init.d.ts +36 -0
  243. package/dist/core/sdd/init.js +65 -0
  244. package/dist/core/sdd/json-schema.d.ts +6 -0
  245. package/dist/core/sdd/json-schema.js +59 -0
  246. package/dist/core/sdd/legacy-operations.d.ts +286 -0
  247. package/dist/core/sdd/legacy-operations.js +2175 -0
  248. package/dist/core/sdd/lenses.d.ts +14 -0
  249. package/dist/core/sdd/lenses.js +97 -0
  250. package/dist/core/sdd/merge-catalog.d.ts +9 -0
  251. package/dist/core/sdd/merge-catalog.js +70 -0
  252. package/dist/core/sdd/migrate-workspace.d.ts +36 -0
  253. package/dist/core/sdd/migrate-workspace.js +344 -0
  254. package/dist/core/sdd/migrate.d.ts +24 -0
  255. package/dist/core/sdd/migrate.js +385 -0
  256. package/dist/core/sdd/resolve-project-root.d.ts +15 -0
  257. package/dist/core/sdd/resolve-project-root.js +46 -0
  258. package/dist/core/sdd/root-resolver.d.ts +16 -0
  259. package/dist/core/sdd/root-resolver.js +62 -0
  260. package/dist/core/sdd/sanitize.d.ts +35 -0
  261. package/dist/core/sdd/sanitize.js +750 -0
  262. package/dist/core/sdd/services/approve.service.d.ts +20 -0
  263. package/dist/core/sdd/services/approve.service.js +82 -0
  264. package/dist/core/sdd/services/audit.service.d.ts +53 -0
  265. package/dist/core/sdd/services/audit.service.js +136 -0
  266. package/dist/core/sdd/services/breakdown.service.d.ts +35 -0
  267. package/dist/core/sdd/services/breakdown.service.js +185 -0
  268. package/dist/core/sdd/services/context.service.d.ts +346 -0
  269. package/dist/core/sdd/services/context.service.js +278 -0
  270. package/dist/core/sdd/services/debate.service.d.ts +16 -0
  271. package/dist/core/sdd/services/debate.service.js +73 -0
  272. package/dist/core/sdd/services/decide.service.d.ts +23 -0
  273. package/dist/core/sdd/services/decide.service.js +81 -0
  274. package/dist/core/sdd/services/dedup-apply.service.d.ts +39 -0
  275. package/dist/core/sdd/services/dedup-apply.service.js +259 -0
  276. package/dist/core/sdd/services/feature-lint.service.d.ts +29 -0
  277. package/dist/core/sdd/services/feature-lint.service.js +146 -0
  278. package/dist/core/sdd/services/finalize.service.d.ts +33 -0
  279. package/dist/core/sdd/services/finalize.service.js +707 -0
  280. package/dist/core/sdd/services/frontend-gap.service.d.ts +23 -0
  281. package/dist/core/sdd/services/frontend-gap.service.js +117 -0
  282. package/dist/core/sdd/services/frontend-impact.service.d.ts +19 -0
  283. package/dist/core/sdd/services/frontend-impact.service.js +46 -0
  284. package/dist/core/sdd/services/ingest-deposito.service.d.ts +32 -0
  285. package/dist/core/sdd/services/ingest-deposito.service.js +231 -0
  286. package/dist/core/sdd/services/insight.service.d.ts +21 -0
  287. package/dist/core/sdd/services/insight.service.js +81 -0
  288. package/dist/core/sdd/services/legacy-capability.service.d.ts +24 -0
  289. package/dist/core/sdd/services/legacy-capability.service.js +59 -0
  290. package/dist/core/sdd/services/mcp-runtime.service.d.ts +42 -0
  291. package/dist/core/sdd/services/mcp-runtime.service.js +144 -0
  292. package/dist/core/sdd/services/metrics.service.d.ts +49 -0
  293. package/dist/core/sdd/services/metrics.service.js +181 -0
  294. package/dist/core/sdd/services/next.service.d.ts +35 -0
  295. package/dist/core/sdd/services/next.service.js +54 -0
  296. package/dist/core/sdd/services/onboard.service.d.ts +9 -0
  297. package/dist/core/sdd/services/onboard.service.js +165 -0
  298. package/dist/core/sdd/services/rebuild.service.d.ts +31 -0
  299. package/dist/core/sdd/services/rebuild.service.js +482 -0
  300. package/dist/core/sdd/services/scan-naming.service.d.ts +43 -0
  301. package/dist/core/sdd/services/scan-naming.service.js +246 -0
  302. package/dist/core/sdd/services/skills-invoke.service.d.ts +24 -0
  303. package/dist/core/sdd/services/skills-invoke.service.js +63 -0
  304. package/dist/core/sdd/services/skills-sync.service.d.ts +15 -0
  305. package/dist/core/sdd/services/skills-sync.service.js +117 -0
  306. package/dist/core/sdd/services/start.service.d.ts +26 -0
  307. package/dist/core/sdd/services/start.service.js +237 -0
  308. package/dist/core/sdd/skills.d.ts +15 -0
  309. package/dist/core/sdd/skills.js +46 -0
  310. package/dist/core/sdd/state-lock.d.ts +19 -0
  311. package/dist/core/sdd/state-lock.js +144 -0
  312. package/dist/core/sdd/state.d.ts +155 -0
  313. package/dist/core/sdd/state.js +1000 -0
  314. package/dist/core/sdd/store/in-memory-adapter.d.ts +12 -0
  315. package/dist/core/sdd/store/in-memory-adapter.js +27 -0
  316. package/dist/core/sdd/store/index.d.ts +5 -0
  317. package/dist/core/sdd/store/index.js +5 -0
  318. package/dist/core/sdd/store/sdd-stores.d.ts +25 -0
  319. package/dist/core/sdd/store/sdd-stores.js +59 -0
  320. package/dist/core/sdd/store/state-store.d.ts +32 -0
  321. package/dist/core/sdd/store/state-store.js +2 -0
  322. package/dist/core/sdd/store/yaml-file-adapter.d.ts +12 -0
  323. package/dist/core/sdd/store/yaml-file-adapter.js +43 -0
  324. package/dist/core/sdd/structural-health.d.ts +557 -0
  325. package/dist/core/sdd/structural-health.js +187 -0
  326. package/dist/core/sdd/transaction.d.ts +14 -0
  327. package/dist/core/sdd/transaction.js +100 -0
  328. package/dist/core/sdd/types.d.ts +1570 -0
  329. package/dist/core/sdd/types.js +617 -0
  330. package/dist/core/sdd/views.d.ts +3 -0
  331. package/dist/core/sdd/views.js +560 -0
  332. package/dist/core/sdd/workspace-schemas.d.ts +620 -0
  333. package/dist/core/sdd/workspace-schemas.js +254 -0
  334. package/dist/core/sdd/write-manifest.d.ts +25 -0
  335. package/dist/core/sdd/write-manifest.js +353 -0
  336. package/dist/core/shared/index.d.ts +8 -0
  337. package/dist/core/shared/index.js +8 -0
  338. package/dist/core/shared/skill-generation.d.ts +49 -0
  339. package/dist/core/shared/skill-generation.js +106 -0
  340. package/dist/core/shared/tool-detection.d.ts +71 -0
  341. package/dist/core/shared/tool-detection.js +158 -0
  342. package/dist/core/specs-apply.d.ts +73 -0
  343. package/dist/core/specs-apply.js +385 -0
  344. package/dist/core/styles/palette.d.ts +7 -0
  345. package/dist/core/styles/palette.js +8 -0
  346. package/dist/core/templates/index.d.ts +8 -0
  347. package/dist/core/templates/index.js +9 -0
  348. package/dist/core/templates/skill-templates.d.ts +20 -0
  349. package/dist/core/templates/skill-templates.js +19 -0
  350. package/dist/core/templates/types.d.ts +19 -0
  351. package/dist/core/templates/types.js +5 -0
  352. package/dist/core/templates/workflows/apply-change.d.ts +10 -0
  353. package/dist/core/templates/workflows/apply-change.js +308 -0
  354. package/dist/core/templates/workflows/archive-change.d.ts +10 -0
  355. package/dist/core/templates/workflows/archive-change.js +277 -0
  356. package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
  357. package/dist/core/templates/workflows/bulk-archive-change.js +502 -0
  358. package/dist/core/templates/workflows/continue-change.d.ts +10 -0
  359. package/dist/core/templates/workflows/continue-change.js +232 -0
  360. package/dist/core/templates/workflows/explore.d.ts +10 -0
  361. package/dist/core/templates/workflows/explore.js +475 -0
  362. package/dist/core/templates/workflows/feedback.d.ts +9 -0
  363. package/dist/core/templates/workflows/feedback.js +108 -0
  364. package/dist/core/templates/workflows/ff-change.d.ts +10 -0
  365. package/dist/core/templates/workflows/ff-change.js +206 -0
  366. package/dist/core/templates/workflows/new-change.d.ts +10 -0
  367. package/dist/core/templates/workflows/new-change.js +151 -0
  368. package/dist/core/templates/workflows/onboard.d.ts +10 -0
  369. package/dist/core/templates/workflows/onboard.js +573 -0
  370. package/dist/core/templates/workflows/propose.d.ts +10 -0
  371. package/dist/core/templates/workflows/propose.js +224 -0
  372. package/dist/core/templates/workflows/sdd.d.ts +10 -0
  373. package/dist/core/templates/workflows/sdd.js +107 -0
  374. package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
  375. package/dist/core/templates/workflows/sync-specs.js +286 -0
  376. package/dist/core/templates/workflows/verify-change.d.ts +10 -0
  377. package/dist/core/templates/workflows/verify-change.js +346 -0
  378. package/dist/core/update.d.ts +77 -0
  379. package/dist/core/update.js +538 -0
  380. package/dist/core/validation/constants.d.ts +34 -0
  381. package/dist/core/validation/constants.js +40 -0
  382. package/dist/core/validation/types.d.ts +18 -0
  383. package/dist/core/validation/types.js +2 -0
  384. package/dist/core/validation/validator.d.ts +33 -0
  385. package/dist/core/validation/validator.js +409 -0
  386. package/dist/core/view.d.ts +8 -0
  387. package/dist/core/view.js +170 -0
  388. package/dist/index.d.ts +3 -0
  389. package/dist/index.js +3 -0
  390. package/dist/prompts/searchable-multi-select.d.ts +28 -0
  391. package/dist/prompts/searchable-multi-select.js +159 -0
  392. package/dist/telemetry/config.d.ts +32 -0
  393. package/dist/telemetry/config.js +68 -0
  394. package/dist/telemetry/index.d.ts +44 -0
  395. package/dist/telemetry/index.js +207 -0
  396. package/dist/ui/ascii-patterns.d.ts +16 -0
  397. package/dist/ui/ascii-patterns.js +133 -0
  398. package/dist/ui/welcome-screen.d.ts +10 -0
  399. package/dist/ui/welcome-screen.js +146 -0
  400. package/dist/utils/change-metadata.d.ts +51 -0
  401. package/dist/utils/change-metadata.js +147 -0
  402. package/dist/utils/change-utils.d.ts +62 -0
  403. package/dist/utils/change-utils.js +121 -0
  404. package/dist/utils/command-references.d.ts +18 -0
  405. package/dist/utils/command-references.js +20 -0
  406. package/dist/utils/file-system.d.ts +36 -0
  407. package/dist/utils/file-system.js +281 -0
  408. package/dist/utils/index.d.ts +6 -0
  409. package/dist/utils/index.js +9 -0
  410. package/dist/utils/interactive.d.ts +18 -0
  411. package/dist/utils/interactive.js +21 -0
  412. package/dist/utils/item-discovery.d.ts +4 -0
  413. package/dist/utils/item-discovery.js +73 -0
  414. package/dist/utils/match.d.ts +3 -0
  415. package/dist/utils/match.js +22 -0
  416. package/dist/utils/openspec-compat.d.ts +2 -0
  417. package/dist/utils/openspec-compat.js +2 -0
  418. package/dist/utils/shell-detection.d.ts +20 -0
  419. package/dist/utils/shell-detection.js +41 -0
  420. package/dist/utils/task-progress.d.ts +8 -0
  421. package/dist/utils/task-progress.js +36 -0
  422. package/package.json +111 -0
  423. package/schemas/sdd/1-spec.schema.json +221 -0
  424. package/schemas/sdd/2-plan.schema.json +199 -0
  425. package/schemas/sdd/3-tasks.schema.json +102 -0
  426. package/schemas/sdd/4-changelog.schema.json +55 -0
  427. package/schemas/sdd/5-quality.schema.json +427 -0
  428. package/schemas/sdd/workspace-catalog.schema.json +1012 -0
  429. package/schemas/spec-driven/schema.yaml +153 -0
  430. package/schemas/spec-driven/templates/design.md +19 -0
  431. package/schemas/spec-driven/templates/proposal.md +23 -0
  432. package/schemas/spec-driven/templates/spec.md +8 -0
  433. package/schemas/spec-driven/templates/tasks.md +9 -0
@@ -0,0 +1,383 @@
1
+ /**
2
+ * Instructions Command
3
+ *
4
+ * Generates enriched instructions for creating artifacts or applying tasks.
5
+ * Includes both artifact instructions and apply instructions.
6
+ */
7
+ import ora from 'ora';
8
+ import path from 'path';
9
+ import * as fs from 'fs';
10
+ import { loadChangeContext, generateInstructions, resolveSchema, } from '../../core/artifact-graph/index.js';
11
+ import { resolveOpenSpecSubpath } from '../../core/sdd/services/legacy-capability.service.js';
12
+ import { validateChangeExists, validateSchemaExists, } from './shared.js';
13
+ import { CLI_NAME } from '../../core/branding.js';
14
+ // -----------------------------------------------------------------------------
15
+ // Artifact Instructions Command
16
+ // -----------------------------------------------------------------------------
17
+ export async function instructionsCommand(artifactId, options) {
18
+ const spinner = ora('Generating instructions...').start();
19
+ try {
20
+ const projectRoot = process.cwd();
21
+ const changeName = await validateChangeExists(options.change, projectRoot);
22
+ // Validate schema if explicitly provided
23
+ if (options.schema) {
24
+ validateSchemaExists(options.schema, projectRoot);
25
+ }
26
+ // loadChangeContext will auto-detect schema from metadata if not provided
27
+ const context = loadChangeContext(projectRoot, changeName, options.schema);
28
+ if (!artifactId) {
29
+ spinner.stop();
30
+ const validIds = context.graph.getAllArtifacts().map((a) => a.id);
31
+ throw new Error(`Missing required argument <artifact>. Valid artifacts:\n ${validIds.join('\n ')}`);
32
+ }
33
+ const artifact = context.graph.getArtifact(artifactId);
34
+ if (!artifact) {
35
+ spinner.stop();
36
+ const validIds = context.graph.getAllArtifacts().map((a) => a.id);
37
+ throw new Error(`Artifact '${artifactId}' not found in schema '${context.schemaName}'. Valid artifacts:\n ${validIds.join('\n ')}`);
38
+ }
39
+ const instructions = generateInstructions(context, artifactId, projectRoot);
40
+ const isBlocked = instructions.dependencies.some((d) => !d.done);
41
+ spinner.stop();
42
+ if (options.json) {
43
+ console.log(JSON.stringify(instructions, null, 2));
44
+ return;
45
+ }
46
+ printInstructionsText(instructions, isBlocked);
47
+ }
48
+ catch (error) {
49
+ spinner.stop();
50
+ throw error;
51
+ }
52
+ }
53
+ export function printInstructionsText(instructions, isBlocked) {
54
+ const { artifactId, changeName, schemaName, changeDir, outputPath, description, instruction, sdd: context, rules, template, dependencies, unlocks, } = instructions;
55
+ // Opening tag
56
+ console.log(`<artifact id="${artifactId}" change="${changeName}" schema="${schemaName}">`);
57
+ console.log();
58
+ // Warning for blocked artifacts
59
+ if (isBlocked) {
60
+ const missing = dependencies.filter((d) => !d.done).map((d) => d.id);
61
+ console.log('<warning>');
62
+ console.log('This artifact has unmet dependencies. Complete them first or proceed with caution.');
63
+ console.log(`Missing: ${missing.join(', ')}`);
64
+ console.log('</warning>');
65
+ console.log();
66
+ }
67
+ // Task directive
68
+ console.log('<task>');
69
+ console.log(`Create the ${artifactId} artifact for change "${changeName}".`);
70
+ console.log(description);
71
+ console.log('</task>');
72
+ console.log();
73
+ // Project context (AI constraint - do not include in output)
74
+ if (context) {
75
+ console.log('<project_context>');
76
+ console.log('<!-- This is background information for you. Do NOT include this in your output. -->');
77
+ console.log(context);
78
+ console.log('</project_context>');
79
+ console.log();
80
+ }
81
+ // Rules (AI constraint - do not include in output)
82
+ if (rules && rules.length > 0) {
83
+ console.log('<rules>');
84
+ console.log('<!-- These are constraints for you to follow. Do NOT include this in your output. -->');
85
+ for (const rule of rules) {
86
+ console.log(`- ${rule}`);
87
+ }
88
+ console.log('</rules>');
89
+ console.log();
90
+ }
91
+ // Dependencies (files to read for context)
92
+ if (dependencies.length > 0) {
93
+ console.log('<dependencies>');
94
+ console.log('Read these files for context before creating this artifact:');
95
+ console.log();
96
+ for (const dep of dependencies) {
97
+ const status = dep.done ? 'done' : 'missing';
98
+ const fullPath = path.join(changeDir, dep.path);
99
+ console.log(`<dependency id="${dep.id}" status="${status}">`);
100
+ console.log(` <path>${fullPath}</path>`);
101
+ console.log(` <description>${dep.description}</description>`);
102
+ console.log('</dependency>');
103
+ }
104
+ console.log('</dependencies>');
105
+ console.log();
106
+ }
107
+ // Output location
108
+ console.log('<output>');
109
+ console.log(`Write to: ${path.join(changeDir, outputPath)}`);
110
+ console.log('</output>');
111
+ console.log();
112
+ // Instruction (guidance)
113
+ if (instruction) {
114
+ console.log('<instruction>');
115
+ console.log(instruction.trim());
116
+ console.log('</instruction>');
117
+ console.log();
118
+ }
119
+ // Template
120
+ console.log('<template>');
121
+ console.log('<!-- Use this as the structure for your output file. Fill in the sections. -->');
122
+ console.log(template.trim());
123
+ console.log('</template>');
124
+ console.log();
125
+ // Success criteria placeholder
126
+ console.log('<success_criteria>');
127
+ console.log('<!-- To be defined in schema validation rules -->');
128
+ console.log('</success_criteria>');
129
+ console.log();
130
+ // Unlocks
131
+ if (unlocks.length > 0) {
132
+ console.log('<unlocks>');
133
+ console.log(`Completing this artifact enables: ${unlocks.join(', ')}`);
134
+ console.log('</unlocks>');
135
+ console.log();
136
+ }
137
+ // Closing tag
138
+ console.log('</artifact>');
139
+ }
140
+ // -----------------------------------------------------------------------------
141
+ // Apply Instructions Command
142
+ // -----------------------------------------------------------------------------
143
+ /**
144
+ * Parses tasks.md content and extracts task items with their completion status.
145
+ */
146
+ function parseTasksFile(content) {
147
+ const tasks = [];
148
+ const lines = content.split('\n');
149
+ let taskIndex = 0;
150
+ for (const line of lines) {
151
+ // Match checkbox patterns: - [ ] or - [x] or - [X]
152
+ const checkboxMatch = line.match(/^[-*]\s*\[([ xX])\]\s*(.+)\s*$/);
153
+ if (checkboxMatch) {
154
+ taskIndex++;
155
+ const done = checkboxMatch[1].toLowerCase() === 'x';
156
+ const description = checkboxMatch[2].trim();
157
+ tasks.push({
158
+ id: `${taskIndex}`,
159
+ description,
160
+ done,
161
+ });
162
+ }
163
+ }
164
+ return tasks;
165
+ }
166
+ /**
167
+ * Checks if an artifact output exists in the change directory.
168
+ * Supports glob patterns (e.g., "specs/*.md") by verifying at least one matching file exists.
169
+ */
170
+ function artifactOutputExists(changeDir, generates) {
171
+ // Normalize the generates path to use platform-specific separators
172
+ const normalizedGenerates = generates.split('/').join(path.sep);
173
+ const fullPath = path.join(changeDir, normalizedGenerates);
174
+ // If it's a glob pattern (contains ** or *), check for matching files
175
+ if (generates.includes('*')) {
176
+ // Extract the directory part before the glob pattern
177
+ const parts = normalizedGenerates.split(path.sep);
178
+ const dirParts = [];
179
+ let patternPart = '';
180
+ for (const part of parts) {
181
+ if (part.includes('*')) {
182
+ patternPart = part;
183
+ break;
184
+ }
185
+ dirParts.push(part);
186
+ }
187
+ const dirPath = path.join(changeDir, ...dirParts);
188
+ // Check if directory exists
189
+ if (!fs.existsSync(dirPath) || !fs.statSync(dirPath).isDirectory()) {
190
+ return false;
191
+ }
192
+ // Extract expected extension from pattern (e.g., "*.md" -> ".md")
193
+ const extMatch = patternPart.match(/\*(\.[a-zA-Z0-9]+)$/);
194
+ const expectedExt = extMatch ? extMatch[1] : null;
195
+ // Recursively check for matching files
196
+ const hasMatchingFiles = (dir) => {
197
+ try {
198
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
199
+ for (const entry of entries) {
200
+ if (entry.isDirectory()) {
201
+ // For ** patterns, recurse into subdirectories
202
+ if (generates.includes('**') && hasMatchingFiles(path.join(dir, entry.name))) {
203
+ return true;
204
+ }
205
+ }
206
+ else if (entry.isFile()) {
207
+ // Check if file matches expected extension (or any file if no extension specified)
208
+ if (!expectedExt || entry.name.endsWith(expectedExt)) {
209
+ return true;
210
+ }
211
+ }
212
+ }
213
+ }
214
+ catch {
215
+ return false;
216
+ }
217
+ return false;
218
+ };
219
+ return hasMatchingFiles(dirPath);
220
+ }
221
+ return fs.existsSync(fullPath);
222
+ }
223
+ /**
224
+ * Generates apply instructions for implementing tasks from a change.
225
+ * Schema-aware: reads apply phase configuration from schema to determine
226
+ * required artifacts, tracking file, and instruction.
227
+ */
228
+ export async function generateApplyInstructions(projectRoot, changeName, schemaName) {
229
+ // loadChangeContext will auto-detect schema from metadata if not provided
230
+ const context = loadChangeContext(projectRoot, changeName, schemaName);
231
+ const changeDir = resolveOpenSpecSubpath(projectRoot, 'changes', changeName);
232
+ // Get the full schema to access the apply phase configuration
233
+ const schema = resolveSchema(context.schemaName, projectRoot);
234
+ const applyConfig = schema.apply;
235
+ // Determine required artifacts and tracking file from schema
236
+ // Fallback: if no apply block, require all artifacts
237
+ const requiredArtifactIds = applyConfig?.requires ?? schema.artifacts.map((a) => a.id);
238
+ const tracksFile = applyConfig?.tracks ?? null;
239
+ const schemaInstruction = applyConfig?.instruction ?? null;
240
+ // Check which required artifacts are missing
241
+ const missingArtifacts = [];
242
+ for (const artifactId of requiredArtifactIds) {
243
+ const artifact = schema.artifacts.find((a) => a.id === artifactId);
244
+ if (artifact && !artifactOutputExists(changeDir, artifact.generates)) {
245
+ missingArtifacts.push(artifactId);
246
+ }
247
+ }
248
+ // Build context files from all existing artifacts in schema
249
+ const sddFiles = {};
250
+ for (const artifact of schema.artifacts) {
251
+ if (artifactOutputExists(changeDir, artifact.generates)) {
252
+ sddFiles[artifact.id] = path.join(changeDir, artifact.generates);
253
+ }
254
+ }
255
+ // Parse tasks if tracking file exists
256
+ let tasks = [];
257
+ let tracksFileExists = false;
258
+ if (tracksFile) {
259
+ const tracksPath = path.join(changeDir, tracksFile);
260
+ tracksFileExists = fs.existsSync(tracksPath);
261
+ if (tracksFileExists) {
262
+ const tasksContent = await fs.promises.readFile(tracksPath, 'utf-8');
263
+ tasks = parseTasksFile(tasksContent);
264
+ }
265
+ }
266
+ // Calculate progress
267
+ const total = tasks.length;
268
+ const complete = tasks.filter((t) => t.done).length;
269
+ const remaining = total - complete;
270
+ // Determine state and instruction
271
+ let state;
272
+ let instruction;
273
+ if (missingArtifacts.length > 0) {
274
+ state = 'blocked';
275
+ instruction = `Cannot apply this change yet. Missing artifacts: ${missingArtifacts.join(', ')}.\nUse the openspec-continue-change skill or run ${CLI_NAME} instructions to create the missing artifacts first.`;
276
+ }
277
+ else if (tracksFile && !tracksFileExists) {
278
+ // Tracking file configured but doesn't exist yet
279
+ const tracksFilename = path.basename(tracksFile);
280
+ state = 'blocked';
281
+ instruction = `The ${tracksFilename} file is missing and must be created.\nUse openspec-continue-change or run ${CLI_NAME} instructions to generate the tracking file.`;
282
+ }
283
+ else if (tracksFile && tracksFileExists && total === 0) {
284
+ // Tracking file exists but contains no tasks
285
+ const tracksFilename = path.basename(tracksFile);
286
+ state = 'blocked';
287
+ instruction = `The ${tracksFilename} file exists but contains no tasks.\nAdd tasks to ${tracksFilename} or regenerate it with openspec-continue-change.`;
288
+ }
289
+ else if (tracksFile && remaining === 0 && total > 0) {
290
+ state = 'all_done';
291
+ instruction = 'All tasks are complete! This change is ready to be archived.\nConsider running tests and reviewing the changes before archiving.';
292
+ }
293
+ else if (!tracksFile) {
294
+ // No tracking file configured in schema - ready to apply
295
+ state = 'ready';
296
+ instruction = schemaInstruction?.trim() ?? 'All required artifacts complete. Proceed with implementation.';
297
+ }
298
+ else {
299
+ state = 'ready';
300
+ instruction = schemaInstruction?.trim() ?? 'Read context files, work through pending tasks, mark complete as you go.\nPause if you hit blockers or need clarification.';
301
+ }
302
+ return {
303
+ changeName,
304
+ changeDir,
305
+ schemaName: context.schemaName,
306
+ sddFiles,
307
+ progress: { total, complete, remaining },
308
+ tasks,
309
+ state,
310
+ missingArtifacts: missingArtifacts.length > 0 ? missingArtifacts : undefined,
311
+ instruction,
312
+ };
313
+ }
314
+ export async function applyInstructionsCommand(options) {
315
+ const spinner = ora('Generating apply instructions...').start();
316
+ try {
317
+ const projectRoot = process.cwd();
318
+ const changeName = await validateChangeExists(options.change, projectRoot);
319
+ // Validate schema if explicitly provided
320
+ if (options.schema) {
321
+ validateSchemaExists(options.schema, projectRoot);
322
+ }
323
+ // generateApplyInstructions uses loadChangeContext which auto-detects schema
324
+ const instructions = await generateApplyInstructions(projectRoot, changeName, options.schema);
325
+ spinner.stop();
326
+ if (options.json) {
327
+ console.log(JSON.stringify(instructions, null, 2));
328
+ return;
329
+ }
330
+ printApplyInstructionsText(instructions);
331
+ }
332
+ catch (error) {
333
+ spinner.stop();
334
+ throw error;
335
+ }
336
+ }
337
+ export function printApplyInstructionsText(instructions) {
338
+ const { changeName, schemaName, sddFiles, progress, tasks, state, missingArtifacts, instruction } = instructions;
339
+ console.log(`## Apply: ${changeName}`);
340
+ console.log(`Schema: ${schemaName}`);
341
+ console.log();
342
+ // Warning for blocked state
343
+ if (state === 'blocked' && missingArtifacts) {
344
+ console.log('### ⚠️ Blocked');
345
+ console.log();
346
+ console.log(`Missing artifacts: ${missingArtifacts.join(', ')}`);
347
+ console.log(`Use the openspec-continue-change skill or run ${CLI_NAME} instructions to create these first.`);
348
+ console.log();
349
+ }
350
+ // Context files (dynamically from schema)
351
+ const contextFileEntries = Object.entries(sddFiles);
352
+ if (contextFileEntries.length > 0) {
353
+ console.log('### SDD Files');
354
+ for (const [artifactId, filePath] of contextFileEntries) {
355
+ console.log(`- ${artifactId}: ${filePath}`);
356
+ }
357
+ console.log();
358
+ }
359
+ // Progress (only show if we have tracking)
360
+ if (progress.total > 0 || tasks.length > 0) {
361
+ console.log('### Progress');
362
+ if (state === 'all_done') {
363
+ console.log(`${progress.complete}/${progress.total} complete ✓`);
364
+ }
365
+ else {
366
+ console.log(`${progress.complete}/${progress.total} complete`);
367
+ }
368
+ console.log();
369
+ }
370
+ // Tasks
371
+ if (tasks.length > 0) {
372
+ console.log('### Tasks');
373
+ for (const task of tasks) {
374
+ const checkbox = task.done ? '[x]' : '[ ]';
375
+ console.log(`- ${checkbox} ${task.description}`);
376
+ }
377
+ console.log();
378
+ }
379
+ // Instruction
380
+ console.log('### Instruction');
381
+ console.log(instruction);
382
+ }
383
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1,11 @@
1
+ /**
2
+ * New Change Command
3
+ *
4
+ * Creates a new change directory with optional description and schema.
5
+ */
6
+ export interface NewChangeOptions {
7
+ description?: string;
8
+ schema?: string;
9
+ }
10
+ export declare function newChangeCommand(name: string | undefined, options: NewChangeOptions): Promise<void>;
11
+ //# sourceMappingURL=new-change.d.ts.map
@@ -0,0 +1,45 @@
1
+ /**
2
+ * New Change Command
3
+ *
4
+ * Creates a new change directory with optional description and schema.
5
+ */
6
+ import ora from 'ora';
7
+ import path from 'path';
8
+ import { createChange, validateChangeName } from '../../utils/change-utils.js';
9
+ import { validateSchemaExists } from './shared.js';
10
+ import { OPENSPEC_DIR_NAME } from '../../core/config.js';
11
+ // -----------------------------------------------------------------------------
12
+ // Command Implementation
13
+ // -----------------------------------------------------------------------------
14
+ export async function newChangeCommand(name, options) {
15
+ if (!name) {
16
+ throw new Error('Missing required argument <name>');
17
+ }
18
+ const validation = validateChangeName(name);
19
+ if (!validation.valid) {
20
+ throw new Error(validation.error);
21
+ }
22
+ const projectRoot = process.cwd();
23
+ // Validate schema if provided
24
+ if (options.schema) {
25
+ validateSchemaExists(options.schema, projectRoot);
26
+ }
27
+ const schemaDisplay = options.schema ? ` with schema '${options.schema}'` : '';
28
+ const spinner = ora(`Creating change '${name}'${schemaDisplay}...`).start();
29
+ try {
30
+ const result = await createChange(projectRoot, name, { schema: options.schema });
31
+ // If description provided, create README.md with description
32
+ if (options.description) {
33
+ const { promises: fs } = await import('fs');
34
+ const changeDir = path.join(projectRoot, OPENSPEC_DIR_NAME, 'changes', name);
35
+ const readmePath = path.join(changeDir, 'README.md');
36
+ await fs.writeFile(readmePath, `# ${name}\n\n${options.description}\n`, 'utf-8');
37
+ }
38
+ spinner.succeed(`Created change '${name}' at ${OPENSPEC_DIR_NAME}/changes/${name}/ (schema: ${result.schema})`);
39
+ }
40
+ catch (error) {
41
+ spinner.fail(`Failed to create change '${name}'`);
42
+ throw error;
43
+ }
44
+ }
45
+ //# sourceMappingURL=new-change.js.map
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Schemas Command
3
+ *
4
+ * Lists available workflow schemas with descriptions.
5
+ */
6
+ export interface SchemasOptions {
7
+ json?: boolean;
8
+ }
9
+ export declare function schemasCommand(options: SchemasOptions): Promise<void>;
10
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Schemas Command
3
+ *
4
+ * Lists available workflow schemas with descriptions.
5
+ */
6
+ import chalk from 'chalk';
7
+ import { listSchemasWithInfo } from '../../core/artifact-graph/index.js';
8
+ // -----------------------------------------------------------------------------
9
+ // Command Implementation
10
+ // -----------------------------------------------------------------------------
11
+ export async function schemasCommand(options) {
12
+ const projectRoot = process.cwd();
13
+ const schemas = listSchemasWithInfo(projectRoot);
14
+ if (options.json) {
15
+ console.log(JSON.stringify(schemas, null, 2));
16
+ return;
17
+ }
18
+ console.log('Available schemas:');
19
+ console.log();
20
+ for (const schema of schemas) {
21
+ let sourceLabel = '';
22
+ if (schema.source === 'project') {
23
+ sourceLabel = chalk.cyan(' (project)');
24
+ }
25
+ else if (schema.source === 'user') {
26
+ sourceLabel = chalk.dim(' (user override)');
27
+ }
28
+ console.log(` ${chalk.bold(schema.name)}${sourceLabel}`);
29
+ console.log(` ${schema.description}`);
30
+ console.log(` Artifacts: ${schema.artifacts.join(' → ')}`);
31
+ console.log();
32
+ }
33
+ }
34
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Shared Types and Utilities for Artifact Workflow Commands
3
+ *
4
+ * This module contains types, constants, and validation helpers used across
5
+ * multiple artifact workflow commands.
6
+ */
7
+ export interface TaskItem {
8
+ id: string;
9
+ description: string;
10
+ done: boolean;
11
+ }
12
+ export interface ApplyInstructions {
13
+ changeName: string;
14
+ changeDir: string;
15
+ schemaName: string;
16
+ sddFiles: Record<string, string>;
17
+ progress: {
18
+ total: number;
19
+ complete: number;
20
+ remaining: number;
21
+ };
22
+ tasks: TaskItem[];
23
+ state: 'blocked' | 'all_done' | 'ready';
24
+ missingArtifacts?: string[];
25
+ instruction: string;
26
+ }
27
+ export declare const DEFAULT_SCHEMA = "spec-driven";
28
+ /**
29
+ * Checks if color output is disabled via NO_COLOR env or --no-color flag.
30
+ */
31
+ export declare function isColorDisabled(): boolean;
32
+ /**
33
+ * Gets the color function based on status.
34
+ */
35
+ export declare function getStatusColor(status: 'done' | 'ready' | 'blocked'): (text: string) => string;
36
+ /**
37
+ * Gets the status indicator for an artifact.
38
+ */
39
+ export declare function getStatusIndicator(status: 'done' | 'ready' | 'blocked'): string;
40
+ /**
41
+ * Returns the list of available change directory names under openspec/changes/.
42
+ * Excludes the archive directory and hidden directories.
43
+ */
44
+ export declare function getAvailableChanges(projectRoot: string): Promise<string[]>;
45
+ /**
46
+ * Validates that a change exists and returns available changes if not.
47
+ * Checks directory existence directly to support scaffolded changes (without proposal.md).
48
+ */
49
+ export declare function validateChangeExists(changeName: string | undefined, projectRoot: string): Promise<string>;
50
+ /**
51
+ * Validates that a schema exists and returns available schemas if not.
52
+ *
53
+ * @param schemaName - The schema name to validate
54
+ * @param projectRoot - Optional project root for project-local schema resolution
55
+ */
56
+ export declare function validateSchemaExists(schemaName: string, projectRoot?: string): string;
57
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Shared Types and Utilities for Artifact Workflow Commands
3
+ *
4
+ * This module contains types, constants, and validation helpers used across
5
+ * multiple artifact workflow commands.
6
+ */
7
+ import chalk from 'chalk';
8
+ import * as fs from 'fs';
9
+ import { getSchemaDir, listSchemas } from '../../core/artifact-graph/index.js';
10
+ import { validateChangeName } from '../../utils/change-utils.js';
11
+ import { CLI_NAME } from '../../core/branding.js';
12
+ import { resolveOpenSpecSubpath } from '../../core/sdd/services/legacy-capability.service.js';
13
+ // -----------------------------------------------------------------------------
14
+ // Constants
15
+ // -----------------------------------------------------------------------------
16
+ export const DEFAULT_SCHEMA = 'spec-driven';
17
+ // -----------------------------------------------------------------------------
18
+ // Utility Functions
19
+ // -----------------------------------------------------------------------------
20
+ /**
21
+ * Checks if color output is disabled via NO_COLOR env or --no-color flag.
22
+ */
23
+ export function isColorDisabled() {
24
+ return process.env.NO_COLOR === '1' || process.env.NO_COLOR === 'true';
25
+ }
26
+ /**
27
+ * Gets the color function based on status.
28
+ */
29
+ export function getStatusColor(status) {
30
+ if (isColorDisabled()) {
31
+ return (text) => text;
32
+ }
33
+ switch (status) {
34
+ case 'done':
35
+ return chalk.green;
36
+ case 'ready':
37
+ return chalk.yellow;
38
+ case 'blocked':
39
+ return chalk.red;
40
+ }
41
+ }
42
+ /**
43
+ * Gets the status indicator for an artifact.
44
+ */
45
+ export function getStatusIndicator(status) {
46
+ const color = getStatusColor(status);
47
+ switch (status) {
48
+ case 'done':
49
+ return color('[x]');
50
+ case 'ready':
51
+ return color('[ ]');
52
+ case 'blocked':
53
+ return color('[-]');
54
+ }
55
+ }
56
+ /**
57
+ * Returns the list of available change directory names under openspec/changes/.
58
+ * Excludes the archive directory and hidden directories.
59
+ */
60
+ export async function getAvailableChanges(projectRoot) {
61
+ const changesPath = resolveOpenSpecSubpath(projectRoot, 'changes');
62
+ try {
63
+ const entries = await fs.promises.readdir(changesPath, { withFileTypes: true });
64
+ return entries
65
+ .filter((e) => e.isDirectory() && e.name !== 'archive' && !e.name.startsWith('.'))
66
+ .map((e) => e.name);
67
+ }
68
+ catch (error) {
69
+ if (error.code === 'ENOENT')
70
+ return [];
71
+ throw error;
72
+ }
73
+ }
74
+ /**
75
+ * Validates that a change exists and returns available changes if not.
76
+ * Checks directory existence directly to support scaffolded changes (without proposal.md).
77
+ */
78
+ export async function validateChangeExists(changeName, projectRoot) {
79
+ if (!changeName) {
80
+ const available = await getAvailableChanges(projectRoot);
81
+ if (available.length === 0) {
82
+ throw new Error(`No changes found. Create one with: ${CLI_NAME} new change <name>`);
83
+ }
84
+ throw new Error(`Missing required option --change. Available changes:\n ${available.join('\n ')}`);
85
+ }
86
+ // Validate change name format to prevent path traversal
87
+ const nameValidation = validateChangeName(changeName);
88
+ if (!nameValidation.valid) {
89
+ throw new Error(`Invalid change name '${changeName}': ${nameValidation.error}`);
90
+ }
91
+ // Check directory existence directly
92
+ const changePath = resolveOpenSpecSubpath(projectRoot, 'changes', changeName);
93
+ const exists = fs.existsSync(changePath) && fs.statSync(changePath).isDirectory();
94
+ if (!exists) {
95
+ const available = await getAvailableChanges(projectRoot);
96
+ if (available.length === 0) {
97
+ throw new Error(`Change '${changeName}' not found. No changes exist. Create one with: ${CLI_NAME} new change <name>`);
98
+ }
99
+ throw new Error(`Change '${changeName}' not found. Available changes:\n ${available.join('\n ')}`);
100
+ }
101
+ return changeName;
102
+ }
103
+ /**
104
+ * Validates that a schema exists and returns available schemas if not.
105
+ *
106
+ * @param schemaName - The schema name to validate
107
+ * @param projectRoot - Optional project root for project-local schema resolution
108
+ */
109
+ export function validateSchemaExists(schemaName, projectRoot) {
110
+ const schemaDir = getSchemaDir(schemaName, projectRoot);
111
+ if (!schemaDir) {
112
+ const availableSchemas = listSchemas(projectRoot);
113
+ throw new Error(`Schema '${schemaName}' not found. Available schemas:\n ${availableSchemas.join('\n ')}`);
114
+ }
115
+ return schemaName;
116
+ }
117
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Status Command
3
+ *
4
+ * Displays artifact completion status for a change.
5
+ */
6
+ import { type ChangeStatus } from '../../core/artifact-graph/index.js';
7
+ export interface StatusOptions {
8
+ change?: string;
9
+ schema?: string;
10
+ json?: boolean;
11
+ }
12
+ export declare function statusCommand(options: StatusOptions): Promise<void>;
13
+ export declare function printStatusText(status: ChangeStatus): void;
14
+ //# sourceMappingURL=status.d.ts.map