@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/sync.js
CHANGED
|
@@ -1,325 +1,325 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `cckit sync` command — pull upstream BMAD/ECC/ext-skills content into templates/.
|
|
3
|
-
*
|
|
4
|
-
* Workflow:
|
|
5
|
-
* 1. Validate --source parameter
|
|
6
|
-
* 2. Snapshot current templates/ directory
|
|
7
|
-
* 3. If --dry-run: report intended operations and exit
|
|
8
|
-
* 4. Fetch upstream sources (BMAD via npx, ECC via git clone, ext-skills via git clone)
|
|
9
|
-
* 5. Apply path mappings to copy files into templates/
|
|
10
|
-
* 6. Post-snapshot and compute diff
|
|
11
|
-
* 7. Update registry.json upstream metadata
|
|
12
|
-
* 8. Print diff report
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import path from 'node:path'
|
|
16
|
-
import fse from 'fs-extra'
|
|
17
|
-
import { fileURLToPath } from 'node:url'
|
|
18
|
-
import { createLogger } from '../utils/logger.js'
|
|
19
|
-
import { loadRegistry } from '../core/registry.js'
|
|
20
|
-
import { snapshotDir, computeDiff } from '../core/differ.js'
|
|
21
|
-
import { shouldTemplatize, templatizeConfigYaml } from '../core/templatize.js'
|
|
22
|
-
import {
|
|
23
|
-
fetchBmad,
|
|
24
|
-
fetchEcc,
|
|
25
|
-
fetchPlugins,
|
|
26
|
-
fetchExtSkills,
|
|
27
|
-
buildPluginMappings,
|
|
28
|
-
buildExtSkillMappings,
|
|
29
|
-
applyMappings,
|
|
30
|
-
createTempDir,
|
|
31
|
-
BMAD_PATH_MAPPINGS,
|
|
32
|
-
ECC_PATH_MAPPINGS,
|
|
33
|
-
ECC_REPO_URL,
|
|
34
|
-
} from '../core/upstream.js'
|
|
35
|
-
|
|
36
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
|
37
|
-
const TEMPLATES_DIR = path.resolve(__dirname, '../../templates')
|
|
38
|
-
const REGISTRY_PATH = path.resolve(__dirname, '../../registry.json')
|
|
39
|
-
|
|
40
|
-
const VALID_SOURCES = ['bmad', 'ecc', 'plugins', 'ext-skills', 'all']
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Run the sync command.
|
|
44
|
-
*
|
|
45
|
-
* @param {object} opts - Command options
|
|
46
|
-
* @param {string} [opts.source='all'] - Source to sync: bmad, ecc, plugins, ext-skills, or all
|
|
47
|
-
* @param {boolean} [opts.dryRun=false] - Preview mode
|
|
48
|
-
* @param {boolean} [opts.debug=false] - Debug output
|
|
49
|
-
* @param {object} [opts._deps] - Injectable dependencies for testing
|
|
50
|
-
*/
|
|
51
|
-
export async function runSync(opts = {}) {
|
|
52
|
-
const {
|
|
53
|
-
source = 'all',
|
|
54
|
-
dryRun = false,
|
|
55
|
-
debug = false,
|
|
56
|
-
_deps = {},
|
|
57
|
-
} = opts
|
|
58
|
-
|
|
59
|
-
const logger = _deps.logger || createLogger({ debug })
|
|
60
|
-
const templatesDir = _deps.templatesDir || TEMPLATES_DIR
|
|
61
|
-
const registryPath = _deps.registryPath || REGISTRY_PATH
|
|
62
|
-
const fetchBmadFn = _deps.fetchBmad || fetchBmad
|
|
63
|
-
const fetchEccFn = _deps.fetchEcc || fetchEcc
|
|
64
|
-
const fetchPluginsFn = _deps.fetchPlugins || fetchPlugins
|
|
65
|
-
const fetchExtSkillsFn = _deps.fetchExtSkills || fetchExtSkills
|
|
66
|
-
|
|
67
|
-
// Step 1: Validate source
|
|
68
|
-
if (!VALID_SOURCES.includes(source)) {
|
|
69
|
-
throw new Error(`Invalid source "${source}". Must be one of: ${VALID_SOURCES.join(', ')}`)
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const syncBmad = source === 'bmad' || source === 'all'
|
|
73
|
-
const syncEcc = source === 'ecc' || source === 'all'
|
|
74
|
-
const syncPlugins = source === 'plugins' || source === 'all'
|
|
75
|
-
const syncExtSkills = source === 'ext-skills' || source === 'all'
|
|
76
|
-
|
|
77
|
-
logger.banner('cckit sync')
|
|
78
|
-
logger.info(` Source: ${source}`)
|
|
79
|
-
|
|
80
|
-
// Step 2: Snapshot before
|
|
81
|
-
logger.debug('Snapshotting templates directory...')
|
|
82
|
-
const beforeSnapshot = await snapshotDir(templatesDir)
|
|
83
|
-
logger.debug(` Before snapshot: ${beforeSnapshot.size} files`)
|
|
84
|
-
|
|
85
|
-
// Step 3: Dry-run check
|
|
86
|
-
if (dryRun) {
|
|
87
|
-
logger.info('')
|
|
88
|
-
logger.info(' Dry-run mode — no changes will be applied.')
|
|
89
|
-
logger.info('')
|
|
90
|
-
if (syncBmad) {
|
|
91
|
-
logger.info(' Would sync BMAD:')
|
|
92
|
-
for (const m of BMAD_PATH_MAPPINGS) {
|
|
93
|
-
logger.info(` ${m.src} → templates/${m.dest}`)
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
if (syncEcc) {
|
|
97
|
-
logger.info(' Would sync ECC:')
|
|
98
|
-
for (const m of ECC_PATH_MAPPINGS) {
|
|
99
|
-
logger.info(` ${m.src} → templates/${m.dest}`)
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
if (syncPlugins) {
|
|
103
|
-
const registry = await loadRegistry(registryPath)
|
|
104
|
-
const pluginMappings = buildPluginMappings(registry)
|
|
105
|
-
logger.info(' Would sync Plugins:')
|
|
106
|
-
for (const m of pluginMappings) {
|
|
107
|
-
logger.info(` ${m.src} → templates/${m.dest}`)
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
if (syncExtSkills) {
|
|
111
|
-
const registry = await loadRegistry(registryPath)
|
|
112
|
-
const extSkillMappings = buildExtSkillMappings(registry)
|
|
113
|
-
logger.info(' Would sync Ext-skills:')
|
|
114
|
-
for (const m of extSkillMappings) {
|
|
115
|
-
logger.info(` ${m.src} → templates/${m.dest}`)
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
return { dryRun: true }
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Step 4 & 5: Fetch and apply
|
|
122
|
-
let tmpDir
|
|
123
|
-
const upstreamMeta = {}
|
|
124
|
-
|
|
125
|
-
try {
|
|
126
|
-
tmpDir = await createTempDir('cckit-sync')
|
|
127
|
-
logger.debug(`Temp directory: ${tmpDir}`)
|
|
128
|
-
|
|
129
|
-
// Pre-check plugins and ext-skills upstream availability to compute accurate step count
|
|
130
|
-
let pluginsAvailable = false
|
|
131
|
-
if (syncPlugins) {
|
|
132
|
-
const reg = await loadRegistry(registryPath)
|
|
133
|
-
pluginsAvailable = Boolean(reg.upstream?.plugins?.repo)
|
|
134
|
-
if (!pluginsAvailable) {
|
|
135
|
-
logger.warn('No plugins upstream configured in registry.json, skipping plugins sync')
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
let extSkillsAvailable = false
|
|
140
|
-
if (syncExtSkills) {
|
|
141
|
-
const reg = await loadRegistry(registryPath)
|
|
142
|
-
const extEntries = reg.upstream?.['ext-skills'] || {}
|
|
143
|
-
extSkillsAvailable = Object.keys(extEntries).length > 0
|
|
144
|
-
if (!extSkillsAvailable) {
|
|
145
|
-
logger.warn('No ext-skills upstream configured in registry.json, skipping ext-skills sync')
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
const totalSteps = [syncBmad, syncEcc, pluginsAvailable, extSkillsAvailable].filter(Boolean).length
|
|
150
|
-
let currentStep = 0
|
|
151
|
-
|
|
152
|
-
if (syncBmad) {
|
|
153
|
-
currentStep++
|
|
154
|
-
logger.step(currentStep, totalSteps, 'Fetching BMAD...')
|
|
155
|
-
const bmad = await fetchBmadFn({ tmpDir, logger })
|
|
156
|
-
upstreamMeta.bmad = { version: bmad.version }
|
|
157
|
-
|
|
158
|
-
const postProcess = (content, relPath) => {
|
|
159
|
-
if (shouldTemplatize(relPath)) {
|
|
160
|
-
return templatizeConfigYaml(content)
|
|
161
|
-
}
|
|
162
|
-
return content
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
const fileCount = await applyMappings({
|
|
166
|
-
srcBase: bmad.dir,
|
|
167
|
-
destBase: templatesDir,
|
|
168
|
-
mappings: BMAD_PATH_MAPPINGS,
|
|
169
|
-
postProcess,
|
|
170
|
-
logger,
|
|
171
|
-
})
|
|
172
|
-
logger.success(`BMAD: ${fileCount} files synced`)
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
if (syncEcc) {
|
|
176
|
-
currentStep++
|
|
177
|
-
logger.step(currentStep, totalSteps, 'Fetching ECC...')
|
|
178
|
-
const ecc = await fetchEccFn({ tmpDir, logger })
|
|
179
|
-
upstreamMeta.ecc = { sha: ecc.sha }
|
|
180
|
-
|
|
181
|
-
const fileCount = await applyMappings({
|
|
182
|
-
srcBase: ecc.dir,
|
|
183
|
-
destBase: templatesDir,
|
|
184
|
-
mappings: ECC_PATH_MAPPINGS,
|
|
185
|
-
logger,
|
|
186
|
-
})
|
|
187
|
-
logger.success(`ECC: ${fileCount} files synced`)
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
if (pluginsAvailable) {
|
|
191
|
-
currentStep++
|
|
192
|
-
logger.step(currentStep, totalSteps, 'Fetching Plugins...')
|
|
193
|
-
|
|
194
|
-
const registry = await loadRegistry(registryPath)
|
|
195
|
-
const plugins = await fetchPluginsFn({ tmpDir, logger, registry })
|
|
196
|
-
upstreamMeta.plugins = { sha: plugins.sha }
|
|
197
|
-
|
|
198
|
-
const pluginMappings = buildPluginMappings(registry)
|
|
199
|
-
const fileCount = await applyMappings({
|
|
200
|
-
srcBase: plugins.dir,
|
|
201
|
-
destBase: templatesDir,
|
|
202
|
-
mappings: pluginMappings,
|
|
203
|
-
logger,
|
|
204
|
-
})
|
|
205
|
-
logger.success(`Plugins: ${fileCount} files synced`)
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
if (extSkillsAvailable) {
|
|
209
|
-
currentStep++
|
|
210
|
-
logger.step(currentStep, totalSteps, 'Fetching Ext-skills...')
|
|
211
|
-
|
|
212
|
-
const registry = await loadRegistry(registryPath)
|
|
213
|
-
const extSkills = await fetchExtSkillsFn({ tmpDir, logger, registry })
|
|
214
|
-
upstreamMeta.extSkills = extSkills.skills
|
|
215
|
-
|
|
216
|
-
const extSkillMappings = buildExtSkillMappings(registry)
|
|
217
|
-
const fileCount = await applyMappings({
|
|
218
|
-
srcBase: extSkills.dir,
|
|
219
|
-
destBase: templatesDir,
|
|
220
|
-
mappings: extSkillMappings,
|
|
221
|
-
logger,
|
|
222
|
-
})
|
|
223
|
-
logger.success(`Ext-skills: ${fileCount} files synced`)
|
|
224
|
-
}
|
|
225
|
-
} finally {
|
|
226
|
-
// Cleanup temp directory
|
|
227
|
-
if (tmpDir) {
|
|
228
|
-
logger.debug('Cleaning up temp directory...')
|
|
229
|
-
await fse.remove(tmpDir)
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
// Step 6-8: Post-sync processing (snapshot, registry update, diff report)
|
|
234
|
-
let diff
|
|
235
|
-
let updatedUpstream
|
|
236
|
-
try {
|
|
237
|
-
// Step 6: Snapshot after and compute diff
|
|
238
|
-
const afterSnapshot = await snapshotDir(templatesDir)
|
|
239
|
-
diff = computeDiff(beforeSnapshot, afterSnapshot)
|
|
240
|
-
|
|
241
|
-
// Step 7: Update registry.json upstream metadata (immutable)
|
|
242
|
-
const registry = await loadRegistry(registryPath)
|
|
243
|
-
const now = new Date().toISOString()
|
|
244
|
-
|
|
245
|
-
updatedUpstream = {
|
|
246
|
-
...(registry.upstream || {}),
|
|
247
|
-
...(upstreamMeta.bmad ? {
|
|
248
|
-
bmad: {
|
|
249
|
-
type: 'npm',
|
|
250
|
-
package: 'bmad-method',
|
|
251
|
-
lastSyncVersion: upstreamMeta.bmad.version,
|
|
252
|
-
lastSyncDate: now,
|
|
253
|
-
},
|
|
254
|
-
} : {}),
|
|
255
|
-
...(upstreamMeta.ecc ? {
|
|
256
|
-
ecc: {
|
|
257
|
-
type: 'git',
|
|
258
|
-
repo: ECC_REPO_URL,
|
|
259
|
-
lastSyncSha: upstreamMeta.ecc.sha,
|
|
260
|
-
lastSyncDate: now,
|
|
261
|
-
},
|
|
262
|
-
} : {}),
|
|
263
|
-
...(upstreamMeta.plugins ? {
|
|
264
|
-
plugins: {
|
|
265
|
-
...(registry.upstream?.plugins || {}),
|
|
266
|
-
lastSyncSha: upstreamMeta.plugins.sha,
|
|
267
|
-
lastSyncDate: now,
|
|
268
|
-
},
|
|
269
|
-
} : {}),
|
|
270
|
-
...(upstreamMeta.extSkills ? {
|
|
271
|
-
'ext-skills': Object.fromEntries(
|
|
272
|
-
Object.entries(registry.upstream?.['ext-skills'] || {}).map(([id, entry]) => [
|
|
273
|
-
id,
|
|
274
|
-
upstreamMeta.extSkills[id]
|
|
275
|
-
? { ...entry, lastSyncSha: upstreamMeta.extSkills[id].sha, lastSyncDate: now }
|
|
276
|
-
: entry,
|
|
277
|
-
])
|
|
278
|
-
),
|
|
279
|
-
} : {}),
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
const updatedRegistry = { ...registry, upstream: updatedUpstream }
|
|
283
|
-
await fse.writeFile(registryPath, JSON.stringify(updatedRegistry, null, 2) + '\n', 'utf8')
|
|
284
|
-
logger.debug('Registry updated with upstream metadata')
|
|
285
|
-
} catch (err) {
|
|
286
|
-
throw new Error(`Sync completed but post-processing failed: ${err.message}`)
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
// Step 8: Print diff report
|
|
290
|
-
logger.newline()
|
|
291
|
-
const totalChanges = diff.added.length + diff.modified.length + diff.deleted.length
|
|
292
|
-
|
|
293
|
-
if (totalChanges === 0) {
|
|
294
|
-
logger.info(' No changes detected — templates are up to date.')
|
|
295
|
-
} else {
|
|
296
|
-
logger.info(` Changes: +${diff.added.length} added, ~${diff.modified.length} modified, -${diff.deleted.length} deleted`)
|
|
297
|
-
logger.newline()
|
|
298
|
-
|
|
299
|
-
if (diff.added.length > 0) {
|
|
300
|
-
logger.info(' Added:')
|
|
301
|
-
for (const f of diff.added) {
|
|
302
|
-
logger.success(f)
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
if (diff.modified.length > 0) {
|
|
307
|
-
logger.info(' Modified:')
|
|
308
|
-
for (const f of diff.modified) {
|
|
309
|
-
logger.warn(f)
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
if (diff.deleted.length > 0) {
|
|
314
|
-
logger.info(' Deleted:')
|
|
315
|
-
for (const f of diff.deleted) {
|
|
316
|
-
logger.error(f)
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
logger.newline()
|
|
322
|
-
logger.success('Sync complete.')
|
|
323
|
-
|
|
324
|
-
return { diff, upstream: updatedUpstream }
|
|
325
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* `cckit sync` command — pull upstream BMAD/ECC/ext-skills content into templates/.
|
|
3
|
+
*
|
|
4
|
+
* Workflow:
|
|
5
|
+
* 1. Validate --source parameter
|
|
6
|
+
* 2. Snapshot current templates/ directory
|
|
7
|
+
* 3. If --dry-run: report intended operations and exit
|
|
8
|
+
* 4. Fetch upstream sources (BMAD via npx, ECC via git clone, ext-skills via git clone)
|
|
9
|
+
* 5. Apply path mappings to copy files into templates/
|
|
10
|
+
* 6. Post-snapshot and compute diff
|
|
11
|
+
* 7. Update registry.json upstream metadata
|
|
12
|
+
* 8. Print diff report
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import path from 'node:path'
|
|
16
|
+
import fse from 'fs-extra'
|
|
17
|
+
import { fileURLToPath } from 'node:url'
|
|
18
|
+
import { createLogger } from '../utils/logger.js'
|
|
19
|
+
import { loadRegistry } from '../core/registry.js'
|
|
20
|
+
import { snapshotDir, computeDiff } from '../core/differ.js'
|
|
21
|
+
import { shouldTemplatize, templatizeConfigYaml } from '../core/templatize.js'
|
|
22
|
+
import {
|
|
23
|
+
fetchBmad,
|
|
24
|
+
fetchEcc,
|
|
25
|
+
fetchPlugins,
|
|
26
|
+
fetchExtSkills,
|
|
27
|
+
buildPluginMappings,
|
|
28
|
+
buildExtSkillMappings,
|
|
29
|
+
applyMappings,
|
|
30
|
+
createTempDir,
|
|
31
|
+
BMAD_PATH_MAPPINGS,
|
|
32
|
+
ECC_PATH_MAPPINGS,
|
|
33
|
+
ECC_REPO_URL,
|
|
34
|
+
} from '../core/upstream.js'
|
|
35
|
+
|
|
36
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
|
37
|
+
const TEMPLATES_DIR = path.resolve(__dirname, '../../templates')
|
|
38
|
+
const REGISTRY_PATH = path.resolve(__dirname, '../../registry.json')
|
|
39
|
+
|
|
40
|
+
const VALID_SOURCES = ['bmad', 'ecc', 'plugins', 'ext-skills', 'all']
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Run the sync command.
|
|
44
|
+
*
|
|
45
|
+
* @param {object} opts - Command options
|
|
46
|
+
* @param {string} [opts.source='all'] - Source to sync: bmad, ecc, plugins, ext-skills, or all
|
|
47
|
+
* @param {boolean} [opts.dryRun=false] - Preview mode
|
|
48
|
+
* @param {boolean} [opts.debug=false] - Debug output
|
|
49
|
+
* @param {object} [opts._deps] - Injectable dependencies for testing
|
|
50
|
+
*/
|
|
51
|
+
export async function runSync(opts = {}) {
|
|
52
|
+
const {
|
|
53
|
+
source = 'all',
|
|
54
|
+
dryRun = false,
|
|
55
|
+
debug = false,
|
|
56
|
+
_deps = {},
|
|
57
|
+
} = opts
|
|
58
|
+
|
|
59
|
+
const logger = _deps.logger || createLogger({ debug })
|
|
60
|
+
const templatesDir = _deps.templatesDir || TEMPLATES_DIR
|
|
61
|
+
const registryPath = _deps.registryPath || REGISTRY_PATH
|
|
62
|
+
const fetchBmadFn = _deps.fetchBmad || fetchBmad
|
|
63
|
+
const fetchEccFn = _deps.fetchEcc || fetchEcc
|
|
64
|
+
const fetchPluginsFn = _deps.fetchPlugins || fetchPlugins
|
|
65
|
+
const fetchExtSkillsFn = _deps.fetchExtSkills || fetchExtSkills
|
|
66
|
+
|
|
67
|
+
// Step 1: Validate source
|
|
68
|
+
if (!VALID_SOURCES.includes(source)) {
|
|
69
|
+
throw new Error(`Invalid source "${source}". Must be one of: ${VALID_SOURCES.join(', ')}`)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const syncBmad = source === 'bmad' || source === 'all'
|
|
73
|
+
const syncEcc = source === 'ecc' || source === 'all'
|
|
74
|
+
const syncPlugins = source === 'plugins' || source === 'all'
|
|
75
|
+
const syncExtSkills = source === 'ext-skills' || source === 'all'
|
|
76
|
+
|
|
77
|
+
logger.banner('cckit sync')
|
|
78
|
+
logger.info(` Source: ${source}`)
|
|
79
|
+
|
|
80
|
+
// Step 2: Snapshot before
|
|
81
|
+
logger.debug('Snapshotting templates directory...')
|
|
82
|
+
const beforeSnapshot = await snapshotDir(templatesDir)
|
|
83
|
+
logger.debug(` Before snapshot: ${beforeSnapshot.size} files`)
|
|
84
|
+
|
|
85
|
+
// Step 3: Dry-run check
|
|
86
|
+
if (dryRun) {
|
|
87
|
+
logger.info('')
|
|
88
|
+
logger.info(' Dry-run mode — no changes will be applied.')
|
|
89
|
+
logger.info('')
|
|
90
|
+
if (syncBmad) {
|
|
91
|
+
logger.info(' Would sync BMAD:')
|
|
92
|
+
for (const m of BMAD_PATH_MAPPINGS) {
|
|
93
|
+
logger.info(` ${m.src} → templates/${m.dest}`)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (syncEcc) {
|
|
97
|
+
logger.info(' Would sync ECC:')
|
|
98
|
+
for (const m of ECC_PATH_MAPPINGS) {
|
|
99
|
+
logger.info(` ${m.src} → templates/${m.dest}`)
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (syncPlugins) {
|
|
103
|
+
const registry = await loadRegistry(registryPath)
|
|
104
|
+
const pluginMappings = buildPluginMappings(registry)
|
|
105
|
+
logger.info(' Would sync Plugins:')
|
|
106
|
+
for (const m of pluginMappings) {
|
|
107
|
+
logger.info(` ${m.src} → templates/${m.dest}`)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (syncExtSkills) {
|
|
111
|
+
const registry = await loadRegistry(registryPath)
|
|
112
|
+
const extSkillMappings = buildExtSkillMappings(registry)
|
|
113
|
+
logger.info(' Would sync Ext-skills:')
|
|
114
|
+
for (const m of extSkillMappings) {
|
|
115
|
+
logger.info(` ${m.src} → templates/${m.dest}`)
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { dryRun: true }
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Step 4 & 5: Fetch and apply
|
|
122
|
+
let tmpDir
|
|
123
|
+
const upstreamMeta = {}
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
tmpDir = await createTempDir('cckit-sync')
|
|
127
|
+
logger.debug(`Temp directory: ${tmpDir}`)
|
|
128
|
+
|
|
129
|
+
// Pre-check plugins and ext-skills upstream availability to compute accurate step count
|
|
130
|
+
let pluginsAvailable = false
|
|
131
|
+
if (syncPlugins) {
|
|
132
|
+
const reg = await loadRegistry(registryPath)
|
|
133
|
+
pluginsAvailable = Boolean(reg.upstream?.plugins?.repo)
|
|
134
|
+
if (!pluginsAvailable) {
|
|
135
|
+
logger.warn('No plugins upstream configured in registry.json, skipping plugins sync')
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
let extSkillsAvailable = false
|
|
140
|
+
if (syncExtSkills) {
|
|
141
|
+
const reg = await loadRegistry(registryPath)
|
|
142
|
+
const extEntries = reg.upstream?.['ext-skills'] || {}
|
|
143
|
+
extSkillsAvailable = Object.keys(extEntries).length > 0
|
|
144
|
+
if (!extSkillsAvailable) {
|
|
145
|
+
logger.warn('No ext-skills upstream configured in registry.json, skipping ext-skills sync')
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const totalSteps = [syncBmad, syncEcc, pluginsAvailable, extSkillsAvailable].filter(Boolean).length
|
|
150
|
+
let currentStep = 0
|
|
151
|
+
|
|
152
|
+
if (syncBmad) {
|
|
153
|
+
currentStep++
|
|
154
|
+
logger.step(currentStep, totalSteps, 'Fetching BMAD...')
|
|
155
|
+
const bmad = await fetchBmadFn({ tmpDir, logger })
|
|
156
|
+
upstreamMeta.bmad = { version: bmad.version }
|
|
157
|
+
|
|
158
|
+
const postProcess = (content, relPath) => {
|
|
159
|
+
if (shouldTemplatize(relPath)) {
|
|
160
|
+
return templatizeConfigYaml(content)
|
|
161
|
+
}
|
|
162
|
+
return content
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const fileCount = await applyMappings({
|
|
166
|
+
srcBase: bmad.dir,
|
|
167
|
+
destBase: templatesDir,
|
|
168
|
+
mappings: BMAD_PATH_MAPPINGS,
|
|
169
|
+
postProcess,
|
|
170
|
+
logger,
|
|
171
|
+
})
|
|
172
|
+
logger.success(`BMAD: ${fileCount} files synced`)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (syncEcc) {
|
|
176
|
+
currentStep++
|
|
177
|
+
logger.step(currentStep, totalSteps, 'Fetching ECC...')
|
|
178
|
+
const ecc = await fetchEccFn({ tmpDir, logger })
|
|
179
|
+
upstreamMeta.ecc = { sha: ecc.sha }
|
|
180
|
+
|
|
181
|
+
const fileCount = await applyMappings({
|
|
182
|
+
srcBase: ecc.dir,
|
|
183
|
+
destBase: templatesDir,
|
|
184
|
+
mappings: ECC_PATH_MAPPINGS,
|
|
185
|
+
logger,
|
|
186
|
+
})
|
|
187
|
+
logger.success(`ECC: ${fileCount} files synced`)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (pluginsAvailable) {
|
|
191
|
+
currentStep++
|
|
192
|
+
logger.step(currentStep, totalSteps, 'Fetching Plugins...')
|
|
193
|
+
|
|
194
|
+
const registry = await loadRegistry(registryPath)
|
|
195
|
+
const plugins = await fetchPluginsFn({ tmpDir, logger, registry })
|
|
196
|
+
upstreamMeta.plugins = { sha: plugins.sha }
|
|
197
|
+
|
|
198
|
+
const pluginMappings = buildPluginMappings(registry)
|
|
199
|
+
const fileCount = await applyMappings({
|
|
200
|
+
srcBase: plugins.dir,
|
|
201
|
+
destBase: templatesDir,
|
|
202
|
+
mappings: pluginMappings,
|
|
203
|
+
logger,
|
|
204
|
+
})
|
|
205
|
+
logger.success(`Plugins: ${fileCount} files synced`)
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
if (extSkillsAvailable) {
|
|
209
|
+
currentStep++
|
|
210
|
+
logger.step(currentStep, totalSteps, 'Fetching Ext-skills...')
|
|
211
|
+
|
|
212
|
+
const registry = await loadRegistry(registryPath)
|
|
213
|
+
const extSkills = await fetchExtSkillsFn({ tmpDir, logger, registry })
|
|
214
|
+
upstreamMeta.extSkills = extSkills.skills
|
|
215
|
+
|
|
216
|
+
const extSkillMappings = buildExtSkillMappings(registry)
|
|
217
|
+
const fileCount = await applyMappings({
|
|
218
|
+
srcBase: extSkills.dir,
|
|
219
|
+
destBase: templatesDir,
|
|
220
|
+
mappings: extSkillMappings,
|
|
221
|
+
logger,
|
|
222
|
+
})
|
|
223
|
+
logger.success(`Ext-skills: ${fileCount} files synced`)
|
|
224
|
+
}
|
|
225
|
+
} finally {
|
|
226
|
+
// Cleanup temp directory
|
|
227
|
+
if (tmpDir) {
|
|
228
|
+
logger.debug('Cleaning up temp directory...')
|
|
229
|
+
await fse.remove(tmpDir)
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Step 6-8: Post-sync processing (snapshot, registry update, diff report)
|
|
234
|
+
let diff
|
|
235
|
+
let updatedUpstream
|
|
236
|
+
try {
|
|
237
|
+
// Step 6: Snapshot after and compute diff
|
|
238
|
+
const afterSnapshot = await snapshotDir(templatesDir)
|
|
239
|
+
diff = computeDiff(beforeSnapshot, afterSnapshot)
|
|
240
|
+
|
|
241
|
+
// Step 7: Update registry.json upstream metadata (immutable)
|
|
242
|
+
const registry = await loadRegistry(registryPath)
|
|
243
|
+
const now = new Date().toISOString()
|
|
244
|
+
|
|
245
|
+
updatedUpstream = {
|
|
246
|
+
...(registry.upstream || {}),
|
|
247
|
+
...(upstreamMeta.bmad ? {
|
|
248
|
+
bmad: {
|
|
249
|
+
type: 'npm',
|
|
250
|
+
package: 'bmad-method',
|
|
251
|
+
lastSyncVersion: upstreamMeta.bmad.version,
|
|
252
|
+
lastSyncDate: now,
|
|
253
|
+
},
|
|
254
|
+
} : {}),
|
|
255
|
+
...(upstreamMeta.ecc ? {
|
|
256
|
+
ecc: {
|
|
257
|
+
type: 'git',
|
|
258
|
+
repo: ECC_REPO_URL,
|
|
259
|
+
lastSyncSha: upstreamMeta.ecc.sha,
|
|
260
|
+
lastSyncDate: now,
|
|
261
|
+
},
|
|
262
|
+
} : {}),
|
|
263
|
+
...(upstreamMeta.plugins ? {
|
|
264
|
+
plugins: {
|
|
265
|
+
...(registry.upstream?.plugins || {}),
|
|
266
|
+
lastSyncSha: upstreamMeta.plugins.sha,
|
|
267
|
+
lastSyncDate: now,
|
|
268
|
+
},
|
|
269
|
+
} : {}),
|
|
270
|
+
...(upstreamMeta.extSkills ? {
|
|
271
|
+
'ext-skills': Object.fromEntries(
|
|
272
|
+
Object.entries(registry.upstream?.['ext-skills'] || {}).map(([id, entry]) => [
|
|
273
|
+
id,
|
|
274
|
+
upstreamMeta.extSkills[id]
|
|
275
|
+
? { ...entry, lastSyncSha: upstreamMeta.extSkills[id].sha, lastSyncDate: now }
|
|
276
|
+
: entry,
|
|
277
|
+
])
|
|
278
|
+
),
|
|
279
|
+
} : {}),
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const updatedRegistry = { ...registry, upstream: updatedUpstream }
|
|
283
|
+
await fse.writeFile(registryPath, JSON.stringify(updatedRegistry, null, 2) + '\n', 'utf8')
|
|
284
|
+
logger.debug('Registry updated with upstream metadata')
|
|
285
|
+
} catch (err) {
|
|
286
|
+
throw new Error(`Sync completed but post-processing failed: ${err.message}`)
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Step 8: Print diff report
|
|
290
|
+
logger.newline()
|
|
291
|
+
const totalChanges = diff.added.length + diff.modified.length + diff.deleted.length
|
|
292
|
+
|
|
293
|
+
if (totalChanges === 0) {
|
|
294
|
+
logger.info(' No changes detected — templates are up to date.')
|
|
295
|
+
} else {
|
|
296
|
+
logger.info(` Changes: +${diff.added.length} added, ~${diff.modified.length} modified, -${diff.deleted.length} deleted`)
|
|
297
|
+
logger.newline()
|
|
298
|
+
|
|
299
|
+
if (diff.added.length > 0) {
|
|
300
|
+
logger.info(' Added:')
|
|
301
|
+
for (const f of diff.added) {
|
|
302
|
+
logger.success(f)
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (diff.modified.length > 0) {
|
|
307
|
+
logger.info(' Modified:')
|
|
308
|
+
for (const f of diff.modified) {
|
|
309
|
+
logger.warn(f)
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (diff.deleted.length > 0) {
|
|
314
|
+
logger.info(' Deleted:')
|
|
315
|
+
for (const f of diff.deleted) {
|
|
316
|
+
logger.error(f)
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
logger.newline()
|
|
322
|
+
logger.success('Sync complete.')
|
|
323
|
+
|
|
324
|
+
return { diff, upstream: updatedUpstream }
|
|
325
|
+
}
|