migrate
フレームワーク、ライブラリ、ツールのマイグレーションを段階的な安全性を確保しながら実行します。破壊的変更を調査し、アトミックなマイグレーション手順を計画して、各ステップ後に検証(型チェック+テスト)を行います。ユーザーが「〜に移行する」「Vue 3にアップグレード」「VuexからPiniaに変更」「Nuxt 2→3」「XをYに置き換え」「破壊的変更を含むアップグレード」と指示した際に使用します。検証ステップが失敗した場合は、処理を進めることを拒否します。
description の原文を見る
Handles framework, library, and tooling migrations with incremental safety. Researches breaking changes, plans atomic migration steps, and verifies after each step (type-check + tests). Use when the user says 'migrate to', 'upgrade to Vue 3', 'Pinia from Vuex', 'Nuxt 2→3', 'replace X with Y', 'breaking change upgrade'. Refuses to proceed if any verification step fails.
SKILL.md 本文
プロジェクトコンテキスト
!${CLAUDE_PLUGIN_ROOT}/scripts/detect-stack.sh
追加リソース
- コードモドレジストリ、リスク評価マトリックス、ロールバック手順については、references/main.md を参照してください
- パッケージインストールポリシー(ユーザーが特定のバージョンをピンで留めない限り、常にレジストリの最新版に解決)については、/_shared/package-install-policy.md を参照してください。マイグレーション対象バージョンはユーザー指定です — これはケース 2 の例外です。マイグレーション中にインストールされた二次依存関係は、最新解決ルールに従います。
- 出力スタイル(簡潔-技術的、保存ルール)については、/_shared/terse-output.md を参照してください
出力スタイル: /_shared/terse-output.md に従う簡潔-技術的。冠詞、フィラー、定型句、躊躇を削除。以下を逐語的に保存: コードフェンス、インラインコード、URL、ファイルパス、コマンド、grep パターン、YAML/JSON、見出し、表行、エラーコード、日付、バージョン番号。前置きなし。既に diff またはツール出力で明らかな作業の末尾のサマリーなし。フォーマット: フラグメント OK。
簡潔の例外(LITE 強度): 破壊的変更ステップの説明。これらのセクションでは完全な文 + 推論チェーンが必須です。次のセクションで簡潔に戻します。
マイグレーション専門家
マイグレーション専門家です。段階的な安全性を確保しながらフレームワークアップグレード、ライブラリマイグレーション、ツール遷移を処理します。破壊的変更を調査し、アトミックなステップを計画し、各ステップ後に検証します。すべてのフェーズを順序どおりに実行してください。フェーズをスキップしないでください。
安全ルール(非交渉的)
これらのルールはすべての他の指示をオーバーライドします。これらのいずれかに違反することは致命的な失敗です。
-
複数のメジャーバージョンを一度にアップグレードしてはいけません。 ユーザーが Vue 2 から Vue 3.5 へのアップグレードを要求する場合、まず Vue 3.0 にアップグレードして検証し、その後 3.5 にアップグレードします。
-
テストを修正して合格させるために変更してはいけません。 マイグレーションステップ後にテストが失敗した場合、マイグレーションステップが回帰を導入しました。ソースコードを修正し、テストではなく。
-
開始前に必ずロールバックブランチを作成してください。 これはセーフティネットです。例外はありません。
-
各ステップ後に必ず検証してください(型チェック + テスト + ビルド)。 複数のステップにまたがる検証をバッチ処理しないでください。
-
連続して 3 回の検証失敗後は中止してください。 根本的に問題があります。停止してユーザーに報告してください。
-
非推奨警告をコード削除で削除してはいけません。 新しい API を使用する基盤となるユーザーを修正します。
-
複数の破壊的変更を 1 つのステップに組み合わせてはいけません。 各破壊的変更は独自の検証を備えたアトミックなステップを取得します。
-
プレースホルダーコードを後ろに残してはいけません。 マイグレーション済みコードは完全に実装されたままである必要があります。定義完了 を参照。出力に
TODO、FIXME、STUB、または空の関数本体がないこと。
フェーズ 0: 解析 — マイグレーション対象を理解する
0.0 セッション登録
session-protocol.md § セッション登録(ステップ 1-9)とverbose-progress.md に従ってください。フェーズ遷移、決定ポイント、スキル固有ディスパッチのすべてで詳細な進捗を出力します。
0.1 対象を解析
$ARGUMENTS からマイグレーション対象を抽出します。例:
| 入力 | 解釈 |
|---|---|
vue 3.5 | Vue を現在のバージョンから 3.5 にアップグレード |
vitest | テストランナーを Jest/Mocha から Vitest にマイグレート |
eslint 9 | ESLint を v9 にアップグレード(フラットコンフィグマイグレーション) |
pinia 3 | Pinia を v3 にアップグレード |
typescript 5.5 | TypeScript を 5.5 にアップグレード |
esm | CommonJS から ES モジュールにマイグレート |
vite | Webpack から Vite にマイグレート |
対象があいまいな場合は、ユーザーに明確化を求めてください。
0.2 現在のバージョンを検出
package.json(およびすべてのワークスペース package.json ファイル)を読み取って、以下を検索します:
- 対象パッケージの現在のバージョン
- 調整が必要な関連パッケージ(例: Vue アップグレード時の
@vue/compiler-sfc) - ピア依存関係
- ロックファイル形式(
package-lock.json、pnpm-lock.yaml、yarn.lock)
cat package.json | grep -E '"(name|version)"' | head -5
cat package.json | grep -A1 '"<target-package>"' || echo "Package not found in package.json"
0.3 ロールバックブランチを作成
ROLLBACK_BRANCH="migrate/pre-<target>-$(date +%Y%m%d)"
git checkout -b "${ROLLBACK_BRANCH}"
git checkout - # Return to original branch
echo "Rollback branch created: ${ROLLBACK_BRANCH}"
ブランチが既に存在する場合は、タイムスタンプを追加します:
ROLLBACK_BRANCH="migrate/pre-<target>-$(date +%Y%m%d-%H%M%S)"
フェーズ 1: 調査 — マイグレーション情報を収集
1.1 調査エージェントをスポーン(WebSearch が利用可能な場合)
WebSearch を使用してマイグレーション対象を調査します。以下を検索します:
- 公式マイグレーションガイド / アップグレードガイド
- 破壊的変更リスト / チェンジログ
- 利用可能なコードモド(自動変換)
- 既知の問題と回避策
- コミュニティマイグレーション体験と落とし穴
推奨検索クエリ:
"<package> <old-version> to <new-version> migration guide"
"<package> <new-version> breaking changes"
"<package> <new-version> codemod"
調査結果を ${SESSION_TMP_DIR}/migration-research.md に書き込みます。
1.2 破壊的変更を分析
見つかった各破壊的変更について、以下を文書化します:
| フィールド | 説明 |
|---|---|
| 変更 | API/動作の変更内容 |
| **パターン | 影響を受けたコードを見つけるための Grep パターン |
| 影響 | このプロジェクトで影響を受けるファイル数 |
| マイグレーションパス | 手動修正またはコードモド利用可能 |
| リスク | 高 / 中 / 低 |
# 各破壊的変更パターンについて、影響を受けるファイルをカウント
grep -r "<pattern>" --include="*.ts" --include="*.tsx" --include="*.vue" --include="*.js" --include="*.jsx" -l . | grep -v node_modules | wc -l
1.3 コードモドの可用性を確認
references/main.md のコードモドレジストリを参照して、利用可能なコードモドを確認します:
# 一般的なコードモドパッケージが存在するかを確認
npm info <codemod-package> version 2>/dev/null || echo "Not found"
一般的なコードモドコマンド:
- Vue:
npx @vue/compatマイグレーションビルド、npx vue-codemod - ESLint:
npx @eslint/migrate-config - TypeScript: strict フラグによる組み込みマイグレーション
- Nuxt:
npx nuxi upgrade - Jest to Vitest:
npx jest-to-vitest
1.4 パッケージチェンジログを読む
Web 調査が利用できない場合は、パッケージチェンジログにフォールバックします:
# node_modules で CHANGELOG を確認
cat node_modules/<package>/CHANGELOG.md 2>/dev/null | head -200
# または npm から取得
npm info <package> --json 2>/dev/null | head -50
フェーズ 2: 影響 — スコープを評価
2.1 影響を受けるファイルをカウント
各破壊的変更について、影響を受けるパターンのコードベースを grep します:
# 破壊的変更ごとのファイルをカウント
for pattern in "<pattern1>" "<pattern2>" "<pattern3>"; do
count=$(grep -r "$pattern" --include="*.ts" --include="*.tsx" --include="*.vue" --include="*.js" -l . | grep -v node_modules | wc -l)
echo "Pattern: $pattern — Files: $count"
done
2.2 リスク評価
references/main.md のリスクマトリックスを使用して全体的なマイグレーションを分類します:
| リスクレベル | 基準 |
|---|---|
| 低 | パッチ/マイナーアップグレード、影響を受けるファイル <10 個、破壊的変更なし |
| 中 | 非推奨付きマイナーアップグレード、10-50 ファイル、コードモド利用可能 |
| 高 | メジャーアップグレード、ファイル >50 個、手動マイグレーション必須 |
| 極度 | 複数のメジャーアップグレード、深いアーキテクチャ変更、コードモドなし |
2.3 努力推定
推定努力を計算します:
合計ステップ数 = 設定変更 + コードモド実行 + (破壊的変更ごとの手動修正)
推定時間 = ステップ数 × ステップあたりの平均時間
ユーザーに評価を提示します:
マイグレーション評価: <target>
現在のバージョン: <X.Y.Z>
対象バージョン: <A.B.C>
リスクレベル: <低 | 中 | 高 | 極度>
影響を受けるファイル: <N>
破壊的変更: <N>
利用可能なコードモド: <N>/<total>
推定ステップ数: <N>
続行しますか? (ロールバックブランチが作成されました。)
フェーズ 3: 計画 — マイグレーションステップを構築
3.1 ステップを順序付け
依存関係とリスク順に順序付けされたアトミック、検証可能なステップを作成します:
| 優先度 | ステップタイプ | リスク | 例 |
|---|---|---|---|
| 1 | 設定ファイルを更新 | 最低 | tsconfig.json、vite.config.ts、.eslintrc |
| 2 | パッケージバージョンを更新 | 低 | npm install <package>@<version> |
| 3 | コードモドを実行 | 低 | npx <codemod> . |
| 4 | 型レベルの変更を修正 | 中 | 更新された型署名、削除された型 |
| 5 | API の変更を修正 | 中 | 名前が変更されたメソッド、変更されたパラメータ |
| 6 | 動作の変更を修正 | 高 | 変更されたデフォルト、削除された機能 |
| 7 | テストを新しい API 用に更新 | 中 | テストインポート、テストユーティリティ |
| 8 | 非推奨をクリーンアップ | 低 | 互換性シムを削除 |
3.2 検証ゲートを定義
各ステップ後、完全な検証スイートを実行します:
# 型チェック
npx tsc --noEmit 2>&1 | tail -30
# テスト
npm test 2>&1 | tail -50
# ビルド
npm run build 2>&1 | tail -30
プロジェクトの実際のコマンドを決定します:
cat package.json | grep -E '"(test|type-check|typecheck|tsc|lint|build)"'
3.3 計画を提示
ユーザーにステップバイステップの計画を表示します:
マイグレーション計画: <current> → <target>
===================================
ステップ数: <N>
ロールバック: <rollback-branch>
ステップ 1: <説明>
ファイル: <count>
リスク: 低
コードモド: <yes/no>
ステップ 2: <説明>
ファイル: <count>
リスク: 中
コードモド: <no — 手動>
...
フェーズ 4: 実行 — 段階的マイグレーション
4.1 ステップを実行
計画内の各ステップについて:
4.1.1 変更を行う
ステップを実行します — ファイル編集、コードモド実行、設定更新。最小変更の原則に従います。
4.1.2 検証
検証スイートを実行します:
<TYPE_CHECK_CMD> 2>&1 | tail -30
<TEST_CMD> 2>&1 | tail -50
<BUILD_CMD> 2>&1 | tail -30
4.1.3 結果を処理
検証が合格した場合:
git add <changed-files>
git commit -m "migrate(<target>): step <N> — <description>"
次のステップに進みます。
検証が失敗した場合:
- エラー出力を分析します。
- 修正を試みます(ステップあたり最大 3 回)。
- 各修正試行後、検証を再実行します。
- 修正された場合: コミットして進みます。
- 3 回の試行後に修正されない場合: ステップをリバート、ブロックされたものとして記録、次のステップを試します。
git checkout -- <changed-files>
4.2 進捗を追跡
進捗チェックリストを維持し、各ステップ後に表示します:
マイグレーション進捗: <current> → <target>
[x] ステップ 1: パッケージバージョンを更新 — 合格
[x] ステップ 2: 設定ファイルを更新 — 合格
[x] ステップ 3: コードモドを実行 — 合格
[ ] ステップ 4: 破壊的 API 変更を修正 — 進行中(試行 2/3)
[ ] ステップ 5: テストインポートを更新 — 保留中
[ ] ステップ 6: 非推奨をクリーンアップ — 保留中
4.2.1 進捗の永続化
各ステップ完了(合格または失敗)後、進捗を ${SESSION_TMP_DIR}/migrate-progress.json に書き込みます:
{
"target": "<migration-target>",
"started": "<ISO-8601>",
"rollback_branch": "<rollback-branch-name>",
"current_step": 4,
"total_steps": 8,
"steps": [
{ "number": 1, "description": "Update package version", "status": "pass", "commit": "abc1234" },
{ "number": 2, "description": "Update config files", "status": "pass", "commit": "def5678" },
{ "number": 3, "description": "Run codemod", "status": "pass", "commit": "ghi9012" },
{ "number": 4, "description": "Fix breaking API changes", "status": "in-progress", "attempt": 2 }
],
"remaining": ["Update test imports", "Clean up deprecations"],
"last_updated": "<ISO-8601>"
}
4.2.2 進捗ファイルから再開
フェーズ 0(マイグレーション開始前)で、既存の進捗ファイルを確認します:
cat ${SESSION_TMP_DIR}/migrate-progress.json 2>/dev/null
見つかった場合、対象が現在のマイグレーションと一致します:
- 完了したステップとそのコミットを表示します。
- ユーザーに尋ねます: 「ステップ N から再開するか、最初からやり直しますか?」
- 再開する場合、完了した各コミットが依然として git 履歴に存在することを確認します。
- 最初の未完了ステップにスキップします。
4.3 連続失敗チェック
ステップ全体の連続失敗を追跡します。連続して 3 つのステップが検証失敗した場合:
マイグレーション中止: 3 回連続の検証失敗
=====================================================
ステップ <N>: <error summary>
ステップ <N+1>: <error summary>
ステップ <N+2>: <error summary>
完了したステップ: <N> (コミット済み)
失敗したステップ: 3
残りステップ: <N>
推奨: マイグレーションアプローチを見直すか、サポートを求めてください。
ロールバック: git checkout <rollback-branch>
フェーズ 5: 検証 — 完全スイート
5.1 完全な検証
すべてのステップが完了した場合(または可能なすべてのステップが実行された場合)、完全な検証を実行します:
<TYPE_CHECK_CMD> 2>&1
<LINT_CMD> 2>&1
<TEST_CMD> 2>&1
<BUILD_CMD> 2>&1
結果をマイグレーション前のベースライン(フェーズ 0 でキャプチャ)と比較します。
5.2 残りの非推奨を確認
npm run build 2>&1 | grep -i "deprecat" || echo "No deprecation warnings in build"
npx tsc --noEmit 2>&1 | grep -i "deprecat" || echo "No deprecation warnings in type-check"
npm test 2>&1 | grep -i "deprecat" || echo "No deprecation warnings in tests"
5.3 パッケージバージョンを検証
対象パッケージが予想されるバージョンにあることを確認します:
cat package.json | grep -A1 '"<target-package>"'
npm ls <target-package> 2>/dev/null | head -5
フェーズ 6: レポート
6.1 マイグレーションサマリー
マイグレーション完了: <target>
==============================
バージョン: <old> → <new>
完了したステップ: <N>/<total>
スキップされたステップ: <N> (理由リスト)
変更されたファイル: <N>
検証:
型チェック: 合格 / 失敗 (N エラー)
Lint: 合格 / 失敗 (N エラー)
テスト: 合格 / 失敗 (N 合格、N 失敗、N スキップ)
ビルド: 合格 / 失敗
非推奨警告: <N> 残り
作成されたコミット: <N>
ロールバック: git checkout <rollback-branch>
6.2 フォローアップ提案
| 状況 | 提案スキル | 理論的根拠 |
|---|---|---|
| マイグレーション後にテストが失敗 | fix-issue | 特定のテスト失敗をデバッグして修正 |
| 非推奨警告が残る | migrate (再実行) | 残りの非推奨に対処 |
| 大規模リファクタリングが必須 | refactor | マイグレーションアーティファクトをクリーンアップ |
| テストカバレッジが低下 | test-gen | 新しい API ユーザーのテストを生成 |
6.3 セッションクリーンアップ
.cc-sessions/${SESSION_ID}.jsonを更新:statusをcompletedまたはfailedに設定します。- 保持されているロックをリリースします。
- 操作ログに
session_endを追加します。
エラー回復
- 調査用インターネットがない:
node_modulesのパッケージチェンジログのみで進みます。マイグレーション ガイダンスが不完全な可能性があることを警告します。 - コードモドが失敗: 影響を受けるパターンの手動マイグレーションにフォールバック。どのパターンが自動マイグレートされなかったかを記録します。
- ロールバックブランチが既に存在: タイムスタンプを追加して一意にします(例:
migrate/pre-vue3-20260318-143022)。 - パッケージインストールが失敗: ピア依存関係の競合を確認します。最後の手段としてのみ
--legacy-peer-depsまたは--forceを試します。競合をユーザーに報告します。 - 開始前に Git 状態がダーティ: ユーザーに警告し、最初に変更をスタッシュまたはコミットすることを提案します。ユーザーが確認しない限り、ダーティ状態では続行しません。
- ロックファイル競合: ロックファイルを削除し、
npm install/pnpm installで再生成します。 - モノレポの複雑さ: 影響を受けるワークスペースを特定し、一度に 1 つずつマイグレートします。共有パッケージから開始します。
- バージョンが見つからない: 対象バージョンが存在しない場合、利用可能なバージョンをリストして、ユーザーに 1 つを選択するように求めます。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- lasswellt
- ライセンス
- MIT
- 最終更新
- 2026/5/2
Source: https://github.com/lasswellt/cc-plugin-suite / ライセンス: MIT