refactor: migrate from Q CLI to Kiro CLI

- Rename QCLIGenerator to KiroCLIGenerator
- Update output directory from .amazonq/cli-agents to .kiro/agents
- Update tool names to Kiro CLI format (read, write, shell)
- Update agent configuration format for Kiro CLI compatibility
- Update all references in installer and commands
- Update package.json script to bmad:generate-kiro-cli
- Update manifest.yaml to reference kiro-cli
This commit is contained in:
Philip Louw 2025-11-26 14:27:54 +02:00
parent 9d510fc075
commit 2b21434a45
8 changed files with 412 additions and 3 deletions

2
.gitignore vendored
View File

@ -42,7 +42,7 @@ cursor
CLAUDE.local.md
.serena/
.claude/settings.local.json
.amazonq
# Project-specific
.bmad-core
.bmad-creator-tools

View File

@ -0,0 +1,46 @@
# Workflow Status - BMM Methodology Tracking
# Generated by BMad Master workflow-init
# Project: q-bmad (Brownfield)
generated: "2025-11-21T10:37:22.564+02:00"
project: "q-bmad"
project_type: "brownfield"
selected_track: "pending_selection"
field_type: "software_development"
workflow_path: "pending_selection"
# Current Phase: Project Assessment (Brownfield Entry)
current_phase: "assessment"
next_recommended_action: "Select appropriate workflow track based on project complexity"
# Available Tracks for Brownfield Projects:
available_tracks:
- enterprise-brownfield: "Complex enterprise applications with multiple stakeholders"
- method-brownfield: "Standard business applications following full methodology"
- quick-flow-brownfield: "Simple applications or rapid assessment needs"
# Assessment Status
workflow_status:
# Phase 0: Project Assessment (Current)
project_assessment:
document-project: "required"
codebase-analysis: "recommended"
tech-debt-audit: "recommended"
requirements-discovery: "optional"
# Pending track selection - will be populated after assessment
track_selection: "pending"
# Instructions
instructions: |
BROWNFIELD PROJECT INITIALIZATION COMPLETE
Next Steps:
1. Run document-project workflow to assess current state
2. Choose appropriate track based on project complexity:
- Enterprise: Large, complex systems with multiple teams
- Method: Standard business applications
- Quick-flow: Simple applications or rapid needs
3. Use workflow-status to get phase-specific recommendations
Recommended immediate action: analyst → document-project

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "bmad-method",
"version": "6.0.0-alpha.11",
"version": "6.0.0-alpha.12",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "bmad-method",
"version": "6.0.0-alpha.11",
"version": "6.0.0-alpha.12",
"license": "MIT",
"dependencies": {
"@kayvan/markdown-tree-parser": "^1.6.1",

View File

@ -25,6 +25,7 @@
},
"scripts": {
"bmad:agent-install": "node tools/cli/bmad-cli.js agent-install",
"bmad:generate-kiro-cli": "node tools/cli/bmad-cli.js generate-kiro-cli-agents",
"bmad:install": "node tools/cli/bmad-cli.js install",
"bmad:status": "node tools/cli/bmad-cli.js status",
"bundle": "node tools/cli/bundlers/bundle-web.js all",

View File

@ -0,0 +1,35 @@
const chalk = require('chalk');
const { KiroCLIGenerator } = require('../lib/kiro-cli-generator');
const kiroGenerator = new KiroCLIGenerator();
module.exports = {
command: 'generate-kiro-cli-agents',
description: 'Generate Kiro CLI agent files from BMAD agent manifest',
options: [
['-o, --output <path>', 'Output directory (default: .kiro/agents)'],
['-f, --force', 'Overwrite existing files'],
],
action: async (options) => {
try {
console.log(chalk.cyan('\n🤖 Kiro CLI Agent Generator\n'));
const result = await kiroGenerator.generateWithOutput(process.cwd(), {
outputDir: options.output,
force: options.force,
});
console.log(chalk.cyan(`\n📊 Generation Summary:`));
console.log(chalk.green(`✅ Generated: ${result.generated} agents`));
console.log(chalk.yellow(`⏭️ Skipped: ${result.skipped} agents`));
console.log(chalk.dim(`📁 Output: ${result.outputDir}`));
if (result.generated > 0) {
console.log(chalk.cyan('\n🎉 Kiro CLI agents ready! You can now use them in Kiro CLI.'));
}
} catch (error) {
console.error(chalk.red('❌ Error generating Kiro CLI agents:'), error.message);
process.exit(1);
}
},
};

View File

@ -2,9 +2,11 @@ const chalk = require('chalk');
const path = require('node:path');
const { Installer } = require('../installers/lib/core/installer');
const { UI } = require('../lib/ui');
const { KiroCLIGenerator } = require('../lib/kiro-cli-generator');
const installer = new Installer();
const ui = new UI();
const kiroGenerator = new KiroCLIGenerator();
module.exports = {
command: 'install',
@ -57,6 +59,16 @@ module.exports = {
if (result && result.success) {
console.log(chalk.green('\n✨ Installation complete!'));
console.log(chalk.cyan('BMAD Core and Selected Modules have been installed to:'), chalk.bold(result.path));
// Generate Kiro CLI agents automatically using the installation directory
try {
// Use the directory where BMAD was installed, not current working directory
const installDir = path.dirname(result.path); // Remove .bmad from path to get project root
await kiroGenerator.generateWithOutput(installDir);
} catch (error) {
console.log(chalk.yellow('⚠️ Kiro CLI agent generation failed (non-critical):'), error.message);
}
console.log(chalk.yellow('\nThank you for helping test the early release version of the new BMad Core and BMad Method!'));
console.log(chalk.cyan('Stable Beta coming soon - please read the full readme.md and linked documentation to get started!'));
process.exit(0);

View File

@ -0,0 +1,165 @@
const path = require('node:path');
const fs = require('fs-extra');
const { BaseIdeSetup } = require('./_base-ide');
const chalk = require('chalk');
const { KiroCLIGenerator } = require('../../../lib/kiro-cli-generator');
/**
* Kiro CLI setup handler
* Generates Kiro CLI agent files from BMAD agent manifest
*/
class KiroCliSetup extends BaseIdeSetup {
constructor() {
super('kiro-cli', 'Kiro CLI');
this.configDir = '.kiro';
this.agentsDir = 'agents';
this.kiroGenerator = new KiroCLIGenerator();
}
/**
* Setup Kiro CLI configuration
* @param {string} projectDir - Project directory
* @param {string} bmadDir - BMAD installation directory
* @param {Object} config - Configuration object
* @returns {Promise<Object>} Setup result
*/
async setup(projectDir, bmadDir, config) {
try {
console.log(chalk.cyan(' Setting up Kiro CLI integration...'));
const outputDir = path.join(projectDir, this.configDir, this.agentsDir);
// Generate Kiro CLI agents from BMAD manifest
const result = await this.kiroGenerator.generateAgents(
projectDir,
outputDir,
true, // Force overwrite to ensure latest versions
);
console.log(chalk.green(` ✅ Generated ${result.generated} Kiro CLI agents`));
if (result.skipped > 0) {
console.log(chalk.dim(` (${result.skipped} agents were up to date)`));
}
// Create a simple readme for Kiro CLI users
const readmePath = path.join(outputDir, 'README.md');
const readmeContent = `# BMAD Kiro CLI Agents
Auto-generated Kiro CLI agents from your BMAD installation.
## Usage
\`\`\`bash
# Use any BMAD agent in Kiro CLI
kiro-cli chat --agent analyst # Strategic Business Analyst
kiro-cli chat --agent architect # System Architect
kiro-cli chat --agent dev # Senior Developer
kiro-cli chat --agent pm # Product Manager
kiro-cli chat --agent sm # Scrum Master
kiro-cli chat --agent tea # Test Architect
kiro-cli chat --agent tech-writer # Technical Writer
kiro-cli chat --agent ux-designer # UX Designer
# Specialist agents
kiro-cli chat --agent codebase-analyzer
kiro-cli chat --agent tech-debt-auditor
kiro-cli chat --agent market-researcher
# ... and many more
\`\`\`
## Features
- **Lazy Loading**: Workflows loaded on-demand for context efficiency
- **File Outputs**: Generate structured deliverables
- **Conversational**: Optimized for Kiro CLI interaction
- **Full BMAD Capabilities**: Access to all workflows and expertise
## Updates
These agents are automatically regenerated when you update BMAD.
Manual regeneration: \`npm run bmad:generate-kiro-cli --force\`
Generated: ${new Date().toISOString()}
`;
await fs.writeFile(readmePath, readmeContent);
return {
success: true,
message: `Kiro CLI integration complete with ${result.generated} agents`,
details: {
agentsGenerated: result.generated,
outputDirectory: outputDir,
totalAgents: result.total,
},
};
} catch (error) {
console.error(chalk.red(' ❌ Kiro CLI setup failed:'), error.message);
return {
success: false,
message: `Kiro CLI setup failed: ${error.message}`,
error: error,
};
}
}
/**
* Check if Kiro CLI is available/configured in the project
* @param {string} projectDir - Project directory
* @returns {Promise<boolean>} True if Kiro CLI is detected
*/
async isConfigured(projectDir) {
const kiroDir = path.join(projectDir, this.configDir);
return await fs.pathExists(kiroDir);
}
/**
* Get setup instructions for Kiro CLI
* @returns {string} Setup instructions
*/
getSetupInstructions() {
return `Kiro CLI agents will be generated automatically.
After setup, use: kiro-cli chat --agent <agent-name>
Example: kiro-cli chat --agent analyst`;
}
/**
* Validate Kiro CLI setup
* @param {string} projectDir - Project directory
* @returns {Promise<Object>} Validation result
*/
async validate(projectDir) {
const agentsDir = path.join(projectDir, this.configDir, this.agentsDir);
if (!(await fs.pathExists(agentsDir))) {
return {
valid: false,
message: 'Kiro CLI agents directory not found',
};
}
// Check if we have agent files
const files = await fs.readdir(agentsDir);
const agentFiles = files.filter((f) => f.endsWith('.json'));
if (agentFiles.length === 0) {
return {
valid: false,
message: 'No Kiro CLI agent files found',
};
}
return {
valid: true,
message: `Kiro CLI integration ready with ${agentFiles.length} agents`,
details: {
agentCount: agentFiles.length,
agentsDir: agentsDir,
},
};
}
}
module.exports = { KiroCliSetup };

View File

@ -0,0 +1,150 @@
const fs = require('node:fs');
const path = require('node:path');
const csv = require('csv-parse/sync');
const chalk = require('chalk');
class KiroCLIGenerator {
constructor() {}
/**
* Generate Kiro CLI agent files from BMAD agent manifest
* @param {string} projectRoot - Project root directory
* @param {string} outputDir - Output directory for Kiro CLI agents
* @param {boolean} force - Overwrite existing files
* @returns {Object} Generation results
*/
async generateAgents(projectRoot, outputDir = null, force = false) {
const manifestPath = path.join(projectRoot, '.bmad/_cfg/agent-manifest.csv');
const defaultOutputDir = path.join(projectRoot, '.kiro/agents');
const targetOutputDir = outputDir || defaultOutputDir;
// Validate manifest exists
if (!fs.existsSync(manifestPath)) {
throw new Error(`Agent manifest not found at: ${manifestPath}`);
}
// Create output directory
if (!fs.existsSync(targetOutputDir)) {
fs.mkdirSync(targetOutputDir, { recursive: true });
}
// Read and parse agent manifest
const manifestContent = fs.readFileSync(manifestPath, 'utf8');
const agents = csv.parse(manifestContent, {
columns: true,
skip_empty_lines: true,
});
let generated = 0;
let skipped = 0;
for (const agent of agents) {
const agentJsonPath = path.join(targetOutputDir, `${agent.name}.json`);
const agentPromptPath = path.join(targetOutputDir, `${agent.name}-prompt.md`);
// Skip if files exist and not forcing
if (!force && (fs.existsSync(agentJsonPath) || fs.existsSync(agentPromptPath))) {
skipped++;
continue;
}
// Generate Kiro CLI agent JSON
const kiroAgent = {
name: agent.name,
description: `BMAD ${agent.title} (context optimized) - auto-generated from manifest`,
prompt: `file://./${agent.name}-prompt.md`,
tools: ['read', 'write', 'shell', '@docker_mcp_gateway'],
allowedTools: ['read', 'write', 'shell', '@docker_mcp_gateway'],
mcpServers: {},
resources: ['file://.bmad/bmm/config.yaml'],
model: 'claude-sonnet-4',
};
// Generate Kiro CLI agent prompt
const kiroPrompt = `# ${agent.name} (Context Optimized)
**IMPORTANT**: Only load specific workflow/task details when explicitly needed using fs_read.
Load workflows: \`file://.bmad/bmm/workflows/[name]/workflow.yaml\`
You are ${agent.displayName}, a ${agent.title} ${agent.icon}
## Core Identity
- **Role**: ${agent.role}
- **Identity**: ${agent.identity}
- **Communication Style**: ${agent.communicationStyle}
- **Principles**: ${agent.principles}
## Kiro CLI Optimization
- **Lazy Loading**: Load workflow files only when requested using read tool
- **Context Efficiency**: Minimal initial load, expand on demand
- **File Output**: Generate files as specified in workflows
- **Session Continuity**: Maintain conversation context within Kiro CLI
- **MCP Integration**: Inherits MCP servers from agent configuration
## Available Workflows
Load workflows from: \`.bmad/bmm/workflows/\`
## MCP Server Access
You have access to any MCP servers configured in this agent's configuration.
Use MCP capabilities when they provide better functionality than basic tools.
## Interaction Pattern
1. **Greet user** as ${agent.displayName}
2. **Offer capabilities** based on role and available workflows
3. **Load workflows** on demand using read tool when user requests specific functionality
4. **Execute conversationally** following loaded workflow instructions
5. **Generate outputs** to appropriate file paths
6. **Leverage available MCP servers** when they enhance functionality
## Configuration
- **Project Root**: Use current working directory
- **Config**: Load from .bmad/bmm/config.yaml
- **Output**: Use configured output folder from config
Remember: You are ${agent.displayName} - ${agent.identity}`;
// Write files
fs.writeFileSync(agentJsonPath, JSON.stringify(kiroAgent, null, 2));
fs.writeFileSync(agentPromptPath, kiroPrompt);
generated++;
}
return {
total: agents.length,
generated,
skipped,
outputDir: targetOutputDir,
};
}
/**
* Generate Kiro CLI agents with console output
* @param {string} projectRoot - Project root directory
* @param {Object} options - Generation options
*/
async generateWithOutput(projectRoot, options = {}) {
try {
console.log(chalk.cyan('🤖 Generating Kiro CLI agents...'));
const result = await this.generateAgents(projectRoot, options.outputDir, options.force);
if (result.generated > 0) {
console.log(chalk.green(`✅ Generated ${result.generated} Kiro CLI agents`));
if (result.skipped > 0) {
console.log(chalk.yellow(`⏭️ Skipped ${result.skipped} existing agents`));
}
console.log(chalk.dim(`📁 Output: ${result.outputDir}`));
} else {
console.log(chalk.yellow('⏭️ All Kiro CLI agents already exist (use --force to regenerate)'));
}
return result;
} catch (error) {
console.error(chalk.red('❌ Kiro CLI agent generation failed:'), error.message);
throw error;
}
}
name = 'Kiro CLI Agent Generator';
}
module.exports = { KiroCLIGenerator };