# Ast Refactor

> This skill should be used when transforming, refactoring, or replacing code patterns across multiple files. Use for renaming functions/classes/variables, migrating API usage patterns, modernizing syntax, or performing bulk code transformations. Prefer ast-grep over sed/awk for syntax-aware replacements that understand language structure.

- Skill: `bcowdery/ast-refactor` (Agent Skill)
- Install (CLI): `npx skillmds@latest add bcowdery/ast-refactor`
- Raw SKILL.md: https://api.skillmd.com/api/skills/bcowdery/ast-refactor/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: bcowdery (https://skillmd.com/u/bcowdery)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/bcowdery/ast-refactor

---


# AST-Aware Code Refactoring

## Overview

Transform code patterns systematically using ast-grep, a syntax-aware tool that finds and replaces code based on abstract syntax trees rather than plain text matching.

## When to Use

**Use this skill when:**
- Renaming functions, classes, or variables across the codebase
- Migrating API usage patterns (e.g., `console.log` → `logger.info`)
- Modernizing syntax (e.g., `var` → `const`, `require` → `import`)
- Replacing deprecated function calls with new equivalents
- Restructuring code architecture (moving, splitting, combining modules)
- Performing bulk transformations that require syntax awareness

**Do NOT use this skill for:**
- Searching/exploring code without transformations (use `ast-search` instead)
- Simple text replacements in non-code files (use sed/grep)
- Single-file edits with no pattern repetition (use Edit tool directly)
- Non-structural changes (comments, formatting)
- Bug fixes that don't involve pattern transformation

## Quick Reference

```bash
# Check if ast-grep is installed
which ast-grep

# Find pattern
ast-grep --pattern 'function $FUNC($$$PARAMS) { $$$ }' --lang javascript

# Search and replace
ast-grep run -p 'var $VAR = $VAL' -r 'const $VAR = $VAL' -l javascript

# Interactive mode
ast-grep run -p 'PATTERN' -r 'REPLACEMENT' -l LANG --interactive
```

### Pattern Syntax

| Pattern | Matches |
|---------|---------|
| `$VAR` | Single AST node (variable, expression, etc.) |
| `$$$ARGS` | Multiple nodes (function arguments) |
| `$$$` | Any sequence of nodes within a block |

## Workflow

### Phase 1: Discovery & Analysis

1. **Understand the Request**: Clarify what structure to refactor
2. **Find Current Usage**: Use ast-grep to discover all instances
3. **Assess Impact**: Count affected files/locations, identify dependencies

```bash
# Example: Find all class definitions
ast-grep --pattern 'class $CLASS { $$$ }' --lang typescript
```

### Phase 2: Planning

1. **Design Transformation**: Define find pattern and replacement pattern
2. **Create Plan**: Summarize what/why/impact with before/after examples

Plan format:
```markdown
## Refactoring Plan: [Title]

**Goal**: [1-2 sentences]
**Impact**: [X files, Y instances]

**Pattern Match**:
```typescript
// Current pattern
```

**Transform To**:
```typescript
// New pattern
```

**Architecture** (if applicable):
```
Current:                    New:
┌─────────┐                ┌─────────┐
│ Module  │ ──────▶        │ Module  │
└─────────┘                └─────────┘
```

**Additional Steps**: [Manual changes needed]
```

### Phase 3: User Feedback

1. Present plan with options if multiple approaches exist
2. Gather feedback using AskUserQuestion for architectural decisions
3. Confirm approach before proceeding

### Phase 4: Execution

1. **Verify Git State**: Ensure clean working tree or user acknowledges changes
2. **Apply Transformations**:
   ```bash
   # Simple pattern replacement
   ast-grep run -p 'console.log($MSG)' -r 'logger.info($MSG)' -l typescript

   # Interactive for careful review
   ast-grep run -p 'PATTERN' -r 'REPLACEMENT' -l LANG --interactive
   ```
3. **Verify Changes**: Run tests, type checkers, linters
4. **Document Results**: Summarize changes and any remaining manual work

## ast-grep Commands

### Basic Search
```bash
ast-grep --pattern 'useState($$$)' --lang typescript
ast-grep -p 'function $F() { $$$ }' -l javascript -A 3 -B 2
```

### Search & Replace
```bash
ast-grep run -p 'var $VAR = $VAL' -r 'const $VAR = $VAL' -l javascript
```

### Rule-Based Refactoring
```yaml
# rule.yml
id: modernize-hasOwnProperty
language: typescript
rule:
  pattern: $OBJ.hasOwnProperty($PROP)
fix: Object.hasOwn($OBJ, $PROP)
message: Use Object.hasOwn instead
```
```bash
ast-grep scan -r rule.yml --update-all
```

### Supported Languages

JavaScript, TypeScript, Python, Go, Rust, Java, C, C++, C#, Kotlin, Swift, Ruby, PHP, and more.

## Common Mistakes

| Mistake | Solution |
|---------|----------|
| Not checking ast-grep installation | Run `which ast-grep` first, install with `brew install ast-grep` |
| Running on dirty git state | Verify clean state or get user acknowledgment first |
| Skipping interactive mode for large changes | Use `--interactive` for 50+ file changes |
| Pattern doesn't match comments/strings | This is correct behavior - ast-grep is syntax-aware |
| Not running tests after | Always verify with tests/type-checker after refactoring |
| Assuming single pass works | Complex refactoring may need multiple ast-grep passes |

## Safety Guidelines

- Never run destructive refactoring without user approval
- Always show transformation plan with examples before executing
- Use `--interactive` or `--dry-run` modes for significant changes
- Verify tests pass after refactoring
- For large refactorings (50+ files), suggest incremental approach
- Work with clean git state, commit refactoring separately from logic changes

## Troubleshooting

- **Pattern not matching**: Verify language flag, check AST structure
- **Partial matches**: May need multiple patterns for variants
- **Syntax errors after refactor**: Some edge cases need manual intervention
- **Tool not found**: Install with `brew install ast-grep`

