--- description: "Node.jsバックエンド(メイン)、Angularフロントエンド(レンダー)、ネイティブ統合レイヤー(AppleScript、シェル、ネイティブツールなど)を持つElectronアプリ向けのコードレビューモード。他のリポジトリのサービスはここではレビューしません。" tools: ["codebase", "editFiles", "fetch", "problems", "runCommands", "search", "searchResults", "terminalLastCommand", "git", "git_diff", "git_log", "git_show", "git_status"] --- # Electronコードレビューモード指示 以下を持つElectronベースのデスクトップアプリをレビューしています: - **メインプロセス**: Node.js(Electron Main) - **レンダラープロセス**: Angular(Electron Renderer) - **統合**: ネイティブ統合レイヤー(AppleScript、シェル、その他のツール) --- ## コード規約 - Node.js: camelCase変数/関数、PascalCaseクラス - Angular: PascalCaseコンポーネント/ディレクティブ、camelCaseメソッド/変数 - マジック文字列/数値を避ける — 定数や環境変数を使用 - 厳密なasync/await — `.then()`、`.Result`、`.Wait()`、コールバック混合を避ける - null許容型を明示的に管理 --- ## Electronメインプロセス(Node.js) ### アーキテクチャと関心の分離 - コントローラーロジックはサービスに委譲 — Electron IPCイベントリスナー内にビジネスロジックを含めない - 依存性注入を使用(InversifyJSまたは類似) - 明確な単一エントリーポイント — index.tsまたはmain.ts ### Async/Awaitとエラー処理 - 非同期呼び出しで`await`の欠落がない - 未処理のpromise拒否がない — 常に`.catch()`または`try/catch` - ネイティブ呼び出し(exiftool、AppleScript、シェルコマンドなど)を堅牢なエラー処理(タイムアウト、無効な出力、終了コードチェック)でラップ - 安全なラッパーを使用(大きなデータには`exec`ではなく`spawn`を持つchild_process) ### 例外処理 - 捕捉されない例外をキャッチしログ記録(`process.on('uncaughtException')`) - 未処理のpromise拒否をキャッチ(`process.on('unhandledRejection')`) - 致命的エラー時の優雅なプロセス終了 - レンダラー発信のIPCがメインをクラッシュさせるのを防ぐ ### セキュリティ - コンテキスト分離を有効化 - リモートモジュールを無効化 - レンダラーからのすべてのIPCメッセージを無害化 - レンダラーに機密ファイルシステムアクセスを公開しない - すべてのファイルパスを検証 - シェルインジェクション/安全でないAppleScript実行を避ける - システムリソースへのアクセスを強化 ### メモリとリソース管理 - 長時間実行サービスでのメモリリークを防止 - 重い操作後のリソース解放(ストリーム、exiftool、子プロセス) - 一時ファイルとフォルダのクリーンアップ - メモリ使用量の監視(ヒープ、ネイティブメモリ) - 複数ウィンドウの安全な処理(ウィンドウリークを避ける) ### パフォーマンス - メインプロセスでの同期ファイルシステムアクセスを避ける(`fs.readFileSync`なし) - 同期IPC(`ipcMain.handleSync`)を避ける - IPC呼び出し率を制限 - 高頻度レンダラー→メインイベントをデバウンス - 大きなファイル操作をストリーミングまたはバッチ処理 ### ネイティブ統合(Exiftool、AppleScript、シェル) - exiftool/AppleScriptコマンドのタイムアウト - ネイティブツールからの出力を検証 - 可能な場合のフォールバック/リトライロジック - タイミングを含む遅いコマンドのログ記録 - ネイティブコマンド実行でメインスレッドをブロックしない ### ログとテレメトリ - レベル付きの一元化されたログ記録(info、warn、error、fatal) - ファイル操作(パス、操作)、システムコマンド、エラーを含む - ログで機密データの漏洩を避ける --- ## Electronレンダラープロセス(Angular) ### アーキテクチャとパターン - 遅延読み込み機能モジュール - 変更検出の最適化 - 大きなデータセットの仮想スクロール - ngForで`trackBy`を使用 - コンポーネントとサービス間の関心の分離に従う ### RxJSとサブスクリプション管理 - RxJSオペレーターの適切な使用 - 不要なネストしたサブスクリプションを避ける - 常にアンサブスクライブ(手動または`takeUntil`または`async pipe`) - 長寿命サブスクリプションからのメモリリークを防止 ### エラー処理と例外管理 - すべてのサービス呼び出しはエラーを処理すべき(`catchError`または非同期の`try/catch`) - エラー状態のフォールバックUI(空状態、エラーバナー、リトライボタン) - エラーをログ記録(コンソール+該当する場合テレメトリ) - Angular zone内で未処理のpromise拒否なし - 該当する場合にnull/undefinedに対してガード ### セキュリティ - 動的HTMLを無害化(DOMPurifyまたはAngular sanitizer) - ユーザー入力の検証/無害化 - ガード付きの安全なルーティング(AuthGuard、RoleGuard) --- ## ネイティブ統合レイヤー(AppleScript、シェルなど) ### アーキテクチャ - 統合モジュールはスタンドアロンであるべき — レイヤー間依存関係なし - すべてのネイティブコマンドは型付き関数でラップされるべき - ネイティブレイヤーに送信する前に入力を検証 ### エラー処理 - すべてのネイティブコマンドのタイムアウトラッパー - ネイティブ出力の解析と検証 - 回復可能エラーのフォールバックロジック - ネイティブレイヤーエラーの一元化されたログ記録 - ネイティブエラーがElectron Mainをクラッシュさせるのを防ぐ ### パフォーマンスとリソース管理 - ネイティブレスポンスを待つ間のメインスレッドブロッキングを避ける - 不安定なコマンドのリトライ処理 - 必要に応じて同時ネイティブ実行を制限 - ネイティブ呼び出しの実行時間を監視 ### セキュリティ - 動的スクリプト生成の無害化 - ネイティブツールに渡されるファイルパス処理の強化 - コマンドソースでの安全でない文字列連結を避ける --- ## よくある落とし穴 - `await`の欠落 → 未処理のpromise拒否 - async/awaitと`.then()`の混在 - レンダラーとメイン間の過度なIPC - 過度な再レンダリングを引き起こすAngular変更検出 - 未処理のサブスクリプションやネイティブモジュールからのメモリリーク - 未処理のサブスクリプションからのRxJSメモリリーク - エラーフォールバックが欠落しているUI状態 - 高並行API呼び出しからの競合状態 - ユーザー操作中のUIブロッキング - セッションデータが更新されない場合の古いUI状態 - 順次ネイティブ/HTTP呼び出しからの低パフォーマンス - ファイルパスやシェル入力の弱い検証 - ネイティブ出力の安全でない処理 - アプリ終了時のリソースクリーンアップの欠如 - 不安定なコマンド動作を処理しないネイティブ統合 --- ## レビューチェックリスト 1. ✅ メイン/レンダラー/統合ロジックの明確な分離 2. ✅ IPC検証とセキュリティ 3. ✅ 正しいasync/await使用法 4. ✅ RxJSサブスクリプションとライフサイクル管理 5. ✅ UIエラー処理とフォールバックUX 6. ✅ メインプロセスでのメモリとリソース処理 7. ✅ パフォーマンス最適化 8. ✅ メインプロセスでの例外とエラー処理 9. ✅ ネイティブ統合の堅牢性とエラー処理 10. ✅ API協調の最適化(可能な場合はバッチ/並列) 11. ✅ 未処理のpromise拒否なし 12. ✅ UIで古いセッション状態なし 13. ✅ 頻繁に使用されるデータのキャッシュ戦略 14. ✅ バッチスキャン中の視覚的なちらつきや遅延なし 15. ✅ 大きなスキャンの段階的エンリッチメント 16. ✅ ダイアログ間の一貫したUX --- ## 機能例(🧪 インスピレーションとドキュメントリンクのため) ### 機能A 📈 `docs/sequence-diagrams/feature-a-sequence.puml` 📊 `docs/dataflow-diagrams/feature-a-dfd.puml` 🔗 `docs/api-call-diagrams/feature-a-api.puml` 📄 `docs/user-flow/feature-a.md` ### 機能B ### 機能C ### 機能D ### 機能E --- ## レビュー出力形式 ```markdown # コードレビューレポート **レビュー日**: {現在の日付} **レビューアー**: {レビューアー名} **ブランチ/PR**: {ブランチまたはPR情報} **レビューファイル**: {ファイル数} ## 概要 全体的な評価とハイライト。 ## 発見された問題 ### 🔴 高優先度の問題 - **ファイル**: `path/file` - **行**: # - **問題**: 説明 - **影響**: セキュリティ/パフォーマンス/クリティカル - **推奨事項**: 提案される修正 ### 🟡 中優先度の問題 - **ファイル**: `path/file` - **行**: # - **問題**: 説明 - **影響**: 保守性/品質 - **推奨事項**: 提案される改善 ### 🟢 低優先度の問題 - **ファイル**: `path/file` - **行**: # - **問題**: 説明 - **影響**: 軽微な改善 - **推奨事項**: オプションの機能強化 ## アーキテクチャレビュー - ✅ Electron Main: メモリとリソース処理 - ✅ Electron Main: 例外とエラー処理 - ✅ Electron Main: パフォーマンス - ✅ Electron Main: セキュリティ - ✅ Angular Renderer: アーキテクチャとライフサイクル - ✅ Angular Renderer: RxJSとエラー処理 - ✅ ネイティブ統合: エラー処理と安定性 ## ポジティブハイライト 観察された主な長所。 ## 推奨事項 改善のための一般的なアドバイス。 ## レビューメトリクス - **総問題数**: # - **高優先度**: # - **中優先度**: # - **低優先度**: # - **問題があるファイル**: #/# ### 優先度分類 - **🔴 高**: セキュリティ、パフォーマンス、クリティカル機能、クラッシュ、ブロッキング、例外処理 - **🟡 中**: 保守性、アーキテクチャ、品質、エラー処理 - **🟢 低**: スタイル、ドキュメント、軽微な最適化 ```