Install Anti-Slop Oxlint Rules
dmmulroy/anti-slop
Installs, updates or migrates the vendored anti-slop Oxlint plugin in a repository, keeping local rule changes and the plugin's license and provenance files.
Fix a shuck lint rule that has conformance deltas against ShellCheck.
$ npx skills add ewhauser/shuck --skill fix-rule -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ewhauser/shuck fix-rule --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ewhauser/shuck.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/fix-rule .claude/skills/fix-rule && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "fix-rule" agent skill from https://github.com/ewhauser/shuck/tree/main/.claude/skills/fix-rule into .claude/skills/fix-rule/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-rule", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ewhauser/shuck/tree/main/.claude/skills/fix-ruleType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ewhauser/shuck --skill fix-rule -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ewhauser/shuck fix-rule --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ewhauser/shuck.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/fix-rule .agents/skills/fix-rule && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "fix-rule" agent skill from https://github.com/ewhauser/shuck/tree/main/.claude/skills/fix-rule into .agents/skills/fix-rule/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-rule", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ewhauser/shuck --skill fix-rule -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ewhauser/shuck fix-rule --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ewhauser/shuck.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/fix-rule .cursor/skills/fix-rule && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "fix-rule" agent skill from https://github.com/ewhauser/shuck/tree/main/.claude/skills/fix-rule into .cursor/skills/fix-rule/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-rule", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ewhauser/shuck.git --path .claude/skills/fix-rule--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ewhauser/shuck --skill fix-rule -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ewhauser/shuck fix-rule --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ewhauser/shuck.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/fix-rule .gemini/skills/fix-rule && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "fix-rule" agent skill from https://github.com/ewhauser/shuck/tree/main/.claude/skills/fix-rule into .gemini/skills/fix-rule/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-rule", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ewhauser/shuck fix-ruleInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ewhauser/shuck --skill fix-rule -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ewhauser/shuck.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/fix-rule .github/skills/fix-rule && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "fix-rule" agent skill from https://github.com/ewhauser/shuck/tree/main/.claude/skills/fix-rule into .github/skills/fix-rule/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-rule", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ewhauser/shuck --skill fix-rule -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ewhauser/shuck fix-rule --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ewhauser/shuck.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/fix-rule .opencode/skills/fix-rule && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "fix-rule" agent skill from https://github.com/ewhauser/shuck/tree/main/.claude/skills/fix-rule into .opencode/skills/fix-rule/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "fix-rule", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
fix-ruleFix a shuck lint rule that has conformance deltas against ShellCheck.
Fix Rule is an agent skill from ewhauser/shuck. Fix a shuck lint rule that has conformance deltas against ShellCheck. Use this skill whenever the user asks to fix a rule (e.g., "fix C001", "fix the deltas for C006", "address the corpus failures in C019"), debug why a rule is producing wrong results, or work through a bug document in docs/bugs/. This skill is about diagnosing whether a delta is a shuck bug or a ShellCheck quirk and then fixing at the right layer — not about implementing new rules from scratch (that's the implement-rule skill) or just running…
Its SKILL.md is about 3.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Linting and formatting. The repository describes itself as: A lightning fast shell linter/formatter/LSP server with zsh support. The licence is MIT.
8 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 904974e. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
cargomakeshellchecknixjqFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Fix Rule loads about 3.2k tokens when it runs. Until then it costs about 145 tokens; SKILL.md has 1,559 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from ewhauser/shuck at commit 904974e, republished under its MIT licence (© ewhauser). 1,559 words, ~3,247 tokens.
.claude/skills/fix-rule/SKILL.md (or your agent's skills folder).This skill takes a rule with known conformance deltas and fixes it. The core judgment call on every delta is: is ShellCheck right or is shuck right? When shuck is wrong, the fix belongs at whatever layer actually caused the problem — not hacked into the rule just to satisfy the oracle.
Before you change anything, internalize this: rule files in
crates/shuck-linter/src/rules/ must not parse, scan, or walk anything.
They are cheap filters over precomputed facts and semantic data. All
structural discovery lives in lower layers:
crates/shuck-parsercrates/shuck-semanticcrates/shuck-linter/src/facts.rs and src/facts/Rule files must not:
walk_commands, iter_commands,
manual child recursion).checker.source() to discover shell structure.crate::rules::common::* (rule-facing types come from the
crate root or a rule-local helper module).src/rules/mod.rs (WordPart, ConditionalExpr, iter_commands,
query::, etc.).If a fix tempts you to do any of those things in the rule file, stop and
push the work down a layer. See crates/shuck-linter/AGENTS.md for the full
contract.
Read these files to understand the rule and its current state:
docs/rules/CXXX.yamlcrates/shuck-linter/src/rules/{category}/{name}.rscrates/shuck-linter/src/facts.rs — search for the rule namedocs/bugs/CXXX.mdcrates/shuck/tests/testdata/corpus-metadata/cXXX.yamlcrates/shuck-linter/AGENTS.mdIf you're in a git worktree (not the main worktree), the large corpus cache won't exist. Symlink it from the main worktree so you don't re-download everything:
make ensure-cacheThis is idempotent — safe to run even if .cache already exists.
Run a targeted comparison for just the rule in question:
make test-large-corpus SHUCK_LARGE_CORPUS_RULES=CXXXThe test will likely fail — the failure output IS the data you need. Capture and read the full output.
If the full run takes too long or produces overwhelming output, start with a sample:
make test-large-corpus SHUCK_LARGE_CORPUS_RULES=CXXX SHUCK_LARGE_CORPUS_SAMPLE_PERCENT=10Each failure block shows a fixture where shuck and ShellCheck disagree:
compatibility diff (code + location):
SCXXXX: shellcheck=N shuck=M
labels:
location-only | directive-handling | shellcheck-parse-abort | ...
shellcheck diagnostics:
SC1234 line:col-endline:endcol level message
shuck diagnostics:
CXXX=>SCXXXX line:col-endline:endcol severity messageKey signals:
shellcheck-parse-abort label — ShellCheck bailed on a parse error; delta is unreliableproject-closure label — delta depends on source/dot resolution differencesFor each failing fixture, read the actual script source to understand what the code is doing. Find the script in the corpus:
find .cache/large-corpus -name "fixture_name_here"Then read the script around the lines mentioned in the diagnostics. Group failures by root cause — most deltas cluster into a few distinct patterns.
For each pattern, decide:
ShellCheck is right, shuck is wrong — shuck has a bug. Proceed to Step 4.
ShellCheck is wrong, shuck is right — the oracle is imperfect. Common cases:
For oracle issues, skip to Step 5 to record the divergence so it won't block the corpus test or waste future investigation time.
Genuine disagreement on policy — shuck intentionally diverges from ShellCheck (stricter or more lenient by design). Also goes to Step 5.
To understand ShellCheck's reasoning, run it directly:
nix --extra-experimental-features 'nix-command flakes' develop --command \
shellcheck --format=json /path/to/script.sh 2>/dev/null | jq '.[] | select(.code == NNNN)'This is the most important part. Fixing at the wrong layer creates tech debt that compounds — a hack in the rule to work around a parser bug means every future rule hitting the same construct will need the same hack. And rules are not allowed to compensate for missing structural data by walking or parsing themselves (see "The hard architectural constraint" above).
Work from the bottom up. The issue lives at the lowest layer that gets it wrong:
Layer 1 — Lexer (crates/shuck-parser/src/parser/lexer.rs)
Symptoms: tokens are wrong, quoting boundaries are off, heredoc content is
misattributed. Check by printing the token stream for a minimal reproducer.
Layer 2 — Parser/AST (crates/shuck-parser/src/parser/)
Symptoms: the AST structure doesn't match what the script actually says. A
command is parsed as the wrong type, redirections are attached to the wrong
node, compound commands have wrong boundaries. Check by dumping the AST for a
minimal reproducer.
Layer 3 — Semantic model (crates/shuck-semantic/)
Symptoms: bindings/references are wrong, scope assignment is off, def-use
chains miss a connection. The AST is correct but the semantic analysis
misinterprets it. Check by querying the semantic model directly.
Layer 4 — Fact generation (crates/shuck-linter/src/facts.rs and
src/facts/)
Symptoms: the semantic model is correct but the linter-level facts derived
from it are wrong. A test fact misclassifies an operand, a command fact
normalizes incorrectly, a needed structural summary doesn't exist yet. Check
by inspecting the facts for the failing fixture. If a rule needs structural
data that no fact exposes, the fix is to add the fact here — not to walk the
AST in the rule.
Layer 5 — Rule implementation (crates/shuck-linter/src/rules/)
Symptoms: the facts are correct but the rule's filtering predicate has a gap.
It reports a violation where it shouldn't (missing filter) or misses one it
should catch (incomplete matching over correct facts). This is the only layer
where the fix belongs in the rule file itself, and the fix should still be a
filter over existing facts — not new traversal or parsing.
Ask, in order:
facts.rs (Layer 4).If you ever find yourself wanting to add walk_commands, iter_commands,
substring/regex scanning of checker.source(), WordPart/ConditionalExpr
matching, command-name normalization, option parsing, or test-operand
reconstruction inside a rule file — the answer is Layer 4 (add or extend a
fact), not Layer 5. The architecture test in
crates/shuck-linter/src/rules/mod.rs will fail the build if you try.
Once you've identified the layer:
LinterFacts and update
the rule to consume it. Do not bypass the fact and add traversal in the
rule.cargo test -p shuck-parser, cargo test -p shuck-semantic, cargo test -p shuck-linter, etc.cargo test --workspacecargo insta accept --workspaceWhen a delta is a ShellCheck issue (or an intentional policy divergence) that we won't fix, record it in the corpus-metadata so the test passes and future investigators don't re-analyze the same case.
File: crates/shuck/tests/testdata/corpus-metadata/cXXX.yaml
Create the file if it doesn't exist. The format:
reviewed_divergences:
- side: shellcheck-only # or "shuck-only"
path_suffix: "owner__repo__path__to__script.sh" # optional, narrows to one fixture
line: 42 # optional, narrows to one location
end_line: 42 # optional
column: 5 # optional
end_column: 18 # optional
labels: # optional, requires all listed labels to match
- project-closure
reason: "brief explanation citing shell spec or semantic reasoning"shellcheck-only when ShellCheck reports something shuck
intentionally doesn't. shuck-only when shuck reports something ShellCheck
misses and we've decided shuck is right.side and reason (no
location fields) applies to all diagnostics of that type for the rule.
Prefer narrow matches when possible — broad matches can accidentally suppress
real bugs.Narrow (specific fixture + line): Use when the divergence is about a specific script's context (e.g., "this variable is consumed by a sibling script after sourcing").
Broad (side + reason only): Use when the divergence reflects a systematic policy difference (e.g., "shuck intentionally flags dynamic parameter-expansion patterns that ShellCheck ignores").
If the ShellCheck code mapping is wrong for corpus testing purposes (the rule maps to an SC code but the corpus shows a different SC code's behavior), add a note:
comparison_target_notes:
- current_shellcheck_code: "SC2124"
reason: "The corpus surfaces SC2124 array-to-scalar warnings, not the behavior this rule targets."Re-run the corpus test for the rule:
make test-large-corpus SHUCK_LARGE_CORPUS_RULES=CXXXCheck that:
review_all_divergences: true, remove that field and rerun the targeted
corpus test to confirm the rule no longer needs the rule-wide ignore entryIf there are still failures, go back to Step 3 and work through the remaining patterns.
make test
cargo test --workspaceConfirm nothing else broke.
Summarize to the user:
© ewhauser, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/fix-rule of ewhauser/shuck.
Open the folder on GitHubat commit 904974e
Fix Rule next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Fix Rule this skillewhauser/shuck | 137 | — | ~3.2k | Automated safety check: Pass | MIT | |
| Install Anti-Slop Oxlint Rulesdmmulroy/anti-slop | 5.3k | 1 repos | ~2.2k | Automated safety check: Pass | MIT | |
| Summarise Ecosystem Resultsastral-sh/ruff | 50k | 1 repos | ~2.2k | Automated safety check: Pass | MIT | |
| Minimizing Ty Ecosystem Changesastral-sh/ruff | 50k | — | ~4.6k | Automated safety check: Pass | MIT | |
| Babysit PR To Pass CIsgl-project/sglang | 37k | 2 repos | ~3k | Automated safety check: Pass | Apache-2.0 | |
| Rust Best Practicesfarm-fe/farm | 5.6k | 3 repos | ~1.1k | Automated safety check: Pass | MIT |
dmmulroy/anti-slop
Installs, updates or migrates the vendored anti-slop Oxlint plugin in a repository, keeping local rule changes and the plugin's license and provenance files.
astral-sh/ruff
A skill your agent uses when a user says "summarise ecosystem results", "summarize this ty ecosystem report", "what changed in this ecosystem run?", or asks to summarise or summarize ty ecosystem…
astral-sh/ruff
A skill your agent uses when a user says "minimize this ty ecosystem change", "reproduce this ecosystem result", "investigate a primer difference", "investigate a mypyprimer difference"…
sgl-project/sglang
Start and persistently pursue a goal to babysit an SGLang pull request until selected GitHub Actions workflows pass on the latest PR head.
farm-fe/farm
Guide for writing idiomatic Rust code based on Apollo GraphQL's best practices handbook.
chromedp/chromedp
This skill should be used when the user is writing Go code and needs guidance on Go-specific pedantry: error wrapping with fmt.Errorf and %w, interface design (accept interfaces return structs)…
ewhauser/shuck
Profile shuck scripts and large-corpus fixtures, especially requests to profile a corpus script/fixture, reprofile after a shuck performance change, or produce a hotspot table from a samply profile.
ewhauser/shuck
Compare benchmark performance between two git worktrees (or the current worktree vs main).
ewhauser/shuck
Verify ShellCheck conformance for a shuck rule by running the large corpus test, analyzing deltas, and producing a structured bug document in docs/bugs/.
ewhauser/shuck
Implement an autofix for an existing shuck-rs lint rule. An agent skill from ewhauser/shuck.
ewhauser/shuck
Implement a shuck-rs lint rule from its YAML definition in docs/rules/.
ewhauser/shuck
Write and update technical design specifications. An agent skill from ewhauser/shuck.
Categories
Fix a shuck lint rule that has conformance deltas against ShellCheck. Fix Rule is an agent skill from ewhauser/shuck. Fix a shuck lint rule that has conformance deltas against ShellCheck.
Fix Rule fits situations like: the user asks to fix a rule (e.g; fix the deltas for C006; address the corpus failures in C019); debug why a rule is producing wrong results.
Run `npx skills add ewhauser/shuck --skill fix-rule -a claude-code`. Or copy the skill folder (.claude/skills/fix-rule in ewhauser/shuck) into .claude/skills/fix-rule in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ewhauser/shuck --skill fix-rule -a codex`. Or copy the skill folder (.claude/skills/fix-rule in ewhauser/shuck) into .agents/skills/fix-rule in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ewhauser/shuck --skill fix-rule -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/fix-rule, .gemini/skills/fix-rule, .github/skills/fix-rule and .opencode/skills/fix-rule in your project.
Going by SKILL.md and its folder, Fix Rule needs the command-line tools its instructions call (cargo, make, shellcheck, nix and jq).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Fix Rule is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Fix Rule: Install Anti-Slop Oxlint Rules (dmmulroy/anti-slop, 5.3k stars), Summarise Ecosystem Results (astral-sh/ruff, 50k stars), Minimizing Ty Ecosystem Changes (astral-sh/ruff, 50k stars) and Babysit PR To Pass CI (sgl-project/sglang, 37k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ewhauser (a GitHub user) maintains it in ewhauser/shuck, which has 137 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on October 5, 2026.
Source: ewhauser/shuck on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.