Skip to content

Commit 79a6876

Browse files
authored
Merge pull request #2251 from bmad-code-org/fix-installer-builtin-modules
fix(installer): source built-in modules locally instead of from registry
2 parents ea99b7e + 83f374c commit 79a6876

2 files changed

Lines changed: 45 additions & 11 deletions

File tree

src/core-skills/module.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
code: core
22
name: "BMad Core Module"
3+
description: "Core configuration and shared resources"
34

45
header: "BMad Core Configuration"
56
subheader: "Configure the core settings for your BMad installation.\nThese settings will be used across all installed bmad skills, workflows, and agents."

tools/installer/ui.js

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,7 @@ class UI {
598598
const officialCodes = new Set(officialSelected);
599599
const externalManager = new ExternalModuleManager();
600600
const registryModules = await externalManager.listAvailable();
601-
const officialRegistryCodes = new Set(registryModules.map((m) => m.code));
601+
const officialRegistryCodes = new Set(['core', 'bmm', ...registryModules.map((m) => m.code)]);
602602
const installedNonOfficial = [...installedModuleIds].filter((id) => !officialRegistryCodes.has(id));
603603

604604
// Phase 2: Community modules (category drill-down)
@@ -630,27 +630,46 @@ class UI {
630630
* @returns {Array} Selected official module codes
631631
*/
632632
async _selectOfficialModules(installedModuleIds = new Set()) {
633+
// Built-in modules (core, bmm) come from local source, not the registry
634+
const { OfficialModules } = require('./modules/official-modules');
635+
const builtInModules = (await new OfficialModules().listAvailable()).modules || [];
636+
637+
// External modules come from the registry (with fallback)
633638
const externalManager = new ExternalModuleManager();
634639
const registryModules = await externalManager.listAvailable();
635640

636641
const allOptions = [];
637642
const initialValues = [];
638643
const lockedValues = ['core'];
639644

640-
const buildModuleEntry = async (mod) => {
641-
const isInstalled = installedModuleIds.has(mod.code);
642-
const version = await getMarketplaceVersion(mod.code);
643-
const label = version ? `${mod.name} (v${version})` : mod.name;
645+
const buildModuleEntry = async (code, name, description, isDefault) => {
646+
const isInstalled = installedModuleIds.has(code);
647+
const version = await getMarketplaceVersion(code);
648+
const label = version ? `${name} (v${version})` : name;
644649
return {
645650
label,
646-
value: mod.code,
647-
hint: mod.description,
648-
selected: isInstalled,
651+
value: code,
652+
hint: description,
653+
selected: isInstalled || isDefault,
649654
};
650655
};
651656

657+
// Add built-in modules first (always available regardless of network)
658+
const builtInCodes = new Set();
659+
for (const mod of builtInModules) {
660+
const code = mod.id;
661+
builtInCodes.add(code);
662+
const entry = await buildModuleEntry(code, mod.name, mod.description, mod.defaultSelected);
663+
allOptions.push({ label: entry.label, value: entry.value, hint: entry.hint });
664+
if (entry.selected) {
665+
initialValues.push(code);
666+
}
667+
}
668+
669+
// Add external registry modules (skip built-in duplicates)
652670
for (const mod of registryModules) {
653-
const entry = await buildModuleEntry(mod);
671+
if (mod.builtIn || builtInCodes.has(mod.code)) continue;
672+
const entry = await buildModuleEntry(mod.code, mod.name, mod.description, mod.defaultSelected);
654673
allOptions.push({ label: entry.label, value: entry.value, hint: entry.hint });
655674
if (entry.selected) {
656675
initialValues.push(mod.code);
@@ -1122,12 +1141,26 @@ class UI {
11221141
* @returns {Array} Default module codes
11231142
*/
11241143
async getDefaultModules(installedModuleIds = new Set()) {
1125-
const externalManager = new ExternalModuleManager();
1126-
const registryModules = await externalManager.listAvailable();
1144+
// Built-in modules with default_selected come from local source
1145+
const { OfficialModules } = require('./modules/official-modules');
1146+
const builtInModules = (await new OfficialModules().listAvailable()).modules || [];
11271147

11281148
const defaultModules = [];
1149+
const seen = new Set();
1150+
1151+
for (const mod of builtInModules) {
1152+
if (mod.defaultSelected || installedModuleIds.has(mod.id)) {
1153+
defaultModules.push(mod.id);
1154+
seen.add(mod.id);
1155+
}
1156+
}
1157+
1158+
// Add external registry defaults
1159+
const externalManager = new ExternalModuleManager();
1160+
const registryModules = await externalManager.listAvailable();
11291161

11301162
for (const mod of registryModules) {
1163+
if (mod.builtIn || seen.has(mod.code)) continue;
11311164
if (mod.defaultSelected || installedModuleIds.has(mod.code)) {
11321165
defaultModules.push(mod.code);
11331166
}

0 commit comments

Comments
 (0)