An architectural and contributor reference for
mattpocock/skills. This collection is a Claude Code "skill pack" — eighteen self-contained Markdown specifications, two reference documents, and one helper shell script, distributed vianpxand consumed by Claude Code. There is no compiled binary, no API server, no database. The system's value is the structure and discipline of the skill specifications themselves.
Repository: mattpocock/skills
Source commit: 651eab0 (2026-04-01)
License: MIT (Copyright 2026 Matt Pocock)
Total source files: 30
Top-level skill directories: 18
Helper scripts: 1 (git-guardrails-claude-code/scripts/block-dangerous-git.sh)
1. Architecture Overview
1.1. What this is
mattpocock/skills is a Markdown-only authoring repository for Claude Code skills. Each skill is a directory whose primary artefact is a SKILL.md file consisting of a YAML frontmatter block and a Markdown body. Optional companion files (REFERENCE.md, additional topic-specific Markdown, or a scripts/ subfolder) provide deeper material.
The repository ships zero application code, zero tests, and zero build pipeline. Distribution is handled externally by the skills npm package (npx skills@latest add <owner>/<repo>/<skill>), which copies the relevant directory into the consumer's .claude/skills/ folder.
Note
Because the deliverable is plain Markdown read by an LLM, the "architecture" of this project is the structure of its specifications and the conventions that govern them. There is no runtime to diagram. The diagrams below describe authoring and consumption, not execution.
1.2. Authoring and consumption flow
┌──────────────────────────────────┐
│ mattpocock/skills (this repo) │
│ │
│ 18 SKILL.md files │
│ + 5 TDD reference files │
│ + 2 github-triage briefs │
│ + 1 improve-arch reference │
│ + 1 git-guardrails script │
│ + README.md, LICENSE │
└────────────────┬─────────────────┘
│
│ git push to main
▼
┌──────────────────────────────────┐
│ GitHub: mattpocock/skills │
└────────────────┬─────────────────┘
│
│ fetched by `npx skills@latest`
▼
┌──────────────────────────────────┐
│ Consumer project │
│ .claude/skills/<skill>/ │
│ .claude/hooks/ (guardrails) │
│ .claude/settings.json │
└────────────────┬─────────────────┘
│
│ loaded at conversation time
▼
┌──────────────────────────────────┐
│ Claude Code session │
│ reads SKILL.md `description:` │
│ to decide which to load │
└──────────────────────────────────┘
1.3. Component inventory
| Component | Path | Role |
|---|---|---|
| Index | README.md |
Human-readable index grouping skills by theme with one-line descriptions and install commands. |
| License | LICENSE |
MIT, Copyright 2026 Matt Pocock. |
| Planning skills | write-a-prd/, prd-to-plan/, prd-to-issues/, grill-me/, design-an-interface/, request-refactor-plan/ |
Six planning-and-design skills covering PRD authoring, slicing, interrogation, interface design. |
| Development skills | tdd/, triage-issue/, improve-codebase-architecture/, migrate-to-shoehorn/, scaffold-exercises/ |
Five development skills covering TDD, bug triage, architectural deepening, type-assertion migration, exercise scaffolding. |
| Tooling skills | setup-pre-commit/, git-guardrails-claude-code/, github-triage/, qa/ |
Four tooling skills covering pre-commit hooks, dangerous-git blocking, issue triage, conversational QA. |
| Writing skills | write-a-skill/, edit-article/, ubiquitous-language/, obsidian-vault/ |
Four writing skills covering skill authoring, article editing, glossary extraction, and Obsidian vault management. |
| TDD reference set | tdd/{deep-modules,interface-design,mocking,refactoring,tests}.md |
Five companion documents bundled with the tdd skill explaining its underlying theory and patterns. |
| GitHub triage reference set | github-triage/{AGENT-BRIEF,OUT-OF-SCOPE}.md |
Two reference documents that the github-triage skill links to. |
| Architecture reference | improve-codebase-architecture/REFERENCE.md |
Companion document with dependency category definitions and the issue template. |
| Helper script | git-guardrails-claude-code/scripts/block-dangerous-git.sh |
The one shell script in the repo. Implements the PreToolUse hook. |
1.4. Repository statistics
- Total tracked files: 30 (per the briefing manifest; 18 SKILL.md + 5 TDD reference + 2 github-triage + 1 architecture reference + 1 hook script + README + LICENSE + 1 internal triage doc).
- Total source characters: 507 (briefing's
total_source_chars— counts only what the AST extractor processed, which for a Markdown-only repo is effectively trivial). - Complexity tier: medium (briefing).
- Extracted feature density: zero functions, classes, CLI commands, API endpoints, or config keys. The AST extractor does not parse Markdown.
Note
The AST-extraction zero-counts are not a defect of this guide — they reflect that the artefact is prose, not code. Briefing confidence is 100 because every skill is fully readable from
SKILL.md. The lone shell script is short and transparent (~25 lines).
1.5. Technology stack
| Layer | Technology | Where it appears |
|---|---|---|
| Distribution | npm package skills (external) |
npx skills@latest add ... install commands across all SKILL.md and README.md. |
| Hosting | GitHub | Repo lives on GitHub; the gh CLI is the canonical way every issue-creating skill writes back to it. |
| Format | YAML frontmatter + Markdown body | Every SKILL.md. |
| Hook script | Bash + jq |
git-guardrails-claude-code/scripts/block-dangerous-git.sh. |
Pre-commit (consumed by setup-pre-commit) |
Husky 9+, lint-staged, Prettier | Configured in target consumer projects, not this repo. |
Test-data utility (consumed by migrate-to-shoehorn) |
@total-typescript/shoehorn |
npm i @total-typescript/shoehorn in target consumer projects. |
Linter (consumed by scaffold-exercises) |
pnpm ai-hero-cli internal lint |
Run in target consumer projects (Matt Pocock's AI Hero curriculum). |
2. The SKILL.md Specification
The single most important contract in the project is what a SKILL.md looks like. The pack's own write-a-skill skill documents the canonical shape; every other skill in the repo conforms to it. This section is the authoritative reference.
2.1. File layout
<skill-name>/
├── SKILL.md # Main instructions (required)
├── REFERENCE.md # Detailed reference (optional)
├── EXAMPLES.md # Usage examples (optional)
└── scripts/ # Utility scripts (optional)
└── helper.sh
Names use kebab-case. The skill's directory name becomes its install path: mattpocock/skills/<skill-name>.
2.2. Frontmatter contract
Every SKILL.md begins with a YAML frontmatter block delimited by ---:
---
name: skill-name
description: Brief description of capability. Use when [specific triggers].
---
| Field | Required | Constraints |
|---|---|---|
name |
Yes | Kebab-case, must match the directory name. |
description |
Yes | Max 1024 characters; written in third person; first sentence describes the capability; second sentence begins "Use when …" and lists explicit trigger keywords/contexts. |
Important
The
descriptionis the only thing the host agent sees when deciding which skill to load. It is surfaced in the system prompt alongside every other installed skill. Vague descriptions cause the agent to miss the right skill or load the wrong one. Every skill in this repo follows the "what + when" template.
2.3. Body conventions
After the frontmatter, the body is plain Markdown. The repo's skills consistently use:
- A top-level heading naming the skill (often duplicating the directory name).
- A Process or Workflow section as the spine, numbered or sub-headed by step.
- Optional sections: Why, Anti-patterns, Templates, Notes, Reference docs.
- Inline templates inside
<template-name>...</template-name>pseudo-tags or fenced code blocks. - Heavy use of checklists (
- [ ]) for verification points.
2.4. Description heuristics in this repo
| Skill | Description shape |
|---|---|
write-a-prd |
Capability + "Use when user wants to write a PRD, create a product requirements document, or plan a new feature." |
tdd |
Capability + "Use when user wants to build features or fix bugs using TDD, mentions 'red-green-refactor', wants integration tests, or asks for test-first development." |
grill-me |
Capability + "Use when user wants to stress-test a plan, get grilled on their design, or mentions 'grill me'." |
git-guardrails-claude-code |
Capability + "Use when user wants to prevent destructive git operations, add git safety hooks, or block git push/reset in Claude Code." |
The pattern is consistent: a capability sentence followed by a "Use when …" clause that mixes intent verbs with literal trigger keywords (the user's exact phrases).
2.5. Length budget
write-a-skill/SKILL.md recommends keeping SKILL.md under 100 lines. When a skill exceeds that, content is split into adjacent files. The exemplars in this repo:
tdd/SKILL.md(107 lines) splits theory across five companion files.github-triage/SKILL.md(175 lines) keeps its long state machine in-line but pushes templates toAGENT-BRIEF.mdandOUT-OF-SCOPE.md.improve-codebase-architecture/SKILL.md(76 lines) pushes the issue template and dependency definitions toREFERENCE.md.
Edge cases also exist: edit-article/SKILL.md is just 14 lines (one-section workflow) and grill-me/SKILL.md is 10 lines (a single instruction prompt).
Tip
Don't pad a skill to hit a length target. The smallest skills (
grill-me,edit-article) are valuable because they're tight directives, not because they're "complete" in a documentation sense.
3. Authoring a New Skill
3.1. Decide whether to add a new skill
Before writing, ask:
- Could an existing skill in the pack be edited to handle this case? Editing tends to be cheaper and reduces the agent's "which skill?" search space.
- Is the trigger distinct? If the description would overlap heavily with an existing skill, the agent will be confused.
- Does the new skill have stable, repeatable steps? Skills are workflows; one-off prompts don't belong here.
The pack's own write-a-skill workflow encodes this: gather requirements, draft, then review with the user before merging.
3.2. Drafting
Recommended sequence:
- Write the frontmatter
nameanddescription. Force yourself to articulate the trigger in the description before the body. - Write the workflow as a numbered list (one heading per step is fine for longer skills). Use sub-headings sparingly.
- Add templates inside
<template-name>...</template-name>blocks if the skill files an artefact (issue, PRD, plan). - Add a checklist where verification steps exist (
- [ ]). - Run a self-review using the checklist below.
3.3. Review checklist
Adapted from write-a-skill/SKILL.md:
- [ ] Description is third-person, includes "Use when …" clause, and is under 1024 characters.
- [ ]
SKILL.mdis under 100 lines (or content is split into companion files for a justified reason). - [ ] No time-sensitive information (versions, dates, "as of 2026").
- [ ] Terminology is consistent — same word for same concept across the body.
- [ ] At least one concrete example is included.
- [ ] References go one level deep —
SKILL.mdmay link to a companion.md, but that companion does not link further down a chain. - [ ] Workflow steps are numbered or clearly ordered.
- [ ] Templates use fenced code blocks with a language tag.
3.4. Bundling scripts
Add a scripts/ subfolder when:
- The operation is deterministic (validation, formatting, exact pattern matching).
- The same code would be regenerated by Claude on every invocation, wasting tokens and risking subtle drift.
- Errors need explicit handling (exit codes, stderr messages — see
block-dangerous-git.shfor an example).
If you ship a script:
- Make it
#!/bin/bashwithset -eif not parsing JSON, or rely onjqif you are. - Document its expected stdin / stdout / exit codes inside the
SKILL.md. - Keep it short — the scripts in this pack are self-evident on a single screen.
3.5. Bundling reference docs
Use companion .md files when content has distinct subdomains or when advanced material is rarely needed. The TDD pack is the canonical example — SKILL.md is the workflow, while deep-modules.md, interface-design.md, mocking.md, refactoring.md, and tests.md provide topic-specific depth.
Cross-link from SKILL.md to the reference using relative Markdown links: [deep modules](deep-modules.md). The npx skills@latest add ... installer copies the entire skill directory, so relative links keep working in the consumer project.
3.6. Pull request flow
The repo is on main only — there is no develop or release branch. Submit a pull request against main. The maintainer reviews via the same github-triage workflow he documents (in fact, he dogfooded it: the AGENT-BRIEF and OUT-OF-SCOPE structures were applied retroactively to make incoming issues a productive intake channel).
Note
Issue #6 in the upstream repo (closed) was the request to add an MIT license. Issue #11 (closed) standardised the skill prefix. These two closures established that the pack accepts community contributions and that breaking renames will be considered.
4. Skill-by-Skill Module Reference
This section enumerates every skill in the pack with its file footprint, exposed contract, and consumed dependencies. The consumer interface column lists what callers (Claude Code) see; the environment column lists external tools the workflow assumes.
4.1. Planning & Design
write-a-prd/
- Files:
SKILL.md(74 lines). - Purpose: Interview-driven PRD authoring with module sketching.
- Consumer interface: Slash invocation; ends in a filed GitHub issue containing Problem Statement, Solution, User Stories, Implementation Decisions, Testing Decisions, Out of Scope, Further Notes.
- Environment:
gh(issue create), repo with main branch + write access. - Notable internals: Explicitly looks for "deep module" extraction opportunities; uses checklists for testing-decision capture.
prd-to-plan/
- Files:
SKILL.md(107 lines). - Purpose: Convert a PRD in conversation context into a phased plan saved locally.
- Consumer interface: Writes
./plans/<feature-name>.md. Plan format includes durable architectural decisions and per-phase Title / User stories / What to build / Acceptance criteria. - Environment: Filesystem write to current working directory.
- Notable internals: Explicit "vertical-slice rules" embedded as
<vertical-slice-rules>block (also used inprd-to-issues). Forbids file/function names in plan body to keep it durable.
prd-to-issues/
- Files:
SKILL.md(88 lines). - Purpose: Slice a PRD into independently-grabbable GitHub issues.
- Consumer interface: N issues created with
gh issue create, each in dependency order; HITL/AFK marked. - Environment:
gh, parent PRD must already be a filed issue. - Notable internals: Iterative quizzing loop until granularity is approved. Issue template requires Parent PRD link, Acceptance Criteria checklist, Blocked-by, User stories.
grill-me/
- Files:
SKILL.md(10 lines). - Purpose: Tightest skill in the pack — a single directive to interview relentlessly with codebase exploration as a substitute for asking obvious questions.
- Consumer interface: Conversation only. No artefact.
- Environment: None.
design-an-interface/
- Files:
SKILL.md(94 lines). - Purpose: Spawn parallel sub-agents to produce 3+ radically different interface designs and compare.
- Consumer interface: Conversation only — outputs sequential design presentations and a comparison.
- Environment: Task tool / sub-agent spawning.
- Notable internals: Anchored in Ousterhout's "Design It Twice"; assigns each agent a different design constraint (minimise methods / maximise flexibility / optimise common case / paradigm-driven).
request-refactor-plan/
- Files:
SKILL.md(68 lines). - Purpose: Produce a tiny-commits refactor plan and file as a GitHub issue.
- Consumer interface: GitHub issue with Problem Statement, Solution, Commits (long plain-English breakdown), Decision Document, Testing Decisions, Out of Scope, Further Notes.
- Environment:
gh, repo write access. - Notable internals: Cites Martin Fowler on tiny-commit refactoring. Forbids file paths and code snippets in Decision Document.
4.2. Development
tdd/
- Files:
SKILL.md(107 lines),deep-modules.md,interface-design.md,mocking.md,refactoring.md,tests.md. - Purpose: Red-green-refactor TDD with vertical slicing (tracer bullets).
- Consumer interface: Conversation only — drives test-first development one cycle at a time.
- Environment: Test runner in the consumer project.
- Reference set:
deep-modules.md— Ousterhout's deep vs shallow module visual; reduce methods, simplify params, hide complexity.interface-design.md— Three rules: accept dependencies don't create them; return results don't side-effect; keep surface area small.mocking.md— Mock at system boundaries only (external APIs, sometimes DBs/time/FS); design for mockability via dependency injection and SDK-style per-endpoint interfaces.refactoring.md— Refactor candidate catalogue: duplication, long methods, shallow modules, feature envy, primitive obsession.tests.md— Good (integration-style, observable behavior) vs bad (implementation-coupled, mocks internal collaborators) tests with side-by-side TypeScript examples.
- Notable internals: Explicit "horizontal slicing is bad" anti-pattern. Per-cycle checklist enforces minimum implementation and behavior-only tests.
triage-issue/
- Files:
SKILL.md(102 lines). - Purpose: Investigate a bug end-to-end and produce a TDD-based fix issue.
- Consumer interface: GitHub issue with Problem, Root Cause Analysis, TDD Fix Plan (RED/GREEN cycles), Acceptance Criteria.
- Environment:
gh,git logreads, sub-agent (subagent_type=Explore). - Notable internals: Single clarifying question ceiling. Durability rule: suggestions describe behaviors and contracts, not internal structure.
improve-codebase-architecture/
- Files:
SKILL.md(76 lines),REFERENCE.md. - Purpose: Architectural friction-finding via exploration; deepens shallow modules; files refactor RFCs.
- Consumer interface: Numbered candidate list, framed problem space, parallel sub-agent design comparison, GitHub refactor RFC issue.
- Environment:
gh, sub-agentExplore, sub-agent design pool. - Reference set:
REFERENCE.md— Four dependency categories (in-process / local-substitutable / remote-but-owned via Ports & Adapters / true external via mock); testing-strategy principle "replace, don't layer"; full issue template.
migrate-to-shoehorn/
- Files:
SKILL.md(118 lines). - Purpose: Replace
astype assertions in test files with@total-typescript/shoehorn. - Consumer interface: Edited test files,
@total-typescript/shoehornadded to dev dependencies, type-check confirmation. - Environment: TypeScript project with tests.
- Notable internals: Patterns:
as Type→fromPartial();as unknown as Type→fromAny(); full-object force →fromExact(). Hard rule: test code only, never production.
scaffold-exercises/
- Files:
SKILL.md(106 lines). - Purpose: Create exercise directory structures that pass
pnpm ai-hero-cli internal lint. - Consumer interface: New directory tree under
exercises/, stubreadme.mdper variant, lint pass. - Environment:
pnpm,ai-hero-cli(Matt Pocock's curriculum tool). - Notable internals: Section naming
XX-name; exercise namingXX.YY-name; usesgit mv(notmv) for renames to preserve history.
4.3. Tooling & Setup
setup-pre-commit/
- Files:
SKILL.md(91 lines). - Purpose: Husky 9+ + lint-staged + Prettier with optional typecheck/test commands in the pre-commit hook.
- Consumer interface: New
.husky/pre-commit,.lintstagedrc,.prettierrc(if absent), updatedpackage.json, signed commit running through the new hook as a smoke test. - Environment: Node + npm/pnpm/yarn/bun.
- Notable internals: Auto-detects package manager via lockfile presence. Omits
typecheck/testlines when those scripts are absent inpackage.json(and tells the user). Husky v9+ does not need shebangs in hooks.
git-guardrails-claude-code/
-
Files:
SKILL.md(95 lines),scripts/block-dangerous-git.sh. -
Purpose: PreToolUse hook that intercepts and blocks dangerous git commands before Claude executes them.
-
Consumer interface: Modified
.claude/settings.json(or~/.claude/settings.json), executable hook at.claude/hooks/block-dangerous-git.sh. -
Environment: Bash,
jq. -
Notable internals (script body):
#!/bin/bash INPUT=$(cat) COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command') DANGEROUS_PATTERNS=( "git push" "git reset --hard" "git clean -fd" "git clean -f" "git branch -D" "git checkout \." "git restore \." "push --force" "reset --hard" ) for pattern in "${DANGEROUS_PATTERNS[@]}"; do if echo "$COMMAND" | grep -qE "$pattern"; then echo "BLOCKED: '$COMMAND' matches dangerous pattern '$pattern'. The user has prevented you from doing this." >&2 exit 2 fi done exit 0Exit code 2 is the convention Claude Code uses to signal "do not run this Bash command and surface the stderr." The skill explicitly merges into existing
hooks.PreToolUsearrays rather than overwriting.
github-triage/
-
Files:
SKILL.md(175 lines),AGENT-BRIEF.md,OUT-OF-SCOPE.md. -
Purpose: Label-based state machine for issue triage with mandatory grilling-then-preview before any label change.
-
Consumer interface: Modified GitHub labels, posted comments (agent briefs, triage notes, wontfix explanations), local
.out-of-scope/<concept>.mdfiles for rejected enhancements. -
Environment:
gh, repo with maintainer rights,git remoteto infer the repo. -
State machine summary:
From To Trigger unlabeled needs-triage / ready-for-agent / ready-for-human / wontfix First look needs-triage needs-info / ready-for-agent / ready-for-human / wontfix After grilling or maintainer override needs-info needs-triage Skill detects reporter reply -
Companion docs:
AGENT-BRIEF.md— Principles (durability over precision, behavioral not procedural, complete acceptance criteria, explicit scope) and template (Category, Summary, Current/Desired behavior, Key interfaces, Acceptance criteria, Out of scope) with two good examples (bug, enhancement) and one annotated bad example.OUT-OF-SCOPE.md—.out-of-scope/<concept>.mddirectory format (one file per concept, not per issue), file template (heading, "Why this is out of scope", code samples, "Prior requests" list), kebab-case naming, durability rules for the reasoning.
qa/
- Files:
SKILL.md(130 lines). - Purpose: Conversational QA — files durable issues from chat-style descriptions.
- Consumer interface: Filed GitHub issues using one of two templates (single-issue, breakdown).
- Environment:
gh, sub-agentExplore(background), optionalUBIQUITOUS_LANGUAGE.mdin the repo. - Notable internals: Caps clarifying questions at 2-3 before filing. Bans file paths and line numbers in issue bodies. Maximises parallelism via independent breakdown issues.
4.4. Writing & Knowledge
write-a-skill/
- Files:
SKILL.md(117 lines). - Purpose: Bootstrap a new skill following the conventions of this repo.
- Consumer interface: New
skill-name/SKILL.md(and optional companions). - Environment: Filesystem write to working directory.
- Notable internals: Encodes the description-format contract; gives "good" and "bad" description examples; lists when to add scripts and when to split files.
edit-article/
- Files:
SKILL.md(14 lines). - Purpose: Edit articles section-by-section respecting information dependencies (DAG ordering).
- Consumer interface: Edited article in place.
- Environment: None.
- Notable internals: Treats sections as nodes in a DAG; enforces 240-character paragraph maximum.
ubiquitous-language/
- Files:
SKILL.md(92 lines). - Purpose: Extract a DDD glossary from the current conversation; write to
UBIQUITOUS_LANGUAGE.md. - Consumer interface: New or updated
UBIQUITOUS_LANGUAGE.md. - Environment: Filesystem write to working directory.
- Output structure: Multiple grouped tables (Term, Definition, Aliases to avoid), Relationships section with cardinality, Example dialogue (3-5 dev/domain-expert exchanges), Flagged ambiguities.
obsidian-vault/
- Files:
SKILL.md(59 lines). - Purpose: Search, create, manage notes in an Obsidian vault using wikilinks and index notes.
- Consumer interface: Reads/writes inside the vault path.
- Environment: Filesystem at
/mnt/d/Obsidian Vault/AI Research/by default. - Notable internals: Hard-coded vault path. Title Case naming. No folder hierarchy — index notes and
[[wikilinks]]only.
5. Helper Script: block-dangerous-git.sh
This is the only executable artefact in the pack. Because it's tiny and security-critical, it deserves a section of its own.
5.1. Contract
- Stdin: A JSON object from Claude Code's PreToolUse hook framework with
.tool_input.commandcontaining the candidate Bash command. - Stdout: Empty.
- Stderr: A
BLOCKEDmessage naming the matched pattern, only when blocking. - Exit code:
0when allowed,2when blocked. Exit code 2 is the documented Claude Code convention for "abort the tool call and surface stderr to the model."
5.2. Pattern set
The patterns are matched with grep -qE (extended regex on the command string). Note that the \. patterns escape the dot — git checkout . matches a literal dot, not a wildcard.
| Pattern | Matches |
|---|---|
git push |
Any git push invocation, including --force. |
git reset --hard |
The explicit destructive reset. |
git clean -fd / git clean -f |
Force-clean variants. |
git branch -D |
Force-delete branches. |
git checkout . |
Discard working-tree changes via checkout. |
git restore . |
Discard working-tree changes via restore. |
push --force |
Defensive double-coverage for git push --force. |
reset --hard |
Defensive double-coverage for git reset --hard. |
5.3. Operational considerations
Caution
The script depends on
jq. Ifjqis missing, theCOMMAND=$(echo ... | jq ...)line silently produces an empty string, no patterns match, and the hook exits 0 — which means dangerous commands run unblocked. Always verifyjq --versionis available on the host before installing this skill.
Warning
The pattern list is conservative — it does not cover all destructive operations (e.g.,
git rebase --abort,git reflog expire,git stash drop,git tag -d,git remote remove). If your threat model needs broader coverage, editDANGEROUS_PATTERNSafter install. The skill explicitly invites this customisation in its step 4.
Note
Settings file merging is the maintainer's responsibility — the skill instructs the agent to merge into the existing
hooks.PreToolUsearray rather than overwriting. If you have other PreToolUse hooks, expect to see this script's matcher appended alongside them.
6. Configuration & Customisation
The repo itself has no configuration. Configuration lives entirely on the consumer side — the artefacts the skills produce.
6.1. Settings.json shape (consumer side)
The git-guardrails-claude-code skill is the only one that writes to settings.json. The expected shape:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/block-dangerous-git.sh"
}
]
}
]
}
}
Global variant uses ~/.claude/hooks/block-dangerous-git.sh instead of the $CLAUDE_PROJECT_DIR form.
6.2. Pre-commit configuration (consumer side)
setup-pre-commit writes three files:
| File | Content |
|---|---|
.husky/pre-commit |
npx lint-staged + npm run typecheck + npm run test (substituting the detected package manager and omitting missing scripts). |
.lintstagedrc |
{"*": "prettier --ignore-unknown --write"} — runs Prettier on every staged file, skipping those Prettier can't parse. |
.prettierrc (if missing) |
useTabs: false, tabWidth: 2, printWidth: 80, singleQuote: false, trailingComma: "es5", semi: true, arrowParens: "always". |
The skill also adds prepare: "husky" to package.json.
6.3. PRD/plan/issue templates (across skills)
Several skills embed inline templates. These are not configuration in the traditional sense — they are the contract the skill writes back to GitHub or local files:
write-a-prd— Problem Statement, Solution, User Stories (numbered "As a … I want … so that …"), Implementation Decisions, Testing Decisions, Out of Scope, Further Notes.prd-to-issues— Parent PRD, What to build, Acceptance criteria checklist, Blocked by (or "None — can start immediately"), User stories addressed.prd-to-plan— Architectural decisions header (Routes, Schema, Key models), per-phase Title / User stories / What to build / Acceptance criteria.request-refactor-plan— Problem Statement, Solution, Commits, Decision Document, Testing Decisions, Out of Scope, Further Notes.triage-issue— Problem, Root Cause Analysis, TDD Fix Plan, Acceptance Criteria.qa(single) — What happened, What I expected, Steps to reproduce, Additional context.qa(breakdown) — Parent issue, What's wrong, What I expected, Steps to reproduce, Blocked by, Additional context.improve-codebase-architecture— Problem, Proposed Interface, Dependency Strategy, Testing Strategy, Implementation Recommendations.github-triageagent brief — Category, Summary, Current behavior, Desired behavior, Key interfaces, Acceptance criteria, Out of scope.github-triage.out-of-scope/<concept>.md— H1 concept name, "Why this is out of scope" prose, optional code sample, "Prior requests" list of issue links.github-triagetriage notes (needs-info) — "Established so far" + "Need from you (@reporter)".ubiquitous-language— Multiple grouped tables (Term, Definition, Aliases to avoid), Relationships, Example dialogue, Flagged ambiguities.
Important
If you fork a skill to change its template, keep the template in sync with the skill's body — the body references specific section names. Renaming a section in the template without updating the body will silently break the skill at runtime.
7. Testing
The pack ships no automated tests. Validation is done by:
- Manual dogfooding — the maintainer uses every skill in his own work, including filing issues against this very repo via
github-triage. - Smoke testing the hook script — the documented one-liner
echo '{"tool_input":{"command":"git push origin main"}}' | <path-to-script>verifies blocking. Run after install or any pattern edit. - Issue-driven evolution — skill bugs surface as community issues. Several closed issues (#11, #16, #17, #18, #19, #24) document the patch trail.
7.1. Suggested local validation when authoring a skill
Even though the repo has no test runner, you can validate a skill before submitting:
- [ ] Description loads cleanly into Claude Code's skill list (no parsing errors in frontmatter).
- [ ] Skill can be invoked by its
descriptiontriggers without ambiguity vs other installed skills. - [ ] Walk through the workflow on a small, contrived example.
- [ ] Confirm any inline template still parses as valid Markdown when filed as an issue.
- [ ] If the skill ships a script, confirm exit codes and stderr behavior with crafted inputs.
7.2. Suggested validation for block-dangerous-git.sh
# Should be blocked (exit 2)
echo '{"tool_input":{"command":"git push origin main"}}' | .claude/hooks/block-dangerous-git.sh; echo "exit=$?"
echo '{"tool_input":{"command":"git reset --hard HEAD~5"}}' | .claude/hooks/block-dangerous-git.sh; echo "exit=$?"
echo '{"tool_input":{"command":"git clean -fd"}}' | .claude/hooks/block-dangerous-git.sh; echo "exit=$?"
# Should be allowed (exit 0)
echo '{"tool_input":{"command":"git status"}}' | .claude/hooks/block-dangerous-git.sh; echo "exit=$?"
echo '{"tool_input":{"command":"git log --oneline -10"}}' | .claude/hooks/block-dangerous-git.sh; echo "exit=$?"
BLOCKED: 'git push origin main' matches dangerous pattern 'git push'. The user has prevented you from doing this.
exit=2
BLOCKED: 'git reset --hard HEAD~5' matches dangerous pattern 'git reset --hard'. The user has prevented you from doing this.
exit=2
BLOCKED: 'git clean -fd' matches dangerous pattern 'git clean -fd'. The user has prevented you from doing this.
exit=2
exit=0
exit=0
Note
The script does not currently match
git rebase --abort,git reflog expire,git stash drop, or other destructive but less-common operations. If you extend the pattern list, add a corresponding allow/block test pair to your local validation script.
8. Maintenance & Operations
8.1. Release model
The repo has no semver, no changelog, no tags. Skills ship from main. Consumers fetch the latest commit by default with npx skills@latest add .... To pin a specific commit, replace the installer's URL behavior — typically by forking the repo at a known commit or vendoring the relevant skill directories into your own repo.
Important
Production-critical workflows (e.g., a CI bot that depends on a specific skill's behavior) should pin a commit, not rely on
latest. Skills evolve in place — a workflow that depends on the v0 description ofqamay break silently when the description is reworded.
8.2. Issue intake
The maintainer triages incoming issues with the github-triage workflow. See section 4.3 for the state machine. The label set he uses on this repo:
| Label | Meaning |
|---|---|
bug |
Something is broken. |
enhancement |
New feature or improvement. |
needs-triage |
Maintainer needs to evaluate. |
needs-info |
Waiting on reporter for more information. |
ready-for-agent |
Fully specified, agent-suitable. |
ready-for-human |
Requires human implementation. |
wontfix |
Will not be actioned. |
Open issues at the time of source commit 651eab0:
| # | State | Topic |
|---|---|---|
| 21 | open | Add marketplace.json for plugin marketplace support. |
| 38 | open | Q from the community (non-English title). |
| 29 | open | Ubiquitous language usage. |
| 23 | open | The flow. |
| 14 | open | Potential typo in setup-pre-commit/SKILL.md. |
Closed issues that informed the current design:
| # | Resolution | Lesson |
|---|---|---|
| 6 | Closed (license added) | Repo is now MIT licensed. |
| 11 | Closed | Skill prefix standardised. |
| 3 | Closed | Native Claude Code marketplace path adopted instead of custom marketplace. |
| 16 | Closed | grill-me should ask one question at a time, not 10+. |
| 17 | Closed | prd-to-issues should not put "tests" as their own slice. |
| 18 | Closed | grill-me should always summarise at the end. |
| 19 | Closed | grill-me should always use the question tool. |
| 24 | Closed | tdd should add STUB before RED for new features. |
| 31 | Closed | Wrong installation folder bug. |
| 33 | Closed | pop_timeline_green review item. |
| 37 | Closed | Ubiquitous-language agent additions. |
8.3. Common operational tasks
Add a new skill
- Create
<skill-name>/at repo root. - Author
SKILL.mdper section 2. - Add the skill to the appropriate group in
README.md(Planning & Design, Development, Tooling & Setup, Writing & Knowledge). - Open a PR.
Edit an existing skill
- Modify
<skill-name>/SKILL.md(and any companion files). - If the description changed, double-check that triggers don't overlap with another skill in the pack.
- Open a PR. Note the behavioral change in the PR body so consumers who pin understand the impact.
Add a reference companion to a skill
- Add
<topic>.mdinside the skill's directory. - Link from
SKILL.mdusing a relative Markdown link. - Confirm the install (
npx skills@latest add ...) copies the file into.claude/skills/<skill-name>/.
Publish to consumers
There is nothing to publish on the repo side. npx skills@latest add ... reads main directly. No package.json publish step in this repo.
Add a new git-guardrails pattern
Edit DANGEROUS_PATTERNS in git-guardrails-claude-code/scripts/block-dangerous-git.sh. Patterns are extended-regex and matched against the full command string. Test with the validation script in section 7.2.
8.4. Deprecation strategy
The pack has not deprecated a skill at the source commit. If a skill is deprecated in the future, the maintainer's likely path (extrapolated from the issue handling style) is:
- Mark the skill as deprecated in
README.mdand at the top of itsSKILL.md. - Suggest a replacement skill.
- Leave the deprecated skill in place for some grace period so existing consumers don't break.
- Eventually remove — at which point pinned consumers continue to work, and
latestconsumers no longer install the skill.
9. Security
Skills run with the privileges of the host Claude Code process, which inherits the user's privileges. There is no sandbox between a skill's instructions and the user's system.
9.1. Threat surface
| Surface | Risk | Mitigation |
|---|---|---|
npx skills@latest add ... |
Pulls Markdown from a remote repo at install time. A malicious commit or compromised npm package could ship hostile instructions. | Pin to a reviewed commit in security-sensitive contexts; review installed SKILL.md files before invoking. |
block-dangerous-git.sh |
Runs as the user before every Bash tool call. A compromised script could approve dangerous commands silently. | Read the 25-line script in full; verify with the test in section 7.2 immediately after install. |
gh issue create calls |
Skills file issues using the user's authenticated gh token. A misbehaving skill could file noise or leak content into a public repo. |
Only install issue-creating skills in repos where you have considered the consequences. Review the issue body templates in section 6.3. |
| Hard-coded paths | obsidian-vault writes/reads /mnt/d/Obsidian Vault/AI Research/. |
Edit the path before invoking; the skill will otherwise fail or, in unlikely edge cases, write to an unintended location if the path coincidentally exists. |
Warning
The pack does not implement secret redaction. Skills that file issues paste content from the conversation into GitHub. If conversation context contains secrets (API keys, tokens, internal identifiers), they will end up in the issue body. Strip secrets from context before invoking issue-filing skills.
Caution
The
git-guardrails-claude-codehook is a defence-in-depth measure, not a security boundary. It blocks dangerous git commands at Claude Code's PreToolUse stage but does NOT prevent the user from running the same commands directly in a shell. Treat it as a guardrail, not a gate.
9.2. Supply chain considerations
- The repo is published on GitHub under
mattpocock/skills. No CDN, no mirror. Tampering would require pushing to that repo. - The
skillsnpm package (consumed bynpx) is a separate supply-chain link — its source is independently maintained and is the primary install vector. Auditing that package is out of scope for this guide but is the more likely vector of compromise. - No third-party dependencies are vendored in this repo. The only external dependency is
jq(system package) used by the hook script.
9.3. Recommended hardening
For high-stakes consumer environments:
- Vendor the relevant skill directories into your own monorepo. Stop relying on
npx skills@latest. - Run
git-guardrails-claude-codeglobally (~/.claude/settings.json) with an extendedDANGEROUS_PATTERNSlist. - Add a wrapper around
ghthat requires confirmation forgh issue createin production repos. - Periodically re-review installed
SKILL.mdfiles for drift if you do followlatest.
10. Code Quality and Conventions
Although the artefacts are Markdown, the pack has its own style of "code quality." The conventions are observable across every SKILL.md.
10.1. Pattern: workflow as numbered process
Every skill except grill-me and edit-article (the two shortest) presents its body as a numbered or sub-headed sequence of steps. This makes the workflow scannable and gives the agent a clear ordering to follow.
10.2. Pattern: inline template via tagged block
Skills that file artefacts embed the template inline using pseudo-XML tags:
<issue-template>
## Problem
...
</issue-template>
The agent recognises the block as a template and follows it verbatim. This keeps the template close to the explanation of when to use it.
10.3. Pattern: anti-pattern call-outs
Several skills explicitly name the failure mode they exist to prevent:
tdd— "DO NOT write all tests first, then all implementation. This is horizontal slicing."design-an-interface— "Don't let sub-agents produce similar designs - enforce radical difference."migrate-to-shoehorn— "Test code only. Never use shoehorn in production code."triage-issue— "Do NOT include specific file paths, line numbers, or implementation details that couple to current code layout."qa— "No file paths or line numbers — these go stale."
10.4. Pattern: durability rules
A common discipline across the issue-filing skills (especially triage-issue, qa, request-refactor-plan, and github-triage's AGENT-BRIEF): describe behaviors and contracts, not implementation. Forbid file paths and line numbers. The OUT-OF-SCOPE.md rule is even stricter — do not reference temporary circumstances ("we're too busy right now"); only durable reasons (project scope, technical constraints, strategic decisions).
10.5. Pattern: dogfooding
The github-triage/AGENT-BRIEF.md/OUT-OF-SCOPE.md triplet is itself organised the way the AGENT-BRIEF prescribes — durable, behavioral, with explicit out-of-scope sections. The maintainer follows his own conventions on his own repo.
10.6. Naming conventions
- Directory names: kebab-case, lowercase.
- File names: kebab-case Markdown for SKILL companions; UPPERCASE-WITH-DASHES for the github-triage briefs (
AGENT-BRIEF.md,OUT-OF-SCOPE.md);REFERENCE.mdandEXAMPLES.mdare uppercase per thewrite-a-skilltemplate. - Heading style: H1 once at the top of each
SKILL.md(matching the skill's name); H2 for major sections; H3 for sub-steps; H4 rare.
10.7. Markdown discipline
- Fenced code blocks always have a language tag in the in-body examples.
- Tables include header + separator rows.
- Inline code uses backticks for filenames, commands, types, and config keys.
- Bold for key terms on first use and UI-style labels.
11. Potential Improvements
Recorded community asks and observed gaps that would likely strengthen the pack:
| Area | Observation | Source |
|---|---|---|
| Marketplace integration | Issue #21 (open) requests a marketplace.json for plugin marketplace support. Currently no marketplace file exists. |
GitHub #21 |
grill-me cadence |
Issue #16 (closed) reports the skill sometimes asks 10+ questions at once instead of one-by-one. The current 10-line SKILL.md is direct ("Ask the questions one at a time") but does not enforce it strongly. |
GitHub #16 |
grill-me summarisation |
Issue #18 (closed) requests an end-of-session summary. Current skill body has no summarisation step. | GitHub #18 |
prd-to-issues test slicing |
Issue #17 (closed) flags that prd-to-issues should not produce "tests" as a standalone slice. Current rules forbid it implicitly via the vertical-slice rule, but the rule could be stated explicitly. |
GitHub #17 |
tdd STUB step |
Issue #24 (closed) requests adding STUB before RED for new features. The current TDD body does not include a STUB phase. | GitHub #24 |
setup-pre-commit typo |
Issue #14 (open) flags a potential typo in setup-pre-commit/SKILL.md. Worth a re-read before next edit. |
GitHub #14 |
| Install-folder bug | Issue #31 (closed) reports wrong-folder installs. The fix is on the skills npm package side, but a defensive note in each skill's verification step would help. |
GitHub #31 |
Vault path in obsidian-vault |
Hard-coded WSL path is brittle for non-WSL users. Could be a frontmatter parameter or environment variable. | Source review |
block-dangerous-git.sh jq dependency |
Hook silently fails open if jq is missing. A pre-flight check inside the script (command -v jq → fail closed) would harden it. |
Source review |
block-dangerous-git.sh pattern coverage |
Common destructive operations like git rebase --abort, git stash drop, git tag -d, git remote remove are not blocked. |
Source review |
| Skill versioning | Skills evolve in place with no version pin or changelog. Production consumers must vendor or fork. A simple _version field in frontmatter would let consumers detect drift. |
Source review |
| Test harness | A minimal smoke-test script that validates frontmatter and lints links across all SKILL.md files would catch typos and broken cross-references at PR time. | Source review |
| Description-overlap detection | As the pack grows, two skills with similar descriptions confuse the agent. A linter that flags similarity above a threshold would help author hygiene. | Source review |
12. Quick Reference
12.1. Install commands (every skill)
npx skills@latest add mattpocock/skills/write-a-prd
npx skills@latest add mattpocock/skills/prd-to-plan
npx skills@latest add mattpocock/skills/prd-to-issues
npx skills@latest add mattpocock/skills/grill-me
npx skills@latest add mattpocock/skills/design-an-interface
npx skills@latest add mattpocock/skills/request-refactor-plan
npx skills@latest add mattpocock/skills/tdd
npx skills@latest add mattpocock/skills/triage-issue
npx skills@latest add mattpocock/skills/improve-codebase-architecture
npx skills@latest add mattpocock/skills/migrate-to-shoehorn
npx skills@latest add mattpocock/skills/scaffold-exercises
npx skills@latest add mattpocock/skills/setup-pre-commit
npx skills@latest add mattpocock/skills/git-guardrails-claude-code
npx skills@latest add mattpocock/skills/github-triage
npx skills@latest add mattpocock/skills/qa
npx skills@latest add mattpocock/skills/write-a-skill
npx skills@latest add mattpocock/skills/edit-article
npx skills@latest add mattpocock/skills/ubiquitous-language
npx skills@latest add mattpocock/skills/obsidian-vault
12.2. Files written by skills (consumer side)
| File | Written by |
|---|---|
.husky/pre-commit |
setup-pre-commit |
.lintstagedrc |
setup-pre-commit |
.prettierrc (if missing) |
setup-pre-commit |
.claude/hooks/block-dangerous-git.sh (or ~/.claude/hooks/...) |
git-guardrails-claude-code |
.claude/settings.json (or ~/.claude/settings.json) — hooks.PreToolUse entry |
git-guardrails-claude-code |
./plans/<feature>.md |
prd-to-plan |
./UBIQUITOUS_LANGUAGE.md |
ubiquitous-language |
./.out-of-scope/<concept>.md |
github-triage (when closing enhancement as wontfix) |
exercises/XX-section/XX.YY-exercise/{problem,solution,explainer}/readme.md |
scaffold-exercises |
| Test files (edited in place) | migrate-to-shoehorn |
package.json (prepare: "husky" + dev deps) |
setup-pre-commit |
12.3. GitHub interactions (consumer side)
| Skill | Operation |
|---|---|
write-a-prd |
gh issue create (PRD) |
prd-to-issues |
gh issue create × N (slices, dependency order) |
request-refactor-plan |
gh issue create (refactor RFC) |
triage-issue |
gh issue create (bug + TDD fix plan) |
qa |
gh issue create × N (single or breakdown) |
improve-codebase-architecture |
gh issue create (refactor RFC) |
github-triage |
gh reads, label updates, comments, closes |
prd-to-issues |
gh issue view <number> (PRD fetch) |
12.4. External tools required
| Tool | Required by |
|---|---|
npx (Node) |
All install commands. |
git |
All skills that read repo state. |
gh |
All issue-creating skills. |
jq |
git-guardrails-claude-code hook script. |
pnpm, ai-hero-cli |
scaffold-exercises. |
npm / pnpm / yarn / bun |
setup-pre-commit (auto-detected). |
@total-typescript/shoehorn |
Installed by migrate-to-shoehorn. |
12.5. Per-skill file footprint
| Skill | Lines (SKILL.md) |
Companion files |
|---|---|---|
design-an-interface |
94 | — |
edit-article |
14 | — |
git-guardrails-claude-code |
95 | scripts/block-dangerous-git.sh |
github-triage |
175 | AGENT-BRIEF.md, OUT-OF-SCOPE.md |
grill-me |
10 | — |
improve-codebase-architecture |
76 | REFERENCE.md |
migrate-to-shoehorn |
118 | — |
obsidian-vault |
59 | — |
prd-to-issues |
88 | — |
prd-to-plan |
107 | — |
qa |
130 | — |
request-refactor-plan |
68 | — |
scaffold-exercises |
106 | — |
setup-pre-commit |
91 | — |
tdd |
107 | deep-modules.md, interface-design.md, mocking.md, refactoring.md, tests.md |
triage-issue |
102 | — |
ubiquitous-language |
92 | — |
write-a-prd |
74 | — |
write-a-skill |
117 | — |