My Claude Code setup
/ 9 min read
Updated:This is a snapshot of how I currently extend Claude Code β plugins, hooks, the status line, and the workflow patterns I rely on day to day.
The goal is not to install every tool I can find. I want a setup that makes Claude Code better at five things: finding context, following repeatable development workflows, reviewing its own work, coordinating with other agents, and staying visible while it works.
Documentation and code intelligence
context7for up-to-date documentation lookup against current library versions.typescript-lsp,pyright-lsp,gopls-lsp, andswift-lspfor language server support.
Development workflow
feature-devfor thecode-architectandcode-explorersubagents I lean on during early architecture work. The plugin ships zero auto-triggering skills, so it stays out of the way until I explicitly call those agents.code-reviewfor ad-hoc code reviews via the/code-reviewslash command, separate from the deeper review loops below.superpowersfor TDD discipline, systematic debugging, and the verification/review skills I rely on most. Paired with my own routing rules β see Shaping skill behavior below.
My own plugins
git-workflowfor repeatable Git operations and Conventional Commits.mermaid-validatorfor checking Mermaid diagrams in Markdown.reviewerfor spec and implementation review loops, with--parallelmulti-angle review and a--fixiteration mode.digestfor summarizing branches, PRs, diffs, and design docs.ralph-loopfor experimental long-running agent loops β used most often to wrapreviewerfor iterative review-fix-review cycles (see Workflow patterns below).
These live in my agent-plugins project.
Hooks
claude-hooks-notifierfor Telegram notifications on Claude Code hook events β useful when a long-running agent stops and needs me back at the keyboard.
Cross-agent and behavior shaping
codexfor delegating work from Claude Code to Codex. I use it selectively β second-opinion spec review and rescue runs, not every code change.andrej-karpathy-skillsfor reducing common LLM coding mistakes (over-engineering, untested assumptions, missing success criteria).security-guidancefor reminders about risky code edits.explanatory-output-stylefor more educational implementation explanations.
Workflow patterns
Beyond the plugin list, a few patterns I rely on:
- Spec-driven development as the default. Spectra drives my workflow through
/spectra-discussβ/spectra-proposeβ/spectra-applyβ/spectra-archive. In-progress changes live inopenspec/changes/; consolidated truth lives inopenspec/specs/. - Ralph Loop for iterative review. I wrap
/reviewer:specor/reviewer:resultinside/ralph-loop:ralph-loopso the review-fix-review cycle keeps running until severity gates clear. MEDIUM is treated as a blocker, not as LOW. - Two-engine spec review for high-stakes specs. For architectural or security-sensitive specs I dispatch two reviewers in parallel β Claude in this session and Codex via
codex:rescueβ then categorize findings asOnly Claude saw,Only Codex saw, orBoth saw. The reviewer plugin stays model-agnostic; the composition happens in a Raycast snippet, not in plugin code. The exact recipe lives in the reviewer README. - Result review uses one engine. Spec errors propagate to all downstream implementation; result errors are localized. Multi-model review pays off on specs (1-3 dispatches per change, high error cost) but rarely on results (10+ iterations via ralph-loop, lower marginal value). Codex on result review is reserved for security-sensitive, concurrency, or performance-hotpath code.
Shaping skill behavior with rules
~/.claude/rules/skill-routing.md is a user-instruction layer that overrides plugin-defined skill behavior. It is deliberately small β only three rules, each fixing a specific failure mode that Claude wouldnβt avoid on its own:
- Spectra-vs-superpowers routing. In Spectra repos, prefer
spectra-discuss/spectra-debugover the equivalent superpowers skills, so design and debugging stay tied to Spectraβs artifacts. - Suppress
superpowers:brainstormingauto-writing design docs. The design discussion belongs in conversation; file output is friction. - Force-trigger
superpowers:verification-before-completionandsuperpowers:receiving-code-review. These are the two skills with the highest ROI β they keep βI claimed it was doneβ and βI blindly chased a reviewer suggestionβ from happening.
Workflow sequencing (discuss β propose β apply β archive) is not in the rules β thatβs personal habit, not something Claude needs to enforce. User instructions outrank plugin-defined skill behavior, so superpowers stays installed (and gets upstream updates) while its rough edges get sanded down at user-instruction priority.
Full ~/.claude/rules/skill-routing.md
# Skill Routing & Behavior Overrides
These rules override default skill behavior. **User instructions > superpowers skills > defaults**, so this file wins on conflict.
## 1. Spectra-vs-superpowers routing
In Spectra repos (`openspec/` exists at git root), prefer Spectra skills over superpowers equivalents β `spectra-discuss` over `superpowers:brainstorming`, `spectra-debug` over `superpowers:systematic-debugging`. Routing the request to superpowers bypasses Spectra's artifact tracking.
In non-Spectra repos this rule does not apply β superpowers wins because Spectra skills won't trigger anyway.
## 2. Behavior overrides on superpowers skills
### `superpowers:brainstorming`- Do NOT automatically write `docs/superpowers/specs/YYYY-MM-DD-*-design.md` or any design doc file. Present the design in conversation only.- Skip the "Write design doc" checklist step (step 6 in the SKILL).- **Why**: I prefer in-conversation design discussion. File output is friction.
### `superpowers:using-superpowers`- Do NOT add a TodoWrite todo per skill checklist item unless the task has 4+ genuinely independent sub-tasks.- **Why**: TodoWrite spam clutters short tasks.
## 3. Force-trigger these superpowers skills
### `superpowers:verification-before-completion` β MANDATORY- Trigger before claiming work is "done", "fixed", "passing", "ready", or before a commit / PR.- Run the verification command (test, build, manual check) and paste the output. No verification = no claim of completion.
### `superpowers:receiving-code-review` β MANDATORY- Trigger when applying review feedback from any review-fix loop (`reviewer:result-fixer`, `reviewer:spec-fixer`, `/codex:review`, etc.).- For each review item, first verify the claim is technically correct. Push back with evidence on wrong/unnecessary suggestions instead of blindly implementing.Status line
ccstatusline drives a three-line status bar:
- Project β current directory (via the
showdirhelper below), git branch, change count, worktree. - Model and tokens β model name, context-window percentage, input / output / cached / total token counts, active skill count.
- Time and cost β thinking-effort tier, wall clock, session duration, session cost, reset timer, current 5-hour-block usage, weekly usage, session ID, Claude Code version.
Full ~/.config/ccstatusline/settings.json
{ "version": 3, "lines": [ [ { "type": "custom-command", "commandPath": "showdir --icon" }, { "type": "separator" }, { "type": "git-branch", "color": "brightGreen", "metadata": { "hideNoGit": "false" } }, { "type": "separator", "character": " " }, { "type": "git-changes" }, { "type": "separator", "character": " " }, { "type": "git-worktree", "color": "hex:FDC700" } ], [ { "type": "model", "color": "green", "rawValue": true }, { "type": "separator", "character": "|" }, { "type": "context-percentage", "color": "brightGreen" }, { "type": "separator", "character": "," }, { "type": "tokens-input", "color": "brightMagenta" }, { "type": "separator", "character": "," }, { "type": "tokens-output", "color": "brightMagenta" }, { "type": "separator", "character": "," }, { "type": "tokens-cached", "color": "brightMagenta" }, { "type": "separator", "character": "," }, { "type": "tokens-total", "color": "brightMagenta" }, { "type": "separator", "character": "|" }, { "type": "skills", "color": "brightCyan" } ], [ { "type": "thinking-effort", "color": "white", "rawValue": true }, { "type": "separator", "character": "," }, { "type": "custom-command", "color": "brightCyan", "commandPath": "date \"+%m-%d %H:%M:%S\"" }, { "type": "separator", "character": "," }, { "type": "session-clock", "rawValue": true }, { "type": "separator", "character": " " }, { "type": "session-cost", "color": "cyan", "rawValue": true }, { "type": "separator" }, { "type": "reset-timer", "color": "brightYellow", "metadata": { "display": "time", "compact": "true" } }, { "type": "custom-text", "color": "brightBlue", "customText": " b:" }, { "type": "session-usage", "rawValue": true }, { "type": "custom-text", "color": "brightBlue", "customText": " w:" }, { "type": "weekly-usage", "rawValue": true }, { "type": "separator", "character": "," }, { "type": "claude-session-id", "color": "cyan", "rawValue": true }, { "type": "separator", "character": "," }, { "type": "version", "color": "brightWhite" } ] ], "flexMode": "full-minus-40", "compactThreshold": 60, "colorLevel": 3, "inheritSeparatorColors": true, "powerline": { "enabled": false }}I omitted the per-widget id UUIDs and a few defaulted fields for readability; ccstatusline regenerates the IDs on first save.
showdir helper
The first widget on line 1 shells out to ~/.local/bin/showdir, a small POSIX script that prints a project-relative path. Inside a git repo it prints <repo>/<relative-path> with a π prefix; outside, <parent>/<dir> with π. Shorter and more useful than the full absolute path that would otherwise eat half the line.
Full ~/.local/bin/showdir
#!/usr/bin/env sh# Usage: showdir [--icon] [-n|--no-newline]
icon=0; noline=0while [ $# -gt 0 ]; do case "$1" in --icon) icon=1 ;; -n|--no-newline) noline=1 ;; esac shiftdone
prefix_icon=""if git_root=$(git rev-parse --show-toplevel 2>/dev/null); then project=${git_root##*/} case "$PWD" in "$git_root"|"${git_root%/}") rel="";; *) rel=${PWD#"$git_root"/};; esac [ "$icon" -eq 1 ] && prefix_icon="π " out=$project${rel:+"/$rel"}else path=$PWD last=${path##*/} parent=${path%/*} second_last=${parent##*/} [ "$second_last" = "$last" ] && out="$last" || out="$second_last/$last" [ "$icon" -eq 1 ] && prefix_icon="π "fi
if [ "$noline" -eq 1 ]; then printf "%s%s" "$prefix_icon" "$out"else printf "%s%s\n" "$prefix_icon" "$out"fiHow I decide whether something stays
A tool is worth keeping if it reduces repeated prompting, improves review quality, catches mistakes, or turns a workflow I already use into something repeatable.
If it only feels impressive once but does not change my daily workflow, it probably does not belong in the setup.
Comments
Local graph
1 linked page Β· full graph β