Lint Claude Code SKILL.md files for frontmatter, required fields, descriptions, and hardcoded secrets. Stdlib-only Python port of @mukundakatta/skillint.
Project description
skillint-py
A linter for Claude Code skill files (SKILL.md). Catches malformed YAML frontmatter, missing required fields, thin descriptions, hardcoded secrets, and missing body headings before they ship.
Stdlib-only Python port of @mukundakatta/skillint. No PyYAML required -- the linter only needs to recognize the simple key: value mapping that frontmatter actually uses.
Note: there's a separate
claude-skill-checkpackage on PyPI by a different author. This package is the user's own port and uses the-pysuffix to disambiguate.
Install
pip install skillint-py
Usage
from skillint import lint
result = lint("path/to/SKILL.md")
result.fatal # True if frontmatter could not be parsed at all
for issue in result.issues:
print(issue.line, issue.severity, issue.rule_id, issue.message)
You can also lint an in-memory source string:
from skillint import lint_source
source = """---
name: git-commit
description: Use when the user asks Claude to commit changes; handles co-author trailers.
---
## Triggers
"""
result = lint_source(source, file="<inline>")
Result shape
@dataclass
class Issue:
rule_id: str
severity: str # "error" | "warning" | "info"
message: str
suggestion: str = ""
line: int = 1
@dataclass
class LintResult:
file: str
fatal: bool
issues: list[Issue]
Rules
| Rule id | Severity | Checks |
|---|---|---|
missing-frontmatter |
error | File doesn't start with --- YAML fence. |
yaml-parse-error |
error | Frontmatter fails to parse as a mapping. |
missing-required |
error | name or description is missing. |
empty-required |
error | name or description is empty / whitespace. |
kebab-case-name |
error | name is not kebab-case (^[a-z][a-z0-9-]*[a-z0-9]$). |
overlong-name |
warning | name exceeds 64 characters. |
short-description |
warning / error | Description below 80 chars (or below 20 -> error). |
no-trigger-in-description |
warning | Description lacks "when / use / trigger / handle / invoke" language. |
no-body-headings |
warning | Body has no ## headings. |
hardcoded-secret |
error | Provider-shaped key (OpenAI, Anthropic, GitHub, AWS, Slack, Stripe, Google AI). |
unknown-field |
info | Frontmatter field outside the known set. |
API differences from the JS sibling
- Stdlib-only YAML parser handles the flat
key: valuemapping that frontmatter actually uses. Block scalars and tagged values are not supported -- if your frontmatter needs them, the linter falls back to ayaml-parse-errorso you'll see it loud and clear. - No
--configplugin loading -- this Python port runs the built-in rules. - Spec entrypoint is
lint(skill_md_path) -> LintResult.lint_sourcecovers the in-memory case.
See the JS sibling's README for the broader rationale.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file skillint_py-0.1.0.tar.gz.
File metadata
- Download URL: skillint_py-0.1.0.tar.gz
- Upload date:
- Size: 10.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fe4a150fa3fa009f180bedc5f30c8ef7516845bd42ea6e859c50117972aa28a1
|
|
| MD5 |
c14a45bb9290bfc4ed7787582abe2a88
|
|
| BLAKE2b-256 |
455d73c883ea641281d79eb8275a848d7d6592a206e70bc691f1a3187011f297
|
File details
Details for the file skillint_py-0.1.0-py3-none-any.whl.
File metadata
- Download URL: skillint_py-0.1.0-py3-none-any.whl
- Upload date:
- Size: 10.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.4
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
92c2ab99072dd3f3371862119f5c14db92a2bc8a4edae04eda60b5768c161ffe
|
|
| MD5 |
8b1cad2ae1290549bde71f1cea5d1748
|
|
| BLAKE2b-256 |
9d1562a90b6fc7547a5615fbacb4aeea5603f7cf915a75c814f70ae6bc6f95ab
|