Custom agents, skills, hooks, and statusline for Claude Code.
# Add the marketplace
/plugin marketplace add ADWilkinson/claude-code-tools
# Install the plugin
/plugin install cct@cctSkills will be namespaced as /cct:deslop, /cct:lighthouse, etc. Hooks auto-configure when installed as a plugin.
For local development:
claude --plugin-dir ./claude-code-toolsgit clone https://github.com/ADWilkinson/claude-code-tools.git
cd claude-code-tools
./install.shThis copies files to ~/.claude/ for short skill names like /deslop, /lighthouse.
Default install includes agents, skills, hooks, and statusline. The Linear skill will install its dependencies using your available package manager (bun, pnpm, yarn, or npm); hooks still need settings.json configuration when using the install script.
Specialized subagents invoked automatically by Claude Code's Task tool. Framework-agnostic - they detect your stack and adapt.
| Agent | Description |
|---|---|
frontend-developer | React, Vue, Angular, Svelte, SolidJS - any modern framework |
backend-developer | Node, Python, Go, Rust, Ruby - REST/GraphQL APIs |
database-manager | SQL & NoSQL, Prisma, Drizzle, SQLAlchemy, GORM |
mobile-developer | React Native, Flutter, Swift, Kotlin, cross-platform |
blockchain-specialist | Solidity, Wagmi, multi-chain, gas optimization |
indexer-developer | Envio, The Graph, GraphQL, event handlers |
devops-engineer | CI/CD, Docker, GitHub Actions, cloud deployment |
firebase-specialist | Firestore, Cloud Functions, FCM, security rules |
extension-developer | Chrome Manifest V3, service workers, messaging |
mcp-developer | MCP servers, tool definitions, LLM integrations |
testing-specialist | Jest, Vitest, Playwright, pytest - any test framework |
performance-engineer | Profiling, caching, load testing, optimization |
debugger | Root cause analysis, error tracing, systematic debugging |
refactoring-specialist | Code smells, simplification, safe transformations |
All agents include:
- Confidence scoring (0-100 scale) - Only make changes with confidence ≥75
- Anti-patterns section - Domain-specific "never do" lists to prevent common mistakes
- Handoff protocols - Clear guidance on when to delegate to other specialists
All agents use opus model for maximum capability.
Skills are the unified way to extend Claude Code. They can be:
- User-invoked with
/skill-name(like the former "slash commands") - Model-invoked automatically when relevant (based on description matching)
| Skill | Invocation | Description |
|---|---|---|
deslop | /deslop | Remove AI-generated slop from diffs. Confidence scoring, false positive lists. |
design-audit | /design-audit | Audit UI for accessibility (WCAG) and visual consistency. Supports --thorough. |
repo-polish | /repo-polish | Fire-and-forget repository cleanup. Creates branch, fixes issues, opens PR. |
update-claudes | /update-claudes | Generate CLAUDE.md files throughout your project for AI context. |
minimize-ui | /minimize-ui | Systematic UI minimalization through ruthless reduction. 7-phase workflow. |
lighthouse | /lighthouse | Run Lighthouse audits and iteratively fix until target scores (default 95). |
generate-precommit-hooks | /generate-precommit-hooks | Detect project type and set up appropriate pre-commit hooks. |
xml | /xml | Convert prompts to XML format for structured Claude interactions. |
linear | Auto or /linear | Full Linear task management - view, search, create, update issues. |
verify-changes | Auto | Run tests, builds, checks to verify code works after changes. |
clarify-before-implementing | Auto | Ask targeted clarifying questions before coding to avoid wrong work. |
User-invoked skills (marked with /skill-name) require manual invocation with the slash command.
Auto-invoked skills are triggered automatically by Claude when your request matches their description.
Linear Skill Features:
my-tasks/backlog/in-progress/team-tasks- View issues by statesearch "query"- Search title and description--label NAME- Filter any list by labelcreate/start/done/show/comment- Issue actions
Setup:
cd skills/linear && ./install.sh
export LINEAR_API_KEY="lin_api_..."# Add to ~/.zshrcThen just talk naturally: "show my tasks", "search rebrand issues", "mark ENG-123 done"
verify-changes: Auto-detects project type and runs appropriate verification (typecheck, lint, test, build). Provides the feedback loop that 2-3x code quality.
Custom statusline showing:
- Current directory and git branch
- Activity icons for active tools
- Cumulative cost tracking
- Code diff stats (+/- lines)
The statusline reads Claude Code's JSON payload with jq. Without it the line says so instead of rendering empty fields, so install jq (brew install jq, apt install jq) to use it.
Shell scripts that run at specific points in Claude Code's lifecycle:
auto-format.sh- PostToolUse hook that runs formatters after Claude writes code. Supports Prettier, Ruff, gofmt, rustfmt, forge fmt.constraint-persistence.sh- UserPromptSubmit hook that detects when you set rules ("from now on", "always do X") and prompts Claude to save them to CLAUDE.md.
Install copies hooks to ~/.claude/hooks, but you still need to add them to settings.json. See hooks/README.md for setup instructions.
Both hooks read Claude Code's JSON payload with jq. Without it they exit quietly and do nothing, so install jq (brew install jq, apt install jq) to use them.
Reusable rule files for ~/.claude/rules/:
code-quality.md- Standards for reading before writing, keeping it simple, measurement over estimation.
# Install everything
./install.sh
# Preview without installing
./install.sh --dry-run
# Install only agents
./install.sh --agents-only
# Install only skills
./install.sh --skills-only
# Install only hooks
./install.sh --hooks-only
# Skip skills
./install.sh --no-skills
# Skip hooks
./install.sh --no-hooks
# Skip statusline
./install.sh --no-statusline
# Verbose output
./install.sh -v
# Custom Claude directory
./install.sh --claude-dir /path/to/.claudePull the latest versions without re-cloning:
./update.sh
# Preview what would be updated
./update.sh --dry-run
# Custom Claude directory
./update.sh --claude-dir /path/to/.claudeAgents, skills, hooks, and statusline are each refreshed only where they are
already installed. update.sh never adds a component you skipped at install
time, and never restores one you deliberately deleted.
Remove all installed tools:
./uninstall.sh
# Preview what would be removed
./uninstall.sh --dry-run
# Skip confirmation
./uninstall.sh --force
# Custom Claude directory
./uninstall.sh --claude-dir /path/to/.claudeUninstall also clears the statusLine and hooks entries from settings.json
whenever they address the scripts this repo installs, so Claude Code is not left
invoking files that are no longer on disk. That cleanup does not depend on the
scripts still being present, so it also repairs a settings.json left wired up
by an older install whose files are already gone. Entries you pointed at your
own scripts are left alone.
mkdir -p ~/.claude/agents
cp agents/*.md ~/.claude/agents/# Linear (includes dependencies)cd skills/linear && ./install.sh
# Other skills (just copy the skill directory)
mkdir -p ~/.claude/skills/verify-changes
cp -R skills/verify-changes/*~/.claude/skills/verify-changes/
# Or copy all skillsforskill_dirin skills/*;do
skill_name=$(basename "$skill_dir")
mkdir -p ~/.claude/skills/$skill_name
cp -R "$skill_dir"/*~/.claude/skills/$skill_name/
donecp statusline/flying-dutchman-statusline.sh ~/.claude/
chmod +x ~/.claude/flying-dutchman-statusline.sh
# Add to ~/.claude/settings.json:# "statusLine": { "type": "command", "command": "~/.claude/flying-dutchman-statusline.sh" }mkdir -p ~/.claude/hooks
cp hooks/*.sh ~/.claude/hooks/
chmod +x ~/.claude/hooks/*.sh
# Add to ~/.claude/settings.json under "hooks" - see hooks/README.mdmkdir -p ~/.claude/rules
cp rules/*.md ~/.claude/rules/
# Reference in ~/.claude/CLAUDE.md: @~/.claude/rules/code-quality.mdEach agent follows a consistent structure:
---
name: agent-nameauthor: Andrew Wilkinson (github.com/ADWilkinson)description: Brief description for when to use this agentmodel: sonnet | opustools: Read, Edit, MultiEdit, Write, Bash, Grep, Glob, LS, WebFetch
---
You are an expert...## When Invoked1. Step 12. Step 2
...
## Core Expertise
- Skill 1
- Skill 2## Code Patterns```code examples```## Quality/Security Checklist
- [ ] Item 1
- [ ] Item 2## Confidence Scoring| Score | Meaning | Action ||-------|---------|--------|| 0-25 | Might be intentional | Ask before changing || 50 | Likely improvement | Suggest with explanation || 75-100 | Definitely should change | Implement directly |## Anti-Patterns (Never Do)
- Never do X
- Never do Y## Handoff Protocol- **Related task**: HANDOFF:other-agentEach skill lives in its own directory under skills/ with a SKILL.md file:
---
name: skill-nameauthor: Andrew Wilkinson (github.com/ADWilkinson)description: When this skill should be useddisable-model-invocation: true # Optional: prevents auto-invocationallowed-tools: Read, Edit, Bash # Optional: restrict available tools
---
# Skill Title> **Quick Reference**: Brief summary of the workflowDetailed instructions for executing the skill...Templates are included if you want to fork and create your own tools:
# Create a new agent
cp templates/agent-template.md agents/your-agent-name.md
# Create a new skill
mkdir -p skills/your-skill
cp templates/skill-template.md skills/your-skill/SKILL.mdFollow existing naming conventions (kebab-case) and include clear descriptions for when Claude should invoke your tool.
The shipped scripts are covered by shell suites. Every one of them is hermetic:
they run against a temporary directory, stub out the network and any package
manager, and never touch your real ~/.claude.
# Installer destination handling
bash tests/install-test.sh
# Update and uninstall dry-run behaviour
bash tests/update-uninstall-test.sh
# Plugin hook manifest wiring
bash tests/plugin-manifest-test.sh
# Hook behaviour, with and without jq
bash tests/hooks-test.sh
# Statusline rendering
bash tests/statusline-test.sh
# Per-skill installers, including what they write into ~/.claude
bash tests/skill-installer-test.sh
# Syntax-check every tracked shell scriptforfin$(git ls-files '*.sh');do bash -n "$f"||exit 1;doneCI runs all of them on ubuntu-latest and macos-latest for every pull request
and every push to main.
Andrew Wilkinson (@andrewwilkinson)
MIT