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
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { readFile } from "fs/promises";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { debug } from "../utils/logger.js";
|
|
4
|
+
import { formatError } from "../utils/errors.js";
|
|
5
|
+
import { getFilesRecursive } from "../utils/file-system.js";
|
|
6
|
+
import { DIFF_LINE_PREVIEW_LENGTH } from "../utils/constants.js";
|
|
7
|
+
function getFirstDiffLine(oldContent, newContent) {
|
|
8
|
+
const oldLines = oldContent.split("\n");
|
|
9
|
+
const newLines = newContent.split("\n");
|
|
10
|
+
for (let i = 0; i < Math.max(oldLines.length, newLines.length); i++) {
|
|
11
|
+
const oldLine = oldLines[i] || "";
|
|
12
|
+
const newLine = newLines[i] || "";
|
|
13
|
+
if (oldLine !== newLine) {
|
|
14
|
+
// Return a truncated version of the changed line
|
|
15
|
+
const line = newLine.trim().slice(0, DIFF_LINE_PREVIEW_LENGTH);
|
|
16
|
+
return line || "(line changed)";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return "";
|
|
20
|
+
}
|
|
21
|
+
export async function generateSpecsChangelog(oldSpecsDir, newSourceDir) {
|
|
22
|
+
const changes = [];
|
|
23
|
+
// Get file lists (already uses forward slashes)
|
|
24
|
+
const oldFiles = await getFilesRecursive(oldSpecsDir);
|
|
25
|
+
const newFiles = await getFilesRecursive(newSourceDir);
|
|
26
|
+
const oldSet = new Set(oldFiles);
|
|
27
|
+
const newSet = new Set(newFiles);
|
|
28
|
+
// Check for added/modified files
|
|
29
|
+
for (const file of newFiles) {
|
|
30
|
+
if (!oldSet.has(file)) {
|
|
31
|
+
changes.push({ file, status: "added" });
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Compare content
|
|
35
|
+
const oldContent = await readFile(join(oldSpecsDir, file), "utf-8").catch((err) => {
|
|
36
|
+
debug(`Could not read old spec file ${file}: ${formatError(err)}`);
|
|
37
|
+
return "";
|
|
38
|
+
});
|
|
39
|
+
const newContent = await readFile(join(newSourceDir, file), "utf-8");
|
|
40
|
+
if (oldContent !== newContent) {
|
|
41
|
+
changes.push({
|
|
42
|
+
file,
|
|
43
|
+
status: "modified",
|
|
44
|
+
summary: getFirstDiffLine(oldContent, newContent),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Check for removed files
|
|
50
|
+
for (const file of oldFiles) {
|
|
51
|
+
if (!newSet.has(file)) {
|
|
52
|
+
changes.push({ file, status: "removed" });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return changes;
|
|
56
|
+
}
|
|
57
|
+
export function formatChangelog(changes, timestamp) {
|
|
58
|
+
if (changes.length === 0) {
|
|
59
|
+
return `# Specs Changelog\n\nNo changes detected.\n`;
|
|
60
|
+
}
|
|
61
|
+
let md = `# Specs Changelog\n\nLast updated: ${timestamp}\n\n`;
|
|
62
|
+
const added = changes.filter((c) => c.status === "added");
|
|
63
|
+
const modified = changes.filter((c) => c.status === "modified");
|
|
64
|
+
const removed = changes.filter((c) => c.status === "removed");
|
|
65
|
+
if (added.length) {
|
|
66
|
+
md += `## Added\n${added.map((c) => `- ${c.file}`).join("\n")}\n\n`;
|
|
67
|
+
}
|
|
68
|
+
if (modified.length) {
|
|
69
|
+
md += `## Modified\n${modified.map((c) => `- ${c.file}${c.summary ? ` (${c.summary})` : ""}`).join("\n")}\n\n`;
|
|
70
|
+
}
|
|
71
|
+
if (removed.length) {
|
|
72
|
+
md += `## Removed\n${removed.map((c) => `- ${c.file}`).join("\n")}\n\n`;
|
|
73
|
+
}
|
|
74
|
+
return md;
|
|
75
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { SpecFileType, Priority, SpecsIndex } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Detects the type of a spec file based on its filename.
|
|
4
|
+
*/
|
|
5
|
+
export declare function detectSpecFileType(filename: string, _content: string): SpecFileType;
|
|
6
|
+
/**
|
|
7
|
+
* Determines the reading priority for a spec file based on its type.
|
|
8
|
+
*/
|
|
9
|
+
export declare function determinePriority(type: SpecFileType, _size: number): Priority;
|
|
10
|
+
/**
|
|
11
|
+
* Extracts a one-line description from file content.
|
|
12
|
+
* Prefers the first heading, falls back to first non-empty line.
|
|
13
|
+
*/
|
|
14
|
+
export declare function extractDescription(content: string, maxLength?: number): string;
|
|
15
|
+
/**
|
|
16
|
+
* Generates a specs index from a specs directory.
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateSpecsIndex(specsDir: string): Promise<SpecsIndex>;
|
|
19
|
+
/**
|
|
20
|
+
* Formats a specs index as markdown.
|
|
21
|
+
*/
|
|
22
|
+
export declare function formatSpecsIndexMd(index: SpecsIndex): string;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { getMarkdownFilesWithContent } from "../utils/file-system.js";
|
|
2
|
+
import { LARGE_FILE_THRESHOLD_BYTES, DEFAULT_SNIPPET_MAX_LENGTH } from "../utils/constants.js";
|
|
3
|
+
/**
|
|
4
|
+
* Detects the type of a spec file based on its filename.
|
|
5
|
+
*/
|
|
6
|
+
export function detectSpecFileType(filename, _content) {
|
|
7
|
+
const lower = filename.toLowerCase();
|
|
8
|
+
if (lower.includes("prd"))
|
|
9
|
+
return "prd";
|
|
10
|
+
if (lower.includes("arch"))
|
|
11
|
+
return "architecture";
|
|
12
|
+
// Check stories/epic BEFORE brainstorm (Bug #5: brainstorm-stories.md should be "stories")
|
|
13
|
+
if (/stor(y|ies)/i.test(lower) || lower.includes("epic"))
|
|
14
|
+
return "stories";
|
|
15
|
+
if (lower.includes("brainstorm"))
|
|
16
|
+
return "brainstorm";
|
|
17
|
+
if (lower.includes("ux"))
|
|
18
|
+
return "ux";
|
|
19
|
+
if (/\btest/i.test(lower))
|
|
20
|
+
return "test-design";
|
|
21
|
+
if (lower.includes("readiness"))
|
|
22
|
+
return "readiness";
|
|
23
|
+
if (lower.includes("sprint"))
|
|
24
|
+
return "sprint";
|
|
25
|
+
return "other";
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Determines the reading priority for a spec file based on its type.
|
|
29
|
+
*/
|
|
30
|
+
export function determinePriority(type, _size) {
|
|
31
|
+
switch (type) {
|
|
32
|
+
case "prd":
|
|
33
|
+
case "architecture":
|
|
34
|
+
case "stories":
|
|
35
|
+
return "critical";
|
|
36
|
+
case "test-design":
|
|
37
|
+
case "readiness":
|
|
38
|
+
return "high";
|
|
39
|
+
case "ux":
|
|
40
|
+
case "sprint":
|
|
41
|
+
return "medium";
|
|
42
|
+
case "brainstorm":
|
|
43
|
+
case "other":
|
|
44
|
+
default:
|
|
45
|
+
return "low";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Extracts a one-line description from file content.
|
|
50
|
+
* Prefers the first heading, falls back to first non-empty line.
|
|
51
|
+
*/
|
|
52
|
+
export function extractDescription(content, maxLength = DEFAULT_SNIPPET_MAX_LENGTH) {
|
|
53
|
+
const trimmed = content.trim();
|
|
54
|
+
if (!trimmed)
|
|
55
|
+
return "";
|
|
56
|
+
// Try to find a heading (# or ##)
|
|
57
|
+
const headingMatch = /^#{1,2}\s+(.+)$/m.exec(trimmed);
|
|
58
|
+
if (headingMatch) {
|
|
59
|
+
let heading = headingMatch[1];
|
|
60
|
+
// Remove markdown formatting
|
|
61
|
+
heading = heading.replace(/\*\*([^*]+)\*\*/g, "$1");
|
|
62
|
+
heading = heading.replace(/\*([^*]+)\*/g, "$1");
|
|
63
|
+
heading = heading.replace(/`([^`]+)`/g, "$1");
|
|
64
|
+
heading = heading.trim();
|
|
65
|
+
if (heading.length > maxLength) {
|
|
66
|
+
return heading.slice(0, maxLength - 3) + "...";
|
|
67
|
+
}
|
|
68
|
+
return heading;
|
|
69
|
+
}
|
|
70
|
+
// Fall back to first non-empty line
|
|
71
|
+
const firstLine = trimmed.split("\n")[0].trim();
|
|
72
|
+
if (firstLine.length > maxLength) {
|
|
73
|
+
return firstLine.slice(0, maxLength - 3) + "...";
|
|
74
|
+
}
|
|
75
|
+
return firstLine;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Generates a specs index from a specs directory.
|
|
79
|
+
*/
|
|
80
|
+
export async function generateSpecsIndex(specsDir) {
|
|
81
|
+
const files = await getMarkdownFilesWithContent(specsDir);
|
|
82
|
+
const metadata = files.map((file) => {
|
|
83
|
+
const type = detectSpecFileType(file.path, file.content);
|
|
84
|
+
const priority = determinePriority(type, file.size);
|
|
85
|
+
const description = extractDescription(file.content);
|
|
86
|
+
return {
|
|
87
|
+
path: file.path,
|
|
88
|
+
size: file.size,
|
|
89
|
+
type,
|
|
90
|
+
priority,
|
|
91
|
+
description,
|
|
92
|
+
};
|
|
93
|
+
});
|
|
94
|
+
// Sort by priority order: critical -> high -> medium -> low
|
|
95
|
+
const priorityOrder = {
|
|
96
|
+
critical: 0,
|
|
97
|
+
high: 1,
|
|
98
|
+
medium: 2,
|
|
99
|
+
low: 3,
|
|
100
|
+
};
|
|
101
|
+
metadata.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);
|
|
102
|
+
const totalSize = files.reduce((sum, f) => sum + f.size, 0);
|
|
103
|
+
return {
|
|
104
|
+
generatedAt: new Date().toISOString(),
|
|
105
|
+
totalFiles: files.length,
|
|
106
|
+
totalSizeKb: Math.round(totalSize / 1024),
|
|
107
|
+
files: metadata,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Formats a specs index as markdown.
|
|
112
|
+
*/
|
|
113
|
+
export function formatSpecsIndexMd(index) {
|
|
114
|
+
const lines = [
|
|
115
|
+
"# Specs Index",
|
|
116
|
+
"",
|
|
117
|
+
`Generated: ${index.generatedAt}`,
|
|
118
|
+
`Total: ${index.totalFiles} files (${index.totalSizeKb} KB)`,
|
|
119
|
+
"",
|
|
120
|
+
"## Reading Order",
|
|
121
|
+
"",
|
|
122
|
+
];
|
|
123
|
+
const priorityConfig = [
|
|
124
|
+
{ key: "critical", heading: "Critical (Always Read First)", description: "" },
|
|
125
|
+
{ key: "high", heading: "High Priority (Read for Implementation)", description: "" },
|
|
126
|
+
{ key: "medium", heading: "Medium Priority (Reference as Needed)", description: "" },
|
|
127
|
+
{ key: "low", heading: "Low Priority (Optional)", description: "" },
|
|
128
|
+
];
|
|
129
|
+
let fileNumber = 1;
|
|
130
|
+
for (const { key, heading } of priorityConfig) {
|
|
131
|
+
const filesInPriority = index.files.filter((f) => f.priority === key);
|
|
132
|
+
if (filesInPriority.length === 0)
|
|
133
|
+
continue;
|
|
134
|
+
lines.push(`### ${heading}`);
|
|
135
|
+
for (const file of filesInPriority) {
|
|
136
|
+
const sizeKb = Math.round(file.size / 1024);
|
|
137
|
+
const isLarge = file.size >= LARGE_FILE_THRESHOLD_BYTES;
|
|
138
|
+
let line = `${fileNumber}. **${file.path}** (${sizeKb} KB)`;
|
|
139
|
+
if (isLarge) {
|
|
140
|
+
line += " [LARGE]";
|
|
141
|
+
}
|
|
142
|
+
lines.push(line);
|
|
143
|
+
// Add description
|
|
144
|
+
if (file.description) {
|
|
145
|
+
if (isLarge) {
|
|
146
|
+
lines.push(` ${file.description} - scan headers, read relevant sections`);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
lines.push(` ${file.description}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
lines.push("");
|
|
153
|
+
fileNumber++;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return lines.join("\n");
|
|
157
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Story } from "./types.js";
|
|
2
|
+
export interface ParseStoriesResult {
|
|
3
|
+
stories: Story[];
|
|
4
|
+
warnings: string[];
|
|
5
|
+
}
|
|
6
|
+
export declare function parseStories(content: string): Story[];
|
|
7
|
+
export declare function parseStoriesWithWarnings(content: string): ParseStoriesResult;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// Cached regex patterns for performance (compiled once at module load)
|
|
2
|
+
const GIVEN_LINE_PATTERN = /^\*?\*?Given\*?\*?\s/;
|
|
3
|
+
const GWT_LINE_PATTERN = /^\*?\*?(Given|When|Then)\*?\*?\s/;
|
|
4
|
+
const BOLD_PATTERN = /\*\*/g;
|
|
5
|
+
const EPIC_HEADER_PATTERN = /^##\s+Epic\s+\d+:\s+(.+)/;
|
|
6
|
+
const HEADING_PATTERN = /^#{2,3}\s/;
|
|
7
|
+
const STORY_HEADER_PATTERN = /^###\s+Story\s+([\d.]+):\s+(.+)/;
|
|
8
|
+
const STORY_ID_PATTERN = /^\d+\.\d+$/;
|
|
9
|
+
const AC_HEADING_PATTERN = /^\*?\*?Acceptance Criteria\*?\*?:?/i;
|
|
10
|
+
function isGivenLine(line) {
|
|
11
|
+
return GIVEN_LINE_PATTERN.test(line.trim());
|
|
12
|
+
}
|
|
13
|
+
function isGwtLine(line) {
|
|
14
|
+
return GWT_LINE_PATTERN.test(line.trim());
|
|
15
|
+
}
|
|
16
|
+
function stripBold(text) {
|
|
17
|
+
return text.replace(BOLD_PATTERN, "");
|
|
18
|
+
}
|
|
19
|
+
function parseAcBlocks(lines) {
|
|
20
|
+
const criteria = [];
|
|
21
|
+
let current = [];
|
|
22
|
+
for (const line of lines) {
|
|
23
|
+
const trimmed = line.trim();
|
|
24
|
+
if (!trimmed)
|
|
25
|
+
continue;
|
|
26
|
+
if (isGivenLine(trimmed)) {
|
|
27
|
+
// Start new criterion block
|
|
28
|
+
if (current.length > 0) {
|
|
29
|
+
criteria.push(current.map(stripBold).join(", "));
|
|
30
|
+
}
|
|
31
|
+
current = [trimmed];
|
|
32
|
+
}
|
|
33
|
+
else if (isGwtLine(trimmed)) {
|
|
34
|
+
current.push(trimmed);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (current.length > 0) {
|
|
38
|
+
criteria.push(current.map(stripBold).join(", "));
|
|
39
|
+
}
|
|
40
|
+
return criteria;
|
|
41
|
+
}
|
|
42
|
+
export function parseStories(content) {
|
|
43
|
+
return parseStoriesWithWarnings(content).stories;
|
|
44
|
+
}
|
|
45
|
+
export function parseStoriesWithWarnings(content) {
|
|
46
|
+
const stories = [];
|
|
47
|
+
const warnings = [];
|
|
48
|
+
let currentEpic = "";
|
|
49
|
+
let currentEpicDescription = "";
|
|
50
|
+
const lines = content.split("\n");
|
|
51
|
+
for (let i = 0; i < lines.length; i++) {
|
|
52
|
+
const line = lines[i];
|
|
53
|
+
// Match Epic headers: ## Epic N: Title
|
|
54
|
+
const epicMatch = line?.match(EPIC_HEADER_PATTERN);
|
|
55
|
+
if (epicMatch) {
|
|
56
|
+
currentEpic = epicMatch[1].trim();
|
|
57
|
+
// Collect all non-empty lines between epic header and first story/next heading
|
|
58
|
+
const descLines = [];
|
|
59
|
+
for (let j = i + 1; j < lines.length; j++) {
|
|
60
|
+
if (HEADING_PATTERN.test(lines[j]))
|
|
61
|
+
break;
|
|
62
|
+
const trimmed = lines[j].trim();
|
|
63
|
+
if (trimmed)
|
|
64
|
+
descLines.push(trimmed);
|
|
65
|
+
}
|
|
66
|
+
currentEpicDescription = descLines.join(" ");
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
// Match Story headers: ### Story N.M: Title
|
|
70
|
+
const storyMatch = line?.match(STORY_HEADER_PATTERN);
|
|
71
|
+
if (storyMatch) {
|
|
72
|
+
const id = storyMatch[1];
|
|
73
|
+
const title = storyMatch[2].trim();
|
|
74
|
+
// Validate story ID format (should be like "1.1", "2.3", etc.)
|
|
75
|
+
if (!STORY_ID_PATTERN.test(id)) {
|
|
76
|
+
warnings.push(`Story "${title}" has malformed ID "${id}" (expected format: N.M)`);
|
|
77
|
+
}
|
|
78
|
+
// Collect all body lines until next heading
|
|
79
|
+
const bodyLines = [];
|
|
80
|
+
for (let j = i + 1; j < lines.length; j++) {
|
|
81
|
+
if (HEADING_PATTERN.test(lines[j]))
|
|
82
|
+
break;
|
|
83
|
+
bodyLines.push(lines[j]);
|
|
84
|
+
}
|
|
85
|
+
// Find where AC starts: either "**Acceptance Criteria:**" heading or first Given line
|
|
86
|
+
let acStartIndex = bodyLines.findIndex((l) => AC_HEADING_PATTERN.test(l.trim()));
|
|
87
|
+
if (acStartIndex === -1) {
|
|
88
|
+
// Look for first Given/When/Then line as AC start
|
|
89
|
+
acStartIndex = bodyLines.findIndex((l) => isGivenLine(l));
|
|
90
|
+
}
|
|
91
|
+
// Description: all non-empty lines before AC
|
|
92
|
+
const descSource = acStartIndex > -1 ? bodyLines.slice(0, acStartIndex) : bodyLines;
|
|
93
|
+
const descLines = [];
|
|
94
|
+
for (const dl of descSource) {
|
|
95
|
+
if (dl.trim())
|
|
96
|
+
descLines.push(dl.trim());
|
|
97
|
+
}
|
|
98
|
+
// Acceptance criteria: lines from AC start onward
|
|
99
|
+
const acLines = acStartIndex > -1 ? bodyLines.slice(acStartIndex) : [];
|
|
100
|
+
const acceptanceCriteria = parseAcBlocks(acLines);
|
|
101
|
+
// Warn about stories with missing acceptance criteria
|
|
102
|
+
if (acceptanceCriteria.length === 0) {
|
|
103
|
+
warnings.push(`Story ${id}: "${title}" has no acceptance criteria`);
|
|
104
|
+
}
|
|
105
|
+
// Warn about stories without a description
|
|
106
|
+
if (descLines.length === 0) {
|
|
107
|
+
warnings.push(`Story ${id}: "${title}" has no description`);
|
|
108
|
+
}
|
|
109
|
+
// Warn about stories not assigned to an epic
|
|
110
|
+
if (!currentEpic) {
|
|
111
|
+
warnings.push(`Story ${id}: "${title}" is not under an epic`);
|
|
112
|
+
}
|
|
113
|
+
stories.push({
|
|
114
|
+
epic: currentEpic,
|
|
115
|
+
epicDescription: currentEpicDescription,
|
|
116
|
+
id,
|
|
117
|
+
title,
|
|
118
|
+
description: descLines.join(" "),
|
|
119
|
+
acceptanceCriteria,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return { stories, warnings };
|
|
124
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export function detectTechStack(content) {
|
|
2
|
+
// Find tech stack section
|
|
3
|
+
const stackMatch = content.match(/^##\s+(?:Tech(?:nology)?\s+Stack|Stack)/im);
|
|
4
|
+
if (!stackMatch)
|
|
5
|
+
return null;
|
|
6
|
+
const startIndex = stackMatch.index;
|
|
7
|
+
// Extract section content until next ## heading or end
|
|
8
|
+
const rest = content.slice(startIndex);
|
|
9
|
+
const nextHeading = rest.slice(1).search(/^##\s/m);
|
|
10
|
+
const sectionContent = nextHeading > -1 ? rest.slice(0, nextHeading + 1) : rest;
|
|
11
|
+
// Detect language/runtime
|
|
12
|
+
const isNode = /\bnode(?:\.js)?\b/i.test(sectionContent) ||
|
|
13
|
+
/\btypescript\b/i.test(sectionContent) ||
|
|
14
|
+
/\bnpm\b/i.test(sectionContent);
|
|
15
|
+
const isPython = /\bpython\b/i.test(sectionContent) || /\bpip\b/i.test(sectionContent);
|
|
16
|
+
const isRust = /\brust\b/i.test(sectionContent) || /\bcargo\b/i.test(sectionContent);
|
|
17
|
+
const isGo = /\bgo\s+(mod|build|test|run|get|install|fmt|vet)\b/i.test(sectionContent) ||
|
|
18
|
+
/\bgolang\b/i.test(sectionContent);
|
|
19
|
+
if (isNode) {
|
|
20
|
+
// Detect specific test runner
|
|
21
|
+
let testCmd = "npm test";
|
|
22
|
+
if (/\bvitest\b/i.test(sectionContent))
|
|
23
|
+
testCmd = "npx vitest run";
|
|
24
|
+
else if (/\bjest\b/i.test(sectionContent))
|
|
25
|
+
testCmd = "npx jest";
|
|
26
|
+
else if (/\bmocha\b/i.test(sectionContent))
|
|
27
|
+
testCmd = "npx mocha";
|
|
28
|
+
// Detect build command
|
|
29
|
+
let buildCmd = "npm run build";
|
|
30
|
+
if (/\btsc\b/i.test(sectionContent))
|
|
31
|
+
buildCmd = "npx tsc";
|
|
32
|
+
return { setup: "npm install", test: testCmd, build: buildCmd, dev: "npm run dev" };
|
|
33
|
+
}
|
|
34
|
+
if (isPython) {
|
|
35
|
+
let testCmd = "python -m pytest";
|
|
36
|
+
if (/\bpytest\b/i.test(sectionContent))
|
|
37
|
+
testCmd = "pytest";
|
|
38
|
+
else if (/\bunittest\b/i.test(sectionContent))
|
|
39
|
+
testCmd = "python -m unittest discover";
|
|
40
|
+
return {
|
|
41
|
+
setup: "pip install -r requirements.txt",
|
|
42
|
+
test: testCmd,
|
|
43
|
+
build: "python -m build",
|
|
44
|
+
dev: "python -m uvicorn main:app --reload",
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
if (isRust) {
|
|
48
|
+
return {
|
|
49
|
+
setup: "cargo build",
|
|
50
|
+
test: "cargo test",
|
|
51
|
+
build: "cargo build --release",
|
|
52
|
+
dev: "cargo run",
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (isGo) {
|
|
56
|
+
return {
|
|
57
|
+
setup: "go mod download",
|
|
58
|
+
test: "go test ./...",
|
|
59
|
+
build: "go build ./...",
|
|
60
|
+
dev: "go run .",
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
export function customizeAgentMd(template, stack) {
|
|
66
|
+
const sections = [
|
|
67
|
+
{ heading: "Project Setup", command: stack.setup },
|
|
68
|
+
{ heading: "Running Tests", command: stack.test },
|
|
69
|
+
{ heading: "Build Commands", command: stack.build },
|
|
70
|
+
{ heading: "Development Server", command: stack.dev },
|
|
71
|
+
];
|
|
72
|
+
let result = template;
|
|
73
|
+
for (const { heading, command } of sections) {
|
|
74
|
+
// Replace code block content after the section heading
|
|
75
|
+
const pattern = new RegExp(`(## ${heading.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*\\n)\`\`\`bash\\n[\\s\\S]*?\`\`\``, "m");
|
|
76
|
+
result = result.replace(pattern, `$1\`\`\`bash\n${command}\n\`\`\``);
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export interface ProjectContext {
|
|
2
|
+
projectGoals: string;
|
|
3
|
+
successMetrics: string;
|
|
4
|
+
architectureConstraints: string;
|
|
5
|
+
technicalRisks: string;
|
|
6
|
+
scopeBoundaries: string;
|
|
7
|
+
targetUsers: string;
|
|
8
|
+
nonFunctionalRequirements: string;
|
|
9
|
+
}
|
|
10
|
+
export interface Story {
|
|
11
|
+
epic: string;
|
|
12
|
+
epicDescription: string;
|
|
13
|
+
id: string;
|
|
14
|
+
title: string;
|
|
15
|
+
description: string;
|
|
16
|
+
acceptanceCriteria: string[];
|
|
17
|
+
}
|
|
18
|
+
export interface TechStack {
|
|
19
|
+
setup: string;
|
|
20
|
+
test: string;
|
|
21
|
+
build: string;
|
|
22
|
+
dev: string;
|
|
23
|
+
}
|
|
24
|
+
export interface FixPlanItem {
|
|
25
|
+
id: string;
|
|
26
|
+
completed: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface FixPlanItemWithTitle extends FixPlanItem {
|
|
29
|
+
title?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface TruncationInfo {
|
|
32
|
+
field: string;
|
|
33
|
+
originalLength: number;
|
|
34
|
+
truncatedTo: number;
|
|
35
|
+
}
|
|
36
|
+
export interface SpecsChange {
|
|
37
|
+
file: string;
|
|
38
|
+
status: "added" | "modified" | "removed";
|
|
39
|
+
summary?: string;
|
|
40
|
+
}
|
|
41
|
+
export type SpecFileType = "prd" | "architecture" | "stories" | "ux" | "test-design" | "readiness" | "sprint" | "brainstorm" | "other";
|
|
42
|
+
export type Priority = "critical" | "high" | "medium" | "low";
|
|
43
|
+
export interface SpecFileMetadata {
|
|
44
|
+
path: string;
|
|
45
|
+
size: number;
|
|
46
|
+
type: SpecFileType;
|
|
47
|
+
priority: Priority;
|
|
48
|
+
description: string;
|
|
49
|
+
}
|
|
50
|
+
export interface SpecsIndex {
|
|
51
|
+
generatedAt: string;
|
|
52
|
+
totalFiles: number;
|
|
53
|
+
totalSizeKb: number;
|
|
54
|
+
files: SpecFileMetadata[];
|
|
55
|
+
}
|
|
56
|
+
export interface TransitionResult {
|
|
57
|
+
storiesCount: number;
|
|
58
|
+
warnings: string[];
|
|
59
|
+
fixPlanPreserved: boolean;
|
|
60
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/utils/config.d.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
export interface UpstreamVersions {
|
|
2
|
+
bmadCommit: string;
|
|
3
|
+
}
|
|
1
4
|
export interface BmalphConfig {
|
|
2
5
|
name: string;
|
|
3
6
|
description: string;
|
|
4
7
|
createdAt: string;
|
|
8
|
+
upstreamVersions?: UpstreamVersions;
|
|
5
9
|
}
|
|
6
10
|
export declare function readConfig(projectDir: string): Promise<BmalphConfig | null>;
|
|
7
11
|
export declare function writeConfig(projectDir: string, config: BmalphConfig): Promise<void>;
|
package/dist/utils/config.js
CHANGED
|
@@ -1,14 +1,24 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { mkdir } from "fs/promises";
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import { readJsonFile } from "./json.js";
|
|
4
4
|
import { validateConfig } from "./validate.js";
|
|
5
|
-
|
|
5
|
+
import { CONFIG_FILE } from "./constants.js";
|
|
6
|
+
import { atomicWriteFile } from "./file-system.js";
|
|
7
|
+
import { warn } from "./logger.js";
|
|
8
|
+
import { formatError } from "./errors.js";
|
|
6
9
|
export async function readConfig(projectDir) {
|
|
7
10
|
const data = await readJsonFile(join(projectDir, CONFIG_FILE));
|
|
8
11
|
if (data === null)
|
|
9
12
|
return null;
|
|
10
|
-
|
|
13
|
+
try {
|
|
14
|
+
return validateConfig(data);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
warn(`Config file is corrupted, treating as missing: ${formatError(err)}`);
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
11
20
|
}
|
|
12
21
|
export async function writeConfig(projectDir, config) {
|
|
13
|
-
await
|
|
22
|
+
await mkdir(join(projectDir, "bmalph"), { recursive: true });
|
|
23
|
+
await atomicWriteFile(join(projectDir, CONFIG_FILE), JSON.stringify(config, null, 2) + "\n");
|
|
14
24
|
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized constants for bmalph.
|
|
3
|
+
*
|
|
4
|
+
* Path constants define the standard directory names used throughout
|
|
5
|
+
* the bmalph project for BMAD, Ralph, and Claude Code integration.
|
|
6
|
+
*
|
|
7
|
+
* Numeric thresholds are used for validation, file processing, and health checks.
|
|
8
|
+
*/
|
|
9
|
+
/** Maximum allowed project name length */
|
|
10
|
+
export declare const MAX_PROJECT_NAME_LENGTH = 100;
|
|
11
|
+
/** File size threshold for "large file" warnings (50 KB) */
|
|
12
|
+
export declare const LARGE_FILE_THRESHOLD_BYTES = 50000;
|
|
13
|
+
/** Default max length for extracted content snippets */
|
|
14
|
+
export declare const DEFAULT_SNIPPET_MAX_LENGTH = 60;
|
|
15
|
+
/** Max length for section extraction from documents (increased to preserve full BMAD specs) */
|
|
16
|
+
export declare const SECTION_EXTRACT_MAX_LENGTH = 5000;
|
|
17
|
+
/** Max characters for diff line preview */
|
|
18
|
+
export declare const DIFF_LINE_PREVIEW_LENGTH = 50;
|
|
19
|
+
/** Session age warning threshold (24 hours in milliseconds) */
|
|
20
|
+
export declare const SESSION_AGE_WARNING_MS: number;
|
|
21
|
+
/** API call usage warning threshold (percentage) */
|
|
22
|
+
export declare const API_USAGE_WARNING_PERCENT = 90;
|
|
23
|
+
/** Ralph working directory (contains loop, specs, logs) */
|
|
24
|
+
export declare const RALPH_DIR = ".ralph";
|
|
25
|
+
/** BMAD agents and workflows directory */
|
|
26
|
+
export declare const BMAD_DIR = "_bmad";
|
|
27
|
+
/** bmalph state directory (config, phase tracking) */
|
|
28
|
+
export declare const BMALPH_DIR = "bmalph";
|
|
29
|
+
/** BMAD output directory (planning artifacts) */
|
|
30
|
+
export declare const BMAD_OUTPUT_DIR = "_bmad-output";
|
|
31
|
+
/** Ralph logs directory */
|
|
32
|
+
export declare const RALPH_LOGS_DIR = ".ralph/logs";
|
|
33
|
+
/** Ralph specs directory (copied from _bmad-output) */
|
|
34
|
+
export declare const RALPH_SPECS_DIR = ".ralph/specs";
|
|
35
|
+
/** Claude Code slash commands directory */
|
|
36
|
+
export declare const CLAUDE_COMMANDS_DIR = ".claude/commands";
|
|
37
|
+
/** bmalph state subdirectory (inside BMALPH_DIR) */
|
|
38
|
+
export declare const STATE_DIR = "bmalph/state";
|
|
39
|
+
/** bmalph config file path */
|
|
40
|
+
export declare const CONFIG_FILE = "bmalph/config.json";
|
|
41
|
+
/** Ralph status file path */
|
|
42
|
+
export declare const RALPH_STATUS_FILE = ".ralph/status.json";
|
|
43
|
+
/**
|
|
44
|
+
* Get absolute path to Ralph directory for a project.
|
|
45
|
+
*/
|
|
46
|
+
export declare function getRalphDir(projectDir: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Get absolute path to BMAD directory for a project.
|
|
49
|
+
*/
|
|
50
|
+
export declare function getBmadDir(projectDir: string): string;
|
|
51
|
+
/**
|
|
52
|
+
* Get absolute path to bmalph state directory for a project.
|
|
53
|
+
*/
|
|
54
|
+
export declare function getBmalphDir(projectDir: string): string;
|
|
55
|
+
/**
|
|
56
|
+
* Get absolute path to BMAD output directory for a project.
|
|
57
|
+
*/
|
|
58
|
+
export declare function getBmadOutputDir(projectDir: string): string;
|
|
59
|
+
/**
|
|
60
|
+
* Get absolute path to Ralph logs directory for a project.
|
|
61
|
+
*/
|
|
62
|
+
export declare function getRalphLogsDir(projectDir: string): string;
|
|
63
|
+
/**
|
|
64
|
+
* Get absolute path to Ralph specs directory for a project.
|
|
65
|
+
*/
|
|
66
|
+
export declare function getRalphSpecsDir(projectDir: string): string;
|
|
67
|
+
/**
|
|
68
|
+
* Get absolute path to Claude commands directory for a project.
|
|
69
|
+
*/
|
|
70
|
+
export declare function getClaudeCommandsDir(projectDir: string): string;
|