@devtrack-solution/codesdd 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/.sdd/skills/curated/api-clean-flask-langgraph/SKILL.md +2751 -0
  2. package/.sdd/skills/curated/devtrack-api/SKILL.md +137 -0
  3. package/.sdd/skills/curated/devtrack-api/agents/openai.yaml +4 -0
  4. package/.sdd/skills/curated/devtrack-api/references/application-presentation.md +381 -0
  5. package/.sdd/skills/curated/devtrack-api/references/architecture-governance.md +219 -0
  6. package/.sdd/skills/curated/devtrack-api/references/domain-modeling.md +359 -0
  7. package/.sdd/skills/curated/devtrack-api/references/implementation-checklist.md +127 -0
  8. package/.sdd/skills/curated/devtrack-api/references/imports-lint.md +207 -0
  9. package/.sdd/skills/curated/devtrack-api/references/testing-validation.md +167 -0
  10. package/.sdd/skills/curated/devtrack-api/references/typeorm-infrastructure.md +334 -0
  11. package/LICENSE +21 -0
  12. package/README.md +842 -0
  13. package/bin/codesdd.js +10 -0
  14. package/dist/cli/index.d.ts +3 -0
  15. package/dist/cli/index.js +560 -0
  16. package/dist/commands/change.d.ts +35 -0
  17. package/dist/commands/change.js +296 -0
  18. package/dist/commands/completion.d.ts +72 -0
  19. package/dist/commands/completion.js +258 -0
  20. package/dist/commands/config.d.ts +36 -0
  21. package/dist/commands/config.js +552 -0
  22. package/dist/commands/feedback.d.ts +9 -0
  23. package/dist/commands/feedback.js +184 -0
  24. package/dist/commands/schema.d.ts +6 -0
  25. package/dist/commands/schema.js +870 -0
  26. package/dist/commands/sdd/execution.d.ts +3 -0
  27. package/dist/commands/sdd/execution.js +409 -0
  28. package/dist/commands/sdd/shared.d.ts +9 -0
  29. package/dist/commands/sdd/shared.js +84 -0
  30. package/dist/commands/sdd/skills.d.ts +3 -0
  31. package/dist/commands/sdd/skills.js +154 -0
  32. package/dist/commands/sdd.d.ts +3 -0
  33. package/dist/commands/sdd.js +769 -0
  34. package/dist/commands/show.d.ts +14 -0
  35. package/dist/commands/show.js +133 -0
  36. package/dist/commands/spec.d.ts +15 -0
  37. package/dist/commands/spec.js +228 -0
  38. package/dist/commands/validate.d.ts +24 -0
  39. package/dist/commands/validate.js +295 -0
  40. package/dist/commands/workflow/index.d.ts +17 -0
  41. package/dist/commands/workflow/index.js +12 -0
  42. package/dist/commands/workflow/instructions.d.ts +29 -0
  43. package/dist/commands/workflow/instructions.js +383 -0
  44. package/dist/commands/workflow/new-change.d.ts +11 -0
  45. package/dist/commands/workflow/new-change.js +45 -0
  46. package/dist/commands/workflow/schemas.d.ts +10 -0
  47. package/dist/commands/workflow/schemas.js +34 -0
  48. package/dist/commands/workflow/shared.d.ts +57 -0
  49. package/dist/commands/workflow/shared.js +117 -0
  50. package/dist/commands/workflow/status.d.ts +14 -0
  51. package/dist/commands/workflow/status.js +76 -0
  52. package/dist/commands/workflow/templates.d.ts +16 -0
  53. package/dist/commands/workflow/templates.js +68 -0
  54. package/dist/core/archive.d.ts +16 -0
  55. package/dist/core/archive.js +487 -0
  56. package/dist/core/artifact-graph/graph.d.ts +56 -0
  57. package/dist/core/artifact-graph/graph.js +141 -0
  58. package/dist/core/artifact-graph/index.d.ts +7 -0
  59. package/dist/core/artifact-graph/index.js +13 -0
  60. package/dist/core/artifact-graph/instruction-loader.d.ts +143 -0
  61. package/dist/core/artifact-graph/instruction-loader.js +215 -0
  62. package/dist/core/artifact-graph/resolver.d.ts +81 -0
  63. package/dist/core/artifact-graph/resolver.js +258 -0
  64. package/dist/core/artifact-graph/schema.d.ts +13 -0
  65. package/dist/core/artifact-graph/schema.js +108 -0
  66. package/dist/core/artifact-graph/state.d.ts +12 -0
  67. package/dist/core/artifact-graph/state.js +54 -0
  68. package/dist/core/artifact-graph/types.d.ts +45 -0
  69. package/dist/core/artifact-graph/types.js +43 -0
  70. package/dist/core/available-tools.d.ts +16 -0
  71. package/dist/core/available-tools.js +30 -0
  72. package/dist/core/branding.d.ts +8 -0
  73. package/dist/core/branding.js +12 -0
  74. package/dist/core/cli/command-matrix.d.ts +23 -0
  75. package/dist/core/cli/command-matrix.js +123 -0
  76. package/dist/core/command-generation/adapters/amazon-q.d.ts +13 -0
  77. package/dist/core/command-generation/adapters/amazon-q.js +26 -0
  78. package/dist/core/command-generation/adapters/antigravity.d.ts +13 -0
  79. package/dist/core/command-generation/adapters/antigravity.js +26 -0
  80. package/dist/core/command-generation/adapters/auggie.d.ts +13 -0
  81. package/dist/core/command-generation/adapters/auggie.js +27 -0
  82. package/dist/core/command-generation/adapters/claude.d.ts +13 -0
  83. package/dist/core/command-generation/adapters/claude.js +50 -0
  84. package/dist/core/command-generation/adapters/cline.d.ts +14 -0
  85. package/dist/core/command-generation/adapters/cline.js +27 -0
  86. package/dist/core/command-generation/adapters/codebuddy.d.ts +13 -0
  87. package/dist/core/command-generation/adapters/codebuddy.js +28 -0
  88. package/dist/core/command-generation/adapters/codex.d.ts +16 -0
  89. package/dist/core/command-generation/adapters/codex.js +39 -0
  90. package/dist/core/command-generation/adapters/continue.d.ts +13 -0
  91. package/dist/core/command-generation/adapters/continue.js +28 -0
  92. package/dist/core/command-generation/adapters/costrict.d.ts +13 -0
  93. package/dist/core/command-generation/adapters/costrict.js +27 -0
  94. package/dist/core/command-generation/adapters/crush.d.ts +13 -0
  95. package/dist/core/command-generation/adapters/crush.js +30 -0
  96. package/dist/core/command-generation/adapters/cursor.d.ts +14 -0
  97. package/dist/core/command-generation/adapters/cursor.js +44 -0
  98. package/dist/core/command-generation/adapters/factory.d.ts +13 -0
  99. package/dist/core/command-generation/adapters/factory.js +27 -0
  100. package/dist/core/command-generation/adapters/gemini.d.ts +13 -0
  101. package/dist/core/command-generation/adapters/gemini.js +26 -0
  102. package/dist/core/command-generation/adapters/github-copilot.d.ts +13 -0
  103. package/dist/core/command-generation/adapters/github-copilot.js +26 -0
  104. package/dist/core/command-generation/adapters/iflow.d.ts +13 -0
  105. package/dist/core/command-generation/adapters/iflow.js +29 -0
  106. package/dist/core/command-generation/adapters/index.d.ts +29 -0
  107. package/dist/core/command-generation/adapters/index.js +29 -0
  108. package/dist/core/command-generation/adapters/kilocode.d.ts +14 -0
  109. package/dist/core/command-generation/adapters/kilocode.js +23 -0
  110. package/dist/core/command-generation/adapters/kiro.d.ts +13 -0
  111. package/dist/core/command-generation/adapters/kiro.js +26 -0
  112. package/dist/core/command-generation/adapters/opencode.d.ts +13 -0
  113. package/dist/core/command-generation/adapters/opencode.js +29 -0
  114. package/dist/core/command-generation/adapters/pi.d.ts +14 -0
  115. package/dist/core/command-generation/adapters/pi.js +41 -0
  116. package/dist/core/command-generation/adapters/qoder.d.ts +13 -0
  117. package/dist/core/command-generation/adapters/qoder.js +30 -0
  118. package/dist/core/command-generation/adapters/qwen.d.ts +13 -0
  119. package/dist/core/command-generation/adapters/qwen.js +26 -0
  120. package/dist/core/command-generation/adapters/roocode.d.ts +14 -0
  121. package/dist/core/command-generation/adapters/roocode.js +27 -0
  122. package/dist/core/command-generation/adapters/windsurf.d.ts +14 -0
  123. package/dist/core/command-generation/adapters/windsurf.js +51 -0
  124. package/dist/core/command-generation/generator.d.ts +21 -0
  125. package/dist/core/command-generation/generator.js +27 -0
  126. package/dist/core/command-generation/index.d.ts +22 -0
  127. package/dist/core/command-generation/index.js +24 -0
  128. package/dist/core/command-generation/registry.d.ts +36 -0
  129. package/dist/core/command-generation/registry.js +92 -0
  130. package/dist/core/command-generation/types.d.ts +56 -0
  131. package/dist/core/command-generation/types.js +8 -0
  132. package/dist/core/completions/command-registry.d.ts +7 -0
  133. package/dist/core/completions/command-registry.js +461 -0
  134. package/dist/core/completions/completion-provider.d.ts +60 -0
  135. package/dist/core/completions/completion-provider.js +102 -0
  136. package/dist/core/completions/factory.d.ts +64 -0
  137. package/dist/core/completions/factory.js +75 -0
  138. package/dist/core/completions/generators/bash-generator.d.ts +32 -0
  139. package/dist/core/completions/generators/bash-generator.js +174 -0
  140. package/dist/core/completions/generators/fish-generator.d.ts +32 -0
  141. package/dist/core/completions/generators/fish-generator.js +157 -0
  142. package/dist/core/completions/generators/powershell-generator.d.ts +33 -0
  143. package/dist/core/completions/generators/powershell-generator.js +207 -0
  144. package/dist/core/completions/generators/zsh-generator.d.ts +44 -0
  145. package/dist/core/completions/generators/zsh-generator.js +250 -0
  146. package/dist/core/completions/installers/bash-installer.d.ts +87 -0
  147. package/dist/core/completions/installers/bash-installer.js +318 -0
  148. package/dist/core/completions/installers/fish-installer.d.ts +43 -0
  149. package/dist/core/completions/installers/fish-installer.js +143 -0
  150. package/dist/core/completions/installers/powershell-installer.d.ts +88 -0
  151. package/dist/core/completions/installers/powershell-installer.js +327 -0
  152. package/dist/core/completions/installers/zsh-installer.d.ts +125 -0
  153. package/dist/core/completions/installers/zsh-installer.js +452 -0
  154. package/dist/core/completions/templates/bash-templates.d.ts +6 -0
  155. package/dist/core/completions/templates/bash-templates.js +24 -0
  156. package/dist/core/completions/templates/fish-templates.d.ts +7 -0
  157. package/dist/core/completions/templates/fish-templates.js +39 -0
  158. package/dist/core/completions/templates/powershell-templates.d.ts +6 -0
  159. package/dist/core/completions/templates/powershell-templates.js +25 -0
  160. package/dist/core/completions/templates/zsh-templates.d.ts +6 -0
  161. package/dist/core/completions/templates/zsh-templates.js +36 -0
  162. package/dist/core/completions/types.d.ts +79 -0
  163. package/dist/core/completions/types.js +2 -0
  164. package/dist/core/config-prompts.d.ts +9 -0
  165. package/dist/core/config-prompts.js +34 -0
  166. package/dist/core/config-schema.d.ts +86 -0
  167. package/dist/core/config-schema.js +213 -0
  168. package/dist/core/config.d.ts +17 -0
  169. package/dist/core/config.js +33 -0
  170. package/dist/core/converters/json-converter.d.ts +6 -0
  171. package/dist/core/converters/json-converter.js +51 -0
  172. package/dist/core/global-config.d.ts +44 -0
  173. package/dist/core/global-config.js +125 -0
  174. package/dist/core/index.d.ts +2 -0
  175. package/dist/core/index.js +3 -0
  176. package/dist/core/init.d.ts +36 -0
  177. package/dist/core/init.js +576 -0
  178. package/dist/core/legacy-cleanup.d.ts +162 -0
  179. package/dist/core/legacy-cleanup.js +512 -0
  180. package/dist/core/list.d.ts +9 -0
  181. package/dist/core/list.js +173 -0
  182. package/dist/core/migration.d.ts +23 -0
  183. package/dist/core/migration.js +108 -0
  184. package/dist/core/parsers/change-parser.d.ts +13 -0
  185. package/dist/core/parsers/change-parser.js +193 -0
  186. package/dist/core/parsers/markdown-parser.d.ts +22 -0
  187. package/dist/core/parsers/markdown-parser.js +187 -0
  188. package/dist/core/parsers/requirement-blocks.d.ts +37 -0
  189. package/dist/core/parsers/requirement-blocks.js +201 -0
  190. package/dist/core/profile-sync-drift.d.ts +38 -0
  191. package/dist/core/profile-sync-drift.js +201 -0
  192. package/dist/core/profiles.d.ts +26 -0
  193. package/dist/core/profiles.js +41 -0
  194. package/dist/core/project-config.d.ts +64 -0
  195. package/dist/core/project-config.js +223 -0
  196. package/dist/core/schemas/base.schema.d.ts +13 -0
  197. package/dist/core/schemas/base.schema.js +13 -0
  198. package/dist/core/schemas/change.schema.d.ts +73 -0
  199. package/dist/core/schemas/change.schema.js +31 -0
  200. package/dist/core/schemas/index.d.ts +4 -0
  201. package/dist/core/schemas/index.js +4 -0
  202. package/dist/core/schemas/spec.schema.d.ts +18 -0
  203. package/dist/core/schemas/spec.schema.js +15 -0
  204. package/dist/core/sdd/adr-policy.d.ts +7 -0
  205. package/dist/core/sdd/adr-policy.js +47 -0
  206. package/dist/core/sdd/adr.d.ts +4 -0
  207. package/dist/core/sdd/adr.js +27 -0
  208. package/dist/core/sdd/bootstrap.d.ts +28 -0
  209. package/dist/core/sdd/bootstrap.js +353 -0
  210. package/dist/core/sdd/check.d.ts +51 -0
  211. package/dist/core/sdd/check.js +831 -0
  212. package/dist/core/sdd/coordination/coordination-adapters.d.ts +73 -0
  213. package/dist/core/sdd/coordination/coordination-adapters.js +87 -0
  214. package/dist/core/sdd/coordination/index.d.ts +2 -0
  215. package/dist/core/sdd/coordination/index.js +2 -0
  216. package/dist/core/sdd/dedup.d.ts +23 -0
  217. package/dist/core/sdd/dedup.js +62 -0
  218. package/dist/core/sdd/default-bootstrap-files.d.ts +23 -0
  219. package/dist/core/sdd/default-bootstrap-files.js +385 -0
  220. package/dist/core/sdd/default-skills.d.ts +16 -0
  221. package/dist/core/sdd/default-skills.js +427 -0
  222. package/dist/core/sdd/diagnose.d.ts +25 -0
  223. package/dist/core/sdd/diagnose.js +1312 -0
  224. package/dist/core/sdd/docs-sync.d.ts +21 -0
  225. package/dist/core/sdd/docs-sync.js +231 -0
  226. package/dist/core/sdd/domain/helpers.d.ts +6 -0
  227. package/dist/core/sdd/domain/helpers.js +37 -0
  228. package/dist/core/sdd/domain/lifecycle-guardrails.d.ts +22 -0
  229. package/dist/core/sdd/domain/lifecycle-guardrails.js +31 -0
  230. package/dist/core/sdd/domain/lifecycle-hooks.d.ts +16 -0
  231. package/dist/core/sdd/domain/lifecycle-hooks.js +27 -0
  232. package/dist/core/sdd/domain/post-active-validation.d.ts +15 -0
  233. package/dist/core/sdd/domain/post-active-validation.js +71 -0
  234. package/dist/core/sdd/domain/traceability.d.ts +8 -0
  235. package/dist/core/sdd/domain/traceability.js +83 -0
  236. package/dist/core/sdd/domain/transition-engine.d.ts +49 -0
  237. package/dist/core/sdd/domain/transition-engine.js +120 -0
  238. package/dist/core/sdd/fingerprint.d.ts +23 -0
  239. package/dist/core/sdd/fingerprint.js +146 -0
  240. package/dist/core/sdd/import-openspec.d.ts +31 -0
  241. package/dist/core/sdd/import-openspec.js +232 -0
  242. package/dist/core/sdd/init.d.ts +36 -0
  243. package/dist/core/sdd/init.js +65 -0
  244. package/dist/core/sdd/json-schema.d.ts +6 -0
  245. package/dist/core/sdd/json-schema.js +59 -0
  246. package/dist/core/sdd/legacy-operations.d.ts +286 -0
  247. package/dist/core/sdd/legacy-operations.js +2175 -0
  248. package/dist/core/sdd/lenses.d.ts +14 -0
  249. package/dist/core/sdd/lenses.js +97 -0
  250. package/dist/core/sdd/merge-catalog.d.ts +9 -0
  251. package/dist/core/sdd/merge-catalog.js +70 -0
  252. package/dist/core/sdd/migrate-workspace.d.ts +36 -0
  253. package/dist/core/sdd/migrate-workspace.js +344 -0
  254. package/dist/core/sdd/migrate.d.ts +24 -0
  255. package/dist/core/sdd/migrate.js +385 -0
  256. package/dist/core/sdd/resolve-project-root.d.ts +15 -0
  257. package/dist/core/sdd/resolve-project-root.js +46 -0
  258. package/dist/core/sdd/root-resolver.d.ts +16 -0
  259. package/dist/core/sdd/root-resolver.js +62 -0
  260. package/dist/core/sdd/sanitize.d.ts +35 -0
  261. package/dist/core/sdd/sanitize.js +750 -0
  262. package/dist/core/sdd/services/approve.service.d.ts +20 -0
  263. package/dist/core/sdd/services/approve.service.js +82 -0
  264. package/dist/core/sdd/services/audit.service.d.ts +53 -0
  265. package/dist/core/sdd/services/audit.service.js +136 -0
  266. package/dist/core/sdd/services/breakdown.service.d.ts +35 -0
  267. package/dist/core/sdd/services/breakdown.service.js +185 -0
  268. package/dist/core/sdd/services/context.service.d.ts +346 -0
  269. package/dist/core/sdd/services/context.service.js +278 -0
  270. package/dist/core/sdd/services/debate.service.d.ts +16 -0
  271. package/dist/core/sdd/services/debate.service.js +73 -0
  272. package/dist/core/sdd/services/decide.service.d.ts +23 -0
  273. package/dist/core/sdd/services/decide.service.js +81 -0
  274. package/dist/core/sdd/services/dedup-apply.service.d.ts +39 -0
  275. package/dist/core/sdd/services/dedup-apply.service.js +259 -0
  276. package/dist/core/sdd/services/feature-lint.service.d.ts +29 -0
  277. package/dist/core/sdd/services/feature-lint.service.js +146 -0
  278. package/dist/core/sdd/services/finalize.service.d.ts +33 -0
  279. package/dist/core/sdd/services/finalize.service.js +707 -0
  280. package/dist/core/sdd/services/frontend-gap.service.d.ts +23 -0
  281. package/dist/core/sdd/services/frontend-gap.service.js +117 -0
  282. package/dist/core/sdd/services/frontend-impact.service.d.ts +19 -0
  283. package/dist/core/sdd/services/frontend-impact.service.js +46 -0
  284. package/dist/core/sdd/services/ingest-deposito.service.d.ts +32 -0
  285. package/dist/core/sdd/services/ingest-deposito.service.js +231 -0
  286. package/dist/core/sdd/services/insight.service.d.ts +21 -0
  287. package/dist/core/sdd/services/insight.service.js +81 -0
  288. package/dist/core/sdd/services/legacy-capability.service.d.ts +24 -0
  289. package/dist/core/sdd/services/legacy-capability.service.js +59 -0
  290. package/dist/core/sdd/services/mcp-runtime.service.d.ts +42 -0
  291. package/dist/core/sdd/services/mcp-runtime.service.js +144 -0
  292. package/dist/core/sdd/services/metrics.service.d.ts +49 -0
  293. package/dist/core/sdd/services/metrics.service.js +181 -0
  294. package/dist/core/sdd/services/next.service.d.ts +35 -0
  295. package/dist/core/sdd/services/next.service.js +54 -0
  296. package/dist/core/sdd/services/onboard.service.d.ts +9 -0
  297. package/dist/core/sdd/services/onboard.service.js +165 -0
  298. package/dist/core/sdd/services/rebuild.service.d.ts +31 -0
  299. package/dist/core/sdd/services/rebuild.service.js +482 -0
  300. package/dist/core/sdd/services/scan-naming.service.d.ts +43 -0
  301. package/dist/core/sdd/services/scan-naming.service.js +246 -0
  302. package/dist/core/sdd/services/skills-invoke.service.d.ts +24 -0
  303. package/dist/core/sdd/services/skills-invoke.service.js +63 -0
  304. package/dist/core/sdd/services/skills-sync.service.d.ts +15 -0
  305. package/dist/core/sdd/services/skills-sync.service.js +117 -0
  306. package/dist/core/sdd/services/start.service.d.ts +26 -0
  307. package/dist/core/sdd/services/start.service.js +237 -0
  308. package/dist/core/sdd/skills.d.ts +15 -0
  309. package/dist/core/sdd/skills.js +46 -0
  310. package/dist/core/sdd/state-lock.d.ts +19 -0
  311. package/dist/core/sdd/state-lock.js +144 -0
  312. package/dist/core/sdd/state.d.ts +155 -0
  313. package/dist/core/sdd/state.js +1000 -0
  314. package/dist/core/sdd/store/in-memory-adapter.d.ts +12 -0
  315. package/dist/core/sdd/store/in-memory-adapter.js +27 -0
  316. package/dist/core/sdd/store/index.d.ts +5 -0
  317. package/dist/core/sdd/store/index.js +5 -0
  318. package/dist/core/sdd/store/sdd-stores.d.ts +25 -0
  319. package/dist/core/sdd/store/sdd-stores.js +59 -0
  320. package/dist/core/sdd/store/state-store.d.ts +32 -0
  321. package/dist/core/sdd/store/state-store.js +2 -0
  322. package/dist/core/sdd/store/yaml-file-adapter.d.ts +12 -0
  323. package/dist/core/sdd/store/yaml-file-adapter.js +43 -0
  324. package/dist/core/sdd/structural-health.d.ts +557 -0
  325. package/dist/core/sdd/structural-health.js +187 -0
  326. package/dist/core/sdd/transaction.d.ts +14 -0
  327. package/dist/core/sdd/transaction.js +100 -0
  328. package/dist/core/sdd/types.d.ts +1570 -0
  329. package/dist/core/sdd/types.js +617 -0
  330. package/dist/core/sdd/views.d.ts +3 -0
  331. package/dist/core/sdd/views.js +560 -0
  332. package/dist/core/sdd/workspace-schemas.d.ts +620 -0
  333. package/dist/core/sdd/workspace-schemas.js +254 -0
  334. package/dist/core/sdd/write-manifest.d.ts +25 -0
  335. package/dist/core/sdd/write-manifest.js +353 -0
  336. package/dist/core/shared/index.d.ts +8 -0
  337. package/dist/core/shared/index.js +8 -0
  338. package/dist/core/shared/skill-generation.d.ts +49 -0
  339. package/dist/core/shared/skill-generation.js +106 -0
  340. package/dist/core/shared/tool-detection.d.ts +71 -0
  341. package/dist/core/shared/tool-detection.js +158 -0
  342. package/dist/core/specs-apply.d.ts +73 -0
  343. package/dist/core/specs-apply.js +385 -0
  344. package/dist/core/styles/palette.d.ts +7 -0
  345. package/dist/core/styles/palette.js +8 -0
  346. package/dist/core/templates/index.d.ts +8 -0
  347. package/dist/core/templates/index.js +9 -0
  348. package/dist/core/templates/skill-templates.d.ts +20 -0
  349. package/dist/core/templates/skill-templates.js +19 -0
  350. package/dist/core/templates/types.d.ts +19 -0
  351. package/dist/core/templates/types.js +5 -0
  352. package/dist/core/templates/workflows/apply-change.d.ts +10 -0
  353. package/dist/core/templates/workflows/apply-change.js +308 -0
  354. package/dist/core/templates/workflows/archive-change.d.ts +10 -0
  355. package/dist/core/templates/workflows/archive-change.js +277 -0
  356. package/dist/core/templates/workflows/bulk-archive-change.d.ts +10 -0
  357. package/dist/core/templates/workflows/bulk-archive-change.js +502 -0
  358. package/dist/core/templates/workflows/continue-change.d.ts +10 -0
  359. package/dist/core/templates/workflows/continue-change.js +232 -0
  360. package/dist/core/templates/workflows/explore.d.ts +10 -0
  361. package/dist/core/templates/workflows/explore.js +475 -0
  362. package/dist/core/templates/workflows/feedback.d.ts +9 -0
  363. package/dist/core/templates/workflows/feedback.js +108 -0
  364. package/dist/core/templates/workflows/ff-change.d.ts +10 -0
  365. package/dist/core/templates/workflows/ff-change.js +206 -0
  366. package/dist/core/templates/workflows/new-change.d.ts +10 -0
  367. package/dist/core/templates/workflows/new-change.js +151 -0
  368. package/dist/core/templates/workflows/onboard.d.ts +10 -0
  369. package/dist/core/templates/workflows/onboard.js +573 -0
  370. package/dist/core/templates/workflows/propose.d.ts +10 -0
  371. package/dist/core/templates/workflows/propose.js +224 -0
  372. package/dist/core/templates/workflows/sdd.d.ts +10 -0
  373. package/dist/core/templates/workflows/sdd.js +107 -0
  374. package/dist/core/templates/workflows/sync-specs.d.ts +10 -0
  375. package/dist/core/templates/workflows/sync-specs.js +286 -0
  376. package/dist/core/templates/workflows/verify-change.d.ts +10 -0
  377. package/dist/core/templates/workflows/verify-change.js +346 -0
  378. package/dist/core/update.d.ts +77 -0
  379. package/dist/core/update.js +538 -0
  380. package/dist/core/validation/constants.d.ts +34 -0
  381. package/dist/core/validation/constants.js +40 -0
  382. package/dist/core/validation/types.d.ts +18 -0
  383. package/dist/core/validation/types.js +2 -0
  384. package/dist/core/validation/validator.d.ts +33 -0
  385. package/dist/core/validation/validator.js +409 -0
  386. package/dist/core/view.d.ts +8 -0
  387. package/dist/core/view.js +170 -0
  388. package/dist/index.d.ts +3 -0
  389. package/dist/index.js +3 -0
  390. package/dist/prompts/searchable-multi-select.d.ts +28 -0
  391. package/dist/prompts/searchable-multi-select.js +159 -0
  392. package/dist/telemetry/config.d.ts +32 -0
  393. package/dist/telemetry/config.js +68 -0
  394. package/dist/telemetry/index.d.ts +44 -0
  395. package/dist/telemetry/index.js +207 -0
  396. package/dist/ui/ascii-patterns.d.ts +16 -0
  397. package/dist/ui/ascii-patterns.js +133 -0
  398. package/dist/ui/welcome-screen.d.ts +10 -0
  399. package/dist/ui/welcome-screen.js +146 -0
  400. package/dist/utils/change-metadata.d.ts +51 -0
  401. package/dist/utils/change-metadata.js +147 -0
  402. package/dist/utils/change-utils.d.ts +62 -0
  403. package/dist/utils/change-utils.js +121 -0
  404. package/dist/utils/command-references.d.ts +18 -0
  405. package/dist/utils/command-references.js +20 -0
  406. package/dist/utils/file-system.d.ts +36 -0
  407. package/dist/utils/file-system.js +281 -0
  408. package/dist/utils/index.d.ts +6 -0
  409. package/dist/utils/index.js +9 -0
  410. package/dist/utils/interactive.d.ts +18 -0
  411. package/dist/utils/interactive.js +21 -0
  412. package/dist/utils/item-discovery.d.ts +4 -0
  413. package/dist/utils/item-discovery.js +73 -0
  414. package/dist/utils/match.d.ts +3 -0
  415. package/dist/utils/match.js +22 -0
  416. package/dist/utils/openspec-compat.d.ts +2 -0
  417. package/dist/utils/openspec-compat.js +2 -0
  418. package/dist/utils/shell-detection.d.ts +20 -0
  419. package/dist/utils/shell-detection.js +41 -0
  420. package/dist/utils/task-progress.d.ts +8 -0
  421. package/dist/utils/task-progress.js +36 -0
  422. package/package.json +111 -0
  423. package/schemas/sdd/1-spec.schema.json +221 -0
  424. package/schemas/sdd/2-plan.schema.json +199 -0
  425. package/schemas/sdd/3-tasks.schema.json +102 -0
  426. package/schemas/sdd/4-changelog.schema.json +55 -0
  427. package/schemas/sdd/5-quality.schema.json +427 -0
  428. package/schemas/sdd/workspace-catalog.schema.json +1012 -0
  429. package/schemas/spec-driven/schema.yaml +153 -0
  430. package/schemas/spec-driven/templates/design.md +19 -0
  431. package/schemas/spec-driven/templates/proposal.md +23 -0
  432. package/schemas/spec-driven/templates/spec.md +8 -0
  433. package/schemas/spec-driven/templates/tasks.md +9 -0
@@ -0,0 +1,296 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ import { JsonConverter } from '../core/converters/json-converter.js';
4
+ import { Validator } from '../core/validation/validator.js';
5
+ import { ChangeParser } from '../core/parsers/change-parser.js';
6
+ import { isInteractive } from '../utils/interactive.js';
7
+ import { getActiveChangeIds } from '../utils/item-discovery.js';
8
+ import { CLI_NAME } from '../core/branding.js';
9
+ import { resolveOpenSpecSubpath } from '../core/sdd/services/legacy-capability.service.js';
10
+ import { captureFingerprintsForChange, writeMeta } from '../core/sdd/fingerprint.js';
11
+ // Constants for better maintainability
12
+ const ARCHIVE_DIR = 'archive';
13
+ const TASK_PATTERN = /^[-*]\s+\[[\sx]\]/i;
14
+ const COMPLETED_TASK_PATTERN = /^[-*]\s+\[x\]/i;
15
+ export class ChangeCommand {
16
+ converter;
17
+ constructor() {
18
+ this.converter = new JsonConverter();
19
+ }
20
+ /**
21
+ * Show a change proposal.
22
+ * - Text mode: raw markdown passthrough (no filters)
23
+ * - JSON mode: minimal object with deltas; --deltas-only returns same object with filtered deltas
24
+ * Note: --requirements-only is deprecated alias for --deltas-only
25
+ */
26
+ async show(changeName, options) {
27
+ const changesPath = resolveOpenSpecSubpath(process.cwd(), 'changes');
28
+ if (!changeName) {
29
+ const canPrompt = isInteractive(options);
30
+ const changes = await this.getActiveChanges(changesPath);
31
+ if (canPrompt && changes.length > 0) {
32
+ const { select } = await import('@inquirer/prompts');
33
+ const selected = await select({
34
+ message: 'Select a change to show',
35
+ choices: changes.map(id => ({ name: id, value: id })),
36
+ });
37
+ changeName = selected;
38
+ }
39
+ else {
40
+ if (changes.length === 0) {
41
+ console.error('No change specified. No active changes found.');
42
+ }
43
+ else {
44
+ console.error(`No change specified. Available IDs: ${changes.join(', ')}`);
45
+ }
46
+ console.error(`Hint: use "${CLI_NAME} change list" to view available changes.`);
47
+ process.exitCode = 1;
48
+ return;
49
+ }
50
+ }
51
+ const proposalPath = path.join(changesPath, changeName, 'proposal.md');
52
+ try {
53
+ await fs.access(proposalPath);
54
+ }
55
+ catch {
56
+ throw new Error(`Change "${changeName}" not found at ${proposalPath}`);
57
+ }
58
+ if (options?.json) {
59
+ const jsonOutput = await this.converter.convertChangeToJson(proposalPath);
60
+ if (options.requirementsOnly) {
61
+ console.error('Flag --requirements-only is deprecated; use --deltas-only instead.');
62
+ }
63
+ const parsed = JSON.parse(jsonOutput);
64
+ const contentForTitle = await fs.readFile(proposalPath, 'utf-8');
65
+ const title = this.extractTitle(contentForTitle, changeName);
66
+ const id = parsed.name;
67
+ const deltas = parsed.deltas || [];
68
+ if (options.requirementsOnly || options.deltasOnly) {
69
+ const output = { id, title, deltaCount: deltas.length, deltas };
70
+ console.log(JSON.stringify(output, null, 2));
71
+ }
72
+ else {
73
+ const output = {
74
+ id,
75
+ title,
76
+ deltaCount: deltas.length,
77
+ deltas,
78
+ };
79
+ console.log(JSON.stringify(output, null, 2));
80
+ }
81
+ }
82
+ else {
83
+ const content = await fs.readFile(proposalPath, 'utf-8');
84
+ console.log(content);
85
+ }
86
+ }
87
+ /**
88
+ * List active changes.
89
+ * - Text default: IDs only; --long prints minimal details (title, counts)
90
+ * - JSON: array of { id, title, deltaCount, taskStatus }, sorted by id
91
+ */
92
+ async list(options) {
93
+ const changesPath = resolveOpenSpecSubpath(process.cwd(), 'changes');
94
+ const changes = await this.getActiveChanges(changesPath);
95
+ if (options?.json) {
96
+ const changeDetails = await Promise.all(changes.map(async (changeName) => {
97
+ const proposalPath = path.join(changesPath, changeName, 'proposal.md');
98
+ const tasksPath = path.join(changesPath, changeName, 'tasks.md');
99
+ try {
100
+ const content = await fs.readFile(proposalPath, 'utf-8');
101
+ const changeDir = path.join(changesPath, changeName);
102
+ const parser = new ChangeParser(content, changeDir);
103
+ const change = await parser.parseChangeWithDeltas(changeName);
104
+ let taskStatus = { total: 0, completed: 0 };
105
+ try {
106
+ const tasksContent = await fs.readFile(tasksPath, 'utf-8');
107
+ taskStatus = this.countTasks(tasksContent);
108
+ }
109
+ catch (error) {
110
+ // Tasks file may not exist, which is okay
111
+ if (process.env.DEBUG) {
112
+ console.error(`Failed to read tasks file at ${tasksPath}:`, error);
113
+ }
114
+ }
115
+ return {
116
+ id: changeName,
117
+ title: this.extractTitle(content, changeName),
118
+ deltaCount: change.deltas.length,
119
+ taskStatus,
120
+ };
121
+ }
122
+ catch (error) {
123
+ return {
124
+ id: changeName,
125
+ title: 'Unknown',
126
+ deltaCount: 0,
127
+ taskStatus: { total: 0, completed: 0 },
128
+ };
129
+ }
130
+ }));
131
+ const sorted = changeDetails.sort((a, b) => a.id.localeCompare(b.id));
132
+ console.log(JSON.stringify(sorted, null, 2));
133
+ }
134
+ else {
135
+ if (changes.length === 0) {
136
+ console.log('No items found');
137
+ return;
138
+ }
139
+ const sorted = [...changes].sort();
140
+ if (!options?.long) {
141
+ // IDs only
142
+ sorted.forEach(id => console.log(id));
143
+ return;
144
+ }
145
+ // Long format: id: title and minimal counts
146
+ for (const changeName of sorted) {
147
+ const proposalPath = path.join(changesPath, changeName, 'proposal.md');
148
+ const tasksPath = path.join(changesPath, changeName, 'tasks.md');
149
+ try {
150
+ const content = await fs.readFile(proposalPath, 'utf-8');
151
+ const title = this.extractTitle(content, changeName);
152
+ let taskStatusText = '';
153
+ try {
154
+ const tasksContent = await fs.readFile(tasksPath, 'utf-8');
155
+ const { total, completed } = this.countTasks(tasksContent);
156
+ taskStatusText = ` [tasks ${completed}/${total}]`;
157
+ }
158
+ catch (error) {
159
+ if (process.env.DEBUG) {
160
+ console.error(`Failed to read tasks file at ${tasksPath}:`, error);
161
+ }
162
+ }
163
+ const changeDir = path.join(changesPath, changeName);
164
+ const parser = new ChangeParser(await fs.readFile(proposalPath, 'utf-8'), changeDir);
165
+ const change = await parser.parseChangeWithDeltas(changeName);
166
+ const deltaCountText = ` [deltas ${change.deltas.length}]`;
167
+ console.log(`${changeName}: ${title}${deltaCountText}${taskStatusText}`);
168
+ }
169
+ catch {
170
+ console.log(`${changeName}: (unable to read)`);
171
+ }
172
+ }
173
+ }
174
+ }
175
+ async validate(changeName, options) {
176
+ const changesPath = resolveOpenSpecSubpath(process.cwd(), 'changes');
177
+ if (!changeName) {
178
+ const canPrompt = isInteractive(options);
179
+ const changes = await getActiveChangeIds();
180
+ if (canPrompt && changes.length > 0) {
181
+ const { select } = await import('@inquirer/prompts');
182
+ const selected = await select({
183
+ message: 'Select a change to validate',
184
+ choices: changes.map(id => ({ name: id, value: id })),
185
+ });
186
+ changeName = selected;
187
+ }
188
+ else {
189
+ if (changes.length === 0) {
190
+ console.error('No change specified. No active changes found.');
191
+ }
192
+ else {
193
+ console.error(`No change specified. Available IDs: ${changes.join(', ')}`);
194
+ }
195
+ console.error(`Hint: use "${CLI_NAME} change list" to view available changes.`);
196
+ process.exitCode = 1;
197
+ return;
198
+ }
199
+ }
200
+ const changeDir = path.join(changesPath, changeName);
201
+ try {
202
+ await fs.access(changeDir);
203
+ }
204
+ catch {
205
+ throw new Error(`Change "${changeName}" not found at ${changeDir}`);
206
+ }
207
+ const validator = new Validator(options?.strict || false);
208
+ const report = await validator.validateChangeDeltaSpecs(changeDir);
209
+ if (options?.json) {
210
+ console.log(JSON.stringify(report, null, 2));
211
+ }
212
+ else {
213
+ if (report.valid) {
214
+ const mainSpecsDir = resolveOpenSpecSubpath(process.cwd(), 'specs');
215
+ try {
216
+ const meta = await captureFingerprintsForChange(changeDir, mainSpecsDir, {
217
+ sourceChangeId: changeName,
218
+ });
219
+ await writeMeta(changeDir, meta);
220
+ }
221
+ catch (error) {
222
+ console.error('Unable to update change fingerprint metadata after successful validation.');
223
+ console.error(` reason: ${error.message}`);
224
+ console.error(`Change "${changeName}" has issues`);
225
+ if (!options?.json) {
226
+ process.exitCode = 1;
227
+ }
228
+ return;
229
+ }
230
+ console.log(`Change "${changeName}" is valid`);
231
+ }
232
+ else {
233
+ console.error(`Change "${changeName}" has issues`);
234
+ report.issues.forEach(issue => {
235
+ const label = issue.level === 'ERROR' ? 'ERROR' : 'WARNING';
236
+ const prefix = issue.level === 'ERROR' ? '✗' : '⚠';
237
+ console.error(`${prefix} [${label}] ${issue.path}: ${issue.message}`);
238
+ });
239
+ // Next steps footer to guide fixing issues
240
+ this.printNextSteps();
241
+ if (!options?.json) {
242
+ process.exitCode = 1;
243
+ }
244
+ }
245
+ }
246
+ }
247
+ async getActiveChanges(changesPath) {
248
+ try {
249
+ const entries = await fs.readdir(changesPath, { withFileTypes: true });
250
+ const result = [];
251
+ for (const entry of entries) {
252
+ if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === ARCHIVE_DIR)
253
+ continue;
254
+ const proposalPath = path.join(changesPath, entry.name, 'proposal.md');
255
+ try {
256
+ await fs.access(proposalPath);
257
+ result.push(entry.name);
258
+ }
259
+ catch {
260
+ // skip directories without proposal.md
261
+ }
262
+ }
263
+ return result.sort();
264
+ }
265
+ catch {
266
+ return [];
267
+ }
268
+ }
269
+ extractTitle(content, changeName) {
270
+ const match = content.match(/^#\s+(?:Change:\s+)?(.+)$/im);
271
+ return match ? match[1].trim() : changeName;
272
+ }
273
+ countTasks(content) {
274
+ const lines = content.split('\n');
275
+ let total = 0;
276
+ let completed = 0;
277
+ for (const line of lines) {
278
+ if (line.match(TASK_PATTERN)) {
279
+ total++;
280
+ if (line.match(COMPLETED_TASK_PATTERN)) {
281
+ completed++;
282
+ }
283
+ }
284
+ }
285
+ return { total, completed };
286
+ }
287
+ printNextSteps() {
288
+ const bullets = [];
289
+ bullets.push('- Ensure change has deltas in specs/: use headers ## ADDED/MODIFIED/REMOVED/RENAMED Requirements');
290
+ bullets.push('- Each requirement MUST include at least one #### Scenario: block');
291
+ bullets.push(`- Debug parsed deltas: ${CLI_NAME} change show <id> --json --deltas-only`);
292
+ console.error('Next steps:');
293
+ bullets.forEach(b => console.error(` ${b}`));
294
+ }
295
+ }
296
+ //# sourceMappingURL=change.js.map
@@ -0,0 +1,72 @@
1
+ interface GenerateOptions {
2
+ shell?: string;
3
+ }
4
+ interface InstallOptions {
5
+ shell?: string;
6
+ verbose?: boolean;
7
+ }
8
+ interface UninstallOptions {
9
+ shell?: string;
10
+ yes?: boolean;
11
+ }
12
+ interface CompleteOptions {
13
+ type: string;
14
+ }
15
+ /**
16
+ * Command for managing shell completions for OpenSpec CLI
17
+ */
18
+ export declare class CompletionCommand {
19
+ private completionProvider;
20
+ constructor();
21
+ /**
22
+ * Resolve shell parameter or exit with error
23
+ *
24
+ * @param shell - The shell parameter (may be undefined)
25
+ * @param operationName - Name of the operation (for error messages)
26
+ * @returns Resolved shell or null if should exit
27
+ */
28
+ private resolveShellOrExit;
29
+ /**
30
+ * Generate completion script and output to stdout
31
+ *
32
+ * @param options - Options for generation (shell type)
33
+ */
34
+ generate(options?: GenerateOptions): Promise<void>;
35
+ /**
36
+ * Install completion script to the appropriate location
37
+ *
38
+ * @param options - Options for installation (shell type, verbose output)
39
+ */
40
+ install(options?: InstallOptions): Promise<void>;
41
+ /**
42
+ * Uninstall completion script from the installation location
43
+ *
44
+ * @param options - Options for uninstallation (shell type, yes flag)
45
+ */
46
+ uninstall(options?: UninstallOptions): Promise<void>;
47
+ /**
48
+ * Generate completion script for a specific shell
49
+ */
50
+ private generateForShell;
51
+ /**
52
+ * Install completion script for a specific shell
53
+ */
54
+ private installForShell;
55
+ /**
56
+ * Uninstall completion script for a specific shell
57
+ */
58
+ private uninstallForShell;
59
+ /**
60
+ * Output machine-readable completion data for shell consumption
61
+ * Format: tab-separated "id\tdescription" per line
62
+ *
63
+ * @param options - Options specifying completion type
64
+ */
65
+ complete(options: CompleteOptions): Promise<void>;
66
+ /**
67
+ * Normalize shell parameter to lowercase
68
+ */
69
+ private normalizeShell;
70
+ }
71
+ export {};
72
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1,258 @@
1
+ import ora from 'ora';
2
+ import { CompletionFactory } from '../core/completions/factory.js';
3
+ import { COMMAND_REGISTRY } from '../core/completions/command-registry.js';
4
+ import { detectShell } from '../utils/shell-detection.js';
5
+ import { CompletionProvider } from '../core/completions/completion-provider.js';
6
+ import { getArchivedChangeIds } from '../utils/item-discovery.js';
7
+ import { CLI_NAME } from '../core/branding.js';
8
+ /**
9
+ * Command for managing shell completions for OpenSpec CLI
10
+ */
11
+ export class CompletionCommand {
12
+ completionProvider;
13
+ constructor() {
14
+ this.completionProvider = new CompletionProvider();
15
+ }
16
+ /**
17
+ * Resolve shell parameter or exit with error
18
+ *
19
+ * @param shell - The shell parameter (may be undefined)
20
+ * @param operationName - Name of the operation (for error messages)
21
+ * @returns Resolved shell or null if should exit
22
+ */
23
+ resolveShellOrExit(shell, operationName) {
24
+ const normalizedShell = this.normalizeShell(shell);
25
+ if (!normalizedShell) {
26
+ const detectionResult = detectShell();
27
+ if (detectionResult.shell && CompletionFactory.isSupported(detectionResult.shell)) {
28
+ return detectionResult.shell;
29
+ }
30
+ // Shell was detected but not supported
31
+ if (detectionResult.detected && !detectionResult.shell) {
32
+ console.error(`Error: Shell '${detectionResult.detected}' is not supported yet. Currently supported: ${CompletionFactory.getSupportedShells().join(', ')}`);
33
+ process.exitCode = 1;
34
+ return null;
35
+ }
36
+ // No shell specified and cannot auto-detect
37
+ console.error('Error: Could not auto-detect shell. Please specify shell explicitly.');
38
+ console.error(`Usage: ${CLI_NAME} completion ${operationName} [shell]`);
39
+ console.error(`Currently supported: ${CompletionFactory.getSupportedShells().join(', ')}`);
40
+ process.exitCode = 1;
41
+ return null;
42
+ }
43
+ if (!CompletionFactory.isSupported(normalizedShell)) {
44
+ console.error(`Error: Shell '${normalizedShell}' is not supported yet. Currently supported: ${CompletionFactory.getSupportedShells().join(', ')}`);
45
+ process.exitCode = 1;
46
+ return null;
47
+ }
48
+ return normalizedShell;
49
+ }
50
+ /**
51
+ * Generate completion script and output to stdout
52
+ *
53
+ * @param options - Options for generation (shell type)
54
+ */
55
+ async generate(options = {}) {
56
+ const shell = this.resolveShellOrExit(options.shell, 'generate');
57
+ if (!shell)
58
+ return;
59
+ await this.generateForShell(shell);
60
+ }
61
+ /**
62
+ * Install completion script to the appropriate location
63
+ *
64
+ * @param options - Options for installation (shell type, verbose output)
65
+ */
66
+ async install(options = {}) {
67
+ const shell = this.resolveShellOrExit(options.shell, 'install');
68
+ if (!shell)
69
+ return;
70
+ await this.installForShell(shell, options.verbose || false);
71
+ }
72
+ /**
73
+ * Uninstall completion script from the installation location
74
+ *
75
+ * @param options - Options for uninstallation (shell type, yes flag)
76
+ */
77
+ async uninstall(options = {}) {
78
+ const shell = this.resolveShellOrExit(options.shell, 'uninstall');
79
+ if (!shell)
80
+ return;
81
+ await this.uninstallForShell(shell, options.yes || false);
82
+ }
83
+ /**
84
+ * Generate completion script for a specific shell
85
+ */
86
+ async generateForShell(shell) {
87
+ const generator = CompletionFactory.createGenerator(shell);
88
+ const script = generator.generate(COMMAND_REGISTRY);
89
+ console.log(script);
90
+ }
91
+ /**
92
+ * Install completion script for a specific shell
93
+ */
94
+ async installForShell(shell, verbose) {
95
+ const generator = CompletionFactory.createGenerator(shell);
96
+ const installer = CompletionFactory.createInstaller(shell);
97
+ const spinner = ora(`Installing ${shell} completion script...`).start();
98
+ try {
99
+ // Generate the completion script
100
+ const script = generator.generate(COMMAND_REGISTRY);
101
+ // Install it
102
+ const result = await installer.install(script);
103
+ spinner.stop();
104
+ if (result.success) {
105
+ console.log(`✓ ${result.message}`);
106
+ if (verbose && result.installedPath) {
107
+ console.log(` Installed to: ${result.installedPath}`);
108
+ if (result.backupPath) {
109
+ console.log(` Backup created: ${result.backupPath}`);
110
+ }
111
+ // Check if any shell config was updated
112
+ const configWasUpdated = result.zshrcConfigured || result.bashrcConfigured || result.profileConfigured;
113
+ if (configWasUpdated) {
114
+ const configPaths = {
115
+ zsh: '~/.zshrc',
116
+ bash: '~/.bashrc',
117
+ fish: '~/.config/fish/config.fish',
118
+ powershell: '$PROFILE',
119
+ };
120
+ const configPath = configPaths[shell] || 'config file';
121
+ console.log(` ${configPath} configured automatically`);
122
+ }
123
+ }
124
+ // Display warnings if present
125
+ if (result.warnings && result.warnings.length > 0) {
126
+ console.log('');
127
+ for (const warning of result.warnings) {
128
+ console.log(warning);
129
+ }
130
+ }
131
+ // Print instructions (only shown if .zshrc wasn't auto-configured)
132
+ if (result.instructions && result.instructions.length > 0) {
133
+ console.log('');
134
+ for (const instruction of result.instructions) {
135
+ console.log(instruction);
136
+ }
137
+ }
138
+ else {
139
+ // Check if any shell config was updated (InstallationResult has: zshrcConfigured, bashrcConfigured, profileConfigured)
140
+ const configWasUpdated = result.zshrcConfigured || result.bashrcConfigured || result.profileConfigured;
141
+ if (configWasUpdated) {
142
+ console.log('');
143
+ // Shell-specific reload instructions
144
+ const reloadCommands = {
145
+ zsh: 'exec zsh',
146
+ bash: 'exec bash',
147
+ fish: 'exec fish',
148
+ powershell: '. $PROFILE',
149
+ };
150
+ const reloadCmd = reloadCommands[shell] || `restart your ${shell} shell`;
151
+ console.log(`Restart your shell or run: ${reloadCmd}`);
152
+ }
153
+ }
154
+ }
155
+ else {
156
+ console.error(`✗ ${result.message}`);
157
+ process.exitCode = 1;
158
+ }
159
+ }
160
+ catch (error) {
161
+ spinner.stop();
162
+ console.error(`✗ Failed to install completion script: ${error instanceof Error ? error.message : String(error)}`);
163
+ process.exitCode = 1;
164
+ }
165
+ }
166
+ /**
167
+ * Uninstall completion script for a specific shell
168
+ */
169
+ async uninstallForShell(shell, skipConfirmation) {
170
+ const installer = CompletionFactory.createInstaller(shell);
171
+ // Prompt for confirmation unless --yes flag is provided
172
+ if (!skipConfirmation) {
173
+ const { confirm } = await import('@inquirer/prompts');
174
+ // Get shell-specific config file path
175
+ const configPaths = {
176
+ zsh: '~/.zshrc',
177
+ bash: '~/.bashrc',
178
+ fish: 'Fish configuration', // Fish doesn't modify profile, just removes script file
179
+ powershell: '$PROFILE',
180
+ };
181
+ const configPath = configPaths[shell] || `${shell} configuration`;
182
+ const confirmed = await confirm({
183
+ message: `Remove OpenSpec configuration from ${configPath}?`,
184
+ default: false,
185
+ });
186
+ if (!confirmed) {
187
+ console.log('Uninstall cancelled.');
188
+ return;
189
+ }
190
+ }
191
+ const spinner = ora(`Uninstalling ${shell} completion script...`).start();
192
+ try {
193
+ const result = await installer.uninstall();
194
+ spinner.stop();
195
+ if (result.success) {
196
+ console.log(`✓ ${result.message}`);
197
+ }
198
+ else {
199
+ console.error(`✗ ${result.message}`);
200
+ process.exitCode = 1;
201
+ }
202
+ }
203
+ catch (error) {
204
+ spinner.stop();
205
+ console.error(`✗ Failed to uninstall completion script: ${error instanceof Error ? error.message : String(error)}`);
206
+ process.exitCode = 1;
207
+ }
208
+ }
209
+ /**
210
+ * Output machine-readable completion data for shell consumption
211
+ * Format: tab-separated "id\tdescription" per line
212
+ *
213
+ * @param options - Options specifying completion type
214
+ */
215
+ async complete(options) {
216
+ const type = options.type.toLowerCase();
217
+ try {
218
+ switch (type) {
219
+ case 'changes': {
220
+ const changeIds = await this.completionProvider.getChangeIds();
221
+ for (const id of changeIds) {
222
+ console.log(`${id}\tactive change`);
223
+ }
224
+ break;
225
+ }
226
+ case 'specs': {
227
+ const specIds = await this.completionProvider.getSpecIds();
228
+ for (const id of specIds) {
229
+ console.log(`${id}\tspecification`);
230
+ }
231
+ break;
232
+ }
233
+ case 'archived-changes': {
234
+ const archivedIds = await getArchivedChangeIds();
235
+ for (const id of archivedIds) {
236
+ console.log(`${id}\tarchived change`);
237
+ }
238
+ break;
239
+ }
240
+ default:
241
+ // Invalid type - silently exit with no output for graceful shell completion failure
242
+ process.exitCode = 1;
243
+ break;
244
+ }
245
+ }
246
+ catch {
247
+ // Silently fail for graceful shell completion experience
248
+ process.exitCode = 1;
249
+ }
250
+ }
251
+ /**
252
+ * Normalize shell parameter to lowercase
253
+ */
254
+ normalizeShell(shell) {
255
+ return shell?.toLowerCase();
256
+ }
257
+ }
258
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1,36 @@
1
+ import { Command } from 'commander';
2
+ import { GlobalConfig } from '../core/global-config.js';
3
+ import type { Profile, Delivery } from '../core/global-config.js';
4
+ interface ProfileState {
5
+ profile: Profile;
6
+ delivery: Delivery;
7
+ workflows: string[];
8
+ }
9
+ interface ProfileStateDiff {
10
+ hasChanges: boolean;
11
+ lines: string[];
12
+ }
13
+ /**
14
+ * Resolve the effective current profile state from global config defaults.
15
+ */
16
+ export declare function resolveCurrentProfileState(config: GlobalConfig): ProfileState;
17
+ /**
18
+ * Derive profile type from selected workflows.
19
+ */
20
+ export declare function deriveProfileFromWorkflowSelection(selectedWorkflows: string[]): Profile;
21
+ /**
22
+ * Format a compact workflow summary for the profile header.
23
+ */
24
+ export declare function formatWorkflowSummary(workflows: readonly string[], profile: Profile): string;
25
+ /**
26
+ * Build a user-facing diff summary between two profile states.
27
+ */
28
+ export declare function diffProfileState(before: ProfileState, after: ProfileState): ProfileStateDiff;
29
+ /**
30
+ * Register the config command and all its subcommands.
31
+ *
32
+ * @param program - The Commander program instance
33
+ */
34
+ export declare function registerConfigCommand(program: Command): void;
35
+ export {};
36
+ //# sourceMappingURL=config.d.ts.map