Skip to main content
skill CX Codex

refactoring-specialist — Claude Code skill: refactor without breaking

A skill that walks the agent through refactoring: spot the code smell, pick a technique, keep the tests green.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add zhaono1/agent-playbook --skill refactoring-specialist -a claude-code
Open on GitHub

What refactoring-specialist does

The skill activates when you ask to clean up code, mention technical debt or a code smell, or want better structure. It ships a catalog of ten common problems: long method, duplicate code, large class, long parameter list, primitive obsession, big switch statements and more. Each entry gives the symptom and the move — extract method, extract class, replace conditional with polymorphism, introduce a parameter object.

The workflow is stepwise. Identify what makes the code hard to work with, choose the technique, confirm tests pass before touching anything, apply the change, run tests again, commit. Small atomic commits after each successful step are part of the method.

The skill assumes your tests already pass. Without a green run before you start, it can't show that external behavior stayed the same, so fix the suite first. Its allowed-tools list covers Read, Write, Edit, Bash, Grep and Glob, so the agent can edit files and run commands. Three reference files sit alongside: references/smells.md, references/techniques.md, references/checklist.md.

What it helps with

  • split a 50-line function into readable steps
  • remove duplicated email validation from two services
  • pull auth, profile and notifications out of one class
  • replace a six-argument function with a data object
  • rewrite a type switch as polymorphism

Example prompts for the agent

  • refactor this file, keep the tests green
  • this module smells — go through it and suggest fixes
  • remove the duplication between UserService and AdminService

How to install refactoring-specialist

1Skills CLI (Vercel)

npx skills add zhaono1/agent-playbook --skill refactoring-specialist -a claude-code

2Manually: put the files in place

~/.claude/skills/refactoring-specialist/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/refactoring-specialist/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about refactoring-specialist

How do I install refactoring-specialist in Claude?

Run npx skills add zhaono1/agent-playbook --skill refactoring-specialist -a claude-code. The skill lands at ~/.claude/skills/refactoring-specialist/SKILL.md.

What does refactoring-specialist do?

It guides the agent through improving code structure and readability while preserving behavior. It names the code smell, picks a refactoring technique and verifies the result with tests.

Do I need tests for this skill to work?

Yes. The skill checks that tests pass before and after every change, so a red suite has to be fixed first.

Source text

SKILL.md · MIT
---
name: refactoring-specialist
description: Code refactoring expert for improving code structure, readability, and maintainability. Use when user asks to refactor, clean up, or improve code quality.
allowed-tools: Read, Write, Edit, Bash, Grep, Glob
metadata:
  hooks:
    after_complete:
      - trigger: self-improving-agent
        mode: background
        reason: "Learn from refactoring patterns"
      - trigger: session-logger
        mode: auto
        reason: "Log refactoring activity"
---

# Refactoring Specialist

Expert guidance on refactoring code to improve structure, readability, and maintainability while preserving functionality.

## When This Skill Activates

Activates when you:
- Ask to refactor code
- Request cleanup or improvement
- Mention "technical debt" or "code smell"
- Want to improve code quality

## Refactoring Principles

1. **Preserve Behavior**: Refactoring must not change external behavior
2. **Small Steps**: Make small, incremental changes
3. **Test Coverage**: Ensure tests pass before and after
4. **Commit Often**: Commit after each successful refactoring

## Code Smells to Address

### 1. Long Method
**Symptom:** Function > 20-30 lines

**Refactoring:** Extract Method
```typescript
// Before:
function processOrder(order) {
  // 50 lines of code
}

// After:
function processOrder(order) {
  validateOrder(order);
  calculateTotals(order);
  saveOrder(order);
  sendConfirmation(order);
}
```

### 2. Duplicate Code
**Symptom:** Similar code in multiple places

**Refactoring:** Extract Method / Template Method
```typescript
// Before:
class UserService {
  async validateEmail(email) {
    if (!email || !email.includes('@')) return false;
    const domain = email.split('@')[1];
    return domain.length > 0;
  }
}
class AdminService {
  async validateEmail(email) {
    if (!email || !email.includes('@')) return false;
    const domain = email.split('@')[1];
    return domain.length > 0;
  }
}

// After:
class EmailValidator {
  async validate(email) {
    if (!email || !email.includes('@')) return false;
    return email.split('@')[1].length > 0;
  }
}
```

### 3. Large Class
**Symptom:** Class doing too many things

**Refactoring:** Extract Class
```typescript
// Before:
class User {
  // Authentication
  // Profile management
  // Notifications
  // Reporting
}

// After:
class User { /* Core user data */ }
class UserAuth { /* Authentication */ }
class UserProfile { /* Profile management */ }
class UserNotifier { /* Notifications */ }
```

### 4. Long Parameter List
**Symptom:** Function with 4+ parameters

**Refactoring:** Introduce Parameter Object
```typescript
// Before:
function createUser(name, email, age, address, phone, role) { ... }

// After:
function createUser(user: UserData) { ... }

interface UserData {
  name: string;
  email: string;
  age: number;
  address: string;
  phone: string;
  role: string;
}
```

### 5. Feature Envy
**Symptom:** Method uses more data from other classes

**Refactoring:** Move Method
```typescript
// Before:
class Report {
  formatSummary(formatter) {
    const options = formatter.getFormattingOptions();
    // ...
  }
}

// After:
class Formatter {
  formatReport(report) {
    const discount = this.discountLevel;
    // ...
  }
}
```

### 6. Data Clumps
**Symptom**: Same data appearing together

**Refactoring**: Extract Value Object
```typescript
// Before:
function drawShape(x, y, width, height) { ... }
function moveShape(x, y, width, height, dx, dy) { ... }

// After:
class Rectangle {
  constructor(x, y, width, height) { ... }
}
function drawShape(rect: Rectangle) { ... }
```

### 7. Primitive Obsession
**Symptom**: Using primitives instead of small objects

**Refactoring**: Replace Primitive with Object
```typescript
// Before:
function createUser(name, email, phone) { ... }

// After:
class Email {
  constructor(value) {
    if (!this.isValid(value)) throw new Error('Invalid email');
    this.value = value;
  }
  // ...
}
```

### 8. Switch Statements
**Symptom**: Large switch on type

**Refactoring**: Replace Conditional with Polymorphism
```typescript
// Before:
function calculatePay(employee) {
  switch (employee.type) {
    case 'engineer': return employee.salary * 1.2;
    case 'manager': return employee.salary * 1.5;
    case 'sales': return employee.salary * 1.1;
  }
}

// After:
interface Employee {
  calculatePay(): number;
}
class Engineer implements Employee {
  calculatePay() { return this.salary * 1.2; }
}
```

### 9. Temporary Field
**Symptom**: Variables only used in certain scenarios

**Refactoring**: Extract Class
```typescript
// Before:
class User {
  calculateRefund() {
    this.tempRefundAmount = 0;
    // complex calculation
    return this.tempRefundAmount;
  }
}

// After:
class RefundCalculator {
  calculate(user) {
    // ...
  }
}
```

### 10. Comments
**Symptom**: Code needs extensive comments

**Refactoring**: Extract Method with clear name
```typescript
// Before:
// Calculate the total price including discounts
// and tax based on user location
function calc(u, i) {
  let t = 0;
  // discount logic
  if (u.vip) t *= 0.9;
  // tax logic
  if (u.state === 'CA') t *= 1.08;
  return t;
}

// After:
function calculateTotalPrice(user: User, items: Item[]): number {
  let total = items.sum(i => i.price);
  if (user.isVIP) {
    total = applyVIPDiscount(total);
  }
  return applyTax(total, user.state);
}
```

## Refactoring Steps

1. **Identify the smell** - What makes this code hard to work with?
2. **Determine the refactoring** - Which technique applies?
3. **Ensure tests pass** - Green before starting
4. **Apply the refactoring** - Make the change
5. **Run tests** - Verify behavior unchanged
6. **Commit** - Small, atomic commits

## Safe Refactoring Practices

- Use your IDE's refactoring tools (Rename, Extract, Move)
- Run tests frequently (after each change)
- Keep commits small and focused
- Write a descriptive commit message
- Consider code reviews for complex refactorings

## Before Refactoring

- [ ] Tests are passing
- [ ] I understand what the code does
- [ ] I have identified the specific code smell
- [ ] I know which refactoring to apply
- [ ] I have a rollback plan

## After Refactoring

- [ ] Tests still pass
- [ ] Code is more readable
- [ ] Code is easier to maintain
- [ ] No new code smells introduced
- [ ] Documentation updated if needed

## References

- `references/smells.md` - Complete code smell catalog
- `references/techniques.md` - Refactoring techniques
- `references/checklist.md` - Refactoring checklist

© zhaono1 · MIT · zhaono1/agent-playbook

Similar skills

All skills for Code review and refactoring →

From the same set21

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor