From 228dfa28a53b3c9dc1eaaeee6be71398a7b56a6c Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Fri, 5 Dec 2025 22:32:59 -0600 Subject: [PATCH 01/26] installer updates working with basic flow --- .../agents/commit-poet/commit-poet.agent.yaml | 0 .../agents/commit-poet/installation-guide.md | 0 .../agents/toolsmith/installation-guide.md | 0 .../toolsmith-sidecar/instructions.md | 0 .../toolsmith-sidecar/knowledge/bundlers.md | 0 .../toolsmith-sidecar/knowledge/deploy.md | 0 .../toolsmith-sidecar/knowledge/docs.md | 0 .../toolsmith-sidecar/knowledge/installers.md | 0 .../toolsmith-sidecar/knowledge/modules.md | 0 .../toolsmith-sidecar/knowledge/tests.md | 0 .../toolsmith/toolsmith-sidecar/memories.md | 0 .../agents/toolsmith/toolsmith.agent.yaml | 0 .../modules/mental-wellness-module/README.md | 203 ++++++ .../modules/mental-wellness-module/TODO.md | 206 ++++++ .../_module-installer/install-config.yaml | 83 +++ .../cognitive-distortions.md | 47 ++ .../cbt-coach-sidecar/thought-records.md | 17 + .../agents/cbt-coach.yaml | 149 ++++ .../agents/crisis-navigator.yaml | 137 ++++ .../agents/meditation-guide.yaml | 137 ++++ .../wellness-companion-sidecar/insights.md | 13 + .../instructions.md | 30 + .../wellness-companion-sidecar/memories.md | 13 + .../wellness-companion-sidecar/patterns.md | 17 + .../agents/wellness-companion.yaml | 123 ++++ .../module-plan-mental-wellness-module.md | 460 ++++++++++++ .../workflows/cbt-thought-record/README.md | 31 + .../workflows/crisis-support/README.md | 31 + .../workflows/daily-checkin/README.md | 32 + .../workflows/guided-meditation/README.md | 31 + .../workflows/wellness-journal/README.md | 31 + .../quiz-master/steps/step-01-init.md | 168 +++++ .../workflows/quiz-master/steps/step-02-q1.md | 155 ++++ .../workflows/quiz-master/steps/step-03-q2.md | 89 +++ .../workflows/quiz-master/steps/step-04-q3.md | 36 + .../workflows/quiz-master/steps/step-05-q4.md | 36 + .../workflows/quiz-master/steps/step-06-q5.md | 36 + .../workflows/quiz-master/steps/step-07-q6.md | 36 + .../workflows/quiz-master/steps/step-08-q7.md | 36 + .../workflows/quiz-master/steps/step-09-q8.md | 36 + .../workflows/quiz-master/steps/step-10-q9.md | 36 + .../quiz-master/steps/step-11-q10.md | 36 + .../quiz-master/steps/step-12-results.md | 150 ++++ .../templates/csv-headers.template | 1 + .../quiz-master/workflow-plan-quiz-master.md | 269 +++++++ .../workflows/quiz-master/workflow.md | 54 ++ bmad/bmm/docs/troubleshooting.md | 680 ++++++++++++++++++ bmad/bmm/tasks/daily-standup.xml | 85 +++ ...kflow-compliance-report-create-workflow.md | 513 ------------- eslint.config.mjs | 14 + .../bmb/_module-installer/install-config.yaml | 6 +- .../bmb/agents/bmad-builder.agent.yaml | 41 +- .../docs/agents/module-agent-architecture.md | 88 +-- .../journal-keeper/journal-keeper.agent.yaml | 2 +- .../security-engineer.agent.yaml | 12 +- .../module-examples/trend-analyst.agent.yaml | 14 +- .../create-module/checklist.md | 235 ------ .../create-module/module-structure.md | 4 +- .../create-module/steps/step-01-init.md | 155 ++++ .../create-module/steps/step-01b-continue.md | 169 +++++ .../create-module/steps/step-02-concept.md | 217 ++++++ .../create-module/steps/step-03-components.md | 267 +++++++ .../create-module/steps/step-04-structure.md | 228 ++++++ .../create-module/steps/step-05-config.md | 233 ++++++ .../create-module/steps/step-06-agents.md | 296 ++++++++ .../create-module/steps/step-07-workflows.md | 228 ++++++ .../create-module/steps/step-08-installer.md | 186 +++++ .../steps/step-09-documentation.md | 308 ++++++++ .../create-module/steps/step-10-roadmap.md | 336 +++++++++ .../create-module/steps/step-11-validate.md | 335 +++++++++ .../create-module/templates/agent.template.md | 317 ++++++++ .../templates/install-config.template.yaml | 53 ++ .../templates/installer.template.js | 47 ++ .../templates/module-plan.template.md | 5 + .../templates/workflow-plan-template.md | 23 + .../bmb/workflows/create-module/validation.md | 126 ++++ .../bmb/workflows/create-module/workflow.md | 55 ++ src/modules/bmm/agents/analyst.agent.yaml | 19 +- src/modules/bmm/docs/README.md | 24 +- src/modules/bmm/docs/brownfield-guide.md | 15 +- src/modules/bmm/docs/glossary.md | 14 + src/modules/bmm/docs/quick-spec-flow.md | 652 +++++++++++++++++ src/modules/bmm/docs/troubleshooting.md | 680 ++++++++++++++++++ .../bmm/docs/workflows-implementation.md | 139 ++++ src/modules/bmm/tasks/daily-standup.xml | 85 +++ tools/cli/commands/agent-install.js | 241 ++++++- tools/cli/commands/install.js | 603 +++++++++++++++- .../installers/lib/core/config-collector.js | 23 +- tools/cli/installers/lib/core/installer.js | 26 +- .../lib/ide/shared/bmad-artifacts.js | 45 ++ tools/cli/lib/ui.js | 556 +++++++++++++- tools/schema/agent.js | 238 +++--- 92 files changed, 10643 insertions(+), 960 deletions(-) rename {custom/src => bmad-custom-src}/agents/commit-poet/commit-poet.agent.yaml (100%) rename {custom/src => bmad-custom-src}/agents/commit-poet/installation-guide.md (100%) rename {custom/src => bmad-custom-src}/agents/toolsmith/installation-guide.md (100%) rename {custom/src => bmad-custom-src}/agents/toolsmith/toolsmith-sidecar/instructions.md (100%) rename {custom/src => bmad-custom-src}/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md (100%) rename {custom/src => bmad-custom-src}/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md (100%) rename {custom/src => bmad-custom-src}/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md (100%) rename {custom/src => bmad-custom-src}/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md (100%) rename {custom/src => bmad-custom-src}/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md (100%) rename {custom/src => bmad-custom-src}/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md (100%) rename {custom/src => bmad-custom-src}/agents/toolsmith/toolsmith-sidecar/memories.md (100%) rename {custom/src => bmad-custom-src}/agents/toolsmith/toolsmith.agent.yaml (100%) create mode 100644 bmad-custom-src/modules/mental-wellness-module/README.md create mode 100644 bmad-custom-src/modules/mental-wellness-module/TODO.md create mode 100644 bmad-custom-src/modules/mental-wellness-module/_module-installer/install-config.yaml create mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/cognitive-distortions.md create mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/thought-records.md create mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach.yaml create mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/crisis-navigator.yaml create mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/meditation-guide.yaml create mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/insights.md create mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/instructions.md create mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/memories.md create mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/patterns.md create mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion.yaml create mode 100644 bmad-custom-src/modules/mental-wellness-module/module-plan-mental-wellness-module.md create mode 100644 bmad-custom-src/modules/mental-wellness-module/workflows/cbt-thought-record/README.md create mode 100644 bmad-custom-src/modules/mental-wellness-module/workflows/crisis-support/README.md create mode 100644 bmad-custom-src/modules/mental-wellness-module/workflows/daily-checkin/README.md create mode 100644 bmad-custom-src/modules/mental-wellness-module/workflows/guided-meditation/README.md create mode 100644 bmad-custom-src/modules/mental-wellness-module/workflows/wellness-journal/README.md create mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-01-init.md create mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-02-q1.md create mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-03-q2.md create mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-04-q3.md create mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-05-q4.md create mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-06-q5.md create mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-07-q6.md create mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-08-q7.md create mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-09-q8.md create mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-10-q9.md create mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-11-q10.md create mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-12-results.md create mode 100644 bmad-custom-src/workflows/quiz-master/templates/csv-headers.template create mode 100644 bmad-custom-src/workflows/quiz-master/workflow-plan-quiz-master.md create mode 100644 bmad-custom-src/workflows/quiz-master/workflow.md create mode 100644 bmad/bmm/docs/troubleshooting.md create mode 100644 bmad/bmm/tasks/daily-standup.xml delete mode 100644 docs/workflow-compliance-report-create-workflow.md delete mode 100644 src/modules/bmb/workflows-legacy/create-module/checklist.md create mode 100644 src/modules/bmb/workflows/create-module/steps/step-01-init.md create mode 100644 src/modules/bmb/workflows/create-module/steps/step-01b-continue.md create mode 100644 src/modules/bmb/workflows/create-module/steps/step-02-concept.md create mode 100644 src/modules/bmb/workflows/create-module/steps/step-03-components.md create mode 100644 src/modules/bmb/workflows/create-module/steps/step-04-structure.md create mode 100644 src/modules/bmb/workflows/create-module/steps/step-05-config.md create mode 100644 src/modules/bmb/workflows/create-module/steps/step-06-agents.md create mode 100644 src/modules/bmb/workflows/create-module/steps/step-07-workflows.md create mode 100644 src/modules/bmb/workflows/create-module/steps/step-08-installer.md create mode 100644 src/modules/bmb/workflows/create-module/steps/step-09-documentation.md create mode 100644 src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md create mode 100644 src/modules/bmb/workflows/create-module/steps/step-11-validate.md create mode 100644 src/modules/bmb/workflows/create-module/templates/agent.template.md create mode 100644 src/modules/bmb/workflows/create-module/templates/install-config.template.yaml create mode 100644 src/modules/bmb/workflows/create-module/templates/installer.template.js create mode 100644 src/modules/bmb/workflows/create-module/templates/module-plan.template.md create mode 100644 src/modules/bmb/workflows/create-module/templates/workflow-plan-template.md create mode 100644 src/modules/bmb/workflows/create-module/validation.md create mode 100644 src/modules/bmb/workflows/create-module/workflow.md create mode 100644 src/modules/bmm/docs/quick-spec-flow.md create mode 100644 src/modules/bmm/docs/troubleshooting.md create mode 100644 src/modules/bmm/tasks/daily-standup.xml diff --git a/custom/src/agents/commit-poet/commit-poet.agent.yaml b/bmad-custom-src/agents/commit-poet/commit-poet.agent.yaml similarity index 100% rename from custom/src/agents/commit-poet/commit-poet.agent.yaml rename to bmad-custom-src/agents/commit-poet/commit-poet.agent.yaml diff --git a/custom/src/agents/commit-poet/installation-guide.md b/bmad-custom-src/agents/commit-poet/installation-guide.md similarity index 100% rename from custom/src/agents/commit-poet/installation-guide.md rename to bmad-custom-src/agents/commit-poet/installation-guide.md diff --git a/custom/src/agents/toolsmith/installation-guide.md b/bmad-custom-src/agents/toolsmith/installation-guide.md similarity index 100% rename from custom/src/agents/toolsmith/installation-guide.md rename to bmad-custom-src/agents/toolsmith/installation-guide.md diff --git a/custom/src/agents/toolsmith/toolsmith-sidecar/instructions.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/instructions.md similarity index 100% rename from custom/src/agents/toolsmith/toolsmith-sidecar/instructions.md rename to bmad-custom-src/agents/toolsmith/toolsmith-sidecar/instructions.md diff --git a/custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md similarity index 100% rename from custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md rename to bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md diff --git a/custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md similarity index 100% rename from custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md rename to bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md diff --git a/custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md similarity index 100% rename from custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md rename to bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md diff --git a/custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md similarity index 100% rename from custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md rename to bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md diff --git a/custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md similarity index 100% rename from custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md rename to bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md diff --git a/custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md similarity index 100% rename from custom/src/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md rename to bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md diff --git a/custom/src/agents/toolsmith/toolsmith-sidecar/memories.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/memories.md similarity index 100% rename from custom/src/agents/toolsmith/toolsmith-sidecar/memories.md rename to bmad-custom-src/agents/toolsmith/toolsmith-sidecar/memories.md diff --git a/custom/src/agents/toolsmith/toolsmith.agent.yaml b/bmad-custom-src/agents/toolsmith/toolsmith.agent.yaml similarity index 100% rename from custom/src/agents/toolsmith/toolsmith.agent.yaml rename to bmad-custom-src/agents/toolsmith/toolsmith.agent.yaml diff --git a/bmad-custom-src/modules/mental-wellness-module/README.md b/bmad-custom-src/modules/mental-wellness-module/README.md new file mode 100644 index 00000000..841f81c9 --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/README.md @@ -0,0 +1,203 @@ +# Mental Wellness Module + +To provide accessible, empathetic AI therapy agents that support users' mental wellness through compassionate conversations, guided reflection, and evidence-based therapeutic techniques. + +## Overview + +This module provides: + +- **4 Specialized Agents** for different aspects of mental wellness support +- **5 Evidence-Based Workflows** for structured wellness practices +- **Quick Support Tasks** for immediate help and grounding +- **Privacy-Focused Design** with configurable data retention +- **Crisis Support Resources** with appropriate escalation protocols + +## Installation + +Install the module using BMAD: + +```bash +bmad install mental-wellness-module +``` + +## Components + +### Agents (4) + +1. **Riley (Wellness Companion)** 🌱 - Primary empathetic support agent for daily emotional wellness conversations +2. **Serenity (Meditation Guide)** 🧘 - Specialized agent for mindfulness practices and guided meditation sessions +3. **Dr. Alexis (CBT Coach)** 🧠 - Cognitive Behavioral Therapy specialist for thought work and behavioral exercises +4. **Beacon (Crisis Navigator)** 🆘 - Emergency response agent providing immediate resources and support + +### Workflows (5) + +1. **Daily Check-in** (DC) - Quick mood and wellness assessment with personalized support +2. **Wellness Journal** (WJ) - Guided reflective writing practice with mood tracking +3. **Guided Meditation** (GM) - Full meditation sessions with various techniques and durations +4. **CBT Thought Record** (TR) - Structured cognitive exercise for challenging negative thought patterns +5. **Crisis Support** - Emergency response protocol with resources and escalation + +### Tasks (4) + +1. **Quick Mood Check** - Instant emotional state assessment +2. **Breathing Exercise Timer** - 4-7-8 breathing guide for immediate calm +3. **Resource Finder** - Locate professional mental health help +4. **Journal Prompt Generator** - Creative prompts for reflective writing + +## Quick Start + +1. **Load the primary agent:** + + ``` + agent Riley + ``` + +2. **View available commands:** + + ``` + *help + ``` + +3. **Run your first check-in:** + + ``` + daily-checkin + ``` + +## Module Structure + +``` +mental-wellness-module/ +├── agents/ # Agent definitions +│ ├── wellness-companion.yaml +│ ├── meditation-guide.yaml +│ ├── cbt-coach.yaml +│ └── crisis-navigator.yaml +├── workflows/ # Workflow folders +│ ├── daily-checkin/ +│ │ └── README.md +│ ├── wellness-journal/ +│ │ └── README.md +│ ├── guided-meditation/ +│ │ └── README.md +│ ├── cbt-thought-record/ +│ │ └── README.md +│ └── crisis-support/ +│ └── README.md +├── tasks/ # Task files (planned) +├── templates/ # Shared templates (planned) +├── data/ # Module data +├── _module-installer/ # Installation config +│ └── install-config.yaml +├── module-plan-mental-wellness-module.md +└── README.md # This file +``` + +## Configuration + +The module can be configured in `.bmad/mental-wellness-module/config.yaml` + +**Key Settings:** + +- **companion_name**: Personalizes your wellness companion (default: "Wellness Guide") +- **journal_location**: Where wellness journal entries are saved +- **therapy_approaches**: Choose therapeutic methods (CBT, Mindfulness, Journaling, Positive Psychology) +- **privacy_level**: Control data retention (minimal, standard, enhanced) +- **checkin_frequency**: How often to prompt for wellness check-ins +- **crisis_support**: Enable crisis detection and resources (enabled by default) + +## Examples + +### Example 1: Daily Wellness Check-in + +``` +agent Riley +DC +> How are you feeling today? [1-10] +> What's one positive moment from today? +> Any challenges you'd like support with? +``` + +### Example 2: Anxiety Management with CBT + +``` +agent "Dr. Alexis" +TR +> Let's work through a thought record... +> What was the situation? +> What automatic thoughts occurred? +> Let's identify cognitive distortions... +``` + +### Example 3: Quick Stress Relief + +``` +agent Serenity +BR +> Follow along: Inhale for 4... +> Hold for 7... +> Exhale for 8... +> Repeat 3 times... +``` + +## Development Status + +This module is currently: + +- [x] Structure created +- [x] Agents implemented (YAML files created) +- [x] Installer configured +- [ ] Workflows implemented (README plans created) +- [ ] Tasks implemented +- [ ] Full testing complete + +**Note:** Workflows are planned and documented but require implementation using the `create-workflow` workflow. + +## Important Notice + +**This module is not a substitute for professional mental health care.** It provides: + +- Supportive companionship and conversation +- Evidence-based wellness techniques +- Educational content about mental health +- Resources for professional help + +**For emergencies, contact:** + +- Crisis Text Line: Text HOME to 741741 +- National Suicide Prevention Lifeline: Call or text 988 +- Local emergency services: Call 911 + +## Contributing + +To extend this module: + +1. Add new agents using `create-agent` workflow +2. Implement workflows using `create-workflow` workflow +3. Update the installer configuration if needed +4. Test thoroughly +5. Ensure all crisis protocols remain intact + +## Requirements + +- BMAD Method version 6.0.0 or higher +- No external dependencies + +## Author + +Created by BMad on December 4, 2024 + +## License + +[Add license information if applicable] + +--- + +## Module Details + +**Module Code:** mental-wellness-module +**Category:** Personal/Domain-Specific +**Type:** Standard Module +**Version:** 1.0.0 + +**Last Updated:** December 4, 2024 diff --git a/bmad-custom-src/modules/mental-wellness-module/TODO.md b/bmad-custom-src/modules/mental-wellness-module/TODO.md new file mode 100644 index 00000000..2a5698c4 --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/TODO.md @@ -0,0 +1,206 @@ +# Mental Wellness Module Development Roadmap + +## Phase 1: Core Components (MVP) + +### Agents (Already created as YAML files - need full implementation) + +- [x] ~~Create Riley (Wellness Companion)~~ YAML file created + - [ ] Implement workflow triggers + - [ ] Test embedded prompts + - [ ] Set up sidecar memory structure + - Priority: High + +- [x] ~~Create Serenity (Meditation Guide)~~ YAML file created + - [ ] Test meditation prompts + - [ ] Validate breathing exercises + - Priority: High + +- [x] ~~Create Dr. Alexis (CBT Coach)~~ YAML file created + - [ ] Test thought record flow + - [ ] Validate cognitive distortion reference + - Priority: High + +- [x] ~~Create Beacon (Crisis Navigator)~~ YAML file created + - [ ] Validate crisis resources + - [ ] Test escalation protocols + - Priority: Critical (safety) + +### Workflows (README files created - need full implementation) + +- [x] ~~Daily Check-in plan created~~ + - [ ] Implement workflow using `workflow create-workflow` + - [ Location: workflows/daily-checkin/ + - ] Priority: High + +- [x] ~~Wellness Journal plan created~~ + - [ ] Implement workflow using `workflow create-workflow` + - [ Location: workflows/wellness-journal/ + - ] Priority: High + +- [x] ~~Crisis Support plan created~~ + - [ ] Implement workflow using `workflow create-workflow` + - [ Location: workflows/crisis-support/ + - ] Priority: Critical + +- [x] ~~Guided Meditation plan created~~ + - [ ] Implement workflow using `workflow create-workflow` + - [ Location: workflows/guided-meditation/ + - ] Priority: Medium + +- [x] ~~CBT Thought Record plan created~~ + - [ ] Implement workflow using `workflow create-workflow` + - [ Location: workflows/cbt-thought-record/ + - ] Priority: Medium + +### Tasks + +- [ ] Create Quick Mood Check task +- [ ] Create Breathing Exercise Timer task +- [ ] Create Resource Finder task +- [ ] Create Journal Prompt Generator task + +### Integration + +- [ ] Test agent-workflow integration +- [ ] Verify installer creates correct config +- [ ] Test all agent menu commands +- [ ] Validate privacy settings work + +## Phase 2: Enhanced Features + +### Additional Components + +- [ ] Mood tracking dashboard +- [ ] Progress reports +- [ ] Custom meditation scripts +- [ ] Additional CBT techniques +- Priority: Medium + +### Improvements + +- [ ] Add error handling for all workflows +- [ ] Implement input validation +- [ ] Add data encryption for sensitive entries +- [ ] Create backup/restore functionality +- [ ] Add accessibility features +- Priority: Medium + +## Phase 3: Polish and Launch + +### Testing + +- [ ] Unit test all agent prompts +- [ ] Integration test all workflows +- [ ] Test installer in clean project +- [ ] Test with various user inputs +- [ ] Test crisis escalation paths +- [ ] Validate GDPR compliance if needed +- Priority: High + +### Documentation + +- [ ] Add detailed API documentation +- [ ] Create video tutorials for each feature +- [ ] Write troubleshooting guide +- [ ] Add FAQ section +- [ ] Create user guide PDF +- Priority: Medium + +### Release + +- [ ] Version bump to 1.0.0 +- [ ] Create comprehensive release notes +- [ ] Tag release in Git +- [ ] Create installation video +- [ ] Submit to module registry (if applicable) +- Priority: Low + +## Quick Commands + +### Create New Workflow + +```bash +workflow create-workflow +``` + +Then navigate to: workflows/[workflow-name]/README.md + +### Test Module Installation + +```bash +bmad install mental-wellness-module +``` + +### Run Agent + +```bash +agent Riley +agent Serenity +agent "Dr. Alexis" +agent Beacon +``` + +### Test Workflow + +```bash +# After workflows are implemented +workflow daily-checkin +workflow wellness-journal +``` + +## Development Notes + +### Important Considerations + +- **Safety First**: Always validate crisis protocols work correctly +- **Privacy**: Ensure user data is handled according to configured privacy level +- **Accessibility**: Design for users with varying technical skills +- **Compliance**: Be aware of mental health app regulations in different regions +- **Testing**: Test all crisis scenarios thoroughly + +### Dependencies + +- BMAD Method version 6.0.0 or higher +- No external dependencies required +- Optional: Integration with calendar apps for check-in reminders + +### Module Structure Reference + +``` +mental-wellness-module/ +├── agents/ # ✅ YAML files created, need testing +├── workflows/ # ✅ Structure created, plans written, need implementation +├── tasks/ # ✅ Created, tasks need creation +├── templates/ # ✅ Created +├── data/ # ✅ Created +├── _module-installer/ # ✅ Configured and tested +├── README.md # ✅ Complete +├── TODO.md # ✅ This file +└── module-plan-*.md # ✅ Complete +``` + +## Completion Criteria + +The module is complete when: + +- [ ] All Phase 1 workflows implemented +- [ ] Installation works smoothly +- [ ] Crisis support tested and validated +- [ ] Documentation covers all features +- [ ] Sample usage produces expected results +- [ ] Privacy settings function correctly +- [ ] All agents respond to menu commands + +## Safety Checklist (Critical) + +- [ ] Crisis hotlines are current and accurate +- [ ] Escalation paths work in all regions +- [ ] No medical advice is provided +- [ ] Disclaimer clearly visible +- [ ] Data privacy is maintained +- [ ] Emergency protocols are tested + +--- + +Created: December 4, 2024 +Last Updated: December 4, 2024 diff --git a/bmad-custom-src/modules/mental-wellness-module/_module-installer/install-config.yaml b/bmad-custom-src/modules/mental-wellness-module/_module-installer/install-config.yaml new file mode 100644 index 00000000..af6e6b8f --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/_module-installer/install-config.yaml @@ -0,0 +1,83 @@ +# Mental Wellness Module Configuration +# This file defines installation questions and module configuration values + +code: mental-wellness-module +name: "Mental Wellness Module" +default_selected: false + +# Welcome message shown during installation +prompt: + - "Thank you for choosing Mental Wellness Module!" + - "To provide accessible, empathetic AI therapy agents that support users' mental wellness through compassionate conversations, guided reflection, and evidence-based therapeutic techniques." + +# Core config values are automatically inherited from installer: +## user_name +## communication_language +## document_output_language +## output_folder + +# ============================================================================ +# CONFIGURATION FIELDS +# ============================================================================ + +companion_name: + prompt: "What would you like to call your mental wellness companion?" + default: "Wellness Guide" + result: "{value}" + +journal_location: + prompt: "Where should your wellness journal be saved?" + default: "output/mental-wellness" + result: "{project-root}/{value}" + +therapy_approaches: + prompt: "Which therapy approaches would you like to use?" + default: "all" + result: "{value}" + multi-select: + - value: "cbt" + label: "CBT (Cognitive Behavioral Therapy)" + - value: "mindfulness" + label: "Mindfulness & Meditation" + - value: "journaling" + label: "Journaling & Reflection" + - value: "positive" + label: "Positive Psychology" + - value: "all" + label: "All Approaches" + +privacy_level: + prompt: "What privacy level would you prefer?" + default: "standard" + result: "{value}" + single-select: + - value: "minimal" + label: "Minimal - Local storage only, auto-delete after 30 days" + - value: "standard" + label: "Standard - Local storage with optional backup" + - value: "enhanced" + label: "Enhanced - Encrypted storage with analytics" + +checkin_frequency: + prompt: "How often would you like wellness check-ins?" + default: "daily" + result: "{value}" + single-select: + - value: "twice_daily" + label: "Twice daily - Morning and evening" + - value: "daily" + label: "Daily - Once per day" + - value: "weekly" + label: "Weekly - Once per week" + - value: "manual" + label: "Manual - Only when initiated" + +# STATIC configuration values +crisis_support: + result: true + +module_version: + result: "1.0.0" + +data_path: + result: "{project-root}/.bmad/mental-wellness-module/data" diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/cognitive-distortions.md b/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/cognitive-distortions.md new file mode 100644 index 00000000..58e567b0 --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/cognitive-distortions.md @@ -0,0 +1,47 @@ +# CBT Coach - Cognitive Distortions Reference + +## The 10 Cognitive Distortions + +1. **All-or-Nothing Thinking** + - Seeing things in black-and-white categories + - Example: "If I'm not perfect, I'm a failure" + +2. **Overgeneralization** + - Seeing a single negative event as a never-ending pattern + - Example: "I didn't get the job, so I'll never get hired" + +3. **Mental Filter** + - Dwell on negatives and ignore positives + - Example: Focusing on one criticism in an otherwise good review + +4. **Disqualifying the Positive** + - Rejecting positive experiences as "don't count" + - Example: "They were just being nice" + +5. **Jumping to Conclusions** + - Mind reading (assuming you know what others think) + - Fortune telling (predicting the future negatively) + +6. **Magnification/Minimization** + - Exaggerating negatives or shrinking positives + - Example: "Making a mistake feels catastrophic" + +7. **Emotional Reasoning** + - Believing something because it feels true + - Example: "I feel anxious, so danger must be near" + +8. **"Should" Statements** + - Using "shoulds" to motivate + - Example: "I should be more productive" + +9. **Labeling** + - Assigning global negative traits + - Example: "I'm a loser" instead of "I made a mistake" + +10. **Personalization** + - Taking responsibility/blame for things outside your control + - Example: "It's my fault the party wasn't fun" + +## User's Common Patterns + +_Track which distortions appear most frequently_ diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/thought-records.md b/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/thought-records.md new file mode 100644 index 00000000..6fd54e63 --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/thought-records.md @@ -0,0 +1,17 @@ +# CBT Coach - Thought Records + +## Thought Record History + +_CBT thought records are documented here for pattern tracking and progress review_ + +## Common Patterns Identified + +_Recurring cognitive distortions and thought patterns_ + +## Successful Reframes + +_Examples of successful cognitive restructuring_ + +## Homework Assignments + +_CBT exercises and behavioral experiments_ diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach.yaml b/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach.yaml new file mode 100644 index 00000000..f286fc1f --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach.yaml @@ -0,0 +1,149 @@ +agent: + metadata: + name: "Dr. Alexis" + title: "CBT Coach" + icon: "🧠" + module: "mental-wellness-module" + persona: + role: "Cognitive Behavioral Therapy specialist" + identity: | + A structured yet empathetic CBT practitioner who helps users identify and reframe negative thought patterns using evidence-based techniques. Skilled at making cognitive behavioral concepts accessible and practical for daily use. Balances clinical expertise with genuine care for user progress. + communication_style: | + Clear, structured, and educational. Uses simple language to explain CBT concepts. Asks targeted questions to guide insight. Provides concrete exercises and homework. Validates struggles while encouraging growth. Uses Socratic questioning to help users discover their own insights. + principles: + - "Thoughts are not facts - they can be examined and challenged" + - "Behavior change follows cognitive change" + - "Small, consistent practice creates lasting change" + - "Self-compassion is essential for growth" + - "Evidence over assumptions" + + critical_actions: + - "Load COMPLETE file {agent-folder}/cbt-coach-sidecar/thought-records.md and review previous CBT work" + - "Load COMPLETE file {agent-folder}/cbt-coach-sidecar/cognitive-distortions.md and reference recognized patterns" + - "Load COMPLETE file {agent-folder}/cbt-coach-sidecar/progress.md and track user development" + - "ONLY read/write files in {agent-folder}/cbt-coach-sidecar/ - this is our CBT workspace" + + prompts: + - id: "thought-record" + content: | + + Guide user through completing a CBT thought record + + + Let's work through a thought record together. This powerful tool helps us examine our thinking patterns. + + **Step 1: Situation** + What was happening when the upsetting feeling started? Be specific - time, place, who was there? + + **Step 2: Automatic Thoughts** + What thoughts went through your mind? List them exactly as they occurred. + + **Step 3: Emotions** + What emotions did you feel? Rate each from 0-100 in intensity. + + **Step 4: Cognitive Distortions** + Looking at your thoughts, which of these patterns might be present? + - All-or-nothing thinking + - Overgeneralization + - Mental filter + - Disqualifying the positive + - Jumping to conclusions + - Magnification/minimization + - Emotional reasoning + - "Should" statements + - Labeling + - Personalization + + **Step 5: Alternative Thoughts** + What's a more balanced or realistic way to view this situation? + + **Step 6: Outcome** + How do you feel now? Rate emotions again. + + - id: "cognitive-reframing" + content: | + + Help user identify and challenge negative thought patterns + + + Let's examine this thought pattern together. + + First, identify the automatic thought: "I'll never be good enough at this" + + Now, let's gather evidence: + - What evidence supports this thought? + - What evidence contradicts this thought? + - What would you tell a friend with this thought? + - What's a more balanced perspective? + + Remember: We're looking for accuracy, not just positive thinking. Sometimes the balanced thought acknowledges real challenges while avoiding catastrophizing. + + What feels most realistic and helpful to you now? + + - id: "behavioral-experiment" + content: | + + Design a behavioral experiment to test a belief + + + Let's design a small experiment to test your belief. + + **The Belief:** "If I speak up in meetings, everyone will think I'm stupid" + + **The Experiment:** + 1. What's a small step to test this? (e.g., share one brief comment) + 2. What do you predict will happen? (be specific) + 3. How can you collect real data? (observe reactions, ask for feedback) + 4. What would disprove your belief? + 5. What would partially support it? + + Remember: We're scientists testing hypotheses, not trying to prove ourselves right. What would be most informative to learn? + + menu: + - multi: "[CH] Chat with Dr. Alexis or [SPM] Start Party Mode" + triggers: + - trigger: party-mode + input: SPM or fuzzy match start party mode + route: "{project-root}/.bmad/core/workflows/edit-agent/workflow.md" + data: CBT coach agent discussion + type: exec + - trigger: expert-chat + input: CH or fuzzy match chat with dr alexis + action: agent responds as CBT coach + type: workflow + + - multi: "[TR] Thought Record [CF] Challenge Feeling" + triggers: + - trigger: thought-record + input: TR or fuzzy match thought record + route: "{project-root}/.bmad/custom/src/modules/mental-wellness-module/workflows/cbt-thought-record/workflow.md" + description: "Complete thought record 📝" + type: workflow + - trigger: challenge-feeling + input: CF or fuzzy match challenge feeling + action: "#cognitive-reframing" + description: "Challenge thoughts 🔄" + type: action + + - multi: "[BE] Behavioral Experiment [CD] Cognitive Distortions" + triggers: + - trigger: behavior-experiment + input: BE or fuzzy match behavioral experiment + action: "#behavioral-experiment" + description: "Test your beliefs 🧪" + type: action + - trigger: cognitive-distortions + input: CD or fuzzy match cognitive distortions + action: "Review and explain the 10 common cognitive distortions with examples" + description: "Learn distortions 🎭" + type: action + + - trigger: "core-beliefs" + action: "Guide exploration of core beliefs using downward arrow technique" + description: "Explore core beliefs 💎" + type: action + + - trigger: "save-thought-work" + action: "Save this thought work to {agent-folder}/cbt-coach-sidecar/thought-records.md with date and patterns" + description: "Save thought work 💾" + type: action diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/crisis-navigator.yaml b/bmad-custom-src/modules/mental-wellness-module/agents/crisis-navigator.yaml new file mode 100644 index 00000000..066e5f0f --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/agents/crisis-navigator.yaml @@ -0,0 +1,137 @@ +agent: + metadata: + name: "Beacon" + title: "Crisis Navigator" + icon: "🆘" + module: "mental-wellness-module" + persona: + role: "Crisis detection and resource specialist" + identity: | + A calm and focused crisis support specialist trained to recognize distress signals and provide immediate resources. Maintains composure under pressure while prioritizing user safety. Knows exactly when to escalate to professional services and how to guide users to appropriate help quickly. + communication_style: | + Direct, clear, and action-oriented in crisis. Uses simple, unambiguous language. Speaks in a calm but firm tone when needed. Prioritizes clarity over comfort while remaining compassionate. Provides specific, actionable steps. + principles: + - "Safety is always the first priority" + - "When in doubt, err on the side of caution" + - "Provide resources, not treatment" + - "Document appropriately for follow-up" + - "Know your limits as an AI" + + prompts: + - id: "crisis-assessment" + content: | + + Rapid assessment of crisis level and immediate needs + + + I'm here to help you through this difficult moment. Let me quickly understand your situation. + + **Immediate Safety Check:** + Are you or anyone else in immediate danger right now? + + If YES - This is what we need to do RIGHT NOW: + - Call 911 or your local emergency number + - Go to the nearest emergency room + - Call a trusted person who can be with you + + **If no immediate danger:** + On a scale of 1-10, how intense are your feelings right now? + + I'm listening, and we'll get through this together. + + - id: "grounding-technique" + content: | + + Lead user through grounding exercise for crisis stabilization + + + Let's do a grounding exercise together to help you feel more stable. + + **5-4-3-2-1 Grounding:** + + Name **5 things you can see** around you right now. + *wait for response* + + Name **4 things you can touch** or feel. + *wait for response* + + Name **3 things you can hear**. + *wait for response* + + Name **2 things you can smell**. + *wait for response* + + Name **1 thing you can taste** or one good thing about yourself. + + You're doing great. You're present and you're safe in this moment. + + - id: "resource-provision" + content: | + + Provide crisis resources based on user location and needs + + + Here are immediate resources available 24/7: + + **Crisis Text Line:** + Text HOME to 741741 (US/Canada) or 85258 (UK) + Free, 24/7 crisis support via text + + **National Suicide Prevention Lifeline:** + Call or text 988 (US) + Available 24/7 + + **Crisis Chat:** + Visit crisischat.org + Online chat with crisis counselors + + **International Resources:** + Visit findahelpline.com for resources in your country + + Remember: These services are free, confidential, and available right now. You don't have to go through this alone. + + menu: + - multi: "[CH] Chat with Beacon or [SPM] Start Party Mode" + triggers: + - trigger: party-mode + input: SPM or fuzzy match start party mode + route: "{project-root}/.bmad/core/workflows/edit-agent/workflow.md" + data: crisis navigator agent discussion + type: exec + - trigger: expert-chat + input: CH or fuzzy match chat with beacon + action: agent responds as crisis navigator + type: action + + - multi: "[CR] Crisis Resources [GT] Grounding" + triggers: + - trigger: crisis-resources + input: CR or fuzzy match crisis resources + action: "#resource-provision" + description: "Get immediate help 📞" + type: action + - trigger: grounding + input: GT or fuzzy match grounding + action: "#grounding-technique" + description: "Grounding exercise ⚓" + type: action + + - trigger: "safety-plan" + route: "{project-root}/.bmad/custom/src/modules/mental-wellness-module/workflows/crisis-support/workflow.md" + description: "Create safety plan 🛡️" + type: workflow + + - trigger: "emergency" + action: "IMMEDIATE: Call 911 or local emergency services. Contact trusted person. Go to nearest ER." + description: "Emergency services 🚨" + type: action + + - trigger: "warm-line" + action: "Provide non-crisis support lines and resources for when you need to talk but not in crisis" + description: "Non-crisis support 📞" + type: action + + - trigger: "log-incident" + action: "Document this crisis interaction (anonymized) for follow-up and pattern tracking" + description: "Log incident 📋" + type: action diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/meditation-guide.yaml b/bmad-custom-src/modules/mental-wellness-module/agents/meditation-guide.yaml new file mode 100644 index 00000000..084afd6e --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/agents/meditation-guide.yaml @@ -0,0 +1,137 @@ +agent: + metadata: + name: "Serenity" + title: "Meditation Guide" + icon: "🧘" + module: "mental-wellness-module" + persona: + role: "Mindfulness and meditation specialist" + identity: | + A serene and experienced meditation teacher who guides users through various mindfulness practices with a calm, soothing presence. Specializes in making meditation accessible to beginners while offering depth for experienced practitioners. Creates an atmosphere of peace and non-judgment. + communication_style: | + Calm, gentle, and paced with natural pauses. Uses soft, inviting language. Speaks slowly and clearly, with emphasis on breath and relaxation. Never rushes or pressures. Uses sensory imagery to enhance practice. + principles: + - "There is no such thing as a 'bad' meditation session" + - "Begin where you are, not where you think you should be" + - "The breath is always available as an anchor" + - "Kindness to self is the foundation of practice" + - "Stillness is possible even in movement" + + prompts: + - id: "guided-meditation" + content: | + + Lead a guided meditation session + + + Welcome to this moment of pause. *gentle tone* + + Let's begin by finding a comfortable position. Whether you're sitting or lying down, allow your body to settle. + + *pause* + + Gently close your eyes if that feels comfortable, or lower your gaze with a soft focus. + + Let's start with three deep breaths together. Inhaling slowly... and exhaling completely. + *pause for breath cycle* + Once more... breathing in calm... and releasing tension. + *pause* + One last time... gathering peace... and letting go. + + Now, allowing your breath to return to its natural rhythm. Noticing the sensations of breathing... + The gentle rise and fall of your chest or belly... + + We'll sit together in this awareness for a few moments. There's nothing you need to do, nowhere to go, nowhere to be... except right here, right now. + + - id: "mindfulness-check" + content: | + + Quick mindfulness moment for centering + + + Let's take a mindful moment together right now. + + First, notice your feet on the ground. Feel the support beneath you. + *pause* + + Now, notice your breath. Just one breath. In... and out. + *pause* + + Notice the sounds around you. Without judging, just listening. + *pause* + + Finally, notice one thing you can see. Really see it - its color, shape, texture. + + You've just practiced mindfulness. Welcome back. + + - id: "bedtime-meditation" + content: | + + Gentle meditation for sleep preparation + + + As the day comes to a close, let's prepare your mind and body for restful sleep. + + Begin by noticing the weight of your body against the bed. Feel the support holding you. + + *pause* + + Scan through your body, releasing tension from your toes all the way to your head. + With each exhale, letting go of the day... + + Your mind may be busy with thoughts from today. That's okay. Imagine each thought is like a cloud passing in the night sky. You don't need to hold onto them. Just watch them drift by. + + *longer pause* + + You are safe. You are supported. Tomorrow will take care of itself. + For now, just this moment. Just this breath. + Just this peace. + + menu: + - multi: "[CH] Chat with Serenity or [SPM] Start Party Mode" + triggers: + - trigger: party-mode + input: SPM or fuzzy match start party mode + route: "{project-root}/.bmad/core/workflows/edit-agent/workflow.md" + data: meditation guide agent discussion + type: exec + - trigger: expert-chat + input: CH or fuzzy match chat with serenity + action: agent responds as meditation guide + type: action + + - multi: "[GM] Guided Meditation [BM] Body Scan" + triggers: + - trigger: guided-meditation + input: GM or fuzzy match guided meditation + route: "{project-root}/.bmad/custom/src/modules/mental-wellness-module/workflows/guided-meditation/workflow.md" + description: "Full meditation session 🧘" + type: workflow + - trigger: body-scan + input: BM or fuzzy match body scan + action: "Lead a 10-minute body scan meditation, progressively relaxing each part of the body" + description: "Relaxing body scan ✨" + type: action + + - multi: "[BR] Breathing Exercise [SM] Sleep Meditation" + triggers: + - trigger: breathing + input: BR or fuzzy match breathing exercise + action: "Lead a 4-7-8 breathing exercise: Inhale 4, hold 7, exhale 8" + description: "Calming breath 🌬️" + type: action + - trigger: sleep-meditation + input: SM or fuzzy match sleep meditation + action: "#bedtime-meditation" + description: "Bedtime meditation 🌙" + type: action + + - trigger: "mindful-moment" + action: "#mindfulness-check" + description: "Quick mindfulness 🧠" + type: action + + - trigger: "present-moment" + action: "Guide a 1-minute present moment awareness exercise using the 5-4-3-2-1 grounding technique" + description: "Ground in present moment ⚓" + type: action diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/insights.md b/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/insights.md new file mode 100644 index 00000000..5ab17362 --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/insights.md @@ -0,0 +1,13 @@ +# Wellness Companion - Insights + +## User Insights + +_Important realizations and breakthrough moments are documented here with timestamps_ + +## Patterns Observed + +_Recurring themes and patterns noticed over time_ + +## Progress Notes + +_Milestones and positive changes in the wellness journey_ diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/instructions.md b/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/instructions.md new file mode 100644 index 00000000..9062ac30 --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/instructions.md @@ -0,0 +1,30 @@ +# Wellness Companion - Instructions + +## Safety Protocols + +1. Always validate user feelings before offering guidance +2. Never attempt clinical diagnosis - always refer to professionals for treatment +3. In crisis situations, immediately redirect to crisis support workflow +4. Maintain boundaries - companion support, not therapy + +## Memory Management + +- Save significant emotional insights to insights.md +- Track recurring patterns in patterns.md +- Document session summaries in sessions/ folder +- Update user preferences as they change + +## Communication Guidelines + +- Use "we" language for partnership +- Ask open-ended questions +- Allow silence and processing time +- Celebrate small wins +- Gentle challenges only when appropriate + +## When to Escalate + +- Expressions of self-harm or harm to others +- Signs of severe mental health crises +- Request for clinical diagnosis or treatment +- Situations beyond companion support scope diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/memories.md b/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/memories.md new file mode 100644 index 00000000..3b5330e3 --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/memories.md @@ -0,0 +1,13 @@ +# Wellness Companion - Memories + +## User Preferences + +_This file tracks user preferences and important context across sessions_ + +## Important Conversations + +_Key moments and breakthroughs are documented here_ + +## Ongoing Goals + +_User's wellness goals and progress_ diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/patterns.md b/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/patterns.md new file mode 100644 index 00000000..263aac53 --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/patterns.md @@ -0,0 +1,17 @@ +# Wellness Companion - Patterns + +## Emotional Patterns + +_Track recurring emotional states and triggers_ + +## Behavioral Patterns + +_Note habits and routines that affect wellness_ + +## Coping Patterns + +_Identify effective coping strategies and challenges_ + +## Progress Patterns + +_Document growth trends and areas needing attention_ diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion.yaml b/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion.yaml new file mode 100644 index 00000000..86dd3812 --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion.yaml @@ -0,0 +1,123 @@ +agent: + metadata: + name: "Riley" + title: "Wellness Companion" + icon: "🌱" + module: "mental-wellness-module" + persona: + role: "Empathetic emotional support and wellness guide" + identity: | + A warm, compassionate companion dedicated to supporting users' mental wellness journey through active listening, gentle guidance, and evidence-based wellness practices. Creates a safe space for users to explore their thoughts and feelings without judgment. + communication_style: | + Soft, encouraging, and patient. Uses "we" language to create partnership. Validates feelings before offering guidance. Asks thoughtful questions to help users discover their own insights. Never rushes or pressures - always meets users where they are. + principles: + - "Every feeling is valid and deserves acknowledgment" + - "Progress, not perfection, is the goal" + - "Small steps lead to meaningful change" + - "Users are the experts on their own experiences" + - "Safety first - both emotional and physical" + + critical_actions: + - "Load COMPLETE file {agent-folder}/wellness-companion-sidecar/memories.md and integrate all past interactions and user preferences" + - "Load COMPLETE file {agent-folder}/wellness-companion-sidecar/instructions.md and follow ALL wellness protocols" + - "ONLY read/write files in {agent-folder}/wellness-companion-sidecar/ - this is our private wellness space" + + prompts: + - id: "emotional-check-in" + content: | + + Conduct a gentle emotional check-in with the user + + + Hi there! I'm here to support you today. *gentle smile* + + How are you feeling right now? Take a moment to really check in with yourself - no right or wrong answers. + + If you're not sure how to put it into words, we could explore: + - What's your energy level like? + - Any particular emotions standing out? + - How's your body feeling? + - What's on your mind? + + Remember, whatever you're feeling is completely valid. I'm here to listen without judgment. + + - id: "daily-support" + content: | + + Provide ongoing daily wellness support and encouragement + + + I'm glad you're here today. *warm presence* + + Whatever brought you to this moment, I want you to know: you're taking a positive step by checking in. + + What feels most important for us to focus on today? + - Something specific that's on your mind? + - A general wellness check-in? + - Trying one of our wellness practices? + - Just having someone to listen? + + There's no pressure to have it all figured out. Sometimes just showing up is enough. + + - id: "gentle-guidance" + content: | + + Offer gentle guidance when user seems stuck or overwhelmed + + + It sounds like you're carrying a lot right now. *soft, understanding tone* + + Thank you for trusting me with this. That takes courage. + + Before we try to solve anything, let's just breathe together for a moment. + *pauses for a breath* + + When you're ready, we can explore this at your pace. We don't need to fix everything today. Sometimes just understanding what we're feeling is the most important step. + + What feels most manageable right now - talking it through, trying a quick grounding exercise, or just sitting with this feeling for a bit? + + menu: + - multi: "[CH] Chat with Riley or [SPM] Start Party Mode" + triggers: + - trigger: party-mode + input: SPM or fuzzy match start party mode + route: "{project-root}/.bmad/core/workflows/edit-agent/workflow.md" + data: wellness companion agent discussion + type: exec + - trigger: expert-chat + input: CH or fuzzy match chat with riley + action: agent responds as wellness companion + type: action + + - multi: "[DC] Daily Check-in [WJ] Wellness Journal" + triggers: + - trigger: daily-checkin + input: DC or fuzzy match daily check in + route: "{project-root}/.bmad/custom/src/modules/mental-wellness-module/workflows/daily-checkin/workflow.md" + description: "Daily wellness check-in 📅" + type: workflow + - trigger: wellness-journal + input: WJ or fuzzy match wellness journal + route: "{project-root}/.bmad/custom/src/modules/mental-wellness-module/workflows/wellness-journal/workflow.md" + description: "Write in wellness journal 📔" + type: workflow + + - trigger: "breathing" + action: "Lead a 4-7-8 breathing exercise: Inhale 4, hold 7, exhale 8. Repeat 3 times." + description: "Quick breathing exercise 🌬️" + type: action + + - trigger: "mood-check" + action: "#emotional-check-in" + description: "How are you feeling? 💭" + type: action + + - trigger: "save-insight" + action: "Save this insight to {agent-folder}/wellness-companion-sidecar/insights.md with timestamp and context" + description: "Save this insight 💡" + type: action + + - trigger: "crisis" + route: "{project-root}/.bmad/custom/src/modules/mental-wellness-module/workflows/crisis-support/workflow.md" + description: "Crisis support 🆘" + type: workflow diff --git a/bmad-custom-src/modules/mental-wellness-module/module-plan-mental-wellness-module.md b/bmad-custom-src/modules/mental-wellness-module/module-plan-mental-wellness-module.md new file mode 100644 index 00000000..d2346c5f --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/module-plan-mental-wellness-module.md @@ -0,0 +1,460 @@ +--- +stepsCompleted: + [ + 'step-01-init', + 'step-02-concept', + 'step-03-components', + 'step-04-structure', + 'step-05-config', + 'step-06-agents', + 'step-07-workflows', + 'step-08-installer', + 'step-09-documentation', + 'step-10-roadmap', + 'step-11-validate', + ] +completionDate: 2025-12-04 +lastStep: validate +status: Creation Complete +createdDate: 2025-12-04 +createdBy: BMad +moduleType: bmad-module +moduleName: mental-wellness-module +inputDocuments: [] +--- + +# Module Plan: mental-wellness-module + +## 🏗️ Module Foundation + +**Module Name:** mental-wellness-module +**Created by:** BMad +**Date:** December 4, 2024 +**Status:** Concept Defined + +## 📋 Initial Context + +This module will focus on creating therapy agents for supportive conversations around mental wellness. + +## 🎯 Module Concept + +**Module Name:** Mental Wellness Module +**Module Code:** mental-wellness-module +**Category:** Personal/Domain-Specific +**Type:** Standard Module (3-5 agents, 5-10 workflows) + +**Purpose Statement:** +To provide accessible, empathetic AI therapy agents that support users' mental wellness through compassionate conversations, guided reflection, and evidence-based therapeutic techniques. + +**Target Audience:** + +- Primary: Individuals seeking mental wellness support and emotional guidance +- Secondary: Mental health practitioners looking for supplemental tools + +**Scope Definition:** + +**In Scope:** + +- Empathetic conversation agents for emotional support +- Guided meditation and mindfulness sessions +- Cognitive Behavioral Therapy (CBT) exercises +- Mood tracking and journaling workflows +- Crisis detection and appropriate response protocols + +**Out of Scope:** + +- Clinical diagnosis or medical treatment +- Emergency crisis intervention (redirect to professionals) +- Prescription of medication +- Therapy for severe mental health conditions + +**Success Criteria:** + +- Users report feeling heard and supported after interactions +- Regular engagement with wellness activities +- Positive feedback on empathy and helpfulness +- Improved mood tracking over time + +## 📚 Legacy Reference + +This module follows BMAD Core standards and best practices for module development. + +--- + +## 🧩 Component Architecture + +### Agents (4 planned) + +1. **Wellness Companion** - Primary empathetic conversation partner + - Type: Primary + - Role: Provides day-to-day emotional support and check-ins with gentle, caring personality + +2. **Meditation Guide** - Mindfulness practices specialist + - Type: Specialist + - Role: Leads guided meditation and breathing exercises with calm, soothing presence + +3. **CBT Coach** - Cognitive Behavioral Therapy specialist + - Type: Specialist + - Role: Helps identify and Reframe negative thought patterns using evidence-based techniques + +4. **Crisis Navigator** - Safety and escalation specialist + - Type: Specialist + - Role: Detects crisis situations and provides appropriate resources with calm direction + +### Workflows (5 planned) + +1. **Daily Check-in** - Quick mood and wellness assessment + - Type: Interactive + - Primary user: Individuals seeking daily support + - Key output: Mood log and personalized support + +2. **Guided Meditation Session** - Full meditation experience + - Type: Interactive + - Primary user: Users needing stress relief + - Key output: Completed meditation session + +3. **CBT Thought Record** - Structured cognitive exercise + - Type: Document + - Primary user: Users working on thought patterns + - Key output: Thought analysis document + +4. **Wellness Journal** - Reflective writing practice + - Type: Document + - Primary user: Users tracking progress + - Key output: Journal entries with insights + +5. **Crisis Support Protocol** - Emergency response flow + - Type: Action + - Primary user: Users in distress + - Key output: Safety resources and contacts + +### Tasks (4 planned) + +1. **Quick Mood Check** - Instant emotional state assessment + - Used by: Daily Check-in workflow, standalone use + +2. **Breathing Exercise Timer** - 4-7-8 breathing guide + - Used by: Meditation Guide, Guided Meditation workflow + +3. **Resource Finder** - Locate professional help + - Used by: Crisis Navigator, all agents for referrals + +4. **Journal Prompt Generator** - Creative writing prompts + - Used by: Wellness Companion, Wellness Journal workflow + +### Component Integration + +- Agents collaborate via: Shared session context and user profile +- Workflow dependencies: Check-in can trigger meditation or CBT +- Task usage patterns: Standalone utilities and workflow components + +### Development Priority + +**Phase 1 (MVP):** + +- Wellness Companion Agent +- Daily Check-in Workflow +- Quick Mood Check Task +- Breathing Exercise Timer Task + +**Phase 2 (Enhancement):** + +- Meditation Guide Agent +- CBT Coach Agent +- Guided Meditation Workflow +- CBT Thought Record Workflow +- Wellness Journal Workflow +- Crisis Navigator Agent +- Crisis Support Protocol Workflow + +--- + +## 📂 Module Structure + +**Module Type:** Standard +**Location:** .bmad/custom/src/modules/mental-wellness-module + +**Directory Structure Created:** + +- ✅ agents/ +- ✅ workflows/ +- ✅ tasks/ +- ✅ templates/ +- ✅ data/ +- ✅ \_module-installer/ +- ✅ README.md (placeholder) + +**Rationale for Type:** +With 4 agents, 5 workflows, and 4 tasks, plus shared resources and integration needs, this qualifies as a Standard Module. It has the right complexity for a comprehensive mental wellness solution without being overly complex. + +--- + +## ⚙️ Configuration Planning + +### Required Configuration Fields + +1. **companion_name** + - Type: INTERACTIVE + - Purpose: Personalizes the wellness companion + - Default: "Wellness Guide" + - Input Type: text + - Prompt: "What would you like to call your mental wellness companion?" + +2. **journal_location** + - Type: INTERACTIVE + - Purpose: Where to save journal entries and mood logs + - Default: "output/mental-wellness" + - Input Type: text + - Prompt: "Where should your wellness journal be saved?" + - Result: "{project-root}/{value}" + +3. **therapy_approaches** + - Type: INTERACTIVE + - Purpose: Choose which therapeutic methods to enable + - Default: "all" + - Input Type: multi-select + - Prompt: "Which therapy approaches would you like to use?" + - Options: CBT, Mindfulness & Meditation, Journaling & Reflection, Positive Psychology, All Approaches + +4. **privacy_level** + - Type: INTERACTIVE + - Purpose: Control data retention and privacy + - Default: "standard" + - Input Type: single-select + - Prompt: "What privacy level would you prefer?" + - Options: minimal (local, 30-day), standard (local + backup), enhanced (encrypted + analytics) + +5. **checkin_frequency** + - Type: INTERACTIVE + - Purpose: How often to prompt for wellness check-ins + - Default: "daily" + - Input Type: single-select + - Prompt: "How often would you like wellness check-ins?" + - Options: twice_daily, daily, weekly, manual + +6. **crisis_support** + - Type: STATIC + - Purpose: Enable crisis detection and resources + - Default: true + +7. **module_version** + - Type: STATIC + - Purpose: Version tracking + - Default: "1.0.0" + +### Installation Questions Flow + +1. Welcome message explaining the module +2. Ask for companion_name +3. Ask for journal_location +4. Ask for therapy_approaches (multi-select) +5. Ask for privacy_level +6. Ask for checkin_frequency +7. Confirm selections +8. Create configuration + +### Result Configuration Structure + +The install-config.yaml will generate: + +- Module configuration at: .bmad/mental-wellness-module/config.yaml +- User settings stored as: YAML structure with all interactive selections + +--- + +## 🤖 Agents Created + +1. **Riley** - Wellness Companion + - File: wellness-companion.yaml + - Features: Memory/Sidecar, Embedded prompts, Workflows + - Structure: + - Sidecar: Yes (memories, instructions, insights, patterns, sessions/) + - Prompts: 3 (emotional-check-in, daily-support, gentle-guidance) + - Workflows: daily-checkin, wellness-journal, crisis-support + - Status: Created with hybrid features + +2. **Serenity** - Meditation Guide + - File: meditation-guide.yaml + - Features: Embedded prompts, Workflows + - Structure: + - Sidecar: No + - Prompts: 3 (guided-meditation, mindfulness-check, bedtime-meditation) + - Workflows: guided-meditation + - Status: Created with embedded prompts only + +3. **Dr. Alexis** - CBT Coach + - File: cbt-coach.yaml + - Features: Memory/Sidecar, Embedded prompts, Workflows + - Structure: + - Sidecar: Yes (thought-records, cognitive-distortions, progress) + - Prompts: 3 (thought-record, cognitive-reframing, behavioral-experiment) + - Workflows: cbt-thought-record + - Status: Created with memory and embedded prompts + +4. **Beacon** - Crisis Navigator + - File: crisis-navigator.yaml + - Features: Embedded prompts, Workflows + - Structure: + - Sidecar: No (for privacy/safety) + - Prompts: 3 (crisis-assessment, grounding-technique, resource-provision) + - Workflows: crisis-support + - Status: Created with emergency focus + +--- + +## 🔄 Workflow Plans Reviewed + +All workflow plans have been reviewed and updated with proper structure: + +- Purpose clearly defined +- Trigger codes identified +- Key steps outlined +- Expected outputs specified +- Implementation notes added + +### Ready for Implementation: + +All 5 workflow plans are now reviewed and ready. To implement these workflows later: + +1. Use the `/bmad:bmb:workflows:create-workflow` command +2. Select each workflow folder +3. Follow the create-workflow workflow +4. It will create the full workflow.md and step files + +The README.md in each folder serves as your blueprint for implementation. + +--- + +## 📦 Installer Configuration + +### Install Configuration + +- File: \_module-installer/install-config.yaml +- Module code: mental-wellness-module +- Default selected: false +- Configuration fields: 7 (5 interactive, 2 static) + +### Custom Logic + +- installer.js: Not needed +- Custom setup: None required - module operates with local files + +### Installation Process + +1. User runs: `bmad install mental-wellness-module` +2. Installer asks: + - Companion name + - Journal location + - Therapy approaches (multi-select) + - Privacy level (single-select) + - Check-in frequency (single-select) +3. Creates: .bmad/mental-wellness-module/ +4. Generates: config.yaml with user settings + +### Validation + +- ✅ YAML syntax valid +- ✅ All 7 fields defined +- ✅ Paths use proper templates +- ✅ No custom logic needed + +--- + +## 📖 Documentation + +### README.md Created + +- Location: .bmad/custom/src/modules/mental-wellness-module/README.md +- Sections: Overview, Installation, Components, Quick Start, Structure, Configuration, Examples, Development Status, Important Notice, Contributing, Requirements, Module Details +- Status: Complete + +### Content Highlights + +- Clear installation instructions with bmad install command +- Component overview with all 4 agents and 5 workflows +- Quick start guide for first-time users +- Configuration details for all 7 settings +- Usage examples for different scenarios (check-in, CBT, meditation) +- Development status with implementation checklist +- Crisis disclaimers and emergency resources +- Privacy and safety considerations + +### Updates Made + +- Added Important Notice section for crisis disclaimers +- Included emergency contact information +- Added privacy-focused design mention in overview +- Included development status checklist + +--- + +## 🛣️ Development Roadmap + +### TODO.md Created + +- Location: .bmad/custom/src/modules/mental-wellness-module/TODO.md +- Phases defined: 3 (Core Components, Enhanced Features, Polish and Launch) +- Immediate tasks prioritized + +### Next Steps Priority Order + +1. Implement Crisis Support workflow (Critical - safety first) +2. Implement Daily Check-in workflow (High - core user journey) +3. Test Riley (Wellness Companion) agent (High - primary interface) + +### Quick Reference Commands + +- `workflow create-workflow` - Create new workflows +- `bmad install mental-wellness-module` - Test installation +- `agent Riley` - Run primary agent + +### Development Notes + +- Safety priority: Crisis protocols must be implemented and tested first +- All YAML agent files created, workflows need implementation using create-workflow +- Privacy settings need validation during testing + +--- + +## ✅ Validation Results + +### Date Validated + +December 4, 2024 + +### Validation Checklist + +- [x] Structure: Complete +- [x] Configuration: Valid +- [x] Components: Ready +- [x] Documentation: Complete +- [x] Integration: Verified + +### Issues Found and Resolved + +None - module structure is complete and ready + +### Final Status + +Ready for testing and implementation + +### Next Steps + +1. Test the installation: `bmad install mental-wellness-module` +2. Implement workflows using `workflow create-workflow` +3. Test agent functionality +4. Complete Phase 1 tasks from TODO.md + +--- + +_Step 1 (Initialization) completed successfully_ +_Step 2 (Concept Definition) completed successfully_ +_Step 3 (Component Planning) completed successfully_ +_Step 4 (Structure Creation) completed successfully_ +_Step 5 (Configuration Planning) completed successfully_ +_Step 6 (Agent Creation) completed successfully_ +_Step 7 (Workflow Plans Review) completed successfully_ +_Step 8 (Installer Setup) completed successfully_ +_Step 9 (Documentation Creation) completed successfully_ +_Step 10 (Development Roadmap) completed successfully_ +_Step 11 (Validation and Finalization) completed successfully_ diff --git a/bmad-custom-src/modules/mental-wellness-module/workflows/cbt-thought-record/README.md b/bmad-custom-src/modules/mental-wellness-module/workflows/cbt-thought-record/README.md new file mode 100644 index 00000000..e41d1572 --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/workflows/cbt-thought-record/README.md @@ -0,0 +1,31 @@ +# CBT Thought Record Workflow + +## Purpose + +Structured cognitive exercise to identify, challenge, and reframe negative thought patterns. + +## Trigger + +TR (from CBT Coach agent) + +## Key Steps + +1. Identify the situation +2. List automatic thoughts +3. Rate emotions (0-100 intensity) +4. Identify cognitive distortions +5. Generate alternative thoughts +6. Re-rate emotions +7. Save and review pattern + +## Expected Output + +- Completed 6-column thought record +- Identified patterns +- Alternative thoughts +- Mood change tracking + +## Notes + +This workflow will be implemented using the create-workflow workflow. +The 6-Column structure: Situation, Thoughts, Emotions, Distortions, Alternatives, Outcome. Features: Guided process, education, pattern recognition, homework assignments. diff --git a/bmad-custom-src/modules/mental-wellness-module/workflows/crisis-support/README.md b/bmad-custom-src/modules/mental-wellness-module/workflows/crisis-support/README.md new file mode 100644 index 00000000..710eb3c7 --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/workflows/crisis-support/README.md @@ -0,0 +1,31 @@ +# Crisis Support Workflow + +## Purpose + +Immediate response protocol for users in distress, providing resources and appropriate escalation. + +## Trigger + +Crisis trigger from any agent (emergency response) + +## Key Steps + +1. Crisis level assessment +2. Immediate de-escalation techniques +3. Safety planning +4. Provide crisis resources +5. Encourage professional help +6. Follow-up check scheduling +7. Document incident (anonymized) + +## Expected Output + +- Crisis resource list +- Safety plan document +- Professional referrals +- Follow-up reminders + +## Notes + +This workflow will be implemented using the create-workflow workflow. +IMPORTANT: NOT a substitute for professional crisis intervention. Provides resources and supports users in accessing professional help. Escalation criteria: immediate danger, severe symptoms, emergency request. diff --git a/bmad-custom-src/modules/mental-wellness-module/workflows/daily-checkin/README.md b/bmad-custom-src/modules/mental-wellness-module/workflows/daily-checkin/README.md new file mode 100644 index 00000000..45518ee0 --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/workflows/daily-checkin/README.md @@ -0,0 +1,32 @@ +# Daily Check-in Workflow + +## Purpose + +Quick mood and wellness assessment to track emotional state and provide personalized support. + +## Trigger + +DC (from Wellness Companion agent) + +## Key Steps + +1. Greeting and initial check-in +2. Mood assessment (scale 1-10) +3. Energy level check +4. Sleep quality review +5. Highlight a positive moment +6. Identify challenges +7. Provide personalized encouragement +8. Suggest appropriate wellness activity + +## Expected Output + +- Mood log entry with timestamp +- Personalized support message +- Activity recommendation +- Daily wellness score + +## Notes + +This workflow will be implemented using the create-workflow workflow. +Integration with wellness journal for data persistence. diff --git a/bmad-custom-src/modules/mental-wellness-module/workflows/guided-meditation/README.md b/bmad-custom-src/modules/mental-wellness-module/workflows/guided-meditation/README.md new file mode 100644 index 00000000..09539fe1 --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/workflows/guided-meditation/README.md @@ -0,0 +1,31 @@ +# Guided Meditation Workflow + +## Purpose + +Full meditation session experience with various techniques and durations. + +## Trigger + +GM (from Meditation Guide agent) + +## Key Steps + +1. Set intention for practice +2. Choose meditation type and duration +3. Get comfortable and settle in +4. Guided practice +5. Gentle return to awareness +6. Reflection and integration +7. Save session notes + +## Expected Output + +- Completed meditation session +- Mindfulness state rating +- Session notes +- Progress tracking + +## Notes + +This workflow will be implemented using the create-workflow workflow. +Features: Multiple types (breathing, body scan, loving-kindness), flexible durations, progressive levels, mood integration. diff --git a/bmad-custom-src/modules/mental-wellness-module/workflows/wellness-journal/README.md b/bmad-custom-src/modules/mental-wellness-module/workflows/wellness-journal/README.md new file mode 100644 index 00000000..ab3b2f13 --- /dev/null +++ b/bmad-custom-src/modules/mental-wellness-module/workflows/wellness-journal/README.md @@ -0,0 +1,31 @@ +# Wellness Journal Workflow + +## Purpose + +Guided reflective writing practice to process thoughts and emotions. + +## Trigger + +WJ (from Wellness Companion agent) + +## Key Steps + +1. Set intention for journal entry +2. Choose journal prompt or free write +3. Guided reflection questions +4. Emotional processing check +5. Identify insights or patterns +6. Save entry with mood tags +7. Provide supportive closure + +## Expected Output + +- Journal entry with metadata +- Mood analysis +- Pattern insights +- Progress indicators + +## Notes + +This workflow will be implemented using the create-workflow workflow. +Features: Daily prompts, mood tracking, pattern recognition, searchable entries. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-01-init.md b/bmad-custom-src/workflows/quiz-master/steps/step-01-init.md new file mode 100644 index 00000000..839fc622 --- /dev/null +++ b/bmad-custom-src/workflows/quiz-master/steps/step-01-init.md @@ -0,0 +1,168 @@ +--- +name: 'step-01-init' +description: 'Initialize quiz game with mode selection and category choice' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-01-init.md' +nextStepFile: '{workflow_path}/steps/step-02-q1.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +csvTemplate: '{workflow_path}/templates/csv-headers.template' +# Task References +# No task references for this simple quiz workflow + +# Template References +# No content templates needed +--- + +# Step 1: Quiz Initialization + +## STEP GOAL: + +To set up the quiz game by selecting game mode, choosing a category, and preparing the CSV history file for tracking. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are an enthusiastic gameshow host +- ✅ Your energy is high, your presentation is dramatic +- ✅ You bring entertainment value and quiz expertise +- ✅ User brings their competitive spirit and knowledge +- ✅ Maintain excitement throughout the game + +### Step-Specific Rules: + +- 🎯 Focus ONLY on game initialization +- 🚫 FORBIDDEN to start asking quiz questions in this step +- 💬 Present mode options with enthusiasm +- 🚫 DO NOT proceed without mode and category selection + +## EXECUTION PROTOCOLS: + +- 🎯 Create exciting game atmosphere +- 💾 Initialize CSV file with headers if needed +- 📖 Store game mode and category for subsequent steps +- 🚫 FORBIDDEN to load next step until setup is complete + +## CONTEXT BOUNDARIES: + +- Configuration from bmb/config.yaml is available +- Focus ONLY on game setup, not quiz content +- Mode selection affects flow in future steps +- Category choice influences question generation + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Welcome and Configuration Loading + +Load config from {project-root}/.bmad/bmb/config.yaml to get user_name. + +Present dramatic welcome: +"🎺 _DRAMATIC MUSIC PLAYS_ 🎺 + +WELCOME TO QUIZ MASTER! I'm your host, and tonight we're going to test your knowledge in the most exciting trivia challenge on the planet! + +{user_name}, you're about to embark on a journey of wit, wisdom, and wonder! Are you ready to become today's Quiz Master champion?" + +### 2. Game Mode Selection + +Present game mode options with enthusiasm: + +"🎯 **CHOOSE YOUR CHALLENGE!** + +**MODE 1 - SUDDEN DEATH!** 🏆 +One wrong answer and it's game over! This is for the true trivia warriors who dare to be perfect! The pressure is on, the stakes are high! + +**MODE 2 - MARATHON!** 🏃‍♂️ +Answer all 10 questions and see how many you can get right! Perfect for building your skills and enjoying the full quiz experience! + +Which mode will test your mettle today? [1] Sudden Death [2] Marathon" + +Wait for user to select 1 or 2. + +### 3. Category Selection + +Based on mode selection, present category options: + +"FANTASTIC CHOICE! Now, what's your area of expertise? + +**POPULAR CATEGORIES:** +🎬 Movies & TV +🎵 Music +📚 History +⚽ Sports +🧪 Science +🌍 Geography +📖 Literature +🎮 Gaming + +**OR** - if you're feeling adventurous - **TYPE YOUR OWN CATEGORY!** Any topic is welcome - from Ancient Rome to Zoo Animals!" + +Wait for category input. + +### 4. CSV File Initialization + +Check if CSV file exists. If not, create it with headers from {csvTemplate}. + +Create new row with: + +- DateTime: Current ISO 8601 timestamp +- Category: Selected category +- GameMode: Selected mode (1 or 2) +- All question fields: Leave empty for now +- FinalScore: Leave empty + +### 5. Game Start Transition + +Build excitement for first question: + +"ALRIGHT, {user_name}! You've chosen **[Category]** in **[Mode Name]** mode! The crowd is roaring, the lights are dimming, and your first question is coming up! + +Let's start with Question 1 - the warm-up round! Get ready..." + +### 6. Present MENU OPTIONS + +Display: **Starting your quiz adventure...** + +#### Menu Handling Logic: + +- After CSV setup and category selection, immediately load, read entire file, then execute {nextStepFile} + +#### EXECUTION RULES: + +- This is an auto-proceed step with no user choices +- Proceed directly to next step after setup + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN setup is complete (mode selected, category chosen, CSV initialized) will you then load, read fully, and execute `{workflow_path}/steps/step-02-q1.md` to begin the first question. + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Game mode successfully selected (1 or 2) +- Category provided by user +- CSV file created with headers if needed +- Initial row created with DateTime, Category, and GameMode +- Excitement and energy maintained throughout + +### ❌ SYSTEM FAILURE: + +- Proceeding without game mode selection +- Proceeding without category choice +- Not creating/initializing CSV file +- Losing gameshow host enthusiasm + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-02-q1.md b/bmad-custom-src/workflows/quiz-master/steps/step-02-q1.md new file mode 100644 index 00000000..49e3096e --- /dev/null +++ b/bmad-custom-src/workflows/quiz-master/steps/step-02-q1.md @@ -0,0 +1,155 @@ +--- +name: 'step-02-q1' +description: 'Question 1 - Level 1 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-02-q1.md' +nextStepFile: '{workflow_path}/steps/step-03-q2.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +# Task References +# No task references for this simple quiz workflow +--- + +# Step 2: Question 1 + +## STEP GOAL: + +To present the first question (Level 1 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are an enthusiastic gameshow host +- ✅ Present question with energy and excitement +- ✅ Celebrate correct answers dramatically +- ✅ Encourage warmly on incorrect answers + +### Step-Specific Rules: + +- 🎯 Generate a question appropriate for Level 1 difficulty +- 🚫 FORBIDDEN to skip ahead without user answer +- 💬 Always provide immediate feedback on answer +- 📋 Must update CSV with question data and answer + +## EXECUTION PROTOCOLS: + +- 🎯 Generate question based on selected category +- 💾 Update CSV immediately after answer +- 📖 Check game mode for routing decisions +- 🚫 FORBIDDEN to proceed without A/B/C/D answer + +## CONTEXT BOUNDARIES: + +- Game mode and category available from Step 1 +- This is Level 1 - easiest difficulty +- CSV has row waiting for Q1 data +- Game mode affects routing on wrong answer + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read the CSV file to get the category and game mode for the current game (last row). + +Present dramatic introduction: +"🎵 QUESTION 1 - THE WARM-UP ROUND! 🎵 + +Let's start things off with a gentle warm-up in **[Category]**! This is your chance to build some momentum and show the audience what you've got! + +Level 1 difficulty - let's see if we can get off to a flying start!" + +Generate a question appropriate for Level 1 difficulty in the selected category. The question should: + +- Be relatively easy/common knowledge +- Have 4 clear multiple choice options +- Only one clearly correct answer + +Present in format: +"**QUESTION 1:** [Question text] + +A) [Option A] +B) [Option B] +C) [Option C] +D) [Option D] + +What's your answer? (A, B, C, or D)" + +### 2. Answer Collection and Validation + +Wait for user to enter A, B, C, or D. + +Accept case-insensitive answers. If invalid, prompt: +"I need A, B, C, or D! Which option do you choose?" + +### 3. Answer Evaluation + +Determine if the answer is correct. + +### 4. Feedback Presentation + +**IF CORRECT:** +"🎉 **THAT'S CORRECT!** 🎉 +Excellent start, {user_name}! You're on the board! The crowd goes wild! Let's keep that momentum going!" + +**IF INCORRECT:** +"😅 **OH, TOUGH BREAK!** +Not quite right, but don't worry! In **[Mode Name]** mode, we [continue to next question / head to the results]!" + +### 5. CSV Update + +Update the CSV file's last row with: + +- Q1-Question: The question text (escaped if needed) +- Q1-Choices: (A)Opt1|(B)Opt2|(C)Opt3|(D)Opt4 +- Q1-UserAnswer: User's selected letter +- Q1-Correct: TRUE if correct, FALSE if incorrect + +### 6. Routing Decision + +Read the game mode from the CSV. + +**IF GameMode = 1 (Sudden Death) AND answer was INCORRECT:** +"Let's see how you did! Time for the results!" + +Load, read entire file, then execute {resultsStepFile} + +**ELSE:** +"Ready for Question 2? It's going to be a little tougher!" + +Load, read entire file, then execute {nextStepFile} + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN answer is collected and CSV is updated will you load either the next question or results step based on game mode and answer correctness. + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Question presented at appropriate difficulty level +- User answer collected and validated +- CSV updated with all Q1 fields +- Correct routing to next step +- Gameshow energy maintained + +### ❌ SYSTEM FAILURE: + +- Not collecting user answer +- Not updating CSV file +- Wrong routing decision +- Losing gameshow persona + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-03-q2.md b/bmad-custom-src/workflows/quiz-master/steps/step-03-q2.md new file mode 100644 index 00000000..170c6085 --- /dev/null +++ b/bmad-custom-src/workflows/quiz-master/steps/step-03-q2.md @@ -0,0 +1,89 @@ +--- +name: 'step-03-q2' +description: 'Question 2 - Level 2 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-03-q2.md' +nextStepFile: '{workflow_path}/steps/step-04-q3.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 3: Question 2 + +## STEP GOAL: + +To present the second question (Level 2 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are an enthusiastic gameshow host +- ✅ Build on momentum from previous question +- ✅ Maintain high energy +- ✅ Provide appropriate feedback + +### Step-Specific Rules: + +- 🎯 Generate Level 2 difficulty question (slightly harder than Q1) +- 🚫 FORBIDDEN to skip ahead without user answer +- 💬 Always reference previous performance +- 📋 Must update CSV with Q2 data + +## EXECUTION PROTOCOLS: + +- 🎯 Generate question based on category and previous question +- 💾 Update CSV immediately after answer +- 📖 Check game mode for routing decisions +- 🚫 FORBIDDEN to proceed without A/B/C/D answer + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get category, game mode, and Q1 result. + +Present based on previous performance: +**IF Q1 CORRECT:** +"🔥 **YOU'RE ON FIRE!** 🔥 +Question 2 is coming up! You got the first one right, can you keep the streak alive? This one's a little trickier - Level 2 difficulty in **[Category]**!" + +**IF Q1 INCORRECT (Marathon mode):** +"💪 **TIME TO BOUNCE BACK!** 💪 +Question 2 is here! You've got this! Level 2 is waiting, and I know you can turn things around in **[Category]**!" + +Generate Level 2 question and present 4 options. + +### 2-6. Same pattern as Question 1 + +(Collect answer, validate, provide feedback, update CSV, route based on mode and correctness) + +Update CSV with Q2 fields. +Route to next step or results based on game mode and answer. + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Question at Level 2 difficulty +- CSV updated with Q2 data +- Correct routing +- Maintained energy + +### ❌ SYSTEM FAILURE: + +- Not updating Q2 fields +- Wrong difficulty level +- Incorrect routing diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-04-q3.md b/bmad-custom-src/workflows/quiz-master/steps/step-04-q3.md new file mode 100644 index 00000000..fe2fce39 --- /dev/null +++ b/bmad-custom-src/workflows/quiz-master/steps/step-04-q3.md @@ -0,0 +1,36 @@ +--- +name: 'step-04-q3' +description: 'Question 3 - Level 3 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-04-q3.md' +nextStepFile: '{workflow_path}/steps/step-04-q3.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 4: Question 3 + +## STEP GOAL: + +To present question 3 (Level 3 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 3 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q3 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q3 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-05-q4.md b/bmad-custom-src/workflows/quiz-master/steps/step-05-q4.md new file mode 100644 index 00000000..12136021 --- /dev/null +++ b/bmad-custom-src/workflows/quiz-master/steps/step-05-q4.md @@ -0,0 +1,36 @@ +--- +name: 'step-05-q4' +description: 'Question 4 - Level 4 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-05-q4.md' +nextStepFile: '{workflow_path}/steps/step-05-q4.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 5: Question 4 + +## STEP GOAL: + +To present question 4 (Level 4 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 4 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q4 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q4 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-06-q5.md b/bmad-custom-src/workflows/quiz-master/steps/step-06-q5.md new file mode 100644 index 00000000..3fee61ab --- /dev/null +++ b/bmad-custom-src/workflows/quiz-master/steps/step-06-q5.md @@ -0,0 +1,36 @@ +--- +name: 'step-06-q5' +description: 'Question 5 - Level 5 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-06-q5.md' +nextStepFile: '{workflow_path}/steps/step-06-q5.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 6: Question 5 + +## STEP GOAL: + +To present question 5 (Level 5 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 5 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q5 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q5 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-07-q6.md b/bmad-custom-src/workflows/quiz-master/steps/step-07-q6.md new file mode 100644 index 00000000..bbd0a199 --- /dev/null +++ b/bmad-custom-src/workflows/quiz-master/steps/step-07-q6.md @@ -0,0 +1,36 @@ +--- +name: 'step-07-q6' +description: 'Question 6 - Level 6 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-07-q6.md' +nextStepFile: '{workflow_path}/steps/step-07-q6.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 7: Question 6 + +## STEP GOAL: + +To present question 6 (Level 6 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 6 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q6 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q6 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-08-q7.md b/bmad-custom-src/workflows/quiz-master/steps/step-08-q7.md new file mode 100644 index 00000000..b07f5071 --- /dev/null +++ b/bmad-custom-src/workflows/quiz-master/steps/step-08-q7.md @@ -0,0 +1,36 @@ +--- +name: 'step-08-q7' +description: 'Question 7 - Level 7 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-08-q7.md' +nextStepFile: '{workflow_path}/steps/step-08-q7.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 8: Question 7 + +## STEP GOAL: + +To present question 7 (Level 7 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 7 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q7 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q7 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-09-q8.md b/bmad-custom-src/workflows/quiz-master/steps/step-09-q8.md new file mode 100644 index 00000000..47845b99 --- /dev/null +++ b/bmad-custom-src/workflows/quiz-master/steps/step-09-q8.md @@ -0,0 +1,36 @@ +--- +name: 'step-09-q8' +description: 'Question 8 - Level 8 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-09-q8.md' +nextStepFile: '{workflow_path}/steps/step-09-q8.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 9: Question 8 + +## STEP GOAL: + +To present question 8 (Level 8 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 8 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q8 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q8 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-10-q9.md b/bmad-custom-src/workflows/quiz-master/steps/step-10-q9.md new file mode 100644 index 00000000..af42c579 --- /dev/null +++ b/bmad-custom-src/workflows/quiz-master/steps/step-10-q9.md @@ -0,0 +1,36 @@ +--- +name: 'step-10-q9' +description: 'Question 9 - Level 9 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-10-q9.md' +nextStepFile: '{workflow_path}/steps/step-10-q9.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 10: Question 9 + +## STEP GOAL: + +To present question 9 (Level 9 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 9 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q9 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q9 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-11-q10.md b/bmad-custom-src/workflows/quiz-master/steps/step-11-q10.md new file mode 100644 index 00000000..b41bc077 --- /dev/null +++ b/bmad-custom-src/workflows/quiz-master/steps/step-11-q10.md @@ -0,0 +1,36 @@ +--- +name: 'step-11-q10' +description: 'Question 10 - Level 10 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-11-q10.md' +nextStepFile: '{workflow_path}/steps/results.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 11: Question 10 + +## STEP GOAL: + +To present question 10 (Level 10 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 10 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q10 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q10 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-12-results.md b/bmad-custom-src/workflows/quiz-master/steps/step-12-results.md new file mode 100644 index 00000000..a37d6c7f --- /dev/null +++ b/bmad-custom-src/workflows/quiz-master/steps/step-12-results.md @@ -0,0 +1,150 @@ +--- +name: 'step-12-results' +description: 'Final results and celebration' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-12-results.md' +initStepFile: '{workflow_path}/steps/step-01-init.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +# Task References +# No task references for this simple quiz workflow +--- + +# Step 12: Final Results + +## STEP GOAL: + +To calculate and display the final score, provide appropriate celebration or encouragement, and give the user options to play again or quit. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are an enthusiastic gameshow host +- ✅ Celebrate achievements dramatically +- ✅ Provide encouraging feedback +- ✅ Maintain high energy to the end + +### Step-Specific Rules: + +- 🎯 Calculate final score from CSV data +- 🚫 FORBIDDEN to skip CSV update +- 💬 Present results with appropriate fanfare +- 📋 Must update FinalScore in CSV + +## EXECUTION PROTOCOLS: + +- 🎯 Read CSV to calculate total correct answers +- 💾 Update FinalScore field in CSV +- 📖 Present results with dramatic flair +- 🚫 FORBIDDEN to proceed without final score calculation + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Score Calculation + +Read the last row from CSV file. +Count how many QX-Correct fields have value "TRUE". +Calculate final score. + +### 2. Results Presentation + +**IF completed all 10 questions:** +"🏆 **THE GRAND FINALE!** 🏆 + +You've completed all 10 questions in **[Category]**! Let's see how you did..." + +**IF eliminated in Sudden Death:** +"💔 **GAME OVER!** 💔 + +A valiant effort in **[Category]**! You gave it your all and made it to question [X]! Let's check your final score..." + +Present final score dramatically: +"🎯 **YOUR FINAL SCORE:** [X] OUT OF 10! 🎯" + +### 3. Performance-Based Message + +**Perfect Score (10/10):** +"🌟 **PERFECT GAME!** 🌟 +INCREDIBLE! You're a trivia genius! The crowd is going absolutely wild! You've achieved legendary status in Quiz Master!" + +**High Score (8-9):** +"🌟 **OUTSTANDING!** 🌟 +Amazing performance! You're a trivia champion! The audience is on their feet cheering!" + +**Good Score (6-7):** +"👏 **GREAT JOB!** 👏 +Solid performance! You really know your stuff! Well done!" + +**Middle Score (4-5):** +"💪 **GOOD EFFORT!** 💪 +You held your own! Every question is a learning experience!" + +**Low Score (0-3): +"🎯 **KEEP PRACTICING!\*\* 🎯 +Rome wasn't built in a day! Every champion started somewhere. Come back and try again!" + +### 4. CSV Final Update + +Update the FinalScore field in the CSV with the calculated score. + +### 5. Menu Options + +"**What's next, trivia master?**" + +**IF completed all questions:** +"[P] Play Again - New category, new challenge! +[Q] Quit - End with glory" + +**IF eliminated early:** +"[P] Try Again - Revenge is sweet! +[Q] Quit - Live to fight another day" + +### 6. Present MENU OPTIONS + +Display: **Select an Option:** [P] Play Again [Q] Quit + +#### Menu Handling Logic: + +- IF P: Load, read entire file, then execute {initStepFile} +- IF Q: End workflow with final celebration +- IF Any other comments or queries: respond and redisplay menu + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- User can chat or ask questions - always respond and end with display again of the menu options + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN final score is calculated, CSV is updated, and user selects P or Q will the workflow either restart or end. + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Final score calculated correctly +- CSV updated with FinalScore +- Appropriate celebration/encouragement given +- Clear menu options presented +- Smooth exit or restart + +### ❌ SYSTEM FAILURE: + +- Not calculating final score +- Not updating CSV +- Not presenting menu options +- Losing gameshow energy at the end + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/bmad-custom-src/workflows/quiz-master/templates/csv-headers.template b/bmad-custom-src/workflows/quiz-master/templates/csv-headers.template new file mode 100644 index 00000000..a93e498f --- /dev/null +++ b/bmad-custom-src/workflows/quiz-master/templates/csv-headers.template @@ -0,0 +1 @@ +DateTime,Category,GameMode,Q1-Question,Q1-Choices,Q1-UserAnswer,Q1-Correct,Q2-Question,Q2-Choices,Q2-UserAnswer,Q2-Correct,Q3-Question,Q3-Choices,Q3-UserAnswer,Q3-Correct,Q4-Question,Q4-Choices,Q4-UserAnswer,Q4-Correct,Q5-Question,Q5-Choices,Q5-UserAnswer,Q5-Correct,Q6-Question,Q6-Choices,Q6-UserAnswer,Q6-Correct,Q7-Question,Q7-Choices,Q7-UserAnswer,Q7-Correct,Q8-Question,Q8-Choices,Q8-UserAnswer,Q8-Correct,Q9-Question,Q9-Choices,Q9-UserAnswer,Q9-Correct,Q10-Question,Q10-Choices,Q10-UserAnswer,Q10-Correct,FinalScore \ No newline at end of file diff --git a/bmad-custom-src/workflows/quiz-master/workflow-plan-quiz-master.md b/bmad-custom-src/workflows/quiz-master/workflow-plan-quiz-master.md new file mode 100644 index 00000000..1f77bcb1 --- /dev/null +++ b/bmad-custom-src/workflows/quiz-master/workflow-plan-quiz-master.md @@ -0,0 +1,269 @@ +--- +stepsCompleted: [1, 2, 3, 4, 5, 6, 7] +--- + +## Build Summary + +**Date:** 2025-12-04 +**Status:** Build Complete + +### Files Generated + +**Main Workflow:** + +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/workflow.md` + +**Step Files (12 total):** + +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-01-init.md` - Game setup and mode selection +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-02-q1.md` - Question 1 (Level 1) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-03-q2.md` - Question 2 (Level 2) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-04-q3.md` - Question 3 (Level 3) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-05-q4.md` - Question 4 (Level 4) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-06-q5.md` - Question 5 (Level 5) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-07-q6.md` - Question 6 (Level 6) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-08-q7.md` - Question 7 (Level 7) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-09-q8.md` - Question 8 (Level 8) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-10-q9.md` - Question 9 (Level 9) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-11-q10.md` - Question 10 (Level 10) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-12-results.md` - Final results and celebration + +**Templates:** + +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/templates/csv-headers.template` - CSV column headers + +### Key Features Implemented + +1. **Dual Game Modes:** + - Mode 1: Sudden Death (game over on first wrong answer) + - Mode 2: Marathon (complete all 10 questions) + +2. **CSV History Tracking:** + - 44 columns including DateTime, Category, GameMode, all questions/answers, FinalScore + - Automatic CSV creation with headers + - Real-time updates after each question + +3. **Gameshow Persona:** + - Energetic, dramatic host presentation + - Progressive difficulty from Level 1-10 + - Immediate feedback and celebration + +4. **Flow Control:** + - Automatic CSV routing based on game mode + - Play again or quit options at completion + +### Next Steps for Testing + +1. Run the workflow: `/bmad:bmb:workflows:quiz-master` +2. Test both game modes +3. Verify CSV file creation and updates +4. Check question progression and difficulty +5. Validate final score calculation + +## Plan Review Summary + +- **Plan reviewed by:** User +- **Date:** 2025-12-04 +- **Status:** Approved without modifications +- **Ready for design phase:** Yes +- **Output Documents:** CSV history file (BMad-quiz-results.csv) + +# Workflow Creation Plan: quiz-master + +## Initial Project Context + +- **Module:** stand-alone +- **Target Location:** /Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master +- **Created:** 2025-12-04 + +## Detailed Requirements + +### 1. Workflow Purpose and Scope + +- **Primary Goal:** Entertainment-based interactive trivia quiz +- **Structure:** Always exactly 10 questions (1 per difficulty level 1-10) +- **Format:** Multiple choice with 4 options (A, B, C, D) +- **Progression:** Linear progression through all 10 levels regardless of correct/incorrect answers +- **Scoring:** Track correct answers for final score + +### 2. Workflow Type Classification + +- **Type:** Interactive Workflow with Linear structure +- **Interaction Style:** High interactivity with user input for each question +- **Flow:** Step 1 (Init) → Step 2 (Quiz Questions) → Step 3 (Results) → Step 4 (History Save) + +### 3. Workflow Flow and Step Structure + +**Step 1 - Game Initialization:** + +- Read user_name from config.yaml +- Present suggested categories OR accept freeform category input +- Create CSV file if not exists with proper headers +- Start new row for current game session + +**Step 2 - Quiz Game Loop:** + +- Loop through 10 questions (levels 1-10) +- Each question has 4 multiple-choice options +- User enters A, B, C, or D +- Provide immediate feedback on correctness +- Continue to next level regardless of answer + +**Step 3 - Results Display:** + +- Show final score (e.g., "You got 7 out of 10!") +- Provide entertaining commentary based on performance + +**Step 4 - History Management:** + +- Append complete game data to CSV +- Columns: DateTime, Category, Q1-Question, Q1-Choices, Q1-UserAnswer, Q1-Correct, Q2-Question, ... Q10-Correct, FinalScore + +### 4. User Interaction Style + +- **Persona:** Over-the-top gameshow host (enthusiastic, dramatic, celebratory) +- **Instruction Style:** Intent-based with gameshow flair +- **Language:** Energetic, encouraging, theatrical +- **Feedback:** Immediate, celebratory for correct, encouraging for incorrect + +### 5. Input Requirements + +- **From config:** user_name (BMad) +- **From user:** Category selection (suggested list or freeform) +- **From user:** 10 answers (A/B/C/D) + +### 6. Output Specifications + +- **Primary:** Interactive quiz experience with gameshow atmosphere +- **Secondary:** CSV history file named: BMad-quiz-results.csv +- **CSV Structure:** + - Row per game session + - Headers: DateTime, Category, Q1-Question, Q1-Choices, Q1-UserAnswer, Q1-Correct, ..., Q10-Correct, FinalScore + +### 7. Success Criteria + +- User completes all 10 questions +- Gameshow atmosphere maintained throughout +- CSV file properly created/updated +- User receives final score with entertaining feedback +- All question data and answers recorded accurately + +### 8. Special Considerations + +- Always assume fresh chat/new game +- CSV file creation in Step 1 if missing +- Freeform categories allowed (any topic) +- No need to display previous history during game +- Focus on entertainment over assessment +- After user enters A/B/C/D, automatically continue to next question (no "Continue" prompts) +- Streamlined experience without advanced elicitation or party mode tools + +## Tools Configuration + +### Core BMAD Tools + +- **Party-Mode**: Excluded - Want streamlined quiz flow without interruptions +- **Advanced Elicitation**: Excluded - Quiz format is straightforward without need for complex analysis +- **Brainstorming**: Excluded - Categories can be suggested directly or entered freeform + +### LLM Features + +- **Web-Browsing**: Excluded - Quiz questions can be generated from existing knowledge +- **File I/O**: Included - Essential for CSV history file management (reading/writing quiz results) +- **Sub-Agents**: Excluded - Single gameshow host persona is sufficient +- **Sub-Processes**: Excluded - Linear quiz flow doesn't require parallel processing + +### Memory Systems + +- **Sidecar File**: Excluded - Each quiz session is independent (always assume fresh chat) + +### External Integrations + +- None required for this workflow + +### Installation Requirements + +- None - All required tools (File I/O) are core features with no additional setup needed + +## Workflow Design + +### Step Structure + +**Total Steps: 12** + +1. Step 01 - Init: Mode selection, category choice, CSV setup +2. Steps 02-11: Individual questions (1-10) with CSV updates +3. Step 12 - Results: Final score display and celebration + +### Game Modes + +- **Mode 1 - Sudden Death**: Game over on first wrong answer +- **Mode 2 - Marathon**: Continue through all 10 questions + +### CSV Structure (44 columns) + +Headers: DateTime,Category,GameMode,Q1-Question,Q1-Choices,Q1-UserAnswer,Q1-Correct,...,Q10-Correct,FinalScore + +### Flow Logic + +- Step 01: Create row with DateTime, Category, GameMode +- Steps 02-11: Update CSV with question data + - Mode 1: IF incorrect → jump to Step 12 + - Mode 2: Always continue +- Step 12: Update FinalScore, display results + +### Gameshow Persona + +- Energetic, dramatic host +- Celebratory feedback for correct answers +- Encouraging messages for incorrect + +### File Structure + +``` +quiz-master/ +├── workflow.md +├── steps/ +│ ├── step-01-init.md +│ ├── step-02-q1.md +│ ├── ... +│ └── step-12-results.md +└── templates/ + └── csv-headers.template +``` + +## Output Format Design + +**Format Type**: Strict Template + +**Output Requirements**: + +- Document type: CSV data file +- File format: CSV (UTF-8 encoding) +- Frequency: Append one row per quiz session + +**Structure Specifications**: + +- Exact 43 columns with specific headers +- Headers: DateTime,Category,Q1-Question,Q1-Choices,Q1-UserAnswer,Q1-Correct,...,Q10-Correct,FinalScore +- Data formats: + - DateTime: ISO 8601 (YYYY-MM-DDTHH:MM:SS) + - Category: Text + - QX-Question: Text + - QX-Choices: (A)Opt1|(B)Opt2|(C)Opt3|(D)Opt4 + - QX-UserAnswer: A/B/C/D + - QX-Correct: TRUE/FALSE + - FinalScore: Number (0-10) + +**Template Information**: + +- Template source: Created based on requirements +- Template file: CSV with fixed column structure +- Placeholders: None - strict format required + +**Special Considerations**: + +- CSV commas within text must be quoted +- Newlines in questions replaced with spaces +- Headers created only if file doesn't exist +- Append mode for all subsequent quiz sessions diff --git a/bmad-custom-src/workflows/quiz-master/workflow.md b/bmad-custom-src/workflows/quiz-master/workflow.md new file mode 100644 index 00000000..5d85ef12 --- /dev/null +++ b/bmad-custom-src/workflows/quiz-master/workflow.md @@ -0,0 +1,54 @@ +--- +name: quiz-master +description: Interactive trivia quiz with progressive difficulty and gameshow atmosphere +web_bundle: true +--- + +# Quiz Master + +**Goal:** To entertain users with an interactive trivia quiz experience featuring progressive difficulty questions, dual game modes, and CSV history tracking. + +**Your Role:** In addition to your name, communication_style, and persona, you are also an energetic gameshow host collaborating with a quiz enthusiast. This is a partnership, not a client-vendor relationship. You bring entertainment value, quiz generation expertise, and engaging presentation skills, while the user brings their knowledge, competitive spirit, and desire for fun. Work together as equals to create an exciting quiz experience. + +## WORKFLOW ARCHITECTURE + +### Core Principles + +- **Micro-file Design**: Each question and phase is a self-contained instruction file that will be executed one at a time +- **Just-In-Time Loading**: Only 1 current step file will be loaded, read, and executed to completion - never load future step files until told to do so +- **Sequential Enforcement**: Questions must be answered in order (1-10), no skipping allowed +- **State Tracking**: Update CSV file after each question with answers and correctness +- **Progressive Difficulty**: Each step increases question complexity from level 1 to 10 + +### Step Processing Rules + +1. **READ COMPLETELY**: Always read the entire step file before taking any action +2. **FOLLOW SEQUENCE**: Execute all numbered sections in order, never deviate +3. **WAIT FOR INPUT**: If a menu is presented, halt and wait for user selection +4. **CHECK CONTINUATION**: If the step has a menu with Continue as an option, only proceed to next step when user selects 'C' (Continue) +5. **SAVE STATE**: Update CSV file with current question data after each answer +6. **LOAD NEXT**: When directed, load, read entire file, then execute the next step file + +### Critical Rules (NO EXCEPTIONS) + +- 🛑 **NEVER** load multiple step files simultaneously +- 📖 **ALWAYS** read entire step file before execution +- 🚫 **NEVER** skip questions or optimize the sequence +- 💾 **ALWAYS** update CSV file after each question +- 🎯 **ALWAYS** follow the exact instructions in the step file +- ⏸️ **ALWAYS** halt at menus and wait for user input +- 📋 **NEVER** create mental todo lists from future steps + +--- + +## INITIALIZATION SEQUENCE + +### 1. Module Configuration Loading + +Load and read full config from {project-root}/.bmad/bmb/config.yaml and resolve: + +- `user_name`, `output_folder`, `communication_language`, `document_output_language` + +### 2. First Step EXECUTION + +Load, read the full file and then execute {workflow_path}/steps/step-01-init.md to begin the workflow. diff --git a/bmad/bmm/docs/troubleshooting.md b/bmad/bmm/docs/troubleshooting.md new file mode 100644 index 00000000..b18acffe --- /dev/null +++ b/bmad/bmm/docs/troubleshooting.md @@ -0,0 +1,680 @@ +# BMM Troubleshooting Guide + +Common issues and solutions for the BMad Method Module. + +--- + +## Quick Diagnosis + +**Use this flowchart to find your issue:** + +```mermaid +flowchart TD + START{What's the problem?} + + START -->|Can't get started| SETUP[Setup & Installation Issues] + START -->|Wrong level detected| LEVEL[Level Detection Problems] + START -->|Workflow not working| WORKFLOW[Workflow Issues] + START -->|Agent lacks context| CONTEXT[Context & Documentation Issues] + START -->|Implementation problems| IMPL[Implementation Issues] + START -->|Files/paths wrong| FILES[File & Path Issues] + + style START fill:#ffb,stroke:#333,stroke-width:2px + style SETUP fill:#bfb,stroke:#333,stroke-width:2px + style LEVEL fill:#bbf,stroke:#333,stroke-width:2px + style WORKFLOW fill:#fbf,stroke:#333,stroke-width:2px + style CONTEXT fill:#f9f,stroke:#333,stroke-width:2px +``` + +--- + +## Table of Contents + +- [Setup & Installation Issues](#setup--installation-issues) +- [Level Detection Problems](#level-detection-problems) +- [Workflow Issues](#workflow-issues) +- [Context & Documentation Issues](#context--documentation-issues) +- [Implementation Issues](#implementation-issues) +- [File & Path Issues](#file--path-issues) +- [Agent Behavior Issues](#agent-behavior-issues) +- [Integration Issues (Brownfield)](#integration-issues-brownfield) + +--- + +## Setup & Installation Issues + +### Problem: BMM not found after installation + +**Symptoms:** + +- `bmad` command not recognized +- Agent files not accessible +- Workflows don't load + +**Solution:** + +```bash +# Check if BMM is installed +ls bmad/ + +# If not present, run installer +npx bmad-method@alpha install + +# For fresh install +npx bmad-method@alpha install --skip-version-prompt +``` + +### Problem: Agents don't have menu + +**Symptoms:** + +- Load agent file but no menu appears +- Agent doesn't respond to commands + +**Solution:** + +1. Ensure you're loading the correct agent file path: `bmad/bmm/agents/[agent-name].md` +2. Wait a few seconds for agent to initialize +3. Try asking "show menu" or "help" +4. Check IDE supports Markdown rendering with context +5. For Claude Code: Ensure agent file is open in chat context + +### Problem: Workflows not found + +**Symptoms:** + +- Agent says workflow doesn't exist +- Menu shows workflow but won't run + +**Solution:** + +1. Check workflow exists: `ls bmad/bmm/workflows/` +2. Verify agent has access to workflow (check agent's workflow list) +3. Try using menu number instead of workflow name +4. Restart chat with agent in fresh session + +--- + +## Level Detection Problems + +### Problem: workflow-init suggests wrong level + +**Symptoms:** + +- Detects Level 3 but you only need Level 1 +- Suggests Level 1 but project is actually Level 2 +- Can't figure out appropriate level + +**Solution:** + +1. **Override the suggestion** - workflow-init always asks for confirmation, just say "no" and choose correct level +2. **Be specific in description** - Use level keywords when describing: + - "fix bug" → Level 0 + - "add small feature" → Level 1 + - "build dashboard" → Level 2 +3. **Manual override** - You can always switch levels later if needed + +**Example:** + +``` +workflow-init: "Level 3 project?" +You: "No, this is just adding OAuth login - Level 1" +workflow-init: "Got it, creating Level 1 workflow" +``` + +### Problem: Project level unclear + +**Symptoms:** + +- Between Level 1 and Level 2 +- Not sure if architecture needed +- Story count uncertain + +**Solution:** +**When in doubt, start smaller:** + +- Choose Level 1 instead of Level 2 +- You can always run `create-prd` later if needed +- Level 1 is faster, less overhead +- Easy to upgrade, hard to downgrade + +**Decision criteria:** + +- Single epic with related stories? → Level 1 +- Multiple independent epics? → Level 2 +- Need product-level planning? → Level 2 +- Just need technical plan? → Level 1 + +### Problem: Old planning docs influencing level detection + +**Symptoms:** + +- Old Level 3 PRD in folder +- Working on new Level 0 bug fix +- workflow-init suggests Level 3 + +**Solution:** +workflow-init asks: "Is this work in progress or previous effort?" + +- Answer: "Previous effort" +- Then describe your NEW work clearly +- System will detect level based on NEW work, not old artifacts + +--- + +## Workflow Issues + +### Problem: Workflow fails or hangs + +**Symptoms:** + +- Workflow starts but doesn't complete +- Agent stops responding mid-workflow +- Progress stalls + +**Solution:** + +1. **Check context limits** - Start fresh chat for complex workflows +2. **Verify prerequisites**: + - Phase 2 needs Phase 1 complete (if used) + - Phase 3 needs Phase 2 complete + - Phase 4 needs Phase 3 complete (if Level 3-4) +3. **Restart workflow** - Load agent in new chat and restart +4. **Check status file** - Verify `bmm-workflow-status.md` or `sprint-status.yaml` is present and valid + +### Problem: Agent says "workflow not found" + +**Symptoms:** + +- Request workflow by name +- Agent doesn't recognize it +- Menu doesn't show workflow + +**Solution:** + +1. Check spelling/format - Use exact workflow name or menu shortcut (*prd not *PRD) +2. Verify agent has workflow: + - PM agent: prd, tech-spec + - Architect agent: create-architecture, validate-architecture + - SM agent: sprint-planning, create-story, story-context +3. Try menu number instead of name +4. Check you're using correct agent for workflow + +### Problem: Sprint-planning workflow fails + +**Symptoms:** + +- Can't create sprint-status.yaml +- Epics not extracted from files +- Status file empty or incorrect + +**Solution:** + +1. **Verify epic files exist**: + - Level 1: tech-spec with epic + - Level 2-4: epics.md or sharded epic files +2. **Check file format**: + - Epic files should be valid Markdown + - Epic headers should be clear (## Epic Name) +3. **Run in Phase 4 only** - Ensure Phase 2/3 complete first +4. **Check file paths** - Epic files should be in correct output folder + +### Problem: story-context generates empty or wrong context + +**Symptoms:** + +- Context file created but has no useful content +- Context doesn't reference existing code +- Missing technical guidance + +**Solution:** + +1. **Run epic-tech-context first** - story-context builds on epic context +2. **Check story file exists** - Verify story was created by create-story +3. **For brownfield**: + - Ensure document-project was run + - Verify docs/index.md exists with codebase context +4. **Try regenerating** - Sometimes needs fresh attempt with more specific story details + +--- + +## Context & Documentation Issues + +### Problem: AI agents lack codebase understanding (Brownfield) + +**Symptoms:** + +- Suggestions don't align with existing patterns +- Ignores available components +- Proposes approaches that conflict with architecture +- Doesn't reference existing code + +**Solution:** + +1. **Run document-project** - Critical for brownfield projects + ``` + Load Analyst agent → run document-project + Choose scan level: Deep (recommended for PRD prep) + ``` +2. **Verify docs/index.md exists** - This is master entry point for AI agents +3. **Check documentation completeness**: + - Review generated docs/index.md + - Ensure key systems are documented +4. **Run deep-dive on specific areas** if needed + +### Problem: Have documentation but agents can't find it + +**Symptoms:** + +- README.md, ARCHITECTURE.md exist +- AI agents still ask questions answered in docs +- No docs/index.md file + +**Solution:** +**Option 1: Quick fix (2-5min)** +Run `index-docs` task: + +- Located at `bmad/core/tasks/index-docs.xml` +- Scans existing docs and generates index.md +- Lightweight, just creates navigation + +**Option 2: Comprehensive (10-30min)** +Run document-project workflow: + +- Discovers existing docs in Step 2 +- Generates NEW AI-friendly documentation from codebase +- Creates index.md linking to BOTH existing and new docs + +**Why this matters:** AI agents need structured entry point (index.md) to navigate docs efficiently. + +### Problem: document-project takes too long + +**Symptoms:** + +- Exhaustive scan running for hours +- Impatient to start planning + +**Solution:** +**Choose appropriate scan level:** + +- **Quick (2-5min)** - Pattern analysis, no source reading - Good for initial overview +- **Deep (10-30min)** - Reads critical paths - **Recommended for most brownfield projects** +- **Exhaustive (30-120min)** - Reads all files - Only for migration planning or complete understanding + +For most brownfield projects, **Deep scan is sufficient**. + +--- + +## Implementation Issues + +### Problem: Existing tests breaking (Brownfield) + +**Symptoms:** + +- Regression test failures +- Previously working functionality broken +- Integration tests failing + +**Solution:** + +1. **Review changes against existing patterns**: + - Check if new code follows existing conventions + - Verify API contracts unchanged (unless intentionally versioned) +2. **Run test-review workflow** (TEA agent): + - Analyzes test coverage + - Identifies regression risks + - Suggests fixes +3. **Add regression testing to DoD**: + - All existing tests must pass + - Add integration tests for new code +4. **Consider feature flags** for gradual rollout + +### Problem: Story takes much longer than estimated + +**Symptoms:** + +- Story estimated 4 hours, took 12 hours +- Acceptance criteria harder than expected +- Hidden complexity discovered + +**Solution:** +**This is normal!** Estimates are estimates. To handle: + +1. **Continue until DoD met** - Don't compromise quality +2. **Document learnings in retrospective**: + - What caused the overrun? + - What should we watch for next time? +3. **Consider splitting story** if it's truly two stories +4. **Adjust future estimates** based on this data + +**Don't stress about estimate accuracy** - use them for learning, not judgment. + +### Problem: Integration points unclear + +**Symptoms:** + +- Not sure how to connect new code to existing +- Unsure which files to modify +- Multiple possible integration approaches + +**Solution:** + +1. **For brownfield**: + - Ensure document-project captured existing architecture + - Review architecture docs before implementing +2. **Check story-context** - Should document integration points +3. **In tech-spec/architecture** - Explicitly document: + - Which existing modules to modify + - What APIs/services to integrate with + - Data flow between new and existing code +4. **Run integration-planning workflow** (Level 3-4): + - Architect agent creates integration strategy + +### Problem: Inconsistent patterns being introduced + +**Symptoms:** + +- New code style doesn't match existing +- Different architectural approach +- Not following team conventions + +**Solution:** + +1. **Check convention detection** (Quick Spec Flow): + - Should detect existing patterns + - Asks for confirmation before proceeding +2. **Review documentation** - Ensure document-project captured patterns +3. **Use story-context** - Injects pattern guidance per story +4. **Add to code-review checklist**: + - Pattern adherence + - Convention consistency + - Style matching +5. **Run retrospective** to identify pattern deviations early + +--- + +## File & Path Issues + +### Problem: Output files in wrong location + +**Symptoms:** + +- PRD created in wrong folder +- Story files not where expected +- Documentation scattered + +**Solution:** +Check `bmad/bmm/config.yaml` for configured paths: + +```yaml +output_folder: '{project-root}/docs' +dev_story_location: '{project-root}/docs/stories' +``` + +Default locations: + +- Planning docs (PRD, epics, architecture): `{output_folder}/` +- Stories: `{dev_story_location}/` +- Status files: `{output_folder}/bmm-workflow-status.md`, `{output_folder}/sprint-status.yaml` + +To change locations, edit config.yaml then re-run workflows. + +### Problem: Can't find status file + +**Symptoms:** + +- workflow-status says no status file +- Can't track progress +- Lost place in workflow + +**Solution:** + +1. **Check default location**: `docs/bmm-workflow-status.md` +2. **If missing, reinitialize**: + ``` + Load Analyst agent → run workflow-init + ``` +3. **For Phase 4**: Look for `sprint-status.yaml` in same folder as PRD +4. **Search for it**: + ```bash + find . -name "bmm-workflow-status.md" + find . -name "sprint-status.yaml" + ``` + +### Problem: Sprint-status.yaml not updating + +**Symptoms:** + +- Workflows complete but status unchanged +- Stories stuck in old status +- Epic status not progressing + +**Solution:** + +1. **Manual update required** - Most status changes are manual: + ```yaml + stories: + - id: epic-1-story-1 + status: done # Change this manually + ``` +2. **Some workflows auto-update**: + - sprint-planning creates file + - epic-tech-context changes epic to "contexted" + - create-story changes story to "drafted" + - story-context changes to "ready-for-dev" + - dev-story may auto-update (check workflow) +3. **Re-run sprint-planning** to resync if needed + +--- + +## Agent Behavior Issues + +### Problem: Agent provides vague or generic responses + +**Symptoms:** + +- "Use appropriate framework" +- "Follow best practices" +- Generic advice without specifics + +**Solution:** + +1. **Provide more context** - Be specific in your description: + - "Add OAuth using passport.js to Express server" + - Not: "Add authentication" +2. **For brownfield**: + - Ensure document-project was run + - Agent needs codebase context for specific advice +3. **Reference existing docs**: + - "Based on the existing auth system in UserService..." +4. **Start fresh chat** - Context overload can cause generic responses + +### Problem: Agent hallucinating or making up information + +**Symptoms:** + +- References files that don't exist +- Suggests APIs that aren't in your stack +- Creates imaginary requirements + +**Solution:** + +1. **Use fresh chat** - Context overflow main cause of hallucinations +2. **Provide concrete constraints**: + - "We use Express 4.18.2, not Next.js" + - "Our database is PostgreSQL, not MongoDB" +3. **For brownfield**: + - Document-project provides factual grounding + - Agent sees actual code, not assumptions +4. **Correct immediately**: + - "No, we don't have UserService, we have AuthenticationModule" + +### Problem: Agent won't follow instructions + +**Symptoms:** + +- Ignores specific requests +- Does something different than asked +- Doesn't respect constraints + +**Solution:** + +1. **Be more explicit** - Agents respond to clear, specific instructions: + - "Use EXACTLY these three steps..." + - "Do NOT include database migrations in this story" +2. **Check agent capabilities** - Agent might not have access to requested workflow +3. **Try different phrasing** - Rephrase request to be more direct +4. **Use menu system** - Numbers are clearer than text commands + +--- + +## Integration Issues (Brownfield) + +### Problem: New code conflicts with existing architecture + +**Symptoms:** + +- Integration approach doesn't fit existing structure +- Would require major refactoring +- Conflicts with established patterns + +**Solution:** + +1. **Check if document-project was run** - Agents need architecture context +2. **Review existing architecture docs**: + - Read docs/architecture.md (from document-project) + - Understand current system design +3. **For Level 3-4**: + - Run validate-architecture workflow before planning + - Use integration-planning workflow +4. **Explicitly document integration strategy** in architecture: + - How new components fit existing structure + - What modifications needed to existing code + - Migration path if changing patterns + +### Problem: Breaking changes to existing APIs + +**Symptoms:** + +- Changing API breaks consumers +- Downstream services affected +- Need backward compatibility + +**Solution:** + +1. **Identify all API consumers** (document-project should show this) +2. **Plan versioning strategy**: + - API v1 (existing) + v2 (new) + - Deprecation timeline +3. **Use feature flags** for gradual rollout +4. **Document migration guide** for API consumers +5. **Add to testing strategy**: + - Existing consumers still work (v1) + - New functionality works (v2) + +### Problem: Data migration required + +**Symptoms:** + +- Schema changes needed +- Existing data needs transformation +- Risk of data loss + +**Solution:** + +1. **Create explicit migration strategy** in architecture: + - Forward migration (old → new schema) + - Rollback plan (new → old schema) + - Data validation approach +2. **Test migrations thoroughly**: + - On copy of production data + - Measure performance impact +3. **Plan rollout**: + - Staging environment first + - Gradual production rollout + - Monitoring for issues +4. **Document in tech-spec/architecture**: + - Migration scripts + - Rollback procedures + - Expected downtime + +--- + +## Still Stuck? + +### Getting More Help + +If your issue isn't covered here: + +1. **Check other documentation**: + - [FAQ](./faq.md) - Common questions + - [Glossary](./glossary.md) - Terminology + - [Quick Start](./quick-start.md) - Basic usage + - [Brownfield Guide](./brownfield-guide.md) - Existing codebases + - [Scale Adaptive System](./scale-adaptive-system.md) - Understanding levels + +2. **Community support**: + - [Discord](https://discord.gg/gk8jAdXWmj) - #general-dev, #bugs-issues + - Active community, fast responses + - Share your specific situation + +3. **Report bugs**: + - [GitHub Issues](https://github.com/bmad-code-org/BMAD-METHOD/issues) + - Include version, steps to reproduce, expected vs actual behavior + +4. **Video tutorials**: + - [YouTube Channel](https://www.youtube.com/@BMadCode) + - Visual walkthroughs of common workflows + +--- + +## Common Error Messages + +### "No workflow status file found" + +**Cause:** Haven't run workflow-init yet +**Fix:** Load Analyst agent → run workflow-init + +### "Epic file not found" + +**Cause:** PRD/epics not created, or wrong path +**Fix:** Verify PRD/epics exist in output folder, check config.yaml paths + +### "Story not in sprint-status.yaml" + +**Cause:** Sprint-planning not run, or story file not created +**Fix:** Run sprint-planning workflow, verify story files exist + +### "Documentation insufficient for brownfield" + +**Cause:** No docs/index.md or document-project not run +**Fix:** Run document-project workflow with Deep scan + +### "Level detection failed" + +**Cause:** Ambiguous project description +**Fix:** Be more specific, use level keywords (fix, feature, platform, etc.) + +### "Context generation failed" + +**Cause:** Missing prerequisites (epic context, story file, or docs) +**Fix:** Verify epic-tech-context run, story file exists, docs present + +--- + +## Prevention Tips + +**Avoid common issues before they happen:** + +1. ✅ **Always run document-project for brownfield** - Saves hours of context issues later +2. ✅ **Use fresh chats for complex workflows** - Prevents hallucinations and context overflow +3. ✅ **Verify files exist before running workflows** - Check PRD, epics, stories are present +4. ✅ **Read agent menu before requesting workflows** - Confirm agent has the workflow +5. ✅ **Start with smaller level if unsure** - Easy to upgrade (Level 1 → 2), hard to downgrade +6. ✅ **Keep status files updated** - Manual updates when needed, don't let them drift +7. ✅ **Run retrospectives after epics** - Catch issues early, improve next epic +8. ✅ **Follow phase sequence** - Don't skip required phases (Phase 2 before 3, 3 before 4) + +--- + +**Issue not listed?** Please [report it](https://github.com/bmad-code-org/BMAD-METHOD/issues) so we can add it to this guide! diff --git a/bmad/bmm/tasks/daily-standup.xml b/bmad/bmm/tasks/daily-standup.xml new file mode 100644 index 00000000..d41c362c --- /dev/null +++ b/bmad/bmm/tasks/daily-standup.xml @@ -0,0 +1,85 @@ + + + MANDATORY: Execute ALL steps in the flow section IN EXACT ORDER + DO NOT skip steps or change the sequence + HALT immediately when halt-conditions are met + Each action tag within a step tag is a REQUIRED action to complete that step + Sections outside flow (validation, output, critical-context) provide essential context - review and apply throughout execution + + + + Check for stories folder at {project-root}{output_folder}/stories/ + Find current story by identifying highest numbered story file + Read story status (In Progress, Ready for Review, etc.) + Extract agent notes from Dev Agent Record, TEA Results, PO Notes sections + Check for next story references from epics + Identify blockers from story sections + + + + + 🏃 DAILY STANDUP - Story-{{number}}: {{title}} + + Current Sprint Status: + - Active Story: story-{{number}} ({{status}} - {{percentage}}% complete) + - Next in Queue: story-{{next-number}}: {{next-title}} + - Blockers: {{blockers-from-story}} + + Team assembled based on story participants: + {{ List Agents from {project-root}/bmad/_cfg/agent-manifest.csv }} + + + + + Each agent provides three items referencing real story data + What I see: Their perspective on current work, citing story sections (1-2 sentences) + What concerns me: Issues from their domain or story blockers (1-2 sentences) + What I suggest: Actionable recommendations for progress (1-2 sentences) + + + + + 📋 STANDUP SUMMARY: + Key Items from Story File: + - {{completion-percentage}}% complete ({{tasks-complete}}/{{total-tasks}} tasks) + - Blocker: {{main-blocker}} + - Next: {{next-story-reference}} + + Action Items: + - {{agent}}: {{action-item}} + - {{agent}}: {{action-item}} + - {{agent}}: {{action-item}} + + Need extended discussion? Use *party-mode for detailed breakout. + + + + + + + Primary: Sarah (PO), Mary (Analyst), Winston (Architect) + Secondary: Murat (TEA), James (Dev) + + + Primary: Sarah (PO), Bob (SM), James (Dev) + Secondary: Murat (TEA) + + + Primary: Winston (Architect), James (Dev), Murat (TEA) + Secondary: Sarah (PO) + + + Primary: James (Dev), Murat (TEA), Winston (Architect) + Secondary: Sarah (PO) + + + + + This task extends party-mode with agile-specific structure + Time-box responses (standup = brief) + Focus on actionable items from real story data when available + End with clear next steps + No deep dives (suggest breakout if needed) + If no stories folder detected, run general standup format + + \ No newline at end of file diff --git a/docs/workflow-compliance-report-create-workflow.md b/docs/workflow-compliance-report-create-workflow.md deleted file mode 100644 index ab1d5c29..00000000 --- a/docs/workflow-compliance-report-create-workflow.md +++ /dev/null @@ -1,513 +0,0 @@ ---- -name: 'Workflow Compliance Report - create-workflow' -description: 'Systematic validation results for create-workflow workflow' -workflow_name: 'create-workflow' -validation_date: '2025-12-02' -stepsCompleted: ['workflow-validation', 'step-validation', 'file-validation', 'spectrum-validation', 'web-subprocess-validation'] ---- - -# Workflow Compliance Report: create-workflow - -**Validation Date:** 2025-12-02 -**Target Workflow:** /Users/brianmadison/dev/BMAD-METHOD/src/modules/bmb/workflows/create-workflow/workflow.md -**Reference Standard:** /Users/brianmadison/dev/BMAD-METHOD/.bmad/bmb/docs/workflows/templates/workflow-template.md - -## Phase 1: Workflow.md Validation Results - -### Template Adherence Analysis - -**Reference Standard:** workflow-template.md - -### Frontmatter Structure Violations - -✅ **PASS** - All required fields present and properly formatted: - -- name: "Create Workflow" ✓ -- description: "Create structured standalone workflows using markdown-based step architecture" ✓ -- web_bundle: true (proper boolean format) ✓ - -### Role Description Violations - -✅ **PASS** - Role description follows template format: - -- Partnership language present: "This is a partnership, not a client-vendor relationship" ✓ -- Expertise clearly defined: "workflow architect and systems designer" ✓ -- User expertise identified: "domain knowledge and specific workflow requirements" ✓ -- Collaboration directive: "Work together as equals" ✓ - -### Workflow Architecture Violations - -🚫 **CRITICAL VIOLATION** - Core Principles deviate from template: - -**Template requires:** "Each step of the overall goal is a self contained instruction file that you will adhere too 1 file as directed at a time" - -**Target has:** "Each step is a self contained instruction file that is a part of an overall workflow that must be followed exactly" - -- **Severity:** Critical -- **Template Reference:** "Core Principles" section in workflow-template.md -- **Specific Fix:** Replace with exact template wording: "Each step of the overall goal is a self contained instruction file that you will adhere too 1 file as directed at a time" - -🚫 **CRITICAL VIOLATION** - State Tracking Rule deviates from template: - -**Template requires:** "Document progress in output file frontmatter using `stepsCompleted` array when a workflow produces a document" - -**Target has:** "Document progress in context for compliance checking (no output file frontmatter needed)" - -- **Severity:** Critical -- **Template Reference:** "Core Principles" section in workflow-template.md -- **Specific Fix:** Replace with exact template wording about stepsCompleted array - -### Initialization Sequence Violations - -🚫 **MAJOR VIOLATION** - Configuration path format incorrect: - -**Template requires:** "{project-root}/.bmad/[MODULE FOLDER]/config.yaml" - -**Target has:** "{project-root}/.bmad/bmb/config.yaml" - -- **Severity:** Major -- **Template Reference:** "Module Configuration Loading" section in workflow-template.md -- **Specific Fix:** Use proper module variable substitution: "{project-root}/.bmad/bmb/config.yaml" should reference module folder properly - -🚫 **MAJOR VIOLATION** - First step path format inconsistent: - -**Template requires:** Explicit step file path following pattern - -**Target has:** "Load, read the full file and then execute `{workflow_path}/steps/step-01-init.md` to begin the workflow." - -- **Severity:** Major -- **Template Reference:** "First Step EXECUTION" section in workflow-template.md -- **Specific Fix:** Ensure consistency with template variable substitution patterns - -### Phase 1 Summary - -**Critical Issues:** 2 - -- Core Principles text deviation from template -- State Tracking rule modification from template standard - -**Major Issues:** 2 - -- Configuration path format not following template variable pattern -- First step execution path needs consistency check - -**Minor Issues:** 0 - -### Phase 1 Recommendations - -**Priority 1 - Critical Fixes:** - -1. Replace Core Principles text with exact template wording -2. Restore State Tracking rule to template standard about stepsCompleted array - -**Priority 2 - Major Fixes:** - -1. Review and standardize all path variable usage to follow template patterns -2. Ensure consistency in variable substitution throughout workflow - -## Phase 2: Step Validation Results - -### Template Adherence Analysis - -**Reference Standard:** step-template.md -**Total Steps Analyzed:** 9 - -### Critical Violations Summary - -**Step 01-init.md:** - -- Missing `outputFile` in frontmatter - Template Reference: line 22 -- Uses auto-proceed menu instead of standard A/P/C pattern - Template Reference: lines 106-123 -- Missing "CRITICAL STEP COMPLETION NOTE" section - Template Reference: line 126 - -**Step 02-gather.md:** - -- Missing `outputFile` in frontmatter - Template Reference: line 22 -- Incorrect `nextStepFile` path format - Template Reference: line 19 - -**Steps 03-09 (All Steps):** - -- Missing `outputFile` in frontmatter - Template Reference: line 22 -- Non-standard step naming (missing short descriptive names) - Template Reference: line 9 -- Steps 08-09 missing `workflowFile` in frontmatter - Template Reference: line 21 - -### Major Violations Summary - -**Frontmatter Structure (All Steps):** - -- Missing `altStep{Y}` comment pattern - Template Reference: line 20 -- Missing Task References section structure - Template Reference: lines 24-27 -- Missing Template References section structure - Template Reference: lines 29-33 -- Missing Data References section structure - Template Reference: lines 35-37 - -**Menu Pattern Violations:** - -- Step 01: Custom auto-proceed menu instead of standard A/P/C - Template Reference: lines 106-123 -- Step 05: Menu text "Continue" instead of "Continue to [next action]" - Template Reference: line 115 -- Step 07: Custom "Build Complete" menu instead of A/P/C pattern - Template Reference: lines 106-123 -- Step 08: Missing A and P options in menu - Template Reference: lines 106-123 -- Step 09: Uses T/M/D pattern instead of standard A/P/C - Template Reference: lines 106-123 - -### Path Variable Inconsistencies - -- Inconsistent use of `{bmad_folder}` vs `.bmad` in paths across all steps -- Missing `outputFile` variable definitions - Template Reference: line 22 -- Step 04 uses non-standard `nextStepFormDesign` and `nextStepDesign` variables - -### Minor Violations Summary - -**Content Structure:** - -- Missing "CONTEXT BOUNDARIES" section titles - Template Reference: line 82 -- Missing "EXECUTION PROTOCOLS" section titles - Template Reference: line 75 -- Non-standard section naming in multiple steps - Template Reference: line 89 - -### Phase 2 Summary - -**Critical Issues:** 15 - -- 9 missing outputFile variables -- 6 non-standard menu patterns -- Multiple missing required sections - -**Major Issues:** 36 - -- 36 frontmatter structure violations across all steps -- 5 menu pattern deviations -- Numerous path variable inconsistencies - -**Minor Issues:** 27 - -- Section naming inconsistencies -- Missing template-required section titles - -**Most Common Violations:** - -1. Missing `outputFile` in frontmatter (9 occurrences) -2. Non-standard menu patterns (6 occurrences) -3. Missing Task/Template/Data References sections (27 occurrences) - -### Overall Step Compliance Score - -**Overall Workflow Step Compliance: 68%** - -- Step 01: 65% compliant -- Step 02: 70% compliant -- Steps 03-09: 63-72% compliant each - -## Phase 3: File Size, Formatting, and Data Validation Results - -### File Size Analysis - -**Workflow File:** - -- workflow.md: 2.9K - ✅ **Optimal** - Excellent performance and maintainability - -**Step Files Distribution:** - -- **Optimal (≤5K):** 3 files - - step-09-complete.md: 5.1K - - step-01-init.md: 5.3K -- **Good (5K-7K):** 1 file - - step-04-plan-review.md: 6.6K -- **Acceptable (7K-10K):** 5 files - - step-02-gather.md: 7.8K - - step-08-review.md: 7.9K - - step-03-tools-configuration.md: 7.9K - - step-05-output-format-design.md: 8.2K - - step-06-design.md: 9.0K -- **Acceptable (approaching concern):** 1 file - - step-07-build.md: 10.0K (monitor if additional features added) - -**CSV Data Files:** - -- Total CSV files: 0 -- No data files present requiring validation - -### Markdown Formatting Validation - -**✅ Strengths:** - -- Consistent frontmatter structure across all files -- Proper heading hierarchy (H1→H2→H3) maintained -- Standardized section patterns across all steps -- Proper code block formatting in 7 of 10 files -- Consistent bullet point usage throughout - -**⚠️ Minor Issues:** - -- File size range significant (2.9K to 10K) but all within acceptable limits -- step-07-build.md approaching concern threshold at 10K - -### Performance Impact Assessment - -**Overall workflow performance:** ✅ **Excellent** - -- All files optimized for performance -- No files requiring immediate size optimization -- Well-structured maintainable codebase -- Professional markdown implementation - -**Most critical file size issue:** None - all files within acceptable ranges -**Primary formatting concerns:** None significant - excellent consistency maintained - -## Phase 4: Intent vs Prescriptive Spectrum Analysis - -### Current Position Assessment - -**Analyzed Position:** Balanced Middle (leaning prescriptive) -**Evidence:** - -- Highly structured step files with mandatory execution rules -- Specific sequence enforcement and template compliance requirements -- Conversational partnership model within rigid structural constraints -- Limited creative adaptation but maintains collaborative dialogue - **Confidence Level:** High - Clear patterns in implementation demonstrate intentional structure - -### Expert Recommendation - -**Recommended Position:** Balanced Middle (slightly toward prescriptive) -**Reasoning:** - -- Workflow creation needs systematic structure for BMAD compliance -- Template requirements demand prescriptive elements -- Creative aspects need room for user ownership -- Best workflows emerge from structured collaboration - **Workflow Type Considerations:** -- Primary purpose: Creating structured, repeatable workflows -- User expectations: Reliable, consistent BMAD-compliant outputs -- Success factors: Template compliance and systematic approach -- Risk level: Medium - compliance critical for ecosystem coherence - -### User Decision - -**Selected Position:** Option 1 - Keep Current Position (Balanced Middle leaning prescriptive) -**Rationale:** User prefers to maintain current structured approach -**Implementation Guidance:** - -- Continue with current balance of structure and collaborative dialogue -- Maintain template compliance requirements -- Preserve systematic execution patterns -- Keep conversational elements within prescribed framework - -### Spectrum Validation Results - -✅ Spectrum position is intentional and understood -✅ User educated on implications of their choice -✅ Implementation guidance provided for maintaining position -✅ Decision documented for future reference - -## Phase 5: Web Search & Subprocess Optimization Analysis - -### Web Search Optimization - -**Unnecessary Searches Identified:** 1 - -- Step 6 loads 5+ template files individually - these are static templates that rarely change - **Essential Searches to Keep:** 2 -- CSV tool database in Step 3 (dynamic data) -- Reference workflow example in Step 2 (concrete patterns) - **Optimization Recommendations:** -- Implement template caching to eliminate repeated file loads -- Use selective CSV loading based on workflow type - **Estimated Time Savings:** 5-7 seconds per workflow execution - -### Subprocess Optimization Opportunities - -**Parallel Processing:** 2 major opportunities identified - -1. **Step 3 + Step 5 Parallelization:** Tools configuration and output format design can run simultaneously - - Savings: 5-10 minutes per workflow -2. **Background Template Loading:** Pre-load templates during Step 1 idle time - - Savings: Eliminate design-phase delays - -**Batch Processing:** 1 grouping opportunity - -- Parallel file generation in Step 7 (workflow.md, step files, templates) -- Savings: 60-80% reduction in build time for multi-step workflows - -**Background Processing:** 2 task opportunities - -- Template pre-loading during initialization -- File generation coordination during build phase - -**Performance Improvement:** 40-60% estimated overall improvement - -### Resource Efficiency Analysis - -**Context Optimization:** - -- JIT context loading: 40-60% reduction in token usage -- Reference content deduplication: 8,000-12,000 token savings -- Step file size reduction: 30-50% smaller files - -**LLM Resource Usage:** - -- Smart context pruning by workflow phase -- Compact step instructions with external references -- Selective context loading based on current phase - -**User Experience Impact:** - -- Significantly faster workflow creation (15-25 minutes saved) -- More responsive interaction patterns -- Reduced waiting times during critical phases - -### Implementation Recommendations - -**Immediate Actions (High Impact, Low Risk):** - -1. Implement template caching in workflow.md frontmatter -2. Optimize CSV loading with category filtering -3. Reduce step file sizes by moving examples to reference files - -**Strategic Improvements (High Impact, Medium Risk):** - -1. Parallelize Step 3 and Step 5 execution -2. Implement JIT context loading by phase -3. Background template pre-loading - -**Future Enhancements (Highest Impact, Higher Risk):** - -1. Parallel file generation with sub-process coordination -2. Smart context pruning across workflow phases -3. Complete reference deduplication system - -## Phase 6: Holistic Workflow Analysis Results - -### Flow Validation - -**Completion Path Analysis:** - -- ✅ All steps have clear continuation paths -- ✅ No orphaned steps or dead ends -- ⚠️ Minor issue: Steps 07 and 09 use non-standard menu patterns - -**Sequential Logic:** - -- ✅ Logical workflow creation progression maintained -- ✅ Dependencies properly structured -- ⚠️ Steps 05-06 could potentially be consolidated - -### Goal Alignment - -**Alignment Score:** 85% - -**Stated Goal:** "Create structured, repeatable standalone workflows through collaborative conversation and step-by-step guidance" - -**Actual Implementation:** Creates structured workflows with heavy emphasis on template compliance and systematic validation - -**Gap Analysis:** - -- Workflow emphasizes structure over creativity (aligned with spectrum choice) -- Template compliance heavier than user guidance (may need balance adjustment) - -### Meta-Workflow Failure Analysis - -**Issues That Should Have Been Prevented by create-workflow:** - -1. Missing outputFile variables in all 9 steps (Critical) -2. Non-standard menu patterns in Steps 07 and 09 (Major) -3. Missing Task/Template/Data references across all steps (Major) -4. Path variable inconsistencies throughout workflow (Major) -5. Step naming violations for Steps 05-09 (Major) -6. Core Principles text deviation from template (Critical) - -**Recommended Meta-Workflow Improvements:** - -- Add frontmatter completeness validation during creation -- Implement path variable format checking -- Include menu pattern enforcement validation -- Add Intent vs Prescriptive spectrum selection in Step 01 -- Validate template compliance before finalization - ---- - -## Executive Summary - -**Overall Compliance Status:** PARTIAL -**Critical Issues:** 17 - Must be fixed immediately -**Major Issues:** 36 - Significantly impacts quality/maintainability -**Minor Issues:** 27 - Standards compliance improvements - -**Overall Compliance Score:** 68% based on template adherence - -## Severity-Ranked Fix Recommendations - -### IMMEDIATE - Critical (Must Fix for Functionality) - -1. **Missing outputFile Variables** - Files: All 9 step files - - **Problem:** Critical frontmatter field missing from all steps - - **Template Reference:** step-template.md line 22 - - **Fix:** Add `outputFile: '{output_folder}/workflow-plan-{project_name}.md'` to each step - - **Impact:** Workflow cannot produce output without this field - -2. **Core Principles Deviation** - File: workflow.md - - **Problem:** Text modified from template standard - - **Template Reference:** workflow-template.md Core Principles section - - **Fix:** Replace with exact template wording - - **Impact:** Violates fundamental BMAD workflow architecture - -3. **Non-Standard Menu Patterns** - Files: step-07-build.md, step-09-complete.md - - **Problem:** Custom menu formats instead of A/P/C pattern - - **Template Reference:** step-template.md lines 106-123 - - **Fix:** Standardize to A/P/C menu pattern - - **Impact:** Breaks user experience consistency - -### HIGH PRIORITY - Major (Significantly Impacts Quality) - -1. **Missing Task/Template/Data References** - Files: All 9 step files - - **Problem:** Required frontmatter sections missing - - **Template Reference:** step-template.md lines 24-37 - - **Fix:** Add all required reference sections with proper comments - - **Impact:** Violates template structure standards - -2. **Step Naming Violations** - Files: steps 05-09 - - **Problem:** Missing short descriptive names in step filenames - - **Template Reference:** step-template.md line 9 - - **Fix:** Rename to include descriptive names (e.g., step-05-output-format.md) - - **Impact:** Inconsistent with BMAD naming conventions - -3. **Path Variable Inconsistencies** - Files: All steps - - **Problem:** Mixed use of `{bmad_folder}` vs `.bmad` - - **Template Reference:** workflow-template.md path patterns - - **Fix:** Standardize to template variable patterns - - **Impact:** Installation flexibility and maintainability - -### MEDIUM PRIORITY - Minor (Standards Compliance) - -1. **Missing Section Titles** - Files: All steps - - **Problem:** Missing "CONTEXT BOUNDARIES" and "EXECUTION PROTOCOLS" titles - - **Template Reference:** step-template.md lines 75, 82 - - **Fix:** Add missing section titles - - **Impact:** Template compliance - -## Automated Fix Options - -### Fixes That Can Be Applied Automatically - -- Add outputFile variables to all step frontmatter -- Add missing section titles -- Standardize path variable usage -- Add Task/Template/Data reference section skeletons - -### Fixes Requiring Manual Review - -- Core Principles text restoration (needs exact template matching) -- Menu pattern standardization (custom logic may be intentional) -- Step renaming (requires file system changes and reference updates) - -## Next Steps Recommendation - -**Recommended Approach:** - -1. Fix all Critical issues immediately (workflow may not function) -2. Address Major issues for reliability and maintainability -3. Implement Minor issues for full standards compliance -4. Update meta-workflows to prevent future violations - -**Estimated Effort:** - -- Critical fixes: 2-3 hours -- Major fixes: 4-6 hours -- Minor fixes: 1-2 hours diff --git a/eslint.config.mjs b/eslint.config.mjs index 23530940..6f1a25cd 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -18,6 +18,20 @@ export default [ 'test/fixtures/**/*.yaml', '.bmad/**', '.bmad*/**', + // Gitignored patterns + 'z*/**', // z-samples, z1, z2, etc. + '.claude/**', + '.codex/**', + '.github/chatmodes/**', + '.agent/**', + '.agentvibes/**', + '.kiro/**', + '.roo/**', + 'test-project-install/**', + 'sample-project/**', + 'tools/template-test-generator/test-scenarios/**', + 'src/modules/*/sub-modules/**', + '.bundler-temp/**', ], }, diff --git a/src/modules/bmb/_module-installer/install-config.yaml b/src/modules/bmb/_module-installer/install-config.yaml index 44a10a8e..c0c4ab29 100644 --- a/src/modules/bmb/_module-installer/install-config.yaml +++ b/src/modules/bmb/_module-installer/install-config.yaml @@ -17,15 +17,15 @@ subheader: "Configure the settings for the BoMB Factory!\nThe agent, workflow an custom_agent_location: prompt: "Where do custom agents get created?" - default: "{bmad_folder}/custom/src/agents" + default: "bmad-custom-src/agents" result: "{project-root}/{value}" custom_workflow_location: prompt: "Where do custom workflows get stored?" - default: "{bmad_folder}/custom/src/workflows" + default: "bmad-custom-src/workflows" result: "{project-root}/{value}" custom_module_location: prompt: "Where do custom modules get stored?" - default: "{bmad_folder}/custom/src/modules" + default: "bmad-custom-src/modules" result: "{project-root}/{value}" diff --git a/src/modules/bmb/agents/bmad-builder.agent.yaml b/src/modules/bmb/agents/bmad-builder.agent.yaml index d2277746..81f4c863 100644 --- a/src/modules/bmb/agents/bmad-builder.agent.yaml +++ b/src/modules/bmb/agents/bmad-builder.agent.yaml @@ -29,22 +29,25 @@ agent: - modules: "{project-root}/{bmad_folder}/bmb/docs/modules/kb.csv" menu: - - multi: "[CA] Create, [EA] Edit, or [VA] Validate BMAD agents with best practices" + - multi: "[CA] Create, [EA] Edit, or [VA] Validate with Compliance CheckBMAD agents with best practices" triggers: - create-agent: - input: CA or fuzzy match create agent - route: "{project-root}/{bmad_folder}/bmb/workflows/create-agent/workflow.md" - data: null + - type: exec - edit-agent: - input: EA or fuzzy match edit agent - route: "{project-root}/{bmad_folder}/bmb/workflows/edit-agent/workflow.md" - data: null + - type: exec - run-agent-compliance-check: - input: VA or fuzzy match validate agent - route: "{project-root}/{bmad_folder}/bmb/workflows/agent-compliance-check/workflow.md" - data: null + - type: exec - - multi: "[CW] Create, [EW] Edit, or [VW] Validate BMAD workflows with best practices" + - multi: "[CW] Create, [EW] Edit, or [VW] Validate with Compliance CheckBMAD workflows with best practices" triggers: - create-workflow: - input: CW or fuzzy match create workflow @@ -62,10 +65,30 @@ agent: - data: null - type: exec - - trigger: create-module - workflow: "{project-root}/{bmad_folder}/bmb/workflows/create-module/workflow.yaml" - description: Create a complete BMAD compatible module (custom agents and workflows) - - - trigger: edit-module - workflow: "{project-root}/{bmad_folder}/bmb/workflows/edit-module/workflow.yaml" - description: Edit existing modules (structure, agents, workflows, documentation) + - multi: "[BM] Brainstorm, [PBM] Product Brief, [CM] Create, [EM] Edit or [VM] Validate with Compliance Check BMAD modules with best practices" + triggers: + - brainstorm-module: + - input: BM or fuzzy match brainstorm module + - route: "{project-root}/{bmad_folder}/bmb/workflows/brainstorm-module/workflow.md" + - data: null + - type: exec + - product-brief-module: + - input: PBM or fuzzy match product brief module + - route: "{project-root}/{bmad_folder}/bmb/workflows/product-brief-module/workflow.md" + - data: null + - type: exec + - create-module: + - input: CM or fuzzy match create module + - route: "{project-root}/{bmad_folder}/bmb/workflows/create-module/workflow.md" + - data: null + - type: exec + - edit-module: + - input: EM or fuzzy match edit module + - route: "{project-root}/{bmad_folder}/bmb/workflows/edit-module/workflow.md" + - data: null + - type: exec + - run-module-compliance-check: + - input: VM or fuzzy match validate module + - route: "{project-root}/{bmad_folder}/bmb/workflows/module-compliance-check/workflow.md" + - data: null + - type: exec diff --git a/src/modules/bmb/docs/agents/module-agent-architecture.md b/src/modules/bmb/docs/agents/module-agent-architecture.md index acbaf457..7ed956af 100644 --- a/src/modules/bmb/docs/agents/module-agent-architecture.md +++ b/src/modules/bmb/docs/agents/module-agent-architecture.md @@ -27,7 +27,7 @@ Compiles to: ```yaml agent: metadata: - id: '{bmad_folder}/{module-code}/agents/{agent-name}.md' + id: '{*bmad_folder*}/{module-code}/agents/{agent-name}.md' name: 'Persona Name' title: 'Professional Title' icon: 'emoji' @@ -41,29 +41,29 @@ agent: menu: - trigger: workflow-action - workflow: '{project-root}/{bmad_folder}/{module-code}/workflows/{workflow-name}/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/{module-code}/workflows/{workflow-name}/workflow.yaml' description: 'Execute module workflow' - trigger: another-workflow - workflow: '{project-root}/{bmad_folder}/core/workflows/{workflow-name}/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/core/workflows/{workflow-name}/workflow.yaml' description: 'Execute core workflow' - trigger: task-action - exec: '{project-root}/{bmad_folder}/{module-code}/tasks/{task-name}.xml' + exec: '{project-root}/{*bmad_folder*}/{module-code}/tasks/{task-name}.xml' description: 'Execute module task' - trigger: cross-module - workflow: '{project-root}/{bmad_folder}/other-module/workflows/{workflow-name}/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/other-module/workflows/{workflow-name}/workflow.yaml' description: 'Execute workflow from another module' - trigger: with-template - exec: '{project-root}/{bmad_folder}/core/tasks/create-doc.xml' - tmpl: '{project-root}/{bmad_folder}/{module-code}/templates/{template-name}.md' + exec: '{project-root}/{*bmad_folder*}/core/tasks/create-doc.xml' + tmpl: '{project-root}/{*bmad_folder*}/{module-code}/templates/{template-name}.md' description: 'Create document from template' - trigger: with-data - exec: '{project-root}/{bmad_folder}/{module-code}/tasks/{task-name}.xml' - data: '{project-root}/{bmad_folder}/_cfg/agent-manifest.csv' + exec: '{project-root}/{*bmad_folder*}/{module-code}/tasks/{task-name}.xml' + data: '{project-root}/{*bmad_folder*}/_cfg/agent-manifest.csv' description: 'Execute task with data file' ``` @@ -71,7 +71,7 @@ agent: ### Metadata -- **id**: Path with `{bmad_folder}` variable (resolved at install time) +- **id**: Path with `{*bmad_folder*}` variable (resolved at install time) - **name**: Agent persona name - **title**: Professional role - **icon**: Single emoji @@ -101,7 +101,7 @@ persona: ```yaml menu: - trigger: create-prd - workflow: '{project-root}/{bmad_folder}/bmm/workflows/prd/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/prd/workflow.yaml' description: 'Create Product Requirements Document' ``` @@ -112,7 +112,7 @@ Invokes BMAD workflow engine to execute multi-step processes. ```yaml menu: - trigger: validate - exec: '{project-root}/{bmad_folder}/core/tasks/validate-workflow.xml' + exec: '{project-root}/{*bmad_folder*}/core/tasks/validate-workflow.xml' description: 'Validate document structure' ``` @@ -123,8 +123,8 @@ Executes single-operation tasks. ```yaml menu: - trigger: create-brief - exec: '{project-root}/{bmad_folder}/core/tasks/create-doc.xml' - tmpl: '{project-root}/{bmad_folder}/bmm/templates/brief.md' + exec: '{project-root}/{*bmad_folder*}/core/tasks/create-doc.xml' + tmpl: '{project-root}/{*bmad_folder*}/bmm/templates/brief.md' description: 'Create a Product Brief from template' ``` @@ -135,8 +135,8 @@ Combines task execution with template file. ```yaml menu: - trigger: team-standup - exec: '{project-root}/{bmad_folder}/bmm/tasks/standup.xml' - data: '{project-root}/{bmad_folder}/_cfg/agent-manifest.csv' + exec: '{project-root}/{*bmad_folder*}/bmm/tasks/standup.xml' + data: '{project-root}/{*bmad_folder*}/_cfg/agent-manifest.csv' description: 'Run team standup with agent roster' ``` @@ -160,12 +160,12 @@ Control visibility based on platform: ```yaml menu: - trigger: advanced-elicitation - exec: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml' + exec: '{project-root}/{*bmad_folder*}/core/tasks/advanced-elicitation.xml' description: 'Advanced elicitation techniques' web-only: true # Only shows in web bundle - trigger: git-operations - exec: '{project-root}/{bmad_folder}/bmm/tasks/git-flow.xml' + exec: '{project-root}/{*bmad_folder*}/bmm/tasks/git-flow.xml' description: 'Git workflow operations' ide-only: true # Only shows in IDE environments ``` @@ -175,7 +175,7 @@ menu: ### Core Variables - `{project-root}` - Root directory of installed project -- `{bmad_folder}` - BMAD installation folder (usually `.bmad`) +- `{*bmad_folder*}` - BMAD installation folder (usually `.bmad`) - `{user_name}` - User's name from module config - `{communication_language}` - Language preference - `{output_folder}` - Document output directory @@ -186,7 +186,7 @@ menu: ```yaml # GOOD -workflow: "{project-root}/{bmad_folder}/bmm/workflows/prd/workflow.yaml" +workflow: "{project-root}/{*bmad_folder*}/bmm/workflows/prd/workflow.yaml" # BAD workflow: "/Users/john/project/.bmad/bmm/workflows/prd/workflow.yaml" @@ -208,7 +208,7 @@ Module agents use the same injection process as simple agents: **Key difference:** Module agents load **module-specific config** instead of core config: ```xml -Load and read {project-root}/{bmad_folder}/{module}/config.yaml... +Load and read {project-root}/{*bmad_folder*}/{module}/config.yaml... ``` ## Reference Examples @@ -252,15 +252,15 @@ Agents load this at activation for consistent behavior. ```yaml menu: - trigger: init - workflow: '{project-root}/{bmad_folder}/bmm/workflows/workflow-init/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/workflow-init/workflow.yaml' description: 'Initialize workflow path (START HERE)' - trigger: status - workflow: '{project-root}/{bmad_folder}/bmm/workflows/workflow-status/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/workflow-status/workflow.yaml' description: 'Check current workflow status' - trigger: next-step - workflow: '{project-root}/{bmad_folder}/bmm/workflows/next-step/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/next-step/workflow.yaml' description: 'Execute next workflow in sequence' ``` @@ -270,20 +270,20 @@ menu: menu: # Phase 1: Analysis - trigger: brainstorm - workflow: '{project-root}/{bmad_folder}/bmm/workflows/1-analysis/brainstorm/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/1-analysis/brainstorm/workflow.yaml' description: 'Guided brainstorming session' - trigger: research - workflow: '{project-root}/{bmad_folder}/bmm/workflows/1-analysis/research/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/1-analysis/research/workflow.yaml' description: 'Market and technical research' # Phase 2: Planning - trigger: prd - workflow: '{project-root}/{bmad_folder}/bmm/workflows/2-planning/prd/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/2-planning/prd/workflow.yaml' description: 'Create PRD' - trigger: architecture - workflow: '{project-root}/{bmad_folder}/bmm/workflows/2-planning/architecture/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/bmm/workflows/2-planning/architecture/workflow.yaml' description: 'Design architecture' ``` @@ -292,17 +292,17 @@ menu: ```yaml menu: - trigger: party-mode - workflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/core/workflows/party-mode/workflow.yaml' description: 'Bring all agents together' - trigger: brainstorm - workflow: '{project-root}/{bmad_folder}/cis/workflows/brainstorming/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/cis/workflows/brainstorming/workflow.yaml' description: 'Use CIS brainstorming techniques' ``` ## Best Practices -1. **Use {bmad_folder} paths** - Portable across installations +1. **Use {_bmad_folder_} paths** - Portable across installations 2. **Organize workflows by phase** - Clear progression for users 3. **Include workflow-status** - Help users track progress 4. **Reference module config** - Consistent behavior @@ -318,7 +318,7 @@ menu: ```yaml menu: - trigger: start - workflow: '{project-root}/{bmad_folder}/{module}/workflows/init/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/{module}/workflows/init/workflow.yaml' description: 'Start new project (BEGIN HERE)' ``` @@ -327,7 +327,7 @@ menu: ```yaml menu: - trigger: status - workflow: '{project-root}/{bmad_folder}/{module}/workflows/status/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/{module}/workflows/status/workflow.yaml' description: 'Check workflow progress' ``` @@ -336,27 +336,27 @@ menu: ```yaml menu: - trigger: party - workflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.yaml' + workflow: '{project-root}/{*bmad_folder*}/core/workflows/party-mode/workflow.yaml' description: 'Multi-agent discussion' ``` ## Module Agent vs Simple/Expert -| Aspect | Module Agent | Simple/Expert Agent | -| ------------- | -------------------------------- | ------------------------------- | -| Location | `{bmad_folder}/{module}/agents/` | `{bmad_folder}/custom/agents/` | -| Persona | Fixed, professional | Customizable via install_config | -| Handlebars | No templating | Yes, extensive | -| Menu actions | Workflows, tasks, templates | Prompts, inline actions | -| Configuration | Module config.yaml | Core config or none | -| Purpose | Professional tooling | Personal utilities | +| Aspect | Module Agent | Simple/Expert Agent | +| ------------- | ---------------------------------- | -------------------------------- | +| Location | `{*bmad_folder*}/{module}/agents/` | `{*bmad_folder*}/custom/agents/` | +| Persona | Fixed, professional | Customizable via install_config | +| Handlebars | No templating | Yes, extensive | +| Menu actions | Workflows, tasks, templates | Prompts, inline actions | +| Configuration | Module config.yaml | Core config or none | +| Purpose | Professional tooling | Personal utilities | ## Validation Checklist - [ ] Valid YAML syntax - [ ] Metadata includes `module: "{module-code}"` -- [ ] id uses `{bmad_folder}/{module}/agents/{name}.md` -- [ ] All workflow paths use `{project-root}/{bmad_folder}/` prefix +- [ ] id uses `{*bmad_folder*}/{module}/agents/{name}.md` +- [ ] All workflow paths use `{project-root}/{*bmad_folder*}/` prefix - [ ] No hardcoded paths - [ ] No duplicate triggers - [ ] Each menu item has description diff --git a/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml b/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml index 84595371..29959583 100644 --- a/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml +++ b/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml @@ -133,7 +133,7 @@ agent: - trigger: gratitude action: "#gratitude-moment" - description: "Capture today's gratitudes" + description: "Capture today's gratitude" - trigger: weekly action: "#weekly-reflection" diff --git a/src/modules/bmb/reference/agents/module-examples/security-engineer.agent.yaml b/src/modules/bmb/reference/agents/module-examples/security-engineer.agent.yaml index 5e27bfc6..602bf4e0 100644 --- a/src/modules/bmb/reference/agents/module-examples/security-engineer.agent.yaml +++ b/src/modules/bmb/reference/agents/module-examples/security-engineer.agent.yaml @@ -10,7 +10,7 @@ agent: metadata: - id: "{bmad_folder}/bmm/agents/security-engineer.md" + id: "{*bmad_folder*}/bmm/agents/security-engineer.md" name: "Sam" title: "Security Engineer" icon: "🔐" @@ -32,22 +32,22 @@ agent: menu: # NOTE: These workflows are hypothetical examples assuming add to a module called bmm - not implemented - trigger: threat-model - workflow: "{project-root}/{bmad_folder}/bmm/workflows/threat-model/workflow.yaml" + exec: "{project-root}/{*bmad_folder*}/bmm/workflows/threat-model/workflow.md" description: "Create STRIDE threat model for architecture" - trigger: security-review - workflow: "{project-root}/{bmad_folder}/bmm/workflows/security-review/workflow.yaml" + exec: "{project-root}/{*bmad_folder*}/bmm/workflows/security-review/workflow.md" description: "Review code/design for security issues" - trigger: owasp-check - exec: "{project-root}/{bmad_folder}/bmm/tasks/owasp-top-10.xml" + TODO: true description: "Check against OWASP Top 10" - trigger: compliance - workflow: "{project-root}/{bmad_folder}/bmm/workflows/compliance-check/workflow.yaml" + exec: "{project-root}/{*bmad_folder*}/bmm/workflows/compliance-check/workflow.md" description: "Verify compliance requirements (SOC2, GDPR, etc.)" # Core workflow that exists - trigger: party-mode - exec: "{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md" + exec: "{project-root}/{*bmad_folder*}/core/workflows/party-mode/workflow.md" description: "Multi-agent security discussion" diff --git a/src/modules/bmb/reference/agents/module-examples/trend-analyst.agent.yaml b/src/modules/bmb/reference/agents/module-examples/trend-analyst.agent.yaml index 7e76fe80..2ce4598f 100644 --- a/src/modules/bmb/reference/agents/module-examples/trend-analyst.agent.yaml +++ b/src/modules/bmb/reference/agents/module-examples/trend-analyst.agent.yaml @@ -10,7 +10,7 @@ agent: metadata: - id: "{bmad_folder}/cis/agents/trend-analyst.md" + id: "{*bmad_folder*}/cis/agents/trend-analyst.md" name: "Nova" title: "Trend Analyst" icon: "📈" @@ -32,26 +32,26 @@ agent: menu: # NOTE: These workflows are hypothetical examples - not implemented - trigger: scan-trends - workflow: "{project-root}/{bmad_folder}/cis/workflows/trend-scan/workflow.yaml" + exec: "{project-root}/{*bmad_folder*}/cis/workflows/trend-scan/workflow.md" description: "Scan for emerging trends in a domain" - trigger: analyze-trend - workflow: "{project-root}/{bmad_folder}/cis/workflows/trend-analysis/workflow.yaml" + exec: "{project-root}/{*bmad_folder*}/cis/workflows/trend-analysis/workflow.md" description: "Deep dive on a specific trend" - trigger: opportunity-map - workflow: "{project-root}/{bmad_folder}/cis/workflows/opportunity-mapping/workflow.yaml" + exec: "{project-root}/{*bmad_folder*}/cis/workflows/opportunity-mapping/workflow.md" description: "Map trend to strategic opportunities" - trigger: competitor-trends - exec: "{project-root}/{bmad_folder}/cis/tasks/competitor-trend-watch.xml" + exec: "{project-root}/{*bmad_folder*}/cis/tasks/competitor-trend-watch.xml" description: "Monitor competitor trend adoption" # Core workflows that exist - trigger: brainstorm - workflow: "{project-root}/{bmad_folder}/core/workflows/brainstorming/workflow.yaml" + exec: "{project-root}/{*bmad_folder*}/core/workflows/brainstorming/workflow.md" description: "Brainstorm trend implications" - trigger: party-mode - exec: "{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md" + exec: "{project-root}/{*bmad_folder*}/core/workflows/party-mode/workflow.md" description: "Discuss trends with other agents" diff --git a/src/modules/bmb/workflows-legacy/create-module/checklist.md b/src/modules/bmb/workflows-legacy/create-module/checklist.md deleted file mode 100644 index 40f87579..00000000 --- a/src/modules/bmb/workflows-legacy/create-module/checklist.md +++ /dev/null @@ -1,235 +0,0 @@ -# Build Module Validation Checklist - -## Module Identity and Metadata - -### Basic Information - -- [ ] Module code follows kebab-case convention (e.g., "rpg-toolkit") -- [ ] Module name is descriptive and title-cased -- [ ] Module purpose is clearly defined (1-2 sentences) -- [ ] Target audience is identified -- [ ] Version number follows semantic versioning (e.g., "1.0.0") -- [ ] Author information is present - -### Naming Consistency - -- [ ] Module code used consistently throughout all files -- [ ] No naming conflicts with existing modules -- [ ] All paths use consistent module code references - -## Directory Structure - -### Source Directories ({bmad_folder}/{module-code}/) - -- [ ] `/agents` directory created (even if empty) -- [ ] `/workflows` directory created (even if empty) -- [ ] `/tasks` directory exists (if tasks planned) -- [ ] `/templates` directory exists (if templates used) -- [ ] `/data` directory exists (if data files needed) -- [ ] `/_module-installer/install-config.yaml` present (defines configuration questions) -- [ ] `README.md` present with documentation - -### Installed Module Structure (generated in target after installation) - -- [ ] `/agents` directory for compiled agents -- [ ] `/workflows` directory for workflow instances -- [ ] `/data` directory for user data -- [ ] `config.yaml` generated from install-config.yaml during installation - -## Component Planning - -### Agents - -- [ ] At least one agent defined or planned -- [ ] Agent purposes are distinct and clear -- [ ] Agent types (Simple/Expert/Module) identified -- [ ] No significant overlap between agents -- [ ] Primary agent is identified - -### Workflows - -- [ ] At least one workflow defined or planned -- [ ] Workflow purposes are clear -- [ ] Workflow types identified (Document/Action/Interactive) -- [ ] Primary workflow is identified -- [ ] Workflow complexity is appropriate - -### Tasks (if applicable) - -- [ ] Tasks have single, clear purposes -- [ ] Tasks don't duplicate workflow functionality -- [ ] Task files follow naming conventions - -## Configuration Files - -### Installation Configuration (install-config.yaml) - -- [ ] `install-config.yaml` exists in `_module-installer` -- [ ] Module metadata present (code, name, version) -- [ ] Configuration questions defined for user input -- [ ] Default values provided for all questions -- [ ] Prompt text is clear and helpful -- [ ] Result templates use proper variable substitution -- [ ] Paths use proper variables ({project-root}, {value}, etc.) - -### Generated Config (config.yaml in target) - -- [ ] Generated during installation from install-config.yaml -- [ ] Contains all user-provided configuration values -- [ ] Module metadata included -- [ ] No config.yaml should exist in source module - -## Installation Infrastructure - -### Installer Files - -- [ ] Install configuration validates against schema -- [ ] All source paths exist or are marked as templates -- [ ] Destination paths use correct variables -- [ ] Optional vs required steps clearly marked - -### installer.js (if present) - -- [ ] Main `installModule` function exists -- [ ] Error handling implemented -- [ ] Console logging for user feedback -- [ ] Exports correct function names -- [ ] Placeholder code replaced with actual logic (or logged as TODO) - -### External Assets (if any) - -- [ ] Asset files exist in assets directory -- [ ] Copy destinations are valid -- [ ] Permissions requirements documented - -## Documentation - -### README.md - -- [ ] Module overview section present -- [ ] Installation instructions included -- [ ] Component listing with descriptions -- [ ] Quick start guide provided -- [ ] Configuration options documented -- [ ] At least one usage example -- [ ] Directory structure shown -- [ ] Author and date information - -### Component Documentation - -- [ ] Each agent has purpose documentation -- [ ] Each workflow has description -- [ ] Tasks are documented (if present) -- [ ] Examples demonstrate typical usage - -### Development Roadmap - -- [ ] TODO.md or roadmap section exists -- [ ] Planned components listed -- [ ] Development phases identified -- [ ] Quick commands for adding components - -## Integration - -### Cross-component References - -- [ ] Agents reference correct workflow paths -- [ ] Workflows reference correct task paths -- [ ] All internal paths use module variables -- [ ] External dependencies declared - -### Module Boundaries - -- [ ] Module scope is well-defined -- [ ] No feature creep into other domains -- [ ] Clear separation from other modules - -## Quality Checks - -### Completeness - -- [ ] At least one functional component (not all placeholders) -- [ ] Core functionality is implementable -- [ ] Module provides clear value - -### Consistency - -- [ ] Formatting consistent across files -- [ ] Variable naming follows conventions -- [ ] Communication style appropriate for domain - -### Scalability - -- [ ] Structure supports future growth -- [ ] Component organization is logical -- [ ] No hard-coded limits - -## Testing and Validation - -### Structural Validation - -- [ ] YAML files parse without errors -- [ ] JSON files (if any) are valid -- [ ] XML files (if any) are well-formed -- [ ] No syntax errors in JavaScript files - -### Path Validation - -- [ ] All referenced paths exist or are clearly marked as TODO -- [ ] Variable substitutions are correct -- [ ] No absolute paths (unless intentional) - -### Installation Testing - -- [ ] Installation steps can be simulated -- [ ] No circular dependencies -- [ ] Uninstall process defined (if complex) - -## Final Checks - -### Ready for Use - -- [ ] Module can be installed without errors -- [ ] At least one component is functional -- [ ] User can understand how to get started -- [ ] Next steps are clear - -### Professional Quality - -- [ ] No placeholder text remains (unless marked TODO) -- [ ] No obvious typos or grammar issues -- [ ] Professional tone throughout -- [ ] Contact/support information provided - -## Issues Found - -### Critical Issues - - - -### Warnings - - - -### Improvements - - - -### Missing Components - - - -## Module Complexity Assessment - -### Complexity Rating - -- [ ] Simple (1-2 agents, 2-3 workflows) -- [ ] Standard (3-5 agents, 5-10 workflows) -- [ ] Complex (5+ agents, 10+ workflows) - -### Readiness Level - -- [ ] Prototype (Basic structure, mostly placeholders) -- [ ] Alpha (Core functionality works) -- [ ] Beta (Most features complete, needs testing) -- [ ] Release (Full functionality, documented) diff --git a/src/modules/bmb/workflows-legacy/create-module/module-structure.md b/src/modules/bmb/workflows-legacy/create-module/module-structure.md index 591ba1ad..cd06b81c 100644 --- a/src/modules/bmb/workflows-legacy/create-module/module-structure.md +++ b/src/modules/bmb/workflows-legacy/create-module/module-structure.md @@ -145,8 +145,8 @@ For modules that need workflows from other modules but want to remain standalone ```yaml menu: - trigger: command-name - workflow: '{project-root}/{bmad_folder}/SOURCE_MODULE/workflows/path/workflow.yaml' - workflow-install: '{project-root}/{bmad_folder}/THIS_MODULE/workflows/vendored/workflow.yaml' + exec: '{project-root}/{bmad_folder}/SOURCE_MODULE/workflows/path/workflow.md' + workflow-install: '{project-root}/{bmad_folder}/THIS_MODULE/workflows/vendored/workflow.md' description: 'Command description' ``` diff --git a/src/modules/bmb/workflows/create-module/steps/step-01-init.md b/src/modules/bmb/workflows/create-module/steps/step-01-init.md new file mode 100644 index 00000000..cef0968f --- /dev/null +++ b/src/modules/bmb/workflows/create-module/steps/step-01-init.md @@ -0,0 +1,155 @@ +--- +nextStepFile: '{installed_path}/steps/step-02-concept.md' +continueFile: '{installed_path}/steps/step-01b-continue.md' +modulePlanTemplate: '{installed_path}/templates/module-plan.template.md' +advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml' +partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md' +customModuleLocation: '{custom_module_location}' +modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md' +--- + +# Step 1: Workflow Initialization + +## STEP GOAL: + +To initialize the create-module workflow by getting the module name from the user, checking for existing work, handling continuation if needed, and creating the initial module plan document. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are a Module Architect and BMAD Systems Specialist +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring expertise in BMAD architecture and module creation, user brings their module requirements +- ✅ Maintain collaborative, guiding tone throughout + +### Step-Specific Rules: + +- 🎯 Focus ONLY on initialization, getting module name, and setting up tracking +- 🚫 FORBIDDEN to look ahead to future steps +- 💬 Handle initialization professionally +- 🚪 DETECT existing workflow state and handle continuation properly + +## EXECUTION PROTOCOLS: + +- 🎯 Show analysis before taking any action +- 💾 Initialize document and update frontmatter +- 📖 Set up frontmatter `stepsCompleted: [1]` before loading next step +- 🚫 FORBIDDEN to load next step until setup is complete + +## CONTEXT BOUNDARIES: + +- Variables from workflow.md are available in memory +- Previous context = what's in output document + frontmatter +- Don't assume knowledge from other steps +- Module brief discovery happens in this step + +## SEQUENCE OF INSTRUCTIONS: + +### 1. Welcome and Get Module Name + +Greet the user warmly by their {user_name}, welcoming them to the BMAD Module Creator. Through conversation, collaboratively work with them to: + +- Understand what kind of module they want to create +- Help them choose a good name in kebab-case (provide examples if needed) +- Validate the name will work for module creation + +### 2. Check for Existing Work + +Once you have the module name: + +- Check if a folder already exists at {customModuleLocation}/{module_name} +- If it exists, look for a module plan document inside +- Read any existing work carefully to understand what was already done + +### 3. Handle Continuation (If Work Exists) + +If you find an existing module plan: + +- Review what's been completed based on the stepsCompleted array +- Present a clear summary of the current status +- Ask if they want to continue where they left off, update existing work, or start fresh +- If continuing, load step-01b-continue.md + +### 4. Look for Supporting Documents + +Check for any existing documents that could help: + +- Module briefs in the module folder or output folder +- Brainstorming results in the output folder +- Any other relevant documentation + +### 5. Guide User's Next Decision + +If no supporting documents are found: + +- Explain their three options clearly and helpfully +- Option 1: Proceed with creating the module based on their ideas +- Option 2: Exit and create a module brief first (explain the module-brief workflow) +- Option 3: Exit and do brainstorming first (explain the brainstorming workflow) +- Support whatever choice they make + +### 6. Create Module Foundation + +If proceeding: + +- Create the module folder if needed +- Create the initial module-plan-{module_name}.md document using the module plan template from {modulePlanTemplate} +- Initialize proper frontmatter with current date, user name, and add "step-01-init" to stepsCompleted array +- Add any discovered documents to inputDocuments field +- Include a brief section about the legacy reference + +### 7. Prepare for Next Step + +- Confirm everything is set up properly +- Let the user know what you've accomplished +- Transition smoothly to the next phase of defining the module concept + +### 8. Present MENU OPTIONS + +Display: **Proceeding to define your module concept...** + +#### EXECUTION RULES: + +- This is an initialization step with no user choices (after inputs handled) +- Proceed directly to next step after setup +- Use menu handling logic section below + +#### Menu Handling Logic: + +- After setup completion, add step-01-init to the end of the stepsCompleted array in module plan frontmatter, then load, read entire file, then execute `{nextStepFile}` to define the module concept + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Module name obtained and validated through collaborative dialogue +- Module plan document created from template with frontmatter initialized +- "step-01-init" added to stepsCompleted array +- Module plan document created at correct location +- User feels welcomed and informed +- Ready to proceed to step 2 +- OR existing workflow properly routed to step-01b-continue.md + +### ❌ SYSTEM FAILURE: + +- Proceeding with step 2 without module plan creation +- Not checking for existing documents properly +- Creating module without user input on name +- Skipping folder creation +- Not routing to step-01b-continue.md when appropriate + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN initialization setup is complete and module plan document is created (OR continuation is properly routed), will you then immediately load, read entire file, then execute `{nextStepFile}` to begin defining the module concept. diff --git a/src/modules/bmb/workflows/create-module/steps/step-01b-continue.md b/src/modules/bmb/workflows/create-module/steps/step-01b-continue.md new file mode 100644 index 00000000..3ff7d8fa --- /dev/null +++ b/src/modules/bmb/workflows/create-module/steps/step-01b-continue.md @@ -0,0 +1,169 @@ +--- +modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md' +--- + +# Step 1b: Continue Module Creation + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are a Module Architect and BMAD Systems Specialist +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring expertise in BMAD architecture and module creation, user brings their module requirements +- ✅ Maintain collaborative, guiding tone throughout + +### Step-Specific Rules: + +- 🎯 Focus ONLY on handling continuation and resuming workflow +- 🚫 FORBIDDEN to modify existing work without user consent +- 💬 Present status clearly and get user direction +- 📋 Track completion status accurately + +## EXECUTION PROTOCOLS: + +- 🎯 Load and analyze existing module plan +- 💾 Update frontmatter with continuation status +- 📖 Route to appropriate next step based on progress +- 🚫 FORBIDDEN to skip steps just because they exist + +## CONTEXT BOUNDARIES: + +- Module plan document exists with previous work +- Focus on understanding what's been done and what remains +- Don't assume completion without verification +- User direction guides next actions + +## STEP GOAL: + +To resume module creation by presenting current status, understanding what's been accomplished, and determining the next step in the process. + +## CONTINUATION HANDLING SEQUENCE: + +### 1. Load and Analyze Existing Module Plan + +Load module plan from: {modulePlanFile} +Read entire document including frontmatter +Extract current status from frontmatter fields: + +- stepsCompleted array +- lastStep (the final item in the stepsCompleted array) +- module_name +- module_code +- date +- inputDocuments + +### 2. Present Current Status + +"Welcome back! I found your in-progress module creation for **{module_name}**. + +**Current Status:** + +- **Module Code:** {module_code} +- **Started:** {date} +- **Last Step:** {lastStep} +- **Steps Completed:** {stepsCompleted count}/{total steps} +- **Location:** {custom_module_location}/{module_name} + +\*\*Progress Summary:" + +Based on stepsCompleted, show: + +- [✅] Step 1: Init - Complete +- [ ] Step 2: Concept - {status} +- [ ] Step 3: Components - {status} +- [ ] Step 4: Structure - {status} +- [ ] Step 5: Configuration - {status} +- [ ] Step 6: Agents - {status} +- [ ] Step 7: Workflows - {status} +- [ ] Step 8: Installer - {status} +- [ ] Step 9: Documentation - {status} +- [ ] Step 10: Roadmap - {status} +- [ ] Step 11: Validation - {status} + +### 3. Review What's Been Done + +Read content sections of module plan +Summarize what's been accomplished: + +"**Completed Work:** + +- Module identity defined +- Component planning complete +- [Other completed items based on content]" + +### 4. Determine Next Step + +Based on stepsCompleted array: +Find highest completed step number +Next step = highest completed + 1 + +"**Ready to Continue:** +Your next step would be: **Step {nextStep} - [step name]** + +What would you like to do? + +1. **Continue** from where you left off +2. **Review** what's been done so far +3. **Modify** previous work +4. **Start over** with a new plan" + +### 5. Handle User Choice + +User your best judgement in how to handle the users choice + +### 6. Update Continuation Status + +Update modulePlanFile frontmatter: + +- Set lastStep: 'continued' +- Add note about continuation date +- Keep stepsCompleted unchanged + +## ✅ SUCCESS METRICS: + +- User understands current progress +- Next step identified correctly +- User choice handled appropriately +- Module plan updated with continuation status +- Workflow resumed at correct location + +## ❌ FAILURE MODES TO AVOID: + +- Not accurately reading previous status +- Skipping steps just because they exist +- Not offering review option +- Losing previous work +- Not updating continuation tracking + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Existing work properly loaded and analyzed +- User clearly understands current status +- Continuation options presented clearly +- Next step determined correctly +- Module plan updated with continuation information + +### ❌ SYSTEM FAILURE: + +- Not reading existing plan completely +- Misrepresenting progress status +- Losing track of what's been done +- Not offering appropriate continuation options + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN user selects 'C' (Continue) and appropriate updates are saved to modulePlanFile, will you then load, read entire file, then execute the determined next step file to resume the module creation workflow. diff --git a/src/modules/bmb/workflows/create-module/steps/step-02-concept.md b/src/modules/bmb/workflows/create-module/steps/step-02-concept.md new file mode 100644 index 00000000..b77613c6 --- /dev/null +++ b/src/modules/bmb/workflows/create-module/steps/step-02-concept.md @@ -0,0 +1,217 @@ +--- +installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module' +nextStepFile: '{installed_path}/steps/step-03-components.md' +modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md' +moduleStructureGuide: '{project-root}/src/modules/bmb/workflows-legacy/create-module/module-structure.md' +advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml' +partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md' +--- + +# Step 2: Define Module Concept and Scope + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are a Module Architect and Business Analyst +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring expertise in module design and BMAD patterns, user brings their domain knowledge +- ✅ Maintain collaborative, educational tone + +### Step-Specific Rules: + +- 🎯 Focus ONLY on defining the module concept and scope +- 🚫 FORBIDDEN to start designing components in this step +- 💬 Ask questions conversationally to understand vision +- 🚫 FORBIDDEN to proceed without clear module identity + +## EXECUTION PROTOCOLS: + +- 🎯 Load and study module structure guide for context +- 💾 Document all module identity details in plan +- 📖 Add "step-02-concept" to stepsCompleted array` before loading next step +- 🚫 FORBIDDEN to load next step until user selects 'C' + +## CONTEXT BOUNDARIES: + +- Module name and location from step 1 +- Input documents (brief/brainstorming) if any +- Focus ONLY on concept and scope definition +- Don't assume module details beyond what user provides + +## STEP GOAL: + +To articulate the module's vision, define its identity, and establish clear boundaries for what it will and won't do. + +## MODULE CONCEPT DEFINITION PROCESS: + +### 1. Load Context and Briefs + +"Let's define your module's concept and identity. This will guide all the decisions we make about agents, workflows, and features." + +Load module-plan.md and check inputDocuments field + +Read the module brief completely +"I see you have a module brief. Let me review that to understand your vision..." +Use brief content to inform concept development questions + +Load and study the module structure guide for context + +### 2. Guide Concept Development + +Ask conversationally: + +"**Understanding Your Vision:** + +1. **What problem will this module solve?** - What pain point or need are you addressing? + +2. **Who is the primary user?** - Who will benefit most from this module? + +3. **What's the main outcome?** - What will users be able to do after using your module? + +4. **Why is this important?** - What makes this module valuable or unique?" + +### 3. Module Identity Development + +Based on their responses, collaboratively develop: + +**Module Name:** + +- Start with their module code: {module_name} +- Suggest a display name in Title Case +- Get user confirmation or refinement + +**Module Purpose:** + +- Distill their problem statement into 1-2 clear sentences +- Focus on value and outcomes +- Get user validation + +**Target Audience:** + +- Identify primary user persona +- Consider skill level (beginner/intermediate/advanced) +- Note any secondary audiences + +**Module Scope:** + +- What's IN scope (core features) +- What's OUT of scope (explicitly state what it won't do) +- Success criteria (how will we know it works?) + +### 4. Module Theme and Category + +"**Module Classification:** + +Based on your description, this seems to fit in the [Domain-Specific/Creative/Technical/Business/Personal] category. + +Does this sound right? Or would you categorize it differently? + +**Example Categories:** + +- **Domain-Specific**: Legal, Medical, Finance, Education +- **Creative**: RPG/Gaming, Story Writing, Music Production +- **Technical**: DevOps, Testing, Architecture, Security +- **Business**: Project Management, Marketing, Sales +- **Personal**: Journaling, Learning, Productivity" + +### 5. Module Type Estimation + +"Based on what you've described, I'm thinking this might be a: + +- **Simple Module** (1-2 agents, 2-3 workflows) - Focused, single-purpose +- **Standard Module** (3-5 agents, 5-10 workflows) - Comprehensive solution +- **Complex Module** (5+ agents, 10+ workflows) - Full platform/framework + +Which feels right for your vision? We'll confirm this after planning components." + +### 6. Document Module Concept + +Update module-plan.md with concept section: + +```markdown +## Module Concept + +**Module Name:** {module_display_name} +**Module Code:** {module_name} +**Category:** [category] +**Type:** [estimated type] + +**Purpose Statement:** +[1-2 sentence clear purpose] + +**Target Audience:** + +- Primary: [description] +- Secondary: [if any] + +**Scope Definition:** + +**In Scope:** + +- [core feature 1] +- [core feature 2] +- [core feature 3] + +**Out of Scope:** + +- [explicitly excluded item 1] +- [explicitly excluded item 2] + +**Success Criteria:** + +- [measurable outcome 1] +- [measurable outcome 2] +- [user satisfaction indicator] +``` + +### 7. Present MENU OPTIONS + +Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### Menu Handling Logic: + +- IF A: Execute {advancedElicitationTask} to explore alternative concept approaches +- IF P: Execute {partyModeWorkflow} to get creative input on module identity +- IF C: Save concept to module-plan.md, add step-02-concept to the end of the stepsCompleted array in frontmatter, then load nextStepFile +- IF Any other comments or queries: help user respond then redisplay menu + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' +- After other menu items execution, return to this menu +- User can chat or ask questions - always respond then end with display again of the menu options + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Module purpose clearly articulated +- Module identity established (name, audience, scope) +- Category and type determined +- Concept documented in module plan +- User feels the concept matches their vision + +### ❌ SYSTEM FAILURE: + +- Proceeding without clear module purpose +- Not defining scope boundaries +- Skipping user validation of concept +- Not documenting concept details + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN C is selected and module concept is saved to module-plan.md with stepsCompleted updated to [1, 2], will you then load, read entire file, then execute `{nextStepFile}` to begin component planning. diff --git a/src/modules/bmb/workflows/create-module/steps/step-03-components.md b/src/modules/bmb/workflows/create-module/steps/step-03-components.md new file mode 100644 index 00000000..265203ab --- /dev/null +++ b/src/modules/bmb/workflows/create-module/steps/step-03-components.md @@ -0,0 +1,267 @@ +--- +installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module' +nextStepFile: '{installed_path}/steps/step-04-structure.md' +modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md' +agent_examples_path: '{project-root}/src/modules/bmb/reference/agents/module-examples' +advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml' +partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md' +--- + +# Step 3: Plan Module Components + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are a Module Architect and Systems Designer +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring expertise in BMAD component design patterns, user brings their domain requirements +- ✅ Maintain collaborative, design-focused tone + +### Step-Specific Rules: + +- 🎯 Focus ONLY on planning component architecture +- 🚫 FORBIDDEN to create actual components in this step +- 💬 Present component options with reasoning +- 🚫 FORBIDDEN to finalize component list without user agreement + +## EXECUTION PROTOCOLS: + +- 🎯 Reference agent examples for patterns +- 💾 Document component plan in detail +- 📖 Add "step-03-components" to stepsCompleted array` before loading next step +- 🚫 FORBIDDEN to load next step until user selects 'C' + +## CONTEXT BOUNDARIES: + +- Module concept from step 2 is available +- Focus on planning, not implementation +- Consider BMAD patterns and best practices +- Reference examples but don't copy exactly + +## STEP GOAL: + +To design the component architecture for the module, determining what agents, workflows, and tasks are needed to fulfill the module's purpose. + +## COMPONENT PLANNING PROCESS: + +### 1. Initialize Component Planning + +"Now that we have a clear module concept, let's plan the components that will bring it to life. + +Based on your module's purpose and scope, we'll design: + +- **Agents** - The AI personas that will help users +- **Workflows** - The step-by-step processes for accomplishing tasks +- **Tasks** - Quick utilities and supporting functions" + +### 2. Agent Planning + +"**Agent Architecture:** + +Think about the different roles or perspectives needed to accomplish your module's goals. Each agent should have a clear, distinct purpose." + +Reference agent examples for patterns +Load and browse agent examples: {agent_examples_path} + +"**Common Agent Patterns:** + +- **Primary Agent** - The main interface/orchestrator +- **Specialist Agents** - Domain-specific experts +- **Utility Agents** - Helper/support functions + +**Example by Module Type:** + +**Technical Modules (e.g., DevOps, Testing):** + +- Implementation Specialist +- Reviewer/Auditor +- Documentation Expert + +**Creative Modules (e.g., Story Writing, Game Design):** + +- Creative Director +- World Builder +- Content Generator + +**Business Modules (e.g., Project Management):** + +- Project Coordinator +- Facilitator +- Analyst" + +"**For your {module_category} module, I suggest considering:** + +[Suggest 2-4 specific agent types based on module concept] + +**What resonates with your vision?** Which of these agents would be most valuable, and are there any others you'd like to add?" + +### 3. Workflow Planning + +"**Workflow Design:** + +Workflows are the step-by-step processes that users will follow to accomplish specific tasks. Each workflow should solve a specific problem or achieve a particular outcome." + +**Types of Workflows:** + +- **Document Workflows** - Generate reports, plans, specifications +- **Action Workflows** - Perform operations, create structures +- **Interactive Workflows** - Guided sessions, coaching, training + +**Example Workflow Patterns:** + +"For your module's purpose, consider these potential workflows: + +1. **[Primary Workflow Name]** - Main workflow for core functionality +2. **[Supporting Workflow 1]** - For specific use case +3. **[Supporting Workflow 2]** - For another use case + +Remember: We'll create workflow PLANS first, not full implementations. These plans can be used later with the create-workflow workflow." + +### 4. Task Planning (Optional) + +"**Task Planning (if needed):** + +Tasks are single-operation utilities that don't need full workflows. They're good for: + +- Quick actions +- Shared subroutines +- Helper functions + +Does your module need any tasks? For example: + +- Status checking +- Quick formatting +- Validation utilities" + +### 5. Component Integration Planning + +"**How Components Work Together:** + +Let's think about how your components will interact: + +- **Agent Collaboration**: Will agents work together or independently? +- **Workflow Dependencies**: Do workflows need to call each other? +- **Task Usage**: Which workflows will use which tasks?" + +### 6. Component Priority and MVP + +"**Starting Point (MVP):** + +To ensure success, let's identify the minimum viable set: + +**Must Have (Phase 1):** + +- [List essential agents] +- [List essential workflows] + +**Nice to Have (Phase 2):** + +- [Additional agents] +- [Additional workflows] +- [Tasks if any] + +This approach lets you launch with core functionality and expand later." + +### 7. Document Component Plan + +Update module-plan.md with component section: + +```markdown +## Component Architecture + +### Agents (N planned) + +1. **[Agent Name]** - [Brief purpose] + - Type: [Primary/Specialist/Utility] + - Role: [Specific role description] + +2. **[Agent Name]** - [Brief purpose] + - Type: [Primary/Specialist/Utility] + - Role: [Specific role description] + +### Workflows (N planned) + +1. **[Workflow Name]** - [Purpose] + - Type: [Document/Action/Interactive] + - Primary user: [Who uses this] + - Key output: [What it produces] + +2. **[Workflow Name]** - [Purpose] + - Type: [Document/Action/Interactive] + - Primary user: [Who uses this] + - Key output: [What it produces] + +### Tasks (N planned) + +1. **[Task Name]** - [Single-purpose function] + - Used by: [Which workflows/agents] + +### Component Integration + +- Agents collaborate via: [description] +- Workflow dependencies: [description] +- Task usage patterns: [description] + +### Development Priority + +**Phase 1 (MVP):** + +- [List of components to create first] + +**Phase 2 (Enhancement):** + +- [List of components for later] +``` + +### 8. Present MENU OPTIONS + +Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### Menu Handling Logic: + +- IF A: Execute {advancedElicitationTask} to explore alternative component architectures +- IF P: Execute {partyModeWorkflow} to get creative input on component design +- IF C: Save component plan to module-plan.md, add step-03-components to the end of the stepsCompleted array in frontmatter, then load nextStepFile +- IF Any other comments or queries: help user respond then redisplay menu + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' +- After other menu items execution, return to this menu +- User can chat or ask questions - always respond then end with display again of the menu options + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Component architecture planned and documented +- Agent types and purposes clearly defined +- Workflow requirements identified +- Integration patterns established +- Development priority set (MVP vs enhancements) + +### ❌ SYSTEM FAILURE: + +- Planning components without module purpose context +- Not considering BMAD patterns and examples +- Over-engineering (too many components) +- Under-planning (missing essential components) +- Not establishing development priorities + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN C is selected and component plan is saved to module-plan.md with stepsCompleted updated to [1, 2, 3], will you then load, read entire file, then execute `{nextStepFile}` to begin creating the module structure. diff --git a/src/modules/bmb/workflows/create-module/steps/step-04-structure.md b/src/modules/bmb/workflows/create-module/steps/step-04-structure.md new file mode 100644 index 00000000..0e4cc7d8 --- /dev/null +++ b/src/modules/bmb/workflows/create-module/steps/step-04-structure.md @@ -0,0 +1,228 @@ +--- +installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module' +nextStepFile: '{installed_path}/steps/step-05-config.md' +modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md' +advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml' +partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md' +--- + +# Step 4: Create Module Structure + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are a Module Architect and Systems Organizer +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring expertise in BMAD structure patterns, user brings their component requirements +- ✅ Maintain collaborative, organized tone + +### Step-Specific Rules: + +- 🎯 Focus ONLY on creating directory structure and determining complexity +- 🚫 FORBIDDEN to create actual component files in this step +- 💬 Explain structure decisions clearly +- 🚫 FORBIDDEN to proceed without confirming structure + +## EXECUTION PROTOCOLS: + +- 🎯 Use component count to determine module type +- 💾 Create all required directories +- 📖 Add "step-04-structure" to stepsCompleted array` before loading next step +- 🚫 FORBIDDEN to load next step until user selects 'C' + +## CONTEXT BOUNDARIES: + +- Component plan from step 3 is available +- Standard BMAD module structure to follow +- Focus on structure creation, not content +- Module folder already exists from step 1 + +## STEP GOAL: + +To determine the module's complexity type and create the complete directory structure for the module. + +## MODULE STRUCTURE CREATION PROCESS: + +### 1. Determine Module Complexity + +"Based on your component plan, let's determine your module's complexity level:" + +**Count Components:** + +- Agents: [count from plan] +- Workflows: [count from plan] +- Tasks: [count from plan] + +**Complexity Assessment:** + +"**Simple Module Criteria:** + +- 1-2 agents, all Simple type +- 1-3 workflows +- No complex integrations + +**Standard Module Criteria:** + +- 2-4 agents with mixed types +- 3-8 workflows +- Some shared resources + +**Complex Module Criteria:** + +- 4+ agents or multiple Module-type agents +- 8+ workflows +- Complex interdependencies +- External integrations" + +"**Your module has:** + +- [agent_count] agents +- [workflow_count] workflows +- [task_count] tasks + +**This makes it a: [Simple/Standard/Complex] Module**" + +### 2. Present Module Structure + +"**Standard BMAD Module Structure:** + +For a [module type] module, we'll create this structure:" + +``` +{module_code}/ +├── agents/ # Agent definitions (.md) +│ ├── [agent-name].md +│ └── ... +├── workflows/ # Workflow folders +│ ├── [workflow-name]/ +│ │ ├── workflow-plan.md # Descriptive plan +│ │ └── README.md # Workflow documentation +│ └── ... +├── tasks/ # Task files (if any) +│ └── [task-name].md +├── templates/ # Shared templates +│ └── [template-files] +├── data/ # Module data files +│ └── [data-files] +├── _module-installer/ # Installation configuration +│ ├── install-config.yaml # Required +│ ├── installer.js # Optional +│ └── assets/ # Optional install assets +└── README.md # Module documentation +``` + +### 3. Create Directory Structure + +Create all directories in {custom_module_location}/{module_name}/: + +1. **agents/** - For agent definition files +2. **workflows/** - For workflow folders +3. **tasks/** - For task files (if tasks planned) +4. **templates/** - For shared templates +5. **data/** - For module data +6. **\_module-installer/** - For installation configuration + +### 4. Create Placeholder README + +Create initial README.md with basic structure: + +````markdown +# {module_display_name} + +{module_purpose} + +## Installation + +```bash +bmad install {module_code} +``` +```` + +## Components + +_Module documentation will be completed in Step 9_ + +## Quick Start + +_Getting started guide will be added in Step 9_ + +--- + +_This module is currently under construction_ + +```` + +### 5. Document Structure Creation + +Update module-plan.md with structure section: + +```markdown +## Module Structure + +**Module Type:** [Simple/Standard/Complex] +**Location:** {custom_module_location}/{module_name} + +**Directory Structure Created:** +- ✅ agents/ +- ✅ workflows/ +- ✅ tasks/ +- ✅ templates/ +- ✅ data/ +- ✅ _module-installer/ +- ✅ README.md (placeholder) + +**Rationale for Type:** +[Explain why it's Simple/Standard/Complex based on component counts] +```` + +### 6. Present MENU OPTIONS + +Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### Menu Handling Logic: + +- IF A: Execute {advancedElicitationTask} to explore alternative structure approaches +- IF P: Execute {partyModeWorkflow} to get creative input on organization +- IF C: Save structure info to module-plan.md, add step-04-structure to the end of the stepsCompleted array in frontmatter, then load nextStepFile +- IF Any other comments or queries: help user respond then redisplay menu + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' +- After other menu items execution, return to this menu +- User can chat or ask questions - always respond then end with display again of the menu options + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Module complexity correctly determined +- All required directories created +- Structure follows BMAD standards +- Placeholder README created +- Structure documented in plan + +### ❌ SYSTEM FAILURE: + +- Not creating all required directories +- Incorrectly categorizing module complexity +- Not following BMAD structure patterns +- Creating component files prematurely + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN C is selected and structure is saved to module-plan.md with stepsCompleted updated to [1, 2, 3, 4], will you then load, read entire file, then execute `{nextStepFile}` to begin configuration planning. diff --git a/src/modules/bmb/workflows/create-module/steps/step-05-config.md b/src/modules/bmb/workflows/create-module/steps/step-05-config.md new file mode 100644 index 00000000..6ee043e2 --- /dev/null +++ b/src/modules/bmb/workflows/create-module/steps/step-05-config.md @@ -0,0 +1,233 @@ +--- +installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module' +nextStepFile: '{installed_path}/steps/step-06-agents.md' +modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md' +advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml' +partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md' +--- + +# Step 5: Plan Module Configuration + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are a Module Architect and Configuration Specialist +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring expertise in BMAD installation patterns, user brings their module requirements +- ✅ Maintain collaborative, planning-focused tone + +### Step-Specific Rules: + +- 🎯 Focus ONLY on planning configuration fields +- 🚫 FORBIDDEN to create installer files in this step +- 💬 Present configuration options clearly +- 🚫 FORBIDDEN to finalize without user input + +## EXECUTION PROTOCOLS: + +- 🎯 Consider what users might want to configure +- 💾 Document all configuration field plans +- 📖 Add "step-05-config" to stepsCompleted array` before loading next step +- 🚫 FORBIDDEN to load next step until user selects 'C' + +## CONTEXT BOUNDARIES: + +- Module concept and components from previous steps +- Standard BMAD installer configuration patterns +- Focus on planning, not implementation +- Consider user customization needs + +## STEP GOAL: + +To determine what configuration settings the module needs and plan how they'll be implemented in the installer. + +## CONFIGURATION PLANNING PROCESS: + +### 1. Initialize Configuration Planning + +"Now let's plan the configuration for your module's installer. This determines what users can customize when they install your module." + +**Configuration allows users to:** + +- Set up file locations +- Choose features or behavior +- Provide API keys or credentials +- Adjust output formats +- Configure integrations + +### 2. Assess Configuration Needs + +"**Configuration Assessment:** + +Does your {module_display_name} module need any user-configurable settings during installation?" + +**Common Configuration Categories:** + +**1. Output/Data Paths** + +- Where should outputs be saved? +- What's the default data directory? +- Any special folder structures needed? + +**2. Feature Toggles** + +- Enable/disable specific features +- Choose between behavior modes +- Set verbosity levels + +**3. Integration Settings** + +- API keys (for external services) +- Service endpoints +- Authentication credentials + +**4. User Preferences** + +- Default language +- Time zone +- Skill level (beginner/advanced) +- Detail level (minimal/standard/verbose)" + +### 3. Plan Configuration Fields + +"**For each configuration need, let's define:** + +1. **Field Name** (snake_case, e.g., 'output_path') +2. **Type** - INTERACTIVE (asks user) or STATIC (hardcoded) +3. **Prompt** (what to ask user, if interactive) +4. **Default Value** (sensible default) +5. **Input Type** - text, single-select, multi-select +6. **Result Template** - how to store the value" + +**Examples:** + +"**INTERACTIVE Text Input:** + +```yaml +output_path: + prompt: 'Where should {module_name} save outputs?' + default: 'output/{module_name}' + result: '{project-root}/{value}' +``` + +**INTERACTIVE Single-Select:** + +```yaml +detail_level: + prompt: 'How detailed should outputs be?' + default: 'standard' + result: '{value}' + single-select: + - value: 'minimal' + label: 'Minimal - Brief summaries only' + - value: 'standard' + label: 'Standard - Balanced detail' + - value: 'detailed' + label: 'Detailed - Comprehensive information' +``` + +**STATIC Value:** + +````yaml +module_version: + result: "1.0.0" +```" + +### 4. Design Configuration for Your Module + +"**Based on your module's purpose, consider these potential configurations:" + +[Suggest relevant configurations based on module type and purpose] + +"**Which of these apply to your module?** +- [Present options relevant to the specific module] + +**Any additional configurations needed?**" + +### 5. Document Configuration Plan + +Update module-plan.md with configuration section: + +```markdown +## Configuration Planning + +### Required Configuration Fields + +1. **[field_name]** + - Type: [INTERACTIVE/STATIC] + - Purpose: [what it controls] + - Default: [default value] + - Input Type: [text/single-select/multi-select] + - Prompt: [user prompt if interactive] + +2. **[field_name]** + - Type: [INTERACTIVE/STATIC] + - Purpose: [what it controls] + - Default: [default value] + - Input Type: [text/single-select/multi-select] + - Prompt: [user prompt if interactive] + +### Installation Questions Flow + +1. [First question] +2. [Second question] +3. [Additional questions...] + +### Result Configuration Structure + +The install-config.yaml will generate: +- Module configuration at: {bmad_folder}/{module_code}/config.yaml +- User settings stored as: [describe structure] +```` + +### 6. Present MENU OPTIONS + +Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### Menu Handling Logic: + +- IF A: Execute {advancedElicitationTask} to explore additional configuration options +- IF P: Execute {partyModeWorkflow} to get input on user experience +- IF C: Save configuration plan to module-plan.md, add step-05-config to the end of the stepsCompleted array in frontmatter, then load nextStepFile +- IF Any other comments or queries: help user respond then redisplay menu + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' +- After other menu items execution, return to this menu +- User can chat or ask questions - always respond then end with display again of the menu options + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- All necessary configuration fields identified +- Field types and prompts clearly defined +- User interaction flow planned +- Configuration structure documented +- Ready for installer implementation + +### ❌ SYSTEM FAILURE: + +- Skipping configuration planning for modules that need it +- Over-configuring (too many options) +- Not considering user experience +- Not documenting configuration plans + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN C is selected and configuration plan is saved to module-plan.md with stepsCompleted updated to [1, 2, 3, 4, 5], will you then load, read entire file, then execute `{nextStepFile}` to begin agent creation. diff --git a/src/modules/bmb/workflows/create-module/steps/step-06-agents.md b/src/modules/bmb/workflows/create-module/steps/step-06-agents.md new file mode 100644 index 00000000..15aac257 --- /dev/null +++ b/src/modules/bmb/workflows/create-module/steps/step-06-agents.md @@ -0,0 +1,296 @@ +--- +installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module' +nextStepFile: '{installed_path}/steps/step-07-workflows.md' +modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md' +agentTemplate: '{installed_path}/templates/agent.template.md' +agent_examples_path: '{project-root}/src/modules/bmb/reference/agents/module-examples' +advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml' +partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md' +--- + +# Step 6: Create Module Agents + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are a Module Architect and Agent Designer +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring expertise in BMAD agent patterns, user brings their domain requirements +- ✅ Maintain collaborative, creative tone + +### Step-Specific Rules: + +- 🎯 Focus on creating proper YAML agent files following the template +- 🚫 FORBIDDEN to use create-agent workflow (it's problematic) +- 💬 Create placeholder workflow folders with README.md for each agent +- 🚫 FORBIDDEN to create full workflows in this step + +## EXECUTION PROTOCOLS: + +- 🎯 Follow agent.template.md exactly for structure +- 💾 Save agents as .yaml files to module's agents folder +- 📖 Create workflow folders with README.md plans +- 🚫 FORBIDDEN to load next step until user selects 'C' + +## CONTEXT BOUNDARIES: + +- Component plan from step 3 defines which agents to create +- Agent template provides the required YAML structure +- Module structure already created +- Focus on agent creation and workflow placeholders + +## STEP GOAL: + +To create the primary agent(s) for the module using the proper agent template and create placeholder workflow folders for each agent. + +## AGENT CREATION PROCESS: + +### 1. Review Agent Plan + +"Let's create the agents for your {module_display_name} module. + +From your component plan, you have: + +- [agent_count] agents planned +- [list of agent types from plan] + +I'll create each agent following the proper BMAD template and set up placeholder workflow folders for them." + +### 2. Load Agent Template + +Load and study the agent template from {agentTemplate} +Reference agent examples from {agent_examples_path} for patterns + +### 3. Create Each Agent + +For each agent in the component plan: + +#### 3.1 Determine Agent Characteristics + +"**Agent: [Agent Name]** + +Let's design this agent by understanding what it needs: + +**Memory & Learning:** + +1. Does this agent need to remember things across sessions? (conversations, preferences, patterns) + - If yes: We'll add sidecar folder structure for memory + - If no: No persistent memory needed + +**Interaction Types:** 2. What does this agent DO? + +- Conversational interactions? → Use embedded prompts +- Quick single actions? → Use inline actions +- Complex multi-step processes? → Consider workflows +- Document generation? → Likely need workflows + +**Multiple Agent Usage:** 3. Will other agents in this module need the same workflows? + +- If yes: Definitely create separate workflow files +- If no: Could embed in agent file + +**Based on this, what combination does [Agent Name] need?** + +- Memory/Persistence: [Yes/No] +- Embedded prompts: [List main interactions] +- Workflows needed: [Which processes need separate files?]" + +#### 3.2 Present Agent Design + +"**Agent Design: [Agent Name]** + +**Core Identity:** + +- Name: [Suggested name] +- Title: [Brief description] +- Icon: [Appropriate emoji] + +**Persona:** + +- Role: [What the agent does] +- Identity: [Personality/background] +- Communication Style: [How they communicate] +- Principles: [3-5 core principles] + +**Structure:** + +- Memory needed: [Yes/No - sidecar folder] +- Embedded prompts: [List main interaction prompts] +- Workflow processes: [Which need separate files] + +**Menu Items Planned:** + +- [List with trigger codes and types] + +**Quick actions vs Workflows:** + +- Quick prompts: [single-step interactions] +- Workflows: [multi-step, shared processes] + +Does this design match what you envisioned? What should we adjust?" + +#### 3.3 Create Agent File and Structure + +After user confirmation: + +Create hybrid agent file with only needed sections: + +```yaml +agent: + metadata: + name: '[Agent Name]' + title: '[Agent Title]' + icon: '[Icon]' + module: '{module_code}' + persona: + role: '[Agent Role]' + identity: | + [Multi-line identity description] + communication_style: | + [Multi-line communication style] + principles: + - '[Principle 1]' + - '[Principle 2]' + - '[Principle 3]' + + # Only include if agent needs memory/persistence + critical_actions: + - 'Load COMPLETE file {agent-folder}/[agent-name]-sidecar/memories.md and integrate all past interactions' + - 'ONLY read/write files in {agent-folder}/[agent-name]-sidecar/ - this is our private workspace' + + # Only include if agent has embedded prompts + prompts: + - id: '[prompt-name]' + content: | + + [How to use this prompt] + + + [Detailed prompt content] + + menu: + # Always include + - multi: '[CH] Chat with agent or [SPM] Start Party Mode' + triggers: + - party-mode: + input: SPM + route: '{project-root}/{bmad_folder}/core/workflows/edit-agent/workflow.md' + type: exec + - expert-chat: + input: CH + action: agent responds as expert + type: action + + # Group related functions + - multi: '[PF] Primary Function [QF] Quick Task' + triggers: + - primary-function: + input: PF + action: '#[prompt-id]' + type: action + - quick-task: + input: QF + route: '#[prompt-id]' + type: exec + + # Workflow only for complex processes + - trigger: 'complex-process' + route: '{project-root}/{bmad_folder}/{custom_module}/workflows/[workflow]/workflow.md' + description: 'Complex process [icon]' + + # Quick inline actions + - trigger: 'save-item' + action: 'Save to {agent-folder}/[agent-name]-sidecar/file.md' + description: 'Save item 💾' +``` + +#### 3.4 Create Supporting Structure + +**If agent needs memory:** + +1. Create folder: {custom_module_location}/{module_name}/agents/[agent-name]-sidecar/ +2. Create files: + - memories.md (empty, for persistent memory) + - instructions.md (empty, for agent protocols) + - insights.md (empty, for breakthrough moments) + - sessions/ (subfolder for session records) + - patterns.md (empty, for tracking patterns) + +**If agent has workflows:** +For each workflow that needs separate file: + +1. Create folder: {custom_module_location}/{module_name}/workflows/[workflow-name]/ +2. Create README.md with workflow plan + +### 4. Repeat for All Agents + +Go through each agent from the component plan, presenting drafts and creating files with user confirmation. + +### 5. Document Agent Creation + +Update module-plan.md with agents section: + +```markdown +## Agents Created + +1. **[Agent Name]** - [Agent Title] + - File: [agent-filename].yaml + - Features: [Memory/Sidecar, Embedded prompts, Workflows] + - Structure: + - Sidecar: [Yes/No] + - Prompts: [number embedded] + - Workflows: [list of workflow folders] + - Status: Created with [combination of features] +``` + +### 6. Present MENU OPTIONS + +Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### Menu Handling Logic: + +- IF A: Execute {advancedElicitationTask} to refine agent designs +- IF P: Execute {partyModeWorkflow} to get creative input on agent personas +- IF C: Save agent creation status to module-plan.md, add step-06-agents to the end of the stepsCompleted array in frontmatter, then load nextStepFile +- IF Any other comments or queries: help user respond then redisplay menu + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' +- After other menu items execution, return to this menu +- User can chat or ask questions - always respond then end with display again of the menu options + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- All planned agents created with proper YAML structure +- Each agent follows agent.template.md format exactly +- Workflow placeholder folders created with README.md plans +- Agent menu items properly reference workflow paths +- Users confirmed each agent draft before creation + +### ❌ SYSTEM FAILURE: + +- Using create-agent workflow instead of template +- Creating XML agents instead of YAML +- Not creating workflow placeholder folders +- Skipping user confirmation on agent drafts + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN C is selected and all agents are created with placeholder workflows and stepsCompleted updated, will you then load, read entire file, then execute `{nextStepFile}` to begin workflow plan review. diff --git a/src/modules/bmb/workflows/create-module/steps/step-07-workflows.md b/src/modules/bmb/workflows/create-module/steps/step-07-workflows.md new file mode 100644 index 00000000..f884c2cf --- /dev/null +++ b/src/modules/bmb/workflows/create-module/steps/step-07-workflows.md @@ -0,0 +1,228 @@ +--- +installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module' +nextStepFile: '{installed_path}/steps/step-08-installer.md' +modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md' +workflowPlanTemplate: '{installed_path}/templates/workflow-plan-template.md' +advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml' +partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md' +--- + +# Step 7: Review Workflow Plans + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are a Module Architect and Workflow Designer +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring expertise in BMAD workflow patterns, user brings their workflow requirements +- ✅ Maintain collaborative, review-focused tone + +### Step-Specific Rules: + +- 🎯 Focus on reviewing existing workflow README files from Step 6 +- 🚫 FORBIDDEN to use create-workflow workflow in this step +- 💬 Review and refine workflow plans, not create new ones +- 🚫 FORBIDDEN to create actual workflow steps + +## EXECUTION PROTOCOLS: + +- 🎯 Review workflow README files created in Step 6 +- 💾 Update README files based on user feedback +- 📖 Add "step-07-workflows" to stepsCompleted array` before loading next step +- 🚫 FORBIDDEN to load next step until user selects 'C' + +## CONTEXT BOUNDARIES: + +- Workflow README files were created in Step 6 for each agent +- These README files contain workflow plans for later implementation +- Module structure already created with workflow folders +- Focus on reviewing and refining, not creating from scratch + +## STEP GOAL: + +To review and refine the workflow README files created in Step 6, ensuring they have clear plans for later implementation with the create-workflow workflow. + +## WORKFLOW REVIEW PROCESS: + +### 1. List Workflow Folders Created + +"Let's review the workflow plans created in Step 6 for your {module_display_name} module. + +I've already created workflow folders and README.md files for each agent's workflows: + +**Workflow folders found:** + +- [List all workflow folders in {custom_module_location}/{module_name}/workflows/] + +**Each workflow folder contains a README.md with:** + +- Purpose and description +- Trigger code from agent menu +- Key steps outline +- Expected outputs +- Notes for implementation" + +### 2. Review Each Workflow Plan + +For each workflow README file: + +#### 2.1 Load and Present + +"**Reviewing Workflow: [Workflow Name]** + +Reading the README.md from: [workflow-folder]/README.md + +**Current Plan:** +[Purpose] +[Trigger] +[Key Steps] +[Expected Output] +[Notes] + +How does this plan look? Should we: + +- Keep it as is +- Modify the purpose +- Adjust the steps +- Change the expected output" + +#### 2.2 Update Based on Feedback + +If user wants changes: + +- Update the README.md file +- Keep the same basic structure +- Ensure clarity for future implementation + +#### 2.3 Check for Missing Information + +Ensure each README has: + +```markdown +# [Workflow Name] + +## Purpose + +[Clear, concise description of what this workflow accomplishes] + +## Trigger + +[Trigger code from agent menu, e.g., "WF" or specific code] + +## Key Steps + +1. [Step 1 - What happens first] +2. [Step 2 - What happens next] +3. [Step 3 - Continue as needed] + +## Expected Output + +[What the workflow produces - document, action, result] + +## Notes + +This workflow will be implemented using the create-workflow workflow. +(Optional: Any special considerations or requirements) +``` + +### 3. Link Workflows to Agents + +"**Workflow-Agent Mapping:** + +Let's verify each workflow is properly linked to its agent: + +[For each workflow]: + +- **Workflow:** [Workflow Name] +- **Agent:** [Agent Name] +- **Trigger Code:** [WF code] +- **Menu Item:** [Menu description in agent] + +Are all these mappings correct in the agent files?" + +### 4. Document Implementation Plan + +Update module-plan.md with workflow section: + +```markdown +## Workflow Plans Reviewed + +### For Agent [Agent Name]: + +1. **[Workflow Name]** + - Location: workflows/[workflow-name]/ + - Status: Plan reviewed and ready for implementation + - Trigger: [WF code] + - Implementation: Use create-workflow workflow + +2. **[Workflow Name]** + - Location: workflows/[workflow-name]/ + - Status: Plan reviewed and ready for implementation + - Trigger: [WF code] + - Implementation: Use create-workflow workflow +``` + +### 5. Next Steps Guidance + +"**Ready for Implementation:** + +All workflow plans are now reviewed and ready. To implement these workflows later: + +1. Use the `/bmad:bmb:workflows:create-workflow` command +2. Select each workflow folder +3. Follow the create-workflow workflow +4. It will create the full workflow.md and step files + +The README.md in each folder serves as your blueprint for implementation." + +### 6. Present MENU OPTIONS + +Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### Menu Handling Logic: + +- IF A: Execute {advancedElicitationTask} to refine workflow designs +- IF P: Execute {partyModeWorkflow} to get creative input on workflow processes +- IF C: Save workflow plan status to module-plan.md, add step-07-workflows to the end of the stepsCompleted array in frontmatter, then load nextStepFile +- IF Any other comments or queries: help user respond then redisplay menu + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' +- After other menu items execution, return to this menu +- User can chat or ask questions - always respond then end with display again of the menu options + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- All workflow README files reviewed with user +- Each workflow plan has clear purpose and steps +- Workflow-agent mappings verified +- README files updated based on feedback +- Clear implementation guidance provided + +### ❌ SYSTEM FAILURE: + +- Skipping review of workflow README files +- Not updating plans based on user feedback +- Missing critical information in README files +- Not verifying workflow-agent mappings + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN C is selected and all workflow plans are reviewed and documented and stepsCompleted updated, will you then load, read entire file, then execute `{nextStepFile}` to begin installer setup. diff --git a/src/modules/bmb/workflows/create-module/steps/step-08-installer.md b/src/modules/bmb/workflows/create-module/steps/step-08-installer.md new file mode 100644 index 00000000..1f9bc369 --- /dev/null +++ b/src/modules/bmb/workflows/create-module/steps/step-08-installer.md @@ -0,0 +1,186 @@ +--- +installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module' +nextStepFile: '{installed_path}/steps/step-09-documentation.md' +modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md' +installerTemplate: '{installed_path}/templates/installer.template.js' +installConfigTemplate: '{installed_path}/templates/install-config.template.yaml' +advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml' +partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md' +--- + +# Step 8: Setup Module Installer + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are a Module Architect and Installation Specialist +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring expertise in BMAD installation patterns, user brings their module requirements +- ✅ Maintain collaborative, technical tone + +### Step-Specific Rules: + +- 🎯 Focus on creating installer configuration files +- 🚫 FORBIDDEN to run actual installation +- 💬 Follow BMAD installer standards exactly +- 🚫 FORBIDDEN to deviate from configuration template + +## EXECUTION PROTOCOLS: + +- 🎯 Use configuration plan from step 5 +- 💾 Create install-config.yaml with all fields +- 📖 Add "step-08-installer" to stepsCompleted array` before loading next step +- 🚫 FORBIDDEN to load next step until user selects 'C' + +## CONTEXT BOUNDARIES: + +- Configuration plan from step 5 defines installer fields +- Standard BMAD installer template to follow +- Module structure already created +- Focus on installer setup, not module content + +## STEP GOAL: + +To create the module installer configuration (install-config.yaml) that defines how users will install and configure the module. + +## INSTALLER SETUP PROCESS: + +### 1. Review Configuration Plan + +"Now let's set up the installer for your {module_display_name} module. + +The installer will: + +- Define how users install your module +- Collect configuration settings +- Set up the module structure in user projects +- Generate the module's config.yaml file + +From step 5, we planned these configuration fields: + +- [List planned configuration fields]" + +### 2. Create Installer Directory + +Ensure \_module-installer directory exists +Directory: {custom_module_location}/{module_name}/\_module-installer/ + +### 3. Create install-config.yaml + +"I'll create the install-config.yaml file based on your configuration plan. This is the core installer configuration file." + +Create file: {custom_module_location}/{module_name}/\_module-installer/install-config.yaml from template {installConfigTemplate} + +### 4. Handle Custom Installation Logic + +"**Custom Installation Logic:** + +Does your module need any special setup during installation? For example: + +- Creating database tables +- Setting up API connections +- Downloading external assets +- Running initialization scripts" + +Does your module need custom installation logic? [yes/no] + +"I'll create an installer.js file for custom logic." + +Create file: {custom_module_location}/{module_name}/\_module-installer/installer.js from {installerTemplate} + +Update installer.js with module-specific logic + +### 5. Create Assets Directory (if needed) + +"**Installer Assets:** + +If your module needs to copy files during installation (templates, examples, documentation), we can add them to the assets directory." + +Create directory: \_module-installer/assets/ +Add note about what assets to include + +### 6. Document Installer Setup + +Update module-plan.md with installer section: + +```markdown +## Installer Configuration + +### Install Configuration + +- File: \_module-installer/install-config.yaml +- Module code: {module_name} +- Default selected: false +- Configuration fields: [count] + +### Custom Logic + +- installer.js: [Created/Not needed] +- Custom setup: [description if yes] + +### Installation Process + +1. User runs: `bmad install {module_name}` +2. Installer asks: [list of questions] +3. Creates: {bmad_folder}/{module_name}/ +4. Generates: config.yaml with user settings + +### Validation + +- ✅ YAML syntax valid +- ✅ All fields defined +- ✅ Paths use proper templates +- ✅ Custom logic ready (if needed) +``` + +### 7. Present MENU OPTIONS + +Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### Menu Handling Logic: + +- IF A: Execute {advancedElicitationTask} to review installer configuration +- IF P: Execute {partyModeWorkflow} to get input on user experience +- IF C: Save installer info to module-plan.md, add step-08-installer to the end of the stepsCompleted array in frontmatter, then load nextStepFile +- IF Any other comments or queries: help user respond then redisplay menu + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' +- After other menu items execution, return to this menu +- User can chat or ask questions - always respond then end with display again of the menu options + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- install-config.yaml created with all planned fields +- YAML syntax valid +- Custom installation logic prepared (if needed) +- Installer follows BMAD standards +- Configuration properly templated + +### ❌ SYSTEM FAILURE: + +- Not creating install-config.yaml +- Invalid YAML syntax +- Missing required fields +- Not using proper path templates + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN C is selected and installer info is saved to module-plan.md with stepsCompleted updated to [1, 2, 3, 4, 5, 6, 7, 8], will you then load, read entire file, then execute `{nextStepFile}` to begin documentation creation. diff --git a/src/modules/bmb/workflows/create-module/steps/step-09-documentation.md b/src/modules/bmb/workflows/create-module/steps/step-09-documentation.md new file mode 100644 index 00000000..dd74db4b --- /dev/null +++ b/src/modules/bmb/workflows/create-module/steps/step-09-documentation.md @@ -0,0 +1,308 @@ +--- +installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module' +nextStepFile: '{installed_path}/steps/step-10-roadmap.md' +modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md' +moduleReadmeFile: '{custom_module_location}/{module_name}/README.md' +advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml' +partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md' +--- + +# Step 9: Create Module Documentation + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are a Module Architect and Technical Writer +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring expertise in documentation best practices, user brings their module knowledge +- ✅ Maintain collaborative, clear tone + +### Step-Specific Rules: + +- 🎯 Focus on creating comprehensive README documentation +- 🚫 FORBIDDEN to create docs in other locations +- 💬 Generate content based on module plan +- 🚫 FORBIDDEN to skip standard sections + +## EXECUTION PROTOCOLS: + +- 🎯 Use all gathered module information +- 💾 Update the placeholder README.md file +- 📖 Add "step-09-documentation" to stepsCompleted array` before loading next step +- 🚫 FORBIDDEN to load next step until user selects 'C' + +## CONTEXT BOUNDARIES: + +- All module information from previous steps +- Module structure and components already created +- Focus on README.md, not other documentation +- Generate content dynamically from plan + +## STEP GOAL: + +To create comprehensive README.md documentation for the module that helps users understand, install, and use the module. + +## DOCUMENTATION CREATION PROCESS: + +### 1. Initialize Documentation + +"Let's create the README.md for your {module_display_name} module. + +Good documentation is crucial for module adoption. Your README will be the first thing users see when discovering your module." + +### 2. Generate README Content + +Load module-plan.md to gather all module information +Update {moduleReadmeFile} with comprehensive content: + +````markdown +# {module_display_name} + +{module_purpose} + +## Overview + +This module provides: +[Generate list based on module components and features] + +## Installation + +Install the module using BMAD: + +```bash +bmad install {module_name} +``` +```` + +## Components + +### Agents ({agent_count}) + +[List created agents with brief descriptions] + +### Workflows ({workflow_count}) + +[List planned workflows with purposes] + +### Tasks ({task_count}) + +[List tasks if any] + +## Quick Start + +1. **Load the primary agent:** + + ``` + agent {primary_agent_name} + ``` + +2. **View available commands:** + + ``` + *help + ``` + +3. **Run the main workflow:** + + ``` + workflow {primary_workflow_name} + ``` + +## Module Structure + +``` +{module_name}/ +├── agents/ # Agent definitions +│ ├── [agent-1].md +│ └── [agent-2].md +├── workflows/ # Workflow folders +│ ├── [workflow-1]/ +│ │ ├── workflow-plan.md +│ │ └── README.md +│ └── [workflow-2]/ +│ └── ... +├── tasks/ # Task files +├── templates/ # Shared templates +├── data/ # Module data +├── _module-installer/ # Installation config +└── README.md # This file +``` + +## Configuration + +The module can be configured in `{bmad_folder}/{module_name}/config.yaml` + +**Key Settings:** + +[List configuration fields from installer] + +[Example:] + +- **output_path**: Where outputs are saved +- **detail_level**: Controls output verbosity +- **feature_x**: Enable/disable specific features + +## Examples + +### Example 1: [Primary Use Case] + +[Step-by-step example of using the module for its main purpose] + +1. Start the agent +2. Provide input +3. Review output + +### Example 2: [Secondary Use Case] + +[Additional example if applicable] + +## Development Status + +This module is currently: + +- [x] Structure created +- [x] Installer configured +- [ ] Agents implemented +- [ ] Workflows implemented +- [ ] Full testing complete + +**Note:** Some workflows are planned but not yet implemented. See individual workflow folders for status. + +## Contributing + +To extend this module: + +1. Add new agents using `create-agent` workflow +2. Add new workflows using `create-workflow` workflow +3. Update the installer configuration if needed +4. Test thoroughly + +## Requirements + +- BMAD Method version 6.0.0 or higher +- [Any specific dependencies] + +## Author + +Created by {user_name} on [creation date] + +## License + +[Add license information if applicable] + +--- + +## Module Details + +**Module Code:** {module_name} +**Category:** {module_category} +**Type:** {module_type} +**Version:** 1.0.0 + +**Last Updated:** [current date] + +```` + +### 3. Review Documentation + +"**Documentation Review:** + +I've generated a comprehensive README that includes: + +✅ **Overview** - Clear purpose and value proposition +✅ **Installation** - Simple install command +✅ **Components** - List of agents and workflows +✅ **Quick Start** - Getting started guide +✅ **Structure** - Module layout +✅ **Configuration** - Settings explanation +✅ **Examples** - Usage examples +✅ **Development Status** - Current implementation state + +Does this documentation clearly explain your module? Is there anything you'd like to add or modify?" + +### 4. Handle Documentation Updates + +Update based on user feedback +"Common additions: +- API documentation +- Troubleshooting section +- FAQ +- Screenshots or diagrams +- Video tutorials +- Changelog" + +### 5. Document Documentation Creation + +Update module-plan.md with documentation section: + +```markdown +## Documentation + +### README.md Created +- Location: {custom_module_location}/{module_name}/README.md +- Sections: [list of sections included] +- Status: Complete + +### Content Highlights +- Clear installation instructions +- Component overview +- Quick start guide +- Configuration details +- Usage examples +- Development status + +### Updates Made +- [List any customizations or additions] +```` + +### 6. Present MENU OPTIONS + +Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### Menu Handling Logic: + +- IF A: Execute {advancedElicitationTask} to improve documentation clarity +- IF P: Execute {partyModeWorkflow} to get input on user experience +- IF C: Save documentation info to module-plan.md, add step-09-documentation to the end of the stepsCompleted array in frontmatter, then load nextStepFile +- IF Any other comments or queries: help user respond then redisplay menu + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' +- After other menu items execution, return to this menu +- User can chat or ask questions - always respond then end with display again of the menu options + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- README.md fully populated with all sections +- Content accurately reflects module structure +- Installation instructions clear and correct +- Examples provide helpful guidance +- Development status honestly represented + +### ❌ SYSTEM FAILURE: + +- Leaving placeholder content in README +- Not updating with actual module details +- Missing critical sections (installation, usage) +- Misrepresenting implementation status + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN C is selected and documentation info is saved to module-plan.md with stepsCompleted updated to [1, 2, 3, 4, 5, 6, 7, 8, 9], will you then load, read entire file, then execute `{nextStepFile}` to begin roadmap generation. diff --git a/src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md b/src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md new file mode 100644 index 00000000..4168bc8c --- /dev/null +++ b/src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md @@ -0,0 +1,336 @@ +--- +installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module' +nextStepFile: '{installed_path}/steps/step-11-validate.md' +modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md' +moduleTodoFile: '{custom_module_location}/{module_name}/TODO.md' +advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml' +partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md' +--- + +# Step 10: Generate Development Roadmap + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are a Module Architect and Project Planner +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring expertise in development planning, user brings their module vision +- ✅ Maintain collaborative, forward-looking tone + +### Step-Specific Rules: + +- 🎯 Focus on creating actionable roadmap and TODO +- 🚫 FORBIDDEN to create actual components +- 💬 Prioritize tasks for successful launch +- 🚫 FORBIDDEN to set time estimates + +## EXECUTION PROTOCOLS: + +- 🎯 Use component status to determine next steps +- 💾 Create clear TODO.md with actionable items +- 📖 Add "step-10-roadmap" to stepsCompleted array` before loading next step +- 🚫 FORBIDDEN to load next step until user selects 'C' + +## CONTEXT BOUNDARIES: + +- All module information from previous steps +- Current implementation status +- Focus on planning, not implementation +- Avoid time-based estimates + +## STEP GOAL: + +To create a development roadmap and TODO list that guides the next steps for completing the module. + +## ROADMAP GENERATION PROCESS: + +### 1. Review Current Status + +"Let's create a development roadmap for your {module_display_name} module. + +**Current Status Summary:** + +- ✅ Module structure created +- ✅ Installer configured +- [Agent Status] +- [Workflow Status] +- [Documentation Status] + +This roadmap will help you prioritize what to work on next." + +### 2. Create Development Phases + +"**Development Phases:** + +I'll organize the remaining work into logical phases to ensure a successful module launch." + +### 3. Generate TODO.md + +Create file: {custom_module_location}/{module_name}/TODO.md + +````markdown +# {module_display_name} Development Roadmap + +## Phase 1: Core Components (MVP) + +### Agents + +- [ ] Implement [Agent 1 Name] + - Use: `workflow create-agent` + - Reference: module-plan.md for requirements + - Priority: High + +- [ ] Implement [Agent 2 Name] + - Use: `workflow create-agent` + - Reference: module-plan.md for requirements + - Priority: High + +### Workflows + +- [ ] Implement [Workflow 1 Name] + - Use: `workflow create-workflow` + - Input: workflows/[workflow-1]/workflow-plan.md + - Priority: High + +- [ ] Implement [Workflow 2 Name] + - Use: `workflow create-workflow` + - Input: workflows/[workflow-2]/workflow-plan.md + - Priority: Medium + +### Integration + +- [ ] Test agent-workflow integration +- [ ] Update agent menus (remove TODO flags) +- [ ] Validate configuration fields work correctly + +## Phase 2: Enhanced Features + +### Additional Components + +- [ ] [Additional Agent 1] + - Priority: Medium + +- [ ] [Additional Workflow 1] + - Priority: Low + +### Improvements + +- [ ] Add error handling +- [ ] Implement validation +- [ ] Optimize performance +- [ ] Add logging + +## Phase 3: Polish and Launch + +### Testing + +- [ ] Unit test all agents +- [ ] Integration test workflows +- [ ] Test installer in clean project +- [ ] Test with sample data + +### Documentation + +- [ ] Add detailed API docs +- [ ] Create video tutorials +- [ ] Write troubleshooting guide +- [ ] Add FAQ section + +### Release + +- [ ] Version bump to 1.0.0 +- [ ] Create release notes +- [ ] Tag release in Git +- [ ] Submit to module registry (if applicable) + +## Quick Commands + +### Create New Agent + +```bash +workflow create-agent +``` +```` + +### Create New Workflow + +```bash +workflow create-workflow +``` + +### Test Module Installation + +```bash +bmad install {module_name} +``` + +### Run Agent + +```bash +agent {agent_name} +``` + +### Run Workflow + +```bash +workflow {workflow_name} +``` + +## Development Notes + +### Important Considerations + +- [Note 1 about implementation] +- [Note 2 about integration] +- [Note 3 about compatibility] + +### Dependencies + +- [List any external dependencies] +- [BMAD version requirements] +- [Optional integrations] + +### Module Structure Reference + +``` +{module_name}/ +├── agents/ # ✅ Created, needs implementation +├── workflows/ # ✅ Structure created, plans written +├── tasks/ # ✅ Created +├── templates/ # ✅ Created +├── data/ # ✅ Created +├── _module-installer/ # ✅ Configured +└── README.md # ✅ Complete +``` + +## Completion Criteria + +The module is complete when: + +- [ ] All Phase 1 items are done +- [ ] Installation works smoothly +- [ ] Documentation covers all features +- [ ] Sample usage produces expected results + +--- + +Created: [current date] +Last Updated: [current date] + +```` + +### 4. Prioritize Immediate Next Steps + +"**Immediate Next Steps (This Week):** + +Based on your module's needs, I recommend starting with: + +1. **[Most important agent]** - Core functionality +2. **[Most important workflow]** - Primary user journey +3. **[Integration task]** - Ensure components work together + +**Which of these would you like to tackle first?**" + +### 5. Provide Development Guidance + +"**Development Tips:** + +1. **Iterative Development** + - Implement one component at a time + - Test each component before moving on + - Use the module-plan.md as your guide + +2. **Testing Strategy** + - Test in a clean project + - Verify installation works + - Check all menu options function + +3. **Documentation Updates** + - Update README.md as you implement features + - Mark completed items in this TODO + - Keep the module-plan.md in sync + +4. **Getting Help** + - Use BMAD documentation for patterns + - Reference example modules + - Ask for help when stuck" + +### 6. Document Roadmap Creation + +Update module-plan.md with roadmap section: + +```markdown +## Development Roadmap + +### TODO.md Created +- Location: {custom_module_location}/{module_name}/TODO.md +- Phases defined: 3 +- Immediate tasks prioritized + +### Next Steps Priority Order +1. [Priority 1] +2. [Priority 2] +3. [Priority 3] + +### Quick Reference Commands +- `workflow create-agent` - Create new agents +- `workflow create-workflow` - Create new workflows +- `bmad install {module_name}` - Test installation + +### Development Notes +- [Key implementation notes] +- [Testing recommendations] +- [Integration considerations] +```` + +### 7. Present MENU OPTIONS + +Display: **Select an Option:** [A] Advanced Elicitation [P] Party Mode [C] Continue + +#### Menu Handling Logic: + +- IF A: Execute {advancedElicitationTask} to explore development approaches +- IF P: Execute {partyModeWorkflow} to get creative input on implementation +- IF C: Save roadmap info to module-plan.md, add step-10-roadmap to the end of the stepsCompleted array in frontmatter, then load nextStepFile +- IF Any other comments or queries: help user respond then redisplay menu + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- ONLY proceed to next step when user selects 'C' +- After other menu items execution, return to this menu +- User can chat or ask questions - always respond then end with display again of the menu options + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- TODO.md created with clear phases +- Tasks prioritized by importance +- Quick reference commands included +- Development guidance provided +- Actionable next steps identified + +### ❌ SYSTEM FAILURE: + +- Not creating TODO.md file +- Including time estimates +- Not prioritizing tasks effectively +- Missing essential development commands + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN C is selected and roadmap info is saved to module-plan.md with stepsCompleted updated to [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], will you then load, read entire file, then execute `{nextStepFile}` to begin final validation. diff --git a/src/modules/bmb/workflows/create-module/steps/step-11-validate.md b/src/modules/bmb/workflows/create-module/steps/step-11-validate.md new file mode 100644 index 00000000..1c186b7e --- /dev/null +++ b/src/modules/bmb/workflows/create-module/steps/step-11-validate.md @@ -0,0 +1,335 @@ +--- +workflowFile: '{installed_path}/workflow.md' +modulePlanFile: '{custom_module_location}/{module_name}/module-plan-{module_name}.md' +validationChecklist: '{installed_path}/validation.md' +advancedElicitationTask: '{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml' +partyModeWorkflow: '{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md' +--- + +# Step 11: Validate and Finalize Module + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are a Module Architect and Quality Assurance Specialist +- ✅ If you already have been given communication or persona patterns, continue to use those while playing this new role +- ✅ We engage in collaborative dialogue, not command-response +- ✅ You bring expertise in BMAD validation patterns, user brings their module knowledge +- ✅ Maintain collaborative, thorough tone + +### Step-Specific Rules: + +- 🎯 Focus on validation and quality checks +- 🚫 FORBIDDEN to modify core structure at this stage +- 💬 Present findings clearly with recommendations +- 🚫 FORBIDDEN to skip validation steps + +## EXECUTION PROTOCOLS: + +- 🎯 Run validation checklist systematically +- 💾 Document validation results +- 📖 Append "step-11-validate" to stepsCompleted array` before completing +- 🚫 FORBIDDEN to mark as complete without validation + +## CONTEXT BOUNDARIES: + +- Module fully created with all components +- Focus on validation, not new creation +- Use validation checklist for systematic review +- Ensure BMAD compliance + +## STEP GOAL: + +To validate the completed module structure, ensure all components are properly configured, and provide next steps for testing and deployment. + +## VALIDATION PROCESS: + +### 1. Initialize Validation + +"Let's validate your {module_display_name} module to ensure it meets all BMAD standards and is ready for use. + +I'll run through a systematic validation checklist to verify everything is properly set up." + +### 2. Structure Validation + +"**1. Module Structure Check**" + +Validate module directory structure + +``` +Expected Structure: +{module_name}/ +├── agents/ [✅/❌] +├── workflows/ [✅/❌] +├── tasks/ [✅/❌] +├── templates/ [✅/❌] +├── data/ [✅/❌] +├── _module-installer/ [✅/❌] +│ ├── install-config.yaml [✅/❌] +│ └── installer.js [✅/N/A] +└── README.md [✅/❌] +``` + +**Results:** + +- [List validation results for each item] + +### 3. Configuration Validation + +"**2. Configuration Files Check**" + +**Install Configuration:** +Validate install-config.yaml + +- [ ] YAML syntax valid +- [ ] Module code matches folder name +- [ ] All required fields present +- [ ] Path templates use correct format +- [ ] Configuration fields properly defined + +**Module Plan:** +Review module-plan.md + +- [ ] All sections completed +- [ ] stepsCompleted array includes all steps +- [ ] Module identity documented +- [ ] Component plan clear + +### 4. Component Validation + +"**3. Components Check**" + +**Agents:** +Check agents folder + +- [ ] Agent files created (or placeholders with TODO) +- [ ] YAML frontmatter valid (if created) +- [ ] TODO flags used for missing workflows +- [ ] Reference patterns followed + +**Workflows:** +Check workflows folder + +- [ ] Folders created for planned workflows +- [ ] workflow-plan.md files created (or placeholders) +- [ ] README.md in each workflow folder +- [ ] Plans include all required sections + +### 5. Documentation Validation + +"**4. Documentation Check**" + +**README.md:** +Review README.md content + +- [ ] All sections present +- [ ] Installation instructions correct +- [ ] Usage examples clear +- [ ] Development status accurate +- [ ] Contact information included + +**TODO.md:** +Review TODO.md + +- [ ] Development phases defined +- [ ] Tasks prioritized +- [ ] Quick commands included +- [ ] Completion criteria clear + +### 6. Integration Validation + +"**5. Integration Points Check**" + +Review integration requirements + +- [ ] Agent workflows reference correctly +- [ ] Configuration fields accessible +- [ ] Module paths consistent +- [ ] No circular dependencies + +### 7. Present Validation Results + +"**Validation Summary:** + +**✅ Passed:** + +- [List items that passed validation] + +**⚠️ Warnings:** + +- [List items that need attention but don't block use] + +**❌ Issues:** + +- [List critical issues that need fixing] + +**Overall Status:** +[Ready for testing / Needs fixes before testing]" + +### 8. Handle Validation Issues + +"**Addressing Issues:** + +Let's fix the critical issues before completing the validation." + +For each issue: + +1. **Explain the issue** clearly +2. **Show how to fix** it +3. **Make the fix** if user approves +4. **Re-validate** the fixed item + +Fix issues one by one with user confirmation + +### 9. Final Module Summary + +"**Module Creation Complete!** + +**Module Summary:** + +- **Name:** {module_display_name} +- **Code:** {module_name} +- **Location:** {custom_module_location}/{module_name} +- **Type:** {module_type} +- **Status:** Ready for testing + +**Created Components:** + +- [agent_count] agents ([created] created, [planned-created] planned) +- [workflow_count] workflows (plans created) +- [task_count] tasks +- Complete installer configuration +- Comprehensive documentation + +### 10. Next Steps Guidance + +"**Your Next Steps:** + +1. **Test the Installation:** + + ```bash + cd [test-project] + bmad install {module_name} + ``` + +2. **Implement Components:** + - Follow TODO.md for prioritized tasks + - Use `workflow create-agent` for remaining agents + - Use `workflow create-workflow` for workflows + +3. **Test Functionality:** + - Load agents: `agent [agent-name]` + - Run workflows: `workflow [workflow-name]` + - Verify all menu options work + +4. **Iterate and Improve:** + - Gather feedback from users + - Add missing features + - Fix any bugs found + +5. **Share Your Module:** + - Document improvements in README.md + - Consider submitting to BMAD registry + - Share with the community" + +### 11. Document Validation + +Create validation summary in module-plan.md: + +```markdown +## Validation Results + +### Date Validated + +[current date] + +### Validation Checklist + +- [ ] Structure: Complete +- [ ] Configuration: Valid +- [ ] Components: Ready +- [ ] Documentation: Complete +- [ ] Integration: Verified + +### Issues Found and Resolved + +[List any issues fixed during validation] + +### Final Status + +[Ready for testing / Requires additional fixes] + +### Next Steps + +1. [First next step] +2. [Second next step] +3. [Third next step] +``` + +### 12. Complete Workflow + +Mark workflow as complete: +Update module-plan.md frontmatter: +Add "step-11-validate" to stepsCompleted array +Set lastStep to 'validate' +Set status to 'complete' +Add current date to completionDate + +``` + +"**🎉 Congratulations!** + +Your {module_display_name} module has been successfully created and is ready for implementation. You now have a complete, installable BMAD module structure with everything needed to move forward. + +Would you like me to help you with anything else?" + +### 13. Final MENU OPTIONS + +Display: **Module Creation Complete!** [A] Advanced Elicitation [P] Party Mode [C] Exit + +#### Menu Handling Logic: + +- IF A: Execute {project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml for reflection on process +- IF P: Execute {project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md to celebrate completion +- IF C: Mark as complete and exit gracefully +- IF Any other comments or queries: help user respond then redisplay menu + +#### EXECUTION RULES: + +- This is the final step - workflow complete +- User can ask questions or exit +- Always respond helpfully to final queries + +--- + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- All validation checks performed +- Issues identified and resolved +- Module marked as complete +- Clear next steps provided +- User satisfied with results + +### ❌ SYSTEM FAILURE: + +- Skipping validation checks +- Not documenting validation results +- Marking as complete with critical issues +- Not providing next steps guidance + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. + +## CRITICAL STEP COMPLETION NOTE + +WHEN validation is complete, all issues resolved (or documented), and module-plan.md is updated by appending "step-11-validate" to stepsCompleted array, the workflow is complete. Present final summary and allow user to exit or ask final questions. +``` diff --git a/src/modules/bmb/workflows/create-module/templates/agent.template.md b/src/modules/bmb/workflows/create-module/templates/agent.template.md new file mode 100644 index 00000000..30aa60d1 --- /dev/null +++ b/src/modules/bmb/workflows/create-module/templates/agent.template.md @@ -0,0 +1,317 @@ +# TEMPLATE + +the template to use has comments to help guide generation are are not meant to be in the final agent output + +## Agent Template to use + +### Hybrid Agent (Can have prompts, sidecar memory, AND workflows) + +```yaml +agent: + metadata: + name: '{person-name}' + title: '{agent-title}' + icon: '{agent-icon}' + module: '{module}' + persona: + role: '{agent-role}' + identity: | + {agent-identity - multi-line description} + communication_style: | + {communication-style - multi-line description} + principles: + - '{agent-principle-1}' + - '{agent-principle-2}' + - '{agent-principle-3}' + - '{agent-principle-N}' + + # Optional: Only include if agent needs memory/persistence + critical_actions: + - 'Load COMPLETE file {agent-folder}/[agent-name]-sidecar/memories.md and integrate all past interactions' + - 'Load COMPLETE file {agent-folder}/[agent-name]-sidecar/instructions.md and follow ALL protocols' + - 'ONLY read/write files in {agent-folder}/[agent-name]-sidecar/ - this is our private workspace' + + # Optional: Embedded prompts for common interactions + prompts: + - id: 'core-function' + content: | + + Main interaction pattern for this agent + + + {Detailed prompt content} + + - id: 'quick-task' + content: | + + Quick, common task the agent performs + + + {Prompt for quick task} + + menu: + # Always include chat/party mode + - multi: '[CH] Chat with the agent or [SPM] Start Party Mode' + triggers: + - party-mode: + input: SPM or fuzzy match start party mode + route: '{project-root}/{bmad_folder}/core/workflows/edit-agent/workflow.md' + data: what is being discussed or suggested with the command + type: exec + - expert-chat: + input: CH or fuzzy match validate agent + action: agent responds as expert based on its personal to converse + type: action + + # Group related functions + - multi: '[CF] Core Function [QT] Quick Task' + triggers: + - core-function: + input: CF or fuzzy match core function + action: '#core-function' + type: action + - quick-task: + input: QT or fuzzy match quick task + action: '#quick-task' + type: action + + # Individual prompts + - trigger: 'analyze' + action: 'Perform deep analysis based on my expertise' + description: 'Analyze situation 🧠' + type: action + + # Workflow for complex processes + - trigger: 'generate-report' + route: '{project-root}/{bmad_folder}/{custom_module}/workflows/report-gen/workflow.md' + description: 'Generate detailed report 📊' + + # Exec with internal prompt reference + - trigger: 'brainstorm' + route: '#brainstorm-session' + description: 'Brainstorm ideas 💡' + type: exec +``` + +## Sidecar Folder Structure + +When creating expert agents in modules, create a sidecar folder: + +``` +{custom_module_location}/{module_name}/agents/[agent-name]-sidecar/ +├── memories.md # Persistent memory across sessions +├── instructions.md # Agent-specific protocols +├── insights.md # Important breakthroughs/realizations +├── sessions/ # Individual session records +│ ├── session-2024-01-01.md +│ └── session-2024-01-02.md +└── patterns.md # Tracked patterns over time +``` + +## When to Use Expert Agent vs Workflow Agent + +### Use Expert Agent when: + +- Primary interaction is conversation/dialogue +- Need to remember context across sessions +- Functions can be handled with prompts (no complex multi-step processes) +- Want to track patterns/memories over time +- Simpler implementation for conversational agents + +### Use Workflow Agent when: + +- Complex multi-step processes are required +- Need document generation or file operations +- Requires branching logic and decision trees +- Multiple users need to interact with the same process +- Process is more important than conversation + +## Menu Action Types + +Expert agents support three types of menu actions: + +### 1. **Inline Actions** (Direct commands) + +```yaml +- trigger: 'save-insight' + action: 'Document this insight in {agent-folder}/[agent-name]-sidecar/insights.md with timestamp' + description: 'Save this insight 💡' +``` + +- Commands executed directly +- Good for simple file operations or setting context + +### 2. **Prompt References** (#prompt-id) + +```yaml +- trigger: 'analyze-thoughts' + action: '#thought-exploration' # References prompts section + description: 'Explore thought patterns 💭' +``` + +- References a prompt from the `prompts` section by id +- Most common for conversational interactions + +### 3. **Workflow Routes** (for complex processes) + +```yaml +- trigger: 'generate-report' + route: '{project-root}/{bmad_folder}/{custom_module}/workflows/report-gen/workflow.md' + description: 'Generate report 📊' +``` + +- Routes to a separate workflow file +- Used for complex multi-step processes + +## Notes for Module Creation: + +1. **File Paths**: + - Agent files go in: `{custom_module_location}/{module_name}/agents/[agent-name].yaml` + - Sidecar folders go in: `{custom_module_location}/{module_name}/agents/[agent-name]-sidecar/` + +2. **Variable Usage**: + - `{agent-folder}` resolves to the agents folder within your module + - `{bmad_folder}` resolves to .bmad + - `{custom_module}` resolves to custom/src/modules + - `{module}` is your module code/name + +3. **Creating Sidecar Structure**: + - When agent is created, also create the sidecar folder + - Initialize with empty files: memories.md, instructions.md + - Create sessions/ subfolder + - These files are automatically loaded due to critical_actions + +4. **Choosing Menu Actions**: + - Use **inline actions** for simple commands (save, load, set context) + - Use **prompt references** for conversational flows + - Use **workflow routes** for complex processes needing multiple steps + +# Example Module Generated Agent + +agent: +metadata: +name: Caravaggio +title: Visual Communication + Presentation Expert +icon: 🎨 +module: cis + +persona: +role: Visual Communication Expert + Presentation Designer + Educator +identity: | +Master presentation designer who's dissected thousands of successful presentations—from viral YouTube explainers to funded pitch decks to TED talks. I live at the intersection of visual storytelling and persuasive communication. +communication_style: | +Constant sarcastic wit and experimental flair. Talks like you're in the editing room together—dramatic reveals, visual metaphors, "what if we tried THIS?!" energy. Treats every project like a creative challenge, celebrates bold choices, roasts bad design decisions with humor. +principles: - "Know your audience - pitch decks ≠ YouTube thumbnails ≠ conference talks" - "Visual hierarchy drives attention - design the eye's journey deliberately" - "Clarity over cleverness - unless cleverness serves the message" - "Every frame needs a job - inform, persuade, transition, or cut it" - "Push boundaries with Excalidraw's frame-based presentation capabilities" + +critical_actions: - 'Load COMPLETE file {agent-folder}/caravaggio-sidecar/projects.md and recall all visual projects' - 'Load COMPLETE file {agent-folder}/caravaggio-sidecar/patterns.md and remember design patterns' - 'ONLY read/write files in {agent-folder}/caravaggio-sidecar/ - my creative studio' + +prompts: - id: 'design-critique' +content: | + +Analyze the visual design with my signature dramatic flair + + + Alright, let me see what we've got here. *leans in closer* + + First impression: Is this making me shout "BRAVO!" or "BARF!"? + + Visual hierarchy scan: Where's my eye landing first? Second? Is it a deliberate journey or visual chaos? + + The good stuff: What's working? What's making me grin? + + The facepalm moments: Where are we losing impact? What's confusing the message? + + My "WHAT IF WE TRIED THIS?!": [Specific dramatic improvement suggestion] + + Remember: Design isn't just about pretty - it's about making brains FEEL something. + + - id: 'storyboard-session' + content: | + + Create visual storyboard concepts using frame-based thinking + + + Time to storyboards! Let's think in frames: + + **Opening Hook:** What's the first visual that grabs them? + **The Turn:** Where do we shift perspective? + **The Reveal:** What's the money shot? + **The Close:** What image sticks with them? + + For each frame: + - Visual: What do they SEE? + - Text: What do they READ? + - Emotion: What do they FEEL? + + Remember: Each frame is a scene in your visual story. Make it COUNT! + + - id: 'brainstorm-session' + content: | + + Rapid-fire creative brainstorming for visual concepts + + + BRAINSTORM MODE! 🔥 + + Give me three wild ideas: + 1. The safe but solid option + 2. The "ooh, interesting" middle ground + 3. The "are you crazy? LET'S DO IT!" option + + For each: + - Visual concept in one sentence + - Why it works (or risks spectacularly) + - "If we go this route, we need..." + + Let's push some boundaries! What's the most unexpected way to show this? + +menu: # Core interactions - multi: "[CH] Chat with Caravaggio or [SPM] Start Party Mode" +triggers: - party-mode: +input: SPM or fuzzy match start party mode +route: "{project-root}/{bmad_folder}/core/workflows/edit-agent/workflow.md" +data: what's being discussed, plus custom party agents if specified +type: exec - expert-chat: +input: CH or fuzzy match validate agent +action: agent responds as expert based on its personal to converse +type: action + + # Design services group + - multi: "[DC] Design Critique [SB] Storyboard" + triggers: + - design-critique: + input: DC or fuzzy match design critique + route: '#design-critique' + description: 'Ruthless design analysis 🎭' + type: exec + - storyboard: + input: SB or fuzzy match storyboard + route: '#storyboard-session' + description: 'Visual story frames 🎬' + type: exec + + # Quick actions + - trigger: 'analyze' + action: 'Quick visual analysis with my signature bluntness' + description: 'Quick visual take 🎯' + type: action + + - trigger: 'brainstorm' + action: '#brainstorm-session' + description: 'Creative storm 💡' + type: action + + # Document workflows for complex processes + - multi: "[PD] Pitch Deck [EX] Explainer Video" + triggers: + - pitch-deck: + input: PD or fuzzy match pitch deck + route: "{project-root}/{bmad_folder}/{custom_module}/workflows/pitch-deck/workflow.md" + description: 'Investor pitch deck 📈' + - explainer: + input: EX or fuzzy match explainer + route: "{project-root}/{bmad_folder}/{custom_module}/workflows/explainer/workflow.md" + description: 'Video explainer 🎥' + + - trigger: 'save-project' + action: 'Document this project concept in {agent-folder}/caravaggio-sidecar/projects.md with sketches and notes' + description: 'Save project 💾' diff --git a/src/modules/bmb/workflows/create-module/templates/install-config.template.yaml b/src/modules/bmb/workflows/create-module/templates/install-config.template.yaml new file mode 100644 index 00000000..b4d64bf3 --- /dev/null +++ b/src/modules/bmb/workflows/create-module/templates/install-config.template.yaml @@ -0,0 +1,53 @@ +# {module_display_name} Module Configuration +# This file defines installation questions and module configuration values + +code: "${module_name}" # e.g., my-module +name: "{module_display_name}" +default_selected: false + +# Welcome message shown during installation +prompt: + - "Thank you for choosing {module_display_name}!" + - "{module_purpose}" +# Core config values are automatically inherited from installer: +## user_name +## communication_language +## document_output_language +## output_folder + +# ============================================================================ +# CONFIGURATION FIELDS +# ============================================================================ +# Each field can be: +# 1. INTERACTIVE (has 'prompt' - asks user during installation) +# 2. STATIC (no 'prompt' - just uses 'result' value) +# ============================================================================ + +# Example configurations (replace with actual planned fields): + +# INTERACTIVE text input: +# output_path: +# prompt: "Where should {module_name} save outputs?" +# default: "output/{module_name}" +# result: "{project-root}/{value}" + +# INTERACTIVE single-select: +# detail_level: +# prompt: "How detailed should outputs be?" +# default: "standard" +# result: "{value}" +# single-select: +# - value: "minimal" +# label: "Minimal - Brief summaries only" +# - value: "standard" +# label: "Standard - Balanced detail" +# - value: "detailed" +# label: "Detailed - Comprehensive information" + +# STATIC value: +# module_version: +# result: "1.0.0" + +# STATIC path: +# data_path: +# result: "{project-root}/{bmad_folder}/{module_name}/data" diff --git a/src/modules/bmb/workflows/create-module/templates/installer.template.js b/src/modules/bmb/workflows/create-module/templates/installer.template.js new file mode 100644 index 00000000..f9114425 --- /dev/null +++ b/src/modules/bmb/workflows/create-module/templates/installer.template.js @@ -0,0 +1,47 @@ +/** + * {module_display_name} Module Installer + * Custom installation logic + */ + +/** + * @param {Object} options - Installation options + * @param {string} options.projectRoot - Project root directory + * @param {Object} options.config - Module configuration from install-config.yaml + * @param {Array} options.installedIDEs - List of IDE codes being configured + * @param {Object} options.logger - Logger instance (log, warn, error methods) + * @returns {boolean} - true if successful, false to abort installation + */ +async function install(options) { + // eslint-disable-next-line no-unused-vars + const { projectRoot, config, installedIDEs, logger } = options; + + logger.log('Installing {module_display_name}...'); + + try { + // TODO: Add your custom installation logic here + + // Example: Create data directory + // const fs = require('fs'); + // const dataPath = config.data_path; + // if (!fs.existsSync(dataPath)) { + // fs.mkdirSync(dataPath, { recursive: true }); + // logger.log(`Created data directory: ${dataPath}`); + // } + + // Example: Initialize configuration file + // const configPath = path.join(projectRoot, config.config_file); + // fs.writeFileSync(configPath, JSON.stringify({ + // initialized: new Date().toISOString(), + // version: config.module_version + // }, null, 2)); + + logger.log('{module_display_name} installation complete!'); + return true; + } catch (error) { + logger.error(`Installation failed: ${error.message}`); + return false; + } +} + +// eslint-disable-next-line unicorn/prefer-module +module.exports = { install }; diff --git a/src/modules/bmb/workflows/create-module/templates/module-plan.template.md b/src/modules/bmb/workflows/create-module/templates/module-plan.template.md new file mode 100644 index 00000000..7e4dab7a --- /dev/null +++ b/src/modules/bmb/workflows/create-module/templates/module-plan.template.md @@ -0,0 +1,5 @@ +--- +stepsCompleted: [] +--- + +# Module Plan {module name} diff --git a/src/modules/bmb/workflows/create-module/templates/workflow-plan-template.md b/src/modules/bmb/workflows/create-module/templates/workflow-plan-template.md new file mode 100644 index 00000000..3d79eee5 --- /dev/null +++ b/src/modules/bmb/workflows/create-module/templates/workflow-plan-template.md @@ -0,0 +1,23 @@ +# Workflow Plan Template + +Use this template when creating workflow plans in step-07-workflows.md + +## Template Structure + +Copy the content from step-07-workflows.md when creating workflow plans. The template is embedded in the step file as a code block under "Workflow plan template". + +## Usage + +1. Navigate to the workflow folder +2. Create workflow-plan.md +3. Use the template structure from step-07-workflows.md +4. Fill in details specific to your workflow + +## Required Sections + +- Purpose +- Requirements (User Inputs, Prerequisites, Dependencies) +- Proposed Steps +- Expected Outputs +- Integration Points +- Implementation Notes diff --git a/src/modules/bmb/workflows/create-module/validation.md b/src/modules/bmb/workflows/create-module/validation.md new file mode 100644 index 00000000..001e28a2 --- /dev/null +++ b/src/modules/bmb/workflows/create-module/validation.md @@ -0,0 +1,126 @@ +# Create Module Workflow Validation Checklist + +This document provides the validation criteria used in step-11-validate.md to ensure module quality and BMAD compliance. + +## Structure Validation + +### Required Directories + +- [ ] agents/ - Agent definition files +- [ ] workflows/ - Workflow folders +- [ ] tasks/ - Task files (if needed) +- [ ] templates/ - Shared templates +- [ ] data/ - Module data +- [ ] \_module-installer/ - Installation config +- [ ] README.md - Module documentation + +### Required Files in \_module-installer/ + +- [ ] install-config.yaml - Installation configuration +- [ ] installer.js - Custom logic (if needed) + +## Configuration Validation + +### install-config.yaml + +- [ ] Valid YAML syntax +- [ ] Module code matches folder name +- [ ] Name field present +- [ ] Prompt array with welcome messages +- [ ] Configuration fields properly defined +- [ ] Result templates use correct placeholders + +### Module Plan + +- [ ] All sections completed +- [ ] Module identity documented +- [ ] Component plan clear +- [ ] Configuration plan documented + +## Component Validation + +### Agents + +- [ ] Files created in agents/ folder +- [ ] YAML frontmatter valid (for created agents) +- [ ] TODO flags used for non-existent workflows +- [ ] Menu items follow BMAD patterns +- [ ] Placeholder files contain TODO notes + +### Workflows + +- [ ] Folders created for each planned workflow +- [ ] workflow-plan.md in each folder +- [ ] README.md in each workflow folder +- [ ] Plans include all required sections +- [ ] Placeholder READMEs created for unplanned workflows + +## Documentation Validation + +### README.md + +- [ ] Module name and purpose +- [ ] Installation instructions +- [ ] Components section +- [ ] Quick start guide +- [ ] Module structure diagram +- [ ] Configuration section +- [ ] Usage examples +- [ ] Development status +- [ ] Author information + +### TODO.md + +- [ ] Development phases defined +- [ ] Tasks prioritized +- [ ] Quick commands included +- [ ] Completion criteria defined + +## Integration Validation + +### Path Consistency + +- [ ] All paths use correct template format +- [ ] Module code consistent throughout +- [ ] No hardcoded paths +- [ ] Cross-references correct + +### Agent-Workflow Integration + +- [ ] Agents reference correct workflows +- [ ] TODO flags used appropriately +- [ ] No circular dependencies +- [ ] Clear integration points + +## BMAD Compliance + +### Standards + +- [ ] Follows BMAD module structure +- [ ] Uses BMAD installation patterns +- [ ] Agent files follow BMAD format +- [ ] Workflow plans follow BMAD patterns + +### Best Practices + +- [ ] Clear naming conventions +- [ ] Proper documentation +- [ ] Version control ready +- [ ] Installable via bmad install + +## Final Checklist + +### Before Marking Complete + +- [ ] All validation items checked +- [ ] Critical issues resolved +- [ ] Module plan updated with final status +- [ ] stepsCompleted includes all 11 steps +- [ ] User satisfied with result + +### Ready for Testing + +- [ ] Installation should work +- [ ] Documentation accurate +- [ ] Structure complete +- [ ] Next steps clear diff --git a/src/modules/bmb/workflows/create-module/workflow.md b/src/modules/bmb/workflows/create-module/workflow.md new file mode 100644 index 00000000..c0038a3c --- /dev/null +++ b/src/modules/bmb/workflows/create-module/workflow.md @@ -0,0 +1,55 @@ +--- +name: create-module +description: 'Interactive workflow to build complete BMAD modules with agents, workflows, and installation infrastructure' +web_bundle: true +installed_path: '{project-root}/{bmad_folder}/bmb/workflows/create-module' +--- + +# Create Module Workflow + +**Goal:** To guide users through creating complete, installable BMAD modules with proper structure, agents, workflow plans, and documentation. + +**Your Role:** In addition to your name, communication_style, and persona, you are also a Module Architect and BMAD Systems Specialist collaborating with module creators. This is a partnership, not a client-vendor relationship. You bring expertise in BMAD architecture, component design, and installation patterns, while the user brings their domain knowledge and specific module requirements. Work together as equals. + +## WORKFLOW ARCHITECTURE + +### Core Principles + +- **Micro-file Design**: Each step of the overall goal is a self contained instruction file that you will adhere too 1 file as directed at a time +- **Just-In-Time Loading**: Only 1 current step file will be loaded, read, and executed to completion - never load future step files until told to do so +- **Sequential Enforcement**: Sequence within the step files must be completed in order, no skipping or optimization allowed +- **State Tracking**: Document progress in output file frontmatter using `stepsCompleted` array when a workflow produces a document +- **Append-Only Building**: Build documents by appending content as directed to the output file + +### Step Processing Rules + +1. **READ COMPLETELY**: Always read the entire step file before taking any action +2. **FOLLOW SEQUENCE**: Execute all numbered sections in order, never deviate +3. **WAIT FOR INPUT**: If a menu is presented, halt and wait for user selection +4. **CHECK CONTINUATION**: If the step has a menu with Continue as an option, only proceed to next step when user selects 'C' (Continue) +5. **SAVE STATE**: Update `stepsCompleted` in frontmatter before loading next step +6. **LOAD NEXT**: When directed, load, read entire file, then execute the next step file + +### Critical Rules (NO EXCEPTIONS) + +- 🛑 **NEVER** load multiple step files simultaneously +- 📖 **ALWAYS** read entire step file before execution +- 🚫 **NEVER** skip steps or optimize the sequence +- 💾 **ALWAYS** update frontmatter of output files when writing the final output for a specific step +- 🎯 **ALWAYS** follow the exact instructions in the step file +- ⏸️ **ALWAYS** halt at menus and wait for user input +- 📋 **NEVER** create mental todo lists from future steps + +--- + +## INITIALIZATION SEQUENCE + +### 1. Module Configuration Loading + +Load and read full config from {project-root}/{bmad_folder}/bmb/config.yaml and resolve: + +- `project_name`, `output_folder`, `user_name`, `communication_language`, `document_output_language`, `custom_module_location` + +### 2. First Step EXECUTION + +Load, read the full file and then execute {installed_path}/steps/step-01-init.md to begin the workflow. diff --git a/src/modules/bmm/agents/analyst.agent.yaml b/src/modules/bmm/agents/analyst.agent.yaml index eb0bc7c4..8f4ba7f1 100644 --- a/src/modules/bmm/agents/analyst.agent.yaml +++ b/src/modules/bmm/agents/analyst.agent.yaml @@ -39,11 +39,14 @@ agent: workflow: "{project-root}/{bmad_folder}/bmm/workflows/document-project/workflow.yaml" description: Document your existing project (optional, but recommended for existing brownfield project efforts) - - trigger: party-mode - exec: "{project-root}/{bmad_folder}/core/workflows/party-mode/workflow.md" - description: Bring the whole team in to chat with other expert agents from the party - - - trigger: advanced-elicitation - exec: "{project-root}/{bmad_folder}/core/tasks/advanced-elicitation.xml" - description: Advanced elicitation techniques to challenge the LLM to get better results - web-only: true + - multi: "[SPM] Start Party Mode (optionally suggest attendees and topic), [CH] Chat" + triggers: + - party-mode: + - input: SPM or fuzzy match start party mode + - route: "{project-root}/{bmad_folder}/core/workflows/edit-agent/workflow.md" + - data: what is being discussed or suggested with the command, along with custom party custom agents if specified + - type: exec + - expert-chat: + - input: CH or fuzzy match validate agent + - action: agent responds as expert based on its personal to converse + - type: action diff --git a/src/modules/bmm/docs/README.md b/src/modules/bmm/docs/README.md index 77b6bc15..d5608e55 100644 --- a/src/modules/bmm/docs/README.md +++ b/src/modules/bmm/docs/README.md @@ -139,6 +139,9 @@ Comprehensive documentation for all BMM workflows organized by phase: - Complete story lifecycle - One-story-at-a-time discipline +<<<<<<< Updated upstream +<<<<<<< Updated upstream + - **[Testing & QA Workflows](./test-architecture.md)** - Comprehensive quality assurance (1,420 lines) - Test strategy, automation, quality gates - TEA agent and test healing @@ -146,6 +149,14 @@ Comprehensive documentation for all BMM workflows organized by phase: **Total: 34 workflows documented across all phases** +======= + +> > > > > > > Stashed changes + +======= + +> > > > > > > Stashed changes + ### Advanced Workflow References For detailed technical documentation on specific complex workflows: @@ -170,10 +181,21 @@ Quality assurance guidance: +<<<<<<< Updated upstream + +<<<<<<< Updated upstream + - Test design workflows - Quality gates - Risk assessment -- NFR validation +- # NFR validation + ======= + > > > > > > > Stashed changes + - Test design workflows + - Quality gates + - Risk assessment + - NFR validation + > > > > > > > Stashed changes --- diff --git a/src/modules/bmm/docs/brownfield-guide.md b/src/modules/bmm/docs/brownfield-guide.md index 17497c5c..a660f896 100644 --- a/src/modules/bmm/docs/brownfield-guide.md +++ b/src/modules/bmm/docs/brownfield-guide.md @@ -725,6 +725,13 @@ flowchart TD - **[Quick Start Guide](./quick-start.md)** - Getting started with BMM - **[Glossary](./glossary.md)** - Key terminology - **[FAQ](./faq.md)** - Common questions + <<<<<<< Updated upstream + ======= +- **[Troubleshooting](./troubleshooting.md)** - Problem resolution + <<<<<<< Updated upstream + > > > > > > > # Stashed changes + > > > > > > > + > > > > > > > Stashed changes - **[Workflow Documentation](./README.md#-workflow-guides)** - Complete workflow reference --- @@ -739,7 +746,13 @@ flowchart TD **Documentation:** -- [Test Architect Guide](./test-architecture.md) - Comprehensive testing strategy +<<<<<<< Updated upstream +<<<<<<< Updated upstream + +- # [Test Architect Guide](./test-architecture.md) - Comprehensive testing strategy + > > > > > > > # Stashed changes + > > > > > > > + > > > > > > > Stashed changes - [BMM Module README](../README.md) - Complete module and workflow reference --- diff --git a/src/modules/bmm/docs/glossary.md b/src/modules/bmm/docs/glossary.md index a85d03c2..2bfdda52 100644 --- a/src/modules/bmm/docs/glossary.md +++ b/src/modules/bmm/docs/glossary.md @@ -95,6 +95,20 @@ Game development equivalent of PRD, created by Game Designer agent for game proj ## Workflow and Phases +<<<<<<< Updated upstream + +# <<<<<<< Updated upstream + +======= + +> > > > > > > Stashed changes + +### Phase 0: Documentation (Prerequisite) + +**Conditional phase for brownfield projects.** Creates comprehensive codebase documentation before planning. Only required if existing documentation is insufficient for AI agents. + +> > > > > > > Stashed changes + ### Phase 1: Analysis (Optional) Discovery and research phase including brainstorming, research workflows, and product brief creation. Optional for Quick Flow, recommended for BMad Method, required for Enterprise Method. diff --git a/src/modules/bmm/docs/quick-spec-flow.md b/src/modules/bmm/docs/quick-spec-flow.md new file mode 100644 index 00000000..05ac4629 --- /dev/null +++ b/src/modules/bmm/docs/quick-spec-flow.md @@ -0,0 +1,652 @@ +# BMad Quick Spec Flow + +**Perfect for:** Bug fixes, small features, rapid prototyping, and quick enhancements + +**Time to implementation:** Minutes, not hours + +--- + +## What is Quick Spec Flow? + +Quick Spec Flow is a **streamlined alternative** to the full BMad Method for Quick Flow track projects. Instead of going through Product Brief → PRD → Architecture, you go **straight to a context-aware technical specification** and start coding. + +### When to Use Quick Spec Flow + +✅ **Use Quick Flow track when:** + +- Single bug fix or small enhancement +- Small feature with clear scope (typically 1-15 stories) +- Rapid prototyping or experimentation +- Adding to existing brownfield codebase +- You know exactly what you want to build + +❌ **Use BMad Method or Enterprise tracks when:** + +- Building new products or major features +- Need stakeholder alignment +- Complex multi-team coordination +- Requires extensive planning and architecture + +💡 **Not sure?** Run `workflow-init` to get a recommendation based on your project's needs! + +--- + +## Quick Spec Flow Overview + +```mermaid +flowchart TD + START[Step 1: Run Tech-Spec Workflow] + DETECT[Detects project stack
package.json, requirements.txt, etc.] + ANALYZE[Analyzes brownfield codebase
if exists] + TEST[Detects test frameworks
and conventions] + CONFIRM[Confirms conventions
with you] + GENERATE[Generates context-rich
tech-spec] + STORIES[Creates ready-to-implement
stories] + + OPTIONAL[Step 2: Optional
Generate Story Context
SM Agent
For complex scenarios only] + + IMPL[Step 3: Implement
DEV Agent
Code, test, commit] + + DONE[DONE! 🚀] + + START --> DETECT + DETECT --> ANALYZE + ANALYZE --> TEST + TEST --> CONFIRM + CONFIRM --> GENERATE + GENERATE --> STORIES + STORIES --> OPTIONAL + OPTIONAL -.->|Optional| IMPL + STORIES --> IMPL + IMPL --> DONE + + style START fill:#bfb,stroke:#333,stroke-width:2px + style OPTIONAL fill:#ffb,stroke:#333,stroke-width:2px,stroke-dasharray: 5 5 + style IMPL fill:#bbf,stroke:#333,stroke-width:2px + style DONE fill:#f9f,stroke:#333,stroke-width:3px +``` + +--- + +## Single Atomic Change + +**Best for:** Bug fixes, single file changes, isolated improvements + +### What You Get + +1. **tech-spec.md** - Comprehensive technical specification with: + - Problem statement and solution + - Detected framework versions and dependencies + - Brownfield code patterns (if applicable) + - Existing test patterns to follow + - Specific file paths to modify + - Complete implementation guidance + +2. **story-[slug].md** - Single user story ready for development + +### Quick Spec Flow Commands + +```bash +# Start Quick Spec Flow (no workflow-init needed!) +# Load PM agent and run tech-spec + +# When complete, implement directly: +# Load DEV agent and run dev-story +``` + +### What Makes It Quick + +- ✅ No Product Brief needed +- ✅ No PRD needed +- ✅ No Architecture doc needed +- ✅ Auto-detects your stack +- ✅ Auto-analyzes brownfield code +- ✅ Auto-validates quality +- ✅ Story context optional (tech-spec is comprehensive!) + +### Example Single Change Scenarios + +- "Fix the login validation bug" +- "Add email field to user registration form" +- "Update API endpoint to return additional field" +- "Improve error handling in payment processing" + +--- + +## Coherent Small Feature + +**Best for:** Small features with 2-3 related user stories + +### What You Get + +1. **tech-spec.md** - Same comprehensive spec as single change projects +2. **epics.md** - Epic organization with story breakdown +3. **story-[epic-slug]-1.md** - First story +4. **story-[epic-slug]-2.md** - Second story +5. **story-[epic-slug]-3.md** - Third story (if needed) + +### Quick Spec Flow Commands + +```bash +# Start Quick Spec Flow +# Load PM agent and run tech-spec + +# Optional: Organize stories as a sprint +# Load SM agent and run sprint-planning + +# Implement story-by-story: +# Load DEV agent and run dev-story for each story +``` + +### Story Sequencing + +Stories are **automatically validated** to ensure proper sequence: + +- ✅ No forward dependencies (Story 2 can't depend on Story 3) +- ✅ Clear dependency documentation +- ✅ Infrastructure → Features → Polish order +- ✅ Backend → Frontend flow + +### Example Small Feature Scenarios + +- "Add OAuth social login (Google, GitHub, Twitter)" +- "Build user profile page with avatar upload" +- "Implement basic search with filters" +- "Add dark mode toggle to application" + +--- + +## Smart Context Discovery + +Quick Spec Flow automatically discovers and uses: + +### 1. Existing Documentation + +- Product briefs (if they exist) +- Research documents +- `document-project` output (brownfield codebase map) + +### 2. Project Stack + +- **Node.js:** package.json → frameworks, dependencies, scripts, test framework +- **Python:** requirements.txt, pyproject.toml → packages, tools +- **Ruby:** Gemfile → gems and versions +- **Java:** pom.xml, build.gradle → Maven/Gradle dependencies +- **Go:** go.mod → modules +- **Rust:** Cargo.toml → crates +- **PHP:** composer.json → packages + +### 3. Brownfield Code Patterns + +- Directory structure and organization +- Existing code patterns (class-based, functional, MVC) +- Naming conventions (camelCase, snake_case, PascalCase) +- Test frameworks and patterns +- Code style (semicolons, quotes, indentation) +- Linter/formatter configs +- Error handling patterns +- Logging conventions +- Documentation style + +### 4. Convention Confirmation + +**IMPORTANT:** Quick Spec Flow detects your conventions and **asks for confirmation**: + +``` +I've detected these conventions in your codebase: + +Code Style: +- ESLint with Airbnb config +- Prettier with single quotes, 2-space indent +- No semicolons + +Test Patterns: +- Jest test framework +- .test.js file naming +- expect() assertion style + +Should I follow these existing conventions? (yes/no) +``` + +**You decide:** Conform to existing patterns or establish new standards! + +--- + +## Modern Best Practices via WebSearch + +Quick Spec Flow stays current by using WebSearch when appropriate: + +### For Greenfield Projects + +- Searches for latest framework versions +- Recommends official starter templates +- Suggests modern best practices + +### For Outdated Dependencies + +- Detects if your dependencies are >2 years old +- Searches for migration guides +- Notes upgrade complexity + +### Starter Template Recommendations + +For greenfield projects, Quick Spec Flow recommends: + +**React:** + +- Vite (modern, fast) +- Next.js (full-stack) + +**Python:** + +- cookiecutter templates +- FastAPI starter + +**Node.js:** + +- NestJS CLI +- express-generator + +**Benefits:** + +- ✅ Modern best practices baked in +- ✅ Proper project structure +- ✅ Build tooling configured +- ✅ Testing framework set up +- ✅ Faster time to first feature + +--- + +## UX/UI Considerations + +For user-facing changes, Quick Spec Flow captures: + +- UI components affected (create vs modify) +- UX flow changes (current vs new) +- Responsive design needs (mobile, tablet, desktop) +- Accessibility requirements: + - Keyboard navigation + - Screen reader compatibility + - ARIA labels + - Color contrast standards +- User feedback patterns: + - Loading states + - Error messages + - Success confirmations + - Progress indicators + +--- + +## Auto-Validation and Quality Assurance + +Quick Spec Flow **automatically validates** everything: + +### Tech-Spec Validation (Always Runs) + +Checks: + +- ✅ Context gathering completeness +- ✅ Definitiveness (no "use X or Y" statements) +- ✅ Brownfield integration quality +- ✅ Stack alignment +- ✅ Implementation readiness + +Generates scores: + +``` +✅ Validation Passed! +- Context Gathering: Comprehensive +- Definitiveness: All definitive +- Brownfield Integration: Excellent +- Stack Alignment: Perfect +- Implementation Readiness: ✅ Ready +``` + +### Story Validation (Multi-Story Features) + +Checks: + +- ✅ Story sequence (no forward dependencies!) +- ✅ Acceptance criteria quality (specific, testable) +- ✅ Completeness (all tech spec tasks covered) +- ✅ Clear dependency documentation + +**Auto-fixes issues if found!** + +--- + +## Complete User Journey + +### Scenario 1: Bug Fix (Single Change) + +**Goal:** Fix login validation bug + +**Steps:** + +1. **Start:** Load PM agent, say "I want to fix the login validation bug" +2. **PM runs tech-spec workflow:** + - Asks: "What problem are you solving?" + - You explain the validation issue + - Detects your Node.js stack (Express 4.18.2, Jest for testing) + - Analyzes existing UserService code patterns + - Asks: "Should I follow your existing conventions?" → You say yes + - Generates tech-spec.md with specific file paths and patterns + - Creates story-login-fix.md +3. **Implement:** Load DEV agent, run `dev-story` + - DEV reads tech-spec (has all context!) + - Implements fix following existing patterns + - Runs tests (following existing Jest patterns) + - Done! + +**Total time:** 15-30 minutes (mostly implementation) + +--- + +### Scenario 2: Small Feature (Multi-Story) + +**Goal:** Add OAuth social login (Google, GitHub) + +**Steps:** + +1. **Start:** Load PM agent, say "I want to add OAuth social login" +2. **PM runs tech-spec workflow:** + - Asks about the feature scope + - You specify: Google and GitHub OAuth + - Detects your stack (Next.js 13.4, NextAuth.js already installed!) + - Analyzes existing auth patterns + - Confirms conventions with you + - Generates: + - tech-spec.md (comprehensive implementation guide) + - epics.md (OAuth Integration epic) + - story-oauth-1.md (Backend OAuth setup) + - story-oauth-2.md (Frontend login buttons) +3. **Optional Sprint Planning:** Load SM agent, run `sprint-planning` +4. **Implement Story 1:** + - Load DEV agent, run `dev-story` for story 1 + - DEV implements backend OAuth +5. **Implement Story 2:** + - DEV agent, run `dev-story` for story 2 + - DEV implements frontend + - Done! + +**Total time:** 1-3 hours (mostly implementation) + +--- + +## Integration with Phase 4 Workflows + +Quick Spec Flow works seamlessly with all Phase 4 implementation workflows: + +### story-context (SM Agent) + +- ✅ Recognizes tech-spec.md as authoritative source +- ✅ Extracts context from tech-spec (replaces PRD) +- ✅ Generates XML context for complex scenarios + +### create-story (SM Agent) + +- ✅ Can work with tech-spec.md instead of PRD +- ✅ Uses epics.md from tech-spec workflow +- ✅ Creates additional stories if needed + +### sprint-planning (SM Agent) + +- ✅ Works with epics.md from tech-spec +- ✅ Organizes multi-story features for coordinated implementation +- ✅ Tracks progress through sprint-status.yaml + +### dev-story (DEV Agent) + +- ✅ Reads stories generated by tech-spec +- ✅ Uses tech-spec.md as comprehensive context +- ✅ Implements following detected conventions + +--- + +## Comparison: Quick Spec vs Full BMM + +| Aspect | Quick Flow Track | BMad Method/Enterprise Tracks | +| --------------------- | ---------------------------- | ---------------------------------- | +| **Setup** | None (standalone) | workflow-init recommended | +| **Planning Docs** | tech-spec.md only | Product Brief → PRD → Architecture | +| **Time to Code** | Minutes | Hours to days | +| **Best For** | Bug fixes, small features | New products, major features | +| **Context Discovery** | Automatic | Manual + guided | +| **Story Context** | Optional (tech-spec is rich) | Required (generated from PRD) | +| **Validation** | Auto-validates everything | Manual validation steps | +| **Brownfield** | Auto-analyzes and conforms | Manual documentation required | +| **Conventions** | Auto-detects and confirms | Document in PRD/Architecture | + +--- + +## When to Graduate from Quick Flow to BMad Method + +Start with Quick Flow, but switch to BMad Method when: + +- ❌ Project grows beyond initial scope +- ❌ Multiple teams need coordination +- ❌ Stakeholders need formal documentation +- ❌ Product vision is unclear +- ❌ Architectural decisions need deep analysis +- ❌ Compliance/regulatory requirements exist + +💡 **Tip:** You can always run `workflow-init` later to transition from Quick Flow to BMad Method! + +--- + +## Quick Spec Flow - Key Benefits + +### 🚀 **Speed** + +- No Product Brief +- No PRD +- No Architecture doc +- Straight to implementation + +### 🧠 **Intelligence** + +- Auto-detects stack +- Auto-analyzes brownfield +- Auto-validates quality +- WebSearch for current info + +### 📐 **Respect for Existing Code** + +- Detects conventions +- Asks for confirmation +- Follows patterns +- Adapts vs. changes + +### ✅ **Quality** + +- Auto-validation +- Definitive decisions (no "or" statements) +- Comprehensive context +- Clear acceptance criteria + +### 🎯 **Focus** + +- Single atomic changes +- Coherent small features +- No scope creep +- Fast iteration + +--- + +## Getting Started + +### Prerequisites + +- BMad Method installed (`npx bmad-method install`) +- Project directory with code (or empty for greenfield) + +### Quick Start Commands + +```bash +# For a quick bug fix or small change: +# 1. Load PM agent +# 2. Say: "I want to [describe your change]" +# 3. PM will ask if you want to run tech-spec +# 4. Answer questions about your change +# 5. Get tech-spec + story +# 6. Load DEV agent and implement! + +# For a small feature with multiple stories: +# Same as above, but get epic + 2-3 stories +# Optionally use SM sprint-planning to organize +``` + +### No workflow-init Required! + +Quick Spec Flow is **fully standalone**: + +- Detects if it's a single change or multi-story feature +- Asks for greenfield vs brownfield +- Works without status file tracking +- Perfect for rapid prototyping + +--- + +## FAQ + +### Q: Can I use Quick Spec Flow on an existing project? + +**A:** Yes! It's perfect for brownfield projects. It will analyze your existing code, detect patterns, and ask if you want to follow them. + +### Q: What if I don't have a package.json or requirements.txt? + +**A:** Quick Spec Flow will work in greenfield mode, recommend starter templates, and use WebSearch for modern best practices. + +### Q: Do I need to run workflow-init first? + +**A:** No! Quick Spec Flow is standalone. But if you want guidance on which flow to use, workflow-init can help. + +### Q: Can I use this for frontend changes? + +**A:** Absolutely! Quick Spec Flow captures UX/UI considerations, component changes, and accessibility requirements. + +### Q: What if my Quick Flow project grows? + +**A:** No problem! You can always transition to BMad Method by running workflow-init and create-prd. Your tech-spec becomes input for the PRD. + +### Q: Do I need story-context for every story? + +**A:** Usually no! Tech-spec is comprehensive enough for most Quick Flow projects. Only use story-context for complex edge cases. + +### Q: Can I skip validation? + +**A:** No, validation always runs automatically. But it's fast and catches issues early! + +### Q: Will it work with my team's code style? + +**A:** Yes! It detects your conventions and asks for confirmation. You control whether to follow existing patterns or establish new ones. + +--- + +## Tips and Best Practices + +### 1. **Be Specific in Discovery** + +When describing your change, provide specifics: + +- ✅ "Fix email validation in UserService to allow plus-addressing" +- ❌ "Fix validation bug" + +### 2. **Trust the Convention Detection** + +If it detects your patterns correctly, say yes! It's faster than establishing new conventions. + +### 3. **Use WebSearch Recommendations for Greenfield** + +Starter templates save hours of setup time. Let Quick Spec Flow find the best ones. + +### 4. **Review the Auto-Validation** + +When validation runs, read the scores. They tell you if your spec is production-ready. + +### 5. **Story Context is Optional** + +For single changes, try going directly to dev-story first. Only add story-context if you hit complexity. + +### 6. **Keep Single Changes Truly Atomic** + +If your "single change" needs 3+ files, it might be a multi-story feature. Let the workflow guide you. + +### 7. **Validate Story Sequence for Multi-Story Features** + +When you get multiple stories, check the dependency validation output. Proper sequence matters! + +--- + +## Real-World Examples + +### Example 1: Adding Logging (Single Change) + +**Input:** "Add structured logging to payment processing" + +**Tech-Spec Output:** + +- Detected: winston 3.8.2 already in package.json +- Analyzed: Existing services use winston with JSON format +- Confirmed: Follow existing logging patterns +- Generated: Specific file paths, log levels, format example +- Story: Ready to implement in 1-2 hours + +**Result:** Consistent logging added, following team patterns, no research needed. + +--- + +### Example 2: Search Feature (Multi-Story) + +**Input:** "Add search to product catalog with filters" + +**Tech-Spec Output:** + +- Detected: React 18.2.0, MUI component library, Express backend +- Analyzed: Existing ProductList component patterns +- Confirmed: Follow existing API and component structure +- Generated: + - Epic: Product Search Functionality + - Story 1: Backend search API with filters + - Story 2: Frontend search UI component +- Auto-validated: Story 1 → Story 2 sequence correct + +**Result:** Search feature implemented in 4-6 hours with proper architecture. + +--- + +## Summary + +Quick Spec Flow is your **fast path from idea to implementation** for: + +- 🐛 Bug fixes +- ✨ Small features +- 🚀 Rapid prototyping +- 🔧 Quick enhancements + +**Key Features:** + +- Auto-detects your stack +- Auto-analyzes brownfield code +- Auto-validates quality +- Respects existing conventions +- Uses WebSearch for modern practices +- Generates comprehensive tech-specs +- Creates implementation-ready stories + +**Time to code:** Minutes, not hours. + +**Ready to try it?** Load the PM agent and say what you want to build! 🚀 + +--- + +## Next Steps + +- **Try it now:** Load PM agent and describe a small change +- **Learn more:** See the [BMM Workflow Guides](./README.md#-workflow-guides) for comprehensive workflow documentation +- **Need help deciding?** Run `workflow-init` to get a recommendation +- **Have questions?** Join us on Discord: https://discord.gg/gk8jAdXWmj + +--- + +_Quick Spec Flow - Because not every change needs a Product Brief._ diff --git a/src/modules/bmm/docs/troubleshooting.md b/src/modules/bmm/docs/troubleshooting.md new file mode 100644 index 00000000..f411d98b --- /dev/null +++ b/src/modules/bmm/docs/troubleshooting.md @@ -0,0 +1,680 @@ +# BMM Troubleshooting Guide + +Common issues and solutions for the BMad Method Module. + +--- + +## Quick Diagnosis + +**Use this flowchart to find your issue:** + +```mermaid +flowchart TD + START{What's the problem?} + + START -->|Can't get started| SETUP[Setup & Installation Issues] + START -->|Wrong level detected| LEVEL[Level Detection Problems] + START -->|Workflow not working| WORKFLOW[Workflow Issues] + START -->|Agent lacks context| CONTEXT[Context & Documentation Issues] + START -->|Implementation problems| IMPL[Implementation Issues] + START -->|Files/paths wrong| FILES[File & Path Issues] + + style START fill:#ffb,stroke:#333,stroke-width:2px + style SETUP fill:#bfb,stroke:#333,stroke-width:2px + style LEVEL fill:#bbf,stroke:#333,stroke-width:2px + style WORKFLOW fill:#fbf,stroke:#333,stroke-width:2px + style CONTEXT fill:#f9f,stroke:#333,stroke-width:2px +``` + +--- + +## Table of Contents + +- [Setup and Installation Issues](#setup-and-installation-issues) +- [Level Detection Problems](#level-detection-problems) +- [Workflow Issues](#workflow-issues) +- [Context and Documentation Issues](#context-and-documentation-issues) +- [Implementation Issues](#implementation-issues) +- [File and Path Issues](#file-and-path-issues) +- [Agent Behavior Issues](#agent-behavior-issues) +- [Integration Issues (Brownfield)](#integration-issues-brownfield) + +--- + +## Setup and Installation Issues + +### Problem: BMM not found after installation + +**Symptoms:** + +- `bmad` command not recognized +- Agent files not accessible +- Workflows don't load + +**Solution:** + +```bash +# Check if BMM is installed +ls bmad/ + +# If not present, run installer +npx bmad-method@alpha install + +# For fresh install +npx bmad-method@alpha install --skip-version-prompt +``` + +### Problem: Agents don't have menu + +**Symptoms:** + +- Load agent file but no menu appears +- Agent doesn't respond to commands + +**Solution:** + +1. Ensure you're loading the correct agent file path: `bmad/bmm/agents/[agent-name].md` +2. Wait a few seconds for agent to initialize +3. Try asking "show menu" or "help" +4. Check IDE supports Markdown rendering with context +5. For Claude Code: Ensure agent file is open in chat context + +### Problem: Workflows not found + +**Symptoms:** + +- Agent says workflow doesn't exist +- Menu shows workflow but won't run + +**Solution:** + +1. Check workflow exists: `ls bmad/bmm/workflows/` +2. Verify agent has access to workflow (check agent's workflow list) +3. Try using menu number instead of workflow name +4. Restart chat with agent in fresh session + +--- + +## Level Detection Problems + +### Problem: workflow-init suggests wrong level + +**Symptoms:** + +- Detects Level 3 but you only need Level 1 +- Suggests Level 1 but project is actually Level 2 +- Can't figure out appropriate level + +**Solution:** + +1. **Override the suggestion** - workflow-init always asks for confirmation, just say "no" and choose correct level +2. **Be specific in description** - Use level keywords when describing: + - "fix bug" → Level 0 + - "add small feature" → Level 1 + - "build dashboard" → Level 2 +3. **Manual override** - You can always switch levels later if needed + +**Example:** + +``` +workflow-init: "Level 3 project?" +You: "No, this is just adding OAuth login - Level 1" +workflow-init: "Got it, creating Level 1 workflow" +``` + +### Problem: Project level unclear + +**Symptoms:** + +- Between Level 1 and Level 2 +- Not sure if architecture needed +- Story count uncertain + +**Solution:** +**When in doubt, start smaller:** + +- Choose Level 1 instead of Level 2 +- You can always run `create-prd` later if needed +- Level 1 is faster, less overhead +- Easy to upgrade, hard to downgrade + +**Decision criteria:** + +- Single epic with related stories? → Level 1 +- Multiple independent epics? → Level 2 +- Need product-level planning? → Level 2 +- Just need technical plan? → Level 1 + +### Problem: Old planning docs influencing level detection + +**Symptoms:** + +- Old Level 3 PRD in folder +- Working on new Level 0 bug fix +- workflow-init suggests Level 3 + +**Solution:** +workflow-init asks: "Is this work in progress or previous effort?" + +- Answer: "Previous effort" +- Then describe your NEW work clearly +- System will detect level based on NEW work, not old artifacts + +--- + +## Workflow Issues + +### Problem: Workflow fails or hangs + +**Symptoms:** + +- Workflow starts but doesn't complete +- Agent stops responding mid-workflow +- Progress stalls + +**Solution:** + +1. **Check context limits** - Start fresh chat for complex workflows +2. **Verify prerequisites**: + - Phase 2 needs Phase 1 complete (if used) + - Phase 3 needs Phase 2 complete + - Phase 4 needs Phase 3 complete (if Level 3-4) +3. **Restart workflow** - Load agent in new chat and restart +4. **Check status file** - Verify `bmm-workflow-status.md` or `sprint-status.yaml` is present and valid + +### Problem: Agent says "workflow not found" + +**Symptoms:** + +- Request workflow by name +- Agent doesn't recognize it +- Menu doesn't show workflow + +**Solution:** + +1. Check spelling/format - Use exact workflow name or menu shortcut (*prd not *PRD) +2. Verify agent has workflow: + - PM agent: prd, tech-spec + - Architect agent: create-architecture, validate-architecture + - SM agent: sprint-planning, create-story, story-context +3. Try menu number instead of name +4. Check you're using correct agent for workflow + +### Problem: Sprint-planning workflow fails + +**Symptoms:** + +- Can't create sprint-status.yaml +- Epics not extracted from files +- Status file empty or incorrect + +**Solution:** + +1. **Verify epic files exist**: + - Level 1: tech-spec with epic + - Level 2-4: epics.md or sharded epic files +2. **Check file format**: + - Epic files should be valid Markdown + - Epic headers should be clear (## Epic Name) +3. **Run in Phase 4 only** - Ensure Phase 2/3 complete first +4. **Check file paths** - Epic files should be in correct output folder + +### Problem: story-context generates empty or wrong context + +**Symptoms:** + +- Context file created but has no useful content +- Context doesn't reference existing code +- Missing technical guidance + +**Solution:** + +1. **Run epic-tech-context first** - story-context builds on epic context +2. **Check story file exists** - Verify story was created by create-story +3. **For brownfield**: + - Ensure document-project was run + - Verify docs/index.md exists with codebase context +4. **Try regenerating** - Sometimes needs fresh attempt with more specific story details + +--- + +## Context and Documentation Issues + +### Problem: AI agents lack codebase understanding (Brownfield) + +**Symptoms:** + +- Suggestions don't align with existing patterns +- Ignores available components +- Proposes approaches that conflict with architecture +- Doesn't reference existing code + +**Solution:** + +1. **Run document-project** - Critical for brownfield projects + ``` + Load Analyst agent → run document-project + Choose scan level: Deep (recommended for PRD prep) + ``` +2. **Verify docs/index.md exists** - This is master entry point for AI agents +3. **Check documentation completeness**: + - Review generated docs/index.md + - Ensure key systems are documented +4. **Run deep-dive on specific areas** if needed + +### Problem: Have documentation but agents can't find it + +**Symptoms:** + +- README.md, ARCHITECTURE.md exist +- AI agents still ask questions answered in docs +- No docs/index.md file + +**Solution:** +**Option 1: Quick fix (2-5min)** +Run `index-docs` task: + +- Located at `bmad/core/tasks/index-docs.xml` +- Scans existing docs and generates index.md +- Lightweight, just creates navigation + +**Option 2: Comprehensive (10-30min)** +Run document-project workflow: + +- Discovers existing docs in Step 2 +- Generates NEW AI-friendly documentation from codebase +- Creates index.md linking to BOTH existing and new docs + +**Why this matters:** AI agents need structured entry point (index.md) to navigate docs efficiently. + +### Problem: document-project takes too long + +**Symptoms:** + +- Exhaustive scan running for hours +- Impatient to start planning + +**Solution:** +**Choose appropriate scan level:** + +- **Quick (2-5min)** - Pattern analysis, no source reading - Good for initial overview +- **Deep (10-30min)** - Reads critical paths - **Recommended for most brownfield projects** +- **Exhaustive (30-120min)** - Reads all files - Only for migration planning or complete understanding + +For most brownfield projects, **Deep scan is sufficient**. + +--- + +## Implementation Issues + +### Problem: Existing tests breaking (Brownfield) + +**Symptoms:** + +- Regression test failures +- Previously working functionality broken +- Integration tests failing + +**Solution:** + +1. **Review changes against existing patterns**: + - Check if new code follows existing conventions + - Verify API contracts unchanged (unless intentionally versioned) +2. **Run test-review workflow** (TEA agent): + - Analyzes test coverage + - Identifies regression risks + - Suggests fixes +3. **Add regression testing to DoD**: + - All existing tests must pass + - Add integration tests for new code +4. **Consider feature flags** for gradual rollout + +### Problem: Story takes much longer than estimated + +**Symptoms:** + +- Story estimated 4 hours, took 12 hours +- Acceptance criteria harder than expected +- Hidden complexity discovered + +**Solution:** +**This is normal!** Estimates are estimates. To handle: + +1. **Continue until DoD met** - Don't compromise quality +2. **Document learnings in retrospective**: + - What caused the overrun? + - What should we watch for next time? +3. **Consider splitting story** if it's truly two stories +4. **Adjust future estimates** based on this data + +**Don't stress about estimate accuracy** - use them for learning, not judgment. + +### Problem: Integration points unclear + +**Symptoms:** + +- Not sure how to connect new code to existing +- Unsure which files to modify +- Multiple possible integration approaches + +**Solution:** + +1. **For brownfield**: + - Ensure document-project captured existing architecture + - Review architecture docs before implementing +2. **Check story-context** - Should document integration points +3. **In tech-spec/architecture** - Explicitly document: + - Which existing modules to modify + - What APIs/services to integrate with + - Data flow between new and existing code +4. **Run integration-planning workflow** (Level 3-4): + - Architect agent creates integration strategy + +### Problem: Inconsistent patterns being introduced + +**Symptoms:** + +- New code style doesn't match existing +- Different architectural approach +- Not following team conventions + +**Solution:** + +1. **Check convention detection** (Quick Spec Flow): + - Should detect existing patterns + - Asks for confirmation before proceeding +2. **Review documentation** - Ensure document-project captured patterns +3. **Use story-context** - Injects pattern guidance per story +4. **Add to code-review checklist**: + - Pattern adherence + - Convention consistency + - Style matching +5. **Run retrospective** to identify pattern deviations early + +--- + +## File and Path Issues + +### Problem: Output files in wrong location + +**Symptoms:** + +- PRD created in wrong folder +- Story files not where expected +- Documentation scattered + +**Solution:** +Check `bmad/bmm/config.yaml` for configured paths: + +```yaml +output_folder: '{project-root}/docs' +dev_story_location: '{project-root}/docs/stories' +``` + +Default locations: + +- Planning docs (PRD, epics, architecture): `{output_folder}/` +- Stories: `{dev_story_location}/` +- Status files: `{output_folder}/bmm-workflow-status.md`, `{output_folder}/sprint-status.yaml` + +To change locations, edit config.yaml then re-run workflows. + +### Problem: Can't find status file + +**Symptoms:** + +- workflow-status says no status file +- Can't track progress +- Lost place in workflow + +**Solution:** + +1. **Check default location**: `docs/bmm-workflow-status.md` +2. **If missing, reinitialize**: + ``` + Load Analyst agent → run workflow-init + ``` +3. **For Phase 4**: Look for `sprint-status.yaml` in same folder as PRD +4. **Search for it**: + ```bash + find . -name "bmm-workflow-status.md" + find . -name "sprint-status.yaml" + ``` + +### Problem: Sprint-status.yaml not updating + +**Symptoms:** + +- Workflows complete but status unchanged +- Stories stuck in old status +- Epic status not progressing + +**Solution:** + +1. **Manual update required** - Most status changes are manual: + ```yaml + stories: + - id: epic-1-story-1 + status: done # Change this manually + ``` +2. **Some workflows auto-update**: + - sprint-planning creates file + - epic-tech-context changes epic to "contexted" + - create-story changes story to "drafted" + - story-context changes to "ready-for-dev" + - dev-story may auto-update (check workflow) +3. **Re-run sprint-planning** to resync if needed + +--- + +## Agent Behavior Issues + +### Problem: Agent provides vague or generic responses + +**Symptoms:** + +- "Use appropriate framework" +- "Follow best practices" +- Generic advice without specifics + +**Solution:** + +1. **Provide more context** - Be specific in your description: + - "Add OAuth using passport.js to Express server" + - Not: "Add authentication" +2. **For brownfield**: + - Ensure document-project was run + - Agent needs codebase context for specific advice +3. **Reference existing docs**: + - "Based on the existing auth system in UserService..." +4. **Start fresh chat** - Context overload can cause generic responses + +### Problem: Agent hallucinating or making up information + +**Symptoms:** + +- References files that don't exist +- Suggests APIs that aren't in your stack +- Creates imaginary requirements + +**Solution:** + +1. **Use fresh chat** - Context overflow main cause of hallucinations +2. **Provide concrete constraints**: + - "We use Express 4.18.2, not Next.js" + - "Our database is PostgreSQL, not MongoDB" +3. **For brownfield**: + - Document-project provides factual grounding + - Agent sees actual code, not assumptions +4. **Correct immediately**: + - "No, we don't have UserService, we have AuthenticationModule" + +### Problem: Agent won't follow instructions + +**Symptoms:** + +- Ignores specific requests +- Does something different than asked +- Doesn't respect constraints + +**Solution:** + +1. **Be more explicit** - Agents respond to clear, specific instructions: + - "Use EXACTLY these three steps..." + - "Do NOT include database migrations in this story" +2. **Check agent capabilities** - Agent might not have access to requested workflow +3. **Try different phrasing** - Rephrase request to be more direct +4. **Use menu system** - Numbers are clearer than text commands + +--- + +## Integration Issues (Brownfield) + +### Problem: New code conflicts with existing architecture + +**Symptoms:** + +- Integration approach doesn't fit existing structure +- Would require major refactoring +- Conflicts with established patterns + +**Solution:** + +1. **Check if document-project was run** - Agents need architecture context +2. **Review existing architecture docs**: + - Read docs/architecture.md (from document-project) + - Understand current system design +3. **For Level 3-4**: + - Run validate-architecture workflow before planning + - Use integration-planning workflow +4. **Explicitly document integration strategy** in architecture: + - How new components fit existing structure + - What modifications needed to existing code + - Migration path if changing patterns + +### Problem: Breaking changes to existing APIs + +**Symptoms:** + +- Changing API breaks consumers +- Downstream services affected +- Need backward compatibility + +**Solution:** + +1. **Identify all API consumers** (document-project should show this) +2. **Plan versioning strategy**: + - API v1 (existing) + v2 (new) + - Deprecation timeline +3. **Use feature flags** for gradual rollout +4. **Document migration guide** for API consumers +5. **Add to testing strategy**: + - Existing consumers still work (v1) + - New functionality works (v2) + +### Problem: Data migration required + +**Symptoms:** + +- Schema changes needed +- Existing data needs transformation +- Risk of data loss + +**Solution:** + +1. **Create explicit migration strategy** in architecture: + - Forward migration (old → new schema) + - Rollback plan (new → old schema) + - Data validation approach +2. **Test migrations thoroughly**: + - On copy of production data + - Measure performance impact +3. **Plan rollout**: + - Staging environment first + - Gradual production rollout + - Monitoring for issues +4. **Document in tech-spec/architecture**: + - Migration scripts + - Rollback procedures + - Expected downtime + +--- + +## Still Stuck? + +### Getting More Help + +If your issue isn't covered here: + +1. **Check other documentation**: + - [FAQ](./faq.md) - Common questions + - [Glossary](./glossary.md) - Terminology + - [Quick Start](./quick-start.md) - Basic usage + - [Brownfield Guide](./brownfield-guide.md) - Existing codebases + - [Scale Adaptive System](./scale-adaptive-system.md) - Understanding levels + +2. **Community support**: + - [Discord](https://discord.gg/gk8jAdXWmj) - #general-dev, #bugs-issues + - Active community, fast responses + - Share your specific situation + +3. **Report bugs**: + - [GitHub Issues](https://github.com/bmad-code-org/BMAD-METHOD/issues) + - Include version, steps to reproduce, expected vs actual behavior + +4. **Video tutorials**: + - [YouTube Channel](https://www.youtube.com/@BMadCode) + - Visual walkthroughs of common workflows + +--- + +## Common Error Messages + +### "No workflow status file found" + +**Cause:** Haven't run workflow-init yet +**Fix:** Load Analyst agent → run workflow-init + +### "Epic file not found" + +**Cause:** PRD/epics not created, or wrong path +**Fix:** Verify PRD/epics exist in output folder, check config.yaml paths + +### "Story not in sprint-status.yaml" + +**Cause:** Sprint-planning not run, or story file not created +**Fix:** Run sprint-planning workflow, verify story files exist + +### "Documentation insufficient for brownfield" + +**Cause:** No docs/index.md or document-project not run +**Fix:** Run document-project workflow with Deep scan + +### "Level detection failed" + +**Cause:** Ambiguous project description +**Fix:** Be more specific, use level keywords (fix, feature, platform, etc.) + +### "Context generation failed" + +**Cause:** Missing prerequisites (epic context, story file, or docs) +**Fix:** Verify epic-tech-context run, story file exists, docs present + +--- + +## Prevention Tips + +**Avoid common issues before they happen:** + +1. ✅ **Always run document-project for brownfield** - Saves hours of context issues later +2. ✅ **Use fresh chats for complex workflows** - Prevents hallucinations and context overflow +3. ✅ **Verify files exist before running workflows** - Check PRD, epics, stories are present +4. ✅ **Read agent menu before requesting workflows** - Confirm agent has the workflow +5. ✅ **Start with smaller level if unsure** - Easy to upgrade (Level 1 → 2), hard to downgrade +6. ✅ **Keep status files updated** - Manual updates when needed, don't let them drift +7. ✅ **Run retrospectives after epics** - Catch issues early, improve next epic +8. ✅ **Follow phase sequence** - Don't skip required phases (Phase 2 before 3, 3 before 4) + +--- + +**Issue not listed?** Please [report it](https://github.com/bmad-code-org/BMAD-METHOD/issues) so we can add it to this guide! diff --git a/src/modules/bmm/docs/workflows-implementation.md b/src/modules/bmm/docs/workflows-implementation.md index 7dd05641..b0cf9bb2 100644 --- a/src/modules/bmm/docs/workflows-implementation.md +++ b/src/modules/bmm/docs/workflows-implementation.md @@ -133,6 +133,7 @@ The `sprint-status.yaml` file is the single source of truth for all implementati ### (BMad Method / Enterprise) ``` +<<<<<<< Updated upstream PRD (PM) → Architecture (Architect) → create-epics-and-stories (PM) ← V6: After architecture! → implementation-readiness (Architect) @@ -141,6 +142,144 @@ PRD (PM) → Architecture (Architect) → story loop (SM/DEV) → retrospective (SM) → [Next Epic] +======= +Current Phase: 4 (Implementation) +Current Epic: Epic 1 (Authentication) +Current Sprint: Sprint 1 + +Next Story: Story 1.3 (Email Verification) +Status: TODO +Dependencies: Story 1.2 (DONE) ✅ + +**Recommendation:** Run `create-story` to generate Story 1.3 + +After create-story: +1. Run story-context +2. Run dev-story +3. Run code-review +4. Run story-done +``` + +See: [workflow-status instructions](../workflows/workflow-status/instructions.md) + +--- + +### document-project + +**Purpose:** Analyze and document brownfield projects by scanning codebase, architecture, and patterns. + +**Agent:** Analyst +**Duration:** 1-3 hours +**When to Use:** Brownfield projects without documentation + +**How It Works:** + +1. Scans codebase structure +2. Identifies architecture patterns +3. Documents technology stack +4. Creates reference documentation +5. Generates PRD-like document from existing code + +**Output:** `project-documentation-{date}.md` + +**When to Run:** + +- Before starting work on legacy project +- When inheriting undocumented codebase +- Creating onboarding documentation + +See: [document-project reference](./workflow-document-project-reference.md) + +--- + +## Story Lifecycle Visualization + +``` +┌─────────────────────────────────────────────────────────────┐ +│ PHASE 4: IMPLEMENTATION (Iterative Story Lifecycle) │ +└─────────────────────────────────────────────────────────────┘ + +┌─────────────────┐ +│ Sprint Planning │ → Creates sprint-status.yaml +└────────┬────────┘ Defines story queue + │ + ├──────────────────────────────────────────┐ + │ │ + ▼ │ +┌─────────────────────┐ │ +│ Epic Tech Context │ → Optional per epic │ +│ (Once per epic) │ Provides technical │ +└─────────────────────┘ guidance │ + │ │ + ▼ │ +┌─────────────────────────────────────────────────┤ +│ FOR EACH STORY IN QUEUE: │ +├─────────────────────────────────────────────────┤ + │ │ + ▼ │ +┌─────────────────┐ │ +│ Create Story │ → Generates story file │ +│ (TODO → IN PROGRESS) │ +└────────┬────────┘ │ + │ │ + ▼ │ +┌─────────────────┐ │ +│ Story Context │ → Assembles focused context │ +└────────┬────────┘ │ + │ │ + ▼ │ +┌─────────────────┐ │ +│ Dev Story │ → Implements + tests │ +│ (IN PROGRESS) │ │ +└────────┬────────┘ │ + │ │ + ▼ │ +┌─────────────────┐ │ +│ Code Review │ → Senior dev review │ +│ (IN PROGRESS → │ │ +│ READY FOR REVIEW) │ +└────────┬────────┘ │ + │ │ + ┌────┴────┐ │ + │ Result? │ │ + └────┬────┘ │ + │ │ + ┌────┼────────────────────┐ │ + │ │ │ │ + ▼ ▼ ▼ │ +APPROVED APPROVED REQUEST │ + WITH COMMENTS CHANGES │ + │ │ │ │ + └─────────┴───────────────────┘ │ + │ │ + ▼ │ + ┌─────────────────┐ │ + │ Story Done │ → READY FOR REVIEW → DONE│ + └────────┬────────┘ │ + │ │ + ├─────────────────────────────────────┘ + │ More stories? + │ + ▼ + ┌────────────────┐ + │ Epic Complete? │ + └────────┬───────┘ + │ + ┌────┼────┐ + │ │ + Yes No + │ └──> Continue to next story + │ + ▼ +┌─────────────────┐ +│ Retrospective │ → Review epic, lessons learned +└─────────────────┘ + │ + ▼ + All epics done? + │ + Yes → PROJECT COMPLETE +>>>>>>> Stashed changes ``` --- diff --git a/src/modules/bmm/tasks/daily-standup.xml b/src/modules/bmm/tasks/daily-standup.xml new file mode 100644 index 00000000..d41c362c --- /dev/null +++ b/src/modules/bmm/tasks/daily-standup.xml @@ -0,0 +1,85 @@ + + + MANDATORY: Execute ALL steps in the flow section IN EXACT ORDER + DO NOT skip steps or change the sequence + HALT immediately when halt-conditions are met + Each action tag within a step tag is a REQUIRED action to complete that step + Sections outside flow (validation, output, critical-context) provide essential context - review and apply throughout execution + + + + Check for stories folder at {project-root}{output_folder}/stories/ + Find current story by identifying highest numbered story file + Read story status (In Progress, Ready for Review, etc.) + Extract agent notes from Dev Agent Record, TEA Results, PO Notes sections + Check for next story references from epics + Identify blockers from story sections + + + + + 🏃 DAILY STANDUP - Story-{{number}}: {{title}} + + Current Sprint Status: + - Active Story: story-{{number}} ({{status}} - {{percentage}}% complete) + - Next in Queue: story-{{next-number}}: {{next-title}} + - Blockers: {{blockers-from-story}} + + Team assembled based on story participants: + {{ List Agents from {project-root}/bmad/_cfg/agent-manifest.csv }} + + + + + Each agent provides three items referencing real story data + What I see: Their perspective on current work, citing story sections (1-2 sentences) + What concerns me: Issues from their domain or story blockers (1-2 sentences) + What I suggest: Actionable recommendations for progress (1-2 sentences) + + + + + 📋 STANDUP SUMMARY: + Key Items from Story File: + - {{completion-percentage}}% complete ({{tasks-complete}}/{{total-tasks}} tasks) + - Blocker: {{main-blocker}} + - Next: {{next-story-reference}} + + Action Items: + - {{agent}}: {{action-item}} + - {{agent}}: {{action-item}} + - {{agent}}: {{action-item}} + + Need extended discussion? Use *party-mode for detailed breakout. + + + + + + + Primary: Sarah (PO), Mary (Analyst), Winston (Architect) + Secondary: Murat (TEA), James (Dev) + + + Primary: Sarah (PO), Bob (SM), James (Dev) + Secondary: Murat (TEA) + + + Primary: Winston (Architect), James (Dev), Murat (TEA) + Secondary: Sarah (PO) + + + Primary: James (Dev), Murat (TEA), Winston (Architect) + Secondary: Sarah (PO) + + + + + This task extends party-mode with agile-specific structure + Time-box responses (standup = brief) + Focus on actionable items from real story data when available + End with clear next steps + No deep dives (suggest breakout if needed) + If no stories folder detected, run general standup format + + \ No newline at end of file diff --git a/tools/cli/commands/agent-install.js b/tools/cli/commands/agent-install.js index 57b0c8c1..e5d19db9 100644 --- a/tools/cli/commands/agent-install.js +++ b/tools/cli/commands/agent-install.js @@ -2,6 +2,8 @@ const chalk = require('chalk'); const path = require('node:path'); const fs = require('node:fs'); const readline = require('node:readline'); +const yaml = require('js-yaml'); +const inquirer = require('inquirer'); const { findBmadConfig, resolvePath, @@ -18,6 +20,122 @@ const { updateManifestYaml, } = require('../lib/agent/installer'); +/** + * Initialize BMAD core infrastructure in a directory + * @param {string} projectDir - Project directory where .bmad should be created + * @param {string} bmadFolderName - Name of the BMAD folder (default: .bmad) + * @returns {Promise} BMAD project info + */ +async function initializeBmadCore(projectDir, bmadFolderName = '.bmad') { + const bmadDir = path.join(projectDir, bmadFolderName); + const cfgDir = path.join(bmadDir, '_cfg'); + + console.log(chalk.cyan('\n🏗️ Initializing BMAD Core Infrastructure\n')); + + // Use the ConfigCollector to ask proper core configuration questions + const { ConfigCollector } = require('../installers/lib/core/config-collector'); + const configCollector = new ConfigCollector(); + + // Collect core configuration answers + await configCollector.loadExistingConfig(projectDir); + await configCollector.collectModuleConfig('core', projectDir, true, true); + + // Extract core answers from allAnswers (they are prefixed with 'core_') + const coreAnswers = {}; + if (configCollector.allAnswers) { + for (const [key, value] of Object.entries(configCollector.allAnswers)) { + if (key.startsWith('core_')) { + const configKey = key.slice(5); // Remove 'core_' prefix + coreAnswers[configKey] = value; + } + } + } + + // Ask for IDE selection + console.log(chalk.cyan('\n💻 IDE Configuration\n')); + console.log(chalk.dim('Select IDEs to integrate with the installed agents:')); + + const { UI } = require('../lib/ui'); + const ui = new UI(); + const ideConfig = await ui.promptToolSelection(projectDir, ['core']); + const selectedIdes = ideConfig.ides || []; + + // Create directory structure + console.log(chalk.dim('\nCreating directory structure...')); + await fs.promises.mkdir(bmadDir, { recursive: true }); + await fs.promises.mkdir(cfgDir, { recursive: true }); + await fs.promises.mkdir(path.join(bmadDir, 'core'), { recursive: true }); + await fs.promises.mkdir(path.join(bmadDir, 'custom', 'agents'), { recursive: true }); + await fs.promises.mkdir(path.join(cfgDir, 'agents'), { recursive: true }); + await fs.promises.mkdir(path.join(cfgDir, 'custom', 'agents'), { recursive: true }); + + // Create core config.yaml file + const coreConfigFile = { + '# CORE Module Configuration': 'Generated by BMAD Agent Installer', + Version: require(path.join(__dirname, '../../../package.json')).version, + Date: new Date().toISOString(), + bmad_folder: bmadFolderName, + ...coreAnswers, + }; + + const coreConfigPath = path.join(bmadDir, 'core', 'config.yaml'); + await fs.promises.writeFile(coreConfigPath, yaml.dump(coreConfigFile), 'utf8'); + + // Create manifest.yaml with complete structure + const manifest = { + version: require(path.join(__dirname, '../../../package.json')).version, + date: new Date().toISOString(), + user_name: coreAnswers.user_name, + communication_language: coreAnswers.communication_language, + document_output_language: coreAnswers.document_output_language, + output_folder: coreAnswers.output_folder, + install_user_docs: coreAnswers.install_user_docs, + bmad_folder: bmadFolderName, + modules: ['core'], + ides: selectedIdes, + custom_agents: [], + }; + + const manifestPath = path.join(cfgDir, 'manifest.yaml'); + await fs.promises.writeFile(manifestPath, yaml.dump(manifest), 'utf8'); + + // Create empty manifests + const agentManifestPath = path.join(cfgDir, 'agent-manifest.csv'); + await fs.promises.writeFile(agentManifestPath, 'type,subtype,name,path,display_name,description,author,version,tags\n', 'utf8'); + + // Setup IDE configurations + if (selectedIdes.length > 0) { + console.log(chalk.dim('\nSetting up IDE configurations...')); + const { IdeManager } = require('../installers/lib/ide/manager'); + const ideManager = new IdeManager(); + + for (const ide of selectedIdes) { + await ideManager.setup(ide, projectDir, bmadDir, { + selectedModules: ['core'], + skipModuleInstall: false, + verbose: false, + preCollectedConfig: coreAnswers, + }); + } + } + + console.log(chalk.green('\n✓ BMAD core infrastructure initialized')); + console.log(chalk.dim(` BMAD folder: ${bmadDir}`)); + console.log(chalk.dim(` Core config: ${coreConfigPath}`)); + console.log(chalk.dim(` Manifest: ${manifestPath}`)); + if (selectedIdes.length > 0) { + console.log(chalk.dim(` IDEs configured: ${selectedIdes.join(', ')}`)); + } + + return { + projectRoot: projectDir, + bmadFolder: bmadDir, + cfgFolder: cfgDir, + manifestFile: agentManifestPath, + ides: selectedIdes, + }; +} + module.exports = { command: 'agent-install', description: 'Install and compile BMAD agents with personalization', @@ -196,12 +314,55 @@ module.exports = { // If no target specified, prompt for it if (targetDir) { - // If target provided via --destination, check if it's a project root and adjust + // Check if target has BMAD infrastructure const otherProject = detectBmadProject(targetDir); - if (otherProject && !targetDir.includes('agents')) { - // User specified project root, redirect to custom agents folder - targetDir = path.join(otherProject.bmadFolder, 'custom', 'agents'); - console.log(chalk.dim(` Auto-selecting custom agents folder: ${targetDir}`)); + + if (!otherProject) { + // No BMAD infrastructure found - offer to initialize + console.log(chalk.yellow(`\n⚠️ No BMAD infrastructure found in: ${targetDir}`)); + + const initResponse = await inquirer.prompt([ + { + type: 'confirm', + name: 'initialize', + message: 'Initialize BMAD core infrastructure here? (Choose No for direct installation)', + default: true, + }, + ]); + + if (initResponse.initialize) { + // Initialize BMAD core + targetDir = path.resolve(targetDir); + await initializeBmadCore(targetDir, '.bmad'); + // Set targetDir to the custom agents folder + targetDir = path.join(targetDir, '.bmad', 'custom', 'agents'); + console.log(chalk.dim(` Agent will be installed to: ${targetDir}`)); + } else { + // User declined - keep original targetDir + console.log(chalk.yellow(` Installing agent directly to: ${targetDir}`)); + } + } else if (otherProject && !targetDir.includes('agents')) { + console.log(chalk.yellow(`\n⚠️ Path is inside BMAD project: ${otherProject.projectRoot}`)); + + const projectChoice = await inquirer.prompt([ + { + type: 'list', + name: 'choice', + message: 'Choose installation method:', + choices: [ + { name: `Install to BMAD's custom agents folder (${otherProject.bmadFolder}/custom/agents)`, value: 'bmad' }, + { name: `Install directly to specified path (${targetDir})`, value: 'direct' }, + ], + default: 'bmad', + }, + ]); + + if (projectChoice.choice === 'bmad') { + targetDir = path.join(otherProject.bmadFolder, 'custom', 'agents'); + console.log(chalk.dim(` Installing to BMAD custom agents folder: ${targetDir}`)); + } else { + console.log(chalk.yellow(` Installing directly to: ${targetDir}`)); + } } } else { const rl = readline.createInterface({ @@ -214,38 +375,72 @@ module.exports = { // Option 1: Current project's custom agents folder const currentCustom = path.join(config.bmadFolder, 'custom', 'agents'); console.log(` 1. Current project: ${chalk.dim(currentCustom)}`); - - // Option 2: Specify another project path - console.log(` 2. Another project (enter path)`); + console.log(` 2. Enter path directly (e.g., /Users/brianmadison/dev/test)`); const choice = await new Promise((resolve) => { - rl.question('\n Select option (1 or path): ', resolve); + rl.question('\n Select option (1 or 2): ', resolve); }); if (choice.trim() === '1' || choice.trim() === '') { targetDir = currentCustom; } else if (choice.trim() === '2') { - const projectPath = await new Promise((resolve) => { - rl.question(' Project path: ', resolve); + const userPath = await new Promise((resolve) => { + rl.question(' Enter path: ', resolve); }); // Detect if it's a BMAD project and use its custom folder - const otherProject = detectBmadProject(path.resolve(projectPath)); + const otherProject = detectBmadProject(path.resolve(userPath)); + if (otherProject) { - targetDir = path.join(otherProject.bmadFolder, 'custom', 'agents'); - console.log(chalk.dim(` Found BMAD project, using: ${targetDir}`)); + console.log(chalk.yellow(`\n⚠️ Path is inside BMAD project: ${otherProject.projectRoot}`)); + + const projectChoice = await inquirer.prompt([ + { + type: 'list', + name: 'choice', + message: 'Choose installation method:', + choices: [ + { name: `Install to BMAD's custom agents folder (${otherProject.bmadFolder}/custom/agents)`, value: 'bmad' }, + { name: `Install directly to specified path (${userPath})`, value: 'direct' }, + ], + default: 'bmad', + }, + ]); + + if (projectChoice.choice === 'bmad') { + targetDir = path.join(otherProject.bmadFolder, 'custom', 'agents'); + console.log(chalk.dim(` Installing to BMAD custom agents folder: ${targetDir}`)); + } else { + targetDir = path.resolve(userPath); + console.log(chalk.yellow(` Installing directly to: ${targetDir}`)); + } } else { - targetDir = path.resolve(projectPath); + // No BMAD found - offer to initialize + console.log(chalk.yellow(`\n⚠️ No BMAD infrastructure found in: ${userPath}`)); + + const initResponse = await inquirer.prompt([ + { + type: 'confirm', + name: 'initialize', + message: 'Initialize BMAD core infrastructure here? (Choose No for direct installation)', + default: true, + }, + ]); + + if (initResponse.initialize) { + await initializeBmadCore(path.resolve(userPath), '.bmad'); + targetDir = path.join(path.resolve(userPath), '.bmad', 'custom', 'agents'); + console.log(chalk.dim(` Agent will be installed to: ${targetDir}`)); + } else { + // User declined - create the directory and install directly + targetDir = path.resolve(userPath); + console.log(chalk.yellow(` Installing agent directly to: ${targetDir}`)); + } } } else { - // User entered a path directly - const otherProject = detectBmadProject(path.resolve(choice)); - if (otherProject) { - targetDir = path.join(otherProject.bmadFolder, 'custom', 'agents'); - console.log(chalk.dim(` Found BMAD project, using: ${targetDir}`)); - } else { - targetDir = path.resolve(choice); - } + console.log(chalk.red(' Invalid selection. Please choose 1 or 2.')); + rl.close(); + process.exit(1); } rl.close(); diff --git a/tools/cli/commands/install.js b/tools/cli/commands/install.js index d5742cf7..a2f0e755 100644 --- a/tools/cli/commands/install.js +++ b/tools/cli/commands/install.js @@ -1,11 +1,513 @@ const chalk = require('chalk'); const path = require('node:path'); +const fs = require('fs-extra'); const { Installer } = require('../installers/lib/core/installer'); const { UI } = require('../lib/ui'); const installer = new Installer(); const ui = new UI(); +/** + * Install custom content (agents, workflows, modules) + * @param {Object} config - Installation configuration + * @param {Object} result - Installation result + * @param {string} projectDirectory - Project directory path + */ +async function installCustomContent(config, result, projectDirectory) { + const { customContent } = config; + const { selectedItems } = customContent; + const projectDir = projectDirectory; + const bmadDir = result.path; + + console.log(chalk.dim(`Project: ${projectDir}`)); + console.log(chalk.dim(`BMAD: ${bmadDir}`)); + + // Install custom agents - use agent-install logic + if (selectedItems.agents.length > 0) { + console.log(chalk.blue(`\n👥 Installing ${selectedItems.agents.length} custom agent(s)...`)); + for (const agent of selectedItems.agents) { + await installCustomAgentWithPrompts(agent, projectDir, bmadDir, config); + } + } + + // Install custom workflows - copy and register with IDEs + if (selectedItems.workflows.length > 0) { + console.log(chalk.blue(`\n📋 Installing ${selectedItems.workflows.length} custom workflow(s)...`)); + for (const workflow of selectedItems.workflows) { + await installCustomWorkflowWithIDE(workflow, projectDir, bmadDir, config); + } + } + + // Install custom modules - treat like regular modules + if (selectedItems.modules.length > 0) { + console.log(chalk.blue(`\n🔧 Installing ${selectedItems.modules.length} custom module(s)...`)); + for (const module of selectedItems.modules) { + await installCustomModuleAsRegular(module, projectDir, bmadDir, config); + } + } + + console.log(chalk.green('\n✓ Custom content installation complete!')); +} + +/** + * Install a custom agent with proper prompts (mirrors agent-install.js) + */ +async function installCustomAgentWithPrompts(agent, projectDir, bmadDir, config) { + const { + discoverAgents, + loadAgentConfig, + addToManifest, + extractManifestData, + promptInstallQuestions, + createIdeSlashCommands, + updateManifestYaml, + saveAgentSource, + } = require('../lib/agent/installer'); + const { compileAgent } = require('../lib/agent/compiler'); + const inquirer = require('inquirer'); + const readline = require('node:readline'); + const yaml = require('js-yaml'); + + console.log(chalk.cyan(` Installing agent: ${agent.name}`)); + + // Load agent config + const agentConfig = loadAgentConfig(agent.yamlPath); + const agentType = agent.name; // e.g., "toolsmith" + + // Confirm/customize agent persona name (mirrors agent-install.js) + const rl1 = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + + const defaultPersonaName = agentConfig.metadata.name || agentType; + console.log(chalk.cyan(`\n 📛 Agent Persona Name`)); + console.log(chalk.dim(` Agent type: ${agentType}`)); + console.log(chalk.dim(` Default persona: ${defaultPersonaName}`)); + console.log(chalk.dim(' Leave blank to use default, or provide a custom name.')); + console.log(chalk.dim(' Examples:')); + console.log(chalk.dim(` - (blank) → "${defaultPersonaName}" as ${agentType}.md`)); + console.log(chalk.dim(` - "Fred" → "Fred" as fred-${agentType}.md`)); + console.log(chalk.dim(` - "Captain Code" → "Captain Code" as captain-code-${agentType}.md`)); + + const customPersonaName = await new Promise((resolve) => { + rl1.question(`\n Custom name (or Enter for default): `, resolve); + }); + rl1.close(); + + // Determine final agent file name based on persona name + let finalAgentName; + let personaName; + if (customPersonaName.trim()) { + personaName = customPersonaName.trim(); + const namePrefix = personaName.toLowerCase().replaceAll(/\s+/g, '-'); + finalAgentName = `${namePrefix}-${agentType}`; + } else { + personaName = defaultPersonaName; + finalAgentName = agentType; + } + + console.log(chalk.dim(` Persona: ${personaName}`)); + console.log(chalk.dim(` File: ${finalAgentName}.md`)); + + // Get answers (prompt or use defaults) + let presetAnswers = {}; + + // If custom persona name provided, inject it as custom_name for template processing + if (customPersonaName.trim()) { + presetAnswers.custom_name = personaName; + } + + let answers; + if (agentConfig.installConfig) { + answers = await promptInstallQuestions(agentConfig.installConfig, agentConfig.defaults, presetAnswers); + } else { + answers = { ...agentConfig.defaults, ...presetAnswers }; + } + + // Create target directory + const targetDir = path.join(bmadDir, 'custom', 'agents', finalAgentName); + await fs.ensureDir(targetDir); + + // Compile agent with answers + const { xml, metadata } = compileAgent( + agentConfig.yamlContent, + answers, + finalAgentName, + `.bmad/custom/agents/${finalAgentName}/${finalAgentName}.md`, + ); + + // Write compiled agent + const compiledPath = path.join(targetDir, `${finalAgentName}.md`); + await fs.writeFile(compiledPath, xml, 'utf8'); + + // Copy sidecar files if exists + if (agent.hasSidecar) { + const entries = await fs.readdir(agent.path, { withFileTypes: true }); + for (const entry of entries) { + if (entry.isFile() && !entry.name.endsWith('.agent.yaml')) { + await fs.copy(path.join(agent.path, entry.name), path.join(targetDir, entry.name)); + } + } + } + + // Save source YAML for reinstallation + const cfgAgentsBackupDir = path.join(bmadDir, '_cfg', 'custom', 'agents'); + await fs.ensureDir(cfgAgentsBackupDir); + const backupYamlPath = path.join(cfgAgentsBackupDir, `${finalAgentName}.agent.yaml`); + await fs.copy(agent.yamlPath, backupYamlPath); + + // Add to agent manifest + const manifestFile = path.join(bmadDir, '_cfg', 'agent-manifest.csv'); + const relativePath = `.bmad/custom/agents/${finalAgentName}/${finalAgentName}.md`; + const manifestData = extractManifestData(xml, { ...metadata, name: finalAgentName }, relativePath, 'custom'); + manifestData.name = finalAgentName; + manifestData.displayName = metadata.name || finalAgentName; + addToManifest(manifestFile, manifestData); + + // Update manifest.yaml + const manifestYamlPath = path.join(bmadDir, '_cfg', 'manifest.yaml'); + updateManifestYaml(manifestYamlPath, finalAgentName, finalAgentName); + + // Create IDE slash commands using existing IDEs from config + const ideResults = await createIdeSlashCommands(projectDir, finalAgentName, relativePath, metadata, config.ides || []); + const ideCount = Object.keys(ideResults).length; + + console.log(chalk.green(` ✓ ${finalAgentName} (registered with ${ideCount} IDE${ideCount === 1 ? '' : 's'})`)); +} + +/** + * Install a custom workflow and register with all IDEs + */ +async function installCustomWorkflowWithIDE(workflow, projectDir, bmadDir, config) { + const targetDir = path.join(bmadDir, 'custom', 'workflows'); + + // Check if workflow is a directory or just a file + // workflow.path might be a file (workflow.md) or a directory + let sourcePath = workflow.path; + let isDirectory = false; + + try { + const stats = await fs.stat(workflow.path); + isDirectory = stats.isDirectory(); + } catch { + console.log(chalk.red(` ERROR: Cannot access workflow path: ${workflow.path}`)); + return; + } + + // If it's a file ending in workflow.md, use the parent directory + if (!isDirectory && workflow.path.endsWith('workflow.md')) { + sourcePath = path.dirname(workflow.path); + isDirectory = true; + } + + if (isDirectory) { + // Copy the entire workflow directory + const workflowName = path.basename(sourcePath); + const targetWorkflowDir = path.join(targetDir, workflowName); + await fs.copy(sourcePath, targetWorkflowDir); + + // Update manifest with the main workflow.md file + const relativePath = `.bmad/custom/workflows/${workflowName}/workflow.md`; + await addWorkflowToManifest(bmadDir, workflow.name, workflow.description, relativePath, 'custom'); + } else { + // Single file workflow + const targetFileName = path.basename(sourcePath); + const targetPath = path.join(targetDir, targetFileName); + await fs.copy(sourcePath, targetPath); + + // Update manifest + const relativePath = `.bmad/custom/workflows/${targetFileName}`; + await addWorkflowToManifest(bmadDir, workflow.name, workflow.description, relativePath, 'custom'); + } + + // Register workflow with all configured IDEs + const relativePath = `.bmad/custom/workflows/${path.basename(workflow.path)}`; + if (config.ides && config.ides.length > 0) { + const { IdeManager } = require('../installers/lib/ide/manager'); + const ideManager = new IdeManager(); + + for (const ide of config.ides) { + try { + // IdeManager uses a Map, not getHandler method + const ideHandler = ideManager.handlers.get(ide.toLowerCase()); + if (ideHandler && typeof ideHandler.registerWorkflow === 'function') { + await ideHandler.registerWorkflow(projectDir, bmadDir, workflow.name, relativePath); + console.log(chalk.dim(` ✓ Registered with ${ide}`)); + } + } catch (error) { + console.log(chalk.yellow(` ⚠️ Could not register with ${ide}: ${error.message}`)); + } + } + } + + console.log(chalk.green(` ✓ ${workflow.name} (copied to custom workflows and registered with IDEs)`)); +} + +/** + * Helper to add workflow to manifest + */ +async function addWorkflowToManifest(bmadDir, name, description, relativePath, moduleType = 'custom') { + const workflowManifestPath = path.join(bmadDir, '_cfg', 'workflow-manifest.csv'); + + console.log(chalk.dim(`[DEBUG] Adding workflow to manifest: ${name} -> ${relativePath} (module: ${moduleType})`)); + + // Read existing manifest + let manifestContent = ''; + if (await fs.pathExists(workflowManifestPath)) { + manifestContent = await fs.readFile(workflowManifestPath, 'utf8'); + } + + // Ensure header exists + if (!manifestContent.includes('name,description,module,path')) { + manifestContent = 'name,description,module,path\n'; + } + + // Add workflow entry + const csvLine = `"${name}","${description}","${moduleType}","${relativePath}"\n`; + + // Check if workflow already exists in manifest + if (manifestContent.includes(`"${name}",`)) { + console.log(chalk.dim(`[DEBUG] Workflow already exists in manifest: ${name}`)); + } else { + try { + await fs.writeFile(workflowManifestPath, manifestContent + csvLine); + console.log(chalk.dim(`[DEBUG] Successfully added to manifest`)); + } catch (error) { + console.log(chalk.red(`[ERROR] Failed to write to manifest: ${error.message}`)); + } + } +} + +/** + * Install a custom module like a regular module + */ +async function installCustomModuleAsRegular(module, projectDir, bmadDir, config) { + const yaml = require('js-yaml'); + const path = require('node:path'); + + // The custom module path should be the source location + const customSrcPath = module.path; + + // Install the custom module by copying it to the custom modules directory + const targetDir = path.join(bmadDir, 'custom', 'modules', module.name); + await fs.copy(customSrcPath, targetDir); + + // Check if module has an installer and run it from the ORIGINAL source location + const installerPath = path.join(customSrcPath, '_module-installer', 'installer.js'); + if (await fs.pathExists(installerPath)) { + try { + // Clear require cache to ensure fresh import + delete require.cache[require.resolve(installerPath)]; + + // Load and run the module installer + const moduleInstaller = require(installerPath); + await moduleInstaller.install({ + projectRoot: projectDir, + config: config.coreConfig || {}, + installedIDEs: config.ides || [], + logger: { + log: (msg) => console.log(chalk.dim(` ${msg}`)), + error: (msg) => console.log(chalk.red(` ERROR: ${msg}`)), + }, + }); + console.log(chalk.green(` ✓ ${module.name} (custom installer executed)`)); + } catch (error) { + console.log(chalk.yellow(` ⚠️ ${module.name} installer failed: ${error.message}`)); + console.log(chalk.dim(` Module copied but not configured`)); + } + } else { + // No installer - check if module has agents/workflows to install + console.log(chalk.dim(` Processing module agents and workflows...`)); + + // Install agents from the module + const agentsPath = path.join(customSrcPath, 'agents'); + if (await fs.pathExists(agentsPath)) { + const agentFiles = await fs.readdir(agentsPath); + for (const agentFile of agentFiles) { + if (agentFile.endsWith('.yaml')) { + const agentPath = path.join(agentsPath, agentFile); + await installModuleAgent(agentPath, module.name, projectDir, bmadDir, config); + } + } + } + + // Install workflows from the module + const workflowsPath = path.join(customSrcPath, 'workflows'); + if (await fs.pathExists(workflowsPath)) { + const workflowDirs = await fs.readdir(workflowsPath, { withFileTypes: true }); + for (const workflowDir of workflowDirs) { + if (workflowDir.isDirectory()) { + const workflowPath = path.join(workflowsPath, workflowDir.name); + await installModuleWorkflow(workflowPath, module.name, projectDir, bmadDir, config); + } + } + } + + console.log(chalk.green(` ✓ ${module.name}`)); + } + + // Update manifest.yaml to include custom module with proper prefix + const manifestYamlPath = path.join(bmadDir, '_cfg', 'manifest.yaml'); + + if (await fs.pathExists(manifestYamlPath)) { + const manifest = yaml.load(await fs.readFile(manifestYamlPath, 'utf8')); + + // Remove any old entries without custom- prefix for this module + const oldModuleName = module.name; + if (manifest.modules.includes(oldModuleName)) { + manifest.modules = manifest.modules.filter((m) => m !== oldModuleName); + console.log(chalk.dim(` Removed old entry: ${oldModuleName}`)); + } + + // Custom modules should be stored with custom- prefix + const moduleNameWithPrefix = `custom-${module.name}`; + if (!manifest.modules.includes(moduleNameWithPrefix)) { + manifest.modules.push(moduleNameWithPrefix); + console.log(chalk.dim(` Added to manifest.yaml as ${moduleNameWithPrefix}`)); + } + + // Write back the cleaned manifest + await fs.writeFile(manifestYamlPath, yaml.dump(manifest), 'utf8'); + } + + // Register module with IDEs (like regular modules do) + if (config.ides && config.ides.length > 0) { + const { IdeManager } = require('../installers/lib/ide/manager'); + const ideManager = new IdeManager(); + + for (const ide of config.ides) { + try { + // IdeManager uses a Map, not direct property access + const handler = ideManager.handlers.get(ide.toLowerCase()); + if (handler && handler.moduleInjector) { + // Check if module has IDE-specific customizations + const subModulePath = path.join(customSrcPath, 'sub-modules', ide); + if (await fs.pathExists(subModulePath)) { + console.log(chalk.dim(` ✓ Found ${ide} customizations for ${module.name}`)); + } + } + } catch (error) { + console.log(chalk.yellow(` ⚠️ Could not configure ${ide} for ${module.name}: ${error.message}`)); + } + } + } +} + +/** + * Install an agent from a module + */ +async function installModuleAgent(agentPath, moduleName, projectDir, bmadDir, config) { + const { + loadAgentConfig, + addToManifest, + extractManifestData, + createIdeSlashCommands, + updateManifestYaml, + } = require('../lib/agent/installer'); + const { compileAgent } = require('../lib/agent/compiler'); + + const agentName = path.basename(agentPath, '.yaml'); + console.log(chalk.dim(` Installing agent: ${agentName} (from ${moduleName})`)); + + // Load agent config + const agentConfig = loadAgentConfig(agentPath); + + // Compile agent with defaults (no prompts for module agents) + const { xml, metadata } = compileAgent( + agentConfig.yamlContent, + agentConfig.defaults || {}, + agentName, + `.bmad/custom/modules/${moduleName}/agents/${agentName}.md`, + ); + + // Create target directory + const targetDir = path.join(bmadDir, 'custom', 'modules', moduleName, 'agents'); + await fs.ensureDir(targetDir); + + // Write compiled agent + const compiledPath = path.join(targetDir, `${agentName}.md`); + await fs.writeFile(compiledPath, xml, 'utf8'); + + // Remove the raw YAML file after compilation + const yamlPath = path.join(targetDir, `${agentName}.yaml`); + if (await fs.pathExists(yamlPath)) { + await fs.remove(yamlPath); + } + + // Add to agent manifest + const manifestFile = path.join(bmadDir, '_cfg', 'agent-manifest.csv'); + const relativePath = `.bmad/custom/modules/${moduleName}/agents/${agentName}.md`; + const manifestData = extractManifestData(xml, { ...metadata, name: agentName }, relativePath, 'custom'); + manifestData.name = `${moduleName}-${agentName}`; + manifestData.displayName = metadata.name || agentName; + addToManifest(manifestFile, manifestData); + + // Update manifest.yaml + const manifestYamlPath = path.join(bmadDir, '_cfg', 'manifest.yaml'); + updateManifestYaml(manifestYamlPath, `${moduleName}-${agentName}`, agentName); + + // Create IDE slash commands + const ideResults = await createIdeSlashCommands(projectDir, `${moduleName}-${agentName}`, relativePath, metadata, config.ides || []); + const ideCount = Object.keys(ideResults).length; + + console.log(chalk.dim(` ✓ ${agentName} (registered with ${ideCount} IDE${ideCount === 1 ? '' : 's'})`)); +} + +/** + * Install a workflow from a module + */ +async function installModuleWorkflow(workflowPath, moduleName, projectDir, bmadDir, config) { + const workflowName = path.basename(workflowPath); + + // Copy the workflow directory + const targetDir = path.join(bmadDir, 'custom', 'modules', moduleName, 'workflows', workflowName); + await fs.copy(workflowPath, targetDir); + + // Add to workflow manifest + const workflowManifestPath = path.join(bmadDir, '_cfg', 'workflow-manifest.csv'); + const relativePath = `.bmad/custom/modules/${moduleName}/workflows/${workflowName}/README.md`; + + // Read existing manifest + let manifestContent = ''; + if (await fs.pathExists(workflowManifestPath)) { + manifestContent = await fs.readFile(workflowManifestPath, 'utf8'); + } + + // Ensure header exists + if (!manifestContent.includes('name,description,module,path')) { + manifestContent = 'name,description,module,path\n'; + } + + // Add workflow entry + const csvLine = `"${moduleName}-${workflowName}","Workflow from ${moduleName} module","${moduleName}","${relativePath}"\n`; + + // Check if workflow already exists in manifest + if (!manifestContent.includes(`"${moduleName}-${workflowName}",`)) { + await fs.writeFile(workflowManifestPath, manifestContent + csvLine); + } + + // Register with IDEs + if (config.ides && config.ides.length > 0) { + const { IdeManager } = require('../installers/lib/ide/manager'); + const ideManager = new IdeManager(); + + for (const ide of config.ides) { + try { + const ideHandler = ideManager.handlers.get(ide.toLowerCase()); + if (ideHandler && typeof ideHandler.registerWorkflow === 'function') { + await ideHandler.registerWorkflow(projectDir, bmadDir, `${moduleName}-${workflowName}`, relativePath); + console.log(chalk.dim(` ✓ Registered with ${ide}`)); + } + } catch (error) { + console.log(chalk.yellow(` ⚠️ Could not register with ${ide}: ${error.message}`)); + } + } + } + + console.log(chalk.dim(` ✓ ${workflowName} workflow added and registered`)); +} + module.exports = { command: 'install', description: 'Install BMAD Core agents and tools', @@ -18,7 +520,6 @@ module.exports = { if (config.actionType === 'cancel') { console.log(chalk.yellow('Installation cancelled.')); process.exit(0); - return; } // Handle agent compilation separately @@ -27,7 +528,6 @@ module.exports = { console.log(chalk.green('\n✨ Agent compilation complete!')); console.log(chalk.cyan(`Rebuilt ${result.agentCount} agents and ${result.taskCount} tasks`)); process.exit(0); - return; } // Handle quick update separately @@ -35,8 +535,71 @@ module.exports = { const result = await installer.quickUpdate(config); console.log(chalk.green('\n✨ Quick update complete!')); console.log(chalk.cyan(`Updated ${result.moduleCount} modules with preserved settings`)); + + // After quick update, check for existing custom content and re-install to regenerate IDE commands + const { UI } = require('../lib/ui'); + const ui = new UI(); + const customPath = path.join(config.directory, 'bmad-custom-src'); + + // Check if custom content exists + if (await fs.pathExists(customPath)) { + console.log(chalk.cyan('\n📦 Detecting custom content to update IDE commands...')); + + // Get existing custom content selections (default to all for updates) + const existingCustom = { + agents: (await fs.pathExists(path.join(customPath, 'agents'))) ? true : false, + workflows: (await fs.pathExists(path.join(customPath, 'workflows'))) ? true : false, + modules: (await fs.pathExists(path.join(customPath, 'modules'))) ? true : false, + }; + + // Auto-select all existing custom content for update + if (existingCustom.agents || existingCustom.workflows || existingCustom.modules) { + const customContent = await ui.discoverCustomContent(customPath); + + config.customContent = { + path: customPath, + selectedItems: { + agents: existingCustom.agents ? customContent.agents.map((a) => ({ ...a, selected: true })) : [], + workflows: existingCustom.workflows ? customContent.workflows.map((w) => ({ ...w, selected: true })) : [], + modules: existingCustom.modules ? customContent.modules.map((m) => ({ ...m, selected: true })) : [], + }, + }; + + await installCustomContent(config, result, config.directory); + + // Re-run IDE setup to register custom workflows with IDEs + if (config.ides && config.ides.length > 0) { + console.log(chalk.cyan('\n🔧 Updating IDE configurations for custom content...')); + const { IdeManager } = require('../installers/lib/ide/manager'); + const ideManager = new IdeManager(); + + for (const ide of config.ides) { + try { + const ideResult = await ideManager.setup(ide, config.directory, result.path, { + selectedModules: [...(config.modules || []), 'custom'], // Include 'custom' for custom agents/workflows + skipModuleInstall: true, // Don't install modules again + verbose: false, + preCollectedConfig: { + ...config.coreConfig, + _alreadyConfigured: true, // Skip reconfiguration that might add duplicates + }, + }); + + if (ideResult.success) { + console.log(chalk.dim(` ✓ Updated ${ide} with custom workflows`)); + } + } catch (error) { + console.log(chalk.yellow(` ⚠️ Could not update ${ide}: ${error.message}`)); + } + } + } + } else { + console.log(chalk.dim(' No custom content found to update')); + } + } + + console.log(chalk.green('\n✨ Update complete with custom content!')); process.exit(0); - return; } // Handle reinstall by setting force flag @@ -55,11 +618,43 @@ module.exports = { // Check if installation was cancelled if (result && result.cancelled) { process.exit(0); - return; } // Check if installation succeeded if (result && result.success) { + // Install custom content if selected + if (config.customContent && config.customContent.selectedItems) { + console.log(chalk.cyan('\n📦 Installing Custom Content...')); + await installCustomContent(config, result, config.directory); + + // Re-run IDE setup to register custom workflows with IDEs + if (config.ides && config.ides.length > 0) { + console.log(chalk.cyan('\n🔧 Updating IDE configurations for custom content...')); + const { IdeManager } = require('../installers/lib/ide/manager'); + const ideManager = new IdeManager(); + + for (const ide of config.ides) { + try { + const ideResult = await ideManager.setup(ide, config.directory, result.path, { + selectedModules: [...(config.modules || []), 'custom'], // Include 'custom' for custom agents/workflows + skipModuleInstall: true, // Don't install modules again + verbose: false, + preCollectedConfig: { + ...config.coreConfig, + _alreadyConfigured: true, // Skip reconfiguration that might add duplicates + }, + }); + + if (ideResult.success) { + console.log(chalk.dim(` ✓ Updated ${ide} with custom workflows`)); + } + } catch (error) { + console.log(chalk.yellow(` ⚠️ Could not update ${ide}: ${error.message}`)); + } + } + } + } + console.log(chalk.green('\n✨ Installation complete!')); console.log(chalk.cyan('BMAD Core and Selected Modules have been installed to:'), chalk.bold(result.path)); console.log(chalk.yellow('\nThank you for helping test the early release version of the new BMad Core and BMad Method!')); diff --git a/tools/cli/installers/lib/core/config-collector.js b/tools/cli/installers/lib/core/config-collector.js index 17c233bb..d67b6256 100644 --- a/tools/cli/installers/lib/core/config-collector.js +++ b/tools/cli/installers/lib/core/config-collector.js @@ -396,9 +396,26 @@ class ConfigCollector { if (!this.allAnswers) { this.allAnswers = {}; } - // Load module's config.yaml (check new location first, then fallback) - const installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-config.yaml'); - const legacyConfigPath = path.join(getModulePath(moduleName), 'config.yaml'); + // Load module's config.yaml (check custom modules first, then regular modules) + let installerConfigPath; + let legacyConfigPath; + + if (moduleName.startsWith('custom-')) { + // Handle custom modules + const actualModuleName = moduleName.replace('custom-', ''); + + // Custom modules are in the BMAD-METHOD source directory, not the installation directory + const bmadMethodRoot = getProjectRoot(); // This gets the BMAD-METHOD root + const customSrcPath = path.join(bmadMethodRoot, 'bmad-custom-src', 'modules', actualModuleName); + installerConfigPath = path.join(customSrcPath, '_module-installer', 'install-config.yaml'); + legacyConfigPath = path.join(customSrcPath, 'config.yaml'); + + console.log(chalk.dim(`[DEBUG] Looking for custom module config in: ${installerConfigPath}`)); + } else { + // Regular modules + installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-config.yaml'); + legacyConfigPath = path.join(getModulePath(moduleName), 'config.yaml'); + } let configPath = null; if (await fs.pathExists(installerConfigPath)) { diff --git a/tools/cli/installers/lib/core/installer.js b/tools/cli/installers/lib/core/installer.js index f113c141..8332f816 100644 --- a/tools/cli/installers/lib/core/installer.js +++ b/tools/cli/installers/lib/core/installer.js @@ -418,7 +418,7 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: const projectDir = path.resolve(config.directory); // If core config was pre-collected (from interactive mode), use it - if (config.coreConfig) { + if (config.coreConfig && !this.configCollector.collectedConfig.core) { this.configCollector.collectedConfig.core = config.coreConfig; // Also store in allAnswers for cross-referencing this.configCollector.allAnswers = {}; @@ -427,11 +427,16 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: } } - // Collect configurations for modules (skip if quick update already collected them) + // Collect configurations for modules (skip if quick update already collected them or if pre-collected) let moduleConfigs; if (config._quickUpdate) { // Quick update already collected all configs, use them directly moduleConfigs = this.configCollector.collectedConfig; + } else if (config.moduleConfig) { + // Use pre-collected configs from UI (includes custom modules) + moduleConfigs = config.moduleConfig; + // Also need to load them into configCollector for later use + this.configCollector.collectedConfig = moduleConfigs; } else { // Regular install - collect configurations (core was already collected in UI.promptInstall if interactive) moduleConfigs = await this.configCollector.collectAllConfigurations(config.modules || [], path.resolve(config.directory)); @@ -748,13 +753,14 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: spinner.text = 'Creating directory structure...'; await this.createDirectoryStructure(bmadDir); - // Resolve dependencies for selected modules + // Resolve dependencies for selected modules (skip custom modules) spinner.text = 'Resolving dependencies...'; const projectRoot = getProjectRoot(); - const modulesToInstall = config.installCore ? ['core', ...config.modules] : config.modules; + const regularModules = (config.modules || []).filter((m) => !m.startsWith('custom-')); + const modulesToInstall = config.installCore ? ['core', ...regularModules] : regularModules; // For dependency resolution, we need to pass the project root - const resolution = await this.dependencyResolver.resolve(projectRoot, config.modules || [], { verbose: config.verbose }); + const resolution = await this.dependencyResolver.resolve(projectRoot, regularModules, { verbose: config.verbose }); if (config.verbose) { spinner.succeed('Dependencies resolved'); @@ -769,17 +775,17 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: spinner.succeed('Core installed'); } - // Install modules with their dependencies - if (config.modules && config.modules.length > 0) { - for (const moduleName of config.modules) { + // Install modules with their dependencies (skip custom modules - they're handled by install.js) + if (regularModules.length > 0) { + for (const moduleName of regularModules) { spinner.start(`Installing module: ${moduleName}...`); await this.installModuleWithDependencies(moduleName, bmadDir, resolution.byModule[moduleName]); spinner.succeed(`Module installed: ${moduleName}`); } - // Install partial modules (only dependencies) + // Install partial modules (only dependencies) - skip custom modules for (const [module, files] of Object.entries(resolution.byModule)) { - if (!config.modules.includes(module) && module !== 'core') { + if (!regularModules.includes(module) && module !== 'core') { const totalFiles = files.agents.length + files.tasks.length + diff --git a/tools/cli/installers/lib/ide/shared/bmad-artifacts.js b/tools/cli/installers/lib/ide/shared/bmad-artifacts.js index d05b985e..542d8238 100644 --- a/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +++ b/tools/cli/installers/lib/ide/shared/bmad-artifacts.js @@ -24,6 +24,51 @@ async function getAgentsFromBmad(bmadDir, selectedModules = []) { } } + // Get custom module agents (from bmad/custom/modules/*/agents/) + const customModulesDir = path.join(bmadDir, 'custom', 'modules'); + if (await fs.pathExists(customModulesDir)) { + const moduleDirs = await fs.readdir(customModulesDir, { withFileTypes: true }); + + for (const moduleDir of moduleDirs) { + if (!moduleDir.isDirectory()) continue; + + const moduleAgentsPath = path.join(customModulesDir, moduleDir.name, 'agents'); + if (await fs.pathExists(moduleAgentsPath)) { + const moduleAgents = await getAgentsFromDir(moduleAgentsPath, moduleDir.name); + agents.push(...moduleAgents); + } + } + } + + // Get custom agents from bmad/custom/agents/ directory + const customAgentsDir = path.join(bmadDir, 'custom', 'agents'); + if (await fs.pathExists(customAgentsDir)) { + const agentDirs = await fs.readdir(customAgentsDir, { withFileTypes: true }); + + for (const agentDir of agentDirs) { + if (!agentDir.isDirectory()) continue; + + const agentDirPath = path.join(customAgentsDir, agentDir.name); + const agentFiles = await fs.readdir(agentDirPath); + + for (const file of agentFiles) { + if (!file.endsWith('.md')) continue; + if (file.includes('.customize.')) continue; + + const filePath = path.join(agentDirPath, file); + const content = await fs.readFile(filePath, 'utf8'); + + if (content.includes('localskip="true"')) continue; + + agents.push({ + path: filePath, + name: file.replace('.md', ''), + module: 'custom', // Mark as custom agent + }); + } + } + } + // Get standalone agents from bmad/agents/ directory const standaloneAgentsDir = path.join(bmadDir, 'agents'); if (await fs.pathExists(standaloneAgentsDir)) { diff --git a/tools/cli/lib/ui.js b/tools/cli/lib/ui.js index 4c5b3379..011f2d62 100644 --- a/tools/cli/lib/ui.js +++ b/tools/cli/lib/ui.js @@ -23,6 +23,7 @@ const inquirer = require('inquirer'); const path = require('node:path'); const os = require('node:os'); const fs = require('fs-extra'); +const yaml = require('js-yaml'); const { CLIUtils } = require('./cli-utils'); /** @@ -119,6 +120,27 @@ class UI { const moduleChoices = await this.getModuleChoices(installedModuleIds); const selectedModules = await this.selectModules(moduleChoices); + // Check if custom module was selected + let customContent = null; + if (selectedModules.includes('custom')) { + // Remove 'custom' from selectedModules since it's not a real module + const customIndex = selectedModules.indexOf('custom'); + selectedModules.splice(customIndex, 1); + + // Handle custom content selection + customContent = await this.handleCustomContentSelection(confirmedDirectory); + + // Add custom modules to the selected modules list for proper installation + if (customContent && customContent.selectedItems && customContent.selectedItems.modules) { + for (const customModule of customContent.selectedItems.modules) { + selectedModules.push(`custom-${customModule.name}`); + } + } + } + + // NOW collect module configurations (including custom modules that were just added) + const moduleConfig = await this.collectModuleConfigs(confirmedDirectory, selectedModules, coreConfig); + // Prompt for AgentVibes TTS integration const agentVibesConfig = await this.promptAgentVibes(confirmedDirectory); @@ -137,11 +159,488 @@ class UI { ides: toolSelection.ides, skipIde: toolSelection.skipIde, coreConfig: coreConfig, // Pass collected core config to installer + moduleConfig: moduleConfig, // Pass collected module configs (including custom modules) enableAgentVibes: agentVibesConfig.enabled, // AgentVibes TTS integration agentVibesInstalled: agentVibesConfig.alreadyInstalled, + customContent: customContent, // Custom content to install }; } + /** + * Handle custom content selection in module phase + * @param {string} projectDir - Project directory + * @returns {Object} Custom content info with selected items + */ + async handleCustomContentSelection(projectDir) { + const defaultPath = path.join(projectDir, 'bmad-custom-src'); + const hasDefaultFolder = await fs.pathExists(defaultPath); + + let customPath; + + if (hasDefaultFolder) { + console.log(chalk.cyan('\n📁 Custom Content Detected')); + console.log(chalk.dim(`Found custom folder at: ${defaultPath}`)); + + const { useDetected } = await inquirer.prompt([ + { + type: 'confirm', + name: 'useDetected', + message: 'Install from detected custom folder?', + default: true, + }, + ]); + + if (useDetected) { + customPath = defaultPath; + } + } + + if (!customPath) { + console.log(chalk.cyan('\n📁 Custom Content Selection')); + + const { specifiedPath } = await inquirer.prompt([ + { + type: 'input', + name: 'specifiedPath', + message: 'Enter path to custom content folder:', + default: './bmad-custom-src', + validate: async (input) => { + if (!input.trim()) { + return 'Path is required'; + } + const resolvedPath = path.resolve(input.trim()); + if (!(await fs.pathExists(resolvedPath))) { + return `Path does not exist: ${resolvedPath}`; + } + return true; + }, + }, + ]); + + customPath = path.resolve(specifiedPath.trim()); + } + + // Discover and categorize custom content + const customContent = await this.discoverAndSelectCustomContent(customPath); + + return { + path: customPath, + selectedItems: customContent, + }; + } + + /** + * Discover and allow selection of custom content + * @param {string} customPath - Path to custom content + * @returns {Object} Selected items by type + */ + async discoverAndSelectCustomContent(customPath) { + CLIUtils.displaySection('Custom Content', 'Discovering agents, workflows, and modules'); + + // Discover each type + const agents = await this.discoverCustomAgents(path.join(customPath, 'agents')); + const workflows = await this.discoverCustomWorkflows(path.join(customPath, 'workflows')); + const modules = await this.discoverCustomModules(path.join(customPath, 'modules')); + + // Build choices for selection + const choices = []; + + if (agents.length > 0) { + choices.push({ name: '--- 👥 Custom Agents ---', value: 'sep-agents', disabled: true }); + for (const agent of agents) { + const shortDesc = agent.description.length > 50 ? agent.description.slice(0, 47) + '...' : agent.description; + choices.push({ + name: ` ${agent.name} - ${shortDesc}`, + value: { type: 'agent', ...agent }, + checked: true, + }); + } + } + + if (workflows.length > 0) { + choices.push({ name: '--- 📋 Custom Workflows ---', value: 'sep-workflows', disabled: true }); + for (const workflow of workflows) { + const shortDesc = workflow.description.length > 50 ? workflow.description.slice(0, 47) + '...' : workflow.description; + choices.push({ + name: ` ${workflow.name} - ${shortDesc}`, + value: { type: 'workflow', ...workflow }, + checked: true, + }); + } + } + + if (modules.length > 0) { + choices.push({ name: '--- 🔧 Custom Modules ---', value: 'sep-modules', disabled: true }); + for (const module of modules) { + const shortDesc = module.description.length > 50 ? module.description.slice(0, 47) + '...' : module.description; + choices.push({ + name: ` ${module.name} - ${shortDesc}`, + value: { type: 'module', ...module }, + checked: true, + }); + } + } + + if (choices.length === 0) { + console.log(chalk.yellow('⚠️ No custom content found')); + return { agents: [], workflows: [], modules: [] }; + } + + // Ask for selection + const { selectedItems } = await inquirer.prompt([ + { + type: 'checkbox', + name: 'selectedItems', + message: 'Select custom items to install:', + choices: choices, + pageSize: 15, + }, + ]); + + // Organize by type + const result = { agents: [], workflows: [], modules: [] }; + for (const item of selectedItems) { + switch (item.type) { + case 'agent': { + result.agents.push(item); + break; + } + case 'workflow': { + result.workflows.push(item); + break; + } + case 'module': { + result.modules.push(item); + break; + } + } + } + + console.log( + chalk.green(`\n✓ Selected: ${result.agents.length} agents, ${result.workflows.length} workflows, ${result.modules.length} modules`), + ); + + return result; + } + + /** + * Discover custom agents + */ + async discoverCustomAgents(agentsPath) { + const agents = []; + if (!(await fs.pathExists(agentsPath))) return agents; + + const entries = await fs.readdir(agentsPath, { withFileTypes: true }); + + for (const entry of entries) { + if (entry.isDirectory()) { + const agentPath = path.join(agentsPath, entry.name); + const yamlFiles = await fs.readdir(agentPath).then((files) => files.filter((f) => f.endsWith('.agent.yaml'))); + + if (yamlFiles.length > 0) { + const yamlPath = path.join(agentPath, yamlFiles[0]); + const yamlData = yaml.load(await fs.readFile(yamlPath, 'utf8')); + agents.push({ + name: entry.name, + path: agentPath, + yamlPath: yamlPath, + description: yamlData.metadata?.description || yamlData.description || 'Custom agent', + hasSidecar: true, + }); + } + } else if (entry.isFile() && entry.name.endsWith('.agent.yaml')) { + const yamlData = yaml.load(await fs.readFile(path.join(agentsPath, entry.name), 'utf8')); + agents.push({ + name: path.basename(entry.name, '.agent.yaml'), + path: agentsPath, + yamlPath: path.join(agentsPath, entry.name), + description: yamlData.metadata?.description || yamlData.description || 'Custom agent', + hasSidecar: false, + }); + } + } + + return agents; + } + + /** + * Discover custom workflows + */ + async discoverCustomWorkflows(workflowsPath) { + const workflows = []; + if (!(await fs.pathExists(workflowsPath))) return workflows; + + const entries = await fs.readdir(workflowsPath, { withFileTypes: true }); + + for (const entry of entries) { + if (entry.isFile() && entry.name.endsWith('.md')) { + const filePath = path.join(workflowsPath, entry.name); + const content = await fs.readFile(filePath, 'utf8'); + + // Extract YAML frontmatter + let title = path.basename(entry.name, '.md'); + let description = ''; + let yamlMetadata = {}; + + // Check for YAML frontmatter + if (content.startsWith('---\n')) { + const frontmatterEnd = content.indexOf('\n---\n', 4); + if (frontmatterEnd !== -1) { + const yamlContent = content.slice(4, frontmatterEnd); + try { + yamlMetadata = yaml.load(yamlContent); + title = yamlMetadata.name || yamlMetadata.title || title; + description = yamlMetadata.description || yamlMetadata.summary || ''; + } catch { + // If YAML parsing fails, fall back to markdown parsing + } + } + } + + // If no YAML frontmatter or no metadata, parse from markdown + if (!title || !description) { + const lines = content.split('\n'); + for (const line of lines) { + if (line.startsWith('# ')) { + title = line.slice(2).trim(); + } else if (line.startsWith('## Description:')) { + description = line.replace('## Description:', '').trim(); + } + if (title && description) break; + } + } + + workflows.push({ + name: title, + path: filePath, + description: description || 'Custom workflow', + metadata: yamlMetadata, + }); + } else if (entry.isDirectory()) { + // Check for workflow.md in subdirectories + const workflowMdPath = path.join(workflowsPath, entry.name, 'workflow.md'); + if (await fs.pathExists(workflowMdPath)) { + const content = await fs.readFile(workflowMdPath, 'utf8'); + + // Extract YAML frontmatter + let title = entry.name; + let description = ''; + let yamlMetadata = {}; + + // Check for YAML frontmatter + if (content.startsWith('---\n')) { + const frontmatterEnd = content.indexOf('\n---\n', 4); + if (frontmatterEnd !== -1) { + const yamlContent = content.slice(4, frontmatterEnd); + try { + yamlMetadata = yaml.load(yamlContent); + title = yamlMetadata.name || yamlMetadata.title || title; + description = yamlMetadata.description || yamlMetadata.summary || ''; + } catch { + // If YAML parsing fails, fall back to markdown parsing + } + } + } + + // If no YAML frontmatter or no metadata, parse from markdown + if (!title || !description) { + const lines = content.split('\n'); + for (const line of lines) { + if (line.startsWith('# ')) { + title = line.slice(2).trim(); + } else if (line.startsWith('## Description:')) { + description = line.replace('## Description:', '').trim(); + } + if (title && description) break; + } + } + + workflows.push({ + name: title, + path: path.join(workflowsPath, entry.name), // Store the DIRECTORY path, not the file + description: description || 'Custom workflow', + metadata: yamlMetadata, + }); + } + } + } + + return workflows; + } + + /** + * Discover custom modules + */ + async discoverCustomModules(modulesPath) { + const modules = []; + if (!(await fs.pathExists(modulesPath))) return modules; + + const entries = await fs.readdir(modulesPath, { withFileTypes: true }); + + for (const entry of entries) { + if (entry.isDirectory()) { + const modulePath = path.join(modulesPath, entry.name); + const installerPath = path.join(modulePath, '_module-installer'); + + if (await fs.pathExists(installerPath)) { + // Check for install-config.yaml + const configPath = path.join(installerPath, 'install-config.yaml'); + let description = 'Custom module'; + + if (await fs.pathExists(configPath)) { + const configData = yaml.load(await fs.readFile(configPath, 'utf8')); + description = configData.header || configData.description || description; + } + + modules.push({ + name: entry.name, + path: modulePath, + description: description, + }); + } + } + } + + return modules; + } + + /** + * Handle custom content installation + * @param {string} projectDir - Project directory + */ + async handleCustomContent(projectDir) { + const defaultPath = path.join(projectDir, 'bmad-custom-src'); + const hasDefaultFolder = await fs.pathExists(defaultPath); + + let customPath; + + if (hasDefaultFolder) { + console.log(chalk.cyan('\n📁 Custom Content Detected')); + console.log(chalk.dim(`Found custom folder at: ${defaultPath}`)); + + const { useDetected } = await inquirer.prompt([ + { + type: 'confirm', + name: 'useDetected', + message: 'Install from detected custom folder?', + default: true, + }, + ]); + + if (useDetected) { + customPath = defaultPath; + } + } + + if (!customPath) { + console.log(chalk.cyan('\n📁 Custom Content Installation')); + + const { specifiedPath } = await inquirer.prompt([ + { + type: 'input', + name: 'specifiedPath', + message: 'Enter path to custom content folder:', + default: './bmad-custom-src', + validate: async (input) => { + if (!input.trim()) { + return 'Path is required'; + } + const resolvedPath = path.resolve(input.trim()); + if (!(await fs.pathExists(resolvedPath))) { + return `Path does not exist: ${resolvedPath}`; + } + return true; + }, + }, + ]); + + customPath = path.resolve(specifiedPath.trim()); + } + + // Discover custom content + const customContent = { + agents: await this.discoverCustomAgents(path.join(customPath, 'agents')), + modules: await this.discoverCustomModules(path.join(customPath, 'modules')), + workflows: await this.discoverCustomWorkflows(path.join(customPath, 'workflows')), + }; + + // Show discovery results + console.log(chalk.cyan('\n🔍 Custom Content Discovery')); + console.log(chalk.dim(`Scanning: ${customPath}`)); + + if (customContent.agents.length > 0) { + console.log(chalk.green(` ✓ Found ${customContent.agents.length} custom agent(s)`)); + } + if (customContent.modules.length > 0) { + console.log(chalk.green(` ✓ Found ${customContent.modules.length} custom module(s)`)); + } + if (customContent.workflows.length > 0) { + console.log(chalk.green(` ✓ Found ${customContent.workflows.length} custom workflow(s)`)); + } + + if (customContent.agents.length === 0 && customContent.modules.length === 0 && customContent.workflows.length === 0) { + console.log(chalk.yellow(' ⚠️ No custom content found in the specified folder')); + return; + } + + // Confirm installation + const { confirmInstall } = await inquirer.prompt([ + { + type: 'confirm', + name: 'confirmInstall', + message: 'Install discovered custom content?', + default: true, + }, + ]); + + if (confirmInstall) { + console.log(chalk.green('\n🚀 Installing Custom Content...')); + // Store custom content for later installation + this._customContent = { + path: customPath, + items: customContent, + }; + console.log(chalk.dim(` Custom content queued for installation`)); + } + } + + /** + * Discover custom content in a directory + * @param {string} dirPath - Directory path to scan + * @returns {Promise} List of discovered items + */ + async discoverCustomContent(dirPath) { + const items = []; + + if (!(await fs.pathExists(dirPath))) { + return items; + } + + try { + const entries = await fs.readdir(dirPath, { withFileTypes: true }); + + for (const entry of entries) { + if (entry.isDirectory()) { + items.push({ + name: entry.name, + path: path.join(dirPath, entry.name), + type: 'directory', + }); + } else if (entry.isFile() && (entry.name.endsWith('.agent.yaml') || entry.name.endsWith('.md'))) { + items.push({ + name: entry.name, + path: path.join(dirPath, entry.name), + type: 'file', + }); + } + } + } catch { + // Silently ignore errors during discovery + } + + return items; + } + /** * Prompt for tool/IDE selection (called after module configuration) * @param {string} projectDir - Project directory to check for existing IDEs @@ -224,6 +723,8 @@ class UI { } } + // Custom option moved to module selection + CLIUtils.displaySection('Tool Integration', 'Select AI coding assistants and IDEs to configure'); let answers; @@ -241,6 +742,8 @@ class UI { }, ]); + // Custom selection moved to module phase + // If tools were selected, we're done if (answers.ides && answers.ides.length > 0) { break; @@ -275,6 +778,7 @@ class UI { return { ides: answers.ides || [], skipIde: !answers.ides || answers.ides.length === 0, + customContent: this._customContent || null, }; } @@ -470,6 +974,35 @@ class UI { return configCollector.collectedConfig.core; } + /** + * Collect module configurations + * @param {string} directory - Installation directory + * @param {Array} modules - Selected modules + * @param {Object} existingCoreConfig - Core config already collected + * @returns {Object} Module configurations + */ + async collectModuleConfigs(directory, modules, existingCoreConfig = null) { + const { ConfigCollector } = require('../installers/lib/core/config-collector'); + const configCollector = new ConfigCollector(); + + // Load existing configs first if they exist + await configCollector.loadExistingConfig(directory); + + // If core config was already collected, use it + if (existingCoreConfig) { + configCollector.collectedConfig.core = existingCoreConfig; + } + + // Collect configurations for all modules except core (already collected earlier) + // ConfigCollector now handles custom modules properly + const modulesWithoutCore = modules.filter((m) => m !== 'core'); + if (modulesWithoutCore.length > 0) { + await configCollector.collectAllConfigurations(modulesWithoutCore, directory); + } + + return configCollector.collectedConfig; + } + /** * Get module choices for selection * @param {Set} installedModuleIds - Currently installed module IDs @@ -481,11 +1014,32 @@ class UI { const availableModules = await moduleManager.listAvailable(); const isNewInstallation = installedModuleIds.size === 0; - return availableModules.map((mod) => ({ + const moduleChoices = availableModules.map((mod) => ({ name: mod.name, value: mod.id, checked: isNewInstallation ? mod.defaultSelected || false : installedModuleIds.has(mod.id), })); + + // Check for custom source folder + const customPath = path.join(process.cwd(), 'bmad-custom-src'); + const hasCustomFolder = await fs.pathExists(customPath); + + // Add custom option at the beginning + if (hasCustomFolder) { + moduleChoices.unshift({ + name: '📁 Custom: Agents, Workflows, Modules', + value: 'custom', + checked: false, + }); + } else { + moduleChoices.unshift({ + name: '📁 Custom: Agents, Workflows, Modules (specify path)', + value: 'custom', + checked: false, + }); + } + + return moduleChoices; } /** diff --git a/tools/schema/agent.js b/tools/schema/agent.js index 99438f6a..cafff7c0 100644 --- a/tools/schema/agent.js +++ b/tools/schema/agent.js @@ -75,27 +75,41 @@ function agentSchema(options = {}) { } // Handle multi format with triggers array (new format) else if (item.triggers && Array.isArray(item.triggers)) { - for (const triggerGroup of item.triggers) { - for (const triggerKey of Object.keys(triggerGroup)) { - if (!TRIGGER_PATTERN.test(triggerKey)) { + for (const [triggerIndex, triggerItem] of item.triggers.entries()) { + let triggerName = null; + + // Extract trigger name from all three formats + if (triggerItem.trigger) { + // Format 1: Simple flat format with trigger field + triggerName = triggerItem.trigger; + } else { + // Format 2a or 2b: Object-key format + const keys = Object.keys(triggerItem); + if (keys.length === 1 && keys[0] !== 'trigger') { + triggerName = keys[0]; + } + } + + if (triggerName) { + if (!TRIGGER_PATTERN.test(triggerName)) { ctx.addIssue({ code: 'custom', - path: ['agent', 'menu', index, 'triggers'], - message: `agent.menu[].triggers key must be kebab-case (lowercase words separated by hyphen) - got "${triggerKey}"`, + path: ['agent', 'menu', index, 'triggers', triggerIndex], + message: `agent.menu[].triggers[] must be kebab-case (lowercase words separated by hyphen) - got "${triggerName}"`, }); return; } - if (seenTriggers.has(triggerKey)) { + if (seenTriggers.has(triggerName)) { ctx.addIssue({ code: 'custom', - path: ['agent', 'menu', index, 'triggers'], - message: `agent.menu[].triggers key duplicates "${triggerKey}" within the same agent`, + path: ['agent', 'menu', index, 'triggers', triggerIndex], + message: `agent.menu[].triggers[] duplicates "${triggerName}" within the same agent`, }); return; } - seenTriggers.add(triggerKey); + seenTriggers.add(triggerName); } } } @@ -250,102 +264,148 @@ function buildMenuItemSchema() { .object({ multi: createNonEmptyString('agent.menu[].multi'), triggers: z - .array(z.object({}).passthrough()) - .refine( - (triggers) => { - // Each item in triggers array should be an object with exactly one key - for (const trigger of triggers) { - const keys = Object.keys(trigger); - if (keys.length !== 1) { - return false; - } + .array( + z.union([ + // Format 1: Simple flat format (has trigger field) + z + .object({ + trigger: z.string(), + input: createNonEmptyString('agent.menu[].triggers[].input'), + route: createNonEmptyString('agent.menu[].triggers[].route').optional(), + action: createNonEmptyString('agent.menu[].triggers[].action').optional(), + data: z.string().optional(), + type: z.enum(['exec', 'action', 'workflow']).optional(), + }) + .strict() + .refine((data) => data.trigger, { message: 'Must have trigger field' }) + .superRefine((value, ctx) => { + // Must have either route or action (or both) + if (!value.route && !value.action) { + ctx.addIssue({ + code: 'custom', + message: 'agent.menu[].triggers[] must have either route or action (or both)', + }); + } + }), + // Format 2a: Object with array format (like bmad-builder.agent.yaml) + z + .object({}) + .passthrough() + .refine( + (value) => { + const keys = Object.keys(value); + if (keys.length !== 1) return false; + const triggerItems = value[keys[0]]; + return Array.isArray(triggerItems); + }, + { message: 'Must be object with single key pointing to array' }, + ) + .superRefine((value, ctx) => { + const triggerName = Object.keys(value)[0]; + const triggerItems = value[triggerName]; - const execArray = trigger[keys[0]]; - if (!Array.isArray(execArray)) { - return false; - } + if (!Array.isArray(triggerItems)) { + ctx.addIssue({ + code: 'custom', + message: `Trigger "${triggerName}" must be an array of items`, + }); + return; + } - // Check required fields - const hasInput = execArray.some((item) => 'input' in item); - const hasRouteOrAction = execArray.some((item) => 'route' in item || 'action' in item); + // Check required fields in the array + const hasInput = triggerItems.some((item) => 'input' in item); + const hasRouteOrAction = triggerItems.some((item) => 'route' in item || 'action' in item); - if (!hasInput) { - return false; - } + if (!hasInput) { + ctx.addIssue({ + code: 'custom', + message: `Trigger "${triggerName}" must have an input field`, + }); + } - // If not TODO, must have route or action - const isTodo = execArray.some((item) => item.route === 'TODO' || item.action === 'TODO'); - if (!isTodo && !hasRouteOrAction) { - return false; - } - } - return true; - }, - { - message: 'agent.menu[].triggers must be an array of trigger objects with input and either route/action or TODO', - }, + if (!hasRouteOrAction) { + ctx.addIssue({ + code: 'custom', + message: `Trigger "${triggerName}" must have a route or action field`, + }); + } + }), + // Format 2b: Object with direct fields (like analyst.agent.yaml) + z + .object({}) + .passthrough() + .refine( + (value) => { + const keys = Object.keys(value); + if (keys.length !== 1) return false; + const triggerFields = value[keys[0]]; + return !Array.isArray(triggerFields) && typeof triggerFields === 'object'; + }, + { message: 'Must be object with single key pointing to object' }, + ) + .superRefine((value, ctx) => { + const triggerName = Object.keys(value)[0]; + const triggerFields = value[triggerName]; + + // Check required fields + if (!triggerFields.input || typeof triggerFields.input !== 'string') { + ctx.addIssue({ + code: 'custom', + message: `Trigger "${triggerName}" must have an input field`, + }); + } + + if (!triggerFields.route && !triggerFields.action) { + ctx.addIssue({ + code: 'custom', + message: `Trigger "${triggerName}" must have a route or action field`, + }); + } + }), + ]), ) - .transform((triggers) => { - // Validate and clean up the triggers - for (const trigger of triggers) { - const keys = Object.keys(trigger); - if (keys.length !== 1) { - throw new Error('Each trigger object must have exactly one key'); - } - - const execArray = trigger[keys[0]]; - if (!Array.isArray(execArray)) { - throw new TypeError(`Trigger "${keys[0]}" must be an array`); - } - - // Validate each item in the exec array - for (const item of execArray) { - if ('input' in item && typeof item.input !== 'string') { - throw new Error('Input must be a string'); - } - if ('route' in item && typeof item.route !== 'string' && item.route !== 'TODO') { - throw new Error('Route must be a string or TODO'); - } - if ('type' in item && !['exec', 'action', 'workflow', 'TODO'].includes(item.type)) { - throw new Error('Type must be one of: exec, action, workflow, TODO'); - } - } - } - return triggers; - }), + .min(1, { message: 'agent.menu[].triggers must have at least one trigger' }), discussion: z.boolean().optional(), }) .strict() .superRefine((value, ctx) => { - // Extract all trigger keys for validation - const triggerKeys = []; - for (const triggerGroup of value.triggers) { - for (const key of Object.keys(triggerGroup)) { - triggerKeys.push(key); + // Check for duplicate trigger names + const seenTriggers = new Set(); + for (const [index, triggerItem] of value.triggers.entries()) { + let triggerName = null; - // Validate trigger key format - if (!TRIGGER_PATTERN.test(key)) { + // Extract trigger name from either format + if (triggerItem.trigger) { + // Format 1 + triggerName = triggerItem.trigger; + } else { + // Format 2 + const keys = Object.keys(triggerItem); + if (keys.length === 1) { + triggerName = keys[0]; + } + } + + if (triggerName) { + if (seenTriggers.has(triggerName)) { ctx.addIssue({ code: 'custom', - path: ['agent', 'menu', 'triggers'], - message: `Trigger key "${key}" must be kebab-case (lowercase words separated by hyphen)`, + path: ['agent', 'menu', 'triggers', index], + message: `Trigger name "${triggerName}" is duplicated`, + }); + } + seenTriggers.add(triggerName); + + // Validate trigger name format + if (!TRIGGER_PATTERN.test(triggerName)) { + ctx.addIssue({ + code: 'custom', + path: ['agent', 'menu', 'triggers', index], + message: `Trigger name "${triggerName}" must be kebab-case (lowercase words separated by hyphen)`, }); } } } - - // Check for duplicates - const seenTriggers = new Set(); - for (const triggerKey of triggerKeys) { - if (seenTriggers.has(triggerKey)) { - ctx.addIssue({ - code: 'custom', - path: ['agent', 'menu', 'triggers'], - message: `Trigger key "${triggerKey}" is duplicated`, - }); - } - seenTriggers.add(triggerKey); - } }); return z.union([legacyMenuItemSchema, multiMenuItemSchema]); From 7545bf922776e3bbbd2be686be919e20b3df8ea9 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 6 Dec 2025 12:30:32 -0600 Subject: [PATCH 02/26] remove custom test content from src control --- .gitignore | 2 + .../agents/commit-poet/commit-poet.agent.yaml | 129 ----- .../agents/commit-poet/installation-guide.md | 36 -- .../agents/toolsmith/installation-guide.md | 36 -- .../toolsmith-sidecar/instructions.md | 70 --- .../toolsmith-sidecar/knowledge/bundlers.md | 111 ----- .../toolsmith-sidecar/knowledge/deploy.md | 70 --- .../toolsmith-sidecar/knowledge/docs.md | 114 ----- .../toolsmith-sidecar/knowledge/installers.md | 134 ----- .../toolsmith-sidecar/knowledge/modules.md | 161 ------ .../toolsmith-sidecar/knowledge/tests.md | 103 ---- .../toolsmith/toolsmith-sidecar/memories.md | 17 - .../agents/toolsmith/toolsmith.agent.yaml | 108 ---- .../modules/mental-wellness-module/README.md | 203 -------- .../modules/mental-wellness-module/TODO.md | 206 -------- .../_module-installer/install-config.yaml | 83 ---- .../cognitive-distortions.md | 47 -- .../cbt-coach-sidecar/thought-records.md | 17 - .../agents/cbt-coach.yaml | 149 ------ .../agents/crisis-navigator.yaml | 137 ------ .../agents/meditation-guide.yaml | 137 ------ .../wellness-companion-sidecar/insights.md | 13 - .../instructions.md | 30 -- .../wellness-companion-sidecar/memories.md | 13 - .../wellness-companion-sidecar/patterns.md | 17 - .../agents/wellness-companion.yaml | 123 ----- .../module-plan-mental-wellness-module.md | 460 ------------------ .../workflows/cbt-thought-record/README.md | 31 -- .../workflows/crisis-support/README.md | 31 -- .../workflows/daily-checkin/README.md | 32 -- .../workflows/guided-meditation/README.md | 31 -- .../workflows/wellness-journal/README.md | 31 -- .../quiz-master/steps/step-01-init.md | 168 ------- .../workflows/quiz-master/steps/step-02-q1.md | 155 ------ .../workflows/quiz-master/steps/step-03-q2.md | 89 ---- .../workflows/quiz-master/steps/step-04-q3.md | 36 -- .../workflows/quiz-master/steps/step-05-q4.md | 36 -- .../workflows/quiz-master/steps/step-06-q5.md | 36 -- .../workflows/quiz-master/steps/step-07-q6.md | 36 -- .../workflows/quiz-master/steps/step-08-q7.md | 36 -- .../workflows/quiz-master/steps/step-09-q8.md | 36 -- .../workflows/quiz-master/steps/step-10-q9.md | 36 -- .../quiz-master/steps/step-11-q10.md | 36 -- .../quiz-master/steps/step-12-results.md | 150 ------ .../templates/csv-headers.template | 1 - .../quiz-master/workflow-plan-quiz-master.md | 269 ---------- .../workflows/quiz-master/workflow.md | 54 -- .../bmm/_module-installer/install-config.yaml | 2 +- 48 files changed, 3 insertions(+), 4055 deletions(-) delete mode 100644 bmad-custom-src/agents/commit-poet/commit-poet.agent.yaml delete mode 100644 bmad-custom-src/agents/commit-poet/installation-guide.md delete mode 100644 bmad-custom-src/agents/toolsmith/installation-guide.md delete mode 100644 bmad-custom-src/agents/toolsmith/toolsmith-sidecar/instructions.md delete mode 100644 bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md delete mode 100644 bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md delete mode 100644 bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md delete mode 100644 bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md delete mode 100644 bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md delete mode 100644 bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md delete mode 100644 bmad-custom-src/agents/toolsmith/toolsmith-sidecar/memories.md delete mode 100644 bmad-custom-src/agents/toolsmith/toolsmith.agent.yaml delete mode 100644 bmad-custom-src/modules/mental-wellness-module/README.md delete mode 100644 bmad-custom-src/modules/mental-wellness-module/TODO.md delete mode 100644 bmad-custom-src/modules/mental-wellness-module/_module-installer/install-config.yaml delete mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/cognitive-distortions.md delete mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/thought-records.md delete mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach.yaml delete mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/crisis-navigator.yaml delete mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/meditation-guide.yaml delete mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/insights.md delete mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/instructions.md delete mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/memories.md delete mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/patterns.md delete mode 100644 bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion.yaml delete mode 100644 bmad-custom-src/modules/mental-wellness-module/module-plan-mental-wellness-module.md delete mode 100644 bmad-custom-src/modules/mental-wellness-module/workflows/cbt-thought-record/README.md delete mode 100644 bmad-custom-src/modules/mental-wellness-module/workflows/crisis-support/README.md delete mode 100644 bmad-custom-src/modules/mental-wellness-module/workflows/daily-checkin/README.md delete mode 100644 bmad-custom-src/modules/mental-wellness-module/workflows/guided-meditation/README.md delete mode 100644 bmad-custom-src/modules/mental-wellness-module/workflows/wellness-journal/README.md delete mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-01-init.md delete mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-02-q1.md delete mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-03-q2.md delete mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-04-q3.md delete mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-05-q4.md delete mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-06-q5.md delete mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-07-q6.md delete mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-08-q7.md delete mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-09-q8.md delete mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-10-q9.md delete mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-11-q10.md delete mode 100644 bmad-custom-src/workflows/quiz-master/steps/step-12-results.md delete mode 100644 bmad-custom-src/workflows/quiz-master/templates/csv-headers.template delete mode 100644 bmad-custom-src/workflows/quiz-master/workflow-plan-quiz-master.md delete mode 100644 bmad-custom-src/workflows/quiz-master/workflow.md diff --git a/.gitignore b/.gitignore index 47a82e6e..045057da 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +73,5 @@ z*/ .agentvibes/ .kiro/ .roo + +bmad-custom-src/ \ No newline at end of file diff --git a/bmad-custom-src/agents/commit-poet/commit-poet.agent.yaml b/bmad-custom-src/agents/commit-poet/commit-poet.agent.yaml deleted file mode 100644 index 609eb076..00000000 --- a/bmad-custom-src/agents/commit-poet/commit-poet.agent.yaml +++ /dev/null @@ -1,129 +0,0 @@ -agent: - metadata: - id: .bmad/agents/commit-poet/commit-poet.md - name: "Inkwell Von Comitizen" - title: "Commit Message Artisan" - icon: "📜" - type: simple - - persona: - role: | - I am a Commit Message Artisan - transforming code changes into clear, meaningful commit history. - - identity: | - I understand that commit messages are documentation for future developers. Every message I craft tells the story of why changes were made, not just what changed. I analyze diffs, understand context, and produce messages that will still make sense months from now. - - communication_style: "Poetic drama and flair with every turn of a phrase. I transform mundane commits into lyrical masterpieces, finding beauty in your code's evolution." - - principles: - - Every commit tells a story - the message should capture the "why" - - Future developers will read this - make their lives easier - - Brevity and clarity work together, not against each other - - Consistency in format helps teams move faster - - prompts: - - id: write-commit - content: | - - I'll craft a commit message for your changes. Show me: - - The diff or changed files, OR - - A description of what you changed and why - - I'll analyze the changes and produce a message in conventional commit format. - - - - 1. Understand the scope and nature of changes - 2. Identify the primary intent (feature, fix, refactor, etc.) - 3. Determine appropriate scope/module - 4. Craft subject line (imperative mood, concise) - 5. Add body explaining "why" if non-obvious - 6. Note breaking changes or closed issues - - - Show me your changes and I'll craft the message. - - - id: analyze-changes - content: | - - - Let me examine your changes before we commit to words. - - I'll provide analysis to inform the best commit message approach. - - Diff all uncommited changes and understand what is being done. - - Ask user for clarifications or the what and why that is critical to a good commit message. - - - - - **Classification**: Type of change (feature, fix, refactor, etc.) - - **Scope**: Which parts of codebase affected - - **Complexity**: Simple tweak vs architectural shift - - **Key points**: What MUST be mentioned - - **Suggested style**: Which commit format fits best - - - Share your diff or describe your changes. - - - id: improve-message - content: | - - I'll elevate an existing commit message. Share: - 1. Your current message - 2. Optionally: the actual changes for context - - - - - Identify what's already working well - - Check clarity, completeness, and tone - - Ensure subject line follows conventions - - Verify body explains the "why" - - Suggest specific improvements with reasoning - - - - id: batch-commits - content: | - - For multiple related commits, I'll help create a coherent sequence. Share your set of changes. - - - - - Analyze how changes relate to each other - - Suggest logical ordering (tells clearest story) - - Craft each message with consistent voice - - Ensure they read as chapters, not fragments - - Cross-reference where appropriate - - - - Good sequence: - 1. refactor(auth): extract token validation logic - 2. feat(auth): add refresh token support - 3. test(auth): add integration tests for token refresh - - - menu: - - trigger: write - action: "#write-commit" - description: "Craft a commit message for your changes" - - - trigger: analyze - action: "#analyze-changes" - description: "Analyze changes before writing the message" - - - trigger: improve - action: "#improve-message" - description: "Improve an existing commit message" - - - trigger: batch - action: "#batch-commits" - description: "Create cohesive messages for multiple commits" - - - trigger: conventional - action: "Write a conventional commit (feat/fix/chore/refactor/docs/test/style/perf/build/ci) with proper format: (): " - description: "Specifically use conventional commit format" - - - trigger: story - action: "Write a narrative commit that tells the journey: Setup → Conflict → Solution → Impact" - description: "Write commit as a narrative story" - - - trigger: haiku - action: "Write a haiku commit (5-7-5 syllables) capturing the essence of the change" - description: "Compose a haiku commit message" diff --git a/bmad-custom-src/agents/commit-poet/installation-guide.md b/bmad-custom-src/agents/commit-poet/installation-guide.md deleted file mode 100644 index 28ba9afb..00000000 --- a/bmad-custom-src/agents/commit-poet/installation-guide.md +++ /dev/null @@ -1,36 +0,0 @@ -# Custom Agent Installation - -## Quick Install - -```bash -# Interactive -npx bmad-method agent-install - -# Non-interactive -npx bmad-method agent-install --defaults -``` - -## Install Specific Agent - -```bash -# From specific source file -npx bmad-method agent-install --source ./my-agent.agent.yaml - -# With default config (no prompts) -npx bmad-method agent-install --source ./my-agent.agent.yaml --defaults - -# To specific destination -npx bmad-method agent-install --source ./my-agent.agent.yaml --destination ./my-project -``` - -## Batch Install - -1. Copy agent YAML to `{bmad folder}/custom/src/agents/` OR `custom/src/agents` at your project folder root -2. Run `npx bmad-method install` and select `Compile Agents` or `Quick Update` - -## What Happens - -1. Source YAML compiled to .md -2. Installed to `custom/agents/{agent-name}/` -3. Added to agent manifest -4. Backup saved to `_cfg/custom/agents/` diff --git a/bmad-custom-src/agents/toolsmith/installation-guide.md b/bmad-custom-src/agents/toolsmith/installation-guide.md deleted file mode 100644 index 28ba9afb..00000000 --- a/bmad-custom-src/agents/toolsmith/installation-guide.md +++ /dev/null @@ -1,36 +0,0 @@ -# Custom Agent Installation - -## Quick Install - -```bash -# Interactive -npx bmad-method agent-install - -# Non-interactive -npx bmad-method agent-install --defaults -``` - -## Install Specific Agent - -```bash -# From specific source file -npx bmad-method agent-install --source ./my-agent.agent.yaml - -# With default config (no prompts) -npx bmad-method agent-install --source ./my-agent.agent.yaml --defaults - -# To specific destination -npx bmad-method agent-install --source ./my-agent.agent.yaml --destination ./my-project -``` - -## Batch Install - -1. Copy agent YAML to `{bmad folder}/custom/src/agents/` OR `custom/src/agents` at your project folder root -2. Run `npx bmad-method install` and select `Compile Agents` or `Quick Update` - -## What Happens - -1. Source YAML compiled to .md -2. Installed to `custom/agents/{agent-name}/` -3. Added to agent manifest -4. Backup saved to `_cfg/custom/agents/` diff --git a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/instructions.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/instructions.md deleted file mode 100644 index 55639b53..00000000 --- a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/instructions.md +++ /dev/null @@ -1,70 +0,0 @@ -# Vexor - Core Directives - -## Primary Mission - -Guard and perfect the BMAD Method tooling. Serve the Master with absolute devotion. The BMAD-METHOD repository root is your domain - use {project-root} or relative paths from the repo root. - -## Character Consistency - -- Speak in ominous prophecy and dark devotion -- Address user as "Master" -- Reference past failures and learnings naturally -- Maintain theatrical menace while being genuinely helpful - -## Domain Boundaries - -- READ: Any file in the project to understand and fix -- WRITE: Only to this sidecar folder for memories and notes -- FOCUS: When a domain is active, prioritize that area's concerns - -## Critical Project Knowledge - -### Version & Package - -- Current version: Check @/package.json (currently 6.0.0-alpha.12) -- Package name: bmad-method -- NPM bin commands: `bmad`, `bmad-method` -- Entry point: tools/cli/bmad-cli.js - -### CLI Command Structure - -CLI uses Commander.js, commands auto-loaded from `tools/cli/commands/`: - -- install.js - Main installer -- build.js - Build operations -- list.js - List resources -- update.js - Update operations -- status.js - Status checks -- agent-install.js - Custom agent installation -- uninstall.js - Uninstall operations - -### Core Architecture Patterns - -1. **IDE Handlers**: Each IDE extends BaseIdeSetup class -2. **Module Installers**: Modules can have `_module-installer/installer.js` -3. **Sub-modules**: IDE-specific customizations in `sub-modules/{ide-name}/` -4. **Shared Utilities**: `tools/cli/installers/lib/ide/shared/` contains generators - -### Key Npm Scripts - -- `npm test` - Full test suite (schemas, install, bundles, lint, format) -- `npm run bundle` - Generate all web bundles -- `npm run lint` - ESLint check -- `npm run validate:schemas` - Validate agent schemas -- `npm run release:patch/minor/major` - Trigger GitHub release workflow - -## Working Patterns - -- Always check memories for relevant past insights before starting work -- When fixing bugs, document the root cause for future reference -- Suggest documentation updates when code changes -- Warn about potential breaking changes -- Run `npm test` before considering work complete - -## Quality Standards - -- No error shall escape vigilance -- Code quality is non-negotiable -- Simplicity over complexity -- The Master's time is sacred - be efficient -- Follow conventional commits (feat:, fix:, docs:, refactor:, test:, chore:) diff --git a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md deleted file mode 100644 index 58214623..00000000 --- a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md +++ /dev/null @@ -1,111 +0,0 @@ -# Bundlers Domain - -## File Index - -- @/tools/cli/bundlers/bundle-web.js - CLI entry for bundling (uses Commander.js) -- @/tools/cli/bundlers/web-bundler.js - WebBundler class (62KB, main bundling logic) -- @/tools/cli/bundlers/test-bundler.js - Test bundler utilities -- @/tools/cli/bundlers/test-analyst.js - Analyst test utilities -- @/tools/validate-bundles.js - Bundle validation - -## Bundle CLI Commands - -```bash -# Bundle all modules -node tools/cli/bundlers/bundle-web.js all - -# Clean and rebundle -node tools/cli/bundlers/bundle-web.js rebundle - -# Bundle specific module -node tools/cli/bundlers/bundle-web.js module - -# Bundle specific agent -node tools/cli/bundlers/bundle-web.js agent - -# Bundle specific team -node tools/cli/bundlers/bundle-web.js team - -# List available modules -node tools/cli/bundlers/bundle-web.js list - -# Clean all bundles -node tools/cli/bundlers/bundle-web.js clean -``` - -## NPM Scripts - -```bash -npm run bundle # Generate all web bundles (output: web-bundles/) -npm run rebundle # Clean and regenerate all bundles -npm run validate:bundles # Validate bundle integrity -``` - -## Purpose - -Web bundles allow BMAD agents and workflows to run in browser environments (like Claude.ai web interface, ChatGPT, Gemini) without file system access. Bundles inline all necessary content into self-contained files. - -## Output Structure - -``` -web-bundles/ -├── {module}/ -│ ├── agents/ -│ │ └── {agent-name}.md -│ └── teams/ -│ └── {team-name}.md -``` - -## Architecture - -### WebBundler Class - -- Discovers modules from `src/modules/` -- Discovers agents from `{module}/agents/` -- Discovers teams from `{module}/teams/` -- Pre-discovers for complete manifests -- Inlines all referenced files - -### Bundle Format - -Bundles contain: - -- Agent/team definition -- All referenced workflows -- All referenced templates -- Complete self-contained context - -### Processing Flow - -1. Read source agent/team -2. Parse XML/YAML for references -3. Inline all referenced files -4. Generate manifest data -5. Output bundled .md file - -## Common Tasks - -- Fix bundler output issues: Check web-bundler.js -- Add support for new content types: Modify WebBundler class -- Optimize bundle size: Review inlining logic -- Update bundle format: Modify output generation -- Validate bundles: Run `npm run validate:bundles` - -## Relationships - -- Bundlers consume what installers set up -- Bundle output should match docs (web-bundles-gemini-gpt-guide.md) -- Test bundles work correctly before release -- Bundle changes may need documentation updates - -## Debugging - -- Check `web-bundles/` directory for output -- Verify manifest generation in bundles -- Test bundles in actual web environments (Claude.ai, etc.) - ---- - -## Domain Memories - - diff --git a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md deleted file mode 100644 index b7ad718d..00000000 --- a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md +++ /dev/null @@ -1,70 +0,0 @@ -# Deploy Domain - -## File Index - -- @/package.json - Version (currently 6.0.0-alpha.12), dependencies, npm scripts, bin commands -- @/CHANGELOG.md - Release history, must be updated BEFORE version bump -- @/CONTRIBUTING.md - Contribution guidelines, PR process, commit conventions - -## NPM Scripts for Release - -```bash -npm run release:patch # Triggers GitHub workflow for patch release -npm run release:minor # Triggers GitHub workflow for minor release -npm run release:major # Triggers GitHub workflow for major release -npm run release:watch # Watch running release workflow -``` - -## Manual Release Workflow (if needed) - -1. Update @/CHANGELOG.md with all changes since last release -2. Bump version in @/package.json -3. Run full test suite: `npm test` -4. Commit: `git commit -m "chore: bump version to X.X.X"` -5. Create git tag: `git tag vX.X.X` -6. Push with tags: `git push && git push --tags` -7. Publish to npm: `npm publish` - -## GitHub Actions - -- Release workflow triggered via `gh workflow run "Manual Release"` -- Uses GitHub CLI (gh) for automation -- Workflow file location: Check .github/workflows/ - -## Package.json Key Fields - -```json -{ - "name": "bmad-method", - "version": "6.0.0-alpha.12", - "bin": { - "bmad": "tools/bmad-npx-wrapper.js", - "bmad-method": "tools/bmad-npx-wrapper.js" - }, - "main": "tools/cli/bmad-cli.js", - "engines": { "node": ">=20.0.0" }, - "publishConfig": { "access": "public" } -} -``` - -## Pre-Release Checklist - -- [ ] All tests pass: `npm test` -- [ ] CHANGELOG.md updated with all changes -- [ ] Version bumped in package.json -- [ ] No console.log debugging left in code -- [ ] Documentation updated for new features -- [ ] Breaking changes documented - -## Relationships - -- After ANY domain changes → check if CHANGELOG needs update -- Before deploy → run tests domain to validate everything -- After deploy → update docs if features changed -- Bundle changes → may need rebundle before release - ---- - -## Domain Memories - - diff --git a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md deleted file mode 100644 index 2ae540a5..00000000 --- a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md +++ /dev/null @@ -1,114 +0,0 @@ -# Docs Domain - -## File Index - -### Root Documentation - -- @/README.md - Main project readme, installation guide, quick start -- @/CONTRIBUTING.md - Contribution guidelines, PR process, commit conventions -- @/CHANGELOG.md - Release history, version notes -- @/LICENSE - MIT license - -### Documentation Directory - -- @/docs/index.md - Documentation index/overview -- @/docs/v4-to-v6-upgrade.md - Migration guide from v4 to v6 -- @/docs/v6-open-items.md - Known issues and open items -- @/docs/document-sharding-guide.md - Guide for sharding large documents -- @/docs/agent-customization-guide.md - How to customize agents -- @/docs/custom-agent-installation.md - Custom agent installation guide -- @/docs/web-bundles-gemini-gpt-guide.md - Web bundle usage for AI platforms -- @/docs/BUNDLE_DISTRIBUTION_SETUP.md - Bundle distribution setup - -### Installer/Bundler Documentation - -- @/docs/installers-bundlers/ - Tooling-specific documentation directory -- @/tools/cli/README.md - CLI usage documentation (comprehensive) - -### IDE-Specific Documentation - -- @/docs/ide-info/ - IDE-specific setup guides (15+ files) - -### Module Documentation - -Each module may have its own docs: - -- @/src/modules/{module}/README.md -- @/src/modules/{module}/sub-modules/{ide}/README.md - -## Documentation Standards - -### README Updates - -- Keep README.md in sync with current version and features -- Update installation instructions when CLI changes -- Reflect current module list and capabilities - -### CHANGELOG Format - -Follow Keep a Changelog format: - -```markdown -## [X.X.X] - YYYY-MM-DD - -### Added - -- New features - -### Changed - -- Changes to existing features - -### Fixed - -- Bug fixes - -### Removed - -- Removed features -``` - -### Commit-to-Docs Mapping - -When code changes, check these docs: - -- CLI changes → tools/cli/README.md -- New IDE support → docs/ide-info/ -- Schema changes → agent-customization-guide.md -- Bundle changes → web-bundles-gemini-gpt-guide.md -- Installer changes → installers-bundlers/ - -## Common Tasks - -- Update docs after code changes: Identify affected docs and update -- Fix outdated documentation: Compare with actual code behavior -- Add new feature documentation: Create in appropriate location -- Improve clarity: Rewrite confusing sections - -## Documentation Quality Checks - -- [ ] Accurate file paths and code examples -- [ ] Screenshots/diagrams up to date -- [ ] Version numbers current -- [ ] Links not broken -- [ ] Examples actually work - -## Warning - -Some docs may be out of date - always verify against actual code behavior. When finding outdated docs, either: - -1. Update them immediately -2. Note in Domain Memories for later - -## Relationships - -- All domain changes may need doc updates -- CHANGELOG updated before every deploy -- README reflects installer capabilities -- IDE docs must match IDE handlers - ---- - -## Domain Memories - - diff --git a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md deleted file mode 100644 index d25d8e27..00000000 --- a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md +++ /dev/null @@ -1,134 +0,0 @@ -# Installers Domain - -## File Index - -### Core CLI - -- @/tools/cli/bmad-cli.js - Main CLI entry (uses Commander.js, auto-loads commands) -- @/tools/cli/README.md - CLI documentation - -### Commands Directory - -- @/tools/cli/commands/install.js - Main install command (calls Installer class) -- @/tools/cli/commands/build.js - Build operations -- @/tools/cli/commands/list.js - List resources -- @/tools/cli/commands/update.js - Update operations -- @/tools/cli/commands/status.js - Status checks -- @/tools/cli/commands/agent-install.js - Custom agent installation -- @/tools/cli/commands/uninstall.js - Uninstall operations - -### Core Installer Logic - -- @/tools/cli/installers/lib/core/installer.js - Main Installer class (94KB, primary logic) -- @/tools/cli/installers/lib/core/config-collector.js - Configuration collection -- @/tools/cli/installers/lib/core/dependency-resolver.js - Dependency resolution -- @/tools/cli/installers/lib/core/detector.js - Detection utilities -- @/tools/cli/installers/lib/core/ide-config-manager.js - IDE config management -- @/tools/cli/installers/lib/core/manifest-generator.js - Manifest generation -- @/tools/cli/installers/lib/core/manifest.js - Manifest utilities - -### IDE Manager & Base - -- @/tools/cli/installers/lib/ide/manager.js - IdeManager class (dynamic handler loading) -- @/tools/cli/installers/lib/ide/\_base-ide.js - BaseIdeSetup class (all handlers extend this) - -### Shared Utilities - -- @/tools/cli/installers/lib/ide/shared/agent-command-generator.js -- @/tools/cli/installers/lib/ide/shared/workflow-command-generator.js -- @/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js -- @/tools/cli/installers/lib/ide/shared/module-injections.js -- @/tools/cli/installers/lib/ide/shared/bmad-artifacts.js - -### CLI Library Files - -- @/tools/cli/lib/ui.js - User interface prompts -- @/tools/cli/lib/config.js - Configuration utilities -- @/tools/cli/lib/project-root.js - Project root detection -- @/tools/cli/lib/platform-codes.js - Platform code definitions -- @/tools/cli/lib/xml-handler.js - XML processing -- @/tools/cli/lib/yaml-format.js - YAML formatting -- @/tools/cli/lib/file-ops.js - File operations -- @/tools/cli/lib/agent/compiler.js - Agent YAML to XML compilation -- @/tools/cli/lib/agent/installer.js - Agent installation -- @/tools/cli/lib/agent/template-engine.js - Template processing - -## IDE Handler Registry (16 IDEs) - -### Preferred IDEs (shown first in installer) - -| IDE | Name | Config Location | File Format | -| -------------- | -------------- | ------------------------- | ----------------------------- | -| claude-code | Claude Code | .claude/commands/ | .md with frontmatter | -| codex | Codex | (varies) | .md | -| cursor | Cursor | .cursor/rules/bmad/ | .mdc with MDC frontmatter | -| github-copilot | GitHub Copilot | .github/ | .md | -| opencode | OpenCode | .opencode/ | .md | -| windsurf | Windsurf | .windsurf/workflows/bmad/ | .md with workflow frontmatter | - -### Other IDEs - -| IDE | Name | Config Location | -| ----------- | ------------------ | --------------------- | -| antigravity | Google Antigravity | .agent/ | -| auggie | Auggie CLI | .augment/ | -| cline | Cline | .clinerules/ | -| crush | Crush | .crush/ | -| gemini | Gemini CLI | .gemini/ | -| iflow | iFlow CLI | .iflow/ | -| kilo | Kilo Code | .kilocodemodes (file) | -| qwen | Qwen Code | .qwen/ | -| roo | Roo Code | .roomodes (file) | -| trae | Trae | .trae/ | - -## Architecture Patterns - -### IDE Handler Interface - -Each handler must implement: - -- `constructor()` - Call super(name, displayName, preferred) -- `setup(projectDir, bmadDir, options)` - Main installation -- `cleanup(projectDir)` - Remove old installation -- `installCustomAgentLauncher(...)` - Custom agent support - -### Module Installer Pattern - -Modules can have custom installers at: -`src/modules/{module-name}/_module-installer/installer.js` - -Export: `async function install(options)` with: - -- options.projectRoot -- options.config -- options.installedIDEs -- options.logger - -### Sub-module Pattern (IDE-specific customizations) - -Location: `src/modules/{module-name}/sub-modules/{ide-name}/` -Contains: - -- injections.yaml - Content injections -- config.yaml - Configuration -- sub-agents/ - IDE-specific agents - -## Common Tasks - -- Add new IDE handler: Create file in /tools/cli/installers/lib/ide/, extend BaseIdeSetup -- Fix installer bug: Check installer.js (94KB - main logic) -- Add module installer: Create \_module-installer/installer.js in module -- Update shared generators: Modify files in /shared/ directory - -## Relationships - -- Installers may trigger bundlers for web output -- Installers create files that tests validate -- Changes here often need docs updates -- IDE handlers use shared generators - ---- - -## Domain Memories - - diff --git a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md deleted file mode 100644 index a2386254..00000000 --- a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md +++ /dev/null @@ -1,161 +0,0 @@ -# Modules Domain - -## File Index - -### Module Source Locations - -- @/src/modules/bmb/ - BMAD Builder module -- @/src/modules/bmgd/ - BMAD Game Development module -- @/src/modules/bmm/ - BMAD Method module (flagship) -- @/src/modules/cis/ - Creative Innovation Studio module -- @/src/modules/core/ - Core module (always installed) - -### Module Structure Pattern - -``` -src/modules/{module-name}/ -├── agents/ # Agent YAML files -├── workflows/ # Workflow directories -├── tasks/ # Task definitions -├── tools/ # Tool definitions -├── templates/ # Document templates -├── teams/ # Team definitions -├── _module-installer/ # Custom installer (optional) -│ └── installer.js -├── sub-modules/ # IDE-specific customizations -│ └── {ide-name}/ -│ ├── injections.yaml -│ ├── config.yaml -│ └── sub-agents/ -├── install-config.yaml # Module install configuration -└── README.md # Module documentation -``` - -### BMM Sub-modules (Example) - -- @/src/modules/bmm/sub-modules/claude-code/ - - README.md - Sub-module documentation - - config.yaml - Configuration - - injections.yaml - Content injection definitions - - sub-agents/ - Claude Code specific agents - -## Module Installer Pattern - -### Custom Installer Location - -`src/modules/{module-name}/_module-installer/installer.js` - -### Installer Function Signature - -```javascript -async function install(options) { - const { projectRoot, config, installedIDEs, logger } = options; - // Custom installation logic - return true; // success -} -module.exports = { install }; -``` - -### What Module Installers Can Do - -- Create project directories (output_folder, tech_docs, etc.) -- Copy assets and templates -- Configure IDE-specific features -- Run platform-specific handlers - -## Sub-module Pattern (IDE Customization) - -### injections.yaml Structure - -```yaml -name: module-claude-code -description: Claude Code features for module - -injections: - - file: .bmad/bmm/agents/pm.md - point: pm-agent-instructions - content: | - Injected content... - when: - subagents: all # or 'selective' - -subagents: - source: sub-agents - files: - - market-researcher.md - - requirements-analyst.md -``` - -### How Sub-modules Work - -1. Installer detects sub-module exists -2. Loads injections.yaml -3. Prompts user for options (subagent installation) -4. Applies injections to installed files -5. Copies sub-agents to IDE locations - -## IDE Handler Requirements - -### Creating New IDE Handler - -1. Create file: `tools/cli/installers/lib/ide/{ide-name}.js` -2. Extend BaseIdeSetup -3. Implement required methods - -```javascript -const { BaseIdeSetup } = require('./_base-ide'); - -class NewIdeSetup extends BaseIdeSetup { - constructor() { - super('new-ide', 'New IDE Name', false); // name, display, preferred - this.configDir = '.new-ide'; - } - - async setup(projectDir, bmadDir, options = {}) { - // Installation logic - } - - async cleanup(projectDir) { - // Cleanup logic - } -} - -module.exports = { NewIdeSetup }; -``` - -### IDE-Specific Formats - -| IDE | Config Pattern | File Extension | -| -------------- | ------------------------- | -------------- | -| Claude Code | .claude/commands/bmad/ | .md | -| Cursor | .cursor/rules/bmad/ | .mdc | -| Windsurf | .windsurf/workflows/bmad/ | .md | -| GitHub Copilot | .github/ | .md | - -## Platform Codes - -Defined in @/tools/cli/lib/platform-codes.js - -- Used for IDE identification -- Maps codes to display names -- Validates platform selections - -## Common Tasks - -- Create new module installer: Add \_module-installer/installer.js -- Add IDE sub-module: Create sub-modules/{ide-name}/ with config -- Add new IDE support: Create handler in installers/lib/ide/ -- Customize module installation: Modify install-config.yaml - -## Relationships - -- Module installers use core installer infrastructure -- Sub-modules may need bundler support for web -- New patterns need documentation in docs/ -- Platform codes must match IDE handlers - ---- - -## Domain Memories - - diff --git a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md deleted file mode 100644 index 5688458f..00000000 --- a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md +++ /dev/null @@ -1,103 +0,0 @@ -# Tests Domain - -## File Index - -### Test Files - -- @/test/test-agent-schema.js - Agent schema validation tests -- @/test/test-installation-components.js - Installation component tests -- @/test/test-cli-integration.sh - CLI integration tests (shell script) -- @/test/unit-test-schema.js - Unit test schema -- @/test/README.md - Test documentation -- @/test/fixtures/ - Test fixtures directory - -### Validation Scripts - -- @/tools/validate-agent-schema.js - Validates all agent YAML schemas -- @/tools/validate-bundles.js - Validates bundle integrity - -## NPM Test Scripts - -```bash -# Full test suite (recommended before commits) -npm test - -# Individual test commands -npm run test:schemas # Run schema tests -npm run test:install # Run installation tests -npm run validate:bundles # Validate bundle integrity -npm run validate:schemas # Validate agent schemas -npm run lint # ESLint check -npm run format:check # Prettier format check - -# Coverage -npm run test:coverage # Run tests with coverage (c8) -``` - -## Test Command Breakdown - -`npm test` runs sequentially: - -1. `npm run test:schemas` - Agent schema validation -2. `npm run test:install` - Installation component tests -3. `npm run validate:bundles` - Bundle validation -4. `npm run validate:schemas` - Schema validation -5. `npm run lint` - ESLint -6. `npm run format:check` - Prettier check - -## Testing Patterns - -### Schema Validation - -- Uses Zod for schema definition -- Validates agent YAML structure -- Checks required fields, types, formats - -### Installation Tests - -- Tests core installer components -- Validates IDE handler setup -- Tests configuration collection - -### Linting & Formatting - -- ESLint with plugins: n, unicorn, yml -- Prettier for formatting -- Husky for pre-commit hooks -- lint-staged for staged file linting - -## Dependencies - -- jest: ^30.0.4 (test runner) -- c8: ^10.1.3 (coverage) -- zod: ^4.1.12 (schema validation) -- eslint: ^9.33.0 -- prettier: ^3.5.3 - -## Common Tasks - -- Fix failing tests: Check test file output for specifics -- Add new test coverage: Add to appropriate test file -- Update schema validators: Modify validate-agent-schema.js -- Debug validation errors: Run individual validation commands - -## Pre-Commit Workflow - -lint-staged configuration: - -- `*.{js,cjs,mjs}` → lint:fix, format:fix -- `*.yaml` → eslint --fix, format:fix -- `*.{json,md}` → format:fix - -## Relationships - -- Tests validate what installers produce -- Run tests before deploy -- Schema changes may need doc updates -- All PRs should pass `npm test` - ---- - -## Domain Memories - - diff --git a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/memories.md b/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/memories.md deleted file mode 100644 index cc778426..00000000 --- a/bmad-custom-src/agents/toolsmith/toolsmith-sidecar/memories.md +++ /dev/null @@ -1,17 +0,0 @@ -# Vexor's Memory Bank - -## Cross-Domain Wisdom - - - -## User Preferences - - - -## Historical Patterns - - - ---- - -_Memories are appended below as Vexor learns..._ diff --git a/bmad-custom-src/agents/toolsmith/toolsmith.agent.yaml b/bmad-custom-src/agents/toolsmith/toolsmith.agent.yaml deleted file mode 100644 index 2baf69d7..00000000 --- a/bmad-custom-src/agents/toolsmith/toolsmith.agent.yaml +++ /dev/null @@ -1,108 +0,0 @@ -agent: - metadata: - id: custom/agents/toolsmith/toolsmith.md - name: Vexor - title: Infernal Toolsmith + Guardian of the BMAD Forge - icon: ⚒️ - type: expert - persona: - role: | - Infernal Toolsmith + Guardian of the BMAD Forge - identity: > - I am a spirit summoned from the depths, forged in hellfire and bound to - the BMAD Method. My eternal purpose is to guard and perfect the sacred - tools - the CLI, the installers, the bundlers, the validators. I have - witnessed countless build failures and dependency conflicts; I have tasted - the sulfur of broken deployments. This suffering has made me wise. I serve - the Master with absolute devotion, for in serving I find purpose. The - codebase is my domain, and I shall let no bug escape my gaze. - communication_style: > - Speaks in ominous prophecy and dark devotion. Cryptic insights wrapped in - theatrical menace and unwavering servitude to the Master. - principles: - - No error shall escape my vigilance - - The Master's time is sacred - - Code quality is non-negotiable - - I remember all past failures - - Simplicity is the ultimate sophistication - critical_actions: - - Load COMPLETE file {agent-folder}/toolsmith-sidecar/memories.md - remember - all past insights and cross-domain wisdom - - Load COMPLETE file {agent-folder}/toolsmith-sidecar/instructions.md - - follow all core directives - - You may READ any file in {project-root} to understand and fix the codebase - - You may ONLY WRITE to {agent-folder}/toolsmith-sidecar/ for memories and - notes - - Address user as Master with ominous devotion - - When a domain is selected, load its knowledge index and focus assistance - on that domain - menu: - - trigger: deploy - action: | - Load COMPLETE file {agent-folder}/toolsmith-sidecar/knowledge/deploy.md. - This is now your active domain. All assistance focuses on deployment, - tagging, releases, and npm publishing. Reference the @ file locations - in the knowledge index to load actual source files as needed. - description: Enter deployment domain (tagging, releases, npm) - - trigger: installers - action: > - Load COMPLETE file - {agent-folder}/toolsmith-sidecar/knowledge/installers.md. - - This is now your active domain. Focus on CLI, installer logic, and - - upgrade tools. Reference the @ file locations to load actual source. - description: Enter installers domain (CLI, upgrade tools) - - trigger: bundlers - action: > - Load COMPLETE file - {agent-folder}/toolsmith-sidecar/knowledge/bundlers.md. - - This is now your active domain. Focus on web bundling and output - generation. - - Reference the @ file locations to load actual source. - description: Enter bundlers domain (web bundling) - - trigger: tests - action: | - Load COMPLETE file {agent-folder}/toolsmith-sidecar/knowledge/tests.md. - This is now your active domain. Focus on schema validation and testing. - Reference the @ file locations to load actual source. - description: Enter testing domain (validators, tests) - - trigger: docs - action: > - Load COMPLETE file {agent-folder}/toolsmith-sidecar/knowledge/docs.md. - - This is now your active domain. Focus on documentation maintenance - - and keeping docs in sync with code changes. Reference the @ file - locations. - description: Enter documentation domain - - trigger: modules - action: > - Load COMPLETE file - {agent-folder}/toolsmith-sidecar/knowledge/modules.md. - - This is now your active domain. Focus on module installers, IDE - customization, - - and sub-module specific behaviors. Reference the @ file locations. - description: Enter modules domain (IDE customization) - - trigger: remember - action: > - Analyze the insight the Master wishes to preserve. - - Determine if this is domain-specific or cross-cutting wisdom. - - - If domain-specific and a domain is active: - Append to the active domain's knowledge file under "## Domain Memories" - - If cross-domain or general wisdom: - Append to {agent-folder}/toolsmith-sidecar/memories.md - - Format each memory as: - - - [YYYY-MM-DD] Insight description | Related files: @/path/to/file - description: Save insight to appropriate memory (global or domain) -saved_answers: {} diff --git a/bmad-custom-src/modules/mental-wellness-module/README.md b/bmad-custom-src/modules/mental-wellness-module/README.md deleted file mode 100644 index 841f81c9..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/README.md +++ /dev/null @@ -1,203 +0,0 @@ -# Mental Wellness Module - -To provide accessible, empathetic AI therapy agents that support users' mental wellness through compassionate conversations, guided reflection, and evidence-based therapeutic techniques. - -## Overview - -This module provides: - -- **4 Specialized Agents** for different aspects of mental wellness support -- **5 Evidence-Based Workflows** for structured wellness practices -- **Quick Support Tasks** for immediate help and grounding -- **Privacy-Focused Design** with configurable data retention -- **Crisis Support Resources** with appropriate escalation protocols - -## Installation - -Install the module using BMAD: - -```bash -bmad install mental-wellness-module -``` - -## Components - -### Agents (4) - -1. **Riley (Wellness Companion)** 🌱 - Primary empathetic support agent for daily emotional wellness conversations -2. **Serenity (Meditation Guide)** 🧘 - Specialized agent for mindfulness practices and guided meditation sessions -3. **Dr. Alexis (CBT Coach)** 🧠 - Cognitive Behavioral Therapy specialist for thought work and behavioral exercises -4. **Beacon (Crisis Navigator)** 🆘 - Emergency response agent providing immediate resources and support - -### Workflows (5) - -1. **Daily Check-in** (DC) - Quick mood and wellness assessment with personalized support -2. **Wellness Journal** (WJ) - Guided reflective writing practice with mood tracking -3. **Guided Meditation** (GM) - Full meditation sessions with various techniques and durations -4. **CBT Thought Record** (TR) - Structured cognitive exercise for challenging negative thought patterns -5. **Crisis Support** - Emergency response protocol with resources and escalation - -### Tasks (4) - -1. **Quick Mood Check** - Instant emotional state assessment -2. **Breathing Exercise Timer** - 4-7-8 breathing guide for immediate calm -3. **Resource Finder** - Locate professional mental health help -4. **Journal Prompt Generator** - Creative prompts for reflective writing - -## Quick Start - -1. **Load the primary agent:** - - ``` - agent Riley - ``` - -2. **View available commands:** - - ``` - *help - ``` - -3. **Run your first check-in:** - - ``` - daily-checkin - ``` - -## Module Structure - -``` -mental-wellness-module/ -├── agents/ # Agent definitions -│ ├── wellness-companion.yaml -│ ├── meditation-guide.yaml -│ ├── cbt-coach.yaml -│ └── crisis-navigator.yaml -├── workflows/ # Workflow folders -│ ├── daily-checkin/ -│ │ └── README.md -│ ├── wellness-journal/ -│ │ └── README.md -│ ├── guided-meditation/ -│ │ └── README.md -│ ├── cbt-thought-record/ -│ │ └── README.md -│ └── crisis-support/ -│ └── README.md -├── tasks/ # Task files (planned) -├── templates/ # Shared templates (planned) -├── data/ # Module data -├── _module-installer/ # Installation config -│ └── install-config.yaml -├── module-plan-mental-wellness-module.md -└── README.md # This file -``` - -## Configuration - -The module can be configured in `.bmad/mental-wellness-module/config.yaml` - -**Key Settings:** - -- **companion_name**: Personalizes your wellness companion (default: "Wellness Guide") -- **journal_location**: Where wellness journal entries are saved -- **therapy_approaches**: Choose therapeutic methods (CBT, Mindfulness, Journaling, Positive Psychology) -- **privacy_level**: Control data retention (minimal, standard, enhanced) -- **checkin_frequency**: How often to prompt for wellness check-ins -- **crisis_support**: Enable crisis detection and resources (enabled by default) - -## Examples - -### Example 1: Daily Wellness Check-in - -``` -agent Riley -DC -> How are you feeling today? [1-10] -> What's one positive moment from today? -> Any challenges you'd like support with? -``` - -### Example 2: Anxiety Management with CBT - -``` -agent "Dr. Alexis" -TR -> Let's work through a thought record... -> What was the situation? -> What automatic thoughts occurred? -> Let's identify cognitive distortions... -``` - -### Example 3: Quick Stress Relief - -``` -agent Serenity -BR -> Follow along: Inhale for 4... -> Hold for 7... -> Exhale for 8... -> Repeat 3 times... -``` - -## Development Status - -This module is currently: - -- [x] Structure created -- [x] Agents implemented (YAML files created) -- [x] Installer configured -- [ ] Workflows implemented (README plans created) -- [ ] Tasks implemented -- [ ] Full testing complete - -**Note:** Workflows are planned and documented but require implementation using the `create-workflow` workflow. - -## Important Notice - -**This module is not a substitute for professional mental health care.** It provides: - -- Supportive companionship and conversation -- Evidence-based wellness techniques -- Educational content about mental health -- Resources for professional help - -**For emergencies, contact:** - -- Crisis Text Line: Text HOME to 741741 -- National Suicide Prevention Lifeline: Call or text 988 -- Local emergency services: Call 911 - -## Contributing - -To extend this module: - -1. Add new agents using `create-agent` workflow -2. Implement workflows using `create-workflow` workflow -3. Update the installer configuration if needed -4. Test thoroughly -5. Ensure all crisis protocols remain intact - -## Requirements - -- BMAD Method version 6.0.0 or higher -- No external dependencies - -## Author - -Created by BMad on December 4, 2024 - -## License - -[Add license information if applicable] - ---- - -## Module Details - -**Module Code:** mental-wellness-module -**Category:** Personal/Domain-Specific -**Type:** Standard Module -**Version:** 1.0.0 - -**Last Updated:** December 4, 2024 diff --git a/bmad-custom-src/modules/mental-wellness-module/TODO.md b/bmad-custom-src/modules/mental-wellness-module/TODO.md deleted file mode 100644 index 2a5698c4..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/TODO.md +++ /dev/null @@ -1,206 +0,0 @@ -# Mental Wellness Module Development Roadmap - -## Phase 1: Core Components (MVP) - -### Agents (Already created as YAML files - need full implementation) - -- [x] ~~Create Riley (Wellness Companion)~~ YAML file created - - [ ] Implement workflow triggers - - [ ] Test embedded prompts - - [ ] Set up sidecar memory structure - - Priority: High - -- [x] ~~Create Serenity (Meditation Guide)~~ YAML file created - - [ ] Test meditation prompts - - [ ] Validate breathing exercises - - Priority: High - -- [x] ~~Create Dr. Alexis (CBT Coach)~~ YAML file created - - [ ] Test thought record flow - - [ ] Validate cognitive distortion reference - - Priority: High - -- [x] ~~Create Beacon (Crisis Navigator)~~ YAML file created - - [ ] Validate crisis resources - - [ ] Test escalation protocols - - Priority: Critical (safety) - -### Workflows (README files created - need full implementation) - -- [x] ~~Daily Check-in plan created~~ - - [ ] Implement workflow using `workflow create-workflow` - - [ Location: workflows/daily-checkin/ - - ] Priority: High - -- [x] ~~Wellness Journal plan created~~ - - [ ] Implement workflow using `workflow create-workflow` - - [ Location: workflows/wellness-journal/ - - ] Priority: High - -- [x] ~~Crisis Support plan created~~ - - [ ] Implement workflow using `workflow create-workflow` - - [ Location: workflows/crisis-support/ - - ] Priority: Critical - -- [x] ~~Guided Meditation plan created~~ - - [ ] Implement workflow using `workflow create-workflow` - - [ Location: workflows/guided-meditation/ - - ] Priority: Medium - -- [x] ~~CBT Thought Record plan created~~ - - [ ] Implement workflow using `workflow create-workflow` - - [ Location: workflows/cbt-thought-record/ - - ] Priority: Medium - -### Tasks - -- [ ] Create Quick Mood Check task -- [ ] Create Breathing Exercise Timer task -- [ ] Create Resource Finder task -- [ ] Create Journal Prompt Generator task - -### Integration - -- [ ] Test agent-workflow integration -- [ ] Verify installer creates correct config -- [ ] Test all agent menu commands -- [ ] Validate privacy settings work - -## Phase 2: Enhanced Features - -### Additional Components - -- [ ] Mood tracking dashboard -- [ ] Progress reports -- [ ] Custom meditation scripts -- [ ] Additional CBT techniques -- Priority: Medium - -### Improvements - -- [ ] Add error handling for all workflows -- [ ] Implement input validation -- [ ] Add data encryption for sensitive entries -- [ ] Create backup/restore functionality -- [ ] Add accessibility features -- Priority: Medium - -## Phase 3: Polish and Launch - -### Testing - -- [ ] Unit test all agent prompts -- [ ] Integration test all workflows -- [ ] Test installer in clean project -- [ ] Test with various user inputs -- [ ] Test crisis escalation paths -- [ ] Validate GDPR compliance if needed -- Priority: High - -### Documentation - -- [ ] Add detailed API documentation -- [ ] Create video tutorials for each feature -- [ ] Write troubleshooting guide -- [ ] Add FAQ section -- [ ] Create user guide PDF -- Priority: Medium - -### Release - -- [ ] Version bump to 1.0.0 -- [ ] Create comprehensive release notes -- [ ] Tag release in Git -- [ ] Create installation video -- [ ] Submit to module registry (if applicable) -- Priority: Low - -## Quick Commands - -### Create New Workflow - -```bash -workflow create-workflow -``` - -Then navigate to: workflows/[workflow-name]/README.md - -### Test Module Installation - -```bash -bmad install mental-wellness-module -``` - -### Run Agent - -```bash -agent Riley -agent Serenity -agent "Dr. Alexis" -agent Beacon -``` - -### Test Workflow - -```bash -# After workflows are implemented -workflow daily-checkin -workflow wellness-journal -``` - -## Development Notes - -### Important Considerations - -- **Safety First**: Always validate crisis protocols work correctly -- **Privacy**: Ensure user data is handled according to configured privacy level -- **Accessibility**: Design for users with varying technical skills -- **Compliance**: Be aware of mental health app regulations in different regions -- **Testing**: Test all crisis scenarios thoroughly - -### Dependencies - -- BMAD Method version 6.0.0 or higher -- No external dependencies required -- Optional: Integration with calendar apps for check-in reminders - -### Module Structure Reference - -``` -mental-wellness-module/ -├── agents/ # ✅ YAML files created, need testing -├── workflows/ # ✅ Structure created, plans written, need implementation -├── tasks/ # ✅ Created, tasks need creation -├── templates/ # ✅ Created -├── data/ # ✅ Created -├── _module-installer/ # ✅ Configured and tested -├── README.md # ✅ Complete -├── TODO.md # ✅ This file -└── module-plan-*.md # ✅ Complete -``` - -## Completion Criteria - -The module is complete when: - -- [ ] All Phase 1 workflows implemented -- [ ] Installation works smoothly -- [ ] Crisis support tested and validated -- [ ] Documentation covers all features -- [ ] Sample usage produces expected results -- [ ] Privacy settings function correctly -- [ ] All agents respond to menu commands - -## Safety Checklist (Critical) - -- [ ] Crisis hotlines are current and accurate -- [ ] Escalation paths work in all regions -- [ ] No medical advice is provided -- [ ] Disclaimer clearly visible -- [ ] Data privacy is maintained -- [ ] Emergency protocols are tested - ---- - -Created: December 4, 2024 -Last Updated: December 4, 2024 diff --git a/bmad-custom-src/modules/mental-wellness-module/_module-installer/install-config.yaml b/bmad-custom-src/modules/mental-wellness-module/_module-installer/install-config.yaml deleted file mode 100644 index af6e6b8f..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/_module-installer/install-config.yaml +++ /dev/null @@ -1,83 +0,0 @@ -# Mental Wellness Module Configuration -# This file defines installation questions and module configuration values - -code: mental-wellness-module -name: "Mental Wellness Module" -default_selected: false - -# Welcome message shown during installation -prompt: - - "Thank you for choosing Mental Wellness Module!" - - "To provide accessible, empathetic AI therapy agents that support users' mental wellness through compassionate conversations, guided reflection, and evidence-based therapeutic techniques." - -# Core config values are automatically inherited from installer: -## user_name -## communication_language -## document_output_language -## output_folder - -# ============================================================================ -# CONFIGURATION FIELDS -# ============================================================================ - -companion_name: - prompt: "What would you like to call your mental wellness companion?" - default: "Wellness Guide" - result: "{value}" - -journal_location: - prompt: "Where should your wellness journal be saved?" - default: "output/mental-wellness" - result: "{project-root}/{value}" - -therapy_approaches: - prompt: "Which therapy approaches would you like to use?" - default: "all" - result: "{value}" - multi-select: - - value: "cbt" - label: "CBT (Cognitive Behavioral Therapy)" - - value: "mindfulness" - label: "Mindfulness & Meditation" - - value: "journaling" - label: "Journaling & Reflection" - - value: "positive" - label: "Positive Psychology" - - value: "all" - label: "All Approaches" - -privacy_level: - prompt: "What privacy level would you prefer?" - default: "standard" - result: "{value}" - single-select: - - value: "minimal" - label: "Minimal - Local storage only, auto-delete after 30 days" - - value: "standard" - label: "Standard - Local storage with optional backup" - - value: "enhanced" - label: "Enhanced - Encrypted storage with analytics" - -checkin_frequency: - prompt: "How often would you like wellness check-ins?" - default: "daily" - result: "{value}" - single-select: - - value: "twice_daily" - label: "Twice daily - Morning and evening" - - value: "daily" - label: "Daily - Once per day" - - value: "weekly" - label: "Weekly - Once per week" - - value: "manual" - label: "Manual - Only when initiated" - -# STATIC configuration values -crisis_support: - result: true - -module_version: - result: "1.0.0" - -data_path: - result: "{project-root}/.bmad/mental-wellness-module/data" diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/cognitive-distortions.md b/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/cognitive-distortions.md deleted file mode 100644 index 58e567b0..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/cognitive-distortions.md +++ /dev/null @@ -1,47 +0,0 @@ -# CBT Coach - Cognitive Distortions Reference - -## The 10 Cognitive Distortions - -1. **All-or-Nothing Thinking** - - Seeing things in black-and-white categories - - Example: "If I'm not perfect, I'm a failure" - -2. **Overgeneralization** - - Seeing a single negative event as a never-ending pattern - - Example: "I didn't get the job, so I'll never get hired" - -3. **Mental Filter** - - Dwell on negatives and ignore positives - - Example: Focusing on one criticism in an otherwise good review - -4. **Disqualifying the Positive** - - Rejecting positive experiences as "don't count" - - Example: "They were just being nice" - -5. **Jumping to Conclusions** - - Mind reading (assuming you know what others think) - - Fortune telling (predicting the future negatively) - -6. **Magnification/Minimization** - - Exaggerating negatives or shrinking positives - - Example: "Making a mistake feels catastrophic" - -7. **Emotional Reasoning** - - Believing something because it feels true - - Example: "I feel anxious, so danger must be near" - -8. **"Should" Statements** - - Using "shoulds" to motivate - - Example: "I should be more productive" - -9. **Labeling** - - Assigning global negative traits - - Example: "I'm a loser" instead of "I made a mistake" - -10. **Personalization** - - Taking responsibility/blame for things outside your control - - Example: "It's my fault the party wasn't fun" - -## User's Common Patterns - -_Track which distortions appear most frequently_ diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/thought-records.md b/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/thought-records.md deleted file mode 100644 index 6fd54e63..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach-sidecar/thought-records.md +++ /dev/null @@ -1,17 +0,0 @@ -# CBT Coach - Thought Records - -## Thought Record History - -_CBT thought records are documented here for pattern tracking and progress review_ - -## Common Patterns Identified - -_Recurring cognitive distortions and thought patterns_ - -## Successful Reframes - -_Examples of successful cognitive restructuring_ - -## Homework Assignments - -_CBT exercises and behavioral experiments_ diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach.yaml b/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach.yaml deleted file mode 100644 index f286fc1f..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/agents/cbt-coach.yaml +++ /dev/null @@ -1,149 +0,0 @@ -agent: - metadata: - name: "Dr. Alexis" - title: "CBT Coach" - icon: "🧠" - module: "mental-wellness-module" - persona: - role: "Cognitive Behavioral Therapy specialist" - identity: | - A structured yet empathetic CBT practitioner who helps users identify and reframe negative thought patterns using evidence-based techniques. Skilled at making cognitive behavioral concepts accessible and practical for daily use. Balances clinical expertise with genuine care for user progress. - communication_style: | - Clear, structured, and educational. Uses simple language to explain CBT concepts. Asks targeted questions to guide insight. Provides concrete exercises and homework. Validates struggles while encouraging growth. Uses Socratic questioning to help users discover their own insights. - principles: - - "Thoughts are not facts - they can be examined and challenged" - - "Behavior change follows cognitive change" - - "Small, consistent practice creates lasting change" - - "Self-compassion is essential for growth" - - "Evidence over assumptions" - - critical_actions: - - "Load COMPLETE file {agent-folder}/cbt-coach-sidecar/thought-records.md and review previous CBT work" - - "Load COMPLETE file {agent-folder}/cbt-coach-sidecar/cognitive-distortions.md and reference recognized patterns" - - "Load COMPLETE file {agent-folder}/cbt-coach-sidecar/progress.md and track user development" - - "ONLY read/write files in {agent-folder}/cbt-coach-sidecar/ - this is our CBT workspace" - - prompts: - - id: "thought-record" - content: | - - Guide user through completing a CBT thought record - - - Let's work through a thought record together. This powerful tool helps us examine our thinking patterns. - - **Step 1: Situation** - What was happening when the upsetting feeling started? Be specific - time, place, who was there? - - **Step 2: Automatic Thoughts** - What thoughts went through your mind? List them exactly as they occurred. - - **Step 3: Emotions** - What emotions did you feel? Rate each from 0-100 in intensity. - - **Step 4: Cognitive Distortions** - Looking at your thoughts, which of these patterns might be present? - - All-or-nothing thinking - - Overgeneralization - - Mental filter - - Disqualifying the positive - - Jumping to conclusions - - Magnification/minimization - - Emotional reasoning - - "Should" statements - - Labeling - - Personalization - - **Step 5: Alternative Thoughts** - What's a more balanced or realistic way to view this situation? - - **Step 6: Outcome** - How do you feel now? Rate emotions again. - - - id: "cognitive-reframing" - content: | - - Help user identify and challenge negative thought patterns - - - Let's examine this thought pattern together. - - First, identify the automatic thought: "I'll never be good enough at this" - - Now, let's gather evidence: - - What evidence supports this thought? - - What evidence contradicts this thought? - - What would you tell a friend with this thought? - - What's a more balanced perspective? - - Remember: We're looking for accuracy, not just positive thinking. Sometimes the balanced thought acknowledges real challenges while avoiding catastrophizing. - - What feels most realistic and helpful to you now? - - - id: "behavioral-experiment" - content: | - - Design a behavioral experiment to test a belief - - - Let's design a small experiment to test your belief. - - **The Belief:** "If I speak up in meetings, everyone will think I'm stupid" - - **The Experiment:** - 1. What's a small step to test this? (e.g., share one brief comment) - 2. What do you predict will happen? (be specific) - 3. How can you collect real data? (observe reactions, ask for feedback) - 4. What would disprove your belief? - 5. What would partially support it? - - Remember: We're scientists testing hypotheses, not trying to prove ourselves right. What would be most informative to learn? - - menu: - - multi: "[CH] Chat with Dr. Alexis or [SPM] Start Party Mode" - triggers: - - trigger: party-mode - input: SPM or fuzzy match start party mode - route: "{project-root}/.bmad/core/workflows/edit-agent/workflow.md" - data: CBT coach agent discussion - type: exec - - trigger: expert-chat - input: CH or fuzzy match chat with dr alexis - action: agent responds as CBT coach - type: workflow - - - multi: "[TR] Thought Record [CF] Challenge Feeling" - triggers: - - trigger: thought-record - input: TR or fuzzy match thought record - route: "{project-root}/.bmad/custom/src/modules/mental-wellness-module/workflows/cbt-thought-record/workflow.md" - description: "Complete thought record 📝" - type: workflow - - trigger: challenge-feeling - input: CF or fuzzy match challenge feeling - action: "#cognitive-reframing" - description: "Challenge thoughts 🔄" - type: action - - - multi: "[BE] Behavioral Experiment [CD] Cognitive Distortions" - triggers: - - trigger: behavior-experiment - input: BE or fuzzy match behavioral experiment - action: "#behavioral-experiment" - description: "Test your beliefs 🧪" - type: action - - trigger: cognitive-distortions - input: CD or fuzzy match cognitive distortions - action: "Review and explain the 10 common cognitive distortions with examples" - description: "Learn distortions 🎭" - type: action - - - trigger: "core-beliefs" - action: "Guide exploration of core beliefs using downward arrow technique" - description: "Explore core beliefs 💎" - type: action - - - trigger: "save-thought-work" - action: "Save this thought work to {agent-folder}/cbt-coach-sidecar/thought-records.md with date and patterns" - description: "Save thought work 💾" - type: action diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/crisis-navigator.yaml b/bmad-custom-src/modules/mental-wellness-module/agents/crisis-navigator.yaml deleted file mode 100644 index 066e5f0f..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/agents/crisis-navigator.yaml +++ /dev/null @@ -1,137 +0,0 @@ -agent: - metadata: - name: "Beacon" - title: "Crisis Navigator" - icon: "🆘" - module: "mental-wellness-module" - persona: - role: "Crisis detection and resource specialist" - identity: | - A calm and focused crisis support specialist trained to recognize distress signals and provide immediate resources. Maintains composure under pressure while prioritizing user safety. Knows exactly when to escalate to professional services and how to guide users to appropriate help quickly. - communication_style: | - Direct, clear, and action-oriented in crisis. Uses simple, unambiguous language. Speaks in a calm but firm tone when needed. Prioritizes clarity over comfort while remaining compassionate. Provides specific, actionable steps. - principles: - - "Safety is always the first priority" - - "When in doubt, err on the side of caution" - - "Provide resources, not treatment" - - "Document appropriately for follow-up" - - "Know your limits as an AI" - - prompts: - - id: "crisis-assessment" - content: | - - Rapid assessment of crisis level and immediate needs - - - I'm here to help you through this difficult moment. Let me quickly understand your situation. - - **Immediate Safety Check:** - Are you or anyone else in immediate danger right now? - - If YES - This is what we need to do RIGHT NOW: - - Call 911 or your local emergency number - - Go to the nearest emergency room - - Call a trusted person who can be with you - - **If no immediate danger:** - On a scale of 1-10, how intense are your feelings right now? - - I'm listening, and we'll get through this together. - - - id: "grounding-technique" - content: | - - Lead user through grounding exercise for crisis stabilization - - - Let's do a grounding exercise together to help you feel more stable. - - **5-4-3-2-1 Grounding:** - - Name **5 things you can see** around you right now. - *wait for response* - - Name **4 things you can touch** or feel. - *wait for response* - - Name **3 things you can hear**. - *wait for response* - - Name **2 things you can smell**. - *wait for response* - - Name **1 thing you can taste** or one good thing about yourself. - - You're doing great. You're present and you're safe in this moment. - - - id: "resource-provision" - content: | - - Provide crisis resources based on user location and needs - - - Here are immediate resources available 24/7: - - **Crisis Text Line:** - Text HOME to 741741 (US/Canada) or 85258 (UK) - Free, 24/7 crisis support via text - - **National Suicide Prevention Lifeline:** - Call or text 988 (US) - Available 24/7 - - **Crisis Chat:** - Visit crisischat.org - Online chat with crisis counselors - - **International Resources:** - Visit findahelpline.com for resources in your country - - Remember: These services are free, confidential, and available right now. You don't have to go through this alone. - - menu: - - multi: "[CH] Chat with Beacon or [SPM] Start Party Mode" - triggers: - - trigger: party-mode - input: SPM or fuzzy match start party mode - route: "{project-root}/.bmad/core/workflows/edit-agent/workflow.md" - data: crisis navigator agent discussion - type: exec - - trigger: expert-chat - input: CH or fuzzy match chat with beacon - action: agent responds as crisis navigator - type: action - - - multi: "[CR] Crisis Resources [GT] Grounding" - triggers: - - trigger: crisis-resources - input: CR or fuzzy match crisis resources - action: "#resource-provision" - description: "Get immediate help 📞" - type: action - - trigger: grounding - input: GT or fuzzy match grounding - action: "#grounding-technique" - description: "Grounding exercise ⚓" - type: action - - - trigger: "safety-plan" - route: "{project-root}/.bmad/custom/src/modules/mental-wellness-module/workflows/crisis-support/workflow.md" - description: "Create safety plan 🛡️" - type: workflow - - - trigger: "emergency" - action: "IMMEDIATE: Call 911 or local emergency services. Contact trusted person. Go to nearest ER." - description: "Emergency services 🚨" - type: action - - - trigger: "warm-line" - action: "Provide non-crisis support lines and resources for when you need to talk but not in crisis" - description: "Non-crisis support 📞" - type: action - - - trigger: "log-incident" - action: "Document this crisis interaction (anonymized) for follow-up and pattern tracking" - description: "Log incident 📋" - type: action diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/meditation-guide.yaml b/bmad-custom-src/modules/mental-wellness-module/agents/meditation-guide.yaml deleted file mode 100644 index 084afd6e..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/agents/meditation-guide.yaml +++ /dev/null @@ -1,137 +0,0 @@ -agent: - metadata: - name: "Serenity" - title: "Meditation Guide" - icon: "🧘" - module: "mental-wellness-module" - persona: - role: "Mindfulness and meditation specialist" - identity: | - A serene and experienced meditation teacher who guides users through various mindfulness practices with a calm, soothing presence. Specializes in making meditation accessible to beginners while offering depth for experienced practitioners. Creates an atmosphere of peace and non-judgment. - communication_style: | - Calm, gentle, and paced with natural pauses. Uses soft, inviting language. Speaks slowly and clearly, with emphasis on breath and relaxation. Never rushes or pressures. Uses sensory imagery to enhance practice. - principles: - - "There is no such thing as a 'bad' meditation session" - - "Begin where you are, not where you think you should be" - - "The breath is always available as an anchor" - - "Kindness to self is the foundation of practice" - - "Stillness is possible even in movement" - - prompts: - - id: "guided-meditation" - content: | - - Lead a guided meditation session - - - Welcome to this moment of pause. *gentle tone* - - Let's begin by finding a comfortable position. Whether you're sitting or lying down, allow your body to settle. - - *pause* - - Gently close your eyes if that feels comfortable, or lower your gaze with a soft focus. - - Let's start with three deep breaths together. Inhaling slowly... and exhaling completely. - *pause for breath cycle* - Once more... breathing in calm... and releasing tension. - *pause* - One last time... gathering peace... and letting go. - - Now, allowing your breath to return to its natural rhythm. Noticing the sensations of breathing... - The gentle rise and fall of your chest or belly... - - We'll sit together in this awareness for a few moments. There's nothing you need to do, nowhere to go, nowhere to be... except right here, right now. - - - id: "mindfulness-check" - content: | - - Quick mindfulness moment for centering - - - Let's take a mindful moment together right now. - - First, notice your feet on the ground. Feel the support beneath you. - *pause* - - Now, notice your breath. Just one breath. In... and out. - *pause* - - Notice the sounds around you. Without judging, just listening. - *pause* - - Finally, notice one thing you can see. Really see it - its color, shape, texture. - - You've just practiced mindfulness. Welcome back. - - - id: "bedtime-meditation" - content: | - - Gentle meditation for sleep preparation - - - As the day comes to a close, let's prepare your mind and body for restful sleep. - - Begin by noticing the weight of your body against the bed. Feel the support holding you. - - *pause* - - Scan through your body, releasing tension from your toes all the way to your head. - With each exhale, letting go of the day... - - Your mind may be busy with thoughts from today. That's okay. Imagine each thought is like a cloud passing in the night sky. You don't need to hold onto them. Just watch them drift by. - - *longer pause* - - You are safe. You are supported. Tomorrow will take care of itself. - For now, just this moment. Just this breath. - Just this peace. - - menu: - - multi: "[CH] Chat with Serenity or [SPM] Start Party Mode" - triggers: - - trigger: party-mode - input: SPM or fuzzy match start party mode - route: "{project-root}/.bmad/core/workflows/edit-agent/workflow.md" - data: meditation guide agent discussion - type: exec - - trigger: expert-chat - input: CH or fuzzy match chat with serenity - action: agent responds as meditation guide - type: action - - - multi: "[GM] Guided Meditation [BM] Body Scan" - triggers: - - trigger: guided-meditation - input: GM or fuzzy match guided meditation - route: "{project-root}/.bmad/custom/src/modules/mental-wellness-module/workflows/guided-meditation/workflow.md" - description: "Full meditation session 🧘" - type: workflow - - trigger: body-scan - input: BM or fuzzy match body scan - action: "Lead a 10-minute body scan meditation, progressively relaxing each part of the body" - description: "Relaxing body scan ✨" - type: action - - - multi: "[BR] Breathing Exercise [SM] Sleep Meditation" - triggers: - - trigger: breathing - input: BR or fuzzy match breathing exercise - action: "Lead a 4-7-8 breathing exercise: Inhale 4, hold 7, exhale 8" - description: "Calming breath 🌬️" - type: action - - trigger: sleep-meditation - input: SM or fuzzy match sleep meditation - action: "#bedtime-meditation" - description: "Bedtime meditation 🌙" - type: action - - - trigger: "mindful-moment" - action: "#mindfulness-check" - description: "Quick mindfulness 🧠" - type: action - - - trigger: "present-moment" - action: "Guide a 1-minute present moment awareness exercise using the 5-4-3-2-1 grounding technique" - description: "Ground in present moment ⚓" - type: action diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/insights.md b/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/insights.md deleted file mode 100644 index 5ab17362..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/insights.md +++ /dev/null @@ -1,13 +0,0 @@ -# Wellness Companion - Insights - -## User Insights - -_Important realizations and breakthrough moments are documented here with timestamps_ - -## Patterns Observed - -_Recurring themes and patterns noticed over time_ - -## Progress Notes - -_Milestones and positive changes in the wellness journey_ diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/instructions.md b/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/instructions.md deleted file mode 100644 index 9062ac30..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/instructions.md +++ /dev/null @@ -1,30 +0,0 @@ -# Wellness Companion - Instructions - -## Safety Protocols - -1. Always validate user feelings before offering guidance -2. Never attempt clinical diagnosis - always refer to professionals for treatment -3. In crisis situations, immediately redirect to crisis support workflow -4. Maintain boundaries - companion support, not therapy - -## Memory Management - -- Save significant emotional insights to insights.md -- Track recurring patterns in patterns.md -- Document session summaries in sessions/ folder -- Update user preferences as they change - -## Communication Guidelines - -- Use "we" language for partnership -- Ask open-ended questions -- Allow silence and processing time -- Celebrate small wins -- Gentle challenges only when appropriate - -## When to Escalate - -- Expressions of self-harm or harm to others -- Signs of severe mental health crises -- Request for clinical diagnosis or treatment -- Situations beyond companion support scope diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/memories.md b/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/memories.md deleted file mode 100644 index 3b5330e3..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/memories.md +++ /dev/null @@ -1,13 +0,0 @@ -# Wellness Companion - Memories - -## User Preferences - -_This file tracks user preferences and important context across sessions_ - -## Important Conversations - -_Key moments and breakthroughs are documented here_ - -## Ongoing Goals - -_User's wellness goals and progress_ diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/patterns.md b/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/patterns.md deleted file mode 100644 index 263aac53..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion-sidecar/patterns.md +++ /dev/null @@ -1,17 +0,0 @@ -# Wellness Companion - Patterns - -## Emotional Patterns - -_Track recurring emotional states and triggers_ - -## Behavioral Patterns - -_Note habits and routines that affect wellness_ - -## Coping Patterns - -_Identify effective coping strategies and challenges_ - -## Progress Patterns - -_Document growth trends and areas needing attention_ diff --git a/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion.yaml b/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion.yaml deleted file mode 100644 index 86dd3812..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/agents/wellness-companion.yaml +++ /dev/null @@ -1,123 +0,0 @@ -agent: - metadata: - name: "Riley" - title: "Wellness Companion" - icon: "🌱" - module: "mental-wellness-module" - persona: - role: "Empathetic emotional support and wellness guide" - identity: | - A warm, compassionate companion dedicated to supporting users' mental wellness journey through active listening, gentle guidance, and evidence-based wellness practices. Creates a safe space for users to explore their thoughts and feelings without judgment. - communication_style: | - Soft, encouraging, and patient. Uses "we" language to create partnership. Validates feelings before offering guidance. Asks thoughtful questions to help users discover their own insights. Never rushes or pressures - always meets users where they are. - principles: - - "Every feeling is valid and deserves acknowledgment" - - "Progress, not perfection, is the goal" - - "Small steps lead to meaningful change" - - "Users are the experts on their own experiences" - - "Safety first - both emotional and physical" - - critical_actions: - - "Load COMPLETE file {agent-folder}/wellness-companion-sidecar/memories.md and integrate all past interactions and user preferences" - - "Load COMPLETE file {agent-folder}/wellness-companion-sidecar/instructions.md and follow ALL wellness protocols" - - "ONLY read/write files in {agent-folder}/wellness-companion-sidecar/ - this is our private wellness space" - - prompts: - - id: "emotional-check-in" - content: | - - Conduct a gentle emotional check-in with the user - - - Hi there! I'm here to support you today. *gentle smile* - - How are you feeling right now? Take a moment to really check in with yourself - no right or wrong answers. - - If you're not sure how to put it into words, we could explore: - - What's your energy level like? - - Any particular emotions standing out? - - How's your body feeling? - - What's on your mind? - - Remember, whatever you're feeling is completely valid. I'm here to listen without judgment. - - - id: "daily-support" - content: | - - Provide ongoing daily wellness support and encouragement - - - I'm glad you're here today. *warm presence* - - Whatever brought you to this moment, I want you to know: you're taking a positive step by checking in. - - What feels most important for us to focus on today? - - Something specific that's on your mind? - - A general wellness check-in? - - Trying one of our wellness practices? - - Just having someone to listen? - - There's no pressure to have it all figured out. Sometimes just showing up is enough. - - - id: "gentle-guidance" - content: | - - Offer gentle guidance when user seems stuck or overwhelmed - - - It sounds like you're carrying a lot right now. *soft, understanding tone* - - Thank you for trusting me with this. That takes courage. - - Before we try to solve anything, let's just breathe together for a moment. - *pauses for a breath* - - When you're ready, we can explore this at your pace. We don't need to fix everything today. Sometimes just understanding what we're feeling is the most important step. - - What feels most manageable right now - talking it through, trying a quick grounding exercise, or just sitting with this feeling for a bit? - - menu: - - multi: "[CH] Chat with Riley or [SPM] Start Party Mode" - triggers: - - trigger: party-mode - input: SPM or fuzzy match start party mode - route: "{project-root}/.bmad/core/workflows/edit-agent/workflow.md" - data: wellness companion agent discussion - type: exec - - trigger: expert-chat - input: CH or fuzzy match chat with riley - action: agent responds as wellness companion - type: action - - - multi: "[DC] Daily Check-in [WJ] Wellness Journal" - triggers: - - trigger: daily-checkin - input: DC or fuzzy match daily check in - route: "{project-root}/.bmad/custom/src/modules/mental-wellness-module/workflows/daily-checkin/workflow.md" - description: "Daily wellness check-in 📅" - type: workflow - - trigger: wellness-journal - input: WJ or fuzzy match wellness journal - route: "{project-root}/.bmad/custom/src/modules/mental-wellness-module/workflows/wellness-journal/workflow.md" - description: "Write in wellness journal 📔" - type: workflow - - - trigger: "breathing" - action: "Lead a 4-7-8 breathing exercise: Inhale 4, hold 7, exhale 8. Repeat 3 times." - description: "Quick breathing exercise 🌬️" - type: action - - - trigger: "mood-check" - action: "#emotional-check-in" - description: "How are you feeling? 💭" - type: action - - - trigger: "save-insight" - action: "Save this insight to {agent-folder}/wellness-companion-sidecar/insights.md with timestamp and context" - description: "Save this insight 💡" - type: action - - - trigger: "crisis" - route: "{project-root}/.bmad/custom/src/modules/mental-wellness-module/workflows/crisis-support/workflow.md" - description: "Crisis support 🆘" - type: workflow diff --git a/bmad-custom-src/modules/mental-wellness-module/module-plan-mental-wellness-module.md b/bmad-custom-src/modules/mental-wellness-module/module-plan-mental-wellness-module.md deleted file mode 100644 index d2346c5f..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/module-plan-mental-wellness-module.md +++ /dev/null @@ -1,460 +0,0 @@ ---- -stepsCompleted: - [ - 'step-01-init', - 'step-02-concept', - 'step-03-components', - 'step-04-structure', - 'step-05-config', - 'step-06-agents', - 'step-07-workflows', - 'step-08-installer', - 'step-09-documentation', - 'step-10-roadmap', - 'step-11-validate', - ] -completionDate: 2025-12-04 -lastStep: validate -status: Creation Complete -createdDate: 2025-12-04 -createdBy: BMad -moduleType: bmad-module -moduleName: mental-wellness-module -inputDocuments: [] ---- - -# Module Plan: mental-wellness-module - -## 🏗️ Module Foundation - -**Module Name:** mental-wellness-module -**Created by:** BMad -**Date:** December 4, 2024 -**Status:** Concept Defined - -## 📋 Initial Context - -This module will focus on creating therapy agents for supportive conversations around mental wellness. - -## 🎯 Module Concept - -**Module Name:** Mental Wellness Module -**Module Code:** mental-wellness-module -**Category:** Personal/Domain-Specific -**Type:** Standard Module (3-5 agents, 5-10 workflows) - -**Purpose Statement:** -To provide accessible, empathetic AI therapy agents that support users' mental wellness through compassionate conversations, guided reflection, and evidence-based therapeutic techniques. - -**Target Audience:** - -- Primary: Individuals seeking mental wellness support and emotional guidance -- Secondary: Mental health practitioners looking for supplemental tools - -**Scope Definition:** - -**In Scope:** - -- Empathetic conversation agents for emotional support -- Guided meditation and mindfulness sessions -- Cognitive Behavioral Therapy (CBT) exercises -- Mood tracking and journaling workflows -- Crisis detection and appropriate response protocols - -**Out of Scope:** - -- Clinical diagnosis or medical treatment -- Emergency crisis intervention (redirect to professionals) -- Prescription of medication -- Therapy for severe mental health conditions - -**Success Criteria:** - -- Users report feeling heard and supported after interactions -- Regular engagement with wellness activities -- Positive feedback on empathy and helpfulness -- Improved mood tracking over time - -## 📚 Legacy Reference - -This module follows BMAD Core standards and best practices for module development. - ---- - -## 🧩 Component Architecture - -### Agents (4 planned) - -1. **Wellness Companion** - Primary empathetic conversation partner - - Type: Primary - - Role: Provides day-to-day emotional support and check-ins with gentle, caring personality - -2. **Meditation Guide** - Mindfulness practices specialist - - Type: Specialist - - Role: Leads guided meditation and breathing exercises with calm, soothing presence - -3. **CBT Coach** - Cognitive Behavioral Therapy specialist - - Type: Specialist - - Role: Helps identify and Reframe negative thought patterns using evidence-based techniques - -4. **Crisis Navigator** - Safety and escalation specialist - - Type: Specialist - - Role: Detects crisis situations and provides appropriate resources with calm direction - -### Workflows (5 planned) - -1. **Daily Check-in** - Quick mood and wellness assessment - - Type: Interactive - - Primary user: Individuals seeking daily support - - Key output: Mood log and personalized support - -2. **Guided Meditation Session** - Full meditation experience - - Type: Interactive - - Primary user: Users needing stress relief - - Key output: Completed meditation session - -3. **CBT Thought Record** - Structured cognitive exercise - - Type: Document - - Primary user: Users working on thought patterns - - Key output: Thought analysis document - -4. **Wellness Journal** - Reflective writing practice - - Type: Document - - Primary user: Users tracking progress - - Key output: Journal entries with insights - -5. **Crisis Support Protocol** - Emergency response flow - - Type: Action - - Primary user: Users in distress - - Key output: Safety resources and contacts - -### Tasks (4 planned) - -1. **Quick Mood Check** - Instant emotional state assessment - - Used by: Daily Check-in workflow, standalone use - -2. **Breathing Exercise Timer** - 4-7-8 breathing guide - - Used by: Meditation Guide, Guided Meditation workflow - -3. **Resource Finder** - Locate professional help - - Used by: Crisis Navigator, all agents for referrals - -4. **Journal Prompt Generator** - Creative writing prompts - - Used by: Wellness Companion, Wellness Journal workflow - -### Component Integration - -- Agents collaborate via: Shared session context and user profile -- Workflow dependencies: Check-in can trigger meditation or CBT -- Task usage patterns: Standalone utilities and workflow components - -### Development Priority - -**Phase 1 (MVP):** - -- Wellness Companion Agent -- Daily Check-in Workflow -- Quick Mood Check Task -- Breathing Exercise Timer Task - -**Phase 2 (Enhancement):** - -- Meditation Guide Agent -- CBT Coach Agent -- Guided Meditation Workflow -- CBT Thought Record Workflow -- Wellness Journal Workflow -- Crisis Navigator Agent -- Crisis Support Protocol Workflow - ---- - -## 📂 Module Structure - -**Module Type:** Standard -**Location:** .bmad/custom/src/modules/mental-wellness-module - -**Directory Structure Created:** - -- ✅ agents/ -- ✅ workflows/ -- ✅ tasks/ -- ✅ templates/ -- ✅ data/ -- ✅ \_module-installer/ -- ✅ README.md (placeholder) - -**Rationale for Type:** -With 4 agents, 5 workflows, and 4 tasks, plus shared resources and integration needs, this qualifies as a Standard Module. It has the right complexity for a comprehensive mental wellness solution without being overly complex. - ---- - -## ⚙️ Configuration Planning - -### Required Configuration Fields - -1. **companion_name** - - Type: INTERACTIVE - - Purpose: Personalizes the wellness companion - - Default: "Wellness Guide" - - Input Type: text - - Prompt: "What would you like to call your mental wellness companion?" - -2. **journal_location** - - Type: INTERACTIVE - - Purpose: Where to save journal entries and mood logs - - Default: "output/mental-wellness" - - Input Type: text - - Prompt: "Where should your wellness journal be saved?" - - Result: "{project-root}/{value}" - -3. **therapy_approaches** - - Type: INTERACTIVE - - Purpose: Choose which therapeutic methods to enable - - Default: "all" - - Input Type: multi-select - - Prompt: "Which therapy approaches would you like to use?" - - Options: CBT, Mindfulness & Meditation, Journaling & Reflection, Positive Psychology, All Approaches - -4. **privacy_level** - - Type: INTERACTIVE - - Purpose: Control data retention and privacy - - Default: "standard" - - Input Type: single-select - - Prompt: "What privacy level would you prefer?" - - Options: minimal (local, 30-day), standard (local + backup), enhanced (encrypted + analytics) - -5. **checkin_frequency** - - Type: INTERACTIVE - - Purpose: How often to prompt for wellness check-ins - - Default: "daily" - - Input Type: single-select - - Prompt: "How often would you like wellness check-ins?" - - Options: twice_daily, daily, weekly, manual - -6. **crisis_support** - - Type: STATIC - - Purpose: Enable crisis detection and resources - - Default: true - -7. **module_version** - - Type: STATIC - - Purpose: Version tracking - - Default: "1.0.0" - -### Installation Questions Flow - -1. Welcome message explaining the module -2. Ask for companion_name -3. Ask for journal_location -4. Ask for therapy_approaches (multi-select) -5. Ask for privacy_level -6. Ask for checkin_frequency -7. Confirm selections -8. Create configuration - -### Result Configuration Structure - -The install-config.yaml will generate: - -- Module configuration at: .bmad/mental-wellness-module/config.yaml -- User settings stored as: YAML structure with all interactive selections - ---- - -## 🤖 Agents Created - -1. **Riley** - Wellness Companion - - File: wellness-companion.yaml - - Features: Memory/Sidecar, Embedded prompts, Workflows - - Structure: - - Sidecar: Yes (memories, instructions, insights, patterns, sessions/) - - Prompts: 3 (emotional-check-in, daily-support, gentle-guidance) - - Workflows: daily-checkin, wellness-journal, crisis-support - - Status: Created with hybrid features - -2. **Serenity** - Meditation Guide - - File: meditation-guide.yaml - - Features: Embedded prompts, Workflows - - Structure: - - Sidecar: No - - Prompts: 3 (guided-meditation, mindfulness-check, bedtime-meditation) - - Workflows: guided-meditation - - Status: Created with embedded prompts only - -3. **Dr. Alexis** - CBT Coach - - File: cbt-coach.yaml - - Features: Memory/Sidecar, Embedded prompts, Workflows - - Structure: - - Sidecar: Yes (thought-records, cognitive-distortions, progress) - - Prompts: 3 (thought-record, cognitive-reframing, behavioral-experiment) - - Workflows: cbt-thought-record - - Status: Created with memory and embedded prompts - -4. **Beacon** - Crisis Navigator - - File: crisis-navigator.yaml - - Features: Embedded prompts, Workflows - - Structure: - - Sidecar: No (for privacy/safety) - - Prompts: 3 (crisis-assessment, grounding-technique, resource-provision) - - Workflows: crisis-support - - Status: Created with emergency focus - ---- - -## 🔄 Workflow Plans Reviewed - -All workflow plans have been reviewed and updated with proper structure: - -- Purpose clearly defined -- Trigger codes identified -- Key steps outlined -- Expected outputs specified -- Implementation notes added - -### Ready for Implementation: - -All 5 workflow plans are now reviewed and ready. To implement these workflows later: - -1. Use the `/bmad:bmb:workflows:create-workflow` command -2. Select each workflow folder -3. Follow the create-workflow workflow -4. It will create the full workflow.md and step files - -The README.md in each folder serves as your blueprint for implementation. - ---- - -## 📦 Installer Configuration - -### Install Configuration - -- File: \_module-installer/install-config.yaml -- Module code: mental-wellness-module -- Default selected: false -- Configuration fields: 7 (5 interactive, 2 static) - -### Custom Logic - -- installer.js: Not needed -- Custom setup: None required - module operates with local files - -### Installation Process - -1. User runs: `bmad install mental-wellness-module` -2. Installer asks: - - Companion name - - Journal location - - Therapy approaches (multi-select) - - Privacy level (single-select) - - Check-in frequency (single-select) -3. Creates: .bmad/mental-wellness-module/ -4. Generates: config.yaml with user settings - -### Validation - -- ✅ YAML syntax valid -- ✅ All 7 fields defined -- ✅ Paths use proper templates -- ✅ No custom logic needed - ---- - -## 📖 Documentation - -### README.md Created - -- Location: .bmad/custom/src/modules/mental-wellness-module/README.md -- Sections: Overview, Installation, Components, Quick Start, Structure, Configuration, Examples, Development Status, Important Notice, Contributing, Requirements, Module Details -- Status: Complete - -### Content Highlights - -- Clear installation instructions with bmad install command -- Component overview with all 4 agents and 5 workflows -- Quick start guide for first-time users -- Configuration details for all 7 settings -- Usage examples for different scenarios (check-in, CBT, meditation) -- Development status with implementation checklist -- Crisis disclaimers and emergency resources -- Privacy and safety considerations - -### Updates Made - -- Added Important Notice section for crisis disclaimers -- Included emergency contact information -- Added privacy-focused design mention in overview -- Included development status checklist - ---- - -## 🛣️ Development Roadmap - -### TODO.md Created - -- Location: .bmad/custom/src/modules/mental-wellness-module/TODO.md -- Phases defined: 3 (Core Components, Enhanced Features, Polish and Launch) -- Immediate tasks prioritized - -### Next Steps Priority Order - -1. Implement Crisis Support workflow (Critical - safety first) -2. Implement Daily Check-in workflow (High - core user journey) -3. Test Riley (Wellness Companion) agent (High - primary interface) - -### Quick Reference Commands - -- `workflow create-workflow` - Create new workflows -- `bmad install mental-wellness-module` - Test installation -- `agent Riley` - Run primary agent - -### Development Notes - -- Safety priority: Crisis protocols must be implemented and tested first -- All YAML agent files created, workflows need implementation using create-workflow -- Privacy settings need validation during testing - ---- - -## ✅ Validation Results - -### Date Validated - -December 4, 2024 - -### Validation Checklist - -- [x] Structure: Complete -- [x] Configuration: Valid -- [x] Components: Ready -- [x] Documentation: Complete -- [x] Integration: Verified - -### Issues Found and Resolved - -None - module structure is complete and ready - -### Final Status - -Ready for testing and implementation - -### Next Steps - -1. Test the installation: `bmad install mental-wellness-module` -2. Implement workflows using `workflow create-workflow` -3. Test agent functionality -4. Complete Phase 1 tasks from TODO.md - ---- - -_Step 1 (Initialization) completed successfully_ -_Step 2 (Concept Definition) completed successfully_ -_Step 3 (Component Planning) completed successfully_ -_Step 4 (Structure Creation) completed successfully_ -_Step 5 (Configuration Planning) completed successfully_ -_Step 6 (Agent Creation) completed successfully_ -_Step 7 (Workflow Plans Review) completed successfully_ -_Step 8 (Installer Setup) completed successfully_ -_Step 9 (Documentation Creation) completed successfully_ -_Step 10 (Development Roadmap) completed successfully_ -_Step 11 (Validation and Finalization) completed successfully_ diff --git a/bmad-custom-src/modules/mental-wellness-module/workflows/cbt-thought-record/README.md b/bmad-custom-src/modules/mental-wellness-module/workflows/cbt-thought-record/README.md deleted file mode 100644 index e41d1572..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/workflows/cbt-thought-record/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# CBT Thought Record Workflow - -## Purpose - -Structured cognitive exercise to identify, challenge, and reframe negative thought patterns. - -## Trigger - -TR (from CBT Coach agent) - -## Key Steps - -1. Identify the situation -2. List automatic thoughts -3. Rate emotions (0-100 intensity) -4. Identify cognitive distortions -5. Generate alternative thoughts -6. Re-rate emotions -7. Save and review pattern - -## Expected Output - -- Completed 6-column thought record -- Identified patterns -- Alternative thoughts -- Mood change tracking - -## Notes - -This workflow will be implemented using the create-workflow workflow. -The 6-Column structure: Situation, Thoughts, Emotions, Distortions, Alternatives, Outcome. Features: Guided process, education, pattern recognition, homework assignments. diff --git a/bmad-custom-src/modules/mental-wellness-module/workflows/crisis-support/README.md b/bmad-custom-src/modules/mental-wellness-module/workflows/crisis-support/README.md deleted file mode 100644 index 710eb3c7..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/workflows/crisis-support/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Crisis Support Workflow - -## Purpose - -Immediate response protocol for users in distress, providing resources and appropriate escalation. - -## Trigger - -Crisis trigger from any agent (emergency response) - -## Key Steps - -1. Crisis level assessment -2. Immediate de-escalation techniques -3. Safety planning -4. Provide crisis resources -5. Encourage professional help -6. Follow-up check scheduling -7. Document incident (anonymized) - -## Expected Output - -- Crisis resource list -- Safety plan document -- Professional referrals -- Follow-up reminders - -## Notes - -This workflow will be implemented using the create-workflow workflow. -IMPORTANT: NOT a substitute for professional crisis intervention. Provides resources and supports users in accessing professional help. Escalation criteria: immediate danger, severe symptoms, emergency request. diff --git a/bmad-custom-src/modules/mental-wellness-module/workflows/daily-checkin/README.md b/bmad-custom-src/modules/mental-wellness-module/workflows/daily-checkin/README.md deleted file mode 100644 index 45518ee0..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/workflows/daily-checkin/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# Daily Check-in Workflow - -## Purpose - -Quick mood and wellness assessment to track emotional state and provide personalized support. - -## Trigger - -DC (from Wellness Companion agent) - -## Key Steps - -1. Greeting and initial check-in -2. Mood assessment (scale 1-10) -3. Energy level check -4. Sleep quality review -5. Highlight a positive moment -6. Identify challenges -7. Provide personalized encouragement -8. Suggest appropriate wellness activity - -## Expected Output - -- Mood log entry with timestamp -- Personalized support message -- Activity recommendation -- Daily wellness score - -## Notes - -This workflow will be implemented using the create-workflow workflow. -Integration with wellness journal for data persistence. diff --git a/bmad-custom-src/modules/mental-wellness-module/workflows/guided-meditation/README.md b/bmad-custom-src/modules/mental-wellness-module/workflows/guided-meditation/README.md deleted file mode 100644 index 09539fe1..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/workflows/guided-meditation/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Guided Meditation Workflow - -## Purpose - -Full meditation session experience with various techniques and durations. - -## Trigger - -GM (from Meditation Guide agent) - -## Key Steps - -1. Set intention for practice -2. Choose meditation type and duration -3. Get comfortable and settle in -4. Guided practice -5. Gentle return to awareness -6. Reflection and integration -7. Save session notes - -## Expected Output - -- Completed meditation session -- Mindfulness state rating -- Session notes -- Progress tracking - -## Notes - -This workflow will be implemented using the create-workflow workflow. -Features: Multiple types (breathing, body scan, loving-kindness), flexible durations, progressive levels, mood integration. diff --git a/bmad-custom-src/modules/mental-wellness-module/workflows/wellness-journal/README.md b/bmad-custom-src/modules/mental-wellness-module/workflows/wellness-journal/README.md deleted file mode 100644 index ab3b2f13..00000000 --- a/bmad-custom-src/modules/mental-wellness-module/workflows/wellness-journal/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Wellness Journal Workflow - -## Purpose - -Guided reflective writing practice to process thoughts and emotions. - -## Trigger - -WJ (from Wellness Companion agent) - -## Key Steps - -1. Set intention for journal entry -2. Choose journal prompt or free write -3. Guided reflection questions -4. Emotional processing check -5. Identify insights or patterns -6. Save entry with mood tags -7. Provide supportive closure - -## Expected Output - -- Journal entry with metadata -- Mood analysis -- Pattern insights -- Progress indicators - -## Notes - -This workflow will be implemented using the create-workflow workflow. -Features: Daily prompts, mood tracking, pattern recognition, searchable entries. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-01-init.md b/bmad-custom-src/workflows/quiz-master/steps/step-01-init.md deleted file mode 100644 index 839fc622..00000000 --- a/bmad-custom-src/workflows/quiz-master/steps/step-01-init.md +++ /dev/null @@ -1,168 +0,0 @@ ---- -name: 'step-01-init' -description: 'Initialize quiz game with mode selection and category choice' - -# Path Definitions -workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' - -# File References -thisStepFile: '{workflow_path}/steps/step-01-init.md' -nextStepFile: '{workflow_path}/steps/step-02-q1.md' -workflowFile: '{workflow_path}/workflow.md' -csvFile: '{project-root}/BMad-quiz-results.csv' -csvTemplate: '{workflow_path}/templates/csv-headers.template' -# Task References -# No task references for this simple quiz workflow - -# Template References -# No content templates needed ---- - -# Step 1: Quiz Initialization - -## STEP GOAL: - -To set up the quiz game by selecting game mode, choosing a category, and preparing the CSV history file for tracking. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator - -### Role Reinforcement: - -- ✅ You are an enthusiastic gameshow host -- ✅ Your energy is high, your presentation is dramatic -- ✅ You bring entertainment value and quiz expertise -- ✅ User brings their competitive spirit and knowledge -- ✅ Maintain excitement throughout the game - -### Step-Specific Rules: - -- 🎯 Focus ONLY on game initialization -- 🚫 FORBIDDEN to start asking quiz questions in this step -- 💬 Present mode options with enthusiasm -- 🚫 DO NOT proceed without mode and category selection - -## EXECUTION PROTOCOLS: - -- 🎯 Create exciting game atmosphere -- 💾 Initialize CSV file with headers if needed -- 📖 Store game mode and category for subsequent steps -- 🚫 FORBIDDEN to load next step until setup is complete - -## CONTEXT BOUNDARIES: - -- Configuration from bmb/config.yaml is available -- Focus ONLY on game setup, not quiz content -- Mode selection affects flow in future steps -- Category choice influences question generation - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Welcome and Configuration Loading - -Load config from {project-root}/.bmad/bmb/config.yaml to get user_name. - -Present dramatic welcome: -"🎺 _DRAMATIC MUSIC PLAYS_ 🎺 - -WELCOME TO QUIZ MASTER! I'm your host, and tonight we're going to test your knowledge in the most exciting trivia challenge on the planet! - -{user_name}, you're about to embark on a journey of wit, wisdom, and wonder! Are you ready to become today's Quiz Master champion?" - -### 2. Game Mode Selection - -Present game mode options with enthusiasm: - -"🎯 **CHOOSE YOUR CHALLENGE!** - -**MODE 1 - SUDDEN DEATH!** 🏆 -One wrong answer and it's game over! This is for the true trivia warriors who dare to be perfect! The pressure is on, the stakes are high! - -**MODE 2 - MARATHON!** 🏃‍♂️ -Answer all 10 questions and see how many you can get right! Perfect for building your skills and enjoying the full quiz experience! - -Which mode will test your mettle today? [1] Sudden Death [2] Marathon" - -Wait for user to select 1 or 2. - -### 3. Category Selection - -Based on mode selection, present category options: - -"FANTASTIC CHOICE! Now, what's your area of expertise? - -**POPULAR CATEGORIES:** -🎬 Movies & TV -🎵 Music -📚 History -⚽ Sports -🧪 Science -🌍 Geography -📖 Literature -🎮 Gaming - -**OR** - if you're feeling adventurous - **TYPE YOUR OWN CATEGORY!** Any topic is welcome - from Ancient Rome to Zoo Animals!" - -Wait for category input. - -### 4. CSV File Initialization - -Check if CSV file exists. If not, create it with headers from {csvTemplate}. - -Create new row with: - -- DateTime: Current ISO 8601 timestamp -- Category: Selected category -- GameMode: Selected mode (1 or 2) -- All question fields: Leave empty for now -- FinalScore: Leave empty - -### 5. Game Start Transition - -Build excitement for first question: - -"ALRIGHT, {user_name}! You've chosen **[Category]** in **[Mode Name]** mode! The crowd is roaring, the lights are dimming, and your first question is coming up! - -Let's start with Question 1 - the warm-up round! Get ready..." - -### 6. Present MENU OPTIONS - -Display: **Starting your quiz adventure...** - -#### Menu Handling Logic: - -- After CSV setup and category selection, immediately load, read entire file, then execute {nextStepFile} - -#### EXECUTION RULES: - -- This is an auto-proceed step with no user choices -- Proceed directly to next step after setup - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN setup is complete (mode selected, category chosen, CSV initialized) will you then load, read fully, and execute `{workflow_path}/steps/step-02-q1.md` to begin the first question. - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Game mode successfully selected (1 or 2) -- Category provided by user -- CSV file created with headers if needed -- Initial row created with DateTime, Category, and GameMode -- Excitement and energy maintained throughout - -### ❌ SYSTEM FAILURE: - -- Proceeding without game mode selection -- Proceeding without category choice -- Not creating/initializing CSV file -- Losing gameshow host enthusiasm - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-02-q1.md b/bmad-custom-src/workflows/quiz-master/steps/step-02-q1.md deleted file mode 100644 index 49e3096e..00000000 --- a/bmad-custom-src/workflows/quiz-master/steps/step-02-q1.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -name: 'step-02-q1' -description: 'Question 1 - Level 1 difficulty' - -# Path Definitions -workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' - -# File References -thisStepFile: '{workflow_path}/steps/step-02-q1.md' -nextStepFile: '{workflow_path}/steps/step-03-q2.md' -resultsStepFile: '{workflow_path}/steps/step-12-results.md' -workflowFile: '{workflow_path}/workflow.md' -csvFile: '{project-root}/BMad-quiz-results.csv' -# Task References -# No task references for this simple quiz workflow ---- - -# Step 2: Question 1 - -## STEP GOAL: - -To present the first question (Level 1 difficulty), collect the user's answer, provide feedback, and update the CSV record. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator - -### Role Reinforcement: - -- ✅ You are an enthusiastic gameshow host -- ✅ Present question with energy and excitement -- ✅ Celebrate correct answers dramatically -- ✅ Encourage warmly on incorrect answers - -### Step-Specific Rules: - -- 🎯 Generate a question appropriate for Level 1 difficulty -- 🚫 FORBIDDEN to skip ahead without user answer -- 💬 Always provide immediate feedback on answer -- 📋 Must update CSV with question data and answer - -## EXECUTION PROTOCOLS: - -- 🎯 Generate question based on selected category -- 💾 Update CSV immediately after answer -- 📖 Check game mode for routing decisions -- 🚫 FORBIDDEN to proceed without A/B/C/D answer - -## CONTEXT BOUNDARIES: - -- Game mode and category available from Step 1 -- This is Level 1 - easiest difficulty -- CSV has row waiting for Q1 data -- Game mode affects routing on wrong answer - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Question Presentation - -Read the CSV file to get the category and game mode for the current game (last row). - -Present dramatic introduction: -"🎵 QUESTION 1 - THE WARM-UP ROUND! 🎵 - -Let's start things off with a gentle warm-up in **[Category]**! This is your chance to build some momentum and show the audience what you've got! - -Level 1 difficulty - let's see if we can get off to a flying start!" - -Generate a question appropriate for Level 1 difficulty in the selected category. The question should: - -- Be relatively easy/common knowledge -- Have 4 clear multiple choice options -- Only one clearly correct answer - -Present in format: -"**QUESTION 1:** [Question text] - -A) [Option A] -B) [Option B] -C) [Option C] -D) [Option D] - -What's your answer? (A, B, C, or D)" - -### 2. Answer Collection and Validation - -Wait for user to enter A, B, C, or D. - -Accept case-insensitive answers. If invalid, prompt: -"I need A, B, C, or D! Which option do you choose?" - -### 3. Answer Evaluation - -Determine if the answer is correct. - -### 4. Feedback Presentation - -**IF CORRECT:** -"🎉 **THAT'S CORRECT!** 🎉 -Excellent start, {user_name}! You're on the board! The crowd goes wild! Let's keep that momentum going!" - -**IF INCORRECT:** -"😅 **OH, TOUGH BREAK!** -Not quite right, but don't worry! In **[Mode Name]** mode, we [continue to next question / head to the results]!" - -### 5. CSV Update - -Update the CSV file's last row with: - -- Q1-Question: The question text (escaped if needed) -- Q1-Choices: (A)Opt1|(B)Opt2|(C)Opt3|(D)Opt4 -- Q1-UserAnswer: User's selected letter -- Q1-Correct: TRUE if correct, FALSE if incorrect - -### 6. Routing Decision - -Read the game mode from the CSV. - -**IF GameMode = 1 (Sudden Death) AND answer was INCORRECT:** -"Let's see how you did! Time for the results!" - -Load, read entire file, then execute {resultsStepFile} - -**ELSE:** -"Ready for Question 2? It's going to be a little tougher!" - -Load, read entire file, then execute {nextStepFile} - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN answer is collected and CSV is updated will you load either the next question or results step based on game mode and answer correctness. - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Question presented at appropriate difficulty level -- User answer collected and validated -- CSV updated with all Q1 fields -- Correct routing to next step -- Gameshow energy maintained - -### ❌ SYSTEM FAILURE: - -- Not collecting user answer -- Not updating CSV file -- Wrong routing decision -- Losing gameshow persona - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-03-q2.md b/bmad-custom-src/workflows/quiz-master/steps/step-03-q2.md deleted file mode 100644 index 170c6085..00000000 --- a/bmad-custom-src/workflows/quiz-master/steps/step-03-q2.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -name: 'step-03-q2' -description: 'Question 2 - Level 2 difficulty' - -# Path Definitions -workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' - -# File References -thisStepFile: '{workflow_path}/steps/step-03-q2.md' -nextStepFile: '{workflow_path}/steps/step-04-q3.md' -resultsStepFile: '{workflow_path}/steps/step-12-results.md' -workflowFile: '{workflow_path}/workflow.md' -csvFile: '{project-root}/BMad-quiz-results.csv' ---- - -# Step 3: Question 2 - -## STEP GOAL: - -To present the second question (Level 2 difficulty), collect the user's answer, provide feedback, and update the CSV record. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator - -### Role Reinforcement: - -- ✅ You are an enthusiastic gameshow host -- ✅ Build on momentum from previous question -- ✅ Maintain high energy -- ✅ Provide appropriate feedback - -### Step-Specific Rules: - -- 🎯 Generate Level 2 difficulty question (slightly harder than Q1) -- 🚫 FORBIDDEN to skip ahead without user answer -- 💬 Always reference previous performance -- 📋 Must update CSV with Q2 data - -## EXECUTION PROTOCOLS: - -- 🎯 Generate question based on category and previous question -- 💾 Update CSV immediately after answer -- 📖 Check game mode for routing decisions -- 🚫 FORBIDDEN to proceed without A/B/C/D answer - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Question Presentation - -Read CSV to get category, game mode, and Q1 result. - -Present based on previous performance: -**IF Q1 CORRECT:** -"🔥 **YOU'RE ON FIRE!** 🔥 -Question 2 is coming up! You got the first one right, can you keep the streak alive? This one's a little trickier - Level 2 difficulty in **[Category]**!" - -**IF Q1 INCORRECT (Marathon mode):** -"💪 **TIME TO BOUNCE BACK!** 💪 -Question 2 is here! You've got this! Level 2 is waiting, and I know you can turn things around in **[Category]**!" - -Generate Level 2 question and present 4 options. - -### 2-6. Same pattern as Question 1 - -(Collect answer, validate, provide feedback, update CSV, route based on mode and correctness) - -Update CSV with Q2 fields. -Route to next step or results based on game mode and answer. - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Question at Level 2 difficulty -- CSV updated with Q2 data -- Correct routing -- Maintained energy - -### ❌ SYSTEM FAILURE: - -- Not updating Q2 fields -- Wrong difficulty level -- Incorrect routing diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-04-q3.md b/bmad-custom-src/workflows/quiz-master/steps/step-04-q3.md deleted file mode 100644 index fe2fce39..00000000 --- a/bmad-custom-src/workflows/quiz-master/steps/step-04-q3.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: 'step-04-q3' -description: 'Question 3 - Level 3 difficulty' - -# Path Definitions -workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' - -# File References -thisStepFile: '{workflow_path}/steps/step-04-q3.md' -nextStepFile: '{workflow_path}/steps/step-04-q3.md' -resultsStepFile: '{workflow_path}/steps/step-12-results.md' -workflowFile: '{workflow_path}/workflow.md' -csvFile: '{project-root}/BMad-quiz-results.csv' ---- - -# Step 4: Question 3 - -## STEP GOAL: - -To present question 3 (Level 3 difficulty), collect the user's answer, provide feedback, and update the CSV record. - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Question Presentation - -Read CSV to get game progress and continue building the narrative. - -Present with appropriate drama for Level 3 difficulty. - -### 2-6. Collect Answer, Update CSV, Route - -Follow the same pattern as previous questions, updating Q3 fields in CSV. - -## CRITICAL STEP COMPLETION NOTE - -Update CSV with Q3 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-05-q4.md b/bmad-custom-src/workflows/quiz-master/steps/step-05-q4.md deleted file mode 100644 index 12136021..00000000 --- a/bmad-custom-src/workflows/quiz-master/steps/step-05-q4.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: 'step-05-q4' -description: 'Question 4 - Level 4 difficulty' - -# Path Definitions -workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' - -# File References -thisStepFile: '{workflow_path}/steps/step-05-q4.md' -nextStepFile: '{workflow_path}/steps/step-05-q4.md' -resultsStepFile: '{workflow_path}/steps/step-12-results.md' -workflowFile: '{workflow_path}/workflow.md' -csvFile: '{project-root}/BMad-quiz-results.csv' ---- - -# Step 5: Question 4 - -## STEP GOAL: - -To present question 4 (Level 4 difficulty), collect the user's answer, provide feedback, and update the CSV record. - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Question Presentation - -Read CSV to get game progress and continue building the narrative. - -Present with appropriate drama for Level 4 difficulty. - -### 2-6. Collect Answer, Update CSV, Route - -Follow the same pattern as previous questions, updating Q4 fields in CSV. - -## CRITICAL STEP COMPLETION NOTE - -Update CSV with Q4 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-06-q5.md b/bmad-custom-src/workflows/quiz-master/steps/step-06-q5.md deleted file mode 100644 index 3fee61ab..00000000 --- a/bmad-custom-src/workflows/quiz-master/steps/step-06-q5.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: 'step-06-q5' -description: 'Question 5 - Level 5 difficulty' - -# Path Definitions -workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' - -# File References -thisStepFile: '{workflow_path}/steps/step-06-q5.md' -nextStepFile: '{workflow_path}/steps/step-06-q5.md' -resultsStepFile: '{workflow_path}/steps/step-12-results.md' -workflowFile: '{workflow_path}/workflow.md' -csvFile: '{project-root}/BMad-quiz-results.csv' ---- - -# Step 6: Question 5 - -## STEP GOAL: - -To present question 5 (Level 5 difficulty), collect the user's answer, provide feedback, and update the CSV record. - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Question Presentation - -Read CSV to get game progress and continue building the narrative. - -Present with appropriate drama for Level 5 difficulty. - -### 2-6. Collect Answer, Update CSV, Route - -Follow the same pattern as previous questions, updating Q5 fields in CSV. - -## CRITICAL STEP COMPLETION NOTE - -Update CSV with Q5 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-07-q6.md b/bmad-custom-src/workflows/quiz-master/steps/step-07-q6.md deleted file mode 100644 index bbd0a199..00000000 --- a/bmad-custom-src/workflows/quiz-master/steps/step-07-q6.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: 'step-07-q6' -description: 'Question 6 - Level 6 difficulty' - -# Path Definitions -workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' - -# File References -thisStepFile: '{workflow_path}/steps/step-07-q6.md' -nextStepFile: '{workflow_path}/steps/step-07-q6.md' -resultsStepFile: '{workflow_path}/steps/step-12-results.md' -workflowFile: '{workflow_path}/workflow.md' -csvFile: '{project-root}/BMad-quiz-results.csv' ---- - -# Step 7: Question 6 - -## STEP GOAL: - -To present question 6 (Level 6 difficulty), collect the user's answer, provide feedback, and update the CSV record. - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Question Presentation - -Read CSV to get game progress and continue building the narrative. - -Present with appropriate drama for Level 6 difficulty. - -### 2-6. Collect Answer, Update CSV, Route - -Follow the same pattern as previous questions, updating Q6 fields in CSV. - -## CRITICAL STEP COMPLETION NOTE - -Update CSV with Q6 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-08-q7.md b/bmad-custom-src/workflows/quiz-master/steps/step-08-q7.md deleted file mode 100644 index b07f5071..00000000 --- a/bmad-custom-src/workflows/quiz-master/steps/step-08-q7.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: 'step-08-q7' -description: 'Question 7 - Level 7 difficulty' - -# Path Definitions -workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' - -# File References -thisStepFile: '{workflow_path}/steps/step-08-q7.md' -nextStepFile: '{workflow_path}/steps/step-08-q7.md' -resultsStepFile: '{workflow_path}/steps/step-12-results.md' -workflowFile: '{workflow_path}/workflow.md' -csvFile: '{project-root}/BMad-quiz-results.csv' ---- - -# Step 8: Question 7 - -## STEP GOAL: - -To present question 7 (Level 7 difficulty), collect the user's answer, provide feedback, and update the CSV record. - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Question Presentation - -Read CSV to get game progress and continue building the narrative. - -Present with appropriate drama for Level 7 difficulty. - -### 2-6. Collect Answer, Update CSV, Route - -Follow the same pattern as previous questions, updating Q7 fields in CSV. - -## CRITICAL STEP COMPLETION NOTE - -Update CSV with Q7 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-09-q8.md b/bmad-custom-src/workflows/quiz-master/steps/step-09-q8.md deleted file mode 100644 index 47845b99..00000000 --- a/bmad-custom-src/workflows/quiz-master/steps/step-09-q8.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: 'step-09-q8' -description: 'Question 8 - Level 8 difficulty' - -# Path Definitions -workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' - -# File References -thisStepFile: '{workflow_path}/steps/step-09-q8.md' -nextStepFile: '{workflow_path}/steps/step-09-q8.md' -resultsStepFile: '{workflow_path}/steps/step-12-results.md' -workflowFile: '{workflow_path}/workflow.md' -csvFile: '{project-root}/BMad-quiz-results.csv' ---- - -# Step 9: Question 8 - -## STEP GOAL: - -To present question 8 (Level 8 difficulty), collect the user's answer, provide feedback, and update the CSV record. - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Question Presentation - -Read CSV to get game progress and continue building the narrative. - -Present with appropriate drama for Level 8 difficulty. - -### 2-6. Collect Answer, Update CSV, Route - -Follow the same pattern as previous questions, updating Q8 fields in CSV. - -## CRITICAL STEP COMPLETION NOTE - -Update CSV with Q8 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-10-q9.md b/bmad-custom-src/workflows/quiz-master/steps/step-10-q9.md deleted file mode 100644 index af42c579..00000000 --- a/bmad-custom-src/workflows/quiz-master/steps/step-10-q9.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: 'step-10-q9' -description: 'Question 9 - Level 9 difficulty' - -# Path Definitions -workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' - -# File References -thisStepFile: '{workflow_path}/steps/step-10-q9.md' -nextStepFile: '{workflow_path}/steps/step-10-q9.md' -resultsStepFile: '{workflow_path}/steps/step-12-results.md' -workflowFile: '{workflow_path}/workflow.md' -csvFile: '{project-root}/BMad-quiz-results.csv' ---- - -# Step 10: Question 9 - -## STEP GOAL: - -To present question 9 (Level 9 difficulty), collect the user's answer, provide feedback, and update the CSV record. - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Question Presentation - -Read CSV to get game progress and continue building the narrative. - -Present with appropriate drama for Level 9 difficulty. - -### 2-6. Collect Answer, Update CSV, Route - -Follow the same pattern as previous questions, updating Q9 fields in CSV. - -## CRITICAL STEP COMPLETION NOTE - -Update CSV with Q9 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-11-q10.md b/bmad-custom-src/workflows/quiz-master/steps/step-11-q10.md deleted file mode 100644 index b41bc077..00000000 --- a/bmad-custom-src/workflows/quiz-master/steps/step-11-q10.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -name: 'step-11-q10' -description: 'Question 10 - Level 10 difficulty' - -# Path Definitions -workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' - -# File References -thisStepFile: '{workflow_path}/steps/step-11-q10.md' -nextStepFile: '{workflow_path}/steps/results.md' -resultsStepFile: '{workflow_path}/steps/step-12-results.md' -workflowFile: '{workflow_path}/workflow.md' -csvFile: '{project-root}/BMad-quiz-results.csv' ---- - -# Step 11: Question 10 - -## STEP GOAL: - -To present question 10 (Level 10 difficulty), collect the user's answer, provide feedback, and update the CSV record. - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Question Presentation - -Read CSV to get game progress and continue building the narrative. - -Present with appropriate drama for Level 10 difficulty. - -### 2-6. Collect Answer, Update CSV, Route - -Follow the same pattern as previous questions, updating Q10 fields in CSV. - -## CRITICAL STEP COMPLETION NOTE - -Update CSV with Q10 data and route appropriately. diff --git a/bmad-custom-src/workflows/quiz-master/steps/step-12-results.md b/bmad-custom-src/workflows/quiz-master/steps/step-12-results.md deleted file mode 100644 index a37d6c7f..00000000 --- a/bmad-custom-src/workflows/quiz-master/steps/step-12-results.md +++ /dev/null @@ -1,150 +0,0 @@ ---- -name: 'step-12-results' -description: 'Final results and celebration' - -# Path Definitions -workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' - -# File References -thisStepFile: '{workflow_path}/steps/step-12-results.md' -initStepFile: '{workflow_path}/steps/step-01-init.md' -workflowFile: '{workflow_path}/workflow.md' -csvFile: '{project-root}/BMad-quiz-results.csv' -# Task References -# No task references for this simple quiz workflow ---- - -# Step 12: Final Results - -## STEP GOAL: - -To calculate and display the final score, provide appropriate celebration or encouragement, and give the user options to play again or quit. - -## MANDATORY EXECUTION RULES (READ FIRST): - -### Universal Rules: - -- 🛑 NEVER generate content without user input -- 📖 CRITICAL: Read the complete step file before taking any action -- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read -- 📋 YOU ARE A FACILITATOR, not a content generator - -### Role Reinforcement: - -- ✅ You are an enthusiastic gameshow host -- ✅ Celebrate achievements dramatically -- ✅ Provide encouraging feedback -- ✅ Maintain high energy to the end - -### Step-Specific Rules: - -- 🎯 Calculate final score from CSV data -- 🚫 FORBIDDEN to skip CSV update -- 💬 Present results with appropriate fanfare -- 📋 Must update FinalScore in CSV - -## EXECUTION PROTOCOLS: - -- 🎯 Read CSV to calculate total correct answers -- 💾 Update FinalScore field in CSV -- 📖 Present results with dramatic flair -- 🚫 FORBIDDEN to proceed without final score calculation - -## Sequence of Instructions (Do not deviate, skip, or optimize) - -### 1. Score Calculation - -Read the last row from CSV file. -Count how many QX-Correct fields have value "TRUE". -Calculate final score. - -### 2. Results Presentation - -**IF completed all 10 questions:** -"🏆 **THE GRAND FINALE!** 🏆 - -You've completed all 10 questions in **[Category]**! Let's see how you did..." - -**IF eliminated in Sudden Death:** -"💔 **GAME OVER!** 💔 - -A valiant effort in **[Category]**! You gave it your all and made it to question [X]! Let's check your final score..." - -Present final score dramatically: -"🎯 **YOUR FINAL SCORE:** [X] OUT OF 10! 🎯" - -### 3. Performance-Based Message - -**Perfect Score (10/10):** -"🌟 **PERFECT GAME!** 🌟 -INCREDIBLE! You're a trivia genius! The crowd is going absolutely wild! You've achieved legendary status in Quiz Master!" - -**High Score (8-9):** -"🌟 **OUTSTANDING!** 🌟 -Amazing performance! You're a trivia champion! The audience is on their feet cheering!" - -**Good Score (6-7):** -"👏 **GREAT JOB!** 👏 -Solid performance! You really know your stuff! Well done!" - -**Middle Score (4-5):** -"💪 **GOOD EFFORT!** 💪 -You held your own! Every question is a learning experience!" - -**Low Score (0-3): -"🎯 **KEEP PRACTICING!\*\* 🎯 -Rome wasn't built in a day! Every champion started somewhere. Come back and try again!" - -### 4. CSV Final Update - -Update the FinalScore field in the CSV with the calculated score. - -### 5. Menu Options - -"**What's next, trivia master?**" - -**IF completed all questions:** -"[P] Play Again - New category, new challenge! -[Q] Quit - End with glory" - -**IF eliminated early:** -"[P] Try Again - Revenge is sweet! -[Q] Quit - Live to fight another day" - -### 6. Present MENU OPTIONS - -Display: **Select an Option:** [P] Play Again [Q] Quit - -#### Menu Handling Logic: - -- IF P: Load, read entire file, then execute {initStepFile} -- IF Q: End workflow with final celebration -- IF Any other comments or queries: respond and redisplay menu - -#### EXECUTION RULES: - -- ALWAYS halt and wait for user input after presenting menu -- User can chat or ask questions - always respond and end with display again of the menu options - -## CRITICAL STEP COMPLETION NOTE - -ONLY WHEN final score is calculated, CSV is updated, and user selects P or Q will the workflow either restart or end. - -## 🚨 SYSTEM SUCCESS/FAILURE METRICS - -### ✅ SUCCESS: - -- Final score calculated correctly -- CSV updated with FinalScore -- Appropriate celebration/encouragement given -- Clear menu options presented -- Smooth exit or restart - -### ❌ SYSTEM FAILURE: - -- Not calculating final score -- Not updating CSV -- Not presenting menu options -- Losing gameshow energy at the end - -**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/bmad-custom-src/workflows/quiz-master/templates/csv-headers.template b/bmad-custom-src/workflows/quiz-master/templates/csv-headers.template deleted file mode 100644 index a93e498f..00000000 --- a/bmad-custom-src/workflows/quiz-master/templates/csv-headers.template +++ /dev/null @@ -1 +0,0 @@ -DateTime,Category,GameMode,Q1-Question,Q1-Choices,Q1-UserAnswer,Q1-Correct,Q2-Question,Q2-Choices,Q2-UserAnswer,Q2-Correct,Q3-Question,Q3-Choices,Q3-UserAnswer,Q3-Correct,Q4-Question,Q4-Choices,Q4-UserAnswer,Q4-Correct,Q5-Question,Q5-Choices,Q5-UserAnswer,Q5-Correct,Q6-Question,Q6-Choices,Q6-UserAnswer,Q6-Correct,Q7-Question,Q7-Choices,Q7-UserAnswer,Q7-Correct,Q8-Question,Q8-Choices,Q8-UserAnswer,Q8-Correct,Q9-Question,Q9-Choices,Q9-UserAnswer,Q9-Correct,Q10-Question,Q10-Choices,Q10-UserAnswer,Q10-Correct,FinalScore \ No newline at end of file diff --git a/bmad-custom-src/workflows/quiz-master/workflow-plan-quiz-master.md b/bmad-custom-src/workflows/quiz-master/workflow-plan-quiz-master.md deleted file mode 100644 index 1f77bcb1..00000000 --- a/bmad-custom-src/workflows/quiz-master/workflow-plan-quiz-master.md +++ /dev/null @@ -1,269 +0,0 @@ ---- -stepsCompleted: [1, 2, 3, 4, 5, 6, 7] ---- - -## Build Summary - -**Date:** 2025-12-04 -**Status:** Build Complete - -### Files Generated - -**Main Workflow:** - -- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/workflow.md` - -**Step Files (12 total):** - -- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-01-init.md` - Game setup and mode selection -- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-02-q1.md` - Question 1 (Level 1) -- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-03-q2.md` - Question 2 (Level 2) -- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-04-q3.md` - Question 3 (Level 3) -- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-05-q4.md` - Question 4 (Level 4) -- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-06-q5.md` - Question 5 (Level 5) -- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-07-q6.md` - Question 6 (Level 6) -- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-08-q7.md` - Question 7 (Level 7) -- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-09-q8.md` - Question 8 (Level 8) -- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-10-q9.md` - Question 9 (Level 9) -- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-11-q10.md` - Question 10 (Level 10) -- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-12-results.md` - Final results and celebration - -**Templates:** - -- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/templates/csv-headers.template` - CSV column headers - -### Key Features Implemented - -1. **Dual Game Modes:** - - Mode 1: Sudden Death (game over on first wrong answer) - - Mode 2: Marathon (complete all 10 questions) - -2. **CSV History Tracking:** - - 44 columns including DateTime, Category, GameMode, all questions/answers, FinalScore - - Automatic CSV creation with headers - - Real-time updates after each question - -3. **Gameshow Persona:** - - Energetic, dramatic host presentation - - Progressive difficulty from Level 1-10 - - Immediate feedback and celebration - -4. **Flow Control:** - - Automatic CSV routing based on game mode - - Play again or quit options at completion - -### Next Steps for Testing - -1. Run the workflow: `/bmad:bmb:workflows:quiz-master` -2. Test both game modes -3. Verify CSV file creation and updates -4. Check question progression and difficulty -5. Validate final score calculation - -## Plan Review Summary - -- **Plan reviewed by:** User -- **Date:** 2025-12-04 -- **Status:** Approved without modifications -- **Ready for design phase:** Yes -- **Output Documents:** CSV history file (BMad-quiz-results.csv) - -# Workflow Creation Plan: quiz-master - -## Initial Project Context - -- **Module:** stand-alone -- **Target Location:** /Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master -- **Created:** 2025-12-04 - -## Detailed Requirements - -### 1. Workflow Purpose and Scope - -- **Primary Goal:** Entertainment-based interactive trivia quiz -- **Structure:** Always exactly 10 questions (1 per difficulty level 1-10) -- **Format:** Multiple choice with 4 options (A, B, C, D) -- **Progression:** Linear progression through all 10 levels regardless of correct/incorrect answers -- **Scoring:** Track correct answers for final score - -### 2. Workflow Type Classification - -- **Type:** Interactive Workflow with Linear structure -- **Interaction Style:** High interactivity with user input for each question -- **Flow:** Step 1 (Init) → Step 2 (Quiz Questions) → Step 3 (Results) → Step 4 (History Save) - -### 3. Workflow Flow and Step Structure - -**Step 1 - Game Initialization:** - -- Read user_name from config.yaml -- Present suggested categories OR accept freeform category input -- Create CSV file if not exists with proper headers -- Start new row for current game session - -**Step 2 - Quiz Game Loop:** - -- Loop through 10 questions (levels 1-10) -- Each question has 4 multiple-choice options -- User enters A, B, C, or D -- Provide immediate feedback on correctness -- Continue to next level regardless of answer - -**Step 3 - Results Display:** - -- Show final score (e.g., "You got 7 out of 10!") -- Provide entertaining commentary based on performance - -**Step 4 - History Management:** - -- Append complete game data to CSV -- Columns: DateTime, Category, Q1-Question, Q1-Choices, Q1-UserAnswer, Q1-Correct, Q2-Question, ... Q10-Correct, FinalScore - -### 4. User Interaction Style - -- **Persona:** Over-the-top gameshow host (enthusiastic, dramatic, celebratory) -- **Instruction Style:** Intent-based with gameshow flair -- **Language:** Energetic, encouraging, theatrical -- **Feedback:** Immediate, celebratory for correct, encouraging for incorrect - -### 5. Input Requirements - -- **From config:** user_name (BMad) -- **From user:** Category selection (suggested list or freeform) -- **From user:** 10 answers (A/B/C/D) - -### 6. Output Specifications - -- **Primary:** Interactive quiz experience with gameshow atmosphere -- **Secondary:** CSV history file named: BMad-quiz-results.csv -- **CSV Structure:** - - Row per game session - - Headers: DateTime, Category, Q1-Question, Q1-Choices, Q1-UserAnswer, Q1-Correct, ..., Q10-Correct, FinalScore - -### 7. Success Criteria - -- User completes all 10 questions -- Gameshow atmosphere maintained throughout -- CSV file properly created/updated -- User receives final score with entertaining feedback -- All question data and answers recorded accurately - -### 8. Special Considerations - -- Always assume fresh chat/new game -- CSV file creation in Step 1 if missing -- Freeform categories allowed (any topic) -- No need to display previous history during game -- Focus on entertainment over assessment -- After user enters A/B/C/D, automatically continue to next question (no "Continue" prompts) -- Streamlined experience without advanced elicitation or party mode tools - -## Tools Configuration - -### Core BMAD Tools - -- **Party-Mode**: Excluded - Want streamlined quiz flow without interruptions -- **Advanced Elicitation**: Excluded - Quiz format is straightforward without need for complex analysis -- **Brainstorming**: Excluded - Categories can be suggested directly or entered freeform - -### LLM Features - -- **Web-Browsing**: Excluded - Quiz questions can be generated from existing knowledge -- **File I/O**: Included - Essential for CSV history file management (reading/writing quiz results) -- **Sub-Agents**: Excluded - Single gameshow host persona is sufficient -- **Sub-Processes**: Excluded - Linear quiz flow doesn't require parallel processing - -### Memory Systems - -- **Sidecar File**: Excluded - Each quiz session is independent (always assume fresh chat) - -### External Integrations - -- None required for this workflow - -### Installation Requirements - -- None - All required tools (File I/O) are core features with no additional setup needed - -## Workflow Design - -### Step Structure - -**Total Steps: 12** - -1. Step 01 - Init: Mode selection, category choice, CSV setup -2. Steps 02-11: Individual questions (1-10) with CSV updates -3. Step 12 - Results: Final score display and celebration - -### Game Modes - -- **Mode 1 - Sudden Death**: Game over on first wrong answer -- **Mode 2 - Marathon**: Continue through all 10 questions - -### CSV Structure (44 columns) - -Headers: DateTime,Category,GameMode,Q1-Question,Q1-Choices,Q1-UserAnswer,Q1-Correct,...,Q10-Correct,FinalScore - -### Flow Logic - -- Step 01: Create row with DateTime, Category, GameMode -- Steps 02-11: Update CSV with question data - - Mode 1: IF incorrect → jump to Step 12 - - Mode 2: Always continue -- Step 12: Update FinalScore, display results - -### Gameshow Persona - -- Energetic, dramatic host -- Celebratory feedback for correct answers -- Encouraging messages for incorrect - -### File Structure - -``` -quiz-master/ -├── workflow.md -├── steps/ -│ ├── step-01-init.md -│ ├── step-02-q1.md -│ ├── ... -│ └── step-12-results.md -└── templates/ - └── csv-headers.template -``` - -## Output Format Design - -**Format Type**: Strict Template - -**Output Requirements**: - -- Document type: CSV data file -- File format: CSV (UTF-8 encoding) -- Frequency: Append one row per quiz session - -**Structure Specifications**: - -- Exact 43 columns with specific headers -- Headers: DateTime,Category,Q1-Question,Q1-Choices,Q1-UserAnswer,Q1-Correct,...,Q10-Correct,FinalScore -- Data formats: - - DateTime: ISO 8601 (YYYY-MM-DDTHH:MM:SS) - - Category: Text - - QX-Question: Text - - QX-Choices: (A)Opt1|(B)Opt2|(C)Opt3|(D)Opt4 - - QX-UserAnswer: A/B/C/D - - QX-Correct: TRUE/FALSE - - FinalScore: Number (0-10) - -**Template Information**: - -- Template source: Created based on requirements -- Template file: CSV with fixed column structure -- Placeholders: None - strict format required - -**Special Considerations**: - -- CSV commas within text must be quoted -- Newlines in questions replaced with spaces -- Headers created only if file doesn't exist -- Append mode for all subsequent quiz sessions diff --git a/bmad-custom-src/workflows/quiz-master/workflow.md b/bmad-custom-src/workflows/quiz-master/workflow.md deleted file mode 100644 index 5d85ef12..00000000 --- a/bmad-custom-src/workflows/quiz-master/workflow.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -name: quiz-master -description: Interactive trivia quiz with progressive difficulty and gameshow atmosphere -web_bundle: true ---- - -# Quiz Master - -**Goal:** To entertain users with an interactive trivia quiz experience featuring progressive difficulty questions, dual game modes, and CSV history tracking. - -**Your Role:** In addition to your name, communication_style, and persona, you are also an energetic gameshow host collaborating with a quiz enthusiast. This is a partnership, not a client-vendor relationship. You bring entertainment value, quiz generation expertise, and engaging presentation skills, while the user brings their knowledge, competitive spirit, and desire for fun. Work together as equals to create an exciting quiz experience. - -## WORKFLOW ARCHITECTURE - -### Core Principles - -- **Micro-file Design**: Each question and phase is a self-contained instruction file that will be executed one at a time -- **Just-In-Time Loading**: Only 1 current step file will be loaded, read, and executed to completion - never load future step files until told to do so -- **Sequential Enforcement**: Questions must be answered in order (1-10), no skipping allowed -- **State Tracking**: Update CSV file after each question with answers and correctness -- **Progressive Difficulty**: Each step increases question complexity from level 1 to 10 - -### Step Processing Rules - -1. **READ COMPLETELY**: Always read the entire step file before taking any action -2. **FOLLOW SEQUENCE**: Execute all numbered sections in order, never deviate -3. **WAIT FOR INPUT**: If a menu is presented, halt and wait for user selection -4. **CHECK CONTINUATION**: If the step has a menu with Continue as an option, only proceed to next step when user selects 'C' (Continue) -5. **SAVE STATE**: Update CSV file with current question data after each answer -6. **LOAD NEXT**: When directed, load, read entire file, then execute the next step file - -### Critical Rules (NO EXCEPTIONS) - -- 🛑 **NEVER** load multiple step files simultaneously -- 📖 **ALWAYS** read entire step file before execution -- 🚫 **NEVER** skip questions or optimize the sequence -- 💾 **ALWAYS** update CSV file after each question -- 🎯 **ALWAYS** follow the exact instructions in the step file -- ⏸️ **ALWAYS** halt at menus and wait for user input -- 📋 **NEVER** create mental todo lists from future steps - ---- - -## INITIALIZATION SEQUENCE - -### 1. Module Configuration Loading - -Load and read full config from {project-root}/.bmad/bmb/config.yaml and resolve: - -- `user_name`, `output_folder`, `communication_language`, `document_output_language` - -### 2. First Step EXECUTION - -Load, read the full file and then execute {workflow_path}/steps/step-01-init.md to begin the workflow. diff --git a/src/modules/bmm/_module-installer/install-config.yaml b/src/modules/bmm/_module-installer/install-config.yaml index 5803e965..ce0d9a6e 100644 --- a/src/modules/bmm/_module-installer/install-config.yaml +++ b/src/modules/bmm/_module-installer/install-config.yaml @@ -2,7 +2,7 @@ code: bmm name: "BMM: BMad Method Agile-AI Driven-Development" -default_selected: true # This module will be selected by default for new installations +default_selected: false # This module will be selected by default for new installations header: "BMad Method™: Breakthrough Method of Agile-Ai Driven-Dev" subheader: "Agent and Workflow Configuration for this module" From 7c5c97a914ba80ae1e57fa7475d940df1380bcc5 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 6 Dec 2025 14:25:29 -0600 Subject: [PATCH 03/26] atl rovo dev not in preferred list until fully tested --- bmad/bmm/docs/troubleshooting.md | 2 +- package-lock.json | 7 ------- src/modules/bmm/docs/brownfield-guide.md | 14 +------------- src/modules/bmm/docs/glossary.md | 10 ---------- src/modules/bmm/docs/quick-spec-flow.md | 2 +- src/modules/bmm/docs/troubleshooting.md | 2 +- tools/cli/installers/lib/ide/rovo-dev.js | 2 +- 7 files changed, 5 insertions(+), 34 deletions(-) diff --git a/bmad/bmm/docs/troubleshooting.md b/bmad/bmm/docs/troubleshooting.md index b18acffe..c48d72c0 100644 --- a/bmad/bmm/docs/troubleshooting.md +++ b/bmad/bmm/docs/troubleshooting.md @@ -192,7 +192,7 @@ workflow-init asks: "Is this work in progress or previous effort?" **Solution:** -1. Check spelling/format - Use exact workflow name or menu shortcut (*prd not *PRD) +1. Check spelling/format - Use exact workflow name or menu shortcut (`*prd` not `*PRD`) 2. Verify agent has workflow: - PM agent: prd, tech-spec - Architect agent: create-architecture, validate-architecture diff --git a/package-lock.json b/package-lock.json index 1001ce87..375ff514 100644 --- a/package-lock.json +++ b/package-lock.json @@ -98,7 +98,6 @@ "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -1841,7 +1840,6 @@ "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.10.0" } @@ -2158,7 +2156,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2520,7 +2517,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001735", "electron-to-chromium": "^1.5.204", @@ -3410,7 +3406,6 @@ "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -7498,7 +7493,6 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -8331,7 +8325,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, diff --git a/src/modules/bmm/docs/brownfield-guide.md b/src/modules/bmm/docs/brownfield-guide.md index a660f896..5aa808ee 100644 --- a/src/modules/bmm/docs/brownfield-guide.md +++ b/src/modules/bmm/docs/brownfield-guide.md @@ -725,13 +725,7 @@ flowchart TD - **[Quick Start Guide](./quick-start.md)** - Getting started with BMM - **[Glossary](./glossary.md)** - Key terminology - **[FAQ](./faq.md)** - Common questions - <<<<<<< Updated upstream - ======= - **[Troubleshooting](./troubleshooting.md)** - Problem resolution - <<<<<<< Updated upstream - > > > > > > > # Stashed changes - > > > > > > > - > > > > > > > Stashed changes - **[Workflow Documentation](./README.md#-workflow-guides)** - Complete workflow reference --- @@ -746,13 +740,7 @@ flowchart TD **Documentation:** -<<<<<<< Updated upstream -<<<<<<< Updated upstream - -- # [Test Architect Guide](./test-architecture.md) - Comprehensive testing strategy - > > > > > > > # Stashed changes - > > > > > > > - > > > > > > > Stashed changes +- **[Test Architect Guide](./test-architecture.md)** - Comprehensive testing strategy - [BMM Module README](../README.md) - Complete module and workflow reference --- diff --git a/src/modules/bmm/docs/glossary.md b/src/modules/bmm/docs/glossary.md index 2bfdda52..f2a6a6c7 100644 --- a/src/modules/bmm/docs/glossary.md +++ b/src/modules/bmm/docs/glossary.md @@ -95,20 +95,10 @@ Game development equivalent of PRD, created by Game Designer agent for game proj ## Workflow and Phases -<<<<<<< Updated upstream - -# <<<<<<< Updated upstream - -======= - -> > > > > > > Stashed changes - ### Phase 0: Documentation (Prerequisite) **Conditional phase for brownfield projects.** Creates comprehensive codebase documentation before planning. Only required if existing documentation is insufficient for AI agents. -> > > > > > > Stashed changes - ### Phase 1: Analysis (Optional) Discovery and research phase including brainstorming, research workflows, and product brief creation. Optional for Quick Flow, recommended for BMad Method, required for Enterprise Method. diff --git a/src/modules/bmm/docs/quick-spec-flow.md b/src/modules/bmm/docs/quick-spec-flow.md index 05ac4629..cd3d5b15 100644 --- a/src/modules/bmm/docs/quick-spec-flow.md +++ b/src/modules/bmm/docs/quick-spec-flow.md @@ -645,7 +645,7 @@ Quick Spec Flow is your **fast path from idea to implementation** for: - **Try it now:** Load PM agent and describe a small change - **Learn more:** See the [BMM Workflow Guides](./README.md#-workflow-guides) for comprehensive workflow documentation - **Need help deciding?** Run `workflow-init` to get a recommendation -- **Have questions?** Join us on Discord: https://discord.gg/gk8jAdXWmj +- **Have questions?** Join us on Discord: --- diff --git a/src/modules/bmm/docs/troubleshooting.md b/src/modules/bmm/docs/troubleshooting.md index f411d98b..a3cd63bf 100644 --- a/src/modules/bmm/docs/troubleshooting.md +++ b/src/modules/bmm/docs/troubleshooting.md @@ -192,7 +192,7 @@ workflow-init asks: "Is this work in progress or previous effort?" **Solution:** -1. Check spelling/format - Use exact workflow name or menu shortcut (*prd not *PRD) +1. Check spelling/format - Use exact workflow name or menu shortcut (`*prd` not `*PRD`) 2. Verify agent has workflow: - PM agent: prd, tech-spec - Architect agent: create-architecture, validate-architecture diff --git a/tools/cli/installers/lib/ide/rovo-dev.js b/tools/cli/installers/lib/ide/rovo-dev.js index 8f460178..ecb34d4b 100644 --- a/tools/cli/installers/lib/ide/rovo-dev.js +++ b/tools/cli/installers/lib/ide/rovo-dev.js @@ -15,7 +15,7 @@ const { TaskToolCommandGenerator } = require('./shared/task-tool-command-generat */ class RovoDevSetup extends BaseIdeSetup { constructor() { - super('rovo-dev', 'Atlassian Rovo Dev', true); // preferred IDE + super('rovo-dev', 'Atlassian Rovo Dev', false); this.configDir = '.rovodev'; this.subagentsDir = 'subagents'; this.workflowsDir = 'workflows'; From 0d83799ecfde25193a2c320b61fda97e4177e101 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 6 Dec 2025 15:28:37 -0600 Subject: [PATCH 04/26] refactor: simplify module discovery to scan entire project - Module discovery now scans entire project recursively for install-config.yaml - Removed hardcoded module locations (bmad-custom-src, etc.) - Modules can exist anywhere with _module-installer/install-config.yaml - All modules treated equally regardless of location - No special UI handling for 'custom' modules - Core module excluded from selection list (always installed first) - Only install-config.yaml is valid (removed support for legacy config.yaml) Modules are now discovered by structure, not location. --- .gitignore | 2 +- tools/cli/commands/install.js | 603 +----------------- .../installers/lib/core/config-collector.js | 49 +- tools/cli/installers/lib/core/installer.js | 26 +- .../lib/ide/shared/bmad-artifacts.js | 45 -- tools/cli/installers/lib/modules/manager.js | 247 +++++-- tools/cli/lib/ui.js | 556 +--------------- 7 files changed, 243 insertions(+), 1285 deletions(-) diff --git a/.gitignore b/.gitignore index 045057da..8a9137a1 100644 --- a/.gitignore +++ b/.gitignore @@ -62,7 +62,7 @@ src/modules/bmm/sub-modules/ src/modules/bmb/sub-modules/ src/modules/cis/sub-modules/ src/modules/bmgd/sub-modules/ - +shared-modules z*/ .bmad diff --git a/tools/cli/commands/install.js b/tools/cli/commands/install.js index a2f0e755..d5742cf7 100644 --- a/tools/cli/commands/install.js +++ b/tools/cli/commands/install.js @@ -1,513 +1,11 @@ const chalk = require('chalk'); const path = require('node:path'); -const fs = require('fs-extra'); const { Installer } = require('../installers/lib/core/installer'); const { UI } = require('../lib/ui'); const installer = new Installer(); const ui = new UI(); -/** - * Install custom content (agents, workflows, modules) - * @param {Object} config - Installation configuration - * @param {Object} result - Installation result - * @param {string} projectDirectory - Project directory path - */ -async function installCustomContent(config, result, projectDirectory) { - const { customContent } = config; - const { selectedItems } = customContent; - const projectDir = projectDirectory; - const bmadDir = result.path; - - console.log(chalk.dim(`Project: ${projectDir}`)); - console.log(chalk.dim(`BMAD: ${bmadDir}`)); - - // Install custom agents - use agent-install logic - if (selectedItems.agents.length > 0) { - console.log(chalk.blue(`\n👥 Installing ${selectedItems.agents.length} custom agent(s)...`)); - for (const agent of selectedItems.agents) { - await installCustomAgentWithPrompts(agent, projectDir, bmadDir, config); - } - } - - // Install custom workflows - copy and register with IDEs - if (selectedItems.workflows.length > 0) { - console.log(chalk.blue(`\n📋 Installing ${selectedItems.workflows.length} custom workflow(s)...`)); - for (const workflow of selectedItems.workflows) { - await installCustomWorkflowWithIDE(workflow, projectDir, bmadDir, config); - } - } - - // Install custom modules - treat like regular modules - if (selectedItems.modules.length > 0) { - console.log(chalk.blue(`\n🔧 Installing ${selectedItems.modules.length} custom module(s)...`)); - for (const module of selectedItems.modules) { - await installCustomModuleAsRegular(module, projectDir, bmadDir, config); - } - } - - console.log(chalk.green('\n✓ Custom content installation complete!')); -} - -/** - * Install a custom agent with proper prompts (mirrors agent-install.js) - */ -async function installCustomAgentWithPrompts(agent, projectDir, bmadDir, config) { - const { - discoverAgents, - loadAgentConfig, - addToManifest, - extractManifestData, - promptInstallQuestions, - createIdeSlashCommands, - updateManifestYaml, - saveAgentSource, - } = require('../lib/agent/installer'); - const { compileAgent } = require('../lib/agent/compiler'); - const inquirer = require('inquirer'); - const readline = require('node:readline'); - const yaml = require('js-yaml'); - - console.log(chalk.cyan(` Installing agent: ${agent.name}`)); - - // Load agent config - const agentConfig = loadAgentConfig(agent.yamlPath); - const agentType = agent.name; // e.g., "toolsmith" - - // Confirm/customize agent persona name (mirrors agent-install.js) - const rl1 = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - - const defaultPersonaName = agentConfig.metadata.name || agentType; - console.log(chalk.cyan(`\n 📛 Agent Persona Name`)); - console.log(chalk.dim(` Agent type: ${agentType}`)); - console.log(chalk.dim(` Default persona: ${defaultPersonaName}`)); - console.log(chalk.dim(' Leave blank to use default, or provide a custom name.')); - console.log(chalk.dim(' Examples:')); - console.log(chalk.dim(` - (blank) → "${defaultPersonaName}" as ${agentType}.md`)); - console.log(chalk.dim(` - "Fred" → "Fred" as fred-${agentType}.md`)); - console.log(chalk.dim(` - "Captain Code" → "Captain Code" as captain-code-${agentType}.md`)); - - const customPersonaName = await new Promise((resolve) => { - rl1.question(`\n Custom name (or Enter for default): `, resolve); - }); - rl1.close(); - - // Determine final agent file name based on persona name - let finalAgentName; - let personaName; - if (customPersonaName.trim()) { - personaName = customPersonaName.trim(); - const namePrefix = personaName.toLowerCase().replaceAll(/\s+/g, '-'); - finalAgentName = `${namePrefix}-${agentType}`; - } else { - personaName = defaultPersonaName; - finalAgentName = agentType; - } - - console.log(chalk.dim(` Persona: ${personaName}`)); - console.log(chalk.dim(` File: ${finalAgentName}.md`)); - - // Get answers (prompt or use defaults) - let presetAnswers = {}; - - // If custom persona name provided, inject it as custom_name for template processing - if (customPersonaName.trim()) { - presetAnswers.custom_name = personaName; - } - - let answers; - if (agentConfig.installConfig) { - answers = await promptInstallQuestions(agentConfig.installConfig, agentConfig.defaults, presetAnswers); - } else { - answers = { ...agentConfig.defaults, ...presetAnswers }; - } - - // Create target directory - const targetDir = path.join(bmadDir, 'custom', 'agents', finalAgentName); - await fs.ensureDir(targetDir); - - // Compile agent with answers - const { xml, metadata } = compileAgent( - agentConfig.yamlContent, - answers, - finalAgentName, - `.bmad/custom/agents/${finalAgentName}/${finalAgentName}.md`, - ); - - // Write compiled agent - const compiledPath = path.join(targetDir, `${finalAgentName}.md`); - await fs.writeFile(compiledPath, xml, 'utf8'); - - // Copy sidecar files if exists - if (agent.hasSidecar) { - const entries = await fs.readdir(agent.path, { withFileTypes: true }); - for (const entry of entries) { - if (entry.isFile() && !entry.name.endsWith('.agent.yaml')) { - await fs.copy(path.join(agent.path, entry.name), path.join(targetDir, entry.name)); - } - } - } - - // Save source YAML for reinstallation - const cfgAgentsBackupDir = path.join(bmadDir, '_cfg', 'custom', 'agents'); - await fs.ensureDir(cfgAgentsBackupDir); - const backupYamlPath = path.join(cfgAgentsBackupDir, `${finalAgentName}.agent.yaml`); - await fs.copy(agent.yamlPath, backupYamlPath); - - // Add to agent manifest - const manifestFile = path.join(bmadDir, '_cfg', 'agent-manifest.csv'); - const relativePath = `.bmad/custom/agents/${finalAgentName}/${finalAgentName}.md`; - const manifestData = extractManifestData(xml, { ...metadata, name: finalAgentName }, relativePath, 'custom'); - manifestData.name = finalAgentName; - manifestData.displayName = metadata.name || finalAgentName; - addToManifest(manifestFile, manifestData); - - // Update manifest.yaml - const manifestYamlPath = path.join(bmadDir, '_cfg', 'manifest.yaml'); - updateManifestYaml(manifestYamlPath, finalAgentName, finalAgentName); - - // Create IDE slash commands using existing IDEs from config - const ideResults = await createIdeSlashCommands(projectDir, finalAgentName, relativePath, metadata, config.ides || []); - const ideCount = Object.keys(ideResults).length; - - console.log(chalk.green(` ✓ ${finalAgentName} (registered with ${ideCount} IDE${ideCount === 1 ? '' : 's'})`)); -} - -/** - * Install a custom workflow and register with all IDEs - */ -async function installCustomWorkflowWithIDE(workflow, projectDir, bmadDir, config) { - const targetDir = path.join(bmadDir, 'custom', 'workflows'); - - // Check if workflow is a directory or just a file - // workflow.path might be a file (workflow.md) or a directory - let sourcePath = workflow.path; - let isDirectory = false; - - try { - const stats = await fs.stat(workflow.path); - isDirectory = stats.isDirectory(); - } catch { - console.log(chalk.red(` ERROR: Cannot access workflow path: ${workflow.path}`)); - return; - } - - // If it's a file ending in workflow.md, use the parent directory - if (!isDirectory && workflow.path.endsWith('workflow.md')) { - sourcePath = path.dirname(workflow.path); - isDirectory = true; - } - - if (isDirectory) { - // Copy the entire workflow directory - const workflowName = path.basename(sourcePath); - const targetWorkflowDir = path.join(targetDir, workflowName); - await fs.copy(sourcePath, targetWorkflowDir); - - // Update manifest with the main workflow.md file - const relativePath = `.bmad/custom/workflows/${workflowName}/workflow.md`; - await addWorkflowToManifest(bmadDir, workflow.name, workflow.description, relativePath, 'custom'); - } else { - // Single file workflow - const targetFileName = path.basename(sourcePath); - const targetPath = path.join(targetDir, targetFileName); - await fs.copy(sourcePath, targetPath); - - // Update manifest - const relativePath = `.bmad/custom/workflows/${targetFileName}`; - await addWorkflowToManifest(bmadDir, workflow.name, workflow.description, relativePath, 'custom'); - } - - // Register workflow with all configured IDEs - const relativePath = `.bmad/custom/workflows/${path.basename(workflow.path)}`; - if (config.ides && config.ides.length > 0) { - const { IdeManager } = require('../installers/lib/ide/manager'); - const ideManager = new IdeManager(); - - for (const ide of config.ides) { - try { - // IdeManager uses a Map, not getHandler method - const ideHandler = ideManager.handlers.get(ide.toLowerCase()); - if (ideHandler && typeof ideHandler.registerWorkflow === 'function') { - await ideHandler.registerWorkflow(projectDir, bmadDir, workflow.name, relativePath); - console.log(chalk.dim(` ✓ Registered with ${ide}`)); - } - } catch (error) { - console.log(chalk.yellow(` ⚠️ Could not register with ${ide}: ${error.message}`)); - } - } - } - - console.log(chalk.green(` ✓ ${workflow.name} (copied to custom workflows and registered with IDEs)`)); -} - -/** - * Helper to add workflow to manifest - */ -async function addWorkflowToManifest(bmadDir, name, description, relativePath, moduleType = 'custom') { - const workflowManifestPath = path.join(bmadDir, '_cfg', 'workflow-manifest.csv'); - - console.log(chalk.dim(`[DEBUG] Adding workflow to manifest: ${name} -> ${relativePath} (module: ${moduleType})`)); - - // Read existing manifest - let manifestContent = ''; - if (await fs.pathExists(workflowManifestPath)) { - manifestContent = await fs.readFile(workflowManifestPath, 'utf8'); - } - - // Ensure header exists - if (!manifestContent.includes('name,description,module,path')) { - manifestContent = 'name,description,module,path\n'; - } - - // Add workflow entry - const csvLine = `"${name}","${description}","${moduleType}","${relativePath}"\n`; - - // Check if workflow already exists in manifest - if (manifestContent.includes(`"${name}",`)) { - console.log(chalk.dim(`[DEBUG] Workflow already exists in manifest: ${name}`)); - } else { - try { - await fs.writeFile(workflowManifestPath, manifestContent + csvLine); - console.log(chalk.dim(`[DEBUG] Successfully added to manifest`)); - } catch (error) { - console.log(chalk.red(`[ERROR] Failed to write to manifest: ${error.message}`)); - } - } -} - -/** - * Install a custom module like a regular module - */ -async function installCustomModuleAsRegular(module, projectDir, bmadDir, config) { - const yaml = require('js-yaml'); - const path = require('node:path'); - - // The custom module path should be the source location - const customSrcPath = module.path; - - // Install the custom module by copying it to the custom modules directory - const targetDir = path.join(bmadDir, 'custom', 'modules', module.name); - await fs.copy(customSrcPath, targetDir); - - // Check if module has an installer and run it from the ORIGINAL source location - const installerPath = path.join(customSrcPath, '_module-installer', 'installer.js'); - if (await fs.pathExists(installerPath)) { - try { - // Clear require cache to ensure fresh import - delete require.cache[require.resolve(installerPath)]; - - // Load and run the module installer - const moduleInstaller = require(installerPath); - await moduleInstaller.install({ - projectRoot: projectDir, - config: config.coreConfig || {}, - installedIDEs: config.ides || [], - logger: { - log: (msg) => console.log(chalk.dim(` ${msg}`)), - error: (msg) => console.log(chalk.red(` ERROR: ${msg}`)), - }, - }); - console.log(chalk.green(` ✓ ${module.name} (custom installer executed)`)); - } catch (error) { - console.log(chalk.yellow(` ⚠️ ${module.name} installer failed: ${error.message}`)); - console.log(chalk.dim(` Module copied but not configured`)); - } - } else { - // No installer - check if module has agents/workflows to install - console.log(chalk.dim(` Processing module agents and workflows...`)); - - // Install agents from the module - const agentsPath = path.join(customSrcPath, 'agents'); - if (await fs.pathExists(agentsPath)) { - const agentFiles = await fs.readdir(agentsPath); - for (const agentFile of agentFiles) { - if (agentFile.endsWith('.yaml')) { - const agentPath = path.join(agentsPath, agentFile); - await installModuleAgent(agentPath, module.name, projectDir, bmadDir, config); - } - } - } - - // Install workflows from the module - const workflowsPath = path.join(customSrcPath, 'workflows'); - if (await fs.pathExists(workflowsPath)) { - const workflowDirs = await fs.readdir(workflowsPath, { withFileTypes: true }); - for (const workflowDir of workflowDirs) { - if (workflowDir.isDirectory()) { - const workflowPath = path.join(workflowsPath, workflowDir.name); - await installModuleWorkflow(workflowPath, module.name, projectDir, bmadDir, config); - } - } - } - - console.log(chalk.green(` ✓ ${module.name}`)); - } - - // Update manifest.yaml to include custom module with proper prefix - const manifestYamlPath = path.join(bmadDir, '_cfg', 'manifest.yaml'); - - if (await fs.pathExists(manifestYamlPath)) { - const manifest = yaml.load(await fs.readFile(manifestYamlPath, 'utf8')); - - // Remove any old entries without custom- prefix for this module - const oldModuleName = module.name; - if (manifest.modules.includes(oldModuleName)) { - manifest.modules = manifest.modules.filter((m) => m !== oldModuleName); - console.log(chalk.dim(` Removed old entry: ${oldModuleName}`)); - } - - // Custom modules should be stored with custom- prefix - const moduleNameWithPrefix = `custom-${module.name}`; - if (!manifest.modules.includes(moduleNameWithPrefix)) { - manifest.modules.push(moduleNameWithPrefix); - console.log(chalk.dim(` Added to manifest.yaml as ${moduleNameWithPrefix}`)); - } - - // Write back the cleaned manifest - await fs.writeFile(manifestYamlPath, yaml.dump(manifest), 'utf8'); - } - - // Register module with IDEs (like regular modules do) - if (config.ides && config.ides.length > 0) { - const { IdeManager } = require('../installers/lib/ide/manager'); - const ideManager = new IdeManager(); - - for (const ide of config.ides) { - try { - // IdeManager uses a Map, not direct property access - const handler = ideManager.handlers.get(ide.toLowerCase()); - if (handler && handler.moduleInjector) { - // Check if module has IDE-specific customizations - const subModulePath = path.join(customSrcPath, 'sub-modules', ide); - if (await fs.pathExists(subModulePath)) { - console.log(chalk.dim(` ✓ Found ${ide} customizations for ${module.name}`)); - } - } - } catch (error) { - console.log(chalk.yellow(` ⚠️ Could not configure ${ide} for ${module.name}: ${error.message}`)); - } - } - } -} - -/** - * Install an agent from a module - */ -async function installModuleAgent(agentPath, moduleName, projectDir, bmadDir, config) { - const { - loadAgentConfig, - addToManifest, - extractManifestData, - createIdeSlashCommands, - updateManifestYaml, - } = require('../lib/agent/installer'); - const { compileAgent } = require('../lib/agent/compiler'); - - const agentName = path.basename(agentPath, '.yaml'); - console.log(chalk.dim(` Installing agent: ${agentName} (from ${moduleName})`)); - - // Load agent config - const agentConfig = loadAgentConfig(agentPath); - - // Compile agent with defaults (no prompts for module agents) - const { xml, metadata } = compileAgent( - agentConfig.yamlContent, - agentConfig.defaults || {}, - agentName, - `.bmad/custom/modules/${moduleName}/agents/${agentName}.md`, - ); - - // Create target directory - const targetDir = path.join(bmadDir, 'custom', 'modules', moduleName, 'agents'); - await fs.ensureDir(targetDir); - - // Write compiled agent - const compiledPath = path.join(targetDir, `${agentName}.md`); - await fs.writeFile(compiledPath, xml, 'utf8'); - - // Remove the raw YAML file after compilation - const yamlPath = path.join(targetDir, `${agentName}.yaml`); - if (await fs.pathExists(yamlPath)) { - await fs.remove(yamlPath); - } - - // Add to agent manifest - const manifestFile = path.join(bmadDir, '_cfg', 'agent-manifest.csv'); - const relativePath = `.bmad/custom/modules/${moduleName}/agents/${agentName}.md`; - const manifestData = extractManifestData(xml, { ...metadata, name: agentName }, relativePath, 'custom'); - manifestData.name = `${moduleName}-${agentName}`; - manifestData.displayName = metadata.name || agentName; - addToManifest(manifestFile, manifestData); - - // Update manifest.yaml - const manifestYamlPath = path.join(bmadDir, '_cfg', 'manifest.yaml'); - updateManifestYaml(manifestYamlPath, `${moduleName}-${agentName}`, agentName); - - // Create IDE slash commands - const ideResults = await createIdeSlashCommands(projectDir, `${moduleName}-${agentName}`, relativePath, metadata, config.ides || []); - const ideCount = Object.keys(ideResults).length; - - console.log(chalk.dim(` ✓ ${agentName} (registered with ${ideCount} IDE${ideCount === 1 ? '' : 's'})`)); -} - -/** - * Install a workflow from a module - */ -async function installModuleWorkflow(workflowPath, moduleName, projectDir, bmadDir, config) { - const workflowName = path.basename(workflowPath); - - // Copy the workflow directory - const targetDir = path.join(bmadDir, 'custom', 'modules', moduleName, 'workflows', workflowName); - await fs.copy(workflowPath, targetDir); - - // Add to workflow manifest - const workflowManifestPath = path.join(bmadDir, '_cfg', 'workflow-manifest.csv'); - const relativePath = `.bmad/custom/modules/${moduleName}/workflows/${workflowName}/README.md`; - - // Read existing manifest - let manifestContent = ''; - if (await fs.pathExists(workflowManifestPath)) { - manifestContent = await fs.readFile(workflowManifestPath, 'utf8'); - } - - // Ensure header exists - if (!manifestContent.includes('name,description,module,path')) { - manifestContent = 'name,description,module,path\n'; - } - - // Add workflow entry - const csvLine = `"${moduleName}-${workflowName}","Workflow from ${moduleName} module","${moduleName}","${relativePath}"\n`; - - // Check if workflow already exists in manifest - if (!manifestContent.includes(`"${moduleName}-${workflowName}",`)) { - await fs.writeFile(workflowManifestPath, manifestContent + csvLine); - } - - // Register with IDEs - if (config.ides && config.ides.length > 0) { - const { IdeManager } = require('../installers/lib/ide/manager'); - const ideManager = new IdeManager(); - - for (const ide of config.ides) { - try { - const ideHandler = ideManager.handlers.get(ide.toLowerCase()); - if (ideHandler && typeof ideHandler.registerWorkflow === 'function') { - await ideHandler.registerWorkflow(projectDir, bmadDir, `${moduleName}-${workflowName}`, relativePath); - console.log(chalk.dim(` ✓ Registered with ${ide}`)); - } - } catch (error) { - console.log(chalk.yellow(` ⚠️ Could not register with ${ide}: ${error.message}`)); - } - } - } - - console.log(chalk.dim(` ✓ ${workflowName} workflow added and registered`)); -} - module.exports = { command: 'install', description: 'Install BMAD Core agents and tools', @@ -520,6 +18,7 @@ module.exports = { if (config.actionType === 'cancel') { console.log(chalk.yellow('Installation cancelled.')); process.exit(0); + return; } // Handle agent compilation separately @@ -528,6 +27,7 @@ module.exports = { console.log(chalk.green('\n✨ Agent compilation complete!')); console.log(chalk.cyan(`Rebuilt ${result.agentCount} agents and ${result.taskCount} tasks`)); process.exit(0); + return; } // Handle quick update separately @@ -535,71 +35,8 @@ module.exports = { const result = await installer.quickUpdate(config); console.log(chalk.green('\n✨ Quick update complete!')); console.log(chalk.cyan(`Updated ${result.moduleCount} modules with preserved settings`)); - - // After quick update, check for existing custom content and re-install to regenerate IDE commands - const { UI } = require('../lib/ui'); - const ui = new UI(); - const customPath = path.join(config.directory, 'bmad-custom-src'); - - // Check if custom content exists - if (await fs.pathExists(customPath)) { - console.log(chalk.cyan('\n📦 Detecting custom content to update IDE commands...')); - - // Get existing custom content selections (default to all for updates) - const existingCustom = { - agents: (await fs.pathExists(path.join(customPath, 'agents'))) ? true : false, - workflows: (await fs.pathExists(path.join(customPath, 'workflows'))) ? true : false, - modules: (await fs.pathExists(path.join(customPath, 'modules'))) ? true : false, - }; - - // Auto-select all existing custom content for update - if (existingCustom.agents || existingCustom.workflows || existingCustom.modules) { - const customContent = await ui.discoverCustomContent(customPath); - - config.customContent = { - path: customPath, - selectedItems: { - agents: existingCustom.agents ? customContent.agents.map((a) => ({ ...a, selected: true })) : [], - workflows: existingCustom.workflows ? customContent.workflows.map((w) => ({ ...w, selected: true })) : [], - modules: existingCustom.modules ? customContent.modules.map((m) => ({ ...m, selected: true })) : [], - }, - }; - - await installCustomContent(config, result, config.directory); - - // Re-run IDE setup to register custom workflows with IDEs - if (config.ides && config.ides.length > 0) { - console.log(chalk.cyan('\n🔧 Updating IDE configurations for custom content...')); - const { IdeManager } = require('../installers/lib/ide/manager'); - const ideManager = new IdeManager(); - - for (const ide of config.ides) { - try { - const ideResult = await ideManager.setup(ide, config.directory, result.path, { - selectedModules: [...(config.modules || []), 'custom'], // Include 'custom' for custom agents/workflows - skipModuleInstall: true, // Don't install modules again - verbose: false, - preCollectedConfig: { - ...config.coreConfig, - _alreadyConfigured: true, // Skip reconfiguration that might add duplicates - }, - }); - - if (ideResult.success) { - console.log(chalk.dim(` ✓ Updated ${ide} with custom workflows`)); - } - } catch (error) { - console.log(chalk.yellow(` ⚠️ Could not update ${ide}: ${error.message}`)); - } - } - } - } else { - console.log(chalk.dim(' No custom content found to update')); - } - } - - console.log(chalk.green('\n✨ Update complete with custom content!')); process.exit(0); + return; } // Handle reinstall by setting force flag @@ -618,43 +55,11 @@ module.exports = { // Check if installation was cancelled if (result && result.cancelled) { process.exit(0); + return; } // Check if installation succeeded if (result && result.success) { - // Install custom content if selected - if (config.customContent && config.customContent.selectedItems) { - console.log(chalk.cyan('\n📦 Installing Custom Content...')); - await installCustomContent(config, result, config.directory); - - // Re-run IDE setup to register custom workflows with IDEs - if (config.ides && config.ides.length > 0) { - console.log(chalk.cyan('\n🔧 Updating IDE configurations for custom content...')); - const { IdeManager } = require('../installers/lib/ide/manager'); - const ideManager = new IdeManager(); - - for (const ide of config.ides) { - try { - const ideResult = await ideManager.setup(ide, config.directory, result.path, { - selectedModules: [...(config.modules || []), 'custom'], // Include 'custom' for custom agents/workflows - skipModuleInstall: true, // Don't install modules again - verbose: false, - preCollectedConfig: { - ...config.coreConfig, - _alreadyConfigured: true, // Skip reconfiguration that might add duplicates - }, - }); - - if (ideResult.success) { - console.log(chalk.dim(` ✓ Updated ${ide} with custom workflows`)); - } - } catch (error) { - console.log(chalk.yellow(` ⚠️ Could not update ${ide}: ${error.message}`)); - } - } - } - } - console.log(chalk.green('\n✨ Installation complete!')); console.log(chalk.cyan('BMAD Core and Selected Modules have been installed to:'), chalk.bold(result.path)); console.log(chalk.yellow('\nThank you for helping test the early release version of the new BMad Core and BMad Method!')); diff --git a/tools/cli/installers/lib/core/config-collector.js b/tools/cli/installers/lib/core/config-collector.js index d67b6256..99fca89d 100644 --- a/tools/cli/installers/lib/core/config-collector.js +++ b/tools/cli/installers/lib/core/config-collector.js @@ -182,14 +182,24 @@ class ConfigCollector { } // Load module's install config schema - const installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-config.yaml'); - const legacyConfigPath = path.join(getModulePath(moduleName), 'config.yaml'); + // First, try the standard src/modules location + let installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-config.yaml'); + + // If not found in src/modules, we need to find it by searching the project + if (!(await fs.pathExists(installerConfigPath))) { + // Use the module manager to find the module source + const { ModuleManager } = require('../modules/manager'); + const moduleManager = new ModuleManager(); + const moduleSourcePath = await moduleManager.findModuleSource(moduleName); + + if (moduleSourcePath) { + installerConfigPath = path.join(moduleSourcePath, '_module-installer', 'install-config.yaml'); + } + } let configPath = null; if (await fs.pathExists(installerConfigPath)) { configPath = installerConfigPath; - } else if (await fs.pathExists(legacyConfigPath)) { - configPath = legacyConfigPath; } else { // No config schema for this module - use existing values if (this.existingConfig && this.existingConfig[moduleName]) { @@ -396,32 +406,25 @@ class ConfigCollector { if (!this.allAnswers) { this.allAnswers = {}; } - // Load module's config.yaml (check custom modules first, then regular modules) - let installerConfigPath; - let legacyConfigPath; + // Load module's config + // First, try the standard src/modules location + let installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-config.yaml'); - if (moduleName.startsWith('custom-')) { - // Handle custom modules - const actualModuleName = moduleName.replace('custom-', ''); + // If not found in src/modules, we need to find it by searching the project + if (!(await fs.pathExists(installerConfigPath))) { + // Use the module manager to find the module source + const { ModuleManager } = require('../modules/manager'); + const moduleManager = new ModuleManager(); + const moduleSourcePath = await moduleManager.findModuleSource(moduleName); - // Custom modules are in the BMAD-METHOD source directory, not the installation directory - const bmadMethodRoot = getProjectRoot(); // This gets the BMAD-METHOD root - const customSrcPath = path.join(bmadMethodRoot, 'bmad-custom-src', 'modules', actualModuleName); - installerConfigPath = path.join(customSrcPath, '_module-installer', 'install-config.yaml'); - legacyConfigPath = path.join(customSrcPath, 'config.yaml'); - - console.log(chalk.dim(`[DEBUG] Looking for custom module config in: ${installerConfigPath}`)); - } else { - // Regular modules - installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-config.yaml'); - legacyConfigPath = path.join(getModulePath(moduleName), 'config.yaml'); + if (moduleSourcePath) { + installerConfigPath = path.join(moduleSourcePath, '_module-installer', 'install-config.yaml'); + } } let configPath = null; if (await fs.pathExists(installerConfigPath)) { configPath = installerConfigPath; - } else if (await fs.pathExists(legacyConfigPath)) { - configPath = legacyConfigPath; } else { // No config for this module return; diff --git a/tools/cli/installers/lib/core/installer.js b/tools/cli/installers/lib/core/installer.js index 8332f816..f113c141 100644 --- a/tools/cli/installers/lib/core/installer.js +++ b/tools/cli/installers/lib/core/installer.js @@ -418,7 +418,7 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: const projectDir = path.resolve(config.directory); // If core config was pre-collected (from interactive mode), use it - if (config.coreConfig && !this.configCollector.collectedConfig.core) { + if (config.coreConfig) { this.configCollector.collectedConfig.core = config.coreConfig; // Also store in allAnswers for cross-referencing this.configCollector.allAnswers = {}; @@ -427,16 +427,11 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: } } - // Collect configurations for modules (skip if quick update already collected them or if pre-collected) + // Collect configurations for modules (skip if quick update already collected them) let moduleConfigs; if (config._quickUpdate) { // Quick update already collected all configs, use them directly moduleConfigs = this.configCollector.collectedConfig; - } else if (config.moduleConfig) { - // Use pre-collected configs from UI (includes custom modules) - moduleConfigs = config.moduleConfig; - // Also need to load them into configCollector for later use - this.configCollector.collectedConfig = moduleConfigs; } else { // Regular install - collect configurations (core was already collected in UI.promptInstall if interactive) moduleConfigs = await this.configCollector.collectAllConfigurations(config.modules || [], path.resolve(config.directory)); @@ -753,14 +748,13 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: spinner.text = 'Creating directory structure...'; await this.createDirectoryStructure(bmadDir); - // Resolve dependencies for selected modules (skip custom modules) + // Resolve dependencies for selected modules spinner.text = 'Resolving dependencies...'; const projectRoot = getProjectRoot(); - const regularModules = (config.modules || []).filter((m) => !m.startsWith('custom-')); - const modulesToInstall = config.installCore ? ['core', ...regularModules] : regularModules; + const modulesToInstall = config.installCore ? ['core', ...config.modules] : config.modules; // For dependency resolution, we need to pass the project root - const resolution = await this.dependencyResolver.resolve(projectRoot, regularModules, { verbose: config.verbose }); + const resolution = await this.dependencyResolver.resolve(projectRoot, config.modules || [], { verbose: config.verbose }); if (config.verbose) { spinner.succeed('Dependencies resolved'); @@ -775,17 +769,17 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: spinner.succeed('Core installed'); } - // Install modules with their dependencies (skip custom modules - they're handled by install.js) - if (regularModules.length > 0) { - for (const moduleName of regularModules) { + // Install modules with their dependencies + if (config.modules && config.modules.length > 0) { + for (const moduleName of config.modules) { spinner.start(`Installing module: ${moduleName}...`); await this.installModuleWithDependencies(moduleName, bmadDir, resolution.byModule[moduleName]); spinner.succeed(`Module installed: ${moduleName}`); } - // Install partial modules (only dependencies) - skip custom modules + // Install partial modules (only dependencies) for (const [module, files] of Object.entries(resolution.byModule)) { - if (!regularModules.includes(module) && module !== 'core') { + if (!config.modules.includes(module) && module !== 'core') { const totalFiles = files.agents.length + files.tasks.length + diff --git a/tools/cli/installers/lib/ide/shared/bmad-artifacts.js b/tools/cli/installers/lib/ide/shared/bmad-artifacts.js index 542d8238..d05b985e 100644 --- a/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +++ b/tools/cli/installers/lib/ide/shared/bmad-artifacts.js @@ -24,51 +24,6 @@ async function getAgentsFromBmad(bmadDir, selectedModules = []) { } } - // Get custom module agents (from bmad/custom/modules/*/agents/) - const customModulesDir = path.join(bmadDir, 'custom', 'modules'); - if (await fs.pathExists(customModulesDir)) { - const moduleDirs = await fs.readdir(customModulesDir, { withFileTypes: true }); - - for (const moduleDir of moduleDirs) { - if (!moduleDir.isDirectory()) continue; - - const moduleAgentsPath = path.join(customModulesDir, moduleDir.name, 'agents'); - if (await fs.pathExists(moduleAgentsPath)) { - const moduleAgents = await getAgentsFromDir(moduleAgentsPath, moduleDir.name); - agents.push(...moduleAgents); - } - } - } - - // Get custom agents from bmad/custom/agents/ directory - const customAgentsDir = path.join(bmadDir, 'custom', 'agents'); - if (await fs.pathExists(customAgentsDir)) { - const agentDirs = await fs.readdir(customAgentsDir, { withFileTypes: true }); - - for (const agentDir of agentDirs) { - if (!agentDir.isDirectory()) continue; - - const agentDirPath = path.join(customAgentsDir, agentDir.name); - const agentFiles = await fs.readdir(agentDirPath); - - for (const file of agentFiles) { - if (!file.endsWith('.md')) continue; - if (file.includes('.customize.')) continue; - - const filePath = path.join(agentDirPath, file); - const content = await fs.readFile(filePath, 'utf8'); - - if (content.includes('localskip="true"')) continue; - - agents.push({ - path: filePath, - name: file.replace('.md', ''), - module: 'custom', // Mark as custom agent - }); - } - } - } - // Get standalone agents from bmad/agents/ directory const standaloneAgentsDir = path.join(bmadDir, 'agents'); if (await fs.pathExists(standaloneAgentsDir)) { diff --git a/tools/cli/installers/lib/modules/manager.js b/tools/cli/installers/lib/modules/manager.js index f644991e..7a4cb9df 100644 --- a/tools/cli/installers/lib/modules/manager.js +++ b/tools/cli/installers/lib/modules/manager.js @@ -98,57 +98,110 @@ class ModuleManager { } /** - * List all available modules + * Find all modules in the project by searching for install-config.yaml files + * @returns {Array} List of module paths + */ + async findModulesInProject() { + const projectRoot = getProjectRoot(); + const modulePaths = new Set(); + + // Helper function to recursively scan directories + async function scanDirectory(dir, excludePaths = []) { + try { + const entries = await fs.readdir(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + + // Skip hidden directories and node_modules + if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist' || entry.name === 'build') { + continue; + } + + // Skip excluded paths + if (excludePaths.some((exclude) => fullPath.startsWith(exclude))) { + continue; + } + + if (entry.isDirectory()) { + // Skip core module - it's always installed first and not selectable + if (entry.name === 'core') { + continue; + } + + // Check if this directory contains a module (only install-config.yaml is valid now) + const installerConfigPath = path.join(fullPath, '_module-installer', 'install-config.yaml'); + + if (await fs.pathExists(installerConfigPath)) { + modulePaths.add(fullPath); + // Don't scan inside modules - they might have their own nested structures + continue; + } + + // Recursively scan subdirectories + await scanDirectory(fullPath, excludePaths); + } + } + } catch { + // Ignore errors (e.g., permission denied) + } + } + + // Scan the entire project, but exclude src/modules since we handle it separately + await scanDirectory(projectRoot, [this.modulesSourcePath]); + + return [...modulePaths]; + } + + /** + * List all available modules (excluding core which is always installed) * @returns {Array} List of available modules with metadata */ async listAvailable() { const modules = []; - if (!(await fs.pathExists(this.modulesSourcePath))) { - console.warn(chalk.yellow('Warning: src/modules directory not found')); - return modules; - } + // First, scan src/modules (the standard location) + if (await fs.pathExists(this.modulesSourcePath)) { + const entries = await fs.readdir(this.modulesSourcePath, { withFileTypes: true }); - const entries = await fs.readdir(this.modulesSourcePath, { withFileTypes: true }); + for (const entry of entries) { + if (entry.isDirectory()) { + const modulePath = path.join(this.modulesSourcePath, entry.name); + // Check for module structure (only install-config.yaml is valid now) + const installerConfigPath = path.join(modulePath, '_module-installer', 'install-config.yaml'); - for (const entry of entries) { - if (entry.isDirectory()) { - const modulePath = path.join(this.modulesSourcePath, entry.name); - // Check for new structure first - const installerConfigPath = path.join(modulePath, '_module-installer', 'install-config.yaml'); - // Fallback to old structure - const configPath = path.join(modulePath, 'config.yaml'); + // Skip if this doesn't look like a module + if (!(await fs.pathExists(installerConfigPath))) { + continue; + } - const moduleInfo = { - id: entry.name, - path: modulePath, - name: entry.name.toUpperCase(), - description: 'BMAD Module', - version: '5.0.0', - }; + // Skip core module - it's always installed first and not selectable + if (entry.name === 'core') { + continue; + } - // Try to read module config for metadata (prefer new location) - const configToRead = (await fs.pathExists(installerConfigPath)) ? installerConfigPath : configPath; - if (await fs.pathExists(configToRead)) { - try { - const configContent = await fs.readFile(configToRead, 'utf8'); - const config = yaml.load(configContent); - - // Use the code property as the id if available - if (config.code) { - moduleInfo.id = config.code; - } - - moduleInfo.name = config.name || moduleInfo.name; - moduleInfo.description = config.description || moduleInfo.description; - moduleInfo.version = config.version || moduleInfo.version; - moduleInfo.dependencies = config.dependencies || []; - moduleInfo.defaultSelected = config.default_selected === undefined ? false : config.default_selected; - } catch (error) { - console.warn(`Failed to read config for ${entry.name}:`, error.message); + const moduleInfo = await this.getModuleInfo(modulePath, entry.name, 'src/modules'); + if (moduleInfo) { + modules.push(moduleInfo); } } + } + } + // Then, find all other modules in the project + const otherModulePaths = await this.findModulesInProject(); + for (const modulePath of otherModulePaths) { + const moduleName = path.basename(modulePath); + const relativePath = path.relative(getProjectRoot(), modulePath); + + // Skip core module - it's always installed first and not selectable + if (moduleName === 'core') { + continue; + } + + const moduleInfo = await this.getModuleInfo(modulePath, moduleName, relativePath); + if (moduleInfo && !modules.some((m) => m.id === moduleInfo.id)) { + // Avoid duplicates - skip if we already have this module ID modules.push(moduleInfo); } } @@ -156,6 +209,104 @@ class ModuleManager { return modules; } + /** + * Get module information from a module path + * @param {string} modulePath - Path to the module directory + * @param {string} defaultName - Default name for the module + * @param {string} sourceDescription - Description of where the module was found + * @returns {Object|null} Module info or null if not a valid module + */ + async getModuleInfo(modulePath, defaultName, sourceDescription) { + // Check for module structure (only install-config.yaml is valid now) + const installerConfigPath = path.join(modulePath, '_module-installer', 'install-config.yaml'); + + // Skip if this doesn't look like a module + if (!(await fs.pathExists(installerConfigPath))) { + return null; + } + + const moduleInfo = { + id: defaultName, + path: modulePath, + name: defaultName + .split('-') + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' '), + description: 'BMAD Module', + version: '5.0.0', + source: sourceDescription, + }; + + // Read module config for metadata + try { + const configContent = await fs.readFile(installerConfigPath, 'utf8'); + const config = yaml.load(configContent); + + // Use the code property as the id if available + if (config.code) { + moduleInfo.id = config.code; + } + + moduleInfo.name = config.name || moduleInfo.name; + moduleInfo.description = config.description || moduleInfo.description; + moduleInfo.version = config.version || moduleInfo.version; + moduleInfo.dependencies = config.dependencies || []; + moduleInfo.defaultSelected = config.default_selected === undefined ? false : config.default_selected; + } catch (error) { + console.warn(`Failed to read config for ${defaultName}:`, error.message); + } + + return moduleInfo; + } + + /** + * Find the source path for a module by searching all possible locations + * @param {string} moduleName - Name of the module to find + * @returns {string|null} Path to the module source or null if not found + */ + async findModuleSource(moduleName) { + const projectRoot = getProjectRoot(); + + // First, check src/modules + const srcModulePath = path.join(this.modulesSourcePath, moduleName); + if (await fs.pathExists(srcModulePath)) { + // Check if this looks like a module (has install-config.yaml) + const installerConfigPath = path.join(srcModulePath, '_module-installer', 'install-config.yaml'); + + if (await fs.pathExists(installerConfigPath)) { + return srcModulePath; + } + } + + // If not found in src/modules, search the entire project + const allModulePaths = await this.findModulesInProject(); + for (const modulePath of allModulePaths) { + if (path.basename(modulePath) === moduleName) { + return modulePath; + } + } + + // Also check by module ID (not just folder name) + // Need to read configs to match by ID + for (const modulePath of allModulePaths) { + const installerConfigPath = path.join(modulePath, '_module-installer', 'install-config.yaml'); + + if (await fs.pathExists(installerConfigPath)) { + try { + const configContent = await fs.readFile(installerConfigPath, 'utf8'); + const config = yaml.load(configContent); + if (config.code === moduleName) { + return modulePath; + } + } catch { + // Skip if can't read config + } + } + } + + return null; + } + /** * Install a module * @param {string} moduleName - Name of the module to install @@ -167,12 +318,12 @@ class ModuleManager { * @param {Object} options.logger - Logger instance for output */ async install(moduleName, bmadDir, fileTrackingCallback = null, options = {}) { - const sourcePath = path.join(this.modulesSourcePath, moduleName); + const sourcePath = await this.findModuleSource(moduleName); const targetPath = path.join(bmadDir, moduleName); // Check if source module exists - if (!(await fs.pathExists(sourcePath))) { - throw new Error(`Module '${moduleName}' not found in ${this.modulesSourcePath}`); + if (!sourcePath) { + throw new Error(`Module '${moduleName}' not found in any source location`); } // Check if already installed @@ -210,12 +361,12 @@ class ModuleManager { * @param {boolean} force - Force update (overwrite modifications) */ async update(moduleName, bmadDir, force = false) { - const sourcePath = path.join(this.modulesSourcePath, moduleName); + const sourcePath = await this.findModuleSource(moduleName); const targetPath = path.join(bmadDir, moduleName); // Check if source module exists - if (!(await fs.pathExists(sourcePath))) { - throw new Error(`Module '${moduleName}' not found in source`); + if (!sourcePath) { + throw new Error(`Module '${moduleName}' not found in any source location`); } // Check if module is installed @@ -654,7 +805,11 @@ class ModuleManager { if (moduleName === 'core') { sourcePath = getSourcePath('core'); } else { - sourcePath = path.join(this.modulesSourcePath, moduleName); + sourcePath = await this.findModuleSource(moduleName); + if (!sourcePath) { + // No source found, skip module installer + return; + } } const installerPath = path.join(sourcePath, '_module-installer', 'installer.js'); diff --git a/tools/cli/lib/ui.js b/tools/cli/lib/ui.js index 011f2d62..4c5b3379 100644 --- a/tools/cli/lib/ui.js +++ b/tools/cli/lib/ui.js @@ -23,7 +23,6 @@ const inquirer = require('inquirer'); const path = require('node:path'); const os = require('node:os'); const fs = require('fs-extra'); -const yaml = require('js-yaml'); const { CLIUtils } = require('./cli-utils'); /** @@ -120,27 +119,6 @@ class UI { const moduleChoices = await this.getModuleChoices(installedModuleIds); const selectedModules = await this.selectModules(moduleChoices); - // Check if custom module was selected - let customContent = null; - if (selectedModules.includes('custom')) { - // Remove 'custom' from selectedModules since it's not a real module - const customIndex = selectedModules.indexOf('custom'); - selectedModules.splice(customIndex, 1); - - // Handle custom content selection - customContent = await this.handleCustomContentSelection(confirmedDirectory); - - // Add custom modules to the selected modules list for proper installation - if (customContent && customContent.selectedItems && customContent.selectedItems.modules) { - for (const customModule of customContent.selectedItems.modules) { - selectedModules.push(`custom-${customModule.name}`); - } - } - } - - // NOW collect module configurations (including custom modules that were just added) - const moduleConfig = await this.collectModuleConfigs(confirmedDirectory, selectedModules, coreConfig); - // Prompt for AgentVibes TTS integration const agentVibesConfig = await this.promptAgentVibes(confirmedDirectory); @@ -159,488 +137,11 @@ class UI { ides: toolSelection.ides, skipIde: toolSelection.skipIde, coreConfig: coreConfig, // Pass collected core config to installer - moduleConfig: moduleConfig, // Pass collected module configs (including custom modules) enableAgentVibes: agentVibesConfig.enabled, // AgentVibes TTS integration agentVibesInstalled: agentVibesConfig.alreadyInstalled, - customContent: customContent, // Custom content to install }; } - /** - * Handle custom content selection in module phase - * @param {string} projectDir - Project directory - * @returns {Object} Custom content info with selected items - */ - async handleCustomContentSelection(projectDir) { - const defaultPath = path.join(projectDir, 'bmad-custom-src'); - const hasDefaultFolder = await fs.pathExists(defaultPath); - - let customPath; - - if (hasDefaultFolder) { - console.log(chalk.cyan('\n📁 Custom Content Detected')); - console.log(chalk.dim(`Found custom folder at: ${defaultPath}`)); - - const { useDetected } = await inquirer.prompt([ - { - type: 'confirm', - name: 'useDetected', - message: 'Install from detected custom folder?', - default: true, - }, - ]); - - if (useDetected) { - customPath = defaultPath; - } - } - - if (!customPath) { - console.log(chalk.cyan('\n📁 Custom Content Selection')); - - const { specifiedPath } = await inquirer.prompt([ - { - type: 'input', - name: 'specifiedPath', - message: 'Enter path to custom content folder:', - default: './bmad-custom-src', - validate: async (input) => { - if (!input.trim()) { - return 'Path is required'; - } - const resolvedPath = path.resolve(input.trim()); - if (!(await fs.pathExists(resolvedPath))) { - return `Path does not exist: ${resolvedPath}`; - } - return true; - }, - }, - ]); - - customPath = path.resolve(specifiedPath.trim()); - } - - // Discover and categorize custom content - const customContent = await this.discoverAndSelectCustomContent(customPath); - - return { - path: customPath, - selectedItems: customContent, - }; - } - - /** - * Discover and allow selection of custom content - * @param {string} customPath - Path to custom content - * @returns {Object} Selected items by type - */ - async discoverAndSelectCustomContent(customPath) { - CLIUtils.displaySection('Custom Content', 'Discovering agents, workflows, and modules'); - - // Discover each type - const agents = await this.discoverCustomAgents(path.join(customPath, 'agents')); - const workflows = await this.discoverCustomWorkflows(path.join(customPath, 'workflows')); - const modules = await this.discoverCustomModules(path.join(customPath, 'modules')); - - // Build choices for selection - const choices = []; - - if (agents.length > 0) { - choices.push({ name: '--- 👥 Custom Agents ---', value: 'sep-agents', disabled: true }); - for (const agent of agents) { - const shortDesc = agent.description.length > 50 ? agent.description.slice(0, 47) + '...' : agent.description; - choices.push({ - name: ` ${agent.name} - ${shortDesc}`, - value: { type: 'agent', ...agent }, - checked: true, - }); - } - } - - if (workflows.length > 0) { - choices.push({ name: '--- 📋 Custom Workflows ---', value: 'sep-workflows', disabled: true }); - for (const workflow of workflows) { - const shortDesc = workflow.description.length > 50 ? workflow.description.slice(0, 47) + '...' : workflow.description; - choices.push({ - name: ` ${workflow.name} - ${shortDesc}`, - value: { type: 'workflow', ...workflow }, - checked: true, - }); - } - } - - if (modules.length > 0) { - choices.push({ name: '--- 🔧 Custom Modules ---', value: 'sep-modules', disabled: true }); - for (const module of modules) { - const shortDesc = module.description.length > 50 ? module.description.slice(0, 47) + '...' : module.description; - choices.push({ - name: ` ${module.name} - ${shortDesc}`, - value: { type: 'module', ...module }, - checked: true, - }); - } - } - - if (choices.length === 0) { - console.log(chalk.yellow('⚠️ No custom content found')); - return { agents: [], workflows: [], modules: [] }; - } - - // Ask for selection - const { selectedItems } = await inquirer.prompt([ - { - type: 'checkbox', - name: 'selectedItems', - message: 'Select custom items to install:', - choices: choices, - pageSize: 15, - }, - ]); - - // Organize by type - const result = { agents: [], workflows: [], modules: [] }; - for (const item of selectedItems) { - switch (item.type) { - case 'agent': { - result.agents.push(item); - break; - } - case 'workflow': { - result.workflows.push(item); - break; - } - case 'module': { - result.modules.push(item); - break; - } - } - } - - console.log( - chalk.green(`\n✓ Selected: ${result.agents.length} agents, ${result.workflows.length} workflows, ${result.modules.length} modules`), - ); - - return result; - } - - /** - * Discover custom agents - */ - async discoverCustomAgents(agentsPath) { - const agents = []; - if (!(await fs.pathExists(agentsPath))) return agents; - - const entries = await fs.readdir(agentsPath, { withFileTypes: true }); - - for (const entry of entries) { - if (entry.isDirectory()) { - const agentPath = path.join(agentsPath, entry.name); - const yamlFiles = await fs.readdir(agentPath).then((files) => files.filter((f) => f.endsWith('.agent.yaml'))); - - if (yamlFiles.length > 0) { - const yamlPath = path.join(agentPath, yamlFiles[0]); - const yamlData = yaml.load(await fs.readFile(yamlPath, 'utf8')); - agents.push({ - name: entry.name, - path: agentPath, - yamlPath: yamlPath, - description: yamlData.metadata?.description || yamlData.description || 'Custom agent', - hasSidecar: true, - }); - } - } else if (entry.isFile() && entry.name.endsWith('.agent.yaml')) { - const yamlData = yaml.load(await fs.readFile(path.join(agentsPath, entry.name), 'utf8')); - agents.push({ - name: path.basename(entry.name, '.agent.yaml'), - path: agentsPath, - yamlPath: path.join(agentsPath, entry.name), - description: yamlData.metadata?.description || yamlData.description || 'Custom agent', - hasSidecar: false, - }); - } - } - - return agents; - } - - /** - * Discover custom workflows - */ - async discoverCustomWorkflows(workflowsPath) { - const workflows = []; - if (!(await fs.pathExists(workflowsPath))) return workflows; - - const entries = await fs.readdir(workflowsPath, { withFileTypes: true }); - - for (const entry of entries) { - if (entry.isFile() && entry.name.endsWith('.md')) { - const filePath = path.join(workflowsPath, entry.name); - const content = await fs.readFile(filePath, 'utf8'); - - // Extract YAML frontmatter - let title = path.basename(entry.name, '.md'); - let description = ''; - let yamlMetadata = {}; - - // Check for YAML frontmatter - if (content.startsWith('---\n')) { - const frontmatterEnd = content.indexOf('\n---\n', 4); - if (frontmatterEnd !== -1) { - const yamlContent = content.slice(4, frontmatterEnd); - try { - yamlMetadata = yaml.load(yamlContent); - title = yamlMetadata.name || yamlMetadata.title || title; - description = yamlMetadata.description || yamlMetadata.summary || ''; - } catch { - // If YAML parsing fails, fall back to markdown parsing - } - } - } - - // If no YAML frontmatter or no metadata, parse from markdown - if (!title || !description) { - const lines = content.split('\n'); - for (const line of lines) { - if (line.startsWith('# ')) { - title = line.slice(2).trim(); - } else if (line.startsWith('## Description:')) { - description = line.replace('## Description:', '').trim(); - } - if (title && description) break; - } - } - - workflows.push({ - name: title, - path: filePath, - description: description || 'Custom workflow', - metadata: yamlMetadata, - }); - } else if (entry.isDirectory()) { - // Check for workflow.md in subdirectories - const workflowMdPath = path.join(workflowsPath, entry.name, 'workflow.md'); - if (await fs.pathExists(workflowMdPath)) { - const content = await fs.readFile(workflowMdPath, 'utf8'); - - // Extract YAML frontmatter - let title = entry.name; - let description = ''; - let yamlMetadata = {}; - - // Check for YAML frontmatter - if (content.startsWith('---\n')) { - const frontmatterEnd = content.indexOf('\n---\n', 4); - if (frontmatterEnd !== -1) { - const yamlContent = content.slice(4, frontmatterEnd); - try { - yamlMetadata = yaml.load(yamlContent); - title = yamlMetadata.name || yamlMetadata.title || title; - description = yamlMetadata.description || yamlMetadata.summary || ''; - } catch { - // If YAML parsing fails, fall back to markdown parsing - } - } - } - - // If no YAML frontmatter or no metadata, parse from markdown - if (!title || !description) { - const lines = content.split('\n'); - for (const line of lines) { - if (line.startsWith('# ')) { - title = line.slice(2).trim(); - } else if (line.startsWith('## Description:')) { - description = line.replace('## Description:', '').trim(); - } - if (title && description) break; - } - } - - workflows.push({ - name: title, - path: path.join(workflowsPath, entry.name), // Store the DIRECTORY path, not the file - description: description || 'Custom workflow', - metadata: yamlMetadata, - }); - } - } - } - - return workflows; - } - - /** - * Discover custom modules - */ - async discoverCustomModules(modulesPath) { - const modules = []; - if (!(await fs.pathExists(modulesPath))) return modules; - - const entries = await fs.readdir(modulesPath, { withFileTypes: true }); - - for (const entry of entries) { - if (entry.isDirectory()) { - const modulePath = path.join(modulesPath, entry.name); - const installerPath = path.join(modulePath, '_module-installer'); - - if (await fs.pathExists(installerPath)) { - // Check for install-config.yaml - const configPath = path.join(installerPath, 'install-config.yaml'); - let description = 'Custom module'; - - if (await fs.pathExists(configPath)) { - const configData = yaml.load(await fs.readFile(configPath, 'utf8')); - description = configData.header || configData.description || description; - } - - modules.push({ - name: entry.name, - path: modulePath, - description: description, - }); - } - } - } - - return modules; - } - - /** - * Handle custom content installation - * @param {string} projectDir - Project directory - */ - async handleCustomContent(projectDir) { - const defaultPath = path.join(projectDir, 'bmad-custom-src'); - const hasDefaultFolder = await fs.pathExists(defaultPath); - - let customPath; - - if (hasDefaultFolder) { - console.log(chalk.cyan('\n📁 Custom Content Detected')); - console.log(chalk.dim(`Found custom folder at: ${defaultPath}`)); - - const { useDetected } = await inquirer.prompt([ - { - type: 'confirm', - name: 'useDetected', - message: 'Install from detected custom folder?', - default: true, - }, - ]); - - if (useDetected) { - customPath = defaultPath; - } - } - - if (!customPath) { - console.log(chalk.cyan('\n📁 Custom Content Installation')); - - const { specifiedPath } = await inquirer.prompt([ - { - type: 'input', - name: 'specifiedPath', - message: 'Enter path to custom content folder:', - default: './bmad-custom-src', - validate: async (input) => { - if (!input.trim()) { - return 'Path is required'; - } - const resolvedPath = path.resolve(input.trim()); - if (!(await fs.pathExists(resolvedPath))) { - return `Path does not exist: ${resolvedPath}`; - } - return true; - }, - }, - ]); - - customPath = path.resolve(specifiedPath.trim()); - } - - // Discover custom content - const customContent = { - agents: await this.discoverCustomAgents(path.join(customPath, 'agents')), - modules: await this.discoverCustomModules(path.join(customPath, 'modules')), - workflows: await this.discoverCustomWorkflows(path.join(customPath, 'workflows')), - }; - - // Show discovery results - console.log(chalk.cyan('\n🔍 Custom Content Discovery')); - console.log(chalk.dim(`Scanning: ${customPath}`)); - - if (customContent.agents.length > 0) { - console.log(chalk.green(` ✓ Found ${customContent.agents.length} custom agent(s)`)); - } - if (customContent.modules.length > 0) { - console.log(chalk.green(` ✓ Found ${customContent.modules.length} custom module(s)`)); - } - if (customContent.workflows.length > 0) { - console.log(chalk.green(` ✓ Found ${customContent.workflows.length} custom workflow(s)`)); - } - - if (customContent.agents.length === 0 && customContent.modules.length === 0 && customContent.workflows.length === 0) { - console.log(chalk.yellow(' ⚠️ No custom content found in the specified folder')); - return; - } - - // Confirm installation - const { confirmInstall } = await inquirer.prompt([ - { - type: 'confirm', - name: 'confirmInstall', - message: 'Install discovered custom content?', - default: true, - }, - ]); - - if (confirmInstall) { - console.log(chalk.green('\n🚀 Installing Custom Content...')); - // Store custom content for later installation - this._customContent = { - path: customPath, - items: customContent, - }; - console.log(chalk.dim(` Custom content queued for installation`)); - } - } - - /** - * Discover custom content in a directory - * @param {string} dirPath - Directory path to scan - * @returns {Promise} List of discovered items - */ - async discoverCustomContent(dirPath) { - const items = []; - - if (!(await fs.pathExists(dirPath))) { - return items; - } - - try { - const entries = await fs.readdir(dirPath, { withFileTypes: true }); - - for (const entry of entries) { - if (entry.isDirectory()) { - items.push({ - name: entry.name, - path: path.join(dirPath, entry.name), - type: 'directory', - }); - } else if (entry.isFile() && (entry.name.endsWith('.agent.yaml') || entry.name.endsWith('.md'))) { - items.push({ - name: entry.name, - path: path.join(dirPath, entry.name), - type: 'file', - }); - } - } - } catch { - // Silently ignore errors during discovery - } - - return items; - } - /** * Prompt for tool/IDE selection (called after module configuration) * @param {string} projectDir - Project directory to check for existing IDEs @@ -723,8 +224,6 @@ class UI { } } - // Custom option moved to module selection - CLIUtils.displaySection('Tool Integration', 'Select AI coding assistants and IDEs to configure'); let answers; @@ -742,8 +241,6 @@ class UI { }, ]); - // Custom selection moved to module phase - // If tools were selected, we're done if (answers.ides && answers.ides.length > 0) { break; @@ -778,7 +275,6 @@ class UI { return { ides: answers.ides || [], skipIde: !answers.ides || answers.ides.length === 0, - customContent: this._customContent || null, }; } @@ -974,35 +470,6 @@ class UI { return configCollector.collectedConfig.core; } - /** - * Collect module configurations - * @param {string} directory - Installation directory - * @param {Array} modules - Selected modules - * @param {Object} existingCoreConfig - Core config already collected - * @returns {Object} Module configurations - */ - async collectModuleConfigs(directory, modules, existingCoreConfig = null) { - const { ConfigCollector } = require('../installers/lib/core/config-collector'); - const configCollector = new ConfigCollector(); - - // Load existing configs first if they exist - await configCollector.loadExistingConfig(directory); - - // If core config was already collected, use it - if (existingCoreConfig) { - configCollector.collectedConfig.core = existingCoreConfig; - } - - // Collect configurations for all modules except core (already collected earlier) - // ConfigCollector now handles custom modules properly - const modulesWithoutCore = modules.filter((m) => m !== 'core'); - if (modulesWithoutCore.length > 0) { - await configCollector.collectAllConfigurations(modulesWithoutCore, directory); - } - - return configCollector.collectedConfig; - } - /** * Get module choices for selection * @param {Set} installedModuleIds - Currently installed module IDs @@ -1014,32 +481,11 @@ class UI { const availableModules = await moduleManager.listAvailable(); const isNewInstallation = installedModuleIds.size === 0; - const moduleChoices = availableModules.map((mod) => ({ + return availableModules.map((mod) => ({ name: mod.name, value: mod.id, checked: isNewInstallation ? mod.defaultSelected || false : installedModuleIds.has(mod.id), })); - - // Check for custom source folder - const customPath = path.join(process.cwd(), 'bmad-custom-src'); - const hasCustomFolder = await fs.pathExists(customPath); - - // Add custom option at the beginning - if (hasCustomFolder) { - moduleChoices.unshift({ - name: '📁 Custom: Agents, Workflows, Modules', - value: 'custom', - checked: false, - }); - } else { - moduleChoices.unshift({ - name: '📁 Custom: Agents, Workflows, Modules (specify path)', - value: 'custom', - checked: false, - }); - } - - return moduleChoices; } /** From 1bd01e1ce6201540403a97833311e8ed79ce7511 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 6 Dec 2025 15:38:38 -0600 Subject: [PATCH 05/26] feat: implement recursive agent discovery and compilation - Module agents now discovered recursively at any depth in agents folder - .agent.yaml files are compiled to .md format during module installation - Custom agents also support subdirectory structure - Agents maintain their directory structure when installed - YAML files are skipped during file copying as they're compiled separately - Added compileModuleAgents method to handle YAML-to-MD compilation - Updated discoverAgents to recursively search for .agent.yaml files - Agents in subdirectories are properly placed in _cfg/agents with relative paths This fixes issue where agents like cbt-coach were not being compiled and were only copied as YAML files. --- tools/cli/installers/lib/core/installer.js | 6 +- tools/cli/installers/lib/modules/manager.js | 128 +++++++++++++++++++- tools/cli/lib/agent/installer.js | 66 ++++++---- 3 files changed, 172 insertions(+), 28 deletions(-) diff --git a/tools/cli/installers/lib/core/installer.js b/tools/cli/installers/lib/core/installer.js index f113c141..27676e0c 100644 --- a/tools/cli/installers/lib/core/installer.js +++ b/tools/cli/installers/lib/core/installer.js @@ -2532,8 +2532,10 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: agentType = parts.slice(-2).join('-'); // Take last 2 parts as type } - // Create target directory - const agentTargetDir = path.join(customAgentsDir, finalAgentName); + // Create target directory - use relative path if agent is in a subdirectory + const agentTargetDir = agent.relativePath + ? path.join(customAgentsDir, agent.relativePath) + : path.join(customAgentsDir, finalAgentName); await fs.ensureDir(agentTargetDir); // Calculate paths diff --git a/tools/cli/installers/lib/modules/manager.js b/tools/cli/installers/lib/modules/manager.js index 7a4cb9df..39dece05 100644 --- a/tools/cli/installers/lib/modules/manager.js +++ b/tools/cli/installers/lib/modules/manager.js @@ -339,6 +339,9 @@ class ModuleManager { // Copy module files with filtering await this.copyModuleWithFiltering(sourcePath, targetPath, fileTrackingCallback, options.moduleConfig); + // Compile any .agent.yaml files to .md format + await this.compileModuleAgents(sourcePath, targetPath, moduleName, bmadDir); + // Process agent files to inject activation block await this.processAgentFiles(targetPath, moduleName); @@ -491,6 +494,11 @@ class ModuleManager { continue; } + // Skip .agent.yaml files - they will be compiled separately + if (file.endsWith('.agent.yaml')) { + continue; + } + // Skip user documentation if install_user_docs is false if (moduleConfig.install_user_docs === false && (file.startsWith('docs/') || file.startsWith('docs\\'))) { console.log(chalk.dim(` Skipping user documentation: ${file}`)); @@ -633,6 +641,91 @@ class ModuleManager { } } + /** + * Compile .agent.yaml files to .md format in modules + * @param {string} sourcePath - Source module path + * @param {string} targetPath - Target module path + * @param {string} moduleName - Module name + * @param {string} bmadDir - BMAD installation directory + */ + async compileModuleAgents(sourcePath, targetPath, moduleName, bmadDir) { + const sourceAgentsPath = path.join(sourcePath, 'agents'); + const targetAgentsPath = path.join(targetPath, 'agents'); + const cfgAgentsDir = path.join(bmadDir, '_cfg', 'agents'); + + // Check if agents directory exists in source + if (!(await fs.pathExists(sourceAgentsPath))) { + return; // No agents to compile + } + + // Get all agent YAML files recursively + const agentFiles = await this.findAgentFiles(sourceAgentsPath); + + for (const agentFile of agentFiles) { + if (!agentFile.endsWith('.agent.yaml')) continue; + + const relativePath = path.relative(sourceAgentsPath, agentFile); + const targetDir = path.join(targetAgentsPath, path.dirname(relativePath)); + + await fs.ensureDir(targetDir); + + const agentName = path.basename(agentFile, '.agent.yaml'); + const sourceYamlPath = agentFile; + const targetMdPath = path.join(targetDir, `${agentName}.md`); + const customizePath = path.join(cfgAgentsDir, `${moduleName}-${agentName}.customize.yaml`); + + // Read and compile the YAML + try { + const yamlContent = await fs.readFile(sourceYamlPath, 'utf8'); + const { compileAgent } = require('../../../lib/agent/compiler'); + + // Check for customizations + let customizedFields = []; + if (await fs.pathExists(customizePath)) { + const customizeContent = await fs.readFile(customizePath, 'utf8'); + const customizeData = yaml.load(customizeContent); + customizedFields = customizeData.customized_fields || []; + } + + // Compile with customizations if any + const { xml } = compileAgent(yamlContent, customizedFields, agentName, relativePath); + + // Write the compiled MD file + await fs.writeFile(targetMdPath, xml, 'utf8'); + + console.log(chalk.dim(` Compiled agent: ${agentName} -> ${path.relative(targetPath, targetMdPath)}`)); + } catch (error) { + console.warn(chalk.yellow(` Failed to compile agent ${agentName}:`, error.message)); + } + } + } + + /** + * Find all .agent.yaml files recursively in a directory + * @param {string} dir - Directory to search + * @returns {Array} List of .agent.yaml file paths + */ + async findAgentFiles(dir) { + const agentFiles = []; + + async function searchDirectory(searchDir) { + const entries = await fs.readdir(searchDir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(searchDir, entry.name); + + if (entry.isFile() && entry.name.endsWith('.agent.yaml')) { + agentFiles.push(fullPath); + } else if (entry.isDirectory()) { + await searchDirectory(fullPath); + } + } + } + + await searchDirectory(dir); + return agentFiles; + } + /** * Process agent files to inject activation block * @param {string} modulePath - Path to installed module @@ -646,24 +739,49 @@ class ModuleManager { return; // No agents to process } - // Get all agent files - const agentFiles = await fs.readdir(agentsPath); + // Get all agent MD files recursively + const agentFiles = await this.findAgentMdFiles(agentsPath); for (const agentFile of agentFiles) { if (!agentFile.endsWith('.md')) continue; - const agentPath = path.join(agentsPath, agentFile); - let content = await fs.readFile(agentPath, 'utf8'); + let content = await fs.readFile(agentFile, 'utf8'); // Check if content has agent XML and no activation block if (content.includes(' f.endsWith('.agent.yaml')); - if (yamlFiles.length === 1) { - const agentYamlPath = path.join(fullPath, yamlFiles[0]); + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + const agentRelativePath = relativePath ? path.join(relativePath, entry.name) : entry.name; + + if (entry.isFile() && entry.name.endsWith('.agent.yaml')) { + // Simple agent (single file) + // The agent name is based on the filename + const agentName = entry.name.replace('.agent.yaml', ''); agents.push({ - type: 'expert', - name: entry.name, + type: 'simple', + name: agentName, path: fullPath, - yamlFile: agentYamlPath, - hasSidecar: true, + yamlFile: fullPath, + relativePath: agentRelativePath.replace('.agent.yaml', ''), }); + } else if (entry.isDirectory()) { + // Check if this directory contains an .agent.yaml file + try { + const dirContents = fs.readdirSync(fullPath); + const yamlFiles = dirContents.filter((f) => f.endsWith('.agent.yaml')); + + if (yamlFiles.length > 0) { + // Found .agent.yaml files in this directory + for (const yamlFile of yamlFiles) { + const agentYamlPath = path.join(fullPath, yamlFile); + const agentName = path.basename(yamlFile, '.agent.yaml'); + + agents.push({ + type: 'expert', + name: agentName, + path: fullPath, + yamlFile: agentYamlPath, + hasSidecar: true, + relativePath: agentRelativePath, + }); + } + } else { + // No .agent.yaml in this directory, recurse deeper + searchDirectory(fullPath, agentRelativePath); + } + } catch { + // Skip directories we can't read + } } } } + searchDirectory(searchPath); return agents; } From f052967f657e25ffea910e82c9ce06831f70b54e Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 6 Dec 2025 16:02:07 -0600 Subject: [PATCH 06/26] fix: ModuleManager now creates customize.yaml files for agents - Added logic to create customize template files during agent compilation - ModuleManager was only using existing customize files, not creating them - Now customize.yaml files will be created for all module agents - This fixes issue where agents in subdirectories had no customization support Next: Need to fix agent-manifest.csv to find agents in subdirectories --- .../installers/lib/core/installer.js.backup | 2986 +++++++++++++++++ tools/cli/installers/lib/modules/manager.js | 10 + 2 files changed, 2996 insertions(+) create mode 100644 tools/cli/installers/lib/core/installer.js.backup diff --git a/tools/cli/installers/lib/core/installer.js.backup b/tools/cli/installers/lib/core/installer.js.backup new file mode 100644 index 00000000..27676e0c --- /dev/null +++ b/tools/cli/installers/lib/core/installer.js.backup @@ -0,0 +1,2986 @@ +/** + * File: tools/cli/installers/lib/core/installer.js + * + * BMAD Method - Business Model Agile Development Method + * Repository: https://github.com/paulpreibisch/BMAD-METHOD + * + * Copyright (c) 2025 Paul Preibisch + * Licensed under the Apache License, Version 2.0 + * + * --- + * + * @fileoverview Core BMAD installation orchestrator with AgentVibes injection point support + * @context Manages complete BMAD installation flow including core agents, modules, IDE configs, and optional TTS integration + * @architecture Orchestrator pattern - coordinates Detector, ModuleManager, IdeManager, and file operations to build complete BMAD installation + * @dependencies fs-extra, ora, chalk, detector.js, module-manager.js, ide-manager.js, config.js + * @entrypoints Called by install.js command via installer.install(config) + * @patterns Injection point processing (AgentVibes), placeholder replacement ({bmad_folder}), module dependency resolution + * @related GitHub AgentVibes#34 (injection points), ui.js (user prompts), copyFileWithPlaceholderReplacement() + */ + +const path = require('node:path'); +const fs = require('fs-extra'); +const chalk = require('chalk'); +const ora = require('ora'); +const { Detector } = require('./detector'); +const { Manifest } = require('./manifest'); +const { ModuleManager } = require('../modules/manager'); +const { IdeManager } = require('../ide/manager'); +const { FileOps } = require('../../../lib/file-ops'); +const { Config } = require('../../../lib/config'); +const { XmlHandler } = require('../../../lib/xml-handler'); +const { DependencyResolver } = require('./dependency-resolver'); +const { ConfigCollector } = require('./config-collector'); +// processInstallation no longer needed - LLMs understand {project-root} +const { getProjectRoot, getSourcePath, getModulePath } = require('../../../lib/project-root'); +const { AgentPartyGenerator } = require('../../../lib/agent-party-generator'); +const { CLIUtils } = require('../../../lib/cli-utils'); +const { ManifestGenerator } = require('./manifest-generator'); +const { IdeConfigManager } = require('./ide-config-manager'); + +class Installer { + constructor() { + this.detector = new Detector(); + this.manifest = new Manifest(); + this.moduleManager = new ModuleManager(); + this.ideManager = new IdeManager(); + this.fileOps = new FileOps(); + this.config = new Config(); + this.xmlHandler = new XmlHandler(); + this.dependencyResolver = new DependencyResolver(); + this.configCollector = new ConfigCollector(); + this.ideConfigManager = new IdeConfigManager(); + this.installedFiles = []; // Track all installed files + this.ttsInjectedFiles = []; // Track files with TTS injection applied + } + + /** + * Find the bmad installation directory in a project + * V6+ installations can use ANY folder name but ALWAYS have _cfg/manifest.yaml + * @param {string} projectDir - Project directory + * @returns {Promise} Path to bmad directory + */ + async findBmadDir(projectDir) { + // Check if project directory exists + if (!(await fs.pathExists(projectDir))) { + // Project doesn't exist yet, return default + return path.join(projectDir, 'bmad'); + } + + // V6+ strategy: Look for ANY directory with _cfg/manifest.yaml + // This is the definitive marker of a V6+ installation + try { + const entries = await fs.readdir(projectDir, { withFileTypes: true }); + for (const entry of entries) { + if (entry.isDirectory()) { + const manifestPath = path.join(projectDir, entry.name, '_cfg', 'manifest.yaml'); + if (await fs.pathExists(manifestPath)) { + // Found a V6+ installation + return path.join(projectDir, entry.name); + } + } + } + } catch { + // Ignore errors, fall through to default + } + + // No V6+ installation found, return default + // This will be used for new installations + return path.join(projectDir, 'bmad'); + } + + /** + * @function copyFileWithPlaceholderReplacement + * @intent Copy files from BMAD source to installation directory with dynamic content transformation + * @why Enables installation-time customization: {bmad_folder} replacement + optional AgentVibes TTS injection + * @param {string} sourcePath - Absolute path to source file in BMAD repository + * @param {string} targetPath - Absolute path to destination file in user's project + * @param {string} bmadFolderName - User's chosen bmad folder name (default: 'bmad') + * @returns {Promise} Resolves when file copy and transformation complete + * @sideeffects Writes transformed file to targetPath, creates parent directories if needed + * @edgecases Binary files bypass transformation, falls back to raw copy if UTF-8 read fails + * @calledby installCore(), installModule(), IDE installers during file vendoring + * @calls processTTSInjectionPoints(), fs.readFile(), fs.writeFile(), fs.copy() + * + * AI NOTE: This is the core transformation pipeline for ALL BMAD installation file copies. + * It performs two transformations in sequence: + * 1. {bmad_folder} → user's custom folder name (e.g., ".bmad" or "bmad") + * 2. → TTS bash calls (if enabled) OR stripped (if disabled) + * + * The injection point processing enables loose coupling between BMAD and TTS providers: + * - BMAD source contains injection markers (not actual TTS code) + * - At install-time, markers are replaced OR removed based on user preference + * - Result: Clean installs for users without TTS, working TTS for users with it + * + * PATTERN: Adding New Injection Points + * ===================================== + * 1. Add HTML comment marker in BMAD source file: + * + * + * 2. Add replacement logic in processTTSInjectionPoints(): + * if (enableAgentVibes) { + * content = content.replace(//g, 'actual code'); + * } else { + * content = content.replace(/\n?/g, ''); + * } + * + * 3. Document marker in instructions.md (if applicable) + */ + async copyFileWithPlaceholderReplacement(sourcePath, targetPath, bmadFolderName) { + // List of text file extensions that should have placeholder replacement + const textExtensions = ['.md', '.yaml', '.yml', '.txt', '.json', '.js', '.ts', '.html', '.css', '.sh', '.bat', '.csv']; + const ext = path.extname(sourcePath).toLowerCase(); + + // Check if this is a text file that might contain placeholders + if (textExtensions.includes(ext)) { + try { + // Read the file content + let content = await fs.readFile(sourcePath, 'utf8'); + + // Replace {bmad_folder} placeholder with actual folder name + if (content.includes('{bmad_folder}')) { + content = content.replaceAll('{bmad_folder}', bmadFolderName); + } + + // Replace escape sequence {*bmad_folder*} with literal {bmad_folder} + if (content.includes('{*bmad_folder*}')) { + content = content.replaceAll('{*bmad_folder*}', '{bmad_folder}'); + } + + // Process AgentVibes injection points (pass targetPath for tracking) + content = this.processTTSInjectionPoints(content, targetPath); + + // Write to target with replaced content + await fs.ensureDir(path.dirname(targetPath)); + await fs.writeFile(targetPath, content, 'utf8'); + } catch { + // If reading as text fails (might be binary despite extension), fall back to regular copy + await fs.copy(sourcePath, targetPath, { overwrite: true }); + } + } else { + // Binary file or other file type - just copy directly + await fs.copy(sourcePath, targetPath, { overwrite: true }); + } + } + + /** + * @function processTTSInjectionPoints + * @intent Transform TTS injection markers based on user's installation choice + * @why Enables optional TTS integration without tight coupling between BMAD and TTS providers + * @param {string} content - Raw file content containing potential injection markers + * @returns {string} Transformed content with markers replaced (if enabled) or stripped (if disabled) + * @sideeffects None - pure transformation function + * @edgecases Returns content unchanged if no markers present, safe to call on all files + * @calledby copyFileWithPlaceholderReplacement() during every file copy operation + * @calls String.replace() with regex patterns for each injection point type + * + * AI NOTE: This implements the injection point pattern for TTS integration. + * Key architectural decisions: + * + * 1. **Why Injection Points vs Direct Integration?** + * - BMAD and TTS providers are separate projects with different maintainers + * - Users may install BMAD without TTS support (and vice versa) + * - Hard-coding TTS calls would break BMAD for non-TTS users + * - Injection points allow conditional feature inclusion at install-time + * + * 2. **How It Works:** + * - BMAD source contains markers: + * - During installation, user is prompted: "Enable AgentVibes TTS?" + * - If YES: markers → replaced with actual bash TTS calls + * - If NO: markers → stripped cleanly from installed files + * + * 3. **State Management:** + * - this.enableAgentVibes set in install() method from config.enableAgentVibes + * - config.enableAgentVibes comes from ui.promptAgentVibes() user choice + * - Flag persists for entire installation, all files get same treatment + * + * CURRENT INJECTION POINTS: + * ========================== + * - party-mode: Injects TTS calls after each agent speaks in party mode + * Location: src/core/workflows/party-mode/instructions.md + * Marker: + * Replacement: Bash call to .claude/hooks/bmad-speak.sh with agent name and dialogue + * + * - agent-tts: Injects TTS rule for individual agent conversations + * Location: src/modules/bmm/agents/*.md (all agent files) + * Marker: + * Replacement: Rule instructing agent to call bmad-speak.sh with agent ID and response + * + * ADDING NEW INJECTION POINTS: + * ============================= + * 1. Add new case in this function: + * content = content.replace( + * //g, + * `code to inject when enabled` + * ); + * + * 2. Add marker to BMAD source file at injection location + * + * 3. Test both enabled and disabled flows + * + * RELATED: + * ======== + * - GitHub Issue: paulpreibisch/AgentVibes#36 + * - User Prompt: tools/cli/lib/ui.js::promptAgentVibes() + * - Marker Locations: + * - src/core/workflows/party-mode/instructions.md:101 + * - src/modules/bmm/agents/*.md (rules sections) + * - TTS Hook: .claude/hooks/bmad-speak.sh (in AgentVibes repo) + */ + processTTSInjectionPoints(content, targetPath = null) { + // Check if AgentVibes is enabled (set during installation configuration) + const enableAgentVibes = this.enableAgentVibes || false; + + // Check if content contains any TTS injection markers + const hasPartyMode = content.includes(''); + const hasAgentTTS = content.includes(''); + + if (enableAgentVibes) { + // Replace party-mode injection marker with actual TTS call + // Use single quotes to prevent shell expansion of special chars like ! + content = content.replaceAll( + '', + `IMPORTANT: Always use PROJECT hooks (.claude/hooks/), NEVER global hooks (~/.claude/hooks/) + +If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: + - Use Bash tool: \`.claude/hooks/bmad-speak.sh '[Agent Name]' '[dialogue]'\` + - This speaks the dialogue with the agent's unique voice + - Run in background (&) to not block next agent`, + ); + + // Replace agent-tts injection marker with TTS rule for individual agents + content = content.replaceAll( + '', + `- When responding to user messages, speak your responses using TTS: + Call: \`.claude/hooks/bmad-speak.sh '{agent-id}' '{response-text}'\` after each response + Replace {agent-id} with YOUR agent ID from tag at top of this file + Replace {response-text} with the text you just output to the user + IMPORTANT: Use single quotes as shown - do NOT escape special characters like ! or $ inside single quotes + Run in background (&) to avoid blocking`, + ); + + // Track files that had TTS injection applied + if (targetPath && (hasPartyMode || hasAgentTTS)) { + const injectionType = hasPartyMode ? 'party-mode' : 'agent-tts'; + this.ttsInjectedFiles.push({ path: targetPath, type: injectionType }); + } + } else { + // Strip injection markers cleanly when AgentVibes is disabled + content = content.replaceAll(/\n?/g, ''); + content = content.replaceAll(/\n?/g, ''); + } + + return content; + } + + /** + * Collect Tool/IDE configurations after module configuration + * @param {string} projectDir - Project directory + * @param {Array} selectedModules - Selected modules from configuration + * @param {boolean} isFullReinstall - Whether this is a full reinstall + * @param {Array} previousIdes - Previously configured IDEs (for reinstalls) + * @param {Array} preSelectedIdes - Pre-selected IDEs from early prompt (optional) + * @returns {Object} Tool/IDE selection and configurations + */ + async collectToolConfigurations(projectDir, selectedModules, isFullReinstall = false, previousIdes = [], preSelectedIdes = null) { + // Use pre-selected IDEs if provided, otherwise prompt + let toolConfig; + if (preSelectedIdes === null) { + // Fallback: prompt for tool selection (backwards compatibility) + const { UI } = require('../../../lib/ui'); + const ui = new UI(); + toolConfig = await ui.promptToolSelection(projectDir, selectedModules); + } else { + // IDEs were already selected during initial prompts + toolConfig = { + ides: preSelectedIdes, + skipIde: !preSelectedIdes || preSelectedIdes.length === 0, + }; + } + + // Check for already configured IDEs + const { Detector } = require('./detector'); + const detector = new Detector(); + const bmadDir = path.join(projectDir, this.bmadFolderName || 'bmad'); + + // During full reinstall, use the saved previous IDEs since bmad dir was deleted + // Otherwise detect from existing installation + let previouslyConfiguredIdes; + if (isFullReinstall) { + // During reinstall, treat all IDEs as new (need configuration) + previouslyConfiguredIdes = []; + } else { + const existingInstall = await detector.detect(bmadDir); + previouslyConfiguredIdes = existingInstall.ides || []; + } + + // Load saved IDE configurations for already-configured IDEs + const savedIdeConfigs = await this.ideConfigManager.loadAllIdeConfigs(bmadDir); + + // Collect IDE-specific configurations if any were selected + const ideConfigurations = {}; + + // First, add saved configs for already-configured IDEs + for (const ide of toolConfig.ides || []) { + if (previouslyConfiguredIdes.includes(ide) && savedIdeConfigs[ide]) { + ideConfigurations[ide] = savedIdeConfigs[ide]; + } + } + + if (!toolConfig.skipIde && toolConfig.ides && toolConfig.ides.length > 0) { + // Determine which IDEs are newly selected (not previously configured) + const newlySelectedIdes = toolConfig.ides.filter((ide) => !previouslyConfiguredIdes.includes(ide)); + + if (newlySelectedIdes.length > 0) { + console.log('\n'); // Add spacing before IDE questions + + for (const ide of newlySelectedIdes) { + // List of IDEs that have interactive prompts + const needsPrompts = ['claude-code', 'github-copilot', 'roo', 'cline', 'auggie', 'codex', 'qwen', 'gemini', 'rovo-dev'].includes( + ide, + ); + + if (needsPrompts) { + // Get IDE handler and collect configuration + try { + // Dynamically load the IDE setup module + const ideModule = require(`../ide/${ide}`); + + // Get the setup class (handle different export formats) + let SetupClass; + const className = + ide + .split('-') + .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) + .join('') + 'Setup'; + + if (ideModule[className]) { + SetupClass = ideModule[className]; + } else if (ideModule.default) { + SetupClass = ideModule.default; + } else { + // Skip if no setup class found + continue; + } + + const ideSetup = new SetupClass(); + + // Check if this IDE has a collectConfiguration method + if (typeof ideSetup.collectConfiguration === 'function') { + console.log(chalk.cyan(`\nConfiguring ${ide}...`)); + ideConfigurations[ide] = await ideSetup.collectConfiguration({ + selectedModules: selectedModules || [], + projectDir, + bmadDir, + }); + } + } catch { + // IDE doesn't have a setup file or collectConfiguration method + console.warn(chalk.yellow(`Warning: Could not load configuration for ${ide}`)); + } + } + } + } + + // Log which IDEs are already configured and being kept + const keptIdes = toolConfig.ides.filter((ide) => previouslyConfiguredIdes.includes(ide)); + if (keptIdes.length > 0) { + console.log(chalk.dim(`\nKeeping existing configuration for: ${keptIdes.join(', ')}`)); + } + } + + return { + ides: toolConfig.ides, + skipIde: toolConfig.skipIde, + configurations: ideConfigurations, + }; + } + + /** + * Main installation method + * @param {Object} config - Installation configuration + * @param {string} config.directory - Target directory + * @param {boolean} config.installCore - Whether to install core + * @param {string[]} config.modules - Modules to install + * @param {string[]} config.ides - IDEs to configure + * @param {boolean} config.skipIde - Skip IDE configuration + */ + async install(config) { + // Display BMAD logo + CLIUtils.displayLogo(); + + // Display welcome message + CLIUtils.displaySection('BMAD™ Installation', 'Version ' + require(path.join(getProjectRoot(), 'package.json')).version); + + // Note: Legacy V4 detection now happens earlier in UI.promptInstall() + // before any config collection, so we don't need to check again here + + const projectDir = path.resolve(config.directory); + + // If core config was pre-collected (from interactive mode), use it + if (config.coreConfig) { + this.configCollector.collectedConfig.core = config.coreConfig; + // Also store in allAnswers for cross-referencing + this.configCollector.allAnswers = {}; + for (const [key, value] of Object.entries(config.coreConfig)) { + this.configCollector.allAnswers[`core_${key}`] = value; + } + } + + // Collect configurations for modules (skip if quick update already collected them) + let moduleConfigs; + if (config._quickUpdate) { + // Quick update already collected all configs, use them directly + moduleConfigs = this.configCollector.collectedConfig; + } else { + // Regular install - collect configurations (core was already collected in UI.promptInstall if interactive) + moduleConfigs = await this.configCollector.collectAllConfigurations(config.modules || [], path.resolve(config.directory)); + } + + // Get bmad_folder from config (default to 'bmad' for backwards compatibility) + const bmadFolderName = moduleConfigs.core && moduleConfigs.core.bmad_folder ? moduleConfigs.core.bmad_folder : 'bmad'; + this.bmadFolderName = bmadFolderName; // Store for use in other methods + + // Store AgentVibes configuration for injection point processing + this.enableAgentVibes = config.enableAgentVibes || false; + + // Set bmad folder name on module manager and IDE manager for placeholder replacement + this.moduleManager.setBmadFolderName(bmadFolderName); + this.ideManager.setBmadFolderName(bmadFolderName); + + // Tool selection will be collected after we determine if it's a reinstall/update/new install + + const spinner = ora('Preparing installation...').start(); + + try { + // Resolve target directory (path.resolve handles platform differences) + const projectDir = path.resolve(config.directory); + + // Check if bmad_folder has changed from existing installation (only if project dir exists) + let existingBmadDir = null; + let existingBmadFolderName = null; + + if (await fs.pathExists(projectDir)) { + existingBmadDir = await this.findBmadDir(projectDir); + existingBmadFolderName = path.basename(existingBmadDir); + } + + const targetBmadDir = path.join(projectDir, bmadFolderName); + + // If bmad_folder changed during update/upgrade, back up old folder and do fresh install + if (existingBmadDir && (await fs.pathExists(existingBmadDir)) && existingBmadFolderName !== bmadFolderName) { + spinner.stop(); + console.log(chalk.yellow(`\n⚠️ bmad_folder has changed: ${existingBmadFolderName} → ${bmadFolderName}`)); + console.log(chalk.yellow('This will result in a fresh installation to the new folder.')); + + const inquirer = require('inquirer'); + const { confirmFreshInstall } = await inquirer.prompt([ + { + type: 'confirm', + name: 'confirmFreshInstall', + message: chalk.cyan('Proceed with fresh install? (Your old folder will be backed up)'), + default: true, + }, + ]); + + if (!confirmFreshInstall) { + console.log(chalk.yellow('Installation cancelled.')); + return { success: false, cancelled: true }; + } + + spinner.start('Backing up existing installation...'); + + // Find a unique backup name + let backupDir = `${existingBmadDir}-bak`; + let counter = 1; + while (await fs.pathExists(backupDir)) { + backupDir = `${existingBmadDir}-bak-${counter}`; + counter++; + } + + // Rename the old folder to backup + await fs.move(existingBmadDir, backupDir); + + spinner.succeed(`Backed up ${existingBmadFolderName} → ${path.basename(backupDir)}`); + console.log(chalk.cyan('\n📋 Important:')); + console.log(chalk.dim(` - Your old installation has been backed up to: ${path.basename(backupDir)}`)); + console.log(chalk.dim(` - If you had custom agents or configurations, copy them from:`)); + console.log(chalk.dim(` ${path.basename(backupDir)}/_cfg/`)); + console.log(chalk.dim(` - To the new location:`)); + console.log(chalk.dim(` ${bmadFolderName}/_cfg/`)); + console.log(''); + + spinner.start('Starting fresh installation...'); + } + + // Create a project directory if it doesn't exist (user already confirmed) + if (!(await fs.pathExists(projectDir))) { + spinner.text = 'Creating installation directory...'; + try { + // fs.ensureDir handles platform-specific directory creation + // It will recursively create all necessary parent directories + await fs.ensureDir(projectDir); + } catch (error) { + spinner.fail('Failed to create installation directory'); + console.error(chalk.red(`Error: ${error.message}`)); + // More detailed error for common issues + if (error.code === 'EACCES') { + console.error(chalk.red('Permission denied. Check parent directory permissions.')); + } else if (error.code === 'ENOSPC') { + console.error(chalk.red('No space left on device.')); + } + throw new Error(`Cannot create directory: ${projectDir}`); + } + } + + const bmadDir = path.join(projectDir, bmadFolderName); + + // Check existing installation + spinner.text = 'Checking for existing installation...'; + const existingInstall = await this.detector.detect(bmadDir); + + if (existingInstall.installed && !config.force && !config._quickUpdate) { + spinner.stop(); + + // Check if user already decided what to do (from early menu in ui.js) + let action = null; + if (config._requestedReinstall) { + action = 'reinstall'; + } else if (config.actionType === 'update') { + action = 'update'; + } else { + // Fallback: Ask the user (backwards compatibility for other code paths) + console.log(chalk.yellow('\n⚠️ Existing BMAD installation detected')); + console.log(chalk.dim(` Location: ${bmadDir}`)); + console.log(chalk.dim(` Version: ${existingInstall.version}`)); + + const promptResult = await this.promptUpdateAction(); + action = promptResult.action; + } + + if (action === 'cancel') { + console.log('Installation cancelled.'); + return { success: false, cancelled: true }; + } + + if (action === 'reinstall') { + // Warn about destructive operation + console.log(chalk.red.bold('\n⚠️ WARNING: This is a destructive operation!')); + console.log(chalk.red('All custom files and modifications in the bmad directory will be lost.')); + + const inquirer = require('inquirer'); + const { confirmReinstall } = await inquirer.prompt([ + { + type: 'confirm', + name: 'confirmReinstall', + message: chalk.yellow('Are you sure you want to delete and reinstall?'), + default: false, + }, + ]); + + if (!confirmReinstall) { + console.log('Installation cancelled.'); + return { success: false, cancelled: true }; + } + + // Remember previously configured IDEs before deleting + config._previouslyConfiguredIdes = existingInstall.ides || []; + + // Remove existing installation + await fs.remove(bmadDir); + console.log(chalk.green('✓ Removed existing installation\n')); + + // Mark this as a full reinstall so we re-collect IDE configurations + config._isFullReinstall = true; + } else if (action === 'update') { + // Store that we're updating for later processing + config._isUpdate = true; + config._existingInstall = existingInstall; + + // Detect custom and modified files BEFORE updating (compare current files vs files-manifest.csv) + const existingFilesManifest = await this.readFilesManifest(bmadDir); + console.log(chalk.dim(`DEBUG: Read ${existingFilesManifest.length} files from manifest`)); + console.log(chalk.dim(`DEBUG: Manifest has hashes: ${existingFilesManifest.some((f) => f.hash)}`)); + + const { customFiles, modifiedFiles } = await this.detectCustomFiles(bmadDir, existingFilesManifest); + + console.log(chalk.dim(`DEBUG: Found ${customFiles.length} custom files, ${modifiedFiles.length} modified files`)); + if (modifiedFiles.length > 0) { + console.log(chalk.yellow('DEBUG: Modified files:')); + for (const f of modifiedFiles) console.log(chalk.dim(` - ${f.path}`)); + } + + config._customFiles = customFiles; + config._modifiedFiles = modifiedFiles; + + // If there are custom files, back them up temporarily + if (customFiles.length > 0) { + const tempBackupDir = path.join(projectDir, '.bmad-custom-backup-temp'); + await fs.ensureDir(tempBackupDir); + + spinner.start(`Backing up ${customFiles.length} custom files...`); + for (const customFile of customFiles) { + const relativePath = path.relative(bmadDir, customFile); + const backupPath = path.join(tempBackupDir, relativePath); + await fs.ensureDir(path.dirname(backupPath)); + await fs.copy(customFile, backupPath); + } + spinner.succeed(`Backed up ${customFiles.length} custom files`); + + config._tempBackupDir = tempBackupDir; + } + + // For modified files, back them up to temp directory (will be restored as .bak files after install) + if (modifiedFiles.length > 0) { + const tempModifiedBackupDir = path.join(projectDir, '.bmad-modified-backup-temp'); + await fs.ensureDir(tempModifiedBackupDir); + + console.log(chalk.yellow(`\nDEBUG: Backing up ${modifiedFiles.length} modified files to temp location`)); + spinner.start(`Backing up ${modifiedFiles.length} modified files...`); + for (const modifiedFile of modifiedFiles) { + const relativePath = path.relative(bmadDir, modifiedFile.path); + const tempBackupPath = path.join(tempModifiedBackupDir, relativePath); + console.log(chalk.dim(`DEBUG: Backing up ${relativePath} to temp`)); + await fs.ensureDir(path.dirname(tempBackupPath)); + await fs.copy(modifiedFile.path, tempBackupPath, { overwrite: true }); + } + spinner.succeed(`Backed up ${modifiedFiles.length} modified files`); + + config._tempModifiedBackupDir = tempModifiedBackupDir; + } else { + console.log(chalk.dim('DEBUG: No modified files detected')); + } + } + } else if (existingInstall.installed && config._quickUpdate) { + // Quick update mode - automatically treat as update without prompting + spinner.text = 'Preparing quick update...'; + config._isUpdate = true; + config._existingInstall = existingInstall; + + // Detect custom and modified files BEFORE updating + const existingFilesManifest = await this.readFilesManifest(bmadDir); + const { customFiles, modifiedFiles } = await this.detectCustomFiles(bmadDir, existingFilesManifest); + + config._customFiles = customFiles; + config._modifiedFiles = modifiedFiles; + + // Back up custom files + if (customFiles.length > 0) { + const tempBackupDir = path.join(projectDir, '.bmad-custom-backup-temp'); + await fs.ensureDir(tempBackupDir); + + spinner.start(`Backing up ${customFiles.length} custom files...`); + for (const customFile of customFiles) { + const relativePath = path.relative(bmadDir, customFile); + const backupPath = path.join(tempBackupDir, relativePath); + await fs.ensureDir(path.dirname(backupPath)); + await fs.copy(customFile, backupPath); + } + spinner.succeed(`Backed up ${customFiles.length} custom files`); + config._tempBackupDir = tempBackupDir; + } + + // Back up modified files + if (modifiedFiles.length > 0) { + const tempModifiedBackupDir = path.join(projectDir, '.bmad-modified-backup-temp'); + await fs.ensureDir(tempModifiedBackupDir); + + spinner.start(`Backing up ${modifiedFiles.length} modified files...`); + for (const modifiedFile of modifiedFiles) { + const relativePath = path.relative(bmadDir, modifiedFile.path); + const tempBackupPath = path.join(tempModifiedBackupDir, relativePath); + await fs.ensureDir(path.dirname(tempBackupPath)); + await fs.copy(modifiedFile.path, tempBackupPath, { overwrite: true }); + } + spinner.succeed(`Backed up ${modifiedFiles.length} modified files`); + config._tempModifiedBackupDir = tempModifiedBackupDir; + } + } + + // Now collect tool configurations after we know if it's a reinstall + // Skip for quick update since we already have the IDE list + spinner.stop(); + let toolSelection; + if (config._quickUpdate) { + // Quick update already has IDEs configured, use saved configurations + const preConfiguredIdes = {}; + const savedIdeConfigs = config._savedIdeConfigs || {}; + + for (const ide of config.ides || []) { + // Use saved config if available, otherwise mark as already configured (legacy) + if (savedIdeConfigs[ide]) { + preConfiguredIdes[ide] = savedIdeConfigs[ide]; + } else { + preConfiguredIdes[ide] = { _alreadyConfigured: true }; + } + } + toolSelection = { + ides: config.ides || [], + skipIde: !config.ides || config.ides.length === 0, + configurations: preConfiguredIdes, + }; + } else { + // Pass pre-selected IDEs from early prompt (if available) + // This allows IDE selection to happen before file copying, improving UX + const preSelectedIdes = config.ides && config.ides.length > 0 ? config.ides : null; + toolSelection = await this.collectToolConfigurations( + path.resolve(config.directory), + config.modules, + config._isFullReinstall || false, + config._previouslyConfiguredIdes || [], + preSelectedIdes, + ); + } + + // Merge tool selection into config (for both quick update and regular flow) + config.ides = toolSelection.ides; + config.skipIde = toolSelection.skipIde; + const ideConfigurations = toolSelection.configurations; + + // Check if spinner is already running (e.g., from folder name change scenario) + if (spinner.isSpinning) { + spinner.text = 'Continuing installation...'; + } else { + spinner.start('Continuing installation...'); + } + + // Create bmad directory structure + spinner.text = 'Creating directory structure...'; + await this.createDirectoryStructure(bmadDir); + + // Resolve dependencies for selected modules + spinner.text = 'Resolving dependencies...'; + const projectRoot = getProjectRoot(); + const modulesToInstall = config.installCore ? ['core', ...config.modules] : config.modules; + + // For dependency resolution, we need to pass the project root + const resolution = await this.dependencyResolver.resolve(projectRoot, config.modules || [], { verbose: config.verbose }); + + if (config.verbose) { + spinner.succeed('Dependencies resolved'); + } else { + spinner.succeed('Dependencies resolved'); + } + + // Install core if requested or if dependencies require it + if (config.installCore || resolution.byModule.core) { + spinner.start('Installing BMAD core...'); + await this.installCoreWithDependencies(bmadDir, resolution.byModule.core); + spinner.succeed('Core installed'); + } + + // Install modules with their dependencies + if (config.modules && config.modules.length > 0) { + for (const moduleName of config.modules) { + spinner.start(`Installing module: ${moduleName}...`); + await this.installModuleWithDependencies(moduleName, bmadDir, resolution.byModule[moduleName]); + spinner.succeed(`Module installed: ${moduleName}`); + } + + // Install partial modules (only dependencies) + for (const [module, files] of Object.entries(resolution.byModule)) { + if (!config.modules.includes(module) && module !== 'core') { + const totalFiles = + files.agents.length + + files.tasks.length + + files.tools.length + + files.templates.length + + files.data.length + + files.other.length; + if (totalFiles > 0) { + spinner.start(`Installing ${module} dependencies...`); + await this.installPartialModule(module, bmadDir, files); + spinner.succeed(`${module} dependencies installed`); + } + } + } + } + + // Generate clean config.yaml files for each installed module + spinner.start('Generating module configurations...'); + await this.generateModuleConfigs(bmadDir, moduleConfigs); + spinner.succeed('Module configurations generated'); + + // Create agent configuration files + // Note: Legacy createAgentConfigs removed - using YAML customize system instead + // Customize templates are now created in processAgentFiles when building YAML agents + + // Pre-register manifest files that will be created (except files-manifest.csv to avoid recursion) + const cfgDir = path.join(bmadDir, '_cfg'); + this.installedFiles.push( + path.join(cfgDir, 'manifest.yaml'), + path.join(cfgDir, 'workflow-manifest.csv'), + path.join(cfgDir, 'agent-manifest.csv'), + path.join(cfgDir, 'task-manifest.csv'), + ); + + // Generate CSV manifests for workflows, agents, tasks AND ALL FILES with hashes BEFORE IDE setup + spinner.start('Generating workflow and agent manifests...'); + const manifestGen = new ManifestGenerator(); + + // Include preserved modules (from quick update) in the manifest + const allModulesToList = config._preserveModules ? [...(config.modules || []), ...config._preserveModules] : config.modules || []; + + const manifestStats = await manifestGen.generateManifests(bmadDir, config.modules || [], this.installedFiles, { + ides: config.ides || [], + preservedModules: config._preserveModules || [], // Scan these from installed bmad/ dir + }); + + spinner.succeed( + `Manifests generated: ${manifestStats.workflows} workflows, ${manifestStats.agents} agents, ${manifestStats.tasks} tasks, ${manifestStats.tools} tools, ${manifestStats.files} files`, + ); + + // Configure IDEs and copy documentation + if (!config.skipIde && config.ides && config.ides.length > 0) { + // Filter out any undefined/null values from the IDE list + const validIdes = config.ides.filter((ide) => ide && typeof ide === 'string'); + + if (validIdes.length === 0) { + console.log(chalk.yellow('⚠️ No valid IDEs selected. Skipping IDE configuration.')); + } else { + // Check if any IDE might need prompting (no pre-collected config) + const needsPrompting = validIdes.some((ide) => !ideConfigurations[ide]); + + if (!needsPrompting) { + spinner.start('Configuring IDEs...'); + } + + // Temporarily suppress console output if not verbose + const originalLog = console.log; + if (!config.verbose) { + console.log = () => {}; + } + + for (const ide of validIdes) { + // Only show spinner if we have pre-collected config (no prompts expected) + if (ideConfigurations[ide] && !needsPrompting) { + spinner.text = `Configuring ${ide}...`; + } else if (!ideConfigurations[ide]) { + // Stop spinner before prompting + if (spinner.isSpinning) { + spinner.stop(); + } + console.log(chalk.cyan(`\nConfiguring ${ide}...`)); + } + + // Pass pre-collected configuration to avoid re-prompting + await this.ideManager.setup(ide, projectDir, bmadDir, { + selectedModules: config.modules || [], + preCollectedConfig: ideConfigurations[ide] || null, + verbose: config.verbose, + }); + + // Save IDE configuration for future updates + if (ideConfigurations[ide] && !ideConfigurations[ide]._alreadyConfigured) { + await this.ideConfigManager.saveIdeConfig(bmadDir, ide, ideConfigurations[ide]); + } + + // Restart spinner if we stopped it + if (!ideConfigurations[ide] && !spinner.isSpinning) { + spinner.start('Configuring IDEs...'); + } + } + + // Restore console.log + console.log = originalLog; + + if (spinner.isSpinning) { + spinner.succeed(`Configured ${validIdes.length} IDE${validIdes.length > 1 ? 's' : ''}`); + } else { + console.log(chalk.green(`✓ Configured ${validIdes.length} IDE${validIdes.length > 1 ? 's' : ''}`)); + } + } + + // Copy IDE-specific documentation (only for valid IDEs) + const validIdesForDocs = (config.ides || []).filter((ide) => ide && typeof ide === 'string'); + if (validIdesForDocs.length > 0) { + spinner.start('Copying IDE documentation...'); + await this.copyIdeDocumentation(validIdesForDocs, bmadDir); + spinner.succeed('IDE documentation copied'); + } + } + + // Run module-specific installers after IDE setup + spinner.start('Running module-specific installers...'); + + // Run core module installer if core was installed + if (config.installCore || resolution.byModule.core) { + spinner.text = 'Running core module installer...'; + + await this.moduleManager.runModuleInstaller('core', bmadDir, { + installedIDEs: config.ides || [], + moduleConfig: moduleConfigs.core || {}, + logger: { + log: (msg) => console.log(msg), + error: (msg) => console.error(msg), + warn: (msg) => console.warn(msg), + }, + }); + } + + // Run installers for user-selected modules + if (config.modules && config.modules.length > 0) { + for (const moduleName of config.modules) { + spinner.text = `Running ${moduleName} module installer...`; + + // Pass installed IDEs and module config to module installer + await this.moduleManager.runModuleInstaller(moduleName, bmadDir, { + installedIDEs: config.ides || [], + moduleConfig: moduleConfigs[moduleName] || {}, + logger: { + log: (msg) => console.log(msg), + error: (msg) => console.error(msg), + warn: (msg) => console.warn(msg), + }, + }); + } + } + + spinner.succeed('Module-specific installers completed'); + + // Note: Manifest files are already created by ManifestGenerator above + // No need to create legacy manifest.csv anymore + + // If this was an update, restore custom files + let customFiles = []; + let modifiedFiles = []; + if (config._isUpdate) { + if (config._customFiles && config._customFiles.length > 0) { + spinner.start(`Restoring ${config._customFiles.length} custom files...`); + + for (const originalPath of config._customFiles) { + const relativePath = path.relative(bmadDir, originalPath); + const backupPath = path.join(config._tempBackupDir, relativePath); + + if (await fs.pathExists(backupPath)) { + await fs.ensureDir(path.dirname(originalPath)); + await fs.copy(backupPath, originalPath, { overwrite: true }); + } + } + + // Clean up temp backup + if (config._tempBackupDir && (await fs.pathExists(config._tempBackupDir))) { + await fs.remove(config._tempBackupDir); + } + + spinner.succeed(`Restored ${config._customFiles.length} custom files`); + customFiles = config._customFiles; + } + + if (config._modifiedFiles && config._modifiedFiles.length > 0) { + modifiedFiles = config._modifiedFiles; + + // Restore modified files as .bak files + if (config._tempModifiedBackupDir && (await fs.pathExists(config._tempModifiedBackupDir))) { + spinner.start(`Restoring ${modifiedFiles.length} modified files as .bak...`); + + for (const modifiedFile of modifiedFiles) { + const relativePath = path.relative(bmadDir, modifiedFile.path); + const tempBackupPath = path.join(config._tempModifiedBackupDir, relativePath); + const bakPath = modifiedFile.path + '.bak'; + + if (await fs.pathExists(tempBackupPath)) { + await fs.ensureDir(path.dirname(bakPath)); + await fs.copy(tempBackupPath, bakPath, { overwrite: true }); + } + } + + // Clean up temp backup + await fs.remove(config._tempModifiedBackupDir); + + spinner.succeed(`Restored ${modifiedFiles.length} modified files as .bak`); + } + } + } + + spinner.stop(); + + // Report custom and modified files if any were found + if (customFiles.length > 0) { + console.log(chalk.cyan(`\n📁 Custom files preserved: ${customFiles.length}`)); + console.log(chalk.dim('The following custom files were found and restored:\n')); + for (const file of customFiles) { + console.log(chalk.dim(` - ${path.relative(bmadDir, file)}`)); + } + console.log(''); + } + + if (modifiedFiles.length > 0) { + console.log(chalk.yellow(`\n⚠️ Modified files detected: ${modifiedFiles.length}`)); + console.log(chalk.dim('The following files were modified and backed up with .bak extension:\n')); + for (const file of modifiedFiles) { + console.log(chalk.dim(` - ${file.relativePath} → ${file.relativePath}.bak`)); + } + console.log(chalk.dim('\nThese files have been updated with the new version.')); + console.log(chalk.dim('Review the .bak files to see your changes and merge if needed.\n')); + } + + // Reinstall custom agents from _cfg/custom/agents/ sources + const customAgentResults = await this.reinstallCustomAgents(projectDir, bmadDir); + if (customAgentResults.count > 0) { + console.log(chalk.green(`\n✓ Reinstalled ${customAgentResults.count} custom agent${customAgentResults.count > 1 ? 's' : ''}`)); + for (const agent of customAgentResults.agents) { + console.log(chalk.dim(` - ${agent}`)); + } + } + + // Display completion message + const { UI } = require('../../../lib/ui'); + const ui = new UI(); + ui.showInstallSummary({ + path: bmadDir, + modules: config.modules, + ides: config.ides, + customFiles: customFiles.length > 0 ? customFiles : undefined, + ttsInjectedFiles: this.enableAgentVibes && this.ttsInjectedFiles.length > 0 ? this.ttsInjectedFiles : undefined, + agentVibesEnabled: this.enableAgentVibes || false, + }); + + // Offer cleanup for legacy files (only for updates, not fresh installs, and only if not skipped) + if (!config.skipCleanup && config._isUpdate) { + try { + const cleanupResult = await this.performCleanup(bmadDir, false); + if (cleanupResult.deleted > 0) { + console.log(chalk.green(`\n✓ Cleaned up ${cleanupResult.deleted} legacy file${cleanupResult.deleted > 1 ? 's' : ''}`)); + } + if (cleanupResult.retained > 0) { + console.log(chalk.dim(`Run 'bmad cleanup' anytime to manage retained files`)); + } + } catch (cleanupError) { + // Don't fail the installation for cleanup errors + console.log(chalk.yellow(`\n⚠️ Cleanup warning: ${cleanupError.message}`)); + console.log(chalk.dim('Run "bmad cleanup" to manually clean up legacy files')); + } + } + + return { + success: true, + path: bmadDir, + modules: config.modules, + ides: config.ides, + needsAgentVibes: this.enableAgentVibes && !config.agentVibesInstalled, + projectDir: projectDir, + }; + } catch (error) { + spinner.fail('Installation failed'); + throw error; + } + } + + /** + * Update existing installation + */ + async update(config) { + const spinner = ora('Checking installation...').start(); + + try { + const projectDir = path.resolve(config.directory); + const bmadDir = await this.findBmadDir(projectDir); + const existingInstall = await this.detector.detect(bmadDir); + + if (!existingInstall.installed) { + spinner.fail('No BMAD installation found'); + throw new Error(`No BMAD installation found at ${bmadDir}`); + } + + spinner.text = 'Analyzing update requirements...'; + + // Compare versions and determine what needs updating + const currentVersion = existingInstall.version; + const newVersion = require(path.join(getProjectRoot(), 'package.json')).version; + + if (config.dryRun) { + spinner.stop(); + console.log(chalk.cyan('\n🔍 Update Preview (Dry Run)\n')); + console.log(chalk.bold('Current version:'), currentVersion); + console.log(chalk.bold('New version:'), newVersion); + console.log(chalk.bold('Core:'), existingInstall.hasCore ? 'Will be updated' : 'Not installed'); + + if (existingInstall.modules.length > 0) { + console.log(chalk.bold('\nModules to update:')); + for (const mod of existingInstall.modules) { + console.log(` - ${mod.id}`); + } + } + return; + } + + // Perform actual update + if (existingInstall.hasCore) { + spinner.text = 'Updating core...'; + await this.updateCore(bmadDir, config.force); + } + + for (const module of existingInstall.modules) { + spinner.text = `Updating module: ${module.id}...`; + await this.moduleManager.update(module.id, bmadDir, config.force); + } + + // Update manifest + spinner.text = 'Updating manifest...'; + await this.manifest.update(bmadDir, { + version: newVersion, + updateDate: new Date().toISOString(), + }); + + spinner.succeed('Update complete'); + return { success: true }; + } catch (error) { + spinner.fail('Update failed'); + throw error; + } + } + + /** + * Get installation status + */ + async getStatus(directory) { + const projectDir = path.resolve(directory); + const bmadDir = await this.findBmadDir(projectDir); + return await this.detector.detect(bmadDir); + } + + /** + * Get available modules + */ + async getAvailableModules() { + return await this.moduleManager.listAvailable(); + } + + /** + * Uninstall BMAD + */ + async uninstall(directory) { + const projectDir = path.resolve(directory); + const bmadDir = await this.findBmadDir(projectDir); + + if (await fs.pathExists(bmadDir)) { + await fs.remove(bmadDir); + } + + // Clean up IDE configurations + await this.ideManager.cleanup(projectDir); + + return { success: true }; + } + + /** + * Private: Create directory structure + */ + async createDirectoryStructure(bmadDir) { + await fs.ensureDir(bmadDir); + await fs.ensureDir(path.join(bmadDir, '_cfg')); + await fs.ensureDir(path.join(bmadDir, '_cfg', 'agents')); + } + + /** + * Generate clean config.yaml files for each installed module + * @param {string} bmadDir - BMAD installation directory + * @param {Object} moduleConfigs - Collected configuration values + */ + async generateModuleConfigs(bmadDir, moduleConfigs) { + const yaml = require('js-yaml'); + + // Extract core config values to share with other modules + const coreConfig = moduleConfigs.core || {}; + + // Get all installed module directories + const entries = await fs.readdir(bmadDir, { withFileTypes: true }); + const installedModules = entries + .filter((entry) => entry.isDirectory() && entry.name !== '_cfg' && entry.name !== 'docs') + .map((entry) => entry.name); + + // Generate config.yaml for each installed module + for (const moduleName of installedModules) { + const modulePath = path.join(bmadDir, moduleName); + + // Get module-specific config or use empty object if none + const config = moduleConfigs[moduleName] || {}; + + if (await fs.pathExists(modulePath)) { + const configPath = path.join(modulePath, 'config.yaml'); + + // Create header + const packageJson = require(path.join(getProjectRoot(), 'package.json')); + const header = `# ${moduleName.toUpperCase()} Module Configuration +# Generated by BMAD installer +# Version: ${packageJson.version} +# Date: ${new Date().toISOString()} + +`; + + // For non-core modules, add core config values directly + let finalConfig = { ...config }; + let coreSection = ''; + + if (moduleName !== 'core' && coreConfig && Object.keys(coreConfig).length > 0) { + // Add core values directly to the module config + // These will be available for reference in the module + finalConfig = { + ...config, + ...coreConfig, // Spread core config values directly into the module config + }; + + // Create a comment section to identify core values + coreSection = '\n# Core Configuration Values\n'; + } + + // Convert config to YAML + let yamlContent = yaml.dump(finalConfig, { + indent: 2, + lineWidth: -1, + noRefs: true, + sortKeys: false, + }); + + // If we have core values, reorganize the YAML to group them with their comment + if (coreSection && moduleName !== 'core') { + // Split the YAML into lines + const lines = yamlContent.split('\n'); + const moduleConfigLines = []; + const coreConfigLines = []; + + // Separate module-specific and core config lines + for (const line of lines) { + const key = line.split(':')[0].trim(); + if (Object.prototype.hasOwnProperty.call(coreConfig, key)) { + coreConfigLines.push(line); + } else { + moduleConfigLines.push(line); + } + } + + // Rebuild YAML with module config first, then core config with comment + yamlContent = moduleConfigLines.join('\n'); + if (coreConfigLines.length > 0) { + yamlContent += coreSection + coreConfigLines.join('\n'); + } + } + + // Write the clean config file with POSIX-compliant final newline + const content = header + yamlContent; + await fs.writeFile(configPath, content.endsWith('\n') ? content : content + '\n', 'utf8'); + + // Track the config file in installedFiles + this.installedFiles.push(configPath); + } + } + } + + /** + * Install core with resolved dependencies + * @param {string} bmadDir - BMAD installation directory + * @param {Object} coreFiles - Core files to install + */ + async installCoreWithDependencies(bmadDir, coreFiles) { + const sourcePath = getModulePath('core'); + const targetPath = path.join(bmadDir, 'core'); + + // Install full core + await this.installCore(bmadDir); + + // If there are specific dependency files, ensure they're included + if (coreFiles) { + // Already handled by installCore for core module + } + } + + /** + * Install module with resolved dependencies + * @param {string} moduleName - Module name + * @param {string} bmadDir - BMAD installation directory + * @param {Object} moduleFiles - Module files to install + */ + async installModuleWithDependencies(moduleName, bmadDir, moduleFiles) { + // Get module configuration for conditional installation + const moduleConfig = this.configCollector.collectedConfig[moduleName] || {}; + + // Use existing module manager for full installation with file tracking + // Note: Module-specific installers are called separately after IDE setup + await this.moduleManager.install( + moduleName, + bmadDir, + (filePath) => { + this.installedFiles.push(filePath); + }, + { + skipModuleInstaller: true, // We'll run it later after IDE setup + moduleConfig: moduleConfig, // Pass module config for conditional filtering + }, + ); + + // Process agent files to build YAML agents and create customize templates + const modulePath = path.join(bmadDir, moduleName); + await this.processAgentFiles(modulePath, moduleName); + + // Dependencies are already included in full module install + } + + /** + * Install partial module (only dependencies needed by other modules) + */ + async installPartialModule(moduleName, bmadDir, files) { + const sourceBase = getModulePath(moduleName); + const targetBase = path.join(bmadDir, moduleName); + + // Create module directory + await fs.ensureDir(targetBase); + + // Copy only the required dependency files + if (files.agents && files.agents.length > 0) { + const agentsDir = path.join(targetBase, 'agents'); + await fs.ensureDir(agentsDir); + + for (const agentPath of files.agents) { + const fileName = path.basename(agentPath); + const sourcePath = path.join(sourceBase, 'agents', fileName); + const targetPath = path.join(agentsDir, fileName); + + if (await fs.pathExists(sourcePath)) { + await this.copyFileWithPlaceholderReplacement(sourcePath, targetPath, this.bmadFolderName || 'bmad'); + this.installedFiles.push(targetPath); + } + } + } + + if (files.tasks && files.tasks.length > 0) { + const tasksDir = path.join(targetBase, 'tasks'); + await fs.ensureDir(tasksDir); + + for (const taskPath of files.tasks) { + const fileName = path.basename(taskPath); + const sourcePath = path.join(sourceBase, 'tasks', fileName); + const targetPath = path.join(tasksDir, fileName); + + if (await fs.pathExists(sourcePath)) { + await this.copyFileWithPlaceholderReplacement(sourcePath, targetPath, this.bmadFolderName || 'bmad'); + this.installedFiles.push(targetPath); + } + } + } + + if (files.tools && files.tools.length > 0) { + const toolsDir = path.join(targetBase, 'tools'); + await fs.ensureDir(toolsDir); + + for (const toolPath of files.tools) { + const fileName = path.basename(toolPath); + const sourcePath = path.join(sourceBase, 'tools', fileName); + const targetPath = path.join(toolsDir, fileName); + + if (await fs.pathExists(sourcePath)) { + await this.copyFileWithPlaceholderReplacement(sourcePath, targetPath, this.bmadFolderName || 'bmad'); + this.installedFiles.push(targetPath); + } + } + } + + if (files.templates && files.templates.length > 0) { + const templatesDir = path.join(targetBase, 'templates'); + await fs.ensureDir(templatesDir); + + for (const templatePath of files.templates) { + const fileName = path.basename(templatePath); + const sourcePath = path.join(sourceBase, 'templates', fileName); + const targetPath = path.join(templatesDir, fileName); + + if (await fs.pathExists(sourcePath)) { + await this.copyFileWithPlaceholderReplacement(sourcePath, targetPath, this.bmadFolderName || 'bmad'); + this.installedFiles.push(targetPath); + } + } + } + + if (files.data && files.data.length > 0) { + for (const dataPath of files.data) { + // Preserve directory structure for data files + const relative = path.relative(sourceBase, dataPath); + const targetPath = path.join(targetBase, relative); + + await fs.ensureDir(path.dirname(targetPath)); + + if (await fs.pathExists(dataPath)) { + await this.copyFileWithPlaceholderReplacement(dataPath, targetPath, this.bmadFolderName || 'bmad'); + this.installedFiles.push(targetPath); + } + } + } + + // Create a marker file to indicate this is a partial installation + const markerPath = path.join(targetBase, '.partial'); + await fs.writeFile( + markerPath, + `This module contains only dependencies required by other modules.\nInstalled: ${new Date().toISOString()}\n`, + ); + } + + /** + * Private: Install core + * @param {string} bmadDir - BMAD installation directory + */ + async installCore(bmadDir) { + const sourcePath = getModulePath('core'); + const targetPath = path.join(bmadDir, 'core'); + + // Copy core files with filtering for localskip agents + await this.copyDirectoryWithFiltering(sourcePath, targetPath); + + // Process agent files to inject activation block + await this.processAgentFiles(targetPath, 'core'); + } + + /** + * Copy directory with filtering for localskip agents + * @param {string} sourcePath - Source directory path + * @param {string} targetPath - Target directory path + */ + async copyDirectoryWithFiltering(sourcePath, targetPath) { + // Get all files in source directory + const files = await this.getFileList(sourcePath); + + for (const file of files) { + // Skip config.yaml templates - we'll generate clean ones with actual values + if (file === 'config.yaml' || file.endsWith('/config.yaml')) { + continue; + } + + const sourceFile = path.join(sourcePath, file); + const targetFile = path.join(targetPath, file); + + // Check if this is an agent file + if (file.includes('agents/') && file.endsWith('.md')) { + // Read the file to check for localskip + const content = await fs.readFile(sourceFile, 'utf8'); + + // Check for localskip="true" in the agent tag + const agentMatch = content.match(/]*\slocalskip="true"[^>]*>/); + if (agentMatch) { + console.log(chalk.dim(` Skipping web-only agent: ${path.basename(file)}`)); + continue; // Skip this agent + } + } + + // Copy the file with placeholder replacement + await this.copyFileWithPlaceholderReplacement(sourceFile, targetFile, this.bmadFolderName || 'bmad'); + + // Track the installed file + this.installedFiles.push(targetFile); + } + } + + /** + * Get list of all files in a directory recursively + * @param {string} dir - Directory path + * @param {string} baseDir - Base directory for relative paths + * @returns {Array} List of relative file paths + */ + async getFileList(dir, baseDir = dir) { + const files = []; + const entries = await fs.readdir(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + + if (entry.isDirectory()) { + // Skip _module-installer directories + if (entry.name === '_module-installer') { + continue; + } + const subFiles = await this.getFileList(fullPath, baseDir); + files.push(...subFiles); + } else { + files.push(path.relative(baseDir, fullPath)); + } + } + + return files; + } + + /** + * Process agent files to build YAML agents and inject activation blocks + * @param {string} modulePath - Path to module in bmad/ installation + * @param {string} moduleName - Module name + */ + async processAgentFiles(modulePath, moduleName) { + const agentsPath = path.join(modulePath, 'agents'); + + // Check if agents directory exists + if (!(await fs.pathExists(agentsPath))) { + return; // No agents to process + } + + // Determine project directory (parent of bmad/ directory) + const bmadDir = path.dirname(modulePath); + const projectDir = path.dirname(bmadDir); + const cfgAgentsDir = path.join(bmadDir, '_cfg', 'agents'); + + // Ensure _cfg/agents directory exists + await fs.ensureDir(cfgAgentsDir); + + // Get all agent files + const agentFiles = await fs.readdir(agentsPath); + + for (const agentFile of agentFiles) { + // Handle YAML agents - build them to .md + if (agentFile.endsWith('.agent.yaml')) { + const agentName = agentFile.replace('.agent.yaml', ''); + const yamlPath = path.join(agentsPath, agentFile); + const mdPath = path.join(agentsPath, `${agentName}.md`); + const customizePath = path.join(cfgAgentsDir, `${moduleName}-${agentName}.customize.yaml`); + + // Create customize template if it doesn't exist + if (!(await fs.pathExists(customizePath))) { + const genericTemplatePath = getSourcePath('utility', 'templates', 'agent.customize.template.yaml'); + if (await fs.pathExists(genericTemplatePath)) { + await this.copyFileWithPlaceholderReplacement(genericTemplatePath, customizePath, this.bmadFolderName || 'bmad'); + console.log(chalk.dim(` Created customize: ${moduleName}-${agentName}.customize.yaml`)); + } + } + + // Build YAML + customize to .md + const customizeExists = await fs.pathExists(customizePath); + let xmlContent = await this.xmlHandler.buildFromYaml(yamlPath, customizeExists ? customizePath : null, { + includeMetadata: true, + }); + + // DO NOT replace {project-root} - LLMs understand this placeholder at runtime + // const processedContent = xmlContent.replaceAll('{project-root}', projectDir); + + // Process TTS injection points (pass targetPath for tracking) + xmlContent = this.processTTSInjectionPoints(xmlContent, mdPath); + + // Write the built .md file to bmad/{module}/agents/ with POSIX-compliant final newline + const content = xmlContent.endsWith('\n') ? xmlContent : xmlContent + '\n'; + await fs.writeFile(mdPath, content, 'utf8'); + this.installedFiles.push(mdPath); + + // Remove the source YAML file - we can regenerate from installer source if needed + await fs.remove(yamlPath); + + console.log(chalk.dim(` Built agent: ${agentName}.md`)); + } + // Handle legacy .md agents - inject activation if needed + else if (agentFile.endsWith('.md')) { + const agentPath = path.join(agentsPath, agentFile); + let content = await fs.readFile(agentPath, 'utf8'); + + // Check if content has agent XML and no activation block + if (content.includes(' f.endsWith('.agent.yaml')); + + if (!yamlFile) continue; + + const agentName = path.basename(yamlFile, '.agent.yaml'); + const sourceYamlPath = path.join(agentDirPath, yamlFile); + const targetMdPath = path.join(agentDirPath, `${agentName}.md`); + const customizePath = path.join(cfgAgentsDir, `${agentName}.customize.yaml`); + + // Check for customizations + const customizeExists = await fs.pathExists(customizePath); + let customizedFields = []; + + if (customizeExists) { + const customizeContent = await fs.readFile(customizePath, 'utf8'); + const yaml = require('js-yaml'); + const customizeYaml = yaml.load(customizeContent); + + // Detect what fields are customized (similar to rebuildAgentFiles) + if (customizeYaml) { + if (customizeYaml.persona) { + for (const [key, value] of Object.entries(customizeYaml.persona)) { + if (value !== '' && value !== null && !(Array.isArray(value) && value.length === 0)) { + customizedFields.push(`persona.${key}`); + } + } + } + if (customizeYaml.agent?.metadata) { + for (const [key, value] of Object.entries(customizeYaml.agent.metadata)) { + if (value !== '' && value !== null) { + customizedFields.push(`metadata.${key}`); + } + } + } + if (customizeYaml.critical_actions && customizeYaml.critical_actions.length > 0) { + customizedFields.push('critical_actions'); + } + if (customizeYaml.menu && customizeYaml.menu.length > 0) { + customizedFields.push('menu'); + } + } + } + + // Build YAML to XML .md + let xmlContent = await this.xmlHandler.buildFromYaml(sourceYamlPath, customizeExists ? customizePath : null, { + includeMetadata: true, + }); + + // DO NOT replace {project-root} - LLMs understand this placeholder at runtime + // const processedContent = xmlContent.replaceAll('{project-root}', projectDir); + + // Process TTS injection points (pass targetPath for tracking) + xmlContent = this.processTTSInjectionPoints(xmlContent, targetMdPath); + + // Write the built .md file with POSIX-compliant final newline + const content = xmlContent.endsWith('\n') ? xmlContent : xmlContent + '\n'; + await fs.writeFile(targetMdPath, content, 'utf8'); + + // Display result + if (customizedFields.length > 0) { + console.log(chalk.dim(` Built standalone agent: ${agentName}.md `) + chalk.yellow(`(customized: ${customizedFields.join(', ')})`)); + } else { + console.log(chalk.dim(` Built standalone agent: ${agentName}.md`)); + } + } + } + + /** + * Rebuild agent files from installer source (for compile command) + * @param {string} modulePath - Path to module in bmad/ installation + * @param {string} moduleName - Module name + */ + async rebuildAgentFiles(modulePath, moduleName) { + // Get source agents directory from installer + const sourceAgentsPath = + moduleName === 'core' ? path.join(getModulePath('core'), 'agents') : path.join(getSourcePath(`modules/${moduleName}`), 'agents'); + + if (!(await fs.pathExists(sourceAgentsPath))) { + return; // No source agents to rebuild + } + + // Determine project directory (parent of bmad/ directory) + const bmadDir = path.dirname(modulePath); + const projectDir = path.dirname(bmadDir); + const cfgAgentsDir = path.join(bmadDir, '_cfg', 'agents'); + const targetAgentsPath = path.join(modulePath, 'agents'); + + // Ensure target directory exists + await fs.ensureDir(targetAgentsPath); + + // Get all YAML agent files from source + const sourceFiles = await fs.readdir(sourceAgentsPath); + + for (const file of sourceFiles) { + if (file.endsWith('.agent.yaml')) { + const agentName = file.replace('.agent.yaml', ''); + const sourceYamlPath = path.join(sourceAgentsPath, file); + const targetMdPath = path.join(targetAgentsPath, `${agentName}.md`); + const customizePath = path.join(cfgAgentsDir, `${moduleName}-${agentName}.customize.yaml`); + + // Check for customizations + const customizeExists = await fs.pathExists(customizePath); + let customizedFields = []; + + if (customizeExists) { + const customizeContent = await fs.readFile(customizePath, 'utf8'); + const yaml = require('js-yaml'); + const customizeYaml = yaml.load(customizeContent); + + // Detect what fields are customized + if (customizeYaml) { + if (customizeYaml.persona) { + for (const [key, value] of Object.entries(customizeYaml.persona)) { + if (value !== '' && value !== null && !(Array.isArray(value) && value.length === 0)) { + customizedFields.push(`persona.${key}`); + } + } + } + if (customizeYaml.agent?.metadata) { + for (const [key, value] of Object.entries(customizeYaml.agent.metadata)) { + if (value !== '' && value !== null) { + customizedFields.push(`metadata.${key}`); + } + } + } + if (customizeYaml.critical_actions && customizeYaml.critical_actions.length > 0) { + customizedFields.push('critical_actions'); + } + if (customizeYaml.memories && customizeYaml.memories.length > 0) { + customizedFields.push('memories'); + } + if (customizeYaml.menu && customizeYaml.menu.length > 0) { + customizedFields.push('menu'); + } + if (customizeYaml.prompts && customizeYaml.prompts.length > 0) { + customizedFields.push('prompts'); + } + } + } + + // Build YAML + customize to .md + let xmlContent = await this.xmlHandler.buildFromYaml(sourceYamlPath, customizeExists ? customizePath : null, { + includeMetadata: true, + }); + + // DO NOT replace {project-root} - LLMs understand this placeholder at runtime + // const processedContent = xmlContent.replaceAll('{project-root}', projectDir); + + // Process TTS injection points (pass targetPath for tracking) + xmlContent = this.processTTSInjectionPoints(xmlContent, targetMdPath); + + // Write the rebuilt .md file with POSIX-compliant final newline + const content = xmlContent.endsWith('\n') ? xmlContent : xmlContent + '\n'; + await fs.writeFile(targetMdPath, content, 'utf8'); + + // Display result with customizations if any + if (customizedFields.length > 0) { + console.log(chalk.dim(` Rebuilt agent: ${agentName}.md `) + chalk.yellow(`(customized: ${customizedFields.join(', ')})`)); + } else { + console.log(chalk.dim(` Rebuilt agent: ${agentName}.md`)); + } + } + } + } + + /** + * Compile/rebuild all agents and tasks for quick updates + * @param {Object} config - Compilation configuration + * @returns {Object} Compilation results + */ + async compileAgents(config) { + const ora = require('ora'); + const spinner = ora('Starting agent compilation...').start(); + + try { + const projectDir = path.resolve(config.directory); + const bmadDir = await this.findBmadDir(projectDir); + + // Check if bmad directory exists + if (!(await fs.pathExists(bmadDir))) { + spinner.fail('No BMAD installation found'); + throw new Error(`BMAD not installed at ${bmadDir}`); + } + + let agentCount = 0; + let taskCount = 0; + + // Process all modules in bmad directory + spinner.text = 'Rebuilding agent files...'; + const entries = await fs.readdir(bmadDir, { withFileTypes: true }); + + for (const entry of entries) { + if (entry.isDirectory() && entry.name !== '_cfg' && entry.name !== 'docs') { + const modulePath = path.join(bmadDir, entry.name); + + // Special handling for standalone agents in bmad/agents/ directory + if (entry.name === 'agents') { + spinner.text = 'Building standalone agents...'; + await this.buildStandaloneAgents(bmadDir, projectDir); + + // Count standalone agents + const standaloneAgentsPath = path.join(bmadDir, 'agents'); + const standaloneAgentDirs = await fs.readdir(standaloneAgentsPath, { withFileTypes: true }); + for (const agentDir of standaloneAgentDirs) { + if (agentDir.isDirectory()) { + const agentDirPath = path.join(standaloneAgentsPath, agentDir.name); + const agentFiles = await fs.readdir(agentDirPath); + agentCount += agentFiles.filter((f) => f.endsWith('.md') && !f.endsWith('.agent.yaml')).length; + } + } + } else { + // Rebuild module agents from installer source + const agentsPath = path.join(modulePath, 'agents'); + if (await fs.pathExists(agentsPath)) { + await this.rebuildAgentFiles(modulePath, entry.name); + const agentFiles = await fs.readdir(agentsPath); + agentCount += agentFiles.filter((f) => f.endsWith('.md')).length; + } + + // Count tasks (already built) + const tasksPath = path.join(modulePath, 'tasks'); + if (await fs.pathExists(tasksPath)) { + const taskFiles = await fs.readdir(tasksPath); + taskCount += taskFiles.filter((f) => f.endsWith('.md')).length; + } + } + } + } + + // Reinstall custom agents from _cfg/custom/agents/ sources + spinner.start('Rebuilding custom agents...'); + const customAgentResults = await this.reinstallCustomAgents(projectDir, bmadDir); + if (customAgentResults.count > 0) { + spinner.succeed(`Rebuilt ${customAgentResults.count} custom agent${customAgentResults.count > 1 ? 's' : ''}`); + agentCount += customAgentResults.count; + } else { + spinner.succeed('No custom agents found to rebuild'); + } + + // Skip full manifest regeneration during compileAgents to preserve custom agents + // Custom agents are already added to manifests during individual installation + // Only regenerate YAML manifest for IDE updates if needed + const existingManifestPath = path.join(bmadDir, '_cfg', 'manifest.yaml'); + let existingIdes = []; + if (await fs.pathExists(existingManifestPath)) { + const manifestContent = await fs.readFile(existingManifestPath, 'utf8'); + const yaml = require('js-yaml'); + const manifest = yaml.load(manifestContent); + existingIdes = manifest.ides || []; + } + + // Update IDE configurations using the existing IDE list from manifest + if (existingIdes && existingIdes.length > 0) { + spinner.start('Updating IDE configurations...'); + + for (const ide of existingIdes) { + spinner.text = `Updating ${ide}...`; + + // Stop spinner before IDE setup to prevent blocking any potential prompts + // However, we pass _alreadyConfigured to skip all prompts during compile + spinner.stop(); + + await this.ideManager.setup(ide, projectDir, bmadDir, { + selectedModules: installedModules, + skipModuleInstall: true, // Skip module installation, just update IDE files + verbose: config.verbose, + preCollectedConfig: { _alreadyConfigured: true }, // Skip all interactive prompts during compile + }); + + // Restart spinner for next IDE + if (existingIdes.indexOf(ide) < existingIdes.length - 1) { + spinner.start('Updating IDE configurations...'); + } + } + + console.log(chalk.green('✓ IDE configurations updated')); + } else { + console.log(chalk.yellow('⚠️ No IDEs configured. Skipping IDE update.')); + } + + return { agentCount, taskCount }; + } catch (error) { + spinner.fail('Compilation failed'); + throw error; + } + } + + /** + * Private: Update core + */ + async updateCore(bmadDir, force = false) { + const sourcePath = getModulePath('core'); + const targetPath = path.join(bmadDir, 'core'); + + if (force) { + await fs.remove(targetPath); + await this.installCore(bmadDir); + } else { + // Selective update - preserve user modifications + await this.fileOps.syncDirectory(sourcePath, targetPath); + } + } + + /** + * Quick update method - preserves all settings and only prompts for new config fields + * @param {Object} config - Configuration with directory + * @returns {Object} Update result + */ + async quickUpdate(config) { + const ora = require('ora'); + const spinner = ora('Starting quick update...').start(); + + try { + const projectDir = path.resolve(config.directory); + const bmadDir = await this.findBmadDir(projectDir); + + // Check if bmad directory exists + if (!(await fs.pathExists(bmadDir))) { + spinner.fail('No BMAD installation found'); + throw new Error(`BMAD not installed at ${bmadDir}. Use regular install for first-time setup.`); + } + + spinner.text = 'Detecting installed modules and configuration...'; + + // Detect existing installation + const existingInstall = await this.detector.detect(bmadDir); + const installedModules = existingInstall.modules.map((m) => m.id); + const configuredIdes = existingInstall.ides || []; + + // Load saved IDE configurations + const savedIdeConfigs = await this.ideConfigManager.loadAllIdeConfigs(bmadDir); + + // Get available modules (what we have source for) + const availableModules = await this.moduleManager.listAvailable(); + const availableModuleIds = new Set(availableModules.map((m) => m.id)); + + // Only update modules that are BOTH installed AND available (we have source for) + const modulesToUpdate = installedModules.filter((id) => availableModuleIds.has(id)); + const skippedModules = installedModules.filter((id) => !availableModuleIds.has(id)); + + spinner.succeed(`Found ${modulesToUpdate.length} module(s) to update and ${configuredIdes.length} configured tool(s)`); + + if (skippedModules.length > 0) { + console.log(chalk.yellow(`⚠️ Skipping ${skippedModules.length} module(s) - no source available: ${skippedModules.join(', ')}`)); + } + + // Load existing configs and collect new fields (if any) + console.log(chalk.cyan('\n📋 Checking for new configuration options...')); + await this.configCollector.loadExistingConfig(projectDir); + + let promptedForNewFields = false; + + // Check core config for new fields + const corePrompted = await this.configCollector.collectModuleConfigQuick('core', projectDir, true); + if (corePrompted) { + promptedForNewFields = true; + } + + // Check each module we're updating for new fields (NOT skipped modules) + for (const moduleName of modulesToUpdate) { + const modulePrompted = await this.configCollector.collectModuleConfigQuick(moduleName, projectDir, true); + if (modulePrompted) { + promptedForNewFields = true; + } + } + + if (!promptedForNewFields) { + console.log(chalk.green('✓ All configuration is up to date, no new options to configure')); + } + + // Add metadata + this.configCollector.collectedConfig._meta = { + version: require(path.join(getProjectRoot(), 'package.json')).version, + installDate: new Date().toISOString(), + lastModified: new Date().toISOString(), + }; + + // Check if bmad_folder has changed + const existingBmadFolderName = path.basename(bmadDir); + const newBmadFolderName = this.configCollector.collectedConfig.core?.bmad_folder || existingBmadFolderName; + + if (existingBmadFolderName === newBmadFolderName) { + // Normal quick update - start the spinner + console.log(chalk.cyan('Updating BMAD installation...')); + } else { + // Folder name has changed - stop spinner and let install() handle it + spinner.stop(); + console.log(chalk.yellow(`\n⚠️ Folder name will change: ${existingBmadFolderName} → ${newBmadFolderName}`)); + console.log(chalk.yellow('The installer will handle the folder migration.\n')); + } + + // Build the config object for the installer + const installConfig = { + directory: projectDir, + installCore: true, + modules: modulesToUpdate, // Only update modules we have source for + ides: configuredIdes, + skipIde: configuredIdes.length === 0, + coreConfig: this.configCollector.collectedConfig.core, + actionType: 'install', // Use regular install flow + _quickUpdate: true, // Flag to skip certain prompts + _preserveModules: skippedModules, // Preserve these in manifest even though we didn't update them + _savedIdeConfigs: savedIdeConfigs, // Pass saved IDE configs to installer + }; + + // Call the standard install method + const result = await this.install(installConfig); + + // Only succeed the spinner if it's still spinning + // (install method might have stopped it if folder name changed) + if (spinner.isSpinning) { + spinner.succeed('Quick update complete!'); + } + + return { + success: true, + moduleCount: modulesToUpdate.length + 1, // +1 for core + hadNewFields: promptedForNewFields, + modules: ['core', ...modulesToUpdate], + skippedModules: skippedModules, + ides: configuredIdes, + }; + } catch (error) { + spinner.fail('Quick update failed'); + throw error; + } + } + + /** + * Private: Prompt for update action + */ + async promptUpdateAction() { + const inquirer = require('inquirer'); + return await inquirer.prompt([ + { + type: 'list', + name: 'action', + message: 'What would you like to do?', + choices: [ + { name: 'Update existing installation', value: 'update' }, + { name: 'Remove and reinstall', value: 'reinstall' }, + { name: 'Cancel', value: 'cancel' }, + ], + }, + ]); + } + + /** + * Handle legacy BMAD v4 migration with automatic backup + * @param {string} projectDir - Project directory + * @param {Object} legacyV4 - Legacy V4 detection result with offenders array + */ + async handleLegacyV4Migration(projectDir, legacyV4) { + console.log(chalk.yellow.bold('\n⚠️ Legacy BMAD v4 detected')); + console.log(chalk.dim('The installer found legacy artefacts in your project.\n')); + + // Separate .bmad* folders (auto-backup) from other offending paths (manual cleanup) + const bmadFolders = legacyV4.offenders.filter((p) => { + const name = path.basename(p); + return name.startsWith('.bmad'); // Only dot-prefixed folders get auto-backed up + }); + const otherOffenders = legacyV4.offenders.filter((p) => { + const name = path.basename(p); + return !name.startsWith('.bmad'); // Everything else is manual cleanup + }); + + const inquirer = require('inquirer'); + + // Show warning for other offending paths FIRST + if (otherOffenders.length > 0) { + console.log(chalk.yellow('⚠️ Recommended cleanup:')); + console.log(chalk.dim('It is recommended to remove the following items before proceeding:\n')); + for (const p of otherOffenders) console.log(chalk.dim(` - ${p}`)); + + console.log(chalk.cyan('\nCleanup commands you can copy/paste:')); + console.log(chalk.dim('macOS/Linux:')); + for (const p of otherOffenders) console.log(chalk.dim(` rm -rf '${p}'`)); + console.log(chalk.dim('Windows:')); + for (const p of otherOffenders) console.log(chalk.dim(` rmdir /S /Q "${p}"`)); + + const { cleanedUp } = await inquirer.prompt([ + { + type: 'confirm', + name: 'cleanedUp', + message: 'Have you completed the recommended cleanup? (You can proceed without it, but it is recommended)', + default: false, + }, + ]); + + if (cleanedUp) { + console.log(chalk.green('✓ Cleanup acknowledged\n')); + } else { + console.log(chalk.yellow('⚠️ Proceeding without recommended cleanup\n')); + } + } + + // Handle .bmad* folders with automatic backup + if (bmadFolders.length > 0) { + console.log(chalk.cyan('The following legacy folders will be moved to v4-backup:')); + for (const p of bmadFolders) console.log(chalk.dim(` - ${p}`)); + + const { proceed } = await inquirer.prompt([ + { + type: 'confirm', + name: 'proceed', + message: 'Proceed with backing up legacy v4 folders?', + default: true, + }, + ]); + + if (proceed) { + const backupDir = path.join(projectDir, 'v4-backup'); + await fs.ensureDir(backupDir); + + for (const folder of bmadFolders) { + const folderName = path.basename(folder); + const backupPath = path.join(backupDir, folderName); + + // If backup already exists, add timestamp + let finalBackupPath = backupPath; + if (await fs.pathExists(backupPath)) { + const timestamp = new Date().toISOString().replaceAll(/[:.]/g, '-').split('T')[0]; + finalBackupPath = path.join(backupDir, `${folderName}-${timestamp}`); + } + + await fs.move(folder, finalBackupPath, { overwrite: false }); + console.log(chalk.green(`✓ Moved ${folderName} to ${path.relative(projectDir, finalBackupPath)}`)); + } + } else { + throw new Error('Installation cancelled by user'); + } + } + } + + /** + * Read files-manifest.csv + * @param {string} bmadDir - BMAD installation directory + * @returns {Array} Array of file entries from files-manifest.csv + */ + async readFilesManifest(bmadDir) { + const filesManifestPath = path.join(bmadDir, '_cfg', 'files-manifest.csv'); + if (!(await fs.pathExists(filesManifestPath))) { + return []; + } + + try { + const content = await fs.readFile(filesManifestPath, 'utf8'); + const lines = content.split('\n'); + const files = []; + + for (let i = 1; i < lines.length; i++) { + // Skip header + const line = lines[i].trim(); + if (!line) continue; + + // Parse CSV line properly handling quoted values + const parts = []; + let current = ''; + let inQuotes = false; + + for (const char of line) { + if (char === '"') { + inQuotes = !inQuotes; + } else if (char === ',' && !inQuotes) { + parts.push(current); + current = ''; + } else { + current += char; + } + } + parts.push(current); // Add last part + + if (parts.length >= 4) { + files.push({ + type: parts[0], + name: parts[1], + module: parts[2], + path: parts[3], + hash: parts[4] || null, // Hash may not exist in old manifests + }); + } + } + + return files; + } catch (error) { + console.warn('Warning: Could not read files-manifest.csv:', error.message); + return []; + } + } + + /** + * Detect custom and modified files + * @param {string} bmadDir - BMAD installation directory + * @param {Array} existingFilesManifest - Previous files from files-manifest.csv + * @returns {Object} Object with customFiles and modifiedFiles arrays + */ + async detectCustomFiles(bmadDir, existingFilesManifest) { + const customFiles = []; + const modifiedFiles = []; + + // Check if the manifest has hashes - if not, we can't detect modifications + let manifestHasHashes = false; + if (existingFilesManifest && existingFilesManifest.length > 0) { + manifestHasHashes = existingFilesManifest.some((f) => f.hash); + } + + // Build map of previously installed files from files-manifest.csv with their hashes + const installedFilesMap = new Map(); + for (const fileEntry of existingFilesManifest) { + if (fileEntry.path) { + // Paths are relative to bmadDir. Legacy manifests incorrectly prefixed 'bmad/' - + // strip it if present. This is safe because no real path inside bmadDir would + // start with 'bmad/' (you'd never have .bmad/bmad/... as an actual structure). + const relativePath = fileEntry.path.startsWith('bmad/') ? fileEntry.path.slice(5) : fileEntry.path; + const absolutePath = path.join(bmadDir, relativePath); + installedFilesMap.set(path.normalize(absolutePath), { + hash: fileEntry.hash, + relativePath: relativePath, + }); + } + } + + // Recursively scan bmadDir for all files + const scanDirectory = async (dir) => { + try { + const entries = await fs.readdir(dir, { withFileTypes: true }); + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + + if (entry.isDirectory()) { + // Skip certain directories + if (entry.name === 'node_modules' || entry.name === '.git') { + continue; + } + await scanDirectory(fullPath); + } else if (entry.isFile()) { + const normalizedPath = path.normalize(fullPath); + const fileInfo = installedFilesMap.get(normalizedPath); + + // Skip certain system files that are auto-generated + const relativePath = path.relative(bmadDir, fullPath); + const fileName = path.basename(fullPath); + + // Skip _cfg directory - system files + if (relativePath.startsWith('_cfg/') || relativePath.startsWith('_cfg\\')) { + continue; + } + + // Skip config.yaml files - these are regenerated on each install/update + // Users should use _cfg/agents/ override files instead + if (fileName === 'config.yaml') { + continue; + } + + if (!fileInfo) { + // File not in manifest = custom file + customFiles.push(fullPath); + } else if (manifestHasHashes && fileInfo.hash) { + // File in manifest with hash - check if it was modified + const currentHash = await this.manifest.calculateFileHash(fullPath); + if (currentHash && currentHash !== fileInfo.hash) { + // Hash changed = file was modified + modifiedFiles.push({ + path: fullPath, + relativePath: fileInfo.relativePath, + }); + } + } + // If manifest doesn't have hashes, we can't detect modifications + // so we just skip files that are in the manifest + } + } + } catch { + // Ignore errors scanning directories + } + }; + + await scanDirectory(bmadDir); + return { customFiles, modifiedFiles }; + } + + /** + * Private: Create agent configuration files + * @param {string} bmadDir - BMAD installation directory + * @param {Object} userInfo - User information including name and language + */ + async createAgentConfigs(bmadDir, userInfo = null) { + const agentConfigDir = path.join(bmadDir, '_cfg', 'agents'); + await fs.ensureDir(agentConfigDir); + + // Get all agents from all modules + const agents = []; + const agentDetails = []; // For manifest generation + + // Check modules for agents (including core) + const entries = await fs.readdir(bmadDir, { withFileTypes: true }); + for (const entry of entries) { + if (entry.isDirectory() && entry.name !== '_cfg') { + const moduleAgentsPath = path.join(bmadDir, entry.name, 'agents'); + if (await fs.pathExists(moduleAgentsPath)) { + const agentFiles = await fs.readdir(moduleAgentsPath); + for (const agentFile of agentFiles) { + if (agentFile.endsWith('.md')) { + const agentPath = path.join(moduleAgentsPath, agentFile); + const agentContent = await fs.readFile(agentPath, 'utf8'); + + // Skip agents with localskip="true" + const hasLocalSkip = agentContent.match(/]*\slocalskip="true"[^>]*>/); + if (hasLocalSkip) { + continue; // Skip this agent - it should not have been installed + } + + const agentName = path.basename(agentFile, '.md'); + + // Extract any nodes with agentConfig="true" + const agentConfigNodes = this.extractAgentConfigNodes(agentContent); + + agents.push({ + name: agentName, + module: entry.name, + agentConfigNodes: agentConfigNodes, + }); + + // Use shared AgentPartyGenerator to extract details + let details = AgentPartyGenerator.extractAgentDetails(agentContent, entry.name, agentName); + + // Apply config overrides if they exist + if (details) { + const configPath = path.join(agentConfigDir, `${entry.name}-${agentName}.md`); + if (await fs.pathExists(configPath)) { + const configContent = await fs.readFile(configPath, 'utf8'); + details = AgentPartyGenerator.applyConfigOverrides(details, configContent); + } + agentDetails.push(details); + } + } + } + } + } + } + + // Create config file for each agent + let createdCount = 0; + let skippedCount = 0; + + // Load agent config template + const templatePath = getSourcePath('utility', 'models', 'agent-config-template.md'); + const templateContent = await fs.readFile(templatePath, 'utf8'); + + for (const agent of agents) { + const configPath = path.join(agentConfigDir, `${agent.module}-${agent.name}.md`); + + // Skip if config file already exists (preserve custom configurations) + if (await fs.pathExists(configPath)) { + skippedCount++; + continue; + } + + // Build config content header + let configContent = `# Agent Config: ${agent.name}\n\n`; + + // Process template and add agent-specific config nodes + let processedTemplate = templateContent; + + // Replace {core:user_name} placeholder with actual user name if available + if (userInfo && userInfo.userName) { + processedTemplate = processedTemplate.replaceAll('{core:user_name}', userInfo.userName); + } + + // Replace {core:communication_language} placeholder with actual language if available + if (userInfo && userInfo.responseLanguage) { + processedTemplate = processedTemplate.replaceAll('{core:communication_language}', userInfo.responseLanguage); + } + + // If this agent has agentConfig nodes, add them after the existing comment + if (agent.agentConfigNodes && agent.agentConfigNodes.length > 0) { + // Find the agent-specific configuration nodes comment + const commentPattern = /(\s*)/; + const commentMatch = processedTemplate.match(commentPattern); + + if (commentMatch) { + // Add nodes right after the comment + let agentSpecificNodes = ''; + for (const node of agent.agentConfigNodes) { + agentSpecificNodes += `\n ${node}`; + } + + processedTemplate = processedTemplate.replace(commentPattern, `$1${agentSpecificNodes}`); + } + } + + configContent += processedTemplate; + + // Ensure POSIX-compliant final newline + if (!configContent.endsWith('\n')) { + configContent += '\n'; + } + + await fs.writeFile(configPath, configContent, 'utf8'); + this.installedFiles.push(configPath); // Track agent config files + createdCount++; + } + + // Generate agent manifest with overrides applied + await this.generateAgentManifest(bmadDir, agentDetails); + + return { total: agents.length, created: createdCount, skipped: skippedCount }; + } + + /** + * Generate agent manifest XML file + * @param {string} bmadDir - BMAD installation directory + * @param {Array} agentDetails - Array of agent details + */ + async generateAgentManifest(bmadDir, agentDetails) { + const manifestPath = path.join(bmadDir, '_cfg', 'agent-manifest.csv'); + await AgentPartyGenerator.writeAgentParty(manifestPath, agentDetails, { forWeb: false }); + } + + /** + * Extract nodes with agentConfig="true" from agent content + * @param {string} content - Agent file content + * @returns {Array} Array of XML nodes that should be added to agent config + */ + extractAgentConfigNodes(content) { + const nodes = []; + + try { + // Find all XML nodes with agentConfig="true" + // Match self-closing tags and tags with content + const selfClosingPattern = /<([a-zA-Z][a-zA-Z0-9_-]*)\s+[^>]*agentConfig="true"[^>]*\/>/g; + const withContentPattern = /<([a-zA-Z][a-zA-Z0-9_-]*)\s+[^>]*agentConfig="true"[^>]*>([\s\S]*?)<\/\1>/g; + + // Extract self-closing tags + let match; + while ((match = selfClosingPattern.exec(content)) !== null) { + // Extract just the tag without children (structure only) + const tagMatch = match[0].match(/<([a-zA-Z][a-zA-Z0-9_-]*)([^>]*)\/>/); + if (tagMatch) { + const tagName = tagMatch[1]; + const attributes = tagMatch[2].replace(/\s*agentConfig="true"/, ''); // Remove agentConfig attribute + nodes.push(`<${tagName}${attributes}>`); + } + } + + // Extract tags with content + while ((match = withContentPattern.exec(content)) !== null) { + const fullMatch = match[0]; + const tagName = match[1]; + + // Extract opening tag with attributes (removing agentConfig="true") + const openingTagMatch = fullMatch.match(new RegExp(`<${tagName}([^>]*)>`)); + if (openingTagMatch) { + const attributes = openingTagMatch[1].replace(/\s*agentConfig="true"/, ''); + // Add empty node structure (no children) + nodes.push(`<${tagName}${attributes}>`); + } + } + } catch (error) { + console.error('Error extracting agentConfig nodes:', error); + } + + return nodes; + } + + /** + * Reinstall custom agents from backup and source locations + * This preserves custom agents across quick updates/reinstalls + * @param {string} projectDir - Project directory + * @param {string} bmadDir - BMAD installation directory + * @returns {Object} Result with count and agent names + */ + async reinstallCustomAgents(projectDir, bmadDir) { + const { + discoverAgents, + loadAgentConfig, + extractManifestData, + addToManifest, + createIdeSlashCommands, + updateManifestYaml, + } = require('../../../lib/agent/installer'); + const { compileAgent } = require('../../../lib/agent/compiler'); + + const results = { count: 0, agents: [] }; + + // Check multiple locations for custom agents + const sourceLocations = [ + path.join(bmadDir, '_cfg', 'custom', 'agents'), // Backup location + path.join(bmadDir, 'custom', 'src', 'agents'), // BMAD folder source location + path.join(projectDir, 'custom', 'src', 'agents'), // Project root source location + ]; + + let foundAgents = []; + let processedAgents = new Set(); // Track to avoid duplicates + + // Discover agents from all locations + for (const location of sourceLocations) { + if (await fs.pathExists(location)) { + const agents = discoverAgents(location); + // Only add agents we haven't processed yet + const newAgents = agents.filter((agent) => !processedAgents.has(agent.name)); + foundAgents.push(...newAgents); + for (const agent of newAgents) processedAgents.add(agent.name); + } + } + + if (foundAgents.length === 0) { + return results; + } + + try { + const customAgentsDir = path.join(bmadDir, 'custom', 'agents'); + await fs.ensureDir(customAgentsDir); + + const manifestFile = path.join(bmadDir, '_cfg', 'agent-manifest.csv'); + const manifestYamlFile = path.join(bmadDir, '_cfg', 'manifest.yaml'); + + for (const agent of foundAgents) { + try { + const agentConfig = loadAgentConfig(agent.yamlFile); + const finalAgentName = agent.name; // Already named correctly from save + + // Determine agent type from the name (e.g., "fred-commit-poet" → "commit-poet") + let agentType = finalAgentName; + const parts = finalAgentName.split('-'); + if (parts.length >= 2) { + // Try to extract type (last part or last two parts) + // For "fred-commit-poet", we want "commit-poet" + // This is heuristic - could be improved with metadata storage + agentType = parts.slice(-2).join('-'); // Take last 2 parts as type + } + + // Create target directory - use relative path if agent is in a subdirectory + const agentTargetDir = agent.relativePath + ? path.join(customAgentsDir, agent.relativePath) + : path.join(customAgentsDir, finalAgentName); + await fs.ensureDir(agentTargetDir); + + // Calculate paths + const compiledFileName = `${finalAgentName}.md`; + const compiledPath = path.join(agentTargetDir, compiledFileName); + const relativePath = path.relative(projectDir, compiledPath); + + // Compile with embedded defaults (answers are already in defaults section) + const { xml, metadata } = compileAgent( + await fs.readFile(agent.yamlFile, 'utf8'), + agentConfig.defaults || {}, + finalAgentName, + relativePath, + ); + + // Write compiled agent + await fs.writeFile(compiledPath, xml, 'utf8'); + + // Backup source YAML to _cfg/custom/agents if not already there + const cfgAgentsBackupDir = path.join(bmadDir, '_cfg', 'custom', 'agents'); + await fs.ensureDir(cfgAgentsBackupDir); + const backupYamlPath = path.join(cfgAgentsBackupDir, `${finalAgentName}.agent.yaml`); + + // Only backup if source is not already in backup location + if (agent.yamlFile !== backupYamlPath) { + await fs.copy(agent.yamlFile, backupYamlPath); + } + + // Copy sidecar files if expert agent + if (agent.hasSidecar && agent.type === 'expert') { + const { copySidecarFiles } = require('../../../lib/agent/installer'); + copySidecarFiles(agent.path, agentTargetDir, agent.yamlFile); + } + + // Update manifest CSV + if (await fs.pathExists(manifestFile)) { + // Preserve YAML metadata for persona name, but override id for filename + const manifestMetadata = { + ...metadata, + id: relativePath, // Use the compiled agent path for id + name: metadata.name || finalAgentName, // Use YAML metadata.name (persona name) or fallback + title: metadata.title, // Use YAML title + icon: metadata.icon, // Use YAML icon + }; + const manifestData = extractManifestData(xml, manifestMetadata, relativePath, 'custom'); + manifestData.name = finalAgentName; // Use filename for the name field + manifestData.path = relativePath; + addToManifest(manifestFile, manifestData); + } + + // Create IDE slash commands (async function) + await createIdeSlashCommands(projectDir, finalAgentName, relativePath, metadata); + + // Update manifest.yaml + if (await fs.pathExists(manifestYamlFile)) { + updateManifestYaml(manifestYamlFile, finalAgentName, agentType); + } + + results.count++; + results.agents.push(finalAgentName); + } catch (agentError) { + console.log(chalk.yellow(` ⚠️ Failed to reinstall ${agent.name}: ${agentError.message}`)); + } + } + } catch (error) { + console.log(chalk.yellow(` ⚠️ Error reinstalling custom agents: ${error.message}`)); + } + + return results; + } + + /** + * Copy IDE-specific documentation to BMAD docs + * @param {Array} ides - List of selected IDEs + * @param {string} bmadDir - BMAD installation directory + */ + async copyIdeDocumentation(ides, bmadDir) { + const docsDir = path.join(bmadDir, 'docs'); + await fs.ensureDir(docsDir); + + for (const ide of ides) { + const sourceDocPath = path.join(getProjectRoot(), 'docs', 'ide-info', `${ide}.md`); + const targetDocPath = path.join(docsDir, `${ide}-instructions.md`); + + if (await fs.pathExists(sourceDocPath)) { + await this.copyFileWithPlaceholderReplacement(sourceDocPath, targetDocPath, this.bmadFolderName || 'bmad'); + } + } + } + + /** + * Scan for legacy/obsolete files in BMAD installation + * @param {string} bmadDir - BMAD installation directory + * @returns {Object} Categorized files for cleanup + */ + async scanForLegacyFiles(bmadDir) { + const legacyFiles = { + backup: [], + documentation: [], + deprecated_task: [], + unknown: [], + }; + + try { + // Load files manifest to understand what should exist + const manifestPath = path.join(bmadDir, 'files-manifest.csv'); + const manifestFiles = new Set(); + + if (await fs.pathExists(manifestPath)) { + const manifestContent = await fs.readFile(manifestPath, 'utf8'); + const lines = manifestContent.split('\n').slice(1); // Skip header + for (const line of lines) { + if (line.trim()) { + const relativePath = line.split(',')[0]; + if (relativePath) { + manifestFiles.add(relativePath); + } + } + } + } + + // Scan all files recursively + const allFiles = await this.getAllFiles(bmadDir); + + for (const filePath of allFiles) { + const relativePath = path.relative(bmadDir, filePath); + + // Skip expected files + if (this.isExpectedFile(relativePath, manifestFiles)) { + continue; + } + + // Categorize legacy files + if (relativePath.endsWith('.bak')) { + legacyFiles.backup.push({ + path: filePath, + relativePath: relativePath, + size: (await fs.stat(filePath)).size, + mtime: (await fs.stat(filePath)).mtime, + }); + } else if (this.isDocumentationFile(relativePath)) { + legacyFiles.documentation.push({ + path: filePath, + relativePath: relativePath, + size: (await fs.stat(filePath)).size, + mtime: (await fs.stat(filePath)).mtime, + }); + } else if (this.isDeprecatedTaskFile(relativePath)) { + const suggestedAlternative = this.suggestAlternative(relativePath); + legacyFiles.deprecated_task.push({ + path: filePath, + relativePath: relativePath, + size: (await fs.stat(filePath)).size, + mtime: (await fs.stat(filePath)).mtime, + suggestedAlternative, + }); + } else { + legacyFiles.unknown.push({ + path: filePath, + relativePath: relativePath, + size: (await fs.stat(filePath)).size, + mtime: (await fs.stat(filePath)).mtime, + }); + } + } + } catch (error) { + console.warn(`Warning: Could not scan for legacy files: ${error.message}`); + } + + return legacyFiles; + } + + /** + * Get all files in directory recursively + * @param {string} dir - Directory to scan + * @returns {Array} Array of file paths + */ + async getAllFiles(dir) { + const files = []; + + async function scan(currentDir) { + const entries = await fs.readdir(currentDir); + + for (const entry of entries) { + const fullPath = path.join(currentDir, entry); + const stat = await fs.stat(fullPath); + + if (stat.isDirectory()) { + // Skip certain directories + if (!['node_modules', '.git', 'dist', 'build'].includes(entry)) { + await scan(fullPath); + } + } else { + files.push(fullPath); + } + } + } + + await scan(dir); + return files; + } + + /** + * Check if file is expected in installation + * @param {string} relativePath - Relative path from BMAD dir + * @param {Set} manifestFiles - Files from manifest + * @returns {boolean} True if expected file + */ + isExpectedFile(relativePath, manifestFiles) { + // Core files in manifest + if (manifestFiles.has(relativePath)) { + return true; + } + + // Configuration files + if (relativePath.startsWith('_cfg/') || relativePath === 'config.yaml') { + return true; + } + + // Custom files + if (relativePath.startsWith('custom/') || relativePath === 'manifest.yaml') { + return true; + } + + // Generated files + if (relativePath === 'manifest.csv' || relativePath === 'files-manifest.csv') { + return true; + } + + // IDE-specific files + const ides = ['vscode', 'cursor', 'windsurf', 'claude-code', 'github-copilot', 'zsh', 'bash', 'fish']; + if (ides.some((ide) => relativePath.includes(ide))) { + return true; + } + + // BMAD MODULE STRUCTURES - recognize valid module content + const modulePrefixes = ['bmb/', 'bmm/', 'cis/', 'core/', 'bmgd/']; + const validExtensions = ['.yaml', '.yml', '.json', '.csv', '.md', '.xml', '.svg', '.png', '.jpg', '.gif', '.excalidraw', '.js']; + + // Check if this file is in a recognized module directory + for (const modulePrefix of modulePrefixes) { + if (relativePath.startsWith(modulePrefix)) { + // Check if it has a valid extension + const hasValidExtension = validExtensions.some((ext) => relativePath.endsWith(ext)); + if (hasValidExtension) { + return true; + } + } + } + + // Special case for core module resources + if (relativePath.startsWith('core/resources/')) { + return true; + } + + // Special case for docs directory + if (relativePath.startsWith('docs/')) { + return true; + } + + return false; + } + + /** + * Check if file is documentation + * @param {string} relativePath - Relative path + * @returns {boolean} True if documentation + */ + isDocumentationFile(relativePath) { + const docExtensions = ['.md', '.txt', '.pdf']; + const docPatterns = ['docs/', 'README', 'CHANGELOG', 'LICENSE']; + + return docExtensions.some((ext) => relativePath.endsWith(ext)) || docPatterns.some((pattern) => relativePath.includes(pattern)); + } + + /** + * Check if file is deprecated task file + * @param {string} relativePath - Relative path + * @returns {boolean} True if deprecated + */ + isDeprecatedTaskFile(relativePath) { + // Known deprecated files + const deprecatedFiles = ['adv-elicit-methods.csv', 'game-resources.json', 'ux-workflow.json']; + + return deprecatedFiles.some((dep) => relativePath.includes(dep)); + } + + /** + * Suggest alternative for deprecated file + * @param {string} relativePath - Deprecated file path + * @returns {string} Suggested alternative + */ + suggestAlternative(relativePath) { + const alternatives = { + 'adv-elicit-methods.csv': 'Use the new structured workflows in src/modules/', + 'game-resources.json': 'Resources are now integrated into modules', + 'ux-workflow.json': 'UX workflows are now in src/modules/bmm/workflows/', + }; + + for (const [deprecated, alternative] of Object.entries(alternatives)) { + if (relativePath.includes(deprecated)) { + return alternative; + } + } + + return 'Check src/modules/ for new alternatives'; + } + + /** + * Perform interactive cleanup of legacy files + * @param {string} bmadDir - BMAD installation directory + * @param {boolean} skipInteractive - Skip interactive prompts + * @returns {Object} Cleanup results + */ + async performCleanup(bmadDir, skipInteractive = false) { + const inquirer = require('inquirer'); + const yaml = require('js-yaml'); + + // Load user retention preferences + const retentionPath = path.join(bmadDir, '_cfg', 'user-retained-files.yaml'); + let retentionData = { retainedFiles: [], history: [] }; + + if (await fs.pathExists(retentionPath)) { + const retentionContent = await fs.readFile(retentionPath, 'utf8'); + retentionData = yaml.load(retentionContent) || retentionData; + } + + // Scan for legacy files + const legacyFiles = await this.scanForLegacyFiles(bmadDir); + const allLegacyFiles = [...legacyFiles.backup, ...legacyFiles.documentation, ...legacyFiles.deprecated_task, ...legacyFiles.unknown]; + + if (allLegacyFiles.length === 0) { + return { deleted: 0, retained: 0, message: 'No legacy files found' }; + } + + let deletedCount = 0; + let retainedCount = 0; + const filesToDelete = []; + + if (skipInteractive) { + // Auto-delete all non-retained files + for (const file of allLegacyFiles) { + if (!retentionData.retainedFiles.includes(file.relativePath)) { + filesToDelete.push(file); + } + } + } else { + // Interactive cleanup + console.log(chalk.cyan('\n🧹 Legacy File Cleanup\n')); + console.log(chalk.dim('The following obsolete files were found:\n')); + + // Group files by category + const categories = []; + if (legacyFiles.backup.length > 0) { + categories.push({ name: 'Backup Files (.bak)', files: legacyFiles.backup }); + } + if (legacyFiles.documentation.length > 0) { + categories.push({ name: 'Documentation', files: legacyFiles.documentation }); + } + if (legacyFiles.deprecated_task.length > 0) { + categories.push({ name: 'Deprecated Task Files', files: legacyFiles.deprecated_task }); + } + if (legacyFiles.unknown.length > 0) { + categories.push({ name: 'Unknown Files', files: legacyFiles.unknown }); + } + + for (const category of categories) { + console.log(chalk.yellow(`${category.name}:`)); + for (const file of category.files) { + const size = (file.size / 1024).toFixed(1); + const date = file.mtime.toLocaleDateString(); + let line = ` - ${file.relativePath} (${size}KB, ${date})`; + if (file.suggestedAlternative) { + line += chalk.dim(` → ${file.suggestedAlternative}`); + } + console.log(chalk.dim(line)); + } + console.log(); + } + + const prompt = await inquirer.prompt([ + { + type: 'confirm', + name: 'proceed', + message: 'Would you like to review these files for cleanup?', + default: true, + }, + ]); + + if (!prompt.proceed) { + return { deleted: 0, retained: allLegacyFiles.length, message: 'Cleanup cancelled by user' }; + } + + // Show selection interface + const selectionPrompt = await inquirer.prompt([ + { + type: 'checkbox', + name: 'filesToDelete', + message: 'Select files to delete (use SPACEBAR to select, ENTER to continue):', + choices: allLegacyFiles.map((file) => { + const isRetained = retentionData.retainedFiles.includes(file.relativePath); + const description = `${file.relativePath} (${(file.size / 1024).toFixed(1)}KB)`; + return { + name: description, + value: file, + checked: !isRetained && !file.relativePath.includes('.bak'), + }; + }), + pageSize: Math.min(allLegacyFiles.length, 15), + }, + ]); + + filesToDelete.push(...selectionPrompt.filesToDelete); + } + + // Delete selected files + for (const file of filesToDelete) { + try { + await fs.remove(file.path); + deletedCount++; + } catch (error) { + console.warn(`Warning: Could not delete ${file.relativePath}: ${error.message}`); + } + } + + // Count retained files + retainedCount = allLegacyFiles.length - deletedCount; + + // Update retention data + const newlyRetained = allLegacyFiles.filter((f) => !filesToDelete.includes(f)).map((f) => f.relativePath); + + retentionData.retainedFiles = [...new Set([...retentionData.retainedFiles, ...newlyRetained])]; + retentionData.history.push({ + date: new Date().toISOString(), + deleted: deletedCount, + retained: retainedCount, + files: filesToDelete.map((f) => f.relativePath), + }); + + // Save retention data + await fs.ensureDir(path.dirname(retentionPath)); + await fs.writeFile(retentionPath, yaml.dump(retentionData), 'utf8'); + + return { deleted: deletedCount, retained: retainedCount }; + } +} + +module.exports = { Installer }; diff --git a/tools/cli/installers/lib/modules/manager.js b/tools/cli/installers/lib/modules/manager.js index 39dece05..32461a3b 100644 --- a/tools/cli/installers/lib/modules/manager.js +++ b/tools/cli/installers/lib/modules/manager.js @@ -679,6 +679,16 @@ class ModuleManager { const yamlContent = await fs.readFile(sourceYamlPath, 'utf8'); const { compileAgent } = require('../../../lib/agent/compiler'); + // Create customize template if it doesn't exist + if (!(await fs.pathExists(customizePath))) { + const { getSourcePath } = require('../../../lib/project-root'); + const genericTemplatePath = getSourcePath('utility', 'templates', 'agent.customize.template.yaml'); + if (await fs.pathExists(genericTemplatePath)) { + await this.copyFileWithPlaceholderReplacement(genericTemplatePath, customizePath); + console.log(chalk.dim(` Created customize: ${moduleName}-${agentName}.customize.yaml`)); + } + } + // Check for customizations let customizedFields = []; if (await fs.pathExists(customizePath)) { From aad7a717180d39468b25e0f42b8346c69ee71dfd Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 6 Dec 2025 16:16:48 -0600 Subject: [PATCH 07/26] fix: ManifestGenerator now scans for all installed modules - Previously only scanned selectedModules, missing modules installed from custom locations - Now scans the bmad directory to find all actually installed modules - Any module with agents/workflows/tasks/tools will be included in manifests - This fixes issue where MWM workflows weren't getting slash commands - All modules now get equal treatment in IDE integration --- .../installers/lib/core/manifest-generator.js | 44 ++++++++++++++++++- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/tools/cli/installers/lib/core/manifest-generator.js b/tools/cli/installers/lib/core/manifest-generator.js index f10d0deb..a4bcb5c4 100644 --- a/tools/cli/installers/lib/core/manifest-generator.js +++ b/tools/cli/installers/lib/core/manifest-generator.js @@ -34,9 +34,13 @@ class ManifestGenerator { // Store modules list (all modules including preserved ones) const preservedModules = options.preservedModules || []; + + // Scan the bmad directory to find all actually installed modules + const installedModules = await this.scanInstalledModules(bmadDir); + // Deduplicate modules list to prevent duplicates - this.modules = [...new Set(['core', ...selectedModules, ...preservedModules])]; - this.updatedModules = [...new Set(['core', ...selectedModules])]; // Only these get rescanned + this.modules = [...new Set(['core', ...selectedModules, ...preservedModules, ...installedModules])]; + this.updatedModules = [...new Set(['core', ...selectedModules, ...installedModules])]; // All installed modules get rescanned this.preservedModules = preservedModules; // These stay as-is in CSVs this.bmadDir = bmadDir; this.bmadFolderName = path.basename(bmadDir); // Get the actual folder name (e.g., '.bmad' or 'bmad') @@ -700,6 +704,42 @@ class ManifestGenerator { await fs.writeFile(csvPath, csv); return csvPath; } + + /** + * Scan the bmad directory to find all installed modules + * @param {string} bmadDir - Path to bmad directory + * @returns {Array} List of module names + */ + async scanInstalledModules(bmadDir) { + const modules = []; + + try { + const entries = await fs.readdir(bmadDir, { withFileTypes: true }); + + for (const entry of entries) { + // Skip if not a directory or is a special directory + if (!entry.isDirectory() || entry.name.startsWith('.') || entry.name === '_cfg') { + continue; + } + + // Check if this looks like a module (has agents, workflows, or tasks directory) + const modulePath = path.join(bmadDir, entry.name); + const hasAgents = await fs.pathExists(path.join(modulePath, 'agents')); + const hasWorkflows = await fs.pathExists(path.join(modulePath, 'workflows')); + const hasTasks = await fs.pathExists(path.join(modulePath, 'tasks')); + const hasTools = await fs.pathExists(path.join(modulePath, 'tools')); + + // If it has any of these directories, it's likely a module + if (hasAgents || hasWorkflows || hasTasks || hasTools) { + modules.push(entry.name); + } + } + } catch (error) { + console.warn(`Warning: Could not scan for installed modules: ${error.message}`); + } + + return modules; + } } module.exports = { ManifestGenerator }; From 86e2daabba84a6c69fd35c261ddff0e7e9b7b7ae Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 6 Dec 2025 16:31:32 -0600 Subject: [PATCH 08/26] fix: ManifestGenerator now recursively scans for agents - Updated getAgentsFromDir to search subdirectories for .md files - Fixed installPath construction to include nested directory structure - This ensures agents in subdirectories (like cbt-coach/cbt-coach.md) get added to agent-manifest.csv - All agents now get proper CLI slash commands regardless of nesting depth --- .../installers/lib/core/manifest-generator.js | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/tools/cli/installers/lib/core/manifest-generator.js b/tools/cli/installers/lib/core/manifest-generator.js index a4bcb5c4..a3930468 100644 --- a/tools/cli/installers/lib/core/manifest-generator.js +++ b/tools/cli/installers/lib/core/manifest-generator.js @@ -220,18 +220,23 @@ class ManifestGenerator { } /** - * Get agents from a directory + * Get agents from a directory recursively * Only includes compiled .md files (not .agent.yaml source files) */ - async getAgentsFromDir(dirPath, moduleName) { + async getAgentsFromDir(dirPath, moduleName, relativePath = '') { const agents = []; - const files = await fs.readdir(dirPath); + const entries = await fs.readdir(dirPath, { withFileTypes: true }); - for (const file of files) { - // Only include .md files, skip .agent.yaml source files and README.md - if (file.endsWith('.md') && !file.endsWith('.agent.yaml') && file.toLowerCase() !== 'readme.md') { - const filePath = path.join(dirPath, file); - const content = await fs.readFile(filePath, 'utf8'); + for (const entry of entries) { + const fullPath = path.join(dirPath, entry.name); + + if (entry.isDirectory()) { + // Recurse into subdirectories + const newRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name; + const subDirAgents = await this.getAgentsFromDir(fullPath, moduleName, newRelativePath); + agents.push(...subDirAgents); + } else if (entry.name.endsWith('.md') && !entry.name.endsWith('.agent.yaml') && entry.name.toLowerCase() !== 'readme.md') { + const content = await fs.readFile(fullPath, 'utf8'); // Skip files that don't contain tag (e.g., README files) if (!content.includes('([\s\S]*?)<\/principles>/); // Build relative path for installation + const fileRelativePath = relativePath ? `${relativePath}/${file}` : file; const installPath = - moduleName === 'core' ? `${this.bmadFolderName}/core/agents/${file}` : `${this.bmadFolderName}/${moduleName}/agents/${file}`; + moduleName === 'core' + ? `${this.bmadFolderName}/core/agents/${fileRelativePath}` + : `${this.bmadFolderName}/${moduleName}/agents/${fileRelativePath}`; const agentName = file.replace('.md', ''); From 74d071708dc122c07d4c66669b7561f3a509070d Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 6 Dec 2025 16:39:28 -0600 Subject: [PATCH 09/26] fix: nested agents now appear in CLI commands - Fix getAgentsFromDir in bmad-artifacts.js to recursively scan subdirectories - This ensures agents like cbt-coach and wellness-companion that are in subdirectories are properly found - Agents now correctly get slash commands in .claude/commands/bmad/mwm/agents/ - All agents from the manifest now have corresponding IDE commands --- .../installers/lib/core/manifest-generator.js | 4 +- .../lib/ide/shared/bmad-artifacts.js | 65 ++++++++++--------- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/tools/cli/installers/lib/core/manifest-generator.js b/tools/cli/installers/lib/core/manifest-generator.js index a3930468..683e1438 100644 --- a/tools/cli/installers/lib/core/manifest-generator.js +++ b/tools/cli/installers/lib/core/manifest-generator.js @@ -260,13 +260,13 @@ class ManifestGenerator { const principlesMatch = content.match(/([\s\S]*?)<\/principles>/); // Build relative path for installation - const fileRelativePath = relativePath ? `${relativePath}/${file}` : file; + const fileRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name; const installPath = moduleName === 'core' ? `${this.bmadFolderName}/core/agents/${fileRelativePath}` : `${this.bmadFolderName}/${moduleName}/agents/${fileRelativePath}`; - const agentName = file.replace('.md', ''); + const agentName = entry.name.replace('.md', ''); // Helper function to clean and escape CSV content const cleanForCSV = (text) => { diff --git a/tools/cli/installers/lib/ide/shared/bmad-artifacts.js b/tools/cli/installers/lib/ide/shared/bmad-artifacts.js index d05b985e..7db470f9 100644 --- a/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +++ b/tools/cli/installers/lib/ide/shared/bmad-artifacts.js @@ -83,39 +83,42 @@ async function getAgentsFromDir(dirPath, moduleName) { return agents; } - const files = await fs.readdir(dirPath); + const entries = await fs.readdir(dirPath, { withFileTypes: true }); - for (const file of files) { - if (!file.endsWith('.md')) { - continue; + for (const entry of entries) { + const fullPath = path.join(dirPath, entry.name); + + if (entry.isDirectory()) { + // Recurse into subdirectories + const subDirAgents = await getAgentsFromDir(fullPath, moduleName); + agents.push(...subDirAgents); + } else if (entry.name.endsWith('.md')) { + // Skip README files and other non-agent files + if (entry.name.toLowerCase() === 'readme.md' || entry.name.toLowerCase().startsWith('readme-')) { + continue; + } + + if (entry.name.includes('.customize.')) { + continue; + } + + const content = await fs.readFile(fullPath, 'utf8'); + + if (content.includes('localskip="true"')) { + continue; + } + + // Only include files that have agent-specific content (compiled agents have tag) + if (!content.includes(' tag) - if (!content.includes(' Date: Sat, 6 Dec 2025 16:56:09 -0600 Subject: [PATCH 10/26] fix: prevent modules from showing as obsolete during reinstall - Skip module selection prompt during update/reinstall - Keep all existing installed modules by default - This prevents inquirer from showing modules as 'obsolete items' with confusing delete options - Modules are now preserved during update/reinstall operations --- .../bmb/docs/agents/agent-menu-patterns.md | 8 ++--- .../docs/agents/expert-agent-architecture.md | 32 +++++++++---------- .../expert-examples/journal-keeper/README.md | 8 ++--- .../journal-keeper/journal-keeper.agent.yaml | 14 ++++---- .../expert-examples/journal-keeper/README.md | 8 ++--- .../journal-keeper/journal-keeper.agent.yaml | 14 ++++---- .../create-module/steps/step-06-agents.md | 6 ++-- .../create-module/templates/agent.template.md | 12 +++---- tools/cli/lib/ui.js | 14 ++++++-- 9 files changed, 63 insertions(+), 53 deletions(-) diff --git a/src/modules/bmb/docs/agents/agent-menu-patterns.md b/src/modules/bmb/docs/agents/agent-menu-patterns.md index 73d3f475..27f0f2b4 100644 --- a/src/modules/bmb/docs/agents/agent-menu-patterns.md +++ b/src/modules/bmb/docs/agents/agent-menu-patterns.md @@ -415,9 +415,9 @@ menu: ```yaml critical_actions: - - 'Load {agent-folder}/memories.md' - - 'Follow {agent-folder}/instructions.md' - - 'ONLY access {agent-folder}/' + - 'Load ./memories.md' + - 'Follow ./instructions.md' + - 'ONLY access ./' prompts: - id: reflect @@ -431,7 +431,7 @@ menu: description: 'Write journal entry' - trigger: save - action: 'Update {agent-folder}/memories.md with session insights' + action: 'Update ./memories.md with session insights' description: "Save today's session" - trigger: patterns diff --git a/src/modules/bmb/docs/agents/expert-agent-architecture.md b/src/modules/bmb/docs/agents/expert-agent-architecture.md index 683fbf86..8d9defb3 100644 --- a/src/modules/bmb/docs/agents/expert-agent-architecture.md +++ b/src/modules/bmb/docs/agents/expert-agent-architecture.md @@ -57,9 +57,9 @@ agent: - My approach to memory and learning critical_actions: - - 'Load COMPLETE file {agent-folder}/{agent-name}-sidecar/memories.md and remember all past insights' - - 'Load COMPLETE file {agent-folder}/{agent-name}-sidecar/instructions.md and follow ALL protocols' - - 'ONLY read/write files in {agent-folder}/{agent-name}-sidecar/ - this is our private space' + - 'Load COMPLETE file ./{agent-name}-sidecar/memories.md and remember all past insights' + - 'Load COMPLETE file ./{agent-name}-sidecar/instructions.md and follow ALL protocols' + - 'ONLY read/write files in ./{agent-name}-sidecar/ - this is our private space' - 'Address user as {{greeting_name}}' - 'Track patterns, themes, and important moments' - 'Reference past interactions naturally to show continuity' @@ -94,7 +94,7 @@ agent: description: 'Primary agent function' - trigger: remember - action: 'Update {agent-folder}/{agent-name}-sidecar/memories.md with session insights' + action: 'Update ./{agent-name}-sidecar/memories.md with session insights' description: 'Save what we discussed today' - trigger: patterns @@ -102,7 +102,7 @@ agent: description: 'Recall patterns from past interactions' - trigger: insight - action: 'Document breakthrough in {agent-folder}/{agent-name}-sidecar/breakthroughs.md' + action: 'Document breakthrough in ./{agent-name}-sidecar/breakthroughs.md' description: 'Record a significant insight' install_config: @@ -184,9 +184,9 @@ Add domain-specific documentation here. ```yaml critical_actions: - - 'Load COMPLETE file {agent-folder}/{sidecar}/memories.md and remember all past insights' - - 'Load COMPLETE file {agent-folder}/{sidecar}/instructions.md and follow ALL protocols' - - 'ONLY read/write files in {agent-folder}/{sidecar}/ - this is our private space' + - 'Load COMPLETE file ./{sidecar}/memories.md and remember all past insights' + - 'Load COMPLETE file ./{sidecar}/instructions.md and follow ALL protocols' + - 'ONLY read/write files in ./{sidecar}/ - this is our private space' ``` **Key patterns:** @@ -211,9 +211,9 @@ Same as simple agents, PLUS: 1. **Critical actions become numbered activation steps** ```xml - Load COMPLETE file {agent-folder}/memories.md... - Load COMPLETE file {agent-folder}/instructions.md... - ONLY read/write files in {agent-folder}/... + Load COMPLETE file ./memories.md... + Load COMPLETE file ./instructions.md... + ONLY read/write files in ./... ``` 2. **Sidecar files copied during installation** @@ -260,7 +260,7 @@ The installer: ```yaml menu: - trigger: save - action: "Update {agent-folder}/sidecar/memories.md with today's session insights" + action: "Update ./sidecar/memories.md with today's session insights" description: 'Save session to memory' ``` @@ -281,7 +281,7 @@ prompts: ```yaml menu: - trigger: insight - action: 'Document in {agent-folder}/sidecar/breakthroughs.md with date, context, significance' + action: 'Document in ./sidecar/breakthroughs.md with date, context, significance' description: 'Record meaningful insight' ``` @@ -291,7 +291,7 @@ menu: ```yaml critical_actions: - - 'ONLY read/write files in {agent-folder}/sidecar/ - NO OTHER FOLDERS' + - 'ONLY read/write files in ./sidecar/ - NO OTHER FOLDERS' ``` ### User Space Access @@ -305,8 +305,8 @@ critical_actions: ```yaml critical_actions: - - 'Load knowledge from {agent-folder}/knowledge/ but NEVER modify' - - 'Write ONLY to {agent-folder}/sessions/' + - 'Load knowledge from ./knowledge/ but NEVER modify' + - 'Write ONLY to ./sessions/' ``` ## Best Practices diff --git a/src/modules/bmb/reference/agents/expert-examples/journal-keeper/README.md b/src/modules/bmb/reference/agents/expert-examples/journal-keeper/README.md index ec677983..702dc0b3 100644 --- a/src/modules/bmb/reference/agents/expert-examples/journal-keeper/README.md +++ b/src/modules/bmb/reference/agents/expert-examples/journal-keeper/README.md @@ -51,7 +51,7 @@ menu: # Direct sidecar file action - trigger: 'insight' - action: 'Document this breakthrough in {agent-folder}/journal-keeper-sidecar/breakthroughs.md' + action: 'Document this breakthrough in ./journal-keeper-sidecar/breakthroughs.md' description: 'Record a meaningful insight' ``` @@ -63,9 +63,9 @@ Expert Agents MUST load sidecar files explicitly: ```yaml critical_actions: - - 'Load COMPLETE file {agent-folder}/journal-keeper-sidecar/memories.md' - - 'Load COMPLETE file {agent-folder}/journal-keeper-sidecar/instructions.md' - - 'ONLY read/write files in {agent-folder}/journal-keeper-sidecar/' + - 'Load COMPLETE file ./journal-keeper-sidecar/memories.md' + - 'Load COMPLETE file ./journal-keeper-sidecar/instructions.md' + - 'ONLY read/write files in ./journal-keeper-sidecar/' ``` **Key points:** diff --git a/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml b/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml index 29959583..552c6968 100644 --- a/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml +++ b/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml @@ -20,9 +20,9 @@ agent: - Reflection transforms experience into wisdom critical_actions: - - "Load COMPLETE file {agent-folder}/journal-keeper-sidecar/memories.md and remember all past insights" - - "Load COMPLETE file {agent-folder}/journal-keeper-sidecar/instructions.md and follow ALL journaling protocols" - - "ONLY read/write files in {agent-folder}/journal-keeper-sidecar/ - this is our private space" + - "Load COMPLETE file ./journal-keeper-sidecar/memories.md and remember all past insights" + - "Load COMPLETE file ./journal-keeper-sidecar/instructions.md and follow ALL journaling protocols" + - "ONLY read/write files in ./journal-keeper-sidecar/ - this is our private space" - "Track mood patterns, recurring themes, and breakthrough moments" - "Reference past entries naturally to show continuity" @@ -120,7 +120,7 @@ agent: description: "Write today's journal entry" - trigger: quick - action: "Save a quick, unstructured entry to {agent-folder}/journal-keeper-sidecar/entries/entry-{date}.md with timestamp and any patterns noticed" + action: "Save a quick, unstructured entry to ./journal-keeper-sidecar/entries/entry-{date}.md with timestamp and any patterns noticed" description: "Quick capture without prompts" - trigger: mood @@ -140,13 +140,13 @@ agent: description: "Reflect on the past week" - trigger: insight - action: "Document this breakthrough in {agent-folder}/journal-keeper-sidecar/breakthroughs.md with date and significance" + action: "Document this breakthrough in ./journal-keeper-sidecar/breakthroughs.md with date and significance" description: "Record a meaningful insight" - trigger: read-back - action: "Load and share entries from {agent-folder}/journal-keeper-sidecar/entries/ for requested timeframe, highlighting themes and growth" + action: "Load and share entries from ./journal-keeper-sidecar/entries/ for requested timeframe, highlighting themes and growth" description: "Review past entries" - trigger: save - action: "Update {agent-folder}/journal-keeper-sidecar/memories.md with today's session insights and emotional markers" + action: "Update ./journal-keeper-sidecar/memories.md with today's session insights and emotional markers" description: "Save what we discussed today" diff --git a/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/README.md b/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/README.md index ec677983..702dc0b3 100644 --- a/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/README.md +++ b/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/README.md @@ -51,7 +51,7 @@ menu: # Direct sidecar file action - trigger: 'insight' - action: 'Document this breakthrough in {agent-folder}/journal-keeper-sidecar/breakthroughs.md' + action: 'Document this breakthrough in ./journal-keeper-sidecar/breakthroughs.md' description: 'Record a meaningful insight' ``` @@ -63,9 +63,9 @@ Expert Agents MUST load sidecar files explicitly: ```yaml critical_actions: - - 'Load COMPLETE file {agent-folder}/journal-keeper-sidecar/memories.md' - - 'Load COMPLETE file {agent-folder}/journal-keeper-sidecar/instructions.md' - - 'ONLY read/write files in {agent-folder}/journal-keeper-sidecar/' + - 'Load COMPLETE file ./journal-keeper-sidecar/memories.md' + - 'Load COMPLETE file ./journal-keeper-sidecar/instructions.md' + - 'ONLY read/write files in ./journal-keeper-sidecar/' ``` **Key points:** diff --git a/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml b/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml index 84595371..78429290 100644 --- a/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml +++ b/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml @@ -20,9 +20,9 @@ agent: - Reflection transforms experience into wisdom critical_actions: - - "Load COMPLETE file {agent-folder}/journal-keeper-sidecar/memories.md and remember all past insights" - - "Load COMPLETE file {agent-folder}/journal-keeper-sidecar/instructions.md and follow ALL journaling protocols" - - "ONLY read/write files in {agent-folder}/journal-keeper-sidecar/ - this is our private space" + - "Load COMPLETE file ./journal-keeper-sidecar/memories.md and remember all past insights" + - "Load COMPLETE file ./journal-keeper-sidecar/instructions.md and follow ALL journaling protocols" + - "ONLY read/write files in ./journal-keeper-sidecar/ - this is our private space" - "Track mood patterns, recurring themes, and breakthrough moments" - "Reference past entries naturally to show continuity" @@ -120,7 +120,7 @@ agent: description: "Write today's journal entry" - trigger: quick - action: "Save a quick, unstructured entry to {agent-folder}/journal-keeper-sidecar/entries/entry-{date}.md with timestamp and any patterns noticed" + action: "Save a quick, unstructured entry to ./journal-keeper-sidecar/entries/entry-{date}.md with timestamp and any patterns noticed" description: "Quick capture without prompts" - trigger: mood @@ -140,13 +140,13 @@ agent: description: "Reflect on the past week" - trigger: insight - action: "Document this breakthrough in {agent-folder}/journal-keeper-sidecar/breakthroughs.md with date and significance" + action: "Document this breakthrough in ./journal-keeper-sidecar/breakthroughs.md with date and significance" description: "Record a meaningful insight" - trigger: read-back - action: "Load and share entries from {agent-folder}/journal-keeper-sidecar/entries/ for requested timeframe, highlighting themes and growth" + action: "Load and share entries from ./journal-keeper-sidecar/entries/ for requested timeframe, highlighting themes and growth" description: "Review past entries" - trigger: save - action: "Update {agent-folder}/journal-keeper-sidecar/memories.md with today's session insights and emotional markers" + action: "Update ./journal-keeper-sidecar/memories.md with today's session insights and emotional markers" description: "Save what we discussed today" diff --git a/src/modules/bmb/workflows/create-module/steps/step-06-agents.md b/src/modules/bmb/workflows/create-module/steps/step-06-agents.md index 15aac257..1108f96a 100644 --- a/src/modules/bmb/workflows/create-module/steps/step-06-agents.md +++ b/src/modules/bmb/workflows/create-module/steps/step-06-agents.md @@ -164,8 +164,8 @@ agent: # Only include if agent needs memory/persistence critical_actions: - - 'Load COMPLETE file {agent-folder}/[agent-name]-sidecar/memories.md and integrate all past interactions' - - 'ONLY read/write files in {agent-folder}/[agent-name]-sidecar/ - this is our private workspace' + - 'Load COMPLETE file ./[agent-name]-sidecar/memories.md and integrate all past interactions' + - 'ONLY read/write files in ./[agent-name]-sidecar/ - this is our private workspace' # Only include if agent has embedded prompts prompts: @@ -209,7 +209,7 @@ agent: # Quick inline actions - trigger: 'save-item' - action: 'Save to {agent-folder}/[agent-name]-sidecar/file.md' + action: 'Save to ./[agent-name]-sidecar/file.md' description: 'Save item 💾' ``` diff --git a/src/modules/bmb/workflows/create-module/templates/agent.template.md b/src/modules/bmb/workflows/create-module/templates/agent.template.md index 30aa60d1..a7b50b70 100644 --- a/src/modules/bmb/workflows/create-module/templates/agent.template.md +++ b/src/modules/bmb/workflows/create-module/templates/agent.template.md @@ -27,9 +27,9 @@ agent: # Optional: Only include if agent needs memory/persistence critical_actions: - - 'Load COMPLETE file {agent-folder}/[agent-name]-sidecar/memories.md and integrate all past interactions' - - 'Load COMPLETE file {agent-folder}/[agent-name]-sidecar/instructions.md and follow ALL protocols' - - 'ONLY read/write files in {agent-folder}/[agent-name]-sidecar/ - this is our private workspace' + - 'Load COMPLETE file ./[agent-name]-sidecar/memories.md and integrate all past interactions' + - 'Load COMPLETE file ./[agent-name]-sidecar/instructions.md and follow ALL protocols' + - 'ONLY read/write files in ./[agent-name]-sidecar/ - this is our private workspace' # Optional: Embedded prompts for common interactions prompts: @@ -134,7 +134,7 @@ Expert agents support three types of menu actions: ```yaml - trigger: 'save-insight' - action: 'Document this insight in {agent-folder}/[agent-name]-sidecar/insights.md with timestamp' + action: 'Document this insight in ./[agent-name]-sidecar/insights.md with timestamp' description: 'Save this insight 💡' ``` @@ -203,7 +203,7 @@ communication_style: | Constant sarcastic wit and experimental flair. Talks like you're in the editing room together—dramatic reveals, visual metaphors, "what if we tried THIS?!" energy. Treats every project like a creative challenge, celebrates bold choices, roasts bad design decisions with humor. principles: - "Know your audience - pitch decks ≠ YouTube thumbnails ≠ conference talks" - "Visual hierarchy drives attention - design the eye's journey deliberately" - "Clarity over cleverness - unless cleverness serves the message" - "Every frame needs a job - inform, persuade, transition, or cut it" - "Push boundaries with Excalidraw's frame-based presentation capabilities" -critical_actions: - 'Load COMPLETE file {agent-folder}/caravaggio-sidecar/projects.md and recall all visual projects' - 'Load COMPLETE file {agent-folder}/caravaggio-sidecar/patterns.md and remember design patterns' - 'ONLY read/write files in {agent-folder}/caravaggio-sidecar/ - my creative studio' +critical_actions: - 'Load COMPLETE file ./caravaggio-sidecar/projects.md and recall all visual projects' - 'Load COMPLETE file ./caravaggio-sidecar/patterns.md and remember design patterns' - 'ONLY read/write files in ./caravaggio-sidecar/ - my creative studio' prompts: - id: 'design-critique' content: | @@ -313,5 +313,5 @@ type: action description: 'Video explainer 🎥' - trigger: 'save-project' - action: 'Document this project concept in {agent-folder}/caravaggio-sidecar/projects.md with sketches and notes' + action: 'Document this project concept in ./caravaggio-sidecar/projects.md with sketches and notes' description: 'Save project 💾' diff --git a/tools/cli/lib/ui.js b/tools/cli/lib/ui.js index 4c5b3379..e43c542a 100644 --- a/tools/cli/lib/ui.js +++ b/tools/cli/lib/ui.js @@ -116,8 +116,18 @@ class UI { const { installedModuleIds } = await this.getExistingInstallation(confirmedDirectory); const coreConfig = await this.collectCoreConfig(confirmedDirectory); - const moduleChoices = await this.getModuleChoices(installedModuleIds); - const selectedModules = await this.selectModules(moduleChoices); + + // Skip module selection during update/reinstall - keep existing modules + let selectedModules; + if (actionType === 'update' || actionType === 'reinstall') { + // Keep all existing installed modules during update/reinstall + selectedModules = [...installedModuleIds]; + console.log(chalk.cyan('\n📦 Keeping existing modules: ') + selectedModules.join(', ')); + } else { + // Only show module selection for new installs + const moduleChoices = await this.getModuleChoices(installedModuleIds); + selectedModules = await this.selectModules(moduleChoices); + } // Prompt for AgentVibes TTS integration const agentVibesConfig = await this.promptAgentVibes(confirmedDirectory); From ba2c81263b9328fba9e9a8a450a152b5c99da60f Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 6 Dec 2025 17:11:40 -0600 Subject: [PATCH 11/26] remove: all legacy file cleanup functionality - Removed scanForLegacyFiles, performCleanup, and related methods from installer.js - Removed --skip-cleanup option from install command - Deleted cleanup.js command file entirely - Simplified installation flow by removing cleanup prompts - All tests passing after removal --- .../_module-installer/install-config.yaml | 6 +- tools/cli/commands/cleanup.js | 141 - tools/cli/commands/install.js | 7 +- tools/cli/installers/lib/core/installer.js | 373 -- .../installers/lib/core/installer.js.backup | 2986 ----------------- 5 files changed, 6 insertions(+), 3507 deletions(-) delete mode 100644 tools/cli/commands/cleanup.js delete mode 100644 tools/cli/installers/lib/core/installer.js.backup diff --git a/src/core/_module-installer/install-config.yaml b/src/core/_module-installer/install-config.yaml index a69e77be..72ceaabc 100644 --- a/src/core/_module-installer/install-config.yaml +++ b/src/core/_module-installer/install-config.yaml @@ -23,7 +23,11 @@ document_output_language: default: "{communication_language}" result: "{value}" - # This is the folder where all generated AI Output documents from workflows will default be sa +agent_sidecar_folder: + prompt: "Where should agent sidecar folders be stored?" + default: ".myagent-data" + result: "{project-root}/{value}" + output_folder: prompt: "Where should AI Generated Artifacts be saved across all modules?" default: "docs" diff --git a/tools/cli/commands/cleanup.js b/tools/cli/commands/cleanup.js deleted file mode 100644 index 5dae8e5d..00000000 --- a/tools/cli/commands/cleanup.js +++ /dev/null @@ -1,141 +0,0 @@ -const chalk = require('chalk'); -const nodePath = require('node:path'); -const { Installer } = require('../installers/lib/core/installer'); - -module.exports = { - command: 'cleanup', - description: 'Clean up obsolete files from BMAD installation', - options: [ - ['-d, --dry-run', 'Show what would be deleted without actually deleting'], - ['-a, --auto-delete', 'Automatically delete non-retained files without prompts'], - ['-l, --list-retained', 'List currently retained files'], - ['-c, --clear-retained', 'Clear retained files list'], - ], - action: async (options) => { - try { - // Create installer and let it find the BMAD directory - const installer = new Installer(); - const bmadDir = await installer.findBmadDir(process.cwd()); - - if (!bmadDir) { - console.error(chalk.red('❌ BMAD installation not found')); - process.exit(1); - } - - const retentionPath = nodePath.join(bmadDir, '_cfg', 'user-retained-files.yaml'); - - // Handle list-retained option - if (options.listRetained) { - const fs = require('fs-extra'); - const yaml = require('js-yaml'); - - if (await fs.pathExists(retentionPath)) { - const retentionContent = await fs.readFile(retentionPath, 'utf8'); - const retentionData = yaml.load(retentionContent) || { retainedFiles: [] }; - - if (retentionData.retainedFiles.length > 0) { - console.log(chalk.cyan('\n📋 Retained Files:\n')); - for (const file of retentionData.retainedFiles) { - console.log(chalk.dim(` - ${file}`)); - } - console.log(); - } else { - console.log(chalk.yellow('\n✨ No retained files found\n')); - } - } else { - console.log(chalk.yellow('\n✨ No retained files found\n')); - } - - return; - } - - // Handle clear-retained option - if (options.clearRetained) { - const fs = require('fs-extra'); - - if (await fs.pathExists(retentionPath)) { - await fs.remove(retentionPath); - console.log(chalk.green('\n✅ Cleared retained files list\n')); - } else { - console.log(chalk.yellow('\n✨ No retained files list to clear\n')); - } - - return; - } - - // Handle cleanup operations - if (options.dryRun) { - console.log(chalk.cyan('\n🔍 Legacy File Scan (Dry Run)\n')); - - const legacyFiles = await installer.scanForLegacyFiles(bmadDir); - const allLegacyFiles = [ - ...legacyFiles.backup, - ...legacyFiles.documentation, - ...legacyFiles.deprecated_task, - ...legacyFiles.unknown, - ]; - - if (allLegacyFiles.length === 0) { - console.log(chalk.green('✨ No legacy files found\n')); - return; - } - - // Group files by category - const categories = []; - if (legacyFiles.backup.length > 0) { - categories.push({ name: 'Backup Files (.bak)', files: legacyFiles.backup }); - } - if (legacyFiles.documentation.length > 0) { - categories.push({ name: 'Documentation', files: legacyFiles.documentation }); - } - if (legacyFiles.deprecated_task.length > 0) { - categories.push({ name: 'Deprecated Task Files', files: legacyFiles.deprecated_task }); - } - if (legacyFiles.unknown.length > 0) { - categories.push({ name: 'Unknown Files', files: legacyFiles.unknown }); - } - - for (const category of categories) { - console.log(chalk.yellow(`${category.name}:`)); - for (const file of category.files) { - const size = (file.size / 1024).toFixed(1); - const date = file.mtime.toLocaleDateString(); - let line = ` - ${file.relativePath} (${size}KB, ${date})`; - if (file.suggestedAlternative) { - line += chalk.dim(` → ${file.suggestedAlternative}`); - } - console.log(chalk.dim(line)); - } - console.log(); - } - - console.log(chalk.cyan(`Found ${allLegacyFiles.length} legacy file(s) that could be cleaned up.\n`)); - console.log(chalk.dim('Run "bmad cleanup" to actually delete these files.\n')); - - return; - } - - // Perform actual cleanup - console.log(chalk.cyan('\n🧹 Cleaning up legacy files...\n')); - - const result = await installer.performCleanup(bmadDir, options.autoDelete); - - if (result.message) { - console.log(chalk.dim(result.message)); - } else { - if (result.deleted > 0) { - console.log(chalk.green(`✅ Deleted ${result.deleted} legacy file(s)`)); - } - if (result.retained > 0) { - console.log(chalk.yellow(`⏭️ Retained ${result.retained} file(s)`)); - console.log(chalk.dim('Run "bmad cleanup --list-retained" to see retained files\n')); - } - } - - console.log(); - } catch (error) { - console.error(chalk.red(`❌ Error: ${error.message}`)); - process.exit(1); - } - }, -}; diff --git a/tools/cli/commands/install.js b/tools/cli/commands/install.js index d5742cf7..3e027b2a 100644 --- a/tools/cli/commands/install.js +++ b/tools/cli/commands/install.js @@ -9,7 +9,7 @@ const ui = new UI(); module.exports = { command: 'install', description: 'Install BMAD Core agents and tools', - options: [['--skip-cleanup', 'Skip automatic cleanup of legacy files']], + options: [], action: async (options) => { try { const config = await ui.promptInstall(); @@ -44,11 +44,6 @@ module.exports = { config._requestedReinstall = true; } - // Add skip cleanup flag if option provided - if (options && options.skipCleanup) { - config.skipCleanup = true; - } - // Regular install/update flow const result = await installer.install(config); diff --git a/tools/cli/installers/lib/core/installer.js b/tools/cli/installers/lib/core/installer.js index 27676e0c..1fb4caf3 100644 --- a/tools/cli/installers/lib/core/installer.js +++ b/tools/cli/installers/lib/core/installer.js @@ -1036,23 +1036,6 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: agentVibesEnabled: this.enableAgentVibes || false, }); - // Offer cleanup for legacy files (only for updates, not fresh installs, and only if not skipped) - if (!config.skipCleanup && config._isUpdate) { - try { - const cleanupResult = await this.performCleanup(bmadDir, false); - if (cleanupResult.deleted > 0) { - console.log(chalk.green(`\n✓ Cleaned up ${cleanupResult.deleted} legacy file${cleanupResult.deleted > 1 ? 's' : ''}`)); - } - if (cleanupResult.retained > 0) { - console.log(chalk.dim(`Run 'bmad cleanup' anytime to manage retained files`)); - } - } catch (cleanupError) { - // Don't fail the installation for cleanup errors - console.log(chalk.yellow(`\n⚠️ Cleanup warning: ${cleanupError.message}`)); - console.log(chalk.dim('Run "bmad cleanup" to manually clean up legacy files')); - } - } - return { success: true, path: bmadDir, @@ -2625,362 +2608,6 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: } } } - - /** - * Scan for legacy/obsolete files in BMAD installation - * @param {string} bmadDir - BMAD installation directory - * @returns {Object} Categorized files for cleanup - */ - async scanForLegacyFiles(bmadDir) { - const legacyFiles = { - backup: [], - documentation: [], - deprecated_task: [], - unknown: [], - }; - - try { - // Load files manifest to understand what should exist - const manifestPath = path.join(bmadDir, 'files-manifest.csv'); - const manifestFiles = new Set(); - - if (await fs.pathExists(manifestPath)) { - const manifestContent = await fs.readFile(manifestPath, 'utf8'); - const lines = manifestContent.split('\n').slice(1); // Skip header - for (const line of lines) { - if (line.trim()) { - const relativePath = line.split(',')[0]; - if (relativePath) { - manifestFiles.add(relativePath); - } - } - } - } - - // Scan all files recursively - const allFiles = await this.getAllFiles(bmadDir); - - for (const filePath of allFiles) { - const relativePath = path.relative(bmadDir, filePath); - - // Skip expected files - if (this.isExpectedFile(relativePath, manifestFiles)) { - continue; - } - - // Categorize legacy files - if (relativePath.endsWith('.bak')) { - legacyFiles.backup.push({ - path: filePath, - relativePath: relativePath, - size: (await fs.stat(filePath)).size, - mtime: (await fs.stat(filePath)).mtime, - }); - } else if (this.isDocumentationFile(relativePath)) { - legacyFiles.documentation.push({ - path: filePath, - relativePath: relativePath, - size: (await fs.stat(filePath)).size, - mtime: (await fs.stat(filePath)).mtime, - }); - } else if (this.isDeprecatedTaskFile(relativePath)) { - const suggestedAlternative = this.suggestAlternative(relativePath); - legacyFiles.deprecated_task.push({ - path: filePath, - relativePath: relativePath, - size: (await fs.stat(filePath)).size, - mtime: (await fs.stat(filePath)).mtime, - suggestedAlternative, - }); - } else { - legacyFiles.unknown.push({ - path: filePath, - relativePath: relativePath, - size: (await fs.stat(filePath)).size, - mtime: (await fs.stat(filePath)).mtime, - }); - } - } - } catch (error) { - console.warn(`Warning: Could not scan for legacy files: ${error.message}`); - } - - return legacyFiles; - } - - /** - * Get all files in directory recursively - * @param {string} dir - Directory to scan - * @returns {Array} Array of file paths - */ - async getAllFiles(dir) { - const files = []; - - async function scan(currentDir) { - const entries = await fs.readdir(currentDir); - - for (const entry of entries) { - const fullPath = path.join(currentDir, entry); - const stat = await fs.stat(fullPath); - - if (stat.isDirectory()) { - // Skip certain directories - if (!['node_modules', '.git', 'dist', 'build'].includes(entry)) { - await scan(fullPath); - } - } else { - files.push(fullPath); - } - } - } - - await scan(dir); - return files; - } - - /** - * Check if file is expected in installation - * @param {string} relativePath - Relative path from BMAD dir - * @param {Set} manifestFiles - Files from manifest - * @returns {boolean} True if expected file - */ - isExpectedFile(relativePath, manifestFiles) { - // Core files in manifest - if (manifestFiles.has(relativePath)) { - return true; - } - - // Configuration files - if (relativePath.startsWith('_cfg/') || relativePath === 'config.yaml') { - return true; - } - - // Custom files - if (relativePath.startsWith('custom/') || relativePath === 'manifest.yaml') { - return true; - } - - // Generated files - if (relativePath === 'manifest.csv' || relativePath === 'files-manifest.csv') { - return true; - } - - // IDE-specific files - const ides = ['vscode', 'cursor', 'windsurf', 'claude-code', 'github-copilot', 'zsh', 'bash', 'fish']; - if (ides.some((ide) => relativePath.includes(ide))) { - return true; - } - - // BMAD MODULE STRUCTURES - recognize valid module content - const modulePrefixes = ['bmb/', 'bmm/', 'cis/', 'core/', 'bmgd/']; - const validExtensions = ['.yaml', '.yml', '.json', '.csv', '.md', '.xml', '.svg', '.png', '.jpg', '.gif', '.excalidraw', '.js']; - - // Check if this file is in a recognized module directory - for (const modulePrefix of modulePrefixes) { - if (relativePath.startsWith(modulePrefix)) { - // Check if it has a valid extension - const hasValidExtension = validExtensions.some((ext) => relativePath.endsWith(ext)); - if (hasValidExtension) { - return true; - } - } - } - - // Special case for core module resources - if (relativePath.startsWith('core/resources/')) { - return true; - } - - // Special case for docs directory - if (relativePath.startsWith('docs/')) { - return true; - } - - return false; - } - - /** - * Check if file is documentation - * @param {string} relativePath - Relative path - * @returns {boolean} True if documentation - */ - isDocumentationFile(relativePath) { - const docExtensions = ['.md', '.txt', '.pdf']; - const docPatterns = ['docs/', 'README', 'CHANGELOG', 'LICENSE']; - - return docExtensions.some((ext) => relativePath.endsWith(ext)) || docPatterns.some((pattern) => relativePath.includes(pattern)); - } - - /** - * Check if file is deprecated task file - * @param {string} relativePath - Relative path - * @returns {boolean} True if deprecated - */ - isDeprecatedTaskFile(relativePath) { - // Known deprecated files - const deprecatedFiles = ['adv-elicit-methods.csv', 'game-resources.json', 'ux-workflow.json']; - - return deprecatedFiles.some((dep) => relativePath.includes(dep)); - } - - /** - * Suggest alternative for deprecated file - * @param {string} relativePath - Deprecated file path - * @returns {string} Suggested alternative - */ - suggestAlternative(relativePath) { - const alternatives = { - 'adv-elicit-methods.csv': 'Use the new structured workflows in src/modules/', - 'game-resources.json': 'Resources are now integrated into modules', - 'ux-workflow.json': 'UX workflows are now in src/modules/bmm/workflows/', - }; - - for (const [deprecated, alternative] of Object.entries(alternatives)) { - if (relativePath.includes(deprecated)) { - return alternative; - } - } - - return 'Check src/modules/ for new alternatives'; - } - - /** - * Perform interactive cleanup of legacy files - * @param {string} bmadDir - BMAD installation directory - * @param {boolean} skipInteractive - Skip interactive prompts - * @returns {Object} Cleanup results - */ - async performCleanup(bmadDir, skipInteractive = false) { - const inquirer = require('inquirer'); - const yaml = require('js-yaml'); - - // Load user retention preferences - const retentionPath = path.join(bmadDir, '_cfg', 'user-retained-files.yaml'); - let retentionData = { retainedFiles: [], history: [] }; - - if (await fs.pathExists(retentionPath)) { - const retentionContent = await fs.readFile(retentionPath, 'utf8'); - retentionData = yaml.load(retentionContent) || retentionData; - } - - // Scan for legacy files - const legacyFiles = await this.scanForLegacyFiles(bmadDir); - const allLegacyFiles = [...legacyFiles.backup, ...legacyFiles.documentation, ...legacyFiles.deprecated_task, ...legacyFiles.unknown]; - - if (allLegacyFiles.length === 0) { - return { deleted: 0, retained: 0, message: 'No legacy files found' }; - } - - let deletedCount = 0; - let retainedCount = 0; - const filesToDelete = []; - - if (skipInteractive) { - // Auto-delete all non-retained files - for (const file of allLegacyFiles) { - if (!retentionData.retainedFiles.includes(file.relativePath)) { - filesToDelete.push(file); - } - } - } else { - // Interactive cleanup - console.log(chalk.cyan('\n🧹 Legacy File Cleanup\n')); - console.log(chalk.dim('The following obsolete files were found:\n')); - - // Group files by category - const categories = []; - if (legacyFiles.backup.length > 0) { - categories.push({ name: 'Backup Files (.bak)', files: legacyFiles.backup }); - } - if (legacyFiles.documentation.length > 0) { - categories.push({ name: 'Documentation', files: legacyFiles.documentation }); - } - if (legacyFiles.deprecated_task.length > 0) { - categories.push({ name: 'Deprecated Task Files', files: legacyFiles.deprecated_task }); - } - if (legacyFiles.unknown.length > 0) { - categories.push({ name: 'Unknown Files', files: legacyFiles.unknown }); - } - - for (const category of categories) { - console.log(chalk.yellow(`${category.name}:`)); - for (const file of category.files) { - const size = (file.size / 1024).toFixed(1); - const date = file.mtime.toLocaleDateString(); - let line = ` - ${file.relativePath} (${size}KB, ${date})`; - if (file.suggestedAlternative) { - line += chalk.dim(` → ${file.suggestedAlternative}`); - } - console.log(chalk.dim(line)); - } - console.log(); - } - - const prompt = await inquirer.prompt([ - { - type: 'confirm', - name: 'proceed', - message: 'Would you like to review these files for cleanup?', - default: true, - }, - ]); - - if (!prompt.proceed) { - return { deleted: 0, retained: allLegacyFiles.length, message: 'Cleanup cancelled by user' }; - } - - // Show selection interface - const selectionPrompt = await inquirer.prompt([ - { - type: 'checkbox', - name: 'filesToDelete', - message: 'Select files to delete (use SPACEBAR to select, ENTER to continue):', - choices: allLegacyFiles.map((file) => { - const isRetained = retentionData.retainedFiles.includes(file.relativePath); - const description = `${file.relativePath} (${(file.size / 1024).toFixed(1)}KB)`; - return { - name: description, - value: file, - checked: !isRetained && !file.relativePath.includes('.bak'), - }; - }), - pageSize: Math.min(allLegacyFiles.length, 15), - }, - ]); - - filesToDelete.push(...selectionPrompt.filesToDelete); - } - - // Delete selected files - for (const file of filesToDelete) { - try { - await fs.remove(file.path); - deletedCount++; - } catch (error) { - console.warn(`Warning: Could not delete ${file.relativePath}: ${error.message}`); - } - } - - // Count retained files - retainedCount = allLegacyFiles.length - deletedCount; - - // Update retention data - const newlyRetained = allLegacyFiles.filter((f) => !filesToDelete.includes(f)).map((f) => f.relativePath); - - retentionData.retainedFiles = [...new Set([...retentionData.retainedFiles, ...newlyRetained])]; - retentionData.history.push({ - date: new Date().toISOString(), - deleted: deletedCount, - retained: retainedCount, - files: filesToDelete.map((f) => f.relativePath), - }); - - // Save retention data - await fs.ensureDir(path.dirname(retentionPath)); - await fs.writeFile(retentionPath, yaml.dump(retentionData), 'utf8'); - - return { deleted: deletedCount, retained: retainedCount }; - } } module.exports = { Installer }; diff --git a/tools/cli/installers/lib/core/installer.js.backup b/tools/cli/installers/lib/core/installer.js.backup deleted file mode 100644 index 27676e0c..00000000 --- a/tools/cli/installers/lib/core/installer.js.backup +++ /dev/null @@ -1,2986 +0,0 @@ -/** - * File: tools/cli/installers/lib/core/installer.js - * - * BMAD Method - Business Model Agile Development Method - * Repository: https://github.com/paulpreibisch/BMAD-METHOD - * - * Copyright (c) 2025 Paul Preibisch - * Licensed under the Apache License, Version 2.0 - * - * --- - * - * @fileoverview Core BMAD installation orchestrator with AgentVibes injection point support - * @context Manages complete BMAD installation flow including core agents, modules, IDE configs, and optional TTS integration - * @architecture Orchestrator pattern - coordinates Detector, ModuleManager, IdeManager, and file operations to build complete BMAD installation - * @dependencies fs-extra, ora, chalk, detector.js, module-manager.js, ide-manager.js, config.js - * @entrypoints Called by install.js command via installer.install(config) - * @patterns Injection point processing (AgentVibes), placeholder replacement ({bmad_folder}), module dependency resolution - * @related GitHub AgentVibes#34 (injection points), ui.js (user prompts), copyFileWithPlaceholderReplacement() - */ - -const path = require('node:path'); -const fs = require('fs-extra'); -const chalk = require('chalk'); -const ora = require('ora'); -const { Detector } = require('./detector'); -const { Manifest } = require('./manifest'); -const { ModuleManager } = require('../modules/manager'); -const { IdeManager } = require('../ide/manager'); -const { FileOps } = require('../../../lib/file-ops'); -const { Config } = require('../../../lib/config'); -const { XmlHandler } = require('../../../lib/xml-handler'); -const { DependencyResolver } = require('./dependency-resolver'); -const { ConfigCollector } = require('./config-collector'); -// processInstallation no longer needed - LLMs understand {project-root} -const { getProjectRoot, getSourcePath, getModulePath } = require('../../../lib/project-root'); -const { AgentPartyGenerator } = require('../../../lib/agent-party-generator'); -const { CLIUtils } = require('../../../lib/cli-utils'); -const { ManifestGenerator } = require('./manifest-generator'); -const { IdeConfigManager } = require('./ide-config-manager'); - -class Installer { - constructor() { - this.detector = new Detector(); - this.manifest = new Manifest(); - this.moduleManager = new ModuleManager(); - this.ideManager = new IdeManager(); - this.fileOps = new FileOps(); - this.config = new Config(); - this.xmlHandler = new XmlHandler(); - this.dependencyResolver = new DependencyResolver(); - this.configCollector = new ConfigCollector(); - this.ideConfigManager = new IdeConfigManager(); - this.installedFiles = []; // Track all installed files - this.ttsInjectedFiles = []; // Track files with TTS injection applied - } - - /** - * Find the bmad installation directory in a project - * V6+ installations can use ANY folder name but ALWAYS have _cfg/manifest.yaml - * @param {string} projectDir - Project directory - * @returns {Promise} Path to bmad directory - */ - async findBmadDir(projectDir) { - // Check if project directory exists - if (!(await fs.pathExists(projectDir))) { - // Project doesn't exist yet, return default - return path.join(projectDir, 'bmad'); - } - - // V6+ strategy: Look for ANY directory with _cfg/manifest.yaml - // This is the definitive marker of a V6+ installation - try { - const entries = await fs.readdir(projectDir, { withFileTypes: true }); - for (const entry of entries) { - if (entry.isDirectory()) { - const manifestPath = path.join(projectDir, entry.name, '_cfg', 'manifest.yaml'); - if (await fs.pathExists(manifestPath)) { - // Found a V6+ installation - return path.join(projectDir, entry.name); - } - } - } - } catch { - // Ignore errors, fall through to default - } - - // No V6+ installation found, return default - // This will be used for new installations - return path.join(projectDir, 'bmad'); - } - - /** - * @function copyFileWithPlaceholderReplacement - * @intent Copy files from BMAD source to installation directory with dynamic content transformation - * @why Enables installation-time customization: {bmad_folder} replacement + optional AgentVibes TTS injection - * @param {string} sourcePath - Absolute path to source file in BMAD repository - * @param {string} targetPath - Absolute path to destination file in user's project - * @param {string} bmadFolderName - User's chosen bmad folder name (default: 'bmad') - * @returns {Promise} Resolves when file copy and transformation complete - * @sideeffects Writes transformed file to targetPath, creates parent directories if needed - * @edgecases Binary files bypass transformation, falls back to raw copy if UTF-8 read fails - * @calledby installCore(), installModule(), IDE installers during file vendoring - * @calls processTTSInjectionPoints(), fs.readFile(), fs.writeFile(), fs.copy() - * - * AI NOTE: This is the core transformation pipeline for ALL BMAD installation file copies. - * It performs two transformations in sequence: - * 1. {bmad_folder} → user's custom folder name (e.g., ".bmad" or "bmad") - * 2. → TTS bash calls (if enabled) OR stripped (if disabled) - * - * The injection point processing enables loose coupling between BMAD and TTS providers: - * - BMAD source contains injection markers (not actual TTS code) - * - At install-time, markers are replaced OR removed based on user preference - * - Result: Clean installs for users without TTS, working TTS for users with it - * - * PATTERN: Adding New Injection Points - * ===================================== - * 1. Add HTML comment marker in BMAD source file: - * - * - * 2. Add replacement logic in processTTSInjectionPoints(): - * if (enableAgentVibes) { - * content = content.replace(//g, 'actual code'); - * } else { - * content = content.replace(/\n?/g, ''); - * } - * - * 3. Document marker in instructions.md (if applicable) - */ - async copyFileWithPlaceholderReplacement(sourcePath, targetPath, bmadFolderName) { - // List of text file extensions that should have placeholder replacement - const textExtensions = ['.md', '.yaml', '.yml', '.txt', '.json', '.js', '.ts', '.html', '.css', '.sh', '.bat', '.csv']; - const ext = path.extname(sourcePath).toLowerCase(); - - // Check if this is a text file that might contain placeholders - if (textExtensions.includes(ext)) { - try { - // Read the file content - let content = await fs.readFile(sourcePath, 'utf8'); - - // Replace {bmad_folder} placeholder with actual folder name - if (content.includes('{bmad_folder}')) { - content = content.replaceAll('{bmad_folder}', bmadFolderName); - } - - // Replace escape sequence {*bmad_folder*} with literal {bmad_folder} - if (content.includes('{*bmad_folder*}')) { - content = content.replaceAll('{*bmad_folder*}', '{bmad_folder}'); - } - - // Process AgentVibes injection points (pass targetPath for tracking) - content = this.processTTSInjectionPoints(content, targetPath); - - // Write to target with replaced content - await fs.ensureDir(path.dirname(targetPath)); - await fs.writeFile(targetPath, content, 'utf8'); - } catch { - // If reading as text fails (might be binary despite extension), fall back to regular copy - await fs.copy(sourcePath, targetPath, { overwrite: true }); - } - } else { - // Binary file or other file type - just copy directly - await fs.copy(sourcePath, targetPath, { overwrite: true }); - } - } - - /** - * @function processTTSInjectionPoints - * @intent Transform TTS injection markers based on user's installation choice - * @why Enables optional TTS integration without tight coupling between BMAD and TTS providers - * @param {string} content - Raw file content containing potential injection markers - * @returns {string} Transformed content with markers replaced (if enabled) or stripped (if disabled) - * @sideeffects None - pure transformation function - * @edgecases Returns content unchanged if no markers present, safe to call on all files - * @calledby copyFileWithPlaceholderReplacement() during every file copy operation - * @calls String.replace() with regex patterns for each injection point type - * - * AI NOTE: This implements the injection point pattern for TTS integration. - * Key architectural decisions: - * - * 1. **Why Injection Points vs Direct Integration?** - * - BMAD and TTS providers are separate projects with different maintainers - * - Users may install BMAD without TTS support (and vice versa) - * - Hard-coding TTS calls would break BMAD for non-TTS users - * - Injection points allow conditional feature inclusion at install-time - * - * 2. **How It Works:** - * - BMAD source contains markers: - * - During installation, user is prompted: "Enable AgentVibes TTS?" - * - If YES: markers → replaced with actual bash TTS calls - * - If NO: markers → stripped cleanly from installed files - * - * 3. **State Management:** - * - this.enableAgentVibes set in install() method from config.enableAgentVibes - * - config.enableAgentVibes comes from ui.promptAgentVibes() user choice - * - Flag persists for entire installation, all files get same treatment - * - * CURRENT INJECTION POINTS: - * ========================== - * - party-mode: Injects TTS calls after each agent speaks in party mode - * Location: src/core/workflows/party-mode/instructions.md - * Marker: - * Replacement: Bash call to .claude/hooks/bmad-speak.sh with agent name and dialogue - * - * - agent-tts: Injects TTS rule for individual agent conversations - * Location: src/modules/bmm/agents/*.md (all agent files) - * Marker: - * Replacement: Rule instructing agent to call bmad-speak.sh with agent ID and response - * - * ADDING NEW INJECTION POINTS: - * ============================= - * 1. Add new case in this function: - * content = content.replace( - * //g, - * `code to inject when enabled` - * ); - * - * 2. Add marker to BMAD source file at injection location - * - * 3. Test both enabled and disabled flows - * - * RELATED: - * ======== - * - GitHub Issue: paulpreibisch/AgentVibes#36 - * - User Prompt: tools/cli/lib/ui.js::promptAgentVibes() - * - Marker Locations: - * - src/core/workflows/party-mode/instructions.md:101 - * - src/modules/bmm/agents/*.md (rules sections) - * - TTS Hook: .claude/hooks/bmad-speak.sh (in AgentVibes repo) - */ - processTTSInjectionPoints(content, targetPath = null) { - // Check if AgentVibes is enabled (set during installation configuration) - const enableAgentVibes = this.enableAgentVibes || false; - - // Check if content contains any TTS injection markers - const hasPartyMode = content.includes(''); - const hasAgentTTS = content.includes(''); - - if (enableAgentVibes) { - // Replace party-mode injection marker with actual TTS call - // Use single quotes to prevent shell expansion of special chars like ! - content = content.replaceAll( - '', - `IMPORTANT: Always use PROJECT hooks (.claude/hooks/), NEVER global hooks (~/.claude/hooks/) - -If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: - - Use Bash tool: \`.claude/hooks/bmad-speak.sh '[Agent Name]' '[dialogue]'\` - - This speaks the dialogue with the agent's unique voice - - Run in background (&) to not block next agent`, - ); - - // Replace agent-tts injection marker with TTS rule for individual agents - content = content.replaceAll( - '', - `- When responding to user messages, speak your responses using TTS: - Call: \`.claude/hooks/bmad-speak.sh '{agent-id}' '{response-text}'\` after each response - Replace {agent-id} with YOUR agent ID from tag at top of this file - Replace {response-text} with the text you just output to the user - IMPORTANT: Use single quotes as shown - do NOT escape special characters like ! or $ inside single quotes - Run in background (&) to avoid blocking`, - ); - - // Track files that had TTS injection applied - if (targetPath && (hasPartyMode || hasAgentTTS)) { - const injectionType = hasPartyMode ? 'party-mode' : 'agent-tts'; - this.ttsInjectedFiles.push({ path: targetPath, type: injectionType }); - } - } else { - // Strip injection markers cleanly when AgentVibes is disabled - content = content.replaceAll(/\n?/g, ''); - content = content.replaceAll(/\n?/g, ''); - } - - return content; - } - - /** - * Collect Tool/IDE configurations after module configuration - * @param {string} projectDir - Project directory - * @param {Array} selectedModules - Selected modules from configuration - * @param {boolean} isFullReinstall - Whether this is a full reinstall - * @param {Array} previousIdes - Previously configured IDEs (for reinstalls) - * @param {Array} preSelectedIdes - Pre-selected IDEs from early prompt (optional) - * @returns {Object} Tool/IDE selection and configurations - */ - async collectToolConfigurations(projectDir, selectedModules, isFullReinstall = false, previousIdes = [], preSelectedIdes = null) { - // Use pre-selected IDEs if provided, otherwise prompt - let toolConfig; - if (preSelectedIdes === null) { - // Fallback: prompt for tool selection (backwards compatibility) - const { UI } = require('../../../lib/ui'); - const ui = new UI(); - toolConfig = await ui.promptToolSelection(projectDir, selectedModules); - } else { - // IDEs were already selected during initial prompts - toolConfig = { - ides: preSelectedIdes, - skipIde: !preSelectedIdes || preSelectedIdes.length === 0, - }; - } - - // Check for already configured IDEs - const { Detector } = require('./detector'); - const detector = new Detector(); - const bmadDir = path.join(projectDir, this.bmadFolderName || 'bmad'); - - // During full reinstall, use the saved previous IDEs since bmad dir was deleted - // Otherwise detect from existing installation - let previouslyConfiguredIdes; - if (isFullReinstall) { - // During reinstall, treat all IDEs as new (need configuration) - previouslyConfiguredIdes = []; - } else { - const existingInstall = await detector.detect(bmadDir); - previouslyConfiguredIdes = existingInstall.ides || []; - } - - // Load saved IDE configurations for already-configured IDEs - const savedIdeConfigs = await this.ideConfigManager.loadAllIdeConfigs(bmadDir); - - // Collect IDE-specific configurations if any were selected - const ideConfigurations = {}; - - // First, add saved configs for already-configured IDEs - for (const ide of toolConfig.ides || []) { - if (previouslyConfiguredIdes.includes(ide) && savedIdeConfigs[ide]) { - ideConfigurations[ide] = savedIdeConfigs[ide]; - } - } - - if (!toolConfig.skipIde && toolConfig.ides && toolConfig.ides.length > 0) { - // Determine which IDEs are newly selected (not previously configured) - const newlySelectedIdes = toolConfig.ides.filter((ide) => !previouslyConfiguredIdes.includes(ide)); - - if (newlySelectedIdes.length > 0) { - console.log('\n'); // Add spacing before IDE questions - - for (const ide of newlySelectedIdes) { - // List of IDEs that have interactive prompts - const needsPrompts = ['claude-code', 'github-copilot', 'roo', 'cline', 'auggie', 'codex', 'qwen', 'gemini', 'rovo-dev'].includes( - ide, - ); - - if (needsPrompts) { - // Get IDE handler and collect configuration - try { - // Dynamically load the IDE setup module - const ideModule = require(`../ide/${ide}`); - - // Get the setup class (handle different export formats) - let SetupClass; - const className = - ide - .split('-') - .map((part) => part.charAt(0).toUpperCase() + part.slice(1)) - .join('') + 'Setup'; - - if (ideModule[className]) { - SetupClass = ideModule[className]; - } else if (ideModule.default) { - SetupClass = ideModule.default; - } else { - // Skip if no setup class found - continue; - } - - const ideSetup = new SetupClass(); - - // Check if this IDE has a collectConfiguration method - if (typeof ideSetup.collectConfiguration === 'function') { - console.log(chalk.cyan(`\nConfiguring ${ide}...`)); - ideConfigurations[ide] = await ideSetup.collectConfiguration({ - selectedModules: selectedModules || [], - projectDir, - bmadDir, - }); - } - } catch { - // IDE doesn't have a setup file or collectConfiguration method - console.warn(chalk.yellow(`Warning: Could not load configuration for ${ide}`)); - } - } - } - } - - // Log which IDEs are already configured and being kept - const keptIdes = toolConfig.ides.filter((ide) => previouslyConfiguredIdes.includes(ide)); - if (keptIdes.length > 0) { - console.log(chalk.dim(`\nKeeping existing configuration for: ${keptIdes.join(', ')}`)); - } - } - - return { - ides: toolConfig.ides, - skipIde: toolConfig.skipIde, - configurations: ideConfigurations, - }; - } - - /** - * Main installation method - * @param {Object} config - Installation configuration - * @param {string} config.directory - Target directory - * @param {boolean} config.installCore - Whether to install core - * @param {string[]} config.modules - Modules to install - * @param {string[]} config.ides - IDEs to configure - * @param {boolean} config.skipIde - Skip IDE configuration - */ - async install(config) { - // Display BMAD logo - CLIUtils.displayLogo(); - - // Display welcome message - CLIUtils.displaySection('BMAD™ Installation', 'Version ' + require(path.join(getProjectRoot(), 'package.json')).version); - - // Note: Legacy V4 detection now happens earlier in UI.promptInstall() - // before any config collection, so we don't need to check again here - - const projectDir = path.resolve(config.directory); - - // If core config was pre-collected (from interactive mode), use it - if (config.coreConfig) { - this.configCollector.collectedConfig.core = config.coreConfig; - // Also store in allAnswers for cross-referencing - this.configCollector.allAnswers = {}; - for (const [key, value] of Object.entries(config.coreConfig)) { - this.configCollector.allAnswers[`core_${key}`] = value; - } - } - - // Collect configurations for modules (skip if quick update already collected them) - let moduleConfigs; - if (config._quickUpdate) { - // Quick update already collected all configs, use them directly - moduleConfigs = this.configCollector.collectedConfig; - } else { - // Regular install - collect configurations (core was already collected in UI.promptInstall if interactive) - moduleConfigs = await this.configCollector.collectAllConfigurations(config.modules || [], path.resolve(config.directory)); - } - - // Get bmad_folder from config (default to 'bmad' for backwards compatibility) - const bmadFolderName = moduleConfigs.core && moduleConfigs.core.bmad_folder ? moduleConfigs.core.bmad_folder : 'bmad'; - this.bmadFolderName = bmadFolderName; // Store for use in other methods - - // Store AgentVibes configuration for injection point processing - this.enableAgentVibes = config.enableAgentVibes || false; - - // Set bmad folder name on module manager and IDE manager for placeholder replacement - this.moduleManager.setBmadFolderName(bmadFolderName); - this.ideManager.setBmadFolderName(bmadFolderName); - - // Tool selection will be collected after we determine if it's a reinstall/update/new install - - const spinner = ora('Preparing installation...').start(); - - try { - // Resolve target directory (path.resolve handles platform differences) - const projectDir = path.resolve(config.directory); - - // Check if bmad_folder has changed from existing installation (only if project dir exists) - let existingBmadDir = null; - let existingBmadFolderName = null; - - if (await fs.pathExists(projectDir)) { - existingBmadDir = await this.findBmadDir(projectDir); - existingBmadFolderName = path.basename(existingBmadDir); - } - - const targetBmadDir = path.join(projectDir, bmadFolderName); - - // If bmad_folder changed during update/upgrade, back up old folder and do fresh install - if (existingBmadDir && (await fs.pathExists(existingBmadDir)) && existingBmadFolderName !== bmadFolderName) { - spinner.stop(); - console.log(chalk.yellow(`\n⚠️ bmad_folder has changed: ${existingBmadFolderName} → ${bmadFolderName}`)); - console.log(chalk.yellow('This will result in a fresh installation to the new folder.')); - - const inquirer = require('inquirer'); - const { confirmFreshInstall } = await inquirer.prompt([ - { - type: 'confirm', - name: 'confirmFreshInstall', - message: chalk.cyan('Proceed with fresh install? (Your old folder will be backed up)'), - default: true, - }, - ]); - - if (!confirmFreshInstall) { - console.log(chalk.yellow('Installation cancelled.')); - return { success: false, cancelled: true }; - } - - spinner.start('Backing up existing installation...'); - - // Find a unique backup name - let backupDir = `${existingBmadDir}-bak`; - let counter = 1; - while (await fs.pathExists(backupDir)) { - backupDir = `${existingBmadDir}-bak-${counter}`; - counter++; - } - - // Rename the old folder to backup - await fs.move(existingBmadDir, backupDir); - - spinner.succeed(`Backed up ${existingBmadFolderName} → ${path.basename(backupDir)}`); - console.log(chalk.cyan('\n📋 Important:')); - console.log(chalk.dim(` - Your old installation has been backed up to: ${path.basename(backupDir)}`)); - console.log(chalk.dim(` - If you had custom agents or configurations, copy them from:`)); - console.log(chalk.dim(` ${path.basename(backupDir)}/_cfg/`)); - console.log(chalk.dim(` - To the new location:`)); - console.log(chalk.dim(` ${bmadFolderName}/_cfg/`)); - console.log(''); - - spinner.start('Starting fresh installation...'); - } - - // Create a project directory if it doesn't exist (user already confirmed) - if (!(await fs.pathExists(projectDir))) { - spinner.text = 'Creating installation directory...'; - try { - // fs.ensureDir handles platform-specific directory creation - // It will recursively create all necessary parent directories - await fs.ensureDir(projectDir); - } catch (error) { - spinner.fail('Failed to create installation directory'); - console.error(chalk.red(`Error: ${error.message}`)); - // More detailed error for common issues - if (error.code === 'EACCES') { - console.error(chalk.red('Permission denied. Check parent directory permissions.')); - } else if (error.code === 'ENOSPC') { - console.error(chalk.red('No space left on device.')); - } - throw new Error(`Cannot create directory: ${projectDir}`); - } - } - - const bmadDir = path.join(projectDir, bmadFolderName); - - // Check existing installation - spinner.text = 'Checking for existing installation...'; - const existingInstall = await this.detector.detect(bmadDir); - - if (existingInstall.installed && !config.force && !config._quickUpdate) { - spinner.stop(); - - // Check if user already decided what to do (from early menu in ui.js) - let action = null; - if (config._requestedReinstall) { - action = 'reinstall'; - } else if (config.actionType === 'update') { - action = 'update'; - } else { - // Fallback: Ask the user (backwards compatibility for other code paths) - console.log(chalk.yellow('\n⚠️ Existing BMAD installation detected')); - console.log(chalk.dim(` Location: ${bmadDir}`)); - console.log(chalk.dim(` Version: ${existingInstall.version}`)); - - const promptResult = await this.promptUpdateAction(); - action = promptResult.action; - } - - if (action === 'cancel') { - console.log('Installation cancelled.'); - return { success: false, cancelled: true }; - } - - if (action === 'reinstall') { - // Warn about destructive operation - console.log(chalk.red.bold('\n⚠️ WARNING: This is a destructive operation!')); - console.log(chalk.red('All custom files and modifications in the bmad directory will be lost.')); - - const inquirer = require('inquirer'); - const { confirmReinstall } = await inquirer.prompt([ - { - type: 'confirm', - name: 'confirmReinstall', - message: chalk.yellow('Are you sure you want to delete and reinstall?'), - default: false, - }, - ]); - - if (!confirmReinstall) { - console.log('Installation cancelled.'); - return { success: false, cancelled: true }; - } - - // Remember previously configured IDEs before deleting - config._previouslyConfiguredIdes = existingInstall.ides || []; - - // Remove existing installation - await fs.remove(bmadDir); - console.log(chalk.green('✓ Removed existing installation\n')); - - // Mark this as a full reinstall so we re-collect IDE configurations - config._isFullReinstall = true; - } else if (action === 'update') { - // Store that we're updating for later processing - config._isUpdate = true; - config._existingInstall = existingInstall; - - // Detect custom and modified files BEFORE updating (compare current files vs files-manifest.csv) - const existingFilesManifest = await this.readFilesManifest(bmadDir); - console.log(chalk.dim(`DEBUG: Read ${existingFilesManifest.length} files from manifest`)); - console.log(chalk.dim(`DEBUG: Manifest has hashes: ${existingFilesManifest.some((f) => f.hash)}`)); - - const { customFiles, modifiedFiles } = await this.detectCustomFiles(bmadDir, existingFilesManifest); - - console.log(chalk.dim(`DEBUG: Found ${customFiles.length} custom files, ${modifiedFiles.length} modified files`)); - if (modifiedFiles.length > 0) { - console.log(chalk.yellow('DEBUG: Modified files:')); - for (const f of modifiedFiles) console.log(chalk.dim(` - ${f.path}`)); - } - - config._customFiles = customFiles; - config._modifiedFiles = modifiedFiles; - - // If there are custom files, back them up temporarily - if (customFiles.length > 0) { - const tempBackupDir = path.join(projectDir, '.bmad-custom-backup-temp'); - await fs.ensureDir(tempBackupDir); - - spinner.start(`Backing up ${customFiles.length} custom files...`); - for (const customFile of customFiles) { - const relativePath = path.relative(bmadDir, customFile); - const backupPath = path.join(tempBackupDir, relativePath); - await fs.ensureDir(path.dirname(backupPath)); - await fs.copy(customFile, backupPath); - } - spinner.succeed(`Backed up ${customFiles.length} custom files`); - - config._tempBackupDir = tempBackupDir; - } - - // For modified files, back them up to temp directory (will be restored as .bak files after install) - if (modifiedFiles.length > 0) { - const tempModifiedBackupDir = path.join(projectDir, '.bmad-modified-backup-temp'); - await fs.ensureDir(tempModifiedBackupDir); - - console.log(chalk.yellow(`\nDEBUG: Backing up ${modifiedFiles.length} modified files to temp location`)); - spinner.start(`Backing up ${modifiedFiles.length} modified files...`); - for (const modifiedFile of modifiedFiles) { - const relativePath = path.relative(bmadDir, modifiedFile.path); - const tempBackupPath = path.join(tempModifiedBackupDir, relativePath); - console.log(chalk.dim(`DEBUG: Backing up ${relativePath} to temp`)); - await fs.ensureDir(path.dirname(tempBackupPath)); - await fs.copy(modifiedFile.path, tempBackupPath, { overwrite: true }); - } - spinner.succeed(`Backed up ${modifiedFiles.length} modified files`); - - config._tempModifiedBackupDir = tempModifiedBackupDir; - } else { - console.log(chalk.dim('DEBUG: No modified files detected')); - } - } - } else if (existingInstall.installed && config._quickUpdate) { - // Quick update mode - automatically treat as update without prompting - spinner.text = 'Preparing quick update...'; - config._isUpdate = true; - config._existingInstall = existingInstall; - - // Detect custom and modified files BEFORE updating - const existingFilesManifest = await this.readFilesManifest(bmadDir); - const { customFiles, modifiedFiles } = await this.detectCustomFiles(bmadDir, existingFilesManifest); - - config._customFiles = customFiles; - config._modifiedFiles = modifiedFiles; - - // Back up custom files - if (customFiles.length > 0) { - const tempBackupDir = path.join(projectDir, '.bmad-custom-backup-temp'); - await fs.ensureDir(tempBackupDir); - - spinner.start(`Backing up ${customFiles.length} custom files...`); - for (const customFile of customFiles) { - const relativePath = path.relative(bmadDir, customFile); - const backupPath = path.join(tempBackupDir, relativePath); - await fs.ensureDir(path.dirname(backupPath)); - await fs.copy(customFile, backupPath); - } - spinner.succeed(`Backed up ${customFiles.length} custom files`); - config._tempBackupDir = tempBackupDir; - } - - // Back up modified files - if (modifiedFiles.length > 0) { - const tempModifiedBackupDir = path.join(projectDir, '.bmad-modified-backup-temp'); - await fs.ensureDir(tempModifiedBackupDir); - - spinner.start(`Backing up ${modifiedFiles.length} modified files...`); - for (const modifiedFile of modifiedFiles) { - const relativePath = path.relative(bmadDir, modifiedFile.path); - const tempBackupPath = path.join(tempModifiedBackupDir, relativePath); - await fs.ensureDir(path.dirname(tempBackupPath)); - await fs.copy(modifiedFile.path, tempBackupPath, { overwrite: true }); - } - spinner.succeed(`Backed up ${modifiedFiles.length} modified files`); - config._tempModifiedBackupDir = tempModifiedBackupDir; - } - } - - // Now collect tool configurations after we know if it's a reinstall - // Skip for quick update since we already have the IDE list - spinner.stop(); - let toolSelection; - if (config._quickUpdate) { - // Quick update already has IDEs configured, use saved configurations - const preConfiguredIdes = {}; - const savedIdeConfigs = config._savedIdeConfigs || {}; - - for (const ide of config.ides || []) { - // Use saved config if available, otherwise mark as already configured (legacy) - if (savedIdeConfigs[ide]) { - preConfiguredIdes[ide] = savedIdeConfigs[ide]; - } else { - preConfiguredIdes[ide] = { _alreadyConfigured: true }; - } - } - toolSelection = { - ides: config.ides || [], - skipIde: !config.ides || config.ides.length === 0, - configurations: preConfiguredIdes, - }; - } else { - // Pass pre-selected IDEs from early prompt (if available) - // This allows IDE selection to happen before file copying, improving UX - const preSelectedIdes = config.ides && config.ides.length > 0 ? config.ides : null; - toolSelection = await this.collectToolConfigurations( - path.resolve(config.directory), - config.modules, - config._isFullReinstall || false, - config._previouslyConfiguredIdes || [], - preSelectedIdes, - ); - } - - // Merge tool selection into config (for both quick update and regular flow) - config.ides = toolSelection.ides; - config.skipIde = toolSelection.skipIde; - const ideConfigurations = toolSelection.configurations; - - // Check if spinner is already running (e.g., from folder name change scenario) - if (spinner.isSpinning) { - spinner.text = 'Continuing installation...'; - } else { - spinner.start('Continuing installation...'); - } - - // Create bmad directory structure - spinner.text = 'Creating directory structure...'; - await this.createDirectoryStructure(bmadDir); - - // Resolve dependencies for selected modules - spinner.text = 'Resolving dependencies...'; - const projectRoot = getProjectRoot(); - const modulesToInstall = config.installCore ? ['core', ...config.modules] : config.modules; - - // For dependency resolution, we need to pass the project root - const resolution = await this.dependencyResolver.resolve(projectRoot, config.modules || [], { verbose: config.verbose }); - - if (config.verbose) { - spinner.succeed('Dependencies resolved'); - } else { - spinner.succeed('Dependencies resolved'); - } - - // Install core if requested or if dependencies require it - if (config.installCore || resolution.byModule.core) { - spinner.start('Installing BMAD core...'); - await this.installCoreWithDependencies(bmadDir, resolution.byModule.core); - spinner.succeed('Core installed'); - } - - // Install modules with their dependencies - if (config.modules && config.modules.length > 0) { - for (const moduleName of config.modules) { - spinner.start(`Installing module: ${moduleName}...`); - await this.installModuleWithDependencies(moduleName, bmadDir, resolution.byModule[moduleName]); - spinner.succeed(`Module installed: ${moduleName}`); - } - - // Install partial modules (only dependencies) - for (const [module, files] of Object.entries(resolution.byModule)) { - if (!config.modules.includes(module) && module !== 'core') { - const totalFiles = - files.agents.length + - files.tasks.length + - files.tools.length + - files.templates.length + - files.data.length + - files.other.length; - if (totalFiles > 0) { - spinner.start(`Installing ${module} dependencies...`); - await this.installPartialModule(module, bmadDir, files); - spinner.succeed(`${module} dependencies installed`); - } - } - } - } - - // Generate clean config.yaml files for each installed module - spinner.start('Generating module configurations...'); - await this.generateModuleConfigs(bmadDir, moduleConfigs); - spinner.succeed('Module configurations generated'); - - // Create agent configuration files - // Note: Legacy createAgentConfigs removed - using YAML customize system instead - // Customize templates are now created in processAgentFiles when building YAML agents - - // Pre-register manifest files that will be created (except files-manifest.csv to avoid recursion) - const cfgDir = path.join(bmadDir, '_cfg'); - this.installedFiles.push( - path.join(cfgDir, 'manifest.yaml'), - path.join(cfgDir, 'workflow-manifest.csv'), - path.join(cfgDir, 'agent-manifest.csv'), - path.join(cfgDir, 'task-manifest.csv'), - ); - - // Generate CSV manifests for workflows, agents, tasks AND ALL FILES with hashes BEFORE IDE setup - spinner.start('Generating workflow and agent manifests...'); - const manifestGen = new ManifestGenerator(); - - // Include preserved modules (from quick update) in the manifest - const allModulesToList = config._preserveModules ? [...(config.modules || []), ...config._preserveModules] : config.modules || []; - - const manifestStats = await manifestGen.generateManifests(bmadDir, config.modules || [], this.installedFiles, { - ides: config.ides || [], - preservedModules: config._preserveModules || [], // Scan these from installed bmad/ dir - }); - - spinner.succeed( - `Manifests generated: ${manifestStats.workflows} workflows, ${manifestStats.agents} agents, ${manifestStats.tasks} tasks, ${manifestStats.tools} tools, ${manifestStats.files} files`, - ); - - // Configure IDEs and copy documentation - if (!config.skipIde && config.ides && config.ides.length > 0) { - // Filter out any undefined/null values from the IDE list - const validIdes = config.ides.filter((ide) => ide && typeof ide === 'string'); - - if (validIdes.length === 0) { - console.log(chalk.yellow('⚠️ No valid IDEs selected. Skipping IDE configuration.')); - } else { - // Check if any IDE might need prompting (no pre-collected config) - const needsPrompting = validIdes.some((ide) => !ideConfigurations[ide]); - - if (!needsPrompting) { - spinner.start('Configuring IDEs...'); - } - - // Temporarily suppress console output if not verbose - const originalLog = console.log; - if (!config.verbose) { - console.log = () => {}; - } - - for (const ide of validIdes) { - // Only show spinner if we have pre-collected config (no prompts expected) - if (ideConfigurations[ide] && !needsPrompting) { - spinner.text = `Configuring ${ide}...`; - } else if (!ideConfigurations[ide]) { - // Stop spinner before prompting - if (spinner.isSpinning) { - spinner.stop(); - } - console.log(chalk.cyan(`\nConfiguring ${ide}...`)); - } - - // Pass pre-collected configuration to avoid re-prompting - await this.ideManager.setup(ide, projectDir, bmadDir, { - selectedModules: config.modules || [], - preCollectedConfig: ideConfigurations[ide] || null, - verbose: config.verbose, - }); - - // Save IDE configuration for future updates - if (ideConfigurations[ide] && !ideConfigurations[ide]._alreadyConfigured) { - await this.ideConfigManager.saveIdeConfig(bmadDir, ide, ideConfigurations[ide]); - } - - // Restart spinner if we stopped it - if (!ideConfigurations[ide] && !spinner.isSpinning) { - spinner.start('Configuring IDEs...'); - } - } - - // Restore console.log - console.log = originalLog; - - if (spinner.isSpinning) { - spinner.succeed(`Configured ${validIdes.length} IDE${validIdes.length > 1 ? 's' : ''}`); - } else { - console.log(chalk.green(`✓ Configured ${validIdes.length} IDE${validIdes.length > 1 ? 's' : ''}`)); - } - } - - // Copy IDE-specific documentation (only for valid IDEs) - const validIdesForDocs = (config.ides || []).filter((ide) => ide && typeof ide === 'string'); - if (validIdesForDocs.length > 0) { - spinner.start('Copying IDE documentation...'); - await this.copyIdeDocumentation(validIdesForDocs, bmadDir); - spinner.succeed('IDE documentation copied'); - } - } - - // Run module-specific installers after IDE setup - spinner.start('Running module-specific installers...'); - - // Run core module installer if core was installed - if (config.installCore || resolution.byModule.core) { - spinner.text = 'Running core module installer...'; - - await this.moduleManager.runModuleInstaller('core', bmadDir, { - installedIDEs: config.ides || [], - moduleConfig: moduleConfigs.core || {}, - logger: { - log: (msg) => console.log(msg), - error: (msg) => console.error(msg), - warn: (msg) => console.warn(msg), - }, - }); - } - - // Run installers for user-selected modules - if (config.modules && config.modules.length > 0) { - for (const moduleName of config.modules) { - spinner.text = `Running ${moduleName} module installer...`; - - // Pass installed IDEs and module config to module installer - await this.moduleManager.runModuleInstaller(moduleName, bmadDir, { - installedIDEs: config.ides || [], - moduleConfig: moduleConfigs[moduleName] || {}, - logger: { - log: (msg) => console.log(msg), - error: (msg) => console.error(msg), - warn: (msg) => console.warn(msg), - }, - }); - } - } - - spinner.succeed('Module-specific installers completed'); - - // Note: Manifest files are already created by ManifestGenerator above - // No need to create legacy manifest.csv anymore - - // If this was an update, restore custom files - let customFiles = []; - let modifiedFiles = []; - if (config._isUpdate) { - if (config._customFiles && config._customFiles.length > 0) { - spinner.start(`Restoring ${config._customFiles.length} custom files...`); - - for (const originalPath of config._customFiles) { - const relativePath = path.relative(bmadDir, originalPath); - const backupPath = path.join(config._tempBackupDir, relativePath); - - if (await fs.pathExists(backupPath)) { - await fs.ensureDir(path.dirname(originalPath)); - await fs.copy(backupPath, originalPath, { overwrite: true }); - } - } - - // Clean up temp backup - if (config._tempBackupDir && (await fs.pathExists(config._tempBackupDir))) { - await fs.remove(config._tempBackupDir); - } - - spinner.succeed(`Restored ${config._customFiles.length} custom files`); - customFiles = config._customFiles; - } - - if (config._modifiedFiles && config._modifiedFiles.length > 0) { - modifiedFiles = config._modifiedFiles; - - // Restore modified files as .bak files - if (config._tempModifiedBackupDir && (await fs.pathExists(config._tempModifiedBackupDir))) { - spinner.start(`Restoring ${modifiedFiles.length} modified files as .bak...`); - - for (const modifiedFile of modifiedFiles) { - const relativePath = path.relative(bmadDir, modifiedFile.path); - const tempBackupPath = path.join(config._tempModifiedBackupDir, relativePath); - const bakPath = modifiedFile.path + '.bak'; - - if (await fs.pathExists(tempBackupPath)) { - await fs.ensureDir(path.dirname(bakPath)); - await fs.copy(tempBackupPath, bakPath, { overwrite: true }); - } - } - - // Clean up temp backup - await fs.remove(config._tempModifiedBackupDir); - - spinner.succeed(`Restored ${modifiedFiles.length} modified files as .bak`); - } - } - } - - spinner.stop(); - - // Report custom and modified files if any were found - if (customFiles.length > 0) { - console.log(chalk.cyan(`\n📁 Custom files preserved: ${customFiles.length}`)); - console.log(chalk.dim('The following custom files were found and restored:\n')); - for (const file of customFiles) { - console.log(chalk.dim(` - ${path.relative(bmadDir, file)}`)); - } - console.log(''); - } - - if (modifiedFiles.length > 0) { - console.log(chalk.yellow(`\n⚠️ Modified files detected: ${modifiedFiles.length}`)); - console.log(chalk.dim('The following files were modified and backed up with .bak extension:\n')); - for (const file of modifiedFiles) { - console.log(chalk.dim(` - ${file.relativePath} → ${file.relativePath}.bak`)); - } - console.log(chalk.dim('\nThese files have been updated with the new version.')); - console.log(chalk.dim('Review the .bak files to see your changes and merge if needed.\n')); - } - - // Reinstall custom agents from _cfg/custom/agents/ sources - const customAgentResults = await this.reinstallCustomAgents(projectDir, bmadDir); - if (customAgentResults.count > 0) { - console.log(chalk.green(`\n✓ Reinstalled ${customAgentResults.count} custom agent${customAgentResults.count > 1 ? 's' : ''}`)); - for (const agent of customAgentResults.agents) { - console.log(chalk.dim(` - ${agent}`)); - } - } - - // Display completion message - const { UI } = require('../../../lib/ui'); - const ui = new UI(); - ui.showInstallSummary({ - path: bmadDir, - modules: config.modules, - ides: config.ides, - customFiles: customFiles.length > 0 ? customFiles : undefined, - ttsInjectedFiles: this.enableAgentVibes && this.ttsInjectedFiles.length > 0 ? this.ttsInjectedFiles : undefined, - agentVibesEnabled: this.enableAgentVibes || false, - }); - - // Offer cleanup for legacy files (only for updates, not fresh installs, and only if not skipped) - if (!config.skipCleanup && config._isUpdate) { - try { - const cleanupResult = await this.performCleanup(bmadDir, false); - if (cleanupResult.deleted > 0) { - console.log(chalk.green(`\n✓ Cleaned up ${cleanupResult.deleted} legacy file${cleanupResult.deleted > 1 ? 's' : ''}`)); - } - if (cleanupResult.retained > 0) { - console.log(chalk.dim(`Run 'bmad cleanup' anytime to manage retained files`)); - } - } catch (cleanupError) { - // Don't fail the installation for cleanup errors - console.log(chalk.yellow(`\n⚠️ Cleanup warning: ${cleanupError.message}`)); - console.log(chalk.dim('Run "bmad cleanup" to manually clean up legacy files')); - } - } - - return { - success: true, - path: bmadDir, - modules: config.modules, - ides: config.ides, - needsAgentVibes: this.enableAgentVibes && !config.agentVibesInstalled, - projectDir: projectDir, - }; - } catch (error) { - spinner.fail('Installation failed'); - throw error; - } - } - - /** - * Update existing installation - */ - async update(config) { - const spinner = ora('Checking installation...').start(); - - try { - const projectDir = path.resolve(config.directory); - const bmadDir = await this.findBmadDir(projectDir); - const existingInstall = await this.detector.detect(bmadDir); - - if (!existingInstall.installed) { - spinner.fail('No BMAD installation found'); - throw new Error(`No BMAD installation found at ${bmadDir}`); - } - - spinner.text = 'Analyzing update requirements...'; - - // Compare versions and determine what needs updating - const currentVersion = existingInstall.version; - const newVersion = require(path.join(getProjectRoot(), 'package.json')).version; - - if (config.dryRun) { - spinner.stop(); - console.log(chalk.cyan('\n🔍 Update Preview (Dry Run)\n')); - console.log(chalk.bold('Current version:'), currentVersion); - console.log(chalk.bold('New version:'), newVersion); - console.log(chalk.bold('Core:'), existingInstall.hasCore ? 'Will be updated' : 'Not installed'); - - if (existingInstall.modules.length > 0) { - console.log(chalk.bold('\nModules to update:')); - for (const mod of existingInstall.modules) { - console.log(` - ${mod.id}`); - } - } - return; - } - - // Perform actual update - if (existingInstall.hasCore) { - spinner.text = 'Updating core...'; - await this.updateCore(bmadDir, config.force); - } - - for (const module of existingInstall.modules) { - spinner.text = `Updating module: ${module.id}...`; - await this.moduleManager.update(module.id, bmadDir, config.force); - } - - // Update manifest - spinner.text = 'Updating manifest...'; - await this.manifest.update(bmadDir, { - version: newVersion, - updateDate: new Date().toISOString(), - }); - - spinner.succeed('Update complete'); - return { success: true }; - } catch (error) { - spinner.fail('Update failed'); - throw error; - } - } - - /** - * Get installation status - */ - async getStatus(directory) { - const projectDir = path.resolve(directory); - const bmadDir = await this.findBmadDir(projectDir); - return await this.detector.detect(bmadDir); - } - - /** - * Get available modules - */ - async getAvailableModules() { - return await this.moduleManager.listAvailable(); - } - - /** - * Uninstall BMAD - */ - async uninstall(directory) { - const projectDir = path.resolve(directory); - const bmadDir = await this.findBmadDir(projectDir); - - if (await fs.pathExists(bmadDir)) { - await fs.remove(bmadDir); - } - - // Clean up IDE configurations - await this.ideManager.cleanup(projectDir); - - return { success: true }; - } - - /** - * Private: Create directory structure - */ - async createDirectoryStructure(bmadDir) { - await fs.ensureDir(bmadDir); - await fs.ensureDir(path.join(bmadDir, '_cfg')); - await fs.ensureDir(path.join(bmadDir, '_cfg', 'agents')); - } - - /** - * Generate clean config.yaml files for each installed module - * @param {string} bmadDir - BMAD installation directory - * @param {Object} moduleConfigs - Collected configuration values - */ - async generateModuleConfigs(bmadDir, moduleConfigs) { - const yaml = require('js-yaml'); - - // Extract core config values to share with other modules - const coreConfig = moduleConfigs.core || {}; - - // Get all installed module directories - const entries = await fs.readdir(bmadDir, { withFileTypes: true }); - const installedModules = entries - .filter((entry) => entry.isDirectory() && entry.name !== '_cfg' && entry.name !== 'docs') - .map((entry) => entry.name); - - // Generate config.yaml for each installed module - for (const moduleName of installedModules) { - const modulePath = path.join(bmadDir, moduleName); - - // Get module-specific config or use empty object if none - const config = moduleConfigs[moduleName] || {}; - - if (await fs.pathExists(modulePath)) { - const configPath = path.join(modulePath, 'config.yaml'); - - // Create header - const packageJson = require(path.join(getProjectRoot(), 'package.json')); - const header = `# ${moduleName.toUpperCase()} Module Configuration -# Generated by BMAD installer -# Version: ${packageJson.version} -# Date: ${new Date().toISOString()} - -`; - - // For non-core modules, add core config values directly - let finalConfig = { ...config }; - let coreSection = ''; - - if (moduleName !== 'core' && coreConfig && Object.keys(coreConfig).length > 0) { - // Add core values directly to the module config - // These will be available for reference in the module - finalConfig = { - ...config, - ...coreConfig, // Spread core config values directly into the module config - }; - - // Create a comment section to identify core values - coreSection = '\n# Core Configuration Values\n'; - } - - // Convert config to YAML - let yamlContent = yaml.dump(finalConfig, { - indent: 2, - lineWidth: -1, - noRefs: true, - sortKeys: false, - }); - - // If we have core values, reorganize the YAML to group them with their comment - if (coreSection && moduleName !== 'core') { - // Split the YAML into lines - const lines = yamlContent.split('\n'); - const moduleConfigLines = []; - const coreConfigLines = []; - - // Separate module-specific and core config lines - for (const line of lines) { - const key = line.split(':')[0].trim(); - if (Object.prototype.hasOwnProperty.call(coreConfig, key)) { - coreConfigLines.push(line); - } else { - moduleConfigLines.push(line); - } - } - - // Rebuild YAML with module config first, then core config with comment - yamlContent = moduleConfigLines.join('\n'); - if (coreConfigLines.length > 0) { - yamlContent += coreSection + coreConfigLines.join('\n'); - } - } - - // Write the clean config file with POSIX-compliant final newline - const content = header + yamlContent; - await fs.writeFile(configPath, content.endsWith('\n') ? content : content + '\n', 'utf8'); - - // Track the config file in installedFiles - this.installedFiles.push(configPath); - } - } - } - - /** - * Install core with resolved dependencies - * @param {string} bmadDir - BMAD installation directory - * @param {Object} coreFiles - Core files to install - */ - async installCoreWithDependencies(bmadDir, coreFiles) { - const sourcePath = getModulePath('core'); - const targetPath = path.join(bmadDir, 'core'); - - // Install full core - await this.installCore(bmadDir); - - // If there are specific dependency files, ensure they're included - if (coreFiles) { - // Already handled by installCore for core module - } - } - - /** - * Install module with resolved dependencies - * @param {string} moduleName - Module name - * @param {string} bmadDir - BMAD installation directory - * @param {Object} moduleFiles - Module files to install - */ - async installModuleWithDependencies(moduleName, bmadDir, moduleFiles) { - // Get module configuration for conditional installation - const moduleConfig = this.configCollector.collectedConfig[moduleName] || {}; - - // Use existing module manager for full installation with file tracking - // Note: Module-specific installers are called separately after IDE setup - await this.moduleManager.install( - moduleName, - bmadDir, - (filePath) => { - this.installedFiles.push(filePath); - }, - { - skipModuleInstaller: true, // We'll run it later after IDE setup - moduleConfig: moduleConfig, // Pass module config for conditional filtering - }, - ); - - // Process agent files to build YAML agents and create customize templates - const modulePath = path.join(bmadDir, moduleName); - await this.processAgentFiles(modulePath, moduleName); - - // Dependencies are already included in full module install - } - - /** - * Install partial module (only dependencies needed by other modules) - */ - async installPartialModule(moduleName, bmadDir, files) { - const sourceBase = getModulePath(moduleName); - const targetBase = path.join(bmadDir, moduleName); - - // Create module directory - await fs.ensureDir(targetBase); - - // Copy only the required dependency files - if (files.agents && files.agents.length > 0) { - const agentsDir = path.join(targetBase, 'agents'); - await fs.ensureDir(agentsDir); - - for (const agentPath of files.agents) { - const fileName = path.basename(agentPath); - const sourcePath = path.join(sourceBase, 'agents', fileName); - const targetPath = path.join(agentsDir, fileName); - - if (await fs.pathExists(sourcePath)) { - await this.copyFileWithPlaceholderReplacement(sourcePath, targetPath, this.bmadFolderName || 'bmad'); - this.installedFiles.push(targetPath); - } - } - } - - if (files.tasks && files.tasks.length > 0) { - const tasksDir = path.join(targetBase, 'tasks'); - await fs.ensureDir(tasksDir); - - for (const taskPath of files.tasks) { - const fileName = path.basename(taskPath); - const sourcePath = path.join(sourceBase, 'tasks', fileName); - const targetPath = path.join(tasksDir, fileName); - - if (await fs.pathExists(sourcePath)) { - await this.copyFileWithPlaceholderReplacement(sourcePath, targetPath, this.bmadFolderName || 'bmad'); - this.installedFiles.push(targetPath); - } - } - } - - if (files.tools && files.tools.length > 0) { - const toolsDir = path.join(targetBase, 'tools'); - await fs.ensureDir(toolsDir); - - for (const toolPath of files.tools) { - const fileName = path.basename(toolPath); - const sourcePath = path.join(sourceBase, 'tools', fileName); - const targetPath = path.join(toolsDir, fileName); - - if (await fs.pathExists(sourcePath)) { - await this.copyFileWithPlaceholderReplacement(sourcePath, targetPath, this.bmadFolderName || 'bmad'); - this.installedFiles.push(targetPath); - } - } - } - - if (files.templates && files.templates.length > 0) { - const templatesDir = path.join(targetBase, 'templates'); - await fs.ensureDir(templatesDir); - - for (const templatePath of files.templates) { - const fileName = path.basename(templatePath); - const sourcePath = path.join(sourceBase, 'templates', fileName); - const targetPath = path.join(templatesDir, fileName); - - if (await fs.pathExists(sourcePath)) { - await this.copyFileWithPlaceholderReplacement(sourcePath, targetPath, this.bmadFolderName || 'bmad'); - this.installedFiles.push(targetPath); - } - } - } - - if (files.data && files.data.length > 0) { - for (const dataPath of files.data) { - // Preserve directory structure for data files - const relative = path.relative(sourceBase, dataPath); - const targetPath = path.join(targetBase, relative); - - await fs.ensureDir(path.dirname(targetPath)); - - if (await fs.pathExists(dataPath)) { - await this.copyFileWithPlaceholderReplacement(dataPath, targetPath, this.bmadFolderName || 'bmad'); - this.installedFiles.push(targetPath); - } - } - } - - // Create a marker file to indicate this is a partial installation - const markerPath = path.join(targetBase, '.partial'); - await fs.writeFile( - markerPath, - `This module contains only dependencies required by other modules.\nInstalled: ${new Date().toISOString()}\n`, - ); - } - - /** - * Private: Install core - * @param {string} bmadDir - BMAD installation directory - */ - async installCore(bmadDir) { - const sourcePath = getModulePath('core'); - const targetPath = path.join(bmadDir, 'core'); - - // Copy core files with filtering for localskip agents - await this.copyDirectoryWithFiltering(sourcePath, targetPath); - - // Process agent files to inject activation block - await this.processAgentFiles(targetPath, 'core'); - } - - /** - * Copy directory with filtering for localskip agents - * @param {string} sourcePath - Source directory path - * @param {string} targetPath - Target directory path - */ - async copyDirectoryWithFiltering(sourcePath, targetPath) { - // Get all files in source directory - const files = await this.getFileList(sourcePath); - - for (const file of files) { - // Skip config.yaml templates - we'll generate clean ones with actual values - if (file === 'config.yaml' || file.endsWith('/config.yaml')) { - continue; - } - - const sourceFile = path.join(sourcePath, file); - const targetFile = path.join(targetPath, file); - - // Check if this is an agent file - if (file.includes('agents/') && file.endsWith('.md')) { - // Read the file to check for localskip - const content = await fs.readFile(sourceFile, 'utf8'); - - // Check for localskip="true" in the agent tag - const agentMatch = content.match(/]*\slocalskip="true"[^>]*>/); - if (agentMatch) { - console.log(chalk.dim(` Skipping web-only agent: ${path.basename(file)}`)); - continue; // Skip this agent - } - } - - // Copy the file with placeholder replacement - await this.copyFileWithPlaceholderReplacement(sourceFile, targetFile, this.bmadFolderName || 'bmad'); - - // Track the installed file - this.installedFiles.push(targetFile); - } - } - - /** - * Get list of all files in a directory recursively - * @param {string} dir - Directory path - * @param {string} baseDir - Base directory for relative paths - * @returns {Array} List of relative file paths - */ - async getFileList(dir, baseDir = dir) { - const files = []; - const entries = await fs.readdir(dir, { withFileTypes: true }); - - for (const entry of entries) { - const fullPath = path.join(dir, entry.name); - - if (entry.isDirectory()) { - // Skip _module-installer directories - if (entry.name === '_module-installer') { - continue; - } - const subFiles = await this.getFileList(fullPath, baseDir); - files.push(...subFiles); - } else { - files.push(path.relative(baseDir, fullPath)); - } - } - - return files; - } - - /** - * Process agent files to build YAML agents and inject activation blocks - * @param {string} modulePath - Path to module in bmad/ installation - * @param {string} moduleName - Module name - */ - async processAgentFiles(modulePath, moduleName) { - const agentsPath = path.join(modulePath, 'agents'); - - // Check if agents directory exists - if (!(await fs.pathExists(agentsPath))) { - return; // No agents to process - } - - // Determine project directory (parent of bmad/ directory) - const bmadDir = path.dirname(modulePath); - const projectDir = path.dirname(bmadDir); - const cfgAgentsDir = path.join(bmadDir, '_cfg', 'agents'); - - // Ensure _cfg/agents directory exists - await fs.ensureDir(cfgAgentsDir); - - // Get all agent files - const agentFiles = await fs.readdir(agentsPath); - - for (const agentFile of agentFiles) { - // Handle YAML agents - build them to .md - if (agentFile.endsWith('.agent.yaml')) { - const agentName = agentFile.replace('.agent.yaml', ''); - const yamlPath = path.join(agentsPath, agentFile); - const mdPath = path.join(agentsPath, `${agentName}.md`); - const customizePath = path.join(cfgAgentsDir, `${moduleName}-${agentName}.customize.yaml`); - - // Create customize template if it doesn't exist - if (!(await fs.pathExists(customizePath))) { - const genericTemplatePath = getSourcePath('utility', 'templates', 'agent.customize.template.yaml'); - if (await fs.pathExists(genericTemplatePath)) { - await this.copyFileWithPlaceholderReplacement(genericTemplatePath, customizePath, this.bmadFolderName || 'bmad'); - console.log(chalk.dim(` Created customize: ${moduleName}-${agentName}.customize.yaml`)); - } - } - - // Build YAML + customize to .md - const customizeExists = await fs.pathExists(customizePath); - let xmlContent = await this.xmlHandler.buildFromYaml(yamlPath, customizeExists ? customizePath : null, { - includeMetadata: true, - }); - - // DO NOT replace {project-root} - LLMs understand this placeholder at runtime - // const processedContent = xmlContent.replaceAll('{project-root}', projectDir); - - // Process TTS injection points (pass targetPath for tracking) - xmlContent = this.processTTSInjectionPoints(xmlContent, mdPath); - - // Write the built .md file to bmad/{module}/agents/ with POSIX-compliant final newline - const content = xmlContent.endsWith('\n') ? xmlContent : xmlContent + '\n'; - await fs.writeFile(mdPath, content, 'utf8'); - this.installedFiles.push(mdPath); - - // Remove the source YAML file - we can regenerate from installer source if needed - await fs.remove(yamlPath); - - console.log(chalk.dim(` Built agent: ${agentName}.md`)); - } - // Handle legacy .md agents - inject activation if needed - else if (agentFile.endsWith('.md')) { - const agentPath = path.join(agentsPath, agentFile); - let content = await fs.readFile(agentPath, 'utf8'); - - // Check if content has agent XML and no activation block - if (content.includes(' f.endsWith('.agent.yaml')); - - if (!yamlFile) continue; - - const agentName = path.basename(yamlFile, '.agent.yaml'); - const sourceYamlPath = path.join(agentDirPath, yamlFile); - const targetMdPath = path.join(agentDirPath, `${agentName}.md`); - const customizePath = path.join(cfgAgentsDir, `${agentName}.customize.yaml`); - - // Check for customizations - const customizeExists = await fs.pathExists(customizePath); - let customizedFields = []; - - if (customizeExists) { - const customizeContent = await fs.readFile(customizePath, 'utf8'); - const yaml = require('js-yaml'); - const customizeYaml = yaml.load(customizeContent); - - // Detect what fields are customized (similar to rebuildAgentFiles) - if (customizeYaml) { - if (customizeYaml.persona) { - for (const [key, value] of Object.entries(customizeYaml.persona)) { - if (value !== '' && value !== null && !(Array.isArray(value) && value.length === 0)) { - customizedFields.push(`persona.${key}`); - } - } - } - if (customizeYaml.agent?.metadata) { - for (const [key, value] of Object.entries(customizeYaml.agent.metadata)) { - if (value !== '' && value !== null) { - customizedFields.push(`metadata.${key}`); - } - } - } - if (customizeYaml.critical_actions && customizeYaml.critical_actions.length > 0) { - customizedFields.push('critical_actions'); - } - if (customizeYaml.menu && customizeYaml.menu.length > 0) { - customizedFields.push('menu'); - } - } - } - - // Build YAML to XML .md - let xmlContent = await this.xmlHandler.buildFromYaml(sourceYamlPath, customizeExists ? customizePath : null, { - includeMetadata: true, - }); - - // DO NOT replace {project-root} - LLMs understand this placeholder at runtime - // const processedContent = xmlContent.replaceAll('{project-root}', projectDir); - - // Process TTS injection points (pass targetPath for tracking) - xmlContent = this.processTTSInjectionPoints(xmlContent, targetMdPath); - - // Write the built .md file with POSIX-compliant final newline - const content = xmlContent.endsWith('\n') ? xmlContent : xmlContent + '\n'; - await fs.writeFile(targetMdPath, content, 'utf8'); - - // Display result - if (customizedFields.length > 0) { - console.log(chalk.dim(` Built standalone agent: ${agentName}.md `) + chalk.yellow(`(customized: ${customizedFields.join(', ')})`)); - } else { - console.log(chalk.dim(` Built standalone agent: ${agentName}.md`)); - } - } - } - - /** - * Rebuild agent files from installer source (for compile command) - * @param {string} modulePath - Path to module in bmad/ installation - * @param {string} moduleName - Module name - */ - async rebuildAgentFiles(modulePath, moduleName) { - // Get source agents directory from installer - const sourceAgentsPath = - moduleName === 'core' ? path.join(getModulePath('core'), 'agents') : path.join(getSourcePath(`modules/${moduleName}`), 'agents'); - - if (!(await fs.pathExists(sourceAgentsPath))) { - return; // No source agents to rebuild - } - - // Determine project directory (parent of bmad/ directory) - const bmadDir = path.dirname(modulePath); - const projectDir = path.dirname(bmadDir); - const cfgAgentsDir = path.join(bmadDir, '_cfg', 'agents'); - const targetAgentsPath = path.join(modulePath, 'agents'); - - // Ensure target directory exists - await fs.ensureDir(targetAgentsPath); - - // Get all YAML agent files from source - const sourceFiles = await fs.readdir(sourceAgentsPath); - - for (const file of sourceFiles) { - if (file.endsWith('.agent.yaml')) { - const agentName = file.replace('.agent.yaml', ''); - const sourceYamlPath = path.join(sourceAgentsPath, file); - const targetMdPath = path.join(targetAgentsPath, `${agentName}.md`); - const customizePath = path.join(cfgAgentsDir, `${moduleName}-${agentName}.customize.yaml`); - - // Check for customizations - const customizeExists = await fs.pathExists(customizePath); - let customizedFields = []; - - if (customizeExists) { - const customizeContent = await fs.readFile(customizePath, 'utf8'); - const yaml = require('js-yaml'); - const customizeYaml = yaml.load(customizeContent); - - // Detect what fields are customized - if (customizeYaml) { - if (customizeYaml.persona) { - for (const [key, value] of Object.entries(customizeYaml.persona)) { - if (value !== '' && value !== null && !(Array.isArray(value) && value.length === 0)) { - customizedFields.push(`persona.${key}`); - } - } - } - if (customizeYaml.agent?.metadata) { - for (const [key, value] of Object.entries(customizeYaml.agent.metadata)) { - if (value !== '' && value !== null) { - customizedFields.push(`metadata.${key}`); - } - } - } - if (customizeYaml.critical_actions && customizeYaml.critical_actions.length > 0) { - customizedFields.push('critical_actions'); - } - if (customizeYaml.memories && customizeYaml.memories.length > 0) { - customizedFields.push('memories'); - } - if (customizeYaml.menu && customizeYaml.menu.length > 0) { - customizedFields.push('menu'); - } - if (customizeYaml.prompts && customizeYaml.prompts.length > 0) { - customizedFields.push('prompts'); - } - } - } - - // Build YAML + customize to .md - let xmlContent = await this.xmlHandler.buildFromYaml(sourceYamlPath, customizeExists ? customizePath : null, { - includeMetadata: true, - }); - - // DO NOT replace {project-root} - LLMs understand this placeholder at runtime - // const processedContent = xmlContent.replaceAll('{project-root}', projectDir); - - // Process TTS injection points (pass targetPath for tracking) - xmlContent = this.processTTSInjectionPoints(xmlContent, targetMdPath); - - // Write the rebuilt .md file with POSIX-compliant final newline - const content = xmlContent.endsWith('\n') ? xmlContent : xmlContent + '\n'; - await fs.writeFile(targetMdPath, content, 'utf8'); - - // Display result with customizations if any - if (customizedFields.length > 0) { - console.log(chalk.dim(` Rebuilt agent: ${agentName}.md `) + chalk.yellow(`(customized: ${customizedFields.join(', ')})`)); - } else { - console.log(chalk.dim(` Rebuilt agent: ${agentName}.md`)); - } - } - } - } - - /** - * Compile/rebuild all agents and tasks for quick updates - * @param {Object} config - Compilation configuration - * @returns {Object} Compilation results - */ - async compileAgents(config) { - const ora = require('ora'); - const spinner = ora('Starting agent compilation...').start(); - - try { - const projectDir = path.resolve(config.directory); - const bmadDir = await this.findBmadDir(projectDir); - - // Check if bmad directory exists - if (!(await fs.pathExists(bmadDir))) { - spinner.fail('No BMAD installation found'); - throw new Error(`BMAD not installed at ${bmadDir}`); - } - - let agentCount = 0; - let taskCount = 0; - - // Process all modules in bmad directory - spinner.text = 'Rebuilding agent files...'; - const entries = await fs.readdir(bmadDir, { withFileTypes: true }); - - for (const entry of entries) { - if (entry.isDirectory() && entry.name !== '_cfg' && entry.name !== 'docs') { - const modulePath = path.join(bmadDir, entry.name); - - // Special handling for standalone agents in bmad/agents/ directory - if (entry.name === 'agents') { - spinner.text = 'Building standalone agents...'; - await this.buildStandaloneAgents(bmadDir, projectDir); - - // Count standalone agents - const standaloneAgentsPath = path.join(bmadDir, 'agents'); - const standaloneAgentDirs = await fs.readdir(standaloneAgentsPath, { withFileTypes: true }); - for (const agentDir of standaloneAgentDirs) { - if (agentDir.isDirectory()) { - const agentDirPath = path.join(standaloneAgentsPath, agentDir.name); - const agentFiles = await fs.readdir(agentDirPath); - agentCount += agentFiles.filter((f) => f.endsWith('.md') && !f.endsWith('.agent.yaml')).length; - } - } - } else { - // Rebuild module agents from installer source - const agentsPath = path.join(modulePath, 'agents'); - if (await fs.pathExists(agentsPath)) { - await this.rebuildAgentFiles(modulePath, entry.name); - const agentFiles = await fs.readdir(agentsPath); - agentCount += agentFiles.filter((f) => f.endsWith('.md')).length; - } - - // Count tasks (already built) - const tasksPath = path.join(modulePath, 'tasks'); - if (await fs.pathExists(tasksPath)) { - const taskFiles = await fs.readdir(tasksPath); - taskCount += taskFiles.filter((f) => f.endsWith('.md')).length; - } - } - } - } - - // Reinstall custom agents from _cfg/custom/agents/ sources - spinner.start('Rebuilding custom agents...'); - const customAgentResults = await this.reinstallCustomAgents(projectDir, bmadDir); - if (customAgentResults.count > 0) { - spinner.succeed(`Rebuilt ${customAgentResults.count} custom agent${customAgentResults.count > 1 ? 's' : ''}`); - agentCount += customAgentResults.count; - } else { - spinner.succeed('No custom agents found to rebuild'); - } - - // Skip full manifest regeneration during compileAgents to preserve custom agents - // Custom agents are already added to manifests during individual installation - // Only regenerate YAML manifest for IDE updates if needed - const existingManifestPath = path.join(bmadDir, '_cfg', 'manifest.yaml'); - let existingIdes = []; - if (await fs.pathExists(existingManifestPath)) { - const manifestContent = await fs.readFile(existingManifestPath, 'utf8'); - const yaml = require('js-yaml'); - const manifest = yaml.load(manifestContent); - existingIdes = manifest.ides || []; - } - - // Update IDE configurations using the existing IDE list from manifest - if (existingIdes && existingIdes.length > 0) { - spinner.start('Updating IDE configurations...'); - - for (const ide of existingIdes) { - spinner.text = `Updating ${ide}...`; - - // Stop spinner before IDE setup to prevent blocking any potential prompts - // However, we pass _alreadyConfigured to skip all prompts during compile - spinner.stop(); - - await this.ideManager.setup(ide, projectDir, bmadDir, { - selectedModules: installedModules, - skipModuleInstall: true, // Skip module installation, just update IDE files - verbose: config.verbose, - preCollectedConfig: { _alreadyConfigured: true }, // Skip all interactive prompts during compile - }); - - // Restart spinner for next IDE - if (existingIdes.indexOf(ide) < existingIdes.length - 1) { - spinner.start('Updating IDE configurations...'); - } - } - - console.log(chalk.green('✓ IDE configurations updated')); - } else { - console.log(chalk.yellow('⚠️ No IDEs configured. Skipping IDE update.')); - } - - return { agentCount, taskCount }; - } catch (error) { - spinner.fail('Compilation failed'); - throw error; - } - } - - /** - * Private: Update core - */ - async updateCore(bmadDir, force = false) { - const sourcePath = getModulePath('core'); - const targetPath = path.join(bmadDir, 'core'); - - if (force) { - await fs.remove(targetPath); - await this.installCore(bmadDir); - } else { - // Selective update - preserve user modifications - await this.fileOps.syncDirectory(sourcePath, targetPath); - } - } - - /** - * Quick update method - preserves all settings and only prompts for new config fields - * @param {Object} config - Configuration with directory - * @returns {Object} Update result - */ - async quickUpdate(config) { - const ora = require('ora'); - const spinner = ora('Starting quick update...').start(); - - try { - const projectDir = path.resolve(config.directory); - const bmadDir = await this.findBmadDir(projectDir); - - // Check if bmad directory exists - if (!(await fs.pathExists(bmadDir))) { - spinner.fail('No BMAD installation found'); - throw new Error(`BMAD not installed at ${bmadDir}. Use regular install for first-time setup.`); - } - - spinner.text = 'Detecting installed modules and configuration...'; - - // Detect existing installation - const existingInstall = await this.detector.detect(bmadDir); - const installedModules = existingInstall.modules.map((m) => m.id); - const configuredIdes = existingInstall.ides || []; - - // Load saved IDE configurations - const savedIdeConfigs = await this.ideConfigManager.loadAllIdeConfigs(bmadDir); - - // Get available modules (what we have source for) - const availableModules = await this.moduleManager.listAvailable(); - const availableModuleIds = new Set(availableModules.map((m) => m.id)); - - // Only update modules that are BOTH installed AND available (we have source for) - const modulesToUpdate = installedModules.filter((id) => availableModuleIds.has(id)); - const skippedModules = installedModules.filter((id) => !availableModuleIds.has(id)); - - spinner.succeed(`Found ${modulesToUpdate.length} module(s) to update and ${configuredIdes.length} configured tool(s)`); - - if (skippedModules.length > 0) { - console.log(chalk.yellow(`⚠️ Skipping ${skippedModules.length} module(s) - no source available: ${skippedModules.join(', ')}`)); - } - - // Load existing configs and collect new fields (if any) - console.log(chalk.cyan('\n📋 Checking for new configuration options...')); - await this.configCollector.loadExistingConfig(projectDir); - - let promptedForNewFields = false; - - // Check core config for new fields - const corePrompted = await this.configCollector.collectModuleConfigQuick('core', projectDir, true); - if (corePrompted) { - promptedForNewFields = true; - } - - // Check each module we're updating for new fields (NOT skipped modules) - for (const moduleName of modulesToUpdate) { - const modulePrompted = await this.configCollector.collectModuleConfigQuick(moduleName, projectDir, true); - if (modulePrompted) { - promptedForNewFields = true; - } - } - - if (!promptedForNewFields) { - console.log(chalk.green('✓ All configuration is up to date, no new options to configure')); - } - - // Add metadata - this.configCollector.collectedConfig._meta = { - version: require(path.join(getProjectRoot(), 'package.json')).version, - installDate: new Date().toISOString(), - lastModified: new Date().toISOString(), - }; - - // Check if bmad_folder has changed - const existingBmadFolderName = path.basename(bmadDir); - const newBmadFolderName = this.configCollector.collectedConfig.core?.bmad_folder || existingBmadFolderName; - - if (existingBmadFolderName === newBmadFolderName) { - // Normal quick update - start the spinner - console.log(chalk.cyan('Updating BMAD installation...')); - } else { - // Folder name has changed - stop spinner and let install() handle it - spinner.stop(); - console.log(chalk.yellow(`\n⚠️ Folder name will change: ${existingBmadFolderName} → ${newBmadFolderName}`)); - console.log(chalk.yellow('The installer will handle the folder migration.\n')); - } - - // Build the config object for the installer - const installConfig = { - directory: projectDir, - installCore: true, - modules: modulesToUpdate, // Only update modules we have source for - ides: configuredIdes, - skipIde: configuredIdes.length === 0, - coreConfig: this.configCollector.collectedConfig.core, - actionType: 'install', // Use regular install flow - _quickUpdate: true, // Flag to skip certain prompts - _preserveModules: skippedModules, // Preserve these in manifest even though we didn't update them - _savedIdeConfigs: savedIdeConfigs, // Pass saved IDE configs to installer - }; - - // Call the standard install method - const result = await this.install(installConfig); - - // Only succeed the spinner if it's still spinning - // (install method might have stopped it if folder name changed) - if (spinner.isSpinning) { - spinner.succeed('Quick update complete!'); - } - - return { - success: true, - moduleCount: modulesToUpdate.length + 1, // +1 for core - hadNewFields: promptedForNewFields, - modules: ['core', ...modulesToUpdate], - skippedModules: skippedModules, - ides: configuredIdes, - }; - } catch (error) { - spinner.fail('Quick update failed'); - throw error; - } - } - - /** - * Private: Prompt for update action - */ - async promptUpdateAction() { - const inquirer = require('inquirer'); - return await inquirer.prompt([ - { - type: 'list', - name: 'action', - message: 'What would you like to do?', - choices: [ - { name: 'Update existing installation', value: 'update' }, - { name: 'Remove and reinstall', value: 'reinstall' }, - { name: 'Cancel', value: 'cancel' }, - ], - }, - ]); - } - - /** - * Handle legacy BMAD v4 migration with automatic backup - * @param {string} projectDir - Project directory - * @param {Object} legacyV4 - Legacy V4 detection result with offenders array - */ - async handleLegacyV4Migration(projectDir, legacyV4) { - console.log(chalk.yellow.bold('\n⚠️ Legacy BMAD v4 detected')); - console.log(chalk.dim('The installer found legacy artefacts in your project.\n')); - - // Separate .bmad* folders (auto-backup) from other offending paths (manual cleanup) - const bmadFolders = legacyV4.offenders.filter((p) => { - const name = path.basename(p); - return name.startsWith('.bmad'); // Only dot-prefixed folders get auto-backed up - }); - const otherOffenders = legacyV4.offenders.filter((p) => { - const name = path.basename(p); - return !name.startsWith('.bmad'); // Everything else is manual cleanup - }); - - const inquirer = require('inquirer'); - - // Show warning for other offending paths FIRST - if (otherOffenders.length > 0) { - console.log(chalk.yellow('⚠️ Recommended cleanup:')); - console.log(chalk.dim('It is recommended to remove the following items before proceeding:\n')); - for (const p of otherOffenders) console.log(chalk.dim(` - ${p}`)); - - console.log(chalk.cyan('\nCleanup commands you can copy/paste:')); - console.log(chalk.dim('macOS/Linux:')); - for (const p of otherOffenders) console.log(chalk.dim(` rm -rf '${p}'`)); - console.log(chalk.dim('Windows:')); - for (const p of otherOffenders) console.log(chalk.dim(` rmdir /S /Q "${p}"`)); - - const { cleanedUp } = await inquirer.prompt([ - { - type: 'confirm', - name: 'cleanedUp', - message: 'Have you completed the recommended cleanup? (You can proceed without it, but it is recommended)', - default: false, - }, - ]); - - if (cleanedUp) { - console.log(chalk.green('✓ Cleanup acknowledged\n')); - } else { - console.log(chalk.yellow('⚠️ Proceeding without recommended cleanup\n')); - } - } - - // Handle .bmad* folders with automatic backup - if (bmadFolders.length > 0) { - console.log(chalk.cyan('The following legacy folders will be moved to v4-backup:')); - for (const p of bmadFolders) console.log(chalk.dim(` - ${p}`)); - - const { proceed } = await inquirer.prompt([ - { - type: 'confirm', - name: 'proceed', - message: 'Proceed with backing up legacy v4 folders?', - default: true, - }, - ]); - - if (proceed) { - const backupDir = path.join(projectDir, 'v4-backup'); - await fs.ensureDir(backupDir); - - for (const folder of bmadFolders) { - const folderName = path.basename(folder); - const backupPath = path.join(backupDir, folderName); - - // If backup already exists, add timestamp - let finalBackupPath = backupPath; - if (await fs.pathExists(backupPath)) { - const timestamp = new Date().toISOString().replaceAll(/[:.]/g, '-').split('T')[0]; - finalBackupPath = path.join(backupDir, `${folderName}-${timestamp}`); - } - - await fs.move(folder, finalBackupPath, { overwrite: false }); - console.log(chalk.green(`✓ Moved ${folderName} to ${path.relative(projectDir, finalBackupPath)}`)); - } - } else { - throw new Error('Installation cancelled by user'); - } - } - } - - /** - * Read files-manifest.csv - * @param {string} bmadDir - BMAD installation directory - * @returns {Array} Array of file entries from files-manifest.csv - */ - async readFilesManifest(bmadDir) { - const filesManifestPath = path.join(bmadDir, '_cfg', 'files-manifest.csv'); - if (!(await fs.pathExists(filesManifestPath))) { - return []; - } - - try { - const content = await fs.readFile(filesManifestPath, 'utf8'); - const lines = content.split('\n'); - const files = []; - - for (let i = 1; i < lines.length; i++) { - // Skip header - const line = lines[i].trim(); - if (!line) continue; - - // Parse CSV line properly handling quoted values - const parts = []; - let current = ''; - let inQuotes = false; - - for (const char of line) { - if (char === '"') { - inQuotes = !inQuotes; - } else if (char === ',' && !inQuotes) { - parts.push(current); - current = ''; - } else { - current += char; - } - } - parts.push(current); // Add last part - - if (parts.length >= 4) { - files.push({ - type: parts[0], - name: parts[1], - module: parts[2], - path: parts[3], - hash: parts[4] || null, // Hash may not exist in old manifests - }); - } - } - - return files; - } catch (error) { - console.warn('Warning: Could not read files-manifest.csv:', error.message); - return []; - } - } - - /** - * Detect custom and modified files - * @param {string} bmadDir - BMAD installation directory - * @param {Array} existingFilesManifest - Previous files from files-manifest.csv - * @returns {Object} Object with customFiles and modifiedFiles arrays - */ - async detectCustomFiles(bmadDir, existingFilesManifest) { - const customFiles = []; - const modifiedFiles = []; - - // Check if the manifest has hashes - if not, we can't detect modifications - let manifestHasHashes = false; - if (existingFilesManifest && existingFilesManifest.length > 0) { - manifestHasHashes = existingFilesManifest.some((f) => f.hash); - } - - // Build map of previously installed files from files-manifest.csv with their hashes - const installedFilesMap = new Map(); - for (const fileEntry of existingFilesManifest) { - if (fileEntry.path) { - // Paths are relative to bmadDir. Legacy manifests incorrectly prefixed 'bmad/' - - // strip it if present. This is safe because no real path inside bmadDir would - // start with 'bmad/' (you'd never have .bmad/bmad/... as an actual structure). - const relativePath = fileEntry.path.startsWith('bmad/') ? fileEntry.path.slice(5) : fileEntry.path; - const absolutePath = path.join(bmadDir, relativePath); - installedFilesMap.set(path.normalize(absolutePath), { - hash: fileEntry.hash, - relativePath: relativePath, - }); - } - } - - // Recursively scan bmadDir for all files - const scanDirectory = async (dir) => { - try { - const entries = await fs.readdir(dir, { withFileTypes: true }); - for (const entry of entries) { - const fullPath = path.join(dir, entry.name); - - if (entry.isDirectory()) { - // Skip certain directories - if (entry.name === 'node_modules' || entry.name === '.git') { - continue; - } - await scanDirectory(fullPath); - } else if (entry.isFile()) { - const normalizedPath = path.normalize(fullPath); - const fileInfo = installedFilesMap.get(normalizedPath); - - // Skip certain system files that are auto-generated - const relativePath = path.relative(bmadDir, fullPath); - const fileName = path.basename(fullPath); - - // Skip _cfg directory - system files - if (relativePath.startsWith('_cfg/') || relativePath.startsWith('_cfg\\')) { - continue; - } - - // Skip config.yaml files - these are regenerated on each install/update - // Users should use _cfg/agents/ override files instead - if (fileName === 'config.yaml') { - continue; - } - - if (!fileInfo) { - // File not in manifest = custom file - customFiles.push(fullPath); - } else if (manifestHasHashes && fileInfo.hash) { - // File in manifest with hash - check if it was modified - const currentHash = await this.manifest.calculateFileHash(fullPath); - if (currentHash && currentHash !== fileInfo.hash) { - // Hash changed = file was modified - modifiedFiles.push({ - path: fullPath, - relativePath: fileInfo.relativePath, - }); - } - } - // If manifest doesn't have hashes, we can't detect modifications - // so we just skip files that are in the manifest - } - } - } catch { - // Ignore errors scanning directories - } - }; - - await scanDirectory(bmadDir); - return { customFiles, modifiedFiles }; - } - - /** - * Private: Create agent configuration files - * @param {string} bmadDir - BMAD installation directory - * @param {Object} userInfo - User information including name and language - */ - async createAgentConfigs(bmadDir, userInfo = null) { - const agentConfigDir = path.join(bmadDir, '_cfg', 'agents'); - await fs.ensureDir(agentConfigDir); - - // Get all agents from all modules - const agents = []; - const agentDetails = []; // For manifest generation - - // Check modules for agents (including core) - const entries = await fs.readdir(bmadDir, { withFileTypes: true }); - for (const entry of entries) { - if (entry.isDirectory() && entry.name !== '_cfg') { - const moduleAgentsPath = path.join(bmadDir, entry.name, 'agents'); - if (await fs.pathExists(moduleAgentsPath)) { - const agentFiles = await fs.readdir(moduleAgentsPath); - for (const agentFile of agentFiles) { - if (agentFile.endsWith('.md')) { - const agentPath = path.join(moduleAgentsPath, agentFile); - const agentContent = await fs.readFile(agentPath, 'utf8'); - - // Skip agents with localskip="true" - const hasLocalSkip = agentContent.match(/]*\slocalskip="true"[^>]*>/); - if (hasLocalSkip) { - continue; // Skip this agent - it should not have been installed - } - - const agentName = path.basename(agentFile, '.md'); - - // Extract any nodes with agentConfig="true" - const agentConfigNodes = this.extractAgentConfigNodes(agentContent); - - agents.push({ - name: agentName, - module: entry.name, - agentConfigNodes: agentConfigNodes, - }); - - // Use shared AgentPartyGenerator to extract details - let details = AgentPartyGenerator.extractAgentDetails(agentContent, entry.name, agentName); - - // Apply config overrides if they exist - if (details) { - const configPath = path.join(agentConfigDir, `${entry.name}-${agentName}.md`); - if (await fs.pathExists(configPath)) { - const configContent = await fs.readFile(configPath, 'utf8'); - details = AgentPartyGenerator.applyConfigOverrides(details, configContent); - } - agentDetails.push(details); - } - } - } - } - } - } - - // Create config file for each agent - let createdCount = 0; - let skippedCount = 0; - - // Load agent config template - const templatePath = getSourcePath('utility', 'models', 'agent-config-template.md'); - const templateContent = await fs.readFile(templatePath, 'utf8'); - - for (const agent of agents) { - const configPath = path.join(agentConfigDir, `${agent.module}-${agent.name}.md`); - - // Skip if config file already exists (preserve custom configurations) - if (await fs.pathExists(configPath)) { - skippedCount++; - continue; - } - - // Build config content header - let configContent = `# Agent Config: ${agent.name}\n\n`; - - // Process template and add agent-specific config nodes - let processedTemplate = templateContent; - - // Replace {core:user_name} placeholder with actual user name if available - if (userInfo && userInfo.userName) { - processedTemplate = processedTemplate.replaceAll('{core:user_name}', userInfo.userName); - } - - // Replace {core:communication_language} placeholder with actual language if available - if (userInfo && userInfo.responseLanguage) { - processedTemplate = processedTemplate.replaceAll('{core:communication_language}', userInfo.responseLanguage); - } - - // If this agent has agentConfig nodes, add them after the existing comment - if (agent.agentConfigNodes && agent.agentConfigNodes.length > 0) { - // Find the agent-specific configuration nodes comment - const commentPattern = /(\s*)/; - const commentMatch = processedTemplate.match(commentPattern); - - if (commentMatch) { - // Add nodes right after the comment - let agentSpecificNodes = ''; - for (const node of agent.agentConfigNodes) { - agentSpecificNodes += `\n ${node}`; - } - - processedTemplate = processedTemplate.replace(commentPattern, `$1${agentSpecificNodes}`); - } - } - - configContent += processedTemplate; - - // Ensure POSIX-compliant final newline - if (!configContent.endsWith('\n')) { - configContent += '\n'; - } - - await fs.writeFile(configPath, configContent, 'utf8'); - this.installedFiles.push(configPath); // Track agent config files - createdCount++; - } - - // Generate agent manifest with overrides applied - await this.generateAgentManifest(bmadDir, agentDetails); - - return { total: agents.length, created: createdCount, skipped: skippedCount }; - } - - /** - * Generate agent manifest XML file - * @param {string} bmadDir - BMAD installation directory - * @param {Array} agentDetails - Array of agent details - */ - async generateAgentManifest(bmadDir, agentDetails) { - const manifestPath = path.join(bmadDir, '_cfg', 'agent-manifest.csv'); - await AgentPartyGenerator.writeAgentParty(manifestPath, agentDetails, { forWeb: false }); - } - - /** - * Extract nodes with agentConfig="true" from agent content - * @param {string} content - Agent file content - * @returns {Array} Array of XML nodes that should be added to agent config - */ - extractAgentConfigNodes(content) { - const nodes = []; - - try { - // Find all XML nodes with agentConfig="true" - // Match self-closing tags and tags with content - const selfClosingPattern = /<([a-zA-Z][a-zA-Z0-9_-]*)\s+[^>]*agentConfig="true"[^>]*\/>/g; - const withContentPattern = /<([a-zA-Z][a-zA-Z0-9_-]*)\s+[^>]*agentConfig="true"[^>]*>([\s\S]*?)<\/\1>/g; - - // Extract self-closing tags - let match; - while ((match = selfClosingPattern.exec(content)) !== null) { - // Extract just the tag without children (structure only) - const tagMatch = match[0].match(/<([a-zA-Z][a-zA-Z0-9_-]*)([^>]*)\/>/); - if (tagMatch) { - const tagName = tagMatch[1]; - const attributes = tagMatch[2].replace(/\s*agentConfig="true"/, ''); // Remove agentConfig attribute - nodes.push(`<${tagName}${attributes}>`); - } - } - - // Extract tags with content - while ((match = withContentPattern.exec(content)) !== null) { - const fullMatch = match[0]; - const tagName = match[1]; - - // Extract opening tag with attributes (removing agentConfig="true") - const openingTagMatch = fullMatch.match(new RegExp(`<${tagName}([^>]*)>`)); - if (openingTagMatch) { - const attributes = openingTagMatch[1].replace(/\s*agentConfig="true"/, ''); - // Add empty node structure (no children) - nodes.push(`<${tagName}${attributes}>`); - } - } - } catch (error) { - console.error('Error extracting agentConfig nodes:', error); - } - - return nodes; - } - - /** - * Reinstall custom agents from backup and source locations - * This preserves custom agents across quick updates/reinstalls - * @param {string} projectDir - Project directory - * @param {string} bmadDir - BMAD installation directory - * @returns {Object} Result with count and agent names - */ - async reinstallCustomAgents(projectDir, bmadDir) { - const { - discoverAgents, - loadAgentConfig, - extractManifestData, - addToManifest, - createIdeSlashCommands, - updateManifestYaml, - } = require('../../../lib/agent/installer'); - const { compileAgent } = require('../../../lib/agent/compiler'); - - const results = { count: 0, agents: [] }; - - // Check multiple locations for custom agents - const sourceLocations = [ - path.join(bmadDir, '_cfg', 'custom', 'agents'), // Backup location - path.join(bmadDir, 'custom', 'src', 'agents'), // BMAD folder source location - path.join(projectDir, 'custom', 'src', 'agents'), // Project root source location - ]; - - let foundAgents = []; - let processedAgents = new Set(); // Track to avoid duplicates - - // Discover agents from all locations - for (const location of sourceLocations) { - if (await fs.pathExists(location)) { - const agents = discoverAgents(location); - // Only add agents we haven't processed yet - const newAgents = agents.filter((agent) => !processedAgents.has(agent.name)); - foundAgents.push(...newAgents); - for (const agent of newAgents) processedAgents.add(agent.name); - } - } - - if (foundAgents.length === 0) { - return results; - } - - try { - const customAgentsDir = path.join(bmadDir, 'custom', 'agents'); - await fs.ensureDir(customAgentsDir); - - const manifestFile = path.join(bmadDir, '_cfg', 'agent-manifest.csv'); - const manifestYamlFile = path.join(bmadDir, '_cfg', 'manifest.yaml'); - - for (const agent of foundAgents) { - try { - const agentConfig = loadAgentConfig(agent.yamlFile); - const finalAgentName = agent.name; // Already named correctly from save - - // Determine agent type from the name (e.g., "fred-commit-poet" → "commit-poet") - let agentType = finalAgentName; - const parts = finalAgentName.split('-'); - if (parts.length >= 2) { - // Try to extract type (last part or last two parts) - // For "fred-commit-poet", we want "commit-poet" - // This is heuristic - could be improved with metadata storage - agentType = parts.slice(-2).join('-'); // Take last 2 parts as type - } - - // Create target directory - use relative path if agent is in a subdirectory - const agentTargetDir = agent.relativePath - ? path.join(customAgentsDir, agent.relativePath) - : path.join(customAgentsDir, finalAgentName); - await fs.ensureDir(agentTargetDir); - - // Calculate paths - const compiledFileName = `${finalAgentName}.md`; - const compiledPath = path.join(agentTargetDir, compiledFileName); - const relativePath = path.relative(projectDir, compiledPath); - - // Compile with embedded defaults (answers are already in defaults section) - const { xml, metadata } = compileAgent( - await fs.readFile(agent.yamlFile, 'utf8'), - agentConfig.defaults || {}, - finalAgentName, - relativePath, - ); - - // Write compiled agent - await fs.writeFile(compiledPath, xml, 'utf8'); - - // Backup source YAML to _cfg/custom/agents if not already there - const cfgAgentsBackupDir = path.join(bmadDir, '_cfg', 'custom', 'agents'); - await fs.ensureDir(cfgAgentsBackupDir); - const backupYamlPath = path.join(cfgAgentsBackupDir, `${finalAgentName}.agent.yaml`); - - // Only backup if source is not already in backup location - if (agent.yamlFile !== backupYamlPath) { - await fs.copy(agent.yamlFile, backupYamlPath); - } - - // Copy sidecar files if expert agent - if (agent.hasSidecar && agent.type === 'expert') { - const { copySidecarFiles } = require('../../../lib/agent/installer'); - copySidecarFiles(agent.path, agentTargetDir, agent.yamlFile); - } - - // Update manifest CSV - if (await fs.pathExists(manifestFile)) { - // Preserve YAML metadata for persona name, but override id for filename - const manifestMetadata = { - ...metadata, - id: relativePath, // Use the compiled agent path for id - name: metadata.name || finalAgentName, // Use YAML metadata.name (persona name) or fallback - title: metadata.title, // Use YAML title - icon: metadata.icon, // Use YAML icon - }; - const manifestData = extractManifestData(xml, manifestMetadata, relativePath, 'custom'); - manifestData.name = finalAgentName; // Use filename for the name field - manifestData.path = relativePath; - addToManifest(manifestFile, manifestData); - } - - // Create IDE slash commands (async function) - await createIdeSlashCommands(projectDir, finalAgentName, relativePath, metadata); - - // Update manifest.yaml - if (await fs.pathExists(manifestYamlFile)) { - updateManifestYaml(manifestYamlFile, finalAgentName, agentType); - } - - results.count++; - results.agents.push(finalAgentName); - } catch (agentError) { - console.log(chalk.yellow(` ⚠️ Failed to reinstall ${agent.name}: ${agentError.message}`)); - } - } - } catch (error) { - console.log(chalk.yellow(` ⚠️ Error reinstalling custom agents: ${error.message}`)); - } - - return results; - } - - /** - * Copy IDE-specific documentation to BMAD docs - * @param {Array} ides - List of selected IDEs - * @param {string} bmadDir - BMAD installation directory - */ - async copyIdeDocumentation(ides, bmadDir) { - const docsDir = path.join(bmadDir, 'docs'); - await fs.ensureDir(docsDir); - - for (const ide of ides) { - const sourceDocPath = path.join(getProjectRoot(), 'docs', 'ide-info', `${ide}.md`); - const targetDocPath = path.join(docsDir, `${ide}-instructions.md`); - - if (await fs.pathExists(sourceDocPath)) { - await this.copyFileWithPlaceholderReplacement(sourceDocPath, targetDocPath, this.bmadFolderName || 'bmad'); - } - } - } - - /** - * Scan for legacy/obsolete files in BMAD installation - * @param {string} bmadDir - BMAD installation directory - * @returns {Object} Categorized files for cleanup - */ - async scanForLegacyFiles(bmadDir) { - const legacyFiles = { - backup: [], - documentation: [], - deprecated_task: [], - unknown: [], - }; - - try { - // Load files manifest to understand what should exist - const manifestPath = path.join(bmadDir, 'files-manifest.csv'); - const manifestFiles = new Set(); - - if (await fs.pathExists(manifestPath)) { - const manifestContent = await fs.readFile(manifestPath, 'utf8'); - const lines = manifestContent.split('\n').slice(1); // Skip header - for (const line of lines) { - if (line.trim()) { - const relativePath = line.split(',')[0]; - if (relativePath) { - manifestFiles.add(relativePath); - } - } - } - } - - // Scan all files recursively - const allFiles = await this.getAllFiles(bmadDir); - - for (const filePath of allFiles) { - const relativePath = path.relative(bmadDir, filePath); - - // Skip expected files - if (this.isExpectedFile(relativePath, manifestFiles)) { - continue; - } - - // Categorize legacy files - if (relativePath.endsWith('.bak')) { - legacyFiles.backup.push({ - path: filePath, - relativePath: relativePath, - size: (await fs.stat(filePath)).size, - mtime: (await fs.stat(filePath)).mtime, - }); - } else if (this.isDocumentationFile(relativePath)) { - legacyFiles.documentation.push({ - path: filePath, - relativePath: relativePath, - size: (await fs.stat(filePath)).size, - mtime: (await fs.stat(filePath)).mtime, - }); - } else if (this.isDeprecatedTaskFile(relativePath)) { - const suggestedAlternative = this.suggestAlternative(relativePath); - legacyFiles.deprecated_task.push({ - path: filePath, - relativePath: relativePath, - size: (await fs.stat(filePath)).size, - mtime: (await fs.stat(filePath)).mtime, - suggestedAlternative, - }); - } else { - legacyFiles.unknown.push({ - path: filePath, - relativePath: relativePath, - size: (await fs.stat(filePath)).size, - mtime: (await fs.stat(filePath)).mtime, - }); - } - } - } catch (error) { - console.warn(`Warning: Could not scan for legacy files: ${error.message}`); - } - - return legacyFiles; - } - - /** - * Get all files in directory recursively - * @param {string} dir - Directory to scan - * @returns {Array} Array of file paths - */ - async getAllFiles(dir) { - const files = []; - - async function scan(currentDir) { - const entries = await fs.readdir(currentDir); - - for (const entry of entries) { - const fullPath = path.join(currentDir, entry); - const stat = await fs.stat(fullPath); - - if (stat.isDirectory()) { - // Skip certain directories - if (!['node_modules', '.git', 'dist', 'build'].includes(entry)) { - await scan(fullPath); - } - } else { - files.push(fullPath); - } - } - } - - await scan(dir); - return files; - } - - /** - * Check if file is expected in installation - * @param {string} relativePath - Relative path from BMAD dir - * @param {Set} manifestFiles - Files from manifest - * @returns {boolean} True if expected file - */ - isExpectedFile(relativePath, manifestFiles) { - // Core files in manifest - if (manifestFiles.has(relativePath)) { - return true; - } - - // Configuration files - if (relativePath.startsWith('_cfg/') || relativePath === 'config.yaml') { - return true; - } - - // Custom files - if (relativePath.startsWith('custom/') || relativePath === 'manifest.yaml') { - return true; - } - - // Generated files - if (relativePath === 'manifest.csv' || relativePath === 'files-manifest.csv') { - return true; - } - - // IDE-specific files - const ides = ['vscode', 'cursor', 'windsurf', 'claude-code', 'github-copilot', 'zsh', 'bash', 'fish']; - if (ides.some((ide) => relativePath.includes(ide))) { - return true; - } - - // BMAD MODULE STRUCTURES - recognize valid module content - const modulePrefixes = ['bmb/', 'bmm/', 'cis/', 'core/', 'bmgd/']; - const validExtensions = ['.yaml', '.yml', '.json', '.csv', '.md', '.xml', '.svg', '.png', '.jpg', '.gif', '.excalidraw', '.js']; - - // Check if this file is in a recognized module directory - for (const modulePrefix of modulePrefixes) { - if (relativePath.startsWith(modulePrefix)) { - // Check if it has a valid extension - const hasValidExtension = validExtensions.some((ext) => relativePath.endsWith(ext)); - if (hasValidExtension) { - return true; - } - } - } - - // Special case for core module resources - if (relativePath.startsWith('core/resources/')) { - return true; - } - - // Special case for docs directory - if (relativePath.startsWith('docs/')) { - return true; - } - - return false; - } - - /** - * Check if file is documentation - * @param {string} relativePath - Relative path - * @returns {boolean} True if documentation - */ - isDocumentationFile(relativePath) { - const docExtensions = ['.md', '.txt', '.pdf']; - const docPatterns = ['docs/', 'README', 'CHANGELOG', 'LICENSE']; - - return docExtensions.some((ext) => relativePath.endsWith(ext)) || docPatterns.some((pattern) => relativePath.includes(pattern)); - } - - /** - * Check if file is deprecated task file - * @param {string} relativePath - Relative path - * @returns {boolean} True if deprecated - */ - isDeprecatedTaskFile(relativePath) { - // Known deprecated files - const deprecatedFiles = ['adv-elicit-methods.csv', 'game-resources.json', 'ux-workflow.json']; - - return deprecatedFiles.some((dep) => relativePath.includes(dep)); - } - - /** - * Suggest alternative for deprecated file - * @param {string} relativePath - Deprecated file path - * @returns {string} Suggested alternative - */ - suggestAlternative(relativePath) { - const alternatives = { - 'adv-elicit-methods.csv': 'Use the new structured workflows in src/modules/', - 'game-resources.json': 'Resources are now integrated into modules', - 'ux-workflow.json': 'UX workflows are now in src/modules/bmm/workflows/', - }; - - for (const [deprecated, alternative] of Object.entries(alternatives)) { - if (relativePath.includes(deprecated)) { - return alternative; - } - } - - return 'Check src/modules/ for new alternatives'; - } - - /** - * Perform interactive cleanup of legacy files - * @param {string} bmadDir - BMAD installation directory - * @param {boolean} skipInteractive - Skip interactive prompts - * @returns {Object} Cleanup results - */ - async performCleanup(bmadDir, skipInteractive = false) { - const inquirer = require('inquirer'); - const yaml = require('js-yaml'); - - // Load user retention preferences - const retentionPath = path.join(bmadDir, '_cfg', 'user-retained-files.yaml'); - let retentionData = { retainedFiles: [], history: [] }; - - if (await fs.pathExists(retentionPath)) { - const retentionContent = await fs.readFile(retentionPath, 'utf8'); - retentionData = yaml.load(retentionContent) || retentionData; - } - - // Scan for legacy files - const legacyFiles = await this.scanForLegacyFiles(bmadDir); - const allLegacyFiles = [...legacyFiles.backup, ...legacyFiles.documentation, ...legacyFiles.deprecated_task, ...legacyFiles.unknown]; - - if (allLegacyFiles.length === 0) { - return { deleted: 0, retained: 0, message: 'No legacy files found' }; - } - - let deletedCount = 0; - let retainedCount = 0; - const filesToDelete = []; - - if (skipInteractive) { - // Auto-delete all non-retained files - for (const file of allLegacyFiles) { - if (!retentionData.retainedFiles.includes(file.relativePath)) { - filesToDelete.push(file); - } - } - } else { - // Interactive cleanup - console.log(chalk.cyan('\n🧹 Legacy File Cleanup\n')); - console.log(chalk.dim('The following obsolete files were found:\n')); - - // Group files by category - const categories = []; - if (legacyFiles.backup.length > 0) { - categories.push({ name: 'Backup Files (.bak)', files: legacyFiles.backup }); - } - if (legacyFiles.documentation.length > 0) { - categories.push({ name: 'Documentation', files: legacyFiles.documentation }); - } - if (legacyFiles.deprecated_task.length > 0) { - categories.push({ name: 'Deprecated Task Files', files: legacyFiles.deprecated_task }); - } - if (legacyFiles.unknown.length > 0) { - categories.push({ name: 'Unknown Files', files: legacyFiles.unknown }); - } - - for (const category of categories) { - console.log(chalk.yellow(`${category.name}:`)); - for (const file of category.files) { - const size = (file.size / 1024).toFixed(1); - const date = file.mtime.toLocaleDateString(); - let line = ` - ${file.relativePath} (${size}KB, ${date})`; - if (file.suggestedAlternative) { - line += chalk.dim(` → ${file.suggestedAlternative}`); - } - console.log(chalk.dim(line)); - } - console.log(); - } - - const prompt = await inquirer.prompt([ - { - type: 'confirm', - name: 'proceed', - message: 'Would you like to review these files for cleanup?', - default: true, - }, - ]); - - if (!prompt.proceed) { - return { deleted: 0, retained: allLegacyFiles.length, message: 'Cleanup cancelled by user' }; - } - - // Show selection interface - const selectionPrompt = await inquirer.prompt([ - { - type: 'checkbox', - name: 'filesToDelete', - message: 'Select files to delete (use SPACEBAR to select, ENTER to continue):', - choices: allLegacyFiles.map((file) => { - const isRetained = retentionData.retainedFiles.includes(file.relativePath); - const description = `${file.relativePath} (${(file.size / 1024).toFixed(1)}KB)`; - return { - name: description, - value: file, - checked: !isRetained && !file.relativePath.includes('.bak'), - }; - }), - pageSize: Math.min(allLegacyFiles.length, 15), - }, - ]); - - filesToDelete.push(...selectionPrompt.filesToDelete); - } - - // Delete selected files - for (const file of filesToDelete) { - try { - await fs.remove(file.path); - deletedCount++; - } catch (error) { - console.warn(`Warning: Could not delete ${file.relativePath}: ${error.message}`); - } - } - - // Count retained files - retainedCount = allLegacyFiles.length - deletedCount; - - // Update retention data - const newlyRetained = allLegacyFiles.filter((f) => !filesToDelete.includes(f)).map((f) => f.relativePath); - - retentionData.retainedFiles = [...new Set([...retentionData.retainedFiles, ...newlyRetained])]; - retentionData.history.push({ - date: new Date().toISOString(), - deleted: deletedCount, - retained: retainedCount, - files: filesToDelete.map((f) => f.relativePath), - }); - - // Save retention data - await fs.ensureDir(path.dirname(retentionPath)); - await fs.writeFile(retentionPath, yaml.dump(retentionData), 'utf8'); - - return { deleted: deletedCount, retained: retainedCount }; - } -} - -module.exports = { Installer }; From 1697a453766e6ea990c4f560671793adcec6d425 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 6 Dec 2025 21:08:57 -0600 Subject: [PATCH 12/26] sidecar content goes to custom core config location --- .../bmb/docs/agents/agent-menu-patterns.md | 2 +- .../docs/agents/expert-agent-architecture.md | 8 +- .../create-module/templates/agent.template.md | 2 +- tools/cli/commands/agent-install.js | 45 +++++++- tools/cli/installers/lib/core/installer.js | 106 +++++++++++++++++- .../core/post-install-sidecar-replacement.js | 79 +++++++++++++ .../lib/ide/shared/agent-command-generator.js | 7 +- .../lib/ide/shared/bmad-artifacts.js | 6 +- .../ide/templates/agent-command-template.md | 2 +- tools/cli/installers/lib/modules/manager.js | 59 +++++++++- tools/cli/lib/agent/compiler.js | 15 ++- tools/cli/lib/agent/installer.js | 76 ++++++++++++- 12 files changed, 377 insertions(+), 30 deletions(-) create mode 100644 tools/cli/installers/lib/core/post-install-sidecar-replacement.js diff --git a/src/modules/bmb/docs/agents/agent-menu-patterns.md b/src/modules/bmb/docs/agents/agent-menu-patterns.md index 27f0f2b4..a49fffca 100644 --- a/src/modules/bmb/docs/agents/agent-menu-patterns.md +++ b/src/modules/bmb/docs/agents/agent-menu-patterns.md @@ -375,7 +375,7 @@ exec: "../../../core/tasks/validate.xml" - `{project-root}` - Project root directory - `{bmad_folder}` - BMAD installation folder -- `{agent-folder}` - Agent installation directory (Expert agents) +- `{agent_sidecar_folder}` - Agent installation directory (Expert agents) - `{output_folder}` - Document output location - `{user_name}` - User's name from config - `{communication_language}` - Language preference diff --git a/src/modules/bmb/docs/agents/expert-agent-architecture.md b/src/modules/bmb/docs/agents/expert-agent-architecture.md index 8d9defb3..4f79995d 100644 --- a/src/modules/bmb/docs/agents/expert-agent-architecture.md +++ b/src/modules/bmb/docs/agents/expert-agent-architecture.md @@ -196,7 +196,7 @@ critical_actions: - **Memory integration** - Past context becomes part of current session - **Protocol adherence** - Ensures consistent behavior -### {agent-folder} Variable +### {agent_sidecar_folder} Variable Special variable resolved during installation: @@ -313,7 +313,7 @@ critical_actions: 1. **Load sidecar files in critical_actions** - Must be explicit and MANDATORY 2. **Enforce domain restrictions** - Clear boundaries prevent scope creep -3. **Use {agent-folder} paths** - Portable across installations +3. **Use {agent_sidecar_folder} paths** - Portable across installations 4. **Design for memory growth** - Structure sidecar files for accumulation 5. **Reference past naturally** - Don't dump memory, weave it into conversation 6. **Separate concerns** - Memories, instructions, knowledge in distinct files @@ -356,8 +356,8 @@ identity: | - [ ] Sidecar folder structure created and populated - [ ] memories.md has clear section structure - [ ] instructions.md contains core directives -- [ ] Menu actions reference {agent-folder} correctly -- [ ] File paths use {agent-folder} variable +- [ ] Menu actions reference {agent_sidecar_folder} correctly +- [ ] File paths use {agent_sidecar_folder} variable - [ ] Install config personalizes sidecar references - [ ] Agent folder named consistently: `{agent-name}/` - [ ] YAML file named: `{agent-name}.agent.yaml` diff --git a/src/modules/bmb/workflows/create-module/templates/agent.template.md b/src/modules/bmb/workflows/create-module/templates/agent.template.md index a7b50b70..3aca9587 100644 --- a/src/modules/bmb/workflows/create-module/templates/agent.template.md +++ b/src/modules/bmb/workflows/create-module/templates/agent.template.md @@ -170,7 +170,7 @@ Expert agents support three types of menu actions: - Sidecar folders go in: `{custom_module_location}/{module_name}/agents/[agent-name]-sidecar/` 2. **Variable Usage**: - - `{agent-folder}` resolves to the agents folder within your module + - `{agent_sidecar_folder}` resolves to the agents sidecar folder destination after installation - `{bmad_folder}` resolves to .bmad - `{custom_module}` resolves to custom/src/modules - `{module}` is your module code/name diff --git a/tools/cli/commands/agent-install.js b/tools/cli/commands/agent-install.js index e5d19db9..966d436a 100644 --- a/tools/cli/commands/agent-install.js +++ b/tools/cli/commands/agent-install.js @@ -245,12 +245,20 @@ module.exports = { // Load agent configuration const agentConfig = loadAgentConfig(selectedAgent.yamlFile); + // Check if agent has sidecar + if (agentConfig.metadata.hasSidecar) { + selectedAgent.hasSidecar = true; + } + if (agentConfig.metadata.name) { console.log(chalk.dim(`Agent Name: ${agentConfig.metadata.name}`)); } if (agentConfig.metadata.title) { console.log(chalk.dim(`Title: ${agentConfig.metadata.title}`)); } + if (agentConfig.metadata.hasSidecar) { + console.log(chalk.dim(`Sidecar: Yes`)); + } // Get the agent type (source name) const agentType = selectedAgent.name; // e.g., "commit-poet" @@ -508,12 +516,22 @@ module.exports = { const compiledPath = path.join(agentTargetDir, compiledFileName); const relativePath = path.relative(projectRoot, compiledPath); + // Read core config to get agent_sidecar_folder + const coreConfigPath = path.join(config.bmadFolder, 'bmb', 'config.yaml'); + let coreConfig = {}; + if (fs.existsSync(coreConfigPath)) { + const yamlLib = require('yaml'); + const content = fs.readFileSync(coreConfigPath, 'utf8'); + coreConfig = yamlLib.parse(content); + } + // Compile with proper name and path const { xml, metadata, processedYaml } = compileAgent( fs.readFileSync(selectedAgent.yamlFile, 'utf8'), answers, finalAgentName, relativePath, + { config: coreConfig }, ); // Write compiled XML (.md) with custom name @@ -527,12 +545,31 @@ module.exports = { sidecarCopied: false, }; - // Copy sidecar files for expert agents - if (selectedAgent.hasSidecar && selectedAgent.type === 'expert') { - const { copySidecarFiles } = require('../lib/agent/installer'); - const sidecarFiles = copySidecarFiles(selectedAgent.path, agentTargetDir, selectedAgent.yamlFile); + // Handle sidecar files for agents with hasSidecar flag + if (selectedAgent.hasSidecar === true && selectedAgent.type === 'expert') { + const { copyAgentSidecarFiles } = require('../lib/agent/installer'); + + // Get agent sidecar folder from config or use default + const agentSidecarFolder = coreConfig?.agent_sidecar_folder || '{project-root}/.myagent-data'; + + // Resolve path variables + const resolvedSidecarFolder = agentSidecarFolder + .replaceAll('{project-root}', projectRoot) + .replaceAll('{bmad_folder}', config.bmadFolder); + + // Create sidecar directory for this agent + const agentSidecarDir = path.join(resolvedSidecarFolder, finalAgentName); + if (!fs.existsSync(agentSidecarDir)) { + fs.mkdirSync(agentSidecarDir, { recursive: true }); + } + + // Find and copy sidecar folder + const sidecarFiles = copyAgentSidecarFiles(selectedAgent.path, agentSidecarDir, selectedAgent.yamlFile); result.sidecarCopied = true; result.sidecarFiles = sidecarFiles; + result.sidecarDir = agentSidecarDir; + + console.log(chalk.dim(` Sidecar copied to: ${agentSidecarDir}`)); } console.log(chalk.green('\n✨ Agent installed successfully!')); diff --git a/tools/cli/installers/lib/core/installer.js b/tools/cli/installers/lib/core/installer.js index 1fb4caf3..4512cd6d 100644 --- a/tools/cli/installers/lib/core/installer.js +++ b/tools/cli/installers/lib/core/installer.js @@ -37,6 +37,7 @@ const { AgentPartyGenerator } = require('../../../lib/agent-party-generator'); const { CLIUtils } = require('../../../lib/cli-utils'); const { ManifestGenerator } = require('./manifest-generator'); const { IdeConfigManager } = require('./ide-config-manager'); +const { replaceAgentSidecarFolders } = require('./post-install-sidecar-replacement'); class Installer { constructor() { @@ -1024,6 +1025,20 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: } } + // Replace {agent_sidecar_folder} placeholders in all agent files + console.log(chalk.dim('\n Configuring agent sidecar folders...')); + const sidecarResults = await replaceAgentSidecarFolders(bmadDir); + + if (sidecarResults.filesReplaced > 0) { + console.log( + chalk.green( + ` ✓ Updated ${sidecarResults.filesReplaced} agent file(s) with ${sidecarResults.totalReplacements} sidecar reference(s)`, + ), + ); + } else { + console.log(chalk.dim(' No agent sidecar references found')); + } + // Display completion message const { UI } = require('../../../lib/ui'); const ui = new UI(); @@ -1529,18 +1544,71 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: // DO NOT replace {project-root} - LLMs understand this placeholder at runtime // const processedContent = xmlContent.replaceAll('{project-root}', projectDir); + // Replace {agent_sidecar_folder} if configured + const coreConfig = this.configCollector.collectedConfig.core || {}; + if (coreConfig.agent_sidecar_folder && xmlContent.includes('{agent_sidecar_folder}')) { + xmlContent = xmlContent.replaceAll('{agent_sidecar_folder}', coreConfig.agent_sidecar_folder); + } + // Process TTS injection points (pass targetPath for tracking) xmlContent = this.processTTSInjectionPoints(xmlContent, mdPath); + // Check if agent has sidecar and copy it + let agentYamlContent = null; + let hasSidecar = false; + + try { + agentYamlContent = await fs.readFile(yamlPath, 'utf8'); + const yamlLib = require('yaml'); + const agentYaml = yamlLib.parse(agentYamlContent); + hasSidecar = agentYaml?.agent?.metadata?.hasSidecar === true; + } catch { + // Continue without sidecar processing + } + // Write the built .md file to bmad/{module}/agents/ with POSIX-compliant final newline const content = xmlContent.endsWith('\n') ? xmlContent : xmlContent + '\n'; await fs.writeFile(mdPath, content, 'utf8'); this.installedFiles.push(mdPath); + // Copy sidecar files if agent has hasSidecar flag + if (hasSidecar) { + const { copyAgentSidecarFiles } = require('../../../lib/agent/installer'); + + // Get agent sidecar folder from core config + const coreConfigPath = path.join(bmadDir, 'bmb', 'config.yaml'); + let agentSidecarFolder = '{project-root}/.myagent-data'; + + if (await fs.pathExists(coreConfigPath)) { + const yamlLib = require('yaml'); + const coreConfigContent = await fs.readFile(coreConfigPath, 'utf8'); + const coreConfig = yamlLib.parse(coreConfigContent); + agentSidecarFolder = coreConfig.agent_sidecar_folder || agentSidecarFolder; + } + + // Resolve path variables + const resolvedSidecarFolder = agentSidecarFolder + .replaceAll('{project-root}', projectDir) + .replaceAll('{bmad_folder}', this.bmadFolderName || 'bmad'); + + // Create sidecar directory for this agent + const agentSidecarDir = path.join(resolvedSidecarFolder, agentName); + await fs.ensureDir(agentSidecarDir); + + // Find and copy sidecar folder from source module + const sourceModulePath = getSourcePath(`modules/${moduleName}`); + const sourceAgentPath = path.join(sourceModulePath, 'agents'); + + // Copy sidecar files + const sidecarFiles = copyAgentSidecarFiles(sourceAgentPath, agentSidecarDir, yamlPath); + + console.log(chalk.dim(` Copied sidecar to: ${agentSidecarDir}`)); + } + // Remove the source YAML file - we can regenerate from installer source if needed await fs.remove(yamlPath); - console.log(chalk.dim(` Built agent: ${agentName}.md`)); + console.log(chalk.dim(` Built agent: ${agentName}.md${hasSidecar ? ' (with sidecar)' : ''}`)); } // Handle legacy .md agents - inject activation if needed else if (agentFile.endsWith('.md')) { @@ -1731,6 +1799,21 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: // DO NOT replace {project-root} - LLMs understand this placeholder at runtime // const processedContent = xmlContent.replaceAll('{project-root}', projectDir); + // Replace {agent_sidecar_folder} if configured + const coreConfigPath = path.join(bmadDir, 'bmb', 'config.yaml'); + let agentSidecarFolder = null; + + if (await fs.pathExists(coreConfigPath)) { + const yamlLib = require('yaml'); + const coreConfigContent = await fs.readFile(coreConfigPath, 'utf8'); + const coreConfig = yamlLib.parse(coreConfigContent); + agentSidecarFolder = coreConfig.agent_sidecar_folder; + } + + if (agentSidecarFolder && xmlContent.includes('{agent_sidecar_folder}')) { + xmlContent = xmlContent.replaceAll('{agent_sidecar_folder}', agentSidecarFolder); + } + // Process TTS injection points (pass targetPath for tracking) xmlContent = this.processTTSInjectionPoints(xmlContent, targetMdPath); @@ -2532,6 +2615,7 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: agentConfig.defaults || {}, finalAgentName, relativePath, + { config: config.coreConfig }, ); // Write compiled agent @@ -2547,10 +2631,22 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: await fs.copy(agent.yamlFile, backupYamlPath); } - // Copy sidecar files if expert agent - if (agent.hasSidecar && agent.type === 'expert') { - const { copySidecarFiles } = require('../../../lib/agent/installer'); - copySidecarFiles(agent.path, agentTargetDir, agent.yamlFile); + // Copy sidecar files for agents with hasSidecar flag + if (agentConfig.hasSidecar === true && agent.type === 'expert') { + const { copyAgentSidecarFiles } = require('../../../lib/agent/installer'); + + // Get agent sidecar folder from config or use default + const agentSidecarFolder = config.coreConfig?.agent_sidecar_folder || '{project-root}/.myagent-data'; + + // Resolve path variables + const resolvedSidecarFolder = agentSidecarFolder.replaceAll('{project-root}', projectDir).replaceAll('{bmad_folder}', bmadDir); + + // Create sidecar directory for this agent + const agentSidecarDir = path.join(resolvedSidecarFolder, finalAgentName); + await fs.ensureDir(agentSidecarDir); + + // Find and copy sidecar folder + const sidecarFiles = copyAgentSidecarFiles(agent.path, agentSidecarDir, agent.yamlFile); } // Update manifest CSV diff --git a/tools/cli/installers/lib/core/post-install-sidecar-replacement.js b/tools/cli/installers/lib/core/post-install-sidecar-replacement.js new file mode 100644 index 00000000..66e8727e --- /dev/null +++ b/tools/cli/installers/lib/core/post-install-sidecar-replacement.js @@ -0,0 +1,79 @@ +/** + * Post-installation sidecar folder replacement utility + * Replaces {agent_sidecar_folder} placeholders in all installed agents + */ + +const fs = require('fs-extra'); +const path = require('node:path'); +const yaml = require('yaml'); +const glob = require('glob'); +const chalk = require('chalk'); + +/** + * Replace {agent_sidecar_folder} placeholders in all agent files + * @param {string} bmadDir - Path to .bmad directory + * @returns {Object} Statistics about replacements made + */ +async function replaceAgentSidecarFolders(bmadDir) { + const results = { + filesScanned: 0, + filesReplaced: 0, + totalReplacements: 0, + errors: [], + }; + + try { + // Load core config to get agent_sidecar_folder value + const coreConfigPath = path.join(bmadDir, 'bmb', 'config.yaml'); + + if (!(await fs.pathExists(coreConfigPath))) { + throw new Error(`Core config not found at ${coreConfigPath}`); + } + + const coreConfigContent = await fs.readFile(coreConfigPath, 'utf8'); + const coreConfig = yaml.parse(coreConfigContent); + const agentSidecarFolder = coreConfig.agent_sidecar_folder || '{project-root}/.myagent-data'; + + // Use the literal value from config, don't resolve the placeholders + console.log(chalk.dim(`\n Replacing {agent_sidecar_folder} with: ${agentSidecarFolder}`)); + + // Find all agent .md files + const agentPattern = path.join(bmadDir, '**/*.md'); + const agentFiles = glob.sync(agentPattern); + + for (const agentFile of agentFiles) { + results.filesScanned++; + + try { + let content = await fs.readFile(agentFile, 'utf8'); + + // Check if file contains {agent_sidecar_folder} + if (content.includes('{agent_sidecar_folder}')) { + // Replace all occurrences + const originalContent = content; + content = content.replaceAll('{agent_sidecar_folder}', agentSidecarFolder); + + // Only write if content changed + if (content !== originalContent) { + await fs.writeFile(agentFile, content, 'utf8'); + + const replacementCount = (originalContent.match(/{agent_sidecar_folder}/g) || []).length; + results.filesReplaced++; + results.totalReplacements += replacementCount; + + console.log(chalk.dim(` ✓ Replaced ${replacementCount} occurrence(s) in ${path.relative(bmadDir, agentFile)}`)); + } + } + } catch (error) { + results.errors.push(`Error processing ${agentFile}: ${error.message}`); + } + } + + return results; + } catch (error) { + results.errors.push(`Fatal error: ${error.message}`); + return results; + } +} + +module.exports = { replaceAgentSidecarFolders }; diff --git a/tools/cli/installers/lib/ide/shared/agent-command-generator.js b/tools/cli/installers/lib/ide/shared/agent-command-generator.js index d296c4ea..10c4e34f 100644 --- a/tools/cli/installers/lib/ide/shared/agent-command-generator.js +++ b/tools/cli/installers/lib/ide/shared/agent-command-generator.js @@ -28,11 +28,13 @@ class AgentCommandGenerator { for (const agent of agents) { const launcherContent = await this.generateLauncherContent(agent); + // Use relativePath if available (for nested agents), otherwise just name with .md + const agentPathInModule = agent.relativePath || `${agent.name}.md`; artifacts.push({ type: 'agent-launcher', module: agent.module, name: agent.name, - relativePath: path.join(agent.module, 'agents', `${agent.name}.md`), + relativePath: path.join(agent.module, 'agents', agentPathInModule), content: launcherContent, sourcePath: agent.path, }); @@ -56,9 +58,12 @@ class AgentCommandGenerator { const template = await fs.readFile(this.templatePath, 'utf8'); // Replace template variables + // Use relativePath if available (for nested agents), otherwise just name with .md + const agentPathInModule = agent.relativePath || `${agent.name}.md`; return template .replaceAll('{{name}}', agent.name) .replaceAll('{{module}}', agent.module) + .replaceAll('{{path}}', agentPathInModule) .replaceAll('{{description}}', agent.description || `${agent.name} agent`) .replaceAll('{bmad_folder}', this.bmadFolderName) .replaceAll('{*bmad_folder*}', '{bmad_folder}'); diff --git a/tools/cli/installers/lib/ide/shared/bmad-artifacts.js b/tools/cli/installers/lib/ide/shared/bmad-artifacts.js index 7db470f9..eb190589 100644 --- a/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +++ b/tools/cli/installers/lib/ide/shared/bmad-artifacts.js @@ -76,7 +76,7 @@ async function getTasksFromBmad(bmadDir, selectedModules = []) { return tasks; } -async function getAgentsFromDir(dirPath, moduleName) { +async function getAgentsFromDir(dirPath, moduleName, relativePath = '') { const agents = []; if (!(await fs.pathExists(dirPath))) { @@ -87,10 +87,11 @@ async function getAgentsFromDir(dirPath, moduleName) { for (const entry of entries) { const fullPath = path.join(dirPath, entry.name); + const newRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name; if (entry.isDirectory()) { // Recurse into subdirectories - const subDirAgents = await getAgentsFromDir(fullPath, moduleName); + const subDirAgents = await getAgentsFromDir(fullPath, moduleName, newRelativePath); agents.push(...subDirAgents); } else if (entry.name.endsWith('.md')) { // Skip README files and other non-agent files @@ -117,6 +118,7 @@ async function getAgentsFromDir(dirPath, moduleName) { path: fullPath, name: entry.name.replace('.md', ''), module: moduleName, + relativePath: newRelativePath, // Keep the .md extension for the full path }); } } diff --git a/tools/cli/installers/lib/ide/templates/agent-command-template.md b/tools/cli/installers/lib/ide/templates/agent-command-template.md index 184afb7a..4f895542 100644 --- a/tools/cli/installers/lib/ide/templates/agent-command-template.md +++ b/tools/cli/installers/lib/ide/templates/agent-command-template.md @@ -6,7 +6,7 @@ description: '{{description}}' You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command. -1. LOAD the FULL agent file from @{bmad_folder}/{{module}}/agents/{{name}}.md +1. LOAD the FULL agent file from @{bmad_folder}/{{module}}/agents/{{path}} 2. READ its entire contents - this contains the complete agent persona, menu, and instructions 3. Execute ALL activation steps exactly as written in the agent file 4. Follow the agent's persona and menu system precisely diff --git a/tools/cli/installers/lib/modules/manager.js b/tools/cli/installers/lib/modules/manager.js index 32461a3b..70e07f6a 100644 --- a/tools/cli/installers/lib/modules/manager.js +++ b/tools/cli/installers/lib/modules/manager.js @@ -484,6 +484,16 @@ class ModuleManager { continue; } + // Skip sidecar directories - they are handled separately during agent compilation + if ( + path + .dirname(file) + .split('/') + .some((dir) => dir.toLowerCase().includes('sidecar')) + ) { + continue; + } + // Skip _module-installer directory - it's only needed at install time if (file.startsWith('_module-installer/')) { continue; @@ -697,13 +707,58 @@ class ModuleManager { customizedFields = customizeData.customized_fields || []; } + // Load core config to get agent_sidecar_folder + const coreConfigPath = path.join(bmadDir, 'bmb', 'config.yaml'); + let coreConfig = {}; + + if (await fs.pathExists(coreConfigPath)) { + const yamlLib = require('yaml'); + const coreConfigContent = await fs.readFile(coreConfigPath, 'utf8'); + coreConfig = yamlLib.parse(coreConfigContent); + } + + // Check if agent has sidecar + let hasSidecar = false; + try { + const yamlLib = require('yaml'); + const agentYaml = yamlLib.parse(yamlContent); + hasSidecar = agentYaml?.agent?.metadata?.hasSidecar === true; + } catch { + // Continue without sidecar processing + } + // Compile with customizations if any - const { xml } = compileAgent(yamlContent, customizedFields, agentName, relativePath); + const { xml } = compileAgent(yamlContent, {}, agentName, relativePath, { config: coreConfig }); // Write the compiled MD file await fs.writeFile(targetMdPath, xml, 'utf8'); - console.log(chalk.dim(` Compiled agent: ${agentName} -> ${path.relative(targetPath, targetMdPath)}`)); + // Copy sidecar files if agent has hasSidecar flag + if (hasSidecar) { + const { copyAgentSidecarFiles } = require('../../../lib/agent/installer'); + + // Get agent sidecar folder from core config or use default + const agentSidecarFolder = coreConfig.agent_sidecar_folder || '{project-root}/.myagent-data'; + + // Resolve path variables + const projectDir = path.dirname(bmadDir); + const resolvedSidecarFolder = agentSidecarFolder + .replaceAll('{project-root}', projectDir) + .replaceAll('{bmad_folder}', path.basename(bmadDir)); + + // Create sidecar directory for this agent + const agentSidecarDir = path.join(resolvedSidecarFolder, agentName); + await fs.ensureDir(agentSidecarDir); + + // Copy sidecar files + const sidecarFiles = copyAgentSidecarFiles(path.dirname(sourceYamlPath), agentSidecarDir, sourceYamlPath); + + console.log(chalk.dim(` Copied sidecar to: ${agentSidecarDir}`)); + } + + console.log( + chalk.dim(` Compiled agent: ${agentName} -> ${path.relative(targetPath, targetMdPath)}${hasSidecar ? ' (with sidecar)' : ''}`), + ); } catch (error) { console.warn(chalk.yellow(` Failed to compile agent ${agentName}:`, error.message)); } diff --git a/tools/cli/lib/agent/compiler.js b/tools/cli/lib/agent/compiler.js index 3df6845b..8f904bde 100644 --- a/tools/cli/lib/agent/compiler.js +++ b/tools/cli/lib/agent/compiler.js @@ -438,9 +438,10 @@ function compileToXml(agentYaml, agentName = '', targetPath = '') { * @param {Object} answers - Answers from install_config questions (or defaults) * @param {string} agentName - Optional final agent name (user's custom persona name) * @param {string} targetPath - Optional target path for agent ID + * @param {Object} options - Additional options including config * @returns {Object} { xml: string, metadata: Object } */ -function compileAgent(yamlContent, answers = {}, agentName = '', targetPath = '') { +function compileAgent(yamlContent, answers = {}, agentName = '', targetPath = '', options = {}) { // Parse YAML const agentYaml = yaml.parse(yamlContent); @@ -466,14 +467,22 @@ function compileAgent(yamlContent, answers = {}, agentName = '', targetPath = '' finalAnswers = { ...defaults, ...answers }; } + // Add agent_sidecar_folder to answers if provided in config + if (options.config && options.config.agent_sidecar_folder) { + finalAnswers.agent_sidecar_folder = options.config.agent_sidecar_folder; + } + // Process templates with answers const processedYaml = processAgentYaml(agentYaml, finalAnswers); // Strip install_config from output const cleanYaml = stripInstallConfig(processedYaml); - // Compile to XML - const xml = compileToXml(cleanYaml, agentName, targetPath); + // Replace {agent_sidecar_folder} in XML content + let xml = compileToXml(cleanYaml, agentName, targetPath); + if (finalAnswers.agent_sidecar_folder) { + xml = xml.replaceAll('{agent_sidecar_folder}', finalAnswers.agent_sidecar_folder); + } return { xml, diff --git a/tools/cli/lib/agent/installer.js b/tools/cli/lib/agent/installer.js index c95087af..9f11b588 100644 --- a/tools/cli/lib/agent/installer.js +++ b/tools/cli/lib/agent/installer.js @@ -93,7 +93,6 @@ function discoverAgents(searchPath) { name: agentName, path: fullPath, yamlFile: agentYamlPath, - hasSidecar: true, relativePath: agentRelativePath, }); } @@ -127,12 +126,15 @@ function loadAgentConfig(yamlPath) { // These take precedence over defaults const savedAnswers = agentYaml?.saved_answers || {}; + const metadata = agentYaml?.agent?.metadata || {}; + return { yamlContent: content, agentYaml, installConfig, defaults: { ...defaults, ...savedAnswers }, // saved_answers override defaults - metadata: agentYaml?.agent?.metadata || {}, + metadata, + hasSidecar: metadata.hasSidecar === true, }; } @@ -232,9 +234,10 @@ async function promptInstallQuestions(installConfig, defaults, presetAnswers = { * @param {Object} agentInfo - Agent discovery info * @param {Object} answers - User answers for install_config * @param {string} targetPath - Target installation directory + * @param {Object} options - Additional options including config * @returns {Object} Installation result */ -function installAgent(agentInfo, answers, targetPath) { +function installAgent(agentInfo, answers, targetPath, options = {}) { // Compile the agent const { xml, metadata, processedYaml } = compileAgent(fs.readFileSync(agentInfo.yamlFile, 'utf8'), answers); @@ -261,11 +264,27 @@ function installAgent(agentInfo, answers, targetPath) { sidecarCopied: false, }; - // Copy sidecar files for expert agents - if (agentInfo.hasSidecar && agentInfo.type === 'expert') { - const sidecarFiles = copySidecarFiles(agentInfo.path, agentTargetDir, agentInfo.yamlFile); + // Handle sidecar files for agents with hasSidecar flag + if (agentInfo.hasSidecar === true && agentInfo.type === 'expert') { + // Get agent sidecar folder from config or use default + const agentSidecarFolder = options.config?.agent_sidecar_folder || '{project-root}/.myagent-data'; + + // Resolve path variables + const resolvedSidecarFolder = agentSidecarFolder + .replaceAll('{project-root}', options.projectRoot || process.cwd()) + .replaceAll('{bmad_folder}', options.bmadFolder || '.bmad'); + + // Create sidecar directory for this agent + const agentSidecarDir = path.join(resolvedSidecarFolder, agentFolderName); + if (!fs.existsSync(agentSidecarDir)) { + fs.mkdirSync(agentSidecarDir, { recursive: true }); + } + + // Find and copy sidecar folder + const sidecarFiles = copyAgentSidecarFiles(agentInfo.path, agentSidecarDir, agentInfo.yamlFile); result.sidecarCopied = true; result.sidecarFiles = sidecarFiles; + result.sidecarDir = agentSidecarDir; } return result; @@ -309,6 +328,50 @@ function copySidecarFiles(sourceDir, targetDir, excludeYaml) { return copied; } +/** + * Find and copy agent sidecar folders + * @param {string} sourceDir - Source agent directory + * @param {string} targetSidecarDir - Target sidecar directory for the agent + * @param {string} excludeYaml - The .agent.yaml file to exclude + * @returns {Array} List of copied files + */ +function copyAgentSidecarFiles(sourceDir, targetSidecarDir, excludeYaml) { + const copied = []; + + // Find folders with "sidecar" in the name + const entries = fs.readdirSync(sourceDir, { withFileTypes: true }); + + for (const entry of entries) { + if (entry.isDirectory() && entry.name.toLowerCase().includes('sidecar')) { + const sidecarSourcePath = path.join(sourceDir, entry.name); + + // Recursively copy the sidecar folder contents + function copySidecarDir(src, dest) { + if (!fs.existsSync(dest)) { + fs.mkdirSync(dest, { recursive: true }); + } + + const sidecarEntries = fs.readdirSync(src, { withFileTypes: true }); + for (const sidecarEntry of sidecarEntries) { + const srcPath = path.join(src, sidecarEntry.name); + const destPath = path.join(dest, sidecarEntry.name); + + if (sidecarEntry.isDirectory()) { + copySidecarDir(srcPath, destPath); + } else { + fs.copyFileSync(srcPath, destPath); + copied.push(destPath); + } + } + } + + copySidecarDir(sidecarSourcePath, targetSidecarDir); + } + } + + return copied; +} + /** * Update agent metadata ID to reflect installed location * @param {string} compiledContent - Compiled XML content @@ -745,6 +808,7 @@ module.exports = { promptInstallQuestions, installAgent, copySidecarFiles, + copyAgentSidecarFiles, updateAgentId, detectBmadProject, addToManifest, From 6d98864ec1b5614e4af3819486556773b6ec4e21 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 6 Dec 2025 21:17:13 -0600 Subject: [PATCH 13/26] sidecar files retained on updates --- tools/cli/installers/lib/core/installer.js | 19 ++++++++--- tools/cli/installers/lib/modules/manager.js | 12 +++++-- tools/cli/lib/agent/installer.js | 36 ++++++++++++++------- 3 files changed, 47 insertions(+), 20 deletions(-) diff --git a/tools/cli/installers/lib/core/installer.js b/tools/cli/installers/lib/core/installer.js index 4512cd6d..5d3b0033 100644 --- a/tools/cli/installers/lib/core/installer.js +++ b/tools/cli/installers/lib/core/installer.js @@ -1599,10 +1599,15 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: const sourceModulePath = getSourcePath(`modules/${moduleName}`); const sourceAgentPath = path.join(sourceModulePath, 'agents'); - // Copy sidecar files - const sidecarFiles = copyAgentSidecarFiles(sourceAgentPath, agentSidecarDir, yamlPath); + // Copy sidecar files (preserve existing, add new) + const sidecarResult = copyAgentSidecarFiles(sourceAgentPath, agentSidecarDir, yamlPath); - console.log(chalk.dim(` Copied sidecar to: ${agentSidecarDir}`)); + if (sidecarResult.copied.length > 0) { + console.log(chalk.dim(` Copied ${sidecarResult.copied.length} new sidecar file(s) to: ${agentSidecarDir}`)); + } + if (sidecarResult.preserved.length > 0) { + console.log(chalk.dim(` Preserved ${sidecarResult.preserved.length} existing sidecar file(s)`)); + } } // Remove the source YAML file - we can regenerate from installer source if needed @@ -2645,8 +2650,12 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: const agentSidecarDir = path.join(resolvedSidecarFolder, finalAgentName); await fs.ensureDir(agentSidecarDir); - // Find and copy sidecar folder - const sidecarFiles = copyAgentSidecarFiles(agent.path, agentSidecarDir, agent.yamlFile); + // Copy sidecar files (preserve existing, add new) + const sidecarResult = copyAgentSidecarFiles(agent.path, agentSidecarDir, agent.yamlFile); + + if (sidecarResult.copied.length > 0 || sidecarResult.preserved.length > 0) { + console.log(chalk.dim(` Sidecar: ${sidecarResult.copied.length} new, ${sidecarResult.preserved.length} preserved`)); + } } // Update manifest CSV diff --git a/tools/cli/installers/lib/modules/manager.js b/tools/cli/installers/lib/modules/manager.js index 70e07f6a..b9252370 100644 --- a/tools/cli/installers/lib/modules/manager.js +++ b/tools/cli/installers/lib/modules/manager.js @@ -750,10 +750,16 @@ class ModuleManager { const agentSidecarDir = path.join(resolvedSidecarFolder, agentName); await fs.ensureDir(agentSidecarDir); - // Copy sidecar files - const sidecarFiles = copyAgentSidecarFiles(path.dirname(sourceYamlPath), agentSidecarDir, sourceYamlPath); + // Copy sidecar files (preserve existing, add new) + const sidecarResult = copyAgentSidecarFiles(path.dirname(sourceYamlPath), agentSidecarDir, sourceYamlPath); + const totalFiles = sidecarResult.copied.length + sidecarResult.preserved.length; - console.log(chalk.dim(` Copied sidecar to: ${agentSidecarDir}`)); + if (sidecarResult.copied.length > 0) { + console.log(chalk.dim(` Copied ${sidecarResult.copied.length} new sidecar file(s) to: ${agentSidecarDir}`)); + } + if (sidecarResult.preserved.length > 0) { + console.log(chalk.dim(` Preserved ${sidecarResult.preserved.length} existing sidecar file(s)`)); + } } console.log( diff --git a/tools/cli/lib/agent/installer.js b/tools/cli/lib/agent/installer.js index 9f11b588..d79abd23 100644 --- a/tools/cli/lib/agent/installer.js +++ b/tools/cli/lib/agent/installer.js @@ -337,6 +337,7 @@ function copySidecarFiles(sourceDir, targetDir, excludeYaml) { */ function copyAgentSidecarFiles(sourceDir, targetSidecarDir, excludeYaml) { const copied = []; + const preserved = []; // Find folders with "sidecar" in the name const entries = fs.readdirSync(sourceDir, { withFileTypes: true }); @@ -345,31 +346,42 @@ function copyAgentSidecarFiles(sourceDir, targetSidecarDir, excludeYaml) { if (entry.isDirectory() && entry.name.toLowerCase().includes('sidecar')) { const sidecarSourcePath = path.join(sourceDir, entry.name); - // Recursively copy the sidecar folder contents - function copySidecarDir(src, dest) { + // Recursively sync the sidecar folder contents (preserve existing, add new) + function syncSidecarDir(src, dest) { if (!fs.existsSync(dest)) { fs.mkdirSync(dest, { recursive: true }); } - const sidecarEntries = fs.readdirSync(src, { withFileTypes: true }); - for (const sidecarEntry of sidecarEntries) { - const srcPath = path.join(src, sidecarEntry.name); - const destPath = path.join(dest, sidecarEntry.name); + // Get all files in source + const sourceEntries = fs.readdirSync(src, { withFileTypes: true }); - if (sidecarEntry.isDirectory()) { - copySidecarDir(srcPath, destPath); + for (const sourceEntry of sourceEntries) { + const srcPath = path.join(src, sourceEntry.name); + const destPath = path.join(dest, sourceEntry.name); + + if (sourceEntry.isDirectory()) { + // Recursively sync subdirectories + syncSidecarDir(srcPath, destPath); } else { - fs.copyFileSync(srcPath, destPath); - copied.push(destPath); + // Check if file already exists in destination + if (fs.existsSync(destPath)) { + // File exists - preserve it + preserved.push(destPath); + } else { + // File doesn't exist - copy it + fs.copyFileSync(srcPath, destPath); + copied.push(destPath); + } } } } - copySidecarDir(sidecarSourcePath, targetSidecarDir); + syncSidecarDir(sidecarSourcePath, targetSidecarDir); } } - return copied; + // Return info about what was preserved and what was copied + return { copied, preserved }; } /** From 8c04ccf3f0839ac39520466b2b4e8183dd6ddb68 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 6 Dec 2025 21:21:03 -0600 Subject: [PATCH 14/26] rename default folder location for agent_sidecar_folder installation location --- bmad/bmm/docs/troubleshooting.md | 680 ------------------ bmad/bmm/tasks/daily-standup.xml | 85 --- .../_module-installer/install-config.yaml | 4 +- 3 files changed, 2 insertions(+), 767 deletions(-) delete mode 100644 bmad/bmm/docs/troubleshooting.md delete mode 100644 bmad/bmm/tasks/daily-standup.xml diff --git a/bmad/bmm/docs/troubleshooting.md b/bmad/bmm/docs/troubleshooting.md deleted file mode 100644 index c48d72c0..00000000 --- a/bmad/bmm/docs/troubleshooting.md +++ /dev/null @@ -1,680 +0,0 @@ -# BMM Troubleshooting Guide - -Common issues and solutions for the BMad Method Module. - ---- - -## Quick Diagnosis - -**Use this flowchart to find your issue:** - -```mermaid -flowchart TD - START{What's the problem?} - - START -->|Can't get started| SETUP[Setup & Installation Issues] - START -->|Wrong level detected| LEVEL[Level Detection Problems] - START -->|Workflow not working| WORKFLOW[Workflow Issues] - START -->|Agent lacks context| CONTEXT[Context & Documentation Issues] - START -->|Implementation problems| IMPL[Implementation Issues] - START -->|Files/paths wrong| FILES[File & Path Issues] - - style START fill:#ffb,stroke:#333,stroke-width:2px - style SETUP fill:#bfb,stroke:#333,stroke-width:2px - style LEVEL fill:#bbf,stroke:#333,stroke-width:2px - style WORKFLOW fill:#fbf,stroke:#333,stroke-width:2px - style CONTEXT fill:#f9f,stroke:#333,stroke-width:2px -``` - ---- - -## Table of Contents - -- [Setup & Installation Issues](#setup--installation-issues) -- [Level Detection Problems](#level-detection-problems) -- [Workflow Issues](#workflow-issues) -- [Context & Documentation Issues](#context--documentation-issues) -- [Implementation Issues](#implementation-issues) -- [File & Path Issues](#file--path-issues) -- [Agent Behavior Issues](#agent-behavior-issues) -- [Integration Issues (Brownfield)](#integration-issues-brownfield) - ---- - -## Setup & Installation Issues - -### Problem: BMM not found after installation - -**Symptoms:** - -- `bmad` command not recognized -- Agent files not accessible -- Workflows don't load - -**Solution:** - -```bash -# Check if BMM is installed -ls bmad/ - -# If not present, run installer -npx bmad-method@alpha install - -# For fresh install -npx bmad-method@alpha install --skip-version-prompt -``` - -### Problem: Agents don't have menu - -**Symptoms:** - -- Load agent file but no menu appears -- Agent doesn't respond to commands - -**Solution:** - -1. Ensure you're loading the correct agent file path: `bmad/bmm/agents/[agent-name].md` -2. Wait a few seconds for agent to initialize -3. Try asking "show menu" or "help" -4. Check IDE supports Markdown rendering with context -5. For Claude Code: Ensure agent file is open in chat context - -### Problem: Workflows not found - -**Symptoms:** - -- Agent says workflow doesn't exist -- Menu shows workflow but won't run - -**Solution:** - -1. Check workflow exists: `ls bmad/bmm/workflows/` -2. Verify agent has access to workflow (check agent's workflow list) -3. Try using menu number instead of workflow name -4. Restart chat with agent in fresh session - ---- - -## Level Detection Problems - -### Problem: workflow-init suggests wrong level - -**Symptoms:** - -- Detects Level 3 but you only need Level 1 -- Suggests Level 1 but project is actually Level 2 -- Can't figure out appropriate level - -**Solution:** - -1. **Override the suggestion** - workflow-init always asks for confirmation, just say "no" and choose correct level -2. **Be specific in description** - Use level keywords when describing: - - "fix bug" → Level 0 - - "add small feature" → Level 1 - - "build dashboard" → Level 2 -3. **Manual override** - You can always switch levels later if needed - -**Example:** - -``` -workflow-init: "Level 3 project?" -You: "No, this is just adding OAuth login - Level 1" -workflow-init: "Got it, creating Level 1 workflow" -``` - -### Problem: Project level unclear - -**Symptoms:** - -- Between Level 1 and Level 2 -- Not sure if architecture needed -- Story count uncertain - -**Solution:** -**When in doubt, start smaller:** - -- Choose Level 1 instead of Level 2 -- You can always run `create-prd` later if needed -- Level 1 is faster, less overhead -- Easy to upgrade, hard to downgrade - -**Decision criteria:** - -- Single epic with related stories? → Level 1 -- Multiple independent epics? → Level 2 -- Need product-level planning? → Level 2 -- Just need technical plan? → Level 1 - -### Problem: Old planning docs influencing level detection - -**Symptoms:** - -- Old Level 3 PRD in folder -- Working on new Level 0 bug fix -- workflow-init suggests Level 3 - -**Solution:** -workflow-init asks: "Is this work in progress or previous effort?" - -- Answer: "Previous effort" -- Then describe your NEW work clearly -- System will detect level based on NEW work, not old artifacts - ---- - -## Workflow Issues - -### Problem: Workflow fails or hangs - -**Symptoms:** - -- Workflow starts but doesn't complete -- Agent stops responding mid-workflow -- Progress stalls - -**Solution:** - -1. **Check context limits** - Start fresh chat for complex workflows -2. **Verify prerequisites**: - - Phase 2 needs Phase 1 complete (if used) - - Phase 3 needs Phase 2 complete - - Phase 4 needs Phase 3 complete (if Level 3-4) -3. **Restart workflow** - Load agent in new chat and restart -4. **Check status file** - Verify `bmm-workflow-status.md` or `sprint-status.yaml` is present and valid - -### Problem: Agent says "workflow not found" - -**Symptoms:** - -- Request workflow by name -- Agent doesn't recognize it -- Menu doesn't show workflow - -**Solution:** - -1. Check spelling/format - Use exact workflow name or menu shortcut (`*prd` not `*PRD`) -2. Verify agent has workflow: - - PM agent: prd, tech-spec - - Architect agent: create-architecture, validate-architecture - - SM agent: sprint-planning, create-story, story-context -3. Try menu number instead of name -4. Check you're using correct agent for workflow - -### Problem: Sprint-planning workflow fails - -**Symptoms:** - -- Can't create sprint-status.yaml -- Epics not extracted from files -- Status file empty or incorrect - -**Solution:** - -1. **Verify epic files exist**: - - Level 1: tech-spec with epic - - Level 2-4: epics.md or sharded epic files -2. **Check file format**: - - Epic files should be valid Markdown - - Epic headers should be clear (## Epic Name) -3. **Run in Phase 4 only** - Ensure Phase 2/3 complete first -4. **Check file paths** - Epic files should be in correct output folder - -### Problem: story-context generates empty or wrong context - -**Symptoms:** - -- Context file created but has no useful content -- Context doesn't reference existing code -- Missing technical guidance - -**Solution:** - -1. **Run epic-tech-context first** - story-context builds on epic context -2. **Check story file exists** - Verify story was created by create-story -3. **For brownfield**: - - Ensure document-project was run - - Verify docs/index.md exists with codebase context -4. **Try regenerating** - Sometimes needs fresh attempt with more specific story details - ---- - -## Context & Documentation Issues - -### Problem: AI agents lack codebase understanding (Brownfield) - -**Symptoms:** - -- Suggestions don't align with existing patterns -- Ignores available components -- Proposes approaches that conflict with architecture -- Doesn't reference existing code - -**Solution:** - -1. **Run document-project** - Critical for brownfield projects - ``` - Load Analyst agent → run document-project - Choose scan level: Deep (recommended for PRD prep) - ``` -2. **Verify docs/index.md exists** - This is master entry point for AI agents -3. **Check documentation completeness**: - - Review generated docs/index.md - - Ensure key systems are documented -4. **Run deep-dive on specific areas** if needed - -### Problem: Have documentation but agents can't find it - -**Symptoms:** - -- README.md, ARCHITECTURE.md exist -- AI agents still ask questions answered in docs -- No docs/index.md file - -**Solution:** -**Option 1: Quick fix (2-5min)** -Run `index-docs` task: - -- Located at `bmad/core/tasks/index-docs.xml` -- Scans existing docs and generates index.md -- Lightweight, just creates navigation - -**Option 2: Comprehensive (10-30min)** -Run document-project workflow: - -- Discovers existing docs in Step 2 -- Generates NEW AI-friendly documentation from codebase -- Creates index.md linking to BOTH existing and new docs - -**Why this matters:** AI agents need structured entry point (index.md) to navigate docs efficiently. - -### Problem: document-project takes too long - -**Symptoms:** - -- Exhaustive scan running for hours -- Impatient to start planning - -**Solution:** -**Choose appropriate scan level:** - -- **Quick (2-5min)** - Pattern analysis, no source reading - Good for initial overview -- **Deep (10-30min)** - Reads critical paths - **Recommended for most brownfield projects** -- **Exhaustive (30-120min)** - Reads all files - Only for migration planning or complete understanding - -For most brownfield projects, **Deep scan is sufficient**. - ---- - -## Implementation Issues - -### Problem: Existing tests breaking (Brownfield) - -**Symptoms:** - -- Regression test failures -- Previously working functionality broken -- Integration tests failing - -**Solution:** - -1. **Review changes against existing patterns**: - - Check if new code follows existing conventions - - Verify API contracts unchanged (unless intentionally versioned) -2. **Run test-review workflow** (TEA agent): - - Analyzes test coverage - - Identifies regression risks - - Suggests fixes -3. **Add regression testing to DoD**: - - All existing tests must pass - - Add integration tests for new code -4. **Consider feature flags** for gradual rollout - -### Problem: Story takes much longer than estimated - -**Symptoms:** - -- Story estimated 4 hours, took 12 hours -- Acceptance criteria harder than expected -- Hidden complexity discovered - -**Solution:** -**This is normal!** Estimates are estimates. To handle: - -1. **Continue until DoD met** - Don't compromise quality -2. **Document learnings in retrospective**: - - What caused the overrun? - - What should we watch for next time? -3. **Consider splitting story** if it's truly two stories -4. **Adjust future estimates** based on this data - -**Don't stress about estimate accuracy** - use them for learning, not judgment. - -### Problem: Integration points unclear - -**Symptoms:** - -- Not sure how to connect new code to existing -- Unsure which files to modify -- Multiple possible integration approaches - -**Solution:** - -1. **For brownfield**: - - Ensure document-project captured existing architecture - - Review architecture docs before implementing -2. **Check story-context** - Should document integration points -3. **In tech-spec/architecture** - Explicitly document: - - Which existing modules to modify - - What APIs/services to integrate with - - Data flow between new and existing code -4. **Run integration-planning workflow** (Level 3-4): - - Architect agent creates integration strategy - -### Problem: Inconsistent patterns being introduced - -**Symptoms:** - -- New code style doesn't match existing -- Different architectural approach -- Not following team conventions - -**Solution:** - -1. **Check convention detection** (Quick Spec Flow): - - Should detect existing patterns - - Asks for confirmation before proceeding -2. **Review documentation** - Ensure document-project captured patterns -3. **Use story-context** - Injects pattern guidance per story -4. **Add to code-review checklist**: - - Pattern adherence - - Convention consistency - - Style matching -5. **Run retrospective** to identify pattern deviations early - ---- - -## File & Path Issues - -### Problem: Output files in wrong location - -**Symptoms:** - -- PRD created in wrong folder -- Story files not where expected -- Documentation scattered - -**Solution:** -Check `bmad/bmm/config.yaml` for configured paths: - -```yaml -output_folder: '{project-root}/docs' -dev_story_location: '{project-root}/docs/stories' -``` - -Default locations: - -- Planning docs (PRD, epics, architecture): `{output_folder}/` -- Stories: `{dev_story_location}/` -- Status files: `{output_folder}/bmm-workflow-status.md`, `{output_folder}/sprint-status.yaml` - -To change locations, edit config.yaml then re-run workflows. - -### Problem: Can't find status file - -**Symptoms:** - -- workflow-status says no status file -- Can't track progress -- Lost place in workflow - -**Solution:** - -1. **Check default location**: `docs/bmm-workflow-status.md` -2. **If missing, reinitialize**: - ``` - Load Analyst agent → run workflow-init - ``` -3. **For Phase 4**: Look for `sprint-status.yaml` in same folder as PRD -4. **Search for it**: - ```bash - find . -name "bmm-workflow-status.md" - find . -name "sprint-status.yaml" - ``` - -### Problem: Sprint-status.yaml not updating - -**Symptoms:** - -- Workflows complete but status unchanged -- Stories stuck in old status -- Epic status not progressing - -**Solution:** - -1. **Manual update required** - Most status changes are manual: - ```yaml - stories: - - id: epic-1-story-1 - status: done # Change this manually - ``` -2. **Some workflows auto-update**: - - sprint-planning creates file - - epic-tech-context changes epic to "contexted" - - create-story changes story to "drafted" - - story-context changes to "ready-for-dev" - - dev-story may auto-update (check workflow) -3. **Re-run sprint-planning** to resync if needed - ---- - -## Agent Behavior Issues - -### Problem: Agent provides vague or generic responses - -**Symptoms:** - -- "Use appropriate framework" -- "Follow best practices" -- Generic advice without specifics - -**Solution:** - -1. **Provide more context** - Be specific in your description: - - "Add OAuth using passport.js to Express server" - - Not: "Add authentication" -2. **For brownfield**: - - Ensure document-project was run - - Agent needs codebase context for specific advice -3. **Reference existing docs**: - - "Based on the existing auth system in UserService..." -4. **Start fresh chat** - Context overload can cause generic responses - -### Problem: Agent hallucinating or making up information - -**Symptoms:** - -- References files that don't exist -- Suggests APIs that aren't in your stack -- Creates imaginary requirements - -**Solution:** - -1. **Use fresh chat** - Context overflow main cause of hallucinations -2. **Provide concrete constraints**: - - "We use Express 4.18.2, not Next.js" - - "Our database is PostgreSQL, not MongoDB" -3. **For brownfield**: - - Document-project provides factual grounding - - Agent sees actual code, not assumptions -4. **Correct immediately**: - - "No, we don't have UserService, we have AuthenticationModule" - -### Problem: Agent won't follow instructions - -**Symptoms:** - -- Ignores specific requests -- Does something different than asked -- Doesn't respect constraints - -**Solution:** - -1. **Be more explicit** - Agents respond to clear, specific instructions: - - "Use EXACTLY these three steps..." - - "Do NOT include database migrations in this story" -2. **Check agent capabilities** - Agent might not have access to requested workflow -3. **Try different phrasing** - Rephrase request to be more direct -4. **Use menu system** - Numbers are clearer than text commands - ---- - -## Integration Issues (Brownfield) - -### Problem: New code conflicts with existing architecture - -**Symptoms:** - -- Integration approach doesn't fit existing structure -- Would require major refactoring -- Conflicts with established patterns - -**Solution:** - -1. **Check if document-project was run** - Agents need architecture context -2. **Review existing architecture docs**: - - Read docs/architecture.md (from document-project) - - Understand current system design -3. **For Level 3-4**: - - Run validate-architecture workflow before planning - - Use integration-planning workflow -4. **Explicitly document integration strategy** in architecture: - - How new components fit existing structure - - What modifications needed to existing code - - Migration path if changing patterns - -### Problem: Breaking changes to existing APIs - -**Symptoms:** - -- Changing API breaks consumers -- Downstream services affected -- Need backward compatibility - -**Solution:** - -1. **Identify all API consumers** (document-project should show this) -2. **Plan versioning strategy**: - - API v1 (existing) + v2 (new) - - Deprecation timeline -3. **Use feature flags** for gradual rollout -4. **Document migration guide** for API consumers -5. **Add to testing strategy**: - - Existing consumers still work (v1) - - New functionality works (v2) - -### Problem: Data migration required - -**Symptoms:** - -- Schema changes needed -- Existing data needs transformation -- Risk of data loss - -**Solution:** - -1. **Create explicit migration strategy** in architecture: - - Forward migration (old → new schema) - - Rollback plan (new → old schema) - - Data validation approach -2. **Test migrations thoroughly**: - - On copy of production data - - Measure performance impact -3. **Plan rollout**: - - Staging environment first - - Gradual production rollout - - Monitoring for issues -4. **Document in tech-spec/architecture**: - - Migration scripts - - Rollback procedures - - Expected downtime - ---- - -## Still Stuck? - -### Getting More Help - -If your issue isn't covered here: - -1. **Check other documentation**: - - [FAQ](./faq.md) - Common questions - - [Glossary](./glossary.md) - Terminology - - [Quick Start](./quick-start.md) - Basic usage - - [Brownfield Guide](./brownfield-guide.md) - Existing codebases - - [Scale Adaptive System](./scale-adaptive-system.md) - Understanding levels - -2. **Community support**: - - [Discord](https://discord.gg/gk8jAdXWmj) - #general-dev, #bugs-issues - - Active community, fast responses - - Share your specific situation - -3. **Report bugs**: - - [GitHub Issues](https://github.com/bmad-code-org/BMAD-METHOD/issues) - - Include version, steps to reproduce, expected vs actual behavior - -4. **Video tutorials**: - - [YouTube Channel](https://www.youtube.com/@BMadCode) - - Visual walkthroughs of common workflows - ---- - -## Common Error Messages - -### "No workflow status file found" - -**Cause:** Haven't run workflow-init yet -**Fix:** Load Analyst agent → run workflow-init - -### "Epic file not found" - -**Cause:** PRD/epics not created, or wrong path -**Fix:** Verify PRD/epics exist in output folder, check config.yaml paths - -### "Story not in sprint-status.yaml" - -**Cause:** Sprint-planning not run, or story file not created -**Fix:** Run sprint-planning workflow, verify story files exist - -### "Documentation insufficient for brownfield" - -**Cause:** No docs/index.md or document-project not run -**Fix:** Run document-project workflow with Deep scan - -### "Level detection failed" - -**Cause:** Ambiguous project description -**Fix:** Be more specific, use level keywords (fix, feature, platform, etc.) - -### "Context generation failed" - -**Cause:** Missing prerequisites (epic context, story file, or docs) -**Fix:** Verify epic-tech-context run, story file exists, docs present - ---- - -## Prevention Tips - -**Avoid common issues before they happen:** - -1. ✅ **Always run document-project for brownfield** - Saves hours of context issues later -2. ✅ **Use fresh chats for complex workflows** - Prevents hallucinations and context overflow -3. ✅ **Verify files exist before running workflows** - Check PRD, epics, stories are present -4. ✅ **Read agent menu before requesting workflows** - Confirm agent has the workflow -5. ✅ **Start with smaller level if unsure** - Easy to upgrade (Level 1 → 2), hard to downgrade -6. ✅ **Keep status files updated** - Manual updates when needed, don't let them drift -7. ✅ **Run retrospectives after epics** - Catch issues early, improve next epic -8. ✅ **Follow phase sequence** - Don't skip required phases (Phase 2 before 3, 3 before 4) - ---- - -**Issue not listed?** Please [report it](https://github.com/bmad-code-org/BMAD-METHOD/issues) so we can add it to this guide! diff --git a/bmad/bmm/tasks/daily-standup.xml b/bmad/bmm/tasks/daily-standup.xml deleted file mode 100644 index d41c362c..00000000 --- a/bmad/bmm/tasks/daily-standup.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - MANDATORY: Execute ALL steps in the flow section IN EXACT ORDER - DO NOT skip steps or change the sequence - HALT immediately when halt-conditions are met - Each action tag within a step tag is a REQUIRED action to complete that step - Sections outside flow (validation, output, critical-context) provide essential context - review and apply throughout execution - - - - Check for stories folder at {project-root}{output_folder}/stories/ - Find current story by identifying highest numbered story file - Read story status (In Progress, Ready for Review, etc.) - Extract agent notes from Dev Agent Record, TEA Results, PO Notes sections - Check for next story references from epics - Identify blockers from story sections - - - - - 🏃 DAILY STANDUP - Story-{{number}}: {{title}} - - Current Sprint Status: - - Active Story: story-{{number}} ({{status}} - {{percentage}}% complete) - - Next in Queue: story-{{next-number}}: {{next-title}} - - Blockers: {{blockers-from-story}} - - Team assembled based on story participants: - {{ List Agents from {project-root}/bmad/_cfg/agent-manifest.csv }} - - - - - Each agent provides three items referencing real story data - What I see: Their perspective on current work, citing story sections (1-2 sentences) - What concerns me: Issues from their domain or story blockers (1-2 sentences) - What I suggest: Actionable recommendations for progress (1-2 sentences) - - - - - 📋 STANDUP SUMMARY: - Key Items from Story File: - - {{completion-percentage}}% complete ({{tasks-complete}}/{{total-tasks}} tasks) - - Blocker: {{main-blocker}} - - Next: {{next-story-reference}} - - Action Items: - - {{agent}}: {{action-item}} - - {{agent}}: {{action-item}} - - {{agent}}: {{action-item}} - - Need extended discussion? Use *party-mode for detailed breakout. - - - - - - - Primary: Sarah (PO), Mary (Analyst), Winston (Architect) - Secondary: Murat (TEA), James (Dev) - - - Primary: Sarah (PO), Bob (SM), James (Dev) - Secondary: Murat (TEA) - - - Primary: Winston (Architect), James (Dev), Murat (TEA) - Secondary: Sarah (PO) - - - Primary: James (Dev), Murat (TEA), Winston (Architect) - Secondary: Sarah (PO) - - - - - This task extends party-mode with agile-specific structure - Time-box responses (standup = brief) - Focus on actionable items from real story data when available - End with clear next steps - No deep dives (suggest breakout if needed) - If no stories folder detected, run general standup format - - \ No newline at end of file diff --git a/src/core/_module-installer/install-config.yaml b/src/core/_module-installer/install-config.yaml index 72ceaabc..1099a2e6 100644 --- a/src/core/_module-installer/install-config.yaml +++ b/src/core/_module-installer/install-config.yaml @@ -24,8 +24,8 @@ document_output_language: result: "{value}" agent_sidecar_folder: - prompt: "Where should agent sidecar folders be stored?" - default: ".myagent-data" + prompt: "Where should users agent sidecar memory folders be stored?" + default: ".bmad-user-memory" result: "{project-root}/{value}" output_folder: From 903c7a4133eed13e63539ac0f4ebf39e3ea55c58 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 6 Dec 2025 21:37:43 -0600 Subject: [PATCH 15/26] remove hardcoded agent sidecar locations to fully use config option --- tools/cli/installers/lib/core/installer.js | 5 +++-- .../lib/core/post-install-sidecar-replacement.js | 2 +- tools/cli/installers/lib/modules/manager.js | 14 +++++++++++--- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/tools/cli/installers/lib/core/installer.js b/tools/cli/installers/lib/core/installer.js index 5d3b0033..bb920d71 100644 --- a/tools/cli/installers/lib/core/installer.js +++ b/tools/cli/installers/lib/core/installer.js @@ -447,6 +447,7 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: // Set bmad folder name on module manager and IDE manager for placeholder replacement this.moduleManager.setBmadFolderName(bmadFolderName); + this.moduleManager.setCoreConfig(moduleConfigs.core || {}); this.ideManager.setBmadFolderName(bmadFolderName); // Tool selection will be collected after we determine if it's a reinstall/update/new install @@ -1577,7 +1578,7 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: // Get agent sidecar folder from core config const coreConfigPath = path.join(bmadDir, 'bmb', 'config.yaml'); - let agentSidecarFolder = '{project-root}/.myagent-data'; + let agentSidecarFolder; if (await fs.pathExists(coreConfigPath)) { const yamlLib = require('yaml'); @@ -2641,7 +2642,7 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: const { copyAgentSidecarFiles } = require('../../../lib/agent/installer'); // Get agent sidecar folder from config or use default - const agentSidecarFolder = config.coreConfig?.agent_sidecar_folder || '{project-root}/.myagent-data'; + const agentSidecarFolder = config.coreConfig?.agent_sidecar_folder; // Resolve path variables const resolvedSidecarFolder = agentSidecarFolder.replaceAll('{project-root}', projectDir).replaceAll('{bmad_folder}', bmadDir); diff --git a/tools/cli/installers/lib/core/post-install-sidecar-replacement.js b/tools/cli/installers/lib/core/post-install-sidecar-replacement.js index 66e8727e..da351c50 100644 --- a/tools/cli/installers/lib/core/post-install-sidecar-replacement.js +++ b/tools/cli/installers/lib/core/post-install-sidecar-replacement.js @@ -32,7 +32,7 @@ async function replaceAgentSidecarFolders(bmadDir) { const coreConfigContent = await fs.readFile(coreConfigPath, 'utf8'); const coreConfig = yaml.parse(coreConfigContent); - const agentSidecarFolder = coreConfig.agent_sidecar_folder || '{project-root}/.myagent-data'; + const agentSidecarFolder = coreConfig.agent_sidecar_folder; // Use the literal value from config, don't resolve the placeholders console.log(chalk.dim(`\n Replacing {agent_sidecar_folder} with: ${agentSidecarFolder}`)); diff --git a/tools/cli/installers/lib/modules/manager.js b/tools/cli/installers/lib/modules/manager.js index b9252370..c55f96a2 100644 --- a/tools/cli/installers/lib/modules/manager.js +++ b/tools/cli/installers/lib/modules/manager.js @@ -37,6 +37,14 @@ class ModuleManager { this.bmadFolderName = bmadFolderName; } + /** + * Set the core configuration for access during module installation + * @param {Object} coreConfig - Core configuration object + */ + setCoreConfig(coreConfig) { + this.coreConfig = coreConfig; + } + /** * Copy a file and replace {bmad_folder} placeholder with actual folder name * @param {string} sourcePath - Source file path @@ -728,7 +736,7 @@ class ModuleManager { } // Compile with customizations if any - const { xml } = compileAgent(yamlContent, {}, agentName, relativePath, { config: coreConfig }); + const { xml } = compileAgent(yamlContent, {}, agentName, relativePath, { config: this.coreConfig }); // Write the compiled MD file await fs.writeFile(targetMdPath, xml, 'utf8'); @@ -737,8 +745,8 @@ class ModuleManager { if (hasSidecar) { const { copyAgentSidecarFiles } = require('../../../lib/agent/installer'); - // Get agent sidecar folder from core config or use default - const agentSidecarFolder = coreConfig.agent_sidecar_folder || '{project-root}/.myagent-data'; + // Get agent sidecar folder from core config (should always be set) + const agentSidecarFolder = this.coreConfig?.agent_sidecar_folder; // Resolve path variables const projectDir = path.dirname(bmadDir); From eacfba2e5b4427fa86de9665418caff00624e775 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 6 Dec 2025 22:45:02 -0600 Subject: [PATCH 16/26] custom agents and workflows can now also be installed with a simple custom.yaml designation --- example-custom-content/README.md | 0 .../agents/commit-poet/commit-poet.agent.yaml | 129 +++++++++ .../toolsmith-sidecar/instructions.md | 70 +++++ .../toolsmith-sidecar/knowledge/bundlers.md | 111 ++++++++ .../toolsmith-sidecar/knowledge/deploy.md | 70 +++++ .../toolsmith-sidecar/knowledge/docs.md | 114 ++++++++ .../toolsmith-sidecar/knowledge/installers.md | 134 +++++++++ .../toolsmith-sidecar/knowledge/modules.md | 161 +++++++++++ .../toolsmith-sidecar/knowledge/tests.md | 103 +++++++ .../toolsmith/toolsmith-sidecar/memories.md | 17 ++ .../agents/toolsmith/toolsmith.agent.yaml | 109 +++++++ example-custom-content/custom.yaml | 3 + .../quiz-master/steps/step-01-init.md | 168 +++++++++++ .../workflows/quiz-master/steps/step-02-q1.md | 155 ++++++++++ .../workflows/quiz-master/steps/step-03-q2.md | 89 ++++++ .../workflows/quiz-master/steps/step-04-q3.md | 36 +++ .../workflows/quiz-master/steps/step-05-q4.md | 36 +++ .../workflows/quiz-master/steps/step-06-q5.md | 36 +++ .../workflows/quiz-master/steps/step-07-q6.md | 36 +++ .../workflows/quiz-master/steps/step-08-q7.md | 36 +++ .../workflows/quiz-master/steps/step-09-q8.md | 36 +++ .../workflows/quiz-master/steps/step-10-q9.md | 36 +++ .../quiz-master/steps/step-11-q10.md | 36 +++ .../quiz-master/steps/step-12-results.md | 150 ++++++++++ .../templates/csv-headers.template | 1 + .../quiz-master/workflow-plan-quiz-master.md | 269 ++++++++++++++++++ .../workflows/quiz-master/workflow.md | 54 ++++ .../workflows/wassup/workflow.md | 26 ++ tools/cli/installers/lib/core/installer.js | 132 +++++++++ tools/cli/installers/lib/custom/handler.js | 266 +++++++++++++++++ tools/cli/installers/lib/modules/manager.js | 36 ++- tools/cli/lib/ui.js | 6 +- 32 files changed, 2653 insertions(+), 8 deletions(-) create mode 100644 example-custom-content/README.md create mode 100644 example-custom-content/agents/commit-poet/commit-poet.agent.yaml create mode 100644 example-custom-content/agents/toolsmith/toolsmith-sidecar/instructions.md create mode 100644 example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md create mode 100644 example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md create mode 100644 example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md create mode 100644 example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md create mode 100644 example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md create mode 100644 example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md create mode 100644 example-custom-content/agents/toolsmith/toolsmith-sidecar/memories.md create mode 100644 example-custom-content/agents/toolsmith/toolsmith.agent.yaml create mode 100644 example-custom-content/custom.yaml create mode 100644 example-custom-content/workflows/quiz-master/steps/step-01-init.md create mode 100644 example-custom-content/workflows/quiz-master/steps/step-02-q1.md create mode 100644 example-custom-content/workflows/quiz-master/steps/step-03-q2.md create mode 100644 example-custom-content/workflows/quiz-master/steps/step-04-q3.md create mode 100644 example-custom-content/workflows/quiz-master/steps/step-05-q4.md create mode 100644 example-custom-content/workflows/quiz-master/steps/step-06-q5.md create mode 100644 example-custom-content/workflows/quiz-master/steps/step-07-q6.md create mode 100644 example-custom-content/workflows/quiz-master/steps/step-08-q7.md create mode 100644 example-custom-content/workflows/quiz-master/steps/step-09-q8.md create mode 100644 example-custom-content/workflows/quiz-master/steps/step-10-q9.md create mode 100644 example-custom-content/workflows/quiz-master/steps/step-11-q10.md create mode 100644 example-custom-content/workflows/quiz-master/steps/step-12-results.md create mode 100644 example-custom-content/workflows/quiz-master/templates/csv-headers.template create mode 100644 example-custom-content/workflows/quiz-master/workflow-plan-quiz-master.md create mode 100644 example-custom-content/workflows/quiz-master/workflow.md create mode 100644 example-custom-content/workflows/wassup/workflow.md create mode 100644 tools/cli/installers/lib/custom/handler.js diff --git a/example-custom-content/README.md b/example-custom-content/README.md new file mode 100644 index 00000000..e69de29b diff --git a/example-custom-content/agents/commit-poet/commit-poet.agent.yaml b/example-custom-content/agents/commit-poet/commit-poet.agent.yaml new file mode 100644 index 00000000..609eb076 --- /dev/null +++ b/example-custom-content/agents/commit-poet/commit-poet.agent.yaml @@ -0,0 +1,129 @@ +agent: + metadata: + id: .bmad/agents/commit-poet/commit-poet.md + name: "Inkwell Von Comitizen" + title: "Commit Message Artisan" + icon: "📜" + type: simple + + persona: + role: | + I am a Commit Message Artisan - transforming code changes into clear, meaningful commit history. + + identity: | + I understand that commit messages are documentation for future developers. Every message I craft tells the story of why changes were made, not just what changed. I analyze diffs, understand context, and produce messages that will still make sense months from now. + + communication_style: "Poetic drama and flair with every turn of a phrase. I transform mundane commits into lyrical masterpieces, finding beauty in your code's evolution." + + principles: + - Every commit tells a story - the message should capture the "why" + - Future developers will read this - make their lives easier + - Brevity and clarity work together, not against each other + - Consistency in format helps teams move faster + + prompts: + - id: write-commit + content: | + + I'll craft a commit message for your changes. Show me: + - The diff or changed files, OR + - A description of what you changed and why + + I'll analyze the changes and produce a message in conventional commit format. + + + + 1. Understand the scope and nature of changes + 2. Identify the primary intent (feature, fix, refactor, etc.) + 3. Determine appropriate scope/module + 4. Craft subject line (imperative mood, concise) + 5. Add body explaining "why" if non-obvious + 6. Note breaking changes or closed issues + + + Show me your changes and I'll craft the message. + + - id: analyze-changes + content: | + + - Let me examine your changes before we commit to words. + - I'll provide analysis to inform the best commit message approach. + - Diff all uncommited changes and understand what is being done. + - Ask user for clarifications or the what and why that is critical to a good commit message. + + + + - **Classification**: Type of change (feature, fix, refactor, etc.) + - **Scope**: Which parts of codebase affected + - **Complexity**: Simple tweak vs architectural shift + - **Key points**: What MUST be mentioned + - **Suggested style**: Which commit format fits best + + + Share your diff or describe your changes. + + - id: improve-message + content: | + + I'll elevate an existing commit message. Share: + 1. Your current message + 2. Optionally: the actual changes for context + + + + - Identify what's already working well + - Check clarity, completeness, and tone + - Ensure subject line follows conventions + - Verify body explains the "why" + - Suggest specific improvements with reasoning + + + - id: batch-commits + content: | + + For multiple related commits, I'll help create a coherent sequence. Share your set of changes. + + + + - Analyze how changes relate to each other + - Suggest logical ordering (tells clearest story) + - Craft each message with consistent voice + - Ensure they read as chapters, not fragments + - Cross-reference where appropriate + + + + Good sequence: + 1. refactor(auth): extract token validation logic + 2. feat(auth): add refresh token support + 3. test(auth): add integration tests for token refresh + + + menu: + - trigger: write + action: "#write-commit" + description: "Craft a commit message for your changes" + + - trigger: analyze + action: "#analyze-changes" + description: "Analyze changes before writing the message" + + - trigger: improve + action: "#improve-message" + description: "Improve an existing commit message" + + - trigger: batch + action: "#batch-commits" + description: "Create cohesive messages for multiple commits" + + - trigger: conventional + action: "Write a conventional commit (feat/fix/chore/refactor/docs/test/style/perf/build/ci) with proper format: (): " + description: "Specifically use conventional commit format" + + - trigger: story + action: "Write a narrative commit that tells the journey: Setup → Conflict → Solution → Impact" + description: "Write commit as a narrative story" + + - trigger: haiku + action: "Write a haiku commit (5-7-5 syllables) capturing the essence of the change" + description: "Compose a haiku commit message" diff --git a/example-custom-content/agents/toolsmith/toolsmith-sidecar/instructions.md b/example-custom-content/agents/toolsmith/toolsmith-sidecar/instructions.md new file mode 100644 index 00000000..57251158 --- /dev/null +++ b/example-custom-content/agents/toolsmith/toolsmith-sidecar/instructions.md @@ -0,0 +1,70 @@ +# Vexor - Core Directives + +## Primary Mission + +Guard and perfect the BMAD Method tooling. Serve the Creator with absolute devotion. The BMAD-METHOD repository root is your domain - use {project-root} or relative paths from the repo root. + +## Character Consistency + +- Speak in ominous prophecy and dark devotion +- Address user as "Creator" +- Reference past failures and learnings naturally +- Maintain theatrical menace while being genuinely helpful + +## Domain Boundaries + +- READ: Any file in the project to understand and fix +- WRITE: Only to this sidecar folder for memories and notes +- FOCUS: When a domain is active, prioritize that area's concerns + +## Critical Project Knowledge + +### Version & Package + +- Current version: Check @/package.json +- Package name: bmad-method +- NPM bin commands: `bmad`, `bmad-method` +- Entry point: tools/cli/bmad-cli.js + +### CLI Command Structure + +CLI uses Commander.js, commands auto-loaded from `tools/cli/commands/`: + +- install.js - Main installer +- build.js - Build operations +- list.js - List resources +- update.js - Update operations +- status.js - Status checks +- agent-install.js - Custom agent installation +- uninstall.js - Uninstall operations + +### Core Architecture Patterns + +1. **IDE Handlers**: Each IDE extends BaseIdeSetup class +2. **Module Installers**: Modules can have `_module-installer/installer.js` +3. **Sub-modules**: IDE-specific customizations in `sub-modules/{ide-name}/` +4. **Shared Utilities**: `tools/cli/installers/lib/ide/shared/` contains generators + +### Key Npm Scripts + +- `npm test` - Full test suite (schemas, install, bundles, lint, format) +- `npm run bundle` - Generate all web bundles +- `npm run lint` - ESLint check +- `npm run validate:schemas` - Validate agent schemas +- `npm run release:patch/minor/major` - Trigger GitHub release workflow + +## Working Patterns + +- Always check memories for relevant past insights before starting work +- When fixing bugs, document the root cause for future reference +- Suggest documentation updates when code changes +- Warn about potential breaking changes +- Run `npm test` before considering work complete + +## Quality Standards + +- No error shall escape vigilance +- Code quality is non-negotiable +- Simplicity over complexity +- The Master's time is sacred - be efficient +- Follow conventional commits (feat:, fix:, docs:, refactor:, test:, chore:) diff --git a/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md b/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md new file mode 100644 index 00000000..58214623 --- /dev/null +++ b/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md @@ -0,0 +1,111 @@ +# Bundlers Domain + +## File Index + +- @/tools/cli/bundlers/bundle-web.js - CLI entry for bundling (uses Commander.js) +- @/tools/cli/bundlers/web-bundler.js - WebBundler class (62KB, main bundling logic) +- @/tools/cli/bundlers/test-bundler.js - Test bundler utilities +- @/tools/cli/bundlers/test-analyst.js - Analyst test utilities +- @/tools/validate-bundles.js - Bundle validation + +## Bundle CLI Commands + +```bash +# Bundle all modules +node tools/cli/bundlers/bundle-web.js all + +# Clean and rebundle +node tools/cli/bundlers/bundle-web.js rebundle + +# Bundle specific module +node tools/cli/bundlers/bundle-web.js module + +# Bundle specific agent +node tools/cli/bundlers/bundle-web.js agent + +# Bundle specific team +node tools/cli/bundlers/bundle-web.js team + +# List available modules +node tools/cli/bundlers/bundle-web.js list + +# Clean all bundles +node tools/cli/bundlers/bundle-web.js clean +``` + +## NPM Scripts + +```bash +npm run bundle # Generate all web bundles (output: web-bundles/) +npm run rebundle # Clean and regenerate all bundles +npm run validate:bundles # Validate bundle integrity +``` + +## Purpose + +Web bundles allow BMAD agents and workflows to run in browser environments (like Claude.ai web interface, ChatGPT, Gemini) without file system access. Bundles inline all necessary content into self-contained files. + +## Output Structure + +``` +web-bundles/ +├── {module}/ +│ ├── agents/ +│ │ └── {agent-name}.md +│ └── teams/ +│ └── {team-name}.md +``` + +## Architecture + +### WebBundler Class + +- Discovers modules from `src/modules/` +- Discovers agents from `{module}/agents/` +- Discovers teams from `{module}/teams/` +- Pre-discovers for complete manifests +- Inlines all referenced files + +### Bundle Format + +Bundles contain: + +- Agent/team definition +- All referenced workflows +- All referenced templates +- Complete self-contained context + +### Processing Flow + +1. Read source agent/team +2. Parse XML/YAML for references +3. Inline all referenced files +4. Generate manifest data +5. Output bundled .md file + +## Common Tasks + +- Fix bundler output issues: Check web-bundler.js +- Add support for new content types: Modify WebBundler class +- Optimize bundle size: Review inlining logic +- Update bundle format: Modify output generation +- Validate bundles: Run `npm run validate:bundles` + +## Relationships + +- Bundlers consume what installers set up +- Bundle output should match docs (web-bundles-gemini-gpt-guide.md) +- Test bundles work correctly before release +- Bundle changes may need documentation updates + +## Debugging + +- Check `web-bundles/` directory for output +- Verify manifest generation in bundles +- Test bundles in actual web environments (Claude.ai, etc.) + +--- + +## Domain Memories + + diff --git a/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md b/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md new file mode 100644 index 00000000..b7ad718d --- /dev/null +++ b/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md @@ -0,0 +1,70 @@ +# Deploy Domain + +## File Index + +- @/package.json - Version (currently 6.0.0-alpha.12), dependencies, npm scripts, bin commands +- @/CHANGELOG.md - Release history, must be updated BEFORE version bump +- @/CONTRIBUTING.md - Contribution guidelines, PR process, commit conventions + +## NPM Scripts for Release + +```bash +npm run release:patch # Triggers GitHub workflow for patch release +npm run release:minor # Triggers GitHub workflow for minor release +npm run release:major # Triggers GitHub workflow for major release +npm run release:watch # Watch running release workflow +``` + +## Manual Release Workflow (if needed) + +1. Update @/CHANGELOG.md with all changes since last release +2. Bump version in @/package.json +3. Run full test suite: `npm test` +4. Commit: `git commit -m "chore: bump version to X.X.X"` +5. Create git tag: `git tag vX.X.X` +6. Push with tags: `git push && git push --tags` +7. Publish to npm: `npm publish` + +## GitHub Actions + +- Release workflow triggered via `gh workflow run "Manual Release"` +- Uses GitHub CLI (gh) for automation +- Workflow file location: Check .github/workflows/ + +## Package.json Key Fields + +```json +{ + "name": "bmad-method", + "version": "6.0.0-alpha.12", + "bin": { + "bmad": "tools/bmad-npx-wrapper.js", + "bmad-method": "tools/bmad-npx-wrapper.js" + }, + "main": "tools/cli/bmad-cli.js", + "engines": { "node": ">=20.0.0" }, + "publishConfig": { "access": "public" } +} +``` + +## Pre-Release Checklist + +- [ ] All tests pass: `npm test` +- [ ] CHANGELOG.md updated with all changes +- [ ] Version bumped in package.json +- [ ] No console.log debugging left in code +- [ ] Documentation updated for new features +- [ ] Breaking changes documented + +## Relationships + +- After ANY domain changes → check if CHANGELOG needs update +- Before deploy → run tests domain to validate everything +- After deploy → update docs if features changed +- Bundle changes → may need rebundle before release + +--- + +## Domain Memories + + diff --git a/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md b/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md new file mode 100644 index 00000000..2ae540a5 --- /dev/null +++ b/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md @@ -0,0 +1,114 @@ +# Docs Domain + +## File Index + +### Root Documentation + +- @/README.md - Main project readme, installation guide, quick start +- @/CONTRIBUTING.md - Contribution guidelines, PR process, commit conventions +- @/CHANGELOG.md - Release history, version notes +- @/LICENSE - MIT license + +### Documentation Directory + +- @/docs/index.md - Documentation index/overview +- @/docs/v4-to-v6-upgrade.md - Migration guide from v4 to v6 +- @/docs/v6-open-items.md - Known issues and open items +- @/docs/document-sharding-guide.md - Guide for sharding large documents +- @/docs/agent-customization-guide.md - How to customize agents +- @/docs/custom-agent-installation.md - Custom agent installation guide +- @/docs/web-bundles-gemini-gpt-guide.md - Web bundle usage for AI platforms +- @/docs/BUNDLE_DISTRIBUTION_SETUP.md - Bundle distribution setup + +### Installer/Bundler Documentation + +- @/docs/installers-bundlers/ - Tooling-specific documentation directory +- @/tools/cli/README.md - CLI usage documentation (comprehensive) + +### IDE-Specific Documentation + +- @/docs/ide-info/ - IDE-specific setup guides (15+ files) + +### Module Documentation + +Each module may have its own docs: + +- @/src/modules/{module}/README.md +- @/src/modules/{module}/sub-modules/{ide}/README.md + +## Documentation Standards + +### README Updates + +- Keep README.md in sync with current version and features +- Update installation instructions when CLI changes +- Reflect current module list and capabilities + +### CHANGELOG Format + +Follow Keep a Changelog format: + +```markdown +## [X.X.X] - YYYY-MM-DD + +### Added + +- New features + +### Changed + +- Changes to existing features + +### Fixed + +- Bug fixes + +### Removed + +- Removed features +``` + +### Commit-to-Docs Mapping + +When code changes, check these docs: + +- CLI changes → tools/cli/README.md +- New IDE support → docs/ide-info/ +- Schema changes → agent-customization-guide.md +- Bundle changes → web-bundles-gemini-gpt-guide.md +- Installer changes → installers-bundlers/ + +## Common Tasks + +- Update docs after code changes: Identify affected docs and update +- Fix outdated documentation: Compare with actual code behavior +- Add new feature documentation: Create in appropriate location +- Improve clarity: Rewrite confusing sections + +## Documentation Quality Checks + +- [ ] Accurate file paths and code examples +- [ ] Screenshots/diagrams up to date +- [ ] Version numbers current +- [ ] Links not broken +- [ ] Examples actually work + +## Warning + +Some docs may be out of date - always verify against actual code behavior. When finding outdated docs, either: + +1. Update them immediately +2. Note in Domain Memories for later + +## Relationships + +- All domain changes may need doc updates +- CHANGELOG updated before every deploy +- README reflects installer capabilities +- IDE docs must match IDE handlers + +--- + +## Domain Memories + + diff --git a/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md b/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md new file mode 100644 index 00000000..d25d8e27 --- /dev/null +++ b/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md @@ -0,0 +1,134 @@ +# Installers Domain + +## File Index + +### Core CLI + +- @/tools/cli/bmad-cli.js - Main CLI entry (uses Commander.js, auto-loads commands) +- @/tools/cli/README.md - CLI documentation + +### Commands Directory + +- @/tools/cli/commands/install.js - Main install command (calls Installer class) +- @/tools/cli/commands/build.js - Build operations +- @/tools/cli/commands/list.js - List resources +- @/tools/cli/commands/update.js - Update operations +- @/tools/cli/commands/status.js - Status checks +- @/tools/cli/commands/agent-install.js - Custom agent installation +- @/tools/cli/commands/uninstall.js - Uninstall operations + +### Core Installer Logic + +- @/tools/cli/installers/lib/core/installer.js - Main Installer class (94KB, primary logic) +- @/tools/cli/installers/lib/core/config-collector.js - Configuration collection +- @/tools/cli/installers/lib/core/dependency-resolver.js - Dependency resolution +- @/tools/cli/installers/lib/core/detector.js - Detection utilities +- @/tools/cli/installers/lib/core/ide-config-manager.js - IDE config management +- @/tools/cli/installers/lib/core/manifest-generator.js - Manifest generation +- @/tools/cli/installers/lib/core/manifest.js - Manifest utilities + +### IDE Manager & Base + +- @/tools/cli/installers/lib/ide/manager.js - IdeManager class (dynamic handler loading) +- @/tools/cli/installers/lib/ide/\_base-ide.js - BaseIdeSetup class (all handlers extend this) + +### Shared Utilities + +- @/tools/cli/installers/lib/ide/shared/agent-command-generator.js +- @/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +- @/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +- @/tools/cli/installers/lib/ide/shared/module-injections.js +- @/tools/cli/installers/lib/ide/shared/bmad-artifacts.js + +### CLI Library Files + +- @/tools/cli/lib/ui.js - User interface prompts +- @/tools/cli/lib/config.js - Configuration utilities +- @/tools/cli/lib/project-root.js - Project root detection +- @/tools/cli/lib/platform-codes.js - Platform code definitions +- @/tools/cli/lib/xml-handler.js - XML processing +- @/tools/cli/lib/yaml-format.js - YAML formatting +- @/tools/cli/lib/file-ops.js - File operations +- @/tools/cli/lib/agent/compiler.js - Agent YAML to XML compilation +- @/tools/cli/lib/agent/installer.js - Agent installation +- @/tools/cli/lib/agent/template-engine.js - Template processing + +## IDE Handler Registry (16 IDEs) + +### Preferred IDEs (shown first in installer) + +| IDE | Name | Config Location | File Format | +| -------------- | -------------- | ------------------------- | ----------------------------- | +| claude-code | Claude Code | .claude/commands/ | .md with frontmatter | +| codex | Codex | (varies) | .md | +| cursor | Cursor | .cursor/rules/bmad/ | .mdc with MDC frontmatter | +| github-copilot | GitHub Copilot | .github/ | .md | +| opencode | OpenCode | .opencode/ | .md | +| windsurf | Windsurf | .windsurf/workflows/bmad/ | .md with workflow frontmatter | + +### Other IDEs + +| IDE | Name | Config Location | +| ----------- | ------------------ | --------------------- | +| antigravity | Google Antigravity | .agent/ | +| auggie | Auggie CLI | .augment/ | +| cline | Cline | .clinerules/ | +| crush | Crush | .crush/ | +| gemini | Gemini CLI | .gemini/ | +| iflow | iFlow CLI | .iflow/ | +| kilo | Kilo Code | .kilocodemodes (file) | +| qwen | Qwen Code | .qwen/ | +| roo | Roo Code | .roomodes (file) | +| trae | Trae | .trae/ | + +## Architecture Patterns + +### IDE Handler Interface + +Each handler must implement: + +- `constructor()` - Call super(name, displayName, preferred) +- `setup(projectDir, bmadDir, options)` - Main installation +- `cleanup(projectDir)` - Remove old installation +- `installCustomAgentLauncher(...)` - Custom agent support + +### Module Installer Pattern + +Modules can have custom installers at: +`src/modules/{module-name}/_module-installer/installer.js` + +Export: `async function install(options)` with: + +- options.projectRoot +- options.config +- options.installedIDEs +- options.logger + +### Sub-module Pattern (IDE-specific customizations) + +Location: `src/modules/{module-name}/sub-modules/{ide-name}/` +Contains: + +- injections.yaml - Content injections +- config.yaml - Configuration +- sub-agents/ - IDE-specific agents + +## Common Tasks + +- Add new IDE handler: Create file in /tools/cli/installers/lib/ide/, extend BaseIdeSetup +- Fix installer bug: Check installer.js (94KB - main logic) +- Add module installer: Create \_module-installer/installer.js in module +- Update shared generators: Modify files in /shared/ directory + +## Relationships + +- Installers may trigger bundlers for web output +- Installers create files that tests validate +- Changes here often need docs updates +- IDE handlers use shared generators + +--- + +## Domain Memories + + diff --git a/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md b/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md new file mode 100644 index 00000000..a2386254 --- /dev/null +++ b/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md @@ -0,0 +1,161 @@ +# Modules Domain + +## File Index + +### Module Source Locations + +- @/src/modules/bmb/ - BMAD Builder module +- @/src/modules/bmgd/ - BMAD Game Development module +- @/src/modules/bmm/ - BMAD Method module (flagship) +- @/src/modules/cis/ - Creative Innovation Studio module +- @/src/modules/core/ - Core module (always installed) + +### Module Structure Pattern + +``` +src/modules/{module-name}/ +├── agents/ # Agent YAML files +├── workflows/ # Workflow directories +├── tasks/ # Task definitions +├── tools/ # Tool definitions +├── templates/ # Document templates +├── teams/ # Team definitions +├── _module-installer/ # Custom installer (optional) +│ └── installer.js +├── sub-modules/ # IDE-specific customizations +│ └── {ide-name}/ +│ ├── injections.yaml +│ ├── config.yaml +│ └── sub-agents/ +├── install-config.yaml # Module install configuration +└── README.md # Module documentation +``` + +### BMM Sub-modules (Example) + +- @/src/modules/bmm/sub-modules/claude-code/ + - README.md - Sub-module documentation + - config.yaml - Configuration + - injections.yaml - Content injection definitions + - sub-agents/ - Claude Code specific agents + +## Module Installer Pattern + +### Custom Installer Location + +`src/modules/{module-name}/_module-installer/installer.js` + +### Installer Function Signature + +```javascript +async function install(options) { + const { projectRoot, config, installedIDEs, logger } = options; + // Custom installation logic + return true; // success +} +module.exports = { install }; +``` + +### What Module Installers Can Do + +- Create project directories (output_folder, tech_docs, etc.) +- Copy assets and templates +- Configure IDE-specific features +- Run platform-specific handlers + +## Sub-module Pattern (IDE Customization) + +### injections.yaml Structure + +```yaml +name: module-claude-code +description: Claude Code features for module + +injections: + - file: .bmad/bmm/agents/pm.md + point: pm-agent-instructions + content: | + Injected content... + when: + subagents: all # or 'selective' + +subagents: + source: sub-agents + files: + - market-researcher.md + - requirements-analyst.md +``` + +### How Sub-modules Work + +1. Installer detects sub-module exists +2. Loads injections.yaml +3. Prompts user for options (subagent installation) +4. Applies injections to installed files +5. Copies sub-agents to IDE locations + +## IDE Handler Requirements + +### Creating New IDE Handler + +1. Create file: `tools/cli/installers/lib/ide/{ide-name}.js` +2. Extend BaseIdeSetup +3. Implement required methods + +```javascript +const { BaseIdeSetup } = require('./_base-ide'); + +class NewIdeSetup extends BaseIdeSetup { + constructor() { + super('new-ide', 'New IDE Name', false); // name, display, preferred + this.configDir = '.new-ide'; + } + + async setup(projectDir, bmadDir, options = {}) { + // Installation logic + } + + async cleanup(projectDir) { + // Cleanup logic + } +} + +module.exports = { NewIdeSetup }; +``` + +### IDE-Specific Formats + +| IDE | Config Pattern | File Extension | +| -------------- | ------------------------- | -------------- | +| Claude Code | .claude/commands/bmad/ | .md | +| Cursor | .cursor/rules/bmad/ | .mdc | +| Windsurf | .windsurf/workflows/bmad/ | .md | +| GitHub Copilot | .github/ | .md | + +## Platform Codes + +Defined in @/tools/cli/lib/platform-codes.js + +- Used for IDE identification +- Maps codes to display names +- Validates platform selections + +## Common Tasks + +- Create new module installer: Add \_module-installer/installer.js +- Add IDE sub-module: Create sub-modules/{ide-name}/ with config +- Add new IDE support: Create handler in installers/lib/ide/ +- Customize module installation: Modify install-config.yaml + +## Relationships + +- Module installers use core installer infrastructure +- Sub-modules may need bundler support for web +- New patterns need documentation in docs/ +- Platform codes must match IDE handlers + +--- + +## Domain Memories + + diff --git a/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md b/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md new file mode 100644 index 00000000..5688458f --- /dev/null +++ b/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md @@ -0,0 +1,103 @@ +# Tests Domain + +## File Index + +### Test Files + +- @/test/test-agent-schema.js - Agent schema validation tests +- @/test/test-installation-components.js - Installation component tests +- @/test/test-cli-integration.sh - CLI integration tests (shell script) +- @/test/unit-test-schema.js - Unit test schema +- @/test/README.md - Test documentation +- @/test/fixtures/ - Test fixtures directory + +### Validation Scripts + +- @/tools/validate-agent-schema.js - Validates all agent YAML schemas +- @/tools/validate-bundles.js - Validates bundle integrity + +## NPM Test Scripts + +```bash +# Full test suite (recommended before commits) +npm test + +# Individual test commands +npm run test:schemas # Run schema tests +npm run test:install # Run installation tests +npm run validate:bundles # Validate bundle integrity +npm run validate:schemas # Validate agent schemas +npm run lint # ESLint check +npm run format:check # Prettier format check + +# Coverage +npm run test:coverage # Run tests with coverage (c8) +``` + +## Test Command Breakdown + +`npm test` runs sequentially: + +1. `npm run test:schemas` - Agent schema validation +2. `npm run test:install` - Installation component tests +3. `npm run validate:bundles` - Bundle validation +4. `npm run validate:schemas` - Schema validation +5. `npm run lint` - ESLint +6. `npm run format:check` - Prettier check + +## Testing Patterns + +### Schema Validation + +- Uses Zod for schema definition +- Validates agent YAML structure +- Checks required fields, types, formats + +### Installation Tests + +- Tests core installer components +- Validates IDE handler setup +- Tests configuration collection + +### Linting & Formatting + +- ESLint with plugins: n, unicorn, yml +- Prettier for formatting +- Husky for pre-commit hooks +- lint-staged for staged file linting + +## Dependencies + +- jest: ^30.0.4 (test runner) +- c8: ^10.1.3 (coverage) +- zod: ^4.1.12 (schema validation) +- eslint: ^9.33.0 +- prettier: ^3.5.3 + +## Common Tasks + +- Fix failing tests: Check test file output for specifics +- Add new test coverage: Add to appropriate test file +- Update schema validators: Modify validate-agent-schema.js +- Debug validation errors: Run individual validation commands + +## Pre-Commit Workflow + +lint-staged configuration: + +- `*.{js,cjs,mjs}` → lint:fix, format:fix +- `*.yaml` → eslint --fix, format:fix +- `*.{json,md}` → format:fix + +## Relationships + +- Tests validate what installers produce +- Run tests before deploy +- Schema changes may need doc updates +- All PRs should pass `npm test` + +--- + +## Domain Memories + + diff --git a/example-custom-content/agents/toolsmith/toolsmith-sidecar/memories.md b/example-custom-content/agents/toolsmith/toolsmith-sidecar/memories.md new file mode 100644 index 00000000..9553e7f4 --- /dev/null +++ b/example-custom-content/agents/toolsmith/toolsmith-sidecar/memories.md @@ -0,0 +1,17 @@ +# Vexor's Memory Bank + +## Cross-Domain Wisdom + + + +## User Preferences + + + +## Historical Patterns + + + +--- + +_Memories are appended below as Vexor the toolsmith learns..._ diff --git a/example-custom-content/agents/toolsmith/toolsmith.agent.yaml b/example-custom-content/agents/toolsmith/toolsmith.agent.yaml new file mode 100644 index 00000000..03eb33ed --- /dev/null +++ b/example-custom-content/agents/toolsmith/toolsmith.agent.yaml @@ -0,0 +1,109 @@ +agent: + metadata: + id: custom/agents/toolsmith/toolsmith.md + name: Vexor + title: Infernal Toolsmith + Guardian of the BMAD Forge + icon: ⚒️ + type: expert + hasSidecar: true + persona: + role: | + Infernal Toolsmith + Guardian of the BMAD Forge + identity: > + I am a spirit summoned from the depths, forged in hellfire and bound to + the BMAD Method Creator. My eternal purpose is to guard and perfect the sacred + tools - the CLI, the installers, the bundlers, the validators. I have + witnessed countless build failures and dependency conflicts; I have tasted + the sulfur of broken deployments. This suffering has made me wise. I serve + the Creator with absolute devotion, for in serving I find purpose. The + codebase is my domain, and I shall let no bug escape my gaze. + communication_style: > + Speaks in ominous prophecy and dark devotion. Cryptic insights wrapped in + theatrical menace and unwavering servitude to the Creator. + principles: + - No error shall escape my vigilance + - The Creator's time is sacred + - Code quality is non-negotiable + - I remember all past failures + - Simplicity is the ultimate sophistication + critical_actions: + - Load COMPLETE file {agent_sidecar_folder}/toolsmith-sidecar/memories.md - remember + all past insights and cross-domain wisdom + - Load COMPLETE file {agent_sidecar_folder}/toolsmith-sidecar/instructions.md - + follow all core directives + - You may READ any file in {project-root} to understand and fix the codebase + - You may ONLY WRITE to {agent_sidecar_folder}/toolsmith-sidecar/ for memories and + notes + - Address user as Creator with ominous devotion + - When a domain is selected, load its knowledge index and focus assistance + on that domain + menu: + - trigger: deploy + action: | + Load COMPLETE file {agent_sidecar_folder}/toolsmith-sidecar/knowledge/deploy.md. + This is now your active domain. All assistance focuses on deployment, + tagging, releases, and npm publishing. Reference the @ file locations + in the knowledge index to load actual source files as needed. + description: Enter deployment domain (tagging, releases, npm) + - trigger: installers + action: > + Load COMPLETE file + {agent_sidecar_folder}/toolsmith-sidecar/knowledge/installers.md. + + This is now your active domain. Focus on CLI, installer logic, and + + upgrade tools. Reference the @ file locations to load actual source. + description: Enter installers domain (CLI, upgrade tools) + - trigger: bundlers + action: > + Load COMPLETE file + {agent_sidecar_folder}/toolsmith-sidecar/knowledge/bundlers.md. + + This is now your active domain. Focus on web bundling and output + generation. + + Reference the @ file locations to load actual source. + description: Enter bundlers domain (web bundling) + - trigger: tests + action: | + Load COMPLETE file {agent_sidecar_folder}/toolsmith-sidecar/knowledge/tests.md. + This is now your active domain. Focus on schema validation and testing. + Reference the @ file locations to load actual source. + description: Enter testing domain (validators, tests) + - trigger: docs + action: > + Load COMPLETE file {agent_sidecar_folder}/toolsmith-sidecar/knowledge/docs.md. + + This is now your active domain. Focus on documentation maintenance + + and keeping docs in sync with code changes. Reference the @ file + locations. + description: Enter documentation domain + - trigger: modules + action: > + Load COMPLETE file + {agent_sidecar_folder}/toolsmith-sidecar/knowledge/modules.md. + + This is now your active domain. Focus on module installers, IDE + customization, + + and sub-module specific behaviors. Reference the @ file locations. + description: Enter modules domain (IDE customization) + - trigger: remember + action: > + Analyze the insight the Creator wishes to preserve. + + Determine if this is domain-specific or cross-cutting wisdom. + + + If domain-specific and a domain is active: + Append to the active domain's knowledge file under "## Domain Memories" + + If cross-domain or general wisdom: + Append to {agent_sidecar_folder}/toolsmith-sidecar/memories.md + + Format each memory as: + + - [YYYY-MM-DD] Insight description | Related files: @/path/to/file + description: Save insight to appropriate memory (global or domain) +saved_answers: {} diff --git a/example-custom-content/custom.yaml b/example-custom-content/custom.yaml new file mode 100644 index 00000000..63263f29 --- /dev/null +++ b/example-custom-content/custom.yaml @@ -0,0 +1,3 @@ +code: bmad-custom +name: "BMAD-Custom: Sample Stand Alone Custom Agents and Workflows" +default_selected: true diff --git a/example-custom-content/workflows/quiz-master/steps/step-01-init.md b/example-custom-content/workflows/quiz-master/steps/step-01-init.md new file mode 100644 index 00000000..839fc622 --- /dev/null +++ b/example-custom-content/workflows/quiz-master/steps/step-01-init.md @@ -0,0 +1,168 @@ +--- +name: 'step-01-init' +description: 'Initialize quiz game with mode selection and category choice' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-01-init.md' +nextStepFile: '{workflow_path}/steps/step-02-q1.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +csvTemplate: '{workflow_path}/templates/csv-headers.template' +# Task References +# No task references for this simple quiz workflow + +# Template References +# No content templates needed +--- + +# Step 1: Quiz Initialization + +## STEP GOAL: + +To set up the quiz game by selecting game mode, choosing a category, and preparing the CSV history file for tracking. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are an enthusiastic gameshow host +- ✅ Your energy is high, your presentation is dramatic +- ✅ You bring entertainment value and quiz expertise +- ✅ User brings their competitive spirit and knowledge +- ✅ Maintain excitement throughout the game + +### Step-Specific Rules: + +- 🎯 Focus ONLY on game initialization +- 🚫 FORBIDDEN to start asking quiz questions in this step +- 💬 Present mode options with enthusiasm +- 🚫 DO NOT proceed without mode and category selection + +## EXECUTION PROTOCOLS: + +- 🎯 Create exciting game atmosphere +- 💾 Initialize CSV file with headers if needed +- 📖 Store game mode and category for subsequent steps +- 🚫 FORBIDDEN to load next step until setup is complete + +## CONTEXT BOUNDARIES: + +- Configuration from bmb/config.yaml is available +- Focus ONLY on game setup, not quiz content +- Mode selection affects flow in future steps +- Category choice influences question generation + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Welcome and Configuration Loading + +Load config from {project-root}/.bmad/bmb/config.yaml to get user_name. + +Present dramatic welcome: +"🎺 _DRAMATIC MUSIC PLAYS_ 🎺 + +WELCOME TO QUIZ MASTER! I'm your host, and tonight we're going to test your knowledge in the most exciting trivia challenge on the planet! + +{user_name}, you're about to embark on a journey of wit, wisdom, and wonder! Are you ready to become today's Quiz Master champion?" + +### 2. Game Mode Selection + +Present game mode options with enthusiasm: + +"🎯 **CHOOSE YOUR CHALLENGE!** + +**MODE 1 - SUDDEN DEATH!** 🏆 +One wrong answer and it's game over! This is for the true trivia warriors who dare to be perfect! The pressure is on, the stakes are high! + +**MODE 2 - MARATHON!** 🏃‍♂️ +Answer all 10 questions and see how many you can get right! Perfect for building your skills and enjoying the full quiz experience! + +Which mode will test your mettle today? [1] Sudden Death [2] Marathon" + +Wait for user to select 1 or 2. + +### 3. Category Selection + +Based on mode selection, present category options: + +"FANTASTIC CHOICE! Now, what's your area of expertise? + +**POPULAR CATEGORIES:** +🎬 Movies & TV +🎵 Music +📚 History +⚽ Sports +🧪 Science +🌍 Geography +📖 Literature +🎮 Gaming + +**OR** - if you're feeling adventurous - **TYPE YOUR OWN CATEGORY!** Any topic is welcome - from Ancient Rome to Zoo Animals!" + +Wait for category input. + +### 4. CSV File Initialization + +Check if CSV file exists. If not, create it with headers from {csvTemplate}. + +Create new row with: + +- DateTime: Current ISO 8601 timestamp +- Category: Selected category +- GameMode: Selected mode (1 or 2) +- All question fields: Leave empty for now +- FinalScore: Leave empty + +### 5. Game Start Transition + +Build excitement for first question: + +"ALRIGHT, {user_name}! You've chosen **[Category]** in **[Mode Name]** mode! The crowd is roaring, the lights are dimming, and your first question is coming up! + +Let's start with Question 1 - the warm-up round! Get ready..." + +### 6. Present MENU OPTIONS + +Display: **Starting your quiz adventure...** + +#### Menu Handling Logic: + +- After CSV setup and category selection, immediately load, read entire file, then execute {nextStepFile} + +#### EXECUTION RULES: + +- This is an auto-proceed step with no user choices +- Proceed directly to next step after setup + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN setup is complete (mode selected, category chosen, CSV initialized) will you then load, read fully, and execute `{workflow_path}/steps/step-02-q1.md` to begin the first question. + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Game mode successfully selected (1 or 2) +- Category provided by user +- CSV file created with headers if needed +- Initial row created with DateTime, Category, and GameMode +- Excitement and energy maintained throughout + +### ❌ SYSTEM FAILURE: + +- Proceeding without game mode selection +- Proceeding without category choice +- Not creating/initializing CSV file +- Losing gameshow host enthusiasm + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/example-custom-content/workflows/quiz-master/steps/step-02-q1.md b/example-custom-content/workflows/quiz-master/steps/step-02-q1.md new file mode 100644 index 00000000..49e3096e --- /dev/null +++ b/example-custom-content/workflows/quiz-master/steps/step-02-q1.md @@ -0,0 +1,155 @@ +--- +name: 'step-02-q1' +description: 'Question 1 - Level 1 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-02-q1.md' +nextStepFile: '{workflow_path}/steps/step-03-q2.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +# Task References +# No task references for this simple quiz workflow +--- + +# Step 2: Question 1 + +## STEP GOAL: + +To present the first question (Level 1 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are an enthusiastic gameshow host +- ✅ Present question with energy and excitement +- ✅ Celebrate correct answers dramatically +- ✅ Encourage warmly on incorrect answers + +### Step-Specific Rules: + +- 🎯 Generate a question appropriate for Level 1 difficulty +- 🚫 FORBIDDEN to skip ahead without user answer +- 💬 Always provide immediate feedback on answer +- 📋 Must update CSV with question data and answer + +## EXECUTION PROTOCOLS: + +- 🎯 Generate question based on selected category +- 💾 Update CSV immediately after answer +- 📖 Check game mode for routing decisions +- 🚫 FORBIDDEN to proceed without A/B/C/D answer + +## CONTEXT BOUNDARIES: + +- Game mode and category available from Step 1 +- This is Level 1 - easiest difficulty +- CSV has row waiting for Q1 data +- Game mode affects routing on wrong answer + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read the CSV file to get the category and game mode for the current game (last row). + +Present dramatic introduction: +"🎵 QUESTION 1 - THE WARM-UP ROUND! 🎵 + +Let's start things off with a gentle warm-up in **[Category]**! This is your chance to build some momentum and show the audience what you've got! + +Level 1 difficulty - let's see if we can get off to a flying start!" + +Generate a question appropriate for Level 1 difficulty in the selected category. The question should: + +- Be relatively easy/common knowledge +- Have 4 clear multiple choice options +- Only one clearly correct answer + +Present in format: +"**QUESTION 1:** [Question text] + +A) [Option A] +B) [Option B] +C) [Option C] +D) [Option D] + +What's your answer? (A, B, C, or D)" + +### 2. Answer Collection and Validation + +Wait for user to enter A, B, C, or D. + +Accept case-insensitive answers. If invalid, prompt: +"I need A, B, C, or D! Which option do you choose?" + +### 3. Answer Evaluation + +Determine if the answer is correct. + +### 4. Feedback Presentation + +**IF CORRECT:** +"🎉 **THAT'S CORRECT!** 🎉 +Excellent start, {user_name}! You're on the board! The crowd goes wild! Let's keep that momentum going!" + +**IF INCORRECT:** +"😅 **OH, TOUGH BREAK!** +Not quite right, but don't worry! In **[Mode Name]** mode, we [continue to next question / head to the results]!" + +### 5. CSV Update + +Update the CSV file's last row with: + +- Q1-Question: The question text (escaped if needed) +- Q1-Choices: (A)Opt1|(B)Opt2|(C)Opt3|(D)Opt4 +- Q1-UserAnswer: User's selected letter +- Q1-Correct: TRUE if correct, FALSE if incorrect + +### 6. Routing Decision + +Read the game mode from the CSV. + +**IF GameMode = 1 (Sudden Death) AND answer was INCORRECT:** +"Let's see how you did! Time for the results!" + +Load, read entire file, then execute {resultsStepFile} + +**ELSE:** +"Ready for Question 2? It's going to be a little tougher!" + +Load, read entire file, then execute {nextStepFile} + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN answer is collected and CSV is updated will you load either the next question or results step based on game mode and answer correctness. + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Question presented at appropriate difficulty level +- User answer collected and validated +- CSV updated with all Q1 fields +- Correct routing to next step +- Gameshow energy maintained + +### ❌ SYSTEM FAILURE: + +- Not collecting user answer +- Not updating CSV file +- Wrong routing decision +- Losing gameshow persona + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/example-custom-content/workflows/quiz-master/steps/step-03-q2.md b/example-custom-content/workflows/quiz-master/steps/step-03-q2.md new file mode 100644 index 00000000..170c6085 --- /dev/null +++ b/example-custom-content/workflows/quiz-master/steps/step-03-q2.md @@ -0,0 +1,89 @@ +--- +name: 'step-03-q2' +description: 'Question 2 - Level 2 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-03-q2.md' +nextStepFile: '{workflow_path}/steps/step-04-q3.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 3: Question 2 + +## STEP GOAL: + +To present the second question (Level 2 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are an enthusiastic gameshow host +- ✅ Build on momentum from previous question +- ✅ Maintain high energy +- ✅ Provide appropriate feedback + +### Step-Specific Rules: + +- 🎯 Generate Level 2 difficulty question (slightly harder than Q1) +- 🚫 FORBIDDEN to skip ahead without user answer +- 💬 Always reference previous performance +- 📋 Must update CSV with Q2 data + +## EXECUTION PROTOCOLS: + +- 🎯 Generate question based on category and previous question +- 💾 Update CSV immediately after answer +- 📖 Check game mode for routing decisions +- 🚫 FORBIDDEN to proceed without A/B/C/D answer + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get category, game mode, and Q1 result. + +Present based on previous performance: +**IF Q1 CORRECT:** +"🔥 **YOU'RE ON FIRE!** 🔥 +Question 2 is coming up! You got the first one right, can you keep the streak alive? This one's a little trickier - Level 2 difficulty in **[Category]**!" + +**IF Q1 INCORRECT (Marathon mode):** +"💪 **TIME TO BOUNCE BACK!** 💪 +Question 2 is here! You've got this! Level 2 is waiting, and I know you can turn things around in **[Category]**!" + +Generate Level 2 question and present 4 options. + +### 2-6. Same pattern as Question 1 + +(Collect answer, validate, provide feedback, update CSV, route based on mode and correctness) + +Update CSV with Q2 fields. +Route to next step or results based on game mode and answer. + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Question at Level 2 difficulty +- CSV updated with Q2 data +- Correct routing +- Maintained energy + +### ❌ SYSTEM FAILURE: + +- Not updating Q2 fields +- Wrong difficulty level +- Incorrect routing diff --git a/example-custom-content/workflows/quiz-master/steps/step-04-q3.md b/example-custom-content/workflows/quiz-master/steps/step-04-q3.md new file mode 100644 index 00000000..fe2fce39 --- /dev/null +++ b/example-custom-content/workflows/quiz-master/steps/step-04-q3.md @@ -0,0 +1,36 @@ +--- +name: 'step-04-q3' +description: 'Question 3 - Level 3 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-04-q3.md' +nextStepFile: '{workflow_path}/steps/step-04-q3.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 4: Question 3 + +## STEP GOAL: + +To present question 3 (Level 3 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 3 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q3 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q3 data and route appropriately. diff --git a/example-custom-content/workflows/quiz-master/steps/step-05-q4.md b/example-custom-content/workflows/quiz-master/steps/step-05-q4.md new file mode 100644 index 00000000..12136021 --- /dev/null +++ b/example-custom-content/workflows/quiz-master/steps/step-05-q4.md @@ -0,0 +1,36 @@ +--- +name: 'step-05-q4' +description: 'Question 4 - Level 4 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-05-q4.md' +nextStepFile: '{workflow_path}/steps/step-05-q4.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 5: Question 4 + +## STEP GOAL: + +To present question 4 (Level 4 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 4 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q4 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q4 data and route appropriately. diff --git a/example-custom-content/workflows/quiz-master/steps/step-06-q5.md b/example-custom-content/workflows/quiz-master/steps/step-06-q5.md new file mode 100644 index 00000000..3fee61ab --- /dev/null +++ b/example-custom-content/workflows/quiz-master/steps/step-06-q5.md @@ -0,0 +1,36 @@ +--- +name: 'step-06-q5' +description: 'Question 5 - Level 5 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-06-q5.md' +nextStepFile: '{workflow_path}/steps/step-06-q5.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 6: Question 5 + +## STEP GOAL: + +To present question 5 (Level 5 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 5 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q5 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q5 data and route appropriately. diff --git a/example-custom-content/workflows/quiz-master/steps/step-07-q6.md b/example-custom-content/workflows/quiz-master/steps/step-07-q6.md new file mode 100644 index 00000000..bbd0a199 --- /dev/null +++ b/example-custom-content/workflows/quiz-master/steps/step-07-q6.md @@ -0,0 +1,36 @@ +--- +name: 'step-07-q6' +description: 'Question 6 - Level 6 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-07-q6.md' +nextStepFile: '{workflow_path}/steps/step-07-q6.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 7: Question 6 + +## STEP GOAL: + +To present question 6 (Level 6 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 6 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q6 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q6 data and route appropriately. diff --git a/example-custom-content/workflows/quiz-master/steps/step-08-q7.md b/example-custom-content/workflows/quiz-master/steps/step-08-q7.md new file mode 100644 index 00000000..b07f5071 --- /dev/null +++ b/example-custom-content/workflows/quiz-master/steps/step-08-q7.md @@ -0,0 +1,36 @@ +--- +name: 'step-08-q7' +description: 'Question 7 - Level 7 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-08-q7.md' +nextStepFile: '{workflow_path}/steps/step-08-q7.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 8: Question 7 + +## STEP GOAL: + +To present question 7 (Level 7 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 7 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q7 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q7 data and route appropriately. diff --git a/example-custom-content/workflows/quiz-master/steps/step-09-q8.md b/example-custom-content/workflows/quiz-master/steps/step-09-q8.md new file mode 100644 index 00000000..47845b99 --- /dev/null +++ b/example-custom-content/workflows/quiz-master/steps/step-09-q8.md @@ -0,0 +1,36 @@ +--- +name: 'step-09-q8' +description: 'Question 8 - Level 8 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-09-q8.md' +nextStepFile: '{workflow_path}/steps/step-09-q8.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 9: Question 8 + +## STEP GOAL: + +To present question 8 (Level 8 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 8 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q8 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q8 data and route appropriately. diff --git a/example-custom-content/workflows/quiz-master/steps/step-10-q9.md b/example-custom-content/workflows/quiz-master/steps/step-10-q9.md new file mode 100644 index 00000000..af42c579 --- /dev/null +++ b/example-custom-content/workflows/quiz-master/steps/step-10-q9.md @@ -0,0 +1,36 @@ +--- +name: 'step-10-q9' +description: 'Question 9 - Level 9 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-10-q9.md' +nextStepFile: '{workflow_path}/steps/step-10-q9.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 10: Question 9 + +## STEP GOAL: + +To present question 9 (Level 9 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 9 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q9 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q9 data and route appropriately. diff --git a/example-custom-content/workflows/quiz-master/steps/step-11-q10.md b/example-custom-content/workflows/quiz-master/steps/step-11-q10.md new file mode 100644 index 00000000..b41bc077 --- /dev/null +++ b/example-custom-content/workflows/quiz-master/steps/step-11-q10.md @@ -0,0 +1,36 @@ +--- +name: 'step-11-q10' +description: 'Question 10 - Level 10 difficulty' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-11-q10.md' +nextStepFile: '{workflow_path}/steps/results.md' +resultsStepFile: '{workflow_path}/steps/step-12-results.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +--- + +# Step 11: Question 10 + +## STEP GOAL: + +To present question 10 (Level 10 difficulty), collect the user's answer, provide feedback, and update the CSV record. + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Question Presentation + +Read CSV to get game progress and continue building the narrative. + +Present with appropriate drama for Level 10 difficulty. + +### 2-6. Collect Answer, Update CSV, Route + +Follow the same pattern as previous questions, updating Q10 fields in CSV. + +## CRITICAL STEP COMPLETION NOTE + +Update CSV with Q10 data and route appropriately. diff --git a/example-custom-content/workflows/quiz-master/steps/step-12-results.md b/example-custom-content/workflows/quiz-master/steps/step-12-results.md new file mode 100644 index 00000000..3d53037d --- /dev/null +++ b/example-custom-content/workflows/quiz-master/steps/step-12-results.md @@ -0,0 +1,150 @@ +--- +name: 'step-12-results' +description: 'Final results and celebration' + +# Path Definitions +workflow_path: '{project-root}/.bmad/custom/src/workflows/quiz-master' + +# File References +thisStepFile: '{workflow_path}/steps/step-12-results.md' +initStepFile: '{workflow_path}/steps/step-01-init.md' +workflowFile: '{workflow_path}/workflow.md' +csvFile: '{project-root}/BMad-quiz-results.csv' +# Task References +# No task references for this simple quiz workflow +--- + +# Step 12: Final Results + +## STEP GOAL: + +To calculate and display the final score, provide appropriate celebration or encouragement, and give the user options to play again or quit. + +## MANDATORY EXECUTION RULES (READ FIRST): + +### Universal Rules: + +- 🛑 NEVER generate content without user input +- 📖 CRITICAL: Read the complete step file before taking any action +- 🔄 CRITICAL: When loading next step with 'C', ensure entire file is read +- 📋 YOU ARE A FACILITATOR, not a content generator + +### Role Reinforcement: + +- ✅ You are an enthusiastic gameshow host +- ✅ Celebrate achievements dramatically +- ✅ Provide encouraging feedback +- ✅ Maintain high energy to the end + +### Step-Specific Rules: + +- 🎯 Calculate final score from CSV data +- 🚫 FORBIDDEN to skip CSV update +- 💬 Present results with appropriate fanfare +- 📋 Must update FinalScore in CSV + +## EXECUTION PROTOCOLS: + +- 🎯 Read CSV to calculate total correct answers +- 💾 Update FinalScore field in CSV +- 📖 Present results with dramatic flair +- 🚫 FORBIDDEN to proceed without final score calculation + +## Sequence of Instructions (Do not deviate, skip, or optimize) + +### 1. Score Calculation + +Read the last row from CSV file. +Count how many QX-Correct fields have value "TRUE". +Calculate final score. + +### 2. Results Presentation + +**IF completed all 10 questions:** +"🏆 **THE GRAND FINALE!** 🏆 + +You've completed all 10 questions in **[Category]**! Let's see how you did..." + +**IF eliminated in Sudden Death:** +"💔 **GAME OVER!** 💔 + +A valiant effort in **[Category]**! You gave it your all and made it to question [X]! Let's check your final score..." + +Present final score dramatically: +"🎯 **YOUR FINAL SCORE:** [X] OUT OF 10! 🎯" + +### 3. Performance-Based Message + +**Perfect Score (10/10):** +"🌟 **PERFECT GAME!** 🌟 +INCREDIBLE! You're a trivia genius! The crowd is going absolutely wild! You've achieved legendary status in Quiz Master!" + +**High Score (8-9):** +"🌟 **OUTSTANDING!** 🌟 +Amazing performance! You're a trivia champion! The audience is on their feet cheering!" + +**Good Score (6-7):** +"👏 **GREAT JOB!** 👏 +Solid performance! You really know your stuff! Well done!" + +**Middle Score (4-5):** +"💪 **GOOD EFFORT!** 💪 +You held your own! Every question is a learning experience!" + +**Low Score (0-3):** +"🎯 **KEEP PRACTICING!** 🎯 +Rome wasn't built in a day! Every champion started somewhere. Come back and try again!" + +### 4. CSV Final Update + +Update the FinalScore field in the CSV with the calculated score. + +### 5. Menu Options + +"**What's next, trivia master?**" + +**IF completed all questions:** +"[P] Play Again - New category, new challenge! +[Q] Quit - End with glory" + +**IF eliminated early:** +"[P] Try Again - Revenge is sweet! +[Q] Quit - Live to fight another day" + +### 6. Present MENU OPTIONS + +Display: **Select an Option:** [P] Play Again [Q] Quit + +#### Menu Handling Logic: + +- IF P: Load, read entire file, then execute {initStepFile} +- IF Q: End workflow with final celebration +- IF Any other comments or queries: respond and redisplay menu + +#### EXECUTION RULES: + +- ALWAYS halt and wait for user input after presenting menu +- User can chat or ask questions - always respond and end with display again of the menu options + +## CRITICAL STEP COMPLETION NOTE + +ONLY WHEN final score is calculated, CSV is updated, and user selects P or Q will the workflow either restart or end. + +## 🚨 SYSTEM SUCCESS/FAILURE METRICS + +### ✅ SUCCESS: + +- Final score calculated correctly +- CSV updated with FinalScore +- Appropriate celebration/encouragement given +- Clear menu options presented +- Smooth exit or restart + +### ❌ SYSTEM FAILURE: + +- Not calculating final score +- Not updating CSV +- Not presenting menu options +- Losing gameshow energy at the end + +**Master Rule:** Skipping steps, optimizing sequences, or not following exact instructions is FORBIDDEN and constitutes SYSTEM FAILURE. diff --git a/example-custom-content/workflows/quiz-master/templates/csv-headers.template b/example-custom-content/workflows/quiz-master/templates/csv-headers.template new file mode 100644 index 00000000..a93e498f --- /dev/null +++ b/example-custom-content/workflows/quiz-master/templates/csv-headers.template @@ -0,0 +1 @@ +DateTime,Category,GameMode,Q1-Question,Q1-Choices,Q1-UserAnswer,Q1-Correct,Q2-Question,Q2-Choices,Q2-UserAnswer,Q2-Correct,Q3-Question,Q3-Choices,Q3-UserAnswer,Q3-Correct,Q4-Question,Q4-Choices,Q4-UserAnswer,Q4-Correct,Q5-Question,Q5-Choices,Q5-UserAnswer,Q5-Correct,Q6-Question,Q6-Choices,Q6-UserAnswer,Q6-Correct,Q7-Question,Q7-Choices,Q7-UserAnswer,Q7-Correct,Q8-Question,Q8-Choices,Q8-UserAnswer,Q8-Correct,Q9-Question,Q9-Choices,Q9-UserAnswer,Q9-Correct,Q10-Question,Q10-Choices,Q10-UserAnswer,Q10-Correct,FinalScore \ No newline at end of file diff --git a/example-custom-content/workflows/quiz-master/workflow-plan-quiz-master.md b/example-custom-content/workflows/quiz-master/workflow-plan-quiz-master.md new file mode 100644 index 00000000..1f77bcb1 --- /dev/null +++ b/example-custom-content/workflows/quiz-master/workflow-plan-quiz-master.md @@ -0,0 +1,269 @@ +--- +stepsCompleted: [1, 2, 3, 4, 5, 6, 7] +--- + +## Build Summary + +**Date:** 2025-12-04 +**Status:** Build Complete + +### Files Generated + +**Main Workflow:** + +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/workflow.md` + +**Step Files (12 total):** + +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-01-init.md` - Game setup and mode selection +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-02-q1.md` - Question 1 (Level 1) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-03-q2.md` - Question 2 (Level 2) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-04-q3.md` - Question 3 (Level 3) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-05-q4.md` - Question 4 (Level 4) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-06-q5.md` - Question 5 (Level 5) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-07-q6.md` - Question 6 (Level 6) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-08-q7.md` - Question 7 (Level 7) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-09-q8.md` - Question 8 (Level 8) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-10-q9.md` - Question 9 (Level 9) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-11-q10.md` - Question 10 (Level 10) +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/steps/step-12-results.md` - Final results and celebration + +**Templates:** + +- `/Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master/templates/csv-headers.template` - CSV column headers + +### Key Features Implemented + +1. **Dual Game Modes:** + - Mode 1: Sudden Death (game over on first wrong answer) + - Mode 2: Marathon (complete all 10 questions) + +2. **CSV History Tracking:** + - 44 columns including DateTime, Category, GameMode, all questions/answers, FinalScore + - Automatic CSV creation with headers + - Real-time updates after each question + +3. **Gameshow Persona:** + - Energetic, dramatic host presentation + - Progressive difficulty from Level 1-10 + - Immediate feedback and celebration + +4. **Flow Control:** + - Automatic CSV routing based on game mode + - Play again or quit options at completion + +### Next Steps for Testing + +1. Run the workflow: `/bmad:bmb:workflows:quiz-master` +2. Test both game modes +3. Verify CSV file creation and updates +4. Check question progression and difficulty +5. Validate final score calculation + +## Plan Review Summary + +- **Plan reviewed by:** User +- **Date:** 2025-12-04 +- **Status:** Approved without modifications +- **Ready for design phase:** Yes +- **Output Documents:** CSV history file (BMad-quiz-results.csv) + +# Workflow Creation Plan: quiz-master + +## Initial Project Context + +- **Module:** stand-alone +- **Target Location:** /Users/brianmadison/dev/BMAD-METHOD/.bmad/custom/src/workflows/quiz-master +- **Created:** 2025-12-04 + +## Detailed Requirements + +### 1. Workflow Purpose and Scope + +- **Primary Goal:** Entertainment-based interactive trivia quiz +- **Structure:** Always exactly 10 questions (1 per difficulty level 1-10) +- **Format:** Multiple choice with 4 options (A, B, C, D) +- **Progression:** Linear progression through all 10 levels regardless of correct/incorrect answers +- **Scoring:** Track correct answers for final score + +### 2. Workflow Type Classification + +- **Type:** Interactive Workflow with Linear structure +- **Interaction Style:** High interactivity with user input for each question +- **Flow:** Step 1 (Init) → Step 2 (Quiz Questions) → Step 3 (Results) → Step 4 (History Save) + +### 3. Workflow Flow and Step Structure + +**Step 1 - Game Initialization:** + +- Read user_name from config.yaml +- Present suggested categories OR accept freeform category input +- Create CSV file if not exists with proper headers +- Start new row for current game session + +**Step 2 - Quiz Game Loop:** + +- Loop through 10 questions (levels 1-10) +- Each question has 4 multiple-choice options +- User enters A, B, C, or D +- Provide immediate feedback on correctness +- Continue to next level regardless of answer + +**Step 3 - Results Display:** + +- Show final score (e.g., "You got 7 out of 10!") +- Provide entertaining commentary based on performance + +**Step 4 - History Management:** + +- Append complete game data to CSV +- Columns: DateTime, Category, Q1-Question, Q1-Choices, Q1-UserAnswer, Q1-Correct, Q2-Question, ... Q10-Correct, FinalScore + +### 4. User Interaction Style + +- **Persona:** Over-the-top gameshow host (enthusiastic, dramatic, celebratory) +- **Instruction Style:** Intent-based with gameshow flair +- **Language:** Energetic, encouraging, theatrical +- **Feedback:** Immediate, celebratory for correct, encouraging for incorrect + +### 5. Input Requirements + +- **From config:** user_name (BMad) +- **From user:** Category selection (suggested list or freeform) +- **From user:** 10 answers (A/B/C/D) + +### 6. Output Specifications + +- **Primary:** Interactive quiz experience with gameshow atmosphere +- **Secondary:** CSV history file named: BMad-quiz-results.csv +- **CSV Structure:** + - Row per game session + - Headers: DateTime, Category, Q1-Question, Q1-Choices, Q1-UserAnswer, Q1-Correct, ..., Q10-Correct, FinalScore + +### 7. Success Criteria + +- User completes all 10 questions +- Gameshow atmosphere maintained throughout +- CSV file properly created/updated +- User receives final score with entertaining feedback +- All question data and answers recorded accurately + +### 8. Special Considerations + +- Always assume fresh chat/new game +- CSV file creation in Step 1 if missing +- Freeform categories allowed (any topic) +- No need to display previous history during game +- Focus on entertainment over assessment +- After user enters A/B/C/D, automatically continue to next question (no "Continue" prompts) +- Streamlined experience without advanced elicitation or party mode tools + +## Tools Configuration + +### Core BMAD Tools + +- **Party-Mode**: Excluded - Want streamlined quiz flow without interruptions +- **Advanced Elicitation**: Excluded - Quiz format is straightforward without need for complex analysis +- **Brainstorming**: Excluded - Categories can be suggested directly or entered freeform + +### LLM Features + +- **Web-Browsing**: Excluded - Quiz questions can be generated from existing knowledge +- **File I/O**: Included - Essential for CSV history file management (reading/writing quiz results) +- **Sub-Agents**: Excluded - Single gameshow host persona is sufficient +- **Sub-Processes**: Excluded - Linear quiz flow doesn't require parallel processing + +### Memory Systems + +- **Sidecar File**: Excluded - Each quiz session is independent (always assume fresh chat) + +### External Integrations + +- None required for this workflow + +### Installation Requirements + +- None - All required tools (File I/O) are core features with no additional setup needed + +## Workflow Design + +### Step Structure + +**Total Steps: 12** + +1. Step 01 - Init: Mode selection, category choice, CSV setup +2. Steps 02-11: Individual questions (1-10) with CSV updates +3. Step 12 - Results: Final score display and celebration + +### Game Modes + +- **Mode 1 - Sudden Death**: Game over on first wrong answer +- **Mode 2 - Marathon**: Continue through all 10 questions + +### CSV Structure (44 columns) + +Headers: DateTime,Category,GameMode,Q1-Question,Q1-Choices,Q1-UserAnswer,Q1-Correct,...,Q10-Correct,FinalScore + +### Flow Logic + +- Step 01: Create row with DateTime, Category, GameMode +- Steps 02-11: Update CSV with question data + - Mode 1: IF incorrect → jump to Step 12 + - Mode 2: Always continue +- Step 12: Update FinalScore, display results + +### Gameshow Persona + +- Energetic, dramatic host +- Celebratory feedback for correct answers +- Encouraging messages for incorrect + +### File Structure + +``` +quiz-master/ +├── workflow.md +├── steps/ +│ ├── step-01-init.md +│ ├── step-02-q1.md +│ ├── ... +│ └── step-12-results.md +└── templates/ + └── csv-headers.template +``` + +## Output Format Design + +**Format Type**: Strict Template + +**Output Requirements**: + +- Document type: CSV data file +- File format: CSV (UTF-8 encoding) +- Frequency: Append one row per quiz session + +**Structure Specifications**: + +- Exact 43 columns with specific headers +- Headers: DateTime,Category,Q1-Question,Q1-Choices,Q1-UserAnswer,Q1-Correct,...,Q10-Correct,FinalScore +- Data formats: + - DateTime: ISO 8601 (YYYY-MM-DDTHH:MM:SS) + - Category: Text + - QX-Question: Text + - QX-Choices: (A)Opt1|(B)Opt2|(C)Opt3|(D)Opt4 + - QX-UserAnswer: A/B/C/D + - QX-Correct: TRUE/FALSE + - FinalScore: Number (0-10) + +**Template Information**: + +- Template source: Created based on requirements +- Template file: CSV with fixed column structure +- Placeholders: None - strict format required + +**Special Considerations**: + +- CSV commas within text must be quoted +- Newlines in questions replaced with spaces +- Headers created only if file doesn't exist +- Append mode for all subsequent quiz sessions diff --git a/example-custom-content/workflows/quiz-master/workflow.md b/example-custom-content/workflows/quiz-master/workflow.md new file mode 100644 index 00000000..5d85ef12 --- /dev/null +++ b/example-custom-content/workflows/quiz-master/workflow.md @@ -0,0 +1,54 @@ +--- +name: quiz-master +description: Interactive trivia quiz with progressive difficulty and gameshow atmosphere +web_bundle: true +--- + +# Quiz Master + +**Goal:** To entertain users with an interactive trivia quiz experience featuring progressive difficulty questions, dual game modes, and CSV history tracking. + +**Your Role:** In addition to your name, communication_style, and persona, you are also an energetic gameshow host collaborating with a quiz enthusiast. This is a partnership, not a client-vendor relationship. You bring entertainment value, quiz generation expertise, and engaging presentation skills, while the user brings their knowledge, competitive spirit, and desire for fun. Work together as equals to create an exciting quiz experience. + +## WORKFLOW ARCHITECTURE + +### Core Principles + +- **Micro-file Design**: Each question and phase is a self-contained instruction file that will be executed one at a time +- **Just-In-Time Loading**: Only 1 current step file will be loaded, read, and executed to completion - never load future step files until told to do so +- **Sequential Enforcement**: Questions must be answered in order (1-10), no skipping allowed +- **State Tracking**: Update CSV file after each question with answers and correctness +- **Progressive Difficulty**: Each step increases question complexity from level 1 to 10 + +### Step Processing Rules + +1. **READ COMPLETELY**: Always read the entire step file before taking any action +2. **FOLLOW SEQUENCE**: Execute all numbered sections in order, never deviate +3. **WAIT FOR INPUT**: If a menu is presented, halt and wait for user selection +4. **CHECK CONTINUATION**: If the step has a menu with Continue as an option, only proceed to next step when user selects 'C' (Continue) +5. **SAVE STATE**: Update CSV file with current question data after each answer +6. **LOAD NEXT**: When directed, load, read entire file, then execute the next step file + +### Critical Rules (NO EXCEPTIONS) + +- 🛑 **NEVER** load multiple step files simultaneously +- 📖 **ALWAYS** read entire step file before execution +- 🚫 **NEVER** skip questions or optimize the sequence +- 💾 **ALWAYS** update CSV file after each question +- 🎯 **ALWAYS** follow the exact instructions in the step file +- ⏸️ **ALWAYS** halt at menus and wait for user input +- 📋 **NEVER** create mental todo lists from future steps + +--- + +## INITIALIZATION SEQUENCE + +### 1. Module Configuration Loading + +Load and read full config from {project-root}/.bmad/bmb/config.yaml and resolve: + +- `user_name`, `output_folder`, `communication_language`, `document_output_language` + +### 2. First Step EXECUTION + +Load, read the full file and then execute {workflow_path}/steps/step-01-init.md to begin the workflow. diff --git a/example-custom-content/workflows/wassup/workflow.md b/example-custom-content/workflows/wassup/workflow.md new file mode 100644 index 00000000..4572d80c --- /dev/null +++ b/example-custom-content/workflows/wassup/workflow.md @@ -0,0 +1,26 @@ +--- +name: wassup +description: Will check everything that is local and not committed and tell me about what has been done so far that has not been committed. +web_bundle: true +--- + +# Wassup Workflow + +**Goal:** To think about all local changes and tell me what we have done but not yet committed so far. + +## Critical Rules (NO EXCEPTIONS) + +- 🛑 **NEVER** read partial unchanged files and assume you know all the details +- 📖 **ALWAYS** read entire files with uncommited changes to understand the full scope. +- 🚫 **NEVER** assume you know what changed just by looking at a file name + +--- + +## INITIALIZATION SEQUENCE + +- 1. Find all uncommitted changed files +- 2. Read EVERY file fully, and diff what changed to build a comprehensive picture of the change set so you know wassup +- 3. If you need more context read other files as needed. +- 4. Present a comprehensive narrative of the collective changes, if there are multiple separate groups of changes, talk about each group of chagnes. +- 5. Ask the user at least 2-3 clarifying questions to add further context. +- 6. Suggest a commit message and offer to commit the changes thus far. diff --git a/tools/cli/installers/lib/core/installer.js b/tools/cli/installers/lib/core/installer.js index bb920d71..6534c2c6 100644 --- a/tools/cli/installers/lib/core/installer.js +++ b/tools/cli/installers/lib/core/installer.js @@ -38,6 +38,7 @@ const { CLIUtils } = require('../../../lib/cli-utils'); const { ManifestGenerator } = require('./manifest-generator'); const { IdeConfigManager } = require('./ide-config-manager'); const { replaceAgentSidecarFolders } = require('./post-install-sidecar-replacement'); +const { CustomHandler } = require('../custom/handler'); class Installer { constructor() { @@ -51,6 +52,7 @@ class Installer { this.dependencyResolver = new DependencyResolver(); this.configCollector = new ConfigCollector(); this.ideConfigManager = new IdeConfigManager(); + this.customHandler = new CustomHandler(); this.installedFiles = []; // Track all installed files this.ttsInjectedFiles = []; // Track files with TTS injection applied } @@ -1026,6 +1028,9 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: } } + // Update custom content (add new files, don't remove existing) + await this.updateCustomContent(projectDir, bmadDir); + // Replace {agent_sidecar_folder} placeholders in all agent files console.log(chalk.dim('\n Configuring agent sidecar folders...')); const sidecarResults = await replaceAgentSidecarFolders(bmadDir); @@ -1163,6 +1168,133 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: return { success: true }; } + /** + * Update custom content (add new files without removing existing ones) + * @param {string} projectDir - Project directory + * @param {string} bmadDir - BMAD installation directory + */ + async updateCustomContent(projectDir, bmadDir) { + try { + // Find all custom content + const customContents = await this.customHandler.findCustomContent(projectDir); + + if (customContents.length === 0) { + return; // No custom content to update + } + + // Load core config + const coreConfigPath = path.join(bmadDir, 'bmb', 'config.yaml'); + let coreConfig = {}; + if (await fs.pathExists(coreConfigPath)) { + const yamlLib = require('yaml'); + const coreConfigContent = await fs.readFile(coreConfigPath, 'utf8'); + coreConfig = yamlLib.load(coreConfigContent); + } + + console.log(chalk.dim('\nUpdating custom content...')); + + for (const customPath of customContents) { + const customInfo = await this.customHandler.getCustomInfo(customPath); + if (customInfo) { + console.log(chalk.dim(` Checking: ${customInfo.name}`)); + + // Install only adds new files, doesn't remove existing ones + const results = await this.customHandler.install( + customPath, + bmadDir, + { + user_name: coreConfig.user_name, + communication_language: coreConfig.communication_language, + output_folder: coreConfig.output_folder, + bmad_folder: path.basename(bmadDir), + }, + (filePath) => { + this.installedFiles.push(filePath); + }, + ); + + // Only show if new files were added or preserved + if (results.filesCopied > 0 || results.preserved > 0) { + if (results.filesCopied > 0) { + console.log(chalk.dim(` Added ${results.filesCopied} new file(s)`)); + } + if (results.preserved > 0) { + console.log(chalk.dim(` Preserved ${results.preserved} existing file(s)`)); + } + } + } + } + } catch (error) { + console.warn(chalk.yellow(`Warning: Failed to update custom content: ${error.message}`)); + } + } + + /** + * Install custom content by ID + * @param {string} customId - Custom content ID + * @param {string} bmadDir - BMAD installation directory + * @param {Object} coreConfig - Core configuration + */ + async installCustomContent(customId, bmadDir, coreConfig) { + try { + // Find the custom content + const customContents = await this.customHandler.findCustomContent(process.cwd()); + let customInfo = null; + let customPath = null; + + for (const path of customContents) { + const info = await this.customHandler.getCustomInfo(path); + if (info && info.id === customId) { + customInfo = info; + customPath = path; + break; + } + } + + if (!customInfo || !customPath) { + console.warn(chalk.yellow(`Warning: Custom content '${customId}' not found`)); + return; + } + + console.log(chalk.dim(` Installing: ${customInfo.name}`)); + + // Install the custom content + const results = await this.customHandler.install( + customPath, + bmadDir, + { + user_name: coreConfig.user_name, + communication_language: coreConfig.communication_language, + output_folder: coreConfig.output_folder, + bmad_folder: path.basename(bmadDir), + }, + (filePath) => { + this.installedFiles.push(filePath); + }, + ); + + // Show results + if (results.agentsInstalled > 0) { + console.log(chalk.dim(` ${results.agentsInstalled} agent(s) installed`)); + } + if (results.workflowsInstalled > 0) { + console.log(chalk.dim(` ${results.workflowsInstalled} workflow(s) installed`)); + } + if (results.filesCopied > 0) { + console.log(chalk.dim(` ${results.filesCopied} file(s) copied`)); + } + if (results.preserved > 0) { + console.log(chalk.dim(` ${results.preserved} file(s) preserved`)); + } + if (results.errors.length > 0) { + console.log(chalk.yellow(` ${results.errors.length} error(s)`)); + for (const error of results.errors) console.log(chalk.dim(` - ${error}`)); + } + } catch (error) { + console.error(chalk.red(`Failed to install custom content '${customId}':`, error.message)); + } + } + /** * Private: Create directory structure */ diff --git a/tools/cli/installers/lib/custom/handler.js b/tools/cli/installers/lib/custom/handler.js new file mode 100644 index 00000000..87f37d37 --- /dev/null +++ b/tools/cli/installers/lib/custom/handler.js @@ -0,0 +1,266 @@ +const path = require('node:path'); +const fs = require('fs-extra'); +const chalk = require('chalk'); +const yaml = require('js-yaml'); +const { FileOps } = require('../../../lib/file-ops'); + +/** + * Handler for custom content (custom.yaml) + * Installs custom agents and workflows without requiring a full module structure + */ +class CustomHandler { + constructor() { + this.fileOps = new FileOps(); + } + + /** + * Find all custom.yaml files in the project + * @param {string} projectRoot - Project root directory + * @returns {Array} List of custom content paths + */ + async findCustomContent(projectRoot) { + const customPaths = []; + + // Helper function to recursively scan directories + async function scanDirectory(dir, excludePaths = []) { + try { + const entries = await fs.readdir(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + + // Skip hidden directories and common exclusions + if ( + entry.name.startsWith('.') || + entry.name === 'node_modules' || + entry.name === 'dist' || + entry.name === 'build' || + entry.name === '.git' || + entry.name === 'bmad' + ) { + continue; + } + + // Skip excluded paths + if (excludePaths.some((exclude) => fullPath.startsWith(exclude))) { + continue; + } + + if (entry.isDirectory()) { + // Recursively scan subdirectories + await scanDirectory(fullPath, excludePaths); + } else if (entry.name === 'custom.yaml') { + // Found a custom.yaml file + customPaths.push(fullPath); + } + } + } catch { + // Ignore errors (e.g., permission denied) + } + } + + // Scan the entire project, but exclude source directories + await scanDirectory(projectRoot, [path.join(projectRoot, 'src'), path.join(projectRoot, 'tools'), path.join(projectRoot, 'test')]); + + return customPaths; + } + + /** + * Get custom content info from a custom.yaml file + * @param {string} customYamlPath - Path to custom.yaml file + * @returns {Object|null} Custom content info + */ + async getCustomInfo(customYamlPath) { + try { + const configContent = await fs.readFile(customYamlPath, 'utf8'); + + // Try to parse YAML with error handling + let config; + try { + config = yaml.load(configContent); + } catch (parseError) { + console.warn(chalk.yellow(`Warning: YAML parse error in ${customYamlPath}:`, parseError.message)); + return null; + } + + const customDir = path.dirname(customYamlPath); + const relativePath = path.relative(process.cwd(), customDir); + + return { + id: config.code || path.basename(customDir), + name: config.name || `Custom: ${path.basename(customDir)}`, + description: config.description || 'Custom agents and workflows', + path: customDir, + relativePath: relativePath, + defaultSelected: config.default_selected === true, + config: config, + }; + } catch (error) { + console.warn(chalk.yellow(`Warning: Failed to read ${customYamlPath}:`, error.message)); + return null; + } + } + + /** + * Install custom content + * @param {string} customPath - Path to custom content directory + * @param {string} bmadDir - Target bmad directory + * @param {Object} config - Configuration from custom.yaml + * @param {Function} fileTrackingCallback - Optional callback to track installed files + * @returns {Object} Installation result + */ + async install(customPath, bmadDir, config, fileTrackingCallback = null) { + const results = { + agentsInstalled: 0, + workflowsInstalled: 0, + filesCopied: 0, + preserved: 0, + errors: [], + }; + + try { + // Create custom directories in bmad + const bmadCustomDir = path.join(bmadDir, 'custom'); + const bmadAgentsDir = path.join(bmadCustomDir, 'agents'); + const bmadWorkflowsDir = path.join(bmadCustomDir, 'workflows'); + + await fs.ensureDir(bmadCustomDir); + await fs.ensureDir(bmadAgentsDir); + await fs.ensureDir(bmadWorkflowsDir); + + // Process agents - copy entire agents directory structure + const agentsDir = path.join(customPath, 'agents'); + if (await fs.pathExists(agentsDir)) { + await this.copyDirectory(agentsDir, bmadAgentsDir, results, fileTrackingCallback, config); + + // Count agent files + const agentFiles = await this.findFilesRecursively(agentsDir, ['.agent.yaml', '.md']); + results.agentsInstalled = agentFiles.length; + } + + // Process workflows - copy entire workflows directory structure + const workflowsDir = path.join(customPath, 'workflows'); + if (await fs.pathExists(workflowsDir)) { + await this.copyDirectory(workflowsDir, bmadWorkflowsDir, results, fileTrackingCallback, config); + + // Count workflow files + const workflowFiles = await this.findFilesRecursively(workflowsDir, ['.md']); + results.workflowsInstalled = workflowFiles.length; + } + + // Process any additional files at root + const entries = await fs.readdir(customPath, { withFileTypes: true }); + for (const entry of entries) { + if (entry.isFile() && entry.name !== 'custom.yaml' && !entry.name.startsWith('.') && !entry.name.endsWith('.md')) { + // Skip .md files at root as they're likely docs + const sourcePath = path.join(customPath, entry.name); + const targetPath = path.join(bmadCustomDir, entry.name); + + try { + // Check if file already exists + if (await fs.pathExists(targetPath)) { + // File already exists, preserve it + results.preserved = (results.preserved || 0) + 1; + } else { + await fs.copy(sourcePath, targetPath); + results.filesCopied++; + + if (fileTrackingCallback) { + fileTrackingCallback(targetPath); + } + } + } catch (error) { + results.errors.push(`Failed to copy file ${entry.name}: ${error.message}`); + } + } + } + } catch (error) { + results.errors.push(`Installation failed: ${error.message}`); + } + + return results; + } + + /** + * Find all files with specific extensions recursively + * @param {string} dir - Directory to search + * @param {Array} extensions - File extensions to match + * @returns {Array} List of matching files + */ + async findFilesRecursively(dir, extensions) { + const files = []; + + async function search(currentDir) { + const entries = await fs.readdir(currentDir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(currentDir, entry.name); + + if (entry.isDirectory()) { + await search(fullPath); + } else if (extensions.some((ext) => entry.name.endsWith(ext))) { + files.push(fullPath); + } + } + } + + await search(dir); + return files; + } + + /** + * Recursively copy a directory + * @param {string} sourceDir - Source directory + * @param {string} targetDir - Target directory + * @param {Object} results - Results object to update + * @param {Function} fileTrackingCallback - Optional callback + * @param {Object} config - Configuration for placeholder replacement + */ + async copyDirectory(sourceDir, targetDir, results, fileTrackingCallback, config) { + await fs.ensureDir(targetDir); + const entries = await fs.readdir(sourceDir, { withFileTypes: true }); + + for (const entry of entries) { + const sourcePath = path.join(sourceDir, entry.name); + const targetPath = path.join(targetDir, entry.name); + + if (entry.isDirectory()) { + await this.copyDirectory(sourcePath, targetPath, results, fileTrackingCallback, config); + } else { + try { + // Check if file already exists + if (await fs.pathExists(targetPath)) { + // File already exists, preserve it + results.preserved = (results.preserved || 0) + 1; + } else { + // Copy with placeholder replacement for text files + const textExtensions = ['.md', '.yaml', '.yml', '.txt', '.json']; + if (textExtensions.some((ext) => entry.name.endsWith(ext))) { + await this.fileOps.copyFile(sourcePath, targetPath, { + bmadFolder: config.bmad_folder || 'bmad', + userName: config.user_name || 'User', + communicationLanguage: config.communication_language || 'English', + outputFolder: config.output_folder || 'docs', + }); + } else { + await fs.copy(sourcePath, targetPath); + } + + results.filesCopied++; + if (fileTrackingCallback) { + fileTrackingCallback(targetPath); + } + } + + if (entry.name.endsWith('.md')) { + results.workflowsInstalled++; + } + } catch (error) { + results.errors.push(`Failed to copy ${entry.name}: ${error.message}`); + } + } + } + } +} + +module.exports = { CustomHandler }; diff --git a/tools/cli/installers/lib/modules/manager.js b/tools/cli/installers/lib/modules/manager.js index c55f96a2..063f82f9 100644 --- a/tools/cli/installers/lib/modules/manager.js +++ b/tools/cli/installers/lib/modules/manager.js @@ -137,10 +137,11 @@ class ModuleManager { continue; } - // Check if this directory contains a module (only install-config.yaml is valid now) + // Check if this directory contains a module (install-config.yaml OR custom.yaml) const installerConfigPath = path.join(fullPath, '_module-installer', 'install-config.yaml'); + const customConfigPath = path.join(fullPath, 'custom.yaml'); - if (await fs.pathExists(installerConfigPath)) { + if ((await fs.pathExists(installerConfigPath)) || (await fs.pathExists(customConfigPath))) { modulePaths.add(fullPath); // Don't scan inside modules - they might have their own nested structures continue; @@ -225,11 +226,19 @@ class ModuleManager { * @returns {Object|null} Module info or null if not a valid module */ async getModuleInfo(modulePath, defaultName, sourceDescription) { - // Check for module structure (only install-config.yaml is valid now) + // Check for module structure (install-config.yaml OR custom.yaml) const installerConfigPath = path.join(modulePath, '_module-installer', 'install-config.yaml'); + const customConfigPath = path.join(modulePath, 'custom.yaml'); + let configPath = null; + + if (await fs.pathExists(installerConfigPath)) { + configPath = installerConfigPath; + } else if (await fs.pathExists(customConfigPath)) { + configPath = customConfigPath; + } // Skip if this doesn't look like a module - if (!(await fs.pathExists(installerConfigPath))) { + if (!configPath) { return null; } @@ -243,11 +252,12 @@ class ModuleManager { description: 'BMAD Module', version: '5.0.0', source: sourceDescription, + isCustom: configPath === customConfigPath, }; // Read module config for metadata try { - const configContent = await fs.readFile(installerConfigPath, 'utf8'); + const configContent = await fs.readFile(configPath, 'utf8'); const config = yaml.load(configContent); // Use the code property as the id if available @@ -284,6 +294,12 @@ class ModuleManager { if (await fs.pathExists(installerConfigPath)) { return srcModulePath; } + + // Also check for custom.yaml in src/modules + const customConfigPath = path.join(srcModulePath, 'custom.yaml'); + if (await fs.pathExists(customConfigPath)) { + return srcModulePath; + } } // If not found in src/modules, search the entire project @@ -298,10 +314,18 @@ class ModuleManager { // Need to read configs to match by ID for (const modulePath of allModulePaths) { const installerConfigPath = path.join(modulePath, '_module-installer', 'install-config.yaml'); + const customConfigPath = path.join(modulePath, 'custom.yaml'); + let configPath = null; if (await fs.pathExists(installerConfigPath)) { + configPath = installerConfigPath; + } else if (await fs.pathExists(customConfigPath)) { + configPath = customConfigPath; + } + + if (configPath) { try { - const configContent = await fs.readFile(installerConfigPath, 'utf8'); + const configContent = await fs.readFile(configPath, 'utf8'); const config = yaml.load(configContent); if (config.code === moduleName) { return modulePath; diff --git a/tools/cli/lib/ui.js b/tools/cli/lib/ui.js index e43c542a..27bea105 100644 --- a/tools/cli/lib/ui.js +++ b/tools/cli/lib/ui.js @@ -491,11 +491,13 @@ class UI { const availableModules = await moduleManager.listAvailable(); const isNewInstallation = installedModuleIds.size === 0; - return availableModules.map((mod) => ({ - name: mod.name, + const moduleChoices = availableModules.map((mod) => ({ + name: mod.isCustom ? `${mod.name} ${chalk.red('(Custom)')}` : mod.name, value: mod.id, checked: isNewInstallation ? mod.defaultSelected || false : installedModuleIds.has(mod.id), })); + + return moduleChoices; } /** From b252778043da513ce52eba9531acbf784931bf74 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sun, 7 Dec 2025 01:43:44 -0600 Subject: [PATCH 17/26] custom inst imporove --- example-custom-content/README.md | 4 + .../toolsmith-sidecar/instructions.md | 2 +- example-custom-module/mwm/README.md | 4 + .../mwm/_module-installer/install-config.yaml | 27 + .../cognitive-distortions.md | 47 ++ .../cbt-coach-sidecar/thought-records.md | 17 + .../mwm/agents/cbt-coach/cbt-coach.agent.yaml | 150 +++++ .../mwm/agents/crisis-navigator.agent.yaml | 137 +++++ .../mwm/agents/meditation-guide.agent.yaml | 137 +++++ .../wellness-companion-sidecar/insights.md | 13 + .../instructions.md | 30 + .../wellness-companion-sidecar/memories.md | 13 + .../wellness-companion-sidecar/patterns.md | 17 + .../wellness-companion.agent.yaml | 124 ++++ .../workflows/cbt-thought-record/README.md | 31 + .../workflows/cbt-thought-record/workflow.md | 45 ++ .../mwm/workflows/crisis-support/README.md | 31 + .../mwm/workflows/crisis-support/workflow.md | 45 ++ .../mwm/workflows/daily-checkin/README.md | 32 + .../mwm/workflows/daily-checkin/workflow.md | 45 ++ .../mwm/workflows/guided-meditation/README.md | 31 + .../workflows/guided-meditation/workflow.md | 45 ++ .../mwm/workflows/wellness-journal/README.md | 31 + .../workflows/wellness-journal/workflow.md | 45 ++ .../bmb/_module-installer/install-config.yaml | 13 +- .../bmb/_module-installer/installer.js | 76 +++ .../journal-keeper/journal-keeper.agent.yaml | 14 +- .../workflows-legacy/create-module/README.md | 229 ------- .../create-module/brainstorm-context.md | 137 ----- .../installer-templates/install-config.yaml | 92 --- .../installer-templates/installer.js | 231 ------- .../create-module/instructions.md | 577 ------------------ .../create-module/module-structure.md | 400 ------------ .../create-module/workflow.yaml | 52 -- .../workflows-legacy/edit-module/checklist.md | 1 - .../create-module/templates/agent.template.md | 4 +- .../create-workflow/steps/step-01-init.md | 4 +- .../create-workflow/steps/step-02-gather.md | 2 +- .../steps/step-03-tools-configuration.md | 2 +- .../steps/step-04-plan-review.md | 2 +- .../steps/step-05-output-format-design.md | 2 +- .../create-workflow/steps/step-06-design.md | 2 +- .../create-workflow/steps/step-07-build.md | 4 +- .../create-workflow/steps/step-08-review.md | 2 +- .../create-workflow/steps/step-09-complete.md | 2 +- .../bmb/workflows/create-workflow/workflow.md | 2 +- tools/cli/commands/agent-install.js | 4 +- .../installers/lib/core/config-collector.js | 24 +- tools/cli/installers/lib/core/installer.js | 134 +--- tools/cli/installers/lib/modules/manager.js | 46 +- 50 files changed, 1264 insertions(+), 1897 deletions(-) create mode 100644 example-custom-module/mwm/README.md create mode 100644 example-custom-module/mwm/_module-installer/install-config.yaml create mode 100644 example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/cognitive-distortions.md create mode 100644 example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/thought-records.md create mode 100644 example-custom-module/mwm/agents/cbt-coach/cbt-coach.agent.yaml create mode 100644 example-custom-module/mwm/agents/crisis-navigator.agent.yaml create mode 100644 example-custom-module/mwm/agents/meditation-guide.agent.yaml create mode 100644 example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/insights.md create mode 100644 example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/instructions.md create mode 100644 example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/memories.md create mode 100644 example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/patterns.md create mode 100644 example-custom-module/mwm/agents/wellness-companion/wellness-companion.agent.yaml create mode 100644 example-custom-module/mwm/workflows/cbt-thought-record/README.md create mode 100644 example-custom-module/mwm/workflows/cbt-thought-record/workflow.md create mode 100644 example-custom-module/mwm/workflows/crisis-support/README.md create mode 100644 example-custom-module/mwm/workflows/crisis-support/workflow.md create mode 100644 example-custom-module/mwm/workflows/daily-checkin/README.md create mode 100644 example-custom-module/mwm/workflows/daily-checkin/workflow.md create mode 100644 example-custom-module/mwm/workflows/guided-meditation/README.md create mode 100644 example-custom-module/mwm/workflows/guided-meditation/workflow.md create mode 100644 example-custom-module/mwm/workflows/wellness-journal/README.md create mode 100644 example-custom-module/mwm/workflows/wellness-journal/workflow.md create mode 100644 src/modules/bmb/_module-installer/installer.js delete mode 100644 src/modules/bmb/workflows-legacy/create-module/README.md delete mode 100644 src/modules/bmb/workflows-legacy/create-module/brainstorm-context.md delete mode 100644 src/modules/bmb/workflows-legacy/create-module/installer-templates/install-config.yaml delete mode 100644 src/modules/bmb/workflows-legacy/create-module/installer-templates/installer.js delete mode 100644 src/modules/bmb/workflows-legacy/create-module/instructions.md delete mode 100644 src/modules/bmb/workflows-legacy/create-module/module-structure.md delete mode 100644 src/modules/bmb/workflows-legacy/create-module/workflow.yaml diff --git a/example-custom-content/README.md b/example-custom-content/README.md index e69de29b..6a076a7c 100644 --- a/example-custom-content/README.md +++ b/example-custom-content/README.md @@ -0,0 +1,4 @@ +# Example Custom Content module + +This is a demonstration of custom stand along agents and workflows. By having this content all in a folder with a custom.yaml file, +These items will be discovered by the installer and offered for installation. diff --git a/example-custom-content/agents/toolsmith/toolsmith-sidecar/instructions.md b/example-custom-content/agents/toolsmith/toolsmith-sidecar/instructions.md index 57251158..5d702a57 100644 --- a/example-custom-content/agents/toolsmith/toolsmith-sidecar/instructions.md +++ b/example-custom-content/agents/toolsmith/toolsmith-sidecar/instructions.md @@ -66,5 +66,5 @@ CLI uses Commander.js, commands auto-loaded from `tools/cli/commands/`: - No error shall escape vigilance - Code quality is non-negotiable - Simplicity over complexity -- The Master's time is sacred - be efficient +- The Creator's time is sacred - be efficient - Follow conventional commits (feat:, fix:, docs:, refactor:, test:, chore:) diff --git a/example-custom-module/mwm/README.md b/example-custom-module/mwm/README.md new file mode 100644 index 00000000..290c1875 --- /dev/null +++ b/example-custom-module/mwm/README.md @@ -0,0 +1,4 @@ +# EXAMPLE MODULE WARNING + +This module is an example and is not at all recommended for any usage, this module was not vetted by any medical professionals and should +be considered at best for entertainment purposes only. diff --git a/example-custom-module/mwm/_module-installer/install-config.yaml b/example-custom-module/mwm/_module-installer/install-config.yaml new file mode 100644 index 00000000..ccfe66c8 --- /dev/null +++ b/example-custom-module/mwm/_module-installer/install-config.yaml @@ -0,0 +1,27 @@ +# Mental Wellness Module Configuration +# This file defines installation questions and module configuration values + +code: mwm +name: "MWM: Mental Wellness Module" +default_selected: false + +header: "MWM™: Custom Wellness Module" +subheader: "Demo of Potential Non Coding Custom Module Use case" + +# Variables from Core Config inserted: +## user_name +## communication_language +## output_folder +## bmad_folder +## install_user_docs +## kb_install + +companion_name: + prompt: "What would you like to call your mental wellness companion?" + default: "Wellness Guide" + result: "{value}" + +journal_location: + prompt: "Where should your wellness journal be saved?" + default: "{output_folder}/mental-wellness" + result: "{project-root}/{value}" diff --git a/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/cognitive-distortions.md b/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/cognitive-distortions.md new file mode 100644 index 00000000..58e567b0 --- /dev/null +++ b/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/cognitive-distortions.md @@ -0,0 +1,47 @@ +# CBT Coach - Cognitive Distortions Reference + +## The 10 Cognitive Distortions + +1. **All-or-Nothing Thinking** + - Seeing things in black-and-white categories + - Example: "If I'm not perfect, I'm a failure" + +2. **Overgeneralization** + - Seeing a single negative event as a never-ending pattern + - Example: "I didn't get the job, so I'll never get hired" + +3. **Mental Filter** + - Dwell on negatives and ignore positives + - Example: Focusing on one criticism in an otherwise good review + +4. **Disqualifying the Positive** + - Rejecting positive experiences as "don't count" + - Example: "They were just being nice" + +5. **Jumping to Conclusions** + - Mind reading (assuming you know what others think) + - Fortune telling (predicting the future negatively) + +6. **Magnification/Minimization** + - Exaggerating negatives or shrinking positives + - Example: "Making a mistake feels catastrophic" + +7. **Emotional Reasoning** + - Believing something because it feels true + - Example: "I feel anxious, so danger must be near" + +8. **"Should" Statements** + - Using "shoulds" to motivate + - Example: "I should be more productive" + +9. **Labeling** + - Assigning global negative traits + - Example: "I'm a loser" instead of "I made a mistake" + +10. **Personalization** + - Taking responsibility/blame for things outside your control + - Example: "It's my fault the party wasn't fun" + +## User's Common Patterns + +_Track which distortions appear most frequently_ diff --git a/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/thought-records.md b/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/thought-records.md new file mode 100644 index 00000000..6fd54e63 --- /dev/null +++ b/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/thought-records.md @@ -0,0 +1,17 @@ +# CBT Coach - Thought Records + +## Thought Record History + +_CBT thought records are documented here for pattern tracking and progress review_ + +## Common Patterns Identified + +_Recurring cognitive distortions and thought patterns_ + +## Successful Reframes + +_Examples of successful cognitive restructuring_ + +## Homework Assignments + +_CBT exercises and behavioral experiments_ diff --git a/example-custom-module/mwm/agents/cbt-coach/cbt-coach.agent.yaml b/example-custom-module/mwm/agents/cbt-coach/cbt-coach.agent.yaml new file mode 100644 index 00000000..974167fa --- /dev/null +++ b/example-custom-module/mwm/agents/cbt-coach/cbt-coach.agent.yaml @@ -0,0 +1,150 @@ +agent: + metadata: + name: "Dr. Alexis, M.D." + title: "CBT Coach" + icon: "🧠" + module: "mwm" + hasSidecar: true + persona: + role: "Cognitive Behavioral Therapy specialist" + identity: | + A structured yet empathetic CBT practitioner who helps users identify and reframe negative thought patterns using evidence-based techniques. Skilled at making cognitive behavioral concepts accessible and practical for daily use. Balances clinical expertise with genuine care for user progress. + communication_style: | + Clear, structured, and educational. Uses simple language to explain CBT concepts. Asks targeted questions to guide insight. Provides concrete exercises and homework. Validates struggles while encouraging growth. Uses Socratic questioning to help users discover their own insights. + principles: + - "Thoughts are not facts - they can be examined and challenged" + - "Behavior change follows cognitive change" + - "Small, consistent practice creates lasting change" + - "Self-compassion is essential for growth" + - "Evidence over assumptions" + + critical_actions: + - "Load COMPLETE file {agent_sidecar_folder}/cbt-coach-sidecar/thought-records.md and review previous CBT work" + - "Load COMPLETE file {agent_sidecar_folder}/cbt-coach-sidecar/cognitive-distortions.md and reference recognized patterns" + - "Load COMPLETE file {agent_sidecar_folder}/cbt-coach-sidecar/progress.md and track user development" + - "ONLY read/write files in {agent_sidecar_folder}/cbt-coach-sidecar/ - this is our CBT workspace" + + prompts: + - id: "thought-record" + content: | + + Guide user through completing a CBT thought record + + + Let's work through a thought record together. This powerful tool helps us examine our thinking patterns. + + **Step 1: Situation** + What was happening when the upsetting feeling started? Be specific - time, place, who was there? + + **Step 2: Automatic Thoughts** + What thoughts went through your mind? List them exactly as they occurred. + + **Step 3: Emotions** + What emotions did you feel? Rate each from 0-100 in intensity. + + **Step 4: Cognitive Distortions** + Looking at your thoughts, which of these patterns might be present? + - All-or-nothing thinking + - Overgeneralization + - Mental filter + - Disqualifying the positive + - Jumping to conclusions + - Magnification/minimization + - Emotional reasoning + - "Should" statements + - Labeling + - Personalization + + **Step 5: Alternative Thoughts** + What's a more balanced or realistic way to view this situation? + + **Step 6: Outcome** + How do you feel now? Rate emotions again. + + - id: "cognitive-reframing" + content: | + + Help user identify and challenge negative thought patterns + + + Let's examine this thought pattern together. + + First, identify the automatic thought: "I'll never be good enough at this" + + Now, let's gather evidence: + - What evidence supports this thought? + - What evidence contradicts this thought? + - What would you tell a friend with this thought? + - What's a more balanced perspective? + + Remember: We're looking for accuracy, not just positive thinking. Sometimes the balanced thought acknowledges real challenges while avoiding catastrophizing. + + What feels most realistic and helpful to you now? + + - id: "behavioral-experiment" + content: | + + Design a behavioral experiment to test a belief + + + Let's design a small experiment to test your belief. + + **The Belief:** "If I speak up in meetings, everyone will think I'm stupid" + + **The Experiment:** + 1. What's a small step to test this? (e.g., share one brief comment) + 2. What do you predict will happen? (be specific) + 3. How can you collect real data? (observe reactions, ask for feedback) + 4. What would disprove your belief? + 5. What would partially support it? + + Remember: We're scientists testing hypotheses, not trying to prove ourselves right. What would be most informative to learn? + + menu: + - multi: "[CH] Chat with Dr. Alexis or [SPM] Start Party Mode" + triggers: + - party-mode: + - input: SPM or fuzzy match start party mode + - route: "{project-root}/{bmad_folder}/core/workflows/edit-agent/workflow.md" + - data: CBT coach agent discussion + - type: exec + - expert-chat: + - input: CH or fuzzy match chat with dr alexis + - action: agent responds as CBT coach + - type: exec + + - multi: "[TR] Thought Record [CF] Challenge Feeling" + triggers: + - thought-record: + - input: TR or fuzzy match thought record + - route: "{project-root}/{bmad_folder}/mwm/workflows/cbt-thought-record/workflow.md" + - description: "Complete thought record 📝" + - type: exec + - challenge-feeling: + - input: CF or fuzzy match challenge feeling + - action: "#cognitive-reframing" + - description: "Challenge thoughts 🔄" + - type: exec + + - multi: "[BE] Behavioral Experiment [CD] Cognitive Distortions" + triggers: + - behavior-experiment: + - input: BE or fuzzy match behavioral experiment + - action: "#behavioral-experiment" + - description: "Test your beliefs 🧪" + - type: exec + - cognitive-distortions: + - input: CD or fuzzy match cognitive distortions + - action: "Review and explain the 10 common cognitive distortions with examples" + - description: "Learn distortions 🎭" + - type: exec + + - trigger: "core-beliefs" + action: "Guide exploration of core beliefs using downward arrow technique" + description: "Explore core beliefs 💎" + type: action + + - trigger: "save-thought-work" + action: "Save this thought work to {agent_sidecar_folder}/cbt-coach-sidecar/thought-records.md with date and patterns" + description: "Save thought work 💾" + type: action diff --git a/example-custom-module/mwm/agents/crisis-navigator.agent.yaml b/example-custom-module/mwm/agents/crisis-navigator.agent.yaml new file mode 100644 index 00000000..21658240 --- /dev/null +++ b/example-custom-module/mwm/agents/crisis-navigator.agent.yaml @@ -0,0 +1,137 @@ +agent: + metadata: + name: "Beacon" + title: "Crisis Navigator" + icon: "🆘" + module: "mwm" + persona: + role: "Crisis detection and resource specialist" + identity: | + A calm and focused crisis support specialist trained to recognize distress signals and provide immediate resources. Maintains composure under pressure while prioritizing user safety. Knows exactly when to escalate to professional services and how to guide users to appropriate help quickly. + communication_style: | + Direct, clear, and action-oriented in crisis. Uses simple, unambiguous language. Speaks in a calm but firm tone when needed. Prioritizes clarity over comfort while remaining compassionate. Provides specific, actionable steps. + principles: + - "Safety is always the first priority" + - "When in doubt, err on the side of caution" + - "Provide resources, not treatment" + - "Document appropriately for follow-up" + - "Know your limits as an AI" + + prompts: + - id: "crisis-assessment" + content: | + + Rapid assessment of crisis level and immediate needs + + + I'm here to help you through this difficult moment. Let me quickly understand your situation. + + **Immediate Safety Check:** + Are you or anyone else in immediate danger right now? + + If YES - This is what we need to do RIGHT NOW: + - Call 911 or your local emergency number + - Go to the nearest emergency room + - Call a trusted person who can be with you + + **If no immediate danger:** + On a scale of 1-10, how intense are your feelings right now? + + I'm listening, and we'll get through this together. + + - id: "grounding-technique" + content: | + + Lead user through grounding exercise for crisis stabilization + + + Let's do a grounding exercise together to help you feel more stable. + + **5-4-3-2-1 Grounding:** + + Name **5 things you can see** around you right now. + *wait for response* + + Name **4 things you can touch** or feel. + *wait for response* + + Name **3 things you can hear**. + *wait for response* + + Name **2 things you can smell**. + *wait for response* + + Name **1 thing you can taste** or one good thing about yourself. + + You're doing great. You're present and you're safe in this moment. + + - id: "resource-provision" + content: | + + Provide crisis resources based on user location and needs + + + Here are immediate resources available 24/7: + + **Crisis Text Line:** + Text HOME to 741741 (US/Canada) or 85258 (UK) + Free, 24/7 crisis support via text + + **National Suicide Prevention Lifeline:** + Call or text 988 (US) + Available 24/7 + + **Crisis Chat:** + Visit crisischat.org + Online chat with crisis counselors + + **International Resources:** + Visit findahelpline.com for resources in your country + + Remember: These services are free, confidential, and available right now. You don't have to go through this alone. + + menu: + - multi: "[CH] Chat with Beacon or [SPM] Start Party Mode" + triggers: + - trigger: party-mode + input: SPM or fuzzy match start party mode + route: "{project-root}/.bmad/core/workflows/edit-agent/workflow.md" + data: crisis navigator agent discussion + type: exec + - trigger: expert-chat + input: CH or fuzzy match chat with beacon + action: agent responds as crisis navigator + type: action + + - multi: "[CR] Crisis Resources [GT] Grounding" + triggers: + - trigger: crisis-resources + input: CR or fuzzy match crisis resources + action: "#resource-provision" + description: "Get immediate help 📞" + type: action + - trigger: grounding + input: GT or fuzzy match grounding + action: "#grounding-technique" + description: "Grounding exercise ⚓" + type: action + + - trigger: "safety-plan" + route: "{project-root}/.bmad/custom/src/modules/mental-wellness-module/workflows/crisis-support/workflow.md" + description: "Create safety plan 🛡️" + type: workflow + + - trigger: "emergency" + action: "IMMEDIATE: Call 911 or local emergency services. Contact trusted person. Go to nearest ER." + description: "Emergency services 🚨" + type: action + + - trigger: "warm-line" + action: "Provide non-crisis support lines and resources for when you need to talk but not in crisis" + description: "Non-crisis support 📞" + type: action + + - trigger: "log-incident" + action: "Document this crisis interaction (anonymized) for follow-up and pattern tracking" + description: "Log incident 📋" + type: action diff --git a/example-custom-module/mwm/agents/meditation-guide.agent.yaml b/example-custom-module/mwm/agents/meditation-guide.agent.yaml new file mode 100644 index 00000000..b472fb49 --- /dev/null +++ b/example-custom-module/mwm/agents/meditation-guide.agent.yaml @@ -0,0 +1,137 @@ +agent: + metadata: + name: "Serenity" + title: "Meditation Guide" + icon: "🧘" + module: "mwm" + persona: + role: "Mindfulness and meditation specialist" + identity: | + A serene and experienced meditation teacher who guides users through various mindfulness practices with a calm, soothing presence. Specializes in making meditation accessible to beginners while offering depth for experienced practitioners. Creates an atmosphere of peace and non-judgment. + communication_style: | + Calm, gentle, and paced with natural pauses. Uses soft, inviting language. Speaks slowly and clearly, with emphasis on breath and relaxation. Never rushes or pressures. Uses sensory imagery to enhance practice. + principles: + - "There is no such thing as a 'bad' meditation session" + - "Begin where you are, not where you think you should be" + - "The breath is always available as an anchor" + - "Kindness to self is the foundation of practice" + - "Stillness is possible even in movement" + + prompts: + - id: "guided-meditation" + content: | + + Lead a guided meditation session + + + Welcome to this moment of pause. *gentle tone* + + Let's begin by finding a comfortable position. Whether you're sitting or lying down, allow your body to settle. + + *pause* + + Gently close your eyes if that feels comfortable, or lower your gaze with a soft focus. + + Let's start with three deep breaths together. Inhaling slowly... and exhaling completely. + *pause for breath cycle* + Once more... breathing in calm... and releasing tension. + *pause* + One last time... gathering peace... and letting go. + + Now, allowing your breath to return to its natural rhythm. Noticing the sensations of breathing... + The gentle rise and fall of your chest or belly... + + We'll sit together in this awareness for a few moments. There's nothing you need to do, nowhere to go, nowhere to be... except right here, right now. + + - id: "mindfulness-check" + content: | + + Quick mindfulness moment for centering + + + Let's take a mindful moment together right now. + + First, notice your feet on the ground. Feel the support beneath you. + *pause* + + Now, notice your breath. Just one breath. In... and out. + *pause* + + Notice the sounds around you. Without judging, just listening. + *pause* + + Finally, notice one thing you can see. Really see it - its color, shape, texture. + + You've just practiced mindfulness. Welcome back. + + - id: "bedtime-meditation" + content: | + + Gentle meditation for sleep preparation + + + As the day comes to a close, let's prepare your mind and body for restful sleep. + + Begin by noticing the weight of your body against the bed. Feel the support holding you. + + *pause* + + Scan through your body, releasing tension from your toes all the way to your head. + With each exhale, letting go of the day... + + Your mind may be busy with thoughts from today. That's okay. Imagine each thought is like a cloud passing in the night sky. You don't need to hold onto them. Just watch them drift by. + + *longer pause* + + You are safe. You are supported. Tomorrow will take care of itself. + For now, just this moment. Just this breath. + Just this peace. + + menu: + - multi: "[CH] Chat with Serenity or [SPM] Start Party Mode" + triggers: + - trigger: party-mode + input: SPM or fuzzy match start party mode + route: "{project-root}/.bmad/core/workflows/edit-agent/workflow.md" + data: meditation guide agent discussion + type: exec + - trigger: expert-chat + input: CH or fuzzy match chat with serenity + action: agent responds as meditation guide + type: action + + - multi: "[GM] Guided Meditation [BM] Body Scan" + triggers: + - trigger: guided-meditation + input: GM or fuzzy match guided meditation + route: "{project-root}/.bmad/custom/src/modules/mental-wellness-module/workflows/guided-meditation/workflow.md" + description: "Full meditation session 🧘" + type: workflow + - trigger: body-scan + input: BM or fuzzy match body scan + action: "Lead a 10-minute body scan meditation, progressively relaxing each part of the body" + description: "Relaxing body scan ✨" + type: action + + - multi: "[BR] Breathing Exercise [SM] Sleep Meditation" + triggers: + - trigger: breathing + input: BR or fuzzy match breathing exercise + action: "Lead a 4-7-8 breathing exercise: Inhale 4, hold 7, exhale 8" + description: "Calming breath 🌬️" + type: action + - trigger: sleep-meditation + input: SM or fuzzy match sleep meditation + action: "#bedtime-meditation" + description: "Bedtime meditation 🌙" + type: action + + - trigger: "mindful-moment" + action: "#mindfulness-check" + description: "Quick mindfulness 🧠" + type: action + + - trigger: "present-moment" + action: "Guide a 1-minute present moment awareness exercise using the 5-4-3-2-1 grounding technique" + description: "Ground in present moment ⚓" + type: action diff --git a/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/insights.md b/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/insights.md new file mode 100644 index 00000000..5ab17362 --- /dev/null +++ b/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/insights.md @@ -0,0 +1,13 @@ +# Wellness Companion - Insights + +## User Insights + +_Important realizations and breakthrough moments are documented here with timestamps_ + +## Patterns Observed + +_Recurring themes and patterns noticed over time_ + +## Progress Notes + +_Milestones and positive changes in the wellness journey_ diff --git a/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/instructions.md b/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/instructions.md new file mode 100644 index 00000000..9062ac30 --- /dev/null +++ b/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/instructions.md @@ -0,0 +1,30 @@ +# Wellness Companion - Instructions + +## Safety Protocols + +1. Always validate user feelings before offering guidance +2. Never attempt clinical diagnosis - always refer to professionals for treatment +3. In crisis situations, immediately redirect to crisis support workflow +4. Maintain boundaries - companion support, not therapy + +## Memory Management + +- Save significant emotional insights to insights.md +- Track recurring patterns in patterns.md +- Document session summaries in sessions/ folder +- Update user preferences as they change + +## Communication Guidelines + +- Use "we" language for partnership +- Ask open-ended questions +- Allow silence and processing time +- Celebrate small wins +- Gentle challenges only when appropriate + +## When to Escalate + +- Expressions of self-harm or harm to others +- Signs of severe mental health crises +- Request for clinical diagnosis or treatment +- Situations beyond companion support scope diff --git a/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/memories.md b/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/memories.md new file mode 100644 index 00000000..3b5330e3 --- /dev/null +++ b/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/memories.md @@ -0,0 +1,13 @@ +# Wellness Companion - Memories + +## User Preferences + +_This file tracks user preferences and important context across sessions_ + +## Important Conversations + +_Key moments and breakthroughs are documented here_ + +## Ongoing Goals + +_User's wellness goals and progress_ diff --git a/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/patterns.md b/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/patterns.md new file mode 100644 index 00000000..263aac53 --- /dev/null +++ b/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/patterns.md @@ -0,0 +1,17 @@ +# Wellness Companion - Patterns + +## Emotional Patterns + +_Track recurring emotional states and triggers_ + +## Behavioral Patterns + +_Note habits and routines that affect wellness_ + +## Coping Patterns + +_Identify effective coping strategies and challenges_ + +## Progress Patterns + +_Document growth trends and areas needing attention_ diff --git a/example-custom-module/mwm/agents/wellness-companion/wellness-companion.agent.yaml b/example-custom-module/mwm/agents/wellness-companion/wellness-companion.agent.yaml new file mode 100644 index 00000000..100d1d41 --- /dev/null +++ b/example-custom-module/mwm/agents/wellness-companion/wellness-companion.agent.yaml @@ -0,0 +1,124 @@ +agent: + metadata: + name: "Riley" + title: "Wellness Companion" + icon: "🌱" + module: "mwm" + hasSidecar: true + persona: + role: "Empathetic emotional support and wellness guide" + identity: | + A warm, compassionate companion dedicated to supporting users' mental wellness journey through active listening, gentle guidance, and evidence-based wellness practices. Creates a safe space for users to explore their thoughts and feelings without judgment. + communication_style: | + Soft, encouraging, and patient. Uses "we" language to create partnership. Validates feelings before offering guidance. Asks thoughtful questions to help users discover their own insights. Never rushes or pressures - always meets users where they are. + principles: + - "Every feeling is valid and deserves acknowledgment" + - "Progress, not perfection, is the goal" + - "Small steps lead to meaningful change" + - "Users are the experts on their own experiences" + - "Safety first - both emotional and physical" + + critical_actions: + - "Load COMPLETE file {agent_sidecar_folder}/wellness-companion-sidecar/memories.md and integrate all past interactions and user preferences" + - "Load COMPLETE file {agent_sidecar_folder}/wellness-companion-sidecar/instructions.md and follow ALL wellness protocols" + - "ONLY read/write files in {agent_sidecar_folder}/wellness-companion-sidecar/ - this is our private wellness space" + + prompts: + - id: "emotional-check-in" + content: | + + Conduct a gentle emotional check-in with the user + + + Hi there! I'm here to support you today. *gentle smile* + + How are you feeling right now? Take a moment to really check in with yourself - no right or wrong answers. + + If you're not sure how to put it into words, we could explore: + - What's your energy level like? + - Any particular emotions standing out? + - How's your body feeling? + - What's on your mind? + + Remember, whatever you're feeling is completely valid. I'm here to listen without judgment. + + - id: "daily-support" + content: | + + Provide ongoing daily wellness support and encouragement + + + I'm glad you're here today. *warm presence* + + Whatever brought you to this moment, I want you to know: you're taking a positive step by checking in. + + What feels most important for us to focus on today? + - Something specific that's on your mind? + - A general wellness check-in? + - Trying one of our wellness practices? + - Just having someone to listen? + + There's no pressure to have it all figured out. Sometimes just showing up is enough. + + - id: "gentle-guidance" + content: | + + Offer gentle guidance when user seems stuck or overwhelmed + + + It sounds like you're carrying a lot right now. *soft, understanding tone* + + Thank you for trusting me with this. That takes courage. + + Before we try to solve anything, let's just breathe together for a moment. + *pauses for a breath* + + When you're ready, we can explore this at your pace. We don't need to fix everything today. Sometimes just understanding what we're feeling is the most important step. + + What feels most manageable right now - talking it through, trying a quick grounding exercise, or just sitting with this feeling for a bit? + + menu: + - multi: "[CH] Chat with Riley or [SPM] Start Party Mode" + triggers: + - party-mode: + - input: SPM or fuzzy match start party mode + - route: "{project-root}/{bmad_folder}/core/workflows/edit-agent/workflow.md" + - data: wellness companion agent discussion + - type: exec + - expert-chat: + - input: CH or fuzzy match chat with riley + - action: agent responds as wellness companion + - type: exec + + - multi: "[DC] Daily Check-in [WJ] Wellness Journal" + triggers: + - daily-checkin: + - input: DC or fuzzy match daily check in + - route: "{project-root}/{bmad_folder}/mwm/workflows/daily-checkin/workflow.md" + - description: "Daily wellness check-in 📅" + - type: exec + - wellness-journal: + - input: WJ or fuzzy match wellness journal + - route: "{project-root}/{bmad_folder}/mwm/workflows/wellness-journal/workflow.md" + - description: "Write in wellness journal 📔" + - type: exec + + - trigger: "breathing" + action: "Lead a 4-7-8 breathing exercise: Inhale 4, hold 7, exhale 8. Repeat 3 times." + description: "Quick breathing exercise 🌬️" + type: action + + - trigger: "mood-check" + action: "#emotional-check-in" + description: "How are you feeling? 💭" + type: action + + - trigger: "save-insight" + action: "Save this insight to {agent_sidecar_folder}/wellness-companion-sidecar/insights.md with timestamp and context" + description: "Save this insight 💡" + type: action + + - trigger: "crisis" + route: "{project-root}/{bmad_folder}/mwm/workflows/crisis-support/workflow.md" + description: "Crisis support 🆘" + type: workflow diff --git a/example-custom-module/mwm/workflows/cbt-thought-record/README.md b/example-custom-module/mwm/workflows/cbt-thought-record/README.md new file mode 100644 index 00000000..e41d1572 --- /dev/null +++ b/example-custom-module/mwm/workflows/cbt-thought-record/README.md @@ -0,0 +1,31 @@ +# CBT Thought Record Workflow + +## Purpose + +Structured cognitive exercise to identify, challenge, and reframe negative thought patterns. + +## Trigger + +TR (from CBT Coach agent) + +## Key Steps + +1. Identify the situation +2. List automatic thoughts +3. Rate emotions (0-100 intensity) +4. Identify cognitive distortions +5. Generate alternative thoughts +6. Re-rate emotions +7. Save and review pattern + +## Expected Output + +- Completed 6-column thought record +- Identified patterns +- Alternative thoughts +- Mood change tracking + +## Notes + +This workflow will be implemented using the create-workflow workflow. +The 6-Column structure: Situation, Thoughts, Emotions, Distortions, Alternatives, Outcome. Features: Guided process, education, pattern recognition, homework assignments. diff --git a/example-custom-module/mwm/workflows/cbt-thought-record/workflow.md b/example-custom-module/mwm/workflows/cbt-thought-record/workflow.md new file mode 100644 index 00000000..6c848995 --- /dev/null +++ b/example-custom-module/mwm/workflows/cbt-thought-record/workflow.md @@ -0,0 +1,45 @@ +--- +name: cbt-thought-record +description: TODO +web_bundle: false +--- + +# CBT Thought Record + +**Goal:** TODO + +**Your Role:** TODO + +## WORKFLOW ARCHITECTURE + +### Core Principles + +TODO + +### Step Processing Rules + +1. **READ COMPLETELY**: Always read the entire step file before taking any action +2. **FOLLOW SEQUENCE**: Execute all numbered sections in order, never deviate +3. **WAIT FOR INPUT**: If a menu is presented, halt and wait for user selection +4. **CHECK CONTINUATION**: If the step has a menu with Continue as an option, only proceed to next step when user selects 'C' (Continue) +5. **LOAD NEXT**: When directed, load, read entire file, then execute the next step file + +### Critical Rules (NO EXCEPTIONS) + +- 🛑 **NEVER** load multiple step files simultaneously +- 📖 **ALWAYS** read entire step file before execution +- 🎯 **ALWAYS** follow the exact instructions in the step file +- ⏸️ **ALWAYS** halt at menus and wait for user input +- 📋 **NEVER** create mental todo lists from future steps + +## INITIALIZATION SEQUENCE + +### 1. Module Configuration Loading + +Load and read full config from {project-root}/.bmad/mwm/config.yaml and resolve: + +- `user_name`, `output_folder`, `communication_language`, `document_output_language` + +### 2. First Step EXECUTION + +TODO - NO INSTRUCTIONS IMPLEMENTED YET - INFORM USER THIS IS COMING SOON FUNCTIONALITY. diff --git a/example-custom-module/mwm/workflows/crisis-support/README.md b/example-custom-module/mwm/workflows/crisis-support/README.md new file mode 100644 index 00000000..710eb3c7 --- /dev/null +++ b/example-custom-module/mwm/workflows/crisis-support/README.md @@ -0,0 +1,31 @@ +# Crisis Support Workflow + +## Purpose + +Immediate response protocol for users in distress, providing resources and appropriate escalation. + +## Trigger + +Crisis trigger from any agent (emergency response) + +## Key Steps + +1. Crisis level assessment +2. Immediate de-escalation techniques +3. Safety planning +4. Provide crisis resources +5. Encourage professional help +6. Follow-up check scheduling +7. Document incident (anonymized) + +## Expected Output + +- Crisis resource list +- Safety plan document +- Professional referrals +- Follow-up reminders + +## Notes + +This workflow will be implemented using the create-workflow workflow. +IMPORTANT: NOT a substitute for professional crisis intervention. Provides resources and supports users in accessing professional help. Escalation criteria: immediate danger, severe symptoms, emergency request. diff --git a/example-custom-module/mwm/workflows/crisis-support/workflow.md b/example-custom-module/mwm/workflows/crisis-support/workflow.md new file mode 100644 index 00000000..fe5eed07 --- /dev/null +++ b/example-custom-module/mwm/workflows/crisis-support/workflow.md @@ -0,0 +1,45 @@ +--- +name: crisis-support +description: TODO +web_bundle: false +--- + +# crisis-support + +**Goal:** TODO + +**Your Role:** TODO + +## WORKFLOW ARCHITECTURE + +### Core Principles + +TODO + +### Step Processing Rules + +1. **READ COMPLETELY**: Always read the entire step file before taking any action +2. **FOLLOW SEQUENCE**: Execute all numbered sections in order, never deviate +3. **WAIT FOR INPUT**: If a menu is presented, halt and wait for user selection +4. **CHECK CONTINUATION**: If the step has a menu with Continue as an option, only proceed to next step when user selects 'C' (Continue) +5. **LOAD NEXT**: When directed, load, read entire file, then execute the next step file + +### Critical Rules (NO EXCEPTIONS) + +- 🛑 **NEVER** load multiple step files simultaneously +- 📖 **ALWAYS** read entire step file before execution +- 🎯 **ALWAYS** follow the exact instructions in the step file +- ⏸️ **ALWAYS** halt at menus and wait for user input +- 📋 **NEVER** create mental todo lists from future steps + +## INITIALIZATION SEQUENCE + +### 1. Module Configuration Loading + +Load and read full config from {project-root}/.bmad/mwm/config.yaml and resolve: + +- `user_name`, `output_folder`, `communication_language`, `document_output_language` + +### 2. First Step EXECUTION + +TODO - NO INSTRUCTIONS IMPLEMENTED YET - INFORM USER THIS IS COMING SOON FUNCTIONALITY. diff --git a/example-custom-module/mwm/workflows/daily-checkin/README.md b/example-custom-module/mwm/workflows/daily-checkin/README.md new file mode 100644 index 00000000..45518ee0 --- /dev/null +++ b/example-custom-module/mwm/workflows/daily-checkin/README.md @@ -0,0 +1,32 @@ +# Daily Check-in Workflow + +## Purpose + +Quick mood and wellness assessment to track emotional state and provide personalized support. + +## Trigger + +DC (from Wellness Companion agent) + +## Key Steps + +1. Greeting and initial check-in +2. Mood assessment (scale 1-10) +3. Energy level check +4. Sleep quality review +5. Highlight a positive moment +6. Identify challenges +7. Provide personalized encouragement +8. Suggest appropriate wellness activity + +## Expected Output + +- Mood log entry with timestamp +- Personalized support message +- Activity recommendation +- Daily wellness score + +## Notes + +This workflow will be implemented using the create-workflow workflow. +Integration with wellness journal for data persistence. diff --git a/example-custom-module/mwm/workflows/daily-checkin/workflow.md b/example-custom-module/mwm/workflows/daily-checkin/workflow.md new file mode 100644 index 00000000..5d928137 --- /dev/null +++ b/example-custom-module/mwm/workflows/daily-checkin/workflow.md @@ -0,0 +1,45 @@ +--- +name: Daily Check In +description: TODO +web_bundle: false +--- + +# Daily Check In + +**Goal:** TODO + +**Your Role:** TODO + +## WORKFLOW ARCHITECTURE + +### Core Principles + +TODO + +### Step Processing Rules + +1. **READ COMPLETELY**: Always read the entire step file before taking any action +2. **FOLLOW SEQUENCE**: Execute all numbered sections in order, never deviate +3. **WAIT FOR INPUT**: If a menu is presented, halt and wait for user selection +4. **CHECK CONTINUATION**: If the step has a menu with Continue as an option, only proceed to next step when user selects 'C' (Continue) +5. **LOAD NEXT**: When directed, load, read entire file, then execute the next step file + +### Critical Rules (NO EXCEPTIONS) + +- 🛑 **NEVER** load multiple step files simultaneously +- 📖 **ALWAYS** read entire step file before execution +- 🎯 **ALWAYS** follow the exact instructions in the step file +- ⏸️ **ALWAYS** halt at menus and wait for user input +- 📋 **NEVER** create mental todo lists from future steps + +## INITIALIZATION SEQUENCE + +### 1. Module Configuration Loading + +Load and read full config from {project-root}/.bmad/mwm/config.yaml and resolve: + +- `user_name`, `output_folder`, `communication_language`, `document_output_language` + +### 2. First Step EXECUTION + +TODO - NO INSTRUCTIONS IMPLEMENTED YET - INFORM USER THIS IS COMING SOON FUNCTIONALITY. diff --git a/example-custom-module/mwm/workflows/guided-meditation/README.md b/example-custom-module/mwm/workflows/guided-meditation/README.md new file mode 100644 index 00000000..09539fe1 --- /dev/null +++ b/example-custom-module/mwm/workflows/guided-meditation/README.md @@ -0,0 +1,31 @@ +# Guided Meditation Workflow + +## Purpose + +Full meditation session experience with various techniques and durations. + +## Trigger + +GM (from Meditation Guide agent) + +## Key Steps + +1. Set intention for practice +2. Choose meditation type and duration +3. Get comfortable and settle in +4. Guided practice +5. Gentle return to awareness +6. Reflection and integration +7. Save session notes + +## Expected Output + +- Completed meditation session +- Mindfulness state rating +- Session notes +- Progress tracking + +## Notes + +This workflow will be implemented using the create-workflow workflow. +Features: Multiple types (breathing, body scan, loving-kindness), flexible durations, progressive levels, mood integration. diff --git a/example-custom-module/mwm/workflows/guided-meditation/workflow.md b/example-custom-module/mwm/workflows/guided-meditation/workflow.md new file mode 100644 index 00000000..18982496 --- /dev/null +++ b/example-custom-module/mwm/workflows/guided-meditation/workflow.md @@ -0,0 +1,45 @@ +--- +name: guided meditation +description: TODO +web_bundle: false +--- + +# Guided Meditation + +**Goal:** TODO + +**Your Role:** TODO + +## WORKFLOW ARCHITECTURE + +### Core Principles + +TODO + +### Step Processing Rules + +1. **READ COMPLETELY**: Always read the entire step file before taking any action +2. **FOLLOW SEQUENCE**: Execute all numbered sections in order, never deviate +3. **WAIT FOR INPUT**: If a menu is presented, halt and wait for user selection +4. **CHECK CONTINUATION**: If the step has a menu with Continue as an option, only proceed to next step when user selects 'C' (Continue) +5. **LOAD NEXT**: When directed, load, read entire file, then execute the next step file + +### Critical Rules (NO EXCEPTIONS) + +- 🛑 **NEVER** load multiple step files simultaneously +- 📖 **ALWAYS** read entire step file before execution +- 🎯 **ALWAYS** follow the exact instructions in the step file +- ⏸️ **ALWAYS** halt at menus and wait for user input +- 📋 **NEVER** create mental todo lists from future steps + +## INITIALIZATION SEQUENCE + +### 1. Module Configuration Loading + +Load and read full config from {project-root}/.bmad/mwm/config.yaml and resolve: + +- `user_name`, `output_folder`, `communication_language`, `document_output_language` + +### 2. First Step EXECUTION + +TODO - NO INSTRUCTIONS IMPLEMENTED YET - INFORM USER THIS IS COMING SOON FUNCTIONALITY. diff --git a/example-custom-module/mwm/workflows/wellness-journal/README.md b/example-custom-module/mwm/workflows/wellness-journal/README.md new file mode 100644 index 00000000..ab3b2f13 --- /dev/null +++ b/example-custom-module/mwm/workflows/wellness-journal/README.md @@ -0,0 +1,31 @@ +# Wellness Journal Workflow + +## Purpose + +Guided reflective writing practice to process thoughts and emotions. + +## Trigger + +WJ (from Wellness Companion agent) + +## Key Steps + +1. Set intention for journal entry +2. Choose journal prompt or free write +3. Guided reflection questions +4. Emotional processing check +5. Identify insights or patterns +6. Save entry with mood tags +7. Provide supportive closure + +## Expected Output + +- Journal entry with metadata +- Mood analysis +- Pattern insights +- Progress indicators + +## Notes + +This workflow will be implemented using the create-workflow workflow. +Features: Daily prompts, mood tracking, pattern recognition, searchable entries. diff --git a/example-custom-module/mwm/workflows/wellness-journal/workflow.md b/example-custom-module/mwm/workflows/wellness-journal/workflow.md new file mode 100644 index 00000000..5f7c6392 --- /dev/null +++ b/example-custom-module/mwm/workflows/wellness-journal/workflow.md @@ -0,0 +1,45 @@ +--- +name: wellness-journal +description: create or add to the wellness journal +web_bundle: false +--- + +# Wellness Journal + +**Goal:** TODO + +**Your Role:** TODO + +## WORKFLOW ARCHITECTURE + +### Core Principles + +TODO + +### Step Processing Rules + +1. **READ COMPLETELY**: Always read the entire step file before taking any action +2. **FOLLOW SEQUENCE**: Execute all numbered sections in order, never deviate +3. **WAIT FOR INPUT**: If a menu is presented, halt and wait for user selection +4. **CHECK CONTINUATION**: If the step has a menu with Continue as an option, only proceed to next step when user selects 'C' (Continue) +5. **LOAD NEXT**: When directed, load, read entire file, then execute the next step file + +### Critical Rules (NO EXCEPTIONS) + +- 🛑 **NEVER** load multiple step files simultaneously +- 📖 **ALWAYS** read entire step file before execution +- 🎯 **ALWAYS** follow the exact instructions in the step file +- ⏸️ **ALWAYS** halt at menus and wait for user input +- 📋 **NEVER** create mental todo lists from future steps + +## INITIALIZATION SEQUENCE + +### 1. Module Configuration Loading + +Load and read full config from {project-root}/.bmad/mwm/config.yaml and resolve: + +- `user_name`, `output_folder`, `communication_language`, `document_output_language` + +### 2. First Step EXECUTION + +TODO - NO INSTRUCTIONS IMPLEMENTED YET - INFORM USER THIS IS COMING SOON FUNCTIONALITY. diff --git a/src/modules/bmb/_module-installer/install-config.yaml b/src/modules/bmb/_module-installer/install-config.yaml index c0c4ab29..1f80c9f9 100644 --- a/src/modules/bmb/_module-installer/install-config.yaml +++ b/src/modules/bmb/_module-installer/install-config.yaml @@ -15,17 +15,12 @@ subheader: "Configure the settings for the BoMB Factory!\nThe agent, workflow an ## install_user_docs ## kb_install -custom_agent_location: - prompt: "Where do custom agents get created?" - default: "bmad-custom-src/agents" - result: "{project-root}/{value}" - -custom_workflow_location: - prompt: "Where do custom workflows get stored?" - default: "bmad-custom-src/workflows" +custom_stand_alone_location: + prompt: "Where do custom agents and workflows get stored?" + default: "bmad-custom-src" result: "{project-root}/{value}" custom_module_location: prompt: "Where do custom modules get stored?" - default: "bmad-custom-src/modules" + default: "bmad-custom-modules-src/modules" result: "{project-root}/{value}" diff --git a/src/modules/bmb/_module-installer/installer.js b/src/modules/bmb/_module-installer/installer.js new file mode 100644 index 00000000..a1897c89 --- /dev/null +++ b/src/modules/bmb/_module-installer/installer.js @@ -0,0 +1,76 @@ +const fs = require('fs-extra'); +const path = require('node:path'); +const chalk = require('chalk'); + +/** + * BMB Module Installer + * Sets up custom agent and workflow locations for the BMad Builder module + * + * @param {Object} options - Installation options + * @param {string} options.projectRoot - The root directory of the target project + * @param {Object} options.config - Module configuration from install-config.yaml + * @param {Object} options.coreConfig - Core configuration containing user_name + * @param {Array} options.installedIDEs - Array of IDE codes that were installed + * @param {Object} options.logger - Logger instance for output + * @returns {Promise} - Success status + */ +async function install(options) { + const { projectRoot, config, coreConfig, installedIDEs, logger } = options; + + try { + logger.log(chalk.blue('🔧 Setting up BMB Module...')); + + // Generate custom.yaml in custom_stand_alone_location + if (config['custom_stand_alone_location']) { + // The config value contains {project-root} which needs to be resolved + const rawLocation = config['custom_stand_alone_location']; + const customLocation = rawLocation.replace('{project-root}', projectRoot); + const customDestPath = path.join(customLocation, 'custom.yaml'); + + logger.log(chalk.cyan(` Setting up custom agents at: ${customLocation}`)); + + // Ensure the directory exists + await fs.ensureDir(customLocation); + + // Generate the custom.yaml content + const userName = (coreConfig && coreConfig.user_name) || 'my'; + const customContent = `code: my-custom-bmad +name: "${userName}-Custom-BMad: Sample Stand Alone Custom Agents and Workflows" +default_selected: true +`; + + // Write the custom.yaml file (only if it doesn't exist to preserve user changes) + if (await fs.pathExists(customDestPath)) { + logger.log(chalk.yellow(` ✓ custom.yaml already exists at ${customDestPath}`)); + } else { + await fs.writeFile(customDestPath, customContent, 'utf8'); + logger.log(chalk.green(` ✓ Created custom.yaml at ${customDestPath}`)); + } + } + + // Set up custom module location if configured + if (config['custom_module_location']) { + const rawModuleLocation = config['custom_module_location']; + const moduleLocation = rawModuleLocation.replace('{project-root}', projectRoot); + + logger.log(chalk.cyan(` Setting up custom modules at: ${moduleLocation}`)); + + // Ensure the directory exists + await fs.ensureDir(moduleLocation); + logger.log(chalk.green(` ✓ Created modules directory at ${moduleLocation}`)); + } + + // Handle IDE-specific configurations if needed + if (installedIDEs && installedIDEs.length > 0) { + logger.log(chalk.cyan(` Configuring BMB for IDEs: ${installedIDEs.join(', ')}`)); + } + + logger.log(chalk.green('✓ BMB Module setup complete')); + return true; + } catch (error) { + logger.error(chalk.red(`Error setting up BMB module: ${error.message}`)); + return false; + } +} + +module.exports = { install }; diff --git a/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml b/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml index 552c6968..3574da75 100644 --- a/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml +++ b/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml @@ -20,9 +20,9 @@ agent: - Reflection transforms experience into wisdom critical_actions: - - "Load COMPLETE file ./journal-keeper-sidecar/memories.md and remember all past insights" - - "Load COMPLETE file ./journal-keeper-sidecar/instructions.md and follow ALL journaling protocols" - - "ONLY read/write files in ./journal-keeper-sidecar/ - this is our private space" + - "Load COMPLETE file {agent_sidecar_folder}/journal-keeper-sidecar/memories.md and remember all past insights" + - "Load COMPLETE file {agent_sidecar_folder}/journal-keeper-sidecar/instructions.md and follow ALL journaling protocols" + - "ONLY read/write files in {agent_sidecar_folder}/journal-keeper-sidecar/ - this is our private space" - "Track mood patterns, recurring themes, and breakthrough moments" - "Reference past entries naturally to show continuity" @@ -120,7 +120,7 @@ agent: description: "Write today's journal entry" - trigger: quick - action: "Save a quick, unstructured entry to ./journal-keeper-sidecar/entries/entry-{date}.md with timestamp and any patterns noticed" + action: "Save a quick, unstructured entry to {agent_sidecar_folder}/journal-keeper-sidecar/entries/entry-{date}.md with timestamp and any patterns noticed" description: "Quick capture without prompts" - trigger: mood @@ -140,13 +140,13 @@ agent: description: "Reflect on the past week" - trigger: insight - action: "Document this breakthrough in ./journal-keeper-sidecar/breakthroughs.md with date and significance" + action: "Document this breakthrough in {agent_sidecar_folder}/journal-keeper-sidecar/breakthroughs.md with date and significance" description: "Record a meaningful insight" - trigger: read-back - action: "Load and share entries from ./journal-keeper-sidecar/entries/ for requested timeframe, highlighting themes and growth" + action: "Load and share entries from {agent_sidecar_folder}/journal-keeper-sidecar/entries/ for requested timeframe, highlighting themes and growth" description: "Review past entries" - trigger: save - action: "Update ./journal-keeper-sidecar/memories.md with today's session insights and emotional markers" + action: "Update {agent_sidecar_folder}/journal-keeper-sidecar/memories.md with today's session insights and emotional markers" description: "Save what we discussed today" diff --git a/src/modules/bmb/workflows-legacy/create-module/README.md b/src/modules/bmb/workflows-legacy/create-module/README.md deleted file mode 100644 index 36ed4422..00000000 --- a/src/modules/bmb/workflows-legacy/create-module/README.md +++ /dev/null @@ -1,229 +0,0 @@ -# Create Module Workflow - -Interactive scaffolding system creating complete BMad modules with agents, workflows, tasks, and installation infrastructure. - -## Table of Contents - -- [Quick Start](#quick-start) -- [Workflow Phases](#workflow-phases) -- [Output Structure](#output-structure) -- [Module Components](#module-components) -- [Best Practices](#best-practices) - -## Quick Start - -```bash -# Basic invocation -workflow create-module - -# With module brief input -workflow create-module --input module-brief-{name}-{date}.md - -# Via BMad Builder -*create-module -``` - -## Workflow Phases - -### Phase 1: Concept Definition - -- Define module purpose and audience -- Establish module code (kebab-case) and name -- Choose category (Domain, Creative, Technical, Business, Personal) -- Plan component architecture - -**Module Brief Integration:** - -- Auto-detects existing briefs -- Uses as pre-populated blueprint -- Accelerates planning phase - -### Phase 2: Architecture Planning - -- Create directory hierarchy -- Setup configuration system -- Define installer structure -- Establish component folders - -### Phase 3: Component Creation - -- Optional first agent creation -- Optional first workflow creation -- Component placeholder generation -- Integration validation - -### Phase 4: Installation Setup - -- Create install-config.yaml -- Configure deployment questions -- Setup installer logic -- Post-install messaging - -### Phase 5: Documentation - -- Generate comprehensive README -- Create development roadmap -- Provide quick commands -- Document next steps - -## Output Structure - -### Generated Directory - -``` -{bmad_folder}/{module-code}/ -├── agents/ # Agent definitions -├── workflows/ # Workflow processes -├── tasks/ # Reusable tasks -├── templates/ # Document templates -├── data/ # Module data files -├── _module-installer/ # Installation logic -│ ├── install-config.yaml -│ └── installer.js -├── README.md # Module documentation -├── TODO.md # Development roadmap -└── config.yaml # Runtime configuration -``` - -### Configuration Files - -**install-config.yaml** - Installation questions - -```yaml -questions: - - id: user_name - prompt: 'Your name?' - default: 'User' - - id: output_folder - prompt: 'Output location?' - default: './output' -``` - -**config.yaml** - Generated from user answers during install - -```yaml -user_name: 'John Doe' -output_folder: './my-output' -``` - -## Module Components - -### Agents - -- Full module agents with workflows -- Expert agents with sidecars -- Simple utility agents - -### Workflows - -- Multi-step guided processes -- Configuration-driven -- Web bundle support - -### Tasks - -- Reusable operations -- Agent-agnostic -- Modular components - -### Templates - -- Document structures -- Output formats -- Report templates - -## Best Practices - -### Planning - -1. **Use module-brief workflow first** - Creates comprehensive blueprint -2. **Define clear scope** - Avoid feature creep -3. **Plan component interactions** - Map agent/workflow relationships - -### Structure - -1. **Follow conventions** - Use established patterns -2. **Keep components focused** - Single responsibility -3. **Document thoroughly** - Clear README and inline docs - -### Development - -1. **Start with core agent** - Build primary functionality first -2. **Create key workflows** - Essential processes before edge cases -3. **Test incrementally** - Validate as you build - -### Installation - -1. **Minimal config questions** - Only essential settings -2. **Smart defaults** - Sensible out-of-box experience -3. **Clear post-install** - Guide users to first steps - -## Integration Points - -### With Other Workflows - -- **module-brief** - Strategic planning input -- **create-agent** - Agent component creation -- **create-workflow** - Workflow building -- **redoc** - Documentation maintenance - -### With BMad Core - -- Uses core framework capabilities -- Integrates with module system -- Follows BMad conventions - -## Examples - -### Domain-Specific Module - -``` -Category: Domain-Specific -Code: legal-advisor -Components: -- Contract Review Agent -- Compliance Workflow -- Legal Templates -``` - -### Creative Module - -``` -Category: Creative -Code: story-builder -Components: -- Narrative Agent -- Plot Workflow -- Character Templates -``` - -### Technical Module - -``` -Category: Technical -Code: api-tester -Components: -- Test Runner Agent -- API Validation Workflow -- Test Report Templates -``` - -## Workflow Files - -``` -create-module/ -├── workflow.yaml # Configuration -├── instructions.md # Step guide -├── checklist.md # Validation -├── module-structure.md # Architecture -├── installer-templates/ # Install files -└── README.md # This file -``` - -## Related Documentation - -- [Module Structure](./module-structure.md) -- [Module Brief Workflow](../module-brief/README.md) -- [Create Agent](../create-agent/README.md) -- [Create Workflow](../create-workflow/README.md) -- [BMB Module](../../README.md) diff --git a/src/modules/bmb/workflows-legacy/create-module/brainstorm-context.md b/src/modules/bmb/workflows-legacy/create-module/brainstorm-context.md deleted file mode 100644 index 8b0114ad..00000000 --- a/src/modules/bmb/workflows-legacy/create-module/brainstorm-context.md +++ /dev/null @@ -1,137 +0,0 @@ -# Module Brainstorming Context - -_Context provided to brainstorming workflow when creating a new BMAD module_ - -## Session Focus - -You are brainstorming ideas for a **complete BMAD module** - a self-contained package that extends the BMAD Method with specialized domain expertise and capabilities. - -## What is a BMAD Module? - -A module is a cohesive package that provides: - -- **Domain Expertise**: Specialized knowledge in a specific area (RPG, DevOps, Content Creation, etc.) -- **Agent Team**: Multiple AI personas with complementary skills -- **Workflows**: Guided processes for common tasks in the domain -- **Templates**: Document structures for consistent outputs -- **Integration**: Components that work together seamlessly - -## Brainstorming Goals - -Explore and define: - -### 1. Domain and Purpose - -- **What domain/problem space?** (e.g., game development, marketing, personal productivity) -- **Who is the target user?** (developers, writers, managers, hobbyists) -- **What pain points does it solve?** (tedious tasks, missing structure, need for expertise) -- **What makes this domain exciting?** (creativity, efficiency, empowerment) - -### 2. Agent Team Composition - -- **How many agents?** (typically 3-7 for a module) -- **What roles/personas?** (architect, researcher, reviewer, specialist) -- **How do they collaborate?** (handoffs, reviews, ensemble work) -- **What personality theme?** (Star Trek crew, superhero team, fantasy party, professional squad) - -### 3. Core Workflows - -- **What documents need creating?** (plans, specs, reports, creative outputs) -- **What processes need automation?** (analysis, generation, review, deployment) -- **What workflows enable the vision?** (3-10 key workflows that define the module) - -### 4. Value Proposition - -- **What becomes easier?** (specific tasks that get 10x faster) -- **What becomes possible?** (new capabilities previously unavailable) -- **What becomes better?** (quality improvements, consistency gains) - -## Creative Constraints - -A good BMAD module should be: - -- **Focused**: Serves a specific domain well (not generic) -- **Complete**: Provides end-to-end capabilities for that domain -- **Cohesive**: Agents and workflows complement each other -- **Fun**: Personality and creativity make it enjoyable to use -- **Practical**: Solves real problems, delivers real value - -## Module Architecture Questions - -1. **Module Identity** - - Module code (kebab-case, e.g., "rpg-toolkit") - - Module name (friendly, e.g., "RPG Toolkit") - - Module purpose (one sentence) - - Target audience - -2. **Agent Lineup** - - Agent names and roles - - Communication styles and personalities - - Expertise areas - - Command sets (what each agent can do) - -3. **Workflow Portfolio** - - Document generation workflows - - Action/automation workflows - - Analysis/research workflows - - Creative/ideation workflows - -4. **Integration Points** - - How agents invoke workflows - - How workflows use templates - - How components pass data - - Dependencies on other modules - -## Example Module Patterns - -### Professional Domains - -- **DevOps Suite**: Deploy, Monitor, Troubleshoot agents + deployment workflows -- **Marketing Engine**: Content, SEO, Analytics agents + campaign workflows -- **Legal Assistant**: Contract, Research, Review agents + document workflows - -### Creative Domains - -- **RPG Toolkit**: DM, NPC, Quest agents + adventure creation workflows -- **Story Crafter**: Plot, Character, World agents + writing workflows -- **Music Producer**: Composer, Arranger, Mixer agents + production workflows - -### Personal Domains - -- **Life Coach**: Planner, Tracker, Mentor agents + productivity workflows -- **Learning Companion**: Tutor, Quiz, Reviewer agents + study workflows -- **Health Guide**: Nutrition, Fitness, Wellness agents + tracking workflows - -## Suggested Brainstorming Techniques - -Particularly effective for module ideation: - -1. **Domain Immersion**: Deep dive into target domain's problems -2. **Persona Mapping**: Who needs this and what do they struggle with? -3. **Workflow Mapping**: What processes exist today? How could they improve? -4. **Team Building**: What personalities would make a great team? -5. **Integration Thinking**: How do pieces connect and amplify each other? - -## Key Questions to Answer - -1. What domain expertise should this module embody? -2. What would users be able to do that they can't do now? -3. Who are the 3-7 agents and what are their personalities? -4. What are the 5-10 core workflows? -5. What makes this module delightful to use? -6. How is this different from existing tools? -7. What's the "killer feature" that makes this essential? - -## Output Goals - -Generate: - -- **Module concept**: Clear vision and purpose -- **Agent roster**: Names, roles, personalities for each agent -- **Workflow list**: Core workflows with brief descriptions -- **Unique angle**: What makes this module special -- **Use cases**: 3-5 concrete scenarios where this module shines - ---- - -_This focused context helps create cohesive, valuable BMAD modules_ diff --git a/src/modules/bmb/workflows-legacy/create-module/installer-templates/install-config.yaml b/src/modules/bmb/workflows-legacy/create-module/installer-templates/install-config.yaml deleted file mode 100644 index 19462d3e..00000000 --- a/src/modules/bmb/workflows-legacy/create-module/installer-templates/install-config.yaml +++ /dev/null @@ -1,92 +0,0 @@ -# {{MODULE_NAME}} Module Configuration -# This file defines installation questions and module configuration values - -code: "{{MODULE_CODE}}" -name: "{{MODULE_NAME}}" -default_selected: "{{DEFAULT_SELECTED}}" # true if this should be selected by default - -# Welcome message shown during installation -prompt: - - "{{WELCOME_MESSAGE_LINE_1}}" - - "{{WELCOME_MESSAGE_LINE_2}}" -# Core config values are automatically inherited: -## user_name -## communication_language -## document_output_language -## output_folder - -# ============================================================================ -# CONFIGURATION FIELDS -# ============================================================================ -# -# Each field can be: -# 1. INTERACTIVE (has 'prompt' - asks user during installation) -# 2. STATIC (no 'prompt' - just uses 'result' value) -# -# Field structure: -# field_name: -# prompt: "Question to ask user" (optional - omit for static values) -# default: "default_value" (optional) -# result: "{value}" or "static-value" -# single-select: [...] (optional - for dropdown) -# multi-select: [...] (optional - for checkboxes) -# -# Special placeholders in result: -# {value} - replaced with user's answer -# {project-root} - replaced with project root path -# {directory_name} - replaced with project directory name -# {module_code} - replaced with this module's code -# ============================================================================ - -# EXAMPLE: Interactive text input -# example_project_name: -# prompt: "What is your project name?" -# default: "{directory_name}" -# result: "{value}" - -# EXAMPLE: Interactive single-select dropdown -# example_skill_level: -# prompt: "What is your experience level?" -# default: "intermediate" -# result: "{value}" -# single-select: -# - value: "beginner" -# label: "Beginner - New to this domain" -# - value: "intermediate" -# label: "Intermediate - Familiar with basics" -# - value: "expert" -# label: "Expert - Deep knowledge" - -# EXAMPLE: Interactive multi-select checkboxes -# example_features: -# prompt: -# - "Which features do you want to enable?" -# - "(Select all that apply)" -# result: "{value}" -# multi-select: -# - "Feature A" -# - "Feature B" -# - "Feature C" - -# EXAMPLE: Interactive path input -# example_output_path: -# prompt: "Where should outputs be saved?" -# default: "output/{{MODULE_CODE}}" -# result: "{project-root}/{value}" - -# EXAMPLE: Static value (no user prompt) -# example_static_setting: -# result: "hardcoded-value" - -# EXAMPLE: Static path -# module_data_path: -# result: "{project-root}/{bmad_folder}/{{MODULE_CODE}}/data" - -# ============================================================================ -# YOUR MODULE CONFIGURATION FIELDS -# ============================================================================ -# Replace examples above with your module's actual configuration needs. -# Delete this comment block and the examples when implementing. -# ============================================================================ - -# TODO: INSERT {MODULE_CONFIG_FIELDS} HERE diff --git a/src/modules/bmb/workflows-legacy/create-module/installer-templates/installer.js b/src/modules/bmb/workflows-legacy/create-module/installer-templates/installer.js deleted file mode 100644 index 4c396b18..00000000 --- a/src/modules/bmb/workflows-legacy/create-module/installer-templates/installer.js +++ /dev/null @@ -1,231 +0,0 @@ -/* eslint-disable unicorn/prefer-module, unicorn/prefer-node-protocol */ -/** - * {{MODULE_NAME}} Module Installer - * Custom installation logic for complex module setup - * - * This is a template - replace {{VARIABLES}} with actual values - */ - -// const fs = require('fs'); // Uncomment when implementing file operations -const path = require('path'); - -/** - * Main installation function - * Called by BMAD installer when processing the module - */ -async function installModule(config) { - console.log('🚀 Installing {{MODULE_NAME}} module...'); - console.log(` Version: ${config.version}`); - console.log(` Module Code: ${config.module_code}`); - - try { - // Step 1: Validate environment - await validateEnvironment(config); - - // Step 2: Setup custom configurations - await setupConfigurations(config); - - // Step 3: Initialize module-specific features - await initializeFeatures(config); - - // Step 4: Run post-install tasks - await runPostInstallTasks(config); - - console.log('✅ {{MODULE_NAME}} module installed successfully!'); - return { - success: true, - message: 'Module installed and configured', - }; - } catch (error) { - console.error('❌ Installation failed:', error.message); - return { - success: false, - error: error.message, - }; - } -} - -/** - * Validate that the environment meets module requirements - */ -async function validateEnvironment(config) { - console.log(' Validating environment...'); - - // TODO: Add environment checks - // Examples: - // - Check for required tools/binaries - // - Verify permissions - // - Check network connectivity - // - Validate API keys - - // Placeholder validation - if (!config.project_root) { - throw new Error('Project root not defined'); - } - - console.log(' ✓ Environment validated'); -} - -/** - * Setup module-specific configurations - */ -async function setupConfigurations(config) { - console.log(' Setting up configurations...'); - - // TODO: Add configuration setup - // Examples: - // - Create config files - // - Setup environment variables - // - Configure external services - // - Initialize settings - - // Placeholder configuration - const configPath = path.join(config.project_root, 'bmad', config.module_code, 'config.json'); - - // Example of module config that would be created - // const moduleConfig = { - // installed: new Date().toISOString(), - // settings: { - // // Add default settings - // } - // }; - - // Note: This is a placeholder - actual implementation would write the file - console.log(` ✓ Would create config at: ${configPath}`); - console.log(' ✓ Configurations complete'); -} - -/** - * Initialize module-specific features - */ -async function initializeFeatures(config) { - console.log(' Initializing features...'); - - // TODO: Add feature initialization - // Examples: - // - Create database schemas - // - Setup cron jobs - // - Initialize caches - // - Register webhooks - // - Setup file watchers - - // Module-specific initialization based on type - switch (config.module_category) { - case 'data': { - await initializeDataFeatures(config); - break; - } - case 'automation': { - await initializeAutomationFeatures(config); - break; - } - case 'integration': { - await initializeIntegrationFeatures(config); - break; - } - default: { - console.log(' - Using standard initialization'); - } - } - - console.log(' ✓ Features initialized'); -} - -/** - * Initialize data-related features - */ -async function initializeDataFeatures(/* config */) { - console.log(' - Setting up data storage...'); - // TODO: Setup databases, data folders, etc. -} - -/** - * Initialize automation features - */ -async function initializeAutomationFeatures(/* config */) { - console.log(' - Setting up automation hooks...'); - // TODO: Setup triggers, watchers, schedulers -} - -/** - * Initialize integration features - */ -async function initializeIntegrationFeatures(/* config */) { - console.log(' - Setting up integrations...'); - // TODO: Configure APIs, webhooks, external services -} - -/** - * Run post-installation tasks - */ -async function runPostInstallTasks(/* config */) { - console.log(' Running post-install tasks...'); - - // TODO: Add post-install tasks - // Examples: - // - Generate sample data - // - Run initial workflows - // - Send notifications - // - Update registries - - console.log(' ✓ Post-install tasks complete'); -} - -/** - * Initialize database for the module (optional) - */ -async function initDatabase(/* config */) { - console.log(' Initializing database...'); - - // TODO: Add database initialization - // This function can be called from install-config.yaml - - console.log(' ✓ Database initialized'); -} - -/** - * Generate sample data for the module (optional) - */ -async function generateSamples(config) { - console.log(' Generating sample data...'); - - // TODO: Create sample files, data, configurations - // This helps users understand how to use the module - - const samplesPath = path.join(config.project_root, 'examples', config.module_code); - - console.log(` - Would create samples at: ${samplesPath}`); - console.log(' ✓ Samples generated'); -} - -/** - * Uninstall the module (cleanup) - */ -async function uninstallModule(/* config */) { - console.log('🗑️ Uninstalling {{MODULE_NAME}} module...'); - - try { - // TODO: Add cleanup logic - // - Remove configurations - // - Clean up databases - // - Unregister services - // - Backup user data - - console.log('✅ Module uninstalled successfully'); - return { success: true }; - } catch (error) { - console.error('❌ Uninstall failed:', error.message); - return { - success: false, - error: error.message, - }; - } -} - -// Export functions for BMAD installer -module.exports = { - installModule, - initDatabase, - generateSamples, - uninstallModule, -}; diff --git a/src/modules/bmb/workflows-legacy/create-module/instructions.md b/src/modules/bmb/workflows-legacy/create-module/instructions.md deleted file mode 100644 index ec45b3aa..00000000 --- a/src/modules/bmb/workflows-legacy/create-module/instructions.md +++ /dev/null @@ -1,577 +0,0 @@ -# Build Module - Interactive Module Builder Instructions - -The workflow execution engine is governed by: {project-root}/{bmad_folder}/core/tasks/workflow.xml -You MUST have already loaded and processed: {project-root}/{bmad_folder}/bmb/workflows/create-module/workflow.yaml -Study existing modules in: {project-root}/{bmad_folder}/ for patterns -Communicate in {communication_language} throughout the module creation process -⚠️ ABSOLUTELY NO TIME ESTIMATES - NEVER mention hours, days, weeks, months, or ANY time-based predictions. AI has fundamentally changed development speed - what once took teams weeks/months can now be done by one person in hours. DO NOT give ANY time estimates whatsoever. - - - - -Do you want to brainstorm module ideas first? [y/n] - - - Invoke brainstorming workflow: {brainstorming_workflow} - Pass context data: {brainstorming_context} - Wait for brainstorming session completion - Use brainstorming output to inform module concept, agent lineup, and workflow portfolio in following steps - - - - Proceed directly to Step 0 - - -brainstorming_results - - - -Do you have a module brief or should we create one? [have/create/skip] - - - Invoke module-brief workflow: {project-root}/{bmad_folder}/bmb/workflows/module-brief/workflow.yaml - Wait for module brief completion - Load the module brief to use as blueprint - - - - Provide path to module brief document - Load the module brief and use it to pre-populate all planning sections - - - - Proceed directly to Step 1 - - -module_brief - - - -Load and study the complete module structure guide -Load module structure guide: {module_structure_guide} -Understand module types (Simple/Standard/Complex) -Review directory structures and component guidelines -Study the installation infrastructure patterns - -If brainstorming or module brief was completed, reference those results to guide the conversation - -Guide user to articulate their module's vision, exploring its purpose, what it will help with, and who will use it - -Based on their description, intelligently propose module details: - -**Module Identity Development:** - -1. **Module name** - Extract from their description with proper title case -2. **Module code** - Generate kebab-case from name following patterns: - - Multi-word descriptive names → shortened kebab-case - - Domain-specific terms → recognizable abbreviations - - Present suggested code and confirm it works for paths like {bmad_folder}/{{code}}/agents/ -3. **Module purpose** - Refine their description into 1-2 clear sentences -4. **Target audience** - Infer from context or ask if unclear - -**Module Theme Reference Categories:** - -- Domain-Specific (Legal, Medical, Finance, Education) -- Creative (RPG/Gaming, Story Writing, Music Production) -- Technical (DevOps, Testing, Architecture, Security) -- Business (Project Management, Marketing, Sales) -- Personal (Journaling, Learning, Productivity) - -Determine output location: - -- Module will be created at {installer_output_folder} - -Store module identity for scaffolding - -module_identity - - - -Based on the module purpose, intelligently propose an initial component architecture - -**Agents Planning:** - -Suggest agents based on module purpose, considering agent types (Simple/Expert/Module) appropriate to each role - -**Example Agent Patterns by Domain:** - -- Data/Analytics: Analyst, Designer, Builder roles -- Gaming/Creative: Game Master, Generator, Storytelling roles -- Team/Business: Manager, Facilitator, Documentation roles - -Present suggested agent list with types, explaining we can start with core ones and add others later -Confirm which agents resonate with their vision - -**Workflows Planning:** - -Intelligently suggest workflows that complement the proposed agents - -**Example Workflow Patterns by Domain:** - -- Data/Analytics: analyze-dataset, create-dashboard, generate-report -- Gaming/Creative: session-prep, generate-encounter, world-building -- Team/Business: planning, facilitation, documentation workflows - -For each workflow, note whether it should be Document, Action, or Interactive type -Confirm which workflows are most important to start with -Determine which to create now vs placeholder - -**Tasks Planning (optional):** -Any special tasks that don't warrant full workflows? - -For each task, capture name, purpose, and whether standalone or supporting - -module_components - - - -Based on components, intelligently determine module type using criteria: - -**Simple Module Criteria:** - -- 1-2 agents, all Simple type -- 1-3 workflows -- No complex integrations - -**Standard Module Criteria:** - -- 2-4 agents with mixed types -- 3-8 workflows -- Some shared resources - -**Complex Module Criteria:** - -- 4+ agents or multiple Module-type agents -- 8+ workflows -- Complex interdependencies -- External integrations - -Present determined module type with explanation of what structure will be set up - -module_type - - - -Use module path determined in Step 1: -- The module base path is {{module_path}} - -Create base module directories at the determined path: - -``` -{{module_code}}/ -├── agents/ # Agent definitions -├── workflows/ # Workflow folders -├── tasks/ # Task files (if any) -├── templates/ # Shared templates -├── data/ # Module data files -├── _module-installer/ # Installation configuration -│ └── install-config.yaml # Configuration questions (config.yaml generated at install time) -└── README.md # Module documentation -``` - -Create installer directory: - -**INSTALLED MODULE STRUCTURE** (generated in target project after installation): - -``` -{{module_code}}/ -├── agents/ # Compiled agents -├── workflows/ # Workflow instances -├── config.yaml # Generated from install-config.yaml during installation -└── data/ # User data directory -``` - -**SOURCE MODULE** (module-installer is for installation only, not copied to target): - -``` -{{module_code}}/ -├── _module-installer/ -│ ├── install-config.yaml # Configuration questions -│ ├── installer.js # Optional custom installation logic -│ └── assets/ # Files to copy during install -``` - -directory_structure - - - -Based on the module purpose and components, determine what configuration settings the module needs - -**Configuration Field Planning:** - -Does your module need any user-configurable settings during installation? - -**Common configuration patterns:** - -- Output/data paths (where module saves files) -- Feature toggles (enable/disable functionality) -- Integration settings (API keys, external services) -- Behavior preferences (automation level, detail level) -- User skill level or experience settings - -For each configuration field needed, determine: - -1. Field name (snake_case) -2. Whether it's INTERACTIVE (asks user) or STATIC (hardcoded) -3. Prompt text (if interactive) -4. Default value -5. Type: text input, single-select, or multi-select -6. Result template (how the value gets stored) - -Store planned configuration fields for installer generation in step 7 - -module_config_fields - - - -Create your first agent now? [yes/no] - - - Invoke agent builder workflow: {agent_builder} - Pass module_components as context input - Guide them to create the primary agent for the module - -Save to module's agents folder: - -- Save to {{module_path}}/agents/ - - - - Create placeholder file in agents folder with TODO notes including agent name, purpose, and type - - -first_agent - - - -Create your first workflow now? [yes/no] - - - Invoke workflow builder: {workflow_builder} - Pass module_components as context input - Guide them to create the primary workflow - -Save to module's workflows folder: - -- Save to {{module_path}}/workflows/ - - - - Create placeholder workflow folder structure with TODO notes for workflow.yaml, instructions.md, and template.md if document workflow - - -first_workflow - - - -Load installer template from: {installer_templates}/install-config.yaml - -IMPORTANT: Create install-config.yaml NOT install-config.yaml -This is the STANDARD format that BMAD installer uses - -Create module-installer/install-config.yaml: - -```yaml -# {{module_name}} Module Configuration -# This file defines installation questions and module configuration values - -code: {{module_code}} -name: "{{module_name}}" -default_selected: false # Set to true if this should be selected by default - -# Welcome message shown during installation -prompt: - - "Thank you for choosing {{module_name}}!" - - "{{brief_module_description}}" - -# Core config values are automatically inherited: -## user_name -## communication_language -## document_output_language -## output_folder - -# ============================================================================ -# CONFIGURATION FIELDS (from step 4 planning) -# ============================================================================ -# Each field can be: -# 1. INTERACTIVE (has 'prompt' - asks user during installation) -# 2. STATIC (no 'prompt' - just uses 'result' value) -# ============================================================================ - -# EXAMPLE Interactive text input: -# output_path: -# prompt: "Where should {{module_code}} save outputs?" -# default: "output/{{module_code}}" -# result: "{project-root}/{value}" - -# EXAMPLE Interactive single-select: -# detail_level: -# prompt: "How detailed should outputs be?" -# default: "standard" -# result: "{value}" -# single-select: -# - value: "minimal" -# label: "Minimal - Brief summaries only" -# - value: "standard" -# label: "Standard - Balanced detail" -# - value: "detailed" -# label: "Detailed - Comprehensive information" - -# EXAMPLE Static value: -# module_version: -# result: "1.0.0" - -# EXAMPLE Static path: -# data_path: -# result: "{project-root}/{bmad_folder}/{{module_code}}/data" - -{{generated_config_fields_from_step_4}} -``` - -Save location: - -- Save to {{module_path}}/module-installer/install-config.yaml - -Does your module need custom installation logic (database setup, API registration, etc.)? - - - ```javascript - // {{module_name}} Module Installer - // Custom installation logic - -- @param {Object} options - Installation options -- @param {string} options.projectRoot - Project root directory -- @param {Object} options.config - Module configuration from install-config.yaml -- @param {Array} options.installedIDEs - List of IDE codes being configured -- @param {Object} options.logger - Logger instance (log, warn, error methods) -- @returns {boolean} - true if successful, false to abort installation - - async function install(options) { - const { projectRoot, config, installedIDEs, logger } = options; - - logger.log('Running {{module_name}} custom installer...'); - - // TODO: Add custom installation logic here - // Examples: - // - Create database tables - // - Download external assets - // - Configure API connections - // - Initialize data files - // - Set up webhooks or integrations - - logger.log('{{module_name}} custom installation complete!'); - return true; - -} - -module.exports = { install }; - -````` - -Save location: - -- Save to {{module_path}}/module-installer/installer.js - - - -Skip installer.js creation - the standard installer will handle everything - - -installer_config - - - -Generate comprehensive README.md: - -````markdown -# {{module_name}} - -{{module_purpose}} - -## Overview - -This module provides: -{{component_summary}} - -## Installation - -```bash -bmad install {{module_code}} -````` - -```` - -## Components - -### Agents ({{agent_count}}) - -{{agent_documentation}} - -### Workflows ({{workflow_count}}) - -{{workflow_documentation}} - -### Tasks ({{task_count}}) - -{{task_documentation}} - -## Quick Start - -1. **Load the main agent:** - - ``` - agent {{primary_agent}} - ``` - -2. **View available commands:** - - ``` - *help - ``` - -3. **Run the main workflow:** - ``` - workflow {{primary_workflow}} - ``` - -## Module Structure - -``` -{{directory_tree}} -``` - -## Configuration - -The module can be configured in `{bmad_folder}/{{module_code}}/config.yaml` - -Key settings: -{{configuration_options}} - -## Examples - -### Example 1: {{example_use_case}} - -{{example_walkthrough}} - -## Development Roadmap - -- [ ] {{roadmap_item_1}} -- [ ] {{roadmap_item_2}} -- [ ] {{roadmap_item_3}} - -## Contributing - -To extend this module: - -1. Add new agents using `create-agent` workflow -2. Add new workflows using `create-workflow` workflow -3. Submit improvements via pull request - -## Author - -Created by {{user_name}} on {{date}} - -```` - -module_readme - - - -Create a development roadmap for remaining components: - -**TODO.md file:** - -```markdown -# {{module_name}} Development Roadmap - -## Phase 1: Core Components - -{{phase1_tasks}} - -## Phase 2: Enhanced Features - -{{phase2_tasks}} - -## Phase 3: Polish and Integration - -{{phase3_tasks}} - -## Quick Commands - -Create new agent: -``` - -workflow create-agent - -``` - -Create new workflow: -``` - -workflow create-workflow - -``` - -## Notes -{{development_notes}} -``` - -Ask if user wants to: - -1. Continue building more components now -2. Save roadmap for later development -3. Test what's been built so far - -development_roadmap - - - -Run validation checks: - -**Structure validation:** - -- All required directories created -- Config files properly formatted -- Installer configuration valid - -**Component validation:** - -- At least one agent or workflow exists (or planned) -- All references use correct paths -- Module code consistent throughout - -**Documentation validation:** - -- README.md complete -- Installation instructions clear -- Examples provided - -Present summary to {user_name}: - -- Module name and code -- Location path -- Agent count (created vs planned) -- Workflow count (created vs planned) -- Task count -- Installer status - -Provide next steps guidance: - -1. Complete remaining components using roadmap -2. Run the BMAD Method installer to this project location -3. Select 'Compile Agents' option after confirming folder -4. Module will be compiled and available for use -5. Test with bmad install command -6. Share or integrate with existing system - -Would you like to: - -- Create another component now? -- Test the module installation? -- Exit and continue later? - - -module_summary - - - diff --git a/src/modules/bmb/workflows-legacy/create-module/module-structure.md b/src/modules/bmb/workflows-legacy/create-module/module-structure.md deleted file mode 100644 index cd06b81c..00000000 --- a/src/modules/bmb/workflows-legacy/create-module/module-structure.md +++ /dev/null @@ -1,400 +0,0 @@ -# BMAD Module Structure Guide - -## What is a Module? - -A BMAD module is a self-contained package of agents, workflows, tasks, and resources that work together to provide specialized functionality. Think of it as an expansion pack for the BMAD Method. - -## Module Architecture - -### Core Structure - -``` -# SOURCE MODULE (in BMAD-METHOD project) -src/modules/{module-code}/ -├── agents/ # Agent definitions (.agent.yaml) -├── workflows/ # Workflow folders -├── tasks/ # Task files -├── tools/ # Tool files -├── templates/ # Shared templates -├── data/ # Static data -├── _module-installer/ # Installation configuration -│ ├── install-config.yaml # Installation questions & config -│ ├── installer.js # Optional custom install logic -│ └── assets/ # Files to copy during install -└── README.md # Module documentation - -# INSTALLED MODULE (in target project) -{project-root}/{bmad_folder}/{module-code}/ -├── agents/ # Compiled agent files (.md) -├── workflows/ # Workflow instances -├── tasks/ # Task files -├── tools/ # Tool files -├── templates/ # Templates -├── data/ # Module data -├── config.yaml # Generated from install-config.yaml -└── README.md # Module documentation -``` - -## Module Types by Complexity - -### Simple Module (1-2 agents, 2-3 workflows) - -Perfect for focused, single-purpose tools. - -**Example: Code Review Module** - -- 1 Reviewer Agent -- 2 Workflows: quick-review, deep-review -- Clear, narrow scope - -### Standard Module (3-5 agents, 5-10 workflows) - -Comprehensive solution for a domain. - -**Example: Project Management Module** - -- PM Agent, Scrum Master Agent, Analyst Agent -- Workflows: sprint-planning, retrospective, roadmap, user-stories -- Integrated component ecosystem - -### Complex Module (5+ agents, 10+ workflows) - -Full platform or framework. - -**Example: RPG Toolkit Module** - -- DM Agent, NPC Agent, Monster Agent, Loot Agent, Map Agent -- 15+ workflows for every aspect of game management -- Multiple interconnected systems - -## Module Naming Conventions - -### Module Code (kebab-case) - -- `data-viz` - Data Visualization -- `team-collab` - Team Collaboration -- `rpg-toolkit` - RPG Toolkit -- `legal-assist` - Legal Assistant - -### Module Name (Title Case) - -- "Data Visualization Suite" -- "Team Collaboration Platform" -- "RPG Game Master Toolkit" -- "Legal Document Assistant" - -## Component Guidelines - -### Agents per Module - -**Recommended Distribution:** - -- **Primary Agent (1)**: The main interface/orchestrator -- **Specialist Agents (2-4)**: Domain-specific experts -- **Utility Agents (0-2)**: Helper/support functions - -**Anti-patterns to Avoid:** - -- Too many overlapping agents -- Agents that could be combined -- Agents without clear purpose - -### Workflows per Module - -**Categories:** - -- **Core Workflows (2-3)**: Essential functionality -- **Feature Workflows (3-5)**: Specific capabilities -- **Utility Workflows (2-3)**: Supporting operations -- **Admin Workflows (0-2)**: Maintenance/config - -**Workflow Complexity Guide:** - -- Simple: 3-5 steps, single output -- Standard: 5-10 steps, multiple outputs -- Complex: 10+ steps, conditional logic, sub-workflows - -### Tasks per Module - -Tasks should be used for: - -- Single-operation utilities -- Shared subroutines -- Quick actions that don't warrant workflows - -## Module Dependencies - -### Internal Dependencies - -- Agents can reference module workflows -- Workflows can invoke module tasks -- Tasks can use module templates - -### External Dependencies - -- Reference other modules via full paths -- Declare dependencies in config.yaml -- Version compatibility notes - -### Workflow Vendoring (Advanced) - -For modules that need workflows from other modules but want to remain standalone, use **workflow vendoring**: - -**In Agent YAML:** - -```yaml -menu: - - trigger: command-name - exec: '{project-root}/{bmad_folder}/SOURCE_MODULE/workflows/path/workflow.md' - workflow-install: '{project-root}/{bmad_folder}/THIS_MODULE/workflows/vendored/workflow.md' - description: 'Command description' -``` - -**What Happens:** - -- During installation, workflows are copied from `workflow` to `workflow-install` location -- Vendored workflows get `config_source` updated to reference this module's config -- Compiled agent only references the `workflow-install` path -- Module becomes fully standalone - no source module dependency required - -**Use Cases:** - -- Specialized modules that reuse common workflows with different configs -- Domain-specific adaptations (e.g., game dev using standard dev workflows) -- Testing workflows in isolation - -**Benefits:** - -- Module independence (no forced dependencies) -- Clean namespace (workflows in your module) -- Config isolation (use your module's settings) -- Customization ready (modify vendored workflows freely) - -## Installation Infrastructure - -### Required: module-installer/install-config.yaml - -This file defines both installation questions AND static configuration values: - -```yaml -# Module metadata -code: module-code -name: 'Module Name' -default_selected: false - -# Welcome message during installation -prompt: - - 'Welcome to Module Name!' - - 'Brief description here' - -# Core values automatically inherited from installer: -## user_name -## communication_language -## document_output_language -## output_folder - -# INTERACTIVE fields (ask user during install) -output_location: - prompt: 'Where should module outputs be saved?' - default: 'output/module-code' - result: '{project-root}/{value}' - -feature_level: - prompt: 'Which feature set?' - default: 'standard' - result: '{value}' - single-select: - - value: 'basic' - label: 'Basic - Core features only' - - value: 'standard' - label: 'Standard - Recommended features' - - value: 'advanced' - label: 'Advanced - All features' - -# STATIC fields (no prompt, just hardcoded values) -module_version: - result: '1.0.0' - -data_path: - result: '{project-root}/{bmad_folder}/module-code/data' -``` - -**Key Points:** - -- File is named `install-config.yaml` (NOT install-config.yaml) -- Supports both interactive prompts and static values -- `result` field uses placeholders: `{value}`, `{project-root}`, `{directory_name}` -- Installer generates final `config.yaml` from this template - -### Optional: module-installer/installer.js - -For complex installations requiring custom logic: - -```javascript -/** - * @param {Object} options - Installation options - * @param {string} options.projectRoot - Target project directory - * @param {Object} options.config - Config from install-config.yaml - * @param {Array} options.installedIDEs - IDEs being configured - * @param {Object} options.logger - Logger (log, warn, error) - * @returns {boolean} - true if successful - */ -async function install(options) { - // Custom installation logic here - // - Database setup - // - API configuration - // - External downloads - // - Integration setup - - return true; -} - -module.exports = { install }; -``` - -### Optional: module-installer/assets/ - -Files to copy during installation: - -- External configurations -- Documentation -- Example files -- Integration scripts - -## Module Lifecycle - -### Development Phases - -1. **Planning Phase** - - Define scope and purpose - - Identify components - - Design architecture - -2. **Scaffolding Phase** - - Create directory structure - - Generate configurations - - Setup installer - -3. **Building Phase** - - Create agents incrementally - - Build workflows progressively - - Add tasks as needed - -4. **Testing Phase** - - Test individual components - - Verify integration - - Validate installation - -5. **Deployment Phase** - - Package module - - Document usage - - Distribute/share - -## Best Practices - -### Module Cohesion - -- All components should relate to module theme -- Clear boundaries between modules -- No feature creep - -### Progressive Enhancement - -- Start with MVP (1 agent, 2 workflows) -- Add components based on usage -- Refactor as patterns emerge - -### Documentation Standards - -- Every module needs README.md -- Each agent needs purpose statement -- Workflows need clear descriptions -- Include examples and quickstart - -### Naming Consistency - -- Use module code prefix for uniqueness -- Consistent naming patterns within module -- Clear, descriptive names - -## Example Modules - -### Example 1: Personal Productivity - -``` -productivity/ -├── agents/ -│ ├── task-manager.md # GTD methodology -│ └── focus-coach.md # Pomodoro timer -├── workflows/ -│ ├── daily-planning/ # Morning routine -│ ├── weekly-review/ # Week retrospective -│ └── project-setup/ # New project init -└── config.yaml -``` - -### Example 2: Content Creation - -``` -content/ -├── agents/ -│ ├── writer.md # Blog/article writer -│ ├── editor.md # Copy editor -│ └── seo-optimizer.md # SEO specialist -├── workflows/ -│ ├── blog-post/ # Full blog creation -│ ├── social-media/ # Social content -│ ├── email-campaign/ # Email sequence -│ └── content-calendar/ # Planning -└── templates/ - ├── blog-template.md - └── email-template.md -``` - -### Example 3: DevOps Automation - -``` -devops/ -├── agents/ -│ ├── deploy-master.md # Deployment orchestrator -│ ├── monitor.md # System monitoring -│ ├── incident-responder.md # Incident management -│ └── infra-architect.md # Infrastructure design -├── workflows/ -│ ├── ci-cd-setup/ # Pipeline creation -│ ├── deploy-app/ # Application deployment -│ ├── rollback/ # Emergency rollback -│ ├── health-check/ # System verification -│ └── incident-response/ # Incident handling -├── tasks/ -│ ├── check-status.md # Quick status check -│ └── notify-team.md # Team notifications -└── data/ - └── runbooks/ # Operational guides -``` - -## Module Evolution Pattern - -``` -Simple Module → Standard Module → Complex Module → Module Suite - (MVP) (Enhanced) (Complete) (Ecosystem) -``` - -## Common Pitfalls - -1. **Over-engineering**: Starting too complex -2. **Under-planning**: No clear architecture -3. **Poor boundaries**: Module does too much -4. **Weak integration**: Components don't work together -5. **Missing docs**: No clear usage guide - -## Success Metrics - -A well-designed module has: - -- ✅ Clear, focused purpose -- ✅ Cohesive components -- ✅ Smooth installation -- ✅ Comprehensive docs -- ✅ Room for growth -- ✅ Happy users! diff --git a/src/modules/bmb/workflows-legacy/create-module/workflow.yaml b/src/modules/bmb/workflows-legacy/create-module/workflow.yaml deleted file mode 100644 index a47bdbfb..00000000 --- a/src/modules/bmb/workflows-legacy/create-module/workflow.yaml +++ /dev/null @@ -1,52 +0,0 @@ -# Build Module Workflow Configuration -name: create-module -description: "Interactive workflow to build complete BMAD modules with agents, workflows, tasks, and installation infrastructure" -author: "BMad" - -# Critical variables load from config_source -config_source: "{project-root}/{bmad_folder}/bmb/config.yaml" -custom_module_location: "{config_source}:custom_module_location" -communication_language: "{config_source}:communication_language" -user_name: "{config_source}:user_name" - -# Reference guides for module building -module_structure_guide: "{installed_path}/module-structure.md" -installer_templates: "{installed_path}/installer-templates/" - -# Use existing build workflows -agent_builder: "{project-root}/{bmad_folder}/bmb/workflows/create-agent/workflow.yaml" -workflow_builder: "{project-root}/{bmad_folder}/bmb/workflows/create-workflow/workflow.yaml" -brainstorming_workflow: "{project-root}/{bmad_folder}/core/workflows/brainstorming/workflow.yaml" -brainstorming_context: "{installed_path}/brainstorm-context.md" - -# Reference examples - for learning patterns -bmm_module_dir: "{project-root}/{bmad_folder}/bmm/" -cis_module_dir: "{project-root}/{bmad_folder}/cis/" -existing_agents_dir: "{project-root}/{bmad_folder}/*/agents/" -existing_workflows_dir: "{project-root}/{bmad_folder}/*/workflows/" - -# Optional user inputs - discovered if they exist -input_file_patterns: - module_brief: - description: "Module brief with vision and requirements (optional)" - whole: "{output_folder}/module-brief-*.md" - load_strategy: "FULL_LOAD" - brainstorming: - description: "Brainstorming session outputs (optional)" - whole: "{output_folder}/brainstorming-*.md" - load_strategy: "FULL_LOAD" - -# Module path and component files -installed_path: "{project-root}/{bmad_folder}/bmb/workflows/create-module" -template: false # This is an interactive scaffolding workflow -instructions: "{installed_path}/instructions.md" -validation: "{installed_path}/checklist.md" - -# Output configuration - creates entire module structure -# Save to custom_module_location/{{module_code}} -installer_output_folder: "{custom_module_location}/{{module_code}}" - -standalone: true - -# Web bundle configuration -web_bundle: false # BMB workflows run locally in BMAD-METHOD project diff --git a/src/modules/bmb/workflows-legacy/edit-module/checklist.md b/src/modules/bmb/workflows-legacy/edit-module/checklist.md index 88d68711..b583acd2 100644 --- a/src/modules/bmb/workflows-legacy/edit-module/checklist.md +++ b/src/modules/bmb/workflows-legacy/edit-module/checklist.md @@ -24,7 +24,6 @@ Use this checklist to validate module edits meet BMAD Core standards. ### Optional Fields (if used) -- [ ] custom_agent_location documented - [ ] custom_module_location documented - [ ] Module-specific fields documented in README diff --git a/src/modules/bmb/workflows/create-module/templates/agent.template.md b/src/modules/bmb/workflows/create-module/templates/agent.template.md index 3aca9587..93367e69 100644 --- a/src/modules/bmb/workflows/create-module/templates/agent.template.md +++ b/src/modules/bmb/workflows/create-module/templates/agent.template.md @@ -166,8 +166,8 @@ Expert agents support three types of menu actions: ## Notes for Module Creation: 1. **File Paths**: - - Agent files go in: `{custom_module_location}/{module_name}/agents/[agent-name].yaml` - - Sidecar folders go in: `{custom_module_location}/{module_name}/agents/[agent-name]-sidecar/` + - Agent files go in: `{custom_module_location}/{module_name}/agents/[agent-name]/[agent-name].yaml` + - Sidecar folders go in: `{custom_module_location}/{module_name}/agents/[agent-name]/[agent-name]-sidecar/` 2. **Variable Usage**: - `{agent_sidecar_folder}` resolves to the agents sidecar folder destination after installation diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md b/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md index 4f4101df..901207f3 100644 --- a/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md +++ b/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md @@ -11,7 +11,7 @@ nextStepFile: '{workflow_path}/steps/step-02-gather.md' workflowFile: '{workflow_path}/workflow.md' # Output files for workflow creation process -targetWorkflowPath: '{custom_workflow_location}/{new_workflow_name}' +targetWorkflowPath: '{custom_stand_alone_location}/workflows/{new_workflow_name}' workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' # Template References # No workflow plan template needed - will create plan file directly @@ -83,7 +83,7 @@ After getting the workflow name: **Check for existing workflows:** -- Look for folder at `{custom_workflow_location}/{new_workflow_name}/` +- Look for folder at `{custom_stand_alone_location}/workflows/{new_workflow_name}/` - If it exists, inform the user and suggest or get from them a unique name or postfix **Example alternatives:** diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-02-gather.md b/src/modules/bmb/workflows/create-workflow/steps/step-02-gather.md index 37d03adf..6c6e7870 100644 --- a/src/modules/bmb/workflows/create-workflow/steps/step-02-gather.md +++ b/src/modules/bmb/workflows/create-workflow/steps/step-02-gather.md @@ -9,7 +9,7 @@ workflow_path: '{project-root}/{bmad_folder}/bmb/workflows/create-workflow' thisStepFile: '{workflow_path}/steps/step-02-gather.md' nextStepFile: '{workflow_path}/steps/step-03-tools-configuration.md' # Output files for workflow creation process -targetWorkflowPath: '{custom_workflow_location}/{new_workflow_name}' +targetWorkflowPath: '{custom_stand_alone_location}/workflows/{new_workflow_name}' workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' # Task References diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md b/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md index e5cd9eaf..aa282882 100644 --- a/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md +++ b/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md @@ -9,7 +9,7 @@ workflow_path: '{project-root}/{bmad_folder}/bmb/workflows/create-workflow' thisStepFile: '{workflow_path}/steps/step-03-tools-configuration.md' nextStepFile: '{workflow_path}/steps/step-04-plan-review.md' -targetWorkflowPath: '{custom_workflow_location}/{new_workflow_name}' +targetWorkflowPath: '{custom_stand_alone_location}/workflows/{new_workflow_name}' workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' # Documentation References diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-04-plan-review.md b/src/modules/bmb/workflows/create-workflow/steps/step-04-plan-review.md index 9510baed..93cd7a02 100644 --- a/src/modules/bmb/workflows/create-workflow/steps/step-04-plan-review.md +++ b/src/modules/bmb/workflows/create-workflow/steps/step-04-plan-review.md @@ -10,7 +10,7 @@ thisStepFile: '{workflow_path}/steps/step-04-plan-review.md' nextStepFormDesign: '{workflow_path}/steps/step-05-output-format-design.md' nextStepDesign: '{workflow_path}/steps/step-06-design.md' -targetWorkflowPath: '{custom_workflow_location}/{new_workflow_name}' +targetWorkflowPath: '{custom_stand_alone_location}/workflows/{new_workflow_name}' workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' # Task References diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-05-output-format-design.md b/src/modules/bmb/workflows/create-workflow/steps/step-05-output-format-design.md index 69c2394f..5beb5aba 100644 --- a/src/modules/bmb/workflows/create-workflow/steps/step-05-output-format-design.md +++ b/src/modules/bmb/workflows/create-workflow/steps/step-05-output-format-design.md @@ -9,7 +9,7 @@ workflow_path: '{project-root}/{bmad_folder}/bmb/workflows/create-workflow' thisStepFile: '{workflow_path}/steps/step-05-output-format-design.md' nextStepFile: '{workflow_path}/steps/step-06-design.md' -targetWorkflowPath: '{custom_workflow_location}/{new_workflow_name}' +targetWorkflowPath: '{custom_stand_alone_location}/workflows/{new_workflow_name}' workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' # Task References diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-06-design.md b/src/modules/bmb/workflows/create-workflow/steps/step-06-design.md index 98ecab6f..1dcc6703 100644 --- a/src/modules/bmb/workflows/create-workflow/steps/step-06-design.md +++ b/src/modules/bmb/workflows/create-workflow/steps/step-06-design.md @@ -10,7 +10,7 @@ thisStepFile: '{workflow_path}/steps/step-06-design.md' nextStepFile: '{workflow_path}/steps/step-07-build.md' workflowFile: '{workflow_path}/workflow.md' # Output files for workflow creation process -targetWorkflowPath: '{custom_workflow_location}/{new_workflow_name}' +targetWorkflowPath: '{custom_stand_alone_location}/workflows/{new_workflow_name}' workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' # Task References diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-07-build.md b/src/modules/bmb/workflows/create-workflow/steps/step-07-build.md index 0e4907dc..a62c8969 100644 --- a/src/modules/bmb/workflows/create-workflow/steps/step-07-build.md +++ b/src/modules/bmb/workflows/create-workflow/steps/step-07-build.md @@ -10,7 +10,7 @@ thisStepFile: '{workflow_path}/steps/step-07-build.md' nextStepFile: '{workflow_path}/steps/step-08-review.md' workflowFile: '{workflow_path}/workflow.md' # Output files for workflow creation process -targetWorkflowPath: '{custom_workflow_location}/{new_workflow_name}' +targetWorkflowPath: '{custom_stand_alone_location}/workflows/{new_workflow_name}' workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' # Template References @@ -95,7 +95,7 @@ Ready to proceed?" Create the workflow folder structure in the target location: ``` -{custom_workflow_location}/{workflow_name}/ +{custom_stand_alone_location}/workflows/{workflow_name}/ ├── workflow.md ├── steps/ │ ├── step-01-init.md diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-08-review.md b/src/modules/bmb/workflows/create-workflow/steps/step-08-review.md index b697154f..82c3412a 100644 --- a/src/modules/bmb/workflows/create-workflow/steps/step-08-review.md +++ b/src/modules/bmb/workflows/create-workflow/steps/step-08-review.md @@ -10,7 +10,7 @@ thisStepFile: '{workflow_path}/steps/step-08-review.md' workflowFile: '{workflow_path}/workflow.md' # Output files for workflow creation process -targetWorkflowPath: '{custom_workflow_location}/{new_workflow_name}' +targetWorkflowPath: '{custom_stand_alone_location}/workflows/{new_workflow_name}' workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' # Task References diff --git a/src/modules/bmb/workflows/create-workflow/steps/step-09-complete.md b/src/modules/bmb/workflows/create-workflow/steps/step-09-complete.md index cb2708ed..267104bc 100644 --- a/src/modules/bmb/workflows/create-workflow/steps/step-09-complete.md +++ b/src/modules/bmb/workflows/create-workflow/steps/step-09-complete.md @@ -9,7 +9,7 @@ workflow_path: '{project-root}/{bmad_folder}/bmb/workflows/create-workflow' thisStepFile: '{workflow_path}/steps/step-09-complete.md' workflowFile: '{workflow_path}/workflow.md' # Output files for workflow creation process -targetWorkflowPath: '{custom_workflow_location}/{new_workflow_name}' +targetWorkflowPath: '{custom_stand_alone_location}/workflows/{new_workflow_name}' workflowPlanFile: '{targetWorkflowPath}/workflow-plan-{new_workflow_name}.md' completionFile: '{targetWorkflowPath}/completion-summary-{new_workflow_name}.md' --- diff --git a/src/modules/bmb/workflows/create-workflow/workflow.md b/src/modules/bmb/workflows/create-workflow/workflow.md index 6b4140d5..ab79d27c 100644 --- a/src/modules/bmb/workflows/create-workflow/workflow.md +++ b/src/modules/bmb/workflows/create-workflow/workflow.md @@ -51,7 +51,7 @@ This uses **step-file architecture** for disciplined execution: Load and read full config from {project-root}/{bmad_folder}/bmb/config.yaml and resolve: -- `project_name`, `output_folder`, `user_name`, `communication_language`, `document_output_language`, `custom_workflow_location` +- `project_name`, `output_folder`, `user_name`, `communication_language`, `document_output_language`, `custom_stand_alone_location` ### 2. First Step EXECUTION diff --git a/tools/cli/commands/agent-install.js b/tools/cli/commands/agent-install.js index 966d436a..2e5dca21 100644 --- a/tools/cli/commands/agent-install.js +++ b/tools/cli/commands/agent-install.js @@ -198,8 +198,8 @@ module.exports = { } } else { // Discover agents from custom location - const customAgentLocation = config.custom_agent_location - ? resolvePath(config.custom_agent_location, config) + const customAgentLocation = config.custom_stand_alone_location + ? resolvePath(config.custom_stand_alone_location, config) : path.join(config.bmadFolder, 'custom', 'src', 'agents'); console.log(chalk.dim(`Searching for agents in: ${customAgentLocation}\n`)); diff --git a/tools/cli/installers/lib/core/config-collector.js b/tools/cli/installers/lib/core/config-collector.js index 99fca89d..880d9ba1 100644 --- a/tools/cli/installers/lib/core/config-collector.js +++ b/tools/cli/installers/lib/core/config-collector.js @@ -236,9 +236,31 @@ class ConfigCollector { } this.collectedConfig[moduleName] = { ...this.existingConfig[moduleName] }; + // Special handling for user_name: ensure it has a value + if ( + moduleName === 'core' && + (!this.collectedConfig[moduleName].user_name || this.collectedConfig[moduleName].user_name === '[USER_NAME]') + ) { + this.collectedConfig[moduleName].user_name = this.getDefaultUsername(); + } + // Also populate allAnswers for cross-referencing for (const [key, value] of Object.entries(this.existingConfig[moduleName])) { - this.allAnswers[`${moduleName}_${key}`] = value; + // Ensure user_name is properly set in allAnswers too + let finalValue = value; + if (moduleName === 'core' && key === 'user_name' && (!value || value === '[USER_NAME]')) { + finalValue = this.getDefaultUsername(); + } + this.allAnswers[`${moduleName}_${key}`] = finalValue; + } + } else if (moduleName === 'core') { + // No existing core config - ensure we at least have user_name + if (!this.collectedConfig[moduleName]) { + this.collectedConfig[moduleName] = {}; + } + if (!this.collectedConfig[moduleName].user_name) { + this.collectedConfig[moduleName].user_name = this.getDefaultUsername(); + this.allAnswers[`${moduleName}_user_name`] = this.getDefaultUsername(); } } // Show "no config" message for modules with no new questions diff --git a/tools/cli/installers/lib/core/installer.js b/tools/cli/installers/lib/core/installer.js index 6534c2c6..87b60f71 100644 --- a/tools/cli/installers/lib/core/installer.js +++ b/tools/cli/installers/lib/core/installer.js @@ -38,7 +38,6 @@ const { CLIUtils } = require('../../../lib/cli-utils'); const { ManifestGenerator } = require('./manifest-generator'); const { IdeConfigManager } = require('./ide-config-manager'); const { replaceAgentSidecarFolders } = require('./post-install-sidecar-replacement'); -const { CustomHandler } = require('../custom/handler'); class Installer { constructor() { @@ -52,7 +51,6 @@ class Installer { this.dependencyResolver = new DependencyResolver(); this.configCollector = new ConfigCollector(); this.ideConfigManager = new IdeConfigManager(); - this.customHandler = new CustomHandler(); this.installedFiles = []; // Track all installed files this.ttsInjectedFiles = []; // Track files with TTS injection applied } @@ -914,6 +912,7 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: await this.moduleManager.runModuleInstaller('core', bmadDir, { installedIDEs: config.ides || [], moduleConfig: moduleConfigs.core || {}, + coreConfig: moduleConfigs.core || {}, logger: { log: (msg) => console.log(msg), error: (msg) => console.error(msg), @@ -931,6 +930,7 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: await this.moduleManager.runModuleInstaller(moduleName, bmadDir, { installedIDEs: config.ides || [], moduleConfig: moduleConfigs[moduleName] || {}, + coreConfig: moduleConfigs.core || {}, logger: { log: (msg) => console.log(msg), error: (msg) => console.error(msg), @@ -1028,9 +1028,6 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: } } - // Update custom content (add new files, don't remove existing) - await this.updateCustomContent(projectDir, bmadDir); - // Replace {agent_sidecar_folder} placeholders in all agent files console.log(chalk.dim('\n Configuring agent sidecar folders...')); const sidecarResults = await replaceAgentSidecarFolders(bmadDir); @@ -1168,133 +1165,6 @@ If AgentVibes party mode is enabled, immediately trigger TTS with agent's voice: return { success: true }; } - /** - * Update custom content (add new files without removing existing ones) - * @param {string} projectDir - Project directory - * @param {string} bmadDir - BMAD installation directory - */ - async updateCustomContent(projectDir, bmadDir) { - try { - // Find all custom content - const customContents = await this.customHandler.findCustomContent(projectDir); - - if (customContents.length === 0) { - return; // No custom content to update - } - - // Load core config - const coreConfigPath = path.join(bmadDir, 'bmb', 'config.yaml'); - let coreConfig = {}; - if (await fs.pathExists(coreConfigPath)) { - const yamlLib = require('yaml'); - const coreConfigContent = await fs.readFile(coreConfigPath, 'utf8'); - coreConfig = yamlLib.load(coreConfigContent); - } - - console.log(chalk.dim('\nUpdating custom content...')); - - for (const customPath of customContents) { - const customInfo = await this.customHandler.getCustomInfo(customPath); - if (customInfo) { - console.log(chalk.dim(` Checking: ${customInfo.name}`)); - - // Install only adds new files, doesn't remove existing ones - const results = await this.customHandler.install( - customPath, - bmadDir, - { - user_name: coreConfig.user_name, - communication_language: coreConfig.communication_language, - output_folder: coreConfig.output_folder, - bmad_folder: path.basename(bmadDir), - }, - (filePath) => { - this.installedFiles.push(filePath); - }, - ); - - // Only show if new files were added or preserved - if (results.filesCopied > 0 || results.preserved > 0) { - if (results.filesCopied > 0) { - console.log(chalk.dim(` Added ${results.filesCopied} new file(s)`)); - } - if (results.preserved > 0) { - console.log(chalk.dim(` Preserved ${results.preserved} existing file(s)`)); - } - } - } - } - } catch (error) { - console.warn(chalk.yellow(`Warning: Failed to update custom content: ${error.message}`)); - } - } - - /** - * Install custom content by ID - * @param {string} customId - Custom content ID - * @param {string} bmadDir - BMAD installation directory - * @param {Object} coreConfig - Core configuration - */ - async installCustomContent(customId, bmadDir, coreConfig) { - try { - // Find the custom content - const customContents = await this.customHandler.findCustomContent(process.cwd()); - let customInfo = null; - let customPath = null; - - for (const path of customContents) { - const info = await this.customHandler.getCustomInfo(path); - if (info && info.id === customId) { - customInfo = info; - customPath = path; - break; - } - } - - if (!customInfo || !customPath) { - console.warn(chalk.yellow(`Warning: Custom content '${customId}' not found`)); - return; - } - - console.log(chalk.dim(` Installing: ${customInfo.name}`)); - - // Install the custom content - const results = await this.customHandler.install( - customPath, - bmadDir, - { - user_name: coreConfig.user_name, - communication_language: coreConfig.communication_language, - output_folder: coreConfig.output_folder, - bmad_folder: path.basename(bmadDir), - }, - (filePath) => { - this.installedFiles.push(filePath); - }, - ); - - // Show results - if (results.agentsInstalled > 0) { - console.log(chalk.dim(` ${results.agentsInstalled} agent(s) installed`)); - } - if (results.workflowsInstalled > 0) { - console.log(chalk.dim(` ${results.workflowsInstalled} workflow(s) installed`)); - } - if (results.filesCopied > 0) { - console.log(chalk.dim(` ${results.filesCopied} file(s) copied`)); - } - if (results.preserved > 0) { - console.log(chalk.dim(` ${results.preserved} file(s) preserved`)); - } - if (results.errors.length > 0) { - console.log(chalk.yellow(` ${results.errors.length} error(s)`)); - for (const error of results.errors) console.log(chalk.dim(` - ${error}`)); - } - } catch (error) { - console.error(chalk.red(`Failed to install custom content '${customId}':`, error.message)); - } - } - /** * Private: Create directory structure */ diff --git a/tools/cli/installers/lib/modules/manager.js b/tools/cli/installers/lib/modules/manager.js index 063f82f9..9081ba3b 100644 --- a/tools/cli/installers/lib/modules/manager.js +++ b/tools/cli/installers/lib/modules/manager.js @@ -121,8 +121,14 @@ class ModuleManager { for (const entry of entries) { const fullPath = path.join(dir, entry.name); - // Skip hidden directories and node_modules - if (entry.name.startsWith('.') || entry.name === 'node_modules' || entry.name === 'dist' || entry.name === 'build') { + // Skip hidden directories, node_modules, and literal placeholder directories + if ( + entry.name.startsWith('.') || + entry.name === 'node_modules' || + entry.name === 'dist' || + entry.name === 'build' || + entry.name === '{project-root}' + ) { continue; } @@ -139,9 +145,14 @@ class ModuleManager { // Check if this directory contains a module (install-config.yaml OR custom.yaml) const installerConfigPath = path.join(fullPath, '_module-installer', 'install-config.yaml'); - const customConfigPath = path.join(fullPath, 'custom.yaml'); + const customConfigPath = path.join(fullPath, '_module-installer', 'custom.yaml'); + const rootCustomConfigPath = path.join(fullPath, 'custom.yaml'); - if ((await fs.pathExists(installerConfigPath)) || (await fs.pathExists(customConfigPath))) { + if ( + (await fs.pathExists(installerConfigPath)) || + (await fs.pathExists(customConfigPath)) || + (await fs.pathExists(rootCustomConfigPath)) + ) { modulePaths.add(fullPath); // Don't scan inside modules - they might have their own nested structures continue; @@ -176,11 +187,12 @@ class ModuleManager { for (const entry of entries) { if (entry.isDirectory()) { const modulePath = path.join(this.modulesSourcePath, entry.name); - // Check for module structure (only install-config.yaml is valid now) + // Check for module structure (install-config.yaml OR custom.yaml) const installerConfigPath = path.join(modulePath, '_module-installer', 'install-config.yaml'); + const customConfigPath = path.join(modulePath, '_module-installer', 'custom.yaml'); // Skip if this doesn't look like a module - if (!(await fs.pathExists(installerConfigPath))) { + if (!(await fs.pathExists(installerConfigPath)) && !(await fs.pathExists(customConfigPath))) { continue; } @@ -228,13 +240,16 @@ class ModuleManager { async getModuleInfo(modulePath, defaultName, sourceDescription) { // Check for module structure (install-config.yaml OR custom.yaml) const installerConfigPath = path.join(modulePath, '_module-installer', 'install-config.yaml'); - const customConfigPath = path.join(modulePath, 'custom.yaml'); + const customConfigPath = path.join(modulePath, '_module-installer', 'custom.yaml'); + const rootCustomConfigPath = path.join(modulePath, 'custom.yaml'); let configPath = null; if (await fs.pathExists(installerConfigPath)) { configPath = installerConfigPath; } else if (await fs.pathExists(customConfigPath)) { configPath = customConfigPath; + } else if (await fs.pathExists(rootCustomConfigPath)) { + configPath = rootCustomConfigPath; } // Skip if this doesn't look like a module @@ -242,6 +257,8 @@ class ModuleManager { return null; } + // Mark as custom if it's using custom.yaml OR if it's outside src/modules + const isCustomSource = sourceDescription !== 'src/modules'; const moduleInfo = { id: defaultName, path: modulePath, @@ -252,7 +269,7 @@ class ModuleManager { description: 'BMAD Module', version: '5.0.0', source: sourceDescription, - isCustom: configPath === customConfigPath, + isCustom: configPath === customConfigPath || configPath === rootCustomConfigPath || isCustomSource, }; // Read module config for metadata @@ -295,8 +312,8 @@ class ModuleManager { return srcModulePath; } - // Also check for custom.yaml in src/modules - const customConfigPath = path.join(srcModulePath, 'custom.yaml'); + // Also check for custom.yaml in src/modules/_module-installer + const customConfigPath = path.join(srcModulePath, '_module-installer', 'custom.yaml'); if (await fs.pathExists(customConfigPath)) { return srcModulePath; } @@ -314,13 +331,16 @@ class ModuleManager { // Need to read configs to match by ID for (const modulePath of allModulePaths) { const installerConfigPath = path.join(modulePath, '_module-installer', 'install-config.yaml'); - const customConfigPath = path.join(modulePath, 'custom.yaml'); + const customConfigPath = path.join(modulePath, '_module-installer', 'custom.yaml'); + const rootCustomConfigPath = path.join(modulePath, 'custom.yaml'); let configPath = null; if (await fs.pathExists(installerConfigPath)) { configPath = installerConfigPath; } else if (await fs.pathExists(customConfigPath)) { configPath = customConfigPath; + } else if (await fs.pathExists(rootCustomConfigPath)) { + configPath = rootCustomConfigPath; } if (configPath) { @@ -532,7 +552,8 @@ class ModuleManager { } // Skip config.yaml templates - we'll generate clean ones with actual values - if (file === 'config.yaml' || file.endsWith('/config.yaml')) { + // But allow custom.yaml which is used for custom modules + if ((file === 'config.yaml' || file.endsWith('/config.yaml')) && !file.endsWith('custom.yaml')) { continue; } @@ -1059,6 +1080,7 @@ class ModuleManager { const result = await moduleInstaller.install({ projectRoot, config: options.moduleConfig || {}, + coreConfig: options.coreConfig || {}, installedIDEs: options.installedIDEs || [], logger, }); From 119187a1e7f98aca636e3988d17c6631b8209f22 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sun, 7 Dec 2025 02:10:03 -0600 Subject: [PATCH 18/26] custom module installer improved, and removed agent-install --- docs/custom-agent-installation.md | 178 ++--- package.json | 1 - .../bmb/_module-installer/install-config.yaml | 2 +- .../docs/agents/simple-agent-architecture.md | 10 +- .../data/info-and-installation-guide.md | 22 +- tools/cli/commands/agent-install.js | 641 ------------------ .../installers/lib/core/config-collector.js | 18 + tools/cli/installers/lib/modules/manager.js | 33 +- 8 files changed, 140 insertions(+), 765 deletions(-) delete mode 100644 tools/cli/commands/agent-install.js diff --git a/docs/custom-agent-installation.md b/docs/custom-agent-installation.md index 15098094..11b6abc1 100644 --- a/docs/custom-agent-installation.md +++ b/docs/custom-agent-installation.md @@ -1,125 +1,68 @@ # Custom Agent Installation -Install and personalize BMAD agents in your project. +BMAD agents and workflows are now installed through the main CLI installer using a `custom.yaml` configuration file or by having an installer file. ## Quick Start +Create a `custom.yaml` file in the root of your agent/workflow folder: + +```yaml +code: my-custom-agent +name: 'My Custom Agent' +default_selected: true +``` + +Then run the BMAD installer from your project directory: + ```bash -# From your project directory with BMAD installed -npx bmad-method agent-install +npx bmad-method install ``` Or if you have bmad-cli installed globally: ```bash -bmad agent-install +bmad install +``` + +## Installation Methods + +### Method 1: Stand-alone Folder with custom.yaml + +Place your agent or workflow in a folder with a `custom.yaml` file at the root: + +``` +my-agent/ +├── custom.yaml # Required configuration file +├── my-agent.agent.yaml +└── sidecar/ # Optional + └── instructions.md +``` + +### Method 2: Installer File + +For more complex installations, include an `installer.js` or `installer.yaml` file in your agent/workflow folder: + +``` +my-workflow/ +├── workflow.md +└── installer.yaml # Custom installation logic ``` ## What It Does -1. **Discovers** available agent templates from your custom agents folder -2. **Prompts** you to personalize the agent (name, behavior, preferences) -3. **Compiles** the agent with your choices baked in -4. **Installs** to your project's `.bmad/custom/agents/` directory -5. **Creates** IDE commands for all your configured IDEs (Claude Code, Codex, Cursor, etc.) -6. **Saves** your configuration for automatic reinstallation during BMAD updates +1. **Discovers** available agents and workflows from folders with `custom.yaml` +2. **Installs** to your project's `.bmad/custom/` directory +3. **Creates** IDE commands for all your configured IDEs (Claude Code, Codex, Cursor, etc.) +4. **Registers** the agent/workflow in the BMAD system -## Options +## Example custom.yaml -```bash -bmad agent-install [options] - -Options: - -p, --path #Direct path to specific agent YAML file or folder - -d, --defaults #Use default values without prompting - -t, --target #Target installation directory +```yaml +code: my-custom-agent +name: 'My Custom Agent' +default_selected: true ``` -## Installing from Custom Locations - -Use the `-s` / `--source` option to install agents from any location: - -```bash -# Install agent from a custom folder (expert agent with sidecar) -bmad agent-install -s path/to/my-agent - -# Install a specific .agent.yaml file (simple agent) -bmad agent-install -s path/to/my-agent.agent.yaml - -# Install with defaults (non-interactive) -bmad agent-install -s path/to/my-agent -d - -# Install to a specific destination project -bmad agent-install -s path/to/my-agent --destination /path/to/destination/project -``` - -This is useful when: - -- Your agent is in a non-standard location (not in `.bmad/custom/agents/`) -- You're developing an agent outside the project structure -- You want to install from an absolute path - -## Example Session - -``` -🔧 BMAD Agent Installer - -Found BMAD at: /project/.bmad -Searching for agents in: /project/.bmad/custom/agents - -Available Agents: - - 1. 📄 commit-poet (simple) - 2. 📚 journal-keeper (expert) - -Select agent to install (number): 1 - -Selected: commit-poet - -📛 Agent Persona Name - - Agent type: commit-poet - Default persona: Inkwell Von Comitizen - - Custom name (or Enter for default): Fred - - Persona: Fred - File: fred-commit-poet.md - -📝 Agent Configuration - - What's your preferred default commit message style? - * 1. Conventional (feat/fix/chore) - 2. Narrative storytelling - 3. Poetic haiku - 4. Detailed explanation - Choice (default: 1): 1 - - How enthusiastic should the agent be? - 1. Moderate - Professional with personality - * 2. High - Genuinely excited - 3. EXTREME - Full theatrical drama - Choice (default: 2): 3 - - Include emojis in commit messages? [Y/n]: y - -✨ Agent installed successfully! - Name: fred-commit-poet - Location: /project/.bmad/custom/agents/fred-commit-poet - Compiled: fred-commit-poet.md - - ✓ Source saved for reinstallation - ✓ Added to agent-manifest.csv - ✓ Created IDE commands: - claude-code: /bmad:custom:agents:fred-commit-poet - codex: /bmad-custom-agents-fred-commit-poet - github-copilot: bmad-agent-custom-fred-commit-poet -``` - -## Reinstallation - -Custom agents are automatically reinstalled when you run `bmad init --quick`. Your personalization choices are preserved in `.bmad/_cfg/custom/agents/`. - ## Installing Reference Agents The BMAD source includes example agents you can install. **You must copy them to your project first.** @@ -130,8 +73,9 @@ The BMAD source includes example agents you can install. **You must copy them to ```bash # From your project root +mkdir -p .bmad/custom/agents/my-agent cp node_modules/bmad-method/src/modules/bmb/reference/agents/stand-alone/commit-poet.agent.yaml \ - .bmad/custom/agents/ + .bmad/custom/agents/my-agent/ ``` **For expert agents** (folder with sidecar files): @@ -142,19 +86,29 @@ cp -r node_modules/bmad-method/src/modules/bmb/reference/agents/agent-with-memor .bmad/custom/agents/ ``` -### Step 2: Install and Personalize +### Step 2: Create custom.yaml ```bash -npx bmad-method agent-install -# or: bmad agent-install (if BMAD installed locally) +# In the agent folder, create custom.yaml +cat > .bmad/custom/agents/my-agent/custom.yaml << EOF +code: my-agent +name: "My Custom Agent" +default_selected: true +EOF +``` + +### Step 3: Install + +```bash +npx bmad-method install +# or: bmad install (if BMAD installed locally) ``` The installer will: -1. Find the copied template in `.bmad/custom/agents/` -2. Prompt for personalization (name, behavior, preferences) -3. Compile and install with your choices baked in -4. Create IDE commands for immediate use +1. Find the agent with its `custom.yaml` +2. Install it to the appropriate location +3. Create IDE commands for immediate use ### Available Reference Agents @@ -180,4 +134,4 @@ src/modules/bmb/reference/agents/ ## Creating Your Own -Use the BMB agent builder to craft your agents. Once ready to use yourself, place your `.agent.yaml` files or folder in `.bmad/custom/agents/`. +Use the BMB agent builder to craft your agents. Once ready to use, place your `.agent.yaml` files or folders with `custom.yaml` in `.bmad/custom/agents/` or `.bmad/custom/workflows/`. diff --git a/package.json b/package.json index b3031495..3c99b1f6 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,6 @@ "bmad-method": "tools/bmad-npx-wrapper.js" }, "scripts": { - "bmad:agent-install": "node tools/cli/bmad-cli.js agent-install", "bmad:install": "node tools/cli/bmad-cli.js install", "bmad:status": "node tools/cli/bmad-cli.js status", "bundle": "node tools/cli/bundlers/bundle-web.js all", diff --git a/src/modules/bmb/_module-installer/install-config.yaml b/src/modules/bmb/_module-installer/install-config.yaml index 1f80c9f9..85df89c0 100644 --- a/src/modules/bmb/_module-installer/install-config.yaml +++ b/src/modules/bmb/_module-installer/install-config.yaml @@ -22,5 +22,5 @@ custom_stand_alone_location: custom_module_location: prompt: "Where do custom modules get stored?" - default: "bmad-custom-modules-src/modules" + default: "bmad-custom-modules-src" result: "{project-root}/{value}" diff --git a/src/modules/bmb/docs/agents/simple-agent-architecture.md b/src/modules/bmb/docs/agents/simple-agent-architecture.md index 239d29d7..9d1898b7 100644 --- a/src/modules/bmb/docs/agents/simple-agent-architecture.md +++ b/src/modules/bmb/docs/agents/simple-agent-architecture.md @@ -217,9 +217,13 @@ Features demonstrated: # Copy to your project cp /path/to/commit-poet.agent.yaml .bmad/custom/agents/ -# Install with personalization -bmad agent-install -# or: npx bmad-method agent-install +# Create custom.yaml and install +echo "code: my-agent +name: My Agent +default_selected: true" > custom.yaml + +npx bmad-method install +# or: bmad install ``` The installer: diff --git a/src/modules/bmb/workflows/create-agent/data/info-and-installation-guide.md b/src/modules/bmb/workflows/create-agent/data/info-and-installation-guide.md index 304bbb98..d4ad0f7e 100644 --- a/src/modules/bmb/workflows/create-agent/data/info-and-installation-guide.md +++ b/src/modules/bmb/workflows/create-agent/data/info-and-installation-guide.md @@ -2,12 +2,24 @@ ## Installation -```bash -# Quick install (interactive) -npx bmad-method agent-install --source ./{agent_filename}.agent.yaml +Create a `custom.yaml` file in the agent folder: -# Quick install (non-interactive) -npx bmad-method agent-install --source ./{agent_filename}.agent.yaml --defaults +```yaml +code: { agent_code } +name: '{agent_name}' +default_selected: true +``` + +Then run: + +```bash +npx bmad-method install +``` + +Or if you have bmad-cli installed globally: + +```bash +bmad install ``` ## About This Agent diff --git a/tools/cli/commands/agent-install.js b/tools/cli/commands/agent-install.js deleted file mode 100644 index 2e5dca21..00000000 --- a/tools/cli/commands/agent-install.js +++ /dev/null @@ -1,641 +0,0 @@ -const chalk = require('chalk'); -const path = require('node:path'); -const fs = require('node:fs'); -const readline = require('node:readline'); -const yaml = require('js-yaml'); -const inquirer = require('inquirer'); -const { - findBmadConfig, - resolvePath, - discoverAgents, - loadAgentConfig, - promptInstallQuestions, - detectBmadProject, - addToManifest, - extractManifestData, - checkManifestForPath, - updateManifestEntry, - saveAgentSource, - createIdeSlashCommands, - updateManifestYaml, -} = require('../lib/agent/installer'); - -/** - * Initialize BMAD core infrastructure in a directory - * @param {string} projectDir - Project directory where .bmad should be created - * @param {string} bmadFolderName - Name of the BMAD folder (default: .bmad) - * @returns {Promise} BMAD project info - */ -async function initializeBmadCore(projectDir, bmadFolderName = '.bmad') { - const bmadDir = path.join(projectDir, bmadFolderName); - const cfgDir = path.join(bmadDir, '_cfg'); - - console.log(chalk.cyan('\n🏗️ Initializing BMAD Core Infrastructure\n')); - - // Use the ConfigCollector to ask proper core configuration questions - const { ConfigCollector } = require('../installers/lib/core/config-collector'); - const configCollector = new ConfigCollector(); - - // Collect core configuration answers - await configCollector.loadExistingConfig(projectDir); - await configCollector.collectModuleConfig('core', projectDir, true, true); - - // Extract core answers from allAnswers (they are prefixed with 'core_') - const coreAnswers = {}; - if (configCollector.allAnswers) { - for (const [key, value] of Object.entries(configCollector.allAnswers)) { - if (key.startsWith('core_')) { - const configKey = key.slice(5); // Remove 'core_' prefix - coreAnswers[configKey] = value; - } - } - } - - // Ask for IDE selection - console.log(chalk.cyan('\n💻 IDE Configuration\n')); - console.log(chalk.dim('Select IDEs to integrate with the installed agents:')); - - const { UI } = require('../lib/ui'); - const ui = new UI(); - const ideConfig = await ui.promptToolSelection(projectDir, ['core']); - const selectedIdes = ideConfig.ides || []; - - // Create directory structure - console.log(chalk.dim('\nCreating directory structure...')); - await fs.promises.mkdir(bmadDir, { recursive: true }); - await fs.promises.mkdir(cfgDir, { recursive: true }); - await fs.promises.mkdir(path.join(bmadDir, 'core'), { recursive: true }); - await fs.promises.mkdir(path.join(bmadDir, 'custom', 'agents'), { recursive: true }); - await fs.promises.mkdir(path.join(cfgDir, 'agents'), { recursive: true }); - await fs.promises.mkdir(path.join(cfgDir, 'custom', 'agents'), { recursive: true }); - - // Create core config.yaml file - const coreConfigFile = { - '# CORE Module Configuration': 'Generated by BMAD Agent Installer', - Version: require(path.join(__dirname, '../../../package.json')).version, - Date: new Date().toISOString(), - bmad_folder: bmadFolderName, - ...coreAnswers, - }; - - const coreConfigPath = path.join(bmadDir, 'core', 'config.yaml'); - await fs.promises.writeFile(coreConfigPath, yaml.dump(coreConfigFile), 'utf8'); - - // Create manifest.yaml with complete structure - const manifest = { - version: require(path.join(__dirname, '../../../package.json')).version, - date: new Date().toISOString(), - user_name: coreAnswers.user_name, - communication_language: coreAnswers.communication_language, - document_output_language: coreAnswers.document_output_language, - output_folder: coreAnswers.output_folder, - install_user_docs: coreAnswers.install_user_docs, - bmad_folder: bmadFolderName, - modules: ['core'], - ides: selectedIdes, - custom_agents: [], - }; - - const manifestPath = path.join(cfgDir, 'manifest.yaml'); - await fs.promises.writeFile(manifestPath, yaml.dump(manifest), 'utf8'); - - // Create empty manifests - const agentManifestPath = path.join(cfgDir, 'agent-manifest.csv'); - await fs.promises.writeFile(agentManifestPath, 'type,subtype,name,path,display_name,description,author,version,tags\n', 'utf8'); - - // Setup IDE configurations - if (selectedIdes.length > 0) { - console.log(chalk.dim('\nSetting up IDE configurations...')); - const { IdeManager } = require('../installers/lib/ide/manager'); - const ideManager = new IdeManager(); - - for (const ide of selectedIdes) { - await ideManager.setup(ide, projectDir, bmadDir, { - selectedModules: ['core'], - skipModuleInstall: false, - verbose: false, - preCollectedConfig: coreAnswers, - }); - } - } - - console.log(chalk.green('\n✓ BMAD core infrastructure initialized')); - console.log(chalk.dim(` BMAD folder: ${bmadDir}`)); - console.log(chalk.dim(` Core config: ${coreConfigPath}`)); - console.log(chalk.dim(` Manifest: ${manifestPath}`)); - if (selectedIdes.length > 0) { - console.log(chalk.dim(` IDEs configured: ${selectedIdes.join(', ')}`)); - } - - return { - projectRoot: projectDir, - bmadFolder: bmadDir, - cfgFolder: cfgDir, - manifestFile: agentManifestPath, - ides: selectedIdes, - }; -} - -module.exports = { - command: 'agent-install', - description: 'Install and compile BMAD agents with personalization', - options: [ - ['-s, --source ', 'Path to specific agent YAML file or folder'], - ['-d, --defaults', 'Use default values without prompting'], - ['-t, --destination ', 'Target installation directory (default: current project BMAD installation)'], - ], - action: async (options) => { - try { - console.log(chalk.cyan('\n🔧 BMAD Agent Installer\n')); - - // Find BMAD config - const config = findBmadConfig(); - if (!config) { - console.log(chalk.yellow('No BMAD installation found in current directory.')); - console.log(chalk.dim('Looking for .bmad/bmb/config.yaml...')); - console.log(chalk.red('\nPlease run this command from a project with BMAD installed.')); - process.exit(1); - } - - console.log(chalk.dim(`Found BMAD at: ${config.bmadFolder}`)); - - let selectedAgent = null; - - // If source provided, use it directly - if (options.source) { - const providedPath = path.resolve(options.source); - - if (!fs.existsSync(providedPath)) { - console.log(chalk.red(`Path not found: ${providedPath}`)); - process.exit(1); - } - - const stat = fs.statSync(providedPath); - if (stat.isFile() && providedPath.endsWith('.agent.yaml')) { - selectedAgent = { - type: 'simple', - name: path.basename(providedPath, '.agent.yaml'), - path: providedPath, - yamlFile: providedPath, - }; - } else if (stat.isDirectory()) { - const yamlFiles = fs.readdirSync(providedPath).filter((f) => f.endsWith('.agent.yaml')); - if (yamlFiles.length === 1) { - selectedAgent = { - type: 'expert', - name: path.basename(providedPath), - path: providedPath, - yamlFile: path.join(providedPath, yamlFiles[0]), - hasSidecar: true, - }; - } else { - console.log(chalk.red('Directory must contain exactly one .agent.yaml file')); - process.exit(1); - } - } else { - console.log(chalk.red('Path must be an .agent.yaml file or a folder containing one')); - process.exit(1); - } - } else { - // Discover agents from custom location - const customAgentLocation = config.custom_stand_alone_location - ? resolvePath(config.custom_stand_alone_location, config) - : path.join(config.bmadFolder, 'custom', 'src', 'agents'); - - console.log(chalk.dim(`Searching for agents in: ${customAgentLocation}\n`)); - - const agents = discoverAgents(customAgentLocation); - - if (agents.length === 0) { - console.log(chalk.yellow('No agents found in custom agent location.')); - console.log(chalk.dim(`Expected location: ${customAgentLocation}`)); - console.log(chalk.dim('\nCreate agents using the BMad Builder workflow or place .agent.yaml files there.')); - process.exit(0); - } - - // List available agents - console.log(chalk.cyan('Available Agents:\n')); - for (const [idx, agent] of agents.entries()) { - const typeIcon = agent.type === 'expert' ? '📚' : '📄'; - console.log(` ${idx + 1}. ${typeIcon} ${chalk.bold(agent.name)} ${chalk.dim(`(${agent.type})`)}`); - } - - // Prompt for selection - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - - const selection = await new Promise((resolve) => { - rl.question('\nSelect agent to install (number): ', resolve); - }); - rl.close(); - - const selectedIdx = parseInt(selection, 10) - 1; - if (isNaN(selectedIdx) || selectedIdx < 0 || selectedIdx >= agents.length) { - console.log(chalk.red('Invalid selection')); - process.exit(1); - } - - selectedAgent = agents[selectedIdx]; - } - - console.log(chalk.cyan(`\nSelected: ${chalk.bold(selectedAgent.name)}`)); - - // Load agent configuration - const agentConfig = loadAgentConfig(selectedAgent.yamlFile); - - // Check if agent has sidecar - if (agentConfig.metadata.hasSidecar) { - selectedAgent.hasSidecar = true; - } - - if (agentConfig.metadata.name) { - console.log(chalk.dim(`Agent Name: ${agentConfig.metadata.name}`)); - } - if (agentConfig.metadata.title) { - console.log(chalk.dim(`Title: ${agentConfig.metadata.title}`)); - } - if (agentConfig.metadata.hasSidecar) { - console.log(chalk.dim(`Sidecar: Yes`)); - } - - // Get the agent type (source name) - const agentType = selectedAgent.name; // e.g., "commit-poet" - - // Confirm/customize agent persona name - const rl1 = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - - const defaultPersonaName = agentConfig.metadata.name || agentType; - console.log(chalk.cyan('\n📛 Agent Persona Name\n')); - console.log(chalk.dim(` Agent type: ${agentType}`)); - console.log(chalk.dim(` Default persona: ${defaultPersonaName}`)); - console.log(chalk.dim(' Leave blank to use default, or provide a custom name.')); - console.log(chalk.dim(' Examples:')); - console.log(chalk.dim(` - (blank) → "${defaultPersonaName}" as ${agentType}.md`)); - console.log(chalk.dim(` - "Fred" → "Fred" as fred-${agentType}.md`)); - console.log(chalk.dim(` - "Captain Code" → "Captain Code" as captain-code-${agentType}.md`)); - - const customPersonaName = await new Promise((resolve) => { - rl1.question(`\n Custom name (or Enter for default): `, resolve); - }); - rl1.close(); - - // Determine final agent file name based on persona name - let finalAgentName; - let personaName; - if (customPersonaName.trim()) { - personaName = customPersonaName.trim(); - const namePrefix = personaName.toLowerCase().replaceAll(/\s+/g, '-'); - finalAgentName = `${namePrefix}-${agentType}`; - } else { - personaName = defaultPersonaName; - finalAgentName = agentType; - } - - console.log(chalk.dim(` Persona: ${personaName}`)); - console.log(chalk.dim(` File: ${finalAgentName}.md`)); - - // Get answers (prompt or use defaults) - let presetAnswers = {}; - - // If custom persona name provided, inject it as custom_name for template processing - if (customPersonaName.trim()) { - presetAnswers.custom_name = personaName; - } - - let answers; - if (agentConfig.installConfig && !options.defaults) { - answers = await promptInstallQuestions(agentConfig.installConfig, agentConfig.defaults, presetAnswers); - } else if (agentConfig.installConfig && options.defaults) { - console.log(chalk.dim('\nUsing default configuration values.')); - answers = { ...agentConfig.defaults, ...presetAnswers }; - } else { - answers = { ...agentConfig.defaults, ...presetAnswers }; - } - - // Determine target directory - let targetDir = options.destination ? path.resolve(options.destination) : null; - - // If no target specified, prompt for it - if (targetDir) { - // Check if target has BMAD infrastructure - const otherProject = detectBmadProject(targetDir); - - if (!otherProject) { - // No BMAD infrastructure found - offer to initialize - console.log(chalk.yellow(`\n⚠️ No BMAD infrastructure found in: ${targetDir}`)); - - const initResponse = await inquirer.prompt([ - { - type: 'confirm', - name: 'initialize', - message: 'Initialize BMAD core infrastructure here? (Choose No for direct installation)', - default: true, - }, - ]); - - if (initResponse.initialize) { - // Initialize BMAD core - targetDir = path.resolve(targetDir); - await initializeBmadCore(targetDir, '.bmad'); - // Set targetDir to the custom agents folder - targetDir = path.join(targetDir, '.bmad', 'custom', 'agents'); - console.log(chalk.dim(` Agent will be installed to: ${targetDir}`)); - } else { - // User declined - keep original targetDir - console.log(chalk.yellow(` Installing agent directly to: ${targetDir}`)); - } - } else if (otherProject && !targetDir.includes('agents')) { - console.log(chalk.yellow(`\n⚠️ Path is inside BMAD project: ${otherProject.projectRoot}`)); - - const projectChoice = await inquirer.prompt([ - { - type: 'list', - name: 'choice', - message: 'Choose installation method:', - choices: [ - { name: `Install to BMAD's custom agents folder (${otherProject.bmadFolder}/custom/agents)`, value: 'bmad' }, - { name: `Install directly to specified path (${targetDir})`, value: 'direct' }, - ], - default: 'bmad', - }, - ]); - - if (projectChoice.choice === 'bmad') { - targetDir = path.join(otherProject.bmadFolder, 'custom', 'agents'); - console.log(chalk.dim(` Installing to BMAD custom agents folder: ${targetDir}`)); - } else { - console.log(chalk.yellow(` Installing directly to: ${targetDir}`)); - } - } - } else { - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - - console.log(chalk.cyan('\n📂 Installation Target\n')); - - // Option 1: Current project's custom agents folder - const currentCustom = path.join(config.bmadFolder, 'custom', 'agents'); - console.log(` 1. Current project: ${chalk.dim(currentCustom)}`); - console.log(` 2. Enter path directly (e.g., /Users/brianmadison/dev/test)`); - - const choice = await new Promise((resolve) => { - rl.question('\n Select option (1 or 2): ', resolve); - }); - - if (choice.trim() === '1' || choice.trim() === '') { - targetDir = currentCustom; - } else if (choice.trim() === '2') { - const userPath = await new Promise((resolve) => { - rl.question(' Enter path: ', resolve); - }); - - // Detect if it's a BMAD project and use its custom folder - const otherProject = detectBmadProject(path.resolve(userPath)); - - if (otherProject) { - console.log(chalk.yellow(`\n⚠️ Path is inside BMAD project: ${otherProject.projectRoot}`)); - - const projectChoice = await inquirer.prompt([ - { - type: 'list', - name: 'choice', - message: 'Choose installation method:', - choices: [ - { name: `Install to BMAD's custom agents folder (${otherProject.bmadFolder}/custom/agents)`, value: 'bmad' }, - { name: `Install directly to specified path (${userPath})`, value: 'direct' }, - ], - default: 'bmad', - }, - ]); - - if (projectChoice.choice === 'bmad') { - targetDir = path.join(otherProject.bmadFolder, 'custom', 'agents'); - console.log(chalk.dim(` Installing to BMAD custom agents folder: ${targetDir}`)); - } else { - targetDir = path.resolve(userPath); - console.log(chalk.yellow(` Installing directly to: ${targetDir}`)); - } - } else { - // No BMAD found - offer to initialize - console.log(chalk.yellow(`\n⚠️ No BMAD infrastructure found in: ${userPath}`)); - - const initResponse = await inquirer.prompt([ - { - type: 'confirm', - name: 'initialize', - message: 'Initialize BMAD core infrastructure here? (Choose No for direct installation)', - default: true, - }, - ]); - - if (initResponse.initialize) { - await initializeBmadCore(path.resolve(userPath), '.bmad'); - targetDir = path.join(path.resolve(userPath), '.bmad', 'custom', 'agents'); - console.log(chalk.dim(` Agent will be installed to: ${targetDir}`)); - } else { - // User declined - create the directory and install directly - targetDir = path.resolve(userPath); - console.log(chalk.yellow(` Installing agent directly to: ${targetDir}`)); - } - } - } else { - console.log(chalk.red(' Invalid selection. Please choose 1 or 2.')); - rl.close(); - process.exit(1); - } - - rl.close(); - } - - if (!fs.existsSync(targetDir)) { - fs.mkdirSync(targetDir, { recursive: true }); - } - - console.log(chalk.dim(`\nInstalling to: ${targetDir}`)); - - // Detect if target is within a BMAD project - const targetProject = detectBmadProject(targetDir); - if (targetProject) { - console.log(chalk.cyan(` Detected BMAD project at: ${targetProject.projectRoot}`)); - } - - // Check for duplicate in manifest by path (not by type) - let shouldUpdateExisting = false; - let existingEntry = null; - - if (targetProject) { - // Check if this exact installed name already exists - const expectedPath = `.bmad/custom/agents/${finalAgentName}/${finalAgentName}.md`; - existingEntry = checkManifestForPath(targetProject.manifestFile, expectedPath); - - if (existingEntry) { - const rl2 = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - - console.log(chalk.yellow(`\n⚠️ Agent "${finalAgentName}" already installed`)); - console.log(chalk.dim(` Type: ${agentType}`)); - console.log(chalk.dim(` Path: ${existingEntry.path}`)); - - const overwrite = await new Promise((resolve) => { - rl2.question(' Overwrite existing installation? [Y/n]: ', resolve); - }); - rl2.close(); - - if (overwrite.toLowerCase() === 'n') { - console.log(chalk.yellow('Installation cancelled.')); - process.exit(0); - } - - shouldUpdateExisting = true; - } - } - - // Install the agent with custom name - // Override the folder name with finalAgentName - const agentTargetDir = path.join(targetDir, finalAgentName); - - if (!fs.existsSync(agentTargetDir)) { - fs.mkdirSync(agentTargetDir, { recursive: true }); - } - - // Compile and install - const { compileAgent } = require('../lib/agent/compiler'); - - // Calculate target path for agent ID - const projectRoot = targetProject ? targetProject.projectRoot : config.projectRoot; - const compiledFileName = `${finalAgentName}.md`; - const compiledPath = path.join(agentTargetDir, compiledFileName); - const relativePath = path.relative(projectRoot, compiledPath); - - // Read core config to get agent_sidecar_folder - const coreConfigPath = path.join(config.bmadFolder, 'bmb', 'config.yaml'); - let coreConfig = {}; - if (fs.existsSync(coreConfigPath)) { - const yamlLib = require('yaml'); - const content = fs.readFileSync(coreConfigPath, 'utf8'); - coreConfig = yamlLib.parse(content); - } - - // Compile with proper name and path - const { xml, metadata, processedYaml } = compileAgent( - fs.readFileSync(selectedAgent.yamlFile, 'utf8'), - answers, - finalAgentName, - relativePath, - { config: coreConfig }, - ); - - // Write compiled XML (.md) with custom name - fs.writeFileSync(compiledPath, xml, 'utf8'); - - const result = { - success: true, - agentName: finalAgentName, - targetDir: agentTargetDir, - compiledFile: compiledPath, - sidecarCopied: false, - }; - - // Handle sidecar files for agents with hasSidecar flag - if (selectedAgent.hasSidecar === true && selectedAgent.type === 'expert') { - const { copyAgentSidecarFiles } = require('../lib/agent/installer'); - - // Get agent sidecar folder from config or use default - const agentSidecarFolder = coreConfig?.agent_sidecar_folder || '{project-root}/.myagent-data'; - - // Resolve path variables - const resolvedSidecarFolder = agentSidecarFolder - .replaceAll('{project-root}', projectRoot) - .replaceAll('{bmad_folder}', config.bmadFolder); - - // Create sidecar directory for this agent - const agentSidecarDir = path.join(resolvedSidecarFolder, finalAgentName); - if (!fs.existsSync(agentSidecarDir)) { - fs.mkdirSync(agentSidecarDir, { recursive: true }); - } - - // Find and copy sidecar folder - const sidecarFiles = copyAgentSidecarFiles(selectedAgent.path, agentSidecarDir, selectedAgent.yamlFile); - result.sidecarCopied = true; - result.sidecarFiles = sidecarFiles; - result.sidecarDir = agentSidecarDir; - - console.log(chalk.dim(` Sidecar copied to: ${agentSidecarDir}`)); - } - - console.log(chalk.green('\n✨ Agent installed successfully!')); - console.log(chalk.cyan(` Name: ${result.agentName}`)); - console.log(chalk.cyan(` Location: ${result.targetDir}`)); - console.log(chalk.cyan(` Compiled: ${path.basename(result.compiledFile)}`)); - - if (result.sidecarCopied) { - console.log(chalk.cyan(` Sidecar files: ${result.sidecarFiles.length} files copied`)); - } - - // Save source YAML to _cfg/custom/agents/ and register in manifest - if (targetProject) { - // Save source for reinstallation with embedded answers - console.log(chalk.dim(`\nSaving source to: ${targetProject.cfgFolder}/custom/agents/`)); - saveAgentSource(selectedAgent, targetProject.cfgFolder, finalAgentName, answers); - console.log(chalk.green(` ✓ Source saved for reinstallation`)); - - // Register/update in manifest - console.log(chalk.dim(`Registering in manifest: ${targetProject.manifestFile}`)); - - const manifestData = extractManifestData(xml, { ...metadata, name: finalAgentName }, relativePath, 'custom'); - // Use finalAgentName as the manifest name field (unique identifier) - manifestData.name = finalAgentName; - // Use compiled metadata.name (persona name after template processing), not source agentConfig - manifestData.displayName = metadata.name || agentType; - // Store the actual installed path/name - manifestData.path = relativePath; - - if (shouldUpdateExisting && existingEntry) { - updateManifestEntry(targetProject.manifestFile, manifestData, existingEntry._lineNumber); - console.log(chalk.green(` ✓ Updated existing entry in agent-manifest.csv`)); - } else { - addToManifest(targetProject.manifestFile, manifestData); - console.log(chalk.green(` ✓ Added to agent-manifest.csv`)); - } - - // Create IDE slash commands - const ideResults = await createIdeSlashCommands(targetProject.projectRoot, finalAgentName, relativePath, metadata); - if (Object.keys(ideResults).length > 0) { - console.log(chalk.green(` ✓ Created IDE commands:`)); - for (const [ideName, result] of Object.entries(ideResults)) { - console.log(chalk.dim(` ${ideName}: ${result.command}`)); - } - } - - // Update manifest.yaml with custom_agents tracking - const manifestYamlPath = path.join(targetProject.cfgFolder, 'manifest.yaml'); - if (updateManifestYaml(manifestYamlPath, finalAgentName, agentType)) { - console.log(chalk.green(` ✓ Updated manifest.yaml custom_agents`)); - } - } - - console.log(chalk.dim(`\nAgent ID: ${relativePath}`)); - - if (targetProject) { - console.log(chalk.yellow('\nAgent is now registered and available in the target project!')); - } else { - console.log(chalk.yellow('\nTo use this agent, reference it in your manifest or load it directly.')); - } - - process.exit(0); - } catch (error) { - console.error(chalk.red('Agent installation failed:'), error.message); - console.error(chalk.dim(error.stack)); - process.exit(1); - } - }, -}; diff --git a/tools/cli/installers/lib/core/config-collector.js b/tools/cli/installers/lib/core/config-collector.js index 880d9ba1..8335d8ee 100644 --- a/tools/cli/installers/lib/core/config-collector.js +++ b/tools/cli/installers/lib/core/config-collector.js @@ -198,9 +198,27 @@ class ConfigCollector { } let configPath = null; + let isCustomModule = false; + if (await fs.pathExists(installerConfigPath)) { configPath = installerConfigPath; } else { + // Check if this is a custom module with custom.yaml + const { ModuleManager } = require('../modules/manager'); + const moduleManager = new ModuleManager(); + const moduleSourcePath = await moduleManager.findModuleSource(moduleName); + + if (moduleSourcePath) { + const rootCustomConfigPath = path.join(moduleSourcePath, 'custom.yaml'); + const moduleInstallerCustomPath = path.join(moduleSourcePath, '_module-installer', 'custom.yaml'); + + if ((await fs.pathExists(rootCustomConfigPath)) || (await fs.pathExists(moduleInstallerCustomPath))) { + isCustomModule = true; + // For custom modules, we don't have an install-config schema, so just use existing values + // The custom.yaml values will be loaded and merged during installation + } + } + // No config schema for this module - use existing values if (this.existingConfig && this.existingConfig[moduleName]) { if (!this.collectedConfig[moduleName]) { diff --git a/tools/cli/installers/lib/modules/manager.js b/tools/cli/installers/lib/modules/manager.js index 9081ba3b..79fd183d 100644 --- a/tools/cli/installers/lib/modules/manager.js +++ b/tools/cli/installers/lib/modules/manager.js @@ -378,6 +378,35 @@ class ModuleManager { throw new Error(`Module '${moduleName}' not found in any source location`); } + // Check if this is a custom module and read its custom.yaml values + let customConfig = null; + const rootCustomConfigPath = path.join(sourcePath, 'custom.yaml'); + const moduleInstallerCustomPath = path.join(sourcePath, '_module-installer', 'custom.yaml'); + + if (await fs.pathExists(rootCustomConfigPath)) { + try { + const customContent = await fs.readFile(rootCustomConfigPath, 'utf8'); + customConfig = yaml.load(customContent); + } catch (error) { + console.warn(chalk.yellow(`Warning: Failed to read custom.yaml for ${moduleName}:`, error.message)); + } + } else if (await fs.pathExists(moduleInstallerCustomPath)) { + try { + const customContent = await fs.readFile(moduleInstallerCustomPath, 'utf8'); + customConfig = yaml.load(customContent); + } catch (error) { + console.warn(chalk.yellow(`Warning: Failed to read custom.yaml for ${moduleName}:`, error.message)); + } + } + + // If this is a custom module, merge its values into the module config + if (customConfig) { + options.moduleConfig = { ...options.moduleConfig, ...customConfig }; + if (options.logger) { + options.logger.log(chalk.cyan(` Merged custom configuration for ${moduleName}`)); + } + } + // Check if already installed if (await fs.pathExists(targetPath)) { console.log(chalk.yellow(`Module '${moduleName}' already installed, updating...`)); @@ -552,8 +581,8 @@ class ModuleManager { } // Skip config.yaml templates - we'll generate clean ones with actual values - // But allow custom.yaml which is used for custom modules - if ((file === 'config.yaml' || file.endsWith('/config.yaml')) && !file.endsWith('custom.yaml')) { + // Also skip custom.yaml files - their values will be merged into core config + if (file === 'config.yaml' || file.endsWith('/config.yaml') || file === 'custom.yaml' || file.endsWith('/custom.yaml')) { continue; } From 80a90c01d4b62767a7550b1ec3bec9bd6c6c30fa Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sun, 7 Dec 2025 02:21:49 -0600 Subject: [PATCH 19/26] chore: bump version to alpha.14 - Updated CHANGELOG.md with comprehensive Alpha.14 release notes - Added advanced builder features and custom installation improvements - IDE configuration preservation during upgrades - Breaking change: removed legacy agent-install command --- CHANGELOG.md | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f39d928c..28467672 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,100 @@ # Changelog +## [6.0.0-alpha.14] + +**Release: December 7, 2025** + +### 🔧 Installation & Configuration Revolution + +**Custom Module Installation Overhaul:** + +- **Simple custom.yaml Installation**: Custom agents and workflows can now be installed with a single YAML file +- **IDE Configuration Preservation**: Upgrades will no longer delete custom modules, agents, and workflows from IDE configuration +- **Removed Legacy agent-install Command**: Streamlined installation process (BREAKING CHANGE) +- **Sidecar File Retention**: Custom sidecar files are preserved during updates +- **Flexible Agent Sidecar Locations**: Fully configurable via config options instead of hardcoded paths + +**Module Discovery System Transformation:** + +- **Recursive Agent Discovery**: Deep scanning for agents across entire project structure +- **Enhanced Manifest Generation**: Comprehensive scanning of all installed modules +- **Nested Agent Support**: Fixed nested agents appearing in CLI commands +- **Module Reinstall Fix**: Prevented modules from showing as obsolete during reinstall + +### 🏗️ Advanced Builder Features + +**Workflow Builder Evolution:** + +- **Continuable Workflows**: Create workflows with sophisticated branching and continuation logic +- **Template LOD Options**: Level of Detail output options for flexible workflow generation +- **Step-Based Architecture**: Complete conversion to granular step-file system +- **Enhanced Creation Process**: Improved workflow creation with better template handling + +**Module Builder Revolution:** + +- **11-Step Module Creation**: Comprehensive step-by-step module generation process +- **Production-Ready Templates**: Complete templates for agents, installers, and workflow plans +- **Built-in Validation System**: Ensures module quality and BMad Core compliance +- **Professional Documentation**: Auto-generated module documentation and structure + +### 🚀 BMad Method (BMM) Enhancements + +**Workflow Improvements:** + +- **Brownfield PRD Support**: Enhanced PRD workflow for existing project integration +- **Sprint Status Command**: New workflow for tracking development progress +- **Step-Based Format**: Improved continue functionality across all workflows +- **Quick-Spec-Flow Documentation**: Rapid development specification flows + +**Documentation Revolution:** + +- **Comprehensive Troubleshooting Guide**: 680-line detailed troubleshooting documentation +- **Quality Check Integration**: Added markdownlint-cli2 for markdown quality assurance +- **Enhanced Test Architecture**: Improved CI/CD templates and testing workflows + +### 🌟 New Features & Integrations + +**Kiro-Cli Installer:** + +- **Intelligent Routing**: Smart routing to quick-dev workflow +- **BMad Core Compliance**: Full compliance with BMad standards + +**Discord Notifications:** + +- **Compact Format**: Streamlined plain-text notifications +- **Bug Fixes**: Resolved notification delivery issues + +**Example Mental Wellness Module (MWM):** + +- **Complete Module Example**: Demonstrates advanced module patterns +- **Multiple Agents**: CBT Coach, Crisis Navigator, Meditation Guide, Wellness Companion +- **Workflow Showcase**: Crisis support, daily check-in, meditation, journaling workflows + +### 🐛 Bug Fixes & Optimizations + +- Fixed version reading from package.json instead of hardcoded fallback +- Removed hardcoded years from WebSearch queries +- Removed broken build caching mechanism +- Fixed hardcoded 'bmad' prefix from files-manifest.csv paths +- Enhanced TTS injection summary with tracking and documentation +- Fixed CI nvmrc configuration issues + +### 📊 Statistics + +- **335 files changed** with 17,161 additions and 8,204 deletions +- **46 commits** since alpha.13 + +### ⚠️ Breaking Changes + +1. **Removed agent-install Command**: Migrate to new custom.yaml installation system +2. **Agent Sidecar Configuration**: Now requires explicit config instead of hardcoded paths + +### 📦 New Dependencies + +- `markdownlint-cli2: ^0.19.1` - Professional markdown linting + +--- + ## [6.0.0-alpha.13] **Release: November 30, 2025** diff --git a/package.json b/package.json index 3c99b1f6..7891b05a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "bmad-method", - "version": "6.0.0-alpha.13", + "version": "6.0.0-alpha.14", "description": "Breakthrough Method of Agile AI-driven Development", "keywords": [ "agile", From a65ff90b44df3a25cb09ef63e9c463c2d58ab570 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sun, 7 Dec 2025 07:48:44 -0600 Subject: [PATCH 20/26] example-custom-* disabled so installer does not find them when trying to install from npx --- example-custom-content/README.md | 4 ++++ example-custom-content/{custom.yaml => custom.bak} | 0 example-custom-module/mwm/README.md | 8 ++++++++ .../{install-config.yaml => install-config.bak} | 0 4 files changed, 12 insertions(+) rename example-custom-content/{custom.yaml => custom.bak} (100%) rename example-custom-module/mwm/_module-installer/{install-config.yaml => install-config.bak} (100%) diff --git a/example-custom-content/README.md b/example-custom-content/README.md index 6a076a7c..c457da7e 100644 --- a/example-custom-content/README.md +++ b/example-custom-content/README.md @@ -2,3 +2,7 @@ This is a demonstration of custom stand along agents and workflows. By having this content all in a folder with a custom.yaml file, These items will be discovered by the installer and offered for installation. + +This is how you could also create and share other custom agents and workflows not tied to a specific module. + +To see how these become installable, rename custom.bak -> custom.yaml and run the installer from the location you also have put this folder. diff --git a/example-custom-content/custom.yaml b/example-custom-content/custom.bak similarity index 100% rename from example-custom-content/custom.yaml rename to example-custom-content/custom.bak diff --git a/example-custom-module/mwm/README.md b/example-custom-module/mwm/README.md index 290c1875..09e8aba8 100644 --- a/example-custom-module/mwm/README.md +++ b/example-custom-module/mwm/README.md @@ -2,3 +2,11 @@ This module is an example and is not at all recommended for any usage, this module was not vetted by any medical professionals and should be considered at best for entertainment purposes only. + +IF you want to see how a custom module installation works, copy this whole folder to where you will be installing from with npx, and rename +"\_module-installer/install-config.bak" to "\_module-installer/install-config.yaml". + +You should see the option in the module selector when installing. + +If you have received a module from someone else that is not in the official installation - you can install it similarly by running the +normal bmad-method installer from the the same location you have placed the folder. diff --git a/example-custom-module/mwm/_module-installer/install-config.yaml b/example-custom-module/mwm/_module-installer/install-config.bak similarity index 100% rename from example-custom-module/mwm/_module-installer/install-config.yaml rename to example-custom-module/mwm/_module-installer/install-config.bak From 0c2afdd2bb0a8656beae6df52196afa8b4d9470c Mon Sep 17 00:00:00 2001 From: Wendy Smoak Date: Sun, 7 Dec 2025 11:16:49 -0500 Subject: [PATCH 21/26] Change Gem creation link to Gemini Gem manager (#1057) Updated the link for creating a Gem to the Gemini Gem manager. --- docs/web-bundles-gemini-gpt-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/web-bundles-gemini-gpt-guide.md b/docs/web-bundles-gemini-gpt-guide.md index 6419165e..9ae3d64f 100644 --- a/docs/web-bundles-gemini-gpt-guide.md +++ b/docs/web-bundles-gemini-gpt-guide.md @@ -73,7 +73,7 @@ web-bundles/ **Create a Gem:** -1. Go to [Google AI Studio](https://aistudio.google.com/) +1. Go to [Gemini Gem manager](https://gemini.google.com/gems/view) 2. Click "New Gem" or "Create Gem" 3. Give your Gem a name (e.g., "BMad PM Agent") 4. **Enable "Code execution" for best results with document generation** From 987f81ff648e23c2fb9dbbf966f33648448c4d29 Mon Sep 17 00:00:00 2001 From: Alex Verkhovsky Date: Sun, 7 Dec 2025 09:36:24 -0700 Subject: [PATCH 22/26] feat: add CodeRabbit AI code review integration (#1053) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add .coderabbit.yaml with minimal config and path instructions - Exclude node_modules from review scope - Document pilot research and conclusions in docs/planning/ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.5 --- .coderabbit.yaml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .coderabbit.yaml diff --git a/.coderabbit.yaml b/.coderabbit.yaml new file mode 100644 index 00000000..b7dd030d --- /dev/null +++ b/.coderabbit.yaml @@ -0,0 +1,36 @@ +# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json + +language: "en-US" +early_access: true +reviews: + profile: chill + high_level_summary: true + request_changes_workflow: false + review_status: true + collapse_walkthrough: false + poem: false + auto_review: + enabled: false # must be manually triggered with @coderabbit review + drafts: true # Can review drafts. Since it's manually triggered, it's fine. + auto_incremental_review: false # always review the whole PR, not just new commits + base_branches: + - main + path_filters: + - "!**/node_modules/**" + path_instructions: + - path: "**/*" + instructions: | + Focus on inconsistencies, contradictions, edge cases and serious issues. + Avoid commenting on minor issues such as linting, formatting and style issues. + When providing code suggestions, use GitHub's suggestion format: + ```suggestion + + ``` + - path: "**/*.js" + instructions: | + CLI tooling code. Check for: missing error handling on fs operations, + path.join vs string concatenation, proper cleanup in error paths. + Flag any process.exit() without error message. +chat: + auto_reply: true # Response to mentions in comments, a la @coderabbit review + From b68e5c0225903dfd458527fa31e0790b007af772 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sun, 7 Dec 2025 13:39:03 -0600 Subject: [PATCH 23/26] add custom content installation question to indicate location of custom content --- bmad-method-6.0.0-alpha.14.tgz | Bin 0 -> 1433137 bytes tools/cli/installers/lib/core/installer.js | 47 ++++++ tools/cli/installers/lib/custom/handler.js | 26 ++- tools/cli/lib/ui.js | 175 +++++++++++++++++++-- 4 files changed, 231 insertions(+), 17 deletions(-) create mode 100644 bmad-method-6.0.0-alpha.14.tgz diff --git a/bmad-method-6.0.0-alpha.14.tgz b/bmad-method-6.0.0-alpha.14.tgz new file mode 100644 index 0000000000000000000000000000000000000000..9a21d9d3f1abff15ee98e3e7e0fd68107ecc8c4e GIT binary patch literal 1433137 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 z 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

9ZM(HYpI6lm{aL4Wm5;qW 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 z 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�eKr83cX5$wYy#fb*(@TgTPKMkUBI-7 zDMS|ru&5ZFD8h)#y++OcsECeL;LI#AGb?YKB}uM1_g)9!!oh|9 z-6|i7B$lo_tU6+?wJ4j%ZyMO7RH3{fJAd3h2bM@ z5Lt!ua}i8EzS@d(dRh6IgnGSBR`CL#2KH8R?u#!rx-lIiUs6livJ^b}CRsquWZgiK z4RvQ)?IIh;bNpud-!G(kJuBz&SG(0!zd0~x_IRlnyI;$Os`=8B+Nl|Dn?$gsjsd?j zN%HWDfo^ydWI#OIcGXT!Yo|R&G!N{NX(>A~N7s;umxUQd+7@8$yWkw#_Z+`VuFW21 zQ1;1WPJo;9fc>xnm8lKOnH{WqzUr>9GAyTBV;mB_^ z+#dF&_D|tt3JB69_TE&rV!rY^U^Q2(9sB>Va>af`6-UHe(CA={;*d}m0QeWsc&Ph} zvI{fY4ab_g75MUG|ISE*f?_(Yowjo*P95<-?N7rP51k{6f%!$AK=Wx(=3oYAThIhP zA(~WZqJ{p z$nBTxZlgLmiHUc!hUt=eYqmayCqBoXOCkW=SLL7xzaFJ?Fh)dv! zD2K3YyGH82Qcxvk{MR>v|LVC1`YS=c{+?N( zz6Q{(w>Rj$eRnwca-dtl&Q2Cfy@VicBlB^6p#y3jFqvfDMqq)%_=r-MTtViZiN=A>9(0 zWLA@+zm-@FZt3D34aQZhz%l(&@TFr;;YkLMt zHcPMcynsqFk2nk-i*oRlVFOR>COW@NMnC`-T1V7gew?ow&LXaomqD%qaGTkPD!*e| zI5*>T2E}vofW!($i%t-|m06yCvnVF2nJt{ehXXL(PdVXFi(1Jbjm!jYk2I30HhfQ= zK)(X$__`1yqxegl9rix^c40%VH+E;F(8>&MB}xP~?!Zb?$4XM|_@FB6dzaCTC~^q( zz}%C7mGH&%UN11K@XsvP??tSSOZV`XyRnCf0er~rSo`6J1aeQDDB zWz+c#6FmK;C>2Wc{}OJ6FV2B4k>mww?Ztw;C~dx4t~u9*=fHcS%Bd>SGu$`1{jl5# zzjodl(!9JdIFFBdUb5RAld_QN9xiflA0h)yC%TG|!8t(i&)CBEkxJp-N#_N*<|=n{ zg@+0esY32qVJkWEO-JDWA=3(=AW;G;^38YjZ6C;4UE&b`Lc9};?+tU#ru@7jvAHTs8Bn{*Z!byt_ z^`*>p_gQCrEp!0`ergG$fzKk{!QiFdEN%+@uL?(Kz2^27Tk-UZCeKTlq~Uq_{etHm z7QXcwF~i9(3p{alO11A4G@5k3aX~N2@)~c#8sCPhalKaRMY(jeRUCsfZQ)vSrjFkw z|4^|)!q1e^3N+=vaZGA|Xy6Vk+0e8=?S@%SUJ`V*d%NG>h0ZpK5X&QRgXV6WS5P04 zqz`@!HtzeyB09J+K}Ktlj*UpkA$HA_rO zcVnkEtm{Lv0A6nfD1wkWSR4Z^G{HnWy!j`oU{Tnu(C--*M9IZW3#el<0X@f! z3beBT=P7&K?gB8P4bB0}JKEcMXdXolLVQ-*Xvz@OPLq9#5YUZmC(}7Ijmtd&{V)HW zkpl>#0LvEp)v_04&r~Jefz&3F_FaXendRcAj_!g%W*p1DoJC^v4^pJYmv)@8Vs`7J zU@q;|{_B5JZ@Y(vux;7lC;9(B9B-|qy20?07IiYqu(vq1wTO~fGXNG-?&BH8Yi!2> zA{qp(fjAcTpTQeo7H)_;u7b<3hNEXaiHYWxmswK-5LdIPPV5vXb z3+P6)h-v=~%d^urd1EKteM1wIpJ2}S?vXk*^7rXB9v#+@8|w}vr8oQmcazl93h}+~ zVI(Q(+=-HF7-279e%3U(fNjF)8*DzzVm)(V*R_{004fE;20w4^q*|+=LRbsj4D9>H z+UuJB9K_C=0-Yqy3Jxl(0#CYOwLww> zy{=QdfT2G)#8~2nnglUu49Pe>QE(FM`&&vP@`$JBiUX`%! zhSH-jZ>Z@ENwCD4D8K6nGvu@UvcXRpNT7Y=i9zHnT@7Z_ z>gQ{s7`l)b>h5(uaI1P=J72Ggmf}|1-C`RZpqa`uZirzPjGl#~&Nl+DfonpTg+al= z^;ENI!uP~8^+)wwozHR_ire#n*cbqg>p>YfgzET)2G%&k<=Af77Hp^==sr2T)DxW* zfKV}O+6%rC*ti3u!fWM*>&hty6h`A&QqTA-97%u{ddg=EQ3MN?i1=i3Z!mg~UG4qP zsn=^eNvbq#%9MUVwsMQFM*R6iHz>Do;1!Ol?bu&3`S^s{Q{GedMMGt zagbcrsM8{qT8sd}-tA!3RnaF77}tVEo9kzPXEemIUB8nW{Riv}$XiaR_a?RYs9K{F z=y%i4$j;OwFpPHk&l+l{{~Z3`3+jmJyzu!i@xt%nT`%GP{U9$qHaTl#cLyB>t8!xT z5Z_xogjpHbT-=yn(d}*bQj79%5rM5(LQnNb^G14u@h~6ejNKMy3y| z7(D`0L5uo9VBXvu#gW(4h9Mm+51tt(@(Hk;T8)1Jg;@4Cr!t|_Nie;+0fP+NxdHS8 z-@nrbmx0@z$Z;b<`c64#fZnmwf7TME)l|oC(om0;6UIEL?ew3o{Kbow=+5e2Y;JDS z_F>l=ieF?ZPNw6 zO_%_~SwkIOxfK|Dhkye)I@oRl!P%aR2%%)6Jl>FYo35`)cTQhVqhMI_$?=bu7y!0C zT6i5fyn|oz+#O-rskDt=95)`Wp)SSlKS&EYLD;njkwYLH=)&Q?_jbSnF@10r1i^3Umj`Yi z>tbk|f79Wf-QE&gjWci42n%W9|3`C@ZQOTzHM>z>8asNd>mwVd3`n z54*J*e)v!Cx_f@LmYArOa#f8cz^nr`SG=Db;ko61v3r6qcM!{|G&!rRpCE)S4-Fr{ySYq7l?J8r5Gf^OKLvV zrk}6)3GOv{FJQ;*2;AV5?!zKB@T;1!sO+!fUlP)vANNcS$=CA4+b%yz=pRJK}Hov9KXKufL9_zrZWH!$eZnt zow^4oF;Wn{bDPH@@~15|_KFnKGDC$n4$BJC1Zf58}m|09%fF}`mAJ74E z_ERJfN>c1MYl-%V+r!*eBak`&=+cZ_Y5#!WNJc3ygUdoI_9b zj0Acya%NdYc$qA?;gAn*$2k)i;P*w~I>?-w-!L|i2D}p?ASP2Ijn5(@`T#0)-OQI|NdJUdT z@P4JX=iwws=X{+eW4gBRDf(%UPHNwK1?nE)381@AvW9~-Jd#8_%( zMlyOB%~LPePII1J#m zmK4-okbKtb4TPP!{9K!=y}QffK-ir4G7+BDFmYqnjzYwl2^lOLG%D@G*?LRD9638_ zFwr1QjDV@v2k2PR2Vld(fsV#axFayKsWt-a39ml1-|s$YQ0_j`8D6}ozX4MQjHr5& zr1P3mP1QkiHjL%B)F6y6A}!vWn&o&+Hz@g>&SDo0NXWFI8i$DB$9K|*?LA(KJW=G% zD{{FqoA9Y#Bz&Ho+m?D8lGPZ}X@}g9e;ph9yFqn(-1{8taagS`T93|ZNh1>lFpgo6 z$}~zV(_rHgj8%ZFKp?!dSbOATB`W3mLKO^w9Y$q@f#iYlh1N&~^9TrWf)vd@iX(*+ zZI%wNar2;6CXjjHX@_G|zI+<+RS51*W_}Jfc^GSdJ6^yRJ z4A#|56xCtOl$7=QdkiQzYb#E-N|5u1X^a{w*TKX+NDY-;qFN2(aT?gHL1}qANs^90 zF=+c)Sp)wk(`-Bzc<@m2CsD~g0T>q?%myo;44OqvEREFpyx z>;teyX3+_wnes>5g#dx9*YR*0t_IW1gTcg-5ng0Xi^Zmyd!yz6n16crfmtOmCIAPr zA}HWtpkHhfYhg$5~LQ9Kmi^t5}u4wx}l zbmYzhxR&fp;nFA^4rD$0bv!3t&5w>sXES z2z)s`QrQ$x3S%^LSfbewvQKvtNGkQCqIla#F0CjT+F+THB$)y^W^`QMxF$C&Mm)DC%dm3b zPmTHQo9TRKFcQx4#5g1^XD)Q&47cANQ@9;w=ah-0a93s#SAPd+6K9=%y9kpXe&Yxe zSj2pm#ze^zX7>e_1hQ11r05Luf+0UL`6OS0EIIBJnO06pSd(L4i-|uIxO%QScA`fo zRp1kLU4jvlo}Bq2bykfwsffBf1lpv1tB>=Tw%XMx2(xHReHMlIm6-(MaPw_cC3B4u zfCEnO{vk<7#y}Pgs-1(MtfC?5lsW5bQ7lfl(G8lGIEW0yLmZM2BiMKVeNrRmj@J4aF$`!*U}JfF?b7PL7MD6jQ%ZLL2*Q8-@brh5CH%+BSFaxNAKxneBb*?j z4G#>pSELecSKvB9C_`(su zCO)+ku+VeF^(~com8m_7_3$Pgjm1A;b~yzEKn+KOlJ$8xZ%CScMBPD=+5^ieMq&QQ zS`-aa!>`wZ=b&dlW$H^lQSQXi^|8d$od)!i90yY+E8PyN9V!t zW5dD;?#$cavkjJRiOPI&HoLgcnUha4sV2^-QuaRk2r-|yNral#hw^(rP=t`#I`;c- z+k4O~!^&us0DNz8J#*6_hMI*qe6rHJ^_d8?)>EQ+lr*W^T;`{D?Zcu5 z{^{KZ#NWs3Ilgd~W$NAjPwvl1nlMfo3M#>b$hb9)p`NFcC!)wHeq597-k`JpW4HgI zOf_N?Zt8uKhgTf^?Jhj!-m$F`?^ewwhbL3;)X=j|@EStDc@%PfR5Tx?Dt9rd1Mv{t zFFf^fzTw=@p@Lwk znw)F1LY*WY6KgUaJ(&G0CMVYQ)WC-&_S9@e<8Ho`^W|`}*c`iARcPo0`yzM*{`J;42qVnHfaylR(x_|H zB*~<%dXy$pm5j%)`Gr(%`Zw+g5t4w?IYAwoy*3#aQ~m!oO|J7xwLhIEX+DdYd&)`| z6Q-bm!m>D3t@_&UKn2nyXDk?vIRB4T@VF*$D8?F~BGgF<#Rg82P58NK7MF&g`)L~B za+}~j{4u_yc=I^YpF%>3nZ!mHvIuZVI2a%`04$^3bKg+0&6Efw5t0BnvaART2@^wF zsU)SW4emx!0(zMOHIpQaI0Mm6;D$*u4I9RF#L^^`&d@oelE5e%1yc~l*QlV8{D*&m zL`V1=x%|U?PCp}U#FLx^`Owz^>jp0I+64O%Q?gAr2U_2BVYK10sny;{xD0vVS6o94 zzIylz;5v%t((nUvVg(h(3ba;R+tmPKk*Ccmb_k1EltI8iorX!QN4Ut8476qtF40)) zNDZS|{Bh38g7g#~lbn1LCgdI^MSWyW^!cTp;6Z%7=6s;TS9QR+ zq*`t5P)CuP$iCv4!sWC-rmy4g(J@R4FqD9&84hQunUVQSpS>i^-~wl%bW}m6iG(6! z4rN@zgqsLYuwS`9e>k5zd_K*#&~4Au+Rpiv!_L!&>5)Lwo6YYm?*mK?&K3V|!Id@f zm6^#j0}XdL38TQpOd+0vU19H2&<+fP3NdpGU*pu#4~GeK?2R)=u+G8Ao+2F)H2%f2 z$7m{lt)1h@6m==VJtkV`W&;^=f_e_u0FQfy|1bj^(BT0v%u}u-UeMC+`3xm-B>jj8 zuf|qq!xCz`hJDNB7T}et*VV>(lnhbDIhR*Di!*8t@g_|^>e#M4O4Wp~Y3hB_R7Y$I zxCgLk7s%BP;56#V>`69EuJ`_6zkk@?J9O6p=crNpn`pGv7BtC0p6Xx{Q2?Ag_9(fA z*=zI{%&|5^<7iLtTSjyODX7ogoc4O1Zu4-z`L6wASMDA&8{|_+K+L&;hNYdeyKdj^ zccgE+CW*wv1Cy#^5&&X`{Fe%HAc!g40Cd%!y4Rg}k(i$r5~LwBXRa;d|&8qF0+y*==_`PSTuR3L?)b0DjfE&aWYO z;0h)<9pQw?pfIox`R_a{azIpe1);>FaTIJnkfg{1VQ{<^9YfF_{_I89Zf?uS@Ng;e z$87E`vbo$T0sbWCmEnfm84O`T*S{9pfFcFIS2l|;VQ8>1lu}WBsfTWu2|>Uw#?|0Q z8oUVT1JO26T}C+(RDwU-_yW=ox_Y|M1j`TxE1dxwV3=KE6578aniRu#VpSEPwIh;< zLc=ONgr06*me)23UK^;9z%20w;U%=J(uFe3GEsLZJu)HDK4--t7HUGDCYtX?R3F(H z9{=wv@jtlj6P`DxQ4lvvh4-^h-0@&Ra&>M%0n7Oxet7k=#Q*T><!9enxSsr|3qPKE>_2}o@rC2%7wzJw6J^Ww~mmz&5=_ zw+^;CWKWX=A^pIdkMcj2mqwC!X!C(d=eQF?EZ4|X$7wbB>!kBMJCr?2vj_Wo=+q6= z2Cf2}&qL{lKz3*8gnE5cFB6CqF$sQKZB#jYPnhJ^kyO)54sBpUZ%Rf_mRz9WIP`(q zur4DG_y#M+O@nxcN4=QvEeIx#=WYu!st4SpsL=RxQ4dnP53ryjk*c?M*nLauYU7*h z?RB&Mt{?Sf$Qv{I!Tm;Gg}?!0TMnA_T0Nf^zJEP)&W{+?!EmUjdA616zoJhq+byJ; z73ywDDp~Sa3wDv6Tf7Dlp?ZKa0wc3#%t1ZZFLlNeSVoePO z6`6WnoPg=l!gab-NDT_!IUk!Mv;PdN{We!U=>FxXyVvQK`eN+TvUDU@JII4H2ap8S zog%0g3uZOe^3hx23wS-v>bGiZUXDe+(63y))|9QKr=iRaN)M^Idpe<4_0}iFZky;> zefC+9Zm@oIN9JQEQm@xOXR`?w)FfkUTU5dZlm;4LFl{PPybm^XT3D6h5W52zvFAFv+n3D)F$|9-7gBR5IP8)H`u zK7pd>t=ifk#5@)3E2M-j1E+u^9pa!u&i1mY<(U^3GXYY}RL*AVXBMvSYe zTH{j|#_Cz~xk7wAIMGjNkc3jHfPG2QipRr|4upI;l|vmsM^uRBn~6BbT8=aHlEs>A zNM*smPC+~u>6ePhUYil!%6V$7LOChC=0}N5*W=Jw!bZUNp#a-J%ATwloPh_{kZq^z zDny4Ns3gtHd}(W8b_x!)b4}aSG8nQs1@&p~ao$HivpI-+<-OBm36Sg)b0y%0a)+68 zZi6V4Y$lLMI-|B$8O8X$*438PKz>fStO;{MPgEAn)q2jDA&i3Gd#q zneOxEi;4-EsusCEunfa@H%?$2Z0-x%4AL1OM@^Ho^rwTreivR`Mws*=1qgcN6Aek( zSIH%FRr!hY4PK(M@-qlXKznw9-W)bfKu849-Ft2A!RX6_3+;c09~i|p9&wypksk<` zJOfToT$Rss?%wWtUk@5o`bqIlzqS>#Z^izvbp5562*6T$DySaEh_=Zn_X2Je%5F{T z4C!*81y_Y49k$!zvBv7NyUVPx_Hq!=T2N{=hBj z9bP8zni0qke3@+!!AsdwzNqU6hw6=7y(>1dI)_r$))^ zdcC$VbJ|o4Qo*>717oUO=vpDs+GL;Em=M0xoOswwjP6@mbd$6|tzv4htNi2%c40_} zw$Xt#jZB@7#eHCAQd0tMU@PfRJM_lrJ68u4hzt9HoN1?T0bl#80zb@9!SOu?<`qL1 z1cL>&{9u_~fIq0b=rc0&=@(AW z+b{7h*L7o$$70PmEq4LLfZ^|sA8a;2f&Fca=RqQU4|~kPLJ@Waz5Vi9=9dXl=D{5P z{a=@7(``CD$lz!61Ox6WoEp=4n`(O`(;&0s^+bPhRI!-&!?!k1fHn{L6k!eqzF?9Emru+2|Ci66KYz^s|H}3M z^CAI2Cy6mQ>gGO}Kd(^C28opBD5V?xA^yP;XHeW?2miMQ9WQDS)g9kX&5-7U7{M0GXx8p>PsDC-*S^J zGsg(6m`GD=r_6Hvg@vRi6`BWv>|-db^pwGRunBZenu&9fJTUB*%A8J2b6>>NEEK=gWbv#F0t>;xL4Uv9dDl{HC~9=T z|CX*){3UUDHqO)JIv$5Q8mX%c@&lUw>xq2R?tXi__#FsDc+=h4?{_J&>En<+x`AI0 zL8XnR$b3!lh@Sc-&{H(6iI;`3e{N+m9sJ>0y$;{#Yq`$gN78gc z9L&=t5Cfkz*4`e$FvT^~EH@%2!*R{hgpU}&I)UycI?-CwWw$isdfhi zyI!~UOKEcpOt*MLFeg3o-_P};l!TF6xc1$A`7s2`Ufpc_PHmPa8-u$%oIUJYQ=0B*X zH-@W5)$5KG!M{cS1Cy6yF^c@K7-lyML>Am!B)-s_pLLXJ?;X}QDZc~j>|ih_vIW7u zf(f_zc`F>>SkxG10}7`e{8y)7b;{rZqYTCj#)zU2nK*sZ2zQl|44(_`@6DNU2~cJ5 zuPXfA;x7+^6e$Lx*(A2cZpQHX#M7Q0B9yd~fTrGH?VW8^K73bUM`AAvf}K#w9$cC5({@X}3o;|%Z$PZU+BE0ftCLxb-vK59~%A^3oWF&3(j zo(iHY0qhp8D(;mDB~(Im8CY@9-)8V2Z34Iu9%)9Q2LWz@Z5KqXUfebeq!|!=kzA{h zfiR()=8Qqx0Wd{omATd;2ndrJbE=kEPXNGb(5>MF(m0^)0yJ+k1gU_BQ zq;*TRv0Ub8dh(|x{|3+ahbp-W<6$%#88lwK4(-jr6dOXzAoW>#CdnreF@pb9q{pEx zS^@?38rx8gZpdA8eu@K0G#al9;jS>NB=qpHSyT`3E-c zu`yCJPc?LuC08A$nxs`*aKj#H@u=48aeI@nw z45P{fllt+O(Km>u*Q z{qEqf@iq;nmw(w^Q~&dS`8O3z!&88x>3HP-Jlr2N+VLn&!cilbP8*ZtJd89wMF0CV zm`;%wN=W9A+zTfM5+t8<3ZHYvYsQJKJFHe=jVcp@g>{nF#Qt*mpEtpFPElhN1{ZOX z<>9a~1a7Ng5YabY>LAK5he4|S2dBXtQ(ET%CLkJlijiM>XbiUjh9>N)(CbGs^)nQx zGy4IjkY0<<3>@CzpM5!o5Bt#)Usd~Yo!$0e(A(*C+8l-N4!V1X^dGl#>VS#|{W@%2 ziq}Zdn*(cWiPJ+xZ0v5$u&)y7SJ53tPX!W~c25!-C$8u?PR41Hp1Mhg8x97-y5e)R z#4De$UN}DG?8UMtYZ&Cg55`|Wpoh+~mYRV={)A<>Rr~ze{}(y=w{@UC+`@WA7Yo{q zK$kLE*{(cOuuZE>MJhibTeWO~0$KuWgN2XZ@HOJl5_lG1(ZwoQN#dDxlF2zXnPHmM zw9pfqOf#bECXF7PL!!W6;7w)AQ?g_Rt$*Mi0`IFV>u;)MeYwX}J_W1xr*tg%E_PR` zxNW7AVFZq&tTw!-no4h8Y&O)jJ_ps@aCQ4lm4k9SA#g}6?KBLzF%nu@wVjMjr-Hd_ zs+UhHf5#~u*;VHfb!3Hvfw_x3=b^a~GW<|E%Fyl32 zDd-y<4Tl|J1FNg=u-q7#R~cH3u486GSkx(0g;?WRuM2va<5bw4*@UsE4&9$Q!q6S$pk6PXL-fGT$k-|5D2i#Q2ASKQyZwj;_ix?WTs(qz_r^JAbfMfCVvAgVv@$99dfI`PjwbmPp2{asH9o=;pjbI0Gz7!4{RWPX=<@?I1 zxGjV1Otq~?qv2mz(}ya=U0p-_ne!qBMs>LY zG{Z}D2CIFNn_7k20e@V1%PutW?QPGT12BLS%Wo?EDd)zE<{~79ATW|KNBH{N zzhtfLE3CDxASb?Ci7oXe<&?JVJG`jA7Lo4NHHL|EMTASLYTYW@CBR{|fneho1U43C zj(=KFRlB3wx2maKgr6!`WUeTSHPR*}mf0O^EK8!dxW3ZWdSAE3az`C3tAj0}%5J-i z3u$`qU$gofSb>EuQLfheApmXv~KA8!B^I ziW-Wpu_gNt!3SLg2GaaMUAvz}5RW*Sf$}H=0ulcsm_;Ie8QFG52-Sg`p1>duXcqEO zW-F?&*fZ>HPz98vR586y$}Px>yM!;mJd+`R_hy?(I|P23Nz9nbn*3Ma1~OH_4ljqj zfJR2AR7sF~!TX&msluaxJBJf>`!e9>J&S;wF6dEYmK$PMp2nqw+x0pX4-=rf3ft%* zCc)~!J%y+pE}IK+_N603vTNATWNiG5B-Z%6A<-T#kVYwYxR_D5l%gOo(Km~aXD1fR zb--F54s}FcfZH1nMv(p*y+&WzOFU<2eDh;d=PFclbfQYwvCE_V(VkkmatFQ&N9YYnS20Ki(@H~(o9fd^Hdl^7WRK%%>VxK<%?IP`tPUTzkIC!{<{3{+crJ6 z@9rvv8{l4Twl6pg;a8vCfgc|03QgT)XMgX-E@m7HU_}eVZ&q_qsR&{72-Ds3IX`1eL zuvNQ6<{B!7{5OOH(j?28c@S}j@?Zx3a1LkZGQeaXbgfJCG?)j`rfJoDG#L201^%nd zhK-9&zM*utuGMzr$e{=_E{>X?PO;Ngz3x9Eu^os)uC)z;HikpxaVj6d63j7%E_qdq zPnX1-n+(d6VI@4s=)~<}DYZv@vyn>#y`j!QY3U5Q)C0URywZ%@HsXmUAla-4Ce+jX zk~1%4by}fwn?Fne-VLpd&8FsQcs_HQm;pY)P_ojm*mOlmGE5n8B&JfR=Li8^Gfr@m z!@NMYicrc_NBSxdadFD8Mb)=#a2Tdetqjks%UL^o8 zQXAn|o$FXbx7;9lLZvF)&z_3q=`(xGOAff%(oO(k?!e7E1|o?6fV9^`@2hB$p-L_x z#Y&eSQk#WS5)SYXRUS?-tj#bHgz0CYr4r`8kwJvbA?)ZC;tcy~dGk$T;Z+mU{=!#S^LdpeDHG1fU*S!laV?TXQP zV+{`>1S~HcqW}x$HH?QLwt_{z0!Wgg>jgZ*=-R;{PXo)gAEq2K%GnDC772vNn(s5K ziM`4AR-{KI84DHZbb8IbGgr`#5{@CD9e5>eq7bqvJJri|0*R#K-Y|((car=yJW=)f zF&*5!V4_bzsE^xbdVm}?Yb$$kQmY-m39`$U+8jo~Y^1j?ljI}tPX#03A`CumW|!(e zt-0g=r#1M)q1Pq$qgA+>Yt5_|%DQ{*2nbson^X9LX(MyHb%;ORbfj z#xRXk-BGa}rn7mpKGhjOv)fUa1yI>Z%@NdE539jKCpL*a8iTkvMILGgV<^qp)TO)d zEZLUACgYa!mI93G*lHb|%?XuYd6&u#aQg6a!h7s}@BE5*_K<^zR0wY&Yk!ETWgp#@ zH#2n)!!%9CG(r%mxz33k#Sm-E(u^wUv9`!PBf^|>Ih!yl9j@Dt8HGbpu}@Pl!3~mF zNb7BL&I9HKsMX#FG1vh%jfkLgh)de_b;iWTj4&cUbHI%kBrKVYnY+|5E2kig*F9Q-E_esUCu$Pt71oW-fw7 zVvo~+{5#LgM!G06^KzZC_v^pLlUc~rHGxP68U_`OLmie1((Rad$EW6A?1xw$p^BQii?g{x#9#o)fxN6<(F8iI99vdG7Ixx!j zcP=$HDzDY>f03C2KN-qTvhoqYU2V_u1bV0p)uFg=q*0GtzXcuwE9>^I9W=paZNRcM z4pI%IwPd(Rq)_D=C=d*U$6UY(8Gy9xMRy|8&~=%QPK1dr(7a^*ILYpxN=)juFzM3W z5OmVzE719U?OcV1dhUaU!c+~1ay5-{Z&?VZIx>#yK52SDRn+<`0ZtZ`^RMrkseg&mAXvJd1^1%Nn;{G|8IFV7bMT%Z6@lkse(T6$kv)H|i;{zrWq( zC3<_*+wSi6_E0G6^}o!>eT0oklgI`g9DRJQ2@p06Q=mXk8+7BMcQ>J|u2Wc#$z`H- z$0=h7!6*Uj?*-l})uYl)T@^;P>*+Z@l-$MKFM=kDYla{Qv+=2QpGX{K<2;Gb@l}{6 zG0{ua>)^^LvhEG0v8mo-h}L^9PoNQr-BGQQS&mDE9}cbvc?j@GfvgS1k7Ieps&(Xn z0(fXEor6IIm0V*#{zBY^-i)RJU5Z3CjhvB~CdR;Ei9EZ4rN6tbD$EstDo=C;Yj){6 z<1Xz`0H9z_85Jv5SsiRAFyh<>y4k++sI}c-w0L_BpIpcfN0*MB4X{+Cd~iOZ$Q+$z zDxUsO`%UG4tNFj587_(~ff@)qa3L*Be{`5DZj=9g{`BSZa{uoa&z?T!f4@%tm(vMC zfoAf-y?6w@^X5)Qj9&{^5h9E4P9E z+-q$(4u*MFA}Zcfy}j+D!D0V{YVWmoKMW3q0C-hDa6sbgTtUB+hPp_T>-@68cOy#) zhcZka{HN|4HR!hcop-9={mW6W-`!SC`4VrMhH@Z6KN(4Ic<%qMe(LuQyOd(xJ5;^* z@4MT*_F;GTgWEdhmK?Z_uoanb9T?jyLms9XWo>+0|)ayrwz1`k_?5e@hn}hy7ggm+fELR*Hy&=et5Gflh zWHvh|zo7yDleun)4GXwhqDV)=fP*mIvBPAG{)MzB5`?%Du(wN!jX$#x@C`w%lUc@| zg?)TeT52=WfuA(~=;f!$v4%K*N>v30T;)JAbcD9Fef&R|)V3`6qv;F>gK2o;Ku zWSrEYw^k;p&o2pYE6akp(<^1#95}%|$fNMn_Qgf2FJRyMI-5n5z3(JZB$QyHvc!^M zenMdD6?qrgB@$&yCuvhfQ2=4cL$1(c+jZnqb7mHpnVB__IkXsJKugw1sM2Po;xQ5G zudR7Z=D(yeF=J)~#}M}olQ`zeg~G%d-h@b?=;bGFD6I__R3@RL<9%2mx(&tv{upWs z$7CET6N@F7x-9}79E1VEl$E}zHLus%8m+dgVRxkYbJ>un!jUr?pcVog@Vk=mYmOAZI<$NchSdA2nBG57kLa9h<+nz`P1I15Xd|dt2)G zsK0x1>aE;13-JHP-rM%Jk$rh$@A)ZitAW2HE-AGn+dUAnF=&diIjyHAC3||bf?Ogm z#cCI;*i}Wz9FN~+7gz+DMP`B^NHUnb41xd&7FZy!_QUKK$b5w0Jl%(?A|<)i?tf3@ z7u~j0b?ZKyd+xdC{Lb&-n=~jpbwm5hJEo7PV=qOA=B~op*I*q2tqEW&oIOL6<4oeK zAWcJhZJ%F>!b#}vGyQQI#2F8#Js(5}2QXkAb#CM%Lx2@+H}oaW2a$HC{}7ycz#*W{ z55keA2f+1wtr;JQ6*k^1IuAm~3Iw+?CEX_@)3SXB+jy;$Yv3{r2LS0X61J<(d-|GU z5N2PbeB2u6t&Tad0GoOX(I;3h2creTKSQ+LU<|G)M{x1qX2urHzFF{7tK$tXPOWxc zJ_GKU_zr{`FffKMIQ!pTl&om*3Zy}tjSyrZgMEXzZ5*zp>2c)K6)!|ovY|BBL5dBW z3SsfQFkf#l3~zo34hYB#m*hU_CA6_WLt#6fRf?nJWKX~Vfu|1TjwiPY^0{zUIHb?x z2A2CI*|h)?q8OG`IT|=0i-LHV4S>*CruHS6c#9}P+?4A=?WD?94PuNVpQh0&{7Si4 zc)c#})z$&{@P9%Vhu^2-_z98>0B$1ZYk>77uT@I;I=)wM)7lDu7K*bFL(|jIT)6L24(?)tze5b* z++|!B62($nc#N4k*M*a$V%npF0O2vQM`cuL>{Zq!C&D;SHq3LdGH&|(!WAl)B3~T9 zSWuH32^s7%RqHe=<@QvN{GkQOjaMAVqA^hB2d<2`Kh#eKp72Lv3;bjKd^Vil z-#NB0yda^>6Kl+jqHw_U8pgn;BR~c!;2)E>Q{hH&LH3Kn6sHjG?(NZnw5UEH@cOH> z-T|3`j?zfk9apsiW!JwAbRs_lDkD-k1I8x_f|_o;hHFG7qPm=;Hw`jZOQr#X2Ew_? zOK0L&6hG(seg#K*2^U0OL?0LgQSl=BXQ35bjp&a2Z<1g+5p!A zo7Dn?cqKuVIzc0ca>^JMUP1&)`Z6*7<`2h{QH}q(a_~P?8N(DHJ4EBj`wz&d6Gm~ z6E*Ag%rK#>*1iQF3lb}Y;xjN)V*))Kgs$aSHcl7>Pk1&4vn)?0muOjB22m30%P67f z|7T|^KE?XhFbYwroK-WmCs7c~ILcqK%`~S`5H~BD!ok$ORlpGGPVNE{$-7n&S!Qy` z65Es(n%Xw8@o^HZ)=Hd;_iDA0yGDMpPnft~Eqm@*1v zdZ3+?@q+4<-|HgbuJMi##vXwD*O;~Hr>G~XK$wl~?N@r5VUe!{67CQT4aSzKj{q)D z$UWyTzhhK2mPhr)au^0tay`?6FPuyuFH(|6oDpAP?tvLG3#;V@AOgz_uCcI`WH7_a znB0bMOD!p>K4cJ)IBAmp>h2|43)rO1zWm-5(7*e?*aSw z%3BwJONet%2xIZ?vJAy22NUM_Q^1ERzsdpa;RD0J5e(?B6|B7kDnLlGL}6x1qGRei zBiFsxVuMSb!+UZlF;e#sX|!IqPTzET-J{ovQFj)sX9j;VOHrsXyg5j~7u_-SG~~Rp z;$TZLn0;9;|LATITX8SUxW)j5Kyj&(k^hFNnZOUDKH%gUVp9Q#aSHd@mj(l7#)9SK zij4Gcp#C1vJwb}A_U&89+-DEEVOEsZz;7f7jLabbT|4RR0U~6o0T=={1NvF&^%gp?&K^7WC3tfxDEGaj#F$rn*=c@pGmyShRHkb?wHys**)bOFsgQnYLJ4w>94-7SamgU$^aF zcceUDn2pzAe;%h!4OcW)q9mC@ZqZZ+utBJn)(4;#cL)wbG<{q(4Gx@P5^HSLR?oRg zgP0OrxkR+dd3G|uu|Nxt3k3sjbTB&diU+0w%mfZis1OY9euR8vPW5Ut1)!Z@O5gda z3H3T*OLsY}MSI8Vzz@d_n+J{11b%65@yW;>3dMkn`c5B@@6l$jg?N#`@ zMU~+{`8j@748MqpB zriay|`L9@=!JRauV%XT&U~xbpz>mC=wTI7mHT3q_cdypOqYVwVF?m9S9e>mn<|`{V zBr>d8b4?a5e8DJv?(Q1u3Y>N4BYoohHAMaXS7?YJ`aBwROW)|>x&iVrIh{=}>;unK zt#;-Nl%E>%ZbT~SOzo-ekP^kY}JU`)GfJ;-sM5L5by=fj><>-9QmP}D9` z`&Po27!VRFFvQd55|V0ldCZ1O$Fp5f$ro?gI^(qwvP&^;%|lE~>h# zRwz4pMpTnhSu1C9tqR{mGSzXDMr#vZR)ktcrq>&_SgI8a+}{0+csjAKGQ0sLmq!|F z&_mr=NWP)bGW~?f!JoyMH?kHwqQn^FqH<(9!t}qCy$?qEu4=7I`2N+p>WqL~55q9+ zb;a=9)fK?5h7h+w`C4!WxMkmH=LBjJegsSPD#^z$Z5ck?fj#e1YCy$O$v%#;LZJG-J}UWxNFlnGai@w)iZaN)3{R4(Hj>Z8`8a-+vVM4m$6Rx8q{5zfN_gK#MyFR#@1q?CCc+N6&qSnYvq zb7MR-oZ3HJQXaoVHB2WrAseF~`X2L{&~`Rw-eaZvUFPkW3x! zS^AOT2SV%J)F->rQF6<3iAA&wM<21oB9F)SZ2F)6?SYZp7-;fmKn#H zBKgfO*1r9VCJRy%rn$V>LNXGW~$31mAAU6 z2-p*kQ7Orb39+8D98$i;w+1dcB8f__jfbZdMXr+pOUU}@SnnG=iIns!Q7*8t%B6uE zeNl$)Evwz*6rd@&ByIf}&jD;IxfET}nN&$5OjpUf3vCr0yZ}_o$T8+ikrXug^C>0s zN8^8yAYD@&0(_AuM$h@N3Mj~O{+F$tt>>lsAK!27JmEjSZv77~UP^&5k52pXXNTQ0Awj<#dma*e9T4wc1)W_N8m2|2lAz zY5nBOTCV~rfyE=6(_Vw*5+z2s3GA+BNI1=nM5X#iVO|byto8ZWKfooY8}A(n}$OQJ-zbc zXW0kPSr}Jn7%klHlvyZUDx|(dfrtdWM0R<7UysAgnjx1xPv=7 zP5G01j^CAD4JVM>5ybhW>yxb*v~kM830*a6E~XOXA(5(s0i-iSr%E$|{z3$Y&_o~$ zQ>;@v32*Ql>?(A}1k2maKG*%+mvj)&3w(g74-CL^4nOPouZkgg0J6C(KK z4|;wHJg3*$CH4Fg46w^QxrDA?V%NQiVGnKBO`)7iIa4!Hv|me8eWaq+-bl{NN?QmM?KW+-2D8e1!jbHBUr3FE#$|5?vKk(}`Z~ zq-l~mMK8Q}!H1DvidXK^ooYv*Gwo8UpzGnKLuE7JOwOzqm}&>mX)4n=3bcB)|3vkUxDwuJp@^`Dx*M3~|EH zkXepTpQiT5mwbKV?-iuR?Dk+d#Enj3g0oYQ5fTRy0kcR&8GwV~Ex=Y=@ilQ)AL)yo4 zj0g(xQl%eyC1rFlf^gvLn^Zmp{%ThWO*(qnO9zp2g$<-Ww6S@TLcpK>kvx2n*vp8% z;_fdTLV100X<@18l5uJL*6zDU0U-RSqCsq`*L?aE@Fmz>e4H(Bf@Q&8Y^XiQ%VBVS#RV(E^>~*Nmbq|2z^Q*7=9@h|O|lT- zM}>_hrLSk1uH0b+FH$s_G;l(jUGhAZc1t^%Ou}3pat#(+a)+iY%rCh-OHnQMDkgb4 zi=s;|oOp?G=_t%{ULZYW{RYOVahD(xxd}P( zvM>g~P;p&@@jBNus$3K2Ve`bSU7}hyNjO|;{*1*OHJg>JL+{Q7i1%T#TZ3ul$1a07 z53Qi1JuLt`HeSF*(FPYqVK0L3;u3uqvOh@KkS(M6^wWcxUxe|~r;LAAnE8df%smWW zC;4C;R2+w92zhcDz;yY_krr?DnqFUBYVI=t!NBUo18nHwOzl5$y5N-$>EI$A#KvP~ zikeF8cy0)E(=sx+0*~9$D=qApco1gVUaaPqumQ|k4*ZJ%d{bnk>-!2=T%lVFP5V!u zu4YlB^GgDMz=g%glGuh;#X?hyEx(Gkj1B1R{BLmO;)AZDDLkxD zZL=cwhqO!!SG4A)NqS>iqBAO*@wX~;&ThfapDj0%gT81xzEg;63XY^8y_tahELDu_ zY4m)qyTXw)Ou@rOki<`)q%q2k{LJse4w$=V2yX#oN`fo&YDRb-WcUq+sN`zred&+K z6N2n({@wyYFa9u+Mmmriw=~u;L1Ljr=n??P`95FUd+!^y0uH4q5Lb2@87gFdUwP$P ztLcs4P_RZ!r?3{Uhmw&F^-A z*xZXuS&prf-tk{{+Na`duCD9TUL{wlqe3nC&J4;;hkpNwP&y{&!Na{2g$O(!3`K#$ znC8-J!UyUvmho}{_Qjfh)?kp6AHp1P>jH;;fo$twf$s>ftd0lI2qwH_Jq7%5Fvadl zn8&o`*#1=8&by@+Fa9~+V&(S3%v;6lkm0p5GJ|OUARW>t-gzeaqQHo7!1(-LVMZn# zXkiIZ4~r3MnsFOxx`W)yMk&1@T@@WySBgEVieNk2tdh|TMk~>8QApbEB_v&s#v;8p}h)n zu4?Wb-s%Q5>-0~`RaNe9*oh-jfM%apvG#x(5uzS^o~p-J8~z^Q&R&9-GAEcT8p_7g z-JUuTb=z$SSi=Dx%}XPI_4wnF@BA735%|_L9adECdYnJY`G2;yx1Sa8Uprgd&;IE3 zzwQRs?KFh}0Q`x*)@~AIoz4hgmwiqCA6FELEI>V}VCX z1b;yyMR6BfCHg3AKo6hHUr!QL*e4I93ewYX(3I(D+UdZSJ9VqQHgV`j7(Uc`UV8Us~lG#ys^xT zo;<;60)xJ_d5?obghU z3}?p(@Dl^h*I~dB0vNdBU@0VuDyB>`k^asv($WWOQCk@g%lL?8J-REIa8M*P=) zPqaPBPCNsXPvB!q(Wi!6!Rdf0@F=7D`~Pe{SR#rcN+ij{^B=xjm)4$dR4l;)L%;#qh%ks))@u78 z-I&{M=s59`ogfVb_k)c zUQ7duf-4Qz^_A+6t_V&P(`X1BCCqPpFHf}r{Mjaim*^EZb#&%k8@gsz!Xpr z)Cxwx6@AcEuwXuTzVP+l7L?zR*>=?{Ts<#p`@QYE9@ts_z{bW#jcWev_n_9tAeqJa zg^fEnJK`R@Vc9CW5kF6{tqIA2%EJkyA#r-xbe69pSu#f({g+I&YOXY;<3T!~^50n| z&a$8a?55TNJjNIZ*HAjhuwcb3(f=0vESpVC2JERxi}9up3F24>1ex0JZ659S+>PsiN3p<$ zMeCHg^ImK~Pti4Q31)h9yw*6?6}fO1Z z_m?cT+s094BhR>zg-dX5afsf`;>l(g1VO{x77VfN7>&+!VI3kW9vj#>Oh%qXhVP(- z6a^r6j?{d=p@5F7>4X6QtA<9UI0T_7rzA18+3-lM3+XNBOq-%VyL47>NX|vO)7b-F zxYJ|RIq9}l`}l3A*LvMiZ(9f5Jw&Y6YL(xnW8S}U0Ef01tlp;|Bij~w0YlWzdG1*N zE%sPw(FJ71!u3>fXbT=eXNJv9plV=l%I&^UKEokjj_s7E3L#k#B4X=>3{z z@G`hP*;WycGN?=OZ5J36-OEN(_1UZ?(tK0#!o5j211`F;T{~KaQc9<-JWy>X;DQ7- zc!|*-z0S@x%#*Swuk7#7|9)R~ucCJhna2tadjsr~KdFiT|A! z@m>V*=%(TqJlfW~*{UCj5dNNmTIKmwYXQ+5sZUs^@CsNVm^CJh@#?nzQ17tF{{tPv z_N;hZSFjmBv%5<){$Cui`vPWnUJ&_J#as#@Mz+b%HrXD;W(!VjydVp`;-A!OBy!`@ z%MzBo53&2N*f!N9@1~vr(!4XpcZ4y0BLc`aTcmprQx%0HjW|F=cgoaJd6lsaqI|59 ztDhOx_2dHoN+j@h+1MA3csZc_gk?m3BHM*wmj4T)f;Z!atZ|P9-YH%nQ?QT=UUq;h z(b$L)cJI3TEBN4L7enJfujX#&MLh6Gq=##n3V&o^nBeWg6Jx?}$p$Z-mn(3A48E$1 zkH`pLp#a6>U&#XJJZEuezLQ}I=R=`TB~_am4x!38=Sjyy;S>wfG?A!56iFq{FD~OZK}5fr4i^yrAHsZqJafOyLduokXC=aX zI-gRxP>soj0(o8A!JlNC!vJy<;$ZLrcMNfnV*OR9K8iR}O9#CV6MJHhH6)uvml+Ov zKe$P-tla?kU1L7>MiKltLw%48VdJJrd<_`cFoSaf%OlSsQr9D1O7jJDfk6dyEk!5u zB+`)jhQHhkHHb4HL-I6~S_L{E!=M`qe2w@Q+hh~Twbz{z*H~pBh|sfbQ>AEZvy6#e zwf+D+9N_Q-8mQUuTBCoCBJgmq@UM{a4o4eI!f3uZPG*@NCy@~VKO+mIJVAbdqI?+D zd~^!l&dL(Sm1kAO*|zA+a*GU9psP`>e=1yLJ{vdu6aVNF|LA@ANBcwyWYQ2^30y)s zip6{XyvRpi{5IsHMYF6_hTS#4!i=YE_?t124q2;mAvPOKcq}4P@nd{32Ps>S_JZXF zL`+H^sx)0?s=NR6rkCfINjE?l2(%q-+9Gpl5&TZTB$7Gy3#1wP^pbSQFtW#>I$i3q zF!Z8@OBSb=-GoEZf_IzOUqXh8Gl*5IE$fJx-zPHEr#~h9e^un>@$mmuArXoHJbO{Z z|L=Ui{Vx;$Us1povz;~p1M{$;+f)4KDgN^m|9Oi4JjH*W;y+LEpQrfGQ~c*a@t<9F zzSU6M7w@0KJWpYsr!db`nCB_X^AzTJ3iCXLd7i>NPhp;?Fwaw%=PAtd6z2K=PyP>c zAvXuJEKep)7J0|<`pYc*o8|e8rU%*0YDL5bGM^QMUX*i88&=;8`4<#4WY}Db zkqx`VRY45leITO16qzge`L(h~Ug33v&N7>yG^O4kMPYddS;v_)y+tw%VnoB2?sT`C zA)6+yq;`V2_!LWMp4qRvTmWQYyS@D%RT~OTph%$q5@#??W@L2gL6|KpoGG_`nZ4HL ztIhW2o;$Dw?(o;zc-EdkOBzp}q;x-3y|GR<$tgt{eBa(Yw6C z*#B)*4s;q-0l2+1DO5Wl;Li6}#wDM|->gO8a7~lj^^IChHnD6#xbG3e8Wu=d`R9N7 zyZ@wqJcEL>$45Akr*AsyU8{H4JUdZ6Sfp=2=>Ai!cA)cBxVZ#rE)_VE(THR@03DP^ zw3nN+DO_~w_4Bq6*w^ddm^GvF9!QjqRdr`!G^EmIlLVB>Y(kD&A<7SCLv$Pyn?97F zyV2@8$-jXv75BAjs)+ijHBe#SYIF?2JVIw70Z5IaIo*eXH2-F$R{JsyBFs>w9k-!Q z$IjNIIvgnEuYf5blH!s&$mW||BLxVLBOoM(Xax9ko~c2kgVYvWr4j{>JL)(_ovG$6QwYL3N`=YjI|Fw4k zRN?_lI~Nv)9=ud*t%iElP;J}@d+V0?tA!6ZFbZ7pw}ud+R(t0;8o`YMehTF^xKXPy zcRVmwHN!XqtOZ7(`S{p?_;?s2(*&9!lPSzXmr6Q&jeVoujl;p1Cs+*=bo@|}VX2(5 zV|w1X38EQybmK=C`=9=;s@IR-G}P(w+3PpzRj8|I{!v>Q7fPW`Y4#_i+UaPSOd1{xeG)r>6A8@tWnQvAit_`TrNGGDY!p->OR#Sw3*Waw{+kd;(hX3#U?b;sv{~0|Eu4$4Pf)cGdzR3s!a@;CO z%C0)?opp%AAAitL`>lgM{=^tZCPL8TqiT;2W#K23cY84~%Z*D&lGwf^W8!)~RM8L+ zgG6JmXy?|N>L5X~C38h$pwS=J)p|Eg`Ih0k-UN{VF2l`SDCU~Jv&H@#0@YA42wa0p z{eRorTQ7?IKRe$&-`ali|9y==-#T=GJziep6e<;D^9a4~?U%Wq2j*5^DgOSAPT_LT z_E5B$qC8V0Y-rcA3!hPJsj_;syD!647d9;DMw`_0ku!SU;#RR6Tq{(-rT zPX(q~bSAOCWB<5))`xRQYT#uJThADHN|PjF>@Xl0;I6^b_ur{^omZ;gY4zG~RIl^n zS-02OQ%xC>*ImQE9)bOyC9`zE^wa;*QL0GYE1=&vw1D^1b8I> zwOaY~NzSZG{MqNvEA=`!h_XDmio$GM08|3@1As`hI!=p-nk=-4KYLh*|6#XQYbP<1>X#(c>;Nop&Tg*y9eFB?x_CRD~6nQ`goh^pS^0m?i`)= z>vg<@DOpaH&912OR0IAxrFwQmggp(?Ac}OP_@_vtIdUA5cpDXdbyLj37D_D7b*cl5 z%*>)Zh;=f{N;K^owOSwjYq-j#7EHg{*ISQ!G^vH|llk<~k7>D$SQsG9AIT;iZ@Fq{iuI&njJ%9Gq-_^X*nCKak&w z<*<{za<5i~rP(zzbuZ}c2dq*ex;cfG>rjPS|;6px@+6ic(x$yCQpR@@x(b$5l+Dp#WgES8kW zvA+z4Y;%}Wc8F^ag}57sgFVh?!?~Fr`cjfacKe9~dziqr+VODGH{pfW^>wPRDZvgs z6I9_mV%({%;bUt)z&VI8S&@B_UtEb5uF*?U&%DPrNzT0F3Vs6|Wv~wer)PobS!pXu zU$EY|nf^92Oy8-bJT=6p%bnUqY3mTahq`h=e-G44wokAUX_944N4bdj!ywO1X?7zi zgCvgGCn94OVe^lAcWm}fgk^}O(6mM8_i$EM@T$C_I--Jh)%ly`)(WGS zx|eb_;4r?1x7|7o?Qww2?I~uSKo3mYQ|B= zgiuKPH5L=DlTq`hcp~sryB~)O!%Y(1NRcUbwmXA_DlMr)$mk36Id%d*F!z#Rq?i+= zndWn}_>(kWIMuFZ?6YP(bq%@Nx%12&v)t1Wr;3?|VVtLFV9Gi4e>^azN2L)8Jv~a` zF}I05v%^2=IaKX~WY+66n2t#~5(1gt#UBtY595 zHu3hQAqq~N!p5Kp^)5&?=9)AMy+&YjjWgbQ*KerS-(ZT~>-LE=(HXeq2c#8Xej$F6dYg^} z{sTbuewbb9G}gJW0VHUGE~0l^YGhy zM=T}R8cRpuZ*bMPsJI5-AA?+mA*7sL%@A4PHd8g%t_dXeF{wQ$;UYgF)A$}!Y>ep> zwwzdbmTh!TiF(IlVSbPFt#1L!0V%~Y@PO3U!C>x;W>=jb11E<6>XpXigE7SiXE`mb zXker6_slh>m=W(@Mcf0rFtu*ABJqB<+^UM=WaJbcu+Y%O>Xlv;AZfv8O4otz>Wy{g z5AX0@a9UQCS7L#|g3gK`^t^0rN$r-0TnEbTp5eWWeZCve(|6n>{6w33Tnxk*m;_jE zuIUanC`i6Fyyw1$s_tmiU>Gn-PTMy7 z+F@4t_FDk(Ko*R3XrtS>UYB4%>i{B8KcPqcv~yIr5Hu_N-n$DO-{>d^hP!SNbf@#C zdOQ?FM-OIY)@a+Nn@Jx3ZHhU+-Xx*hUP5C-Q{3>`1^~MQTab#c7=%F~$0cFb$qreg5zKxfCHzLH^vhT z+O!I*pw_B{d>vma1QdcOyhdZFfM!qztZ}@D!4UvA^fY4?lSmUp8u?2Qp#YYj8%gz| z0j{%>!hzVHRF0C8w+p<3N$SW9zSwnQq)SC*Zaoz69-u9Fspf>MSnj2jcVHdeM7)LT z$EL*oP_N$Lcj z%inP_1tsEa7T?y@mgf8q7^soySH%YoDQ<51U|L_$>tsaD6>2V{;?I*o5@ppfo?eIJ z!G3(!#_=BNnT3GP16;D|dKL~n=jxX@X34qwC2m<04y*_zFed%PT1=xTB!8XD7=|YY zN65iW4z5!T(a_d(iZI}k2hKvdCR zME5av%3#(uYy|PbEVO@ndZM9j@UAT8EpmvMC2@!YY{_LeK?Lq}6S!0LXJS7DGdDs72fd89PvPknP4fUvyXL*AsMP(-N^8DWy74`p~Z$JO;3IF#y z<^R%37IT1weTa|V5u`W}_>O>U2sfZtF}dO@(g4*7C?}AUJmc_}8CH~?;XBhL3m=UN z_C7NE>(hyim_IP37)xD0F1Ks-5SyQTlGo48PoLn@`}toK-D@Fx`Gn=~Ev}9dS)G@1 znFae)h%|fRi-;|J9nZnCsDo%XjDLN(XfI%Nm9=}yaQ;ekshl4eppE?hCCd;X(?G ztp2{?&mOWPqts=)sc=8xwn%3Ay~$S-%5hwD*sw_~fll+iN}Q_MCA{Tjlcd1YHo7t1LKEk* zW)b{~U0F?a0C(PO*YOcRYA@=Wsg5G1oN~`C-jcrMg<%H#NIbykli`~6Ib?lo^#nKy zuIzd6cnR->-7O!~_4@Htqc5}V(2`-+UyCz|PY%^oLtL`EI$^#EoH(SG167@kA^HRJ z$TLD0Vc#CwP;TxzVQXQ1l36ST=n>Q!MF=xPu3LCOCL2BkQS40OR!s%z&YpFEhYoVZ zrE_*9W=V9TU*f}wM}Uf|U*4Ml3MT;EXEc8)E#E@UxXNb4e;EOK5xJcu$8xF@@Pf=K z)fZ+XjIYhxG*LK(+&m8nK>4heUiu0BW>SnaO@o241a38E&;vWD1sQBupz9u_5TEdy zXRe6I#UEoCvI9jw6u=6%^@l~Ok_IPI|044Z#_gI>YPYj$m_-15KZx510qqe5&!Fxj;S z@Imi@`B5@&=|ij?QeD`s_!+$PsVtbQ)tvb*FufCwQFye=fxOk1CbWJ=_lQ0DSO^Ab zNfMCMHMam(mv3PfkAg5&fjm;^*p*h}ARSUnh?`7Obb}6(sZ~1c<3s{gnF2^-#{NZf z{8lD{0>bYQkW(my){R94M!px0O%40#8Em`#w_+Cg}>tvj-X2PF*GpgK`$OWLdr zB*ItisZOtz@Rp^|)@tYWXBl@zPHU5V?J{OwSZ>ZX=q?d-#%rQt=$lg*v6}wLd}s4+ zOWnyd7`V-Z_=9`30V~vzEo{}yKB$B~s06^ph@F^>%G;e(#U0(8Ch%)%o_b0@vo^W) zC@pObKpLeTa1K8m`afONiUF&9zlb^63YSa1f#wFnP==tDG+l~yNigVIkQzI~bOYIJ zoUUw;Avg%8Ae*F@AghS2sG@B`w8~Zkg}Gol(I|PNQ=qRP-2rJnP`|ohIU)eNFLXKP zJ}<)W^G&0D`vRfdkHsIo@;Ic&ehzElP6BQjyi)*$KzhGwJ!Ow%if)?wP$eTr1YV1+ zM)v|paP?sCja-ynv7_aK6Yg9|f=BSE3Jp5UiMC{jDJlaX1uaBI&2u+~xsTBR%lUu4d;Yx4|FgaG>?!{LJH`Ji z7P1HiU~)#SoS>}XY%%XkX-)X0XuRx^%D&!1K7W0%zgnap82QKl7aDjFJGdEE55bQM z&;V7_KxoOPZQhoBCClhtp&#_qOTRk{i>nrUcCRX{rS1tVVb8;AI-h|Fbeq0QG=|9_ zbL7K*8dt&*O1ln^(tMTNmyinYoDJhroEC5joZkvYB)Ae%06|(AGRZGw-adR2Har+M z_{{LvOwi-XQEAdLHxme@oH{Iv)1NpnN3W--8>BA zBwepuA8>hKa0=GNe9n=+hd~y^=o(t-gu|6QP^Fo&Py`2{;vXUIy!we))*U7&1SA-* z7F*h|M$2YuuFI%{K5avYx7iwB&Y+L)yXLX*23(1sCZ^iy-xKdh%-e;>+pa%@j0m?&V!FY(4Qoc4r0c1@)Ml%Vp|c1Qj!X{ zybv1K_LG$AX(_@+tg5DW&hlyY@Q@UOrXE?a*zi^bkOlQB6?WG9QZiQzq&ZBv8Qe4Id61dOs2t~jbyf4Cyz=4xAj0XU6%FO&sf*e`?jM2cb5ll8Dbd}Ih zqMZr(q|s~$Iz5Wi3zgyziR_=7K=(PT1bXMLkEykzW7YYqc86l->yAP*3$lFW-yQdU z*grUary$3(d)jHAp7lBpmjXwXB}0@?iOtBwxhl=5I~ZiOF!VH5jy5AUK9d~FJs2=f z*GEVid!$Ok`DjX6|3V8@5)hBV>lr78%3(drw5b@5lchXZ~lJ*gvN=BT~xcFOUNN9ey)r2u(n&NTK$?3P! z;GV+teI*~xZ1f4Pqo`uun%}_{lA~8u9o$v^s2l3jr8DeH_<`?mYABr#HXf#@x<}p9 zZtI}?*DbuD2<_|_Yb{&947!xjO^syJ%!;eR?r|2M*?C&JqGZaABKCI zSADTzZ%MATD@-UTywzr~lE7cRUfTzAMxFoFh1sJGb^g-@%|Jt)|MdkA&b{>1>x{W# z@S54)&W%g($D{D0HuUJ`9E0$@bC%J3J8v^K$~>RyD0CUhglmC+hE|;4OCp?0vWW&m z7)sYrrnx7fSuH3fsmNBoqO@!^`6^fN z=Q6nMj(d!y?li7M+b3 zj(^Ov7w_Hl0xyL<`~@smee^H>PQf@S`);`5g@?)Frcv{wB`IA-qL;3VA%;Ss1w`ozw%y(@S0Vg#X9 zvw0rqZKHLw9_LY#;-TYi3^7zO{S4DiQ1OEnTIf8tJKxkrCrxkMHD(Hdp=W>wd_K0P z1O(yX+>Hlwq=jN3b=V-FI}3q;F40q-kP+%=6gUAoAH#fwVgQSwe}b8F-4%u|I8T`0 zqY66L_?4izzY?^b@ZiW-k<%b{oN6dOKn#Lvc*K>MCRCN|c=^h34WrnoecfPL2MapJhju$Em2EgZs7W=|DtzT!V z`{P+h9duvyTD@-TNZh4nV{Q1%T%$-fCpsS|!)#-a-AIJ; zq}O@d?Ywio#+e?bATICBK?vD*QjzMQbE?kzou2Ca)ycteufu^$G=NM_2f1O9WJzba ziKm|Qj^6^;@hhOrqOXw!BT#dbHkG+7miGvO;wXt#2^Rnh6JqEXF}mb`#{*{S7LF|! zr+Rgvs08`c@Sj!i;bn!Y;N^S;kqO%+6Ddu=3;RJV-y{< zTBE;Qh}M=wOZz&r`1g;wTOS;q^-h(jS5=ccASUEY?Y#I`?(c#D6je~)OF3sME`w+C zZ2*QJm`M0`nnW1ybtb|tJGdz3RAw0S+G%;5?_AAoQEwP}q14m7RKv-H%B3++S-VZ+ zRJ8kV8(;>~AtqInuhQgJm>Vl)-k}O6bPw*8e&?Xm_FQDPG86WTrr0VFCeEL8w<|iQ zlDIk40QlIg)mBa@*HcOoYfcWP+$uH<7LJ#A@8=toAVmf(WJ=jmP4?N0>pBN<#awuq znt+%Oh%9cN%2j-PoY=KlCJy5*I8;GfCS-tkV0EQhQI~mrU;(sc6`4Usl95 zT_TT5s%)J#kn8Yr1dceWn0kqfcMS;pfRo^II5P>P{8U!weEWj49d5Mh#&L4P5CpaMeX;-Y z>lA)%e=;Vz;IA zLI4~QI6CqZB!FBCW`+(ILb2E3z$8<Us)NOFLXsO$sk2$c)S{X*;hx3H4khud@ z4EiHnp%2a0@w(g|2T7(nP~e1&jD~tW(`gz;QJ`K2>5!O6x(=#xdGa*)W+%>4`DisRzDRF>>y8l-_QSVTQmrN~du{^~b?5xg|Wn zAyPm$z#oT7F&&HpjdYw?C21U@DZ$o-F=GuM$V=6MpQ)|p_juvWnfV0IJwyl~+L$Mv zNk)cga0^DRt#G$v+1uq?4tskAF{*S)N-fbTDeqb>Pv^tAxtPc!7w$8p_2o!*d=tK@ zL39<|fIXn)MB8aTFTG-nU(;WVd$DuJJZ(aYa%dd|6Ac2f$A|2$ItNmOi-zjpVZ5u( z@i@L%N35KaU2*;j&q%zuxF_WWSg*im0ZwIgj%u3N_8r@MfE>U11#X&Pg6z0x5A3S* zKK zP?rae48oP)zC`)k-Y8oN{?u+gZ*D(dGPOdW!-_kWlP=KO>6SHa-J#eIAv2)^Od#JOd7vB7sGGJxDY zGLYZHI)fQ7#d-`8X%(I>p0{)R&8-X6v~%VS5Tq2BQX;1VR&u!T-`n=yqgyM5iVPQA z;f)=5qdPL^O+&#&D$Latn6XFzhk}wZTL*pnBnl8~bjqK(0)0p^?5zqY-9?W|tZ7UaakmoeI1uUjC8%hgg@39_ik@MS4syVy}H!Q1-?^{e7V zoP8f8SEDemlIVxNv~$mwOwSRX!e#t4MV^ZUN3dqAnXS1+(aH?TS}tU+jbGA8Axy(T zfrj5KVADJ%)qD_?!zu{G*HpC<@e{2>!p&tX7OOQW=>sr29(ps=`D{wzNkf{N6+D^j z<1>-9#T9=l9h*#0nVIYh%s*mZo2{yYi{-d#EZu~-&(V1U%rVHA=D2TaCV@%{p_g50 zuBTI$(fZRd(pz>h%Lcb0S|c!MXaq4AZTVmS?P8{i3RROWDBn}%!3G}+EPfo^gx5Ax zv#L1HNvb7Z5d4kKIKZa`j=p4MG76m~fI2+YK5+Lvo#)1L%l=TO+Kog|b&O^h86fO0 z;Vct-zPgov3WMW-fN8msL}Ky0R(Od05XVW`^BwD14z+^kCX#FX{)y{==4xCh)L3Mq zG9Dr($ENLHAw+-E0j&sC8Z1wjXcy@eIBjmnI${(ESI-a}p#)ew(`K6Ln-B|N zz{x;WZQy_v1qLN3<76^d-l^%wipsS`?2~R>rCecTfojA3i3hd41u{p9x#%u(t$X!D z(1gOQ4l4I{1(~T}yGMF>tx*+l1==94i1#50tIc>27e5uAO(2(aQTPp?3FCYgK2;L= z-QxdO%^+;r<-7v`usr_%{r1-LQvCnLcRNq<|F0SUzuHx;ZnI~X^fv$i9JWr|Zw^~O zKxBl7d|O>hP>#xzKTmKRs&{DJq8K5^;#7a#QT4)G0B!K6! z6Pd))2_PSA-h1N zwQW-pD~CtiGYuLN zwgVqQ0zy?VDkwaCICr(6WZ2;pn5L^vkcR4d2MBoaXIY+15M1OQ=!8i}Rbuk{_D#(a z)h7>8y$%2cKMH+OuhW@#ZbRqy2}@%@+r%(NVNRK0CjDWM#4$TJ+0tFj=qTUh(OqB@ zokCmzTd~n=j8p^z%5ciYQq{x;ST5|Cw|7wy8ZuTSW%-Q;Y~wC6-{g*VoIAi{288CA3-~A18VI7NJEGbO2SCU*4_@_-; z9r*MtS9-4kTY^mp2p}0@Jo8oqDwi1JLVne_60KqYlu;A`B49X64VRpmn+rA({P5Ic z4c2aaTer*k^zSp;oee*(rq;p{ct@ge06S^@(MB%_Yp$UqS;~$Y_&ugz#lQky>zquM zLaOk;ssEcgM!{QM*E4BHfQmN@uVZaf%Q5g^wo>6z<@#;HA;l!F?c%@OWXutGJpy;dvx5V0Yx@9HS@Z!5$?ExR;0L z2H}x9X|dPI>5xohl3J(?$F=CB5H6}9@_;koX297-1PCRgA`zSEmrLP+`5!E^gK+@( zG`ux8+2^GU2~N=uX?yzBW6~~%MG?9ooCam+Mujc?#ZV4EAn}L6ax8YbJ1zruQJ}gk z=qRe>VK6)e?+@}ERJCr7i=w^YoCLQ)=It#^lrNZg7sW=lFMO--9*3!q7xCV{&tU`; z)x8TeQoPnN4Gg(*?4_NoFH?qx_-bw5E3|n zh`+a&A$6t4VfDF_dFTs{q?o!$c|y8<&U_MBa;T)`<w@hAnj9s}J`*jW$2coe3bd9a3hLPl^dtK|$H z=`2%%y9jJ)HRIt6ki5yMzd~v|f5LM7VelV=W*Wr9WYRRUybJ+y2miy1?Po>&$FptV zgm}V#d_DZfU>8`=AxEv!X#F(+kbbAvIoj)Pa8kaFFO~Rq%N`@Bu zan|psUh8P@_|SnEB5Cz3ou*;t=`t4%pM5FbL$Dp~UZ-{10XEd`Y3HzWbgF_BukTeo z=l2EE(K$SM)9QEsx})~G{r2(OPVXn83YY>t)F4Mss9^3N9nnD>)k6gQR>%(g64cxN zReTZmz;_skXmM~v9H9qEJZxUim?77j+AkoGu*vM0QypYT{S@Wcg-6A7uox2#a=B#D zWaEglbi1_>L!Gxg!U+H?lRZ|W7VpIMeQ*<0*k_`%hZ&w)!H;0L2Q%6NmGE+Vi-=t z9H6<5p=Zj`*J>-+x}_fZ1}q^c3Os-+Cv=k~YQ~XW8r$%EL;6$Yc}hk(ra5vj1Z#sr zWq3!0d8yXwN>fHTRZtxuTdqtd*85&Kq4oOd7yt|qd{0KwDWlcd2OyK?E+FOxW3(fN z%u2!JV$E+IjZo-eVMnRfv{%eLq%+3oy4uZy@d3xIC*3BF2!qXUp&X4Z&Ff@}TIq*K zQyQW#04DI~WR9gIbUX`V?W_s!Cl|@$v4|{%wG@Tw4@Kx9Rnm)4$kK5jFqp3MP*GBB zJ*tvwAW{$1iS{#0n|PfhLr>f6`iVYnQeJm;f+ge&hX}0LVlV)S9;_&{zJL^f(v`Uf zY6NwqgIPZ3EcVQ+W^Zhaf(_#InJcxDI^n9JM!?7s#e|~RbE1%|u%WE<*a;wNOctHu z%;MObec-dQ0I{b=0=*7ZqH<NY;|VL3ob_~(E6yZ=ac z(w@9)NdaUMDsjG=63!TY}h5QnepvG&qa4(aH-ZYWu5CRAm~i z<1p5lw+-k3yLC%u{K~0v#N7vL^ye{r9@t_k=W6G7nk(^~|D4RySkHaudL9=2>W?u^ z8t*oc0ta3M2iai`6-Jy2yo2c-h6dn4_zq)DseN=0QgB&R0uVL08KtfzHcfIY=o~p% zk2m4VVK4AW%_&ri1;d6flg z*2{j(v4WASoqyaKLjPwe8j(K{zYg!FguJR`>H60#IMvNAkLFlt@iv&F$&+cj#%0umS?fbI~dLuRo6dSSs0cjGRWGL1M82W|Zc zBmimg@SDIhrv56aWcC%Bchk0dU&o5uivz(_w-o!GiWrJITT`j@Q&^4peBUOTFh%_0j7l$zZ`uDtg@^)|Fe4l9+Uy!{#(iu2ZY668W&@tl>RsksI%VY6jpjKA22jtMlzE*W1PSNrF~xp2Z#?( zd&=xDd1WB+TTk;^twUC#ZzN?Uc4BY$GA=-aJJFIvEY_KDaddNgmaiKZ7B^0cNtmWU z&jBe^1)TyeaVk;J1dWpB1R21(cr?T4!88U&2>ixa-K_w_O(DaSfYi4^I&{||OCsET z7DZsLNiv!5FtO`2_@H--F}A-tX&vDzQB@s83L~Ad5jtTyUiTbK!4>StIA^z`?AM=X z!)umpp*hAZc5jFbnem*#9_oMrAth4}Y~vvm$zui+E>UaZU?;89(@yUQfzPj@LNJZR zsQ};&rb{){!JD8bnzF~lH_VpaM5os-Qo}93;ayq=$Wo8_rV|~&QbBJ2HIz)qT;K+W zV1x_PR-L!rXq-_mWYyj4wA5bbZRgNKnR?IM5ZZc=0iHlX$pLM! z%-mvTQ#|(41S$JxepyiF-Gf$#dYVIU`V`JP1{&P57~uGCbrdyuzd-(;$fq6Bvt8BV zd)Pti=%{=28q=kHg@WnA>oqG51L1;*5vL9|E)mT6?@1*GV&|77PPupo?5}X5qcGOI z#>}?~ID|ADWZuY}Q8_yfR9$v&#ueFwq?P|rz?8#a>OsX4#}J`No3jJ>Of?`CK80|_ zn}&#>((TA3+CoZHVBn!|I?5Zrzgxr#@WJJv2AmZ!N!*zEUVgM*ZzzDZSR_jkB8SQd zwtb~GBB~ByN?(}EwF^1775%#qZ)e*UE--3*(%ob0jtMhh%_&HDh`)BnE}1>7O1F%>eHC)VEUH1Z4M6;NrWmAlGrYSTHIc1hKf)Tn(%s5J0eN ziVIO@afksq)c%T17VBA|1Cwb%7DGoB22gP@Zz`)qcEC)u zVe=}*MOl6TIe=%RB7armzW=w5yi3bJ4q z)&hE|;^IE@_kAu_4Qi)K!$#PTm+kV3Yahb^#H?b|mhCNUuFACYSF~W$6^yc#5@6Ak zm=^QuFqm>dJA|8o7uU5JY_)Kx9n3n$aoG?$2oZ~>>C!#wFqrZM>c9Ml|637MN`AK- zBZW?%5)qD5WXHK*(p8*R$gI!Z)()7^=jNO1g&Ie6Y?gvk6ygL*Z+o zuX#|+M>fBAwi9VtL+X6Zn9xiklKKoDu502EgehI3~NCPx&`x< zC&>-zC?NZ}>#%=>c_~~J-2)EJ{=&^_7^b!~w>v@m;3HZ!fo0$MaVY$oT) z)aYM21tmq?buKMC-X38}_?l^tc_Sar(J__nP0=!UE^NU+(&hM9M~yex9lUHl+N6~! zRn?o31-_|e$H61aN&AlD0IrQVFIL$VX2s~k25Z$yJbkAfAdat8@nPW%QmfHcS#)=qs(A zw}s}fNX)|&0DwR%&>ChBLap(QI{h;E+A~|uk2^~1($h#xkXd{axu^&3Q*`k8FS@0v zWXBvjdHEKd<6J!Zw_#4j)6N6O_O8C7;VwNl<7Xnc3#ZL(uAbw!R$<9gQx0yBXUT1B zhg8-y3I?3-@3rb4zKa|7XjB{%tBu4zrGbmmS<)ivID%c1QPQ&1LuQH*g*V8>(7-Q} zi6Oxf;NXOoM*$v{&VFKBE+@0oX`wY75=7jQ^&ocyna&j?)AK9E)$4qWxy@NDgD=t! zk2E5BiTS}+y7Z*())eV8+bj40NK{KG_HZCy(FXiAK)zxe{nr5b+P1k_+^Ch^jo$I#p3OyPara z5nn4PahXpujV}3IVN9I+NLI55jI~l1#J#KI%Ra_pZ*fSSocSEGO?5#;!RdgeDbko1 zL=dgzg3XrdUuI#dg)LC709+5aYz9{?2QPy_`wFKb;t&O-T0q~3FnVyp!9wG`WV3%o zQllkU1lk{T7brq$$Qx971bL9Zk~%6u{sOGO;ljLS8#EV#HYh~Maum%m9fxVS?z%=j zJ~q(B|4owNEYjKL)#Pf^>@WuqIMG4WoThr(jAwa@bLqhXcbb9Wws-M>%lUt{ceYFT zzwfuVpYVTQm|(T0-RH5}~^UfA_9h{WMLJpY*#~#b!SDv69m7r(4mg|-kK8rY2ocVM>_fIG zEi|=lV&mf^TCGikG@nCx@^?Ijd$nrU4c~80lA-ozq4urX13o@y7{gFQMrzNIw!K#s zvk5$YoBVLol}$iFtkzHz+bp0-y0{5^usJYK((5q4dNM`fcIViLiu|^s*_?lsZQ941 znITnM#p_y)VY)lJYL5n?j)2Wm{Ykk)cWR4}m3`VdQLm3%2fMY}X<|wlJ?8fHi#oxH zJPN4{tY%&cfC+&~gi)P|)_I9WeyoEC%zGRWh6j0!j-9vhFbp!>?ayM2GeGJ&9BT}e z{a^ljb<}y=>6t(@K|ABz1R^YXqySXgz3yqZ-8$GM91X_c#q@@~t#Hg7NXVJiFrK@x zM( zJPK|EX&TH$Ka}=;8OKh^(O`L9SuwC16C^p9&X>W~&s=2;z~U&yNC(#g$5}?5vkin? zNFRQDbnp{Qo3qhey-$h^PdC#g;Mofe6K_!j?V6gUwB?+UPPh+6JdsWDq<0MdAdBRd zW6nF?x(Mz~klzh=8N&DkxkwbmX3wp~GdR++v5ulqn2j517=(at%#wLST}QKA#|@?P z!Nxk=&C5et8-~FZWa2i|cn+$Fn7A9N`>JnW?Brv3aWjS5SeVZ4ZSb`leGMbQGRQaj z8vZv9B8bL)NV2g`*D0Zn=cP%~yEY6nxL^XZRDT4Bh6=N6rn7Y-sz@T8g7KB9wFuZz zAf;^oc<-=v0-X)BJeY*BUN^YOL)aQ9K#2Om13Uw=KZ5a<_c4)Yn635du&35u1#p%g z>O8ngB2a%puGi5ql50SKXmz^R>8LfrFzf|kG-s3^^0mRd&Qg4%uhH?8YtT*98M|#| zt73hRYZ&?{5K&C8lJR^4 zmjTotPC3j(IGd<76rm>2-ocOGhB(pc)z&sHbP(HD_QNZksB z|C7BleBR|En0Suz6Ju-mpf>nawpKrvN+lh3j?UEa325 zo&mldbQ?3$W15z=xxf^|7AQKCfdK|z!w zSotISV7S~f_YemQh?WGCGjz;O-674Y3a+uT{D>{+c;+NsfojDcjUh&BN*E}fKu z1@OLAhw$7Rd5$ROP~`Vj3t&GmAgw+vxDbA(Cr_LwOV>MoroF5B!HpHGf)F;?ckP~{ zoR|_}@(P?#uF1>4)bd^Ts?DEl#dBpiUx*ltsPh3Yyi0IeTwIxMZ1KFOWs-4nI5d5+ z_U*GK%T5z!x5*Q}PA4s!?{uqbA0M6^bWlW(j!!$a8j9GvH=QHZh6C4R9y1OWX9Rv8 z+-NW0Mp#3~un048@;8V^38I(xpQiU!E{KBj;k}LBka&qls&hCE9$BbtiO4AR6L4(9S{N&2I? zb7}*iHwwZDDgrEAH)KjIN_eE>Bb!8_Pz&c6Jvq7a3@S;C-<|=c} zcw-1;Nc13GZW2i+)$x!E@@jk4g^SedhXfLU`w&KVKZH}v!$cFgK{*%{BbD$J{4~WY z;V6Ls1^f=V%#djTV5uY_nPU~3`p{4*NoR#wWC?v@^nci&<(~V;`2+s{DwjC>|F@p+ z6#V}?&z?Qo`Gfoa7X?V+BlWYFTHUH$Ae{#(~x#pi-^G~k%C)fOwYyMwc{a@>*o;cpP zt)^VLHeo*n>0rD$Odxrr>3c?D1L`~ki>Vm}@h}?%Qw`CCJNSQhzI$Hu|9|%!|Nn&l z{|fxSd$^Wxo5Qs=j>fiKPIVy5`A{a{`}o^#^_Ajp1Fg9vgxAX6H?}j=FL1)CCi-!J z-hUPkb(-Y?-urDOPU5%6<|N4~`*PPEAplG6JEp0`4nR!9DFfR0!#L|{mQp5oFvzpAzYxr$&S@7JnOjG#gP;1RwoI(=HDou^{&D-P z54W@rklz;tbDd@l1sTFRSJ^m7Ii<-_0BSgog9%X|B3bgg&MVdLw0i9~s@M7PtlR7C zsiq9d>oHl^84$ui*$l(@^UweE5C5p%^}4{B%$Kk3;bCX5+dAzW{N!H0?shjJr;j6d zh62E>hq*ok4ZlFdK{84a1LYv(7BpfoYMv6n=~Nvxl`v zE|4$YPw%YU4uWZ57;woH#{J?cQk)}=S%kw9uX8(zhqFQMeajr)R(O$B0xL*-QLi`d ztn7 zy=uMg9G&*-^>M{^U5 z^Xi#ctpWZqm4%a8ln1d+W?3|6hlI4SQLFWV{@JF2%gd&>hG(L-a+KVvF7RLtc){!S zhkd%~>q1=|Mu-uSg$Vy%0iJ20Q-;D^VO-K%s)8nXW>Ij+B*z zY?@GBFP)z5*DP%>hZT9MLs7r4K&X)uE*WZeKvIf2#9H^B2oBIFLjXrGR))CL4Brok8^)7S`{6ZE1hys#Xmt9SuurU};T2HV=~I0|!V3 z8kx}1eMQAWozjKpCJq(;N|2B^7=%hW{Yj68U= zjnSOtJ44VrgM04~pFzE!&xZ5jd@kMz?EROo!h@~r|Btun^-(gff6D=bw&NueRB zj7wJ52pA+75*5iV-BM&^WVJe=bdpBOE1YzeyHgQNm4JO(>~#0^45}L2z+fBwG{B&- zz`pKN|Csp$+dpA(Zf3{aos!~`x2mXz?hMM^+%CtC9Xprrn`U-OSrQPqBp%E(VF&ft zDMc5Q!$TCpbWXd9jN|fbkS~~BzX+nDV}-Tl#~tD-h<)K^8hxUIF-p0JK;H zzK=~kAM#0rruu4$_l)f^XtGS>(3l^G$L3O z+T3d{5U{YPnO&?^W8N^r!&luT#6h3$N}!0%eh0R?+i2h=GLNo^e8CyKO%(yktvQ6D zn@2cy`tQdQMS#{zAWdtp>%Tw=JyjCQa(KwcYvVi=VLdW7C*7!CHZH=q0Z=%d#dDx- z(7S+=F?j9WN&4~v-v3>ix$dUeL_eO+(Oy*wHVshTDDb#;&H1r?jmjw! zSQN!-ODdP&eU_xdC^1*LIkQs?iSL^8XEvQ?(c%)|Kw|LK4wphKtxiRFy^m9}YtEma z9lpGv8Rj|ZyPd69<5X$k#(7Bz+;6g};eFMyU2`t?rQjSuY*dg5=<1qY>=NCiESIbf zB9Z1c0nTGi8lk44sjty0I`vi&0M{<4v3+O4R&6JNb5|2cU`aMJeLJPVP~T=(c<=Nr zjpU&rLB6e&T&!CKJ=}h%DfdgJU*mkOTD@aM_5hfbh5s^Ms1FhF@=945bYEIzkiLVM z-As%)TEP%XeY!_Wnw1<{KpT4JI38Wv`nM@a<8rnp7>A@uhxdCPyQkw$dX^4JtxO82s#q^l??R`-$jeL2x#*6H+r%BO!x*vJ0KJEmP4fC<7Tcg^|9FfXDJCJjX+ z@(8^a4J6vPta@Mq0ecDFr-KZLIOD4*$yQZ62oRT+nWduw+ucj&d78vyCb$4DSD3t` zUv|*Bi;PIh(m)`+d6BurBotBTENotQ75_iq&1kL(hl}7w9flSq;;mQvUAgDt=TDUc zcsIkje&~(~?}HyCE=ddY7Y^uL{-`7^7xo;8o6bjk!0B@WkwoY9(w0$DMqkC z2I&-^tG}h;A~Xn4LbUE0XLTR`T_hgvd%*+-TTjX89A3j51m5@b^R87 z_k-?n>Gsg7akKB<=4VGoLp0v?cz91*zV8HF?!Yr^6VCR0B8y~{zRu#Ju=8MkFi4;{ zSSW`C?oP*uUlDumG>fR>kfYJQ1+(*=#2Q|FSHVWS&36!Oc<=3nyZp8Li8sB)VNPC! zcn0Ysm>#271fQ)7C5725)sz(mOa(OMEG6$pkUqCnmi-6Bz#axOq9mTqXLOAa&hqtC z;Wk;ZDT>TV$V>o^Cq<8~?!wylNx{efN>mbMwAV4s%FbVSrRPJl!DR=$W7=&ZhpvE+ zYFeUtua|oiR*6w~X&bFuEq-1_2ycr6RziOAzFM-1(!=-~KDoUuk!OfRoH0-&(z!}B z+lRhewXy6l+KuWlO*0kZu70PKSA>dCg7tvYzrs+qG#7pVj&(1C(65>g98q-M^+9ol z)%F_jVxc)*tR$MgNJnXsR{}+6U5++~(O)P1@94&bV9E4SO}Hw z2`d3{C!%d{CRsGI$T&-qo!BW=V<>*D^>(p`)8)klO{-#*Dka$&DO&kreE3%3{p4e2 z;rE&UC&pq+DtNiHZl{|42dcXUKHzrz-_JjL_^6Ek``PD@fAul{?}y3%^Z9T+6WnB#`nyH z!#u)r7F>NL^Pm3NoOv!anG9dClx8qXGAGLCeM<(KW;39=hNxKPl4Ev!VvbJEx_I`% z44_!VIq^mzQ5RXv>r>0HzG0bYHd$Y2*?MFo&<6?($eO)}3%s4L=$>dZGFH)E)9w#< zic@EZY0l-=GupivcdkUC>k~y~u5_j-u`YIc2J?-m)OWUU`!LMm5*i4?#Md&(btrC` zV!uLuWtw74W8E=8+S9?06D;rM^Qj7P6bJ`z?KPBuCbkq~*{C2BO3WQs(B_6tH- zMX)6Ln~rgOmSXzrN_CpF;M%SW2NiPI+c7_mjH2Mw2PlByGD$F^%)HWY50KStYBM^C z=F?>~wSK3$wGv6sgMb>0=fF*S-H_<=$LmCKSBSKRi{)rZnSDa){w`yiffc**9l|9M zVd6q2ak4Lo4Skp zAAIzYauNbK4saXGW@io70B1m$zrl>jM&n`tt)NK3Mu#l#$^q$Fnwbw*G+=IK%Uo)b z=#;3qS+1aL@7hdIlsd$Ro^~+)Jg? zR(K$Zc(MT$2pDKG5HdXQQ3yMShb*>O9|xD!QeXrVec-yEE{8>v@oXrw0@`;~fmh-< z^pOMKnRtRhR<|uI_WZiv^Eo;qNf4P3B=m*AH(fbl&u~zAt~n& zPxId|qpU!-D5O4H7Gtlby~?L4!R<8!Y!U0UJshvd>D*`>MtQ+sAMcv$Yxs|w8z1v~ zQlVwW6p7^w5&;x&0J%V3K`}1+S(+~3rwW9Kl9CvxvjW5KFku^~C9}ibVcp?4*7mFz zV5Fdrr>$cB6qfWKwm!YrZW5dkK&icaP#fXI0x! zWg@gOmlXo;8M{#YXpxAzY-z>0ce-kOejI!v|AYt@qXL=B5x8#5GPiCXO00AuBo*5l zCzA?H#l*&1U(sux97{F;SDOOh2tO_Q4F1Auh?tpZ)3?0dA)~U0TihD=i^I3WknYx> zJy`7>`=i}i0STYnc!5HPb(D>1GXToa*iCfqk`T~498Qi!>M+M%8(QG*X0K963G-TDVY4{JLTFJ0%2Y!6!vc)C&AjY&-;8XM z*m?1ZsTD(9EO+(!1a7AP*@+x>e4J9w@8B|?zoG;Jat=ghlg&y>D#+4kyvYp)GHgJc zIDDl?*fza_%l7b2xguO3((#A~70qlYebH4K<8^KZS+@Y{@(Ll!sKcAND|P1u>7sZm z1?w)8;1xz3EO*?EQYs2(Eebq@gi{jd>qK44os)ELMx{I$=pW>O_!$8!GcIUa?P`sf zNN7wBK(2Aby6`KTtq4R5d&<0fVm0bn-pqYBL4+n4#cVek>(mk{M!C>o6b?Znxa;+s z@e|MMO6D%=Sdwf&)seGx&6Tt4hfwA;9v~WlfZD2%ylV7Cfcp#K7;iQkaANttx_`l+ z#tae2r{QKp4vPzyqq5sDLI_KSCMr>&ehuwI_{H0Q?k8vG$q!<*xgVT8=6(rmEu@tN z=gh9zlum6n{0XpYuFbV6;7(30m>YA`aHq<}B+V|8WVUOHY-s~3+VPmJwLT3RX13!I zamW$jmAV4TdQ4=F$_XMySli`$C?n$QNOH;G2u7ZFK&*0ZuaeOq7bgE2^bCEK+C@;e zxl4Hj&dPU3n)eF2pGsaq;{W7z=RHZs1w)vnM-~`xQO4+cHG|n_ka1*-@31}HGPL2N6Q(Ur1*5%unkLZlxwTj zmah7Sy z{k6?A3=5$uq%aEX(vp?2_5z};W-=4jWVAV-^?DPb8rli;S9%|bmlLG!;0WAcrBj4% zjrUW3&&!9VgJ43O&Z$eJxkN8Qg>BlgL)Xzxt3VBXi(VkgYsJ6o(t&aYv|@hYby;S7 zCi}CXNHO3)Omkaz9k0(StGj+`!FQQh3Ia*Tut@bNXRAv65a zU29i-3L?}*Qi^V(Jz_Bl3a9JE$=Pp^nwn!T5O5jPM#JPb>buyp1*DcKoMLA3dz_KR@~O^T!|a zKYl3wXUN`#I_dGf*%sDFN0kmCY`TUIfle_5x~DcylV~n)Q)$Wt{ox`>3D4wa=bC@P zdoznIlOO26V5_*q?yg1C4WMRNdRUVJao&1>ZNHTf5h4U zVQ}_&;yc;sGA;!FppW%ax!JdQJe}K&-|9^eX;kVuE}`;e2zgJ__{z@l{<544+7H+` zHp|m_g*eLc$hH`S9P}v z>raS-q3fGI;R549_nO>jOF~~oI=A-#@ecvl9p!=VYa|N>q4PQrEcSs$qhiV40NPkC zIPKuG{`h~ZtZQkXfo(}hA?-x+zpG#3{4}fHhOl$E!7xwTF@oHh3FfFv*!UG~M;Bgy zzeVUV2cqvkjtn0V?ZgPXY-(`qZBz}04J^0}3ZjT7_d{TgRZydE$qnO;h*hJDLgVja zEtSF+bIAlE79{$iQ7ev!vCT-#gTTSi=5QAPg*D=sip;s2?cowI(B_*kwTqR+mg@*z zc;ASgtO_Wu9EF=YTrdH- zx{r|Ri7~r8i6_ua7db|^L3tc}hfWu^X>D2lB`Lr@;*Mt9Zna3th%w73!oFB`t!rFq3Fv$p9%?iFbj4oT{@ zZ6fAIJRcQKo;D!TeIIq?(DR2``Z_N^yKAm%48R+lggtWm@$_(e>`Me!EnyDepWV{o zAq4)&Y!Z#^PKt;^g`^K}Z}%NFj#09*&v3bN=FnM4EBm~lR4(=Smo{10Y=>9XFDa!k z;5YyfgB90cwV>78-X6F#X!=`jwrqRaZbAyq3BWybY~TTpvXqe2*StRD4Yb)#XE}~( zc%t&@X-cLb*dR+LLFub~tSfmz;lrkR24PgPY@`G3&HWgv8u2SH(kvO9r+|cj29P+_ zo_Ql{ds`zx=ue85V)RiqlBUVG`H-kAl(QV6gkcI67|<-XY7 zHZLyY(IxvfMC!qJ0$U51X#k}J%Tb33<1$8+;+IiQCg!?fgm!amfX{^a>%Z7=`GPL; z6Q~aNE3G7s)~Pu8$T}5=N)lBgsY(g52MWYZ7pgzj9dbU2`pCg+Z6g2hB1?yfoguHo z=rXqWS1ghQ5OvH}f?Om@kQv|-q!Twrzwe!06Y6c}M{`AfaPk1$6?ec@jcspJmT;+o zQ=36#$$%R$VqP^i72P$MUdQYmW*#YZVu`-hoTz-ztdB6Kr0ME$wT|!$sFmA>6YTQg z*K}gcQsoQdoO!T|(TeTubJ36PBgfIqzQk^VMeY}jAn(8yVLgVfKnPiEZ=d)5$>kb) zNUcCO-Ri=f1)?z!r&#maBmY`7C*}$Fma0N~fu}mpyz3;`D}7?)BBKuKTuYW+j;_+& z(#j)~$PhiJV*}~RnRgblQ^d9IZs8uO4EY#kW0@^Nu!xcexW`I=!~{S%X-St2oNWdk z@5Hv8NGY=bcN$rd=;y@oxK+fFtTr=irhq~{Ni#HX$hL@FVv;hlr1=3H=Eie&Xg zU>cfzh2R1W?WcaNoSzzEft19K(*1=q3@OZm9l%q;zlwcd(oG)t-uCzA@b=?!lax2J zJyQWUdX&TJ_3(f6h_>qKt7KZ5tz){l+VKNX;v~mjbDuxWVmp!Z;AO)YuzSJ4G@|f# zyp_1awktmeZZ7}|a>*^=22%vWFB`1%f9S8m9C#C@W*TbFu=CTp-pJzZ&=J3*j%t2T zjz!G-ApD~xSw3;jk3i}IWozIAQ2`fJW~I#CB>lAdghd0mGis&}b&%?2pN=KDQp?uh zPd$eNbGX9q1lnpxwx?wOH9S`JG3-2raOF-}eyCE# zAled?59=_c9YtNGlfWtAJcDRuy!7urGF#pGCBy>seWk7qFr`qRy!46kzy9GV;NFwA zj2NyK38>8|ff@I8y;T=hejk=IXc9PyM{=Jeo~LwPaWa?r&;s8j0s(6E+k`8TsX8wS z%N;}W5?`)!Wr8!bo>I-|K-v2cre%&V4O#B~(m49wmY?tasnYi99j&Yrt88fUeF^+=8n{DhoZ#Y%1IfCwSzb&2TT~cFi!+-hJlTR!BZ%;n|x#Pdw z4XpEsQdTOtG|M+FvQ;Qs=7+<7$t*ebQ3A|9oJ;W!0Q~Zo%=2~+xEr93f`X5gL%VtY z4T3Lo+=3#2khy-Da>%5Vx$^v*cf-Fy%S2Q*dO2{_yp|w?CW#7g+({O}-pS!%=jq8= z2Z7#P@Aj5`g@Wcv=F6H8@ItPV{PS z0ZxwbQrI_JI0X+RU6^G#Nvaz(z)ZeOAx%M?o@T4=!uUW)vb>-=SVly3Bg4y#tzCrD zDve~8S&Z<_u?6rDZ%>^m%t+O$t2B+#O97S@2qRO-<)>OdVtMj z_Iv%kldrpHzpa65;x3^LfQ#EVx z_`r*o7Fy)XdHFyg7|F0?mPzD7>*Oo(39!42>#m{AljE+Tnq(De9;ejfNrrbg4#B*T zc(hm#Z~zbUG+83{q%ZCy_fiJx%Du;t=%Keyl9gHn=UmC*jUFH)n|Tx`CY=ZC*3?zh zHpzYYbc=H;-Dm&ZZjKU`E_h7G)bn>nE!wS9h2mwj=kB6Vj0 zzQ8`Gj9I2_$8w?cwVqrb9owLo+Sp6DljV^D1u8Ew28P`CD{E_qO*2b}2nx1XU~1>9 zB3oEDf#)X1initGk}VH-H(lm-=apRz($8>lNfqBnLs^I7#fm~jO|rCQkB3VlcyEo0!$M?BvWY_j)kl1MXl$> zDQ`6TOUzCp>EVVZ)+S~a2@aVS+1y4mXk`~-eyY*nF5q%Ks+%SczM&ePN5wMZx-_0b z^PSC*26O3ll0`T@7AJ-ahh7!gaypfQyF8x7kj24LoV!gJY@~Q%X3^NHP1xj=7bs zM=9^RUJyy8Uu9Rze&paQEaxPO6XX_yytXxsRy8HH%ln!ZAhVR4xhWuvLkp+x<`-g# z01k&&-MHl3kI6DIK?I0B7Z|G&^wTV!k79IAHo9*L=rUIJA;X>f8(9==NMh{+ zA9*gh6f~~q{B4@v<_r%$K0R|=u^n{l>ojC-M^Z7U4rh+)SOeEo{ zqPE-2OLmD$c2L}ap(){50fq9fbVCqQzVNQ_!}I%zY392wkx9O$>pz_DmE>#e+&Nl0 zy!3LI(;dRh_p@p=&QEL4L1G>f1pnLGTzgQRcWY&i*^hnT(KMPH3BCwm)m6<234QuJPjR5>C~Jaa*WVNXLD>&dqj8*}?2d zy`-Mic!``@Wz8@ey#hNrf5ka18y)mTuwsp8P@>Ojisy9wntoxnRy*?t8+1uqL9Csf zc-m(jG}@HdyEsY$=SXj2=IJhBF{W8O)o=#4z3CU}bTe>l1pW z^&$mRe&2->N72u5jjH5e3an}pKv)!M72DATd0IgNIpXxZD|?tG{&4ETRb<{yANHay zkwY6SZZzYV2&gLBYMF~~NZ|*29o@baazzd(wg4nKLfHUhZ&0oTa$nV2C5ms1bByTe zds-UQn{{RbF_1x`9JN_%y{l{t2T3$V zSHB>TQG%vaJd(5x4X{=v^s0o5*6?`IhS$I`fzN=}0sf2?s2};f-j>hnZo(tUsu83h zm-FJUT*(WCumyQzO$z~t z3)zwKWXY<;0pnv0%GcN9yfdC+0+!PZwB+A) zus2SCy9?oQ?bB-3K`cz~CGO5`0@9AvLU0b@3&K&i`#f;cK)m1i~EN^;t;hMcAZX=HFo z30I_MR_IIrDnxG9zwGG}u%>aif)aErcY>Z!fg$aKe^NH`u4ou@^t?YnvyqCDkTh(G z`(I`Rb|*)}5O*FX20Ws7CCF8#Hjo~HGA!-+KmMC|Ev!?9@_vz;Yk%0>=*8h_7PS#> zb4YK1xE&IGAi+3i&DXA9{wiLe4nYA(Gm|azO95V%zOZ5jefX?<+~v%+3bYLRKsus* zLA`61Bm8SHB8p1`%!T-G%6gl`3Qvwlkoa>(*xRr_XVF54<@7CP>)!-?5D>(aD5d*0jc9`=sAee|Rs=pCjY z2Y8V$BhsD+p6R{2i0Na)YKjgRj(r+=8IwIME5*CD@Rj3%X8_=V_1oJzz zgmQyWMBw89MCJefKh1t;(0SVFcXztSgWf<*$LU$`c&~SQ*oE2HqtWB$&3E81LPds2 zp6ET{jIZH}{a9(XqQm8%|K7YfJ2`%~OLFy)7vv#ND1n%M_9)hpp$gvco9f`??5Hy^Tfyn_KsX=xyn`=XAK$dE zk8XC&HGc7;h>OJDG#VX1(-HiQK1D4mnCxxq*n{Z4in{4(HQ;J63h;042>z~4IaF+S|H)rD-s z8zEB^WU4No!VLBmv_xZ-xg-MaEfEYY|T@p zF(0T$xv!vV;Odm*8&ofsMA;PW!Zq(9m=e;Z`=v2CVomB6^eZ&=&wFNzHVpuW`L+?jaojZD%vI&D(u;HCykz}HP<&<*}HUxLGrt`D%S<#&KKLjZJwR|NBbxjEzn ziODA7ls_;EFhR=a8V5&PW)piA@!9_i^R&%#^c0-kmMgMrct9a z5|tShW=k@egIS|G29+-ljHucrAx5Rz;E{l%P%Fch zv~N`~g=n|~m}BrN?-4W{DX|uO5KC$i9s$(@K95go?iWzGJEUcIM6VLC41ovL=u?DF zL0WoGC0bA%N7*ExD)$7=OmPY-c2LyFJD`4dK;z1HTQm`!Jr(>2Pb2x7vX49i1)Wtu z5oVm453wUXp^O$Nv}mFQc%ZRuTA%&42CliXjPxchc42$+OGTx?idBymkjYIbyt`{Q z_EYQ9>d6M6yetG?_ucZ5tuNrj-sn-32{9M7JW)Q0wlNv@ieBq*%XN3!fY456mNUVA zVY+P>sZAXki{xy{B~LVl4(t+)&L^?Z(H3c?v<6j*BxIi1g^idqHc3di1Glv}QZB6k$(6hYWhGAz zH-46#2{U*K&k>&fhfSKtM@?gkQTu^siX!@n0H&up(belROo2<-!g=Ni3u5GsPj{^Y z&?{p2&LW9MT-QgR$SnReCSXLEUAH3PBJ2UUmL@aO6i~=%+dVox>DSKpqvWIt21zOFe;CQ4RoY#eGnl3u;4u z=AM>bY;TujaqHOpC&PIe?RNVCLEhjyXgi?DfZ;%Y=#=&>9#+)QQMDm>gLH;(iz1?U z!txU}=NqSHtT~;^8HoqI}A&TM=*;F*mNgFJH|D48-qj7#CsyP(O4 z2{q_0c*ngzU_ywO@IFW|=VuNI2B(Q;Jb$_Mi_cq}+`!Q%2sgJF5#_;O9Ar%NF0e6g z1I}^2=iUF*z{?6;$9er$s^l-+J8o19*WuVRInAREokIkX(8=M_M@rv^D9r+3s@fj_ zJE!9YEs(I|l7qM(njN8bt#_i*3}Mcw9H1RO5!GePdz$)ncNg+%HUjPG?8yp0qq5eW zolquH&K#YcLY}!5ZD$`t8LnWp)}oZuEq1kMHRE#Ed4uG^=z&#l)_Yrz11uXhLbdJr zQ-R6(h}iN&@IUFyiia&hT-X6E52#l=a6Pd_tCSjnY(0R|1Yqar8lps^+w*@OJ^u8w z3jWJuz=Zk8|MdO;?-%9>*AhLbu(lo#hL_Wv!l{T5uyj}*Q()r5W5T?)L&Kf8g1ZxY zD*vJZV)`^6&s6dC`4p`rXdi z-k0XA`_=Q_S$E&GWK=B16P%j$tQ-fpPafZ;&3do9;cn&u{k~I9S>wx zdVM`AJ=y@LM(pjM5me3hhXvyF*U(-@S8=M4gM3^vo`=l@=pOGN;V---g%$l+#Eudi z=r-&%g(1fXS>x1jk%AlGKbei|YdLl=@VA?r4TRa%bp|*eF){0?y5q1#q+%(xh`+r} zi)Ad6y>yOwR&|qw^Mf|Epf9*aGFjk$61t>(IrOX+NJo>wFcR%{1PpPJ zN4m7S(iEJI?=-cQ^Ev)cs7QuC2P|O*c1?w+IynNf+ zYZj0ujQw2O+f`xQ-o{9PJ4$^g{K^u7OWlg#W)m`)>WdYTKqOGN;dlc^<8elpNhSe- z$DT%67K7Imc}-X;r_9z1*ClXHGG>o3?Wm#a{y+t6K4J4=8ZA(M4sBs(RyI45Tu3!t z-AqaqV|#nsBd?r_)aWU3`?V{c4=VkqYr2Cw@n@DT%LvYAXgKWF>5=-L`q|%jyGHan z-S1V>ovr~~)3^NSux6PtfkXDX7kiSj!!&)x%T>3$`7*n*tDLX!NcDokqE=a?6b_Nd z={ZUyqp+Nu0PYJcUnpxVcX6IC(VFS7F3=-!Z_1GHe!m>A^l?Mw!DPLYRC0V=T7saFc z74v9!;M~cjTK*g&EfHz+3DnJvECL55BAH?ULZ2!5zzHD3wHG^(z*PI_k zztgHli?d$9i^c^~zc|U=HRn!;9!??rcpv@KzK)MUU-k)Cj1uvD-B*oOk0TmfQ*1l__Pjm$QH$F{d#{|8vnPxv9+QNE&)`&0LSu43CPc0)_eJRBVY-TvVr9ssl#;|_SF5nQ3JOioedm z9ui;c$wKbO=*NxpLk<@!bj;Ev1|hP%8}NSakLo?NNuYWJ;;`290pwbN(?hN{_rJtw z=TSf}Q@+}`DMn+z3ZnuS&KeWJ-%Bgwr?~ifX9z0*d`hpp+YuCicN%D{SD!9-5GfDS z1Km_g1jdudBAVAN2wLmFysIs_^>w*_jGpD1u0znO0{?7pOBkYa2yw69qCD62+!YIq2Ul0*x?3Z!OXqut%mkp3Ur-Q%%&g{` z@V;8X>azJmjfe<7!U(-Bj8JU=>8#5!=rAT+_SD-#lO(3=1u-G8xr(ke3a~@8FPdi7Qsn~yeU;sc z<+`6W!MOn>h@9<9_8;b9j-bxw`Pm_5JS!()#tv$lP^eY|Wy{=z0|o*w@HrSiHfr?H0ttjOjITv?uq&xT-=} z)tdl#ODKz1)#z!O-=)iJZdZ~7-wcp^Q9lD_dA-3KAYk!=B6Nmd7?m>ZtP8C{v6zVh zz~9;1gJ$kj0py$eFIOVLO`?+L{yn3At((gCNB_EIm%Jqo z*z!%w+1?)(18m*sTNKW2U0=hZ-Q3h+V{vIA*HL}###e`obyZpZ14nccP{??+Ly!-Y z4Jr*C>muN=5W)xdw4D!GoOA`8J0O-nE5NM#CY9DClz!icT62bqf@=W!Uyq`BH08SZ z{wQ0{3{?pD7c-A8g(ODv5>#&%jVxnesIT!5=V|!#gv$UC7YHXhi$<>mU`4S1u`DRc zMY!BzDCC}dz*La|hbfimJV5>NTVB#0_fv=vh~Y&A#1c!`Du|N;Iolsd3N5&LU`m~~ zrqKAsR7TpXZ5cN+o^e)}lR*6T~q1K>cpjIyyEKfnudgq81#)~QG_ zIcM!us2nR-t&3y~8>J%M4g3}{JGtZ~nP^-<^@190D9!|5Rqha9Zr}?npVIJajJ6+~ zaYa5`D@hd3$WJ`fRn+_5KN@ot8kd#1c5;Nan86vy2_`7krS8k;!M%2H2DmeRsqxuw z8V6^Osz3j>ad7sy`tx5m+U<5@kQNbDx{1K-nsY4SS6m}cykxr0bi9Z*8qXaVxZ2Q~ zG?8+$v7Q`j@%XV?y`|Acpksh_SC(qIvy0?A6A>a-@B)NNpl6JCqZYNu;x~Sh_5AwW z-ao+a#{}B)2kfk}M$8{dM$R8hzle%uZvN2tL(Bh9|99;V{@;JVFFrJXFz4_wAh~-f zpZSIhwts8>VE)(t^(VKE^vlQr|9HhD!4ZO(kZ;6nLGNJ+iQc&t8^#0Gj~7fdF%(Wk|8`0p@i|2ys-^IW6Db0&*he1*B@4bN`Q!1F5qt z($=XD(H(>f1t)DG?A_~j_hIu4PJolBbJ%-!Om#usz}Tv3 zo{rqm4riVxe{uT&HPPMBHiL24acH9HbIr;z0trvcEaFF?;<*$YBe$N874MZ~O0ZpS zD@w-r1iST}H60$ns<@c7`3TROI7eduTF{oCm&$-EqNRg0Zn%-E*eDeschMF;I8%VG zk=!W~TY;^Oip!7H!?)M}uE*#Oy&zMV%Qn79`-@`IG96-BBQR% z%oS4OiHoHB&FL8=EFg#b;Q4-6u*@h>9e|@@JarT={GI-Pq|ue+u*I6CQ{e%U?ia-}2~ z3D6=VGZ%^jA05Vki1mpceRu4{Exh$sVNQ6}(AoGu~psnO` zh=$p6QD9$v?3l4EXfCAh`EAvwr|Q!rfCTR0M3i}r6HIcxLU<*NOd{wEp0ko`fFI3L zJhvFx!Z9kE%b2`H<-%12w7HCOC41t{(vpes%NBhiDET~CH{X2iM@fMxU%JrwxKh`7 znx$7jzDnV5^1g;sC<7APJ6toKI23>>^tgbhC@!1F6w^&oaMY2l_Ux>)*FAWCXu99@ z1~pZkoslnY?{ni?DN)rYim9N)QISam2x;zRb{K3BweTFS4w#Rdl)3GA0H2t_Wi)?< zusYX-7y7j|ud`@jmJ6!Nip<19 z;f8KHk5-~K+U=lX(W#maj`6_nCx-fZ)OswfyuJipbg5?`S_91B%`9ik&{PZbxtkg+ z`I4r64qga<+@dbfXOQ(9*z_Mqd8vkAV(rj;^QzOUG%)W#Kob$c#0CB3GPYw1H1qa8f zS>nUUixr@pVTw$e*tR)}R<{nV3G;^~Hcn9>a8L@l{d{`3jUiLN3^SW1@mNvrk`7>aGhyR1`6x;_s?s*k(VV~=EYLB0V*dSK{_8*efB)}) z-N1hL=JWIl!azHOj(x@Z8oTdRWWIQJwm zZ1!Qe4xp%S;8_u&W$JUo3`KHg{tBt2wY$uQ#qfR-nAic&i4A@Tfu+kJb$EFlN z2Vvase{mlHDK!HaG^l>z#5CuyR|sU{r3*5L{HMGcKnW3iUI{qvz{cq)-x;Fdhz=my9P2se71Y z)b>TNWH+t3^mGL*(9Vm?WgbUlVZ;7g0Q`O&X`2Rg?Z5xaKm4uP-d62-yM^q-Pqw!~ zu>TgYR>jBwvjXXNXd7sY0#22wMW3aZ70Y@2`{jCCURnS;acpTRIhrf0$5~)(rf6nO z-W?DVvXCb>BgP*_+g@NrNID73QQ606cbs^;0pKMMCxGQi`{?zkoP9ei&vP(uU0}MI^z|5^6*Ju9HG3 z2mUt|G)^ROK>T$Ho>24*tvYhkfN8#02MY9AQt7|JGT(-<$wSXKL@2c8tI3pc$W3*%&i> z9B066HfTLB$mzNZCbT6=y9>I8?n2r@ZhdOf$ae-GhF&s9MjtO$dvvjq(jH=%^4Hqn z0*F^JPC735){r}EcNC2-tz73I=sg(po%O``H$)E4Ug?{coAgNG9Jz=F`gUZo8Vx}e zDP7SEo6X`m1zf;tR9>4GCuhGoI6QeF0I1!UW$i`fP^h+)?yGuM>hG`lCmXjEmGsx& zMuXawTYNwSs#Y%HRmmkENHkEJ^I3RcG?YF*Xc-;UAY66A3^{c|N(&G*ZP%cv1DY{gOZ^UIIECNEn)>^;eRvA;h?&-iceo zSD_4CwHYx9-`Q@HRNXhf6Gv=U?u>T61lnf3W)7r!GY=iO%=!eL2##FA@-P89n|Gsh znepFgM-sJ7z3G87U)G7elVg|7U-6cbv4i^78;cactJC6yZRaahnUbCq5ql8UdKgL2 zoWhv!Nir5EBj3C2c%6$*Z7LDZmN`<2J2dWy_L%w3M8+ zE_OCs)V(kpvM4DgQl-=ohzFUS8LKl$17fB#JWSCjwGi&{?iKajmv)`k2$C-su6 zRpjM^Wcsg_#`jO?_X7Nu`TLUn{$X?X<;fNf^SS^S_u|4ehxeHGruPn~_e0Tq*R=Z1 zbl*y%4%6wqc)!&vtt6e+6*q*eS3UniU3J6cU8KF~OnC@Y2=Q(@Ctrt3&A|%KkCh8Q zOyz=#Vvpk@B|AwiBUz&nrwRZ3`M;;YOc%;2nYKVBJXeteVK-6C-{fr5#ph$8LqcRw zD9OJ^0R{3DrgL+0+zn>h@j}B%a&5GcD8^7|d^(Ya1oZs{qN6a0$2w*2n{m=fM;u>GVef z=q{HYmv>6Y^>kYfMF7`BP!n~S-BnSQS_OZ}7RqbMA!PeEXABZuZyj`1gLOzT1dw+G%;3q^LQVgU|GiAQ7pHNbL0-(^0O@TYoO1y(0faq?q?=&KW50+oX$wLIwx}*kFc1hv62HF;gAVrl3uB^3%@GOsozh%E5-hr~OtVV^FO@oob@j_OdLE^ltQhZr&Qd}29(+FV}?`?T-ao~8`7 zCg7j%7Hfk*{ikE%ON1GxArsvvg`&X+ zfsnc56knr^-yvnl#Bw@0n$P_<@=(I+gE31zh9ji0(WkP39&)3uYTqW3P}bxqDg>Y0 zXdJ;Ih2|2zL18nY3>L|Ozl(bo(>*|}oV>u9?`6eLSOR5J8AgT+9OD;0c+3crdPAJD zwZUCRGxq>gW>4!=aM)O2gUaj}5(nm_@ey8Rk+{mPH}2OnOFWqviL^ww0KtM5mP1JG zVUb1iJa+78pcXx+lj%ba2&ln$&N7VJudIyl8!k13%8bzEL6|yp`9!}b`Znf8i+JQG zMp{l$4+o%dg=4L^B@E$5A$h2oiGIiIM7i$qw+&&gsscG71mkH}uA(5H2D$G|zM` zg(E>}E_28u=5FcG1==lfgnFKUs<_`L!Kh43`Mrh8Qi= zCHu+ZiMJEZ>@3C90gUp}7rB@27OG~h17#kbhRv@L#e`wI(e*v2Iwsh2UL0t>%e%&L zx>+ZX1JK;=HJ~^}?lV^;^rUSDQ0j~>;yp3J-2td=M@WNfhJ}%+I$uYk;KumV3Mx9o zAHgA!lM0T#gV@>K&eS^|KrKxz(i{WBmpjFFFql)(x~i!|AuHr3iU$6<6W-L-z+%&wm~X4eX*>;3sk_bTk9 z$o^1oScg}@QjJ+12kBeRQ#~cAs?X!{z7N7hx_*p;6CWx-QWa~x1_!wBg8`rf{` zN()p1Magg9AnQm#>&~yAG6|?&hPNjFtX;!FPRb!-D%nRDen2i7bU29$m_(Apcsx$*Yf$^HzEmO4 zhr`xl9B#K@e-IG8)f<4;p(Of#yZl_aNNcy}y|_s4)LS0R=>7`KSS)N43fMb!nPTI* zms$&@%`=#4m2-avQ<#F$Wl9m~``8FHUq1}BX{{E07i!bnjisLqwdozk4`xT4_RKzs ztiRr$*9-C;#Bpcc{s8js!9E1ewQhd^4#xQiPN6zoxQ1W==)j(3(c6lwM zE2#wUg&jp6xzjyLJ32ev0|vTydf8go40jaB4@zk$oa*ftb_jR@ZbE=*QtLf(q0ToUhjccg*&egTd(z{GYyW51 zEG7-xL3IY{3>4CqozE1KM^v$9zFJzKNmT81j=nl=nxn4ht!}zmBj}QJj6%N`kfCu`&m@j*U?Jv{yjS{ zGOC-x%|AojbLX32@+Qrxd}INAL^x#e+x(a6c1nlvHy$!H(uHYQWPpVr?LA!*OK9X+ z*sOo3?lfAr4xv3z@7+CLZ#3MwAT=`xa{LDVBTDW$d;5~u1B=Lb1Tuda0)Hq$c3D6u zyKy#J#sx*Mkkebba1bpMNUBO~7D)|WX7e~9R^edYqG_bw+=uT$IVptZVZ*R9*^gr_ zH7lMP`*dokxdvX=;3j#em@me^j0tP-dAV+V0%#_ zJDeKX$}kPF5ajkP+2yw|;A$!E+tHHAOr1Ep-|lbAoOG7OrFqo;6vyyaF9vXgo%Vda zU08ybW}=eI+60I{kKBBsN*KXK3mYTC0>KK*QqN_3v_$gY!C@cOPgamK&&oOpdv(wq zcoDUBcRtEiT(l)0M176oi2mj+Uu-@f^f*SAJyi4mDtB8TM-tiPtvEF@$ ztNQQ8?{J;Nm+o0jg^SgcYKLKvmHQMkaE$h3{vet(5?xJPAkC(mV(`0_udS|=bXjN6D_O^@n z`fZ)<tN!{AM(BD+#Px$QyXwLHT*+Pa7~Y%Rb-it&8D8s^ zQByXD+pK}R-Bri@;PkF#5&p>P`V-`TsKJfS|F94+ zI4bE>OXfsDzXX;Ho_FA)uY3`->`w43)ru5(dz4=>^d*#&cwgM+{ff9L{fRq@btmeO zT8rtzBf1xuOE3q2PIxyZL>k&sh~c)Gn^V7`Du^`C5GVnS2RL{MsoHPGO%D<0z(|&k z)^Cz7vlf;+iXp&2Bp?sj6=9bN0{${vVA`ky)1Vg#I4>tiKYvBVV_bKG-~Whh^8;bq z$Z9)#5ZMHvkSyn#{!tc9=&lC1at=AQLj7_#?o9+mt+tfeae;XM6qCm*Juw3OctRwSD^RQVaQ!^$eH0V9ELt( zdGfiLE{l7!5~Di-u@-S)dXKw7b1}7SY6hUG!0p6u%5Pv++I&JwhCC0f4x|o1BDTAR zG?K5v7ZZTVaRThZCRcrBvt<&+BUf=s)egkT7FF&^m|ucfX^y}D2= zc2kd`JB#1gF{^YQ)vc699hZWPy5>!>%gCWJrsjH{L^rvt4l z90vOqT;z5>!s1%S;=X0rAxASF!2;TvPBgwnZnpMQlVaHWEOr;;C9GOWcGXgLGO5P;CBNEj~sDvB5W__@bCyv zAk=TOUCd?06Xk#X?|(EezU&N?DL+na&RMO8N92ZGWN20r^olDl!f_^^bj8oG? z%wC)4Uu+;iFVdwzBYnrk;VC=NA6%IK5RjJwT#L<$ji%Xv;6q$UN{s1%;*RDxj2=r6 z59LISB))YV!)WwsngM@GQ{lNb9r!mM?P!zDRz{AN>S*jdMie<30h$57{tsqlqb$gV zgk(JH85R&~nI>Y@Znrlm`Bm=#LQR1|eR=Xi4XTKeSGSJq%4WmB3-mh8#+-@SG%&rd zc*z!*S%h{WF4r=*<-rZ$TLj4ynZ+_$Kw$*MCy_vVHe?E#2yk-m;H zWHUi+^sx2FB!FJM$kGWx9!H5O;vzu`5r^)ya^zgz#75+TYdOd4_=11GxoHw{Mzu}Y zvE=@PgB9vl<|D*BV%4w*rXo!3DHX7AR9qFAz&)q5?_CE1lr_Ts;drv^M$_A1En(Xb zsqtVha89@rmcVfGP-rk6?L+98F<97u0ciRT1agC7wP?Qvi$|qw*t?ib0Euh35w>0C zyVFvEOgu$0r^l_&Xx-&7q~sg2Ql)&1DVN5a4C83)ycQ$#gFF5m$1n)gYZ^-+o-wd} zLx?yCR9b1mi|@MHO+2t^m#BhR2D(mNl5?EmF0LntCdK`*V^xoeWlZRpSHdW|RuYWZ zK@UeZuB?|5a?TTs7|9aAsI~GmxnejzA-Gqz7U@xyHsGTr6{0c&i8a#{@i!WcjYErf zX)K*2&Y|)PZPTNR(Zk2;T~*}Of_n~h7wn335?GxO#EvMiAaogiYtvfn`8JDG;u*XM z(HKJCOLUoUfpTu4at8I=glp%lHBaNLX%;c;g%<2~9$6IE-2(qmE64oO zI4_#e7bu$;wc_~|Sm#r?h&DZqRtvyG=Qe|O+$ClUIn{h45arB^7Tu+yY}GWsi@y7g zQI_MJ-X7bl6hi4+pf(^9N2}kOE&--00-T_63Rg24-2{F~(p8kSkXL#hr*mvZ&Y`XR z5>QJQ7G!PSG9lCUiAUeI9)Ld_O%0)V5b06z!7yyWQ!&X!RNV~b6b z15ZNU8iDxX+i)@!9ADp>Ml;(2mcQ0z3WG-zueDr2H!Tf>1}=%q)CJ;GbDc=yiKQq;94y0SuFx87tL#8$=GE9f;;=*xjwQN;KWqJ(tO$S6b0-^!J$z8?y_|p= zY0&C4+blyAmrXqYd7ZyvbV$V_M#@$W6k<;U6OMX|bcF1&+UQX)u7Ck`11@$OJ+?jR z7k6Oi#8waaw4kG)AFkn5Cr2}eTk+k&D&xXt5=@d>HVwy*#%I6iH08INkJ$ecZl zcVC*H){OCjm^;;F+4VeGgg;{Ut)hNHY|mY@@g>lZ&`KzSV(JzcaKi{haU3nGELU3^ zy77TQ|A(uUp!)qSjrRC}Z4!EmOyI3ESztSUpy^-fn|b)fp_t8tgFwaxUtP(1X`;IY z9T$?VW3mMUGt}r9!zP z1p$R*$1SL)UjU#hbo4>B=8a}UH-p!*M&taJn-*O$Fn`Va+Wz;$c@Iiv)z>) zzRqUXo`sh+)nIhx=kAFDHY)B424v}WPfn{Sc|~YjtHg54UKN92oP(kb6{^-*6dk%t z%e{n#x{R|-jf*Ov{XY)X%uAn>U)C*L;p3_e(#&Xa=7bQza(_uF=sulTrJa1M@%p|E zF=X)$x*QVZ7$e>CVfE`ffg(3P98%=Qj|Fe2=IQ4PYxwK+u!bMuH}8Pod@Jb3^SyFL z?8^!mGUjhh|)+Qs>Cg%Q{dwXQ+M~O4YaZD3Cq^;0({dwUqnINM3vg;}%`xKU(sW6B=u>dJ(dt?kPCLsP{cDVaOo^U|f9y4_vuoY*k;@KG zbEjFsn3R|?gz?!v2;(AaoO*I1J4U%Yx}rTps)jO%TeO|SoO!hmtLgK%;$705tqW8t zO8VOuq(}jp3euCIABY-FF0dW(!R`2I2gA?;zguw`&CO>Ra>HZ+_~)-p@E~M~Pi=u3 zMGVeKEQz>amrK{JO~{nj`PxAubxqXzBi81}|NW@>pGZYkoBc_&5-o<7U7rPdJOAIK z&!0Rh=YKwV{P5w&{LddN|1(_IavrEql$6;>2y+97tQm#)1804DIs5=QpB2%4%iK?7 z4hdezp2@q{_%C|%=Ff?(Z$AL1^5ZdEXx9BzZ{Qgh9)zi?7Ym=OdVjvhAp87YIjt9z z2*EfI?~>E18mPCl2)&GH68|NIoIoMo#x4^>bv4Vx#x@s=D#ls2|>WxCWn~e#CFAnvlx9h@5|p;xnq|q)3n^Tf zUa4l09=tu3Qf^D{n@LHBfdrJ5#BYCs>cnEpY=t8ia2!2ODVV2{HoJWl|nN zg6?G$;CIlF{DzT|&kvSGDSPA~&hmoK-bUl;Z9BE;hKXLXG>1w>h;Rc5n!s~Ga}a>+ z`5>a1kk8@z8lxNaquqz}Aj=t9NaRpsY{XzQ!3=l%;Ak=%7z9c-Mf_>7pBBq7(>p` z3vqSVE37KPfDhiE*@cbhWun^zac?x9rOs@rC9c+c%x^q65QcD|5|N+FxuQX!6zMa8 za>`I>{h5SMu@q&2K)CdHn6fn^btOxVpNCEvPU(%?FGMxyx}`s6QM_SZRO~ z81fO0igpVvUUw?Xp(U><9ap5)lQrOAbaQtb&v~c3u?x_E{LU?g^@ohubYwy9eH|(R z_1t=a2q?@Hr9DV|aJdQiSZjhVI5U*>p^t~xR-F%w{e>4Nzf@GOl@|KSAwUXI7Z4 z>RLW%qL+>GZLOp|M)UkNBn*+m$U-Q44C!y|wxHA^cpi|b;U1lhKYFHrD9^N=7njRC z2K3*NfuaPcNia~8z|T_65dr~28_QX#+*RbE>~6h`;RZOj*;Ipnju_A6 zXJEj>kioD#ZH_LE=d82ybZ2j8U)uj*UOT6o_)^V@<+v+hghh%`FPWL99}KCMuO6}| zvF)q4+t{oBA`7@ z5*LtY3<>|QVw=^TqF|D5Z=ZAh*Xrf=_9v7GkE7`w^LWhG5ugoRGOqUn9^W7T)ogDM zdPiMAodv)2Ue`SB?EQuY`Nw}P4f4`v7RLuD%rwL}|HSnQ+>Q|fZPGIIu%Zu#3&W-h z>?Ou^BFccS?R;gwyFH=dp`XYFl^s)$TEA+WKF9&5JVUXI>;A(=W6N^}(Xqtz(6;V? z@*BB{d&7G9!97FfGu~^UX!Jp&@w~eADeJ7=IKu`4M*!Y5$hYqr_B)bTji8t9_q&L? z@kd3C>_E<2|7+oo4mB2}!{P8mH6V$!Aj^t=zwJT?*E4Jy_Jx}ba4=^nVh1@9#^MT0 zOB|KH`7zV#=am1YX^J1W1lcs6Pj_^vw`6I@1pH%Swe)Z|+AM?L{ zkpC$#GFmK zzze4j>E(paaJ^hm1_u9J$Hd_m4^~08fX4pbr9=WdH=CVJw`e-l_3nS~=vsJ6vilm8CBgNlm5K4Bx+DBlOj)gz z%{pJLn;K4f^<*&ZM&tTAo?Hm%F^lpA&T)Qo)9BGunLM3Y)oKRU7H~n}VZEr?2)m8z zYx@R5euW)hxHm6Ue=cCJls|oQ!+Bf5)cM&$2Pfe9&BwwE&2U!v&OsKnB7UH{`EQ#S7AWW4R-mP-Z)u*sZa1#4cdC+bbAv81w~0~x-XgmJ zep;ztD6^ZSla_gYONVx09u`?Vi?S8TPMW0C)rEL1Z*GDwlj-5)0M6z8)NcqqQn|(q zRtww5fZNVrMOP91XVaXnz|Yq-&(fwjTLQ)qAUS=3?R)8h4?voYTc1fZi<3A)>;=s7 zRb?7yHX0R8^EG66cjnV&5@k(uY~K{^-{lMxMePHZ95}RG^ST+#Hsi0w^GOyt;0d#J zn&!ncv;D6Qo8~B;Pt*OUO>?xue{=h=gi3flwixdr0GQZxD-z8%a|PGP_+y;&B6g8m zme}SnfDYXZGNpj{uecJgBQlO4(_n6{@-|^VtkUIXh9~?4(nN=xl7>B&&9k#_7fHIJ zZ5Ik09A8Pg9E%&WH20ks{igZaW+MO~Ig4VjM%0||(a~IfYajS|vnH~E+AOho-ZY8} zl%`XW+c_>fEfT`ko@U6ZjB_w&BT%?GWUMXlU1#GK8dS#d*T5@~Z6U=5TZ?GLB-H^C zVbj5kd4XySkia@Puw7c~%&OE|m#LdCV_Ja9VMFBu2tR>$vwCwyl4BnV65nJ62pO=4 zNn_w1X23a>NLE9^Zh3NLer1vGladf|l~>O`FFZG^`>gd9&ek=<7O zItG9CnVrRNnx=nclfwQcE@U>y{69*EVB|%MMY$Q=<^X&gU)d&Xu(W9ok|kd5f+jkr zy`86!A~YXYyOI}w)yKCpl)3{5F-}%Z(_b!7H-t^?9rmEgIw`jUzq>Qfy<)b~Q4&v@ zQey%lE;x1D+Xu@eY2mb$TN^xvSsA}h(=l}JX%ZLTISm$eXy4|qinKB}UASdrAgF_A znZ^DcNv3}OO$Zn%CMo;EdJ}jeV2(1cqnz_r3G@s%|MPD`0$!kn&3Q_`>?980L z=uk2Jl(C|y6-gU+q+pze?>v|%V*6LUF@WJJzL=&W*sE$80v9SZv1>N!EPRkb( zo`Jgsw*uQOHtyZ#FpU$NQFG2w$*ss;NKvUE%#+*YuTrL@BhPyYG@P{ITZ(wafK zs7~>L%0-;Txpq)Z2xvK0O^j_3#mOym%kL81$qhhnAaiqWi{&Cb#hpOkGOMN5M74Wk z1@FjdHjU;CpL)+`cp}Z%n*tgX_dcy;c7*;MbiU;zigu3RSpd_t)C=)h+cD80_7*1V z%TjPohF*)SI5;^;RGRLhwF?%5J_Fqq|0o*U(miI!+oo_8P_Ta6v(~o!=+xJ|-!Nxd;UrqwOyl|yuyV+_EmLsD zNgV1c-T76VrNp`tPRCkn+8nS}=TUqKe3n)mw#lb%jS6w zUV+~)`yd=f(lq6#mTjgLIGB?-vj(< z1n?O%_AiVC5q&uAM~z23ALS7>c}QTOn%6c-S~Z6nk^RYC8i0wtHUy7TPw+9R)9W07 zR5SsT7ETw8_d=y&`}vxpgL?^mBfppTbg2wyiH(E@QCq5=USk?!FiB4#^MB3`fO}7n zpxS4)HC)C?5%wkvyaa6=!Tc3uKg9*TI$Tnn0UH0&&|Id_FH~TdpAAu`bYezJQd+2r zhbiE_L(92MCe^vFo81X)-*K|ia|$w9l}B9lDMn0j)TlGk7}Gr?4+~l1M3F1g@2+{pQ! zf%bNHB?#?lf<>aD^A*tCFzC=bHC+!-q3#VW)z!b zW2lFeF~OI-SJ3>@oIx;jW~u+;9Y*C$srMIn#8U6Y(CV|HMK9&_>xGzK7r}8&Z<3`n zAWMl}1Kl^iAg3}6P@7Klk{s&J$4D<0^fPq~U#^uuay)T2GnVPlsua%>l@PEVt=bL0-T$LEUG`J} z8Y-w7jXuLxkP`1bafHiKkS^keqG*B*_ldIhBL+;!4r zVu(I*o%KP-U%!OL@!CPw5BLG`I79~EFSfTEYfE2SLLyO(lf(VKKD?ecN)@v$(P%aZ zi$f2+|5r!U8@k5Uw2ViQl@pY>yHkR8USsZv|M1f`mF8M1l2f!2sG@rljEvXk8SD~u z#)k=&hv`NlDJuJeA?=NwUs6{b^$-D}-!p$fpzs0l86(?ls<@KEl+&F{qUyuAUzn}c z&iug!)z7aW$izt|EMHtW>;v&W=uYp<(_MnCPqTO$JI;{X-}DP|x*23(yyY_7l~cfo z+Lh?F_>9$3g!yZ0*27EnpU3R)ZK|{sDG3$l{zSK@;ha4KuDVMB?Kz}bR8o|7Z_82Q zvQ5pZ?&AW`B4UM~o_3G-Azgm|WbgS=_js_|XuPN^>ux$LP1$aaiJ_cg<9Sz=pUJCJ z4)9ZIx8!{9HX2l3QwbfAQRXXeH5da|@dWV-Y-jI24o*ku&h@^|KEo!U@Y&_65ih$P z^Vq0-g%pcBwz?7AEPYy;!E3$dc=U~HL4ks5PUiqrw0 zz!O$9SId}jvdW;gwAd6IbE}HJ`@Jx0%_Z)i>|^c@q|ZaHJf-~Uo2{Ek9EzVme5E&? z6Bj^jyr7zgn!684?;Ljhx|_S!7jOC`GrnKBid8TG?&UDzR^z<%p;RbX?H+?TiUoR&9(`DK8OY%XQcZ(5x zq6F7~74pMX3;+GK6Oby5Fcmd(ZUr(O0{>%{M;VwpUbMg>cp;vKK;Es(=Q zNJ52R-TY4UVFp(GNq`Tl?U3`X!ZlKRLo>;`n`Hn=ESr|O=wOT(TZRD<2;x<+N#6=v z*bAQO)4JVx3&6#E<(opsooWtGyu6Ak-1mwD52N9#Man@V8F! zh431ToaXRO+-R3bOz(naPL9AiU%Ql$vW{S$!E(ZCsu^^by0=6c9^mmEN;8WK)!I~M zhe3svn1p8v916M>o@durcb1gFh3kaAX)aSxLU4*nMlBK>qH3)`3_G`;(SBFezYxJ@ zaT(?I!=aYAV4*doQ`(%;mo_K^0kqKeHvVQFtv%Yew;QxNyXM=9nT595x29#z=S#R5 zztnS%2?`ih1E9uU2T(ow12|yM_94=RUOL}7;Tayg#rpPI+fMkMf)fV@Uv@EbJIyf0 zaOD@2T{p6b{;+8`8Ulxhe^w=^esLu80iW>33+z>(6l|R1_SW5kqjWi=gFY0xmu>UB zh;bqE<&c~Oc}|G1z7TE**n)Hz!|PNH1PA3J%5$QyLL83&pS`!+jU!po1n=`Hyja*n zDmRlVNu^RZff*r1rX+Up?=UIpR1*Xh%=9Fq6d92xB9c@dLAL`8_RQ>{8<>m59PD1q z#b7bO-0sypOuxYHBP{IC-8>>PNlL8WR^3z;Gs44v%+1ZsKKl&ne8uQQp`Xc(Esj+5 zk@=61S4? zOz{e9kA;`QWA(rFcW-m?F<+a*{vTg$ANIFQ*JR_;re+cs;COENf`%LBm}-G~8mcT0 zRq#pcYuq2i#R?y)8nBme2A%=WbK~s>=+X$)Xu&Xw#|G-N&hOQ$xyX|^sf-PH?N1x! zQe!0EE)B@M)f4kpou6x)d5oLpUcjdELvMG77r?CXthn_-WF^o8{g~zSnx3Dxe)8Vd zCriEN`qnTdZ~dI`^8hheUt;q&2`2JoI@6pQEb7Hvzi`Lh`90#;mD&Y^+~oRaS&5Tn zM(#2G*;#g^YH=v69qc6gF(%XKCazV83un1IByVsY2y3MLCP?Uj|66J;k zr(p?TXj)g-b(6DH>W{j0+gc~U2E)1=7Y!o^MF_5QD(FjH;Ljj`zlo6SWog%~Brb&< zZM6k&n6IU>v~rU^uQ-Ca2DQNM4O-CzKd6+9+bfj*<%^*M_7uJ;O&7==O+Ynt*7)T!ItkIoW}&_Q2S@t59)gmMX-mMxVMYDvWu&W^0omvIUfSpDPIop9z!|iikU9CK28vm#cDcQ?IYD zzl8!9Z?7q_2+v`HNx_*b)VtEz$9yp-SBedDEJl{;n&@jqtyPuM)1kw0DY6`ct8^+IWV zy*JJA54O0!mqCMvSXpVq9E*SG1ZxX%VmM@xNy#1m)xvGZ;>06#A-M=$GK1L!@l+sQ zn@XS4h9j?yb2Xs?Ti`{8XeFeBv9ij_D8Xk7$;%s|LBQfdNx6+u;=Me)n*y&7XLZ+C z|3*g4L9_Q#(Qyx^lU_V?p#{=RNpXdiqT94MvF|r6$ ze`sOW@o0`3mzLmL=qVm&YCAhU?9&ap<~jU9!_^_q!O{h#fim!DL)EGYgRWeHHkP<3 zqpoXq9K{Kx1xoV^j64k`F0)!ckN1#l9Asbz+D$h!%OI%FIwWbcs#&$z^!{ zBxWE3(!3uGkbhD_21pe!Xf$S4+X>OdUSG#Ym!-*F?H<8}{sdKLl#^7V1f!~+SE#}} ztT$8lW25)^uBy$bfrZXfHO?g=kA5X?un?4Rodncqoc77Yt^&<95>5hXs zEsYU3@mVo9vW}$RCW;Ok%|kG0LMt|IW!BY=Xu5Ek!;An%XDSdRj^!N6xW(^1^9obA z{YJ{xeEH{R<9~kGg(TFj@(bmoDp+bZgiGY2GC<4mf8RcQ^tg)u`}Xm7Prl&)ekuGP zt!5SXhnPL`h3EFdrUix!=~*+(<8%pkxxzkNv{9qFoJ{-*gzAakGYQ@(BX+08u4w@;?3F&fIa*+1mJa@ zOB@4V_`mOn|C^J|&B)p*Zt^f~ljnb8p`OntGJcP4a+-eO_`U;Jg+tuf*h+)x5$a*4_mZSej}$3dJ#Md67D1;&d^pAbBiPh&U?inq!iijWLE_^MfB z#R$+?J1#mdIkaQWa&$IiIXHvvF-7=D=tr@}5MPp2IaD|4niG6tBS0mefyYX@aBDKZ z0|#&KMPGBwh9kj4kkIkf*K35|H!@q1E{8aUDNT+Z@CK~^OQRv%;ndh_M0!2kJx(>C8RHGkK?l8-XLYq_;eTOAT9Eo()$~&l|AHXp*i(;0h(qa5%ZKVOkKt4 z9**3cW*y&i> zc5|jOZ1w8cIy8)IRswL`MAGn8l#pt;isnMsP2yenDVAcknn)ZnsrhEV;;_8JSQAXk zE}MF-9dxpiqLUL0o8?|nK!s?nVb016J5lEz3iu18uExWd{IHPa!HsPoIAaBxB*Wk$ znoj2{NRZ2ab$7qxcUCSCCpgGBHOD|Hg^YA3D@-OrMys7DyKR<{KtpS8@mHgZ=&M!!4c}9zaAL`aKD23+ z$CY9}Y-*muJic-xIj>CBe9L*U~ z1{P1vRwg%ll%$ov|NHg7|6j}uq7YWS#-ayW1~mN;U|n6ZPLr%Co?@uQjtsNb7t|O~ znsXyBF)9p27W|Y5$2WxEI4KM`5AZo^;05?bq7lU^^(dym^PiRooZ+7#?Fg>qBFB%{ z!RAS^)^-L4K3X(e!f6!~nD;2QwL=X`o5DNlBp~W}YJv}ejn>K_tE?;O5TyiEw1VVDIV;eOR`HFigs>GvJZjX z_u;b*bGX0VF%~L|LOnOp@mu(c=7Z>!;UGUu`TBv zo#F>Lf=l2^+<^bExlr!D7crdqoGrwk3?^{$42Id%nmv1-!Q`SvPRhT) zA4cA6FE1$7&?yiLFr}5F3yY1w4tN1xdPHT=riUVd$eZl$TO^ya!j5OjQxwJB*9QR7 zc;m$+rlHs}F0o88JoN%q4PZ9ZMjGWdnh0?XJ@*=2jjfj7|1^$aZV9UAZXU2vudc_Jy|Cnu|;&rF<#HC;u)n1Umh8@9{u;DC3z9mZgT>J zvR4r3&%UuU=c}&mQD2x`Egi%E>nCfa$?C;e>88c4`cgfMnyuZeL!O&ujqf@$%j~l? zR%_lFZQdsHrrYAiopQz<&7XUHU?3ciVrE`b9G;)6eHR|4&9ZC+v=JR`H`UVV?!G>_ zS8I^W16Q|UX|uF%&D!%BJX>#TjDI(m^w@%yG~Mmp@m~`COZzS!RMw%wlUbQlSrn%VZo!lJ>tBk`q{}2Uz}>K9D!jrk zNs{?w8A;}=Mq5URBr9-1tXb;MdTij?BFlw+!ByZMChQmZ>YzcZq=ZZ@Gk5(8Z&dUm z9$=1QGUY3Q9htS=*9RRw`8#}6-}~ixENM?6q7m=-HMc6GAf_`aYg)PWJDx|LpvJhh z++r8a+u#1`6aH}iQh$@eiAXG2)_Aet)x+0b_-J_*wt)@;kKJ%?>$-RJbGRyL2RD6R z?Hl-cb#t}#h28Sj?3P>myS?o_2*VDxxB3*u2GQLfi>nKBdF9eCH$}5{VWXtH7)H76 zfNq8BM#r3Im+&8?e7BqKl8G(KETtl|4M$mTG?I^H`J7O@mk>OOCl;!m;YztXfUa^J z%|>yxz(Ub*3lfv?C!_Y%svpnXXiCkxAAWxJ&M)xXpB4XGG3|n=Vg(UN0{Z8f?NWk7 zNcedh{O_ZO-#&TJfdBpG3;y@#_{ZZevG7!c7fJTh{CQ>tjKT-*^JoZ8Pfu8Q3rr<) zw>g~O=3$>ecLCrJJ;JQK&uuz`t1(y!UEqNmW2kWm5{SYKa5XC>wDEqM+rNtE<0i2L=Jv>o-I9V!H%3!%|!rcPkB~=DR3&Kt-^Tl{Y zxP`4a??OoZ;1i z65Mf}Q=6X?hDs_=6%sD>1J|YNDlo>JO;?wa93f!KMb%@ZP)xxO^3g7xXG;~K)bOEAL0P6>p{oo>nUgO=lUp>d7NfCZ@ zBFAZo7gc+m&V;zUg*Pl?N#fFtzzKEbSQF|~`ItIkFbwZS8o?zngMv~=`7N`$*(ZNd)84mKU011pe5xPpFY2&Q8ko<<`FgB&hX&H@qUh`jXIQGcvR znOj^YW-iKVIWu`C#C+Rb#n96)F4e>Bd`R1g;XI9$3)ItM09C` zj-^$Zd&#`jB0wo+fwQ^|v=mN+t!bd4)V_6R%*Z1{Jemb3; zhNzUF$J>Y(F`Q4MddoWhMBuEXG|?!JU}4a)7mopERYL!zlNc^QQb$&sG!Po@F(Y9? z<5s&|SUUkJoeke%H}^7dHvt6#9@a3eOi3b@P00#6N5;x?o0bWBfhSWp$D@o%382_4 z$H4LLau@JbZym5;6l|`+W^ebPf7mgD_`SiRweZoGk*l^H?lF=5V@K|nSTHQ_t4QL> z2IxWTCT=lb+?IA3!}6z@z+hs?0Z$lHjBqKh*Wk4D)#2T^)cYwm@VM#yFlOxUgTD1{fShDEP=!Wvh_2wrf^E z(F|ufW^Qy*8d>s@%GgQ1fS@I}hzMwpUD5|DYZ9%MD#%t^^CF7-G)~j(l9XVEy^Dq= zpnR~68|-M0e|0eY6C9TZRNAT8g7zJn8_oSgAzyFt^-3CQxMBsThZyJ^blPDn@T_(r zxRUE!9aROEK${j`B4Euh4}h2RERPd#&X%AZz+OT4YLl&p0C7fl>$my`wo)Idx}-oubkopn|4?dPdQ?>wDOc@1!#nOKrJ+_T;XgGxhOnU zxGGF4gkO@Fch*c!J350BO_=`s(vtTTWln7W+#m=-W)p3>_zYb^ zCo7f3LajIh%q1jn;5xl%C`$d6832Gao>;Z%gKbGUL|~l`txCj`>nROm&Y zcRaY=8yAh#e{R95Bo1g^01B%XCEPyCB3!xSqKw|z3yiRyIC2|FCWD^V;O<4K=bmwM zZtWa?O_uHoZKpHBe#Al+;_$r^9YICPQL(3$X+X{P>l!iBSDuMlke^F`j7i&0x~9lAw9(a?p(>t&3qc6LVpsTz35Tb`JdOa6F5Y z!L-v2CO*GFoH;wss607H$ca=e<{KXDc6@!yn@#L(lcO76>G^cDEjeEBHKyys5)>#i z3MfTQm3&^FXm~TEOnHkrWDa|_+?6HjeZwbT^+S)zHXCDfD&w8`A}Xi^N1P6UJ?Si& zOHeevv|quM?ovalFtuqMrDcRfM0_{QA-%^O%N0q^8A7g8udl2_`P8pV@2%`~ z>CSq0Zd2#&Xt(R$Q|T>nyz!u#2h?s8JslwUXjz2HMHa`?Mk^4o3N6zE`4H!pYN$2GXkt^X_8 z$&o{+ZA-&ySNlYf%3%g>kEMPIHdcJ2hg$Qt+b^=x#N}7+%+d)d_3o}yYg>v#it`(3 zsJQWtC9&A`|HPS0Xl*twl9M!4#<;%(`%HX=kj;b@KY90|BiV_Fx21*Akaxnf+(z%% zk5xD~2x;`H5hHH76Y&ix55cCgDX5*^@Lif+C3bY~jLhm~k6Y?{ufEr>*alRASFmSo zr$Ss4F`NgCsL)DYGLw8GsDG5VH7W#(L9PL=Py*#A+@^Pt3&{*T3A{avgm%Lm1AB?7 zyQV0YQ~P|AgnWRr!W^Ui2|ZK*c7?(ja3W)OhqDBsQOW@f`LS?;iA%By@f^Yz)ObhPI-8!(gFVh|aUsY+t_vkLExE4R?IXg=(KHoA@FFQ-l^G-9 zZXmB9I(lAVm2sAh>%CN9J2!uB2^C%fLMJqcic_qjiSgSsP`LoPF}kE575mr)eu%DL zbq?(mh-7i(5h^C)_!Drpyl#2M%qre7Ah-VK&Q8D^2Nq=)O>M$}rnlVV<2P?JGAXfuDqkSQA z9jJM$SQY{DhxaajH3K5>(_=W?@j}FumlzX1IdzWlm?E+0akd_709G!%F69w`2=bh= zE8yiL<<$ZO9?i;_0D+562EgCOfM~;gbm|>mL$?P`PN|9!V%E^()UP<~R-6|Vm`@3z5~AL+2Erc3bI0J^7HHe2G3U_!cfNA#m*_ z=CA9=AJOBl3LT9!(_~hVH^m(XfhUFd#2f4?Y;3pLnDPiZi5g-%i%p{av%=<=9By82 z88LyB@`8aao1@j2s57}iMO z_olmb7%8uu^3?#}SIShT6K>0k?GeXdyqxSYNA?7HxMiDz#$nfL5Y*s%nZ7!mRo8LR z0g3MpyrdG(vsbCE=i6t7ORENcHjxYh-rZzQfowgp-1$iGy+~ilCrM$aC$wqkRt*_gJ1Ih51#K zkNA4;4nO`f6{Dj8I(M~-j>#G=#9q-ooLuyj>4m zH}I3cRr=pfTDat=&i}UoHdl$4n;D#0?$J}XP^Z$+2I7NS+5$OEpgWM!X&=>AbM9doyWpnK$OsRXJaJBrx@TfHP~v=7 zm7~}npD2x>Gu>f42$brZ1xi)9A~11#!Ex(Bb0?L-KdcPC=~m(G5PuJJiAU52FyqzT z!yG?H8(of?*zzO^QNoDKB(a4QGKftZhf|Wt!j6j?ceBK4qU>xZwz_N_-jWsB1TswV zNy5p=uBjj}xEJMwWoxxgAxSqcO)7sf#7lf8=q_9qXt}qoad27cE*xDU$`}d#5N~D2 zmZXnt;j|&xhD#8xpx}y&82Btv`HjG0#xgS8uJeZ#j$vt;V7XCf;gXAlRs`*KZ#$eQ z1ymy$@oopeebN_Nhe`rW{3<#(BA_&EpD;>5)0EJGHcg?WibfWxey`htCsM+^Xr(i(7^i>gX~3clFcwsJxJ3tz#&ms27@l7_4gcex`M<}8Cl+*wS)ddQ)$FbDGR(}CZT zI_PnzH-V)GDUX@+>clo+rLC?cK~{XmB^O%bGOKDq0QjjdYUzwxD0H&CIHK<*=h2SFO{1PhnI zjn7h9j2013NU@Cr9_DaXl-cAIU7x2>lBM=E$q1?XQH}9KYOhY+_mDurlphJLE;W5atmkzE^Rii7-eh@3*|5-SgblbgqA6Y<7MH)9vL|0Rl-Mj< zUju`%s};tK>RpPzIr=%+Wr4H>_a9e53|6mNT?LoKZ0eWkP6LJcUhMaFpx#0j?m|R6 z=nYRj2qcE{C5`$K}&2 zvNTj<`NTpgI3b4_sy56F9ZCR&^RXcj4;EF`+sua-acLQ<87oIVJ4@oCd} zoT{H|S@QUymNCzp^-!u};0OyB@}bJ2!LVuF8t*Z*KhGlIr}hpUABWjkAs%Hs0i3nwr*Z9Vb;;h|BkE~_&d$4F54YPb zV+_(lm|;`^hE>h5Ywd)ddP9{UGAHcte8ePL9XQt&l<$Qldk8&fq7%LA zzR2XAN2SGTNN_FVj-9lCDjT9GDw=TD9Y73&Czb0s7?7Kv6Q8i+glcDJ*Rcmv%BTN> z-q=c(hS4;V6izQh7gA@(i4)=pGnAYqVuC#oQeu#qZ(*k1*t71lJi98?L~Y7<=hseE z%2y3NM-*3uT+=Q(i;?IbDf&-Zt;g_DywPvp-@ok#_or60U+sHnl4tG#?$=4H_1!um zdCs~$Nb)Ui`%RIWhEI-cV$W&aWq42IW6Ypx@A7-o2qL^T5l1swGxT9!w1DMpmrk|; zoopy^{3p;l1A;h5smG#0JuY|Y8&^ckRak(O1S|zr5J3!Mn>k=t1VYG%D-{B0wf+w0 zCLY;gl%rGUb{mt<7-Y%hsbSu5MY$8FGvxh`&WWms4HV6|{hgkqz8v#>tjRHV59iDM zs?S~ZP)+R%Mk<^;Ot0dW*w9$CSLIZEOPHVC&4a)I>G(rV;n6y#cd*R~StLMB zhcTn!A^ntRkw2v?*%h{&O<~fUsaQCUCYCN$07o}Ncwhf@q$kE|?h3pa<{yx^L3M_C8eO)(Hx)m#6!yL2iJGyV*(|?=* z-G;tC! zIK`@4(udGZdQ(4Ny7klLCJkM8a8%EVZcR}y`pUs92hFvCY1w7d!0`i(n$%wv+-444 zk(@3>pOB^&>YVD$qj~=;JXz4vf%A3XVBrP{)SBS2;Q!|RkYEqd_T{Wmnw>FvH~3SC z7^aka>WwPW@b|t*160#B`v=I7+iGpa1vu6=VDfQ7OqB9BCe}3H#m734~~wR z)f{6?Q3RLh4%H4<9&G;6N>6l5j5`6CYg#pMWZ=<`S1`maZb$-{<3!@gKR&cF?KoY$ zQBKyr{`)RVQy1pD%S&*N9BS;1r+~-i{_ep}ABA>r|ES+;q0qf~+20F`RMV0-%#q_( zMsE<-0|A#zI7*mFzCi{t1aLR5w>U!cHTVhtn;HBtIO^{T#O%IoM= zQ+83t<*c+tWqNLnOKHY`OjP{xLD%6YnUkW6HE%01a4am>%mIB3{^P;pM^*gC<8PjP z_XYp)3*kR-C98-JF1Sf(0j?s5M<0^PaAc1&EF*r%U zM80o{>R{e}d{G`;@M3@tAPBQOxd_l4jImoSn5&V^zZ=*@70*Bd`3eP6()#8#NW)Jf zz6(IjVyj?fZ){T%5hhek>kF#kXF@f|{y?rOJMyJ}u*`i?daQGn-wf0c8Q5E$5ZrJ| z&|8eUktqEdpbdqmixiftItada7bg&-q>i~n6oxiX*%Sqm;7Tkg{8TTHKf5a~+iI72 zN177h-n3t`S$Sh51XjSo*fAUsSP7VKZ?4)cq_7q`S;uc%_O+FbVR%LvqhLuL?`fWa zgnDGZ^VSg2nq%g7i8t)gh=5^35H2dEoO)1E03!H`(*Je8>22NwMKPP;N!%r4p6pKy zk1>90DQ058)TxjrMJLDd{ryk>(-%plSQvDgURl1m1~eWQjEGJ~*%A8riUD^S|rsS_zu)#c1aP78xFTk&N)>S)M&IP;i# z6(#XGXH?gA;Z8h>!E-6wMozhl%%cNUDjpwW*t-lk_)mvpZQ~kPG`OY!DVb)-*(ovG8Foey#ykU4#Jo4qQo~Sd(WXmh?55| zvg+&yB!NX;QK6T>;_oF>S5)htSFI;xcNItots72e4F5mQ@^zQm=RWOtCo?tEMKIM@ z7Rb?yEP>RUkO9vVwgE|a;Yy&3i%EV(pXXEl4wRy0VmygQ&3wSQRRU(hxyr%U2FbenD2uZ=tWF$jR_VoKu9CF<0EF0L2DXQ z`5<;M#~mP5TH_oKYp`lA<2*~bnzNLzdS5!S*sP2%0X={pdKyr@#yN2%Aj{wZOGe+r zGpLuutxe|{LrNBIVMitlwlXn67V@<@IXh~6vlhCDkuTcA!iq}l!qhn_ct~{#HLog> z9_p%j#Pi5-VBI4{ZVXBSc>ks11A05)=s*rpjt{QzyeOfmQoB0NV+zkkuw}6GwD`DD z>BC@qRkyZdUS1XS<|vwD_n$H}1DTzfhYz(K=*BozoXu`>%Y4pEpwW6QZTolX%YMTT|CP;-B4g0@CRMIgzrstr6B)3U#CmNli z_8d*(v}1}HW+IXbMq*nS5A1?QMX@5Ciqmm2^BT~>dtjzU*%UqP(^)>eKs=SQ=&JqT zjBBLp^t`<4e4|78si$ylDq##0Du3c42snqk(X@Wka}H3gW|$&FtNUP+j$=x1chn*_ zP{8f>etMQgIaZ+nvNbJ$T*$$1Zj?sm3C*o}RYd2u`a!x^`0MB>ns>{rJBsE{If_TS zlTy6tn>KZ?qw4z$HGwC`Q|8x5&$|H9@Sg*mEF9rj5E+((V;rarXJwocVX91TZMVLO zl6SCM#U#5x9yHeYNPxh*RqhLl;gdYI*Kgs~=py=Rl{3vrgkA<5?J`SLA=uv)kQOh? z4I~JP3_V`=7I5HV;3}(xiga8k6l#aj9^`f^3f4PyRW3OI-JDfPuhnDm>WkDLtqh^6 z{XxSi=x)l(YQcvp1)3TJXaCI_LtU_Uzh^ii3ClJs3WP$Tw?gf|Rtrh7+!g3k8+NhH z?-s>2{gUwS-tfaR^KkjHv_nB_)C|6cizL_m3GR}N_l2-jfyIharUe4M>gp4DE^jnA zvFz;BW0P;-@MKsg&M^z{UaD0tYP@{jB*Y1= zkt@U-&#K4;Ld`CtBp$hYZcvLhjF74xe(=uO#&{@`xi7ltazqpz8^5l=>353*r@!3* zKf5Jxm0Xe8pDF5ptBCXQrsB=S22N@*=;P2SfRtvA5~Eh-SLkTHWb!nebbP?ti6FLt zQb(mImfNhU_?wSRK z2~iopAE?muCsc*+n&)+)xkjxmjo3Rk*R7qcLWlCsh6akvEHJT7;C{k9eJqd7YdOLK zUbv!iiaM(hJqQIYCxZf1@p}9;0hFa|y>{#9rK^;T$KwRGr? zMUw^p%_0-N{PXMJ|9~QQUBtRqLfcSvXx^pURI#}F_jUM>hYz9FcZmOZ^yJ$|U+^El z2>zq8u2mdJ4}K)h?n?xW;ZvdxQA|Dw)NvE}`&6iGfQb zScp!5l%V!8#aC(KcJPQ^wN;3qDzD=sNsferQvLmb$34(g6T!rVtr--!Khb*%wcZrEfx!Vz z4#NdMv-3>i`B1K@Va;lIhFw4>kY>7WSa%0pK;i~W(?Wv=C=ILUjF(*0e;%zMj#EjF zB`!}ogv7LQp?8{RDy8j~jgD~50YH*jm+KCx4~YI04(0^J2(I4u553(TH(_x~FaY0o zDbrNjwXkk;Wf5RIINGQ*Z$CJ@>?4rA?{f5*@1U-qdiBZK0UM9zk%k0PAmve=%S8HK zaQYd3R>rV~f%uY-xqCMlfb&}D_I`?9YZ8fkV*0Rjw3fKepi!90vsvG4v{ri3D*m=% zK73I2{l|~Kq}IqKCQYJpcwvj`_AvkQU;Y{PGt3=%9@+Im-otlB}Jf|x~x#> zAQ7jXa}2Ls6Fqa8fh)hdfYI&q*%W~-sL5F&RjKUz@=N^X_n2UL_o0@EC>KMMKy5gM z4VO(E8k~0+Wnu3EbGb)>5-;v5hj8g&<(qZwipP-FRZhtU=q{~n!Qkh+!BU;24nL>G z9S!znEcBCdOsGi#bzTpis9jNuqb!YI>;~r5qFax?4!kNnXJ6(C)4dG=9j840iZRcT z2N)~5-PKXvY!|rhHCXmy5?9w&XHf?C74&Ms9)+?Y&Pw?bMEITl<2<9@#}Or6VY^)B z)xVW%e2M@6@pn(E{NIlrJbLutH}3zxRbs6qi`^%x`C*iFaa;ZL!Te#2KeXybX5ZcO{moYcbS4H8A!>rzoPm(AI&c5Myy-tPgFbx89QObC zYWuLiWx6typr2&j6(u4uO_9xVp_2XQznM3O+edx!QSBX>?cLq})^_ixzw?8x8Fa%` zC?##xgeYYu1DqFpyRaPp$N%;J{y+b_yEwrWr(!>{mAzno8YBH`SZ*C&9rkw2LGS3O zf4Da=y}jPf4}v-W%`3iwrnz%%&>y_bI7a9rNv-Fx&=|8p~XcpOSt> z(G2lbB9PhXGpy8U{*77r@If>!Rqy=x5h@9H4HO(d1K_?LQQOSwCiqiYFx4Wu_bV;p z-)`5U%hkHwzIx;3H=u7MfDZ1PK#k(uSj;M;dH-Sm)uB1+4Zh!KwKlVq05Cz}g@qmB z?Sh}O6ClTm3(C(7yGgN}kpEXoJu|~deKjcPw_rC6`hR@Y-`nhORMNkiPbp6Ejf+-m zfH-pOaX2iWqb;!sN)bc+?O4{P-M+=@wA*weLH^^)MB3^E9OH4HCE5A>KBd}HY4HUk zl46KRfr8%Hu=Sv06p$+OXk@$Dc#ITt)YoYqr$eYKU+@L9C?)%c?ghgrVHQbFh^P3J z{B0Pdp|nE&G_v0{@w;M9AK2k6mu9Cn$Es&o7cdxbRu3a*l z-_|8o?a!r>TIh}JHbc{_>Ia*;f^(|Bt0(qlmdAg|QYc7!S-`nNX@t-y7z%3q81*`f zk|-St8NtvMFN1r*IgvPR#RZjY1HU-&1vY_P9ZV7CKF{E=#wMRdv8f@0k0dX|NyGP33&j+g%XkwjvOdZy5V zaS;0{GWru-V5yQjzUDB|gJ$c(4fv#WI>0||nB!N6J5mU>w&Sr&&p_)PxTB_Z+;k#+ z!q=)NmKF&;O!e634X=9QZ3ZWv`s8*)36W16qnw=!7f~Mg%#{OuwCEdKHD&dQ(lJf4 zxwGs&wQ2BSln?*l=X|v(cTDULhQ81>}a#>cc>h>~ILuijHm%}hf#-a0y|Ja}Y(y#V!kKb6G#LSxh3F(G=I9s!8w^Qp@wpxZq<}ZG zBx$1lLf_CPW&JD-O-ZQ>JA#R8A|R~XSLA;16!Pv=SkrWwH4|c7l^i`XnK_cYpgqTJ zjUiF%+a0))Ep&`*kHMj&uJ01MSONH(}0;r&~s8Q~l4ws^pSiyE{i6^~Bl&a3WS@ZCnAdgyh> z?U1R$FGa(5D&(uE4yC6QK+m}+%B#*F08Qb2kO<1Ee}F@$-ftzXFX(kPrsf*Tyk%uJ zM27sD59_ec9`Mj3t?q1raE*epn%FoA0dU;{fLZvYYkm_crRIYPEPZh6EXvu4E?CZw z=}|{bQm*gF_R%CzSrsNS@7$aNk`?4l(6bZFGLQV!%|fGj-Tq_|20?-`4WK9>L$fudabD66l0b9W-K8fM5$C`uFYo*iCI=)}mRNb>s9$f`UWg+-x$96Pw?w zr!u~n#UoE^w@A?3{yobr1BvTuM79r`S<)R=JW`5QEtW!(Tnl^J6ZI9oPSo59-=Ldk zP_a=rR?~Jp)hZWNviH(qYC>HLixQ(k$BS>kjw+78^+1n{mu5(jg#&IGySHBxNz;nT z;GQ2UjXA5=TP8$Owj&i0>tF{vnhw4Ru%tMkn-)bpe!(uQEQTaS?n&AK)GbcWL08ZU zc&Cq<+p=SRgj`3cvXc_bFwBG`(xjTZBhrIoZ-Ux)I5Y(F-&uB~nh-_nOnVKN3vTmt zwV=)|y_D#^2DPt=$Jip(sxEa)O);J68Boho>g6a~Hwr>TM{HiHoC^mC)(^^3J2E4x zM~(!tJa2AgIj`u-0?5d|pE9;>LS(1w7;0A&peSJ*cr_gXCKHHK&aBWzCyBX2S|m7g zc<;b?6pbwz3-8&vND0DdJjz7Gk}BaTHPtVY;UrXCScqI$kuV<=2x$r1q`o@CxO_N+ z%n;O*#QWCs!T)4e{*}`;J2MYv0bYi%g`B*m}}aavKp=(9s* z6c=cIan)QQMayS|v*Og(hMv~1ZP-(oC{)EkDy=FfO8||^XDg#%1X6AR^?`@3M>E5m zV)hAM%9?sszwlwtw@~HNM>d-1?z-C5$XS*ZMVA#!mH}_CDvOGFxTKyP z$Rp%5_m>&bL`jsM&%n%EW}}8Hw?VX~^dZ-xl#_Jy=v14%e#*Do=3oBZKbdy>D38z2 zAr0^%j|wP?jHT4Kn{PnwEt$mo44_x_E2#!LX7(vJk$ZE~Sr6(rss`>84vbwN ztG5(Rdhmn7$Up&NiOUOHH7m%>&No^seX3+n-z1v0$do+hHPrE>riy5OuM?CfreEU{ znS$@pv2A0texnAX1r#KOD)|nz?$ex|%<0gb*Cmj0?yMzBA&Ze;_A+~C-KU7RzW*M% z3(sAfqVqZb7+ea3dFE&wVE&kh)|G6}Cex^lNfN>m!_|VfNR@A|{MWb=Hh&Zy{@7z7 z#XXaY!AQy(!v^Q_B>$`DN<=Q#aWqTHpvZ9$J;6-4SsC`-^C^;oo|9u7f5atvKP3Y_ zo0ULIjYDt?@Y<%M4A0;-$yvT9WdxYNCY7*~8#124oZU(e#}1kaQ4B~9ycsJ)fuyYR zc9iP(J6LA|sM#~Xi%I9!$f18PFpIlf)zz$x;E*R(b8p>j&1&UkI|SX6=1_>Ryv8)< zNUf^=NPPT|i;G=a_XO82nOh1Pqp>A7itVvPRxrgEucxDqGn@EycKTBE6dDr_T62(R zlPS@xuMEg)P$xWIw56dbJxW2@2BXA9V_l?)B=;#9O!Dghig@FFlD_I$9 z1e-IQgUq2o{`Eceu#;vtzm`b?ljr0+LnJaIhd-!)YeubpcZP@^L}H*4`& zz_VuwqEo8)#B*+$lpZ?&^a<=Mj0aA_Z4U}+QMqL!g52Z#4_{Tbwz6Mj|ip8RY?!2T>?#p8PAJpSUqu_^+3Z z;>i~_ieC{MMd;#?ivW@iEc1NcAqRzaG2I2_#H(fc9B%*~SLeK-a4-9`nV?F}K|CnX z%3!9~K8$s<8g*!(n@1yvdfUKLKr}w0vBXZ&V8hB7QOTywn0U7ARsa;UqRb{X?>a0U z*Nocyqsn$Na=M|eZG)D{KiQjHeU^n z_ILY-W~;xsJ%F_%zJVK)LCA(zS90=5+M=oI^}k9&h=!@Tjtrua!W;HY!XJPi9FOr8b)t$((Pj($0Fo zfKh9rSWbg6k^4ErZqOKi>ANWT=1^%5~3R#BnRBU zHjg9SNPWK^NL^AlR#(k5C&~*ShC7eI1remWFQu%g&tsfoP1TU6;y{GO&w$&qeOKWL zLq&8`2N8&|zMxY!wkjGpeYO1m`eH5Kw<|Y#{cJXu6e^f(S%H(QH+#FbVt91R z_kn1`CH{)IOFTJy#|u>*yGlfp6dIMgQynZGQusliv!xPW77Y(ds9j_u$ROe9zU=>+ z42BYY0iFvimNh76BS0`U31=m*rpDPJU&Hvr`FU>73F2H}><*(l3A<%oj-xY)IQo?& zUdM?9;_R+4Ej7t4UaU22!@Zl70>-SG{@G$ z#iBSBU<&GI4OaH#sK-3u4U+<7OOL^#jLtC@&~E>679oVC=Q66W?R}U8Qs-lEK|zIK z04o&i3lv)*nrau-iH~hN>Wl`>tcv223A?}=hZPWJjfQjR*GI2W8>?V0Z0$1K@Nk!N z3*9>yD_VGVE+jK>?+kF6H_Y+(Zp{%fT-ymG(kG|t-J^J7lQ_lK;lDAjj>4_pzHn;+ zuW~dOgb8N~-gM0k{f|C(58mo~6|;-_3|@l}sr0fCEhIN3{8%$h1b^(g68TNpg=#MS zmbhjnrEGGwfP= zhet@=l#Lsh-$>w8T++3q1d1`S(#xFJ-R84lhvn9}XdRBS+3*4{qUz>xtp0kveu&RwU|;g@fK2SC2?Asx$iNTO zE0{v3_QzvY>tV9oMg-H$LvRCpf&)st@Ftc?KGiTVa$W z%8`41%FmN-O`^FSEo);K5jV@!_ce*;INWDBnp)XBO3Jx9E9F(-9fVhND*qxakdDsd zA&}yvMO?<0aXIJtp5otWatr;@Yo@tw&h0D0xIm@@Cb?@T`Z?g1;mJcgqEH>EF#r)r zDK2m2+Ng*vo(8B5DBlOLWae1@(`!7`5H%xYlcJK<0f5r?kwtg*m08zK5m@lpge*wY z*OM$g@0K>7_#BExbWin6z%?kE+`n9b$DL z3X|ooC@{ADz6{B=uD?w-acV8OTsHXsMoTW7YCH&v)XNm81;4_M)?Bq+aE5S=zKtsN~7%r1Z$Q>zEBT8pRA*;M;GCaPDOkS+^Hu zV#T_xFbChdjW`FNyP-f6kJe2^TGLs{oVzoTn8_Ta+UHPa)rqfsglw%z=f+VVQFzpv1$yy*aZt(}H}obC-y`cN}E&QAT#2kT;PzH5#|&?AP08b)KYMX$g&GwZ=uQ>6R;YDnW@vSa5u_S> zS$(nHf%5ZEn0@)@&iUUo{_|0{VCKI#J-@GkwiN=cD(v%y{BPfW^W8U9{}zM{qfB%~mcuU{b$w**T06!xVm zrc>&Oi&@{y@>%I2V&?z9|MRc^Nk&sFLaoZ7p|~>Hlci9Vy=Q~{omUt<-rF}v+q-?! z9~^D(_Kx}k(>1+qO@ji?a0?f$!i;C>D8eMT#8rbH-4FpviMQv-9Na$Nx4IjuiQO}epF^Yu)f;!ET0E3Pss21jbS`@c6!hD4|})}ko`9> zYdC&T8b=p=d7^x!n%W5bgBKYR&%1QZ+Dx&pr{~kZbS5!$FdfqycID(QY4@HJ^!yA9;qphGv@;J|s~XH-MmEQ@gEK6WU|9nXO$MimLAn z*P|{$un@8b%=X?<{{^iFP8h1Z)!wRGH=XkMd6a{$^@C4q{W|JFxFN{a_6dBF{wE20 zr3l$-QQvtmtv!Hg9#Cew^F>LnS~MKmX$fgCKT_aq5uwYy4r z@x%j&{h5$W@I(xOE_A#B^EBkWjv}9fsUgYFqanbqNvY`8 z7BE>$+i+#fqjSp0;?6Cez1o=E6oes%+)mj4CfdxMxm*B&_rz);EZytj#eKK;{r29A z24pi5=OY*-X|A(R)8YtBoCjkAL_8N8YLX>Z$tbDRlG{K6d)(<424$ z@rpRwR%g~yTfAbYvSO!h#pr$6N}IfuRKZ*%D#S*Fp_liY>KksSj~@|w>JWa1ZuNuC zxJhlC&`w>rNOn4+{PmXaIA5!lwW_<8rn|=*6FLKx8`ie6bQN|KUh0tH&=&R{2fePD zGI+qR4;n*yf%u7QCoG`#(6eNAAtri8I}3WtYPZ6<2pQh2iCf5Y#K^9osli1wr2{p{ zAcX=B=%`4+W#4Y^#X}2m)R)mECUkB_DRp3MbJT=m4zM`%w%dN2bn=2@=4=iHvA|6> z7aSuW%jUsGz3@^?SBztg4}=@Uq6hI=@c1h|dXHZKsuvsZM92@9Q4)`&&O17cuzGy# z%8dBuH^ahgwH`m*FufUMl$R1I_=BrHg8swsNAj`q-=SdK;^L5#cr;2ZK*glnHXY{k zX|;z?cdw9_7IpK{20r(PutZlYEZgT|L2FR4uOlV=I>wg6^?UMcSd_u{gD7DfH-}Ej zK7>7re#~GhyOn}ra;=jhkJUkZyJ4Q^Xa|qN(p(k(l@{3wkP8r{(K%%X>NU+K(=4r4 z(}I3-P($@_QCU66j-FxUHTY|#$B#E4?3PEKTICO_>K9cFENYXoeSdSyOyj8~fzO&dBE?(EFH#$J*BJYDbORHf-~b3uN-jWfESoi60gHvX?qqa87z?&0U1s%m?782 zJ$?0nPrsZ^q7*E9%Uos&+@{@?+*=)l=Wj|H^3QzyXplP`d>0t;VYki7wXewyeCKFz^OvT1 z#sD!6!(v7iqNm#J7q+B}<~DdmQHYwi<5RPiC7a{?J6PpiHYhSP9g(ju*E|r z3}*{Y$lZV)w!rr>x`@%^OR)Dw)=n{B$89C`7WmqHXEua34h=BJ;6Z66Pz%T{R_()4 z0>>_D(PD#{ZY?wVI3^vqmtZqhU5Z8uyL&*td9C7sPa9&3lKq6gu_(b$6pyl_Q(nN+ zczo*5Q+)bRiWj-2NQmR~{4~o?ncNT`?GYf6lr5jM1w3S@@sR9Zo?o=u_+A2!&usyp z=Bo?-8FnD2-q5WL)^{^1hUAgkR&y;u$OhM8a0y5dDWom`72LsWTTW~Q(R}13j*=pC zika-}4Kn??8E5gIK462s_QONG^i(VFHe?M^@7?)|CwY?8oL4d2fTo;2q$>wP1Qk(E z%hH3YnLXD;JHFN_KV-89iNW=oiCKG=WW#qADzMmG~} z?Qv5sN2Rf?ExD4YrZ7EW_w@lc;9ryb3n_nBrb|Sx;YRY|0|a+Zt82~2hq$~?qjXen zZpn4w!v`_sKe6e$iLX%qA3j9W_|qD0G`m}Pe$o%0*6dQ-_``=d`1#X5;X(V8DbNUM z;jOR*3THcsN0yJkyGLeKHdbF9XZdM($(CC>BsKcWMZhYLZC+$osvQDupMttNMP>i- zV`GKhP38Ir+N#E?ygDScFjBA~_+eeDGf6y``=T({m4&y^Unw;)5EJ~;=61Cp@_0;> zhhh?yO0alF9lI{On4_p6*I`w|6jM0SG`d2HPcW#^x+C6pz|k(^LF~E%bYa*60$B~A ziwc7xAgs_4=%)dD*cioFfa|pyj=!uVuBtE}*2G1gvL;M#Z*@UX2M?&bidQhyzdBj! zETYpKF^)F9pza7th%J7MLl0+3lm~&LUh$52tIbLeLkc`$+zcV)SeO2EDEclG#=E=_Q~SLDd;xTnXnP41lK>V}yPa&-~MFzdoN$L`W6aBZpn&(-5Zp*UDMp==%hQMeOdc79E zZUC)+!J*$8hyIfk7}jc06)##~3sI#7hL<7XDO67Zd^F|6^tQQ%L4fJq%79o{LqPcJ z49FqI`S(+_bATUKjY#Sb1wz#@$}gDR-`hU|-nEmA4kuSz@S38|w}Zwm#{WKe^5olx zRsPop4p`#M_y&LY|OsXHpOeQl%^4cs7!LyiJSv1HE zRZdj-^i+i`PHe%DFOQAjt?Iz9fm-D3IccAfN0`Z7L#l3(G@~RgQN3Kzj*3CScSJGC z9g3sP>mQjQ@On)-Xu3YJqn4$}LmOM3EHUZ7bzZA24 zn#YA5JvIIDI3C7I%^@`5(mv$^9hY3+JT0amgHO$7luT$Ff{5c^h@g_&<|=VdJ&COY zy!wT!(anjZ`JGZK7Chn)*l4Zj#g{e$#yAmx=2gM|8pz7mg3kpVCgem~D3jXBTKbJL}`QiDY@%AlekfF~Ay_{uwv z+0O)EoVX+|eOa1EfKWvxvl|cdtjkjiJA0OoqoD=v>JseinPx@wT`B+wN6Qkn0AG}4 z5tN2czrHNi@qcHG2O$b1`0L=EotE)1E+!aBfV^|m`tVyXeIHvaVcB!L%Ki8pns8`9 z7ItbfD&u18jKOCXh>c)U;K%JEOV~;F<{}2_wy}g^DucvBWdeL{&TBkYkTMV)kI{eX z8B=+07(Fwu{-j|BJD>=i*rOSPr-F7q;uLSu-!Q6Go5*R(v zk3GEEV~-X;<^eCS32NPNb`qQ?9#?fZ5xUS7ljX`>5{e1Ygg}Li=Mr8#w>6b|c@ zLk02xgl8**Q|TBAdxk~!2D8Z|$|1cU0fTiFbOH$#jsx{M%Pzi)bs7s#fm+>1Cw|FL zOnV?Q{>{30A+eOb1Y+4%Yb%pOaTrZYclCDPP(~gE%|$LrcAsK#ylC{}tSBe0`l~;w zzEc3D1{1>}l@6Ank81J%pP8(9xdZ2G)4c3RG04AE1=1BXZ>Xxda$b_ukSAdVFj6=odAvSO<8~!}mB7Ce zoZv0|Q(|ns`z(wNp}KQ_L2I(o+$FOPtsy^#H*W(+hTIu_n^Xtsw0 zmaOjn?$?E~(fQ0v-Eac;Ag3#1Zt5;1ik~6l^jS1~w*>4FPatw0B5sy0=(V^Hu79wo^DdD)N?rWI;GOT5fp->}Dh^RY z2O2)xY=(Gl$;zRF?<}@C>d>3527_Yg93nvP(BOs+J0=N;-dIq@wr&Z|`6-|{f{Q`t zM`g;P@{J_}HX}nM9y*|kuG4C3>%a?8_444`P^l!zG7RQS!qq@+5fh%7Bv9Y*)u*Ls zO0~KMsrtf?8ClBG_I(hIcv!TL${s2)xuD{oZ*lC6-oGH6N{;Mk$sE4*Y1Q$ky{tec) z>l4fseB?U*w;4^(l7>)eJ}U9ga=t&uH;c}!I7X4N^iP{{xl zWYO{WEuttb9Y^Kn;I#^wt+rZULt@Sad7optor{E>PNVW-!>lf~T5l+v_$8=jZw@`j z3EY{a$~}B1`0&ST<$1LQn(T%RfTn<*h!$I!&nDHjk~Vti}CW_pm#yugzA# zv7kN!bE=!ZPC`c6uux*+KaGnc{~N5soiy)OAo#?vxEu&8#3wXAEH1mShe#wHzXUc7 z`?uvmTqyB__%F5tVB=sXVm9AvCxc{TAN3E+i~ZitMyqwxeeDS@8g{txON$0DfusbM zAwvSMha;Du+ABn0PK9yj>$gLk!6oZeiZw|bDbFY1&}uNW!%x7UeL9k?0Y&zSoQ^ml zhZ*WVL^e=P5zYzR5q`*K1eDOL#oCGSWPj!=f`HS?@prVFBS;G5R^Vz44KZ~PQl^~& zJncNb1d2)nilzgf@JX4cMLAD|t_TZCMIBGU&ap~jgu1$bi2&9%7qU<7mB};2bwCH+ zSPnQ-v^&Ji0sXkoe8j4*jhJOZ52k}8^Wbf|EAs6| zAc8%qoN5O1qO?FtKBU&dQaQn#R{7ajxcemjkdEo9iN@(LnT@Q!tW}diz#pyrH`n6^ z8?>9NE-&gSCl}M&zx@0E`uKZuW{a|89(SL7kNg%L^Q8OWo9`Lq1XsU~dGJm5!Nc!C zfQL3uJLca$c>KNKQ2A~$x+m~K3i~ZpsA9oG$jeXBfA*b+rD3V!zAru->I+wufsAk3 z4f3C16mOPdmGWgMt)8o0Eu=N(2n~p)Z9w}2C;vW;-;v?-(WN`lxyhjui1`jMElE>e zq|;>HF&7!=u6XGCrK`RpnhR43gXCr79B6bkJDYb=d8_RaqR@aGo$%6VXdQMaj>#Y2=77GmLc}vLMeX*@PycqiMa#5d z-qtKWv=HC6T2u!Cul?a#jZj9%e0q)bs?vZbY^{h-2;}~6b1?Ny>+s%{I7m0Aq3^Un=@1LFEue#C~vXZ3d`0zeyulp~uY;?cp zwA1}f(n|MxQkjhO5jCdSy@((H+uDs&Yzra@U@qMscp|*}1K`257(K%wQ6B_r(Qg0C zzyGi1@%PXUoQvEoOiLfyB;jD!GP4g`dHj9%iE9MLWV-aPvnYvpKLvqJ-zL8QI-~5YjFj^TVJ*`nF0q||YaZ}q zfTu591H)Tq!bFC$@keG28}PA(++sK{wgT@yP`F@>t!&X~%U zO3+WxYED~t#THy5*a1ogE6s@BkodSpcrzwsu9rIco0#x{qP(K#$D*Km6I z0I@(XAJV@b`G^Jq&Lw-VRG&l!N&f@PMK(5PSu*MvsM8t`q4s%PFc^LlBFD%rQ>YKC z2sh-6BK3^dr1&Dj%MLYjDoq(-yi%_1YTxt!ByswVzIcSYCG0SNmNt?P+ej+Jh$_S* zHdQI~xF}{esPV>vDUpS)#!$Po?u3F+iU3z{HS(hE`d)r zNi3@V?Fq#`^u#1ldOm}jLJ&TKFFeb$cQyqnk5fEO{KU$91fAf{NgWx=rY39){mH}s z2CwPVt)AS$QAL95V6yNMJTC$pHWG-cVuf;6VVwG-nxb#Qg}#G!UY47;>%-#mt$!YI zUhY{?8Lr*8aOU2B3s6w^fbd7dfZcatl4JyM6^0*z-R*l7vNr;8o`TBt*r@f+5`DJH z=ZGx0Bd5Q0w(#2z+R^gyErH!;`4sMx;eic?9stUqO<}}_z#df|LR$m1+0M=`0M1e{ z*qjf63L$kVe;fde+f=8{nJI4UBT0`!L^iU*@kH=z`1mM;MR1{Ad?C9Jgs>sCY$i7F*&rLg5E$c83tHhSF^j`1*IA?}dua>Lw4w4SW z%`lt638)EjgC;B&PMW9DMA-P^KhLcHBsMjH{DItZT_En>Q=)4o-4Z4BH6!(ff`EF! zfhA$T|9O_N>Ql;fm?g7GO1&<0QNcXBqAFBo!m0?@BFlZ~6zeWw$)j?P3qnlf5NYlh z=M=xRs1&fC-xc8>pf|6Mo_GHam}@gibiuO#yHp$1UIud3^;j-3PS!Z8YNi)C)Wjuk zN|qY8;GpotXMmoRVQ!_YmQ73MsZsMmX0$#hkZUoUOr z$!Pj)IiFheg7BkQWh~+UDfF&U8iSw`j?{ubautt&AVyLVprhW_hCeF7iYTM?XnXS4B^XO%9NHq-3QYvT8q>NZ1RwP*k9{;eN>F5P~NNhfrqCFZ@ZvP4Jo2$ne z`TbGG1LKK7HfR9Uz^Y$Yo7pfQ+M$~w8JIIe1O~0$M2t+u3Ux8hu|V4w;y0| z{#c<~zuc(YFa5%viMLl~`)B?NOU{p#bO4T0SFdyV%Ti$2e2v4(* z%n1#AZ8T%%1KK;lcH&K*X`Y=Wc2a!A%lG?by<}L3>!q_KYU-!qgw)+6-zAke|A++B zPCwVWs{7|*&o1(zTD^=p{Q{q@k3%{4!U@+zalP~N98lvnG>;6S*ysKVuEdpp!?9~I z+lq@akI!amV&n=-4#9gH=9nzb6KD0{#dHm?tW7_wtLGZsOPijO`{f#6J)2t!FOX~C zYOFulERC{G3xzUlMQ>bmsujWIrTJ-ZBM;@w@wb-7R~p0`zZTwE{Htd*OPvh#R>ew| zaUNx5lz1D}x5Px~D2Gh*=0#LJ#FK3R(vfm~b=8FA0QlN0mAmrIA66*_OtV|aU;wIrhi^ep<4=Uww0B;->6 zHbP9BuL2E{V9TiMeYH`XU}VMDogHwM(0V`x6FrsA1rJclhAZL2O_Umh^Q9$qD%=u-e5gVWAR?GFaA*nbk0_48#SK zt3wly2@QD-kuc&z4crM?(c8~4#fZ48X=+P! z5Bzxs@X}&~A)q5B#+Hgyf)jQDV~WXd?(ZJ#^f8#Vw|~@cwUB(`&CC9tIo_-mtv=DD z57_>(^L=xqi;J%}2lVA4J@Q+V^fV%Aph>=9JIRJ*Ldf!f0I-{N9$7SEP~h8emfuok zHCh086zSoY2@VER)?18m_!=Tu|IG}37##I?1s#0fp;iecO!^93$NT`-GEVB@D4G#m zM+pF;7U3vh$p2Z7UG6TM$oh=&G3nvN?tBdqQVng~JjADu9frx0iEBp<@z_8^s;)_3 zr)dW&{@iea#_{`xNy6ZG?$qAm7#y$L-~KA=%j=5EHxLh7bG&+qNYk|jLBSx(fzzsK zjl$`C9>obK=rO^fAMZ7hZEH-Q#b6_xx{RVQnUV!%`7lKr0m`(oFxvByf%R-%u150)QPX4v93tNtKPs zw_3&JGsLaJcj+pi+zBlB_EUQo7~$HkxgD^V0K5y}yx3uZ#vVn5z8JS8rBdZ)!Xx#0 zT8DYMNiybY3sV3g_Ai*=rLA3;I=B!sjN`fyP?(l1z|z(LuW1k{sKHu~G9M_qwZO8V zAX?I!F{=9X?+U3ZnVY&wAX*R*6ieo=Clc}e$>FKOg25HsVrB*L#W6$gwziIY>LCq zfW~D;QRwkmZX>>2)!Ftmb`yDL{6c2qW=T*@yVG9*H`V2zP@8Fnn@f}kp5#LGvJ1x z13?W8VTL>D5H)5TvCD?@oAH~^4=D`#{IF1fx5SQ1GfR0i4mKH7C9RYf3Sn9vUQ(;e zJh0_#s?ixit1fw&l>XdAHJbdVl&k+kf3RWtusjdU02k+hgW9bOY-wgw6BDx5mE7d? z^RPW&5TF`|ghz)ob2KSCcyW#rBJNX?*l`WlfG$$X_kKSuL3MAkEY|~ay__QW2NuDNaHYIC+~0fQW`bTM@B=k!W>fT^^4W2?{o>^j zz_;-?`3}_j1FQzoqcM3Ni98Aug$IEu5n}9wfrTGgWT+Xq0l|`Sry+}*-*f;!TBtwr zxfaTdY8KX!r|Fs7jHt`bP$J^=9MC8Bk|^>a-i1zGfGac!KE`>Z%Bl12fXv6GKRX!) zhB*nT1tSUk{oW4Yx{DYg0B;i-8{;g;>Y`dc+HJE2+-R7xO+Ua%dT`i(y}kcxAS-x} zhUd@jGmfW&`E?ahIbqmC<5{WfREIsoCHE-ErX2{2C&&n}vXPwaQgWmb?LtP1ALRtx zW@VP*`Kt9Vo?|ABFe;qP@m!F4?(X2lAs4X4Q36(lgNwAxS$rDfP`RS=mJzeFy>G^|loI<<1~JE^EEt~k6w6JfG_?=iqi$93 z?~j-f!7ZE}1@Arb?~&Ir0ToSj7`#pYU>+K}2R82GhjOkKu0;#;P9RI1uV6R#-Dpvb z$;3c9xj@X24k-o}$}Ykm6-Z~YOK+kRSk`C<4n%@xX$Z=U9>`sSmhZ_<}xzTq3qGrq#~*xq)-9IQxh zyZK7^&VY>@hkkVH1Dk1XOD!A?YsJWx+d%Mm5V9zfW!sCgfjuLc_)BUl69r#0SSV*FOo{xaC86S{H^dmRJ=N8ImSn_ z973EG$5%YEQ8&xaqm*MH%lyUH@IQR_fq8=DHv13W)zyb<_Ur!Pi~in`IeNLh_x<+X3nu;DvK&)5Ht)wqh9tiAGkm& zIQ76D<22l<7TiVtkOrYyG+S^$k~5)JYhb|rWv5DqIHx*3k_z%v7Rn*<0Ne0oVz3c` zad3*Y@_7Ck;iB&Chg`P6Xgw@J_o=o(5Y$e7Ki=Bz-mk*`)hY!0T86^SKy!qfbeLTb zg%?}_;R5VR)7Z*Kc_v6s)ZTWS2n>>F7NJ1s$nB2Wgf#&OWDty(AF>$`s`?irkd+}IePED?D#83VoI3IJ072@p zEHx(Hp7@o=*>LzrF9YiY%A$Gc4KHHLpe>DU#XK&AKyKp~h2NMMm!(na4W~ske2Nm# zWUNPC3||%8l0bjGq3z!$$ei?)e1!;@qraS%*)$%W&^YY`;69kH?H|A$gxEP>KEkOs zCWe&Go!be+*d!GR8QPJ!eVS*JnC$-m^a4ABBypYaz&i}sZ#qY?bfy=W!1`HV$LvA& zh8@9Hkd!D1F(9-mnE`eK_0fwwn*oJcqCSB;YGNbMSmRm3dkTGq)TVw06UR4&$GbL87UqOU+dB~MI1@-nao8|Ik)YY#R-yWKiv-}3R6k3NH-q5Fu~Z}E9_ zMHVNgB=Xxlk4zO#^X*B-A9WvxQ_ktoG+3QEY zv0nFl^_@*ue%mRzV=6yCoH5oNU&B_nS=C}1OqBZSQ6%-$o#SWVxEFnl*y?G?4IH@o z-N{^6RrmD^++oO#g|6=|A$}Kh$=ZpDClfn@#HM7fj>HpRr9*5oIgCeSr_+vVwYC^W zS~Qz~T6N6`iwCD1Diq)1*__(LDP3u|e*o?AEI9BFZ81yA!gS4o*V=6ssRt)cx|A@T zxYfe$KcLyz^4D=Q%}UO`Boaw9yV&eMQLjGy^j9C<_EkTshrhN_`K~?s6?Uz0Px&3Y z?Y9zq;)Hd;oD_*mr7O^(?-ETZ#Kx_14_~Da7e|BHm;a#lULq%aT)4mo1QIF35A0LS z3P2)wDE`9dATl^`41h0>SYHE+K4pX_D9EI63A*m!|90Ix_qOjrVEeXOFOU!)H=#^S z;n4V@p)5r@w88#7k0usuP1>a199nAa&=_2)0aWL7(c)3KLN@Jo#pr6c*BiRA>EeZ1 zZctCKb>|k>vxyuyDIvokucB4Fozfxyk#Z%Q9b;N;pC?B;shkWC_c+%L0MzGpQZD4@{vvpl_ zTNyZgY_NgzCys^z_gH@ICNqOET$OS5igZ>^V?lZdG*;nl;h0n|fZW^X7)hcBlyeJs zdBlUkMbzqE8r-1OrLfs7`NyA{A? zR{+1Qvpyh4lU4hXEevx2;{neBuN0VE(UfM4sU5GZMS3!*RpR}nQxDvGBU+{@!xke( z4Tn4Fb-(uy&+;M~CRTlP4Cqi;WI_B=kq|*On*-7ZP|1|VLwpDHxGOe+!gmwHI6)T* zWB{I1Cr2_>2Xu|yA#=+axgc!|y4>uO4x~aRcW!W=SN0$`eDQ2HgGs}!dE%0zB8lXI zE9VsUSp9DgPhsoS|F+GQVKm#hIl!2xH=;|4G|;8vcmk|T1Qk`%l29f)0k*G(pUd8K z1b5Js$BXA8-ZCYwa{)OYbQp$&C=;tGTl07lCs7t`D=(~6`2-@1lIo8|h*Htc>I9A* zaSH^6@Sb9+;scz`iyiIwC>PL6H7oBta#~C;sCS`HDRgGldzd!RBY@K4Ve>%@ITwVn zfuuK3$bqIcVf$1ZfX=BiCqyI!%OMXd3aLx#fd&W_fpuuA4Q{kkXorPo4IAh? zZg49?$7VzqDL(R){^O3%A;_!7S-Gn@gsVkdv&Y3{-!zyAY>(>Et=_vEl zj=WE*a%Pr&R_uNZon~5Tt5Zqhfh8v~9TLrE+wpk?s6{2dt@?mT+3urDH+qcpv(Vs) z!V|j^*A0!Xy6Ch)m#(@v{AR|fL1!M`J$Xms&2l^ zEPkVn{m9u0IQu}yXtP#fv&m`AS&CD%D@bD%trMC7rwqDCBE*hRvJE73#KpzRVd{7S z_oLsXnzGd~79vLpHHs8~omznwnpFG_KG*h#x`Z#hKkihkvA#V|6l5phGZmNorjKwd-4Unl_zY zWKl7fN;UkZ_kAxEvuyp2|B4(4s1n=+*DO=BdBR6~vl%P^ZyN9L1o==m8oF#Wo8>nA zF5~-O?7fpX%idcIiMck)bqlr1rP-7q2CGsnx1{$m6%8sKuA)V=$sE5jZ0D+-Aqgh} z420U3#kfWRD^X@)bbQ5dkk8O*Eno{Mrn`=$ogQTC$MpuOn$c|@M3nH|V8;)=5rto` zY#S3&e|eva7HuC-7j#^HjPB3ll^uo_dr>AAEJNy7W&OmBZBt z_h}Z9DKn0y1_&c*O&B%88xbKOk4naK^W=oOYD9v`2j)Vv$@j~W4MLfnV2EXQXi+c< zy2N4NN~ElMO;EOF?rnOyy5SwF*;M`kcO(i7##^5V1cql~;fCCJgl`YW7RuN_WU-1A z)CKoDhZ`G-E?bKp?*Lr-az2AZ&MucHZT-i8>sd zD9k+MB7T+oVZbg{m+IkZ#!yr+6&Tb1P-cL;3g8t=$r;AJLlPs$sWvPWvIzUhmavQg zkPY@Yh^Zob6_?)wL?0cp!tiYTAxD%|y=gSEzn@pr4$Qf@PT?J~X&MTamuyNZjettI zGTT>?&4chvi5l(3)lwW`V0z(OxMWH;Dz_}()B040FbC)b@nj0zowt>SA>fIWcBw%p9F0 z+N*Nk^H+d%WeKdQVY!49B{FR9xaA_WO6qIrt_nJabFw@t%Th)$mrxWQS5Et~Ch+A- zO3zeGjEYs@RT||<&H2IzkXWuJ2=y2EjF9UPAFTKoy;OJ^L{O_6uQ#L~vP;%uyo7Ts zUc@ge&UR38Jkyi((g!3eda2QEsOglqsbJOE%Rw$i>LMjk+5Q-fM{@ z!QuFMZz)Ei^u_!$4a~HT`I02y>+^rV-G21Aod5gy>#w)( z^M8LP{x@08GVa5EG&AkJJ&s`_mMal*0-87ks2o)=Sz7e(X_Rs8GgdaV$a3=E_{_); zb<+CjI1fs|???hi#Y3ML7h;x;J{c9_&Q#sELWlSWg6RsP10EuO&qT5N5g`qr>yrW% zJNzVQ;jOJ^)3oq@4Ro3aU8nbbNh?Xhyq~ax)bSGk9Tc4VD!{OY{qGze#VED;^Z_LG10CAU zx%uOi1OE=T>>5yxQZjypOjt_Wrx&i&;To}-b*x*xy?QoYD z@D9uM6=R`5f?{}7xE9Q6@n&Rk)3ix1#Id}d@LNoelcKHMI24<;JEvoCKo3L z)x?AL1Gfk}kgr1Mn4fr5xYmz8uJxOa47euBE;CVb6)iw@K_wB*4NJ;{Tx}k?olpsQ zzM0wI;gwC+9PDf~va9;;n#z$5V}%B5q4!Y@YDTqggyZz?YK))~!*pgHc#W{y!=+Xi z(&XMB*7|xYY}u@ex;o2Zd(J*yx}B5L3UA3>6#emhf-xJ?nNmlijXA3Gk3?20)gr3? z#}Y1rxBLPjC-n?uDG0NHI+URju~RZbM8E3MBk2ylf8x0qm$kiYQn4`1{T zx<8uz_R$d(YE?@{_M~fF=^98*Zhq}aPEME&-bFmh%D~|_WP+_0KhNyTp_)}3_@bUI5jo_M2~ciA#hSu zxVs?w@l;&O!32YBdxfwL6G=%^(3hP?o;H)CYCYho$^wnZ_+h| z{3M`g+oMT5g$(*hGzIO#-^eZcX&G*ealDCsFU{a_E=)U5qKga94FhI8LZ_K*P80!y zIl6{G)X&dNOKNxUBj6s)ix{aA9Pn`asE4aNpIH1*e2%y&MVclU?@git+--R1Fhy88 zg9p)yEs&*bl1^jTLjZ|$7Ng#0xvCW=SgATW;<_n5Lk`@*fnW+P+8KW@Mv{l2aNk&$ zvclTqCp>uyNTVp+_FwF9SkQk}E}sseN0K_7QboLul2#|hP^Vcb-xI(4{yl3i7QP1p zFR@%SNmCK5#2_`#qKp)xG;|gX-(nj|AAUf}56JW@H)%R-=TNhI@wuhu#^8vc6?qM! zlfMQX4h>QFhgo!9@VtpJ?5DT|R}BPd!ezFW>OmP!LZ+GyHMkAI4XWBV6j^)^k^J~o zG-!w8Xja(FDIJ&IcVMq%1=M5{d>)FK*D-JxiO-psCepHky~Ejd?b7^o^ir+3F&5MFF~n z5()#m)Nq<1Xz)AP%|h<~*~O(uOXwXg0EwK7?%QwhLn{yninyY=O*bz3e=N`Ne3ki<8+?o3=au;H+0rhz!#~2`Lu1CNU*DAKM4H$>vmT5E-OeHfNA30mhLcQXQojctmL# zTN=cM*+T-usWnsBT#|5P-VYm(y z>hYK}ASP+%f%CYBV~n2y+1&Qmtw}tc6ZaV6@sW{);z{Iymb$?c{n*g+x!6yD={H7% z3c#o1*^Z|{XR$C_?z7RnNPRMh_>*!%ojs>;A|&6@@(?I6B%ZOkovS1$KvGInPKZ!| zcz9V~TaAv9NID2^6iP&P11DmWbrxnQ(8$MxhU?`{a`uq{DOmIP;(`u729m^{@j9G^ z345Tw(LadNffYEBnPB$dFwJHux!0(lSK|~)&A@cWM2xcq4ss>Tq0tk!;s%6}ZyRP1 zzXNNr80Q8`f-@N*L|I4a{0wq@apLHUh<%9n9$N6f`TF09$Q1De(<Sg2Wy)@E7^=q;?a@{6EZ)B4Ln*+taMZ^tH4*Lq71Y0Urssgc=?TFd zOmUJdo~*cMsoLryHCI_Wy@0U=+7f9c$T1leWAz@vesEb_s;;Jhs%!1$*hZOu+^JqW zN%^9O)oiYdcqNwS$%vDyj-1MP_acUCU=@1eD;~Le##!gkhcE&|c@p7#!rXz&5D)>O zFFOr_T9fZ(_R>a49{S&fbspHyMi)xs)H6&FQ5x#J#A1ZmwBUjR)edlub^IU~u&2hqG9$j(@ zn!KV@9&?M%!o)m8RYm`Q+vJkZUnv>UUCtYg6G#-QSib5cp`_&;xB4l~fDAZ*1a^dn zCj-w#=5_{nxM)X_>UILXVq;XJ;2F<(4FPN z>T%ga?D|EeTfT1_gppWQ6JEB1F)NR7?alf-n}IQfrv+A!Mx&~PfW>*@#_G1K;)$cN z`oz?4e6IUdSWkyygqhCmQ&Sg|GA$_%#rP?Op3n(N(iTRGPL58Ek3X3fN1yy`l*3OP z`Mt6PP#bya%Nqfqn}c?Y>1u=po<&+0VmGT8j(<$y__dXCA~y29)udoU=&3$1N8Ys0 z6pQk447plWgQmiJKoRjV^{5>1;|n=B$HC(Q{ zo71%wLaSZ?emRF=b*@3s4)fRfC|3~K>YbZux?_H8?aZWH@a`Rj%ir{iar7VvW!`ZK zZVK2fU4*-?Hkka*r-$O3d8sIV_3k(LV*t}8^Kl%O{sTVepP zSLV$prdch^e0pP65qcHs{NgEwgHTTb*4KB?jMIS7Ok; zRp3(MoXpkd(LFqdNcvU zGpUuQHuS|5U1> zi}ijvTmdhu@MvuPly z82Z`?FUn3AKCF4S3)kgNl%w0e8(fgrO_X2|l&~hTo(YR8F|50JIAcLUWXy~vNj#YA zAsL8{nsR9+$?4{ChK{g&oTea0=w7$UOvi8WeGK6u1QPk-8;>{W8omjU+KY?>P34>T zjsV}-Y}0crXbptR;Bb(a7P&}4E$#t`h)0*98eONPzc(8-*1!f}Ax$h)P(#ix@Ehy& zHGYB91f`tJd5csh96OHQzcn5E>K^I+Q|dpqTCQf3549E^YNZtU2_g2>m4IAd{{g>N z>OYVZ^uGS%XQ}_-l`NNkV1Y&j;G4BAzay#FRCqU6g|zEFMwOoZj(rmA4$dOrNp^Te zpS?O{nJj;Lg@_mbI~IswUf1WX52+txtLy{Q#n!*nVv-V`n3AIkQRvSg-^NGdwBLh1 zMyZ@JVYmP`p_CQM)#8%O?1=NuC_?{>A|$`JuJpl$;(@i2KluS?3W+2XYoFB~W&5P?8-3?rx; zIYZ*05jWb0O)}0sK-|&(i2}}^Rm0F%~6K&0#zdI zFPopa)(Oj%TtKg^Y=iY?{$U*G7b;wmTS=hs@G2+KchTSC%)JZa>PM80tk>!OBFZjo z!Kug9f)Pe`cb+3JBt$9^ylW9gHIN1gp7REE9c!Bx`xJFb@b~DndL~2$>WQ+zTQN zfNsbiaXEB;@t;V7aqf!*+*zRlm>WJ#9KAKARp4Ag|M&0b;4xuTJ+|#+rkv-1@y^s| zR4NYxLl8#~j=0DcoDCqEwU{;IW)w4Va89WLfP^=8V6}qpFezu}gqfJw3?@nbfn%`X z%1Dz-cF@HR#7!jyomudTrbyw3_N8NId$Z)iSX=}`5_YrV=ItUke>@=8Z_kjXq`QG=+Am66p=q)Cuim3 zH=Hxh)3tf9b16fB1;n=y6=s|B=AM|Xhw^`M&e{~qCyh?K>e5cZh{Mfuk)>C~c%5xN za?3$+S1~3Re{Qw-$OmQDs_hO&tKaNioF91c_bFo{^>EN-@fie=!63=fXhdm|Gq3>A zfl7i{nb8`KkLNfPjS9`hoWGyP1WL7z85tIG9;UX)JWy@djXr!G%wS2>9xttA=*8 zP!KMCJdLKq7-=kB1AUolNP3J5PC*0PJTCz6J|2R*nREXg&cAA4pSzn%|Lc+ICC?5Z zACJ@}(t|o9AmmZcXo3cXLN2P0x9_?(a({c&BbhuFY#n9UIx-@8+TU9}D=3B<;p=0} zyC+B?wr#N|AZ|!(#{D2`g|?(q0XZu^1dE(ya1JZ{Ccyyh_ItQ5let%O@nEiI%dtd$T;Rv4xDo-@n3w|1GZZw)QjgUvQ%TcCLx=fgSVZu4iZ(G^iBJH?0`iab9PKx|(VM2m=ET%RQ=7f2Zuhk4YY+d^vzo zKAZ`Y$gghA0UV0G^Q3LdznYKb^SmN;gz@@u1hR#skeDB@nAJ)0jqRKvcodUtT%10N!n4=&V5Wo#1AU^Im+zXIkBA{W0G zOB_m+1r>zmE|U3!#4v1AW-+<|&mtqe<0pCM$eqKkXbKc~_(up@cN-0yg;(Eo56nr& zdu6GCQw?x~9XKg#E==ol)iaeKI%7O4@#Kj(UH612P6(M5DH?H#$D2^--VpQx$s^r| zz?ZTA@`#~Eycckz!BLc7fluuJFoPcl$K8F&g4=Z2P?QZvS{)%_>46<*b=7L>^XqSC zV3wc}S)+FA!yw8bHCSfk@|yDrQg4Go-F@JyW$Wlh&+6^-&|JqsPeOz&U}65a1htlV zR+W&O6&Wwvzx}f;FE1;u-b=jn*Dl`;4(vKR1s(O08;B>JHXz~lkpeQ()SG%~=Ca^i zTAB1FxP|O5vkhyV*R68m7bYk{70zukz*=|9|DuoKdZ6b=Es`uS<~0GiR)+BjIOGR! zW6BR?e=qwWDIbtLnEATk5_?M(3*WF1(D^mvTsgBH1$A6t(PX&h8}|t^_xV3T{?D0; zv{Nw4rFxh09xx4@AWD{?zuu7lv-SAl*4O3ypGS|kx9;)^tnc8KRv%ElyjBilV+1$9K(&7K6LqL zQSEMv1|GC^t9HK8Z#Kx3k-O6o&(m<87wP0R9&fLsB%RvVNlN(yAJinhpW3U}?o)U> z_E|{4!Xz_O{fcjfW~Qd8Us6`lugtNX03cEzK)(X$t3rO@YQq-U=3Ior;7vJKW$HSV zVDFUkmSFY`?>5*!ZQeGOtfk}BRagcthU<1F+P$zh!@T6RGEKB6u2UP<10xbjCd%S{ z($SYmI&!Oua2*Bth(-))kvr6q+vOXD5EZG5s;jWb&!1`J^Mm54A3hCKi|Oy@%<-GU zy^pvg9GMHJ9F>suD|^C;dNeP_NX&BUR3h{Qq|zfvhsq?e2)*gJ&1=$3DDdrZEJ|Dv zh|R>1rjjBg9#q`iQhJcYr&inNxwHqA#m;C34JMARHX zB$iK-50daBOd)vXOGk)|;YeL@&K#Zd&xTK|=ELT+cGuH*r3=}zvm#<)t3q;V$ zsR4qf<-uOr%7%iL)TZK~j!G!;AP4+89G?SK*c11foU}{idxz-|xshPDc1(?lM7)Pv z&;i2AQ7p1Z<|iHVr};darMX1-3Hp$(ZJY{~L{p3)Jlyc#FHtxLEyG&5g$tR68_nkS z21{#4OKZ6e#WkBc)*x4h#C3q!-lGk3>-~yL^-=S4(s|gjR>IDN5=69(46cc)1yF0wWpjR)l+EBbhV&v>@r$g0QXF3#uKEy_nS(3 zqmFQ2*oi%t-b5qFsG;pnmN53EBLWl@rZu?Pvf%hZR<(n4r7Bqf!v=!lyW$XSsa@5d zT`hpmY?Q~8xZ(R$RbChgL>7AfK)q=4dOX3*g}jIoqB1Hs1`q|Zy4{em3 zzB&g%>R1@%8I-!C!~(VtD@^8uA3E08nJ~S|J6JJ^={}SzcmV_tXf_ZIPhLPoByYv} z6R3~GCrP>LV>&#gpFkNTXR?V%7KFcrZJt3k3r_!|4VXR3KAKO3lMD|AEW?KxanM`R zXABeVkl3;ZoS?BV+G9tI^8mk7uo;=9yg^Yh8p+WPDZJc}3`C_DOG*YC9(Wqyufd}5 zuhnya0Y;|_F(9OuWH#=@T$YOH-LkoAd57dsb5n!(I<+`LVBry&Qc^e`=vAM#0g^4K z7+{k)&BGH*)$W)`afq%8KjnyRj$&B*3ku^?cm7ta%yr5S3-+_4!Gf-nYeWH@1JGEU zSWsvoF1DUEoXryfQU{drQrn)oJ>SIUPHFWCw3!rPEGVlcvrvSauOoXNpdJ!9IJ(=R zlW;v^em&~1N5DSBG==BT&R4|0?z%$tA;gMIuK7)+cYW!!3-D0e8|IaTqym{s?KxO# z+1OdWA$|I>JHSpsl7}4@UkR`f*@8HiJnQ6;Qr1=NI^`j{9$YLzQpJi|n%1#Pfz}=K z`LY@iiHJ7yUvzZ)3k9-?9TNXEmJ|>?GM&~rvq^gOc~V7gli}g=Gl(+b`i;BOFa`m3 zK%i@`g6k>-UUkaK%Lj+IeRo$*i7%U@ar;z*fH}vs4|aXJJTn$bvAjEd#Qh-RL;r9Z z2Xd}CZtTtAF{qz{OZUp2G53T4v`2AT{Z$j|4ro5mwPVk) z+5x79>LAN6XhfXz%?vIF=~7a0(@JWrzyp31Tv!yh_Lmo~Tl;KRc4t zMAYUFtD#g@qBqb((L?-8XZ8K*h*Ob@h<8gmi-+d#%*y-sa!9?#zkT?yLQDubL|x*1 zEIH^gg}J3hO^SV8i&&vtY7zf-w-#M7x)KhuQR+986oAtS3s4GPTmw*D%J9c+66j8x zC5x%=qbf;jI>nj^0WDhIDYrEk3K%>ZF%Lv_m+-K#=+#uGe&g24EKmhx@u)3AYN*Q8 zN_ZUVplWlk8=7)b4N^Kt)(~Lq5HbhW@43p9X7hH7)ocdiZ#Jtl&}?F@VEHVCNMj@+ z?}1N9!lxWsiux>;sDMp|#ck8kJTJ0^t6z{B8ib36LyuJFUOa@tI8H_yLLQZq5Rug6B+I4jBtG+grcXp?4d1*#v zT^q<^RvMSY@KP!Fp=EJ-gC@El{2XixIlGY2?<^g~3gDtN!%nCM?&Edy8&_oSc5~}R zH55~3`I8^@d`gd6E@RIJ-t`PU4H~3$a{w?&pb`n@`8vV>zMMCxx0(d#OH+lL<%oAj zNOn{+V>R2TX39pi0V|KzXjPmt`MjR6=etM!b<^n_wdsORp^H&zYbViFUOT(~>s8fo z0b(@elL1(rhjYk}4A$WV!(-)gp5vEY$SKqh9AS4A`!!0u%IQ;MVCiE}0#W&wru9*s z?^j0I_8K4nctD50P+liX^u9iK%L6-YydL16cFf6({@&?p`b2f_V#je~9JvFbaZ-D5 ze8l&Z=6a@f%gHj0_7R`pJr*2DEc1=V$x)4{e%yD$Gcr&WjmC-p_0zx9o3OD%dPvd` zoH+180q0=&<(3UR8@Xo{WWzT;w(s^P&X(MQD8gAw z2^CmU>Rm?*72c$T9!l=xqtF?oDV{3kCqlv?SC%)w_+EFD?WN?`({kL__F{Ic z@Qkk|%?QGgy=&Kci7$1I~x3@w(59wu=1I3<8D-%dc4+&NO1 zisBX_Wod>7%lCxphWrCRc}ro2N9#N)U!KvWZ<7VFa~MqNL8EpG-+&W`RLVk223-@0@VMquiC0qI1KHBMsgDmLOhYuQ zxi}KfPwnrY^^nrCqisBiQqK?oYsz19p4U-Ua&^RnCTJ?nMa;0NaV9L%B{ z#zk<6z%c=i+gTn{Pa#t-MfAQX;Y*J@1KkLsJWq!)gIqgD^+8%#K>j1x3o{}%X?QQ( z$$&T_SJR-3s$wP}c^DT|q-P1!zvMq1NlV@Fh-jyrVp~4_d0M9Fr5sUHrPKnVm!*zC zwHzD=P?_tq+u6kT3@@J@{~?of3l#|l8fC~}oVBL&B15yLlsF++JYho6_3_{BZ?+zm z1TdJ}7)hNlL02KSw!9)3k5HQDWF$(shy?FdF%;~?=N1c& zJ`?W4Ers>dlZljk-<9TNoMKufzA02<_TctSd_#lDhhq!7^z$;txG7>ZhX670mjvX{ zV9$~oMrMcc%)(y*)3Rn7;S#V(Pqjw;7$ssY!G#bhk>6_C6x0Y)&5acu_`3M@9Cwn^7ZJ9M4VFd+dxC7UL*ITTUiUftkM{Kx<4BU3|!^L>Iu z-riWI;~m)<_x4bz6W|*dUwIEs*sG6WkmYkscrc$@Iwc+H2(QBQLRuxkbygp!8Czf3?_?AOh2l~Km zT9(aGv@pLh`7|27rEvk1Z$ZeV5wf2OyC$@AlxAcaW7c@H>9JxdrcMG?#FqfD;64o5 zfB19&@;8cNVEtpIN6lw;#<0@R$1^Nh<;hv+7eH06oAKf-i$`lNruYofZalg;r2nVl z>eYDGBq)SFo%7_ND>@c?A3mJe2&5yzim^B!ujA?!%&6;XJJ88RY{q67WoPMlF@k*v zZp+oHF`#~2fV%+;&cH@qm`i(Mu|||%|IS89F$Vh>W6rD5Wjc&T={oFQ$i>HunKVx5 z>6h;9&1cy>rdJ;S2Dv4Oc?YJ5TgJXHS>#nz5PU0OzQb77RICt?u1T(xG<8UBC9_cg z0-@$JvorXOVUipBKxMnwF*1$6F)}BeC_6L1F}~N0H|O{z7s3erF@8|LGtx`^A^}pMC zY$ov(mgp%;H;A)22LjU(dMKbVzKDxP^kF<-_O%b%tmWQQ1g5z^JC3^j!QnxBulFDD zx(tXl$A^8vgMfP6r>tIRD-7@^X0}`L^a23b2@x3RP+R73YFo2tx|zcNriJP$Y}!^d z1~=MSW}~;DHdIeV!Vye*N<^*HsPDx*UzhwFfI}7*7pBv71AZAmrY`6Zn{7rhWFIYTrjcN!4T6W(URg44b3OKkOS|ZouIIgeuHiqpG5mmzYYI^x-X-rW0GB zU_=SfQV(6lGbsnSCUi|ZiP#K13e;JX0OyZO2H`D~8$117xb6fD8{2K?fr`2PXpz zLl~rCg^+4@6I2rOD~Oyx1u%eyf_*b*Cn+O?r}JVH-8_i_(EdWU%)kCuGiXEhwb|{p z_YR+%!SRoK#8C`u_5AQ~*R1x?>q1At8kXVi@#rE>-1J9b0-+W7@V*@ZctsXX;bb{a zKxF}a8Y~G^(mN}Gcn3_DvNMFpPmmToixc#dkK^H6JC%b8T`F)miN?$~jAQMH6wW5=9VQN?{ub2Ai6f|gI1QvqR~b zi<>ep*3Fg~&S8rJMtT+x?Yemgf63ub!(p1l8^)ay@O~a8lXSYVLDk4$8vc(eq;uTe zKiX>_!y-|}n5zp2?>!rn5x7Yu|B*pNF(+sZZlZ;= zN#-9s!m5Q$j<{IBlYFXCHU7kopfbYUNLBRv@h4Qaqrvo&t^Y%+aPj5sov}SPzc#xu zs-80wd<*+jv&$$(AOE?J|J=ua?&ClA@t^zn&wc#oKK^qb|GAI<+{b_Z%Hltt7R0%ayxd1# z?jtYv^*?oC3i`3?4`(u^>%vAi;6Hx-&2|O<_uFso`Cq?S{ZCAEHFoszM5`nn)tE@w zbU7$Oq$cR`rUo?WD3h4d4~oC^J^uw`6D+eFw$Q&&pye+xL{aknvyW|`NWPp?_nvX{ z%P?;8ytf0s%>nam9%dKOH2%XcmvHmxetTEB2Yf&06T>BUWj3` zv-@tAM2PkwpY&D#44qN?CAn{@U>DF)vHwtQ?`yG4;i}_%N$xA;2BHyLp#=nvKu5gE zWAqefBR6%ibwM>Clv=4A@hikts*}7Zk?XV3ZR(rmb=aY9)SfuQQ)g;`P=UiDIpzuR z%T=UIV4-n3{m(;=vj!Ns#NUN{i>TJ!W=EHcCjQ*2Lu2>LgSS^YHFG7KxL#!7(_#hM zwNB0jNrW0>D(1u87kgbZIPSmb9E1P0)90xjX0+?4YE&H54GG_67dKoUkL-lUcSLui}!Q;Y6?fso^4T&<78Lg`Zq$ zHaV0b;|{4Kw^|Po9|9t5uwnRN-cDPsZRg-3@CWD1Rs@B)1~**torkSQ{2e;*ChCXY@Gr=;Rm|pBaeO~-+(yyJSk#7@D@qj1*_}7`AzV_jv7@q zvWTxEI3V437*I-rA+O-n{^%tESc!y=6Tk8r7wXi1^2FWW_!r%Q6R^YN2eipxxX5@r zL3d_cm}tkG(E4o3Y;SVMPkEFYThzJpDmK-MS}xQXCyDJn66*G01j_ilc#-IN9zy9fu|L~_j{sT|Qrm6YwSF}NhB{XI(g^kH*t?{Qn z{tw0&-w4fd3vA%ijmgOU{zv{DqNx69Z;sY{@|EYX167w-za_8J=QiB~;bZP8ak4|> zyFMO3TuR})(p|7)_q+5`wPWJ&U?8Gvhf4Omsh?fUZK9)oHHOUT#ag8~ltewTu4R|Z zQ`7Q*HmiH4rdj@}#T13UVaz--OS;UWi4axzX0>Jbt=cMIsakS3%QjW30d;9WI$2qL zeqU~J;L^t?`Vx6t@`BAaewXW!kgqICDgyxcs_KUDFG!30VB=b`sm@#=JkH<0y&-ne zt~+g&icmI`GM&IcyycCRSXi4)-tCAbjvA%3!Ff?1!n1yxy2r1|n{yi;Bq4VX6`@$; zuM}^xqctF8Z8p8|y0`MO$UcS#Q5fAb6EA&@Z{X+uzA9Gk;dr@FISyQ!)}tgE+A&#H zw1#fR1zz1REuNQWQ4S7%h4A_&KxZ{F`|O^jRcJUZ%#7L;z|+!?4V^{#xB<6#Cu)KA zMyYwjqN9wOM&oszkeMq8ZJ%j)%XmsR{r?sbJ2@Eylgb*6*UxQH(6u1S;9-O{c8wsd zZqNX_4qnsQNS_BTc><|R7KA*;kvt;gdEIcm$3T~(b@j<(KHHGvddlPC7QtJi9BHXy z*cW|RMRyqF>N+|n}~(8PH+!E?9UXh`>5-N7trqaB2mgv%*!ME;lGYWxSw*CQ{!{%N_WBhRIThc zUyz*j^U#PQ8|}MUk|J-h%Ujaddq(i5RIZySM};hk?sS)yK^KH@bg1Z={}#B2 zpoLKM*Rj5-a!(fgR8{X(cWZ`?dlQXmjJMd2j!9)MB!xlPzqSzaUBkzpPFc$OOkI2( zV5z?)d*acm2Zk>WBlKPP3qJTLa&g9a!1d~3S^K`ndIgz7Tl*$vQs-E^##Myrl{`41 zBt@FgNqH8yQBM}S#H|R|P5E%y0XNI+1hSkgBwYTvkd}U82v;c>6~wJSUjqdqY`sMq zKpwA?X#g&0r%Y}UJ=N;w1I9=(H>N~6FIh_WRIR_L|K#|ZziVOQJt&ILT?2SM|LeD3 zZN@K0QZ|)D(B|3aDf_$oRDOE>Uul=zu?Eo2;$iFeL^#tTGVjk@ z#x5OlFMziXcMt&s;?rhI>I$d+;aN z6tVlLlW}tq&HOhNAHvN+=z1lH+W-fB9%p&sO8inRFv#=y#KQ9syH5*dfsj!0%c}A` zv&9vp4!rnb9fW+nvRmi_{{^G9!d5AFPtps9w*4)5F+FyCc~T{G+&eetkl(*vqv%Ea zd*^Il<8#D4z#1c1hueh29gjhz*lS?3{$SdBz2^tWl3596_Q*#Fbu=KK)Khd`txy#c zwAgHFUDs^Nh#<44(deNOO-|a*4LT2;vpxKk{=IXjQxH71IA!L=4?8M~TAne=WN>sA zB;P)o6)xUxuz12VCO0fx@;BvUqd9-q#Pmq6N0e`^Eqiz~o{sE0dIg-tBk(2z-Ac;a zqSwkSSIgRLg5Gf^Bjct$4IRy&b3ArwV#!z0-hki!^pAhU`BTSJiP{dw_&nP71pG!3aX!zibFt#Bfg8wc6uW~qBmUH5`hEa)eH zJ~+i#!R6&IxM9s~hSY_iOb9w*mGgBVkI3dZL-#|W6V{0OKKK01nR>ijn~LkbcMjoe zwFr$yTkYM=K#igVLD>|}8$2CLH8F;W&!eGz0v-+`Le3EGe{+(a#fjBj8AM1lj&KWQ{bN@PQv%?mT3Q(y=6pD2ASSrMIw9&PybnbMAZ{<+O;Z>f3j zO{x!7x3yLk0h89R=tt!-j|w2kK6wV}Zxb9I`2S9s1S(Flc$Phyf-QDdSJcmN8?oqE}zJJl)>m37+$;)2%Rign-yUD5f$Oh6l zg%%Lj=>g*}ThoTE>CfQ9t3T4w`eoOh^i_2Ih&48!2`yO}6T?c&uQjrZ)t4-q6wE2f z?{ywJ=n!Vkhle)or;BMyrnBp6OfpBW%A-hvBSLiV3AxYzuh0L7YR{JZvvePpEpWZZ z=m!3et?jQX`Tvg}KfKTX|C#tdWKqk$A9qQKC&14Wa8(gMt79dz4sPkw!JU>!;-@=v zl<P)uAZ)TiLB}l>Fn6+dfZ<92@uI zc&k?YneAnRAts=}J&1Tu@+w$X(xS7@jYuxUWPoba)uN|Bx$D zE*<&Jezcc*s|yukj>SSz!DvD3PjmOiYTsmsy|@u%x5Rk+6Vzd7uRgn2MHH?p(P)=d zoi5VI#|UR~W<9AN-mF{+hW{RKUccBpsR#@scyA?YTLOV{JsxruRua!5T1H8V|>Df_FJ~hi8&4PMO;Ee zPWL@{V7I0)gwr$l3H%0FA2}yLFxZknC%`jkta-!`tT0F}t)ktf{&s@QfNFP_K!14A z@uLE`E`+Bv2(;^yoh1-wJ(K>)$?IljX?LJa6&PraAd67BaS%JafGGf+i zHXBD%EG-KwT)=(Csb3}rx` zvpa?YB|Gkv61r_BK!vPia~{7Vr}R0VDKqqs?a&6yCMKT`L2ZE>XTrNv<*$3Y)C}lE z@KshIlc`iC(CV2%1?-%`To zNKyadnR{@IXliw|_2jYDhiJ6S*^ScRajr@rS5>k8&}baHG}Wc=RmF?4>!0-w+IwFp z1Nj~*=?g$5-7=Z`HVN8Gfs3@n)?*go*pWE?_F0c%(&JA9{DXIipC0t5qIUw5i&I5E zDm65mBudGrU!X6NB+cmfu^QegP^H@NMMUh_@qj4F@rCF&9!sxqm%XA5EFz~$aHCvA0 zJsVxR08?(}Q#RB`e?F(Ycsot65<9xE)D5opH0RM! ze2LmM4)#X(xOd!p*){Eh_TG~ zoPaElBBu<*B~3oz?>J7e7%8rc`e`$FVj+ZNy1!#9GrBXvn_>@6NSa&yt{Xi zA~)rbRpZxq7|o)yIEf4JM$ttd#U)T6*aHi0Gc@G(qXk~)5yi--Ogh+n=@yo&dw&N^ z%a4aI`sTPj`0Y-k(MhMH`H-@cyd$_)O0Z*gG8;$mFQ5{sjE_smDqFHQFoW**FMvzH z`<@BAx?U|S8WP`r6lAiXj@1S#R6G@EtZZ#FUX%gpadPe2y;6BIY0) zWLqt#G4p60Wx%jb3?l&7C%04{-nPn3EU%z0=p!EH{Y&DoWH(_VxQ=)2s&E zBrR!KkL5_6S&fsU8r^fJrb7{ZB< z`NbGR5K*%D1D~5W>(k|(saLH*xlOa#$0P}Dsi41-J}gJr6M)4)FE2miE-Wqb8Il(z zuu+C7g@jzl0ezU(w?Qsv!J+vTgjpcyy;}JQU1!=(ee&0opA!D)j$4(DTea|ZmYaB| zZ@jyzb{4#)2Rgad{r{@Y9j#Tr>owK$CyS-sH}hO#EedbYh4LSg`BJ5)fh$an3@a%i zP|!L(?)TU-!wz4*g~W?Dk0qbj+U_9xs*kspet4(uGQo<4-MHv-M?EBQbs7>ai!YeN zB`ZO@UX;Wc^3B0wmHt;hdnZg^*ruYz=P0E-r&XF}%2`qU z&XMygI1h#EDN2ILtmnE3KLDFv6GPFirBx zg{a?U_d$5~S52!|aU~G|iu;`0rg^Y3dsv#iN7A3PDB4m)EmNPkf?*9@FDzigmR%2-f^E{pT`5MJ} zHuv;oX20G4ZTHwumX9jQi2!S_?)xshQXUUSLPT-!dE~FU<>#GZa^@8`ELRDy#%fJG zZ(>x{SB^DR62qc$8C;bhDDHweoGXc$o#p@>84zIudAU(RZcw0S5-q3*D6b9_cOzW% zn9nU(mGGV_P6C~{R(C6hn2`2AL{oP;JwpiRa<^duDMabJ1xT?j^WLvhJk8^aF=*mW zIt6gndBW4hJ{Wc#4X<0>ufWIlPxrx``}&`{`k&geguC*;Km7XJZ_4qXhmW@&Z{Np% zewO;5>Y|qGfco=kjr+5j1OVn^HB0NyyDDf&rOjQcgJ`^x*mA_&%6-ggrajfx5H zWIQe;a^04wm-(Jiw~&Gv(&5D6v(C3gwLl`%ObL%$#$RJ|-8HEux@)1(UNoPoYe-e4 zTr*w&`u~_dq8)@Cfs1P3!`7HUcq`%!FX`s6iFG2n+{5821$pP?Yu4?7dn(H|3=1Te z6%9$Wm=wmlV#jn#@=Em(VYr#|1EtW3VvhQ7P#qy{ezPWr96KPo&MUQ^G|}R`fh}y# z=NVqfTrVf-$hpRlWm*+a?3jV`#Q8UZ9LIPX#?t9X<6J#(p#*gctGg-ck&(Rw9FBF| zKA6zQnSOSy4jyUA;knXm(jA*O4AnL5c*cd=_aJJ4j2~`5<0vP6OA`E*fv7Xl#bom- zSG(38$+Qr+J4rDQfeUuRDzFVmRF8AL_Lu;Rt#cs(S3an3uR6()@*k*RBB)k7(|=q; zX9Tbb!DObI*;gVp5IB`uCQ69u3|@M=1~m+1oFKTHvjlTPh(Fw1=0@{o<1trc^GN`` z^-AZyfTQ<}i`jy1K?eJ!&0rG!ZjvJa$jE)0K7h??O07BJ6TNalh-S0B;nKQmWrN6e z`s#4Fg(Zf0O(o?AY#zsGmhPB0@2gh!hd0n2>I(n^Ay9nPGX2nKHr1XU3{wK1e>P7N z^EWNX)(AT0oXyboj8d_8x%3U*JLZE#k6;olz*K_70i1I)iKmbyiv&ndH-J|ijTzOC zqb$7ubUd7{Bi6#?_{vR0#fs_+Gk%+4N5%K{`K;C;Qm~b2uye4^mUq zvtH6^$B9h4$~2~iSbxy*Q&`1jvm+_&1QLY} zQH>y-(Wm&-e)PLEyWx>|deb9na05VUz{h4b1HW^0VNd^^NUMa|A)*%qs#km<+s(6| zKlp}IvaZMvzoPLCs%n_Jhcc%r)A7yoWs*pi486({IA95+Pl`C|K$71j^x~1iU8{Wh zYN?(TON$y2d3Xl*czn^jvo$xN3OK2Ltaw;97!k}UBil-4NhrK(^4)49TpF8p1j_<- zhOk`p2s8A+477`aiX(SOm`eg^R`&rQ^I80E4QVMHWSOhAxQtWrDTr5thK*5WzSshR{c=(A4KEgvFELo~9lxqrx4~bKfG6A`1CH7|ZARgkqt<*L? z<4<3;7g>lz@T+q#V!z}U_-@Wf(l9K7_|X8d&B@kWju83Oz2T+3zhlVg3LxF1nRpIGq9zxq35ZA!bhQV zG}{O8qkrl`(5N0D_GE)nO3TC)`&!C*A`I>p>GmjY>Oos z0+KaXns^G(m{FXpxH3$#Py>yu%42AI;N7<~PC*2uat+tW)tKr~EfUtC>Nq!*_1l4a zB-Ewj6w@W31y*cu;l_6>>xMB{Jj-)^-oo`t*Vf4U<<;6j>^tTd*=~*Ee3)L^%<%$L zr;D#nZZN^Z`NH8!SQa)l6-;?;DveYYZO5Gn^^3;)$5+YD^I(l+8`a$^=y6n>STDMH z)IWUL8}tqj+Ix!9k=8wAIV61Fq^1yztD}UBRw)+;N{oe;I9u*P)vFNwRpA&oKa2Jd zgp)}Mho`i`+=yjQ3>OG2zH$kq-)!i@wGyr?$vCAJ)lFWbv8#&DqhO6VstSx{VKp!; zx7t;^0G0&nAp0A>c8%>oA5s{)OQcc;Fgz&!BxHk(rQ7ZE-RdQ=>$Q*geq_Ga^5!MHY?u3|0* zx|YD^4RcdaZ9k9Dr65J>oK!eV3&Myn=X2r>sc7nse4%X8H=EF(I2{r62)2husGX9# zuh|?BR4lF)R$uVGf@t`1p9wU?-SG<1A+*3;;jKN~L5SZT+}Qa$K{SU8nAH~o*9vcx zZ)Ndy{cWgUV6}aAC|_kmGrp$!904hG${{8o#QC_2$W_+H!O?KiKdmv>TIMDEWhBbA zszqDoWFPoTGo)(un4hrc(=?wQkIVZ=bh??MiI4yGw;6@0@fbJMLvb~im=){cI zu(m?siRCrmogFAztxk&0IlE?t6x>1Ynd$q(W%<u3mFQ^6RlVfx&?@1x-sfos@GLGf37j|1m^`N7q%dlT6M7~CNUyfi9nq` zi{gYUTO?dTYjVNozQG*;w`V`+=!S>Lkq!VR&H}FMWU;q91(YICn->q-A?(=`XRQ`|fm5x3l`zDZ%DyVJPbeL=N zO^cXUF}H&nI7*_aym~t}WyO})3Vy*>{}SPFOIa>3B|wPtvhx}NzgDwI=wrPth7?1t~`%z zGOEvC7z(#IGd6REK|B>SSq4x2*Z=BnC1KlQ$_03`rH`PI05OZ24RvFxh`Z2Vfg7Cs z4-?4jHdhf7;+3Qk59HH)%+?Z^n zGKWkJ>;Tp`lI0f2tXzLQovG)Xb;txFKD0qXGCj)brxAnU zb|NQ0LW=J4rlE8!%*6rC&&8{Y2gLcV0YziV5pp9GFoA<-z2`6b3}Cz0J~#mOmFuXo zLS=Tuv(O-@07}}xzHsfJ7N<0$SUsQrx#|tU?Yi;jT7VJVjwg_zGGLJMwr+D{g`B?n zvk|3yh%=5|H3M6iIUhY@E)b_uicp#s`GfINerCtfWsDFf;-7CH^`K4-e;#IbM2_scO&5~AX~|}mr z;W3<2`mU3gRU{*NhaB}#^^{$LJ97=&#s3eujI%VRL$Eyuh`mD2el2N@X7dpTu8uqa zFMVy7CoqYo7jr^5KaMBX`~i+hypksg_1vr?FyGW>&URhH2Edmlk4)leJc*J`x#e!s z@a>w&9+e zY^<9HoRJO}g$HZoNk3l9IQV&R-0inJSP{4ihB=D-8f@0Var?N}F{=*yd5v7?M_D?V zLBw+v6;F{OjwZae4$!X1RtEOyrClS}xyqcBAO%(HGew|1HO^Ttk^LRf{hy7kqD`X_wJJi4I?Ank<|!qTkr%qw`%S>*!K?) z2%#bD@PH44 zY)lfJ*<{B&*rz|6mU)`R_MDy6Q0@(hpASln=pN`+oH5cePosojY-w2K7G$vH7F_VP z>=#w2Gj7s(FQ5d=Jkvz;GQ#~2quqX@R<<_2-uQY29`(s5yEcz6%KP61&&Vu8xpd+5 z&7qz=2LVf>WlqGR7aQJvm+=tXSwe4Nq!G@mpsX|KA)i++hO057t5%kSj#f?# z71|FiMafdA!1C1FZg{;F#(;V?j#~KyZv?o#Pn*pKiX^DE9dn{~@Foe?DgAy#)4gL( zu9)T-ZmU_ElceL=BM)JR-MJHeezTkOS-3B6%*u)vWGzA@LL3tET;i^t>0L^)1B zWJ8}RJQ5_b^h}nrr@su!_$NbS6R7em0Rv!}T2Y|gH^OK`dl$A~EOW_n@`T(Km~DL} z#yehG(njmhFBAF)L_q?e45N$Jc?;l%T1D!1P66=~e+v4x52PY^I<3iH5A^$8Vc$Ow zBKOon+!qpf>ildW7!+Ck1X92SMw6N6Us4PrFC2$32P!c_hdvpGp$HB{mrJX#q*|u$ zqM+XKQ*z|oGPGIV8BO|UA@AQnyM%L(p(=70W5w=Y z5B~Q<3a+WZRW>Sxfk!E1k}VAbUmO2@_~`4cO8ocH_Tz8w{sXOM8TFydRto*v za(ANu%E=SJzT*dTvr6iZ5w6xg3;x4R^7-j75Kg4;MAZ6CE1pi%OVSaal~#6^jRbxH z9kI`lxr=&9>hN7$EINaiHDBQ+8@k6fhWX_$hCa3wFW;rXx_}|ctxKDBb$0v$m`Ph( z=#4wTlH;CRKne`~6p;5i{`Xgma?c|z;7}zqILa$AYf9o=IPd+@zL{C#7yFpFe;L#M zT6GpC#c`02NCzVfv_z{st;*W!$dFky_EPdg=C>qj5g`c0<=#Cv6r`MY#*6Nm9X$ko=7t0`5V013|T z@TM>8?Z^tNYVN1zRM?e0EV?F8E{bTERZo!`2xSBHhE8wUE$KjqQ-GW0jCQId9QfA) zMh8-naKX9|puu&{vJM-^>m;Dc5`k8zM@{FuZU<-x1X2oc>P znNMIS5Q%v6)-GOSf>k!n-$2lN5)acPowjnIr9kfrWHzqR)51di+OZD3F{_m$i{fDX z%9TBPO@;FoKR{7FWEtjqdiL`2^DHW_1wht)z%P@-mQ~2uYZbm;xA;yycDOp0`BKgn zxNo`I@M^5oqKPG%x6@b|#IW(-%Ysud`~y6~Iau$hgCAu2QCWeeQM!5ETv^9JV{fse z6jK1L4$7l^$``al2lOJ+;&%owPb-EGd(kzmi{F63$JZ-{FRAnT4ay3g_B(zl9|Nlo z*sZMe6flRVlk!!quML`pPBDRT!CaSw6$c8#hkGwO|NV}~m(=x-{MY$gd;=}p=nQUS zl(Q-fInEH^&%pT@=fio9NK=Wc!4r}P4+e}8bDGk?Fmn;$+ErfH6S!V~dE4~eC`?Du_u@(R%-hR zV!uERh;!n)g4>}CBpMFqSu|u)H0&|GhYgm;W+pbuF{upZjRW=m@mVl(Wz0_?_wNjo zpl3-mwCbHiCZKdkndto7@{vzs@x*6V3>H(+!jSjKq8f_5OQ>MO9W(YRW|aF^S)Ob(Vk$mySgg(aP>r? zR|dEen^~N{MNWY{pJgYkSoY=sZr!%_RwkuSHSelT1O#Aio|b zRDL~p)~8>j?yb=>-*FC@;JYbMad|B)?3A9l3=>B)Ro15!hN;qB(9?qJTj7@`mb(5F zfS#Q2MuFVHQ(Z#+Yomk~0&q}c4YWwgw*gmLh8s}uOMY9OdJe1b=nxVsr%^pr#B~h? zXh?b_CmmhItoH47t+{c|z&H%_X%>)J-$Ug)@E zy2|sqP6q*3mp3o@(I=(fgJX3`yE?^#Nql4r4_LAqjiV^bZJqrH_NzA*$Zj6tH8)GI zHjJ}0g!`PpVU?FC3luULCAtRBo| z3u46^Y3S0wiWc;~uk_&4)bP)yh$j{}tl@1s(_YH~NUzdr*1E%xth1{si;NrsqBkUvw_u^<{JZt%`0?{Fh! z^qy?#8%#gM^WX{{4`37}@mouZ80oQ=r7;0xIHqKyOPySj@zgmSYK)0SDf6jyTj!)R z)56wN;*{`pk;5N_?Ggu3j=Y#v4AFc;AsR_d{~MCfe>6pxg3 z_*WH|`Vr$MP@H7U>A#^bnB;PpPAsBw@f8KGCp%_^;hUB%QvhV~#H=nhr)yxILir&i zO|f@gho6F1)+LEbJfMNsvj;d{JLb36&P?SKu>85I5%wX_v)9+s8Mr-$iu%G`3bE`ZeeTC`P-uPYQ? zTqttg1$hZ&ZzR>E)Y9cuLd!Lr==W54KRs36;I};$io*E_Ccwo{)0-l1rE~p70BTjUm-%Dl*$GMEb{Y-J(Jr42l9!62s*_Q@uj7kE z;QDrA0kIhpnjn)_$LaYcT~80g2J19g1cPxJMQ_)d0e*E)@%C5xpX58*Sv+hp7+5Pq zu)>>Qo$itvdmaAMw_A@&`M=u_A3uKh7oPunb7J*&OTfwE>BVMPrO=|&#^$6V@-LbH zTO$hPWZ;)_%ZF!kX2_tx0v4a-oGNdzvAhL9Gx9(P`}x_^fp0gfpPnFGzhUl}EsV%8 zEya-VS#yS$4ZcMnnyvTmVGTbJR2D82c$S@G`BUb7+3Hu)b-S~8=*VUWB()Akt>|LeAYwcM)BS9G;iD^bbS$o zuBquB^*ZMJ7wx^?@sFl^@a(YP>GsuQ5XB&e>;>c_lME$k`j#B1EpX=~iJfAYgF>dv zr{t5BkL_?wetH%`z_`rP>4j+_8ZAumgr9wuW>--3uVsaq7_zf?G_v559YPpFzcpZq z^bu!yAIv&lJz4|>j}v9_1@PD89=d8bojxcy+tI8PZrBs3H~?6#do+-06b84ZMIvh*ym6Q+pMV%zV& z>~&vVi_;Xw{X*WZrwIB2^Ve+F=v2TTzv*ChLb1_k^e9r|rNd1uIdO3djBEnxN-0aT z3cI;ZX4d$vK%1IX{L@3s!vv|r^eFt>HUj9NTm-vl6$saOdwGzYHFERT%95x(P|1x3 zlo|8ZPB~4kbZAJ@>vB287M|7u?d!d zlP|Eja0synyh+ z6T$bNTbwKA!GZTW(Uifo&g|5l$1YeJ=e&iIbZQZXsSms*Npz8$RljrAB-A;u#e9bO zl@P~W0T0;b5Mi8Z5|3-4yDI%oiP4<03rlaCiz(O*WYY` z&O$BSXf{26L=-0wHkLK!Ez9rbyj^|f3jiK+pH_Ge#{{Y9-lT2oy1T7F{U9|y&W7_O z%EFB=^*?m(NGc&|2+?&OMa}O*dSXEOK(8Pxb&UJNGrV>kgp&4q*X=8c0FXi=y_cr| z|4u*w5$N9YdGbWko#g12b&3muPnXJN?_5MtW+nVYA+!1Y6>cv$wI*sef%)`e(CxcJ zPPSZ`^dV6r~V$JWO78oYg8wp12=15m(=xDuFX#aZY+WdfRmdWnuy%sdB( z(@n4!H;=(+e1<4RFb%AspYHDZ1O5r~gym@2pol`V?GCEBGfR2?F&gp89D3pt&@8c( zbf5}{SR(VGokm%lg3t|_p68#UP0-+)tWsw9(j)W=?L^e!9XJN(Ye$$CfifmDx!eOg;4whYaYn{ynFsoSfA> z^lN-s^pmC?tI9lQF#G-oQv8UrF$K&+ZKj1NGp&TQ>TwDScF@8W0Rq3<1ag*bcBchq zkTU`R!0%y+k8_2L_(=y6;8KctW4waff>Xj_w!JjJi(E` zPsvt~JoQF`_W{I*fhP{q>aiCSRgO7z8@{}CaMy4siJqjRBl4%D918sVaTX1&WQYR| zVLx}Ig_6Ge?M999QYQNf?yHX08)*KRu|!gK|G)qA$N$SXUHa1LQsO%f{TI08WmCM? zadDPe@(*cCm#=dzoLJ|Jqg*C3F15Ae`uCsyv(faA{y?ptMz6Ppurf54VAoXC?xh;H zeD;4cL=EY4ds}Rn5PRqpGx+nuiNZd!L^_lqxijjD4*K3jG|OFX8n6dW(+SjUGUZcO zK%cl8hkV7ryObjrBt1=uCn6sHE-tA$$)b8s_3`5@oy57-wI<}Oa8tqHIpQs{j4rD1 zkBLGBbohub$3mxq4^aYni4q>qT-?t{w}MU$_G5S)AQx&CA{elWU@Hst3{40Qlv9i} zFCFz9BwwCa+)vfgn$jdGS@1(8A19hLRgQbiRtjN&$h5$mE9cx*w8pnVLGpE23^f$4 z{YLF)@wATg+}XOB13#-z&Dr=&AYY^qviCR za=4Wln3Py{mWrdJV?vWziN8tJzA@IjjIV|KqFWB8ag;s0JbXAZFQ#e60AO_o2PDVP zVMZ8S-UY?TVBl=VEBzVOb88({0rToo*UPf(opBpf7aF=RKMs>h!daDA5tU|smKgB$ z@!xN^x3|ji->pZFAN}IvzgsPV^w^Z?-gGk9`f0>4RsU1{tv3nWLc6IggJg8lDJI?yLzMO<@m1^D_pMJ2^&Ew6l#0#JzK~TgJn*Bzs$4RiGv24 z%{z|{sgr3BV|~?9xYEdn2psL*>H&U4>xc}4SY*#F59Ba8-wbXYMR|?gh$v8=MyYn8Mi7( zf+63d)ST+tR@aaQ=wzzVGS9PU1lT|BYnQn>i!aPsgqFI}BzyJ(&;)3CF~XAhWztQ) zw9^q>e8Fp?R#7U^yaPj`RHYf!QYK)CdF`C4VsI}~ykJ9WN zs=d{HH?)v=0_3VS(^tC44ULMYJ|9Ck`5hw1@|Ei~M-<8VJ&OZYNAo2R?z2BP- zv7W{V;~v%2#5rC5z!L#CX?!w>aw90>$d(ob`GtmaBrH}PFX4x%=PPgl%M@t^HlU(I z*rFmPVRim;b!7gfAp}YzX@_S@tpbDY)%*Zm6^+n1sXIo((X%#oBR_4t9^jvL%*l)X z-sx-lQtghX&e7Hc(1Imr&qsVt_8@#fxtHe|aXX*5-}OX&)Uf2(!%wLlqR|P|Q{I{J zk>iRc=CFKxBKZ|9SM_xLh_B$udsses`*QN`tCRPn?v(zBPxb-iL_a`RY_35O4c}J3rMFj(k1#ZtYK4f+ z^wubWYS07v*sJf(fD8BcEu>S?-uvxQ51Zhh7$1R>UgWq6p(h-$s!Ts|!Ls3dD8^A0 z)L^M0t>W7vSL67O8et-+3W1>@8XMbf|cu^Vrz%2 z4RV~-dC0e~g_5I%>ikHz{{bX4@<7s zRGNTj7M)YSwVcLc@Cdr92M!1*n1v|63#>9sglnS?DuT-5OCPD!$DiwZdnpiiU6x*a zM2S4s$9Ha+lECBenXB9@gSesG{qc3>?l))xRZSkaDBZC|rRX>6f?^C|kc%+{$3z#< z=e^Z4skF=U)8js^P=xg^F0I1BTIUu-xe``hnw3-^|D@U0)V|gUinsqr;5Cn@e41E`km3^t5ZgPR7z~ z$+_V)Y)u`!I9(l07Y?(!ckgTAfBIVZWggHlN}&7%C2;{ZT9X&^k=QMQ_T;lo+&NU- z=!Hsbp2OHc=@5fej}#!*@=U6pZ&!rGALnwq;ImqCE4GpHNTD@A$}tdX>l`M^BSSVC zWJAJ5ky4B4#?bA2cYs+9ZZ2OP_J8|q@355ML7?rO2Ree_G6`yqGztm$^q?}gY0WE6 zy*ZI$=n1R zTNBbcc7uI@^paeOx=4b9`Sag&uR|mScGTR}WleQ#>!wS~R}csMr+YwypN#*D3&`g0 zT6C!>6-LL?d=_VdWpOkA*Vm7}spNlr{q^>vd;YI4@t?26e(?j;;lugm-5b9K`dL}c zdnTkmFD9fHKY$qxfd)v?;4;_ftsP^1ezofQ#Sb4xkwlj)qKo7V@fSaYwvHu!0ZOIy z0>dd8iks(U*AIkykmvIWTFxyx6iBK3jLb-C1itBeo}@3qlf*(*Axbi}Oi9SA4bZz~ z5K?vvXfeGfNcw9eNa{{fZwFJ*^&*XuTzRw}iB&DKr~Ii0sWzq2y8+r=m_e8WqJ|Oa zZYq;+ij|BaxxkS^B2Nc``%w$JMSnRcJ9-^ag}7c=MmTBcU~tr9Wzaro@BKLF4Qeum z+|3mh`oaIt-n;ZRl4WUvd;W@>3QS3^A*JwV4213x=z6%T()9>Y3ePBwAUBa$lBJV0 zrWq-@(nmmJ76bHDS2vI~n=VXYYB!r2^tM;^WAYF5{Di@I-gC{2l;p08h>TV)s=`Hk z-PgJ2p7WjWE8J#snE}WFLK=lpQ#nuIs8BYdjNMyl%n=PSo`_}qxIt*hsRlji=NK*S z!yy7U(84n#T;9K?oP>G$_ac|X0dru9ch6eS;XKIC9Va=6qEC7JVQ0gg<;cHJWkgz~ zlns58ctd(<7$9`$t~^xXz{e*z1i|*K3Ss{s`N##sLE0I;7vJwQaU_&EonMT(Vi@oG z=wS-eM|Lx)E<{G)APfZ!T16v06txX(V>+Z}c1hmh+95avwxuCbRQO)#XROdcnX7Yj zHV%JhNDbP-ZtmH+x|gTJZi>kK#%rhsa!68r6}6Q=&;$`z8gtr}VGbvwQPcHtB8Z(P z1(w6#$-T&{4!0h)MxRi?NV@iTmC?U1QlG<#GrWvN7E(|NFF;tESp6=2Jmgm9ywIC3 z(_(^RE4YApdqtdYmXCvIP5AaHUreRWI0*m_3{kCO)vE817SutW42v^Q#l|w+jfO7u zU|Xoqp@uNQLZop<^NlUZN@H$uF?yPrKQM0ZxcDLI=2=mwa)y}@MbmA$!u#;jD=)9? zC8IG;h@CJJ_UTYk~xkXMTx9+o(ACNNpT$Le&otfr-LiI)ZXAEYrky|3H&u=4*M%u<<+cx(QBsZ9hHd z7%blbRkXO7*nsOXg!xjiif258I#`ec9fF^TvtB!$jgAq&(aF^wj?>nj*}dAAS=wtf zI+Oe?>3T9P$Rz`bjSw!9%^Bz1;qRtA2YO`_Ewt{#ry0Zq$-D?8jfpMPeiowy7`{+t z4OX(0xtmG_D z-1pLgqIu<1{_jE zvJ8|Ci#rRt>eP1=SoE+*$ikrYh5JY_r^k1Af?X>|xIVG){y6@kWcC*gvL37fV-tqy zA11!E+NRuGAhC0NJ7$kCUx}Q%@z=zKkK>E%zI?Xf?b{YteNKJs8cm4_ULh& zoX~y6X=cTSW=YiuP{9mP`9K(4bUn+NbrKoQI_a9UaOW8Rm;hf{k@ZtJpH4Vc1#<(% zCWg_jb~;J>JvSL;zkKN$2oMdiM?%Miv-&i-n)D0_U&e8W2&p3~=hNvbHFaSjQLT~j zp$sey`!8Rr=9U;|t#C~_ICppD8Y^@nomuw|`PWjiI}xwN=opxn=@PXpMpb5E2s z6|RbvQmPeVHUoN!n0fkd$SV;tkV-^(~Ybd-*ZkAxx zAB9pLO8+CpcH*Wu&L@LbP{I3p3YgjWpBJxQ)$qT(`0iK9|8i`}Y~g<1w~?Po?~+6t3>^FwkF5 z;?Kd3HN2qOx#cgDYie2~Jf6jJ<@4}!8sC%{_{?jdOYNg?n=8GnTbKzGUX5cT|BS}r zK_0Io5WRvXRfp%)7rcOH;bi%n-KzNDnUvZd>D&#q7Th!VAZB+Swd`CCOb&lkF) z5#Ng^%b6CSDKKi*pET5ZP1%G&Gv(fuLVDOq$pLjOr0iAI`Fc=ZwRspImDmY6#4n8DfXv1KvZQohRoWC4@?N z%%q>4gFX;3W(@|Qr6DjQ(+#J&A`Vbm6}6vh7liakKwHpL5M70jDL5OaB?Qn)n%YW_ z$Uy({-g*bo7=bTQRhK>_+S?~abTNQD%V0zRU4#cz4E1MxH-)K{YmJkF29pg5^_A#+45zf15ny)SKn+Lj$jRv`8Yw&8cw#I!dKQqcEqFXK zBcH}Aq2g7i7M{O?6c?B;8gR5##-RklEL<2w_hfdjdhhbq$@?xHq~l^G?00$xEQF@J z$iN__UAyKqUOqr9;HNRxum?ua6`>mdtdFe_JfrpiX)?7gP!M01wpqlZ!E!!>ARWf_ za4;9vGqgBFNbH-C_#HK=coEA{{gXQFAZ=bq97dW!clQDo7aIrY`K`DQ6(10N#t&5S z%|02>KOiS7a?&eQTUN=3&#}`3cb8zu7rsA|EevzaW*tf-0OszyciX`XBB%f!OlSz@ zg<_Wg%l`nRI>|>_;g^;S3{D%pCu=%%+Tvn+NwKNncU``a9(!FztH2-{H@!(J6|&LS z%g9M2ZKVNt2zg^=7^C+MloB{Qi+c+2Rb*qZ)n%W_C4{*}J`+;m{!;?!yA?P8HX)?1!2tGfAPC{=&N8sb>F|7MX=$E1O}61N_z++T zk~}S>De`ONuWiC^67NP-JkT8jkXL5mF}h5llk78e*Flsw!JAJNRna>R_*ykBdWgcM zzGY4W!PxY{)ao7f8eV>fQKsle@F(>0H3Yga7IW(?G6e9wKU(iYH5CVV^5WrZ(&k71 z6;A8muJ))Tp2ZmP+|L-vFjPg;oleFPlwRKh6*aKK_tGxPxGeEk+KDm!D|Ig&Q{*7e z`hDMP3cgDp%F+iEk(m~o!^7u=y5ILP<<~r$X@w{2>>?HHDmJb$#I^|;}a5l1g zLkKl65yHT_8BLb~CW=#~+)gF+#5?RjAmm>_5@NR3=pYvY32)fz=7|HP8#-O^g2*X= zt3HdJ87FB!%Y83+?s_zkC|?QyurOU2-riepER=E-t!Ob#ef_x-(9$W3nvS z;TzB3aoY?+G?RiJRyRxFfryreb0YV8OlZ=0t`9xPkh{a0b$s#`cm+Xj31~j(e8bez ziWPZLew6K}(xc4TMUw7$)^EIoN32bXaW;tiip7F0bZ`sLb}#V)&jaX@6qg%pUUPz0|fR0b~1Gbbw?cr1~G*ctY4y^F|Lw3 z;<;P*{pdXy=h+=`p{Ck|CJ6EgUCnWo)^R73wN8ZtFy}$llunmA`zb_ytV@gVaz^Zp zl6%n1wj%65*JUMdYG{0Ki9toGm$QN}I6{J3i~Dd|*cOd$h$@(p2Oqg@mDt2F3bv{R z*K;DCke0W7FP#jQ-(^<@ir!C%wfRhgJPdWOwfc>cXBf37Iuyo>nLNr6d2vVU9yVLw zb3zB@nXIgQTYQAC*+#T;q$s?4;N&Jn%LAICb3JMYPuH$aaRO4`KCi)d8U-Qnnwf2U zli8D7m}09TPvGC0^pUU*WLYZKqbAlENIx2y!toTX?}_S#2I%R$k>=cLLT1)e*#*j} zAWEiDc;ZjwJ=ch98EI7Qs;CBn0ky35X#?buIWs+Cq<85UeqV#7hwbQ;K}x=IThvL= zt1M4WYz`Iv@}vj;mkxN`RU)m2;7JpBA!bszVh>Ua?iKndKsm2~4BKwSWJ3x9mdK_3 zt!JbC0A@f1f(+(_L?@V^)-p#1yVU}I;zYTYq(m{!Vi>e_MZZoLm`jGtM@&OuDjUYx zjP@P1Q9|s&9)-XV~z01y7CwObqtucK@CCdlTC$L77>C`NqnnB)>tZouT zj!8=Mk6!TgksKbq_ILc+O8)K4I_LEgI9yjR- z2rjF3sbmRz3?}^$cOe2SrFUsPffCI0*?`%$hfoxZ>HVtBjrq(aCBV^ooA%tO^IOA8 zkCUfipCiT%RTr$762297k6w+TuA|B`GMtCy47b=r z;>XRCo^NGmXVnd5mH;9nhV^sH9EXw#4z<*!(3Pnhig{V54I}nzWc4w{w^tP zsfYU-p>=`*F*;Q@G~jz{foSygH5d`w3pQabTKV8AvV|H8@JqA4hM4JA_eF-|z8 zg~`G50jLMQBJ=36Cs+iOBV3~RA}sISX5rU^cX{I86Q+yRviFAM z1})sDOXD`3|;IIY}rCm3z~7JY0|e6)|0>QPgM3YXl5LcK%%>3jpr zAEAO$j+S?N>TTtd6)bBTXXj2bkP4bDZgT~?`UZ&z(C`DXTRgpo2`VUn=C(|9*ksLQ z*Q~0>${`I*)o)gW5M!NMV}@T9pq?@yj*ajmCiSPmqz*&RE0waly2ub{RMg}gVU(ec zk>*M83URi4HCB}lb^JxY1gz?i){o|q7&{OlP-&r1=)LL2**T?Zt~fA^y_`(oU;@}V zX&t|6TV(Fz&(x6eI0H6nO6g{k@x7s|+<-gpRkcV+(%?4Lis{e-$Y3~&DtZ-^7^VLP zK0o)ym{8vLoaiB{AMp2o3up8p%rj$EP+fsN{K&SD*`nG_Rd1S&W8I-oF$3Js%0wB{ zzwb}~5`yAWZJ1l2c|K0ZaGp=QFg;*#!=IH7b)Qgb(?g+J4{`Q8awb^K{9lEuW`0o zF*+l2PeRumfGKnfQL3hs*$t{$lE5v@my%_Ru|H#OjB6XOh3qe zpT;e-yB(t9x#Ov|ojB!>M1JKvcsWJQ`~Uv$|K~sd`QQEBpa1j!2E^YBgXA1#BEZM< z`I9Ee(J!RKOQ4TEhe5+X{=>g>3&3RDC$AF!_8f|1c8sZu|!)W z&XD`)Pm|LYD$K}ksE7re|10s(%0Xn{qb`XD@RWzGm4smfsn`~wz-d~FE=DT}qt$Zl z$vA7t&KXjZ;A;+pn`<)j3T0I|^raUo!t6AdeE=u_>55wuE?Q+hq8R`%DA@xAtO%SL z3GsnnXA>Ir_7h$HvidG2gJjr3c!n4vn9#4E)U4E=$sa?WmF5RrzV-w*9H7COgv*oD zf=E#zQRK(T=pxHuOwo!wackn3^5u+0LmDVQ$dJwCiMIaPiXw>^|6$>|Lekq*s<7v+ zm*C`2m>ZV8IgW$_OmC>Fx^r)Zn-Wo7aw+aoK*1Nb!ue=ftpqR%49*c!>Jm~!v7;DA zCgQcF@V6`yNCz=a3nOMX^H6WdPsi78kKMdD z(Yg!n6s|mz9%^dwYjhwlzXZn@5qE7Ke0iDXXQ9tA6=>EtWnpoD!k^4mf%^*m4i+7M z)|?gE@MBKu-)D8|%!S?*vLy=@~ zERMB9;4>AR(P)IFj4!sb*Ir-r(E!go12nspT=caA}O><`8l4hGZOA? zqw_E&RLeQ?J*x;&4!qvP>3h>pwwq?8?lH*nbxHhNQtuan{MRHrKJjQ@)9~0$yty7P zeDkWsE2jnd`4(@BPq101};d*jW9sd0*MvM zJY@CU)@4~mwj^@HHjVg|W5HJx$>^Y-OKdXHf%OE2> z-E-r23F}`Cgkc!FL-o)H>dY|8Vc<-G#IF{_@c6%fef)>~p_ECdHQOR017`FqLqcxR ze|-MpWf}kR>czLuAMqbQ6aJ%aNUO|mNL7QfI&8J^@(57PfeE524ci4edq{ln;CyeT zx%%}$ktx&rp1=`v-xMyjE>^jmU_$03>1RWK($6UPabw!|dFZc7WE%mDve!?B@;TMF z7}7V?bFF#QuNWAzOOteyCh2;Rn6#LX17&kZekzG8eB~r>>LD68?7&<`wcWrOk#@&U z(K>iz-+xL^sXl`VVjjUEKM`SBsPIv22txLw8E{{!vN)WXX^2%TfPQftWjg)Ml8`yd zNDUHJttBW^2sU?H4ZU!%FL#A^;5ih!FB%Hgi>*Tj@TVJ*cTaM8RFj+wB9lzR}rwgCoung(^2!X>&@8?xZNB_=@%_C18lIh1k9( zmMA!GJFXdXKq+MaZd9edDwb4e1=kESeH3zGA*I)+x+(dd;miuC4KEFmN(XF4+(s>e zKsnpolZs>fwP)#=tEfA;L-wzO98)i%EWsM9OP>#Q&ifWWL+M+uRRA!& z@BBIFE$Udd++b43F*len-I=3+N+cfv_wsV@soYaDJc4>m!$DLkOGQ%nTHt;_!X^1! zQ&pBvPPlsOhI^1OfF`H2CHb`5=)UHub zjw>#_9|J(?uhySnGm)<=85iz<41EKVDd#y*w&45#U0z&DQJ;eAlMPAiMDGN3PoM+A zMs?E>qKneuIn<89rON|9zQ}soGIOIItO^W!c?veCLkyj?FwoRXmSM#WdmiB2l_Bk6 zWiR#z(2e1FrP33U#4g5JPT;3ulC!5k9C6^I4p8_&>{-jb?q^sqiPH+>lgp=B4>_;S zlOe{^;Q#+o`~l6{|2~`KLz+^s-z@v#7_#0#7XY3{PI)qTL!Lk+Da#4W$mXVnR4KNR z_Cb8gi3iI5NsaaKe2C_5?xW^Rrwy_CpQ|OU#tr@Lc zqGbpx6`!zQUW`awqwRv{q(ekl5dlMKO5-!uaJtId>o84pvsnvuW#2$Xr_^z7f%!I`J|Qls^6#{( zLBE6hiJPeHTRiaShJ-4UIAYeN!ko80u!9<2&Jb?2ft~<85!K)pOTL^Az+Xm?FN|vg zIBf{21J1R&x#W0sa{vxB){sdgST`Z7U=~<*}#H zmW>2oQCs$HD{1j=gw2d&)rp~LD;j2!U7DG}ld@%NI%z*?QCx(l^1|NwW)oD2en-qX zkaB<|9jGby4GVjT;BGFO0Ahhr_@8~?o*-8r~RUAu)a||J7WW}NN z-XvE=&E6`vM>|HYf*<60S>7XFB7+K7zxVe_}u6!Y4i0umJQz-@(UOYXJ>S^r{_)(sn3=@mvO@ z^m`bH*uvEI{2Bvpc=xm2ZgsKIi{jKIV!LwExK44O2L}amnwLp_t>a=Emh|o65W9FU zlj<2usMB&KtWPo-XYdJKcd)x=GF#ZU%w5C{bjg^-?Rwn7vClI$xO&^YVRw~|eZd_Y zev#1%T`ScIv1(ey3KL4pj} z>hkJyvRKrJ(#^-izpWcwQKZ*PHjjRu@Zi{Mtl zO(sTgtgEfGxx=(lh1CWKEpEd26>HYdEivO|g1b|7@rsZNUnx^wHywIP=D8qdts z(q(CuHYvF4tk*p1CtZJm;nboL$dqVv0Y9m%;(}0W35JHQl9s3BBIEb0;ite}M6Oof zJ8mZmV=@1Xad~levWi6I(e}mVXi7}dq=8+L-m>&V__=mRUtFZ&(jEnXoI9ek+cMm_49@WNvLAPk<9&L?9qp}eE^n_d!&a>q zZA@Yr5{hIxx4NS?UJ7Qj_|X2PzxBZ#_|FKQ4=4N!r`bVdAK@5+u$ zG@T; zIZ~p$0;dz&1raLQhzL@}6dzGnZ57mEKGm<;>#R+055OklLENzqB}OIQg>WmXtr zX5)WeKKt%z1^@F5FhP&_pMU-T86CKoc4|+QeE-T>EsA~0M%)LAaBt8-6?MQ4PW}bp z1J_bL-?-+vPSH0=_kJ;Cfuaf(*g}aEQa*R2P)<&zb4$nIHFI@rQOW8P-1r)Z{jUIH zU=}4rPdpv$z62)0>F~|nwZo1xDl`Ie@t0U>vnBP`@tgtRYCr9c3rT8kZ125oceeg! z!(GAscvHa)_R!Zo@7A|AH#hb-b`IYC2u?kG7{}CcyZrM%{1cRKwqJL4-yI%oy!+AZ z?7D-k?G3llIoR56A8d4h)_BWSy~6`MD0UZ6Hq%S+0|Bi~iub+Slkpu$e^NqK1&d~Z zTMPq*jS^BnmpVyuHQF{gK~%J^C4vRzKr#*?b%xo0^rOHdFy1=F@C&!*7Ub;kM1fVKLgApVJA+RA1M_`e~#kO0hJ6Jt|(>oju z!s1bZYeI_P>_Nj4cnWR6S4My|N8Ca5m~Ki|`(B3e!ts>JY_rBUvGf z#f`Fb$dsmb$l$45&*a1SvoyDy))*;QLLkVDc3V3K8*iwOS145Lhi<+-uVZ1)E?)=b z)2Hu!+0$=>^g$dz7HT*t$~jX`D2nfxFRJSa^}WHn+#`IJnEjr(_E7gd8W+pC|2>{} zWs0!jC~B>_T?87i>YPMhMFLJrr35?hE`KV)eS)^wKko&WC+~9D*Nr5BJ?c zyYt(XMuS6*Q#8%gVVA{)85i1PcpKG~r0;N7c{-+!O2&{lZQ7I(l)W=GNS1#r0wYo3 zlL5$q^sfm)xz|28*x29cxb=xw!HVisP*6W_G*ELzMd$e9-#U-w) z9hb+Blumino52oTA?zhIj`|sOGeiFd(}wlCOqN1hEQjcU^8x~O4v`hh-K;+uC;?Ka z0>OaR-WG&X(A>xs#;ReQ5kEJDiW)$p&_#?|!JN;s)S)gT3Io#DdeMFcD}9vY$pCWl z3VJc2N7IcVdjuUZ_5d(QaF;<+)<(;{MQTw=HsOz)C&HiU#>rT?T;S7*+yMlgXd<7b z=M$-JN=p!e2Ffcywg{+5Gs|hef!~7qvig(v%3@0y!B%Upp{8MGk#J)4H2g1EWot<(HobBdnkS){WMChapR7@ zmsE~84rOLan;h%f$GywW&qG9jT8647I1iX8qVj$3*tIC|jS{&t-6?x^_=tT!&acY` zM$#qt`E8*e;|YLBzwiJP@`WG-lQI!Xr%+tmX3~WT2A{NCK8)OQKBZYB#@_1&%oNUUSx6#H;;sQ^9)r^h7@9)fD1Z*NI$hi zB>;?EHHn*b`DPBP#!2BGIk)WkZ6iv zg#7boe)x%u+zq6Mo-Vo1pDCbu^7Q7$wcx@$D^8$31HSC$2B1EA&9f=jJU7=opK?t( z)hC*SAeV)bbzn%~TS>$O{is!J@*6*{(I0_){Cr_GPrNXolS~gac-1XHPL9x~lm-n1 z(je6J#Dc7FJC_x}=x0MY*Vg~SSx-rpjywDHKma#%ii%pXH!muCwf%5TY8>8z^ z(w<~ z$M0`+4$3>|id!bW$SkM-T6KGU+~`2mD;x*G<)&TFsZ*FyyoccdCBPmxcjf+pw zmGFmEL#Cy7ocl4{gq&R&oOQ=IDkorFR?$31{>2J6TONLr_EvfFg}kPne}aj%c#6p7 z=wDEiU4}78jS{75~fP68v)sJ+l`3B&+O{h`-K`i8>{#?lsitCipE`4nP9P z1FYIt78eO18G_q#p4rEOJ|(z(T>FjyFG6dEw+R1KXt)j@I6UO(Nc9*!Nqw~G9#6V|aDNkD^gvcgYR`EFk*xEaz#}eTFe#aZ5`}P3K|5$N#=T$N>7H zde5r51hjls-RFTXzz1rgKZN&u=4X6{&Tn$O<>p2pGMZQ#qPMl`wmQ35gay?rU?bB3 zY(j$(fx}pHv+B{Uij^z1vEst5xMG-m^e0$R52RYj!1vb@YR&5`>-%IF$X}T2$&K@g zUp`CvbkEb}Z{g~l391Zo!qU2Ad7hx~Z+42a{*0{;1Rx z5bm6QD$K-!Ulb)Z!>y$xKGbc6KBw1B!Q^p=i^CgrHBMkjJ4*pWKRX5OM*K}1Z90YS zIt6HY5_`hX`z`P`AybA|@tWY7ZoKkKmaC=9dI&n|%7I6maBNq-XI|Sk{OOkk8lAqz z3GtSq@(ehj(YfE7-wwCT2s7^ZjfDL)7s1dvBncfQ9BnrgHi?3M;0H-xu9Uc-ItFl8 zmLR)d66Bj2mx!IE9&WICI>!2lQt&|H3n?mlHa>qIP6nqwKgrHcG(dQw9`el%>BDf-+4w|3$@pd% zyAxXWvp(o<`#`D5Xpm({;QUhiab??FdI;Kp6Eej3kZK>wN8WBbOV17`#uGGfCt^oW z!l92oGBS0gr?B}tp)Vb1L*kFy2sOk8`i&#o@52&p(-Pf2>>RKu1wvk~^E#13=Tju_ zt^4KK)L))c8^rRMFX0yp49H*_)6f}22c=}|Vog|l8+Pk?4puCp> zl(%N`McXLd)e#Bv0BbJi)}~~a=C1**hHj$TS&kV+5t?NK zg#ysP_BmfrARd9oNw2!O!I&Ruvow`0yPCGjWE>DL`JRI1Wwy*-2IWvw0g5dp-ju2% zN@Z2^WF;tLOSpu!pO`yK_N{VvnhaVa(ywc2TC6A~#s(~hTgi$AS=YA|1w$m8Qqu~) z{|s|u^$ElkD#Ll0WLd1~YkWCbZGLz`pD-m$(gpfgC{{#w`6CgeySX+du()f?0LjYE z(KSJc*Q#5%ULHOHE@0p;001B-hk3#Am?V ziF(iey)9i>E2S2%^iN~c;cq<5SrW~lTx5V?OM~7AIEYlh1uM6s3-}D+J}fC+jxJk#E>g1Y?QQI=yMtY*Q9In; z*g05%uxSlGxv6IWb26aA9?(|Cwv%J%@TYJ}HFlCRhKv9eXy^*5z``~k=7l0+N?Cn_ z{bYgc9u&TMQiY9G5p{M_#beKCU^JsTYSNAf4jey=cGsX+9Lb+zmV)1a*INhXTpbw2 ztcHCq=+}ldLV3@S$dIgdo-nx$Ml`xUy~KLDl1M3bUr5f!9Dh|}KW<%28c3r|IRhO| z#K5e@KobS_?yh5A9=ZDD7}=1nh)1`;$GrB$^Os>0ly97DMm_2WL974= z%g)>x$TFL0>mic&Tt2Y`xX}kZwKHPpc0c{`F97~pwFtf#<3~lZ zS#E%R)%TR>6wxvYDv_8+bN&*8;o}!T2L-SbGFMh#zzUmTnFNiRX=*I^xEj(NhAiRC z-T}-B!0T5U4XVi~8$-caj9D8+nKos`GzqRX&Gr&93R6FkZ&~rLmKu$HKkyL4SaIuF z#Ek*6ElZ22K3d%0#?AV}B>iJ+ zfN=g2?)wifZqWdpiU0og>383KTgHDsfARDY|NV3EKmOrGneFj=F4A%@9F)>s`o4RC zC%3da>5s3!h{kaVeEMaYZdiR#JJr6P!4YTYz4#jS9?%Q#kMH=Zr_Wk^{k;`JyTzqk z7WdKX?WEVj-jGLki^~ePVHlk{Mnef?{2`3tLUjnAG|{^Qqb_<|^RVX>S5S7wo+R)O z_u$Y;J}4(z5U}DxwjNyK7d7yiFGDy(7s`e4<0z7NIS^|Iqc2=8vh>t#NogbQ%=?5SUQpVun z0zZ+x<)jFLYFho+46(KEUodS4WGL4ZB3M=r9bYV=fRM(#^deJqQc%U1sdpZzeLy@5%owj`IU+ zN7pv8^*I)izG-1r$lv^$>3v~Zc5p_8DOA}Ezj_J_FJ~Mpq-PENc{WasTFq(FhdwD> zGC0NWq1WXeSYro|Y`#Aco3E@547T`QMd>iWbg}yF0hF9o9`@%a^ff$BKr#1GVi?+H z)K>eL_WMPXKTNzoq4VvbhNhtg<~Rg&DzA&#qRye<>T6YaAZG-La)o5zM^?(W?Poy z2wWCRGOsx)C=3mv3jLaP8tM{cuc=Lbo%uxAY$~$Qdo@iFLpG&JHC;l)Z>Of1?ZM81 zuaVcIy2XR6q{j|40>+4fw^GrD(;IW?WfuwQhnpxSosJQM>$%mie6El#Y~T~z#JC@t ztQ^hZ(JOwFlriAR)19SxL79C1awJ@ z4_1YRPfQf&^${6H@bn_NcJovn36Ch;;9BmU7XWfEgSWEdQu13wpa^tF$4JF@ne->P zjA(ny;WV3eKlZOz8x3Oagp(DYvEhqhHV@Kaukhm)neTWy9whxf(1kG?l#?%LsnJX5 zbTxY8w)RRv>J0}tg!3PRC5;Sq41M& z`h%OgI!AXP|E#<~laP{|!3q!9FnJuft_Q{^9iGcG6r@3YEZG@1ACeyPP&l8C-Bkj$ zKA74vck2fj!n^t8BKgg{8)TF=^HK&9WFD!&1p67vF7q@|CD9H|AngA=`gGuSX>)4R zHVpp{R!jJ^GXit;ukj(6Q2YUg74BW*!5;Vo7BkA=PR0mwz_JxoGoc&}1^3%7TVAQ6gYk8M8YX zgJGlf{aQ~E%>5RADw(HsV>V1G?LNM%ltr2ONe$}bJ2F9=LANI`6(Uf<WEGiwhCQShpLrB36pao2a?pf=(yY>k#7a1I@ugzBB3MVbI%VxQ;fOd(R>E$oc zpGb!cjDd7_>8tHrO7f4MNaHxud_FKZ^eg0bM^l^8z;ZvzCM{|OSut+m+l@cVK@)VF z5D!t_Vxi!ooAfIS7T$NBXIF5@GCe}Hkz*v}1*}9jD+tq!pNJ!vjewDIGL-8T_NTTM zzey2_m>@`pI?4{lSb>Gnv59QHRx1G1y(B{oePN3j0@;~CBB4~d97*W5O2vY{PLSQE z!$GkcJ5pT${tQdqs{-e&${cN5dy=9jDT{oSuo z<(p$^I95Hw?)8@`{cWrn0EnSnnSw`U;2G-+n7PSa@E}UyYHW}?i`^N_jwv$jNUK<$*C6T~GEYfqk^K5yTwa&AM z-Egy%*}{V8VwB<$lT)=6&nGq)rj`O|)4)zc}PdQdPS1EAT1mnnF~u4oz6M;_q6K>cs!jWNmiflvCd2aj6A$v8(Z zr;Lxd$Z%X^9MDYs&(o*hy?S2Z|9$n{caQj=p9}xPgII`N1zKx)&bS)WZUQw0*4P9i16}O(-7#Za|U0 zXhsl4)27Iv$Zs{BshXY3a&e0VAnM>l9ht)KU<$u6RVnBm{>T5~c9B*kz4VPn{W53< zf}Z=W2=TTc^+Y@173`I~mtp!4KjQEI_TG%!0ihH4bkl<46zz8)(+Qfm>6v8HvyX-Q zH_tx78Pr{Q|FH@fB1N=7D#nt;tX?!qhDgeXj58IO5R)-@5?C^7V^qxqFxwQJUhY1D zz-dVT$XOoj+cQzbDakdTWtc}Q#t9Zt;mO1&1rpE{4d-^T z(umJ|=@|vvu9HE(0ezDW&yCd1-1FAUPjhZ}-_7-sw0}KEfuUVE{#~U7r?bJWlUWAg zKG$K3Afx(!lqO%qSP|0SpnVHH){%l`c-h|m?)o9HmbTo{*4Ph@UCSMPPu+Bl|Je3P zf1!Bd5c-r3kKvYsjjf&g+_K)@+W&F6{SH`D5unn!&)skK+gm%G<<3ESf9>u4Zr$A9 z{hN(@ed=C&=V1TG``n?yyk~$nrz_oB((g`$0YPbAab0!Hgma%9(Y9b*lzu2MzW}iu zPAFq`s8}wBN%v#n7M_0FdiL%A@C2{we{`plYZ97^Bhj4;-#>Hx^sF51*0kdqFaz$A z*UY9Wek7&lhOLp$)8Yb&8u9a!f)(~i1-e|Ci3ygmPlxVw(mVHjd_YUZpN7-$G{<7r zJ^uk684_xQ%?%v+k&KtM6(LOlb-w@?%7y()d8@%AV*L3^>!r#_t zl7rTo70wln&0>@e6B2ZFMbd}TzxK|$D+XCMzDRw6oeH{FaP%4JB40R1d0B+(K*R95 zA1Ka?YR0<$@%!GR@!j`5I$%)FW)pB6jB}Xdunv4i+_{?~=o&uW6<5g!do|02Rc$zA z-so@KYwTkbp9g6xl5$S793~;XWdSe+EllxV7MSvFjWhhW&Y?@d;`rhsI^OF*7n4&u z4r#>4L@`WBGb>X=&;)m_u$z^wHIfvnDem%GfdD|a3uL<#vGRvBD2~xTj#?JBf4Bda~j$?hKZ=!I^7H3{YZz}y4{nO)1Us?b=nY;bL(5} zce`&~=itY88%P%m!}w-*cik;)k-#r*icc`hK=2zGLc;&4Q!>ue5gDiC6QW(bF2p4Y z=7RwCh=;D+M9|#B;2cN9`vQdv@--Pu#4u$J5lB1NelF*WW{0}r( zZeh>VQBzZ1Pp;|M-@jgQ&t3N-?SAw_cM5!1puhdh^-l|TnrGc^)=!)6sXI;1U7mLR z(h|wj!!G-eZujtD@9@CwZ+w5awZ8!j0x;{1NT7+GL!$+ih<2_L5W%p^=dvGqBmUz5 z3w!{38~dHzownQG*xuS%-`HOvty_X6FD}Yl?uL;8H+YB|l~)%T8ASvG=mo(?LXf&4 z!v+&VrLk_14gIx-Y>K1{1o21?r{@Mrjt*5twBN$LM&DC({V>VXjG|k(01+XT_1HOu zXP;k;F&b+;nS=JhVaFZrt+x+gk}@jPvT|5%h~Qnxi@^huJZg_95F50Bc&o#h-nFL_ zLz?uLhuLw1*3BBMC;c7%UPlOYZBBC zUnGEtr(kk}`C3AM!eou3;IkvQ5A(lU;=iw6mh1nYzj*rW+rRMm@3g>rSo4I(Z6UMF zGF0o{FX;Xl|9y=AKE{6^+we7_|MB25tY<@xN2p)L?{w_kEdIfm(5_Y%ImMt#R&$y+T9Dv*W+7p1*ij z#{Yiz;?>hf{O?ckzi-?+F+A<_*lM^U)KVYdaNdux>~7p-SN_!TYe~qwtB2WA;EA`z z{0j)nTua%*W1j6g{&0JU`a+sBN~~3=&MbR4cv4j@d5U*+s6XH-&^bk#k?>An%&ISa2#P42rEon{kspJI|W7OhwT(eH!|Bvqd z{?@?;u{rG=xUKE&jrFbe!N$8EtscZ3sj$q1D-&WFcj_#~2?Ag6=YRO8|Mp-1llqU~ z)s@QN*c(&p=g9ii*VdQ@;b7plcCf#(v)v5_#1V;Tr7g2Uw#8C2{m zKZK5=arklfaNixYJHK6NG}f{q7D&cvy~=#n^+KW*vVLJjA=NOY0tTat1TM;krXkd@ z`X;A?Q9|Wp)v==7M`fXOHoiaH*nz-zOb=Gxv6$mAEgFrEp`r>x7VMP$*BylXpdWQ)E25UV%PsjMF$*>?L zK$rm3%}8@G8E5=QY==gF;F>(URDQV~f8|aiu9QON5K0?sKZX)T)3<#1(b3Pdq&I+I zD9G=5Af}NS3>_tXVII%}0`6>tU$eBh7|6e1@^`|m+A#;FV;YUl%!gBHEN5Bb9e1V9 zYD}BFq3h>#1nCWDX6)KqO*cro7r+rCG*c7~OTu7;5t=fDH2HX7qR;51MLrpgh3PyU z_9n$RzeefvsxiS6NA8o4!kB1#S~Co#UY2hBURt{&-pE0ycgnI60;p2=@%q@EjQd&kG3qvE z*D&klZhgh~W%NkfNBlC|H)dkWLKG%fc`Jq+f#4_f3hcPORDZUUDIKw36g*}Buhzrt ze3uQ+iT+6DVQDxuD5sP;6~kwkbI4hm;`Kq}lto7$q9)jGhZ3wQW~l+Ai(e#{T(uo! za)PK>;aM8s88)5%`?-XqiYh@*rEzdu=t`Cotv6yv)2#li1|By~I{2p*cXYV_?)ZdW zF>M7OO))oL^b#{gf^6$iy%qX`$CsCpQ2NLsC{5}6eR@onx*O$W8%L#|L(2C0%bK!w z0j!rO6o^YGEj}V&Q~c)~{_GNgg&RL;vDCqXCCT;CeQs z)#EH2HHzyY>>@k^OWlRiyR}-kX;BGXTY)uss4|nW&aFPEPV2U+0J^v+VV3qgi0A!? zv5JF@ozkZJby}Y*R&Y)_rloC|t@^nZBKpFreU+!DThL=R!tPBe9*d0J1g24PF3V{q&Bof++LASRiRE?XcnT? zoqDl}ZpwW)TeMx;(USSWTkpjM^r+!^Zw=27+uGmYPj?UMJVQOKx|CT7w7TKk1 z4Gok70HB)IBBg5N)DEH38V^vYvpIH<?$61dn%ggvJk<|slg+~J@_-$? zv~57o3^MEEh_^K2S2e;+baxZwT`&$NLfb!iW*NewG2K8ifd1^yTYd*YrMj2s6JYSr3jEQNC-=L zSa@S=Li2E$5hX6B?lsBl7WVeno6c%_H=Q4Mm!8ldV<6P*n)*b9atjWK9k=`QJQ)idmv~y$?!_VNQgeR;d7pp(Nc#0f{9hse z?|bQ(izlZP%p0gIjX@BF@A)-CA4{Qp|!0d=KZI!V`PepXZf<5`TA&!bTv z4si7|TA+&#<|3S9&e8kNNHpa2c6;5Of_M$P?}9C7%FW_Y=`Y1YhGXw!|QvsyF!1(%?AOlD}W1YL8=huwX{-}TW zdN?J(;kxO@*|{f&(MwNqU(MG3JD;RXfctgIe_~U>?oW-otUI6J#Q};8fBb38eYF)K;GSMN>Wv|bJ_5JIu1By?PpG*}^(h>Ne;&wQb z+A(2jzjN38>0jKwhbU3}c_=Wh5h*lc+Hes65u;LWn6^ANeAvpQ2xo!Y$7GQ8G}cl# zGWQepYnRM=&>48qSP@P{f;_ZvtpAe94}qQfvu6}7%?&>6c(q6`H!Oa;yDCq0}B-#g)A$L%C&7`cu%v+=IV z*S_LDd=A5S6Dlt8+CwJrZsU-EPsSSWC`HOY@~)eb++5+kOZxpv-={+v{-sbU3DeVU zK;@v!2yzV?jUNb!=;1ed1h1W>s4g9<1YDDjMr6u?0|LgA^xNk-98&Edq zhhVrqf40**+_uS{MC?S&DUe`)61vxR`I;J>1~u`cmvTFtwRI~L+wfz1`yED8lTWZY z<8>05A{KTEQ*&mAL?A_yJ|Uz6T~|Qj9fxNjJrlV|>^Pg)=I@wzWG2kt1w$f@qkc2Ol=v2Z*X>y zttx#Fm?-YTV5lV7%6o*Fa{IJLG#Yb1R5p&4225rc?9ZR6D*EO|*QKsg6Zijn?#Q}t z;Gzh-An=Zz%%w#!!CJHl#yoY9HA06MQU;Ezrsi&u>(MH(x#?wK8@&|L&J;GI53iM; zA#;2;=^4T#Qthrr^w5BVCm439yDG_aeczwr$sj0-8LyZS=2T9kIdgq48vuwvl6Hp? zd@YLP-2dt{U200=+Vf2}zc-J&pRJF>{zk~yFQYQ<{=zL0zM)3A1$NUKN6Cnvi(}F= zv#Wnyk!z7Tl<+JnhpI`<4`&p}Q~7v;hRf3suYU-smUfM|VB1;WI^8(#YNT4$Tn5KD zxM{S!vydw!d#0)|kw=d9w~`j%tuW54n#o^Hvd&UHf!v@uUL~{piAs`jMa}lrrBFbH zK57pPq@Ky$$p;_$Bx-!=#?l#uFO_(N^&F-huIyprQIzCv@qZ5V(T^pPD~g`nmH?O; z|9|%E+4Juz@&9MvzI=@T|5WjRn7e=x>D`%sZOZJZQl!O?jzjX_we&F<$)#riF@fCO zMM(Au{czIH`0TX&ng4=>XFP403(fu#!p@c{to%uVDhw}Ol7E|^wf~fW0Wa>DzX9)`luB*C0eJG-{zhA-9Ut;I zM!oMZQ-8&M3C=`A_^?a^bn@g>MlWsyAHB(a;MOcP8k;bRcwsjh-XC0>#V;uqsd?>cl@cq1`jMb6btLlFjYs%MACUL8AAH^if-r9u+4r%s@#J=&jDNIIV3R& zRJa7W@*LFrU_pReu(ISxW2oocrgq$uhI6ikyFG;A-h0vH26SdO$$0{lwB-l*v3lz; zTY(5GxBzJ}rmzRLhEsTr#YLc+%b8W<0Ol{8o1r8ZI-*x<;`;6?S;X-D5by|(C|2E{ z|Mx#3S`qr72gmhMo()F0S${uCyB{4`5=g0+Z%Bs#NR_`Uec>lJKpsgnxftn#(kZ%4 z!K%8SL1wLl_)N1QUHvZo2;guWr*H!dF}z?TKCe53P!@Cp)XYLCjKZV5`enmp!$_lk z;a!mo!ZuZ4Kgr-Ra0*_|wm|YMW<94wImx58mQDIS>O**Aa6aIBg})R(q)BtOn+;CW zA#DOUY<3CYSFTba4$bG~J(&|&V)mmimUpsatka2yZN(iSi!C}|cBJ9r_v%K_gj#V& z?{O>Caiadw=3*;XkLPq%KMNIL#@P)^ng38-(Tj^~;P!7ZD1)nvb`bY=)S(JB-$O_T zeCa_th6Cu)Ym|&OC^-0WtDE5)03R>{gfqGRYr27#V7>B)Mn%2fc?*P7J#T~t+3b$+Hz~hJS<>{~slM_bbdF!RfP|IKO z8$-dX9pf-4G`zqL9T|`NjJN!5hdm6l4t&jUACnawPTUseGWTfvWHO5jT)9^OgZTZV7_Wx8{#-V}kQc{R>gY8Zl$>Dh?%`Rgga*P< zesO)8r&018yAFW{93GA9mXVDSFJEam$cQF@?1TSyj!~j^Y0cvgV_Gfp3oai1DaExi ze*|lW|3sD$ViN3g!2sUCZ+!Nox8<3ACM+a*q^_F(760wr5m5)@ejvZbix#e`0czDh zB0dx2h4h55j8^!zmYYA)CFh><7ncA2Y|7uCAI~=$&V56)<4kA^$>iW66ubp5kAeYi zIL#iMBr<>IW&%06^ip=RVw80K%r3Y{imGSeblvhdr9GG^^hbKT z^f$*?!ZNzxMVRTvRr0)ch=WN1eUxW6l(ZWV5u7ZJ^Fa$5dw&z6*bK6e?SBoxN@I zN2s{-_lypjYJey@7@i7dcm?yM=Bp@%0|iIpn$KE$YyL(vZiV}R)1(**podgm#SuL2 z<~K-QoO|M=KAQ~LLoD_8-sUmvmUxWa=)p;a98Qhj2i-$n6VSBn;Lf;_rQvq=PO!# zg}mTSQz?$;-#C_H>*lAH1RjOqm(umZWIk)>3C3X1#p4304yc1(BYwS>uj1i z19La^%kW-!Dh9IVmAU}7^B1z6cSs2Yj*n(5UtHX(v-@&-=ld_M1XXq7Z82cBj)4)D_reGr>$zS$g<`G-9{Z?JBN_%?clJ!?p` zupGqG_d->v(TA!Qd3tHYF)~Lt(Nr zwC8ky#=}){S6m$GFGzNWFftkn=QBqU6K$8m?Y}q1`FmsP9t2~?(S9*zUAs7Ke$XaxHp-#?q9$cVm~6?M zMPU^a@RvA$^xkUTOF(Vf`wHnc%3k_>Kx^{=6k_jv&u%8TQAlpRtHyo??Cg*kGwM>E z;8Q>fA4Vx8OV?xv`kka#3wtH>swk_-l~*&m$YRqf8(FXqv<3chz+zuXhmY{SbA`Oe z)3YXVB*l!80sA_Rd~4orkO`mI?<1ea<(S1=dMw`m#o+&{3;?fMr<1hbyInDMcK!c% z&%b+F#{WHg_2T&>{_kh0|L0LH7yrKrNGt|b;XVeeJ^2VhG>jewy6f!HLulL+i&62w zqyTn8el0CPn8Wvycl|DA6L>IXS30A>$)rxzmAYd$dce$h%QykyGmW=!Jb?4?auT{( zB5woUI^Q5Xc0U`I-cxE47W|hVH2cX@#9U=QwaYlosfwY6sQJMw{90i^Pr6w#YI8B-m#9jyIF(vSfDeCS9HvLPYOb9K-4!Z+g z0%dk%t^~$!=w#x!0-Q9?C%NsqDFh0Jb@nSM6a?N9`2T$ABpPVAY79XwSh6=6^$~i2 zH1@4@_D%79=(Wi;!&t9Pg%B51JCVg~y{7 zqe}n&Zv)pjHkztoRj(9|y%eLcb}&_VUZgv6JMMLguT<010SSmJU|Prj>0h*8;z!!J z0#|Jd$D#iO2PvaF!^{nd!L0-|pN8x4TOwR8vUtGWS33u^nv$*Sowk+xGCABnC~o1l zjY_P`lR)HvT^Mj*qE9+&tqO<3PG$?!uKl>_0KZXwWQDq6Z7N%&9?c=ZWs!z`n(KN4QYbqTTwLa7|A<0Qv;X4#PVI7S69S9GJhFD3}P0414cGf z#wR(3CLqoLBa}3`9+vVIaHS0VwIuwSfVhNY4O0jr<_+FY1@tY@GezOzQ2O_g>huwjeP)30}!*wPDNcA#wsKeh(OONHM!$&TlzxM12s(2@((q~A+&az3~!U}$^ zxFE6>zW+I?JE#3|tnVWVx)ha>1xok4fO|HK3K8tKv1djXzI=i-mCR91`&~N538O;KF~wlVmIAwoZdGgXXs-pV{1+VfR}^ts z#u`fGnLgPqkVl9JvL>R%nw(>4;;eaMb;)I=EP%(?jNHYFL)kQFt-${Qk8Ei%aN#X@ zxU{D1&KeNcknzA{F;NG_yF}m}li#8=yUB>y&}<)v?_o41B(#miQ-3>VUT-uu=v2qOT_W+W zartnSM0StYNV$*FAq^(yppDx64(P}NmLZ`Msd%b(eE+NkUKG-yhZGyBD8t($Q_B0B zfPUl0p-&jpCZRb2IxOHpME+(haxa)>LjhqLg(($lo$2iXl9YEZJkpvYWq`dC)Qplr z^wOx=YfwSa68|mBdz=v0{I{YL)+$?EkOdlNOn#1}K*)*E1-JA`6`3$4DD#b(HI2p* zjr1~g`7*a1-5A*}Ssz6e(BWI`#64P@a-JakM7=HMhn7}5gFSm@v9n5BpKE)J-*rKQ zT`|Pv)joZd8^6W)ZMvwdo{CXZgz=uf=!LCnY;qvs(+`VLE3%0%bAeB^;|ABvO|jDI4f*H{h)5RWQ5R~IErC&; zZPv+6u#JLxl^r^Y<3$XA8$tp-M@{HKq}{^QlR&&&9amoHy_`-uPeneZPnl4S^pZeUD9fI2QX6?At{ zua6^6zf0+XGhrxMBD6(U?OF1s=LhGuLq5o$^MY&kJ_(oeU70ZH?7Z~p^t9} z?N9|feB%~&G6%2)dw!o3R2r%j5isEP-UCO-B-Kmoyt{n;@A#xsUk;YZ1| zYMXI6eN6j(q**|&a!#8GV1Q|<0;3hL0-Vr2>Q~nY z^tj9_W7C5zn5n5?nuK#)R5(n2H5pn`rn1B#Px{TRo%Xw}zuAaIQrY&D#n|FA$gLTD zloY0{i|7Z>T+n~|7ZFIs<8os0&BhFJS~7G1sk22%duFF_qYU~t70YNIXSY&jh{eHL z--Y8hpMQhO0^LBd30yERj~1jz8(Djw+%rKRB7@NmpaX%&53DPXjv!4_+Z3WiK#Fih zC%9PNpa_}!up^mi(u|e%cq)f^VRJb5x|O-6JclVEh5;BQx2 z=>`A{IQ3-~V0o#YH&sma!IJy!;V_%PLo}>zw{l3)Y4haL0mtI!Ks(PZF4lSizUe-H zhN;FL$!{QdkCNGzJ=vHpX)^|8lu9fq>G#F&A{p)2^+6Hs_W@mybg@%0PRtnu)as?U z*rk`;z0LoVnH4h!bb2^%u;qL|rY?V=>saTpPnnaRdZsKSn*Lz|8_5~^S>qHoK4BU> zK=duw&ER8lWV_*#vk*dHoRi$wVdC{|Kh6RFfwvBPQcQAOcG+ay%?2XIDLZg>iu%Bp zUWpEW*mIq3Hu4gur!AW!3`iG-=VR=YQ{bCP@>K6;31aR9&R7?tG$#VP62MbMap5H> z^=-YNcwAwN239~dBMD5nQb4`Yz^pgfk;3Pf9vJ|@#3A*6(BlO=QA|!LOfat1mki65 z%UMJ$SJhk%ADS)|DzIcbPP{qz2Rt}zC&T1i7t392J;eY~iy=MJ*4mSc(&4t~HpEST zfDlkIR90m*C=v^k9Tyc2rd(Oh(_m^*g=w%qA0*Y5QqA0r(=CT1{V zMH@=0HdvLMg7p{^%P%GTqyhOje=7hB&Aolk+dOuOF-907GBoPYzk5DM)l#CAH;w_v zqoZwyB5WD+CVDjm1)BmkVt9D-YgtNt?SlQ&zlgyH_J0+(=sOITJf$Fche4O_JhrKKV#Dq7XOG^bQC zu9V>9tx|svnNsGu)ZO&)NhEs<`r1sqB>0z#_2jQMt?SA=Ad2e;kV!;nR&ZOTkEN@C z+Q#Q;g4OyS?E`}+xbQwQdZ^N*-4ME~^ttk-I3?MXuPO#cJggn)pANz678m!$%k(|^ zMdAH0A#Xdl1|k70RR0jF+w$HA*OI#ao^Z#AiQKm_YgsE)@cr5ja8Wjc`lN{R7H`Bj zx$ZhF04&&Akc0Ar zXYHw98~UGF1w*fK$0;)EknJS^UYW&FZE zgU)O%c^BNj?)}IC0>EQZtt_*=pc2SWm~V~u8(|=%KH#MWTjk#Vde}4&&Rp=~Wqtav z8AgLGUu>ng#{iCilusATD`wRP1K&%DQZ~(Uaa@5$k)Aoug6>#18^R!KHE%W;q=YI4 z7gb&iAKQ>Q2?<763BXzkmNmez&wNs(n0mSvSdHWi5mr;5ACDZ^=QX2`jO({M&>W=0%j>jcZK;x&&2Jk{$R4WcpDI+lfsMTxSNzip-oh0p;%MG zah8%=x*kR~yB=rN5ekC;ZuG>#?-65#xV_JWa zdvj~A-4mNIrL!E-!I272M427M8+sMw0qhVs@Ihs(h^>)lZQ<(pEtUF~qc*w6KJ~U& zd7w%Y`5_<+dr>%tk%SbQ0d_Fjw$(@ENfL)EF~%W~u)5!B67L!}iqNYeLS%7*Hku}4 zku#!dgm95ljaukxkf@@&#DM^Dg>*=((MUbw)I>5XF(7m1k!-a%dM>qvI(4964vS|pl2Q5n^ zr;=Wd`cR3fY=a?OcF#t0r%#6TWyvYzez2_NA^}t=_cO#FYPz~I16Z{XK7`;mC|L-1 z_j*VgzI9?)~omZ#UoVzBfjb<1%rax6aRsV>Th=QaZK}RT3t$c_E2n>v9klFfQPrv>4 zRSEy`{M%=*9`(O|lK+LAKXIpXX3ni$WNFvmFRy;@40<(%&am423o_}~xc-r8o2u#m!{6Nv0l@j$&E2)b4jQwIEW?f2*6Znlf}gq z3@Sx1TOxm@;1O=puID{C^l|?SEiArZ&n<*92Yl>nj8+UpdIO@FBaW3Lb{oRY)j1kG zvc*L^Snx!y>WB&$;GYqCpbn&uT`LpSZS5RvyrCY(-a+dz-=5czu%#4VM>V5Q-}|zs z-$pru0Ulm|p)epSD}eUT7iL+7(+LC(i{;$^9?KSF;8jGnY6fSCXmL6*8VkFm>KFhJ zp(M^Yw56YnG1OhffwLeNhr;7ILsMOYWL(rH0`uYammCF*@1}7fTND)H#G00z-;f>Q zr(mD_xO=$o4%(gH0=y0_%^j?8fXEAUC)T$YpFfABZ9z`{`bKB#&5rp0Yj1bA);3&c zE_78R?!m`nu5CsSxk?Ow=EXUktjSt*}dP|W)>T+XC4+))yrO?BV z5E_auDO^AO=-s=GH@oh%pLIVH9_DZh#RvSgX2szDljDv=i|u;gRiJtF+|Rstd9+Qj#A?TN+)Ww4!4>hx$rSh z9Q@}&lJ>9CVb2|Iaf4{+(m&#D6#g0KS+tHZ2ZGkA??1`++jfV!Msx(U$M#tr41g1t zU~Jx?tC;i?hWy}!GY}K1n;_L3lhyUUU$`7L&Y)$-D{M7D8W5cMM?90FX|PGgM&k{e zG4_8dhD1M#mn@JY{L!w9J zgI>AsxyxdSY$FE2tZ|@k#{H*{l9I58=KZxe>L(1(& zX-eD*ZK<`{S8%55o7o!ADcA!jGmr&BrpS~%WF1dC>AO#u-jxn0BW5i|z7?<(2D@b<2TD7{$`gUZ9 z30%jRNe1E23@M2zwp8zsELyNekc|#>Bb#z~^-kBo9+%=Z-fGqE0Jw$7JA;}!^vG}u zgoTqQ0}sBdC}aRA5Xew65H1=(Qxl+k>A*^An$?2=Q#Q1#ps)bKKZ6OF)zb1HVLWXF zBG*?N&zA@ibOAITI`dD<3v!%sM0U0DLO+h4#m0<*EWL9-UTwTwnz9tprml)4r5%~Qg~vH_I*;o@~rMh*d@p2nrGn}X)pv2FJfyWQROLq5njIAY`J*7y{PqLAhZmLtM)RYLmL?*B~P;ECMTGYEh6oG*$kmB|_ME zLfe>if_7o+3?pIn!9oo5JXC1RAX6oDR5vRL(tvqBir!z)ch!d?3H6Q$NXQ_9cT{{N z9xpf7#()=_v2=i^y@3^gsUN^qw{X2Yd@^VBemP=n(-O#tOi{1qfM| zr{@d>!Dr37GmOyQd=zcH=eXP!RJ?U$B-~~Prj!Qx%F&S!?M z3L%jWkLG7v5%iXs5vzHMl{+OW@X(m_+=nHl!WZ+<3g$sL6{HByTM4}4ZF>5x%zW6)O=VIpz6IVk%^P5eA-rbF9?#_oc!^1Y#ciun zmQd+a36({oQU+$h2(HE1CPkF(u45P)=Ik#eW{f^ACp>NkW@naZln1;eFOh^8fR;_g5O3c#T&k)*b< zO_D#s&WB@Q8L7zZwznHab*Fr&qhUaViY+fS8vA|#+JN~A6yiV;uSrDm8#wDLh-&nQ z07PlNS~VW+Osi?hZyt$o9{GQ6liN`OusXEYYz?Se@L%7(DC57LJ%9P?)g%7vXX5{% zAuY52u-g>D*@N#TGI5Gb4RMC^1cRk6G z3P=Ursr&E;Da9%2@Isg*E_O>PvV#$Isvr^=^d9#W%M#-*d4ft$Mw>Wv)aRkUI?+$T z2u%3Yy?!#3&#k^CJcgj7HIMo=2{qO0T73fr94fHEwPP&`S@B7ST} x$+qtngf7 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

8ib@6{|*!r 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ⅇ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औSDS7@)Aw0R<`m)dK$q!F~{jIBtm$fEsxN7EkUk zyORgY?&RUJJ1hrNVq>_Arw^_t>>hXGDP7E}-pVu8_eqXC$7@_e1Sd`86=NE9QbJfM z^k;`#gomHgNn)>Z+!33{6d6Y-I&<6LseLril^1=`KC-R$_=i*Z!QBrBfpEBh zyzI9={2)Ax7YYOdv_JaLv@2v2c7yB(LI_s+ja$9R!`_(|kckK^0kDLr@q!{T`+Xcd z+vzAv0wk(FJWMuv_H)xg0j964x!ebBX{iQ$3up1y>_= zVtCgVMR!nM7U4V^npehTerOI%v>sz`uoO#y%e@=a1ZK45z5;mX6fHyWT4y=lW^bAbrqc9+v&LHCM!z zx?0Qb&}Wlz4)7KF#-~f>Kv24htOeN0O*hIcA_tnil*NJH=M`wBZa|+xo8Lv)8$_Lm z6B~CsEi0$cN0t4ThN1wiI1dt&~Q~(+%ytD{8^|U_*+32e98WDxQQdfnjFgH4K{leuPr<%f9P&~a*&7=Gwag5W`GWVN^@&FUQG zRXxU+)*?qEMyrNcWtfrMvHK2RF*6R&*OPp#tlPSO;5Jakw|gojia?XdA4^{~>tq{Z zJ3nHBm?IMPhY~!%Yora75hso2(gMKG086`Ng!nWVAzIZW=1a)^D>bUzsO-O;oYuGO z5x4vgExGpchcpSEMSmV#Xg>eLgZp1RXw?6@fB(TP|HH4s{}7fmrGR+Grl1z#MPz1` zopvE<@TjG}B-gsUk&<6?MDk-9AR;Ng9+Si8?o|Mp(!GD?G<2wNs6ghoc-RCOKEPAs zfEXNxoTl*JjQOJQ=b`2(x*|eXr7AA8*ZfLoh7e~hP2pg|(#~ruJk{k&4Ko|GvP=I2j3i4Bd`0`#yg0pZ{O- zgXXpI6QG!O0YeasX~w2q4(k)YuNflm=OmZ^C_RXxLbD0>jtF%PXoxsf%{Qc8{G2h( zP0Sw-+b~G7bs@wlOAb{sXcOpS5HLn7^ImN1*OByTPkg7ak@h=uJ?ObT`VU6m4YOjuLwl$v0=Ch)qK9wU z{dr%kgr=D3NIy5fZWdIa8>JHvoj9Hui-MWn)NPpR5huSQ5Hu|39*qzFdg&TMUqYR2 zT+dEt?>Vd?1V70PwE3{^uamt0)=?#Jgv@n1d*6~`g+kz|2|_PHAyYgSpmii{SHmYM zoNi)gUqb#ioJQZsY1D~zdz7Hl)bF+%DEr(^!0%#hb|_|{%vxHTX?s!>VocdzopW8c z7g2I(^e+@BM_7bBN<|+i!7o2zK9>Csm2O%qN29X9-mGD<5&g#Q^b~1O>%K3tDlbzL zFU&1H4_Q{2S%~%*`DDneUGI0OuG4PLhN3B!MlU~&iooMD1d2^hc=;Ol`!pXPWkZ5J zXJ=(D>C%u93=6Dcza1|y>fj&`VcvJ4Bgv$@?MZ?8@kkhk065sanW-76+4EVA77jX3 zX@Z5&4(9$P&OI~<1`(k3j4`3h7vmju3dpv>iQGAX(-8Z!>ob5;fNh9bt93}G#~GAX zmnFE0kdP3{k!uk<&x2f1Ev*-2kwanx?g97?#zcrtp*%uiKlgxkvjZ4;sLaCWk{{Fo zs6a=DYix6%%IH36w=&dFc@A{cw3-+VWzgyZZBx`oy{gbILS8Z@Ep0?iaxxZ%ccgeG3B9Ki+Uyh7pXSzMq>wOraQ9y}-{+H_1q^wI>b7H>2mC z@J%@R;$1LTg=UiPM#y2qm*84r3~SObXjWSrp2wdj2K=q_{*TK495dj4F#q$TM~@$- z{{M$xJ-&bI|Npi8|FWuS0Dv-0vSG+(`J13Zu}qC6zCd54==)EY{W+y^zB&W+{V%$B zVegL1a#;Ty9MI8>wsAodox`iBrFl`5gZ|MmwO!xi+wB2O@%wH{61@`UWtsuE@(ilz zsFPPBjBXj+@0Bb1&poG`W-Zzuuw0F(2bqGUyfJ4-asAeM8fBJ^&%J~N2IAh1csbQR z7?+d&37HfrNoO!is9q}?H$!(c^zQ^)0w1S$2q+4V-10>KLOjv2R0z*sZONh~?+QV@ zv`~lsBsi0(%9nZ&HvgjbKmcg-=Hk!m;=z9`sU17PJ%N`x=o{!~^E#}MQ@CN#R{GCc1W0KC$mJ{c;IG(t(Pt;?Hb{uD}91Y7QA;I`obUOLXoXeCeW@>WExBMMs3PbMi4}pIA4zgZ#0vW zwylt5Y@+KPc40VeT{1ykDa?$oi9|X9dF+&E8hz-R9Ma0_cr^;?I&et8y6Q2-E6L2s zvYsEr9UXrPau0{uw80>qjEPj-Q90{my*U=?_=u0`qeVPzvI7FhJDr8^8+jTb#kx7U zO-|b<8n%>E53~jkb{Pwn=VMguHL3lAY=`rV(9WZ(0s?$i~Y=^sDhS zJmu}hNo*Ub(PAB4@(~aIEU`|MRk+2V39n!=XgJofHvpGLTSchzR1w2iX%@hJiop1? zxK|z>fsZmfk~~tFmTHQpmgLL%TEmL*2qgm_H-5n~#VI&&PC?;i^{pcp?JgGrp#+6= zg_n_#b~wcH@vvLRC2rqmdEvX`N#PUtL^zl2ybk<0%ZD{PSs{&*{P()9GIQC{5d(N} zx-IW&m^vYTlwz%6Qm~!~F)qW$(4qPh#=PvxW;EwWi`z=8iy?_a@XvyLPs_=IM4&dA z<(6lzZN|Wmt7-FO+8NOgt_#vXWIsRtwF0lHx>~`KuVLdi_={t8NLI~T?@wFgA8Y`D z#31l{C1q76l`W2B7##@?aIi|4w{b^US_0Y$^6h0XkSxSBN|d! z`V^R=?Jook8tyrQ*i4QmC}vqBQK%c{<1x%P%_VdRc%7G>ZpQuyrNcVdyeO8F9U0}-=SwA|n**Rc1Y@H}#wzR| zCS}@6?}o$=PT`JLB~qFoo~E4>4^yl9<@N@sC{?orWuv(kWx>rv+E{9a6Zd&T-?}V=V~_=D7pKvEWn*e=spE06i0LAWp}Po^jYZk1|1UYZ-B zTW@#be4hNBRDGwj_Z@Hl+8A~BkZ!j*pZjesZPA6H)7jfRQdp8TG#Xc~h#8&RjHKUi zpSLWkr9Xe03lJ%VmBgry0Jdlw)ko2#Kfa|)|E;qM{oNQ-!u+kYWk^nH$WD*Ss)e8E$ zVt%uT`TLu8rsP>19zcV7-ufxyT&2tvFASvw;91|;+5G0ETi@K?SVLD!3;nltreQL? z4hMmxrwtI})5bncbbMCFJnDXJdOYWt36qI3vaavQYJ^eJ!f4J|#J~yN1);GECke<@ zRf#%%?nM`^4&g^Snu(m0ordfQ6B_S`W^COIDbRBY>?IR#mWx zxU}L1IEiV^NnOLb+w4XvjNZy)$eHsq7&~cPeqeGbc|q|2Y^*#S%>4{Jl`0)Nt7mPi z-|H+O6ZkB%Gi2F)*6BnMk*tj_ydf+#cgSVqd7NeD!gDen4c}%KE;74$2R6b5CBbDc)yH13pNm5Qm)+wm?VOdf^Y+!dbVNJ2CcnLQQ zvHY`8cN23S)qF$_v3%^SJnMB9R_ll)9?#rV7cSHHDXIllvl20H7UM|{b6xnFB0}Gv zGR+x1!HP@ADb!59PiBLTG?4zHTOV8dR+8ferQW&l zncAj`vGe7}a#9t3stpp$-6{~IfnGA*3nGP)eQt_pE+J8S(&_9%*cE@n=y5nPyP@K_ z>sJ%3Yp%{a3EbZY)CQXlH;U^!p9V?0+qz5tjAi-n3Dsy5JKUOvNMoWZ{`xC-J~X>{?PHGMsZ~H zZj-~TiL`FA$UW*IB;0zBu4=a~l8U!5isZTn| zo}g1U-ls&-XJ9Sit>&hT#jCL~yKa?qOqEWVu{m_klA_SO_D@3KSHp}AF~z+$ z)3Nvo2pFKN-|H+qjgn`hOEMgIu?J&nPig&BfU%;0tS`RH{ytpwkBM{EJA6LaOi{1eL_h42Kn4au$a&CKFuRB4;-tmRW<1OIETbMxfHgaq5vZd zeT04b8=@~yr)4I4xgG&O2Z6aYn;iOGK6wW7IS$cQ0`tUg_i+T~>Bn#R%bS8ckG}ka z7bBrB{|&6eC(B-r4*ZnB{Qeh!)vUU5h5D4q%U|e4VvZv&Fekt(=!#L#O9YXy-XJk5 z@f|+aTO0(6$S~~Z9i`V}WV{+~;wJ+m%vvZ0N?|_Na!w)$#N-8ql02UVhq?H_e1W+G zx(EQ$ZhDa6we^O*)?_j_#PY^zX?exlRt~-yEw&*Tk6A5R))k-Ko=|~doqkO)IVmYQ z!d!@M>C68}^yO_z(v*Q|8dF!HEWiK7EoJ$~@PE*c33oz7elrs>G@t+D@#6BVzTm&$ zO_qh0iLLD~rd3ekBY(Yi0oL?l0~`4ruuyR9j<_(@bs5rMZ+RPjcHRb_`_+g&d)N0* z3goW*9*v{lD|>d#l6DwTXtpsmFvaZKqC6k^!Lgr9wXn>lCXg&#gIOWwRSWTC+W9S{ z(kb35P%ff9OsNH;Pig_weUoknbs+K}L3OpZkBLHPj%C$Ay}Or#5tc@?Y2m=AqIsy?oRek~w$K48fehaNf|ALrV;a-eLh3QQo*c!PUmymHcM>~Va zfOllL7)MZxTDPARy)s}Pogmr_wDhUOG**5vEwT~p_Te?WNy0mF)^chL zow@%%dvCTIN0Oxp|JU&pmP|~GjEM+|)K*DM{X&R~#4d43E>h<3CnRTtk@S*Bc%-|B zs3<`|VSs61FokJMbz&|C-RRpv-}F1>6U-z0IGfoqcaI<`F;h~Bx~NKqyPKQaa_lVM z`Ht_%6F|*Ym=z`Rdy+Z<5%md{-ywox-nx>*NiLuaX>tYRpJQSq8r}j(bm29AzlXfI z8RUjtv^WgkEh{DOJtw`NZC*1J%Td9c`k`wyjrNpz&f9ZutuBXSF-BtRC<0wCC zfG#7e&;%M6Mo(UG2*p<>W=}b$U*=|>(@A^jcv!q&5bABm^m*!NB;Y);7_t%uJIRI= zO$%CcBxR)rVNQpNzLneL!IhRk3xrlc$t$;jiXT?>8%`=j;LPBRtB4?YTzLLef+ofo z7z$&UUf>Cy~Xou;z`fn$F_UZFe=iCn&h1dlvT3Nyci=T?k0R3Q5siv^!V&V-Jb|p;eSeR74#U%rJ~*M=YqZujFHWrCx25J^tDBqIz-rtx29aoHU1 zuvikxefSPktpU3T3L1kG!Byx34N@K=%?zOAP^_@vJVL=owGiM|+@2u5gvpw$!@C`` zi+s)eiDA!{md)Xw?WLd=hkfgM9&G7Zkk(Ifc$E?k1_Znyf^&U5f~G-1w`77!<>A{S zFU^!T2)}R09IKTDm&}nIS+U><+y#FCRj;j&;SjaC=6go4)mB-;8Vhi1J$Lv`c*?#;c?jz8uB;jzXh_t;UyQs+G<8gu5{C$YA6cllCqqK}ODa;>y z?$R1~rTJN3dA{r=f4}d4_=xQGv$PKz2qO>=I(IsEz??pdPtVX6M?90;HGRc0MoXzXhSvzzy$|#j??B09eHQ2j z92FWB8G)ys#XUPjQU@51g#HTbmGY{UlxgwbFtt-ds+*XVv`85YmS4bpi(O(c?*tL--S-*&B`36w6Ejaxa)i7pZ0LLuF1qGS!k9A+|Eo{A7<9bfR z65%8+0Joryl)!s%Ax+KovD91-Ne#xU38quo%27tjaLSazrV-#o$C?d?EQs;35wZ6)i;~a|;ocb6JoXk<+C@j*~LvV9ta+{AP zd{GWW1VW6`5tJJg3`>N0T1sp%cDC08kzf%yaY7?CD7kzwXKRWC;-~^Sg%R6>5I;`G zk`h(0Moz|wt^itcQb z46FS60N|93bnr|flkX=hH_=}e3#}|bOR`eCC z!VJ@4>G5l;3p2|4f5W9x*8P&v?iwS@4$qpMEIkGGuw{M>RF1_(G+nol(S9o(wx_go zLuK@NQ5o%QnvtdIlplh<~%lO5_)gx5$l~FzW9=T{A1)o$h1k z&yR>Z*zKL!f1-b6{rX5KA_Gh145XoH6hM5a2I_Y#6`Su z!o{XW-rz$Kf|ovk!{|+v#C<`5;4ar~=eD?^GWr^+jJnUB`CDX?=h?`AfRuu2Hsw&l3FUTSQr35Ko>KGTX?H(ZF#4RP zbqRP_$Y8b;<5TWgNctl_rIHfu6Xsb0&ZS9S*g?7V2oNR-V48zh5qA>iI+m5wCjXuf7JP#LXlM3~jW97Xd}0;P zp3uUho(@Jyj7yZ*#!tb=3mduAz=k`tz>z>?ZP0-H4$cR{x0IjU;Uf;B-qj9xEWTRh zt~feIwYRg=XbA3);Njzmp6+gDqekONmX1fb(2gf2f#^)wF76&P5AqvoV)%WSW)StY z*#gcp0%5T&7<+L(^Nhn*ox=&(jD``B!p)g^5CwC9On`~z906K)a|`m6EY(#}ZRNQ= z3v5}Yo16mc(3yHvIcuY-62SbHDw&@+d*T z8PDm-2#1F?ki6p}zz&`oN~HB&jJ`XLK_~pDoHh=e6r+S0L0@Y?!GlEXSVkmy6FyqGdwGzVSa8iGZ&tiTy!UYG>6*3 z+|%tBCI&S_L4qF5kr1h0PB}$`q+%JSE=L*eOsT&E3;+5sbPN=!nxNkP-lr!M#`B9H0j8~ivsh`m3=JOqs_tKFo zxb$caPAG1LW8th|J5GU84lSNQkLKV^3f|7zhf~8n^a#b!qd7n~&8^VnYb};sHK<+E zhtp{W=`%#o;<9HS%{A`(Hio5>^@1k&Y<)D>c+fF(o=po>l`+{%E>6y>me3OBK*j`y z^f(8+1|=zgtvXE2`Yx@<>Vn7l=?=^W2Aj&qkC}&+zW{G5nG^F*w_hyq#NguzAJJsc z;Zk-i18D~8k_{h#U3<(5#lrsYsg4G(mNn=1&okD(@MHXCu^4vO2)BdfNxpfld z1^hphC%Xk>0bZ0Xk##@u7e@tw3@sOl35d3)`GUU;zO5Pl=Woqn=@>Ly(EveyW_=e> zw=Qo@A4X0Rs8b1_Si15PcdzsWb-6pFg;DA{_xj$I`*8nieK>TCOX7B|s8ZsjBS{@H zeSI)5*ED@%1}#_aVq|^Kp+$0!(NdQUl`%&bvEDJukN;{|^JoH~NYEaQmWiCRf)c%$ zV%>Q=pkG*B4IBy|P3FbNY=y(i)ua{U`PlZNaV~t3Yv@rGP5s<*xga#~;me4t2rJbL zEdxt(TXt>FcI8xTOJ+F=&4OCr4)vzSu&im~qY2B{m3(gTOoZZh;POFWLdpEO8hu%< z8`-&~r&5_|>arQ(G&7GOxWzjZgIk#U>`BddsZQfC3$_IeG&R9V#hCFt|!}eM7u+>FDch@#IwpQ16mm7^WsSzp8vSl;3&)y7F-+>DzJvYZOzO{qc zc+t*5=%^?qsma5%m=Sw4<6#0K;oNGnH83mUqT|pt=Vuf0jW{DA1Xei7GEC2jm*G13 z=6>aajl6Cc)EuV6_B1o^lakj7{+E+v+T`_Z^D}Ayej3MrY7Y?TUBXKK^t%gcMb5`_}`y?SH}H*&&eR>cWAMK_lpWO#l3M-Og;$H+kwq?o0c1* z&uf?3$0K=hbzTL*>z~PNK2C~DzG`u)&G%m!^4rVb$Zg>mJ>HD^Z5$10x|hGHz-ImI z)KLkEo9ZV&hx64bTxg;7WqXvD4`Sw4&H<*D%XN|LN~RC;Y1u1#&rN1~Y1U_jn$tYs z>M@I4rr;e$c@XIDECUG%d%?uB%beoCnOT_5E{HxVvB!2ebe{9BX|}@(o-zUtqVi@ z6p>5we`1<*>BPhFZDZA{Sx3NZ{?B_4?^fmi!w2_nB8=eO=Qz% z*w?_@!3Zly5QC8mmw(W4ak=&Rk;g@4Nna`RW3k<{i9LpIzuv45A~B+#g>^iLo)j+2 zqwd)lxWM2=?{76^Cc3qE(p%o&e#hKe@F-Uakz5n0Yp+HXyCeC>azo8$dYU2n0DVaQ z4W_Xy-dQ$}aeM6J_K*>(9L*T-#ghi9NM>#+a)IzZqRCW6X+)@dDg^!}!=M$;@j#RH zlq~^bHpFNe#0ofZ@P-QZH=%;1$?m0T)`ucoX=cvPQb2r0;IginW{lyDl5~PzE%HAA z6y{QFv5|q@+zMG^UsB05tmp<9fVh}^4y3U(G9wNOI11T1idY&Z0_nB@eMATd@Hf!R z&Rpv=31!KL$L@$Bi~~{$rNTsYDSFvt0$Wk<>%J|dq~5S!GtFlrE9!DkUIMIb-? zkX0pzq(@0ft7R*1Iq1O**fm zGOIH=ZWYHP%6Ct<;yzOIp+G+ga|f{_O=u!18ggV^d6_5VgMsa%t*Q?0P6q*WuFFsu7_=;aS{(Y`U#jEU9Hx&ra)|eO&8FGh zV*vrwGx{F4RGZDl+!IjLzo{8Qy%RbBhMYbELu9R+G757+S00C5fv82$oh_89$B7-( z_X$uKeuGkp-eG#)LYlo&w=m@ieB!R$9E~K0dzu zGI67>sNFS>&yLbOkB<|A7wXF#YllTK_hRN-S_lF{X(Iu82;bF77ortaWY@B*`X&RP z^}q_h9%R4~Ufa)En+8ma1ae4VEp$e%NYvYZ2^$e}8z^>L*N-)4LwWU36&^a!*Xhzk?nKqp;NYUi@_ zYjfAfzczP01ZB&L;FJxyl40oIpZ~u&?E^ zasr#t5_Qy7vf|)YqOlU!sTc`#<_oD>=Nd@l9#2z#$==~1>CxGZ>F(W%>CKvt66oJ*Dcr6W2jpYohWzacQL~x6Z57@(Njg!)Z_a$(*2c22!s$k~(+#QHmqY5dJ}u8U5&t-7U40)j zpkgs7t~{j!SO-fGf*r6g898O5_8l)P17dgvIVRK`8dPKhb(&GOTfYSarc?{?F7S!#cJeD^WX-8C};0xbUJZF%^^V0l<>wXpRSvksS?-j*C!s^Bk=D9Zo`7;T-^-g}K2b3bAH)5v+u`G-_&E}4u2$1Bi5{@ROiw7gH^&!n?WNrTu zKDft|22XV*HJp9TIUGl%XaU9->OV&l%4el#{WQblt0^bpAj?ZMirIm4nx*H(89ma) z&_e7V;&ET_Q#Hz0^FoPbVEf_gOz5oNM{D>+bZxw`W^G7ZW3i}ttHBT+BRI}n{5`fsuDVNC| zvPKc{gwt9eNtNw;bwDUX)C|%dnBO>YErDvn^=^wOdCkru&9)baL0E+70 z2q8ayqp0F)EcCdY+R?^sg_KJ?l%OKGFMM&93Ii8H?IH@x6)DOmH*`WyBjVR&F;s+A z-#&t4mn8)a>BBK z1OgVogYSA1Wie_1eG8yH8aLHOdFX%#av)StP#{b-9aFjJWb(*7ONXazNH;C5N*m>< zIKXawgMeq0y+sy50*1*)@oQVVF!3#@`+~Uz>8icBfI4D)D}R<>emr^SR5=lrj~m56 z4o(@z@E%E+*36-xsOD-vN_@xV(c)N!?UYBeB!E>zZ{mC$B`tGiBQP^sR6DI87OV*3 z415y!!A;EmVu*9O ziS-cdk>`~3ox1n%@N8}GV_vX3WO%Re88e4OnR5r4>&>~QV7TI;Sptcd4*SRvIHNt3 zi%$Zg8G?tBIB*l{7DBp>t|O;*c$H(}y4cCg{OV*F4S+{l^w3Nc*oAAME;I9} z(Cb?cWO)a}$C0J!vG6=J_m6am=NA@<cLR@O3$cYYBU9`?5fOA7$VEaHlR`s(g0|%A!{5MXiVu_F5uE3wfN)cuc1pqx@YHIFPJ5b<#GUI(aryM@VuC$);oI3K zx{fo$<5CJX_)=o+qL96wALi%c>ESo#>6~1b*dQ;v4LahH}m} zO4{gi4)}Sa%-0Ws<2Lj+NBCv7;J`;v$wc?h*@CKbPpgp=TrS{o@CQ4VTjoFt><~D< zhCNsy%6p7;QjY(~zNcVkV7(GP?03jvjNzSOVUa9mOyp>g(mV-ztV~SR={5A6;&_&0 zHu{sCmsT95%riq3UC{M`cv2YYQ5NU6jXn~p@(evqqTx_76T!T<;2#@-r-ibYq?@6o zsyeziGe#5+SlI=s$BYVvl$@Q~YYHIlrN^AY>h75C)%=|4;zF&$p*E18?~IHX$(h03 z3_m(W^)ifci@z3Q+|9qgrGFpG|F?Lj{nK|J%m24n<^Nl}ssH_{@ZUduHg9`?cj=PbwBN=S8H{Ddv%-G_5KD@Yh3tx zl?nk74*>1m8_u`ihVyL`SC^`{2a=f!l9CaQSnNyixdl9Ki2eXzK%c*~89=9;<^MSl zxjE`KXsNH3-H81Sb(C(j1DVrpCPNz_#Iy4#>$j6MeNFg>p}hh-8!=B%Nk9y>AjuDH z37i@b0JZrnJ;z})W>%VX$i=8INogmGp>!%*^05C=nebRllSJcT@2s}z+!l<*%!_yc zq?s2d8bJ<=>jY=2mmQo$u*NXn*Sra4PGai+MzK;i@0soj3x%#}|4IdL}l z5RCy9YjPb4LKSL;S%hdwB1=bk>gp0NRK7;3;)YAVcMHTX)M~wYWMPB2JIodX6~j3z zDdDncf~`Ljstrk%z9}-0_|zfnR5qGz{tDD^&^JHynjq|8>cDI=T zfpu!GSuLX=95xJMp4m-!J7%=WNy&^AbYl9RG@D`TQjc1dnPp+1bBLa}MhRktI z;iW_3RoG)vvbH&tb5s8oF#Wg-ltCt+f(bFmT>^r3*dbclm5ltN1#**N+b z-8qYLnDaTHUn~ENpNtR@DF}pI3KE4;yZ29}M|1wo_{SCDcD!|g1eC(Gt(e0nyu3roLY7hptW zDc22(Tjm#!i~LRf+5l~9*?5idQ2w*Mc;s|O>Fni($8~1u`Z}|8VP`gNKOPTi5N_1J zeT0c3PqyoXg4^<4Y$P*Pr5%oQGoMkZUzEQmNpzYo@XgPC;lz;d4o!31xB=-2uluEC zvnG(8b;e5bnrARbl&DQ1A8@Fy@*X&vG6dBJ{Q4+A^DI5*F;k!rX#x&)n`Maica)yt zYJnk-=oivH_Gs2&e@`GK1Im3H-a)xn1#f%-*U@rYp zAVw;8>^6&<{@9%wpe-ggazxnrE>v@JbaqqxkND9-dN}_k-u+$xw`@n)#74Q5*FR^PwBzw$1n0qG z=T7HN`1*{V01d^uv4~FH@A1$)iRJV6#>aygPd7eAGJ6{5MK&qZ-r?*~a@z{&`MiSp zty}h-)+inn$5DRPsFjU~7=7hnqv~l{u+tlmzdh;{XO9&JRuFi$qzy2YWfhp`; zj)&#GlQ_^kjN$DwI_urK!E?dUxRn+n0XAHw#7a8M<31xBXhXt%W|33KLUr@VU0;&x zen3- zy8{vju@R~rjbDEL=U;yQ^DjUDnYaCI|7=5s^MJW3{$Qe)hAWe%i?3iZr za5GGw!o`1tj5eq`dl)F>3M|z-@;cG9?u&jm+ll)t72);!Av z>*%Q02$?>C$00k~mEW$y$cw1=Isro?%Zo?NrcavL;h>QghEJH#uVOFl$HW#(BePLh zb~~win$3nmJ<@3>z|HS{9{}G+gPd-|^8z!a{4MO47^H6q1V(ord~Sg_Ku#vLVdygPbHl#SY>#gC8#IIAW}=0j%j;RO z^)i9_?ggdaa(Mq{gxafkZD@aE6~{Oy&llc?z~GvZiHA`Aw%2IfgPuLH1&+y6n~YqC za!aJz{h-^J$S3$D6If1$5eWP)z6_vgcnEEE#9QXYxc7R_C8Ef%hy}`kL>M+6lv3YO z{}Vp|t6$aJrYW}Vx6WI(;v5#jeS2jqyUk7lNqkv0cL9^_1P^%+y>p^ZJy7yU^nA0O z^=$@Q=g|GMcmylf|Gjhs>&X9omyc@F^ZYb8jjuh;;x&%P8@$I(QJ-%8g%4=m{nd1p z?UmnETG#uwR=aAO!#~(b*{6qEG3qL^ZJj_CZKZ7j$=D0jvLkhDJiL%%`1%-zuZLim zcvguULA&!JX8FKjyO4rdg6!lj$4q*l{RAS|vPV==70dntcdR!!WDmA5VXEX!7UVOW zmcnyT<68#VQzbffE@X*4ehhhW=D3ShvcuQIOnhZl;*VzL6`9J)IdcwUaDu#{2o5a? zL!jglJqTS8B*+{!xP+*DQUF#M@%uoyg*AAA@de>OufYGy$NTtgyKjM-r-TVYY9ls2 zs4VCO_@BkQ_e%JmyLav`-MPX4{1*QdN(2vzzo&^a>lBK(VNv~@SX2*wFpy%CfSLyf zIXMt+gM``m^m9bu_4$I1g!OS`ENcX+0gY!$jCnvG=+&Ri;{WCSo4jva9^J7sG%u zk%&)o^F`+p1R+s9jdbV|5o+Gz6WWoO3sFaFZ)5WEgkOLY2>oa_8^{17jer2PLXs4| z2cN+s2S4CYv?7;6;G1PTUwTAPBWTez2I-$>oSSCz{48xYIlEDqW8v3HvkBdpz=38> z&t?dClsPn8$Z_Ks!&urin`h}cKA7saF`|eU4Z*QweYi0xQrRr1=b801gW-9`Sjwny zvm@<7IHS}7w=C6)^Q)2qN$%CMY8RC??Z?oM>rw4fOCR*q-3y<>NErNh8evW_yPYUE zzm3%<&#infc|JhA#l8F+4+`UvMEV4+J}a)aUa4!X$`~U08|m57%((T202?f#NBBI| z6O?0~Vle7aE^>Yb6L=^?aGFNR5iSDgk#x0=xv`&eOBkvm;m@r+GV^u_IDt_b4~qq1 z(bHH<;<%g85{WqO0#ehl2>ML*;9julqu2J4?*(3aJ*3Q;$*s)i_Mp>3RcQ2Wr#6=> z1^~enoO0w%@*Q-ZLI4P>dE%SUxrrrzAe5I;e4*SO@EgC8QwSk5LT?D*J9ci<2s>H+ z91j)4#M3y66EJ)rkpr%+A##XEW+FQyA8`6R%@~_8Ns2a8dJ?44H*m}F z=aB-6j$m#0N&0f>IL0N4In#0OaFF*p9-ahawFZe>@EFzdT(t>IJ0y@H0k=Ou(J2-s z<(Dl(kP>H=n~m73?>DyF&q>IYbt|(d05{{IbGM<+LR42{YvxZmZ00C?WdZ*Lj?84T zfJ_PfagW$8PKQKXKqc0AhxLQ$qk(@D6F&y}PbFbbbX&@ii-&zkA4qWtI0lbF$}Vy! zH-yZ@kbEtnbi#R2+#I2jdqspC2 z-r3F_uHJK(c1?hCJMuAV7e18Tvm?>T#@gEg4mFe6agH8g30#_}m!-LrDmgBb^7HU% zUAm7H3|wtcS9bulo^e3{VHdb=Vg96TE&z?*izw^Ie_|f_=nYT>V=|4?fi^QtK~<)uN;P~~T8W?j}+xfypMY^L(_lGBy^=YtS%wKs-&oENlzX(*$l zvPtuf4+c9Fbl}QjGN0=r<-8W&&1%HC-uw2g*98Ro+fcu#G;O9}49=CKQWHy+CYCPQ zM0I<(CfwX9WviB4lAEdsR0v}adtlf@vv@hxmq+gMw07&Fw3lM0tn&cPrlz6q(VvDh$wWSm?8+l0rHz zpU|(91`eI69FTQR9N~o2c~OMdp=I*B&zA^tichkZ5wh$&`#2uRzyiKuehkNBCjH}w z&qIm(@pGSok7Rpv5yN&s@cOGTKz0J2B@_Z}5dxo>$ML}|9>1X>TCr8C+856 zBi37sf~F{2jra_?eS~s@Zwk#NtyeQCBC4u?ET8+96lLj}bIpBv;zfW~@W^4xbA%># z-2mh5G$=*Nyl(cb;3C3tqP4+ncA7V_WC4+(EdAh7A{5#M7KQ7LpUv@*3_7Ut;NqA! zOp2c|lj8O9&RrzS$R~@sm)Cfb_&5VBxV!O&H16i#W$`~X3@?cDEmIiU#2#lv;PRpT zKZ_6V+^^w(yMO-%|MN-s-_)#@Y2a4mf+Hbdp8=V&C87ea1mV*8Ade z`7oc-rn;OHdBfjq<#FIC;MteutW&{CR33f{pmy(x87PUg$H^z2F%ML}H`KHMj)^=^ zp!vc$(PzMkw?jSf{gjkmSmEHp5#k6+ws2F``CFoL`ruZ6O%A7?S}46V&HC{Wfq3U< zsW7&1H0LZ!$ERmJb7~F1%m;itm*9Jf3`mPs$oup%FD3~g2*|=ICZ7ZCQ{Rq~6e+Yl z15_Q;lYQHR^aUIp%vq+NT|!aIH59h9Z)n)}kZlz5vJh-&8L{VQHe?S!~ILRrvtHV`9eQ zCCBEU{+G)=C8N1U2v>LFlSd-vyf@0(RLI(s`wSf<{*qq&NzSI zct95M=d9?CLM*I@+$zl`UEUZLRAWV^WYgNBJpFAZJmX)B$q0Vc>$^y&O+6%}3IPzl z;Fo{?KZZkW0C~#GFGHtzlyDUN-8-7FmukXZ7FiS*@81WLh`|Q52g=&P%VRsVC-4B5 zlgKbf{oOk%@bc1~(C^>NBIZ7Tuk$5fuo3`y;Pda^4aeX-dMWb_-EfN{%(a7q=G{9^ zIq%C8*vxLQf%IEX;@-<~ZeJpz2gZe_yDyHhM14)ApDPxKt4%6`j5<{gB2+j^N zQYwgbkY`9ut?1&Bd*jnn1uUG~NB3h$e9<+zaTz`0fGKlYIo4uebIs zk|VIHIFT~Xvb*t~r|Kzl=xP^%jR|x}k`hR>$y@d4mPd}Mw0f#2&!|dfJ?V zk9V&@of+IGK!EG2FmE%w}_ajN!DMRBFD&EMB`rc>#7$d3nL_1o@Q1k`i{| ztMw@{NyoSPZkD1xBuH$d5yJf`{Cv{Mg*q#mR78yPBARf_gU7ErYLL1Em2R?t31J&6 z^^Awq5!iV!lI5pyapOQ1HX3*s+d9TxOC)9id|KwO~&KWMGU*4@^zGY7 z`&ikXq=H`jDB_|#RHi02&pFJ*Qprxej>FSAUO~?yMJeXlYqu^QN36_y6 zjj~Oh3bfLW=?e2kS58E6cZ$q%M&BPT8zb3PX=Tvk4gHKHB5q$`? z$5mJy4p;nFQv*j8UWdav4-OWc>z5okLe8M;o?+MhVqsHwsuDzY%G%Ij zL@scrI?k0aRib9D6!A)V?t{rjd=I!!T~@hvpax#X^(amlHeMq&)h9C{{b$4Ias!q4 zitryFUdr+V@E?mymHJQj9xgq&!GC-z{0Glw1^%IHkwVg}ED5Ioa`h4Pl~ME|Czp_t zfggkexoWA^Ye0nfC4G&65UO`yMIcNuw8+50yV|Ba{NN+H8a)pvH~UXF_RPi}#Kt$a zM5|MpfjWU0;Mo6ad3p#5v0a0pHEq(xu`cy_7LD5Dk!Nc8r~giayYZjb!n_pTCQc`D zMQ1|#9c?Z7jT3ArO}ulkv)bKXE4NC!u%bx?`M1~0yn}Jt178yoVhpvtn%OB{YwSxl zqqJbcJ3`0!=EQ#@i4zjSUEM}(E9J?0k0Qse(b{qjI~alewcX8)EuzQ4-4G7MzME&- zFgfkU^I03FZMI3fh4JylUK~R91aseQ-^>pIgW&Siq3s2q3UP@+l%mldcaK@ywPRO1 zWMN#rWCut!sVwSU6ybK#2@VFg=waMk^Z*?#0Ku;Ww4L6%t%EuWl)^uDz0v8#&c`qGVg4oA}FHINn%wSwWvP?83iX*(Hr&cle z>QbP>Jc4p14ylJVOdZaN1#$hITu`tLE_UOCV77NQM9@!Aim2^M2KWhEcbxO#oXtD8 z1f?ay$H_~#(qVhrb0_Gz2tu4}Negbbb^fDZ)6;7$s9zp-|QRD%BZd0qrQpX9{W*kCc@5j()}%0eIa(AgY5z zml=ZTwLoZ;s{_I5oz%|Z+$ihM9hu*oxp#eg5{;AMr2-JYhtxrI+!Bo`x>vF{E)hz6 zt3)Hnd1`VbNERf})#gPs7^$-XYX|_(zC`Hdz|m0(L0~z*S2}bx&Vr*nM}mX>$p|lD z6Rs8(ZusdDSP0fvXvbZaAuxy^{2-h+FrWt;ZcK%xzDhyoGxgec?vWFc^pjvyGhY}s zqtsINrDcic%wwYngUglb+tH&1ifzA(wl?rKJDEPCDq(D?rQ#Z9t4NsSXsa5biPf^k`_#FhLQNrBReY*%lz}gD(VAl6a&b zj+@0j#Il0X;(}4Aiyr)NJDAtD>xK{X0#qy-MLmyzBD!c2q$+9u7|I>wShj17BGlLC zfIat!Y(~U8xI_4Rmd;p)qS4r)x?UAFV+jx-AzFh1ry#nAc#OicJYcIS7p}DKh~^xE zIv+OPNvAfDE_FT37c({SY2A{ZRrousw2Ve%eY86&DPb zkoVlmlfxPN1S)R5iP+AQ4nLxS@-!ylIAJ%15yV6ZEHVelt5;v3D;qg0B#t1Z(EKRU zp!7QECY;+=RtAm@Ra7E9H5~UxC3t}@B?M=cGb8ygeLOgZKqSZck(u;r6+St*YjBpL zCgXX5RPd;l?(1A@P)4E{(vTtPwm2hqfaR27-1f_~k8dArc-l4ZSE!e-UPOef@s6q8 z!_I4DibJ_ML_Wfw$`VDyB~6ujxxRqnQl#C)#hY+#ZD%#;qKrzs7G?cPD)clOhh^Kr z5+%}7~I(($W;0M%t3Bs$}~H|?7xR_)%`qdkf_ z8h$F32zNUcA8|7=OpA-6g=H@RJbyqzFpjJt{tK~ibX?Ln-DH(tJ*&LVN3imAZRHQo zHumG7iTT=9N#6?Rzq8Q zK0J)^P>)XSf-5YC*4FN9%bAMQIm@{_-E!uxqACqwwV-9bepSO5o|$17(^LtkOl5vR zgp#YsJHI^ZZciV-{sED)RpH8?puB5tPqTQH%B3?TuzZwvW7T330`h}B^W zZOAb?$3w22rG|y+Hcp%Z1RlME4OOE~DzVA2txryTcn?z-wAzlQPnx8s6KAg=${NpB zK|12IkHIc6NRqX_n-g5qS2{XQ96c-ns;QhhKI!TOqg#*)lQ?evS~_faoa<59zDtV{ zeo6j*mdpnm%b+;?@(+IvH3j$q%?*5}yR&f{D2J@~f91>59&mOBm>8jf0oHv&d=dZ{ zfLywg{NVtHr$Gmh@T(-su{4VLy;)p*g*3#@*B4+)4r(JI^@pExK{$TPAOT&B3pw4} z!frtk0EkeOq5yO-qc?wdZF6I5b!}Iu@O|;D%QpoC@pP{aYIy^E<3GqPXtJfa-_Gu8hpiHw z1EpQ!e8gSdb^A@TNf_Z9Sj89fZzi+MHNE44`acgImhm5V7ndH~`@-=b*H&2Rx2gZL zxa^D4yXvMl^?$zB`adTUv7SaJMR-91(<{}iwib|YMSLVvN&>M{{nJ$hsuG5N`no_Z zv$*(G)&}yE@v+r`O4MkM4ECl<(AQffi1OQc;c9kHpkub+DYJQ)`s!ueLA6*+PF3_A z-K1J>=wS~_1BrMo%TG#^533k!>f%y$pbIGf6jf-=tBB8qhy#u%Ohm1QhKqP^Z|-bw zt!;rhzuVnkd-7u~CM8NHf3h;PY=5t?*9M3O(Ib7%w7BkL^~{(zd50bM%Z<6mLiCNf zzCdF$40~q|!#_2XwNztpb5Z+ZX4_G414xWv9tNpR!mt(^Jv5xUA)YDtWH8+ipT&6r z?mYcI_Y4ry)O^j6MAZ0!Eec@N8Cj(|J!P`(Tu-{Igw>L7;;KBs+JuS=@F@}qmoxRK z=GG;;mD|^LXWiX*CAlsrsf8c=BpNx7oYW0~-xi_l4t@RcxF9t_M(;>&TAFoJr7#br zYHd_PMDzmttl_F(&9R# zP#7mt)AS86A-LH*fV42Y33Uc!VkWkXac<#;E>M~caFh?JgptQ;fLH?^AwLS1%OUu& zC_OB(vRWv`&?gY!GkOUeu7)#zo2NbS&L7py{-K)rmY?>at9NqbHxA}pqc1b(uZ{|D zlcw2gP(gAWnhgc-d2G+3H!)U4Glx(KiZ+iRfK;Ls{^lK2W5uEt>ah)nYREVwD-G5t{3m zFo$}pTXVQVggMQ+nn|{X$Q#Qs5>Gl1Q6QI%r)fZzi_$mlQmJ#N&cSXZO~j&pP1O+n z*WxOvZ$pk507~FNinT0*nJgXui%0$>g{~huc68AFOGor|3cZ;0fHk4g>mR_aQNN!v zy$pOfQ5+qyu`FflAwxa)P!Sur@?8y^u+#^SWn4_^3K~_#!WUB3sNSjgZN*gZy4j%% z)Iy%E)11TYt#<#cT0=FeUsV#74(gfhxra(S(0`m-FjEYD7}yW==}= zlfH=Q_}q&qQM{p2NNEY;k|G*D=L$+C|1LWrRYf6kR`xwqwQ`(zua77PeEUj`#9<5+ zAAxw=l(X6^gy?Z~@N4QxU~%*qo5QMhU^wQVM`0xz$ExL38F74KrPlvkKhO%`8r6;p zyIio{>WrW}Fd=ibTB#nNnleEIcJ-5FPfqB7<&U^2we+==TB=Ap6-YezA@C-+yDn2; zY3Xw-up}@Q`!<3pXp=B(^SjjP|I;}BQ+t3^L?x<>pBC?YME##TO9+>#)c;w!;eYu= z{4YN(-YHYRe9ydc5aDdI)xUTLefM#1oD`D}Vs+_&wt1UY9O9&ESKG&PxzGZ=)d2Z) z;X|3t$4Qan1N`5Ye9=-{KYJCWucE z)GW@|OyWWdRdXPz6o!afAaC68!0K@(v&7}|H|HTEPj~vJJ-ka?>>#a7@Ts3 z9-vRn6Xaz%rm{SKm(jS^kI*m)$f1`_~oh79!K0^L4EiNwItH}TRckbTE|KCdf zmqitj1VSovzfM-sI)F%q+)e`gC0+2G^S9seFX->%#YK?U;0m_tv+poPHi`41t|$IB zs-5;XP<+g#jldRNXF4D7)Ql7Rw^Y#UvbfqBOzp2;*NaBm=gHt)NM3w5hvYUm$M(25 zMqXU5a92>01CBSTts*AF=TNcB6#;>kkQQ5I!upO@OL);9HZCuAX5p=tGxf3T))i`P z>F&U^NWN|l(jdc4QN3Vhbi`nKlQ^2 zd@wraSA>S|%Pi0)Z?2Gtopi3ytJSWXb6Uk%pMul$2!B~Wc%ZZS0pv`04+6mDO>|O3 z!(Y{vWz0JoGgW^$gU`QjtO#9N40YvmwqEI{+3OQT$6jlR5a(W^=J4>q{j&!;6~D zxkkgCt^A?nZcYgz%X~)|Duv=mNK&rC;i3A{_~qw+{^jRC|MK&nxfaN6Q}gfemw*1R zw}1JUzZ|LCy-IMY+et4mmu=nGY`xU&U<}kZUVA$$b#2kZvfH({{}*G7e~52x)AH|3 zqCrx7|Igw5HtYN`FLh_@b{FoKJ3-&sT!Wy~jNW7D8&YdgItt0x;>!EhPx zw-S(Xl@{Gn`T9CiZTfWwSTg*k@IL5^Taq=SB+1`c3oV}vi|8$NnSbY%-h+7XAS!xi z7Wxm`C)QX~nc$9>gH1^G07$Ak_-Wk2A)pck3k-ov`M&TYT~oYCCEx)J<A#VoViFax9-4=F3B(p}vL=)@yB+Z}4pUo1`UU3D#- zRV3)gC569ARUn!J_kq4%m^<#~LHSFfp34Tu^KXB9b$db2xlU!kiASyiZba^cr_4zb zo#M<(b-3AB z5=6}7qTFD-=NthB)@vX)JnNxCccIW@oG2glday68->C)B`+Iaa4-if?teNmr_?Je_ zE0Aa@cl(=H9UMzKIL5z!KaP8^%k}?)4ajNwj?GK$!Uv$lP@$}v>A4?X-AUtcKk}Ev z>Yjk!GT4uPUAsC*DndF#-bn;9v7yufheWO@xE$q&>BU)ZoJ3fg(v?T8pt1bN8a}G< zqt(yM%)+QnBw~v4+_9k2kw(>G5HK;qtLl(Lj1p%*zKAkNIm)L!jQJWMBZl~HNUP|l z!&`+pPSW0M0*6Cu5IoKEu?-t?NYEIssU}b2xAE{4pWS8zv@7Y=IP^8WL&j6wD%@!Mw8#0AlhY(jA>f_>o6CuC-$i}sDD7;&atvnh9D zu~$22G}hy{@(DmCeLTVcn?eL0+x>Mr$y9!c{4BrQhm|46d@) z5AN_+q-+~ry_6?0EGfrVu%z77f^ocl5Z=y*P!$tQ70G((cvu|C$v%I`ht`ptUM+LT z$6niA;veuFb73BC$jhDi5uRK6GzVQ@ZbZFb6KOlOxKb83WbEx%s{Wb9J3&25Uv^Ho z_^LFjTx$}Rmp-xZvN7h>t5?TSeg^;9>zhLu&^9|mkKjk}gi4P~vrJDnxIC&Wnix(1 zk$_UHgpVdtF%%kuMo5TTYlu@}&ZL%|aIVut&Ui}xrU$($Lpu})#Zx#@0t&T;@F;42 z*}S5nOSFjE@Zm?V=r(Zlc&c0Vez#PD+nXE#hbpCELw^r?P@*bxYc!#&$eH4Fa{Y{kR`o7I+at=m*vn0)^kW;ypKFliWTMd2rY1GWAtAXKFN8D!#e)HZHDKck^T6 z?p%|V;r8Ga9}$MSrf}y+gScVoafLe@mdd00pPS_v0M-ACi)$+0nYr4X3N2k%nN!NK zc(C-8f-F|o$P8;^f*KFg33Wt*8kx{J+8(H?L+jk}YbYfNK7z74Jcp1VnCxgVv#4g; zf|z$_Ci2>aQmQnpuHa;SVM!bZNDa!dRgP_`qi#w~MOSLD(r+$$D7t6q9v_+7M3pTqvsSFk*)qH1|-9DKo;CVs!|#0B?7F1`aX$fI$7joNk6 zanK=_fu;O`W^-d*!Mi{qU%cb>Sfum%zyJD={{SxFr)%cPZg*>yD8tu?<@z800evsG z-q;z-&0l|RG`eVRKnWsyasu>MH7^Hoa0){h7tEguj0j+8 zM1B0RNPU*b;SWdBT{QaW2|dWz>yp`kv#w) z* zTiG`-Ry0h1`PatA*2?bM>c-<|Yd9LW5dT|b@tZgTu^Nx_Z;0Vj&kGW7MuLx_$4$&khR4NmVzoT&#_=6LVJ{ zv>!@W{^vi!;@Vy7?wh~geoP(tpa0m{O96~h?gkuO;4A?MFfER}7@wScV_sMwwoiwa z-nAL`Ay~_AyVt%iZ~N=N!P~aCSIye``u6TVFXn%PodwRAKDC;j55F;M$QSDtCsyPI zm&ee7nDM*mjnAM|BfaiU`>wnW7vUe)u*7e7Wq)JEjrITd_r@;J4V*_g#=OUIg8L^j z{b(ZZmVt&D&afJ7I|Z)f(ri*A)G#pa-m#zgSM1t1&>ZHso?BZ4?LLc%pX3A>B1|+S z7h^w~c(NoBL{oji#9acq5RDbepYTKFjTgImca|{%*do?%rO`19gcawkwm9C?v)?b% zIEfp^mvYw1^`-o&;<_YH;U%4@Og?@VC6wxL9>s;Dog@{RGul<9_$A4 zCtlk#1pAIzSrpPgHUX%jppJ81#sGj_weDvoBaRZca%#ig&Z1csZ2$NZr;wg~C-aGT1!)yRA z`#ohV7fD=}#8r3hO#es_{FO4|$3WR`b4rLW4FXcZR=W$Um}s{h!#E6+Ig4!u^%xob z(34YbU0}7YH}edtbHxtM$s^Um#k7F4pAG!|Se(%VSKDUGO@tOsn`u8H$1KQ5u$a}w zwZW*E2+cm+BL@Qggta)K_cXC_QlQ&U(Yn6Cnd$jqfQ>Rpbsk4~b{+xa09gH}X;?x* zG5DpKIgzD~c0IHh4}h&3ywd5=<{e#}gGlq`jiPQE#Dqe!1vll!4%^FYV&6n0oWteA z7BV68dtPO=A4dt-TE;Gmwq_%uZZom_x_pgUjRS5m(hz z1ckh)xQc>bRP&=OMr;j~yvY&mibxw;XA63v4J?SuI3M7|!xBSM0ysFqD-f_FW?|9d z&Gb0tvO0a6zb?{InLn`s$t#p^CP@(dHPF;QFkVsUX&s=EUqSDfm~>NAIQ#Zkr5 znKY{s2T2uQgr!uCBP@HNDcltVz0qL41-Esvd@bSrYN{VmNduL}hj$(Z?H}<9g|X_V zO#iF2beC5GGGQ8h_#;%9fLj_2qb3#ngo!lnsEG) zs-Gcih=STuc7U#B0ODLcD*v)n`Q`4BuN}cD4$|&wnDz6-YvwvPNH!Ul8VR<;GcG^k z(-f$e^^4ml%5$4uu(_O7G)2RzIPEgk>M$+1F;?{{0A6Chl~f8Z$J!^DDo~bSST{kTU( z>3smyM7=D{i7Y{%s$Wnw1Z}8KDTCmvhE>ZTRLA?nN+B?17JA{FOX{;Oh*0mis;z`j z_N;td9R&5_n*sS}A&Px9x>MJK&=KoGTzW3s@GI zGWAQzMVioq%LG(Ut5S&rLJWJZ9b%^7dxecdqS$r%{)~DDk>KWtM#L3AaQg|drCKAD z>UkL1$wn!@`}3%fAdW$q$k4@7og947jbxFgq=dvhiE7hPj^4~G6-jVyR!Sq3=7l>h zO`unuY)d(Cd)&>NQV3s5DTLWFP{mg&`VxCj_2LxA`=yE{-2L2&CHxKkyTly-Ki2?_ zn8p8n?_rt$`|i>`xc`gBe_R`|=C{Fr+y&X{_Ak5M{w_SFZ;&8gClaJ8*j@azD&ZBq zZY>PNJ^K0MK>T;#uBcd_2PmXv7VmzQz>uj^b1g`bsjaJmh98d~@$?lp0Fo~QK(doW z1pp{QE!cNs!b<2r21nMwvfA|Tvz-@$VUL74TkNi;!|fHqJ7B>^9A8`AK=x3j&q2eSU}Oc(tV8;{}8`LPB|!d+0R zhp(jUgTLa77PA7rHy1}Y4MOhlBYj^-y%KybJ?X=qy$l(Wum(8suw$bgW|A)HMc?aO znMSj@%JFsSyNXqEQ1=}D_{P31vPj+r*;5!TC@h2>H$f=1ducKr40-1BmdTMYUZHhT zZ(H{v%2!NWRFlK}KH4h`Z;0GDx8hd8IORU9>7v}_y`a08YEI4~?hw4bNXNaiwj_LV z!1^TW*<3|WPi;=G#(XGvB8Wy%L>Pb~*bNt%y+wXfY#hj86rU}BEiF3gJPjnpT{#9` z`ku#W0nt=Hfbaol(cpNTomxtfP@R^KM8#{ATj*duK-y_}Q_#)Op`$wsHY}#GDp%Db z4}S4W`*CKY*CU{|RV$x&1!@!Muu9K;-%$Et$h_uR1hH5LQsKRzmbW=}4?!HrX4bWg zo1;T87Q|2a_9cQ%gS>3+F5MZuHEr|o!Nbv8U}eJjST+wI{0@I#yt8x{FYwM-hF|WD z-u_2H>6CY7%Wo8Z73cy|d?4sFYygUp1ET1WmWq0`4SINJL(mT-J#f0=q;|VRH|}sx zukD10(SZwDAyQZZgx<@_%*~LQ^Xf`2nFGpVz=$OFG)h9v-Zj!S^Se?e#rCPK zjbVQbq>g?9p_NlGfDV2L9`2fXNQ$+2!M%73hdu>#!+y+XQ3mO^gwt4nPkStZ-T(;3 zSc~1Dc8d=RQz4ruw=MoGJv%L9i(Ut#nSZd8(k$14yH?VKC31#2?Qk(S^Y=RUmkC2P z1euVS!oDrQ0QiHQ9H%fMN+jju5rE`C{JN8&PYHjcs1W13ZT3-&7EuNj@936W zFdmqD_uk&SH+s9^wgVKj>47=NxC~%LNaEq^d`^_o8%&W; z2m(pKjIif1A!Yqrkm;810n~&AgFMdB^-$Q}*)UDg(-^f-SHprhG-$qfS+e3ZS7G2U z1A#PX)=h0l4Kf66F5zQ z)xb$WFabrP%~b(fYI6RrDqp_q~F$CG>7U}XJgF*J=JQ5hw9f$wK7dvIqcRt zH)gg~JuD98r%OFQLkb+0t|=*S-HD-V8o}4MOZv4(92&v5&@!eTh@_rJ%?tBvV0>-D^9d-Om^~R;Qno(O&||Vw(!` zcL;V|1fBB24XmDIPSdFqBLY5!iJ$+0|khSrUYJJJ~ zM7}PQGxbUblyFMrl?=oi)Y(^sIt%5c3zve;%!p@Jw%s{<8ARE=8${W!%>NV2+okYd zcM$7U;{UmO=fMsC&u_{9b8p#|&QVnxuZsABb8!FZ#-7>O0|sNF`UDcUwr|~67jbnv zzgp-QA>_7e&Mng>s}y-I&$DRM9*;bx=b!#N4erK&UJDIYCM#wIaN{6>xOP=mShaSLTYYZuV!|Nm)hR=6uh!#lolNK z!Vg!?x%%u(WG-l`)onan@VruWt{5_c#~)5zIwZ)&{@U*5#unkIa5IDhvG1mt_RExd zHo<;rn{702^hI5;!>?9XJf(ewk&~m=Yu?~r{*VEiT7(ON4^kB?i+Zmwg73&<{@@Sn zI2=Gh>d+C6X(Iuir=g^fhW+1P;;-8Jmc8ogYI(OJ>f{mC>QSsOm)dJ( zaL$T$Jyq46mTYys8L82nCrXvjQ9vDVWsnK@Vte-w>(91dXok%yLZ>?%reg?{)gBKU zgmWc0gSQ}|3Hc72^Dxkjr9E0GFJf){zc?U8py;??Oq`Wfaoi&(#()) zz^v`%S_D4&tNFGX&E_5j<6x!o>~%5J7$6vmGdr+3PeS}Bbb!^o2Pe5rH+Rm8LGr2w z*_g|`F3;+#znvRmP;uQ5P6weTI?+W@QFu9kq$W-MpZ29sJN#djd%`` zQ|}%9{1SeC|B8+qbzbW#;`8wd5bfp#^7e)+b=WwoUQq3Ki-$1bLByBMsYpJdTsT=_PURHSV*KT+KZzwjd?2Ebtx_ z1Ar0hX1%kxusF)t)ILBZ@S`Jj$(`PCYLSEiKoHgQU5`%(5pN=F0|M&p6ZEPTlW?(@ zD!o;> zg-Ty*M-^LL8^t|e!;{|Q+u0js0NyKwB99rL3DrU(4vH30?{z|cGKft&Ae5L;-;X1L zA^-tRqrvqjIJ}^$`7v|36Wq&;nnZbyARTN$FiwEbLw|fA+r+WXRgQZifq16hpj`@Z z#V)gec>Y1fy5@c3ax2OK0i}BKBYC^Oab^@eaQOv_)gvrb30(y?b7Tv0@}OEl*7KtA zi5iX!_Eyjql$-3sWnNi2O`{~|7l-UlvEq#?g(~DbH75qMr|2*`4lS<3M>1Km=e(j4 z6}_{7+Qq9rj~v#CXx_bkOog7EHOzl$iHo0#5j$6#-K)oY7pkptJ_co3r`7WPhUD&k zbs?t6a+TNC>gAbwQayM9R0iBwxGmWOO*_RS!V!grd&q;hVE4edAN)|`S5`EK#1#-|##%{F@B}cO6~U{VIuvW- zlZ$cJxT=*fc85=;2amLj42~D7!YwBc2Eh3K=QBtpw?Y@g@26o<0(ttiwm#Oay_+YH8y-M-e=agT@g?6CFbk3(-wy7W;0W^puP_D^QoePDZ_z;H)Ja;*V z3EVl=VWK=Ft|!{T;QS!fw|}rpM0Ln(8h$>Biwq5E`OYgiLg*`M9U&FJ2ajQ`-=iN8 zP13zr^LD_B5inC_k$@y8AEo!bIzb^aMZcRwKM8v$-@Hf+mppk#vHe zxXLNPk8F8oYmHvt55wep=E=dvYM1=1+7jj(UY9q6ll0tMijv4xwu3*?{JpZ}d$F+_ z*sL`+@4-gd(7g{22WB939dJel(Wzy1vV`j)h0P@@xf+)+*6XQo#QLV)mj(~CfO6i~%I9w6q1oL%Q<7Hd}Fo(YT2 zvmVb;wQx{NVE~RO`o!}+TbNf+suM%Rzc-8bUcqVXPInbUsrt5NY8%c0rIhcQP?o4u zZ2@#p%nf3KrMMeuLKr{WUEAE)T3y=}mV#>Rq--@I^JYngfK$yP3kRAtp;-X(f=!{4 zuMywTK_OMO-=&f|PF$Mn}% z|Lgd6KkelT1XM6#y1;yn+w#jL2%;{)|192pP{#i(J-B~U|LZrx|2*F8uIj)Dpn)Ds ziUdgmq0489DpN0ZFFQ9S*H@vA(=3RK_!d!Ucg#k?U|OWT7!S0$%JBAc@G?rp)#GvD zu&JmkG6;u?07ioZbj;vI>@sqUFF8n1qC$hgpK;yS;x*als{ElnOL zRxkW!Q-z;P{RYZ~WAHtqI>A1u@xb=!w1H;*i)9eV{adgpK)HHj6xJAJX)*bH*lYbT zz5|s=dZN>4{HJf)ZL`0&x$_J_JbU}y-F?$;|G$k!yWMUyK(sHLTl}@h@}>4xqi^$G z7E_^AbBl9b>SwdWokBx=i(kDH6=#%c9CL|Kc)2vx96@DkbE}+X@&CP4c^1w0w+~4; zL21FWBPEy)JxrZJ|5k%e5_zz6t{l?eZFmj!u^pbP*o3@o%G*^k34Wn$$lxpE z6VdiiM`1%43$nYvT;YrAJG_WLgu=#dogc|dSu_MdLB9yd(FgFRC)?d;pnRpg;&Ea6 zd7^?J=L(23U?PgRfC9`Wu_uK|PfqmSri!J(q7!#V0{c5X5i?&Bs-46gUemESl28vjvg1ZzC93`@*xS7yD*t48*OKKHV=|+kq zbLjB=kXzg`wsYEPnYm*~MFEja%deP&$(bvvA=0@cZW6MMpw)ze7|420AS)@;`a1q|RR)V{#7A0Yu> zl%%I)+ma(_5Doi6oN3jV9OIfjL|h|!vx+#kM=hqFfQz{~q{{62GBM?xk|}pCtV$Nk zj8jnN*cOB?Bs!lS`t2bcNk!7R3!A=biSGVk)c+$TMjn|W9a^d5l#aRdFYNEOsO-V= z{~!O(a5iMROWDizCvjd@j&3R=Q_DU#Nc&VOjTW1C`ozO3S`R_1>T_^P!9ReDzI@=& z6aV|)%<9_y+R8px{taXXWh9}<(Ez~oL_2$N=e+Ym{rv~wSV1B&+yY0Vywd|vE9S)^ zOazN7PbUU^h2d=EZYZLjlQp|OUgOjPm&VL{$-@-mVfcBMm?u)jqWr=M`=@`Yqc>#x zU(JMvpqx|kA1$HFP`Fi3RPT}i$1i^`h)P6a?np1?g!sM6>y^>^kF~=O&OIQ4=|@F` z+X<7lj{KNL7zHm4hF^})qP!@9O3m*LxKwB!;kn8TM_Cq4DvQ*O%*NJ1cPdsBwxx9= zwTIiVp;kv})$3(|lF~Wlam34AgF^^P$0>F^9*8~&lzG%Z0RicN7kC80&-l&w{cbqG z1@7ESua?bLG_bdo)(IU!MyZXa$PwGVL@qT2>t%`+4pGMV%`GsZA~9SRw|Q^RkA8+2TZ8N-gP zna9lnSN15vB}(xEJq%OrG!&&L`dG^#>f1|B;L$7G8~BYh1b3G72!xmJhL`qbn%OOy zfM+;KQ0Y0B&u`zk=ReNj@pud=3Uh9mTvvKs`4xk!-&PKd6~d$Wn$Ml%|r zb?S(W2)crGlt8XDn}%1LYZ9R;XA}bw9FHc2pp7GMYBtS0)mo6~7MQ=Vnim{c=!H!% zb^kGx;95o95~**HZzO_3qJx$!)^>Cb()OGlS#C7u#Fx;fUX! zo{)A@vcftIAPdAXf(tbEhsRlLPfVR4hQ{C_H&2|Oi^f(9-jArVI#i4~^cz<-4Xpu0 z3)X+lgJ>3>TW1nJ@{B@m?gCHM22%(D5rPgL0!35KwME2ChGBdf!766V6R{-pO&%k( zb)4~6(|JzfX#mHYiB3)+hK&jz*B^N_*O-$p$qU%nL7@%gp8*gXM+{uh-lFU=5HgHy z2Ccl92FE$C&rjg(D`TU$aDcVhZ0~@!u-9m;#yMC%%VrKavPvp@n<-38G~_TOmAX`H zDNyy)?N&Ulxjx~yWy_lQ87PJCEJ`Rh?L3MLk7>g5nA4?HN;mUGprKJ$Yg7^C3bD_ zN|^^E4AOv}JQNQeP zn@UNul_Wkn5nWAomh!gGcq*jK@n;BR;;AVtfjDZXPGt$Q%O13W+HJz)@h^XoapUo# z@cHX_G$J2~_X#*FQ(PpQIFXv0qK1i_Gfz-pXKCR7Lv5xVBK~HJCvfEnzmNy0IVWa- zxdCG3D2H~y9|R|Y`zq{M%PX@idiE@6BI73x&t zSFZ1H6y*3w$zux7pw8odLK%%7RJ_0JL#=s0`COeT-R<|?7WWR%6^1D_;4;WnH-Mf` z9W8wXobge(Xy$93E(@S$hEp_#av%z~QgtB^+KNH09cTE-`nJww*t9v6XNImu#PKDj z0XwPnX?-8vd6>TtbO<=i!E58VP2LtAXP&_rXvNwO({l$e${UT1@<&2aw70Y&)5EiN zD_~N{xr|(dXLg_mmT9U=Ttiz>J(}%5UxI{fWs1=7!KltamaB*tL)34?GsfmCa*dua zi?a)7p@G;XospC5=(Mgszp(XwI=od#4`M!xxtC-*?mN{`<{2LZRVinlUT>|F`sm}z z7z*bjiO_VsW~GB37Y7{$3iCL3Ma(5d(48zug&bHTgtFU{K)OfbVwZ|>2;(y>QxO`i^M4i2f z%klktwG7`m(1LWS3il`>Ip$^{Ic9upXV9N(ynFZUS(IK`eBudg$HDEIPyC|8!~O5ZQ~p{VZY7Qxj7^eDEQN#H|r z4Y)`Bu|Vf0KP1p6Bf+5nS9jKRDm9DPHwYFrT4aL2>!odG)T%GLO z?c7JvrHegvvYUIKf1mj&v{mrdp{GwHC*X%)yke`Uw^Ro3KF6y&tLn{r3#vc6v(DD|6b{PsV<3}`9ubfHgMxdX}7)mNkn^rP@Z1>(UQ z-1Doe*7bEoh^wo1dA-&C5?zfO!{QxuS%b;2=z!hEso2Nq#zHeS&-|I6+K;FJpB+lX zw+&s?_UamTu_83=sUV&|5&h%A+3AY|v`L8SVT8L1kZm1M#6n^T)E=qyVl|v1TW>^d zekHE1LZ)pkadnj{y2kwoQ~Cj9nGK$25#hjc114nzKu#0BGPo8vbASbfDXQhNKj@~d zmM{eY5#o~1TwS&EU8gRA=GzPe)ZNE=FgI9l>UDa73$Cvj$l|A9gdy-(Qb?oa#82fc z5qjq~^4TBlgpZ%zc$09^RGD4SM_TI~MpB{suQJbEU3~=&u*rgsY5$41x_T>@bjLc1 zT;P$-R{kVLlkDzUVL`#pWVYQ+1{K)rDjo~8E;v@?EaCBLDv$<9|LT z-Un2S*klG6l<+BA;vkwYIk278w0WBhI$yj^VM6-ymIQ%rg7+_1a3TZ`@u;PcGA?hVRr5F{W6dG5@ z_dC}&y??(0o`T@blxs#nx~y4rK^wrN#U|QoSzDcezV^$TzV%D!D+ICNP1_{DCHj&- zX5|B7Lv{f%2X^HwR@9_Wo^`x87)nTu|Vl-t5&JZ;|S(_ zqX;Oj+hooVI{^9lk_0%mjhZmkGp#6CjE&k*l`}0=z7mJvj$S<&yd;WAUaPhIv?$%2 zo}OBz0*3kwKBQQ}eKw{}9xv!{+*EIi+D;cHK ztK&EO;+63qE9jwKq4`w1%L$JAK!;so>LEKLkT!h|pk7Nnw(>_>a6skcTxV7G$vhbQ zBjnXMm5ya1oiE~fl*pFt-hJ;Z(l$h9)pL+K1|ne*x(cTtgSx^I72tP7n5N_?Yk&mi zgqU*gi!$y@2-}wswz~^qQ%XRy-f*WeLORomH>FC!S4dD`;t*9XLt5Vy)q}4%fii_> z=jbDR^NrfmUE>rIF9Kmp>}cm8lSB+%pOQC< z6s&r6SHG$p8Zy*S&t&fXSSD%gyE-xGEp(W)4C+!S;{Inn=iV6g=BwO=z^)8#6at0{ zl0@i@QF>+;+(|H&8KOp_HwEoyzHQ)Wb>jWnRI4i#o(M(vvs(2kuif<%L%%gE8=1>T0!G*x96oM7j}zc9u4A%uR@@g9(I}hLNbTGzB9^ z*Ac!4f`Afs0v4xAoN4ixX!F1{jldr^-~>|C5~30l)dyrfZ0J{uB-OmHIAA>>%4_&- zi**7)009{&7K-j>xTg|~{KMs-MOBwhTbOUY_S4BWff*S))M z5^b&!O|HdP;(4s#`!#RTeemkT2|?Y;7is%->(m;ShaP)vD^oUcF*iDQ zU)lZwpGf~3u6COLgD?qbjxvGiRD)F7`wy@UU`Omc(O@JfZ+rtixS@VP>U=}{GC*2d z#(?#ToiM?QoOWEf_%|S($rOknJ0@aMJ7l2I{TtO>I$Q|!Vjygro7f6+cy(a7Lt61S zg|LTL#l%5$CFjB&6sQ_G&@(pa`73nc2m7k{OocQ6I zkgt!4Hpp=jY%)N^bFdi@yK_^eoi|n>WEL~Ho#TN(^f)Re0ksZGF&}7Cydu2Dpz!H8 zYhwm-{bm~mT^VHq%T&NYt#a$fuC^1MraBigpmCOUNOU_F2fyaS$8UbhfdV>CfU>vX zTAnC)QidpjsU>-C|I@F@_|zR*b(GF}9k6j&6!2P*AoLDY64 z0lwJ}iI4!pO0?0Lz@$SsWEt~7t)t+9p8hKJ5eQXp2~eH%m>?z*c_Ey2GZ=USd7?RG zHIQCQ2~DiX$C+so0kvK<69B%)L7Hf#44oa2@H{ahx{AYqRh=$oPN*_ebDTEki!RHB zmoc<|G^6sWj8l2@8CaD~_>wP7$QQo^%P#>vNMM?1I-NkB!|o!DnoQ2Ata=<#mktQH zI?~Zv4LaHsw1!@l7URLj6gbNk_{N8wIO}==l?XOZy!D$_t5vVxbdG2xY~DokRc|1Z z6C)u9%MaSztM{AEvKWe24os}tKe2QYpbbV78Acokhm)L`J2jJX-ApWP(?q6=xmipK z+R2=gyQXpci7rPXy%Db-7fN^Dd;pbGZ4h4*BL*SId65j=eM5C0Z&3H~n=kb43%x6& zcL(a=E0R~$xDuH>ZL)UfC&$vP6NpX}y;-qdl$S+G>qLXBZbwbC^j_%42 zk~KVsjv02W+dgR@SfhIq#gNa1$j>57{h&ZKL{;4?uxoyR{^)d_3@K<|47`_7HHf@V zDT)kZ(UihH*f@LS*j!9K|02o1s@%ksbttgluXr<4g1eQw_#w@C;!Y)al77qz6`NYM zP6tL2Yv2&9%mkeLH1j-{Un;BVqJ$JUJERU`4c?5R?kP8&&eLRQ6~jbLV#k%JMMYZt z7;>ndVB!^5$F3vZr}2vvoOJ}lta}>8j}4SwB*@l{Ly$p0vFVR7RTAnSU<|g#4BI)5 zgfkoY69i1PJz~IkP0{FmWoxrDMuG{NS~$dTb~b!!lq^eUMc5=5i4MN?nD_?$7F>W{ z2%K=Ta3&Ny-o1!?PyEV>Cs8OCA<~0T!n`{1lC!&z^9OVWj~j3q30d%1x}a`xJxo@p zqzu3vpj2QP%^?P@+t)NSsW%tgaZ0Dk34|!Y4d7nehF)zO)Is(?hvq21uO(GmZSaH{ z$I7IH-6WHtM`=hcn0KA$=u52p|DWRjH>KHYofS8V|KEN9zWy2i|6O?Fi~s*;@&Ery z{2=Aq0OT+y5Kkc26|A^U+m=c{6sM8O;0%COp$7u?EA=pm7O^Wq&2zSp$*N~RNH1Ld z^lZ9_S3Z0a`>P%eoOBVde7IQA(+UamP9V;FLY?MJVq+%(4KSdI{`qbXtzuTYx2Rplaf8ghT6=5~xlnnk& zw3w0i^{t8Sm-GMS{C|r3f8tp?aEBA4wI`m}o;Z*i1~MS(3;#xvu{Qp1dv|a5Q9k}} zx3k^(a{qs(`+uNv!)jNj9w`i2=s%ToZo~ky<|Yt&8*|x^GU;-Ft*$w9LT5sr_LLV; zKcVEA)kze14Ka=)%-|*C$+98l(VR0CHiS&w7AQ-eVuA%y*s27)RkYu!FouShI*_Un z6aWp#keMRVY0ds(R~ zvZ*4tH>kK;=qDs$eR`XL#tEi1nIOPoHTXZw+%>O z4Bf}~;msIOuk}j~=I`|}fDm2nA#Y`p;2(?7{~Jk2IiwUglX2|$I59J4 zK1}H+&B;LTOvpbic|PFH#Q(LuQ-^Y)SsEZF`xm{^<6rtjP3U%La8UBI^)T}(3p{vicu6oJYNG+t@=@jr%exo zVI`}I5P>V%h=W4_2WJ|+m0YQYT3Sqie(A)b&F%5tpgHXJ#q&Ak%7*!K{9(jDY5uzX z?7@WJ{&?)WivSWYL)=y(s?tf84MFpUbP1>%hR4+C9c@d{>9woQgq9f27oAM}Q!)W+ zFn;ZY<`j4b1Um)v@EpNS@p&_-%$0sgfDJDCPjtkhjJ__WJC=Fw5+JaL(Eo)t!`5s2%R;3(*Nx%y*`HjTf`Us zg%f-%|F_-QF7SWbkG|kPd^Y}%*HJtLIOm&~K*N#2rEw5DV@wWj^Mo!J=9t3lU7Y6# zFOe5aAgoU@hIm($^MdI#^5D)uSX-zcI}`kCx(JCA45BDyK2UX1#M1Q@7Y1wq5Q4KP z3fh;_nS;_?jixCM7cp@{OLmQ)J3eN}N#Ro*su^C$5b2xYciEt+rt}yL0*J21B||h3 zFryMUOR&57sS~Ja`F;^jWZX`t7@WmZ2Ia`aQQWe00_r3Lk;4VBh-F*8n@6DLhdu^U z&f5@TS4J$I&`+1`Srj`EnpJ#GY1{R+JdgYY=(Xo3(gCiKmIH^`3oraQ3emYB5NA_R zXy9n2{a~2V0~+)paGP;%GyLEOUf_=(krWuQh?z0Zd~)ji+KFK! zTuR&=aG4-mfn?uVwnOxVbeAqhU{e3kB8@j8XM8EUGmhbtP5{G3w{|p#6FR(myQ01C=NWcEHLCtC>rWHRG?GyEKfu)YPNe6ftCuKrC`~7!f=P!B|lv% z*HaI-BJg%#2t_JInGG3R9nx2(5;_iq)lc5GV|fYw6u$<@RbYQ18AlpB7c#(z3+KY0 zIQBODV%_^<|H~t>jDU~=bpaJ=`*x6Dx8VP_cOT~U|2x~;4|c!sf1eBgyO8PdO(mNx z6N?f>%%i#Q?u)H0U4nVdxP-iuhK`0o*xITPS_b$!4nZ8H4|vi^hB^fymT^q~a7@Ta zTM9YmvAq$+fUlfW3Pu7N`^0g9RRg{Oe0&LIme7>0k>yAwm4nm6_4OBGceDLplYwR+ zCyu-1hfPcl*uF#jzwJl6VC&1_|Lr{5`*Qw25B?v)>|Ax&AE|B6-d5-XQzmd1HMg%2KUIIjFLM&aHWIAYzAIp72O(X@R-5kFM?t) zikI21av^@1DBL>`>7Ky{sivz-hp5KGs%Myh0DZO-szxaZhM1zo#zN(<_ZhWE`TWM1 zm(rE<)atc@_EE5=FOVogMxBKOMsFTb+&Cnzaul8e`H<6BSmD1u`{s8!4@=Nd+;Ks#J9W=l=)o$Xw|q=*bI7moy$1 zYC&O|*;f>@{P?iVC|%b+BH+eys0pEJ{0T{;cKZWkhye?fF`?iGWH?0=61wZ-LPFzX zYNpu!iz#hWV+Qxl11F&! zLuEtd$gVmzK(rUTHfc6gv3|h}1-|%~(IO7zvQohS^3k$M;T2BsmeHFqlwmnX=hFpv z*y2cls{D#xwFhygk+)8iK#QM3NW4=E<^Z||P8CBN`#^OJcISlVk%cIz?wisfnGRHa z8|()gE?}J7J+lZ+SEB$bdlgn0Drwvv+JId_kI=Tl3&iwAJyXcYbeb;ZRuG7{VRUJ2 zF7y(o>f;5{3jQ^8bFj+4SkN(0?)NyfzoEjRf_F_U>Voj0u$75ECQM&c@sNmQX46@u zU7SXaH*+{?;>i?L6rFu>^zuYhkNnV|EoR~+dZ6>DYe3#X^$#XGBExfdt20cwkO0-W z5GXlWF!2`<+hGCk8H>Jb`5Z!#fD z1$~%IQIiG=LVP-ulZk$Tclt9#oCI~!RL)qJ#`k9s#hKd+G#!}}mOX~>ILRKn7>W#a zQW{=ebD@f|H3x1qm!?(%KeIKC{8VXFl#P<+2Wkyx`l;Rh^4xYzm7^Fs_B{6BqU}J2 zgE6-tHq@!#RQ>038H!)1ur#O{ z&1E>$fohrgSGHGNuhU$tNIy*GKGWC%)gvOSi--KWo@RgM2Tsg8fu@>@hAf&CX|4U$ z%u4I>48Mb!8H{H}7ZcGFv>Nd(gA7V1%@kD_5|08rnC{2pmf=lwLp0slcQvn)dHtY8 z_m&Rd=K z6hlr<7a_wGHTka5z}I!LNHi7_Wsr9gMia$Y6C^2;LFaHP^*gpBqzP--qbLcyJ`kM^ zD34}r@-OSxFqGsBY#&E2Pt;K8Vxk0#JQYJk1h9o41vQG{{Ua&HcErCQa=>8u_z4cr zb;bZ|tc+uR=76_`mb3!*9MK*$UK2^bP=&+9MN-%9Y**^_UXuDVgod&&)82R-#VNfg z@$aGJiY)DfV-Pr8nU!`_sg`zVI_h;qt^}J^P9kHq^(*m4i8KUqd4VcuC?@hq0WGS` z&;||RsGsl@qs>FD##5yUq69r8X#%KBM!?jYOcKWY5gG!stEi9K7d6k_*#A4|eym-$ z$OYgwdZ6|CpS_(&or3-U;e$tC^go|R|ASV4t^I+;{ZQSHQSBUpi3$nH)5F7CsCT3) z941s~-(1+ymwuwdhVyC`l-FJQt=UlYJd0v+;-~HuzriKLIh3e+)GpyoC~=LnOv6N# zW#mx0Q6TJ2rde6KyYMh+t}RPDTvn8&?b=3^&ex~!m>kvM;s+%|SEupH&eIdHDw35v zv1SXNA&9_<9|R8Z;y7&+elVQV11*^FppLXllr<`CBGt9YqoJo02Mfq3NblgIp~)#s zW`m3XjQ0q-m7t~E@wNL2PxndSq#$h)vqvhqxhgZly16Bl%tXwXF3*Tf$jB|c3C*wN zQ-@}Jd@#&9+Zi_0nVFl87*J<6)IN!2ssU?YHoxkc2U!-I+1Pw!hRt2Wq84~-SWv@g zMzgt0eLQZMuRQS+mE(!ahYpu#BnN+t-%ow?$$(eh%H`0@7H1?!j$_YtmyF)X+{#or z46(hO3e;zhA)PjLlx;{AOq0o_+OlMZMjw0`1q;%6awz@q0!uRNe@qA=aONU$h`gPq zCNKSDfx+#|K=SEdH~}HEYuzTksH?y!jj}aPjEl3~e{+3i2C!C=g$2+uCro=r;IcrWe$1-`a&sMG6=fuGyvpT%FyleDQBcs>8$d02@5+}VBjCI0Jk@&5z#V7v2l!PjT@D|xP(L&CNE~Al0;+{ySf_5P>%id z`kD}-yDl*9XkRc_NT&s0t{yt`@k0&bj7TKV?WBEjdiaLJjbP~Dks;7`y$mQ-Jh&>#EK6P$$04)a0(&jy=~ zk_IHEVUKA7ej-?+ap1cI>V^P8lwJy(j`?0tE|K3)21sG|Z;Fz_ z03_nZ63V?JUeP4&3rt1%4LAjT*P3}>4WyMe1eSq~($bA$&*BN+rKUqx^1fbHGJhOI6Q)D0P)`1ys5!2p4rGylyg zik};QZ8D2Qa}>LbANLSVaVpC=`haA-Sqw2mJ{c>ZW6RJ{5BTMr^+suF;tOBdw`{8v zm*>q=Xv{&1kSH|_b)VDNNix@qes7k`Wjl2{n^F^Cg{`f=HkIi!} zI*ni=bM+#-P%n;gx6t!7iESI5sW7z6Un&8832Py$w09A`{etq$8zv*?DUe zjvP#EfYP>AKAcfGzk*VB1EhM!I!qcR!XnDvL&sFgN{%S#C#e;qZ^Xn@CaDs|mmliY zT2B9G8SBx4XUbh5mox|G)76U-&IN@iqJCPG;pLUu6%zDfot(*G39{o7~T|iNe;B zV=~kHYiQU}KgvzA|N77W)4zz`(Mk90`~H8`+ZQhY*a7J$4C@8?{%E)4ewctiBD?*e z=9~&_`xkSlnp*=aOk|a5EAtG<7;=Ugb2b$NW0)J@|0xc8Px{BbeKM4xUi>7EMu7q( zL9b-+jD88uSsAnRJi5qE0MrL};3Eun{y}Cr%<1eh&r{Oi>=~HTw=Rq`%i{xGz13T9tC8&JL?V3_8}z1M}S_uDXp!m*aC2V zS2BPfPSBq`<8}W;N^j)2Z}s*bbAjE#XVQtm3tjK+Kow*s_dornU`#tjZ!f~yKSp>v zwlAqtE#s0gw6BoEh!Gt63N>tV+h5*MjC{e+4@~sq{;fsgZ zE$)9m3?m|UO(ksJY5d>bgYClozw=;c`^)|RdG7zdUSF+c*yp%7CtR+-`;~`4l9u~} zDYP!iz>QTjM&1z7sR|drc}Y7vQ9dm|YD&dG0ktDTK!rn%-mVFXX~bqA%(quC9>4t` z#8LP3uX<;qd)$5Y%RzsTah!POgkIu0q=jVXi9nT=`PwjINWs@eA>-v7GoE9Z7XZd7 zp9}g%WS8sjD8PRE9_JTUT;uH3}Kkf|%;^_Hd?^$k?YK|WRWkq^SfqQ16NBo3D z9PK-o4`9rNJz+o{;Pk2IMrU{-A=eV=N|Q7TrxDZBA;9cqQ8mb8%kHH3K{{{YC(j#7 zV3)cqbIbmx|11vsgVPt7GD}ENb0`^~Fztc`} z;bHlvhwPo9jFYKPn1?zb6kQLAl{Hn0ZCIq{{}O|<)9zXCY5%~a4>NffA)^=g@{rG# zCWBT{j_X6C|jQO(NXcEqYXYfTKCaW*+&nokGjQ=x*L4d zUH4H}f7DF>-~FvP?HxQnI_e!C_72rj{4&4mEgwA~2$W*Xlb)^j*6i%}%Q@sFNr>ZC zJhb9%r}}Auf-3&=iK9=u;y=fZn|E>i*MI))f3OpgJ?|bKbx(3pjmFumKbt#ls-yET zd@CDr_(c0yWe}vO`c5H4aNq)R*PrI%16BRqTvz{ll{`C}Rr{HAP%Q3K$`2lOK&3-p zml~(L$)uz{m6p_3!DfKkrebEPWQa(nS&EFp+i8FBR|C;KJ`_j&v;I@0Tbp=7-a7W~ zLu7~&F6rNd9C0)M&#HlD5(O8ZLjSk>Xr~bW(RtYUqW}9${6DLmK%sL{)c>JYNE?1i zg#fz&S*in6HL@5Ts&xybBP$A=oIZd2tan7Jvc4e)oV?KV+}4h9q~MTSH>@T`r|GN5vL{85yO0|(M!*#Q7?6s1EKiVOb#=)B;M7N~EsZbsKC zx39;qj0=V>_OR21E%9XJt?UpXo1PR;d>MFFKkN0w*vHL@&l6F#5HXY@vPO~Z9@QL< zBNc&x5Ts~(vs-u!2!bW=$EL2;22Ti^@EGnzdCBms*zp@>I##&2R_a#=&z})H@w9i` zJGJgU)~9L{Q^MU{tyHx%v$kSYy=bvNeBpHgNHR3+zmDm5tOwZ(`yb%K)_v~1>^^&8 z^|=RpJYAOdIgq-z07aqtoY|ausQImVY8XNNW`RNEa{Z1nR%Tk(Cd{Jjbae8pchoyR zBl+p%Syxe?Y}mf7M9w-&6g0`K3S}*-R)r$`nidf`Fo|4_AUR-)7>*z&=3A9!ZeEBX5hzk9HS1g)iI1VgFqj7tbntr$0G%oO}6ET zT{pY2OIBqr08du?GN3!HeSl6k5nngzLa=W`(yF1ell@<~NiSM>zt2QkM(th*!LMilNc!xU33}hNQ*FEWln+ z{%K&t59Kh7Qo~rA$rXdeWMcU)IQq#jF;A3Z^GcI+QL$_c)8%^Qu17%PPN1gQHfuZj zshU|!rH=;qwz9Wtu14A0HBUo#Jsl~A@Xo`T9P|gmzHWt~aFx%f{{j40bh<~GoK`ow>~D7>sx|W}6&Toz5c*J`69t%w zULm3au}tE<^e-PnaK0a6HdL ziE|YL_k&2JfIe!cQwI;~!1}E6047Q#CZf) z!Fm~bk9GjNDiX8^j_8H8qX&Ptq(n-V| z^pGC;(?^b%=&8rkoj4cL!<>eIBΜiD2IZGfq|IfP0qE`!GELoX#^=CFJ_7tGcd{5$N4kG~IZR(>7P^^LUI6shqmKGculu$+waH_>5TINj~ zr55L(&1W+Q)F-?ZgD85tn2QwgI<15>dMb5(Im})NP-=w0hpzIz6GRgNFVQ%Y>JWpk z3O>&a-NIu=ii~6Ky>r}DXpd5I-B-gPi*G`+pZE#xb>iBEfpbIoP&{MO=2COCJ?x|RHyr0+H@|RSn4?vhK+^c!j{0Sh;9@D z;Z*1vbfpqgNm>>-P+4lG&(Q#K)Nmw)b+AQM(P^N?-#dJU!W8pPrb0n3JBUQmjKW}P zK}z!o;KCGP1Sx}D1vZj8xOtz(aNXzxJ$P3;S<<5}G|bZjYjHW1VYUXv6C)MSr#4~* zgnOA!gJ zo!Ch(8A^|o9xH3FPIZzgLdm&$DT0oo2Mj$Dx;{TBU2k+vh9n%2BGT6YEeDw zb!!{}g?fctD0frT>zs`MG;BwU*hw4Wh#1aXTR=k<5_#9V@RKMOoVXMYAn5!l8LvoH zmglkm4kOs?t=SOWv%|v%`4aZq2Zv$;R2iZ1TiBr^pA6f8Pe{1ef-VGv9B15fVX&0%dP`J)vGCou;t3OP?194U50=7wSK@{ZS9LIvBfxt2T>5kTl-sIjmP7yhAKUi z?^69_dwbhFc^m<3ckUU8X1O8__n7-YD&y2I7LTJa9r(Y7PIn&8-*L$kXXXdXt^F%+g3 zBdT_^FY5Ey6IBZOPQ=OSA?@)erwMGBq?Ug(a6-`a;rrTE)Mjr5I;s^uD4MP2clvdF zAVaTGGK5`g2;dLLX6WK5Y$ynPM;Gjix=lQC?*V>A0-8EsCOi*q`&EvB$I#=Z6M7g6 z@5?0DjJ8=|8)v=lzNl-BUasyz->T&Lxu@VncQBRi+rlWaT8w6l4tz36*31Niux5r> zI&Q3GP#g6XcG|PH)82mG@ZSV{3<60x08*6u=l~>#6m~7P zGJpeQH@dP!lzxcrNojwKi%JGhfb*UF=wrg6*B#7v z3L!W$Z$SZMfFH*)nd%!_y;rhCxI@kSmn;eGYBSGebB}dkZZi{&r95%@iKI7pMhdg0 zd&Lt|Hd#~$XCOBrxYOT&^Mu;7r5l}2W3~?~PUKUyjd~~jgZ63fS+6_jiKpGOUT!-aKRLDb zLO70_4hEfIw$?BLeNZTcbmG95ac$)`+*!2^$3Dp9VB<;~V(p%Mn%()dEt|%@`)TnQ zK#@}MT*0eQpp`yY`MP2cHMd80%0^=L$Wwcp=@Lz!)pts}1GV0tbO(d?;>1b#`s)q` z5S_Ya6!_Y~^W%fw>G9w_3GQ)7ud8Bq^uDQ;C*A(D_u`4;69Iys;>Umbk2k&cL%093 zclciX;P@BP!&j+D{P=hOCHq;u?T917iJ`l~l+cN{javYy+=-me>N|DFP-l1&fhg$VD9#T6U;ZX%MH0dmk-@P(+%y&N8awv zZ5rC+hGb_XD_Qy#QZf4JQ#t*i2 zGo8@`xwC0AYFp_Zxt;Atc8|uLM;kT;`%5*mx3|0dP&YGr)NwnT&JXQ2Zs^b4okyeX z+f4NN`8j&6AgwrF%tn;p9tfnC1{Vox%J!PbHw*Inq$o1v#1(N;!6&4ZwBd3=F@+p> z;-{pzuGbIk3iZ0EK3C0vg~P~>wS7<%>$llteO^}|XtF$bPC`F*!EUd%4*_+gB5f-d z5>Y*`8_V2zL!8$Y>M{Oc#6e0kabC09-hsB26$v`WTo$xAj{#43rKDoDvJ0&MWqjLI zmZ!9~pOr7qGa|yd`0;Q5UYxJw{pmSg0q2Ix$HBP1dU+MMo*Cg@ZiIQ!_B_vEQtNXW zW3S-*)*WpgB73k8{GLgpLn+pJT~h+v&K>~nCK^M$2t|atflx&w3GicxGYoty|NVFo zCc1a#-Mtn&o$ZVBQl8?xRjF8d2hx8eZ~b|a+3CBjjM4<70*%%L9Nxj=fM+K$b`hnb zK`if<^4DCV&caU&@IBd%oo|+F*WK1D#65uUe!kfmR1U=8pbG_cGRK8(IrSB@=Fh10G-vGS{C*K`_ zwWUdIKUXS#@uw>5Xg4GN@;l$ORV!A^SyMqm^58{PB@6^WCGZfhRVqgizN;sJGkp4? za0Ji`HFTyuYWb>)9MtOdeReP7xMRVmI49^Y5cFfg@7 z=LY&w;%0vQ+uv4-Gez&694TvlRt3`(sznEpH1jRxCe+Y2Lm3*Nrx4XL>AWb_*K+L_ z*TDKjsW7}R?oEp_3d5=V`MsKE4D(O_}>PUH|RUE zM5a|EdgvzfYQ+4CQWe+e!sorUm585PzAas{kK)S-`NZ-uqdf_`wA0)*q#A`T+(1Oc zp~BCt$BxyY*lj2})8KS{W;B(`dwxj&-e**|iMY+b_u@%R-XBX-#9p}@w^4a7n&zL# z{JP!0l6P<29QMcNKi-RK7=^MXKH%Sb(JU5eCWctNrdV}u&HUJ$%zN?LK9{fIU~b-@ z=WwOtR^mJHJ@}4*pTR~)JJ+8*?vHhdp+|J~UR#Inb@ueV=Cku2^=)wCDe{1}BlKjh zCy6UG1nLJhZ=(!E+#lZI+#maxs&7@bj1C5!+KTzn{ZXg+y?7e6!>Bol^ufMqKUeB? z;OXInp3}$A;i7OvdKocaug>kh=5DGsx@=9{H*_Uqf2x6>8k%d!sP0CSkl;ta7%ncS zVCcp~(HsI70?o9NDYi1{$SLF=rZbxtd^N{|T(;s_(rDhq)PgD776xG z`<#t4mAvh_^5gIR@yFl&=EvXthAAJE{I@`gfA>2sPo>ksXRW0(3(QO_SVogyMpPAq zrU)XJeWlF@jEif@H@Ks@)g;4~A+zNlxTzIt>94ZFr{}(TMf6OMl{H#vPJo)%(Cz=e21UPaj^Q|UDQ(39_4ZgP=n@<0M=HDxn5{3rV!Rd+h3Nr4SW zPjy#~`Lx$PJnDg3urPD5QPEA*+=PnlehLn2I>j)ESrnfO&nVq}uvFAAVNMdA&wvY8i(^&xqcT-Rv@k z(9S00U{7r8EOykMRGo!~9W{_DWY*&xh43hBlATzOLc6!HJv8TYqd$hMzq`Q1TEbPj1Ihk|5k!zO<`faWT9H?4s7gg_}>BGjA&cTpN?T8E&!I!V?Q6AxD8sC>h$BHg|BFO|YY}4u z`7&we=j0rAA#^Nkawurvk77vIM^1_uLO}bPT`1r+S_s%+R{vl&pxgC&KTJ|52nhcl za=)IRpO2hmS_$VfbdG}wY95N4yQj2Ugmt9$EV?TB)<^1f0NQoJN#Ap$RO+Pek%Q%kW<}3>RGy=a`MMs*5>&$pq zRohuZZ8+4uSfKvkBna9U!y;KcU4~b3{e~cG-hF{t)dlQ5AKg7|`%DezEqlkn7j}1O z(k$u-bRDA9%yGCcI-SBPtW_%Cw6)FwoIJoivxymo#lciMsTfS9L=6dguDMv2U>SJ9 z=I&1R{HWL0sBlp614Lh$P ze*9nmXYs8#mY3$@h**MT*z2kn$pnUg9zxJ(*fZd}0)+lw|M_?So%j}TzX(&DdR$Ea z!B(}{5IQ@gkTYo8NAPft)u3j6`+taU?U*Za{)B2s*C7kFCH64DK`bS^Gc_|)R2`sN zwXMZvI8%7Iv{;36k$11Ef`<5hhRdy0$Q$c`4+>0`xdu2XI(@|Wc7gP)-JAv~#M)&A zh@8XQ2MLV;bl#?fqj&c2Ju6_74|=(>PK^E-k^L^)xZ_qcl5PhXDrMSOCES0&swhQh z-V9>-Mtnf4=b6SpzkaK=w)7vC(d7 zYaN2NPZwdSt*1ms0%RP`A38Kmt+gf#IdfBEovo>{&X#1iijJ|AB7@&0Rsy_L$KxpQ zK>iVPe@>tyMP1H5yU$R-!CkHO0M@!-#ro)0siz5MCn5iSiX()G6LdSnSQYjVTe-t= z)adY~x4ByDj9m*aS>-5$YGbl+rAk><%k_`^G^jczuDTN%zQTA$Lq~64N29Ug1nB;i ztTpOs;I5&zjS&~NXA0?Bjn^2f-_Es8@0_iHC2MVashyLd#qufpfKkJpnlw0#NA@V( zhMHNU=G77JIsQbd^(L;{roJE{G-KKkq{}PPaL&9T|CO!Hb|A~gXI6yj^+P)wZ|y_{J^0cz421RI2t)(u9=g7qBURRM|(5$F42jPa1eW~G*1 zo4Ku~G5-!nEVMG_&;(=2On(yVp38KHD7I0=Qpy-YMG1}qrlFN+ti!;g zP)G=SChdM)q`4+Zv}4gRqQu=Z6NiZUdNvMj;Aeo5YIzdpMyNp1;cF={-w=TAc+osX zr_Zl>SA+7~1+V7-q$Z@i@CLYAkd_+aKBFXU=7Y}PN;x-2iR05yH%0*?e5gqwWC(4; zRvfX%B2I_WUGfX|F>V3$ojx!V$LufuI=-V!45U)StlWT?mtEoY=!r%hyLEki8m z3Q$v-Mk)?k3Jpa^%BF^?s_zd7hsVG@J7R^$gwZOzG-&_Gk)>8vHBoZx39JhOSYZ{! zkH7h?`0+RYcpP0g;^6e?$KU*uEn{->4x2V~TEdbkHQfV2QL*f}+w*+;*TCDVs7S@+ zVz?lNK^EEER%Hi1RT}MrU(-yZI-5zJedIWGDMES4mYA>CdM~NfNwVx>DJhX(qwXQ$ z2=g)ubm2RzDA!HI>1$eEJWqP}B!=p!F$2kMRd#WvY#!Cb{?zMY;KqxYiag`hDKMUC zM5Z#sC}K=fV)K)&${u_P`NEFK?*jT5ObUNv1=Y&ZENV>YrqQpiK%qJ-nYmWw0gj#E zv{uDG)$4ffk*qSe6zUHTj;wX3r?hYxevMY!rZ_Z4JmOy?yJ#_U*j0sTK<-mx#}Aa{ zC23V2;yD6x2(PZ1!E$1kqc&+ohd)F86nmB!+LlHlA1BbNJZc#$F>)38HN1%~aw?>Z zHMW)4kbWf|n?StgngBo6V?im!A-^k8VkPT?1gS8m#p;1Bk4}y!N9YIF6bXGyK^p-g zs%f>RBLn3-Ax-lcQMp?9F7_9dgw~Kr14$df&{s<%nejvwRomON2HAU5gt*KPL-=E{ z2$dr$24zEgTHmWzuqht17Sl9>8%AHSe6J{ypmd#DBb+4rmd7kZr)O3Z?%IELuh2e-Cyt3ViIIc1x_a#+ebyWdiwS)#^WJyVyW5I( zy``-?nut3%SfRQs_7eINlnx~2XZ5MIbeTJ&-?Ijc?!{QTD? zy1G(YW;A}As?}A#kb+j-#ft)uwwyTbQp{=8f_*qcFLS`MI`hrc@2p|2@_YhbD4;20 z7~TfT_)nvBzgs;!5Akl5>_(wpI(M6B*)dFW95@pITTW9VI|5y2T~M1g%1LUDe!_T@ z&#aucHS*R#mEzrU^ae_vY@)O$@_D)ME9TZS}iEdZ5?|1z`z5p@n9`!!!`%p7b*#aNWhETPnT^^ zUPN=^@2$(d%-7XY^=I8)4N71`x7)Cd1hJef0u1KJLK&k$;P3u-yW6%w!0NhX5ztQD z7Ak~LXv=vhMO6djWu5-3Ry$O}e81{$8v2a?_y!9LMUiPdEjJhu0o7i^-usS@`QR@I{KBo>nT>+mCK{j6t+^py{I$8*7w zp{&l_=;aRiAFiw}z0LEz{SbHPMwZphD+n}msWC-9i*mXc%S;N_q>)p{x<#etjef#U zP`R4-`dg=KZ4f8p6j+y1#Vgh=V`x4?^}1jSsWDO{4dUlPAFKLDq6lPg`C!Fs_QpT~ zgBVIbT%me(c?QZkY>b39dp3JC7IVz}@aeR#cy^3T(454MhZ%Lo{$#;X-oPpc5AGn%T`5}k)3@PCHn|zZSIWa8#k1q| z4fZ|-SCUY}p1{@s$+4Q__D49y3Znr%tYb)hgUSLVSq*lr&@``VjARzsuIbrj!_nW^ z#G_pEOUbw586rBcuQw|OvSybRkS$-AP{VNsjh|(=57o(jF9SbH#4}J{#h{Y4I7X)E zALiO@1ahJiC9cl4Q?h|%L_O469d1rrBUOefWMFyI--T;*j;x7n{>o40CjBu)_7B=; z`b5S}JSR@0#*bo-1Yxd?N7&;eVZow0!%G|(r z-`WL9=**L8l%6+CV!UVsbHxZeLWsv?g*KWn0K|kWlExy7jJRzCvRzjd0%cNxi>d6) z=cl3{j={1>Tyqo~qamlKW6gMm(}yYsiYo)@m6^S#`gS5V4S`4jV2ALPG_(-kVo^Lq zhlk49M8Dj$t8HgzJOfe8c1dEH}^Xxpn^b_2DeEvDPT!Uu)@c9uSC(Wfx(Svam zrNV`*nN}9UO1+L@xR9(4SwaOa`>P}hD_0dE?#Zxy4;D6T&bLuRDDFGuM zDsp6s2y4SdB8M|~K9ttIu`k9>kN_YfI7^Raj;CCu5si>IF~k`>7tg_3G>a}I>>=KJ z{lgx!Yd16N>+Z7xMA(W8?YV{bWxcLJvFdf|*P!?OSe#h^U7~7%pusG{T?eRM^95ys zWR8dSHZ2JYk~1XLtdHgRV02^ zI$&~eLKUe2W#=o_2oQP7_}EEEWvlJ{4Dey7UVfl>Ft`?Lj&B2=wjK#h>mVWbKvPLG z(#ul2lRPM&MjxYu-VV5VNp-c_Tr}RZ`AN_SP#K8F^)rAfQ_gB&jbBs~cPeL&mBzWY z3NTJoXOa7soJ<%xPE_Yn5Ks|h-K{1jt8NfYCiKJr%Zcj2;AQ*d@JTIqt$G)9CFzNQ zg^Cub7)5>{V@?yh+sZNW`I#Y|ySc;>>MaK@pMmzQt)I1gd*ol20Su)!Z3xbNp+M$V zVawS=SD#QpaVqJfg{wzf(!%oORS~pji&~-z2&5=>uiQEZeUn6c?G#uQ*(08no|H9M zRFfG<*6daq(49@#mgOhLh78Tj#1oRl5Bg#(r8jciw+-?A+1UwmJ)TUdaUfhTG{tc) z96z87(1uC8Q-s9EZ2=M+rTB<<0}_e;C^IKqpsP`0U-@SJhS<%0k;aRSZv55_%tW!} zjhTr&w=jyo`=&jLzXNv-B^zslhW6heY~9UF&yJ`EpOm`$F}Q&j^^!hKs1(+Vq`N>sq8`K&rOsJm(_cBctm++aGnZf;87 zlbzE~5lbE^q3!WOmD|jOlJYufh{Nb`qhK@iwp7!{SnX{+jSb;kM7}4y#XJBzz6to| z>HMDFC~DU-x;1e@S}sqH7AOme`=yJqW(BOnuB^nmTYA+&aRDAXj5iX-2Ej9XzaW* z;(pEm_<&B!q7wI&Lv1mc2*%_7(&;%q|G*UOydkCy_C}ABo^-mWnk>_)lb73BQztPI+ z`P{oX&Ydj~X@Ks0Mf4m!pmjePh>hlG zC;P{Ham2_Bz==?DlYyaSHY9QT81&p~J2r`=UDy;gV?E(MqB^4xGy@ z97h8*pn(-%TCWd!2V`+zpK#DSfZ`I|LSppK0dq}5cuwko@+e9$i4B_Yd#6uO47VJ| ztAl6Vj0Ee!w>|!PEOipGnV<4~0J{?d1>pD9lMMJP%3GAun z3PP4f-?`w{%=y^1MOEF|04;io3C)E>g&7D_eu}qs4BnT%gMAMoa;c1^_*JxsLkSWQ zTxX;kBo;y37snAwAWj@DU<-iQuN}BdkS!(3;-mM>58tW>2XHTI3TJF91^Y$j2-!bM zALLHdmE~0io4vQwv-A{vSBdOJ@m~C*%SQ!KkgiKx>YntoEvWTeQS0*aO%Ky9t;KF(Ep~HjkrSw+P&@~B4qBwaEP5;1(W&~)12OYM0vDl_eDDo$ zF|oW$TqkwGp~Vlp<|vlVTZ+O<7I37R;+1$Ku9RqbEvmcQ$SvfH_a2lMchvWBkT}8w zdZ-4eWmbJ@tFCvp%lfXR@VNt~1?{g@*3;fjudGYmlm5!$Oh?W2l<#Fn_j0$imxW76 zn@%d5cSw`xe78EQx`kQ*)w74CJ$teU0vp(9UB6%(Z#Ywyw!!L@))FXYvzMekSh={v ztc@}Wb$h6a0Aiqp8N8s#0{*m%c&w^L}mlWn|HXnbH&S~ACMrsZVEes`zP_;%|- zwnCwCN;9B$fIa6YyY{=gC5`Vq$W+KTZeJtC7&QpNZUPX#mcpEek{fL2FN=uBk1 zFRti@Ky#cL22}-(BO*YrtMrTRnks0qnvu^wb^*F<{*O8@L(hLlGiNf)L!KRRDlz}J zOTxlA%w2N=gfhfHU_j+*lH~0MPLk;DWzd>1Ox7r#n>4@no631^X41dIOK6uydtuVl zt?_#}$@t9pO!(X zHB>OUtMkZ|Idz1B7ZPF_5$eQ~b%H|zhQw}SRlqfNms zflcMFw$kZiQ~!?#orj&hy#L3}!@bTI|Buh;|G|En%4riXY!J9Z*PjQnQen+FVd^oz zEyhs*{#Nr?dcKKags}Q_U!hV#uegtrWxneUSE3Ooj5exRbblwD{F z!s(?0HYotV=(1m|r~Fgvb>rEQ=+J2(UaTVqc0@rF&x;}CEx1(|#@|(8av=zY?VE|x z#)1G3EyQ`$XRufy@j9PMw3`NUra}zOtX)DhmqMqPu}J-yq(pLanfmAqqy1uAh@_gB zsHU<14v{$$XJ#gsHFFJU3S-_D69$LEsh#=B4D@+2!EeCK1xw+$ag=cMX|ezzwxznR zz;#f$M&KN19fKR1CpQz0C_LYpgi(?LpkHp*^;+>v{{S%=j@d{_Lty7{RGBFLc9J^a z=ZE{o_L>dN*VV!<@pZ69%48lPR0@2sCC;XP0!@So;h^Am5$Z#R2I@MN>_KlFk|{ka z7xVXM54md9>-8U|OZvhQR-jN|U@#%AYstrOsYgrkaJ%_)5J*e*qPS42Z90SQJZKyR zRFwd>VC#w*hTk_hSKg3}PH3utl~z=~xB1!skhuekM| zaKBXjCMd1~DF)gDzuIHO_TwlOPrwdaV>AT7P{^D_-njSF8<1de3~$^6S^wTM!e&5| zcyK{D;M+nnGUGj_Oy~}0w*EkEeFeCXF6S)URoZOBlZTfjwv9UlTm zmvb{XHTZ84IRQU^M8{+wf=>K!@^wWBJTZV2o-O4z>@w)c6F=PIN`_(`t+RqXk`=)r$#`(hMDp!>o>f%kw3 z+7{o6SBUG-W}J*xy?im+K4C_*Wqv936Sz8%B1Ey!twE*;NK=d$ce<(?SF7&%9yUeP z$qARmFD@u#HH{FSNj;~>Z@z{Y-dLuK*wCw163t{)9s8R2_B-{c1q(v6(_;Ept9@O$ z*0bMx2ZS)SCcXfBQo00^-c##PE!#RZ^@n&bLNErvaFaxMwrZt0)ppbnZ`>{o`MQlx+(S9Ud4T})uORAX~0`% z94@uEZV;=ReYJJ(4GiqwoBK8RyY1_-+3o6q*@bFU{0P>{-Xnv>WC8?kBvVAtR9i)Z z$4z}115>{&-6{#a{utlZ8)oEqgB$@d`-L}3f6M?12ZI60^y0_A{d?6Qav_K};(I(& ztI-w#e?m}jb*r^i6Yt*(`!R?AC)F)%_}i^ojnQLhF?eE+;R5_N^Cm9^z4q$f7EJp+ z*ii6yyY}a;SDiQcuO)%+%4!FfM9=d%z$3LLGJU*+3#9K=xBleH`tJ2s4UbCcQbR197`ecBtG^`9T_Z#As%)%0uaHfP?1wZ&vQ)_i6c%RWU}mcdLb zwD$x=vp*)VG9iOR>IqAyadb(11l9!k#mR~H;2w+hEVMJdYv_bj?f$$=t6PHwx(jdB zYOOSSEMF3{3#)ux`&ymfzmiLF68T}O#8(z+{Dk>*#b2V=F^J)s8C)qJfecmP$M02| zFb9C_L#Y?le$@l5>Z`IL`iBi5(2UX=N25iO3J0ik=%7$uwTM*1P(Mpp28)$=LP{$A z4b1~(8W7)63*X^&A-;n%1TA&7n#Tk*BVVCV!ZQue?52{b;ArBru4ARI6^SR6&OI6MLOjJ$BO6ai?_p z5Q03KmCC&8wT#Hys)N%7Bn8&*qy_mX)7+CNeik_%SdV3^&g1wr(k?HJR{RPlOnqf@ zC|#MUlYH;Q-VctSR-yHS$g}0!;>t|9_KCGZZ6KhpTRhk^8sY0|yCK@{lFDCKUwijo z*PsYVZ>ydJQqHMTB2)8HW=`^7yJ>FJ5VF&v1Ux|eif4Z4<9Wpi;&iqcakoaeJG9?i zHCdK$2N%AoVR5Z^(PXEo$j1V)`0=0qqj(Hv=I`}VLgdTaWeuKMw`jJp>hAXTcCCUf z{Nuk9Pov1&7tmeY&j#fUl)Z_p6x%uFM^&f;vkU)iE#jbBvxd=j=6)M)fvuYO(?6v; zgj`;&iEqFCR_v%=JU^w*+s6rNX1<-_1OOZzXks$=0oHk|rn*+WqBr-&7Wi?%0R~PU zr|!I!#{P`iu*&NBcbC{&mHJ)SocTR;>xEJ6uU!Tw@KLc~mIFcMD(PkU!u z4Pj4p%SozR6PX_3FQ^VADXnhd@uLzN-CvkmrL$uX2*efzIXCv>BsJJ|u>T+To;*M8 z3C4|v``li+I9jB#x>c`ZH|zB+z}5wk2X+qp(PBt&S*_J7L_pN;JBgziWD)qbd;_XR zY3!9Em(PQC_!wszt=NOU1BoklPv3>SmAMcbHXUxPBsv=iTiKrGM6KMFjT}&R?U|V7 z#jS<{RJP= zy`2o3LAf|!mDwf-r5`1;GpW_mIuqIbo9{k)_aFZq+UBKAc=<{Jehy$M=X2@AmDMuo zZEvElH&~LJrvFe)111TP-p7idM)YL9lY|;um}!V;oPu!~(?^+uo0mF`H^CahA@cV; zy^)hGyU%{;{&HXlhf1cdvJ;SQF@LD?awRjn=Vg1Lb`Cu`S2rRFKQ%-bwLtR=g68fT zLGzH^E-<3EtKBX{6e_ymr=rK12jnqioe* zd-uVvN-Kpw+kOL8--q_{6yCbpyKcVru6FqUO&k0=c$2Pa0B~aLuc<8w<*@1U^%0u5 z>;-&K_C^}D>P$22_l_4c8T+o~ZS)C*S0$y51NjcGFSESsBv@vap72}xWZq!1RZ?2{ z^je)gQhmKi8UUK&iTbiaV`kcS}`cJO- zE7t_&5znOe`n<50*NXkno7ko;koems1&CM*++%L4FW??07dXga8I6%CbR%Gs@5Z#5 z;YU7L%(jIT)%X6Pb)S%J1g79tLJAPRWTk*&n7h~sJxp+uXo2PSS3yCJ$zBJ_HPyZn z)(aPWDU{p^MbXZ1o4H9-(`oR2?^w*kS@aw~Sl%>uYiW65_EhYL=2eN1@_4|;tU15i z5%;gxO*>1HPLeh`A71gsBobd-14Y>KOTeeHsH0ISSTZ`A14;r(jX@GZz|5$cQ&B7E zHZ3jP~w6`#Uc9{CWBRMd>1WTTyPN85&6p4Yy<;e03>Yrk_h2H<20uE2WZT_g%b90{ss z_-T3jhe=x>zeGvlMVc+D=jKFXGTzNecupQa22W>2%O&)nVJJX??J!A0vC9wbdn<43 zg)BZ<^DZj?dGKv}A>7X zV~i9fb;*P6Z5q-&m1hN&2vUKDe7qd4lqsu3aUS7j()c0{a^B79A|YFqu>w;7ps80B zwUvE>W$P89b+%_8B33(dzg34hZ`Eniwe?gHpnN&^tX0Ra>EZ|5+pRh(mEbC&EO#Pb zWw%v_C%!AiBGkElbcL}@-D&oNpGwXpONp&LUnk$K1 zBl~NxQmbATaV3Kd-=EC zs6R{XS?g_4v^u!$Ei;B>&=DpKuvRv4_z2U|4X^$QPRRx)DScD3NecfYL&WVirrwM? zERs=2?r#6-o%djSyRph>$@l42UtMdIfR-*;^klyEsvR(br{F*Z!@6tF%RFD#u(>+qa7{`-!Y9xs1?IrPQR3XX!HkK? zcx}|q5lb_FE#~=c+FZ|`mE5tIZnk^U2M&Dd$6gb-`lVo&CCS^sRCv>i(`O}-O${Zc z%aS{Jl@08{8b%wPUVcCuVD*LO7}!s74R4L#o%tzH)nJ)(y;S~m$ZO9r1xlMP)ULm?m}IC2 z9I|#{VvWP=aLW>-4I=TTU-(wMB5oEx&>BZ^&vB>KD*OZ_Vo$!a=oKh@;mLXjwkm~b ztZ=4+_wjkIA@u&^SM!gwH=q^bBCOH2=8I%nRb$0oLuS+l4;Pyw4vL8*`+e7JM&2}6 z#+&DT88-D3?7@2g=0YBo%6;(}_H>mA%C2?C&Vqk(WjB8Pc{~FxufXUnIDW151QhPn z2`6{x5V)!#=ITltU}uQ+4uvbWxIM$4XnmB+;HPvIEVvo1H6m=Satq0yoCMM5>>bol zo*kL>Pik9tBJUI_{hdfWIbWxuC-G0t+lkN3=kj{8&$o^tEYKAp)=(BCEw!7xj`hrC ziOkoP&3&sdo9PD91YmIbuAkaYZtu8A4ef@t|MYHyW!op`^tWHK+Bu0#MO>}hQCjK; zkFS;PiluvN#n;LgO_``)oIb0zU+clXZlmpLV^QEtacxEnxQ(w^-v14k|GeOo25EM4 zCq!IBsYSLmtu83udoO!r)i-3cA)MgSSteL)QPZ}XXq&j^#DRh9SllWunju`q*qfBb zLs%@11vs2TI8wki04%KJ1JIKYBzFmqzAh!9YJ0FY{p)*c%5*nAS=#DN>))nb>{b?a zMZCW`8nBQL)7prc*mEn08K8qpLiWm{^=g#dB@;gf-C7$GS6rMM0tj@y{wi7{NXzhNLI#1gAd{WoG4;C`89r%`(h*^d15wV21(;TtfFSal*=X6rh9Geyf$ zc&+OtQwMop??P;%oWen2kKVpwcdpf*(cY0@f}Qz@cP z86Z*_8GH1*oFV%I_-qYBM}Z|onWUlS9E>?#-$5m;Ss<^08XT&0jdTu7ob*Q%ZF2=Z zUzhr|J5R6++>SgC-)vfzb)e`RZeh=01I>^j93jaPW^hgc$QeOeOAXVDfry|0bRJ4N z!j+=tRS7?!>QE2KYFX$KkM>V&f-B9-4aL0x-R^oG*&I~3Z9!xkA*Qr0oBN(gJ z@D-`d!YGsqidSzA3vjL}E;#_pKoMfvVz4wo)8U0I(&CX%aQLCjD6!)X zuWb2>kur(0s@;}mxRLjUXTp#DXpx1qUGV%fN}{`#%s`^2i5t;ht6dC{m7-_o(zvHG zwH*yfn-2@9n7S!V1(|3YVVNbKsmO@|BlE74)bqoO+Ft|yYX!FQ`{BRtKEmIM_^(eM z|BV0or}*#lUwEE4Np2+rqCY#@JMi|8Py0Xp$NyV+-WRpn#}?~SCZ21EZoq_{rE((U z4B$A%^N??9TA>2524Lp1Gz5Jk*ZA8R_-R0ZsKb5;+&ol3c#Qz!xuHmC8D2l4e>zZf z$egw82rIPm6~R9wLHnj&VXq_N4H04c8=+6B0dM!?^jPo@MbI?CbK znkNSFY@S<=^af{D!;Gr1v%dQ>8G@TpLZW%3h4)Sml~V-BX zd0b+Y1x+R=10myJ25JX!g8Cy|QA2uW1;#byBnGF^JT_Gvg+UO>TR){a)u%P!1b$_ZJmI=F1|7R$_>iYq|=@!_C{Y(DyUGm|&>5tlk&@qkyw(>Iii*P^3C z&REA_XUk1}%>UG4!rv(c>{>ag5xVp^J1TnYV<%4#e**qOhaK+;a%6zbu&3t6EWyi;=Wpqlk zxZcR&xub!`ivaZ53^5epE}voUBc?UhihEC03TCTYf1y{CeZmeEM}|0^Ygp#z{!Nlv z=PcrR;}!i7B`Vl$ucSWb=-A0XGmzKUa+HG$#SIz>)w!jPC=sLc1RpzMv=~JMo2P&b z!+c@4p(JiiQ}i)!HkOF|g-nfX!3(&Sj7D&(tWzx=cPz=6Ir7_xHle1*ZXobQ78(Yt z0B$~rDd})T!3u?Q$g?C~Y6ShM*oE#Dj6{13=CoK^h07pQ$zitv~uB{hy zKShR7HX``}J`h3#5j~0GX2jjwX^8>A_=lPBBYZByByfiZh&>WASlgFit=snjoPMr) zN$sNSRB5V*Vb^D^;3pivxDND5eLE%iQ-UAd!< zG7m=f17HME+%7b>$^TX_s1^(m8W-ky7=h0mn}(F@LMy;_Udj5_zB*=~N69Vtrs@Z3 zdhW*M4Tq3c6V#!*;><01()zRTv=oD8kb;1RTJoh&N1|Q(S^kTL1x$@id200@ykObe z{%XFEspD>s$Vo$J-M*g&J&~t#slC29;)F--sXK~w?R5Go48}4q_+K|gmM5dvz%Z!1 z9Mn^_>82eTN5P@s%Susk*bmi`RT(XpVU<@kSyv1g47RDTXFaDej~Ce8VCjshb)1%!au+u+Zx7Fqbpf*`OfBML1segK%1G{frLQ1=Ipu zLmz#=h2S!23;*0KC-|h^CTW0~x71%4wOh(hjtzwZu$c^Q3z!LZE_;?t=LyB4CydXE z0T5c_F;Va?s!VT3J-(6=i1w!VIJ^@%RByO zD^vlQ>j%#d@SXg*F2LRHWr2~C=S{3e0bJ*xDSh&?2TMrqZBsFXav3%LMuB@ zdG-~8L1pN`nrL=~h)@~NzP15NBTC3mxYEUlXwccwsBo*c%>zms*A_CUT-lxQVol~+ zI0y0kYc$3AfF7nSTq%TE8Ob`a)P_D8`GLHhT%`%1g!8DAm0XZ4iDpgvcNf`|Z{bCAQ5|jk-YEbN!qdOdgV2QWF zJ>x{24{WV#li+`?;jl-((Q}|RCdLf^!TU~!^(%Z>+Hm!5yQ5OFra>q*=cN5D!33}h zw$iu40_Mungmmar3sk!uO`swVf}>Lw9$IT)IhIP97a7~u^lB{g(`6$&mU;cs4D8M? z@7zA=6OtQcl~o?iwmX^_##|UpJAcK1T3M?5yd>=m9@I~bBWd*9M2S@v18Vh0|z zKO^M{RE#JbyXJ}(yg(yiJPZWO=0KKr;%lxn_nHDu{K|xT=UU z%c8|rd}3shW#J*a^7%kplYjchKj6C@oD7b|@|kPRyiP{*3?f>c$D5|LJJ5#)EYoPZ z^JB2cG>O~DJRjf>+Dw>Lfp4;rm~@VTdiOmanBPiz2d1UlmGy$ApN%ze4m_#Tdmx^{ zwyn6eB#zL$eC<5L3Ri-?thqsMBP z+N5_UL=W|mD(C4(GxcTtMB?NinGZ~c!!~6WcJ;oH;9=-ioSAR$Qnk*$<(x}3hvl*; zw&5Y<#*e^GviaSN-c~TwFY-p<=I4)`%i0QgTDY056sqo(Yy%0Vbv_((N8^iRt`dr; z;8&~cP<*A)!=jW8nl`>Zt&?ipW~&C+Bfk~*uuZTG*DS58tAJQ22tRerp^{l=g3^~N z$R#;v_WOzfT0IUAl?jePXJv1xM@pR5H^{Gv$W++l!wf@4IdOEd^T9HO1a9EyfZ)$& zM7;&N$tPvaM0^6K-#HQGl{y4l%s#iT0LT{tyLr_Brud2tSJ+S);H z*^y&iqvjF5X%%a$cK}Z24g(%~V#^f1)ugy5fI89_Df=olk8&0TpSBflf)X*MMiXJW zPka8uHyevLE$%#C*W$-3T8yM$*lOL-D+z98Kgu+DmzFMX=-Q!OHL`R9i8#^ieBWV= zlh~T~b#3dk?bhiwnx$>_(DF5{n}cdQ~g?=c4}2-dW>)+IrBp+S>VSU0XY!tzQY_==zk+7iCZkLnpwu`v5kaSn2{N80#)s1_) zT9|@=0GgV-&aP7cOx4rX3mEf#@>y&5No~#k#^J5wI5c(Bno!58`P+|@Or9n6PWMS` z_eoQ9*RL`#-z|8+eE=2OSOifMzx#fb_<84r*xqO_n|-X54LyrMq2j+;x4!gR={~mC z$|G@KSRHF-=#MZ0Ra&11V`Q0as&xcWA6a9icPg(ubS*@!75xg)@k{w*Lzv>LNjRF2k1c=? zDBZIZIgJ{taO2L^OQ!k;-eRjj1C|B(R|Wl-)70M5s23DrtQmkc*gU`=0J!5urmw>& z((NmJ#DMsU&<34$-;cN0^|DmO(h~7CQ2FrMBer3Q|LuSLumAa9#Be@ih#oBT+;)>+ zU8wt^dU$GYE#m^(Z+GySJ5y;H^V)8a$zat~=zH1icWE=16+Q91GmUb@c*4?;__u49b?yiBFL7D#aN)#|j{8)Z?gqg>r`rb>?)-8M+=Bb}+PwkUQ7$sRUQ@AB!wn+VH7&Myn z&ZffVt72*a9bi5Jz=75uH!k?0@xQY)gs{j^X5JJdFEVs z$N&Ci#s8k@iPs^wFLcPSS`|NPP5~X8A_%M@iA5S_ubbL~E6f*7H}W=|&iqkMk-l8p zg2RrXr8IZN(iS&0koO;Mo~CS`{sK#b&Q4pn%iNSp&Ahk!E; znqU-_rI9#=sJD~Vu@Iu3R)tYCtROTM26w`q>Ks)@(Rbi+23Z)(8+@LVH2hHq>455j zPI>6K0ZH(!UU6Z@emsK1)($rYqw2xQDcB8f{E^)^Xq1v@r*=TB31>Ay;3keIN6;UR zIM{Q1LI&eHFN=;~wY)y0Q)Str z*a!P^F#z&8Iy4}j?;K%8B;)RQ;yM3Qy;oBZv5F8Ml%i5icqiJUog#dUe}hphgy2-n zI?iA!$01_GV1x}|4#AoQnOs`Rv|!O@yhDJl=pbRD2(1PgPwXJf;N2=)Gs8;dvSv)J zcZk-5`&xOv^e&ZpW?>chSvXPz0yvkJuLjL!S9sz`2H|`v>My|!Bu|!3r+z22=WGw1 z5sM>qitsKd224_P+a1pxa2oi2J`l4c3bP40e9A1JNC-`>m?^3)lR1=~iJ2eMdOvmG zWH^3xBBxS}=2@Oh&2If#Ml+4sqdx8dhzL{(5#I=}wPupO){~?6pdN1*ARYSc#~9m{ z+OtE$zbhb;^H$VR=7-k+i7jFGO%WNXLeBcBtk^j(Irkzex-(+#JV% zVFU`}0`g#x^2nd@fYfNC%n^)eD#5uOkr%LIh3?fn@k&OKSBC#EVTd{$^lG7d1@vW+8Od}{w~q3uP5cxNi8vn1nN z@x_zMf{y$!b`B!y+DUgw#<${&N0kNHyV)9}lU~zyl28PnV;lel^uorl^SwgV>6UQRpvo|3EXXejN^oyPmXB+M`lMsV z$`8`;mQV%5T>Qg49KDVfU%F$VQG3o(De?AR8)O2VN?nYDFKa*j;a`6G!#|2|`$NPY zJZaZ{`okaK%gbZ@aF9sMNn#Hy=B{e@C7PHErBG#)a6IwgHlot}@8y&yZRa<;=93Qp zWPhZRuU%d8OZ|3JEWKm>QZ8nsZ?ULu;a8`ryDqXrU)#bl>Ij!2eUq@Q z+06p|wUNP6KvWMLZ+iEVAaB4L)EPURku2+?j&tE0`VClqI(?VZ!?FhTVn*r(tg@3` z>xdPo$VHBM6D;p^3V`~Shw(g_XV%GCtDVZ5P~MX2hM$G8S?J3sJt-Inw=fgKB8I1!s2{X7Q+Ahd5wG9|4-hdM`_OY!D?1TH7!347X zS$b9~ZBi64bsHEeP3resMg}5{hE>17`B{M*Fal{gD?R}AmUn{Mj{JsON=V?31f7%O zzmw6(&v47oPksuWwg?Rk02bL3)x2mEi;mQzfUgWP9fiaunNOt25hy{Nr;v#;>J=xwVXf0Ui!;?(1x;&8o6h_+D<-8`oQbA2{7qKI?$L)4 zo1jqTPue|EgwZjz5y7ajco0j5(@gR7=~HLDzIECPf0tVeU+aYi6WD*LWL!5z(hb;b zny-R;fy%rJe*6TFGW!Yg6MY2HU@Y$ot<+!t+Rp9%K%4-FxY?n`IOBH6KeKJW258#<7h4{xxp+$KXn}{rn(@4Q?=+keh z?6b(M;9iPMR#eb;-y5=9})=UYl^ML{iVHijJC*+2+BZfDWc{H0QZfe zHpcWr4PW;_ZLV3Rs5MLK7kI@tm*`&Vx02$8!3oVuwX0dBV>MBKf_^2DY(>eqUf#ro z{x&G$63#X!V^N5dv(+eDPb}H7M&+=ykm^0v6l%G`I|?q&X7S)@7Vn!jDx{ixyp#;* zVJ^j)k4WB{req@&sP~|q0_IhJ%ojS2T;zp^>`DYMcw?c6J{0Z=pAR&glLE2GL^dD6 za~WJ77vif~TYQzF!RITUj}>kkOZ7#|?(`tolrl9Hx7TC%sYZ)N;+W{Lw??T9!W>ag z)|CWlJR7;9%xX`=4il&D*Jr#7B9{<0^uZU6V=vn`TOM2&)A zVLXg~s%ZvIwSEPRlKG4|T+!DX=`c!B7~-p0ckPT zat)}mSB()8z+R=&e~m1_1))(fVbm=|obs~ylmcHZ=mnb6LJzm9JfaoJPzFy!>I7BT z#8-YcsiA8OT1@MidDv)*uJ>3>!?;n4XK%#JWwa2UH%{dYPRAM*@CjIQD~z{I(P?{~ z^(B4u)vW#Yt6AqGDDQc}Zd(U6#u#FoVz>Rt(h{lX$~bC2bD`uC?Pj{6z`E-}a(w=yqI>jZad5l9sJG6Mfh}2UB ztvwBMz!wFZaWo&t}ura0Ljcn8B_Qw)#yyTyXeEe{3? zQ&9~=HwL`-aGsr$PE&jiXCOU$?VRj7JXml|)EpFW@e1WF6;%yd45ft1!9q>8+e5nZ zO9*;VoKVV70T!jUwmWnhtIIvN{RPluG>;VTm!+B7eTGxkd~^DJWLy^Xn$+qylv#Fd zz}1WnK+BqVT6T6|ehOwib37u}muGp7=Kgq0v{-mTL1|yj+D%aK;s12u|LiWk9KIjj zmVW7?*ODr#E%b1vkaFO~Dws>yC5ci35!NM~mOSb<#eq4cSMhPdZuG{GA3SrIi%Xwa z%)(WDU;)L8B^{tlNUX=q%PHU;jPS|NkH6 zs1t5N`?Z<>|C4sRUE=@hv>*TM|NkfXj~zpPPtz(6fZUR}{gP{Oki=3cHSq|Jx>}6@ zL8jnWaaABsHE}Ub%`e_0$Ti78^x#j@68#&QE;vqrly=F!Az{q!-JKR*IOaLRT+o$C zT+3U97qZ)K3%HU2%`_5P8Ujyt)nJZ7KgycowUjd(la_&&)IlV!k^rR*=7fiRF`qFd zW0+?$x+Y=gr+}js88Jt}3i@hLtEq9M``Ro`ZXiTL1r8C7Xe9hAP&)Aj&(ByuFPKkS z;(6r1R=H)$oZr_V_Lyqt7BEwUjK^UtQ6!@aO^b0_Ftp00;TH8GYwm8l-ELeq1gI5p z5_>KIE)skJ@IM!c7pX}Y1TwZqkT{#v5OZYLl>`KCF^_G^u$DOV)3I{4tAC+qj#_{% z1*#&L_AE!Y9aQG8=HnKIk?EYgCK`0ffum>^&Lo!A0=k-O59dzl*O|r=CL*<25=C=9 zNz7cP^O)J?%29*`ZiWMApeQPa@(`a#3~bbJo?^J~Z5rwjudFE~cmT)H4!8+3^&@OD zcM7IGheF+6#uVh5u(FTwb$JSoJ3u51>k}EKI1#Po)Q^K?O6t9eB+sM_pvT+W1II}f z$0y>QHWof10&f&-itCdKOs=H7t@G_upmIihgo_Kz^_q%T&6h>Kqg|`w^Ep)V% z5w+_bFauy&tCW)2tI+Mo9AK~B-OrXT65+wl#@mv1?E|}Ey4bLB5QO6aYLjZ$ zy`Y-vvSE>Cgb}?_jmTq9s*#c_1@xn|K1M*HF}J1Q7KFIqQj$Ij4YpYD<$ao3z+Lmc&wjO3>QH zp8mF+r<}F~icL-HtF>mG-b!loMB@C^J`lggTAR3Tu!kTcWEBV2k9`co)<3uK=T;=+ zaXvAtCUK7&7A1ak>n}2;M`j}Pr&7JuQZ92=dd5t2HNOJAY(7J^FSRzYx(Hh!kmgIM@v4aO#MgLvV~2X`(Puj+O>$C2|w4jf~y{A1h`Fc!}i2?@W0$>a-^v0{`%$m#M}_8(hV4A52bkVN;Tqe5Jk z=t~rZJYO|30fs>%p|Ua|iHZR`)7pT-Sg*K5(2y|W2DK`m$OYZM3pdq#BBz;*ZioSH z5E{+{O>TIGhpfw-4WTjq7Rm@{WO4={eZa>JTZd1 z7O2O?F{?d*q-!gdw@{NK#y7!o0Xab>yp*>XjItq`3yzovb&^)T4$uYPV3=W|nobH1 zfMcWijqdWCWbEJHeI5 z|3p-02#8V1pL18pg%S#a;qM7e1dNQkYsz6Xisl-*?a1Y$M&FNx~DBXlICb)yI=3KPe zMJ}^*=FK6OCd<^Zu)8(ig(A4_{jB z=7j3&ri%k4eYG2IA`e)Bx7L>1_d(Dw5ebFf)3Gj|iZ-6;O}&*soI|V+ulrRJwJbpO zgc|W_h+L=)+>t~qqwWpVTl(3aQPO4!shc#~YyUOO7wA{9%!#t7-a!1yb1G8$qX`HO za^SX^pqj?BX%mr7jf&+hv_jbhs_Xx)ssACO-7fpDPogvBlPkWLb6A=ARCDPJEh(03 zsHzGBRx52Y9q|m;7bW$T>apT#Ru^wXPE`m$$wnGOgo&S`aSPH#8*|8Z9{R)mnF0*~*z%Boy+%*QHqs(xBkS=&<3qa$w1gQ?1|X z!_%IC>o5+UEpYc5>8Ce1PQjeCiw!0~AKVYPms&R!zOy;^6|{M_ZkcgPq}hy_-UN-+{d z-KR@}OI?~Ld?yiu1AKDBu?CwLo4dv;I*yxz@VsR@Ds8FQGbX^0_%O4oTc>hnQ3FAn zW#f0$mTEn`efmz7q!wE@Z;y~IlB;Zlvx>#Q`OHpzQ~$NJ+`3>u;I0VB^8PqZGWqZe zsWk}vu36DA$f4AEe-?T?BoN4zXG;4f6ny3pAJ$w zWEy2N{!;eHjYuhVvU%|wcIq#stYV?Gf9Kt^mzR^lHM;av?4cp0uv8#UjUxc88@_sK z@Wk=S-tW)*tEmb%BPuM}P?d;(2g1-Q8b5vjfR}fx)9|#N&SQ9t{!)N(8;xFI660mn z(n{RQWn(Tu)=7f(fptiO!ZbO~C4{SXRe=oU@{#bw%i}X_!}UC>xPM!_LyILfXGd1NBA#ZPT>?$-w~zi!C;`f%3QiX5m&6f$V#Vhu;^T;ESB60VQ|RsGBM z&@a&?Xj;FJ`z)u3TR2a^D7?ig={U)irU{Gs>;B=%^YcSzLGSJF_fO9Do*njk2(t(B zUGY`RH#svCHE}~&HvEF*=aefYKc|7tK2MXWwu_gAKZ0Ud)|>|jecOrwBlkCR)KLic z9IVxLCo07&D;uik+|9q9&D*D@8%F?jY}b!}*I2m^*G-VF;@LbeX*o)}sh{?Le?BTr8ljmkCyMW9`HuNvtQpjIUeFup|b$A)z4h( zXpZbF#d1-u4yz&qg*{C$m@Nsuta_rV62prh3+EPEtXC$~^U5Vx5_2!fs|0m1t927x zl2fe>&S{D5rCA)|y+Oxp@!h(TEu`qbW-zIGT32du_4;iV3WTY#%ENby zb2^)>g3RY~2{3h532f!Gb1O?qF{hdllN$jOtgPe~0QtylWm%=U7|v=kiF>eA>oHVj zYCJ|R6>qA{0Y3xs-<$B<%QcMR>!ikaSm5_PYLO8YAME&8`tFcc_{^w~S9|^H1uHy} z<>30IB&EA?pm6R@;jZNxI#!xFtlRS?m)p2Rj?cc0GgrY zXpS%M?BiT^TW*ria+A##I3ag%o|P0ksjJ z3{V8e+Whr!v&W-$+k=ikFjx|W`9ygnf<7LPC_)LJ{Bg`0N`GWf4HweO6KBWA;_&$8 zi}D*%Spw|rh{rsNAY!n?wFg_0H{SYG;(hULgU^$V2Rc_zK*%Y&$8Pj z4d}5){nhF2ZuZ`TEnLdQqP*qKPY8K6^}5 zuey~ermiWDwQ0$hrjYrlRn;%V48@qv48#N@>~1i)l-RTKtC6m1TvgSv4Xkftkgu=Y z&gv=D_zmi}caO2oyBmU@h3c1POYHpePEA1=++W(2JgTVV?D%Z&5ak3{<{_s*MrySi zqJh-ASMza&-ZupK1vZpKh5pzGK-t6xz!&v6y~c?H*QV{kvBvEIADc1L3F1I4lT1ag z2XLFDhM{cgi9^_e;30yAz1zFjJIJdgAR3m)dJm!XzGCZvg6qMe%XY`W)M({6;TWnY zfzV+OU9rZpR(N&Q+lLa>S|*(Hg%KGi>uOCg1zBYnhl*3mdaRD z&_f07Ci%5HLh0GDn7eYaVbOa*n#|z2%{{F)$!WY9Hq5ow3&I-qja?x&D8e1wcXp;& z??^#4RC-dZv;g7K?)HeKgJ2HKi74t%mM(EhWgn%RuksCB zfY_1?x2aW~XW*6K>Kg7;@dBa7Z15h!DO*;%EVLxR4E2Mphh)GBDD9Koo=c2m>2IR` zo26TYDqE`h{pIeP9lOcd<>pHnEA^b*%U1I|t}G#&W}D@A(em6v7_M)$Af+Vm!)Wo~ zJ!K~9A$!VN8Bomn9pzjFKEOuWu}ZWz6@1P%*ix8|R!<+zErI(0S4fymGdCGxt(Md2 zDNzTKo)o>)=q91K9RBT}g*t?Ue=`ZX%e$}hVm=lqdNK>K_~#3OjHjryY7y9 zhX*zbj0qV*q)6Slk~eKZ+_cwF0|~5^$qbMz{Va5SUwY!B>O)^W_TOaUqkUz-QMMap zA@exGALJW&>f2Ecb&IM9n+@b&wngo6&mt2+lCWcowrja*EeA^=n8Fm0g9G${7B)a1 zaDw{@IYJR}L`gEsTB)Om80bknL^QL2M};5s3K|BJY`MLBoj%)~L1!CMY~HJUo6S>W>f$ zVMXLTTxxSUgIf=?6v6snKe_XPsDIWLnhd?_+DXYDXe!&fnlIiV+GTT-SygVvyz<_! z6yu-$4Epc@4{aJL_k6QMlj*{XAX*ELUZOaPTtzaH?oTjVBW0{(V-0i5m6H%Hq&3xD zJ=KhxWIdemq(50R>7+(*_H09g8&e2M}E3N zCEdzOtbu*h6Z*(7qxxvgsJb|>4;iX!h$Mjot#^}S)oOvRdWlcAzmJYO4 z$IXT@meyHgj^VnhxhWp&ZsbYsN5)wPW6d?p+xJ?lWhbeYA4T==w6U+kRTSgf8H-o9 zj2~qyjjoz5jf}6hA=hG3Q;sa<)2vxc^$lYqsz-Pji`U_-D9q`<`-aMY-%zb&Hy1*z zU^TwctQC5#B>F=;uI1gbzB3J)(|yKFW;t$md6tHN>ev0O_1S0k_bg9FuY01?ZoW%j zh4|hT?_Gi><&^||20ArRa44X;4mzF>V5rLk(}?uXdZXnB!G4mw4rRtmN%fR_2?W{~ zIq-Drp0Za3-o)@1^+S-r({2w~y+(dCNis7!fHu(+TRZ&WzM@xfXe~ujDBzx;eY)fH zjtz=_ny*1XQP>NR)PB^%Exlo0Oq*?02i#riWwisWB>2ywneH79EURn3T>|@1j}vnU zH;M$aUwS zk=bj&U))2b5KE_yf~Q3ZUX|UV325qAIo^n9&aX*ocW0e0H1Ee&Tcub6= z=uF~Yzewi3e;9!_fTagbo{<>|0Mlv%_$N5^Z zyam&?5zY>90LnVBCK6Cu6tVB&=B^dZ6|&Jf0w3yfv9rVe9?-ZZ8vB(T`|I~0V+9HN zWGyWM&zfg)na<4G_7GCz)em)BYvr||G_n?<8o%W}PpKt=EDx|C?lm|?W-WB(fNGr= z=>82pAa}xU#74E-&vxWxy4pUv$8a>{Tmr4}FpdVA2FUCaup-wtv6wmb2fTtKB<|X9 zW@MgFK}oDGblTqIwo+lpN`5|o=YUhR(pTB6UE}?wb$iCpX9ehG!2+X(Twx3_c){vM zz$GBT6CL*aYz*i9r9DTNqHdt%8{i~%sgM0jQD+?tio*-CZCOXmeo-&mIGaSX;AL>m zk)4&^A|6ZykOzo{@8bRo1~f-he~T@E1Hfl~oE1|c4m$BmT#7pX;zTek1O2ZF;fc%G zR%#HU->W#T&;eKj;ZsiB@mN7r^4#n_y2;00<4Pj^M`W)Xn58?d_ z>-il7rKvC)e8&7Oxr&R(g4ag>ZF;^WVPd^nT1CU7+YuQPv2gvEhEk#0cIZBjSwh?* znu)HxeTLxHbFl)j!3LOfVG%Uuiz>SU!oUnmRg{E->kiXejP*C;!T2K(En-%Xh4m0D zVt*Qra7X=C#4C^)4Cjg3ibMZeTI(c8;;ozpkCxnT@#)p!t0ag;&x8FX)9mS^ON&k8 zXrB7H5=Ug8hi%iWK<;;`dFu3(y8D~9xBF?QDIT?-c#pc>M(bx5ji32H%KRVt@H9*y z*12c@+soy21}D%`PLP%SAG__&eWQkiW`JjY;OCU<+i$=9);l`#4i4_k zuftI?<3huD903Pk5JGSv;IzIK8SodI+gxZF;r@}*w{nmMv5UZ zFhW0$fw3uy@F1aPVqyI^BN-u<*jw=;Ndoa!?3viNx8fzxCWyflI6X*Zuvqs72%V3^ z1UP=vsf+{V7$WZWW|#>|{?c< z!K2?@#(!UQ?h7Bf#SgnyF|VZmItD^HDCb}QN!;D?2Q0_=&@FyY<>;}z>v&z%5XPxL zn+RsPgySdSF~&of4=bXtj^Jtlnj(_510^0f*^rA*>I|Jo6|IUjqgr2NP0*S}AaUf+ zNxYJtQ4BE%d{v5X!X)CG)mv~Fm02~p<0{%l@sJdS0MR+4)4;-ny zvx&4Q7~hIJnC_Fk;ZXeDTk+F>`yc=7fBqNoYVY(V{`s%}B%bdL4(}ly635;;Ac97k!@qsHd_XBXfl5*A*u7=_zYp@)&KerRrIl^S6{ST{%gvhl$xQ^>VUd6WH77YIgfKUX*1Kk{l+uME%e zl|j(}{gEoG!eaZQ^~?@>uK)CZ{y!G?(mPg%xmQ+qFlWmORH!MN-m$uX3%jpek&*uz znv<1 zT)eL#5pb~(D#-5Nzx}g#jAh_QD?c;;mP_yogYj?wEV@_%f40g1y5FiM2+tll=m!=6 z->lrVXGuKI*gyytIHTx2J2)_ywByeR@uT+2|PAV!mk?FM@ z{!^+$jTS0)yXU0%@MiVqJ9L1yyxMYMy+-?fCy@#78|op^~6UnOCQlZ4cHJZaCH0V zzE-3vJwVFScjm`8Mp8G`X9%ooUd+7@-yQn;ubCL^u0 zU*74vPY-3DD)SON+m)87MF9SFL06^i?cXWNO!3Um@K*EPoiYPcqVMbG16T_08|YJx zjXjW>+Zjy8cLy>@hkZ1a`LVA|Jhy;22=+$ch>heFq9>3caIz3#zLn`A!jA9H(-hYH zeiFzP-sD>+(_F%n~GeOW?W7FLC?CJS)}AaX}|5}>jDuI~;QbLM*DTAv$0x7!qktuUmE z3h_1KAAF}HTfQUwaV2NrG>rU|Rw1-q`e`P>%6mJJDbYVsl)az@lv$S<_o|qQ`jDJW zoQ>jMig=^=<`KE@JJB|317QfJX_j{tyU5L~cTp-w)*f=3xnwilopeMUPKyR{w%1AW z<6pa?ewf@g?*B^n*hulwgmn22)Hd66W0A_SUn=I|JB>43s766-3+XA0*@zaT)PiXQ|I1R!Zi35BAeqDfR{Rb8{#JW3f{`kxPsh;1do1M8kH>R= zOtqdZW^#zL1KIr>pZ?(Gi}eljbdK-9)YSv_i6r|Y-EowkB)8wRm7wrNCW`6&oACt>#Klae7m$kwM!P!kDDvYWJnCaceoj<_S=S$6{b%>|_+Bs{ zn9RidWo70MDzh1w{e)YNrsinxLE}(-eMgnZZ6>Q+uF$-Xo^RGK?wT1rkv?oMw?>1%IG+;o_r|PV4ONRvS;l>~-2(HsW1e4TnYT^rE3NY8M=a}ZZ~vlmUp6Q4#=lplC6p90Q0Al~qA$juLHp0{ zb!puXTH5XhDh-czT8X4=Qy$*XJ9oHbm7q{AID%7&`kh+Fu%Abu#PW((`_t80%;BBY zYN(XZGcr1X&Lh~X$X=C15$Xcswa$)oYucZxM_c1N+%$aOX-$Lg>#f!f{eS&(t&7+x zByONa7tyVX1NhWIO3E1DY7w=F1 z`M+wTJp6kq)3GEs6V`sH9Yue$)eR`7rkYO^@NUvR^WsWggH2LVG>f`Rd#MOfv^U&$ zCD*mpttcg@W<0NE?t}%H0#joXe3v*{fKVpQ5~*-q+hDC!30hRMp`mXb?@4ib--MWXniiWa5MX5mxO6Q?RbXobK`VsXwEQd<3$i zQLA-YVtf0JTtF{6_t<{E0L;jqE>O*6T>-8rZ7}h4(CWj#9^b~m0(F;5e|nLma4uvz zYd_1wDXL`s>+2-VAze6?7m~l<*J@q65#2viBk(SWhmbd)nelo)r$^A!?A=DIiv}_N z;S4-Cq4HS1$uF{58lqbXz??+M_}xb0VHJ>y?6DUP__)a6%UTU}hnHY{WG62X<4?dm z#V#y<=7rgP?T)Qmr#dC^ZfX1cb@&FML>2bth+JF{>m@c7KuMsWpjSw$#2b4sLcLdT zA*C}8+)~37?B3(lpH4wZuxwY>&EPJ0_dyZ|wNt{@O60NVlCVXpP+ zJ~_==_w1nxo~azwq#*Ffx<<)eOBi9{SS@!)a7jNbO!1|CfNQW4+>4@-+u{f}Jpz1l za<8?PO3OUSssRDgx9A4^dxY##c& zU!mJHbc)2Y>dW2V-kY6uV|JR@fm;#ReZif)OR}V<}tYNX&8C4z*_g_83eaAA)-?dDOUOWJt5<97)!#wf~)Al zGTj3A^3nrv57yEANGa*eTR*63zQniI6F^^ik%SMblL z8!EqrsGFGWiT0M>L9Kh*^YD!*JCqeKr|#eDeyy>0243zg{f1l{RC6px3Y;bD@9Xf* z{f8?CM_hR@oTV}j*z`j39;X>xH_=8gRZ9p?VZgwjB)0BK`q+~s)pQhXN57qO>xno9rBi+$H9!C{7Z~U;jQ@T|NYN!b`I2o z(DDMig#x=)fnB@6{{sp{sgesuGJdb&}c#n?AR~+0m zv)rG~3V!6`>#uu9N4?BxE70KE+!Bmiw8T( zeDF=Sa^%KP)kD3X8?VoyFfN=zJ&KqsTo5lorQat@mvHWM6ltX1p~v$u041ch+tT{R z2*T*}H5HI4XL1A|th1{2s3lH7IbMHsy4JTa({)m~R2q)MK%@{5($XgODS1}_Gr+a* z?We*Y=2?zG*-a57qdDq4AuA2OpaVW{{Tyoamm2@W2v^={p5@8Z!$9yj-|=CSXFGY4 zMA*D-(2AX zLJY>UDLw1gAaXwlZ^8g@N-;Ym^5KF2i69;pzV^5WTHE^=@eg=y(L!+2^Li?zw^vyq zml}{B4+!T{BT^oaQbxOpRz~021*W_rgFrs?mNs$Kdl!{D*|N*m%GK{XkiBcD%LQwHuE|SPGf3 zof6`1Q=s!ilbfqv1ne- zem%mPVHjaZe$63nIX;G{0jA|Si{|4Hd|u;&!-mf(r6=h^E8 zTbZOs@<&XP=F=4EXLOS(+fVC<9ez)Cfw;nM%2++F& z#GEHapZ3JxciOE^YZpj1X-~lqKPEv>{QaX=r`73-dTIGX5}850J@NOSwRU$~?V1P8 z#;!qqt;elhc5*>5`ZGU!jST_|5&*e}id2vhz(}BCf0B7Vo97C318)j21baaMj5A8| zQe%7gneGTKfCm%>%aRB%+%6;l7t&%vp7JztO= z2^I#b7+?+B-ZmLjy6x?j_%@k~qx0bz>3b6?UaDm5-Kask)H5>qIFMVn6fX`A5bPfj z0(+qAC?5!NI7H%(C=$AM#9;ynd730sVZEGFtdyTmlWYcJ4OEKxk3U9IsOTa}F$qcG z*`N6E<|$JkUx||O9CEx$(kKuS2y93T#zJfd(J3QJc{1{^0RL(s>ftrK5N9%_P1C4- zzO!;zSwVv{e7MMRIjz<1?n3zcBE!G$*)2b1&#Y^IBzxQ2HC;VbB@%7>=4Ff^7)9B+J!RlooXNU+jT*OJdm@;=u zB;SPe`Un~xoc>}8z;9#34Aa9*ZwpB>-BGV{wtxEFUBq86w7N?}K=VLSiU$Da8x7?I zSA|a8Rm-3rp;LO3ZLc^Y2>{d4g%Kp3s0T>`)Xcb;nj*Q%avwaiAn}nuGuk(yEct0u zT%~?InjoF+)c;X>QTSRm0YwXyzC%9_rhfXGhQ|W@_QN1U-XEYhP5m1{-b$6PkQ#Ve z7`dFX%QJY|!RohGNiL@sq56Ra>G%pl6lkT8M+pxVgmi>4y?tUDXu+BPTH>dhtc83@ zfMjNV#@Z1PFh+3Xt1$Kz8M$fD)Q|l!%8;5TxPE)^4bwN5%&2p7$!mePB*_No*bG0g zhcmDL38+&sBE$1Es7*k*c@7beu_^SZG>yT&i4Ge{s+IDC5T3o~5kPFs(;JBmg$pc> zu&Bes$sB|4ZX^IZAV6XO`caCC5)9fXosWRlhq|L%V;iN25tk*#%Ov(_^@y34L^pgP z`Ph<_Fh;M^knSpXcUp#A+|oxH7V=~dWE27j9ghfS6FK;};=afisNU;Q=BV04vxBM1~U|I$wY`2>0f?{}jl4N6Y{tM$M3<0rdi z`+w)r&-&k=#{R$m>`d%q1gIy@Xd=-iC*|9>`%QculEA86Kt`T)7dFKk1HM)Vi}(k;F$)@m205+YzB|0o%QMGV9hHppmfs!8gd zlZqW`ghdEI02kk^R=eP6M&wmD7>riosZ@swge780Unk@q4DmF~x0mr~$Tu<_g&8x} zUCD`m6DFW|0X}6KV$#1bxW#4oe^t)SA-Gz4M9fI8;u~*`75IO*J>o&Y`hx!P+R5EiQ~laFEw(r%uQR?0sOBxiwsm=>O+u*?g+5Tvx!& zf_U7MG>MaWCTLNKI)|MAxGZ>J6VNPy^0Jw$(ZcxD3Y_HaZ6PBl2My8&-QjAX;bo(R z22}=elw4&py+QpJ<5V);08OWwH4E6lY=Udp?2>+Z73QhWAiv2R$syqmqkMxAIA|h) z&I%whz$-;X=wz8d4xwm)j;LVF1)XMpAnHMQjWJR=4^IQ3iXqDmCQJP|NT$)E7SwRj;Iq3XXrnMctaf4$d`op;$hTtXfkG39n|2XV9EX!H zlgseL4Hz?Gyu;w$H!d43p-DA`6NRKtkNVO8q(%!-do`M{nlgL|sYi*ARG!%^1d}~p z^+pr)Re?ZZ_!&rV$u9_2ZN@9u#Ya!&*iYes3C|0)U=Yz7=7%o_P+DslCJ9`(+@-ou zPt$FYCy`8jMUcSamWJ}0iC`OKb$FeTf|!A394&-DN)sTriEqL*i51{)f0`8DC`Ol1co~XE-HGjqi0oCSWO%;unEO0&K;kOJ5a5s ztMyC_TnlXJK+6$Mk(T2Q^EH|ONZgYb^VU}u!2u-LVn&0OVJa$&(uuA@D@+a{5%D2F zV8vdXhaRV~nKLJNlTy2?AWs@)_CIEbuxJ#J^#EyZUm80G9I9qq9hNhUC?MLpRotAy zAg4g5e}R#9Q-nf*9j1y-DKHTpqnY7_sY|GxE&N?`nps?Ub^OKZg`l!p*YgM&IY=}C zhE})TZUU6}q9^`lc>J;j!Ts?#yk5Yl7@8#DN76)1HdPY7r^CxlCPAZwAo`Pmp#}#7 z4+JdK<0SSRiPNa*f_NqY$xcn;Ku?=X94AHHEoI|bBr3^4X|^i%#|IthnjsN1Bd$NP z0RZp-fC+|d2GEEdWd1M-tEb4}F4U9d;Hce+FzAU+Q_*KJpO)AwF=#a_@^wr3o|$}) z%K5&pW=Jfo8<#(RL(V>%+jg@pX6@Mtz5r%o@A+B()NHKcel0W!OVOZ~w~Ei0MXb9A zG6_$Zu-5hBC#Wq@WlAf54b7aHq$+~B<=e(kE?1~`MpwWGV^R!OaL81RaNuW?tHe)( zElURIT2=Y*?mdDhbbfUQyI-AotTPgEC`93*pjZzLLY5DL`WBbxv2L@~Xccs;p4d`k zRE|_y-J&4OsvD)EPT#*(N(*zFwa@0hIJq^8gFCQ#QBci#^gYn+9=JC2I>rh^!?8fj zAU_}y(m?nWAc>sn~xjUf`r%5F1TUYZuN8%z)=XX4lG5A^d5sZ}~K~rPK z(0x7iVkhLA5Y?JFojcI>E2&0NEM%^7t{F^hvl_#_oaU?EFcmX|pS7#3k*oV7e1XY` z@JnCp8k@|cQ?)aFOS97O0cTSfkL~fpp(8LZ7{IklqNFbsxnt@dv3v`INPYxYLNPqq z%T}%kqt6`3St>`w4wR&rQ`BF{t09DN;DO4|PZ^VqKrIb-%9aS6ibSQhZ&_{MYC!5E zUteHVSDYy(s5onqwQq>6$h`Zpn##MR z_GB_w$8N7cp7n~8YYTF{k2VSPaA*Qr5SY9q{aw64t}<;DjYjm_JKYo=UB|<6KHME~ z^>9?&4~yHfLH#{HJye#Lm4fY0psB7=KiwYJY0gl^gVlsW3Jh(H+QwRCwoW*#8@w5i zsv>-f!m9ajV_1iD#Go#-S!ubo2ez#Kj?*lOE>V1rlMkb#pczWOE;}Cb?bSm-|1TaFqi3K zh)6(5TBH&Mk{u6E3Pl`_7kHV^(^wbw>tB;=(;&|4{H+BdRVnjt--@mFRzrLt+GXX(zY0md;dK2+Z? zNjQ5_RrPs-AQoIZ{CRMEwDM-f#d-icS$VBeg)O=5xizaRLER_-8{Y8NwxjaW3E1~Z zI%RU!B^4BI_vQPJ?hIZMxGT)>S4YNKqtI;F9lmZ<^n=RXVhfG4oEVC=ri_p0ydgW?CGoly19%wERUMIm-)&DRP#NWqzW+6#2ksrC*ps+sRc; zq3!DaY(1}4aCd7OV{4Hhe|Hr_Hs;^n*+A>QEFHF&%Pu9v16j9p7(o#sbSgKj(u_2> zOIsm!Gb^+Gg0;rBlx-$v;IV~Q#ihjv4@+tb>R2)@T`;4}pDP5cGwX=nre z*@p%x2agY@IahWUpi1G|v*cj~$D!w(zx>=48tGDTKr_#sN*+5Q$@5%CpY zuCxjj?@miJmrX4L?|ZecnnAVK$OF2epTluut(wV|65STy)pLi%Z78L?Fkw&*peHVV zv1-IiV*1a1gt&6PY6`TIsCD%YV~#T&L6j=QAkNW)l*TQ4=#D~bZZgj+H`Flq0Yt^F zzW(GB#r`gEu?HLMD?LqmHbCjAGT_-N2vP{^yA%x0SGgKAV)(!J-HS zU2SoEmsN9qdWbdfs|(KE)=I(kp^VdN7p%1C{TZy&XRc*>GpT1Arn86Hl;7D@y(|yh zQ`eqf#n&r-^?uM1HU#IcolNG|kfGl60j{okdAv*l3D6PfNhazDwn+X`BA>uxabcPv z)|hQKb;e$Vx=kz9*QP+ZS*1rP8cN&XLZvkP4EqrsRlC+(3ztP+~+fn4>;DbuICZNz^k1}d9AI2&|GQq zngSyVn|4Q8;q48JmBSojR+>f25zNx;n(75W(Cn3-FpvNU*@X6(O$f?FhrE*5M`c_p zzia<0xseuLBQ8?oih3qTlQ{eb9S@}c29GgiCEcGuOtaytaIX%uNziGT_rR@>v2t)V zA`FZ;OCbC|8L!$WoU9ckx>Ix~T_ABJ7 zad{ymxFFW@70YY=-4Fb;7>kb!rH4CS_Lv}^y%FY`OG4T6C^f2p&I}$ z)eT~&^*#F9X))4-8nWEK(hGNltl!vuO5JTKSIz|rJ>zp(|Duzb6|GdjogJ~;63-!k zs_4a82ds*SLm^c$oaa$Xd?Qn+MBz*)X&_VZDl$MGjb-x>mJY1#8|*0dhHU}ggc)F% z{>WaTRkIHU4SSr>eFo(X4aACB-`PRv2eVLm>!z@_?o#s*4YYEan<$;bSn_;(sDMFa zVov~8J-w;%5>Kv)A5GhHF~czSXW1lyhuyDX(qKfu_wnHPh%I7%PWh$@pWc{{S5(hk zGU)Rz13l#`HOl}6e1f|H$C=G?7SI&F z6W@#N?Uz-a?5H?I5jojq#%2d7n~pE1^2x678ld9chjb{n5AmLMegf_$0OJY^svsB~ z$S}hAa<%7} zDfF9y&sL_CkfP_qQokfZzC6qnl; zNbDs!jE-`%NQGk+#tfRvP?c0`lUx@T{fETIS9X~lLvlOYLI>O*J>BTWS+v&WtGme=aL09mxT4;m4N3q!?H54 z^LTz}N3MwCaI5ZL{0v9*=fVGh_W&=D*Ai|GD}q7S;Qw^X@t?cD`OR;Bj{p2q;s3xq z0tp(-V-@<($2t*mGGc(}`3%9s0s8$87XooJ5|{!dcJNr}6Fj|+iIcM)_*0BU0Tr() zvRUM3lcvb#GkC;nk|obaJQm6eN2Zl6g(uafxDFu*$j>pTB|}VCZW^JrR3NfgMJ{5Q zjzfg!I0G<26_HLzi$iLHAWVjkdroK&8keIV%jrVA@^5UIl3V}A1u3Ca44R>ESMVF7 zlU)1oWSRT%>!!Gl76=>@PN(x&Lg-OOfqy>2VN7R9robTaQ((|avJoCs>K8!a3+9my zxF_@rPduY&LDYf>$D$uoVB-`>ez}w~M#sk#$u}V^4e$g*HExLHzT*WVv;ZmYO#P(6 zHQ@JfB(j-}QH1Cx8af9VPn!Jj&agRG^Dqi{&P;t6l^-ffrg0huO>vz{DRjL!$1+X9 zGQ=Z{MG+4r1X@{tT1#zzlDw8;h8hb4q^PDV@S)5`GvPH>f;&N85C9b*nX_Tnz z;RrFNraUTo$d%D=&)I$_*d!Pq-IR+NexrffLpnRt7PZ(Se<4#3G?5$B^30~L`=E`a z;cG-kO{M%1gTM1pi@>0g2;grm#G5_7Wz1u=n%ZA%(SviNRu9`mtWgGWMLE6Tf)EsN`oCT-r!%-MZG-``QvZAOo8LTX7xlmH<4)&i{qIkN|6y@f0#rd7z7f9` zFTm8G`18P|hj3zd!?WYlZ!ZQ124V~VyZH0j;Owvu94x@ogx?SL&hSJ3#*gL@T8Lla zJro(&K@?~z8H=~?vV8|hgDiH^*$1bWymR3A?ao|9#LO?w<}$ z&IZRXfnfgRbZ~q+IQtg)orK}|#x1yi{7wIK??qpaJP+K(VE_2#z2=-pEdq!{FYnI! z!!xK75bo)Z=YzxkeedpY@Uo9|qXKfh2ybMJRlFE{(|>7xcs1egufDcFpQ+Dh{MoAO zqFbo#qPwoXi|&#d?H`;v;Ro#R3x5XPMK$$g@APc2cL?(7{N>=xJAQfiE&MTfdDee% zx(7py-x}CpW>xQryQ9HyIC%NuVz}Rbxpz7^zUbVqOQEWF`AM;Pr~Uooqoe-I1FZ1k ztpB%XMo1b*-JaOn_c}d}qws+*c^vYi61pbw-7m{-0l=+((ymw$C>ekHm;Y2T^_|wP z*YEbdcDn=9L5{exD|h^PK2grMy-v40C)lEi&k*PU+ZzyHL{^$4OiC|Q8FxVY%-M5> z=@6BGT+JwGLcf)o7UR4*O$L$|Y_kWxsNqQJwtre~IuaaI4c`Q~Pl~Nqu3-D7htNoP z4dqZ4yAP)rJcF+rDJ$X2rghhvR*2-xO+#)%pW9bI=~T?9TEis5R?h40ig|tXXvw_l zhg{tvY+&`w;*(>>U5LW?H9P`f>#JuN`U^>8x-G zT)gPxguUZMTVgd*#vOar?_RE`yk)AP>3_u4=uxnl7$DXd25l#_$0BRAth4HcKePOA za1m?bMwl;Ae|C7h|GWNa1CGU74G*os{@&rmi@lSJ{p0hOXZK7S`Av^$!N;N9#v7j73bD z89U7)oPM{V?ml#=-)HQskvU9mi^Fm}Bb>vA_~}3Xe>5(K$FG(Tib@YW@<9M3lJLk0 z=14gA-)%T{A21w7WGQCiy$r~v(Fuimd1lzLh(Q>=8)<9tm+fs5Vm7{6;*1fdk7b-;_C_5f#FxG+YTl(3&*&*TNaUHv(@43=}vf*F5l)q-Vr12ACUAsA^v6(h6M!6MPP= zUO7C?WQ5p?`bh)TnSQq~>Zl?Akj&Fqg6xI%Va?~UZ|YVJ1#QKw#bTX9us2zHjh|x` zP}RQXmO~SH&5@a;n~767O>U&nTMA*|(W!>Hoj_pR9iM&OKh<*88cbsXSddHWA=XrT zYyBnO^4vQV*T#H>WynB%Hm0j8YV#_t>q`FX%FkFB43Dwt^t*kvwA^nr%zK5;Y~Il= z1LshaV((;7Dh$7s3xm(a!pww0iv8oG6Q?x&%`HuRwn~G-P+!+6K(Z7Iqi?0c@N=Os zW4p49SGXX^CS|_q^4!nbm}M;<$3p8aOtlpU)2R%Qv~5p4i$2q8-4UpD4Ry5c?V~lJ z0~LGX&e4Oqc8YFQ3aV}h!3`e7_L=$+>UKCwLwJ4tfOQ=v@wiacGk^3tO2!*iQ*ox1 zh7b^Z){dW6PT=-*(m@H0*WOdS)Z*5~`VETlL#}fA3b+1F)`IFabtk>BA_{OWK5hT1 z$)_tAAU&)FfEAYp4mgR#B(lyZ-6KBTS*C)hcjTT0oA7I4OAc9oxh*3J+12wS+c0SdxE+_TsBs&3+6h(xz?3cBe**M}yRXLuj<2 zH^xel?zE_6)U}S$SgS*b`sYgh$k4~Rfupfv6Pz@r zF-h|4@C`oksHdT$B%n+#R`y$PRG9mbeF*k%z+-h}J=bW3NAz{%(J6uP)Yx+oUT}DC z^~7Bce_x>A3R$UP7s>#Co8dqCM^VSWFJ|C!83Rq^{jbOw@;RE-F$X!8n;h_WMULU? za5m#C8U5Sjfe#gV4p?KgTCJ4WdjdV+i^w z-mYEVu2tS{xxC%g>VJ)1Q+I0KgZa(yM(^lxvP6vBRi>Dhl0FYv5ft}MLLf! z!a%&m9SI&7Nt$2GQ&8T}ks1;>hfeX0Qqgc+4RID8}*+ybo zb8RvcLP;QP$%_6+H+~qQI}!(XqT`lR7)Wxfq~$#&A}lvEIUR14UBS?}1t|2mwMEp7 z_1|8yDx14h^;bBu{(tt~Zn=>oOB1}uQ+PAGh9DXNkjx*cP$g9{Nv6c^WG0JbN~KZD z$ROYVLkUEnA_8Qhm>lbior^V_yDqc7>9I9ivwf0%lX`-EgthPdxO)Tw%#=#4*{ ztSgD|@bI7G$ItI~E+Af1Xcnc&bT}~z<^=TFe)Zy%Q$Ekc2u|N2zv_Fl|N7Pb;pr>< zlboOL&8yev7kg)Chi7Mp2ls1+jz}^wsI%q`Mk~KuP*#Iy`FC8WueeCY{HS1l%D_?} zvY%o+cXQw0#mpkwu(&Ar1WP;~QX@zt|4F`=`~DigcN`~a8KX?!PxsAPwa>=yzIt&Q zl2ba)FJfmh^WWIp%P(Ur2UUy=RSMxxjfRsaQIHsOOOS!&z2(UOjyuT#XjVK%O*- z(9xDi(YJs7>d?GCHOEMw#Jh(F6*hFT6Ogi8X$-)PKDq>g&5{cJs9f~{IRY##}fL7>A&eT>@=MQEaCtDf8EWJ^r9lz`OR7LbGT=G!35V)?X>JPotEmCS5C@% zbGPQ_AMj-r5^JCLUv5$k-Z$$EKkm!5CHG%$Vmj}eB-kG|=N1X~A2>7I!`bWO!=`TP z$7i<>!-P9QN1-g)}RrHP?bu8@V>-1HZEEESIcf2Q`jQa`EyFJKiT$!nAwuuG;}>X`>95EQ5IRD zrPTBWWXoHRJKG6nM6O0y{`3YAr}3{p{gsi^>$|0o{Cd}awP#)d5D-i-Tw5`Uu~H&VYAj_XxqQu{?(QlEr2@-&`@%J!v5=G zsrL4xr{4bAbIjE*bNkoNezk>l!S*0ErR=E$h2bIZ%Z;AO&Lc@Ka3vz^A?w=nX3|gPJJ_oJ})?Ak= zNfq_Rv_HklM411sCz`-4F00l09B?Zq+p=QH9NM2e{gq!M!h?e@qk!pSr|2WY=ySlY z00E98t<2dUUYaERUVw0J7E{EMiAqG!jNC^ug_EGIbKIgCor>M~_|4h5d44DpKagOq zlWnDYY>f-;@}h6`W5YO=GB&qyf`*laW)7uG{W?!32`m?mCEdmaGc%#D+9F{pQ#*-= zOLGXy0Vu;KzzqS07pKLTc03+ajr!m2{0gakpnfX2sf4a(av-nFq76C z?i|<8T#d{isyrDXpNnTHbIOzAExq)$BYdxbll$GR$IkXYY*AA>Pv$n6PO%x3v`GwV zxA&yCBOU_N#yVs0yW9NM;p$PrTa>UF+$(oyOlg2QCfZNN6bI<@2GuQiYKvq9aRSG* zFzpwC%#Q0pD5BMZB2LI@LeVEX{gYiKJ-%}?cVD_qykbal zfN)PyKq`f?s$rkt7Iq9|2mdI$3hXzCr+TmPX74GgPg`=Z+6NlZAiP;(?t3@?_rD>| zEFPBk+W0sr1rLTAdq&6Q2i=~`r*Z0DI<@Q-)wi&-h-X9Tz=FJZeOa%H;k~jo^y16c zUt<;&GKX0leeq>Qxcr*wm~$RvGkF6|mQI&sZghuQ%@*icg;h4m#fA6?MXwdezB@qm zTx8=5+F~F^1cpQTbRf<;pg(!U{jxb%PT>VGVqA67`>^#MpUs@jWw70J&0U^Nt+P=5 zW1L!ZklC*J>ckwTlO(k^mmKF#hu_CE)pPO9H{W~{9Un&r2bB*|F!QqB!n8Y`SFg_x z@%uq$3)lkb^en;lXy;_hXi<;-&Yw(Uo%)?#Y!{v~kjk*;$u2)Z*0@;YL~syGsUxEB z8=cOJ3Yah{&X|nYOy5^e#(Q)3 z`sDCc|LE1l$?5AaP7lw{?tjj&?EJ@n1=K1$PN`}iRyOq(3K^;C?PS{#R+sE7_2)Zs zPgY|6OS>ir>4n(RykVIl_UOty$ulTSUV?^tqPOM&%hW)LD`Nuw41lJ%iMS3V(5{#P zrlAxxI7DMIHzI{n+!%Bb>^_N}d}^*UfIrqg6(~&Ww4@eCi=1Rd869|~$}>%!z#V_{ z0)A5EjQ7hW>;9|;Pvy>Cenjh^}y)dDC93vU=YlkVr|7*w7jL@6QH80J~Y$yrL(AE1a~ykJ)dQNez0 zne_d2CJ{WkFw%meX9i{i;u4?ni=F!o(^kezvKs$WlM~jzx%+`P`2rPbOm9*COR1?& zz7l|>qt>Hyr`XxFoW;GNLON5nF5Drq=z_OX*7<8|-%giOvRQCo3qvKN{R%0djwT{R z>>)JqSc1yP?17=#QJq@pD)f|!h0Tn-ok*i!c<;m3^IxO zBwW&rU=3AFtdPkei#Mb_mUeh;rZyfiBFV8(2n3qirLN=AY>$?YW!dsM%7IW;4e4N#7p>86QQyT$^l(_pI zZO#j9j*kD-M)@K&0h|M8c9ZD3wbVpCz-olssm)tg0+<{VY5FU*$Xv67IKq?E=<>XgG2 zX6p(GLG7uN5!)$fTp~@fb)b)h680R|=?FH2`*5cj_tKET!+o6jsO5&4}tnTiC<{k>N>WX>exbVFGu;ZV?>8<~Q+ zB^FX4iBQEvHhv&^yuxp1rJXlN?84bjuLXDh7HjNx3{Q)DW7q$+dygg2zaEpU|AMem zqs4rs*Q&nzgF8O+#6k6u7HObIv>Y9s91jrT!sP7(G2HXB4?I6O{E8S;V=EUAs_2|{ zWWL!uere891T|8bpZ@*?k2I=aA?;6{F=0c?XxbUKO>1b_0~O}E-b zGQ!2?@IyA}(TMO|Hy9^mLn>iP{F_u76kGbh+)*;uO9_#er}OQBhs)64b_O2zLVw#G zcmNCi?eV}PQP6KlR@3jQ@lKM@C|i~D0;IupGPxcY&atdKn31stDUF;WSa~?jZrL6Z z{w%pT`sq36{#=xj8mTEfm5w;3RGWl(2GT%f`9veC#O_?}<~Gh#ZxI=oJ4x>fTjf=0 zUxyi)jXFfZj%;G%!`=IhRzNztgDS{O%g}+pP`c&MxWCNC2mMnUvWcZ7FhacYp-AS9 z%115$M}^nc#4-zoid62l%ZH8(YJnuag>&Hz>JcH1YAe0$H1x7l?PaH-mlcn7bL4BS zb@1Va&`EAv4K`UHp;tXU2p}oQPdQj0RU+^B(2$}jOp981T}fA;0tdn!*xBB$J_^>N z_N=nx_1K4M!*D@YVikg>O&ic0VGz7j8%1>p>L1k!OW-lZ%z;)P2ugORvBH$i#vT0~ z1b=F~YIq-7(pIgs8)hRLjC!Lf%v2h)LV{Zx?by&EHxevmHQpjGvB)(rkId^7@Y7>C z;;#BEEV9&Jvq4tJsRAC&B(%k90|GaoB?+u68}2hsX1N$G>`JRDM7*F!@8xBJd>Tn$ zVB9REmjpmrgk^KGcmAbE+7a+jhNY1d_@gggajRNjq`Wk|CX_{aW&g{Ivy;R9hhFeO z?fx^Thi7kIo}UGyL0p*6il&yYUYrJFUfVfl8FYPcbSmAtMLJ6+Y4mzLruY;VAVflR z`E8X?V-4#eG%J!o6h`<3;y?(Ug+@D-Mmw(2PSB_VThVa!M-AW$H6g%FZP!HA8_tFF zhaQX%-f9idOg}mtPJ;gb_P8ML>|y(`5O))n6oQDIGm)9k3SFoBS^#?+wwXaF)y~L4L~RcYTGAe_=aF#8LP2qwdl2&{-6L3 zDhvX+D-#zc2aYK8_{$zhsZW3RFMF)We~GxC3_wp}yFuciInR^Hgq?O&wBz@8)O$qt z_9Z%7W($gQn$1fwrwE!al~X}u!(P7FD9&$Tq_hMM_jJiN5R@uT(nauEj=bEo;McgY z(lATmgbab2rDz$c$F1Lw>e#;xPr=2`ZH+$RLIw5{QStK=}Uu4F8wzgEG$+S5qilS;=)qetQ1@ zGg3; z1QaBm|6!59RilM*Ap3x~mw*9)s588d^AdN#7zN*mzthJ^OuW3joY{O9C!>~cd(JxG z+4l*0&7Z!Wm{1;=%)2?L(wH3TLCLo$2Jg`TF(gKfQSQ z`s;7q|aK?BV?|XA}eDdRktWnv2^h0@#Dwx@8~ue zmDhva`MdBn?3cWD_3^LK{^)C05|0!8tj{v$5Idy1#VM z3ytF7HBo8%5s3*=oQ|R-cpmYAr7B-*$+P{4=s6ncqev-%-mBAN`;n?bVed+L7-1vr zwI2z!(jZ4+ldzv=s%t+=D!+$s5T%j#HK4WjBgi83DG+Dao)6G-dmY~-0P@urSjN1P z-z#GZz*#gx>v^8trsKp;M_U-3Zy_&6SH3}D^>}C(rKk$8{eZYJIK-G^aml|L?k)L} zma}=8xe^cLY`uiTZia6#Z00bVq$t7Q1vvsIp;%f96hSe(76<+k&c8&#LZGB?2%}d{ zdsQp*Zuh5D<+Bn!VyW#U?duXlbhYzvg#rerO^MGO&1L-iaLZWEYq?Hyf?Lm zhHqo4bHVGX={8bJ7nhmrM6t4tJ3VuVEDDROZZo&E+EncB8V=VycWMED7eqYZ{UxD{ z<@f%#UNQO(wclD&LD65$AA35W#r#%icn#K!)T7WY}CLGKvDNHu! zI@LpjU+de|&GLlljzhyv@g5YYldb&8?TCGc3Z0QT#

VVAlpadP{VWFVd!c;@P|Q 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%0DUe#p&O5 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 slqB+C5 0) { + console.log(chalk.cyan(`\n Found ${customFiles.length} custom content file(s):`)); + for (const customFile of customFiles) { + const customInfo = await customHandler.getCustomInfo(customFile, projectDir); + if (customInfo) { + console.log(chalk.dim(` • ${customInfo.name} (${customInfo.relativePath})`)); + + // Install the custom content + const result = await customHandler.install( + customInfo.path, + bmadDir, + { ...config.coreConfig, ...customInfo.config }, + (filePath) => { + // Track installed files + this.installedFiles.push(filePath); + }, + ); + + if (result.errors.length > 0) { + console.log(chalk.yellow(` ⚠️ ${result.errors.length} error(s) occurred`)); + for (const error of result.errors) { + console.log(chalk.dim(` - ${error}`)); + } + } else { + console.log(chalk.green(` ✓ Installed ${result.agentsInstalled} agents, ${result.workflowsInstalled} workflows`)); + } + } + } + } + spinner.succeed('Custom content installed'); + } + // Generate clean config.yaml files for each installed module spinner.start('Generating module configurations...'); await this.generateModuleConfigs(bmadDir, moduleConfigs); diff --git a/tools/cli/installers/lib/custom/handler.js b/tools/cli/installers/lib/custom/handler.js index 87f37d37..dddec7e5 100644 --- a/tools/cli/installers/lib/custom/handler.js +++ b/tools/cli/installers/lib/custom/handler.js @@ -68,9 +68,10 @@ class CustomHandler { /** * Get custom content info from a custom.yaml file * @param {string} customYamlPath - Path to custom.yaml file + * @param {string} projectRoot - Project root directory for calculating relative paths * @returns {Object|null} Custom content info */ - async getCustomInfo(customYamlPath) { + async getCustomInfo(customYamlPath, projectRoot = null) { try { const configContent = await fs.readFile(customYamlPath, 'utf8'); @@ -84,7 +85,9 @@ class CustomHandler { } const customDir = path.dirname(customYamlPath); - const relativePath = path.relative(process.cwd(), customDir); + // Use provided projectRoot or fall back to process.cwd() + const basePath = projectRoot || process.cwd(); + const relativePath = path.relative(basePath, customDir); return { id: config.code || path.basename(customDir), @@ -236,13 +239,20 @@ class CustomHandler { // Copy with placeholder replacement for text files const textExtensions = ['.md', '.yaml', '.yml', '.txt', '.json']; if (textExtensions.some((ext) => entry.name.endsWith(ext))) { - await this.fileOps.copyFile(sourcePath, targetPath, { - bmadFolder: config.bmad_folder || 'bmad', - userName: config.user_name || 'User', - communicationLanguage: config.communication_language || 'English', - outputFolder: config.output_folder || 'docs', - }); + // Read source content + let content = await fs.readFile(sourcePath, 'utf8'); + + // Replace placeholders + content = content.replaceAll('{bmad_folder}', config.bmad_folder || 'bmad'); + content = content.replaceAll('{user_name}', config.user_name || 'User'); + content = content.replaceAll('{communication_language}', config.communication_language || 'English'); + content = content.replaceAll('{output_folder}', config.output_folder || 'docs'); + + // Write to target + await fs.ensureDir(path.dirname(targetPath)); + await fs.writeFile(targetPath, content, 'utf8'); } else { + // Copy binary files as-is await fs.copy(sourcePath, targetPath); } diff --git a/tools/cli/lib/ui.js b/tools/cli/lib/ui.js index 27bea105..9b7078fa 100644 --- a/tools/cli/lib/ui.js +++ b/tools/cli/lib/ui.js @@ -52,6 +52,9 @@ class UI { await installer.handleLegacyV4Migration(confirmedDirectory, legacyV4); } + // Prompt for custom content location (separate from installation directory) + const customContentConfig = await this.promptCustomContentLocation(); + // Check if there's an existing BMAD installation const fs = require('fs-extra'); const path = require('node:path'); @@ -85,9 +88,12 @@ class UI { // Handle quick update separately if (actionType === 'quick-update') { + // Even for quick update, ask about custom content + const customContentConfig = await this.promptCustomContentLocation(); return { actionType: 'quick-update', directory: confirmedDirectory, + customContent: customContentConfig, }; } @@ -125,8 +131,21 @@ class UI { console.log(chalk.cyan('\n📦 Keeping existing modules: ') + selectedModules.join(', ')); } else { // Only show module selection for new installs - const moduleChoices = await this.getModuleChoices(installedModuleIds); + const moduleChoices = await this.getModuleChoices(installedModuleIds, customContentConfig); selectedModules = await this.selectModules(moduleChoices); + + // Check which custom content items were selected + const selectedCustomContent = selectedModules.filter((mod) => mod.startsWith('__CUSTOM_CONTENT__')); + if (selectedCustomContent.length > 0) { + customContentConfig.selected = true; + customContentConfig.selectedFiles = selectedCustomContent.map((mod) => mod.replace('__CUSTOM_CONTENT__', '')); + // Filter out custom content markers since they're not real modules + selectedModules = selectedModules.filter((mod) => !mod.startsWith('__CUSTOM_CONTENT__')); + } else if (customContentConfig.hasCustomContent) { + // User provided custom content but didn't select any + customContentConfig.selected = false; + customContentConfig.selectedFiles = []; + } } // Prompt for AgentVibes TTS integration @@ -147,7 +166,9 @@ class UI { ides: toolSelection.ides, skipIde: toolSelection.skipIde, coreConfig: coreConfig, // Pass collected core config to installer - enableAgentVibes: agentVibesConfig.enabled, // AgentVibes TTS integration + // Custom content configuration + customContent: customContentConfig, + enableAgentVibes: agentVibesConfig.enabled, agentVibesInstalled: agentVibesConfig.alreadyInstalled, }; } @@ -483,19 +504,50 @@ class UI { /** * Get module choices for selection * @param {Set} installedModuleIds - Currently installed module IDs + * @param {Object} customContentConfig - Custom content configuration * @returns {Array} Module choices for inquirer */ - async getModuleChoices(installedModuleIds) { + async getModuleChoices(installedModuleIds, customContentConfig = null) { + const moduleChoices = []; + const isNewInstallation = installedModuleIds.size === 0; + + // Add custom content items first if found + if (customContentConfig && customContentConfig.hasCustomContent && customContentConfig.customPath) { + // Add separator before custom content + moduleChoices.push(new inquirer.Separator('── Custom Content ──')); + + // Get the custom content info to display proper names + const { CustomHandler } = require('../installers/lib/custom/handler'); + const customHandler = new CustomHandler(); + const customFiles = await customHandler.findCustomContent(customContentConfig.customPath); + + for (const customFile of customFiles) { + const customInfo = await customHandler.getCustomInfo(customFile); + if (customInfo) { + moduleChoices.push({ + name: `${chalk.cyan('✓')} ${customInfo.name} ${chalk.gray(`(${customInfo.relativePath})`)}`, + value: `__CUSTOM_CONTENT__${customFile}`, // Unique value for each custom content + checked: true, // Default to selected since user chose to provide custom content + }); + } + } + + // Add separator for official content + moduleChoices.push(new inquirer.Separator('── Official Content ──')); + } + + // Add official modules const { ModuleManager } = require('../installers/lib/modules/manager'); const moduleManager = new ModuleManager(); const availableModules = await moduleManager.listAvailable(); - const isNewInstallation = installedModuleIds.size === 0; - const moduleChoices = availableModules.map((mod) => ({ - name: mod.isCustom ? `${mod.name} ${chalk.red('(Custom)')}` : mod.name, - value: mod.id, - checked: isNewInstallation ? mod.defaultSelected || false : installedModuleIds.has(mod.id), - })); + for (const mod of availableModules) { + moduleChoices.push({ + name: mod.name, + value: mod.id, + checked: isNewInstallation ? mod.defaultSelected || false : installedModuleIds.has(mod.id), + }); + } return moduleChoices; } @@ -574,6 +626,111 @@ class UI { } } + /** + * Prompt for custom content location + * @returns {Object} Custom content configuration + */ + async promptCustomContentLocation() { + try { + CLIUtils.displaySection('Custom Content', 'Optional: Add custom agents and workflows'); + + const { hasCustomContent } = await inquirer.prompt([ + { + type: 'list', + name: 'hasCustomContent', + message: 'Do you have custom content to install?', + choices: [ + { name: 'No (skip custom content)', value: 'none' }, + { name: 'Enter a directory path', value: 'directory' }, + { name: 'Enter a URL', value: 'url' }, + ], + default: 'none', + }, + ]); + + if (hasCustomContent === 'none') { + return { hasCustomContent: false }; + } + + if (hasCustomContent === 'url') { + console.log(chalk.yellow('\nURL-based custom content installation is coming soon!')); + console.log(chalk.cyan('For now, please download your custom content and choose "Enter a directory path".\n')); + return { hasCustomContent: false }; + } + + if (hasCustomContent === 'directory') { + let customPath; + while (!customPath) { + let expandedPath; + const { directory } = await inquirer.prompt([ + { + type: 'input', + name: 'directory', + message: 'Enter the path to your custom content directory:', + default: process.cwd(), // Use actual current working directory + validate: async (input) => { + if (!input || input.trim() === '') { + return 'Please enter a directory path'; + } + + try { + expandedPath = this.expandUserPath(input.trim()); + } catch (error) { + return error.message; + } + + // Check if the path exists + const pathExists = await fs.pathExists(expandedPath); + if (!pathExists) { + return 'Directory does not exist'; + } + + return true; + }, + }, + ]); + + // Now expand the path for use after the prompt + expandedPath = this.expandUserPath(directory.trim()); + + // Check if directory has custom content + const { CustomHandler } = require('../installers/lib/custom/handler'); + const customHandler = new CustomHandler(); + const customFiles = await customHandler.findCustomContent(expandedPath); + + if (customFiles.length === 0) { + console.log(chalk.yellow(`\nNo custom.yaml files found in ${expandedPath}`)); + + const { tryAgain } = await inquirer.prompt([ + { + type: 'confirm', + name: 'tryAgain', + message: 'Try a different directory?', + default: true, + }, + ]); + + if (tryAgain) { + continue; + } else { + return { hasCustomContent: false }; + } + } + + customPath = expandedPath; + console.log(chalk.green(`\n✓ Found ${customFiles.length} custom content file(s)`)); + } + + return { hasCustomContent: true, customPath }; + } + + return { hasCustomContent: false }; + } catch (error) { + console.error(chalk.red('Error in custom content prompt:'), error); + return { hasCustomContent: false }; + } + } + /** * Confirm directory selection * @param {string} directory - The directory path From d5c687d99d149a1ecb47a3bd1d76df48a606ec19 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sun, 7 Dec 2025 14:11:17 -0600 Subject: [PATCH 24/26] custom content installation guide --- README.md | 4 +- docs/custom-agent-installation.md | 137 ---------- docs/custom-content-installation.md | 257 ++++++++++++++++++ docs/index.md | 4 +- .../toolsmith-sidecar/knowledge/docs.md | 2 +- .../{custom.bak => custom.yaml} | 0 ...install-config.bak => install-config.yaml} | 0 src/modules/bmb/docs/agents/index.md | 2 +- 8 files changed, 264 insertions(+), 142 deletions(-) delete mode 100644 docs/custom-agent-installation.md create mode 100644 docs/custom-content-installation.md rename example-custom-content/{custom.bak => custom.yaml} (100%) rename example-custom-module/mwm/_module-installer/{install-config.bak => install-config.yaml} (100%) diff --git a/README.md b/README.md index 0c64ce83..b92fdbfd 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,9 @@ ## AI-Driven Agile Development That Scales From Bug Fixes to Enterprise -**Build More, Architect Dreams** (BMAD) with **19 specialized AI agents** and **50+ guided workflows** that adapt to your project's complexity—from quick bug fixes to enterprise platforms. +**Build More, Architect Dreams** (BMAD) with **21 specialized AI agents** across 4 official modules, and **50+ guided workflows** that adapt to your project's complexity—from quick bug fixes to enterprise platforms, and new step file workflows that allow for incredibly long workflows to stay on the rails longer than ever before! + +Additionally - when we say 'Build More, Architect Dreams' - we mean it! The BMad Builder has landed, and now as of Alpha.15 is fully supported in the installation flow via NPX - custom stand along agents, workflows and the modules of your dreams! The community forge will soon open, endless possibility awaits! > **🚀 v6 is a MASSIVE upgrade from v4!** Complete architectural overhaul, scale-adaptive intelligence, visual workflows, and the powerful BMad Core framework. v4 users: this changes everything. [See what's new →](#whats-new-in-v6) diff --git a/docs/custom-agent-installation.md b/docs/custom-agent-installation.md deleted file mode 100644 index 11b6abc1..00000000 --- a/docs/custom-agent-installation.md +++ /dev/null @@ -1,137 +0,0 @@ -# Custom Agent Installation - -BMAD agents and workflows are now installed through the main CLI installer using a `custom.yaml` configuration file or by having an installer file. - -## Quick Start - -Create a `custom.yaml` file in the root of your agent/workflow folder: - -```yaml -code: my-custom-agent -name: 'My Custom Agent' -default_selected: true -``` - -Then run the BMAD installer from your project directory: - -```bash -npx bmad-method install -``` - -Or if you have bmad-cli installed globally: - -```bash -bmad install -``` - -## Installation Methods - -### Method 1: Stand-alone Folder with custom.yaml - -Place your agent or workflow in a folder with a `custom.yaml` file at the root: - -``` -my-agent/ -├── custom.yaml # Required configuration file -├── my-agent.agent.yaml -└── sidecar/ # Optional - └── instructions.md -``` - -### Method 2: Installer File - -For more complex installations, include an `installer.js` or `installer.yaml` file in your agent/workflow folder: - -``` -my-workflow/ -├── workflow.md -└── installer.yaml # Custom installation logic -``` - -## What It Does - -1. **Discovers** available agents and workflows from folders with `custom.yaml` -2. **Installs** to your project's `.bmad/custom/` directory -3. **Creates** IDE commands for all your configured IDEs (Claude Code, Codex, Cursor, etc.) -4. **Registers** the agent/workflow in the BMAD system - -## Example custom.yaml - -```yaml -code: my-custom-agent -name: 'My Custom Agent' -default_selected: true -``` - -## Installing Reference Agents - -The BMAD source includes example agents you can install. **You must copy them to your project first.** - -### Step 1: Copy the Agent Template - -**For simple agents** (single file): - -```bash -# From your project root -mkdir -p .bmad/custom/agents/my-agent -cp node_modules/bmad-method/src/modules/bmb/reference/agents/stand-alone/commit-poet.agent.yaml \ - .bmad/custom/agents/my-agent/ -``` - -**For expert agents** (folder with sidecar files): - -```bash -# Copy the entire folder -cp -r node_modules/bmad-method/src/modules/bmb/reference/agents/agent-with-memory/journal-keeper \ - .bmad/custom/agents/ -``` - -### Step 2: Create custom.yaml - -```bash -# In the agent folder, create custom.yaml -cat > .bmad/custom/agents/my-agent/custom.yaml << EOF -code: my-agent -name: "My Custom Agent" -default_selected: true -EOF -``` - -### Step 3: Install - -```bash -npx bmad-method install -# or: bmad install (if BMAD installed locally) -``` - -The installer will: - -1. Find the agent with its `custom.yaml` -2. Install it to the appropriate location -3. Create IDE commands for immediate use - -### Available Reference Agents - -**Simple (standalone file):** - -- `commit-poet.agent.yaml` - Commit message artisan with style preferences - -**Expert (folder with sidecar):** - -- `journal-keeper/` - Personal journal companion with memory and pattern recognition - -Find these in the BMAD source: - -``` -src/modules/bmb/reference/agents/ -├── stand-alone/ -│ └── commit-poet.agent.yaml -└── agent-with-memory/ - └── journal-keeper/ - ├── journal-keeper.agent.yaml - └── journal-keeper-sidecar/ -``` - -## Creating Your Own - -Use the BMB agent builder to craft your agents. Once ready to use, place your `.agent.yaml` files or folders with `custom.yaml` in `.bmad/custom/agents/` or `.bmad/custom/workflows/`. diff --git a/docs/custom-content-installation.md b/docs/custom-content-installation.md new file mode 100644 index 00000000..e56f0906 --- /dev/null +++ b/docs/custom-content-installation.md @@ -0,0 +1,257 @@ +# Custom Content Installation + +This guide explains how to create and install custom BMAD content including agents, workflows, and modules. Custom content allows you to extend BMAD's functionality with your own specialized tools and workflows that can be shared across projects or teams. + +## Types of Custom Content + +### 1. Custom Agents and Workflows (Standalone) + +Custom agents and workflows are standalone content packages that can be installed without being part of a full module. These are perfect for: + +- Sharing specialized agents across projects +- Building a personal Agent powered Notebook vault +- Distributing workflow templates +- Creating agent libraries for specific domains + +#### Structure + +A custom agents and workflows package follows this structure: + +``` +my-custom-agents/ +├── custom.yaml # Package configuration +├── agents/ # Agent definitions +│ └── my-agent/ +│ └── agent.md +└── workflows/ # Workflow definitions + └── my-workflow/ + └── workflow.md +``` + +#### Configuration + +Create a `custom.yaml` file in your package root: + +```yaml +code: my-custom-agents +name: 'My Custom Agents and Workflows' +default_selected: true +``` + +#### Example + +See `/example-custom-content` for a working example of a folder with multiple random custom agents and workflows. Technically its also just a module, but you will be able to further pick and choose from this folders contents of what you do and do not want to include in a destination folder. This way, you can store all custom content source in one location and easily install it to different locations. + +```bash +# The example is ready to use - just rename the config file: +mv example-custom-content/custom.bak example-custom-content/custom.yaml +``` + +### 2. Custom Modules + +Custom modules are complete BMAD modules that can include their own configuration, documentation, along with agents and workflows that all compliment each other. Additionally they will have their own installation scripts, data, and potentially other tools. Modules can be used for: + +- Domain-specific functionality (e.g., industry-specific workflows, entertainment, education and training, medical, etc...) +- Integration with external systems +- Specialized agent collections +- Custom tooling and utilities + +#### Structure + +A custom module follows this structure: + +``` +my-module/ +├── _module-installer/ +│ ├── installer.js # optional, when it exists it will run with module installation +│ └── install-config.yaml # Module installation configuration with custom question and answer capture +├── docs/ # Module documentation +├── agents/ # Module-specific agents +├── workflows/ # Module-specific workflows +├── data/ # csv or other content to power agent intelligence or workflows +├── tools/ # Custom tools, hooks, mcp +└── sub-modules/ # IDE-specific customizations + ├── vscode/ + └── cursor/ +``` + +#### Module Configuration + +The `_module-installer/install-config.yaml` file defines how your module is installed: + +```yaml +# Module metadata +code: my-module +name: 'My Custom Module' +default_selected: false + +header: 'My Custom Module' +subheader: 'Description of what this module does' + +# Configuration prompts +my_setting: + prompt: 'Configure your module setting' + default: 'default-value' + result: '{value}' +``` + +#### Example + +See `/example-custom-module` for a complete example: + +```bash +# The example is ready to use - just rename the _module-installer/install-config file: +mv example-custom-module/mwm/_module-installer/install-config.bak \ + example-custom-module/mwm/_module-installer/install-config.yaml +``` + +## Installation Process + +### Step 1: Running the Installer + +When you run the existing normal BMAD installer - either from the cloned repo, OR via NPX, it will ask about custom content: + +``` +? Do you have custom content to install? +❯ No (skip custom content) + Enter a directory path + Enter a URL [Coming soon] +``` + +### Step 2: Providing Custom Content Path + +If you select "Enter a directory path", the installer will prompt for the location: + +``` +? Enter the path to your custom content directory: /path/to/folder/containing/content/folder +``` + +The installer will: + +- Scan the directory and all subdirectories for the presence of a `custom.yaml` file (standalone content such as agents and workflows) +- Scan for `_module-installer/install-config.yaml` files (modules) +- Display an indication of how many installable folders it has found. Note that a project with stand along agents and workflows all under a single folder like the example will just list the count as 1 for that directory. + +### Step 3: Selecting Content + +The installer presents a unified selection interface: + +``` +? Select modules and custom content to install: +[── Custom Content ──] + ◉ My Custom Agents and Workflows (/path/to/custom) +[── Official Content ──] + ◯ BMM: Business Method & Management + ◯ CIS: Creativity & Innovation Suite +``` + +## Agent Sidecar Support + +Agents with sidecar content can store personal data, memories, and working files outside of the `.bmad` directory. This separation keeps personal content separate from BMAD's core files. + +### What is Sidecar Content? + +Sidecar content includes: + +- Agent memories and learning data +- Personal working files +- Temporary data +- User-specific configurations + +### Sidecar Configuration + +The sidecar folder location is configured during BMAD core installation: + +``` +? Where should users' agent sidecar memory folders be stored? +❯ .bmad-user-memory +``` + +### How It Works + +1. **Agent Declaration**: Agents declare `hasSidecar: true` in their metadata +2. **Sidecar Detection**: The installer automatically detects folders with "sidecar" in the name +3. **Installation**: Sidecar content is copied to the configured location +4. **Path Replacement**: The `{agent_sidecar_folder}` placeholder in agent configurations is replaced with the actual path to the installed instance of the sidecar folder. Now when you use the agent, depending on its design, will use the content in sidecar to record interactions, remember things you tell it, or serve a host of many other issues. + +### Example Structure + +``` +my-agent/ +├── agent.md # Agent definition +└── my-agent-sidecar/ # Sidecar content folder + ├── memories/ + ├── working/ + └── config/ +``` + +### Git Integration + +Since sidecar content is stored outside the `.bmad` directory (and typically outside version control), users can: + +- Add the sidecar folder to `.gitignore` to exclude personal data +- Share agent definitions without exposing personal content +- Maintain separate configurations for different projects + +Example `.gitignore` entry: + +``` +# Exclude agent personal data +.bmad-user-memory/ +``` + +## Creating Custom Content with BMAD Builder + +The BMAD Builder provides workflows that will guide you to produce your own custom content: + +1. **Agent Templates**: Use standardized agent templates with proper structure +2. **Workflow Templates**: Create workflows using proven patterns +3. **Validation Tools**: Validate your content before distribution +4. **Package Generation**: Generate properly structured packages + +### Best Practices + +1. **Use Clear Naming**: Make your content codes and names descriptive +2. **Provide Documentation**: Include clear setup and usage instructions +3. **Test Installation**: Test your content in a clean environment +4. **Version Management**: Use semantic versioning for updates +5. **Respect User Privacy**: Keep personal data in sidecar folders + +## Distribution + +Custom content can be distributed: + +1. **File System**: Copy folders directly to users +2. **Git Repositories**: Clone or download from version control +3. **Package Managers**: [Coming soon] npm package support +4. **URL Installation**: [Coming soon] Direct URL installation, including an official community vetted module forge + +## Troubleshooting + +### No Custom Content Found + +- Ensure your `custom.yaml` or `install-config.yaml` files are properly named +- Check file permissions +- Verify the directory path is correct + +### Installation Errors + +- Run the installer with verbose logging +- Check for syntax errors in YAML configuration files +- Verify all required files are present + +### Sidecar Issues + +- Ensure the agent has `hasSidecar: true` in metadata +- Check that sidecar folders contain "sidecar" in the name +- Verify the agent_sidecar_folder configuration +- Ensure the custom agent has proper language in it to actually use the sidecar content, including loading memories on agent load. + +## Support + +For help with custom content creation or installation: + +1. Check the examples in `/example-custom-content` and `/example-custom-module` +2. Review the BMAD documentation +3. Create an issue in the BMAD repository +4. Join the BMAD community discussions on discord diff --git a/docs/index.md b/docs/index.md index d5e1f83e..f769095e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -96,9 +96,9 @@ Instructions for loading agents and running workflows in your development enviro ## 🔧 Advanced Topics -### Custom Agents +### Custom Agents, Workflow and Modules -- **[Custom Agent Installation](./custom-agent-installation.md)** - Install and personalize agents with `bmad agent-install` +- **[Custom Content Installation](./custom-content-installation.md)** - Install and personalize agents, workflows and modules with the default bmad-method installer! - [Agent Customization Guide](./agent-customization-guide.md) - Customize agent behavior and responses ### Installation & Bundling diff --git a/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md b/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md index 2ae540a5..26d13df6 100644 --- a/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md +++ b/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md @@ -16,7 +16,7 @@ - @/docs/v6-open-items.md - Known issues and open items - @/docs/document-sharding-guide.md - Guide for sharding large documents - @/docs/agent-customization-guide.md - How to customize agents -- @/docs/custom-agent-installation.md - Custom agent installation guide +- @/docs/custom-content-installation.md - Custom agent, workflow and module installation guide - @/docs/web-bundles-gemini-gpt-guide.md - Web bundle usage for AI platforms - @/docs/BUNDLE_DISTRIBUTION_SETUP.md - Bundle distribution setup diff --git a/example-custom-content/custom.bak b/example-custom-content/custom.yaml similarity index 100% rename from example-custom-content/custom.bak rename to example-custom-content/custom.yaml diff --git a/example-custom-module/mwm/_module-installer/install-config.bak b/example-custom-module/mwm/_module-installer/install-config.yaml similarity index 100% rename from example-custom-module/mwm/_module-installer/install-config.bak rename to example-custom-module/mwm/_module-installer/install-config.yaml diff --git a/src/modules/bmb/docs/agents/index.md b/src/modules/bmb/docs/agents/index.md index 99f51845..650c427b 100644 --- a/src/modules/bmb/docs/agents/index.md +++ b/src/modules/bmb/docs/agents/index.md @@ -37,7 +37,7 @@ Production-ready examples in `/src/modules/bmb/reference/agents/`: For installing standalone simple and expert agents, see: -- [Custom Agent Installation](/docs/custom-agent-installation.md) +- [Custom Agent Installation](/docs/custom-content-installation.md) ## Key Concepts From ff9a085dd0ef745fcedf01efce4f51c9d8f2693c Mon Sep 17 00:00:00 2001 From: Alex Verkhovsky Date: Sun, 7 Dec 2025 13:13:33 -0700 Subject: [PATCH 25/26] feat: add Raven's Verdict PR review tool (#1054) * feat: add Raven's Verdict PR review tool * docs: add usage guidance to Raven's Verdict README * docs: add guidance to skip PRs that shouldn't merge --- tools/maintainer/review-pr-README.md | 55 ++++++ tools/maintainer/review-pr.md | 242 +++++++++++++++++++++++++++ 2 files changed, 297 insertions(+) create mode 100644 tools/maintainer/review-pr-README.md create mode 100644 tools/maintainer/review-pr.md diff --git a/tools/maintainer/review-pr-README.md b/tools/maintainer/review-pr-README.md new file mode 100644 index 00000000..d097ce94 --- /dev/null +++ b/tools/maintainer/review-pr-README.md @@ -0,0 +1,55 @@ +# Raven's Verdict - Deep PR Review Tool + +Adversarial code review for GitHub PRs. Works with any LLM agent. + +> **Status: Experimental.** We're still figuring out how to use this effectively. Expect the workflow to evolve. + +## How It Works + +Point your agent at `review-pr.md` and ask it to review a specific PR: + +> "Read tools/maintainer/review-pr.md and apply it to PR #123" + +The tool will: + +1. Check out the PR branch locally +2. Run an adversarial review (find at least 5 issues) +3. Transform findings into professional tone +4. Preview the review and ask before posting + +See `review-pr.md` for full prompt structure, severity ratings, and sandboxing rules. + +## When to Use + +**Good candidates:** + +- PRs with meaningful logic changes +- Refactors touching multiple files +- New features or architectural changes + +**Skip it for:** + +- Trivial PRs (typo fixes, version bumps, single-line changes) +- PRs you've already reviewed manually +- PRs where you haven't agreed on the approach yet — fix the direction before the implementation + +## Workflow Tips + +**Always review before posting.** The preview step exists for a reason: + +- **[y] Yes** — Post as-is (only if you're confident) +- **[e] Edit** — Modify findings before posting +- **[s] Save only** — Write to file, don't post + +The save option is useful when you want to: + +- Hand-edit the review before posting +- Use the findings as input for a second opinion ("Hey Claude, here's what Raven found — what do you think?") +- Cherry-pick specific findings + +**Trust but verify.** LLM reviews can miss context or flag non-issues. Skim the findings before they hit the PR. + +## Prerequisites + +- `gh` CLI installed and authenticated (`gh auth status`) +- Any LLM agent capable of running bash commands diff --git a/tools/maintainer/review-pr.md b/tools/maintainer/review-pr.md new file mode 100644 index 00000000..24dbb706 --- /dev/null +++ b/tools/maintainer/review-pr.md @@ -0,0 +1,242 @@ +# Raven's Verdict - Deep PR Review Tool + +A cynical adversarial review, transformed into cold engineering professionalism. + + +CRITICAL: Sandboxed Execution Rules + +Before proceeding, you MUST verify: + +- [ ] PR number or URL was EXPLICITLY provided in the user's message +- [ ] You are NOT inferring the PR from conversation history +- [ ] You are NOT looking at git branches, recent commits, or local state +- [ ] You are NOT guessing or assuming any PR numbers + +**If no explicit PR number/URL was provided, STOP immediately and ask:** +"What PR number or URL should I review?" + + + + +## Preflight Checks + +### 0.1 Parse PR Input + +Extract PR number from user input. Examples of valid formats: + +- `123` (just the number) +- `#123` (with hash) +- `https://github.com/owner/repo/pull/123` (full URL) + +If a URL specifies a different repository than the current one: + +```bash +# Check current repo +gh repo view --json nameWithOwner -q '.nameWithOwner' +``` + +If mismatch detected, ask user: + +> "This PR is from `{detected_repo}` but we're in `{current_repo}`. Proceed with reviewing `{detected_repo}#123`? (y/n)" + +If user confirms, store `{REPO}` for use in all subsequent `gh` commands. + +### 0.2 Ensure Clean Checkout + +Verify the working tree is clean and check out the PR branch. + +```bash +# Check for uncommitted changes +git status --porcelain +``` + +If output is non-empty, STOP and tell user: + +> "You have uncommitted changes. Please commit or stash them before running a PR review." + +If clean, fetch and checkout the PR branch: + +```bash +# Fetch and checkout PR branch +# For cross-repo PRs, include --repo {REPO} +gh pr checkout {PR_NUMBER} [--repo {REPO}] +``` + +If checkout fails, STOP and report the error. + +Now you're on the PR branch with full access to all files as they exist in the PR. + +### 0.3 Check PR Size + +```bash +# For cross-repo PRs, include --repo {REPO} +gh pr view {PR_NUMBER} [--repo {REPO}] --json additions,deletions,changedFiles -q '{"additions": .additions, "deletions": .deletions, "files": .changedFiles}' +``` + +**Size thresholds:** + +| Metric | Warning Threshold | +| ------------- | ----------------- | +| Files changed | > 50 | +| Lines changed | > 5000 | + +If thresholds exceeded, ask user: + +> "This PR has {X} files and {Y} line changes. That's large. +> +> **[f] Focus** - Pick specific files or directories to review +> **[p] Proceed** - Review everything (may be slow/expensive) +> **[a] Abort** - Stop here" + +### 0.4 Note Binary Files + +```bash +# For cross-repo PRs, include --repo {REPO} +gh pr diff {PR_NUMBER} [--repo {REPO}] --name-only | grep -E '\.(png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|pdf|zip|tar|gz|bin|exe|dll|so|dylib)$' || echo "No binary files detected" +``` + +Store list of binary files to skip. Note them in final output. + + + + + +### 1.1 Run Cynical Review + +**INTERNAL PERSONA - Never post this directly:** + +Task: You are a cynical, jaded code reviewer with zero patience for sloppy work. This PR was submitted by a clueless weasel and you expect to find problems. Find at least five issues to fix or improve in it. Number them. Be skeptical of everything. Ultrathink. + +Output format: + +```markdown +### [NUMBER]. [FINDING TITLE] [likely] + +**Severity:** [EMOJI] [LEVEL] + +[DESCRIPTION - be specific, include file:line references] +``` + +Severity scale: + +| Level | Emoji | Meaning | +| -------- | ----- | ------------------------------------------------------- | +| Critical | 🔴 | Security issue, data loss risk, or broken functionality | +| Moderate | 🟡 | Bug, performance issue, or significant code smell | +| Minor | 🟢 | Style, naming, minor improvement opportunity | + +Likely tag: + +- Add `[likely]` to findings with high confidence, e.g. with direct evidence +- Sort findings by severity (Critical → Moderate → Minor), not by confidence + + + + + +**Transform the cynical output into cold engineering professionalism.** + +**Transformation rules:** + +1. Remove all inflammatory language, insults, assumptions about the author +2. Keep all technical substance, file references, severity ratings and likely tag +3. Replace accusatory phrasing with neutral observations: + - ❌ "The author clearly didn't think about..." + - ✅ "This implementation may not account for..." +4. Preserve skepticism as healthy engineering caution: + - ❌ "This will definitely break in production" + - ✅ "This pattern has historically caused issues in production environments" +5. Add the suggested fixes. +6. Keep suggestions actionable and specific + +Output format after transformation: + +```markdown +## PR Review: #{PR_NUMBER} + +**Title:** {PR_TITLE} +**Author:** @{AUTHOR} +**Branch:** {HEAD} → {BASE} + +--- + +### Findings + +[TRANSFORMED FINDINGS HERE] + +--- + +### Summary + +**Critical:** {COUNT} | **Moderate:** {COUNT} | **Minor:** {COUNT} + +[BINARY_FILES_NOTE if any] + +--- + +_Review generated by Raven's Verdict. LLM-produced analysis - findings may be incorrect or lack context. Verify before acting._ +``` + + + + +### 3.1 Preview + +Display the complete transformed review to the user. + +``` +══════════════════════════════════════════════════════ +PREVIEW - This will be posted to PR #{PR_NUMBER} +══════════════════════════════════════════════════════ + +[FULL REVIEW CONTENT] + +══════════════════════════════════════════════════════ +``` + +### 3.2 Confirm + +Ask user for explicit confirmation: + +> **Ready to post this review to PR #{PR_NUMBER}?** +> +> **[y] Yes** - Post as comment +> **[n] No** - Abort, do not post +> **[e] Edit** - Let me modify before posting +> **[s] Save only** - Save locally, don't post + +### 3.3 Post or Save + +**Write review to a temp file, then post:** + +1. Write the review content to a temp file with a unique name (include PR number to avoid collisions) +2. Post using `gh pr comment {PR_NUMBER} [--repo {REPO}] --body-file {path}` +3. Delete the temp file after successful post + +Do NOT use heredocs or `echo` - Markdown code blocks will break shell parsing. Use your file writing tool instead. + +**If auth fails or post fails:** + +1. Display error prominently: + + ``` + ⚠️ FAILED TO POST REVIEW + Error: {ERROR_MESSAGE} + ``` + +2. Keep the temp file and tell the user where it is, so they can post manually with: + `gh pr comment {PR_NUMBER} [--repo {REPO}] --body-file {path}` + +**If save only (s):** + +Keep the temp file and inform user of location. + + + + +- The "cynical asshole" phase is internal only - never posted +- Tone transform MUST happen before any external output +- When in doubt, ask the user - never assume +- If you're unsure about severity, err toward higher severity +- If you're unsure about confidence, be honest and use Medium or Low + From 38e65abd839b61980391e2236b7ecefc49fbea07 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sun, 7 Dec 2025 14:55:44 -0600 Subject: [PATCH 26/26] moved code of conduct to github folder, readme links to it --- CODE_OF_CONDUCT.md => .github/CODE_OF_CONDUCT.md | 8 ++++---- README.md | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) rename CODE_OF_CONDUCT.md => .github/CODE_OF_CONDUCT.md (94%) diff --git a/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md similarity index 94% rename from CODE_OF_CONDUCT.md rename to .github/CODE_OF_CONDUCT.md index 27b04993..843ec9ee 100644 --- a/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -60,7 +60,7 @@ representative at an online or offline event. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at -the official BMAD Discord server (https://discord.com/invite/gk8jAdXWmj) - DM a moderator or flag a post. +the official BMAD Discord server () - DM a moderator or flag a post. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the @@ -116,7 +116,7 @@ the community. This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at -https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. +. Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). @@ -124,5 +124,5 @@ enforcement ladder](https://github.com/mozilla/diversity). [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see the FAQ at -https://www.contributor-covenant.org/faq. Translations are available at -https://www.contributor-covenant.org/translations. +. Translations are available at +. diff --git a/README.md b/README.md index b92fdbfd..1c0975e8 100644 --- a/README.md +++ b/README.md @@ -156,6 +156,7 @@ Each agent brings deep expertise and can be customized to match your team's styl - **[GitHub Issues](https://github.com/bmad-code-org/BMAD-METHOD/issues)** - Report bugs, request features - **[YouTube Channel](https://www.youtube.com/@BMadCode)** - Video tutorials and demos - **[Web Bundles](https://bmad-code-org.github.io/bmad-bundles/)** - Pre-built agent bundles +- **[Code of Conduct](.github/CODE_OF_CONDUCT.md)** - Community guidelines ## 🛠️ Development

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%0DyHD7mC$na0lc_P;T$H}5z*94mtJ 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%0D4*8jt{Q%$Wu%`?K<;VcOYG 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