Breaking Change Detector
Compares two versions of a codebase or API and flags all breaking changes with migration hints.
Best use case
Breaking Change Detector is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Compares two versions of a codebase or API and flags all breaking changes with migration hints.
Teams using Breaking Change Detector should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/breaking-change-detector/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How Breaking Change Detector Compares
| Feature / Agent | Breaking Change Detector | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Compares two versions of a codebase or API and flags all breaking changes with migration hints.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Breaking Change Detector
## What this skill does
This skill directs the agent to compare two versions of a codebase, API schema, or interface definition and systematically identify every change that could break existing callers. It classifies each change by severity, explains why it is breaking, and provides a concrete migration hint so consumers know exactly what they need to update.
Use this before publishing a new package version, before deploying an API change that existing clients depend on, or during a code review to catch unintended contract changes.
## How to use
### Claude Code / Cline
Copy this file to `.agents/skills/breaking-change-detector/SKILL.md` in your project root.
Then ask:
- *"Use the Breaking Change Detector skill to compare the old and new versions of our API."*
- *"I changed `src/auth/index.ts`. Use the Breaking Change Detector skill to find any breaking changes."*
Provide: the old version (paste, file path, or git ref) and the new version.
### Cursor
Add the instructions below to your `.cursorrules` or paste them into the Cursor AI pane. Then share both the old and new code side by side.
### Codex
Paste both versions clearly labeled as "OLD VERSION" and "NEW VERSION" and ask Codex to follow the instructions below.
## The Prompt / Instructions for the Agent
When asked to detect breaking changes, follow this process:
### Step 1 — Establish what constitutes the public contract
Before comparing, identify what is "public" — i.e., what external callers or consumers depend on:
- For a library: all exported functions, types, interfaces, and constants
- For a REST API: all endpoints (method + path), request body shapes, response shapes, status codes, and headers
- For a database schema: table names, column names, data types, nullability, and unique constraints
- For a TypeScript/JavaScript module: all `export` statements
Changes to internal/private code are not breaking changes unless they affect something observable from outside.
### Step 2 — Categorize each difference
Compare the old and new versions and classify every difference into one of these categories:
**Breaking changes (must flag)**
- Removed export, endpoint, table, or column
- Renamed export, endpoint, table, or column (removal + add = breaking)
- Changed function signature: removed a parameter, changed a required parameter's type, changed return type in an incompatible way
- Changed REST response: removed a field, changed a field's type, changed a status code that callers branch on
- Added a required field to a request body or function parameter
- Narrowed a type (e.g., `string` → `'a' | 'b'`)
- Changed behavior that existing callers rely on (e.g., changed sort order, changed error format)
**Non-breaking changes (informational only)**
- Added a new optional parameter (with a default value)
- Added a new export, endpoint, or field
- Widened a type (e.g., `'a' | 'b'` → `string`)
- Internal refactoring with identical observable behavior
- Performance improvements
- New optional fields in a response
### Step 3 — For each breaking change, produce a migration hint
Every breaking change entry must include:
- What changed (old vs new)
- Why it is breaking (what callers were relying on)
- What callers must do to migrate (specific, actionable)
### Step 4 — Format the output
```markdown
## Breaking Change Report
### Summary
- Breaking changes: N
- Non-breaking changes: N (informational)
---
### Breaking Changes
#### 1. [Short title]
- **Type**: [Removed / Renamed / Signature change / Type change / Behavior change]
- **Location**: `path/to/file.ts` or `POST /api/endpoint`
- **Old**: [What it was before]
- **New**: [What it is now, or "Removed"]
- **Why it breaks**: [What callers were depending on]
- **Migration**: [Exactly what callers need to change]
#### 2. ...
---
### Non-Breaking Changes (Informational)
| # | Location | Change | Notes |
|---|----------|--------|-------|
| 1 | `src/utils.ts` | Added `formatCurrency()` export | New addition, no action needed |
---
### Recommended Version Bump
[Based on semver: MAJOR if any breaking changes exist, MINOR if only additions, PATCH if only bug fixes]
```
### Step 5 — Flag ambiguous cases
If a change is ambiguous (e.g., a behavior change that some callers rely on but it was arguably a bug), flag it explicitly as "Potentially breaking — review required" with context explaining the ambiguity.
## Example
**Input to Agent:**
> "Use the Breaking Change Detector skill. Here are the two versions of our user service interface:
>
> OLD:
> ```ts
> export function getUser(id: string): Promise<{ id: string; name: string; email: string }>
> export function createUser(name: string, email: string): Promise<{ id: string }>
> export function deleteUser(id: string): Promise<void>
> ```
>
> NEW:
> ```ts
> export function getUser(id: string): Promise<{ id: string; name: string; email: string; role: string }>
> export function createUser(input: { name: string; email: string; role: string }): Promise<{ id: string }>
> ```"
**Output from Agent:**
> ## Breaking Change Report
>
> ### Summary
> - Breaking changes: 2
> - Non-breaking changes: 1 (informational)
>
> ---
>
> ### Breaking Changes
>
> #### 1. `createUser` signature changed from positional args to object input
> - **Type**: Signature change
> - **Location**: `userService.ts`
> - **Old**: `createUser(name: string, email: string)`
> - **New**: `createUser(input: { name: string; email: string; role: string })`
> - **Why it breaks**: All callers passing `createUser("Alice", "alice@example.com")` will break at compile time. Also, `role` is now required — callers that don't provide it will fail.
> - **Migration**: Update all call sites to `createUser({ name: "Alice", email: "alice@example.com", role: "user" })`. Decide on a default role value for existing callers.
>
> #### 2. `deleteUser` removed
> - **Type**: Removed
> - **Location**: `userService.ts`
> - **Old**: `deleteUser(id: string): Promise<void>`
> - **New**: Not present
> - **Why it breaks**: Any caller invoking `deleteUser()` will get a compile error or runtime error.
> - **Migration**: Find a replacement for delete functionality or soft-delete via `updateUser`. Audit all usages with `grep -r "deleteUser"`.
>
> ---
>
> ### Non-Breaking Changes
>
> | # | Location | Change | Notes |
> |---|----------|--------|-------|
> | 1 | `getUser` return type | Added `role: string` field to response | Additive — existing callers can ignore it |
>
> ### Recommended Version Bump
> MAJOR — two breaking changes require a major version bump.
## Notes
- For REST APIs, also check HTTP status codes — changing a 404 to a 400 can break callers that branch on status codes.
- For database schemas, dropping a column is always breaking even if no application code references it — other services may query directly.
- This skill does not apply the migrations — it produces the report. Use the Migration Guide Writer skill to turn the report into a full migration guide.Related Skills
Changelog Curator
Maintains and formats a CHANGELOG.md following Keep a Changelog conventions from git history or PR list.
Unit Test Writer
Generates comprehensive unit tests for any function or module with edge cases.
Unit Test Improver
Reviews existing unit tests for gaps, weak assertions, and missing edge cases, then rewrites them to be more robust.
Troubleshooting Guide Builder
Builds a structured troubleshooting guide with symptom → cause → fix format for any tool or system.
Tech Debt Auditor
Identifies and prioritizes technical debt in a codebase with an effort/impact matrix.
Technical Blog Post Writer
Writes engaging, accurate technical blog posts targeted at developer audiences.
Stack Trace Analyzer
Interprets error stack traces to pinpoint root cause, explain what went wrong, and suggest fixes.
SQL Query Optimizer
Reviews SQL queries for performance issues and rewrites them with optimized execution plans.
Sprint Summary Generator
Converts a list of completed tickets or commits into a clear sprint summary for stakeholders.
Social Post Thread Writer
Converts a blog post, idea, or document into an engaging Twitter/X or LinkedIn thread with hooks and CTAs.
SEO Metadata Generator
Generates optimized title tags, meta descriptions, Open Graph tags, and structured data for any web page.
SEO Content Optimizer
Analyzes and rewrites content to maximize search engine visibility without sounding robotic.