@cregis-dev/cckit 0.3.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 (537) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +89 -85
  3. package/bin/cckit.js +3 -3
  4. package/package.json +7 -5
  5. package/registry.json +43 -9
  6. package/src/adapters/trae-adapter.js +90 -90
  7. package/src/cli.js +2 -2
  8. package/src/commands/init.js +337 -333
  9. package/src/commands/status.js +62 -62
  10. package/src/commands/sync.js +325 -325
  11. package/src/commands/update.js +430 -425
  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 -232
  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 -50
  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 -47
  34. package/templates/bmad/_config/files-manifest.csv +118 -112
  35. package/templates/bmad/_config/ides/claude-code.yaml +2 -2
  36. package/templates/bmad/_config/ides/opencode.yaml +5 -5
  37. package/templates/bmad/_config/ides/trae.yaml +2 -2
  38. package/templates/bmad/_config/task-manifest.csv +8 -7
  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 -0
  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 -9
  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 -0
  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 -197
  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 -58
  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 -20
  312. package/templates/bmad/tea/testarch/knowledge/contract-testing.md +24 -2
  313. package/templates/bmad/tea/testarch/knowledge/pact-mcp.md +204 -0
  314. package/templates/bmad/tea/testarch/knowledge/pactjs-utils-consumer-helpers.md +211 -0
  315. package/templates/bmad/tea/testarch/knowledge/pactjs-utils-overview.md +210 -0
  316. package/templates/bmad/tea/testarch/knowledge/pactjs-utils-provider-verifier.md +315 -0
  317. package/templates/bmad/tea/testarch/knowledge/pactjs-utils-request-filter.md +224 -0
  318. package/templates/bmad/tea/testarch/tea-index.csv +5 -0
  319. package/templates/bmad/tea/workflows/testarch/README.md +1 -1
  320. package/templates/bmad/tea/workflows/testarch/atdd/steps-c/step-01-preflight-and-context.md +30 -0
  321. package/templates/bmad/tea/workflows/testarch/atdd/steps-c/step-04-generate-tests.md +159 -57
  322. package/templates/bmad/tea/workflows/testarch/atdd/steps-c/step-04a-subagent-api-failing.md +215 -0
  323. package/templates/bmad/tea/workflows/testarch/atdd/steps-c/step-04b-subagent-e2e-failing.md +244 -0
  324. package/templates/bmad/tea/workflows/testarch/atdd/steps-c/step-04c-aggregate.md +31 -15
  325. package/templates/bmad/tea/workflows/testarch/atdd/validation-report-20260127-095021.md +1 -1
  326. package/templates/bmad/tea/workflows/testarch/atdd/validation-report-20260127-102401.md +3 -3
  327. package/templates/bmad/tea/workflows/testarch/atdd/workflow.yaml +2 -2
  328. package/templates/bmad/tea/workflows/testarch/automate/steps-c/step-01-preflight-and-context.md +32 -0
  329. package/templates/bmad/tea/workflows/testarch/automate/steps-c/step-03-generate-tests.md +215 -101
  330. package/templates/bmad/tea/workflows/testarch/automate/steps-c/step-03a-subagent-api.md +193 -0
  331. package/templates/bmad/tea/workflows/testarch/automate/steps-c/step-03b-subagent-backend.md +246 -0
  332. package/templates/bmad/tea/workflows/testarch/automate/steps-c/step-03b-subagent-e2e.md +213 -0
  333. package/templates/bmad/tea/workflows/testarch/automate/steps-c/step-03c-aggregate.md +38 -22
  334. package/templates/bmad/tea/workflows/testarch/automate/validation-report-20260127-095021.md +1 -1
  335. package/templates/bmad/tea/workflows/testarch/automate/validation-report-20260127-102401.md +3 -3
  336. package/templates/bmad/tea/workflows/testarch/automate/workflow.yaml +2 -2
  337. package/templates/bmad/tea/workflows/testarch/ci/steps-c/step-02-generate-pipeline.md +124 -1
  338. package/templates/bmad/tea/workflows/testarch/ci/steps-c/step-03-configure-quality-gates.md +7 -0
  339. package/templates/bmad/tea/workflows/testarch/ci/validation-report-20260127-095021.md +1 -1
  340. package/templates/bmad/tea/workflows/testarch/ci/validation-report-20260127-102401.md +3 -3
  341. package/templates/bmad/tea/workflows/testarch/ci/workflow.yaml +2 -2
  342. package/templates/bmad/tea/workflows/testarch/framework/steps-c/step-03-scaffold-framework.md +126 -3
  343. package/templates/bmad/tea/workflows/testarch/framework/validation-report-20260127-095021.md +1 -1
  344. package/templates/bmad/tea/workflows/testarch/framework/validation-report-20260127-102401.md +3 -3
  345. package/templates/bmad/tea/workflows/testarch/framework/workflow.yaml +2 -2
  346. package/templates/bmad/tea/workflows/testarch/nfr-assess/steps-c/step-04-evaluate-and-score.md +150 -36
  347. package/templates/bmad/tea/workflows/testarch/nfr-assess/steps-c/step-04a-subagent-security.md +138 -0
  348. package/templates/bmad/tea/workflows/testarch/nfr-assess/steps-c/step-04b-subagent-performance.md +84 -0
  349. package/templates/bmad/tea/workflows/testarch/nfr-assess/steps-c/step-04c-subagent-reliability.md +85 -0
  350. package/templates/bmad/tea/workflows/testarch/nfr-assess/steps-c/step-04d-subagent-scalability.md +88 -0
  351. package/templates/bmad/tea/workflows/testarch/nfr-assess/steps-c/step-04e-aggregate-nfr.md +27 -10
  352. package/templates/bmad/tea/workflows/testarch/nfr-assess/validation-report-20260127-095021.md +1 -1
  353. package/templates/bmad/tea/workflows/testarch/nfr-assess/validation-report-20260127-102401.md +3 -3
  354. package/templates/bmad/tea/workflows/testarch/nfr-assess/workflow.yaml +2 -2
  355. package/templates/bmad/tea/workflows/testarch/teach-me-testing/data/tea-resources-index.yaml +3 -3
  356. package/templates/bmad/tea/workflows/testarch/teach-me-testing/workflow-plan-teach-me-testing.md +6 -6
  357. package/templates/bmad/tea/workflows/testarch/teach-me-testing/workflow.md +1 -1
  358. package/templates/bmad/tea/workflows/testarch/test-design/steps-c/step-02-load-context.md +30 -0
  359. package/templates/bmad/tea/workflows/testarch/test-design/steps-c/step-05-generate-output.md +72 -1
  360. package/templates/bmad/tea/workflows/testarch/test-design/validation-report-20260127-095021.md +1 -1
  361. package/templates/bmad/tea/workflows/testarch/test-design/validation-report-20260127-102401.md +3 -3
  362. package/templates/bmad/tea/workflows/testarch/test-design/workflow.yaml +2 -2
  363. package/templates/bmad/tea/workflows/testarch/test-review/steps-c/step-01-load-context.md +29 -1
  364. package/templates/bmad/tea/workflows/testarch/test-review/steps-c/step-03-quality-evaluation.md +147 -46
  365. package/templates/bmad/tea/workflows/testarch/test-review/steps-c/step-03a-subagent-determinism.md +214 -0
  366. package/templates/bmad/tea/workflows/testarch/test-review/steps-c/step-03b-subagent-isolation.md +125 -0
  367. package/templates/bmad/tea/workflows/testarch/test-review/steps-c/step-03c-subagent-maintainability.md +102 -0
  368. package/templates/bmad/tea/workflows/testarch/test-review/steps-c/step-03e-subagent-performance.md +117 -0
  369. package/templates/bmad/tea/workflows/testarch/test-review/steps-c/step-03f-aggregate-scores.md +10 -10
  370. package/templates/bmad/tea/workflows/testarch/test-review/validation-report-20260127-095021.md +1 -1
  371. package/templates/bmad/tea/workflows/testarch/test-review/validation-report-20260127-102401.md +3 -3
  372. package/templates/bmad/tea/workflows/testarch/test-review/workflow.yaml +2 -2
  373. package/templates/bmad/tea/workflows/testarch/trace/steps-c/step-04-analyze-gaps.md +92 -1
  374. package/templates/bmad/tea/workflows/testarch/trace/validation-report-20260127-095021.md +1 -1
  375. package/templates/bmad/tea/workflows/testarch/trace/validation-report-20260127-102401.md +3 -3
  376. package/templates/bmad/tea/workflows/testarch/trace/workflow.yaml +2 -2
  377. package/templates/ecc/agents/chief-of-staff.md +151 -0
  378. package/templates/ecc/commands/claw.md +79 -0
  379. package/templates/ecc/rules/README.md +23 -2
  380. package/templates/ecc/rules/common/development-workflow.md +37 -0
  381. package/templates/ecc/rules/common/git-workflow.md +2 -23
  382. package/templates/ecc/rules/swift/coding-style.md +47 -0
  383. package/templates/ecc/rules/swift/hooks.md +20 -0
  384. package/templates/ecc/rules/swift/patterns.md +66 -0
  385. package/templates/ecc/rules/swift/security.md +33 -0
  386. package/templates/ecc/rules/swift/testing.md +45 -0
  387. package/templates/ecc/skills/api-design/SKILL.md +1 -0
  388. package/templates/ecc/skills/article-writing/SKILL.md +85 -0
  389. package/templates/ecc/skills/backend-patterns/SKILL.md +1 -0
  390. package/templates/ecc/skills/clickhouse-io/SKILL.md +1 -0
  391. package/templates/ecc/skills/coding-standards/SKILL.md +1 -0
  392. package/templates/ecc/skills/configure-ecc/SKILL.md +32 -4
  393. package/templates/ecc/skills/content-engine/SKILL.md +88 -0
  394. package/templates/ecc/skills/content-hash-cache-pattern/SKILL.md +1 -0
  395. package/templates/ecc/skills/continuous-learning/SKILL.md +2 -1
  396. package/templates/ecc/skills/continuous-learning-v2/SKILL.md +4 -1
  397. package/templates/ecc/skills/continuous-learning-v2/hooks/observe.sh +14 -7
  398. package/templates/ecc/skills/cost-aware-llm-pipeline/SKILL.md +1 -0
  399. package/templates/ecc/skills/cpp-coding-standards/SKILL.md +1 -0
  400. package/templates/ecc/skills/cpp-testing/SKILL.md +1 -0
  401. package/templates/ecc/skills/database-migrations/SKILL.md +1 -0
  402. package/templates/ecc/skills/deployment-patterns/SKILL.md +1 -0
  403. package/templates/ecc/skills/django-patterns/SKILL.md +1 -0
  404. package/templates/ecc/skills/django-security/SKILL.md +1 -0
  405. package/templates/ecc/skills/django-tdd/SKILL.md +1 -0
  406. package/templates/ecc/skills/django-verification/SKILL.md +1 -0
  407. package/templates/ecc/skills/docker-patterns/SKILL.md +1 -0
  408. package/templates/ecc/skills/e2e-testing/SKILL.md +1 -0
  409. package/templates/ecc/skills/eval-harness/SKILL.md +1 -0
  410. package/templates/ecc/skills/foundation-models-on-device/SKILL.md +243 -0
  411. package/templates/ecc/skills/frontend-patterns/SKILL.md +1 -0
  412. package/templates/ecc/skills/frontend-slides/SKILL.md +184 -0
  413. package/templates/ecc/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  414. package/templates/ecc/skills/golang-patterns/SKILL.md +1 -0
  415. package/templates/ecc/skills/golang-testing/SKILL.md +1 -0
  416. package/templates/ecc/skills/investor-materials/SKILL.md +96 -0
  417. package/templates/ecc/skills/investor-outreach/SKILL.md +76 -0
  418. package/templates/ecc/skills/iterative-retrieval/SKILL.md +1 -0
  419. package/templates/ecc/skills/java-coding-standards/SKILL.md +1 -0
  420. package/templates/ecc/skills/jpa-patterns/SKILL.md +1 -0
  421. package/templates/ecc/skills/liquid-glass-design/SKILL.md +279 -0
  422. package/templates/ecc/skills/market-research/SKILL.md +75 -0
  423. package/templates/ecc/skills/nutrient-document-processing/SKILL.md +1 -1
  424. package/templates/ecc/skills/postgres-patterns/SKILL.md +1 -0
  425. package/templates/ecc/skills/project-guidelines-example/SKILL.md +1 -0
  426. package/templates/ecc/skills/python-patterns/SKILL.md +1 -0
  427. package/templates/ecc/skills/python-testing/SKILL.md +1 -0
  428. package/templates/ecc/skills/regex-vs-llm-structured-text/SKILL.md +1 -0
  429. package/templates/ecc/skills/search-first/SKILL.md +3 -1
  430. package/templates/ecc/skills/security-review/SKILL.md +1 -0
  431. package/templates/ecc/skills/security-scan/SKILL.md +1 -0
  432. package/templates/ecc/skills/skill-stocktake/SKILL.md +176 -0
  433. package/templates/ecc/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
  434. package/templates/ecc/skills/skill-stocktake/scripts/save-results.sh +56 -0
  435. package/templates/ecc/skills/skill-stocktake/scripts/scan.sh +170 -0
  436. package/templates/ecc/skills/springboot-patterns/SKILL.md +1 -0
  437. package/templates/ecc/skills/springboot-security/SKILL.md +1 -0
  438. package/templates/ecc/skills/springboot-tdd/SKILL.md +1 -0
  439. package/templates/ecc/skills/springboot-verification/SKILL.md +1 -0
  440. package/templates/ecc/skills/strategic-compact/SKILL.md +1 -0
  441. package/templates/ecc/skills/swift-actor-persistence/SKILL.md +1 -0
  442. package/templates/ecc/skills/swift-concurrency-6-2/SKILL.md +216 -0
  443. package/templates/ecc/skills/swift-protocol-di-testing/SKILL.md +1 -0
  444. package/templates/ecc/skills/swiftui-patterns/SKILL.md +259 -0
  445. package/templates/ecc/skills/tdd-workflow/SKILL.md +1 -0
  446. package/templates/ecc/skills/verification-loop/SKILL.md +1 -0
  447. package/templates/ecc/skills/visa-doc-translate/README.md +86 -0
  448. package/templates/ecc/skills/visa-doc-translate/SKILL.md +117 -0
  449. package/templates/ext-skills/pinchtab/SKILL.md +89 -486
  450. package/templates/ext-skills/pinchtab/TRUST.md +69 -0
  451. package/templates/ext-skills/pinchtab/references/api.md +297 -0
  452. package/templates/ext-skills/pinchtab/references/env.md +45 -0
  453. package/templates/ext-skills/pinchtab/references/profiles.md +107 -0
  454. package/templates/mcp/claude-code/.mcp.json +35 -35
  455. package/templates/mcp/trae/mcp.json +35 -35
  456. package/templates/plugins/claude-code-setup/.claude-plugin/plugin.json +9 -0
  457. package/templates/plugins/claude-code-setup/LICENSE +202 -0
  458. package/templates/plugins/claude-code-setup/README.md +29 -0
  459. package/templates/plugins/claude-code-setup/automation-recommender-example.png +0 -0
  460. package/templates/plugins/claude-code-setup/skills/claude-automation-recommender/SKILL.md +288 -0
  461. package/templates/plugins/claude-code-setup/skills/claude-automation-recommender/references/hooks-patterns.md +226 -0
  462. package/templates/plugins/claude-code-setup/skills/claude-automation-recommender/references/mcp-servers.md +263 -0
  463. package/templates/plugins/claude-code-setup/skills/claude-automation-recommender/references/plugins-reference.md +98 -0
  464. package/templates/plugins/claude-code-setup/skills/claude-automation-recommender/references/skills-reference.md +408 -0
  465. package/templates/plugins/claude-code-setup/skills/claude-automation-recommender/references/subagent-templates.md +181 -0
  466. package/templates/plugins/claude-md-management/.claude-plugin/plugin.json +9 -0
  467. package/templates/plugins/claude-md-management/LICENSE +202 -0
  468. package/templates/plugins/claude-md-management/README.md +40 -0
  469. package/templates/plugins/claude-md-management/claude-md-improver-example.png +0 -0
  470. package/templates/plugins/claude-md-management/commands/revise-claude-md.md +54 -0
  471. package/templates/plugins/claude-md-management/revise-claude-md-example.png +0 -0
  472. package/templates/plugins/claude-md-management/skills/claude-md-improver/SKILL.md +179 -0
  473. package/templates/plugins/claude-md-management/skills/claude-md-improver/references/quality-criteria.md +109 -0
  474. package/templates/plugins/claude-md-management/skills/claude-md-improver/references/templates.md +253 -0
  475. package/templates/plugins/claude-md-management/skills/claude-md-improver/references/update-guidelines.md +150 -0
  476. package/templates/plugins/code-simplifier/.claude-plugin/plugin.json +9 -0
  477. package/templates/plugins/code-simplifier/LICENSE +202 -0
  478. package/templates/plugins/code-simplifier/agents/code-simplifier.md +52 -0
  479. package/templates/plugins/commit-commands/.claude-plugin/plugin.json +9 -0
  480. package/templates/plugins/commit-commands/LICENSE +202 -0
  481. package/templates/plugins/commit-commands/README.md +225 -0
  482. package/templates/plugins/commit-commands/commands/clean_gone.md +53 -0
  483. package/templates/plugins/commit-commands/commands/commit-push-pr.md +20 -0
  484. package/templates/plugins/commit-commands/commands/commit.md +17 -0
  485. package/templates/trae-bmad/rules/bmad-agent-bmad-master.md +15 -15
  486. package/templates/trae-bmad/rules/bmad-agent-bmm-analyst.md +15 -15
  487. package/templates/trae-bmad/rules/bmad-agent-bmm-architect.md +15 -15
  488. package/templates/trae-bmad/rules/bmad-agent-bmm-dev.md +15 -15
  489. package/templates/trae-bmad/rules/bmad-agent-bmm-pm.md +15 -15
  490. package/templates/trae-bmad/rules/bmad-agent-bmm-qa.md +15 -15
  491. package/templates/trae-bmad/rules/bmad-agent-bmm-quick-flow-solo-dev.md +15 -15
  492. package/templates/trae-bmad/rules/bmad-agent-bmm-sm.md +15 -15
  493. package/templates/trae-bmad/rules/bmad-agent-bmm-tech-writer.md +15 -15
  494. package/templates/trae-bmad/rules/bmad-agent-bmm-ux-designer.md +15 -15
  495. package/templates/trae-bmad/rules/bmad-agent-tea-tea.md +15 -15
  496. package/templates/trae-bmad/rules/bmad-bmm-check-implementation-readiness.md +6 -6
  497. package/templates/trae-bmad/rules/bmad-bmm-code-review.md +14 -14
  498. package/templates/trae-bmad/rules/bmad-bmm-correct-course.md +14 -14
  499. package/templates/trae-bmad/rules/bmad-bmm-create-architecture.md +6 -6
  500. package/templates/trae-bmad/rules/bmad-bmm-create-epics-and-stories.md +6 -6
  501. package/templates/trae-bmad/rules/bmad-bmm-create-prd.md +6 -6
  502. package/templates/trae-bmad/rules/bmad-bmm-create-product-brief.md +6 -6
  503. package/templates/trae-bmad/rules/bmad-bmm-create-story.md +14 -14
  504. package/templates/trae-bmad/rules/bmad-bmm-create-ux-design.md +6 -6
  505. package/templates/trae-bmad/rules/bmad-bmm-dev-story.md +14 -14
  506. package/templates/trae-bmad/rules/bmad-bmm-document-project.md +14 -14
  507. package/templates/trae-bmad/rules/bmad-bmm-domain-research.md +6 -6
  508. package/templates/trae-bmad/rules/bmad-bmm-edit-prd.md +6 -6
  509. package/templates/trae-bmad/rules/bmad-bmm-generate-project-context.md +6 -6
  510. package/templates/trae-bmad/rules/bmad-bmm-market-research.md +6 -6
  511. package/templates/trae-bmad/rules/bmad-bmm-qa-automate.md +15 -15
  512. package/templates/trae-bmad/rules/bmad-bmm-qa-generate-e2e-tests.md +14 -14
  513. package/templates/trae-bmad/rules/bmad-bmm-quick-dev.md +6 -6
  514. package/templates/trae-bmad/rules/bmad-bmm-quick-spec.md +6 -6
  515. package/templates/trae-bmad/rules/bmad-bmm-retrospective.md +14 -14
  516. package/templates/trae-bmad/rules/bmad-bmm-sprint-planning.md +14 -14
  517. package/templates/trae-bmad/rules/bmad-bmm-sprint-status.md +14 -14
  518. package/templates/trae-bmad/rules/bmad-bmm-technical-research.md +6 -6
  519. package/templates/trae-bmad/rules/bmad-bmm-validate-prd.md +6 -6
  520. package/templates/trae-bmad/rules/bmad-brainstorming.md +6 -6
  521. package/templates/trae-bmad/rules/bmad-editorial-review-prose.md +10 -10
  522. package/templates/trae-bmad/rules/bmad-editorial-review-structure.md +10 -10
  523. package/templates/trae-bmad/rules/bmad-help.md +10 -10
  524. package/templates/trae-bmad/rules/bmad-index-docs.md +10 -10
  525. package/templates/trae-bmad/rules/bmad-party-mode.md +6 -6
  526. package/templates/trae-bmad/rules/bmad-review-adversarial-general.md +10 -10
  527. package/templates/trae-bmad/rules/bmad-review-edge-case-hunter.md +10 -0
  528. package/templates/trae-bmad/rules/bmad-shard-doc.md +10 -10
  529. package/templates/trae-bmad/rules/bmad-tea-teach-me-testing.md +6 -6
  530. package/templates/trae-bmad/rules/bmad-tea-testarch-atdd.md +14 -14
  531. package/templates/trae-bmad/rules/bmad-tea-testarch-automate.md +14 -14
  532. package/templates/trae-bmad/rules/bmad-tea-testarch-ci.md +14 -14
  533. package/templates/trae-bmad/rules/bmad-tea-testarch-framework.md +14 -14
  534. package/templates/trae-bmad/rules/bmad-tea-testarch-nfr.md +14 -14
  535. package/templates/trae-bmad/rules/bmad-tea-testarch-test-design.md +14 -14
  536. package/templates/trae-bmad/rules/bmad-tea-testarch-test-review.md +14 -14
  537. package/templates/trae-bmad/rules/bmad-tea-testarch-trace.md +14 -14
@@ -1,425 +1,430 @@
1
- import path from 'node:path'
2
- import { fileURLToPath } from 'node:url'
3
- import fse from 'fs-extra'
4
- import YAML from 'yaml'
5
- import { createLogger } from '../utils/logger.js'
6
- import { computeFileHash, interpolate, listFiles, TEXT_EXTENSIONS } from '../utils/fs.js'
7
- import { loadRegistry, resolveModules, getDefaultModules } from '../core/registry.js'
8
- import { ADAPTERS } from '../adapters/trae-adapter.js'
9
-
10
- const __dirname = path.dirname(fileURLToPath(import.meta.url))
11
- const CCKIT_ROOT = path.resolve(__dirname, '../..')
12
-
13
- /**
14
- * Extract the fileRegistry from a manifest, handling both formats:
15
- * - cckit.fileRegistry (produced by init command)
16
- * - top-level fileRegistry (legacy/manual)
17
- *
18
- * @param {object} manifest - Parsed manifest object
19
- * @returns {object} File registry map { relativePath: hash }
20
- */
21
- function extractFileRegistry(manifest) {
22
- if (manifest.cckit && manifest.cckit.fileRegistry) {
23
- return manifest.cckit.fileRegistry
24
- }
25
- if (manifest.fileRegistry) {
26
- return manifest.fileRegistry
27
- }
28
- return {}
29
- }
30
-
31
- /**
32
- * Build a sourceMap from registry modules and config.
33
- *
34
- * Maps each target directory to its source template info:
35
- * { templateDir, adapter, prefix, moduleId }
36
- *
37
- * @param {object} registry - Loaded registry
38
- * @param {object} config - Config from manifest (ides, languages, etc.)
39
- * @returns {object} sourceMap keyed by targetDir
40
- */
41
- function buildSourceMap(registry, config) {
42
- const selectedIds = getDefaultModules(registry)
43
- const resolved = resolveModules(registry, selectedIds)
44
- const sourceMap = {}
45
- const ides = config.ides || ['claude-code']
46
-
47
- for (const mod of resolved) {
48
- if (mod.targets) {
49
- for (const ide of ides) {
50
- const target = mod.targets[ide]
51
- if (!target) continue
52
-
53
- const templateDir = path.resolve(
54
- CCKIT_ROOT,
55
- target.templateDir || mod.templateDir
56
- )
57
- sourceMap[target.targetDir] = {
58
- templateDir,
59
- adapter: target.adapter ? ADAPTERS[target.adapter] : undefined,
60
- prefix: target.prefix || undefined,
61
- moduleId: mod.id
62
- }
63
- }
64
- } else if (mod.ideTarget) {
65
- if (ides.includes(mod.ideTarget)) {
66
- sourceMap[mod.targetDir] = {
67
- templateDir: path.resolve(CCKIT_ROOT, mod.templateDir),
68
- adapter: undefined,
69
- prefix: undefined,
70
- moduleId: mod.id
71
- }
72
- }
73
- } else {
74
- sourceMap[mod.targetDir] = {
75
- templateDir: path.resolve(CCKIT_ROOT, mod.templateDir),
76
- adapter: undefined,
77
- prefix: undefined,
78
- moduleId: mod.id
79
- }
80
- }
81
- }
82
-
83
- return sourceMap
84
- }
85
-
86
- /**
87
- * Find the source template file for an installed file.
88
- *
89
- * @param {string} relPath - Relative path of the installed file (e.g. '.claude/rules/common/coding-style.md')
90
- * @param {object} sourceMap - Map from targetDir to source info
91
- * @returns {object|null} { srcAbsPath, adapter } or null if not found
92
- */
93
- function findSourceForFile(relPath, sourceMap) {
94
- // Normalize to forward slashes for matching
95
- const normalizedRel = relPath.replace(/\\/g, '/')
96
-
97
- // Collect all matching entries, pick the one with the longest prefix (most specific)
98
- let bestMatch = null
99
- let bestPrefixLen = -1
100
-
101
- for (const [targetDir, source] of Object.entries(sourceMap)) {
102
- const normalizedTarget = targetDir.replace(/\\/g, '/')
103
- // Check if file is under this target directory
104
- // Handle both "dir/file" and "dir" == "." (root-level targets)
105
- const prefix = normalizedTarget === '.'
106
- ? ''
107
- : normalizedTarget + '/'
108
-
109
- if (prefix === '' ? true : normalizedRel.startsWith(prefix)) {
110
- if (prefix.length > bestPrefixLen) {
111
- const remainder = prefix === ''
112
- ? normalizedRel
113
- : normalizedRel.slice(prefix.length)
114
-
115
- // If a prefix was applied to the filename during install, strip it to find source
116
- let srcRelPath = remainder
117
- if (source.prefix) {
118
- const fileName = path.basename(remainder)
119
- if (fileName.startsWith(source.prefix)) {
120
- const originalName = fileName.slice(source.prefix.length)
121
- const dir = path.dirname(remainder)
122
- srcRelPath = dir === '.' ? originalName : path.join(dir, originalName)
123
- }
124
- }
125
-
126
- const srcAbsPath = path.join(source.templateDir, srcRelPath)
127
- bestPrefixLen = prefix.length
128
- bestMatch = {
129
- srcAbsPath,
130
- adapter: source.adapter
131
- }
132
- }
133
- }
134
- }
135
- return bestMatch
136
- }
137
-
138
- /**
139
- * Reinstall a single file from its template source.
140
- *
141
- * @param {string} targetDir - Project root directory
142
- * @param {string} relPath - Relative path of the file
143
- * @param {object} source - { srcAbsPath, adapter }
144
- * @param {object} variables - Template interpolation variables
145
- * @returns {Promise<boolean>} true if successfully reinstalled
146
- */
147
- async function reinstallFile(targetDir, relPath, source, variables) {
148
- const destPath = path.join(targetDir, relPath)
149
- const ext = path.extname(relPath).toLowerCase()
150
-
151
- if (!await fse.pathExists(source.srcAbsPath)) {
152
- return false
153
- }
154
-
155
- await fse.ensureDir(path.dirname(destPath))
156
-
157
- if (TEXT_EXTENSIONS.has(ext)) {
158
- let content = await fse.readFile(source.srcAbsPath, 'utf8')
159
- content = interpolate(content, variables)
160
- if (source.adapter) {
161
- content = source.adapter(content, path.basename(relPath))
162
- }
163
- await fse.writeFile(destPath, content, 'utf8')
164
- } else {
165
- await fse.copy(source.srcAbsPath, destPath)
166
- }
167
-
168
- return true
169
- }
170
-
171
- /**
172
- * Discover new files from templates that are not yet tracked in fileRegistry.
173
- * This handles newly added modules/skills in cckit updates.
174
- *
175
- * @param {object} sourceMap - Map from targetDir to source info
176
- * @param {object} fileRegistry - Current file registry from manifest
177
- * @returns {Promise<Array<{ relPath: string, source: { srcAbsPath: string, adapter?: Function } }>>}
178
- */
179
- async function discoverNewFiles(sourceMap, fileRegistry) {
180
- const newFiles = []
181
-
182
- for (const [targetDir, source] of Object.entries(sourceMap)) {
183
- if (!await fse.pathExists(source.templateDir)) continue
184
-
185
- const templateFiles = await listFiles(source.templateDir)
186
-
187
- for (const relPath of templateFiles) {
188
- const fileName = path.basename(relPath)
189
- const dir = path.dirname(relPath)
190
-
191
- // Apply prefix if configured (e.g. ecc-agent- prefix)
192
- const installedName = source.prefix
193
- ? `${source.prefix}${fileName}`
194
- : fileName
195
-
196
- // Build the installed relative path
197
- const installedRelPath = targetDir === '.'
198
- ? (dir === '.' ? installedName : `${dir}/${installedName}`)
199
- : (dir === '.' ? `${targetDir}/${installedName}` : `${targetDir}/${dir}/${installedName}`)
200
-
201
- const normalizedPath = installedRelPath.replace(/\\/g, '/')
202
-
203
- if (!(normalizedPath in fileRegistry)) {
204
- newFiles.push({
205
- relPath: normalizedPath,
206
- source: {
207
- srcAbsPath: path.join(source.templateDir, relPath),
208
- adapter: source.adapter,
209
- },
210
- })
211
- }
212
- }
213
- }
214
-
215
- return newFiles
216
- }
217
-
218
- /**
219
- * Run the update command.
220
- *
221
- * Reads the installed manifest, compares current file hashes against
222
- * the recorded fileRegistry, and reports which files are unchanged,
223
- * modified by the user, or missing.
224
- *
225
- * When --apply is set, reinstalls files from cckit templates.
226
- *
227
- * @param {object} opts - Command options
228
- * @param {string} [opts.dir] - Target directory (default: cwd)
229
- * @param {boolean} [opts.dryRun] - Preview changes without applying
230
- * @param {boolean} [opts.apply] - Reinstall files from templates
231
- * @param {boolean} [opts.force] - Force overwrite modified files without backup
232
- * @param {boolean} [opts.debug] - Enable debug output
233
- * @returns {Promise<object>} Result with { checked, modified, unchanged, missing, applied? }
234
- * @throws {Error} If cckit is not installed
235
- */
236
- export async function runUpdate(opts = {}) {
237
- const logger = createLogger({ debug: opts.debug })
238
- const targetDir = path.resolve(opts.dir || process.cwd())
239
- const manifestPath = path.join(targetDir, '_bmad', '_config', 'manifest.yaml')
240
-
241
- if (!await fse.pathExists(manifestPath)) {
242
- throw new Error('cckit is not installed. Run `cckit init` first.')
243
- }
244
-
245
- const manifestContent = await fse.readFile(manifestPath, 'utf8')
246
- const manifest = YAML.parse(manifestContent)
247
-
248
- logger.banner('cckit update')
249
-
250
- const fileRegistry = extractFileRegistry(manifest)
251
- const modified = []
252
- const unchanged = []
253
- const missing = []
254
-
255
- for (const [relPath, expectedHash] of Object.entries(fileRegistry)) {
256
- const fullPath = path.join(targetDir, relPath)
257
-
258
- if (!await fse.pathExists(fullPath)) {
259
- missing.push(relPath)
260
- continue
261
- }
262
-
263
- const currentHash = await computeFileHash(fullPath)
264
- if (currentHash !== expectedHash) {
265
- modified.push(relPath)
266
- } else {
267
- unchanged.push(relPath)
268
- }
269
- }
270
-
271
- // Report results
272
- const totalFiles = Object.keys(fileRegistry).length
273
- if (totalFiles > 0) {
274
- logger.info(` Checked ${totalFiles} registered file(s)`)
275
- }
276
-
277
- if (unchanged.length > 0) {
278
- logger.success(`${unchanged.length} file(s) unchanged`)
279
- }
280
-
281
- if (modified.length > 0) {
282
- logger.warn(`${modified.length} file(s) modified by user:`)
283
- for (const f of modified) {
284
- logger.info(` ${f}`)
285
- }
286
- }
287
-
288
- if (missing.length > 0) {
289
- logger.warn(`${missing.length} file(s) missing:`)
290
- for (const f of missing) {
291
- logger.info(` ${f}`)
292
- }
293
- }
294
-
295
- if (totalFiles === 0) {
296
- logger.info(' No files registered in manifest.')
297
- } else if (modified.length === 0 && missing.length === 0) {
298
- logger.success('All files match. Nothing to update.')
299
- }
300
-
301
- if (opts.dryRun) {
302
- logger.info('\n (dry run - no changes made)')
303
- return { checked: true, modified, unchanged, missing }
304
- }
305
-
306
- // Apply mode: reinstall files from templates
307
- if (opts.apply) {
308
- const applied = { updated: 0, backedUp: 0, restored: 0, added: 0, failed: 0 }
309
-
310
- let registry
311
- let sourceMap
312
- let variables
313
-
314
- try {
315
- registry = await loadRegistry()
316
- const config = manifest.cckit && manifest.cckit.config
317
- ? manifest.cckit.config
318
- : {}
319
-
320
- sourceMap = buildSourceMap(registry, config)
321
- variables = {
322
- user_name: config.user_name || '',
323
- communication_language: config.communication_language || '',
324
- document_output_language: config.document_output_language || '',
325
- languages: Array.isArray(config.languages)
326
- ? config.languages.join(', ')
327
- : (config.languages || ''),
328
- 'project-root': '.'
329
- }
330
- } catch (err) {
331
- logger.debug(`Failed to load registry for apply: ${err.message}`)
332
- // Return result with empty applied if registry cannot be loaded
333
- if (manifest.cckit) {
334
- manifest.cckit.lastUpdated = new Date().toISOString()
335
- }
336
- await fse.writeFile(manifestPath, YAML.stringify(manifest), 'utf8')
337
- logger.success('Update complete.')
338
- return { checked: true, modified, unchanged, missing, applied }
339
- }
340
-
341
- // Process all files: unchanged + modified + missing
342
- const allFiles = [...unchanged, ...modified, ...missing]
343
-
344
- for (const relPath of allFiles) {
345
- const source = findSourceForFile(relPath, sourceMap)
346
- if (!source) {
347
- logger.debug(`No source template found for: ${relPath}`)
348
- applied.failed += 1
349
- continue
350
- }
351
-
352
- const fullPath = path.join(targetDir, relPath)
353
- const isModified = modified.includes(relPath)
354
-
355
- // Backup modified files unless --force
356
- if (isModified && !opts.force) {
357
- const bakPath = `${fullPath}.bak.${Date.now()}`
358
- try {
359
- await fse.copy(fullPath, bakPath)
360
- applied.backedUp += 1
361
- logger.debug(`Backed up: ${relPath} -> ${path.basename(bakPath)}`)
362
- } catch (err) {
363
- logger.debug(`Failed to backup ${relPath}: ${err.message}`)
364
- }
365
- }
366
-
367
- // Reinstall file
368
- const success = await reinstallFile(targetDir, relPath, source, variables)
369
- if (success) {
370
- applied.updated += 1
371
- // Recompute hash for updated file
372
- const newHash = await computeFileHash(fullPath)
373
- fileRegistry[relPath] = newHash
374
-
375
- if (missing.includes(relPath)) {
376
- applied.restored += 1
377
- }
378
- } else {
379
- applied.failed += 1
380
- logger.debug(`Source not found for: ${relPath}`)
381
- }
382
- }
383
-
384
- // Discover and install new files from templates not yet in fileRegistry
385
- const newFiles = await discoverNewFiles(sourceMap, fileRegistry)
386
- if (newFiles.length > 0) {
387
- logger.info(` Discovered ${newFiles.length} new file(s) from updated templates`)
388
- for (const { relPath, source } of newFiles) {
389
- const success = await reinstallFile(targetDir, relPath, source, variables)
390
- if (success) {
391
- applied.added += 1
392
- const fullPath = path.join(targetDir, relPath)
393
- const newHash = await computeFileHash(fullPath)
394
- fileRegistry[relPath] = newHash
395
- } else {
396
- applied.failed += 1
397
- logger.debug(`Failed to install new file: ${relPath}`)
398
- }
399
- }
400
- }
401
-
402
- // Update manifest with new fileRegistry
403
- if (manifest.cckit) {
404
- manifest.cckit.fileRegistry = fileRegistry
405
- manifest.cckit.lastUpdated = new Date().toISOString()
406
- }
407
- await fse.writeFile(manifestPath, YAML.stringify(manifest), 'utf8')
408
-
409
- logger.newline()
410
- logger.success(
411
- `Applied: ${applied.updated} updated, ${applied.added} added, ${applied.restored} restored, ${applied.backedUp} backed up, ${applied.failed} failed`
412
- )
413
-
414
- return { checked: true, modified, unchanged, missing, applied }
415
- }
416
-
417
- // Non-dry-run, non-apply: update the lastUpdated timestamp only
418
- if (manifest.cckit) {
419
- manifest.cckit.lastUpdated = new Date().toISOString()
420
- }
421
- await fse.writeFile(manifestPath, YAML.stringify(manifest), 'utf8')
422
-
423
- logger.success('Update complete.')
424
- return { checked: true, modified, unchanged, missing }
425
- }
1
+ import path from 'node:path'
2
+ import { fileURLToPath } from 'node:url'
3
+ import fse from 'fs-extra'
4
+ import YAML from 'yaml'
5
+ import { createLogger } from '../utils/logger.js'
6
+ import { computeFileHash, interpolate, listFiles, TEXT_EXTENSIONS } from '../utils/fs.js'
7
+ import { loadRegistry, resolveModules, getDefaultModules } from '../core/registry.js'
8
+ import { ADAPTERS } from '../adapters/trae-adapter.js'
9
+
10
+ const __dirname = path.dirname(fileURLToPath(import.meta.url))
11
+ const CCKIT_ROOT = path.resolve(__dirname, '../..')
12
+
13
+ /**
14
+ * Extract the fileRegistry from a manifest, handling both formats:
15
+ * - cckit.fileRegistry (produced by init command)
16
+ * - top-level fileRegistry (legacy/manual)
17
+ *
18
+ * @param {object} manifest - Parsed manifest object
19
+ * @returns {object} File registry map { relativePath: hash }
20
+ */
21
+ function extractFileRegistry(manifest) {
22
+ if (manifest.cckit && manifest.cckit.fileRegistry) {
23
+ return manifest.cckit.fileRegistry
24
+ }
25
+ if (manifest.fileRegistry) {
26
+ return manifest.fileRegistry
27
+ }
28
+ return {}
29
+ }
30
+
31
+ /**
32
+ * Build a sourceMap from registry modules and config.
33
+ *
34
+ * Maps each target directory to its source template info:
35
+ * { templateDir, adapter, prefix, moduleId }
36
+ *
37
+ * @param {object} registry - Loaded registry
38
+ * @param {object} config - Config from manifest (ides, languages, etc.)
39
+ * @returns {object} sourceMap keyed by targetDir
40
+ */
41
+ function buildSourceMap(registry, config) {
42
+ const selectedIds = getDefaultModules(registry)
43
+ const resolved = resolveModules(registry, selectedIds)
44
+ const sourceMap = {}
45
+ const ides = config.ides || ['claude-code']
46
+
47
+ for (const mod of resolved) {
48
+ if (mod.targets) {
49
+ for (const ide of ides) {
50
+ const target = mod.targets[ide]
51
+ if (!target) continue
52
+
53
+ const templateDir = path.resolve(
54
+ CCKIT_ROOT,
55
+ target.templateDir || mod.templateDir
56
+ )
57
+ sourceMap[target.targetDir] = {
58
+ templateDir,
59
+ adapter: target.adapter ? ADAPTERS[target.adapter] : undefined,
60
+ prefix: target.prefix || undefined,
61
+ moduleId: mod.id
62
+ }
63
+ }
64
+ } else if (mod.ideTarget) {
65
+ if (ides.includes(mod.ideTarget)) {
66
+ sourceMap[mod.targetDir] = {
67
+ templateDir: path.resolve(CCKIT_ROOT, mod.templateDir),
68
+ adapter: undefined,
69
+ prefix: undefined,
70
+ moduleId: mod.id
71
+ }
72
+ }
73
+ } else {
74
+ sourceMap[mod.targetDir] = {
75
+ templateDir: path.resolve(CCKIT_ROOT, mod.templateDir),
76
+ adapter: undefined,
77
+ prefix: undefined,
78
+ moduleId: mod.id
79
+ }
80
+ }
81
+ }
82
+
83
+ return sourceMap
84
+ }
85
+
86
+ /**
87
+ * Find the source template file for an installed file.
88
+ *
89
+ * @param {string} relPath - Relative path of the installed file (e.g. '.claude/rules/common/coding-style.md')
90
+ * @param {object} sourceMap - Map from targetDir to source info
91
+ * @returns {object|null} { srcAbsPath, adapter } or null if not found
92
+ */
93
+ function findSourceForFile(relPath, sourceMap) {
94
+ // Normalize to forward slashes for matching
95
+ const normalizedRel = relPath.replace(/\\/g, '/')
96
+
97
+ // Collect all matching entries, pick the one with the longest prefix (most specific)
98
+ let bestMatch = null
99
+ let bestPrefixLen = -1
100
+
101
+ for (const [targetDir, source] of Object.entries(sourceMap)) {
102
+ const normalizedTarget = targetDir.replace(/\\/g, '/')
103
+ // Check if file is under this target directory
104
+ // Handle both "dir/file" and "dir" == "." (root-level targets)
105
+ const prefix = normalizedTarget === '.'
106
+ ? ''
107
+ : normalizedTarget + '/'
108
+
109
+ if (prefix === '' ? true : normalizedRel.startsWith(prefix)) {
110
+ if (prefix.length > bestPrefixLen) {
111
+ const remainder = prefix === ''
112
+ ? normalizedRel
113
+ : normalizedRel.slice(prefix.length)
114
+
115
+ // If a prefix was applied to the filename during install, strip it to find source
116
+ let srcRelPath = remainder
117
+ if (source.prefix) {
118
+ const fileName = path.basename(remainder)
119
+ if (fileName.startsWith(source.prefix)) {
120
+ const originalName = fileName.slice(source.prefix.length)
121
+ const dir = path.dirname(remainder)
122
+ srcRelPath = dir === '.' ? originalName : path.join(dir, originalName)
123
+ }
124
+ }
125
+
126
+ const srcAbsPath = path.join(source.templateDir, srcRelPath)
127
+ bestPrefixLen = prefix.length
128
+ bestMatch = {
129
+ srcAbsPath,
130
+ adapter: source.adapter
131
+ }
132
+ }
133
+ }
134
+ }
135
+ return bestMatch
136
+ }
137
+
138
+ /**
139
+ * Reinstall a single file from its template source.
140
+ *
141
+ * @param {string} targetDir - Project root directory
142
+ * @param {string} relPath - Relative path of the file
143
+ * @param {object} source - { srcAbsPath, adapter }
144
+ * @param {object} variables - Template interpolation variables
145
+ * @returns {Promise<boolean>} true if successfully reinstalled
146
+ */
147
+ async function reinstallFile(targetDir, relPath, source, variables) {
148
+ const destPath = path.join(targetDir, relPath)
149
+ const ext = path.extname(relPath).toLowerCase()
150
+
151
+ if (!await fse.pathExists(source.srcAbsPath)) {
152
+ return false
153
+ }
154
+
155
+ await fse.ensureDir(path.dirname(destPath))
156
+
157
+ if (TEXT_EXTENSIONS.has(ext)) {
158
+ let content = await fse.readFile(source.srcAbsPath, 'utf8')
159
+ content = interpolate(content, variables)
160
+ if (source.adapter) {
161
+ content = source.adapter(content, path.basename(relPath))
162
+ }
163
+ await fse.writeFile(destPath, content, 'utf8')
164
+ } else {
165
+ await fse.copy(source.srcAbsPath, destPath)
166
+ }
167
+
168
+ return true
169
+ }
170
+
171
+ /**
172
+ * Discover new files from templates that are not yet tracked in fileRegistry.
173
+ * This handles newly added modules/skills in cckit updates.
174
+ *
175
+ * @param {object} sourceMap - Map from targetDir to source info
176
+ * @param {object} fileRegistry - Current file registry from manifest
177
+ * @returns {Promise<Array<{ relPath: string, source: { srcAbsPath: string, adapter?: Function } }>>}
178
+ */
179
+ async function discoverNewFiles(sourceMap, fileRegistry) {
180
+ const newFiles = []
181
+
182
+ for (const [targetDir, source] of Object.entries(sourceMap)) {
183
+ if (!await fse.pathExists(source.templateDir)) continue
184
+
185
+ const templateFiles = await listFiles(source.templateDir)
186
+
187
+ for (const relPath of templateFiles) {
188
+ const fileName = path.basename(relPath)
189
+ const dir = path.dirname(relPath)
190
+
191
+ // Apply prefix if configured (e.g. ecc-agent- prefix)
192
+ const installedName = source.prefix
193
+ ? `${source.prefix}${fileName}`
194
+ : fileName
195
+
196
+ // Build the installed relative path
197
+ const installedRelPath = targetDir === '.'
198
+ ? (dir === '.' ? installedName : `${dir}/${installedName}`)
199
+ : (dir === '.' ? `${targetDir}/${installedName}` : `${targetDir}/${dir}/${installedName}`)
200
+
201
+ const normalizedPath = installedRelPath.replace(/\\/g, '/')
202
+
203
+ if (!(normalizedPath in fileRegistry)) {
204
+ newFiles.push({
205
+ relPath: normalizedPath,
206
+ source: {
207
+ srcAbsPath: path.join(source.templateDir, relPath),
208
+ adapter: source.adapter,
209
+ },
210
+ })
211
+ }
212
+ }
213
+ }
214
+
215
+ return newFiles
216
+ }
217
+
218
+ /**
219
+ * Run the update command.
220
+ *
221
+ * Reads the installed manifest, compares current file hashes against
222
+ * the recorded fileRegistry, and reports which files are unchanged,
223
+ * modified by the user, or missing.
224
+ *
225
+ * When --apply is set, reinstalls files from cckit templates.
226
+ *
227
+ * @param {object} opts - Command options
228
+ * @param {string} [opts.dir] - Target directory (default: cwd)
229
+ * @param {boolean} [opts.dryRun] - Preview changes without applying
230
+ * @param {boolean} [opts.apply] - Reinstall files from templates
231
+ * @param {boolean} [opts.force] - Force overwrite modified files without backup
232
+ * @param {boolean} [opts.debug] - Enable debug output
233
+ * @returns {Promise<object>} Result with { checked, modified, unchanged, missing, applied? }
234
+ * @throws {Error} If cckit is not installed
235
+ */
236
+ export async function runUpdate(opts = {}) {
237
+ const logger = createLogger({ debug: opts.debug })
238
+ const targetDir = path.resolve(opts.dir || process.cwd())
239
+ const manifestPath = path.join(targetDir, '_bmad', '_config', 'manifest.yaml')
240
+
241
+ if (!await fse.pathExists(manifestPath)) {
242
+ throw new Error('cckit is not installed. Run `cckit init` first.')
243
+ }
244
+
245
+ const manifestContent = await fse.readFile(manifestPath, 'utf8')
246
+ const manifest = YAML.parse(manifestContent)
247
+
248
+ logger.banner('cckit update')
249
+
250
+ const fileRegistry = extractFileRegistry(manifest)
251
+ const modified = []
252
+ const unchanged = []
253
+ const missing = []
254
+
255
+ for (const [relPath, expectedHash] of Object.entries(fileRegistry)) {
256
+ const fullPath = path.join(targetDir, relPath)
257
+
258
+ if (!await fse.pathExists(fullPath)) {
259
+ missing.push(relPath)
260
+ continue
261
+ }
262
+
263
+ const currentHash = await computeFileHash(fullPath)
264
+ if (currentHash !== expectedHash) {
265
+ modified.push(relPath)
266
+ } else {
267
+ unchanged.push(relPath)
268
+ }
269
+ }
270
+
271
+ // Report results
272
+ const totalFiles = Object.keys(fileRegistry).length
273
+ if (totalFiles > 0) {
274
+ logger.info(` Checked ${totalFiles} registered file(s)`)
275
+ }
276
+
277
+ if (unchanged.length > 0) {
278
+ logger.success(`${unchanged.length} file(s) unchanged`)
279
+ }
280
+
281
+ if (modified.length > 0) {
282
+ logger.warn(`${modified.length} file(s) modified by user:`)
283
+ for (const f of modified) {
284
+ logger.info(` ${f}`)
285
+ }
286
+ }
287
+
288
+ if (missing.length > 0) {
289
+ logger.warn(`${missing.length} file(s) missing:`)
290
+ for (const f of missing) {
291
+ logger.info(` ${f}`)
292
+ }
293
+ }
294
+
295
+ if (totalFiles === 0) {
296
+ logger.info(' No files registered in manifest.')
297
+ } else if (modified.length === 0 && missing.length === 0) {
298
+ logger.success('All files match. Nothing to update.')
299
+ }
300
+
301
+ if (opts.dryRun) {
302
+ logger.info('\n (dry run - no changes made)')
303
+ return { checked: true, modified, unchanged, missing }
304
+ }
305
+
306
+ // Apply mode: reinstall files from templates
307
+ if (opts.apply) {
308
+ const applied = { updated: 0, backedUp: 0, restored: 0, added: 0, failed: 0, orphaned: 0 }
309
+
310
+ let registry
311
+ let sourceMap
312
+ let variables
313
+
314
+ try {
315
+ registry = await loadRegistry()
316
+ const config = manifest.cckit && manifest.cckit.config
317
+ ? manifest.cckit.config
318
+ : {}
319
+
320
+ sourceMap = buildSourceMap(registry, config)
321
+ variables = {
322
+ user_name: config.user_name || '',
323
+ communication_language: config.communication_language || '',
324
+ document_output_language: config.document_output_language || '',
325
+ languages: Array.isArray(config.languages)
326
+ ? config.languages.join(', ')
327
+ : (config.languages || ''),
328
+ 'project-root': '.'
329
+ }
330
+ } catch (err) {
331
+ logger.debug(`Failed to load registry for apply: ${err.message}`)
332
+ // Return result with empty applied if registry cannot be loaded
333
+ if (manifest.cckit) {
334
+ manifest.cckit.lastUpdated = new Date().toISOString()
335
+ }
336
+ await fse.writeFile(manifestPath, YAML.stringify(manifest), 'utf8')
337
+ logger.success('Update complete.')
338
+ return { checked: true, modified, unchanged, missing, applied }
339
+ }
340
+
341
+ // Process all files: unchanged + modified + missing
342
+ const allFiles = [...unchanged, ...modified, ...missing]
343
+
344
+ for (const relPath of allFiles) {
345
+ const source = findSourceForFile(relPath, sourceMap)
346
+ if (!source || !await fse.pathExists(source.srcAbsPath)) {
347
+ logger.debug(`No source template found for: ${relPath} (orphaned)`)
348
+ applied.orphaned += 1
349
+ // Remove orphaned file from registry so it's no longer tracked
350
+ delete fileRegistry[relPath]
351
+ continue
352
+ }
353
+
354
+ const fullPath = path.join(targetDir, relPath)
355
+ const isModified = modified.includes(relPath)
356
+
357
+ // Backup modified files unless --force
358
+ if (isModified && !opts.force) {
359
+ const bakPath = `${fullPath}.bak.${Date.now()}`
360
+ try {
361
+ await fse.copy(fullPath, bakPath)
362
+ applied.backedUp += 1
363
+ logger.debug(`Backed up: ${relPath} -> ${path.basename(bakPath)}`)
364
+ } catch (err) {
365
+ logger.debug(`Failed to backup ${relPath}: ${err.message}`)
366
+ }
367
+ }
368
+
369
+ // Reinstall file
370
+ const success = await reinstallFile(targetDir, relPath, source, variables)
371
+ if (success) {
372
+ applied.updated += 1
373
+ // Recompute hash for updated file
374
+ const newHash = await computeFileHash(fullPath)
375
+ fileRegistry[relPath] = newHash
376
+
377
+ if (missing.includes(relPath)) {
378
+ applied.restored += 1
379
+ }
380
+ } else {
381
+ applied.failed += 1
382
+ logger.debug(`Source not found for: ${relPath}`)
383
+ }
384
+ }
385
+
386
+ // Discover and install new files from templates not yet in fileRegistry
387
+ const newFiles = await discoverNewFiles(sourceMap, fileRegistry)
388
+ if (newFiles.length > 0) {
389
+ logger.info(` Discovered ${newFiles.length} new file(s) from updated templates`)
390
+ for (const { relPath, source } of newFiles) {
391
+ const success = await reinstallFile(targetDir, relPath, source, variables)
392
+ if (success) {
393
+ applied.added += 1
394
+ const fullPath = path.join(targetDir, relPath)
395
+ const newHash = await computeFileHash(fullPath)
396
+ fileRegistry[relPath] = newHash
397
+ } else {
398
+ applied.failed += 1
399
+ logger.debug(`Failed to install new file: ${relPath}`)
400
+ }
401
+ }
402
+ }
403
+
404
+ // Update manifest with new fileRegistry
405
+ if (manifest.cckit) {
406
+ manifest.cckit.fileRegistry = fileRegistry
407
+ manifest.cckit.lastUpdated = new Date().toISOString()
408
+ }
409
+ await fse.writeFile(manifestPath, YAML.stringify(manifest), 'utf8')
410
+
411
+ logger.newline()
412
+ if (applied.orphaned > 0) {
413
+ logger.warn(`${applied.orphaned} file(s) orphaned (module removed, no longer tracked)`)
414
+ }
415
+ logger.success(
416
+ `Applied: ${applied.updated} updated, ${applied.added} added, ${applied.restored} restored, ${applied.backedUp} backed up, ${applied.failed} failed`
417
+ )
418
+
419
+ return { checked: true, modified, unchanged, missing, applied }
420
+ }
421
+
422
+ // Non-dry-run, non-apply: update the lastUpdated timestamp only
423
+ if (manifest.cckit) {
424
+ manifest.cckit.lastUpdated = new Date().toISOString()
425
+ }
426
+ await fse.writeFile(manifestPath, YAML.stringify(manifest), 'utf8')
427
+
428
+ logger.success('Update complete.')
429
+ return { checked: true, modified, unchanged, missing }
430
+ }