Claude
Skills
Sign in
Back

validate-skills

Included with Lifetime
$97 forever

Validate bash and shell code blocks embedded in plugin commands and skills .md files. Catches syntax errors, undefined variables, unclosed quotes, missing semicolons. Use when editing files under plugins/*/commands/*.md or plugins/*/skills/*/SKILL.md, when creating a new command or skill in this repo, or when CI fails on a markdown bash-block syntax check.

Cloud & DevOps

What this skill does


# Validate Skills

When working on `.md` command or skill files that contain fenced bash/shell code blocks, suggest running `/validate-skills` to catch issues before they ship.

## What It Catches

- **Syntax errors**: Unclosed quotes, mismatched if/fi, invalid redirections (`bash -n`)
- **Shell pitfalls**: Unquoted variables, deprecated syntax, SC2015 `A && B || C` (`shellcheck`)
- **Portability issues**: macOS vs Linux differences (`mktemp` templates, `sed -i`, `grep -P`, `readlink -f`, `date` flags)
- **Unsafe commands**: RED-tier commands (`rm`, `sudo`, `eval`, pipe-to-shell) flagged as warnings
- **Template variable handling**: Blocks with unresolvable plugin variables (`$CLAUDE_PLUGIN_ROOT`, `$ARGUMENTS`, `$MODEL`) are skipped for execution but still syntax-checked
- **Execution failures**: GREEN-tier read-only commands that fail at runtime (broken `jq` filters, invalid `grep` patterns, `mktemp` template errors)

## Common Pitfalls in Plugin Markdown

### macOS vs Linux
- `mktemp /tmp/foo.XXXXXX.md` — template characters must be at end on macOS, use `mktemp /tmp/foo-XXXXXX` + rename
- `sed -i '' 's/old/new/' file` (macOS) vs `sed -i 's/old/new/' file` (Linux) — use `sed -i.bak` for portability
- `grep -P` not available on macOS — use `grep -E` instead
- `readlink -f` not available on macOS — use `realpath` or `cd ... && pwd`
- `date -d` (Linux) vs `date -j -f` (macOS)

### Shell Safety
- `A && B || C` is NOT if/else — if B fails, C still runs (ShellCheck SC2015)
- Unquoted `$VAR` splits on whitespace and expands globs — always quote: `"$VAR"`
- `[ -z $VAR ]` fails if VAR is empty — use `[ -z "$VAR" ]`

### External Tool Output
- Never assume tool output is pure JSON — check for banners, headers, progress bars
- `curl` may return HTML error pages on failure — check HTTP status codes
- `gh` CLI output format changes between versions — prefer `--json` + `--jq`

## Usage

```
/validate-skills                              # Validate all plugin .md files
/validate-skills plugins/go-dev/commands/     # Validate a directory
/validate-skills path/to/command.md           # Validate a specific file
/validate-skills --json                       # Output structured JSON
```

Related in Cloud & DevOps