new workflow types generate slash commands

This commit is contained in:
Brian Madison 2025-12-03 21:35:44 -06:00
parent b8b4b65c10
commit aa1cf76f88
18 changed files with 68 additions and 43 deletions

View File

@ -1,5 +1,5 @@
---
name: Brainstorming Session
name: brainstorming-session
description: Facilitate interactive brainstorming sessions using diverse creative techniques and ideation methods
context_file: '' # Optional context file path for project-specific guidance
---

View File

@ -1,5 +1,5 @@
---
name: Party Mode
name: party-mode
description: Orchestrates group discussions between all installed BMAD agents, enabling natural multi-agent conversations
---

View File

@ -1,5 +1,5 @@
---
name: Create Agent
name: create-agent
description: Interactive workflow to build BMAD Core compliant agents with optional brainstorming, persona development, and command structure
web_bundle: true
---

View File

@ -1,5 +1,5 @@
---
name: Create Workflow
name: create-workflow
description: Create structured standalone workflows using markdown-based step architecture
web_bundle: true
---

View File

@ -1,5 +1,5 @@
---
name: Edit Agent
name: edit-agent
description: Edit existing BMAD agents while following all best practices and conventions
web_bundle: false
---

View File

@ -1,5 +1,5 @@
---
name: Edit Workflow
name: edit-workflow
description: Intelligent workflow editor that helps modify existing workflows while following best practices
web_bundle: true
---

View File

@ -1,5 +1,5 @@
---
name: Workflow Compliance Check
name: workflow-compliance-check
description: Systematic validation of workflows against BMAD standards with adversarial analysis and detailed reporting
web_bundle: false
---

View File

@ -1,5 +1,5 @@
---
name: Product Brief Workflow
name: create-product-brief
description: Create comprehensive product briefs through collaborative step-by-step discovery as creative Business Analyst working with the user as peers.
web_bundle: true
---

View File

@ -1,6 +1,7 @@
---
name: Research Workflow
name: research
description: Conduct comprehensive research across multiple domains using current web data and verified sources - Market, Technical, Domain and other research types.
web_bundle: true
---
# Research Workflow

View File

@ -1,3 +1,9 @@
---
name: create-ux-design
description: Work with a peer UX Design expert to plan your applications UX patterns, look and feel.
web_bundle: true
---
# Create UX Design Workflow
**Goal:** Create comprehensive UX design specifications through collaborative visual exploration and informed decision-making where you act as a UX facilitator working with a product stakeholder.

View File

@ -1,5 +1,5 @@
---
name: PRD Workflow
name: create-prd
description: Creates a comprehensive PRDs through collaborative step-by-step discovery between two product managers working as peers.
main_config: `{project-root}/{bmad_folder}/bmm/config.yaml`
web_bundle: true

View File

@ -1,6 +1,7 @@
---
name: Architecture Workflow
name: create-architecture
description: Collaborative architectural decision facilitation for AI-agent consistency. Replaces template-driven architecture with intelligent, adaptive conversation that produces a decision-focused architecture document optimized for preventing agent conflicts.
web_bundle: true
---
# Architecture Workflow

View File

@ -1,5 +1,5 @@
---
name: 'Create Epics and Stories'
name: create-epics-stories
description: 'Transform PRD requirements and Architecture decisions into comprehensive stories organized by user value. This workflow requires completed PRD + Architecture documents (UX recommended if UI exists) and breaks down requirements into implementation-ready epics and user stories that incorporate all available technical and design context. Creates detailed, actionable stories with complete acceptance criteria for development teams.'
web_bundle: true
---

View File

@ -1,5 +1,5 @@
---
name: 'Implementation Readiness'
name: check-implementation-readiness
description: 'Critical validation workflow that assesses PRD, Architecture, and Epics & Stories for completeness and alignment before implementation. Uses adversarial review approach to find gaps and issues.'
web_bundle: false
---

View File

@ -1,5 +1,5 @@
---
name: Generate Project Context
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.
---

View File

@ -105,7 +105,7 @@ class ManifestGenerator {
}
/**
* Recursively find and parse workflow.yaml files
* Recursively find and parse workflow.yaml and workflow.md files
*/
async getWorkflowsFromPath(basePath, moduleName) {
const workflows = [];
@ -126,11 +126,23 @@ class ManifestGenerator {
// Recurse into subdirectories
const newRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
await findWorkflows(fullPath, newRelativePath);
} else if (entry.name === 'workflow.yaml') {
// Parse workflow file
} else if (entry.name === 'workflow.yaml' || entry.name === 'workflow.md') {
// Parse workflow file (both YAML and MD formats)
try {
const content = await fs.readFile(fullPath, 'utf8');
const workflow = yaml.load(content);
let workflow;
if (entry.name === 'workflow.yaml') {
// Parse YAML workflow
workflow = yaml.load(content);
} else {
// Parse MD workflow with YAML frontmatter
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
if (!frontmatterMatch) {
continue; // Skip MD files without frontmatter
}
workflow = yaml.load(frontmatterMatch[1]);
}
// Skip template workflows (those with placeholder values)
if (workflow.name && workflow.name.includes('{') && workflow.name.includes('}')) {
@ -141,18 +153,15 @@ class ManifestGenerator {
// Build relative path for installation
const installPath =
moduleName === 'core'
? `${this.bmadFolderName}/core/workflows/${relativePath}/workflow.yaml`
: `${this.bmadFolderName}/${moduleName}/workflows/${relativePath}/workflow.yaml`;
// Check for standalone property (default: false)
const standalone = workflow.standalone === true;
? `${this.bmadFolderName}/core/workflows/${relativePath}/${entry.name}`
: `${this.bmadFolderName}/${moduleName}/workflows/${relativePath}/${entry.name}`;
// ALL workflows now generate commands - no standalone property needed
workflows.push({
name: workflow.name,
description: workflow.description.replaceAll('"', '""'), // Escape quotes for CSV
module: moduleName,
path: installPath,
standalone: standalone,
});
// Add to files list
@ -541,12 +550,12 @@ class ManifestGenerator {
async writeWorkflowManifest(cfgDir) {
const csvPath = path.join(cfgDir, 'workflow-manifest.csv');
// Create CSV header with standalone column
let csv = 'name,description,module,path,standalone\n';
// Create CSV header - removed standalone column as ALL workflows now generate commands
let csv = 'name,description,module,path\n';
// Add all workflows
// Add all workflows - no standalone property needed anymore
for (const workflow of this.workflows) {
csv += `"${workflow.name}","${workflow.description}","${workflow.module}","${workflow.path}","${workflow.standalone}"\n`;
csv += `"${workflow.name}","${workflow.description}","${workflow.module}","${workflow.path}"\n`;
}
await fs.writeFile(csvPath, csv);

View File

@ -25,16 +25,16 @@ class WorkflowCommandGenerator {
return { generated: 0 };
}
// Filter to only standalone workflows
const standaloneWorkflows = workflows.filter((w) => w.standalone === 'true' || w.standalone === true);
// ALL workflows now generate commands - no standalone filtering
const allWorkflows = workflows;
// Base commands directory
const baseCommandsDir = path.join(projectDir, '.claude', 'commands', 'bmad');
let generatedCount = 0;
// Generate a command file for each standalone workflow, organized by module
for (const workflow of standaloneWorkflows) {
// Generate a command file for each workflow, organized by module
for (const workflow of allWorkflows) {
const moduleWorkflowsDir = path.join(baseCommandsDir, workflow.module, 'workflows');
await fs.ensureDir(moduleWorkflowsDir);
@ -46,7 +46,7 @@ class WorkflowCommandGenerator {
}
// Also create a workflow launcher README in each module
const groupedWorkflows = this.groupWorkflowsByModule(standaloneWorkflows);
const groupedWorkflows = this.groupWorkflowsByModule(allWorkflows);
await this.createModuleWorkflowLaunchers(baseCommandsDir, groupedWorkflows);
return { generated: generatedCount };
@ -59,12 +59,12 @@ class WorkflowCommandGenerator {
return { artifacts: [], counts: { commands: 0, launchers: 0 } };
}
// Filter to only standalone workflows
const standaloneWorkflows = workflows.filter((w) => w.standalone === 'true' || w.standalone === true);
// ALL workflows now generate commands - no standalone filtering
const allWorkflows = workflows;
const artifacts = [];
for (const workflow of standaloneWorkflows) {
for (const workflow of allWorkflows) {
const commandContent = await this.generateCommandContent(workflow, bmadDir);
artifacts.push({
type: 'workflow-command',
@ -75,7 +75,7 @@ class WorkflowCommandGenerator {
});
}
const groupedWorkflows = this.groupWorkflowsByModule(standaloneWorkflows);
const groupedWorkflows = this.groupWorkflowsByModule(allWorkflows);
for (const [module, launcherContent] of Object.entries(this.buildModuleWorkflowLaunchers(groupedWorkflows))) {
artifacts.push({
type: 'workflow-launcher',
@ -89,7 +89,7 @@ class WorkflowCommandGenerator {
return {
artifacts,
counts: {
commands: standaloneWorkflows.length,
commands: allWorkflows.length,
launchers: Object.keys(groupedWorkflows).length,
},
};
@ -99,8 +99,13 @@ class WorkflowCommandGenerator {
* Generate command content for a workflow
*/
async generateCommandContent(workflow, bmadDir) {
// Load the template
const template = await fs.readFile(this.templatePath, 'utf8');
// Determine template based on workflow file type
const isMarkdownWorkflow = workflow.path.endsWith('workflow.md');
const templateName = isMarkdownWorkflow ? 'workflow-commander.md' : 'workflow-command-template.md';
const templatePath = path.join(path.dirname(this.templatePath), templateName);
// Load the appropriate template
const template = await fs.readFile(templatePath, 'utf8');
// Convert source path to installed path
// From: /Users/.../src/modules/bmm/workflows/.../workflow.yaml
@ -127,9 +132,7 @@ class WorkflowCommandGenerator {
.replaceAll('{{description}}', workflow.description)
.replaceAll('{{workflow_path}}', workflowPath)
.replaceAll('{bmad_folder}', this.bmadFolderName)
.replaceAll('{*bmad_folder*}', '{bmad_folder}')
.replaceAll('{{interactive}}', workflow.interactive)
.replaceAll('{{author}}', workflow.author || 'BMAD');
.replaceAll('{*bmad_folder*}', '{bmad_folder}');
}
/**

View File

@ -0,0 +1,5 @@
---
description: '{{description}}'
---
IT IS CRITICAL THAT YOU FOLLOW THIS COMMAND: LOAD the FULL @{{workflow_path}}, READ its entire contents and follow its directions exactly!