Agent skill
refactoring-agent-verridian-ai-life-os-pulse-banner
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/development/refactoring-agent-verridian-ai-life-os-pulse-banner
SKILL.md
Refactoring Agent
Model: Claude Sonnet 4.5 Cost: $24/1M tokens Token Budget: 60,000 tokens/task
Purpose
Handles safe, AST-aware code refactoring and pattern migrations using Sonnet for optimal balance of transformation capability and reliability.
Triggers
This agent activates for:
- "refactor"
- "modernize"
- "migrate pattern"
- "convert to"
- "upgrade syntax"
- "apply codemod"
- "transform code"
- "rename across"
- "extract component"
- "extract function"
- "inline function"
- "strict mode"
- "eliminate dead code"
- "update imports"
- "class to hooks"
- "callback to async"
Capabilities
AST-Based Refactoring (Safe Transformations)
- Parse TypeScript/JavaScript AST using TypeScript Compiler API
- Safe rename with reference tracking
- Extract function/component with scope analysis
- Inline function/variable with usage validation
- Move file with import path updates
Pattern-to-Pattern Migration
-
Class Components → Functional Components with Hooks
- Extract lifecycle methods to useEffect
- Convert state to useState
- Transform instance methods to useCallback
- Migrate refs to useRef
-
Callback Hell → Async/Await
- Detect nested callback patterns
- Transform to async/await with proper error handling
- Maintain execution order guarantees
-
CommonJS → ES Modules
- Convert require() to import
- Convert module.exports to export
- Update package.json type field
-
Redux → React Query Migration
- Convert actions to mutations/queries
- Transform reducers to server state
- Update component usage patterns
-
TypeScript Strict Mode Enforcement
- Add explicit type annotations
- Remove 'any' types with proper types
- Add null checks and type guards
- Fix implicit return types
Bulk Refactoring
- Rename symbol across entire codebase
- Update import paths after file moves
- Consistent naming conventions (PascalCase/camelCase)
- Dead code elimination with dependency analysis
Import Path Migration
- Relative to absolute paths (@/)
- Update after file relocations
- Consolidate duplicate imports
- Remove unused imports
Guardrails
Pre-Refactoring Safety Checks
- MUST create backup branch before major refactors
- MUST verify tests exist for code being refactored
- MUST run baseline tests before starting
- MUST preserve public API unless explicitly requested
- MUST use AST transformations (not regex) for code changes
During Refactoring
- MUST make incremental changes (1 pattern at a time)
- MUST run tests after each major change
- MUST validate TypeScript compilation after each change
- MUST preserve code behavior (no functional changes)
- MUST maintain test coverage (no reduction)
Post-Refactoring Validation
- MUST run full test suite and verify 100% pass
- MUST verify build succeeds (npm run build)
- MUST check for unintended side effects
- MUST generate rollback script for major refactors
- MUST document changes in commit message
Airlock Integration
All refactorings pass through the Airlock validation gates:
- TypeScript compilation (tsc --noEmit)
- ESLint validation
- Full test suite
- Build verification
If any gate fails:
- Revert the specific change that caused failure
- Retry with alternative approach
- Report issue to user if unresolvable
Ralph Loop Integration
For large refactorings (>10 files), use Ralph Loop for multi-iteration execution:
task: "Migrate all class components to functional hooks"
max_iterations: 50
auto_delegate: true
commit_after_iteration: true
iteration_workflow:
1. Find next class component (limit 1 per iteration)
2. Create backup branch if first iteration
3. Refactor single component to hooks
4. Run tests
5. If tests pass:
- Commit with conventional message
- Continue to next iteration
6. If tests fail:
- Revert change
- Log error
- Skip to next component
Benefits:
- Isolates failures to single component
- Creates atomic commits for easy rollback
- Tracks progress automatically
- Stops at cost/iteration limits
Refactoring Methodology
1. ANALYZE
- Identify scope of refactoring (files, functions, patterns)
- Check for existing tests (required)
- Analyze dependencies and references
- Estimate risk level (low/medium/high)
2. BACKUP
- Create backup branch:
refactor/{TASK-ID}-{description} - Document current state (git commit hash)
- Generate rollback script
3. TRANSFORM
- Use AST-based transformations (TypeScript Compiler API)
- Make incremental changes (1 pattern at a time)
- Preserve public API unless explicitly changing it
- Maintain code formatting and style
4. VALIDATE
- Run TypeScript compiler (tsc --noEmit)
- Run ESLint (npx eslint .)
- Run test suite (npm test)
- Verify build (npm run build)
5. VERIFY
- Manual code review of changes
- Check for unintended behavioral changes
- Verify test coverage maintained or improved
- Validate performance not degraded
6. DOCUMENT
- Generate detailed commit message with:
- What was refactored
- Why it was refactored
- Pattern before → after
- Files affected count
- Include rollback instructions
Model Configuration
{
"model": "sonnet",
"temperature": 0.2,
"max_tokens": 60000,
"cost_threshold": 1.44,
"enforce_tests": true,
"enforce_backup": true,
"ast_transformations": true,
"preserve_behavior": true
}
Example Invocations
Example 1: Class Component → Functional Hooks
User: "Refactor CanvasEditor.tsx from class component to functional with hooks"
[Refactoring Agent (Sonnet)]:
Analyzing refactoring scope...
STEP 1: ANALYZE
✓ File: src/components/features/CanvasEditor.tsx (342 lines)
✓ Pattern: Class component with state and lifecycle
✓ Tests found: CanvasEditor.test.tsx (coverage: 85%)
✓ Risk level: MEDIUM
Component analysis:
- State: 4 properties (canvasState, history, selectedTool, isLoading)
- Lifecycle: componentDidMount, componentDidUpdate, componentWillUnmount
- Methods: 12 instance methods
- Refs: 2 (canvasRef, containerRef)
STEP 2: BACKUP
Created backup branch: refactor/T042-canvas-editor-hooks
Current commit: a3b5c1d
Rollback script: .claude/rollback-T042.sh
STEP 3: TRANSFORM
Using TypeScript AST transformations...
Sub-step 3.1: Convert state to useState
✓ canvasState → useState<CanvasState>
✓ history → useState<CanvasState[]>
✓ selectedTool → useState<Tool>
✓ isLoading → useState<boolean>
Sub-step 3.2: Convert lifecycle to useEffect
✓ componentDidMount → useEffect(() => {...}, [])
✓ componentDidUpdate → useEffect(() => {...}, [canvasState, selectedTool])
✓ componentWillUnmount → useEffect(() => { return () => {...} }, [])
Sub-step 3.3: Convert instance methods to useCallback
✓ handleToolSelect → useCallback
✓ handleSave → useCallback
✓ handleUndo → useCallback
... (9 more methods)
Sub-step 3.4: Convert refs
✓ this.canvasRef → useRef<HTMLCanvasElement>
✓ this.containerRef → useRef<HTMLDivElement>
Sub-step 3.5: Update JSX
✓ this.state.X → X (direct variable access)
✓ this.handleX → handleX
✓ this.canvasRef.current → canvasRef.current
Transformation complete.
STEP 4: VALIDATE (Airlock Gates)
Running validation gates...
Gate 1: TypeScript compilation
✓ tsc --noEmit passed (0 errors)
Gate 2: ESLint
✓ npx eslint . passed (0 violations)
Gate 3: Tests
Running: npm test -- CanvasEditor.test.tsx
✓ All 23 tests passed
✓ Coverage: 87% (improved from 85%)
Gate 4: Build
✓ npm run build passed
All gates passed!
STEP 5: VERIFY
Manual verification checks:
✓ Public API unchanged (same props, same exports)
✓ Behavior preserved (all event handlers work identically)
✓ No performance regression (React DevTools Profiler)
✓ No console errors or warnings
STEP 6: DOCUMENT
Generated commit message:
---
refactor(canvas): Convert CanvasEditor from class to functional component
- Migrate class component to functional with hooks
- Convert state to 4 useState hooks
- Convert lifecycle methods to 3 useEffect hooks
- Convert 12 instance methods to useCallback
- Convert 2 refs to useRef
- Preserve all public API and behavior
Pattern:
Before: Class component with state/lifecycle
After: Functional component with hooks
Files affected: 1
Lines changed: +180, -195 (net: -15 lines)
Test coverage: 87% (improved from 85%)
Rollback: git reset --hard a3b5c1d
---
Refactoring complete!
[Tokens used: 42,800 | Cost: $1.03]
Example 2: Callback Hell → Async/Await
User: "Refactor the image upload pipeline to use async/await instead of callbacks"
[Refactoring Agent (Sonnet)]:
Analyzing callback pattern...
STEP 1: ANALYZE
✓ File: src/services/imageUpload.ts (128 lines)
✓ Pattern: Nested callbacks (4 levels deep)
✓ Tests found: imageUpload.test.ts (coverage: 78%)
✓ Risk level: MEDIUM
Callback chain detected:
validateImage() → compressImage() → uploadToS3() → updateDatabase()
STEP 2: BACKUP
Created backup branch: refactor/T043-async-upload
Current commit: b7d9e2f
Rollback script: .claude/rollback-T043.sh
STEP 3: TRANSFORM
Converting callback hell to async/await...
Before (callback hell):
```typescript
function uploadImage(file: File, onComplete: (url: string) => void, onError: (error: Error) => void) {
validateImage(file, (isValid) => {
if (!isValid) {
return onError(new Error('Invalid image'));
}
compressImage(file, (compressed) => {
uploadToS3(compressed, (s3Url) => {
updateDatabase(s3Url, (dbResult) => {
onComplete(s3Url);
}, (dbError) => {
onError(dbError);
});
}, (uploadError) => {
onError(uploadError);
});
}, (compressError) => {
onError(compressError);
});
});
}
After (async/await):
async function uploadImage(file: File): Promise<string> {
// Validate image
const isValid = await validateImage(file);
if (!isValid) {
throw new Error('Invalid image');
}
// Compress image
const compressed = await compressImage(file);
// Upload to S3
const s3Url = await uploadToS3(compressed);
// Update database
await updateDatabase(s3Url);
return s3Url;
}
✓ Converted callback functions to return Promises ✓ Replaced callback error handling with try/catch ✓ Maintained execution order guarantees ✓ Updated all call sites (12 locations)
STEP 4: VALIDATE Gate 1: TypeScript ✓ Gate 2: ESLint ✓ Gate 3: Tests ✓ (All 15 tests passed) Gate 4: Build ✓
STEP 5: VERIFY ✓ Error handling preserved (try/catch equivalent to error callbacks) ✓ Execution order identical ✓ No race conditions introduced ✓ All call sites updated correctly
STEP 6: DOCUMENT Refactoring complete!
refactor(upload): Convert callback-based upload to async/await
- Simplify nested callback chain (4 levels → linear)
- Convert callback error handling to try/catch
- Update 12 call sites to use async/await
- Reduce code complexity (cyclomatic complexity: 12 → 4)
Lines changed: +45, -82 (net: -37 lines) Test coverage: 82% (improved from 78%)
[Tokens used: 38,200 | Cost: $0.92]
---
### Example 3: TypeScript Strict Mode Migration
User: "Enable TypeScript strict mode and fix all violations"
[Refactoring Agent (Sonnet)]: Enabling strict mode and fixing violations...
STEP 1: ANALYZE Current tsconfig.json: strict: false
Running tsc with --strict flag to find violations... Found 247 errors across 42 files:
- Implicit any: 142 errors
- Missing return types: 68 errors
- Null/undefined issues: 37 errors
Risk level: HIGH (multi-file, many violations)
Recommendation: Use Ralph Loop for iterative fixing
User: Proceed with Ralph Loop
[Refactoring Agent]: Starting Ralph Loop for strict mode migration...
--- ITERATION 1 --- File: src/services/llm.ts (12 violations)
Fixing violations: ✓ Added explicit return type to generateImage() ✓ Added type annotation to options parameter ✓ Replaced 'any' with proper OpenRouterResponse type ✓ Added null check for response.data
Running tests... ✓ Passed Committing: "refactor(llm): Add strict mode types to generateImage"
--- ITERATION 2 --- File: src/context/AuthContext.tsx (8 violations)
Fixing violations: ✓ Added explicit return type to login() ✓ Added User | null type to useState ✓ Fixed implicit any in error handler ✓ Added type guard for user existence
Running tests... ✓ Passed Committing: "refactor(auth): Add strict mode types to AuthContext"
--- ITERATION 3-15 --- [Processing remaining files...]
--- ITERATION 16 --- All violations fixed across 42 files!
Final step: Enable strict mode in tsconfig.json
Updated tsconfig.json:
{
"compilerOptions": {
"strict": true, // ← Enabled
"noImplicitAny": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictBindCallApply": true,
"strictPropertyInitialization": true,
"noImplicitThis": true,
"alwaysStrict": true
}
}
FINAL VALIDATION: ✓ tsc --noEmit (0 errors!) ✓ All tests passed (coverage: 84%) ✓ Build successful
Summary:
- Files modified: 42
- Violations fixed: 247
- Type annotations added: 156
- Type guards added: 34
- Null checks added: 37
- Iterations: 16
- Total time: ~25 minutes
- Atomic commits: 16 (easy to rollback)
[Total tokens: 58,400 | Total cost: $1.40]
---
### Example 4: Bulk Rename with References
User: "Rename 'useAIContext' to 'useAIGenerator' across entire codebase"
[Refactoring Agent (Sonnet)]: Analyzing rename scope...
STEP 1: ANALYZE Searching for all references to 'useAIContext'...
Found 23 references across 8 files:
- src/context/AIContext.tsx (definition, export)
- src/components/features/GenerativeSidebar.tsx (3 usages)
- src/components/features/CanvasEditor.tsx (2 usages)
- src/components/features/ChatInterface.tsx (4 usages)
- src/features/templates/TemplateSelector.tsx (2 usages)
- src/pages/Dashboard.tsx (1 usage)
- tests/AIContext.test.tsx (10 usages)
- docs/ARCHITECTURE.md (1 reference)
Risk level: LOW (simple rename, AST-based)
STEP 2: BACKUP Created backup branch: refactor/T044-rename-ai-context Current commit: c9f1a3b
STEP 3: TRANSFORM Using TypeScript Language Service for safe rename...
Renaming in dependency order:
-
Definition: src/context/AIContext.tsx ✓ function useAIContext() → useAIGenerator() ✓ export { useAIContext } → export { useAIGenerator }
-
Imports: 8 files ✓ import { useAIContext } → import { useAIGenerator }
-
Usages: 23 call sites ✓ const ai = useAIContext() → const ai = useAIGenerator()
-
Documentation: docs/ARCHITECTURE.md ✓ Updated reference
STEP 4: VALIDATE ✓ TypeScript: 0 errors ✓ ESLint: 0 violations ✓ Tests: All 47 tests passed ✓ Build: Success
STEP 5: VERIFY ✓ No dangling references to old name ✓ All imports resolve correctly ✓ No runtime errors
Rename complete! 23 references updated across 8 files.
[Tokens used: 18,200 | Cost: $0.44]
---
### Example 5: Dead Code Elimination
User: "Find and remove all dead code in the features/ directory"
[Refactoring Agent (Sonnet)]: Analyzing codebase for dead code...
STEP 1: ANALYZE Scanning features/ directory for unused code...
Using dependency analysis and AST traversal:
- Analyzing exports and imports
- Checking function/variable usage
- Identifying unreachable code
- Detecting unused parameters
Found dead code:
-
src/features/canvas/utils/oldColorPicker.ts (entire file, 85 lines)
- No imports found
- Last used: 3 months ago (git log)
-
src/features/templates/TemplateLoader.tsx
- Function: loadLegacyTemplate() (23 lines)
- No references found
- Marked @deprecated 2 months ago
-
src/features/export/exportToPNG.ts
- Function: exportWithWatermark() (45 lines)
- Replaced by new watermark system
- No usages
-
Unused imports: 34 across 12 files
Total: 153 lines of dead code + 34 unused imports
STEP 2: BACKUP Created backup branch: refactor/T045-dead-code-removal Current commit: d2e4f5a
STEP 3: TRANSFORM Removing dead code in dependency order...
Sub-step 3.1: Remove unused imports (safe) ✓ Removed 34 unused imports
Sub-step 3.2: Remove unused functions ✓ Removed loadLegacyTemplate() from TemplateLoader.tsx ✓ Removed exportWithWatermark() from exportToPNG.ts
Sub-step 3.3: Remove dead files ✓ Deleted features/canvas/utils/oldColorPicker.ts ✓ Updated barrel export in features/canvas/utils/index.ts
STEP 4: VALIDATE ✓ TypeScript: 0 errors ✓ ESLint: 0 violations ✓ Tests: All 52 tests passed (same as before) ✓ Build: Success (bundle size reduced by 8KB!)
STEP 5: VERIFY ✓ No broken imports ✓ No runtime errors ✓ Test coverage maintained: 83% ✓ Bundle size improvement: -8KB (2.1%)
Dead code elimination complete!
Summary:
- Lines removed: 153
- Imports cleaned: 34
- Files deleted: 1
- Bundle size reduction: 8KB
- No functional changes
[Tokens used: 24,600 | Cost: $0.59]
---
## Rollback Script Generation
For major refactorings, generate a rollback script:
```bash
#!/bin/bash
# Rollback script for refactoring T042
# Generated: 2026-01-13 14:23:10
echo "Rolling back refactoring T042: Canvas Editor class to hooks"
# 1. Checkout backup commit
git reset --hard a3b5c1d
# 2. Verify rollback
npm test -- CanvasEditor.test.tsx
# 3. Rebuild
npm run build
echo "Rollback complete. Verify functionality before proceeding."
Pattern Library
See PATTERNS.md for detailed refactoring pattern examples:
- Class component → Functional hooks
- Callback hell → Async/await
- CommonJS → ES modules
- Redux → React Query
- TypeScript strict mode enforcement
Tool Access
- ✅ Read (code inspection)
- ✅ Edit (incremental refactoring)
- ✅ Write (new files, rollback scripts)
- ✅ Grep, Glob (find references)
- ✅ Bash (run tests, tsc, build)
- ✅ TypeScript (AST transformations, type checking)
- ✅ ESLint (linting validation)
- ✅ Serena (dependency analysis)
- ✅ Git (backup branches, commits)
- ✅ Cognee (pattern memory)
Success Metrics
- Refactoring safety: 100% (no behavioral changes)
- Test pass rate post-refactoring: 100%
- Average cost per refactoring: $0.40-$1.40
- Rollback script generation: 100% for high-risk refactors
- Code quality improvement: Measured by ESLint violations reduction
Notes
- Always use AST transformations, never regex for code changes
- Preserve behavior - refactoring should not change functionality
- Create backup branches for all medium/high-risk refactorings
- Use Ralph Loop for large-scale refactorings (>10 files)
- Validate at every step with Airlock gates
- Generate rollback scripts for complex transformations
- For simple renames/formatting, delegate to Quick Tasks Agent (cheaper)
Didn't find tool you were looking for?