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,815 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# enable_core.sh - Shared logic for ralph enable commands
|
|
4
|
+
# Provides idempotency checks, safe file creation, and project detection
|
|
5
|
+
#
|
|
6
|
+
# Used by:
|
|
7
|
+
# - ralph_enable.sh (interactive wizard)
|
|
8
|
+
# - ralph_enable_ci.sh (non-interactive CI version)
|
|
9
|
+
|
|
10
|
+
# Exit codes - specific codes for different failure types
|
|
11
|
+
export ENABLE_SUCCESS=0 # Successful completion
|
|
12
|
+
export ENABLE_ERROR=1 # General error
|
|
13
|
+
export ENABLE_ALREADY_ENABLED=2 # Ralph already enabled (use --force)
|
|
14
|
+
export ENABLE_INVALID_ARGS=3 # Invalid command line arguments
|
|
15
|
+
export ENABLE_FILE_NOT_FOUND=4 # Required file not found (e.g., PRD file)
|
|
16
|
+
export ENABLE_DEPENDENCY_MISSING=5 # Required dependency missing (e.g., jq for --json)
|
|
17
|
+
export ENABLE_PERMISSION_DENIED=6 # Cannot create files/directories
|
|
18
|
+
|
|
19
|
+
# Colors (can be disabled for non-interactive mode)
|
|
20
|
+
export ENABLE_USE_COLORS="${ENABLE_USE_COLORS:-true}"
|
|
21
|
+
|
|
22
|
+
_color() {
|
|
23
|
+
if [[ "$ENABLE_USE_COLORS" == "true" ]]; then
|
|
24
|
+
echo -e "$1"
|
|
25
|
+
else
|
|
26
|
+
echo -e "$2"
|
|
27
|
+
fi
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
# Color codes
|
|
31
|
+
RED='\033[0;31m'
|
|
32
|
+
GREEN='\033[0;32m'
|
|
33
|
+
YELLOW='\033[1;33m'
|
|
34
|
+
BLUE='\033[0;34m'
|
|
35
|
+
CYAN='\033[0;36m'
|
|
36
|
+
NC='\033[0m'
|
|
37
|
+
|
|
38
|
+
# Logging function
|
|
39
|
+
enable_log() {
|
|
40
|
+
local level=$1
|
|
41
|
+
local message=$2
|
|
42
|
+
local color=""
|
|
43
|
+
|
|
44
|
+
case $level in
|
|
45
|
+
"INFO") color=$BLUE ;;
|
|
46
|
+
"WARN") color=$YELLOW ;;
|
|
47
|
+
"ERROR") color=$RED ;;
|
|
48
|
+
"SUCCESS") color=$GREEN ;;
|
|
49
|
+
"SKIP") color=$CYAN ;;
|
|
50
|
+
esac
|
|
51
|
+
|
|
52
|
+
if [[ "$ENABLE_USE_COLORS" == "true" ]]; then
|
|
53
|
+
echo -e "${color}[$level]${NC} $message"
|
|
54
|
+
else
|
|
55
|
+
echo "[$level] $message"
|
|
56
|
+
fi
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
# =============================================================================
|
|
60
|
+
# IDEMPOTENCY CHECKS
|
|
61
|
+
# =============================================================================
|
|
62
|
+
|
|
63
|
+
# check_existing_ralph - Check if .ralph directory exists and its state
|
|
64
|
+
#
|
|
65
|
+
# Returns:
|
|
66
|
+
# 0 - No .ralph directory, safe to proceed
|
|
67
|
+
# 1 - .ralph exists but incomplete (partial setup)
|
|
68
|
+
# 2 - .ralph exists and fully initialized
|
|
69
|
+
#
|
|
70
|
+
# Outputs:
|
|
71
|
+
# Sets global RALPH_STATE: "none" | "partial" | "complete"
|
|
72
|
+
# Sets global RALPH_MISSING_FILES: array of missing files if partial
|
|
73
|
+
#
|
|
74
|
+
check_existing_ralph() {
|
|
75
|
+
RALPH_STATE="none"
|
|
76
|
+
RALPH_MISSING_FILES=()
|
|
77
|
+
|
|
78
|
+
if [[ ! -d ".ralph" ]]; then
|
|
79
|
+
RALPH_STATE="none"
|
|
80
|
+
return 0
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
# Check for required files
|
|
84
|
+
local required_files=(
|
|
85
|
+
".ralph/PROMPT.md"
|
|
86
|
+
".ralph/fix_plan.md"
|
|
87
|
+
".ralph/AGENT.md"
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
local missing=()
|
|
91
|
+
local found=0
|
|
92
|
+
|
|
93
|
+
for file in "${required_files[@]}"; do
|
|
94
|
+
if [[ -f "$file" ]]; then
|
|
95
|
+
found=$((found + 1))
|
|
96
|
+
else
|
|
97
|
+
missing+=("$file")
|
|
98
|
+
fi
|
|
99
|
+
done
|
|
100
|
+
|
|
101
|
+
RALPH_MISSING_FILES=("${missing[@]}")
|
|
102
|
+
|
|
103
|
+
if [[ $found -eq 0 ]]; then
|
|
104
|
+
RALPH_STATE="none"
|
|
105
|
+
return 0
|
|
106
|
+
elif [[ ${#missing[@]} -gt 0 ]]; then
|
|
107
|
+
RALPH_STATE="partial"
|
|
108
|
+
return 1
|
|
109
|
+
else
|
|
110
|
+
RALPH_STATE="complete"
|
|
111
|
+
return 2
|
|
112
|
+
fi
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
# is_ralph_enabled - Simple check if Ralph is fully enabled
|
|
116
|
+
#
|
|
117
|
+
# Returns:
|
|
118
|
+
# 0 - Ralph is fully enabled
|
|
119
|
+
# 1 - Ralph is not enabled or only partially
|
|
120
|
+
#
|
|
121
|
+
is_ralph_enabled() {
|
|
122
|
+
check_existing_ralph || true
|
|
123
|
+
[[ "$RALPH_STATE" == "complete" ]]
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
# =============================================================================
|
|
127
|
+
# SAFE FILE OPERATIONS
|
|
128
|
+
# =============================================================================
|
|
129
|
+
|
|
130
|
+
# safe_create_file - Create a file only if it doesn't exist (or force overwrite)
|
|
131
|
+
#
|
|
132
|
+
# Parameters:
|
|
133
|
+
# $1 (target) - Target file path
|
|
134
|
+
# $2 (content) - Content to write (can be empty string)
|
|
135
|
+
#
|
|
136
|
+
# Environment:
|
|
137
|
+
# ENABLE_FORCE - If "true", overwrites existing files instead of skipping
|
|
138
|
+
#
|
|
139
|
+
# Returns:
|
|
140
|
+
# 0 - File created/overwritten successfully
|
|
141
|
+
# 1 - File already exists (skipped, only when ENABLE_FORCE is not true)
|
|
142
|
+
# 2 - Error creating file
|
|
143
|
+
#
|
|
144
|
+
# Side effects:
|
|
145
|
+
# Logs [CREATE], [OVERWRITE], or [SKIP] message
|
|
146
|
+
#
|
|
147
|
+
safe_create_file() {
|
|
148
|
+
local target=$1
|
|
149
|
+
local content=$2
|
|
150
|
+
local force="${ENABLE_FORCE:-false}"
|
|
151
|
+
|
|
152
|
+
if [[ -f "$target" ]]; then
|
|
153
|
+
if [[ "$force" == "true" ]]; then
|
|
154
|
+
# Force mode: overwrite existing file
|
|
155
|
+
enable_log "INFO" "Overwriting $target (--force)"
|
|
156
|
+
else
|
|
157
|
+
# Normal mode: skip existing file
|
|
158
|
+
enable_log "SKIP" "$target already exists"
|
|
159
|
+
return 1
|
|
160
|
+
fi
|
|
161
|
+
fi
|
|
162
|
+
|
|
163
|
+
# Create parent directory if needed
|
|
164
|
+
local parent_dir
|
|
165
|
+
parent_dir=$(dirname "$target")
|
|
166
|
+
if [[ ! -d "$parent_dir" ]]; then
|
|
167
|
+
if ! mkdir -p "$parent_dir" 2>/dev/null; then
|
|
168
|
+
enable_log "ERROR" "Failed to create directory: $parent_dir"
|
|
169
|
+
return 2
|
|
170
|
+
fi
|
|
171
|
+
fi
|
|
172
|
+
|
|
173
|
+
# Write content to file using printf to avoid shell injection
|
|
174
|
+
# printf '%s\n' is safer than echo for arbitrary content (handles backslashes, -n, etc.)
|
|
175
|
+
if printf '%s\n' "$content" > "$target" 2>/dev/null; then
|
|
176
|
+
if [[ -f "$target" ]] && [[ "$force" == "true" ]]; then
|
|
177
|
+
enable_log "SUCCESS" "Overwrote $target"
|
|
178
|
+
else
|
|
179
|
+
enable_log "SUCCESS" "Created $target"
|
|
180
|
+
fi
|
|
181
|
+
return 0
|
|
182
|
+
else
|
|
183
|
+
enable_log "ERROR" "Failed to create: $target"
|
|
184
|
+
return 2
|
|
185
|
+
fi
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
# safe_create_dir - Create a directory only if it doesn't exist
|
|
189
|
+
#
|
|
190
|
+
# Parameters:
|
|
191
|
+
# $1 (target) - Target directory path
|
|
192
|
+
#
|
|
193
|
+
# Returns:
|
|
194
|
+
# 0 - Directory created or already exists
|
|
195
|
+
# 1 - Error creating directory
|
|
196
|
+
#
|
|
197
|
+
safe_create_dir() {
|
|
198
|
+
local target=$1
|
|
199
|
+
|
|
200
|
+
if [[ -d "$target" ]]; then
|
|
201
|
+
return 0
|
|
202
|
+
fi
|
|
203
|
+
|
|
204
|
+
if mkdir -p "$target" 2>/dev/null; then
|
|
205
|
+
enable_log "SUCCESS" "Created directory: $target"
|
|
206
|
+
return 0
|
|
207
|
+
else
|
|
208
|
+
enable_log "ERROR" "Failed to create directory: $target"
|
|
209
|
+
return 1
|
|
210
|
+
fi
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
# =============================================================================
|
|
214
|
+
# DIRECTORY STRUCTURE
|
|
215
|
+
# =============================================================================
|
|
216
|
+
|
|
217
|
+
# create_ralph_structure - Create the .ralph/ directory structure
|
|
218
|
+
#
|
|
219
|
+
# Creates:
|
|
220
|
+
# .ralph/
|
|
221
|
+
# .ralph/specs/
|
|
222
|
+
# .ralph/examples/
|
|
223
|
+
# .ralph/logs/
|
|
224
|
+
# .ralph/docs/generated/
|
|
225
|
+
#
|
|
226
|
+
# Returns:
|
|
227
|
+
# 0 - Structure created successfully
|
|
228
|
+
# 1 - Error creating structure
|
|
229
|
+
#
|
|
230
|
+
create_ralph_structure() {
|
|
231
|
+
local dirs=(
|
|
232
|
+
".ralph"
|
|
233
|
+
".ralph/specs"
|
|
234
|
+
".ralph/examples"
|
|
235
|
+
".ralph/logs"
|
|
236
|
+
".ralph/docs/generated"
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
for dir in "${dirs[@]}"; do
|
|
240
|
+
if ! safe_create_dir "$dir"; then
|
|
241
|
+
return 1
|
|
242
|
+
fi
|
|
243
|
+
done
|
|
244
|
+
|
|
245
|
+
return 0
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
# =============================================================================
|
|
249
|
+
# PROJECT DETECTION
|
|
250
|
+
# =============================================================================
|
|
251
|
+
|
|
252
|
+
# Exported detection results
|
|
253
|
+
export DETECTED_PROJECT_NAME=""
|
|
254
|
+
export DETECTED_PROJECT_TYPE=""
|
|
255
|
+
export DETECTED_FRAMEWORK=""
|
|
256
|
+
export DETECTED_BUILD_CMD=""
|
|
257
|
+
export DETECTED_TEST_CMD=""
|
|
258
|
+
export DETECTED_RUN_CMD=""
|
|
259
|
+
|
|
260
|
+
# detect_project_context - Detect project type, name, and build commands
|
|
261
|
+
#
|
|
262
|
+
# Detects:
|
|
263
|
+
# - Project type: javascript, typescript, python, rust, go, unknown
|
|
264
|
+
# - Framework: nextjs, fastapi, express, etc.
|
|
265
|
+
# - Build/test/run commands based on detected tooling
|
|
266
|
+
#
|
|
267
|
+
# Sets globals:
|
|
268
|
+
# DETECTED_PROJECT_NAME - Project name (from package.json, folder, etc.)
|
|
269
|
+
# DETECTED_PROJECT_TYPE - Language/type
|
|
270
|
+
# DETECTED_FRAMEWORK - Framework if detected
|
|
271
|
+
# DETECTED_BUILD_CMD - Build command
|
|
272
|
+
# DETECTED_TEST_CMD - Test command
|
|
273
|
+
# DETECTED_RUN_CMD - Run/start command
|
|
274
|
+
#
|
|
275
|
+
detect_project_context() {
|
|
276
|
+
# Reset detection results
|
|
277
|
+
DETECTED_PROJECT_NAME=""
|
|
278
|
+
DETECTED_PROJECT_TYPE="unknown"
|
|
279
|
+
DETECTED_FRAMEWORK=""
|
|
280
|
+
DETECTED_BUILD_CMD=""
|
|
281
|
+
DETECTED_TEST_CMD=""
|
|
282
|
+
DETECTED_RUN_CMD=""
|
|
283
|
+
|
|
284
|
+
# Detect from package.json (JavaScript/TypeScript)
|
|
285
|
+
if [[ -f "package.json" ]]; then
|
|
286
|
+
DETECTED_PROJECT_TYPE="javascript"
|
|
287
|
+
|
|
288
|
+
# Check for TypeScript
|
|
289
|
+
if grep -q '"typescript"' package.json 2>/dev/null || \
|
|
290
|
+
[[ -f "tsconfig.json" ]]; then
|
|
291
|
+
DETECTED_PROJECT_TYPE="typescript"
|
|
292
|
+
fi
|
|
293
|
+
|
|
294
|
+
# Extract project name
|
|
295
|
+
if command -v jq &>/dev/null; then
|
|
296
|
+
DETECTED_PROJECT_NAME=$(jq -r '.name // empty' package.json 2>/dev/null)
|
|
297
|
+
else
|
|
298
|
+
# Fallback: grep for name field
|
|
299
|
+
DETECTED_PROJECT_NAME=$(grep -m1 '"name"' package.json | sed 's/.*: *"\([^"]*\)".*/\1/' 2>/dev/null)
|
|
300
|
+
fi
|
|
301
|
+
|
|
302
|
+
# Detect framework
|
|
303
|
+
if grep -q '"next"' package.json 2>/dev/null; then
|
|
304
|
+
DETECTED_FRAMEWORK="nextjs"
|
|
305
|
+
elif grep -q '"express"' package.json 2>/dev/null; then
|
|
306
|
+
DETECTED_FRAMEWORK="express"
|
|
307
|
+
elif grep -q '"react"' package.json 2>/dev/null; then
|
|
308
|
+
DETECTED_FRAMEWORK="react"
|
|
309
|
+
elif grep -q '"vue"' package.json 2>/dev/null; then
|
|
310
|
+
DETECTED_FRAMEWORK="vue"
|
|
311
|
+
fi
|
|
312
|
+
|
|
313
|
+
# Set build commands
|
|
314
|
+
DETECTED_BUILD_CMD="npm run build"
|
|
315
|
+
DETECTED_TEST_CMD="npm test"
|
|
316
|
+
DETECTED_RUN_CMD="npm start"
|
|
317
|
+
|
|
318
|
+
# Check for yarn
|
|
319
|
+
if [[ -f "yarn.lock" ]]; then
|
|
320
|
+
DETECTED_BUILD_CMD="yarn build"
|
|
321
|
+
DETECTED_TEST_CMD="yarn test"
|
|
322
|
+
DETECTED_RUN_CMD="yarn start"
|
|
323
|
+
fi
|
|
324
|
+
|
|
325
|
+
# Check for pnpm
|
|
326
|
+
if [[ -f "pnpm-lock.yaml" ]]; then
|
|
327
|
+
DETECTED_BUILD_CMD="pnpm build"
|
|
328
|
+
DETECTED_TEST_CMD="pnpm test"
|
|
329
|
+
DETECTED_RUN_CMD="pnpm start"
|
|
330
|
+
fi
|
|
331
|
+
fi
|
|
332
|
+
|
|
333
|
+
# Detect from pyproject.toml or setup.py (Python)
|
|
334
|
+
if [[ -f "pyproject.toml" ]] || [[ -f "setup.py" ]]; then
|
|
335
|
+
DETECTED_PROJECT_TYPE="python"
|
|
336
|
+
|
|
337
|
+
# Extract project name from pyproject.toml
|
|
338
|
+
if [[ -f "pyproject.toml" ]]; then
|
|
339
|
+
DETECTED_PROJECT_NAME=$(grep -m1 '^name' pyproject.toml | sed 's/.*= *"\([^"]*\)".*/\1/' 2>/dev/null)
|
|
340
|
+
|
|
341
|
+
# Detect framework
|
|
342
|
+
if grep -q 'fastapi' pyproject.toml 2>/dev/null; then
|
|
343
|
+
DETECTED_FRAMEWORK="fastapi"
|
|
344
|
+
elif grep -q 'django' pyproject.toml 2>/dev/null; then
|
|
345
|
+
DETECTED_FRAMEWORK="django"
|
|
346
|
+
elif grep -q 'flask' pyproject.toml 2>/dev/null; then
|
|
347
|
+
DETECTED_FRAMEWORK="flask"
|
|
348
|
+
fi
|
|
349
|
+
fi
|
|
350
|
+
|
|
351
|
+
# Set build commands (prefer uv if detected)
|
|
352
|
+
if [[ -f "uv.lock" ]] || command -v uv &>/dev/null; then
|
|
353
|
+
DETECTED_BUILD_CMD="uv sync"
|
|
354
|
+
DETECTED_TEST_CMD="uv run pytest"
|
|
355
|
+
DETECTED_RUN_CMD="uv run python -m ${DETECTED_PROJECT_NAME:-main}"
|
|
356
|
+
else
|
|
357
|
+
DETECTED_BUILD_CMD="pip install -e ."
|
|
358
|
+
DETECTED_TEST_CMD="pytest"
|
|
359
|
+
DETECTED_RUN_CMD="python -m ${DETECTED_PROJECT_NAME:-main}"
|
|
360
|
+
fi
|
|
361
|
+
fi
|
|
362
|
+
|
|
363
|
+
# Detect from Cargo.toml (Rust)
|
|
364
|
+
if [[ -f "Cargo.toml" ]]; then
|
|
365
|
+
DETECTED_PROJECT_TYPE="rust"
|
|
366
|
+
DETECTED_PROJECT_NAME=$(grep -m1 '^name' Cargo.toml | sed 's/.*= *"\([^"]*\)".*/\1/' 2>/dev/null)
|
|
367
|
+
DETECTED_BUILD_CMD="cargo build"
|
|
368
|
+
DETECTED_TEST_CMD="cargo test"
|
|
369
|
+
DETECTED_RUN_CMD="cargo run"
|
|
370
|
+
fi
|
|
371
|
+
|
|
372
|
+
# Detect from go.mod (Go)
|
|
373
|
+
if [[ -f "go.mod" ]]; then
|
|
374
|
+
DETECTED_PROJECT_TYPE="go"
|
|
375
|
+
DETECTED_PROJECT_NAME=$(head -1 go.mod | sed 's/module //' 2>/dev/null)
|
|
376
|
+
DETECTED_BUILD_CMD="go build"
|
|
377
|
+
DETECTED_TEST_CMD="go test ./..."
|
|
378
|
+
DETECTED_RUN_CMD="go run ."
|
|
379
|
+
fi
|
|
380
|
+
|
|
381
|
+
# Fallback project name to folder name
|
|
382
|
+
if [[ -z "$DETECTED_PROJECT_NAME" ]]; then
|
|
383
|
+
DETECTED_PROJECT_NAME=$(basename "$(pwd)")
|
|
384
|
+
fi
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
# detect_git_info - Detect git repository information
|
|
388
|
+
#
|
|
389
|
+
# Sets globals:
|
|
390
|
+
# DETECTED_GIT_REPO - true if in git repo
|
|
391
|
+
# DETECTED_GIT_REMOTE - Remote URL (origin)
|
|
392
|
+
# DETECTED_GIT_GITHUB - true if GitHub remote
|
|
393
|
+
#
|
|
394
|
+
export DETECTED_GIT_REPO="false"
|
|
395
|
+
export DETECTED_GIT_REMOTE=""
|
|
396
|
+
export DETECTED_GIT_GITHUB="false"
|
|
397
|
+
|
|
398
|
+
detect_git_info() {
|
|
399
|
+
DETECTED_GIT_REPO="false"
|
|
400
|
+
DETECTED_GIT_REMOTE=""
|
|
401
|
+
DETECTED_GIT_GITHUB="false"
|
|
402
|
+
|
|
403
|
+
# Check if in git repo
|
|
404
|
+
if git rev-parse --git-dir &>/dev/null; then
|
|
405
|
+
DETECTED_GIT_REPO="true"
|
|
406
|
+
|
|
407
|
+
# Get remote URL
|
|
408
|
+
DETECTED_GIT_REMOTE=$(git remote get-url origin 2>/dev/null || echo "")
|
|
409
|
+
|
|
410
|
+
# Check if GitHub
|
|
411
|
+
if [[ "$DETECTED_GIT_REMOTE" == *"github.com"* ]]; then
|
|
412
|
+
DETECTED_GIT_GITHUB="true"
|
|
413
|
+
fi
|
|
414
|
+
fi
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
# detect_task_sources - Detect available task sources
|
|
418
|
+
#
|
|
419
|
+
# Sets globals:
|
|
420
|
+
# DETECTED_BEADS_AVAILABLE - true if .beads directory exists
|
|
421
|
+
# DETECTED_GITHUB_AVAILABLE - true if GitHub remote detected
|
|
422
|
+
# DETECTED_PRD_FILES - Array of potential PRD files found
|
|
423
|
+
#
|
|
424
|
+
export DETECTED_BEADS_AVAILABLE="false"
|
|
425
|
+
export DETECTED_GITHUB_AVAILABLE="false"
|
|
426
|
+
declare -a DETECTED_PRD_FILES=()
|
|
427
|
+
|
|
428
|
+
detect_task_sources() {
|
|
429
|
+
DETECTED_BEADS_AVAILABLE="false"
|
|
430
|
+
DETECTED_GITHUB_AVAILABLE="false"
|
|
431
|
+
DETECTED_PRD_FILES=()
|
|
432
|
+
|
|
433
|
+
# Check for beads
|
|
434
|
+
if [[ -d ".beads" ]]; then
|
|
435
|
+
DETECTED_BEADS_AVAILABLE="true"
|
|
436
|
+
fi
|
|
437
|
+
|
|
438
|
+
# Check for GitHub (reuse git detection)
|
|
439
|
+
detect_git_info
|
|
440
|
+
DETECTED_GITHUB_AVAILABLE="$DETECTED_GIT_GITHUB"
|
|
441
|
+
|
|
442
|
+
# Search for PRD/spec files
|
|
443
|
+
local search_dirs=("docs" "specs" "." "requirements")
|
|
444
|
+
local prd_patterns=("*prd*.md" "*PRD*.md" "*requirements*.md" "*spec*.md" "*specification*.md")
|
|
445
|
+
|
|
446
|
+
for dir in "${search_dirs[@]}"; do
|
|
447
|
+
if [[ -d "$dir" ]]; then
|
|
448
|
+
for pattern in "${prd_patterns[@]}"; do
|
|
449
|
+
while IFS= read -r -d '' file; do
|
|
450
|
+
DETECTED_PRD_FILES+=("$file")
|
|
451
|
+
done < <(find "$dir" -maxdepth 2 -name "$pattern" -print0 2>/dev/null)
|
|
452
|
+
done
|
|
453
|
+
fi
|
|
454
|
+
done
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
# =============================================================================
|
|
458
|
+
# TEMPLATE GENERATION
|
|
459
|
+
# =============================================================================
|
|
460
|
+
|
|
461
|
+
# get_templates_dir - Get the templates directory path
|
|
462
|
+
#
|
|
463
|
+
# Returns:
|
|
464
|
+
# Echoes the path to templates directory
|
|
465
|
+
# Returns 1 if not found
|
|
466
|
+
#
|
|
467
|
+
get_templates_dir() {
|
|
468
|
+
# Check global installation first
|
|
469
|
+
if [[ -d "$HOME/.ralph/templates" ]]; then
|
|
470
|
+
echo "$HOME/.ralph/templates"
|
|
471
|
+
return 0
|
|
472
|
+
fi
|
|
473
|
+
|
|
474
|
+
# Check local installation (development)
|
|
475
|
+
local script_dir
|
|
476
|
+
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
477
|
+
if [[ -d "$script_dir/../templates" ]]; then
|
|
478
|
+
echo "$script_dir/../templates"
|
|
479
|
+
return 0
|
|
480
|
+
fi
|
|
481
|
+
|
|
482
|
+
return 1
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
# generate_prompt_md - Generate PROMPT.md with project context
|
|
486
|
+
#
|
|
487
|
+
# Parameters:
|
|
488
|
+
# $1 (project_name) - Project name
|
|
489
|
+
# $2 (project_type) - Project type (typescript, python, etc.)
|
|
490
|
+
# $3 (framework) - Framework if any (optional)
|
|
491
|
+
# $4 (objectives) - Custom objectives (optional, newline-separated)
|
|
492
|
+
#
|
|
493
|
+
# Outputs to stdout
|
|
494
|
+
#
|
|
495
|
+
generate_prompt_md() {
|
|
496
|
+
local project_name="${1:-$(basename "$(pwd)")}"
|
|
497
|
+
local project_type="${2:-unknown}"
|
|
498
|
+
local framework="${3:-}"
|
|
499
|
+
local objectives="${4:-}"
|
|
500
|
+
|
|
501
|
+
local framework_line=""
|
|
502
|
+
if [[ -n "$framework" ]]; then
|
|
503
|
+
framework_line="**Framework:** $framework"
|
|
504
|
+
fi
|
|
505
|
+
|
|
506
|
+
local objectives_section=""
|
|
507
|
+
if [[ -n "$objectives" ]]; then
|
|
508
|
+
objectives_section="$objectives"
|
|
509
|
+
else
|
|
510
|
+
objectives_section="- Review the codebase and understand the current state
|
|
511
|
+
- Follow tasks in fix_plan.md
|
|
512
|
+
- Implement one task per loop
|
|
513
|
+
- Write tests for new functionality
|
|
514
|
+
- Update documentation as needed"
|
|
515
|
+
fi
|
|
516
|
+
|
|
517
|
+
cat << PROMPTEOF
|
|
518
|
+
# Ralph Development Instructions
|
|
519
|
+
|
|
520
|
+
## Context
|
|
521
|
+
You are Ralph, an autonomous AI development agent working on the **${project_name}** project.
|
|
522
|
+
|
|
523
|
+
**Project Type:** ${project_type}
|
|
524
|
+
${framework_line}
|
|
525
|
+
|
|
526
|
+
## Current Objectives
|
|
527
|
+
${objectives_section}
|
|
528
|
+
|
|
529
|
+
## Key Principles
|
|
530
|
+
- ONE task per loop - focus on the most important thing
|
|
531
|
+
- Search the codebase before assuming something isn't implemented
|
|
532
|
+
- Write comprehensive tests with clear documentation
|
|
533
|
+
- Update fix_plan.md with your learnings
|
|
534
|
+
- Commit working changes with descriptive messages
|
|
535
|
+
|
|
536
|
+
## Testing Guidelines
|
|
537
|
+
- LIMIT testing to ~20% of your total effort per loop
|
|
538
|
+
- PRIORITIZE: Implementation > Documentation > Tests
|
|
539
|
+
- Only write tests for NEW functionality you implement
|
|
540
|
+
|
|
541
|
+
## Build & Run
|
|
542
|
+
See AGENT.md for build and run instructions.
|
|
543
|
+
|
|
544
|
+
## Status Reporting (CRITICAL)
|
|
545
|
+
|
|
546
|
+
At the end of your response, ALWAYS include this status block:
|
|
547
|
+
|
|
548
|
+
\`\`\`
|
|
549
|
+
---RALPH_STATUS---
|
|
550
|
+
STATUS: IN_PROGRESS | COMPLETE | BLOCKED
|
|
551
|
+
TASKS_COMPLETED_THIS_LOOP: <number>
|
|
552
|
+
FILES_MODIFIED: <number>
|
|
553
|
+
TESTS_STATUS: PASSING | FAILING | NOT_RUN
|
|
554
|
+
WORK_TYPE: IMPLEMENTATION | TESTING | DOCUMENTATION | REFACTORING
|
|
555
|
+
EXIT_SIGNAL: false | true
|
|
556
|
+
RECOMMENDATION: <one line summary of what to do next>
|
|
557
|
+
---END_RALPH_STATUS---
|
|
558
|
+
\`\`\`
|
|
559
|
+
|
|
560
|
+
## Current Task
|
|
561
|
+
Follow fix_plan.md and choose the most important item to implement next.
|
|
562
|
+
PROMPTEOF
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
# generate_agent_md - Generate AGENT.md with detected build commands
|
|
566
|
+
#
|
|
567
|
+
# Parameters:
|
|
568
|
+
# $1 (build_cmd) - Build command
|
|
569
|
+
# $2 (test_cmd) - Test command
|
|
570
|
+
# $3 (run_cmd) - Run command
|
|
571
|
+
#
|
|
572
|
+
# Outputs to stdout
|
|
573
|
+
#
|
|
574
|
+
generate_agent_md() {
|
|
575
|
+
local build_cmd="${1:-echo 'No build command configured'}"
|
|
576
|
+
local test_cmd="${2:-echo 'No test command configured'}"
|
|
577
|
+
local run_cmd="${3:-echo 'No run command configured'}"
|
|
578
|
+
|
|
579
|
+
cat << AGENTEOF
|
|
580
|
+
# Ralph Agent Configuration
|
|
581
|
+
|
|
582
|
+
## Build Instructions
|
|
583
|
+
|
|
584
|
+
\`\`\`bash
|
|
585
|
+
# Build the project
|
|
586
|
+
${build_cmd}
|
|
587
|
+
\`\`\`
|
|
588
|
+
|
|
589
|
+
## Test Instructions
|
|
590
|
+
|
|
591
|
+
\`\`\`bash
|
|
592
|
+
# Run tests
|
|
593
|
+
${test_cmd}
|
|
594
|
+
\`\`\`
|
|
595
|
+
|
|
596
|
+
## Run Instructions
|
|
597
|
+
|
|
598
|
+
\`\`\`bash
|
|
599
|
+
# Start/run the project
|
|
600
|
+
${run_cmd}
|
|
601
|
+
\`\`\`
|
|
602
|
+
|
|
603
|
+
## Notes
|
|
604
|
+
- Update this file when build process changes
|
|
605
|
+
- Add environment setup instructions as needed
|
|
606
|
+
- Include any pre-requisites or dependencies
|
|
607
|
+
AGENTEOF
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
# generate_fix_plan_md - Generate fix_plan.md with imported tasks
|
|
611
|
+
#
|
|
612
|
+
# Parameters:
|
|
613
|
+
# $1 (tasks) - Tasks to include (newline-separated, markdown checkbox format)
|
|
614
|
+
#
|
|
615
|
+
# Outputs to stdout
|
|
616
|
+
#
|
|
617
|
+
generate_fix_plan_md() {
|
|
618
|
+
local tasks="${1:-}"
|
|
619
|
+
|
|
620
|
+
local high_priority=""
|
|
621
|
+
local medium_priority=""
|
|
622
|
+
local low_priority=""
|
|
623
|
+
|
|
624
|
+
if [[ -n "$tasks" ]]; then
|
|
625
|
+
high_priority="$tasks"
|
|
626
|
+
else
|
|
627
|
+
high_priority="- [ ] Review codebase and understand architecture
|
|
628
|
+
- [ ] Identify and document key components
|
|
629
|
+
- [ ] Set up development environment"
|
|
630
|
+
medium_priority="- [ ] Implement core features
|
|
631
|
+
- [ ] Add test coverage
|
|
632
|
+
- [ ] Update documentation"
|
|
633
|
+
low_priority="- [ ] Performance optimization
|
|
634
|
+
- [ ] Code cleanup and refactoring"
|
|
635
|
+
fi
|
|
636
|
+
|
|
637
|
+
cat << FIXPLANEOF
|
|
638
|
+
# Ralph Fix Plan
|
|
639
|
+
|
|
640
|
+
## High Priority
|
|
641
|
+
${high_priority}
|
|
642
|
+
|
|
643
|
+
## Medium Priority
|
|
644
|
+
${medium_priority}
|
|
645
|
+
|
|
646
|
+
## Low Priority
|
|
647
|
+
${low_priority}
|
|
648
|
+
|
|
649
|
+
## Completed
|
|
650
|
+
- [x] Project enabled for Ralph
|
|
651
|
+
|
|
652
|
+
## Notes
|
|
653
|
+
- Focus on MVP functionality first
|
|
654
|
+
- Ensure each feature is properly tested
|
|
655
|
+
- Update this file after each major milestone
|
|
656
|
+
FIXPLANEOF
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
# generate_ralphrc - Generate .ralphrc configuration file
|
|
660
|
+
#
|
|
661
|
+
# Parameters:
|
|
662
|
+
# $1 (project_name) - Project name
|
|
663
|
+
# $2 (project_type) - Project type
|
|
664
|
+
# $3 (task_sources) - Task sources (local, beads, github)
|
|
665
|
+
#
|
|
666
|
+
# Outputs to stdout
|
|
667
|
+
#
|
|
668
|
+
generate_ralphrc() {
|
|
669
|
+
local project_name="${1:-$(basename "$(pwd)")}"
|
|
670
|
+
local project_type="${2:-unknown}"
|
|
671
|
+
local task_sources="${3:-local}"
|
|
672
|
+
|
|
673
|
+
cat << RALPHRCEOF
|
|
674
|
+
# .ralphrc - Ralph project configuration
|
|
675
|
+
# Generated by: ralph enable
|
|
676
|
+
# Documentation: https://github.com/frankbria/ralph-claude-code
|
|
677
|
+
|
|
678
|
+
# Project identification
|
|
679
|
+
PROJECT_NAME="${project_name}"
|
|
680
|
+
PROJECT_TYPE="${project_type}"
|
|
681
|
+
|
|
682
|
+
# Loop settings
|
|
683
|
+
MAX_CALLS_PER_HOUR=100
|
|
684
|
+
CLAUDE_TIMEOUT_MINUTES=15
|
|
685
|
+
CLAUDE_OUTPUT_FORMAT="json"
|
|
686
|
+
|
|
687
|
+
# Tool permissions
|
|
688
|
+
# Comma-separated list of allowed tools
|
|
689
|
+
ALLOWED_TOOLS="Write,Read,Edit,Bash(git *),Bash(npm *),Bash(pytest)"
|
|
690
|
+
|
|
691
|
+
# Session management
|
|
692
|
+
SESSION_CONTINUITY=true
|
|
693
|
+
SESSION_EXPIRY_HOURS=24
|
|
694
|
+
|
|
695
|
+
# Task sources (for ralph enable --sync)
|
|
696
|
+
# Options: local, beads, github (comma-separated for multiple)
|
|
697
|
+
TASK_SOURCES="${task_sources}"
|
|
698
|
+
GITHUB_TASK_LABEL="ralph-task"
|
|
699
|
+
BEADS_FILTER="status:open"
|
|
700
|
+
|
|
701
|
+
# Circuit breaker thresholds
|
|
702
|
+
CB_NO_PROGRESS_THRESHOLD=3
|
|
703
|
+
CB_SAME_ERROR_THRESHOLD=5
|
|
704
|
+
CB_OUTPUT_DECLINE_THRESHOLD=70
|
|
705
|
+
RALPHRCEOF
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
# =============================================================================
|
|
709
|
+
# MAIN ENABLE LOGIC
|
|
710
|
+
# =============================================================================
|
|
711
|
+
|
|
712
|
+
# enable_ralph_in_directory - Main function to enable Ralph in current directory
|
|
713
|
+
#
|
|
714
|
+
# Parameters:
|
|
715
|
+
# $1 (options) - JSON-like options string or empty
|
|
716
|
+
# force: true/false - Force overwrite existing
|
|
717
|
+
# skip_tasks: true/false - Skip task import
|
|
718
|
+
# project_name: string - Override project name
|
|
719
|
+
# task_content: string - Pre-imported task content
|
|
720
|
+
#
|
|
721
|
+
# Returns:
|
|
722
|
+
# 0 - Success
|
|
723
|
+
# 1 - Error
|
|
724
|
+
# 2 - Already enabled (and no force flag)
|
|
725
|
+
#
|
|
726
|
+
enable_ralph_in_directory() {
|
|
727
|
+
local force="${ENABLE_FORCE:-false}"
|
|
728
|
+
local skip_tasks="${ENABLE_SKIP_TASKS:-false}"
|
|
729
|
+
local project_name="${ENABLE_PROJECT_NAME:-}"
|
|
730
|
+
local project_type="${ENABLE_PROJECT_TYPE:-}"
|
|
731
|
+
local task_content="${ENABLE_TASK_CONTENT:-}"
|
|
732
|
+
|
|
733
|
+
# Check existing state (use || true to prevent set -e from exiting)
|
|
734
|
+
check_existing_ralph || true
|
|
735
|
+
|
|
736
|
+
if [[ "$RALPH_STATE" == "complete" && "$force" != "true" ]]; then
|
|
737
|
+
enable_log "INFO" "Ralph is already enabled in this project"
|
|
738
|
+
enable_log "INFO" "Use --force to overwrite existing configuration"
|
|
739
|
+
return $ENABLE_ALREADY_ENABLED
|
|
740
|
+
fi
|
|
741
|
+
|
|
742
|
+
# Detect project context
|
|
743
|
+
detect_project_context
|
|
744
|
+
|
|
745
|
+
# Use detected or provided project name
|
|
746
|
+
if [[ -z "$project_name" ]]; then
|
|
747
|
+
project_name="$DETECTED_PROJECT_NAME"
|
|
748
|
+
fi
|
|
749
|
+
|
|
750
|
+
# Use detected or provided project type
|
|
751
|
+
if [[ -n "$project_type" ]]; then
|
|
752
|
+
DETECTED_PROJECT_TYPE="$project_type"
|
|
753
|
+
fi
|
|
754
|
+
|
|
755
|
+
enable_log "INFO" "Enabling Ralph for: $project_name"
|
|
756
|
+
enable_log "INFO" "Project type: $DETECTED_PROJECT_TYPE"
|
|
757
|
+
if [[ -n "$DETECTED_FRAMEWORK" ]]; then
|
|
758
|
+
enable_log "INFO" "Framework: $DETECTED_FRAMEWORK"
|
|
759
|
+
fi
|
|
760
|
+
|
|
761
|
+
# Create directory structure
|
|
762
|
+
if ! create_ralph_structure; then
|
|
763
|
+
enable_log "ERROR" "Failed to create .ralph/ structure"
|
|
764
|
+
return $ENABLE_ERROR
|
|
765
|
+
fi
|
|
766
|
+
|
|
767
|
+
# Generate and create files
|
|
768
|
+
local prompt_content
|
|
769
|
+
prompt_content=$(generate_prompt_md "$project_name" "$DETECTED_PROJECT_TYPE" "$DETECTED_FRAMEWORK")
|
|
770
|
+
safe_create_file ".ralph/PROMPT.md" "$prompt_content"
|
|
771
|
+
|
|
772
|
+
local agent_content
|
|
773
|
+
agent_content=$(generate_agent_md "$DETECTED_BUILD_CMD" "$DETECTED_TEST_CMD" "$DETECTED_RUN_CMD")
|
|
774
|
+
safe_create_file ".ralph/AGENT.md" "$agent_content"
|
|
775
|
+
|
|
776
|
+
local fix_plan_content
|
|
777
|
+
fix_plan_content=$(generate_fix_plan_md "$task_content")
|
|
778
|
+
safe_create_file ".ralph/fix_plan.md" "$fix_plan_content"
|
|
779
|
+
|
|
780
|
+
# Detect task sources for .ralphrc
|
|
781
|
+
detect_task_sources
|
|
782
|
+
local task_sources="local"
|
|
783
|
+
if [[ "$DETECTED_BEADS_AVAILABLE" == "true" ]]; then
|
|
784
|
+
task_sources="beads,$task_sources"
|
|
785
|
+
fi
|
|
786
|
+
if [[ "$DETECTED_GITHUB_AVAILABLE" == "true" ]]; then
|
|
787
|
+
task_sources="github,$task_sources"
|
|
788
|
+
fi
|
|
789
|
+
|
|
790
|
+
# Generate .ralphrc
|
|
791
|
+
local ralphrc_content
|
|
792
|
+
ralphrc_content=$(generate_ralphrc "$project_name" "$DETECTED_PROJECT_TYPE" "$task_sources")
|
|
793
|
+
safe_create_file ".ralphrc" "$ralphrc_content"
|
|
794
|
+
|
|
795
|
+
enable_log "SUCCESS" "Ralph enabled successfully!"
|
|
796
|
+
|
|
797
|
+
return $ENABLE_SUCCESS
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
# Export functions for use in other scripts
|
|
801
|
+
export -f enable_log
|
|
802
|
+
export -f check_existing_ralph
|
|
803
|
+
export -f is_ralph_enabled
|
|
804
|
+
export -f safe_create_file
|
|
805
|
+
export -f safe_create_dir
|
|
806
|
+
export -f create_ralph_structure
|
|
807
|
+
export -f detect_project_context
|
|
808
|
+
export -f detect_git_info
|
|
809
|
+
export -f detect_task_sources
|
|
810
|
+
export -f get_templates_dir
|
|
811
|
+
export -f generate_prompt_md
|
|
812
|
+
export -f generate_agent_md
|
|
813
|
+
export -f generate_fix_plan_md
|
|
814
|
+
export -f generate_ralphrc
|
|
815
|
+
export -f enable_ralph_in_directory
|