Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Audits shell scripts for correctness, portability, and common pitfalls. Use when reviewing shell scripts or before committing shell changes.
.claude/skills/athola-shell-review/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 2% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 18% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 32% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-13 | ✗→✓ | ▲ Improved | -27% | 0% |
Audit shell scripts for correctness, safety, and portability.
After review, run shellcheck <script> to verify fixes address identified issues.
Run pytest plugins/pensive/tests/skills/test_shell_review.py -v to validate review patterns.
bash/shell-review path/to/script.sh
shell-review:context-mappedshell-review:exit-codes-checkedshell-review:portability-checkedshell-review:safety-patterns-verifiedshell-review:structure-checkedshell-review:evidence-loggedshell-review:findings-verifiedshell-review:context-mapped)Identify shell scripts:
bash# Find shell scripts find . -not -path "*/.venv/*" -not -path "*/__pycache__/*" \ -not -path "*/node_modules/*" -not -path "*/.git/*" \ -name "*.sh" -type f | head -20 # Check shebangs rg -l "^#!/" scripts/ hooks/ 2>/dev/null | head -10 # fallback: grep -l "^#!/" scripts/ hooks/ 2>/dev/null | head -10
Document:
shell-review:exit-codes-checked)@include modules/exit-codes.md
shell-review:portability-checked)@include modules/portability.md
shell-review:safety-patterns-verified)@include modules/safety-patterns.md
shell-review:structure-checked)@include modules/structure-patterns.md
shell-review:evidence-logged)Use imbue:proof-of-work to record findings with file:line references.
Summarize:
markdown## Summary Shell script review findings ## Scripts Reviewed - [list with line counts] ## Exit Code Issues ### [E1] Pipeline masks failure - Location: script.sh:42 - Anchor: `verbatim source text at file:line` - Pattern: `cmd | grep` loses exit code - Fix: Use pipefail or capture separately ## Portability Issues [cross-platform concerns] ## Safety Issues [unquoted variables, missing set flags] ## Recommendation Approve / Approve with actions / Block
shell-review:findings-verified)Every finding must cite a real location and a verbatim anchor. Write findings to .review/findings.json and confirm each citation resolves:
bashpython plugins/imbue/scripts/citation_verifier.py \ --findings .review/findings.json --repo-root .
Drop or label UNVERIFIED any finding the verifier fails (exit 1); only verified findings enter the report. See Skill(imbue:review-core) Step 5 and Skill(imbue:structured-output) for the schema.
capture-and-check)
#!/bin/sh scripts flagged):? expansion, cd insubshells, no basename/dirname)
preamble, depcheck, shfmt formatting)
imbue:proof-of-workLocation + verbatim Anchorconfirmed by citation_verifier.py (exit 0), or unverified findings were dropped or labeled UNVERIFIED
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-16 | pass→pass | 10,835 | 7,974 | -26% | 1 | 1 | 0% | 1,921 | 2,456 | +28% | 0 | 0 | — |
case-17 | pass→pass | 14,568 | 9,998 | -31% | 1 | 1 | 0% | 2,533 | 2,940 | +16% | 0 | 0 | — |
case-01 | fail→fail | 11,139 | 17,219 | +55% | 1 | 1 | 0% | 398 | 1,503 | +278% | 0 | 0 | — |
case-02 | fail→fail | 19,022 | 5,595 | -71% | 1 | 1 | 0% | 3,385 | 1,483 | -56% | 0 | 0 | — |
case-03 | fail→fail | 24,469 | 5,185 | -79% | 1 | 1 | 0% | 4,122 | 1,454 | -65% | 0 | 0 | — |
case-04 | pass→pass | 17,603 | 14,348 | -18% | 1 | 1 | 0% | 1,927 | 3,689 | +91% | 0 | 0 | — |
case-05 | fail→fail | 5,203 | 14,009 | +169% | 1 | 1 | 0% | 855 | 3,459 | +305% | 0 | 0 | — |
case-18 | pass→pass | 5,537 | 1,775 | -68% | 1 | 1 | 0% | 829 | 1,372 | +66% | 0 | 0 | — |
case-06 | pass→pass | 5,708 | 4,622 | -19% | 1 | 1 | 0% | 988 | 1,937 | +96% | 0 | 0 | — |
case-07 | pass→pass | 4,666 | 3,910 | -16% | 1 | 1 | 0% | 831 | 1,586 | +91% | 0 | 0 | — |
case-08 | fail→pass | 8,200 | 4,767 | -42% | 1 | 1 | 0% | 1,435 | 1,458 | +2% | 0 | 0 | — |
case-09 | fail→pass | 13,196 | 8,873 | -33% | 1 | 1 | 0% | 2,293 | 2,717 | +18% | 0 | 0 | — |
case-10 | fail→pass | 7,704 | 2,958 | -62% | 1 | 1 | 0% | 1,224 | 1,620 | +32% | 0 | 0 | — |
case-11 | pass→pass | 8,885 | 4,544 | -49% | 1 | 1 | 0% | 1,737 | 1,937 | +12% | 0 | 0 | — |
case-12 | fail→pass | 7,543 | 7,495 | -1% | 1 | 1 | 0% | 1,174 | 1,458 | +24% | 0 | 0 | — |
case-13 | fail→pass | 12,332 | 4,979 | -60% | 1 | 1 | 0% | 2,004 | 1,458 | -27% | 0 | 0 | — |
case-14 | fail→pass | 8,138 | 1,933 | -76% | 1 | 1 | 0% | 1,367 | 1,444 | +6% | 0 | 0 | — |
case-15 | fail→pass | 5,159 | 1,921 | -63% | 1 | 1 | 0% | 825 | 1,389 | +68% | 0 | 0 | — |
case-19 | pass→pass | 6,407 | 2,036 | -68% | 1 | 1 | 0% | 1,056 | 1,399 | +32% | 0 | 0 | — |
case-20 | fail→pass | 13,205 | 4,364 | -67% | 1 | 1 | 0% | 2,177 | 1,892 | -13% | 0 | 0 | — |
case-21 | fail→pass | 14,245 | 7,977 | -44% | 1 | 1 | 0% | 2,387 | 2,455 | +3% | 0 | 0 | — |
case-22 | fail→pass | 6,909 | 1,734 | -75% | 1 | 1 | 0% | 1,196 | 1,344 | +12% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +45 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.