@devtrack-solution/codesdd 1.2.2 → 1.2.3

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 (345) hide show
  1. package/.sdd/skills/curated/api-clean-flask-langgraph/SKILL.md +17 -17
  2. package/.sdd/skills/curated/devtrack-api/SKILL.md +160 -28
  3. package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +1 -1
  4. package/.sdd/skills/curated/devtrack-api/references/architecture-governance.md +8 -7
  5. package/.sdd/skills/curated/devtrack-api/references/consumer-sync-policy.md +93 -0
  6. package/.sdd/skills/curated/devtrack-api/references/contract-pack.yaml +317 -0
  7. package/.sdd/skills/curated/devtrack-api/references/field-validation-protocol.md +95 -0
  8. package/.sdd/skills/curated/devtrack-api/references/foundation-layout.md +295 -0
  9. package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +4 -4
  10. package/.sdd/skills/curated/devtrack-api/references/imports-lint.md +4 -0
  11. package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +2 -2
  12. package/LICENSE +1 -1
  13. package/README.md +243 -51
  14. package/bin/codesdd.js +3 -2
  15. package/dist/cli/index.d.ts +2 -2
  16. package/dist/cli/index.js +11 -558
  17. package/dist/cli/program.d.ts +14 -0
  18. package/dist/cli/program.js +645 -0
  19. package/dist/commands/change.js +5 -5
  20. package/dist/commands/completion.d.ts +1 -1
  21. package/dist/commands/completion.js +9 -2
  22. package/dist/commands/config.js +159 -20
  23. package/dist/commands/feedback.js +1 -1
  24. package/dist/commands/schema.d.ts +63 -0
  25. package/dist/commands/schema.js +12 -12
  26. package/dist/commands/sdd/backlog.d.ts +3 -0
  27. package/dist/commands/sdd/backlog.js +54 -0
  28. package/dist/commands/sdd/execution.js +147 -16
  29. package/dist/commands/sdd/plugin.d.ts +3 -0
  30. package/dist/commands/sdd/plugin.js +153 -0
  31. package/dist/commands/sdd/shared.js +2 -23
  32. package/dist/commands/sdd/skills.js +7 -0
  33. package/dist/commands/sdd.js +69 -12
  34. package/dist/commands/spec.js +9 -9
  35. package/dist/commands/validate.js +6 -6
  36. package/dist/commands/workflow/instructions.js +6 -6
  37. package/dist/commands/workflow/new-change.js +3 -3
  38. package/dist/commands/workflow/shared.d.ts +1 -1
  39. package/dist/commands/workflow/shared.js +4 -4
  40. package/dist/core/archive.js +15 -5
  41. package/dist/core/artifact-graph/instruction-loader.d.ts +1 -1
  42. package/dist/core/artifact-graph/instruction-loader.js +3 -3
  43. package/dist/core/artifact-graph/resolver.d.ts +4 -4
  44. package/dist/core/artifact-graph/resolver.js +6 -6
  45. package/dist/core/branding.js +3 -3
  46. package/dist/core/cli/command-matrix.js +10 -1
  47. package/dist/core/cli-command-quality.d.ts +27 -0
  48. package/dist/core/cli-command-quality.js +171 -0
  49. package/dist/core/command-generation/adapters/costrict.d.ts +1 -1
  50. package/dist/core/command-generation/adapters/costrict.js +2 -2
  51. package/dist/core/command-generation/types.d.ts +1 -1
  52. package/dist/core/completions/command-registry.d.ts +1 -1
  53. package/dist/core/completions/command-registry.js +155 -12
  54. package/dist/core/completions/completion-provider.d.ts +14 -1
  55. package/dist/core/completions/completion-provider.js +29 -1
  56. package/dist/core/completions/generators/bash-generator.d.ts +1 -1
  57. package/dist/core/completions/generators/bash-generator.js +20 -12
  58. package/dist/core/completions/generators/fish-generator.d.ts +9 -1
  59. package/dist/core/completions/generators/fish-generator.js +39 -25
  60. package/dist/core/completions/generators/powershell-generator.d.ts +1 -1
  61. package/dist/core/completions/generators/powershell-generator.js +21 -11
  62. package/dist/core/completions/generators/zsh-generator.d.ts +3 -6
  63. package/dist/core/completions/generators/zsh-generator.js +21 -42
  64. package/dist/core/completions/installers/bash-installer.js +6 -6
  65. package/dist/core/completions/installers/fish-installer.js +1 -1
  66. package/dist/core/completions/installers/powershell-installer.js +14 -14
  67. package/dist/core/completions/installers/zsh-installer.d.ts +7 -1
  68. package/dist/core/completions/installers/zsh-installer.js +36 -8
  69. package/dist/core/completions/templates/bash-templates.d.ts +1 -1
  70. package/dist/core/completions/templates/bash-templates.js +12 -6
  71. package/dist/core/completions/templates/fish-templates.d.ts +2 -2
  72. package/dist/core/completions/templates/fish-templates.js +20 -9
  73. package/dist/core/completions/templates/powershell-templates.d.ts +1 -1
  74. package/dist/core/completions/templates/powershell-templates.js +13 -4
  75. package/dist/core/completions/templates/zsh-templates.d.ts +1 -1
  76. package/dist/core/completions/templates/zsh-templates.js +18 -9
  77. package/dist/core/config-schema.d.ts +3 -1
  78. package/dist/core/config-schema.js +26 -1
  79. package/dist/core/config.d.ts +3 -3
  80. package/dist/core/config.js +4 -4
  81. package/dist/core/global-config.d.ts +41 -12
  82. package/dist/core/global-config.js +344 -27
  83. package/dist/core/index.d.ts +1 -1
  84. package/dist/core/index.js +2 -2
  85. package/dist/core/init.d.ts +6 -1
  86. package/dist/core/init.js +99 -77
  87. package/dist/core/legacy-cleanup.d.ts +17 -17
  88. package/dist/core/legacy-cleanup.js +96 -79
  89. package/dist/core/list.js +18 -4
  90. package/dist/core/migration.d.ts +3 -1
  91. package/dist/core/migration.js +7 -8
  92. package/dist/core/parsers/change-parser.js +1 -1
  93. package/dist/core/parsers/markdown-parser.js +2 -2
  94. package/dist/core/profile-sync-drift.d.ts +1 -1
  95. package/dist/core/profile-sync-drift.js +13 -13
  96. package/dist/core/project-config.d.ts +4 -4
  97. package/dist/core/project-config.js +11 -11
  98. package/dist/core/schemas/change.schema.d.ts +1 -1
  99. package/dist/core/schemas/change.schema.js +1 -1
  100. package/dist/core/schemas/spec.schema.d.ts +1 -1
  101. package/dist/core/schemas/spec.schema.js +1 -1
  102. package/dist/core/sdd/adr.js +23 -1
  103. package/dist/core/sdd/agent-binding.d.ts +346 -0
  104. package/dist/core/sdd/agent-binding.js +343 -0
  105. package/dist/core/sdd/backlog-cli.d.ts +16 -0
  106. package/dist/core/sdd/backlog-cli.js +146 -0
  107. package/dist/core/sdd/backlog-conflict-policy.d.ts +58 -0
  108. package/dist/core/sdd/backlog-conflict-policy.js +230 -0
  109. package/dist/core/sdd/backlog-projection.d.ts +8 -0
  110. package/dist/core/sdd/backlog-projection.js +89 -0
  111. package/dist/core/sdd/backlog-provider-contract.d.ts +252 -0
  112. package/dist/core/sdd/backlog-provider-contract.js +158 -0
  113. package/dist/core/sdd/bootstrap.js +2 -2
  114. package/dist/core/sdd/check.d.ts +42 -0
  115. package/dist/core/sdd/check.js +22 -22
  116. package/dist/core/sdd/contract.d.ts +13 -0
  117. package/dist/core/sdd/contract.js +36 -0
  118. package/dist/core/sdd/coordination/coordination-adapters.d.ts +38 -0
  119. package/dist/core/sdd/coordination/coordination-adapters.js +139 -1
  120. package/dist/core/sdd/deepagent-contracts.d.ts +276 -0
  121. package/dist/core/sdd/deepagent-contracts.js +173 -0
  122. package/dist/core/sdd/deepagents/adr-governor.d.ts +2 -0
  123. package/dist/core/sdd/deepagents/adr-governor.js +30 -0
  124. package/dist/core/sdd/deepagents/backend.d.ts +63 -0
  125. package/dist/core/sdd/deepagents/backend.js +174 -0
  126. package/dist/core/sdd/deepagents/codesdd-tools.d.ts +39 -0
  127. package/dist/core/sdd/deepagents/codesdd-tools.js +83 -0
  128. package/dist/core/sdd/deepagents/evidence-mapper.d.ts +86 -0
  129. package/dist/core/sdd/deepagents/evidence-mapper.js +178 -0
  130. package/dist/core/sdd/deepagents/model-provider.d.ts +53 -0
  131. package/dist/core/sdd/deepagents/model-provider.js +379 -0
  132. package/dist/core/sdd/deepagents/policy-enforcement.d.ts +30 -0
  133. package/dist/core/sdd/deepagents/policy-enforcement.js +90 -0
  134. package/dist/core/sdd/deepagents/policy.d.ts +75 -0
  135. package/dist/core/sdd/deepagents/policy.js +358 -0
  136. package/dist/core/sdd/deepagents/quality-witness.d.ts +3 -0
  137. package/dist/core/sdd/deepagents/quality-witness.js +77 -0
  138. package/dist/core/sdd/deepagents/reversa-subagents.d.ts +75 -0
  139. package/dist/core/sdd/deepagents/reversa-subagents.js +182 -0
  140. package/dist/core/sdd/deepagents/runtime-factory.d.ts +90 -0
  141. package/dist/core/sdd/deepagents/runtime-factory.js +231 -0
  142. package/dist/core/sdd/deepagents/runtime-loader.d.ts +16 -0
  143. package/dist/core/sdd/deepagents/runtime-loader.js +65 -0
  144. package/dist/core/sdd/default-bootstrap-files.d.ts +2 -2
  145. package/dist/core/sdd/default-bootstrap-files.js +36 -2
  146. package/dist/core/sdd/default-skills.d.ts +30 -0
  147. package/dist/core/sdd/default-skills.js +181 -5
  148. package/dist/core/sdd/devtrack-api-appliance.d.ts +84 -0
  149. package/dist/core/sdd/devtrack-api-appliance.js +257 -0
  150. package/dist/core/sdd/devtrack-api-architecture.d.ts +31 -0
  151. package/dist/core/sdd/devtrack-api-architecture.js +608 -0
  152. package/dist/core/sdd/devtrack-api-import-boundary.d.ts +19 -0
  153. package/dist/core/sdd/devtrack-api-import-boundary.js +32 -0
  154. package/dist/core/sdd/diagnose.d.ts +59 -0
  155. package/dist/core/sdd/diagnose.js +37 -37
  156. package/dist/core/sdd/docs-sync.js +33 -5
  157. package/dist/core/sdd/domain/post-active-validation.d.ts +7 -0
  158. package/dist/core/sdd/domain/post-active-validation.js +61 -0
  159. package/dist/core/sdd/domain/transition-engine.js +1 -0
  160. package/dist/core/sdd/entity-reference.d.ts +5 -0
  161. package/dist/core/sdd/entity-reference.js +22 -0
  162. package/dist/core/sdd/governance-backfill.d.ts +31 -0
  163. package/dist/core/sdd/governance-backfill.js +359 -0
  164. package/dist/core/sdd/governance-parser.d.ts +21 -0
  165. package/dist/core/sdd/governance-parser.js +91 -0
  166. package/dist/core/sdd/governance-schemas.d.ts +245 -0
  167. package/dist/core/sdd/governance-schemas.js +143 -0
  168. package/dist/core/sdd/{import-openspec.d.ts → import-legacy-spec.d.ts} +7 -7
  169. package/dist/core/sdd/{import-openspec.js → import-legacy-spec.js} +21 -29
  170. package/dist/core/sdd/init.d.ts +3 -0
  171. package/dist/core/sdd/init.js +6 -3
  172. package/dist/core/sdd/json-schema.js +100 -6
  173. package/dist/core/sdd/knowledge-graph.d.ts +45 -0
  174. package/dist/core/sdd/knowledge-graph.js +288 -0
  175. package/dist/core/sdd/legacy-operations.js +431 -43
  176. package/dist/core/sdd/lenses.d.ts +1 -0
  177. package/dist/core/sdd/lenses.js +29 -1
  178. package/dist/core/sdd/migrate-workspace.js +56 -2
  179. package/dist/core/sdd/migrate.d.ts +1 -1
  180. package/dist/core/sdd/migrate.js +36 -2
  181. package/dist/core/sdd/package-structure-gate.d.ts +83 -0
  182. package/dist/core/sdd/package-structure-gate.js +362 -0
  183. package/dist/core/sdd/parallel-feat-automation.d.ts +152 -0
  184. package/dist/core/sdd/parallel-feat-automation.js +212 -0
  185. package/dist/core/sdd/plugin-broker.d.ts +558 -0
  186. package/dist/core/sdd/plugin-broker.js +482 -0
  187. package/dist/core/sdd/plugin-certification.d.ts +79 -0
  188. package/dist/core/sdd/plugin-certification.js +453 -0
  189. package/dist/core/sdd/plugin-cli.d.ts +109 -0
  190. package/dist/core/sdd/plugin-cli.js +198 -0
  191. package/dist/core/sdd/plugin-evidence.d.ts +275 -0
  192. package/dist/core/sdd/plugin-evidence.js +307 -0
  193. package/dist/core/sdd/plugin-manifest.d.ts +164 -0
  194. package/dist/core/sdd/plugin-manifest.js +215 -0
  195. package/dist/core/sdd/plugin-policy-pack.d.ts +88 -0
  196. package/dist/core/sdd/plugin-policy-pack.js +236 -0
  197. package/dist/core/sdd/plugin-policy.d.ts +68 -0
  198. package/dist/core/sdd/plugin-policy.js +212 -0
  199. package/dist/core/sdd/plugin-registry.d.ts +311 -0
  200. package/dist/core/sdd/plugin-registry.js +138 -0
  201. package/dist/core/sdd/plugin-skill-binding.d.ts +151 -0
  202. package/dist/core/sdd/plugin-skill-binding.js +339 -0
  203. package/dist/core/sdd/quality-artifact-manifest-validator.d.ts +28 -0
  204. package/dist/core/sdd/quality-artifact-manifest-validator.js +167 -0
  205. package/dist/core/sdd/quality-evidence-renderer.d.ts +65 -0
  206. package/dist/core/sdd/quality-evidence-renderer.js +218 -0
  207. package/dist/core/sdd/quality-scenario-runner.d.ts +42 -0
  208. package/dist/core/sdd/quality-scenario-runner.js +613 -0
  209. package/dist/core/sdd/quality-validation.d.ts +547 -0
  210. package/dist/core/sdd/quality-validation.js +239 -0
  211. package/dist/core/sdd/resolve-project-root.d.ts +2 -2
  212. package/dist/core/sdd/resolve-project-root.js +11 -5
  213. package/dist/core/sdd/sanitize.d.ts +30 -1
  214. package/dist/core/sdd/sanitize.js +23 -23
  215. package/dist/core/sdd/services/agent-run.service.d.ts +65 -0
  216. package/dist/core/sdd/services/agent-run.service.js +189 -0
  217. package/dist/core/sdd/services/breakdown.service.js +2 -1
  218. package/dist/core/sdd/services/context.service.js +18 -16
  219. package/dist/core/sdd/services/debate.service.js +15 -2
  220. package/dist/core/sdd/services/feature-lint.service.d.ts +22 -0
  221. package/dist/core/sdd/services/feature-lint.service.js +105 -5
  222. package/dist/core/sdd/services/finalize.service.d.ts +80 -0
  223. package/dist/core/sdd/services/finalize.service.js +323 -24
  224. package/dist/core/sdd/services/frontend-gap.service.js +22 -7
  225. package/dist/core/sdd/services/governance-control-plane-runtime-adapters.d.ts +17 -0
  226. package/dist/core/sdd/services/governance-control-plane-runtime-adapters.js +38 -0
  227. package/dist/core/sdd/services/governance-control-plane.service.d.ts +66 -0
  228. package/dist/core/sdd/services/governance-control-plane.service.js +134 -0
  229. package/dist/core/sdd/services/ingest-deposito.service.js +1 -1
  230. package/dist/core/sdd/services/legacy-capability.service.d.ts +10 -7
  231. package/dist/core/sdd/services/legacy-capability.service.js +38 -21
  232. package/dist/core/sdd/services/mcp-runtime.service.d.ts +123 -8
  233. package/dist/core/sdd/services/mcp-runtime.service.js +1085 -33
  234. package/dist/core/sdd/services/onboard.service.js +2 -1
  235. package/dist/core/sdd/services/rebuild.service.js +6 -1
  236. package/dist/core/sdd/services/skills-sync.service.d.ts +17 -5
  237. package/dist/core/sdd/services/skills-sync.service.js +55 -2
  238. package/dist/core/sdd/services/start.service.js +6 -4
  239. package/dist/core/sdd/skill-bundles-curation-schema.d.ts +66 -0
  240. package/dist/core/sdd/skill-bundles-curation-schema.js +52 -0
  241. package/dist/core/sdd/skill-evidence.d.ts +19 -0
  242. package/dist/core/sdd/skill-evidence.js +38 -0
  243. package/dist/core/sdd/skill-policy-pool.d.ts +46 -0
  244. package/dist/core/sdd/skill-policy-pool.js +185 -0
  245. package/dist/core/sdd/state.d.ts +22 -0
  246. package/dist/core/sdd/state.js +66 -41
  247. package/dist/core/sdd/structural-health.d.ts +42 -42
  248. package/dist/core/sdd/types.d.ts +33 -7
  249. package/dist/core/sdd/types.js +17 -0
  250. package/dist/core/sdd/upgrade-to-codesdd.d.ts +45 -0
  251. package/dist/core/sdd/upgrade-to-codesdd.js +179 -0
  252. package/dist/core/sdd/workspace-schemas.d.ts +285 -14
  253. package/dist/core/sdd/workspace-schemas.js +148 -0
  254. package/dist/core/sdd/write-manifest.js +22 -4
  255. package/dist/core/shared/skill-generation.d.ts +1 -1
  256. package/dist/core/shared/skill-generation.js +15 -15
  257. package/dist/core/shared/tool-detection.d.ts +3 -3
  258. package/dist/core/shared/tool-detection.js +14 -14
  259. package/dist/core/specs-apply.js +6 -6
  260. package/dist/core/templates/index.d.ts +1 -1
  261. package/dist/core/templates/index.js +1 -1
  262. package/dist/core/templates/workflows/apply-change.js +14 -14
  263. package/dist/core/templates/workflows/archive-change.js +32 -32
  264. package/dist/core/templates/workflows/bulk-archive-change.js +25 -25
  265. package/dist/core/templates/workflows/continue-change.js +12 -12
  266. package/dist/core/templates/workflows/explore.js +29 -29
  267. package/dist/core/templates/workflows/feedback.js +6 -6
  268. package/dist/core/templates/workflows/ff-change.js +24 -24
  269. package/dist/core/templates/workflows/new-change.js +20 -20
  270. package/dist/core/templates/workflows/onboard.js +33 -33
  271. package/dist/core/templates/workflows/propose.js +23 -23
  272. package/dist/core/templates/workflows/sdd.js +8 -8
  273. package/dist/core/templates/workflows/sync-specs.js +19 -19
  274. package/dist/core/templates/workflows/verify-change.js +17 -17
  275. package/dist/core/update.d.ts +2 -2
  276. package/dist/core/update.js +16 -15
  277. package/dist/core/validation/constants.d.ts +1 -1
  278. package/dist/core/validation/constants.js +1 -1
  279. package/dist/core/view.js +11 -11
  280. package/dist/telemetry/config.d.ts +2 -1
  281. package/dist/telemetry/config.js +17 -8
  282. package/dist/telemetry/index.d.ts +10 -2
  283. package/dist/telemetry/index.js +40 -7
  284. package/dist/ui/ascii-patterns.d.ts +2 -2
  285. package/dist/ui/ascii-patterns.js +2 -2
  286. package/dist/ui/welcome-screen.js +2 -2
  287. package/dist/utils/change-metadata.d.ts +4 -4
  288. package/dist/utils/change-metadata.js +6 -6
  289. package/dist/utils/change-utils.d.ts +3 -3
  290. package/dist/utils/change-utils.js +5 -5
  291. package/dist/utils/file-system.js +1 -1
  292. package/dist/utils/interactive.js +1 -1
  293. package/dist/utils/item-discovery.js +4 -4
  294. package/dist/utils/legacy-spec-compat.d.ts +2 -0
  295. package/dist/utils/legacy-spec-compat.js +2 -0
  296. package/dist/utils/shell-detection.d.ts +1 -0
  297. package/dist/utils/shell-detection.js +16 -0
  298. package/package.json +27 -17
  299. package/schemas/sdd/1-spec.schema.json +1 -1
  300. package/schemas/sdd/2-plan.schema.json +73 -1
  301. package/schemas/sdd/3-tasks.schema.json +73 -1
  302. package/schemas/sdd/4-changelog.schema.json +1 -1
  303. package/schemas/sdd/5-quality.schema.json +442 -2
  304. package/schemas/sdd/adr.schema.json +148 -0
  305. package/schemas/sdd/agent-binding-adapter.schema.json +210 -0
  306. package/schemas/sdd/agent-binding-resolution.schema.json +338 -0
  307. package/schemas/sdd/backlog-projection-plan.schema.json +180 -0
  308. package/schemas/sdd/backlog-provider-contract.schema.json +260 -0
  309. package/schemas/sdd/codesdd-plugin.schema.json +474 -0
  310. package/schemas/sdd/debate.schema.json +244 -0
  311. package/schemas/sdd/deepagent-decision-evidence.schema.json +58 -0
  312. package/schemas/sdd/deepagent-env-contract.schema.json +143 -0
  313. package/schemas/sdd/deepagent-quality-evidence.schema.json +108 -0
  314. package/schemas/sdd/deepagent-run-evidence.schema.json +192 -0
  315. package/schemas/sdd/deepagent-run-plan.schema.json +197 -0
  316. package/schemas/sdd/deepagent-run-request.schema.json +321 -0
  317. package/schemas/sdd/deepagent-subagent-evidence.schema.json +110 -0
  318. package/schemas/sdd/deepagent-tool-call-evidence.schema.json +78 -0
  319. package/schemas/sdd/discarded.schema.json +127 -0
  320. package/schemas/sdd/epic.schema.json +147 -0
  321. package/schemas/sdd/insight.schema.json +136 -0
  322. package/schemas/sdd/parallel-feat-automation-plan.schema.json +215 -0
  323. package/schemas/sdd/parallel-feat-automation-request.schema.json +109 -0
  324. package/schemas/sdd/plugin-artifact-manifest.schema.json +150 -0
  325. package/schemas/sdd/plugin-compliance-index.schema.json +136 -0
  326. package/schemas/sdd/plugin-dry-run-plan.schema.json +260 -0
  327. package/schemas/sdd/plugin-evidence-manifest.schema.json +569 -0
  328. package/schemas/sdd/plugin-policy-evaluation.schema.json +92 -0
  329. package/schemas/sdd/plugin-policy-pack-evaluation.schema.json +94 -0
  330. package/schemas/sdd/plugin-policy-pack.schema.json +196 -0
  331. package/schemas/sdd/plugin-registry.schema.json +558 -0
  332. package/schemas/sdd/plugin-rollback-manifest.schema.json +87 -0
  333. package/schemas/sdd/plugin-runtime-invocation-plan.schema.json +845 -0
  334. package/schemas/sdd/plugin-skill-binding-resolution.schema.json +305 -0
  335. package/schemas/sdd/plugin-skill-binding.schema.json +88 -0
  336. package/schemas/sdd/plugin-validation-manifest.schema.json +123 -0
  337. package/schemas/sdd/quality-architecture-schema.schema.json +216 -0
  338. package/schemas/sdd/quality-evidence-bundle.schema.json +1228 -0
  339. package/schemas/sdd/quality-run.schema.json +197 -0
  340. package/schemas/sdd/quality-scenario.schema.json +252 -0
  341. package/schemas/sdd/workspace-catalog.schema.json +9841 -22
  342. package/schemas/spec-driven/schema.yaml +4 -4
  343. package/schemas/spec-driven/templates/proposal.md +1 -1
  344. package/dist/utils/openspec-compat.d.ts +0 -2
  345. package/dist/utils/openspec-compat.js +0 -2
@@ -13,7 +13,7 @@ interface CompleteOptions {
13
13
  type: string;
14
14
  }
15
15
  /**
16
- * Command for managing shell completions for OpenSpec CLI
16
+ * Command for managing shell completions for CodeSDD CLI
17
17
  */
18
18
  export declare class CompletionCommand {
19
19
  private completionProvider;
@@ -6,7 +6,7 @@ import { CompletionProvider } from '../core/completions/completion-provider.js';
6
6
  import { getArchivedChangeIds } from '../utils/item-discovery.js';
7
7
  import { CLI_NAME } from '../core/branding.js';
8
8
  /**
9
- * Command for managing shell completions for OpenSpec CLI
9
+ * Command for managing shell completions for CodeSDD CLI
10
10
  */
11
11
  export class CompletionCommand {
12
12
  completionProvider;
@@ -180,7 +180,7 @@ export class CompletionCommand {
180
180
  };
181
181
  const configPath = configPaths[shell] || `${shell} configuration`;
182
182
  const confirmed = await confirm({
183
- message: `Remove OpenSpec configuration from ${configPath}?`,
183
+ message: `Remove CodeSDD configuration from ${configPath}?`,
184
184
  default: false,
185
185
  });
186
186
  if (!confirmed) {
@@ -237,6 +237,13 @@ export class CompletionCommand {
237
237
  }
238
238
  break;
239
239
  }
240
+ case 'schemas': {
241
+ const schemaNames = await this.completionProvider.getSchemaNames();
242
+ for (const name of schemaNames) {
243
+ console.log(`${name}\tworkflow schema`);
244
+ }
245
+ break;
246
+ }
240
247
  default:
241
248
  // Invalid type - silently exit with no output for graceful shell completion failure
242
249
  process.exitCode = 1;
@@ -1,12 +1,17 @@
1
1
  import { spawn, execSync } from 'node:child_process';
2
2
  import * as fs from 'node:fs';
3
+ import * as os from 'node:os';
3
4
  import * as path from 'node:path';
4
- import { getGlobalConfigPath, getGlobalConfig, saveGlobalConfig, } from '../core/global-config.js';
5
- import { getNestedValue, setNestedValue, deleteNestedValue, coerceValue, formatValueYaml, validateConfigKeyPath, validateConfig, DEFAULT_CONFIG, } from '../core/config-schema.js';
5
+ import { getGlobalConfigPath, getGlobalConfig, getGlobalCacheDir, getGlobalCacheTierDirs, ensureGlobalCacheLayout, readGlobalConfigRaw, parseTomlContent, saveGlobalConfig, } from '../core/global-config.js';
6
+ import { getNestedValue, setNestedValue, deleteNestedValue, coerceValue, formatValueYaml, validateConfigKeyPath, validateConfig, isSensitiveConfigPath, redactConfigSecrets, DEFAULT_CONFIG, } from '../core/config-schema.js';
6
7
  import { CORE_WORKFLOWS, ALL_WORKFLOWS, getProfileWorkflows } from '../core/profiles.js';
7
- import { OPENSPEC_DIR_NAME } from '../core/config.js';
8
8
  import { hasProjectConfigDrift } from '../core/profile-sync-drift.js';
9
9
  import { CLI_NAME } from '../core/branding.js';
10
+ import { resolveLegacySpecLiveRoot } from '../core/sdd/services/legacy-capability.service.js';
11
+ import { resolveRedisBoundaryConfig } from '../core/sdd/coordination/index.js';
12
+ import { buildDeepAgentsOperationalPreflight, createDeepAgentsPolicySnapshot, } from '../core/sdd/deepagents/policy.js';
13
+ import { detectShell } from '../utils/shell-detection.js';
14
+ import { ZshInstaller } from '../core/completions/installers/zsh-installer.js';
10
15
  const WORKFLOW_PROMPT_META = {
11
16
  propose: {
12
17
  name: 'Propose change',
@@ -50,9 +55,33 @@ const WORKFLOW_PROMPT_META = {
50
55
  },
51
56
  onboard: {
52
57
  name: 'Onboard',
53
- description: 'Guided onboarding flow for OpenSpec',
58
+ description: 'Guided onboarding flow for CodeSDD',
54
59
  },
55
60
  };
61
+ function resolveHomeDir() {
62
+ return process.env.HOME || process.env.USERPROFILE || os.homedir();
63
+ }
64
+ function buildCodesddEnvTemplate() {
65
+ return [
66
+ '#!/usr/bin/env zsh',
67
+ '# CodeSDD global runtime profile (non-secret settings only).',
68
+ 'export CODESDD_AGENT_PROVIDER="${CODESDD_AGENT_PROVIDER:-deepagents}"',
69
+ 'export CODESDD_DEEPAGENTS_ENABLED="${CODESDD_DEEPAGENTS_ENABLED:-false}"',
70
+ 'export CODESDD_DEEPAGENTS_RUNTIME="${CODESDD_DEEPAGENTS_RUNTIME:-disabled}"',
71
+ 'export CODESDD_AGENT_NETWORK_POLICY="${CODESDD_AGENT_NETWORK_POLICY:-disabled}"',
72
+ 'export CODESDD_DEEPAGENTS_PROVIDER_SMOKE="${CODESDD_DEEPAGENTS_PROVIDER_SMOKE:-0}"',
73
+ '# Optional live-provider launcher references. Keep values in your shell,',
74
+ '# password manager, CI secret store, or another untracked launcher context.',
75
+ '# export CODESDD_DEEPAGENTS_ENABLED=true',
76
+ '# export CODESDD_DEEPAGENTS_RUNTIME=deepagents-js',
77
+ '# export CODESDD_AGENT_NETWORK_POLICY=restricted',
78
+ '# export CODESDD_DEEPAGENTS_MODEL="azure-openai:gpt-4o-mini"',
79
+ '# export CODESDD_AGENT_ALLOWED_DOMAINS="api.openai.com"',
80
+ '# export AZURE_OPENAI_ENDPOINT="https://example-resource.openai.azure.com/"',
81
+ '# export AZURE_OPENAI_API_KEY="<secret-from-manager>"',
82
+ '',
83
+ ].join('\n');
84
+ }
56
85
  function isPromptCancellationError(error) {
57
86
  return (error instanceof Error &&
58
87
  (error.name === 'ExitPromptError' || error.message.includes('force closed the prompt with SIGINT')));
@@ -134,8 +163,8 @@ export function diffProfileState(before, after) {
134
163
  };
135
164
  }
136
165
  function maybeWarnConfigDrift(projectDir, state, colorize) {
137
- const openspecDir = path.join(projectDir, OPENSPEC_DIR_NAME);
138
- if (!fs.existsSync(openspecDir)) {
166
+ const codesddDir = resolveLegacySpecLiveRoot(projectDir);
167
+ if (!fs.existsSync(codesddDir)) {
139
168
  return;
140
169
  }
141
170
  if (!hasProjectConfigDrift(projectDir, state.workflows, state.delivery)) {
@@ -151,7 +180,7 @@ function maybeWarnConfigDrift(projectDir, state, colorize) {
151
180
  export function registerConfigCommand(program) {
152
181
  const configCmd = program
153
182
  .command('config')
154
- .description('View and modify global OpenSpec configuration')
183
+ .description('View and modify global CodeSDD configuration')
155
184
  .option('--scope <scope>', 'Config scope (only "global" supported currently)')
156
185
  .hook('preAction', (thisCommand) => {
157
186
  const opts = thisCommand.opts();
@@ -167,6 +196,101 @@ export function registerConfigCommand(program) {
167
196
  .action(() => {
168
197
  console.log(getGlobalConfigPath());
169
198
  });
199
+ // config init
200
+ configCmd
201
+ .command('init')
202
+ .description('Initialize ~/.codesdd runtime files and idempotent shell integration')
203
+ .option('--json', 'Output as JSON')
204
+ .action(async (options) => {
205
+ const homeDir = resolveHomeDir();
206
+ const configPath = getGlobalConfigPath();
207
+ const envPath = path.join(homeDir, '.codesdd', 'env.zsh');
208
+ if (!fs.existsSync(configPath)) {
209
+ saveGlobalConfig(getGlobalConfig());
210
+ }
211
+ const tierPaths = ensureGlobalCacheLayout();
212
+ const envTemplate = buildCodesddEnvTemplate();
213
+ if (!fs.existsSync(path.dirname(envPath))) {
214
+ fs.mkdirSync(path.dirname(envPath), { recursive: true });
215
+ }
216
+ fs.writeFileSync(envPath, envTemplate, { encoding: 'utf-8', mode: 0o600 });
217
+ try {
218
+ fs.chmodSync(envPath, 0o600);
219
+ }
220
+ catch {
221
+ // best effort on non-POSIX filesystems
222
+ }
223
+ const detectedShell = detectShell().shell;
224
+ let zshrcConfigured = false;
225
+ if (detectedShell === 'zsh' || process.env.SHELL?.toLowerCase().includes('zsh')) {
226
+ const installer = new ZshInstaller(homeDir);
227
+ zshrcConfigured = await installer.ensureCodesddEnvSource(envPath);
228
+ }
229
+ const payload = {
230
+ schema_version: 1,
231
+ config_path: configPath,
232
+ env_path: envPath,
233
+ cache_root: getGlobalCacheDir(),
234
+ cache_tiers: Object.keys(tierPaths),
235
+ shell_detected: detectedShell ?? 'unknown',
236
+ zshrc_configured: zshrcConfigured,
237
+ };
238
+ if (options.json) {
239
+ console.log(JSON.stringify(payload, null, 2));
240
+ return;
241
+ }
242
+ console.log(`Config file: ${configPath}`);
243
+ console.log(`Shell profile: ${envPath}`);
244
+ console.log(`Cache root: ${payload.cache_root}`);
245
+ console.log(`Cache tiers: ${payload.cache_tiers.join(', ')}`);
246
+ if (detectedShell === 'zsh') {
247
+ console.log('Zsh source block ensured for ~/.codesdd/env.zsh.');
248
+ }
249
+ else {
250
+ console.log('Shell source block was not changed automatically (non-zsh or undetected shell).');
251
+ }
252
+ });
253
+ // config doctor
254
+ configCmd
255
+ .command('doctor')
256
+ .description('Run operational readiness checks for DeepAgents/Azure, cache, and Redis boundary')
257
+ .option('--json', 'Output as JSON')
258
+ .action((options) => {
259
+ const snapshot = createDeepAgentsPolicySnapshot(process.env);
260
+ const preflight = buildDeepAgentsOperationalPreflight(snapshot, process.env);
261
+ const redisBoundary = resolveRedisBoundaryConfig(process.env);
262
+ const cacheTiers = getGlobalCacheTierDirs();
263
+ const report = {
264
+ schema_version: 1,
265
+ global_config_path: getGlobalConfigPath(),
266
+ cache: {
267
+ root: getGlobalCacheDir(),
268
+ tiers: Object.keys(cacheTiers),
269
+ },
270
+ redis: {
271
+ requested: redisBoundary.requested,
272
+ namespace: redisBoundary.namespace,
273
+ status: redisBoundary.requested ? 'requested-unavailable' : 'disabled',
274
+ },
275
+ deepagents: preflight,
276
+ };
277
+ if (options.json) {
278
+ console.log(JSON.stringify(report, null, 2));
279
+ }
280
+ else {
281
+ console.log(`Global config: ${report.global_config_path}`);
282
+ console.log(`Cache root: ${report.cache.root}`);
283
+ console.log(`Cache tiers: ${report.cache.tiers.join(', ')}`);
284
+ console.log(`Redis: ${report.redis.status} (namespace=${report.redis.namespace})`);
285
+ console.log(`DeepAgents preflight: ${preflight.status}`);
286
+ for (const reason of preflight.reasons) {
287
+ console.log(`- ${reason}`);
288
+ }
289
+ }
290
+ if (preflight.status === 'blocked') {
291
+ process.exitCode = 1;
292
+ }
293
+ });
170
294
  // config list
171
295
  configCmd
172
296
  .command('list')
@@ -174,22 +298,20 @@ export function registerConfigCommand(program) {
174
298
  .option('--json', 'Output as JSON')
175
299
  .action((options) => {
176
300
  const config = getGlobalConfig();
301
+ const redactedConfig = redactConfigSecrets(config);
177
302
  if (options.json) {
178
- console.log(JSON.stringify(config, null, 2));
303
+ console.log(JSON.stringify(redactedConfig, null, 2));
179
304
  }
180
305
  else {
181
306
  // Read raw config to determine which values are explicit vs defaults
182
- const configPath = getGlobalConfigPath();
183
307
  let rawConfig = {};
184
308
  try {
185
- if (fs.existsSync(configPath)) {
186
- rawConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
187
- }
309
+ rawConfig = readGlobalConfigRaw();
188
310
  }
189
311
  catch {
190
312
  // If reading fails, treat all as defaults
191
313
  }
192
- console.log(formatValueYaml(config));
314
+ console.log(formatValueYaml(redactedConfig));
193
315
  // Annotate profile settings
194
316
  const profileSource = rawConfig.profile !== undefined ? '(explicit)' : '(default)';
195
317
  const deliverySource = rawConfig.delivery !== undefined ? '(explicit)' : '(default)';
@@ -205,6 +327,15 @@ export function registerConfigCommand(program) {
205
327
  else {
206
328
  console.log(` workflows: (none)`);
207
329
  }
330
+ const cacheTiers = getGlobalCacheTierDirs();
331
+ console.log(`\nCache settings:`);
332
+ console.log(` root: ${getGlobalCacheDir()}`);
333
+ console.log(` tiers: ${Object.keys(cacheTiers).join(', ')}`);
334
+ const redisBoundary = resolveRedisBoundaryConfig(process.env);
335
+ const redisStatus = redisBoundary.requested ? 'requested-unavailable (filesystem-first fallback)' : 'disabled';
336
+ console.log(`\nRedis boundary:`);
337
+ console.log(` status: ${redisStatus}`);
338
+ console.log(` namespace: ${redisBoundary.namespace}`);
208
339
  }
209
340
  });
210
341
  // config get
@@ -218,6 +349,10 @@ export function registerConfigCommand(program) {
218
349
  process.exitCode = 1;
219
350
  return;
220
351
  }
352
+ if (isSensitiveConfigPath(key)) {
353
+ console.log('[REDACTED]');
354
+ return;
355
+ }
221
356
  if (typeof value === 'object' && value !== null) {
222
357
  console.log(JSON.stringify(value));
223
358
  }
@@ -257,7 +392,11 @@ export function registerConfigCommand(program) {
257
392
  // Apply changes and save
258
393
  setNestedValue(config, key, coercedValue);
259
394
  saveGlobalConfig(config);
260
- const displayValue = typeof coercedValue === 'string' ? `"${coercedValue}"` : String(coercedValue);
395
+ const displayValue = isSensitiveConfigPath(key)
396
+ ? '[REDACTED]'
397
+ : typeof coercedValue === 'string'
398
+ ? `"${coercedValue}"`
399
+ : String(coercedValue);
261
400
  console.log(`Set ${key} = ${displayValue}`);
262
401
  });
263
402
  // config unset
@@ -351,7 +490,7 @@ export function registerConfigCommand(program) {
351
490
  });
352
491
  try {
353
492
  const rawConfig = fs.readFileSync(configPath, 'utf-8');
354
- const parsedConfig = JSON.parse(rawConfig);
493
+ const parsedConfig = parseTomlContent(rawConfig);
355
494
  const validation = validateConfig(parsedConfig);
356
495
  if (!validation.success) {
357
496
  console.error(`Error: Invalid configuration - ${validation.error}`);
@@ -363,7 +502,7 @@ export function registerConfigCommand(program) {
363
502
  console.error(`Error: Config file not found at ${configPath}`);
364
503
  }
365
504
  else if (error instanceof SyntaxError) {
366
- console.error(`Error: Invalid JSON in ${configPath}`);
505
+ console.error(`Error: Invalid TOML in ${configPath}`);
367
506
  console.error(error.message);
368
507
  }
369
508
  else {
@@ -377,7 +516,7 @@ export function registerConfigCommand(program) {
377
516
  .command('profile [preset]')
378
517
  .description('Configure workflow profile (interactive picker or preset shortcut)')
379
518
  .action(async (preset) => {
380
- // Preset shortcut: `openspec config profile core`
519
+ // Preset shortcut: `codesdd config profile core`
381
520
  if (preset === 'core') {
382
521
  const config = getGlobalConfig();
383
522
  config.profile = 'core';
@@ -517,10 +656,10 @@ export function registerConfigCommand(program) {
517
656
  config.delivery = nextState.delivery;
518
657
  config.workflows = nextState.workflows;
519
658
  saveGlobalConfig(config);
520
- // Check if inside an OpenSpec project
659
+ // Check if inside a legacy spec compatibility project
521
660
  const projectDir = process.cwd();
522
- const openspecDir = path.join(projectDir, OPENSPEC_DIR_NAME);
523
- if (fs.existsSync(openspecDir)) {
661
+ const codesddDir = resolveLegacySpecLiveRoot(projectDir);
662
+ if (fs.existsSync(codesddDir)) {
524
663
  const applyNow = await confirm({
525
664
  message: 'Apply changes to this project now?',
526
665
  default: true,
@@ -30,7 +30,7 @@ function isGhAuthenticated() {
30
30
  }
31
31
  }
32
32
  /**
33
- * Get OpenSDD version from package.json
33
+ * Get CodeSDD version from package.json
34
34
  */
35
35
  function getVersion() {
36
36
  try {
@@ -1,6 +1,69 @@
1
1
  import { Command } from 'commander';
2
+ /**
3
+ * Schema source location type
4
+ */
5
+ export type SchemaSource = 'project' | 'user' | 'package';
6
+ /**
7
+ * Result of checking a schema location
8
+ */
9
+ export interface SchemaLocation {
10
+ source: SchemaSource;
11
+ path: string;
12
+ exists: boolean;
13
+ }
14
+ /**
15
+ * Schema resolution info with shadowing details
16
+ */
17
+ export interface SchemaResolution {
18
+ name: string;
19
+ source: SchemaSource;
20
+ path: string;
21
+ shadows: Array<{
22
+ source: SchemaSource;
23
+ path: string;
24
+ }>;
25
+ }
26
+ /**
27
+ * Validation issue structure
28
+ */
29
+ export interface ValidationIssue {
30
+ level: 'error' | 'warning';
31
+ path: string;
32
+ message: string;
33
+ }
34
+ /**
35
+ * Check all three locations for a schema and return which ones exist.
36
+ */
37
+ export declare function checkAllLocations(name: string, projectRoot: string): SchemaLocation[];
38
+ /**
39
+ * Get resolution info for a schema including shadow detection.
40
+ */
41
+ export declare function getSchemaResolution(name: string, projectRoot: string): SchemaResolution | null;
42
+ /**
43
+ * Get all schemas with resolution info.
44
+ */
45
+ export declare function getAllSchemasWithResolution(projectRoot: string): SchemaResolution[];
46
+ /**
47
+ * Validate a schema and return issues.
48
+ */
49
+ export declare function validateSchema(schemaDir: string, verbose?: boolean): {
50
+ valid: boolean;
51
+ issues: ValidationIssue[];
52
+ };
53
+ /**
54
+ * Validate schema name format (kebab-case).
55
+ */
56
+ export declare function isValidSchemaName(name: string): boolean;
57
+ /**
58
+ * Copy a directory recursively.
59
+ */
60
+ export declare function copyDirRecursive(src: string, dest: string): void;
2
61
  /**
3
62
  * Register the schema command and all its subcommands.
4
63
  */
5
64
  export declare function registerSchemaCommand(program: Command): void;
65
+ /**
66
+ * Create default template content for an artifact.
67
+ */
68
+ export declare function createDefaultTemplate(artifactId: string): string;
6
69
  //# sourceMappingURL=schema.d.ts.map
@@ -4,11 +4,11 @@ import ora from 'ora';
4
4
  import { stringify as stringifyYaml } from 'yaml';
5
5
  import { getSchemaDir, getProjectSchemasDir, getUserSchemasDir, getPackageSchemasDir, listSchemas, } from '../core/artifact-graph/resolver.js';
6
6
  import { parseSchema, SchemaValidationError } from '../core/artifact-graph/schema.js';
7
- import { resolveOpenSpecLiveSubpath } from '../core/sdd/services/legacy-capability.service.js';
7
+ import { resolveLegacySpecLiveSubpath } from '../core/sdd/services/legacy-capability.service.js';
8
8
  /**
9
9
  * Check all three locations for a schema and return which ones exist.
10
10
  */
11
- function checkAllLocations(name, projectRoot) {
11
+ export function checkAllLocations(name, projectRoot) {
12
12
  const locations = [];
13
13
  // Project location
14
14
  const projectDir = path.join(getProjectSchemasDir(projectRoot), name);
@@ -39,7 +39,7 @@ function checkAllLocations(name, projectRoot) {
39
39
  /**
40
40
  * Get resolution info for a schema including shadow detection.
41
41
  */
42
- function getSchemaResolution(name, projectRoot) {
42
+ export function getSchemaResolution(name, projectRoot) {
43
43
  const locations = checkAllLocations(name, projectRoot);
44
44
  const existingLocations = locations.filter((loc) => loc.exists);
45
45
  if (existingLocations.length === 0) {
@@ -60,7 +60,7 @@ function getSchemaResolution(name, projectRoot) {
60
60
  /**
61
61
  * Get all schemas with resolution info.
62
62
  */
63
- function getAllSchemasWithResolution(projectRoot) {
63
+ export function getAllSchemasWithResolution(projectRoot) {
64
64
  const schemaNames = listSchemas(projectRoot);
65
65
  const results = [];
66
66
  for (const name of schemaNames) {
@@ -74,7 +74,7 @@ function getAllSchemasWithResolution(projectRoot) {
74
74
  /**
75
75
  * Validate a schema and return issues.
76
76
  */
77
- function validateSchema(schemaDir, verbose = false) {
77
+ export function validateSchema(schemaDir, verbose = false) {
78
78
  const issues = [];
79
79
  const schemaPath = path.join(schemaDir, 'schema.yaml');
80
80
  // Check schema.yaml exists
@@ -157,13 +157,13 @@ function validateSchema(schemaDir, verbose = false) {
157
157
  /**
158
158
  * Validate schema name format (kebab-case).
159
159
  */
160
- function isValidSchemaName(name) {
160
+ export function isValidSchemaName(name) {
161
161
  return /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/.test(name);
162
162
  }
163
163
  /**
164
164
  * Copy a directory recursively.
165
165
  */
166
- function copyDirRecursive(src, dest) {
166
+ export function copyDirRecursive(src, dest) {
167
167
  fs.mkdirSync(dest, { recursive: true });
168
168
  const entries = fs.readdirSync(src, { withFileTypes: true });
169
169
  for (const entry of entries) {
@@ -592,12 +592,12 @@ export function registerSchemaCommand(program) {
592
592
  console.log(JSON.stringify({
593
593
  created: false,
594
594
  error: `Schema '${name}' already exists`,
595
- suggestion: 'Use --force to overwrite or "openspec schema fork" to copy',
595
+ suggestion: 'Use --force to overwrite or "codesdd schema fork" to copy',
596
596
  }, null, 2));
597
597
  }
598
598
  else {
599
599
  console.error(`Error: Schema '${name}' already exists at ${schemaDir}`);
600
- console.error('Use --force to overwrite or "openspec schema fork" to copy');
600
+ console.error('Use --force to overwrite or "codesdd schema fork" to copy');
601
601
  }
602
602
  process.exitCode = 1;
603
603
  return;
@@ -734,7 +734,7 @@ export function registerSchemaCommand(program) {
734
734
  }
735
735
  // Update config if --default
736
736
  if (options?.default) {
737
- const configPath = resolveOpenSpecLiveSubpath(projectRoot, 'config.yaml');
737
+ const configPath = resolveLegacySpecLiveSubpath(projectRoot, 'config.yaml');
738
738
  if (fs.existsSync(configPath)) {
739
739
  const { parse: parseYaml, stringify: stringifyYaml2 } = await import('yaml');
740
740
  const configContent = fs.readFileSync(configPath, 'utf-8');
@@ -771,7 +771,7 @@ export function registerSchemaCommand(program) {
771
771
  console.log(`\nNext steps:`);
772
772
  console.log(` 1. Edit ${schemaDir}/schema.yaml to customize artifacts`);
773
773
  console.log(` 2. Modify templates in the schema directory`);
774
- console.log(` 3. Use with: openspec new --schema ${name}`);
774
+ console.log(` 3. Use with: codesdd new --schema ${name}`);
775
775
  }
776
776
  }
777
777
  catch (error) {
@@ -793,7 +793,7 @@ export function registerSchemaCommand(program) {
793
793
  /**
794
794
  * Create default template content for an artifact.
795
795
  */
796
- function createDefaultTemplate(artifactId) {
796
+ export function createDefaultTemplate(artifactId) {
797
797
  switch (artifactId) {
798
798
  case 'proposal':
799
799
  return `## Why
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerBacklogCommands(sddCmd: Command): void;
3
+ //# sourceMappingURL=backlog.d.ts.map
@@ -0,0 +1,54 @@
1
+ import chalk from 'chalk';
2
+ import { buildBacklogProjectDryRun, } from '../../core/sdd/backlog-cli.js';
3
+ export function registerBacklogCommands(sddCmd) {
4
+ const backlogCmd = sddCmd.command('backlog').description('Plan external backlog projections without provider writes');
5
+ backlogCmd
6
+ .command('project')
7
+ .description('Build a dry-run projection plan for an external backlog provider')
8
+ .requiredOption('--provider <provider>', 'Backlog provider id, for example azure-devops')
9
+ .requiredOption('--ref <ref>', 'Canonical SDD ref to project, for example EPIC-0039')
10
+ .option('--json', 'Return the dry-run projection plan as JSON')
11
+ .action(async (options) => {
12
+ try {
13
+ const result = buildBacklogProjectDryRun({
14
+ provider: options.provider,
15
+ ref: options.ref,
16
+ });
17
+ if (options.json) {
18
+ console.log(JSON.stringify(result, null, 2));
19
+ return;
20
+ }
21
+ printBacklogProjectDryRun(result);
22
+ }
23
+ catch (error) {
24
+ console.error(chalk.red(`Error: ${formatBacklogError(error)}`));
25
+ process.exitCode = 1;
26
+ }
27
+ });
28
+ }
29
+ function formatBacklogError(error) {
30
+ return error instanceof Error ? error.message : String(error);
31
+ }
32
+ function printBacklogProjectDryRun(result) {
33
+ const { plan } = result;
34
+ console.log(chalk.green(`Backlog projection dry-run: ${plan.provider}`));
35
+ console.log(`Ref: ${result.ref}`);
36
+ console.log(`Mode: ${plan.mode}`);
37
+ console.log(`Direction: ${plan.direction}`);
38
+ console.log(`Source of truth: ${plan.source_of_truth}`);
39
+ console.log(`Items: ${plan.items.length}`);
40
+ console.log(`Operations: ${summarizeOperations(plan.items.map((item) => item.operation))}`);
41
+ if (plan.warnings.length > 0) {
42
+ console.log(`Warnings: ${plan.warnings.join(' | ')}`);
43
+ }
44
+ }
45
+ function summarizeOperations(operations) {
46
+ const counts = new Map();
47
+ for (const operation of operations) {
48
+ counts.set(operation, (counts.get(operation) ?? 0) + 1);
49
+ }
50
+ return Array.from(counts.entries())
51
+ .map(([operation, count]) => `${operation}=${count}`)
52
+ .join(', ');
53
+ }
54
+ //# sourceMappingURL=backlog.js.map