@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,576 @@
1
+ /**
2
+ * Init Command
3
+ *
4
+ * Sets up OpenSpec with Agent Skills and /opsx:* slash commands.
5
+ * This is the unified setup command that replaces both the old init and experimental commands.
6
+ */
7
+ import path from 'path';
8
+ import chalk from 'chalk';
9
+ import ora from 'ora';
10
+ import * as fs from 'fs';
11
+ import { createRequire } from 'module';
12
+ import { FileSystemUtils } from '../utils/file-system.js';
13
+ import { transformToHyphenCommands } from '../utils/command-references.js';
14
+ import { AI_TOOLS, OPENSPEC_DIR_NAME, } from './config.js';
15
+ import { isInteractive } from '../utils/interactive.js';
16
+ import { generateCommands, CommandAdapterRegistry, } from './command-generation/index.js';
17
+ import { CLI_ISSUES_URL, CLI_NAME, CLI_PRODUCT_NAME, CLI_REPOSITORY_URL } from './branding.js';
18
+ import { detectLegacyArtifacts, cleanupLegacyArtifacts, formatCleanupSummary, formatDetectionSummary, } from './legacy-cleanup.js';
19
+ import { getToolsWithSkillsDir, getToolStates, getSkillTemplates, getCommandContents, generateSkillContent, } from './shared/index.js';
20
+ import { getGlobalConfig } from './global-config.js';
21
+ import { getProfileWorkflows, ALL_WORKFLOWS } from './profiles.js';
22
+ import { getAvailableTools } from './available-tools.js';
23
+ import { migrateIfNeeded } from './migration.js';
24
+ const require = createRequire(import.meta.url);
25
+ const { version: OPENSPEC_VERSION } = require('../../package.json');
26
+ // -----------------------------------------------------------------------------
27
+ // Constants
28
+ // -----------------------------------------------------------------------------
29
+ const WORKFLOW_TO_SKILL_DIR = {
30
+ 'explore': 'openspec-explore',
31
+ 'new': 'openspec-new-change',
32
+ 'continue': 'openspec-continue-change',
33
+ 'apply': 'openspec-apply-change',
34
+ 'ff': 'openspec-ff-change',
35
+ 'sync': 'openspec-sync-specs',
36
+ 'archive': 'openspec-archive-change',
37
+ 'bulk-archive': 'openspec-bulk-archive-change',
38
+ 'verify': 'openspec-verify-change',
39
+ 'onboard': 'openspec-onboard',
40
+ 'propose': 'openspec-propose',
41
+ 'sdd': 'openspec-sdd',
42
+ };
43
+ // -----------------------------------------------------------------------------
44
+ // Init Command Class
45
+ // -----------------------------------------------------------------------------
46
+ export class InitCommand {
47
+ toolsArg;
48
+ force;
49
+ interactiveOption;
50
+ profileOverride;
51
+ constructor(options = {}) {
52
+ this.toolsArg = options.tools;
53
+ this.force = options.force ?? false;
54
+ this.interactiveOption = options.interactive;
55
+ this.profileOverride = options.profile;
56
+ }
57
+ async execute(targetPath) {
58
+ const projectPath = path.resolve(targetPath);
59
+ const openspecDir = OPENSPEC_DIR_NAME;
60
+ const openspecPath = path.join(projectPath, openspecDir);
61
+ // Validation happens silently in the background
62
+ const extendMode = await this.validate(projectPath, openspecPath);
63
+ // Check for legacy artifacts and handle cleanup
64
+ await this.handleLegacyCleanup(projectPath, extendMode);
65
+ // Detect available tools in the project (task 7.1)
66
+ const detectedTools = getAvailableTools(projectPath);
67
+ // Migration check: migrate existing projects to profile system (task 7.3)
68
+ if (extendMode) {
69
+ migrateIfNeeded(projectPath, detectedTools);
70
+ }
71
+ // Show animated welcome screen (interactive mode only)
72
+ const canPrompt = this.canPromptInteractively();
73
+ if (canPrompt) {
74
+ const { showWelcomeScreen } = await import('../ui/welcome-screen.js');
75
+ await showWelcomeScreen();
76
+ }
77
+ // Validate profile override early so invalid values fail before tool setup.
78
+ // The resolved value is consumed later when generation reads effective config.
79
+ this.resolveProfileOverride();
80
+ // Get tool states before processing
81
+ const toolStates = getToolStates(projectPath);
82
+ // Get tool selection (pass detected tools for pre-selection)
83
+ const selectedToolIds = await this.getSelectedTools(toolStates, extendMode, detectedTools, projectPath);
84
+ // Validate selected tools
85
+ const validatedTools = this.validateTools(selectedToolIds, toolStates);
86
+ // Create directory structure
87
+ await this.createDirectoryStructure(openspecPath, extendMode);
88
+ // Generate skills and commands for each tool
89
+ const results = await this.generateSkillsAndCommands(projectPath, validatedTools);
90
+ // Preserve an existing legacy OpenSpec config, but do not create one for new OpenSDD projects.
91
+ const configStatus = await this.createConfig(openspecPath, extendMode);
92
+ // Display success message
93
+ this.displaySuccessMessage(projectPath, validatedTools, results, configStatus);
94
+ }
95
+ // ═══════════════════════════════════════════════════════════
96
+ // VALIDATION & SETUP
97
+ // ═══════════════════════════════════════════════════════════
98
+ async validate(projectPath, openspecPath) {
99
+ const extendMode = await FileSystemUtils.directoryExists(openspecPath);
100
+ // Check write permissions
101
+ if (!(await FileSystemUtils.ensureWritePermissions(projectPath))) {
102
+ throw new Error(`Insufficient permissions to write to ${projectPath}`);
103
+ }
104
+ return extendMode;
105
+ }
106
+ canPromptInteractively() {
107
+ if (this.interactiveOption === false)
108
+ return false;
109
+ if (this.toolsArg !== undefined)
110
+ return false;
111
+ return isInteractive({ interactive: this.interactiveOption });
112
+ }
113
+ resolveProfileOverride() {
114
+ if (this.profileOverride === undefined) {
115
+ return undefined;
116
+ }
117
+ if (this.profileOverride === 'core' || this.profileOverride === 'custom') {
118
+ return this.profileOverride;
119
+ }
120
+ throw new Error(`Invalid profile "${this.profileOverride}". Available profiles: core, custom`);
121
+ }
122
+ // ═══════════════════════════════════════════════════════════
123
+ // LEGACY CLEANUP
124
+ // ═══════════════════════════════════════════════════════════
125
+ async handleLegacyCleanup(projectPath, extendMode) {
126
+ // Detect legacy artifacts
127
+ const detection = await detectLegacyArtifacts(projectPath);
128
+ if (!detection.hasLegacyArtifacts) {
129
+ return; // No legacy artifacts found
130
+ }
131
+ // Show what was detected
132
+ console.log();
133
+ console.log(formatDetectionSummary(detection));
134
+ console.log();
135
+ const canPrompt = this.canPromptInteractively();
136
+ if (this.force || !canPrompt) {
137
+ // --force flag or non-interactive mode: proceed with cleanup automatically.
138
+ // Legacy slash commands are 100% OpenSpec-managed, and config file cleanup
139
+ // only removes markers (never deletes files), so auto-cleanup is safe.
140
+ await this.performLegacyCleanup(projectPath, detection);
141
+ return;
142
+ }
143
+ // Interactive mode: prompt for confirmation
144
+ const { confirm } = await import('@inquirer/prompts');
145
+ const shouldCleanup = await confirm({
146
+ message: 'Upgrade and clean up legacy files?',
147
+ default: true,
148
+ });
149
+ if (!shouldCleanup) {
150
+ console.log(chalk.dim('Initialization cancelled.'));
151
+ console.log(chalk.dim('Run with --force to skip this prompt, or manually remove legacy files.'));
152
+ process.exit(0);
153
+ }
154
+ await this.performLegacyCleanup(projectPath, detection);
155
+ }
156
+ async performLegacyCleanup(projectPath, detection) {
157
+ const spinner = ora('Cleaning up legacy files...').start();
158
+ const result = await cleanupLegacyArtifacts(projectPath, detection);
159
+ spinner.succeed('Legacy files cleaned up');
160
+ const summary = formatCleanupSummary(result);
161
+ if (summary) {
162
+ console.log();
163
+ console.log(summary);
164
+ }
165
+ console.log();
166
+ }
167
+ // ═══════════════════════════════════════════════════════════
168
+ // TOOL SELECTION
169
+ // ═══════════════════════════════════════════════════════════
170
+ async getSelectedTools(toolStates, extendMode, detectedTools, projectPath) {
171
+ // Check for --tools flag first
172
+ const nonInteractiveSelection = this.resolveToolsArg();
173
+ if (nonInteractiveSelection !== null) {
174
+ return nonInteractiveSelection;
175
+ }
176
+ const validTools = getToolsWithSkillsDir();
177
+ const detectedToolIds = new Set(detectedTools.map((t) => t.value));
178
+ const configuredToolIds = new Set([...toolStates.entries()]
179
+ .filter(([, status]) => status.configured)
180
+ .map(([toolId]) => toolId));
181
+ const shouldPreselectDetected = !extendMode && configuredToolIds.size === 0;
182
+ const canPrompt = this.canPromptInteractively();
183
+ // Non-interactive mode: use detected tools as fallback (task 7.8)
184
+ if (!canPrompt) {
185
+ if (detectedToolIds.size > 0) {
186
+ return [...detectedToolIds];
187
+ }
188
+ throw new Error(`No tools detected and no --tools flag provided. Valid tools:\n ${validTools.join('\n ')}\n\nUse --tools all, --tools none, or --tools claude,cursor,...`);
189
+ }
190
+ if (validTools.length === 0) {
191
+ throw new Error(`No tools available for skill generation.`);
192
+ }
193
+ // Interactive mode: show searchable multi-select
194
+ const { searchableMultiSelect } = await import('../prompts/searchable-multi-select.js');
195
+ // Build choices: pre-select configured tools; keep detected tools visible but unselected.
196
+ const sortedChoices = validTools
197
+ .map((toolId) => {
198
+ const tool = AI_TOOLS.find((t) => t.value === toolId);
199
+ const status = toolStates.get(toolId);
200
+ const configured = status?.configured ?? false;
201
+ const detected = detectedToolIds.has(toolId);
202
+ return {
203
+ name: tool?.name || toolId,
204
+ value: toolId,
205
+ configured,
206
+ detected: detected && !configured,
207
+ preSelected: configured || (shouldPreselectDetected && detected && !configured),
208
+ };
209
+ })
210
+ .sort((a, b) => {
211
+ // Configured tools first, then detected (not configured), then everything else.
212
+ if (a.configured && !b.configured)
213
+ return -1;
214
+ if (!a.configured && b.configured)
215
+ return 1;
216
+ if (a.detected && !b.detected)
217
+ return -1;
218
+ if (!a.detected && b.detected)
219
+ return 1;
220
+ return 0;
221
+ });
222
+ const configuredNames = validTools
223
+ .filter((toolId) => configuredToolIds.has(toolId))
224
+ .map((toolId) => AI_TOOLS.find((t) => t.value === toolId)?.name || toolId);
225
+ if (configuredNames.length > 0) {
226
+ console.log(`OpenSpec configured: ${configuredNames.join(', ')} (pre-selected)`);
227
+ }
228
+ const detectedOnlyNames = detectedTools
229
+ .filter((tool) => !configuredToolIds.has(tool.value))
230
+ .map((tool) => tool.name);
231
+ if (detectedOnlyNames.length > 0) {
232
+ const detectionLabel = shouldPreselectDetected
233
+ ? 'pre-selected for first-time setup'
234
+ : 'not pre-selected';
235
+ console.log(`Detected tool directories: ${detectedOnlyNames.join(', ')} (${detectionLabel})`);
236
+ }
237
+ const selectedTools = await searchableMultiSelect({
238
+ message: `Select tools to set up (${validTools.length} available)`,
239
+ pageSize: 15,
240
+ choices: sortedChoices,
241
+ validate: (selected) => selected.length > 0 || 'Select at least one tool',
242
+ });
243
+ if (selectedTools.length === 0) {
244
+ throw new Error('At least one tool must be selected');
245
+ }
246
+ return selectedTools;
247
+ }
248
+ resolveToolsArg() {
249
+ if (typeof this.toolsArg === 'undefined') {
250
+ return null;
251
+ }
252
+ const raw = this.toolsArg.trim();
253
+ if (raw.length === 0) {
254
+ throw new Error('The --tools option requires a value. Use "all", "none", or a comma-separated list of tool IDs.');
255
+ }
256
+ const availableTools = getToolsWithSkillsDir();
257
+ const availableSet = new Set(availableTools);
258
+ const availableList = ['all', 'none', ...availableTools].join(', ');
259
+ const lowerRaw = raw.toLowerCase();
260
+ if (lowerRaw === 'all') {
261
+ return availableTools;
262
+ }
263
+ if (lowerRaw === 'none') {
264
+ return [];
265
+ }
266
+ const tokens = raw
267
+ .split(',')
268
+ .map((token) => token.trim())
269
+ .filter((token) => token.length > 0);
270
+ if (tokens.length === 0) {
271
+ throw new Error('The --tools option requires at least one tool ID when not using "all" or "none".');
272
+ }
273
+ const normalizedTokens = tokens.map((token) => token.toLowerCase());
274
+ if (normalizedTokens.some((token) => token === 'all' || token === 'none')) {
275
+ throw new Error('Cannot combine reserved values "all" or "none" with specific tool IDs.');
276
+ }
277
+ const invalidTokens = tokens.filter((_token, index) => !availableSet.has(normalizedTokens[index]));
278
+ if (invalidTokens.length > 0) {
279
+ throw new Error(`Invalid tool(s): ${invalidTokens.join(', ')}. Available values: ${availableList}`);
280
+ }
281
+ // Deduplicate while preserving order
282
+ const deduped = [];
283
+ for (const token of normalizedTokens) {
284
+ if (!deduped.includes(token)) {
285
+ deduped.push(token);
286
+ }
287
+ }
288
+ return deduped;
289
+ }
290
+ validateTools(toolIds, toolStates) {
291
+ const validatedTools = [];
292
+ for (const toolId of toolIds) {
293
+ const tool = AI_TOOLS.find((t) => t.value === toolId);
294
+ if (!tool) {
295
+ const validToolIds = getToolsWithSkillsDir();
296
+ throw new Error(`Unknown tool '${toolId}'. Valid tools:\n ${validToolIds.join('\n ')}`);
297
+ }
298
+ if (!tool.skillsDir) {
299
+ const validToolsWithSkills = getToolsWithSkillsDir();
300
+ throw new Error(`Tool '${toolId}' does not support skill generation.\nTools with skill generation support:\n ${validToolsWithSkills.join('\n ')}`);
301
+ }
302
+ const preState = toolStates.get(tool.value);
303
+ validatedTools.push({
304
+ value: tool.value,
305
+ name: tool.name,
306
+ skillsDir: tool.skillsDir,
307
+ wasConfigured: preState?.configured ?? false,
308
+ });
309
+ }
310
+ return validatedTools;
311
+ }
312
+ // ═══════════════════════════════════════════════════════════
313
+ // DIRECTORY STRUCTURE
314
+ // ═══════════════════════════════════════════════════════════
315
+ async createDirectoryStructure(openspecPath, extendMode) {
316
+ if (!extendMode) {
317
+ // New OpenSDD installs are .sdd-native. Keep openspec/ only as a legacy
318
+ // compatibility surface when it already exists in the target project.
319
+ return;
320
+ }
321
+ // In extend mode, just ensure legacy directories exist without spinner.
322
+ const directories = [
323
+ openspecPath,
324
+ path.join(openspecPath, 'specs'),
325
+ path.join(openspecPath, 'changes'),
326
+ path.join(openspecPath, 'changes', 'archive'),
327
+ ];
328
+ for (const dir of directories) {
329
+ await FileSystemUtils.createDirectory(dir);
330
+ }
331
+ }
332
+ // ═══════════════════════════════════════════════════════════
333
+ // SKILL & COMMAND GENERATION
334
+ // ═══════════════════════════════════════════════════════════
335
+ async generateSkillsAndCommands(projectPath, tools) {
336
+ const createdTools = [];
337
+ const refreshedTools = [];
338
+ const failedTools = [];
339
+ const commandsSkipped = [];
340
+ let removedCommandCount = 0;
341
+ let removedSkillCount = 0;
342
+ // Read global config for profile and delivery settings (use --profile override if set)
343
+ const globalConfig = getGlobalConfig();
344
+ const profile = this.resolveProfileOverride() ?? globalConfig.profile ?? 'core';
345
+ const delivery = globalConfig.delivery ?? 'both';
346
+ const workflows = getProfileWorkflows(profile, globalConfig.workflows);
347
+ // Get skill and command templates filtered by profile workflows
348
+ const shouldGenerateSkills = delivery !== 'commands';
349
+ const shouldGenerateCommands = delivery !== 'skills';
350
+ const skillTemplates = shouldGenerateSkills ? getSkillTemplates(workflows) : [];
351
+ const commandContents = shouldGenerateCommands ? getCommandContents(workflows) : [];
352
+ const useSpinner = tools.length === 1;
353
+ const toolResults = await Promise.all(tools.map(async (tool) => {
354
+ const spinner = useSpinner ? ora(`Setting up ${tool.name}...`).start() : null;
355
+ try {
356
+ if (shouldGenerateSkills) {
357
+ const skillsDir = path.join(projectPath, tool.skillsDir, 'skills');
358
+ await Promise.all(skillTemplates.map(async ({ template, dirName }) => {
359
+ const skillDir = path.join(skillsDir, dirName);
360
+ const skillFile = path.join(skillDir, 'SKILL.md');
361
+ const transformer = tool.value === 'opencode' ? transformToHyphenCommands : undefined;
362
+ const skillContent = generateSkillContent(template, OPENSPEC_VERSION, transformer);
363
+ await FileSystemUtils.writeFile(skillFile, skillContent);
364
+ }));
365
+ }
366
+ let toolRemovedSkillCount = 0;
367
+ if (!shouldGenerateSkills) {
368
+ const skillsDir = path.join(projectPath, tool.skillsDir, 'skills');
369
+ toolRemovedSkillCount = await this.removeSkillDirs(skillsDir);
370
+ }
371
+ let toolCommandsSkipped = false;
372
+ if (shouldGenerateCommands) {
373
+ const adapter = CommandAdapterRegistry.get(tool.value);
374
+ if (adapter) {
375
+ const generatedCommands = generateCommands(commandContents, adapter);
376
+ await Promise.all(generatedCommands.map(async (cmd) => {
377
+ const commandFile = path.isAbsolute(cmd.path) ? cmd.path : path.join(projectPath, cmd.path);
378
+ await FileSystemUtils.writeFile(commandFile, cmd.fileContent);
379
+ }));
380
+ }
381
+ else {
382
+ toolCommandsSkipped = true;
383
+ }
384
+ }
385
+ let toolRemovedCommandCount = 0;
386
+ if (!shouldGenerateCommands) {
387
+ toolRemovedCommandCount = await this.removeCommandFiles(projectPath, tool.value);
388
+ }
389
+ spinner?.succeed(`Setup complete for ${tool.name}`);
390
+ return {
391
+ tool,
392
+ ok: true,
393
+ commandsSkipped: toolCommandsSkipped,
394
+ removedCommandCount: toolRemovedCommandCount,
395
+ removedSkillCount: toolRemovedSkillCount,
396
+ };
397
+ }
398
+ catch (error) {
399
+ spinner?.fail(`Failed for ${tool.name}`);
400
+ return {
401
+ tool,
402
+ ok: false,
403
+ error: error,
404
+ commandsSkipped: false,
405
+ removedCommandCount: 0,
406
+ removedSkillCount: 0,
407
+ };
408
+ }
409
+ }));
410
+ for (const result of toolResults) {
411
+ removedCommandCount += result.removedCommandCount;
412
+ removedSkillCount += result.removedSkillCount;
413
+ if (result.commandsSkipped) {
414
+ commandsSkipped.push(result.tool.value);
415
+ }
416
+ if (result.ok) {
417
+ if (result.tool.wasConfigured) {
418
+ refreshedTools.push(result.tool);
419
+ }
420
+ else {
421
+ createdTools.push(result.tool);
422
+ }
423
+ }
424
+ else {
425
+ failedTools.push({ name: result.tool.name, error: result.error });
426
+ }
427
+ }
428
+ return {
429
+ createdTools,
430
+ refreshedTools,
431
+ failedTools,
432
+ commandsSkipped,
433
+ removedCommandCount,
434
+ removedSkillCount,
435
+ };
436
+ }
437
+ // ═══════════════════════════════════════════════════════════
438
+ // CONFIG FILE
439
+ // ═══════════════════════════════════════════════════════════
440
+ async createConfig(openspecPath, _extendMode) {
441
+ const configPath = path.join(openspecPath, 'config.yaml');
442
+ const configYmlPath = path.join(openspecPath, 'config.yml');
443
+ const configYamlExists = fs.existsSync(configPath);
444
+ const configYmlExists = fs.existsSync(configYmlPath);
445
+ if (configYamlExists || configYmlExists) {
446
+ return 'exists';
447
+ }
448
+ return 'skipped';
449
+ }
450
+ // ═══════════════════════════════════════════════════════════
451
+ // UI & OUTPUT
452
+ // ═══════════════════════════════════════════════════════════
453
+ displaySuccessMessage(projectPath, tools, results, configStatus) {
454
+ console.log();
455
+ console.log(chalk.bold(`${CLI_PRODUCT_NAME} Setup Complete`));
456
+ console.log();
457
+ // Show created vs refreshed tools
458
+ if (results.createdTools.length > 0) {
459
+ console.log(`Created: ${results.createdTools.map((t) => t.name).join(', ')}`);
460
+ }
461
+ if (results.refreshedTools.length > 0) {
462
+ console.log(`Refreshed: ${results.refreshedTools.map((t) => t.name).join(', ')}`);
463
+ }
464
+ // Show counts (respecting profile filter)
465
+ const successfulTools = [...results.createdTools, ...results.refreshedTools];
466
+ if (successfulTools.length > 0) {
467
+ const globalConfig = getGlobalConfig();
468
+ const profile = this.profileOverride ?? globalConfig.profile ?? 'core';
469
+ const delivery = globalConfig.delivery ?? 'both';
470
+ const workflows = getProfileWorkflows(profile, globalConfig.workflows);
471
+ const toolDirs = [...new Set(successfulTools.map((t) => t.skillsDir))].join(', ');
472
+ const skillCount = delivery !== 'commands' ? getSkillTemplates(workflows).length : 0;
473
+ const commandCount = delivery !== 'skills' ? getCommandContents(workflows).length : 0;
474
+ if (skillCount > 0 && commandCount > 0) {
475
+ console.log(`${skillCount} skills and ${commandCount} commands in ${toolDirs}/`);
476
+ }
477
+ else if (skillCount > 0) {
478
+ console.log(`${skillCount} skills in ${toolDirs}/`);
479
+ }
480
+ else if (commandCount > 0) {
481
+ console.log(`${commandCount} commands in ${toolDirs}/`);
482
+ }
483
+ }
484
+ // Show failures
485
+ if (results.failedTools.length > 0) {
486
+ console.log(chalk.red(`Failed: ${results.failedTools.map((f) => `${f.name} (${f.error.message})`).join(', ')}`));
487
+ }
488
+ // Show skipped commands
489
+ if (results.commandsSkipped.length > 0) {
490
+ console.log(chalk.dim(`Commands skipped for: ${results.commandsSkipped.join(', ')} (no adapter)`));
491
+ }
492
+ if (results.removedCommandCount > 0) {
493
+ console.log(chalk.dim(`Removed: ${results.removedCommandCount} command files (delivery: skills)`));
494
+ }
495
+ if (results.removedSkillCount > 0) {
496
+ console.log(chalk.dim(`Removed: ${results.removedSkillCount} skill directories (delivery: commands)`));
497
+ }
498
+ // Config status
499
+ if (configStatus === 'exists') {
500
+ // Show actual filename (config.yaml or config.yml)
501
+ const configYaml = path.join(projectPath, OPENSPEC_DIR_NAME, 'config.yaml');
502
+ const configYml = path.join(projectPath, OPENSPEC_DIR_NAME, 'config.yml');
503
+ const configName = fs.existsSync(configYaml) ? 'config.yaml' : fs.existsSync(configYml) ? 'config.yml' : 'config.yaml';
504
+ console.log(`Legacy config: openspec/${configName} (exists)`);
505
+ }
506
+ else {
507
+ console.log(chalk.dim(`Project config: not created (SDD uses .sdd/config.yaml)`));
508
+ }
509
+ // Getting started (task 7.6: show propose if in profile)
510
+ const globalCfg = getGlobalConfig();
511
+ const activeProfile = this.profileOverride ?? globalCfg.profile ?? 'core';
512
+ const activeWorkflows = [...getProfileWorkflows(activeProfile, globalCfg.workflows)];
513
+ console.log();
514
+ if (activeWorkflows.includes('propose')) {
515
+ console.log(chalk.bold('Getting started:'));
516
+ console.log(' Start your first change: /opsx:propose "your idea"');
517
+ }
518
+ else if (activeWorkflows.includes('new')) {
519
+ console.log(chalk.bold('Getting started:'));
520
+ console.log(' Start your first change: /opsx:new "your idea"');
521
+ }
522
+ else {
523
+ console.log(`Done. Run '${CLI_NAME} config profile' to configure your workflows.`);
524
+ }
525
+ // Links
526
+ console.log();
527
+ console.log(`Learn more: ${chalk.cyan(CLI_REPOSITORY_URL)}`);
528
+ console.log(`Feedback: ${chalk.cyan(CLI_ISSUES_URL)}`);
529
+ // Restart instruction if any tools were configured
530
+ if (results.createdTools.length > 0 || results.refreshedTools.length > 0) {
531
+ console.log();
532
+ console.log(chalk.white('Restart your IDE for slash commands to take effect.'));
533
+ }
534
+ console.log();
535
+ }
536
+ async removeSkillDirs(skillsDir) {
537
+ let removed = 0;
538
+ for (const workflow of ALL_WORKFLOWS) {
539
+ const dirName = WORKFLOW_TO_SKILL_DIR[workflow];
540
+ if (!dirName)
541
+ continue;
542
+ const skillDir = path.join(skillsDir, dirName);
543
+ try {
544
+ if (fs.existsSync(skillDir)) {
545
+ await fs.promises.rm(skillDir, { recursive: true, force: true });
546
+ removed++;
547
+ }
548
+ }
549
+ catch {
550
+ // Ignore errors
551
+ }
552
+ }
553
+ return removed;
554
+ }
555
+ async removeCommandFiles(projectPath, toolId) {
556
+ let removed = 0;
557
+ const adapter = CommandAdapterRegistry.get(toolId);
558
+ if (!adapter)
559
+ return 0;
560
+ for (const workflow of ALL_WORKFLOWS) {
561
+ const cmdPath = adapter.getFilePath(workflow);
562
+ const fullPath = path.isAbsolute(cmdPath) ? cmdPath : path.join(projectPath, cmdPath);
563
+ try {
564
+ if (fs.existsSync(fullPath)) {
565
+ await fs.promises.unlink(fullPath);
566
+ removed++;
567
+ }
568
+ }
569
+ catch {
570
+ // Ignore errors
571
+ }
572
+ }
573
+ return removed;
574
+ }
575
+ }
576
+ //# sourceMappingURL=init.js.map