"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.
Pre-computed context
check's tool probes ran at load time. Read these rows instead of re-issuing them; each shows the
tool's path when present, or absent when missing:
jq: !{ command -v jq 2>/dev/null || echo "absent"; }curl: !{ command -v curl 2>/dev/null || echo "absent"; }awk: !{ command -v awk 2>/dev/null || echo "absent"; }sort: !{ command -v sort 2>/dev/null || echo "absent"; }
A row reading [shell command execution disabled by policy] carries no result: run that tool'scommand -v probe via Bash instead.
Purpose
Setup per the uniform setup contract (docs/plugin-philosophy.md "Setup is explicit and repeatable" in
the marketplace repository): check inspects and reports, apply resolves. This plugin declares nouserConfig, and has two setup concerns:
- the external command-line tools its bundled scripts require, where
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, so never prompt when the action is given.
check (read-only)
The bundled scripts are the single source of truth for what this plugin requires.
Read it first. Probe what it actually does, don't recite this file. Then read the
pre-computed tool rows, run the remaining probes via Bash, and report a PASS/FAIL/INFO table with one remediation line per FAIL. Do not modify anything.
The runtime scripts and their tools:
${CLAUDE_PLUGIN_ROOT}/skills/audit/scripts/check-plugin-drift.sh: jq and curl${CLAUDE_PLUGIN_ROOT}/skills/audit/scripts/check-structure.sh,check-hook-coverage.shandfix-plugin-drift.sh: jq${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-permission-state/scripts/*.sh: jq (required;permission-state.shexits 2 without it), awk and sort;automode-block-lint.shandautomode-entry-diff.shadd python3 for an optional lane${CLAUDE_PLUGIN_ROOT}/skills/draft-auto-mode-rules/scripts/draft-automode-block.sh: jq plus awk${CLAUDE_PLUGIN_ROOT}/skills/audit-pass/scripts/run-state.shand${CLAUDE_PLUGIN_ROOT}/lib/check-retirements.sh: jq (run-state.shfalls back to python3, then to a scan that announces itself)${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 and permission-state.sh probe for their tools; the rest 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, from the pre-computedjqrow. FAIL if absent: the JSON-parsing scripts need it (inventory.shdegrades
to an empty inventory; the othersexit 2with an install remediation). Missingjqblocks every
skill whose scripts parse JSON (audit,audit-automation-gaps,audit-permission-grants,audit-permission-state,draft-auto-mode-rules, andaudit-pass's run-state and retirement
helpers);audit-instructionsscans markdown and is unaffected.curl, from the pre-computedcurlrow. FAIL if absent, but scoped: only the plugin-drift check
(check-plugin-drift.sh) uses it andexit 2s without it. The rest ofauditand every other
skill still run; say so in the remediation line.awkandsort, from the pre-computedawkandsortrows. 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, which is the bash shell on every platform and 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, probed as the pair:git check-ignore -vreports no match (a match is FAIL with the pattern) ANDgit ls-files --error-unmatchexits 0. 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 as malformed any entry missing any of its five required
keys: check, claim, sites, reason, date. 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. Five skills depend on them (audit,audit-permission-grants,audit-permission-state,draft-auto-mode-rules, andaudit-instructions), and onlyconflict-scan.shandpermission-state.shexit 2cleanly, so do not offer the others 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 probe via Bash (command -v <tool>; the pre-computed rows
predate the install) 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 the plugin's audit and drafting skills (
/claude-config:audit,audit-automation-gaps,audit-instructions,audit-pass,audit-permission-grants,audit-permission-state,audit-prompting-postures,draft-auto-mode-rules,unhobble). - Write the plugin cache, Claude Code user settings, or
pluginConfigs. - Install system packages.
- 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.