@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,552 @@
1
+ import { spawn, execSync } from 'node:child_process';
2
+ import * as fs from 'node:fs';
3
+ 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';
6
+ import { CORE_WORKFLOWS, ALL_WORKFLOWS, getProfileWorkflows } from '../core/profiles.js';
7
+ import { OPENSPEC_DIR_NAME } from '../core/config.js';
8
+ import { hasProjectConfigDrift } from '../core/profile-sync-drift.js';
9
+ import { CLI_NAME } from '../core/branding.js';
10
+ const WORKFLOW_PROMPT_META = {
11
+ propose: {
12
+ name: 'Propose change',
13
+ description: 'Create proposal, design, and tasks from a request',
14
+ },
15
+ explore: {
16
+ name: 'Explore ideas',
17
+ description: 'Investigate a problem before implementation',
18
+ },
19
+ new: {
20
+ name: 'New change',
21
+ description: 'Create a new change scaffold quickly',
22
+ },
23
+ continue: {
24
+ name: 'Continue change',
25
+ description: 'Resume work on an existing change',
26
+ },
27
+ apply: {
28
+ name: 'Apply tasks',
29
+ description: 'Implement tasks from the current change',
30
+ },
31
+ ff: {
32
+ name: 'Fast-forward',
33
+ description: 'Run a faster implementation workflow',
34
+ },
35
+ sync: {
36
+ name: 'Sync specs',
37
+ description: 'Sync change artifacts with specs',
38
+ },
39
+ archive: {
40
+ name: 'Archive change',
41
+ description: 'Finalize and archive a completed change',
42
+ },
43
+ 'bulk-archive': {
44
+ name: 'Bulk archive',
45
+ description: 'Archive multiple completed changes together',
46
+ },
47
+ verify: {
48
+ name: 'Verify change',
49
+ description: 'Run verification checks against a change',
50
+ },
51
+ onboard: {
52
+ name: 'Onboard',
53
+ description: 'Guided onboarding flow for OpenSpec',
54
+ },
55
+ };
56
+ function isPromptCancellationError(error) {
57
+ return (error instanceof Error &&
58
+ (error.name === 'ExitPromptError' || error.message.includes('force closed the prompt with SIGINT')));
59
+ }
60
+ /**
61
+ * Resolve the effective current profile state from global config defaults.
62
+ */
63
+ export function resolveCurrentProfileState(config) {
64
+ const profile = config.profile || 'core';
65
+ const delivery = config.delivery || 'both';
66
+ const workflows = [
67
+ ...getProfileWorkflows(profile, config.workflows ? [...config.workflows] : undefined),
68
+ ];
69
+ return { profile, delivery, workflows };
70
+ }
71
+ /**
72
+ * Derive profile type from selected workflows.
73
+ */
74
+ export function deriveProfileFromWorkflowSelection(selectedWorkflows) {
75
+ const isCoreMatch = selectedWorkflows.length === CORE_WORKFLOWS.length &&
76
+ CORE_WORKFLOWS.every((w) => selectedWorkflows.includes(w));
77
+ return isCoreMatch ? 'core' : 'custom';
78
+ }
79
+ /**
80
+ * Format a compact workflow summary for the profile header.
81
+ */
82
+ export function formatWorkflowSummary(workflows, profile) {
83
+ return `${workflows.length} selected (${profile})`;
84
+ }
85
+ function stableWorkflowOrder(workflows) {
86
+ const seen = new Set();
87
+ const ordered = [];
88
+ for (const workflow of ALL_WORKFLOWS) {
89
+ if (workflows.includes(workflow) && !seen.has(workflow)) {
90
+ ordered.push(workflow);
91
+ seen.add(workflow);
92
+ }
93
+ }
94
+ const extras = workflows.filter((w) => !ALL_WORKFLOWS.includes(w));
95
+ extras.sort();
96
+ for (const extra of extras) {
97
+ if (!seen.has(extra)) {
98
+ ordered.push(extra);
99
+ seen.add(extra);
100
+ }
101
+ }
102
+ return ordered;
103
+ }
104
+ /**
105
+ * Build a user-facing diff summary between two profile states.
106
+ */
107
+ export function diffProfileState(before, after) {
108
+ const lines = [];
109
+ if (before.delivery !== after.delivery) {
110
+ lines.push(`delivery: ${before.delivery} -> ${after.delivery}`);
111
+ }
112
+ if (before.profile !== after.profile) {
113
+ lines.push(`profile: ${before.profile} -> ${after.profile}`);
114
+ }
115
+ const beforeOrdered = stableWorkflowOrder(before.workflows);
116
+ const afterOrdered = stableWorkflowOrder(after.workflows);
117
+ const beforeSet = new Set(beforeOrdered);
118
+ const afterSet = new Set(afterOrdered);
119
+ const added = afterOrdered.filter((w) => !beforeSet.has(w));
120
+ const removed = beforeOrdered.filter((w) => !afterSet.has(w));
121
+ if (added.length > 0 || removed.length > 0) {
122
+ const tokens = [];
123
+ if (added.length > 0) {
124
+ tokens.push(`added ${added.join(', ')}`);
125
+ }
126
+ if (removed.length > 0) {
127
+ tokens.push(`removed ${removed.join(', ')}`);
128
+ }
129
+ lines.push(`workflows: ${tokens.join('; ')}`);
130
+ }
131
+ return {
132
+ hasChanges: lines.length > 0,
133
+ lines,
134
+ };
135
+ }
136
+ function maybeWarnConfigDrift(projectDir, state, colorize) {
137
+ const openspecDir = path.join(projectDir, OPENSPEC_DIR_NAME);
138
+ if (!fs.existsSync(openspecDir)) {
139
+ return;
140
+ }
141
+ if (!hasProjectConfigDrift(projectDir, state.workflows, state.delivery)) {
142
+ return;
143
+ }
144
+ console.log(colorize(`Warning: Global config is not applied to this project. Run \`${CLI_NAME} update\` to sync.`));
145
+ }
146
+ /**
147
+ * Register the config command and all its subcommands.
148
+ *
149
+ * @param program - The Commander program instance
150
+ */
151
+ export function registerConfigCommand(program) {
152
+ const configCmd = program
153
+ .command('config')
154
+ .description('View and modify global OpenSpec configuration')
155
+ .option('--scope <scope>', 'Config scope (only "global" supported currently)')
156
+ .hook('preAction', (thisCommand) => {
157
+ const opts = thisCommand.opts();
158
+ if (opts.scope && opts.scope !== 'global') {
159
+ console.error('Error: Project-local config is not yet implemented');
160
+ process.exit(1);
161
+ }
162
+ });
163
+ // config path
164
+ configCmd
165
+ .command('path')
166
+ .description('Show config file location')
167
+ .action(() => {
168
+ console.log(getGlobalConfigPath());
169
+ });
170
+ // config list
171
+ configCmd
172
+ .command('list')
173
+ .description('Show all current settings')
174
+ .option('--json', 'Output as JSON')
175
+ .action((options) => {
176
+ const config = getGlobalConfig();
177
+ if (options.json) {
178
+ console.log(JSON.stringify(config, null, 2));
179
+ }
180
+ else {
181
+ // Read raw config to determine which values are explicit vs defaults
182
+ const configPath = getGlobalConfigPath();
183
+ let rawConfig = {};
184
+ try {
185
+ if (fs.existsSync(configPath)) {
186
+ rawConfig = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
187
+ }
188
+ }
189
+ catch {
190
+ // If reading fails, treat all as defaults
191
+ }
192
+ console.log(formatValueYaml(config));
193
+ // Annotate profile settings
194
+ const profileSource = rawConfig.profile !== undefined ? '(explicit)' : '(default)';
195
+ const deliverySource = rawConfig.delivery !== undefined ? '(explicit)' : '(default)';
196
+ console.log(`\nProfile settings:`);
197
+ console.log(` profile: ${config.profile} ${profileSource}`);
198
+ console.log(` delivery: ${config.delivery} ${deliverySource}`);
199
+ if (config.profile === 'core') {
200
+ console.log(` workflows: ${CORE_WORKFLOWS.join(', ')} (from core profile)`);
201
+ }
202
+ else if (config.workflows && config.workflows.length > 0) {
203
+ console.log(` workflows: ${config.workflows.join(', ')} (explicit)`);
204
+ }
205
+ else {
206
+ console.log(` workflows: (none)`);
207
+ }
208
+ }
209
+ });
210
+ // config get
211
+ configCmd
212
+ .command('get <key>')
213
+ .description('Get a specific value (raw, scriptable)')
214
+ .action((key) => {
215
+ const config = getGlobalConfig();
216
+ const value = getNestedValue(config, key);
217
+ if (value === undefined) {
218
+ process.exitCode = 1;
219
+ return;
220
+ }
221
+ if (typeof value === 'object' && value !== null) {
222
+ console.log(JSON.stringify(value));
223
+ }
224
+ else {
225
+ console.log(String(value));
226
+ }
227
+ });
228
+ // config set
229
+ configCmd
230
+ .command('set <key> <value>')
231
+ .description('Set a value (auto-coerce types)')
232
+ .option('--string', 'Force value to be stored as string')
233
+ .option('--allow-unknown', 'Allow setting unknown keys')
234
+ .action((key, value, options) => {
235
+ const allowUnknown = Boolean(options.allowUnknown);
236
+ const keyValidation = validateConfigKeyPath(key);
237
+ if (!keyValidation.valid && !allowUnknown) {
238
+ const reason = keyValidation.reason ? ` ${keyValidation.reason}.` : '';
239
+ console.error(`Error: Invalid configuration key "${key}".${reason}`);
240
+ console.error(`Use "${CLI_NAME} config list" to see available keys.`);
241
+ console.error('Pass --allow-unknown to bypass this check.');
242
+ process.exitCode = 1;
243
+ return;
244
+ }
245
+ const config = getGlobalConfig();
246
+ const coercedValue = coerceValue(value, options.string || false);
247
+ // Create a copy to validate before saving
248
+ const newConfig = JSON.parse(JSON.stringify(config));
249
+ setNestedValue(newConfig, key, coercedValue);
250
+ // Validate the new config
251
+ const validation = validateConfig(newConfig);
252
+ if (!validation.success) {
253
+ console.error(`Error: Invalid configuration - ${validation.error}`);
254
+ process.exitCode = 1;
255
+ return;
256
+ }
257
+ // Apply changes and save
258
+ setNestedValue(config, key, coercedValue);
259
+ saveGlobalConfig(config);
260
+ const displayValue = typeof coercedValue === 'string' ? `"${coercedValue}"` : String(coercedValue);
261
+ console.log(`Set ${key} = ${displayValue}`);
262
+ });
263
+ // config unset
264
+ configCmd
265
+ .command('unset <key>')
266
+ .description('Remove a key (revert to default)')
267
+ .action((key) => {
268
+ const config = getGlobalConfig();
269
+ const existed = deleteNestedValue(config, key);
270
+ if (existed) {
271
+ saveGlobalConfig(config);
272
+ console.log(`Unset ${key} (reverted to default)`);
273
+ }
274
+ else {
275
+ console.log(`Key "${key}" was not set`);
276
+ }
277
+ });
278
+ // config reset
279
+ configCmd
280
+ .command('reset')
281
+ .description('Reset configuration to defaults')
282
+ .option('--all', 'Reset all configuration (required)')
283
+ .option('-y, --yes', 'Skip confirmation prompts')
284
+ .action(async (options) => {
285
+ if (!options.all) {
286
+ console.error('Error: --all flag is required for reset');
287
+ console.error(`Usage: ${CLI_NAME} config reset --all [-y]`);
288
+ process.exitCode = 1;
289
+ return;
290
+ }
291
+ if (!options.yes) {
292
+ const { confirm } = await import('@inquirer/prompts');
293
+ let confirmed;
294
+ try {
295
+ confirmed = await confirm({
296
+ message: 'Reset all configuration to defaults?',
297
+ default: false,
298
+ });
299
+ }
300
+ catch (error) {
301
+ if (isPromptCancellationError(error)) {
302
+ console.log('Reset cancelled.');
303
+ process.exitCode = 130;
304
+ return;
305
+ }
306
+ throw error;
307
+ }
308
+ if (!confirmed) {
309
+ console.log('Reset cancelled.');
310
+ return;
311
+ }
312
+ }
313
+ saveGlobalConfig({ ...DEFAULT_CONFIG });
314
+ console.log('Configuration reset to defaults');
315
+ });
316
+ // config edit
317
+ configCmd
318
+ .command('edit')
319
+ .description('Open config in $EDITOR')
320
+ .action(async () => {
321
+ const editor = process.env.EDITOR || process.env.VISUAL;
322
+ if (!editor) {
323
+ console.error('Error: No editor configured');
324
+ console.error('Set the EDITOR or VISUAL environment variable to your preferred editor');
325
+ console.error('Example: export EDITOR=vim');
326
+ process.exitCode = 1;
327
+ return;
328
+ }
329
+ const configPath = getGlobalConfigPath();
330
+ // Ensure config file exists with defaults
331
+ if (!fs.existsSync(configPath)) {
332
+ saveGlobalConfig({ ...DEFAULT_CONFIG });
333
+ }
334
+ // Spawn editor and wait for it to close
335
+ // Avoid shell parsing to correctly handle paths with spaces in both
336
+ // the editor path and config path
337
+ const child = spawn(editor, [configPath], {
338
+ stdio: 'inherit',
339
+ shell: false,
340
+ });
341
+ await new Promise((resolve, reject) => {
342
+ child.on('close', (code) => {
343
+ if (code === 0) {
344
+ resolve();
345
+ }
346
+ else {
347
+ reject(new Error(`Editor exited with code ${code}`));
348
+ }
349
+ });
350
+ child.on('error', reject);
351
+ });
352
+ try {
353
+ const rawConfig = fs.readFileSync(configPath, 'utf-8');
354
+ const parsedConfig = JSON.parse(rawConfig);
355
+ const validation = validateConfig(parsedConfig);
356
+ if (!validation.success) {
357
+ console.error(`Error: Invalid configuration - ${validation.error}`);
358
+ process.exitCode = 1;
359
+ }
360
+ }
361
+ catch (error) {
362
+ if (error.code === 'ENOENT') {
363
+ console.error(`Error: Config file not found at ${configPath}`);
364
+ }
365
+ else if (error instanceof SyntaxError) {
366
+ console.error(`Error: Invalid JSON in ${configPath}`);
367
+ console.error(error.message);
368
+ }
369
+ else {
370
+ console.error(`Error: Unable to validate configuration - ${error instanceof Error ? error.message : String(error)}`);
371
+ }
372
+ process.exitCode = 1;
373
+ }
374
+ });
375
+ // config profile [preset]
376
+ configCmd
377
+ .command('profile [preset]')
378
+ .description('Configure workflow profile (interactive picker or preset shortcut)')
379
+ .action(async (preset) => {
380
+ // Preset shortcut: `openspec config profile core`
381
+ if (preset === 'core') {
382
+ const config = getGlobalConfig();
383
+ config.profile = 'core';
384
+ config.workflows = [...CORE_WORKFLOWS];
385
+ // Preserve delivery setting
386
+ saveGlobalConfig(config);
387
+ console.log(`Config updated. Run \`${CLI_NAME} update\` in your projects to apply.`);
388
+ return;
389
+ }
390
+ if (preset) {
391
+ console.error(`Error: Unknown profile preset "${preset}". Available presets: core`);
392
+ process.exitCode = 1;
393
+ return;
394
+ }
395
+ // Non-interactive check
396
+ if (!process.stdout.isTTY) {
397
+ console.error(`Interactive mode required. Use \`${CLI_NAME} config profile core\` or set config via environment/flags.`);
398
+ process.exitCode = 1;
399
+ return;
400
+ }
401
+ // Interactive picker
402
+ const { select, checkbox, confirm } = await import('@inquirer/prompts');
403
+ const chalk = (await import('chalk')).default;
404
+ try {
405
+ const config = getGlobalConfig();
406
+ const currentState = resolveCurrentProfileState(config);
407
+ console.log(chalk.bold('\nCurrent profile settings'));
408
+ console.log(` Delivery: ${currentState.delivery}`);
409
+ console.log(` Workflows: ${formatWorkflowSummary(currentState.workflows, currentState.profile)}`);
410
+ console.log(chalk.dim(' Delivery = where workflows are installed (skills, commands, or both)'));
411
+ console.log(chalk.dim(' Workflows = which actions are available (propose, explore, apply, etc.)'));
412
+ console.log();
413
+ const action = await select({
414
+ message: 'What do you want to configure?',
415
+ choices: [
416
+ {
417
+ value: 'both',
418
+ name: 'Delivery and workflows',
419
+ description: 'Update install mode and available actions together',
420
+ },
421
+ {
422
+ value: 'delivery',
423
+ name: 'Delivery only',
424
+ description: 'Change where workflows are installed',
425
+ },
426
+ {
427
+ value: 'workflows',
428
+ name: 'Workflows only',
429
+ description: 'Change which workflow actions are available',
430
+ },
431
+ {
432
+ value: 'keep',
433
+ name: 'Keep current settings (exit)',
434
+ description: 'Leave configuration unchanged and exit',
435
+ },
436
+ ],
437
+ });
438
+ if (action === 'keep') {
439
+ console.log('No config changes.');
440
+ maybeWarnConfigDrift(process.cwd(), currentState, chalk.yellow);
441
+ return;
442
+ }
443
+ const nextState = {
444
+ profile: currentState.profile,
445
+ delivery: currentState.delivery,
446
+ workflows: [...currentState.workflows],
447
+ };
448
+ if (action === 'both' || action === 'delivery') {
449
+ const deliveryChoices = [
450
+ {
451
+ value: 'both',
452
+ name: 'Both (skills + commands)',
453
+ description: 'Install workflows as both skills and slash commands',
454
+ },
455
+ {
456
+ value: 'skills',
457
+ name: 'Skills only',
458
+ description: 'Install workflows only as skills',
459
+ },
460
+ {
461
+ value: 'commands',
462
+ name: 'Commands only',
463
+ description: 'Install workflows only as slash commands',
464
+ },
465
+ ];
466
+ for (const choice of deliveryChoices) {
467
+ if (choice.value === currentState.delivery) {
468
+ choice.name += ' [current]';
469
+ }
470
+ }
471
+ nextState.delivery = await select({
472
+ message: 'Delivery mode (how workflows are installed):',
473
+ choices: deliveryChoices,
474
+ default: currentState.delivery,
475
+ });
476
+ }
477
+ if (action === 'both' || action === 'workflows') {
478
+ const formatWorkflowChoice = (workflow) => {
479
+ const metadata = WORKFLOW_PROMPT_META[workflow] ?? {
480
+ name: workflow,
481
+ description: `Workflow: ${workflow}`,
482
+ };
483
+ return {
484
+ value: workflow,
485
+ name: metadata.name,
486
+ description: metadata.description,
487
+ short: metadata.name,
488
+ checked: currentState.workflows.includes(workflow),
489
+ };
490
+ };
491
+ const selectedWorkflows = await checkbox({
492
+ message: 'Select workflows to make available (Space to toggle, Enter to confirm):',
493
+ pageSize: ALL_WORKFLOWS.length,
494
+ theme: {
495
+ icon: {
496
+ checked: '[x]',
497
+ unchecked: '[ ]',
498
+ },
499
+ },
500
+ choices: ALL_WORKFLOWS.map(formatWorkflowChoice),
501
+ });
502
+ nextState.workflows = selectedWorkflows;
503
+ nextState.profile = deriveProfileFromWorkflowSelection(selectedWorkflows);
504
+ }
505
+ const diff = diffProfileState(currentState, nextState);
506
+ if (!diff.hasChanges) {
507
+ console.log('No config changes.');
508
+ maybeWarnConfigDrift(process.cwd(), nextState, chalk.yellow);
509
+ return;
510
+ }
511
+ console.log(chalk.bold('\nConfig changes:'));
512
+ for (const line of diff.lines) {
513
+ console.log(` ${line}`);
514
+ }
515
+ console.log();
516
+ config.profile = nextState.profile;
517
+ config.delivery = nextState.delivery;
518
+ config.workflows = nextState.workflows;
519
+ saveGlobalConfig(config);
520
+ // Check if inside an OpenSpec project
521
+ const projectDir = process.cwd();
522
+ const openspecDir = path.join(projectDir, OPENSPEC_DIR_NAME);
523
+ if (fs.existsSync(openspecDir)) {
524
+ const applyNow = await confirm({
525
+ message: 'Apply changes to this project now?',
526
+ default: true,
527
+ });
528
+ if (applyNow) {
529
+ try {
530
+ execSync(`npx ${CLI_NAME} update`, { stdio: 'inherit', cwd: projectDir });
531
+ console.log(`Run \`${CLI_NAME} update\` in your other projects to apply.`);
532
+ }
533
+ catch {
534
+ console.error(`\`${CLI_NAME} update\` failed. Please run it manually to apply the profile changes.`);
535
+ process.exitCode = 1;
536
+ }
537
+ return;
538
+ }
539
+ }
540
+ console.log(`Config updated. Run \`${CLI_NAME} update\` in your projects to apply.`);
541
+ }
542
+ catch (error) {
543
+ if (isPromptCancellationError(error)) {
544
+ console.log('Config profile cancelled.');
545
+ process.exitCode = 130;
546
+ return;
547
+ }
548
+ throw error;
549
+ }
550
+ });
551
+ }
552
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Feedback command implementation
3
+ */
4
+ export declare class FeedbackCommand {
5
+ execute(message: string, options?: {
6
+ body?: string;
7
+ }): Promise<void>;
8
+ }
9
+ //# sourceMappingURL=feedback.d.ts.map