You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Add plugin and skill linting to the PR check workflow - #8
Python syntax errors and pyflakes issues in bundled scripts
shellcheck scripts/*.sh
Shell script hygiene
README tree check
Fails if scripts/update-readme-tree.sh would change README.md
lint-plugins.pyerrors on: skill name not kebab-case, over 64 characters, containing anthropic/claude, or not matching its folder; missing/over-1,024-character description or XML tags in it; SKILL.md body ≥ 500 lines; Windows-style link paths; SKILL.md outside skills/<name>/; plugin-root CLAUDE.md; manifest name or version disagreeing with its marketplace entry; missing version/description/author; missing icon file; plugin folders not listed in the marketplace; .DS_Store/__pycache__ junk.
It warns (does not fail) on: descriptions not in the third person or without a "Use when …" clause, nested .md references, missing link targets, and reference files over 100 lines without a ## Contents section.
Also adds a Checks section to the README with the commands to run locally.
Verification
All steps pass locally on this branch (0 errors; 3 warnings for mimi-core descriptions that lack a "Use when" clause).
Negative test on a copy: a Claude_Edit skill name, an unlisted plugins/stray folder and a .DS_Store each produce an error.
Add scripts/lint-plugins.py, which checks skills and manifests against
Anthropic's plugin reference and skill authoring best practices. The
check job now also runs strict plugin validation, ruff on Python
scripts, shellcheck on shell scripts, and fails when the README
directory tree is out of date. Document the checks in the README.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01N6QLSr7Xy6yQNtiWmjghNz
The README tree check failed in CI because the committed tree listed a
local .ruff_cache whose contents differ on every run. Add a .gitignore
for caches and OS files, generate the tree with --gitignore, and make
the lint junk check look only at files tracked by git.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01N6QLSr7Xy6yQNtiWmjghNz
A Windows drive path such as c:\\docs\\guide.md matches the URI check on line 90 and is skipped before the backslash check, so this advertised error is not reported for that form of Windows-style link. Check for backslashes before treating a target as an external URI (or explicitly exclude drive-letter paths).
🧠 Review effort: Lite
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The
checkjob now runs these steps before auto-merge:claude plugin validate --strictscripts/lint-plugins.py(new, stdlib only)ruff check --select E9,Fshellcheck scripts/*.shscripts/update-readme-tree.shwould changeREADME.mdlint-plugins.pyerrors on: skillnamenot kebab-case, over 64 characters, containinganthropic/claude, or not matching its folder; missing/over-1,024-characterdescriptionor XML tags in it; SKILL.md body ≥ 500 lines; Windows-style link paths;SKILL.mdoutsideskills/<name>/; plugin-rootCLAUDE.md; manifest name or version disagreeing with its marketplace entry; missingversion/description/author; missingiconfile; plugin folders not listed in the marketplace;.DS_Store/__pycache__junk.It warns (does not fail) on: descriptions not in the third person or without a "Use when …" clause, nested
.mdreferences, missing link targets, and reference files over 100 lines without a## Contentssection.Also adds a Checks section to the README with the commands to run locally.
Verification
mimi-coredescriptions that lack a "Use when" clause).Claude_Editskill name, an unlistedplugins/strayfolder and a.DS_Storeeach produce an error.🤖 Generated with Claude Code
https://claude.ai/code/session_01N6QLSr7Xy6yQNtiWmjghNz
Generated by Claude Code