← Back to list

migrating-code
by rileyhilliard
⭐ 62🍴 13📅 Jan 21, 2026
SKILL.md
name: migrating-code description: Safe code migrations with backward compatibility and reversibility. Use when upgrading dependencies, changing database schemas, API versioning, or transitioning between technologies.
Migrating Code
Core Principles
- Never break production - Backward compatible until fully rolled out
- Small, reversible steps - Each step independently deployable
- Test at every stage - Before, during, and after
- Have rollback ready - Always
Migration Checklist
- [ ] Pre-Migration: Read changelog, identify breaking changes, ensure test coverage
- [ ] During: Small steps, test each, monitor errors, rollback ready
- [ ] Post: Verify tests, check metrics, remove scaffolding, update docs
Database Schema
Safe Patterns
| Operation | Pattern |
|---|---|
| Add column | Add nullable first → backfill → add constraints |
| Remove column | Stop writes → deploy code that doesn't read → drop column |
| Rename column | Add new → dual-write → backfill → switch reads → drop old |
| Change type | New column → dual-write → migrate in batches → switch → drop |
Never: Add NOT NULL without defaults to tables with data.
API Migrations
Deprecation Process
- Add deprecation warnings to old endpoints
- Document migration path
- Set and communicate sunset date
- Monitor usage
- Remove after usage drops
{
"data": {},
"_warnings": [{
"code": "DEPRECATED_ENDPOINT",
"message": "Use /api/v2/users instead",
"sunset": "2025-06-01"
}]
}
Framework Upgrades
- Upgrade to latest minor first - Get deprecation warnings
- Fix warnings - Before major upgrade
- One major at a time - Don't batch
- Test after each step
Adapter Pattern for Library Swaps
// Wrap library usage
// lib/date.ts
import moment from 'moment';
export const formatDate = (date: Date, format: string) =>
moment(date).format(format);
// Migration: just change the adapter
import { format } from 'date-fns';
export const formatDate = (date: Date, fmt: string) =>
format(date, fmt);
Gradual Rollout
Use feature flags:
if (featureFlags.useNewSystem) {
return newService.process(order);
} else {
return legacyService.process(order);
}
Roll out: 1% → 10% → 50% → 100% → remove flag
Common Pitfalls
Avoid:
- Big bang migrations
- No rollback plans
- Skipping dual-write phase
- Single large data transactions
- Removing old code before new is proven
Do:
- Small, reversible steps
- Test rollback procedures
- Batch large data migrations
- Keep old paths until new verified
Score
Total Score
65/100
Based on repository quality metrics
✓SKILL.md
SKILL.mdファイルが含まれている
+20
✓LICENSE
ライセンスが設定されている
+10
○説明文
100文字以上の説明がある
0/10
○人気
GitHub Stars 100以上
0/15
○最近の活動
3ヶ月以内に更新がある
0/10
✓フォーク
10回以上フォークされている
+5
✓Issue管理
オープンIssueが50未満
+5
✓言語
プログラミング言語が設定されている
+5
○タグ
1つ以上のタグが設定されている
0/5
Reviews
💬
Reviews coming soon