Agent skill

Working With Legacy Code

by wondelai in wondelai/skills

Safely change and test untested codebases using Feathers' "Working Effectively with Legacy Code".

MITAuto-check passedDevelopment

Install Working With Legacy Code

skills CLI
$ npx skills add wondelai/skills --skill working-with-legacy-code -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install wondelai/skills working-with-legacy-code --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/wondelai/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/working-with-legacy-code .claude/skills/working-with-legacy-code && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
working-with-legacy-code
GitHub stars
2.4k
Token cost
~4.9k tokens
SKILL.md length
2,624 words
Files
6 (incl. references)
Skills in repo
61
Repo updated
First seen
Licence
MIT

At a glance

Safely change and test untested codebases using Feathers' "Working Effectively with Legacy Code".

  • Works in 6 steps: The Legacy Code Dilemma and Change… → Seams: Where to Pry Code Apart → Characterization Tests → …
  • The user mentions legacy code
  • SKILL.md covers Core Principle, Scoring, Framework and Common Mistakes, plus 3 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Working With Legacy Code is an agent skill from wondelai/skills. Safely change and test untested codebases using Feathers' "Working Effectively with Legacy Code". Use when the user mentions "legacy code", "no tests", "untested codebase", "how do I test this", "seams", "characterization tests", "golden master", "sprout method", "afraid to change this code", "monster method", "dependency breaking", or "inherited a messy codebase". Also trigger when changing code without tests safely, getting a class under test when constructors, statics, or singletons block it, adding features…

Its SKILL.md is about 4.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including reference files (for example `references/case-studies.md`, `references/change-algorithm.md` and `references/characterization-tests.md`).

It sits in Development, covering Legacy modernization, Code quality and Refactoring. The repository describes itself as: Wondel.ai Agent Skills — Business, Marketing, UX & Coding Frameworks from Bestselling Books. 50 skills + 12 guided journeys for Claude Code, Codex, Cursor & other agentskills.io… The licence is MIT.

When your agent uses it

  • The user mentions legacy code
  • Untested codebase
  • How do I test this
  • Characterization tests

Example prompts

  • “Working Effectively with Legacy Code”
  • “legacy code”
  • “no tests”
  • “/working-with-legacy-code”

Workflow steps

6 steps, taken from the step headings in SKILL.md.

  1. The Legacy Code Dilemma and Change Algorithm
  2. Seams: Where to Pry Code Apart
  3. Characterization Tests
  4. Sprout and Wrap: Changing Without Tests First
  5. Dependency-Breaking Techniques
  6. Untangling and Understanding

What it can do on your machine

Read from SKILL.md and the folder at commit c172996. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md.

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • amazon.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Working With Legacy Code loads about 4.9k tokens when it runs, and up to ~21k if it reads all its reference files. Until then it costs about 214 tokens; SKILL.md has 2,624 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~214
When it runs · the whole SKILL.md, loaded when a task matches
~4.9k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~21k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from wondelai/skills at commit c172996, republished under its MIT licence (© wondelai). 2,624 words, ~4,859 tokens.

Download SKILL.mdSave it as .claude/skills/working-with-legacy-code/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.
name
working-with-legacy-code
description
Safely change and test untested codebases using Feathers' "Working Effectively with Legacy Code". Use when the user mentions "legacy code", "no tests", "untested codebase", "how do I test this", "seams", "characterization tests", "golden master", "sprout method", "afraid to change this code", "monster method", "dependency breaking", or "inherited a messy codebase". Also trigger when changing code without tests safely, getting a class under test when constructors, statics, or singletons block it, adding features to tangled modules, or planning incremental test coverage for an old codebase. Covers the legacy-code change algorithm, seams, characterization tests, sprout/wrap, and dependency-breaking techniques. For refactoring code that already has tests, see refactoring-patterns. For day-to-day code quality, see clean-code.
license
MIT
metadata.author
wondelai
metadata.version
1.2.0

Working Effectively with Legacy Code

A field manual for changing code that has no tests, distilled from Michael C. Feathers' Working Effectively with Legacy Code. Use it to get untestable classes into a harness, pin down current behavior with characterization tests, and make changes one safe, verifiable step at a time — without resorting to a rewrite.

Core Principle

Legacy code is simply code without tests. Not old code, not ugly code — untested code: without tests you cannot know whether a change preserves behavior, so every edit is a gamble. The craft is breaking dependencies just enough to get tests in place before changing anything — cover and modify, never edit and pray.

Scoring

Goal: 10/10. Rate changes to untested code 0-10 against the principles below. Report the current score and the specific steps needed to reach 10/10.

  • 9-10: Change points covered by characterization tests before any edit; behavior changes and refactoring shipped as separate verified steps; dependencies broken with the least invasive technique
  • 7-8: Tests at most change points, but occasional mixed refactor-plus-behavior commits or heavier dependency surgery than needed
  • 5-6: Some characterization tests, yet key paths still changed on faith; sprouted code accumulating with no payback plan
  • 3-4: Edit-and-pray with manual verification; tests written after the change, asserting whatever the new code happens to do
  • 0-2: Untested edits straight into tangled code, refactoring and behavior change mixed in one commit, rewrite proposed instead of tests

Framework

1. The Legacy Code Dilemma and Change Algorithm

Core concept: The dilemma: to change code safely we need tests, but to get tests in place we have to change code. The way out is a fixed sequence — identify change points, find test points, break dependencies, write tests, then make changes and refactor — where the pre-test edits are conservative and mechanical, and the real change happens only inside the safety net.

Why it works: Edit-and-pray substitutes care for feedback, and care doesn't scale to code you don't fully understand. Cover-and-modify clamps existing behavior in a vise of tests, so any unintended change announces itself immediately on your machine instead of later in production.

Key insights:

  • There are two reasons to change code — changing behavior (feature, bug fix) and improving structure (refactoring) — and mixing them in one step makes failures undiagnosable
  • Test points are rarely the change points: effects propagate, so you often test where the change's effects surface, not where the edit happens
  • Dependency-breaking edits made before tests exist must preserve signatures exactly and lean on the compiler to find every affected site
  • Coverage grows along the paths you actually change — that beats any dedicated "testing project" that never gets funded
  • "Programming is the art of doing one thing at a time": each step of the algorithm is separately verifiable

Applications:

ContextApplicationExample
Bug fix in an untested moduleRun the five steps before touching the bugPin parseInvoice() with tests, then fix the rounding error
PR mixing cleanup and a featureSplit into structure-only and behavior-only commitsExtract and rename first, tests green, then add the discount rule
"It's just a one-line change"Find the nearest test point firstOne pin test at the public method that calls the private one you edit

See references/change-algorithm.md when running the five steps on a real change — the algorithm as a working procedure with change-point/test-point checklists and triage for "no time" situations.

2. Seams: Where to Pry Code Apart

Core concept: A seam is a place where you can alter behavior in your program without editing in that place. Every seam has an enabling point — where you decide which behavior runs. Getting legacy code under test is largely a hunt for seams: spots where a test can substitute a slow, global, or external dependency while the production source stays untouched.

Why it works: If you must edit code to test it, you risk changing the very behavior you are trying to pin down. Seams move the substitution to a distance — a subclass, an import, a build flag — so the code under test runs exactly as in production while the test controls its dependencies from the enabling point.

Key insights:

  • Object seams are the default in OO code: every overridable call is a seam, and its enabling point is wherever the object is created or passed in
  • Link and import seams swap implementations at build or load time — jest.mock and unittest.mock.patch are link seams in modern clothing
  • Preprocessing seams (C/C++ macros) are the bluntest instrument; reach for them last
  • new Database() inside a method body is a seam that never got built — constructors doing real work, globals, statics, and hard-wired I/O are where seams die
  • A seam without a reachable enabling point is useless: if the test can't make the decision, keep hunting
  • Dynamic languages make nearly every name lookup a seam — cheap, but patching internals couples tests to file layout

Applications:

ContextApplicationExample
Class constructs its own DB clientObject seam via constructor parameterconstructor(db: Db = new ProdDb()) — tests pass a fake
Module calls a top-level send_email()Import/link seammocker.patch("billing.send_email") or jest.mock("./mailer")
Logic reads the wall clock directlySeam at the clockInject a now() provider; tests freeze time

See references/seams.md when hunting a seam in a specific stack — the seam catalog with code, enabling points, and seams in modern tooling (DI containers, jest.mock, pytest monkeypatch, clock and config seams).

3. Characterization Tests

Core concept: A characterization test documents what the code actually does right now — not what the spec, the comments, or anyone's memory says it should do. Write a probe you know will fail, let the failure message reveal the real behavior, then change the assertion to pin that behavior in place.

Why it works: In legacy systems the actual behavior is the de facto spec: callers, reports, and customers may depend on it, quirks included. Tests written from imagined requirements fail for reasons that tell you nothing, while characterization tests fail during refactoring precisely when — and where — you changed existing behavior.

Key insights:

  • The recipe: call the code in a harness, assert something absurd (expect(total).toBe(-1)), read the failure, pin the observed value
  • Sensing and separation are the two reasons to break dependencies: separation gets code into a harness, sensing lets assertions see what it computed
  • For complex output (reports, generated files, large JSON) use a golden master: capture the full output once, diff against it forever
  • Snapshot tests are golden masters — review the first snapshot like code and normalize volatile data, or you are pinning noise
  • Found a bug while characterizing? Pin it with a comment and a ticket — downstream code may depend on the wrong behavior; fix it later as a deliberate, separate change
  • Characterize the branches your change will touch, not the whole system — coverage follows change

Applications:

ContextApplicationExample
Refactoring a tax calculatorPin outputs for representative inputsRun 20 cases through, assert each recorded result
Legacy report generatorGolden master diffGenerate the report, compare to a checked-in master file
Off-by-one found while pinningPin the wrong value, document itassert days == 30 # BUG? expected 31 — TICKET-482

See references/characterization-tests.md when writing your first probe through to a pinned suite — golden masters, snapshot tests done right, and a worked before/after refactor.

4. Sprout and Wrap: Changing Without Tests First

Core concept: When you genuinely cannot get the area under test today, don't weave new logic into the untested mass. Sprout Method or Sprout Class: write the new behavior as fresh, fully tested code and call it from a single line in the legacy spot. Wrap Method or Wrap Class: rename the old code aside and add behavior before or after the call to it, decorator-style.

Why it works: New code in a fresh method or class can be test-driven even when its host can't be instantiated in a harness — testability no longer waits on getting the host into a harness. The untested host changes by exactly one call site, so the unverified blast radius is a single line instead of the whole method.

Key insights:

  • Sprout Method when new logic plugs in at one point; Sprout Class when the host class won't even instantiate in a test harness
  • Wrap Method suits behavior that surrounds the old code (logging, notification, metering) rather than mixes with it: rename pay() to rawPay(), recreate pay() as the wrapper
  • Wrap Class is the Decorator pattern — use it when several call sites need the added behavior or the class is already bloated
  • Be honest about the trade-off: the host stays untested; you have added good code to a bad neighborhood
  • Track sprouts as debt and pay them back — cover the host the next time a change lands there
  • Sprouting is a tactical move inside the change algorithm, not a permanent substitute for getting code under test

Applications:

ContextApplicationExample
Late-fee rule in a 400-line process()Sprout Method, one call linetotal += lateFee(order) — lateFee() written test-first
Audit logging around legacy pay()Wrap MethodNew pay() logs, calls rawPay(), logs again
New validation, class won't instantiateSprout Classnew OrderValidator().validate(data) called from legacy code
Show full SKILL.md (1,125 more words)Show less
5. Dependency-Breaking Techniques

Core concept: A catalog of mechanical, low-risk moves that sever whatever blocks instantiation or sensing: Extract Interface, Parameterize Constructor, Parameterize Method, Extract and Override Factory Method or Getter, Introduce Instance Delegator, Adapt Parameter, Break Out Method Object, Subclass and Override Method. Because they run before tests exist, always pick the least invasive technique that unblocks you.

Why it works: Code resists testing for a small set of recurring reasons — constructors doing real work, statics and singletons, parameters you can't construct, monster methods. Each blocker has a named, practiced counter-move, so you execute a known maneuver instead of improvising surgery on code that has no safety net.

Key insights:

  • Parameterize Constructor with a production default is the workhorse: existing callers compile untouched while tests inject fakes
  • Extract Interface is the safest move in the book — introducing an interface can't change behavior, only loosen a type
  • Subclass and Override Method underlies half the catalog: a testing subclass that stubs the dangerous parts is a legitimate tool, not a hack
  • For statics and singletons, Introduce Instance Delegator hands callers an instance they can swap; a static setter can supersede a singleton in tests
  • Adapt Parameter beats fighting unfakeable framework types — wrap HttpServletRequest in your own narrow interface and test against that
  • Dynamic languages have cheaper seams: unittest.mock.patch or jest.mock can stand in for several techniques, but parameterizing leaves better design behind

Applications:

ContextApplicationExample
Constructor opens a DB connectionParameterize Constructordef __init__(self, conn=None): self.conn = conn or connect()
Static Billing.charge() called everywhereIntroduce Instance DelegatorInstance charge() delegates to the static; tests override it
900-line method hoarding localsBreak Out Method Objectnew RateCalculation(order, rates).run() — locals become fields

See references/dependency-breaking.md when a specific blocker stops instantiation or sensing — before/after code for each technique plus a decision table mapping blockers to the right move.

6. Untangling and Understanding

Core concept: Before changing code you don't understand, invest in cheap comprehension: effect sketches trace what a change can affect, feature sketches show how methods and fields cluster inside a god class, scratch refactoring means refactoring recklessly to learn and then throwing the edits away, and telling the story of the system forces a simplifying summary. The payoff is finding pinch points — narrow places where a few tests cover wide behavior.

Why it works: In legacy code the bottleneck is comprehension, not typing. An effect sketch turns "what could this break?" from anxiety into a finite list, and a pinch point lets a handful of tests act as a vise over an entire cluster of methods — often revealing where a hidden class boundary wants to be drawn.

Key insights:

  • Effect sketch: a bubble per variable or method, an arrow per "affects" — trace forward from your change point to every place behavior can leak out
  • A pinch point is a narrowing in the effect sketch; test there and everything upstream of it is covered
  • Scratch refactoring is refactoring as a reading technique: extract, rename, and simplify for an hour, then revert — the insight survives the checkout
  • Monster method strategy: golden-master it at a pinch point, Break Out Method Object, then refactor inside the new class
  • God class strategy: feature-sketch the clusters, then extract along the natural boundaries between them
  • Triage when there's no time: a spot changing once gets a sprout or wrap; the same spot changing again has earned its tests

Applications:

ContextApplicationExample
"What breaks if I change this field?"Effect sketch from the field outwardThree readers found; two pinch-point tests cover them
Feature due in a 5,000-line classPinch-point tests, then sproutCover postInvoice(), sprout the new rule as a class
Code nobody on the team understandsScratch refactor on a branchExtract and rename to learn, revert, plan the real moves

See references/case-studies.md when you want a full worked walkthrough — three scenarios: a feature in an untested 800-line service, a singleton-ridden module brought under test, and a monster method tamed before a bug fix.

Common Mistakes

MistakeWhy It FailsFix
Refactoring and changing behavior in one stepWhen something breaks, you can't tell which edit did itSeparate commits; tests green between each step
Writing "should" tests on legacy codeImagined specs fail noisily and you "fix" load-bearing behaviorCharacterize what the code does; file bugs separately
Mocking everything in sightTests pin the implementation, so every refactor breaks themFake only what blocks instantiation or sensing
Big-bang rewrite instead of incremental coverageThe old system keeps moving; rewrites ship late and miss years of edge casesCover and modify piece by piece
Silently fixing bugs found while characterizingCallers and reports may depend on the wrong behaviorPin it, document it, fix it as a separate deliberate change
Invasive cleanup before any tests existEvery manual edit risks behavior with no net underneathLeast invasive technique; preserve signatures; lean on the compiler
Sprouting forever without paybackThe host stays untested and sprouts ossify into the next legacy layerTrack sprout debt; cover hot spots on the next touch
Waiting for a dedicated "testing project"That project never gets funded; coverage never appearsGrow coverage along every change you ship

Quick Diagnostic

QuestionIf NoAction
Do tests cover the code you're about to change?You're editing and prayingRun the change algorithm; pin behavior before editing
Can you construct the class in a test harness?Dependencies block separationParameterize Constructor, Extract Interface, or Sprout Class
Can a test sense the effect of your change?Effects are invisible to assertionsFind a sensing point; Extract and Override Getter
Is this commit behavior-only or structure-only?MixedSplit it; run the tests between the two
Do you know everything this change can affect?Unknown blast radiusDraw an effect sketch; test at the pinch points
Do your assertions state observed behavior?Testing wishesProbe, read the failure, pin the actual value
Is the seam you chose the cheapest one available?Needless surgeryPrefer constructor parameters and import seams first
Will the code be better covered after this change?The next change costs as much as this oneLeave at least one pin test at the nearest test point

Further Reading

About the Author

Michael C. Feathers is the founder of R7K Research & Conveyance, a consultancy focused on software design and the rehabilitation of aging systems. A long-time consultant and conference speaker on legacy code, he wrote Working Effectively with Legacy Code (2004) and gave the field its working definition: legacy code is simply code without tests.

© wondelai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 5 other files (references) in working-with-legacy-code of wondelai/skills.

  • SKILL.md
  • references/case-studies.md
  • references/change-algorithm.md
  • references/characterization-tests.md
  • references/dependency-breaking.md
  • references/seams.md

Open the folder on GitHubat commit c172996

Compare with similar skills

Working With Legacy Code next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Working With Legacy Code compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Working With Legacy Code this skillwondelai/skills2.4k—~4.9kAutomated safety check: PassMIT
Legacy Code Summarizermajiayu000/claude-skill-registry6661 repos~5.2kAutomated safety check: PassMIT
Code Refactoring Workflowluongnv89/claude-howto42k—~3.1kAutomated safety check: PassMIT
Code ReviewerYikai-Liao/symusic1891 repos~1.3kAutomated safety check: PassMIT
Modern JavaScript Patternswshobson/agents40k12 repos~548Automated safety check: PassMIT
Fowler-Style Refactoringlhfer/claude-howto-zh-cn2.3k—~156Automated safety check: PassMIT

Similar skills

  • Legacy Code Summarizer

    majiayu000/claude-skill-registry

    Produces comprehensive summaries and insights about legacy codebases to help understand unfamiliar code.

    666 GitHub starsUsed in 1 repo~5.2k tokens
    DevelopmentAuto-check passed
  • Code Refactoring Workflow

    luongnv89/claude-howto

    Guides systematic, test-backed refactoring in the style of Martin Fowler, moving through research, planning and small incremental changes with your approval at each phase.

    42k GitHub stars~3.1k tokensUpdated 8 days ago
    DevelopmentAuto-check passed
  • Code Reviewer

    Yikai-Liao/symusic

    Analyzes code diffs and files to identify bugs, security vulnerabilities (SQL injection, XSS, insecure deserialization), code smells, N+1 queries, naming issues, and architectural concerns, then…

    189 GitHub starsUsed in 1 repo~1.3k tokens
    DevelopmentAuto-check passed
  • Covers ES6+ syntax and functional patterns for refactoring older JavaScript: async/await, destructuring, spread, modules, generators and data pipelines.

    40k GitHub starsUsed in 12 repos~548 tokens
    DevelopmentAuto-check passed
  • Fowler-Style Refactoring

    lhfer/claude-howto-zh-cn

    基于 Martin Fowler 方法论做系统化重构。Use when users ask to refactor code, improve structure, reduce technical debt, clean up legacy code, or improve maintainability.

    2.3k GitHub stars~156 tokensUpdated 2 mo ago
    DevelopmentAuto-check passed
  • Refactoring Skill (Vietnamese)

    luongnv89/claude-howto

    Vietnamese edition of a systematic refactoring skill based on Martin Fowler's book, working in approved phases with small, test-backed changes.

    42k GitHub stars~3.1k tokensUpdated 8 days ago
    DevelopmentAuto-check passed

More from wondelai/skills

All 61 skills in this repo
  • Crossing The Chasm

    wondelai/skills

    Navigate the technology adoption lifecycle from early adopters to mainstream market.

    2.4k GitHub stars~3.6k tokensUpdated 28 days ago
    Auto-check passed
  • Design Everyday Things

    wondelai/skills

    Apply foundational design principles: affordances, signifiers, constraints, feedback, and conceptual models.

    2.4k GitHub stars~4k tokensUpdated 28 days ago
    Auto-check passed
  • Design Sprint

    wondelai/skills

    Run a structured 5-day process to prototype, test, and validate product ideas with real users.

    2.4k GitHub stars~3.8k tokensUpdated 28 days ago
    Auto-check passed
  • Hooked UX

    wondelai/skills

    Design habit-forming product loops using the Hook Model (Trigger, Action, Variable Reward, Investment).

    2.4k GitHub stars~3.5k tokensUpdated 28 days ago
    Auto-check passed
  • Improve Retention

    wondelai/skills

    Diagnose and fix retention problems using behavior design (B=MAP).

    2.4k GitHub stars~3.8k tokensUpdated 28 days ago
    Auto-check passed
  • Monetizing Innovation

    wondelai/skills

    Design products and pricing around validated willingness to pay, from Ramanujam & Tacke's "Monetizing Innovation".

    2.4k GitHub stars~5.2k tokensUpdated 28 days ago
    Auto-check passed

Categories

Questions about Working With Legacy Code

What does Working With Legacy Code do?

Safely change and test untested codebases using Feathers' "Working Effectively with Legacy Code". Working With Legacy Code is an agent skill from wondelai/skills. Safely change and test untested codebases using Feathers' "Working Effectively with Legacy Code".

When should I use Working With Legacy Code?

Working With Legacy Code fits situations like: the user mentions legacy code; untested codebase; how do I test this; characterization tests.

How do I install Working With Legacy Code in Claude Code?

Run `npx skills add wondelai/skills --skill working-with-legacy-code -a claude-code`. Or copy the skill folder (working-with-legacy-code in wondelai/skills) into .claude/skills/working-with-legacy-code in your project. Claude Code loads it when a task matches its description.

How do I install Working With Legacy Code in Codex?

Run `npx skills add wondelai/skills --skill working-with-legacy-code -a codex`. Or copy the skill folder (working-with-legacy-code in wondelai/skills) into .agents/skills/working-with-legacy-code in your project. Codex loads it when a task matches its description.

Can I use Working With Legacy Code in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add wondelai/skills --skill working-with-legacy-code -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/working-with-legacy-code, .gemini/skills/working-with-legacy-code, .github/skills/working-with-legacy-code and .opencode/skills/working-with-legacy-code in your project.

What does Working With Legacy Code need to run?

SKILL.md names no scripts, command-line tools or credentials: Working With Legacy Code is instructions for the agent only.

Does Working With Legacy Code access the network?

SKILL.md names 1 domain. As links in the text: amazon.com. This is read from the text; nothing was executed.

Is Working With Legacy Code safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Working With Legacy Code use?

Working With Legacy Code is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Working With Legacy Code use?

About 4.9k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 16k tokens, read only when the agent opens those files.

What are the alternatives to Working With Legacy Code?

Skills that share tags, products or a category with Working With Legacy Code: Legacy Code Summarizer (majiayu000/claude-skill-registry, 666 stars), Code Refactoring Workflow (luongnv89/claude-howto, 42k stars), Code Reviewer (Yikai-Liao/symusic, 189 stars) and Modern JavaScript Patterns (wshobson/agents, 40k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Working With Legacy Code?

wondelai (a GitHub organization) maintains it in wondelai/skills, which has 2,356 GitHub stars. The repository holds 61 skills in this directory. The repository was last updated on September 10, 2026.

Source: wondelai/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.