bmad-method 4.34.0 → 4.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
# [4.
|
|
1
|
+
# [4.35.0](https://github.com/bmadcode/BMAD-METHOD/compare/v4.34.0...v4.35.0) (2025-08-04)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* add qwen-code ide support to bmad installer. ([#392](https://github.com/bmadcode/BMAD-METHOD/issues/392)) ([a72b790](https://github.com/bmadcode/BMAD-METHOD/commit/a72b790f3be6c77355511ace2d63e6bec4d751f1))
|
|
2
7
|
|
|
8
|
+
# [4.34.0](https://github.com/bmadcode/BMAD-METHOD/compare/v4.33.1...v4.34.0) (2025-08-03)
|
|
3
9
|
|
|
4
10
|
### Features
|
|
5
11
|
|
|
6
|
-
|
|
12
|
+
- add KiloCode integration support to BMAD installer ([#390](https://github.com/bmadcode/BMAD-METHOD/issues/390)) ([dcebe91](https://github.com/bmadcode/BMAD-METHOD/commit/dcebe91d5ea68e69aa27183411a81639d444efd7))
|
|
7
13
|
|
|
8
14
|
## [4.33.1](https://github.com/bmadcode/BMAD-METHOD/compare/v4.33.0...v4.33.1) (2025-07-29)
|
|
9
15
|
|
package/package.json
CHANGED
|
@@ -41,7 +41,7 @@ program
|
|
|
41
41
|
.option('-f, --full', 'Install complete BMad Method')
|
|
42
42
|
.option('-x, --expansion-only', 'Install only expansion packs (no bmad-core)')
|
|
43
43
|
.option('-d, --directory <path>', 'Installation directory')
|
|
44
|
-
.option('-i, --ide <ide...>', 'Configure for specific IDE(s) - can specify multiple (cursor, claude-code, windsurf, trae, roo, kilo, cline, gemini, github-copilot, other)')
|
|
44
|
+
.option('-i, --ide <ide...>', 'Configure for specific IDE(s) - can specify multiple (cursor, claude-code, windsurf, trae, roo, kilo, cline, gemini, qwen-code, github-copilot, other)')
|
|
45
45
|
.option('-e, --expansion-packs <packs...>', 'Install specific expansion packs (can specify multiple)')
|
|
46
46
|
.action(async (options) => {
|
|
47
47
|
try {
|
|
@@ -314,6 +314,7 @@ async function promptInstallation() {
|
|
|
314
314
|
{ name: 'Kilo Code', value: 'kilo' },
|
|
315
315
|
{ name: 'Cline', value: 'cline' },
|
|
316
316
|
{ name: 'Gemini CLI', value: 'gemini' },
|
|
317
|
+
{ name: 'Qwen Code', value: 'qwen-code' },
|
|
317
318
|
{ name: 'Github Copilot', value: 'github-copilot' }
|
|
318
319
|
]
|
|
319
320
|
}
|
|
@@ -98,4 +98,16 @@ ide-configurations:
|
|
|
98
98
|
# To use BMAD agents in Kilo Code:
|
|
99
99
|
# 1. Open the mode selector in VSCode
|
|
100
100
|
# 2. Select a bmad-{agent} mode (e.g. "bmad-dev")
|
|
101
|
-
# 3. The AI adopts that agent's persona and capabilities
|
|
101
|
+
# 3. The AI adopts that agent's persona and capabilities
|
|
102
|
+
|
|
103
|
+
qwen-code:
|
|
104
|
+
name: Qwen Code
|
|
105
|
+
rule-dir: .qwen/bmad-method/
|
|
106
|
+
format: single-file
|
|
107
|
+
command-suffix: .md
|
|
108
|
+
instructions: |
|
|
109
|
+
# To use BMad agents with Qwen Code:
|
|
110
|
+
# 1. The installer creates a .qwen/bmad-method/ directory in your project.
|
|
111
|
+
# 2. It concatenates all agent files into a single QWEN.md file.
|
|
112
|
+
# 3. Simply mention the agent in your prompt (e.g., "As *dev, ...").
|
|
113
|
+
# 4. The Qwen Code CLI will automatically have the context for that agent.
|
|
@@ -59,6 +59,8 @@ class IdeSetup extends BaseIdeSetup {
|
|
|
59
59
|
return this.setupGeminiCli(installDir, selectedAgent);
|
|
60
60
|
case "github-copilot":
|
|
61
61
|
return this.setupGitHubCopilot(installDir, selectedAgent, spinner, preConfiguredSettings);
|
|
62
|
+
case "qwen-code":
|
|
63
|
+
return this.setupQwenCode(installDir, selectedAgent);
|
|
62
64
|
default:
|
|
63
65
|
console.log(chalk.yellow(`\nIDE ${ide} not yet supported`));
|
|
64
66
|
return false;
|
|
@@ -977,6 +979,106 @@ class IdeSetup extends BaseIdeSetup {
|
|
|
977
979
|
return true;
|
|
978
980
|
}
|
|
979
981
|
|
|
982
|
+
async setupQwenCode(installDir, selectedAgent) {
|
|
983
|
+
const qwenDir = path.join(installDir, ".qwen");
|
|
984
|
+
const bmadMethodDir = path.join(qwenDir, "bmad-method");
|
|
985
|
+
await fileManager.ensureDirectory(bmadMethodDir);
|
|
986
|
+
|
|
987
|
+
// Update logic for existing settings.json
|
|
988
|
+
const settingsPath = path.join(qwenDir, "settings.json");
|
|
989
|
+
if (await fileManager.pathExists(settingsPath)) {
|
|
990
|
+
try {
|
|
991
|
+
const settingsContent = await fileManager.readFile(settingsPath);
|
|
992
|
+
const settings = JSON.parse(settingsContent);
|
|
993
|
+
let updated = false;
|
|
994
|
+
|
|
995
|
+
// Handle contextFileName property
|
|
996
|
+
if (settings.contextFileName && Array.isArray(settings.contextFileName)) {
|
|
997
|
+
const originalLength = settings.contextFileName.length;
|
|
998
|
+
settings.contextFileName = settings.contextFileName.filter(
|
|
999
|
+
(fileName) => !fileName.startsWith("agents/")
|
|
1000
|
+
);
|
|
1001
|
+
if (settings.contextFileName.length !== originalLength) {
|
|
1002
|
+
updated = true;
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
|
|
1006
|
+
if (updated) {
|
|
1007
|
+
await fileManager.writeFile(
|
|
1008
|
+
settingsPath,
|
|
1009
|
+
JSON.stringify(settings, null, 2)
|
|
1010
|
+
);
|
|
1011
|
+
console.log(chalk.green("✓ Updated .qwen/settings.json - removed agent file references"));
|
|
1012
|
+
}
|
|
1013
|
+
} catch (error) {
|
|
1014
|
+
console.warn(
|
|
1015
|
+
chalk.yellow("Could not update .qwen/settings.json"),
|
|
1016
|
+
error
|
|
1017
|
+
);
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
// Remove old agents directory
|
|
1022
|
+
const agentsDir = path.join(qwenDir, "agents");
|
|
1023
|
+
if (await fileManager.pathExists(agentsDir)) {
|
|
1024
|
+
await fileManager.removeDirectory(agentsDir);
|
|
1025
|
+
console.log(chalk.green("✓ Removed old .qwen/agents directory"));
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
// Get all available agents
|
|
1029
|
+
const agents = selectedAgent ? [selectedAgent] : await this.getAllAgentIds(installDir);
|
|
1030
|
+
let concatenatedContent = "";
|
|
1031
|
+
|
|
1032
|
+
for (const agentId of agents) {
|
|
1033
|
+
// Find the source agent file
|
|
1034
|
+
const agentPath = await this.findAgentPath(agentId, installDir);
|
|
1035
|
+
|
|
1036
|
+
if (agentPath) {
|
|
1037
|
+
const agentContent = await fileManager.readFile(agentPath);
|
|
1038
|
+
|
|
1039
|
+
// Create properly formatted agent rule content (similar to gemini)
|
|
1040
|
+
let agentRuleContent = `# ${agentId.toUpperCase()} Agent Rule\n\n`;
|
|
1041
|
+
agentRuleContent += `This rule is triggered when the user types \`*${agentId}\` and activates the ${await this.getAgentTitle(
|
|
1042
|
+
agentId,
|
|
1043
|
+
installDir
|
|
1044
|
+
)} agent persona.\n\n`;
|
|
1045
|
+
agentRuleContent += "## Agent Activation\n\n";
|
|
1046
|
+
agentRuleContent +=
|
|
1047
|
+
"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";
|
|
1048
|
+
agentRuleContent += "```yaml\n";
|
|
1049
|
+
// Extract just the YAML content from the agent file
|
|
1050
|
+
const yamlContent = extractYamlFromAgent(agentContent);
|
|
1051
|
+
if (yamlContent) {
|
|
1052
|
+
agentRuleContent += yamlContent;
|
|
1053
|
+
}
|
|
1054
|
+
else {
|
|
1055
|
+
// If no YAML found, include the whole content minus the header
|
|
1056
|
+
agentRuleContent += agentContent.replace(/^#.*$/m, "").trim();
|
|
1057
|
+
}
|
|
1058
|
+
agentRuleContent += "\n```\n\n";
|
|
1059
|
+
agentRuleContent += "## File Reference\n\n";
|
|
1060
|
+
const relativePath = path.relative(installDir, agentPath).replace(/\\/g, '/');
|
|
1061
|
+
agentRuleContent += `The complete agent definition is available in [${relativePath}](${relativePath}).\n\n`;
|
|
1062
|
+
agentRuleContent += "## Usage\n\n";
|
|
1063
|
+
agentRuleContent += `When the user types \`*${agentId}\`, activate this ${await this.getAgentTitle(
|
|
1064
|
+
agentId,
|
|
1065
|
+
installDir
|
|
1066
|
+
)} persona and follow all instructions defined in the YAML configuration above.\n`;
|
|
1067
|
+
|
|
1068
|
+
// Add to concatenated content with separator
|
|
1069
|
+
concatenatedContent += agentRuleContent + "\n\n---\n\n";
|
|
1070
|
+
console.log(chalk.green(`✓ Added context for *${agentId}`));
|
|
1071
|
+
}
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
// Write the concatenated content to QWEN.md
|
|
1075
|
+
const qwenMdPath = path.join(bmadMethodDir, "QWEN.md");
|
|
1076
|
+
await fileManager.writeFile(qwenMdPath, concatenatedContent);
|
|
1077
|
+
console.log(chalk.green(`\n✓ Created QWEN.md in ${bmadMethodDir}`));
|
|
1078
|
+
|
|
1079
|
+
return true;
|
|
1080
|
+
}
|
|
1081
|
+
|
|
980
1082
|
async setupGitHubCopilot(installDir, selectedAgent, spinner = null, preConfiguredSettings = null) {
|
|
981
1083
|
// Configure VS Code workspace settings first to avoid UI conflicts with loading spinners
|
|
982
1084
|
await this.configureVsCodeSettings(installDir, spinner, preConfiguredSettings);
|