agentleFS
CodeWithJVCodeWithJV/agent-skills/extract-scripts/SKILL.md

extract-scripts

Skill2 starsChanged 5 months agoMITView on GitHub

Review a skill and extract deterministic, mechanical steps into shell scripts. Makes skills more reliable by separating precision work (scripts) from judgment work (AI). Use when asked to extract scripts from a skill, make a skill more deterministic, or split a skill into script + prompt.

The file

Show its rules and text

We split this skill into the rules it gives an agent

16 rules. About 0 are common, 9 are distinctive, and 7 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈9

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 7

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Read the target skill file.

    line 23
  2. Distinctive:

    Create a shell script that handles all the S-classified steps.

    line 54
  3. Very specific:

    Use $SCRIPT_DIR as the base for any relative paths (e.g., "$SCRIPT_DIR/../data").

    line 63
  4. Very specific:

    Use command -v to check for required tools: before running them:

    line 65
  5. Very specific:

    Use mktemp for temporary files: instead of hardcoded /tmp/my-thing.txt:

    line 74
  6. Distinctive:

    Add a comment at the top explaining what the script does

    line 79
  7. Very specific:

    Add set -euo pipefail: after the shebang. This makes the script fail fast on errors (-e), undefined variables (-u), and broken pipes (-o …

    line 85
  8. Distinctive:

    Validate that input files/dirs actually exist: before doing work:

    line 100
  9. Very specific:

    Place the script next to the skill file, or in a scripts/ directory if there are multiple.

    line 108
  10. Very specific:

    Call the script first (Run ./script-name.sh)

    line 113
  11. Distinctive:

    Read the script's output

    line 114
  12. Distinctive:

    Do only the judgment work with that output

    line 115
  13. Distinctive:

    If the workflow benefits from it, show how the script could call AI CLIs directly:

    line 121
  14. Distinctive:

    Don't force it. If a skill is mostly judgment calls with one or two simple commands, it probably doesn't need a script.

    line 143
  15. Distinctive:

    Keep scripts focused. One script per logical phase.

    line 145
  16. Very specific:

    Always use "$VARIABLE" with quotes to handle spaces in paths.

    line 147

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Extract Scripts from Skills

Review a skill file and extract the mechanical, deterministic steps into standalone shell scripts. The skill keeps only the judgment calls — summarising, interpreting, choosing, writing.

When to Use

Activate when the user:

  • Asks to extract scripts from a skill
  • Wants to make a skill more reliable or deterministic
  • Says a skill is inconsistent or keeps getting CLI commands wrong
  • Asks to split a skill into script + prompt
  • Wants to audit a skill for script extraction candidates

Process

Step 1: Read the skill

Read the target skill file. If the user doesn't specify one, ask which skill to review.

Step 2: Classify each step

Go through every instruction in the skill and classify it:

  • Script (S) — has one right answer, runs the same every time. Examples:
    • CLI commands with specific flags (git log --since="1 week ago" --oneline)
    • File creation with fixed paths or formats (echo "# Title" > report.md)
    • Data collection (npm test 2>&1 | tail -20)
    • Directory setup, file copying, environment checks
    • Any step where you could write it once and it works forever
  • AI (A) — needs thinking, interpretation, or creativity. Examples:
    • Summarising collected data
    • Choosing between options
    • Writing prose, recommendations, analysis
    • Interpreting results or making judgment calls
    • Anything where the "right answer" depends on context

Present the classification to the user as a table:

| Step | Classification | Reason |
|------|---------------|--------|
| Run git log... | S (Script) | Exact command, one right answer |
| Summarise themes | A (AI) | Needs interpretation |

Step 3: Write the script

Create a shell script that handles all the S-classified steps.

All scripts MUST be location-independent. They should work if someone pulls them to a different folder or a different computer. Follow these rules:

  • Start with #!/bin/bash
  • Resolve the script's own directory first:
    SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
    Use $SCRIPT_DIR as the base for any relative paths (e.g., "$SCRIPT_DIR/../data").
  • Never hardcode absolute paths. No /Users/jv/..., no ~/specific-project/.... Use $SCRIPT_DIR, $PWD, or accept paths as arguments.
  • Use command -v to check for required tools before running them:
    command -v jq >/dev/null 2>&1 || { echo "Error: jq is required but not installed"; exit 1; }
  • Accept inputs as arguments or environment variables, not baked-in values:
    INPUT_FILE="${1:?Usage: $0 <input-file>}"
    OUTPUT_DIR="${2:-$SCRIPT_DIR/output}"
  • Use mktemp for temporary files instead of hardcoded /tmp/my-thing.txt:
    TMPFILE=$(mktemp)
    trap 'rm -f "$TMPFILE"' EXIT
  • Add a comment at the top explaining what the script does
  • End with a confirmation message (echo "Done: output written to $OUTFILE")
  • Make it executable: remind the user to run chmod +x script.sh

Use parameters to make scripts resilient:

  • Add set -euo pipefail after the shebang. This makes the script fail fast on errors (-e), undefined variables (-u), and broken pipes (-o pipefail) instead of silently continuing with wrong data.
  • Provide sensible defaults for optional parameters using ${VAR:-default}:
    SINCE="${1:-7}"  # days to look back, defaults to 7
    FORMAT="${2:-oneline}"  # output format, defaults to oneline
  • Validate required parameters early and print usage if missing:
    if [ $# -lt 1 ]; then
      echo "Usage: $0 <input-file> [output-dir]"
      echo "  input-file: path to the skill file to process"
      echo "  output-dir: where to write results (default: ./output)"
      exit 1
    fi
  • Validate that input files/dirs actually exist before doing work:
    [ -f "$INPUT_FILE" ] || { echo "Error: $INPUT_FILE not found"; exit 1; }
    [ -d "$OUTPUT_DIR" ] || mkdir -p "$OUTPUT_DIR"
  • Use named variables instead of positional $1, $2 in the body. Assign arguments to descriptive names at the top, then use those names throughout. $INPUT_FILE is readable, $1 buried on line 40 is not.
  • Make the script idempotent where possible. Running it twice should produce the same result, not duplicate data or fail because output already exists. Use mkdir -p instead of mkdir, overwrite output files instead of appending blindly.

Place the script next to the skill file, or in a scripts/ directory if there are multiple.

Step 4: Rewrite the skill

Rewrite the skill to:

  1. Call the script first (Run ./script-name.sh)
  2. Read the script's output
  3. Do only the judgment work with that output

The rewritten skill should be noticeably shorter. If it isn't, the original probably didn't have many mechanical steps and might not need this treatment — say so.

Step 5: Optionally add AI calls to the script

If the workflow benefits from it, show how the script could call AI CLIs directly:

# Collect data deterministically, then ask AI to analyse
TMPFILE=$(mktemp)
trap 'rm -f "$TMPFILE"' EXIT
git log --since="1 week ago" --oneline > "$TMPFILE"
codex exec "Summarise the themes: $(cat "$TMPFILE")"

This makes the entire workflow runnable as a single script — deterministic orchestration with AI judgment on demand.

Output Format

Produce three artifacts:

  1. Classification table — every step labeled S or A with reasoning
  2. Shell script — handles all S steps
  3. Rewritten skill — calls the script, then does only A steps

Tips

  • Don't force it. If a skill is mostly judgment calls with one or two simple commands, it probably doesn't need a script. Say so.
  • Scripts should be independently testable. The user should be able to run the script alone to verify the data collection works before involving the AI.
  • Keep scripts focused. One script per logical phase. Don't create a mega-script that's as hard to debug as the original skill.
  • Variable names should be descriptive. $OUTFILE and $TODAY are better than $F and $D.
  • Always use "$VARIABLE" with quotes to handle spaces in paths.
  • Portability is non-negotiable. Every script must work when moved to a different directory or cloned to a different machine. No hardcoded paths, no assumptions about home directory layout, no machine-specific values baked in. If the script needs something specific to the environment, it takes it as an argument or reads it from an env var.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.