agentleFS
jovd83jovd83/skill-yaml-cleanup/SKILL.md

skill-lint

Skill0 starsChanged 35 days agoMITView on GitHub

Lint AgentSkill folders before they are installed, synced or published: frontmatter that parses as YAML, a name that matches the folder, a description within 1,024 characters, no development-tree paths, no model-run telemetry instructions, and optionally the README standard. Also trims oversized frontmatter, with approval.

  • Installs packages

We split this skill into the rules it gives an agent

5 rules. 0 are common, 2 are distinctive, and 3 are very specific to this project.

  • 0

    Common

    Most of the 5 edited versions we read keep these.

  • 2

    Distinctive

    This author's own choices. Worth a look.

  • 3

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Run it as /skill-lint <path>.

    line 25
  2. Distinctive:

    After fixing, run the linter again on the changed skills only and report the new totals.

    line 86
  3. Very specific:

    When frontmatter is too long for a platform's budget, use the trim tools.

    line 90
  4. Distinctive:

    Never run the scripts of the skill under review.

    line 117
  5. Very specific:

    Do not bypass a failing check with --skip or .skill-lint.json unless the user agrees, and record the reason.

    line 118

“Common” is measured: kept by at least 6 in 10 of the 5 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Skill Lint

Author: jovd83 | Version: 3.0.0 | License: MIT

Lint AgentSkill folders and report what would stop a harness from loading a skill, or from picking it by its description, plus the house rules of this library. Linting is read-only. Fixes happen only after the user approves them.

Run it as /skill-lint <path>. With no path, lint the current repository.

Run The Linter

python "<skill folder>/scripts/skill_lint.py" <path> [<path> ...]

<skill folder> is the folder that holds this SKILL.md (${CLAUDE_SKILL_DIR} in Claude Code). A path can be a skill folder, a SKILL.md, or a tree such as a whole skills directory. The script needs PyYAML: pip install pyyaml, or uv run --with pyyaml python ....

FlagEffect
--readmeAlso run skill-readme-standard's check_readme.py on each repository root.
--strictWarnings fail the run too.
--skip a,bSwitch checks off by id.
--expect-name xExpected name for a single skill, instead of its folder name.
--jsonMachine-readable result.
--quietPrint errors only.

Exit codes: 0 nothing fails, 1 findings fail the run, 2 bad invocation.

Checks

IdSeverityRule
frontmattererrorA frontmatter block exists, parses as YAML, and is a mapping.
nameerrorLowercase letters, digits and single hyphens, at most 64 characters.
name-foldererrorEquals the skill's folder name. Sub-skills inside another skill are exempt.
descriptionerrorPresent and at most 1,024 characters. A < is a warning.
fieldserrormetadata is a mapping, context is fork, disable-model-invocation and user-invocable are booleans.
dev-pathserrorNo absolute paths into the development checkout in SKILL.md, references/, scripts/, agents/ or assets/. A warning in README.md.
telemetryerrorNo instructions telling the model to log its own skill usage, in SKILL.md or references/. Harness hooks do the logging.
keyswarningTop-level keys outside the Agent Skills and Claude Code set.
author-versionwarningmetadata carries author and version.
sizewarningSKILL.md stays under 500 lines.
linkswarningRelative links in SKILL.md resolve. Code blocks are ignored.
readmeerrorWith --readme: the README passes check_readme.py.

A .skill-lint.json next to SKILL.md or at the repository root switches checks off for that skill: {"skip": ["telemetry"], "expect_name": "my-skill"}. Every skip needs a reason in the repository, such as a line in the README or CHANGELOG.

Report

  1. Lead with the totals: skills checked, errors, warnings.
  2. List the errors grouped by skill, each with file:line, the check id and one line on the fix.
  3. Summarise warnings by check, unless the user asks for all of them.
  4. Mark third-party skills (no source in the user's own repositories) as report-only.
  5. Propose fixes and stop. Change nothing until the user approves.

Fixing Findings

CheckFix
frontmatterQuote any value that contains : or starts with a special character; the usual culprit is an unquoted description.
name, name-folderRename the name field or the folder. A public skill's name is also its trigger and often its repository name, so ask which one should change.
descriptionShorten it while keeping the trigger phrases; drop restated examples first.
fieldsUse context: fork or remove context; write booleans as true or false.
dev-pathsUse a path relative to the skill folder, ${CLAUDE_SKILL_DIR}, or an environment variable.
telemetryDelete the block. Usage logging belongs in harness hooks.
keysMove custom fields under metadata.
author-versionAdd author and version under metadata, matching the body's version line and the CHANGELOG.

After fixing, run the linter again on the changed skills only and report the new totals.

Oversized Frontmatter

When frontmatter is too long for a platform's budget, use the trim tools. Every tool supports --dry-run, so preview first.

  1. python scripts/audit.py --dir <skills directory> [--limit 1000] reports blocks over the limit by severity.
  2. python scripts/analyze.py --file <SKILL.md> proposes deduplication, list flattening, noise removal, field migration and description trimming, with estimated savings.
  3. Show the before/after proposal and ask for approval. This is a hard stop: nothing is written without a yes.
  4. Apply in order: deduplicate.py --backup, flatten.py, remove_noise.py, migrate_to_body.py, then any approved description edit.
  5. Re-run audit.py and skill_lint.py on the changed files.

migrate_to_body.py moves license, compatibility, homepage, platforms and metadata.maturity into the body line. author and version stay in metadata. scripts/cleanup.py runs the same pipeline in one command and still needs the approval gate before --apply.

Continuous Integration

The repository is also a GitHub Action:

- uses: actions/checkout@v7
- uses: jovd83/skill-lint@v3
  with:
    path: .
    readme: "true"

Inputs: path (default .), readme, strict, and args for extra flags. In Actions the checkout folder is named after the repository, so name-folder compares the skill name with the repository name.

Guardrails

  • Linting never writes files. Fixes wait for explicit approval, and the first write to a file uses --backup.
  • Never run the scripts of the skill under review; read its files only.
  • Do not bypass a failing check with --skip or .skill-lint.json unless the user agrees, and record the reason.
  • In the two-tree layout, fix the development source and let the sync update the installed copy. Never edit the installed copy.

Scripts Reference

ScriptPurposeKey flags
scripts/skill_lint.pyLint skills and optionally their READMEs--readme, --strict, --skip, --expect-name, --json, --quiet
scripts/audit.pyReport oversized frontmatter blocks--dir, --files, --limit, --json
scripts/analyze.pyPer-skill trim recommendations--file, --json
scripts/deduplicate.pyMerge duplicate metadata: blocks--file, --dry-run, --backup
scripts/flatten.pyTurn vertical YAML lists into inline values--file, --dry-run, --backup
scripts/remove_noise.pyStrip decorative and empty fields--file, --dry-run, --backup
scripts/migrate_to_body.pyMove non-routing fields into the body line--file, --dry-run, --backup
scripts/cleanup.pyTrim pipeline in one command--analyze, --apply, --dry-run, --backup, --json

Download now (ZIP)

  • Other versions8 projects use a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 8

    1. EvovexAI/EvoFlow★ 572same name
    2. gtrabanco/agentic-workflow★ 22same name
    3. gabrielkoerich/skills★ 8same name
    4. tizee/skills★ 2same name
    5. broneq/bdk★ 1same name
    6. reasonix-ai/skills★ 1same name
    7. turntuptechnologies-ai/skills★ 1same name
    8. mendonca-bruno/claude-skills★ 0same name

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.