feat(installer): restore KiloCoder support and installer (#2151)

Kilo Code now supports Agent Skills. Remove the suspended flag,
restore it in the IDE picker, and replace the suspended test suite
with a full native-skills installation test.

- Remove suspended message from platform-codes.yaml
- Rewrite test suite 22: config, IDE picker, install, skill output,
  legacy cleanup, and reinstall assertions
- Update migration checklist to reflect active status

Co-authored-by: Junie <junie@jetbrains.com>
Co-authored-by: Brian <bmadcode@gmail.com>
This commit is contained in:
Alex Verkhovsky 2026-03-28 19:24:29 -06:00 committed by GitHub
parent aae6ddb8c9
commit 04513e5953
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 36 additions and 29 deletions

View File

@ -926,27 +926,34 @@ async function runTests() {
console.log(''); console.log('');
// ============================================================ // ============================================================
// Suite 22: KiloCoder Suspended // Suite 22: KiloCoder Native Skills
// ============================================================ // ============================================================
console.log(`${colors.yellow}Test Suite 22: KiloCoder Suspended${colors.reset}\n`); console.log(`${colors.yellow}Test Suite 22: KiloCoder Native Skills${colors.reset}\n`);
try { try {
clearCache(); clearCache();
const platformCodes22 = await loadPlatformCodes(); const platformCodes22 = await loadPlatformCodes();
const kiloConfig22 = platformCodes22.platforms.kilo; const kiloConfig22 = platformCodes22.platforms.kilo;
assert(typeof kiloConfig22?.suspended === 'string', 'KiloCoder has a suspended message in platform config'); assert(!kiloConfig22?.suspended, 'KiloCoder is not suspended');
assert(kiloConfig22?.installer?.target_dir === '.kilocode/skills', 'KiloCoder retains target_dir config for future use'); assert(kiloConfig22?.installer?.target_dir === '.kilocode/skills', 'KiloCoder target_dir uses native skills path');
assert(
Array.isArray(kiloConfig22?.installer?.legacy_targets) && kiloConfig22.installer.legacy_targets.includes('.kilocode/workflows'),
'KiloCoder installer cleans legacy workflows output',
);
const ideManager22 = new IdeManager(); const ideManager22 = new IdeManager();
await ideManager22.ensureInitialized(); await ideManager22.ensureInitialized();
// Should not appear in available IDEs // Should appear in available IDEs
const availableIdes22 = ideManager22.getAvailableIdes(); const availableIdes22 = ideManager22.getAvailableIdes();
assert(!availableIdes22.some((ide) => ide.value === 'kilo'), 'KiloCoder is hidden from IDE selection'); assert(
availableIdes22.some((ide) => ide.value === 'kilo'),
'KiloCoder appears in IDE selection',
);
// Setup should be blocked but legacy files should be cleaned up
const tempProjectDir22 = await fs.mkdtemp(path.join(os.tmpdir(), 'bmad-kilo-test-')); const tempProjectDir22 = await fs.mkdtemp(path.join(os.tmpdir(), 'bmad-kilo-test-'));
const installedBmadDir22 = await createTestBmadFixture(); const installedBmadDir22 = await createTestBmadFixture();
@ -960,25 +967,29 @@ async function runTests() {
selectedModules: ['bmm'], selectedModules: ['bmm'],
}); });
assert(result22.success === false, 'KiloCoder setup is blocked when suspended'); assert(result22.success === true, 'KiloCoder setup succeeds against temp project');
assert(result22.error === 'suspended', 'KiloCoder setup returns suspended error');
// Should not write new skill files const skillFile22 = path.join(tempProjectDir22, '.kilocode', 'skills', 'bmad-master', 'SKILL.md');
assert( assert(await fs.pathExists(skillFile22), 'KiloCoder install writes SKILL.md directory output');
!(await fs.pathExists(path.join(tempProjectDir22, '.kilocode', 'skills'))),
'KiloCoder does not create skills directory when suspended',
);
// Legacy files should be cleaned up const skillContent22 = await fs.readFile(skillFile22, 'utf8');
assert( const nameMatch22 = skillContent22.match(/^name:\s*(.+)$/m);
!(await fs.pathExists(path.join(tempProjectDir22, '.kilocode', 'workflows'))), assert(nameMatch22 && nameMatch22[1].trim() === 'bmad-master', 'KiloCoder skill name frontmatter matches directory name exactly');
'KiloCoder legacy workflows are cleaned up even when suspended',
); assert(!(await fs.pathExists(path.join(tempProjectDir22, '.kilocode', 'workflows'))), 'KiloCoder setup removes legacy workflows dir');
const result22b = await ideManager22.setup('kilo', tempProjectDir22, installedBmadDir22, {
silent: true,
selectedModules: ['bmm'],
});
assert(result22b.success === true, 'KiloCoder reinstall/upgrade succeeds over existing skills');
assert(await fs.pathExists(skillFile22), 'KiloCoder reinstall preserves SKILL.md output');
await fs.remove(tempProjectDir22); await fs.remove(tempProjectDir22);
await fs.remove(path.dirname(installedBmadDir22)); await fs.remove(path.dirname(installedBmadDir22));
} catch (error) { } catch (error) {
assert(false, 'KiloCoder suspended test succeeds', error.message); assert(false, 'KiloCoder native skills test succeeds', error.message);
} }
console.log(''); console.log('');

View File

@ -205,17 +205,14 @@ Support assumption: full Agent Skills support. BMAD currently uses a custom inst
- [x] Implement/extend automated tests — 11 assertions in test suite 17 including marker cleanup - [x] Implement/extend automated tests — 11 assertions in test suite 17 including marker cleanup
- [x] Commit - [x] Commit
## KiloCoder — SUSPENDED ## KiloCoder
**Status: Kilo Code does not support the Agent Skills standard.** The original migration assumed skills support because Kilo forked from Roo Code, but manual IDE verification confirmed Kilo has not merged that feature. BMAD support is paused until Kilo implements skills.
**Install:** VS Code extension `kilocode.kilo-code` — search "Kilo Code" in Extensions or `code --install-extension kilocode.kilo-code` **Install:** VS Code extension `kilocode.kilo-code` — search "Kilo Code" in Extensions or `code --install-extension kilocode.kilo-code`
- [x] ~~Confirm KiloCoder native skills path~~**FALSE**: assumed from Roo Code fork, not verified. Manual testing showed no skills support in the IDE - [x] Confirm KiloCoder native skills path — `.kilocode/skills`
- [x] Config and installer code retained in platform-codes.yaml with `suspended` flag — hidden from IDE picker, setup blocked with explanation - [x] Legacy cleanup for `.kilocode/workflows` and `.kilocodemodes`
- [x] Installer fails early (before writing `_bmad/`) if Kilo is the only selected IDE, protecting existing installations - [x] Automated tests — suite 22 (config, IDE picker, install, skill output, legacy cleanup, reinstall)
- [x] Legacy cleanup still runs for `.kilocode/workflows` and `.kilocodemodes` when users switch to a different IDE - [x] Commit
- [x] Automated tests — 7 assertions in suite 22 (suspended config, hidden from picker, setup blocked, no files written, legacy cleanup)
## Gemini CLI ## Gemini CLI

View File

@ -109,7 +109,6 @@ platforms:
kilo: kilo:
name: "KiloCoder" name: "KiloCoder"
preferred: false preferred: false
suspended: "Kilo Code does not yet support the Agent Skills standard. Support is paused until they implement it. See https://github.com/kilocode/kilo-code/issues for updates."
installer: installer:
legacy_targets: legacy_targets:
- .kilocode/workflows - .kilocode/workflows