From c91db0db4b9fa0097f4f490488ae046a692ab4f5 Mon Sep 17 00:00:00 2001 From: Brian Date: Fri, 27 Mar 2026 09:46:18 -0500 Subject: [PATCH 1/3] fix: revert bmb module-definition path to src/module.yaml (#2146) bmad-builder reverted its skills/ directory back to src/ for installer compatibility (bmad-code-org/bmad-builder#40). Update the external modules manifest to match. --- tools/installer/external-official-modules.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/installer/external-official-modules.yaml b/tools/installer/external-official-modules.yaml index b62f3dc21..6a2fa259d 100644 --- a/tools/installer/external-official-modules.yaml +++ b/tools/installer/external-official-modules.yaml @@ -4,7 +4,7 @@ modules: bmad-builder: url: https://github.com/bmad-code-org/bmad-builder - module-definition: skills/module.yaml + module-definition: src/module.yaml code: bmb name: "BMad Builder" description: "Agent and Builder" From e0ea6a05008ecafdfb720bc74031344560f2408a Mon Sep 17 00:00:00 2001 From: Brian Date: Sat, 28 Mar 2026 00:33:10 -0500 Subject: [PATCH 2/3] fix: support skills/ folder as module source location (#2149) The installer now finds module.yaml in both skills/ and src/ directories, including one level deep in subfolders. Updates bmb module-definition to skills/module.yaml to match its actual structure. --- .../installer/external-official-modules.yaml | 2 +- tools/installer/modules/external-manager.js | 37 +++++++++++++++++-- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/tools/installer/external-official-modules.yaml b/tools/installer/external-official-modules.yaml index 6a2fa259d..b62f3dc21 100644 --- a/tools/installer/external-official-modules.yaml +++ b/tools/installer/external-official-modules.yaml @@ -4,7 +4,7 @@ modules: bmad-builder: url: https://github.com/bmad-code-org/bmad-builder - module-definition: src/module.yaml + module-definition: skills/module.yaml code: bmb name: "BMad Builder" description: "Agent and Builder" diff --git a/tools/installer/modules/external-manager.js b/tools/installer/modules/external-manager.js index 467520163..fceb94e22 100644 --- a/tools/installer/modules/external-manager.js +++ b/tools/installer/modules/external-manager.js @@ -313,10 +313,41 @@ class ExternalModuleManager { // The module-definition specifies the path to module.yaml relative to repo root // We need to return the directory containing module.yaml - const moduleDefinitionPath = moduleInfo.moduleDefinition; // e.g., 'src/module.yaml' - const moduleDir = path.dirname(path.join(cloneDir, moduleDefinitionPath)); + const moduleDefinitionPath = moduleInfo.moduleDefinition; // e.g., 'skills/module.yaml' + const configuredPath = path.join(cloneDir, moduleDefinitionPath); - return moduleDir; + if (await fs.pathExists(configuredPath)) { + return path.dirname(configuredPath); + } + + // Fallback: search skills/ and src/ (root level and one level deep for subfolders) + for (const dir of ['skills', 'src']) { + const rootCandidate = path.join(cloneDir, dir, 'module.yaml'); + if (await fs.pathExists(rootCandidate)) { + return path.dirname(rootCandidate); + } + const dirPath = path.join(cloneDir, dir); + if (await fs.pathExists(dirPath)) { + const entries = await fs.readdir(dirPath, { withFileTypes: true }); + for (const entry of entries) { + if (entry.isDirectory()) { + const subCandidate = path.join(dirPath, entry.name, 'module.yaml'); + if (await fs.pathExists(subCandidate)) { + return path.dirname(subCandidate); + } + } + } + } + } + + // Check repo root as last fallback + const rootCandidate = path.join(cloneDir, 'module.yaml'); + if (await fs.pathExists(rootCandidate)) { + return path.dirname(rootCandidate); + } + + // Nothing found: return configured path (preserves old behavior for error messaging) + return path.dirname(configuredPath); } } From fa909a89167d63ec46b806b4458f4e35db12dee8 Mon Sep 17 00:00:00 2001 From: Alex Verkhovsky Date: Fri, 27 Mar 2026 23:55:57 -0600 Subject: [PATCH 3/3] feat: add Junie platform support (#2142) * feat: add Junie platform support with .agents/skills target Co-authored-by: Junie * fix: disable ancestor_conflict_check for Junie platform Junie does not traverse ancestor directories looking for skills, so ancestor_conflict_check should be false. Co-authored-by: Junie --------- Co-authored-by: Junie --- tools/installer/ide/platform-codes.yaml | 7 +++++++ tools/platform-codes.yaml | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/tools/installer/ide/platform-codes.yaml b/tools/installer/ide/platform-codes.yaml index 3f3e068be..e7046d32f 100644 --- a/tools/installer/ide/platform-codes.yaml +++ b/tools/installer/ide/platform-codes.yaml @@ -102,6 +102,13 @@ platforms: - .iflow/commands target_dir: .iflow/skills + junie: + name: "Junie" + preferred: false + installer: + target_dir: .agents/skills + ancestor_conflict_check: false + kilo: name: "KiloCoder" preferred: false diff --git a/tools/platform-codes.yaml b/tools/platform-codes.yaml index f643d7aa6..7227af0ce 100644 --- a/tools/platform-codes.yaml +++ b/tools/platform-codes.yaml @@ -127,6 +127,12 @@ platforms: category: ide description: "AI-powered IDE with cascade flows" + junie: + name: "Junie" + preferred: false + category: cli + description: "AI coding agent by JetBrains" + ona: name: "Ona" preferred: false