Skip to content

/before-you-refactor

Use when considering, evaluating, or performing a refactor, restructure, cross-file rename, or cleanup

From plugin
2312 skills1 hooks
shell
$ npx -y skills add oribarilan/97 --skill before-you-refactor --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.
  • You can call itInvoke it directly when you want it.
  • Slash command/before-you-refactor
How auto-invocation works

Context preview

The summary Claude sees to decide when to auto-load this skill.

Use when considering, evaluating, or performing a refactor, restructure, cross-file rename, or cleanup

SKILL.md

before-you-refactor.SKILL.md
name: before-you-refactor
description: Use when considering, evaluating, or performing a refactor, restructure, cross-file rename, or cleanup

Before You Refactor

Overview

**Stop. Read the code that already exists. Understand the tests that protect it. Take small steps. Keep the tests green.** This is a **rigid** skill. Run the checklist; don't skip steps. When assessing code (not actively refactoring), steps 1–2 and 6 are the assessment; report findings without editing.

When to invoke

Invoke when you're about to:

  • Refactor existing code (extract function, inline, rename across multiple files, restructure a module)
  • "Clean up" code you didn't write
  • Rewrite a function or module because the existing one feels ugly, outdated, or wrong
  • Replace an existing implementation with a "better" one
  • Restructure tests, fixtures, or shared helpers used in more than one place
  • Assess whether existing code needs refactoring (reading for smells, coupling, complexity)
  • Review a refactoring proposal or PR that restructures code

If you're touching ≥3 lines of existing non-trivial logic to change its **shape** (not its behavior), invoke this skill.

Non-triggers — do NOT invoke for

  • Fixing a one-line bug where the change is obvious and the test exists
  • Adding a brand-new function in a brand-new file (use `clean-code` instead)
  • Renaming a single local variable inside one function
  • Fixing a typo in a comment, string, or doc
  • Formatting-only changes (whitespace, import order) handled by a formatter
  • Editing config or data files where there's no logic to refactor

If you're not sure whether a change counts as a refactor, **invoke anyway** — the checklist is cheap, the consequence of skipping it is not.

The pre-refactor checklist

Run every step in order. Do not start editing until step 5 is satisfied.

1. **Read the existing code.** Read it through once, then again. Assume it encodes decisions, bug fixes, and edge-case handling you don't yet understand. *(Attapattu, 97/6.)* 2. **Find the tests that already cover it.** List them. Run them. Confirm they pass on `main` before you change anything. If there are no tests, **stop and add a characterization test that pins down current behavior** before touching the code. *(Attapattu, 97/6 — "Ensure existing tests pass after each iteration.")* 3. **State the goal in one sentence.** "I am restructuring X so that Y." If you can't write that sentence, you don't have a refactor — you have a wish. Stop. Talk to the user. 4. **Check the goal isn't ego or fashion.** Are you refactoring because the code is genuinely blocking work, or because the style offends you, or because there's a newer framework? *Personal preference, ego, and "new tech is shiny" are not valid reasons.* *(Attapattu, 97/6.)* If the answer is fashion, stop and propose the change to the user explicitly with cost and benefit; do not silently rewrite. 5. **Plan the smallest first step.** Refactor in **many small commits, not one massive change.** Each step must keep the tests green. If your plan starts with "first I'll rip out X and then over the next hour I'll …", you're doing it wrong — restart with a smaller first step. *(Attapattu, 97/6; Lewis, 97/24.)* 6. **Identify coupling and complexity hotspots before you cut.** Skim for high fan-in / fan-out classes, long methods, deep inheritance, and hidden globals — these are the tangled spots that turn a small refactor into a big one. Note them; estimate accordingly; tell the user if the cost is now larger than the original ask. *(Pepperdine, 97/74.)* 7. **Confirm you have access to break it safely.** Are you on a branch? Can you commit incrementally? Can you revert? You should never refactor directly on a shared branch or in production. *(Evans, 97/31 — generalized: don't touch what you can't safely revert.)*

Red Flags

These thoughts mean STOP — restart the checklist:

| Thought | Reality | |---|---| | "I'll just rewrite this from scratch — it'll be faster." | Throwing away tested, battle-hardened code throws away every bug fix and edge case it absorbed. The rewrite will rediscover those bugs the slow way. (97/6) | | "There are no tests, but the change is obvious." | "Obvious" is how production breakages are born. Pin behavior with a characterization test first, then refactor. (97/6) | | "I'll do it all in one big PR — easier to review." | Big PRs hide bugs and frustrate reviewers. Many small commits keep tests green and changes reviewable. (97/6, 97/24) | | "The old code is ugly and uses outdated patterns — I should modernize it." | Style is not a refactor goal. New framework / new language / personal preference are not valid reasons. State the actual user-visible benefit or stop. (97/6) | | "It's just a small cleanup, no need for a checklist." | The small cleanups are exactly where the worst tangles hide. Run the checklist. (97/74) | | "I'll fix everything I see while I'm in there." | Boy Scout rule says *a little better*, not *perfect*. Bounded improvement only. Write the rest down for later. (97/8) | | "I can patch it directly on the staging/production server, just this once." | No. Refactors flow through your normal commit → test → review → deploy path. "Just this once" is how outages happen. (97/31) | | "The tests are failing but it's just flaky — I'll keep going." | Failing tests during a refactor mean the refactor changed behavior. Stop, investigate, fix or revert. Don't push through. (97/6) | | "Estimating is too hard — I'll figure it out as I go." | Open-ended refactors balloon. Identify the coupling hotspots up front and re-estimate. If it's now bigger than the ask, escalate. (97/74) | | "I'll just rename some variables — the function isn't *that* long." | If the function scrolls, renaming alone won't help. Extract helpers whose names explain the *why*; the body shrinks to a sequence of named steps. (`Fowler/LongMethod`) | | "The function does X *and also* Y, but they're related." | If you needed "and al

Read more
Read it on GitHub ↗

Showing the first part of this file.

Ships with97

Agent skills distilled from the hard-won lessons of world-renowned programmers, in the spirit of "97 Things Every Programmer Should Know"

Get the whole plugin, auto-invoked
Stats
23
Stars
0
Views
1
Forks
Maintained
Maintenance
JavaScript
Language
2mo ago
Last commit
3mo ago
Created

Repo: oribarilan/97