@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.
- package/LICENSE +21 -21
- package/README.md +76 -84
- package/bin/cckit.js +3 -3
- package/package.json +7 -5
- package/registry.json +234 -234
- package/src/adapters/trae-adapter.js +90 -90
- package/src/cli.js +2 -2
- package/src/commands/init.js +337 -337
- package/src/commands/status.js +62 -62
- package/src/commands/sync.js +325 -325
- package/src/commands/update.js +430 -430
- package/src/core/config.js +82 -82
- package/src/core/differ.js +57 -57
- package/src/core/installer.js +97 -97
- package/src/core/plugin-installer.js +278 -278
- package/src/core/registry.js +75 -75
- package/src/core/templatize.js +42 -42
- package/src/core/upstream.js +357 -357
- package/src/utils/fs.js +55 -55
- package/src/utils/logger.js +16 -16
- package/templates/bmad/_config/agent-manifest.csv +12 -12
- package/templates/bmad/_config/agents/bmm-analyst.customize.yaml +41 -41
- package/templates/bmad/_config/agents/bmm-architect.customize.yaml +41 -41
- package/templates/bmad/_config/agents/bmm-dev.customize.yaml +41 -41
- package/templates/bmad/_config/agents/bmm-pm.customize.yaml +41 -41
- package/templates/bmad/_config/agents/bmm-qa.customize.yaml +41 -41
- package/templates/bmad/_config/agents/bmm-quick-flow-solo-dev.customize.yaml +41 -41
- package/templates/bmad/_config/agents/bmm-sm.customize.yaml +41 -41
- package/templates/bmad/_config/agents/bmm-tech-writer.customize.yaml +41 -41
- package/templates/bmad/_config/agents/bmm-ux-designer.customize.yaml +41 -41
- package/templates/bmad/_config/agents/core-bmad-master.customize.yaml +41 -41
- package/templates/bmad/_config/agents/tea-tea.customize.yaml +41 -41
- package/templates/bmad/_config/bmad-help.csv +48 -48
- package/templates/bmad/_config/files-manifest.csv +437 -437
- package/templates/bmad/_config/ides/claude-code.yaml +5 -5
- package/templates/bmad/_config/ides/opencode.yaml +5 -5
- package/templates/bmad/_config/ides/trae.yaml +5 -5
- package/templates/bmad/_config/task-manifest.csv +8 -8
- package/templates/bmad/_config/tool-manifest.csv +1 -1
- package/templates/bmad/_config/workflow-manifest.csv +35 -35
- package/templates/bmad/bmm/agents/analyst.md +78 -78
- package/templates/bmad/bmm/agents/architect.md +58 -58
- package/templates/bmad/bmm/agents/dev.md +69 -69
- package/templates/bmad/bmm/agents/pm.md +72 -72
- package/templates/bmad/bmm/agents/qa.md +92 -92
- package/templates/bmad/bmm/agents/quick-flow-solo-dev.md +69 -69
- package/templates/bmad/bmm/agents/sm.md +70 -70
- package/templates/bmad/bmm/agents/tech-writer/tech-writer.md +70 -70
- package/templates/bmad/bmm/agents/ux-designer.md +57 -57
- package/templates/bmad/bmm/config.yaml +15 -15
- package/templates/bmad/bmm/data/project-context-template.md +26 -26
- package/templates/bmad/bmm/module-help.csv +31 -31
- package/templates/bmad/bmm/teams/default-party.csv +20 -20
- package/templates/bmad/bmm/teams/team-fullstack.yaml +12 -12
- package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -10
- package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -177
- package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -161
- package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -199
- package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -202
- package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -205
- package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -219
- package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +162 -162
- package/templates/bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md +57 -57
- package/templates/bmad/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -137
- package/templates/bmad/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -229
- package/templates/bmad/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -238
- package/templates/bmad/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -206
- package/templates/bmad/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -234
- package/templates/bmad/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +444 -444
- package/templates/bmad/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -182
- package/templates/bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -237
- package/templates/bmad/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -249
- package/templates/bmad/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -259
- package/templates/bmad/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -177
- package/templates/bmad/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +476 -476
- package/templates/bmad/bmm/workflows/1-analysis/research/research.template.md +29 -29
- package/templates/bmad/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -137
- package/templates/bmad/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -239
- package/templates/bmad/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -248
- package/templates/bmad/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -202
- package/templates/bmad/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +233 -233
- package/templates/bmad/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +487 -487
- package/templates/bmad/bmm/workflows/1-analysis/research/workflow-domain-research.md +54 -54
- package/templates/bmad/bmm/workflows/1-analysis/research/workflow-market-research.md +54 -54
- package/templates/bmad/bmm/workflows/1-analysis/research/workflow-technical-research.md +54 -54
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +14 -14
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -197
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/data/project-types.csv +10 -10
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01-init.md +191 -191
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01b-continue.md +152 -152
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +224 -224
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02b-vision.md +154 -154
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02c-executive-summary.md +170 -170
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +226 -226
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +213 -213
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +207 -207
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +226 -226
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +237 -237
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +228 -228
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +231 -231
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +242 -242
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +217 -217
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-12-complete.md +124 -124
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +247 -247
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01b-legacy-conversion.md +208 -208
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-02-review.md +249 -249
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-03-edit.md +253 -253
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md +168 -168
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +226 -226
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +191 -191
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +209 -209
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +174 -174
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +214 -214
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +228 -228
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +217 -217
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -205
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +243 -243
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +263 -263
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +209 -209
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +264 -264
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +242 -242
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +231 -231
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/templates/prd-template.md +10 -10
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md +63 -63
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-edit-prd.md +65 -65
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +63 -63
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -135
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -127
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -190
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -216
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -219
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -234
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -252
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -254
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -224
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -224
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -241
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -248
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -237
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -264
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +171 -171
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -13
- package/templates/bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +42 -42
- package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +184 -184
- package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +172 -172
- package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +173 -173
- package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +133 -133
- package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +245 -245
- package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +129 -129
- package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -4
- package/templates/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +54 -54
- package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -12
- package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +12 -12
- package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +6 -6
- package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -153
- package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +173 -173
- package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -224
- package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +329 -329
- package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -318
- package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -359
- package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -379
- package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -359
- package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +76 -76
- package/templates/bmad/bmm/workflows/3-solutioning/create-architecture/workflow.md +49 -49
- package/templates/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -259
- package/templates/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -233
- package/templates/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -272
- package/templates/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +149 -149
- package/templates/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -57
- package/templates/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +58 -58
- package/templates/bmad/bmm/workflows/4-implementation/code-review/checklist.md +23 -23
- package/templates/bmad/bmm/workflows/4-implementation/code-review/instructions.xml +226 -226
- package/templates/bmad/bmm/workflows/4-implementation/code-review/workflow.yaml +43 -43
- package/templates/bmad/bmm/workflows/4-implementation/correct-course/checklist.md +288 -288
- package/templates/bmad/bmm/workflows/4-implementation/correct-course/instructions.md +207 -207
- package/templates/bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml +53 -53
- package/templates/bmad/bmm/workflows/4-implementation/create-story/checklist.md +358 -358
- package/templates/bmad/bmm/workflows/4-implementation/create-story/instructions.xml +346 -346
- package/templates/bmad/bmm/workflows/4-implementation/create-story/template.md +49 -49
- package/templates/bmad/bmm/workflows/4-implementation/create-story/workflow.yaml +52 -52
- package/templates/bmad/bmm/workflows/4-implementation/dev-story/checklist.md +80 -80
- package/templates/bmad/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -410
- package/templates/bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml +20 -20
- package/templates/bmad/bmm/workflows/4-implementation/retrospective/instructions.md +1444 -1444
- package/templates/bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml +52 -52
- package/templates/bmad/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -33
- package/templates/bmad/bmm/workflows/4-implementation/sprint-planning/instructions.md +226 -226
- package/templates/bmad/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -55
- package/templates/bmad/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +47 -47
- package/templates/bmad/bmm/workflows/4-implementation/sprint-status/instructions.md +230 -230
- package/templates/bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml +25 -25
- package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +174 -174
- package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +118 -118
- package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +111 -111
- package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +111 -111
- package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +104 -104
- package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +146 -146
- package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -50
- package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +189 -189
- package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +143 -143
- package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +126 -126
- package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +200 -200
- package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -74
- package/templates/bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -79
- package/templates/bmad/bmm/workflows/document-project/checklist.md +245 -245
- package/templates/bmad/bmm/workflows/document-project/documentation-requirements.csv +12 -12
- package/templates/bmad/bmm/workflows/document-project/instructions.md +130 -130
- package/templates/bmad/bmm/workflows/document-project/templates/deep-dive-template.md +345 -345
- package/templates/bmad/bmm/workflows/document-project/templates/index-template.md +169 -169
- package/templates/bmad/bmm/workflows/document-project/templates/project-overview-template.md +103 -103
- package/templates/bmad/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -160
- package/templates/bmad/bmm/workflows/document-project/templates/source-tree-template.md +135 -135
- package/templates/bmad/bmm/workflows/document-project/workflow.yaml +22 -22
- package/templates/bmad/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -298
- package/templates/bmad/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -31
- package/templates/bmad/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -1106
- package/templates/bmad/bmm/workflows/document-project/workflows/full-scan.yaml +31 -31
- package/templates/bmad/bmm/workflows/generate-project-context/project-context-template.md +21 -21
- package/templates/bmad/bmm/workflows/generate-project-context/steps/step-01-discover.md +184 -184
- package/templates/bmad/bmm/workflows/generate-project-context/steps/step-02-generate.md +318 -318
- package/templates/bmad/bmm/workflows/generate-project-context/steps/step-03-complete.md +278 -278
- package/templates/bmad/bmm/workflows/generate-project-context/workflow.md +49 -49
- package/templates/bmad/bmm/workflows/qa/automate/checklist.md +33 -33
- package/templates/bmad/bmm/workflows/qa/automate/instructions.md +110 -110
- package/templates/bmad/bmm/workflows/qa/automate/workflow.yaml +44 -44
- package/templates/bmad/bmm/workflows/qa-generate-e2e-tests/checklist.md +33 -33
- package/templates/bmad/bmm/workflows/qa-generate-e2e-tests/instructions.md +110 -110
- package/templates/bmad/bmm/workflows/qa-generate-e2e-tests/workflow.yaml +42 -42
- package/templates/bmad/commands/bmad-agent-bmad-master.md +15 -15
- package/templates/bmad/commands/bmad-agent-bmm-analyst.md +15 -15
- package/templates/bmad/commands/bmad-agent-bmm-architect.md +15 -15
- package/templates/bmad/commands/bmad-agent-bmm-dev.md +15 -15
- package/templates/bmad/commands/bmad-agent-bmm-pm.md +15 -15
- package/templates/bmad/commands/bmad-agent-bmm-qa.md +15 -15
- package/templates/bmad/commands/bmad-agent-bmm-quick-flow-solo-dev.md +15 -15
- package/templates/bmad/commands/bmad-agent-bmm-sm.md +15 -15
- package/templates/bmad/commands/bmad-agent-bmm-tech-writer.md +15 -15
- package/templates/bmad/commands/bmad-agent-bmm-ux-designer.md +15 -15
- package/templates/bmad/commands/bmad-agent-tea-tea.md +15 -15
- package/templates/bmad/commands/bmad-bmm-check-implementation-readiness.md +6 -6
- package/templates/bmad/commands/bmad-bmm-code-review.md +14 -14
- package/templates/bmad/commands/bmad-bmm-correct-course.md +14 -14
- package/templates/bmad/commands/bmad-bmm-create-architecture.md +6 -6
- package/templates/bmad/commands/bmad-bmm-create-epics-and-stories.md +6 -6
- package/templates/bmad/commands/bmad-bmm-create-prd.md +6 -6
- package/templates/bmad/commands/bmad-bmm-create-product-brief.md +6 -6
- package/templates/bmad/commands/bmad-bmm-create-story.md +14 -14
- package/templates/bmad/commands/bmad-bmm-create-ux-design.md +6 -6
- package/templates/bmad/commands/bmad-bmm-dev-story.md +14 -14
- package/templates/bmad/commands/bmad-bmm-document-project.md +14 -14
- package/templates/bmad/commands/bmad-bmm-domain-research.md +6 -6
- package/templates/bmad/commands/bmad-bmm-edit-prd.md +6 -6
- package/templates/bmad/commands/bmad-bmm-generate-project-context.md +6 -6
- package/templates/bmad/commands/bmad-bmm-market-research.md +6 -6
- package/templates/bmad/commands/bmad-bmm-qa-automate.md +15 -15
- package/templates/bmad/commands/bmad-bmm-qa-generate-e2e-tests.md +14 -14
- package/templates/bmad/commands/bmad-bmm-quick-dev.md +6 -6
- package/templates/bmad/commands/bmad-bmm-quick-spec.md +6 -6
- package/templates/bmad/commands/bmad-bmm-retrospective.md +14 -14
- package/templates/bmad/commands/bmad-bmm-sprint-planning.md +14 -14
- package/templates/bmad/commands/bmad-bmm-sprint-status.md +14 -14
- package/templates/bmad/commands/bmad-bmm-technical-research.md +6 -6
- package/templates/bmad/commands/bmad-bmm-validate-prd.md +6 -6
- package/templates/bmad/commands/bmad-brainstorming.md +6 -6
- package/templates/bmad/commands/bmad-editorial-review-prose.md +10 -10
- package/templates/bmad/commands/bmad-editorial-review-structure.md +10 -10
- package/templates/bmad/commands/bmad-help.md +10 -10
- package/templates/bmad/commands/bmad-index-docs.md +10 -10
- package/templates/bmad/commands/bmad-party-mode.md +6 -6
- package/templates/bmad/commands/bmad-review-adversarial-general.md +10 -10
- package/templates/bmad/commands/bmad-review-edge-case-hunter.md +10 -10
- package/templates/bmad/commands/bmad-shard-doc.md +10 -10
- package/templates/bmad/commands/bmad-tea-teach-me-testing.md +6 -6
- package/templates/bmad/commands/bmad-tea-testarch-atdd.md +14 -14
- package/templates/bmad/commands/bmad-tea-testarch-automate.md +14 -14
- package/templates/bmad/commands/bmad-tea-testarch-ci.md +14 -14
- package/templates/bmad/commands/bmad-tea-testarch-framework.md +14 -14
- package/templates/bmad/commands/bmad-tea-testarch-nfr.md +14 -14
- package/templates/bmad/commands/bmad-tea-testarch-test-design.md +14 -14
- package/templates/bmad/commands/bmad-tea-testarch-test-review.md +14 -14
- package/templates/bmad/commands/bmad-tea-testarch-trace.md +14 -14
- package/templates/bmad/core/agents/bmad-master.md +56 -56
- package/templates/bmad/core/config.yaml +8 -8
- package/templates/bmad/core/module-help.csv +10 -10
- package/templates/bmad/core/tasks/editorial-review-prose.xml +101 -101
- package/templates/bmad/core/tasks/editorial-review-structure.xml +207 -207
- package/templates/bmad/core/tasks/help.md +86 -86
- package/templates/bmad/core/tasks/index-docs.xml +64 -64
- package/templates/bmad/core/tasks/review-adversarial-general.xml +48 -48
- package/templates/bmad/core/tasks/review-edge-case-hunter.xml +63 -63
- package/templates/bmad/core/tasks/shard-doc.xml +107 -107
- package/templates/bmad/core/tasks/workflow.xml +234 -234
- package/templates/bmad/core/workflows/advanced-elicitation/methods.csv +51 -51
- package/templates/bmad/core/workflows/advanced-elicitation/workflow.xml +117 -117
- package/templates/bmad/core/workflows/brainstorming/brain-methods.csv +61 -61
- package/templates/bmad/core/workflows/brainstorming/steps/step-01-session-setup.md +210 -210
- package/templates/bmad/core/workflows/brainstorming/steps/step-01b-continue.md +122 -122
- package/templates/bmad/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -225
- package/templates/bmad/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -237
- package/templates/bmad/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -209
- package/templates/bmad/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -264
- package/templates/bmad/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -399
- package/templates/bmad/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -303
- package/templates/bmad/core/workflows/brainstorming/template.md +15 -15
- package/templates/bmad/core/workflows/brainstorming/workflow.md +60 -60
- package/templates/bmad/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -138
- package/templates/bmad/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -187
- package/templates/bmad/core/workflows/party-mode/steps/step-03-graceful-exit.md +168 -168
- package/templates/bmad/core/workflows/party-mode/workflow.md +194 -194
- package/templates/bmad/tea/agents/tea.md +71 -71
- package/templates/bmad/tea/config.yaml +24 -24
- package/templates/mcp/claude-code/.mcp.json +35 -35
- package/templates/mcp/trae/mcp.json +35 -35
- package/templates/trae-bmad/rules/bmad-agent-bmad-master.md +15 -15
- package/templates/trae-bmad/rules/bmad-agent-bmm-analyst.md +15 -15
- package/templates/trae-bmad/rules/bmad-agent-bmm-architect.md +15 -15
- package/templates/trae-bmad/rules/bmad-agent-bmm-dev.md +15 -15
- package/templates/trae-bmad/rules/bmad-agent-bmm-pm.md +15 -15
- package/templates/trae-bmad/rules/bmad-agent-bmm-qa.md +15 -15
- package/templates/trae-bmad/rules/bmad-agent-bmm-quick-flow-solo-dev.md +15 -15
- package/templates/trae-bmad/rules/bmad-agent-bmm-sm.md +15 -15
- package/templates/trae-bmad/rules/bmad-agent-bmm-tech-writer.md +15 -15
- package/templates/trae-bmad/rules/bmad-agent-bmm-ux-designer.md +15 -15
- package/templates/trae-bmad/rules/bmad-agent-tea-tea.md +15 -15
- package/templates/trae-bmad/rules/bmad-bmm-check-implementation-readiness.md +6 -6
- package/templates/trae-bmad/rules/bmad-bmm-code-review.md +14 -14
- package/templates/trae-bmad/rules/bmad-bmm-correct-course.md +14 -14
- package/templates/trae-bmad/rules/bmad-bmm-create-architecture.md +6 -6
- package/templates/trae-bmad/rules/bmad-bmm-create-epics-and-stories.md +6 -6
- package/templates/trae-bmad/rules/bmad-bmm-create-prd.md +6 -6
- package/templates/trae-bmad/rules/bmad-bmm-create-product-brief.md +6 -6
- package/templates/trae-bmad/rules/bmad-bmm-create-story.md +14 -14
- package/templates/trae-bmad/rules/bmad-bmm-create-ux-design.md +6 -6
- package/templates/trae-bmad/rules/bmad-bmm-dev-story.md +14 -14
- package/templates/trae-bmad/rules/bmad-bmm-document-project.md +14 -14
- package/templates/trae-bmad/rules/bmad-bmm-domain-research.md +6 -6
- package/templates/trae-bmad/rules/bmad-bmm-edit-prd.md +6 -6
- package/templates/trae-bmad/rules/bmad-bmm-generate-project-context.md +6 -6
- package/templates/trae-bmad/rules/bmad-bmm-market-research.md +6 -6
- package/templates/trae-bmad/rules/bmad-bmm-qa-automate.md +15 -15
- package/templates/trae-bmad/rules/bmad-bmm-qa-generate-e2e-tests.md +14 -14
- package/templates/trae-bmad/rules/bmad-bmm-quick-dev.md +6 -6
- package/templates/trae-bmad/rules/bmad-bmm-quick-spec.md +6 -6
- package/templates/trae-bmad/rules/bmad-bmm-retrospective.md +14 -14
- package/templates/trae-bmad/rules/bmad-bmm-sprint-planning.md +14 -14
- package/templates/trae-bmad/rules/bmad-bmm-sprint-status.md +14 -14
- package/templates/trae-bmad/rules/bmad-bmm-technical-research.md +6 -6
- package/templates/trae-bmad/rules/bmad-bmm-validate-prd.md +6 -6
- package/templates/trae-bmad/rules/bmad-brainstorming.md +6 -6
- package/templates/trae-bmad/rules/bmad-editorial-review-prose.md +10 -10
- package/templates/trae-bmad/rules/bmad-editorial-review-structure.md +10 -10
- package/templates/trae-bmad/rules/bmad-help.md +10 -10
- package/templates/trae-bmad/rules/bmad-index-docs.md +10 -10
- package/templates/trae-bmad/rules/bmad-party-mode.md +6 -6
- package/templates/trae-bmad/rules/bmad-review-adversarial-general.md +10 -10
- package/templates/trae-bmad/rules/bmad-review-edge-case-hunter.md +10 -10
- package/templates/trae-bmad/rules/bmad-shard-doc.md +10 -10
- package/templates/trae-bmad/rules/bmad-tea-teach-me-testing.md +6 -6
- package/templates/trae-bmad/rules/bmad-tea-testarch-atdd.md +14 -14
- package/templates/trae-bmad/rules/bmad-tea-testarch-automate.md +14 -14
- package/templates/trae-bmad/rules/bmad-tea-testarch-ci.md +14 -14
- package/templates/trae-bmad/rules/bmad-tea-testarch-framework.md +14 -14
- package/templates/trae-bmad/rules/bmad-tea-testarch-nfr.md +14 -14
- package/templates/trae-bmad/rules/bmad-tea-testarch-test-design.md +14 -14
- package/templates/trae-bmad/rules/bmad-tea-testarch-test-review.md +14 -14
- package/templates/trae-bmad/rules/bmad-tea-testarch-trace.md +14 -14
package/src/commands/init.js
CHANGED
|
@@ -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
|
+
}
|