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.
Metadata
Release files for skillint-py 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| skillint_py-0.1.0.tar.gz | 10.3 kB | Without provenance | Details for skillint_py-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| skillint_py-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for skillint_py-0.1.0-py3-none-any.whl |
Total release size: 20.5 kB
Release files / skillint_py-0.1.0.tar.gz
| Download URL | skillint_py-0.1.0.tar.gz |
|---|---|
| Size | 10.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fe4a150fa3fa009f180bedc5f30c8ef7516845bd42ea6e859c50117972aa28a1
|
|
BLAKE2b-256 checksum How to use checksums |
455d73c883ea641281d79eb8275a848d7d6592a206e70bc691f1a3187011f297
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|
Release files / skillint_py-0.1.0-py3-none-any.whl
| Download URL | skillint_py-0.1.0-py3-none-any.whl |
|---|---|
| Size | 10.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
92c2ab99072dd3f3371862119f5c14db92a2bc8a4edae04eda60b5768c161ffe
|
|
BLAKE2b-256 checksum How to use checksums |
9d1562a90b6fc7547a5615fbacb4aeea5603f7cf915a75c814f70ae6bc6f95ab
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.4
|
Security for skillint-py 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.