Compare commits
5 Commits
e8756996b9
...
623237795e
| Author | SHA1 | Date |
|---|---|---|
|
|
623237795e | |
|
|
5ad35d68bd | |
|
|
2f484f15b6 | |
|
|
2d2f4855b1 | |
|
|
d94757a7d4 |
|
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
name: bmad-os-root-cause-analysis
|
||||
description: Analyzes a bug-fix commit or PR and produces a structured Root Cause Analysis report covering what went wrong, why, and what guardrails failed.
|
||||
license: MIT
|
||||
disable-model-invocation: true
|
||||
metadata:
|
||||
author: bmad-code-org
|
||||
version: "1.0.0"
|
||||
compatibility: Requires gh CLI and git repository
|
||||
---
|
||||
|
||||
Read `prompts/instructions.md` and execute.
|
||||
|
|
@ -0,0 +1,74 @@
|
|||
# Bug-Fix Root Cause Analysis
|
||||
|
||||
Analyze a bug-fix commit or PR and produce a structured Root Cause Analysis report.
|
||||
|
||||
## Principles
|
||||
|
||||
- **Direct attribution.** This report names the individual who introduced the defect. Industry convention advocates blameless postmortems. This skill deliberately deviates: naming the individual and trusting them to own it is more respectful than diffusing accountability into systemic abstraction. Direct, factual, not accusatory. If authorship can't be determined confidently, say so.
|
||||
- **Pyramid communication.** The executive summary must convey the full picture. A reader who stops after the first paragraph gets the gist. Everything else is supporting evidence.
|
||||
|
||||
## Preflight
|
||||
|
||||
Verify `gh auth status` and that you're in a git repository. Stop with a clear message if either fails.
|
||||
|
||||
## Execution
|
||||
|
||||
1. **Identify the fix.** Accept whatever the user provides — commit SHA, PR, issue, description. Resolve to the specific fix commit/PR using `gh` and `git`. If ambiguous, ask. Confirm the change is actually a bug fix before proceeding.
|
||||
2. **Gather evidence.** Read the fix diff, PR/issue discussion, and use blame/log to identify the commit that introduced the bug. Collect timeline data.
|
||||
3. **Analyze.** Apply 5 Whys. Classify the root cause. Identify contributing factors.
|
||||
4. **Evaluate guardrails.** Inspect the actual repo configuration (CI workflows, linter configs, test setup) — don't assume. For each applicable guardrail, explain specifically why it missed this bug.
|
||||
5. **Write the report** to `_bmad-output/rca-reports/rca-{YYYY-MM-DD}-{slug}.md`. Present the executive summary in chat.
|
||||
|
||||
## Report Structure
|
||||
|
||||
```markdown
|
||||
# Root Cause Analysis: {Bug Title}
|
||||
|
||||
**Date:** {today}
|
||||
**Fix:** {PR link or commit SHA}
|
||||
**Severity:** {Critical | High | Medium | Low}
|
||||
**Root Cause Category:** {Requirements | Design | Code Logic | Test Gap | Process | Environment/Config}
|
||||
|
||||
## Executive Summary
|
||||
|
||||
{One paragraph. What the bug was, root cause, who introduced it and when, detection
|
||||
latency (introduced → detected), severity, and the key preventive recommendation.}
|
||||
|
||||
## What Was the Problem?
|
||||
|
||||
## When Did It Happen?
|
||||
|
||||
| Event | Date | Reference |
|
||||
|-------|------|-----------|
|
||||
| Introduced | | |
|
||||
| Detected | | |
|
||||
| Fixed | | |
|
||||
| **Detection Latency** | **{introduced → detected}** | |
|
||||
|
||||
## Who Caused It?
|
||||
|
||||
{Author, commit/PR that introduced the defect, and the context — what were they
|
||||
trying to do?}
|
||||
|
||||
## How Did It Happen?
|
||||
|
||||
## Why Did It Happen?
|
||||
|
||||
{5 Whys analysis. Root cause category. Contributing factors.}
|
||||
|
||||
## Failed Guardrails Analysis
|
||||
|
||||
| Guardrail | In Place? | Why It Failed |
|
||||
|-----------|-----------|---------------|
|
||||
| | | |
|
||||
|
||||
**Most Critical Failure:** {Which one mattered most and why.}
|
||||
|
||||
## Resolution
|
||||
|
||||
## Corrective & Preventive Actions
|
||||
|
||||
| # | Action | Type | Priority |
|
||||
|---|--------|------|----------|
|
||||
| | | {Prevent/Detect/Mitigate} | |
|
||||
```
|
||||
17
CHANGELOG.md
17
CHANGELOG.md
|
|
@ -2,9 +2,26 @@
|
|||
|
||||
## [6.0.3]
|
||||
|
||||
### 🎁 Features
|
||||
|
||||
* Add bmad-os-root-cause-analysis skill for analyzing bug-fix commits and producing structured root cause analysis reports with pyramid communication format (#1741)
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
* Fix installer to refuse installation when ancestor directory has BMAD commands, preventing duplicate command autocompletion in nested directories (#1735)
|
||||
* Fix OpenCode integration by replacing unsupported `name` frontmatter with `mode: all` and update directory names to plural form (#1764)
|
||||
* Fix CSV manifest pipeline double-escaping of quotes that was corrupting output files; switch Gemini templates to single quotes (#1746)
|
||||
* Fix workflow descriptions to use proper quotes so they format better in skill conversion and don't break yaml front matter
|
||||
* Fix workflow help task chaining by removing ambiguous "with-argument" clause that caused LLMs to misinterpret help.md as skill calls (#1740)
|
||||
|
||||
### ♻️ Refactoring
|
||||
|
||||
* Standardize all workflow descriptions to use proper quotes to prevent breaking command or skill front matter during skill conversion
|
||||
|
||||
### 📚 Documentation
|
||||
|
||||
* Fix broken TEA hyperlinks to point to new repository URL (#1772)
|
||||
* Rebrand BMAD acronym to "Build More Architect Dreams" across documentation (#1765)
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ BMad Method extends with official modules for specialized domains. Available dur
|
|||
| ----------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- |
|
||||
| **[BMad Method (BMM)](https://github.com/bmad-code-org/BMAD-METHOD)** | Core framework with 34+ workflows |
|
||||
| **[BMad Builder (BMB)](https://github.com/bmad-code-org/bmad-builder)** | Create custom BMad agents and workflows |
|
||||
| **[Test Architect (TEA)](https://github.com/bmad-code-org/tea)** | Risk-based test strategy and automation |
|
||||
| **[Test Architect (TEA)](https://github.com/bmad-code-org/bmad-method-test-architecture-enterprise)** | Risk-based test strategy and automation |
|
||||
| **[Game Dev Studio (BMGD)](https://github.com/bmad-code-org/bmad-module-game-dev-studio)** | Game development workflows (Unity, Unreal, Godot) |
|
||||
| **[Creative Intelligence Suite (CIS)](https://github.com/bmad-code-org/bmad-module-creative-intelligence-suite)** | Innovation, brainstorming, design thinking |
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
name: help
|
||||
description: "Analyzes what is done and the users query and offers advice on what to do next. Use if user says what should I do next or what do I do now"
|
||||
description: 'Analyzes what is done and the users query and offers advice on what to do next. Use if user says what should I do next or what do I do now'
|
||||
---
|
||||
|
||||
# Task: BMAD Help
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
name: brainstorming
|
||||
description: 'Facilitate interactive brainstorming sessions using diverse creative techniques and ideation methods. Use when the user says "help me brainstorm" or "help me ideate".'
|
||||
description: 'Facilitate interactive brainstorming sessions using diverse creative techniques and ideation methods. Use when the user says help me brainstorm or help me ideate.'
|
||||
context_file: '' # Optional context file path for project-specific guidance
|
||||
---
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
---
|
||||
name: party-mode
|
||||
description: 'Orchestrates group discussions between all installed BMAD agents, enabling natural multi-agent conversations. Use when user requests "party mode" only.'
|
||||
description: 'Orchestrates group discussions between all installed BMAD agents, enabling natural multi-agent conversations. Use when user requests party mode.'
|
||||
---
|
||||
|
||||
# Party Mode Workflow
|
||||
|
|
|
|||
|
|
@ -34,6 +34,25 @@ class ConfigDrivenIdeSetup extends BaseIdeSetup {
|
|||
* @returns {Promise<Object>} Setup result
|
||||
*/
|
||||
async setup(projectDir, bmadDir, options = {}) {
|
||||
// Check for BMAD files in ancestor directories that would cause duplicates
|
||||
if (this.installerConfig?.ancestor_conflict_check) {
|
||||
const conflict = await this.findAncestorConflict(projectDir);
|
||||
if (conflict) {
|
||||
await prompts.log.error(
|
||||
`Found existing BMAD commands in ancestor installation: ${conflict}\n` +
|
||||
` ${this.name} inherits commands from parent directories, so this would cause duplicates.\n` +
|
||||
` Please remove the BMAD files from that directory first:\n` +
|
||||
` rm -rf "${conflict}"/bmad*`,
|
||||
);
|
||||
return {
|
||||
success: false,
|
||||
reason: 'ancestor-conflict',
|
||||
error: `Ancestor conflict: ${conflict}`,
|
||||
conflictDir: conflict,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
if (!options.silent) await prompts.log.info(`Setting up ${this.name}...`);
|
||||
|
||||
// Clean up any old BMAD installation first
|
||||
|
|
@ -540,6 +559,40 @@ LOAD and execute from: {project-root}/{{bmadFolderName}}/{{path}}
|
|||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Check ancestor directories for existing BMAD files in the same target_dir.
|
||||
* IDEs like Claude Code inherit commands from parent directories, so an existing
|
||||
* installation in an ancestor would cause duplicate commands.
|
||||
* @param {string} projectDir - Project directory being installed to
|
||||
* @returns {Promise<string|null>} Path to conflicting directory, or null if clean
|
||||
*/
|
||||
async findAncestorConflict(projectDir) {
|
||||
const targetDir = this.installerConfig?.target_dir;
|
||||
if (!targetDir) return null;
|
||||
|
||||
const resolvedProject = await fs.realpath(path.resolve(projectDir));
|
||||
let current = path.dirname(resolvedProject);
|
||||
const root = path.parse(current).root;
|
||||
|
||||
while (current !== root && current.length > root.length) {
|
||||
const candidatePath = path.join(current, targetDir);
|
||||
try {
|
||||
if (await fs.pathExists(candidatePath)) {
|
||||
const entries = await fs.readdir(candidatePath);
|
||||
const hasBmad = entries.some((e) => typeof e === 'string' && e.toLowerCase().startsWith('bmad'));
|
||||
if (hasBmad) {
|
||||
return candidatePath;
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
// Can't read directory — skip
|
||||
}
|
||||
current = path.dirname(current);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Walk up ancestor directories from relativeDir toward projectDir, removing each if empty
|
||||
* Stops at projectDir boundary — never removes projectDir itself
|
||||
|
|
|
|||
|
|
@ -206,7 +206,9 @@ class IdeManager {
|
|||
if (handlerResult.tools > 0) parts.push(`${handlerResult.tools} tools`);
|
||||
detail = parts.join(', ');
|
||||
}
|
||||
return { success: true, ide: ideName, detail, handlerResult };
|
||||
// Propagate handler's success status (default true for backward compat)
|
||||
const success = handlerResult?.success !== false;
|
||||
return { success, ide: ideName, detail, error: handlerResult?.error, handlerResult };
|
||||
} catch (error) {
|
||||
await prompts.log.error(`Failed to setup ${ideName}: ${error.message}`);
|
||||
return { success: false, ide: ideName, error: error.message };
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ platforms:
|
|||
installer:
|
||||
target_dir: .claude/commands
|
||||
template_type: default
|
||||
ancestor_conflict_check: true
|
||||
|
||||
cline:
|
||||
name: "Cline"
|
||||
|
|
@ -202,6 +203,9 @@ platforms:
|
|||
# artifact_types: [agents, workflows, tasks, tools]
|
||||
# artifact_types: array (optional) # Filter which artifacts to install (default: all)
|
||||
# skip_existing: boolean (optional) # Skip files that already exist (default: false)
|
||||
# ancestor_conflict_check: boolean (optional) # Refuse install when ancestor dir has BMAD files
|
||||
# # in the same target_dir (for IDEs that inherit
|
||||
# # commands from parent directories)
|
||||
|
||||
# ============================================================================
|
||||
# Platform Categories
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ description: '{{description}}'
|
|||
You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command.
|
||||
|
||||
<agent-activation CRITICAL="TRUE">
|
||||
1. LOAD the FULL agent file from @_bmad/{{module}}/agents/{{path}}
|
||||
1. LOAD the FULL agent file from {project-root}/_bmad/{{module}}/agents/{{path}}
|
||||
2. READ its entire contents - this contains the complete agent persona, menu, and instructions
|
||||
3. Execute ALL activation steps exactly as written in the agent file
|
||||
4. Follow the agent's persona and menu system precisely
|
||||
|
|
|
|||
|
|
@ -6,9 +6,9 @@ description: '{{description}}'
|
|||
IT IS CRITICAL THAT YOU FOLLOW THESE STEPS - while staying in character as the current agent persona you may have loaded:
|
||||
|
||||
<steps CRITICAL="TRUE">
|
||||
1. Always LOAD the FULL @{project-root}/{{bmadFolderName}}/core/tasks/workflow.xml
|
||||
2. READ its entire contents - this is the CORE OS for EXECUTING the specific workflow-config @{project-root}/{{bmadFolderName}}/{{path}}
|
||||
3. Pass the yaml path @{project-root}/{{bmadFolderName}}/{{path}} as 'workflow-config' parameter to the workflow.xml instructions
|
||||
1. Always LOAD the FULL {project-root}/{{bmadFolderName}}/core/tasks/workflow.xml
|
||||
2. READ its entire contents - this is the CORE OS for EXECUTING the specific workflow-config {project-root}/{{bmadFolderName}}/{{path}}
|
||||
3. Pass the yaml path {project-root}/{{bmadFolderName}}/{{path}} 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
|
||||
</steps>
|
||||
|
|
|
|||
|
|
@ -3,4 +3,4 @@ name: '{{name}}'
|
|||
description: '{{description}}'
|
||||
---
|
||||
|
||||
IT IS CRITICAL THAT YOU FOLLOW THIS COMMAND: LOAD the FULL @{project-root}/{{bmadFolderName}}/{{path}}, READ its entire contents and follow its directions exactly!
|
||||
IT IS CRITICAL THAT YOU FOLLOW THIS COMMAND: LOAD the FULL {project-root}/{{bmadFolderName}}/{{path}}, READ its entire contents and follow its directions exactly!
|
||||
|
|
|
|||
|
|
@ -5,8 +5,8 @@ description: '{{description}}'
|
|||
IT IS CRITICAL THAT YOU FOLLOW THESE STEPS - while staying in character as the current agent persona you may have loaded:
|
||||
|
||||
<steps CRITICAL="TRUE">
|
||||
1. Always LOAD the FULL @_bmad/core/tasks/workflow.xml
|
||||
2. READ its entire contents - this is the CORE OS for EXECUTING the specific workflow-config @{{workflow_path}}
|
||||
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}/{{workflow_path}}
|
||||
3. Pass the yaml path {{workflow_path}} 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
|
||||
|
|
|
|||
|
|
@ -2,4 +2,4 @@
|
|||
description: '{{description}}'
|
||||
---
|
||||
|
||||
IT IS CRITICAL THAT YOU FOLLOW THIS COMMAND: LOAD the FULL @{{workflow_path}}, READ its entire contents and follow its directions exactly!
|
||||
IT IS CRITICAL THAT YOU FOLLOW THIS COMMAND: LOAD the FULL {project-root}/{{workflow_path}}, READ its entire contents and follow its directions exactly!
|
||||
|
|
|
|||
Loading…
Reference in New Issue