bmalph 1.0.0 → 2.2.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 -0
- package/README.md +398 -217
- package/bmad/bmm/agents/analyst.agent.yaml +43 -36
- package/bmad/bmm/agents/architect.agent.yaml +29 -28
- package/bmad/bmm/agents/dev.agent.yaml +38 -38
- package/bmad/bmm/agents/pm.agent.yaml +44 -46
- package/bmad/bmm/agents/qa.agent.yaml +58 -0
- package/bmad/bmm/agents/quick-flow-solo-dev.agent.yaml +32 -32
- package/bmad/bmm/agents/sm.agent.yaml +37 -36
- package/bmad/bmm/agents/tech-writer/tech-writer-sidecar/documentation-standards.md +223 -223
- package/bmad/bmm/agents/tech-writer/tech-writer.agent.yaml +46 -45
- package/bmad/bmm/agents/ux-designer.agent.yaml +27 -26
- package/bmad/bmm/data/project-context-template.md +26 -26
- package/bmad/bmm/module-help.csv +31 -31
- package/bmad/bmm/module.yaml +50 -44
- package/bmad/bmm/teams/default-party.csv +20 -21
- package/bmad/bmm/teams/team-fullstack.yaml +12 -12
- package/bmad/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -10
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -177
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -161
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -199
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -202
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -205
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -219
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +162 -162
- package/bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md +57 -58
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -137
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -229
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -238
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -206
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -234
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +443 -443
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -182
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -237
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -249
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -259
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -177
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +475 -475
- package/bmad/bmm/workflows/1-analysis/research/research.template.md +29 -29
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -137
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -239
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -248
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -202
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +233 -239
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +486 -486
- package/bmad/bmm/workflows/1-analysis/research/workflow-domain-research.md +54 -0
- package/bmad/bmm/workflows/1-analysis/research/workflow-market-research.md +54 -0
- package/bmad/bmm/workflows/1-analysis/research/workflow-technical-research.md +54 -0
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/data/domain-complexity.csv +14 -12
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/data/prd-purpose.md +197 -197
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/data/project-types.csv +10 -10
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-01-init.md +191 -191
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-01b-continue.md +153 -153
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-02-discovery.md +224 -224
- package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02b-vision.md +154 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02c-executive-summary.md +170 -0
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-03-success.md +226 -226
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-04-journeys.md +213 -213
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-05-domain.md +207 -207
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-06-innovation.md +226 -226
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-07-project-type.md +237 -237
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-08-scoping.md +228 -228
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-09-functional.md +231 -231
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-10-nonfunctional.md +242 -242
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-11-polish.md +217 -217
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-c/step-12-complete.md +124 -124
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-e/step-e-01-discovery.md +247 -247
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-e/step-e-01b-legacy-conversion.md +208 -208
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-e/step-e-02-review.md +249 -249
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-e/step-e-03-edit.md +253 -253
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-e/step-e-04-complete.md +168 -168
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-01-discovery.md +226 -218
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-02-format-detection.md +191 -191
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-02b-parity-check.md +209 -209
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-03-density-validation.md +174 -174
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-04-brief-coverage-validation.md +214 -214
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-05-measurability-validation.md +228 -228
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-06-traceability-validation.md +217 -217
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-07-implementation-leakage-validation.md +205 -205
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-08-domain-compliance-validation.md +243 -243
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-09-project-type-validation.md +263 -263
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-10-smart-validation.md +209 -209
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-11-holistic-quality-validation.md +264 -264
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-12-completeness-validation.md +242 -242
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/steps-v/step-v-13-report-complete.md +231 -231
- package/bmad/bmm/workflows/2-plan-workflows/{prd → create-prd}/templates/prd-template.md +10 -10
- package/bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md +63 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-edit-prd.md +65 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +63 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -135
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -127
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -190
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -216
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -219
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -234
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -252
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -254
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -224
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -224
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -241
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -248
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -237
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -264
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +171 -171
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -13
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +42 -43
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +184 -190
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +172 -178
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +173 -179
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +133 -139
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +245 -252
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +129 -135
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -4
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +54 -55
- package/bmad/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -12
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +12 -10
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +6 -6
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -153
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +164 -164
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -224
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +331 -331
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -318
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -359
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -379
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -359
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +76 -76
- package/bmad/bmm/workflows/3-solutioning/create-architecture/workflow.md +49 -50
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -259
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -233
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -272
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +149 -149
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -57
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +58 -59
- package/bmad/bmm/workflows/4-implementation/code-review/checklist.md +23 -23
- package/bmad/bmm/workflows/4-implementation/code-review/instructions.xml +226 -226
- package/bmad/bmm/workflows/4-implementation/code-review/workflow.yaml +44 -51
- package/bmad/bmm/workflows/4-implementation/correct-course/checklist.md +288 -288
- package/bmad/bmm/workflows/4-implementation/correct-course/instructions.md +207 -206
- package/bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml +54 -60
- package/bmad/bmm/workflows/4-implementation/create-story/checklist.md +358 -358
- package/bmad/bmm/workflows/4-implementation/create-story/instructions.xml +346 -345
- package/bmad/bmm/workflows/4-implementation/create-story/template.md +49 -49
- package/bmad/bmm/workflows/4-implementation/create-story/workflow.yaml +53 -61
- package/bmad/bmm/workflows/4-implementation/dev-story/checklist.md +80 -80
- package/bmad/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -410
- package/bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml +21 -27
- package/bmad/bmm/workflows/4-implementation/retrospective/instructions.md +1444 -1443
- package/bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml +53 -58
- package/bmad/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -33
- package/bmad/bmm/workflows/4-implementation/sprint-planning/instructions.md +226 -225
- package/bmad/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -55
- package/bmad/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +47 -54
- package/bmad/bmm/workflows/4-implementation/sprint-status/instructions.md +230 -229
- package/bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml +25 -36
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +174 -156
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +118 -120
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +111 -113
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +111 -113
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +104 -106
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +146 -140
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -50
- package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +191 -189
- package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +144 -144
- package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +127 -128
- package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +200 -191
- package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -74
- package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -79
- package/bmad/bmm/workflows/document-project/checklist.md +245 -245
- package/bmad/bmm/workflows/document-project/documentation-requirements.csv +12 -12
- package/bmad/bmm/workflows/document-project/instructions.md +130 -221
- package/bmad/bmm/workflows/document-project/templates/deep-dive-template.md +345 -345
- package/bmad/bmm/workflows/document-project/templates/index-template.md +169 -169
- package/bmad/bmm/workflows/document-project/templates/project-overview-template.md +103 -103
- package/bmad/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -160
- package/bmad/bmm/workflows/document-project/templates/source-tree-template.md +135 -135
- package/bmad/bmm/workflows/document-project/workflow.yaml +22 -30
- package/bmad/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -298
- package/bmad/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -31
- package/bmad/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -1106
- package/bmad/bmm/workflows/document-project/workflows/full-scan.yaml +31 -31
- package/bmad/bmm/workflows/generate-project-context/project-context-template.md +21 -0
- package/bmad/bmm/workflows/generate-project-context/steps/step-01-discover.md +184 -0
- package/bmad/bmm/workflows/generate-project-context/steps/step-02-generate.md +318 -0
- package/bmad/bmm/workflows/generate-project-context/steps/step-03-complete.md +278 -0
- package/bmad/bmm/workflows/generate-project-context/workflow.md +49 -0
- package/bmad/bmm/workflows/qa/automate/checklist.md +33 -0
- package/bmad/bmm/workflows/qa/automate/instructions.md +110 -0
- package/bmad/bmm/workflows/qa/automate/workflow.yaml +44 -0
- package/bmad/core/agents/bmad-master.agent.yaml +30 -30
- package/bmad/core/module-help.csv +9 -11
- package/bmad/core/module.yaml +25 -25
- package/bmad/core/tasks/editorial-review-prose.xml +102 -91
- package/bmad/core/tasks/editorial-review-structure.xml +209 -198
- package/bmad/core/tasks/help.md +85 -0
- package/bmad/core/tasks/index-docs.xml +64 -64
- package/bmad/core/tasks/review-adversarial-general.xml +48 -48
- package/bmad/core/tasks/shard-doc.xml +107 -108
- package/bmad/core/tasks/workflow.xml +234 -234
- package/bmad/core/workflows/advanced-elicitation/methods.csv +51 -51
- package/bmad/core/workflows/advanced-elicitation/workflow.xml +116 -116
- package/bmad/core/workflows/brainstorming/brain-methods.csv +61 -61
- package/bmad/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -197
- package/bmad/core/workflows/brainstorming/steps/step-01b-continue.md +122 -122
- package/bmad/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -225
- package/bmad/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -237
- package/bmad/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -209
- package/bmad/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -264
- package/bmad/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -399
- package/bmad/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -303
- package/bmad/core/workflows/brainstorming/template.md +15 -15
- package/bmad/core/workflows/brainstorming/workflow.md +58 -58
- package/bmad/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -138
- package/bmad/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -187
- package/bmad/core/workflows/party-mode/steps/step-03-graceful-exit.md +168 -157
- package/bmad/core/workflows/party-mode/workflow.md +194 -194
- package/bundled-versions.json +3 -0
- package/dist/cli.js +61 -6
- package/dist/commands/check-updates.d.ts +5 -0
- package/dist/commands/check-updates.js +63 -0
- package/dist/commands/doctor.d.ts +39 -1
- package/dist/commands/doctor.js +348 -79
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +41 -15
- package/dist/commands/status.d.ts +7 -1
- package/dist/commands/status.js +111 -42
- package/dist/commands/upgrade.d.ts +7 -1
- package/dist/commands/upgrade.js +43 -12
- package/dist/installer.d.ts +19 -2
- package/dist/installer.js +305 -66
- package/dist/transition/artifacts.d.ts +2 -0
- package/dist/transition/artifacts.js +46 -0
- package/dist/transition/context.d.ts +19 -0
- package/dist/transition/context.js +261 -0
- package/dist/transition/fix-plan.d.ts +15 -0
- package/dist/transition/fix-plan.js +94 -0
- package/dist/transition/index.d.ts +9 -0
- package/dist/transition/index.js +16 -0
- package/dist/transition/orchestration.d.ts +2 -0
- package/dist/transition/orchestration.js +243 -0
- package/dist/transition/specs-changelog.d.ts +3 -0
- package/dist/transition/specs-changelog.js +75 -0
- package/dist/transition/specs-index.d.ts +22 -0
- package/dist/transition/specs-index.js +157 -0
- package/dist/transition/story-parsing.d.ts +7 -0
- package/dist/transition/story-parsing.js +124 -0
- package/dist/transition/tech-stack.d.ts +3 -0
- package/dist/transition/tech-stack.js +79 -0
- package/dist/transition/types.d.ts +60 -0
- package/dist/transition/types.js +1 -0
- package/dist/utils/config.d.ts +4 -0
- package/dist/utils/config.js +14 -4
- package/dist/utils/constants.d.ts +70 -0
- package/dist/utils/constants.js +97 -0
- package/dist/utils/dryrun.d.ts +7 -0
- package/dist/utils/dryrun.js +48 -0
- package/dist/utils/errors.d.ts +63 -0
- package/dist/utils/errors.js +86 -0
- package/dist/utils/file-system.d.ts +24 -0
- package/dist/utils/file-system.js +99 -0
- package/dist/utils/github.d.ts +83 -0
- package/dist/utils/github.js +230 -0
- package/dist/utils/json.js +3 -3
- package/dist/utils/logger.d.ts +6 -0
- package/dist/utils/logger.js +27 -0
- package/dist/utils/state.d.ts +4 -7
- package/dist/utils/state.js +147 -26
- package/dist/utils/validate.d.ts +40 -0
- package/dist/utils/validate.js +175 -1
- package/package.json +75 -59
- package/ralph/RALPH-REFERENCE.md +412 -0
- package/ralph/lib/circuit_breaker.sh +463 -330
- package/ralph/lib/date_utils.sh +104 -53
- package/ralph/lib/enable_core.sh +815 -0
- package/ralph/lib/response_analyzer.sh +884 -768
- package/ralph/lib/task_sources.sh +577 -0
- package/ralph/lib/timeout_utils.sh +145 -145
- package/ralph/lib/wizard_utils.sh +547 -0
- package/ralph/ralph_import.sh +636 -0
- package/ralph/ralph_loop.sh +1793 -1391
- package/ralph/ralph_monitor.sh +125 -0
- package/ralph/templates/AGENT.md +158 -158
- package/ralph/templates/PROMPT.md +285 -292
- package/ralph/templates/fix_plan.md +27 -27
- package/ralph/templates/ralphrc.template +102 -0
- package/ralph/templates/specs/.gitkeep +1 -1
- package/slash-commands/advanced-elicitation.md +1 -1
- package/slash-commands/adversarial-review.md +1 -1
- package/slash-commands/analyst.md +1 -1
- package/slash-commands/architect.md +1 -1
- package/slash-commands/bmad-help.md +1 -1
- package/slash-commands/bmalph-implement.md +152 -152
- package/slash-commands/brainstorm-project.md +1 -1
- package/slash-commands/brainstorming.md +1 -1
- package/slash-commands/correct-course.md +1 -1
- package/slash-commands/create-architecture.md +1 -1
- package/slash-commands/create-brief.md +1 -1
- package/slash-commands/create-epics-stories.md +1 -1
- package/slash-commands/create-prd.md +1 -1
- package/slash-commands/create-story.md +1 -1
- package/slash-commands/create-ux.md +1 -1
- package/slash-commands/dev.md +1 -1
- package/slash-commands/document-project.md +1 -1
- package/slash-commands/domain-research.md +1 -1
- package/slash-commands/editorial-prose.md +1 -1
- package/slash-commands/editorial-structure.md +1 -1
- package/slash-commands/execute-workflow.md +1 -1
- package/slash-commands/generate-project-context.md +1 -0
- package/slash-commands/implementation-readiness.md +1 -1
- package/slash-commands/index-docs.md +1 -1
- package/slash-commands/market-research.md +1 -1
- package/slash-commands/party-mode.md +1 -1
- package/slash-commands/pm.md +1 -1
- package/slash-commands/qa-automate.md +1 -0
- package/slash-commands/qa.md +1 -0
- package/slash-commands/quick-dev.md +1 -1
- package/slash-commands/quick-flow-solo-dev.md +1 -1
- package/slash-commands/retrospective.md +1 -1
- package/slash-commands/shard-doc.md +1 -1
- package/slash-commands/sm.md +1 -1
- package/slash-commands/sprint-planning.md +1 -1
- package/slash-commands/sprint-status.md +1 -1
- package/slash-commands/tech-spec.md +1 -1
- package/slash-commands/tech-writer.md +1 -0
- package/slash-commands/technical-research.md +1 -1
- package/slash-commands/ux-designer.md +1 -1
- package/slash-commands/validate-architecture.md +1 -1
- package/slash-commands/validate-brief.md +1 -1
- package/slash-commands/validate-epics-stories.md +1 -1
- package/slash-commands/validate-prd.md +1 -1
- package/slash-commands/validate-story.md +1 -1
- package/slash-commands/validate-ux.md +1 -1
- package/bmad/bmm/agents/tea.agent.yaml +0 -63
- package/bmad/bmm/sub-modules/claude-code/config.yaml +0 -4
- package/bmad/bmm/sub-modules/claude-code/injections.yaml +0 -242
- package/bmad/bmm/sub-modules/claude-code/readme.md +0 -87
- package/bmad/bmm/testarch/knowledge/adr-quality-readiness-checklist.md +0 -350
- package/bmad/bmm/testarch/knowledge/api-request.md +0 -442
- package/bmad/bmm/testarch/knowledge/api-testing-patterns.md +0 -843
- package/bmad/bmm/testarch/knowledge/auth-session.md +0 -552
- package/bmad/bmm/testarch/knowledge/burn-in.md +0 -273
- package/bmad/bmm/testarch/knowledge/ci-burn-in.md +0 -675
- package/bmad/bmm/testarch/knowledge/component-tdd.md +0 -486
- package/bmad/bmm/testarch/knowledge/contract-testing.md +0 -957
- package/bmad/bmm/testarch/knowledge/data-factories.md +0 -500
- package/bmad/bmm/testarch/knowledge/email-auth.md +0 -721
- package/bmad/bmm/testarch/knowledge/error-handling.md +0 -725
- package/bmad/bmm/testarch/knowledge/feature-flags.md +0 -750
- package/bmad/bmm/testarch/knowledge/file-utils.md +0 -463
- package/bmad/bmm/testarch/knowledge/fixture-architecture.md +0 -401
- package/bmad/bmm/testarch/knowledge/fixtures-composition.md +0 -382
- package/bmad/bmm/testarch/knowledge/intercept-network-call.md +0 -430
- package/bmad/bmm/testarch/knowledge/log.md +0 -429
- package/bmad/bmm/testarch/knowledge/network-error-monitor.md +0 -405
- package/bmad/bmm/testarch/knowledge/network-first.md +0 -486
- package/bmad/bmm/testarch/knowledge/network-recorder.md +0 -527
- package/bmad/bmm/testarch/knowledge/nfr-criteria.md +0 -670
- package/bmad/bmm/testarch/knowledge/overview.md +0 -286
- package/bmad/bmm/testarch/knowledge/playwright-config.md +0 -730
- package/bmad/bmm/testarch/knowledge/probability-impact.md +0 -601
- package/bmad/bmm/testarch/knowledge/recurse.md +0 -421
- package/bmad/bmm/testarch/knowledge/risk-governance.md +0 -615
- package/bmad/bmm/testarch/knowledge/selective-testing.md +0 -732
- package/bmad/bmm/testarch/knowledge/selector-resilience.md +0 -527
- package/bmad/bmm/testarch/knowledge/test-healing-patterns.md +0 -644
- package/bmad/bmm/testarch/knowledge/test-levels-framework.md +0 -473
- package/bmad/bmm/testarch/knowledge/test-priorities-matrix.md +0 -373
- package/bmad/bmm/testarch/knowledge/test-quality.md +0 -664
- package/bmad/bmm/testarch/knowledge/timing-debugging.md +0 -372
- package/bmad/bmm/testarch/knowledge/visual-debugging.md +0 -524
- package/bmad/bmm/testarch/tea-index.csv +0 -35
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +0 -200
- package/bmad/bmm/workflows/1-analysis/research/workflow.md +0 -173
- package/bmad/bmm/workflows/2-plan-workflows/prd/validation-report-prd-workflow.md +0 -433
- package/bmad/bmm/workflows/2-plan-workflows/prd/workflow.md +0 -150
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/data/project-levels.yaml +0 -59
- package/bmad/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-library.json +0 -90
- package/bmad/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-templates.yaml +0 -127
- package/bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/checklist.md +0 -39
- package/bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md +0 -130
- package/bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml +0 -27
- package/bmad/bmm/workflows/excalidraw-diagrams/create-diagram/checklist.md +0 -43
- package/bmad/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md +0 -141
- package/bmad/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml +0 -27
- package/bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/checklist.md +0 -49
- package/bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md +0 -241
- package/bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml +0 -27
- package/bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/checklist.md +0 -38
- package/bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md +0 -133
- package/bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml +0 -27
- package/bmad/bmm/workflows/testarch/atdd/atdd-checklist-template.md +0 -363
- package/bmad/bmm/workflows/testarch/atdd/checklist.md +0 -374
- package/bmad/bmm/workflows/testarch/atdd/instructions.md +0 -806
- package/bmad/bmm/workflows/testarch/atdd/workflow.yaml +0 -47
- package/bmad/bmm/workflows/testarch/automate/checklist.md +0 -582
- package/bmad/bmm/workflows/testarch/automate/instructions.md +0 -1324
- package/bmad/bmm/workflows/testarch/automate/workflow.yaml +0 -54
- package/bmad/bmm/workflows/testarch/ci/checklist.md +0 -247
- package/bmad/bmm/workflows/testarch/ci/github-actions-template.yaml +0 -198
- package/bmad/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +0 -149
- package/bmad/bmm/workflows/testarch/ci/instructions.md +0 -536
- package/bmad/bmm/workflows/testarch/ci/workflow.yaml +0 -47
- package/bmad/bmm/workflows/testarch/framework/checklist.md +0 -320
- package/bmad/bmm/workflows/testarch/framework/instructions.md +0 -481
- package/bmad/bmm/workflows/testarch/framework/workflow.yaml +0 -49
- package/bmad/bmm/workflows/testarch/nfr-assess/checklist.md +0 -407
- package/bmad/bmm/workflows/testarch/nfr-assess/instructions.md +0 -726
- package/bmad/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +0 -461
- package/bmad/bmm/workflows/testarch/nfr-assess/workflow.yaml +0 -49
- package/bmad/bmm/workflows/testarch/test-design/checklist.md +0 -407
- package/bmad/bmm/workflows/testarch/test-design/instructions.md +0 -1158
- package/bmad/bmm/workflows/testarch/test-design/test-design-architecture-template.md +0 -213
- package/bmad/bmm/workflows/testarch/test-design/test-design-qa-template.md +0 -286
- package/bmad/bmm/workflows/testarch/test-design/test-design-template.md +0 -294
- package/bmad/bmm/workflows/testarch/test-design/workflow.yaml +0 -71
- package/bmad/bmm/workflows/testarch/test-review/checklist.md +0 -472
- package/bmad/bmm/workflows/testarch/test-review/instructions.md +0 -628
- package/bmad/bmm/workflows/testarch/test-review/test-review-template.md +0 -390
- package/bmad/bmm/workflows/testarch/test-review/workflow.yaml +0 -48
- package/bmad/bmm/workflows/testarch/trace/checklist.md +0 -642
- package/bmad/bmm/workflows/testarch/trace/instructions.md +0 -1030
- package/bmad/bmm/workflows/testarch/trace/trace-template.md +0 -675
- package/bmad/bmm/workflows/testarch/trace/workflow.yaml +0 -57
- package/bmad/core/resources/excalidraw/README.md +0 -160
- package/bmad/core/resources/excalidraw/excalidraw-helpers.md +0 -127
- package/bmad/core/resources/excalidraw/library-loader.md +0 -50
- package/bmad/core/resources/excalidraw/validate-json-instructions.md +0 -79
- package/bmad/core/tasks/bmad-help.md +0 -62
- package/dist/commands/guide.d.ts +0 -1
- package/dist/commands/guide.js +0 -19
- package/dist/commands/implement.d.ts +0 -1
- package/dist/commands/implement.js +0 -83
- package/dist/commands/plan.d.ts +0 -5
- package/dist/commands/plan.js +0 -44
- package/dist/commands/reset.d.ts +0 -5
- package/dist/commands/reset.js +0 -35
- package/dist/commands/resume.d.ts +0 -1
- package/dist/commands/resume.js +0 -44
- package/dist/commands/start.d.ts +0 -5
- package/dist/commands/start.js +0 -54
- package/dist/transition.d.ts +0 -52
- package/dist/transition.js +0 -656
- package/slash-commands/atdd.md +0 -1
- package/slash-commands/continuous-integration.md +0 -1
- package/slash-commands/create-dataflow.md +0 -1
- package/slash-commands/create-diagram.md +0 -1
- package/slash-commands/create-flowchart.md +0 -1
- package/slash-commands/create-wireframe.md +0 -1
- package/slash-commands/nfr-assess.md +0 -1
- package/slash-commands/tea.md +0 -1
- package/slash-commands/test-automate.md +0 -1
- package/slash-commands/test-design.md +0 -1
- package/slash-commands/test-framework.md +0 -1
- package/slash-commands/test-review.md +0 -1
- package/slash-commands/test-trace.md +0 -1
- package/slash-commands/validate-test-design.md +0 -1
package/dist/installer.js
CHANGED
|
@@ -1,55 +1,109 @@
|
|
|
1
|
-
import { cp, mkdir, readFile, readdir,
|
|
1
|
+
import { cp, mkdir, readFile, readdir, rm, chmod, rename } from "fs/promises";
|
|
2
2
|
import { readFileSync } from "fs";
|
|
3
3
|
import { join, basename, dirname } from "path";
|
|
4
4
|
import { fileURLToPath } from "url";
|
|
5
|
+
import { debug, warn } from "./utils/logger.js";
|
|
6
|
+
import { formatError, isEnoent } from "./utils/errors.js";
|
|
7
|
+
import { exists, atomicWriteFile } from "./utils/file-system.js";
|
|
8
|
+
import { STATE_DIR, CONFIG_FILE } from "./utils/constants.js";
|
|
5
9
|
const __filename = fileURLToPath(import.meta.url);
|
|
6
10
|
const __dirname = dirname(__filename);
|
|
7
11
|
export function getPackageVersion() {
|
|
8
12
|
const pkgPath = join(__dirname, "..", "package.json");
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
try {
|
|
14
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
15
|
+
return pkg.version ?? "unknown";
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return "unknown";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function getBundledVersions() {
|
|
22
|
+
const versionsPath = join(__dirname, "..", "bundled-versions.json");
|
|
23
|
+
try {
|
|
24
|
+
const versions = JSON.parse(readFileSync(versionsPath, "utf-8"));
|
|
25
|
+
if (!versions || typeof versions.bmadCommit !== "string") {
|
|
26
|
+
throw new Error("Invalid bundled-versions.json structure: missing bmadCommit");
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
bmadCommit: versions.bmadCommit,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
if (err instanceof Error && err.message.includes("Invalid bundled-versions.json")) {
|
|
34
|
+
throw err;
|
|
35
|
+
}
|
|
36
|
+
throw new Error(`Failed to read bundled-versions.json at ${versionsPath}`, { cause: err });
|
|
37
|
+
}
|
|
11
38
|
}
|
|
12
|
-
export function
|
|
39
|
+
export function getBundledBmadDir() {
|
|
13
40
|
return join(__dirname, "..", "bmad");
|
|
14
41
|
}
|
|
15
|
-
export function
|
|
42
|
+
export function getBundledRalphDir() {
|
|
16
43
|
return join(__dirname, "..", "ralph");
|
|
17
44
|
}
|
|
18
45
|
export function getSlashCommandsDir() {
|
|
19
46
|
return join(__dirname, "..", "slash-commands");
|
|
20
47
|
}
|
|
48
|
+
const TEMPLATE_PLACEHOLDERS = {
|
|
49
|
+
"PROMPT.md": "[YOUR PROJECT NAME]",
|
|
50
|
+
"AGENT.md": "pip install -r requirements.txt",
|
|
51
|
+
};
|
|
52
|
+
async function isTemplateCustomized(filePath, templateName) {
|
|
53
|
+
const placeholder = TEMPLATE_PLACEHOLDERS[templateName];
|
|
54
|
+
if (!placeholder)
|
|
55
|
+
return false;
|
|
56
|
+
try {
|
|
57
|
+
const content = await readFile(filePath, "utf-8");
|
|
58
|
+
return !content.includes(placeholder);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
if (isEnoent(err))
|
|
62
|
+
return false;
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
21
66
|
export async function copyBundledAssets(projectDir) {
|
|
22
|
-
const bmadDir =
|
|
23
|
-
const ralphDir =
|
|
67
|
+
const bmadDir = getBundledBmadDir();
|
|
68
|
+
const ralphDir = getBundledRalphDir();
|
|
24
69
|
const slashCommandsDir = getSlashCommandsDir();
|
|
25
70
|
// Validate source directories exist
|
|
26
|
-
|
|
27
|
-
await access(bmadDir);
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
71
|
+
if (!(await exists(bmadDir))) {
|
|
30
72
|
throw new Error(`BMAD source directory not found at ${bmadDir}. Package may be corrupted.`);
|
|
31
73
|
}
|
|
32
|
-
|
|
33
|
-
await access(ralphDir);
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
74
|
+
if (!(await exists(ralphDir))) {
|
|
36
75
|
throw new Error(`Ralph source directory not found at ${ralphDir}. Package may be corrupted.`);
|
|
37
76
|
}
|
|
77
|
+
if (!(await exists(slashCommandsDir))) {
|
|
78
|
+
throw new Error(`Slash commands directory not found at ${slashCommandsDir}. Package may be corrupted.`);
|
|
79
|
+
}
|
|
80
|
+
// Atomic copy: write to temp dir, then swap with old
|
|
81
|
+
const bmadDest = join(projectDir, "_bmad");
|
|
82
|
+
const bmadTemp = join(projectDir, "_bmad.new");
|
|
83
|
+
await rm(bmadTemp, { recursive: true, force: true });
|
|
84
|
+
await cp(bmadDir, bmadTemp, { recursive: true, dereference: false });
|
|
38
85
|
try {
|
|
39
|
-
await
|
|
86
|
+
await rm(bmadDest, { recursive: true, force: true });
|
|
87
|
+
await rename(bmadTemp, bmadDest);
|
|
40
88
|
}
|
|
41
|
-
catch {
|
|
42
|
-
|
|
89
|
+
catch (err) {
|
|
90
|
+
// If rename fails, attempt to restore from temp
|
|
91
|
+
try {
|
|
92
|
+
await rename(bmadTemp, bmadDest);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Best effort restore failed
|
|
96
|
+
}
|
|
97
|
+
throw err;
|
|
43
98
|
}
|
|
44
|
-
// Copy BMAD files → _bmad/
|
|
45
|
-
await cp(bmadDir, join(projectDir, "_bmad"), { recursive: true });
|
|
46
99
|
// Generate combined manifest from module-help.csv files
|
|
47
100
|
await generateManifests(projectDir);
|
|
48
101
|
// Generate _bmad/config.yaml
|
|
49
102
|
const projectName = await deriveProjectName(projectDir);
|
|
50
|
-
|
|
103
|
+
const escapedName = projectName.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
104
|
+
await atomicWriteFile(join(projectDir, "_bmad/config.yaml"), `# BMAD Configuration - Generated by bmalph
|
|
51
105
|
platform: claude-code
|
|
52
|
-
project_name: ${
|
|
106
|
+
project_name: "${escapedName}"
|
|
53
107
|
output_folder: _bmad-output
|
|
54
108
|
user_name: BMad
|
|
55
109
|
communication_language: English
|
|
@@ -63,42 +117,91 @@ modules:
|
|
|
63
117
|
`);
|
|
64
118
|
// Copy Ralph templates → .ralph/
|
|
65
119
|
await mkdir(join(projectDir, ".ralph"), { recursive: true });
|
|
66
|
-
|
|
67
|
-
await
|
|
120
|
+
// Preserve customized PROMPT.md and @AGENT.md on upgrade
|
|
121
|
+
const promptCustomized = await isTemplateCustomized(join(projectDir, ".ralph/PROMPT.md"), "PROMPT.md");
|
|
122
|
+
const agentCustomized = await isTemplateCustomized(join(projectDir, ".ralph/@AGENT.md"), "AGENT.md");
|
|
123
|
+
if (!promptCustomized) {
|
|
124
|
+
await cp(join(ralphDir, "templates/PROMPT.md"), join(projectDir, ".ralph/PROMPT.md"), {
|
|
125
|
+
dereference: false,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
if (!agentCustomized) {
|
|
129
|
+
await cp(join(ralphDir, "templates/AGENT.md"), join(projectDir, ".ralph/@AGENT.md"), {
|
|
130
|
+
dereference: false,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
await cp(join(ralphDir, "RALPH-REFERENCE.md"), join(projectDir, ".ralph/RALPH-REFERENCE.md"), {
|
|
134
|
+
dereference: false,
|
|
135
|
+
});
|
|
136
|
+
// Copy .ralphrc from template (skip if user has customized it)
|
|
137
|
+
const ralphrcDest = join(projectDir, ".ralph/.ralphrc");
|
|
138
|
+
if (!(await exists(ralphrcDest))) {
|
|
139
|
+
await cp(join(ralphDir, "templates/ralphrc.template"), ralphrcDest, { dereference: false });
|
|
140
|
+
}
|
|
68
141
|
// Copy Ralph loop and lib → .ralph/
|
|
69
142
|
// Add version marker to ralph_loop.sh
|
|
70
143
|
const loopContent = await readFile(join(ralphDir, "ralph_loop.sh"), "utf-8");
|
|
71
144
|
const markerLine = `# bmalph-version: ${getPackageVersion()}`;
|
|
145
|
+
// Use .* to handle empty version (edge case) and EOF without newline
|
|
72
146
|
const markedContent = loopContent.includes("# bmalph-version:")
|
|
73
|
-
? loopContent.replace(/# bmalph-version
|
|
147
|
+
? loopContent.replace(/# bmalph-version:.*/, markerLine)
|
|
74
148
|
: loopContent.replace(/^(#!.+\r?\n)/, `$1${markerLine}\n`);
|
|
75
|
-
await
|
|
76
|
-
await
|
|
149
|
+
await atomicWriteFile(join(projectDir, ".ralph/ralph_loop.sh"), markedContent);
|
|
150
|
+
await chmod(join(projectDir, ".ralph/ralph_loop.sh"), 0o755);
|
|
151
|
+
await rm(join(projectDir, ".ralph/lib"), { recursive: true, force: true });
|
|
152
|
+
await cp(join(ralphDir, "lib"), join(projectDir, ".ralph/lib"), {
|
|
153
|
+
recursive: true,
|
|
154
|
+
dereference: false,
|
|
155
|
+
});
|
|
156
|
+
// Copy Ralph utilities → .ralph/
|
|
157
|
+
await cp(join(ralphDir, "ralph_import.sh"), join(projectDir, ".ralph/ralph_import.sh"), {
|
|
158
|
+
dereference: false,
|
|
159
|
+
});
|
|
160
|
+
await chmod(join(projectDir, ".ralph/ralph_import.sh"), 0o755);
|
|
161
|
+
await cp(join(ralphDir, "ralph_monitor.sh"), join(projectDir, ".ralph/ralph_monitor.sh"), {
|
|
162
|
+
dereference: false,
|
|
163
|
+
});
|
|
164
|
+
await chmod(join(projectDir, ".ralph/ralph_monitor.sh"), 0o755);
|
|
77
165
|
// Install all slash commands → .claude/commands/
|
|
78
|
-
|
|
166
|
+
// Clean stale bmalph-owned commands before copying (preserve user-created commands)
|
|
167
|
+
const commandsDir = join(projectDir, ".claude/commands");
|
|
168
|
+
await mkdir(commandsDir, { recursive: true });
|
|
79
169
|
const slashFiles = await readdir(slashCommandsDir);
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
170
|
+
const bundledCommandNames = new Set(slashFiles.filter((f) => f.endsWith(".md")));
|
|
171
|
+
try {
|
|
172
|
+
const existingCommands = await readdir(commandsDir);
|
|
173
|
+
for (const file of existingCommands) {
|
|
174
|
+
if (file.endsWith(".md") && bundledCommandNames.has(file)) {
|
|
175
|
+
await rm(join(commandsDir, file), { force: true });
|
|
176
|
+
}
|
|
83
177
|
}
|
|
84
178
|
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
if (!isEnoent(err))
|
|
181
|
+
throw err;
|
|
182
|
+
}
|
|
183
|
+
for (const file of bundledCommandNames) {
|
|
184
|
+
await cp(join(slashCommandsDir, file), join(commandsDir, file), { dereference: false });
|
|
185
|
+
}
|
|
85
186
|
// Update .gitignore
|
|
86
187
|
await updateGitignore(projectDir);
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
188
|
+
const updatedPaths = [
|
|
189
|
+
"_bmad/",
|
|
190
|
+
".ralph/ralph_loop.sh",
|
|
191
|
+
".ralph/ralph_import.sh",
|
|
192
|
+
".ralph/ralph_monitor.sh",
|
|
193
|
+
".ralph/lib/",
|
|
194
|
+
...(!promptCustomized ? [".ralph/PROMPT.md"] : []),
|
|
195
|
+
...(!agentCustomized ? [".ralph/@AGENT.md"] : []),
|
|
196
|
+
".ralph/RALPH-REFERENCE.md",
|
|
197
|
+
".claude/commands/",
|
|
198
|
+
".gitignore",
|
|
199
|
+
];
|
|
200
|
+
return { updatedPaths };
|
|
98
201
|
}
|
|
99
202
|
export async function installProject(projectDir) {
|
|
100
203
|
// Create user directories (not overwritten by upgrade)
|
|
101
|
-
await mkdir(join(projectDir,
|
|
204
|
+
await mkdir(join(projectDir, STATE_DIR), { recursive: true });
|
|
102
205
|
await mkdir(join(projectDir, ".ralph/specs"), { recursive: true });
|
|
103
206
|
await mkdir(join(projectDir, ".ralph/logs"), { recursive: true });
|
|
104
207
|
await mkdir(join(projectDir, ".ralph/docs/generated"), { recursive: true });
|
|
@@ -106,34 +209,62 @@ export async function installProject(projectDir) {
|
|
|
106
209
|
}
|
|
107
210
|
async function deriveProjectName(projectDir) {
|
|
108
211
|
try {
|
|
109
|
-
const configPath = join(projectDir,
|
|
212
|
+
const configPath = join(projectDir, CONFIG_FILE);
|
|
110
213
|
const raw = await readFile(configPath, "utf-8");
|
|
111
214
|
const config = JSON.parse(raw);
|
|
112
215
|
if (config.name)
|
|
113
216
|
return config.name;
|
|
114
217
|
}
|
|
115
|
-
catch {
|
|
116
|
-
|
|
218
|
+
catch (err) {
|
|
219
|
+
if (!isEnoent(err)) {
|
|
220
|
+
warn(`Could not read ${CONFIG_FILE}: ${formatError(err)}`);
|
|
221
|
+
}
|
|
117
222
|
}
|
|
118
223
|
return basename(projectDir);
|
|
119
224
|
}
|
|
120
|
-
async function generateManifests(projectDir) {
|
|
225
|
+
export async function generateManifests(projectDir) {
|
|
121
226
|
const configDir = join(projectDir, "_bmad/_config");
|
|
122
227
|
await mkdir(configDir, { recursive: true });
|
|
123
228
|
const coreHelpPath = join(projectDir, "_bmad/core/module-help.csv");
|
|
124
229
|
const bmmHelpPath = join(projectDir, "_bmad/bmm/module-help.csv");
|
|
230
|
+
// Validate CSV files exist before reading
|
|
231
|
+
if (!(await exists(coreHelpPath))) {
|
|
232
|
+
throw new Error(`Core module-help.csv not found at ${coreHelpPath}. BMAD installation may be incomplete.`);
|
|
233
|
+
}
|
|
234
|
+
if (!(await exists(bmmHelpPath))) {
|
|
235
|
+
throw new Error(`BMM module-help.csv not found at ${bmmHelpPath}. BMAD installation may be incomplete.`);
|
|
236
|
+
}
|
|
125
237
|
const coreContent = await readFile(coreHelpPath, "utf-8");
|
|
126
238
|
const bmmContent = await readFile(bmmHelpPath, "utf-8");
|
|
127
239
|
// Extract header from core (first line) and data lines from both
|
|
128
240
|
const coreLines = coreContent.trimEnd().split(/\r?\n/);
|
|
129
241
|
const bmmLines = bmmContent.trimEnd().split(/\r?\n/);
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
242
|
+
if (!coreLines[0]?.trim()) {
|
|
243
|
+
throw new Error(`Core module-help.csv is empty at ${coreHelpPath}`);
|
|
244
|
+
}
|
|
245
|
+
if (!bmmLines[0]?.trim()) {
|
|
246
|
+
throw new Error(`BMM module-help.csv is empty at ${bmmHelpPath}`);
|
|
247
|
+
}
|
|
248
|
+
const normalize = (line) => line.replace(/,+$/, "");
|
|
249
|
+
const header = normalize(coreLines[0]);
|
|
250
|
+
const bmmHeader = normalize(bmmLines[0]);
|
|
251
|
+
// Validate headers match (warn if mismatch but continue)
|
|
252
|
+
if (header && bmmHeader && header !== bmmHeader) {
|
|
253
|
+
warn(`CSV header mismatch detected. BMAD modules may have incompatible formats.`);
|
|
254
|
+
debug(`CSV header mismatch details - core: "${header.slice(0, 50)}...", bmm: "${bmmHeader.slice(0, 50)}..."`);
|
|
255
|
+
}
|
|
256
|
+
const coreData = coreLines
|
|
257
|
+
.slice(1)
|
|
258
|
+
.filter((l) => l.trim())
|
|
259
|
+
.map(normalize);
|
|
260
|
+
const bmmData = bmmLines
|
|
261
|
+
.slice(1)
|
|
262
|
+
.filter((l) => l.trim())
|
|
263
|
+
.map(normalize);
|
|
133
264
|
const combined = [header, ...coreData, ...bmmData].join("\n") + "\n";
|
|
134
|
-
await
|
|
135
|
-
await
|
|
136
|
-
await
|
|
265
|
+
await atomicWriteFile(join(configDir, "task-manifest.csv"), combined);
|
|
266
|
+
await atomicWriteFile(join(configDir, "workflow-manifest.csv"), combined);
|
|
267
|
+
await atomicWriteFile(join(configDir, "bmad-help.csv"), combined);
|
|
137
268
|
}
|
|
138
269
|
async function updateGitignore(projectDir) {
|
|
139
270
|
const gitignorePath = join(projectDir, ".gitignore");
|
|
@@ -141,17 +272,23 @@ async function updateGitignore(projectDir) {
|
|
|
141
272
|
try {
|
|
142
273
|
existing = await readFile(gitignorePath, "utf-8");
|
|
143
274
|
}
|
|
144
|
-
catch {
|
|
145
|
-
|
|
275
|
+
catch (err) {
|
|
276
|
+
if (!isEnoent(err))
|
|
277
|
+
throw err;
|
|
146
278
|
}
|
|
279
|
+
// Split into lines for exact comparison (avoid substring matching issues)
|
|
280
|
+
const existingLines = new Set(existing
|
|
281
|
+
.split(/\r?\n/)
|
|
282
|
+
.map((line) => line.trim())
|
|
283
|
+
.filter(Boolean));
|
|
147
284
|
const entries = [".ralph/logs/", "_bmad-output/"];
|
|
148
|
-
const newEntries = entries.filter((e) => !
|
|
285
|
+
const newEntries = entries.filter((e) => !existingLines.has(e));
|
|
149
286
|
if (newEntries.length === 0)
|
|
150
287
|
return;
|
|
151
288
|
const suffix = existing.length > 0 && !existing.endsWith("\n")
|
|
152
289
|
? "\n" + newEntries.join("\n") + "\n"
|
|
153
290
|
: newEntries.join("\n") + "\n";
|
|
154
|
-
await
|
|
291
|
+
await atomicWriteFile(gitignorePath, existing + suffix);
|
|
155
292
|
}
|
|
156
293
|
export async function mergeClaudeMd(projectDir) {
|
|
157
294
|
const claudeMdPath = join(projectDir, "CLAUDE.md");
|
|
@@ -194,26 +331,128 @@ Use \`/bmalph\` to navigate phases. Use \`/bmad-help\` to discover all commands.
|
|
|
194
331
|
| \`/sm\` | Scrum Master | Sprint planning, status, coordination |
|
|
195
332
|
| \`/dev\` | Developer | Implementation, coding |
|
|
196
333
|
| \`/ux-designer\` | UX Designer | User experience, wireframes |
|
|
197
|
-
| \`/
|
|
334
|
+
| \`/qa\` | QA Engineer | Test automation, quality assurance |
|
|
198
335
|
`;
|
|
199
336
|
let existing = "";
|
|
200
337
|
try {
|
|
201
338
|
existing = await readFile(claudeMdPath, "utf-8");
|
|
202
339
|
}
|
|
203
|
-
catch {
|
|
204
|
-
|
|
340
|
+
catch (err) {
|
|
341
|
+
if (!isEnoent(err))
|
|
342
|
+
throw err;
|
|
205
343
|
}
|
|
206
344
|
if (existing.includes("## BMAD-METHOD Integration")) {
|
|
207
|
-
|
|
345
|
+
// Replace stale section with current content, preserving content after it
|
|
346
|
+
const sectionStart = existing.indexOf("## BMAD-METHOD Integration");
|
|
347
|
+
const before = existing.slice(0, sectionStart);
|
|
348
|
+
const afterSection = existing.slice(sectionStart);
|
|
349
|
+
// Find the next level-2 heading after the BMAD section start
|
|
350
|
+
const nextHeadingMatch = afterSection.match(/\n## (?!BMAD-METHOD Integration)/);
|
|
351
|
+
const after = nextHeadingMatch ? afterSection.slice(nextHeadingMatch.index) : "";
|
|
352
|
+
await atomicWriteFile(claudeMdPath, before.trimEnd() + "\n" + snippet + after);
|
|
353
|
+
return;
|
|
208
354
|
}
|
|
209
|
-
await
|
|
355
|
+
await atomicWriteFile(claudeMdPath, existing + snippet);
|
|
210
356
|
}
|
|
211
357
|
export async function isInitialized(projectDir) {
|
|
358
|
+
return exists(join(projectDir, CONFIG_FILE));
|
|
359
|
+
}
|
|
360
|
+
export async function previewInstall(projectDir) {
|
|
361
|
+
const wouldCreate = [];
|
|
362
|
+
const wouldModify = [];
|
|
363
|
+
const wouldSkip = [];
|
|
364
|
+
// Directories that would be created
|
|
365
|
+
const dirsToCreate = [
|
|
366
|
+
`${STATE_DIR}/`,
|
|
367
|
+
".ralph/specs/",
|
|
368
|
+
".ralph/logs/",
|
|
369
|
+
".ralph/docs/generated/",
|
|
370
|
+
"_bmad/",
|
|
371
|
+
".claude/commands/",
|
|
372
|
+
];
|
|
373
|
+
for (const dir of dirsToCreate) {
|
|
374
|
+
if (await exists(join(projectDir, dir))) {
|
|
375
|
+
if (dir === "_bmad/" || dir === ".claude/commands/") {
|
|
376
|
+
wouldModify.push(dir);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
else {
|
|
380
|
+
wouldCreate.push(dir);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
// Files that would be created/modified
|
|
384
|
+
const filesToCheck = [
|
|
385
|
+
{ path: ".ralph/PROMPT.md", isTemplate: true },
|
|
386
|
+
{ path: ".ralph/@AGENT.md", isTemplate: true },
|
|
387
|
+
{ path: ".ralph/ralph_loop.sh", isTemplate: false },
|
|
388
|
+
{ path: CONFIG_FILE, isTemplate: false },
|
|
389
|
+
];
|
|
390
|
+
for (const file of filesToCheck) {
|
|
391
|
+
if (await exists(join(projectDir, file.path))) {
|
|
392
|
+
if (file.isTemplate) {
|
|
393
|
+
wouldModify.push(file.path);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
else {
|
|
397
|
+
wouldCreate.push(file.path);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
// .gitignore would be modified if it exists, created otherwise
|
|
401
|
+
if (await exists(join(projectDir, ".gitignore"))) {
|
|
402
|
+
wouldModify.push(".gitignore");
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
wouldCreate.push(".gitignore");
|
|
406
|
+
}
|
|
407
|
+
// CLAUDE.md integration check
|
|
212
408
|
try {
|
|
213
|
-
await
|
|
214
|
-
|
|
409
|
+
const claudeMd = await readFile(join(projectDir, "CLAUDE.md"), "utf-8");
|
|
410
|
+
if (claudeMd.includes("## BMAD-METHOD Integration")) {
|
|
411
|
+
wouldSkip.push("CLAUDE.md (already integrated)");
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
wouldModify.push("CLAUDE.md");
|
|
415
|
+
}
|
|
215
416
|
}
|
|
216
|
-
catch {
|
|
217
|
-
|
|
417
|
+
catch (err) {
|
|
418
|
+
if (isEnoent(err)) {
|
|
419
|
+
wouldCreate.push("CLAUDE.md");
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
throw err;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
return { wouldCreate, wouldModify, wouldSkip };
|
|
426
|
+
}
|
|
427
|
+
export async function previewUpgrade(projectDir) {
|
|
428
|
+
const managedPaths = [
|
|
429
|
+
{ path: "_bmad/", isDir: true },
|
|
430
|
+
{ path: ".ralph/ralph_loop.sh", isDir: false },
|
|
431
|
+
{ path: ".ralph/ralph_import.sh", isDir: false },
|
|
432
|
+
{ path: ".ralph/ralph_monitor.sh", isDir: false },
|
|
433
|
+
{ path: ".ralph/lib/", isDir: true },
|
|
434
|
+
{ path: ".ralph/PROMPT.md", isDir: false, templateName: "PROMPT.md" },
|
|
435
|
+
{ path: ".ralph/@AGENT.md", isDir: false, templateName: "AGENT.md" },
|
|
436
|
+
{ path: ".ralph/RALPH-REFERENCE.md", isDir: false },
|
|
437
|
+
{ path: ".claude/commands/", isDir: true },
|
|
438
|
+
{ path: ".gitignore", isDir: false },
|
|
439
|
+
];
|
|
440
|
+
const wouldUpdate = [];
|
|
441
|
+
const wouldCreate = [];
|
|
442
|
+
const wouldPreserve = [];
|
|
443
|
+
for (const { path: p, templateName } of managedPaths) {
|
|
444
|
+
const fullPath = join(projectDir, p.replace(/\/$/, ""));
|
|
445
|
+
if (await exists(fullPath)) {
|
|
446
|
+
if (templateName && (await isTemplateCustomized(fullPath, templateName))) {
|
|
447
|
+
wouldPreserve.push(p);
|
|
448
|
+
}
|
|
449
|
+
else {
|
|
450
|
+
wouldUpdate.push(p);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
wouldCreate.push(p);
|
|
455
|
+
}
|
|
218
456
|
}
|
|
457
|
+
return { wouldUpdate, wouldCreate, wouldPreserve };
|
|
219
458
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { readFile } from "fs/promises";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { debug } from "../utils/logger.js";
|
|
4
|
+
import { exists } from "../utils/file-system.js";
|
|
5
|
+
export async function findArtifactsDir(projectDir) {
|
|
6
|
+
const candidates = [
|
|
7
|
+
"_bmad-output/planning-artifacts",
|
|
8
|
+
"_bmad-output/planning_artifacts",
|
|
9
|
+
"docs/planning",
|
|
10
|
+
];
|
|
11
|
+
for (const candidate of candidates) {
|
|
12
|
+
const fullPath = join(projectDir, candidate);
|
|
13
|
+
debug(`Checking artifacts dir: ${fullPath}`);
|
|
14
|
+
if (await exists(fullPath)) {
|
|
15
|
+
debug(`Found artifacts at: ${fullPath}`);
|
|
16
|
+
return fullPath;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
debug(`No artifacts found. Checked: ${candidates.join(", ")}`);
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
export async function validateArtifacts(files, artifactsDir) {
|
|
23
|
+
const warnings = [];
|
|
24
|
+
const hasPrd = files.some((f) => /prd/i.test(f));
|
|
25
|
+
if (!hasPrd) {
|
|
26
|
+
warnings.push("No PRD document found in planning artifacts");
|
|
27
|
+
}
|
|
28
|
+
const hasArchitecture = files.some((f) => /architect/i.test(f));
|
|
29
|
+
if (!hasArchitecture) {
|
|
30
|
+
warnings.push("No architecture document found in planning artifacts");
|
|
31
|
+
}
|
|
32
|
+
// Check readiness report for NO-GO
|
|
33
|
+
const readinessFile = files.find((f) => /readiness/i.test(f));
|
|
34
|
+
if (readinessFile) {
|
|
35
|
+
try {
|
|
36
|
+
const content = await readFile(join(artifactsDir, readinessFile), "utf-8");
|
|
37
|
+
if (/NO[-\s]?GO/i.test(content)) {
|
|
38
|
+
warnings.push("Readiness report indicates NO-GO status");
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Cannot read readiness file, skip
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return warnings;
|
|
46
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ProjectContext, TruncationInfo } from "./types.js";
|
|
2
|
+
export interface ExtractProjectContextResult {
|
|
3
|
+
context: ProjectContext;
|
|
4
|
+
truncated: TruncationInfo[];
|
|
5
|
+
}
|
|
6
|
+
export interface ExtractSectionResult {
|
|
7
|
+
content: string;
|
|
8
|
+
wasTruncated: boolean;
|
|
9
|
+
originalLength: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function extractSection(content: string, headingPattern: RegExp, maxLength?: number): string;
|
|
12
|
+
export declare function extractSectionWithInfo(content: string, headingPattern: RegExp, maxLength?: number): ExtractSectionResult;
|
|
13
|
+
export declare function extractProjectContext(artifacts: Map<string, string>): ExtractProjectContextResult;
|
|
14
|
+
/**
|
|
15
|
+
* Converts truncation info into human-readable warnings.
|
|
16
|
+
*/
|
|
17
|
+
export declare function detectTruncation(truncated: TruncationInfo[]): string[];
|
|
18
|
+
export declare function generateProjectContextMd(context: ProjectContext, projectName: string): string;
|
|
19
|
+
export declare function generatePrompt(projectName: string, context?: ProjectContext): string;
|