@devtrack-solution/codesdd 1.2.2 → 1.2.4-rc3

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 (413) hide show
  1. package/.sdd/skills/curated/api-clean-flask-langgraph/SKILL.md +17 -17
  2. package/.sdd/skills/curated/devtrack-api/SKILL.md +170 -31
  3. package/.sdd/skills/curated/devtrack-api/agents/claude-code.yaml +8 -0
  4. package/.sdd/skills/curated/devtrack-api/agents/codex.yaml +8 -0
  5. package/.sdd/skills/curated/devtrack-api/agents/cursor.yaml +8 -0
  6. package/.sdd/skills/curated/devtrack-api/agents/gemini.yaml +8 -0
  7. package/.sdd/skills/curated/devtrack-api/agents/kimi.yaml +8 -0
  8. package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +4 -2
  9. package/.sdd/skills/curated/devtrack-api/agents/opencode.yaml +10 -0
  10. package/.sdd/skills/curated/devtrack-api/references/application-presentation.md +2 -2
  11. package/.sdd/skills/curated/devtrack-api/references/architecture-governance.md +8 -7
  12. package/.sdd/skills/curated/devtrack-api/references/consumer-sync-policy.md +93 -0
  13. package/.sdd/skills/curated/devtrack-api/references/contract-pack.yaml +372 -0
  14. package/.sdd/skills/curated/devtrack-api/references/domain-modeling.md +13 -13
  15. package/.sdd/skills/curated/devtrack-api/references/field-validation-protocol.md +95 -0
  16. package/.sdd/skills/curated/devtrack-api/references/foundation-layout.md +294 -0
  17. package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +5 -5
  18. package/.sdd/skills/curated/devtrack-api/references/imports-lint.md +4 -0
  19. package/.sdd/skills/curated/devtrack-api/references/portable-agent-contract.md +41 -0
  20. package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +2 -2
  21. package/.sdd/skills/curated/devtrack-api/references/typeorm-infrastructure.md +7 -9
  22. package/LICENSE +1 -1
  23. package/README.md +399 -53
  24. package/bin/codesdd.js +3 -2
  25. package/dist/applications/sdd/index.d.ts +16 -0
  26. package/dist/applications/sdd/index.js +16 -0
  27. package/dist/cli/index.d.ts +2 -2
  28. package/dist/cli/index.js +11 -558
  29. package/dist/cli/program.d.ts +14 -0
  30. package/dist/cli/program.js +645 -0
  31. package/dist/commands/change.js +5 -5
  32. package/dist/commands/completion.d.ts +1 -1
  33. package/dist/commands/completion.js +9 -2
  34. package/dist/commands/config.js +320 -20
  35. package/dist/commands/feedback.js +1 -1
  36. package/dist/commands/schema.d.ts +63 -0
  37. package/dist/commands/schema.js +12 -12
  38. package/dist/commands/sdd/backlog.d.ts +3 -0
  39. package/dist/commands/sdd/backlog.js +54 -0
  40. package/dist/commands/sdd/execution.js +489 -28
  41. package/dist/commands/sdd/plugin.d.ts +3 -0
  42. package/dist/commands/sdd/plugin.js +158 -0
  43. package/dist/commands/sdd/shared.d.ts +1 -0
  44. package/dist/commands/sdd/shared.js +11 -22
  45. package/dist/commands/sdd/skills.js +7 -0
  46. package/dist/commands/sdd.js +107 -15
  47. package/dist/commands/spec.js +9 -9
  48. package/dist/commands/validate.js +6 -6
  49. package/dist/commands/workflow/instructions.js +6 -6
  50. package/dist/commands/workflow/new-change.js +3 -3
  51. package/dist/commands/workflow/shared.d.ts +1 -1
  52. package/dist/commands/workflow/shared.js +4 -4
  53. package/dist/core/archive.js +15 -5
  54. package/dist/core/artifact-graph/instruction-loader.d.ts +1 -1
  55. package/dist/core/artifact-graph/instruction-loader.js +3 -3
  56. package/dist/core/artifact-graph/resolver.d.ts +4 -4
  57. package/dist/core/artifact-graph/resolver.js +6 -6
  58. package/dist/core/branding.js +3 -3
  59. package/dist/core/cli/command-matrix.js +19 -1
  60. package/dist/core/cli-command-quality.d.ts +27 -0
  61. package/dist/core/cli-command-quality.js +180 -0
  62. package/dist/core/command-generation/adapters/costrict.d.ts +1 -1
  63. package/dist/core/command-generation/adapters/costrict.js +2 -2
  64. package/dist/core/command-generation/types.d.ts +1 -1
  65. package/dist/core/completions/command-registry.d.ts +1 -1
  66. package/dist/core/completions/command-registry.js +200 -12
  67. package/dist/core/completions/completion-provider.d.ts +14 -1
  68. package/dist/core/completions/completion-provider.js +29 -1
  69. package/dist/core/completions/generators/bash-generator.d.ts +1 -1
  70. package/dist/core/completions/generators/bash-generator.js +20 -12
  71. package/dist/core/completions/generators/fish-generator.d.ts +9 -1
  72. package/dist/core/completions/generators/fish-generator.js +39 -25
  73. package/dist/core/completions/generators/powershell-generator.d.ts +1 -1
  74. package/dist/core/completions/generators/powershell-generator.js +21 -11
  75. package/dist/core/completions/generators/zsh-generator.d.ts +3 -6
  76. package/dist/core/completions/generators/zsh-generator.js +21 -42
  77. package/dist/core/completions/installers/bash-installer.js +6 -6
  78. package/dist/core/completions/installers/fish-installer.js +1 -1
  79. package/dist/core/completions/installers/powershell-installer.js +14 -14
  80. package/dist/core/completions/installers/zsh-installer.d.ts +7 -1
  81. package/dist/core/completions/installers/zsh-installer.js +36 -8
  82. package/dist/core/completions/templates/bash-templates.d.ts +1 -1
  83. package/dist/core/completions/templates/bash-templates.js +12 -6
  84. package/dist/core/completions/templates/fish-templates.d.ts +2 -2
  85. package/dist/core/completions/templates/fish-templates.js +20 -9
  86. package/dist/core/completions/templates/powershell-templates.d.ts +1 -1
  87. package/dist/core/completions/templates/powershell-templates.js +13 -4
  88. package/dist/core/completions/templates/zsh-templates.d.ts +1 -1
  89. package/dist/core/completions/templates/zsh-templates.js +18 -9
  90. package/dist/core/config-schema.d.ts +20 -1
  91. package/dist/core/config-schema.js +70 -2
  92. package/dist/core/config.d.ts +3 -3
  93. package/dist/core/config.js +4 -4
  94. package/dist/core/global-config.d.ts +57 -12
  95. package/dist/core/global-config.js +344 -27
  96. package/dist/core/index.d.ts +1 -1
  97. package/dist/core/index.js +2 -2
  98. package/dist/core/init.d.ts +6 -1
  99. package/dist/core/init.js +99 -77
  100. package/dist/core/legacy-cleanup.d.ts +17 -17
  101. package/dist/core/legacy-cleanup.js +96 -79
  102. package/dist/core/list.js +18 -4
  103. package/dist/core/migration.d.ts +3 -1
  104. package/dist/core/migration.js +7 -8
  105. package/dist/core/parsers/change-parser.js +1 -1
  106. package/dist/core/parsers/markdown-parser.js +2 -2
  107. package/dist/core/profile-sync-drift.d.ts +1 -1
  108. package/dist/core/profile-sync-drift.js +13 -13
  109. package/dist/core/project-config.d.ts +4 -4
  110. package/dist/core/project-config.js +11 -11
  111. package/dist/core/schemas/change.schema.d.ts +1 -1
  112. package/dist/core/schemas/change.schema.js +1 -1
  113. package/dist/core/schemas/spec.schema.d.ts +1 -1
  114. package/dist/core/schemas/spec.schema.js +1 -1
  115. package/dist/core/sdd/adr.js +23 -1
  116. package/dist/core/sdd/agent-binding.d.ts +346 -0
  117. package/dist/core/sdd/agent-binding.js +343 -0
  118. package/dist/core/sdd/agent-runtime-contract.d.ts +204 -0
  119. package/dist/core/sdd/agent-runtime-contract.js +200 -0
  120. package/dist/core/sdd/backlog-cli.d.ts +16 -0
  121. package/dist/core/sdd/backlog-cli.js +146 -0
  122. package/dist/core/sdd/backlog-conflict-policy.d.ts +58 -0
  123. package/dist/core/sdd/backlog-conflict-policy.js +230 -0
  124. package/dist/core/sdd/backlog-projection.d.ts +8 -0
  125. package/dist/core/sdd/backlog-projection.js +89 -0
  126. package/dist/core/sdd/backlog-provider-contract.d.ts +252 -0
  127. package/dist/core/sdd/backlog-provider-contract.js +158 -0
  128. package/dist/core/sdd/bootstrap.js +2 -2
  129. package/dist/core/sdd/check.d.ts +44 -0
  130. package/dist/core/sdd/check.js +62 -24
  131. package/dist/core/sdd/contract.d.ts +13 -0
  132. package/dist/core/sdd/contract.js +36 -0
  133. package/dist/core/sdd/coordination/coordination-adapters.d.ts +53 -8
  134. package/dist/core/sdd/coordination/coordination-adapters.js +182 -16
  135. package/dist/core/sdd/coordination/index.d.ts +1 -0
  136. package/dist/core/sdd/coordination/index.js +1 -0
  137. package/dist/core/sdd/coordination/redis-runtime.d.ts +131 -0
  138. package/dist/core/sdd/coordination/redis-runtime.js +698 -0
  139. package/dist/core/sdd/deepagent-contracts.d.ts +370 -0
  140. package/dist/core/sdd/deepagent-contracts.js +235 -0
  141. package/dist/core/sdd/deepagents/adr-governor.d.ts +2 -0
  142. package/dist/core/sdd/deepagents/adr-governor.js +30 -0
  143. package/dist/core/sdd/deepagents/backend.d.ts +63 -0
  144. package/dist/core/sdd/deepagents/backend.js +174 -0
  145. package/dist/core/sdd/deepagents/codesdd-tools.d.ts +39 -0
  146. package/dist/core/sdd/deepagents/codesdd-tools.js +83 -0
  147. package/dist/core/sdd/deepagents/evidence-mapper.d.ts +86 -0
  148. package/dist/core/sdd/deepagents/evidence-mapper.js +178 -0
  149. package/dist/core/sdd/deepagents/model-provider.d.ts +53 -0
  150. package/dist/core/sdd/deepagents/model-provider.js +379 -0
  151. package/dist/core/sdd/deepagents/policy-enforcement.d.ts +30 -0
  152. package/dist/core/sdd/deepagents/policy-enforcement.js +90 -0
  153. package/dist/core/sdd/deepagents/policy.d.ts +75 -0
  154. package/dist/core/sdd/deepagents/policy.js +358 -0
  155. package/dist/core/sdd/deepagents/quality-witness.d.ts +3 -0
  156. package/dist/core/sdd/deepagents/quality-witness.js +77 -0
  157. package/dist/core/sdd/deepagents/reversa-subagents.d.ts +75 -0
  158. package/dist/core/sdd/deepagents/reversa-subagents.js +182 -0
  159. package/dist/core/sdd/deepagents/runtime-factory.d.ts +90 -0
  160. package/dist/core/sdd/deepagents/runtime-factory.js +231 -0
  161. package/dist/core/sdd/deepagents/runtime-loader.d.ts +16 -0
  162. package/dist/core/sdd/deepagents/runtime-loader.js +65 -0
  163. package/dist/core/sdd/default-bootstrap-files.d.ts +3 -3
  164. package/dist/core/sdd/default-bootstrap-files.js +50 -10
  165. package/dist/core/sdd/default-skills.d.ts +30 -0
  166. package/dist/core/sdd/default-skills.js +288 -8
  167. package/dist/core/sdd/devtrack-api-appliance.d.ts +91 -0
  168. package/dist/core/sdd/devtrack-api-appliance.js +280 -0
  169. package/dist/core/sdd/devtrack-api-architecture.d.ts +31 -0
  170. package/dist/core/sdd/devtrack-api-architecture.js +608 -0
  171. package/dist/core/sdd/devtrack-api-import-boundary.d.ts +19 -0
  172. package/dist/core/sdd/devtrack-api-import-boundary.js +32 -0
  173. package/dist/core/sdd/diagnose.d.ts +59 -0
  174. package/dist/core/sdd/diagnose.js +37 -37
  175. package/dist/core/sdd/docs-sync.js +54 -20
  176. package/dist/core/sdd/domain/capability-diff.d.ts +63 -0
  177. package/dist/core/sdd/domain/capability-diff.js +200 -0
  178. package/dist/core/sdd/domain/change-safety-guardrails.d.ts +74 -0
  179. package/dist/core/sdd/domain/change-safety-guardrails.js +333 -0
  180. package/dist/core/sdd/domain/post-active-validation.d.ts +7 -0
  181. package/dist/core/sdd/domain/post-active-validation.js +61 -0
  182. package/dist/core/sdd/domain/semantic-intent-classifier.d.ts +29 -0
  183. package/dist/core/sdd/domain/semantic-intent-classifier.js +117 -0
  184. package/dist/core/sdd/domain/transition-engine.js +1 -0
  185. package/dist/core/sdd/entity-reference.d.ts +5 -0
  186. package/dist/core/sdd/entity-reference.js +22 -0
  187. package/dist/core/sdd/foundation-artifact-map-validator.d.ts +16 -0
  188. package/dist/core/sdd/foundation-artifact-map-validator.js +71 -0
  189. package/dist/core/sdd/foundation-layer-manifest.d.ts +24 -0
  190. package/dist/core/sdd/foundation-layer-manifest.js +117 -0
  191. package/dist/core/sdd/governance-backfill.d.ts +31 -0
  192. package/dist/core/sdd/governance-backfill.js +359 -0
  193. package/dist/core/sdd/governance-parser.d.ts +21 -0
  194. package/dist/core/sdd/governance-parser.js +91 -0
  195. package/dist/core/sdd/governance-schemas.d.ts +245 -0
  196. package/dist/core/sdd/governance-schemas.js +143 -0
  197. package/dist/core/sdd/{import-openspec.d.ts → import-legacy-spec.d.ts} +7 -7
  198. package/dist/core/sdd/{import-openspec.js → import-legacy-spec.js} +21 -29
  199. package/dist/core/sdd/init.d.ts +3 -0
  200. package/dist/core/sdd/init.js +6 -3
  201. package/dist/core/sdd/intent-guard.d.ts +22 -0
  202. package/dist/core/sdd/intent-guard.js +67 -0
  203. package/dist/core/sdd/json-schema.js +108 -6
  204. package/dist/core/sdd/knowledge-graph.d.ts +45 -0
  205. package/dist/core/sdd/knowledge-graph.js +288 -0
  206. package/dist/core/sdd/legacy-operations.js +507 -44
  207. package/dist/core/sdd/lenses.d.ts +1 -0
  208. package/dist/core/sdd/lenses.js +29 -1
  209. package/dist/core/sdd/migrate-workspace.js +95 -2
  210. package/dist/core/sdd/migrate.d.ts +1 -1
  211. package/dist/core/sdd/migrate.js +36 -2
  212. package/dist/core/sdd/package-security-gates.d.ts +21 -0
  213. package/dist/core/sdd/package-security-gates.js +119 -0
  214. package/dist/core/sdd/package-structure-gate.d.ts +83 -0
  215. package/dist/core/sdd/package-structure-gate.js +357 -0
  216. package/dist/core/sdd/parallel-feat-automation.d.ts +330 -0
  217. package/dist/core/sdd/parallel-feat-automation.js +424 -0
  218. package/dist/core/sdd/plugin-broker.d.ts +777 -0
  219. package/dist/core/sdd/plugin-broker.js +492 -0
  220. package/dist/core/sdd/plugin-certification.d.ts +79 -0
  221. package/dist/core/sdd/plugin-certification.js +453 -0
  222. package/dist/core/sdd/plugin-cli.d.ts +139 -0
  223. package/dist/core/sdd/plugin-cli.js +265 -0
  224. package/dist/core/sdd/plugin-evidence.d.ts +348 -0
  225. package/dist/core/sdd/plugin-evidence.js +307 -0
  226. package/dist/core/sdd/plugin-manifest.d.ts +232 -0
  227. package/dist/core/sdd/plugin-manifest.js +225 -0
  228. package/dist/core/sdd/plugin-policy-pack.d.ts +88 -0
  229. package/dist/core/sdd/plugin-policy-pack.js +236 -0
  230. package/dist/core/sdd/plugin-policy.d.ts +68 -0
  231. package/dist/core/sdd/plugin-policy.js +212 -0
  232. package/dist/core/sdd/plugin-registry.d.ts +447 -0
  233. package/dist/core/sdd/plugin-registry.js +138 -0
  234. package/dist/core/sdd/plugin-sdk-contract.d.ts +363 -0
  235. package/dist/core/sdd/plugin-sdk-contract.js +268 -0
  236. package/dist/core/sdd/plugin-skill-binding.d.ts +151 -0
  237. package/dist/core/sdd/plugin-skill-binding.js +339 -0
  238. package/dist/core/sdd/quality-artifact-manifest-validator.d.ts +28 -0
  239. package/dist/core/sdd/quality-artifact-manifest-validator.js +167 -0
  240. package/dist/core/sdd/quality-evidence-renderer.d.ts +65 -0
  241. package/dist/core/sdd/quality-evidence-renderer.js +218 -0
  242. package/dist/core/sdd/quality-scenario-runner.d.ts +42 -0
  243. package/dist/core/sdd/quality-scenario-runner.js +613 -0
  244. package/dist/core/sdd/quality-validation.d.ts +620 -0
  245. package/dist/core/sdd/quality-validation.js +239 -0
  246. package/dist/core/sdd/release-readiness.d.ts +19 -0
  247. package/dist/core/sdd/release-readiness.js +472 -0
  248. package/dist/core/sdd/resolve-project-root.d.ts +2 -2
  249. package/dist/core/sdd/resolve-project-root.js +11 -5
  250. package/dist/core/sdd/runtime-boundary-contract.d.ts +45 -0
  251. package/dist/core/sdd/runtime-boundary-contract.js +90 -0
  252. package/dist/core/sdd/sanitize.d.ts +30 -1
  253. package/dist/core/sdd/sanitize.js +23 -23
  254. package/dist/core/sdd/sdk-agent-plugin-quality-gates.d.ts +150 -0
  255. package/dist/core/sdd/sdk-agent-plugin-quality-gates.js +258 -0
  256. package/dist/core/sdd/services/agent-run.service.d.ts +97 -0
  257. package/dist/core/sdd/services/agent-run.service.js +261 -0
  258. package/dist/core/sdd/services/breakdown.service.js +2 -1
  259. package/dist/core/sdd/services/capability-diff.service.d.ts +18 -0
  260. package/dist/core/sdd/services/capability-diff.service.js +26 -0
  261. package/dist/core/sdd/services/change-safety-preflight.service.d.ts +17 -0
  262. package/dist/core/sdd/services/change-safety-preflight.service.js +17 -0
  263. package/dist/core/sdd/services/context.service.d.ts +43 -340
  264. package/dist/core/sdd/services/context.service.js +341 -25
  265. package/dist/core/sdd/services/debate.service.js +15 -2
  266. package/dist/core/sdd/services/feature-lint.service.d.ts +22 -0
  267. package/dist/core/sdd/services/feature-lint.service.js +105 -5
  268. package/dist/core/sdd/services/finalize.service.d.ts +105 -0
  269. package/dist/core/sdd/services/finalize.service.js +499 -38
  270. package/dist/core/sdd/services/frontend-gap.service.js +22 -7
  271. package/dist/core/sdd/services/frontend-impact.service.d.ts +1 -1
  272. package/dist/core/sdd/services/governance-control-plane-runtime-adapters.d.ts +17 -0
  273. package/dist/core/sdd/services/governance-control-plane-runtime-adapters.js +38 -0
  274. package/dist/core/sdd/services/governance-control-plane.service.d.ts +66 -0
  275. package/dist/core/sdd/services/governance-control-plane.service.js +134 -0
  276. package/dist/core/sdd/services/ingest-deposito.service.js +1 -1
  277. package/dist/core/sdd/services/legacy-capability.service.d.ts +10 -7
  278. package/dist/core/sdd/services/legacy-capability.service.js +38 -21
  279. package/dist/core/sdd/services/mcp-runtime.service.d.ts +123 -8
  280. package/dist/core/sdd/services/mcp-runtime.service.js +1085 -33
  281. package/dist/core/sdd/services/onboard.service.js +2 -1
  282. package/dist/core/sdd/services/rebuild.service.js +6 -1
  283. package/dist/core/sdd/services/semantic-intent-classifier.service.d.ts +6 -0
  284. package/dist/core/sdd/services/semantic-intent-classifier.service.js +7 -0
  285. package/dist/core/sdd/services/skills-sync.service.d.ts +17 -5
  286. package/dist/core/sdd/services/skills-sync.service.js +55 -2
  287. package/dist/core/sdd/services/start.service.js +6 -4
  288. package/dist/core/sdd/skill-bundles-curation-schema.d.ts +66 -0
  289. package/dist/core/sdd/skill-bundles-curation-schema.js +52 -0
  290. package/dist/core/sdd/skill-evidence.d.ts +19 -0
  291. package/dist/core/sdd/skill-evidence.js +38 -0
  292. package/dist/core/sdd/skill-policy-pool.d.ts +46 -0
  293. package/dist/core/sdd/skill-policy-pool.js +185 -0
  294. package/dist/core/sdd/state.d.ts +23 -0
  295. package/dist/core/sdd/state.js +313 -66
  296. package/dist/core/sdd/store/sdd-stores.js +2 -2
  297. package/dist/core/sdd/structural-health.d.ts +55 -55
  298. package/dist/core/sdd/types.d.ts +60 -19
  299. package/dist/core/sdd/types.js +21 -0
  300. package/dist/core/sdd/upgrade-to-codesdd.d.ts +45 -0
  301. package/dist/core/sdd/upgrade-to-codesdd.js +179 -0
  302. package/dist/core/sdd/views.js +17 -0
  303. package/dist/core/sdd/workspace-schemas.d.ts +670 -19
  304. package/dist/core/sdd/workspace-schemas.js +285 -5
  305. package/dist/core/sdd/write-manifest.js +22 -4
  306. package/dist/core/shared/skill-generation.d.ts +1 -1
  307. package/dist/core/shared/skill-generation.js +15 -15
  308. package/dist/core/shared/tool-detection.d.ts +3 -3
  309. package/dist/core/shared/tool-detection.js +14 -14
  310. package/dist/core/specs-apply.js +6 -6
  311. package/dist/core/templates/index.d.ts +1 -1
  312. package/dist/core/templates/index.js +1 -1
  313. package/dist/core/templates/workflows/apply-change.js +14 -14
  314. package/dist/core/templates/workflows/archive-change.js +32 -32
  315. package/dist/core/templates/workflows/bulk-archive-change.js +25 -25
  316. package/dist/core/templates/workflows/continue-change.js +12 -12
  317. package/dist/core/templates/workflows/explore.js +29 -29
  318. package/dist/core/templates/workflows/feedback.js +6 -6
  319. package/dist/core/templates/workflows/ff-change.js +24 -24
  320. package/dist/core/templates/workflows/new-change.js +20 -20
  321. package/dist/core/templates/workflows/onboard.js +33 -33
  322. package/dist/core/templates/workflows/propose.js +23 -23
  323. package/dist/core/templates/workflows/sdd.js +8 -8
  324. package/dist/core/templates/workflows/sync-specs.js +19 -19
  325. package/dist/core/templates/workflows/verify-change.js +17 -17
  326. package/dist/core/update.d.ts +2 -2
  327. package/dist/core/update.js +16 -15
  328. package/dist/core/validation/constants.d.ts +1 -1
  329. package/dist/core/validation/constants.js +1 -1
  330. package/dist/core/view.js +11 -11
  331. package/dist/domains/sdd/index.d.ts +6 -0
  332. package/dist/domains/sdd/index.js +6 -0
  333. package/dist/infrastructures/sdd/index.d.ts +7 -0
  334. package/dist/infrastructures/sdd/index.js +6 -0
  335. package/dist/presentations/cli/sdd/index.d.ts +3 -0
  336. package/dist/presentations/cli/sdd/index.js +3 -0
  337. package/dist/shared/sdd/index.d.ts +3 -0
  338. package/dist/shared/sdd/index.js +2 -0
  339. package/dist/telemetry/config.d.ts +2 -1
  340. package/dist/telemetry/config.js +17 -8
  341. package/dist/telemetry/index.d.ts +10 -2
  342. package/dist/telemetry/index.js +40 -7
  343. package/dist/ui/ascii-patterns.d.ts +2 -2
  344. package/dist/ui/ascii-patterns.js +2 -2
  345. package/dist/ui/welcome-screen.js +2 -2
  346. package/dist/utils/change-metadata.d.ts +4 -4
  347. package/dist/utils/change-metadata.js +6 -6
  348. package/dist/utils/change-utils.d.ts +3 -3
  349. package/dist/utils/change-utils.js +5 -5
  350. package/dist/utils/file-system.js +1 -1
  351. package/dist/utils/interactive.js +1 -1
  352. package/dist/utils/item-discovery.js +4 -4
  353. package/dist/utils/legacy-spec-compat.d.ts +2 -0
  354. package/dist/utils/legacy-spec-compat.js +2 -0
  355. package/dist/utils/shell-detection.d.ts +1 -0
  356. package/dist/utils/shell-detection.js +16 -0
  357. package/package.json +34 -21
  358. package/schemas/sdd/1-spec.schema.json +1 -1
  359. package/schemas/sdd/2-plan.schema.json +280 -3
  360. package/schemas/sdd/3-tasks.schema.json +73 -1
  361. package/schemas/sdd/4-changelog.schema.json +1 -1
  362. package/schemas/sdd/5-quality.schema.json +701 -5
  363. package/schemas/sdd/adr.schema.json +148 -0
  364. package/schemas/sdd/agent-binding-adapter.schema.json +210 -0
  365. package/schemas/sdd/agent-binding-resolution.schema.json +338 -0
  366. package/schemas/sdd/agent-runtime-command-plan.schema.json +212 -0
  367. package/schemas/sdd/agent-runtime-opencode-run-evidence.schema.json +270 -0
  368. package/schemas/sdd/backlog-projection-plan.schema.json +180 -0
  369. package/schemas/sdd/backlog-provider-contract.schema.json +260 -0
  370. package/schemas/sdd/codesdd-plugin.schema.json +645 -0
  371. package/schemas/sdd/debate.schema.json +244 -0
  372. package/schemas/sdd/deepagent-decision-evidence.schema.json +58 -0
  373. package/schemas/sdd/deepagent-env-contract.schema.json +143 -0
  374. package/schemas/sdd/deepagent-quality-evidence.schema.json +108 -0
  375. package/schemas/sdd/deepagent-run-evidence.schema.json +192 -0
  376. package/schemas/sdd/deepagent-run-plan.schema.json +197 -0
  377. package/schemas/sdd/deepagent-run-request.schema.json +637 -0
  378. package/schemas/sdd/deepagent-subagent-evidence.schema.json +110 -0
  379. package/schemas/sdd/deepagent-tool-call-evidence.schema.json +78 -0
  380. package/schemas/sdd/discarded.schema.json +127 -0
  381. package/schemas/sdd/epic.schema.json +147 -0
  382. package/schemas/sdd/insight.schema.json +136 -0
  383. package/schemas/sdd/parallel-feat-automation-plan.schema.json +304 -0
  384. package/schemas/sdd/parallel-feat-automation-request.schema.json +109 -0
  385. package/schemas/sdd/parallel-feat-scheduler-request.schema.json +116 -0
  386. package/schemas/sdd/parallel-feat-scheduler-result.schema.json +404 -0
  387. package/schemas/sdd/plugin-artifact-manifest.schema.json +259 -0
  388. package/schemas/sdd/plugin-artifact-map.schema.json +223 -0
  389. package/schemas/sdd/plugin-compliance-index.schema.json +136 -0
  390. package/schemas/sdd/plugin-dry-run-plan.schema.json +260 -0
  391. package/schemas/sdd/plugin-evidence-manifest.schema.json +678 -0
  392. package/schemas/sdd/plugin-language-runtime.schema.json +103 -0
  393. package/schemas/sdd/plugin-package-governance.schema.json +74 -0
  394. package/schemas/sdd/plugin-policy-evaluation.schema.json +92 -0
  395. package/schemas/sdd/plugin-policy-pack-evaluation.schema.json +94 -0
  396. package/schemas/sdd/plugin-policy-pack.schema.json +196 -0
  397. package/schemas/sdd/plugin-registry.schema.json +729 -0
  398. package/schemas/sdd/plugin-rollback-manifest.schema.json +87 -0
  399. package/schemas/sdd/plugin-runtime-invocation-plan.schema.json +954 -0
  400. package/schemas/sdd/plugin-skill-binding-resolution.schema.json +305 -0
  401. package/schemas/sdd/plugin-skill-binding.schema.json +88 -0
  402. package/schemas/sdd/plugin-validation-manifest.schema.json +123 -0
  403. package/schemas/sdd/quality-architecture-schema.schema.json +216 -0
  404. package/schemas/sdd/quality-evidence-bundle.schema.json +1337 -0
  405. package/schemas/sdd/quality-run.schema.json +197 -0
  406. package/schemas/sdd/quality-scenario.schema.json +252 -0
  407. package/schemas/sdd/sdk-agent-plugin-quality-gate-input.schema.json +168 -0
  408. package/schemas/sdd/sdk-agent-plugin-quality-gate-report.schema.json +160 -0
  409. package/schemas/sdd/workspace-catalog.schema.json +13232 -35
  410. package/schemas/spec-driven/schema.yaml +4 -4
  411. package/schemas/spec-driven/templates/proposal.md +1 -1
  412. package/dist/utils/openspec-compat.d.ts +0 -2
  413. package/dist/utils/openspec-compat.js +0 -2
@@ -0,0 +1,645 @@
1
+ import { Command } from 'commander';
2
+ import { createRequire } from 'module';
3
+ import ora from 'ora';
4
+ import path from 'path';
5
+ import { promises as fs } from 'fs';
6
+ import { AI_TOOLS } from '../core/config.js';
7
+ import { CLI_NAME } from '../core/branding.js';
8
+ import { UpdateCommand } from '../core/update.js';
9
+ import { ListCommand } from '../core/list.js';
10
+ import { ArchiveCommand } from '../core/archive.js';
11
+ import { ViewCommand } from '../core/view.js';
12
+ import { registerSpecCommand } from '../commands/spec.js';
13
+ import { ChangeCommand } from '../commands/change.js';
14
+ import { ValidateCommand } from '../commands/validate.js';
15
+ import { ShowCommand } from '../commands/show.js';
16
+ import { CompletionCommand } from '../commands/completion.js';
17
+ import { FeedbackCommand } from '../commands/feedback.js';
18
+ import { registerConfigCommand } from '../commands/config.js';
19
+ import { registerSchemaCommand } from '../commands/schema.js';
20
+ import { registerSddCommand } from '../commands/sdd.js';
21
+ import { statusCommand, instructionsCommand, applyInstructionsCommand, templatesCommand, schemasCommand, newChangeCommand, DEFAULT_SCHEMA, } from '../commands/workflow/index.js';
22
+ import { maybeShowTelemetryNotice, trackCommand, trackCommandCompleted, shutdown } from '../telemetry/index.js';
23
+ const require = createRequire(import.meta.url);
24
+ const { version } = require('../../package.json');
25
+ /**
26
+ * Get the full command path for nested commands.
27
+ * For example: 'change show' -> 'change:show'
28
+ */
29
+ export function getCommandPath(command) {
30
+ const names = [];
31
+ let current = command;
32
+ while (current) {
33
+ const name = current.name();
34
+ if (name && name !== CLI_NAME) {
35
+ names.unshift(name);
36
+ }
37
+ current = current.parent;
38
+ }
39
+ return names.join(':') || CLI_NAME;
40
+ }
41
+ export function createCliProgram(options = {}) {
42
+ const program = new Command();
43
+ const telemetryEnabled = options.telemetry ?? true;
44
+ if (options.output) {
45
+ program.configureOutput(options.output);
46
+ }
47
+ if (options.exitOverride) {
48
+ program.exitOverride();
49
+ }
50
+ program
51
+ .name(CLI_NAME)
52
+ .description('AI-native system for spec-driven development')
53
+ .version(version);
54
+ // Global options
55
+ program.option('--no-color', 'Disable color output');
56
+ program.option('--no-telemetry', 'Disable telemetry for this run');
57
+ let currentCommandTiming = null;
58
+ // Apply global flags and telemetry before any command runs
59
+ // Note: preAction receives (thisCommand, actionCommand) where:
60
+ // - thisCommand: the command where hook was added (root program)
61
+ // - actionCommand: the command actually being executed (subcommand)
62
+ program.hook('preAction', async (thisCommand, actionCommand) => {
63
+ const opts = thisCommand.opts();
64
+ if (opts.color === false) {
65
+ process.env.NO_COLOR = '1';
66
+ }
67
+ if (opts.telemetry === false) {
68
+ process.env.CODESDD_TELEMETRY = '0';
69
+ process.env.CODESDD_TELEMETRY = '0';
70
+ }
71
+ if (!telemetryEnabled) {
72
+ return;
73
+ }
74
+ // Show first-run telemetry notice (if not seen)
75
+ await maybeShowTelemetryNotice();
76
+ // Track command execution (use actionCommand to get the actual subcommand)
77
+ const commandPath = getCommandPath(actionCommand);
78
+ currentCommandTiming = {
79
+ commandPath,
80
+ startedAt: Date.now(),
81
+ };
82
+ await trackCommand(commandPath, version);
83
+ });
84
+ // Shutdown telemetry after command completes
85
+ program.hook('postAction', async () => {
86
+ if (!telemetryEnabled) {
87
+ return;
88
+ }
89
+ if (currentCommandTiming) {
90
+ await trackCommandCompleted(currentCommandTiming.commandPath, version, Date.now() - currentCommandTiming.startedAt, 'success');
91
+ currentCommandTiming = null;
92
+ }
93
+ await shutdown();
94
+ });
95
+ const availableToolIds = AI_TOOLS.filter((tool) => tool.skillsDir).map((tool) => tool.value);
96
+ const toolsOptionDescription = `Configure AI tools non-interactively. Use "all", "none", or a comma-separated list of: ${availableToolIds.join(', ')}`;
97
+ function normalizeSddLang(value) {
98
+ if (!value)
99
+ return undefined;
100
+ if (value === 'pt-BR' || value === 'en-US')
101
+ return value;
102
+ throw new Error(`Invalid value for --lang: "${value}". Use pt-BR or en-US.`);
103
+ }
104
+ function normalizeSddLayout(value) {
105
+ if (!value)
106
+ return undefined;
107
+ if (value === 'legacy' || value === 'pt-BR' || value === 'en-US')
108
+ return value;
109
+ throw new Error(`Invalid value for --layout: "${value}". Use en-US, legacy, or pt-BR.`);
110
+ }
111
+ async function runInitCommand(targetPath, options) {
112
+ // Validate that the path is a valid directory
113
+ const resolvedPath = path.resolve(targetPath);
114
+ try {
115
+ const stats = await fs.stat(resolvedPath);
116
+ if (!stats.isDirectory()) {
117
+ throw new Error(`Path "${targetPath}" is not a directory`);
118
+ }
119
+ }
120
+ catch (error) {
121
+ if (error.code === 'ENOENT') {
122
+ if (!options?.silent) {
123
+ console.log(`Directory "${targetPath}" doesn't exist, it will be created.`);
124
+ }
125
+ }
126
+ else if (error.message && error.message.includes('not a directory')) {
127
+ throw error;
128
+ }
129
+ else {
130
+ throw new Error(`Cannot access path "${targetPath}": ${error.message}`);
131
+ }
132
+ }
133
+ const { InitCommand } = await import('../core/init.js');
134
+ const initCommand = new InitCommand({
135
+ tools: options?.tools,
136
+ force: options?.force,
137
+ profile: options?.profile,
138
+ interactive: options?.interactive,
139
+ allowNoToolsFallback: options?.allowNoToolsFallback,
140
+ silent: options?.silent,
141
+ });
142
+ await initCommand.execute(targetPath);
143
+ }
144
+ async function runFullInstallCommand(targetPath, options) {
145
+ await runInitCommand(targetPath, options);
146
+ const { SddInitCommand } = await import('../core/sdd/init.js');
147
+ const sddInitCommand = new SddInitCommand();
148
+ await sddInitCommand.execute(targetPath, {
149
+ frontendEnabled: options?.frontend ?? true,
150
+ language: normalizeSddLang(options?.lang),
151
+ layout: normalizeSddLayout(options?.layout),
152
+ render: true,
153
+ });
154
+ }
155
+ async function runReloadCommand(targetPath, options) {
156
+ await runInitCommand(targetPath, {
157
+ tools: options?.tools,
158
+ force: options?.force,
159
+ profile: options?.profile,
160
+ allowNoToolsFallback: true,
161
+ interactive: false,
162
+ silent: true,
163
+ });
164
+ const language = normalizeSddLang(options?.lang);
165
+ const layout = normalizeSddLayout(options?.layout);
166
+ const frontendEnabled = options?.frontend ?? true;
167
+ const render = options?.render ?? true;
168
+ const { SddInitCommand, SddInitContextCommand } = await import('../core/sdd/init.js');
169
+ const sddInitCommand = new SddInitCommand();
170
+ const initResult = await sddInitCommand.execute(targetPath, {
171
+ frontendEnabled,
172
+ language,
173
+ layout,
174
+ render: false,
175
+ });
176
+ const contextCommand = new SddInitContextCommand();
177
+ const contextResult = await contextCommand.execute(targetPath, {
178
+ mode: 'merge',
179
+ deep: true,
180
+ render,
181
+ frontendEnabled,
182
+ language,
183
+ layout,
184
+ });
185
+ return {
186
+ memoryDir: initResult.memoryDir,
187
+ frontendEnabled: initResult.frontendEnabled,
188
+ rendered: contextResult.rendered,
189
+ skillsSeeded: initResult.skillsSeeded,
190
+ localSkillsMaterialized: initResult.localSkillsMaterialized,
191
+ syncedTools: initResult.syncedTools,
192
+ contextUpdated: contextResult.sddBootstrap.updated,
193
+ };
194
+ }
195
+ program
196
+ .command('init [path]')
197
+ .description('Initialize CodeSDD in your project')
198
+ .alias('iniciar')
199
+ .option('--tools <tools>', toolsOptionDescription)
200
+ .option('--force', 'Auto-cleanup legacy files without prompting')
201
+ .option('--profile <profile>', 'Override global config profile (core or custom)')
202
+ .action(async (targetPath = '.', options) => {
203
+ try {
204
+ await runInitCommand(targetPath, options);
205
+ }
206
+ catch (error) {
207
+ console.log();
208
+ ora().fail(`Error: ${error.message}`);
209
+ process.exit(1);
210
+ }
211
+ });
212
+ program
213
+ .command('reload [path]')
214
+ .description('Reload CodeSDD project files using the installed CLI version')
215
+ .alias('recarregar')
216
+ .option('--tools <tools>', toolsOptionDescription)
217
+ .option('--force', 'Auto-cleanup legacy files without prompting')
218
+ .option('--profile <profile>', 'Override global config profile (core or custom)')
219
+ .option('--lang <lang>', 'SDD language: pt-BR|en-US')
220
+ .option('--layout <layout>', 'SDD folder layout: en-US|legacy|pt-BR')
221
+ .option('--no-frontend', 'Disable frontend module in the SDD bootstrap')
222
+ .option('--no-render', 'Do not render Markdown views after reload')
223
+ .option('--json', 'Emit reload result as JSON')
224
+ .action(async (targetPath = '.', options) => {
225
+ try {
226
+ const result = await runReloadCommand(targetPath, options);
227
+ if (options?.json) {
228
+ console.log(JSON.stringify({ version, ...result }, null, 2));
229
+ return;
230
+ }
231
+ console.log(`CodeSDD project reloaded with CLI v${version}.`);
232
+ console.log(`Memory directory: ${result.memoryDir}`);
233
+ console.log(`Frontend module: ${result.frontendEnabled ? 'enabled' : 'disabled'}`);
234
+ console.log(`Views generated: ${result.rendered ? 'yes' : 'no'}`);
235
+ console.log(`Curated skills loaded: ${result.skillsSeeded}`);
236
+ console.log(`Local skills generated: ${result.localSkillsMaterialized}`);
237
+ console.log(`Tools synced: ${result.syncedTools.length > 0 ? result.syncedTools.join(', ') : 'none detected'}`);
238
+ }
239
+ catch (error) {
240
+ console.log();
241
+ ora().fail(`Error: ${error.message}`);
242
+ process.exit(1);
243
+ }
244
+ });
245
+ program
246
+ .command('install [path]')
247
+ .description('Install CodeSDD completely in your project (base + SDD)')
248
+ .alias('instalar')
249
+ .option('--tools <tools>', toolsOptionDescription)
250
+ .option('--force', 'Auto-cleanup legacy files without prompting')
251
+ .option('--profile <profile>', 'Override global config profile (core or custom)')
252
+ .option('--lang <lang>', 'SDD language: pt-BR|en-US')
253
+ .option('--layout <layout>', 'SDD folder layout: en-US|legacy|pt-BR')
254
+ .option('--no-frontend', 'Disable frontend module in the SDD bootstrap')
255
+ .action(async (targetPath = '.', options) => {
256
+ try {
257
+ await runFullInstallCommand(targetPath, options);
258
+ }
259
+ catch (error) {
260
+ console.log();
261
+ ora().fail(`Error: ${error.message}`);
262
+ process.exit(1);
263
+ }
264
+ });
265
+ // Hidden alias: 'experimental' -> 'init' for backwards compatibility
266
+ program
267
+ .command('experimental', { hidden: true })
268
+ .description('Alias for init (deprecated)')
269
+ .option('--tool <tool-id>', 'Target AI tool (maps to --tools)')
270
+ .option('--no-interactive', 'Disable interactive prompts')
271
+ .action(async (options) => {
272
+ try {
273
+ console.log(`Note: "${CLI_NAME} experimental" is deprecated. Use "${CLI_NAME} init" instead.`);
274
+ const { InitCommand } = await import('../core/init.js');
275
+ const initCommand = new InitCommand({
276
+ tools: options?.tool,
277
+ interactive: options?.noInteractive === true ? false : undefined,
278
+ });
279
+ await initCommand.execute('.');
280
+ }
281
+ catch (error) {
282
+ console.log();
283
+ ora().fail(`Error: ${error.message}`);
284
+ process.exit(1);
285
+ }
286
+ });
287
+ program
288
+ .command('update [path]')
289
+ .description('Update CodeSDD instruction files')
290
+ .option('--force', 'Force update even when tools are up to date')
291
+ .action(async (targetPath = '.', options) => {
292
+ try {
293
+ const resolvedPath = path.resolve(targetPath);
294
+ const updateCommand = new UpdateCommand({ force: options?.force });
295
+ await updateCommand.execute(resolvedPath);
296
+ }
297
+ catch (error) {
298
+ console.log(); // Empty line for spacing
299
+ ora().fail(`Error: ${error.message}`);
300
+ process.exit(1);
301
+ }
302
+ });
303
+ program
304
+ .command('list')
305
+ .description('List items (changes by default). Use --specs to list specs.')
306
+ .option('--specs', 'List specs instead of changes')
307
+ .option('--changes', 'List changes explicitly (default)')
308
+ .option('--sort <order>', 'Sort order: "recent" (default) or "name"', 'recent')
309
+ .option('--json', 'Output as JSON (for programmatic use)')
310
+ .action(async (options) => {
311
+ try {
312
+ const listCommand = new ListCommand();
313
+ const mode = options?.specs ? 'specs' : 'changes';
314
+ const sort = options?.sort === 'name' ? 'name' : 'recent';
315
+ await listCommand.execute('.', mode, { sort, json: options?.json });
316
+ }
317
+ catch (error) {
318
+ console.log(); // Empty line for spacing
319
+ ora().fail(`Error: ${error.message}`);
320
+ process.exit(1);
321
+ }
322
+ });
323
+ program
324
+ .command('view')
325
+ .description('Display an interactive dashboard of specs and changes')
326
+ .action(async () => {
327
+ try {
328
+ const viewCommand = new ViewCommand();
329
+ await viewCommand.execute('.');
330
+ }
331
+ catch (error) {
332
+ console.log(); // Empty line for spacing
333
+ ora().fail(`Error: ${error.message}`);
334
+ process.exit(1);
335
+ }
336
+ });
337
+ // Change command with subcommands
338
+ const changeCmd = program
339
+ .command('change')
340
+ .description('Manage legacy change proposals');
341
+ // Deprecation notice for noun-based commands
342
+ changeCmd.hook('preAction', () => {
343
+ console.error(`Warning: The "${CLI_NAME} change ..." commands are deprecated. Prefer verb-first commands (e.g., "${CLI_NAME} list", "${CLI_NAME} validate --changes").`);
344
+ });
345
+ changeCmd
346
+ .command('show [change-name]')
347
+ .description('Show a change proposal in JSON or markdown format')
348
+ .option('--json', 'Output as JSON')
349
+ .option('--deltas-only', 'Show only deltas (JSON only)')
350
+ .option('--requirements-only', 'Alias for --deltas-only (deprecated)')
351
+ .option('--no-interactive', 'Disable interactive prompts')
352
+ .action(async (changeName, options) => {
353
+ try {
354
+ const changeCommand = new ChangeCommand();
355
+ await changeCommand.show(changeName, options);
356
+ }
357
+ catch (error) {
358
+ console.error(`Error: ${error.message}`);
359
+ process.exitCode = 1;
360
+ }
361
+ });
362
+ changeCmd
363
+ .command('list')
364
+ .description('List all active changes (DEPRECATED: use "codesdd list" instead)')
365
+ .option('--json', 'Output as JSON')
366
+ .option('--long', 'Show id and title with counts')
367
+ .action(async (options) => {
368
+ try {
369
+ // Specific list-only deprecation banner; the group-level preAction in changeCmd.hook
370
+ // already emits the broader "codesdd change ..." warning, so do not duplicate it here.
371
+ const changeCommand = new ChangeCommand();
372
+ await changeCommand.list(options);
373
+ }
374
+ catch (error) {
375
+ console.error(`Error: ${error.message}`);
376
+ process.exitCode = 1;
377
+ }
378
+ });
379
+ changeCmd
380
+ .command('validate [change-name]')
381
+ .description('Validate a change proposal')
382
+ .option('--strict', 'Enable strict validation mode')
383
+ .option('--json', 'Output validation report as JSON')
384
+ .option('--no-interactive', 'Disable interactive prompts')
385
+ .action(async (changeName, options) => {
386
+ try {
387
+ const changeCommand = new ChangeCommand();
388
+ await changeCommand.validate(changeName, options);
389
+ if (typeof process.exitCode === 'number' && process.exitCode !== 0) {
390
+ process.exit(process.exitCode);
391
+ }
392
+ }
393
+ catch (error) {
394
+ console.error(`Error: ${error.message}`);
395
+ process.exitCode = 1;
396
+ }
397
+ });
398
+ program
399
+ .command('archive [change-name]')
400
+ .description('Archive a completed change and update main specs')
401
+ .alias('arquivar')
402
+ .option('-y, --yes', 'Skip confirmation prompts')
403
+ .option('--skip-specs', 'Skip spec update operations (useful for infrastructure, tooling, or doc-only changes)')
404
+ .option('--no-validate', 'Skip validation (not recommended, requires confirmation)')
405
+ .action(async (changeName, options) => {
406
+ try {
407
+ const archiveCommand = new ArchiveCommand();
408
+ await archiveCommand.execute(changeName, options);
409
+ }
410
+ catch (error) {
411
+ console.log(); // Empty line for spacing
412
+ ora().fail(`Error: ${error.message}`);
413
+ process.exit(1);
414
+ }
415
+ });
416
+ registerSpecCommand(program);
417
+ registerConfigCommand(program);
418
+ registerSchemaCommand(program);
419
+ registerSddCommand(program);
420
+ // Top-level validate command
421
+ program
422
+ .command('validate [item-name]')
423
+ .description('Validate changes and specs')
424
+ .option('--all', 'Validate all changes and specs')
425
+ .option('--changes', 'Validate all changes')
426
+ .option('--specs', 'Validate all specs')
427
+ .option('--type <type>', 'Specify item type when ambiguous: change|spec')
428
+ .option('--strict', 'Enable strict validation mode')
429
+ .option('--json', 'Output validation results as JSON')
430
+ .option('--concurrency <n>', 'Max concurrent validations (defaults to env CODESDD_CONCURRENCY or 6)')
431
+ .option('--no-interactive', 'Disable interactive prompts')
432
+ .action(async (itemName, options) => {
433
+ try {
434
+ const validateCommand = new ValidateCommand();
435
+ await validateCommand.execute(itemName, options);
436
+ }
437
+ catch (error) {
438
+ console.log();
439
+ ora().fail(`Error: ${error.message}`);
440
+ process.exit(1);
441
+ }
442
+ });
443
+ // Top-level show command
444
+ program
445
+ .command('show [item-name]')
446
+ .description('Show a change or spec')
447
+ .option('--json', 'Output as JSON')
448
+ .option('--type <type>', 'Specify item type when ambiguous: change|spec')
449
+ .option('--no-interactive', 'Disable interactive prompts')
450
+ // change-only flags
451
+ .option('--deltas-only', 'Show only deltas (JSON only, change)')
452
+ .option('--requirements-only', 'Alias for --deltas-only (deprecated, change)')
453
+ // spec-only flags
454
+ .option('--requirements', 'JSON only: Show only requirements (exclude scenarios)')
455
+ .option('--no-scenarios', 'JSON only: Exclude scenario content')
456
+ .option('-r, --requirement <id>', 'JSON only: Show specific requirement by ID (1-based)')
457
+ // allow unknown options to pass-through to underlying command implementation
458
+ .allowUnknownOption(true)
459
+ .action(async (itemName, options) => {
460
+ try {
461
+ const showCommand = new ShowCommand();
462
+ await showCommand.execute(itemName, options ?? {});
463
+ }
464
+ catch (error) {
465
+ console.log();
466
+ ora().fail(`Error: ${error.message}`);
467
+ process.exit(1);
468
+ }
469
+ });
470
+ // Feedback command
471
+ program
472
+ .command('feedback <message>')
473
+ .description('Submit feedback about CodeSDD')
474
+ .option('--body <text>', 'Detailed description for the feedback')
475
+ .action(async (message, options) => {
476
+ try {
477
+ const feedbackCommand = new FeedbackCommand();
478
+ await feedbackCommand.execute(message, options);
479
+ }
480
+ catch (error) {
481
+ console.log();
482
+ ora().fail(`Error: ${error.message}`);
483
+ process.exit(1);
484
+ }
485
+ });
486
+ // Completion command with subcommands
487
+ const completionCmd = program
488
+ .command('completion')
489
+ .description('Manage shell completions for CodeSDD CLI');
490
+ completionCmd
491
+ .command('generate [shell]')
492
+ .description('Generate completion script for a shell (outputs to stdout)')
493
+ .action(async (shell) => {
494
+ try {
495
+ const completionCommand = new CompletionCommand();
496
+ await completionCommand.generate({ shell });
497
+ }
498
+ catch (error) {
499
+ console.log();
500
+ ora().fail(`Error: ${error.message}`);
501
+ process.exit(1);
502
+ }
503
+ });
504
+ completionCmd
505
+ .command('install [shell]')
506
+ .description('Install completion script for a shell')
507
+ .option('--verbose', 'Show detailed installation output')
508
+ .action(async (shell, options) => {
509
+ try {
510
+ const completionCommand = new CompletionCommand();
511
+ await completionCommand.install({ shell, verbose: options?.verbose });
512
+ }
513
+ catch (error) {
514
+ console.log();
515
+ ora().fail(`Error: ${error.message}`);
516
+ process.exit(1);
517
+ }
518
+ });
519
+ completionCmd
520
+ .command('uninstall [shell]')
521
+ .description('Uninstall completion script for a shell')
522
+ .option('-y, --yes', 'Skip confirmation prompts')
523
+ .action(async (shell, options) => {
524
+ try {
525
+ const completionCommand = new CompletionCommand();
526
+ await completionCommand.uninstall({ shell, yes: options?.yes });
527
+ }
528
+ catch (error) {
529
+ console.log();
530
+ ora().fail(`Error: ${error.message}`);
531
+ process.exit(1);
532
+ }
533
+ });
534
+ // Hidden command for machine-readable completion data
535
+ program
536
+ .command('__complete <type>', { hidden: true })
537
+ .description('Output completion data in machine-readable format (internal use)')
538
+ .action(async (type) => {
539
+ try {
540
+ const completionCommand = new CompletionCommand();
541
+ await completionCommand.complete({ type });
542
+ }
543
+ catch (error) {
544
+ // Silently fail for graceful shell completion experience
545
+ process.exitCode = 1;
546
+ }
547
+ });
548
+ // ═══════════════════════════════════════════════════════════
549
+ // Workflow Commands (formerly experimental)
550
+ // ═══════════════════════════════════════════════════════════
551
+ // Status command
552
+ program
553
+ .command('status')
554
+ .description('Display artifact completion status for a change')
555
+ .option('--change <id>', 'Change name to show status for')
556
+ .option('--schema <name>', 'Schema override (auto-detected from config.yaml)')
557
+ .option('--json', 'Output as JSON')
558
+ .action(async (options) => {
559
+ try {
560
+ await statusCommand(options);
561
+ }
562
+ catch (error) {
563
+ console.log();
564
+ ora().fail(`Error: ${error.message}`);
565
+ process.exit(1);
566
+ }
567
+ });
568
+ // Instructions command
569
+ program
570
+ .command('instructions [artifact]')
571
+ .description('Output enriched instructions for creating an artifact or applying tasks')
572
+ .option('--change <id>', 'Change name')
573
+ .option('--schema <name>', 'Schema override (auto-detected from config.yaml)')
574
+ .option('--json', 'Output as JSON')
575
+ .action(async (artifactId, options) => {
576
+ try {
577
+ // Special case: "apply" is not an artifact, but a command to get apply instructions
578
+ if (artifactId === 'apply') {
579
+ await applyInstructionsCommand(options);
580
+ }
581
+ else {
582
+ await instructionsCommand(artifactId, options);
583
+ }
584
+ }
585
+ catch (error) {
586
+ console.log();
587
+ ora().fail(`Error: ${error.message}`);
588
+ process.exit(1);
589
+ }
590
+ });
591
+ // Templates command
592
+ program
593
+ .command('templates')
594
+ .description('Show resolved template paths for all artifacts in a schema')
595
+ .option('--schema <name>', `Schema to use (default: ${DEFAULT_SCHEMA})`)
596
+ .option('--json', 'Output as JSON mapping artifact IDs to template paths')
597
+ .action(async (options) => {
598
+ try {
599
+ await templatesCommand(options);
600
+ }
601
+ catch (error) {
602
+ console.log();
603
+ ora().fail(`Error: ${error.message}`);
604
+ process.exit(1);
605
+ }
606
+ });
607
+ // Schemas command
608
+ program
609
+ .command('schemas')
610
+ .description('List available workflow schemas with descriptions')
611
+ .option('--json', 'Output as JSON (for agent use)')
612
+ .action(async (options) => {
613
+ try {
614
+ await schemasCommand(options);
615
+ }
616
+ catch (error) {
617
+ console.log();
618
+ ora().fail(`Error: ${error.message}`);
619
+ process.exit(1);
620
+ }
621
+ });
622
+ // New command group with change subcommand
623
+ const newCmd = program.command('new').description('Create new items');
624
+ newCmd
625
+ .command('change <name>')
626
+ .description('Create a new change directory')
627
+ .option('--description <text>', 'Description to add to README.md')
628
+ .option('--schema <name>', `Workflow schema to use (default: ${DEFAULT_SCHEMA})`)
629
+ .action(async (name, options) => {
630
+ try {
631
+ await newChangeCommand(name, options);
632
+ }
633
+ catch (error) {
634
+ console.log();
635
+ ora().fail(`Error: ${error.message}`);
636
+ process.exit(1);
637
+ }
638
+ });
639
+ return program;
640
+ }
641
+ export async function runCli(argv = process.argv) {
642
+ const program = createCliProgram();
643
+ await program.parseAsync(argv);
644
+ }
645
+ //# sourceMappingURL=program.js.map
@@ -6,7 +6,7 @@ import { ChangeParser } from '../core/parsers/change-parser.js';
6
6
  import { isInteractive } from '../utils/interactive.js';
7
7
  import { getActiveChangeIds } from '../utils/item-discovery.js';
8
8
  import { CLI_NAME } from '../core/branding.js';
9
- import { resolveOpenSpecSubpath } from '../core/sdd/services/legacy-capability.service.js';
9
+ import { resolveLegacySpecSubpath } from '../core/sdd/services/legacy-capability.service.js';
10
10
  import { captureFingerprintsForChange, writeMeta } from '../core/sdd/fingerprint.js';
11
11
  // Constants for better maintainability
12
12
  const ARCHIVE_DIR = 'archive';
@@ -24,7 +24,7 @@ export class ChangeCommand {
24
24
  * Note: --requirements-only is deprecated alias for --deltas-only
25
25
  */
26
26
  async show(changeName, options) {
27
- const changesPath = resolveOpenSpecSubpath(process.cwd(), 'changes');
27
+ const changesPath = resolveLegacySpecSubpath(process.cwd(), 'changes');
28
28
  if (!changeName) {
29
29
  const canPrompt = isInteractive(options);
30
30
  const changes = await this.getActiveChanges(changesPath);
@@ -90,7 +90,7 @@ export class ChangeCommand {
90
90
  * - JSON: array of { id, title, deltaCount, taskStatus }, sorted by id
91
91
  */
92
92
  async list(options) {
93
- const changesPath = resolveOpenSpecSubpath(process.cwd(), 'changes');
93
+ const changesPath = resolveLegacySpecSubpath(process.cwd(), 'changes');
94
94
  const changes = await this.getActiveChanges(changesPath);
95
95
  if (options?.json) {
96
96
  const changeDetails = await Promise.all(changes.map(async (changeName) => {
@@ -173,7 +173,7 @@ export class ChangeCommand {
173
173
  }
174
174
  }
175
175
  async validate(changeName, options) {
176
- const changesPath = resolveOpenSpecSubpath(process.cwd(), 'changes');
176
+ const changesPath = resolveLegacySpecSubpath(process.cwd(), 'changes');
177
177
  if (!changeName) {
178
178
  const canPrompt = isInteractive(options);
179
179
  const changes = await getActiveChangeIds();
@@ -211,7 +211,7 @@ export class ChangeCommand {
211
211
  }
212
212
  else {
213
213
  if (report.valid) {
214
- const mainSpecsDir = resolveOpenSpecSubpath(process.cwd(), 'specs');
214
+ const mainSpecsDir = resolveLegacySpecSubpath(process.cwd(), 'specs');
215
215
  try {
216
216
  const meta = await captureFingerprintsForChange(changeDir, mainSpecsDir, {
217
217
  sourceChangeId: changeName,