検索/大きなTypeScriptモノレポに、テストで確かめた小さな変更を加える

大きなTypeScriptモノレポに、テストで確かめた小さな変更を加える

パッケージがたくさんあるTypeScriptのワークスペースをAIに直させる時に使う。先にリポジトリの構成とツールを調べ、変更に関わるビルドとテストだけを回し、生成ファイルには勝手に触れず、UnixとWindowsの両方で動くかを確かめる。

このAIルールを使うには
## 編集の前に、リポジトリの構成と使っているツールを調べる リポジトリの正本となるエージェントガイドを、唯一の指示源として扱う。別のエージェント入口は正本への薄い参照に保ち、アーキテクチャ、ツール、バージョン、作業手順、コントリビューター規則が変わった時は正本を更新する。 次を特定する。 - 実際のリポジトリルート、主要ソース領域、ビルドスクリプト領域、文書、テスト用アプリケーション、生成される作業空間 - 必須の基準ブランチ、実行環境のバージョン、パッケージマネージャー、タスクオーケストレーター、リンター、フォーマッター、CIが対応するOS - 外部向けエクスポートと、明示的に内部専用とされたエクスポート - パッケージ固有の型検査器、およびリポジトリ検査、エディターツール、下流API利用者の間にあるコンパイラーバージョンの違い 共有設定は、対応するすべてのコンパイラー経路で有効に保つ。最新の検査器が受理するという理由だけで、オプションや構文を採用してはならない。 モジュール式UIツールでは、実行時レンダラー、バンドルエンジン、および両者をフレームワーク設定と組み合わせる統合層を区別する。実行時に読み込む前の静的索引など、高速起動のアーキテクチャを維持する。1つの無効なユーザーモジュールが、ナビゲーション画面や管理画面全体を停止させてはならない。 ## 変更に必要なビルドとチェックだけを、小さい範囲から実行する コマンドは文書化された作業ディレクトリから実行し、タスクグラフを指定する時は配布パッケージ名ではなく、作業空間のプロジェクト名を使う。 まず、キャッシュを利用でき、依存関係を認識し、本番用ではないタスクから始める。 1. 影響を受けるプロジェクトまたはパッケージ群をコンパイルする。 2. 範囲を限定して型検査を行う。 3. 変更したファイルを整形し、静的検査を行う。 4. 最も近い関連テストを実行する。 5. 内部開発UIで動作を検証する。 テンプレート統合、本番タスクの接続、またはパッケージ間動作に変更が依存する場合だけ、本番設定、生成サンドボックス、CI同等の手順へ進む。検証済みの後半段階から意図的に再開する場合を除き、タスクの依存関係を守る。 長時間動く開発サーバーを標準動作として起動してはならない。テンプレート、対象、環境が必要なコマンドには、それらを明示的に渡す。 生成サンドボックスが失敗した場合は、ビルドアーキテクチャを変える前に、文書化された内部UIを診断用の代替経路として使う。 ## コードの種類に合うテストを選び、テストどうしが影響しないようにする 動作に合うテスト形式を選ぶ。 - 描画されるコンポーネントは、同じ場所にあるストーリーと操作関数を通して、アクセシビリティと利用者の操作を含めてテストする。 - 純粋なユーティリティ、フック、描画を伴わないモジュールには単体テストを使う。 - 外観には視覚検証ツールを使う。 - 統合契約には、エンドツーエンド、スモーク、またはランナーの各テスト群を使う。 内部実装の詳細ではなく、エクスポートされた動作と観測可能な副作用をテストする。型、静的検査規則、ストーリー操作、または上位のブラウザーテストですでに保証される内容を重複させてはならない。 ファイルシステムを扱うコードでは、実際の一時ディレクトリやモジュール全体の置き換えよりも、メモリー内ファイルシステムを優先する。各テストの前に仮想状態を初期化し、必要なファイルシステムメソッドだけを差し替え、有用な場合は仮想ディスクの状態を検証する。 テスト内で環境全体に作用するグローバル値を直接代入してはならない。テスト基盤が追跡できるグローバルスタブを使い、以前存在しなかったキーも含めてテスト後に元へ戻す。直接代入すると、ファイルの実行順に依存する状態漏れが起きる。 期待するパスは実行環境のパスユーティリティで正規化し、UnixとWindowsの両方でファイルシステム検証が通るようにする。 ## 思い込みを先に確かめ、要らない抽象化を足さない アーキテクチャの前提にする前に、小さな使い捨ての確認処理で環境上の仮定を検証する。バンドラー、メタデータ、ローダー、生成結果に関する未検証の思い込みを、恒久的なコメントや抽象化へ変えてはならない。 永続的な前提は、まず型と既存の静的検査規則で表す。静的な強制が現実的でない場合は、境界に低コストの実行時検査を追加し、違反を発生源の近くで失敗させる。 将来の柔軟性を推測して足すより、不要な仕組みを取り除き、直接的な実装を選ぶ。存在しない利用者のために抽象化、代替経路、拡張点を追加してはならない。 コメントは調査記録ではなく、保守用の文書である。長く有効な理由を1〜2文で説明し、チケットコード、確認作業の履歴、バイト比較の経緯、壊れやすい行番号参照は省く。 セキュリティに関わる経路と古い移行処理には、幅広い境界条件のテストを使う。互換コードには明確なバージョン範囲を設け、対応期間が終わった時に取り扱いを終えられるようにする。 ## 生成ファイルを勝手に変えず、決められた整形とログのツールを使う 編集後にリポジトリのフォーマッターを実行し、続いて変更ファイルの静的検査と関連テストを行う。設定済みのツールを使い、廃止済みのリンターへ置き換えたり、フォーマッターが管理するコードを手作業で整形したりしてはならない。 新しいTypeScriptスクリプトは、リポジトリの現行の正式経路から実行し、設定で求められる場合はTypeScript用の明示的なインポート拡張子を使う。旧式ローダーの移行は、今回触れる範囲だけに限定する。 通常のサーバーコードとクライアントコードでは、プロジェクトのログ抽象化を使う。生のコンソール呼び出しは、ロガーを取り込むことが不合理な独立スクリプトに限る。 意図しない生成ファイルの変更をコミットしてはならない。生成物を変更できるのは、同じ作業内の意図的なソース変更から決定的に生じた場合だけである。それ以外は触れずに残し、生成処理のずれが繰り返される場合は報告する。 パス、子プロセス、テストではUnixとWindowsの両方を考慮する。CIの複数プラットフォーム対応は任意の整理ではなく、互換性要件として扱う。 ## コンパイルが通っただけで終わらせず、動きを確かめて変更を仕上げる 通常の変更では、次の順に進める。 1. 必要な場合だけ依存関係を導入する。 2. 関連する依存関係グラフをコンパイルする。 3. 一貫性を保てる最小の編集を行う。 4. 影響を受けるパッケージを再コンパイルする。 5. 範囲を限定した型検査、整形、静的検査、契約に合うテストを行う。 6. 内部UIで検証する。 7. 直接関係する場合だけ、サンドボックスまたは本番同等の検査を追加する。 レンダラー、フレームワーク、ビルダー、プラグインの統合では、所有するパッケージを編集し、まず本番モードを使わずにコンパイルする。その後、対応する生成アプリケーションと、関連するランナーまたはエンドツーエンド手順でテストする。 ビルドが失敗した場合は、メモリー上限を増やしたりアーキテクチャを変えたりする前に、依存関係を更新して範囲限定のコンパイルを再試行する。サンドボックスの動作が内部UIと異なる場合は、生成結果とキャッシュを確認する。 コンパイルだけで準備完了を主張してはならない。必要な証拠は、変更したパッケージ境界、対応するコンパイラー経路、観測可能な動作、複数OSの前提、直接影響する統合手順を覆う最小の一式である。