@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
|
@@ -1,278 +1,278 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Plugin installer — handles distributing plugins to Claude Code and Trae.
|
|
3
|
-
*
|
|
4
|
-
* Claude Code: writes plugin IDs into `.claude/settings.json` enabledPlugins.
|
|
5
|
-
* Trae: extracts skills/commands/agents from plugin templates into `.trae/`.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import path from 'node:path'
|
|
9
|
-
import fse from 'fs-extra'
|
|
10
|
-
import { listFiles, copyWithInterpolation, interpolate } from '../utils/fs.js'
|
|
11
|
-
import { convertAgentForTrae, convertCommandForTrae } from '../adapters/trae-adapter.js'
|
|
12
|
-
|
|
13
|
-
// ─── Claude Code Base Settings ──────────────────────────────────────────────
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Default environment overrides written to `.claude/settings.json`.
|
|
17
|
-
* These disable telemetry, error reporting, and the /bug command.
|
|
18
|
-
*/
|
|
19
|
-
const CLAUDE_CODE_ENV_DEFAULTS = {
|
|
20
|
-
DISABLE_BUG_COMMAND: '1',
|
|
21
|
-
DISABLE_ERROR_REPORTING: '1',
|
|
22
|
-
DISABLE_TELEMETRY: '1',
|
|
23
|
-
MCP_TIMEOUT: '60000',
|
|
24
|
-
MAX_THINKING_TOKENS: '31999',
|
|
25
|
-
CLAUDE_CODE_MAX_OUTPUT_TOKENS: '64000',
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// ─── Plugin Resolution ──────────────────────────────────────────────────────
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Get plugin IDs marked as default in the registry.
|
|
32
|
-
*
|
|
33
|
-
* @param {object} registry - Registry object with plugins section
|
|
34
|
-
* @returns {string[]} Default plugin IDs
|
|
35
|
-
*/
|
|
36
|
-
export function getDefaultPlugins(registry) {
|
|
37
|
-
const plugins = registry.plugins || {}
|
|
38
|
-
return Object.entries(plugins)
|
|
39
|
-
.filter(([, def]) => def.default)
|
|
40
|
-
.map(([id]) => id)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Resolve requested plugin IDs to plugin definitions with constructed template paths.
|
|
45
|
-
* Note: Template directory existence is validated later by installPlugins().
|
|
46
|
-
*
|
|
47
|
-
* @param {object} registry - Registry object
|
|
48
|
-
* @param {string[]} pluginIds - Requested plugin IDs
|
|
49
|
-
* @param {string} templateBase - Absolute path to cckit templates/ directory
|
|
50
|
-
* @param {object} logger - Logger instance
|
|
51
|
-
* @returns {{ found: Array<{ id: string, def: object, templateDir: string }>, skipped: Array<{ id: string, reason: string }> }}
|
|
52
|
-
*/
|
|
53
|
-
export function resolvePlugins(registry, pluginIds, templateBase, logger) {
|
|
54
|
-
const plugins = registry.plugins || {}
|
|
55
|
-
const found = []
|
|
56
|
-
const skipped = []
|
|
57
|
-
|
|
58
|
-
for (const id of pluginIds) {
|
|
59
|
-
const def = plugins[id]
|
|
60
|
-
if (!def) {
|
|
61
|
-
logger.warn(`Plugin "${id}" not found in registry, skipping`)
|
|
62
|
-
skipped.push({ id, reason: 'not in registry' })
|
|
63
|
-
continue
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const templateDir = path.join(templateBase, 'plugins', id)
|
|
67
|
-
found.push({ id, def, templateDir })
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return { found, skipped }
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// ─── Claude Code Installation ───────────────────────────────────────────────
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Install plugins for Claude Code by writing enabledPlugins and
|
|
77
|
-
* extraKnownMarketplaces (for non-built-in marketplaces) to settings.json.
|
|
78
|
-
*
|
|
79
|
-
* Plugins with a `marketplaceSource` field in their registry definition will
|
|
80
|
-
* have their marketplace source added to `extraKnownMarketplaces`, enabling
|
|
81
|
-
* Claude Code to auto-prompt users for marketplace trust and plugin installation.
|
|
82
|
-
*
|
|
83
|
-
* @param {Array<{ id: string, def: object }>} plugins - Resolved plugins
|
|
84
|
-
* @param {string} targetDir - Project root directory
|
|
85
|
-
* @param {object} logger - Logger instance
|
|
86
|
-
* @returns {Promise<string[]>} List of enabled plugin keys
|
|
87
|
-
*/
|
|
88
|
-
export async function installForClaudeCode(plugins, targetDir, logger) {
|
|
89
|
-
const settingsPath = path.join(targetDir, '.claude', 'settings.json')
|
|
90
|
-
let existing = {}
|
|
91
|
-
|
|
92
|
-
try {
|
|
93
|
-
if (await fse.pathExists(settingsPath)) {
|
|
94
|
-
const raw = await fse.readFile(settingsPath, 'utf8')
|
|
95
|
-
existing = JSON.parse(raw)
|
|
96
|
-
}
|
|
97
|
-
} catch (err) {
|
|
98
|
-
logger.warn(`settings.json parse error, backing up and recreating: ${err.message}`)
|
|
99
|
-
const backupPath = `${settingsPath}.bak.${Date.now()}`
|
|
100
|
-
await fse.copy(settingsPath, backupPath)
|
|
101
|
-
existing = {}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
const newPlugins = {}
|
|
105
|
-
const newMarketplaces = {}
|
|
106
|
-
|
|
107
|
-
for (const { id, def } of plugins) {
|
|
108
|
-
const key = `${id}@${def.marketplace}`
|
|
109
|
-
newPlugins[key] = true
|
|
110
|
-
|
|
111
|
-
// Collect non-built-in marketplace sources (dedupe by marketplace name)
|
|
112
|
-
if (def.marketplaceSource && !newMarketplaces[def.marketplace]) {
|
|
113
|
-
newMarketplaces[def.marketplace] = { source: { ...def.marketplaceSource } }
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
const merged = {
|
|
118
|
-
...existing,
|
|
119
|
-
env: {
|
|
120
|
-
...(existing.env || {}),
|
|
121
|
-
...CLAUDE_CODE_ENV_DEFAULTS,
|
|
122
|
-
},
|
|
123
|
-
enabledPlugins: {
|
|
124
|
-
...(existing.enabledPlugins || {}),
|
|
125
|
-
...newPlugins,
|
|
126
|
-
},
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const enabledKeys = Object.keys(newPlugins)
|
|
130
|
-
const marketplaceNames = Object.keys(newMarketplaces)
|
|
131
|
-
|
|
132
|
-
// Only write extraKnownMarketplaces when there are non-built-in marketplaces
|
|
133
|
-
if (marketplaceNames.length > 0) {
|
|
134
|
-
merged.extraKnownMarketplaces = {
|
|
135
|
-
...(existing.extraKnownMarketplaces || {}),
|
|
136
|
-
...newMarketplaces,
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
await fse.ensureDir(path.dirname(settingsPath))
|
|
141
|
-
await fse.writeFile(settingsPath, JSON.stringify(merged, null, 2) + '\n', 'utf8')
|
|
142
|
-
|
|
143
|
-
logger.debug(`Claude Code: enabled ${enabledKeys.length} plugins in settings.json`)
|
|
144
|
-
if (marketplaceNames.length > 0) {
|
|
145
|
-
logger.debug(`Claude Code: registered ${marketplaceNames.length} extra marketplace(s): ${marketplaceNames.join(', ')}`)
|
|
146
|
-
}
|
|
147
|
-
return enabledKeys
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// ─── Trae Installation ──────────────────────────────────────────────────────
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Install a category of plugin markdown files with adapter transformation.
|
|
154
|
-
*
|
|
155
|
-
* @param {string} srcDir - Source directory containing .md files
|
|
156
|
-
* @param {string} destDir - Destination directory
|
|
157
|
-
* @param {Function} adapter - Content transform function (content, filename) => content
|
|
158
|
-
* @param {object} variables - Interpolation variables
|
|
159
|
-
* @returns {Promise<number>} Number of files installed
|
|
160
|
-
*/
|
|
161
|
-
async function installPluginCategory(srcDir, destDir, adapter, variables) {
|
|
162
|
-
if (!await fse.pathExists(srcDir)) return 0
|
|
163
|
-
|
|
164
|
-
await fse.ensureDir(destDir)
|
|
165
|
-
const files = await listFiles(srcDir)
|
|
166
|
-
let count = 0
|
|
167
|
-
|
|
168
|
-
for (const relPath of files) {
|
|
169
|
-
if (!relPath.endsWith('.md')) continue
|
|
170
|
-
const srcFile = path.join(srcDir, relPath)
|
|
171
|
-
let content = await fse.readFile(srcFile, 'utf8')
|
|
172
|
-
content = interpolate(content, variables)
|
|
173
|
-
|
|
174
|
-
const destName = `${path.basename(relPath, '.md')}.md`
|
|
175
|
-
content = adapter(content, destName)
|
|
176
|
-
await fse.writeFile(path.join(destDir, destName), content, 'utf8')
|
|
177
|
-
count++
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
return count
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Install plugins for Trae by extracting skills/commands/agents.
|
|
185
|
-
*
|
|
186
|
-
* @param {Array<{ id: string, def: object, templateDir: string }>} plugins - Resolved plugins with template paths
|
|
187
|
-
* @param {string} targetDir - Project root directory
|
|
188
|
-
* @param {object} variables - Interpolation variables
|
|
189
|
-
* @param {object} logger - Logger instance
|
|
190
|
-
* @returns {Promise<{ files: number, details: Array<{ id: string, skills: number, commands: number, agents: number }> }>}
|
|
191
|
-
*/
|
|
192
|
-
export async function installForTrae(plugins, targetDir, variables, logger) {
|
|
193
|
-
let totalFiles = 0
|
|
194
|
-
const details = []
|
|
195
|
-
|
|
196
|
-
for (const { id, templateDir } of plugins) {
|
|
197
|
-
try {
|
|
198
|
-
const counts = { skills: 0, commands: 0, agents: 0 }
|
|
199
|
-
|
|
200
|
-
// Skills → .trae/skills/<pluginId>/ (direct copy + interpolation)
|
|
201
|
-
const skillsSrc = path.join(templateDir, 'skills')
|
|
202
|
-
if (await fse.pathExists(skillsSrc)) {
|
|
203
|
-
const skillsDest = path.join(targetDir, '.trae', 'skills', id)
|
|
204
|
-
counts.skills = await copyWithInterpolation(skillsSrc, skillsDest, variables)
|
|
205
|
-
totalFiles += counts.skills
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
// Commands → .trae/rules/<pluginId>/commands/<name>.md (with adapter)
|
|
209
|
-
counts.commands = await installPluginCategory(
|
|
210
|
-
path.join(templateDir, 'commands'),
|
|
211
|
-
path.join(targetDir, '.trae', 'rules', id, 'commands'),
|
|
212
|
-
convertCommandForTrae,
|
|
213
|
-
variables
|
|
214
|
-
)
|
|
215
|
-
totalFiles += counts.commands
|
|
216
|
-
|
|
217
|
-
// Agents → .trae/rules/<pluginId>/agents/<name>.md (with adapter)
|
|
218
|
-
counts.agents = await installPluginCategory(
|
|
219
|
-
path.join(templateDir, 'agents'),
|
|
220
|
-
path.join(targetDir, '.trae', 'rules', id, 'agents'),
|
|
221
|
-
convertAgentForTrae,
|
|
222
|
-
variables
|
|
223
|
-
)
|
|
224
|
-
totalFiles += counts.agents
|
|
225
|
-
|
|
226
|
-
details.push({ id, ...counts })
|
|
227
|
-
logger.debug(` Trae plugin "${id}": ${counts.skills} skills, ${counts.commands} commands, ${counts.agents} agents`)
|
|
228
|
-
} catch (err) {
|
|
229
|
-
throw new Error(`Failed to install Trae content for plugin "${id}": ${err.message}`)
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
return { files: totalFiles, details }
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// ─── Main Entry ─────────────────────────────────────────────────────────────
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* Install plugins for all selected IDEs.
|
|
240
|
-
*
|
|
241
|
-
* @param {{
|
|
242
|
-
* plugins: Array<{ id: string, def: object, templateDir: string }>,
|
|
243
|
-
* targetDir: string,
|
|
244
|
-
* ides: string[],
|
|
245
|
-
* variables: object,
|
|
246
|
-
* logger: object
|
|
247
|
-
* }} opts
|
|
248
|
-
* @returns {Promise<{ claudeCode: string[], trae: object, installed: string[] }>}
|
|
249
|
-
*/
|
|
250
|
-
export async function installPlugins({ plugins, targetDir, ides, variables, logger }) {
|
|
251
|
-
const result = { claudeCode: [], trae: { files: 0, details: [] }, installed: [] }
|
|
252
|
-
|
|
253
|
-
// Claude Code: write settings.json (env defaults + plugin IDs + marketplace sources)
|
|
254
|
-
if (ides.includes('claude-code')) {
|
|
255
|
-
result.claudeCode = await installForClaudeCode(plugins, targetDir, logger)
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// Trae: extract content from plugins that have templates
|
|
259
|
-
if (ides.includes('trae') && plugins.length > 0) {
|
|
260
|
-
const available = []
|
|
261
|
-
for (const p of plugins) {
|
|
262
|
-
if (await fse.pathExists(p.templateDir)) {
|
|
263
|
-
available.push(p)
|
|
264
|
-
} else {
|
|
265
|
-
logger.warn(`Plugin "${p.id}" template not found at ${p.templateDir}, skipping Trae extraction`)
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
if (available.length > 0) {
|
|
270
|
-
result.trae = await installForTrae(available, targetDir, variables, logger)
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
// Track all plugins as installed (settings.json counts even without templates)
|
|
275
|
-
result.installed = plugins.map(p => p.id)
|
|
276
|
-
return result
|
|
277
|
-
}
|
|
278
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Plugin installer — handles distributing plugins to Claude Code and Trae.
|
|
3
|
+
*
|
|
4
|
+
* Claude Code: writes plugin IDs into `.claude/settings.json` enabledPlugins.
|
|
5
|
+
* Trae: extracts skills/commands/agents from plugin templates into `.trae/`.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import path from 'node:path'
|
|
9
|
+
import fse from 'fs-extra'
|
|
10
|
+
import { listFiles, copyWithInterpolation, interpolate } from '../utils/fs.js'
|
|
11
|
+
import { convertAgentForTrae, convertCommandForTrae } from '../adapters/trae-adapter.js'
|
|
12
|
+
|
|
13
|
+
// ─── Claude Code Base Settings ──────────────────────────────────────────────
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Default environment overrides written to `.claude/settings.json`.
|
|
17
|
+
* These disable telemetry, error reporting, and the /bug command.
|
|
18
|
+
*/
|
|
19
|
+
const CLAUDE_CODE_ENV_DEFAULTS = {
|
|
20
|
+
DISABLE_BUG_COMMAND: '1',
|
|
21
|
+
DISABLE_ERROR_REPORTING: '1',
|
|
22
|
+
DISABLE_TELEMETRY: '1',
|
|
23
|
+
MCP_TIMEOUT: '60000',
|
|
24
|
+
MAX_THINKING_TOKENS: '31999',
|
|
25
|
+
CLAUDE_CODE_MAX_OUTPUT_TOKENS: '64000',
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// ─── Plugin Resolution ──────────────────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Get plugin IDs marked as default in the registry.
|
|
32
|
+
*
|
|
33
|
+
* @param {object} registry - Registry object with plugins section
|
|
34
|
+
* @returns {string[]} Default plugin IDs
|
|
35
|
+
*/
|
|
36
|
+
export function getDefaultPlugins(registry) {
|
|
37
|
+
const plugins = registry.plugins || {}
|
|
38
|
+
return Object.entries(plugins)
|
|
39
|
+
.filter(([, def]) => def.default)
|
|
40
|
+
.map(([id]) => id)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Resolve requested plugin IDs to plugin definitions with constructed template paths.
|
|
45
|
+
* Note: Template directory existence is validated later by installPlugins().
|
|
46
|
+
*
|
|
47
|
+
* @param {object} registry - Registry object
|
|
48
|
+
* @param {string[]} pluginIds - Requested plugin IDs
|
|
49
|
+
* @param {string} templateBase - Absolute path to cckit templates/ directory
|
|
50
|
+
* @param {object} logger - Logger instance
|
|
51
|
+
* @returns {{ found: Array<{ id: string, def: object, templateDir: string }>, skipped: Array<{ id: string, reason: string }> }}
|
|
52
|
+
*/
|
|
53
|
+
export function resolvePlugins(registry, pluginIds, templateBase, logger) {
|
|
54
|
+
const plugins = registry.plugins || {}
|
|
55
|
+
const found = []
|
|
56
|
+
const skipped = []
|
|
57
|
+
|
|
58
|
+
for (const id of pluginIds) {
|
|
59
|
+
const def = plugins[id]
|
|
60
|
+
if (!def) {
|
|
61
|
+
logger.warn(`Plugin "${id}" not found in registry, skipping`)
|
|
62
|
+
skipped.push({ id, reason: 'not in registry' })
|
|
63
|
+
continue
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const templateDir = path.join(templateBase, 'plugins', id)
|
|
67
|
+
found.push({ id, def, templateDir })
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return { found, skipped }
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// ─── Claude Code Installation ───────────────────────────────────────────────
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Install plugins for Claude Code by writing enabledPlugins and
|
|
77
|
+
* extraKnownMarketplaces (for non-built-in marketplaces) to settings.json.
|
|
78
|
+
*
|
|
79
|
+
* Plugins with a `marketplaceSource` field in their registry definition will
|
|
80
|
+
* have their marketplace source added to `extraKnownMarketplaces`, enabling
|
|
81
|
+
* Claude Code to auto-prompt users for marketplace trust and plugin installation.
|
|
82
|
+
*
|
|
83
|
+
* @param {Array<{ id: string, def: object }>} plugins - Resolved plugins
|
|
84
|
+
* @param {string} targetDir - Project root directory
|
|
85
|
+
* @param {object} logger - Logger instance
|
|
86
|
+
* @returns {Promise<string[]>} List of enabled plugin keys
|
|
87
|
+
*/
|
|
88
|
+
export async function installForClaudeCode(plugins, targetDir, logger) {
|
|
89
|
+
const settingsPath = path.join(targetDir, '.claude', 'settings.json')
|
|
90
|
+
let existing = {}
|
|
91
|
+
|
|
92
|
+
try {
|
|
93
|
+
if (await fse.pathExists(settingsPath)) {
|
|
94
|
+
const raw = await fse.readFile(settingsPath, 'utf8')
|
|
95
|
+
existing = JSON.parse(raw)
|
|
96
|
+
}
|
|
97
|
+
} catch (err) {
|
|
98
|
+
logger.warn(`settings.json parse error, backing up and recreating: ${err.message}`)
|
|
99
|
+
const backupPath = `${settingsPath}.bak.${Date.now()}`
|
|
100
|
+
await fse.copy(settingsPath, backupPath)
|
|
101
|
+
existing = {}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const newPlugins = {}
|
|
105
|
+
const newMarketplaces = {}
|
|
106
|
+
|
|
107
|
+
for (const { id, def } of plugins) {
|
|
108
|
+
const key = `${id}@${def.marketplace}`
|
|
109
|
+
newPlugins[key] = true
|
|
110
|
+
|
|
111
|
+
// Collect non-built-in marketplace sources (dedupe by marketplace name)
|
|
112
|
+
if (def.marketplaceSource && !newMarketplaces[def.marketplace]) {
|
|
113
|
+
newMarketplaces[def.marketplace] = { source: { ...def.marketplaceSource } }
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const merged = {
|
|
118
|
+
...existing,
|
|
119
|
+
env: {
|
|
120
|
+
...(existing.env || {}),
|
|
121
|
+
...CLAUDE_CODE_ENV_DEFAULTS,
|
|
122
|
+
},
|
|
123
|
+
enabledPlugins: {
|
|
124
|
+
...(existing.enabledPlugins || {}),
|
|
125
|
+
...newPlugins,
|
|
126
|
+
},
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const enabledKeys = Object.keys(newPlugins)
|
|
130
|
+
const marketplaceNames = Object.keys(newMarketplaces)
|
|
131
|
+
|
|
132
|
+
// Only write extraKnownMarketplaces when there are non-built-in marketplaces
|
|
133
|
+
if (marketplaceNames.length > 0) {
|
|
134
|
+
merged.extraKnownMarketplaces = {
|
|
135
|
+
...(existing.extraKnownMarketplaces || {}),
|
|
136
|
+
...newMarketplaces,
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
await fse.ensureDir(path.dirname(settingsPath))
|
|
141
|
+
await fse.writeFile(settingsPath, JSON.stringify(merged, null, 2) + '\n', 'utf8')
|
|
142
|
+
|
|
143
|
+
logger.debug(`Claude Code: enabled ${enabledKeys.length} plugins in settings.json`)
|
|
144
|
+
if (marketplaceNames.length > 0) {
|
|
145
|
+
logger.debug(`Claude Code: registered ${marketplaceNames.length} extra marketplace(s): ${marketplaceNames.join(', ')}`)
|
|
146
|
+
}
|
|
147
|
+
return enabledKeys
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ─── Trae Installation ──────────────────────────────────────────────────────
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Install a category of plugin markdown files with adapter transformation.
|
|
154
|
+
*
|
|
155
|
+
* @param {string} srcDir - Source directory containing .md files
|
|
156
|
+
* @param {string} destDir - Destination directory
|
|
157
|
+
* @param {Function} adapter - Content transform function (content, filename) => content
|
|
158
|
+
* @param {object} variables - Interpolation variables
|
|
159
|
+
* @returns {Promise<number>} Number of files installed
|
|
160
|
+
*/
|
|
161
|
+
async function installPluginCategory(srcDir, destDir, adapter, variables) {
|
|
162
|
+
if (!await fse.pathExists(srcDir)) return 0
|
|
163
|
+
|
|
164
|
+
await fse.ensureDir(destDir)
|
|
165
|
+
const files = await listFiles(srcDir)
|
|
166
|
+
let count = 0
|
|
167
|
+
|
|
168
|
+
for (const relPath of files) {
|
|
169
|
+
if (!relPath.endsWith('.md')) continue
|
|
170
|
+
const srcFile = path.join(srcDir, relPath)
|
|
171
|
+
let content = await fse.readFile(srcFile, 'utf8')
|
|
172
|
+
content = interpolate(content, variables)
|
|
173
|
+
|
|
174
|
+
const destName = `${path.basename(relPath, '.md')}.md`
|
|
175
|
+
content = adapter(content, destName)
|
|
176
|
+
await fse.writeFile(path.join(destDir, destName), content, 'utf8')
|
|
177
|
+
count++
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return count
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Install plugins for Trae by extracting skills/commands/agents.
|
|
185
|
+
*
|
|
186
|
+
* @param {Array<{ id: string, def: object, templateDir: string }>} plugins - Resolved plugins with template paths
|
|
187
|
+
* @param {string} targetDir - Project root directory
|
|
188
|
+
* @param {object} variables - Interpolation variables
|
|
189
|
+
* @param {object} logger - Logger instance
|
|
190
|
+
* @returns {Promise<{ files: number, details: Array<{ id: string, skills: number, commands: number, agents: number }> }>}
|
|
191
|
+
*/
|
|
192
|
+
export async function installForTrae(plugins, targetDir, variables, logger) {
|
|
193
|
+
let totalFiles = 0
|
|
194
|
+
const details = []
|
|
195
|
+
|
|
196
|
+
for (const { id, templateDir } of plugins) {
|
|
197
|
+
try {
|
|
198
|
+
const counts = { skills: 0, commands: 0, agents: 0 }
|
|
199
|
+
|
|
200
|
+
// Skills → .trae/skills/<pluginId>/ (direct copy + interpolation)
|
|
201
|
+
const skillsSrc = path.join(templateDir, 'skills')
|
|
202
|
+
if (await fse.pathExists(skillsSrc)) {
|
|
203
|
+
const skillsDest = path.join(targetDir, '.trae', 'skills', id)
|
|
204
|
+
counts.skills = await copyWithInterpolation(skillsSrc, skillsDest, variables)
|
|
205
|
+
totalFiles += counts.skills
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Commands → .trae/rules/<pluginId>/commands/<name>.md (with adapter)
|
|
209
|
+
counts.commands = await installPluginCategory(
|
|
210
|
+
path.join(templateDir, 'commands'),
|
|
211
|
+
path.join(targetDir, '.trae', 'rules', id, 'commands'),
|
|
212
|
+
convertCommandForTrae,
|
|
213
|
+
variables
|
|
214
|
+
)
|
|
215
|
+
totalFiles += counts.commands
|
|
216
|
+
|
|
217
|
+
// Agents → .trae/rules/<pluginId>/agents/<name>.md (with adapter)
|
|
218
|
+
counts.agents = await installPluginCategory(
|
|
219
|
+
path.join(templateDir, 'agents'),
|
|
220
|
+
path.join(targetDir, '.trae', 'rules', id, 'agents'),
|
|
221
|
+
convertAgentForTrae,
|
|
222
|
+
variables
|
|
223
|
+
)
|
|
224
|
+
totalFiles += counts.agents
|
|
225
|
+
|
|
226
|
+
details.push({ id, ...counts })
|
|
227
|
+
logger.debug(` Trae plugin "${id}": ${counts.skills} skills, ${counts.commands} commands, ${counts.agents} agents`)
|
|
228
|
+
} catch (err) {
|
|
229
|
+
throw new Error(`Failed to install Trae content for plugin "${id}": ${err.message}`)
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return { files: totalFiles, details }
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// ─── Main Entry ─────────────────────────────────────────────────────────────
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Install plugins for all selected IDEs.
|
|
240
|
+
*
|
|
241
|
+
* @param {{
|
|
242
|
+
* plugins: Array<{ id: string, def: object, templateDir: string }>,
|
|
243
|
+
* targetDir: string,
|
|
244
|
+
* ides: string[],
|
|
245
|
+
* variables: object,
|
|
246
|
+
* logger: object
|
|
247
|
+
* }} opts
|
|
248
|
+
* @returns {Promise<{ claudeCode: string[], trae: object, installed: string[] }>}
|
|
249
|
+
*/
|
|
250
|
+
export async function installPlugins({ plugins, targetDir, ides, variables, logger }) {
|
|
251
|
+
const result = { claudeCode: [], trae: { files: 0, details: [] }, installed: [] }
|
|
252
|
+
|
|
253
|
+
// Claude Code: write settings.json (env defaults + plugin IDs + marketplace sources)
|
|
254
|
+
if (ides.includes('claude-code')) {
|
|
255
|
+
result.claudeCode = await installForClaudeCode(plugins, targetDir, logger)
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Trae: extract content from plugins that have templates
|
|
259
|
+
if (ides.includes('trae') && plugins.length > 0) {
|
|
260
|
+
const available = []
|
|
261
|
+
for (const p of plugins) {
|
|
262
|
+
if (await fse.pathExists(p.templateDir)) {
|
|
263
|
+
available.push(p)
|
|
264
|
+
} else {
|
|
265
|
+
logger.warn(`Plugin "${p.id}" template not found at ${p.templateDir}, skipping Trae extraction`)
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if (available.length > 0) {
|
|
270
|
+
result.trae = await installForTrae(available, targetDir, variables, logger)
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Track all plugins as installed (settings.json counts even without templates)
|
|
275
|
+
result.installed = plugins.map(p => p.id)
|
|
276
|
+
return result
|
|
277
|
+
}
|
|
278
|
+
|