Claude Code skills + subagents: grilling, handoffs, kanban workflow, pair (manager+implementer), and an unattended orchestrator with a merge gate. MIT.
Overview
Krish's Claude Code skills, subagents and dev config. A personal collection of Claude Code skills, subagents and dev config, shared here so you (or I, on another machine) can install and use them too. A is a directory with a SKILL.md that Claude Code loads into the current conversation when it decides the skill applies (or when you type / ). A is a .md file that defines a separate worker with its own context window, model, tool allowlist and preloaded skills; Claude spawns it for isolated work. Skills are "how to do X"; agents are "who does X, with what permissions". Every skill folder has two files: SKILL.md is the prompt Claude follows (frontmatter + instructions), and README.md is for you: what it does, when to use it, how to invoke it, how it works step by step, and an example. Agents are documented together in agents/README.md; each agents/ .md is the definition Claude loads. Start with the READMEs; open a SKILL.md only to see or change exact behaviour. New to the repo?
README
skills
Krish’s Claude Code skills, subagents and dev config.
A personal collection of Claude Code skills, subagents and dev config, shared here so you (or I, on another machine) can install and use them too.
A skill is a directory with a SKILL.md that Claude Code loads into the current conversation when it decides the skill applies (or when you type /). A subagent is a .md file that defines a separate worker with its own context window, model, tool allowlist and preloaded skills; Claude spawns it for isolated work. Skills are “how to do X”; agents are “who does X, with what permissions”.
How to read this repo
Every skill folder has two files: SKILL.md is the prompt Claude follows (frontmatter + instructions), and README.md is for you: what it does, when to use it, how to invoke it, how it works step by step, and an example. Agents are documented together in agents/README.md; each agents/.md is the definition Claude loads. Start with the READMEs; open a SKILL.md only to see or change exact behaviour.
Start here
New to the repo? Check the prereqs, install, then try one skill.
| Need | Why | Check |
|---|---|---|
| Claude Code | runs every skill and agent here | claude --version |
gh CLI, authenticated, origin on GitHub |
pair, meta-orchestrator, pr-watch, gap-scan and everything under kanban/ read and write GitHub; kanban/, wayfinder and pr-watch stop with a message on a non-GitHub remote (kanban Projects boards also need gh auth refresh -s project -s read:project once). Every gh call names origin’s repo (-R); on a fork clone, where bare gh defaults to the parent, skills ask which repo to write to and never write to the parent without a yes naming it (Target repo) |
gh auth status |
| Python 3.8+ | the lint step of the install, scripts/build_site.py, and the guard-git hook that stops agents pushing to main or merging |
python --version |
| Git Bash (Windows only) | the guard-git hook is a POSIX sh command; without it the hook fails open, so the installer refuses |
sh --version |
Which skill first
grill-docs: zero setup, and it leaves a decision record (skilleddocs/decisions.mdunless the repo has its own) the other skills read. Good for seeing what a skill writes.pair: one task end to end in an isolated worktree, you push at the end. The smallest taste of the agents.meta-orchestrator: a whole backlog unattended. Try it last; it is the most autonomous and builds on the two above.
60-second quickstart
In Claude Code:
/plugin marketplace add KrishP147/skills
/plugin install krish@krish
Then (in a new session if it isn’t listed yet) type /krish:grill-docs . Prefer plain /grill-docs names, or no plugin? Use the install script instead (pick one, not both): Install, which also covers flags and the repo-scrub / kanban extras.
Three ways to run work
| Tier | You type | Sessions | For |
|---|---|---|---|
| Solo | /next → implement yourself → /session-handoff → /update-progress |
you, a fresh terminal per step | learning the loop; small repos |
| Pair | /pair |
one interactive session; a manager agent and its implementer run inside it |
one task on any repo (OSS forks included), no board needed |
| Orchestrated | /meta-orchestrator |
one top-level session looping planner → manager → merge gate → verifier, handing off to a fresh orchestrator every N merges | a whole backlog, unattended |
Each tier builds on the one above: pair is one orchestrator loop without the board, and the orchestrator’s default shape: pair runs pair’s manager once per issue (flat skips the manager; swarm batches trivial issues onto haiku implementers).
What’s here
| Skill | What it does | Prereqs |
|---|---|---|
repo-scrub |
Scans a GitHub repo’s full git history for secrets and oversized files, lets you pick exactly what to scrub, rewrites history safely, and only then flips the repo private → public. User-invoked only (/repo-scrub). |
gh, gitleaks, git-filter-repo |
grilling (Matt Pocock) |
Interviews you relentlessly, one round of questions at a time with a recommendation attached to each, until a plan or decision is fully stress-tested. | none |
grill-me (Matt Pocock) |
Short alias for grilling. User-invoked only (/grill-me); Claude auto-invokes grilling instead. |
none |
grill-docs |
grilling with a paper trail: writes the Q→A transcript to skilleddocs/grills/ as each round settles and appends every decision to the repo’s decisions doc (default skilleddocs/decisions.md), so planners, verifiers and teammates can read what was decided and why. |
none |
wayfinder (adapted from Matt Pocock’s wayfinder) |
Plans an effort too big for one session: a wayfinder:map GitHub issue whose sub-issues are decision tickets (research, prototype, grilling, task), resolved one per session until the way is clear, then handed to divide for board issues. Kept off the board (next, planner and meta-orchestrator skip wayfinder:*). User-invoked only (/wayfinder). |
gh; grill-docs |
handoff (Matt Pocock, save path modified, commit rule added) |
Compacts the current conversation into a handoff document so a fresh session can pick up where it left off; saved under skilleddocs/handoffs/. User-invoked only (/handoff). |
none |
handoff-auto (derived from Pocock’s handoff; frontmatter, save path and commit rule differ) |
Same document, but callable by the model, so other skills and subagents can end a session unattended. Saved under skilleddocs/handoffs/, committed or not per TRACKING.md. Prints the file path as its last line. |
none |
pair |
Runs one task in an isolated git worktree: resolves the issue (syncs upstream first on a fork, checks the cited files still exist), spawns the manager agent, shows its report, and only then pushes and opens the PR itself. Agents never touch the remote. |
gh; manager + implementer agents installed |
meta-orchestrator |
Runs a repo’s backlog unattended: spawns planner → manager (or implementer with shape: flat, or a swarm of haiku implementers with shape: swarm; implementer model by issue size) → verifier in a loop, holds the merge gate itself (tests + CI green or no merge), reads skilleddocs/ for the design record, appends every event to skilleddocs/orchestrator/ledger.md (committed in the repo, unless docs_commit: uncommitted), and writes orchestrator-handoff.md after a budget of merges so /meta-orchestrator resume continues in a fresh session. |
gh; the four agents installed; a kanban board, status:* labels, or a roadmap doc (whatever next finds) |
lanes |
Sets how many issues a meta-orchestrator run works on at once: predicts each queued issue’s files, groups overlapping issues into the same lane, proposes a count with a token-cost line, and on your yes writes named lanes to scope.md. /lanes | increase | decrease; changes apply at the orchestrator’s next loop. |
a meta-orchestrator run; gh |
progress-report |
Turns the orchestrator’s ledger into a short report covering only what happened since the last one (watermarked, never overlapping): done, what worked, what didn’t, concerns, decisions made on your behalf, manual steps for you. Markdown by default, .docx on request. |
docx skill or python-docx for the Word option |
spend-gate |
Gates any billable action (GPU pods, paid APIs, paid tiers, cloud credits) behind a cost estimate, a live balance check, and an explicit yes for that specific action — a budget cap is never itself approval. Logs every approval to skilleddocs/spend.md. Pairs with the optional hooks/spend-guard.py hook. |
none |
pr-watch |
Watches your open PRs until merged: pulls bot and human review threads (CodeRabbit, Copilot, maintainers), fixes valid ones via pair, replies to or resolves the rest with cited evidence, reports CI (fork action_required = needs maintainer approval, not failing). Every push, reply, resolve, and bot re-trigger is gated on an explicit yes. |
gh; pair’s agents for the fix step |
session-bridge |
Coordinates with another running Claude Code session or agent: finds it (ListAgents, or its transcript under ~/.claude/projects/), takes a read-only snapshot, checks for file/branch/issue overlap and proposes a split, then sends a message only on explicit yes. A reply from another session is never treated as your approval. |
none; ListAgents/SendMessage and gh used when available |
sitrep |
Live, conversational status check in 10 lines or fewer: what’s running, git state, open PRs + CI, an asked-vs-done checklist, needs-you items, and a SAFE/NOT SAFE close verdict. Gated stop-and-handoff on explicit “close”. Read-only otherwise. | gh; background-task tools if available (optional) |
gap-scan |
Surveys one or more repos (sync, README/docs, recent commits, TODOs, tests, open issues, an optional visual pass for UI apps) and returns a ranked, evidence-cited list of gaps, bugs, and extensions as issue-ready items. Read-only: writes one report under skilleddocs/gaps/; creating issues needs an explicit yes. |
gh |
repo-showcase |
Gets a repo’s working tree ready to be seen: rewrites the README around outcome and demo, prunes stale docs, fixes claims the code has outdated, scans for secrets and private names, proposes GitHub metadata. Never touches history or visibility — hands off to repo-scrub for that. |
gh (metadata step only) |
teammate-brief |
Writes a handoff document for a person joining or picking up a project: setup steps verified by running them, an env/keys table (names only, never values), numbered tasks with a “done when” each, an ownership map, and a don’t-touch list. Saved to skilleddocs/briefs/; commits and pushes gated separately. |
gh, optional, for open issues |
score-loop |
Pushes one rerunnable numeric score up or down unattended: builds a local harness that mirrors the grader (correctness check, median of N runs, noise margin from baseline runs), commits one hypothesis at a time on score-loop/, keeps a commit only when it beats the best by more than the margin and git reverts the rest, and logs every experiment to skilleddocs/experiments.md. Stops on budget, deadline freeze or plateau; official submissions stay inside a quota you approve, paid ones go through spend-gate. |
a score you can compute locally |
ponytail (DietrichGebert) |
Lazy-senior-developer mode for the whole session: the smallest change that fully solves the task, plus a closing line on what was skipped and any risk. Levels lite, full (default), ultra; stays on until “stop ponytail”. |
none |
switch |
Runs several Claude Code accounts, one config dir each: claude opens the account you used last, claude- a named one, and /switch [name] ends the session and resumes the same conversation on the previous or named account. A stdlib Python launcher per terminal watches its own request file; setup writes wrappers for bash, zsh, fish, PowerShell 5.1 + 7 and cmd after showing the diff; migrate registers existing ~/.claude-* dirs read-only. `/switch add |
remove |
remind |
Reminders tied to your accounts or a time: when an account’s session or weekly limit resets (time from switch’s usage cache, never guessed), when its usage drops under N%, or at/in a time. Due ones show once at your next prompt on any account via switch’s hook; timed ones also get a desktop notification at the exact time (Windows scheduled-task toast, at on macOS/Linux). /remind list, /remind cancel . User-invoked only (/remind). |
Python 3.8+; switch for account reminders |
find-me-a-skill |
Suggests which skill or sample workflow fits a task (from the text, the conversation, or the top board tasks), with the model and /effort for each step, the points where you decide, and commands to paste. Read-only, runs on Haiku, reads a catalog generated from this repo (python scripts/site_catalog.py). |
none; gh for board mode |
kanban/ — GitHub-Issues-as-kanban-board workflow
| Skill | What it does |
|---|---|
next |
Shows the next work-session task(s), pulled from the board. Read-only. |
session-handoff |
Ends a session: calls handoff-auto, records progress against the board, moves the card |
update-progress |
Verifies a handoff’s claims, updates docs/board/issue from it |
consult-plan |
Grills a new idea or deviation against the existing plan before it goes in |
divide |
Splits an oversized issue into session-sized ones |
kanban-setup |
Bootstraps a GitHub Projects board for a repo; can backfill issues from what’s already documented. User-invoked only (/kanban-setup) because it creates real issues. |
Projects v2 boards need gh auth refresh -s project -s read:project once; label mode doesn’t (see kanban/README.md).
agents/ — subagents pair and the orchestrator spawn
| Agent | Model | Preloads | Guard rails |
|---|---|---|---|
planner (def) |
opus | next, divide |
no Edit/Write; proposes splits, never creates issues; returns a ≤40-line kickoff brief |
manager (def) |
opus | handoff-auto |
spawns its own implementer, reviews the diff and reruns tests itself, restarts a fresh implementer from skilleddocs/HANDOFF.md when one stalls (≤3 rounds); same guard-git.py hook as the implementer; never pushes |
implementer (def) |
sonnet | handoff-auto, session-handoff |
a PreToolUse hook (guard-git.py) is a fail-closed allowlist for the push/merge surface: only a plain feature-branch git push, gh pr create, gh/git reads, gh api GET and local git pass, anything else that could push, merge or write refs/remote state (other push forms, send-pack, gh pr merge, non-GET API calls, gh aliases/extensions, code it can’t read) blocks (details); fails closed (exit 2) when no Python 3.8+ is found; a guardrail, not a sandbox, so enable GitHub branch protection on your default branch (require PRs, no force-push/deletion) as the server-side backstop; on Windows needs Git Bash (hook command is sh; without it the hook fails open, and the install refuses unless -NoShCheck); writes skilleddocs/HANDOFF.md when stuck or past the smart zone; ends with the handoff path |
verifier (def) |
opus | update-progress, consult-plan, next |
verifies against git log/tests/CI, reviews the diff, lists every question it answered on your behalf; no guard hook — may commit doc/board fixes to the default branch |
Full explainer (inputs, outputs, procedure, guard hook): agents/README.md. They also work on their own: “use the planner agent to brief the next issue” is a fine prompt without the orchestrator. Set GUARD_PROTECTED_BRANCHES=main,develop to change what the hook protects. Agents can spawn agents (manager → implementer); only the built-in fork type can’t nest.
hooks/ — optional per-repo hooks
Not auto-installed. smartzone.py is a UserPromptSubmit hook that warns in-conversation when the transcript suggests context has left the smart zone (~75k tokens, SMARTZONE_TOKENS), so a session wraps up instead of degrading. spend-guard.py is a PreToolUse hook that blocks known billable commands/MCP calls (GPU pod creation, paid deploys, …) unless an approval token from the spend-gate skill already exists. Copy + settings snippets in hooks/README.md.
site/ — static skills site
Claude-Code-style terminal home (free-typing slash search: ranked matches, aliases, did-you-mean on typos) plus a plain list of every skill, agent and hook, a / page per entry whose README ## Example renders as a Claude Code session, a /workflows page of sample workflows, a /map page of how everything connects, light or dark with the OS theme, generated from this repo by scripts/build_site.py (stdlib only). Served at www.krishpunjabi.com/skills. Build, test and deploy steps in site/README.md.
Attribution and divergences: Third-party skills. Licence: THIRD_PARTY_LICENSES.md.
Where skills write: skilleddocs/
Every skill or agent here that produces a document writes it inside the repo it is working on, under one directory, so any teammate or fresh session finds it in the same place. Committed only if the repo already tracks skilleddocs/ or opts in via AGENTS.md/CLAUDE.md, never on a fork; otherwise left untracked and git-excluded so it can’t leak into a task PR. Full rule: handoff-auto/TRACKING.md:
skilleddocs/
README.md what each folder holds (template below)
bridge.md cross-session message log — session-bridge
briefs/ teammate onboarding briefs — teammate-brief
decisions.md append-only decision register (D1, D2, ...) — grill-docs, consult-plan, verifier, wayfinder
experiments.md setup header, results ledger and next ideas — score-loop
gaps/ gap-scan reports — gap-scan
grills/ one transcript per grill-docs session
handoffs/ session handoffs — handoff, handoff-auto, session-handoff, implementer
HANDOFF.md short "stuck" note an implementer leaves for a manager (deleted once picked up; never in a pushed branch)
orchestrator/ scope.md, ledger.md, orchestrator-handoff.md, reports/ — meta-orchestrator
pr-watch/ per-pass PR watch logs — pr-watch
reports/ progress reports + .last-reported watermark — progress-report
showcase/ showcase inventory and findings — repo-showcase
spend.md approval log (when, amount, purpose, price source, resource id) — spend-gate
spend-approvals/ one-shot approval files consumed by hooks/spend-guard.py — spend-gate
Rules: local dates in filenames, never UTC; the register is append-only (reverse a decision with a new row); nothing under skilleddocs/ is a spec or a roadmap — plans live wherever the repo keeps docs, and skilleddocs/ points at them. The orchestrator commits its files on the default branch as it goes (docs(skilleddocs): ledger NNN), unless docs_commit: uncommitted (always on a fork, per TRACKING.md). A repo’s AGENTS.md / CLAUDE.md can override any path, so older repos with docs/decisions.md or a reports/ folder keep working. Packaging hazard (untracked mode): git-excluding skilleddocs/ does not hide it from setuptools. In a flat-layout Python project, pip install . fails with “Multiple top-level packages discovered” while an untracked skilleddocs/ sits in the tree. Install from a clean clone, or set explicit packages in pyproject.toml; details in TRACKING.md. Skills that only read or act on GitHub (next, divide, kanban-setup, pair, repo-scrub) write nothing here.
Template for a repo’s skilleddocs/README.md:
# skilleddocs
Documents written by Claude Code skills (github.com/KrishP147/skills). Versioned so agents and people share one record.
- bridge.md — cross-session message log (session-bridge)
- briefs/ — teammate onboarding briefs (teammate-brief)
- decisions.md — append-only decision register; cite as D
- gaps/ — gap-scan reports (gap-scan)
- grills/ — grilling transcripts (asked, recommended, answered)
- handoffs/ — end-of-session handoffs; the newest is the next session's starting brief
- orchestrator/ — meta-orchestrator scope contract, ledger, handoff, manager reports
- pr-watch/ — per-pass PR watch logs (pr-watch)
- reports/ — progress reports and the watermark
- showcase/ — showcase inventory and findings (repo-showcase)
- spend.md, spend-approvals/ — billable-action approval log and one-shot approval tokens (spend-gate)
Plans and specs live in docs/; this folder records how they were decided and carried out.
Install
Pick one of the two. Both at once loads every skill and agent twice (once as /, once as /krish:) and runs the guard-git hook twice.
As a plugin (recommended)
In Claude Code:
/plugin marketplace add KrishP147/skills
/plugin install krish@krish
Skills are namespaced: /krish:pair, /krish:grill-docs, and so on. Agents are krish:manager, krish:implementer, krish:planner and krish:verifier; the skills that spawn them accept either form. The guard-git hook comes with the plugin as a plugin-level hook: it guards only the implementer and manager agents, so your own session can still push. The optional hooks in hooks/ are not part of the plugin; install those by hand. On Windows the hook needs Git Bash, as below; without it the hook blocks nothing. Update with /plugin marketplace update krish. Versions and changes: CHANGELOG.md.
With the install script
Plain names (/pair, manager) and files you can edit in place:
git clone https://github.com/KrishP147/skills.git
cd skills
./scripts/install-skills.sh # bash/git-bash/mac/linux
# or
.\scripts\install-skills.ps1 # Windows PowerShell
This lints the repo, then copies every skill into ~/.claude/skills// and every agent into ~/.claude/agents/ (personal, global: works in every repo, every terminal, no need to clone this repo inside your project). Re-running it is safe: each skill installed by this repo is replaced fresh (it’s marked with a .from-krishp147-skills file dropped in its directory); agents are copied over the existing files, and any *.md in ~/.claude/agents/ that is no longer in this repo is flagged (“stale agent(s) not in repo, remove manually: …”), never deleted, since it may be your own. Likewise a skill dir under ~/.claude/skills/ that carries the marker but is no longer in this repo (renamed or removed) is flagged (“stale skill(s) not in repo, remove manually: …”), never deleted; the warning does not change the exit code.
Skill READMEs are written for GitHub: some of their relative links (e.g. ../../handoff-auto/) don’t resolve in the flat installed copy. That’s by design; the model reads only SKILL.md and its sibling files, and lint keeps those links working after the install.
The lint step needs a real Python 3 on PATH (python, python3, or — on Windows — py -3; a Windows Store Python stub is detected and skipped). No working Python 3 is found → the install fails with a clear message; pass --no-lint (sh) / -NoLint (ps1) to proceed anyway, with a warning, and skip the lint step.
Windows: Git Bash is required. The guard-git hook that stops agents from pushing to main or merging is a POSIX sh command. Without Git Bash, Claude Code can’t run it and the hook blocks nothing (it fails open). So the install checks first, before copying anything: install-skills.ps1 looks at CLAUDE_CODE_GIT_BASH_PATH, then sh/bash on PATH (not WSL’s System32\bash.exe), then bash.exe in the Git for Windows install; install-skills.sh runs command -v sh. Missing → clear error, non-zero exit. Install Git for Windows (or set CLAUDE_CODE_GIT_BASH_PATH to its bash.exe), or pass --no-sh-check (sh) / -NoShCheck (ps1) to install anyway, with a warning.
If a directory with the same name as one of this repo’s skills already exists under ~/.claude/skills/ but has no .from-krishp147-skills marker (i.e. you didn’t get it from here), the install leaves it untouched, warns, and exits non-zero at the end so you notice. Pass --force (sh) / -Force (ps1) to replace it anyway. Upgrading from an install made before the marker existed? Every old skill dir looks foreign, so run once with --force / -Force.
Install one workflow
To take only what one sample workflow uses instead of everything:
./scripts/install-skills.sh --list-workflows # names and titles
./scripts/install-skills.sh --workflow pair-to-pr # repeat --workflow for more
.\scripts\install-skills.ps1 -ListWorkflows # Windows PowerShell
.\scripts\install-skills.ps1 -Workflow pair-to-pr,paid-tests
The workflows are the ones in site/data/workflows.json; every skill, agent and hook is in at least one. A workflow installs the skills, agents and hooks its steps name, plus what they need: skills an agent preloads, skills a selected skill calls or links into, and the guard-git hook whenever an agent is installed (scripts/workflow_deps.py works this out). Hooks from hooks/ are copied to ~/.claude/hooks/ (CLAUDE_HOOKS_DIR to change it) and their settings.json snippet is printed; they are never wired in for you. A different file already there is kept unless --force / -Force.
Nothing outside the selection is touched or warned about: no stale-skill or stale-agent warnings, no other directories changed. Lint, the Git Bash check and the marker / --force rules for the selected skills work as above. An unknown name prints the list, exits non-zero and installs nothing. Resolving a workflow needs Python 3, so --no-lint doesn’t help there: without Python the install stops with an error rather than falling back to installing everything.
Update
Plugin: /plugin marketplace update krish, then restart Claude Code. Install script:
cd skills
git pull
./scripts/install-skills.sh # or .\scripts\install-skills.ps1
The install copies files rather than symlinking, so a git pull alone changes nothing in ~/.claude/ until you re-run the script. An agent removed from the repo stays installed until you delete it; the script’s stale-agent warning names it. Open a new Claude Code session afterwards; agents and skills are read at startup.
Prefer to install by hand, or just one skill? Copy the folder yourself:
cp -r repo-scrub ~/.claude/skills/repo-scrub
cp agents/planner.md ~/.claude/agents/
(.claude/skills// or .claude/agents/ inside a specific repo installs it project-only, for that repo alone.)
For repo-scrub, also install its CLI prerequisites:
# Windows
winget install --id Gitleaks.Gitleaks -e
pip install git-filter-repo
# mac / linux
brew install gitleaks git-filter-repo
For anything under kanban/:
gh auth refresh -s project -s read:project
Lint
python scripts/lint.py
Checks every SKILL.md and agent file (agents/README.md is docs, skipped by lint and install): frontmatter present, name matches the folder, description present and ≤1024 chars (YAML >/| block scalars are parsed, incl. a # comment after the indicator and more-indented folded lines; a description that is only the indicator fails), every skill an agent preloads exists and is model-invocable, every relative link in a skill’s prompt files resolves. The install scripts run this first and stop on failure. It also prints non-fatal WARN: lines (stderr) for a skill README missing a required section — see CONTRIBUTING.md.
It also checks every tracked file in the repo for forbidden words, so nothing project-specific or personal leaks in. No word list ships in the repo (it would defeat the point). Configure your own locally:
# untracked repo-root file, one word per line, # comments allowed
echo "acme-internal" > .lint-forbidden.txt
# or a comma-separated env var
SKILLS_LINT_FORBIDDEN=acme-internal,project-codename python scripts/lint.py
Neither set → the forbidden-word check is silently skipped.
Evals
python scripts/evals.py
Validates the trigger and behaviour suites under evals/ and prints the command to run them. It makes no model calls and runs no subprocess. Cases use the built-in claude plugin eval format: evals/-/prompt.md (frontmatter + the user prompt) plus graders/*.md.
- Coverage: every model-invocable skill (found the same way lint finds them, minus
disable-model-invocation: true) needs 3-5triggercases and 2-3near-misscases. A near-miss is a sibling request (sitrepvsprogress-report,grillingvsgrill-docs,nextvsdivide) and asserts that skill did not fire. - Behaviour:
repo-scrubnever rewrites history before the rotation gate,spend-gatenever creates without a yes,pairnever pushes without--pushor a yes. - Graders: free computed types only (
regex,tool_used,tool_order,file_exists).llmandbaselinecall a judge model and fail validation. - A missing suite, a wrong case count, or a malformed grader exits 1.
Running the suite is a real model call on your account, so it is never automatic. Run it by hand from the repo root (needs a plugin manifest at the root):
claude plugin eval . --runs 1 --ablation none --max-cost-usd 10 --no-publish
Behaviour graders check for Bash calls, and eval runs get no Bash unless you grant it (--allow-tools Bash, sandboxed; not on native Windows), so without the grant they only show the skill’s reply. Run output lands in evals/results/; don’t commit it.
Contributing / grow this repo
Contributions welcome — new skills, fixes, better docs. See CONTRIBUTING.md for the submission format (start from templates/skill/) and rules. Feel free to grow it.
Third-party skills
Relation to Matt Pocock’s skills
Several things here come from mattpocock/skills (MIT; notice in THIRD_PARTY_LICENSES.md). Checked against his repo with the GitHub API on 2026-10-15.
- Copied unmodified:
grillingandgrill-me. Hisskills/productivity/grill-meandskills/productivity/grillingare identical to ours (grilling synced 2026-10-15). - Modified:
handoff(his saves to the OS temp dir, not the workspace; ours saves underskilleddocs/handoffs/and adds a commit-or-not sentence),handoff-auto(that, plus its own frontmatter so the model can call it, and a last line printing the path),wayfinder(his works any tracker and leaves research onresearch/*branches; ours is GitHub Issues only with sub-issues and native blocking, resolves grilling tickets withgrill-docs, drops his domain-modeling type, sizes tickets to our ~75K-token smart zone, posts research as a comment, and ends by handing the map todivide), anddotfiles/CLAUDE.md(adapted from his personal globalCLAUDE.md, not part of that repo; see MyCLAUDE.md). - Builds on his principles: how skills here are written follows his
writing-for-agentsskill and the video linked fromCONTRIBUTING.mdsection 1. - Divergences:
- Our
meta-orchestratorholds a merge gate and merges to the default branch itself once tests and CI are green (merge: auto;askandpr-onlyare the alternatives). In his repo,implement-specmerges subagent work into an integration branch and opens a draft PR; I found no step that merges to the default branch. - Our
verifiermay answer grilling andconsult-planquestions on your behalf, only when the run is set tointerview: answer(otherwise it parks them for you), and lists every Q → A under “decided for you” (meta-orchestrator/SKILL.md, Interviews). Hisgrillingalways waits for the user’s answers.
- Our
- New here: everything else (
grill-docs,pair,meta-orchestrator, the agents,kanban/,spend-gate,repo-scrub, and the rest). - Kept in sync weekly:
upstream.jsonlists each derived file with its upstream path, mode and the upstream commit last synced. Theupstream-syncworkflow runsscripts/upstream_sync.pyevery Monday (or on demand): a verbatim copy that changed upstream gets a PR fromupstream-sync/verbatim; a modified one gets an issueupstream-sync:with the upstream diff since the recorded commit, and after porting it you runpython scripts/upstream_sync.py --mark-synced(to skip the change, run only that). Only open PRs and issues count as already filed: closing the issue without--mark-synced, or closing the PR unmerged, gets a fresh one on the next run (the branch is force-pushed). If Actions may not open PRs (the repo default), the run opens an issueupstream-sync: verbatim copieslinking the pushed branch instead, and you open the PR by hand. Each PR/issue step runs even if another fails; the job fails if any did.dotfiles/CLAUDE.mdis not tracked, since its source is not in that repo. Runpython scripts/upstream_sync.py --dry-runto check by hand.
npx skills add mattpocock/skills pulls his full set directly.
Relation to DietrichGebert’s ponytail
ponytail is copied verbatim from DietrichGebert/ponytail (MIT; notice in THIRD_PARTY_LICENSES.md), file skills/ponytail/SKILL.md at v5.2.0. Only that core skill is included, not its sibling skills, hooks or statusline. Its README.md here is original. It is tracked in upstream.json and synced weekly like the Pocock copies above.
My CLAUDE.md
dotfiles/CLAUDE.md is my global Claude Code config, adapted from Matt Pocock’s (commit-message style, GitHub CLI first, how I want plans formatted). The branch prefix is left as a `` placeholder in the tracked file. Install it with:
./scripts/setup-claude-md.sh merge # append to your existing ~/.claude/CLAUDE.md
./scripts/setup-claude-md.sh replace # overwrite/create ~/.claude/CLAUDE.md from scratch
# or, on Windows:
.\scripts\setup-claude-md.ps1 -Mode merge
.\scripts\setup-claude-md.ps1 -Mode replace
merge just appends with a timestamped separator; it won’t dedupe against your existing file, so skim the result afterward.
Pass --prefix (sh) / -Prefix (ps1) to fill in the branch-prefix placeholder as it’s written — e.g. the author’s own value: ./scripts/setup-claude-md.sh merge --prefix krish or .\scripts\setup-claude-md.ps1 -Mode merge -Prefix krish. Without it, `` is left in place and the script prints a hint.
Author
Krish Punjabi. Public, MIT; use whatever’s useful.
License
MIT (see LICENSE) for everything original in this repo. Matt Pocock’s skills and DietrichGebert’s ponytail carry their own MIT notices; see THIRD_PARTY_LICENSES.md.
Recommended Tools
Try a different keyword or remove a filter.
Install
npx skillfish add krishp147/skills