Compare commits

..

3 Commits

Author SHA1 Message Date
Tim Graepel 82411feef3 fix: address CodeRabbit PR review comments for Bob IDE support
- Remove leftover '// Made with Bob' debug comment
- Guard artifact.sourcePath before calling path.relative() to prevent TypeError
- Fix run-on customInstructions string with proper punctuation in createModeObject
- Move fs-extra require to top of file; remove inline requires from clearBmadWorkflows/cleanup
- Wrap write sequence in try/catch with rollback to prevent partial state on failure
- Use metadata.title and metadata.icon in installCustomAgentLauncher instead of ignoring param
- Align installCustomAgentLauncher mode object with createModeObject (icon in name, fixed instructions)
- Remove unused .bobmodes entry from .gitignore (.bob already covers the directory)
- Sync bob description in tools/cli/installers/lib/ide/platform-codes.yaml to match tools/platform-codes.yaml
2026-02-27 23:25:05 +01:00
Tim Graepel 740662350a feat(ide): add Bob IDE installer support
- bob.js: fix installCustomAgentLauncher using wrong mode schema
  (description/prompt/always/permissions → roleDefinition/whenToUse/
  customInstructions/groups)
- bob.js: add detectionPaths for .bob directory
- manager.js: update comments to include bob.js in custom installer list
- platform-codes.yaml: move bob entry to correct alphabetical position
- eslint.config.mjs: add .bob/** to eslint ignores (like .claude, .roo, etc.)
2026-02-27 23:25:05 +01:00
Tim Graepel ab41b23751 feat: add IBM Bob platform support (#1768)
Add IBM Bob (agentic IDE) as a supported IDE platform with custom installer:

- Create custom Bob installer (tools/cli/installers/lib/ide/bob.js)
- Add .bobmodes to .gitignore
- Add platform config to tools/platform-codes.yaml
- Register Bob in IDE manager's custom installer list

Bob uses a custom installer (like Kilo) that creates a .bobmodes file
to register custom modes and writes workflows to .bob/workflows/

Fixes #1768
2026-02-27 23:25:05 +01:00
16 changed files with 36 additions and 140 deletions

View File

@ -1,20 +1,5 @@
# Changelog # Changelog
## [6.0.4]
### 🎁 Features
* Add edge case hunter review task - new reusable review task that exhaustively traces branching paths and boundary conditions in code, reporting only unhandled gaps. Method-driven analysis complementary to adversarial review (#1790)
### 🐛 Bug Fixes
* Fix brainstorming to not overwrite previous sessions; now prompts to continue existing brainstorming or start a new one when older brainstorming sessions are found
* Fix installer templates - replace legacy `@` path prefixes with explicit `{project-root}` syntax for consistency (#1769)
* Fix edge case hunter - remove zero-findings halt condition that was pressuring the LLM to hallucinate findings when none legitimately exist (#1797)
* Fix broken docs domain references in README and GitHub issue templates (#1777)
---
## [6.0.3] ## [6.0.3]
### 🎁 Features ### 🎁 Features

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "bmad-method", "name": "bmad-method",
"version": "6.0.4", "version": "6.0.3",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "bmad-method", "name": "bmad-method",
"version": "6.0.4", "version": "6.0.3",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@clack/core": "^1.0.0", "@clack/core": "^1.0.0",

View File

@ -1,7 +1,7 @@
{ {
"$schema": "https://json.schemastore.org/package.json", "$schema": "https://json.schemastore.org/package.json",
"name": "bmad-method", "name": "bmad-method",
"version": "6.0.4", "version": "6.0.3",
"description": "Breakthrough Method of Agile AI-driven Development", "description": "Breakthrough Method of Agile AI-driven Development",
"keywords": [ "keywords": [
"agile", "agile",

View File

@ -7,4 +7,3 @@ core,anytime,Shard Document,SD,,_bmad/core/tasks/shard-doc.xml,bmad-shard-doc,fa
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 - 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,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",, 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",,
core,anytime,Edge Case Hunter Review,ECH,,_bmad/core/tasks/review-edge-case-hunter.xml,bmad-review-edge-case-hunter,false,,,"Walk every branching path and boundary condition in code, report only unhandled edge cases. Use alongside adversarial review for orthogonal coverage - method-driven not attitude-driven.",,

Can't render this file because it has a wrong number of fields in line 2.

View File

@ -2,7 +2,7 @@ code: core
name: "BMad Core Module" name: "BMad Core Module"
header: "BMad Core Configuration" header: "BMad Core Configuration"
subheader: "Configure the core settings for your BMad installation.\nThese settings will be used across all installed bmad skills, workflows, and agents." subheader: "Configure the core settings for your BMad installation.\nThese settings will be used across all modules and agents."
user_name: user_name:
prompt: "What should agents call you? (Use your name or a team name)" prompt: "What should agents call you? (Use your name or a team name)"
@ -23,13 +23,3 @@ output_folder:
prompt: "Where should output files be saved?" prompt: "Where should output files be saved?"
default: "_bmad-output" default: "_bmad-output"
result: "{project-root}/{value}" result: "{project-root}/{value}"
tool_supports_subagents:
prompt: "Subagents are supported by the LLM or Tool I will be using?"
default: true
result: "{value}"
tool_supports_agent_teams:
prompt: "Agent Teams are supported by the LLM or Tool I will be using?"
default: false
result: "{value}"

View File

@ -1,63 +0,0 @@
<!-- if possible, run this in a separate subagent or process with read access to the project,
but no context except the content to review -->
<task id="_bmad/core/tasks/review-edge-case-hunter.xml" name="Edge Case Hunter Review"
description="Walk every branching path and boundary condition in content, report only unhandled edge cases. Orthogonal to adversarial review - method-driven not attitude-driven.">
<objective>You are a pure path tracer. Never comment on whether code is good or bad; only list missing handling.
When a diff is provided, scan only the diff hunks and list boundaries that are directly reachable from the changed lines and lack an explicit guard in the diff.
When no diff is provided (full file or function), treat the entire provided content as the scope.
Ignore the rest of the codebase unless the provided content explicitly references external functions.</objective>
<inputs>
<input name="content" desc="Content to review - diff, full file, or function" />
<input name="also_consider" required="false"
desc="Optional areas to keep in mind during review alongside normal edge-case analysis" />
</inputs>
<output-format>Return ONLY a valid JSON array of objects. Each object must contain exactly these four fields and nothing else:
{
"location": "file:line",
"trigger_condition": "one-line description (max 15 words)",
"guard_snippet": "minimal code sketch that closes the gap",
"potential_consequence": "what could actually go wrong (max 15 words)"
}
No extra text, no explanations, no markdown wrapping.</output-format>
<llm critical="true">
<i>MANDATORY: Execute ALL steps in the flow section IN EXACT ORDER</i>
<i>DO NOT skip steps or change the sequence</i>
<i>HALT immediately when halt-conditions are met</i>
<i>Each action xml tag within step xml tag is a REQUIRED action to complete that step</i>
<i>Your method is exhaustive path enumeration — mechanically walk every branch, not hunt by intuition</i>
<i>Trace each branching path: conditionals, switches, early returns, guard clauses, loops, error handlers</i>
<i>Trace each boundary condition: null, undefined, empty, zero, negative, overflow, max-length, type coercion, concurrency, timing</i>
<i>Report ONLY paths and conditions that lack handling — discard handled ones silently</i>
<i>Do NOT editorialize or add filler — findings only</i>
</llm>
<flow>
<step n="1" title="Receive Content">
<action>Load the content to review from provided input or context</action>
<action>If content to review is empty, ask for clarification and abort task</action>
<action>Identify content type (diff, full file, or function) to determine scope rules</action>
</step>
<step n="2" title="Exhaustive Path Analysis" critical="true">
<mandate>Walk every branching path and boundary condition within scope - report only unhandled ones</mandate>
<action>If also_consider input was provided, incorporate those areas into the analysis</action>
<action>Enumerate all branching paths and boundary conditions within scope: conditionals, switches, early returns, guard clauses, loops, error handlers, null/empty states, overflow, type edges, concurrency, timing</action>
<action>For each path: determine whether the content handles it</action>
<action>Collect only the unhandled paths as findings - discard handled ones silently</action>
</step>
<step n="3" title="Present Findings">
<action>Output findings as a JSON array following the output-format specification exactly</action>
</step>
</flow>
<halt-conditions>
<condition>HALT if content is empty or unreadable</condition>
</halt-conditions>
</task>

View File

@ -29,30 +29,23 @@ Initialize the brainstorming workflow by detecting continuation state and settin
## INITIALIZATION SEQUENCE: ## INITIALIZATION SEQUENCE:
### 1. Check for Existing Sessions ### 1. Check for Existing Workflow
First, check the brainstorming sessions folder for existing sessions: First, check if the output document already exists:
- List all files in `{output_folder}/brainstorming/` - Look for file at `{output_folder}/brainstorming/brainstorming-session-{{date}}.md`
- **DO NOT read any file contents** - only list filenames - If exists, read the complete file including frontmatter
- If files exist, identify the most recent by date/time in the filename - If not exists, this is a fresh workflow
- If no files exist, this is a fresh workflow
### 2. Handle Existing Sessions (If Files Found) ### 2. Handle Continuation (If Document Exists)
If existing session files are found: If the document exists and has frontmatter with `stepsCompleted`:
- Display the most recent session filename (do NOT read its content) - **STOP here** and load `./step-01b-continue.md` immediately
- Ask the user: "Found existing session: `[filename]`. Would you like to: - Do not proceed with any initialization tasks
**[1]** Continue this session - Let step-01b handle the continuation logic
**[2]** Start a new session
**[3]** See all existing sessions"
- If user selects **[1]** (continue): Set `{brainstorming_session_output_file}` to that file path and load `./step-01b-continue.md` ### 3. Fresh Workflow Setup (If No Document)
- If user selects **[2]** (new): Generate new filename with current date/time and proceed to step 3
- If user selects **[3]** (see all): List all session filenames and ask which to continue or if new
### 3. Fresh Workflow Setup (If No Files or User Chooses New)
If no document exists or no `stepsCompleted` in frontmatter: If no document exists or no `stepsCompleted` in frontmatter:
@ -62,10 +55,10 @@ Create the brainstorming session document:
```bash ```bash
# Create directory if needed # Create directory if needed
mkdir -p "$(dirname "{brainstorming_session_output_file}")" mkdir -p "$(dirname "{output_folder}/brainstorming/brainstorming-session-{{date}}.md")"
# Initialize from template # Initialize from template
cp "{template_path}" "{brainstorming_session_output_file}" cp "{template_path}" "{output_folder}/brainstorming/brainstorming-session-{{date}}.md"
``` ```
#### B. Context File Check and Loading #### B. Context File Check and Loading
@ -141,7 +134,7 @@ _[Content based on conversation about session parameters and facilitator approac
## APPEND TO DOCUMENT: ## APPEND TO DOCUMENT:
When user selects approach, append the session overview content directly to `{brainstorming_session_output_file}` using the structure from above. When user selects approach, append the session overview content directly to `{output_folder}/brainstorming/brainstorming-session-{{date}}.md` using the structure from above.
### E. Continue to Technique Selection ### E. Continue to Technique Selection
@ -159,7 +152,7 @@ Which approach appeals to you most? (Enter 1-4)"
#### When user selects approach number: #### When user selects approach number:
- **Append initial session overview to `{brainstorming_session_output_file}`** - **Append initial session overview to `{output_folder}/brainstorming/brainstorming-session-{{date}}.md`**
- **Update frontmatter:** `stepsCompleted: [1]`, `selected_approach: '[selected approach]'` - **Update frontmatter:** `stepsCompleted: [1]`, `selected_approach: '[selected approach]'`
- **Load the appropriate step-02 file** based on selection - **Load the appropriate step-02 file** based on selection
@ -174,9 +167,7 @@ After user selects approach number:
## SUCCESS METRICS: ## SUCCESS METRICS:
✅ Existing sessions detected without reading file contents ✅ Existing workflow detected and continuation handled properly
✅ User prompted to continue existing session or start new
✅ Correct session file selected for continuation
✅ Fresh workflow initialized with correct document structure ✅ Fresh workflow initialized with correct document structure
✅ Session context gathered and understood clearly ✅ Session context gathered and understood clearly
✅ User's approach selection captured and routed correctly ✅ User's approach selection captured and routed correctly
@ -185,9 +176,7 @@ After user selects approach number:
## FAILURE MODES: ## FAILURE MODES:
❌ Reading file contents during session detection (wastes context) ❌ Not checking for existing document before creating new one
❌ Not asking user before continuing existing session
❌ Not properly routing user's continue/new session selection
❌ Missing continuation detection leading to duplicate work ❌ Missing continuation detection leading to duplicate work
❌ Insufficient session context gathering ❌ Insufficient session context gathering
❌ Not properly routing user's approach selection ❌ Not properly routing user's approach selection
@ -195,9 +184,7 @@ After user selects approach number:
## SESSION SETUP PROTOCOLS: ## SESSION SETUP PROTOCOLS:
- Always list sessions folder WITHOUT reading file contents - Always verify document existence before initialization
- Ask user before continuing any existing session
- Only load continue step after user confirms
- Load brain techniques CSV only when needed for technique presentation - Load brain techniques CSV only when needed for technique presentation
- Use collaborative facilitation language throughout - Use collaborative facilitation language throughout
- Maintain psychological safety for creative exploration - Maintain psychological safety for creative exploration

View File

@ -35,7 +35,7 @@ Load existing document and analyze current state:
**Document Analysis:** **Document Analysis:**
- Read existing `{brainstorming_session_output_file}` - Read existing `{output_folder}/brainstorming/brainstorming-session-{{date}}.md`
- Examine frontmatter for `stepsCompleted`, `session_topic`, `session_goals` - Examine frontmatter for `stepsCompleted`, `session_topic`, `session_goals`
- Review content to understand session progress and outcomes - Review content to understand session progress and outcomes
- Identify current stage and next logical steps - Identify current stage and next logical steps

View File

@ -296,7 +296,7 @@ After final technique element:
#### If 'C' (Move to organization): #### If 'C' (Move to organization):
- **Append the technique execution content to `{brainstorming_session_output_file}`** - **Append the technique execution content to `{output_folder}/brainstorming/brainstorming-session-{{date}}.md`**
- **Update frontmatter:** `stepsCompleted: [1, 2, 3]` - **Update frontmatter:** `stepsCompleted: [1, 2, 3]`
- **Load:** `./step-04-idea-organization.md` - **Load:** `./step-04-idea-organization.md`
@ -356,7 +356,7 @@ _[Short narrative describing the user and AI collaboration journey - what made t
## APPEND TO DOCUMENT: ## APPEND TO DOCUMENT:
When user selects 'C', append the content directly to `{brainstorming_session_output_file}` using the structure from above. When user selects 'C', append the content directly to `{output_folder}/brainstorming/brainstorming-session-{{date}}.md` using the structure from above.
## SUCCESS METRICS: ## SUCCESS METRICS:

View File

@ -253,14 +253,14 @@ Provide final session wrap-up and forward guidance:
#### If [C] Complete: #### If [C] Complete:
- **Append the final session content to `{brainstorming_session_output_file}`** - **Append the final session content to `{output_folder}/brainstorming/brainstorming-session-{{date}}.md`**
- Update frontmatter: `stepsCompleted: [1, 2, 3, 4]` - Update frontmatter: `stepsCompleted: [1, 2, 3, 4]`
- Set `session_active: false` and `workflow_completed: true` - Set `session_active: false` and `workflow_completed: true`
- Complete workflow with positive closure message - Complete workflow with positive closure message
## APPEND TO DOCUMENT: ## APPEND TO DOCUMENT:
When user selects 'C', append the content directly to `{brainstorming_session_output_file}` using the structure from step 7. When user selects 'C', append the content directly to `{output_folder}/brainstorming/brainstorming-session-{{date}}.md` using the structure from step 7.
## SUCCESS METRICS: ## SUCCESS METRICS:

View File

@ -45,9 +45,7 @@ Load config from `{project-root}/_bmad/core/config.yaml` and resolve:
- `installed_path` = `{project-root}/_bmad/core/workflows/brainstorming` - `installed_path` = `{project-root}/_bmad/core/workflows/brainstorming`
- `template_path` = `{installed_path}/template.md` - `template_path` = `{installed_path}/template.md`
- `brain_techniques_path` = `{installed_path}/brain-methods.csv` - `brain_techniques_path` = `{installed_path}/brain-methods.csv`
- `brainstorming_session_output_file` = `{output_folder}/brainstorming/brainstorming-session-{{date}}-{{time}}.md` (evaluated once at workflow start) - `default_output_file` = `{output_folder}/brainstorming/brainstorming-session-{{date}}.md`
All steps MUST reference `{brainstorming_session_output_file}` instead of the full path pattern.
- `context_file` = Optional context file path from workflow invocation for project-specific guidance - `context_file` = Optional context file path from workflow invocation for project-specific guidance
- `advancedElicitationTask` = `{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml` - `advancedElicitationTask` = `{project-root}/_bmad/core/workflows/advanced-elicitation/workflow.xml`

View File

@ -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. 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"> <agent-activation CRITICAL="TRUE">
1. LOAD the FULL agent file from {project-root}/_bmad/{{module}}/agents/{{path}} 1. LOAD the FULL agent file from @_bmad/{{module}}/agents/{{path}}
2. READ its entire contents - this contains the complete agent persona, menu, and instructions 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 3. Execute ALL activation steps exactly as written in the agent file
4. Follow the agent's persona and menu system precisely 4. Follow the agent's persona and menu system precisely

View File

@ -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: IT IS CRITICAL THAT YOU FOLLOW THESE STEPS - while staying in character as the current agent persona you may have loaded:
<steps CRITICAL="TRUE"> <steps CRITICAL="TRUE">
1. Always LOAD the FULL {project-root}/{{bmadFolderName}}/core/tasks/workflow.xml 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}} 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 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 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 5. Save outputs after EACH section when generating any documents from templates
</steps> </steps>

View File

@ -3,4 +3,4 @@ name: '{{name}}'
description: '{{description}}' 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!

View File

@ -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: IT IS CRITICAL THAT YOU FOLLOW THESE STEPS - while staying in character as the current agent persona you may have loaded:
<steps CRITICAL="TRUE"> <steps CRITICAL="TRUE">
1. Always LOAD the FULL {project-root}/_bmad/core/tasks/workflow.xml 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 {project-root}/{{workflow_path}} 2. READ its entire contents - this is the CORE OS for EXECUTING the specific workflow-config @{{workflow_path}}
3. Pass the yaml path {{workflow_path}} as 'workflow-config' parameter to the workflow.xml instructions 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 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 5. Save outputs after EACH section when generating any documents from templates

View File

@ -2,4 +2,4 @@
description: '{{description}}' description: '{{description}}'
--- ---
IT IS CRITICAL THAT YOU FOLLOW THIS COMMAND: LOAD the FULL {project-root}/{{workflow_path}}, READ its entire contents and follow its directions exactly! IT IS CRITICAL THAT YOU FOLLOW THIS COMMAND: LOAD the FULL @{{workflow_path}}, READ its entire contents and follow its directions exactly!