claude-skills
CLAUDE.md1 starsChanged 3 months agoMITView on GitHub
This is a library of Claude Code skills (skills/<name>/SKILL.md) plus a small Node CLI (bin/, lib/) that installs them. The skills are the product; the CLI is plumbing. There is no build step and no linter. Formatting is by hand; match the surrounding file.
In this repository38 other files it gives its agents.
- api-contract-reviewSkill
- autopilotSkill
- backlog-plannerSkill
- codebase-explainerSkill
- code-reviewSkill
- context-dietSkill
- conventional-commitsSkill
- create-prSkill
- design-briefSkill
- diagnoseSkill
- dotnet-conventionsSkill
- dotnet-onion-apiSkill
- draw-optionsSkill
- e2e-verifySkill
- githubSkill
- goal-runnerSkill
- grill-with-docsSkill
- handoffSkill
- humanizerSkill
- improve-codebase-architectureSkill
- maestro-mobile-testSkill
- migration-safetySkill
- model-inventorySkill
- nextjs-app-routerSkill
- plan-and-buildSkill
- record-browser-testSkill
- regression-huntSkill
- safe-refactorSkill
- security-reviewSkill
- ship-itSkill
- sql-reviewSkill
- task-executorSkill
- tauri-2-appSkill
- think-like-fableSkill
- upgrade-depsSkill
- worktree-sandboxSkill
- write-a-skillSkill
- write-testsSkill
The file
We split this CLAUDE.md into the rules it gives an agent
3 rules. About 0 are common, 1 is distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 39
No new npm dependencies without a reason stated in the PR.
- Very specific: line 45
Do not commit, push, tag, or release unless asked.
- Distinctive: line 46
Run identifier scans in a separate command from git commit.
≈ “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.md — working in this repo
This is a library of Claude Code skills (skills/<name>/SKILL.md) plus a small Node CLI (bin/, lib/) that installs them. The skills are the product; the CLI is plumbing.
Commands
npm test # node --test test/cli.test.js test/skills.test.js test/draw-options.test.js test/context-diet.test.js — run before reporting any change done
node bin/claude-skills.js list # what the CLI renders from skills/*/SKILL.md frontmatterThere is no build step and no linter. Formatting is by hand; match the surrounding file.
Rules for skills
- Skills are independent. A skill may reference another skill only if it lives in this repo's
skills/, always as "if installed" with a complete inline fallback. Never reference, depend on, or credit third-party skill packs (superpowers, gsd, plugin skills). Grepskills/for external names before finishing. A skill that composes with several others (seeautopilot) lists them in a routing table — one row per skill with an observable predicate, a probe command that decides present/absent, and the inline fallback — and its report carries a "Skills used" slot, so a present skill cannot be skipped silently: "if installed" alone was observed to let a weaker model take the fallback with the skill present. - Frontmatter is real YAML.
name:equals the directory name.description:is at most 1024 characters and is written as a folded block scalar (>-) when it wraps; the CLI parser strips the indicator (lib/skills.js) andtest/skills.test.jsfails if one leaks. Validate with a real YAML parser when in doubt, not onlynpm test. - Descriptions say what, never how. Outcome and scope in the first sentence, then
Use this skill whenever the user says "…", "…", "…" — even if they don't name the skill, then optional non-triggers naming the near-neighbor skill. No workflow steps in the description — a model that reads the steps skips the body. Three trigger phrases is the floor. - Bodies are written for the weakest executing model. Every load-bearing rule carries a ❌/✅ pair. Every assertion the skill asks for has an evidence gate. Report-producing skills state that zero findings is a valid outcome. Command-running skills state that an unobserved result is
not run, neverpassed. Prefer a required slot in a template over a prose reminder, and a conditional on an observable predicate over a rule with exemptions. - Keep
SKILL.mdnear 150 lines; long reference material goes toskills/<name>/references/._template/SKILL.template.mdat the repo root is the scaffold (it lives outsideskills/on purpose so it is never published or installed). A skill that runs tools keeps them inside its own directory —scripts/for executables,docker/for container build contexts,assets/for config templates — andinstallcopies the whole directory, so they ship.record-browser-testpredates this and keeps its Node scripts inreferences/; match the skill you are editing. - The
write-a-skillskill is the authoring path. It encodes the rules above, requires a baseline-versus-skill behavior test for discipline skills, and updates the README table. Use it rather than hand-writing. - Nothing sensitive lands here. This library is public and its history is permanent, so credentials and tokens, personal data (names, emails, usernames, paths carrying them), internal hostnames and IP ranges, real repo/system/database names, organization and client names, ticket numbers, and real record IDs never enter a skill — not in an example, not in a reference file, not in a commit message. Use placeholders (
<org>,example.invalid,<repo>,~/projects/<name>) and invent examples rather than sanitizing real ones; a redacted real case still leaks its shape. Porting a skill in from another machine is where this breaks, so check the draft before saving —write-a-skillstep 9 carries the class list. Every skill should read as if anyone could have written it, anywhere. A skill that is only useful with a real host, path or IP does not belong in this library at all: keep it in a separate private skills folder outside this repo and link it into~/.claude/skillsthe way the library skills are linked (a junction on Windows, a symlink elsewhere). - A skill change is not done until the docs match — standing rule. Any edit under
skills/(new skill, rename, removal, or a material change to what a skill does or how it composes with others) is finished only when, in the same change:README.mdis updated: the skill's row in the skills table (alphabetical, long-form voice, links to the skills it composes with), the "Which skill?" routing tables if the routing changed, and the "How the skills fit together" section plusdocs/skills-flow.svgif the flow changed.CLAUDE.mdis updated if the change adds or alters a convention, a command, a file location, or the flow described here.npm testpasses —test/skills.test.jsfails when a skill directory has no README row, so the row is enforced; the rest is on you. Before reporting done, re-read both files' affected sections and state what you updated.
- A skill that runs tools is verified in three layers, and the report names which ran. (a) Parse-check: PowerShell with
[System.Management.Automation.Language.Parser]::ParseFile, Node withnode --check. (b) A logic harness: a throwaway directory with real git repos, a fake CLI first onPATH(adocker.ps1that appends its arguments to a log and answersps), and assertions on what was generated or called — cover every branch, including the refusals. (c) One real run of the whole lifecycle — start, observe, stop, clean up — against the real dependency, leaving the host exactly as found. Layer (c) must exercise every distinct way the tool talks to the real dependency (each protocol, each endpoint), because a stub answers whatever it was written to answer: a browser-control call that only ever ran against a stub isnot run, even when its output said success. Every such call checks the response and fails loudly; never swallow an empty one. A layer that was not run isnot run. Tools never modify tracked files in the user's application repo, say where they keep state, and refuse to run on placeholder config.
Skills that ship tooling
worktree-sandbox—scripts/wt.ps1(PowerShell 7),docker/browser/(a Chromium image with a noVNC live view and a CDP endpoint),assets/config.example.json,references/. Contracts a change must not break: the application repo's tracked files are never written (the only repo-side change is the worktree entrieswtcreates); one stack per branch, each with its own slot and ports; worktrees are named<repo>-wt-<branch without feature/>; a new branch starts from the fetchedbase; shared base worktrees refresh only when behind and only the service on them restarts;docker.contextplusdocker.pathMaptranslate every bind path and refuse a path the daemon cannot see; a newly started stack opens its pages (startUrlplusextraUrls) only once their services answer, andwt reloaddoes the same;wt dashboardis a self-updating page that probes every slot's live-view port and re-reads the slot-to-branch names from a small filewtrewrites on everyupanddown -Purge(tiles and names update with no reload) and needs no tooling beyond the script;hooks.afterUpruns once for a newly started stack (never when it was already running, never with-NoHook) and only warns when it fails. Verify with the harness in rule 9: the stubdocker.ps1, throwaway repos, and a bare repo acting asoriginsodevelopcan be moved between runs.dotnet-conventions—scripts/audit.sh(bash; git and, for the analyzer pass, the dotnet SDK) and eight files inreferences/. Contracts a change must not break: the script audits only lines added sinceHEAD(modified tracked files plus new untracked.csfiles), maps each changed file to its nearest.csproj, builds with analyzers only on SDK-stylenet5.0+ projects and reportsCA1849,CA2016,CA1031,CA2200,CA2000on added lines, says why it skipped anything, and exits 1 on a hit; a .NET Framework target never raisesTargetFrameworkorLangVersion; existing code is never edited except an optionalCancellationToken ct = defaultparameter; the five report slots stay required. Verify with a throwaway git repo per case (clean, swallowing catch, blocking call, untracked file,src/andtests/layout, .NET Framework skip) and fixture runs scored from the diffs, not from the agent's report.draw-options—scripts/oc.mjs(Node 20+, no packages), layout builders inassets/(common.jspluscolumns.js,matrix.js,tree.js, concatenated behind aconst SPEC = …line and run inside the app), andreferences/protocol.md. Contracts a change must not break:checkruns first and a non-readystate ends the canvas path withCanvas: not run; files are created byopenunder the task name in~/.claude/diagrams/(never inside a repo, never renamed afterwards); the skill only draws on a document it created or opened itself;drawvalidates the spec before contacting the app (unknown keys are errors), lints only the shapes it made, and throws on a remaining lint (the app rolls the draw back);removedeletes only a.tldrawfile directly inside the folder (links are resolved) and only with--yes;recommendedis only ever an option name the user chose; the scripts carry no comments and no machine-specific path; the skill never names another skill pack. Verify withtest/draw-options.test.js(a stub HTTP server and a fake app-data folder cover the preflight states, the open/draw/finish/list/remove paths and their refusals; a fake editor runs the layout builders and checks their geometry), then one real run against the installed app pointed at a temp folder with a screenshot read — that layer isnot runanywhere the app is not installed, and only Windows has been run.context-diet—scripts/diet.mjs(Node 20+, no packages) with its modules inscripts/lib/, akeep.jsontemplate inassets/, andreferences/transcript-format.md. Contracts a change must not break:scanstreams~/.claude/projects/and emits only names, counts, sizes and dates, never transcript content; a use counts towardusedand the percentage only in sessions where the item was listed; an unlisted use of a local skill still counts towarduses(so such a skill is never a candidate), and a bare-name use credits the plugin of any listedplugin:nameentry with that base name; and use of a plugin's MCP tool counts for the plugin even when its server was not listed (a real-history scan caught this once, so the real scan layer must not be skipped); a plugin that supplies aPreToolUsehook, a plugin that supplies any hook, and anything inkeep.jsonis never a candidate, andapplyrefuses protected ids; a plugin's hooks are read fromhooks/hooks.jsonand fromplugin.json(a path, an array of paths, or inline), a hook without a command still counts as a guard, and a plugin whose declared hooks cannot be read is protected, never a candidate;applywrites its manifest before changing anything, backs upsettings.json, removes a link without touching its target, moves a real skill folder into the tool's own quarantine with a verified content hash (never the OS temp directory), refuses a git-tracked folder, and never moves a plugin's files;applytakes a before-probe (the skill text calls it the before-snapshot) and then runsverify, which takes an after-probe, both throughclaude -p --session-idspawned without a shell, deleting each probe transcript, and reportspassonly when every entry is gone, nothing else disappeared, and the guards are intact (an unobserved check isnot-observedorincomplete, never a pass); an MCP server that differs between the two probes and is not part of a changed plugin is reported asunstable, rerunand caps the verdict atincompleteinstead of failing it, because servers can start intermittently (a real run saw this), while a skill, agent or hook that disappears still fails;purgeneeds--yesand a passing verify; the printed report slots, theCoverage:andVerdict:labels, section names (Removal candidates,Rarely used,Review by hand,Protected,Guard hooks,Same skill under several names), column names (listed,used,last seen), the protection reason text, per-item statuses (GONE,STILL PRESENT,NOT OBSERVED),FORMAT UNRECOGNIZED,unstable, rerun, verdict spellings (printed upper-case,PASSFAILINCOMPLETENOT-OBSERVED; lower-case in--json) and exit code 2 meaning "nothing it can judge" (exit codes 0/3/4/5 distinguish pass/fail/not-observed/incomplete) are quoted bySKILL.md, so changing any of them means updating the skill text in the same change; a skill name must be a single path segment and a skill path must sit directly in the personal skills folder of the configured home or in a<project>/.claude/skillsfolder (no..segments, no prefix-sharing siblings), both inapplyand inrestore(which also confines a quarantined copy to the quarantine folder);scanaborts on an unreadablekeep.jsonorsettings.json, and an unreadable transcript is skipped and counted on theCoverage:line;applyrecomputes protection fromkeep.json, the installed plugins andsettings.jsoninstead of trusting the report, and refuses to change anything whenclaudecannot be started unless--allow-unverified; state files are written atomically (a temp file renamed over the target;settings.jsonis edited through its real path, keeping its bytes, mode and line endings) with owner-only permissions where the OS supports them; errors print one-line messages andCONTEXT_DIET_DEBUG=1prints stacks; the scripts carry no comments and no machine-specific path. Environment:CONTEXT_DIET_HOMEis the whole Claude home (projects,settings.json, plugins and the state folder), wins overCLAUDE_CONFIG_DIR, and is passed to the probe asCLAUDE_CONFIG_DIR;CONTEXT_DIET_CLAUDEis a path to a.jsstub run through node (a test hook only);CONTEXT_DIET_SETTLE_MSis the pause between checks for the probe transcript (default 500);CONTEXT_DIET_MODELis the probe model (defaulthaiku);CONTEXT_DIET_DEBUG=1prints stacks. Verify withtest/context-diet.test.js(transcripts, plugins, settings and a stubclaudesynthesized in a temp home; the stub answers differently on its first and second call, so the before and after probes differ), then a real scan over the real history and, with the owner's approval, one real disable-verify-restore cycle on a candidate plugin and a candidate junction. A layer that was not run isnot run.record-browser-test— plain Node scripts inreferences/(Node 22+, Chrome found automatically, nothing to install, no network). Contracts: output goes outside every repo (~/.claude/recordings/),--rehearseruns the checks without recording,play-check.mjsmust replay the finished file, the receipt page is self-contained, and a default run is headless and opens nothing (--foregroundand--openare opt-ins) so it never takes the user's cursor or focus. Verify with a rehearsal, one real recording, and the play-check.
Rules for the CLI
- No new npm dependencies without a reason stated in the PR; the parser in
lib/skills.jsis deliberately hand-rolled. - Behavior the README documents is a contract:
list,installed,install,remove, the-g/-p/-fflags. Add a test intest/cli.test.jsfor any new flag or output.
Git
- Commits are authored solely by Dennis Rongo. No
Co-Authored-Bytrailers and no attribution to Claude. - Do not commit, push, tag, or release unless asked. Releases follow the "Releasing" section of the README (
npm version, push with tags, GitHub Release triggers npm publish). - Run identifier scans in a separate command from
git commit. A commit-time scrub hook matches the scan's own pattern text and blocks the commit even when the files are clean; scan first, then commit with a plain command line. - Working files created while running skills (
.claude/design-briefs/,.claude/goal-runner/,.claude/handoffs/,.claude/worktrees/) are project scratch. Keep them out of commits unless deliberately promoting a brief to documentation.
Evaluating a skill change
A skill edit is verified when a fresh sub-agent on a weaker model, given a real task in an isolated worktree, behaves differently with the skill loaded than without it, and the difference is the one the edit intended. Record what was observed. A skill you never watched change behavior is documentation. For a skill that drives real tools, give the two agents the scenario as a plan-only task (no execution) and compare what they would run, then do one real run yourself — the plan test shows the decisions, the real run shows the tool.
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.

