create-skill
Skill94 starsChanged 3 months agoApache-2.0View on GitHub
Scaffold, write, and validate a new Claude Code skill — enforces quality standards derived from 250+ review comments
- Deletes or force-pushes
142 other projects use a version of this.
Adopted by
Most recently taken up by
- lancy69/skillstheir own version, first seen Nov 8, 2026
- CherryHQ/cherry-studiotheir own version, first seen Nov 8, 2026
- niilohlin/skillstheir own version, first seen Nov 8, 2026
- sankalpaacharya/skillstheir own version, first seen Nov 8, 2026
- zalogarcia/zalo-claude-code-setuptheir own version, first seen Nov 8, 2026
- serbyte-development/shellby-mcptheir own version, first seen Nov 8, 2026
Used with
Projects with it also use review-bugbot, migrate-to-skills and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
0mlkrizzz655335vSkillreview-bugbot
缺陷导向代码审查。用 Bugbot 子代理找 bug。
Also in 5 projects that use this
32103210Skillmigrate-to-skills
Convert 'Applied intelligently' Cursor rules (.cursor/rules/*.mdc) and slash commands (.cursor/commands/*.md) to Agent Skills format (.cursor/skills/). Use when you want to migrate rules or commands to skills, convert .mdc rules to SKILL.md format, or consolidate commands into the skills directory.
Also in 8 projects that use this
32103210Skillupdate-cursor-settings
Modify Cursor/VSCode user settings in settings.json. Use when you want to change editor settings, preferences, configuration, themes, font size, tab size, format on save, auto save, keybindings, or any settings.json values.
Also in 8 projects that use this
PandelisZSkillupdate-cli-config
View and modify Cursor CLI configuration settings in ~/.cursor/cli-config.json. Use when the user wants to change CLI settings, configure permissions, switch approval mode, enable vim mode, toggle display options, configure sandbox, or manage any CLI preferences.
Also in 7 projects that use this
yawningwhaleAISkillbuild-premium-website
Build a premium, animated marketing website (React + Vite + Tailwind + GSAP) for any industry. Use when the user asks to "build a website", "make a landing page for [business]", "build a marketing site", or wants a high-end animated company website. Adapts color, copy, services, and signature animation to the industry.
Also in 6 projects that use this
yawningwhaleAISkillinstantly-campaign
Create a new Instantly cold-email campaign in the proven 5-email structure of the user's top-performing campaign (~16% reply rate). Use when the user wants to launch a new outbound campaign, write a cold email sequence, create an Instantly campaign, draft outreach for a new service or niche, or set up a sales sequence.
Also in 5 projects that use this
- +1 more from 32103210
Other versions142 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 142
- microsoft/vscode★ 195ksame name
- CherryHQ/cherry-studio★ 53ksame name
- videojs/video.js★ 40ksame name
- BuilderIO/agent-native★ 7.6ksame name
- stagewise-io/stagewise★ 6.8ksame name
- dotnet/skills★ 5.9ksame name
- xstongxue/best-skills★ 2.9ksame name
- Lilac-Labs/gini-agent★ 1.9ksame name
- Open-Curiosity/gini-agent★ 1.9ksame name
- mattmireles/gemma-tuner-multimodal★ 1.5ksame name
132 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository22 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- architectSkill
- bench-checkSkill
- deps-auditSkill
- dogfoodSkill
- fixerSkill
- housekeepSkill
- overseeSkill
- paritySkill
- releaseSkill
- resolveSkill
- sweepSkill
- test-healthSkill
- titan-closeSkill
- titan-forgeSkill
- titan-gateSkill
- titan-gauntletSkill
- titan-grindSkill
- titan-reconSkill
- titan-resetSkill
- titan-runSkill
- titan-syncSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
49 rules. 0 are common, 24 are distinctive, and 25 are very specific to this project.
0
Common
Most of the 132 edited versions we read keep these.
24
Distinctive
This author's own choices. Worth a look.
25
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 10
Create a new Claude Code skill with correct structure, robust bash, and built-in quality gates.
- Very specific: line 15
If $ARGUMENTS is empty, ask the user for a skill name before proceeding
- Distinctive: line 23
Pre-flight: Verify required tools and environment:
- Distinctive: line 36
Discovery: Before writing anything, gather requirements interactively.
- Distinctive: line 46
Wait for the user's answers before proceeding: Do not guess or assume.
- Distinctive: line 54
Idempotency guard: Before writing, check for an existing skill:
- Very specific: line 64
Create the skill directory and SKILL.md with frontmatter:
- Very specific: line 70
Write the SKILL.md file starting with this structure:
- Distinctive: line 136
Write each phase following these 17 mandatory patterns (derived from Greptile review findings across 250+ comments):
- Very specific: line 170
Never use 2>/dev/null without documenting the skip path.
- Very specific: line 215
Use mktemp for temp files, never hardcoded paths like /tmp/skill-output.json.
- Distinctive: line 219
When referencing other steps, use phase names, not numbers.
- Very specific: line 226
Every variable or placeholder in pseudocode must have a preceding assignment.
- Distinctive: line 247
Every codegraph command or tool invocation in the procedure must be permitted by the Rules section.
- Very specific: line 251
If a phase runs a codegraph command and stores the result, later phases must reference that result — not re-run the command.
- Very specific: line 255
If the skill supports --start-from or --skip-*:
- Distinctive: line 257
Add a pre-validation table listing which artifacts are required for each entry point
- Distinctive: line 269
Never leave the user staring at a silent terminal during long operations.
- Very specific: line 273
Before running expensive operations (codegraph build, embedding generation, batch analysis), check if usable output already exists (replace …
- Distinctive: line 289
Avoid shell constructs that behave differently across platforms:
- Very specific: line 290
Use find ... -name "*.ext" | grep -q .
- Very specific: line 292
Use sed -i.bak instead of sed -i '' (GNU vs BSD incompatibility)
- Very specific: line 293
Document any platform-specific behavior with a comment: # NOTE: requires GNU coreutils
- Very specific: line 323
Never rely on $? or stash@{0} after git stash push — modern git (2.16+) returns 0 even when nothing was stashed, and other operations may …
- Very specific: line 334
Correct: Use a named stash with STASH_REF lookup — keep push and pop in one block or persist the ref to a file if other work must happen in …
- Distinctive: line 347
If the pop must happen in a later code fence, persist the ref to a file (per Pattern 1):
- Distinctive: line 364
Every arithmetic division or percentage computation must guard against zero denominators.
- Very specific: line 387
If the skill supports --dry-run, every destructive operation must check the flag at the point of action — not just at phase entry.
- Very specific: line 414
Exit condition: Every phase body in the SKILL.md follows all 17 patterns.
- Distinctive: line 420
If the skill performs dangerous operations (from Phase 0 discovery), add explicit guards:
- Very specific: line 429
Use rm -i or prompt for confirmation in non---force mode
- Distinctive: line 436
Run tests after changes: detect test runner per Phase: Write the Skill Body, Pattern 6
- Distinctive: line 437
Run lint after changes: detect lint runner:
- Very specific: line 446
Exit condition: Every dangerous operation identified in Phase: Discovery has a corresponding guard in the SKILL.md.
- Very specific: line 452
Before finalizing, audit the SKILL.md against every item below.
- Very specific: line 500
Read through the entire SKILL.md one more time after checking all items.
- Very specific: line 502
Exit condition: All checklist items pass. The SKILL.md has no unresolved structure, anti-pattern, robustness, completeness, or safety …
- Very specific: line 512
Run both validation scripts against the generated SKILL.md:
- Distinctive: line 531
Run the skill's Phase 0 (pre-flight) logic in a temporary test directory to verify:
- Distinctive: line 565
Do file-creation steps fail if the file already exists?
- Distinctive: line 568
Document any idempotency fix applied.
- Very specific: line 570
Exit condition: All bash blocks pass bash -n syntax check.
- Very specific: line 576
Read the final SKILL.md end-to-end and confirm it passes all Phase: Self-Review Checklist checks and Phase: Smoke Test validations
- Distinctive: line 578
Ask: "Ready to commit, or want changes?"
- Distinctive: line 580
If the user approves:
- Distinctive: line 600
Phase names over step numbers: All cross-references in the generated skill must use phase names.
- Distinctive: line 601
One skill = one concern: If the user's requirements span multiple unrelated workflows, suggest splitting into separate skills.
- Distinctive: line 604
Persist temp state to files, not shell variables: when it must survive across code fences.
- Very specific: line 605
Test commands must be detected, not assumed: Never hardcode npm test, npm run test, npm run lint, yarn test, yarn run test, yarn run lint, …
“Common” is measured: kept by at least 6 in 10 of the 132 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
/create-skill — Skill Factory
Create a new Claude Code skill with correct structure, robust bash, and built-in quality gates. This skill encodes lessons from 250+ Greptile review comments to prevent the most common skill authoring mistakes.
Arguments
$ARGUMENTSmust contain the skill name in kebab-case (e.g.deploy-check)- If
$ARGUMENTSis empty, ask the user for a skill name before proceeding
Set SKILL_NAME to the provided name. Validate it is kebab-case (^[a-z][a-z0-9]*(-[a-z0-9]+)*$). Reject otherwise.
Phase 0 — Discovery & Pre-flight
Pre-flight: Verify required tools and environment:
for tool in git mktemp; do
# > /dev/null 2>&1: suppress command path on success and shell's "not found" on failure — the || clause provides the error message
command -v "$tool" > /dev/null 2>&1 || { echo "ERROR: required tool '$tool' not found"; exit 1; }
done
# > /dev/null 2>&1: suppress git's own "fatal: not a git repository" — our || message is more actionable
git rev-parse --show-toplevel > /dev/null 2>&1 || { echo "ERROR: not in a git repository — run /create-skill from the repo root"; exit 1; }Parse $ARGUMENTS per the Arguments section above. If validation fails, abort with a clear error.
Discovery: Before writing anything, gather requirements interactively. Ask the user these questions (all at once, not one-by-one):
- Purpose — What does this skill do? (one paragraph)
- Arguments — What CLI arguments should it accept? (e.g.
--fix,--dry-run,<path>) - Phases — What are the major steps? (bullet list of 3-8 phases)
- Tools needed — Which tools does it need? (Bash, Read, Write, Edit, Glob, Grep, Agent)
- Artifacts — Does it produce output files? If so, where and what format?
- Dangerous operations — Does it modify code, push to git, call external APIs, or delete files?
- Resume/skip support — Should it support
--start-fromor--skip-*flags for long-running pipelines?
Wait for the user's answers before proceeding. Do not guess or assume.
Exit condition: Pre-flight passed (git repo confirmed, skill name validated). All 7 questions have answers. Purpose, arguments, phases, tools, artifacts, dangerous ops, and resume support are defined.
Phase 1 — Scaffold
Idempotency guard: Before writing, check for an existing skill:
if [ -f ".claude/skills/$SKILL_NAME/SKILL.md" ]; then
echo "WARN: .claude/skills/$SKILL_NAME/SKILL.md already exists."
echo "Proceeding will overwrite it. Confirm (y) or abort (n)."
# STOP — ask the user whether to overwrite before continuing. Exit 1 if they decline.
fiCreate the skill directory and SKILL.md with frontmatter:
mkdir -p ".claude/skills/$SKILL_NAME"Write the SKILL.md file starting with this structure:
---
name: $SKILL_NAME
description: <one-line from user's purpose>
argument-hint: "<from user's argument design>"
allowed-tools: <from user's tool list>
---
# /$SKILL_NAME — <Title>
<Purpose paragraph from Phase 0>
## Arguments
- `$ARGUMENTS` parsing rules here
- Set state variables: `DRY_RUN`, `AUTO_FIX`, etc.
## Phase 0 — Pre-flight
```bash
for tool in git mktemp; do # replace with the actual shell commands your skill uses (e.g. jq, python, curl)
# > /dev/null 2>&1: suppress command path on success and shell's "not found" on failure — the || clause provides the error message
command -v "$tool" > /dev/null 2>&1 || { echo "ERROR: required tool '$tool' not found"; exit 1; }
done
# > /dev/null 2>&1: suppress git's own "fatal: not a git repository" — our || message is more actionable
git rev-parse --show-toplevel > /dev/null 2>&1 || { echo "ERROR: not in a git repository"; exit 1; }
```
1. Confirm environment (repo root, required runtime/toolchain version, required tools)
2. Parse `$ARGUMENTS` into state variables
3. Validate preconditions
**Exit condition:** <What must be true before Phase 1 starts, e.g. "git repo confirmed, arguments validated, all required tools present">
## Phase N — <Name>
<Steps>
**Exit condition:** <What must be true before the next phase starts>
## Examples
- <Usage examples showing common invocations and expected behavior>
## Rules
- <Hard constraints>Structural requirements to include in every skill:
- Phase 0 always exists — pre-flight checks, argument parsing, environment validation
- Every phase has a clear exit condition — what must be true before moving to the next phase
- Arguments section — explicit parsing of
$ARGUMENTSinto named state variables - Rules section — hard constraints at the bottom, kept in sync with the procedure
- Examples section — usage examples showing common invocations and expected behavior
- Artifact definitions — if the skill produces files, specify path, format, and schema
Exit condition: .claude/skills/$SKILL_NAME/SKILL.md exists with valid frontmatter, Phase 0, Arguments section, and Rules section.
Phase 2 — Write the Skill Body
Write each phase following these 17 mandatory patterns (derived from Greptile review findings across 250+ comments):
Pattern 1: No shell variables across code fences
Each fenced code block is a separate shell invocation. Variables set in one block do not exist in the next.
Wrong:
```bash
WORK_DIR=$(mktemp -d)
```
Later:
```bash
rm -rf $WORK_DIR # BUG: $WORK_DIR is empty here
```Correct: Persist state to a file (use your actual skill name, not a variable). First ensure the directory exists:
```bash
mkdir -p .codegraph/deploy-check
mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX" > .codegraph/deploy-check/.tmpdir
```
Later:
```bash
rm -rf "$(cat .codegraph/deploy-check/.tmpdir)"
```Or keep everything in a single code block if the operations are sequential.
Pattern 2: No silent failures
Never use 2>/dev/null without documenting the skip path. Every command that can fail must either:
- Have explicit error handling (
|| { echo "ERROR: ..."; exit 1; }) - Be documented as intentionally tolerant ("this may fail on X, which is acceptable because Y")
Wrong:
```bash
git show HEAD:$FILE 2>/dev/null | codegraph where --file -
```Correct:
```bash
# mktemp -d with a trailing-X template, then a named file with the right
# extension inside it — a suffix directly after the X run (mktemp
# "tmp.XXXXXXXXXX.js") returns the template literally on macOS BSD mktemp
# instead of randomizing it (issue #2157); only a trailing X run is portable.
PREV_DIR=$(mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX")
PREV_FILE="$PREV_DIR/prev.js" # adjust extension to match the language of $FILE
trap 'rm -rf "$PREV_DIR"' EXIT
# $FILE is expected to be set by the surrounding loop, e.g. for FILE in $(git diff --name-only HEAD); do ... done
# 2>/dev/null: suppress git's "fatal: Path X does not exist in HEAD" — the else branch already warns the user
if git show HEAD:"$FILE" > "$PREV_FILE" 2>/dev/null; then
codegraph where --file "$PREV_FILE"
else
echo "WARN: $FILE is new or unreadable in HEAD — skipping before/after comparison"
fi
rm -rf "$PREV_DIR"
trap - EXIT
```Pattern 3: Temp files need extensions
Codegraph's language detection is extension-based. Temp files passed to codegraph must have the correct extension — but mktemp's own template can only end in a trailing X run (a suffix directly after the X's, like tmp.XXXXXXXXXX.js, returns the template literally instead of randomizing it on macOS BSD mktemp — issue #2157). Create a temp directory instead and place the named, extensioned file inside it:
TMP_DIR=$(mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX") # NOT just mktemp — template syntax is cross-platform (macOS + Linux)
trap 'rm -rf "$TMP_DIR"' EXIT
TMP_FILE="$TMP_DIR/probe.js" # extension lives on the file name, not the mktemp templatePattern 4: No hardcoded temp paths
Use mktemp for temp files, never hardcoded paths like /tmp/skill-output.json. Concurrent sessions or re-runs will collide.
Pattern 5: Stable cross-references
When referencing other steps, use phase names, not numbers. Numbers break when steps are inserted.
Wrong: "Use the results from Step 2" Correct: "Use the diff-impact results from Phase: Impact Analysis"
Pattern 6: No undefined placeholders
Every variable or placeholder in pseudocode must have a preceding assignment. If a value requires detection, write the explicit detection script — do not use <detected-value> placeholders.
Wrong: "Run <detected-test-command>"
Correct:
Detect the test runner and run in a single block:
```bash
if [ -f "pnpm-lock.yaml" ]; then TEST_CMD="pnpm test"
elif [ -f "yarn.lock" ]; then TEST_CMD="yarn test"
elif [ -f "package.json" ]; then TEST_CMD="npm test"
else echo "WARN: No recognised test runner found — skipping tests"; TEST_CMD="true"; fi
$TEST_CMD
```Pattern 7: No internal contradictions
Each decision (pass/fail, rollback/continue, skip/run) must be defined in exactly one place. If two sections describe the same decision path, consolidate them and reference the single source.
Pattern 8: Rules ↔ Procedure sync
Every codegraph command or tool invocation in the procedure must be permitted by the Rules section. Every exception in the Rules must correspond to an actual procedure step. After writing, cross-check both directions.
Pattern 9: No command redundancy
If a phase runs a codegraph command and stores the result, later phases must reference that result — not re-run the command. Add a note like: "Using impact_report from Phase: Impact Analysis".
Pattern 10: Skip/resume flag validation
If the skill supports --start-from or --skip-*:
- Skipping a phase must NOT skip its artifact validation
- Add a pre-validation table listing which artifacts are required for each entry point
- Each skip path must be explicitly tested in Phase: Self-Review
Pattern 11: Progress indicators
For any phase that takes longer than ~10 seconds (file iteration, API calls, batch operations), emit progress:
# $i, $total, and $FILE are loop variables, e.g. i=0; total=$(wc -l < filelist); while read FILE; do i=$((i+1)); ...
echo "Processing file $i/$total: $FILE"Never leave the user staring at a silent terminal during long operations.
Pattern 12: Artifact reuse
Before running expensive operations (codegraph build, embedding generation, batch analysis), check if usable output already exists (replace deploy-check with your actual skill name):
```bash
if [ -f ".codegraph/deploy-check/results.json" ]; then
echo "Using cached results from previous run"
else
# run expensive operation
fi
```This supports both idempotent re-runs and resume-after-failure.
Pattern 13: Platform portability
Avoid shell constructs that behave differently across platforms:
- Use
find ... -name "*.ext" | grep -q .instead offind ... -quit(non-portable) or glob expansion (ls *.ext) which differs between bash versions - Use
mktempwith template syntax (mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX") — GNU flags like--suffixand-pare not available on macOS BSDmktemp. TheXrun must be trailing — a suffix directly after it (tmp.XXXXXXXXXX.ext) returns the template literally instead of randomizing it on macOS BSDmktemp(issue #2157); when an extension is required (Pattern 3),mktemp -da directory and place the named file inside it instead - Use
sed -i.bakinstead ofsed -i ''(GNU vs BSD incompatibility) - Document any platform-specific behavior with a comment:
# NOTE: requires GNU coreutils
Pattern 14: Trap-based cleanup
Any phase that creates temp files or modifies repo state must set a cleanup trap. Without it, errors mid-phase leak temp files or leave dirty state:
TMPFILE=$(mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX")
trap 'rm -f "$TMPFILE"' EXIT
# ... operations that might fail ...
# Reset when done if more work follows:
trap - EXITFor phases that cd into a temp directory, clean up both the directory and the working directory change:
WORK_DIR=$(mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX")
# > /dev/null 2>&1: suppress cd's directory-path output — cleanup should be silent
trap 'cd - > /dev/null 2>&1; rm -rf "$WORK_DIR"' EXIT
cd "$WORK_DIR"
# ... operations inside the temp directory ...
# > /dev/null 2>&1: suppress cd's directory-path output — cleanup should be silent
cd - > /dev/null 2>&1
rm -rf "$WORK_DIR"
trap - EXITPattern 15: Git stash safety
Never rely on $? or stash@{0} after git stash push — modern git (2.16+) returns 0 even when nothing was stashed, and other operations may push to the stash stack between your push and pop.
Wrong:
```bash
git stash push -- package.json
# ... operations ...
git stash pop # BUG: pops wrong entry if stash was no-op or stack changed
```Correct: Use a named stash with STASH_REF lookup — keep push and pop in one block or persist the ref to a file if other work must happen in between.
Single-block approach (push and pop bracket the work):
```bash
git stash push -m "deploy-check-backup" -- package.json package-lock.json
STASH_REF=$(git stash list --format='%gd %s' | grep 'deploy-check-backup' | head -1 | awk '{print $1}')
# STASH_REF is non-empty only if a stash entry was actually created.
# ... work here ...
[ -n "$STASH_REF" ] && git stash pop "$STASH_REF"
```If the pop must happen in a later code fence, persist the ref to a file (per Pattern 1):
```bash
mkdir -p .codegraph/deploy-check
git stash push -m "deploy-check-backup" -- package.json package-lock.json
git stash list --format='%gd %s' | grep 'deploy-check-backup' | head -1 | awk '{print $1}' > .codegraph/deploy-check/.stash-ref
```
Later:
```bash
STASH_REF=$(cat .codegraph/deploy-check/.stash-ref)
[ -n "$STASH_REF" ] && git stash pop "$STASH_REF"
rm -f .codegraph/deploy-check/.stash-ref
```Pattern 16: Division-by-zero guards
Every arithmetic division or percentage computation must guard against zero denominators. Common in benchmark comparisons, complexity deltas, and ratio calculations:
Wrong:
```bash
DELTA=$(( (CURRENT - BASELINE) * 100 / BASELINE ))
```Correct:
```bash
# $BASELINE and $CURRENT are expected to be set by the surrounding context (e.g. from codegraph stats output)
if [ "$BASELINE" -gt 0 ]; then
DELTA=$(( (CURRENT - BASELINE) * 100 / BASELINE ))
else
DELTA=0 # no baseline — treat as no change
fi
```Pattern 17: DRY_RUN consistency
If the skill supports --dry-run, every destructive operation must check the flag at the point of action — not just at phase entry. A single phase often mixes reads (always run) and writes (skip in dry-run):
Wrong:
```bash
# Phase skips entirely in dry-run — but the analysis part is useful
if [ "$DRY_RUN" = "true" ]; then exit 0; fi
# ... 50 lines of analysis ...
rm -rf "$OUTPUT_DIR"
```Correct:
```bash
# $DRY_RUN is expected to be parsed from $ARGUMENTS in Phase 0; $OUTPUT_DIR is set earlier in this phase
# Analysis always runs
codegraph audit --quick src/
# Only the destructive part checks DRY_RUN
if [ "$DRY_RUN" = "true" ]; then
echo "[DRY RUN] Would remove $OUTPUT_DIR"
else
rm -rf "$OUTPUT_DIR"
fi
```Exit condition: Every phase body in the SKILL.md follows all 17 patterns. No wrong/correct examples remain as actual instructions — only the correct versions.
Phase 3 — Dangerous Operation Guards
If the skill performs dangerous operations (from Phase 0 discovery), add explicit guards:
For git modifications:
- Stage only named files (never
git add .orgit add -A) - Include rollback instructions: "To undo:
git reset HEAD~1" or similar - For destructive operations (force-push, reset, clean): require explicit confirmation
For file deletions:
- List what will be deleted before deleting
- Use
rm -ior prompt for confirmation in non---forcemode
For external API calls:
- Handle network failures gracefully (don't crash the pipeline)
- Add timeout limits
For code modifications:
- Run tests after changes: detect test runner per Phase: Write the Skill Body, Pattern 6
- Run lint after changes: detect lint runner:
if [ -f "biome.json" ]; then LINT_CMD="npx biome check" elif find . -maxdepth 1 -name "eslint.config.*" | grep -q .; then LINT_CMD="npx eslint ." elif [ -f "package.json" ]; then LINT_CMD="npm run lint" else echo "WARN: No recognised lint runner found — skipping lint"; LINT_CMD="true"; fi $LINT_CMD
Exit condition: Every dangerous operation identified in Phase: Discovery has a corresponding guard in the SKILL.md.
Phase 4 — Self-Review Checklist
Before finalizing, audit the SKILL.md against every item below. Do not skip any item. Fix violations before proceeding.
Structure checks:
- Frontmatter has all four fields:
name,description,argument-hint,allowed-tools namematches the directory name- Phase 0 exists and validates the environment
- Arguments section explicitly parses
$ARGUMENTSinto named variables - Rules section exists at the bottom
- Every phase has a clear name (not just a number)
Anti-pattern checks (all 17 patterns):
- Shell variables: No variable is set in one code fence and used in another. State that must persist is written to a file
- Silent failures: No
2>/dev/nullwithout a documented skip rationale. No commands that swallow errors - Temp file extensions: Every temp file passed to codegraph has the correct language extension
- Temp file uniqueness: Every temp path uses
mktemp, never hardcoded paths - Cross-references: All step references use phase names, not bare numbers
- Placeholders: Every
<placeholder>has a preceding detection/assignment script - Contradictions: No two sections describe contradictory behavior for the same condition
- Rules sync: Every command/tool in the procedure is covered by Rules. Every Rules exception maps to a real step
- Redundancy: No codegraph command is run twice with the same arguments. Later phases reference earlier results
- Skip validation: If
--start-from/--skip-*is supported, every skip path validates required artifacts - Progress indicators: Phases that iterate over files or run batch operations emit progress (
Processing $i/$total) - Artifact reuse: Expensive operations (codegraph build, embedding generation, batch analysis) check for existing output before re-running
- Platform portability: No
sed -i '', no unquoted globs, no GNU-only flags without fallback or documentation - Cleanup traps: Phases that create temp files or modify repo state use
trap ... EXITfor cleanup on error paths - Git stash safety: Every
git stash pushhas a named STASH_REF lookup; everypop/dropis guarded by[ -n "$STASH_REF" ] - Division-by-zero: Every arithmetic division or percentage computation guards against zero denominators
- DRY_RUN consistency: If
--dry-runis supported, every destructive operation is gated on the flag at the point of action, not just at phase entry
Robustness checks:
- Rollback paths: Every destructive operation has documented undo instructions
- Error messages: Every failure path produces a specific, actionable error message (not just "failed")
- Concurrency safety: No shared global state that would break under parallel invocation
- Determinism: No non-deterministic algorithm output used for before/after comparisons (e.g., Louvain community IDs)
Completeness checks:
- Artifact schema: If the skill produces files, path/format/schema are documented
- Exit conditions: Each phase states what must be true before the next phase starts
- Scope boundary: The skill's purpose is clear — it does one thing, not five
- Examples section: At least 2-3 realistic usage examples showing common invocations are included
Safety checks:
- Idempotency: Re-running the skill on the same state is safe. Existing output files are handled (skip, overwrite with warning, or merge)
- Dependency validation: Phase 0 verifies all shell commands used in bash blocks are available before starting work (e.g.
command -v git mktemp jq). "Command not found" is caught before Phase 2, not during Phase 3 - Exit codes: Every error path uses explicit
exit 1. No silent early returns that leave the pipeline in an ambiguous state - State cleanup: If the skill creates
.codegraph/$SKILL_NAME/*files, the skill documents when they're cleaned up or how users remove them (e.g.,rm -rf .codegraph/$SKILL_NAMEin a cleanup section) - Git commit safety: All
git addcalls use explicit file paths (never.or-A);git diff --cached --quietis checked before committing to avoid empty commits
Read through the entire SKILL.md one more time after checking all items. Fix anything found.
Exit condition: All checklist items pass. The SKILL.md has no unresolved structure, anti-pattern, robustness, completeness, or safety violations.
Phase 5 — Smoke Test
The self-review is purely theoretical — most real issues (wrong paths, shell syntax, missing tools, argument parsing bugs) only surface when you actually try to run the code. Before finalizing, execute these validation steps:
Automated validation
Run both validation scripts against the generated SKILL.md:
LINT_RC=0
bash .claude/skills/create-skill/scripts/lint-skill.sh ".claude/skills/$SKILL_NAME/SKILL.md" || LINT_RC=$?
SMOKE_RC=0
bash .claude/skills/create-skill/scripts/smoke-test-skill.sh ".claude/skills/$SKILL_NAME/SKILL.md" || SMOKE_RC=$?
if [ "$LINT_RC" -ne 0 ] || [ "$SMOKE_RC" -ne 0 ]; then
echo "Validation failed — fix ERRORs before proceeding"; exit 1
filint-skill.shchecks for cross-fence variable bugs, bare2>/dev/null, hardcodednpm test/npm run test/npm run lint/yarn test/yarn run test/yarn run lint/pnpm test/pnpm run test/pnpm run lint,git add ./git add -- ., missing frontmatter (includingnamematching directory name), missing Phase 0 / Rules / Examples, missing exit conditions, GNU-onlyfind -quit, hardcoded/tmp/paths, andsed -iportability issues.smoke-test-skill.shextracts everybashcode block (skipping example regions inside quadruple backticks) and runsbash -nsyntax checking on each.
Fix all ERROR findings. Review WARN findings — fix or annotate with justification.
Phase 0 dry-run
Run the skill's Phase 0 (pre-flight) logic in a temporary test directory to verify:
- Argument parsing works for valid inputs and rejects invalid ones
- Tool availability checks actually detect missing tools (temporarily rename one to confirm)
- Environment validation produces clear error messages on failure
TEST_DIR=$(mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX")
# > /dev/null 2>&1: suppress cd's directory-path output — cleanup should be silent
trap 'cd - > /dev/null 2>&1; rm -rf "$TEST_DIR"' EXIT
cd "$TEST_DIR"
git init --quiet
# --- Happy path: valid skill name and all tools present ---
# Simulate: ARGUMENTS="deploy-check"; run the Phase 0 pre-flight checks
# --- Failure path 1: not in a git repo ---
# (run checks from a non-git directory — expect ERROR message + non-zero exit)
# --- Failure path 2: invalid skill name ---
# ARGUMENTS="BadName!"; run argument validation — expect rejection
# --- Failure path 3: missing required tool ---
# (temporarily hide a required tool — expect clear error message + non-zero exit)
# > /dev/null 2>&1: suppress cd's directory-path output — returning to original directory
cd - > /dev/null 2>&1
rm -rf "$TEST_DIR"
trap - EXITIdempotency check
Mentally trace a second execution of the skill on the same state:
- Does Phase 0 handle pre-existing artifacts (skip, warn, overwrite)?
- Do file-creation steps fail if the file already exists?
- Are
mktemppaths unique across runs? Check every template'sXrun is trailing (tmp.XXXXXXXXXX, nottmp.XXXXXXXXXX.ext) — a suffix after the X's breaks uniqueness on macOS BSDmktemp(issue #2157) even though it works on Linux
Document any idempotency fix applied.
Exit condition: All bash blocks pass bash -n syntax check. Phase 0 logic runs without errors in a test directory. Idempotency is confirmed or fixed.
Phase 6 — Finalize
- Read the final SKILL.md end-to-end and confirm it passes all Phase: Self-Review Checklist checks and Phase: Smoke Test validations
- Show the user the complete skill for review
- Ask: "Ready to commit, or want changes?"
If the user approves:
- Stage only
.claude/skills/$SKILL_NAME/SKILL.md(and any scripts in.claude/skills/$SKILL_NAME/scripts/if created) - Commit:
feat(skill): add /$SKILL_NAME skill
Exit condition: User has approved the skill. .claude/skills/$SKILL_NAME/SKILL.md is committed to the repo.
Examples
/create-skill deploy-check— scaffold a deployment validation skill that runs preflight checks before deploying/create-skill review-pr— scaffold a PR review skill with API calls and diff analysis/create-skill db-migrate— scaffold a database migration skill with dangerous-operation guards and rollback paths
Rules
- Never write the skill without Phase 0 discovery answers. The user must describe what they want before you write anything.
- Never skip the self-review checklist or smoke test. Phase: Self-Review Checklist and Phase: Smoke Test are both mandatory, not optional.
- Phase names over step numbers. All cross-references in the generated skill must use phase names.
- One skill = one concern. If the user's requirements span multiple unrelated workflows, suggest splitting into separate skills.
- No co-author lines in commit messages.
- No Claude Code references in commit messages or the skill body.
- Persist temp state to files, not shell variables when it must survive across code fences.
- Test commands must be detected, not assumed. Never hardcode
npm test,npm run test,npm run lint,yarn test,yarn run test,yarn run lint,pnpm test,pnpm run test, orpnpm run lint— detect the package manager first. - Every
2>/dev/nullneeds a justification comment in the generated skill.
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
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.

