make-native について
make-nativeは、機能追加を例外処理として重ねず、既存のコード設計に沿う形へ作り直すコーディングスキルです。設計の調査、実装の簡素化、テストの改訂、結果の確認を開発者に促します。
主な機能
- 01機能差分と変更箇所の調査
- 02型、呼び出し元、履歴の追跡
- 03機能を当初の設計に沿って再設計
- 04主要経路を簡素化し、例外ケースを分離
- 05新しい設計に合わせたテストの書き直し
- 06残存コードの確認とプロジェクト検査
活用シーン
- 01マージ前の機能ブランチのリファクタリング
- 02機能固有の条件分岐の置き換え
- 03重複する検証処理や基盤の削除
- 04設計変更後のテスト更新
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ sloydai/ make-native --skill make-nativeインストール後、Claude Code で/make-nativeを入力して読み込まれたか確認します。
詳細
軽微な機能追加は、そのために設計されていないコードに例外処理を重ねます。あなたの仕事は、機能をネイティブなものとして作り直すことです。
プロセス
- 機能の差分を読む:
git diff <base>...HEADを実行します。<base>は PR の対象ブランチ(例:gh pr view --json baseRefName -q .baseRefName)または指定されたコミットです。新しい分岐、フラグ、定数、ファイル、テストなど、機能によって追加されたものをすべて列挙します。 - 元の設計を理解し、それを超えて学ぶ。 変更箇所ごとに、呼び出し元より 1、2 段階深く調べます。型、呼び出し元、履歴(
git log -p)を読み、なぜコードがこの形になっているのかを説明できるまで確認します。実行時データ(ログ、エラートラッキング、分析データ、データベースレコードなど)にアクセスできる場合は、実際に発生している経路やケースを確認します。読み取り専用とし、決してコミットしないでください。 - 機能が最初から仕様に含まれていたかのように再設計する。 「作者が初日からこの機能を知っていたなら、このコードはどのような形になっていただろうか?」と考えます。その形で書き直します。簡素化する機会も活用します。型やユニオンを汎用化し、名前を変更し、構造を組み替え、重複を統合し、新しい形にしたことで不要になるものは削除します。
- パレートの法則を適用する。 よく使われる 80%のケースを、まず完璧でシンプルにします。その後、残りの 20%にもできる限り対応しますが、80%を犠牲にしてはいけません。エッジケースによって主要な経路が複雑になる場合は、別途処理するか、明確に失敗させます。
- 新しい設計に合わせてテストを書き直す。 回避策が従来の動作を維持したことだけを検証するテストは削除します。残りのテストは新しい動作に合わせて更新します。既存のテストを変更するのは当然です。
- 確認する。 最終的なコードを読む人が、どの部分が後から追加されたのか見分けられない状態にします。削除したシンボルを
git grepで検索し、残っていないことを確認します。プロジェクトのビルド、リンター、テストを実行します。
解消すべきコードの臭い
- 既存の値を再導出するエイリアス。たとえば、
getContentType()がすでに名詞を返すのに、const noun = isVideo ? 'video' : 'image'とするもの。 - 種類ごとにすでに処理を振り分けているコードに、新しい種類の
if (newKind)分岐が散在すること。 - 既存のものを一方のバリエーション向けに複製した新しいファイルやコンポーネント。
- 型がすでに表現している内容と重複する、新しい
optionsトークン、フラグ、ブール値。 - 共通処理の隣に重複して存在するバリデーションやダウンロード経路。
- 「ほかに何も変わっていない」ことだけを目的とするテスト。
- 新しいコストトラッカー、カウンター、ロガー、リトライヘルパー、設定読み込み処理など、すでにある関心事に対する二つ目のシステム。既存のシステムに統合し、不足している部分があれば拡張して、重複を削除します。
ルール
- 機能追加にのみ適用します。バグ修正は最小限にとどめてください。バグ修正のコミットには適用しないでください。
- 新しい抽象化レイヤーを作らないでください。既存のものを組み替えます。
- 本質的に異なる動作は維持します。
<video>要素と<img>要素の違いは本物です。状態機械の重複はそうではありません。 - 機能追加のコミットとは別にコミットし、リポジトリのコミット規約に従います。Conventional Commits を使用する場合、動作が変わらない再構成には
refactorを、再構成によって動作が変わる場合はfeatを使います。
コメント
Markdown 対応