"Verify claude-config's readiness for this repository — the external CLI prerequisites its audit scripts need, jq (the JSON-parsing audit scripts) and curl (the plugin-drift check), and the tracked suppression record audit-pass reads at .claude/audit-pass.md — so the audit skills run instead of failing. Use when: 'set up claude-config', 'configure claude-config', 'is claude-config working', 'set up audit-pass suppressions', or an audit skill reported a missing prerequisite. Actions: check (read-only verification, default) | apply (resolve what check found). Re-runnable and safe."
Resources
1Install
npx skillscat add melodic-software/claude-code-plugins/plugins-claude-config-skills-setup Install via the SkillsCat registry.
Purpose
Setup per the uniform contract: check inspects and reports, apply resolves. This plugin declares nouserConfig, and has two setup concerns:
- the external command-line tools its bundled scripts require — here
applyis guidance-and-verify
with no write path: it points at platform install instructions and never installs a system package; - the tracked consumer-project configuration
audit-passreads, the suppression record at.claude/audit-pass.md— the one surfaceapplymay write.
Action routing: no argument or check runs the check; apply runs the check first, then remediation.
Both are non-interactive — never prompt when the action is given.
check (read-only)
The bundled scripts are the single source of truth for what they require. Read them first — probe
what they actually do, don't recite this file — then run each probe via Bash and report a PASS/FAIL/INFO
table with one remediation line per FAIL — read-only; leave every file untouched. The runtime scripts
and their tools:
${CLAUDE_PLUGIN_ROOT}/skills/audit/scripts/check-plugin-drift.sh— jq and curl, plus awk and sort${CLAUDE_PLUGIN_ROOT}/skills/audit/scripts/check-structure.sh— jq;fix-plugin-drift.sh— jq plus sort${CLAUDE_PLUGIN_ROOT}/skills/audit-automation-gaps/scripts/inventory.sh— jq${CLAUDE_PLUGIN_ROOT}/skills/audit-permission-grants/scripts/permission-rule-check.sh— jq plus awk and sort${CLAUDE_PLUGIN_ROOT}/skills/audit-instructions/scripts/instruction-scan.sh— grep only (POSIX; no jq)${CLAUDE_PLUGIN_ROOT}/skills/audit-instructions/scripts/conflict-scan.sh— awk and sort (no jq)
Only conflict-scan.sh probes for awk and sort; the three above it call them with no guard, so read
each script's actual calls rather than trusting a single script's prerequisite block to speak for the
plugin.
jq—command -v jq. FAIL if absent: the JSON-parsing scripts need it (inventory.shdegrades
to an empty inventory; the othersexit 2with an install remediation). Missingjqblocks the three
JSON-parsing audit skills (audit,audit-automation-gaps,audit-permission-grants);audit-instructionsscans markdown and is unaffected.curl—command -v curl. FAIL if absent, but scoped: only the plugin-drift check
(check-plugin-drift.sh) uses it andexit 2s without it. The rest ofauditand the other three
skills still run — say so in the remediation line.awkandsort—command -v awk,command -v sort. FAIL if either is absent, and not
scoped to one skill:conflict-scan.shexecutes both andexit 2s naming the missing one, whilecheck-plugin-drift.sh(both),permission-rule-check.sh(both), andfix-plugin-drift.sh
(sort) reach them with no prerequisite check at all — soauditandaudit-permission-grants
fail mid-run on a barecommand not foundrather than on a named prerequisite. Say in the
remediation line that this FAIL reaches three skills, not justaudit-instructions. Reportawk
andsortby name rather than as one row, since a minimal shell can carry one and not the other.- Bash shell — INFO: the scripts are bash (arrays,
[[ ]], process substitution,BASH_SOURCE),
run through Claude Code's Bash tool — the bash shell on every platform, Git Bash on native Windows.
Report the resolved interpreter; FAIL only if no bash is resolvable. - Network reachability — INFO only:
audit's drift/freshness fetches readraw.githubusercontent.com, and a failed fetch degrades to SKIP rather than a setup failure. Do not
fetch here —checkperforms no network call.
The audit-pass suppression record
audit-pass reads a tracked suppression record layered per the marketplace's config-cascade
convention. Read the operative shape from${CLAUDE_PLUGIN_ROOT}/skills/audit-pass/reference/suppression.md rather than inferring it — that
reference ships inside this plugin, so it resolves in an installed cache where a path out to the
marketplace's own docs does not. The cross-consumer key contract is the marketplace's published
finding-suppression convention, which is not a runtime dependency of this plugin. All layers
absent is a valid state (no suppressions), so report INFO, never FAIL, when none exists.
Anchor at the repo root (${CLAUDE_PROJECT_DIR}, else git rev-parse --show-toplevel) — never a
CWD-relative read, which resolves a different (or missing) file depending on the subdirectory or
nested worktree the skill was invoked from — then report one row per layer. The same
tracked/ignored question has opposite correct answers per layer, so verify each on its own terms:
- user-global
~/.claude/audit-pass.md— outside the worktree; no git command applies. INFO only. - team
.claude/audit-pass.md— must be tracked. Untracked while present is a hard STOP:
teammates never receive the shared suppressions. - local overlay
.claude/audit-pass.local.md— must be gitignored and never staged. Staged or
tracked is a FAIL: a personal deviation can reach team history.
Parse each present layer and report any entry missing any of its five required keys — check,claim, sites, reason, date — as malformed. Checking only reason and date would pass an
entry that audit-pass itself rejects, so readiness would report green on configuration that cannot
suppress anything. Report as malformed too an entry whose stored constituents do not hash to its own
key: the constituents are authoritative and the key is derived from them. A malformed entry does not
suppress, and a silent partial parse would turn a formatting slip into a lost check.
Report a user-global or overlay entry for an id the team layer does not carry as INFOpersonal-only, not applied, naming promotion to the team layer as what makes it take effect — the
team layer is the only one that enacts a suppression, so a personal-only entry that looks live is a
finding the operator believes is accepted and is not.
apply (idempotent)
Run check, then for each FAIL give the platform install instructions from the README Requirements —
this skill never installs system packages:
- missing
jq: the platform's jq install (for examplewinget install jqlang.jq,brew install jq, orapt-get install jq); reruncheckafter. - missing
curl: the platform's curl install — modern Windows and Git Bash already shipcurl.
Only the plugin-drift check needs it, so the rest of the plugin works meanwhile. - missing
awkorsort: both ship with every POSIX userland, so absence means the shell
environment is minimal rather than that one package is missing — Git Bash and Windowsbusybox
shims are where this shows up. Remediate by installing a full userland rather than the single tool:
Git for Windows, which bundles both; the distribution'sgawk/mawkandcoreutilson Linux;brew install gawk coreutilson macOS. Report the two separately, since a minimal shell can carry
one and not the other. Three skills depend on them —audit,audit-permission-grants, andaudit-instructions— and only the lastexit 2s cleanly, so do not offer the other two as still
working meanwhile. - no resolvable bash: also not remediable by one package — the scripts use arrays,
[[ ]],
process substitution, andBASH_SOURCE, so they need a real bash onPATH: Git for Windows on
native Windows, the distribution'sbashelsewhere. Nothing bundled runs until it resolves, so
say that this FAIL blocks the plugin rather than offering a partial workaround.
The network row stays INFO and has no apply entry on purpose: a failed fetch degrades to SKIP by
design, so there is nothing to remediate.
After any install, re-run the relevant check probe and report its actual result — never claim resolved
on the install command's exit code alone. Re-running apply once every probe passes changes nothing and
reports "already configured".
Then converge the one surface this plugin owns, conservatively:
- No suppression record anywhere — leave it that way and say so. Absent is valid; an empty
scaffold is noise. Scaffold the team layer with the documented shape only on an explicit request. - Team layer present but untracked — report the STOP and the exact
git addthe operator should
run. Never stage on their behalf. - Overlay present but not ignored — recommend the recursive
.claude/**/*.local.*line and leave
the.gitignoreedit to the consumer. - Malformed or unrecognized entries — report them and stop. Never rewrite, reorder, or drop an
operator's suppression: an entry this skill cannot reconcile is a question for the operator, and a
silent rewrite would hide the very finding the entry was suppressing.
Every write names the file and the exact change before making it, and preserves unrelated content.
Gotchas
- Never run a git command against the user-global layer.
~/.claude/audit-pass.mdis outside the
worktree, sogit check-ignoreandgit statusreturn a meaningless verdict there — or a
confidently wrong one when the home directory is itself a git repository. - Missing config is not a failure. All three suppression layers absent means no suppressions,
which is the normal state for a repo that has never suppressed a finding. INFO, never FAIL. - Recommend the recursive gitignore line, and leave the edit to the consumer.
.claude/**/*.local.*
covers flat, folder-form, and profiled overlays alike; the narrower.claude/*.local.*silently
misses any nested overlay. The consumer's ignore file is their artifact — this skill never writes it. - An install command's exit code is not verification. After any install, re-run the probe and
report its actual result.
What this skill does NOT do
- Run an audit — that is
/claude-config:audit,/claude-config:audit-automation-gaps,/claude-config:audit-permission-grants,/claude-config:audit-instructions, and/claude-config:audit-pass. - Install system packages, write Claude Code settings or
pluginConfigs, or touch the plugin cache. - Write the consumer's
.gitignore, stage anything, or edit an operator's suppression entries. - Download anything —
checkmakes no network call; the audit skills' own doc/marketplace fetches are
theirs, not setup's.