Claude_Skills
CLAUDE.md1 starsChanged 6 months agoMITView on GitHub
A curated collection of custom skills for Claude Code, distributed via symlinks from ~/.claude/skills/. Every SKILL.md must begin with YAML frontmatter between --- delimiters. Schema: the frontmatter is validated against schemas/skill-frontmatter.schema.json (JSON Schema 2020-12) — the machine-readable source of truth for field names, types, and allowed values. The tables below are the human-readable view of that schema. lint.sh runs the validation via check-jsonschema (see Validation). The schema sets additionalProperties: false, so unknown keys (typos, stale fields) are rejected — adding…
- Installs packages
- Commits and pushes
In this repositoryOne other file it gives its agents.
- SKILL_NAMESkill
The file
Show its rules and text
We split this CLAUDE.md into the rules it gives an agent
16 rules. About 0 are common, 2 are distinctive, and 14 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈2
Distinctive · estimate
This author's own choices. Worth a look.
14
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 18
Every SKILL.md must begin with YAML frontmatter between --- delimiters.
- Distinctive: line 75
Use clear step numbering for multi-phase workflows
- Very specific: line 76
Use --- separators between major phases
- Distinctive: line 84
Every skill's README.md must contain these sections (in order):
- Very specific: line 100
Ensure the name field in frontmatter matches the directory name
- Very specific: line 101
Update the skills table in the root README.md (the table cell must match the SKILL.md description verbatim)
- Very specific: line 103
Update CHANGELOG.md with the new skill under ## [Unreleased] — release.yml extracts release notes from this section, so missing the update …
- Very specific: line 104
Run ./lint.sh <name> to validate (and ./lint.sh to confirm no regressions on the other skills)
- Very specific: line 105
Run ./install.sh <name> to create the symlink
- Very specific: line 110
Minimal permissions: Only request the tools the skill actually needs in allowed-tools
- Very specific: line 112
Simplicity bias: Default to a single linear workflow.
- Very specific: line 116
Effort default is
xhigh: Every skill declares effort: xhigh — deep reasoning without max's latency and token cost. - Very specific: line 117
Plan-mode discipline: If a skill enters plan mode, ExitPlanMode must be called BEFORE any Edit/Write operation — file modifications are …
- Very specific: line 131
Do not add commands, agents, or hooks paths unless those directories actually exist.
- Very specific: line 137
Run ./lint.sh to check all skills, or ./lint.sh <name> for a specific skill.
- Very specific: line 155
Every cross-skill handoff target (/<skill>) resolves to an installed skill
≈ “Common” is an estimate: at least 1 in 5 of the 26,980 CLAUDE.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Claude_Skills
A curated collection of custom skills for Claude Code, distributed via symlinks from ~/.claude/skills/.
Architecture
- Each skill lives in
skills/<name>/with at minimum aSKILL.md(consumed by Claude Code) and aREADME.md(human documentation) install.shcreates symlinks from~/.claude/skills/<name>→skills/<name>/in this repogit pullupdates all installed skills instantly because they are symlinkedlint.shvalidates all skills against the conventions belowschemas/skill-frontmatter.schema.jsonis the machine-readable frontmatter contract;skills.jsonis an auto-generated catalogue manifest (tools/generate-manifest.sh) anddocs/handoff-graph.mdan auto-generated handoff diagram (tools/generate-handoff-graph.sh) —lint.shkeepsskills.jsonin sync withskills/.claude-plugin/plugin.jsonmakes the repo installable as a Claude Code plugin as well (see Distribution)
Skill Format Specification
SKILL.md Frontmatter
Every SKILL.md must begin with YAML frontmatter between --- delimiters.
Schema: the frontmatter is validated against schemas/skill-frontmatter.schema.json (JSON Schema 2020-12) — the machine-readable source of truth for field names, types, and allowed values. The tables below are the human-readable view of that schema. lint.sh runs the validation via check-jsonschema (see Validation). The schema sets additionalProperties: false, so unknown keys (typos, stale fields) are rejected — adding a new official Claude Code frontmatter field means adding it to the schema too.
Required fields:
| Field | Description |
name | Skill identifier, must match the directory name (e.g., enhance for skills/enhance/) |
description | One-line summary of what the skill does. Must end with a period and should be verb-first ("Scans...", "Audits...", "Performs..."). The same text must appear verbatim in three places — this field, the skill README's first-line description (line 3), and the skill's row in the root README skills table. lint.sh checks all three: the root-table match is a hard error, the README line-3 match a warning. |
allowed-tools | Comma-separated list of tools the skill may use. The same list (in the same order) must appear in the README's Configuration table Allowed tools row — lint.sh enforces this parity. |
Optional fields (this table tracks the official Claude Code skill spec; fields not used by any skill in this repo are still listed for discoverability):
| Field | Default | Description |
model | (inherits) | Model to use: opus, sonnet, haiku, fable, or inherit to keep the session model. Override applies for the rest of the current turn only. Claude Code also accepts full model IDs, but the schema restricts this repo to the aliases — each alias is a live pointer to the latest model of its tier, so a skill needs no edits when a new Opus ships — only ever de-version prose (never hardcode a number like "Opus 4.7"). lint.sh warns on hardcoded model versions. |
effort | (inherits) | Effort level: low, medium, high, xhigh, max (there is no min). Available levels depend on the model. Every skill in this repo declares xhigh — see Quality Standards. |
argument-hint | (none) | Hint shown during autocomplete (e.g., [path | identifier]). The README's Configuration table Argument hint row must match this — lint.sh enforces parity. Replaces the legacy repo-internal takes-arg field, which was never recognized by Claude Code; lint.sh now warns on takes-arg. |
arguments | (none) | Named positional arguments for $name substitution in the body (e.g., arguments: [target, mode] enables $target and $mode). |
disallowed-tools | (none) | Tools removed from Claude's pool while the skill is active (comma-separated string or list). The complement of allowed-tools — useful when a skill inherits a broad session toolset but must never, say, Write. |
when_to_use | (none) | Additional trigger-phrase guidance for auto-invocation. Appended to description in the skill listing, which is budgeted per session (skillListingBudgetFraction, default ~1% of the context window; per-skill cap skillListingMaxDescChars). lint.sh warns when description + when_to_use exceed 1,536 characters combined. Run /skill-doctor (Claude Code 2.1.261+) to see which loaded skills are never used and what they cost in tokens. |
paths | (none) | Glob patterns that auto-activate the skill when working with matching files (e.g., ["**/*.test.*"]). |
disable-model-invocation | false | Set true to keep the skill strictly user-triggered (does NOT block subagents launched via the Agent tool). Rarely needed — only enhance uses this. |
user-invocable | true | Set false to hide the skill from the / menu (for background-knowledge skills only Claude should invoke). Differs from disable-model-invocation (which is the inverse). |
context | (none) | Set to fork to run the skill in a forked subagent context (skill body becomes the subagent's prompt). |
agent | general-purpose | When context: fork is set, picks the subagent type (Explore, Plan, general-purpose, or any custom agent in .claude/agents/). |
background | true | With context: fork, whether the forked subagent runs in the background. Set false to wait for its result inline. Requires Claude Code 2.1.218+; the schema requires context when background is set. |
hooks | (none) | Skill-scoped hooks, in the same shape as settings.json hooks expressed as YAML (<Event>: [{ matcher, hooks: [{ type: command, command, once?, if?, timeout? }] }]). Registered when the skill is invoked and kept for the rest of the session unless a handler sets once: true. ${CLAUDE_SKILL_DIR} is not expanded in hook commands (only ${CLAUDE_PROJECT_DIR} is), so keep skill hooks inline-shell — a ./scripts/... path would resolve against the user's cwd, not the symlinked skill directory. github-ship and idiom-check use a PreToolUse guard on Bash that blocks --no-verify and force-pushes. See the Claude Code hooks docs. |
shell | bash | Shell for !`command` blocks. bash (default) or powershell (requires CLAUDE_CODE_USE_POWERSHELL_TOOL=1). |
metadata | (none) | Free-form YAML map for custom data; Claude Code ignores it. |
license | (none) | License identifier for the skill (Agent Skills spec; informational). |
compatibility | (none) | Environment requirements, max 500 characters (Agent Skills spec; informational). |
Boolean fields accept true/false/yes/no/on/off/1/0 in any case; the schema and this repo use true/false only.
Body substitutions and dynamic context injection (Claude Code features the body can use):
| Construct | Description |
$ARGUMENTS | All user-supplied arguments as a single string. If absent from the body, Claude Code auto-appends ARGUMENTS: <value> to the rendered skill content. |
$0, $1, ... / $ARGUMENTS[N] | Positional arguments by 0-based index (shell-style quoting); $ARGUMENTS[N] is the long form of $N. |
$<name> | Named argument declared in the arguments: frontmatter list. |
\$ | Escapes a literal dollar sign before a digit or name (e.g. \$1.00, \$HOME) so it is not substituted. |
${CLAUDE_SESSION_ID} | Current session ID. |
${CLAUDE_EFFORT} | Active effort level (low/medium/high/xhigh/max). Lets the skill adapt its depth to the session's effort setting. |
${CLAUDE_SKILL_DIR} | Directory containing the skill's SKILL.md. Use to reference bundled scripts regardless of cwd (body only — not expanded inside hooks commands). |
${CLAUDE_PROJECT_DIR} | Project root where the session started. The only path placeholder also expanded inside hook commands. |
${CLAUDE_PLUGIN_ROOT}, ${CLAUDE_PLUGIN_DATA} | Plugin installation directory and persistent data directory — only when the skill is loaded as part of a plugin (see Distribution). |
!`<command>` | Dynamic context injection — runs the shell command BEFORE Claude reads the skill, and the output replaces the placeholder. Use for deterministic, side-effect-free context-gathering. Multi-line variant: ```! fenced block. |
Migration note: The legacy takes-arg field is repo-internal only — Claude Code's official spec uses argument-hint (autocomplete display) and/or arguments (named substitution). Skills should declare argument-hint instead; lint.sh warns if takes-arg is still present.
SKILL.md Body
The body contains the prompt that Claude follows when the skill is invoked. Conventions:
- Use clear step numbering for multi-phase workflows
- Use
---separators between major phases - The first instruction should be the canonical line
Call `EnterPlanMode` immediately before doing anything else.wheneverEnterPlanModeis declared inallowed-tools(lint.shenforces matched-pair body references for bothEnterPlanModeandExitPlanMode) - If the skill uses subagents, the analysis step runs them as a
Workflowof exactly 3 read-only Explore agents (an embedded script beginning withexport const meta = {...}whoseagent()calls passagentType: 'Explore'and omitmodel), with theAgenttool as the fallback when the Workflow tool is unavailable (subagent_type: "Explore",model: "opus"). Declare bothAgentandWorkflowinallowed-tools, and include the canonical IMPORTANT block verbatim fromcreate-skillR4 explaining Explore read-only safety on both paths.lint.shwarns when this block is missing, fails a body that embeds a script without declaringWorkflow, and warns when the script's agents are notExplore. - The script never duplicates the agent checklists — each
### Agent N: <Title>section stays the single source of truth for its brief, and the script'sLENSESarray references those briefs - Agent subheadings use
### Agent N: <Title>(not**Agent N:**)
README Convention
Every skill's README.md must contain these sections (in order):
- Title —
# <Skill Name>followed by a one-line description on line 3 that matches the SKILL.mddescriptionfield verbatim (lint.shenforces this) - What It Does — Describe the workflow and phases. Use "delivered in N steps:" for step-numbered skills or "Runs a strategic N-phase analysis…" for phase-numbered skills.
- Requirements — Model access, dependencies, prerequisites
- Usage — How to invoke. Examples must use the skill's actual name (
/<skill-name>—lint.shenforces this). - Configuration — Table of frontmatter settings with required rows:
Model,Effort,Argument hint,Allowed tools. TheAllowed toolsrow must list the same tools as the SKILL.mdallowed-toolsfrontmatter (lint.shenforces this parity). TheArgument hintrow should mirror the SKILL.mdargument-hintfrontmatter value, or sayNofor skills that take no argument. - Safety (if applicable) — What the skill can and cannot modify
See skills/enhance/README.md as the reference implementation.
Adding a New Skill
- Copy
templates/SKILL.mdandtemplates/README.mdtoskills/<name>/ - Fill in the SKILL.md frontmatter and prompt
- Fill in the README.md sections
- Ensure the
namefield in frontmatter matches the directory name - Update the skills table in the root
README.md(the table cell must match the SKILL.mddescriptionverbatim) - Regenerate the manifest:
bash tools/generate-manifest.sh > skills.json. If the skill offers or receives a handoff, also regenerate the graph (bash tools/generate-handoff-graph.sh) and update the README graph block anddocs/handoff-graph.md.lint.shfails ifskills.jsonis stale - Update
CHANGELOG.mdwith the new skill under## [Unreleased]—release.ymlextracts release notes from this section, so missing the update silently breaks the next release - Run
./lint.sh <name>to validate (and./lint.shto confirm no regressions on the other skills) - Run
./install.sh <name>to create the symlink - Commit and push
Quality Standards
- Minimal permissions: Only request the tools the skill actually needs in
allowed-tools - Clear description: The
descriptionfield should be understandable without reading the full prompt; verb-first phrasing preferred ("Scans...", "Audits...", "Performs...") - Simplicity bias: Default to a single linear workflow. Only fan out to subagents when there are three genuinely orthogonal analysis lenses (see
skills/create-skill/SKILL.mdR4 — Subagent Decision Gate).github-shipis the canonical example of a subagent-free skill. - Three-agent Workflow by default: When a skill does fan out, its default path is a single-round
Workflowof exactly 3 read-only Explore agents in parallel — one per lens — with theAgenttool kept only as the fallback when the Workflow tool is unavailable or disabled (disableWorkflows). The Workflow tool requires an explicit opt-in, and a skill body instructing the call is one of its documented opt-ins, so noultraargument is needed for this tier. Keep it to three agents and one round;parallel()is the right primitive because the synthesis step needs all three reports together. Passschema(a JSON Schema mirroring the skill's "structured format" list) whenever the finding shape is regular —vet,refactor,docstring-check, andidiom-checkdo, so each agent's return is a validated{ findings, looks_good }object rather than free text; omit it for heterogeneous digests (enhance,github-audit,dep-check,test-gen,diagnose), where agents return text in the skill's structured format. - Opt-in
ultratier: Anything heavier than that single round — loop-until-dry discovery, adversarial verify panels, worktree-isolated parallel edits, budget-scaled fan-out — belongs behind an explicit opt-in (anultraargument, or the user running ateffort: max), never the default invocation, because it spawns many subagents and consumes far more tokens.vetis the reference:/vetruns the 3-agent Workflow,/vet ultraextends it with a find → adversarial-verify → synthesize pipeline.github-shipis the reference for skills that should never orchestrate. DeclaringWorkflowinallowed-toolsis a capability declaration, not a harness-gated trigger — the skill body's instruction (default tier) or the user's argument (ultra tier) is what opts in. - Safety-conscious: Skills that launch subagents use read-only agent types during analysis phases on both paths —
agentType: 'Explore'inside a Workflow script (omitmodel; Explore inherits the session model, capped at Opus),subagent_type: "Explore"withmodel: "opus"on the Agent-tool fallback. Nevergeneral-purposeduring analysis. - Effort default is
xhigh: Every skill declareseffort: xhigh— deep reasoning withoutmax's latency and token cost.maxis reserved for the user's own session setting or anultratier; skills should read${CLAUDE_EFFORT}to scale depth down atmedium/lowrather than up. - Plan-mode discipline: If a skill enters plan mode,
ExitPlanModemust be called BEFORE any Edit/Write operation — file modifications are blocked while plan mode is active - Self-contained: Each skill directory should contain everything needed; avoid cross-skill dependencies
- Cross-skill handoffs: When a skill's primary action naturally chains into another installed skill (e.g.,
/vet→/refactor,/diagnose→/test-gen,/refactor→/test-gen), declareSkillinallowed-toolsand add a "Skill handoff" offer after the primary action completes. Offer the handoff only when there's genuine signal that the next skill adds value — never as a generic catch-all. The user must approve before the handoff fires. - Dynamic context injection where deterministic: When a skill's first step gathers context that does not depend on the user's argument (e.g.,
git rev-parse --abbrev-ref HEAD,gh repo view --json ...,ls package.json Cargo.toml ...), pre-render that context in the skill body using!`<command>`(or fenced```!for multi-line). The harness runs the command BEFORE Claude reads the skill content, replacing the placeholder with the output — so Claude sees the pre-rendered values immediately and skips the redundant Bash round-trip. Use only for fast, side-effect-free, idempotent commands (nogit push, nogh pr create, nonpm install). For commands that depend on the user's argument or runtime decisions, keep them in the body so Claude can run them conditionally.
Distribution
Two install paths, both driven by git pull:
- Symlinks (
install.sh) —~/.claude/skills/<name>→skills/<name>/; skills are invoked as/<name>. The original and default path. - Plugin — the repo root carries
.claude-plugin/plugin.json(nameclaude-skills), so a clone placed under a skills directory (e.g.~/.claude/skills/claude-skills/) loads as the pluginclaude-skills@skills-dirwith no install step; skills are namespaced/claude-skills:<name>.skillsis left unset in the manifest because the defaultskills/directory is exactly our layout.
Manifest rules:
versionmust equal the latest released version inCHANGELOG.md—lint.shfails on drift, andrelease.ymlrefuses a tag whose version differs from the manifest. Bump it in the same commit that moves[Unreleased]to a version heading.- Do not add
commands,agents, orhookspaths unless those directories actually exist; the validator treats a dangling path as an error. claude plugin validate ./skills --strict(skills, strict) andclaude plugin validate .(manifest) run in CI. The root run is intentionally non-strict: the validator warns that the developmentCLAUDE.mdis not shipped as plugin context, which is correct and not a defect.- Inside a plugin,
${CLAUDE_PLUGIN_ROOT}and${CLAUDE_PLUGIN_DATA}become available to hook commands and bodies; skills in this repo must still work on the symlink path, so never depend on them.
Validation
Run ./lint.sh to check all skills, or ./lint.sh <name> for a specific skill. The linter checks:
- Required frontmatter fields exist (
name,description,allowed-tools) - Skill name matches directory name
- Description ends with a period
description+when_to_usestay within the 1,536-character skill-listing cap (warning)EnterPlanModeandExitPlanModeare paired inallowed-toolsAND referenced in the body when present- Canonical IMPORTANT subagent block is present and well-formed (contains both
subagent_type: "Explore"andmodel: "opus") whenAgentorWorkflowis paired with Explore subagents (subagent_type: "Explore"oragentType: 'Explore'in the body) - A body embedding a Workflow script (
export const meta = {...}) declares theWorkflowtool (hard error otherwise); a skill declaringWorkflowactually embeds a script (warning otherwise); and the script'sagent()calls passagentType: 'Explore'so the fan-out stays read-only (warning otherwise) - README.md exists with required sections
- README line 3 description matches SKILL.md
descriptionverbatim - Usage examples invoke the correct
/<skill-name>(not stale names or unrelated commands) - Configuration table has
Argument hintandAllowed toolsrows Allowed toolsrow matches SKILL.mdallowed-toolsfrontmatter (whitespace-normalized)- Warns if a SKILL.md still declares the legacy
takes-argfield (useargument-hintinstead) - Warns if a SKILL.md or README hardcodes a model version in prose (e.g.
Opus 4.7) — theopusalias already resolves to the latest model, so de-version it - Frontmatter validates against
schemas/skill-frontmatter.schema.jsonviacheck-jsonschema— typed enums (model,effort,shell,context), unknown-key rejection, andagentrequired whencontext: fork - Root README skills-table description matches the SKILL.md
descriptionverbatim (hard error) - Every cross-skill handoff target (
/<skill>) resolves to an installed skill - A body offering a Skill handoff declares the
Skilltool, and a skill declaringSkillactually offers a handoff - Finding-ID prefixes (e.g.
[C1]) are unique across skills - Body section style (
## Phase Nvs## Step N) matches the README's "N-phase" / "N steps" phrasing skills.jsonis in sync with a freshtools/generate-manifest.shrun.claude-plugin/plugin.jsonversionequals the latest released version heading inCHANGELOG.md
Schema validation requires check-jsonschema (pip install check-jsonschema); it runs in CI and is skipped locally with a [note] if the tool is absent, so a clean local run stays green either way. The skills.json sync and plugin-version checks require jq. CI also runs Claude Code's own validator (claude plugin validate ./skills --strict) as a second opinion from the real frontmatter parser — run it locally whenever you add a frontmatter field.
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.

