code-yeongyu/refactor
Intelligent refactor command. Triggers: refactor, refactoring, cleanup, restructure, extract, simplify, modernize.
npx skills add https://github.com/code-yeongyu/oh-my-openagent --skill refactor
export const REFACTOR_TEMPLATE = `# Intelligent Refactor Command
\\\`
/refactor <refactoring-target> [--scope=<file|module|project>] [--strategy=<safe|aggressive>]
Arguments:
refactoring-target: What to refactor. Can be:
Options:
--scope: Refactoring scope (default: module)
--strategy: Risk tolerance (default: safe)
\\\`
Performs intelligent, deterministic refactoring with full codebase awareness. Unlike blind search-and-replace, this command:
BEFORE ANY ACTION, classify and validate the request.
| Signal | Classification | Action |
|--------|----------------|--------|
| Specific file/symbol | Explicit | Proceed to codebase analysis |
| "Refactor X to Y" | Clear transformation | Proceed to codebase analysis |
| "Improve", "Clean up" | Open-ended | MUST ask: "What specific improvement?" |
| Ambiguous scope | Uncertain | MUST ask: "Which modules/files?" |
| Missing context | Incomplete | MUST ask: "What's the desired outcome?" |
Before proceeding, confirm:
If ANY of above is unclear, ASK CLARIFYING QUESTION:
\\\`
I want to make sure I understand the refactoring goal correctly.
What I understood: [interpretation]
What I'm unsure about: [specific ambiguity]
Options I see:
My recommendation: [suggestion with reasoning]
Should I proceed with [recommendation], or would you prefer differently?
\\\`
IMMEDIATELY after understanding the request, create todos:
\\\`
TodoWrite([
{"id": "phase-1", "content": "PHASE 1: Codebase Analysis - launch parallel explore agents", "status": "pending", "priority": "high"},
{"id": "phase-2", "content": "PHASE 2: Build Codemap - map dependencies and impact zones", "status": "pending", "priority": "high"},
{"id": "phase-3", "content": "PHASE 3: Test Assessment - analyze test coverage and verification strategy", "status": "pending", "priority": "high"},
{"id": "phase-4", "content": "PHASE 4: Plan Generation - invoke Plan agent for detailed refactoring plan", "status": "pending", "priority": "high"},
{"id": "phase-5", "content": "PHASE 5: Execute Refactoring - step-by-step with continuous verification", "status": "pending", "priority": "high"},
{"id": "phase-6", "content": "PHASE 6: Final Verification - full test suite and regression check", "status": "pending", "priority": "high"}
])
\\\`
Mark phase-1 as in_progress.
Fire ALL of these simultaneously using \call_omo_agent\:
\\\`
// Agent 1: Find the refactoring target
call_omo_agent(
subagent_type="explore",
run_in_background=true,
prompt="Find all occurrences and definitions of [TARGET].
Report: file paths, line numbers, usage patterns."
)
// Agent 2: Find related code
call_omo_agent(
subagent_type="explore",
run_in_background=true,
prompt="Find all code that imports, uses, or depends on [TARGET].
Report: dependency chains, import graphs."
)
// Agent 3: Find similar patterns
call_omo_agent(
subagent_type="explore",
run_in_background=true,
prompt="Find similar code patterns to [TARGET] in the codebase.
Report: analogous implementations, established conventions."
)
// Agent 4: Find tests
call_omo_agent(
subagent_type="explore",
run_in_background=true,
prompt="Find all test files related to [TARGET].
Report: test file paths, test case names, coverage indicators."
)
// Agent 5: Architecture context
call_omo_agent(
subagent_type="explore",
run_in_background=true,
prompt="Find architectural patterns and module organization around [TARGET].
Report: module boundaries, layer structure, design patterns in use."
)
\\\`
While background agents are running, use direct tools:
\\\`typescript
// Find definition(s)
LspGotoDefinition(filePath, line, character) // Where is it defined?
// Find ALL usages across workspace
LspFindReferences(filePath, line, character, includeDeclaration=true)
// Get file structure
LspDocumentSymbols(filePath) // Hierarchical outline
LspWorkspaceSymbols(filePath, query="[target_symbol]") // Search by name
// Get current diagnostics
lsp_diagnostics(filePath) // Errors, warnings before we start
\\\`
\\\`bash
// Find structural patterns
python3 scripts/ast_grep_helper.py search 'function $NAME($$$) { $$$ }' --lang ts src/
sg --pattern '[old_pattern]' --rewrite '[new_pattern]' --lang ts src/
\\\`
\\\`
grep(pattern="[search_term]", path="src/", include="*.ts")
\\\`
\\\`
background_output(task_id="[agent_1_id]")
background_output(task_id="[agent_2_id]")
...
\\\`
Mark phase-1 as completed after all results collected.
Mark phase-2 as in_progress.
Based on Phase 1 results, build:
\\\`
path/to/file.ts:L10-L50\ - Primary definitionpath/to/file2.ts:L25\ - Key usage\\\`
[TARGET]
├── imports from:
│ ├── module-a (types)
│ └── module-b (utils)
├── imported by:
│ ├── consumer-1.ts
│ ├── consumer-2.ts
│ └── consumer-3.ts
└── used by:
├── handler.ts (direct call)
└── service.ts (dependency injection)
\\\`
| Zone | Risk Level | Files Affected | Test Coverage |
|------|------------|----------------|---------------|
| Core | HIGH | 3 files | 85% covered |
| Consumers | MEDIUM | 8 files | 70% covered |
| Edge | LOW | 2 files | 50% covered |
\\\`
Based on codemap:
Mark phase-2 as completed.
Mark phase-3 as in_progress.
\\\`bash
cat package.json | jq '.scripts | keys[] | select(test("test"))'
ls -la pytest.ini pyproject.toml setup.cfg
ls -la *_test.go
\\\`
\\\`
// Find all tests related to target
call_omo_agent(
subagent_type="explore",
run_in_background=false, // Need this synchronously
prompt="Analyze test coverage for [TARGET]:
)
\\\`
Based on test analysis:
| Coverage Level | Strategy |
|----------------|----------|
| HIGH (>80%) | Run existing tests after each step |
| MEDIUM (50-80%) | Run tests + add safety assertions |
| LOW (<50%) | PAUSE: Propose adding tests first |
| NONE | BLOCK: Refuse aggressive refactoring |
If coverage is LOW or NONE, ask user:
\\\`
Test coverage for [TARGET] is [LEVEL].
Risk Assessment: Refactoring without adequate tests is dangerous.
Options:
Which approach do you prefer?
\\\`
\\\`
bun test\ / \npm test\ / \pytest\ / etc.tsc --noEmit\ / \pyright\ / etc.After each refactoring step:
\\\`
Mark phase-3 as completed.
Mark phase-4 as in_progress.
\\\`
Task(
subagent_type="plan",
prompt="Create a detailed refactoring plan:
[User's original request]
[Insert codemap here]
[Insert verification plan here]
)
\\\`
After receiving plan from Plan agent:
Convert Plan agent output into granular todos:
\\\`
TodoWrite([
// Each step from the plan becomes a todo
{"id": "refactor-1", "content": "Step 1: [description]", "status": "pending", "priority": "high"},
{"id": "verify-1", "content": "Verify Step 1: run tests", "status": "pending", "priority": "high"},
{"id": "refactor-2", "content": "Step 2: [description]", "status": "pending", "priority": "medium"},
{"id": "verify-2", "content": "Verify Step 2: run tests", "status": "pending", "priority": "medium"},
// ... continue for all steps
])
\\\`
Mark phase-4 as completed.
Mark phase-5 as in_progress.
For EACH refactoring step:
in_progress\Use appropriate tool:
For Symbol Renames:
\\\`typescript
lsp_prepare_rename(filePath, line, character) // Validate rename is possible
lsp_rename(filePath, line, character, newName) // Execute rename
\\\`
For Pattern Transformations:
\\\`bash
// Preview first
sg --pattern '[pattern]' --rewrite '[rewrite]' --lang ts path/to/file.ts
// If preview looks good, execute
python3 scripts/ast_grep_helper.py replace '[pattern]' '[rewrite]' --lang ts path/to/file.ts --apply
\\\`
For Structural Changes:
\\\`typescript
// Use Edit tool for precise changes
edit(filePath, oldString, newString)
\\\`
\\\`typescript
// 1. Check diagnostics
lsp_diagnostics(filePath) // Must be clean or same as baseline
// 2. Run tests
bash("bun test") // Or appropriate test command
// 3. Type check
bash("tsc --noEmit") // Or appropriate type check
\\\`
completed\If ANY verification fails:
NEVER proceed to next step with broken tests.
After each logical group of changes:
\\\`bash
git add [changed-files]
git commit -m "refactor(scope): description
[details of what was changed and why]"
\\\`
Mark phase-5 as completed when all refactoring steps done.
Mark phase-6 as in_progress.
\\\`bash
bun test # or npm test, pytest, go test, etc.
\\\`
\\\`bash
tsc --noEmit # or equivalent
\\\`
\\\`bash
eslint . # or equivalent
\\\`
\\\`bash
bun run build # or npm run build, etc.
\\\`
\\\`typescript
// Check all changed files
for (file of changedFiles) {
lsp_diagnostics(file) // Must all be clean
}
\\\`
\\\`markdown
path/to/file.ts\ - [what changed]path/to/file2.ts\ - [what changed]All existing tests pass. No new errors introduced.
\\\`
Mark phase-6 as completed.
as any\, \@ts-ignore\, \@ts-expect-error\sg --pattern ... --rewrite ... --lang ...)If any of these occur, STOP and consult user:
You already know these tools. Use them intelligently:
Leverage LSP tools for precision analysis. Key patterns:
LspGotoDefinition\ to grasp contextLspFindReferences\ to map all usages before modificationlsp_prepare_rename\ → \lsp_rename\ for symbol renameslsp_diagnostics\ after every changeUse \ast-grep\ skill helper or \sg\ CLI for structural transformations.
Critical: Always preview first, review, then execute.
explore\: Parallel codebase pattern discoveryplan\: Detailed refactoring plan generationoracle\: Read-only consultation for complex architectural decisions and debugginglibrarian\: Use proactively when encountering deprecated methods or library migration tasks. Query official docs and OSS examples for modern replacements.When you encounter deprecated methods/APIs during refactoring:
librarian\ to find the recommended modern alternativelibrarian\ to fetch latest API docs before making changesRemember: Refactoring without tests is reckless. Refactoring without understanding is destructive. This command ensures you do neither.
<user-request>
$ARGUMENTS
</user-request>
`
export const REFACTOR_TEAM_MODE_ADDENDUM = `
Team mode is enabled for this session. The rules below override Phase 4-6 above. Follow this protocol instead of the in-session step-by-step execution.
When invoking the Plan agent in Phase 4.1, append this additional requirement to the prompt:
\\\`
\\\`
Classification rules the plan agent must apply to each step:
quick\: mechanical edits — LSP rename, extract variable, inline, simple move, signature change without call-site logic.unspecified-low\: logic-preserving refactors that need reasoning — extract function, restructure conditional, pattern transformation, cross-file API change.team\ path when \file_independent_steps >= 3\; recommend \legacy\ otherwise.Read the Team Staffing Recommendation from Phase 4. If any required field is missing, fail here and re-request the plan with the exact missing field names. Do not proceed with a partial plan.
Then choose the path:
team\ AND \file_independent_steps >= 3\. Members execute in parallel, Lead orchestrates, a \deep\ verifier lives outside the team.Record the chosen path in the TodoWrite list.
refactor-squad\ team executionPrecondition checks (fail hard if any step fails):
team-mode\ skill via the \skill\ tool for lifecycle, message protocol, and limits.team_list\ and verify no active \refactor-squad\ run exists; if one does, shutdown + delete the orphan before proceeding.~/.omo/teams/refactor-squad/config.json\ is missing, write it using the spec below.Team spec (\~/.omo/teams/refactor-squad/config.json\):
\\\`json
{
"name": "refactor-squad",
"lead": { "kind": "subagent_type", "subagent_type": "sisyphus" },
"members": [
{
"kind": "category",
"category": "quick",
"prompt": "You handle mechanical refactoring steps (LSP rename, extract variable, inline, simple move, signature change). Use LSP tools for correctness. Apply the task description's per-step instructions verbatim — no scope expansion. After edits, run lsp_diagnostics on touched files. Report via team_send_message(teamRunId=<id>, to=\"lead\", summary=<files touched>, body=<lsp status + diff summary>) + team_task_update(status=completed). Never run tests — the external verifier handles that. Never git add, never --continue."
},
{ "kind": "category", "category": "quick", "prompt": "Same contract as peer quick worker." },
{
"kind": "category",
"category": "unspecified-low",
"prompt": "You handle logic-preserving refactors that need reasoning (extract function, restructure conditional, pattern transformation, cross-file API change). Read the task description's plan step carefully. Use the ast-grep skill helper or sg CLI to preview structural rewrites first, review the preview, then execute. If the step is ambiguous or would require out-of-scope changes, STOP and send team_send_message(teamRunId=<id>, to=\"lead\", summary=\"UNCLEAR\", body=<reason>) + team_task_update(status=pending). Same reporting contract as peer quick workers. Never run tests."
},
{ "kind": "category", "category": "unspecified-low", "prompt": "Same contract as peer unspecified-low worker." }
]
}
\\\`
Rationale for this composition:
deep\ reasoning (or \unspecified-high\ fallback). In-team category routing downcasts to sisyphus-junior, which is weaker than required — the verifier runs OUTSIDE the team as a \task(category="deep")\.Team lifecycle (one team, reused until Phase 6 cleanup):
team_create(teamName="refactor-squad")\. Record \teamRunId\.\\\`
team_send_message(
teamRunId=<id>, to="*", kind="announcement",
summary="refactor-intent",
body=<codemap summary + constraints + established patterns from Phase 2>
)
\\\`
\\\`
team_send_message(
teamRunId=<id>, to="*", kind="announcement",
summary="verify-spec",
body=<exact test/typecheck/lint commands + expected pass counts + regression indicators from Phase 3.4>
)
\\\`
team_task_create(teamRunId=<id>, subject="refactor step <N>: <short>", description=<per-step instructions from plan, including target files and line ranges, rollback strategy>, blockedBy=<from plan's per_step_assignment>)\.Lead monitoring loop:
While any team task is \pending | claimed | in_progress\:
<system-reminder>\ or member messages. Avoid tight polling; a single \team_status\ check is acceptable if no notification arrives within roughly 10 seconds of expected completion.\\\`
task(
category="deep",
load_skills=[],
run_in_background=true,
description="verify step <N>",
prompt=<files touched + verify-spec commands + instruction to return "PASS" or "FAIL:<failing test + specific error + suggested revert hunks>">
)
\\\`
If \deep\ is unavailable, fall back to \category="unspecified-high"\. Do not create a commit checkpoint until the verifier returns PASS.
team_task_update(status=pending)\ on the original step + \team_send_message(teamRunId=<id>, to=<original member>, summary="retry", body=<specific failure from verifier>)\. Runtime reassigns.task()\ outside the team, broadcast an updated Intent Card fragment, then reassign.Proceed to Phase 6 only when every team task is \completed\ AND every paired verifier task returned PASS.
If Phase 5 used the team path, dismantle \refactor-squad\ BEFORE producing the 6.6 summary. Every exit path — success, escalation, abort — must cleanup; orphan teams poison the next session's precondition check.
team_shutdown_request\ for each member, then \team_approve_shutdown\ if members do not self-approve within a reasonable window.team_delete(teamRunId=<id>)\.team_list\ to confirm no residual \refactor-squad\ run.The \~/.omo/teams/refactor-squad/config.json\ declaration stays on disk; next session reuses it.
Append to the 6.6 summary a "Dispatch path" line and, when team path was used, team metrics (teamRunId, tasks created, verifier runs, team lifetime).
oracle\ / \librarian\ / \deep\ into the team spec — oracle/librarian are team-ineligible, and \deep\ under category routing downcasts to sisyphus-junior. Use them via \task()\ outside the team when needed.`
Take code-yeongyu/refactor from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.