diff --git a/test/test-installation-components.js b/test/test-installation-components.js
index 0b977884f..05029e1e0 100644
--- a/test/test-installation-components.js
+++ b/test/test-installation-components.js
@@ -49,34 +49,37 @@ function assert(condition, testName, errorMessage = '') {
}
async function createTestBmadFixture() {
- const fixtureDir = await fs.mkdtemp(path.join(os.tmpdir(), 'bmad-fixture-'));
+ const fixtureRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'bmad-fixture-'));
+ const fixtureDir = path.join(fixtureRoot, '_bmad');
+ await fs.ensureDir(fixtureDir);
- // Minimal workflow manifest (generators check for this)
+ // Skill manifest CSV — the sole source of truth for IDE skill installation
await fs.ensureDir(path.join(fixtureDir, '_config'));
- await fs.writeFile(path.join(fixtureDir, '_config', 'workflow-manifest.csv'), '');
+ await fs.writeFile(
+ path.join(fixtureDir, '_config', 'skill-manifest.csv'),
+ [
+ 'canonicalId,name,description,module,path,install_to_bmad',
+ '"bmad-master","bmad-master","Minimal test agent fixture","core","_bmad/core/bmad-master/SKILL.md","true"',
+ '',
+ ].join('\n'),
+ );
- // Minimal compiled agent for core/agents (contains ',
- 'Test persona',
- '',
- ].join('\n');
-
- await fs.ensureDir(path.join(fixtureDir, 'core', 'agents'));
- await fs.writeFile(path.join(fixtureDir, 'core', 'agents', 'bmad-master.md'), minimalAgent);
- // Skill manifest so the installer uses 'bmad-master' as the canonical skill name
- await fs.writeFile(path.join(fixtureDir, 'core', 'agents', 'bmad-skill-manifest.yaml'), 'bmad-master.md:\n canonicalId: bmad-master\n');
-
- // Minimal compiled agent for bmm module (tests use selectedModules: ['bmm'])
- await fs.ensureDir(path.join(fixtureDir, 'bmm', 'agents'));
- await fs.writeFile(path.join(fixtureDir, 'bmm', 'agents', 'test-bmm-agent.md'), minimalAgent);
+ // Minimal SKILL.md for the skill entry
+ const skillDir = path.join(fixtureDir, 'core', 'bmad-master');
+ await fs.ensureDir(skillDir);
+ await fs.writeFile(
+ path.join(skillDir, 'SKILL.md'),
+ [
+ '---',
+ 'name: bmad-master',
+ 'description: Minimal test agent fixture',
+ '---',
+ '',
+ '',
+ 'You are a test agent.',
+ ].join('\n'),
+ );
+ await fs.writeFile(path.join(skillDir, 'bmad-skill-manifest.yaml'), 'SKILL.md:\n type: skill\n');
return fixtureDir;
}
@@ -1837,18 +1840,12 @@ async function runTests() {
});
assert(result.success === true, 'Antigravity setup succeeds with overlapping skill names');
- assert(result.detail === '2 agents', 'Installer detail reports agents separately from skills');
- assert(result.handlerResult.results.skillDirectories === 2, 'Result exposes unique skill directory count');
- assert(result.handlerResult.results.agents === 2, 'Result retains generated agent write count');
- assert(result.handlerResult.results.workflows === 1, 'Result retains generated workflow count');
+ assert(result.detail === '1 skills', 'Installer detail reports skill count');
+ assert(result.handlerResult.results.skillDirectories === 1, 'Result exposes unique skill directory count');
assert(result.handlerResult.results.skills === 1, 'Result retains verbatim skill count');
- assert(
- await fs.pathExists(path.join(collisionProjectDir, '.agent', 'skills', 'bmad-agent-bmad-master', 'SKILL.md')),
- 'Agent skill directory is created',
- );
assert(
await fs.pathExists(path.join(collisionProjectDir, '.agent', 'skills', 'bmad-help', 'SKILL.md')),
- 'Overlapping skill directory is created once',
+ 'Skill directory is created from skill-manifest',
);
} catch (error) {
assert(false, 'Skill-format unique count test succeeds', error.message);
diff --git a/tools/cli/installers/lib/ide/_config-driven.js b/tools/cli/installers/lib/ide/_config-driven.js
index e94cb9edb..99a92e528 100644
--- a/tools/cli/installers/lib/ide/_config-driven.js
+++ b/tools/cli/installers/lib/ide/_config-driven.js
@@ -4,9 +4,6 @@ const fs = require('fs-extra');
const yaml = require('yaml');
const { BaseIdeSetup } = require('./_base-ide');
const prompts = require('../../../lib/prompts');
-const { AgentCommandGenerator } = require('./shared/agent-command-generator');
-const { WorkflowCommandGenerator } = require('./shared/workflow-command-generator');
-const { TaskToolCommandGenerator } = require('./shared/task-tool-command-generator');
const csv = require('csv-parse/sync');
/**
@@ -115,53 +112,20 @@ class ConfigDrivenIdeSetup extends BaseIdeSetup {
* @returns {Promise