Skip to content

shell-scripter

Shell script generation, review, and dialect conversion. Makefile and justfile generation. ShellCheck rules. Use for shell work. NOT for Python (python-conventions) or CI/CD (devops-engineer).

shell-scripter1122 wordsMITRepo-owned
Shell script generation, review, and dialect conversion. Makefile and justfile generation. ShellCheck rules. Use for shell work. NOT for Python (python-conventions) or CI/CD (devops-engineer).

Quick Start

Install:

npx skills add github:wyattowalsh/agents --skill shell-scripter -y -g --agent antigravity --agent claude-code --agent codex --agent crush --agent cursor --agent gemini-cli --agent github-copilot --agent grok --agent opencode

Use: /shell-scripter <mode> [script|description]

Works with Claude Code, Gemini CLI, OpenCode, and other agentskills.io-compatible agents.

Generate, review, convert, and lint shell scripts. Makefile and justfile generation. References ShellCheck rule IDs with explanations but does NOT run ShellCheck.

$ARGUMENTSMode
create &lt;description&gt;Generate a shell script from natural language
review &lt;script or path&gt;Audit for pitfalls, reference ShellCheck rules
convert &lt;script or path&gt; &lt;target&gt;Dialect conversion (bash/zsh/fish)
posix &lt;script or path&gt;POSIX compliance check at pattern level
makefile &lt;tasks&gt;Generate a Makefile from task descriptions
justfile &lt;tasks&gt;Generate a justfile from task descriptions
Natural language about shell scriptingAuto-detect mode from intent
EmptyShow mode menu with examples
  1. Never claim to run ShellCheck — reference SC rule IDs and explain them, but analysis is pattern-based
  2. Always use env-based shebangs (e.g., env bash), never hardcoded interpreter paths
  3. Default to set -euo pipefail in generated bash scripts — omit only with explicit justification
  4. Always quote variable expansions unless splitting is intentionally required (SC2086)
  5. Never generate scripts that use eval unless no alternative exists — explain the risk
  6. Every generated script must include error handling for external commands
  7. Generated Makefiles must include a .PHONY declaration and a help target
  8. Generated justfiles must have a default recipe and documentation comments
  9. Review findings must include the SC rule ID, line number, and a concrete fix
  10. Never modify the script being reviewed — review is read-only
  11. Convert mode must warn about constructs with no direct equivalent in the target dialect
  12. POSIX mode must identify every bash-ism and provide a POSIX alternative

Generate a shell script from a natural language description.

  1. Determine target dialect (default: bash)
  2. Run uv run python skills/shell-scripter/scripts/dialect-converter.py --list-features &lt;dialect&gt; to confirm available features
  3. Write the script with:
    • Proper shebang (env-based like env bash, not hardcoded interpreter paths)
    • set -euo pipefail for bash (equivalent for other dialects)
    • Meaningful variable names, quoted expansions
    • Error handling for external commands
    • Usage function if script accepts arguments
  1. Run uv run python skills/shell-scripter/scripts/script-analyzer.py --stdin &lt;&lt;&lt; "$SCRIPT" on the generated script
  2. Fix any issues found, present final script

Audit a shell script for common pitfalls. Reference ShellCheck rule IDs.

  1. Read the target script
  2. Run uv run python skills/shell-scripter/scripts/script-analyzer.py &lt;path&gt;
  3. Parse the JSON output: {shebang, dialect, issues, posix_compatible, complexity_estimate}
  4. For each issue, load references/shellcheck-rules.md to explain the rule ID
  1. Group findings by severity: error > warning > info > style
  2. Present findings with:
    • ShellCheck rule ID (e.g., SC2086)
    • Line number and code snippet
    • Explanation of WHY it is a problem
    • Concrete fix
  3. If no issues found, state this explicitly

Severity mapping:

SeverityExamples
errorUnquoted variables in conditionals, syntax errors, command injection
warningMissing error handling, unquoted glob expansions, deprecated syntax
infoSuboptimal patterns, unnecessary subshells, redundant commands
styleInconsistent quoting, missing shellcheck directives, naming

Convert shell syntax between bash, zsh, and fish.

  1. Read the source script
  2. Identify source dialect (from shebang or --from flag)
  3. Run uv run python skills/shell-scripter/scripts/dialect-converter.py &lt;path&gt; --from &lt;source&gt; --to &lt;target&gt;
  4. Parse the JSON output: {converted_script, changes, warnings}
  5. Present the converted script with a change summary table
  6. Flag any constructs that have no direct equivalent in the target dialect

Check a script for POSIX compliance at the pattern level.

  1. Read the target script
  2. Run uv run python skills/shell-scripter/scripts/script-analyzer.py &lt;path&gt; --posix
  3. Identify bash-isms: [[ ]], (( )), arrays, local, source, process substitution, {a..z}, $'...'
  4. For each bash-ism, suggest the POSIX equivalent from references/posix-compatibility.md
  5. Report whether the script is POSIX-compatible or list required changes

Generate a Makefile from task descriptions.

  1. Parse task descriptions from $ARGUMENTS
  2. Determine dependencies between tasks
  3. Generate Makefile with:
    • .PHONY declarations for non-file targets
    • .DEFAULT_GOAL
    • help target using self-documenting pattern (## comments)
    • Consistent variable naming (UPPER_SNAKE_CASE)
    • .ONESHELL when multi-line recipes need shared state
  4. Follow conventions from references/makefile-justfile.md

Generate a justfile from task descriptions.

  1. Parse task descriptions from $ARGUMENTS
  2. Generate justfile with:
    • Recipe documentation comments
    • Default recipe (first position or default alias)
    • Parameter declarations with defaults where sensible
    • set shell directive if non-default shell needed
    • set dotenv-load if environment variables are referenced
  3. Follow conventions from references/makefile-justfile.md

Use these terms exactly throughout:

TermDefinition
dialectShell language variant: bash, zsh, fish, sh (POSIX)
bash-ismSyntax or feature not in POSIX sh (e.g., arrays, [[ ]])
shebang#! line specifying the interpreter
SC ruleA ShellCheck rule ID (e.g., SC2086 = unquoted variable)
recipeA justfile target (not “task” or “rule”)
targetA Makefile target (not “task” or “recipe”)
portableWorks across bash/zsh/sh without modification

Load ONE reference at a time. Do not preload all references into context.

FileContentRead When
references/shellcheck-rules.mdTop 50 ShellCheck rules with severity, explanation, examples, fixesReview mode, explaining SC rule IDs
references/posix-compatibility.mdPOSIX builtins, bash-isms with POSIX equivalents, portability patternsPOSIX mode, create mode with --posix
references/dialect-differences.mdSyntax differences between bash/zsh/fish with conversion recipesConvert mode, cross-dialect questions
references/common-pitfalls.mdUnquoted vars, missing error handling, injection, race conditions, trapsReview mode, create mode best practices
references/makefile-justfile.mdMakefile best practices, justfile syntax and patterns, migration guideMakefile mode, justfile mode
ScriptWhen to Run
scripts/script-analyzer.pyReview and POSIX modes — static analysis of shell scripts
scripts/dialect-converter.pyConvert mode — syntax conversion between dialects
FieldValue
Source Typerepo-owned
Display Sourcegithub:wyattowalsh/agents
Source Kindrepo
Installabilityportable command
Review Statereviewed
Target Agentsantigravity, claude-code, codex, crush, cursor, gemini-cli, github-copilot, grok, opencode
View Full SKILL.md
SKILL.md
---
name: shell-scripter
description: >-
Shell script generation, review, and dialect conversion. Makefile and justfile
generation. ShellCheck rules. Use for shell work. NOT for Python
(python-conventions) or CI/CD (devops-engineer).
argument-hint: "<mode> [script|description]"
license: MIT
model: sonnet
metadata:
author: wyattowalsh
version: "1.0.0"
---
# Shell Scripter
Generate, review, convert, and lint shell scripts. Makefile and justfile generation. References ShellCheck rule IDs with explanations but does NOT run ShellCheck.
**Scope:** Shell scripts (bash, zsh, fish, sh/POSIX), Makefiles, justfiles. NOT for Python scripts (use python-conventions), CI/CD pipelines (use devops-engineer), or running/testing scripts.
## Dispatch
| $ARGUMENTS | Mode |
|------------|------|
| `create <description>` | Generate a shell script from natural language |
| `review <script or path>` | Audit for pitfalls, reference ShellCheck rules |
| `convert <script or path> <target>` | Dialect conversion (bash/zsh/fish) |
| `posix <script or path>` | POSIX compliance check at pattern level |
| `makefile <tasks>` | Generate a Makefile from task descriptions |
| `justfile <tasks>` | Generate a justfile from task descriptions |
| Natural language about shell scripting | Auto-detect mode from intent |
| Empty | Show mode menu with examples |
### Auto-Detection Heuristic
1. Path to `.sh`/`.bash`/`.zsh`/`.fish` file + modification verb (review, check, fix, audit, lint) -> **review**
2. Path to `.sh` file + "to zsh/fish/bash" -> **convert**
3. Path to `.sh` file + "posix" or "portable" -> **posix**
4. "makefile" or "make targets" in input -> **makefile**
5. "justfile" or "just recipes" in input -> **justfile**
6. Describes desired script behavior -> **create**
7. Ambiguous -> ask which mode
## Mode: Create
Generate a shell script from a natural language description.
### Generation Process
1. Determine target dialect (default: bash)
2. Run `uv run python skills/shell-scripter/scripts/dialect-converter.py --list-features <dialect>` to confirm available features
3. Write the script with:
- Proper shebang (env-based like `env bash`, not hardcoded interpreter paths)
- `set -euo pipefail` for bash (equivalent for other dialects)
- Meaningful variable names, quoted expansions
- Error handling for external commands
- Usage function if script accepts arguments
### Validation
4. Run `uv run python skills/shell-scripter/scripts/script-analyzer.py --stdin <<< "$SCRIPT"` on the generated script
5. Fix any issues found, present final script
## Mode: Review
Audit a shell script for common pitfalls. Reference ShellCheck rule IDs.
### Analysis
1. Read the target script
2. Run `uv run python skills/shell-scripter/scripts/script-analyzer.py <path>`
3. Parse the JSON output: `{shebang, dialect, issues, posix_compatible, complexity_estimate}`
4. For each issue, load `references/shellcheck-rules.md` to explain the rule ID
### Findings Report
5. Group findings by severity: error > warning > info > style
6. Present findings with:
- ShellCheck rule ID (e.g., SC2086)
- Line number and code snippet
- Explanation of WHY it is a problem
- Concrete fix
7. If no issues found, state this explicitly
**Severity mapping:**
| Severity | Examples |
|----------|----------|
| error | Unquoted variables in conditionals, syntax errors, command injection |
| warning | Missing error handling, unquoted glob expansions, deprecated syntax |
| info | Suboptimal patterns, unnecessary subshells, redundant commands |
| style | Inconsistent quoting, missing shellcheck directives, naming |
## Mode: Convert
Convert shell syntax between bash, zsh, and fish.
1. Read the source script
2. Identify source dialect (from shebang or `--from` flag)
3. Run `uv run python skills/shell-scripter/scripts/dialect-converter.py <path> --from <source> --to <target>`
4. Parse the JSON output: `{converted_script, changes, warnings}`
5. Present the converted script with a change summary table
6. Flag any constructs that have no direct equivalent in the target dialect
## Mode: POSIX
Check a script for POSIX compliance at the pattern level.
1. Read the target script
2. Run `uv run python skills/shell-scripter/scripts/script-analyzer.py <path> --posix`
3. Identify bash-isms: `[[ ]]`, `(( ))`, arrays, `local`, `source`, process substitution, `{a..z}`, `$'...'`
4. For each bash-ism, suggest the POSIX equivalent from `references/posix-compatibility.md`
5. Report whether the script is POSIX-compatible or list required changes
## Mode: Makefile
Generate a Makefile from task descriptions.
1. Parse task descriptions from `$ARGUMENTS`
2. Determine dependencies between tasks
3. Generate Makefile with:
- `.PHONY` declarations for non-file targets
- `.DEFAULT_GOAL`
- `help` target using self-documenting pattern (`## comments`)
- Consistent variable naming (`UPPER_SNAKE_CASE`)
- `.ONESHELL` when multi-line recipes need shared state
4. Follow conventions from `references/makefile-justfile.md`
## Mode: Justfile
Generate a justfile from task descriptions.
1. Parse task descriptions from `$ARGUMENTS`
2. Generate justfile with:
- Recipe documentation comments
- Default recipe (first position or `default` alias)
- Parameter declarations with defaults where sensible
- `set shell` directive if non-default shell needed
- `set dotenv-load` if environment variables are referenced
3. Follow conventions from `references/makefile-justfile.md`
## Canonical Vocabulary
Use these terms exactly throughout:
| Term | Definition |
|------|-----------|
| **dialect** | Shell language variant: bash, zsh, fish, sh (POSIX) |
| **bash-ism** | Syntax or feature not in POSIX sh (e.g., arrays, `[[ ]]`) |
| **shebang** | `#!` line specifying the interpreter |
| **SC rule** | A ShellCheck rule ID (e.g., SC2086 = unquoted variable) |
| **recipe** | A justfile target (not "task" or "rule") |
| **target** | A Makefile target (not "task" or "recipe") |
| **portable** | Works across bash/zsh/sh without modification |
## Reference Files
Load ONE reference at a time. Do not preload all references into context.
| File | Content | Read When |
|------|---------|-----------|
| `references/shellcheck-rules.md` | Top 50 ShellCheck rules with severity, explanation, examples, fixes | Review mode, explaining SC rule IDs |
| `references/posix-compatibility.md` | POSIX builtins, bash-isms with POSIX equivalents, portability patterns | POSIX mode, create mode with `--posix` |
| `references/dialect-differences.md` | Syntax differences between bash/zsh/fish with conversion recipes | Convert mode, cross-dialect questions |
| `references/common-pitfalls.md` | Unquoted vars, missing error handling, injection, race conditions, traps | Review mode, create mode best practices |
| `references/makefile-justfile.md` | Makefile best practices, justfile syntax and patterns, migration guide | Makefile mode, justfile mode |
| Script | When to Run |
|--------|-------------|
| `scripts/script-analyzer.py` | Review and POSIX modes -- static analysis of shell scripts |
| `scripts/dialect-converter.py` | Convert mode -- syntax conversion between dialects |
## Critical Rules
1. Never claim to run ShellCheck -- reference SC rule IDs and explain them, but analysis is pattern-based
2. Always use env-based shebangs (e.g., `env bash`), never hardcoded interpreter paths
3. Default to `set -euo pipefail` in generated bash scripts -- omit only with explicit justification
4. Always quote variable expansions unless splitting is intentionally required (SC2086)
5. Never generate scripts that use `eval` unless no alternative exists -- explain the risk
6. Every generated script must include error handling for external commands
7. Generated Makefiles must include a `.PHONY` declaration and a `help` target
8. Generated justfiles must have a default recipe and documentation comments
9. Review findings must include the SC rule ID, line number, and a concrete fix
10. Never modify the script being reviewed -- review is read-only
11. Convert mode must warn about constructs with no direct equivalent in the target dialect
12. POSIX mode must identify every bash-ism and provide a POSIX alternative

Download from GitHub


View source on GitHub