skills
CLI Toolmattpocock/skills
Collection of AI agent skills for real software engineering.
Overview
A set of small, composable skills for coding agents like Claude Code. They address common failure modes such as misalignment, verbosity, and code quality. Includes skills for grilling, TDD, diagnosis, and architecture improvement.
README Preview
\n \n \n \n \n \n \n \n\n\n# Skills For Real Engineers\n\n[](https://skills.sh/mattpocock/skills)\n\nMy agent skills that I use every day to do real engineering - not vibe coding.\n\nDeveloping real applications is hard. Approaches like GSD, BMAD, and Spec-Kit try to help by owning the process. But while doing so, they take away your control and make bugs in the process hard to resolve.\n\nThese skills are designed to be small, easy to adapt, and composable. They work with any model. They're based on decades of engineering experience. Hack around with them. Make them your own. Enjoy.\n\nIf you want to keep up with changes to these skills, and any new ones I create, you can join ~60,000 other devs on my newsletter:\n\n[Sign Up To The Newsletter](https://www.aihero.dev/s/skills-newsletter)\n\n## Quickstart (30-second setup)\n\n1. Run the skills.sh installer:\n\n```bash\nnpx skills@latest add mattpocock/skills\n```\n\n2. Pick the skills you want, and which coding agents you want to install them on. **Make sure you select `/setup-matt-pocock-skills`**.\n\n3. Run `/setup-matt-pocock-skills` in your agent. It will:\n - Ask you which issue tracker you want to use (GitHub, Linear, or local files)\n - Ask you what labels you apply to ticks when you triage them (`/triage` uses labels)\n - Ask you where you want to save any docs we create\n\n4. Bam - you're ready to go.\n\n## Why These Skills Exist\n\nI built these skills as a way to fix common failure modes I see with Claude Code, Codex, and other coding agents.\n\n### #1: The Agent Didn't Do What I Want\n\n> "No-one knows exactly what they want"\n>\n> David Thomas & Andrew Hunt, [The Pragmatic Programmer](https://www.amazon.co.uk/Pragmatic-Programmer-Anniversary-Journey-Mastery/dp/B0833F1T3V)\n\n**The Problem**. The most common failure mode in software development is misalignment. You think the dev knows what you want. Then you see what they've built - and you realize it didn't understand you at
FAQ (5)
TroubleshootingHow do I fix a Bash wizard exiting immediately on TERM=dumb or a CI pty because `tput clear` fails under `set -e`?
Do not select tput clear merely because the tput binary exists. Run it in the if condition and fall back to ANSI escape sequences when it fails:
_clear() {
if command -v tput >/dev/null 2>&1 && tput clear 2>/dev/null; then
return 0
fi
printf '\033[2J\033[3J\033[H'
}
A failed command in an if condition does not trigger errexit, so this is safe with set -euo pipefail, including Bash 3.2. Redirecting stderr suppresses terminfo errors. Reproduce the original failure on a PTY, such as TERM=dumb, rather than through a pipe; non-TTY stdout may cause _clear to return early.
TroubleshootingWhy does `${KEY:-default}` still use the default after `write_env KEY VALUE` writes the value to the env file?
In mattpocock-skills 1.2.3, write_env only upserts KEY=VALUE into $ENV_FILE; it does not set KEY in the running shell. Therefore, later stages using ${KEY:-default} see an unset variable and use the default. Fix skills/engineering/wizard/template.sh by assigning the variable with printf -v, mirroring ask and ask_secret:
write_env() {
local key="$1" value="$2" tmp
touch "$ENV_FILE"
tmp=$(mktemp)
grep -vE "^${key}=" "$ENV_FILE" > "$tmp" || true
printf '%s=%s\n' "$key" "$value" >> "$tmp"
mv "$tmp" "$ENV_FILE"
printf -v "$key" '%s' "$value"
WRITTEN_ENV+=("$key")
printf ' %s✓ wrote%s %s → %s\n' "$GREEN" "$RESET" "$key" "$ENV_FILE"
}
For an immediate workaround in an already generated wizard, explicitly assign the value after writing it, for example WRITE_KEY_NAME="dealsplash-import-write", or source/reload the env file before later stages read it.
TroubleshootingHow do I fix ShellCheck SC2034 for an unused RED variable in scripts generated by the wizard skill?
Remove the unused RED assignments from skills/engineering/wizard/template.sh in both the color and no-color branches, for example RED=$(tput setaf 1) and the corresponding no-color assignment such as RED=''. Regenerate the wizard script. Verify with grep -n RED skills/engineering/wizard/ (it should return nothing) and run shellcheck on the generated script to confirm SC2034 is gone. If you cannot update the template immediately, delete the unused RED declaration from the generated script as a workaround.
TroubleshootingWhy does editing a Bash script while it is waiting at a read prompt cause "syntax error near unexpected token"?
Bash reads script files incrementally by byte offset instead of loading the whole file first. If the file changes while the script is paused at a prompt, Bash resumes at a stale offset in the new content, which can produce spurious syntax errors such as syntax error near unexpected token '('.
Fix it by wrapping the wizard's executable stage code in a single function and calling that function only on the last line, followed by exit. Bash parses the complete function before running it, so it no longer reads the changing script file during prompts:
run_wizard() {
TOTAL_STAGES=1
banner "Setup"
# stage prompts and logic here
finish
}
run_wizard "$@"; exit
Keep shared library code above the stages marker unchanged, keep all stage logic inside run_wizard, and leave the final invocation line alone. Verify with:
bash -n template.sh
The fix was verified with Bash 3.2 and Bash 5.3. As a temporary workaround, do not save, regenerate, git pull, or otherwise modify a wizard script while it is running; run an immutable copy instead.
TroubleshootingHow to make the AI assistant use my project's ubiquitous language during conversations?
The ubiquitous language skill is now integrated into the /grill-me-docs command. Run that command to align the AI with your terminology. To build a CONTEXT.md file with project terms, use /grill-with-docs iteratively.