fix: addressed PR comments

This commit is contained in:
murat 2026-05-08 11:20:17 -05:00
parent 0227b55eee
commit af75e9d8a1
3 changed files with 35 additions and 7 deletions

View File

@ -6,6 +6,17 @@ npx --no-install lint-staged
# Validate everything
npm test
# Validate marketplace manifest when skills or manifest change
if command -v rg >/dev/null 2>&1; then
if git diff --cached --name-only | rg -q 'SKILL\.md|\.claude-plugin/marketplace\.json'; then
npm run validate:marketplace
fi
else
if git diff --cached --name-only | grep -Eq 'SKILL\.md|\.claude-plugin/marketplace\.json'; then
npm run validate:marketplace
fi
fi
# Validate docs links only when docs change
if command -v rg >/dev/null 2>&1; then
if git diff --cached --name-only | rg -q '^docs/'; then

View File

@ -19,7 +19,8 @@ Build software faster using AI-powered workflows with specialized agents that gu
- **Git** — Recommended for version control
- **AI-powered IDE** — Claude Code, Cursor, or similar
- **A project idea** — Even a simple one works for learning
:::
:::
:::tip[The Easiest Path]
**Install** → `npx bmad-method install`
@ -285,6 +286,7 @@ BMad-Help inspects your project, detects what you've completed, and tells you ex
- **Always use fresh chats** — Start a new chat for each workflow
- **Track matters** — Quick Flow uses `bmad-quick-dev`; Method/Enterprise need PRD and architecture
- **BMad-Help runs automatically** — Every workflow ends with guidance on what's next
:::
:::
Ready to start? Install BMad, invoke `bmad-help`, and let your intelligent guide lead the way.

View File

@ -86,10 +86,15 @@ function validate() {
return { ok: false, fatal: `marketplace.json is not valid JSON: ${error.message}` };
}
if (!fs.existsSync(SRC_DIR)) {
return { ok: false, fatal: `src directory not found at ${SRC_DIR}` };
}
const plugins = Array.isArray(marketplace.plugins) ? marketplace.plugins : [];
const declaredBy = new Map(); // skillPath -> [pluginName]
for (const plugin of plugins) {
for (const skillPath of plugin.skills || []) {
const skills = Array.isArray(plugin.skills) ? plugin.skills : [];
for (const skillPath of skills) {
if (!declaredBy.has(skillPath)) declaredBy.set(skillPath, []);
declaredBy.get(skillPath).push(plugin.name);
}
@ -111,9 +116,16 @@ function validate() {
}
}
const duplicates = []; // same path declared by multiple plugins
const duplicates = []; // same path declared more than once (within or across plugins)
for (const [skillPath, names] of declaredBy) {
if (names.length > 1) duplicates.push({ path: skillPath, declaredBy: names });
if (names.length > 1) {
const uniquePlugins = [...new Set(names)];
duplicates.push({
path: skillPath,
declaredBy: uniquePlugins,
withinSamePlugin: uniquePlugins.length === 1,
});
}
}
return {
@ -149,9 +161,12 @@ function reportHuman(result) {
}
if (duplicates.length > 0) {
console.log(`\n${duplicates.length} skill path(s) declared by multiple plugins:`);
console.log(`\n${duplicates.length} skill path(s) declared more than once:`);
for (const d of duplicates) {
console.log(` ${d.path} (in: ${d.declaredBy.join(', ')})`);
const where = d.withinSamePlugin
? `listed multiple times in "${d.declaredBy[0]}"`
: `in multiple plugins: ${d.declaredBy.join(', ')}`;
console.log(` ${d.path} (${where})`);
}
}