@cregis-dev/cckit 0.4.0 → 0.4.1

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 (366) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +76 -84
  3. package/bin/cckit.js +3 -3
  4. package/package.json +7 -5
  5. package/registry.json +234 -234
  6. package/src/adapters/trae-adapter.js +90 -90
  7. package/src/cli.js +2 -2
  8. package/src/commands/init.js +337 -337
  9. package/src/commands/status.js +62 -62
  10. package/src/commands/sync.js +325 -325
  11. package/src/commands/update.js +430 -430
  12. package/src/core/config.js +82 -82
  13. package/src/core/differ.js +57 -57
  14. package/src/core/installer.js +97 -97
  15. package/src/core/plugin-installer.js +278 -278
  16. package/src/core/registry.js +75 -75
  17. package/src/core/templatize.js +42 -42
  18. package/src/core/upstream.js +357 -357
  19. package/src/utils/fs.js +55 -55
  20. package/src/utils/logger.js +16 -16
  21. package/templates/bmad/_config/agent-manifest.csv +12 -12
  22. package/templates/bmad/_config/agents/bmm-analyst.customize.yaml +41 -41
  23. package/templates/bmad/_config/agents/bmm-architect.customize.yaml +41 -41
  24. package/templates/bmad/_config/agents/bmm-dev.customize.yaml +41 -41
  25. package/templates/bmad/_config/agents/bmm-pm.customize.yaml +41 -41
  26. package/templates/bmad/_config/agents/bmm-qa.customize.yaml +41 -41
  27. package/templates/bmad/_config/agents/bmm-quick-flow-solo-dev.customize.yaml +41 -41
  28. package/templates/bmad/_config/agents/bmm-sm.customize.yaml +41 -41
  29. package/templates/bmad/_config/agents/bmm-tech-writer.customize.yaml +41 -41
  30. package/templates/bmad/_config/agents/bmm-ux-designer.customize.yaml +41 -41
  31. package/templates/bmad/_config/agents/core-bmad-master.customize.yaml +41 -41
  32. package/templates/bmad/_config/agents/tea-tea.customize.yaml +41 -41
  33. package/templates/bmad/_config/bmad-help.csv +48 -48
  34. package/templates/bmad/_config/files-manifest.csv +437 -437
  35. package/templates/bmad/_config/ides/claude-code.yaml +5 -5
  36. package/templates/bmad/_config/ides/opencode.yaml +5 -5
  37. package/templates/bmad/_config/ides/trae.yaml +5 -5
  38. package/templates/bmad/_config/task-manifest.csv +8 -8
  39. package/templates/bmad/_config/tool-manifest.csv +1 -1
  40. package/templates/bmad/_config/workflow-manifest.csv +35 -35
  41. package/templates/bmad/bmm/agents/analyst.md +78 -78
  42. package/templates/bmad/bmm/agents/architect.md +58 -58
  43. package/templates/bmad/bmm/agents/dev.md +69 -69
  44. package/templates/bmad/bmm/agents/pm.md +72 -72
  45. package/templates/bmad/bmm/agents/qa.md +92 -92
  46. package/templates/bmad/bmm/agents/quick-flow-solo-dev.md +69 -69
  47. package/templates/bmad/bmm/agents/sm.md +70 -70
  48. package/templates/bmad/bmm/agents/tech-writer/tech-writer.md +70 -70
  49. package/templates/bmad/bmm/agents/ux-designer.md +57 -57
  50. package/templates/bmad/bmm/config.yaml +15 -15
  51. package/templates/bmad/bmm/data/project-context-template.md +26 -26
  52. package/templates/bmad/bmm/module-help.csv +31 -31
  53. package/templates/bmad/bmm/teams/default-party.csv +20 -20
  54. package/templates/bmad/bmm/teams/team-fullstack.yaml +12 -12
  55. package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -10
  56. package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -177
  57. package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -161
  58. package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -199
  59. package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -202
  60. package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -205
  61. package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -219
  62. package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +162 -162
  63. package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md +57 -57
  64. package/templates/bmad/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -137
  65. package/templates/bmad/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -229
  66. package/templates/bmad/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -238
  67. package/templates/bmad/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -206
  68. package/templates/bmad/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -234
  69. package/templates/bmad/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +444 -444
  70. package/templates/bmad/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -182
  71. package/templates/bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -237
  72. package/templates/bmad/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -249
  73. package/templates/bmad/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -259
  74. package/templates/bmad/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -177
  75. package/templates/bmad/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +476 -476
  76. package/templates/bmad/bmm/workflows/1-analysis/research/research.template.md +29 -29
  77. package/templates/bmad/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -137
  78. package/templates/bmad/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -239
  79. package/templates/bmad/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -248
  80. package/templates/bmad/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -202
  81. package/templates/bmad/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +233 -233
  82. package/templates/bmad/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +487 -487
  83. package/templates/bmad/bmm/workflows/1-analysis/research/workflow-domain-research.md +54 -54
  84. package/templates/bmad/bmm/workflows/1-analysis/research/workflow-market-research.md +54 -54
  85. package/templates/bmad/bmm/workflows/1-analysis/research/workflow-technical-research.md +54 -54
  86. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +14 -14
  87. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -197
  88. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/data/project-types.csv +10 -10
  89. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01-init.md +191 -191
  90. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01b-continue.md +152 -152
  91. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +224 -224
  92. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02b-vision.md +154 -154
  93. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02c-executive-summary.md +170 -170
  94. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +226 -226
  95. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +213 -213
  96. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +207 -207
  97. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +226 -226
  98. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +237 -237
  99. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +228 -228
  100. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +231 -231
  101. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +242 -242
  102. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +217 -217
  103. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-12-complete.md +124 -124
  104. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +247 -247
  105. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01b-legacy-conversion.md +208 -208
  106. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-02-review.md +249 -249
  107. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-03-edit.md +253 -253
  108. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md +168 -168
  109. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +226 -226
  110. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +191 -191
  111. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +209 -209
  112. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +174 -174
  113. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +214 -214
  114. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +228 -228
  115. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +217 -217
  116. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -205
  117. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +243 -243
  118. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +263 -263
  119. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +209 -209
  120. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +264 -264
  121. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +242 -242
  122. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +231 -231
  123. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/templates/prd-template.md +10 -10
  124. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md +63 -63
  125. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-edit-prd.md +65 -65
  126. package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +63 -63
  127. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -135
  128. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -127
  129. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -190
  130. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -216
  131. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -219
  132. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -234
  133. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -252
  134. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -254
  135. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -224
  136. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -224
  137. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -241
  138. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -248
  139. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -237
  140. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -264
  141. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +171 -171
  142. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -13
  143. package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +42 -42
  144. package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +184 -184
  145. package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +172 -172
  146. package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +173 -173
  147. package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +133 -133
  148. package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +245 -245
  149. package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +129 -129
  150. package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -4
  151. package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +54 -54
  152. package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -12
  153. package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +12 -12
  154. package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +6 -6
  155. package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -153
  156. package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +173 -173
  157. package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -224
  158. package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +329 -329
  159. package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -318
  160. package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -359
  161. package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -379
  162. package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -359
  163. package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +76 -76
  164. package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/workflow.md +49 -49
  165. package/templates/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -259
  166. package/templates/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -233
  167. package/templates/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -272
  168. package/templates/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +149 -149
  169. package/templates/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -57
  170. package/templates/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +58 -58
  171. package/templates/bmad/bmm/workflows/4-implementation/code-review/checklist.md +23 -23
  172. package/templates/bmad/bmm/workflows/4-implementation/code-review/instructions.xml +226 -226
  173. package/templates/bmad/bmm/workflows/4-implementation/code-review/workflow.yaml +43 -43
  174. package/templates/bmad/bmm/workflows/4-implementation/correct-course/checklist.md +288 -288
  175. package/templates/bmad/bmm/workflows/4-implementation/correct-course/instructions.md +207 -207
  176. package/templates/bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml +53 -53
  177. package/templates/bmad/bmm/workflows/4-implementation/create-story/checklist.md +358 -358
  178. package/templates/bmad/bmm/workflows/4-implementation/create-story/instructions.xml +346 -346
  179. package/templates/bmad/bmm/workflows/4-implementation/create-story/template.md +49 -49
  180. package/templates/bmad/bmm/workflows/4-implementation/create-story/workflow.yaml +52 -52
  181. package/templates/bmad/bmm/workflows/4-implementation/dev-story/checklist.md +80 -80
  182. package/templates/bmad/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -410
  183. package/templates/bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml +20 -20
  184. package/templates/bmad/bmm/workflows/4-implementation/retrospective/instructions.md +1444 -1444
  185. package/templates/bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml +52 -52
  186. package/templates/bmad/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -33
  187. package/templates/bmad/bmm/workflows/4-implementation/sprint-planning/instructions.md +226 -226
  188. package/templates/bmad/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -55
  189. package/templates/bmad/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +47 -47
  190. package/templates/bmad/bmm/workflows/4-implementation/sprint-status/instructions.md +230 -230
  191. package/templates/bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml +25 -25
  192. package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +174 -174
  193. package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +118 -118
  194. package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +111 -111
  195. package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +111 -111
  196. package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +104 -104
  197. package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +146 -146
  198. package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -50
  199. package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +189 -189
  200. package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +143 -143
  201. package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +126 -126
  202. package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +200 -200
  203. package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -74
  204. package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -79
  205. package/templates/bmad/bmm/workflows/document-project/checklist.md +245 -245
  206. package/templates/bmad/bmm/workflows/document-project/documentation-requirements.csv +12 -12
  207. package/templates/bmad/bmm/workflows/document-project/instructions.md +130 -130
  208. package/templates/bmad/bmm/workflows/document-project/templates/deep-dive-template.md +345 -345
  209. package/templates/bmad/bmm/workflows/document-project/templates/index-template.md +169 -169
  210. package/templates/bmad/bmm/workflows/document-project/templates/project-overview-template.md +103 -103
  211. package/templates/bmad/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -160
  212. package/templates/bmad/bmm/workflows/document-project/templates/source-tree-template.md +135 -135
  213. package/templates/bmad/bmm/workflows/document-project/workflow.yaml +22 -22
  214. package/templates/bmad/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -298
  215. package/templates/bmad/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -31
  216. package/templates/bmad/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -1106
  217. package/templates/bmad/bmm/workflows/document-project/workflows/full-scan.yaml +31 -31
  218. package/templates/bmad/bmm/workflows/generate-project-context/project-context-template.md +21 -21
  219. package/templates/bmad/bmm/workflows/generate-project-context/steps/step-01-discover.md +184 -184
  220. package/templates/bmad/bmm/workflows/generate-project-context/steps/step-02-generate.md +318 -318
  221. package/templates/bmad/bmm/workflows/generate-project-context/steps/step-03-complete.md +278 -278
  222. package/templates/bmad/bmm/workflows/generate-project-context/workflow.md +49 -49
  223. package/templates/bmad/bmm/workflows/qa/automate/checklist.md +33 -33
  224. package/templates/bmad/bmm/workflows/qa/automate/instructions.md +110 -110
  225. package/templates/bmad/bmm/workflows/qa/automate/workflow.yaml +44 -44
  226. package/templates/bmad/bmm/workflows/qa-generate-e2e-tests/checklist.md +33 -33
  227. package/templates/bmad/bmm/workflows/qa-generate-e2e-tests/instructions.md +110 -110
  228. package/templates/bmad/bmm/workflows/qa-generate-e2e-tests/workflow.yaml +42 -42
  229. package/templates/bmad/commands/bmad-agent-bmad-master.md +15 -15
  230. package/templates/bmad/commands/bmad-agent-bmm-analyst.md +15 -15
  231. package/templates/bmad/commands/bmad-agent-bmm-architect.md +15 -15
  232. package/templates/bmad/commands/bmad-agent-bmm-dev.md +15 -15
  233. package/templates/bmad/commands/bmad-agent-bmm-pm.md +15 -15
  234. package/templates/bmad/commands/bmad-agent-bmm-qa.md +15 -15
  235. package/templates/bmad/commands/bmad-agent-bmm-quick-flow-solo-dev.md +15 -15
  236. package/templates/bmad/commands/bmad-agent-bmm-sm.md +15 -15
  237. package/templates/bmad/commands/bmad-agent-bmm-tech-writer.md +15 -15
  238. package/templates/bmad/commands/bmad-agent-bmm-ux-designer.md +15 -15
  239. package/templates/bmad/commands/bmad-agent-tea-tea.md +15 -15
  240. package/templates/bmad/commands/bmad-bmm-check-implementation-readiness.md +6 -6
  241. package/templates/bmad/commands/bmad-bmm-code-review.md +14 -14
  242. package/templates/bmad/commands/bmad-bmm-correct-course.md +14 -14
  243. package/templates/bmad/commands/bmad-bmm-create-architecture.md +6 -6
  244. package/templates/bmad/commands/bmad-bmm-create-epics-and-stories.md +6 -6
  245. package/templates/bmad/commands/bmad-bmm-create-prd.md +6 -6
  246. package/templates/bmad/commands/bmad-bmm-create-product-brief.md +6 -6
  247. package/templates/bmad/commands/bmad-bmm-create-story.md +14 -14
  248. package/templates/bmad/commands/bmad-bmm-create-ux-design.md +6 -6
  249. package/templates/bmad/commands/bmad-bmm-dev-story.md +14 -14
  250. package/templates/bmad/commands/bmad-bmm-document-project.md +14 -14
  251. package/templates/bmad/commands/bmad-bmm-domain-research.md +6 -6
  252. package/templates/bmad/commands/bmad-bmm-edit-prd.md +6 -6
  253. package/templates/bmad/commands/bmad-bmm-generate-project-context.md +6 -6
  254. package/templates/bmad/commands/bmad-bmm-market-research.md +6 -6
  255. package/templates/bmad/commands/bmad-bmm-qa-automate.md +15 -15
  256. package/templates/bmad/commands/bmad-bmm-qa-generate-e2e-tests.md +14 -14
  257. package/templates/bmad/commands/bmad-bmm-quick-dev.md +6 -6
  258. package/templates/bmad/commands/bmad-bmm-quick-spec.md +6 -6
  259. package/templates/bmad/commands/bmad-bmm-retrospective.md +14 -14
  260. package/templates/bmad/commands/bmad-bmm-sprint-planning.md +14 -14
  261. package/templates/bmad/commands/bmad-bmm-sprint-status.md +14 -14
  262. package/templates/bmad/commands/bmad-bmm-technical-research.md +6 -6
  263. package/templates/bmad/commands/bmad-bmm-validate-prd.md +6 -6
  264. package/templates/bmad/commands/bmad-brainstorming.md +6 -6
  265. package/templates/bmad/commands/bmad-editorial-review-prose.md +10 -10
  266. package/templates/bmad/commands/bmad-editorial-review-structure.md +10 -10
  267. package/templates/bmad/commands/bmad-help.md +10 -10
  268. package/templates/bmad/commands/bmad-index-docs.md +10 -10
  269. package/templates/bmad/commands/bmad-party-mode.md +6 -6
  270. package/templates/bmad/commands/bmad-review-adversarial-general.md +10 -10
  271. package/templates/bmad/commands/bmad-review-edge-case-hunter.md +10 -10
  272. package/templates/bmad/commands/bmad-shard-doc.md +10 -10
  273. package/templates/bmad/commands/bmad-tea-teach-me-testing.md +6 -6
  274. package/templates/bmad/commands/bmad-tea-testarch-atdd.md +14 -14
  275. package/templates/bmad/commands/bmad-tea-testarch-automate.md +14 -14
  276. package/templates/bmad/commands/bmad-tea-testarch-ci.md +14 -14
  277. package/templates/bmad/commands/bmad-tea-testarch-framework.md +14 -14
  278. package/templates/bmad/commands/bmad-tea-testarch-nfr.md +14 -14
  279. package/templates/bmad/commands/bmad-tea-testarch-test-design.md +14 -14
  280. package/templates/bmad/commands/bmad-tea-testarch-test-review.md +14 -14
  281. package/templates/bmad/commands/bmad-tea-testarch-trace.md +14 -14
  282. package/templates/bmad/core/agents/bmad-master.md +56 -56
  283. package/templates/bmad/core/config.yaml +8 -8
  284. package/templates/bmad/core/module-help.csv +10 -10
  285. package/templates/bmad/core/tasks/editorial-review-prose.xml +101 -101
  286. package/templates/bmad/core/tasks/editorial-review-structure.xml +207 -207
  287. package/templates/bmad/core/tasks/help.md +86 -86
  288. package/templates/bmad/core/tasks/index-docs.xml +64 -64
  289. package/templates/bmad/core/tasks/review-adversarial-general.xml +48 -48
  290. package/templates/bmad/core/tasks/review-edge-case-hunter.xml +63 -63
  291. package/templates/bmad/core/tasks/shard-doc.xml +107 -107
  292. package/templates/bmad/core/tasks/workflow.xml +234 -234
  293. package/templates/bmad/core/workflows/advanced-elicitation/methods.csv +51 -51
  294. package/templates/bmad/core/workflows/advanced-elicitation/workflow.xml +117 -117
  295. package/templates/bmad/core/workflows/brainstorming/brain-methods.csv +61 -61
  296. package/templates/bmad/core/workflows/brainstorming/steps/step-01-session-setup.md +210 -210
  297. package/templates/bmad/core/workflows/brainstorming/steps/step-01b-continue.md +122 -122
  298. package/templates/bmad/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -225
  299. package/templates/bmad/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -237
  300. package/templates/bmad/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -209
  301. package/templates/bmad/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -264
  302. package/templates/bmad/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -399
  303. package/templates/bmad/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -303
  304. package/templates/bmad/core/workflows/brainstorming/template.md +15 -15
  305. package/templates/bmad/core/workflows/brainstorming/workflow.md +60 -60
  306. package/templates/bmad/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -138
  307. package/templates/bmad/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -187
  308. package/templates/bmad/core/workflows/party-mode/steps/step-03-graceful-exit.md +168 -168
  309. package/templates/bmad/core/workflows/party-mode/workflow.md +194 -194
  310. package/templates/bmad/tea/agents/tea.md +71 -71
  311. package/templates/bmad/tea/config.yaml +24 -24
  312. package/templates/mcp/claude-code/.mcp.json +35 -35
  313. package/templates/mcp/trae/mcp.json +35 -35
  314. package/templates/trae-bmad/rules/bmad-agent-bmad-master.md +15 -15
  315. package/templates/trae-bmad/rules/bmad-agent-bmm-analyst.md +15 -15
  316. package/templates/trae-bmad/rules/bmad-agent-bmm-architect.md +15 -15
  317. package/templates/trae-bmad/rules/bmad-agent-bmm-dev.md +15 -15
  318. package/templates/trae-bmad/rules/bmad-agent-bmm-pm.md +15 -15
  319. package/templates/trae-bmad/rules/bmad-agent-bmm-qa.md +15 -15
  320. package/templates/trae-bmad/rules/bmad-agent-bmm-quick-flow-solo-dev.md +15 -15
  321. package/templates/trae-bmad/rules/bmad-agent-bmm-sm.md +15 -15
  322. package/templates/trae-bmad/rules/bmad-agent-bmm-tech-writer.md +15 -15
  323. package/templates/trae-bmad/rules/bmad-agent-bmm-ux-designer.md +15 -15
  324. package/templates/trae-bmad/rules/bmad-agent-tea-tea.md +15 -15
  325. package/templates/trae-bmad/rules/bmad-bmm-check-implementation-readiness.md +6 -6
  326. package/templates/trae-bmad/rules/bmad-bmm-code-review.md +14 -14
  327. package/templates/trae-bmad/rules/bmad-bmm-correct-course.md +14 -14
  328. package/templates/trae-bmad/rules/bmad-bmm-create-architecture.md +6 -6
  329. package/templates/trae-bmad/rules/bmad-bmm-create-epics-and-stories.md +6 -6
  330. package/templates/trae-bmad/rules/bmad-bmm-create-prd.md +6 -6
  331. package/templates/trae-bmad/rules/bmad-bmm-create-product-brief.md +6 -6
  332. package/templates/trae-bmad/rules/bmad-bmm-create-story.md +14 -14
  333. package/templates/trae-bmad/rules/bmad-bmm-create-ux-design.md +6 -6
  334. package/templates/trae-bmad/rules/bmad-bmm-dev-story.md +14 -14
  335. package/templates/trae-bmad/rules/bmad-bmm-document-project.md +14 -14
  336. package/templates/trae-bmad/rules/bmad-bmm-domain-research.md +6 -6
  337. package/templates/trae-bmad/rules/bmad-bmm-edit-prd.md +6 -6
  338. package/templates/trae-bmad/rules/bmad-bmm-generate-project-context.md +6 -6
  339. package/templates/trae-bmad/rules/bmad-bmm-market-research.md +6 -6
  340. package/templates/trae-bmad/rules/bmad-bmm-qa-automate.md +15 -15
  341. package/templates/trae-bmad/rules/bmad-bmm-qa-generate-e2e-tests.md +14 -14
  342. package/templates/trae-bmad/rules/bmad-bmm-quick-dev.md +6 -6
  343. package/templates/trae-bmad/rules/bmad-bmm-quick-spec.md +6 -6
  344. package/templates/trae-bmad/rules/bmad-bmm-retrospective.md +14 -14
  345. package/templates/trae-bmad/rules/bmad-bmm-sprint-planning.md +14 -14
  346. package/templates/trae-bmad/rules/bmad-bmm-sprint-status.md +14 -14
  347. package/templates/trae-bmad/rules/bmad-bmm-technical-research.md +6 -6
  348. package/templates/trae-bmad/rules/bmad-bmm-validate-prd.md +6 -6
  349. package/templates/trae-bmad/rules/bmad-brainstorming.md +6 -6
  350. package/templates/trae-bmad/rules/bmad-editorial-review-prose.md +10 -10
  351. package/templates/trae-bmad/rules/bmad-editorial-review-structure.md +10 -10
  352. package/templates/trae-bmad/rules/bmad-help.md +10 -10
  353. package/templates/trae-bmad/rules/bmad-index-docs.md +10 -10
  354. package/templates/trae-bmad/rules/bmad-party-mode.md +6 -6
  355. package/templates/trae-bmad/rules/bmad-review-adversarial-general.md +10 -10
  356. package/templates/trae-bmad/rules/bmad-review-edge-case-hunter.md +10 -10
  357. package/templates/trae-bmad/rules/bmad-shard-doc.md +10 -10
  358. package/templates/trae-bmad/rules/bmad-tea-teach-me-testing.md +6 -6
  359. package/templates/trae-bmad/rules/bmad-tea-testarch-atdd.md +14 -14
  360. package/templates/trae-bmad/rules/bmad-tea-testarch-automate.md +14 -14
  361. package/templates/trae-bmad/rules/bmad-tea-testarch-ci.md +14 -14
  362. package/templates/trae-bmad/rules/bmad-tea-testarch-framework.md +14 -14
  363. package/templates/trae-bmad/rules/bmad-tea-testarch-nfr.md +14 -14
  364. package/templates/trae-bmad/rules/bmad-tea-testarch-test-design.md +14 -14
  365. package/templates/trae-bmad/rules/bmad-tea-testarch-test-review.md +14 -14
  366. package/templates/trae-bmad/rules/bmad-tea-testarch-trace.md +14 -14
@@ -1,337 +1,337 @@
1
- import path from 'node:path'
2
- import fse from 'fs-extra'
3
- import { fileURLToPath } from 'node:url'
4
- import YAML from 'yaml'
5
- import { loadRegistry, getDefaultModules, resolveModules } from '../core/registry.js'
6
- import { mergeConfig } from '../core/config.js'
7
- import { Installer } from '../core/installer.js'
8
- import { ADAPTERS } from '../adapters/trae-adapter.js'
9
- import { getDefaultPlugins, resolvePlugins, installPlugins } from '../core/plugin-installer.js'
10
- import { createLogger } from '../utils/logger.js'
11
-
12
- const __dirname = path.dirname(fileURLToPath(import.meta.url))
13
- const CCKIT_ROOT = path.resolve(__dirname, '../..')
14
-
15
- const SCAFFOLD_DIRS = [
16
- '_bmad-output/planning-artifacts',
17
- '_bmad-output/implementation-artifacts',
18
- '_bmad-output/test-artifacts',
19
- 'docs'
20
- ]
21
-
22
- const MANIFEST_REL = path.join('_bmad', '_config', 'manifest.yaml')
23
-
24
- /**
25
- * Resolve modules with per-IDE targets into a flat list of installable entries.
26
- *
27
- * - Modules with `targets` map: expanded into one entry per selected IDE
28
- * - Modules with `ideTarget`: included only if matching IDE is selected
29
- * - IDE-agnostic modules: included once as-is
30
- *
31
- * Each expanded entry gets an absolute `templateDir` and the correct
32
- * `adapter` function / `prefix` from the ADAPTERS map.
33
- *
34
- * @param {Array<object>} modules - Resolved module objects from registry
35
- * @param {string[]} ides - Selected IDE identifiers
36
- * @returns {Array<object>} Flat list of installable module entries
37
- */
38
- export function resolveModuleTargets(modules, ides) {
39
- const resolved = []
40
-
41
- for (const mod of modules) {
42
- if (mod.targets) {
43
- for (const ide of ides) {
44
- if (mod.targets[ide]) {
45
- const target = mod.targets[ide]
46
- resolved.push({
47
- ...mod,
48
- targetDir: target.targetDir,
49
- templateDir: target.templateDir || mod.templateDir,
50
- adapter: target.adapter ? ADAPTERS[target.adapter] : undefined,
51
- prefix: target.prefix || undefined,
52
- id: `${mod.id}@${ide}`
53
- })
54
- }
55
- }
56
- } else if (mod.ideTarget) {
57
- if (ides.includes(mod.ideTarget)) {
58
- resolved.push(mod)
59
- }
60
- } else {
61
- resolved.push(mod)
62
- }
63
- }
64
-
65
- return resolved
66
- }
67
-
68
- /**
69
- * Make templateDir paths absolute relative to cckit package root.
70
- *
71
- * @param {Array<object>} modules - Module entries with relative templateDir
72
- * @returns {Array<object>} New array with absolute templateDir paths
73
- */
74
- function absolutizeTemplateDirs(modules) {
75
- return modules.map(mod => ({
76
- ...mod,
77
- templateDir: path.resolve(CCKIT_ROOT, mod.templateDir)
78
- }))
79
- }
80
-
81
- /**
82
- * Filter out modules whose template directories don't exist yet.
83
- * Returns a tuple of [installable, skipped] arrays.
84
- *
85
- * @param {Array<object>} modules - Module entries with absolute templateDir
86
- * @param {object} logger - Logger instance
87
- * @returns {Promise<[Array<object>, Array<object>]>} [installable, skipped]
88
- */
89
- async function filterExistingTemplates(modules, logger) {
90
- const installable = []
91
- const skipped = []
92
-
93
- for (const mod of modules) {
94
- const exists = await fse.pathExists(mod.templateDir)
95
- if (exists) {
96
- // Also check the directory is not empty
97
- const files = await fse.readdir(mod.templateDir)
98
- if (files.length > 0) {
99
- installable.push(mod)
100
- } else {
101
- logger.warn(`Skipping ${mod.name} (${mod.id}): template directory is empty`)
102
- skipped.push({ id: mod.id, name: mod.name, reason: 'empty template directory' })
103
- }
104
- } else {
105
- logger.warn(`Skipping ${mod.name} (${mod.id}): template not found at ${mod.templateDir}`)
106
- skipped.push({ id: mod.id, name: mod.name, reason: 'template directory not found' })
107
- }
108
- }
109
-
110
- return [installable, skipped]
111
- }
112
-
113
- /**
114
- * Filter modules by excludeGroups config.
115
- * Module id prefixes map to groups: bmad-* -> bmad, ecc-* -> ecc, mcp -> mcp.
116
- *
117
- * @param {Array<object>} modules - Module entries
118
- * @param {string[]} excludeGroups - Groups to exclude
119
- * @returns {Array<object>} Filtered modules
120
- */
121
- function filterByGroups(modules, excludeGroups) {
122
- if (!excludeGroups || excludeGroups.length === 0) return modules
123
-
124
- return modules.filter(mod => {
125
- // Extract base id (before @ide suffix)
126
- const baseId = mod.id.includes('@') ? mod.id.split('@')[0] : mod.id
127
- for (const group of excludeGroups) {
128
- if (baseId === group || baseId.startsWith(`${group}-`)) {
129
- return false
130
- }
131
- }
132
- return true
133
- })
134
- }
135
-
136
- /**
137
- * Build the interpolation variables object from config.
138
- *
139
- * @param {object} config - Merged config
140
- * @returns {object} Variables for template interpolation
141
- */
142
- function buildVariables(config) {
143
- return {
144
- user_name: config.user_name,
145
- communication_language: config.communication_language,
146
- document_output_language: config.document_output_language,
147
- languages: config.languages.join(', '),
148
- 'project-root': '.'
149
- }
150
- }
151
-
152
- /**
153
- * Create the manifest.yaml content.
154
- *
155
- * @param {object} params
156
- * @param {object} params.config - Merged config
157
- * @param {Array<object>} params.installed - Installed module summaries
158
- * @param {Array<object>} params.skipped - Skipped module summaries
159
- * @param {object} params.fileRegistry - File hash registry
160
- * @param {string[]} [params.plugins] - Installed plugin IDs
161
- * @returns {string} YAML content
162
- */
163
- function buildManifest({ config, installed, skipped, fileRegistry, plugins }) {
164
- const manifest = {
165
- cckit: {
166
- version: '0.1.0',
167
- installedAt: new Date().toISOString(),
168
- config: {
169
- user_name: config.user_name,
170
- communication_language: config.communication_language,
171
- document_output_language: config.document_output_language,
172
- languages: config.languages,
173
- ides: config.ides
174
- },
175
- modules: {
176
- installed: installed.map(m => ({ id: m.id, name: m.name, files: m.files })),
177
- skipped: skipped.map(m => ({ id: m.id, reason: m.reason }))
178
- },
179
- plugins: plugins || [],
180
- fileRegistry
181
- }
182
- }
183
-
184
- return YAML.stringify(manifest)
185
- }
186
-
187
- /**
188
- * Run the init command.
189
- *
190
- * @param {object} opts - Commander options
191
- * @param {string} [opts.dir] - Target directory (default: cwd)
192
- * @param {boolean} [opts.yes] - Accept all defaults
193
- * @param {string} [opts.userName] - User name override
194
- * @param {string} [opts.communicationLanguage] - Communication language override
195
- * @param {string} [opts.docLanguage] - Document output language override
196
- * @param {string} [opts.lang] - Comma-separated language aliases
197
- * @param {string} [opts.modules] - "all" or comma-separated module IDs
198
- * @param {string} [opts.ides] - Comma-separated IDE identifiers
199
- * @param {boolean} [opts.trae] - Set to false to exclude trae
200
- * @param {boolean} [opts.bmad] - Set to false to exclude bmad modules
201
- * @param {boolean} [opts.ecc] - Set to false to exclude ecc modules
202
- * @param {boolean} [opts.mcp] - Set to false to exclude mcp modules
203
- * @param {boolean} [opts.debug] - Enable debug output
204
- * @returns {Promise<object>} Result with installed/skipped arrays
205
- * @throws {Error} If already installed
206
- */
207
- export async function runInit(opts = {}) {
208
- const targetDir = path.resolve(opts.dir || process.cwd())
209
- const logger = createLogger({ debug: opts.debug })
210
-
211
- // Step 1: Check if already installed
212
- const manifestPath = path.join(targetDir, MANIFEST_REL)
213
- if (await fse.pathExists(manifestPath)) {
214
- throw new Error(
215
- `cckit is already installed in this project. ` +
216
- `Found existing manifest at ${MANIFEST_REL}. ` +
217
- `Use "cckit update" to modify your installation.`
218
- )
219
- }
220
-
221
- logger.banner('cckit init')
222
-
223
- // Step 2: Load registry
224
- const registry = await loadRegistry()
225
-
226
- // Step 3: Merge config from flags (--yes = use defaults)
227
- const config = mergeConfig(opts)
228
- logger.debug(`Config: ${JSON.stringify(config, null, 2)}`)
229
-
230
- // Step 4: Resolve modules from config
231
- const selectedIds = config.modules === 'all'
232
- ? getDefaultModules(registry)
233
- : config.modules
234
-
235
- const resolvedModules = resolveModules(registry, selectedIds)
236
- logger.debug(`Resolved ${resolvedModules.length} modules from registry`)
237
-
238
- // Step 5: Resolve per-IDE targets
239
- const targetModules = resolveModuleTargets(resolvedModules, config.ides)
240
- logger.debug(`Expanded to ${targetModules.length} target entries for IDEs: ${config.ides.join(', ')}`)
241
-
242
- // Step 6: Filter by excludeGroups
243
- const filteredModules = filterByGroups(targetModules, config.excludeGroups)
244
- logger.debug(`After group filtering: ${filteredModules.length} modules`)
245
-
246
- // Step 7: Absolutize template paths
247
- const withAbsPaths = absolutizeTemplateDirs(filteredModules)
248
-
249
- // Step 8: Filter out modules with missing templates
250
- const [installable, skipped] = await filterExistingTemplates(withAbsPaths, logger)
251
- logger.info(` ${installable.length} modules to install, ${skipped.length} skipped (templates pending)`)
252
-
253
- // Step 9: Run installer for modules that have templates
254
- const variables = buildVariables(config)
255
- let installResult = { installed: [], fileRegistry: {} }
256
-
257
- if (installable.length > 0) {
258
- const installer = new Installer({ targetDir, logger })
259
- installResult = await installer.install(installable, variables)
260
- }
261
-
262
- // Step 9.5: Install plugins + Claude Code settings
263
- let pluginResult = { claudeCode: [], trae: { files: 0, details: [] }, installed: [] }
264
- let pluginSkippedEntries = []
265
-
266
- let resolvedPlugins = []
267
- if (config.plugins !== 'none') {
268
- const pluginIds = config.plugins === 'default'
269
- ? getDefaultPlugins(registry)
270
- : Array.isArray(config.plugins) ? config.plugins : []
271
-
272
- if (pluginIds.length > 0) {
273
- const templatesBase = path.resolve(CCKIT_ROOT, 'templates')
274
- const { found, skipped: pluginSkipped } = resolvePlugins(registry, pluginIds, templatesBase, logger)
275
- resolvedPlugins = found
276
-
277
- pluginSkippedEntries = pluginSkipped.map(ps => ({
278
- id: `plugin:${ps.id}`,
279
- name: ps.id,
280
- reason: ps.reason,
281
- }))
282
- }
283
- }
284
-
285
- // Always call installPlugins when claude-code is selected (writes env settings)
286
- // or when there are resolved plugins to install
287
- if (resolvedPlugins.length > 0 || config.ides.includes('claude-code')) {
288
- pluginResult = await installPlugins({
289
- plugins: resolvedPlugins,
290
- targetDir,
291
- ides: config.ides,
292
- variables,
293
- logger,
294
- })
295
-
296
- if (pluginResult.installed.length > 0) {
297
- logger.success(`Plugins: ${pluginResult.installed.join(', ')}`)
298
- }
299
- }
300
-
301
- const allSkipped = [...skipped, ...pluginSkippedEntries]
302
-
303
- // Step 10: Create scaffold directories
304
- for (const dir of SCAFFOLD_DIRS) {
305
- const fullPath = path.join(targetDir, dir)
306
- await fse.ensureDir(fullPath)
307
- logger.debug(`Created scaffold: ${dir}`)
308
- }
309
-
310
- // Step 11: Ensure manifest directory exists and write manifest
311
- await fse.ensureDir(path.dirname(manifestPath))
312
- const manifestContent = buildManifest({
313
- config,
314
- installed: installResult.installed,
315
- skipped: allSkipped,
316
- fileRegistry: installResult.fileRegistry,
317
- plugins: pluginResult.installed,
318
- })
319
- await fse.writeFile(manifestPath, manifestContent, 'utf8')
320
- logger.success(`Manifest written to ${MANIFEST_REL}`)
321
-
322
- // Step 12: Summary
323
- logger.newline()
324
- logger.banner('Init complete!')
325
- logger.info(` Installed: ${installResult.installed.length} modules`)
326
- if (allSkipped.length > 0) {
327
- logger.info(` Skipped: ${allSkipped.length} modules (templates pending)`)
328
- }
329
- logger.newline()
330
-
331
- return {
332
- installed: installResult.installed,
333
- skipped: allSkipped,
334
- fileRegistry: installResult.fileRegistry,
335
- plugins: pluginResult.installed,
336
- }
337
- }
1
+ import path from 'node:path'
2
+ import fse from 'fs-extra'
3
+ import { fileURLToPath } from 'node:url'
4
+ import YAML from 'yaml'
5
+ import { loadRegistry, getDefaultModules, resolveModules } from '../core/registry.js'
6
+ import { mergeConfig } from '../core/config.js'
7
+ import { Installer } from '../core/installer.js'
8
+ import { ADAPTERS } from '../adapters/trae-adapter.js'
9
+ import { getDefaultPlugins, resolvePlugins, installPlugins } from '../core/plugin-installer.js'
10
+ import { createLogger } from '../utils/logger.js'
11
+
12
+ const __dirname = path.dirname(fileURLToPath(import.meta.url))
13
+ const CCKIT_ROOT = path.resolve(__dirname, '../..')
14
+
15
+ const SCAFFOLD_DIRS = [
16
+ '_bmad-output/planning-artifacts',
17
+ '_bmad-output/implementation-artifacts',
18
+ '_bmad-output/test-artifacts',
19
+ 'docs'
20
+ ]
21
+
22
+ const MANIFEST_REL = path.join('_bmad', '_config', 'manifest.yaml')
23
+
24
+ /**
25
+ * Resolve modules with per-IDE targets into a flat list of installable entries.
26
+ *
27
+ * - Modules with `targets` map: expanded into one entry per selected IDE
28
+ * - Modules with `ideTarget`: included only if matching IDE is selected
29
+ * - IDE-agnostic modules: included once as-is
30
+ *
31
+ * Each expanded entry gets an absolute `templateDir` and the correct
32
+ * `adapter` function / `prefix` from the ADAPTERS map.
33
+ *
34
+ * @param {Array<object>} modules - Resolved module objects from registry
35
+ * @param {string[]} ides - Selected IDE identifiers
36
+ * @returns {Array<object>} Flat list of installable module entries
37
+ */
38
+ export function resolveModuleTargets(modules, ides) {
39
+ const resolved = []
40
+
41
+ for (const mod of modules) {
42
+ if (mod.targets) {
43
+ for (const ide of ides) {
44
+ if (mod.targets[ide]) {
45
+ const target = mod.targets[ide]
46
+ resolved.push({
47
+ ...mod,
48
+ targetDir: target.targetDir,
49
+ templateDir: target.templateDir || mod.templateDir,
50
+ adapter: target.adapter ? ADAPTERS[target.adapter] : undefined,
51
+ prefix: target.prefix || undefined,
52
+ id: `${mod.id}@${ide}`
53
+ })
54
+ }
55
+ }
56
+ } else if (mod.ideTarget) {
57
+ if (ides.includes(mod.ideTarget)) {
58
+ resolved.push(mod)
59
+ }
60
+ } else {
61
+ resolved.push(mod)
62
+ }
63
+ }
64
+
65
+ return resolved
66
+ }
67
+
68
+ /**
69
+ * Make templateDir paths absolute relative to cckit package root.
70
+ *
71
+ * @param {Array<object>} modules - Module entries with relative templateDir
72
+ * @returns {Array<object>} New array with absolute templateDir paths
73
+ */
74
+ function absolutizeTemplateDirs(modules) {
75
+ return modules.map(mod => ({
76
+ ...mod,
77
+ templateDir: path.resolve(CCKIT_ROOT, mod.templateDir)
78
+ }))
79
+ }
80
+
81
+ /**
82
+ * Filter out modules whose template directories don't exist yet.
83
+ * Returns a tuple of [installable, skipped] arrays.
84
+ *
85
+ * @param {Array<object>} modules - Module entries with absolute templateDir
86
+ * @param {object} logger - Logger instance
87
+ * @returns {Promise<[Array<object>, Array<object>]>} [installable, skipped]
88
+ */
89
+ async function filterExistingTemplates(modules, logger) {
90
+ const installable = []
91
+ const skipped = []
92
+
93
+ for (const mod of modules) {
94
+ const exists = await fse.pathExists(mod.templateDir)
95
+ if (exists) {
96
+ // Also check the directory is not empty
97
+ const files = await fse.readdir(mod.templateDir)
98
+ if (files.length > 0) {
99
+ installable.push(mod)
100
+ } else {
101
+ logger.warn(`Skipping ${mod.name} (${mod.id}): template directory is empty`)
102
+ skipped.push({ id: mod.id, name: mod.name, reason: 'empty template directory' })
103
+ }
104
+ } else {
105
+ logger.warn(`Skipping ${mod.name} (${mod.id}): template not found at ${mod.templateDir}`)
106
+ skipped.push({ id: mod.id, name: mod.name, reason: 'template directory not found' })
107
+ }
108
+ }
109
+
110
+ return [installable, skipped]
111
+ }
112
+
113
+ /**
114
+ * Filter modules by excludeGroups config.
115
+ * Module id prefixes map to groups: bmad-* -> bmad, ecc-* -> ecc, mcp -> mcp.
116
+ *
117
+ * @param {Array<object>} modules - Module entries
118
+ * @param {string[]} excludeGroups - Groups to exclude
119
+ * @returns {Array<object>} Filtered modules
120
+ */
121
+ function filterByGroups(modules, excludeGroups) {
122
+ if (!excludeGroups || excludeGroups.length === 0) return modules
123
+
124
+ return modules.filter(mod => {
125
+ // Extract base id (before @ide suffix)
126
+ const baseId = mod.id.includes('@') ? mod.id.split('@')[0] : mod.id
127
+ for (const group of excludeGroups) {
128
+ if (baseId === group || baseId.startsWith(`${group}-`)) {
129
+ return false
130
+ }
131
+ }
132
+ return true
133
+ })
134
+ }
135
+
136
+ /**
137
+ * Build the interpolation variables object from config.
138
+ *
139
+ * @param {object} config - Merged config
140
+ * @returns {object} Variables for template interpolation
141
+ */
142
+ function buildVariables(config) {
143
+ return {
144
+ user_name: config.user_name,
145
+ communication_language: config.communication_language,
146
+ document_output_language: config.document_output_language,
147
+ languages: config.languages.join(', '),
148
+ 'project-root': '.'
149
+ }
150
+ }
151
+
152
+ /**
153
+ * Create the manifest.yaml content.
154
+ *
155
+ * @param {object} params
156
+ * @param {object} params.config - Merged config
157
+ * @param {Array<object>} params.installed - Installed module summaries
158
+ * @param {Array<object>} params.skipped - Skipped module summaries
159
+ * @param {object} params.fileRegistry - File hash registry
160
+ * @param {string[]} [params.plugins] - Installed plugin IDs
161
+ * @returns {string} YAML content
162
+ */
163
+ function buildManifest({ config, installed, skipped, fileRegistry, plugins }) {
164
+ const manifest = {
165
+ cckit: {
166
+ version: '0.1.0',
167
+ installedAt: new Date().toISOString(),
168
+ config: {
169
+ user_name: config.user_name,
170
+ communication_language: config.communication_language,
171
+ document_output_language: config.document_output_language,
172
+ languages: config.languages,
173
+ ides: config.ides
174
+ },
175
+ modules: {
176
+ installed: installed.map(m => ({ id: m.id, name: m.name, files: m.files })),
177
+ skipped: skipped.map(m => ({ id: m.id, reason: m.reason }))
178
+ },
179
+ plugins: plugins || [],
180
+ fileRegistry
181
+ }
182
+ }
183
+
184
+ return YAML.stringify(manifest)
185
+ }
186
+
187
+ /**
188
+ * Run the init command.
189
+ *
190
+ * @param {object} opts - Commander options
191
+ * @param {string} [opts.dir] - Target directory (default: cwd)
192
+ * @param {boolean} [opts.yes] - Accept all defaults
193
+ * @param {string} [opts.userName] - User name override
194
+ * @param {string} [opts.communicationLanguage] - Communication language override
195
+ * @param {string} [opts.docLanguage] - Document output language override
196
+ * @param {string} [opts.lang] - Comma-separated language aliases
197
+ * @param {string} [opts.modules] - "all" or comma-separated module IDs
198
+ * @param {string} [opts.ides] - Comma-separated IDE identifiers
199
+ * @param {boolean} [opts.trae] - Set to false to exclude trae
200
+ * @param {boolean} [opts.bmad] - Set to false to exclude bmad modules
201
+ * @param {boolean} [opts.ecc] - Set to false to exclude ecc modules
202
+ * @param {boolean} [opts.mcp] - Set to false to exclude mcp modules
203
+ * @param {boolean} [opts.debug] - Enable debug output
204
+ * @returns {Promise<object>} Result with installed/skipped arrays
205
+ * @throws {Error} If already installed
206
+ */
207
+ export async function runInit(opts = {}) {
208
+ const targetDir = path.resolve(opts.dir || process.cwd())
209
+ const logger = createLogger({ debug: opts.debug })
210
+
211
+ // Step 1: Check if already installed
212
+ const manifestPath = path.join(targetDir, MANIFEST_REL)
213
+ if (await fse.pathExists(manifestPath)) {
214
+ throw new Error(
215
+ `cckit is already installed in this project. ` +
216
+ `Found existing manifest at ${MANIFEST_REL}. ` +
217
+ `Use "cckit update" to modify your installation.`
218
+ )
219
+ }
220
+
221
+ logger.banner('cckit init')
222
+
223
+ // Step 2: Load registry
224
+ const registry = await loadRegistry()
225
+
226
+ // Step 3: Merge config from flags (--yes = use defaults)
227
+ const config = mergeConfig(opts)
228
+ logger.debug(`Config: ${JSON.stringify(config, null, 2)}`)
229
+
230
+ // Step 4: Resolve modules from config
231
+ const selectedIds = config.modules === 'all'
232
+ ? getDefaultModules(registry)
233
+ : config.modules
234
+
235
+ const resolvedModules = resolveModules(registry, selectedIds)
236
+ logger.debug(`Resolved ${resolvedModules.length} modules from registry`)
237
+
238
+ // Step 5: Resolve per-IDE targets
239
+ const targetModules = resolveModuleTargets(resolvedModules, config.ides)
240
+ logger.debug(`Expanded to ${targetModules.length} target entries for IDEs: ${config.ides.join(', ')}`)
241
+
242
+ // Step 6: Filter by excludeGroups
243
+ const filteredModules = filterByGroups(targetModules, config.excludeGroups)
244
+ logger.debug(`After group filtering: ${filteredModules.length} modules`)
245
+
246
+ // Step 7: Absolutize template paths
247
+ const withAbsPaths = absolutizeTemplateDirs(filteredModules)
248
+
249
+ // Step 8: Filter out modules with missing templates
250
+ const [installable, skipped] = await filterExistingTemplates(withAbsPaths, logger)
251
+ logger.info(` ${installable.length} modules to install, ${skipped.length} skipped (templates pending)`)
252
+
253
+ // Step 9: Run installer for modules that have templates
254
+ const variables = buildVariables(config)
255
+ let installResult = { installed: [], fileRegistry: {} }
256
+
257
+ if (installable.length > 0) {
258
+ const installer = new Installer({ targetDir, logger })
259
+ installResult = await installer.install(installable, variables)
260
+ }
261
+
262
+ // Step 9.5: Install plugins + Claude Code settings
263
+ let pluginResult = { claudeCode: [], trae: { files: 0, details: [] }, installed: [] }
264
+ let pluginSkippedEntries = []
265
+
266
+ let resolvedPlugins = []
267
+ if (config.plugins !== 'none') {
268
+ const pluginIds = config.plugins === 'default'
269
+ ? getDefaultPlugins(registry)
270
+ : Array.isArray(config.plugins) ? config.plugins : []
271
+
272
+ if (pluginIds.length > 0) {
273
+ const templatesBase = path.resolve(CCKIT_ROOT, 'templates')
274
+ const { found, skipped: pluginSkipped } = resolvePlugins(registry, pluginIds, templatesBase, logger)
275
+ resolvedPlugins = found
276
+
277
+ pluginSkippedEntries = pluginSkipped.map(ps => ({
278
+ id: `plugin:${ps.id}`,
279
+ name: ps.id,
280
+ reason: ps.reason,
281
+ }))
282
+ }
283
+ }
284
+
285
+ // Always call installPlugins when claude-code is selected (writes env settings)
286
+ // or when there are resolved plugins to install
287
+ if (resolvedPlugins.length > 0 || config.ides.includes('claude-code')) {
288
+ pluginResult = await installPlugins({
289
+ plugins: resolvedPlugins,
290
+ targetDir,
291
+ ides: config.ides,
292
+ variables,
293
+ logger,
294
+ })
295
+
296
+ if (pluginResult.installed.length > 0) {
297
+ logger.success(`Plugins: ${pluginResult.installed.join(', ')}`)
298
+ }
299
+ }
300
+
301
+ const allSkipped = [...skipped, ...pluginSkippedEntries]
302
+
303
+ // Step 10: Create scaffold directories
304
+ for (const dir of SCAFFOLD_DIRS) {
305
+ const fullPath = path.join(targetDir, dir)
306
+ await fse.ensureDir(fullPath)
307
+ logger.debug(`Created scaffold: ${dir}`)
308
+ }
309
+
310
+ // Step 11: Ensure manifest directory exists and write manifest
311
+ await fse.ensureDir(path.dirname(manifestPath))
312
+ const manifestContent = buildManifest({
313
+ config,
314
+ installed: installResult.installed,
315
+ skipped: allSkipped,
316
+ fileRegistry: installResult.fileRegistry,
317
+ plugins: pluginResult.installed,
318
+ })
319
+ await fse.writeFile(manifestPath, manifestContent, 'utf8')
320
+ logger.success(`Manifest written to ${MANIFEST_REL}`)
321
+
322
+ // Step 12: Summary
323
+ logger.newline()
324
+ logger.banner('Init complete!')
325
+ logger.info(` Installed: ${installResult.installed.length} modules`)
326
+ if (allSkipped.length > 0) {
327
+ logger.info(` Skipped: ${allSkipped.length} modules (templates pending)`)
328
+ }
329
+ logger.newline()
330
+
331
+ return {
332
+ installed: installResult.installed,
333
+ skipped: allSkipped,
334
+ fileRegistry: installResult.fileRegistry,
335
+ plugins: pluginResult.installed,
336
+ }
337
+ }