feat(junie): add support for Junie

This commit is contained in:
Irina Chichikova 2026-03-24 17:06:13 +02:00
parent 090bfea9b2
commit d23a9fa366
5 changed files with 81 additions and 0 deletions

View File

@ -39,6 +39,7 @@ file_paths_to_ignore:
- ".agent/**" - ".agent/**"
- ".agentvibes/**" - ".agentvibes/**"
- ".kiro/**" - ".kiro/**"
- ".junie/**"
- ".roo/**" - ".roo/**"
- ".github/chatmodes/**" - ".github/chatmodes/**"
# --- Shared baseline: build temp --- # --- Shared baseline: build temp ---

View File

@ -12,6 +12,7 @@ ignores:
- .roo/** - .roo/**
- .codex/** - .codex/**
- .kiro/** - .kiro/**
- .junie/**
- sample-project/** - sample-project/**
- test-project-install/** - test-project-install/**
- z*/** - z*/**

View File

@ -2028,6 +2028,67 @@ async function runTests() {
console.log(''); console.log('');
// ============================================================
// Test Suite 34: Junie Native Skills Install
// ============================================================
console.log(`${colors.yellow}Test Suite 34: Junie Native Skills${colors.reset}\n`);
let tempProjectDir34;
let installedBmadDir34;
try {
clearCache();
const platformCodes34 = await loadPlatformCodes();
const junieInstaller = platformCodes34.platforms.junie?.installer;
assert(junieInstaller?.target_dir === '.junie/skills', 'Junie target_dir uses native skills path');
assert(junieInstaller?.skill_format === true, 'Junie installer enables native skill output');
assert(
Array.isArray(junieInstaller?.legacy_targets) && junieInstaller.legacy_targets.includes('.junie/commands'),
'Junie installer cleans legacy command output',
);
tempProjectDir34 = await fs.mkdtemp(path.join(os.tmpdir(), 'bmad-junie-test-'));
installedBmadDir34 = await createTestBmadFixture();
const legacyDir34 = path.join(tempProjectDir34, '.junie', 'commands', 'bmad-legacy-dir');
await fs.ensureDir(legacyDir34);
await fs.writeFile(path.join(tempProjectDir34, '.junie', 'commands', 'bmad-legacy.md'), 'legacy\n');
await fs.writeFile(path.join(legacyDir34, 'SKILL.md'), 'legacy\n');
const ideManager34 = new IdeManager();
await ideManager34.ensureInitialized();
const result34 = await ideManager34.setup('junie', tempProjectDir34, installedBmadDir34, {
silent: true,
selectedModules: ['bmm'],
});
assert(result34.success === true, 'Junie setup succeeds against temp project');
const skillFile34 = path.join(tempProjectDir34, '.junie', 'skills', 'bmad-master', 'SKILL.md');
assert(await fs.pathExists(skillFile34), 'Junie install writes SKILL.md directory output');
const skillContent34 = await fs.readFile(skillFile34, 'utf8');
const nameMatch34 = skillContent34.match(/^name:\s*(.+)$/m);
assert(nameMatch34 && nameMatch34[1].trim() === 'bmad-master', 'Junie skill name frontmatter matches directory name exactly');
assert(!(await fs.pathExists(path.join(tempProjectDir34, '.junie', 'commands'))), 'Junie setup removes legacy commands dir');
const result34b = await ideManager34.setup('junie', tempProjectDir34, installedBmadDir34, {
silent: true,
selectedModules: ['bmm'],
});
assert(result34b.success === true, 'Junie reinstall/upgrade succeeds over existing skills');
assert(await fs.pathExists(skillFile34), 'Junie reinstall preserves SKILL.md output');
} catch (error) {
assert(false, 'Junie native skills test succeeds', error.message);
} finally {
if (tempProjectDir34) await fs.remove(tempProjectDir34).catch(() => {});
if (installedBmadDir34) await fs.remove(path.dirname(installedBmadDir34)).catch(() => {});
}
console.log('');
// ============================================================ // ============================================================
// Summary // Summary
// ============================================================ // ============================================================

View File

@ -151,6 +151,18 @@ platforms:
template_type: default template_type: default
skill_format: true skill_format: true
junie:
name: "Junie"
preferred: false
category: cli
description: "AI coding agent by JetBrains"
installer:
legacy_targets:
- .junie/commands
target_dir: .junie/skills
template_type: default
skill_format: true
kilo: kilo:
name: "KiloCoder" name: "KiloCoder"
preferred: false preferred: false

View File

@ -18,6 +18,12 @@ platforms:
category: cli category: cli
description: "Anthropic's official CLI for Claude" description: "Anthropic's official CLI for Claude"
junie:
name: "Junie"
preferred: false
category: cli
description: "AI coding agent by JetBrains"
cursor: cursor:
name: "Cursor" name: "Cursor"
preferred: true preferred: true