Skip to content
Development
Skill

/deprecation-process

Plan a deprecation end to end for a component, token, variant or pattern: usage audit, migration path, timeline to a major-version removal, notices. Triggers: deprecate, sunset, phase out, retire, remove, replace X with Y. Announcing non-deprecation changes: change-communication.

From plugin
design-system-ops
21836 skills4 commands

Claude Code

$ npx -y skills add murphytrueman/design-system-ops --skill deprecation-process --agent claude-code

SKILL.md

deprecation-process.SKILL.md
name: deprecation-process
description: "Plan a deprecation end to end for a component, token, variant or pattern: usage audit, migration path, timeline to a major-version removal, notices. Triggers: deprecate, sunset, phase out, retire, remove, replace X with Y. Announcing non-deprecation changes: change-communication."
allowed-tools: Read, Write, Grep, Glob, Bash(cat:*), Bash(find:*), Bash(head:*), Bash(ls:*), Bash(sort:*), Bash(tail:*), Bash(wc:*), Bash(grep:*), Bash(rg:*)
references:
  - ../../knowledge-notes/component-governance.md
  - ../../knowledge-notes/output-discipline.md

Deprecation process

A skill for planning and executing the deprecation of components, tokens, or patterns in a design system. Produces a deprecation plan with timeline, consumer communication, and migration guidance.

Before you begin: verify references

Confirm that every path in this skill's frontmatter `references:` exists relative to this SKILL.md. If any is missing, stop: the install is incomplete, usually because a flattening installer (for example `npx skills install`) dropped the repo-root `knowledge-notes/` directory. Tell the user to reinstall by a method in `1-INSTALL.md` and run `verify-install.sh` from the install root. Proceed without the references only if the user explicitly says to, and then say in the output that it was produced without the pack's reference material.

Context

Deprecation is the maintenance work that never gets prioritised until it becomes a crisis. Components accumulate. Tokens multiply. Patterns fork. The longer a team waits to deprecate, the more existing usage entrenches, and the more a removal feels disruptive rather than healthy.

A deprecation done well is a contract with consumers: clear notice, a migration path, and a credible timeline. A deprecation done badly is a surprise, and it erodes trust in the system faster than almost anything else.

This skill produces a deprecation plan that is honest about the timeline, specific about migration, and structured to communicate clearly to the teams affected.

---

Step 1: Identify what is being deprecated

Clarify:

  • What is being deprecated? (component, token, pattern, variant, API)
  • Why is it being deprecated? (superseded by a better option, unused, causing maintenance burden, design direction change, accessibility non-compliance, etc.)
  • What replaces it, if anything?
  • Is there a removal date in mind, or is this open-ended?

If nothing replaces it: the deprecation plan needs an extra step addressing why the use case should no longer be served and what teams who relied on it should do instead.

Step 2: Audit current usage

Before writing the plan, understand the exposure. Do not estimate when you can measure.

**Automated usage counting (if codebase access is available):**

Run these searches to produce a measured count rather than an estimate. Search every package root that consumes the system (apps, packages, monorepo workspaces), not just `src/`. Before trusting any count, run the pattern against one file you know uses the item and confirm it matches; if it doesn't, fix the pattern before reporting anything.

The patterns use whole-word matching so `Button` doesn't match `ButtonGroup`, and ripgrep's multiline mode so imports split across lines are caught. Even so, treat every count as a lower bound: dynamic imports, string-built class names and usage in other repositories won't show up. Say so in the summary.

For component deprecation:

ROOTS="apps packages src"   # every consuming package root in this repo
GLOBS=(-g '*.{ts,tsx,js,jsx}')

# Files that import or re-export it, including multiline and aliased imports
rg -l -U "${GLOBS[@]}" '(import|export)\s+(type\s+)?\{[^}]*\bComponentName\b[^}]*\}\s*from' $ROOTS | wc -l

# Local aliases (`ComponentName as Foo`) — search for each alias's JSX usage too
rg -o -U --no-filename "${GLOBS[@]}" '\bComponentName\s+as\s+\w+' $ROOTS | sort -u

# JSX instances (occurrences, not lines; may exceed files if used several times per file)
rg -o "${GLOBS[@]}" '<ComponentName\b' $ROOTS | wc -l

# Files with any usage (for blast radius mapping)
rg -l -U "${GLOBS[@]}" '\bComponentName\b' $ROOTS

For token deprecation:

# CSS custom properties, including var(--token-name, fallback)
rg -o -g '*.{css,scss,less,ts,tsx,js,jsx}' 'var\(\s*--token-name\s*[,)]' $ROOTS | wc -l

# SCSS variables, without matching $token-name-light
rg -o -g '*.scss' '\$token-name(?:[^\w-]|$)' $ROOTS | wc -l

# JS/TS token references (adjust the path to your token object)
rg -o -g '*.{ts,tsx,js,jsx}' '\b(tokens|theme)\.path\.to\.token\b' $ROOTS | wc -l

Use `rg -l … | wc -l` when you mean files and `rg -o … | wc -l` when you mean occurrences, and label the result accordingly. If ripgrep isn't available, `grep -rlE` works for single-line patterns but misses multiline imports; note that in the summary.

**Present the usage count as a structured summary** (numbers below are illustrative):

Usage audit: DatePicker
─────────────────────────
Files importing:      23 files
JSX instances:        47 usages
Unique consuming apps: 4 (checkout, dashboard, settings, admin)
Critical paths:       2 (checkout date selection, appointment booking)
Test files with refs: 12
Storybook stories:    3
Documentation refs:   5
─────────────────────────
Total blast radius:   at least 47 instances across 23 files in 4 applications
Searched:             apps/, packages/ (pattern confirmed against a known usage)

**Consumers in other repositories.** The searches above count only what's checked out. To find consumers elsewhere: `gh search code "ComponentName" --owner <org>` locates candidate repositories (approximate, default branch only); then clone or fetch each and count with the same `rg` patterns. List the repositories searched and the ones not reached under Scope, and treat the total as a lower bound.

If codebase access is not available, ask the user to run the search commands and provide

Read more
@murphytrueman
Ships withdesign-system-ops

Claude Code skills for the work that keeps a design system alive.

Stars on GitHub

Momentum

stars in total
218
Star history of murphytrueman/design-system-ops on GitHub, a chart by star-history.com

Other skills on design-system-ops.

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills12d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc2w293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react3d252k
@facebook@facebookInstall Skill

Questions about deprecation-process.

Which coding agents can use deprecation-process?
deprecation-process installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.