---
name: dry-refactor
description: Use when user asks to "remove duplicates", "DRY up code", "extract common logic", "consolidate repeated code", or when /dry scan finds duplicates. Provides language-specific refactoring guidance.
user-invocable: false
---

# DRY Refactoring Guide

Help users eliminate code duplication by extracting shared logic into reusable modules.

## When This Applies

- User mentions "duplicates", "DRY", "repeated code", "copy-paste"
- `/bluera-base:dry scan` found duplicates that need refactoring
- Code review identified similar patterns across files

## When Duplication is Acceptable

Not all duplication is bad. Keep duplicates when:

1. **Test code**: Explicit test cases can repeat for clarity
2. **Generated code**: Don't DRY generated files
3. **Incidental similarity**: Coincidentally similar code that may diverge
4. **Coupling cost**: Extraction would create tight coupling between unrelated modules

## Refactoring Workflow

### 1. Analyze the Duplicates

```bash
# Run scan if not already done
/bluera-base:dry scan

# Review the report
/bluera-base:dry report
```

### 2. Categorize Each Duplicate

| Category | Action |
|----------|--------|
| **Exact copy** | Extract immediately |
| **Near-duplicate** | Parameterize differences, then extract |
| **Structural** | Consider codegen/templates |
| **Coincidental** | Leave as-is, document why |

### 3. Choose Extraction Target

| Scope | Target |
|-------|--------|
| Same file | Local function/method |
| Same module/package | Shared utility file |
| Across modules | New shared module |
| Across repos | Shared library/package |

### 4. Execute Extraction

1. Create the shared abstraction
2. Move one instance, verify tests pass
3. Replace remaining instances
4. Update imports/exports
5. Run tests after each replacement

### 5. Validate

- [ ] All tests pass
- [ ] No circular dependencies introduced
- [ ] Public API unchanged (if applicable)
- [ ] Code is actually simpler (not over-abstracted)

## Anti-patterns to Avoid

1. **Wrong abstraction**: Forcing unrelated code together
2. **Over-parameterization**: Too many config options
3. **Premature extraction**: Extracting before patterns stabilize
4. **Leaky abstraction**: Exposing implementation details

## Language-Specific Patterns

See `skills/dry-refactor/references/patterns.md` for detailed examples:

| Language | Primary Pattern |
|----------|-----------------|
| JS/TS | Module export, barrel index |
| Python | Module with **init**.py |
| Rust | Submodule with pub use |
| Go | Same-package separate file |

## Report Integration

When `/bluera-base:dry scan` identifies duplicates:

1. Review the report at `.bluera/bluera-base/state/dry-report.md`
2. Start with highest-impact duplicates (most tokens/instances)
3. Use suggested extraction targets from the report
4. Re-run `/bluera-base:dry scan` after refactoring to verify reduction
