Dependabot bumps the package. Repairo fixes the call sites that break.
OpenAPI-grounded breaking-change detection · AST impact mapping · compile-checked repair PRs
Website · Live demo · Docs · npm · Issues
CLI on this repo’s fixtures (animated terminal capture — same commands you can run locally):
npx repairo-cli scan ./fixtures/consumers --vendors stripe
Full pipeline in the browser (no install): heyrepairo.in/demo — OpenAPI diff → impact → patch → validation on bundled scenarios.
No signup. No config file.
npx repairo-cli scan ./src --vendors stripe,openai,supabase
Global install + typical workflow:
npm install -g repairo-cli # requires Node ≥ 22
repairo init --repo owner/your-app --vendors stripe,openai
repairo scan ./src
repairo check --vendors stripe,openai --target ./src
repairo repair --dry-run --target ./src
repairo repair --create-pr # needs git + GitHub token for PR creation
Try the in-repo fixture without touching your app:
git clone https://github.com/adityacs50-lab/Repairo.git && cd Repairo
npm install
npx repairo-cli scan ./fixtures/consumers --vendors stripe
cp fixtures/breaking-api-demo/specs/old-openapi.json .repairo/snapshots/openapi.json
npx repairo-cli diff --spec ./fixtures/breaking-api-demo/specs/new-openapi.json --target ./fixtures/breaking-api-demo
Version bumpers update package.json. They do not rewrite your call sites when a vendor removes a field, renames a parameter, or ships a new base path.
You end up grepping the repo, fixing files by hand, or handing broad context to an AI agent — hard to audit and easy to miss edge cases.
ts-morph; Python/Go tokenizer paths in the engine)Optional: repairo repair --agent-resolve proposes enum mappings only when the diff is ambiguous (off by default; needs your ANTHROPIC_API_KEY).
| Area | Status |
|---|---|
npm CLI (repairo-cli) | Shipped — badges above reflect live npm/GitHub stats |
| Languages | TypeScript/JavaScript strongest; Python and Go repair paths exist with dedicated tests — expect rough edges on untyped or dynamic code |
| Vendors (watch list) | Stripe, OpenAI, Anthropic, Supabase, Gemini, GitHub REST — plus your own OpenAPI files via diff / snapshots |
| Hosted app | Beta at heyrepairo.in — GitHub connect, watch list, repair PRs |
| GitHub App | In repo (src/github-app/) — self-host or use when app slug is configured on the site |
| Distribution | Early — treat stars/downloads as signal, not “customers” |
Proof you can run locally: npm test (engine + GitHub app + Python/Go repair + web app suites). CI runs the same workflow on every push to main.
From the breaking-api-demo fixture (max_tokens → max_output_tokens on chat completions):
- const response = await openai.chat.completions.create({
- model: "gpt-4",
- max_tokens: 500,
- });
+ const response = await openai.chat.completions.create({
+ model: "gpt-4",
+ max_output_tokens: 500,
+ });
Scoped to the real call site via AST — unrelated objects with the same property name are left alone.
Same pipeline as our technical deep dive (runRepair() in src/lib/engine/index.ts):
before/after OpenAPI ──► parseOpenApi ──► diffOpenApi ──► ApiChange[]
consumer files ──► findImpactedCode ─────────────► ImpactMatch[]
│
optional agentResolve ► resolveAmbiguousEnums
▼
generateFixes
▼
buildPullRequest (safety score, merge flags)
▼
validateInMemory (hosted) / validateCodebase (CLI repair)
▼
RepairRunResult + PR for human review
Details: docs/architecture.md (CLI vs hosted validation order).
| Dependabot / Renovate | AI coding agents | Repairo | |
|---|---|---|---|
| Bumps package version | ✅ | — | ✅ (via your workflow) |
| Fixes calling code | ❌ | ✅ (probabilistic) | ✅ (deterministic where spec is clear) |
| Checked before you see a PR | N/A | Often no | ✅ (typecheck / syntax gate) |
| Ambiguous mappings | N/A | Often silent guesses | Flagged or agent-proposed, review required |
| Customer source in the cloud | N/A | Often broad context | CLI is local; hosted beta uses OAuth scopes you approve |
# .github/workflows/repairo.yml
name: API contract check
on:
schedule:
- cron: "0 6 * * *"
workflow_dispatch:
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: adityacs50-lab/Repairo@main
with:
vendors: stripe,openai
target: ./src
First run writes baselines under .repairo/snapshots/ (commit them). Later runs fail when a watched contract breaks.
npm install
npm run dev # Next.js app (heyrepairo.in UI)
npm test # full test matrix
npm run repairo -- scan ./fixtures/consumers
Demo asset sources: docs/assets/README.md.
Issues and focused PRs welcome — especially repro fixtures and deterministic repair cases.
TypeScript
92.0%
CSS
6.7%
Dependabot bumps the package. Repairo fixes the call sites that break.
OpenAPI-grounded breaking-change detection · AST impact mapping · compile-checked repair PRs
Website · Live demo · Docs · npm · Issues
CLI on this repo’s fixtures (animated terminal capture — same commands you can run locally):
npx repairo-cli scan ./fixtures/consumers --vendors stripe
Full pipeline in the browser (no install): heyrepairo.in/demo — OpenAPI diff → impact → patch → validation on bundled scenarios.
No signup. No config file.
npx repairo-cli scan ./src --vendors stripe,openai,supabase
Global install + typical workflow:
npm install -g repairo-cli # requires Node ≥ 22
repairo init --repo owner/your-app --vendors stripe,openai
repairo scan ./src
repairo check --vendors stripe,openai --target ./src
repairo repair --dry-run --target ./src
repairo repair --create-pr # needs git + GitHub token for PR creation
Try the in-repo fixture without touching your app:
git clone https://github.com/adityacs50-lab/Repairo.git && cd Repairo
npm install
npx repairo-cli scan ./fixtures/consumers --vendors stripe
cp fixtures/breaking-api-demo/specs/old-openapi.json .repairo/snapshots/openapi.json
npx repairo-cli diff --spec ./fixtures/breaking-api-demo/specs/new-openapi.json --target ./fixtures/breaking-api-demo
Version bumpers update package.json. They do not rewrite your call sites when a vendor removes a field, renames a parameter, or ships a new base path.
You end up grepping the repo, fixing files by hand, or handing broad context to an AI agent — hard to audit and easy to miss edge cases.
ts-morph; Python/Go tokenizer paths in the engine)Optional: repairo repair --agent-resolve proposes enum mappings only when the diff is ambiguous (off by default; needs your ANTHROPIC_API_KEY).
| Area | Status |
|---|---|
npm CLI (repairo-cli) | Shipped — badges above reflect live npm/GitHub stats |
| Languages | TypeScript/JavaScript strongest; Python and Go repair paths exist with dedicated tests — expect rough edges on untyped or dynamic code |
| Vendors (watch list) | Stripe, OpenAI, Anthropic, Supabase, Gemini, GitHub REST — plus your own OpenAPI files via diff / snapshots |
| Hosted app | Beta at heyrepairo.in — GitHub connect, watch list, repair PRs |
| GitHub App | In repo (src/github-app/) — self-host or use when app slug is configured on the site |
| Distribution | Early — treat stars/downloads as signal, not “customers” |
Proof you can run locally: npm test (engine + GitHub app + Python/Go repair + web app suites). CI runs the same workflow on every push to main.
From the breaking-api-demo fixture (max_tokens → max_output_tokens on chat completions):
- const response = await openai.chat.completions.create({
- model: "gpt-4",
- max_tokens: 500,
- });
+ const response = await openai.chat.completions.create({
+ model: "gpt-4",
+ max_output_tokens: 500,
+ });
Scoped to the real call site via AST — unrelated objects with the same property name are left alone.
Same pipeline as our technical deep dive (runRepair() in src/lib/engine/index.ts):
before/after OpenAPI ──► parseOpenApi ──► diffOpenApi ──► ApiChange[]
consumer files ──► findImpactedCode ─────────────► ImpactMatch[]
│
optional agentResolve ► resolveAmbiguousEnums
▼
generateFixes
▼
buildPullRequest (safety score, merge flags)
▼
validateInMemory (hosted) / validateCodebase (CLI repair)
▼
RepairRunResult + PR for human review
Details: docs/architecture.md (CLI vs hosted validation order).
| Dependabot / Renovate | AI coding agents | Repairo | |
|---|---|---|---|
| Bumps package version | ✅ | — | ✅ (via your workflow) |
| Fixes calling code | ❌ | ✅ (probabilistic) | ✅ (deterministic where spec is clear) |
| Checked before you see a PR | N/A | Often no | ✅ (typecheck / syntax gate) |
| Ambiguous mappings | N/A | Often silent guesses | Flagged or agent-proposed, review required |
| Customer source in the cloud | N/A | Often broad context | CLI is local; hosted beta uses OAuth scopes you approve |
# .github/workflows/repairo.yml
name: API contract check
on:
schedule:
- cron: "0 6 * * *"
workflow_dispatch:
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: adityacs50-lab/Repairo@main
with:
vendors: stripe,openai
target: ./src
First run writes baselines under .repairo/snapshots/ (commit them). Later runs fail when a watched contract breaks.
npm install
npm run dev # Next.js app (heyrepairo.in UI)
npm test # full test matrix
npm run repairo -- scan ./fixtures/consumers
Demo asset sources: docs/assets/README.md.
Issues and focused PRs welcome — especially repro fixtures and deterministic repair cases.
TypeScript
92.0%
CSS
6.7%