refactor-deep
Iteratively refactors code by running subagents, applying automated fixes, and verifying results against tests.
Install
mkdir -p .claude/skills/refactor-deep && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/19432" && unzip -o skill.zip -d .claude/skills/refactor-deep && rm skill.zipInstalls to .claude/skills/refactor-deep
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Iterative refactoring of the feature-branch diff (full project when no diff exists) — runs `/optimus:refactor` in a fresh subagent context per iteration, applies fixes, runs tests, bisects failures, and continues until convergence or the iteration cap (default 8, hard cap 20). Supports `testability` or `guidelines` focus to prioritize finding categories. Fixes are applied automatically without per-change approval; for a single supervised pass, use /optimus:refactor. Creates a git checkpoint commit after each iteration (skip with --no-commit). Requires a test command in .claude/CLAUDE.md. Use for thorough guideline alignment or testability cleanup before /optimus:unit-test.Key capabilities
- →Execute iterative refactoring in fresh subagent contexts
- →Apply code fixes and run test suites automatically
- →Bisect failures to isolate issues
- →Create git checkpoint commits per iteration
- →Support testability or guideline-focused refactoring
How it works
The orchestrator runs a loop of refactoring passes, spawning fresh subagents to apply changes and verify them against the project's test suite until convergence or iteration limits are reached.
Inputs & outputs
When to use refactor-deep
- →Clean up feature branch code before merging
- →Improve testability of legacy modules
- →Enforce coding guidelines across a project
- →Automate repetitive code improvement tasks
About this skill
Project Refactor (Deep)
Orchestrate /optimus:refactor in an iterative cleanup loop. Each iteration runs in a fresh subagent context. All state lives in .claude/refactor-deep-progress.json. The orchestrator dispatches subagents, parses their structured output, and uses the harness_common.cli helper to apply fixes, run tests, bisect failures, and decide termination.
Step 1: Parse Arguments and Guard Against Re-entry
Re-entry guard
If your invocation prompt body already contains HARNESS_MODE_INLINE, stop immediately with: "Deep mode cannot run inside deep mode."
Parse invocation arguments
Extract from the user's arguments:
--resumeflag (present/absent)--no-commitflag (present/absent)--yesflag (present/absent) — auto-confirm the Step 3 prompt; required when invoked underclaude -por any other non-interactive session that cannot answerAskUserQuestion.--max-iterations N(optional, default 8, hard cap 20)- Focus keyword:
testabilityorguidelines(the same detection rules as/optimus:refactor) — match only standalone unquoted tokens, case-insensitive; keywords inside quotes stay in the scope text; if both keywords appear as standalone tokens, use the first one and warn: "Multiple focus keywords detected — using '[first]'. Run separate passes for each focus." --allow-red-baselineflag (present/absent) — proceed even if the Step 4 pre-loop baseline finds the suite already failing- Everything else → scope text (an existing path scopes the refactor to that path; other text is recorded as intent only and does not filter). With no path scope, iteration 1 covers the feature-branch diff when one exists, otherwise the full project; scope then widens per iteration only to files with active findings and newly modified files.
Examples:
/optimus:refactor-deep→ feature-branch diff (full project when no diff exists), 8 iterations, balanced focus/optimus:refactor-deep testability→ focus on testability barriers/optimus:refactor-deep guidelines src/backend→ guidelines focus, scoped to an existing path/optimus:refactor-deep --max-iterations 12→ 12 iterations/optimus:refactor-deep --resume→ continue from existing progress file/optimus:refactor-deep --no-commit→ skip per-iteration checkpoint commitsclaude -p "/optimus:refactor-deep --yes testability"→ headless / CI usage; skips the Step 3 confirmation prompt
Step 2: Pre-flight Checks
Plugin root
Resolve plugin_root (the absolute path to the installed plugin) and keep it for every CLI call and subagent dispatch below — the env var does not persist across separate Bash tool calls and reads empty on some platforms (notably Windows):
- Run
echo $CLAUDE_PLUGIN_ROOTvia Bash. If it is non-empty and<value>/scripts/harness_commonexists (test -d), use it. - Otherwise derive the root from the "Base directory for this skill:" line in your invocation context — strip the trailing
/skills/...segment (this skill's own directory) — and use it if<derived>/scripts/harness_commonexists. - If neither candidate contains
scripts/harness_common, stop: "Cannot resolve plugin root — ensure optimus-claude is installed via the Claude Code plugin system."
Wherever the steps below (and orchestrator-loop-*.md) write $CLAUDE_PLUGIN_ROOT, use this resolved plugin_root; if echo $CLAUDE_PLUGIN_ROOT was empty, substitute the absolute path literally.
Documentation prerequisites
Read $CLAUDE_PLUGIN_ROOT/skills/init/references/prerequisite-check.md and apply the prerequisite check. If .claude/CLAUDE.md is missing, stop: "Deep mode requires /optimus:init to set up project context first."
Test command
Read .claude/CLAUDE.md and capture the documented test command verbatim — store the exact string (e.g. npm test, pytest) as test_command. If none is documented, stop and recommend /optimus:init to set one up first. You pass this captured command to init in Step 4 via --test-command; init can also parse .claude/CLAUDE.md itself, but its parser is stricter than a human read, so passing the command you just read avoids a spurious "No test command found" failure on a command the CLI can't parse.
Git state
On a fresh (non---resume) run, refuse to proceed if the working tree has uncommitted changes unless --no-commit is passed. On --resume, the existing progress file's _snapshot.pre_head is the recovery anchor.
Step 3: User Confirmation
Skip this step entirely when --resume is given, or when --yes is given (headless / CI: the caller has pre-approved the run).
Warn the user with:
Deep refactor runs up to [N] iterative refactor passes. Each iteration spawns a fresh subagent — credit and time consumption multiplies with iteration count. Fixes are applied automatically at each iteration without per-change approval. Low test coverage increases the chance of undetected breakage; consider running
/optimus:unit-testfirst to strengthen the safety net. Press Esc twice to interrupt — state is saved per-iteration; resume with/optimus:refactor-deep --resume.Test command:
[test command]Focus:[focus or "balanced"]Mid-iteration interrupts may leave the working tree inconsistent; clean iterations are fully recoverable via
--resume.
Use AskUserQuestion — header "Deep refactor", question "Proceed with deep refactor?":
- Proceed — "Run iterative refactor until clean (max [N] iterations)"
- Cancel — "Don't run deep mode"
If the user selects Cancel, stop.
Step 4: Initialize or Resume Progress
Read $CLAUDE_PLUGIN_ROOT/references/harness-init-resume.md and apply its shared init/resume semantics — the resume invocation and cap raising, init error recovery (a prior run is discarded by re-invoking init with --force), --no-commit persistence, and .done.json archival — with these parameters:
<progress-path>=.claude/refactor-deep-progress.json<cap-flag>=--max-iterations
On fresh run
PYTHONPATH="$CLAUDE_PLUGIN_ROOT/scripts" python -m harness_common.cli init \
--skill refactor \
--max-iterations [N] \
--test-command "<test_command>" \
[--focus testability | --focus guidelines] \
[--scope "<scope>"] \
[--no-commit] \
--progress-file ".claude/refactor-deep-progress.json" \
--project-dir "."
If --focus is supplied with anything other than testability or guidelines, the CLI rejects it.
Establish a green baseline
Skip on --resume only when the prior run completed at least one iteration — then the baseline already ran and its calibrated timeout is persisted. Check the progress file's single iteration.completed field (a targeted read — do not load the findings array into context): if it is 0, the prior run never entered the loop (it stopped at baseline-red, or was interrupted at or before the first iteration), and resume never re-checks the baseline — run the command below after resume (green required, or --allow-red per the user) before entering the loop. On a fresh run, after init succeeds, verify the suite is green before the loop:
PYTHONPATH="$CLAUDE_PLUGIN_ROOT/scripts" python -m harness_common.cli baseline \
--progress-file ".claude/refactor-deep-progress.json" \
[--allow-red]
baseline runs the test command once and calibrates the per-iteration timeout from how long it takes (so a slow suite, re-run repeatedly during bisection, doesn't spuriously time out). It prints baseline-green (continue) or, on a failing suite, baseline-red with a non-zero exit. On baseline-red, stop and show the user the failing tests — a red starting tree makes bisection blame the iteration's fixes and revert good work. Tell the user to fix the failing tests, or to accept the red baseline by re-running with --allow-red-baseline; either way the run continues via --resume, which re-establishes the baseline per the skip rule above. The CLI's own failure message says to pass --allow-red — that is its internal flag, not a skill argument; the skill-level flag is --allow-red-baseline. Pass --allow-red only when the user supplied --allow-red-baseline (proceed without a green safety net; the timeout is left at its default).
Step 5: Run the Iteration Loop
Read $CLAUDE_PLUGIN_ROOT/references/orchestrator-loop-single.md and follow its 8-step per-iteration body, with these parameters:
<base-skill>=refactor<progress-path>=.claude/refactor-deep-progress.json<max>= the iteration cap from Step 1
When dispatching the refactor subagent, include the focus keyword in the prompt body if one was set:
... Phase: refactor
Focus: <testability|guidelines>
...
The base skill reads config.focus from the progress file (the CLI's init recorded it there) and applies the finding-cap weighting accordingly — but echoing the focus into the dispatch prompt makes the intent visible to anyone reading the run trace.
Step 6: Final Report
PYTHONPATH="$CLAUDE_PLUGIN_ROOT/scripts" python -m harness_common.cli final-report \
--progress-file ".claude/refactor-deep-progress.json" \
--archive
This prints the cumulative report; archival semantics, including the diminishing-returns soft-exit exception, are in the loop reference's "After the loop" section.
Important
User approval recorded at Step 3 stands for the entire loop — fixes are applied without per-change confirmation. Recommend /optimus:commit next, followed by /optimus:pr once the branch is ready. Tell the user: Tip: stay in this conversation when running /optimus:commit and /optimus:pr so the implementation context is captured. Other downstream skills (/optimus:code-review, /optimus:unit-test) should still run in fresh conversations.
Tip
If the project has low test coverage and you suspect testability barriers are blocking better coverage, run with `
Content truncated.
When not to use it
- →Running deep mode inside another deep mode session
- →Projects lacking a documented test command
Prerequisites
Limitations
- →Default iteration limit of 8, hard cap of 20
- →Requires uncommitted changes to be committed or skipped
How it compares
This approach automates multi-pass iterative cleanup and verification, whereas standard refactoring typically requires manual intervention per change.
Compared to similar skills
refactor-deep side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| refactor-deep (this skill) | 0 | 20d | Review | Advanced |
| migrate | 1 | 4mo | Review | Intermediate |
| tdd-workflows-tdd-refactor | 1 | 3mo | No flags | Intermediate |
| tdd-migrate | 1 | 6mo | Review | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
You might also like
migrate
alirezarezvani
Migrate from Cypress or Selenium to Playwright. Use when user mentions "cypress", "selenium", "migrate tests", "convert tests", "switch to playwright", "move from cypress", or "replace selenium".
tdd-workflows-tdd-refactor
sickn33
Use when working with tdd workflows tdd refactor
tdd-migrate
parcadei
TDD workflow for migrations - orchestrate agents, zero main context growth
webapp-testing
anthropics
Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.
dev-browser
SawyerHood
Browser automation with persistent page state. Use when users ask to navigate websites, fill forms, take screenshots, extract web data, test web apps, or automate browser workflows. Trigger phrases include "go to [url]", "click on", "fill out the form", "take a screenshot", "scrape", "automate", "test the website", "log into", or any browser interaction request.
playwright-browser-automation
lackeyjb
Complete browser automation with Playwright. Auto-detects dev servers, writes clean test scripts to /tmp. Test pages, fill forms, take screenshots, check responsive design, validate UX, test login flows, check links, automate any browser task. Use when user wants to test websites, automate browser interactions, validate web functionality, or perform any browser-based testing.