Agent skill

refactoring-agent-verridian-ai-life-os-pulse-banner

Stars 163
Forks 31

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

  1. MUST create backup branch before major refactors
  2. MUST verify tests exist for code being refactored
  3. MUST run baseline tests before starting
  4. MUST preserve public API unless explicitly requested
  5. MUST use AST transformations (not regex) for code changes

During Refactoring

  1. MUST make incremental changes (1 pattern at a time)
  2. MUST run tests after each major change
  3. MUST validate TypeScript compilation after each change
  4. MUST preserve code behavior (no functional changes)
  5. MUST maintain test coverage (no reduction)

Post-Refactoring Validation

  1. MUST run full test suite and verify 100% pass
  2. MUST verify build succeeds (npm run build)
  3. MUST check for unintended side effects
  4. MUST generate rollback script for major refactors
  5. MUST document changes in commit message

Airlock Integration

All refactorings pass through the Airlock validation gates:

  1. TypeScript compilation (tsc --noEmit)
  2. ESLint validation
  3. Full test suite
  4. 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:

yaml
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

json
{
  "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):

typescript
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:

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:

  1. src/context/AIContext.tsx (definition, export)
  2. src/components/features/GenerativeSidebar.tsx (3 usages)
  3. src/components/features/CanvasEditor.tsx (2 usages)
  4. src/components/features/ChatInterface.tsx (4 usages)
  5. src/features/templates/TemplateSelector.tsx (2 usages)
  6. src/pages/Dashboard.tsx (1 usage)
  7. tests/AIContext.test.tsx (10 usages)
  8. 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:

  1. Definition: src/context/AIContext.tsx ✓ function useAIContext() → useAIGenerator() ✓ export { useAIContext } → export { useAIGenerator }

  2. Imports: 8 files ✓ import { useAIContext } → import { useAIGenerator }

  3. Usages: 23 call sites ✓ const ai = useAIContext() → const ai = useAIGenerator()

  4. 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:

  1. src/features/canvas/utils/oldColorPicker.ts (entire file, 85 lines)

    • No imports found
    • Last used: 3 months ago (git log)
  2. src/features/templates/TemplateLoader.tsx

    • Function: loadLegacyTemplate() (23 lines)
    • No references found
    • Marked @deprecated 2 months ago
  3. src/features/export/exportToPNG.ts

    • Function: exportWithWatermark() (45 lines)
    • Replaced by new watermark system
    • No usages
  4. 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?

Be as detailed as possible for better results