nullable-new-params について
Remotion monorepo で新たに追加されたオプション引数や型メンバーを確認するスキルです。内部契約では必須かつ nullable にし、公開 API では後方互換性を保つよう区別します。
主な機能
- 01新規オプションフィールドの検出
- 02内部 API と公開 API の分類
- 03内部値を必須かつ nullable に変更
- 04呼び出し元と null 判定の更新
- 05スキャンとチェックによる検証
活用シーン
- 01コード差分内のオプションメンバーの確認
- 02内部呼び出し元で null を明示
- 03公開 API 変更の互換性維持
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ remotion-dev/ remotion --skill nullable-new-paramsインストール後、Claude Code で/nullable-new-paramsを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yamlscripts/find-new-optional-params.ts
詳細
Null を許容する新しいパラメーター
新しいパラメーターまたは型メンバーをオプションとして追加する変更には、このスキルを使用してください。Remotion の内部コードでは、新しい入力は必須かつ null 許容にし、すべての呼び出し元が明示的に選択するようにします。
ルール
- 内部コントラクトでは、
name?: Tではなくname: T | nullと記述します。 - 値がない場合、呼び出し元は明示的に
nullを渡す必要があります。 - null を「値がない」ことを示す値として使う場合、実装では
value === nullまたはvalue !== nullによるチェックを優先します。 - 周囲のローカルコントラクトですでに
undefinedを標準としている場合を除き、新しい内部 API でundefinedを「値がない」ことを示す値として使わないでください。 frozenFrame?: number | nullのような冗長な型もアンチパターンです。frozenFrame: number | nullとしてください。
公開 API は例外です。変更後のシグネチャ、props 型、またはオプションオブジェクトがパッケージの公開エントリーポイントからエクスポートされているか、packages/docs/docs に記載されている場合、新しいフィールドまたは引数を必須にすると破壊的変更になります。オプションのままにするか、後方互換性のあるオーバーロードまたはオプションの指定方法を追加し、必要に応じてドキュメントを更新したり、デフォルト値を設定したりしてください。
ワークフロー
- diff を確認し、新しく追加されたオプションのメンバーやパラメーターを探します。
bun .agents/skills/nullable-new-params/scripts/find-new-optional-params.ts
便利なバリエーション:
bun .agents/skills/nullable-new-params/scripts/find-new-optional-params.ts origin/main...HEAD
bun .agents/skills/nullable-new-params/scripts/find-new-optional-params.ts --cached
-
候補ごとに公開 API かどうかを判定します。
- 公開:パッケージのエントリーポイントからエクスポートされている、パッケージの
exportsに含まれている、またはpackages/docs/docsに記載されているもの。 - 内部:ローカルヘルパー、内部コンポーネントの props、ファイルをまたぐモノレポ内ヘルパー、テストユーティリティ、内部コンテキストデータ、パッケージのエントリーポイントから公開されていない型。
- 判断に迷う場合は、API の形を変更する前にパッケージのエントリーポイントとドキュメントを grep で確認してください。
- 公開:パッケージのエントリーポイントからエクスポートされている、パッケージの
-
内部の候補については、型をオプションから必須かつ null 許容に変更します。
type Before = {
readonly frame?: number;
};
type After = {
readonly frame: number | null;
};
関数パラメーターの場合:
const before = (frame?: number) => {};
const after = (frame: number | null) => {};
-
すべての呼び出し元やオブジェクトリテラルを更新し、値を明示的に渡します。
- 値がない場合は
field: nullを使用します。 - 周囲のコードから
undefinedが入る可能性が残っている場合に限り、既存の値をfield: maybeValue ?? nullで保持します。 - 分割代入のデフォルト値を使って、必須の選択を隠さないでください。
- 値がない場合は
-
実装ロジックを更新します。
0、''、falseが有効な値の場合、truthy チェックを置き換えます。- null を許容する数値、文字列、真偽値では、
valueではなくvalue !== nullを優先します。 - 既存のテストやフィクスチャを更新する場合は、明示的な指定を維持してください。新しいフィールドを避けるためだけに、大きなフィクスチャを
Partial<T>にしないでください。
-
公開候補については、後方互換性を維持します。
- 公開型では新しいフィールドをオプションのままにします。
- 境界で、通常は
const internal = publicValue ?? nullを使って、内部向けの具体的な値を解決します。 - 下流の内部型は必須かつ null 許容のままにします。
-
検証します。
- 意図的な公開 API の例外だけが残るまで、スキャナーを再度実行します。
- 変更したパッケージに対して、対象を絞ったテストまたはパッケージビルドを実行します。たとえば、
bunx turbo run make --filter='<package-name>'を実行します。 - ドキュメントを変更した場合は、
writing-docsスキルに従ってください。
レビューチェックリスト
- 新しく追加された内部の
?:メンバーやparam?:パラメーターが残っていない。 - すべての内部の呼び出し元が、実際の値または
nullを渡している。 - 公開 API の後方互換性が維持されている。
- null のチェックで、有効な falsy 値が「値なし」と扱われていない。
- 動作が値なしの場合に依存する場合は、既存のチェックまたは手動検証で明示的な
nullの経路を確認している。
コメント
Markdown 対応