Compare commits

...

5 Commits

Author SHA1 Message Date
Brian Madison
3b6a507ab8 require issue tempalte 2025-10-09 18:51:59 -05:00
Brian Madison
415026b0eb v4 readme updated with v6 info 2025-10-04 08:36:13 -05:00
Yoav Gal
91c8e12777 qwen cli - custom commands (#551)
* qwen cli - custom commands

* moved prompt to the inside of the command

---------

Co-authored-by: Davor Racic <davor.racic@gmail.com>
Co-authored-by: Brian <bmadcode@gmail.com>
2025-10-01 16:33:17 -05:00
Brian Madison
458704f82b workflow manual release update 2025-09-29 17:24:46 -05:00
Brian Madison
37e5fd50dd version up 2025-09-29 17:09:18 -05:00
6 changed files with 117 additions and 89 deletions

5
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Discord Community Support
url: https://discord.gg/gk8jAdXWmj
about: Please join our Discord server for general questions and community discussion before opening an issue.

View File

@@ -26,7 +26,7 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GH_PAT }}
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v4

View File

@@ -1,5 +1,36 @@
# BMAD-METHOD™: Universal AI Agent Framework # BMAD-METHOD™: Universal AI Agent Framework
> ## 🚨 **IMPORTANT VERSION ANNOUNCEMENT** 🚨
>
> ### Current Stable: v4.x | Next Major: v6 Alpha
>
> - **v4.x** - The current stable release version available via npm
> - **v5** - Skipped (replaced by v6)
> - **[v6-alpha](https://github.com/bmad-code-org/BMAD-METHOD/tree/v6-alpha)** - **NOW AVAILABLE FOR EARLY TESTING!**
>
> ### 🧪 Try v6 Alpha (Early Adopters Only)
>
> The next major version of BMAD-METHOD is now available for early experimentation and testing. This is a complete rewrite with significant architectural changes.
>
> **⚠️ WARNING: v6-alpha is for early adopters who are comfortable with:**
>
> - Potential breaking changes
> - Daily updates and instability
> - Incomplete features
> - Experimental functionality
>
> **📅 Timeline:** Official beta version will be merged mid-October 2025
>
> **To try v6-alpha:**
>
> ```bash
> git clone https://github.com/bmad-code-org/BMAD-METHOD.git
> cd BMAD-METHOD
> git checkout v6-alpha
> ```
>
> ---
[![Version](https://img.shields.io/npm/v/bmad-method?color=blue&label=version)](https://www.npmjs.com/package/bmad-method) [![Version](https://img.shields.io/npm/v/bmad-method?color=blue&label=version)](https://www.npmjs.com/package/bmad-method)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![Node.js Version](https://img.shields.io/badge/node-%3E%3D20.0.0-brightgreen)](https://nodejs.org) [![Node.js Version](https://img.shields.io/badge/node-%3E%3D20.0.0-brightgreen)](https://nodejs.org)

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": "4.43.0", "version": "4.44.0",
"description": "Breakthrough Method of Agile AI-driven Development", "description": "Breakthrough Method of Agile AI-driven Development",
"keywords": [ "keywords": [
"agile", "agile",

View File

@@ -121,15 +121,15 @@ ide-configurations:
qwen-code: qwen-code:
name: Qwen Code name: Qwen Code
rule-dir: .qwen/bmad-method/ rule-dir: .qwen/commands/BMad/
format: single-file format: multi-file
command-suffix: .md command-suffix: .toml
instructions: | instructions: |
# To use BMad agents with Qwen Code: # To use BMad agents with Qwen Code:
# 1. The installer creates a .qwen/bmad-method/ directory in your project. # 1. The installer creates a `BMad` folder in `.qwen/commands`.
# 2. It concatenates all agent files into a single QWEN.md file. # 2. This adds custom commands for each agent and task.
# 3. Simply mention the agent in your prompt (e.g., "As *dev, ..."). # 3. Type /BMad:agents:<agent-name> (e.g., "/BMad:agents:dev", "/BMad:agents:pm") or /BMad:tasks:<task-name> (e.g., "/BMad:tasks:create-doc").
# 4. The Qwen Code CLI will automatically have the context for that agent. # 4. The agent will adopt that persona for the conversation or perform the task.
auggie-cli: auggie-cli:
name: Auggie CLI (Augment Code) name: Auggie CLI (Augment Code)

View File

@@ -2056,94 +2056,86 @@ CRITICAL: You are to execute the BMad Task defined below.
} }
async setupQwenCode(installDir, selectedAgent) { async setupQwenCode(installDir, selectedAgent) {
const qwenDir = path.join(installDir, '.qwen'); const ideConfig = await configLoader.getIdeConfiguration('qwen-code');
const bmadMethodDir = path.join(qwenDir, 'bmad-method'); const bmadCommandsDir = path.join(installDir, ideConfig['rule-dir']);
await fileManager.ensureDirectory(bmadMethodDir);
// Update logic for existing settings.json const agentCommandsDir = path.join(bmadCommandsDir, 'agents');
const settingsPath = path.join(qwenDir, 'settings.json'); const taskCommandsDir = path.join(bmadCommandsDir, 'tasks');
if (await fileManager.pathExists(settingsPath)) { await fileManager.ensureDirectory(agentCommandsDir);
try { await fileManager.ensureDirectory(taskCommandsDir);
const settingsContent = await fileManager.readFile(settingsPath);
const settings = JSON.parse(settingsContent);
let updated = false;
// Handle contextFileName property // Process Agents
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 .qwen/settings.json - removed agent file references'));
}
} catch (error) {
console.warn(chalk.yellow('Could not update .qwen/settings.json'), error);
}
}
// Remove old agents directory
const agentsDir = path.join(qwenDir, 'agents');
if (await fileManager.pathExists(agentsDir)) {
await fileManager.removeDirectory(agentsDir);
console.log(chalk.green('✓ Removed old .qwen/agents directory'));
}
// Get all available agents
const agents = selectedAgent ? [selectedAgent] : await this.getAllAgentIds(installDir); const agents = selectedAgent ? [selectedAgent] : await this.getAllAgentIds(installDir);
let concatenatedContent = '';
for (const agentId of agents) { for (const agentId of agents) {
// Find the source agent file
const agentPath = await this.findAgentPath(agentId, installDir); const agentPath = await this.findAgentPath(agentId, installDir);
if (!agentPath) {
console.log(chalk.yellow(`✗ Agent file not found for ${agentId}, skipping.`));
continue;
}
if (agentPath) { const agentTitle = await this.getAgentTitle(agentId, installDir);
const commandPath = path.join(agentCommandsDir, `${agentId}.toml`);
// Get relative path from installDir to agent file for @{file} reference
const relativeAgentPath = path.relative(installDir, agentPath).replaceAll('\\', '/');
// Read the agent content
const agentContent = await fileManager.readFile(agentPath); const agentContent = await fileManager.readFile(agentPath);
// Create properly formatted agent rule content (similar to gemini) const tomlContent = `description = " Activates the ${agentTitle} agent from the BMad Method."
let agentRuleContent = `# ${agentId.toUpperCase()} Agent Rule\n\n`; prompt = """
agentRuleContent += `This rule is triggered when the user types \`*${agentId}\` and activates the ${await this.getAgentTitle( CRITICAL: You are now the BMad '${agentTitle}' agent. Adopt its persona, follow its instructions, and use its capabilities.
agentId,
installDir,
)} agent persona.\n\n`;
agentRuleContent += '## Agent Activation\n\n';
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).replaceAll('\\', '/');
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 READ THIS BEFORE ANSWERING AS THE PERSONA!
concatenatedContent += agentRuleContent + '\n\n---\n\n';
console.log(chalk.green(`✓ Added context for *${agentId}`)); ${agentContent}
} """`;
await fileManager.writeFile(commandPath, tomlContent);
console.log(chalk.green(`✓ Created agent command: /bmad:agents:${agentId}`));
} }
// Write the concatenated content to QWEN.md // Process Tasks
const qwenMdPath = path.join(bmadMethodDir, 'QWEN.md'); const tasks = await this.getAllTaskIds(installDir);
await fileManager.writeFile(qwenMdPath, concatenatedContent); for (const taskId of tasks) {
console.log(chalk.green(`\n✓ Created QWEN.md in ${bmadMethodDir}`)); const taskPath = await this.findTaskPath(taskId, installDir);
if (!taskPath) {
console.log(chalk.yellow(`✗ Task file not found for ${taskId}, skipping.`));
continue;
}
const taskTitle = taskId
.split('-')
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
.join(' ');
const commandPath = path.join(taskCommandsDir, `${taskId}.toml`);
// Get relative path from installDir to task file for @{file} reference
const relativeTaskPath = path.relative(installDir, taskPath).replaceAll('\\', '/');
// Read the task content
const taskContent = await fileManager.readFile(taskPath);
const tomlContent = `description = " Executes the BMad Task: ${taskTitle}"
prompt = """
CRITICAL: You are to execute the BMad Task defined below.
READ THIS BEFORE EXECUTING THE TASK AS THE INSTRUCTIONS SPECIFIED!
${taskContent}
"""`;
await fileManager.writeFile(commandPath, tomlContent);
console.log(chalk.green(`✓ Created task command: /bmad:tasks:${taskId}`));
}
console.log(
chalk.green(`
✓ Created Qwen Code extension in ${bmadCommandsDir}`),
);
console.log(
chalk.dim('You can now use commands like /bmad:agents:dev or /bmad:tasks:create-doc.'),
);
return true; return true;
} }