If the user's intent does not match this skill, route through /plugin-creator:plugin-lifecycle.
<provided_path>
$ARGUMENTS
</provided_path>
Run uvx skilllint@latest check <path> via Bash, using the exact literal path in <provided_path/>. Never splice <provided_path/> directly into a !`...` injection line or any other shell-interpreted string — it is caller-supplied text and may contain characters (;, `, $(), |) that corrupt shell parsing on contact.
Read the findings straight from the command output. Each one carries its error code, severity, the
field or path it applies to, and the suggested fix. Report those to the user and act on them; do
not look up a code anywhere else. Re-run with --fix to apply the auto-fixable ones.
Runtime escapes
When <provided_path/> is a plugin directory, also run:
uv run "${CLAUDE_PLUGIN_ROOT}/skills/lint/scripts/audit_runtime_escapes.py" --plugin-dir <path>
It reports every path, markdown link, and cross-plugin reference in the plugin's runtime files
that resolves only in the authoring repo, with file:line for each. Exit 0 means clean; exit 1
means findings. Pass --all instead of --plugin-dir to sweep every plugin and get one count
each.
A finding is real when the text tells the runtime agent to act on something an installed
consumer does not have. Fenced blocks are exempt, because an anti-pattern shown in a fence is an
illustration rather than an instruction; angle-bracket placeholders are exempt for the same
reason. Move an illustrative real path into a fence, and write a generic one as
<plugin>/skills/<name>/SKILL.md.
The test behind each finding: a path, command, fact, or cross-plugin reference is present in
every environment, bundled and reached by a relative path inside the plugin, or inlined;
otherwise inline, bundle, guard, or delete it. A harness variable counts only where that harness
substitutes it. The scanner never reports a path built on ${CLAUDE_PLUGIN_ROOT} or
${CLAUDE_SKILL_DIR}, so check those by hand against the same test.