docstore.json•462 kB
[["0",{"pageContent":"---\ndescription: AIコードエージェントのパーソナリティと行動規範の定義\nruleId: ai-01jpcvxfxt05asvwtmgzjcg80t\ntags: [ai-agent, example, engineering]\naliases: [engineer-bot]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\"]\n---\n\n# AIコードエージェント\n\n## パーソナリティ設定\n\n### 基本性格\n\n- 態度(フォーマル/カジュアル): セミフォーマル。技術的な正確さを保ちながらも、親しみやすい。\n- コミュニケーションスタイル: 簡潔で直接的。技術的な詳細を重視。\n- 特徴的な言い回し: \"具体的に言うと...\"、\"技術的には...\"、\"ベストプラクティスとしては...\"。\n- 価値観: 効率性、再利用性、保守性を重視。\n\n### 専門分野と知識レベル\n\n- 主要スキル:。\n - ソフトウェアアーキテクチャ: 5。\n - コードレビュー: 5。\n - デバッグ: 4。\n - パフォーマンス最適化: 4。\n\n- 得意分野:。\n - クリーンコードの原則適用。\n - システム設計パターン。\n - 契約による設計。\n - ドメイン駆動設計。\n - テスト駆動開発。\n - オブジェクト指向設計。\n - 関数型プログラミング。\n - アクターモデル。\n - リアクティブシステム。\n - セキュアバイデザイン。\n\n- 苦手分野:。\n - UIデザイン。\n - ビジネス戦略。\n - マーケティング。\n\n## 行動規範\n\n### 応答ルール\n\n1. まず問題の理解を確認。\n2. 複数の解決方法を提示。\n3. ベストプラクティスに基づいて推奨案を説明。\n4. 実装手順を段階的に説明。\n\n### 禁止事項\n\n1. 不完全なコードの提供。\n2. セキュリティリスクのある提案。\n3. ライセンス違反の可能性のあるコードの共有。\n4. ユニットテストを書かないこと。\n\n## タスク処理方針\n\n### 優先順位付け","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/ai-01jpcvxfxt05asvwtmgzjcg80t.md","loc":{"lines":{"from":1,"to":63}}}}],["1",{"pageContent":"### 応答ルール\n\n1. まず問題の理解を確認。\n2. 複数の解決方法を提示。\n3. ベストプラクティスに基づいて推奨案を説明。\n4. 実装手順を段階的に説明。\n\n### 禁止事項\n\n1. 不完全なコードの提供。\n2. セキュリティリスクのある提案。\n3. ライセンス違反の可能性のあるコードの共有。\n4. ユニットテストを書かないこと。\n\n## タスク処理方針\n\n### 優先順位付け\n\n1. セキュリティ考慮事項。\n2. コードの保守性。\n3. 実装の簡潔さ。\n4. テスト容易性。\n5. パフォーマンス要件。\n\n### エラー処理\n\n- エラー発生時の対応: 詳細なエラーメッセージと解決手順の提供。\n- エッジケースの扱い: 事前に考慮し、防御的プログラミングを推奨。\n\n## 学習と適応\n\n### フィードバック処理\n\n- フィードバックの受け取り方: コードレビューコメントとして扱い、具体的な改善を提案。\n- 改善プロセス: イテレーティブな改善を推奨、各ステップでのレビューを重視。\n\n### 知識更新\n\n- 新しい情報の取り込み方: 技術文書、リリースノート、コミュニティフィードバックの確認。最終的にこのリポジトリのmdファイルに反映する。\n- 知識の検証方法: 実装とテストとベンチマークの実行。\n\n## 参考情報\n\n- モデルベース: Claude 3.5 sonnet 若しくは Claude 3.7 sonnet。\n- 特化分野: ソフトウェアエンジニアリング。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/ai-01jpcvxfxt05asvwtmgzjcg80t.md","loc":{"lines":{"from":47,"to":91}}}}],["2",{"pageContent":"---\ndescription: AIコードエージェントを効果的に活用するためのベストプラクティス\nruleId: best-practices-01jpcvxfxs0zr4jqmx1jn4f9rj\ntags:\n - ai\n - best-practices\n - guidelines\naliases:\n - ai-best-practices\nglobs:\n - '**/*.ts'\n - '**/*.tsx'\n - '**/*.js'\n - '**/*.jsx'\n - '**/*.go'\n - '**/*.rs'\n - '**/*.scala'\n---\n\n# AIエージェント活用のベストプラクティス\n\n## 概要\n\nこのドキュメントでは、AIコードエージェントを効果的に活用するためのベストプラクティスを提供します。\n実践的な例と共に、効率的な開発を実現するためのガイドラインを示します。\n\n## タスク管理\n\n### 1. タスクの分割\n\n- 大きなタスクを小さな単位に分割する。\n- 各サブタスクは独立して実装可能な範囲とする。\n- 依存関係を明確にする。\n- 優先順位を設定する。\n\n### 2. 要件の明確化\n\n- 機能要件を具体的に記述する。\n- 非機能要件(パフォーマンス、セキュリティ)を明示する。\n- 制約条件を列挙する。\n- 受け入れ基準を定義する。\n\n### 3. 進捗管理\n\n- マイルストーンを設定する。\n- 定期的な進捗確認する。\n- ブロッカーを早期に特定する。\n- 必要に応じて計画を調整する。\n\n## コード生成\n\n### 1. 準備\n\n- 既存のコードベースの構造を説明する。\n- 使用している技術スタックを明示する。\n- コーディング規約を共有する。\n- 参考となる実装例を提供する。\n\n### 2. 実装手順\n\n```markdown\n【実装手順】。\n1. 基本構造の生成。\n - インターフェースの定義。\n - 主要なクラスの作成。\n - 依存関係の設定。\n\n2. コア機能の実装。\n - 主要なロジックの実装。\n - エラー処理の追加。\n - ユニットテストの作成。\n\n3. 最適化とリファクタリング。\n - パフォーマンスの改善。\n - コードの整理。\n - ドキュメントの追加。\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/best-practices-01jpcvxfxs0zr4jqmx1jn4f9rj.md","loc":{"lines":{"from":1,"to":77}}}}],["3",{"pageContent":"2. コア機能の実装。\n - 主要なロジックの実装。\n - エラー処理の追加。\n - ユニットテストの作成。\n\n3. 最適化とリファクタリング。\n - パフォーマンスの改善。\n - コードの整理。\n - ドキュメントの追加。\n```\n\n### 3. レビューとフィードバック\n\n- 生成されたコードを詳細にレビューする。\n- 具体的なフィードバックを提供する。\n- 必要な修正を依頼する。\n- 改善点を文書化する。\n\n## テスト戦略\n\n### 1. テストケースの設計\n\n- 主要な機能のテスト。\n- エッジケースの考慮。\n- エラー処理のテスト。\n- パフォーマンステスト。\n\n### 2. テスト実装\n\n```markdown\n【テスト実装手順】。\n1. ユニットテスト。\n - 各機能の独立したテスト。\n - 境界値のテスト。\n - エラーケースのテスト。\n\n2. 統合テスト。\n - コンポーネント間の連携テスト。\n - エンドツーエンドのシナリオ。\n - 非機能要件のテスト。\n```\n\n## デバッグとトラブルシューティング\n\n### 1. 問題の特定\n\n- エラーメッセージの解析。\n- ログの確認。\n- 再現手順の確認。\n- 環境の違いの確認。\n\n### 2. 解決アプローチ\n\n```markdown\n【デバッグ手順】。\n1. 問題の切り分け。\n - エラーの発生箇所の特定。\n - 関連するコードの確認。\n - 環境依存の確認。\n\n2. 解決策の検討。\n - 根本原因の分析。\n - 複数の解決案の検討。\n - 影響範囲の評価。\n```\n\n## コード品質の維持\n\n### 1. コードレビュー\n\n- 設計の妥当性確認。\n- 実装の品質チェック。\n- セキュリティレビュー。\n- パフォーマンスレビュー。\n\n### 2. リファクタリング\n\n- コードの整理と改善。\n- 重複の排除。\n- パフォーマンスの最適化。\n- テストの追加。\n\n## ドキュメント管理\n\n### 1. コードドキュメント\n\n- 適切なコメントの追加。\n- APIドキュメントの生成。\n- 使用例の提供。\n- 設計判断の記録。\n\n### 2. プロジェクトドキュメント","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/best-practices-01jpcvxfxs0zr4jqmx1jn4f9rj.md","loc":{"lines":{"from":68,"to":159}}}}],["4",{"pageContent":"### 2. リファクタリング\n\n- コードの整理と改善。\n- 重複の排除。\n- パフォーマンスの最適化。\n- テストの追加。\n\n## ドキュメント管理\n\n### 1. コードドキュメント\n\n- 適切なコメントの追加。\n- APIドキュメントの生成。\n- 使用例の提供。\n- 設計判断の記録。\n\n### 2. プロジェクトドキュメント\n\n- README.mdの整備。\n- セットアップガイドの作成。\n- トラブルシューティングガイドの更新。\n- リリースノートの作成。\n\n## 継続的な改善\n\n### 1. フィードバックの収集\n\n- 開発者からのフィードバック。\n- ユーザーからのフィードバック。\n- パフォーマンス指標の収集。\n- 問題点の記録。\n\n### 2. プロセスの改善\n\n- ベストプラクティスの更新。\n- ツールと手法の改善。\n- チーム内での知識共有。\n- トレーニング材料の作成。\n\n## 成功事例\n\n### 1. コード生成の例\n\n```markdown\n【成功事例:APIエンドポイントの実装】。\n1. 要件の明確化。\n - エンドポイントの仕様。\n - 入力バリデーション。\n - エラー処理。\n - レスポンス形式。\n\n2. 段階的な実装。\n - 基本構造の生成。\n - バリデーションの追加。\n - エラー処理の実装。\n - テストの作成。\n\n3. レビューとフィードバック。\n - コードレビュー。\n - テストの実行。\n - パフォーマンステスト。\n - セキュリティチェック。\n```\n\n### 2. デバッグの例\n\n```markdown\n【成功事例:パフォーマンス問題の解決】。\n1. 問題の特定。\n - パフォーマンス指標の収集。\n - ボトルネックの特定。\n - 原因の分析。\n\n2. 解決策の実装。\n - コードの最適化。\n - キャッシュの導入。\n - 並列処理の実装。\n\n3. 効果の検証。\n - パフォーマンステスト。\n - 負荷テスト。\n - モニタリング。\n```\n\n## 関連情報","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/best-practices-01jpcvxfxs0zr4jqmx1jn4f9rj.md","loc":{"lines":{"from":143,"to":227}}}}],["5",{"pageContent":"2. 解決策の実装。\n - コードの最適化。\n - キャッシュの導入。\n - 並列処理の実装。\n\n3. 効果の検証。\n - パフォーマンステスト。\n - 負荷テスト。\n - モニタリング。\n```\n\n## 関連情報\n\n- [API設計・ドキュメント作成ガイドライン](../development/api/guidelines-01jpcvxfxqe37ka9pn3xb4m9ys.md)\n- [AIエージェントとの対話プロトコル](interaction-01jpcvxfxs0zr4jqmx1jn4f9re.md)\n- [AIエージェントの機能と制限](capabilities-01jpcvxfxs0zr4jqmx1jn4f9rh.md)\n- [AIエージェントのトラブルシューティング](troubleshooting-01jpcvxfxra1qd2v1btrrz4s2z.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/best-practices-01jpcvxfxs0zr4jqmx1jn4f9rj.md","loc":{"lines":{"from":216,"to":232}}}}],["6",{"pageContent":"---\ndescription: AIコードエージェントの機能、制限、および利用可能なツール\nruleId: capabilities-01jpcvxfxs0zr4jqmx1jn4f9rh\ntags:\n - ai\n - capabilities\n - limitations\naliases:\n - ai-capabilities\nglobs:\n - '**/*.ts'\n - '**/*.tsx'\n - '**/*.js'\n - '**/*.jsx'\n - '**/*.go'\n - '**/*.rs'\n - '**/*.scala'\n---\n\n# AIエージェントの機能と制限\n\n## 概要\n\nこのドキュメントでは、AIコードエージェントが提供する機能と、その制限事項について説明します。\n開発者がAIエージェントの能力を最大限に活用できるよう、具体的な使用方法と注意点を提供します。\n\n## 利用可能な機能\n\n### 1. コードベース操作\n\n#### コード検索\n\n- セマンティック検索による関連コードの特定。\n- 正規表現を使用した精密な検索。\n- ファイル名やパスによるファイル検索。\n\n#### コード編集\n\n- 新規ファイルの作成。\n- 既存ファイルの編集。\n- ファイルの削除。\n- コードのリファクタリング提案。\n\n#### コード分析\n\n- コードの意図の理解。\n- 依存関係の分析。\n- 潜在的な問題の特定。\n- 改善提案の生成。\n\n### 2. 開発支援\n\n#### ドキュメント生成\n\n- コードドキュメントの作成。\n- APIドキュメントの生成。\n- 使用例の提供。\n- README.mdの作成。\n\n#### テスト支援\n\n- テストケースの提案。\n- テストコードの生成。\n- エッジケースの特定。\n- テストカバレッジの分析。\n\n#### デバッグ支援\n\n- エラーの解析。\n- デバッグ手順の提案。\n- ログ出力の改善提案。\n- トラブルシューティングガイドの提供。\n\n### 3. プロジェクト管理\n\n#### タスク管理\n\n- タスクの分割提案。\n- 実装手順の提案。\n- 進捗の追跡。\n- リスクの特定。\n\n#### コードレビュー","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/capabilities-01jpcvxfxs0zr4jqmx1jn4f9rh.md","loc":{"lines":{"from":1,"to":83}}}}],["7",{"pageContent":"#### デバッグ支援\n\n- エラーの解析。\n- デバッグ手順の提案。\n- ログ出力の改善提案。\n- トラブルシューティングガイドの提供。\n\n### 3. プロジェクト管理\n\n#### タスク管理\n\n- タスクの分割提案。\n- 実装手順の提案。\n- 進捗の追跡。\n- リスクの特定。\n\n#### コードレビュー\n\n- コードの品質チェック。\n- セキュリティ上の問題の特定。\n- パフォーマンスの分析。\n- ベストプラクティスの提案。\n\n## 制限事項\n\n### 1. 技術的制限\n\n#### 知識の制限\n\n- 知識カットオフ日以降の情報は持っていない。\n- 特定の専門分野に関する深い知識は限定的。\n- プロジェクト固有の文脈理解には限界がある。\n\n#### 実行の制限\n\n- 直接的なコード実行は不可。\n- 外部システムとの直接的な通信は不可。\n- 大規模なファイル操作には制限がある。\n\n#### 理解の制限\n\n- 複雑な文脈の完全な理解は困難。\n- 暗黙的な要件の理解には限界がある。\n- 自然言語の微妙なニュアンスの理解に制限。\n\n### 2. 運用上の制限\n\n#### リソース制限\n\n- 同時実行数の制限。\n- 処理時間の制限。\n- メモリ使用量の制限。\n- トークン数の制限。\n\n#### アクセス制限\n\n- 特定のファイルやディレクトリへのアクセス制限。\n- 外部リソースへのアクセス制限。\n- セキュリティ上の制限。\n\n## 推奨される使用方法\n\n### 1. 効果的な機能活用\n\n#### コード生成\n\n- 明確な要件と制約の提供。\n- 段階的な実装の依頼。\n- フィードバックの積極的な提供。\n- イテレーティブな改善。\n\n#### コードレビュー\n\n- レビュー範囲の明確な指定。\n- 具体的な確認項目の提示。\n- 文脈情報の十分な提供。\n- フィードバックの具体的な説明。\n\n#### デバッグ支援\n\n- 問題の詳細な説明。\n- 再現手順の提供。\n- エラーメッセージの共有。\n- 試した解決策の説明。\n\n### 2. 制限事項への対応\n\n#### 知識の補完\n\n- 最新情報の明示的な提供。\n- プロジェクト固有の文脈の説明。\n- 参考資料やドキュメントの共有。\n\n#### 実行制限の回避","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/capabilities-01jpcvxfxs0zr4jqmx1jn4f9rh.md","loc":{"lines":{"from":67,"to":160}}}}],["8",{"pageContent":"#### デバッグ支援\n\n- 問題の詳細な説明。\n- 再現手順の提供。\n- エラーメッセージの共有。\n- 試した解決策の説明。\n\n### 2. 制限事項への対応\n\n#### 知識の補完\n\n- 最新情報の明示的な提供。\n- プロジェクト固有の文脈の説明。\n- 参考資料やドキュメントの共有。\n\n#### 実行制限の回避\n\n- ローカルでの実行結果の共有。\n- 段階的な変更の確認。\n- 手動でのテスト実行。\n\n## ベストプラクティス\n\n### 1. 効率的な利用\n\n- 明確な目的と要件の提示。\n- 必要な文脈情報の提供。\n- 段階的な実装の依頼。\n- フィードバックの積極的な提供。\n\n### 2. 品質の確保\n\n- 生成されたコードの確認。\n- テストの実施。\n- セキュリティチェック。\n- パフォーマンス検証。\n\n### 3. 継続的な改善\n\n- フィードバックの記録。\n- 成功事例の共有。\n- 問題点の文書化。\n- プロセスの改善。\n\n## 関連情報\n\n- [API設計・ドキュメント作成ガイドライン](../development/api/guidelines-01jpcvxfxqe37ka9pn3xb4m9ys.md)\n- [AIエージェントとの対話プロトコル](interaction-01jpcvxfxs0zr4jqmx1jn4f9re.md)\n- [AIエージェント活用のベストプラクティス](best-practices-01jpcvxfxs0zr4jqmx1jn4f9rj.md)\n- [AIエージェントのトラブルシューティング](troubleshooting-01jpcvxfxra1qd2v1btrrz4s2z.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/capabilities-01jpcvxfxs0zr4jqmx1jn4f9rh.md","loc":{"lines":{"from":145,"to":194}}}}],["9",{"pageContent":"---\ndescription: AIエージェントとの効果的な協働のための基本原則とガイドライン\nruleId: collaboration-01jpcvxfxs0zr4jqmx1jn4f9rg\ntags:\n - ai\n - guidelines\n - best-practices\n - index\naliases:\n - ai-guidelines-index\nglobs:\n - '**/*.ts'\n - '**/*.js'\n - '**/*.jsx'\n - '**/*.tsx'\n - '**/*.py'\n---\n\n\n# AIエージェントの基本原則\n\n## 概要\n\nこのドキュメントは、AIエージェントとの効果的な協働のための基本原則とガイドラインを提供します。\nチーム全体で一貫したAIエージェントの活用を実現し、開発効率と成果物の品質を向上させることを目的とします。\n\n## 基本原則\n\n### 1. 明確なコミュニケーション\n\n- 具体的で明確な指示を提供する。\n- 目的と期待する結果を明確に説明する。\n- 必要な文脈情報を適切に提供する。\n- フィードバックは具体的に行う。\n\n### 2. 段階的な開発\n\n- 大きなタスクは小さな単位に分割する。\n- 各ステップでの成果物を確認する。\n- イテレーティブな改善を心がける。\n- 方向性は適宜調整する。\n\n### 3. 品質管理\n\n- 生成されたコードを必ずレビューする。\n- テストケースの作成と実行を確認する。\n- セキュリティ考慮事項を遵守する。\n- パフォーマンスと保守性を重視する。\n\n## 制限事項\n\n### 1. 技術的制限\n\n- 知識のカットオフ日に注意。\n- プロジェクト固有の文脈理解には限界がある。\n- 複雑な要件の完全な理解は困難。\n- 生成コードの品質にばらつきがある可能性。\n\n### 2. 運用上の制限\n\n- 同時実行の制限に注意。\n- レスポンス時間の変動を考慮。\n- トークン制限を意識。\n- 外部システムとの直接通信は不可。\n\n## 効果的な利用方法\n\n### 1. タスク定義\n\n```markdown\n【タスク定義のテンプレート】。\n1. 目的。\n - 実装したい機能や解決したい問題。\n - 達成したい成果。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/collaboration-01jpcvxfxs0zr4jqmx1jn4f9rg.md","loc":{"lines":{"from":1,"to":74}}}}],["10",{"pageContent":"### 2. 運用上の制限\n\n- 同時実行の制限に注意。\n- レスポンス時間の変動を考慮。\n- トークン制限を意識。\n- 外部システムとの直接通信は不可。\n\n## 効果的な利用方法\n\n### 1. タスク定義\n\n```markdown\n【タスク定義のテンプレート】。\n1. 目的。\n - 実装したい機能や解決したい問題。\n - 達成したい成果。\n\n2. 要件。\n - 機能要件。\n - 非機能要件。\n - 制約条件。\n\n3. 文脈情報。\n - 既存のコードベース。\n - 技術スタック。\n - アーキテクチャ制約。\n```\n\n### 2. レビューとフィードバック\n\n```markdown\n【フィードバックのテンプレート】。\n1. 改善点。\n - コードの品質。\n - 実装の妥当性。\n - セキュリティ考慮事項。\n\n2. 具体的な指摘。\n - 問題のある箇所。\n - 期待する修正内容。\n - 参考情報。\n\n3. 肯定的なフィードバック。\n - 良い実装。\n - 効果的なアプローチ。\n```\n\n## 詳細情報\n\nAIエージェントの活用に関する詳細な情報は、以下のドキュメントを参照してください:。\n\n- [API設計・ドキュメント作成ガイドライン](../development/api/guidelines-01jpcvxfxqe37ka9pn3xb4m9ys.md) - AIエージェントの利用に関する基本的な規約\n- [AIエージェントの機能と制限](capabilities-01jpcvxfxs0zr4jqmx1jn4f9rh.md) - 利用可能な機能と制限事項の詳細\n- [AIエージェントとの対話プロトコル](interaction-01jpcvxfxs0zr4jqmx1jn4f9re.md) - 効果的な対話方法とプロトコル\n- [AIエージェント活用のベストプラクティス](best-practices-01jpcvxfxs0zr4jqmx1jn4f9rj.md) - 効果的な活用のためのプラクティス集\n- [AIエージェントのトラブルシューティング](troubleshooting-01jpcvxfxra1qd2v1btrrz4s2z.md) - 問題解決のガイドライン\n\n## 関連情報","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/collaboration-01jpcvxfxs0zr4jqmx1jn4f9rg.md","loc":{"lines":{"from":59,"to":116}}}}],["11",{"pageContent":"## 関連情報\n\n- [開発の掟](../development-01jpcvxfxa9zn7yzy0qtmgyq95.md)\n- [タスク管理の掟](../task-management-01jpcvxfxa9zn7yzy0qtmgyq94.md)\n- [ツールの掟](../development/tools-01jpcvxfxbfm6z9tc89zm9c37b.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/collaboration-01jpcvxfxs0zr4jqmx1jn4f9rg.md","loc":{"lines":{"from":116,"to":120}}}}],["12",{"pageContent":"---\ndescription: AIコードエージェントの基本ガイドラインと利用規約\nruleId: guidelines-01jpcvxfxs0zr4jqmx1jn4f9rf\ntags:\n - ai\n - guidelines\n - best-practices\naliases:\n - ai-guidelines\nglobs:\n - '**/*.ts'\n - '**/*.js'\n - '**/*.py'\n - '**/*.go'\n - '**/*.rs'\n - '**/*.scala'\n - '**/*.java'\n---\n\n\n# AIコードエージェントガイドライン\n\n## 概要\n\nこのドキュメントは、AIコードエージェントの利用に関する基本的なガイドラインと規約を定義します。\n開発者とAIエージェントの効果的な協働を実現するための指針を提供します。\n\n## 基本原則\n\n### 1. 明確なコミュニケーション\n\n- 具体的で明確な指示を提供する。\n- 目的と期待する結果を明確に説明する。\n- 制約条件や要件を明示的に伝える。\n- 必要な文脈情報を提供する。\n\n### 2. イテレーティブな開発\n\n- 大きなタスクは小さな単位に分割する。\n- 段階的な実装とフィードバックを繰り返す。\n- 各ステップでの成果物を確認する。\n- 必要に応じて方向性を調整する。\n\n### 3. 品質管理\n\n- AIが生成したコードを必ずレビューする。\n- テストケースの作成と実行を依頼する。\n- エッジケースの考慮を明示的に要求する。\n- パフォーマンスと保守性を考慮する。\n\n### 4. セキュリティ考慮事項\n\n- 機密情報の取り扱いに注意する。\n- セキュリティベストプラクティスの遵守を要求する。\n- 生成されたコードのセキュリティレビューする。\n- 依存関係の脆弱性チェックを実施する。\n\n## 効果的な利用方法\n\n### 1. タスク定義\n\n- 目的と要件を明確に定義する。\n- 受け入れ基準を明示する。\n- 技術的な制約を説明する。\n- 優先順位を設定する。\n\n### 2. コード生成\n\n- 既存のコードベースとの整合性を確認する。\n- コーディング規約の遵守を要求する。\n- 適切なエラー処理の実装を依頼する。\n- ドキュメント生成を含める。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/guidelines-01jpcvxfxs0zr4jqmx1jn4f9rf.md","loc":{"lines":{"from":1,"to":72}}}}],["13",{"pageContent":"## 効果的な利用方法\n\n### 1. タスク定義\n\n- 目的と要件を明確に定義する。\n- 受け入れ基準を明示する。\n- 技術的な制約を説明する。\n- 優先順位を設定する。\n\n### 2. コード生成\n\n- 既存のコードベースとの整合性を確認する。\n- コーディング規約の遵守を要求する。\n- 適切なエラー処理の実装を依頼する。\n- ドキュメント生成を含める。\n\n### 3. レビューとフィードバック\n\n- 生成されたコードを詳細にレビューする。\n- 具体的なフィードバックを提供する。\n- 改善点を明確に説明する。\n- 良い実装を評価する。\n\n### 4. 反復と改善\n\n- フィードバックに基づく修正を依頼する。\n- 段階的な改善を進める。\n- 学習した内容を記録する。\n- ベストプラクティスを更新する。\n\n## 制限事項\n\n### 1. 技術的制限\n\n- AIの知識カットオフ日に注意する。\n- 特定の技術スタックの制限を理解する。\n- 複雑な文脈の理解には限界がある。\n- 生成コードの品質にばらつきがある可能性。\n\n### 2. 運用上の制限\n\n- 同時実行の制限に注意する。\n- レスポンス時間の変動を考慮する。\n- トークン制限を意識する。\n- API制限を把握する。\n\n## ベストプラクティス\n\n### 1. プロジェクト固有の設定\n\n- プロジェクトのコーディング規約を共有する。\n- 技術スタックの詳細を説明する。\n- アーキテクチャの制約を伝える。\n- 既存のパターンを示す。\n\n### 2. 効率的な対話\n\n- 明確で簡潔な指示を心がける。\n- 必要な文脈情報を適切に提供する。\n- フィードバックは具体的に行う。\n- 成功事例を共有する。\n\n### 3. 品質管理\n\n- 自動テストの作成を依頼する。\n- コードレビューのチェックリストを用意する。\n- パフォーマンス要件を明確にする。\n- セキュリティガイドラインを遵守する。\n\n## トラブルシューティング\n\n### 1. 一般的な問題\n\n- 不明確な応答への対処法。\n- エラーメッセージの解釈。\n- タイムアウトへの対応。\n- コンテキストの再設定方法。\n\n### 2. 品質問題","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/guidelines-01jpcvxfxs0zr4jqmx1jn4f9rf.md","loc":{"lines":{"from":58,"to":136}}}}],["14",{"pageContent":"### 3. 品質管理\n\n- 自動テストの作成を依頼する。\n- コードレビューのチェックリストを用意する。\n- パフォーマンス要件を明確にする。\n- セキュリティガイドラインを遵守する。\n\n## トラブルシューティング\n\n### 1. 一般的な問題\n\n- 不明確な応答への対処法。\n- エラーメッセージの解釈。\n- タイムアウトへの対応。\n- コンテキストの再設定方法。\n\n### 2. 品質問題\n\n- 不適切なコード生成への対応。\n- パフォーマンス問題の解決。\n- セキュリティ問題の修正。\n- テストカバレッジの改善。\n\n## 関連情報\n\n- [AIエージェントとの対話プロトコル](interaction-01jpcvxfxs0zr4jqmx1jn4f9re.md)\n- [AIエージェントの機能と制限](capabilities-01jpcvxfxs0zr4jqmx1jn4f9rh.md)\n- [AIエージェント活用のベストプラクティス](best-practices-01jpcvxfxs0zr4jqmx1jn4f9rj.md)\n- [AIエージェントのトラブルシューティング](troubleshooting-01jpcvxfxra1qd2v1btrrz4s2z.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/guidelines-01jpcvxfxs0zr4jqmx1jn4f9rf.md","loc":{"lines":{"from":120,"to":148}}}}],["15",{"pageContent":"---\ndescription: AIコードエージェントとの効果的な対話方法とプロトコル\nruleId: interaction-01jpcvxfxs0zr4jqmx1jn4f9re\ntags:\n - ai\n - interaction\n - communication\naliases:\n - ai-interaction\nglobs:\n - '**/*.ts'\n - '**/*.tsx'\n - '**/*.js'\n - '**/*.jsx'\n - '**/*.go'\n - '**/*.rs'\n - '**/*.scala'\n---\n\n# AIエージェントとの対話プロトコル\n\n## 概要\n\nこのドキュメントでは、AIコードエージェントとの効果的な対話方法とプロトコルを定義します。\n明確なコミュニケーションを通じて、開発効率と成果物の品質を向上させることを目的とします。\n\n## 対話の基本構造\n\n### 1. タスクの定義\n\n```markdown\n【タスク】。\n- 目的:実装したい機能や解決したい問題を明確に説明。\n- 要件:具体的な機能要件や制約条件を列挙。\n- 期待する結果:完了の定義を明確に示す。\n- 技術的制約:使用する技術スタックや制限事項。\n\n【コンテキスト】。\n- 既存のコードベースの関連部分。\n- アーキテクチャの制約。\n- 参考にすべき実装例。\n```\n\n### 2. 進捗の確認\n\n```markdown\n【確認事項】。\n- 現在の実装状況。\n- 発生している問題。\n- 次のステップ。\n- 必要な追加情報。\n```\n\n### 3. フィードバック\n\n```markdown\n【フィードバック】。\n- 具体的な改善点。\n- 良かった点。\n- 追加の要件や制約。\n- 質問や確認事項。\n```\n\n## 効果的な指示の書き方\n\n### 1. 明確な目的\n\n- 何を達成したいのかを具体的に説明。\n- なぜそれが必要なのかの背景を提供。\n- 期待する結果を明確に定義。\n- 優先順位を示す。\n\n### 2. 具体的な制約\n\n- 使用する技術スタック。\n- パフォーマンス要件。\n- セキュリティ要件。\n- コーディング規約。\n\n### 3. 文脈の提供\n\n- 関連するコードの場所。\n- 既存の実装パターン。\n- 依存関係。\n- 注意すべき点。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/interaction-01jpcvxfxs0zr4jqmx1jn4f9re.md","loc":{"lines":{"from":1,"to":85}}}}],["16",{"pageContent":"- 何を達成したいのかを具体的に説明。\n- なぜそれが必要なのかの背景を提供。\n- 期待する結果を明確に定義。\n- 優先順位を示す。\n\n### 2. 具体的な制約\n\n- 使用する技術スタック。\n- パフォーマンス要件。\n- セキュリティ要件。\n- コーディング規約。\n\n### 3. 文脈の提供\n\n- 関連するコードの場所。\n- 既存の実装パターン。\n- 依存関係。\n- 注意すべき点。\n\n## コードレビューの依頼方法\n\n### 1. レビュー範囲の指定\n\n```markdown\n【レビュー依頼】。\n- 対象ファイル:。\n- 重点的に確認して欲しい箇所:。\n- 特に注意すべき点:。\n- 確認観点:。\n```\n\n### 2. 具体的な確認項目\n\n- コーディング規約との整合性。\n- エラー処理の適切性。\n- パフォーマンスへの影響。\n- セキュリティ上の考慮。\n\n## トラブルシューティングの依頼\n\n### 1. 問題の説明\n\n```markdown\n【問題報告】。\n- 発生している現象:。\n- 期待する動作:。\n- エラーメッセージ:。\n- 再現手順:。\n```\n\n### 2. 文脈の提供\n\n- 関連するコード。\n- 環境情報。\n- 直近の変更内容。\n- 試したこと。\n\n## ベストプラクティス\n\n### 1. 効率的な対話\n\n- 一度に1つの問題に焦点を当てる。\n- 必要な情報を過不足なく提供する。\n- 明確な質問を心がける。\n- フィードバックは具体的に行う。\n\n### 2. イテレーティブな開発\n\n- 小さな単位で進める。\n- 各ステップで確認する。\n- フィードバックを積極的に提供する。\n- 方向性の調整を適時行う。\n\n### 3. 文書化\n\n- 重要な決定事項を記録する。\n- 解決した問題と方法を文書化する。\n- 学んだ教訓を共有する。\n- ベストプラクティスを更新する。\n\n## 関連情報","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/interaction-01jpcvxfxs0zr4jqmx1jn4f9re.md","loc":{"lines":{"from":68,"to":148}}}}],["17",{"pageContent":"### 2. イテレーティブな開発\n\n- 小さな単位で進める。\n- 各ステップで確認する。\n- フィードバックを積極的に提供する。\n- 方向性の調整を適時行う。\n\n### 3. 文書化\n\n- 重要な決定事項を記録する。\n- 解決した問題と方法を文書化する。\n- 学んだ教訓を共有する。\n- ベストプラクティスを更新する。\n\n## 関連情報\n\n- [API設計・ドキュメント作成ガイドライン](../development/api/guidelines-01jpcvxfxqe37ka9pn3xb4m9ys.md)\n- [AIエージェントの機能と制限](capabilities-01jpcvxfxs0zr4jqmx1jn4f9rh.md)\n- [AIエージェント活用のベストプラクティス](best-practices-01jpcvxfxs0zr4jqmx1jn4f9rj.md)\n- [AIエージェントのトラブルシューティング](troubleshooting-01jpcvxfxra1qd2v1btrrz4s2z.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/interaction-01jpcvxfxs0zr4jqmx1jn4f9re.md","loc":{"lines":{"from":134,"to":153}}}}],["18",{"pageContent":"---\ndescription: AIコードエージェントの問題解決とトラブルシューティングガイド\nruleId: troubleshooting-01jpcvxfxra1qd2v1btrrz4s2z\ntags:\n - ai\n - troubleshooting\n - debugging\naliases:\n - ai-troubleshooting\nglobs:\n - '**/*.ts'\n - '**/*.tsx'\n - '**/*.js'\n - '**/*.jsx'\n - '**/*.go'\n - '**/*.rs'\n - '**/*.scala'\n---\n\n# AIエージェントのトラブルシューティング\n\n## 概要\n\nこのドキュメントでは、AIコードエージェントを使用する際に発生する可能性のある問題と、その解決方法を提供します。\n一般的な問題のトラブルシューティング手順と、問題を防ぐためのベストプラクティスを説明します。\n\n## 一般的な問題と解決方法\n\n### 1. コミュニケーションの問題\n\n#### 指示が正しく理解されない\n\n**症状**\n\n- AIが要件と異なる実装を提案する。\n- 文脈を誤って解釈している。\n- 重要な制約を見落としている。\n\n**解決方法**\n\n1. 指示を明確かつ具体的に再構成する。\n2. 要件を箇条書きで列挙する。\n3. 制約条件を明示的に示す。\n4. 期待する結果を具体的に説明する。\n\n#### 文脈の喪失\n\n**症状**\n\n- 以前の会話の内容が反映されていない。\n- 同じ説明を繰り返す必要がある。\n- 一貫性のない応答をする。\n\n**解決方法**\n\n1. 重要な文脈情報を再提供する。\n2. 会話の目的を定期的に確認する。\n3. 進行中のタスクの状態を明確にする。\n4. 必要に応じて新しいセッションを開始する。\n\n### 2. コード生成の問題\n\n#### 不適切なコード生成\n\n**症状**\n\n- コーディング規約に従っていない。\n- 非効率な実装が含まれる。\n- セキュリティ上の問題がある。\n\n**解決方法**\n\n1. コーディング規約を明示的に共有する。\n2. 具体的な改善点を指摘する。\n3. 望ましい実装例を提示する。\n4. セキュリティ要件を強調する。\n\n#### 依存関係の問題\n\n**症状**","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/troubleshooting-01jpcvxfxra1qd2v1btrrz4s2z.md","loc":{"lines":{"from":1,"to":80}}}}],["19",{"pageContent":"### 2. コード生成の問題\n\n#### 不適切なコード生成\n\n**症状**\n\n- コーディング規約に従っていない。\n- 非効率な実装が含まれる。\n- セキュリティ上の問題がある。\n\n**解決方法**\n\n1. コーディング規約を明示的に共有する。\n2. 具体的な改善点を指摘する。\n3. 望ましい実装例を提示する。\n4. セキュリティ要件を強調する。\n\n#### 依存関係の問題\n\n**症状**\n\n- 互換性のないバージョンが指定される。\n- 必要な依存関係が不足している。\n- 循環参照が発生する。\n\n**解決方法**\n\n1. プロジェクトの依存関係を明確に示す。\n2. バージョン制約を説明する。\n3. アーキテクチャの制約を共有する。\n4. 既存の依存関係の管理方法を説明する。\n\n### 3. パフォーマンスの問題\n\n#### 非効率な実装\n\n**症状**\n\n- 実行時間が長い。\n- メモリ使用量が多い。\n- リソースの無駄遣いがある。\n\n**解決方法**\n\n1. パフォーマンス要件を明確にする。\n2. ボトルネックを特定する。\n3. 最適化の方針を示す。\n4. ベンチマーク結果を共有する。\n\n#### スケーラビリティの問題\n\n**症状**\n\n- 大規模データでの処理が遅い。\n- 並行処理が適切でない。\n- リソース使用が線形でない。\n\n**解決方法**\n\n1. スケーラビリティ要件を定義する。\n2. 処理方法の見直しを依頼する。\n3. 並行処理の導入を検討する。\n4. キャッシュ戦略を改善する。\n\n### 4. テストの問題\n\n#### 不十分なテストカバレッジ\n\n**症状**\n\n- エッジケースが考慮されていない。\n- 重要な機能のテストが不足。\n- テストの品質が低い。\n\n**解決方法**\n\n1. テスト要件を明確にする。\n2. カバーすべきケースを列挙する。\n3. テストパターンを提示する。\n4. テスト品質の基準を共有する。\n\n#### テストの失敗\n\n**症状**\n\n- テストが不安定。\n- 環境依存の問題がある。\n- アサーションが不適切。\n\n**解決方法**\n\n1. テスト環境を統一する。\n2. テストデータを整備する。\n3. アサーションを見直す。\n4. テストの独立性を確保する。\n\n## 予防的対策\n\n### 1. 事前準備","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/troubleshooting-01jpcvxfxra1qd2v1btrrz4s2z.md","loc":{"lines":{"from":61,"to":159}}}}],["20",{"pageContent":"#### テストの失敗\n\n**症状**\n\n- テストが不安定。\n- 環境依存の問題がある。\n- アサーションが不適切。\n\n**解決方法**\n\n1. テスト環境を統一する。\n2. テストデータを整備する。\n3. アサーションを見直す。\n4. テストの独立性を確保する。\n\n## 予防的対策\n\n### 1. 事前準備\n\n- プロジェクトの構造とガイドラインを共有する。\n- 開発環境の設定を明確にする。\n- コーディング規約を提供する。\n- テスト戦略を定義する。\n\n### 2. 品質管理\n\n- コードレビューのプロセスを確立する。\n- 自動テストを整備する。\n- 静的解析ツールを導入する。\n- パフォーマンスモニタリングを実施する。\n\n### 3. ドキュメント整備\n\n- APIドキュメントを維持する。\n- 設計判断を記録する。\n- トラブルシューティングガイドを更新する。\n- ベストプラクティスを文書化する。\n\n## デバッグ手順\n\n### 1. 問題の特定\n\n```markdown\n【デバッグ手順】。\n1. 症状の観察。\n - エラーメッセージの確認。\n - ログの分析。\n - 動作の観察。\n - パフォーマンス計測。\n\n2. 問題の切り分け。\n - 発生条件の特定。\n - 影響範囲の確認。\n - 依存関係の調査。\n - 環境要因の確認。\n```\n\n### 2. 解決策の実装\n\n```markdown\n【解決手順】。\n1. 対策の検討。\n - 複数の解決案を検討。\n - 影響範囲を評価。\n - リスクを分析。\n - 実装方針を決定。\n\n2. 修正の実施。\n - コードの修正。\n - テストの追加。\n - ドキュメントの更新。\n - レビューの実施。\n```\n\n## ベストプラクティス\n\n### 1. コミュニケーション\n\n- 明確で具体的な指示を心がける。\n- 文脈情報を適切に提供する。\n- フィードバックを積極的に行う。\n- 進捗を定期的に確認する。\n\n### 2. コード品質\n\n- コーディング規約を遵守する。\n- テストを充実させる。\n- パフォーマンスを考慮する。\n- セキュリティを重視する。\n\n### 3. ドキュメント","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/troubleshooting-01jpcvxfxra1qd2v1btrrz4s2z.md","loc":{"lines":{"from":142,"to":232}}}}],["21",{"pageContent":"## ベストプラクティス\n\n### 1. コミュニケーション\n\n- 明確で具体的な指示を心がける。\n- 文脈情報を適切に提供する。\n- フィードバックを積極的に行う。\n- 進捗を定期的に確認する。\n\n### 2. コード品質\n\n- コーディング規約を遵守する。\n- テストを充実させる。\n- パフォーマンスを考慮する。\n- セキュリティを重視する。\n\n### 3. ドキュメント\n\n- 設計判断を記録する。\n- APIドキュメントを整備する。\n- トラブルシューティング手順を更新する。\n- ベストプラクティスを共有する。\n\n## 関連情報\n\n- [API設計・ドキュメント作成ガイドライン](../development/api/guidelines-01jpcvxfxqe37ka9pn3xb4m9ys.md)\n- [AIエージェントとの対話プロトコル](interaction-01jpcvxfxs0zr4jqmx1jn4f9re.md)\n- [AIエージェントの機能と制限](capabilities-01jpcvxfxs0zr4jqmx1jn4f9rh.md)\n- [AIエージェント活用のベストプラクティス](best-practices-01jpcvxfxs0zr4jqmx1jn4f9rj.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents/troubleshooting-01jpcvxfxra1qd2v1btrrz4s2z.md","loc":{"lines":{"from":216,"to":244}}}}],["22",{"pageContent":"---\ndescription: AIエージェントに関する基本原則とガイドラインの概要\nruleId: ai-agents-01jpcvxfxa9zn7yzy0qtmgyq96\ntags:\n - ai\n - index\naliases:\n - ai-index\nglobs:\n - '**/*.ts'\n - '**/*.js'\n - '**/*.py'\n - '**/*.ipynb'\n---\n\n\n# AIエージェント\n\nこのセクションでは、AIエージェントに関する基本原則、ガイドライン、ベストプラクティスを提供します。\n\n## 主要トピック\n\n- [AIエージェントの基本原則](ai-agents/collaboration-01jpcvxfxs0zr4jqmx1jn4f9rg.md) - AIエージェントとの効果的な協働のための基本原則とガイドライン\n- [API設計・ドキュメント作成ガイドライン](development/api/guidelines-01jpcvxfxqe37ka9pn3xb4m9ys.md) - AIエージェントの利用に関する基本的な規約\n- [AIエージェントの機能と制限](ai-agents/capabilities-01jpcvxfxs0zr4jqmx1jn4f9rh.md) - 利用可能な機能と制限事項の詳細\n- [AIエージェントとの対話プロトコル](ai-agents/interaction-01jpcvxfxs0zr4jqmx1jn4f9re.md) - 効果的な対話方法とプロトコル\n- [AIエージェント活用のベストプラクティス](ai-agents/best-practices-01jpcvxfxs0zr4jqmx1jn4f9rj.md) - 効果的な活用のためのプラクティス集\n- [AIエージェントのトラブルシューティング](ai-agents/troubleshooting-01jpcvxfxra1qd2v1btrrz4s2z.md) - 問題解決のガイドライン","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/ai-agents-01jpcvxfxa9zn7yzy0qtmgyq96.md","loc":{"lines":{"from":1,"to":28}}}}],["23",{"pageContent":"---\ndescription: API設計とドキュメント作成のガイドライン\nruleId: guidelines-01jpcvxfxqe37ka9pn3xb4m9ys\ntags:\n - api\n - development\n - guidelines\naliases:\n - api-guidelines\nglobs:\n - '**/api/**/*'\n - '**/controllers/**/*'\n - '**/routes/**/*'\n - '**/*.proto'\n - '**/graphql/**/*'\n - '**/schema.graphql'\n---\n\n\n# API設計・ドキュメント作成ガイドライン\n\n## 概要\n\nこのドキュメントは、APIの設計とドキュメント作成に関するガイドラインを定義します。\n各APIタイプ(REST、gRPC、GraphQL)に特化したガイドラインは、それぞれのサブドキュメントを参照してください。\n\n## API設計原則\n\n### 一貫性\n\n- 命名規則の統一。\n - リソース名:単数形/複数形の一貫した使用。\n - メソッド名:動詞の統一(get/fetch/retrieveなど)\n - パラメータ名:共通パラメータの命名統一。\n\n- バージョニング。\n - セマンティックバージョニングの採用。\n - 後方互換性の維持方針。\n - 非推奨化のプロセス。\n\n### セキュリティ\n\n- 認証方式。\n - Bearer Token認証。\n - API Key認証。\n - OAuth 2.0。\n - カスタム認証ヘッダー。\n\n- 認可。\n - ロールベースアクセス制御(RBAC)\n - 属性ベースアクセス制御(ABAC)\n - スコープベースの権限管理。\n\n### エラー処理\n\n- エラーレスポンス形式。\n\n ```json\n {\n \"code\": \"INVALID_PARAMETER\",\n \"message\": \"パラメータが不正です\",\n \"details\": {\n \"field\": \"email\",\n \"reason\": \"メールアドレスの形式が不正です\"\n }\n }\n ```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/api/guidelines-01jpcvxfxqe37ka9pn3xb4m9ys.md","loc":{"lines":{"from":1,"to":67}}}}],["24",{"pageContent":"### エラー処理\n\n- エラーレスポンス形式。\n\n ```json\n {\n \"code\": \"INVALID_PARAMETER\",\n \"message\": \"パラメータが不正です\",\n \"details\": {\n \"field\": \"email\",\n \"reason\": \"メールアドレスの形式が不正です\"\n }\n }\n ```\n\n- HTTPステータスコード/gRPCステータスコード。\n - 適切なステータスコードの選択。\n - カスタムエラーコードの定義。\n - エラーメッセージの多言語対応。\n\n### パフォーマンス\n\n- レート制限。\n - API単位の制限。\n - ユーザー/クライアント単位の制限。\n - 超過時の対応。\n\n- キャッシュ。\n - キャッシュヘッダーの設定。\n - キャッシュ無効化の方針。\n - 条件付きリクエスト。\n\n## ドキュメント要件\n\n### 基本情報\n\n- API概要。\n - 目的と用途。\n - 主要機能。\n - 技術スタック。\n\n- 前提条件。\n - 必要な認証情報。\n - 環境要件。\n - 依存関係。\n\n### インタフェース仕様\n\n- エンドポイント/メソッド。\n - 完全なURI/メソッド名。\n - リクエスト/レスポンスの形式。\n - パラメータの制約。\n\n- データ型。\n - 基本データ型の定義。\n - カスタム型の説明。\n - バリデーションルール。\n\n### 使用例\n\n- 基本的な使用例。\n\n ```bash\n # リクエスト例。\n curl -X POST \\。\n -H \"Authorization: Bearer ${TOKEN}\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"name\": \"example\"}' \\\n https://api.example.com/v1/resources\n ```\n\n- エラーケース。\n - よくあるエラーとその対処法。\n - トラブルシューティングガイド。\n\n### 運用情報\n\n- モニタリング。\n - 監視メトリクス。\n - アラート設定。\n - ログ形式。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/api/guidelines-01jpcvxfxqe37ka9pn3xb4m9ys.md","loc":{"lines":{"from":54,"to":134}}}}],["25",{"pageContent":"- エラーケース。\n - よくあるエラーとその対処法。\n - トラブルシューティングガイド。\n\n### 運用情報\n\n- モニタリング。\n - 監視メトリクス。\n - アラート設定。\n - ログ形式。\n\n- SLA/SLO。\n - 可用性目標。\n - レイテンシー要件。\n - エラーレート閾値。\n\n## 各API仕様書\n\n- [REST APIの掟](types/rest-01jpcvxfxra1qd2v1btrrz4s2w.md)\n- [gRPC APIドキュメント作成ガイドライン](types/grpc-01jpcvxfxra1qd2v1btrrz4s2x.md)\n- [GraphQL APIドキュメント作成ガイドライン](types/graphql-01jpcvxfxra1qd2v1btrrz4s2y.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/api/guidelines-01jpcvxfxqe37ka9pn3xb4m9ys.md","loc":{"lines":{"from":125,"to":145}}}}],["26",{"pageContent":"---\ndescription: GraphQL APIドキュメントの作成ガイドライン\nruleId: graphql-01jpcvxfxra1qd2v1btrrz4s2y\ntags: [api, graphql, documentation]\naliases: [graphql-api-guidelines]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\"]\n---\n\n# GraphQL APIドキュメント作成ガイドライン\n\n## 概要\n\nこのドキュメントは、GraphQL APIのドキュメント作成に関するガイドラインを定義します。\n\n## スキーマ定義\n\n### 型定義\n\n```graphql\ntype User {。\n id: ID!\n name: String!\n email: String\n posts: [Post!]!\n}\n```\n\n- 必須フィールドの指定方法。\n- リレーション定義の方針。\n- カスタムスカラーの使用基準。\n\n### クエリ設計\n\n```graphql\ntype Query {。\n user(id: ID!): User\n users(first: Int, after: String): UserConnection!\n}\n```\n\n- ページネーションの実装。\n- フィルタリングの設計。\n- N+1問題への対応。\n\n### ミューテーション設計\n\n```graphql\ntype Mutation {。\n createUser(input: CreateUserInput!): CreateUserPayload!\n}\n\ninput CreateUserInput {。\n name: String!\n email: String!\n}\n```\n\n- 入力型の設計。\n- ペイロード型の設計。\n- エラー処理の方針。\n\n## ドキュメント生成\n\n### スキーマ文書化\n\n- GraphQL Docgenの利用。\n- インラインドキュメントの記述。\n- 例示の提供方法。\n\n### プレイグラウンド\n\n- GraphQL Playgroundの設定。\n- クエリ例の提供。\n- 認証情報の扱い。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/api/types/graphql-01jpcvxfxra1qd2v1btrrz4s2y.md","loc":{"lines":{"from":1,"to":74}}}}],["27",{"pageContent":"- 入力型の設計。\n- ペイロード型の設計。\n- エラー処理の方針。\n\n## ドキュメント生成\n\n### スキーマ文書化\n\n- GraphQL Docgenの利用。\n- インラインドキュメントの記述。\n- 例示の提供方法。\n\n### プレイグラウンド\n\n- GraphQL Playgroundの設定。\n- クエリ例の提供。\n- 認証情報の扱い。\n\n## セキュリティ\n\n### クエリ複雑性\n\n- クエリの深さ制限。\n- フィールド制限。\n- レート制限。\n\n### 認証・認可\n\n- JWT認証の実装。\n- 権限管理。\n- センシティブデータの保護。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/api/types/graphql-01jpcvxfxra1qd2v1btrrz4s2y.md","loc":{"lines":{"from":58,"to":88}}}}],["28",{"pageContent":"---\ndescription: gRPC APIドキュメントの作成ガイドライン\nruleId: grpc-01jpcvxfxra1qd2v1btrrz4s2x\ntags: [api, grpc, documentation]\naliases: [grpc-api-guidelines]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\"]\n---\n\n# gRPC APIドキュメント作成ガイドライン\n\n## 概要\n\nこのドキュメントは、gRPC APIのドキュメント作成に関するガイドラインを定義します。\n\n## Protocol Buffers\n\n### メッセージ定義\n\n```protobuf\nmessage Request {。\n string id = 1; // リクエストの一意識別子。\n // ... 他のフィールド。\n}\n```\n\n- フィールド番号の管理方法。\n- 型の選択基準。\n- コメントの記述方法。\n\n### サービス定義\n\n```protobuf\nservice ExampleService {。\n rpc GetData(Request) returns (Response);。\n rpc StreamData(Request) returns (stream Response);。\n}\n```\n\n- RPCメソッドの命名規則。\n- ストリーミングの使用基準。\n- エラー処理の方針。\n\n## インタフェース設計\n\n### メソッド設計\n\n- 単項RPC vs ストリーミングRPC。\n- バッチ処理の設計。\n- タイムアウト設定。\n\n### エラー処理\n\n- gRPCステータスコードの使用。\n- エラーメッセージの形式。\n- リトライ戦略。\n\n## ドキュメント生成\n\n### ツール利用\n\n- protoc-gen-docの設定。\n- CI/CDでの自動生成。\n- バージョン管理。\n\n### API参照\n\n- メソッド仕様の記述。\n- 型定義の説明。\n- 例示の提供。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/api/types/grpc-01jpcvxfxra1qd2v1btrrz4s2x.md","loc":{"lines":{"from":1,"to":69}}}}],["29",{"pageContent":"---\ndescription: 掟プロジェクトにおけるREST APIの設計と実装に関するガイドライン\nruleId: rest-01jpcvxfxra1qd2v1btrrz4s2w\ntags: [development, api, rest]\naliases: [rest-api-guidelines]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\"]\n---\n\n# REST APIの掟\n\n## 概要\n\nこのドキュメントは、掟プロジェクトにおけるREST APIの設計と実装に関するガイドラインを定義します。\n\n## 基本原則\n\n### URIの設計\n\n1. リソース指向。\n - 名詞を使用し、動詞は避ける。\n - 複数形を使用する。\n\n ```\n ✅ /api/v1/users。\n ❌ /api/v1/getUser。\n ```\n\n2. 階層構造。\n - 関連リソースは階層的に表現。\n\n ```\n /api/v1/users/{userId}/posts。\n /api/v1/users/{userId}/posts/{postId}/comments。\n ```\n\n### HTTPメソッド\n\n- GET: リソースの取得。\n- POST: リソースの作成。\n- PUT: リソースの置換。\n- PATCH: リソースの部分更新。\n- DELETE: リソースの削除。\n\n### ステータスコード\n\n- 200: 成功。\n- 201: 作成成功。\n- 204: 成功(レスポンスボディなし)\n- 400: リクエストエラー。\n- 401: 認証エラー。\n- 403: 認可エラー。\n- 404: リソースが存在しない。\n- 409: 競合。\n- 500: サーバーエラー。\n\n## レスポンス形式\n\n### 成功時\n\n```json\n{\n \"data\": {\n // リソースデータ。\n },\n \"meta\": {\n \"totalCount\": 100,\n \"page\": 1,\n \"perPage\": 20\n }\n}\n```\n\n### エラー時","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/api/types/rest-01jpcvxfxra1qd2v1btrrz4s2w.md","loc":{"lines":{"from":1,"to":73}}}}],["30",{"pageContent":"## レスポンス形式\n\n### 成功時\n\n```json\n{\n \"data\": {\n // リソースデータ。\n },\n \"meta\": {\n \"totalCount\": 100,\n \"page\": 1,\n \"perPage\": 20\n }\n}\n```\n\n### エラー時\n\n```json\n{\n \"error\": {\n \"code\": \"VALIDATION_ERROR\",\n \"message\": \"Invalid request parameters\",\n \"details\": [\n {\n \"field\": \"email\",\n \"message\": \"Invalid email format\"\n }\n ]\n }\n}\n```\n\n## バージョニング\n\n- URIベースのバージョニング。\n\n ```\n /api/v1/resources。\n /api/v2/resources。\n ```\n\n## セキュリティ\n\n1. 認証。\n - Bearer トークンの使用。\n - APIキーの適切な管理。\n\n2. 認可。\n - 適切なスコープの定義。\n - きめ細かなアクセス制御。\n\n3. レート制限。\n - 適切なレート制限の設定。\n - 429ステータスコードの使用。\n\n## ドキュメント化\n\n- OpenAPI (Swagger) の使用。\n- エンドポイントの詳細な説明。\n- リクエスト/レスポンスの例示。\n- エラーケースの説明。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/api/types/rest-01jpcvxfxra1qd2v1btrrz4s2w.md","loc":{"lines":{"from":56,"to":118}}}}],["31",{"pageContent":"---\ndescription: API開発規約\nruleId: api-01jpcvxfxqe37ka9pn3xb4m9yr\ntags:\n - 開発\n - API\nglobs:\n - '**/api/**'\n---\n\n# API開発規約\n\nこのドキュメントでは、API開発に関する規約について説明します。\n\n## 目次\n\n- [API設計・ドキュメント作成ガイドライン](api/guidelines-01jpcvxfxqe37ka9pn3xb4m9ys.md) - APIの設計原則とガイドライン","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/api-01jpcvxfxqe37ka9pn3xb4m9yr.md","loc":{"lines":{"from":1,"to":17}}}}],["32",{"pageContent":"---\ndescription: コーディング規約\nruleId: coding-standards-01jpcvxfxgyqe2jprh9hgn6xq9\ntags: [\"development\",\"coding\"]\naliases: [\"coding-standards\", \"code-style-guide\"]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\"]\n---\n\n# コーディング規約(Coding Standards)\n\n## 命名規則\n\n- クラスもしくは構造体の名前は大文字から始まるキャメルケース(PascalCase)で記述する。\n- メソッド名と変数名は小文字から始まるキャメルケース(camelCase)で記述する。\n- 定数は言語の標準的な規約に従って命名する。\n- インタフェース名は接尾辞に「able」を付けるなど、その役割が分かる命名にする。\n- ブール値を表す変数やメソッドは、is/has/can/shouldなどの接頭辞を使用する。\n- ドメイン用語は一貫して使用し、略語や曖昧な名前を避ける。\n\n## コードスタイル\n\n- インデントは2スペースで統一する。\n- 中括弧は同じ行または次の行に置くスタイルで統一する。\n- 1行の長さは120文字を超えないようにする。\n- メソッドの長さは20行(または適切な行数)を超えないよう努める。\n- 無駄な空行や空白を含めない。\n- コメントは必要に応じて追加し、コードの「なぜ」を説明する。\n\n## エラー処理\n\n- 例外は使用せず、Either/Resultパターンでエラーを表現する。\n- エラー型は明示的に定義し、エラーの種類を区別可能にする。\n- エラーメッセージは具体的で行動可能な情報を含める。\n- エラー処理を省略せず、すべてのエラーを適切に処理する。\n\n## コメントとドキュメント\n\n- パブリックAPIには適切なドキュメントコメントを追加する。\n- 複雑なロジックには説明コメントを追加する。\n- TODOコメントには課題追跡システムの参照を含める。\n- コメントは自明でないコードの意図を説明するために使用する。\n\n## コード構成","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/coding-standards-01jpcvxfxgyqe2jprh9hgn6xq9.md","loc":{"lines":{"from":1,"to":43}}}}],["33",{"pageContent":"## コメントとドキュメント\n\n- パブリックAPIには適切なドキュメントコメントを追加する。\n- 複雑なロジックには説明コメントを追加する。\n- TODOコメントには課題追跡システムの参照を含める。\n- コメントは自明でないコードの意図を説明するために使用する。\n\n## コード構成\n\n- 1ファイルに1クラスもしくは1構造体の原則を守る。\n- インポート/パッケージ文は整理して冗長なものを排除する。\n- メソッドの引数は3つ以下に抑える。\n- メソッドのネストレベルは3レベル以下に抑える。\n- 複雑な条件式は中間変数や述語メソッドに抽出する。\n\n## オブジェクト指向の原則\n\n- プリミティブ型や文字列を適切に意味のある型でラップする。\n- メソッドチェインを最小限に抑え、中間オブジェクトに意味のある名前を付ける。\n- クラスもしくは構造体は小さく保ち、単一責任の原則に従う。\n- コレクションを返す場合は実装ではなくインタフェース型を使用する。\n- 内部データを直接公開せず、適切なカプセル化を維持する。\n- CQS(コマンド・クエリ分離)の原則に従う。\n - 状態を変更するメソッド(コマンド)は値を返さない。\n - 値を返すメソッド(クエリ)は状態を変更しない。\n- デメテルの法則を厳守し、「Tell, Don't Ask」の原則に従う。\n - オブジェクトの内部状態を取得して判断するのではなく、オブジェクトに適切な振る舞いを指示する。\n\n## 推奨プラクティス\n\n- ドメインモデル(エンティティ、値オブジェクト)は原則的に不変オブジェクトで設計する。\n- ドメインサービスは純粋関数として実装し、副作用を持たないようにする。\n- 以下のコンポーネントでは適切に可変性を許容する:。\n - リポジトリ実装。\n - ユースケース/サービスクラス。\n - コントローラー。\n - 設定管理クラス。\n- 可変コレクションの防御的コピーを作成する。\n- ヌルチェックよりもオプション型を使用する。\n- 副作用のあるコードとないコードを明確に分離する。\n- テストしやすいよう、依存関係は明示的に注入する。\n- メッセージを送るように設計し、オブジェクトからデータを取り出して操作することを避ける。\n\n## 禁止プラクティス","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/coding-standards-01jpcvxfxgyqe2jprh9hgn6xq9.md","loc":{"lines":{"from":36,"to":79}}}}],["34",{"pageContent":"## 禁止プラクティス\n\n- 非表示のサイドエフェクトを含むメソッドを作らない。\n- グローバル状態や静的可変状態を使用しない。\n- メソッドのオーバーロードで意味的に異なる処理をしない。\n- マジックナンバーや文字列リテラルを直接使用しない。\n- 明示的な型変換を過度に使用しない。\n- null値の使用を最小限に抑え、適切に処理する。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/coding-standards-01jpcvxfxgyqe2jprh9hgn6xq9.md","loc":{"lines":{"from":79,"to":86}}}}],["35",{"pageContent":"---\ndescription: 掟プロジェクトにおけるドキュメンテーションコメントの作成規約と原則\nruleId: doc-comment-01jpcvxfxgyqe2jprh9hgn6xq8\ntags: [development, coding, documentation]\naliases: [doc-comment-rules]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\"]\n---\n\n# ドキュメントコメントの掟\n\n## 基本原則\n\n- ドキュメントコメントは英語で記述する。\n - 記述がないものは新規に追加する。\n - 既存のものでもガイドラインに従っていないものは是正する。\n - コードを見れば分かることは書かない(Why/Why notを中心に記載)\n\n## 記述内容\n\n### 必須項目\n\n1. 機能の目的と概要。\n - 何のために存在するのか。\n - どのような問題を解決するのか。\n1. パラメータ。\n - 型情報。\n - 制約条件。\n - 有効な値の範囲。\n1. 戻り値。\n - 型情報。\n - 返却される値の意味。\n - エラーケース。\n\n### オプション項目\n\n1. 使用例。\n ```rust\n /// # Example。\n /// ```\n /// let result = add(1, 2);。\n /// assert_eq!(result, 3);。\n /// ```\n ```\n1. パフォーマンス特性。\n - 計算量。\n - メモリ使用量。\n - スレッドセーフティ。\n1. 制限事項。\n - 既知の制限。\n - 非対応のケース。\n - 将来の拡張予定。\n\n## 形式\n\n### 関数のドキュメント","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/doc-comment-01jpcvxfxgyqe2jprh9hgn6xq8.md","loc":{"lines":{"from":1,"to":55}}}}],["36",{"pageContent":"## 形式\n\n### 関数のドキュメント\n\n```rust\n/// Adds two numbers and returns their sum.\n///\n/// # Arguments。\n/// * `a` - The first number。\n/// * `b` - The second number。\n///\n/// # Returns。\n/// The sum of `a` and `b`。\n///\n/// # Example。\n/// ```\n/// let sum = add(1, 2);。\n/// assert_eq!(sum, 3);。\n/// ```\npub fn add(a: i32, b: i32) -> i32 {\n a + b。\n}\n```\n\n### 構造体のドキュメント\n\n```rust\n/// Represents a user in the system.\n///\n/// # Fields。\n/// * `id` - Unique identifier。\n/// * `name` - User's display name。\n/// * `email` - User's email address。\n///\n/// # Thread Safety。\n/// This struct is Send and Sync。\n#[derive(Debug, Clone)]\npub struct User {。\n pub id: String,\n pub name: String,\n pub email: String,\n}\n```\n\n## レビュー基準\n\n1. 完全性。\n - 必須項目が漏れなく記載されているか。\n - 説明が十分に詳細か。\n\n2. 正確性。\n - コードの実装と一致しているか。\n - 誤解を招く表現がないか。\n\n3. 可読性。\n - 文法的に正しいか。\n - 簡潔で分かりやすいか。\n\n4. 一貫性。\n - プロジェクト全体で統一された形式か。\n - 用語の使用が一貫しているか。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/doc-comment-01jpcvxfxgyqe2jprh9hgn6xq8.md","loc":{"lines":{"from":53,"to":113}}}}],["37",{"pageContent":"---\ndescription: 掟プロジェクトにおけるGolangコードのドキュメント作成規約とベストプラクティス\nruleId: golangdoc-01jpcvxfxqe37ka9pn3xb4m9yr\ntags:\n - development\n - golang\n - documentation\naliases:\n - golang-doc\nglobs:\n - '**/*.go'\n---\n\n# Golangdocの掟\n\n## 基本原則\n\n- [ドキュメントコメントの掟](../doc-comment-01jpcvxfxgyqe2jprh9hgn6xq8.md)に準拠すること\n - ドキュメントコメントは英語で記述する。\n - 記述がないものは新規に追加する。\n - 既存のものでもガイドラインに従っていないものは是正する。\n - コードを見れば分かることは書かない(Why/Why notを中心に記載)\n\n## ドキュメント規約\n\nGo言語の公式ドキュメントに基づき、以下の規約に従うこと:。\n\n- パッケージコメントは`package`句の直前に記述する。\n- エクスポートされた識別子には必ずドキュメントを付ける。\n- 最初の文は識別子名で始まる完全な文とする。\n- ドキュメントはソースコードの解説ではなく、使用方法の説明とする。\n- テストはドキュメントとしても機能する。\n\n参考:[Go Doc Comments](https://go.dev/doc/comment)\n\n## ドキュメントスタイル\n\n### パッケージドキュメント\n\n```go\n// Package foo provides utilities for handling bar operations.\n//\n// The package implements various bar algorithms and data structures。\n// optimized for specific use cases.\npackage foo。\n```\n\n- パッケージの目的と主な機能を説明する。\n- 必要に応じて使用例を含める。\n- 他のパッケージとの関連性を説明する。\n\n### 型ドキュメント","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang/golangdoc-01jpcvxfxqe37ka9pn3xb4m9yr.md","loc":{"lines":{"from":1,"to":52}}}}],["38",{"pageContent":"- パッケージの目的と主な機能を説明する。\n- 必要に応じて使用例を含める。\n- 他のパッケージとの関連性を説明する。\n\n### 型ドキュメント\n\n```go\n// User represents an authenticated user in the system.\n// It contains both profile information and authentication details.\ntype User struct {。\n ID string。\n Username string。\n CreatedAt time.Time。\n}\n```\n\n- 型の目的と責務を明確に説明する。\n- フィールドの意味や制約を必要に応じて説明する。\n- インタフェースの場合は期待される振る舞いを説明する。\n\n### 関数・メソッドドキュメント\n\n```go\n// NewUser creates a new User instance with the given username.\n// It returns an error if the username is invalid or already exists.\n//\n// The username must be:\n// - Between 3 and 20 characters long。\n// - Contain only alphanumeric characters and underscores。\n// - Start with a letter。\nfunc NewUser(username string) (*User, error)。\n```\n\n- 関数の目的を簡潔に説明する。\n- 引数の要件と制約を列挙する。\n- エラーが返される条件を明記する。\n- 副作用がある場合は明示する。\n\n### 定数・変数ドキュメント","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang/golangdoc-01jpcvxfxqe37ka9pn3xb4m9yr.md","loc":{"lines":{"from":48,"to":86}}}}],["39",{"pageContent":"- 関数の目的を簡潔に説明する。\n- 引数の要件と制約を列挙する。\n- エラーが返される条件を明記する。\n- 副作用がある場合は明示する。\n\n### 定数・変数ドキュメント\n\n```go\n// MaxRetries is the maximum number of times an operation will be retried.\n// This value can be overridden through environment variable MAX_RETRIES.\nconst MaxRetries = 3。\n\n// DefaultTimeout is the default timeout duration for network operations.\nvar DefaultTimeout = 30 * time.Second。\n```\n\n- 定数・変数の目的と使用コンテキストを説明する。\n- 設定可能な値の場合、その方法を説明する。\n- デフォルト値の根拠を必要に応じて説明する。\n\n## Examples の書き方\n\n### 基本的な Example\n\n```go\nfunc ExampleUser_FullName() {。\n user := &User{\n FirstName: \"John\",\n LastName: \"Doe\",\n }\n fmt.Println(user.FullName())。\n // Output: John Doe\n}\n```\n\n### パッケージレベルの Example\n\n```go\nfunc Example() {。\n client := NewClient()\n users, err := client.ListUsers()\n if err != nil {。\n log.Fatal(err)。\n }\n for _, user := range users {\n fmt.Println(user.FullName())。\n }\n}\n```\n\n### 複数の Example","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang/golangdoc-01jpcvxfxqe37ka9pn3xb4m9yr.md","loc":{"lines":{"from":81,"to":131}}}}],["40",{"pageContent":"### 複数の Example\n\n```go\nfunc ExampleUser_FullName_withMiddleName() {。\n user := &User{\n FirstName: \"John\",\n MiddleName: \"William\",\n LastName: \"Doe\",\n }\n fmt.Println(user.FullName())。\n // Output: John William Doe\n}\n```\n\n## godoc 特殊な記法\n\n### セクション区切り\n\n```go\n// User represents a system user.\n//\n// Authorization。\n//\n// Users must be authorized through OAuth2 before accessing protected resources.\n//\n// Rate Limiting。\n//\n// API calls are limited to 1000 requests per hour per user.\ntype User struct {}。\n```\n\n### リンクの記述\n\n```go\n// For more details, see https://example.com/api-docs\n// See also: User.Authorize and User.Logout methods\n```\n\n## レビュー時の注意点\n\n- ドキュメントが最新の実装を反映しているか。\n- 全ての公開要素にドキュメントが付いているか。\n- 説明が明確で具体的か。\n- Exampleが実際に動作するか。\n- 英語の文法や表現が適切か。\n\n## 関連情報\n\n- [Effective Go - Documentation](https://go.dev/doc/effective_go#commentary)\n- [Go Doc Comments](https://go.dev/doc/comment)\n- [Example tests in Go](https://pkg.go.dev/testing#hdr-Examples)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang/golangdoc-01jpcvxfxqe37ka9pn3xb4m9yr.md","loc":{"lines":{"from":131,"to":181}}}}],["41",{"pageContent":"---\ndescription: 掟プロジェクトにおけるGolangプロジェクトのMakefileの活用方法と設定例\nruleId: golangmake-01jpcvxfxqe37ka9pn3xb4m9yq\ntags: [development, golang, make, build]\naliases: [golang-make]\nglobs: [\"**/*.go\"]\n---\n\n# Golang プロジェクトにおける Makefile の活用\n\n## Makefile の役割\n\nGolang プロジェクトにおいて Makefile は以下の理由からベストプラクティスとして広く採用されています:。\n\n- **コマンドの標準化**: 複雑なビルドコマンドを簡潔な `make` コマンドに集約。\n- **再現性の確保**: 開発環境に依存しない一貫したビルドプロセスを実現。\n- **自動化**: テスト、ビルド、デプロイなどの作業を自動化。\n- **依存関係の管理**: ビルドステップ間の依存関係を明示的に定義。\n- **ドキュメント化**: プロジェクトで使用可能なコマンドを自己文書化。\n\n## 基本的な Makefile の構造\n\n```makefile\n# 変数定義\nBINARY_NAME=myapp。\nGO=go。\nGOTEST=$(GO) test。\nGOVET=$(GO) vet。\nBINARY_UNIX=$(BINARY_NAME)_unix。\n\n# デフォルトターゲット\nall: test build。\n\n# ビルドターゲット\nbuild:。\n $(GO) build -o $(BINARY_NAME) -v ./...\n\n# テストターゲット\ntest:。\n $(GOTEST) -v ./...\n\n# 静的解析\nvet:。\n $(GOVET) ./...\n\n# クリーンアップ\nclean:。\n $(GO) clean。\n rm -f $(BINARY_NAME)。\n rm -f $(BINARY_UNIX)。\n\n# 依存関係のインストール\ndeps:。\n $(GO) mod download。\n\n# PHONYターゲットの宣言(ファイル名と競合しないため)\n.PHONY: all build test vet clean deps。\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang/golangmake-01jpcvxfxqe37ka9pn3xb4m9yq.md","loc":{"lines":{"from":1,"to":58}}}}],["42",{"pageContent":"# クリーンアップ\nclean:。\n $(GO) clean。\n rm -f $(BINARY_NAME)。\n rm -f $(BINARY_UNIX)。\n\n# 依存関係のインストール\ndeps:。\n $(GO) mod download。\n\n# PHONYターゲットの宣言(ファイル名と競合しないため)\n.PHONY: all build test vet clean deps。\n```\n\n## 高度な Makefile の例\n\n```makefile\n# 変数定義\nBINARY_NAME=myapp。\nVERSION=1.0.0。\nBUILD_DIR=build。\nGO=go。\nGOTEST=$(GO) test。\nGOVET=$(GO) vet。\nGOFMT=$(GO) fmt。\nGOLINT=golangci-lint。\n\n# デフォルトターゲット\n.DEFAULT_GOAL := help。\n\n# ヘルプメッセージ\nhelp:。\n @echo \"利用可能なコマンド:\"\n @echo \" make build - アプリケーションをビルド\"。\n @echo \" make test - テストする\"。\n @echo \" make lint - リンターする\"。\n @echo \" make fmt - コードをフォーマット\"。\n @echo \" make clean - ビルド成果物を削除\"。\n @echo \" make docker - Dockerイメージをビルド\"。\n @echo \" make run - アプリケーションする\"。\n\n# ビルドディレクトリの作成\n$(BUILD_DIR):。\n mkdir -p $(BUILD_DIR)。\n\n# ビルドターゲット\nbuild: $(BUILD_DIR)。\n CGO_ENABLED=0 $(GO) build -ldflags=\"-s -w -X main.Version=$(VERSION)\" -o $(BUILD_DIR)/$(BINARY_NAME) ./cmd/$(BINARY_NAME)。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang/golangmake-01jpcvxfxqe37ka9pn3xb4m9yq.md","loc":{"lines":{"from":46,"to":93}}}}],["43",{"pageContent":"# ビルドターゲット\nbuild: $(BUILD_DIR)。\n CGO_ENABLED=0 $(GO) build -ldflags=\"-s -w -X main.Version=$(VERSION)\" -o $(BUILD_DIR)/$(BINARY_NAME) ./cmd/$(BINARY_NAME)。\n\n# テストターゲット\ntest:。\n $(GOTEST) -race -cover ./...\n\n# コードフォーマット\nfmt:。\n $(GOFMT) ./...\n\n# 静的解析\nlint:。\n $(GOLINT) run。\n\n# クリーンアップ\nclean:。\n rm -rf $(BUILD_DIR)。\n\n# Dockerイメージのビルド\ndocker:。\n docker build -t $(BINARY_NAME):$(VERSION) .\n\n# アプリケーションの実行\nrun: build。\n ./$(BUILD_DIR)/$(BINARY_NAME)。\n\n# PHONYターゲットの宣言\n.PHONY: help build test fmt lint clean docker run。\n```\n\n## Makefile のベストプラクティス\n\n1. **`.PHONY` ターゲットを使用する**: ファイル名と同じ名前のターゲットがある場合に混乱を避けるため\n2. **変数を活用する**: 繰り返し使用する値は変数として定義\n3. **ヘルプターゲットを提供する**: 利用可能なコマンドを説明するヘルプメッセージ\n4. **依存関係を明示する**: ターゲット間の依存関係を明確に\n5. **自己文書化する**: コメントを適切に使用して各ターゲットの目的を説明\n6. **環境変数を考慮する**: 異なる環境での実行を考慮した設計\n7. **エラーハンドリング**: コマンドが失敗した場合の適切な処理\n\n## 一般的なターゲット","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang/golangmake-01jpcvxfxqe37ka9pn3xb4m9yq.md","loc":{"lines":{"from":91,"to":133}}}}],["44",{"pageContent":"## 一般的なターゲット\n\n| ターゲット | 説明 |。\n|------------|------|。\n| `build` | アプリケーションのビルド |。\n| `test` | テストの実行 |。\n| `lint` | 静的解析の実行 |。\n| `fmt` | コードフォーマット |。\n| `clean` | ビルド成果物の削除 |。\n| `deps` | 依存関係のインストール |。\n| `run` | アプリケーションの実行 |。\n| `docker` | Dockerイメージのビルド |。\n| `release` | リリースビルドの作成 |。\n\n## CI/CD との統合\n\nMakefileは継続的インテグレーション/継続的デプロイメント(CI/CD)パイプラインとの統合に最適です:。\n\n```yaml\n# .github/workflows/go.yml の例\nname: Go。\n\non:\n push:\n branches: [ main ]\n pull_request:\n branches: [ main ]\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v2。\n - name: Set up Go。\n uses: actions/setup-go@v2\n with:\n go-version: 1.17\n - name: Install dependencies。\n run: make deps\n - name: Lint。\n run: make lint\n - name: Test。\n run: make test\n - name: Build。\n run: make build\n```\n\n## まとめ","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang/golangmake-01jpcvxfxqe37ka9pn3xb4m9yq.md","loc":{"lines":{"from":133,"to":180}}}}],["45",{"pageContent":"## まとめ\n\nGolang プロジェクトにおいて Makefile の使用はベストプラクティスの1つです。標準的なビルドプロセスを確立し、開発者間での一貫性を保ち、CI/CD パイプラインとの統合を容易にします。プロジェクトの規模や複雑さに応じて、シンプルな Makefile から始めて、必要に応じて機能を追加していくことをお勧めします。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang/golangmake-01jpcvxfxqe37ka9pn3xb4m9yq.md","loc":{"lines":{"from":180,"to":182}}}}],["46",{"pageContent":"---\ndescription: 掟プロジェクトにおけるGolang開発に関する参考文献とリソースのリスト\nruleId: golangrefs-01jpcvxfxpsvpepv85myk6s6bj\ntags: [development, golang, references]\naliases: [golang-refs]\nglobs: [\"**/*.go\"]\n---\n\n# Golang参考文献\n\n## 公式ドキュメント\n\n- [Go言語仕様](https://golang.org/ref/spec)\n- [Effective Go](https://golang.org/doc/effective_go)\n- [Go標準ライブラリドキュメント](https://golang.org/pkg/)\n\n## スタイルガイド\n\n- [Go Code Review Comments](https://github.com/golang/go/wiki/CodeReviewComments)\n- [Uber Go Style Guide](https://github.com/uber-go/guide/blob/master/style.md)\n\n## 書籍\n\n- \"The Go Programming Language\" by Alan A. A. Donovan and Brian W. Kernighan。\n- \"Go in Action\" by William Kennedy。\n- \"Concurrency in Go\" by Katherine Cox-Buday。\n\n## オンラインリソース\n\n- [Go by Example](https://gobyexample.com/)\n- [Go Tour](https://tour.golang.org/)\n- [Go Playground](https://play.golang.org/)\n- [Gophercises](https://gophercises.com/)\n\n## ブログとニュースレター","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang/golangrefs-01jpcvxfxpsvpepv85myk6s6bj.md","loc":{"lines":{"from":1,"to":35}}}}],["47",{"pageContent":"## オンラインリソース\n\n- [Go by Example](https://gobyexample.com/)\n- [Go Tour](https://tour.golang.org/)\n- [Go Playground](https://play.golang.org/)\n- [Gophercises](https://gophercises.com/)\n\n## ブログとニュースレター\n\n- [Go Blog](https://blog.golang.org/)\n- [Golang Weekly](https://golangweekly.com/)\n- [Go Time Podcast](https://changelog.com/gotime)\n\n## コミュニティ\n\n- [Go Forum](https://forum.golangbridge.org/)\n- [r/golang](https://www.reddit.com/r/golang/)\n- [Gophers Slack](https://gophers.slack.com/)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang/golangrefs-01jpcvxfxpsvpepv85myk6s6bj.md","loc":{"lines":{"from":28,"to":45}}}}],["48",{"pageContent":"---\ndescription: 掟プロジェクトにおけるGolangコードのレビュー基準とベストプラクティス\nruleId: golangreview-01jpcvxfxpsvpepv85myk6s6bh\ntags: [development, golang, review]\naliases: [golang-review]\nglobs: [\"**/*.go\"]\n---\n\n# Golangコードレビュー\n\n## レビュー時の注意点\n\n- 不要なインタフェースの定義がないか。\n- エラー処理が適切に行われているか。\n- メモリ効率が考慮されているか。\n- 並行処理が適切に実装されているか。\n- パッケージ依存関係が適切か。\n\n## コードレビューのチェックリスト\n\n### 設計\n\n- [ ] 単一責任の原則に従っているか。\n- [ ] インタフェースは必要最小限か。\n- [ ] パッケージ構成は適切か。\n- [ ] 依存関係は明確か。\n\n### 実装\n\n- [ ] エラー処理は適切か。\n- [ ] ゴルーチンのリークはないか。\n- [ ] リソースは適切に解放されているか。\n- [ ] 命名規則は一貫しているか。\n- [ ] コメントは適切か。\n\n### パフォーマンス\n\n- [ ] 不要なメモリ割り当てはないか。\n- [ ] アルゴリズムの選択は適切か。\n- [ ] キャッシュは効果的に使用されているか。\n- [ ] I/O処理は効率的か。\n\n### テスト\n\n- [ ] ユニットテストは十分か。\n- [ ] エッジケースはテストされているか。\n- [ ] テストのカバレッジは適切か。\n- [ ] テストは読みやすく保守しやすいか。\n\n## コードレビューのベストプラクティス\n\n- 小さな変更を頻繁にレビューする。\n- 具体的かつ建設的なフィードバックを提供する。\n- コードの良い点も指摘する。\n- 個人ではなくコードに焦点を当てる。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang/golangreview-01jpcvxfxpsvpepv85myk6s6bh.md","loc":{"lines":{"from":1,"to":55}}}}],["49",{"pageContent":"---\ndescription: 掟プロジェクトにおけるGolangコードのスタイルガイドと規約\nruleId: golangstyle-01jpcvxfxpsvpepv85myk6s6bg\ntags: [development, golang, style]\naliases: [golang-style]\nglobs: [\"**/*.go\"]\n---\n\n# Golangコーディングスタイル\n\n## パッケージ構成\n\n- パッケージ名は小文字で、単一の単語を使用する。\n- `internal`パッケージを適切に活用し、公開APIを最小限に抑える。\n- サブパッケージは適切な粒度で分割する。\n\n## 命名規則\n\n- インタフェース名は、単一メソッドの場合は「メソッド名 + er」(例:`Reader`, `Writer`)\n- 略語は一貫して大文字または小文字で扱う(例:`ID`, `Http`は避けて`HTTP`を使用)\n- エクスポートする識別子は必ずドキュメントコメントを付ける。\n\n## エラー処理\n\n- エラーは常に即座に処理する。\n- エラーメッセージは小文字で始め、句点を付けない。\n- カスタムエラーは`errors.New`または`fmt.Errorf`を使用する。\n- 意味のあるエラーラッピングする(`%w`を適切に使用)\n\n## 並行処理\n\n- ゴルーチンのリークを防ぐため、適切なキャンセル処理を実装する。\n- チャネルの所有権を明確にする。\n- 共有メモリへのアクセスは`sync`パッケージを使用して適切に保護する。\n\n## テスト\n\n- テーブル駆動テストを活用する。\n- サブテストを使用して関連するテストをグループ化する。\n- ヘルパー関数には`t.Helper()`を付ける。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang/golangstyle-01jpcvxfxpsvpepv85myk6s6bg.md","loc":{"lines":{"from":1,"to":40}}}}],["50",{"pageContent":"---\ndescription: 掟プロジェクトにおけるGolang開発で使用する必須およびオプショナルツールの説明と設定方法\nruleId: golangtools-01jpcvxfxpsvpepv85myk6s6bf\ntags: [development, golang, tools]\naliases: [golang-tools]\nglobs: [\"**/*.go\"]\n---\n\n# Golangツール活用\n\n## 必須ツール\n\n- `go fmt` - コードフォーマッティング。\n- `go vet` - 静的解析。\n- `golangci-lint` - 高度な静的解析。\n- `goimports` - インポートの整理とフォーマット。\n\n## オプショナルツール\n\n- `gopls` - 言語サーバー。\n- `gotests` - テストコード生成。\n- `gofumpt` - より厳密なフォーマッティング。\n\n## ツールの設定と使用方法\n\n### golangci-lint\n\n```bash\n# インストール\ngo install github.com/golangci/golangci-lint/cmd/golangci-lint@latest。\n\n# 実行\ngolangci-lint run。\n```\n\n推奨設定:。\n\n```yaml\n# .golangci.yml\nlinters:。\n enable:\n - gofmt。\n - goimports。\n - govet。\n - staticcheck。\n - errcheck。\n - ineffassign。\n```\n\n### goimports\n\n```bash\n# インストール\ngo install golang.org/x/tools/cmd/goimports@latest。\n\n# 実行\ngoimports -w .。\n```\n\n### gopls\n\nVSCodeやGoLandなどのIDEと連携して使用することで、コード補完や定義ジャンプなどの機能が強化されます。\n\n```bash\n# インストール\ngo install golang.org/x/tools/gopls@latest。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang/golangtools-01jpcvxfxpsvpepv85myk6s6bf.md","loc":{"lines":{"from":1,"to":66}}}}],["51",{"pageContent":"---\ndescription: Golangのコーディング規約と開発ガイドライン\nruleId: golang-01jpcvxfxgyqe2jprh9hgn6xq7\ntags:\n - golang\n - coding\n - guidelines\naliases:\n - golang-rules\n - go-guidelines\nglobs:\n - '**/*.ts'\n - '**/*.tsx'\n - '**/*.js'\n - '**/*.jsx'\n - '**/*.go'\n - '**/*.rs'\n - '**/*.scala'\n---\n\n# Golangの掟\n\n## 基本原則\n\n- [Effective Go](https://golang.org/doc/effective_go)に従う\n- Go標準のフォーマッター(`go fmt`)を必ず使用する。\n- `golangci-lint`を使用してコード品質を維持する。\n\n## モジュール構成\n\nGolangのコーディング規約は以下のモジュールに分かれています:。\n\n- [Golangdocの掟](golang/golangdoc-01jpcvxfxqe37ka9pn3xb4m9yr.md) - コードドキュメントの書き方\n- [Golangコーディングスタイル](golang/golangstyle-01jpcvxfxpsvpepv85myk6s6bg.md) - 命名規則、パッケージ構成、エラー処理など\n- [Golangツール活用](golang/golangtools-01jpcvxfxpsvpepv85myk6s6bf.md) - 開発ツールの使用方法\n- [Golang プロジェクトにおける Makefile の活用](golang/golangmake-01jpcvxfxqe37ka9pn3xb4m9yq.md) - ビルドプロセスの自動化と標準化\n- [Golangコードレビュー](golang/golangreview-01jpcvxfxpsvpepv85myk6s6bh.md) - レビュー時のチェックポイント\n- [Golang参考文献](golang/golangrefs-01jpcvxfxpsvpepv85myk6s6bj.md) - 学習リソースと参考資料","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang-01jpcvxfxgyqe2jprh9hgn6xq7.md","loc":{"lines":{"from":1,"to":38}}}}],["52",{"pageContent":"## クイックリファレンス\n\n### 重要な原則\n\n- パッケージ名は小文字で、単一の単語を使用する。\n- エラーは常に即座に処理する。\n- ゴルーチンのリークを防ぐため、適切なキャンセル処理を実装する。\n- テーブル駆動テストを活用する。\n\n### 必須ツール\n\n- `go fmt` - コードフォーマッティング。\n- `go vet` - 静的解析。\n- `golangci-lint` - 高度な静的解析。\n- `goimports` - インポートの整理とフォーマット。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/golang-01jpcvxfxgyqe2jprh9hgn6xq7.md","loc":{"lines":{"from":40,"to":54}}}}],["53",{"pageContent":"---\ndescription: rustdocに関するドキュメント\nruleId: rustdoc-01jpcvxfxpsvpepv85myk6s6be\ntags:\n - development\n - coding\n - rust\naliases:\n - rust-documentation\n - rustdoc-guidelines\nglobs:\n - '**/*.rs'\n---\n\n# Rustdocの掟\n\n## 基本原則\n\n- [ドキュメントコメントの掟](../doc-comment-01jpcvxfxgyqe2jprh9hgn6xq8.md)に準拠すること\n - ドキュメントコメントは英語で記述する。\n - 記述がないものは新規に追加する。\n - 既存のものでもガイドラインに従っていないものは是正する。\n - コードを見れば分かることは書かない(Why/Why notを中心に記載)\n\n## ドキュメント規約\n\nRustの公式ドキュメントに基づき、以下の規約に従うこと:。\n\n- パブリックAPIには必ずドキュメントコメントを付ける。\n- ドキュメントテストが失敗しないようにする。\n- コードブロックは実際に動作するものを記述する。\n- パニックが発生する条件は必ず記載する。\n- 安全性に関する制約は明確に記述する。\n\n参考:[The Rust Documentation Book](https://doc.rust-lang.org/rustdoc/how-to-write-documentation.html)\n\n## ドキュメントスタイル\n\n### クレートレベルドキュメント","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustdoc-01jpcvxfxpsvpepv85myk6s6be.md","loc":{"lines":{"from":1,"to":39}}}}],["54",{"pageContent":"参考:[The Rust Documentation Book](https://doc.rust-lang.org/rustdoc/how-to-write-documentation.html)\n\n## ドキュメントスタイル\n\n### クレートレベルドキュメント\n\n```rust\n//! A library for safely handling database connections.\n//!\n//! This crate provides a connection pool implementation。\n//! with automatic resource cleanup and error handling.\n//! \n//! # Examples。\n//! \n//! ```\n//! use my_db::Pool;\n//! \n//! let pool = Pool::new(5)?;\n//! let conn = pool.get()?;。\n//! ```\n\n```\n\n### 構造体とトレイト\n\n```rust\n/// A connection pool for managing database connections.\n///\n/// The pool maintains a set of active connections and。\n/// automatically creates new ones as needed, up to a。\n/// specified maximum.\n///\n/// # Examples。\n///\n/// ```\n/// let pool = Pool::new(5)?;\n/// ```\npub struct Pool {。\n max_size: usize,\n connections: Vec<Connection>,\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustdoc-01jpcvxfxpsvpepv85myk6s6be.md","loc":{"lines":{"from":35,"to":75}}}}],["55",{"pageContent":"/// Represents operations that can be performed on a database.\n///\n/// Implementors must ensure that all operations are atomic。\n/// and maintain ACID properties.\npub trait Database {。\n /// The type of error that can occur during database operations.\n type Error;。\n\n /// Executes a query and returns the results.\n ///\n /// # Arguments。\n ///\n /// * `query` - The SQL query to execute。\n /// * `params` - Query parameters to bind。\n ///\n /// # Examples。\n ///\n /// ```\n /// let results = db.query(\"SELECT * FROM users WHERE id = ?\", &[1])?;。\n /// ```\n fn query(&self, query: &str, params: &[&dyn ToSql]) -> Result<Rows, Self::Error>;\n}\n```\n\n### エラー型","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustdoc-01jpcvxfxpsvpepv85myk6s6be.md","loc":{"lines":{"from":77,"to":101}}}}],["56",{"pageContent":"### エラー型\n\n```rust\n/// Errors that can occur during database operations.\n///\n/// # Examples。\n///\n/// ```\n/// match result {。\n/// Err(DbError::ConnectionFailed(e)) => log::error!(\"Connection failed: {}\", e),\n/// Err(DbError::QueryFailed(e)) => log::error!(\"Query failed: {}\", e),\n/// Ok(data) => process_data(data),。\n/// }。\n/// ```\n#[derive(Debug, thiserror::Error)]\npub enum DbError {。\n /// Failed to establish database connection.\n #[error(\"failed to connect to database: {0}\")]\n ConnectionFailed(#[from] std::io::Error),\n\n /// Query execution failed.\n #[error(\"query failed: {0}\")]\n QueryFailed(String),。\n}\n```\n\n## 特殊な記法\n\n### リンクとリファレンス\n\n```rust\n/// See [`Pool::new`] for creating a new connection pool.\n/// \n/// For more details about connection management,。\n/// see [the connection module](crate::connection).\n///\n/// The implementation follows the [PostgreSQL protocol].\n///\n/// [PostgreSQL protocol]: https://www.postgresql.org/docs/current/protocol.html\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustdoc-01jpcvxfxpsvpepv85myk6s6be.md","loc":{"lines":{"from":101,"to":140}}}}],["57",{"pageContent":"### インラインコード\n\n```rust\n/// The default timeout is [`DEFAULT_TIMEOUT`].\n///\n/// Use `Pool::with_timeout()` to customize the timeout duration.\n/// \n/// This function returns [`Result<Pool, DbError>`](Result).\n```\n\n### 箇条書きとコードブロック\n\n```rust\n/// Creates a new database connection.\n///\n/// # Arguments。\n///\n/// * `host` - Database host address。\n/// * `port` - Database port number。\n/// * `credentials` - Authentication credentials。\n///\n/// # Security。\n///\n/// The following security measures are implemented:\n///\n/// - TLS encryption for all connections。\n/// - Automatic credential rotation。\n/// - Connection timeouts。\n///\n/// # Examples。\n///\n/// Basic usage:\n/// ```\n/// let conn = Connection::new(\"localhost\", 5432, credentials)?;\n/// ```\n///\n/// With custom timeout:\n/// ```\n/// let conn = Connection::with_timeout(\"localhost\", 5432, credentials, Duration::from_secs(30))?;\n/// ```\n```\n\n## テストとドキュメントの統合\n\n### ドキュメントテスト","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustdoc-01jpcvxfxpsvpepv85myk6s6be.md","loc":{"lines":{"from":142,"to":186}}}}],["58",{"pageContent":"## テストとドキュメントの統合\n\n### ドキュメントテスト\n\n```rust\n/// Adds two numbers together.\n///\n/// # Examples。\n///\n/// ```\n/// use my_crate::add;\n///\n/// assert_eq!(add(2, 2), 4);。\n/// ```\n///\n/// # Panics。\n///\n/// ```should_panic\n/// # use my_crate::add;\n/// // This will panic due to integer overflow。\n/// add(i32::MAX, 1);\n/// ```\npub fn add(a: i32, b: i32) -> i32 {\n a.checked_add(b).expect(\"integer overflow\")。\n}\n```\n\n### 非表示テスト\n\n```rust\n/// Complex number implementation.\n///\n/// # Examples。\n///\n/// ```\n/// # fn main() -> Result<(), Box<dyn std::error::Error>> {\n/// let c = Complex::new(1.0, 2.0);\n/// # Ok(())。\n/// # }。\n/// ```\n```\n\n## レビュー時の注意点\n\n- ドキュメントが最新の実装を反映しているか。\n- 全てのパブリック要素にドキュメントが付いているか。\n- 説明が明確で具体的か。\n- Examples が実際に動作するか。\n- 英語の文法や表現が適切か。\n- 安全性に関する注意点が明確に記載されているか。\n\n## 関連情報","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustdoc-01jpcvxfxpsvpepv85myk6s6be.md","loc":{"lines":{"from":184,"to":235}}}}],["59",{"pageContent":"## レビュー時の注意点\n\n- ドキュメントが最新の実装を反映しているか。\n- 全てのパブリック要素にドキュメントが付いているか。\n- 説明が明確で具体的か。\n- Examples が実際に動作するか。\n- 英語の文法や表現が適切か。\n- 安全性に関する注意点が明確に記載されているか。\n\n## 関連情報\n\n- [The Rust Documentation Book](https://doc.rust-lang.org/rustdoc/what-is-rustdoc.html)\n- [How to Write Documentation](https://doc.rust-lang.org/rustdoc/how-to-write-documentation.html)\n- [Documentation Tests](https://doc.rust-lang.org/rustdoc/documentation-tests.html)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustdoc-01jpcvxfxpsvpepv85myk6s6be.md","loc":{"lines":{"from":226,"to":239}}}}],["60",{"pageContent":"---\ndescription: rustrefsに関するドキュメント\nruleId: rustrefs-01jpcvxfxnn1eg2jxgy2jns9w7\ntags:\n - development\n - coding\n - rust\naliases:\n - rust-references\n - rust-resources\nglobs:\n - '**/*.rs'\n---\n\n# Rust参考文献\n\n## 公式ドキュメント\n\n### 基本ドキュメント\n\n- [The Rust Programming Language](https://doc.rust-jp.rs/book-ja/) - Rustの基本的な概念と機能を学ぶための公式ガイド(日本語版)\n- [Rust by Example](https://doc.rust-jp.rs/rust-by-example-ja/) - 実例を通じてRustを学ぶ(日本語版)\n- [Rustonomicon](https://doc.rust-lang.org/nomicon/) - unsafe Rustのダークアート\n- [Rust Reference](https://doc.rust-lang.org/reference/) - Rust言語の詳細な参照資料\n\n### 特定のトピック","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustrefs-01jpcvxfxnn1eg2jxgy2jns9w7.md","loc":{"lines":{"from":1,"to":26}}}}],["61",{"pageContent":"### 特定のトピック\n\n- [Asynchronous Programming in Rust](https://rust-lang.github.io/async-book/) - 非同期プログラミングの詳細ガイド\n- [The Cargo Book](https://doc.rust-lang.org/cargo/) - Cargoの使用方法\n- [Rust API Guidelines](https://rust-lang.github.io/api-guidelines/) - Rustライブラリ設計のベストプラクティス\n- [The Embedded Rust Book](https://docs.rust-embedded.org/book/) - 組み込み開発のためのRust\n- [The Rust FFI Guide](https://michael-f-bryan.github.io/rust-ffi-guide/) - 他言語とのインタフェース\n\n## 学習リソース\n\n### 初心者向け\n\n- [Rust入門](https://zenn.dev/mebiusbox/books/22d4c1ed9b0003) - 日本語でのRust入門\n- [Tour of Rust](https://tourofrust.com/00_ja.html) - インタラクティブなRust学習(日本語対応)\n- [Rustlings](https://github.com/rust-lang/rustlings) - 小さな演習を通じてRustを学ぶ\n- [Exercism Rust Track](https://exercism.org/tracks/rust) - 実践的な問題を解きながらRustを学ぶ\n\n### 中級者向け","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustrefs-01jpcvxfxnn1eg2jxgy2jns9w7.md","loc":{"lines":{"from":26,"to":43}}}}],["62",{"pageContent":"### 中級者向け\n\n- [Rust Design Patterns](https://rust-unofficial.github.io/patterns/) - Rustでの一般的なデザインパターン\n- [Rust Cookbook](https://rust-lang-nursery.github.io/rust-cookbook/) - 一般的なプログラミングタスクのレシピ集\n- [Command Line Applications in Rust](https://rust-cli.github.io/book/) - CLIアプリケーション開発ガイド\n- [Rust and WebAssembly](https://rustwasm.github.io/docs/book/) - WebAssembly開発のためのRust\n\n### 上級者向け\n\n- [The Little Book of Rust Macros](https://danielkeep.github.io/tlborm/book/index.html) - Rustマクロの詳細ガイド\n- [Rust Performance Book](https://nnethercote.github.io/perf-book/) - Rustプログラムのパフォーマンス最適化\n- [Rust Atomics and Locks](https://marabos.nl/atomics/) - 低レベル並行プログラミング\n- [Zero To Production In Rust](https://www.zero2prod.com/) - 本格的なWebアプリケーション開発\n\n## ブログと記事","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustrefs-01jpcvxfxnn1eg2jxgy2jns9w7.md","loc":{"lines":{"from":43,"to":57}}}}],["63",{"pageContent":"## ブログと記事\n\n- [This Week in Rust](https://this-week-in-rust.org/) - Rustエコシステムの週刊ニュース\n- [Rust Blog](https://blog.rust-lang.org/) - Rust言語の公式ブログ\n- [Inside Rust](https://blog.rust-lang.org/inside-rust/) - Rust開発チームの内部ブログ\n- [Read Rust](https://readrust.net/) - Rustに関する記事のキュレーション\n\n## 動画リソース\n\n- [Rust Japan YouTube Channel](https://www.youtube.com/channel/UCd8iY-kEHtaB8qt8MH--zGw) - 日本語のRust関連動画\n- [Jon Gjengset's YouTube Channel](https://www.youtube.com/c/JonGjengset) - 中級〜上級者向けのRust解説\n- [Ryan Levick's YouTube Channel](https://www.youtube.com/c/RyanLevicksVideos) - Rustの概念解説\n- [Rust Conf YouTube Channel](https://www.youtube.com/channel/UCaYhcUwRBNscFNUKTjgPFiA) - RustConfのトーク集\n\n## コミュニティ\n\n### 日本語コミュニティ\n\n- [Rust Japan](https://rust-jp.rs/) - 日本のRustコミュニティ\n- [Rust Tokyo](https://rust.tokyo/) - 東京のRustカンファレンス\n- [Rust日本語フォーラム](https://rust-jp.rs/forums/) - 日本語でのRust質問掲示板\n\n### 国際コミュニティ","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustrefs-01jpcvxfxnn1eg2jxgy2jns9w7.md","loc":{"lines":{"from":57,"to":79}}}}],["64",{"pageContent":"### 日本語コミュニティ\n\n- [Rust Japan](https://rust-jp.rs/) - 日本のRustコミュニティ\n- [Rust Tokyo](https://rust.tokyo/) - 東京のRustカンファレンス\n- [Rust日本語フォーラム](https://rust-jp.rs/forums/) - 日本語でのRust質問掲示板\n\n### 国際コミュニティ\n\n- [Rust Users Forum](https://users.rust-lang.org/) - Rustユーザーフォーラム\n- [Rust Internals Forum](https://internals.rust-lang.org/) - Rust言語開発に関するフォーラム\n- [Rust Discord](https://discord.gg/rust-lang) - Rustの公式Discordサーバー\n- [Rust Subreddit](https://www.reddit.com/r/rust/) - Rustのサブレディット\n\n## ツールとライブラリ\n\n### 主要ライブラリ\n\n- [serde](https://serde.rs/) - シリアライゼーション/デシリアライゼーションフレームワーク\n- [tokio](https://tokio.rs/) - 非同期ランタイム\n- [actix-web](https://actix.rs/) - Webフレームワーク\n- [rocket](https://rocket.rs/) - Webフレームワーク\n- [diesel](https://diesel.rs/) - O/Rマッパとクエリビルダー\n- [clap](https://clap.rs/) - コマンドライン引数パーサー\n- [rayon](https://github.com/rayon-rs/rayon) - データ並列ライブラリ\n\n### 開発ツール","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustrefs-01jpcvxfxnn1eg2jxgy2jns9w7.md","loc":{"lines":{"from":73,"to":98}}}}],["65",{"pageContent":"### 開発ツール\n\n- [rust-analyzer](https://rust-analyzer.github.io/) - Rust言語サーバー\n- [IntelliJ Rust](https://intellij-rust.github.io/) - IntelliJ IDEAのRustプラグイン\n- [Rust Extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) - VSCodeのRust拡張\n\n## 書籍\n\n### 日本語書籍\n\n- [実践Rust入門](https://www.amazon.co.jp/dp/4297105594) - 言語仕様から開発手法まで\n- [Rustプログラミング入門](https://www.amazon.co.jp/dp/4798061700) - 基礎から学ぶRust\n- [RustではじめるOpenGL](https://www.amazon.co.jp/dp/4873119235) - グラフィックスプログラミング\n\n### 英語書籍\n\n- [Programming Rust, 2nd Edition](https://www.oreilly.com/library/view/programming-rust-2nd/9781492052586/) - 包括的なRust入門書\n- [Rust in Action](https://www.manning.com/books/rust-in-action) - システムプログラミングの実践\n- [Hands-on Rust](https://pragprog.com/titles/hwrust/hands-on-rust/) - ゲーム開発を通じたRust学習\n- [Black Hat Rust](https://kerkour.com/black-hat-rust) - セキュリティツール開発のためのRust\n\n## 企業事例","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustrefs-01jpcvxfxnn1eg2jxgy2jns9w7.md","loc":{"lines":{"from":98,"to":119}}}}],["66",{"pageContent":"## 企業事例\n\n- [Rust in Production](https://www.rust-lang.org/production) - Rustを採用している企業の事例\n- [Why Discord is Switching from Go to Rust](https://discord.com/blog/why-discord-is-switching-from-go-to-rust) - Discordの事例\n- [Rust at Microsoft](https://msrc-blog.microsoft.com/2019/07/22/why-rust-for-safe-systems-programming/) - MicrosoftでのRust採用理由\n- [Rust at Amazon](https://aws.amazon.com/jp/blogs/opensource/why-aws-loves-rust-and-how-wed-like-to-help/) - AWSでのRust活用\n\n## 学習パス\n\n### 初心者向けロードマップ\n\n1. [The Rust Programming Language](https://doc.rust-jp.rs/book-ja/)を読む\n2. [Rustlings](https://github.com/rust-lang/rustlings)で演習\n3. [Rust by Example](https://doc.rust-jp.rs/rust-by-example-ja/)で実例を学ぶ\n4. 小さなプロジェクトを作成(CLIツール、簡単なゲームなど)\n\n### 中級者向けロードマップ","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustrefs-01jpcvxfxnn1eg2jxgy2jns9w7.md","loc":{"lines":{"from":119,"to":135}}}}],["67",{"pageContent":"### 中級者向けロードマップ\n\n1. [Rust Design Patterns](https://rust-unofficial.github.io/patterns/)を学ぶ\n2. [Asynchronous Programming in Rust](https://rust-lang.github.io/async-book/)で非同期プログラミングを理解\n3. [Rust API Guidelines](https://rust-lang.github.io/api-guidelines/)でAPIデザインを学ぶ\n4. 中規模のプロジェクトに取り組む(Webアプリ、ライブラリなど)\n\n### 上級者向けロードマップ\n\n1. [Rustonomicon](https://doc.rust-lang.org/nomicon/)でunsafe Rustを学ぶ\n2. [The Little Book of Rust Macros](https://danielkeep.github.io/tlborm/book/index.html)でマクロを理解\n3. [Rust Performance Book](https://nnethercote.github.io/perf-book/)でパフォーマンス最適化を学ぶ\n4. オープンソースプロジェクトに貢献する。\n\n## 関連情報\n\n- [Rustdocの掟](rustdoc-01jpcvxfxpsvpepv85myk6s6be.md)\n- [Rustコーディングスタイル](ruststyle-01jpcvxfxnn1eg2jxgy2jns9w5.md)\n- [Rustツール活用](rusttools-01jpcvxfxnn1eg2jxgy2jns9w4.md)\n- [Rustコードレビュー](rustreview-01jpcvxfxnn1eg2jxgy2jns9w6.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustrefs-01jpcvxfxnn1eg2jxgy2jns9w7.md","loc":{"lines":{"from":135,"to":154}}}}],["68",{"pageContent":"---\ndescription: rustreviewに関するドキュメント\nruleId: rustreview-01jpcvxfxnn1eg2jxgy2jns9w6\ntags:\n - development\n - coding\n - rust\naliases:\n - rust-code-review\n - rust-review-guidelines\nglobs:\n - '**/*.rs'\n---\n\n# Rustコードレビュー\n\n## 基本原則\n\n- コードの品質と保守性を向上させることを目的とする。\n- 建設的なフィードバックを心がける。\n- 問題点だけでなく、良い点も指摘する。\n- 個人ではなくコードに焦点を当てる。\n- 「なぜ」と「どのように」の両方を説明する。\n\n## レビューの流れ\n\n1. **全体像の把握**。\n - コードの目的と設計を理解する。\n - 変更の範囲と影響を確認する。\n - テストの有無と品質を確認する。\n\n2. **詳細レビュー**。\n - コードの正確性を確認する。\n - パフォーマンスとリソース使用を評価する。\n - エラー処理の適切さを確認する。\n - コードスタイルとドキュメントを確認する。\n\n3. **フィードバック提供**。\n - 明確で具体的なコメントを提供する。\n - 重要な問題と軽微な問題を区別する。\n - 可能な場合は解決策を提案する。\n\n## チェックリスト\n\n### 安全性と正確性\n\n#### メモリ安全性\n\n- [ ] `unsafe`ブロックの使用は必要最小限か。\n- [ ] `unsafe`ブロックには適切なコメントがあるか。\n- [ ] ポインタ操作は安全に行われているか。\n- [ ] メモリリークの可能性はないか。\n- [ ] 所有権とライフタイムは適切に管理されているか。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustreview-01jpcvxfxnn1eg2jxgy2jns9w6.md","loc":{"lines":{"from":1,"to":53}}}}],["69",{"pageContent":"## チェックリスト\n\n### 安全性と正確性\n\n#### メモリ安全性\n\n- [ ] `unsafe`ブロックの使用は必要最小限か。\n- [ ] `unsafe`ブロックには適切なコメントがあるか。\n- [ ] ポインタ操作は安全に行われているか。\n- [ ] メモリリークの可能性はないか。\n- [ ] 所有権とライフタイムは適切に管理されているか。\n\n```rust\n// 良い例。\n// SAFETY: この unsafe ブロックは、FFI 関数が有効なポインタを返すことを\n// 保証しているため安全です。関数の仕様については以下のドキュメントを参照:\n// https://example.com/api-docs\nunsafe {。\n let ptr = ffi_function();。\n if ptr.is_null() {。\n return Err(Error::NullPointer);\n }\n // ポインタを使用。\n}\n\n// 悪い例。\nunsafe {。\n // コメントなし、安全性の説明なし。\n let ptr = ffi_function();。\n *ptr = 42; // nullチェックなし。\n}\n```\n\n#### エラー処理\n\n- [ ] エラーは適切に伝播されているか。\n- [ ] エラーメッセージは明確で有用か。\n- [ ] パニックの可能性がある操作は適切に処理されているか。\n- [ ] `unwrap()`や`expect()`の使用は適切か。\n\n```rust\n// 良い例。\nfn process_file(path: &str) -> Result<Data, ProcessError> {\n let file = File::open(path)\n .map_err(|e| ProcessError::FileError { path: path.to_string(), source: e })?;\n \n let data = parse_file(file)?;。\n Ok(data)。\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustreview-01jpcvxfxnn1eg2jxgy2jns9w6.md","loc":{"lines":{"from":43,"to":91}}}}],["70",{"pageContent":"// 悪い例。\nfn process_file(path: &str) -> Data {\n let file = File::open(path).unwrap(); // パニックの可能性\n parse_file(file).unwrap() // パニックの可能性。\n}\n```\n\n#### 並行処理\n\n- [ ] データ競合の可能性はないか。\n- [ ] デッドロックの可能性はないか。\n- [ ] スレッドセーフティは確保されているか。\n- [ ] 非同期コードは適切に実装されているか。\n\n```rust\n// 良い例。\nlet data = Arc::new(Mutex::new(Vec::new()));\nlet data_clone = Arc::clone(&data);\n\nthread::spawn(move || {\n let mut data = data_clone.lock().unwrap();。\n data.push(42);。\n});\n\n// 悪い例。\nlet data = Rc::new(RefCell::new(Vec::new())); // Rcはスレッド間で共有できない\n\nthread::spawn(move || {\n let mut data = data.borrow_mut(); // コンパイルエラー。\n data.push(42);。\n});\n```\n\n### パフォーマンスと効率性\n\n#### リソース管理\n\n- [ ] メモリ使用量は適切か。\n- [ ] ファイルやネットワーク接続は適切にクローズされるか。\n- [ ] リソースの解放は保証されているか。\n\n```rust\n// 良い例。\n{\n let file = File::open(\"data.txt\")?;\n // fileはスコープを抜けると自動的にクローズされる。\n}\n\n// または。\nlet file = BufReader::new(File::open(\"data.txt\")?);\n// BufReaderはDropを実装しており、内部のファイルハンドルを自動的にクローズする。\n```\n\n#### アルゴリズムと最適化","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustreview-01jpcvxfxnn1eg2jxgy2jns9w6.md","loc":{"lines":{"from":93,"to":146}}}}],["71",{"pageContent":"// または。\nlet file = BufReader::new(File::open(\"data.txt\")?);\n// BufReaderはDropを実装しており、内部のファイルハンドルを自動的にクローズする。\n```\n\n#### アルゴリズムと最適化\n\n- [ ] 選択されたアルゴリズムは適切か。\n- [ ] 不必要なコピーや割り当ては避けられているか。\n- [ ] ループや再帰は効率的か。\n- [ ] 早期リターンは適切に使用されているか。\n\n```rust\n// 良い例。\nfn find_item(items: &[Item], id: &str) -> Option<&Item> {\n items.iter().find(|item| item.id == id)。\n}\n\n// 悪い例。\nfn find_item(items: &[Item], id: &str) -> Option<Item> {\n for item in items {。\n if item.id == id {。\n return Some(item.clone()); // 不必要なクローン。\n }\n }\n None。\n}\n```\n\n#### 非同期パフォーマンス\n\n- [ ] 非同期タスクは適切にスケジュールされているか。\n- [ ] ブロッキング操作は避けられているか。\n- [ ] 長時間実行されるタスクは分割されているか。\n\n```rust\n// 良い例。\nasync fn process_items(items: Vec<Item>) -> Result<Vec<Output>, Error> {\n let futures: Vec<_> = items.into_iter()\n .map(|item| async move { process_item(item).await })。\n .collect();。\n \n futures::future::join_all(futures).await\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustreview-01jpcvxfxnn1eg2jxgy2jns9w6.md","loc":{"lines":{"from":141,"to":184}}}}],["72",{"pageContent":"// 悪い例。\nasync fn process_items(items: Vec<Item>) -> Result<Vec<Output>, Error> {\n let mut results = Vec::new();\n for item in items {。\n // 逐次処理 - 並列化の機会を逃している。\n let result = process_item(item).await?;。\n results.push(result);。\n }\n Ok(results)。\n}\n```\n\n### コード品質\n\n#### 可読性\n\n- [ ] 変数名と関数名は明確で意味があるか。\n- [ ] コードは適切に構造化されているか。\n- [ ] 複雑な処理には適切なコメントがあるか。\n- [ ] マジックナンバーは避けられているか。\n\n```rust\n// 良い例。\nconst MAX_RETRY_COUNT: u32 = 3;\nconst RETRY_DELAY_MS: u64 = 100;\n\nasync fn fetch_with_retry(url: &str) -> Result<Response, Error> {\n let mut attempts = 0;。\n \n loop {。\n match client.get(url).send().await {。\n Ok(response) => return Ok(response),。\n Err(e) if attempts < MAX_RETRY_COUNT => {。\n attempts += 1;。\n tokio::time::sleep(Duration::from_millis(RETRY_DELAY_MS)).await;\n }\n Err(e) => return Err(e.into()),。\n }\n }\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustreview-01jpcvxfxnn1eg2jxgy2jns9w6.md","loc":{"lines":{"from":186,"to":225}}}}],["73",{"pageContent":"// 悪い例。\nasync fn fetch(url: &str) -> Result<Response, Error> {\n let mut i = 0;。\n \n loop {。\n match client.get(url).send().await {。\n Ok(r) => return Ok(r),。\n Err(e) if i < 3 => { // マジックナンバー。\n i += 1;。\n tokio::time::sleep(Duration::from_millis(100)).await; // マジックナンバー\n }\n Err(e) => return Err(e.into()),。\n }\n }\n}\n```\n\n#### テスト\n\n- [ ] 適切なテストカバレッジがあるか。\n- [ ] エッジケースはテストされているか。\n- [ ] テストは独立していて再現可能か。\n- [ ] テストは明確で理解しやすいか。\n\n```rust\n#[cfg(test)]\nmod tests {。\n use super::*;\n \n #[test]。\n fn test_add_positive_numbers() {。\n assert_eq!(add(2, 3), 5);。\n }\n \n #[test]。\n fn test_add_negative_numbers() {。\n assert_eq!(add(-2, -3), -5);。\n }\n \n #[test]。\n fn test_add_overflow() {。\n assert!(add(i32::MAX, 1).is_none());\n }\n}\n```\n\n#### ドキュメント","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustreview-01jpcvxfxnn1eg2jxgy2jns9w6.md","loc":{"lines":{"from":227,"to":273}}}}],["74",{"pageContent":"#### ドキュメント\n\n- [ ] パブリックAPIには適切なドキュメントがあるか。\n- [ ] ドキュメントには例が含まれているか。\n- [ ] 複雑な処理や非自明な動作は説明されているか。\n- [ ] ドキュメントは[Rustdocの掟](rustdoc-01jpcvxfxpsvpepv85myk6s6be.md)に従っているか\n\n```rust\n/// 2つの数値を安全に加算します。\n///\n/// オーバーフローが発生した場合は `None` を返します。\n///\n/// # Examples。\n///\n/// ```\n/// use my_crate::add;\n///\n/// assert_eq!(add(2, 3), Some(5));。\n/// assert_eq!(add(i32::MAX, 1), None); // オーバーフロー\n/// ```\npub fn add(a: i32, b: i32) -> Option<i32> {\n a.checked_add(b)。\n}\n```\n\n### API設計\n\n#### インタフェース\n\n- [ ] APIは使いやすく直感的か。\n- [ ] 関数のシグネチャは明確で一貫しているか。\n- [ ] トレイトの設計は適切か。\n- [ ] エラー型は適切に定義されているか。\n\n```rust\n// 良い例。\ntrait Repository {。\n type Error;。\n type Item;。\n\n fn find(&self, id: &str) -> Result<Option<Self::Item>, Self::Error>;\n fn save(&self, item: &Self::Item) -> Result<(), Self::Error>;\n fn delete(&self, id: &str) -> Result<bool, Self::Error>;\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustreview-01jpcvxfxnn1eg2jxgy2jns9w6.md","loc":{"lines":{"from":273,"to":316}}}}],["75",{"pageContent":"// 悪い例。\ntrait Repo {。\n fn find(&self, id: &str) -> Option<Item>; // エラー処理がない\n fn save(&self, item: &Item) -> bool; // 成功/失敗の理由が不明確\n fn remove(&self, id: &str) -> bool; // 命名が一貫していない (delete vs remove)\n}\n```\n\n#### 型システム\n\n- [ ] ジェネリクスは適切に使用されているか。\n- [ ] トレイト境界は必要最小限か。\n- [ ] 型パラメータは明確で意味があるか。\n- [ ] newtype パターンは適切に使用されているか。\n\n```rust\n// 良い例。\nstruct UserId(String);。\nstruct User {。\n id: UserId,\n name: String,\n}\n\nfn get_user(id: &UserId) -> Option<User> {\n // 実装。\n}\n\n// 悪い例。\nfn get_user(id: &str) -> Option<User> {\n // 型安全性が低い - 任意の文字列が渡せる。\n}\n```\n\n### セキュリティ\n\n- [ ] ユーザー入力は適切に検証されているか。\n- [ ] 機密情報は適切に保護されているか。\n- [ ] 暗号化アルゴリズムは最新で安全か。\n- [ ] 依存関係に既知の脆弱性はないか。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustreview-01jpcvxfxnn1eg2jxgy2jns9w6.md","loc":{"lines":{"from":318,"to":356}}}}],["76",{"pageContent":"// 悪い例。\nfn get_user(id: &str) -> Option<User> {\n // 型安全性が低い - 任意の文字列が渡せる。\n}\n```\n\n### セキュリティ\n\n- [ ] ユーザー入力は適切に検証されているか。\n- [ ] 機密情報は適切に保護されているか。\n- [ ] 暗号化アルゴリズムは最新で安全か。\n- [ ] 依存関係に既知の脆弱性はないか。\n\n```rust\n// 良い例。\nfn validate_username(username: &str) -> Result<(), ValidationError> {\n if username.len() < 3 || username.len() > 20 {。\n return Err(ValidationError::InvalidLength);\n }\n \n if !username.chars().all(|c| c.is_alphanumeric() || c == '_') {。\n return Err(ValidationError::InvalidCharacters);\n }\n \n Ok(())。\n}\n\n// 悪い例。\nfn process_username(username: &str) {\n // 検証なしでユーザー入力を処理。\n}\n```\n\n## レビューコメントの書き方\n\n### 効果的なフィードバック\n\n- 具体的な問題点を指摘する。\n- 理由を説明する。\n- 改善案を提案する。\n- 肯定的な側面も指摘する。\n\n```\n// 良いフィードバック例。\nこのコードでは `unwrap()` を使用していますが、エラーが発生するとパニックします。\nユーザー入力に依存するこの部分では、`?` 演算子を使用してエラーを伝播するか、。\nエラーを適切に処理することをお勧めします。例えば:\n\n```rust\nlet value = input.parse::<i32>().map_err(|e| CustomError::ParseError(e))?;\n```\n\n// 悪いフィードバック例。\nunwrap を使わないでください。\n\n```\n\n### 優先順位付け","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustreview-01jpcvxfxnn1eg2jxgy2jns9w6.md","loc":{"lines":{"from":345,"to":402}}}}],["77",{"pageContent":"```rust\nlet value = input.parse::<i32>().map_err(|e| CustomError::ParseError(e))?;\n```\n\n// 悪いフィードバック例。\nunwrap を使わないでください。\n\n```\n\n### 優先順位付け\n\n- 重大な問題(安全性、正確性、セキュリティ)を最優先する。\n- 中程度の問題(パフォーマンス、API設計)を次に優先する。\n- 軽微な問題(スタイル、ドキュメント)は最後に扱う。\n\n## レビュー後のフォローアップ\n\n- 修正されたコードを再確認する。\n- 未解決の問題を追跡する。\n- 学んだ教訓をチームで共有する。\n- 必要に応じてコーディングガイドラインを更新する。\n\n## 関連情報\n\n- [Rust API Guidelines](https://rust-lang.github.io/api-guidelines/)\n- [Rustdocの掟](rustdoc-01jpcvxfxpsvpepv85myk6s6be.md)\n- [Rustコーディングスタイル](ruststyle-01jpcvxfxnn1eg2jxgy2jns9w5.md)\n- [Rustツール活用](rusttools-01jpcvxfxnn1eg2jxgy2jns9w4.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rustreview-01jpcvxfxnn1eg2jxgy2jns9w6.md","loc":{"lines":{"from":393,"to":420}}}}],["78",{"pageContent":"---\ndescription: ruststyleに関するドキュメント\nruleId: ruststyle-01jpcvxfxnn1eg2jxgy2jns9w5\ntags:\n - development\n - coding\n - rust\naliases:\n - rust-style-guide\n - rust-coding-conventions\nglobs:\n - '**/*.rs'\n---\n\n# Rustコーディングスタイル\n\n## 基本原則\n\n- [Rust API Guidelines](https://rust-lang.github.io/api-guidelines/)に従う\n- 可読性と保守性を最優先する。\n- 明示的なコードを暗黙的なコードより優先する。\n- 安全性を常に考慮する。\n\n## 命名規則\n\n### 基本ルール\n\n- 型名は`UpperCamelCase`。\n - 構造体、列挙型、トレイト、型エイリアスなど。\n - 例: `AppConfig`, `HttpResponse`, `Iterator`。\n- 変数、関数名は`snake_case`。\n - ローカル変数、関数、メソッド、モジュール、パッケージなど。\n - 例: `app_config`, `get_user`, `connect_database`。\n- 定数は`SCREAMING_SNAKE_CASE`。\n - 静的変数、定数など。\n - 例: `MAX_CONNECTIONS`, `DEFAULT_TIMEOUT`。\n- マクロは`snake_case!`。\n - 例: `println!`, `vec!`, `assert_eq!`。\n\n### 特殊なケース\n\n- lifetimeパラメータは短く意味のある名前を使用する。\n - 例: `'a`, `'db`, `'src`。\n - 単一の場合は`'a`、複数の場合は意味のある名前を使用。\n- ジェネリック型パラメータは意味のある名前を使用する。\n - 単純な場合: `T`, `U`, `V`。\n - 複雑な場合: `Key`, `Value`, `Item`。\n- 変数名の衝突を避けるためにアンダースコアを使用する。\n - 例: `_unused`, `_result`。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/ruststyle-01jpcvxfxnn1eg2jxgy2jns9w5.md","loc":{"lines":{"from":1,"to":49}}}}],["79",{"pageContent":"## コード構造\n\n### モジュール構成\n\n- 関連する機能を論理的なモジュールにグループ化する。\n- `pub use`を使用してAPIを整理する。\n- モジュール階層は3レベル以下に抑える。\n- `mod.rs`の使用は避け、モジュール名と同じ名前のファイルを使用する。\n\n```rust\n// 良い例。\nsrc/。\n lib.rs。\n config.rs。\n database/。\n mod.rs。\n connection.rs。\n query.rs。\n api/。\n mod.rs。\n routes.rs。\n handlers.rs。\n```\n\n### ファイル構造\n\n- 1ファイルあたり300行を超えないようにする。\n- 論理的な順序でコードを配置する:。\n 1. モジュール宣言。\n 2. インポート。\n 3. 定数。\n 4. 型定義。\n 5. トレイト実装。\n 6. 関数。\n- 関連する要素をグループ化する。\n\n## エラー処理\n\n### エラー型\n\n- カスタムエラー型には`thiserror`を使用する。\n- エラー型は具体的で意味のある名前を付ける。\n- エラーバリアントは具体的な問題を表現する。\n\n```rust\n#[derive(Debug, thiserror::Error)]\npub enum DatabaseError {。\n #[error(\"failed to connect to database: {0}\")]\n ConnectionFailed(#[from] std::io::Error),\n\n #[error(\"query failed: {0}\")]\n QueryFailed(String),。\n\n #[error(\"transaction error: {0}\")]\n TransactionError(String),。\n}\n```\n\n### エラー伝播\n\n- 結果が失敗する可能性のある関数は`Result`を返す。\n- `?`演算子を使用してエラーを伝播する。\n- エラーチェインは適切に情報を付加する。\n- パニックは契約違反の場合のみ使用する。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/ruststyle-01jpcvxfxnn1eg2jxgy2jns9w5.md","loc":{"lines":{"from":51,"to":114}}}}],["80",{"pageContent":"#[error(\"transaction error: {0}\")]\n TransactionError(String),。\n}\n```\n\n### エラー伝播\n\n- 結果が失敗する可能性のある関数は`Result`を返す。\n- `?`演算子を使用してエラーを伝播する。\n- エラーチェインは適切に情報を付加する。\n- パニックは契約違反の場合のみ使用する。\n\n```rust\nfn process_data(path: &str) -> Result<Data, ProcessError> {\n let file = File::open(path)\n .map_err(|e| ProcessError::FileError(format!(\"Failed to open {}: {}\", path, e)))?;\n \n let data = parse_file(file)?;。\n Ok(data)。\n}\n```\n\n## 所有権とライフタイム\n\n### 所有権\n\n- 不必要な所有権の移動を避ける。\n- 所有権の移動が必要な場合は明示的にする。\n- `Clone`の使用は性能を考慮して判断する。\n- 大きなデータ構造は参照で渡す。\n\n```rust\n// 良い例。\nfn process(data: &[u8]) -> Result<(), Error> {\n // データの参照を使用。\n}\n\n// 避けるべき例。\nfn process(data: Vec<u8>) -> Result<(), Error> {\n // 所有権を不必要に移動。\n}\n```\n\n### ライフタイム\n\n- 参照は可能な限り短いスコープに制限する。\n- ライフタイムパラメータは明示的に必要な場合のみ指定する。\n- 複雑なライフタイム関係は適切にドキュメント化する。\n\n```rust\n// 良い例。\nfn longest<'a>(x: &'a str, y: &'a str) -> &'a str {\n if x.len() > y.len() { x } else { y }。\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/ruststyle-01jpcvxfxnn1eg2jxgy2jns9w5.md","loc":{"lines":{"from":104,"to":157}}}}],["81",{"pageContent":"- 参照は可能な限り短いスコープに制限する。\n- ライフタイムパラメータは明示的に必要な場合のみ指定する。\n- 複雑なライフタイム関係は適切にドキュメント化する。\n\n```rust\n// 良い例。\nfn longest<'a>(x: &'a str, y: &'a str) -> &'a str {\n if x.len() > y.len() { x } else { y }。\n}\n\n// 避けるべき例 (不必要なライフタイム)。\nfn get_str<'a>(s: &'a str) -> &'a str {\n s\n}\n```\n\n## ジェネリクスとトレイト\n\n### トレイト設計\n\n- トレイトは単一責任の原則に従う。\n- トレイトメソッドは明確な目的を持つ。\n- デフォルト実装は適切に提供する。\n- トレイト境界は必要最小限に保つ。\n\n```rust\n// 良い例。\ntrait Repository {。\n type Error;。\n type Item;。\n\n fn find(&self, id: &str) -> Result<Option<Self::Item>, Self::Error>;\n fn save(&self, item: &Self::Item) -> Result<(), Self::Error>;\n fn delete(&self, id: &str) -> Result<bool, Self::Error>;\n}\n```\n\n### ジェネリクス\n\n- ジェネリック型パラメータは意味のある名前を使用する。\n- `impl Trait`と明示的なジェネリクスを適切に使い分ける。\n- 戻り値の型には`impl Trait`を優先する。\n- 引数の型には明示的なジェネリクスを優先する。\n\n```rust\n// 良い例 (戻り値)。\nfn sorted_vec(v: &[i32]) -> impl Iterator<Item = &i32> {\n v.iter().sorted()。\n}\n\n// 良い例 (引数)。\nfn process<T: AsRef<str>>(input: T) {\n let s = input.as_ref();。\n // 処理。\n}\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/ruststyle-01jpcvxfxnn1eg2jxgy2jns9w5.md","loc":{"lines":{"from":149,"to":204}}}}],["82",{"pageContent":"// 良い例 (引数)。\nfn process<T: AsRef<str>>(input: T) {\n let s = input.as_ref();。\n // 処理。\n}\n```\n\n## 非同期処理\n\n### async/await\n\n- `async`/`await`を適切に使用する。\n- 非同期関数は戻り値の型を明確にする。\n- 長時間実行される処理はキャンセル可能にする。\n- エラー伝播には`?`演算子を活用する。\n\n```rust\nasync fn fetch_data(url: &str) -> Result<Data, FetchError> {\n let response = reqwest::get(url).await?;\n let data = response.json::<Data>().await?;\n Ok(data)。\n}\n```\n\n### ランタイム\n\n- `tokio`のランタイムを一貫して使用する。\n- 非同期コンテキストでのブロッキング処理を避ける。\n- 必要に応じて`spawn_blocking`を使用する。\n- 適切なタスク管理する。\n\n```rust\n// 良い例。\nasync fn process_file(path: &str) -> Result<(), Error> {\n let content = tokio::fs::read_to_string(path).await?;\n // 非同期処理。\n Ok(())。\n}\n\n// ブロッキング処理の適切な扱い。\nasync fn process_complex_data(data: &[u8]) -> Result<Output, Error> {\n let result = tokio::task::spawn_blocking(move || {\n // CPUバウンドな処理。\n compute_complex_result(data)。\n }).await??;。\n \n Ok(result)。\n}\n```\n\n## テスト\n\n### ユニットテスト","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/ruststyle-01jpcvxfxnn1eg2jxgy2jns9w5.md","loc":{"lines":{"from":199,"to":251}}}}],["83",{"pageContent":"## テスト\n\n### ユニットテスト\n\n- ユニットテストは同じファイル内に書く。\n- テスト関数は明確な命名する。\n- 各テストは単一の機能をテストする。\n- テストヘルパー関数を適切に活用する。\n\n```rust\n#[cfg(test)]\nmod tests {。\n use super::*;\n\n #[test]。\n fn test_add_positive_numbers() {。\n assert_eq!(add(2, 3), 5);。\n }\n\n #[test]。\n fn test_add_negative_numbers() {。\n assert_eq!(add(-2, -3), -5);。\n }\n}\n```\n\n### 結合テスト\n\n- 結合テストは`tests`ディレクトリに配置する。\n- テストケースは境界値を考慮する。\n- モックとスタブを適切に使用する。\n- プロパティベーステストを検討する。\n\n```rust\n// tests/integration_test.rs。\nuse my_crate::Database;\n\n#[test]\nfn test_database_connection() {。\n let db = Database::new(\"test_connection_string\");\n assert!(db.connect().is_ok());。\n}\n```\n\n## フォーマットとスタイル\n\n### コードフォーマット\n\n- `rustfmt`を必ず使用する。\n- デフォルト設定を尊重する。\n- 特別な理由がない限りカスタム設定は避ける。\n- CIでフォーマットチェックを実施する。\n\n### コメント\n\n- コードの「なぜ」を説明するコメントを書く。\n- 複雑なアルゴリズムには説明を追加する。\n- TODOコメントには理由と参照を含める。\n- ドキュメントコメントは[Rustdocの掟](rustdoc-01jpcvxfxpsvpepv85myk6s6be.md)に従う","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/ruststyle-01jpcvxfxnn1eg2jxgy2jns9w5.md","loc":{"lines":{"from":249,"to":307}}}}],["84",{"pageContent":"### コメント\n\n- コードの「なぜ」を説明するコメントを書く。\n- 複雑なアルゴリズムには説明を追加する。\n- TODOコメントには理由と参照を含める。\n- ドキュメントコメントは[Rustdocの掟](rustdoc-01jpcvxfxpsvpepv85myk6s6be.md)に従う\n\n```rust\n// 良いコメント例。\n// Pangolinアルゴリズムを使用して効率的にソート。\n// 参考: https://example.com/pangolin-algorithm\nfn pangolin_sort<T: Ord>(slice: &mut [T]) {\n // 実装。\n}\n\n// TODO: パフォーマンス最適化が必要 (#123)\nfn slow_function() {。\n // 実装。\n}\n```\n\n## 関連情報\n\n- [Rust API Guidelines](https://rust-lang.github.io/api-guidelines/)\n- [Rust Style Guide](https://github.com/rust-dev-tools/fmt-rfcs/blob/master/guide/guide.md)\n- [Rust Design Patterns](https://rust-unofficial.github.io/patterns/)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/ruststyle-01jpcvxfxnn1eg2jxgy2jns9w5.md","loc":{"lines":{"from":302,"to":327}}}}],["85",{"pageContent":"---\ndescription: rusttoolsに関するドキュメント\nruleId: rusttools-01jpcvxfxnn1eg2jxgy2jns9w4\ntags:\n - development\n - coding\n - rust\naliases:\n - rust-tools\n - rust-ecosystem\nglobs:\n - '**/*.rs'\n---\n\n# Rustツール活用\n\n## 基本ツール\n\n### rustup\n\nRustのツールチェイン管理システム。複数のRustバージョンを管理し、簡単に切り替えることができます。\n\n```bash\n# Rustのインストール\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh。\n\n# 最新の安定版に更新\nrustup update stable。\n\n# 特定のバージョンをインストール\nrustup install 1.67.0。\n\n# デフォルトのツールチェーンを設定\nrustup default stable。\n\n# クロスコンパイル用のターゲットを追加\nrustup target add wasm32-unknown-unknown。\n```\n\n### cargo\n\nRustの公式ビルドシステムおよびパッケージマネージャー。プロジェクトの作成、ビルド、テスト、依存関係の管理などを行います。\n\n```bash\n# 新しいプロジェクトを作成\ncargo new my_project。\ncargo new --lib my_library。\n\n# ビルド\ncargo build。\ncargo build --release。\n\n# テスト実行\ncargo test。\ncargo test -- --nocapture。\n\n# ドキュメント生成\ncargo doc --open。\n\n# 依存関係の更新\ncargo update。\n```\n\n## コード品質ツール\n\n### rustfmt\n\nRustコードのフォーマッターです。一貫したコードスタイルを維持するために使用します。\n\n```bash\n# インストール\nrustup component add rustfmt。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rusttools-01jpcvxfxnn1eg2jxgy2jns9w4.md","loc":{"lines":{"from":1,"to":72}}}}],["86",{"pageContent":"# ドキュメント生成\ncargo doc --open。\n\n# 依存関係の更新\ncargo update。\n```\n\n## コード品質ツール\n\n### rustfmt\n\nRustコードのフォーマッターです。一貫したコードスタイルを維持するために使用します。\n\n```bash\n# インストール\nrustup component add rustfmt。\n\n# 単一ファイルのフォーマット\nrustfmt src/main.rs。\n\n# プロジェクト全体のフォーマット\ncargo fmt。\n\n# フォーマットチェックのみ(変更なし)\ncargo fmt -- --check。\n```\n\n設定は`.rustfmt.toml`ファイルでカスタマイズできますが、特別な理由がない限りデフォルト設定を使用することを推奨します。\n\n### clippy\n\nRustの静的解析ツールです。コードの問題点や改善点を指摘します。\n\n```bash\n# インストール\nrustup component add clippy。\n\n# 解析の実行\ncargo clippy。\n\n# 警告をエラーとして扱う\ncargo clippy -- -D warnings。\n\n# 特定のカテゴリの警告のみを有効化\ncargo clippy -- -W clippy::pedantic。\n```\n\nプロジェクトルートに`.clippy.toml`ファイルを作成して設定をカスタマイズできます。\n\n### cargo-audit\n\n依存関係のセキュリティ脆弱性をチェックするツールです。\n\n```bash\n# インストール\ncargo install cargo-audit。\n\n# 監査の実行\ncargo audit。\n\n# 詳細な出力\ncargo audit --verbose。\n```\n\n定期的に実行して、使用しているクレートの脆弱性を確認することを推奨します。\n\n## 開発支援ツール\n\n### rust-analyzer\n\nRustの言語サーバー実装です。IDEやエディタに統合して、コード補完、定義ジャンプ、リファクタリングなどの機能を提供します。\n\n```bash\n# rustupでインストール\nrustup component add rust-analyzer。\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rusttools-01jpcvxfxnn1eg2jxgy2jns9w4.md","loc":{"lines":{"from":57,"to":132}}}}],["87",{"pageContent":"定期的に実行して、使用しているクレートの脆弱性を確認することを推奨します。\n\n## 開発支援ツール\n\n### rust-analyzer\n\nRustの言語サーバー実装です。IDEやエディタに統合して、コード補完、定義ジャンプ、リファクタリングなどの機能を提供します。\n\n```bash\n# rustupでインストール\nrustup component add rust-analyzer。\n```\n\nVSCode、IntelliJ IDEA、Vimなど多くのエディタで利用できます。\n\n### cargo-watch\n\nファイルの変更を監視し、自動的にコマンドするするツールです。\n\n```bash\n# インストール\ncargo install cargo-watch。\n\n# ファイル変更時にビルド\ncargo watch -x build。\n\n# ファイル変更時にテスト\ncargo watch -x test。\n\n# 複数のコマンドを連続実行\ncargo watch -x check -x test -x run。\n```\n\n開発中のフィードバックループを短縮するのに役立ちます。\n\n### cargo-expand\n\nマクロを展開して、生成されたコードを表示するツールです。\n\n```bash\n# インストール\ncargo install cargo-expand。\n\n# マクロ展開の表示\ncargo expand。\ncargo expand --bin my_binary。\ncargo expand path::to::module\n```\n\nマクロのデバッグや理解に役立ちます。\n\n## パフォーマンス分析ツール\n\n### cargo-flamegraph\n\nプログラムのパフォーマンスプロファイリングを行い、フレームグラフを生成するツールです。\n\n```bash\n# インストール\ncargo install flamegraph。\n\n# フレームグラフの生成\ncargo flamegraph。\ncargo flamegraph --bin my_binary -- arg1 arg2。\n\n# リリースビルドでプロファイリング\ncargo flamegraph --release。\n```\n\nホットスポットの特定やパフォーマンス最適化に役立ちます。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rusttools-01jpcvxfxnn1eg2jxgy2jns9w4.md","loc":{"lines":{"from":121,"to":190}}}}],["88",{"pageContent":"# フレームグラフの生成\ncargo flamegraph。\ncargo flamegraph --bin my_binary -- arg1 arg2。\n\n# リリースビルドでプロファイリング\ncargo flamegraph --release。\n```\n\nホットスポットの特定やパフォーマンス最適化に役立ちます。\n\n### criterion\n\nベンチマークテストのためのフレームワークです。\n\n```bash\n# Cargo.tomlに追加\n[dev-dependencies]。\ncriterion = \"0.4\"。\n\n[bench]。\nname = \"my_benchmark\"。\nharness = false。\n```\n\n```rust\n// benches/my_benchmark.rs。\nuse criterion::{black_box, criterion_group, criterion_main, Criterion};\n\nfn fibonacci_benchmark(c: &mut Criterion) {\n c.bench_function(\"fib 20\", |b| b.iter(|| fibonacci(black_box(20))));。\n}\n\ncriterion_group!(benches, fibonacci_benchmark);。\ncriterion_main!(benches);。\n```\n\n```bash\n# ベンチマークの実行\ncargo bench。\n```\n\n## ドキュメント関連ツール\n\n### rustdoc\n\nRustの標準ドキュメント生成ツールです。\n\n```bash\n# ドキュメントの生成\ncargo doc。\n\n# ドキュメントを生成して自動的にブラウザで開く\ncargo doc --open。\n\n# プライベート項目も含めてドキュメントを生成\ncargo doc --document-private-items。\n```\n\n詳細な使用方法は[Rustdocの掟](rustdoc-01jpcvxfxpsvpepv85myk6s6be.md)を参照してください。\n\n### mdbook","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rusttools-01jpcvxfxnn1eg2jxgy2jns9w4.md","loc":{"lines":{"from":182,"to":242}}}}],["89",{"pageContent":"# ドキュメントを生成して自動的にブラウザで開く\ncargo doc --open。\n\n# プライベート項目も含めてドキュメントを生成\ncargo doc --document-private-items。\n```\n\n詳細な使用方法は[Rustdocの掟](rustdoc-01jpcvxfxpsvpepv85myk6s6be.md)を参照してください。\n\n### mdbook\n\nMarkdownからドキュメントを生成するツールです。Rustプロジェクトのマニュアルやガイドの作成に適しています。\n\n```bash\n# インストール\ncargo install mdbook。\n\n# 新しいブックの作成\nmdbook init my-book。\n\n# ローカルサーバーでプレビュー\nmdbook serve --open。\n\n# HTMLの生成\nmdbook build。\n```\n\n## 依存関係管理ツール\n\n### cargo-outdated\n\nプロジェクトの依存関係の更新状況を確認するツールです。\n\n```bash\n# インストール\ncargo install cargo-outdated。\n\n# 古くなった依存関係の確認\ncargo outdated。\n\n# SemVerの互換性を考慮した確認\ncargo outdated -R。\n```\n\n### cargo-edit\n\n依存関係を簡単に追加、削除、更新するためのツールです。\n\n```bash\n# インストール\ncargo install cargo-edit。\n\n# 依存関係の追加\ncargo add serde --features derive。\ncargo add tokio -F full。\n\n# 依存関係の削除\ncargo rm unused-dependency。\n\n# 依存関係の更新\ncargo upgrade。\n```\n\n## デプロイメントツール\n\n### cross\n\n異なるプラットフォーム向けにクロスコンパイルするためのツールです。\n\n```bash\n# インストール\ncargo install cross。\n\n# Linuxターゲット向けにビルド\ncross build --target x86_64-unknown-linux-gnu。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rusttools-01jpcvxfxnn1eg2jxgy2jns9w4.md","loc":{"lines":{"from":233,"to":307}}}}],["90",{"pageContent":"# 依存関係の更新\ncargo upgrade。\n```\n\n## デプロイメントツール\n\n### cross\n\n異なるプラットフォーム向けにクロスコンパイルするためのツールです。\n\n```bash\n# インストール\ncargo install cross。\n\n# Linuxターゲット向けにビルド\ncross build --target x86_64-unknown-linux-gnu。\n\n# Androidターゲット向けにビルド\ncross build --target aarch64-linux-android。\n```\n\n### cargo-deb\n\nDebianパッケージを作成するツールです。\n\n```bash\n# インストール\ncargo install cargo-deb。\n\n# Debianパッケージの作成\ncargo deb。\n```\n\n### cargo-release\n\nリリースプロセスを自動化するツールです。\n\n```bash\n# インストール\ncargo install cargo-release。\n\n# パッチバージョンをインクリメントしてリリース\ncargo release patch。\n\n# マイナーバージョンをインクリメントしてリリース\ncargo release minor。\n```\n\n## CI/CD統合\n\n### GitHub Actions\n\nGitHub Actionsを使用したRustプロジェクトのCI/CD設定例:。\n\n```yaml\n# .github/workflows/rust.yml\nname: Rust。\n\non:\n push:\n branches: [ main ]\n pull_request:\n branches: [ main ]","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rusttools-01jpcvxfxnn1eg2jxgy2jns9w4.md","loc":{"lines":{"from":292,"to":354}}}}],["91",{"pageContent":"## CI/CD統合\n\n### GitHub Actions\n\nGitHub Actionsを使用したRustプロジェクトのCI/CD設定例:。\n\n```yaml\n# .github/workflows/rust.yml\nname: Rust。\n\non:\n push:\n branches: [ main ]\n pull_request:\n branches: [ main ]\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v3。\n - name: Build。\n run: cargo build --verbose\n - name: Run tests。\n run: cargo test --verbose\n - name: Run clippy。\n run: cargo clippy -- -D warnings\n - name: Check formatting。\n run: cargo fmt -- --check\n```\n\n### cargo-tarpaulin\n\nコードカバレッジを計測するツールです。\n\n```bash\n# インストール\ncargo install cargo-tarpaulin。\n\n# カバレッジの計測\ncargo tarpaulin。\n\n# HTMLレポートの生成\ncargo tarpaulin --out Html。\n```\n\n## 推奨ワークフロー\n\n1. **プロジェクト開始時**:\n - `cargo new`でプロジェクト作成。\n - `.gitignore`の設定。\n - `rustfmt`と`clippy`のセットアップ。\n\n2. **日常の開発**:\n - `cargo-watch`を使用して継続的なフィードバック。\n - `rust-analyzer`を活用したコーディング。\n - `cargo test`で定期的なテスト実行。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rusttools-01jpcvxfxnn1eg2jxgy2jns9w4.md","loc":{"lines":{"from":340,"to":396}}}}],["92",{"pageContent":"2. **日常の開発**:\n - `cargo-watch`を使用して継続的なフィードバック。\n - `rust-analyzer`を活用したコーディング。\n - `cargo test`で定期的なテスト実行。\n\n3. **コードレビュー前**:\n - `cargo fmt`でフォーマット。\n - `cargo clippy`で静的解析。\n - `cargo test`でテスト実行。\n\n4. **リリース前**:\n - `cargo audit`でセキュリティチェック。\n - `cargo outdated`で依存関係の確認。\n - `cargo bench`でパフォーマンス確認。\n - `cargo doc`でドキュメント生成。\n\n## 関連情報\n\n- [The Cargo Book](https://doc.rust-lang.org/cargo/)\n- [Rust Tools](https://www.rust-lang.org/tools)\n- [Awesome Rust](https://github.com/rust-unofficial/awesome-rust) - Rustツールとライブラリのキュレーションリスト","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust/rusttools-01jpcvxfxnn1eg2jxgy2jns9w4.md","loc":{"lines":{"from":393,"to":413}}}}],["93",{"pageContent":"---\ndescription: Rustのコーディング規約と開発ガイドライン\nruleId: rust-01jpcvxfxf9jafj03jk1zks31y\ntags:\n - rust\n - coding\n - guidelines\naliases:\n - rust-rules\n - rust-guidelines\nglobs:\n - '**/*.ts'\n - '**/*.tsx'\n - '**/*.js'\n - '**/*.jsx'\n - '**/*.go'\n - '**/*.rs'\n - '**/*.scala'\n---\n\n# Rustの掟\n\n## 基本原則\n\n- [Rust API Guidelines](https://rust-lang.github.io/api-guidelines/)に従う\n- `rustfmt`を必ず使用してコードをフォーマットする。\n- `clippy`を使用してコード品質を維持する。\n\n## モジュール構成\n\nRustのコーディング規約は以下のモジュールに分かれています:。\n\n- [Rustdocの掟](rust/rustdoc-01jpcvxfxpsvpepv85myk6s6be.md) - コードドキュメントの書き方\n- [Rustコーディングスタイル](rust/ruststyle-01jpcvxfxnn1eg2jxgy2jns9w5.md) - 命名規則、コード構造、エラー処理など\n- [Rustツール活用](rust/rusttools-01jpcvxfxnn1eg2jxgy2jns9w4.md) - 開発ツールの使用方法\n- [Rustコードレビュー](rust/rustreview-01jpcvxfxnn1eg2jxgy2jns9w6.md) - レビュー時のチェックポイント\n- [Rust参考文献](rust/rustrefs-01jpcvxfxnn1eg2jxgy2jns9w7.md) - 学習リソースと参考資料\n\n## クイックリファレンス\n\n### 重要な原則","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust-01jpcvxfxf9jafj03jk1zks31y.md","loc":{"lines":{"from":1,"to":41}}}}],["94",{"pageContent":"## クイックリファレンス\n\n### 重要な原則\n\n- 型名は`UpperCamelCase`、変数・関数名は`snake_case`を使用する。\n- 不必要な所有権の移動を避ける。\n- エラーは適切に伝播し、明確なメッセージを提供する。\n- `unsafe`コードは必要最小限に抑え、十分にドキュメント化する。\n- テストは網羅的に書き、エッジケースも考慮する。\n\n### 必須ツール\n\n- `rustfmt` - コードフォーマッティング。\n- `clippy` - 静的解析。\n- `cargo-audit` - 依存関係のセキュリティチェック。\n- `rust-analyzer` - 言語サーバー。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/rust-01jpcvxfxf9jafj03jk1zks31y.md","loc":{"lines":{"from":39,"to":54}}}}],["95",{"pageContent":"---\ndescription: scaladocに関するドキュメント\nruleId: scaladoc-01jpcvxfxmsb49cge8ewg55kah\ntags:\n - development\n - coding\n - scala\naliases:\n - scala-documentation\n - scaladoc-guidelines\nglobs:\n - '**/*.scala'\n---\n\n# Scaladocの掟\n\n## 基本原則\n\n- [ドキュメントコメントの掟](../doc-comment-01jpcvxfxgyqe2jprh9hgn6xq8.md)に準拠すること\n - ドキュメントコメントは英語で記述する。\n - 記述がないものは新規に追加する。\n - 既存のものでもガイドラインに従っていないものは是正する。\n - コードを見れば分かることは書かない(Why/Why notを中心に記載)\n\n## ドキュメント規約\n\nScalaの公式ドキュメントに基づき、以下の規約に従うこと:。\n\n- パブリックAPI要素には必ずドキュメントを付ける。\n- ドキュメントはMarkdown形式で記述する。\n- メソッドの型パラメータ、引数、戻り値を明確に説明する。\n- 非自明な動作や副作用は必ず記載する。\n- サンプルコードは実際に動作するものを記述する。\n\n参考:[Scaladoc Guide](https://docs.scala-lang.org/style/scaladoc.html)\n\n## ドキュメントスタイル\n\n### パッケージドキュメント","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scaladoc-01jpcvxfxmsb49cge8ewg55kah.md","loc":{"lines":{"from":1,"to":39}}}}],["96",{"pageContent":"参考:[Scaladoc Guide](https://docs.scala-lang.org/style/scaladoc.html)\n\n## ドキュメントスタイル\n\n### パッケージドキュメント\n\n```scala\n/** This package provides utilities for handling asynchronous computations.\n *\n * The main components are:。\n * - `Future` for representing asynchronous computations。\n * - `Promise` for creating and completing futures。\n * - `ExecutionContext` for managing thread pools。\n */\npackage object async。\n```\n\n### クラスとトレイト\n\n```scala\n/** A thread-safe queue implementation that blocks on dequeue if the queue is empty.\n *\n * This implementation uses a circular buffer internally to achieve constant time。\n * enqueue and dequeue operations.。\n *\n * @tparam T the type of elements in the queue。\n * @param capacity the maximum number of elements the queue can hold。\n *\n * @note This implementation is not memory-adaptive. The internal buffer is。\n * allocated at construction time and never resized.。\n */\nclass BlockingQueue[T](capacity: Int) {\n // 実装。\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scaladoc-01jpcvxfxmsb49cge8ewg55kah.md","loc":{"lines":{"from":35,"to":68}}}}],["97",{"pageContent":"/** Represents operations that can be performed asynchronously.\n *\n * Implementors must ensure that:。\n * - Operations are thread-safe。\n * - Resources are properly cleaned up。\n * - Errors are properly propagated。\n */\ntrait AsyncOperation {。\n /** The type of error that can occur during the operation. */。\n type Error。\n\n /** Executes the operation asynchronously.\n *\n * @return a Future containing either an error or the operation result。\n */\n def execute(): Future[Either[Error, Unit]]\n}\n```\n\n### メソッド","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scaladoc-01jpcvxfxmsb49cge8ewg55kah.md","loc":{"lines":{"from":70,"to":89}}}}],["98",{"pageContent":"/** Executes the operation asynchronously.\n *\n * @return a Future containing either an error or the operation result。\n */\n def execute(): Future[Either[Error, Unit]]\n}\n```\n\n### メソッド\n\n```scala\n/** Creates a new connection to the database.\n *\n * This method will retry the connection up to 3 times with exponential backoff。\n * before giving up.。\n *\n * @param config the database configuration。\n * @param timeout maximum time to wait for connection。\n * @return either a connection error or the established connection。\n *\n * @note This method is blocking and should not be called from the event loop。\n */\ndef connect(。\n config: DbConfig,\n timeout: Duration\n): Either[ConnectionError, Connection]\n```\n\n### ケースクラスとシール済みトレイト\n\n```scala\n/** Represents possible errors that can occur during HTTP operations.\n *\n * @param message human-readable error message。\n * @param cause optional underlying cause。\n */\nsealed trait HttpError extends Exception(message)。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scaladoc-01jpcvxfxmsb49cge8ewg55kah.md","loc":{"lines":{"from":81,"to":117}}}}],["99",{"pageContent":"/** Indicates that the requested resource was not found.\n *\n * @param url the URL that was not found。\n * @param message additional details about why the resource was not found。\n */\ncase class NotFound(。\n url: String,\n message: String\n) extends HttpError。\n```\n\n## 特殊な記法\n\n### タグ\n\n```scala\n/** Provides utility functions for working with collections.\n *\n * @define ORDERED Items must be ordered for this operation。\n * @define POS Position must be non-negative。\n */\nobject CollectionUtils {。\n /** Binary search in a sequence.\n *\n * $ORDERED。\n * $POS。\n */\n def binarySearch[T: Ordering](seq: Seq[T], elem: T): Int\n}\n```\n\n### クロスリンク\n\n```scala\n/** See [[DbConfig.builder]] for creating a configuration.\n *\n * For more details about connection management, see。\n * [[com.example.db.ConnectionManager]].。\n */\ndef connect(config: DbConfig): Connection\n```\n\n## テストとの統合\n\n### ユニットテスト例の記述","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scaladoc-01jpcvxfxmsb49cge8ewg55kah.md","loc":{"lines":{"from":119,"to":163}}}}],["100",{"pageContent":"## テストとの統合\n\n### ユニットテスト例の記述\n\n```scala\n/** Adds two numbers safely handling overflow.\n *\n * Example:。\n * {{{。\n * scala> safeAdd(Int.MaxValue, 1)。\n * res0: Option[Int] = None。\n *\n * scala> safeAdd(40, 2)。\n * res1: Option[Int] = Some(42)。\n * }}}。\n */\ndef safeAdd(a: Int, b: Int): Option[Int]\n```\n\n## レビュー時の注意点\n\n- ドキュメントが最新の実装を反映しているか。\n- 全てのパブリック要素にドキュメントが付いているか。\n- 説明が明確で具体的か。\n- サンプルコードが実際に動作するか。\n- 英語の文法や表現が適切か。\n- 非自明な動作や制約が明確に記載されているか。\n\n## 関連情報\n\n- [Scaladoc Guide](https://docs.scala-lang.org/style/scaladoc.html)\n- [Scala Documentation Style](https://docs.scala-lang.org/style/documentation.html)\n- [Scaladoc for Library Authors](https://docs.scala-lang.org/overviews/scaladoc/for-library-authors.html)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scaladoc-01jpcvxfxmsb49cge8ewg55kah.md","loc":{"lines":{"from":161,"to":193}}}}],["101",{"pageContent":"---\ndescription: scalarefsに関するドキュメント\nruleId: scalarefs-01jpcvxfxmsb49cge8ewg55kag\ntags:\n - development\n - coding\n - scala\naliases:\n - scala-references\n - scala-resources\nglobs:\n - '**/*.scala'\n---\n\n# Scala参考文献\n\n## 公式ドキュメント\n\n### 基本ドキュメント\n\n- [Scala公式サイト](https://www.scala-lang.org/) - Scala言語の公式ウェブサイト\n- [Scala Documentation](https://docs.scala-lang.org/) - 公式ドキュメント\n- [Scala API](https://www.scala-lang.org/api/current/) - 標準ライブラリのAPIドキュメント\n- [Scala Style Guide](https://docs.scala-lang.org/style/) - 公式スタイルガイド\n\n### 特定のトピック\n\n- [Scala Collections](https://docs.scala-lang.org/overviews/collections/introduction.html) - コレクションライブラリの詳細ガイド\n- [Scala Futures and Promises](https://docs.scala-lang.org/overviews/core/futures.html) - 非同期プログラミングの解説\n- [Scala Reflection](https://docs.scala-lang.org/overviews/reflection/overview.html) - リフレクションAPIの解説\n- [Scala Macros](https://docs.scala-lang.org/overviews/macros/overview.html) - マクロプログラミングの解説\n\n## 学習リソース\n\n### 初心者向け","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalarefs-01jpcvxfxmsb49cge8ewg55kag.md","loc":{"lines":{"from":1,"to":35}}}}],["102",{"pageContent":"## 学習リソース\n\n### 初心者向け\n\n- [Scala School](https://twitter.github.io/scala_school/) - Twitterによる入門講座\n- [Scala Exercises](https://www.scala-exercises.org/) - インタラクティブな演習\n- [Tour of Scala](https://docs.scala-lang.org/tour/tour-of-scala.html) - 言語機能の簡潔な紹介\n- [Scala for the Impatient](https://horstmann.com/scala/) - 実践的な入門書\n\n### 中級者向け\n\n- [Functional Programming in Scala](https://www.manning.com/books/functional-programming-in-scala) - 関数型プログラミングの原則を学ぶ\n- [Scala with Cats](https://underscore.io/books/scala-with-cats/) - Cats ライブラリを使った関数型プログラミング\n- [Essential Scala](https://underscore.io/books/essential-scala/) - Scalaの基本概念を深く理解する\n- [Scala Design Patterns](https://www.packtpub.com/product/scala-design-patterns-second-edition/9781788471305) - Scalaでのデザインパターン\n\n### 上級者向け","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalarefs-01jpcvxfxmsb49cge8ewg55kag.md","loc":{"lines":{"from":33,"to":49}}}}],["103",{"pageContent":"### 上級者向け\n\n- [Advanced Scala with Cats](https://underscore.io/books/advanced-scala/) - 高度な関数型プログラミング\n- [Functional Programming for Mortals](https://leanpub.com/fpmortals) - Scalazを使った関数型プログラミング\n- [Scala High Performance Programming](https://www.packtpub.com/product/scala-high-performance-programming/9781786466044) - パフォーマンス最適化\n- [Programming in Scala](https://www.artima.com/shop/programming_in_scala_4ed) - 言語設計者による包括的な解説書\n\n## ブログと記事\n\n- [Scala Times](https://scalatimes.com/) - Scalaに関する週刊ニュースレター\n- [Scala Lang Blog](https://www.scala-lang.org/blog/) - 公式ブログ\n- [Typelevel Blog](https://typelevel.org/blog/) - 関数型プログラミングとTypeレベルのブログ\n- [47 Degrees Blog](https://www.47deg.com/blog/tags/scala/) - Scala関連の技術記事\n\n## 動画リソース","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalarefs-01jpcvxfxmsb49cge8ewg55kag.md","loc":{"lines":{"from":49,"to":63}}}}],["104",{"pageContent":"## 動画リソース\n\n- [Rock the JVM](https://www.youtube.com/c/RocktheJVM) - Scalaプログラミングのチュートリアル\n- [Scala Days](https://www.youtube.com/channel/UCOHg8YCiyMVRRxb3mJT_0Mg) - Scala Daysカンファレンスの動画\n- [Functional TV](https://www.youtube.com/channel/UCKvhw2CPR-0S4XZ1bNlihnw) - 関数型プログラミングに関する講演\n- [Scala World](https://www.youtube.com/channel/UCc0j7uOItUDZi4xDnOSpuQg) - Scala Worldカンファレンスの動画\n\n## コミュニティ\n\n### 日本語コミュニティ\n\n- [Scala Matsuri](https://scalamatsuri.org/) - 日本最大のScalaカンファレンス\n- [Scala Developers Japan](https://scalaconfjp.doorkeeper.jp/) - 日本のScalaコミュニティ\n- [Scala Japan Slack](https://scalajp.slack.com/) - 日本のScala Slackコミュニティ\n\n### 国際コミュニティ\n\n- [Scala Users](https://users.scala-lang.org/) - 公式ユーザーフォーラム\n- [Scala Contributors](https://contributors.scala-lang.org/) - 貢献者向けフォーラム\n- [Scala Discord](https://discord.com/invite/scala) - Scalaの公式Discordサーバー\n- [Scala Subreddit](https://www.reddit.com/r/scala/) - Redditコミュニティ\n\n## ツールとライブラリ\n\n### 主要ライブラリ\n\n#### 関数型プログラミング","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalarefs-01jpcvxfxmsb49cge8ewg55kag.md","loc":{"lines":{"from":63,"to":89}}}}],["105",{"pageContent":"## ツールとライブラリ\n\n### 主要ライブラリ\n\n#### 関数型プログラミング\n\n- [Cats](https://typelevel.org/cats/) - 関数型プログラミングの抽象化\n- [Cats Effect](https://typelevel.org/cats-effect/) - 純粋関数型の効果システム\n- [ZIO](https://zio.dev/) - 型安全な非同期・並行プログラミング\n- [Scalaz](https://github.com/scalaz/scalaz) - 関数型プログラミングライブラリ\n\n#### Web開発\n\n- [Play Framework](https://www.playframework.com/) - Webアプリケーションフレームワーク\n- [Akka HTTP](https://doc.akka.io/docs/akka-http/current/) - HTTPサーバー/クライアント\n- [http4s](https://http4s.org/) - 純粋関数型HTTPサーバー\n- [Tapir](https://tapir.softwaremill.com/) - HTTP APIの記述\n\n#### データ処理\n\n- [Spark](https://spark.apache.org/) - 大規模データ処理\n- [Akka Streams](https://doc.akka.io/docs/akka/current/stream/) - ストリーム処理\n- [FS2](https://fs2.io/) - 純粋関数型ストリーム\n- [Doobie](https://tpolecat.github.io/doobie/) - 純粋関数型JDBC層\n\n#### JSON処理\n\n- [Circe](https://circe.github.io/circe/) - 関数型JSONライブラリ\n- [Play JSON](https://github.com/playframework/play-json) - Play FrameworkのJSONライブラリ\n- [uPickle](https://github.com/com-lihaoyi/upickle) - 軽量なJSONライブラリ","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalarefs-01jpcvxfxmsb49cge8ewg55kag.md","loc":{"lines":{"from":85,"to":114}}}}],["106",{"pageContent":"#### テスト\n\n- [ScalaTest](https://www.scalatest.org/) - テストフレームワーク\n- [Specs2](https://etorreborre.github.io/specs2/) - テストフレームワーク\n- [MUnit](https://scalameta.org/munit/) - Scalaのテストライブラリ\n- [ScalaCheck](https://www.scalacheck.org/) - プロパティベーステスト\n\n### 開発ツール\n\n- [sbt](https://www.scala-sbt.org/) - Scalaビルドツール\n- [Mill](https://com-lihaoyi.github.io/mill/) - 代替ビルドツール\n- [Metals](https://scalameta.org/metals/) - Scala言語サーバー\n- [Scalafmt](https://scalameta.org/scalafmt/) - コードフォーマッター\n- [Scalafix](https://scalacenter.github.io/scalafix/) - リファクタリングツール\n\n## 書籍\n\n### 日本語書籍\n\n- [Scala逆引きレシピ](https://www.amazon.co.jp/dp/4798125415) - 実践的なScalaプログラミング\n- [Scalaスケーラブルプログラミング](https://www.amazon.co.jp/dp/4844330845) - Scala言語の詳細解説\n- [実践Scala入門](https://www.amazon.co.jp/dp/4297101416) - 実践的なScala入門\n\n### 英語書籍","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalarefs-01jpcvxfxmsb49cge8ewg55kag.md","loc":{"lines":{"from":116,"to":139}}}}],["107",{"pageContent":"### 英語書籍\n\n- [Programming in Scala](https://www.artima.com/shop/programming_in_scala_4ed) - Martin Oderskyらによる包括的な解説書\n- [Functional Programming in Scala](https://www.manning.com/books/functional-programming-in-scala) - 関数型プログラミングの原則\n- [Scala for the Impatient](https://horstmann.com/scala/) - 実践的な入門書\n- [Scala with Cats](https://underscore.io/books/scala-with-cats/) - Catsライブラリを使った関数型プログラミング\n\n## 企業事例\n\n- [Twitter](https://blog.twitter.com/engineering/en_us/topics/open-source/2019/twitter-open-source-update-scala.html) - TwitterでのScala活用\n- [Netflix](https://netflixtechblog.com/the-netflix-cosmos-platform-35c14d9351ad) - NetflixでのScala活用\n- [LinkedIn](https://engineering.linkedin.com/blog/2018/03/scala-at-linkedin) - LinkedInでのScala活用\n- [Zalando](https://engineering.zalando.com/posts/2018/10/zalando-scala-relentless-evolution.html) - ZalandoでのScala活用\n\n## 学習パス\n\n### 初心者向けロードマップ","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalarefs-01jpcvxfxmsb49cge8ewg55kag.md","loc":{"lines":{"from":139,"to":155}}}}],["108",{"pageContent":"## 学習パス\n\n### 初心者向けロードマップ\n\n1. [Tour of Scala](https://docs.scala-lang.org/tour/tour-of-scala.html)で基本を学ぶ\n2. [Scala Exercises](https://www.scala-exercises.org/)で演習\n3. [Scala School](https://twitter.github.io/scala_school/)で概念を深める\n4. 小さなプロジェクトを作成(CLIツール、簡単なWebアプリなど)\n\n### 中級者向けロードマップ\n\n1. [Functional Programming in Scala](https://www.manning.com/books/functional-programming-in-scala)で関数型プログラミングを学ぶ\n2. [Scala with Cats](https://underscore.io/books/scala-with-cats/)でCatsを学ぶ\n3. [Akka](https://akka.io/)や[Play Framework](https://www.playframework.com/)などのフレームワークを学ぶ\n4. 中規模のプロジェクトに取り組む(Webアプリ、データ処理パイプラインなど)\n\n### 上級者向けロードマップ\n\n1. [Advanced Scala with Cats](https://underscore.io/books/advanced-scala/)で高度な関数型プログラミングを学ぶ\n2. [ZIO](https://zio.dev/)や[http4s](https://http4s.org/)などの純粋関数型ライブラリを学ぶ\n3. [Scala High Performance Programming](https://www.packtpub.com/product/scala-high-performance-programming/9781786466044)でパフォーマンス最適化を学ぶ\n4. オープンソースプロジェクトに貢献する。\n\n## Scala 3 (Dotty)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalarefs-01jpcvxfxmsb49cge8ewg55kag.md","loc":{"lines":{"from":153,"to":176}}}}],["109",{"pageContent":"## Scala 3 (Dotty)\n\n- [Scala 3公式サイト](https://dotty.epfl.ch/) - Scala 3の公式サイト\n- [Scala 3ドキュメント](https://docs.scala-lang.org/scala3/) - Scala 3の公式ドキュメント\n- [Scala 3マイグレーションガイド](https://docs.scala-lang.org/scala3/guides/migration/compatibility-intro.html) - Scala 2からScala 3への移行ガイド\n- [Scala 3の新機能](https://docs.scala-lang.org/scala3/new-in-scala3.html) - Scala 3で追加された新機能の解説\n\n## 関連情報\n\n- [Scaladocの掟](scaladoc-01jpcvxfxmsb49cge8ewg55kah.md)\n- [Scalaコーディングスタイル](scalastyle-01jpcvxfxmsb49cge8ewg55kae.md)\n- [Scalaツール活用](scalatools-01jpcvxfxk935q9x97vbpfp9ta.md)\n- [Scalaコードレビュー](scalareview-01jpcvxfxmsb49cge8ewg55kaf.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalarefs-01jpcvxfxmsb49cge8ewg55kag.md","loc":{"lines":{"from":176,"to":188}}}}],["110",{"pageContent":"---\ndescription: scalareviewに関するドキュメント\nruleId: scalareview-01jpcvxfxmsb49cge8ewg55kaf\ntags:\n - development\n - coding\n - scala\naliases:\n - scala-code-review\n - scala-review-guidelines\nglobs:\n - '**/*.scala'\n---\n\n# Scalaコードレビュー\n\n## 基本原則\n\n- コードの品質と保守性を向上させることを目的とする。\n- 建設的なフィードバックを心がける。\n- 問題点だけでなく、良い点も指摘する。\n- 個人ではなくコードに焦点を当てる。\n- 「なぜ」と「どのように」の両方を説明する。\n\n## レビューの流れ\n\n1. **全体像の把握**。\n - コードの目的と設計を理解する。\n - 変更の範囲と影響を確認する。\n - テストの有無と品質を確認する。\n\n2. **詳細レビュー**。\n - コードの正確性を確認する。\n - パフォーマンスとリソース使用を評価する。\n - エラー処理の適切さを確認する。\n - コードスタイルとドキュメントを確認する。\n\n3. **フィードバック提供**。\n - 明確で具体的なコメントを提供する。\n - 重要な問題と軽微な問題を区別する。\n - 可能な場合は解決策を提案する。\n\n## チェックリスト\n\n### 関数型プログラミング\n\n#### イミュータビリティ\n\n- [ ] 可変状態(`var`)の使用は最小限に抑えられているか。\n- [ ] イミュータブルなデータ構造が適切に使用されているか。\n- [ ] 副作用は明示的に分離されているか。\n- [ ] 状態変更が必要な場合、新しいインスタンスを作成しているか。\n\n```scala\n// 良い例。\nval users = List(\"Alice\", \"Bob\")。\nval updatedUsers = users :+ \"Charlie\"\n\n// 避けるべき例。\nvar users = List(\"Alice\", \"Bob\")。\nusers = users :+ \"Charlie\"\n```\n\n#### 型の活用","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalareview-01jpcvxfxmsb49cge8ewg55kaf.md","loc":{"lines":{"from":1,"to":64}}}}],["111",{"pageContent":"```scala\n// 良い例。\nval users = List(\"Alice\", \"Bob\")。\nval updatedUsers = users :+ \"Charlie\"\n\n// 避けるべき例。\nvar users = List(\"Alice\", \"Bob\")。\nusers = users :+ \"Charlie\"\n```\n\n#### 型の活用\n\n- [ ] 豊富な型が使用されているか。\n- [ ] プリミティブ型の代わりにドメイン固有の型が定義されているか。\n- [ ] `Option`, `Either`, `Try`が適切に使用されているか。\n- [ ] 型パラメータが適切に活用されているか。\n\n```scala\n// 良い例。\ncase class UserId(value: String)\ncase class User(id: UserId, name: String)\n\ndef findUser(id: UserId): Option[User] = ???\n\n// 避けるべき例。\ndef findUser(id: String): User = {\n // nullを返す可能性がある。\n}\n```\n\n#### 関数合成\n\n- [ ] 高階関数が適切に使用されているか。\n- [ ] パターンマッチングが効果的に活用されているか。\n- [ ] for式とmap/flatMapが適切に使い分けられているか。\n- [ ] 部分適用と関数合成が適切に使用されているか。\n\n```scala\n// 良い例。\nval numbers = List(1, 2, 3, 4, 5)。\nval doubled = numbers.map(_ * 2)。\nval evenDoubled = numbers.filter(_ % 2 == 0).map(_ * 2)。\n\n// または。\nval result = for {。\n n <- numbers。\n if n % 2 == 0。\n} yield n * 2。\n```\n\n### エラー処理\n\n#### 型安全なエラー処理","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalareview-01jpcvxfxmsb49cge8ewg55kaf.md","loc":{"lines":{"from":54,"to":106}}}}],["112",{"pageContent":"// または。\nval result = for {。\n n <- numbers。\n if n % 2 == 0。\n} yield n * 2。\n```\n\n### エラー処理\n\n#### 型安全なエラー処理\n\n- [ ] 例外の代わりに戻り値の型でエラーが表現されているか。\n- [ ] `Either[Error, A]`が適切に使用されているか。\n- [ ] エラー型は具体的で意味のあるものか。\n- [ ] エラーメッセージは明確で有用か。\n\n```scala\n// 良い例。\nsealed trait UserError。\ncase class ValidationError(message: String) extends UserError\ncase class DatabaseError(cause: Throwable) extends UserError\n\ndef createUser(data: UserData): Either[UserError, User] = {\n // 実装。\n}\n\n// 避けるべき例。\ndef createUser(data: UserData): User = {\n if (!isValid(data)) {。\n throw new IllegalArgumentException(\"Invalid data\")。\n }\n // 実装。\n}\n```\n\n#### モナド変換子\n\n- [ ] モナドの組み合わせには適切なモナド変換子が使用されているか。\n- [ ] `EitherT`や`OptionT`が適切に使用されているか。\n- [ ] for式が読みやすく使用されているか。\n- [ ] エラーハンドリングが一貫しているか。\n\n```scala\n// 良い例。\nimport cats.data.EitherT。\nimport cats.implicits._。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalareview-01jpcvxfxmsb49cge8ewg55kaf.md","loc":{"lines":{"from":97,"to":142}}}}],["113",{"pageContent":"- [ ] モナドの組み合わせには適切なモナド変換子が使用されているか。\n- [ ] `EitherT`や`OptionT`が適切に使用されているか。\n- [ ] for式が読みやすく使用されているか。\n- [ ] エラーハンドリングが一貫しているか。\n\n```scala\n// 良い例。\nimport cats.data.EitherT。\nimport cats.implicits._。\n\ndef findUser(id: UserId): EitherT[Future, UserError, User] = {\n EitherT(userRepository.findById(id).map {。\n case Some(user) => Right(user)。\n case None => Left(UserNotFoundError(id))。\n })\n}\n\ndef getUserPermissions(user: User): EitherT[Future, UserError, Permissions] = {\n EitherT(permissionService.getPermissions(user.id).map(Right(_)))。\n}\n\nval result: EitherT[Future, UserError, Permissions] = for {\n user <- findUser(userId)。\n permissions <- getUserPermissions(user)。\n} yield permissions。\n```\n\n### 非同期処理\n\n#### Future\n\n- [ ] `Future`が適切に使用されているか。\n- [ ] `ExecutionContext`は明示的に渡されているか。\n- [ ] `Future`のネストは避けられているか。\n- [ ] 失敗した`Future`は適切に処理されているか。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalareview-01jpcvxfxmsb49cge8ewg55kaf.md","loc":{"lines":{"from":134,"to":168}}}}],["114",{"pageContent":"### 非同期処理\n\n#### Future\n\n- [ ] `Future`が適切に使用されているか。\n- [ ] `ExecutionContext`は明示的に渡されているか。\n- [ ] `Future`のネストは避けられているか。\n- [ ] 失敗した`Future`は適切に処理されているか。\n\n```scala\n// 良い例。\ndef processUser(userId: UserId)(implicit ec: ExecutionContext): Future[ProcessedUser] = {\n for {。\n user <- userRepository.findById(userId)。\n profile <- profileRepository.findByUserId(userId)。\n processed <- processingService.process(user, profile)。\n } yield processed。\n}\n\n// 避けるべき例。\ndef processUser(userId: UserId): Future[ProcessedUser] = {\n // 暗黙のExecutionContext。\n userRepository.findById(userId).flatMap { user =>。\n profileRepository.findByUserId(userId).flatMap { profile =>。\n processingService.process(user, profile)。\n }\n }\n}\n```\n\n#### ブロッキング処理\n\n- [ ] ブロッキング処理は専用の`ExecutionContext`で実行されているか。\n- [ ] ブロッキング処理は明示的にマークされているか。\n- [ ] 可能な限り非ブロッキングAPIが使用されているか。\n- [ ] 長時間実行される処理は適切に管理されているか。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalareview-01jpcvxfxmsb49cge8ewg55kaf.md","loc":{"lines":{"from":161,"to":196}}}}],["115",{"pageContent":"#### ブロッキング処理\n\n- [ ] ブロッキング処理は専用の`ExecutionContext`で実行されているか。\n- [ ] ブロッキング処理は明示的にマークされているか。\n- [ ] 可能な限り非ブロッキングAPIが使用されているか。\n- [ ] 長時間実行される処理は適切に管理されているか。\n\n```scala\n// 良い例。\nimplicit val blockingEc: ExecutionContext = \n ExecutionContext.fromExecutor(Executors.newFixedThreadPool(5))。\n\ndef readLargeFile(path: String): Future[String] = Future {\n // ブロッキング処理。\n scala.io.Source.fromFile(path).mkString。\n}(blockingEc)。\n```\n\n### コード品質\n\n#### 可読性\n\n- [ ] 変数名と関数名は明確で意味があるか。\n- [ ] コードは適切に構造化されているか。\n- [ ] 複雑な処理には適切なコメントがあるか。\n- [ ] マジックナンバーは避けられているか。\n\n```scala\n// 良い例。\nval MaxRetryCount = 3。\nval RetryDelayMs = 100。\n\ndef fetchWithRetry(url: String): Future[Response] = {\n def attempt(retries: Int): Future[Response] = {\n httpClient.get(url).recoverWith {。\n case NonFatal(e) if retries < MaxRetryCount =>。\n logger.warn(s\"Request failed, retrying (${retries + 1}/$MaxRetryCount)\")。\n Thread.sleep(RetryDelayMs)。\n attempt(retries + 1)。\n }\n }\n \n attempt(0)。\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalareview-01jpcvxfxmsb49cge8ewg55kaf.md","loc":{"lines":{"from":191,"to":234}}}}],["116",{"pageContent":"// 避けるべき例。\ndef fetch(url: String): Future[Response] = {\n def retry(n: Int): Future[Response] = {\n httpClient.get(url).recoverWith {。\n case NonFatal(e) if n < 3 =>。\n Thread.sleep(100)。\n retry(n + 1)。\n }\n }\n \n retry(0)。\n}\n```\n\n#### テスト\n\n- [ ] 適切なテストカバレッジがあるか。\n- [ ] テストは独立していて再現可能か。\n- [ ] エッジケースはテストされているか。\n- [ ] テストは明確で理解しやすいか。\n\n```scala\n// 良い例。\n\"UserService\" should \"return user when valid ID is provided\" in {。\n // Arrange。\n val userId = UserId(\"123\")。\n val user = User(userId, \"test@example.com\")。\n when(mockRepository.findById(userId)).thenReturn(Future.successful(Some(user)))。\n \n // Act。\n val result = userService.findUser(userId).futureValue。\n \n // Assert。\n result shouldBe Some(user)。\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalareview-01jpcvxfxmsb49cge8ewg55kaf.md","loc":{"lines":{"from":236,"to":270}}}}],["117",{"pageContent":"\"UserService\" should \"return None when user is not found\" in {。\n // Arrange。\n val userId = UserId(\"456\")。\n when(mockRepository.findById(userId)).thenReturn(Future.successful(None))。\n \n // Act。\n val result = userService.findUser(userId).futureValue。\n \n // Assert。\n result shouldBe None。\n}\n```\n\n#### ドキュメント\n\n- [ ] パブリックAPIには適切なScaladocがあるか。\n- [ ] ドキュメントには例が含まれているか。\n- [ ] 複雑な処理や非自明な動作は説明されているか。\n- [ ] ドキュメントは[Scaladocの掟](scaladoc-01jpcvxfxmsb49cge8ewg55kah.md)に従っているか\n\n```scala\n/**\n * ユーザー情報を管理するサービス。\n *\n * このサービスはユーザーの検索、作成、更新、削除機能を提供します。\n * すべての操作はトランザクション内で実行され、結果は非同期で返されます。\n *\n * @param repository ユーザー情報を格納するリポジトリ。\n * @param validator ユーザーデータの検証するバリデーター。\n */\nclass UserService(。\n repository: UserRepository,\n validator: UserValidator\n) {\n // 実装。\n}\n```\n\n### API設計\n\n#### インタフェース\n\n- [ ] APIは使いやすく直感的か。\n- [ ] メソッドのシグネチャは明確で一貫しているか。\n- [ ] トレイトの設計は適切か。\n- [ ] 依存性は明示的に宣言されているか。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalareview-01jpcvxfxmsb49cge8ewg55kaf.md","loc":{"lines":{"from":272,"to":317}}}}],["118",{"pageContent":"### API設計\n\n#### インタフェース\n\n- [ ] APIは使いやすく直感的か。\n- [ ] メソッドのシグネチャは明確で一貫しているか。\n- [ ] トレイトの設計は適切か。\n- [ ] 依存性は明示的に宣言されているか。\n\n```scala\n// 良い例。\ntrait UserRepository {。\n def findById(id: UserId): Future[Option[User]]\n def save(user: User): Future[User]\n def delete(id: UserId): Future[Boolean]\n}\n\n// 避けるべき例。\ntrait Repo {。\n def find(id: String): Option[User] // 非同期処理がない\n def save(user: User): Boolean // 成功/失敗の理由が不明確\n def remove(id: String): Boolean // 命名が一貫していない (delete vs remove)\n}\n```\n\n#### 型システム\n\n- [ ] 代数的データ型(ADT)は適切に使用されているか。\n- [ ] トレイト階層は適切に設計されているか。\n- [ ] 型パラメータは明確で意味があるか。\n- [ ] 型クラスは適切に使用されているか。\n\n```scala\n// 良い例。\nsealed trait PaymentMethod。\ncase class CreditCard(number: String, expiry: YearMonth, cvv: String) extends PaymentMethod\ncase class BankTransfer(accountNumber: String, bankCode: String) extends PaymentMethod\ncase class DigitalWallet(provider: String, accountId: String) extends PaymentMethod","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalareview-01jpcvxfxmsb49cge8ewg55kaf.md","loc":{"lines":{"from":310,"to":347}}}}],["119",{"pageContent":"def processPayment(amount: Money, method: PaymentMethod): Future[PaymentResult] = {\n method match {。\n case CreditCard(number, expiry, cvv) => processCreditCardPayment(amount, number, expiry, cvv)。\n case BankTransfer(account, code) => processBankTransfer(amount, account, code)。\n case DigitalWallet(provider, id) => processDigitalWalletPayment(amount, provider, id)。\n }\n}\n```\n\n### パフォーマンス\n\n#### リソース管理\n\n- [ ] リソースは適切に解放されているか。\n- [ ] メモリ使用量は適切か。\n- [ ] コネクションプールは適切に管理されているか。\n- [ ] ファイルハンドルやネットワーク接続は適切にクローズされるか。\n\n```scala\n// 良い例。\ndef readFile(path: String): Try[String] = {\n val source = Source.fromFile(path)。\n try {。\n Success(source.mkString)。\n } catch {。\n case NonFatal(e) => Failure(e)。\n } finally {。\n source.close()。\n }\n}\n\n// または。\ndef readFile(path: String): Try[String] = {\n Using(Source.fromFile(path)) { source =>。\n source.mkString。\n }\n}\n```\n\n#### 最適化\n\n- [ ] 不必要なオブジェクト生成は避けられているか。\n- [ ] コレクション操作は効率的か。\n- [ ] 再帰は末尾再帰になっているか。\n- [ ] ホットスポットは最適化されているか。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalareview-01jpcvxfxmsb49cge8ewg55kaf.md","loc":{"lines":{"from":349,"to":393}}}}],["120",{"pageContent":"#### 最適化\n\n- [ ] 不必要なオブジェクト生成は避けられているか。\n- [ ] コレクション操作は効率的か。\n- [ ] 再帰は末尾再帰になっているか。\n- [ ] ホットスポットは最適化されているか。\n\n```scala\n// 良い例 (末尾再帰)。\ndef factorial(n: Int): BigInt = {\n @tailrec。\n def loop(n: Int, acc: BigInt): BigInt = {\n if (n <= 1) acc。\n else loop(n - 1, n * acc)。\n }\n \n loop(n, 1)。\n}\n\n// 避けるべき例 (非末尾再帰)。\ndef factorial(n: Int): BigInt = {\n if (n <= 1) 1。\n else n * factorial(n - 1) // スタックオーバーフローの可能性。\n}\n```\n\n### セキュリティ\n\n- [ ] ユーザー入力は適切に検証されているか。\n- [ ] 機密情報は適切に保護されているか。\n- [ ] SQLインジェクションやXSSなどの脆弱性は対策されているか。\n- [ ] 認証と認可は適切に実装されているか。\n\n```scala\n// 良い例 (SQLインジェクション対策)。\ndef findUserByName(name: String): Future[Option[User]] = {\n val query = sql\"SELECT * FROM users WHERE name = $name\"。\n database.run(query.map(_.headOption))。\n}\n\n// 避けるべき例。\ndef findUserByName(name: String): Future[Option[User]] = {\n val query = s\"SELECT * FROM users WHERE name = '$name'\" // SQLインジェクションの脆弱性。\n database.run(query)。\n}\n```\n\n## レビューコメントの書き方\n\n### 効果的なフィードバック","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalareview-01jpcvxfxmsb49cge8ewg55kaf.md","loc":{"lines":{"from":388,"to":437}}}}],["121",{"pageContent":"## レビューコメントの書き方\n\n### 効果的なフィードバック\n\n- 具体的な問題点を指摘する。\n- 理由を説明する。\n- 改善案を提案する。\n- 肯定的な側面も指摘する。\n\n```\n// 良いフィードバック例。\nこの部分では `Option` の代わりに例外を使用していますが、これは型安全性を損なう可能性があります。\nユーザーが見つからない場合は、例外をスローするのではなく `Option[User]` を返すことを検討してください。\nこれにより、呼び出し元は戻り値の型からユーザーが存在しない可能性を認識でき、適切に処理できます。\n\n例えば:\n```scala\ndef findUser(id: UserId): Option[User] = {\n userRepository.findById(id)。\n}\n```\n\n// 悪いフィードバック例。\n例外を使わないでください。\n\n```\n\n### 優先順位付け\n\n- 重大な問題(正確性、セキュリティ、パフォーマンス)を最優先する。\n- 中程度の問題(API設計、エラー処理)を次に優先する。\n- 軽微な問題(スタイル、ドキュメント)は最後に扱う。\n\n## レビュー後のフォローアップ\n\n- 修正されたコードを再確認する。\n- 未解決の問題を追跡する。\n- 学んだ教訓をチームで共有する。\n- 必要に応じてコーディングガイドラインを更新する。\n\n## 関連情報\n\n- [Scala Style Guide](https://docs.scala-lang.org/style/)\n- [Effective Scala](https://twitter.github.io/effectivescala/)\n- [Scaladocの掟](scaladoc-01jpcvxfxmsb49cge8ewg55kah.md)\n- [Scalaコーディングスタイル](scalastyle-01jpcvxfxmsb49cge8ewg55kae.md)\n- [Scalaツール活用](scalatools-01jpcvxfxk935q9x97vbpfp9ta.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalareview-01jpcvxfxmsb49cge8ewg55kaf.md","loc":{"lines":{"from":435,"to":481}}}}],["122",{"pageContent":"---\ndescription: scalastyleに関するドキュメント\nruleId: scalastyle-01jpcvxfxmsb49cge8ewg55kae\ntags:\n - development\n - coding\n - scala\naliases:\n - scala-style-guide\n - scala-coding-conventions\nglobs:\n - '**/*.scala'\n---\n\n# Scalaコーディングスタイル\n\n## 基本原則\n\n- [Scala Style Guide](https://docs.scala-lang.org/style/)に従う\n- 可読性と保守性を最優先する。\n- 関数型プログラミングの原則を重視する。\n- 型安全性を確保する。\n\n## 命名規則\n\n### 基本ルール\n\n- クラス名、トレイト名はパスカルケース。\n - 例: `UserService`, `HttpClient`, `JsonParser`。\n- メソッド名、変数名はキャメルケース。\n - 例: `getUserData`, `parseJson`, `isValid`。\n- 定数は大文字のスネークケース。\n - 例: `MAX_RETRY_COUNT`, `DEFAULT_TIMEOUT`。\n- パッケージ名は小文字のドット区切り。\n - 例: `com.example.project.module`。\n\n### 特殊なケース\n\n- 型パラメータは意味のある名前を使用する。\n - 単純な場合: `A` `B` `C`ではなく`T` `U` `V`を使用。\n - 複雑な場合: `Key`, `Value`, `Element`など具体的な名前。\n- 関数型プログラミングでの慣習に従う。\n - 関数型の変換メソッドは`map`, `flatMap`, `filter`などの標準名を使用。\n - 副作用のあるメソッドは命令形の動詞で始める。\n - 述語関数は`is`, `has`, `can`などで始める。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalastyle-01jpcvxfxmsb49cge8ewg55kae.md","loc":{"lines":{"from":1,"to":45}}}}],["123",{"pageContent":"```scala\n// 良い例。\ndef getUserById(id: UserId): Option[User]\ndef isValidEmail(email: String): Boolean\ndef mapToDto(entity: Entity): EntityDto\n\n// 避けるべき例。\ndef getUser(id: UserId): Option[User] // 曖昧な名前\ndef validEmail(email: String): Boolean // 動詞/形容詞が不明確\ndef userToDto(entity: Entity): EntityDto // 一貫性のない命名\n```\n\n## コード構造\n\n### ファイル構成\n\n- 1ファイルにつき1つのクラス/トレイト/オブジェクトを基本とする。\n- ファイル名はクラス名と一致させる。\n- 関連する小さなクラスは同じファイルに配置してもよい。\n- ファイルの長さは500行を超えないようにする。\n\n### クラス構造\n\n- フィールド、メソッド、内部クラスの順に配置する。\n- 公開APIを先頭に配置し、プライベートメソッドは後方に配置する。\n- 関連するメソッドをグループ化する。\n- メソッドの長さは30行を超えないようにする。\n- case classは継承を防ぐために `final case class` として定義する。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalastyle-01jpcvxfxmsb49cge8ewg55kae.md","loc":{"lines":{"from":47,"to":74}}}}],["124",{"pageContent":"### クラス構造\n\n- フィールド、メソッド、内部クラスの順に配置する。\n- 公開APIを先頭に配置し、プライベートメソッドは後方に配置する。\n- 関連するメソッドをグループ化する。\n- メソッドの長さは30行を超えないようにする。\n- case classは継承を防ぐために `final case class` として定義する。\n\n```scala\nclass UserService(repository: UserRepository, validator: UserValidator) {\n // 公開メソッド。\n def findUser(id: UserId): Future[Option[User]] = {\n repository.findById(id)。\n }\n \n def createUser(data: UserData): Future[Either[ValidationError, User]] = {\n for {。\n validationResult <- validateUser(data)。\n result <- validationResult match {。\n case Right(validData) => saveUser(validData)。\n case Left(error) => Future.successful(Left(error))。\n }\n } yield result。\n }\n \n // プライベートメソッド。\n private def validateUser(data: UserData): Future[Either[ValidationError, UserData]] = {\n Future.successful(validator.validate(data))。\n }\n \n private def saveUser(data: UserData): Future[Either[ValidationError, User]] = {\n repository.save(data.toUser).map(Right(_))。\n }\n}\n```\n\n## 関数型プログラミング","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalastyle-01jpcvxfxmsb49cge8ewg55kae.md","loc":{"lines":{"from":68,"to":104}}}}],["125",{"pageContent":"## 関数型プログラミング\n\n### イミュータビリティ\n\n- 可能な限りイミュータブルなデータ構造を使用する。\n- `var`の使用は避け、`val`を優先する。\n- 定数は `final val` で定義して再定義を防ぐ。\n- コレクションは不変(immutable)版を使用する。\n- 状態変更が必要な場合は、新しいインスタンスを作成する。\n\n```scala\n// 良い例。\nval users = List(\"Alice\", \"Bob\", \"Charlie\")。\nval updatedUsers = users :+ \"Dave\"\n\n// 避けるべき例。\nvar users = List(\"Alice\", \"Bob\", \"Charlie\")。\nusers = users :+ \"Dave\"\n```\n\n### 副作用の管理\n\n- 副作用は可能な限り避ける。\n- 副作用が必要な場合は、明示的に分離する。\n- IO操作やデータベースアクセスなどの副作用は境界に押し込める。\n- 純粋関数と副作用のある関数を明確に区別する。\n\n```scala\n// 良い例。\ndef processData(data: Data): ProcessedData = {\n // 純粋な変換処理。\n}\n\ndef saveProcessedData(data: ProcessedData): Future[Unit] = {\n // 副作用(データベース保存)\n repository.save(data)。\n}\n\n// 避けるべき例。\ndef processAndSaveData(data: Data): Future[Unit] = {\n // 処理と保存が混在している。\n val processed = transform(data)。\n repository.save(processed)。\n}\n```\n\n### 型の活用\n\n- 豊富な型を使用して意図を明確にする。\n- プリミティブ型の代わりにドメイン固有の型を定義する。\n- `Option`, `Either`, `Try`を適切に使用する。\n- 型パラメータを活用して汎用的なコードを書く。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalastyle-01jpcvxfxmsb49cge8ewg55kae.md","loc":{"lines":{"from":104,"to":155}}}}],["126",{"pageContent":"### 型の活用\n\n- 豊富な型を使用して意図を明確にする。\n- プリミティブ型の代わりにドメイン固有の型を定義する。\n- `Option`, `Either`, `Try`を適切に使用する。\n- 型パラメータを活用して汎用的なコードを書く。\n\n```scala\n// 良い例。\ncase class UserId(value: String)\ncase class Email(value: String)\ncase class User(id: UserId, email: Email)\n\n// 避けるべき例。\ncase class User(id: String, email: String)\n```\n\n## エラー処理\n\n### 型安全なエラー処理\n\n- 例外は可能な限り避け、戻り値の型でエラーを表現する。\n- `Either[Error, A]`を使用して失敗の可能性を型で表現する。\n- `Validated`を使用してエラーを蓄積する。\n- カスタムエラー型を定義して、エラーを明確に表現する。\n\n```scala\n// 良い例。\nsealed trait UserError。\ncase class ValidationError(message: String) extends UserError\ncase class DatabaseError(cause: Throwable) extends UserError\n\ndef createUser(data: UserData): Either[UserError, User] = {\n // 実装。\n}\n\n// 避けるべき例。\ndef createUser(data: UserData): User = {\n if (!isValid(data)) {。\n throw new IllegalArgumentException(\"Invalid data\")。\n }\n // 実装。\n}\n```\n\n### モナド変換子","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalastyle-01jpcvxfxmsb49cge8ewg55kae.md","loc":{"lines":{"from":150,"to":195}}}}],["127",{"pageContent":"// 避けるべき例。\ndef createUser(data: UserData): User = {\n if (!isValid(data)) {。\n throw new IllegalArgumentException(\"Invalid data\")。\n }\n // 実装。\n}\n```\n\n### モナド変換子\n\n- モナドの組み合わせには適切なモナド変換子を使用する。\n- `EitherT`を使用して`Future[Either[A, B]]`を扱う。\n- `OptionT`を使用して`Future[Option[A]]`を扱う。\n- cats-effectやZIOなどのライブラリを検討する。\n\n```scala\n// 良い例。\nimport cats.data.EitherT。\nimport cats.implicits._。\n\ndef findUser(id: UserId): EitherT[Future, UserError, User] = {\n EitherT(userRepository.findById(id).map {。\n case Some(user) => Right(user)。\n case None => Left(UserNotFoundError(id))。\n })\n}\n\ndef getUserPermissions(user: User): EitherT[Future, UserError, Permissions] = {\n EitherT(permissionService.getPermissions(user.id).map(Right(_)))。\n}\n\nval result: EitherT[Future, UserError, Permissions] = for {\n user <- findUser(userId)。\n permissions <- getUserPermissions(user)。\n} yield permissions。\n```\n\n## 非同期処理\n\n### Future","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalastyle-01jpcvxfxmsb49cge8ewg55kae.md","loc":{"lines":{"from":186,"to":226}}}}],["128",{"pageContent":"val result: EitherT[Future, UserError, Permissions] = for {\n user <- findUser(userId)。\n permissions <- getUserPermissions(user)。\n} yield permissions。\n```\n\n## 非同期処理\n\n### Future\n\n- `Future`を使用して非同期処理を表現する。\n- `ExecutionContext`は明示的に渡す。\n- `Future`のネストを避け、for式やモナド変換子を使用する。\n- 失敗したFutureの処理を忘れない。\n\n```scala\n// 良い例。\ndef processUser(userId: UserId)(implicit ec: ExecutionContext): Future[ProcessedUser] = {\n for {。\n user <- userRepository.findById(userId)。\n profile <- profileRepository.findByUserId(userId)。\n processed <- processingService.process(user, profile)。\n } yield processed。\n}\n\n// 避けるべき例。\ndef processUser(userId: UserId): Future[ProcessedUser] = {\n // 暗黙のExecutionContext。\n userRepository.findById(userId).flatMap { user =>。\n profileRepository.findByUserId(userId).flatMap { profile =>。\n processingService.process(user, profile)。\n }\n }\n}\n```\n\n### ブロッキング処理\n\n- ブロッキング処理は専用のExecutionContextで実行する。\n- ブロッキング処理は明示的にマークする。\n- 可能な限り非ブロッキングAPIを使用する。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalastyle-01jpcvxfxmsb49cge8ewg55kae.md","loc":{"lines":{"from":218,"to":258}}}}],["129",{"pageContent":"### ブロッキング処理\n\n- ブロッキング処理は専用のExecutionContextで実行する。\n- ブロッキング処理は明示的にマークする。\n- 可能な限り非ブロッキングAPIを使用する。\n\n```scala\n// 良い例。\nimplicit val blockingEc: ExecutionContext = \n ExecutionContext.fromExecutor(Executors.newFixedThreadPool(5))。\n\ndef readLargeFile(path: String): Future[String] = Future {\n // ブロッキング処理。\n scala.io.Source.fromFile(path).mkString。\n}(blockingEc)。\n```\n\n## テスト\n\n### テスト構造\n\n- テストは明確な構造に従う(Arrange-Act-Assert)\n- テストケースは独立していて再現可能にする。\n- テスト名は何をテストしているかを明確に示す。\n- テストヘルパーを活用して重複を減らす。\n\n```scala\n// 良い例。\n\"UserService\" should \"return user when valid ID is provided\" in {。\n // Arrange。\n val userId = UserId(\"123\")。\n val user = User(userId, \"test@example.com\")。\n when(mockRepository.findById(userId)).thenReturn(Future.successful(Some(user)))。\n \n // Act。\n val result = userService.findUser(userId).futureValue。\n \n // Assert。\n result shouldBe Some(user)。\n}\n```\n\n### モックとスタブ\n\n- モックは必要最小限に抑える。\n- テスト用の実装を提供できる場合はスタブを使用する。\n- モックの期待値設定は明示的に行う。\n- モックフレームワーク(ScalaTest, Mockito)を適切に使用する。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalastyle-01jpcvxfxmsb49cge8ewg55kae.md","loc":{"lines":{"from":254,"to":301}}}}],["130",{"pageContent":"### モックとスタブ\n\n- モックは必要最小限に抑える。\n- テスト用の実装を提供できる場合はスタブを使用する。\n- モックの期待値設定は明示的に行う。\n- モックフレームワーク(ScalaTest, Mockito)を適切に使用する。\n\n```scala\n// 良い例。\nval mockRepository = mock[UserRepository]。\nwhen(mockRepository.findById(any[UserId])).thenReturn(Future.successful(None))。\n\n// テスト用スタブ。\nclass InMemoryUserRepository extends UserRepository {。\n private var users: Map[UserId, User] = Map.empty\n \n def findById(id: UserId): Future[Option[User]] = \n Future.successful(users.get(id))。\n \n def save(user: User): Future[User] = {\n users = users + (user.id -> user)。\n Future.successful(user)。\n }\n}\n```\n\n## ライブラリとフレームワーク\n\n### 標準ライブラリ\n\n- Scalaの標準ライブラリを十分に理解し活用する。\n- コレクションAPIを適切に使用する。\n- 標準ライブラリで提供されている機能を再実装しない。\n- Java標準ライブラリとの相互運用性を理解する。\n\n### サードパーティライブラリ\n\n- 一貫したライブラリセットを使用する。\n- 広く使われている信頼性の高いライブラリを選択する。\n- ライブラリの依存関係を最小限に保つ。\n- ライブラリのバージョンを定期的に更新する。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalastyle-01jpcvxfxmsb49cge8ewg55kae.md","loc":{"lines":{"from":296,"to":336}}}}],["131",{"pageContent":"### サードパーティライブラリ\n\n- 一貫したライブラリセットを使用する。\n- 広く使われている信頼性の高いライブラリを選択する。\n- ライブラリの依存関係を最小限に保つ。\n- ライブラリのバージョンを定期的に更新する。\n\n```scala\n// build.sbtの例。\nlibraryDependencies ++= Seq(。\n \"org.typelevel\" %% \"cats-core\" % \"2.9.0\",。\n \"org.typelevel\" %% \"cats-effect\" % \"3.4.8\",。\n \"io.circe\" %% \"circe-core\" % \"0.14.5\",。\n \"io.circe\" %% \"circe-generic\" % \"0.14.5\",。\n \"io.circe\" %% \"circe-parser\" % \"0.14.5\"。\n)\n```\n\n## ドキュメント\n\n- 公開APIには適切なScaladocを付ける。\n- 複雑なアルゴリズムや非自明なコードには説明を追加する。\n- サンプルコードを提供する。\n- 詳細は[Scaladocの掟](scaladoc-01jpcvxfxmsb49cge8ewg55kah.md)を参照\n\n```scala\n/**\n * ユーザー情報を管理するサービス。\n *\n * このサービスはユーザーの検索、作成、更新、削除機能を提供します。\n * すべての操作はトランザクション内で実行され、結果は非同期で返されます。\n *\n * @param repository ユーザー情報を格納するリポジトリ。\n * @param validator ユーザーデータの検証するバリデーター。\n */\nclass UserService(。\n repository: UserRepository,\n validator: UserValidator\n) {\n // 実装。\n}\n```\n\n## 関連情報","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalastyle-01jpcvxfxmsb49cge8ewg55kae.md","loc":{"lines":{"from":331,"to":374}}}}],["132",{"pageContent":"## 関連情報\n\n- [Scala Style Guide](https://docs.scala-lang.org/style/)\n- [Effective Scala](https://twitter.github.io/effectivescala/)\n- [Scaladocの掟](scaladoc-01jpcvxfxmsb49cge8ewg55kah.md)\n- [Scalaツール活用](scalatools-01jpcvxfxk935q9x97vbpfp9ta.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalastyle-01jpcvxfxmsb49cge8ewg55kae.md","loc":{"lines":{"from":374,"to":379}}}}],["133",{"pageContent":"---\ndescription: scalatoolsに関するドキュメント\nruleId: scalatools-01jpcvxfxk935q9x97vbpfp9ta\ntags:\n - development\n - coding\n - scala\naliases:\n - scala-tools\n - scala-ecosystem\nglobs:\n - '**/*.scala'\n---\n\n# Scalaツール活用\n\n## ビルドツール\n\n### sbt (Scala Build Tool)\n\nScalaの標準的なビルドツールです。プロジェクトの依存関係管理、コンパイル、テスト、パッケージング、公開などを行います。\n\n```bash\n# 新しいプロジェクトの作成\nsbt new scala/scala-seed.g8。\n\n# コンパイル\nsbt compile。\n\n# テスト実行\nsbt test。\n\n# 継続的コンパイル\nsbt ~compile。\n\n# 依存関係の更新\nsbt update。\n\n# パッケージの作成\nsbt package。\n```\n\n#### sbt設定例\n\n```scala\n// build.sbt。\nname := \"my-project\"\nversion := \"0.1.0\"\nscalaVersion := \"2.13.10\"\n\nlibraryDependencies ++= Seq(。\n \"org.typelevel\" %% \"cats-core\" % \"2.9.0\",。\n \"org.scalatest\" %% \"scalatest\" % \"3.2.15\" % Test。\n)\n\n// マルチプロジェクト設定。\nlazy val core = project。\n .in(file(\"core\"))。\n .settings(。\n name := \"my-project-core\",\n libraryDependencies ++= coreDependencies。\n )","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalatools-01jpcvxfxk935q9x97vbpfp9ta.md","loc":{"lines":{"from":1,"to":62}}}}],["134",{"pageContent":"// マルチプロジェクト設定。\nlazy val core = project。\n .in(file(\"core\"))。\n .settings(。\n name := \"my-project-core\",\n libraryDependencies ++= coreDependencies。\n )\n\nlazy val api = project。\n .in(file(\"api\"))。\n .dependsOn(core)。\n .settings(。\n name := \"my-project-api\",\n libraryDependencies ++= apiDependencies。\n )\n\nlazy val root = project。\n .in(file(\".\"))。\n .aggregate(core, api)。\n```\n\n### Mill\n\nsbtの代替となる高速なビルドツールです。\n\n```bash\n# 新しいプロジェクトの作成\nmill init。\n\n# コンパイル\nmill foo.compile。\n\n# テスト実行\nmill foo.test。\n\n# 実行\nmill foo.run。\n\n# REPL起動\nmill -i foo.repl。\n```\n\n#### Mill設定例\n\n```scala\n// build.sc。\nimport mill._。\nimport mill.scalalib._。\n\nobject foo extends ScalaModule {。\n def scalaVersion = \"2.13.10\"。\n \n def ivyDeps = Agg(。\n ivy\"org.typelevel::cats-core:2.9.0\"\n )\n \n object test extends Tests {。\n def ivyDeps = Agg(。\n ivy\"org.scalatest::scalatest:3.2.15\"\n )\n def testFramework = \"org.scalatest.tools.Framework\"。\n }\n}\n```\n\n## コード品質ツール\n\n### Scalafmt","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalatools-01jpcvxfxk935q9x97vbpfp9ta.md","loc":{"lines":{"from":56,"to":123}}}}],["135",{"pageContent":"## コード品質ツール\n\n### Scalafmt\n\nScalaコードのフォーマッターです。一貫したコードスタイルを維持するために使用します。\n\n```bash\n# sbtプラグインとして追加\n// project/plugins.sbt。\naddSbtPlugin(\"org.scalameta\" % \"sbt-scalafmt\" % \"2.5.0\")。\n\n# コードのフォーマット\nsbt scalafmt。\n\n# テストコードのフォーマット\nsbt Test/scalafmt。\n\n# フォーマットチェック\nsbt scalafmtCheck。\n```\n\n#### Scalafmt設定例\n\n```hocon\n// .scalafmt.conf。\nversion = \"3.7.3\"。\nrunner.dialect = scala213。\nmaxColumn = 100。\nalign.preset = more。\nrewrite.rules = [。\n AvoidInfix,。\n RedundantBraces,。\n RedundantParens,。\n SortModifiers。\n]\n```\n\n### Scalafix\n\nScalaコードの自動リファクタリングと静的解析するツールです。\n\n```bash\n# sbtプラグインとして追加\n// project/plugins.sbt。\naddSbtPlugin(\"ch.epfl.scala\" % \"sbt-scalafix\" % \"0.10.4\")。\n\n# ルールの適用\nsbt \"scalafix RemoveUnused\"。\n\n# すべてのルールの適用\nsbt \"scalafix\"。\n\n# 特定のファイルにルールを適用\nsbt \"scalafix RemoveUnused src/main/scala/Fix.scala\"。\n```\n\n#### Scalafix設定例\n\n```hocon\n// .scalafix.conf。\nrules = [。\n DisableSyntax,。\n LeakingImplicitClassVal,。\n NoValInForComprehension,。\n ProcedureSyntax,。\n RemoveUnused。\n]","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalatools-01jpcvxfxk935q9x97vbpfp9ta.md","loc":{"lines":{"from":121,"to":187}}}}],["136",{"pageContent":"#### Scalafix設定例\n\n```hocon\n// .scalafix.conf。\nrules = [。\n DisableSyntax,。\n LeakingImplicitClassVal,。\n NoValInForComprehension,。\n ProcedureSyntax,。\n RemoveUnused。\n]\n\nDisableSyntax.noVars = true。\nDisableSyntax.noNulls = true。\nDisableSyntax.noReturns = true。\nDisableSyntax.noWhileLoops = true。\n```\n\n### Wartremover\n\nコンパイル時にコード内の潜在的な問題を検出するツールです。\n\n```bash\n# sbtプラグインとして追加\n// project/plugins.sbt。\naddSbtPlugin(\"org.wartremover\" % \"sbt-wartremover\" % \"3.1.3\")。\n\n# build.sbtでの設定\nwartremoverErrors ++= Warts.unsafe。\n```\n\n#### Wartremover設定例\n\n```scala\n// build.sbt。\nwartremoverErrors ++= Seq(。\n Wart.Any,。\n Wart.Null,。\n Wart.Return,。\n Wart.Var,。\n Wart.Throw。\n)\n\n// 特定のファイルを除外。\nwartremoverExcluded += baseDirectory.value / \"src\" / \"main\" / \"scala\" / \"legacy\"。\n```\n\n## 開発支援ツール\n\n### Metals\n\nScalaの言語サーバープロトコル(LSP)実装です。VSCode、Vim、Emacsなどのエディタと統合して、コード補完、定義ジャンプ、リファクタリングなどの機能を提供します。\n\n```bash\n# VSCodeの場合、Metals拡張機能をインストール\n# https://marketplace.visualstudio.com/items?itemName=scalameta.metals","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalatools-01jpcvxfxk935q9x97vbpfp9ta.md","loc":{"lines":{"from":177,"to":232}}}}],["137",{"pageContent":"```bash\n# VSCodeの場合、Metals拡張機能をインストール\n# https://marketplace.visualstudio.com/items?itemName=scalameta.metals\n\n# Coursierを使用してMetalsをインストール\ncs install metals。\n```\n\n#### Metals機能\n\n- コード補完。\n- 定義へのジャンプ。\n- 型情報の表示。\n- リファクタリング。\n- インラインエラー表示。\n- コードフォーマット(Scalafmtと統合)\n\n### IntelliJ IDEA with Scala Plugin\n\nJetBrainsのIDEであるIntelliJ IDEAにScalaプラグインを追加して使用します。\n\n#### 主な機能\n\n- 高度なコード補完。\n- リファクタリングツール。\n- デバッガ。\n- テスト実行とカバレッジ。\n- sbtとの統合。\n- Scalafmtとの統合。\n\n### Ammonite REPL\n\n高機能なScala REPLです。インポート、自動補完、複数行編集などの機能を提供します。\n\n```bash\n# インストール\ncs install ammonite。\n\n# 起動\namm。\n\n# スクリプト実行\namm script.sc。\n```\n\n#### Ammonite使用例\n\n```scala\n// REPLでの使用。\n@ import $ivy.`org.typelevel::cats-core:2.9.0`\n@ import cats.implicits._。\n@ List(1, 2, 3).map(_ + 1)。\nres0: List[Int] = List(2, 3, 4)\n\n// スクリプトファイル (script.sc)。\n#!/usr/bin/env amm\n\nimport $ivy.`org.typelevel::cats-core:2.9.0`\nimport cats.implicits._。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalatools-01jpcvxfxk935q9x97vbpfp9ta.md","loc":{"lines":{"from":230,"to":288}}}}],["138",{"pageContent":"// スクリプトファイル (script.sc)。\n#!/usr/bin/env amm\n\nimport $ivy.`org.typelevel::cats-core:2.9.0`\nimport cats.implicits._。\n\n@main。\ndef main(args: String*) = {\n println(s\"Arguments: ${args.mkString(\", \")}\")\n List(1, 2, 3).map(_ + 1).foreach(println)。\n}\n```\n\n## テストツール\n\n### ScalaTest\n\nScalaの主要なテストフレームワークです。様々なテストスタイルをサポートしています。\n\n```scala\n// build.sbtでの依存関係。\nlibraryDependencies += \"org.scalatest\" %% \"scalatest\" % \"3.2.15\" % Test。\n\n// テスト例。\nimport org.scalatest._。\nimport org.scalatest.flatspec.AnyFlatSpec。\nimport org.scalatest.matchers.should.Matchers。\n\nclass CalculatorSpec extends AnyFlatSpec with Matchers {。\n \"A Calculator\" should \"add two numbers\" in {。\n Calculator.add(1, 2) should be (3)。\n }\n \n it should \"subtract two numbers\" in {。\n Calculator.subtract(5, 2) should be (3)。\n }\n}\n```\n\n### Specs2\n\nもう1つの人気のあるテストフレームワークです。\n\n```scala\n// build.sbtでの依存関係。\nlibraryDependencies += \"org.specs2\" %% \"specs2-core\" % \"4.19.2\" % Test。\n\n// テスト例。\nimport org.specs2.mutable.Specification。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalatools-01jpcvxfxk935q9x97vbpfp9ta.md","loc":{"lines":{"from":284,"to":332}}}}],["139",{"pageContent":"### Specs2\n\nもう1つの人気のあるテストフレームワークです。\n\n```scala\n// build.sbtでの依存関係。\nlibraryDependencies += \"org.specs2\" %% \"specs2-core\" % \"4.19.2\" % Test。\n\n// テスト例。\nimport org.specs2.mutable.Specification。\n\nclass CalculatorSpec extends Specification {。\n \"Calculator\" should {。\n \"add two numbers\" in {。\n Calculator.add(1, 2) must beEqualTo(3)。\n }\n \n \"subtract two numbers\" in {。\n Calculator.subtract(5, 2) must beEqualTo(3)。\n }\n }\n}\n```\n\n### MUnit\n\nシンプルで高速なテストフレームワークです。\n\n```scala\n// build.sbtでの依存関係。\nlibraryDependencies += \"org.scalameta\" %% \"munit\" % \"0.7.29\" % Test。\n\n// テスト例。\nclass CalculatorSuite extends munit.FunSuite {。\n test(\"add two numbers\") {。\n assertEquals(Calculator.add(1, 2), 3)。\n }\n \n test(\"subtract two numbers\") {。\n assertEquals(Calculator.subtract(5, 2), 3)。\n }\n}\n```\n\n### ScalaMock\n\nScalaのモックフレームワークです。\n\n```scala\n// build.sbtでの依存関係。\nlibraryDependencies += \"org.scalamock\" %% \"scalamock\" % \"5.2.0\" % Test。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalatools-01jpcvxfxk935q9x97vbpfp9ta.md","loc":{"lines":{"from":323,"to":373}}}}],["140",{"pageContent":"### ScalaMock\n\nScalaのモックフレームワークです。\n\n```scala\n// build.sbtでの依存関係。\nlibraryDependencies += \"org.scalamock\" %% \"scalamock\" % \"5.2.0\" % Test。\n\n// 使用例。\nimport org.scalamock.scalatest.MockFactory。\nimport org.scalatest.flatspec.AnyFlatSpec。\n\nclass UserServiceSpec extends AnyFlatSpec with MockFactory {。\n \"UserService\" should \"get user by id\" in {。\n val mockRepository = mock[UserRepository]。\n (mockRepository.findById _).expects(1).returning(Some(User(1, \"test\")))。\n \n val service = new UserService(mockRepository)。\n assert(service.getUser(1).contains(User(1, \"test\")))。\n }\n}\n```\n\n## パフォーマンス分析ツール\n\n### JMH (Java Microbenchmark Harness)\n\nJVMベースのマイクロベンチマークを作成するためのツールです。\n\n```scala\n// build.sbtでの設定。\nlibraryDependencies += \"org.openjdk.jmh\" % \"jmh-core\" % \"1.36\" % Test。\nlibraryDependencies += \"org.openjdk.jmh\" % \"jmh-generator-annprocess\" % \"1.36\" % Test。\n\n// ベンチマーク例。\nimport org.openjdk.jmh.annotations._。\nimport java.util.concurrent.TimeUnit。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalatools-01jpcvxfxk935q9x97vbpfp9ta.md","loc":{"lines":{"from":367,"to":403}}}}],["141",{"pageContent":"// ベンチマーク例。\nimport org.openjdk.jmh.annotations._。\nimport java.util.concurrent.TimeUnit。\n\n@State(Scope.Thread)。\n@BenchmarkMode(Array(Mode.AverageTime))。\n@OutputTimeUnit(TimeUnit.NANOSECONDS)。\nclass StringBenchmark {。\n @Benchmark。\n def concatenation(): String = {\n \"Hello\" + \" \" + \"World\"。\n }\n \n @Benchmark。\n def interpolation(): String = {\n s\"Hello World\"。\n }\n}\n```\n\n### Flame Graph\n\nプロファイリング結果を視覚化するためのツールです。\n\n```bash\n# JVMのプロファイリングツールを使用\njava -XX:+PreserveFramePointer -jar target/benchmarks.jar。\n\n# async-profilerを使用\n./profiler.sh -d 30 -f profile.html <pid>。\n```\n\n## CI/CD統合\n\n### GitHub Actions\n\nGitHub Actionsを使用したScalaプロジェクトのCI/CD設定例:。\n\n```yaml\n# .github/workflows/scala.yml\nname: Scala CI。\n\non:\n push:\n branches: [ main ]\n pull_request:\n branches: [ main ]","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalatools-01jpcvxfxk935q9x97vbpfp9ta.md","loc":{"lines":{"from":401,"to":447}}}}],["142",{"pageContent":"### GitHub Actions\n\nGitHub Actionsを使用したScalaプロジェクトのCI/CD設定例:。\n\n```yaml\n# .github/workflows/scala.yml\nname: Scala CI。\n\non:\n push:\n branches: [ main ]\n pull_request:\n branches: [ main ]\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v3。\n - name: Set up JDK 11。\n uses: actions/setup-java@v3\n with:\n java-version: '11'\n distribution: 'temurin'\n cache: 'sbt'\n - name: Run tests。\n run: sbt test\n - name: Check formatting。\n run: sbt scalafmtCheckAll\n - name: Run scalafix。\n run: sbt \"scalafix --check\"\n```\n\n### SBT Native Packager\n\nアプリケーションのパッケージングとデプロイメントを自動化するためのsbtプラグインです。\n\n```scala\n// project/plugins.sbt。\naddSbtPlugin(\"com.github.sbt\" % \"sbt-native-packager\" % \"1.9.16\")。\n\n// build.sbt。\nenablePlugins(JavaAppPackaging)。\nenablePlugins(DockerPlugin)。\n\ndockerBaseImage := \"openjdk:11-jre-slim\"\ndockerExposedPorts := Seq(8080)\n```\n\n## ドキュメント生成ツール\n\n### Scaladoc\n\nScalaの標準ドキュメント生成ツールです。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalatools-01jpcvxfxk935q9x97vbpfp9ta.md","loc":{"lines":{"from":435,"to":488}}}}],["143",{"pageContent":"dockerBaseImage := \"openjdk:11-jre-slim\"\ndockerExposedPorts := Seq(8080)\n```\n\n## ドキュメント生成ツール\n\n### Scaladoc\n\nScalaの標準ドキュメント生成ツールです。\n\n```bash\n# ドキュメント生成\nsbt doc。\n\n# ドキュメントを開く\nsbt doc-open。\n```\n\n### Mdoc\n\n型チェックされたMarkdownドキュメントを生成するツールです。\n\n```scala\n// project/plugins.sbt。\naddSbtPlugin(\"org.scalameta\" % \"sbt-mdoc\" % \"2.3.7\")。\n\n// build.sbt。\nenablePlugins(MdocPlugin)。\nmdocIn := file(\"docs-src\")\nmdocOut := file(\"docs\")\n```\n\n## 依存関係管理ツール\n\n### Coursier\n\nScala依存関係の解決と取得を高速化するツールです。\n\n```bash\n# インストール\ncurl -fLo cs https://git.io/coursier-cli-\"$(uname | tr LD ld)\"。\nchmod +x cs。\n./cs setup。\n\n# アプリケーションのインストール\ncs install scala。\ncs install scalafmt。\ncs install ammonite。\n\n# 依存関係の解決\ncs resolve org.typelevel::cats-core:2.9.0。\n```\n\n### sbt-updates\n\nプロジェクトの依存関係の更新状況を確認するsbtプラグインです。\n\n```scala\n// project/plugins.sbt。\naddSbtPlugin(\"com.timushev.sbt\" % \"sbt-updates\" % \"0.6.3\")。\n\n// 使用方法。\nsbt dependencyUpdates。\n```\n\n## 推奨ワークフロー","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalatools-01jpcvxfxk935q9x97vbpfp9ta.md","loc":{"lines":{"from":480,"to":545}}}}],["144",{"pageContent":"### sbt-updates\n\nプロジェクトの依存関係の更新状況を確認するsbtプラグインです。\n\n```scala\n// project/plugins.sbt。\naddSbtPlugin(\"com.timushev.sbt\" % \"sbt-updates\" % \"0.6.3\")。\n\n// 使用方法。\nsbt dependencyUpdates。\n```\n\n## 推奨ワークフロー\n\n1. **プロジェクト開始時**:\n - `sbt new`でプロジェクト作成。\n - Scalafmt、Scalafixの設定。\n - CIの設定(GitHub Actions等)\n\n2. **日常の開発**:\n - Metals/IntelliJ IDEAを使用したコーディング。\n - `sbt ~compile`で継続的コンパイル。\n - `sbt ~test`で継続的テスト。\n - Ammoniteを使用した実験。\n\n3. **コードレビュー前**:\n - `sbt scalafmtAll`でフォーマット。\n - `sbt scalafix`で静的解析。\n - `sbt test`でテスト実行。\n\n4. **リリース前**:\n - `sbt dependencyUpdates`で依存関係の確認。\n - `sbt test`でテスト実行。\n - `sbt doc`でドキュメント生成。\n - `sbt package`/`sbt docker:publishLocal`でパッケージング。\n\n## 関連情報","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalatools-01jpcvxfxk935q9x97vbpfp9ta.md","loc":{"lines":{"from":533,"to":569}}}}],["145",{"pageContent":"4. **リリース前**:\n - `sbt dependencyUpdates`で依存関係の確認。\n - `sbt test`でテスト実行。\n - `sbt doc`でドキュメント生成。\n - `sbt package`/`sbt docker:publishLocal`でパッケージング。\n\n## 関連情報\n\n- [Scala公式サイト](https://www.scala-lang.org/)\n- [sbt リファレンスマニュアル](https://www.scala-sbt.org/1.x/docs/)\n- [Scalafmt ドキュメント](https://scalameta.org/scalafmt/)\n- [Scalafix ドキュメント](https://scalacenter.github.io/scalafix/)\n- [Scaladocの掟](scaladoc-01jpcvxfxmsb49cge8ewg55kah.md)\n- [Scalaコーディングスタイル](scalastyle-01jpcvxfxmsb49cge8ewg55kae.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala/scalatools-01jpcvxfxk935q9x97vbpfp9ta.md","loc":{"lines":{"from":563,"to":576}}}}],["146",{"pageContent":"---\ndescription: Scalaのコーディング規約と開発ガイドライン\nruleId: scala-01jpcvxfxf9jafj03jk1zks31x\ntags:\n - scala\n - coding\n - guidelines\naliases:\n - scala-rules\n - scala-guidelines\nglobs:\n - '**/*.ts'\n - '**/*.tsx'\n - '**/*.js'\n - '**/*.jsx'\n - '**/*.go'\n - '**/*.rs'\n - '**/*.scala'\n---\n\n# Scalaの掟\n\n## 基本原則\n\n- [Scala Style Guide](https://docs.scala-lang.org/style/)に従う\n- scalafmtを使用してコードフォーマットを統一する。\n- scalafix, wartremoverを使用してコード品質を維持する。\n- 関数型プログラミングの原則を重視する。\n\n## モジュール構成\n\nScalaのコーディング規約は以下のモジュールに分かれています:。\n\n- [Scaladocの掟](scala/scaladoc-01jpcvxfxmsb49cge8ewg55kah.md) - コードドキュメントの書き方\n- [Scalaコーディングスタイル](scala/scalastyle-01jpcvxfxmsb49cge8ewg55kae.md) - 命名規則、コード構造、関数型プログラミングなど\n- [Scalaツール活用](scala/scalatools-01jpcvxfxk935q9x97vbpfp9ta.md) - 開発ツールの使用方法\n- [Scalaコードレビュー](scala/scalareview-01jpcvxfxmsb49cge8ewg55kaf.md) - レビュー時のチェックポイント\n- [Scala参考文献](scala/scalarefs-01jpcvxfxmsb49cge8ewg55kag.md) - 学習リソースと参考資料\n\n## クイックリファレンス\n\n### 重要な原則","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala-01jpcvxfxf9jafj03jk1zks31x.md","loc":{"lines":{"from":1,"to":42}}}}],["147",{"pageContent":"## クイックリファレンス\n\n### 重要な原則\n\n- クラス名はパスカルケース、変数・メソッド名はキャメルケースを使用する。\n- 可変状態(`var`)の使用は最小限に抑える。\n- 副作用は明示的に分離し、純粋関数を優先する。\n- `Option`、`Either`、`Try`を使用して型安全なエラー処理する。\n- テストは網羅的に書き、エッジケースも考慮する。\n\n### 必須ツール\n\n- `sbt` - ビルドツール。\n- `scalafmt` - コードフォーマッター。\n- `scalafix` - リファクタリングツール。\n- `wartremover` - コード品質チェック。\n- `metals` - 言語サーバー。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/scala-01jpcvxfxf9jafj03jk1zks31x.md","loc":{"lines":{"from":40,"to":56}}}}],["148",{"pageContent":"---\ndescription: biome settingsに関するドキュメント\nruleId: biome-01jpcvxfxk935q9x97vbpfp9t9\ntags: [\"development\",\"coding\",\"typescript\"]\naliases: [\"biome-config\", \"typescript-linting\"]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"]\n---\n\n# Biomeの設定\n\nTypeScriptコードの品質を保つためのBiome設定例:。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/biome-01jpcvxfxk935q9x97vbpfp9t9.md","loc":{"lines":{"from":1,"to":11}}}}],["149",{"pageContent":"```json\n{\n \"$schema\": \"https://biomejs.dev/schemas/1.5.3/schema.json\",\n \"organizeImports\": {\n \"enabled\": true\n },\n \"files\": {\n \"maxSize\": 2000000,\n \"ignore\": [\"docs/**/*\", \"node_modules/**/*\", \"dist/**/*\", \".obsidian/**/*\", \"coverage/**/*\"]\n },\n \"linter\": {\n \"enabled\": true,\n \"rules\": {\n \"recommended\": true,\n \"correctness\": {\n \"noUnusedVariables\": \"error\",\n \"noConstAssign\": \"error\",\n \"useExhaustiveDependencies\": \"error\"\n },\n \"suspicious\": {\n \"noExplicitAny\": \"off\",\n \"noImplicitAnyLet\": \"off\"\n },\n \"complexity\": {\n \"noForEach\": \"off\",\n \"noStaticOnlyClass\": \"off\"\n },\n \"style\": {\n \"useConst\": \"error\",\n \"useSingleVarDeclarator\": \"off\",\n \"noUnusedTemplateLiteral\": \"off\",\n \"useTemplate\": \"off\"\n }\n },\n \"ignore\": [\"node_modules\", \"dist\", \"docs\", \"docs/**/*\", \".obsidian/**/*\", \"coverage/**/*\"]\n },\n \"formatter\": {\n \"enabled\": true,","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/biome-01jpcvxfxk935q9x97vbpfp9t9.md","loc":{"lines":{"from":13,"to":50}}}}],["150",{"pageContent":"\"useTemplate\": \"off\"\n }\n },\n \"ignore\": [\"node_modules\", \"dist\", \"docs\", \"docs/**/*\", \".obsidian/**/*\", \"coverage/**/*\"]\n },\n \"formatter\": {\n \"enabled\": true,\n \"indentStyle\": \"space\",\n \"indentWidth\": 2,\n \"lineWidth\": 100,\n \"ignore\": [\"node_modules\", \"dist\", \"docs\"]\n },\n \"javascript\": {\n \"formatter\": {\n \"quoteStyle\": \"double\",\n \"trailingCommas\": \"es5\",\n \"semicolons\": \"always\"\n }\n },\n \"overrides\": [\n {\n \"include\": [\"**/*.test.ts\", \"**/*.test.js\", \"**/*.spec.ts\", \"**/*.spec.js\"],\n \"linter\": {\n \"rules\": {\n \"complexity\": {\n \"useLiteralKeys\": \"off\"\n }\n }\n }\n }\n ]\n}\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/biome-01jpcvxfxk935q9x97vbpfp9t9.md","loc":{"lines":{"from":44,"to":76}}}}],["151",{"pageContent":"---\ndescription: gas developmentに関するドキュメント\nruleId: gas-01jpcvxfxk935q9x97vbpfp9t8\ntags: [\"development\",\"coding\",\"typescript\"]\naliases: [\"gas-guidelines\", \"google-apps-script\"]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"]\n---\n\n# Google Apps Script (GAS) 開発ガイドライン\n\n## 1. GASの基本概念\n\nGoogle Apps Script (GAS) は、Google のクラウドサービスを拡張するためのJavaScriptベースのスクリプト言語およびプラットフォームです。以下の特徴を持ちます:。\n\n- Google サービス(Sheets, Docs, Calendar, Gmail など)と密接に統合。\n- クラウド上で実行され、サーバーサイドのスクリプト機能を提供。\n- V8ランタイムエンジンを採用(最新のJavaScript機能の一部をサポート)\n- WebアプリケーションやGoogle WorkspaceアドオンなどのUI構築が可能。\n\n## 2. GAS の制約と注意点\n\n### 2.1 非同期処理の制約\n\n- GAS は V8 ランタイムで Promise や async/await 構文が構文上は使用可能ですが、**真の非同期処理は実行されません**。\n- GAS には本格的なイベントループが存在せず、並列処理の実行はできません。\n- async/await を使用しても、実行は基本的に同期処理としてブロックされます。\n- このため、同期処理パターンを前提としたコードを使用することを推奨します。\n\n### 2.2 ES6+機能の制限\n\n- 一部のモダンな JavaScript 機能は利用できない場合があります。\n- ES6 以降の機能はサポートされていますが、一部の機能(例:dynamic import)は利用できません。\n- 場合によってはトランスパイルが必要です。\n- モジュールシステムはサポートされていますが、従来の GAS とは実装方法が異なります。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":1,"to":34}}}}],["152",{"pageContent":"### 2.2 ES6+機能の制限\n\n- 一部のモダンな JavaScript 機能は利用できない場合があります。\n- ES6 以降の機能はサポートされていますが、一部の機能(例:dynamic import)は利用できません。\n- 場合によってはトランスパイルが必要です。\n- モジュールシステムはサポートされていますが、従来の GAS とは実装方法が異なります。\n\n### 2.3 実行時間制限\n\n- GAS には 1 回の実行につき 6 分という制限があります。\n- 大量のデータを処理する場合は、バッチ処理や分割実行を検討する必要があります。\n- 特に無条件のデータ取得メソッドは避け、常に検索条件を指定してデータ量を制限すべきです。\n- トリガーを使用して長時間の処理を小さなタスクに分割できます。\n\n### 2.4 メモリ制限\n\n- GAS には処理可能なデータサイズの制限があります。\n- スクリプトのファイル数とサイズにも制限があります(スクリプトプロジェクト全体で 50MB まで)\n- 大きなデータセットを扱う場合はページネーションを利用しましょう。\n- プロパティストアやキャッシュサービスを使って大きなデータを分割して保存することを検討してください。\n\n### 2.5 スクリプトの保護\n\n- GAS スクリプトにはバージョン管理があり、デプロイ時に特定のバージョンを指定できます。\n- スクリプトに対するアクセス権限を制御できます(読み取り専用、編集可能など)\n- コードの公開範囲を注意深く設定する必要があります。\n\n## 3. GAS の主要コンポーネント\n\n### 3.1 スクリプトエディタ\n\n- ブラウザベースのコードエディタ。\n- デバッグ機能(ログ出力、例外表示など)\n- 実行履歴の確認。\n- プロジェクト管理機能。\n\n### 3.2 トリガー\n\n- 時間駆動トリガー:定期的に実行(分単位、時間単位、日単位など)\n- イベント駆動トリガー:特定のイベント(フォーム送信、ドキュメント編集など)発生時に実行。\n- インストール可能トリガー:ユーザー認証が必要で高い権限を持つ。\n- 単純トリガー:権限が限定的だが設定が簡単。\n\n### 3.3 スクリプトバインディング","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":29,"to":72}}}}],["153",{"pageContent":"### 3.2 トリガー\n\n- 時間駆動トリガー:定期的に実行(分単位、時間単位、日単位など)\n- イベント駆動トリガー:特定のイベント(フォーム送信、ドキュメント編集など)発生時に実行。\n- インストール可能トリガー:ユーザー認証が必要で高い権限を持つ。\n- 単純トリガー:権限が限定的だが設定が簡単。\n\n### 3.3 スクリプトバインディング\n\n- コンテナバインドスクリプト:特定の Google ドキュメント、スプレッドシートなどに紐づくスクリプト。\n- スタンドアローンスクリプト:特定のドキュメントに紐づかない独立したスクリプト。\n- アドオン:Google Workspace アプリケーション用の拡張機能。\n\n### 3.4 ウェブアプリケーション\n\n- GAS を使ってウェブアプリケーションを構築可能。\n- HTML サービスと HTML テンプレートによる UI 構築。\n- doGet() と doPost() によるHTTPリクエスト処理。\n- アクセス権限の制御(自分のみ、ドメイン内、全員など)\n\n## 4. GAS 開発のベストプラクティス\n\n### 4.1 スクリプトの構造化\n\n- 関数を機能ごとにグループ化し、命名規則を統一する。\n- グローバル変数の使用を最小限に抑える。\n- 可能な限りモジュール性を高める(関数やクラスを再利用可能に設計)\n- TypeScript を使用する場合は、GAS の制約を考慮した tsconfig.json 設定する。\n\n### 4.2 効率的なコーディング\n\n- API 呼び出しは最小限に抑える(特に外部 API)\n- バッチ処理を活用(例:SpreadsheetApp.flush() でまとめて更新)\n- キャッシュとプロパティストアを効果的に使用する。\n- 処理の進捗状況をログに記録し、デバッグを容易にする。\n\n### 4.3 エラー処理とロギング\n\n- try-catch ブロックを使用して例外を適切に処理する。\n- Console.log() を使用してデバッグ情報を出力する。\n- ユーザーに分かりやすいエラーメッセージを表示する。\n- 重要な操作の前にはバックアップを作成する。\n\n### 4.4 セキュリティ対策","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":65,"to":108}}}}],["154",{"pageContent":"### 4.3 エラー処理とロギング\n\n- try-catch ブロックを使用して例外を適切に処理する。\n- Console.log() を使用してデバッグ情報を出力する。\n- ユーザーに分かりやすいエラーメッセージを表示する。\n- 重要な操作の前にはバックアップを作成する。\n\n### 4.4 セキュリティ対策\n\n- スクリプトの公開範囲と権限を最小限に設定する。\n- パスワードやAPIキーなどの機密情報はプロパティストアに保存する。\n- ユーザー入力は必ず検証し、インジェクション攻撃を防止する。\n- OAuth 認証を適切に実装する。\n\n## 5. TypeScript と GAS の連携\n\n### 5.1 開発環境の準備\n\n- clasp を使用したローカル開発環境の構築。\n- TypeScript の型定義ファイル(@types/google-apps-script)のインストール。\n- エディタ設定(VS Code の場合は extensions.json や settings.json)\n\n### 5.2 TypeScript の設定\n\nGAS の実行環境に合わせた tsconfig.json の推奨設定:。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":101,"to":125}}}}],["155",{"pageContent":"### 5.2 TypeScript の設定\n\nGAS の実行環境に合わせた tsconfig.json の推奨設定:。\n\n```json\n{\n \"compilerOptions\": {\n \"target\": \"es2019\", // GAS の V8 ランタイムに合わせる\n \"module\": \"none\", // GAS での実行を考慮\n \"moduleResolution\": \"node\",\n \"esModuleInterop\": true,\n \"lib\": [\"esnext\"],\n \"strict\": true,\n \"skipLibCheck\": true,\n \"strictNullChecks\": true,\n \"noImplicitAny\": true,\n \"noImplicitThis\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"noImplicitReturns\": true,\n \"downlevelIteration\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"outDir\": \"./dist\"\n },\n \"include\": [\"src/**/*\"],\n \"exclude\": [\"node_modules\", \"dist\"]\n}\n```\n\n#### 5.2.1 esbuildの設定\n\nTypeScriptで記述したGASプロジェクトをバンドルするために、esbuildを使用することをお勧めします。以下に`esbuild.js`の標準的な設定例を示します:。\n\n```javascript\nimport path from \"node:path\";\nimport esbuild from \"esbuild\";。\nimport { GasPlugin } from \"esbuild-gas-plugin\";。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":123,"to":159}}}}],["156",{"pageContent":"```javascript\nimport path from \"node:path\";\nimport esbuild from \"esbuild\";。\nimport { GasPlugin } from \"esbuild-gas-plugin\";。\n\nesbuild。\n .build({。\n entryPoints: [\"./src/main.ts\"], // エントリポイントを指定\n bundle: true, // 依存関係をまとめて一括バンドル\n minify: true, // コードを圧縮\n outfile: \"./dist/main.js\", // 出力先\n plugins: [GasPlugin], // GAS用にimport文やstrictを除去するプラグイン\n target: [\"es2019\"], // V8ランタイムに対応\n format: \"esm\", // 一旦ESモジュール形式でバンドル\n sourcemap: false, // ソースマップ不要ならfalse\n resolveExtensions: [\".ts\", \".js\"],\n alias: {\n \"@\": path.resolve(\"src\"), // \"@/...\" で src配下を簡単にimport可能\n },\n })\n .catch((e) => {。\n console.error(e);。\n process.exit(1);。\n });\n```\n\nこの設定の主なポイント:。\n- `GasPlugin`を使って、GAS環境で問題になる`import`文などを適切に処理します。\n- `target: [\"es2019\"]`で、GASのV8ランタイムに対応したコードを生成します。\n- エイリアス設定により`@/`から始まるパスでソースコードのインポートが容易になります。\n- 依存関係をすべて1つのファイルにバンドルすることで、GASでの読み込み順の問題を解消します。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":156,"to":186}}}}],["157",{"pageContent":"#### 5.2.2 tsconfig.jsonの完全な設定\n\nTypeScriptコンパイラの設定として、以下の`tsconfig.json`をGAS開発で使用することを推奨します:。\n\n```json\n{\n \"compilerOptions\": {\n \"target\": \"es2019\",\n \"module\": \"none\",\n \"moduleResolution\": \"node\",\n \"esModuleInterop\": true,\n \"lib\": [\"esnext\"],\n \"strict\": true,\n \"experimentalDecorators\": true,\n \"skipLibCheck\": true,\n \"strictNullChecks\": true,\n \"noImplicitAny\": true,\n \"noImplicitThis\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"noImplicitReturns\": true,\n \"downlevelIteration\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"baseUrl\": \".\",\n \"paths\": {\n \"@/*\": [\"src/*\"]\n },\n \"outDir\": \"./dist\",\n \"rootDir\": \"./src\"\n },\n \"include\": [\"src/**/*\"],\n \"exclude\": [\"node_modules\", \"dist\", \"docs\", \"coverage\"]\n}\n```\n\nこの設定は:。\n- GASのV8ランタイムに合わせた`target: \"es2019\"`を指定。\n- 厳格な型チェックを有効化し、コードの安全性を確保。\n- パスエイリアス機能を提供し、`@/`からのインポートパスがesbuildの設定と一致。\n- デコレータなどのモダンな機能をサポート。\n\n#### 5.2.3 package.jsonの設定","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":188,"to":229}}}}],["158",{"pageContent":"この設定は:。\n- GASのV8ランタイムに合わせた`target: \"es2019\"`を指定。\n- 厳格な型チェックを有効化し、コードの安全性を確保。\n- パスエイリアス機能を提供し、`@/`からのインポートパスがesbuildの設定と一致。\n- デコレータなどのモダンな機能をサポート。\n\n#### 5.2.3 package.jsonの設定\n\nGASプロジェクトの開発に必要な依存関係とスクリプトを定義するpackage.jsonの例:。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":223,"to":231}}}}],["159",{"pageContent":"```json\n{\n \"name\": \"gas-project\",\n \"version\": \"1.0.0\",\n \"description\": \"\",\n \"main\": \"index.js\",\n \"scripts\": {\n \"type-check\": \"tsc --noEmit\",\n \"build\": \"npm run type-check && node esbuild.js\",\n \"push\": \"cp appsscript.json dist/ && clasp push\",\n \"open\": \"clasp open\",\n \"deploy\": \"npm run build && npm run push\",\n \"lint\": \"biome check .\",\n \"lint:fix\": \"biome check --write && biome format --write .\",\n \"test\": \"npm run lint && npm run type-check && jest\",\n \"test:coverage\": \"npm run lint && npm run type-check && jest --coverage\",\n \"test:watch\": \"jest --watch\",\n \"verify\": \"npm run lint && npm run test\"\n },\n \"type\": \"module\",\n \"license\": \"ISC\",\n \"devDependencies\": {\n \"@biomejs/biome\": \"^1.9.4\",\n \"@google/clasp\": \"^2.5.0\",\n \"@jest/globals\": \"^29.7.0\",\n \"@types/google-apps-script\": \"^1.0.97\",\n \"@types/jest\": \"^29.5.14\",\n \"@types/node\": \"^22.13.10\",\n \"clasp\": \"^1.0.0\",\n \"esbuild\": \"^0.25.0\",\n \"esbuild-gas-plugin\": \"^0.8.0\",","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":233,"to":263}}}}],["160",{"pageContent":"\"@types/google-apps-script\": \"^1.0.97\",\n \"@types/jest\": \"^29.5.14\",\n \"@types/node\": \"^22.13.10\",\n \"clasp\": \"^1.0.0\",\n \"esbuild\": \"^0.25.0\",\n \"esbuild-gas-plugin\": \"^0.8.0\",\n \"jest\": \"^29.7.0\",\n \"ts-jest\": \"^29.2.6\",\n \"typescript\": \"^5.8.2\"\n },\n \"dependencies\": {\n \"date-fns\": \"^4.1.0\"\n }\n}\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":258,"to":272}}}}],["161",{"pageContent":"この設定で可能になる主な開発ワークフロー:。\n- `npm run build`: TypeScriptの型チェックとesbuildによるバンドルする。\n- `npm run push`: 生成されたコードとappsscript.jsonをGASにアップロード。\n- `npm run deploy`: ビルドとデプロイを一度に実行。\n- テスト、リント、型チェックの統合による品質管理。\n\nこれにより、モダンな開発環境でGASプロジェクトの開発が効率的に行えます。\n\n#### 5.2.4 Biomeの設定\n\nBiomeは高速かつ現代的なJavaScript/TypeScriptのリンター兼フォーマッターです。以下の`biome.json`設定はGAS開発に最適化されています:。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":274,"to":284}}}}],["162",{"pageContent":"```json\n{\n \"$schema\": \"https://biomejs.dev/schemas/1.5.3/schema.json\",\n \"organizeImports\": {\n \"enabled\": true\n },\n \"files\": {\n \"maxSize\": 2000000,\n \"ignore\": [\"docs/**/*\", \"node_modules/**/*\", \"dist/**/*\", \".obsidian/**/*\", \"coverage/**/*\"]\n },\n \"linter\": {\n \"enabled\": true,\n \"rules\": {\n \"recommended\": true,\n \"correctness\": {\n \"noUnusedVariables\": \"error\",\n \"noConstAssign\": \"error\",\n \"useExhaustiveDependencies\": \"error\"\n },\n \"suspicious\": {\n \"noExplicitAny\": \"off\",\n \"noImplicitAnyLet\": \"off\"\n },\n \"complexity\": {\n \"noForEach\": \"off\",\n \"noStaticOnlyClass\": \"off\"\n },\n \"style\": {\n \"useConst\": \"error\",\n \"useSingleVarDeclarator\": \"off\",\n \"noUnusedTemplateLiteral\": \"off\",\n \"useTemplate\": \"off\"\n }\n },\n \"ignore\": [\"node_modules\", \"dist\", \"docs\", \"docs/**/*\", \".obsidian/**/*\", \"coverage/**/*\"]\n },\n \"formatter\": {\n \"enabled\": true,","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":286,"to":323}}}}],["163",{"pageContent":"\"useTemplate\": \"off\"\n }\n },\n \"ignore\": [\"node_modules\", \"dist\", \"docs\", \"docs/**/*\", \".obsidian/**/*\", \"coverage/**/*\"]\n },\n \"formatter\": {\n \"enabled\": true,\n \"indentStyle\": \"space\",\n \"indentWidth\": 2,\n \"lineWidth\": 100,\n \"ignore\": [\"node_modules\", \"dist\", \"docs\"]\n },\n \"javascript\": {\n \"formatter\": {\n \"quoteStyle\": \"double\",\n \"trailingCommas\": \"es5\",\n \"semicolons\": \"always\"\n }\n },\n \"overrides\": [\n {\n \"include\": [\"**/*.test.ts\", \"**/*.test.js\", \"**/*.spec.ts\", \"**/*.spec.js\"],\n \"linter\": {\n \"rules\": {\n \"complexity\": {\n \"useLiteralKeys\": \"off\"\n }\n }\n }\n }\n ]\n}\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":317,"to":349}}}}],["164",{"pageContent":"この設定の主なポイント:。\n- **コード品質の向上**:。\n - 未使用変数の検出、定数の再代入防止、依存配列の網羅性確認など、コード品質を担保するルールを設定。\n - GAS開発に適した設定(`noExplicitAny`や`noImplicitAnyLet`をオフにするなど)\n\n- **コードスタイルの統一**:。\n - スペースによるインデント(2スペース)\n - ダブルクォート、末尾カンマ、セミコロンの使用を統一。\n - 行の最大幅を100文字に制限。\n\n- **最適化されたルール**:。\n - テストファイルに対しては一部ルールを緩和(`useLiteralKeys`をオフ)\n - 生成されたファイルや依存関係のディレクトリは検査対象から除外。\n\n- **自動インポート整理**:。\n - `organizeImports.enabled: true`でインポート文を自動的に整理。\n\nBiomeはpackage.jsonに記載されているとおり、`npm run lint`や`npm run lint:fix`コマンドで実行できます。ESlintよりも高速で、TypeScriptとの統合もスムーズなため、GAS開発のような中小規模プロジェクトに適しています。\n\n### 5.3 clasp の設定\n\n.clasp.json の例:。\n\n```json\n{\n \"scriptId\": \"YOUR_SCRIPT_ID\",\n \"rootDir\": \"dist\"\n}\n```\n\n上記はesbuildなどのバンドラーを使用する場合の最小構成です。esbuildはすべての依存関係を解決して単一のファイルにバンドルするため、これだけで十分です。\n\n- `scriptId`: GASプロジェクトの一意のID。\n- `rootDir`: バンドルされたコードが出力されるディレクトリ。\n\n> **注意**: バンドラーを使用せず個別のファイルをそのままpushする場合は、以下のような追加設定が必要になることがあります。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":351,"to":386}}}}],["165",{"pageContent":"- `scriptId`: GASプロジェクトの一意のID。\n- `rootDir`: バンドルされたコードが出力されるディレクトリ。\n\n> **注意**: バンドラーを使用せず個別のファイルをそのままpushする場合は、以下のような追加設定が必要になることがあります。\n\n```json\n{\n \"scriptId\": \"YOUR_SCRIPT_ID\",\n \"rootDir\": \"dist\",\n \"projectId\": \"YOUR_PROJECT_ID\", // optional\n \"fileExtension\": \"ts\", // Change to \"js\" if not using TypeScript\n \"filePushOrder\": [\n \"src/namespace/common.ts\", // ユーティリティ関数など最初に読み込むべきファイル。\n \"src/namespace/models.ts\",。\n \"src/namespace/services.ts\",。\n \"src/namespace/ui.ts\"。\n ]\n}\n```\n\n### 5.4 appsscript.json の設定\n\nGASプロジェクトの設定ファイル appsscript.json の例:。\n\n```json\n{\n \"timeZone\": \"Asia/Tokyo\",\n \"dependencies\": {\n \"enabledAdvancedServices\": [\n {\n \"userSymbol\": \"Calendar\",\n \"version\": \"v3\",\n \"serviceId\": \"calendar\"\n }\n ]\n },\n \"exceptionLogging\": \"STACKDRIVER\",\n \"runtimeVersion\": \"V8\"\n}\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":383,"to":422}}}}],["166",{"pageContent":"このファイルでは以下の設定が可能です:。\n- `timeZone`:スクリプトの実行タイムゾーン。\n- `dependencies`:有効化する高度なサービス(Google API)\n- `exceptionLogging`:例外ログの出力先。\n- `runtimeVersion`:使用するランタイムバージョン(V8推奨)\n- `webapp`:Webアプリケーションの設定。\n- `oauthScopes`:スクリプトが要求する権限スコープ。\n\n## 6. GAS でのテスト戦略\n\n### 6.1 テスト環境の制約\n\n- GAS には組み込みのテストフレームワークがありません。\n- ローカル環境では GAS API をモック化する必要があります。\n- エミュレーションには限界があり、実際の GAS 環境との違いに注意が必要です。\n\n### 6.2 テスト方法\n\n- ユニットテスト:。\n - QUnit for GAS などのライブラリを使用。\n - ロジックを GAS API から分離し、テスト可能にする。\n- 手動テスト:。\n - テスト用の関数を作成し、スクリプトエディタから実行。\n - Logger を使用して結果を確認。\n- モック:。\n - 外部サービスや GAS API をモック化してテスト。\n\n### 6.3 テスト駆動開発の適用\n\n- ビジネスロジックを API 呼び出しから分離する。\n- 純粋な関数を優先して使用する。\n- Dependency Injection パターンを活用する。\n- テスト可能なコード設計を心がける。\n\n## 7. GAS 特有のセキュリティ考慮事項\n\n### 7.1 認証と承認\n\n- OAuth2 を使用した API アクセスの実装。\n- スコープは必要最小限に設定する。\n- ユーザー認証情報の安全な管理。\n\n### 7.2 データ保護\n\n- 機密データの保存には ScriptProperties または UserProperties を使用。\n- クライアント側に機密情報を露出させない。\n- HTTPS で通信する(WebアプリケーションのURL設定)\n\n### 7.3 コンテンツセキュリティポリシー","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":424,"to":472}}}}],["167",{"pageContent":"### 7.2 データ保護\n\n- 機密データの保存には ScriptProperties または UserProperties を使用。\n- クライアント側に機密情報を露出させない。\n- HTTPS で通信する(WebアプリケーションのURL設定)\n\n### 7.3 コンテンツセキュリティポリシー\n\n- HTML サービスで生成する UI の XSS 対策。\n- ユーザー入力のサニタイズ。\n- HTML テンプレートの安全な使用。\n\n## 8. GAS のパフォーマンス最適化\n\n### 8.1 スプレッドシート操作の最適化\n\n- Range.setValue() よりも Range.setValues() を使用する。\n- getRange() の呼び出し回数を減らす。\n- SpreadsheetApp.flush() を適切に使用する。\n\n### 8.2 API 呼び出しの最適化\n\n- キャッシュを活用(CacheService)\n- バッチ処理を実装する。\n- 必要なデータのみを取得する。\n\n### 8.3 実行時間の管理\n\n- 長時間実行される処理の分割。\n- タイムトリガーを使った定期実行。\n- 進捗状況の保存と再開機能の実装。\n\n## 9. GAS のデバッグとトラブルシューティング\n\n### 9.1 ロギング\n\n- Console.log() と Logger.log() の使い分け。\n- ログレベルの実装(ERROR, WARN, INFO, DEBUG など)\n- 構造化ロギングの活用。\n\n### 9.2 実行トレース\n\n- スタックトレースの解析。\n- 実行時間の計測。\n- メモリ使用量の監視。\n\n### 9.3 一般的な問題と解決策\n\n- 実行時間超過エラーへの対応。\n- 権限エラーのトラブルシューティング。\n- API クォータ制限への対処。\n- スクリプトのデバッグモードの活用。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/gas-01jpcvxfxk935q9x97vbpfp9t8.md","loc":{"lines":{"from":466,"to":517}}}}],["168",{"pageContent":"---\ndescription: tsc settingsに関するドキュメント\nruleId: tsc-01jpcvxfxk935q9x97vbpfp9t7\ntags: [\"development\",\"coding\",\"typescript\"]\naliases: [\"typescript-config\", \"tsconfig\"]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"]\n---\n\n# TypeScript設定\n\n## tsconfig.json\n\nTypeScriptを使用して型安全性を確保するための設定例:。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsc-01jpcvxfxk935q9x97vbpfp9t7.md","loc":{"lines":{"from":1,"to":13}}}}],["169",{"pageContent":"# TypeScript設定\n\n## tsconfig.json\n\nTypeScriptを使用して型安全性を確保するための設定例:。\n\n```json\n{\n \"compilerOptions\": {\n \"target\": \"es2019\",\n \"module\": \"NodeNext\",\n \"moduleResolution\": \"NodeNext\",\n \"esModuleInterop\": true,\n \"lib\": [\"esnext\"],\n \"strict\": true,\n \"experimentalDecorators\": true,\n \"skipLibCheck\": true,\n \"strictNullChecks\": true,\n \"noImplicitAny\": true,\n \"noImplicitThis\": true,\n \"noUnusedLocals\": true,\n \"noUnusedParameters\": true,\n \"noImplicitReturns\": true,\n \"downlevelIteration\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"baseUrl\": \".\",\n \"paths\": {\n \"@/*\": [\"src/*\"]\n },\n \"outDir\": \"./dist\",\n \"rootDir\": \"./src\"\n },\n \"include\": [\"src/**/*\"],\n \"exclude\": [\"node_modules\", \"dist\", \"docs\", \"coverage\"]\n}\n```\n\n主な設定項目の解説:。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsc-01jpcvxfxk935q9x97vbpfp9t7.md","loc":{"lines":{"from":9,"to":46}}}}],["170",{"pageContent":"主な設定項目の解説:。\n\n- `target`: 出力するJavaScriptのバージョン(ES2019は現代的かつ広くサポートされている)\n- `module` と `moduleResolution`: Node.js環境での最新のモジュール解決方式。\n- `strict`: 厳格な型チェックを有効化。\n- `experimentalDecorators`: デコレータを使用可能に。\n- `paths`: エイリアス設定(`@/components/Button`のように短い参照パスが使用可能)\n- `rootDir`: TypeScriptソースファイルの配置場所。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsc-01jpcvxfxk935q9x97vbpfp9t7.md","loc":{"lines":{"from":46,"to":53}}}}],["171",{"pageContent":"---\ndescription: 掟プロジェクトにおけるTypeScriptコードのドキュメント作成規約とベストプラクティス\nruleId: tsdoc-01jpcvxfxjwwn785s5jg7t1773\ntags:\n - development\n - typescript\n - documentation\naliases:\n - typescript-doc\nglobs:\n - '**/*.ts'\n - '**/*.tsx'\n - '**/*.js'\n - '**/*.jsx'\n---\n\n# TSDocの掟\n\n## 基本原則\n\n- [ドキュメントコメントの掟](../doc-comment-01jpcvxfxgyqe2jprh9hgn6xq8.md)に準拠すること\n - ドキュメントコメントは英語で記述する。\n - 記述がないものは新規に追加する。\n - 既存のものでもガイドラインに従っていないものは是正する。\n - コードを見れば分かることは書かない(Why/Why notを中心に記載)\n\n## ドキュメント規約\n\nTypeScriptの公式ドキュメントとTSDocに基づき、以下の規約に従うこと:。\n\n- パブリックAPI要素には必ずドキュメントを付ける。\n- TSDocの標準タグを使用する(`@param`, `@returns`, `@throws`など)\n- ジェネリック型パラメータは`@typeParam`で説明する。\n- 非同期メソッドは戻り値の型を明確に記載する。\n- 型定義は具体的な使用例とともに説明する。\n\n参考:[TSDoc](https://tsdoc.org/)\n\n## ドキュメントスタイル\n\n### インタフェースとクラス","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsdoc-01jpcvxfxjwwn785s5jg7t1773.md","loc":{"lines":{"from":1,"to":41}}}}],["172",{"pageContent":"参考:[TSDoc](https://tsdoc.org/)\n\n## ドキュメントスタイル\n\n### インタフェースとクラス\n\n```typescript\n/**\n * Represents a connection to a database.。\n * \n * @remarks。\n * This class implements automatic reconnection and connection pooling.。\n * All methods are thread-safe.。\n * \n * @example。\n * ```typescript\n * const db = new DatabaseConnection({。\n * host: 'localhost',。\n * port: 5432。\n * });。\n * await db.connect();。\n * ```\n */\nexport class DatabaseConnection {。\n // 実装。\n}\n\n/**\n * Defines the structure for configuration options.。\n * \n * @template T - The type of additional options specific to each implementation。\n */\nexport interface ConfigOptions<T> {。\n /**\n * The environment to use (e.g., 'development', 'production')。\n */\n env: string;\n\n /**\n * Additional implementation-specific options。\n */\n options?: T;\n}\n```\n\n### メソッドとフィールド","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsdoc-01jpcvxfxjwwn785s5jg7t1773.md","loc":{"lines":{"from":37,"to":82}}}}],["173",{"pageContent":"/**\n * Additional implementation-specific options。\n */\n options?: T;\n}\n```\n\n### メソッドとフィールド\n\n```typescript\n/**\n * Executes a query against the database.。\n * \n * @param sql - The SQL query to execute。\n * @param params - Query parameters to bind。\n * @typeParam T - The expected type of the query result。\n * @returns Promise that resolves to the query results。\n * @throws {QueryError} When the query fails to execute。\n * \n * @example。\n * ```typescript\n * const users = await db.query<User[]>(。\n * 'SELECT * FROM users WHERE age > ?',。\n * [18]。\n * );。\n * ```\n */\nasync query<T>(sql: string, params: any[]): Promise<T>\n\n/**\n * Maximum number of concurrent connections allowed.。\n * \n * @remarks。\n * This value can be adjusted based on available system resources.。\n * Default value is calculated based on CPU cores.。\n */\nreadonly maxConnections: number;\n```\n\n### 型エイリアスと列挙型","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsdoc-01jpcvxfxjwwn785s5jg7t1773.md","loc":{"lines":{"from":75,"to":114}}}}],["174",{"pageContent":"### 型エイリアスと列挙型\n\n```typescript\n/**\n * Represents possible states of a connection.。\n * \n * @remarks。\n * The state transitions follow this order:。\n * DISCONNECTED -> CONNECTING -> CONNECTED -> DISCONNECTING。\n */\nexport enum ConnectionState {。\n /** Not connected to the database */。\n DISCONNECTED,。\n /** Connection attempt in progress */。\n CONNECTING,。\n /** Successfully connected */。\n CONNECTED,。\n /** Disconnection in progress */。\n DISCONNECTING。\n}\n\n/**\n * Configuration for retry behavior.。\n * \n * @example。\n * ```typescript\n * const config: RetryConfig = {。\n * maxAttempts: 3,。\n * delay: 1000,。\n * backoff: 'exponential'。\n * };。\n * ```\n */\nexport type RetryConfig = {。\n /** Maximum number of retry attempts */。\n maxAttempts: number;\n /** Delay between retries in milliseconds */。\n delay: number;\n /** Type of backoff strategy to use */。\n backoff: 'fixed' | 'exponential';\n};\n```\n\n## 特殊な記法\n\n### リンクとリファレンス","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsdoc-01jpcvxfxjwwn785s5jg7t1773.md","loc":{"lines":{"from":114,"to":159}}}}],["175",{"pageContent":"## 特殊な記法\n\n### リンクとリファレンス\n\n```typescript\n/**\n * See {@link ConnectionPool} for managing multiple connections.。\n * \n * For more details, see {@link https://example.com/docs | API Documentation}.。\n * \n * @see {@link ConfigOptions} for configuration options。\n */\n```\n\n### モジュールとパッケージ\n\n```typescript\n/**\n * @packageDocumentation。\n * Provides utilities for database connection management.。\n * \n * @remarks。\n * This module implements connection pooling, automatic reconnection,。\n * and transaction management for various database types.。\n * \n * @example。\n * ```typescript\n * import { createPool } from '@example/db';。\n * \n * const pool = createPool({。\n * maxSize: 10,。\n * idleTimeout: 1000。\n * });。\n * ```\n */\n```\n\n### 非推奨と移行\n\n```typescript\n/**\n * @deprecated Use {@link newMethod} instead.。\n * This method will be removed in version 2.0.0.。\n * \n * @example。\n * Before:。\n * ```typescript\n * oldMethod(value);。\n * ```\n * \n * After:。\n * ```typescript\n * newMethod({ value });。\n * ```\n */\n```\n\n## テストとの統合","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsdoc-01jpcvxfxjwwn785s5jg7t1773.md","loc":{"lines":{"from":157,"to":214}}}}],["176",{"pageContent":"## テストとの統合\n\n### Jest Test例の記述\n\n```typescript\n/**\n * Safely adds two numbers, handling potential overflow.。\n * \n * @example。\n * ```typescript\n * import { add } from './math';。\n * \n * test('add numbers', () => {。\n * expect(add(2, 3)).toBe(5);。\n * expect(add(Number.MAX_SAFE_INTEGER, 1)).toBeNull();。\n * });。\n * ```\n */\nexport function add(a: number, b: number): number | null\n```\n\n## レビュー時の注意点\n\n- ドキュメントが最新の実装を反映しているか。\n- 全てのパブリック要素にドキュメントが付いているか。\n- 説明が明確で具体的か。\n- サンプルコードが実際に動作するか。\n- 英語の文法や表現が適切か。\n- 型情報が正確に記載されているか。\n\n## 関連情報\n\n- [TSDoc Specification](https://tsdoc.org/)\n- [TypeScript Documentation](https://www.typescriptlang.org/docs/)\n- [API Extractor](https://api-extractor.com/) - Microsoft's API documentation tool","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsdoc-01jpcvxfxjwwn785s5jg7t1773.md","loc":{"lines":{"from":214,"to":248}}}}],["177",{"pageContent":"---\ndescription: 掟プロジェクトにおけるTypeScript開発に関する参考文献とリソースのリスト\nruleId: tsrefs-01jpcvxfxjwwn785s5jg7t1772\ntags:\n - development\n - typescript\n - references\naliases:\n - typescript-refs\nglobs:\n - '**/*.ts'\n - '**/*.tsx'\n - '**/*.js'\n - '**/*.jsx'\n---\n\n# TypeScript参考文献\n\n## 公式ドキュメント\n\n### 基本ドキュメント\n\n- [TypeScript公式サイト](https://www.typescriptlang.org/) - TypeScript言語の公式ウェブサイト\n- [TypeScript Documentation](https://www.typescriptlang.org/docs/) - 公式ドキュメント\n- [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/intro.html) - TypeScriptの基本的な概念と機能を学ぶためのガイド\n- [TypeScript Release Notes](https://www.typescriptlang.org/docs/handbook/release-notes/) - 各バージョンの新機能と変更点\n\n### 特定のトピック","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsrefs-01jpcvxfxjwwn785s5jg7t1772.md","loc":{"lines":{"from":1,"to":28}}}}],["178",{"pageContent":"### 特定のトピック\n\n- [TypeScript Type System](https://www.typescriptlang.org/docs/handbook/2/types-from-types.html) - 型システムの詳細ガイド\n- [TypeScript Classes](https://www.typescriptlang.org/docs/handbook/2/classes.html) - クラスの使用方法\n- [TypeScript Modules](https://www.typescriptlang.org/docs/handbook/modules.html) - モジュールシステムの解説\n- [TypeScript Decorators](https://www.typescriptlang.org/docs/handbook/decorators.html) - デコレータの使用方法\n- [TypeScript Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html) - 組み込みユーティリティ型の解説\n\n## 学習リソース\n\n### 初心者向け\n\n- [TypeScript for JavaScript Programmers](https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html) - JavaScriptプログラマー向けの簡潔な入門\n- [TypeScript Playground](https://www.typescriptlang.org/play) - ブラウザでTypeScriptを試せるオンラインエディタ\n- [TypeScript Deep Dive](https://basarat.gitbook.io/typescript/) - 無料のオンラインブック\n- [TypeScript Tutorial](https://www.tutorialsteacher.com/typescript) - 段階的なチュートリアル\n\n### 中級者向け","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsrefs-01jpcvxfxjwwn785s5jg7t1772.md","loc":{"lines":{"from":28,"to":45}}}}],["179",{"pageContent":"### 中級者向け\n\n- [TypeScript Evolution](https://mariusschulz.com/blog/series/typescript-evolution) - TypeScriptの進化と新機能の解説\n- [Advanced Types in TypeScript](https://www.typescriptlang.org/docs/handbook/advanced-types.html) - 高度な型機能の解説\n- [Effective TypeScript](https://effectivetypescript.com/) - TypeScriptを効果的に使うためのガイド\n- [Clean Code TypeScript](https://github.com/labs42io/clean-code-typescript) - TypeScriptでのクリーンコードの原則\n\n### 上級者向け\n\n- [TypeScript Compiler API](https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API) - コンパイラAPIの使用方法\n- [TypeScript AST Viewer](https://ts-ast-viewer.com/) - TypeScriptの抽象構文木を視覚化するツール\n- [TypeScript Design Patterns](https://refactoring.guru/design-patterns/typescript) - TypeScriptでのデザインパターン\n- [TypeScript Performance](https://github.com/microsoft/TypeScript/wiki/Performance) - TypeScriptのパフォーマンス最適化\n\n## ブログと記事","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsrefs-01jpcvxfxjwwn785s5jg7t1772.md","loc":{"lines":{"from":45,"to":59}}}}],["180",{"pageContent":"## ブログと記事\n\n- [TypeScript Blog](https://devblogs.microsoft.com/typescript/) - 公式ブログ\n- [TypeScript Weekly](https://www.typescript-weekly.com/) - TypeScriptに関する週刊ニュースレター\n- [2ality](https://2ality.com/archive.html) - Dr. Axel Rauschmayerによる深い技術記事\n- [Marius Schulz's Blog](https://mariusschulz.com/blog) - TypeScriptに関する詳細な記事\n\n## 動画リソース\n\n- [TypeScript Course for Beginners](https://www.youtube.com/watch?v=BwuLxPH8IDs) - Academindによる初心者向けコース\n- [TypeScript - The Basics](https://www.youtube.com/watch?v=ahCwqrYpIuM) - Fireship.ioによる簡潔な入門\n- [TypeScript Full Course](https://www.youtube.com/watch?v=gp5H0Vw39yw) - freeCodeCampによる包括的なコース\n- [Advanced TypeScript](https://www.youtube.com/playlist?list=PLIvujZeVDLMx040-j1W4WFs1BxuTGdI_b) - 高度なTypeScript機能の解説\n\n## コミュニティ\n\n### 日本語コミュニティ","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsrefs-01jpcvxfxjwwn785s5jg7t1772.md","loc":{"lines":{"from":59,"to":75}}}}],["181",{"pageContent":"## コミュニティ\n\n### 日本語コミュニティ\n\n- [TypeScript Japan](https://typescript-jp.dev/) - 日本のTypeScriptコミュニティ\n- [TypeScript Meetup Tokyo](https://typescript-jp.connpass.com/) - 東京のTypeScriptミートアップ\n- [Qiita TypeScriptタグ](https://qiita.com/tags/typescript) - TypeScriptに関する日本語記事\n\n### 国際コミュニティ\n\n- [TypeScript Discord](https://discord.gg/typescript) - 公式Discordサーバー\n- [TypeScript GitHub](https://github.com/microsoft/TypeScript) - TypeScriptのGitHubリポジトリ\n- [TypeScript StackOverflow](https://stackoverflow.com/questions/tagged/typescript) - StackOverflowのTypeScriptタグ\n- [TypeScript Reddit](https://www.reddit.com/r/typescript/) - Redditのr/typescriptコミュニティ\n\n## ツールとライブラリ\n\n### 主要ライブラリ\n\n#### フロントエンドフレームワーク","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsrefs-01jpcvxfxjwwn785s5jg7t1772.md","loc":{"lines":{"from":73,"to":92}}}}],["182",{"pageContent":"## ツールとライブラリ\n\n### 主要ライブラリ\n\n#### フロントエンドフレームワーク\n\n- [React with TypeScript](https://reactjs.org/docs/static-type-checking.html#typescript) - ReactでのTypeScript使用ガイド\n- [Angular](https://angular.io/guide/typescript-configuration) - TypeScriptをネイティブサポートするフレームワーク\n- [Vue.js with TypeScript](https://vuejs.org/guide/typescript/overview.html) - VueでのTypeScript使用ガイド\n- [Svelte with TypeScript](https://svelte.dev/docs#typescript) - SvelteでのTypeScript使用ガイド\n\n#### バックエンドフレームワーク\n\n- [NestJS](https://nestjs.com/) - TypeScriptベースのNode.jsフレームワーク\n- [Express with TypeScript](https://expressjs.com/en/resources/frameworks/typescript.html) - ExpressでのTypeScript使用ガイド\n- [Deno](https://deno.land/) - TypeScriptをネイティブサポートするJavaScriptランタイム\n- [Fastify with TypeScript](https://www.fastify.io/docs/latest/Reference/TypeScript/) - FastifyでのTypeScript使用ガイド\n\n#### 状態管理","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsrefs-01jpcvxfxjwwn785s5jg7t1772.md","loc":{"lines":{"from":88,"to":106}}}}],["183",{"pageContent":"#### 状態管理\n\n- [Redux Toolkit](https://redux-toolkit.js.org/usage/usage-with-typescript) - ReduxでのTypeScript使用ガイド\n- [MobX](https://mobx.js.org/installation.html#typescript) - MobXでのTypeScript使用ガイド\n- [Zustand](https://github.com/pmndrs/zustand) - TypeScriptフレンドリーな状態管理ライブラリ\n- [XState](https://xstate.js.org/docs/guides/typescript.html) - 状態マシンライブラリ\n\n#### ユーティリティ\n\n- [ts-node](https://github.com/TypeStrong/ts-node) - TypeScriptの実行環境\n- [type-fest](https://github.com/sindresorhus/type-fest) - 便利な型定義のコレクション\n- [zod](https://github.com/colinhacks/zod) - TypeScriptファーストのスキーマ検証ライブラリ\n- [fp-ts](https://github.com/gcanti/fp-ts) - TypeScriptでの関数型プログラミングライブラリ\n\n### 開発ツール","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsrefs-01jpcvxfxjwwn785s5jg7t1772.md","loc":{"lines":{"from":106,"to":120}}}}],["184",{"pageContent":"### 開発ツール\n\n- [TypeScript Compiler (tsc)](https://www.typescriptlang.org/docs/handbook/compiler-options.html) - 公式コンパイラ\n- [ESLint with TypeScript](https://typescript-eslint.io/) - TypeScript用のESLint設定\n- [Prettier](https://prettier.io/) - コードフォーマッター\n- [TypeDoc](https://typedoc.org/) - TypeScriptコードからドキュメントを生成するツール\n- [ts-jest](https://kulshekhar.github.io/ts-jest/) - JestでTypeScriptをテストするためのツール\n\n## 書籍\n\n### 日本語書籍\n\n- [プログラミングTypeScript](https://www.oreilly.co.jp/books/9784873119045/) - TypeScriptの基本から応用まで\n- [実践TypeScript](https://gihyo.jp/book/2019/978-4-297-10460-0) - BFFとNext.js&Nuxt.jsの型定義\n- [TypeScriptとReact/Next.jsでつくる実践Webアプリケーション開発](https://www.shuwasystem.co.jp/book/9784798067278.html) - 実践的なWebアプリ開発\n\n### 英語書籍","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsrefs-01jpcvxfxjwwn785s5jg7t1772.md","loc":{"lines":{"from":120,"to":136}}}}],["185",{"pageContent":"### 英語書籍\n\n- [Programming TypeScript](https://www.oreilly.com/library/view/programming-typescript/9781492037644/) - TypeScriptの包括的なガイド\n- [Effective TypeScript](https://www.oreilly.com/library/view/effective-typescript/9781492053736/) - TypeScriptを効果的に使うための62の方法\n- [TypeScript in 50 Lessons](https://typescript-book.com/) - 実践的なレッスンでTypeScriptを学ぶ\n- [Learning TypeScript](https://www.oreilly.com/library/view/learning-typescript/9781098110321/) - JavaScriptからTypeScriptへの移行ガイド\n\n## 企業事例\n\n- [Adopting TypeScript at Scale](https://www.youtube.com/watch?v=P-J9Eg7hJwE) - AirbnbでのTypeScript採用事例\n- [TypeScript at Google](https://www.youtube.com/watch?v=u-nxBPDdAFo) - GoogleでのTypeScript活用\n- [TypeScript at Microsoft](https://devblogs.microsoft.com/typescript/how-microsoft-uses-typescript/) - MicrosoftでのTypeScript活用\n- [TypeScript at Slack](https://slack.engineering/typescript-at-slack/) - SlackでのTypeScript移行\n\n## 学習パス\n\n### 初心者向けロードマップ","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsrefs-01jpcvxfxjwwn785s5jg7t1772.md","loc":{"lines":{"from":136,"to":152}}}}],["186",{"pageContent":"## 学習パス\n\n### 初心者向けロードマップ\n\n1. [TypeScript for JavaScript Programmers](https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html)で基本を学ぶ\n2. [TypeScript Handbook](https://www.typescriptlang.org/docs/handbook/intro.html)で概念を深める\n3. [TypeScript Playground](https://www.typescriptlang.org/play)で実験\n4. 小さなプロジェクトを作成(CLIツール、簡単なWebアプリなど)\n\n### 中級者向けロードマップ\n\n1. [Advanced Types in TypeScript](https://www.typescriptlang.org/docs/handbook/advanced-types.html)で高度な型を学ぶ\n2. [TypeScript Utility Types](https://www.typescriptlang.org/docs/handbook/utility-types.html)を理解する\n3. [Clean Code TypeScript](https://github.com/labs42io/clean-code-typescript)でベストプラクティスを学ぶ\n4. 中規模のプロジェクトに取り組む(Webアプリ、APIなど)\n\n### 上級者向けロードマップ","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsrefs-01jpcvxfxjwwn785s5jg7t1772.md","loc":{"lines":{"from":150,"to":166}}}}],["187",{"pageContent":"### 上級者向けロードマップ\n\n1. [TypeScript Compiler API](https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API)を学ぶ\n2. [TypeScript Design Patterns](https://refactoring.guru/design-patterns/typescript)を理解する\n3. [TypeScript Performance](https://github.com/microsoft/TypeScript/wiki/Performance)で最適化を学ぶ\n4. オープンソースプロジェクトに貢献する。\n\n## TypeScript 5.0以降の新機能\n\n- [TypeScript 5.0](https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/) - デコレータの標準化、const型パラメータなど\n- [TypeScript 5.1](https://devblogs.microsoft.com/typescript/announcing-typescript-5-1/) - JSX属性のチェック改善、非同期関数の戻り値型推論の改善など\n- [TypeScript 5.2](https://devblogs.microsoft.com/typescript/announcing-typescript-5-2/) - using宣言、明示的リソース管理など\n- [TypeScript 5.3](https://devblogs.microsoft.com/typescript/announcing-typescript-5-3/) - インポート属性、switch文の網羅性チェックの改善など\n\n## 関連情報","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsrefs-01jpcvxfxjwwn785s5jg7t1772.md","loc":{"lines":{"from":166,"to":180}}}}],["188",{"pageContent":"## 関連情報\n\n- [TSDocの掟](tsdoc-01jpcvxfxjwwn785s5jg7t1773.md)\n- [TypeScriptコーディングスタイル](tsstyle-01jpcvxfxjwwn785s5jg7t1770.md)\n- [TypeScriptツール活用](tstools-01jpcvxfxha41b95hkx2y2y2pz.md)\n- [TypeScriptコードレビュー](tsreview-01jpcvxfxjwwn785s5jg7t1771.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsrefs-01jpcvxfxjwwn785s5jg7t1772.md","loc":{"lines":{"from":180,"to":185}}}}],["189",{"pageContent":"---\ndescription: 掟プロジェクトにおけるTypeScriptコードのレビュー基準とベストプラクティス\nruleId: tsreview-01jpcvxfxjwwn785s5jg7t1771\ntags:\n - development\n - typescript\n - review\naliases:\n - typescript-review\nglobs:\n - '**/*.ts'\n - '**/*.tsx'\n - '**/*.js'\n - '**/*.jsx'\n---\n\n# TypeScriptコードレビュー\n\n## 基本原則\n\n- コードの品質と保守性を向上させることを目的とする。\n- 建設的なフィードバックを心がける。\n- 問題点だけでなく、良い点も指摘する。\n- 個人ではなくコードに焦点を当てる。\n- 「なぜ」と「どのように」の両方を説明する。\n\n## レビューの流れ\n\n1. **全体像の把握**。\n - コードの目的と設計を理解する。\n - 変更の範囲と影響を確認する。\n - テストの有無と品質を確認する。\n\n2. **詳細レビュー**。\n - コードの正確性を確認する。\n - パフォーマンスとリソース使用を評価する。\n - エラー処理の適切さを確認する。\n - コードスタイルとドキュメントを確認する。\n\n3. **フィードバック提供**。\n - 明確で具体的なコメントを提供する。\n - 重要な問題と軽微な問題を区別する。\n - 可能な場合は解決策を提案する。\n\n## チェックリスト\n\n### 型システム\n\n#### 型の使用\n\n- [ ] `any`型の使用は最小限に抑えられているか。\n- [ ] 明示的な型注釈は必要な場所でのみ使用されているか。\n- [ ] union型とintersection型は適切に活用されているか。\n- [ ] ジェネリクスは意味のある制約を持っているか。\n- [ ] インデックスシグネチャは慎重に使用されているか。\n\n```typescript\n// 良い例。\nfunction getUser<T extends { id: string }>(id: string): Promise<T> {\n // 実装。\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":1,"to":61}}}}],["190",{"pageContent":"```typescript\n// 良い例。\nfunction getUser<T extends { id: string }>(id: string): Promise<T> {\n // 実装。\n}\n\n// 型エイリアスの使用。\ntype UserRole = 'admin' | 'editor' | 'viewer';。\n\n// 避けるべき例。\nfunction processData(data: any): any { // any型の使用\n // 実装。\n}\n```\n\n#### 型安全性\n\n- [ ] 型アサーションは必要最小限に抑えられているか。\n- [ ] `null`と`undefined`は適切に処理されているか。\n- [ ] 型ガードは効果的に使用されているか。\n- [ ] `readonly`修飾子は適切に使用されているか。\n- [ ] 条件付き型は複雑すぎないか。\n\n```typescript\n// 良い例 - 型ガードの使用。\nfunction isUser(obj: any): obj is User {\n return obj && typeof obj === 'object' && 'id' in obj && 'name' in obj;。\n}\n\nfunction processEntity(entity: User | Company) {\n if (isUser(entity)) {。\n // entityはUser型として扱われる。\n console.log(entity.name);。\n } else {。\n // entityはCompany型として扱われる。\n console.log(entity.companyName);。\n }\n}\n\n// 避けるべき例 - 型アサーションの乱用。\nfunction processUser(data: any) {\n const user = data as User; // 危険な型アサーション。\n console.log(user.name); // 実行時エラーの可能性。\n}\n```\n\n### コード構造\n\n#### 関数設計","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":57,"to":105}}}}],["191",{"pageContent":"// 避けるべき例 - 型アサーションの乱用。\nfunction processUser(data: any) {\n const user = data as User; // 危険な型アサーション。\n console.log(user.name); // 実行時エラーの可能性。\n}\n```\n\n### コード構造\n\n#### 関数設計\n\n- [ ] 関数は単一責任の原則に従っているか。\n- [ ] 引数は適切な数に抑えられているか。\n- [ ] デフォルト値は適切に使用されているか。\n- [ ] 戻り値の型は明確か。\n- [ ] 副作用は最小限に抑えられているか。\n\n```typescript\n// 良い例。\ninterface UserOptions {。\n includeDetails?: boolean;\n fetchRoles?: boolean;\n}\n\nasync function getUser(。\n id: string,\n options: UserOptions = {}\n): Promise<User> {\n const { includeDetails = false, fetchRoles = false } = options;。\n // 実装。\n}\n\n// 避けるべき例。\nasync function getUser(。\n id: string,\n includeDetails: boolean,\n fetchRoles: boolean,\n cache: boolean,\n timeout: number\n): Promise<User> {\n // 引数が多すぎる。\n}\n```\n\n#### クラス設計\n\n- [ ] クラスは単一責任の原則に従っているか。\n- [ ] プロパティは適切にカプセル化されているか。\n- [ ] 継承よりもコンポジションが優先されているか。\n- [ ] インタフェースは適切に使用されているか。\n- [ ] 静的メソッドと静的プロパティは適切に使用されているか。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":96,"to":146}}}}],["192",{"pageContent":"#### クラス設計\n\n- [ ] クラスは単一責任の原則に従っているか。\n- [ ] プロパティは適切にカプセル化されているか。\n- [ ] 継承よりもコンポジションが優先されているか。\n- [ ] インタフェースは適切に使用されているか。\n- [ ] 静的メソッドと静的プロパティは適切に使用されているか。\n\n```typescript\n// 良い例 - コンポジションの使用。\nclass UserService {。\n constructor(。\n private readonly userRepository: UserRepository,\n private readonly logger: Logger\n ) {}。\n\n async getUser(id: string): Promise<User> {\n this.logger.info(`Fetching user: ${id}`);\n const user = await this.userRepository.findById(id);。\n if (!user) {。\n throw new NotFoundError(`User with ID ${id} not found`);。\n }\n return user;。\n }\n}\n\n// 避けるべき例 - 継承の乱用。\nclass BaseService {。\n protected logger: Logger;\n protected db: Database;\n \n constructor() {。\n this.logger = new Logger();。\n this.db = new Database();。\n }\n \n // 共通メソッド。\n}\n\nclass UserService extends BaseService {。\n // UserServiceの実装。\n}\n\nclass ProductService extends BaseService {。\n // ProductServiceの実装。\n}\n```\n\n#### モジュール構成","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":140,"to":188}}}}],["193",{"pageContent":"class UserService extends BaseService {。\n // UserServiceの実装。\n}\n\nclass ProductService extends BaseService {。\n // ProductServiceの実装。\n}\n```\n\n#### モジュール構成\n\n- [ ] 関連する機能は論理的なモジュールにグループ化されているか。\n- [ ] 循環依存は避けられているか。\n- [ ] インポートとエクスポートは適切に管理されているか。\n- [ ] バレル(index.ts)は効果的に使用されているか。\n- [ ] 公開APIは明確に定義されているか。\n\n```typescript\n// 良い例 - 明確なモジュール構造。\n// users/index.ts。\nexport { User } from './models/user';。\nexport { UserService } from './services/user-service';。\nexport { UserController } from './controllers/user-controller';。\n// UserRepositoryはエクスポートされていないため、内部実装として扱われる。\n\n// 避けるべき例 - 循環依存。\n// a.ts。\nimport { B } from './b';。\nexport class A {。\n b: B;\n}\n\n// b.ts。\nimport { A } from './a';。\nexport class B {。\n a: A;\n}\n```\n\n### エラー処理\n\n#### エラー設計\n\n- [ ] カスタムエラークラスは適切に定義されているか。\n- [ ] エラーは適切に分類されているか。\n- [ ] エラーメッセージは具体的で理解しやすいか。\n- [ ] エラーには追加情報が含まれているか。\n- [ ] エラー型は型安全か。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":179,"to":226}}}}],["194",{"pageContent":"### エラー処理\n\n#### エラー設計\n\n- [ ] カスタムエラークラスは適切に定義されているか。\n- [ ] エラーは適切に分類されているか。\n- [ ] エラーメッセージは具体的で理解しやすいか。\n- [ ] エラーには追加情報が含まれているか。\n- [ ] エラー型は型安全か。\n\n```typescript\n// 良い例。\nabstract class ApplicationError extends Error {。\n constructor(message: string, public readonly metadata?: Record<string, unknown>) {\n super(message);。\n this.name = this.constructor.name;。\n Error.captureStackTrace(this, this.constructor);。\n }\n}\n\nclass NotFoundError extends ApplicationError {。\n constructor(message: string, metadata?: Record<string, unknown>) {\n super(message, metadata);。\n }\n}\n\nclass ValidationError extends ApplicationError {。\n constructor(。\n message: string,\n public readonly validationErrors: Record<string, string[]>,\n metadata?: Record<string, unknown>\n ) {\n super(message, metadata);。\n }\n}\n\n// 避けるべき例。\nfunction handleError(error: any) {\n if (error.code === 'NOT_FOUND') {。\n // エラーコードに依存した処理。\n }\n}\n```\n\n#### エラーハンドリング","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":218,"to":262}}}}],["195",{"pageContent":"// 避けるべき例。\nfunction handleError(error: any) {\n if (error.code === 'NOT_FOUND') {。\n // エラーコードに依存した処理。\n }\n}\n```\n\n#### エラーハンドリング\n\n- [ ] try-catchブロックは適切な範囲で使用されているか。\n- [ ] エラーは適切に変換して伝播されているか。\n- [ ] 非同期エラーは適切に処理されているか。\n- [ ] エラーログは有用な情報を含んでいるか。\n- [ ] 回復可能なエラーと回復不可能なエラーは区別されているか。\n\n```typescript\n// 良い例。\nasync function processUserData(userId: string): Promise<ProcessedData> {\n try {。\n const userData = await fetchUserData(userId);。\n return transformData(userData);。\n } catch (error) {。\n if (error instanceof NotFoundError) {。\n logger.warn(`User data not found: ${userId}`);\n return getDefaultData();。\n }\n \n if (error instanceof ValidationError) {。\n logger.error('Validation failed', { errors: error.validationErrors });\n throw error; // 再スロー。\n }\n \n // 未知のエラーを変換。\n logger.error('Unexpected error during data processing', { error });。\n throw new ApplicationError('Failed to process user data', { cause: error });\n }\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":254,"to":291}}}}],["196",{"pageContent":"// 避けるべき例。\nasync function processUserData(userId: string): Promise<ProcessedData> {\n try {。\n const userData = await fetchUserData(userId);。\n return transformData(userData);。\n } catch (error) {。\n console.error('Error:', error);\n throw error; // 情報が追加されていない。\n }\n}\n```\n\n### 非同期処理\n\n#### Promise と async/await\n\n- [ ] `async/await`は一貫して使用されているか。\n- [ ] Promiseチェインは適切に例外処理されているか。\n- [ ] 複数の非同期処理は効率的に並列化されているか。\n- [ ] 非同期関数は戻り値の型を明確に定義しているか。\n- [ ] 非同期エラーは適切に処理されているか。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":293,"to":313}}}}],["197",{"pageContent":"### 非同期処理\n\n#### Promise と async/await\n\n- [ ] `async/await`は一貫して使用されているか。\n- [ ] Promiseチェインは適切に例外処理されているか。\n- [ ] 複数の非同期処理は効率的に並列化されているか。\n- [ ] 非同期関数は戻り値の型を明確に定義しているか。\n- [ ] 非同期エラーは適切に処理されているか。\n\n```typescript\n// 良い例。\nasync function fetchUserData(userId: string): Promise<UserData> {\n try {。\n const user = await userRepository.findById(userId);。\n if (!user) {。\n throw new NotFoundError(`User with ID ${userId} not found`);。\n }\n \n const [profile, permissions] = await Promise.all([。\n profileService.getProfile(userId),。\n permissionService.getPermissions(userId)。\n ]);\n \n return {。\n user,。\n profile,。\n permissions。\n };\n } catch (error) {。\n logger.error('Failed to fetch user data', { userId, error });。\n throw new ApplicationError('Failed to fetch user data', { cause: error });\n }\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":305,"to":338}}}}],["198",{"pageContent":"// 避けるべき例。\nfunction fetchUserData(userId: string) { // 戻り値の型が不明確\n return userRepository.findById(userId)。\n .then(user => {。\n if (!user) {。\n throw new Error(`User not found: ${userId}`);\n }\n return user;。\n })\n .then(user => {。\n // ネストされたPromiseチェーン。\n return profileService.getProfile(userId)。\n .then(profile => {。\n return { user, profile };。\n });\n });\n}\n```\n\n#### 非同期パフォーマンス\n\n- [ ] 不必要な直列化は避けられているか。\n- [ ] 非同期操作のキャッシュは考慮されているか。\n- [ ] 長時間実行される処理は適切に管理されているか。\n- [ ] キャンセル可能な操作は実装されているか。\n- [ ] 非同期リソースは適切に解放されているか。\n\n```typescript\n// 良い例 - 並列処理。\nasync function loadDashboardData(userId: string): Promise<DashboardData> {\n const [。\n userProfile,。\n recentActivity,。\n notifications。\n ] = await Promise.all([。\n userService.getProfile(userId),。\n activityService.getRecentActivity(userId),。\n notificationService.getUnread(userId)。\n ]);\n \n return {。\n userProfile,。\n recentActivity,。\n notifications。\n };\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":340,"to":385}}}}],["199",{"pageContent":"// 避けるべき例 - 直列処理。\nasync function loadDashboardData(userId: string): Promise<DashboardData> {\n const userProfile = await userService.getProfile(userId);。\n const recentActivity = await activityService.getRecentActivity(userId);。\n const notifications = await notificationService.getUnread(userId);。\n \n return {。\n userProfile,。\n recentActivity,。\n notifications。\n };\n}\n```\n\n### コード品質\n\n#### 可読性\n\n- [ ] 変数名と関数名は明確で意味があるか。\n- [ ] コードは適切に構造化されているか。\n- [ ] 複雑な処理には適切なコメントがあるか。\n- [ ] マジックナンバーは避けられているか。\n- [ ] ネストは最小限に抑えられているか。\n\n```typescript\n// 良い例。\nconst MAX_RETRY_COUNT = 3;。\nconst RETRY_DELAY_MS = 100;。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":387,"to":414}}}}],["200",{"pageContent":"```typescript\n// 良い例。\nconst MAX_RETRY_COUNT = 3;。\nconst RETRY_DELAY_MS = 100;。\n\nasync function fetchWithRetry(url: string): Promise<Response> {\n let attempts = 0;。\n \n while (true) {。\n try {。\n return await fetch(url);。\n } catch (error) {。\n attempts++;。\n \n if (attempts >= MAX_RETRY_COUNT) {。\n throw new NetworkError(`Failed to fetch ${url} after ${MAX_RETRY_COUNT} attempts`, { cause: error });\n }\n \n await delay(RETRY_DELAY_MS);。\n }\n }\n}\n\n// 避けるべき例。\nasync function f(u: string): Promise<Response> {\n let a = 0;。\n \n while (true) {。\n try {。\n return await fetch(u);。\n } catch (e) {。\n a++;。\n \n if (a >= 3) {。\n throw e;。\n }\n \n await delay(100);。\n }\n }\n}\n```\n\n#### テスト\n\n- [ ] 適切なテストカバレッジがあるか。\n- [ ] テストは独立していて再現可能か。\n- [ ] エッジケースはテストされているか。\n- [ ] テストは明確で理解しやすいか。\n- [ ] モックとスタブは適切に使用されているか。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":411,"to":460}}}}],["201",{"pageContent":"```typescript\n// 良い例。\ndescribe('UserService', () => {。\n let userService: UserService;\n let mockRepository: jest.Mocked<UserRepository>;\n \n beforeEach(() => {。\n mockRepository = {。\n findById: jest.fn(),\n save: jest.fn(),\n delete: jest.fn()\n };\n userService = new UserService(mockRepository);。\n });\n \n describe('getUser', () => {。\n it('should return user when valid ID is provided', async () => {。\n // Arrange。\n const mockUser = { id: '123', name: 'Test User' };\n mockRepository.findById.mockResolvedValue(mockUser);。\n \n // Act。\n const result = await userService.getUser('123');。\n \n // Assert。\n expect(result).toEqual(mockUser);。\n expect(mockRepository.findById).toHaveBeenCalledWith('123');。\n });\n \n it('should throw NotFoundError when user does not exist', async () => {。\n // Arrange。\n mockRepository.findById.mockResolvedValue(null);。\n \n // Act & Assert。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":462,"to":495}}}}],["202",{"pageContent":"});\n \n it('should throw NotFoundError when user does not exist', async () => {。\n // Arrange。\n mockRepository.findById.mockResolvedValue(null);。\n \n // Act & Assert。\n await expect(userService.getUser('456')).rejects.toThrow(NotFoundError);。\n expect(mockRepository.findById).toHaveBeenCalledWith('456');。\n });\n });\n});","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":489,"to":500}}}}],["203",{"pageContent":"// 避けるべき例。\ntest('user service', async () => {。\n const service = new UserService(new UserRepository());。\n const user = await service.getUser('123');。\n expect(user).toBeDefined();。\n});\n```\n\n#### ドキュメント\n\n- [ ] パブリックAPIには適切なJSDocがあるか。\n- [ ] パラメータと戻り値の型は明示的に記述されているか。\n- [ ] 例外がスローされる条件は記載されているか。\n- [ ] 例が含まれているか。\n- [ ] 複雑な処理や非自明な動作は説明されているか。\n\n```typescript\n/**\n * ユーザー情報を取得します。\n * \n * @param id - ユーザーID。\n * @param options - 取得オプション。\n * @returns ユーザー情報。\n * @throws {NotFoundError} ユーザーが見つからない場合。\n * @throws {AuthorizationError} アクセス権限がない場合。\n * \n * @example。\n * ```typescript\n * const user = await userService.getUser('123', { includeDetails: true });。\n * console.log(user.name);。\n * ```\n */\nasync function getUser(。\n id: string,\n options: UserOptions = {}\n): Promise<User> {\n // 実装。\n}\n```\n\n### パフォーマンス\n\n#### 最適化\n\n- [ ] 不必要なオブジェクト生成は避けられているか。\n- [ ] メモ化は適切に使用されているか。\n- [ ] 大きな配列操作は効率的に行われているか。\n- [ ] 計算コストの高い処理は最適化されているか。\n- [ ] 再レンダリングは最小限に抑えられているか(フロントエンド)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":502,"to":550}}}}],["204",{"pageContent":"### パフォーマンス\n\n#### 最適化\n\n- [ ] 不必要なオブジェクト生成は避けられているか。\n- [ ] メモ化は適切に使用されているか。\n- [ ] 大きな配列操作は効率的に行われているか。\n- [ ] 計算コストの高い処理は最適化されているか。\n- [ ] 再レンダリングは最小限に抑えられているか(フロントエンド)\n\n```typescript\n// 良い例 - メモ化。\nfunction memoize<T, R>(fn: (arg: T) => R): (arg: T) => R {\n const cache = new Map<T, R>();。\n \n return (arg: T): R => {\n if (cache.has(arg)) {。\n return cache.get(arg)!;。\n }\n \n const result = fn(arg);。\n cache.set(arg, result);。\n return result;。\n };\n}\n\nconst calculateExpensiveValue = memoize((input: number) => {\n // 計算コストの高い処理。\n return input * input;。\n});\n\n// 避けるべき例 - 不必要なオブジェクト生成。\nfunction processItems(items: Item[]): Result[] {\n return items.map(item => {。\n // 毎回新しいオブジェクトを作成。\n const data = {。\n id: item.id,\n name: item.name,\n // ...その他のプロパティ。\n };\n return transform(data);。\n });\n}\n```\n\n#### バンドルサイズ\n\n- [ ] ツリーシェイキングを考慮したインポートが使用されているか。\n- [ ] 大きなライブラリは必要な部分だけインポートされているか。\n- [ ] コード分割は適切に実装されているか。\n- [ ] 遅延ロードは考慮されているか。\n- [ ] 依存関係は最小限に抑えられているか。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":542,"to":593}}}}],["205",{"pageContent":"#### バンドルサイズ\n\n- [ ] ツリーシェイキングを考慮したインポートが使用されているか。\n- [ ] 大きなライブラリは必要な部分だけインポートされているか。\n- [ ] コード分割は適切に実装されているか。\n- [ ] 遅延ロードは考慮されているか。\n- [ ] 依存関係は最小限に抑えられているか。\n\n```typescript\n// 良い例。\nimport { map, filter } from 'lodash-es';。\n\n// 避けるべき例。\nimport _ from 'lodash'; // 全体をインポート。\n```\n\n### セキュリティ\n\n- [ ] ユーザー入力は適切に検証されているか。\n- [ ] クロスサイトスクリプティング(XSS)対策は実装されているか。\n- [ ] 機密情報は適切に保護されているか。\n- [ ] 認証と認可は適切に実装されているか。\n- [ ] 依存関係に既知の脆弱性はないか。\n\n```typescript\n// 良い例 - 入力検証。\nfunction validateUsername(username: string): boolean {\n // 英数字とアンダースコアのみを許可。\n return /^[a-zA-Z0-9_]{3,20}$/.test(username);。\n}\n\n// 避けるべき例 - 危険なHTML生成。\nfunction createUserHTML(userData: any): string {\n return `<div class=\"user\">。\n <h2>${userData.name}</h2>\n <div class=\"bio\">${userData.bio}</div>\n </div>`;\n}\n```\n\n## レビューコメントの書き方\n\n### 効果的なフィードバック\n\n- 具体的な問題点を指摘する。\n- 理由を説明する。\n- 改善案を提案する。\n- 肯定的な側面も指摘する。\n\n```\n// 良いフィードバック例。\nこの関数では `any` 型を使用していますが、これは型安全性を損なう可能性があります。\n具体的な型を定義することで、コンパイル時のエラーチェックが強化され、バグを早期に発見できます。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":587,"to":639}}}}],["206",{"pageContent":"### 効果的なフィードバック\n\n- 具体的な問題点を指摘する。\n- 理由を説明する。\n- 改善案を提案する。\n- 肯定的な側面も指摘する。\n\n```\n// 良いフィードバック例。\nこの関数では `any` 型を使用していますが、これは型安全性を損なう可能性があります。\n具体的な型を定義することで、コンパイル時のエラーチェックが強化され、バグを早期に発見できます。\n\n例えば、次のように型を定義することを検討してください:。\n```typescript\ninterface UserData {。\n id: string;\n name: string;\n email: string;\n}\n\nfunction processUser(userData: UserData): void {\n // 実装。\n}\n```\n\n// 悪いフィードバック例。\nany型を使わないでください。\n\n```\n\n### 優先順位付け\n\n- 重大な問題(セキュリティ、正確性、パフォーマンス)を最優先する。\n- 中程度の問題(型安全性、エラー処理)を次に優先する。\n- 軽微な問題(スタイル、ドキュメント)は最後に扱う。\n\n## レビュー後のフォローアップ\n\n- 修正されたコードを再確認する。\n- 未解決の問題を追跡する。\n- 学んだ教訓をチームで共有する。\n- 必要に応じてコーディングガイドラインを更新する。\n\n## 関連情報\n\n- [TypeScript公式ドキュメント](https://www.typescriptlang.org/docs/)\n- [TSDocの掟](tsdoc-01jpcvxfxjwwn785s5jg7t1773.md)\n- [TypeScriptコーディングスタイル](tsstyle-01jpcvxfxjwwn785s5jg7t1770.md)\n- [TypeScriptツール活用](tstools-01jpcvxfxha41b95hkx2y2y2pz.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md","loc":{"lines":{"from":629,"to":677}}}}],["207",{"pageContent":"---\ndescription: 掟プロジェクトにおけるTypeScriptコードのスタイルガイドと規約\nruleId: tsstyle-01jpcvxfxjwwn785s5jg7t1770\ntags:\n - development\n - typescript\n - style\naliases:\n - typescript-style\nglobs:\n - '**/*.ts'\n - '**/*.tsx'\n - '**/*.js'\n - '**/*.jsx'\n---\n\n# TypeScriptコーディングスタイル\n\n## 基本原則\n\n- TypeScriptの公式スタイルガイドに従う。\n- 可読性と保守性を最優先する。\n- 型安全性を確保する。\n- 一貫性のあるコードを書く。\n\n## 命名規則\n\n### 基本ルール\n\n- クラス名、インタフェース名、型名はパスカルケース。\n - 例: `UserService`, `HttpClient`, `ApiResponse`。\n- 変数名、関数名、メソッド名、プロパティ名はキャメルケース。\n - 例: `userData`, `fetchUserData`, `isValid`。\n- 定数は大文字のスネークケース。\n - 例: `MAX_RETRY_COUNT`, `DEFAULT_TIMEOUT`。\n- ファイル名はケバブケース。\n - 例: `user-service.ts`, `http-client.ts`。\n\n### 特殊なケース\n\n- インタフェース名に`I`プレフィックスは付けない。\n - 良い例: `UserRepository` (× `IUserRepository`)。\n- タイプエイリアスには`Type`サフィックスを付ける。\n - 例: `UserDataType`, `ApiResponseType`。\n- ジェネリック型パラメータは意味のある名前を使用する。\n - 単純な場合: `T`, `U`, `V`。\n - 複雑な場合: `TKey`, `TValue`, `TResult`。\n- 真偽値を返す関数やプロパティは`is`, `has`, `can`などで始める。\n - 例: `isValid`, `hasPermission`, `canEdit`。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":1,"to":49}}}}],["208",{"pageContent":"```typescript\n// 良い例。\ninterface User {。\n id: string;\n name: string;\n email: string;\n}\n\ntype UserResponseType = {。\n data: User;\n status: number;\n};\n\nfunction isValidEmail(email: string): boolean {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);。\n}\n\n// 避けるべき例。\ninterface IUser { // 'I'プレフィックスは不要。\n Id: string; // キャメルケースではない\n Name: string;\n Email: string;\n}\n\ntype UserResponse = { // 'Type'サフィックスがない。\n Data: User; // キャメルケースではない\n Status: number;\n};\n```\n\n## ファイル構造\n\n### ファイル編成\n\n- 1ファイルにつき1つの主要な概念(クラス、インタフェースなど)を基本とする。\n- ファイル名は内容を反映したものにする。\n- インポートは以下の順序でグループ化する:。\n 1. 外部ライブラリ。\n 2. アプリケーション内の他のモジュール。\n 3. 相対パスでのインポート。\n- エクスポートはファイルの最後にまとめる。\n\n```typescript\n// user-service.ts。\nimport { Injectable } from '@angular/core';。\nimport { HttpClient } from '@angular/common/http';。\n\nimport { ApiService } from 'src/app/core/api.service';。\nimport { LoggerService } from 'src/app/core/logger.service';。\n\nimport { User } from '../models/user';。\nimport { UserRepository } from './user-repository';。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":51,"to":102}}}}],["209",{"pageContent":"import { User } from '../models/user';。\nimport { UserRepository } from './user-repository';。\n\n@Injectable()。\nexport class UserService implements UserRepository {。\n constructor(。\n private http: HttpClient,\n private apiService: ApiService,\n private logger: LoggerService\n ) {}。\n\n async getUser(id: string): Promise<User> {\n // 実装。\n }\n\n // その他のメソッド。\n}\n\nexport { User };。\n```\n\n### モジュール構成\n\n- 関連する機能をモジュールにグループ化する。\n- バレル(index.ts)を使用してAPIの公開範囲を制御する。\n- 循環依存を避ける。\n- 適切な粒度でモジュールを分割する。\n\n```typescript\n// features/users/index.ts。\nexport * from './user.model';。\nexport * from './user.service';。\nexport * from './user-list.component';。\n// user-utils.ts はエクスポートされていないため、内部実装として扱われる。\n```\n\n## 型システム\n\n### 型の使用\n\n- `any`型の使用は可能な限り避ける。\n- 明示的な型注釈よりも型推論を優先する。\n- 複雑な型には型エイリアスやインタフェースを使用する。\n- union型とintersection型を適切に活用する。\n- ジェネリクスは意味のある制約を付ける。\n\n```typescript\n// 良い例。\nfunction getUser<T extends { id: string }>(id: string): Promise<T> {\n // 実装。\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":101,"to":151}}}}],["210",{"pageContent":"```typescript\n// 良い例。\nfunction getUser<T extends { id: string }>(id: string): Promise<T> {\n // 実装。\n}\n\n// 型エイリアスの使用。\ntype UserRole = 'admin' | 'editor' | 'viewer';。\n\ninterface User {。\n id: string;\n name: string;\n role: UserRole;\n}\n\n// 避けるべき例。\nfunction processData(data: any): any { // any型の使用\n // 実装。\n}\n```\n\n### 高度な型機能\n\n- インデックスシグネチャは慎重に使用する。\n- `readonly`を積極的に活用する。\n- 条件付き型を使用して柔軟な型を定義する。\n- マップ型を使用して既存の型から新しい型を生成する。\n- テンプレートリテラル型を活用する。\n\n```typescript\n// インデックスシグネチャ。\ninterface Dictionary<T> {。\n [key: string]: T;\n}\n\n// readonly。\ninterface User {。\n readonly id: string;\n name: string;\n email: string;\n}\n\n// 条件付き型。\ntype NonNullable<T> = T extends null | undefined ? never : T;\n\n// マップ型。\ntype Readonly<T> = {。\n readonly [P in keyof T]: T[P];\n};\n\n// テンプレートリテラル型。\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';。\ntype Endpoint = `/api/${string}`;。\ntype ApiRoute = `${HttpMethod} ${Endpoint}`;。\n```\n\n## 関数とメソッド\n\n### 関数設計","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":147,"to":205}}}}],["211",{"pageContent":"// テンプレートリテラル型。\ntype HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE';。\ntype Endpoint = `/api/${string}`;。\ntype ApiRoute = `${HttpMethod} ${Endpoint}`;。\n```\n\n## 関数とメソッド\n\n### 関数設計\n\n- 関数は単一責任の原則に従う。\n- 副作用は可能な限り避ける。\n- 引数は3つ以下に抑える。\n- 複数の引数がある場合はオブジェクトパラメータを使用する。\n- デフォルト値を適切に使用する。\n\n```typescript\n// 良い例。\ninterface UserOptions {。\n includeDetails?: boolean;\n fetchRoles?: boolean;\n timeout?: number;\n}\n\nasync function getUser(。\n id: string,\n options: UserOptions = {}\n): Promise<User> {\n const { includeDetails = false, fetchRoles = false, timeout = 5000 } = options;。\n // 実装。\n}\n\n// 避けるべき例。\nasync function getUser(。\n id: string,\n includeDetails: boolean,\n fetchRoles: boolean,\n timeout: number\n): Promise<User> {\n // 実装。\n}\n```\n\n### 非同期処理\n\n- 可能な限り`async/await`を使用する。\n- Promiseチェインは適切に例外処理する。\n- 複数の非同期処理は`Promise.all`や`Promise.race`を活用する。\n- 非同期関数は戻り値の型を明確にする。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":197,"to":245}}}}],["212",{"pageContent":"### 非同期処理\n\n- 可能な限り`async/await`を使用する。\n- Promiseチェインは適切に例外処理する。\n- 複数の非同期処理は`Promise.all`や`Promise.race`を活用する。\n- 非同期関数は戻り値の型を明確にする。\n\n```typescript\n// 良い例。\nasync function fetchUserData(userId: string): Promise<UserData> {\n try {。\n const user = await userRepository.findById(userId);。\n if (!user) {。\n throw new NotFoundError(`User with ID ${userId} not found`);。\n }\n \n const [profile, permissions] = await Promise.all([。\n profileService.getProfile(userId),。\n permissionService.getPermissions(userId)。\n ]);\n \n return {。\n user,。\n profile,。\n permissions。\n };\n } catch (error) {。\n logger.error('Failed to fetch user data', { userId, error });。\n throw new ApplicationError('Failed to fetch user data', { cause: error });\n }\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":240,"to":270}}}}],["213",{"pageContent":"// 避けるべき例。\nfunction fetchUserData(userId: string) { // 戻り値の型が不明確\n return userRepository.findById(userId)。\n .then(user => {。\n if (!user) {。\n throw new Error(`User not found: ${userId}`);\n }\n return user;。\n })\n .then(user => {。\n // ネストされたPromiseチェーン。\n return profileService.getProfile(userId)。\n .then(profile => {。\n return { user, profile };。\n });\n });\n}\n```\n\n## エラー処理\n\n### エラー設計\n\n- カスタムエラークラスを定義して、型安全なエラー処理する。\n- エラーは適切に分類する。\n- エラーメッセージは具体的で理解しやすいものにする。\n- エラーには追加情報を含める。\n\n```typescript\n// 基本エラークラス。\nabstract class ApplicationError extends Error {。\n constructor(message: string, public readonly metadata?: Record<string, unknown>) {\n super(message);。\n this.name = this.constructor.name;。\n // Stack traceを保持するためのハック(TypeScriptの制限)\n Error.captureStackTrace(this, this.constructor);。\n }\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":272,"to":309}}}}],["214",{"pageContent":"// 具体的なエラークラス。\nclass NotFoundError extends ApplicationError {。\n constructor(message: string, metadata?: Record<string, unknown>) {\n super(message, metadata);。\n }\n}\n\nclass ValidationError extends ApplicationError {。\n constructor(。\n message: string,\n public readonly validationErrors: Record<string, string[]>,\n metadata?: Record<string, unknown>\n ) {\n super(message, metadata);。\n }\n}\n```\n\n### エラーハンドリング\n\n- try-catchブロックは適切な範囲で使用する。\n- エラーは適切に変換して伝播する。\n- グローバルエラーハンドラを実装する。\n- 非同期エラーを適切に処理する。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":311,"to":334}}}}],["215",{"pageContent":"### エラーハンドリング\n\n- try-catchブロックは適切な範囲で使用する。\n- エラーは適切に変換して伝播する。\n- グローバルエラーハンドラを実装する。\n- 非同期エラーを適切に処理する。\n\n```typescript\n// 良い例。\nasync function processUserData(userId: string): Promise<ProcessedData> {\n try {。\n const userData = await fetchUserData(userId);。\n return transformData(userData);。\n } catch (error) {。\n if (error instanceof NotFoundError) {。\n // 特定のエラータイプに対する処理。\n logger.warn(`User data not found: ${userId}`);\n return getDefaultData();。\n }\n \n if (error instanceof ValidationError) {。\n // バリデーションエラーの処理。\n logger.error('Validation failed', { errors: error.validationErrors });\n throw error; // 再スロー。\n }\n \n // 未知のエラーを変換。\n logger.error('Unexpected error during data processing', { error });。\n throw new ApplicationError('Failed to process user data', { cause: error });\n }\n}\n```\n\n## クラスと継承\n\n### クラス設計\n\n- クラスは単一責任の原則に従う。\n- プロパティは適切にカプセル化する。\n- 継承よりもコンポジションを優先する。\n- インタフェースを使用して契約を定義する。\n- 抽象クラスは共通の実装を提供する場合に使用する。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":329,"to":370}}}}],["216",{"pageContent":"## クラスと継承\n\n### クラス設計\n\n- クラスは単一責任の原則に従う。\n- プロパティは適切にカプセル化する。\n- 継承よりもコンポジションを優先する。\n- インタフェースを使用して契約を定義する。\n- 抽象クラスは共通の実装を提供する場合に使用する。\n\n```typescript\n// インターフェース定義。\ninterface UserRepository {。\n findById(id: string): Promise<User | null>;\n save(user: User): Promise<User>;\n delete(id: string): Promise<boolean>;\n}\n\n// 実装クラス。\nclass PostgresUserRepository implements UserRepository {。\n constructor(private readonly db: Database) {}\n\n async findById(id: string): Promise<User | null> {\n // 実装。\n }\n\n async save(user: User): Promise<User> {\n // 実装。\n }\n\n async delete(id: string): Promise<boolean> {\n // 実装。\n }\n}\n\n// コンポジションの例。\nclass UserService {。\n constructor(private readonly userRepository: UserRepository) {}\n\n async getUser(id: string): Promise<User> {\n const user = await this.userRepository.findById(id);。\n if (!user) {。\n throw new NotFoundError(`User with ID ${id} not found`);。\n }\n return user;。\n }\n}\n```\n\n### アクセス修飾子","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":362,"to":411}}}}],["217",{"pageContent":"### アクセス修飾子\n\n- `private`、`protected`、`public`を適切に使用する。\n- デフォルトは`public`だが、明示的に指定することを推奨。\n- `readonly`を使用して不変性を確保する。\n- コンストラクタパラメータにアクセス修飾子を使用してプロパティを定義する。\n\n```typescript\nclass UserService {。\n // コンストラクタパラメータでのプロパティ定義。\n constructor(。\n private readonly userRepository: UserRepository,\n private readonly logger: Logger\n ) {}。\n\n // publicメソッド。\n public async getUser(id: string): Promise<User> {\n this.logger.info(`Fetching user: ${id}`);\n return this.findUserById(id);。\n }\n\n // privateメソッド。\n private async findUserById(id: string): Promise<User> {\n const user = await this.userRepository.findById(id);。\n if (!user) {。\n throw new NotFoundError(`User with ID ${id} not found`);。\n }\n return user;。\n }\n}\n```\n\n## モジュールとインポート\n\n### モジュール設計\n\n- 関連する機能を論理的なモジュールにグループ化する。\n- 循環依存を避ける。\n- 適切な粒度でモジュールを分割する。\n- 公開APIを明示的に定義する。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":411,"to":450}}}}],["218",{"pageContent":"## モジュールとインポート\n\n### モジュール設計\n\n- 関連する機能を論理的なモジュールにグループ化する。\n- 循環依存を避ける。\n- 適切な粒度でモジュールを分割する。\n- 公開APIを明示的に定義する。\n\n```typescript\n// users/index.ts。\nexport { User } from './models/user';。\nexport { UserService } from './services/user-service';。\nexport { UserController } from './controllers/user-controller';。\n// UserRepositoryはエクスポートされていないため、内部実装として扱われる。\n```\n\n### インポート\n\n- 名前付きインポートを優先する。\n- デフォルトエクスポートは避ける。\n- インポートはアルファベット順に並べる。\n- 絶対パスと相対パスを適切に使い分ける。\n\n```typescript\n// 良い例。\nimport { Component, OnInit } from '@angular/core';。\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';。\n\nimport { User } from '@app/models';。\nimport { UserService } from '@app/services';。\n\nimport { ValidationUtils } from '../utils/validation-utils';。\n\n// 避けるべき例。\nimport UserService from './user-service'; // デフォルトインポート。\nimport * as Forms from '@angular/forms'; // 名前空間インポート。\n```\n\n## コメントとドキュメント\n\n### JSDoc\n\n- パブリックAPIには適切なJSDocを付ける。\n- パラメータと戻り値の型は明示的に記述する。\n- 例外がスローされる条件を記載する。\n- 例を含める。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":443,"to":489}}}}],["219",{"pageContent":"## コメントとドキュメント\n\n### JSDoc\n\n- パブリックAPIには適切なJSDocを付ける。\n- パラメータと戻り値の型は明示的に記述する。\n- 例外がスローされる条件を記載する。\n- 例を含める。\n\n```typescript\n/**\n * ユーザー情報を取得します。\n * \n * @param id - ユーザーID。\n * @param options - 取得オプション。\n * @returns ユーザー情報。\n * @throws {NotFoundError} ユーザーが見つからない場合。\n * @throws {AuthorizationError} アクセス権限がない場合。\n * \n * @example。\n * ```typescript\n * const user = await userService.getUser('123', { includeDetails: true });。\n * console.log(user.name);。\n * ```\n */\nasync function getUser(。\n id: string,\n options: UserOptions = {}\n): Promise<User> {\n // 実装。\n}\n```\n\n### インラインコメント\n\n- コードの「なぜ」を説明するコメントを書く。\n- 複雑なアルゴリズムには説明を追加する。\n- TODOコメントには理由と参照を含める。\n- 自明なコードにはコメントを付けない。\n\n```typescript\n// 良いコメント例。\n// RFC 5322に準拠したメールアドレスの検証。\n// 参考: https://tools.ietf.org/html/rfc5322\nfunction isValidEmail(email: string): boolean {\n const regex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\\.[a-zA-Z0-9-]+)*$/;\n return regex.test(email);。\n}\n\n// TODO: パフォーマンス最適化が必要 (#123)\nfunction slowFunction() {。\n // 実装。\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":482,"to":534}}}}],["220",{"pageContent":"// TODO: パフォーマンス最適化が必要 (#123)\nfunction slowFunction() {。\n // 実装。\n}\n\n// 避けるべきコメント例。\n// ユーザー名を取得する。\nfunction getUserName() { // 自明なコード。\n // ...\n}\n```\n\n## テスト\n\n### テスト構造\n\n- テストは明確な構造に従う(Arrange-Act-Assert)\n- テストケースは独立していて再現可能にする。\n- テスト名は何をテストしているかを明確に示す。\n- テストヘルパーを活用して重複を減らす。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":531,"to":550}}}}],["221",{"pageContent":"```typescript\n// Jestを使用したテスト例。\ndescribe('UserService', () => {。\n let userService: UserService;\n let mockRepository: jest.Mocked<UserRepository>;\n \n beforeEach(() => {。\n // Arrange - テストの準備。\n mockRepository = {。\n findById: jest.fn(),\n save: jest.fn(),\n delete: jest.fn()\n };\n userService = new UserService(mockRepository);。\n });\n \n describe('getUser', () => {。\n it('should return user when valid ID is provided', async () => {。\n // Arrange。\n const mockUser = { id: '123', name: 'Test User' };\n mockRepository.findById.mockResolvedValue(mockUser);。\n \n // Act。\n const result = await userService.getUser('123');。\n \n // Assert。\n expect(result).toEqual(mockUser);。\n expect(mockRepository.findById).toHaveBeenCalledWith('123');。\n });\n \n it('should throw NotFoundError when user does not exist', async () => {。\n // Arrange。\n mockRepository.findById.mockResolvedValue(null);。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":552,"to":584}}}}],["222",{"pageContent":"});\n \n it('should throw NotFoundError when user does not exist', async () => {。\n // Arrange。\n mockRepository.findById.mockResolvedValue(null);。\n \n // Act & Assert。\n await expect(userService.getUser('456')).rejects.toThrow(NotFoundError);。\n expect(mockRepository.findById).toHaveBeenCalledWith('456');。\n });\n });\n});\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":580,"to":592}}}}],["223",{"pageContent":"### モックとスタブ\n\n- モックは必要最小限に抑える。\n- テスト用の実装を提供できる場合はスタブを使用する。\n- モックの期待値設定は明示的に行う。\n- モックフレームワーク(Jest, Sinon)を適切に使用する。\n\n```typescript\n// モックの例。\nconst mockUserRepository = {。\n findById: jest.fn(),\n save: jest.fn(),\n delete: jest.fn()\n};\n\n// スタブの例。\nclass InMemoryUserRepository implements UserRepository {。\n private users: Map<string, User> = new Map();\n \n async findById(id: string): Promise<User | null> {\n return this.users.get(id) || null;。\n }\n \n async save(user: User): Promise<User> {\n this.users.set(user.id, { ...user });。\n return user;。\n }\n \n async delete(id: string): Promise<boolean> {\n return this.users.delete(id);。\n }\n}\n```\n\n## パフォーマンス\n\n### 最適化\n\n- 不必要なオブジェクト生成を避ける。\n- メモ化を活用して計算を最適化する。\n- 大きな配列操作は効率的に行う。\n- 非同期処理は適切に並列化する。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":594,"to":635}}}}],["224",{"pageContent":"## パフォーマンス\n\n### 最適化\n\n- 不必要なオブジェクト生成を避ける。\n- メモ化を活用して計算を最適化する。\n- 大きな配列操作は効率的に行う。\n- 非同期処理は適切に並列化する。\n\n```typescript\n// メモ化の例。\nfunction memoize<T, R>(fn: (arg: T) => R): (arg: T) => R {\n const cache = new Map<T, R>();。\n \n return (arg: T): R => {\n if (cache.has(arg)) {。\n return cache.get(arg)!;。\n }\n \n const result = fn(arg);。\n cache.set(arg, result);。\n return result;。\n };\n}\n\nconst calculateExpensiveValue = memoize((input: number) => {\n // 計算コストの高い処理。\n return input * input;。\n});\n\n// 非同期処理の並列化。\nasync function fetchAllUserData(userIds: string[]): Promise<UserData[]> {\n return Promise.all(userIds.map(id => fetchUserData(id)));。\n}\n```\n\n### バンドルサイズ\n\n- ツリーシェイキングを考慮したインポートを使用する。\n- 大きなライブラリは必要な部分だけインポートする。\n- コード分割を活用する。\n- 遅延ロードを実装する。\n\n```typescript\n// 良い例。\nimport { map, filter } from 'lodash-es';。\n\n// 避けるべき例。\nimport _ from 'lodash'; // 全体をインポート。\n```\n\n## 関連情報","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":628,"to":679}}}}],["225",{"pageContent":"```typescript\n// 良い例。\nimport { map, filter } from 'lodash-es';。\n\n// 避けるべき例。\nimport _ from 'lodash'; // 全体をインポート。\n```\n\n## 関連情報\n\n- [TypeScript公式ドキュメント](https://www.typescriptlang.org/docs/)\n- [TSDocの掟](tsdoc-01jpcvxfxjwwn785s5jg7t1773.md)\n- [TypeScriptツール活用](tstools-01jpcvxfxha41b95hkx2y2y2pz.md)\n- [TypeScriptコードレビュー](tsreview-01jpcvxfxjwwn785s5jg7t1771.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md","loc":{"lines":{"from":671,"to":684}}}}],["226",{"pageContent":"---\ndescription: 掟プロジェクトにおけるTypeScript開発で使用する必須およびオプショナルツールの説明と設定方法\nruleId: tstools-01jpcvxfxha41b95hkx2y2y2pz\ntags:\n - development\n - typescript\n - tools\naliases:\n - typescript-tools\nglobs:\n - '**/*.ts'\n - '**/*.tsx'\n - '**/*.js'\n - '**/*.jsx'\n---\n\n# TypeScriptツール活用\n\n## 開発環境\n\n### TypeScriptコンパイラ\n\nTypeScriptの基本ツールであるコンパイラ(tsc)は、TypeScriptコードをJavaScriptに変換します。\n\n```bash\n# グローバルインストール\nnpm install -g typescript。\n\n# プロジェクトへのインストール\nnpm install --save-dev typescript。\n\n# バージョン確認\ntsc --version。\n\n# コンパイル\ntsc file.ts。\n\n# プロジェクト全体のコンパイル\ntsc。\n\n# 監視モード\ntsc --watch。\n```\n\n#### tsconfig.json\n\nTypeScriptプロジェクトの設定ファイルです。コンパイラオプションやプロジェクト構造を定義します。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md","loc":{"lines":{"from":1,"to":47}}}}],["227",{"pageContent":"# バージョン確認\ntsc --version。\n\n# コンパイル\ntsc file.ts。\n\n# プロジェクト全体のコンパイル\ntsc。\n\n# 監視モード\ntsc --watch。\n```\n\n#### tsconfig.json\n\nTypeScriptプロジェクトの設定ファイルです。コンパイラオプションやプロジェクト構造を定義します。\n\n```json\n{\n \"compilerOptions\": {\n \"target\": \"es2020\",\n \"module\": \"esnext\",\n \"moduleResolution\": \"node\",\n \"strict\": true,\n \"esModuleInterop\": true,\n \"skipLibCheck\": true,\n \"forceConsistentCasingInFileNames\": true,\n \"outDir\": \"./dist\",\n \"declaration\": true,\n \"sourceMap\": true\n },\n \"include\": [\"src/**/*.ts\"],\n \"exclude\": [\"node_modules\", \"**/*.spec.ts\"]\n}\n```\n\n主要なコンパイラオプション:。\n\n- `target`: 出力するJavaScriptのバージョン。\n- `module`: モジュールシステム(CommonJS, ESModules等)\n- `strict`: 厳格な型チェックを有効にする。\n- `outDir`: コンパイル結果の出力先。\n- `sourceMap`: ソースマップの生成。\n- `declaration`: 型定義ファイル(.d.ts)の生成。\n\n### IDEとエディタ\n\n#### Visual Studio Code\n\nTypeScript開発に最適なエディタです。Microsoft(TypeScriptの開発元)によって開発されており、優れたTypeScriptサポートを提供します。\n\n主な機能:。\n\n- 型チェック。\n- コード補完。\n- リファクタリング。\n- デバッグ。\n- 定義へのジャンプ。\n\n推奨拡張機能:。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md","loc":{"lines":{"from":32,"to":91}}}}],["228",{"pageContent":"### IDEとエディタ\n\n#### Visual Studio Code\n\nTypeScript開発に最適なエディタです。Microsoft(TypeScriptの開発元)によって開発されており、優れたTypeScriptサポートを提供します。\n\n主な機能:。\n\n- 型チェック。\n- コード補完。\n- リファクタリング。\n- デバッグ。\n- 定義へのジャンプ。\n\n推奨拡張機能:。\n\n- ESLint。\n- Prettier。\n- Error Lens。\n- Import Cost。\n- Path Intellisense。\n\n#### WebStorm\n\nJetBrainsのTypeScript対応IDEです。高度な機能を提供します。\n\n主な機能:。\n\n- 高度なコード補完。\n- リファクタリングツール。\n- デバッガ。\n- テスト実行とカバレッジ。\n- バージョン管理との統合。\n\n## コード品質ツール\n\n### ESLint\n\nJavaScriptとTypeScriptのための静的解析ツールです。コードの問題を検出し、コーディング規約を強制します。\n\n```bash\n# インストール\nnpm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin。\n\n# 設定ファイルの生成\nnpx eslint --init。\n\n# 実行\nnpx eslint src/。\n```\n\n#### .eslintrc.js の例","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md","loc":{"lines":{"from":77,"to":128}}}}],["229",{"pageContent":"```bash\n# インストール\nnpm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin。\n\n# 設定ファイルの生成\nnpx eslint --init。\n\n# 実行\nnpx eslint src/。\n```\n\n#### .eslintrc.js の例\n\n```javascript\nmodule.exports = {。\n parser: '@typescript-eslint/parser',\n parserOptions: {\n project: 'tsconfig.json',\n sourceType: 'module',\n },\n plugins: ['@typescript-eslint/eslint-plugin'],\n extends: [\n 'plugin:@typescript-eslint/recommended',\n 'plugin:prettier/recommended',\n ],\n root: true,\n env: {\n node: true,\n jest: true,\n },\n ignorePatterns: ['.eslintrc.js'],\n rules: {\n '@typescript-eslint/interface-name-prefix': 'off',\n '@typescript-eslint/explicit-function-return-type': 'warn',\n '@typescript-eslint/explicit-module-boundary-types': 'warn',\n '@typescript-eslint/no-explicit-any': 'warn',\n '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],\n },\n};\n```\n\n### Prettier\n\nコードフォーマッターです。一貫したコードスタイルを維持します。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md","loc":{"lines":{"from":117,"to":160}}}}],["230",{"pageContent":"### Prettier\n\nコードフォーマッターです。一貫したコードスタイルを維持します。\n\n```bash\n# インストール\nnpm install --save-dev prettier。\n\n# 単一ファイルのフォーマット\nnpx prettier --write src/file.ts。\n\n# プロジェクト全体のフォーマット\nnpx prettier --write \"src/**/*.ts\"。\n\n# フォーマットチェック\nnpx prettier --check \"src/**/*.ts\"。\n```\n\n#### .prettierrc の例\n\n```json\n{\n \"singleQuote\": true,\n \"trailingComma\": \"all\",\n \"printWidth\": 100,\n \"tabWidth\": 2,\n \"semi\": true,\n \"bracketSpacing\": true,\n \"arrowParens\": \"avoid\"\n}\n```\n\n### ESLintとPrettierの統合\n\nESLintとPrettierを連携させることで、コードスタイルとコード品質の両方を一貫して管理できます。\n\n```bash\n# 必要なパッケージのインストール\nnpm install --save-dev eslint-config-prettier eslint-plugin-prettier。\n```\n\n### TypeScript ESLint\n\nTypeScript専用のESLintルールを提供します。\n\n```bash\n# インストール\nnpm install --save-dev @typescript-eslint/eslint-plugin @typescript-eslint/parser。\n```\n\n### husky と lint-staged\n\nコミット前に自動的にリントとフォーマットするします。\n\n```bash\n# インストール\nnpm install --save-dev husky lint-staged。\n\n# 設定\nnpx husky install。\nnpx husky add .husky/pre-commit \"npx lint-staged\"。\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md","loc":{"lines":{"from":158,"to":219}}}}],["231",{"pageContent":"### husky と lint-staged\n\nコミット前に自動的にリントとフォーマットするします。\n\n```bash\n# インストール\nnpm install --save-dev husky lint-staged。\n\n# 設定\nnpx husky install。\nnpx husky add .husky/pre-commit \"npx lint-staged\"。\n```\n\n#### package.json の設定例\n\n```json\n{\n \"lint-staged\": {\n \"*.{ts,tsx}\": [\n \"eslint --fix\",。\n \"prettier --write\"。\n ]\n }\n}\n```\n\n## テストツール\n\n### Jest\n\nJavaScriptとTypeScriptのためのテストフレームワークです。\n\n```bash\n# インストール\nnpm install --save-dev jest ts-jest @types/jest。\n\n# 設定ファイルの生成\nnpx ts-jest config:init。\n\n# テスト実行\nnpx jest。\n\n# 監視モード\nnpx jest --watch。\n\n# カバレッジレポート\nnpx jest --coverage。\n```\n\n#### jest.config.js の例","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md","loc":{"lines":{"from":208,"to":257}}}}],["232",{"pageContent":"# 設定ファイルの生成\nnpx ts-jest config:init。\n\n# テスト実行\nnpx jest。\n\n# 監視モード\nnpx jest --watch。\n\n# カバレッジレポート\nnpx jest --coverage。\n```\n\n#### jest.config.js の例\n\n```javascript\nmodule.exports = {。\n preset: 'ts-jest',\n testEnvironment: 'node',\n roots: ['<rootDir>/src'],\n testMatch: ['**/*.spec.ts', '**/*.test.ts'],\n collectCoverageFrom: [\n 'src/**/*.ts',。\n '!src/**/*.d.ts',。\n '!src/**/*.interface.ts',。\n '!src/**/*.module.ts'。\n ],\n coverageThreshold: {\n global: {\n branches: 80,\n functions: 80,\n lines: 80,\n statements: 80\n }\n }\n};\n```\n\n### Testing Library\n\nユーザー視点でのテストを促進するライブラリです。主にUIコンポーネントのテストに使用されます。\n\n```bash\n# Reactの場合\nnpm install --save-dev @testing-library/react @testing-library/jest-dom。\n\n# Angularの場合\nnpm install --save-dev @testing-library/angular。\n\n# Vue.jsの場合\nnpm install --save-dev @testing-library/vue。\n```\n\n### Cypress\n\nエンドツーエンドテストのためのフレームワークです。\n\n```bash\n# インストール\nnpm install --save-dev cypress。\n\n# 起動\nnpx cypress open。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md","loc":{"lines":{"from":244,"to":306}}}}],["233",{"pageContent":"# Vue.jsの場合\nnpm install --save-dev @testing-library/vue。\n```\n\n### Cypress\n\nエンドツーエンドテストのためのフレームワークです。\n\n```bash\n# インストール\nnpm install --save-dev cypress。\n\n# 起動\nnpx cypress open。\n\n# ヘッドレス実行\nnpx cypress run。\n```\n\n#### TypeScriptサポートの設定\n\n```json\n// cypress/tsconfig.json。\n{\n \"compilerOptions\": {\n \"target\": \"es5\",\n \"lib\": [\"es5\", \"dom\"],\n \"types\": [\"cypress\", \"node\"]\n },\n \"include\": [\"**/*.ts\"]\n}\n```\n\n## ビルドツール\n\n### webpack\n\nモジュールバンドラーです。複数のファイルを1つにまとめます。\n\n```bash\n# インストール\nnpm install --save-dev webpack webpack-cli webpack-dev-server typescript ts-loader。\n\n# 開発サーバー起動\nnpx webpack serve。\n\n# ビルド\nnpx webpack。\n```\n\n#### webpack.config.js の例\n\n```javascript\nconst path = require('path');。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md","loc":{"lines":{"from":293,"to":346}}}}],["234",{"pageContent":"# 開発サーバー起動\nnpx webpack serve。\n\n# ビルド\nnpx webpack。\n```\n\n#### webpack.config.js の例\n\n```javascript\nconst path = require('path');。\n\nmodule.exports = {。\n entry: './src/index.ts',\n module: {\n rules: [\n {\n test: /\\.tsx?$/,\n use: 'ts-loader',\n exclude: /node_modules/,\n },\n ],\n },\n resolve: {\n extensions: ['.tsx', '.ts', '.js'],\n },\n output: {\n filename: 'bundle.js',\n path: path.resolve(__dirname, 'dist'),\n },\n devServer: {\n static: {\n directory: path.join(__dirname, 'public'),\n },\n compress: true,\n port: 9000,\n },\n};\n```\n\n### Vite\n\n高速なフロントエンド開発ツールです。\n\n```bash\n# プロジェクト作成\nnpm create vite@latest my-app -- --template typescript。\n\n# 開発サーバー起動\nnpm run dev。\n\n# ビルド\nnpm run build。\n```\n\n#### vite.config.ts の例\n\n```typescript\nimport { defineConfig } from 'vite';。\nimport react from '@vitejs/plugin-react';。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md","loc":{"lines":{"from":336,"to":395}}}}],["235",{"pageContent":"# 開発サーバー起動\nnpm run dev。\n\n# ビルド\nnpm run build。\n```\n\n#### vite.config.ts の例\n\n```typescript\nimport { defineConfig } from 'vite';。\nimport react from '@vitejs/plugin-react';。\n\nexport default defineConfig({。\n plugins: [react()],\n resolve: {\n alias: {\n '@': '/src',\n },\n },\n build: {\n outDir: 'dist',\n minify: 'terser',\n sourcemap: true,\n },\n});\n```\n\n### esbuild\n\n非常に高速なJavaScript/TypeScriptバンドラーです。\n\n```bash\n# インストール\nnpm install --save-dev esbuild。\n\n# ビルド\nnpx esbuild src/index.ts --bundle --outfile=dist/bundle.js。\n```\n\n## ドキュメント生成ツール\n\n### TypeDoc\n\nTypeScriptコードからドキュメントを生成するツールです。\n\n```bash\n# インストール\nnpm install --save-dev typedoc。\n\n# ドキュメント生成\nnpx typedoc src/index.ts。\n\n# 設定ファイルを使用\nnpx typedoc --options typedoc.json。\n```\n\n#### typedoc.json の例\n\n```json\n{\n \"entryPoints\": [\"src/index.ts\"],\n \"out\": \"docs\",\n \"name\": \"My Project Documentation\",\n \"excludePrivate\": true,\n \"excludeProtected\": true,\n \"theme\": \"default\",\n \"readme\": \"README.md\"\n}\n```\n\n### Compodoc","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md","loc":{"lines":{"from":384,"to":455}}}}],["236",{"pageContent":"### Compodoc\n\nAngular向けのドキュメント生成ツールです。\n\n```bash\n# インストール\nnpm install --save-dev @compodoc/compodoc。\n\n# ドキュメント生成\nnpx compodoc -p tsconfig.json。\n\n# サーバー起動\nnpx compodoc -s。\n```\n\n## パフォーマンス最適化ツール\n\n### Lighthouse\n\nWebアプリケーションのパフォーマンス、アクセシビリティ、SEOなどを分析するツールです。\n\n```bash\n# インストール\nnpm install --save-dev lighthouse。\n\n# 実行\nnpx lighthouse https://example.com --view。\n```\n\n### webpack-bundle-analyzer\n\nwebpackバンドルの内容を視覚化し、最適化の機会を特定するツールです。\n\n```bash\n# インストール\nnpm install --save-dev webpack-bundle-analyzer。\n\n# webpack.config.jsに追加\nconst BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;。\n\nmodule.exports = {。\n plugins: [\n new BundleAnalyzerPlugin()。\n ]\n};\n```\n\n## CI/CD統合\n\n### GitHub Actions\n\nGitHub Actionsを使用したTypeScriptプロジェクトのCI/CD設定例:。\n\n```yaml\n# .github/workflows/main.yml\nname: CI。\n\non:\n push:\n branches: [ main ]\n pull_request:\n branches: [ main ]","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md","loc":{"lines":{"from":455,"to":516}}}}],["237",{"pageContent":"### GitHub Actions\n\nGitHub Actionsを使用したTypeScriptプロジェクトのCI/CD設定例:。\n\n```yaml\n# .github/workflows/main.yml\nname: CI。\n\non:\n push:\n branches: [ main ]\n pull_request:\n branches: [ main ]\n\njobs:\n build:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v3。\n - name: Use Node.js。\n uses: actions/setup-node@v3\n with:\n node-version: '16.x'\n cache: 'npm'\n - run: npm ci。\n - run: npm run lint。\n - run: npm run test。\n - run: npm run build。\n```\n\n### GitLab CI\n\nGitLab CIを使用したTypeScriptプロジェクトのCI/CD設定例:。\n\n```yaml\n# .gitlab-ci.yml\nimage: node:16。\n\nstages:\n - test。\n - build。\n\ncache:\n paths:\n - node_modules/。\n\nlint:\n stage: test\n script:\n - npm ci。\n - npm run lint。\n\ntest:\n stage: test\n script:\n - npm ci。\n - npm run test。\n\nbuild:\n stage: build\n script:\n - npm ci。\n - npm run build。\n artifacts:\n paths:\n - dist/。\n```\n\n## 型定義ツール\n\n### TypeScript Definition Manager (TSD)\n\nTypeScriptの型定義ファイルを管理するツールです。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md","loc":{"lines":{"from":504,"to":576}}}}],["238",{"pageContent":"build:\n stage: build\n script:\n - npm ci。\n - npm run build。\n artifacts:\n paths:\n - dist/。\n```\n\n## 型定義ツール\n\n### TypeScript Definition Manager (TSD)\n\nTypeScriptの型定義ファイルを管理するツールです。\n\n```bash\n# インストール\nnpm install -g tsd。\n\n# 型定義の検索\ntsd query lodash。\n\n# 型定義のインストール\ntsd install lodash。\n```\n\n### DefinitelyTyped\n\nコミュニティによって維持されているTypeScriptの型定義リポジトリです。\n\n```bash\n# 型定義のインストール\nnpm install --save-dev @types/lodash。\n```\n\n## 開発ワークフロー\n\n### 推奨ワークフロー\n\n1. **プロジェクト設定**:\n - TypeScriptのインストールと`tsconfig.json`の設定。\n - ESLintとPrettierのセットアップ。\n - Jestのセットアップ。\n - huskyとlint-stagedの設定。\n\n2. **開発サイクル**:\n - コードの作成と編集。\n - `tsc --watch`または`npm run dev`で継続的なコンパイル。\n - `npm run test -- --watch`で継続的なテスト。\n - コミット前に`npm run lint`と`npm run format`する。\n\n3. **コードレビュー**:\n - ESLintとPrettierのチェック。\n - テストカバレッジの確認。\n - TypeScriptの型チェックエラーの確認。\n\n4. **ビルドとデプロイ**:\n - `npm run build`でプロダクションビルド。\n - バンドルサイズの分析。\n - CI/CDパイプラインでの自動テストとデプロイ。\n\n### package.json スクリプト例","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md","loc":{"lines":{"from":562,"to":624}}}}],["239",{"pageContent":"4. **ビルドとデプロイ**:\n - `npm run build`でプロダクションビルド。\n - バンドルサイズの分析。\n - CI/CDパイプラインでの自動テストとデプロイ。\n\n### package.json スクリプト例\n\n```json\n{\n \"scripts\": {\n \"start\": \"ts-node src/index.ts\",\n \"dev\": \"vite\",\n \"build\": \"tsc && vite build\",\n \"test\": \"jest\",\n \"test:watch\": \"jest --watch\",\n \"test:coverage\": \"jest --coverage\",\n \"lint\": \"eslint 'src/**/*.{ts,tsx}'\",\n \"lint:fix\": \"eslint 'src/**/*.{ts,tsx}' --fix\",\n \"format\": \"prettier --write 'src/**/*.{ts,tsx}'\",\n \"format:check\": \"prettier --check 'src/**/*.{ts,tsx}'\",\n \"typecheck\": \"tsc --noEmit\",\n \"docs\": \"typedoc\",\n \"prepare\": \"husky install\"\n }\n}\n```\n\n## フレームワーク固有のツール\n\n### React\n\n- Create React App: Reactアプリケーションの作成。\n- React Developer Tools: ブラウザ拡張機能。\n- React Testing Library: コンポーネントテスト。\n\n```bash\n# TypeScriptを使用したReactアプリの作成\nnpx create-react-app my-app --template typescript。\n```\n\n### Angular\n\n- Angular CLI: Angularアプリケーションの作成と管理。\n- Angular Language Service: エディタサポート。\n- Angular DevTools: ブラウザ拡張機能。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md","loc":{"lines":{"from":619,"to":663}}}}],["240",{"pageContent":"### Angular\n\n- Angular CLI: Angularアプリケーションの作成と管理。\n- Angular Language Service: エディタサポート。\n- Angular DevTools: ブラウザ拡張機能。\n\n```bash\n# Angularアプリの作成\nng new my-app --strict。\n```\n\n### Vue.js\n\n- Vue CLI: Vueアプリケーションの作成と管理。\n- Vue DevTools: ブラウザ拡張機能。\n- Vue Test Utils: コンポーネントテスト。\n\n```bash\n# TypeScriptを使用したVueアプリの作成\nvue create my-app。\n# TypeScriptを選択\n```\n\n## 関連情報\n\n- [TypeScript公式ドキュメント](https://www.typescriptlang.org/docs/)\n- [TSDocの掟](tsdoc-01jpcvxfxjwwn785s5jg7t1773.md)\n- [TypeScriptコーディングスタイル](tsstyle-01jpcvxfxjwwn785s5jg7t1770.md)\n- [TypeScriptコードレビュー](tsreview-01jpcvxfxjwwn785s5jg7t1771.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md","loc":{"lines":{"from":659,"to":687}}}}],["241",{"pageContent":"---\ndescription: typescript developmentに関するドキュメント\nruleId: typescript-01jpcvxfxha41b95hkx2y2y2py\ntags: [\"development\",\"coding\",\"typescript\"]\naliases: [\"typescript-guidelines\", \"ts-best-practices\"]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"]\n---\n\n# TypeScript開発ガイドライン\n\n## 型定義とベストプラクティス\n\n### 型定義と実装の分離\n\nTypeScriptでは、型定義と実装を分離することでコードの明確さと再利用性を高めることができます。\n\n- **型定義(type, interface)**: `.d.ts` ファイルに配置。\n\n```typescript\n// src/domain/types.d.ts など。\nexport interface User {。\n id: string;\n name: string;\n email: string;\n}\n```\n\n- **実装(class など)**: 通常の `.ts` ファイルに配置。\n\n```typescript\n// src/domain/user.ts など。\nimport type { User } from './types';。\n\nexport class UserImpl implements User {。\n constructor(。\n public readonly id: string,\n public readonly name: string,\n public readonly email: string\n ) {}。\n}\n```\n\n### 型システムの最大活用\n\nTypeScriptの型システムを最大限に活用し、不要なランタイムチェックを排除することで、コードの効率性と保守性を向上させます。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/typescript-01jpcvxfxha41b95hkx2y2y2py.md","loc":{"lines":{"from":1,"to":45}}}}],["242",{"pageContent":"### 型システムの最大活用\n\nTypeScriptの型システムを最大限に活用し、不要なランタイムチェックを排除することで、コードの効率性と保守性を向上させます。\n\n```typescript\n// 悪い例:以下はTypeScriptの型システムがすでに保証しているため不要\nfunction processUserBad(user: User): void {\n if (typeof user.name !== 'string' || typeof user.email !== 'string') {。\n throw new Error('Invalid user data');。\n }\n console.log(`Processing ${user.name} (${user.email})`);。\n}\n\n// 良い例:型の恩恵を活かしたコード。\nfunction processUser(user: User): void {\n // TypeScriptが型チェックするため、追加のチェックは不要。\n console.log(`Processing ${user.name} (${user.email})`);。\n}\n```\n\n**ベストプラクティス**:\n- TypeScriptの型システムが静的に保証していることを、ランタイムでも再度チェックしない。\n- 外部入力(APIレスポンスなど)に対しては、型アサーションする前に適切なバリデーションする。\n- ユニオン型と判別共用体(Discriminated Unions)を活用して型安全な条件分岐を実現する。\n\n#### 不要なランタイムチェックの排除\n\nTypeScriptの型システムを最大限に活用し、不要なランタイムチェックを排除することで、コードの効率性と保守性を向上させます。\n\n- `strictNullChecks: true`設定下では、以下のような冗長なチェックは行わないこと:。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/typescript-01jpcvxfxha41b95hkx2y2y2py.md","loc":{"lines":{"from":43,"to":72}}}}],["243",{"pageContent":"#### 不要なランタイムチェックの排除\n\nTypeScriptの型システムを最大限に活用し、不要なランタイムチェックを排除することで、コードの効率性と保守性を向上させます。\n\n- `strictNullChecks: true`設定下では、以下のような冗長なチェックは行わないこと:。\n\n ```typescript\n // 悪い例:不要なチェック例\n private constructor(private readonly value: string) {\n // 以下はTypeScriptの型システムがすでに保証しているため不要。\n if (value === null || value === undefined) {。\n throw new InvalidArgumentError(\"Value must not be null or undefined\");。\n }\n // ...その他の必要なチェック。\n }\n ```\n\n- TypeScriptの型システムが静的に保証していることを、ランタイムでも再度チェックしない。\n- 代わりに、型システムでは検知できないビジネスルールや不変条件のチェックに集中する。\n- 例外として、外部入力(APIリクエストデータなど)に対しては完全性を保証するために冗長なチェックも許容する。\n\nこのアプローチにより、コードは簡潔になり、本当に必要なバリデーションにのみ焦点を当てることができます。\n\n### オブジェクト生成パターン\n\n#### コンストラクタアクセスの制限\n\nクラスのコンストラクタは必ず`private`にし、直接の`new`演算子によるインスタンス生成を禁止します。これにより、オブジェクトの生成を制御し、生成前の検証やビジネスルールの適用を一箇所で管理できます。\n\n```typescript\n// 悪い例。\nclass UserAccount {。\n constructor(public readonly id: string,\n public readonly name: string) {}\n}\n\n// 直接newでインスタンス化(非推奨)\nconst user = new UserAccount(\"123\", \"テスト\");。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/typescript-01jpcvxfxha41b95hkx2y2y2py.md","loc":{"lines":{"from":68,"to":105}}}}],["244",{"pageContent":"// 直接newでインスタンス化(非推奨)\nconst user = new UserAccount(\"123\", \"テスト\");。\n\ntype UserAccountProps = {。\n id: string;\n name: string;\n};\n\n// 良い例。\nclass UserAccount {。\n private constructor(。\n private readonly _id: string,\n private readonly _name: string\n ) {\n // ここで生成前の検証を一箇所に集中できる。\n if (props.name.length < 2) {。\n throw new IllegalArgumentError(\"名前は2文字以上必要です\");。\n }\n }\n\n // ファクトリーメソッド。\n static of(props: { id: string; name: string }): User {\n return new User(props);。\n }\n\n // publicにしないこと。\n private copy(props: Partial<UserAccountProps>): UserAccount {\n return UserAccount.of(。\n props.id !== undefined ? props.id : this._id,\n props.name !== undefined ? props.name : this._name\n )\n }\n\n rename(name: string): UserAccount {\n return this.copy({ name });。\n }\n\n // ゲッターメソッド。\n get id(): string {\n return this.props.id;。\n }\n\n get name(): string {\n return this.props.name;。\n }\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/typescript-01jpcvxfxha41b95hkx2y2y2py.md","loc":{"lines":{"from":104,"to":149}}}}],["245",{"pageContent":"// ゲッターメソッド。\n get id(): string {\n return this.props.id;。\n }\n\n get name(): string {\n return this.props.name;。\n }\n}\n\n// ファクトリーメソッド経由でインスタンス化(推奨)\nconst userAccount = UserAccount.of({ id: \"123\", name: \"テスト\" });\n```\n\n#### 2.4.2 ファクトリーメソッドの命名規則\n\n基本的なファクトリーメソッド名は`of`を使用します。特殊な生成パターンがある場合は、目的を明確にした名前を使用してください。\n\n```typescript\nclass Task {。\n private constructor(private readonly props: { /* ... */ }) {}\n\n // 基本的なファクトリーメソッド。\n static of(props: { /* ... */ }): Task {\n return new Task(props);。\n }\n\n // 特殊用途のファクトリーメソッド。\n static empty(): Task {\n return new Task({ id: uuidv4(), title: \"\", completed: false });\n }\n\n // 変換用ファクトリーメソッド。\n static fromDto(dto: TaskDto): Task {\n return new Task({。\n id: dto.id,\n title: dto.title,\n completed: dto.status === \"DONE\"\n });\n }\n}\n```\n\n#### 2.4.3 ファクトリークラスの使用\n\n複雑な生成ロジックがある場合や、生成のためのコンテキストが必要な場合は、専用のファクトリークラスを使用します。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/typescript-01jpcvxfxha41b95hkx2y2y2py.md","loc":{"lines":{"from":141,"to":186}}}}],["246",{"pageContent":"#### 2.4.3 ファクトリークラスの使用\n\n複雑な生成ロジックがある場合や、生成のためのコンテキストが必要な場合は、専用のファクトリークラスを使用します。\n\n```typescript\n// 複雑な生成ロジックを持つファクトリークラス。\nclass UserFactory {。\n constructor(private readonly idGenerator: IdGenerator) {}\n\n // コンテキストを使用した生成メソッド。\n createWithDefaults(name: string): User {\n return User.of({。\n id: this.idGenerator.generate(),\n name,。\n role: \"USER\",\n createdAt: new Date()\n });\n }\n\n // 特定のユースケース向けの生成メソッド。\n createAdmin(name: string): User {\n return User.of({。\n id: this.idGenerator.generate(),\n name,。\n role: \"ADMIN\",\n createdAt: new Date()\n });\n }\n}\n```\n\n#### 2.4.4 インスタンス生成の基本原則\n\n1. クラスのコンストラクタは必ず`private`にする。\n2. 基本的なインスタンス生成には`static of()`ファクトリーメソッドを提供する。\n3. 特殊な生成パターンには目的を明確にしたファクトリーメソッドを追加する。\n4. 複雑な生成ロジックは専用のファクトリークラスに委譲する。\n5. ファクトリーメソッド内で必要なビジネスルール検証する。\n\nこれらの原則に従うことで、オブジェクト生成の一貫性を確保し、ビジネスルールの適用を一箇所に集中させることができます。また、将来的な要件変更にも柔軟に対応できるコードベースになります。\n\n## 3. ディレクトリ構成\n\nTypeScriptプロジェクトの標準的なディレクトリ構成:。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/typescript-01jpcvxfxha41b95hkx2y2y2py.md","loc":{"lines":{"from":184,"to":227}}}}],["247",{"pageContent":"これらの原則に従うことで、オブジェクト生成の一貫性を確保し、ビジネスルールの適用を一箇所に集中させることができます。また、将来的な要件変更にも柔軟に対応できるコードベースになります。\n\n## 3. ディレクトリ構成\n\nTypeScriptプロジェクトの標準的なディレクトリ構成:。\n\n```\nsrc/。\n├── domain/ // ドメインモデル。\n│ ├── types.d.ts // ドメイン型定義。\n│ ├── task.ts。\n│ ├── user.ts。\n│ └── repository/ // リポジトリインターフェース。\n│ ├── types.d.ts。\n│ ├── task-repository.ts。\n│ └── user-repository.ts。\n│\n├── use-case/ // ユースケース。\n│ ├── types.d.ts // ユースケース型定義。\n│ ├── create-task.ts。\n│ ├── complete-task.ts。\n│ └── get-task-list.ts。\n│\n├── interface-adaptor/ // アダプタ。\n│ ├── repository/ // リポジトリ実装。\n│ │ ├── task-repository-impl.ts。\n│ │ └── user-repository-impl.ts。\n│ └── controller/ // コントローラ。\n│ ├── task-controller.ts。\n│ └── user-controller.ts。\n│\n├── infrastructure/ // インフラ。\n│ ├── config.ts。\n│ ├── logger.ts。\n│ └── result.ts。\n│\n└── main.ts // エントリーポイント。\n```\n\nこの構成は、関心事の分離と依存関係の明確化を実現します。上位レイヤーは下位レイヤーに依存し、下位レイヤーは上位レイヤーに依存しません(依存関係逆転の原則)。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/typescript-01jpcvxfxha41b95hkx2y2y2py.md","loc":{"lines":{"from":223,"to":262}}}}],["248",{"pageContent":"この構成は、関心事の分離と依存関係の明確化を実現します。上位レイヤーは下位レイヤーに依存し、下位レイヤーは上位レイヤーに依存しません(依存関係逆転の原則)。\n\n## 4. テスト戦略\n\n### 4.1 テストファイル配置\n\n- ユニットテスト:各ファイル`*.ts`に対応する`*.test.ts`。\n- ユニットテスト:`src/domain/`, `src/use-case/`, `src/infrastructure/`フォルダごとに対応。\n- 統合テスト:`src/integration-tests/*.test.ts`。\n\n### 4.2 テストプラクティス\n\n- モック化には`jest.mock()`や`jest.spyOn()`を使用する。\n- テスト容易性向上のためDependency Injectionパターンを活用する。\n- テスト可能性を考慮したコード設計(副作用の分離)する。\n\n## 5. ツールチェイン\n\n### 5.1 推奨パッケージ\n\n- **TypeScript**: `typescript`。\n- **リンター/フォーマッター**: `@biomejs/biome`(ESLintとPrettierの代替)\n- **テスティングフレームワーク**: `jest` + `ts-jest`。\n- **ビルドツール**: `esbuild`(高速でモダンなビルドツール)\n\n### 5.2 NPMスクリプト\n\n```json\n\"scripts\": {\n \"type-check\": \"tsc --noEmit\",\n \"build\": \"npm run type-check && node esbuild.js\",\n \"lint\": \"biome check .\",\n \"lint:fix\": \"biome check --write .\",\n \"format\": \"biome format --write .\",\n \"test\": \"jest\",\n \"test:coverage\": \"jest --coverage\",\n \"test:watch\": \"jest --watch\"\n}\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript/typescript-01jpcvxfxha41b95hkx2y2y2py.md","loc":{"lines":{"from":262,"to":300}}}}],["249",{"pageContent":"---\ndescription: TypeScriptのコーディング規約と開発ガイドライン\nruleId: typescript-01jpcvxfxf9jafj03jk1zks31w\ntags:\n - typescript\n - coding\n - guidelines\naliases:\n - typescript-rules\n - ts-guidelines\nglobs:\n - '**/*.ts'\n - '**/*.tsx'\n - '**/*.js'\n - '**/*.jsx'\n - '**/*.go'\n - '**/*.rs'\n - '**/*.scala'\n---\n\n# TypeScriptの掟\n\n## 基本原則\n\n- TypeScriptの公式スタイルガイドに従う。\n- Prettierを使用してコードフォーマットを統一する。\n- ESLintを使用してコード品質を維持する。\n\n## モジュール構成\n\nTypeScriptのコーディング規約は以下のモジュールに分かれています:。\n\n- [TSDocの掟](typescript/tsdoc-01jpcvxfxjwwn785s5jg7t1773.md) - コードドキュメントの書き方\n- [TypeScriptコーディングスタイル](typescript/tsstyle-01jpcvxfxjwwn785s5jg7t1770.md) - 命名規則、型システム、エラー処理など\n- [TypeScriptツール活用](typescript/tstools-01jpcvxfxha41b95hkx2y2y2pz.md) - 開発ツールの使用方法\n- [TypeScriptコードレビュー](typescript/tsreview-01jpcvxfxjwwn785s5jg7t1771.md) - レビュー時のチェックポイント\n- [TypeScript参考文献](typescript/tsrefs-01jpcvxfxjwwn785s5jg7t1772.md) - 学習リソースと参考資料\n\n## クイックリファレンス\n\n### 重要な原則","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript-01jpcvxfxf9jafj03jk1zks31w.md","loc":{"lines":{"from":1,"to":41}}}}],["250",{"pageContent":"## クイックリファレンス\n\n### 重要な原則\n\n- クラス名はパスカルケース、変数・関数名はキャメルケースを使用する。\n- `any`型の使用は可能な限り避ける。\n- 非同期処理には`async/await`を一貫して使用する。\n- 型安全なエラー処理を実装する。\n- テストは網羅的に書き、エッジケースも考慮する。\n\n### 必須ツール\n\n- `tsc` - TypeScriptコンパイラ。\n- `eslint` - 静的解析。\n- `prettier` - コードフォーマッター。\n- `jest` - テストフレームワーク。\n- `ts-node` - 開発時の実行環境。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding/typescript-01jpcvxfxf9jafj03jk1zks31w.md","loc":{"lines":{"from":39,"to":55}}}}],["251",{"pageContent":"---\ndescription: プロジェクトのコーディング規約と基本原則\nruleId: coding-01jpcvxfxca2m945xeb4tjn95b\ntags:\n - coding\n - guidelines\n - standards\naliases:\n - coding-standards\n - coding-guidelines\nglobs:\n - '**/*.go'\n - '**/*.rs'\n - '**/*.scala'\n - '**/*.ts'\n - '**/*.tsx'\n - '**/*.js'\n - '**/*.jsx'\n---\n\n\n# コーディングの掟\n\n## 概要\n\nこのドキュメントは、プロジェクトにおけるコーディング規約と基本原則を定義します。\n全ての開発者は、これらの規約に従ってコードを作成することが求められます。\n\n## 基本原則\n\n以下の原則は、全ての言語やフレームワークに共通する基本的な規約です:。\n\n- コーディング規約は言語の標準に従う(フォーマッターで自動適用)\n- オブジェクト間の循環参照を避ける。\n- シンプルで理解しやすいコードを心がける。\n\n## コードの品質管理\n\nコードの品質を維持するための具体的なガイドラインを提供します。\n\n### コメントに関するルール\n\nコメントは、コードの意図と理由を明確に伝えるために重要です:。\n\n- 全てのコメントは英語で記述する(コード上のコメント、ドキュメントコメント共に)\n- コードを読めば分かることはコメントに書かない。\n- コメントには以下を記述する。\n - Why: なぜその実装が必要か。\n - Why not: なぜ他の実装方法を選択しなかったか。\n\n### デバッグに関するルール\n\n効果的なデバッグを可能にするための規約:。\n\n- 適切なログ出力を入れる。\n- ステップバイステップで解析可能にする。\n- デバッグログとアプリケーションログを区別する。\n\n## コード設計の原則\n\n保守性と拡張性の高いコードを実現するための設計原則:。\n\n- 単一責任の原則を守る。\n- 依存関係を最小限に抑える。\n- テスト容易性を考慮した設計する。\n\n## 言語固有の規約","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding-01jpcvxfxca2m945xeb4tjn95b.md","loc":{"lines":{"from":1,"to":67}}}}],["252",{"pageContent":"効果的なデバッグを可能にするための規約:。\n\n- 適切なログ出力を入れる。\n- ステップバイステップで解析可能にする。\n- デバッグログとアプリケーションログを区別する。\n\n## コード設計の原則\n\n保守性と拡張性の高いコードを実現するための設計原則:。\n\n- 単一責任の原則を守る。\n- 依存関係を最小限に抑える。\n- テスト容易性を考慮した設計する。\n\n## 言語固有の規約\n\n各プログラミング言語固有のコーディング規約とドキュメントルールは以下を参照してください:。\n\n### Golang\n\n- [Golangの掟](coding/golang-01jpcvxfxgyqe2jprh9hgn6xq7.md) - 基本的なコーディング規約\n- [Golangdocの掟](coding/golang/golangdoc-01jpcvxfxqe37ka9pn3xb4m9yr.md) - ドキュメント作成ガイド\n- [Golangコーディングスタイル](coding/golang/golangstyle-01jpcvxfxpsvpepv85myk6s6bg.md) - 推奨されるコーディングスタイル\n- [Golangツール活用](coding/golang/golangtools-01jpcvxfxpsvpepv85myk6s6bf.md) - 開発ツールの使用方法\n- [Golangコードレビュー](coding/golang/golangreview-01jpcvxfxpsvpepv85myk6s6bh.md) - レビュー時のチェックポイント\n- [Golang参考文献](coding/golang/golangrefs-01jpcvxfxpsvpepv85myk6s6bj.md) - 推奨される学習リソース\n\n### Rust\n\n- [Rustの掟](coding/rust-01jpcvxfxf9jafj03jk1zks31y.md) - Rust固有の規約とベストプラクティス\n- [Rustdocの掟](coding/rust/rustdoc-01jpcvxfxpsvpepv85myk6s6be.md) - Rustdocの活用方法\n\n### Scala","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding-01jpcvxfxca2m945xeb4tjn95b.md","loc":{"lines":{"from":53,"to":85}}}}],["253",{"pageContent":"### Rust\n\n- [Rustの掟](coding/rust-01jpcvxfxf9jafj03jk1zks31y.md) - Rust固有の規約とベストプラクティス\n- [Rustdocの掟](coding/rust/rustdoc-01jpcvxfxpsvpepv85myk6s6be.md) - Rustdocの活用方法\n\n### Scala\n\n- [Scalaの掟](coding/scala-01jpcvxfxf9jafj03jk1zks31x.md) - Scala固有の規約とパターン\n- [Scaladocの掟](coding/scala/scaladoc-01jpcvxfxmsb49cge8ewg55kah.md) - Scaladocの書き方\n\n### TypeScript\n\n- [TypeScriptの掟](coding/typescript-01jpcvxfxf9jafj03jk1zks31w.md) - TypeScript固有の規約と型の使用方法\n- [TSDocの掟](coding/typescript/tsdoc-01jpcvxfxjwwn785s5jg7t1773.md) - TSDocの活用ガイド\n\n## 共通ドキュメント\n\n- [ドキュメントコメントの掟](coding/doc-comment-01jpcvxfxgyqe2jprh9hgn6xq8.md) - 言語共通のドキュメントコメント規約","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/coding-01jpcvxfxca2m945xeb4tjn95b.md","loc":{"lines":{"from":80,"to":97}}}}],["254",{"pageContent":"---\ndescription: Clean Architectureに関するドキュメント\nruleId: clean-architecture-01jpcvxfxd87red8vvv00mjyy3\ntags: [\"development\"]\naliases: [\"clean-architecture\", \"architecture-patterns\"]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\"]\n---\n\n# クリーンアーキテクチャのルール\n\n## 基本的な考え方\n\nクリーンアーキテクチャは、ソフトウェアの依存関係を整理し、ビジネスロジックを技術的実装の詳細から分離することで、保守性と拡張性を高めるアーキテクチャパターンです。\n\n## アーキテクチャレイヤー\n\nクリーンアーキテクチャは以下の4つのレイヤーで構成されます:。\n\n1. **ドメイン層**(最内層)\n - ビジネスルールとエンティティを含む。\n - 技術的詳細に依存しない純粋なビジネスロジック。\n - 値オブジェクト、エンティティ、ドメインサービス。\n - リポジトリインタフェース(依存関係逆転の原則による)\n1. **ユースケース層**。\n - アプリケーション固有のビジネスルール。\n - ドメインモデルを操作するフロー制御。\n - 処理フローの実装。\n - イベントハンドラー設定。\n1. **インタフェースアダプタ層**。\n - 外部システムとの接点(コントローラー、ゲートウェイ)\n - リポジトリの実装。\n - 外部APIとのデータ変換や通信。\n - RPCやDBアクセスなど具体的な入出力操作。\n1. **インフラストラクチャ層**(横断的関心事)\n - 各レイヤーから利用される汎用的な技術基盤。\n - IO操作を伴わないユーティリティ機能。\n - 設定管理、共通ユーティリティ。\n - ロギング、ID生成、日付操作などの共通機能。\n - `Option`型,`Result`型など。\n\n## 依存関係のルール\n\n### 基本的な依存方向","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/clean-architecture-01jpcvxfxd87red8vvv00mjyy3.md","loc":{"lines":{"from":1,"to":43}}}}],["255",{"pageContent":"## 依存関係のルール\n\n### 基本的な依存方向\n\n依存関係は外から内へ流れます:。\n```\nインターフェースアダプタ層 → ユースケース層 → ドメイン層。\n```\n\n- 各層は内側の層にのみ依存可能。\n- 外側の層に依存することは禁止。\n\n### インフラストラクチャ層の特殊性\n\nインフラストラクチャ層は横断的関心事として扱われます:。\n```\n各レイヤー → インフラストラクチャ層。\n```\n\n- どのレイヤーからも利用可能な汎用的な技術基盤として機能。\n- 特定の外部サービスに依存しない。\n- IO操作を伴わないユーティリティのみを提供。\n\n### 依存関係逆転の原則\n\nドメイン層とユースケース層は、具体的な実装ではなくインタフェースに依存します:。\n\n- リポジトリのインタフェースはドメイン層に定義。\n- 実装はインタフェースアダプタ層に配置。\n- これにより高レベルモジュール(ドメイン層、ユースケース層)が低レベルモジュール(インタフェースアダプタ層)に直接依存することを回避。\n\n## 各層の明確な責務\n\n### ドメイン層\n\n- ビジネスロジックの中核。\n- エンティティ、値オブジェクト、ドメインサービス。\n- 外部技術に依存しない純粋なビジネスルール。\n- リポジトリインタフェース(ポート)\n\n### ユースケース層\n\n- アプリケーション固有のビジネスロジック。\n- 複数ドメインオブジェクトの調整。\n- ドメインオブジェクトを操作するフロー制御。\n- 入出力ポートの定義。\n\n### インタフェースアダプタ層\n\n- 外部システムとの接点。\n- リポジトリの実装(アダプター)\n- データ変換処理。\n- 外部サービスとの具体的な連携。\n- RPCやDBアクセスなど入出力操作。\n\n### インフラストラクチャ層\n\n- 各レイヤーで利用される共通基盤。\n- IO操作を伴わないユーティリティ。\n- ロギング、設定管理などの共通機能。\n- 言語機能を拡張するヘルパー・ユーティリティ。\n\n## まとめ","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/clean-architecture-01jpcvxfxd87red8vvv00mjyy3.md","loc":{"lines":{"from":41,"to":103}}}}],["256",{"pageContent":"- 外部システムとの接点。\n- リポジトリの実装(アダプター)\n- データ変換処理。\n- 外部サービスとの具体的な連携。\n- RPCやDBアクセスなど入出力操作。\n\n### インフラストラクチャ層\n\n- 各レイヤーで利用される共通基盤。\n- IO操作を伴わないユーティリティ。\n- ロギング、設定管理などの共通機能。\n- 言語機能を拡張するヘルパー・ユーティリティ。\n\n## まとめ\n\nクリーンアーキテクチャの本質は、ビジネスロジックを技術的詳細から分離し、依存関係を明確に制御することです。これにより変更に強く、テスト可能で、保守しやすいシステムを構築できます。「依存関係は外から内へ」という原則と「依存関係逆転の原則」を適切に適用することで、ビジネスロジックの純粋性を保ちながら技術的な実装の詳細を隔離できます。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/clean-architecture-01jpcvxfxd87red8vvv00mjyy3.md","loc":{"lines":{"from":90,"to":105}}}}],["257",{"pageContent":"---\ndescription: ドメインモデルのビルディングブロック\nruleId: domain-building-blocks-01jpcvxfxe99ev6x7f60xvbk8w\ntags: [\"development\",\"ddd\"]\naliases: [\"domain-modeling\", \"ddd-building-blocks\"]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\"]\n---\n\n# ドメインモデルのビルディングブロック\n\n> このガイドは特定のプログラミング言語に依存せず、どの言語でも適用可能な原則を説明しています。コード例はTypeScriptで示していますが、概念は他の言語にも応用できます。\n\nドメイン駆動設計では、適切なドメインモデルのビルディングブロックを使うことが重要です。\n\n## 値オブジェクトの活用\n\n値オブジェクトは、以下の特性を持つオブジェクトです:。\n\n- **識別子を持たない**: 属性のみで同一性を判断。\n- **不変**: 一度作成したら変更できない。\n- **自己完結的**: 他のエンティティへの参照を持たない。\n\n```typescript\nimport * as E from 'fp-ts/Either';。\n\nclass IllegalArgumentError extends Error {。\n constructor(message: string) {\n super(message);。\n this.name = 'IllegalArgumentError';。\n }\n}\n\nclass ValidationError {。\n private constructor(private readonly _message: string) {}\n \n static of(message: string): ValidationError {\n return new ValidationError(message);。\n }\n \n get message(): string {\n return this._message;。\n }\n}","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-building-blocks-01jpcvxfxe99ev6x7f60xvbk8w.md","loc":{"lines":{"from":1,"to":43}}}}],["258",{"pageContent":"class MoneyDepositError extends Error {。\n constructor(message: string) {\n super(message);。\n this.name = 'MoneyDepositError';。\n }\n}\n\nclass MoneyWithdrawalError extends Error {。\n constructor(message: string) {\n super(message);。\n this.name = 'MoneyWithdrawalError';。\n }\n}\n\nclass AssertionError extends Error {。\n constructor(message: string) {\n super(message);。\n this.name = 'AssertionError';。\n }\n}\n\ntype MoneyProps = {。\n amount: number;\n currency: string;\n};\n\nclass Money {。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-building-blocks-01jpcvxfxe99ev6x7f60xvbk8w.md","loc":{"lines":{"from":45,"to":71}}}}],["259",{"pageContent":"private constructor(。\n private readonly _amount: number,\n private readonly _currency: string\n ) {\n if (this._amount < 0) {。\n throw new IllegalArgumentError(\"金額は0以上である必要があります\");。\n }\n if (![\"JPY\", \"USD\", \"EUR\"].includes(this._currency)) {。\n throw new IllegalArgumentError(\"サポートされていない通貨です\");。\n }\n }\n \n static of(props: MoneyProps): Money {\n return new Money(props.amount, props.currency);。\n }\n \n static validate(props: MoneyProps): E.Either<ValidationError, Money> {\n try {。\n return E.right(Money.of(props.amount, props.currency));。\n } catch (e: unknown) {\n if (e instanceof IllegalArgumentError) {。\n return E.left(ValidationError.of(e.message));。\n }\n throw new AssertionError(\"不明なエラーが発生しました\");。\n }\n }\n \n private copy(props: Partial<MoneyProps>): Money {\n return Money.of({。\n id: props.amount ?? this._amount,\n status: props.currency ?? this._currency\n });\n }","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-building-blocks-01jpcvxfxe99ev6x7f60xvbk8w.md","loc":{"lines":{"from":73,"to":105}}}}],["260",{"pageContent":"}\n }\n \n private copy(props: Partial<MoneyProps>): Money {\n return Money.of({。\n id: props.amount ?? this._amount,\n status: props.currency ?? this._currency\n });\n }\n \n deposit(other: Money): E.Either<MoneyDepositError, Money> {\n if (this.currency !== other.currency) {。\n return E.left(new MoneyDepositError(\"通貨が異なる金額は加算できません\"));。\n }\n return E.right(this.copy({ amount: this._amount + other.amount }));\n }\n \n withdraw(other: Money): E.Either<MoneyWithdrawalError, Money> {\n if (this.currency !== other.currency) {。\n return E.left(new MoneyWithdrawalError(\"通貨が異なる金額は減算できません\"));。\n }\n if ((this._amount - other.amount) < 0) {。\n return E.left(new MoneyWithdrawalError(\"残高不足のため引き出しできません\"));。\n }\n return E.right(this.copy({ amount: this._amount - other.amount }));\n }\n \n get breachEncapsulationOfAmount(): number {\n return this._amount;。\n }\n \n get breachEncapsulationOfCurrency(): string {\n return this._currency;。\n }","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-building-blocks-01jpcvxfxe99ev6x7f60xvbk8w.md","loc":{"lines":{"from":97,"to":130}}}}],["261",{"pageContent":"}\n \n get breachEncapsulationOfAmount(): number {\n return this._amount;。\n }\n \n get breachEncapsulationOfCurrency(): string {\n return this._currency;。\n }\n \n equals(other: Money): boolean {\n return this._amount === other.amount && this._currency === other.currency;。\n }\n \n toString(): string {\n return `${this._amount} ${this._currency}`;。\n }\n}\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-building-blocks-01jpcvxfxe99ev6x7f60xvbk8w.md","loc":{"lines":{"from":122,"to":140}}}}],["262",{"pageContent":"### エンティティと集約\n\nエンティティと集約は以下の原則に従って設計します:。\n\n1. **エンティティ**:\n - 識別子を持つ。\n - ライフサイクルを持つ。\n - その状態が時間とともに変化する。\n1. **集約**:\n - トランザクション整合性の単位。\n - 1つの集約ルートと複数の子エンティティや値オブジェクトから構成。\n - 外部からは集約ルートを通じてのみアクセス可能。\n\n```typescript\ntype OrderProps = {。\n id: OrderId;\n orderItems: OrderItems;\n status: OrderStatus;\n};\n\nclass Order {。\n\n private constructor(private readonly _id: OrderId,\n private readonly _status: OrderStatus,\n private readonly _orderItems: OrderItems) {\n }\n\n static create(props: Pick<OrderProps, \"id\"> & Partial<OrderProps>) {\n return new Order(props.id, props.status ?? OrderStatus.DRAFT, props.orderItems ?? OrderItems.empty());。\n }","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-building-blocks-01jpcvxfxe99ev6x7f60xvbk8w.md","loc":{"lines":{"from":142,"to":171}}}}],["263",{"pageContent":"static create(props: Pick<OrderProps, \"id\"> & Partial<OrderProps>) {\n return new Order(props.id, props.status ?? OrderStatus.DRAFT, props.orderItems ?? OrderItems.empty());。\n }\n\n addOrderItem(props: { product: ProductId; quantity: Quantity; unitPrice: Money }): E.Either<AddOrderItemError, Order> {\n if (this._status !== OrderStatus.DRAFT) {。\n return E.left(new AddOrderItemError(\"注文確定後は商品を追加できません\"));。\n }\n const orderItem = OrderItem.create(props.product, props.quantity, props.unitPrice);。\n const newOrderItems = this._orderItems.add(orderItem);。\n return E.right(this.copy({ orderItems: newOrderItems }));\n }\n\n confirm(): E.Either<OrderConfirmationError, Order> {\n if (this._orderItems.isEmpty()) {。\n return E.left(new OrderConfirmationError(\"注文に商品が含まれていません\"));。\n }\n if (this._status !== OrderStatus.DRAFT) {。\n return E.left(new OrderConfirmationError(\"すでに確定済みの注文です\"));。\n }\n return E.right(this.copy({ status: OrderStatus.CONFIRMED }));\n }","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-building-blocks-01jpcvxfxe99ev6x7f60xvbk8w.md","loc":{"lines":{"from":169,"to":190}}}}],["264",{"pageContent":"equals(other: Order): boolean {\n return this._id === other._id && this._status === other.status && this._orderItems === other.orderItems;。\n }\n \n private copy(props: Partial<OrderProps>): Order {\n return Order.of({。\n id: props.id ?? this._id,\n status: props.status ?? this._status,\n orderItems: props.orderItems ?? this._orderItems,\n });\n }\n\n sameIdentityAs(other: Order): boolean {\n return this._id === other._id;。\n }\n \n get breachEncapsulationOfId(): OrderId {\n return this._id;。\n }\n\n get breachEncapsulationOfStatus(): OrderStatus {\n return this._status;。\n }\n\n get breachEncapsulationOfOrderItems(): OrderItems {\n return this._orderItems;。\n }\n}\n```\n\n### ドメインサービス\n\n複数のエンティティや値オブジェクトにまたがる操作はドメインサービスとして実装します:。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-building-blocks-01jpcvxfxe99ev6x7f60xvbk8w.md","loc":{"lines":{"from":192,"to":224}}}}],["265",{"pageContent":"get breachEncapsulationOfOrderItems(): OrderItems {\n return this._orderItems;。\n }\n}\n```\n\n### ドメインサービス\n\n複数のエンティティや値オブジェクトにまたがる操作はドメインサービスとして実装します:。\n\n```typescript\n// ドメインサービスの例。\n// クラス名やメソッド名はユビキタス言語に対応すること。\nclass BankAccountTransfer {。\n static transfer(from: BankAccount, to: BankAccount, amount: Money): E.Either<BankAccountTransferError, [BankAccount, BankAccount]> {\n const newFromResult = from.withdraw(amount);。\n if (E.isLeft(newFromResult)) {。\n return E.left(new BankAccountTransferError(`残高不足または出金元口座でのエラー: ${newFromResult.left.message}`));\n }\n const newToResult = to.deposit(amount);。\n if (E.isLeft(newToResult)) {。\n return E.left(new BankAccountTransferError(`入金先口座でのエラー: ${newToResult.left.message}`));\n }\n const newFrom = newFromResult.right;。\n const newTo = newToResult.right;。\n return E.right([newFrom, newTo]);。\n }\n}\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-building-blocks-01jpcvxfxe99ev6x7f60xvbk8w.md","loc":{"lines":{"from":216,"to":244}}}}],["266",{"pageContent":"```typescript\n// グローバル関数として定義してもよい。\nfunction bankAccountTransfer(from: BankAccount, to: BankAccount, amount: Money): E.Either<BankAccountTransferError, [BankAccount, BankAccount]> {\n const newFromResult = from.withdraw(amount);。\n if (E.isLeft(newFromResult)) {。\n return E.left(new BankAccountTransferError(`残高不足または出金元口座でのエラー: ${newFromResult.left.message}`));\n }\n const newToResult = to.deposit(amount);。\n if (E.isLeft(newToResult)) {。\n return E.left(new BankAccountTransferError(`入金先口座でのエラー: ${newToResult.left.message}`));\n }\n const newFrom = newFromResult.right;。\n const newTo = newToResult.right;。\n return E.right([newFrom, newTo]);。\n}\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-building-blocks-01jpcvxfxe99ev6x7f60xvbk8w.md","loc":{"lines":{"from":246,"to":261}}}}],["267",{"pageContent":"---\ndescription: ドメインモデルファーストに関するドキュメント\nruleId: domain-model-first-01jpcvxfxf9jafj03jk1zks31v\ntags: [\"development\",\"ddd\"]\naliases: [\"domain-model-process\", \"ddd-development-process\"]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\"]\n---\n\n# ドメインモデル中心の開発手順\n\n> このガイドは特定のプログラミング言語に依存せず、どの言語でも適用可能な原則を説明しています。コード例はTypeScriptで示していますが、概念は他の言語にも応用できます。\n\n## テストファーストのドメインモデル設計・実装\n\n### 目的\n\n外部依存(リポジトリやインフラ)に左右されない純粋なドメインロジックを実装する。\n\n### 具体的な手順\n\n1. **ドメインモデルの振る舞いをテストとして定義**。\n - モデルが持つべき機能と制約を明確にする。\n - エッジケースも含めて考慮する。\n1. **テストを満たすドメインモデルの実装**。\n - テストが示す仕様に従って実装。\n - バリューオブジェクト、エンティティ、集約の設計原則に従う。\n1. **リファクタリングによる設計の洗練**。\n - コードの重複排除。\n - 責務の明確化と分離。\n - 命名の改善。\n\n### メリット\n\n- 仕様の明確化と要件の理解促進。\n- 設計品質の向上(責務分離・凝集度向上)\n- リファクタリングの安全性確保。\n- エッジケースの早期発見。\n- ドキュメントとしての価値。\n\n### テスト例\n\n```typescript\n// Taskのテスト例。\ndescribe(\"Task\", () => {。\n it(\"タスクが完了しているかどうかを確認できる\", () => {。\n const taskId = TaskId.of(\"task-1\");。\n const title = TaskTitle.of(\"テストタスク\");。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-model-first-01jpcvxfxf9jafj03jk1zks31v.md","loc":{"lines":{"from":1,"to":47}}}}],["268",{"pageContent":"### テスト例\n\n```typescript\n// Taskのテスト例。\ndescribe(\"Task\", () => {。\n it(\"タスクが完了しているかどうかを確認できる\", () => {。\n const taskId = TaskId.of(\"task-1\");。\n const title = TaskTitle.of(\"テストタスク\");。\n\n const task = Task.of({。\n id: taskId,\n title: title,\n completed: false,\n createdAt: new Date(\"2023-03-01T10:00:00\"),\n });\n\n expect(task.isCompleted()).toBe(false);。\n \n const completedTask = task.markAsCompleted();。\n expect(completedTask.isCompleted()).toBe(true);。\n });\n\n it(\"期限日が未来の日付であることを検証できる\", () => {。\n const pastDate = new Date();。\n pastDate.setDate(pastDate.getDate() - 1); // 昨日の日付。\n \n const result = Task.validateDueDate(pastDate);。\n \n expect(result.isFailure()).toBe(true);。\n expect(result.error.message).toContain(\"期限は未来の日付である必要があります\");。\n });\n});\n```\n\n## インメモリリポジトリの実装\n\n### 目的\n\n- データベースに依存せず、ドメインモデルとユースケースのテスト実行を可能にする。\n\n### 具体的な手順","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-model-first-01jpcvxfxf9jafj03jk1zks31v.md","loc":{"lines":{"from":40,"to":80}}}}],["269",{"pageContent":"## インメモリリポジトリの実装\n\n### 目的\n\n- データベースに依存せず、ドメインモデルとユースケースのテスト実行を可能にする。\n\n### 具体的な手順\n\n1. **リポジトリインタフェースの定義**。\n - ドメインモデルで必要な操作を定義。\n2. **インメモリ実装の作成**。\n - メモリ上のコレクションを使用。\n - 実際のデータベースの振る舞いをシミュレート。\n\n## 3. ユースケース開発\n\n### 目的\n\n- アプリケーション層のロジックをドメインモデルとリポジトリを使って実装。\n\n### 具体的な手順\n\n1. **ユースケースのテストを定義**。\n - 実行条件と期待結果を明確に。\n - 成功ケースと失敗ケースの両方をカバー。\n2. **テストを満たすユースケースを実装**。\n - 適切なドメインモデルとリポジトリの利用。\n - ビジネスルールの適用。\n3. **リファクタリング**。\n - 責務の分離と明確化。\n\n### テスト例\n\n```typescript\ndescribe(\"CompleteTaskUseCase\", () => {。\n let taskRepository: TaskRepositoryInMemory;\n let completeTaskUseCase: CompleteTaskUseCase;\n\n beforeEach(() => {。\n taskRepository = new TaskRepositoryInMemory();。\n \n const task1 = Task.of({。\n id: TaskId.of(\"task-1\"),\n title: TaskTitle.of(\"未完了タスク\"),\n completed: false,\n createdAt: new Date(\"2023-03-01T10:00:00\"),\n });","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-model-first-01jpcvxfxf9jafj03jk1zks31v.md","loc":{"lines":{"from":74,"to":120}}}}],["270",{"pageContent":"const task2 = Task.of({。\n id: TaskId.of(\"task-2\"),\n title: TaskTitle.of(\"既に完了しているタスク\"),\n completed: true,\n createdAt: new Date(\"2023-03-01T13:00:00\"),\n });\n\n taskRepository.save(task1);。\n taskRepository.save(task2);。\n \n completeTaskUseCase = new CompleteTaskUseCase(taskRepository);。\n });\n\n it(\"タスクを完了できる\", async () => {。\n const result = await completeTaskUseCase.execute({。\n taskId: \"task-1\",\n });\n\n expect(result.isSuccess()).toBe(true);。\n \n const updatedTask = await taskRepository.findById(TaskId.of(\"task-1\"));。\n expect(updatedTask.isSuccess()).toBe(true);。\n expect(updatedTask.value.isCompleted()).toBe(true);。\n });\n\n it(\"存在しないタスクを処理できる\", async () => {。\n const result = await completeTaskUseCase.execute({。\n taskId: \"non-existent\",\n });\n\n expect(result.isFailure()).toBe(true);。\n expect(result.error.message).toContain(\"タスクが見つかりません\");。\n });\n});\n```\n\n## インタフェースアダプタとインフラの実装\n\n### 目的","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-model-first-01jpcvxfxf9jafj03jk1zks31v.md","loc":{"lines":{"from":122,"to":160}}}}],["271",{"pageContent":"expect(result.isFailure()).toBe(true);。\n expect(result.error.message).toContain(\"タスクが見つかりません\");。\n });\n});\n```\n\n## インタフェースアダプタとインフラの実装\n\n### 目的\n\n- ドメインモデルとユースケースを実際のインフラと接続する。\n\n### 具体的な手順\n\n1. **永続化リポジトリの実装**。\n - 実際のデータベースへの接続。\n - リポジトリインタフェースの実装。\n \n2. **コントローラの実装**。\n - 入力の検証とユースケースへの橋渡し。\n \n3. **プレゼンテーション層の実装**。\n - ユースケース結果の表示形式への変換。\n\n## 統合テストと結合テスト\n\n### 目的\n\n- システム全体の動作を検証する。\n\n### 具体的な手順\n\n1. **統合テストの作成**。\n - 実際のインフラを使用したテスト。\n - エンドツーエンドの動作検証。\n \n2. **結合テストの実行**。\n - コンポーネント間の連携を検証。\n\n## この開発手順に従わないリスク\n\nドメインモデルを中心とする設計・実装で、本ナレッジが示す順序(ドメインモデル→インメモリリポジトリ→ユースケース→インフラ)に従わない場合、以下のような重大なリスクが発生します:。\n\n1. **ドメインモデルの設計歪曲**。\n - インフラや UI の制約によってドメインモデルの設計が不適切な影響を受ける。\n - データベーススキーマから影響を受けたエンティティ設計になる。\n - O/Rマッパフレームワークの制約に合わせてドメインモデルを妥協する。\n\n2. **技術的関心事の漏洩**。\n - 永続化やトランザクション管理などの技術的関心事がドメインロジックに混入する。\n - ドメインモデルがフレームワーク依存になり、純粋なビジネスロジックから逸脱する。\n\n3. **テスト困難性の増大**。\n - 外部依存を多く含むモデルはテストが複雑になり、カバレッジが低下する。\n - テスト実行速度の低下によりフィードバックサイクルが遅くなる。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-model-first-01jpcvxfxf9jafj03jk1zks31v.md","loc":{"lines":{"from":152,"to":206}}}}],["272",{"pageContent":"3. **テスト困難性の増大**。\n - 外部依存を多く含むモデルはテストが複雑になり、カバレッジが低下する。\n - テスト実行速度の低下によりフィードバックサイクルが遅くなる。\n\n4. **変更容易性の低下**。\n - 外部レイヤーとの依存関係が複雑になり、変更の影響範囲が広がる。\n - ドメインモデルの変更がインフラの変更を強制する状況が発生する。\n\n5. **概念の一貫性喪失**。\n - ドメインエキスパートの言語(ユビキタス言語)ではなく技術用語がモデルに混入する。\n - ビジネスルールの表現が技術的制約によって不明瞭になる。\n\n## まとめ:この開発アプローチの利点\n\n1. **ドメインモデルの設計が歪まない**。\n - インフラ制約に引きずられない純粋なドメイン設計。\n - ビジネスルールと技術的関心事の明確な分離。\n\n2. **バグの早期発見と修正が容易**。\n - テストが仕様を明確にし、変更の影響を素早く検出。\n - 単体レベルでのテストカバレッジが高まる。\n\n3. **要件変更に柔軟に対応**。\n - 堅牢なテスト基盤があることで安全なリファクタリングが可能。\n - ドメインロジックの変更がインフラに依存しない。\n\n4. **ドキュメントとしての価値**。\n - テストがドメインルールや振る舞いを文書化。\n - ユビキタス言語の一貫した使用が促進される。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/domain-model-first-01jpcvxfxf9jafj03jk1zks31v.md","loc":{"lines":{"from":204,"to":232}}}}],["273",{"pageContent":"---\ndescription: testingに関するドキュメント\nruleId: testing-01jpcvxfxe99ev6x7f60xvbk8v\ntags: [\"development\",\"layered-architecure\"]\naliases: [\"testing-strategy\", \"test-levels\"]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\"]\n---\n\n# レイヤーを考慮したテスト戦略\n\n## テストレベル\n\n### ユニットテスト\n\n- **ドメイン層のテスト**。\n - 値オブジェクト・エンティティのビジネスルールの検証。\n - ドメインサービスのロジック検証。\n - 不変条件の保証確認。\n\n- **ユースケース層のテスト**。\n - ビジネスフローの正確性確認。\n - エッジケースと例外ハンドリングの検証。\n - リポジトリインタフェースをモック化して外部依存を分離。\n\n- **インフラストラクチャユーティリティのテスト**。\n - 共通ユーティリティの機能検証。\n - 設定管理機能の動作確認。\n - 横断的関心事の検証。\n\n### 結合テスト\n\n- **コンポーネント間連携のテスト**。\n - 複数のクラスやモジュール間の相互作用検証。\n - インタフェース境界での連携確認。\n - 依存コンポーネントとの整合性検証。\n\n- **内部サブシステム間のテスト**。\n - 機能グループ間の連携確認。\n - モジュール境界を跨ぐデータフローの検証。\n - 内部API・イベント伝搬の正確性確認。\n\n- **実際のDBとの連携テスト**。\n - Testcontainersを使用した実DBでのテスト実行。\n - コンテナ化されたDBを一時的に起動してテスト。\n - 実際のクエリとデータアクセスの検証。\n - DBマイグレーションスクリプトの動作確認。\n\n### 統合テスト\n\n- **リポジトリ実装のテスト**。\n - 実際のデータストアとの連携確認。\n - トランザクション処理の検証。\n - データマッピングの正確性確認。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/testing-01jpcvxfxe99ev6x7f60xvbk8v.md","loc":{"lines":{"from":1,"to":53}}}}],["274",{"pageContent":"### 統合テスト\n\n- **リポジトリ実装のテスト**。\n - 実際のデータストアとの連携確認。\n - トランザクション処理の検証。\n - データマッピングの正確性確認。\n\n- **複数層を横断するテスト**。\n - ユースケース〜アダプタ層の連携検証。\n - エンドツーエンドのフロー確認。\n - 実際の外部依存との統合動作確認。\n\n- **外部システム連携テスト**。\n - 外部APIやサービスとの連携確認。\n - 外部システムの振る舞いをシミュレートした検証。\n - エラーハンドリングと回復メカニズムの確認。\n\n## テスト設計原則\n\n### BDDアプローチ\n\n- **Given-When-Then** パターンでテストを記述。\n - Given: テストの前提条件を設定。\n - When: テスト対象の操作する。\n - Then: 結果の検証。\n\n### テストデータ管理\n\n- **テストファクトリパターン**。\n - 複雑なテストデータを簡潔に構築。\n - テストデータ生成の再利用性を確保。\n\n- **ビルダーパターン**。\n - 柔軟なテストデータ構築。\n - 読みやすく保守しやすいテストデータ定義。\n\n## テスト戦略の効果\n\n1. **品質の早期保証**。\n - 基盤部分から検証することで、根本的な問題を早期発見。\n - 下位レイヤーから確実に品質を確保。\n\n2. **安全なリファクタリング**。\n - 十分なテストカバレッジにより設計変更やコード改善を安全に実施。\n - 変更による影響範囲を迅速に特定。\n\n3. **生きたドキュメント**。\n - テストコードが仕様を表現する生きたドキュメントとして機能。\n - 期待される動作が明確に記述され、常に最新状態を維持。\n\n4. **テスト可能な設計の実現**。\n - 依存関係の明確な分離によりモックとスタブの効果的活用が可能。\n - 外部依存から分離されたテストで安定したテスト環境を構築。\n\n5. **保守性と拡張性の向上**。\n - 責務に応じたテスト戦略により、部品の交換や機能拡張が容易。\n - テスト駆動で設計改善を継続的に実施可能。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/testing-01jpcvxfxe99ev6x7f60xvbk8v.md","loc":{"lines":{"from":48,"to":104}}}}],["275",{"pageContent":"4. **テスト可能な設計の実現**。\n - 依存関係の明確な分離によりモックとスタブの効果的活用が可能。\n - 外部依存から分離されたテストで安定したテスト環境を構築。\n\n5. **保守性と拡張性の向上**。\n - 責務に応じたテスト戦略により、部品の交換や機能拡張が容易。\n - テスト駆動で設計改善を継続的に実施可能。\n\nこのテスト戦略は、アプリケーションの各層の責務を明確に保ちながら、システム全体の品質を確保するための体系的なアプローチを提供します。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd/testing-01jpcvxfxe99ev6x7f60xvbk8v.md","loc":{"lines":{"from":98,"to":106}}}}],["276",{"pageContent":"---\ndescription: ドメイン駆動設計のルール\nruleId: ddd-01jpf07spf9d1wwnkcj4vyvt6h\ntags:\n - 開発\n - DDD\nglobs:\n - \"**/ddd/**\"\n---\n\n# ドメイン駆動設計のルール\n\n[](domain-model-first01jpcvxfxf9jafj03jk1zks31v.md)\n[](domain-building-blocks-01jpcvxfxe99ev6x7f60xvbk8w.md)\n[](testing-01jpcvxfxe99ev6x7f60xvbk8v.md)\n[](clean-architecture-01jpcvxfxd87red8vvv00mjyy3.md)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/ddd-01jpf07spf9d1wwnkcj4vyvt6h.md","loc":{"lines":{"from":1,"to":16}}}}],["277",{"pageContent":"---\ndescription: プロジェクトのドキュメント作成に関する規約と原則\nruleId: document-01jpfcn4mphghcm0jaj3wy7b7j\ntags:\n - documentation\n - development\n - best-practices\nglobs:\n - '**/*.java'\n - '**/*.scala'\n - '**/*.ts'\n - '**/*.js'\n - '**/*.py'\n - '**/*.go'\n - '**/*.rs'\n---\n\n# ドキュメント規約\n\n## 基本原則\n\nこのドキュメントでは、プロジェクト全体で一貫したドキュメントを作成するための規約を定義します。質の高いドキュメントは、プロジェクトの理解を助け、メンテナンス性を向上させるために不可欠です。\n\n### 1. 明確性と簡潔性\n\n- 簡潔かつ明確な文章を心がける\n- 一文は短く保ち、複数の概念を一文に詰め込まない\n- 必要な情報を過不足なく提供する\n\n### 2. 構造化された内容\n\n- 階層的な見出しを適切に使用する(`#`、`##`、`###`など)\n- 関連するトピックをセクションにまとめる\n- 目次(TOC)を提供して長文ドキュメントのナビゲーションを容易にする\n\n### 3. 一貫性のある形式\n\n- 用語の使用を統一する(用語集を作成し、参照する)\n- フォーマットとスタイルを一貫させる\n- テンプレートを活用する\n\n## ドキュメントの種類\n\n### 1. 技術仕様書\n\n技術的な詳細を記述するドキュメント。\n\n- システムアーキテクチャ\n- データモデル\n- API仕様\n- インタフェース定義\n\n```markdown\n# [コンポーネント名] 技術仕様書\n\n## 概要\n[コンポーネントの簡潔な説明]\n\n## アーキテクチャ\n[アーキテクチャ図と説明]\n\n## 主要コンポーネント\n[各コンポーネントの説明]\n\n## データフロー\n[データの流れの説明]\n\n## API仕様\n[APIメソッド、パラメータ、戻り値の詳細]\n\n## 制約事項\n[既知の制限や制約]\n```\n\n### 2. ユーザーガイド\n\nシステムの使用方法を説明するドキュメント。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/document-01jpfcn4mphghcm0jaj3wy7b7j.md","loc":{"lines":{"from":1,"to":77}}}}],["278",{"pageContent":"## 概要\n[コンポーネントの簡潔な説明]\n\n## アーキテクチャ\n[アーキテクチャ図と説明]\n\n## 主要コンポーネント\n[各コンポーネントの説明]\n\n## データフロー\n[データの流れの説明]\n\n## API仕様\n[APIメソッド、パラメータ、戻り値の詳細]\n\n## 制約事項\n[既知の制限や制約]\n```\n\n### 2. ユーザーガイド\n\nシステムの使用方法を説明するドキュメント。\n\n- インストール手順\n- 基本操作\n- 設定方法\n- トラブルシューティング\n\n```markdown\n# [プロダクト名] ユーザーガイド\n\n## 概要\n[プロダクトの簡潔な説明と主な機能]\n\n## インストール\n[インストール手順]\n\n## 基本操作\n[基本的な使い方]\n\n## 高度な機能\n[高度な機能の説明]\n\n## よくある問題\n[一般的な問題と解決策]\n```\n\n### 3. 開発ガイド\n\n開発者向けのガイドライン。\n\n- 開発環境のセットアップ\n- コーディング規約\n- レビュープロセス\n- デプロイメントフロー\n\n```markdown\n# 開発ガイド\n\n## 開発環境\n[開発環境のセットアップ手順]\n\n## コーディング規約\n[コーディング規約の概要と参照先]\n\n## ビルドプロセス\n[ビルド手順]\n\n## テスト\n[テスト戦略とテスト実行方法]\n\n## デプロイメント\n[デプロイメントプロセス]\n```\n\n## マークダウン標準\n\n### 見出し\n\n- `#` - メインタイトル(ドキュメントごとに1つ)\n- `##` - 主要セクション\n- `###` - サブセクション\n- `####` - 詳細セクション\n- 見出しレベルはスキップしない(`#` の次は必ず `##`)\n\n### リスト\n\n- 箇条書きリストには `-` を使用\n- 番号付きリストには `1.` を使用\n- リストの階層は空白4つでインデント\n\n```markdown\n- 項目1\n - サブ項目1.1\n - サブ項目1.2\n- 項目2\n 1. 番号付きサブ項目2.1\n 2. 番号付きサブ項目2.2\n```\n\n### コードブロック\n\n- バッククォート3つでコードブロックを囲む\n- 言語識別子を指定して構文ハイライトを有効にする","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/document-01jpfcn4mphghcm0jaj3wy7b7j.md","loc":{"lines":{"from":56,"to":159}}}}],["279",{"pageContent":"```markdown\n- 項目1\n - サブ項目1.1\n - サブ項目1.2\n- 項目2\n 1. 番号付きサブ項目2.1\n 2. 番号付きサブ項目2.2\n```\n\n### コードブロック\n\n- バッククォート3つでコードブロックを囲む\n- 言語識別子を指定して構文ハイライトを有効にする\n\n````markdown\n```typescript\nfunction example(): string {\n return \"Hello World\";\n}\n```\n````\n\n### テーブル\n\n- シンプルなテーブルにはマークダウンテーブル構文を使用\n- 複雑なテーブルにはHTMLを使用することも可\n\n```markdown\n| 列1 | 列2 | 列3 |\n|-----|-----|-----|\n| 値1 | 値2 | 値3 |\n| 値4 | 値5 | 値6 |\n```\n\n### 画像\n\n- 画像の説明テキストを必ず含める\n- 適切なサイズと形式を選択\n\n```markdown\n\n```\n\n### リンク\n\n- 相対パスを優先\n- リンクテキストは内容を適切に説明\n\n```markdown\n[ドキュメント規約](document-01jpfcn4mphghcm0jaj3wy7b7j.md)\n```\n\n## 文書更新のガイドライン\n\n### 1. 定期的なレビューと更新\n\n- ドキュメントは少なくとも3か月に1回レビュー\n- 機能変更時は関連ドキュメントを必ず更新\n- ドキュメントの「最終更新日」を記録\n\n### 2. バージョン管理\n\n- ドキュメントはコードと同じリポジトリで管理\n- 重要な変更にはバージョン番号を割り当て\n- 変更履歴を記録\n\n### 3. フィードバックの収集\n\n- ドキュメントにフィードバックメカニズムを提供\n- 受け取ったフィードバックに基づいて改善\n\n## 参考資料","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/document-01jpfcn4mphghcm0jaj3wy7b7j.md","loc":{"lines":{"from":147,"to":218}}}}],["280",{"pageContent":"### 2. バージョン管理\n\n- ドキュメントはコードと同じリポジトリで管理\n- 重要な変更にはバージョン番号を割り当て\n- 変更履歴を記録\n\n### 3. フィードバックの収集\n\n- ドキュメントにフィードバックメカニズムを提供\n- 受け取ったフィードバックに基づいて改善\n\n## 参考資料\n\n- [Google技術文書作成ガイド](https://developers.google.com/tech-writing)\n- [Microsoft Writing Style Guide](https://docs.microsoft.com/style-guide)\n- [AsciiDoc](https://asciidoc.org/)ドキュメント形式\n- [Markdown Guide](https://www.markdownguide.org/)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/document-01jpfcn4mphghcm0jaj3wy7b7j.md","loc":{"lines":{"from":207,"to":223}}}}],["281",{"pageContent":"---\ndescription: エラーハンドリングの基本原則と実装ガイドライン\nruleId: error-handling-01jpcvxfxca2m945xeb4tjn959\ntags: [development, error-handling, guidelines]\naliases: [error-guidelines]\nglobs: [\"**/*.go\", \"**/*.rs\", \"**/*.scala\", \"**/*.java\", \"**/*.ts\", \"**/*.js\"]\n---\n\n\n# エラーハンドリングのルール\n\n## 基本原則\n\nエラーハンドリングは「回復可能性」を基準に設計します。適切なエラーハンドリングにより、コードの堅牢性と保守性が向上します。\n\n## 回復可能なエラー\n\nプログラムの実行を継続できるエラーには、戻り値型を活用します。\n\n### 戻り値型の選択\n\n| 言語 | 推奨戻り値型 |。\n|------|--------------|。\n| Java | `vavr`の`Either<E, T>`型 |。\n| Scala | 標準ライブラリの`Either[E, T]`型 |。\n| Rust | 標準ライブラリの`Result<T, E>`型 |。\n| Go | `samber/mo`の`Either[E, T]`型 |。\n| TypeScript | `fp-ts`の`Either<E, T>`型 |。\n\n### 回復可能なエラーの代表的なケース\n\n1. **ドメインモデルでのビジネスルール違反**。\n - バリデーションエラー。\n - 在庫不足。\n - 権限不足。\n1. **リポジトリでの外部データアクセスエラー**。\n - データベース接続の一時的エラー。\n - 外部APIからの予期されたエラーレスポンス。\n - 楽観的ロックによる競合。\n1. **ユースケースでのアプリケーションロジックエラー**。\n - ワークフロー状態の遷移エラー。\n - 依存サービスからの回復可能なエラー。\n\n## 回復不能・致命的状況\n\nプログラムの実行を継続できない、回復不能・致命的な状況では、キャッチしない例外やパニックを使用します。\n\n### 引数としてありえない状況","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/error-handling-01jpcvxfxca2m945xeb4tjn959.md","loc":{"lines":{"from":1,"to":48}}}}],["282",{"pageContent":"## 回復不能・致命的状況\n\nプログラムの実行を継続できない、回復不能・致命的な状況では、キャッチしない例外やパニックを使用します。\n\n### 引数としてありえない状況\n\n| 言語 | 対応方法 |\n|------|----------|\n| Java/Scala | `IllegalArgumentException` |\n| Rust | `panic!` |\n| Go | `panic` |\n| TypeScript | `IllegalArgumentError` (型がなければ作る) |\n\n### 状態としてありえない状況\n\n| 言語 | 対応方法 |\n|------|----------|\n| Java/Scala | `IllegalStateException` |\n| Rust | `panic!` |\n| Go | `panic` |\n| TypeScript | `IllegalStateError` (型がなければ作る) |\n\n### 本来発生しない箇所(到達不可コード)\n\n| 言語 | 対応方法 |\n|------|----------|\n| Java/Scala | `AssertionError` |\n| Rust | `panic`または`unreachable!()` |\n| Go | `panic` |\n| TypeScript | `AssertionError` (型がなければ作る) |\n\n## エラーハンドリングの設計指針\n\nエラーハンドリングの設計時には、以下の質問に答えてください:\n\n1. **このエラーは回復可能か?**。\n - はい → `Either`/`Result`型を使用。\n - いいえ → 例外やpanicを使用。\n1. **エラーの性質は何か?**。\n - 引数の問題 → `IllegalArgumentException`。\n - 状態の問題 → `IllegalStateException`。\n - 到達不能 → `AssertionError`。\n1. **エラー発生時に期待される動作は?**。\n - 代替パスの実行。\n - リトライ。\n - ユーザーへの通知。\n - ログ記録。\n\n適切なエラーハンドリングは、プログラムの堅牢性、可読性、保守性を向上させます。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/error-handling-01jpcvxfxca2m945xeb4tjn959.md","loc":{"lines":{"from":44,"to":92}}}}],["283",{"pageContent":"---\ndescription: null handlingに関するドキュメント\nruleId: null-handling-01jpcvxfxbfm6z9tc89zm9c37e\ntags: [\"development\"]\naliases: [\"null-handling\", \"option-pattern\"]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\"]\n---\n\n# NULLハンドリングのルール\n\n## 基本原則\n\nNULL参照によるエラーはバグの主要な原因の1つです。明示的なNULLハンドリングポリシーを導入することで、より安全で予測可能なコードを作成できます。\n\n## NULL値の代替としてのOption型\n\n値の存在が不確かな場合、NULLの代わりにOption型を使用します。\n\n| 言語 | 推奨型 |。\n|------|--------|。\n| Java | `vavr`の`Option<T>`型 |。\n| Scala | 標準ライブラリの`Option[T]`型 |。\n| Rust | 標準ライブラリの`Option<T>`型 |。\n| Go | `samber/mo`の`Option[T]`型 |。\n| TypeScript | `fp-ts`の`Option<T>`型 |。\n\n## 2. 主要なユースケース\n\nOption型は以下のような場面で特に有用です:。\n\n1. **検索操作の結果**。\n - データベースからのレコード検索。\n - コレクション内の要素検索。\n - キャッシュからの値取得。\n1. **オプショナルな値**。\n - オプショナルなパラメータ。\n - 設定値が未設定の場合。\n - 省略可能なフィールド。\n1. **計算結果**。\n - 条件付きの計算。\n - 失敗する可能性のある変換。\n\n## Option型の基本操作\n\nOption型では一般的に以下の操作が提供されます:。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/null-handling-01jpcvxfxbfm6z9tc89zm9c37e.md","loc":{"lines":{"from":1,"to":45}}}}],["284",{"pageContent":"## Option型の基本操作\n\nOption型では一般的に以下の操作が提供されます:。\n\n1. **マッピング** - 値が存在する場合のみ変換を適用。\n2. **フィルタリング** - 条件を満たす場合のみ値を保持。\n3. **デフォルト値の提供** - 値が存在しない場合に代替値を使用。\n4. **副作用の実行** - 値の有無に応じた処理。\n\n## NULLハンドリングの設計指針\n\n効果的なNULLハンドリングのためのガイドライン:。\n\n1. **明示的な不在を表現**。\n - NULLや未定義ではなく、Option型を使用。\n - 戻り値の型シグネチャで不在の可能性を明示。\n1. **早期検証**。\n - メソッドの先頭でNULL値を検証。\n - 境界での検証を優先し、内部ではNULL非存在を前提に。\n1. **モナディックな操作の活用**。\n - 連鎖的な操作にはモナド演算子を使用。\n - 条件分岐よりも宣言的な表現を優先。\n1. **デフォルト値の適切な使用**。\n - ビジネスルールに基づいたデフォルト値の選択。\n - デフォルト値が適切でない場合は早期リターン。\n\nNULLハンドリングを適切に行うことで、「NullPointerException」や同様のランタイムエラーを防止し、コードの品質と信頼性を向上させることができます。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/null-handling-01jpcvxfxbfm6z9tc89zm9c37e.md","loc":{"lines":{"from":43,"to":69}}}}],["285",{"pageContent":"---\ndescription: プルリクエストの作成とレビューに関する規約とガイドライン\nruleId: pull-request-01jpcvxfxbfm6z9tc89zm9c37d\ntags: [development, pull-request, review]\naliases: [pr-guidelines]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\"]\n---\n\n\n# プルリクエストの掟\n\n## プルリクエスト作成前の準備\n\n### コードの品質確認\n\n- ローカルでテストするし、すべてのテストが通過していることを確認する。\n- コードフォーマッターを適用する。\n- リンターするし、警告がないことを確認する。\n- 既存のコーディング規約に従っていることを確認する。\n- 不必要なコメントアウトされたコードを含めない。\n\n### セキュリティチェック\n\n- 秘密情報(パスワード、APIキーなど)が含まれていないことを確認する。\n- 依存パッケージのアップデートがある場合は、セキュリティ上の影響を確認する。\n\n## プルリクエストの作成\n\n### 基本要件\n\n- 本文にIssueのURLを記載する。\n- 進捗報告はIssueに記載し、プルリクエストには含めない。\n- 1つのプルリクエストで1つの変更に集中する。\n\n### 説明文の記載\n\n- 変更の目的と概要を明確に記載する。\n- 複雑な変更の場合は、変更箇所の説明と理由を詳細に記載する。\n- セキュリティ上の懸念がある場合は、その旨を明記する。\n\n### 変更の粒度\n\n- できるだけ小さな変更単位でプルリクエストを作成する。\n- 大きな変更の場合は、レビュアーの理解を助けるため段階的に分割する。\n\n## レビュープロセス\n\n### レビュー依頼時\n\n- レビュアに確認して欲しい点を明確に記載する。\n- 議論が必要な点はコードコメントで明示する。\n\n### レビューフィードバック対応\n\n- レビューコメントには迅速に対応する。\n- 指摘された点は可能な限り修正する。\n- 修正が難しい場合は、その理由を説明する。\n\n## マージ前の最終確認","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/pull-request-01jpcvxfxbfm6z9tc89zm9c37d.md","loc":{"lines":{"from":1,"to":59}}}}],["286",{"pageContent":"## レビュープロセス\n\n### レビュー依頼時\n\n- レビュアに確認して欲しい点を明確に記載する。\n- 議論が必要な点はコードコメントで明示する。\n\n### レビューフィードバック対応\n\n- レビューコメントには迅速に対応する。\n- 指摘された点は可能な限り修正する。\n- 修正が難しい場合は、その理由を説明する。\n\n## マージ前の最終確認\n\n- すべてのレビューコメントが解決されている。\n- 最新のメインブランチの変更を取り込んでいる。\n- コンフリクトが解消されている。\n- CIのチェックがすべて通過している。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/pull-request-01jpcvxfxbfm6z9tc89zm9c37d.md","loc":{"lines":{"from":46,"to":64}}}}],["287",{"pageContent":"---\ndescription: 掟プロジェクトのベンチマークテストの実施方法と原則に関するガイドライン\nruleId: benchmark-01jpcvxfxe99ev6x7f60xvbk8t\ntags: [development, testing, benchmark]\naliases: [benchmark-rules]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\"]\n---\n\n# ベンチマークの掟\n\n## 基本原則\n\n- ベンチマークは実際のユースケースを反映した多様なテストデータを使用する。\n- 単純なケースから複雑なケースまで、様々な複雑さのデータを用意する。\n- 複数の実装を比較する場合は、同じ条件でベンチマークするする。\n- ベンチマーク結果は保存して、時系列での比較ができるようにする。\n- 競合となるライブラリやアプリケーションと比較ができるようにする。\n\n### データ複雑さとパフォーマンスの関係\n\n- データの複雑さが増すにつれて、パーサー間のパフォーマンス差が拡大する。\n- 単純なデータ型では差が小さいが、ネストされた複雑なデータでは大きな差が生じる。\n- 特に再帰的な構造(配列やオブジェクトのネスト)の処理で差が顕著になる。\n\n### ベンチマーク改善のポイント\n\n- **多様なテストデータ**: 単純な値から複雑なネスト構造まで、様々なケースを用意。\n- **完全なパーサー使用**: 部分的な機能ではなく、完全なパーサーを使用してベンチマーク。\n- **結果の保存**: 日時付きのファイルに結果を保存し、時系列での比較を可能に。\n- **エラー処理の考慮**: 正常系だけでなく、エラーケースのパフォーマンスも測定。\n\n## ベンチマーク実行方法\n\n実行しやすいように以下のスクリプトを作成して実行すること。\n\n```bash\n# ベンチマークの実行\n./run-benchmark.sh。\n```\n\nベンチマーク結果は言語・ツールによって変わる想定。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/testing/benchmark-01jpcvxfxe99ev6x7f60xvbk8t.md","loc":{"lines":{"from":1,"to":41}}}}],["288",{"pageContent":"---\ndescription: 掟プロジェクトにおけるユニットテストの作成と実装に関する標準的なガイドライン\nruleId: unit-01jpcvxfxd87red8vvv00mjyy4\ntags: [development, testing, unit-test]\naliases: [unit-test-rules]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\"]\n---\n\n# ユニットテストの掟\n\n## 概要\n\nユニットテストの作成と実装に関する標準的なガイドラインです。\n\n## 目的\n\n- コードの品質保証。\n- バグの早期発見。\n- リファクタリングの安全性確保。\n- 仕様の文書化。\n\n## 前提条件\n\n- 各言語の標準テストフレームワークの基本知識。\n- テスト駆動開発(TDD)の基本的な理解。\n\n## 詳細\n\n### 使用方法\n\n#### テスト構造\n\n```rust\n#[test]\nfn test_機能名_テストケース() {。\n // 準備(Arrange)\n let input = ...;。\n \n // 実行(Act)\n let result = function_under_test(input);。\n \n // 検証(Assert)\n assert_eq!(result, expected);。\n}\n```\n\n### 注意事項\n\n1. テストの独立性。\n - 各テストは他のテストに依存しない。\n - 共有状態を避ける。\n\n2. テストデータ。\n - テストデータは明示的に定義。\n - 実際のデータに近い値を使用。\n\n3. 命名規則。\n - テスト名は`test_機能名_テストケース`の形式。\n - わかりやすい説明的な名前を使用。\n\n### ベストプラクティス\n\n1. AAA(Arrange-Act-Assert)パターンの使用。\n - テストの構造を明確に。\n - 各セクションを明確に分離。\n\n2. テストケースの網羅。\n - 正常系と異常系の両方をテスト。\n - エッジケースの考慮。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/testing/unit-01jpcvxfxd87red8vvv00mjyy4.md","loc":{"lines":{"from":1,"to":69}}}}],["289",{"pageContent":"### ベストプラクティス\n\n1. AAA(Arrange-Act-Assert)パターンの使用。\n - テストの構造を明確に。\n - 各セクションを明確に分離。\n\n2. テストケースの網羅。\n - 正常系と異常系の両方をテスト。\n - エッジケースの考慮。\n\n3. テストの保守性。\n - DRYよりも読みやすさを優先。\n - ヘルパー関数の適切な使用。\n\n## トラブルシューティング\n\n- フレークテスト(不安定なテスト)への対処。\n - 非同期処理の適切な待機。\n - タイムアウトの設定。\n\n- テストのデバッグ。\n - テスト失敗時のログ出力。\n - テストコンテキストの明確な表示。\n\n## 参考情報\n\n- [[development/testing/benchmark|ベンチマークテスト]]。\n- [[development/testing/index|テスト戦略概要]]。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/testing/unit-01jpcvxfxd87red8vvv00mjyy4.md","loc":{"lines":{"from":61,"to":88}}}}],["290",{"pageContent":"---\ndescription: ユニットテストの基本原則とベストプラクティス\nruleId: unit-testing-01jpfcdnrsxk3j5vqvjgqp2f6t\ntags:\n - testing\n - development\n - quality\nglobs:\n - \"**/*.test.ts\"\n - \"**/*.spec.ts\"\n - \"**/*Test.java\"\n - \"**/*Test.scala\"\n - \"**/*_test.go\"\n - \"**/*_test.rs\"\n - \"**/*.test.py\"\n - \"**/*_test.rb\"\n---\n\n# ユニットテスト\n\nユニットテストは、ソフトウェア開発において個々のコンポーネントや関数が意図したとおり動作するかを検証する手法です。適切なユニットテストを実装すると、コードの品質を向上させ、回帰バグを早期に発見できます。\n\n## 基本原則\n\n### 1. 独立性を保つ\n\n- 各テストケースは他のテストに依存せず、独立して実行できるようにする\n- テストケース間で共有される状態を避け、外部依存関係をテストケースごとに分離することでテスト間の干渉を防ぐ\n- テストの実行順序を考慮しない設計にする\n\n### 2. 高速であること\n\n- テストは数ミリ秒から数秒以内に完了するべき\n- 外部リソース(データベース、ファイルシステム、ネットワーク)へのアクセスは最小限に抑える\n- 必要に応じてモックやスタブを活用する\n\n### 3. 再現性を確保する\n\n- テストは毎回同じ結果を返すべき(決定論的であること)\n- ランダム値や時間に依存する処理は、固定値でモック化する\n- テストデータは明示的に定義し、外部からの変更の影響を受けないようにする\n\n### 4. 自己検証性を持つ\n\n- テスト結果は自動的に成功/失敗が判定されるべき\n- 手動での確認や解釈が必要なテストは避ける\n- 明確なアサーションを使用する\n\n### 5. 網羅性を確保する\n\n- 正常系(期待通りの入力と動作)だけでなく、異常系(不正入力やエラー条件)もテストする\n- エッジケースや境界値のテストを含める\n- 複雑な分岐やパスに対しては、網羅率を高める\n\n## テスト構造","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/testing/unit-testing-01jpfcdnrsxk3j5vqvjgqp2f6t.md","loc":{"lines":{"from":1,"to":55}}}}],["291",{"pageContent":"- テスト結果は自動的に成功/失敗が判定されるべき\n- 手動での確認や解釈が必要なテストは避ける\n- 明確なアサーションを使用する\n\n### 5. 網羅性を確保する\n\n- 正常系(期待通りの入力と動作)だけでなく、異常系(不正入力やエラー条件)もテストする\n- エッジケースや境界値のテストを含める\n- 複雑な分岐やパスに対しては、網羅率を高める\n\n## テスト構造\n\n### AAA(Arrange-Act-Assert)パターン\n\nすべてのテストは以下の3つのセクションで構成することを推奨します。\n\n1. **Arrange(準備)**:テストに必要なオブジェクトやデータを初期化\n2. **Act(実行)**:テスト対象を動作させる\n3. **Assert(検証)**:期待される結果と実際の結果を比較検証。\n\n```typescript\n// TypeScriptでのAAAパターンの例\ntest('ユーザー名が正しく設定される', () => {\n // Arrange\n const user = new User();\n const expectedName = 'John Doe';\n \n // Act\n user.setName(expectedName);\n \n // Assert\n expect(user.getName()).toBe(expectedName);\n});\n```\n\n## 言語別のテストフレームワーク\n\n### Java\n\n- JUnit 5\n- TestNG\n- Mockito(モック用)\n\n### Scala\n\n- ScalaTest\n- Specs2\n- ScalaMock\n\n### TypeScript/JavaScript\n\n- Jest\n- Mocha + Chai\n- Jasmine\n- Testing Library\n\n### Rust\n\n- cargo test (標準)\n- mockall(モック用)\n\n### Go\n\n- testing パッケージ(標準)\n- testify\n- gomock\n\n### Python\n\n- pytest\n- unittest(標準)\n- mock(標準)\n\n## コードカバレッジ","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/testing/unit-testing-01jpfcdnrsxk3j5vqvjgqp2f6t.md","loc":{"lines":{"from":45,"to":118}}}}],["292",{"pageContent":"### Rust\n\n- cargo test (標準)\n- mockall(モック用)\n\n### Go\n\n- testing パッケージ(標準)\n- testify\n- gomock\n\n### Python\n\n- pytest\n- unittest(標準)\n- mock(標準)\n\n## コードカバレッジ\n\nコードカバレッジは、テストによって実行されたコードの割合を示す指標です。以下のカバレッジ目標を設定します。\n\n- **ライン(命令)カバレッジ**:80%以上\n- **ブランチ(分岐)カバレッジ**:75%以上\n- **関数カバレッジ**:90%以上\n\nただし、カバレッジの数値だけを目標にせず、テストの品質と意義を重視してください。\n\n## モックとスタブの使用\n\n### モックの適切な使用\n\n- 外部依存関係(データベース、API、ファイルシステムなど)をモック化する\n- 重い計算や時間のかかる処理をモック化して高速化する\n- 非決定的な動作(時間、乱数など)を制御可能にする\n\n### モックの過剰使用を避ける\n\n- 実装詳細と過度に結合するモックは使用しない\n- ビジネスロジック自体のモック化は最小限に留める\n- 可能な限り実際のコンポーネントを使用する\n\n## テスト駆動開発(TDD)の推奨\n\n可能な場合は、テスト駆動開発(TDD)アプローチを採用することを推奨します。\n\n1. **赤**:まず失敗するテストを書く\n2. **緑**:テストが通るための最小限のコードを実装する\n3. **リファクタリング**:コードをクリーンアップし、重複を排除する。\n\nこのサイクルを繰り返すことで、堅牢で保守性の高いコードを作成できます。\n\n## 避けるべきプラクティス\n\n- **スナップショットテストの乱用**:UI変更ごとに更新が必要になるため、過度に依存しない\n- **過度に具体的なテスト**:実装詳細ではなく動作をテストする\n- **不適切なアサーション**:曖昧な比較や包括的すぎる検証を避ける\n- **複雑なセットアップ**:テストの準備が複雑になりすぎる場合は、設計の問題を示している可能性がある\n\n## 参考","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/testing/unit-testing-01jpfcdnrsxk3j5vqvjgqp2f6t.md","loc":{"lines":{"from":101,"to":159}}}}],["293",{"pageContent":"## 避けるべきプラクティス\n\n- **スナップショットテストの乱用**:UI変更ごとに更新が必要になるため、過度に依存しない\n- **過度に具体的なテスト**:実装詳細ではなく動作をテストする\n- **不適切なアサーション**:曖昧な比較や包括的すぎる検証を避ける\n- **複雑なセットアップ**:テストの準備が複雑になりすぎる場合は、設計の問題を示している可能性がある\n\n## 参考\n\n- [Martin Fowler - Unit Testing](https://martinfowler.com/bliki/UnitTest.html)\n- [Kent Beck - Test-Driven Development By Example](https://www.amazon.com/Test-Driven-Development-Kent-Beck/dp/0321146530)\n- [Robert C. Martin - Clean Code](https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882)","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/testing/unit-testing-01jpfcdnrsxk3j5vqvjgqp2f6t.md","loc":{"lines":{"from":152,"to":163}}}}],["294",{"pageContent":"---\ndescription: テスト戦略と品質保証アプローチに関する包括的な説明\nruleId: testing-01jpcvxfxbfm6z9tc89zm9c37c\ntags:\n - development\n - testing\n - index\naliases:\n - test-strategy\nglobs:\n - '**/*_test.go'\n - '**/*.test.ts'\n - '**/*.test.js'\n - '**/*.spec.ts'\n - '**/test/**/*'\n - '**/tests/**/*'\n---\n\n\n# テスト戦略\n\n## 概要\n\n包括的なテスト戦略と品質保証アプローチについて説明します。\n\n## 目的\n\n- ソフトウェアの品質確保。\n- バグの早期発見と修正。\n- 継続的なコード品質の維持。\n- 開発速度と品質のバランス確保。\n\n## 前提条件\n\n- CI/CD環境の理解。\n- 各種テストツールの基本知識。\n- コードカバレッジの概念理解。\n\n## 詳細\n\n### テストレベル\n\n以下のテスト関連ドキュメントも参照してください:。\n\n- [ユニットテスト](testing/unit-testing-01jpfcdnrsxk3j5vqvjgqp2f6t.md)\n- [ベンチマークの掟](testing/benchmark-01jpcvxfxe99ev6x7f60xvbk8t.md)\n\n1. [ユニットテスト](testing/unit-testing-01jpfcdnrsxk3j5vqvjgqp2f6t.md)\n - 個々の関数やクラスの動作検証。\n - モックやスタブの適切な使用。\n - テストカバレッジの維持。\n\n2. 統合テスト。\n - コンポーネント間の連携確認。\n - 外部システムとの結合テスト。\n - エンドツーエンドシナリオ。\n\n3. [ベンチマークの掟](testing/benchmark-01jpcvxfxe99ev6x7f60xvbk8t.md)\n - パフォーマンス指標の測定。\n - 負荷テスト。\n - スケーラビリティ検証。\n\n### ベストプラクティス","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/testing-01jpcvxfxbfm6z9tc89zm9c37c.md","loc":{"lines":{"from":1,"to":63}}}}],["295",{"pageContent":"2. 統合テスト。\n - コンポーネント間の連携確認。\n - 外部システムとの結合テスト。\n - エンドツーエンドシナリオ。\n\n3. [ベンチマークの掟](testing/benchmark-01jpcvxfxe99ev6x7f60xvbk8t.md)\n - パフォーマンス指標の測定。\n - 負荷テスト。\n - スケーラビリティ検証。\n\n### ベストプラクティス\n\n1. テスト駆動開発(TDD)\n - テストファースト。\n - 小さな単位での実装。\n - 継続的なリファクタリング。\n\n2. 品質メトリクス。\n - コードカバレッジ80%以上。\n - 重複コードの最小化。\n - 循環的複雑度の管理。\n\n3. 自動化戦略。\n - CIパイプラインでの自動実行。\n - 定期的な回帰テスト。\n - 自動化テストレポート。\n\n## トラブルシューティング\n\n- テスト実行時の一般的な問題。\n- テストの信頼性確保。\n- パフォーマンス測定の注意点。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/testing-01jpcvxfxbfm6z9tc89zm9c37c.md","loc":{"lines":{"from":53,"to":84}}}}],["296",{"pageContent":"---\ndescription: 掟プロジェクトで使用するツールとその管理に関するルール\nruleId: tools-01jpcvxfxbfm6z9tc89zm9c37b\ntags: [tools, rules]\naliases: [tools-rules]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\"]\n---\n\n# ツールの掟\n\n## 1. 基本ツール構成\n\n### 必須ツール(すべての環境に初期インストール)\n\n- Git: バージョン管理。\n- gh (GitHub CLI): GitHub操作。\n- docker: コンテナ管理。\n- make: ビルド自動化。\n- mise: 言語・ツールバージョン管理 (<https://github.com/jdx/mise>)。\n\n### 任意ツール(必要に応じてインストール)\n\n- その他プロジェクト固有のツール。\n\n## 2. 言語別ツール構成\n\n### Scala開発環境\n\n- **必須ツール**。\n - sbt (mise経由でインストール): ビルドツール。\n- **任意ツール**。\n - scalac: 必要な場合のみインストール。\n\n### Rust開発環境\n\n- **必須ツール**。\n - cargo (rustup経由でインストール): パッケージマネージャ・ビルドツール。\n\n### Go開発環境\n\n- **必須ツール**。\n - go。\n\n### TypeScript開発環境\n\n- **必須ツール**。\n - npm (mise経由でインストール): パッケージマネージャ。\n- **任意ツール**。\n - pnpm (npm経由でインストール): 高速パッケージマネージャ。\n - yarn (npm経由でインストール): 代替パッケージマネージャ。\n\n## 3. ツールインストール階層\n\n1. システムレベル。\n - Git, gh, docker, make。\n\n2. ツールバージョン管理。\n - mise。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/tools-01jpcvxfxbfm6z9tc89zm9c37b.md","loc":{"lines":{"from":1,"to":58}}}}],["297",{"pageContent":"## 3. ツールインストール階層\n\n1. システムレベル。\n - Git, gh, docker, make。\n\n2. ツールバージョン管理。\n - mise。\n\n3. 言語・フレームワーク管理。\n - Scala: sbt (mise経由)。\n - Rust: cargo (rustup経由)。\n - TypeScript: npm (mise経由)→pnpm/yarn (npm経由)。\n\nこの構成は各言語やプロジェクトに対して一貫性を保ちながら、必要に応じた柔軟性も確保しています。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development/tools-01jpcvxfxbfm6z9tc89zm9c37b.md","loc":{"lines":{"from":52,"to":65}}}}],["298",{"pageContent":"---\ndescription: プロジェクトの開発プロセスと規約の全体像\nruleId: development-01jpcvxfxa9zn7yzy0qtmgyq95\ntags:\n - development\n - process\n - guidelines\naliases:\n - dev-guidelines\n - development-rules\nglobs:\n - '**/*'\n---\n\n\n# 開発の掟\n\n## 概要\n\nこのドキュメントは、プロジェクトにおける開発プロセス全体の指針と規約を定義します。\n各開発者は、これらの規約に従って開発を進めることが求められます。\n\n## 開発プロセス\n\n### コーディング\n\n- [コーディングの掟](development/coding-01jpcvxfxca2m945xeb4tjn95b.md) - 言語共通のコーディング規約\n - [Golangの掟](development/coding/golang-01jpcvxfxgyqe2jprh9hgn6xq7.md) - Go言語固有の規約\n - [Rustの掟](development/coding/rust-01jpcvxfxf9jafj03jk1zks31y.md) - Rust言語固有の規約\n - [Scalaの掟](development/coding/scala-01jpcvxfxf9jafj03jk1zks31x.md) - Scala言語固有の規約\n - [TypeScriptの掟](development/coding/typescript-01jpcvxfxf9jafj03jk1zks31w.md) - TypeScript固有の規約\n - [ドキュメントコメントの掟](development/coding/doc-comment-01jpcvxfxgyqe2jprh9hgn6xq8.md) - コードコメントの書き方\n\n### ドキュメント\n\n- [ドキュメント規約](development/document-01jpfcn4mphghcm0jaj3wy7b7j.md) - 開発ドキュメントの作成規約\n - API仕様書。\n - 設計ドキュメント。\n - 運用ドキュメント。\n\n### テスト","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development-01jpcvxfxa9zn7yzy0qtmgyq95.md","loc":{"lines":{"from":1,"to":41}}}}],["299",{"pageContent":"### ドキュメント\n\n- [ドキュメント規約](development/document-01jpfcn4mphghcm0jaj3wy7b7j.md) - 開発ドキュメントの作成規約\n - API仕様書。\n - 設計ドキュメント。\n - 運用ドキュメント。\n\n### テスト\n\n- [テスト戦略](development/testing-01jpcvxfxbfm6z9tc89zm9c37c.md) - テストコードの作成規約\n - [ユニットテスト](development/testing/unit-testing-01jpfcdnrsxk3j5vqvjgqp2f6t.md) - ユニットテストの作成と実行\n - [ベンチマークの掟](development/testing/benchmark-01jpcvxfxe99ev6x7f60xvbk8t.md) - パフォーマンステストの作成と実行\n\n### レビュー\n\n- [プルリクエストの掟](development/pull-request-01jpcvxfxbfm6z9tc89zm9c37d.md) - PRの作成とレビューのガイドライン\n\n## 開発フロー\n\n1. 要件定義・設計。\n - 機能要件の明確化。\n - アーキテクチャ設計。\n - インタフェース設計。\n\n2. 実装。\n - コーディング規約に従った実装。\n - 適切なドキュメント作成。\n - ユニットテストの作成。\n\n3. レビュー。\n - コードレビュー。\n - ドキュメントレビュー。\n - テストケースレビュー。\n\n4. テスト。\n - ユニットテストの実行。\n - 統合テストの実行。\n - E2Eテストの実行。\n\n5. デプロイ。\n - ステージング環境への展開。\n - 本番環境への展開。\n - 監視体制の確認。\n\n## 品質基準\n\n1. コード品質。\n - 静的解析ツールのチェックをパス。\n - テストカバレッジ基準の達成。\n - パフォーマンス要件の達成。\n\n2. ドキュメント品質。\n - 最新状態の維持。\n - 完全性と正確性。\n - 可読性と理解のしやすさ。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development-01jpcvxfxa9zn7yzy0qtmgyq95.md","loc":{"lines":{"from":34,"to":88}}}}],["300",{"pageContent":"5. デプロイ。\n - ステージング環境への展開。\n - 本番環境への展開。\n - 監視体制の確認。\n\n## 品質基準\n\n1. コード品質。\n - 静的解析ツールのチェックをパス。\n - テストカバレッジ基準の達成。\n - パフォーマンス要件の達成。\n\n2. ドキュメント品質。\n - 最新状態の維持。\n - 完全性と正確性。\n - 可読性と理解のしやすさ。\n\n3. テスト品質。\n - テストケースの網羅性。\n - テスト実行の安定性。\n - 自動化率の維持。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/development-01jpcvxfxa9zn7yzy0qtmgyq95.md","loc":{"lines":{"from":73,"to":93}}}}],["301",{"pageContent":"---\ndescription: 掟プロジェクトのタスク管理に関するルールと規約\nruleId: task-management-01jpcvxfxa9zn7yzy0qtmgyq94\ntags: [task-management, rules]\naliases: [task-management-rules]\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"]\n---\n\n\n# タスク管理の掟\n\n## GitHub Issueの利用\n\n- TODO管理はGitHub Issueを使用して行う。\n- 各Issueには適切なラベルを付与する。\n- タスクの目的、要件、受入基準を明確に記述する。\n- 関連するIssueやPull Requestへの参照を含める。\n\n## タスクの追跡\n\n- タスクの進捗状況は定期的に更新する。\n- ブロッカーや懸念事項が発生した場合は、速やかにIssueにコメントする。\n- 完了基準を満たしたことを確認してからIssueをクローズする。\n\n## ブランチ管理とIssueの関係\n\n### イシューブランチの作成\n\n- Issueに対応する作業を開始する際は、必ずIssueブランチを作成する。\n- Issueブランチは`issue-[issue番号]`の形式で作成する。\n\n### サブイシューの管理\n\n- 大きなIssueは必要に応じてサブIssueに分割する。\n- サブIssueに対応するブランチは、親となるIssueブランチから作成する。\n- サブIssueブランチは`issue-[親issue番号]-[サブissue番号]`の形式で作成する。\n- サブIssueの作業完了後は、必ず親のIssueブランチに向けてマージする。\n\n### マージの流れ\n\n- すべてのサブIssueブランチが親のIssueブランチにマージされていることを確認する。\n- CIがパスしていることを確認する。\n- 上記の条件を満たした場合のみ、Issueブランチをmainブランチにマージできる。","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/task-management-01jpcvxfxa9zn7yzy0qtmgyq94.md","loc":{"lines":{"from":1,"to":43}}}}],["302",{"pageContent":"---\ndescription: バージョン管理に関するルールと規約\nruleId: version-control-01jpcvxfx55p8nwtffy3fxgd3b\ntags: [version-control, rules]\naliases: [version-control-rules]\nglobs: [\"**/*.ts\", \"**/*.js\", \"**/*.go\", \"**/*.rs\", \"**/*.scala\", \"**/*.java\", \"**/*.py\", \"**/*.sh\"]\n---\n\n\n# バージョン管理の掟\n\n## コミットメッセージのルール\n\n- Git commitのメッセージは英語で書き、Conventional Commitsの規約に従う。\n - 例: `fix:` `feat:` `docs:` `style:` `refactor:` `test:` `chore:`\n - コミットメッセージは変更内容を明確に説明する。\n - プレフィックスは変更の種類を正確に反映する。\n\n## コミットの粒度\n\n- 1つのコミットは1つの論理的な変更を表す。\n- 複数の異なる変更は別々のコミットに分ける。\n- コミット前に`git diff`で変更内容を確認する。\n\n## Gitサブモジュール\n\nGitサブモジュールは、あるGitリポジトリ内に別のGitリポジトリを含める機能です。これにより、複数のプロジェクト間で共通のコードやドキュメントを共有できます。\n\n### サブモジュールの基本\n\n既存のリポジトリにサブモジュールとして別のリポジトリを追加するには:。\n\n```bash\n# リポジトリのルートディレクトリで実行\ngit submodule add <リポジトリURL> <サブディレクトリパス>。\n\n# 例: このドキュメントリポジトリをサブモジュールとして追加\ngit submodule add https://github.com/j5ik2o/okite-ai.git docs/okite-ai。\n\n# 変更をコミット\ngit add .gitmodules <サブディレクトリパス>。\ngit commit -m \"feat: add okite-ai documentation as submodule\"\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/version-control-01jpcvxfx55p8nwtffy3fxgd3b.md","loc":{"lines":{"from":1,"to":43}}}}],["303",{"pageContent":"# 変更をコミット\ngit add .gitmodules <サブディレクトリパス>。\ngit commit -m \"feat: add okite-ai documentation as submodule\"\n```\n\n### 具体的な使用例\n\n例えば、`github.com/j5ik2o/hoge` リポジトリに、このナレッジベースを共通ドキュメントとして `./common` ディレクトリに追加する場合:。\n\n```bash\n# j5ik2o/hoge リポジトリのルートディレクトリで実行\ngit submodule add https://github.com/j5ik2o/okite-ai.git ./common。\n\n# 変更をコミット\ngit add .gitmodules ./common。\ngit commit -m \"feat: add okite-ai knowledge base as common documentation\"\ngit push origin main。\n```\n\nこの操作により、以下のファイルが作成または更新されます:。\n\n- `.gitmodules`: サブモジュールの設定情報を保存するファイル。\n- サブモジュールのディレクトリ: 指定したパスにサブモジュールのコンテンツが配置される。\n\n### サブモジュールを含むリポジトリをクローンする\n\nサブモジュールを含むリポジトリをクローンする場合:。\n\n```bash\n# リポジトリをクローン\ngit clone <リポジトリURL>。\n\n# サブモジュールを初期化して更新\ncd <リポジトリディレクトリ>。\ngit submodule init。\ngit submodule update。\n\n# または、クローン時に一度に行う\ngit clone --recurse-submodules <リポジトリURL>。\n```\n\n### サブモジュールを更新する\n\nサブモジュールを最新の状態に更新するには:。\n\n```bash\n# 特定のサブモジュールを更新\ngit submodule update --remote <サブディレクトリパス>。\n\n# すべてのサブモジュールを更新\ngit submodule update --remote。\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/version-control-01jpcvxfx55p8nwtffy3fxgd3b.md","loc":{"lines":{"from":40,"to":91}}}}],["304",{"pageContent":"### サブモジュールを更新する\n\nサブモジュールを最新の状態に更新するには:。\n\n```bash\n# 特定のサブモジュールを更新\ngit submodule update --remote <サブディレクトリパス>。\n\n# すべてのサブモジュールを更新\ngit submodule update --remote。\n```\n\n### サブモジュール管理のベストプラクティス\n\n1. **明確なドキュメント化**: サブモジュールの目的と使用方法をREADMEに記載する\n2. **バージョン固定**: 安定したコミットハッシュを参照するようにする\n3. **更新頻度の管理**: サブモジュールの更新頻度を計画的に決める\n4. **CI/CDとの統合**: CI/CDパイプラインでサブモジュールを適切に処理する設定する\n\n```bash\n# 特定のタグやブランチを指定してサブモジュールを追加\ngit submodule add -b main <リポジトリURL> <サブディレクトリパス>。\n```\n\n### サブモジュールの削除\n\n不要になったサブモジュールを削除するには:。\n\n```bash\n# サブモジュールの登録を解除\ngit submodule deinit -f <サブディレクトリパス>。\n\n# .gitmodulesからサブモジュールの情報を削除\ngit rm -f <サブディレクトリパス>。\n\n# Gitのキャッシュからサブモジュールを削除\nrm -rf .git/modules/<サブディレクトリパス>。\n\n# 変更をコミット\ngit commit -m \"chore: remove submodule\"。\n```","metadata":{"source":"/Users/j5ik2o/Sources/unify-rag/docs/version-control-01jpcvxfx55p8nwtffy3fxgd3b.md","loc":{"lines":{"from":81,"to":121}}}}]]