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,230 @@
|
|
|
1
|
+
import { formatError } from "./errors.js";
|
|
2
|
+
const BMAD_REPO = {
|
|
3
|
+
owner: "bmad-code-org",
|
|
4
|
+
repo: "BMAD-METHOD",
|
|
5
|
+
branch: "main",
|
|
6
|
+
};
|
|
7
|
+
const DEFAULT_TIMEOUT_MS = 10000;
|
|
8
|
+
const DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
9
|
+
const DEFAULT_MAX_CACHE_SIZE = 100;
|
|
10
|
+
function classifyError(status, headers) {
|
|
11
|
+
if (status === 404) {
|
|
12
|
+
return "not-found";
|
|
13
|
+
}
|
|
14
|
+
if (status === 403) {
|
|
15
|
+
const remaining = headers.get("X-RateLimit-Remaining");
|
|
16
|
+
if (remaining === "0") {
|
|
17
|
+
return "rate-limit";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return "api-error";
|
|
21
|
+
}
|
|
22
|
+
function generateCompareUrl(repo, bundledSha, latestSha) {
|
|
23
|
+
return `https://github.com/${repo.owner}/${repo.repo}/compare/${bundledSha}...${latestSha}`;
|
|
24
|
+
}
|
|
25
|
+
function compareShas(bundledSha, latestShortSha) {
|
|
26
|
+
return latestShortSha.slice(0, 8) === bundledSha.slice(0, 8);
|
|
27
|
+
}
|
|
28
|
+
function buildUpstreamStatus(repo, bundledSha, latestShortSha) {
|
|
29
|
+
return {
|
|
30
|
+
bundledSha,
|
|
31
|
+
latestSha: latestShortSha,
|
|
32
|
+
isUpToDate: compareShas(bundledSha, latestShortSha),
|
|
33
|
+
compareUrl: generateCompareUrl(repo, bundledSha, latestShortSha),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* GitHub API client with instance-level caching.
|
|
38
|
+
* Each instance maintains its own cache, improving testability.
|
|
39
|
+
*/
|
|
40
|
+
export class GitHubClient {
|
|
41
|
+
cache = new Map();
|
|
42
|
+
cacheTtlMs;
|
|
43
|
+
maxCacheSize;
|
|
44
|
+
constructor(options = {}) {
|
|
45
|
+
this.cacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;
|
|
46
|
+
this.maxCacheSize = options.maxCacheSize ?? DEFAULT_MAX_CACHE_SIZE;
|
|
47
|
+
}
|
|
48
|
+
clearCache() {
|
|
49
|
+
this.cache.clear();
|
|
50
|
+
}
|
|
51
|
+
getCacheStats() {
|
|
52
|
+
return { size: this.cache.size };
|
|
53
|
+
}
|
|
54
|
+
getCacheKey(repo) {
|
|
55
|
+
return `${repo.owner}/${repo.repo}/${repo.branch}`;
|
|
56
|
+
}
|
|
57
|
+
getCachedResult(repo) {
|
|
58
|
+
const key = this.getCacheKey(repo);
|
|
59
|
+
const entry = this.cache.get(key);
|
|
60
|
+
if (!entry) {
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
// Remove stale entry immediately instead of leaving it in cache
|
|
64
|
+
if (Date.now() - entry.timestamp >= this.cacheTtlMs) {
|
|
65
|
+
this.cache.delete(key);
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
// Update lastAccessed for LRU tracking
|
|
69
|
+
entry.lastAccessed = Date.now();
|
|
70
|
+
return entry.data;
|
|
71
|
+
}
|
|
72
|
+
setCachedResult(repo, data) {
|
|
73
|
+
const key = this.getCacheKey(repo);
|
|
74
|
+
const now = Date.now();
|
|
75
|
+
// Clean up expired entries before checking size (prevents stale entries from occupying space)
|
|
76
|
+
for (const [k, v] of this.cache.entries()) {
|
|
77
|
+
if (now - v.timestamp >= this.cacheTtlMs) {
|
|
78
|
+
this.cache.delete(k);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Evict oldest entry if cache is still at max size after cleanup (LRU eviction)
|
|
82
|
+
if (this.cache.size >= this.maxCacheSize && !this.cache.has(key)) {
|
|
83
|
+
let oldestKey = null;
|
|
84
|
+
let oldestTime = Infinity;
|
|
85
|
+
for (const [k, v] of this.cache.entries()) {
|
|
86
|
+
if (v.lastAccessed < oldestTime) {
|
|
87
|
+
oldestTime = v.lastAccessed;
|
|
88
|
+
oldestKey = k;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (oldestKey) {
|
|
92
|
+
this.cache.delete(oldestKey);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
this.cache.set(key, { data, timestamp: now, lastAccessed: now });
|
|
96
|
+
}
|
|
97
|
+
async fetchLatestCommit(repo, options = {}) {
|
|
98
|
+
// Check cache first
|
|
99
|
+
const cached = this.getCachedResult(repo);
|
|
100
|
+
if (cached) {
|
|
101
|
+
return { success: true, data: cached };
|
|
102
|
+
}
|
|
103
|
+
const url = `https://api.github.com/repos/${repo.owner}/${repo.repo}/commits/${repo.branch}`;
|
|
104
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
105
|
+
const controller = new AbortController();
|
|
106
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
107
|
+
try {
|
|
108
|
+
const response = await fetch(url, {
|
|
109
|
+
headers: {
|
|
110
|
+
Accept: "application/vnd.github.v3+json",
|
|
111
|
+
"User-Agent": "bmalph-cli",
|
|
112
|
+
},
|
|
113
|
+
signal: controller.signal,
|
|
114
|
+
});
|
|
115
|
+
clearTimeout(timeoutId);
|
|
116
|
+
if (!response.ok) {
|
|
117
|
+
const errorType = classifyError(response.status, response.headers);
|
|
118
|
+
return {
|
|
119
|
+
success: false,
|
|
120
|
+
error: {
|
|
121
|
+
type: errorType,
|
|
122
|
+
message: `GitHub API error: ${response.status}`,
|
|
123
|
+
status: response.status,
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const data = (await response.json());
|
|
128
|
+
// Validate response structure before accessing nested properties
|
|
129
|
+
if (!data ||
|
|
130
|
+
typeof data !== "object" ||
|
|
131
|
+
!("sha" in data) ||
|
|
132
|
+
typeof data.sha !== "string" ||
|
|
133
|
+
!("commit" in data) ||
|
|
134
|
+
!data.commit ||
|
|
135
|
+
typeof data.commit?.message !== "string" ||
|
|
136
|
+
!data.commit?.author ||
|
|
137
|
+
typeof data.commit?.author?.date !== "string") {
|
|
138
|
+
return {
|
|
139
|
+
success: false,
|
|
140
|
+
error: {
|
|
141
|
+
type: "api-error",
|
|
142
|
+
message: "Invalid response structure from GitHub API",
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const validData = data;
|
|
147
|
+
const commitInfo = {
|
|
148
|
+
sha: validData.sha,
|
|
149
|
+
shortSha: validData.sha.slice(0, 8),
|
|
150
|
+
message: validData.commit.message,
|
|
151
|
+
date: validData.commit.author.date,
|
|
152
|
+
};
|
|
153
|
+
// Cache successful result
|
|
154
|
+
this.setCachedResult(repo, commitInfo);
|
|
155
|
+
return { success: true, data: commitInfo };
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
clearTimeout(timeoutId);
|
|
159
|
+
if (err instanceof DOMException && err.name === "AbortError") {
|
|
160
|
+
return {
|
|
161
|
+
success: false,
|
|
162
|
+
error: {
|
|
163
|
+
type: "timeout",
|
|
164
|
+
message: `Request timed out after ${timeoutMs}ms`,
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
success: false,
|
|
170
|
+
error: {
|
|
171
|
+
type: "network",
|
|
172
|
+
message: `Network error: ${formatError(err)}`,
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async checkUpstream(bundled) {
|
|
178
|
+
const errors = [];
|
|
179
|
+
let bmadStatus = null;
|
|
180
|
+
const bmadResult = await this.fetchLatestCommit(BMAD_REPO);
|
|
181
|
+
if (bmadResult.success) {
|
|
182
|
+
bmadStatus = buildUpstreamStatus(BMAD_REPO, bundled.bmadCommit, bmadResult.data.shortSha);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
errors.push({ ...bmadResult.error, repo: "bmad" });
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
bmad: bmadStatus,
|
|
189
|
+
errors,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Determines why upstream checks were skipped based on error types.
|
|
195
|
+
*/
|
|
196
|
+
export function getSkipReason(errors) {
|
|
197
|
+
if (errors.length === 0)
|
|
198
|
+
return "unknown";
|
|
199
|
+
const types = new Set(errors.map((e) => e.type));
|
|
200
|
+
if (types.has("rate-limit"))
|
|
201
|
+
return "rate limited";
|
|
202
|
+
if (types.has("network"))
|
|
203
|
+
return "offline";
|
|
204
|
+
if (types.has("timeout"))
|
|
205
|
+
return "timeout";
|
|
206
|
+
return "error";
|
|
207
|
+
}
|
|
208
|
+
// Default client instance for backward compatibility
|
|
209
|
+
const defaultClient = new GitHubClient();
|
|
210
|
+
/**
|
|
211
|
+
* Clear the default client's cache.
|
|
212
|
+
* For testing, prefer creating a new GitHubClient instance instead.
|
|
213
|
+
*/
|
|
214
|
+
export function clearCache() {
|
|
215
|
+
defaultClient.clearCache();
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Fetch the latest commit from a GitHub repository.
|
|
219
|
+
* Uses the default shared client instance.
|
|
220
|
+
*/
|
|
221
|
+
export async function fetchLatestCommit(repo, options = {}) {
|
|
222
|
+
return defaultClient.fetchLatestCommit(repo, options);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Check upstream repositories for updates.
|
|
226
|
+
* Uses the default shared client instance.
|
|
227
|
+
*/
|
|
228
|
+
export async function checkUpstream(bundled) {
|
|
229
|
+
return defaultClient.checkUpstream(bundled);
|
|
230
|
+
}
|
package/dist/utils/json.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { readFile } from "fs/promises";
|
|
2
|
+
import { isEnoent } from "./errors.js";
|
|
2
3
|
/**
|
|
3
4
|
* Reads and parses a JSON file with proper error discrimination:
|
|
4
5
|
* - File not found → returns null
|
|
@@ -11,7 +12,7 @@ export async function readJsonFile(path) {
|
|
|
11
12
|
content = await readFile(path, "utf-8");
|
|
12
13
|
}
|
|
13
14
|
catch (err) {
|
|
14
|
-
if (err
|
|
15
|
+
if (isEnoent(err)) {
|
|
15
16
|
return null;
|
|
16
17
|
}
|
|
17
18
|
throw err;
|
|
@@ -20,7 +21,6 @@ export async function readJsonFile(path) {
|
|
|
20
21
|
return JSON.parse(content);
|
|
21
22
|
}
|
|
22
23
|
catch (err) {
|
|
23
|
-
|
|
24
|
-
throw new Error(`Invalid JSON in ${path}: ${message}`);
|
|
24
|
+
throw new Error(`Invalid JSON in ${path}`, { cause: err });
|
|
25
25
|
}
|
|
26
26
|
}
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
export declare function setVerbose(value: boolean): void;
|
|
2
2
|
export declare function isVerbose(): boolean;
|
|
3
|
+
export declare function setQuiet(value: boolean): void;
|
|
4
|
+
export declare function isQuiet(): boolean;
|
|
3
5
|
export declare function debug(message: string): void;
|
|
6
|
+
export declare function info(message: string): void;
|
|
7
|
+
export declare function warn(message: string): void;
|
|
8
|
+
export declare function error(message: string): void;
|
|
9
|
+
export declare function success(message: string): void;
|
package/dist/utils/logger.js
CHANGED
|
@@ -1,13 +1,40 @@
|
|
|
1
1
|
import chalk from "chalk";
|
|
2
2
|
let verbose = false;
|
|
3
|
+
let quiet = false;
|
|
3
4
|
export function setVerbose(value) {
|
|
4
5
|
verbose = value;
|
|
5
6
|
}
|
|
6
7
|
export function isVerbose() {
|
|
7
8
|
return verbose;
|
|
8
9
|
}
|
|
10
|
+
export function setQuiet(value) {
|
|
11
|
+
quiet = value;
|
|
12
|
+
}
|
|
13
|
+
export function isQuiet() {
|
|
14
|
+
return quiet;
|
|
15
|
+
}
|
|
9
16
|
export function debug(message) {
|
|
17
|
+
if (quiet)
|
|
18
|
+
return;
|
|
10
19
|
if (verbose) {
|
|
11
20
|
console.log(chalk.dim(`[debug] ${message}`));
|
|
12
21
|
}
|
|
13
22
|
}
|
|
23
|
+
export function info(message) {
|
|
24
|
+
if (quiet)
|
|
25
|
+
return;
|
|
26
|
+
console.log(chalk.blue(message));
|
|
27
|
+
}
|
|
28
|
+
export function warn(message) {
|
|
29
|
+
if (quiet)
|
|
30
|
+
return;
|
|
31
|
+
console.log(chalk.yellow(message));
|
|
32
|
+
}
|
|
33
|
+
export function error(message) {
|
|
34
|
+
console.error(chalk.red(message));
|
|
35
|
+
}
|
|
36
|
+
export function success(message) {
|
|
37
|
+
if (quiet)
|
|
38
|
+
return;
|
|
39
|
+
console.log(chalk.green(message));
|
|
40
|
+
}
|
package/dist/utils/state.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { RalphLoopStatus } from "./validate.js";
|
|
1
2
|
export interface BmalphState {
|
|
2
3
|
currentPhase: number;
|
|
3
4
|
status: "planning" | "implementing" | "completed";
|
|
@@ -20,10 +21,6 @@ export declare function readState(projectDir: string): Promise<BmalphState | nul
|
|
|
20
21
|
export declare function writeState(projectDir: string, state: BmalphState): Promise<void>;
|
|
21
22
|
export declare function getPhaseLabel(phase: number): string;
|
|
22
23
|
export declare function getPhaseInfo(phase: number): PhaseInfo;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
tasksCompleted: number;
|
|
27
|
-
tasksTotal: number;
|
|
28
|
-
}
|
|
29
|
-
export declare function readRalphStatus(projectDir: string): Promise<RalphStatus>;
|
|
24
|
+
/** @deprecated Use RalphLoopStatus from validate.ts instead */
|
|
25
|
+
export type RalphStatus = RalphLoopStatus;
|
|
26
|
+
export declare function readRalphStatus(projectDir: string): Promise<RalphLoopStatus>;
|
package/dist/utils/state.js
CHANGED
|
@@ -1,20 +1,27 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { mkdir } from "fs/promises";
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import { readJsonFile } from "./json.js";
|
|
4
|
-
import { validateState } from "./validate.js";
|
|
5
|
-
|
|
4
|
+
import { validateState, validateRalphLoopStatus, normalizeRalphStatus } from "./validate.js";
|
|
5
|
+
import { STATE_DIR, RALPH_STATUS_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 readState(projectDir) {
|
|
7
10
|
const data = await readJsonFile(join(projectDir, STATE_DIR, "current-phase.json"));
|
|
8
11
|
if (data === null)
|
|
9
12
|
return null;
|
|
10
|
-
|
|
13
|
+
try {
|
|
14
|
+
return validateState(data);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
warn(`State file is corrupted, treating as uninitialized: ${formatError(err)}`);
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
11
20
|
}
|
|
12
21
|
export async function writeState(projectDir, state) {
|
|
13
22
|
await mkdir(join(projectDir, STATE_DIR), { recursive: true });
|
|
14
23
|
const target = join(projectDir, STATE_DIR, "current-phase.json");
|
|
15
|
-
|
|
16
|
-
await writeFile(tmp, JSON.stringify(state, null, 2) + "\n");
|
|
17
|
-
await rename(tmp, target);
|
|
24
|
+
await atomicWriteFile(target, JSON.stringify(state, null, 2) + "\n");
|
|
18
25
|
}
|
|
19
26
|
export function getPhaseLabel(phase) {
|
|
20
27
|
const labels = {
|
|
@@ -31,34 +38,130 @@ export function getPhaseInfo(phase) {
|
|
|
31
38
|
name: "Analysis",
|
|
32
39
|
agent: "Analyst",
|
|
33
40
|
commands: [
|
|
34
|
-
{
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
{
|
|
42
|
+
code: "BP",
|
|
43
|
+
name: "Brainstorm Project",
|
|
44
|
+
agent: "analyst",
|
|
45
|
+
description: "Expert guided facilitation through brainstorming techniques",
|
|
46
|
+
required: false,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
code: "MR",
|
|
50
|
+
name: "Market Research",
|
|
51
|
+
agent: "analyst",
|
|
52
|
+
description: "Market analysis, competitive landscape, customer needs",
|
|
53
|
+
required: false,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
code: "DR",
|
|
57
|
+
name: "Domain Research",
|
|
58
|
+
agent: "analyst",
|
|
59
|
+
description: "Industry domain deep dive, subject matter expertise",
|
|
60
|
+
required: false,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
code: "TR",
|
|
64
|
+
name: "Technical Research",
|
|
65
|
+
agent: "analyst",
|
|
66
|
+
description: "Technical feasibility, architecture options",
|
|
67
|
+
required: false,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
code: "CB",
|
|
71
|
+
name: "Create Brief",
|
|
72
|
+
agent: "analyst",
|
|
73
|
+
description: "Guided experience to nail down your product idea",
|
|
74
|
+
required: false,
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
code: "VB",
|
|
78
|
+
name: "Validate Brief",
|
|
79
|
+
agent: "analyst",
|
|
80
|
+
description: "Validates product brief completeness",
|
|
81
|
+
required: false,
|
|
82
|
+
},
|
|
40
83
|
],
|
|
41
84
|
},
|
|
42
85
|
2: {
|
|
43
86
|
name: "Planning",
|
|
44
87
|
agent: "PM (John)",
|
|
45
88
|
commands: [
|
|
46
|
-
{
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
89
|
+
{
|
|
90
|
+
code: "CP",
|
|
91
|
+
name: "Create PRD",
|
|
92
|
+
agent: "pm",
|
|
93
|
+
description: "Expert led facilitation to produce your PRD",
|
|
94
|
+
required: true,
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
code: "VP",
|
|
98
|
+
name: "Validate PRD",
|
|
99
|
+
agent: "pm",
|
|
100
|
+
description: "Validate PRD is comprehensive and cohesive",
|
|
101
|
+
required: false,
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
code: "CU",
|
|
105
|
+
name: "Create UX",
|
|
106
|
+
agent: "ux-designer",
|
|
107
|
+
description: "Guidance through realizing the plan for your UX",
|
|
108
|
+
required: false,
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
code: "VU",
|
|
112
|
+
name: "Validate UX",
|
|
113
|
+
agent: "ux-designer",
|
|
114
|
+
description: "Validates UX design deliverables",
|
|
115
|
+
required: false,
|
|
116
|
+
},
|
|
50
117
|
],
|
|
51
118
|
},
|
|
52
119
|
3: {
|
|
53
120
|
name: "Solutioning",
|
|
54
121
|
agent: "Architect",
|
|
55
122
|
commands: [
|
|
56
|
-
{
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
123
|
+
{
|
|
124
|
+
code: "CA",
|
|
125
|
+
name: "Create Architecture",
|
|
126
|
+
agent: "architect",
|
|
127
|
+
description: "Guided workflow to document technical decisions",
|
|
128
|
+
required: true,
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
code: "VA",
|
|
132
|
+
name: "Validate Architecture",
|
|
133
|
+
agent: "architect",
|
|
134
|
+
description: "Validates architecture completeness",
|
|
135
|
+
required: false,
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
code: "CE",
|
|
139
|
+
name: "Create Epics and Stories",
|
|
140
|
+
agent: "pm",
|
|
141
|
+
description: "Create the epics and stories listing",
|
|
142
|
+
required: true,
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
code: "VE",
|
|
146
|
+
name: "Validate Epics and Stories",
|
|
147
|
+
agent: "pm",
|
|
148
|
+
description: "Validates epics and stories completeness",
|
|
149
|
+
required: false,
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
code: "QA",
|
|
153
|
+
name: "QA Automation Test",
|
|
154
|
+
agent: "qa",
|
|
155
|
+
description: "Generate automated API and E2E tests for implemented code",
|
|
156
|
+
required: false,
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
code: "IR",
|
|
160
|
+
name: "Implementation Readiness",
|
|
161
|
+
agent: "architect",
|
|
162
|
+
description: "Ensure PRD, UX, architecture, and stories are aligned",
|
|
163
|
+
required: true,
|
|
164
|
+
},
|
|
62
165
|
],
|
|
63
166
|
},
|
|
64
167
|
4: {
|
|
@@ -69,10 +172,28 @@ export function getPhaseInfo(phase) {
|
|
|
69
172
|
};
|
|
70
173
|
return info[phase] ?? { name: "Unknown", agent: "Unknown", commands: [] };
|
|
71
174
|
}
|
|
175
|
+
const DEFAULT_RALPH_STATUS = {
|
|
176
|
+
loopCount: 0,
|
|
177
|
+
status: "not_started",
|
|
178
|
+
tasksCompleted: 0,
|
|
179
|
+
tasksTotal: 0,
|
|
180
|
+
};
|
|
72
181
|
export async function readRalphStatus(projectDir) {
|
|
73
|
-
const data = await readJsonFile(join(projectDir,
|
|
182
|
+
const data = await readJsonFile(join(projectDir, RALPH_STATUS_FILE));
|
|
74
183
|
if (data === null) {
|
|
75
|
-
return
|
|
184
|
+
return DEFAULT_RALPH_STATUS;
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
return validateRalphLoopStatus(data);
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// camelCase validation failed — try bash snake_case format
|
|
191
|
+
}
|
|
192
|
+
try {
|
|
193
|
+
return normalizeRalphStatus(data);
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
warn(`Ralph status file is corrupted, using defaults: ${formatError(err)}`);
|
|
197
|
+
return DEFAULT_RALPH_STATUS;
|
|
76
198
|
}
|
|
77
|
-
return data;
|
|
78
199
|
}
|
package/dist/utils/validate.d.ts
CHANGED
|
@@ -2,3 +2,43 @@ import type { BmalphConfig } from "./config.js";
|
|
|
2
2
|
import type { BmalphState } from "./state.js";
|
|
3
3
|
export declare function validateConfig(data: unknown): BmalphConfig;
|
|
4
4
|
export declare function validateState(data: unknown): BmalphState;
|
|
5
|
+
export interface CircuitBreakerState {
|
|
6
|
+
state: "CLOSED" | "HALF_OPEN" | "OPEN";
|
|
7
|
+
consecutive_no_progress: number;
|
|
8
|
+
reason?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function validateCircuitBreakerState(data: unknown): CircuitBreakerState;
|
|
11
|
+
export interface RalphSession {
|
|
12
|
+
session_id: string;
|
|
13
|
+
created_at: string;
|
|
14
|
+
last_used?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function validateRalphSession(data: unknown): RalphSession;
|
|
17
|
+
export interface RalphApiStatus {
|
|
18
|
+
calls_made_this_hour: number;
|
|
19
|
+
max_calls_per_hour: number;
|
|
20
|
+
status?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function validateRalphApiStatus(data: unknown): RalphApiStatus;
|
|
23
|
+
export interface RalphLoopStatus {
|
|
24
|
+
loopCount: number;
|
|
25
|
+
status: "running" | "blocked" | "completed" | "not_started";
|
|
26
|
+
tasksCompleted: number;
|
|
27
|
+
tasksTotal: number;
|
|
28
|
+
}
|
|
29
|
+
export declare function validateRalphLoopStatus(data: unknown): RalphLoopStatus;
|
|
30
|
+
export declare function normalizeRalphStatus(data: unknown): RalphLoopStatus;
|
|
31
|
+
/**
|
|
32
|
+
* Validates a project name for filesystem safety.
|
|
33
|
+
* Checks for:
|
|
34
|
+
* - Empty names
|
|
35
|
+
* - Max length (100 characters)
|
|
36
|
+
* - Invalid filesystem characters (< > : " / \ | ? *)
|
|
37
|
+
* - Windows reserved names (CON, PRN, AUX, NUL, COM1-9, LPT1-9)
|
|
38
|
+
* - Leading/trailing whitespace or dots
|
|
39
|
+
*
|
|
40
|
+
* @param name - The project name to validate
|
|
41
|
+
* @returns The validated name (unchanged if valid)
|
|
42
|
+
* @throws Error if the name is invalid
|
|
43
|
+
*/
|
|
44
|
+
export declare function validateProjectName(name: string): string;
|