davila7/claude-code-templates · warning
Warning: Error loading plugin skills:
Error message
Warning: Error loading plugin skills:
What it means
loadPluginSkills scans installed plugins for bundled skills and warns when the overall scan fails — plugin registry malformed, a plugin directory unexpectedly missing, or YAML/JSON parse errors at the plugin level. It is the plugin-skills counterpart of the directory scan and similarly returns a possibly-empty array on failure.
Source
Thrown at cli-tool/src/skill-dashboard.js:166
}
const skillMdPath = path.join(skillPath, 'SKILL.md');
if (await fs.pathExists(skillMdPath)) {
console.log(chalk.gray(` ✓ Found plugin skill: ${skillDir} from ${marketplace}`));
const skillData = await this.parseSkill(skillMdPath, skillPath, skillDir, 'Plugin');
if (skillData) {
skills.push(skillData);
console.log(chalk.green(` ✅ Loaded plugin skill: ${skillData.name}`));
}
}
}
}
}
return skills;
} catch (error) {
console.warn(chalk.yellow(`Warning: Error loading plugin skills:`), error.message);
return skills;
}
}
async parseSkill(skillMdPath, skillPath, skillDirName, source) {
try {
const content = await fs.readFile(skillMdPath, 'utf8');
// Parse YAML frontmatter
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
let frontmatter = {};
let markdownContent = content;
if (frontmatterMatch) {
try {
frontmatter = yaml.load(frontmatterMatch[1]);
markdownContent = content.substring(frontmatterMatch[0].length).trim();
} catch (error) {View on GitHub (pinned to a0851ed10c)
Solutions
- Check the plugin registry / installed-plugins listing for entries pointing at non-existent directories and remove them
- Reinstall or cleanly uninstall broken plugins so manifests and folders are consistent
- Validate each plugin manifest (`jq .` for JSON, `yq` for YAML) in the plugins directory
- Re-run the skill dashboard to confirm plugin skills load
Example fix
# before # registry lists plugins/my-plugin but folder was rm -rf'd # after claude plugin uninstall my-plugin # or remove the stale registry entry
Defensive patterns
Strategy: validation
Validate before calling
async function pluginEntryOk(plugin) {
if (!(await fs.pathExists(plugin.path))) return false;
try { JSON.parse(await fs.readFile(path.join(plugin.path, '.claude-plugin', 'plugin.json'), 'utf8')); return true; }
catch { return false; }
} Try / catch
catch (error) {
console.warn(`Plugin skills scan failed: ${error.message}`);
return skills;
} Prevention
- Always uninstall plugins via the CLI to keep the registry consistent
- Validate plugin manifests in plugin CI
- Prune registry entries whose directories no longer exist before scanning
When it happens
Trigger: Calling loadPluginSkills when the installed-plugins registry or a plugin's manifest is invalid JSON/YAML, when a registered plugin's directory has been deleted without uninstalling, or when a plugin's skills subfolder violates expected structure.
Common situations: Plugin uninstalled by deleting its folder manually, leaving a stale registry entry; plugin manifest edited by hand and corrupted; version change in plugin manifest schema.
Related errors
- Warning: Error loading plugin ${pluginDir}
- Warning: Error counting components for plugin at ${pluginPat
- Warning: Error loading plugin permissions for ${plugin.name}
- Invalid session file - corrupted or not a Claude Code sessio
- Could not analyze skills:
AI-assisted analysis of davila7/claude-code-templates@a0851ed10c (2026-08-28).
Data as JSON: /api/errors/f4955638dde6f662.
Report an issue: GitHub.