Compare commits

..

1 Commits

Author SHA1 Message Date
Nikolas de Hor e797e6efe0
Merge 1a85069b75 into ea99b7ece5 2026-04-11 01:06:27 -04:00
4 changed files with 19 additions and 51 deletions

View File

@ -1,6 +1,5 @@
code: core
name: "BMad Core Module"
description: "Core configuration and shared resources"
header: "BMad Core Configuration"
subheader: "Configure the core settings for your BMad installation.\nThese settings will be used across all installed bmad skills, workflows, and agents."

View File

@ -598,7 +598,7 @@ class UI {
const officialCodes = new Set(officialSelected);
const externalManager = new ExternalModuleManager();
const registryModules = await externalManager.listAvailable();
const officialRegistryCodes = new Set(['core', 'bmm', ...registryModules.map((m) => m.code)]);
const officialRegistryCodes = new Set(registryModules.map((m) => m.code));
const installedNonOfficial = [...installedModuleIds].filter((id) => !officialRegistryCodes.has(id));
// Phase 2: Community modules (category drill-down)
@ -630,11 +630,6 @@ class UI {
* @returns {Array} Selected official module codes
*/
async _selectOfficialModules(installedModuleIds = new Set()) {
// Built-in modules (core, bmm) come from local source, not the registry
const { OfficialModules } = require('./modules/official-modules');
const builtInModules = (await new OfficialModules().listAvailable()).modules || [];
// External modules come from the registry (with fallback)
const externalManager = new ExternalModuleManager();
const registryModules = await externalManager.listAvailable();
@ -642,34 +637,20 @@ class UI {
const initialValues = [];
const lockedValues = ['core'];
const buildModuleEntry = async (code, name, description, isDefault) => {
const isInstalled = installedModuleIds.has(code);
const version = await getMarketplaceVersion(code);
const label = version ? `${name} (v${version})` : name;
const buildModuleEntry = async (mod) => {
const isInstalled = installedModuleIds.has(mod.code);
const version = await getMarketplaceVersion(mod.code);
const label = version ? `${mod.name} (v${version})` : mod.name;
return {
label,
value: code,
hint: description,
selected: isInstalled || isDefault,
value: mod.code,
hint: mod.description,
selected: isInstalled,
};
};
// Add built-in modules first (always available regardless of network)
const builtInCodes = new Set();
for (const mod of builtInModules) {
const code = mod.id;
builtInCodes.add(code);
const entry = await buildModuleEntry(code, mod.name, mod.description, mod.defaultSelected);
allOptions.push({ label: entry.label, value: entry.value, hint: entry.hint });
if (entry.selected) {
initialValues.push(code);
}
}
// Add external registry modules (skip built-in duplicates)
for (const mod of registryModules) {
if (mod.builtIn || builtInCodes.has(mod.code)) continue;
const entry = await buildModuleEntry(mod.code, mod.name, mod.description, mod.defaultSelected);
const entry = await buildModuleEntry(mod);
allOptions.push({ label: entry.label, value: entry.value, hint: entry.hint });
if (entry.selected) {
initialValues.push(mod.code);
@ -1141,26 +1122,12 @@ class UI {
* @returns {Array} Default module codes
*/
async getDefaultModules(installedModuleIds = new Set()) {
// Built-in modules with default_selected come from local source
const { OfficialModules } = require('./modules/official-modules');
const builtInModules = (await new OfficialModules().listAvailable()).modules || [];
const defaultModules = [];
const seen = new Set();
for (const mod of builtInModules) {
if (mod.defaultSelected || installedModuleIds.has(mod.id)) {
defaultModules.push(mod.id);
seen.add(mod.id);
}
}
// Add external registry defaults
const externalManager = new ExternalModuleManager();
const registryModules = await externalManager.listAvailable();
const defaultModules = [];
for (const mod of registryModules) {
if (mod.builtIn || seen.has(mod.code)) continue;
if (mod.defaultSelected || installedModuleIds.has(mod.code)) {
defaultModules.push(mod.code);
}

View File

@ -93,6 +93,7 @@
.agent-icon.john { background: linear-gradient(135deg, #60a5fa, #3b82f6); }
.agent-icon.sally { background: linear-gradient(135deg, #fbbf24, #f59e0b); color: #000; }
.agent-icon.winston { background: linear-gradient(135deg, #a78bfa, #8b5cf6); }
.agent-icon.bob { background: linear-gradient(135deg, #34d399, #10b981); color: #000; }
.agent-icon.amelia { background: linear-gradient(135deg, #fb7185, #ef4444); }
.agent-name { font-size: 0.65rem; }
@ -260,7 +261,7 @@
<span class="workflow-name">sprint-planning</span>
</div>
<div class="workflow-meta">
<div class="agent"><div class="agent-icon amelia">A</div><span class="agent-name">Amelia</span></div>
<div class="agent"><div class="agent-icon bob">B</div><span class="agent-name">Bob</span></div>
<span class="output">sprint-status.yaml →</span>
</div>
</div>
@ -269,7 +270,7 @@
<span class="workflow-name">create-story</span>
</div>
<div class="workflow-meta">
<div class="agent"><div class="agent-icon amelia">A</div><span class="agent-name">Amelia</span></div>
<div class="agent"><div class="agent-icon bob">B</div><span class="agent-name">Bob</span></div>
<span class="output">story-[slug].md →</span>
</div>
</div>
@ -307,7 +308,7 @@
<span class="badge adhoc">par Epic</span>
</div>
<div class="workflow-meta">
<div class="agent"><div class="agent-icon amelia">A</div><span class="agent-name">Amelia</span></div>
<div class="agent"><div class="agent-icon bob">B</div><span class="agent-name">Bob</span></div>
<span class="output">leçons</span>
</div>
</div>

View File

@ -93,6 +93,7 @@
.agent-icon.john { background: linear-gradient(135deg, #60a5fa, #3b82f6); }
.agent-icon.sally { background: linear-gradient(135deg, #fbbf24, #f59e0b); color: #000; }
.agent-icon.winston { background: linear-gradient(135deg, #a78bfa, #8b5cf6); }
.agent-icon.bob { background: linear-gradient(135deg, #34d399, #10b981); color: #000; }
.agent-icon.amelia { background: linear-gradient(135deg, #fb7185, #ef4444); }
.agent-name { font-size: 0.65rem; }
@ -271,7 +272,7 @@
<span class="workflow-name">sprint-planning</span>
</div>
<div class="workflow-meta">
<div class="agent"><div class="agent-icon amelia">A</div><span class="agent-name">Amelia</span></div>
<div class="agent"><div class="agent-icon bob">B</div><span class="agent-name">Bob</span></div>
<span class="output">sprint-status.yaml →</span>
</div>
</div>
@ -280,7 +281,7 @@
<span class="workflow-name">create-story</span>
</div>
<div class="workflow-meta">
<div class="agent"><div class="agent-icon amelia">A</div><span class="agent-name">Amelia</span></div>
<div class="agent"><div class="agent-icon bob">B</div><span class="agent-name">Bob</span></div>
<span class="output">story-[slug].md →</span>
</div>
</div>
@ -318,7 +319,7 @@
<span class="badge adhoc">per epic</span>
</div>
<div class="workflow-meta">
<div class="agent"><div class="agent-icon amelia">A</div><span class="agent-name">Amelia</span></div>
<div class="agent"><div class="agent-icon bob">B</div><span class="agent-name">Bob</span></div>
<span class="output">lessons</span>
</div>
</div>