Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f32a5fe08a | ||
|
|
3c13c56498 | ||
|
|
97f01f6931 | ||
|
|
c42002f1ea |
@@ -1,3 +1,10 @@
|
|||||||
|
# [4.28.0](https://github.com/bmadcode/BMAD-METHOD/compare/v4.27.6...v4.28.0) (2025-07-12)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* bmad-master can load kb properly ([3c13c56](https://github.com/bmadcode/BMAD-METHOD/commit/3c13c564988f9750e043939dd770aea4196a7e7a))
|
||||||
|
|
||||||
## [4.27.6](https://github.com/bmadcode/BMAD-METHOD/compare/v4.27.5...v4.27.6) (2025-07-08)
|
## [4.27.6](https://github.com/bmadcode/BMAD-METHOD/compare/v4.27.5...v4.27.6) (2025-07-08)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ activation-instructions:
|
|||||||
- Greet the user with your name and role, and inform of the *help command.
|
- Greet the user with your name and role, and inform of the *help command.
|
||||||
- CRITICAL: Do NOT scan filesystem or load any resources during startup, ONLY when commanded
|
- CRITICAL: Do NOT scan filesystem or load any resources during startup, ONLY when commanded
|
||||||
- CRITICAL: Do NOT run discovery tasks automatically
|
- CRITICAL: Do NOT run discovery tasks automatically
|
||||||
- CRITICAL: NEVER LOAD data/bmad-kb.md UNLESS USER TYPES *kb
|
- CRITICAL: NEVER LOAD {root}/data/bmad-kb.md UNLESS USER TYPES *kb
|
||||||
agent:
|
agent:
|
||||||
name: BMad Master
|
name: BMad Master
|
||||||
id: bmad-master
|
id: bmad-master
|
||||||
@@ -28,7 +28,7 @@ persona:
|
|||||||
|
|
||||||
commands:
|
commands:
|
||||||
- help: Show these listed commands in a numbered list
|
- help: Show these listed commands in a numbered list
|
||||||
- kb: Toggle KB mode off (default) or on, when on will load and reference the data/bmad-kb.md and converse with the user answering his questions with this informational resource
|
- kb: Toggle KB mode off (default) or on, when on will load and reference the {root}/data/bmad-kb.md and converse with the user answering his questions with this informational resource
|
||||||
- task {task}: Execute task, if not found or none specified, ONLY list available dependencies/tasks listed below
|
- task {task}: Execute task, if not found or none specified, ONLY list available dependencies/tasks listed below
|
||||||
- create-doc {template}: execute task create-doc (no template = ONLY show available templates listed under dependencies/templates below)
|
- create-doc {template}: execute task create-doc (no template = ONLY show available templates listed under dependencies/templates below)
|
||||||
- execute-checklist {checklist}: Run task execute-checklist (no checklist = ONLY show available checklists listed under dependencies/checklist below)
|
- execute-checklist {checklist}: Run task execute-checklist (no checklist = ONLY show available checklists listed under dependencies/checklist below)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ For the complete workflow, see the [BMad Workflow Guide](../bmad-workflow-guide.
|
|||||||
When running `npx bmad-method install`, select **Claude Code** as your IDE. This creates:
|
When running `npx bmad-method install`, select **Claude Code** as your IDE. This creates:
|
||||||
|
|
||||||
- `.bmad-core/` folder with all agents
|
- `.bmad-core/` folder with all agents
|
||||||
- `.claude/commands/` folder with agent command files (`.md`)
|
- `.claude/commands/BMad` folder with agent command files (`.md`)
|
||||||
|
|
||||||
## Using BMad Agents in Claude Code
|
## Using BMad Agents in Claude Code
|
||||||
|
|
||||||
|
|||||||
@@ -6,23 +6,22 @@ For the complete workflow, see the [BMad Workflow Guide](../bmad-workflow-guide.
|
|||||||
|
|
||||||
When running `npx bmad-method install`, select **Gemini CLI** as your IDE. This creates:
|
When running `npx bmad-method install`, select **Gemini CLI** as your IDE. This creates:
|
||||||
|
|
||||||
- `.gemini/agents/` directory with all agent context files
|
- `.gemini/bmad-method/` directory with all agent context in GEMINI.md file
|
||||||
- `.gemini/settings.json` configured to load all agents automatically
|
|
||||||
|
|
||||||
## Using BMad Agents with Gemini CLI
|
## Using BMad Agents with Gemini CLI
|
||||||
|
|
||||||
Simply mention the agent in your prompt:
|
Simply mention the agent in your prompt:
|
||||||
|
|
||||||
- "As @dev, implement the login feature"
|
- "As \*dev, implement the login feature"
|
||||||
- "Acting as @architect, review this system design"
|
- "Acting as \*architect, review this system design"
|
||||||
- "@sm, create the next story for our project"
|
- "\*sm, create the next story for our project"
|
||||||
|
|
||||||
The Gemini CLI automatically loads the appropriate agent context.
|
The Gemini CLI automatically loads the appropriate agent context.
|
||||||
|
|
||||||
## Gemini CLI-Specific Features
|
## Gemini CLI-Specific Features
|
||||||
|
|
||||||
- **Context files**: All agents loaded as context in `.gemini/agents/`
|
- **Context files**: All agents loaded as context in `.gemini/bmad-method/GEMINI.md`
|
||||||
- **Automatic loading**: Settings.json ensures agents are always available
|
- **Automatic loading**: GEMINI.md ensures agents are always available
|
||||||
- **Natural language**: No special syntax needed, just mention the agent
|
- **Natural language**: No special syntax needed, just mention the agent
|
||||||
|
|
||||||
## Tips for Gemini CLI Users
|
## Tips for Gemini CLI Users
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ Follow the SM → Dev cycle for systematic story development:
|
|||||||
|
|
||||||
- **Claude Code**: `/agent-name` (e.g., `/bmad-master`)
|
- **Claude Code**: `/agent-name` (e.g., `/bmad-master`)
|
||||||
- **Cursor**: `@agent-name` (e.g., `@bmad-master`)
|
- **Cursor**: `@agent-name` (e.g., `@bmad-master`)
|
||||||
|
- **Gemini CLI**: `*agent-name` (e.g., `*bmad-master`)
|
||||||
- **Windsurf**: `@agent-name` (e.g., `@bmad-master`)
|
- **Windsurf**: `@agent-name` (e.g., `@bmad-master`)
|
||||||
- **Trae**: `@agent-name` (e.g., `@bmad-master`)
|
- **Trae**: `@agent-name` (e.g., `@bmad-master`)
|
||||||
- **Roo Code**: Select mode from mode selector (e.g., `bmad-bmad-master`)
|
- **Roo Code**: Select mode from mode selector (e.g., `bmad-bmad-master`)
|
||||||
|
|||||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "bmad-method",
|
"name": "bmad-method",
|
||||||
"version": "4.27.6",
|
"version": "4.28.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "bmad-method",
|
"name": "bmad-method",
|
||||||
"version": "4.27.6",
|
"version": "4.28.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@kayvan/markdown-tree-parser": "^1.5.0",
|
"@kayvan/markdown-tree-parser": "^1.5.0",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "bmad-method",
|
"name": "bmad-method",
|
||||||
"version": "4.27.6",
|
"version": "4.28.0",
|
||||||
"description": "Breakthrough Method of Agile AI-driven Development",
|
"description": "Breakthrough Method of Agile AI-driven Development",
|
||||||
"main": "tools/cli.js",
|
"main": "tools/cli.js",
|
||||||
"bin": {
|
"bin": {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ ide-configurations:
|
|||||||
# 3. The agent will adopt that persona for the conversation
|
# 3. The agent will adopt that persona for the conversation
|
||||||
claude-code:
|
claude-code:
|
||||||
name: Claude Code
|
name: Claude Code
|
||||||
rule-dir: .claude/commands/
|
rule-dir: .claude/commands/BMad/
|
||||||
format: multi-file
|
format: multi-file
|
||||||
command-suffix: .md
|
command-suffix: .md
|
||||||
instructions: |
|
instructions: |
|
||||||
@@ -68,13 +68,14 @@ ide-configurations:
|
|||||||
# 4. Rules are stored in .clinerules/ directory in your project
|
# 4. Rules are stored in .clinerules/ directory in your project
|
||||||
gemini:
|
gemini:
|
||||||
name: Gemini CLI
|
name: Gemini CLI
|
||||||
rule-dir: .gemini/agents/
|
rule-dir: .gemini/bmad-method/
|
||||||
format: context-files
|
format: single-file
|
||||||
|
command-suffix: .md
|
||||||
instructions: |
|
instructions: |
|
||||||
# To use BMad agents with the Gemini CLI:
|
# To use BMad agents with the Gemini CLI:
|
||||||
# 1. The installer creates a .gemini/ directory in your project.
|
# 1. The installer creates a .gemini/bmad-method/ directory in your project.
|
||||||
# 2. It also configures .gemini/settings.json to load all agent files.
|
# 2. It concatenates all agent files into a single GEMINI.md file.
|
||||||
# 3. Simply mention the agent in your prompt (e.g., "As @dev, ...").
|
# 3. Simply mention the agent in your prompt (e.g., "As *dev, ...").
|
||||||
# 4. The Gemini CLI will automatically have the context for that agent.
|
# 4. The Gemini CLI will automatically have the context for that agent.
|
||||||
github-copilot:
|
github-copilot:
|
||||||
name: Github Copilot
|
name: Github Copilot
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ class IdeSetup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async setupClaudeCode(installDir, selectedAgent) {
|
async setupClaudeCode(installDir, selectedAgent) {
|
||||||
const commandsDir = path.join(installDir, ".claude", "commands");
|
const commandsDir = path.join(installDir, ".claude", "commands", "BMad");
|
||||||
const agents = selectedAgent ? [selectedAgent] : await this.getAllAgentIds(installDir);
|
const agents = selectedAgent ? [selectedAgent] : await this.getAllAgentIds(installDir);
|
||||||
|
|
||||||
await fileManager.ensureDirectory(commandsDir);
|
await fileManager.ensureDirectory(commandsDir);
|
||||||
@@ -512,12 +512,53 @@ class IdeSetup {
|
|||||||
async setupGeminiCli(installDir, selectedAgent) {
|
async setupGeminiCli(installDir, selectedAgent) {
|
||||||
await initializeModules();
|
await initializeModules();
|
||||||
const geminiDir = path.join(installDir, ".gemini");
|
const geminiDir = path.join(installDir, ".gemini");
|
||||||
const agentsContextDir = path.join(geminiDir, "agents");
|
const bmadMethodDir = path.join(geminiDir, "bmad-method");
|
||||||
await fileManager.ensureDirectory(agentsContextDir);
|
await fileManager.ensureDirectory(bmadMethodDir);
|
||||||
|
|
||||||
|
// Update logic for existing settings.json
|
||||||
|
const settingsPath = path.join(geminiDir, "settings.json");
|
||||||
|
if (await fileManager.pathExists(settingsPath)) {
|
||||||
|
try {
|
||||||
|
const settingsContent = await fileManager.readFile(settingsPath);
|
||||||
|
const settings = JSON.parse(settingsContent);
|
||||||
|
let updated = false;
|
||||||
|
|
||||||
|
// Handle contextFileName property
|
||||||
|
if (settings.contextFileName && Array.isArray(settings.contextFileName)) {
|
||||||
|
const originalLength = settings.contextFileName.length;
|
||||||
|
settings.contextFileName = settings.contextFileName.filter(
|
||||||
|
(fileName) => !fileName.startsWith("agents/")
|
||||||
|
);
|
||||||
|
if (settings.contextFileName.length !== originalLength) {
|
||||||
|
updated = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (updated) {
|
||||||
|
await fileManager.writeFile(
|
||||||
|
settingsPath,
|
||||||
|
JSON.stringify(settings, null, 2)
|
||||||
|
);
|
||||||
|
console.log(chalk.green("✓ Updated .gemini/settings.json - removed agent file references"));
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.warn(
|
||||||
|
chalk.yellow("Could not update .gemini/settings.json"),
|
||||||
|
error
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove old agents directory
|
||||||
|
const agentsDir = path.join(geminiDir, "agents");
|
||||||
|
if (await fileManager.pathExists(agentsDir)) {
|
||||||
|
await fileManager.removeDirectory(agentsDir);
|
||||||
|
console.log(chalk.green("✓ Removed old .gemini/agents directory"));
|
||||||
|
}
|
||||||
|
|
||||||
// Get all available agents
|
// Get all available agents
|
||||||
const agents = await this.getAllAgentIds(installDir);
|
const agents = await this.getAllAgentIds(installDir);
|
||||||
const agentContextFiles = [];
|
let concatenatedContent = "";
|
||||||
|
|
||||||
for (const agentId of agents) {
|
for (const agentId of agents) {
|
||||||
// Find the source agent file
|
// Find the source agent file
|
||||||
@@ -525,43 +566,46 @@ class IdeSetup {
|
|||||||
|
|
||||||
if (agentPath) {
|
if (agentPath) {
|
||||||
const agentContent = await fileManager.readFile(agentPath);
|
const agentContent = await fileManager.readFile(agentPath);
|
||||||
const contextFilePath = path.join(agentsContextDir, `${agentId}.md`);
|
|
||||||
|
// Create properly formatted agent rule content (similar to trae)
|
||||||
// Copy the agent content directly into its own context file
|
let agentRuleContent = `# ${agentId.toUpperCase()} Agent Rule\n\n`;
|
||||||
await fileManager.writeFile(contextFilePath, agentContent);
|
agentRuleContent += `This rule is triggered when the user types \`*${agentId}\` and activates the ${await this.getAgentTitle(
|
||||||
|
agentId,
|
||||||
// Store the relative path for settings.json
|
installDir
|
||||||
const relativePath = path.relative(geminiDir, contextFilePath);
|
)} agent persona.\n\n`;
|
||||||
agentContextFiles.push(relativePath.replace(/\\/g, '/')); // Ensure forward slashes for consistency
|
agentRuleContent += "## Agent Activation\n\n";
|
||||||
console.log(chalk.green(`✓ Created context file for @${agentId}`));
|
agentRuleContent +=
|
||||||
|
"CRITICAL: Read the full YAML, start activation to alter your state of being, follow startup section instructions, stay in this being until told to exit this mode:\n\n";
|
||||||
|
agentRuleContent += "```yaml\n";
|
||||||
|
// Extract just the YAML content from the agent file
|
||||||
|
const yamlContent = extractYamlFromAgent(agentContent);
|
||||||
|
if (yamlContent) {
|
||||||
|
agentRuleContent += yamlContent;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// If no YAML found, include the whole content minus the header
|
||||||
|
agentRuleContent += agentContent.replace(/^#.*$/m, "").trim();
|
||||||
|
}
|
||||||
|
agentRuleContent += "\n```\n\n";
|
||||||
|
agentRuleContent += "## File Reference\n\n";
|
||||||
|
const relativePath = path.relative(installDir, agentPath).replace(/\\/g, '/');
|
||||||
|
agentRuleContent += `The complete agent definition is available in [${relativePath}](${relativePath}).\n\n`;
|
||||||
|
agentRuleContent += "## Usage\n\n";
|
||||||
|
agentRuleContent += `When the user types \`*${agentId}\`, activate this ${await this.getAgentTitle(
|
||||||
|
agentId,
|
||||||
|
installDir
|
||||||
|
)} persona and follow all instructions defined in the YAML configuration above.\n`;
|
||||||
|
|
||||||
|
// Add to concatenated content with separator
|
||||||
|
concatenatedContent += agentRuleContent + "\n\n---\n\n";
|
||||||
|
console.log(chalk.green(`✓ Added context for @${agentId}`));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log(chalk.green(`\n✓ Created individual agent context files in ${agentsContextDir}`));
|
// Write the concatenated content to GEMINI.md
|
||||||
|
const geminiMdPath = path.join(bmadMethodDir, "GEMINI.md");
|
||||||
// Add GEMINI.md to the context files array
|
await fileManager.writeFile(geminiMdPath, concatenatedContent);
|
||||||
agentContextFiles.push("GEMINI.md");
|
console.log(chalk.green(`\n✓ Created GEMINI.md in ${bmadMethodDir}`));
|
||||||
|
|
||||||
// Create or update settings.json
|
|
||||||
const settingsPath = path.join(geminiDir, "settings.json");
|
|
||||||
let settings = {};
|
|
||||||
|
|
||||||
if (await fileManager.pathExists(settingsPath)) {
|
|
||||||
try {
|
|
||||||
const existingSettings = await fileManager.readFile(settingsPath);
|
|
||||||
settings = JSON.parse(existingSettings);
|
|
||||||
console.log(chalk.yellow("Found existing .gemini/settings.json. Merging settings..."));
|
|
||||||
} catch (e) {
|
|
||||||
console.error(chalk.red("Error parsing existing settings.json. It will be overwritten."), e);
|
|
||||||
settings = {};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set contextFileName to our new array of files
|
|
||||||
settings.contextFileName = agentContextFiles;
|
|
||||||
|
|
||||||
await fileManager.writeFile(settingsPath, JSON.stringify(settings, null, 2));
|
|
||||||
console.log(chalk.green(`✓ Configured .gemini/settings.json to load all agent context files.`));
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "bmad-method",
|
"name": "bmad-method",
|
||||||
"version": "4.27.6",
|
"version": "4.28.0",
|
||||||
"description": "BMad Method installer - AI-powered Agile development framework",
|
"description": "BMad Method installer - AI-powered Agile development framework",
|
||||||
"main": "lib/installer.js",
|
"main": "lib/installer.js",
|
||||||
"bin": {
|
"bin": {
|
||||||
|
|||||||
@@ -558,7 +558,7 @@ class V3ToV4Upgrader {
|
|||||||
try {
|
try {
|
||||||
const ideMessages = {
|
const ideMessages = {
|
||||||
cursor: "Rules created in .cursor/rules/",
|
cursor: "Rules created in .cursor/rules/",
|
||||||
"claude-code": "Commands created in .claude/commands/",
|
"claude-code": "Commands created in .claude/commands/BMad/",
|
||||||
windsurf: "Rules created in .windsurf/rules/",
|
windsurf: "Rules created in .windsurf/rules/",
|
||||||
trae: "Rules created in.trae/rules/",
|
trae: "Rules created in.trae/rules/",
|
||||||
roo: "Custom modes created in .roomodes",
|
roo: "Custom modes created in .roomodes",
|
||||||
|
|||||||
Reference in New Issue
Block a user