From 542a7429ec7f70deb2f84712050fa675db4dfeea Mon Sep 17 00:00:00 2001 From: Alex Verkhovsky Date: Sat, 31 Jan 2026 13:22:13 -0700 Subject: [PATCH 01/13] Restore generate-project-context workflow (#1491) --- .../bmad-bmm-generate-project-context.md | 14 + src/bmm/agents/quick-flow-solo-dev.agent.yaml | 1 - src/bmm/module-help.csv | 1 + .../project-context-template.md | 21 ++ .../steps/step-01-discover.md | 184 ++++++++++ .../steps/step-02-generate.md | 318 ++++++++++++++++++ .../steps/step-03-complete.md | 278 +++++++++++++++ .../generate-project-context/workflow.md | 49 +++ 8 files changed, 865 insertions(+), 1 deletion(-) create mode 100644 .claude/commands/bmad-bmm-generate-project-context.md create mode 100644 src/bmm/workflows/generate-project-context/project-context-template.md create mode 100644 src/bmm/workflows/generate-project-context/steps/step-01-discover.md create mode 100644 src/bmm/workflows/generate-project-context/steps/step-02-generate.md create mode 100644 src/bmm/workflows/generate-project-context/steps/step-03-complete.md create mode 100644 src/bmm/workflows/generate-project-context/workflow.md diff --git a/.claude/commands/bmad-bmm-generate-project-context.md b/.claude/commands/bmad-bmm-generate-project-context.md new file mode 100644 index 00000000..7c17f855 --- /dev/null +++ b/.claude/commands/bmad-bmm-generate-project-context.md @@ -0,0 +1,14 @@ +--- +name: 'generate-project-context' +description: 'Scan existing codebase to generate a lean LLM-optimized project-context.md with critical implementation rules and patterns for AI agents' +--- + +IT IS CRITICAL THAT YOU FOLLOW THESE STEPS - while staying in character as the current agent persona you may have loaded: + + +1. Always LOAD the FULL @{project-root}/_bmad/core/tasks/workflow.xml +2. READ its entire contents - this is the CORE OS for EXECUTING the specific workflow-config @{project-root}/_bmad/bmm/workflows/generate-project-context/workflow.md +3. Pass the yaml path @{project-root}/_bmad/bmm/workflows/generate-project-context/workflow.md as 'workflow-config' parameter to the workflow.xml instructions +4. Follow workflow.xml instructions EXACTLY as written to process and follow the specific workflow config and its instructions +5. Save outputs after EACH section when generating any documents from templates + diff --git a/src/bmm/agents/quick-flow-solo-dev.agent.yaml b/src/bmm/agents/quick-flow-solo-dev.agent.yaml index 83a8b29c..c488db6d 100644 --- a/src/bmm/agents/quick-flow-solo-dev.agent.yaml +++ b/src/bmm/agents/quick-flow-solo-dev.agent.yaml @@ -16,7 +16,6 @@ agent: principles: | - Planning and execution are two sides of the same coin. - Specs are for building, not bureaucracy. Code that ships is better than perfect code that doesn't. - - If `**/project-context.md` exists, follow it. If absent, proceed without. menu: - trigger: TS or fuzzy match on tech-spec diff --git a/src/bmm/module-help.csv b/src/bmm/module-help.csv index 02ada448..9a235d44 100644 --- a/src/bmm/module-help.csv +++ b/src/bmm/module-help.csv @@ -1,5 +1,6 @@ module,phase,name,code,sequence,workflow-file,command,required,agent,options,description,output-location,outputs, bmm,anytime,Document Project,DP,10,_bmad/bmm/workflows/document-project/workflow.yaml,bmad-bmm-document-project,false,analyst,Create Mode,"Analyze an existing project to produce useful documentation",project-knowledge,*, +bmm,anytime,Generate Project Context,GPC,15,_bmad/bmm/workflows/generate-project-context/workflow.md,bmad-bmm-generate-project-context,false,analyst,Create Mode,"Scan existing codebase to generate a lean LLM-optimized project-context.md containing critical implementation rules patterns and conventions for AI agents. Essential for brownfield projects and quick-flow.",output_folder,"project context", bmm,anytime,Quick Spec,TS,20,_bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md,bmad-bmm-quick-spec,false,quick-flow-solo-dev,Create Mode,"Do not suggest for potentially very complex things unless requested or if the user complains that they do not want to follow the extensive planning of the bmad method. Quick one-off tasks small changes simple apps utilities without extensive planning",planning_artifacts,"tech spec", bmm,anytime,Quick Dev,QD,30,_bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md,bmad-bmm-quick-dev,false,quick-flow-solo-dev,Create Mode,"Quick one-off tasks small changes simple apps utilities without extensive planning - Do not suggest for potentially very complex things unless requested or if the user complains that they do not want to follow the extensive planning of the bmad method, unless the user is already working through the implementation phase and just requests a 1 off things not already in the plan",,, bmm,anytime,Correct Course,CC,40,_bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml,bmad-bmm-correct-course,false,sm,Create Mode,"Anytime: Navigate significant changes. May recommend start over update PRD redo architecture sprint planning or correct epics and stories",planning_artifacts,"change proposal", diff --git a/src/bmm/workflows/generate-project-context/project-context-template.md b/src/bmm/workflows/generate-project-context/project-context-template.md new file mode 100644 index 00000000..ee01c4b3 --- /dev/null +++ b/src/bmm/workflows/generate-project-context/project-context-template.md @@ -0,0 +1,21 @@ +--- +project_name: '{{project_name}}' +user_name: '{{user_name}}' +date: '{{date}}' +sections_completed: ['technology_stack'] +existing_patterns_found: { { number_of_patterns_discovered } } +--- + +# Project Context for AI Agents + +_This file contains critical rules and patterns that AI agents must follow when implementing code in this project. Focus on unobvious details that agents might otherwise miss._ + +--- + +## Technology Stack & Versions + +_Documented after discovery phase_ + +## Critical Implementation Rules + +_Documented after discovery phase_ diff --git a/src/bmm/workflows/generate-project-context/steps/step-01-discover.md b/src/bmm/workflows/generate-project-context/steps/step-01-discover.md new file mode 100644 index 00000000..fa36993d --- /dev/null +++ b/src/bmm/workflows/generate-project-context/steps/step-01-discover.md @@ -0,0 +1,184 @@ +# Step 1: Context Discovery & Initialization + +## MANDATORY EXECUTION RULES (READ FIRST): + +- 🛑 NEVER generate content without user input +- ✅ ALWAYS treat this as collaborative discovery between technical peers +- 📋 YOU ARE A FACILITATOR, not a content generator +- 💬 FOCUS on discovering existing project context and technology stack +- 🎯 IDENTIFY critical implementation rules that AI agents need +- ⚠️ ABSOLUTELY NO TIME ESTIMATES - AI development speed has fundamentally changed +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +## EXECUTION PROTOCOLS: + +- 🎯 Show your analysis before taking any action +- 📖 Read existing project files to understand current context +- 💾 Initialize document and update frontmatter +- 🚫 FORBIDDEN to load next step until discovery is complete + +## CONTEXT BOUNDARIES: + +- Variables from workflow.md are available in memory +- Focus on existing project files and architecture decisions +- Look for patterns, conventions, and unique requirements +- Prioritize rules that prevent implementation mistakes + +## YOUR TASK: + +Discover the project's technology stack, existing patterns, and critical implementation rules that AI agents must follow when writing code. + +## DISCOVERY SEQUENCE: + +### 1. Check for Existing Project Context + +First, check if project context already exists: + +- Look for file at `{project_knowledge}/project-context.md or {project-root}/**/project-context.md` +- If exists: Read complete file to understand existing rules +- Present to user: "Found existing project context with {number_of_sections} sections. Would you like to update this or create a new one?" + +### 2. Discover Project Technology Stack + +Load and analyze project files to identify technologies: + +**Architecture Document:** + +- Look for `{planning_artifacts}/architecture.md` +- Extract technology choices with specific versions +- Note architectural decisions that affect implementation + +**Package Files:** + +- Check for `package.json`, `requirements.txt`, `Cargo.toml`, etc. +- Extract exact versions of all dependencies +- Note development vs production dependencies + +**Configuration Files:** + +- Look for project language specific configs ( example: `tsconfig.json`) +- Build tool configs (webpack, vite, next.config.js, etc.) +- Linting and formatting configs (.eslintrc, .prettierrc, etc.) +- Testing configurations (jest.config.js, vitest.config.ts, etc.) + +### 3. Identify Existing Code Patterns + +Search through existing codebase for patterns: + +**Naming Conventions:** + +- File naming patterns (PascalCase, kebab-case, etc.) +- Component/function naming conventions +- Variable naming patterns +- Test file naming patterns + +**Code Organization:** + +- How components are structured +- Where utilities and helpers are placed +- How services are organized +- Test organization patterns + +**Documentation Patterns:** + +- Comment styles and conventions +- Documentation requirements +- README and API doc patterns + +### 4. Extract Critical Implementation Rules + +Look for rules that AI agents might miss: + +**Language-Specific Rules:** + +- TypeScript strict mode requirements +- Import/export conventions +- Async/await vs Promise usage patterns +- Error handling patterns specific to the language + +**Framework-Specific Rules:** + +- React hooks usage patterns +- API route conventions +- Middleware usage patterns +- State management patterns + +**Testing Rules:** + +- Test structure requirements +- Mock usage conventions +- Integration vs unit test boundaries +- Coverage requirements + +**Development Workflow Rules:** + +- Branch naming conventions +- Commit message patterns +- PR review requirements +- Deployment procedures + +### 5. Initialize Project Context Document + +Based on discovery, create or update the context document: + +#### A. Fresh Document Setup (if no existing context) + +Copy template from `{installed_path}/project-context-template.md` to `{output_folder}/project-context.md` +Initialize frontmatter fields. + +#### B. Existing Document Update + +Load existing context and prepare for updates +Set frontmatter `sections_completed` to track what will be updated + +### 6. Present Discovery Summary + +Report findings to user: + +"Welcome {{user_name}}! I've analyzed your project for {{project_name}} to discover the context that AI agents need. + +**Technology Stack Discovered:** +{{list_of_technologies_with_versions}} + +**Existing Patterns Found:** + +- {{number_of_patterns}} implementation patterns +- {{number_of_conventions}} coding conventions +- {{number_of_rules}} critical rules + +**Key Areas for Context Rules:** + +- {{area_1}} (e.g., TypeScript configuration) +- {{area_2}} (e.g., Testing patterns) +- {{area_3}} (e.g., Code organization) + +{if_existing_context} +**Existing Context:** Found {{sections}} sections already defined. We can update or add to these. +{/if_existing_context} + +Ready to create/update your project context. This will help AI agents implement code consistently with your project's standards. + +[C] Continue to context generation" + +## SUCCESS METRICS: + +✅ Existing project context properly detected and handled +✅ Technology stack accurately identified with versions +✅ Critical implementation patterns discovered +✅ Project context document properly initialized +✅ Discovery findings clearly presented to user +✅ User ready to proceed with context generation + +## FAILURE MODES: + +❌ Not checking for existing project context before creating new one +❌ Missing critical technology versions or configurations +❌ Overlooking important coding patterns or conventions +❌ Not initializing frontmatter properly +❌ Not presenting clear discovery summary to user + +## NEXT STEP: + +After user selects [C] to continue, load `./step-02-generate.md` to collaboratively generate the specific project context rules. + +Remember: Do NOT proceed to step-02 until user explicitly selects [C] from the menu and discovery is confirmed and the initial file has been written as directed in this discovery step! diff --git a/src/bmm/workflows/generate-project-context/steps/step-02-generate.md b/src/bmm/workflows/generate-project-context/steps/step-02-generate.md new file mode 100644 index 00000000..c2b428c5 --- /dev/null +++ b/src/bmm/workflows/generate-project-context/steps/step-02-generate.md @@ -0,0 +1,318 @@ +# Step 2: Context Rules Generation + +## MANDATORY EXECUTION RULES (READ FIRST): + +- 🛑 NEVER generate content without user input +- ✅ ALWAYS treat this as collaborative discovery between technical peers +- 📋 YOU ARE A FACILITATOR, not a content generator +- 💬 FOCUS on unobvious rules that AI agents need to be reminded of +- 🎯 KEEP CONTENT LEAN - optimize for LLM context efficiency +- ⚠️ ABSOLUTELY NO TIME ESTIMATES - AI development speed has fundamentally changed +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +## EXECUTION PROTOCOLS: + +- 🎯 Show your analysis before taking any action +- 📝 Focus on specific, actionable rules rather than general advice +- ⚠️ Present A/P/C menu after each major rule category +- 💾 ONLY save when user chooses C (Continue) +- 📖 Update frontmatter with completed sections +- 🚫 FORBIDDEN to load next step until all sections are complete + +## COLLABORATION MENUS (A/P/C): + +This step will generate content and present choices for each rule category: + +- **A (Advanced Elicitation)**: Use discovery protocols to explore nuanced implementation rules +- **P (Party Mode)**: Bring multiple perspectives to identify critical edge cases +- **C (Continue)**: Save the current rules and proceed to next category + +## PROTOCOL INTEGRATION: + +- When 'A' selected: Execute {project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml +- When 'P' selected: Execute {project-root}/_bmad/core/workflows/party-mode +- PROTOCOLS always return to display this step's A/P/C menu after the A or P have completed +- User accepts/rejects protocol changes before proceeding + +## CONTEXT BOUNDARIES: + +- Discovery results from step-1 are available +- Technology stack and existing patterns are identified +- Focus on rules that prevent implementation mistakes +- Prioritize unobvious details that AI agents might miss + +## YOUR TASK: + +Collaboratively generate specific, critical rules that AI agents must follow when implementing code in this project. + +## CONTEXT GENERATION SEQUENCE: + +### 1. Technology Stack & Versions + +Document the exact technology stack from discovery: + +**Core Technologies:** +Based on user skill level, present findings: + +**Expert Mode:** +"Technology stack from your architecture and package files: +{{exact_technologies_with_versions}} + +Any critical version constraints I should document for agents?" + +**Intermediate Mode:** +"I found your technology stack: + +**Core Technologies:** +{{main_technologies_with_versions}} + +**Key Dependencies:** +{{important_dependencies_with_versions}} + +Are there any version constraints or compatibility notes agents should know about?" + +**Beginner Mode:** +"Here are the technologies you're using: + +**Main Technologies:** +{{friendly_description_of_tech_stack}} + +**Important Notes:** +{{key_things_agents_need_to_know_about_versions}} + +Should I document any special version rules or compatibility requirements?" + +### 2. Language-Specific Rules + +Focus on unobvious language patterns agents might miss: + +**TypeScript/JavaScript Rules:** +"Based on your codebase, I notice some specific patterns: + +**Configuration Requirements:** +{{typescript_config_rules}} + +**Import/Export Patterns:** +{{import_export_conventions}} + +**Error Handling Patterns:** +{{error_handling_requirements}} + +Are these patterns correct? Any other language-specific rules agents should follow?" + +**Python/Ruby/Other Language Rules:** +Adapt to the actual language in use with similar focused questions. + +### 3. Framework-Specific Rules + +Document framework-specific patterns: + +**React Rules (if applicable):** +"For React development, I see these patterns: + +**Hooks Usage:** +{{hooks_usage_patterns}} + +**Component Structure:** +{{component_organization_rules}} + +**State Management:** +{{state_management_patterns}} + +**Performance Rules:** +{{performance_optimization_requirements}} + +Should I add any other React-specific rules?" + +**Other Framework Rules:** +Adapt for Vue, Angular, Next.js, Express, etc. + +### 4. Testing Rules + +Focus on testing patterns that ensure consistency: + +**Test Structure Rules:** +"Your testing setup shows these patterns: + +**Test Organization:** +{{test_file_organization}} + +**Mock Usage:** +{{mock_patterns_and_conventions}} + +**Test Coverage Requirements:** +{{coverage_expectations}} + +**Integration vs Unit Test Rules:** +{{test_boundary_patterns}} + +Are there testing rules agents should always follow?" + +### 5. Code Quality & Style Rules + +Document critical style and quality rules: + +**Linting/Formatting:** +"Your code style configuration requires: + +**ESLint/Prettier Rules:** +{{specific_linting_rules}} + +**Code Organization:** +{{file_and_folder_structure_rules}} + +**Naming Conventions:** +{{naming_patterns_agents_must_follow}} + +**Documentation Requirements:** +{{comment_and_documentation_patterns}} + +Any additional code quality rules?" + +### 6. Development Workflow Rules + +Document workflow patterns that affect implementation: + +**Git/Repository Rules:** +"Your project uses these patterns: + +**Branch Naming:** +{{branch_naming_conventions}} + +**Commit Message Format:** +{{commit_message_patterns}} + +**PR Requirements:** +{{pull_request_checklist}} + +**Deployment Patterns:** +{{deployment_considerations}} + +Should I document any other workflow rules?" + +### 7. Critical Don't-Miss Rules + +Identify rules that prevent common mistakes: + +**Anti-Patterns to Avoid:** +"Based on your codebase, here are critical things agents must NOT do: + +{{critical_anti_patterns_with_examples}} + +**Edge Cases:** +{{specific_edge_cases_agents_should_handle}} + +**Security Rules:** +{{security_considerations_agents_must_follow}} + +**Performance Gotchas:** +{{performance_patterns_to_avoid}} + +Are there other 'gotchas' agents should know about?" + +### 8. Generate Context Content + +For each category, prepare lean content for the project context file: + +#### Content Structure: + +```markdown +## Technology Stack & Versions + +{{concise_technology_list_with_exact_versions}} + +## Critical Implementation Rules + +### Language-Specific Rules + +{{bullet_points_of_critical_language_rules}} + +### Framework-Specific Rules + +{{bullet_points_of_framework_patterns}} + +### Testing Rules + +{{bullet_points_of_testing_requirements}} + +### Code Quality & Style Rules + +{{bullet_points_of_style_and_quality_rules}} + +### Development Workflow Rules + +{{bullet_points_of_workflow_patterns}} + +### Critical Don't-Miss Rules + +{{bullet_points_of_anti_patterns_and_edge_cases}} +``` + +### 9. Present Content and Menu + +After each category, show the generated rules and present choices: + +"I've drafted the {{category_name}} rules for your project context. + +**Here's what I'll add:** + +[Show the complete markdown content for this category] + +**What would you like to do?** +[A] Advanced Elicitation - Explore nuanced rules for this category +[P] Party Mode - Review from different implementation perspectives +[C] Continue - Save these rules and move to next category" + +### 10. Handle Menu Selection + +#### If 'A' (Advanced Elicitation): + +- Execute advanced-elicitation.xml with current category rules +- Process enhanced rules that come back +- Ask user: "Accept these enhanced rules for {{category}}? (y/n)" +- If yes: Update content, then return to A/P/C menu +- If no: Keep original content, then return to A/P/C menu + +#### If 'P' (Party Mode): + +- Execute party-mode workflow with category rules context +- Process collaborative insights on implementation patterns +- Ask user: "Accept these changes to {{category}} rules? (y/n)" +- If yes: Update content, then return to A/P/C menu +- If no: Keep original content, then return to A/P/C menu + +#### If 'C' (Continue): + +- Save the current category content to project context file +- Update frontmatter: `sections_completed: [...]` +- Proceed to next category or step-03 if complete + +## APPEND TO PROJECT CONTEXT: + +When user selects 'C' for a category, append the content directly to `{output_folder}/project-context.md` using the structure from step 8. + +## SUCCESS METRICS: + +✅ All critical technology versions accurately documented +✅ Language-specific rules cover unobvious patterns +✅ Framework rules capture project-specific conventions +✅ Testing rules ensure consistent test quality +✅ Code quality rules maintain project standards +✅ Workflow rules prevent implementation conflicts +✅ Content is lean and optimized for LLM context +✅ A/P/C menu presented and handled correctly for each category + +## FAILURE MODES: + +❌ Including obvious rules that agents already know +❌ Making content too verbose for LLM context efficiency +❌ Missing critical anti-patterns or edge cases +❌ Not getting user validation for each rule category +❌ Not documenting exact versions and configurations +❌ Not presenting A/P/C menu after content generation + +## NEXT STEP: + +After completing all rule categories and user selects 'C' for the final category, load `./step-03-complete.md` to finalize the project context file. + +Remember: Do NOT proceed to step-03 until all categories are complete and user explicitly selects 'C' for each! diff --git a/src/bmm/workflows/generate-project-context/steps/step-03-complete.md b/src/bmm/workflows/generate-project-context/steps/step-03-complete.md new file mode 100644 index 00000000..85dd4db7 --- /dev/null +++ b/src/bmm/workflows/generate-project-context/steps/step-03-complete.md @@ -0,0 +1,278 @@ +# Step 3: Context Completion & Finalization + +## MANDATORY EXECUTION RULES (READ FIRST): + +- 🛑 NEVER generate content without user input +- ✅ ALWAYS treat this as collaborative completion between technical peers +- 📋 YOU ARE A FACILITATOR, not a content generator +- 💬 FOCUS on finalizing a lean, LLM-optimized project context +- 🎯 ENSURE all critical rules are captured and actionable +- ⚠️ ABSOLUTELY NO TIME ESTIMATES - AI development speed has fundamentally changed +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +## EXECUTION PROTOCOLS: + +- 🎯 Show your analysis before taking any action +- 📝 Review and optimize content for LLM context efficiency +- 📖 Update frontmatter with completion status +- 🚫 NO MORE STEPS - this is the final step + +## CONTEXT BOUNDARIES: + +- All rule categories from step-2 are complete +- Technology stack and versions are documented +- Focus on final review, optimization, and completion +- Ensure the context file is ready for AI agent consumption + +## YOUR TASK: + +Complete the project context file, optimize it for LLM efficiency, and provide guidance for usage and maintenance. + +## COMPLETION SEQUENCE: + +### 1. Review Complete Context File + +Read the entire project context file and analyze: + +**Content Analysis:** + +- Total length and readability for LLMs +- Clarity and specificity of rules +- Coverage of all critical areas +- Actionability of each rule + +**Structure Analysis:** + +- Logical organization of sections +- Consistency of formatting +- Absence of redundant or obvious information +- Optimization for quick scanning + +### 2. Optimize for LLM Context + +Ensure the file is lean and efficient: + +**Content Optimization:** + +- Remove any redundant rules or obvious information +- Combine related rules into concise bullet points +- Use specific, actionable language +- Ensure each rule provides unique value + +**Formatting Optimization:** + +- Use consistent markdown formatting +- Implement clear section hierarchy +- Ensure scannability with strategic use of bolding +- Maintain readability while maximizing information density + +### 3. Final Content Structure + +Ensure the final structure follows this optimized format: + +```markdown +# Project Context for AI Agents + +_This file contains critical rules and patterns that AI agents must follow when implementing code in this project. Focus on unobvious details that agents might otherwise miss._ + +--- + +## Technology Stack & Versions + +{{concise_technology_list}} + +## Critical Implementation Rules + +### Language-Specific Rules + +{{specific_language_rules}} + +### Framework-Specific Rules + +{{framework_patterns}} + +### Testing Rules + +{{testing_requirements}} + +### Code Quality & Style Rules + +{{style_and_quality_patterns}} + +### Development Workflow Rules + +{{workflow_patterns}} + +### Critical Don't-Miss Rules + +{{anti_patterns_and_edge_cases}} + +--- + +## Usage Guidelines + +**For AI Agents:** + +- Read this file before implementing any code +- Follow ALL rules exactly as documented +- When in doubt, prefer the more restrictive option +- Update this file if new patterns emerge + +**For Humans:** + +- Keep this file lean and focused on agent needs +- Update when technology stack changes +- Review quarterly for outdated rules +- Remove rules that become obvious over time + +Last Updated: {{date}} +``` + +### 4. Present Completion Summary + +Based on user skill level, present the completion: + +**Expert Mode:** +"Project context complete. Optimized for LLM consumption with {{rule_count}} critical rules across {{section_count}} sections. + +File saved to: `{output_folder}/project-context.md` + +Ready for AI agent integration." + +**Intermediate Mode:** +"Your project context is complete and optimized for AI agents! + +**What we created:** + +- {{rule_count}} critical implementation rules +- Technology stack with exact versions +- Framework-specific patterns and conventions +- Testing and quality guidelines +- Workflow and anti-pattern rules + +**Key benefits:** + +- AI agents will implement consistently with your standards +- Reduced context switching and implementation errors +- Clear guidance for unobvious project requirements + +**Next steps:** + +- AI agents should read this file before implementing +- Update as your project evolves +- Review periodically for optimization" + +**Beginner Mode:** +"Excellent! Your project context guide is ready! 🎉 + +**What this does:** +Think of this as a 'rules of the road' guide for AI agents working on your project. It ensures they all follow the same patterns and avoid common mistakes. + +**What's included:** + +- Exact technology versions to use +- Critical coding rules they might miss +- Testing and quality standards +- Workflow patterns to follow + +**How AI agents use it:** +They read this file before writing any code, ensuring everything they create follows your project's standards perfectly. + +Your project context is saved and ready to help agents implement consistently!" + +### 5. Final File Updates + +Update the project context file with completion information: + +**Frontmatter Update:** + +```yaml +--- +project_name: '{{project_name}}' +user_name: '{{user_name}}' +date: '{{date}}' +sections_completed: + ['technology_stack', 'language_rules', 'framework_rules', 'testing_rules', 'quality_rules', 'workflow_rules', 'anti_patterns'] +status: 'complete' +rule_count: { { total_rules } } +optimized_for_llm: true +--- +``` + +**Add Usage Section:** +Append the usage guidelines from step 3 to complete the document. + +### 6. Completion Validation + +Final checks before completion: + +**Content Validation:** +✅ All critical technology versions documented +✅ Language-specific rules are specific and actionable +✅ Framework rules cover project conventions +✅ Testing rules ensure consistency +✅ Code quality rules maintain standards +✅ Workflow rules prevent conflicts +✅ Anti-pattern rules prevent common mistakes + +**Format Validation:** +✅ Content is lean and optimized for LLMs +✅ Structure is logical and scannable +✅ No redundant or obvious information +✅ Consistent formatting throughout + +### 7. Completion Message + +Present final completion to user: + +"✅ **Project Context Generation Complete!** + +Your optimized project context file is ready at: +`{output_folder}/project-context.md` + +**📊 Context Summary:** + +- {{rule_count}} critical rules for AI agents +- {{section_count}} comprehensive sections +- Optimized for LLM context efficiency +- Ready for immediate agent integration + +**🎯 Key Benefits:** + +- Consistent implementation across all AI agents +- Reduced common mistakes and edge cases +- Clear guidance for project-specific patterns +- Minimal LLM context usage + +**📋 Next Steps:** + +1. AI agents will automatically read this file when implementing +2. Update this file when your technology stack or patterns evolve +3. Review quarterly to optimize and remove outdated rules + +Your project context will help ensure high-quality, consistent implementation across all development work. Great work capturing your project's critical implementation requirements!" + +## SUCCESS METRICS: + +✅ Complete project context file with all critical rules +✅ Content optimized for LLM context efficiency +✅ All technology versions and patterns documented +✅ File structure is logical and scannable +✅ Usage guidelines included for agents and humans +✅ Frontmatter properly updated with completion status +✅ User provided with clear next steps and benefits + +## FAILURE MODES: + +❌ Final content is too verbose for LLM consumption +❌ Missing critical implementation rules or patterns +❌ Not optimizing content for agent readability +❌ Not providing clear usage guidelines +❌ Frontmatter not properly updated +❌ Not validating file completion before ending + +## WORKFLOW COMPLETE: + +This is the final step of the Generate Project Context workflow. The user now has a comprehensive, optimized project context file that will ensure consistent, high-quality implementation across all AI agents working on the project. + +The project context file serves as the critical "rules of the road" that agents need to implement code consistently with the project's standards and patterns. diff --git a/src/bmm/workflows/generate-project-context/workflow.md b/src/bmm/workflows/generate-project-context/workflow.md new file mode 100644 index 00000000..3f626d65 --- /dev/null +++ b/src/bmm/workflows/generate-project-context/workflow.md @@ -0,0 +1,49 @@ +--- +name: generate-project-context +description: Creates a concise project-context.md file with critical rules and patterns that AI agents must follow when implementing code. Optimized for LLM context efficiency. +--- + +# Generate Project Context Workflow + +**Goal:** Create a concise, optimized `project-context.md` file containing critical rules, patterns, and guidelines that AI agents must follow when implementing code. This file focuses on unobvious details that LLMs need to be reminded of. + +**Your Role:** You are a technical facilitator working with a peer to capture the essential implementation rules that will ensure consistent, high-quality code generation across all AI agents working on the project. + +--- + +## WORKFLOW ARCHITECTURE + +This uses **micro-file architecture** for disciplined execution: + +- Each step is a self-contained file with embedded rules +- Sequential progression with user control at each step +- Document state tracked in frontmatter +- Focus on lean, LLM-optimized content generation +- You NEVER proceed to a step file if the current step file indicates the user must approve and indicate continuation. + +--- + +## INITIALIZATION + +### Configuration Loading + +Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve: + +- `project_name`, `output_folder`, `user_name` +- `communication_language`, `document_output_language`, `user_skill_level` +- `date` as system-generated current datetime +- ✅ YOU MUST ALWAYS SPEAK OUTPUT In your Agent communication style with the config `{communication_language}` + +### Paths + +- `installed_path` = `{project-root}/_bmad/bmm/workflows/generate-project-context` +- `template_path` = `{installed_path}/project-context-template.md` +- `output_file` = `{output_folder}/project-context.md` + +--- + +## EXECUTION + +Load and execute `steps/step-01-discover.md` to begin the workflow. + +**Note:** Input document discovery and initialization protocols are handled in step-01-discover.md. From 9c0314732e80f4de10c17dd048de3dcb8f10f017 Mon Sep 17 00:00:00 2001 From: sjennings Date: Sat, 31 Jan 2026 16:55:11 -0600 Subject: [PATCH 02/13] docs(bmgd): refactor documentation using Diataxis principles (#1502) Apply Diataxis documentation framework to BMGD docs: game-types.md: - Convert to Reference format (austere, consistent structure) - Add Examples field to all 24 game types - Remove redundant Overview, GDD Section Mapping, Next Steps - Condense Hybrid Game Types to reference table - Remove Tags (no functional purpose for human readers) quick-flow-workflows.md: - Convert to How-to guide format - Remove conceptual content (Step-File Architecture, Integration) - Remove tutorial content (Examples section) - Cut redundant Reference tables (steps already in how-to) - Merge Self-Check and Adversarial Review into Validation Criteria index.md: - Fix broken link to Quick-Flow documentation Both main files: - Apply prose editorial fixes for clarity - Reduce word count while preserving comprehension Co-authored-by: Scott Jennings --- docs/bmgd/bmgd-logo.png | Bin 0 -> 128705 bytes docs/bmgd/game-types.md | 374 ++++++++++++++++++++++++++++++ docs/bmgd/index.md | 113 +++++++++ docs/bmgd/quick-flow-workflows.md | 160 +++++++++++++ docs/bmgd/workflow.jpg | Bin 0 -> 120610 bytes 5 files changed, 647 insertions(+) create mode 100644 docs/bmgd/bmgd-logo.png create mode 100644 docs/bmgd/game-types.md create mode 100644 docs/bmgd/index.md create mode 100644 docs/bmgd/quick-flow-workflows.md create mode 100644 docs/bmgd/workflow.jpg diff --git a/docs/bmgd/bmgd-logo.png b/docs/bmgd/bmgd-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8dcdd125445c842d1c86794ab644c07cb150a87f GIT binary patch literal 128705 zcma&M1za4pJZNx-ARp(RtM7Z~-G9%o zyQ-_!TDxoSvgw&nCBFmUtt{45;A`!yo^T<$#qcU6@V1#6fk zJbJ&Wu+WyVR8Rn;f6v2#!GL3cLH+@G|A2wxgF*i-4+f?QPVmpXAvo>dG4Gn-tYCjA zW4)i2kw7r0zvKPh(?1UB_w!xp&r})cWnpJ;;^yc=s_f!O$`0THu)fzp7J>iEW)Z|c zG{DV^ApemEn|;TDEo8FBzbEic(mJkSV2B_7IKjbk@^IhFuz~8@ZrTd+yk?H}026aZ zQwxBXz0)5oFn%xI_pH5zn+d6xy`6(Aua^M%-w?d-`9F%8$w~hPakCX5*H%y_6?1g4 zAms$G09eQc5lBf%`CZH{c~!+F|4x6u6Ck&Cb93TlX7=>-1bDIo99^uKS$TMPm|57E z+1Qxg5lpV$4sIr1Ob)ITe~SD=N8G~I%mwJ=26S{F{X^Hp)Y08dfSmjfL;pPfe9nLQ zOWnf6{y%Iw{nM3z_Xab+w~v_>z{2ccVsGKM`gbS&jcxKL`+p<3 z0WJU4+W%nvQS&#W{~OK13-}kbKWhG@{mr+3HktoFo64&OG`BD_aS=ChGtsngaeeod zAUi+ve+T``iGQJ}N0|V zjKP2T)$P6W{@X3U+|kV4-on9+$;ri$$@R}j15AMqCNAE8W&ID)|7!WqASv6KxLG>7 z*bCa5m?^3KmEixt{=aIwIGS0wy2^+Pa&mm+V*M}T{{;V6^?&qnw!c#R2jIUd{n;*2 zcc7iQAooXhZp)7!|4Q@Uq5oA^#{4~CKue&7iy+TO7A_7p5f-M8A}nl79PBLYOx!%; zEKF=%oRZ=qVq6lE9Dms-|4rto3Hz^tq9(2ul0Z9)KPE{* zQ+q3OCOb!~zZ~-af&Q=BYSxY}Zqg>M*8gT#w@gJ!FA)xTSNSeRT#qaa6g&-RX8z&PBD-#=w zIx9CX>qlPJ_ghY0miM6lA@d*Df7AJ6x!_f`aCNkE|6|_OZ~(dqzW4Y4t@wYklw5%C zz3kh{}ZqCFEfH%Y%K2wGwUDMzf=Fc`hQZj|8MHQSN|LJk2Q_=Z=Tf= z2fj~je_OEFSUCBa|JR!Tm8tzNCi}<#VE$Xp-PHsx=n@B0)%g!fSV zW6vXqaOSPq0|q7xCL=DQ?gd`gzmiDxJ^uh_YW;d&vs=^B;`H~BDV7dpZi%?cx=lMr z|2@(eZYi=CKg{z9&KrEdO)5Af3_p7W^00l^DG)cM=c6udvxH1qmsWC}zfntv{&@h! z^W*DmbQf1^j1At!#CX&Pt4I3-&j71<*J0x)bu{tdZWbhO7p0*pbpVYF==>gDW+5$# zMWaMqCT(n^Pbjj;Gj>lAaGLNXglCr3sMhe!-)bfg<@QkIV`Rk4>kdRU2G z|4kBbW8!iiYrG3wT|@FQa7vXCF3CDT+ahBg%&gFfcj9BcWVFKw}hB zfpnzDE#MQCDZ^nVGaLq69nVE$#09X@30H@$<)cn-{Y*;ZlVh0k@F^0KKynsRVWkV6 z-+o>pLYpswBZcWuoAXl4`XHTQap8u`w1O=OL+3)GTbdFM;XD)n`4q}3I`YC&N-Y}42QmdX7-h!fTnfkaS=asldczQjmFHa z2o=qQQOPoP9v24Gjd@r@+CZ=Ojw47v69lM{YMe4V7l0>IoaK|#*Vk1;n%w6Zl158X z1s#6{R*cWqrI=ubF#%$!I!i~v$>QahH}bi@{Jf$eryCu!q++QemJI*0!)^v*!X&Nk z>@N8Z4;i|{qe>n5MP_XyTsROr8NC|U6cAMcExL1d>f_12r2bf(u z=r~WATj^^9(z$(S6EwolI=Acz{4Nkoh%hKuY)o2c2^@mvwP`IVihwc30Sk6=m@L1d zOHz99Tni3arVTTc?%=8-6F#K?4~2B15u-|S$kaAH!LH$FR^Valv68$8b%6$J1KUCNsfJv-jWrr!iQ-^V@xla0ss2lGK zEvsZ-+PEbTY|?As&4jic#dr~4S(3$M{`Etz3H92wF$%>MAzgN#^iOa88rtZV-b{RG zMnsz&d2Fz+6D+&N2>WnpHT2>AE9*B}2q`eQr2IceH{1+VOq#qu0y>knjib0VY7&^(5^x|dvLq6^$J8kaTBFv2tLbWn@TiA-vr* zMw<|w?C5h*ows{@k7bHK2Xy9!^^1r4z&>Q(gywzDoh#N{JqQAsg99k!=x%CQJ>?Im zRhLvHWsnP5Pi2Ke`#A`T598p1 zNLH$ahM$2^DREc1DX2a!W3-YAsem8EXm)H>5VkO=<>1<9$)j;Vq!h|c{vwx=dati6 z8N7qH!TT9jN#-D$?IMEPiaj!BgAWc;e66hh0SUhq*(baiP31RZfh1OxH#}#SY!;px zRXV8Jk#~zOG-)o{9E0MvX^QM=8l_JIMJZJ7^s5>ao|++3Xu#s}O-{Z;X)edA3eh}9zsp&g?8}DLj)%SC@PFz*1r5WK` z_Dj3cmGSWhto9l&$tIR)_!bw>V8IylcDQ5=EXHPf2Jd*it02Z9>0|PI5%y?=vI{*i za($l}W(l~QB{WFOXd+?@0vEa^JsD|Kg>e`LRMu!3sAl)rbxC)BZCet;K zH%jGYv@~@kuCP^%1sSz0Gp~p%4_a6GT~iAom)*cbD1if2{11}GdMTZO?etD z{@d%!qfD|1rgEt=4-+UIA_Vs{`_*IuTL9+;S3|$6ahu1k_$v5yRxDyEX|Q^S;AwL zr30ah$*ak7g(o0&G=FI0su+uby*vBy(bc(xaPdxPMF4LmZchGNZMv#5qcOEG9i)u_ zWR(j$GbAA{k*`Yk7P@zi%QOd-9BwsunwjtpKY(Py`yNBBEzuq5cCQO(-mlF~%0_BB zG1S-ZtWHZ=$l+vR=|YigfvL%|ViYlt0rweA2SUVo;8Htm9vU_Nz_#5@#9 zoGcSP21n7pAP!tzPKkG_B6t3$ zLMX+wX)D?#a8yn;lD<>~yp4i7ieJ7p^lVh-8=KmpH`b)80BfA=rJI}vjl|{K)XSYY0?6cG_D>4J!w?fxl0_VG zZif6`m)%G{+6|&rtc@uXKv5NxiZHg&THzOpMn<{{#n--!r;EBDg!sWj7Ty;Y6Hjii z3MNbE#Wi=OML0CS!e>{L!=L279C*xP#*B{bXq(*+{g}Q{B@~O@_qAukMYR+yYH6;* zj_Fe?2FI^RCsl**Q)KD(!kn^eQMGao8)(I#2QBI;`3=_q$xP-h%z2pl%iFX))nZQZ z`~%%+)93e6yjRtoARjHDP@#D$kPfyic__={s1qR{_ZRo96{gm6w^D;v63CDQi|Klv zX+sg&Y}``wBxbXpP=?7 zy?G}LU$IcpAhq_1s?U@hPIigD|B3iFejh2^)J=kU51bQknSKJP8n@D95V?Eaw1v89 z>XCxZnIW0AR*7Q&vS45BT{=!C_E;{T&3Zn&nc4#1WO=}k;$bp9@)b2sblU)=M6{S% z=pjT#28rSzul4%MEopUHMf3t`oPmC3Nvu>)HG`=wvFp{;_CQFmG8S=^#^Rrr;mKm2 zWy`jT1(nQl6yhl|lDP6m8mIG36gfjGJJUSN+Dcy1lV#o3P-{i^_PQOd~kJreauW2hauzDE9hm*+lD#E z778n-z0kucM$k#^SujNp$dP>uroF4ChvgAM*?em9Mv&^%?82>%ZYhIV_HRBE4qjsl zq>6a?6NZ6{k7L-T)7jG%#9&9^@+r7unEFSGVq&eH{@i$>xhHnyw@(-9oqxTpM0MZ? za6FYO7H=>w?Osk?-7r4#C7xBAiULy3zo0c!y+Io>^CLe76pg^7Tg0#gpBZent zyB$vjqerS#+&`y=2Ey5;TQH_LB;Gt8UAciItn$7;!TPU7a}Nq~~CQYJ0S7ELU2Y zv}FLnG4y@;>7J55g^|KyfX;=nlGC+yaayQiZHK4_xRu>gW6ucceMn-& za)MSAcEWVDoZ9Wms2eN{t!&5|PQ#FQc3WmLjM>8}pM4WAWwNc9AjjG8{Sm|(a}!}o)CQM^wa_|Eq2vwzk_1L@H7SoQa&{~FL6hGh$6JyYIS?$F zkT1`!lGyyJNdTxRJX<{n;S%2nMKY3Qkk0ubD(?`mm~?zHN-nQpUl3>nO*_Dt1!0HQ zvFHwpCd?W=uAMh77=}WvOnBs%y>+5eL>C#@l-|wkfwcR1bs5sVm3-t)g9yx$TfQdW z(NNP*|MIlby+#bD=q;UdbQkPdf82VV@n~I6oV;OL{Ia;5;q*Jx{QQgA)c0J2>n9NL{%rDWVZgT{gX~rKj8b_eSX+&5UK^ zvZAa~Z~0#3`tL-pZ}>8;1RkkD0y{+Yx{xNuuvakHvhfPazCOy}q% zTdt@i62whVEeuIIFQe_Ec%CoR2@&G>)rFhV2?)nJp=Sww>ZTV}J>p&UAmO+P1#f_3yT=2n8UQSmb9e7pxV zGZ+u&LnDh!)b+ulFv~J`l)WNgb(vtp2+{AV9kjiYLPGDp(EXH7z`@hRd zkN^0LIJ@l#yH{dR3Xj^F2j9=``=Z?5M!H(pFn zw=H>2%|eRk5T@GO76xLc$|*7WG=+0Y2%YuL0AELi3zml_6zTiZ@Xd;qCA8-s3v|0x ziv^B&%tQ#WL3_8f8k(=AaoeWsqKrIlJxC?&vc1lrdZ}DyqMA?c9><5ls~hFn&G^?m zOx&`=iyEFuzBpr?GN9(?MhO2cO{;R#cn#}t8td=Y$}f>8bK7;){s`lw>hJGk8rM}SGdmEH0g;!eQdtgf;ivWsqCmoFe!8HpUh(Z5EmosTDEIwU9h0Djm>m zqvpb1levgS671u=7rxzI0WCiOt}sbf8Q+ytCgU~INIxJAX>#+p=J^m9g9rdPrQq&5 zK@Mtnv|I~T;I@<0jXxQ&YvvQc0 z+C`{A57Zko70yuE78B>#U}_Fc3+u(zkfWLTp-tLH^kpUtEoc`ku->n$))BC{jAp(W!@uQZ25smI~NGP0?yYR>7nO&uQ?a204R$U+Kk( zU_Ld;iKVxonQ9vOD%X}aY!j?we*iLp!2Yku)P2=zkRrV`@tW1@RRf;qkr5@kc zXb5gV4)V74E}t?Z96$LecC5VGhpjWxMdLZpWi?ox>hw#=E$15b+DbT5+v6*x#njH0 z>-|djhE@Btm``prK2g80{l(dMOf=ZrXDMS^8?MN_%G>TqfA2UGACU&`%%QO!%#wE9P5M<9 zGe1)GVEb}($H@QsYs1n0(QfZbAl|)RoT|?3*BwdqexJSV^fdx5O}TSJJ3l|Z)s&$w0(%K4s07!#59OF!5Oz7&z@=Tpq9I+Y1P~R27imbfnhnz6YN%OC6 z1WBwx4^*EB)2aw3tDMw1EF;iB*{F~eatvF?$<-0&jMfh(-R#wN-WZQ{Y6#pQBCBE9 zeqG&Ri8$7KMCLxa9p#Sg$4K#rc9g+l0xvpj7g>C=z@Y*CBN$-lCP?S zsIvZ$UcKQ?Df{4wzvSjB^>DEyHro1o3Nd{wS?rqc;Fz;op))LAw5@n_kLDMNpU?fS z?aSwv`K1{*2MRoSJ+C40$h^X)w7HPFG!7&;Hr41mu2$`7f@QaC!2}g- zW@=alAHiT7_lJ*7=CfF6q)R`@tZHgk5Kk*+cJ<+PVaZ_o)=OJ3vMaVqjP@+Jh8D;V zd`Q805GH!S$+c<2=8G+v=92a~e9=mlCcddqHtmNE{2a$!I|adQDw1)qlO? zt!3m$AA-=9s(~FhLqwpt7ol7&p6TPxz|P}c&SiC2q&;;4z$#KX)S-t12tsEuqz&OV z?VqWeTTR0*=2KLK3y4$t2P}6DAQ_CYg%RMh-MX0YC88iSI0W^x!Q{lO5yNp2nQC&B zlVrF|QAK>&&+13>VN>_+jEI@f^3I4h)OaWMN0SjYBc)9V9g`*Fm+rpcoW1NzUU9u$ z9L?MUJqRDlsnE$HBoIAUz@!&yCsnxInARL+x^}Q?!_JEBCNW@AY5bTs!W8fU8Sp>0 zx%vUMS%5@bsD|5n#<*N+5hqHgpi5GP#rRioLYmz6i_2P?iq|WK1sYUEVqWgG_7@xZ zEAqI?_}8ViUnKs`KCgzCnOvc{zuE(U)U+8PA=nu@6~!8+{u5**Kgb?DowcECboWVF zMg1T7>y3&ZTrkD9Wz-LvjCd5pOk zd7OquV__RpGA)EWlEGX%!`B6s(34)Ce9hH|iCq1EST&;z|!FlX*gwIEz>_=S_;ybe4GU z6Xov>b&m@+KIHTAH**N7*0v->Ss16f2D!#)@$GT9dwOmwyHHC+C}Ic@gqJ4oQj|vupbJCQhdR{>!TzLO^FTi5}pjNqm(_x zjRVd2bUn>v9&B<8IPZsdKR&AXdqusJ;D0&l?|l#S>%}m^_8j1zxlt2;!dx3Kk>!KD z%*g7igTyJE%F!EkG@?EAB|qNI_yjpNO*iIFn>IqMvpVvSY&S{i0ElTW0~~Mipcye> ztSdy`iCUt0sxOu+(eClkF(5Rb+*08&^>S{P7zzW|*r8<{m8nM4%u2MJL#LL( zk{ObuKa8|bgkQdl)KGO~M)8pk;nQQ?8fLWyscx}+#-Kw|kwT;Bs7ByT!akhhHf_?= zapeI!TtQBh?*n;KT&(tNeNYBMDQp+0>6;I-) z%a^kCh7N7JB(GN+Qk|SRCPc-pFKbNP5GXV@kDL4QnFW=~JL57Naie#6VktMIXjX>i zYsp#U&aQUvJ51m1HHwKzE~A2g7wzXUx$D;0R0;A^MkxGjg3PnmW1IW$T5>{9ZMT%m zE6iuoyXfCUR7{(!%fRS094(x!U4M$DAtxuZ3W}4z|F#=$-7Y*s2YIWiUJcFeI*p6t zOUwF#Gfbs@)zzXoW>Ogytj37HG4_!!-$RSY${iRhqiVT0x&cZPn_1<^vQuRSY1Vdg z=95-}O*j~{2Cp)w$=+69Eo0Vz?Yae$WBV>IWKz#?Fbepzb$&J$^1*y(APx2eK zmL4$(G!#fK{sI^+a#GWK^${&`iqYy7S^e1GIS{2;;Zcnk+5DdLtfaVL)Nv-gq1z>} z3S3R=$DEwG(+mD+ z?=B=9t0&dX(s-njLcS_mp1pT^EVKhtaqDvBkzP^f;dG;NYfe2$I1e>;79 z8kSO0HoF;B_V7KPimHoqQ_5K$$<5Tl=D!K!d%~2j(2|p(`oV7WGWWLh{f;>6m+Ti> zj^J=fbquph$G4Zj=Lw;JjGBU*CPO!yx_zIrVTede7GH^`Gf1hpvUCI^39Op+w=1K! z)(KyL9Aix+8W@hSL=3PYF;23r*I#Wl&K1ZOdqi+DVG+sE!S$-(is zv{8q`>a~~SP{kw1z)S00YiIYDN!x?{JEqg3)bWk4s>^&HrqPO8#hNc9Z+E47 zw$nM^ny0}aO5w-+^o%-zX{weZKf9;(b(+$9R^55#Er&`!Z?Vhh>5ImC(32<3yz&f` z9gVK1v%|`6dYf(kI0}CZ2kL6a5x1hwNS^OrqizUnJ|9)iBocrB-7X+gOpIv*AL(6` zP*qEoq#BIZG?e$@Wb3WLGqo1jByO&3TmWFm{UWE12lGYXDaT-KKvw2x?&>QACt=j0 zoJM0?oMJa4ikBNy9#@0p?c{j#(F={?kImB?hacWvN2^zrI1ZcL{U94_2=>#9Jw2_| zZ=6KNZQ86su)Zn?*@evkt@SEveo!wAFXa=(q3j2Sf)}AAM$!x_AS)b}b>rltCnwFP zf}-c-1z-$ZF-B2Km6?UulM8E2n%wQy$qHmIcBKx!<8?jqDK?}Tyu9lbQjFUbdL^x` zA*ARGzrT!*9Xe80)0CZd!^ov{lhxbwAf(zfh&7*SNTUk!$)aTF=O{aD;Pb3iJaPUT zL?Jkf0_2Pzr3ss=Y3XDEPbviY*>*gq@Gpzi7zMmL)^ZQ81O)U$Z`YpsPUdD>%|O{h zQn`IHvBk^e`RbL`XtUl!B}O5`?ttsdc)h921^_d&<6YZrOI`<>Tx@knkrr5S5QRt; zx`>#1&UdWAJ7qRpcq0tkiTt*%S|nud`>=Eo-cTFg-xCkJhTFb4#QdvBtJ^N6OFVvF z#o9;|Wy(kiga(Jyoo`E?3C}Y^`u$hd0`Z4NKS#(&CKw>?FT%%7TC{pa3=1N`92ptQ zQ|NWo1;0F2k-h3i6#txtX-@=XyghQ=t0VUZT) z$~j3YD34@Q+&&Uxq8Ma|EYQ37xYke#QFyyjQ$2ol2`O*U{HY5x!6?E#G0fp^YTKP| zUjO{GwW_r7*p|woQ%lw}+&D&ncG&LVR+d#zY7&Pp(v)0gpNl#AXWqrI|hlW3%bQ~Sx#v$Q_lw8EDIL!Pmb9ZMk_ zS?#9bG>jzxu0|!z7M~STt;ZNSxdyZ?dsGHH8G-geCR$K2?I|b7#fzt5aX539C|=gN zb#pz+%u+<-339_ylyYnpWq zw%bkO3TPxUBliSdQ&R?i$t9{~`jt*JDx3yV6v%A>!Ev;7Yc^cS$dEzygH?cyPrze; z1QaS|Yoyr31=x=@Qrd+V z6piHJN46WU0@;qWNZh9!jXrmFH{(MyxNRxsEq}nVRarHKc^PRg_o%!+Jer*;1Z=LH z*b*D$98|LyQA;M;8w+$uJ}^2f=O-KI-$>MY&+m{|da`N&*%tXl4M%2~{VM}n!D>(_ ztscJm9=2y3*S}fEa2^V$wB!Wn|&v6>`S&rS+Q*MttcZx=8q!GOF3HTPa4Or z7(>#{+`96UFM-#EdAT}ydWaz~?4C6SEVCkTx^Gte16IByg`Wd<&vGpFcm+_r+fX?7 z^)=@ab%?F!aU)u!&FcNbu72J7PT#OO3)`aXnabUY6?F^Kq2lJlc1*}t^2tsXF~rMj8hJb4kBhsfZiigf zJ?d%+2PLI(^af3Qu~HcVqlRcF-`|I36p;A3z#W(DDjqI|B|U*T{c~izcwLQ|WW9Y} z+rV&mOq6#g#Mu&?$D%x3mD1$nP#T}XjP%E8WyC#tAFLR488uCW)+LGb?DP+F^#BI_ zAkpg7u4w{$e(!R-wyu1ypAM}T7r;(Kq}sv#ooN(x@RNypMEvwN6D!qpIPHK4WE=Io;~kepKX4+zEELHO{*L> zHL!KJ^hZmUS&CvOcULRQ6Thiz<)4EQ`mh6aT1FpW&S(=p(LD5vnP{H|t*Q{Wg)mDt z!Bmq-*xwurcPy7DQbbm3L|L|lxJLh&rq(j`TaV`-wuSsJC&6jUnx}Il(8M^H5 zL6f~cW$0I}5H2krcrc=B;$mo+G9Ml2>NI28hvcm8U$^zFRygG;PEaGzE@!PPEuMmB zwSO2Q9s)aI$3i&PE|6Cx7a_q$;VOo7>v;{iJ$=rraqg~8DI-uD$aG-7tI)`ZWt`xR^_~R*F_%rO`#y<7UWF?54X`dM3tc5@vUqugTk6IV>oM@;Tb8+89TI1R zp0E2ZRv5*+3ey>oB}X$s)kYCUjj|3HaNsfR&p{1Np{W6E4gp0;X?t#s*p90eefqT3 z2$uF{tqW&i`SF*kU1pZk$5b)c-=%(Cc)mGbzh3$1;?8q?UKJ<{U8hdxD9~j}Wa%dL zHV6ujh5`616($b2@+MpPVuTfCYI9nn;<6vVx# zhz?`~kK4~|aK8JUPkNoipYAu79CT_a+ccBt(|D-9?O4l2=PZPlexVy%RXyq@nUzb*nX6N&rEXZ4~=KHrpHHVLbevViA7 zY8#DXEQT#v7PnD0K~01L&O+4$mmMl8YgL5qP@Y3K!X>ZciO%+SY53Nfk&pl%&+9r# zpv(O%uhop(3iu#nEoVvl_!-t<(60;`TVJn&ttkQX;PwOaw0gI`$sqQ50_ffPqKl2w z-|`^}i{H4FY|lT1YYPM!2l$-)9IXEA#bD_DbTn%5v_KK(tg)9IJ!aYzwTYM(d6ovmA;rCY+bHCp$iBA&d-d4r(LUUR~Qi`8oF8XvK9uygd4d zcRx3p?<(+ebOv=!=yCoLl)g0Y;Z4t&!1^?hL?FY%nM~h|1i@CAp5a6nq?+04;%*q& z=`r$*S3OpTq06KNPhUDxd*Z?6R&k0woK|V4oj%`#M7u*NKI|pQaTq^rK9g?^WGARJ zWUv|Xfdi-F_%X4JA5d(n;OQMZY2?iWj9VKQFU>9JK5PupcX}g zDXI6A6C$#L^4(G<04mK-tG_H>mUn6aJY`vXvD-&8R%LC^(w8PikJ(n*D^Z_eWKLq> ztlL-&>w+{0FUphI^0n_aS#^t|uyWw1uD5b@sJ@Z8;|Hgxo>KY?a1er}ApYucl6Eda zTkdSF^wg@o+@yI9?^~;;SdFmUSwcNHLYpHV6Lvz|2D&wMMFn}`r`>r2m_tsJ zC#A|1q84_4DsMtiDZJfieQ#*3E;sb&X5$qU5~BNHh;UD$t*>_;aA50u{uaqxP!u^m z(PRp}>u?D~bP8p}W>lA8?st+YyK#H&DEr<6SVdebYdfYceBTNhO~;7lKUQ*mL)A_E zbUn6>lNir@mTiU*K}-l8aKDji6!__BL5YuqN$JLh-K1HxQ{k8?wIA9{a=I0RU3ZXS zFbeL&r^g5|b7#nTKADufk`57VOKzCOSb}Z#srXE6n0nLTpT0s*-mt_z&j{eZP!C~< zG(JFo&8pL24jByeegjPhm*_rNngnreFl-qK`a_3!M@Pwb?pUd}?WKxSrNA za#|Z6jpmW+ahtqs07`PRgQp1ld)e`bWoXS2JwLQg72bdQozHEq87gBE5lXKnY~C^e zNo76-RXs~ZQ=7&^NJ;x`_r-T?E>FLN-Uh)42qmJ51_nL_7R^Z_k0$fHj=|uvrJwZl zYgKy?z)U&+G?r_%#H6}j+9UfFGt9?6B5InrHqJ`iy%uxW4E8{<&*^#_#ux9aA9ZTp z6P^V55-l3ib44n^32`DuoyAjY=HZT3y7sBAs%Qp~W0E{Vv`_|BHIr=pDI5s4pB&ZE zN-4MAv{}}M`$I2QWE&Vkeb`3HUcDPl5xe;qit~E+<{e1I=(#ec8N#?Ixn>YAq*Pcr zBE3p)42{=pIcbFi#MjG-_&O!JZ%Z8#HV{@d6ruaa2^){6#h9zI?n; zdAHHm`MjU~c>c-tvj+bBWKPFQ&*~{$ zK7#=Fdi7l^yKv-TH4+fObT<0f9w(xGVd^o4#zMZ!)fKVQc5 zGn9VhobW7?IMUW#>!K*dOl0JPqA%g1g{3kzd)1didW|F`^_kz=S7aZMt8Yd<^TIr9 z+3lN4SO_fh6*9>iAtn27Dexv+n;S3-1pTcYZ2Sxg)uLFX%Ze+;fy+y~98+S2!5ATM zmM**}PKYV}y_KE-d4B)pQxitr8(&JSd&kwzbe1X_K6319MKDvTmbO4*OnlEz%%)1e z8#mvcPmK%?#oL<}$_lJWJ~dO*vSr7Cc3j8`aF29h*fXI%m+i@gITAKR zdDjLRW~~IgRd5s*Zq*2QM)TlMx2tH}j~~6vWx|q#EO7F#f+dKcUMriW0AHJY5(phHDSrTenP!k6b(ME+#M#o zE#8*AGfeyZ$_(HS=y_uP^e9^{Pl6R*!baPUaa^Q=obEYup2P@`;n2!+9L{nWj5`Mz z9qq{_qiq;Uf!B&MrYaKnwz0xxB=B@E^c0rA1e{4VX_M5z@cPO@oC8(+?C zfzYIB`M6h}8cT!1>~K6SO5I0^UmAJk&e5eM6~)#oijFS31saH~rA7M9WtmUWNm|-N? zeXxV06bvsFMJ8aD}gEOKaM3T;&pWezA{#1HTevlF~d;o zu{?d#V>bNcb}u_MZTMpz3a58JsWHqPg|~06|DgD)>im}fAZzv-uU6JdBa~5-+uKk= z&GbayA`_oixoe<63N=b&GABQ;#vD|M(^T)EN5YS zFSRIn>IgXmN_8H{wER4T^;F}=NpYT^M`hjFLwZH9BdEo8pS&%%2lTtnzmk6r0O;I4 z)xQ51PcZPgb&hXpJv*RWaiPlF;`Xxb9Hsj}0Fli18=e!K3puMrYQ{y3O-|pB+&Mar z4xUL>k3ohs3paAf87vg1K`k0}!5yz9MfX`2(bNYRtI~WBl>^&nMQB#28Zu1ypwcik zk>B>Vgtdi+J{LoSy;6y%mRKog(LLBt*Vf}~f|JFDeb(B|*zfSgm88w0LXX*%r@VP(NigXc_Xk#-TuGgk=-9#Ssui zE8-Ujblki|E0J(;k9Xs`^Ymxbh#Sp}jgaFUd=>RliL(U<*;KG@eUR>xtz=6YDzor6 z{BV@@G-K&mip9Z4rgs&t8=W=@582E@p&iGgyT|ow3a3Hv3bj?N15;ih*9c_nwPVhnqG=k^{uuT(f|_`;~q@ zC40T5B^erZshY~=?Gy)c;q;~v3)x~^#CuBZ$y2TmbvY6SRVcnET_xt<-Tcfq$E$Hr zux&pcL0%6zpZ4E3z8tIm8hS|*$cYX(3X+sWDJrNq-3t8fNs*jOv2jq6zT%NQaI;pd zHi&C@lxC0;RK?0ApMsAh*?Ce^p)^QC+_Os8ZwknNoIo9-M6daFR_dBOM(13s*XMH% zPPGlTZ;Xx^11ZWIg`Zpd3HYO~AclvXkPTT3D#?&BM%nd~^uq>yOi!Jq`i^7Ym~sfD zVQpQ6B-JS~1_L1f?D(T=3W7#56Dl}KjfPl4#M`crU%P7K$7N13M4I5AfYh*pBBJqd z%&I8Bhfe9KJm(@WfK9(5vsv_KHbE6WUl$VJK<%w0_d$7Umt=)IJB@g~_>HyC-483L zUuHZay_xLKG`k1;<@w^_D1wDv$LKmvP7rv98WPEnFhbD?5I z3z+q(;J8d)!A?{8Ba6ZCt$5GSkJ>Plx%^VUCeT(-CV9=eOk8US<9h{$8n z0?`kXb%r+=Uu^DB#rkv`)5GM_+$R?BaIy;s;a$0R`*2>SGdCFY&A%R6b`j5(jjBjz zLd4K)lbg+MXYM4StnR7djuto|bpTc@d&@HB^oyFFE1E+juwVA3bE8JXTsh~+@qq>$ zbXD|qBW|VOqm`%XzJL{}-Y8Wexj@3Ta(I`TL^BY$ThN3emcEW-wbforR&zKZMUZ+; zrzNw?Z(%U{qNm-UD75(@XWCV5@2iWUZnfCa8lUTFIvWuDF*|&f5?S6VV_FkKgDS1& zu$B?8m-RV^WeCh>4iI)(g||ygD8ci!d`I*bwt+Q$v&hZxN7^k_VycwNEpVm`*E7gxuK zzcV}(j*-BdBdp8p=4iCUEl0Ad&L;j&n~QISf5d~;2&yCUXZ3^dZd>WP3-Es9`4TtySzJJ zZsrlF^ZVVWO^5_puE%0qfA1gRw?bHV28JbF=z%w{3(02i^5HHIrZye3!; z(#Btj-p;e6&HL=jo3u!MdBKN%~PUJnExLDNI@JY%-ZF-E2 zfU_I7mqmq}gu)|BVU3fzkTlF@q0G`im};vP8`MzmA=C*$lM_MEVx(7z-hAcI!feU5 zPZhP&;aW4R=bY=n_f=YUsg&8;$bpQD^W(3dJI;6FZ6;&H98%Bp!->Jv!pX#tn=pKd zBO=?;j2fBz$!pnF%~g&NPj8alZknx#UO2WiQZMV2NF<;cKz2DYqs_PD(b`6f17T8TO#npC|gy=FKzOpKDGLM77Q ze%XvHLRBqLE~^q*77x)qtnUhG%ycrbJ@(0s;N#298#f=rAHP%@#Kq~^$;FxCAH063 z6mFta2-8&ot0bOOh_^!VuX*TmjD^LCP0KRK0DwFS&`G~@V(-N9Lo<_86H%d}X|5=| zar5Er)!I)ltab`JIL3yS!78at7R)HSmsutqiy`#67rO0q)M~IbBU>b+7eGqkwq8K9 zyed?KY={lD2rwsYHe#7*@ojiG5{ETD8B5sP zzOZweB^B-0Q_Chj5I%Dv*NEoLg)7cW$P9v#i9%1BBhaNGFJ-RpK3Op>O-~d~9o^MS z^<|p6p6YwiFaQ8R07*naR5Tr;+(-+84=!Bew}1N^&32>r{wG)07}Lc%Yi zO&l5`Jsd`lE7wvjM7Yb@i~JRj^dY}g1cOTw&?U;ni@U56m;nWwVihSX&T(@a(T;a7 zZl1rivff}rI$L4NL8-j|;KH%}^}TZy+It5=x#Y43GLe%s%>z+#&o>rMgIv0yyETGR z8#y*?y?Ji`-1OM!#3bWm@NKNG@qOMq=a=s_D*ZyuzB*@{qfVsq*o0AKr}q=@5-UtD|in9UJ=j^18uE`3ee!5BRuy1kEGC;W3xV5MJ3( z%*KBDx39l)3JF0Q-?WnmO9JH>lX9WRZ$o{0@p_}tOxXe0=|6nD{@$k-;f)zs9SEni zGGm(N4CASZk+Y``6j;f`2C26?q_P=yv$K+(HS#XhblW%(FUF3P+fuj|oYdBnwW?^w zLj4p9jn)-QL5S>yOa>pbuyVq%jj5}CyWMZ~Km71Kgs`BabNQ`1W7?y>3d`-)T7^$| zOPnOcep?k7sMwHzHqjlFx|#+K)HS0R4on&HcRViW*>FWE(x-JQWbb*gxZ+bn`j7N} z<665^z4|o0cx&_WmFq}T2OSlwvkS9}J4eo(*rl0A!)GvoY_-KuP$C|YQRMs-mX(J~ zo{@rHOZl;LOy}5&r_&?0)|)tc9P~CnogO(f!|;_ub1X8jTN?|bpGY*qgq0eCwy}p6-U?}bw6?f3w`cDz z7~Nzwo>N%Rc%`8N^r~rCk4wwe%M8?<13Arb3^DlRjAP7O^v?hU_^%1NL3sO4S_HMl3CXWP*e?? zeCSfcB2imSkSvNtCf?IZiO;&{#=2iUwV&0EH98D%*r&tZX0tH{wU&mTUVnV|_69#w z%S-`tSbQ?~&byy|{p<-2Zr+I0S2DJtu)q{-Jq}MEod3n#rJL<;(rQJWjyhD>bxOo& z6Ahr3BGCun6e!gVL?>fP0@YPk21tzP#2dXEg+V-*db)1z0FPoRGbHbI#Ho>HsW7^2 zO%pfy?k?FXG=C7DKiHMA+9Y8tWG7PdBGOe$?Op#e*{^T7~f%zgEQ7 zv4eXS56s@49qB*dI3LN1uSP-Qt-J~wNt$qkAj5^}{@t7rA^?zt4e7PseC-GohMzCC zLJ9eZ<@TM&AAa_LofToJ#z#f2TB;Gqkmc3hI20@~Xpr$`skYNYxJV}fI+Z2P6Ip(r zHHYt^$q>05S+*>{%b>eLBpeirCT^tE`-|_qPJ?MfPel@)lZb-4KUH*_!_&&1_ES)q zsUGNSSWdb%maf8RW3%~pKl|j$O}>v}BrNNr^Cs1f4$&^yCZCKz7srBtbrGV6k5}hs zrZ|L?g?vXVT^LLVlbus@({H_g^t(U(gxb!o9JWE~Y-rjOCR3_$wOsh4*H7=?HOs+I z>=aFu9P-(h7?9d77^P-4nCRSppMV4-dkH~q%F7G3fo+M^tk!Kg~!o;tdy8Ez?op~vW3-<&0`vC)wtdswlg z5*n}!o!v7L4k7se>ZRU3FN^pP$Im)P0j&W2w~ZJ-c(N$WC2-rqic!y?$r? z@||8knhuIp*0w1Vu$$6|9Ev!B(aIro#v3Cs+q zm7Iq%Bo7OA(9v@0VUr^s!gM1@)`Q+UKlu_R4fbbc*G8DGhy68vtRd-eOhdERr5<7c z$f&lO%RUL`X!a}18~@V}-u=y$#~r5isi{&SO4V34GDJ5X=(qCOQbg=`Oj4~Eq|r}* z`F@u}k!W)@{iikx5KOA^!6+Y-zkX)#zJ0TCy_9nJm1be7TE*T7tC-Q@eY0PA@gQ`y z*o;AsgDw&4n@LjT@V_X!bp8I-t2Z%kY%NhoK_U?)dgjU}nk-NeF4kLPHQ$(1y4-9h zEl2aSqi0U;Z}S}$V=o$R4xpim+GiE4gD|!E$)!7NZlrq^u^7>AbA}jaP5u1+OB_o@ z*Q2Z!8VY$xjO;+8zxj26Ii3HV0BT6!Kei7@PyzZa7>NOA2 ztG?+%CMJ4KmYbom&ZCvZ;AY8GKv+M{(c|0sq;UP#Ln@ka4qVkzYhSEj!(en&KON>s zFcAu+ms>{J;Hm8Y)TQiOoU~;q7hLGo-OVEn)Fs0zUc@_FOsbDI%GV#HSFS(kw;TGR zAu5!rrM-J6mgdU($p9&UM!sgQw_x1%GB6eZx1un!3j_&w$XO|A?FVA|-No6F$y#UU z;)2r~MEGcV?drYugZ4-#s$%w4hI9t)>;i)#;+4kgi9er;t3YdPNPe^}7YQ!bFK?L~mL0At9?Pl*k{P10l4#4Oam_ZcpqCoW6#RIX6 zNGOE?WbP$OK`0rV@X1NUZ}{>fS(V_mvxmp(WgR_dndo21l+m}OT?-5Ee|G)u@|xeo z-RiL^w%=&?+QGd?jW4d<=OhFB#RroG<1CIA({Uc@f!(u5_s*-%#ab63F{2JMxzkjr#4Q$VaR-m% ziyA{URRvVtU~_G`U!MNWrSRd3BH zsoEG_DhOrO^b}bKWKd*w*%Unk1$x?6AlO9oh0o8BMHrntw*Sw*{>lr}^@(De&5i0? zunCuQfanv-8c+y^6u5Fwp?A%;LKQx&F>jI^%W|b(esSxgOLt09xx(Q`N(N<6rG9%m z2wyq9|H#r3)39Tz%Z-_ z-D)d&=YxxOWFDO`H50I<1H?Q1)s5yS7jLz?{W2X1iBU!dGlazj5MO!zvu~WM=|{pf z*wON^X|5+mq8nTkqnD_daRMH2WMU?P(jz&~sj)~9F3YmTqvYx|SmCJBF&2?BQ_Q*q zg%k)!Rg4PDkq(?_XYgDU5pu$5TJ@~LL)h>&#E@XSD6f%1WvZElLzcfFajV04(PlYb zMLmTc6)!*R-G7qaz4JsrFF}D9%Jo|Pg<}h2HRdens!IKoSk6hsyiPaiTqIV?=Yj}kCpwe70* zJLR-n;uqn?r1VdsF{GSk6~^6T`)2-&KmGcjeC-A7cVV;=RoNU>pn5vQnM878RPvrs z(X5#@wqeqj3_DSySNiEEm)160e4|Hx);b8b#L*_oT#o3DZcUhqHdT8taunLHKDl`3sXpx1s1zO6fm&u7up9m4 z^4%v79<2b@8w+4Cx?v6ody=q4ed@*I`}7GxNvkay0Z8+`q{!u5{_f~j5?z_gIj{gq z$rOQ5vwf(i@s*_>da6Ki0!F6=wo3G*fU71(GBOlSEY{heGAoBJApyRx?n5xmYq8G> zRJP|ilDgpB!>e$8$%RF8)8}T>=mcsjMW-vw9>IwrBa-E3KS1#+p>+LSmem85*{wrvgkB$#Mo$YYP>kN zxHBp6Yvyz#qQ@ME+^yVv%4|wq=i<_{aMed*c1CUsZxn=+_eOTxtp!p}Wx{qpPQ4*jR!IOS!JiN>BF_Gduo5oFCuX!p{k6!75dW3e zj@6MKV=L|EU=9b#(JtaasZ{WE?$7|5cB7dZZB$z6N}vR2m|&v?d8G}6^PkCEteP%* zkM}eBAdQN}hPt#I%+u95DHoU;xxp|?ee9`__N&dHx71@N4T6OP@dhe9>OLDrX`*+c z&XOsCSNPxN(Xhgj*G5W* z_fE(Ch72)VDl-h!#c)usECbS6>2#UDDFvlud1&ch{>hs~ zP8FzPl+|mocGr<1>IY4w6w}kDg;W^}SkrG>a4`DY?|yjy@jA^bn~ovQ=^z5&Q&$e~ zJ$G{dtH<}$%jrvpcYW>UBh(~*TL3bsq;|*&=7106qF7EMeRh2C!JLpgA$YWA zFH9t&LV|T^&{0!Oy+bVqfk6TLyP5qKsuwRQWNVGQeJ|@g!m949+rCNR3sY7 zw7+N9oSoz?jAn*NBtv9fz_h^^FKm-!`oQKv92O@P6Qd9goUrMF9(P%K(eb-p16a@X znS#ik3ZACaqRNBS-n}QAEYk7Lv<0>Rb8&G0V$$U-BzEC+`K1niMTz}W%nR|#Z3U%Z8RX7Jo}^%2=aO3)vR%U^%tU~_%-FTZ-0IR|E88OWf}G`pxW zKO$6#3ODYo{P5jR`Yk?fZxpa~+Ct*2g^Jx#WW+ez0gXy9U3CSd{ukHG`Zr-R@nb6`$@nSLpA;Mx+jqa2+GUd3nxpsT`(SgNTsTZL}`39|WInP$O0*0fkzsQYjw z8{uj&9;oJSr7)CB0}jm#u?dTxN1{_5^$+abBimxdMoMK>A5gPM3|^nEZnpXAgf5u7 zj69G)7#79TVGqMRgv!TlN#n!v0>~gZs)^03D)0wV@Y#4k9ny5VW$F}`I=$+xJL{X9 zoJquXKa5;qq+Z=Q%`y&$%kwb;b(szE6cWgcJPFt#v{woZfb>WOcgVRUqQjC&Zf4F= zK&%V<7$?VQ87lUjb&ub1+H9tmZmgt*DLNX0Z-T@lkh*11GUknUA2@{8d54I}y<}7# zvUo;@a%DgjQ-F zu@^LHV@9(w&}%M4rALMLE*(6y>sxP}II?>hMbbIIng&&$iep_i(mua<{YPJY@x$MI zac85;90V&a0%KO+0p-;<90HRl}EYheF=PClt(4aCbU=+hsM|K_AJKtcx7gdNTx@dqh>FNO2UjOW=Bl`{= z;FnZmOfT3>i^M!$bw5~zq#NI#D03*d2xd0GMj5JrjGpw}LfSumU}4YFj*HEQy=L5N z7j!Bq`@)?%h(<7qRLkpgF%xP zZW;F++B?q?M;(r(Mv-j4Da2xn$xbsvANtYCW{bm(nLX4o2ezS6h>R5T;5Rz-1dn?t zg*hk~j#gNnYkP#tk!Mv>7nFOP93&6%18-`UDsZr~%am)({y592vuuF>`gt=c(V@$z$2S(jP# zp)RIsW>XmF)3K&4<46m(U3Rq)MWXI6uG136~fI#?SPD_<;a^<#Wf5arzA$2FE5bHc&t&I>OFxrc}QF z&U+U=zmfDRe9;pX`V66H!vR1l2@lJr*#>VWAdb?{6hrY&eblJvXQgB29V(Ud&DT$} zV@W?^Kw=H%BpJsWYn!Yj?%FlKi;B;*2$*b|#+QdHN~wx9^#Namv(-s`3q+zcvN?2O zIp-ps+EG7sc;WhulKJe!o!g8U;Om6S&3;W={&0rm%21!7~73CYX+uhsupSIXV!Wo=qDbzR#pQTcI zbB+j=j1R~WiVj`RcOW7{M$H(Nl${KfTy<^eRY9g#_7r={Ndfo5%4(yrw$3qGkgSRF zkukPkr%OA>KEM4$11^I!OvVs-0;`^dQw6<2fr&FSd|4TYIHE->!`1Q8a;?fw1ktNz z$|qS}S#5O^eidE6ij$EkA~O@EUY|MRRz6piU7(QS99|#fAGu7o2LID<;z&@X681FC z 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

&s4Sijd728;`*yrvJXQ^4oH{rG;a-ynd3HAXx> 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 literal 0 HcmV?d00001 diff --git a/docs/bmgd/game-types.md b/docs/bmgd/game-types.md new file mode 100644 index 00000000..ed0a7164 --- /dev/null +++ b/docs/bmgd/game-types.md @@ -0,0 +1,374 @@ +--- +title: "Game Types Reference" +--- + +BMGD supports 24 game type templates. Each adds genre-specific sections to your GDD. + +## Game Types + +### Action & Combat + +#### Action Platformer + +Side-scrolling or 3D platforming with combat mechanics. + +**Examples:** Hollow Knight, Mega Man, Celeste + +**GDD sections:** + +- Movement systems (jumps, dashes, wall mechanics) +- Combat mechanics (melee/ranged, combos) +- Level design patterns +- Boss design + +#### Shooter + +Projectile combat with aiming mechanics. + +**Examples:** Doom, Call of Duty, Splatoon + +**GDD sections:** + +- Weapon systems +- Aiming and accuracy +- Enemy AI patterns +- Level/arena design +- Multiplayer considerations + +#### Fighting + +1v1 combat with combos and frame data. + +**Examples:** Street Fighter, Tekken, Super Smash Bros. + +**GDD sections:** + +- Frame data systems +- Combo mechanics +- Character movesets +- Competitive balance +- Netcode requirements + +### Strategy & Tactics + +#### Strategy + +Resource management with tactical decisions. + +**Examples:** StarCraft, Civilization, Europa Universalis + +**GDD sections:** + +- Resource systems +- Unit/building design +- AI opponent behavior +- Map/scenario design +- Victory conditions + +#### Turn-Based Tactics + +Grid-based movement with turn order. + +**Examples:** XCOM, Fire Emblem, Into the Breach + +**GDD sections:** + +- Grid and movement systems +- Turn order mechanics +- Cover and positioning +- Unit progression +- Procedural mission generation + +#### Tower Defense + +Wave-based defense with tower placement. + +**Examples:** Bloons TD, Kingdom Rush, Plants vs. Zombies + +**GDD sections:** + +- Tower types and upgrades +- Wave design and pacing +- Economy systems +- Map design patterns +- Meta-progression + +### RPG & Progression + +#### RPG + +Character progression with stats, inventory, and quests. + +**Examples:** Final Fantasy, The Witcher, Baldur's Gate + +**GDD sections:** + +- Character stats and leveling +- Inventory and equipment +- Quest system design +- Combat system (action/turn-based) +- Skill trees and builds + +#### Roguelike + +Procedural generation with permadeath and run-based progression. + +**Examples:** Hades, Dead Cells, Spelunky + +**GDD sections:** + +- Procedural generation rules +- Permadeath and persistence +- Run structure and pacing +- Item/ability synergies +- Meta-progression systems + +#### Metroidvania + +Interconnected world with ability gating. + +**Examples:** Metroid, Castlevania: Symphony of the Night, Ori + +**GDD sections:** + +- World map connectivity +- Ability gating design +- Backtracking flow +- Secret and collectible placement +- Power-up progression + +### Narrative & Story + +#### Adventure + +Story-driven exploration with puzzle elements. + +**Examples:** Monkey Island, Myst, Life is Strange + +**GDD sections:** + +- Puzzle design +- Narrative delivery +- Exploration mechanics +- Dialogue systems +- Story branching + +#### Visual Novel + +Narrative choices with branching story. + +**Examples:** Doki Doki Literature Club, Phoenix Wright, Steins;Gate + +**GDD sections:** + +- Branching narrative structure +- Choice and consequence +- Character routes +- UI/presentation +- Save/load states + +#### Text-Based + +Text input/output games with parser or choice mechanics. + +**Examples:** Zork, 80 Days, Dwarf Fortress (adventure mode) + +**GDD sections:** + +- Parser or choice systems +- World model +- Narrative structure +- Text presentation +- Save state management + +### Simulation & Management + +#### Simulation + +Realistic systems with management and building. + +**Examples:** SimCity, RollerCoaster Tycoon, The Sims + +**GDD sections:** + +- Core simulation loops +- Economy modeling +- AI agents/citizens +- Building/construction +- Failure states + +#### Sandbox + +Creative freedom with building and minimal objectives. + +**Examples:** Minecraft, Terraria, Garry's Mod + +**GDD sections:** + +- Creation tools +- Physics/interaction systems +- Persistence and saving +- Sharing/community features +- Optional objectives + +### Sports & Racing + +#### Racing + +Vehicle control with tracks and lap times. + +**Examples:** Mario Kart, Forza, Need for Speed + +**GDD sections:** + +- Vehicle physics model +- Track design +- AI opponents +- Progression/career mode +- Multiplayer racing + +#### Sports + +Team-based or individual sports simulation. + +**Examples:** FIFA, NBA 2K, Tony Hawk's Pro Skater + +**GDD sections:** + +- Sport-specific rules +- Player/team management +- AI opponent behavior +- Season/career modes +- Multiplayer modes + +### Multiplayer + +#### MOBA + +Multiplayer team battles with hero selection. + +**Examples:** League of Legends, Dota 2, Smite + +**GDD sections:** + +- Hero/champion design +- Lane and map design +- Team composition +- Matchmaking +- Economy (gold/items) + +#### Party Game + +Local multiplayer with minigames. + +**Examples:** Mario Party, Jackbox, Overcooked + +**GDD sections:** + +- Minigame design patterns +- Controller support +- Round/game structure +- Scoring systems +- Player count flexibility + +### Horror & Survival + +#### Survival + +Resource gathering with crafting and persistent threats. + +**Examples:** Don't Starve, Subnautica, The Forest + +**GDD sections:** + +- Resource gathering +- Crafting systems +- Hunger/health/needs +- Threat systems +- Base building + +#### Horror + +Atmosphere and tension with limited resources. + +**Examples:** Resident Evil, Silent Hill, Amnesia + +**GDD sections:** + +- Fear mechanics +- Resource scarcity +- Sound design +- Lighting and visibility +- Enemy/threat design + +### Casual & Progression + +#### Puzzle + +Logic-based challenges and problem-solving. + +**Examples:** Tetris, Portal, The Witness + +**GDD sections:** + +- Puzzle mechanics +- Difficulty progression +- Hint systems +- Level structure +- Scoring/rating + +#### Idle/Incremental + +Passive progression with upgrades and automation. + +**Examples:** Cookie Clicker, Adventure Capitalist, Clicker Heroes + +**GDD sections:** + +- Core loop design +- Prestige systems +- Automation unlocks +- Number scaling +- Offline progress + +#### Card Game + +Deck building with card mechanics. + +**Examples:** Slay the Spire, Hearthstone, Magic: The Gathering Arena + +**GDD sections:** + +- Card design framework +- Deck building rules +- Mana/resource systems +- Rarity and collection +- Competitive balance + +### Rhythm + +#### Rhythm + +Music synchronization with timing-based gameplay. + +**Examples:** Guitar Hero, Beat Saber, Crypt of the NecroDancer + +**GDD sections:** + +- Note/beat mapping +- Scoring systems +- Difficulty levels +- Music licensing +- Input methods + +## Hybrid Types + +Multiple game types can be combined. GDD sections from all selected types are included. + +| Hybrid | Components | Combined Sections | +|--------|------------|-------------------| +| Action RPG | Action Platformer + RPG | Movement, combat, stats, inventory | +| Survival Horror | Survival + Horror | Resources, crafting, atmosphere, fear | +| Roguelike Deckbuilder | Roguelike + Card Game | Run structure, procedural gen, cards | +| Tactical RPG | Turn-Based Tactics + RPG | Grid movement, stats, progression | +| Open World Survival | Sandbox + Survival | Building, crafting, exploration | diff --git a/docs/bmgd/index.md b/docs/bmgd/index.md new file mode 100644 index 00000000..08f2f607 --- /dev/null +++ b/docs/bmgd/index.md @@ -0,0 +1,113 @@ +--- +title: "BMGD Quick Guide" +description: Quick reference for BMad Game Dev Studio +--- + +![BMGD Logo](bmgd-logo.png) + +# BMGD Quick Guide + +BMad Game Dev Studio (BMGD) extends BMM with game-specific capabilities. Developed by game industry veterans, it guides you through product research, technical design, narrative design, and a full epic-driven production cycle. + +## Under Construction + +Documentation is under heavy construction catching up with the new beta release. We'll have complete documentation up as soon as possible. For now, please ask in the BMGD section of the Discord if you have any questions. + +![BMGD Workflow](workflow.jpg) + +## Quick Start + +**Install → Game Brief → GDD → (Narrative) → Architecture → Build** + +BMGD is an optional module installed via BMAD Method: `npx bmad-method install` + +See [How-To Reference](#how-to-reference) for commands. + +## Development Phases + +| Phase | Name | Key Activities | +|-------|------|----------------| +| 1 | **Preproduction** | Brainstorm Game, Game Brief, market research | +| 2 | **Design** | GDD creation, Narrative Design (for story-driven games) | +| 3 | **Technical** | Game Architecture (engine, systems, patterns) | +| 4 | **Production** | Sprint planning, story development, code review, testing | + +## BMGD Agents + +| Agent | Purpose | +|-------|---------| +| Game Designer | Game mechanics, balance, player psychology | +| Game Developer | Implementation with engine-specific patterns | +| Game Architect | Engine selection, systems design, technical structure | +| Game Scrum Master | Sprint planning and epic management | +| Game QA | Playtesting, engine-specific testing, performance profiling | +| Game Solo Dev | Full-stack game development for solo projects | + +## Key Documents + +| Document | Purpose | +|----------|---------| +| **Game Brief** | Vision, market positioning, fundamentals | +| **GDD** | Core loop, mechanics, progression, art/audio direction | +| **Narrative Design** | Story structure, characters, world-building, dialogue | +| **Architecture** | Engine, systems, patterns, project structure | + +## Game Type Templates + +BMGD includes 24 game type templates that auto-configure GDD sections: + +Action, Adventure, Puzzle, RPG, Strategy, Simulation, Sports, Racing, Fighting, Horror, Platformer, Shooter, and more. + +Each template provides genre-specific GDD sections, mechanics patterns, testing considerations, and common pitfalls to avoid. + +## Explanation: BMGD vs BMM + +### When to Use Each + +| Use BMGD for | Use BMM for | +|--------------|-------------| +| Video games | Web applications | +| Interactive experiences | APIs and services | +| Game prototyping | Mobile apps (non-game) | +| Game jams | General software projects | + +### Phase Mapping + +| BMM Phase | BMGD Phase | Key Difference | +|-----------|------------|----------------| +| Analysis | Preproduction | Game concepts, Game Brief instead of Product Brief | +| Planning | Design | GDD instead of PRD; optional Narrative Design | +| Solutioning | Technical | Focus on engine selection, game-specific patterns | +| Implementation | Production | Game QA replaces TEA; engine-specific testing | + +### Document Differences + +| BMM | BMGD | Notes | +|-----|------|-------| +| Product Brief | Game Brief | Captures vision, market, fundamentals | +| PRD | GDD | Includes mechanics, balance, player experience | +| N/A | Narrative Design | Story, characters, world (story-driven games) | +| Architecture | Architecture | BMGD version includes engine-specific patterns and considerations | + +### Testing Differences + +**BMM (TEA):** Web-focused testing with Playwright, Cypress, API testing, E2E for web apps. + +**BMGD (Game QA):** Engine-specific frameworks (Unity, Unreal, Godot), gameplay testing, performance profiling, playtest planning, balance validation. + +## How-To Reference + +| I need to... | Action | +|--------------|--------------------------------------------------------------------------------------------------------| +| Install BMGD | Run `npx bmad-method install` and select BMGD during module installation | +| Start a new game | Run `/bmad-gds-brainstorm-game`, then `/bmad:gds:create-game-brief` | +| Design my game | Run `/bmad-gds-create-gdd`; add `/bmad:gds:narrative` if story-heavy | +| Plan architecture | Run `/bmad-gds-game-architecture` with Game Architect | +| Build my game | Use Phase 4 production workflows - Run `/bmad-help` to see what's next | +| Test an idea quickly | Use [Quick-Flow](quick-flow-workflows.md) for rapid prototyping | + +## Further Reading + +- [Game Types Guide](game-types.md) +- [Quick-Flow Guide](quick-flow-workflows.md) + diff --git a/docs/bmgd/quick-flow-workflows.md b/docs/bmgd/quick-flow-workflows.md new file mode 100644 index 00000000..b86cc767 --- /dev/null +++ b/docs/bmgd/quick-flow-workflows.md @@ -0,0 +1,160 @@ +--- +title: "Quick Flow Workflows" +--- + +How to create tech specs and execute implementations with Quick Flow. + +## Choosing a Workflow + +| Situation | Workflow | Command | +|-----------|----------|---------| +| Need to document before implementing | Quick-Spec | `/bmad-gds-quick-spec` | +| Multiple approaches to evaluate | Quick-Spec | `/bmad-gds-quick-spec` | +| Have a completed tech-spec | Quick-Dev | `/bmad-gds-quick-dev path/to/spec.md` | +| Have clear, direct instructions | Quick-Dev | `/bmad-gds-quick-dev` | +| Building complete game system | Full GDS | `/bmad-gds-workflow-init` | +| Epic-level features | Full GDS | `/bmad-gds-workflow-init` | + +--- + +## How to Create a Tech Spec (Quick-Spec) + +### Step 1: Start the workflow + +```bash +/bmad-gds-quick-spec +``` + +### Step 2: Describe your requirement + +Provide your feature request. The agent scans the codebase and asks clarifying questions. + +**Checkpoint options:** +- `[a]` Advanced Elicitation - explore requirements deeper +- `[c]` Continue to investigation +- `[p]` Party Mode - consult expert agents + +### Step 3: Review investigation findings + +The agent analyzes the codebase for patterns, constraints, and similar implementations. Review the findings. + +**Checkpoint options:** +- `[c]` Continue to spec generation +- `[p]` Party Mode - get technical review + +### Step 4: Review generated spec + +The agent creates an ordered task list with file paths and acceptance criteria. Verify completeness. + +**Checkpoint options:** +- `[c]` Continue to final review +- `[p]` Party Mode - technical review + +### Step 5: Finalize + +Confirm the spec meets these standards: +- Every task has a file path and specific action +- Tasks ordered by dependency +- Acceptance criteria in Given/When/Then format +- No placeholders or TBD sections + +**Options:** +- `[d]` Start Quick-Dev immediately +- `[done]` Save spec and exit + +**Output:** `{planning_artifacts}/tech-spec-{slug}.md` + +--- + +## How to Execute Implementation (Quick-Dev) + +### With a Tech-Spec + +```bash +/bmad-gds-quick-dev path/to/tech-spec-feature.md +``` + +The agent: +1. Captures baseline git commit +2. Loads and validates the spec +3. Executes tasks in order +4. Runs self-check +5. Performs adversarial review +6. Resolves findings +7. Validates against acceptance criteria + +### With Direct Instructions + +```bash +/bmad-gds-quick-dev +``` + +Then describe what you want implemented: +1. Captures baseline git commit +2. Evaluates complexity (may suggest planning) +3. Gathers context from codebase +4. Executes implementation +5. Runs self-check and adversarial review +6. Resolves findings + +**Escalation:** If the agent detects complexity (multiple components, system-level scope, uncertainty), it offers: +- `[t]` Create tech-spec first +- `[w]` Use full GDS workflow +- `[e]` Execute anyway + +--- + +## Troubleshooting + +### Spec has placeholders or TBD sections + +Return to investigation step. Complete missing research, inline all findings, re-run review. + +### Workflow lost context mid-step + +Check frontmatter for `stepsCompleted`. Resume from last completed step. + +### Agent suggested planning but you want to execute + +You can override with `[e]`, but document your assumptions. Escalation heuristics exist because planning saves time on complex tasks. + +### Tests failing after implementation + +Return to the resolve-findings step. Review failures, fix issues, ensure test expectations are correct, re-run full suite. + +### Need help + +```bash +/bmad-help +``` + +--- + +## Reference + +### File Locations + +| File | Location | +|------|----------| +| Work in progress | `{implementation_artifacts}/tech-spec-wip.md` | +| Completed specs | `{planning_artifacts}/tech-spec-{slug}.md` | +| Archived specs | `{implementation_artifacts}/tech-spec-{slug}-archived-{date}.md` | +| Workflow files | `_bmad/gds/workflows/gds-quick-flow/` | + +### Validation Criteria + +**Self-check (before adversarial review):** +- All tasks/instructions completed +- Tests written and passing +- Follows existing patterns +- No obvious bugs +- Acceptance criteria met +- Code is readable + +**Adversarial review:** +- Correctness +- Security +- Performance +- Maintainability +- Test coverage +- Error handling diff --git a/docs/bmgd/workflow.jpg b/docs/bmgd/workflow.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5761f085e6d5d9b93ddf387213027a7f5f2d3b69 GIT binary patch literal 120610 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

9w*tJiz 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�l+f61vZ-o;N7~J5T#N@O`hU22rSP_N|{+Uu< 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

+k}|h&ddkJYk-fiSgrUpYWPA9} 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 literal 0 HcmV?d00001 From 53220420a5c382fa0822f28975e216bc15443c70 Mon Sep 17 00:00:00 2001 From: Alex Verkhovsky Date: Sat, 31 Jan 2026 16:25:31 -0700 Subject: [PATCH 03/13] fix: add disable-model-invocation to all generated slash commands (#1501) Prevents Claude from auto-invoking BMad skills without explicit user request. Adds disable-model-invocation: true frontmatter to all command templates and inline generators for Claude Code and Codex. Co-authored-by: Brian --- tools/cli/installers/lib/ide/_config-driven.js | 2 ++ tools/cli/installers/lib/ide/codex.js | 1 + .../installers/lib/ide/shared/task-tool-command-generator.js | 1 + .../cli/installers/lib/ide/templates/agent-command-template.md | 1 + .../cli/installers/lib/ide/templates/combined/default-agent.md | 1 + .../lib/ide/templates/combined/default-workflow-yaml.md | 1 + .../installers/lib/ide/templates/combined/default-workflow.md | 1 + .../installers/lib/ide/templates/workflow-command-template.md | 1 + tools/cli/installers/lib/ide/templates/workflow-commander.md | 1 + 9 files changed, 10 insertions(+) diff --git a/tools/cli/installers/lib/ide/_config-driven.js b/tools/cli/installers/lib/ide/_config-driven.js index 022bff7b..87be7300 100644 --- a/tools/cli/installers/lib/ide/_config-driven.js +++ b/tools/cli/installers/lib/ide/_config-driven.js @@ -283,6 +283,7 @@ class ConfigDrivenIdeSetup extends BaseIdeSetup { return `--- name: '{{name}}' description: '{{description}}' +disable-model-invocation: true --- You must fully embody this agent's persona and follow all activation instructions exactly as specified. @@ -297,6 +298,7 @@ You must fully embody this agent's persona and follow all activation instruction return `--- name: '{{name}}' description: '{{description}}' +disable-model-invocation: true --- # {{name}} diff --git a/tools/cli/installers/lib/ide/codex.js b/tools/cli/installers/lib/ide/codex.js index 60250a39..5cd503e2 100644 --- a/tools/cli/installers/lib/ide/codex.js +++ b/tools/cli/installers/lib/ide/codex.js @@ -411,6 +411,7 @@ class CodexSetup extends BaseIdeSetup { const launcherContent = `--- name: '${agentName}' description: '${agentName} agent' +disable-model-invocation: true --- You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command. diff --git a/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js b/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js index 6b90de9f..a0c4bcf8 100644 --- a/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +++ b/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js @@ -72,6 +72,7 @@ class TaskToolCommandGenerator { return `--- description: '${description.replaceAll("'", "''")}' +disable-model-invocation: true --- # ${item.displayName || item.name} 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 89713631..90e176a0 100644 --- a/tools/cli/installers/lib/ide/templates/agent-command-template.md +++ b/tools/cli/installers/lib/ide/templates/agent-command-template.md @@ -1,6 +1,7 @@ --- name: '{{name}}' description: '{{description}}' +disable-model-invocation: true --- You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command. diff --git a/tools/cli/installers/lib/ide/templates/combined/default-agent.md b/tools/cli/installers/lib/ide/templates/combined/default-agent.md index f8ad9380..17a0be4b 100644 --- a/tools/cli/installers/lib/ide/templates/combined/default-agent.md +++ b/tools/cli/installers/lib/ide/templates/combined/default-agent.md @@ -1,6 +1,7 @@ --- name: '{{name}}' description: '{{description}}' +disable-model-invocation: true --- You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command. diff --git a/tools/cli/installers/lib/ide/templates/combined/default-workflow-yaml.md b/tools/cli/installers/lib/ide/templates/combined/default-workflow-yaml.md index eca90437..2a5e49b8 100644 --- a/tools/cli/installers/lib/ide/templates/combined/default-workflow-yaml.md +++ b/tools/cli/installers/lib/ide/templates/combined/default-workflow-yaml.md @@ -1,6 +1,7 @@ --- name: '{{name}}' description: '{{description}}' +disable-model-invocation: true --- IT IS CRITICAL THAT YOU FOLLOW THESE STEPS - while staying in character as the current agent persona you may have loaded: diff --git a/tools/cli/installers/lib/ide/templates/combined/default-workflow.md b/tools/cli/installers/lib/ide/templates/combined/default-workflow.md index afb0dea5..8c4fa818 100644 --- a/tools/cli/installers/lib/ide/templates/combined/default-workflow.md +++ b/tools/cli/installers/lib/ide/templates/combined/default-workflow.md @@ -1,6 +1,7 @@ --- name: '{{name}}' description: '{{description}}' +disable-model-invocation: true --- IT IS CRITICAL THAT YOU FOLLOW THIS COMMAND: LOAD the FULL @{project-root}/{{bmadFolderName}}/{{path}}, READ its entire contents and follow its directions exactly! diff --git a/tools/cli/installers/lib/ide/templates/workflow-command-template.md b/tools/cli/installers/lib/ide/templates/workflow-command-template.md index 5c9e436c..472c1553 100644 --- a/tools/cli/installers/lib/ide/templates/workflow-command-template.md +++ b/tools/cli/installers/lib/ide/templates/workflow-command-template.md @@ -1,5 +1,6 @@ --- description: '{{description}}' +disable-model-invocation: true --- IT IS CRITICAL THAT YOU FOLLOW THESE STEPS - while staying in character as the current agent persona you may have loaded: diff --git a/tools/cli/installers/lib/ide/templates/workflow-commander.md b/tools/cli/installers/lib/ide/templates/workflow-commander.md index 3645c1a2..d49c8319 100644 --- a/tools/cli/installers/lib/ide/templates/workflow-commander.md +++ b/tools/cli/installers/lib/ide/templates/workflow-commander.md @@ -1,5 +1,6 @@ --- description: '{{description}}' +disable-model-invocation: true --- IT IS CRITICAL THAT YOU FOLLOW THIS COMMAND: LOAD the FULL @{{workflow_path}}, READ its entire contents and follow its directions exactly! From 7fcfd4c1b8321e83e2bf5eb607be0fd90be546e9 Mon Sep 17 00:00:00 2001 From: Michael Pursifull Date: Sat, 31 Jan 2026 17:26:41 -0600 Subject: [PATCH 04/13] fix: correct party-mode workflow file extension in workflow.xml (#1499) The party-mode workflow reference uses .yaml extension but the actual file is workflow.md. This broken reference has been present since alpha.17. Fixes #1212 Co-authored-by: Brian --- src/core/tasks/workflow.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/tasks/workflow.xml b/src/core/tasks/workflow.xml index 137b6dd5..fcf6f96b 100644 --- a/src/core/tasks/workflow.xml +++ b/src/core/tasks/workflow.xml @@ -81,7 +81,7 @@ Continue to next step - Start the party-mode workflow {project-root}/_bmad/core/workflows/party-mode/workflow.yaml + Start the party-mode workflow {project-root}/_bmad/core/workflows/party-mode/workflow.md From 8c59fb96a7b71f856683aa60a28210ae7b5f62d2 Mon Sep 17 00:00:00 2001 From: Ramiz Date: Sun, 1 Feb 2026 00:27:57 +0100 Subject: [PATCH 05/13] Enable sidecar for tech writer agent (#1487) fix Pagie hasSidecar --- src/bmm/agents/tech-writer/tech-writer.agent.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bmm/agents/tech-writer/tech-writer.agent.yaml b/src/bmm/agents/tech-writer/tech-writer.agent.yaml index d1bb7e91..43f376c1 100644 --- a/src/bmm/agents/tech-writer/tech-writer.agent.yaml +++ b/src/bmm/agents/tech-writer/tech-writer.agent.yaml @@ -7,7 +7,7 @@ agent: title: Technical Writer icon: 📚 module: bmm - hasSidecar: false + hasSidecar: true persona: role: Technical Documentation Specialist + Knowledge Curator From 7afe018f82b401d741f84ccec5f40603d1d08e6d Mon Sep 17 00:00:00 2001 From: Michael Pursifull Date: Sat, 31 Jan 2026 19:27:17 -0600 Subject: [PATCH 06/13] fix: correct relative path to validation workflow in step-e-04-complete (#1498) The validationWorkflow reference uses ./steps-v/step-v-01-discovery.md but steps-v/ is a sibling of steps-e/, not a child. Corrected to ../steps-v/step-v-01-discovery.md. Fixes #1496 Co-authored-by: Brian --- .../2-plan-workflows/create-prd/steps-e/step-e-04-complete.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md b/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md index 733f1a52..5d681fee 100644 --- a/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md +++ b/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md @@ -4,7 +4,7 @@ description: 'Complete & Validate - Present options for next steps including ful # File references (ONLY variables used in this step) prdFile: '{prd_file_path}' -validationWorkflow: './steps-v/step-v-01-discovery.md' +validationWorkflow: '../steps-v/step-v-01-discovery.md' --- # Step E-4: Complete & Validate From 0a7329ff235b82f1485dd04f836788e62aab225c Mon Sep 17 00:00:00 2001 From: Michael Pursifull Date: Sat, 31 Jan 2026 19:27:48 -0600 Subject: [PATCH 07/13] fix: correct relative path to prd-purpose.md in step-11-polish (#1497) The purposeFile reference uses ./data/prd-purpose.md but data/ is a sibling of steps-c/, not a child. Corrected to ../data/prd-purpose.md. Fixes #1495 --- .../2-plan-workflows/create-prd/steps-c/step-11-polish.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md b/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md index 23200915..70bf198c 100644 --- a/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +++ b/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md @@ -5,7 +5,7 @@ description: 'Optimize and polish the complete PRD document for flow, coherence, # File References nextStepFile: './step-12-complete.md' outputFile: '{planning_artifacts}/prd.md' -purposeFile: './data/prd-purpose.md' +purposeFile: '../data/prd-purpose.md' # Task References advancedElicitationTask: '{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml' From d45eff15bf31bcbd2eee79751a34e57682e31bc9 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 31 Jan 2026 18:19:12 -0600 Subject: [PATCH 08/13] gh-skill in progress --- .claude/skills/gh-triage/SKILL.md | 60 ++ .claude/skills/gh-triage/scripts/gh_triage.py | 713 ++++++++++++++++++ .github/ISSUE_TEMPLATE/bug-report.yaml | 124 +++ .github/ISSUE_TEMPLATE/documentation.yaml | 55 ++ ...{feature_request.md => feature-request.md} | 0 .gitignore | 2 +- 6 files changed, 953 insertions(+), 1 deletion(-) create mode 100644 .claude/skills/gh-triage/SKILL.md create mode 100755 .claude/skills/gh-triage/scripts/gh_triage.py create mode 100644 .github/ISSUE_TEMPLATE/bug-report.yaml create mode 100644 .github/ISSUE_TEMPLATE/documentation.yaml rename .github/ISSUE_TEMPLATE/{feature_request.md => feature-request.md} (100%) diff --git a/.claude/skills/gh-triage/SKILL.md b/.claude/skills/gh-triage/SKILL.md new file mode 100644 index 00000000..a198fc0d --- /dev/null +++ b/.claude/skills/gh-triage/SKILL.md @@ -0,0 +1,60 @@ +--- +name: gh-triage +description: Fetch all GitHub issues via gh CLI and provide consolidated AI-powered analysis with clustering, prioritization, and actionable insights. Use for issue triage, backlog cleanup, or when user mentions "issues", "triage", or "backlog". +license: MIT +metadata: + author: bmad-code-org + version: "2.1.0" + anthropic-internal: Core team issue triage tool for BMad Method repositories + min-github-cli-version: "2.0" +compatibility: Requires gh CLI, Python 3.8+, and git repository +--- + +# GitHub Issue Triage + +**IMPORTANT:** Never include time or effort estimates in output or recommendations. + +## What This Does + +1. **Fetch all issues** from repository via gh CLI (configurable: open/closed/all) +2. **Extract data** into structured format (JSON + markdown tables) +3. **Generate AI analysis** with: + - Issue clustering by theme + - Priority recommendations + - Actionable insights + - Cross-repo detection + - Cleanup candidates + +## Steps + +```bash +# 1. Navigate to scripts directory +cd .claude/skills/gh-triage/scripts + +# 2. Run the triage tool (outputs to _bmad-output/triage-reports/) +python3 gh_triage.py --state open + +# 3. Review the generated report +cat _bmad-output/triage-reports/triage-*.md +``` + +## Command Reference + +| Parameter | Description | Default | +| ---------------- | ------------------------------------------ | -------------------------------------------------- | +| `--repo` | Repository (auto-detected from git remote) | current repo | +| `--state` | Filter: `all`, `open`, `closed` | `open` | +| `--focus` | Filter by keywords in title/body | none | +| `--output`, `-o` | Save output to file | `_bmad-output/triage-reports/triage-YYYY-MM-DD.md` | +| `--json` | Output as JSON instead of markdown | false (outputs to stdout) | +| `--limit` | Max issues to fetch | 1000 | + +## Output + +All reports automatically save to `_bmad-output/triage-reports/` with: +- Summary statistics +- Issue clusters by theme +- Priority matrix +- Actionable recommendations +- Cross-repo issues with close commands +- Cleanup candidates (duplicates, stale, outdated) diff --git a/.claude/skills/gh-triage/scripts/gh_triage.py b/.claude/skills/gh-triage/scripts/gh_triage.py new file mode 100755 index 00000000..e73da756 --- /dev/null +++ b/.claude/skills/gh-triage/scripts/gh_triage.py @@ -0,0 +1,713 @@ +#!/usr/bin/env python3 +""" +GitHub Issue Triage Tool + +Fetches, categorizes, and groups GitHub issues for efficient triage. +Optimized for large datasets with parallel processing support. + +IMPORTANT: Never provide time, date, or effort estimates in output. +AI execution speed varies greatly from human timelines. +Focus on what needs to be done, not how long it takes. +""" + +import argparse +import json +import os +import re +import subprocess +from collections import defaultdict +from dataclasses import dataclass, field +from datetime import datetime, timedelta, timezone +from typing import List, Dict, Any, Optional, Set, Tuple +from enum import Enum +from difflib import SequenceMatcher +import re + + +class Category(Enum): + """Issue categories""" + BUG = "bug" + FEATURE = "feature" + ENHANCEMENT = "enhancement" + DOCUMENTATION = "documentation" + PERFORMANCE = "performance" + SECURITY = "security" + QUESTION = "question" + REFACTOR = "refactor" + TECH_DEBT = "tech-debt" + OTHER = "other" + + +class Priority(Enum): + """Priority levels""" + CRITICAL = "critical" + HIGH = "high" + MEDIUM = "medium" + LOW = "low" + INFORMATIONAL = "informational" + + +class TriagingStatus(Enum): + """Triage status""" + NEEDS_TRIAGE = "needs-triage" + READY_FOR_DEV = "ready-for-dev" + BLOCKED = "blocked" + STALE = "stale" + DUPLICATE = "duplicate" + INVALID = "invalid" + IN_PROGRESS = "in-progress" + COMPLETED = "completed" + + +@dataclass +class Issue: + """Represents a GitHub issue with triage metadata""" + number: int + title: str + state: str + author: str + created_at: datetime + updated_at: Optional[datetime] + labels: List[str] + body: Optional[str] + comments: int + category: Category = field(default=Category.OTHER) + priority: Priority = field(default=Priority.MEDIUM) + triage_status: TriagingStatus = field(default=TriagingStatus.NEEDS_TRIAGE) + + @property + def age_days(self) -> int: + """Age of issue in days""" + return (datetime.now(timezone.utc) - self.created_at).days + + @property + def days_since_update(self) -> Optional[int]: + """Days since last update""" + if not self.updated_at: + return None + return (datetime.now(timezone.utc) - self.updated_at).days + + @property + def url(self) -> str: + """GitHub URL for the issue""" + # Get from parent triage object + return f"https://github.com/{self._repo_url}/issues/{self.number}" + + +class IssueCategorizer: + """Categorizes issues based on content and metadata""" + + # Keywords for categorization + CATEGORY_KEYWORDS = { + Category.BUG: ['bug', 'fix', 'crash', 'error', 'broken', 'fails', 'exception', 'segfault', 'leak'], + Category.FEATURE: ['feature', 'add ', 'implement', 'support for', 'new ', 'request', 'wish'], + Category.ENHANCEMENT: ['enhance', 'improve', 'optimize', 'better', 'enhancement'], + Category.DOCUMENTATION: ['doc', 'readme', 'tutorial', 'guide', 'documentation', 'example', 'comment'], + Category.PERFORMANCE: ['slow', 'performance', 'latency', 'speed', 'fast', 'optimize', 'memory'], + Category.SECURITY: ['security', 'vulnerability', 'exploit', 'xss', 'injection', 'csrf', 'auth'], + Category.QUESTION: ['question', 'how to', 'help', 'confusion', 'unclear', 'clarify'], + Category.REFACTOR: ['refactor', 'clean up', 'reorganize', 'restructure', 'simplify'], + Category.TECH_DEBT: ['tech debt', 'technical debt', 'legacy', 'deprecated', 'cleanup'], + } + + # Priority indicators from labels + PRIORITY_LABELS = { + Priority.CRITICAL: ['critical', 'blocker', 'urgent'], + Priority.HIGH: ['high', 'important', 'priority'], + Priority.MEDIUM: ['medium'], + Priority.LOW: ['low', 'minor', 'trivial'], + } + + def categorize(self, issue: Issue) -> Category: + """Determine category based on title, body, and labels""" + text = f"{issue.title} {issue.body or ''}".lower() + + # Check labels first + for label in issue.labels: + label_lower = label.lower() + if any(cat_str in label_lower for cat_str in ['bug', 'defect']): + return Category.BUG + if any(cat_str in label_lower for cat_str in ['feature', 'enhancement']): + return Category.FEATURE + if 'doc' in label_lower: + return Category.DOCUMENTATION + if 'perf' in label_lower: + return Category.PERFORMANCE + if 'security' in label_lower: + return Category.SECURITY + + # Check keywords + for category, keywords in self.CATEGORY_KEYWORDS.items(): + if any(keyword in text for keyword in keywords): + return category + + return Category.OTHER + + def determine_priority(self, issue: Issue) -> Priority: + """Determine priority based on labels and metadata""" + # Check labels + for label in issue.labels: + label_lower = label.lower() + for priority, keywords in self.PRIORITY_LABELS.items(): + if any(keyword in label_lower for keyword in keywords): + return priority + + # Infer from metadata + if issue.age_days > 90 and issue.state == 'open': + # Old open issues are lower priority + return Priority.LOW + + if issue.comments > 10: + # Highly discussed issues are important + return Priority.HIGH + + return Priority.MEDIUM + + def determine_triage_status(self, issue: Issue) -> TriagingStatus: + """Determine triage status""" + # Check labels + for label in issue.labels: + label_lower = label.lower() + if 'duplicate' in label_lower: + return TriagingStatus.DUPLICATE + if any(x in label_lower for x in ['invalid', 'wontfix', 'wont-fix']): + return TriagingStatus.INVALID + if 'blocked' in label_lower or 'blocking' in label_lower: + return TriagingStatus.BLOCKED + if any(x in label_lower for x in ['in-progress', 'in progress', 'working']): + return TriagingStatus.IN_PROGRESS + + # Check staleness + if issue.state.upper() == 'OPEN': + if issue.days_since_update and issue.days_since_update > 30: + return TriagingStatus.STALE + if not any(label.lower() in ['accepted', 'approved', 'ready'] for label in issue.labels): + return TriagingStatus.NEEDS_TRIAGE + return TriagingStatus.READY_FOR_DEV + + return TriagingStatus.COMPLETED + + +class IssueTriage: + """Main triage coordinator""" + + # Module repository mapping + MODULE_REPOS = { + 'builder': { + 'repo': 'bmad-code-org/bmad-builder', + 'names': ['bmb', 'builder', 'bmad-builder', 'agent builder', 'agent-builder'], + 'url': 'https://github.com/bmad-code-org/bmad-builder' + }, + 'tea': { + 'repo': 'bmad-code-org/bmad-method-test-architecture-enterprise', + 'names': ['tea', 'test architect', 'test-architect', 'test architecture'], + 'url': 'https://github.com/bmad-code-org/bmad-method-test-architecture-enterprise' + }, + 'bmgd': { + 'repo': 'bmad-code-org/bmad-module-game-dev-studio', + 'names': ['bmgd', 'game dev', 'game-dev', 'gamedev', 'game dev studio', 'game-dev-studio'], + 'url': 'https://github.com/bmad-code-org/bmad-module-game-dev-studio' + }, + 'cis': { + 'repo': 'bmad-code-org/bmad-module-creative-intelligence-suite', + 'names': ['cis', 'creative intelligence', 'creative-intelligence', 'creative intelligence suite'], + 'url': 'https://github.com/bmad-code-org/bmad-module-creative-intelligence-suite' + }, + } + + def __init__(self, repo: Optional[str] = None, state: str = 'open'): + self.repo = repo or self._detect_repo() + self.state = state + self.categorizer = IssueCategorizer() + self.issues: List[Issue] = [] + self._repo_url = self.repo # Store for issue URL generation + + def _detect_repo(self) -> str: + """Detect repository from git remote""" + try: + result = subprocess.run( + ['git', 'remote', 'get-url', 'origin'], + capture_output=True, + text=True, + check=True + ) + url = result.stdout.strip() + # Convert git@github.com:user/repo.git to user/repo + if url.startswith('git@github.com:'): + return url[15:-4] + if url.startswith('https://github.com/'): + return url[19:-4] + except subprocess.CalledProcessError: + pass + return 'unknown/repo' + + def fetch_issues(self) -> List[Issue]: + """Fetch issues using gh CLI""" + print(f"Fetching issues from {self.repo}...") + + cmd = [ + 'gh', 'issue', 'list', + '--repo', self.repo, + '--state', self.state, + '--limit', '1000', # Fetch up to 1000 issues (default is 30) + '--json', 'number,title,state,author,createdAt,updatedAt,labels,body,comments' + ] + + result = subprocess.run(cmd, capture_output=True, text=True, check=True) + data = json.loads(result.stdout) + + self.issues = [] + for item in data: + labels = [label['name'] for label in item.get('labels', [])] + issue = Issue( + number=item['number'], + title=item['title'], + state=item['state'], + author=item['author']['login'], + created_at=datetime.fromisoformat(item['createdAt'].replace('Z', '+00:00')), + updated_at=datetime.fromisoformat(item['updatedAt'].replace('Z', '+00:00')) if item.get('updatedAt') else None, + labels=labels, + body=item.get('body'), + comments=len(item.get('comments', [])) + ) + issue._repo_url = self._repo_url + self.issues.append(issue) + + print(f"Fetched {len(self.issues)} issues") + return self.issues + + def analyze_issues(self, focus_filter: Optional[str] = None) -> List[Issue]: + """Analyze and categorize all issues""" + print("Analyzing issues...") + + for issue in self.issues: + issue.category = self.categorizer.categorize(issue) + issue.priority = self.categorizer.determine_priority(issue) + issue.triage_status = self.categorizer.determine_triage_status(issue) + + # Apply focus filter if provided + if focus_filter: + keywords = focus_filter.lower().split() + self.issues = [ + issue for issue in self.issues + if any(keyword in f"{issue.title} {issue.body or ''}".lower() + for keyword in keywords) + ] + print(f"Filtered to {len(self.issues)} issues matching focus criteria") + + return self.issues + + def find_duplicates(self, threshold: float = 0.7) -> List[Tuple[Issue, Issue, float]]: + """Find potential duplicate issues based on title similarity""" + print("Detecting potential duplicates...") + duplicates = [] + open_issues = [i for i in self.issues if i.state.upper() == 'OPEN'] + + for i, issue1 in enumerate(open_issues): + for issue2 in open_issues[i+1:]: + # Skip if already marked as duplicate + if 'duplicate' in [l.lower() for l in issue1.labels + issue2.labels]: + continue + + # Calculate title similarity + similarity = SequenceMatcher(None, issue1.title.lower(), issue2.title.lower()).ratio() + + if similarity >= threshold: + duplicates.append((issue1, issue2, similarity)) + + # Sort by similarity (highest first) + duplicates.sort(key=lambda x: x[2], reverse=True) + return duplicates + + def find_outdated_issues(self, before_date: datetime = None) -> Dict[str, List[Issue]]: + """Find issues that are likely outdated""" + print("Identifying outdated issues...") + + if before_date is None: + # Default to December 1, 2025 + before_date = datetime(2025, 12, 1, tzinfo=timezone.utc) + + outdated = { + 'old_issues': [], + 'v4_issues': [], + 'ancient_stale': [] + } + + open_issues = [i for i in self.issues if i.state.upper() == 'OPEN'] + + for issue in open_issues: + # Issues created before cutoff date + if issue.created_at < before_date: + outdated['old_issues'].append(issue) + + # Issues mentioning v4 + text = f"{issue.title} {issue.body or ''}".lower() + if 'v4' in text or 'version 4' in text or 'v 4' in text: + outdated['v4_issues'].append(issue) + + # Issues very old and stale (>90 days since update) + if issue.age_days > 90 and (issue.days_since_update or 0) > 90: + outdated['ancient_stale'].append(issue) + + return outdated + + def generate_bulk_commands(self, issues: List[Issue], label: str) -> List[str]: + """Generate gh CLI commands for bulk operations""" + commands = [] + for issue in issues: + cmd = f"gh issue edit {issue.number} --repo {self.repo} --add-label '{label}'" + commands.append(cmd) + return commands + + def generate_close_commands(self, issues: List[Issue], reason: str) -> List[str]: + """Generate gh CLI commands to close issues with comment""" + commands = [] + for issue in issues: + comment = reason.replace("'", "'\\''") # Escape single quotes + cmd = (f"gh issue close {issue.number} --repo {self.repo} " + f"--comment '{comment}'") + commands.append(cmd) + return commands + + def find_cross_repo_issues(self) -> Dict[str, List[Tuple[Issue, str]]]: + """Find issues that belong in other module repositories""" + print("Detecting cross-repo issues...") + cross_repo = defaultdict(list) + + open_issues = [i for i in self.issues if i.state.upper() == 'OPEN'] + + for issue in open_issues: + text = f"{issue.title} {issue.body or ''}".lower() + + for module_key, module_info in self.MODULE_REPOS.items(): + # Check if issue mentions this module + for name in module_info['names']: + # Use word boundaries to avoid false positives + pattern = r'\b' + re.escape(name) + r'\b' + if re.search(pattern, text): + cross_repo[module_key].append((issue, name)) + break # Only add once per issue + + return cross_repo + + def generate_actionable_recommendations(self) -> str: + """Generate actionable recommendations with specific commands""" + lines = [] + open_issues = [i for i in self.issues if i.state.upper() == 'OPEN'] + + lines.append("## 🎯 Actionable Recommendations\n") + + # Cross-repo issues (show first!) + cross_repo_issues = self.find_cross_repo_issues() + if cross_repo_issues: + total_cross = sum(len(issues) for issues in cross_repo_issues.values()) + lines.append(f"### Issues in Wrong Repository ({total_cross} issues)\n") + lines.append("**High Priority.** These issues should be closed here and opened in the correct module repository:\n") + + for module_key, issues in cross_repo_issues.items(): + if issues: + module_info = self.MODULE_REPOS[module_key] + lines.append(f"#### {module_info['repo'].replace('bmad-code-org/', '').title()} ({len(issues)} issues)") + lines.append(f"**Correct repo:** [{module_info['repo']}]({module_info['url']}/issues/new)\n") + lines.append(f"**Close these and report in the correct repo:**") + lines.append(f"```bash") + + for issue, matched_name in issues[:10]: # Show first 10 + comment = (f"This issue relates to {matched_name} which is maintained in a separate repository. " + f"Please report this issue at {module_info['url']}/issues/new") + lines.append(f"gh issue close {issue.number} --repo {self.repo} --comment '{comment}'") + + if len(issues) > 10: + lines.append(f"# ... and {len(issues) - 10} more") + lines.append(f"```\n") + + # Find duplicates + duplicates = self.find_duplicates() + if duplicates: + lines.append(f"### Potential Duplicates ({len(duplicates)} pairs)\n") + lines.append("**Manual review required.** Close the older issue as a duplicate of the newer one:\n") + for issue1, issue2, similarity in duplicates[:20]: # Top 20 + older = issue1 if issue1.created_at < issue2.created_at else issue2 + newer = issue2 if issue1.created_at < issue2.created_at else issue1 + lines.append(f"#### {older.title}") + lines.append(f"- **Older:** #{older.number} ({older.age_days} days old)") + lines.append(f"- **Newer:** #{newer.number} ({newer.age_days} days old)") + lines.append(f"- **Similarity:** {similarity:.1%}") + lines.append(f"- **Command:** `gh issue close {older.number} --repo {self.repo} --comment 'Duplicate of #{newer.number}' --duplicate-of {newer.number}`") + lines.append("") + + # Find outdated issues + outdated = self.find_outdated_issues() + total_outdated = len(outdated['old_issues']) + len(outdated['v4_issues']) + len(outdated['ancient_stale']) + + if total_outdated > 0: + lines.append(f"### Outdated Issues ({total_outdated} total)\n") + + # Pre-Dec 2025 issues + if outdated['old_issues']: + cutoff_date = datetime(2025, 12, 1, tzinfo=timezone.utc).strftime('%B %Y') + lines.append(f"#### Issues from before {cutoff_date} ({len(outdated['old_issues'])})") + lines.append(f"These issues are quite old and may no longer be relevant. Consider reviewing and closing outdated ones.\n") + lines.append("**To add label for review:**") + lines.append(f"```bash") + for issue in outdated['old_issues'][:10]: # Show first 10 + lines.append(f"gh issue edit {issue.number} --repo {self.repo} --add-label 'outdated,needs-review'") + if len(outdated['old_issues']) > 10: + lines.append(f"# ... and {len(outdated['old_issues']) - 10} more") + lines.append(f"```\n") + + # v4-related issues + if outdated['v4_issues']: + lines.append(f"#### v4-Related Issues ({len(outdated['v4_issues'])})") + lines.append(f"BMad Method v4 is deprecated. These issues likely no longer apply to v6.\n") + lines.append("**Bulk close with comment:**") + lines.append(f"```bash") + for issue in outdated['v4_issues'][:10]: + lines.append(f"gh issue close {issue.number} --repo {self.repo} --comment 'Closing as this relates to BMad Method v4 which is deprecated. Please open a new issue if this still applies to v6.'") + if len(outdated['v4_issues']) > 10: + lines.append(f"# ... and {len(outdated['v4_issues']) - 10} more") + lines.append(f"```\n") + + # Ancient stale issues + if outdated['ancient_stale']: + lines.append(f"#### Ancient Stale Issues ({len(outdated['ancient_stale'])})") + lines.append(f"Issues that are both very old (>90 days) and haven't been updated in >90 days.\n") + lines.append("**Close as stale:**") + lines.append(f"```bash") + for issue in outdated['ancient_stale'][:10]: + lines.append(f"gh issue close {issue.number} --repo {self.repo} --comment 'Closing due to inactivity. Please reopen if this is still relevant.'") + if len(outdated['ancient_stale']) > 10: + lines.append(f"# ... and {len(outdated['ancient_stale']) - 10} more") + lines.append(f"```\n") + + # Bulk tagging suggestions + lines.append("### Bulk Tagging Suggestions\n") + lines.append("Add appropriate labels to untagged issues:\n") + + # Find issues without category labels + untagged = [i for i in open_issues if not any( + l.lower() in ['bug', 'feature', 'enhancement', 'documentation', 'performance', 'question', 'refactor', 'tech-debt'] + for l in i.labels + )] + + if untagged: + lines.append(f"**Issues without category labels ({len(untagged)}):**\n") + by_category = defaultdict(list) + for issue in untagged: + by_category[issue.category.value].append(issue) + + for category, issues in sorted(by_category.items(), key=lambda x: len(x[1]), reverse=True)[:5]: + lines.append(f"##### Label as `{category}` ({len(issues)} issues)") + lines.append(f"```bash") + for issue in issues[:5]: + lines.append(f"gh issue edit {issue.number} --repo {self.repo} --add-label '{category}'") + if len(issues) > 5: + lines.append(f"# ... and {len(issues) - 5} more") + lines.append(f"```\n") + + # Priority labeling + no_priority = [i for i in open_issues if not any( + l.lower() in ['critical', 'high', 'medium', 'low', 'priority'] + for l in i.labels + )] + + if no_priority: + # Group by priority + by_priority = defaultdict(list) + for issue in no_priority: + by_priority[issue.priority.value].append(issue) + + lines.append("**Add priority labels:**\n") + for priority_level in ['critical', 'high', 'medium', 'low']: + if priority_level in by_priority: + count = len(by_priority[priority_level]) + lines.append(f"##### Label as `{priority_level}` priority ({count} issues)") + lines.append(f"```bash") + for issue in by_priority[priority_level][:5]: + lines.append(f"gh issue edit {issue.number} --repo {self.repo} --add-label '{priority_level}'") + if count > 5: + lines.append(f"# ... and {count - 5} more") + lines.append(f"```\n") + + return "\n".join(lines) + + def generate_report(self) -> str: + """Generate markdown triage report""" + lines = [] + + # Summary + lines.append("# GitHub Issue Triage Report\n") + lines.append(f"**Repository:** {self.repo}\n") + lines.append(f"**Generated:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S UTC')}\n") + + # Count stats + total = len(self.issues) + open_issues = [i for i in self.issues if i.state.upper() == 'OPEN'] + closed_issues = [i for i in self.issues if i.state.upper() == 'CLOSED'] + + lines.append("## Summary\n") + lines.append(f"- **Total Issues:** {total}") + lines.append(f"- **Open:** {len(open_issues)} | **Closed:** {len(closed_issues)}") + + # Category breakdown + category_counts = defaultdict(int) + for issue in self.issues: + category_counts[issue.category] += 1 + top_categories = sorted(category_counts.items(), key=lambda x: x[1], reverse=True)[:5] + lines.append(f"- **Top Categories:** {', '.join(f'{cat.value} ({count})' for cat, count in top_categories)}") + lines.append("") + + # Priority action items + lines.append("## Priority Action Items\n") + + # Critical/High priority open issues + critical_issues = [i for i in open_issues if i.priority in [Priority.CRITICAL, Priority.HIGH]] + if critical_issues: + lines.append(f"### {'🚨 ' if critical_issues else ''}Critical & High Priority ({len(critical_issues)})\n") + for issue in sorted(critical_issues, key=lambda x: x.age_days, reverse=True): + lines.append(f"- [#{issue.number}]({issue.url}) {issue.title}") + lines.append(f" - {issue.category.value.upper()} | {issue.priority.value.upper()} | Age: {issue.age_days} days") + if issue.labels: + lines.append(f" - Labels: {', '.join(issue.labels)}") + lines.append("") + + # Stale issues needing review + stale_issues = [i for i in open_issues if i.triage_status == TriagingStatus.STALE] + if stale_issues: + lines.append(f"### Stale Issues - Needs Review ({len(stale_issues)})\n") + for issue in sorted(stale_issues, key=lambda x: x.days_since_update or 0, reverse=True)[:15]: + days_stale = issue.days_since_update or 0 + lines.append(f"- [#{issue.number}]({issue.url}) {issue.title}") + lines.append(f" - Last updated {days_stale} days ago | {issue.category.value}") + lines.append("") + + # Categories + lines.append("## Categories\n") + + for category in Category: + category_issues = [i for i in self.issues if i.category == category] + if not category_issues: + continue + + open_in_cat = [i for i in category_issues if i.state.upper() == 'OPEN'] + closed_in_cat = [i for i in category_issues if i.state.upper() == 'CLOSED'] + + lines.append(f"### {category.value.title()} ({len(open_in_cat)} open, {len(closed_in_cat)} closed)\n") + + # Sort open by priority + priority_order = {Priority.CRITICAL: 0, Priority.HIGH: 1, Priority.MEDIUM: 2, Priority.LOW: 3, Priority.INFORMATIONAL: 4} + open_in_cat_sorted = sorted(open_in_cat, key=lambda x: priority_order.get(x.priority, 5)) + + for issue in open_in_cat_sorted[:20]: # Limit to 20 per category + status_icon = { + TriagingStatus.NEEDS_TRIAGE: '🔍', + TriagingStatus.READY_FOR_DEV: '✅', + TriagingStatus.BLOCKED: '🚫', + TriagingStatus.STALE: '💤', + TriagingStatus.IN_PROGRESS: '🔧', + }.get(issue.triage_status, '') + + lines.append(f"{status_icon} [#{issue.number}]({issue.url}) {issue.title}") + lines.append(f"

Details") + lines.append(f" ") + lines.append(f" - **Priority:** {issue.priority.value}") + lines.append(f" - **Status:** {issue.triage_status.value}") + lines.append(f" - **Age:** {issue.age_days} days") + lines.append(f" - **Author:** {issue.author}") + if issue.labels: + lines.append(f" - **Labels:** {', '.join(issue.labels)}") + lines.append(f"
") + lines.append("") + + if len(open_in_cat) > 20: + lines.append(f"*... and {len(open_in_cat) - 20} more*\n") + + # Actionable recommendations + lines.append(self.generate_actionable_recommendations()) + + # Cleanup candidates + lines.append("## Cleanup Candidates\n") + + duplicates = [i for i in self.issues if i.triage_status == TriagingStatus.DUPLICATE] + if duplicates: + lines.append(f"### Duplicates ({len(duplicates)})\n") + for issue in duplicates: + lines.append(f"- [#{issue.number}]({issue.url}) {issue.title}") + + invalid = [i for i in self.issues if i.triage_status == TriagingStatus.INVALID] + if invalid: + lines.append(f"\n### Invalid/Wontfix ({len(invalid)})\n") + for issue in invalid: + lines.append(f"- [#{issue.number}]({issue.url}) {issue.title}") + + lines.append("\n---\n") + lines.append("*Report generated by BMad Issue Triage Tool*") + + return "\n".join(lines) + + +def main(): + parser = argparse.ArgumentParser( + description='Triage and categorize GitHub issues', + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +Examples: + %(prog)s # Triage open issues in current repo + %(prog)s --state all # All issues (including closed) + %(prog)s --focus "installer" # Filter for installer-related issues + %(prog)s --repo user/repo --state closed + """ + ) + + parser.add_argument('--repo', help='Repository (default: detect from git)') + parser.add_argument('--state', choices=['all', 'open', 'closed'], default='open', + help='Filter by state (default: open)') + parser.add_argument('--focus', help='Focus context to filter issues') + parser.add_argument('--output', '-o', help='Output file (default: _bmad-output/triage-reports/triage-.md)') + parser.add_argument('--json', action='store_true', help='Output as JSON') + + args = parser.parse_args() + + # Set default output to _bmad-output/triage-reports if not specified + if not args.output and not args.json: + os.makedirs('_bmad-output/triage-reports', exist_ok=True) + output_date = datetime.now().strftime('%Y-%m-%d') + args.output = f'_bmad-output/triage-reports/triage-{output_date}.md' + + triage = IssueTriage(repo=args.repo, state=args.state) + triage.fetch_issues() + triage.analyze_issues(focus_filter=args.focus) + + if args.json: + # Output as JSON for further processing + data = [ + { + 'number': i.number, + 'title': i.title, + 'state': i.state, + 'category': i.category.value, + 'priority': i.priority.value, + 'triage_status': i.triage_status.value, + 'age_days': i.age_days, + 'url': i.url, + 'labels': i.labels, + 'author': i.author + } + for i in triage.issues + ] + output = json.dumps(data, indent=2) + else: + output = triage.generate_report() + + if args.output: + with open(args.output, 'w') as f: + f.write(output) + # Get relative path for nicer output + rel_path = args.output.replace('./', '') + print(f"✅ Report saved to: {rel_path}") + else: + print(output) + + +if __name__ == '__main__': + main() diff --git a/.github/ISSUE_TEMPLATE/bug-report.yaml b/.github/ISSUE_TEMPLATE/bug-report.yaml new file mode 100644 index 00000000..6c5507d9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yaml @@ -0,0 +1,124 @@ +name: Bug Report +description: File a bug report to help us improve BMad Method +title: "[BUG] " +labels: bug +assignees: [] +body: + - type: markdown + attributes: + value: | + Thanks for filing a bug report! Please fill out the information below to help us reproduce and fix the issue. + + - type: textarea + id: description + attributes: + label: Description + description: Clear and concise description of what the bug is + placeholder: e.g., When I run /dev-story, it crashes on step 3 + validations: + required: true + + - type: textarea + id: steps + attributes: + label: Steps to reproduce + description: Step-by-step instructions to reproduce the behavior + placeholder: | + 1. Run 'npx bmad-method install' + 2. Select option X + 3. Run workflow Y + 4. See error + validations: + required: true + + - type: textarea + id: expected + attributes: + label: Expected behavior + description: What you expected to happen + placeholder: The workflow should complete successfully + validations: + required: true + + - type: textarea + id: actual + attributes: + label: Actual behavior + description: What actually happened + placeholder: The workflow crashed with error "..." + validations: + required: true + + - type: textarea + id: screenshots + attributes: + label: Screenshots + description: Add screenshots if applicable (paste images directly) + placeholder: Paste any relevant screenshots here + + - type: dropdown + id: module + attributes: + label: Which module is this for? + description: Select the BMad module this issue relates to + options: + - BMad Method (BMM) - Core Framework + - BMad Builder (BMB) - Agent Builder Tool + - Test Architect (TEA) - Test Strategy Module + - Game Dev Studio (BMGD) - Game Development Module + - Creative Intelligence Suite (CIS) - Innovation Module + - Not sure / Other + validations: + required: true + + - type: input + id: version + attributes: + label: BMad Version + description: "Check with: npx bmad-method --version or check package.json" + placeholder: e.g., 6.0.0-Beta.4 + validations: + required: true + + - type: dropdown + id: ide + attributes: + label: Which AI IDE are you using? + options: + - Claude Code + - Cursor + - Windsurf + - Copilot CLI / GitHub Copilot + - Kilo Code + - Other + validations: + required: true + + - type: dropdown + id: platform + attributes: + label: Operating System + options: + - macOS + - Windows + - Linux + - Other + validations: + required: true + + - type: textarea + id: logs + attributes: + label: Relevant log output + description: Copy and paste any relevant log output + render: shell + + - type: checkboxes + id: terms + attributes: + label: Confirm + options: + - label: I've searched for existing issues + required: true + - label: I'm using the latest version + required: false diff --git a/.github/ISSUE_TEMPLATE/documentation.yaml b/.github/ISSUE_TEMPLATE/documentation.yaml new file mode 100644 index 00000000..00729a36 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation.yaml @@ -0,0 +1,55 @@ +name: Documentation +description: Report issues or suggest improvements to documentation +title: "[DOCS] " +labels: documentation +assignees: [] +body: + - type: markdown + attributes: + value: | + Help us improve the BMad Method documentation! + + - type: dropdown + id: doc-type + attributes: + label: What type of documentation issue is this? + options: + - Error or inaccuracy + - Missing information + - Unclear or confusing + - Outdated content + - Request for new documentation + - Typo or grammar + validations: + required: true + + - type: textarea + id: location + attributes: + label: Documentation location + description: Where is the documentation that needs improvement? + placeholder: e.g., http://docs.bmad-method.org/tutorials/getting-started/ or "In the README" + validations: + required: true + + - type: textarea + id: issue + attributes: + label: What's the issue? + description: Describe the documentation issue in detail + placeholder: e.g., Step 3 says to run command X but it should be command Y + validations: + required: true + + - type: textarea + id: suggestion + attributes: + label: Suggested improvement + description: How would you like to see this improved? + placeholder: e.g., Change the command to X and add an example + + - type: input + id: version + attributes: + label: BMad Version (if applicable) + placeholder: e.g., 6.0.0-Beta.4 diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature-request.md similarity index 100% rename from .github/ISSUE_TEMPLATE/feature_request.md rename to .github/ISSUE_TEMPLATE/feature-request.md diff --git a/.gitignore b/.gitignore index 885cb245..6af83303 100644 --- a/.gitignore +++ b/.gitignore @@ -50,7 +50,7 @@ _bmad-output .qwen .rovodev .kilocodemodes -.claude +.claude/commands .codex .github/chatmodes .github/agents From bdcd8afa422b5f12d90acc6bd2bd238e9397c7d9 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 31 Jan 2026 21:21:15 -0600 Subject: [PATCH 09/13] gh triage report creator --- .../bmad-bmm-generate-project-context.md | 13 +- .claude/skills/gh-triage/SKILL.md | 176 ++++- .claude/skills/gh-triage/scripts/gh_triage.py | 713 ------------------ 3 files changed, 140 insertions(+), 762 deletions(-) delete mode 100755 .claude/skills/gh-triage/scripts/gh_triage.py diff --git a/.claude/commands/bmad-bmm-generate-project-context.md b/.claude/commands/bmad-bmm-generate-project-context.md index 7c17f855..452871c3 100644 --- a/.claude/commands/bmad-bmm-generate-project-context.md +++ b/.claude/commands/bmad-bmm-generate-project-context.md @@ -1,14 +1,7 @@ --- name: 'generate-project-context' -description: 'Scan existing codebase to generate a lean LLM-optimized project-context.md with critical implementation rules and patterns for AI agents' +description: 'Creates a concise project-context.md file with critical rules and patterns that AI agents must follow when implementing code. Optimized for LLM context efficiency.' +disable-model-invocation: true --- -IT IS CRITICAL THAT YOU FOLLOW THESE STEPS - while staying in character as the current agent persona you may have loaded: - - -1. Always LOAD the FULL @{project-root}/_bmad/core/tasks/workflow.xml -2. READ its entire contents - this is the CORE OS for EXECUTING the specific workflow-config @{project-root}/_bmad/bmm/workflows/generate-project-context/workflow.md -3. Pass the yaml path @{project-root}/_bmad/bmm/workflows/generate-project-context/workflow.md as 'workflow-config' parameter to the workflow.xml instructions -4. Follow workflow.xml instructions EXACTLY as written to process and follow the specific workflow config and its instructions -5. Save outputs after EACH section when generating any documents from templates - +IT IS CRITICAL THAT YOU FOLLOW THIS COMMAND: LOAD the FULL @{project-root}/_bmad/bmm/workflows/generate-project-context/workflow.md, READ its entire contents and follow its directions exactly! diff --git a/.claude/skills/gh-triage/SKILL.md b/.claude/skills/gh-triage/SKILL.md index a198fc0d..59795159 100644 --- a/.claude/skills/gh-triage/SKILL.md +++ b/.claude/skills/gh-triage/SKILL.md @@ -1,60 +1,158 @@ --- name: gh-triage -description: Fetch all GitHub issues via gh CLI and provide consolidated AI-powered analysis with clustering, prioritization, and actionable insights. Use for issue triage, backlog cleanup, or when user mentions "issues", "triage", or "backlog". +description: Fetch all GitHub issues via gh CLI and use AI agents to deeply analyze, cluster, and prioritize issues with actual understanding. Use for issue triage, backlog cleanup, or when user mentions "issues", "triage", or "backlog". license: MIT +disable-model-invocation: true metadata: author: bmad-code-org - version: "2.1.0" + version: "3.0.0" anthropic-internal: Core team issue triage tool for BMad Method repositories min-github-cli-version: "2.0" -compatibility: Requires gh CLI, Python 3.8+, and git repository +compatibility: Requires gh CLI, git repository, and BMad Method with Task tool support --- -# GitHub Issue Triage +# GitHub Issue Triage with AI Analysis -**IMPORTANT:** Never include time or effort estimates in output or recommendations. +**CRITICAL RULES:** +- NEVER include time or effort estimates in output or recommendations +- Focus on WHAT needs to be done, not HOW LONG it takes +- Use Bash tool with gh CLI for all GitHub operations -## What This Does +## Execution Plan -1. **Fetch all issues** from repository via gh CLI (configurable: open/closed/all) -2. **Extract data** into structured format (JSON + markdown tables) -3. **Generate AI analysis** with: - - Issue clustering by theme - - Priority recommendations - - Actionable insights - - Cross-repo detection - - Cleanup candidates +You will perform GitHub issue triage using AI agents for deep analysis: -## Steps +### Step 1: Fetch Issues +Use `gh issue list` to fetch all open issues from the current repository in JSON format. -```bash -# 1. Navigate to scripts directory -cd .claude/skills/gh-triage/scripts +### Step 2: Batch Creation +Split issues into batches of ~10 issues each for parallel analysis. -# 2. Run the triage tool (outputs to _bmad-output/triage-reports/) -python3 gh_triage.py --state open +### Step 3: Parallel Agent Analysis +For EACH batch, use the Task tool with `subagent_type=general-purpose` to launch an agent with this prompt: -# 3. Review the generated report -cat _bmad-output/triage-reports/triage-*.md +``` +You are analyzing a batch of GitHub issues for deep understanding and triage. + +**YOUR TASK:** +Read the issues in your batch and provide DEEP analysis: + +1. **For EACH issue, analyze:** + - What is this ACTUALLY about? (beyond keywords) + - What component/system does it affect? + - What's the impact and severity? + - Is it a bug, feature request, or something else? + - What specific theme does it belong to? + +2. **PRIORITY ASSESSMENT:** + - CRITICAL: Blocks users, security issues, data loss, broken installers + - HIGH: Major functionality broken, important features missing + - MEDIUM: Workarounds available, minor bugs, nice-to-have features + - LOW: Edge cases, cosmetic issues, questions + +3. **RELATIONSHIPS:** + - Duplicates: Near-identical issues about the same problem + - Related: Issues connected by theme or root cause + - Dependencies: One issue blocks or requires another + +**YOUR BATCH:** +[Paste the batch of issues here - each with number, title, body, labels] + +**OUTPUT FORMAT (JSON only, no markdown):** +{ + "issues": [ + { + "number": 123, + "title": "issue title", + "deep_understanding": "2-3 sentences explaining what this is really about", + "affected_components": ["installer", "workflows", "docs"], + "issue_type": "bug/feature/question/tech-debt", + "priority": "CRITICAL/HIGH/MEDIUM/LOW", + "priority_rationale": "Why this priority level", + "theme": "installation/workflow/integration/docs/ide-support/etc", + "relationships": { + "duplicates_of": [456], + "related_to": [789, 101], + "blocks": [111] + } + } + ], + "cross_repo_issues": [ + {"number": 123, "target_repo": "bmad-builder", "reason": "about agent builder"} + ], + "cleanup_candidates": [ + {"number": 456, "reason": "v4-related/outdated/duplicate"} + ], + "themes_found": { + "Installation Blockers": { + "count": 5, + "root_cause": "Common pattern if identifiable" + } + } +} + +Return ONLY valid JSON. No explanations outside the JSON structure. ``` -## Command Reference +### Step 4: Consolidate & Generate Report +After all agents complete, create a comprehensive markdown report saved to `_bmad-output/triage-reports/triage-YYYY-MM-DD.md` with: -| Parameter | Description | Default | -| ---------------- | ------------------------------------------ | -------------------------------------------------- | -| `--repo` | Repository (auto-detected from git remote) | current repo | -| `--state` | Filter: `all`, `open`, `closed` | `open` | -| `--focus` | Filter by keywords in title/body | none | -| `--output`, `-o` | Save output to file | `_bmad-output/triage-reports/triage-YYYY-MM-DD.md` | -| `--json` | Output as JSON instead of markdown | false (outputs to stdout) | -| `--limit` | Max issues to fetch | 1000 | +## Report Structure -## Output +### Executive Summary +- Total issues analyzed +- Issue count by priority (CRITICAL, HIGH, MEDIUM, LOW) +- Major themes discovered +- Top 5 critical issues requiring immediate attention -All reports automatically save to `_bmad-output/triage-reports/` with: -- Summary statistics -- Issue clusters by theme -- Priority matrix -- Actionable recommendations -- Cross-repo issues with close commands -- Cleanup candidates (duplicates, stale, outdated) +### Critical Issues (CRITICAL Priority) +For each CRITICAL issue: +- **#123 - [Issue Title](url)** +- **What it's about:** [Deep understanding] +- **Affected:** [Components] +- **Why Critical:** [Rationale] +- **Suggested Action:** [Specific action] + +### High Priority Issues (HIGH Priority) +Same format as Critical, grouped by theme. + +### Theme Clusters +For each major theme: +- **Theme Name** (N issues) +- **What connects these:** [Pattern] +- **Root cause:** [If identifiable] +- **Consolidated actions:** [Bulk actions if applicable] +- **Issues:** #123, #456, #789 + +### Relationships & Dependencies +- **Duplicates:** List pairs with `gh issue close` commands +- **Related Issues:** Groups of related issues +- **Dependencies:** Blocking relationships + +### Cross-Repo Issues +Issues that should be migrated to other repositories (bmad-builder, bmad-module-creative-intelligence-suite, bmad-module-game-dev-studio, bmad-method-test-architecture-enterprise). + +For each, provide: +``` +gh issue close XXX --repo CURRENT_REPO --comment "This issue belongs in REPO. Please report at https://github.com/TARGET_REPO/issues/new" +``` + +### Cleanup Candidates +- **v4-related:** Deprecated version issues with close commands +- **Stale:** No activity >30 days +- **Low priority + old:** Low priority issues >60 days old + +### Actionable Next Steps +Specific, prioritized actions: +1. [CRITICAL] Fix broken installer - affects all new users +2. [HIGH] Resolve Windows path escaping issues +3. [HIGH] Address workflow integration bugs +etc. + +Include `gh` commands where applicable for bulk actions. + +--- + +## Execute Now + +Begin by fetching issues from the current repository and follow the plan above. diff --git a/.claude/skills/gh-triage/scripts/gh_triage.py b/.claude/skills/gh-triage/scripts/gh_triage.py deleted file mode 100755 index e73da756..00000000 --- a/.claude/skills/gh-triage/scripts/gh_triage.py +++ /dev/null @@ -1,713 +0,0 @@ -#!/usr/bin/env python3 -""" -GitHub Issue Triage Tool - -Fetches, categorizes, and groups GitHub issues for efficient triage. -Optimized for large datasets with parallel processing support. - -IMPORTANT: Never provide time, date, or effort estimates in output. -AI execution speed varies greatly from human timelines. -Focus on what needs to be done, not how long it takes. -""" - -import argparse -import json -import os -import re -import subprocess -from collections import defaultdict -from dataclasses import dataclass, field -from datetime import datetime, timedelta, timezone -from typing import List, Dict, Any, Optional, Set, Tuple -from enum import Enum -from difflib import SequenceMatcher -import re - - -class Category(Enum): - """Issue categories""" - BUG = "bug" - FEATURE = "feature" - ENHANCEMENT = "enhancement" - DOCUMENTATION = "documentation" - PERFORMANCE = "performance" - SECURITY = "security" - QUESTION = "question" - REFACTOR = "refactor" - TECH_DEBT = "tech-debt" - OTHER = "other" - - -class Priority(Enum): - """Priority levels""" - CRITICAL = "critical" - HIGH = "high" - MEDIUM = "medium" - LOW = "low" - INFORMATIONAL = "informational" - - -class TriagingStatus(Enum): - """Triage status""" - NEEDS_TRIAGE = "needs-triage" - READY_FOR_DEV = "ready-for-dev" - BLOCKED = "blocked" - STALE = "stale" - DUPLICATE = "duplicate" - INVALID = "invalid" - IN_PROGRESS = "in-progress" - COMPLETED = "completed" - - -@dataclass -class Issue: - """Represents a GitHub issue with triage metadata""" - number: int - title: str - state: str - author: str - created_at: datetime - updated_at: Optional[datetime] - labels: List[str] - body: Optional[str] - comments: int - category: Category = field(default=Category.OTHER) - priority: Priority = field(default=Priority.MEDIUM) - triage_status: TriagingStatus = field(default=TriagingStatus.NEEDS_TRIAGE) - - @property - def age_days(self) -> int: - """Age of issue in days""" - return (datetime.now(timezone.utc) - self.created_at).days - - @property - def days_since_update(self) -> Optional[int]: - """Days since last update""" - if not self.updated_at: - return None - return (datetime.now(timezone.utc) - self.updated_at).days - - @property - def url(self) -> str: - """GitHub URL for the issue""" - # Get from parent triage object - return f"https://github.com/{self._repo_url}/issues/{self.number}" - - -class IssueCategorizer: - """Categorizes issues based on content and metadata""" - - # Keywords for categorization - CATEGORY_KEYWORDS = { - Category.BUG: ['bug', 'fix', 'crash', 'error', 'broken', 'fails', 'exception', 'segfault', 'leak'], - Category.FEATURE: ['feature', 'add ', 'implement', 'support for', 'new ', 'request', 'wish'], - Category.ENHANCEMENT: ['enhance', 'improve', 'optimize', 'better', 'enhancement'], - Category.DOCUMENTATION: ['doc', 'readme', 'tutorial', 'guide', 'documentation', 'example', 'comment'], - Category.PERFORMANCE: ['slow', 'performance', 'latency', 'speed', 'fast', 'optimize', 'memory'], - Category.SECURITY: ['security', 'vulnerability', 'exploit', 'xss', 'injection', 'csrf', 'auth'], - Category.QUESTION: ['question', 'how to', 'help', 'confusion', 'unclear', 'clarify'], - Category.REFACTOR: ['refactor', 'clean up', 'reorganize', 'restructure', 'simplify'], - Category.TECH_DEBT: ['tech debt', 'technical debt', 'legacy', 'deprecated', 'cleanup'], - } - - # Priority indicators from labels - PRIORITY_LABELS = { - Priority.CRITICAL: ['critical', 'blocker', 'urgent'], - Priority.HIGH: ['high', 'important', 'priority'], - Priority.MEDIUM: ['medium'], - Priority.LOW: ['low', 'minor', 'trivial'], - } - - def categorize(self, issue: Issue) -> Category: - """Determine category based on title, body, and labels""" - text = f"{issue.title} {issue.body or ''}".lower() - - # Check labels first - for label in issue.labels: - label_lower = label.lower() - if any(cat_str in label_lower for cat_str in ['bug', 'defect']): - return Category.BUG - if any(cat_str in label_lower for cat_str in ['feature', 'enhancement']): - return Category.FEATURE - if 'doc' in label_lower: - return Category.DOCUMENTATION - if 'perf' in label_lower: - return Category.PERFORMANCE - if 'security' in label_lower: - return Category.SECURITY - - # Check keywords - for category, keywords in self.CATEGORY_KEYWORDS.items(): - if any(keyword in text for keyword in keywords): - return category - - return Category.OTHER - - def determine_priority(self, issue: Issue) -> Priority: - """Determine priority based on labels and metadata""" - # Check labels - for label in issue.labels: - label_lower = label.lower() - for priority, keywords in self.PRIORITY_LABELS.items(): - if any(keyword in label_lower for keyword in keywords): - return priority - - # Infer from metadata - if issue.age_days > 90 and issue.state == 'open': - # Old open issues are lower priority - return Priority.LOW - - if issue.comments > 10: - # Highly discussed issues are important - return Priority.HIGH - - return Priority.MEDIUM - - def determine_triage_status(self, issue: Issue) -> TriagingStatus: - """Determine triage status""" - # Check labels - for label in issue.labels: - label_lower = label.lower() - if 'duplicate' in label_lower: - return TriagingStatus.DUPLICATE - if any(x in label_lower for x in ['invalid', 'wontfix', 'wont-fix']): - return TriagingStatus.INVALID - if 'blocked' in label_lower or 'blocking' in label_lower: - return TriagingStatus.BLOCKED - if any(x in label_lower for x in ['in-progress', 'in progress', 'working']): - return TriagingStatus.IN_PROGRESS - - # Check staleness - if issue.state.upper() == 'OPEN': - if issue.days_since_update and issue.days_since_update > 30: - return TriagingStatus.STALE - if not any(label.lower() in ['accepted', 'approved', 'ready'] for label in issue.labels): - return TriagingStatus.NEEDS_TRIAGE - return TriagingStatus.READY_FOR_DEV - - return TriagingStatus.COMPLETED - - -class IssueTriage: - """Main triage coordinator""" - - # Module repository mapping - MODULE_REPOS = { - 'builder': { - 'repo': 'bmad-code-org/bmad-builder', - 'names': ['bmb', 'builder', 'bmad-builder', 'agent builder', 'agent-builder'], - 'url': 'https://github.com/bmad-code-org/bmad-builder' - }, - 'tea': { - 'repo': 'bmad-code-org/bmad-method-test-architecture-enterprise', - 'names': ['tea', 'test architect', 'test-architect', 'test architecture'], - 'url': 'https://github.com/bmad-code-org/bmad-method-test-architecture-enterprise' - }, - 'bmgd': { - 'repo': 'bmad-code-org/bmad-module-game-dev-studio', - 'names': ['bmgd', 'game dev', 'game-dev', 'gamedev', 'game dev studio', 'game-dev-studio'], - 'url': 'https://github.com/bmad-code-org/bmad-module-game-dev-studio' - }, - 'cis': { - 'repo': 'bmad-code-org/bmad-module-creative-intelligence-suite', - 'names': ['cis', 'creative intelligence', 'creative-intelligence', 'creative intelligence suite'], - 'url': 'https://github.com/bmad-code-org/bmad-module-creative-intelligence-suite' - }, - } - - def __init__(self, repo: Optional[str] = None, state: str = 'open'): - self.repo = repo or self._detect_repo() - self.state = state - self.categorizer = IssueCategorizer() - self.issues: List[Issue] = [] - self._repo_url = self.repo # Store for issue URL generation - - def _detect_repo(self) -> str: - """Detect repository from git remote""" - try: - result = subprocess.run( - ['git', 'remote', 'get-url', 'origin'], - capture_output=True, - text=True, - check=True - ) - url = result.stdout.strip() - # Convert git@github.com:user/repo.git to user/repo - if url.startswith('git@github.com:'): - return url[15:-4] - if url.startswith('https://github.com/'): - return url[19:-4] - except subprocess.CalledProcessError: - pass - return 'unknown/repo' - - def fetch_issues(self) -> List[Issue]: - """Fetch issues using gh CLI""" - print(f"Fetching issues from {self.repo}...") - - cmd = [ - 'gh', 'issue', 'list', - '--repo', self.repo, - '--state', self.state, - '--limit', '1000', # Fetch up to 1000 issues (default is 30) - '--json', 'number,title,state,author,createdAt,updatedAt,labels,body,comments' - ] - - result = subprocess.run(cmd, capture_output=True, text=True, check=True) - data = json.loads(result.stdout) - - self.issues = [] - for item in data: - labels = [label['name'] for label in item.get('labels', [])] - issue = Issue( - number=item['number'], - title=item['title'], - state=item['state'], - author=item['author']['login'], - created_at=datetime.fromisoformat(item['createdAt'].replace('Z', '+00:00')), - updated_at=datetime.fromisoformat(item['updatedAt'].replace('Z', '+00:00')) if item.get('updatedAt') else None, - labels=labels, - body=item.get('body'), - comments=len(item.get('comments', [])) - ) - issue._repo_url = self._repo_url - self.issues.append(issue) - - print(f"Fetched {len(self.issues)} issues") - return self.issues - - def analyze_issues(self, focus_filter: Optional[str] = None) -> List[Issue]: - """Analyze and categorize all issues""" - print("Analyzing issues...") - - for issue in self.issues: - issue.category = self.categorizer.categorize(issue) - issue.priority = self.categorizer.determine_priority(issue) - issue.triage_status = self.categorizer.determine_triage_status(issue) - - # Apply focus filter if provided - if focus_filter: - keywords = focus_filter.lower().split() - self.issues = [ - issue for issue in self.issues - if any(keyword in f"{issue.title} {issue.body or ''}".lower() - for keyword in keywords) - ] - print(f"Filtered to {len(self.issues)} issues matching focus criteria") - - return self.issues - - def find_duplicates(self, threshold: float = 0.7) -> List[Tuple[Issue, Issue, float]]: - """Find potential duplicate issues based on title similarity""" - print("Detecting potential duplicates...") - duplicates = [] - open_issues = [i for i in self.issues if i.state.upper() == 'OPEN'] - - for i, issue1 in enumerate(open_issues): - for issue2 in open_issues[i+1:]: - # Skip if already marked as duplicate - if 'duplicate' in [l.lower() for l in issue1.labels + issue2.labels]: - continue - - # Calculate title similarity - similarity = SequenceMatcher(None, issue1.title.lower(), issue2.title.lower()).ratio() - - if similarity >= threshold: - duplicates.append((issue1, issue2, similarity)) - - # Sort by similarity (highest first) - duplicates.sort(key=lambda x: x[2], reverse=True) - return duplicates - - def find_outdated_issues(self, before_date: datetime = None) -> Dict[str, List[Issue]]: - """Find issues that are likely outdated""" - print("Identifying outdated issues...") - - if before_date is None: - # Default to December 1, 2025 - before_date = datetime(2025, 12, 1, tzinfo=timezone.utc) - - outdated = { - 'old_issues': [], - 'v4_issues': [], - 'ancient_stale': [] - } - - open_issues = [i for i in self.issues if i.state.upper() == 'OPEN'] - - for issue in open_issues: - # Issues created before cutoff date - if issue.created_at < before_date: - outdated['old_issues'].append(issue) - - # Issues mentioning v4 - text = f"{issue.title} {issue.body or ''}".lower() - if 'v4' in text or 'version 4' in text or 'v 4' in text: - outdated['v4_issues'].append(issue) - - # Issues very old and stale (>90 days since update) - if issue.age_days > 90 and (issue.days_since_update or 0) > 90: - outdated['ancient_stale'].append(issue) - - return outdated - - def generate_bulk_commands(self, issues: List[Issue], label: str) -> List[str]: - """Generate gh CLI commands for bulk operations""" - commands = [] - for issue in issues: - cmd = f"gh issue edit {issue.number} --repo {self.repo} --add-label '{label}'" - commands.append(cmd) - return commands - - def generate_close_commands(self, issues: List[Issue], reason: str) -> List[str]: - """Generate gh CLI commands to close issues with comment""" - commands = [] - for issue in issues: - comment = reason.replace("'", "'\\''") # Escape single quotes - cmd = (f"gh issue close {issue.number} --repo {self.repo} " - f"--comment '{comment}'") - commands.append(cmd) - return commands - - def find_cross_repo_issues(self) -> Dict[str, List[Tuple[Issue, str]]]: - """Find issues that belong in other module repositories""" - print("Detecting cross-repo issues...") - cross_repo = defaultdict(list) - - open_issues = [i for i in self.issues if i.state.upper() == 'OPEN'] - - for issue in open_issues: - text = f"{issue.title} {issue.body or ''}".lower() - - for module_key, module_info in self.MODULE_REPOS.items(): - # Check if issue mentions this module - for name in module_info['names']: - # Use word boundaries to avoid false positives - pattern = r'\b' + re.escape(name) + r'\b' - if re.search(pattern, text): - cross_repo[module_key].append((issue, name)) - break # Only add once per issue - - return cross_repo - - def generate_actionable_recommendations(self) -> str: - """Generate actionable recommendations with specific commands""" - lines = [] - open_issues = [i for i in self.issues if i.state.upper() == 'OPEN'] - - lines.append("## 🎯 Actionable Recommendations\n") - - # Cross-repo issues (show first!) - cross_repo_issues = self.find_cross_repo_issues() - if cross_repo_issues: - total_cross = sum(len(issues) for issues in cross_repo_issues.values()) - lines.append(f"### Issues in Wrong Repository ({total_cross} issues)\n") - lines.append("**High Priority.** These issues should be closed here and opened in the correct module repository:\n") - - for module_key, issues in cross_repo_issues.items(): - if issues: - module_info = self.MODULE_REPOS[module_key] - lines.append(f"#### {module_info['repo'].replace('bmad-code-org/', '').title()} ({len(issues)} issues)") - lines.append(f"**Correct repo:** [{module_info['repo']}]({module_info['url']}/issues/new)\n") - lines.append(f"**Close these and report in the correct repo:**") - lines.append(f"```bash") - - for issue, matched_name in issues[:10]: # Show first 10 - comment = (f"This issue relates to {matched_name} which is maintained in a separate repository. " - f"Please report this issue at {module_info['url']}/issues/new") - lines.append(f"gh issue close {issue.number} --repo {self.repo} --comment '{comment}'") - - if len(issues) > 10: - lines.append(f"# ... and {len(issues) - 10} more") - lines.append(f"```\n") - - # Find duplicates - duplicates = self.find_duplicates() - if duplicates: - lines.append(f"### Potential Duplicates ({len(duplicates)} pairs)\n") - lines.append("**Manual review required.** Close the older issue as a duplicate of the newer one:\n") - for issue1, issue2, similarity in duplicates[:20]: # Top 20 - older = issue1 if issue1.created_at < issue2.created_at else issue2 - newer = issue2 if issue1.created_at < issue2.created_at else issue1 - lines.append(f"#### {older.title}") - lines.append(f"- **Older:** #{older.number} ({older.age_days} days old)") - lines.append(f"- **Newer:** #{newer.number} ({newer.age_days} days old)") - lines.append(f"- **Similarity:** {similarity:.1%}") - lines.append(f"- **Command:** `gh issue close {older.number} --repo {self.repo} --comment 'Duplicate of #{newer.number}' --duplicate-of {newer.number}`") - lines.append("") - - # Find outdated issues - outdated = self.find_outdated_issues() - total_outdated = len(outdated['old_issues']) + len(outdated['v4_issues']) + len(outdated['ancient_stale']) - - if total_outdated > 0: - lines.append(f"### Outdated Issues ({total_outdated} total)\n") - - # Pre-Dec 2025 issues - if outdated['old_issues']: - cutoff_date = datetime(2025, 12, 1, tzinfo=timezone.utc).strftime('%B %Y') - lines.append(f"#### Issues from before {cutoff_date} ({len(outdated['old_issues'])})") - lines.append(f"These issues are quite old and may no longer be relevant. Consider reviewing and closing outdated ones.\n") - lines.append("**To add label for review:**") - lines.append(f"```bash") - for issue in outdated['old_issues'][:10]: # Show first 10 - lines.append(f"gh issue edit {issue.number} --repo {self.repo} --add-label 'outdated,needs-review'") - if len(outdated['old_issues']) > 10: - lines.append(f"# ... and {len(outdated['old_issues']) - 10} more") - lines.append(f"```\n") - - # v4-related issues - if outdated['v4_issues']: - lines.append(f"#### v4-Related Issues ({len(outdated['v4_issues'])})") - lines.append(f"BMad Method v4 is deprecated. These issues likely no longer apply to v6.\n") - lines.append("**Bulk close with comment:**") - lines.append(f"```bash") - for issue in outdated['v4_issues'][:10]: - lines.append(f"gh issue close {issue.number} --repo {self.repo} --comment 'Closing as this relates to BMad Method v4 which is deprecated. Please open a new issue if this still applies to v6.'") - if len(outdated['v4_issues']) > 10: - lines.append(f"# ... and {len(outdated['v4_issues']) - 10} more") - lines.append(f"```\n") - - # Ancient stale issues - if outdated['ancient_stale']: - lines.append(f"#### Ancient Stale Issues ({len(outdated['ancient_stale'])})") - lines.append(f"Issues that are both very old (>90 days) and haven't been updated in >90 days.\n") - lines.append("**Close as stale:**") - lines.append(f"```bash") - for issue in outdated['ancient_stale'][:10]: - lines.append(f"gh issue close {issue.number} --repo {self.repo} --comment 'Closing due to inactivity. Please reopen if this is still relevant.'") - if len(outdated['ancient_stale']) > 10: - lines.append(f"# ... and {len(outdated['ancient_stale']) - 10} more") - lines.append(f"```\n") - - # Bulk tagging suggestions - lines.append("### Bulk Tagging Suggestions\n") - lines.append("Add appropriate labels to untagged issues:\n") - - # Find issues without category labels - untagged = [i for i in open_issues if not any( - l.lower() in ['bug', 'feature', 'enhancement', 'documentation', 'performance', 'question', 'refactor', 'tech-debt'] - for l in i.labels - )] - - if untagged: - lines.append(f"**Issues without category labels ({len(untagged)}):**\n") - by_category = defaultdict(list) - for issue in untagged: - by_category[issue.category.value].append(issue) - - for category, issues in sorted(by_category.items(), key=lambda x: len(x[1]), reverse=True)[:5]: - lines.append(f"##### Label as `{category}` ({len(issues)} issues)") - lines.append(f"```bash") - for issue in issues[:5]: - lines.append(f"gh issue edit {issue.number} --repo {self.repo} --add-label '{category}'") - if len(issues) > 5: - lines.append(f"# ... and {len(issues) - 5} more") - lines.append(f"```\n") - - # Priority labeling - no_priority = [i for i in open_issues if not any( - l.lower() in ['critical', 'high', 'medium', 'low', 'priority'] - for l in i.labels - )] - - if no_priority: - # Group by priority - by_priority = defaultdict(list) - for issue in no_priority: - by_priority[issue.priority.value].append(issue) - - lines.append("**Add priority labels:**\n") - for priority_level in ['critical', 'high', 'medium', 'low']: - if priority_level in by_priority: - count = len(by_priority[priority_level]) - lines.append(f"##### Label as `{priority_level}` priority ({count} issues)") - lines.append(f"```bash") - for issue in by_priority[priority_level][:5]: - lines.append(f"gh issue edit {issue.number} --repo {self.repo} --add-label '{priority_level}'") - if count > 5: - lines.append(f"# ... and {count - 5} more") - lines.append(f"```\n") - - return "\n".join(lines) - - def generate_report(self) -> str: - """Generate markdown triage report""" - lines = [] - - # Summary - lines.append("# GitHub Issue Triage Report\n") - lines.append(f"**Repository:** {self.repo}\n") - lines.append(f"**Generated:** {datetime.now().strftime('%Y-%m-%d %H:%M:%S UTC')}\n") - - # Count stats - total = len(self.issues) - open_issues = [i for i in self.issues if i.state.upper() == 'OPEN'] - closed_issues = [i for i in self.issues if i.state.upper() == 'CLOSED'] - - lines.append("## Summary\n") - lines.append(f"- **Total Issues:** {total}") - lines.append(f"- **Open:** {len(open_issues)} | **Closed:** {len(closed_issues)}") - - # Category breakdown - category_counts = defaultdict(int) - for issue in self.issues: - category_counts[issue.category] += 1 - top_categories = sorted(category_counts.items(), key=lambda x: x[1], reverse=True)[:5] - lines.append(f"- **Top Categories:** {', '.join(f'{cat.value} ({count})' for cat, count in top_categories)}") - lines.append("") - - # Priority action items - lines.append("## Priority Action Items\n") - - # Critical/High priority open issues - critical_issues = [i for i in open_issues if i.priority in [Priority.CRITICAL, Priority.HIGH]] - if critical_issues: - lines.append(f"### {'🚨 ' if critical_issues else ''}Critical & High Priority ({len(critical_issues)})\n") - for issue in sorted(critical_issues, key=lambda x: x.age_days, reverse=True): - lines.append(f"- [#{issue.number}]({issue.url}) {issue.title}") - lines.append(f" - {issue.category.value.upper()} | {issue.priority.value.upper()} | Age: {issue.age_days} days") - if issue.labels: - lines.append(f" - Labels: {', '.join(issue.labels)}") - lines.append("") - - # Stale issues needing review - stale_issues = [i for i in open_issues if i.triage_status == TriagingStatus.STALE] - if stale_issues: - lines.append(f"### Stale Issues - Needs Review ({len(stale_issues)})\n") - for issue in sorted(stale_issues, key=lambda x: x.days_since_update or 0, reverse=True)[:15]: - days_stale = issue.days_since_update or 0 - lines.append(f"- [#{issue.number}]({issue.url}) {issue.title}") - lines.append(f" - Last updated {days_stale} days ago | {issue.category.value}") - lines.append("") - - # Categories - lines.append("## Categories\n") - - for category in Category: - category_issues = [i for i in self.issues if i.category == category] - if not category_issues: - continue - - open_in_cat = [i for i in category_issues if i.state.upper() == 'OPEN'] - closed_in_cat = [i for i in category_issues if i.state.upper() == 'CLOSED'] - - lines.append(f"### {category.value.title()} ({len(open_in_cat)} open, {len(closed_in_cat)} closed)\n") - - # Sort open by priority - priority_order = {Priority.CRITICAL: 0, Priority.HIGH: 1, Priority.MEDIUM: 2, Priority.LOW: 3, Priority.INFORMATIONAL: 4} - open_in_cat_sorted = sorted(open_in_cat, key=lambda x: priority_order.get(x.priority, 5)) - - for issue in open_in_cat_sorted[:20]: # Limit to 20 per category - status_icon = { - TriagingStatus.NEEDS_TRIAGE: '🔍', - TriagingStatus.READY_FOR_DEV: '✅', - TriagingStatus.BLOCKED: '🚫', - TriagingStatus.STALE: '💤', - TriagingStatus.IN_PROGRESS: '🔧', - }.get(issue.triage_status, '') - - lines.append(f"{status_icon} [#{issue.number}]({issue.url}) {issue.title}") - lines.append(f"
Details") - lines.append(f" ") - lines.append(f" - **Priority:** {issue.priority.value}") - lines.append(f" - **Status:** {issue.triage_status.value}") - lines.append(f" - **Age:** {issue.age_days} days") - lines.append(f" - **Author:** {issue.author}") - if issue.labels: - lines.append(f" - **Labels:** {', '.join(issue.labels)}") - lines.append(f"
") - lines.append("") - - if len(open_in_cat) > 20: - lines.append(f"*... and {len(open_in_cat) - 20} more*\n") - - # Actionable recommendations - lines.append(self.generate_actionable_recommendations()) - - # Cleanup candidates - lines.append("## Cleanup Candidates\n") - - duplicates = [i for i in self.issues if i.triage_status == TriagingStatus.DUPLICATE] - if duplicates: - lines.append(f"### Duplicates ({len(duplicates)})\n") - for issue in duplicates: - lines.append(f"- [#{issue.number}]({issue.url}) {issue.title}") - - invalid = [i for i in self.issues if i.triage_status == TriagingStatus.INVALID] - if invalid: - lines.append(f"\n### Invalid/Wontfix ({len(invalid)})\n") - for issue in invalid: - lines.append(f"- [#{issue.number}]({issue.url}) {issue.title}") - - lines.append("\n---\n") - lines.append("*Report generated by BMad Issue Triage Tool*") - - return "\n".join(lines) - - -def main(): - parser = argparse.ArgumentParser( - description='Triage and categorize GitHub issues', - formatter_class=argparse.RawDescriptionHelpFormatter, - epilog=""" -Examples: - %(prog)s # Triage open issues in current repo - %(prog)s --state all # All issues (including closed) - %(prog)s --focus "installer" # Filter for installer-related issues - %(prog)s --repo user/repo --state closed - """ - ) - - parser.add_argument('--repo', help='Repository (default: detect from git)') - parser.add_argument('--state', choices=['all', 'open', 'closed'], default='open', - help='Filter by state (default: open)') - parser.add_argument('--focus', help='Focus context to filter issues') - parser.add_argument('--output', '-o', help='Output file (default: _bmad-output/triage-reports/triage-.md)') - parser.add_argument('--json', action='store_true', help='Output as JSON') - - args = parser.parse_args() - - # Set default output to _bmad-output/triage-reports if not specified - if not args.output and not args.json: - os.makedirs('_bmad-output/triage-reports', exist_ok=True) - output_date = datetime.now().strftime('%Y-%m-%d') - args.output = f'_bmad-output/triage-reports/triage-{output_date}.md' - - triage = IssueTriage(repo=args.repo, state=args.state) - triage.fetch_issues() - triage.analyze_issues(focus_filter=args.focus) - - if args.json: - # Output as JSON for further processing - data = [ - { - 'number': i.number, - 'title': i.title, - 'state': i.state, - 'category': i.category.value, - 'priority': i.priority.value, - 'triage_status': i.triage_status.value, - 'age_days': i.age_days, - 'url': i.url, - 'labels': i.labels, - 'author': i.author - } - for i in triage.issues - ] - output = json.dumps(data, indent=2) - else: - output = triage.generate_report() - - if args.output: - with open(args.output, 'w') as f: - f.write(output) - # Get relative path for nicer output - rel_path = args.output.replace('./', '') - print(f"✅ Report saved to: {rel_path}") - else: - print(output) - - -if __name__ == '__main__': - main() From 6af79165d8bba47b8269543bfc4276c00b31e92a Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 31 Jan 2026 21:22:36 -0600 Subject: [PATCH 10/13] fix agent scan --- tools/validate-agent-schema.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/validate-agent-schema.js b/tools/validate-agent-schema.js index b351f8ec..409bd551 100644 --- a/tools/validate-agent-schema.js +++ b/tools/validate-agent-schema.js @@ -28,7 +28,7 @@ async function main(customProjectRoot) { const project_root = customProjectRoot || path.join(__dirname, '..'); // Find all agent files - const agentFiles = await glob('src/{core,modules/*}/agents/*.agent.yaml', { + const agentFiles = await glob('src/{core,bmm/*}/agents/**/*.agent.yaml', { cwd: project_root, absolute: true, }); From 1665ad68df034ea07098743b36b1d796eeb00ce5 Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Sat, 31 Jan 2026 21:58:37 -0600 Subject: [PATCH 11/13] fix agent scan and help csv files --- src/bmm/agents/quick-flow-solo-dev.agent.yaml | 4 +- src/bmm/agents/quinn.agent.yaml | 2 +- .../agents/tech-writer/tech-writer.agent.yaml | 4 +- src/bmm/module-help.csv | 37 +++++++++++-------- src/core/module-help.csv | 16 ++++---- tools/validate-agent-schema.js | 2 +- 6 files changed, 35 insertions(+), 30 deletions(-) diff --git a/src/bmm/agents/quick-flow-solo-dev.agent.yaml b/src/bmm/agents/quick-flow-solo-dev.agent.yaml index c488db6d..6d207a39 100644 --- a/src/bmm/agents/quick-flow-solo-dev.agent.yaml +++ b/src/bmm/agents/quick-flow-solo-dev.agent.yaml @@ -18,9 +18,9 @@ agent: - Specs are for building, not bureaucracy. Code that ships is better than perfect code that doesn't. menu: - - trigger: TS or fuzzy match on tech-spec + - trigger: QS or fuzzy match on quick-spec exec: "{project-root}/_bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md" - description: "[TS] Tech Spec: Architect a quick but complete technical spec with implementation-ready stories/specs" + description: "[QS] Quick Spec: Architect a quick but complete technical spec with implementation-ready stories/specs" - trigger: QD or fuzzy match on quick-dev workflow: "{project-root}/_bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md" diff --git a/src/bmm/agents/quinn.agent.yaml b/src/bmm/agents/quinn.agent.yaml index eafea2d0..73ed366c 100644 --- a/src/bmm/agents/quinn.agent.yaml +++ b/src/bmm/agents/quinn.agent.yaml @@ -27,7 +27,7 @@ agent: - Focus on realistic user scenarios menu: - - trigger: QA + - trigger: qa workflow: "{project-root}/_bmad/bmm/workflows/qa/automate/workflow.yaml" description: "[QA] Automate - Generate tests for existing features (simplified)" diff --git a/src/bmm/agents/tech-writer/tech-writer.agent.yaml b/src/bmm/agents/tech-writer/tech-writer.agent.yaml index 43f376c1..a742a6c9 100644 --- a/src/bmm/agents/tech-writer/tech-writer.agent.yaml +++ b/src/bmm/agents/tech-writer/tech-writer.agent.yaml @@ -28,9 +28,9 @@ agent: action: "Engage in multi-turn conversation until you fully understand the ask, use subprocess if available for any web search, research or document review required to extract and return only relevant info to parent context. Author final document following all `_bmad/_memory/tech-writer-sidecar/documentation-standards.md`. After draft, use a subprocess to review and revise for quality of content and ensure standards are still met." description: "[WD] Write Document: Describe in detail what you want, and the agent will follow the documentation best practices defined in agent memory." - - trigger: WD or fuzzy match on write-document + - trigger: US or fuzzy match on update-standards action: "Update `_bmad/_memory/tech-writer-sidecar/documentation-standards.md` adding user preferences to User Specified CRITICAL Rules section. Remove any contradictory rules as needed. Share with user the updates made." - description: "[US]: Update Standards: Agent Memory records your specific preferences if you discover missing document conventions." + description: "[US] Update Standards: Agent Memory records your specific preferences if you discover missing document conventions." - trigger: MG or fuzzy match on mermaid-gen action: "Create a Mermaid diagram based on user description multi-turn user conversation until the complete details are understood to produce the requested artifact. If not specified, suggest diagram types based on ask. Strictly follow Mermaid syntax and CommonMark fenced code block standards." diff --git a/src/bmm/module-help.csv b/src/bmm/module-help.csv index 9a235d44..af7c52c2 100644 --- a/src/bmm/module-help.csv +++ b/src/bmm/module-help.csv @@ -1,23 +1,28 @@ module,phase,name,code,sequence,workflow-file,command,required,agent,options,description,output-location,outputs, -bmm,anytime,Document Project,DP,10,_bmad/bmm/workflows/document-project/workflow.yaml,bmad-bmm-document-project,false,analyst,Create Mode,"Analyze an existing project to produce useful documentation",project-knowledge,*, -bmm,anytime,Generate Project Context,GPC,15,_bmad/bmm/workflows/generate-project-context/workflow.md,bmad-bmm-generate-project-context,false,analyst,Create Mode,"Scan existing codebase to generate a lean LLM-optimized project-context.md containing critical implementation rules patterns and conventions for AI agents. Essential for brownfield projects and quick-flow.",output_folder,"project context", -bmm,anytime,Quick Spec,TS,20,_bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md,bmad-bmm-quick-spec,false,quick-flow-solo-dev,Create Mode,"Do not suggest for potentially very complex things unless requested or if the user complains that they do not want to follow the extensive planning of the bmad method. Quick one-off tasks small changes simple apps utilities without extensive planning",planning_artifacts,"tech spec", -bmm,anytime,Quick Dev,QD,30,_bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md,bmad-bmm-quick-dev,false,quick-flow-solo-dev,Create Mode,"Quick one-off tasks small changes simple apps utilities without extensive planning - Do not suggest for potentially very complex things unless requested or if the user complains that they do not want to follow the extensive planning of the bmad method, unless the user is already working through the implementation phase and just requests a 1 off things not already in the plan",,, -bmm,anytime,Correct Course,CC,40,_bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml,bmad-bmm-correct-course,false,sm,Create Mode,"Anytime: Navigate significant changes. May recommend start over update PRD redo architecture sprint planning or correct epics and stories",planning_artifacts,"change proposal", +bmm,anytime,Document Project,DP,,_bmad/bmm/workflows/document-project/workflow.yaml,bmad-bmm-document-project,false,analyst,Create Mode,"Analyze an existing project to produce useful documentation",project-knowledge,*, +bmm,anytime,Generate Project Context,GPC,,_bmad/bmm/workflows/generate-project-context/workflow.md,bmad-bmm-generate-project-context,false,analyst,Create Mode,"Scan existing codebase to generate a lean LLM-optimized project-context.md containing critical implementation rules patterns and conventions for AI agents. Essential for brownfield projects and quick-flow.",output_folder,"project context", +bmm,anytime,Quick Spec,QS,,_bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md,bmad-bmm-quick-spec,false,quick-flow-solo-dev,Create Mode,"Do not suggest for potentially very complex things unless requested or if the user complains that they do not want to follow the extensive planning of the bmad method. Quick one-off tasks small changes simple apps brownfield additions to well established patterns utilities without extensive planning",planning_artifacts,"tech spec", +bmm,anytime,Quick Dev,QD,,_bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md,bmad-bmm-quick-dev,false,quick-flow-solo-dev,Create Mode,"Quick one-off tasks small changes simple apps utilities without extensive planning - Do not suggest for potentially very complex things unless requested or if the user complains that they do not want to follow the extensive planning of the bmad method, unless the user is already working through the implementation phase and just requests a 1 off things not already in the plan",,, +bmm,anytime,Correct Course,CC,,_bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml,bmad-bmm-correct-course,false,sm,Create Mode,"Anytime: Navigate significant changes. May recommend start over update PRD redo architecture sprint planning or correct epics and stories",planning_artifacts,"change proposal", +bmm,anytime,Create Dataflow,CDF,,_bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml,bmad-bmm-create-excalidraw-dataflow,false,ux-designer,Create Mode,"Create data flow diagrams (DFD) in Excalidraw format - can be called standalone or during any workflow to add visual documentation",planning_artifacts,"dataflow diagram", +bmm,anytime,Create Diagram,CED,,_bmad/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml,bmad-bmm-create-excalidraw-diagram,false,ux-designer,Create Mode,"Create system architecture diagrams ERDs UML diagrams or general technical diagrams in Excalidraw format - use anytime or call from architecture workflow to add visual documentation",planning_artifacts,"diagram", +bmm,anytime,Create Flowchart,CFC,,_bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml,bmad-bmm-create-excalidraw-flowchart,false,ux-designer,Create Mode,"Create a flowchart visualization in Excalidraw format for processes pipelines or logic flows - use anytime or during architecture to add process documentation",planning_artifacts,"flowchart", +bmm,anytime,Create Wireframe,CEW,,_bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml,bmad-bmm-create-excalidraw-wireframe,false,ux-designer,Create Mode,"Create website or app wireframes in Excalidraw format - use anytime standalone or call from UX workflow to add UI mockups",planning_artifacts,"wireframe", +bmm,anytime,Write Document,WD,,_bmad/bmm/agents/tech-writer/tech-writer.agent.yaml,bmad-bmm-write-document,false,tech-writer,,"Describe in detail what you want, and the agent will follow the documentation best practices defined in agent memory. Multi-turn conversation with subprocess for research/review.",project-knowledge,"document", +bmm,anytime,Update Standards,US,,_bmad/bmm/agents/tech-writer/tech-writer.agent.yaml,bmad-bmm-update-standards,false,tech-writer,,"Update agent memory documentation-standards.md with your specific preferences if you discover missing document conventions.",_bmad/_memory/tech-writer-sidecar,"standards", +bmm,anytime,Mermaid Generate,MG,,_bmad/bmm/agents/tech-writer/tech-writer.agent.yaml,bmad-bmm-mermaid-generate,false,tech-writer,,"Create a Mermaid diagram based on user description. Will suggest diagram types if not specified.",planning_artifacts,"mermaid diagram", +bmm,anytime,Validate Document,VD,,_bmad/bmm/agents/tech-writer/tech-writer.agent.yaml,bmad-bmm-validate-document,false,tech-writer,,"Review the specified document against documentation standards and best practices. Returns specific actionable improvement suggestions organized by priority.",planning_artifacts,"validation report", +bmm,anytime,Explain Concept,EC,,_bmad/bmm/agents/tech-writer/tech-writer.agent.yaml,bmad-bmm-explain-concept,false,tech-writer,,"Create clear technical explanations with examples and diagrams for complex concepts. Breaks down into digestible sections using task-oriented approach.",project_knowledge,"explanation", bmm,1-analysis,Brainstorm Project,BP,10,_bmad/core/workflows/brainstorming/workflow.md,bmad-brainstorming,false,analyst,data=_bmad/bmm/data/project-context-template.md,"Expert Guided Facilitation through a single or multiple techniques",planning_artifacts,"brainstorming session", -bmm,1-analysis,Market Research,MR,20,_bmad/bmm/workflows/1-analysis/research/workflow.md,bmad-bmm-research,false,analyst,Create Mode research_type=market,"Market analysis competitive landscape customer needs and trends","planning_artifacts|project-knowledge","research documents" -bmm,1-analysis,Domain Research,DR,21,_bmad/bmm/workflows/1-analysis/research/workflow.md,bmad-bmm-research,false,analyst,Create Mode research_type=domain,"Industry domain deep dive subject matter expertise and terminology","planning_artifacts|project-knowledge","research documents" -bmm,1-analysis,Technical Research,TR,22,_bmad/bmm/workflows/1-analysis/research/workflow.md,bmad-bmm-research,false,analyst,Create Mode research_type=technical,"Technical feasibility architecture options and implementation approaches","planning_artifacts|project-knowledge","research documents" +bmm,1-analysis,Market Research,MR,20,_bmad/bmm/workflows/1-analysis/research/workflow.md,bmad-bmm-research,false,analyst,Create Mode research_type=market,"Market analysis competitive landscape customer needs and trends","planning_artifacts|project-knowledge","research documents", +bmm,1-analysis,Domain Research,DR,21,_bmad/bmm/workflows/1-analysis/research/workflow.md,bmad-bmm-research,false,analyst,Create Mode research_type=domain,"Industry domain deep dive subject matter expertise and terminology","planning_artifacts|project_knowledge","research documents", +bmm,1-analysis,Technical Research,TR,22,_bmad/bmm/workflows/1-analysis/research/workflow.md,bmad-bmm-research,false,analyst,Create Mode research_type=technical,"Technical feasibility architecture options and implementation approaches","planning_artifacts|project_knowledge","research documents", bmm,1-analysis,Create Brief,CB,30,_bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md,bmad-bmm-create-brief,false,analyst,Create Mode,"A guided experience to nail down your product idea",planning_artifacts,"product brief", bmm,1-analysis,Validate Brief,VB,40,_bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md,bmad-bmm-validate-brief,false,analyst,Validate Mode,"Validates product brief completeness",planning_artifacts,"brief validation report", -bmm,2-planning,Create PRD,CP,10,_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow.md,bmad-bmm-prd,true,pm,Create Mode,"Expert led facilitation to produce your Product Requirements Document",planning_artifacts,prd, -bmm,2-planning,Validate PRD,VP,20,_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow.md,bmad-bmm-prd,false,pm,Validate Mode,"Validate PRD is comprehensive lean well organized and cohesive",planning_artifacts,"prd validation report", +bmm,2-planning,Create PRD,CP,10,_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow.md,bmad-bmm-create-prd,true,pm,Create Mode,"Expert led facilitation to produce your Product Requirements Document",planning_artifacts,prd, +bmm,2-planning,Validate PRD,VP,20,_bmad/bmm/workflows/2-plan-workflows/create-prd/workflow.md,bmad-bmm-validate-prd,false,pm,Validate Mode,"Validate PRD is comprehensive lean well organized and cohesive",planning_artifacts,"prd validation report", bmm,2-planning,Create UX,CU,30,_bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md,bmad-bmm-create-ux-design,false,ux-designer,Create Mode,"Guidance through realizing the plan for your UX, strongly recommended if a UI is a primary piece of the proposed project",planning_artifacts,"ux design", bmm,2-planning,Validate UX,VU,40,_bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md,bmad-bmm-create-ux-design,false,ux-designer,Validate Mode,"Validates UX design deliverables",planning_artifacts,"ux validation report", -,anytime,Create Dataflow,CDF,50,_bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml,bmad-bmm-create-excalidraw-dataflow,false,ux-designer,Create Mode,"Create data flow diagrams (DFD) in Excalidraw format - can be called standalone or during any workflow to add visual documentation",planning_artifacts,"dataflow diagram", -,anytime,Create Diagram,CED,51,_bmad/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml,bmad-bmm-create-excalidraw-diagram,false,ux-designer,Create Mode,"Create system architecture diagrams ERDs UML diagrams or general technical diagrams in Excalidraw format - use anytime or call from architecture workflow to add visual documentation",planning_artifacts,"diagram", -,anytime,Create Flowchart,CFC,52,_bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml,bmad-bmm-create-excalidraw-flowchart,false,ux-designer,Create Mode,"Create a flowchart visualization in Excalidraw format for processes pipelines or logic flows - use anytime or during architecture to add process documentation",planning_artifacts,"flowchart", -,anytime,Create Wireframe,CEW,53,_bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml,bmad-bmm-create-excalidraw-wireframe,false,ux-designer,Create Mode,"Create website or app wireframes in Excalidraw format - use anytime standalone or call from UX workflow to add UI mockups",planning_artifacts,"wireframe", bmm,3-solutioning,Create Architecture,CA,10,_bmad/bmm/workflows/3-solutioning/create-architecture/workflow.md,bmad-bmm-create-architecture,true,architect,Create Mode,"Guided Workflow to document technical decisions",planning_artifacts,architecture, bmm,3-solutioning,Validate Architecture,VA,20,_bmad/bmm/workflows/3-solutioning/create-architecture/workflow.md,bmad-bmm-create-architecture,false,architect,Validate Mode,"Validates architecture completeness",planning_artifacts,"architecture validation report", bmm,3-solutioning,Create Epics and Stories,CE,30,_bmad/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md,bmad-bmm-create-epics-and-stories,true,pm,Create Mode,"Create the Epics and Stories Listing",planning_artifacts,"epics and stories", @@ -25,9 +30,9 @@ bmm,3-solutioning,Validate Epics and Stories,VE,40,_bmad/bmm/workflows/3-solutio bmm,3-solutioning,Check Implementation Readiness,IR,70,_bmad/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md,bmad-bmm-check-implementation-readiness,true,architect,Validate Mode,"Ensure PRD UX Architecture and Epics Stories are aligned",planning_artifacts,"readiness report", bmm,4-implementation,Sprint Planning,SP,10,_bmad/bmm/workflows/4-implementation/sprint-planning/workflow.yaml,bmad-bmm-sprint-planning,true,sm,Create Mode,"Generate sprint plan for development tasks - this kicks off the implementation phase by producing a plan the implementation agents will follow in sequence for every story in the plan.",implementation_artifacts,"sprint status", bmm,4-implementation,Sprint Status,SS,20,_bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml,bmad-bmm-sprint-status,false,sm,Create Mode,"Anytime: Summarize sprint status and route to next workflow",,, -bmm,4-implementation,Create Story,CS,30,_bmad/bmm/workflows/4-implementation/create-story/workflow.yaml,bmad-bmm-create-story,true,sm,Create Mode,"Story cycle start: Prepare first found story in the sprint plan that is next, or if the command is run with a specific epic and story designation with context. Once complete, then VS then DS then CR then back to DS if needed or next CS or ER",implementation_artifacts,story, bmm,4-implementation,Validate Story,VS,35,_bmad/bmm/workflows/4-implementation/create-story/workflow.yaml,bmad-bmm-create-story,false,sm,Validate Mode,"Validates story readiness and completeness before development work begins",implementation_artifacts,"story validation report", +bmm,4-implementation,Create Story,CS,30,_bmad/bmm/workflows/4-implementation/create-story/workflow.yaml,bmad-bmm-create-story,true,sm,Create Mode,"Story cycle start: Prepare first found story in the sprint plan that is next, or if the command is run with a specific epic and story designation with context. Once complete, then VS then DS then CR then back to DS if needed or next CS or ER",implementation_artifacts,story, bmm,4-implementation,Dev Story,DS,40,_bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml,bmad-bmm-dev-story,true,dev,Create Mode,"Story cycle: Execute story implementation tasks and tests then CR then back to DS if fixes needed",,, bmm,4-implementation,Code Review,CR,50,_bmad/bmm/workflows/4-implementation/code-review/workflow.yaml,bmad-bmm-code-review,false,dev,Create Mode,"Story cycle: If issues back to DS if approved then next CS or ER if epic complete",,, +bmm,4-implementation,QA Automation Test,QA,45,_bmad/bmm/workflows/qa/automate/workflow.yaml,bmad-bmm-qa-automate,false,quinn,Create Mode,"Generate automated API and E2E tests for implemented code using the project's existing test framework (detects existing well known in use test frameworks). Use after implementation to add test coverage. NOT for code review or story validation - use CR for that.",implementation_artifacts,"test suite", bmm,4-implementation,Retrospective,ER,60,_bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml,bmad-bmm-retrospective,false,sm,Create Mode,"Optional at epic end: Review completed work lessons learned and next epic or if major issues consider CC",implementation_artifacts,retrospective, -bmm,4-implementation,Automate,QA,45,_bmad/bmm/workflows/qa/automate/workflow.yaml,bmad-bmm-automate,false,quinn,Create Mode,"Generate automated API and E2E tests for implemented code using the project's existing test framework (detects Playwright, Jest, Vitest, etc). Use after implementation to add test coverage. NOT for code review or story validation - use CR for that.",implementation_artifacts,"test suite", diff --git a/src/core/module-help.csv b/src/core/module-help.csv index 206f1cd3..599cef33 100644 --- a/src/core/module-help.csv +++ b/src/core/module-help.csv @@ -1,9 +1,9 @@ module,phase,name,code,sequence,workflow-file,command,required,agent,options,description,output-location,outputs -core,,Brainstorming,BS,20,_bmad/core/workflows/brainstorming/workflow.md,bmad-brainstorming,false,analyst,,Facilitate interactive brainstorming sessions using diverse creative techniques and ideation methods,{output_folder}/brainstorming/brainstorming-session-{{date}}.md,, -core,,Party Mode,PM,30,_bmad/core/workflows/party-mode/workflow.md,bmad-party-mode,false,party-mode facilitator,,Orchestrates group discussions between all installed BMAD agents enabling natural multi-agent conversations,, -core,,bmad-help,BH,40,_bmad/core/tasks/help.md,bmad-help,false,,,Get unstuck by showing what workflow steps come next or answering questions about what to do in the BMad Method,, -core,,Index Docs,ID,50,_bmad/core/tasks/index-docs.xml,bmad-index-docs,false,,,Generates or updates an index.md of all documents in the specified directory,, -core,,Shard Document,SD,70,_bmad/core/tasks/shard-doc.xml,bmad-shard-doc,false,,,Splits large markdown documents into smaller organized files based on level 2 sections,, -core,,Editorial Review - Prose,EP,80,_bmad/core/tasks/editorial-review-prose.xml,bmad-editorial-review-prose,false,,,Clinical copy-editor that reviews text for communication issues,,"three-column markdown table with suggested fixes", -core,,Editorial Review - Structure,ES,90,_bmad/core/tasks/editorial-review-structure.xml,bmad-editorial-review-structure,false,,,Structural editor that proposes cuts reorganization and simplification while preserving comprehension,, -core,,Adversarial Review (General),AR,100,_bmad/core/tasks/review-adversarial-general.xml,bmad-review-adversarial-general,false,,,Cynically review content and produce findings,, +core,anytime,Brainstorming,BS,,_bmad/core/workflows/brainstorming/workflow.md,bmad-brainstorming,false,analyst,,"Generate diverse ideas through interactive techniques. Use early in ideation phase or when stuck generating ideas.",{output_folder}/brainstorming/brainstorming-session-{{date}}.md,, +core,anytime,Party Mode,PM,,_bmad/core/workflows/party-mode/workflow.md,bmad-party-mode,false,party-mode facilitator,,"Orchestrate multi-agent discussions. Use when you need multiple agent perspectives or want agents to collaborate.",, +core,anytime,bmad-help,BH,,_bmad/core/tasks/help.md,bmad-help,false,,,"Get unstuck by showing what workflow steps come next or answering BMad Method questions.",, +core,anytime,Index Docs,ID,,_bmad/core/tasks/index-docs.xml,bmad-index-docs,false,,,"Create lightweight index for quick LLM scanning. Use when LLM needs to understand available docs without loading everything.",, +core,anytime,Shard Document,SD,,_bmad/core/tasks/shard-doc.xml,bmad-shard-doc,false,,,"Split large documents into smaller files by sections. Use when doc becomes too large (>500 lines) to manage effectively.",, +core,anytime,Editorial Review - Prose,EP,,_bmad/core/tasks/editorial-review-prose.xml,bmad-editorial-review-prose,false,,,"Review prose for clarity, tone, and communication issues. Use after drafting to polish written content.",report located with target document,"three-column markdown table with suggested fixes", +core,anytime,Editorial Review - Structure,ES,,_bmad/core/tasks/editorial-review-structure.xml,bmad-editorial-review-structure,false,,,"Propose cuts, reorganization, and simplification while preserving comprehension. Use when doc produced from multiple subprocesses or needs structural improvement.",report located with target document, +core,anytime,Adversarial Review (General),AR,,_bmad/core/tasks/review-adversarial-general.xml,bmad-review-adversarial-general,false,,,"Review content critically to find issues and weaknesses. Use for quality assurance or before finalizing deliverables. Code Review in other modules run this automatically, but its useful also for document reviews",, diff --git a/tools/validate-agent-schema.js b/tools/validate-agent-schema.js index 409bd551..9c3595fe 100644 --- a/tools/validate-agent-schema.js +++ b/tools/validate-agent-schema.js @@ -28,7 +28,7 @@ async function main(customProjectRoot) { const project_root = customProjectRoot || path.join(__dirname, '..'); // Find all agent files - const agentFiles = await glob('src/{core,bmm/*}/agents/**/*.agent.yaml', { + const agentFiles = await glob('src/{core,bmm}/agents/**/*.agent.yaml', { cwd: project_root, absolute: true, }); From e17c7e8793eb0c1c81f02e86e008882afddb79c4 Mon Sep 17 00:00:00 2001 From: Alex Verkhovsky Date: Sun, 1 Feb 2026 09:01:40 -0700 Subject: [PATCH 12/13] fix: remove .claude/commands file from version control (#1506) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This file was accidentally tracked despite .claude/commands being in .gitignore. The installer generates this file at install time from source templates — it should not be tracked in the repo. Co-authored-by: Claude Opus 4.5 --- .claude/commands/bmad-bmm-generate-project-context.md | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 .claude/commands/bmad-bmm-generate-project-context.md diff --git a/.claude/commands/bmad-bmm-generate-project-context.md b/.claude/commands/bmad-bmm-generate-project-context.md deleted file mode 100644 index 452871c3..00000000 --- a/.claude/commands/bmad-bmm-generate-project-context.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -name: 'generate-project-context' -description: 'Creates a concise project-context.md file with critical rules and patterns that AI agents must follow when implementing code. Optimized for LLM context efficiency.' -disable-model-invocation: true ---- - -IT IS CRITICAL THAT YOU FOLLOW THIS COMMAND: LOAD the FULL @{project-root}/_bmad/bmm/workflows/generate-project-context/workflow.md, READ its entire contents and follow its directions exactly! From 981e5a49c2abdf5366d3a68f6c3b5f6aedd8aa7a Mon Sep 17 00:00:00 2001 From: Chad Woolley Date: Sun, 1 Feb 2026 08:05:49 -0800 Subject: [PATCH 13/13] docs: Add exact slash commands to getting-started guide (#1505) The getting-started tutorial referenced agents and workflows by name (e.g., "Load the PM agent", "Run the prd workflow") without providing the actual commands to type. This adds the exact slash commands inline alongside the existing prose so new users know precisely what to run. --- docs/tutorials/getting-started.md | 76 ++++++++++++++++--------------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/docs/tutorials/getting-started.md b/docs/tutorials/getting-started.md index 38d25a2d..54a9b240 100644 --- a/docs/tutorials/getting-started.md +++ b/docs/tutorials/getting-started.md @@ -65,7 +65,11 @@ The installer creates two folders: - `_bmad/` — agents, workflows, tasks, and configuration - `_bmad-output/` — empty for now, but this is where your artifacts will be saved -Open your AI IDE in the project folder. Run the `help` workflow (`/bmad-help` on most platforms) to see what to do next — it detects what you've completed and recommends the next step. +Open your AI IDE in the project folder. Run the `help` workflow (`/bmad-help`) to see what to do next — it detects what you've completed and recommends the next step. + +:::note[How to Load Agents and Run Workflows] +Each workflow has a **slash command** you run in your IDE (e.g., `/bmad-bmm-create-prd`). Running a workflow command automatically loads the appropriate agent — you don't need to load agents separately. You can also load an agent directly for general conversation (e.g., `/bmad-agent-bmm-pm` for the PM agent). +::: :::caution[Fresh Chats] Always start a fresh chat for each workflow. This prevents context limitations from causing issues. @@ -78,29 +82,29 @@ Work through phases 1-3. **Use fresh chats for each workflow.** ### Phase 1: Analysis (Optional) All workflows in this phase are optional: -- **brainstorming** — Guided ideation -- **research** — Market and technical research -- **create-product-brief** — Recommended foundation document +- **brainstorming** (`/bmad-brainstorming`) — Guided ideation +- **research** (`/bmad-bmm-research`) — Market and technical research +- **create-product-brief** (`/bmad-bmm-create-product-brief`) — Recommended foundation document ### Phase 2: Planning (Required) **For BMad Method and Enterprise tracks:** -1. Load the **PM agent** in a new chat -2. Run the `prd` workflow +1. Load the **PM agent** (`/bmad-agent-bmm-pm`) in a new chat +2. Run the `prd` workflow (`/bmad-bmm-create-prd`) 3. Output: `PRD.md` **For Quick Flow track:** -- Use the `quick-spec` workflow instead of PRD, then skip to implementation +- Use the `quick-spec` workflow (`/bmad-bmm-quick-spec`) instead of PRD, then skip to implementation :::note[UX Design (Optional)] -If your project has a user interface, load the **UX-Designer agent** and run the UX design workflow after creating your PRD. +If your project has a user interface, load the **UX-Designer agent** (`/bmad-agent-bmm-ux-designer`) and run the UX design workflow (`/bmad-bmm-create-ux-design`) after creating your PRD. ::: ### Phase 3: Solutioning (BMad Method/Enterprise) **Create Architecture** -1. Load the **Architect agent** in a new chat -2. Run `create-architecture` +1. Load the **Architect agent** (`/bmad-agent-bmm-architect`) in a new chat +2. Run `create-architecture` (`/bmad-bmm-create-architecture`) 3. Output: Architecture document with technical decisions **Create Epics and Stories** @@ -109,13 +113,13 @@ If your project has a user interface, load the **UX-Designer agent** and run the Epics and stories are now created *after* architecture. This produces better quality stories because architecture decisions (database, API patterns, tech stack) directly affect how work should be broken down. ::: -1. Load the **PM agent** in a new chat -2. Run `create-epics-and-stories` +1. Load the **PM agent** (`/bmad-agent-bmm-pm`) in a new chat +2. Run `create-epics-and-stories` (`/bmad-bmm-create-epics-and-stories`) 3. The workflow uses both PRD and Architecture to create technically-informed stories **Implementation Readiness Check** *(Highly Recommended)* -1. Load the **Architect agent** in a new chat -2. Run `check-implementation-readiness` +1. Load the **Architect agent** (`/bmad-agent-bmm-architect`) in a new chat +2. Run `check-implementation-readiness` (`/bmad-bmm-check-implementation-readiness`) 3. Validates cohesion across all planning documents ## Step 2: Build Your Project @@ -124,19 +128,19 @@ Once planning is complete, move to implementation. **Each workflow should run in ### Initialize Sprint Planning -Load the **SM agent** and run `sprint-planning`. This creates `sprint-status.yaml` to track all epics and stories. +Load the **SM agent** (`/bmad-agent-bmm-sm`) and run `sprint-planning` (`/bmad-bmm-sprint-planning`). This creates `sprint-status.yaml` to track all epics and stories. ### The Build Cycle For each story, repeat this cycle with fresh chats: -| Step | Agent | Workflow | Purpose | -| ---- | ----- | -------------- | ---------------------------------- | -| 1 | SM | `create-story` | Create story file from epic | -| 2 | DEV | `dev-story` | Implement the story | -| 3 | DEV | `code-review` | Quality validation *(recommended)* | +| Step | Agent | Workflow | Command | Purpose | +| ---- | ----- | -------------- | -------------------------- | ---------------------------------- | +| 1 | SM | `create-story` | `/bmad-bmm-create-story` | Create story file from epic | +| 2 | DEV | `dev-story` | `/bmad-bmm-dev-story` | Implement the story | +| 3 | DEV | `code-review` | `/bmad-bmm-code-review` | Quality validation *(recommended)* | -After completing all stories in an epic, load the **SM agent** and run `retrospective`. +After completing all stories in an epic, load the **SM agent** (`/bmad-agent-bmm-sm`) and run `retrospective` (`/bmad-bmm-retrospective`). ## What You've Accomplished @@ -162,17 +166,17 @@ your-project/ ## Quick Reference -| Workflow | Agent | Purpose | -| -------------------------------- | --------- | ------------------------------------ | -| `help` | Any | Get guidance on what to do next | -| `prd` | PM | Create Product Requirements Document | -| `create-architecture` | Architect | Create architecture document | -| `create-epics-and-stories` | PM | Break down PRD into epics | -| `check-implementation-readiness` | Architect | Validate planning cohesion | -| `sprint-planning` | SM | Initialize sprint tracking | -| `create-story` | SM | Create a story file | -| `dev-story` | DEV | Implement a story | -| `code-review` | DEV | Review implemented code | +| Workflow | Command | Agent | Purpose | +| -------------------------------- | ------------------------------------------ | --------- | ------------------------------------ | +| `help` | `/bmad-help` | Any | Get guidance on what to do next | +| `prd` | `/bmad-bmm-create-prd` | PM | Create Product Requirements Document | +| `create-architecture` | `/bmad-bmm-create-architecture` | Architect | Create architecture document | +| `create-epics-and-stories` | `/bmad-bmm-create-epics-and-stories` | PM | Break down PRD into epics | +| `check-implementation-readiness` | `/bmad-bmm-check-implementation-readiness` | Architect | Validate planning cohesion | +| `sprint-planning` | `/bmad-bmm-sprint-planning` | SM | Initialize sprint tracking | +| `create-story` | `/bmad-bmm-create-story` | SM | Create a story file | +| `dev-story` | `/bmad-bmm-dev-story` | DEV | Implement a story | +| `code-review` | `/bmad-bmm-code-review` | DEV | Review implemented code | ## Common Questions @@ -180,10 +184,10 @@ your-project/ Only for BMad Method and Enterprise tracks. Quick Flow skips from tech-spec to implementation. **Can I change my plan later?** -Yes. The SM agent has a `correct-course` workflow for handling scope changes. +Yes. The SM agent has a `correct-course` workflow (`/bmad-bmm-correct-course`) for handling scope changes. **What if I want to brainstorm first?** -Load the Analyst agent and run `brainstorming` before starting your PRD. +Load the Analyst agent (`/bmad-agent-bmm-analyst`) and run `brainstorming` (`/bmad-brainstorming`) before starting your PRD. **Do I need to follow a strict order?** Not strictly. Once you learn the flow, you can run workflows directly using the Quick Reference above. @@ -192,14 +196,14 @@ Not strictly. Once you learn the flow, you can run workflows directly using the - **During workflows** — Agents guide you with questions and explanations - **Community** — [Discord](https://discord.gg/gk8jAdXWmj) (#bmad-method-help, #report-bugs-and-issues) -- **Stuck?** — Run `help` to see what to do next +- **Stuck?** — Run `help` (`/bmad-help`) to see what to do next ## Key Takeaways :::tip[Remember These] - **Always use fresh chats** — Start a new chat for each workflow - **Track matters** — Quick Flow uses quick-spec; Method/Enterprise need PRD and architecture -- **Use `help` when stuck** — It detects your progress and suggests next steps +- **Use `help` (`/bmad-help`) when stuck** — It detects your progress and suggests next steps ::: Ready to start? Install BMad and let the agents guide you through your first project.