Six Claude Code hooks and two skills, in six plugins, and a statusline. Each one closes a gap that costs real time: an agent that narrates history in a comment, a subagent you cannot correct until it finishes, a bot challenge that reads like a missing file, a long turn that ends while you are in another window, a team of agents that merges a conflict nobody saw.
Install what you want. No hook depends on another, and the skills work without
any of them — delegation reaches further with agent-steer and help-intercept
installed, and says so where it matters.
/plugin marketplace add moghaddas/claude-code-kit
/plugin install curl-ua-guard@moghaddas
From a shell instead of a session:
claude plugin marketplace add moghaddas/claude-code-kit
claude plugin install curl-ua-guard@moghaddas --scope user
All six plugins at once:
claude plugin install kit@moghaddas
| Plugin | Event | What it does |
|---|---|---|
curl-ua-guard |
PreToolUse |
Gives curl and wget a browser User-Agent before they leave the machine. A Cloudflare-fronted origin serves a challenge to a default curl/8.x UA, and that response reads like a real finding. |
notify |
Notification, Stop |
Writes a desktop banner when Claude needs you, and when a long turn ends. |
doc-guards |
PostToolUse, PreToolUse |
Flags a comment that narrates history in code just written. Hands back the brevity bar before a CLAUDE.md, AGENTS.md or SKILL.md is written, by blocking the first write of each. |
agent-steer |
PreToolUse |
Corrects a running subagent. A queued message reaches an agent only at a turn boundary, so this one delivers by pull instead. |
help-intercept |
UserPromptSubmit |
Prints a skill's help text for zero model tokens. The hook returns the text through the block contract, so the model never runs. |
doc-guards and agent-steer install disabled. Both change how the agent behaves,
so you opt in rather than discover them. Enable either in /plugin.
Each plugin's README carries its own configuration table and its failure mode.
delegation holds two skills and the agent one of them spawns.
Both are about work you hand to someone else.
| Skill | Invoke | What it does |
|---|---|---|
orchestrate |
/delegation:orchestrate |
Leads a team of subagents. Decompose into tracks that cannot touch the same file, pick a model per track, brief completely in the spawn, steer, spot-check every claim before accepting it, merge. |
second-opinion |
/delegation:second-opinion |
Gates a consult on a decision that is expensive to unwind, and briefs an agent that has none of your context. Ships with that agent, pinned to fable at xhigh effort and read-only. |
Three facts about the harness do most of the work in orchestrate, and each one
explains an agent that looks broken and is not. A queued message arrives only at a
turn boundary, one per turn, in both directions — so a running agent reads nothing
you send it, and your own inbox stays unread while you keep calling tools. A
backgrounded agent's final text reaches nobody, and the idle notification that
follows reads exactly like a delivered report. And Write refuses a subagent any
file named REPORT.md, SUMMARY.md, FINDINGS.md or ANALYSIS.md, so a brief
that asks for one gets nothing.
orchestrate reaches a live track by writing a control file, which is what
agent-steer delivers. That matters most at the 15-minute
cap, where the file tells a track to stop taking new work, checkpoint, commit and
report — without it the only brake is TaskStop, which kills the unit of work in
flight. Mid-run corrections are the rarer case: with a complete brief, a correction
usually means the brief was wrong, which is a respawn. The skill says so, and falls
back to respawning when the hook is absent.
orchestrate carries a ## Help section, so /delegation:orchestrate --help prints
its options — for zero model tokens when
help-intercept is installed.
statusline/ holds a statusline that reports two things a stock one does
not: the true cost of a session including subagents, and every repo in the workspace
grouped by branch.
It is not a plugin. A plugin's bundled settings.json supports only the agent and
subagentStatusLine keys, so no plugin can install a statusline. Run the installer:
git clone https://github.com/moghaddas/claude-code-kit ~/src/claude-code-kit
~/src/claude-code-kit/statusline/install.sh
The statusline needs jq, and uses ccusage for the cost segment when it is present.
Every hook runs on bash and the Python 3 that ships with the system. The skills need
nothing but Claude Code. Nothing here needs a package manager.
MIT.