From han-coding
Guides a test-gated refactoring loop to restructure code without changing behavior, with small named steps and green-to-green discipline.
How this skill is triggered — by the user, by Claude, or both
Slash command
/han-coding:refactor [file, module, named smell, or a path to review findings][file, module, named smell, or a path to review findings]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
- git installed: !`which git 2>/dev/null || echo "not installed"`
which git 2>/dev/null || echo "not installed"git branch --show-current 2>/dev/null || echo unknowngit status --porcelain 2>/dev/null | head -5find . -maxdepth 1 -name "CLAUDE.md" -type ffind . -maxdepth 3 -name "project-discovery.md" -type fThis skill restructures existing production and test code in your working tree. It is an execution skill, not a document generator. These constraints shape every step and override any instinct to move faster. The canon they derive from, with provenance, is in references/refactoring-discipline.md; pull that reference when a step needs the full rule or a step feels off.
/tdd owns cleanup inside the loop, and
restructuring while a test is red violates the two-hats rule both skills
share.Bind the target. Resolve the request to a named target: specific files or
directories, a named code smell in a named place, or the refactoring findings
in a provided document (a /code-review report, an /architectural-analysis
report, or equivalent). When a findings document is given, extract only the
refactoring-shaped findings (structural suggestions, duplication, naming,
coupling) and record each finding's ID so the summary can trace back to it.
If the request is open-ended ("clean up the codebase", "improve quality")
with no named target, ask the user for one before doing anything: open-ended
refactoring runs are the documented failure mode this skill exists to avoid,
and a wrong guess here burns the whole run.
Resolve commands. Read CLAUDE.md's ## Project Discovery section for the
test command (under ### Commands and Tests), the lint command, the build
command, language, and framework. If absent, fall back to
project-discovery.md. If still absent, run
${CLAUDE_SKILL_DIR}/scripts/detect-refactor-context.sh and parse its
output for git state and manifest-inferred commands. A missing test command is
a hard blocker: exhaust inference, then ask the user, because this skill
cannot run without a way to verify behavior. Also note any type-check command
the project has; where one exists it runs alongside the tests as a second
behavior-preservation check.
Resolve standards and decisions. Resolve the coding-standards directory
and ADR directory the same way: CLAUDE.md's ## Project Discovery section,
then project-discovery.md, then Glob defaults (docs/, docs/adr/,
docs/coding-standards/, docs/decisions/). Also check CLAUDE.md and
AGENTS.md for inline standards. Read the standards and ADRs whose titles,
paths, or one-line summaries indicate they govern the target area; cap at
five documents. The target's restructured form must conform to these. If none
exist, state that plainly and infer conventions from the surrounding code.
Check the tree. If working tree in Project Context shows failing
mid-cycle work or the user describes an in-flight tdd loop on this code,
stop and say why (the never-alongside-tdd constraint). Uncommitted but
complete work is fine; recommend committing it first so refactoring diffs
stay clean, then proceed.
Run the full suite. Run the resolved test command with Bash. Paste the
runner's summary line. If anything is red, stop: a red suite is not a
license to refactor. Report the failures and recommend fixing them first
(via /investigate or /tdd), or re-scoping the target away from the
broken area.
Establish coverage of the target. Confirm the target's observable behavior is exercised by the suite: find the tests that drive the target (Glob and Grep for the target's public symbols in test files), and run them scoped if the runner supports it. State plainly which behaviors are covered and which are not. If the target has no meaningful coverage, stop and offer two ways forward, and wait for the user's choice: narrow the target to the covered part, or write characterization tests first using the protocol in references/refactoring-discipline.md. Characterization tests pin current observed behavior (including current bugs) and are a lower-confidence net than intent-written tests; say so in the report.
Plan the whole run before the first edit. Produce a numbered refactoring plan where each item is:
Order the plan so each step leaves the code releasable: small, independent steps first, dependent steps after the steps they need. Report the plan to the user, then continue immediately; this is a report, not a gate. The one exception: if the request explicitly asks to review or approve the plan first, wait for approval.
Take the plan items in order. For each:
git checkout/git restore the touched files. When git is
absent, or the tree was already dirty at start, undo the edits directly
instead, so reverting this step does not discard the user's other work.
Do not patch forward over a red suite; a failed step means the mechanic
was unsafe or the coverage was thinner than it looked. Diagnose, then
either retry with a smaller step or defer the item with what you learned.If the user asked for commits, commit after each green step or each logical group of green steps, message naming the refactoring applied, refactoring only.
Run the full test suite, the lint command, and the build command from Step 1. Paste the summary line from each. If lint or build fails on code this skill touched, fix it and re-run; that is in scope.
Summarize for the user:
/issue-triage or the next /code-review.npx claudepluginhub testdouble/han --plugin han-codingOrchestrates a multi-step refactoring pipeline: analyzes code quality, plans improvements, optionally writes tests, implements changes, and reviews results. Routes simple refactors to a lighter workflow.
Safely restructure code in an isolated git worktree with test-preserved, incremental transformations
Safely refactors code test-first: verifies/writes tests, one structural change at a time, preserves behavior. Use for 'refactor this', 'clean this up', reorganization.