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,97 @@
|
|
|
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
|
+
import { join } from "path";
|
|
10
|
+
// =============================================================================
|
|
11
|
+
// Validation thresholds
|
|
12
|
+
// =============================================================================
|
|
13
|
+
/** Maximum allowed project name length */
|
|
14
|
+
export const MAX_PROJECT_NAME_LENGTH = 100;
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// File processing thresholds
|
|
17
|
+
// =============================================================================
|
|
18
|
+
/** File size threshold for "large file" warnings (50 KB) */
|
|
19
|
+
export const LARGE_FILE_THRESHOLD_BYTES = 50000;
|
|
20
|
+
/** Default max length for extracted content snippets */
|
|
21
|
+
export const DEFAULT_SNIPPET_MAX_LENGTH = 60;
|
|
22
|
+
/** Max length for section extraction from documents (increased to preserve full BMAD specs) */
|
|
23
|
+
export const SECTION_EXTRACT_MAX_LENGTH = 5000;
|
|
24
|
+
/** Max characters for diff line preview */
|
|
25
|
+
export const DIFF_LINE_PREVIEW_LENGTH = 50;
|
|
26
|
+
// =============================================================================
|
|
27
|
+
// Health check thresholds
|
|
28
|
+
// =============================================================================
|
|
29
|
+
/** Session age warning threshold (24 hours in milliseconds) */
|
|
30
|
+
export const SESSION_AGE_WARNING_MS = 24 * 60 * 60 * 1000;
|
|
31
|
+
/** API call usage warning threshold (percentage) */
|
|
32
|
+
export const API_USAGE_WARNING_PERCENT = 90;
|
|
33
|
+
// =============================================================================
|
|
34
|
+
// Path constants
|
|
35
|
+
// =============================================================================
|
|
36
|
+
/** Ralph working directory (contains loop, specs, logs) */
|
|
37
|
+
export const RALPH_DIR = ".ralph";
|
|
38
|
+
/** BMAD agents and workflows directory */
|
|
39
|
+
export const BMAD_DIR = "_bmad";
|
|
40
|
+
/** bmalph state directory (config, phase tracking) */
|
|
41
|
+
export const BMALPH_DIR = "bmalph";
|
|
42
|
+
/** BMAD output directory (planning artifacts) */
|
|
43
|
+
export const BMAD_OUTPUT_DIR = "_bmad-output";
|
|
44
|
+
/** Ralph logs directory */
|
|
45
|
+
export const RALPH_LOGS_DIR = ".ralph/logs";
|
|
46
|
+
/** Ralph specs directory (copied from _bmad-output) */
|
|
47
|
+
export const RALPH_SPECS_DIR = ".ralph/specs";
|
|
48
|
+
/** Claude Code slash commands directory */
|
|
49
|
+
export const CLAUDE_COMMANDS_DIR = ".claude/commands";
|
|
50
|
+
/** bmalph state subdirectory (inside BMALPH_DIR) */
|
|
51
|
+
export const STATE_DIR = "bmalph/state";
|
|
52
|
+
/** bmalph config file path */
|
|
53
|
+
export const CONFIG_FILE = "bmalph/config.json";
|
|
54
|
+
/** Ralph status file path */
|
|
55
|
+
export const RALPH_STATUS_FILE = ".ralph/status.json";
|
|
56
|
+
/**
|
|
57
|
+
* Get absolute path to Ralph directory for a project.
|
|
58
|
+
*/
|
|
59
|
+
export function getRalphDir(projectDir) {
|
|
60
|
+
return join(projectDir, RALPH_DIR);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get absolute path to BMAD directory for a project.
|
|
64
|
+
*/
|
|
65
|
+
export function getBmadDir(projectDir) {
|
|
66
|
+
return join(projectDir, BMAD_DIR);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get absolute path to bmalph state directory for a project.
|
|
70
|
+
*/
|
|
71
|
+
export function getBmalphDir(projectDir) {
|
|
72
|
+
return join(projectDir, BMALPH_DIR);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get absolute path to BMAD output directory for a project.
|
|
76
|
+
*/
|
|
77
|
+
export function getBmadOutputDir(projectDir) {
|
|
78
|
+
return join(projectDir, BMAD_OUTPUT_DIR);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get absolute path to Ralph logs directory for a project.
|
|
82
|
+
*/
|
|
83
|
+
export function getRalphLogsDir(projectDir) {
|
|
84
|
+
return join(projectDir, RALPH_LOGS_DIR);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get absolute path to Ralph specs directory for a project.
|
|
88
|
+
*/
|
|
89
|
+
export function getRalphSpecsDir(projectDir) {
|
|
90
|
+
return join(projectDir, RALPH_SPECS_DIR);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get absolute path to Claude commands directory for a project.
|
|
94
|
+
*/
|
|
95
|
+
export function getClaudeCommandsDir(projectDir) {
|
|
96
|
+
return join(projectDir, CLAUDE_COMMANDS_DIR);
|
|
97
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
export function logDryRunAction(action) {
|
|
3
|
+
const prefix = chalk.dim("[dry-run]");
|
|
4
|
+
switch (action.type) {
|
|
5
|
+
case "create":
|
|
6
|
+
console.log(`${prefix} Would create: ${chalk.green(action.path)}`);
|
|
7
|
+
break;
|
|
8
|
+
case "modify":
|
|
9
|
+
console.log(`${prefix} Would modify: ${chalk.yellow(action.path)}`);
|
|
10
|
+
break;
|
|
11
|
+
case "skip":
|
|
12
|
+
console.log(`${prefix} Would skip: ${chalk.dim(action.path)}${action.reason ? ` (${action.reason})` : ""}`);
|
|
13
|
+
break;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function formatDryRunSummary(actions) {
|
|
17
|
+
if (actions.length === 0) {
|
|
18
|
+
return chalk.dim("No changes would be made.");
|
|
19
|
+
}
|
|
20
|
+
const lines = [];
|
|
21
|
+
lines.push(chalk.blue("\n[dry-run] Would perform the following actions:\n"));
|
|
22
|
+
const creates = actions.filter((a) => a.type === "create");
|
|
23
|
+
const modifies = actions.filter((a) => a.type === "modify");
|
|
24
|
+
const skips = actions.filter((a) => a.type === "skip");
|
|
25
|
+
if (creates.length > 0) {
|
|
26
|
+
lines.push(chalk.green("Would create:"));
|
|
27
|
+
for (const action of creates) {
|
|
28
|
+
lines.push(` ${action.path}`);
|
|
29
|
+
}
|
|
30
|
+
lines.push("");
|
|
31
|
+
}
|
|
32
|
+
if (modifies.length > 0) {
|
|
33
|
+
lines.push(chalk.yellow("Would modify:"));
|
|
34
|
+
for (const action of modifies) {
|
|
35
|
+
lines.push(` ${action.path}`);
|
|
36
|
+
}
|
|
37
|
+
lines.push("");
|
|
38
|
+
}
|
|
39
|
+
if (skips.length > 0) {
|
|
40
|
+
lines.push(chalk.dim("Would skip:"));
|
|
41
|
+
for (const action of skips) {
|
|
42
|
+
lines.push(` ${action.path}${action.reason ? ` (${action.reason})` : ""}`);
|
|
43
|
+
}
|
|
44
|
+
lines.push("");
|
|
45
|
+
}
|
|
46
|
+
lines.push(chalk.dim("No changes made."));
|
|
47
|
+
return lines.join("\n");
|
|
48
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error formatting utilities for consistent error handling.
|
|
3
|
+
*
|
|
4
|
+
* Provides helper functions to safely extract error messages from
|
|
5
|
+
* unknown error types (catch blocks receive `unknown` in TypeScript).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Extract error message from an unknown error value.
|
|
9
|
+
*
|
|
10
|
+
* @param error - Any caught error (Error instance, string, or other)
|
|
11
|
+
* @returns The error message as a string
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* try {
|
|
16
|
+
* await riskyOperation();
|
|
17
|
+
* } catch (err) {
|
|
18
|
+
* console.error(formatError(err));
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Check if an error is an ENOENT (file not found) filesystem error.
|
|
24
|
+
*
|
|
25
|
+
* @param err - Any caught error value
|
|
26
|
+
* @returns true if the error is an Error with code "ENOENT"
|
|
27
|
+
*/
|
|
28
|
+
export declare function isEnoent(err: unknown): boolean;
|
|
29
|
+
export declare function formatError(error: unknown): string;
|
|
30
|
+
/**
|
|
31
|
+
* Create a formatted error message with a prefix.
|
|
32
|
+
*
|
|
33
|
+
* @param prefix - Context for the error (e.g., "Failed to read file")
|
|
34
|
+
* @param error - The caught error
|
|
35
|
+
* @returns Formatted message like "Failed to read file: <error message>"
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* try {
|
|
40
|
+
* await readFile(path);
|
|
41
|
+
* } catch (err) {
|
|
42
|
+
* throw new Error(formatErrorMessage("Failed to read config", err));
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare function formatErrorMessage(prefix: string, error: unknown): string;
|
|
47
|
+
/**
|
|
48
|
+
* Wrap an async command function with standard error handling.
|
|
49
|
+
*
|
|
50
|
+
* Catches any errors, prints them in red to stderr, and sets process.exitCode to 1.
|
|
51
|
+
* Uses process.exitCode instead of process.exit() to allow graceful cleanup.
|
|
52
|
+
*
|
|
53
|
+
* @param fn - Async function to execute
|
|
54
|
+
* @returns Promise that resolves when the function completes (or error is handled)
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```ts
|
|
58
|
+
* export async function myCommand(options: MyOptions): Promise<void> {
|
|
59
|
+
* await withErrorHandling(() => runMyCommand(options));
|
|
60
|
+
* }
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare function withErrorHandling(fn: () => Promise<void>): Promise<void>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error formatting utilities for consistent error handling.
|
|
3
|
+
*
|
|
4
|
+
* Provides helper functions to safely extract error messages from
|
|
5
|
+
* unknown error types (catch blocks receive `unknown` in TypeScript).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Extract error message from an unknown error value.
|
|
9
|
+
*
|
|
10
|
+
* @param error - Any caught error (Error instance, string, or other)
|
|
11
|
+
* @returns The error message as a string
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* try {
|
|
16
|
+
* await riskyOperation();
|
|
17
|
+
* } catch (err) {
|
|
18
|
+
* console.error(formatError(err));
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Check if an error is an ENOENT (file not found) filesystem error.
|
|
24
|
+
*
|
|
25
|
+
* @param err - Any caught error value
|
|
26
|
+
* @returns true if the error is an Error with code "ENOENT"
|
|
27
|
+
*/
|
|
28
|
+
export function isEnoent(err) {
|
|
29
|
+
return err instanceof Error && "code" in err && err.code === "ENOENT";
|
|
30
|
+
}
|
|
31
|
+
export function formatError(error) {
|
|
32
|
+
if (error instanceof Error) {
|
|
33
|
+
if (error.cause) {
|
|
34
|
+
return `${error.message}: ${formatError(error.cause)}`;
|
|
35
|
+
}
|
|
36
|
+
return error.message;
|
|
37
|
+
}
|
|
38
|
+
return String(error);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create a formatted error message with a prefix.
|
|
42
|
+
*
|
|
43
|
+
* @param prefix - Context for the error (e.g., "Failed to read file")
|
|
44
|
+
* @param error - The caught error
|
|
45
|
+
* @returns Formatted message like "Failed to read file: <error message>"
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* try {
|
|
50
|
+
* await readFile(path);
|
|
51
|
+
* } catch (err) {
|
|
52
|
+
* throw new Error(formatErrorMessage("Failed to read config", err));
|
|
53
|
+
* }
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export function formatErrorMessage(prefix, error) {
|
|
57
|
+
return `${prefix}: ${formatError(error)}`;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Wrap an async command function with standard error handling.
|
|
61
|
+
*
|
|
62
|
+
* Catches any errors, prints them in red to stderr, and sets process.exitCode to 1.
|
|
63
|
+
* Uses process.exitCode instead of process.exit() to allow graceful cleanup.
|
|
64
|
+
*
|
|
65
|
+
* @param fn - Async function to execute
|
|
66
|
+
* @returns Promise that resolves when the function completes (or error is handled)
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* export async function myCommand(options: MyOptions): Promise<void> {
|
|
71
|
+
* await withErrorHandling(() => runMyCommand(options));
|
|
72
|
+
* }
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export async function withErrorHandling(fn) {
|
|
76
|
+
try {
|
|
77
|
+
await fn();
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
const message = formatError(err);
|
|
81
|
+
// Import chalk dynamically to avoid circular dependencies
|
|
82
|
+
const chalk = await import("chalk");
|
|
83
|
+
console.error(chalk.default.red(`Error: ${message}`));
|
|
84
|
+
process.exitCode = 1;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks whether a file or directory exists at the given path.
|
|
3
|
+
*/
|
|
4
|
+
export declare function exists(path: string): Promise<boolean>;
|
|
5
|
+
/**
|
|
6
|
+
* Writes content to a file atomically using a temp file + rename.
|
|
7
|
+
* Prevents partial writes from corrupting the target file.
|
|
8
|
+
*/
|
|
9
|
+
export declare function atomicWriteFile(target: string, content: string): Promise<void>;
|
|
10
|
+
/**
|
|
11
|
+
* Recursively gets all files from a directory.
|
|
12
|
+
* Returns relative paths using forward slashes (cross-platform).
|
|
13
|
+
*/
|
|
14
|
+
export declare function getFilesRecursive(dir: string, basePath?: string): Promise<string[]>;
|
|
15
|
+
export interface FileWithContent {
|
|
16
|
+
path: string;
|
|
17
|
+
size: number;
|
|
18
|
+
content: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Recursively gets all markdown files from a directory with their content.
|
|
22
|
+
* Returns relative paths using forward slashes (cross-platform).
|
|
23
|
+
*/
|
|
24
|
+
export declare function getMarkdownFilesWithContent(dir: string, basePath?: string): Promise<FileWithContent[]>;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { access, readFile, readdir, stat, writeFile, rename, unlink } from "fs/promises";
|
|
2
|
+
import { join, extname } from "path";
|
|
3
|
+
import { randomUUID } from "crypto";
|
|
4
|
+
import { isEnoent } from "./errors.js";
|
|
5
|
+
/**
|
|
6
|
+
* Checks whether a file or directory exists at the given path.
|
|
7
|
+
*/
|
|
8
|
+
export async function exists(path) {
|
|
9
|
+
try {
|
|
10
|
+
await access(path);
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
if (isEnoent(err))
|
|
15
|
+
return false;
|
|
16
|
+
throw err;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Writes content to a file atomically using a temp file + rename.
|
|
21
|
+
* Prevents partial writes from corrupting the target file.
|
|
22
|
+
*/
|
|
23
|
+
export async function atomicWriteFile(target, content) {
|
|
24
|
+
const tmp = `${target}.${randomUUID()}.tmp`;
|
|
25
|
+
try {
|
|
26
|
+
await writeFile(tmp, content, { flag: "wx" });
|
|
27
|
+
await rename(tmp, target);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
try {
|
|
31
|
+
await unlink(tmp);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Ignore cleanup errors
|
|
35
|
+
}
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Recursively gets all files from a directory.
|
|
41
|
+
* Returns relative paths using forward slashes (cross-platform).
|
|
42
|
+
*/
|
|
43
|
+
export async function getFilesRecursive(dir, basePath = "") {
|
|
44
|
+
const files = [];
|
|
45
|
+
try {
|
|
46
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
47
|
+
for (const entry of entries) {
|
|
48
|
+
if (entry.isSymbolicLink())
|
|
49
|
+
continue;
|
|
50
|
+
const relativePath = basePath ? `${basePath}/${entry.name}` : entry.name;
|
|
51
|
+
if (entry.isDirectory()) {
|
|
52
|
+
const subFiles = await getFilesRecursive(join(dir, entry.name), relativePath);
|
|
53
|
+
files.push(...subFiles);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
files.push(relativePath);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
if (!isEnoent(err))
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
return files;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Recursively gets all markdown files from a directory with their content.
|
|
68
|
+
* Returns relative paths using forward slashes (cross-platform).
|
|
69
|
+
*/
|
|
70
|
+
export async function getMarkdownFilesWithContent(dir, basePath = "") {
|
|
71
|
+
const files = [];
|
|
72
|
+
try {
|
|
73
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
74
|
+
for (const entry of entries) {
|
|
75
|
+
if (entry.isSymbolicLink())
|
|
76
|
+
continue;
|
|
77
|
+
const fullPath = join(dir, entry.name);
|
|
78
|
+
const relativePath = basePath ? `${basePath}/${entry.name}` : entry.name;
|
|
79
|
+
if (entry.isDirectory()) {
|
|
80
|
+
const subFiles = await getMarkdownFilesWithContent(fullPath, relativePath);
|
|
81
|
+
files.push(...subFiles);
|
|
82
|
+
}
|
|
83
|
+
else if (entry.isFile() && extname(entry.name).toLowerCase() === ".md") {
|
|
84
|
+
const stats = await stat(fullPath);
|
|
85
|
+
const content = await readFile(fullPath, "utf-8");
|
|
86
|
+
files.push({
|
|
87
|
+
path: relativePath,
|
|
88
|
+
size: stats.size,
|
|
89
|
+
content,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
if (!isEnoent(err))
|
|
96
|
+
throw err;
|
|
97
|
+
}
|
|
98
|
+
return files;
|
|
99
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { BundledVersions } from "../installer.js";
|
|
2
|
+
export interface RepoInfo {
|
|
3
|
+
owner: string;
|
|
4
|
+
repo: string;
|
|
5
|
+
branch: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CommitInfo {
|
|
8
|
+
sha: string;
|
|
9
|
+
shortSha: string;
|
|
10
|
+
message: string;
|
|
11
|
+
date: string;
|
|
12
|
+
}
|
|
13
|
+
export type GitHubErrorType = "network" | "timeout" | "rate-limit" | "not-found" | "api-error";
|
|
14
|
+
export interface GitHubError {
|
|
15
|
+
type: GitHubErrorType;
|
|
16
|
+
message: string;
|
|
17
|
+
repo?: string;
|
|
18
|
+
status?: number;
|
|
19
|
+
}
|
|
20
|
+
export type FetchResult<T> = {
|
|
21
|
+
success: true;
|
|
22
|
+
data: T;
|
|
23
|
+
} | {
|
|
24
|
+
success: false;
|
|
25
|
+
error: GitHubError;
|
|
26
|
+
};
|
|
27
|
+
export interface UpstreamStatus {
|
|
28
|
+
bundledSha: string;
|
|
29
|
+
latestSha: string;
|
|
30
|
+
isUpToDate: boolean;
|
|
31
|
+
compareUrl: string;
|
|
32
|
+
}
|
|
33
|
+
export interface CheckUpstreamResult {
|
|
34
|
+
bmad: UpstreamStatus | null;
|
|
35
|
+
errors: GitHubError[];
|
|
36
|
+
}
|
|
37
|
+
interface FetchOptions {
|
|
38
|
+
timeoutMs?: number;
|
|
39
|
+
}
|
|
40
|
+
interface GitHubClientOptions {
|
|
41
|
+
cacheTtlMs?: number;
|
|
42
|
+
maxCacheSize?: number;
|
|
43
|
+
}
|
|
44
|
+
interface CacheStats {
|
|
45
|
+
size: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* GitHub API client with instance-level caching.
|
|
49
|
+
* Each instance maintains its own cache, improving testability.
|
|
50
|
+
*/
|
|
51
|
+
export declare class GitHubClient {
|
|
52
|
+
private cache;
|
|
53
|
+
private cacheTtlMs;
|
|
54
|
+
private maxCacheSize;
|
|
55
|
+
constructor(options?: GitHubClientOptions);
|
|
56
|
+
clearCache(): void;
|
|
57
|
+
getCacheStats(): CacheStats;
|
|
58
|
+
private getCacheKey;
|
|
59
|
+
private getCachedResult;
|
|
60
|
+
private setCachedResult;
|
|
61
|
+
fetchLatestCommit(repo: RepoInfo, options?: FetchOptions): Promise<FetchResult<CommitInfo>>;
|
|
62
|
+
checkUpstream(bundled: BundledVersions): Promise<CheckUpstreamResult>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Determines why upstream checks were skipped based on error types.
|
|
66
|
+
*/
|
|
67
|
+
export declare function getSkipReason(errors: GitHubError[]): string;
|
|
68
|
+
/**
|
|
69
|
+
* Clear the default client's cache.
|
|
70
|
+
* For testing, prefer creating a new GitHubClient instance instead.
|
|
71
|
+
*/
|
|
72
|
+
export declare function clearCache(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Fetch the latest commit from a GitHub repository.
|
|
75
|
+
* Uses the default shared client instance.
|
|
76
|
+
*/
|
|
77
|
+
export declare function fetchLatestCommit(repo: RepoInfo, options?: FetchOptions): Promise<FetchResult<CommitInfo>>;
|
|
78
|
+
/**
|
|
79
|
+
* Check upstream repositories for updates.
|
|
80
|
+
* Uses the default shared client instance.
|
|
81
|
+
*/
|
|
82
|
+
export declare function checkUpstream(bundled: BundledVersions): Promise<CheckUpstreamResult>;
|
|
83
|
+
export {};
|