From superpowers-plus
Validates skill.md structure: YAML frontmatter fields, line limits, coordination metadata as errors; warns on missing Failure Modes. Use after edits, bulk changes, or before commits.
npx claudepluginhub bordenet/superpowers-plus --plugin superpowers-plusThis skill uses the workspace's default tool permissions.
> **Purpose:** Cheap structural lint for skill files. Not a runtime diagnostic.
Mandates invoking relevant skills via tools before any response in coding sessions. Covers access, priorities, and adaptations for Claude Code, Copilot CLI, Gemini CLI.
Share bugs, ideas, or general feedback.
Purpose: Cheap structural lint for skill files. Not a runtime diagnostic.
Wrong skill? Runtime skill issues →
superpowers-doctor. Writing new skills →skill-authoring. Skill prose quality →writing-skills.
Announce at start: "I'm running the skill-health-check structural lint."
superpowers-doctor: Full runtime diagnostics (heavier than this lint)
skill-authoring: Writing new skill files
superpowers-help: Skill discovery (lighter)
writing-skills: Skill file format reference
evolution-loop: Self-improvement cycle
skills/ — catches formatting errors early| Check | Severity | What it validates |
|---|---|---|
| YAML frontmatter | ERROR | name, source, triggers, description fields present |
| Line count | ERROR | No skill.md exceeds 250 lines |
| Coordination metadata | ERROR | coordination: block present with required keys: group, order, internal |
| Failure modes section | WARN | ## Failure Modes heading present (presence only) |
What it does NOT check: coordination semantic validity (correct group names, valid order numbers), cross-reference accuracy, runtime behavior, install state. Those are superpowers-doctor territory. Structural lint validates that required keys exist; doctor validates they are correct.
# Quick check (skill count + line limits)
bash tools/harsh-review.sh
# Full ecosystem health (checks 1-4, uses Ruby YAML parser)
ruby -ryaml -e '
errors = []; warnings = []
Dir.glob("skills/**/skill.md").each do |path|
content = File.read(path)
parts = content.split("---", 3)
if parts.length < 3
errors << "#{path}: No YAML frontmatter"; next
end
data = YAML.safe_load(parts[1]) rescue (errors << "#{path}: Invalid YAML"; next)
%w[name source triggers description].each do |f|
errors << "#{path}: Missing #{f}" unless data&.key?(f)
end
unless data&.key?("coordination")
errors << "#{path}: Missing coordination block"
else
coord = data["coordination"]
%w[group order internal].each do |k|
errors << "#{path}: coordination missing '#{k}'" unless coord&.key?(k)
end
end
warnings << "#{path}: Missing Failure Modes" unless content.include?("## Failure Modes")
lines = content.count("\n")
errors << "#{path}: #{lines} lines (max 250)" if lines > 250
end
errors.each { |e| puts "ERROR: #{e}" }
warnings.each { |w| puts "WARN: #{w}" }
puts "\n#{errors.length} errors, #{warnings.length} warnings"
'
| Failure | Fix |
|---|---|
| New skill created without running health check | Run after every skill creation — catches missing fields immediately |
| README count drifted | Update README counts when adding/removing skills |
| Cross-reference points to renamed/deleted skill | Search for old skill name across all skill.md files |