import re

from errorinsight.analysis_rule import AnalysisRule, HintRule

PYTHON_ANALYSIS_RULES: list[AnalysisRule] = [
    AnalysisRule(
        keyword="modulenotfounderror",
        language_hint="Python",
        description="指定したモジュールが見つからなかった可能性があります。",
        cause_candidate="モジュール未インストール、モジュール名ミス、仮想環境違いの可能性があります。",
        check_point="import文、インストール状態、仮想環境を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"No module named '(?P<module_name>[^']+)'"),
            template="モジュール '{module_name}' が見つかりません。",
        ),
    ),
    AnalysisRule(
        keyword="traceback",
        language_hint="Python",
        description="Pythonのスタックトレース開始行です。",
        cause_candidate="実際の原因は、この後に表示される具体的な例外名にある可能性があります。",
        check_point="Tracebackの最後の方にある例外名とメッセージを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="importerror",
        language_hint="Python",
        description="モジュールや機能の読み込みに失敗した可能性があります。",
        cause_candidate="import先が存在しない、import指定ミス、循環importの可能性があります。",
        check_point="import文、モジュール名、ファイル構成を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"cannot import name '(?P<import_name>[^']+)' from '(?P<module_name>[^']+)'"
            ),
            template="importしようとした名前は '{import_name}'、import元のモジュールは '{module_name}' です。",
        ),
    ),
    AnalysisRule(
        keyword="filenotfounderror",
        language_hint="Python",
        description="指定したファイルやディレクトリが見つからなかった可能性があります。",
        cause_candidate="パス間違い、ファイル未作成、実行場所違いの可能性があります。",
        check_point="ファイルパス、カレントディレクトリ、ファイル存在有無を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"FileNotFoundError: \[Errno 2\] No such file or directory: '(?P<file_path>[^']+)'"
            ),
            template="ファイル '{file_path}' が見つかりません。",
        ),
    ),
    AnalysisRule(
        keyword="permissionerror",
        language_hint="Python",
        description="操作に必要な権限が不足している可能性があります。",
        cause_candidate="ファイル権限不足、管理者権限不足、使用中ファイル操作の可能性があります。",
        check_point="対象パス、実行権限、ファイル使用状況を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"PermissionError: \[Errno \d+\] Permission denied: '(?P<file_path>[^']+)'"
            ),
            template="ファイル '{file_path}' へのアクセス権限がありません。",
        ),
    ),
    AnalysisRule(
        keyword="valueerror",
        language_hint="Python",
        description="型は正しいが値の内容が不正可能性があります。",
        cause_candidate="不正な値入力、変換失敗、範囲外値の可能性があります。",
        check_point="入力値、変換処理、関数引数を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"ValueError: (?P<error_message>.+)"),
            template="エラー内容は '{error_message}' です。",
        ),
    ),
    AnalysisRule(
        keyword="typeerror",
        language_hint="Python",
        description="対応していない型の操作を実行した可能性があります。",
        cause_candidate="型違い、引数型不一致、None使用の可能性があります。",
        check_point="変数型、関数引数、演算対象を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"TypeError: (?P<error_message>.+)"),
            template="エラー内容は '{error_message}' です。",
        ),
    ),
    AnalysisRule(
        keyword="attributeerror",
        language_hint="Python",
        description="存在しない機能や値を使おうとした可能性があります。",
        cause_candidate="メソッド名や属性名の間違い、None参照、型違いの可能性があります。",
        check_point="対象オブジェクトの型、属性名・メソッド名、Noneになっていないかを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"'(?P<object_type>[^']+)' object has no attribute '(?P<attribute_name>[^']+)'"
            ),
            template="対象の型は '{object_type}'、存在しない属性またはメソッド名は '{attribute_name}' です。型と属性名・メソッド名を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="nameerror",
        language_hint="Python",
        description="存在しない名前を参照した可能性があります。",
        cause_candidate="変数名間違い、定義前参照、import不足の可能性があります。",
        check_point="変数名、定義箇所、import文を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"NameError: name '(?P<name>[^']+)' is not defined"),
            template="変数 '{name}' は定義されていません。",
        ),
    ),
    AnalysisRule(
        keyword="indexerror",
        language_hint="Python",
        description="存在しない位置を参照した可能性があります。",
        cause_candidate="index範囲外アクセス、要素数不足の可能性があります。",
        check_point="index値、配列やリストの要素数を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"IndexError: list index out of range"),
            template="リストの範囲外にアクセスしています。",
        ),
    ),
    AnalysisRule(
        keyword="keyerror",
        language_hint="Python",
        description="存在しないキーを参照した可能性があります。",
        cause_candidate="キー名間違い、データ未登録の可能性があります。",
        check_point="キー名、dict内容を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"KeyError: '(?P<key>[^']+)'"),
            template="キー '{key}' は存在しません。",
        ),
    ),
    AnalysisRule(
        keyword="zerodivisionerror",
        language_hint="Python",
        description="0で割る計算を実行した可能性があります。",
        cause_candidate="除数が0、計算前チェック不足の可能性があります。",
        check_point="割り算処理、除数の値を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="syntaxerror",
        language_hint="Python",
        description="Python文法が正しくない可能性があります。",
        cause_candidate="括弧閉じ忘れ、コロン不足、文法ミスの可能性があります。",
        check_point="エラー行番号、エラー付近のコード、括弧や記号を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="indentationerror",
        language_hint="Python",
        description="インデントの位置や深さが正しくない可能性があります。",
        cause_candidate="インデント不足、インデントずれ、空白数不一致の可能性があります。",
        check_point="エラー行番号、前後行のインデント、空白数を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="taberror",
        language_hint="Python",
        description="タブとスペースが混在している可能性があります。",
        cause_candidate="tab混在、space混在の可能性があります。",
        check_point="インデント文字、tab/space設定を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="recursionerror",
        language_hint="Python",
        description="関数呼び出しが深くなりすぎた可能性があります。",
        cause_candidate="無限再帰、終了条件不足の可能性があります。",
        check_point="再帰処理、終了条件、関数呼び出し回数を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="runtimeerror",
        language_hint="Python",
        description="実行中に処理異常が発生した可能性があります。",
        cause_candidate="実行状態異常、不正な処理順序、内部処理失敗の可能性があります。",
        check_point="エラー直前の処理、実行状態、詳細メッセージを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"RuntimeError: (?P<error_message>.+)"),
            template="エラー内容は '{error_message}' です。",
        ),
    ),
    AnalysisRule(
        keyword="timeouterror",
        language_hint="Python",
        description="処理時間が制限時間を超過した可能性があります。",
        cause_candidate="通信遅延、長時間処理、接続待機の可能性があります。",
        check_point="タイムアウト設定、通信先状態、処理時間を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="connectionrefusederror",
        language_hint="Python",
        description="接続先に接続を拒否された可能性があります。",
        cause_candidate="サーバ未起動、ポート間違い、接続制限の可能性があります。",
        check_point="接続先ポート、サーバ起動状態、接続先設定を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="connectionerror",
        language_hint="Python",
        description="通信接続処理に失敗した可能性があります。",
        cause_candidate="ネットワーク接続失敗、サーバ未接続、通信異常の可能性があります。",
        check_point="接続先URL、ネットワーク状態、サーバ起動状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="oserror",
        language_hint="Python",
        description="OS関連処理で問題が発生した可能性があります。",
        cause_candidate="ファイル操作失敗、権限不足、パス問題の可能性があります。",
        check_point="ファイルパス、権限、実行環境を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"OSError: \[Errno (?P<errno>\d+)\] (?P<error_message>.+)"
            ),
            template="エラー番号は {errno}、エラー内容は '{error_message}' です。",
        ),
    ),
    AnalysisRule(
        keyword="arithmeticerror",
        language_hint="Python",
        description="計算処理中に問題が発生した可能性があります。",
        cause_candidate="数値計算処理の異常、演算処理失敗の可能性があります。",
        check_point="実行している計算処理、関連する数値入力を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="assertionerror",
        language_hint="Python",
        description="条件検証が未達成となった可能性があります。",
        cause_candidate="想定条件を満たしていない、テスト条件失敗の可能性があります。",
        check_point="assert 文の条件式、入力値や状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="baseexception",
        language_hint="Python",
        description="Pythonで例外処理に関係するエラーが発生している可能性があります。",
        cause_candidate="BaseExceptionを直接使用している、例外捕捉範囲が広すぎるの可能性があります。",
        check_point="except BaseException を使っていないか、独自例外の継承元を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="blockingioerror",
        language_hint="Python",
        description="IO処理がブロック状態となった可能性があります。",
        cause_candidate="非同期IO待機、ソケット通信待ちの可能性があります。",
        check_point="IO処理内容、非同期処理設定を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="brokenpipeerror",
        language_hint="Python",
        description="通信先との接続が途中で切断された可能性があります。",
        cause_candidate="接続先終了、パイプ通信切断、ソケット切断の可能性があります。",
        check_point="通信先状態、パイプ処理内容、ソケット状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="buffererror",
        language_hint="Python",
        description="メモリやデータ保存領域の操作中に問題が発生した可能性があります。",
        cause_candidate="使用中バッファへの不正操作、メモリ操作失敗の可能性があります。",
        check_point="バッファ使用箇所、メモリ関連処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="byteswarning",
        language_hint="Python",
        description="bytes型と文字列型の扱いで注意が必要な状態可能性があります。",
        cause_candidate="bytes/str混在、型変換不足の可能性があります。",
        check_point="bytes型使用箇所、encode/decode処理を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"BytesWarning: (?P<warning_message>.+)"),
            template="警告内容は '{warning_message}' です。",
        ),
    ),
    AnalysisRule(
        keyword="childprocesserror",
        language_hint="Python",
        description="子プロセス操作中に問題が発生した可能性があります。",
        cause_candidate="subprocess処理失敗、子プロセス状態異常の可能性があります。",
        check_point="subprocess実行内容、プロセス状態を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"ChildProcessError: (?P<error_message>.+)"),
            template="エラー内容は '{error_message}' です。",
        ),
    ),
    AnalysisRule(
        keyword="connectionabortederror",
        language_hint="Python",
        description="通信接続が途中で中断された可能性があります。",
        cause_candidate="通信中断、接続先異常終了、ネットワーク異常の可能性があります。",
        check_point="接続先状態、通信状況、ネットワーク状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="connectionreseterror",
        language_hint="Python",
        description="通信接続が強制的に切断された可能性があります。",
        cause_candidate="接続先切断、ネットワーク異常、タイムアウトの可能性があります。",
        check_point="通信先状態、ネットワーク状態、通信タイミングを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="deprecationwarning",
        language_hint="Python",
        description="将来削除予定の機能を使用している可能性があります。",
        cause_candidate="非推奨API使用、古い実装使用の可能性があります。",
        check_point="使用API、推奨代替方法、ライブラリバージョンを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"DeprecationWarning: (?P<warning_message>.+)"),
            template="警告内容は '{warning_message}' です。",
        ),
    ),
    AnalysisRule(
        keyword="eoferror",
        language_hint="Python",
        description="入力データが途中で終了した可能性があります。",
        cause_candidate="input待機中に入力終了した、読み込みデータ不足の可能性があります。",
        check_point="input使用箇所、ファイルや標準入力の内容を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="fileexistserror",
        language_hint="Python",
        description="既に存在するファイルやディレクトリを作成しようとした可能性があります。",
        cause_candidate="同名ファイル存在、同名ディレクトリ存在の可能性があります。",
        check_point="対象パス、既存ファイル有無を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"FileExistsError: \[Errno 17\] File exists: '(?P<file_path>[^']+)'"
            ),
            template="ファイル '{file_path}' は既に存在しています。",
        ),
    ),
    AnalysisRule(
        keyword="floatingpointerror",
        language_hint="Python",
        description="小数計算処理中に問題が発生した可能性があります。",
        cause_candidate="不正な数値演算、浮動小数点演算異常の可能性があります。",
        check_point="実行している計算処理、使用している数値を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="futurewarning",
        language_hint="Python",
        description="将来のバージョンで動作変更予定の処理を使用している可能性があります。",
        cause_candidate="将来仕様変更、非推奨予定機能の可能性があります。",
        check_point="warning対象API、バージョン変更内容を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"FutureWarning: (?P<warning_message>.+)"),
            template="警告内容は '{warning_message}' です。",
        ),
    ),
    AnalysisRule(
        keyword="generatorexit",
        language_hint="Python",
        description="ジェネレーター処理が終了された可能性があります。",
        cause_candidate="generator終了処理、close呼び出しの可能性があります。",
        check_point="generator使用箇所、close処理の有無を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="importwarning",
        language_hint="Python",
        description="モジュール読み込み処理で注意が必要な状態可能性があります。",
        cause_candidate="import構成問題、読み込み順問題の可能性があります。",
        check_point="import文、モジュール構成を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"ImportWarning: (?P<warning_message>.+)"),
            template="警告内容は '{warning_message}' です。",
        ),
    ),
    AnalysisRule(
        keyword="interruptederror",
        language_hint="Python",
        description="処理中にシステム割り込みが発生した可能性があります。",
        cause_candidate="シグナル割り込み、外部中断の可能性があります。",
        check_point="実行中処理、OSや外部操作を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="isadirectoryerror",
        language_hint="Python",
        description="ファイルとしてディレクトリを操作しようとした可能性があります。",
        cause_candidate="パス指定間違い、ファイル/ディレクトリ判定ミスの可能性があります。",
        check_point="対象パス、ファイル種別を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"IsADirectoryError: \[Errno 21\] Is a directory: '(?P<file_path>[^']+)'"
            ),
            template="パス '{file_path}' はディレクトリです。",
        ),
    ),
    AnalysisRule(
        keyword="keyboardinterrupt",
        language_hint="Python",
        description="キーボード操作で処理が中断された可能性があります。",
        cause_candidate="Ctrl+Cによる停止、手動中断の可能性があります。",
        check_point="実行中の処理内容、中断操作の有無を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="lookuperror",
        language_hint="Python",
        description="指定したキーや位置の取得に失敗した可能性があります。",
        cause_candidate="存在しないキー参照、存在しないindex参照の可能性があります。",
        check_point="キー名、index値、対象データの内容を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="memoryerror",
        language_hint="Python",
        description="使用可能なメモリが不足した可能性があります。",
        cause_candidate="大量データ読み込み、無限データ生成、メモリ使用量増加の可能性があります。",
        check_point="使用データ量、ループ処理、メモリ使用状況を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="notadirectoryerror",
        language_hint="Python",
        description="ディレクトリとして存在しないパスを操作しようとした可能性があります。",
        cause_candidate="パス指定間違い、ファイルをディレクトリ扱いしているの可能性があります。",
        check_point="対象パス、ファイル種別を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"NotADirectoryError: \[Errno 20\] Not a directory: '(?P<file_path>[^']+)'"
            ),
            template="パス '{file_path}' はディレクトリではありません。",
        ),
    ),
    AnalysisRule(
        keyword="notimplementederror",
        language_hint="Python",
        description="未実装の処理が呼び出された可能性があります。",
        cause_candidate="未実装メソッド呼び出し、抽象処理未対応の可能性があります。",
        check_point="呼び出しメソッド、raise NotImplementedError 箇所を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="overflowerror",
        language_hint="Python",
        description="扱える範囲を超える数値を処理しようとした可能性があります。",
        cause_candidate="大きすぎる数値、計算結果異常の可能性があります。",
        check_point="使用している数値、計算処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="pendingdeprecationwarning",
        language_hint="Python",
        description="将来的に非推奨予定の機能を使用している可能性があります。",
        cause_candidate="将来廃止予定機能使用、古い実装使用の可能性があります。",
        check_point="使用API、今後の変更予定、ライブラリ更新情報を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"PendingDeprecationWarning: (?P<warning_message>.+)"),
            template="警告内容は '{warning_message}' です",
        ),
    ),
    AnalysisRule(
        keyword="processlookuperror",
        language_hint="Python",
        description="指定したプロセスが見つからなかった可能性があります。",
        cause_candidate="プロセス終了済み、PID間違いの可能性があります。",
        check_point="PID、プロセス状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="referenceerror",
        language_hint="Python",
        description="既に削除された参照先へアクセスした可能性があります。",
        cause_candidate="weakref参照切れ、オブジェクト解放後アクセスの可能性があります。",
        check_point="weakref使用箇所、オブジェクト寿命を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="resourcewarning",
        language_hint="Python",
        description="ファイルや通信などのリソースが適切に解放されていない可能性があります。",
        cause_candidate="close忘れ、with未使用、ソケット未解放の可能性があります。",
        check_point="ファイル操作、close処理、with文使用有無を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"name='(?P<resource_name>[^']+)'"),
            template="閉じられていない可能性があるリソースは '{resource_name}' です。with文を使うか、処理後にcloseしているかを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="runtimewarning",
        language_hint="Python",
        description="実行中に注意が必要な状態が発生した可能性があります。",
        cause_candidate="不正計算、リソース異常、実行時問題の可能性があります。",
        check_point="warning発生箇所、実行中処理を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"RuntimeWarning: (?P<warning_message>.+)"),
            template="警告内容は '{warning_message}' です。",
        ),
    ),
    AnalysisRule(
        keyword="stopasynciteration",
        language_hint="Python",
        description="非同期繰り返し処理の要素取得が終了した可能性があります。",
        cause_candidate="async iterator終了、async next取得終了の可能性があります。",
        check_point="async iterator使用箇所、async for処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="stopiteration",
        language_hint="Python",
        description="繰り返し処理の要素取得が終了した可能性があります。",
        cause_candidate="iterator終了、next取得終了の可能性があります。",
        check_point="iterator使用箇所、next呼び出し箇所を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="syntaxwarning",
        language_hint="Python",
        description="文法的に問題のある記述が含まれている可能性があります。",
        cause_candidate="曖昧な文法、非推奨構文の可能性があります。",
        check_point="warning対象コード、文法記述を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"SyntaxWarning: (?P<warning_message>.+)"),
            template="警告内容は '{warning_message}' です。",
        ),
    ),
    AnalysisRule(
        keyword="systemexit",
        language_hint="Python",
        description="プログラム終了処理が実行された可能性があります。",
        cause_candidate="sys.exit呼び出し、強制終了処理の可能性があります。",
        check_point="sys.exit使用箇所、終了コードを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"SystemExit: (?P<exit_code>\d+)"),
            template="終了コードは '{exit_code}' です。sys.exitに渡している値や、異常終了として扱っている条件を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="unboundlocalerror",
        language_hint="Python",
        description="値が設定される前のローカル変数を参照した可能性があります。",
        cause_candidate="変数代入前参照、スコープ問題の可能性があります。",
        check_point="変数の代入位置、local変数の使用箇所を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"cannot access local variable '(?P<variable_name>[^']+)' where it is not associated with a value"
            ),
            template="値が入る前に参照されている可能性があるローカル変数は '{variable_name}' です。条件分岐の中だけで代入していないか、global/nonlocalが必要な変数ではないかを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="unicodedecodeerror",
        language_hint="Python",
        description="文字列の読み込み変換に失敗した可能性があります。",
        cause_candidate="文字コード違い、不正バイト列の可能性があります。",
        check_point="ファイル文字コード、decode設定、入力データを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"'(?P<encoding>[^']+)' codec can't decode byte (?P<byte_value>0x[0-9a-fA-F]+)"
            ),
            template="使用している文字コードは '{encoding}'、読み取れなかったバイト値は '{byte_value}' です。ファイルの文字コードとopen時のencoding指定が合っているかを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="unicodeencodeerror",
        language_hint="Python",
        description="文字列の保存変換に失敗した可能性があります。",
        cause_candidate="文字コード未対応、不正文字列の可能性があります。",
        check_point="encode設定、保存先文字コード、対象文字列を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"'(?P<encoding>[^']+)' codec can't encode character '(?P<character>[^']+)'"
            ),
            template="使用している文字コードは '{encoding}'、変換できなかった文字は '{character}' です。出力先の文字コードやencoding指定が、その文字を扱えるか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="unicodeerror",
        language_hint="Python",
        description="文字コード処理に失敗した可能性があります。",
        cause_candidate="文字コード不一致、不正文字列の可能性があります。",
        check_point="文字コード設定、入出力データを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="unicodetranslateerror",
        language_hint="Python",
        description="文字列変換処理に失敗した可能性があります。",
        cause_candidate="変換対象未対応、不正文字列の可能性があります。",
        check_point="translate処理、対象文字列、文字コード設定を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"can't translate character '(?P<character>[^']+)'"),
            template="変換できなかった文字は '{character}' です。文字変換テーブルやtranslate処理で、その文字に対応する変換先が定義されているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="unicodewarning",
        language_hint="Python",
        description="文字コード処理で注意が必要な状態可能性があります。",
        cause_candidate="文字コード不一致、変換設定問題の可能性があります。",
        check_point="文字コード設定、入出力データを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"UnicodeWarning: (?P<warning_message>.+)"),
            template="警告内容は '{warning_message}' です。文字コード設定や変換処理を見直してください。",
        ),
    ),
    AnalysisRule(
        keyword="userwarning",
        language_hint="Python",
        description="ユーザー定義の警告が発生した可能性があります。",
        cause_candidate="warnings.warn呼び出し、独自警告処理の可能性があります。",
        check_point="warnings.warn使用箇所、警告内容を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"UserWarning: (?P<warning_message>.+)"),
            template="警告内容は '{warning_message}' です。warnings.warnを呼び出している箇所と、その警告内容を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="warning",
        language_hint="Python",
        description="処理は継続されたが注意が必要な状態可能性があります。",
        cause_candidate="非推奨処理、実行時注意、将来的な問題の可能性があります。",
        check_point="warning内容、対象処理を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"Warning: (?P<warning_message>.+)"),
            template="警告内容は '{warning_message}' です ",
        ),
    ),
    AnalysisRule(
        keyword="systemerror",
        language_hint="Python",
        description="Python内部処理で異常が発生した可能性があります。",
        cause_candidate="Python内部異常、拡張ライブラリ異常、実行環境問題の可能性があります。",
        check_point="実行環境、使用ライブラリ、Pythonバージョンを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"SystemError: (?P<error_message>.+)"),
            template="エラー内容は '{error_message}' です。Pythonの内部処理や拡張ライブラリの問題の可能性があります。",
        ),
    ),
    AnalysisRule(
        keyword="exception",
        language_hint="Python",
        description="Python実行中にエラーが発生して処理が止まった可能性があります。",
        cause_candidate="実行中に想定外の処理が発生した、例外処理されていないエラーが発生したの可能性があります。",
        check_point="Exceptionの後に表示されている詳細メッセージ、tracebackの発生箇所、発生している例外クラス名を確認してください。",
        hint_rule=None,
    ),
]


JAVA_ANALYSIS_RULES: list[AnalysisRule] = [
    AnalysisRule(
        keyword="nullpointerexception",
        language_hint="Java",
        description="null状態の値を操作しようとした可能性があります。",
        cause_candidate="初期化不足、null代入、取得失敗の可能性があります。",
        check_point="null対象変数、初期化処理、戻り値を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r'Cannot invoke "(?P<method_name>[^"]+)" because "(?P<variable_name>[^"]+)" is null'
            ),
            template="nullの可能性がある変数は '{variable_name}'、呼び出そうとしたメソッドは '{method_name}' です。変数に値が入っているか、呼び出し前にnullチェックが必要かを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="filenotfoundexception",
        language_hint="Java",
        description="指定したファイルが見つからなかった可能性があります。",
        cause_candidate="パス間違い、ファイル未作成、実行場所違いの可能性があります。",
        check_point="ファイルパス、カレントディレクトリ、ファイル存在有無を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"FileNotFoundException: (?P<file_path>.+?)(?: \(|$)"),
            template="見つからなかった可能性があるファイルは '{file_path}' です。ファイルの場所、ファイル名、実行時のカレントディレクトリを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="classnotfoundexception",
        language_hint="Java",
        description="指定したクラスが見つからなかった可能性があります。",
        cause_candidate="classpath不足、jar不足、クラス名間違いの可能性があります。",
        check_point="classpath、クラス名、jar配置を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"ClassNotFoundException: (?P<class_name>[A-Za-z0-9_.$]+)"
            ),
            template="見つからなかったクラスは '{class_name}' です。クラス名、パッケージ名、依存関係、ビルド後のクラスパスに含まれているかを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="illegalargumentexception",
        language_hint="Java",
        description="メソッドに不正な値を渡した可能性があります。",
        cause_candidate="引数値不正、範囲外値、null渡しの可能性があります。",
        check_point="メソッド引数、入力値、バリデーションを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"IllegalArgumentException: (?P<message>.+)"),
            template="エラー本文の詳細は '{message}' です。メソッドに渡している引数の値、範囲、形式、null不可条件を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="numberformatexception",
        language_hint="Java",
        description="数値へ変換できない文字列を処理した可能性があります。",
        cause_candidate="数値形式不正、空文字、不正文字列の可能性があります。",
        check_point="入力文字列、parse処理、数値形式を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r'For input string: "(?P<input_value>[^"]+)"'),
            template="数値に変換できなかった文字列は '{input_value}' です。空文字、数値以外の文字、全角数字、カンマなどが混ざっていないか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="indexoutofboundsexception",
        language_hint="Java",
        description="存在しない位置を参照した可能性があります。",
        cause_candidate="index範囲外、要素数不足の可能性があります。",
        check_point="index値、配列やListサイズを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Index (?P<index>\d+) out of bounds for length (?P<length>\d+)"
            ),
            template="指定したインデックスは '{index}'、要素数は '{length}' です。参照している位置が0以上かつ要素数未満になっているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="arrayindexoutofboundsexception",
        language_hint="Java",
        description="配列の存在しない位置を参照した可能性があります。",
        cause_candidate="配列index範囲外、ループ条件不正の可能性があります。",
        check_point="index値、配列サイズ、ループ条件を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Index (?P<index>\d+) out of bounds for length (?P<length>\d+)"
            ),
            template="指定した配列インデックスは '{index}'、配列の長さは '{length}' です。配列の参照位置が0以上かつ配列長未満になっているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="stringindexoutofboundsexception",
        language_hint="Java",
        description="文字列の存在しない位置を参照した可能性があります。",
        cause_candidate="substring範囲不正、charAt範囲外の可能性があります。",
        check_point="index値、文字列長、substring条件を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Index (?P<index>\d+) out of bounds for length (?P<length>\d+)"
            ),
            template="指定した文字位置は '{index}'、文字列の長さは '{length}' です。charAt、substring、文字列切り出しの開始位置・終了位置が範囲内か確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="classcastexception",
        language_hint="Java",
        description="対応していない型へ変換しようとした可能性があります。",
        cause_candidate="castミス、型確認不足の可能性があります。",
        check_point="cast処理、元の型、変換先型を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"class (?P<source_type>[A-Za-z0-9_.$]+) cannot be cast to class (?P<target_type>[A-Za-z0-9_.$]+)"
            ),
            template="実際の型は '{source_type}'、変換しようとした型は '{target_type}' です。キャスト前のオブジェクトの型、ジェネリクス、instanceofによる確認を見直してください。",
        ),
    ),
    AnalysisRule(
        keyword="illegalstateexception",
        language_hint="Java",
        description="現在の状態では実行できない処理を呼び出した可能性があります。",
        cause_candidate="実行順序不正、状態管理不備、初期化不足の可能性があります。",
        check_point="実行順序、オブジェクト状態、初期化処理を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"IllegalStateException: (?P<message>.+)"),
            template="エラー本文の詳細は '{message}' です。処理を呼び出す順番、現在の状態、初期化済みかどうかを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="ioexception",
        language_hint="Java",
        description="ファイルや通信などの入出力処理に失敗した可能性があります。",
        cause_candidate="ファイル未存在、権限不足、通信異常の可能性があります。",
        check_point="ファイルパス、通信先、実行環境を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="sqlexception",
        language_hint="Java",
        description="SQL処理中に問題が発生した可能性があります。",
        cause_candidate="SQL文誤り、DB接続失敗、制約違反の可能性があります。",
        check_point="SQL文、DB接続状態、SQLStateを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="timeoutexception",
        language_hint="Java",
        description="処理が制限時間内に完了しなかった可能性があります。",
        cause_candidate="長時間処理、通信遅延、thread待機の可能性があります。",
        check_point="timeout設定、処理時間、実行状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="unsupportedoperationexception",
        language_hint="Java",
        description="対応していない操作を実行しようとした可能性があります。",
        cause_candidate="immutable操作、未実装処理、制限機能呼び出しの可能性があります。",
        check_point="実行メソッド、コレクション種別、実装内容を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="nosuchmethodexception",
        language_hint="Java",
        description="指定したメソッドが見つからなかった可能性があります。",
        cause_candidate="メソッド名間違い、引数不一致、reflection取得失敗の可能性があります。",
        check_point="メソッド名、引数型、reflection使用箇所を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"NoSuchMethodException: (?P<method_signature>[A-Za-z0-9_.$(),\s]+)"
            ),
            template="見つからなかったメソッドは '{method_signature}' です。メソッド名、引数の型、アクセス修飾子、実行時に読み込まれているクラスのバージョンを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="nosuchfieldexception",
        language_hint="Java",
        description="指定したフィールドが見つからなかった可能性があります。",
        cause_candidate="フィールド名間違い、reflection取得失敗の可能性があります。",
        check_point="フィールド名、reflection使用箇所、クラス定義を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"NoSuchFieldException: (?P<field_name>[A-Za-z0-9_.$]+)"
            ),
            template="見つからなかったフィールドは '{field_name}' です。フィールド名、アクセス修飾子、実行時に読み込まれているクラスのバージョンを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="abstractmethoderror",
        language_hint="Java",
        description="実装されていないメソッドを呼び出した可能性があります。",
        cause_candidate="実装不足、ライブラリ不整合、interface変更の可能性があります。",
        check_point="実装クラス、override有無、ライブラリバージョンを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"AbstractMethodError: (?P<message>.+)"),
            template="エラー本文の詳細は '{message}' です。実装クラスが必要なメソッドを実装しているか、依存ライブラリのバージョン不一致がないか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="arithmeticexception",
        language_hint="Java",
        description="計算処理中に問題が発生した可能性があります。",
        cause_candidate="0除算、不正な数値演算の可能性があります。",
        check_point="計算式、数値内容を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="arraystoreexception",
        language_hint="Java",
        description="配列に対応していない型を格納しようとした可能性があります。",
        cause_candidate="型不一致、Object配列誤使用の可能性があります。",
        check_point="配列型、格納データ型を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"ArrayStoreException: (?P<message>.+)"),
            template="エラー本文の詳細は '{message}' です。配列に入れようとしている値の型と、配列が受け入れられる型が一致しているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="assertionerror",
        language_hint="Java",
        description="条件検証が未達成となった可能性があります。",
        cause_candidate="assert条件失敗、想定外データの可能性があります。",
        check_point="assert条件、入力値、実行状態を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"AssertionError: (?P<message>.+)"),
            template="assertionの失敗メッセージは '{message}' です。期待値と実際の値、テスト条件、assertしている前提が正しいか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="bootstrapmethoderror",
        language_hint="Java",
        description="ラムダ式や動的処理の初期化に失敗した可能性があります。",
        cause_candidate="ライブラリ不整合、JVM互換問題、bytecode異常の可能性があります。",
        check_point="Javaバージョン、使用ライブラリ、ラムダ式使用箇所を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="cancellationexception",
        language_hint="Java",
        description="実行中の処理がキャンセルされた可能性があります。",
        cause_candidate="Future.cancel実行、task中断の可能性があります。",
        check_point="cancel呼び出し、task状態、thread状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="charconversionexception",
        language_hint="Java",
        description="文字コード変換に失敗した可能性があります。",
        cause_candidate="文字コード不一致、不正文字列の可能性があります。",
        check_point="文字コード設定、入出力データ、encode/decode処理を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"CharConversionException: (?P<message>.+)"),
            template="文字変換エラーの詳細は '{message}' です。入力データの文字コード、読み込み時のencoding指定、変換できない文字が含まれていないか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="classcircularityerror",
        language_hint="Java",
        description="クラス同士が循環参照して読み込みに失敗した可能性があります。",
        cause_candidate="循環依存、クラス設計問題の可能性があります。",
        check_point="参照関係、import構成、継承構造を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"ClassCircularityError: (?P<class_name>[A-Za-z0-9_.$]+)"
            ),
            template="循環参照している可能性があるクラスは '{class_name}' です。継承関係、内部クラス、クラス生成処理、依存関係の循環を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="classformaterror",
        language_hint="Java",
        description="classファイル形式が不正可能性があります。",
        cause_candidate="class破損、bytecode異常、不正ビルドの可能性があります。",
        check_point="classファイル、build結果、ライブラリを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="clonenotsupportedexception",
        language_hint="Java",
        description="clone未対応オブジェクトを複製しようとした可能性があります。",
        cause_candidate="Cloneable未実装、clone制限の可能性があります。",
        check_point="Cloneable実装有無、clone呼び出し箇所を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"CloneNotSupportedException: (?P<message>.+)"),
            template="clone失敗の詳細は '{message}' です。対象クラスがCloneableを実装しているか、cloneメソッドの実装やアクセス修飾子を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="completionexception",
        language_hint="Java",
        description="CompletableFuture処理内で例外が発生した可能性があります。",
        cause_candidate="非同期処理失敗、CompletableFuture内部例外の可能性があります。",
        check_point="原因例外、CompletableFuture処理、非同期処理内容を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"CompletionException: (?P<cause_exception>[A-Za-z0-9_.$]+)(?:: (?P<message>.+))?"
            ),
            template="非同期処理内で発生した可能性がある例外は '{cause_exception}' です。CompletableFuture内の処理、例外の原因、join/getで包まれた元の例外を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="concurrentmodificationexception",
        language_hint="Java",
        description="繰り返し処理中のコレクションを変更した可能性があります。",
        cause_candidate="foreach中remove/add、iterator誤使用の可能性があります。",
        check_point="collection操作、loop処理、iterator使用箇所を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="emptystackexception",
        language_hint="Java",
        description="空のStackから値を取得しようとした可能性があります。",
        cause_candidate="pop過剰実行、stack未格納の可能性があります。",
        check_point="stackサイズ、push/pop回数を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="enumconstantnotpresentexception",
        language_hint="Java",
        description="存在しないEnum定数を参照した可能性があります。",
        cause_candidate="Enum値間違い、Enum変更の可能性があります。",
        check_point="Enum定数名、Enum定義を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"EnumConstantNotPresentException: (?P<enum_path>[A-Za-z0-9_.$]+)"
            ),
            template="見つからなかった可能性があるenum定数は '{enum_path}' です。enum定数名のスペル、定義有無、実行時に読み込まれているクラスのバージョンを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="eofexception",
        language_hint="Java",
        description="読み込みデータが途中で終了した可能性があります。",
        cause_candidate="データ不足、ファイル終端到達の可能性があります。",
        check_point="読み込みデータ、ファイル内容、読み込み回数を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="exceptionininitializererror",
        language_hint="Java",
        description="クラス初期化処理中に例外が発生した可能性があります。",
        cause_candidate="static初期化失敗、初期値設定異常の可能性があります。",
        check_point="staticブロック、初期化処理、原因例外を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="executionexception",
        language_hint="Java",
        description="非同期処理内部で例外が発生した可能性があります。",
        cause_candidate="Future処理失敗、thread内例外、非同期処理異常の可能性があります。",
        check_point="原因例外、Future処理、thread処理を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"ExecutionException: (?P<cause_exception>[A-Za-z0-9_.$]+)(?:: (?P<message>.+))?"
            ),
            template="非同期処理やFuture内で発生した可能性がある例外は '{cause_exception}' です。Futureの中の処理、getで包まれた元の例外、スタックトレース下部の原因を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="illegalaccesserror",
        language_hint="Java",
        description="アクセス権限のない要素へアクセスした可能性があります。",
        cause_candidate="privateアクセス、visibility変更、module制限の可能性があります。",
        check_point="access modifier、module設定、呼び出し元クラスを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"IllegalAccessError: (?P<message>.+)"),
            template="アクセス違反の詳細は '{message}' です。アクセス修飾子、package/moduleの境界、コンパイル時と実行時のクラスやライブラリのバージョン差分を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="illegalaccessexception",
        language_hint="Java",
        description="アクセス権限のない要素へアクセスしようとした可能性があります。",
        cause_candidate="privateアクセス、reflection制限、access modifier問題の可能性があります。",
        check_point="access modifier、reflection使用箇所、対象クラスを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"IllegalAccessException: (?P<message>.+)"),
            template="アクセスできなかった詳細は '{message}' です。対象のメソッドやフィールドのアクセス修飾子、リフレクション時のsetAccessible、moduleの公開設定を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="illegalmonitorstateexception",
        language_hint="Java",
        description="synchronized管理外で待機や通知を実行した可能性があります。",
        cause_candidate="wait誤使用、notify誤使用、synchronized不足の可能性があります。",
        check_point="synchronizedブロック、wait/notify使用箇所を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="illegalthreadstateexception",
        language_hint="Java",
        description="スレッド状態が不正なまま操作された可能性があります。",
        cause_candidate="start重複実行、終了済みthread操作の可能性があります。",
        check_point="thread状態、start呼び出し箇所を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="incompatibleclasschangeerror",
        language_hint="Java",
        description="クラス構造変更により互換性が失われた可能性があります。",
        cause_candidate="メソッド変更、フィールド変更、ライブラリ更新不整合の可能性があります。",
        check_point="ライブラリバージョン、class変更内容、build状態を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"IncompatibleClassChangeError: (?P<message>.+)"),
            template="クラス互換性エラーの詳細は '{message}' です。コンパイル時と実行時で読み込まれているクラスやライブラリのバージョンが一致しているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="inputmismatchexception",
        language_hint="Java",
        description="想定していない形式の入力を受け取った可能性があります。",
        cause_candidate="数値入力箇所へ文字入力、入力形式不一致の可能性があります。",
        check_point="入力値、Scanner処理、expected型を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="instantiationerror",
        language_hint="Java",
        description="インスタンス生成できないクラスを生成しようとした可能性があります。",
        cause_candidate="abstract class生成、interface生成の可能性があります。",
        check_point="new対象クラス、abstract/interface定義を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"InstantiationError: (?P<class_name>[A-Za-z0-9_.$]+)"),
            template="インスタンス化できなかったクラスは '{class_name}' です。abstract class、interface、コンストラクタ、依存ライブラリのバージョン不一致を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="instantiationexception",
        language_hint="Java",
        description="クラスのインスタンス生成に失敗した可能性があります。",
        cause_candidate="abstract class生成、constructor不足、reflection生成失敗の可能性があります。",
        check_point="constructor定義、abstract/interface定義、reflection使用箇所を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"InstantiationException: (?P<class_name>[A-Za-z0-9_.$]+)"
            ),
            template="インスタンス化できなかったクラスは '{class_name}' です。抽象クラス、interface、引数なしコンストラクタ、アクセス修飾子を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="interruptedexception",
        language_hint="Java",
        description="実行中の処理が割り込みされた可能性があります。",
        cause_candidate="thread interrupt、sleep中断、wait中断の可能性があります。",
        check_point="interrupt呼び出し、thread状態、sleep/wait処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="interruptedioexception",
        language_hint="Java",
        description="入出力処理が途中で中断された可能性があります。",
        cause_candidate="thread interrupt、通信中断、読み込み中断の可能性があります。",
        check_point="interrupt処理、通信状態、入出力処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="invalidclassexception",
        language_hint="Java",
        description="serialize対象クラスの構造が一致していない可能性があります。",
        cause_candidate="serialVersionUID不一致、class変更、古い保存データの可能性があります。",
        check_point="serialVersionUID、class変更履歴、保存データを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"InvalidClassException: (?P<class_name>[A-Za-z0-9_.$]+)"
            ),
            template="シリアライズ互換性に問題がある可能性があるクラスは '{class_name}' です。serialVersionUID、クラス定義の変更、保存済みデータとの互換性を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="invalidobjectexception",
        language_hint="Java",
        description="不正なオブジェクト状態を読み込んだ可能性があります。",
        cause_candidate="deserialize失敗、データ破損、オブジェクト不整合の可能性があります。",
        check_point="deserialize処理、保存データ、オブジェクト状態を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"InvalidObjectException: (?P<message>.+)"),
            template="不正なオブジェクト状態の詳細は '{message}' です。デシリアライズ後の必須項目、readObject/readResolve、保存済みデータとの互換性を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="linkageerror",
        language_hint="Java",
        description="クラスやライブラリの読み込み連携に失敗した可能性があります。",
        cause_candidate="ライブラリ競合、バージョン不一致、クラス変更の可能性があります。",
        check_point="使用ライブラリ、classpath、バージョンを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="malformedinputexception",
        language_hint="Java",
        description="文字コード形式が不正なデータを読み込んだ可能性があります。",
        cause_candidate="文字コード不一致、データ破損、不正バイト列の可能性があります。",
        check_point="入力データ、文字コード設定、decode処理を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"MalformedInputException: Input length = (?P<input_length>\d+)"
            ),
            template="不正な入力として扱われた長さは '{input_length}' です。ファイルや入力データの文字コード、読み込み時のCharset指定、壊れたバイト列がないか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="missingresourceexception",
        language_hint="Java",
        description="指定したリソースが見つからなかった可能性があります。",
        cause_candidate="properties不足、resource名間違い、classpath不足の可能性があります。",
        check_point="resource名、classpath、ファイル配置を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Can't find bundle for base name (?P<base_name>[^,]+), locale (?P<locale>[A-Za-z_]+)"
            ),
            template="見つからなかったリソースのbase nameは '{base_name}'、localeは '{locale}' です。propertiesファイル名、配置場所、クラスパス、ロケール別ファイルの有無を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="negativearraysizeexception",
        language_hint="Java",
        description="負の値で配列を生成しようとした可能性があります。",
        cause_candidate="サイズ計算ミス、不正入力の可能性があります。",
        check_point="配列サイズ値、計算結果を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"NegativeArraySizeException: (?P<size>-\d+)"),
            template="配列サイズとして指定された負の値は '{size}' です。配列生成前のサイズ計算、入力値、減算結果が0以上になっているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="noclassdeffounderror",
        language_hint="Java",
        description="実行時に必要なクラスが見つからなかった可能性があります。",
        cause_candidate="classpath不足、jar不足、build漏れの可能性があります。",
        check_point="classpath、jar配置、build結果を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"NoClassDefFoundError: (?P<class_name>[A-Za-z0-9_.$/]+)"
            ),
            template="実行時に見つからなかったクラスは '{class_name}' です。依存関係、クラスパス、ビルド成果物、実行時に読み込まれているjarを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="nosuchelementexception",
        language_hint="Java",
        description="存在しない要素を取得しようとした可能性があります。",
        cause_candidate="iterator終端、Optional空、Scanner入力不足の可能性があります。",
        check_point="hasNext確認、Optional状態、collection内容を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="nosuchfielderror",
        language_hint="Java",
        description="存在しないフィールドへアクセスした可能性があります。",
        cause_candidate="フィールド削除、ライブラリ不整合、名前変更の可能性があります。",
        check_point="フィールド名、ライブラリバージョン、class更新状態を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"NoSuchFieldError: (?P<field_name>[A-Za-z0-9_.$]+)"),
            template="実行時に見つからなかったフィールドは '{field_name}' です。コンパイル時と実行時で読み込まれているクラスやライブラリのバージョンが一致しているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="nosuchmethoderror",
        language_hint="Java",
        description="存在しないメソッドを呼び出した可能性があります。",
        cause_candidate="メソッド削除、シグネチャ変更、ライブラリ不整合の可能性があります。",
        check_point="メソッド名、引数、ライブラリバージョンを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"NoSuchMethodError: (?P<method_signature>.+)"),
            template="実行時に見つからなかったメソッドは '{method_signature}' です。コンパイル時と実行時で読み込まれているクラスやライブラリのバージョンが一致しているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="notserializableexception",
        language_hint="Java",
        description="serialize未対応オブジェクトを保存しようとした可能性があります。",
        cause_candidate="Serializable未実装、非対応フィールド含有の可能性があります。",
        check_point="Serializable実装有無、対象クラス、field型を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"NotSerializableException: (?P<class_name>[A-Za-z0-9_.$]+)"
            ),
            template="シリアライズできなかったクラスは '{class_name}' です。Serializableを実装しているか、フィールドにシリアライズできないオブジェクトが含まれていないか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="objectstreamexception",
        language_hint="Java",
        description="オブジェクトの読み書き処理に失敗した可能性があります。",
        cause_candidate="serialize失敗、deserialize失敗、データ不整合の可能性があります。",
        check_point="Serializable実装、stream処理、保存データを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"ObjectStreamException: (?P<message>.+)"),
            template="オブジェクトストリーム処理の詳細は '{message}' です。シリアライズ対象のクラス、serialVersionUID、保存済みデータとの互換性を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="optionaldataexception",
        language_hint="Java",
        description="オブジェクト読み込み中に予期しないデータが存在した可能性があります。",
        cause_candidate="stream形式不一致、読み込み順不一致、データ破損の可能性があります。",
        check_point="stream読み込み順、保存形式、serialize処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="outofmemoryerror",
        language_hint="Java",
        description="使用可能なメモリが不足した可能性があります。",
        cause_candidate="大量データ保持、メモリリーク、heap不足の可能性があります。",
        check_point="heapサイズ、メモリ使用量、大量生成処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="parseexception",
        language_hint="Java",
        description="文字列やデータの解析に失敗した可能性があります。",
        cause_candidate="日付形式不正、入力形式不一致、データ形式異常の可能性があります。",
        check_point="入力データ、parse対象形式、フォーマット設定を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"ParseException: (?P<message>.+)"),
            template="解析失敗の詳細は '{message}' です。入力文字列の形式、日付フォーマット、区切り文字、想定している構文と一致しているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="reflectiveoperationexception",
        language_hint="Java",
        description="reflection処理中に問題が発生した可能性があります。",
        cause_candidate="class取得失敗、method取得失敗、instance生成失敗の可能性があります。",
        check_point="reflection使用箇所、class名、method名を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="runtimeexception",
        language_hint="Java",
        description="実行中に処理異常が発生した可能性があります。",
        cause_candidate="不正な値、null参照、状態異常の可能性があります。",
        check_point="stack trace、発生箇所、詳細メッセージを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="securityexception",
        language_hint="Java",
        description="許可されていない操作を実行しようとした可能性があります。",
        cause_candidate="権限不足、セキュリティ制限、アクセス制御の可能性があります。",
        check_point="実行権限、セキュリティ設定、アクセス対象を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"SecurityException: (?P<message>.+)"),
            template="セキュリティ制限の詳細は '{message}' です。アクセス権限、ファイルやネットワークへの許可、SecurityManagerや実行環境の制限を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="sqlnontransientexception",
        language_hint="Java",
        description="再試行では回復しないDBエラー可能性があります。",
        cause_candidate="SQL文誤り、制約違反、設定不備の可能性があります。",
        check_point="SQL文、DB設定、制約内容を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"SQLState: (?P<sql_state>[A-Z0-9]+)(?:, Error Code: (?P<error_code>\d+))?"
            ),
            template="SQLStateは '{sql_state}' です。再試行では直りにくいSQLエラーの可能性があります。SQL文、接続先、権限、テーブル定義、制約を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="sqlrecoverableexception",
        language_hint="Java",
        description="接続再確立で回復可能なDBエラー可能性があります。",
        cause_candidate="DB接続切断、通信異常、セッション切れの可能性があります。",
        check_point="DB接続状態、reconnect設定、通信状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="sqltimeoutexception",
        language_hint="Java",
        description="SQL処理が制限時間内に完了しなかった可能性があります。",
        cause_candidate="重いSQL、DB負荷、接続遅延の可能性があります。",
        check_point="実行SQL、timeout設定、DB状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="sqltransientexception",
        language_hint="Java",
        description="再試行で回復する可能性があるDBエラー可能性があります。",
        cause_candidate="一時通信障害、DB負荷、一時ロックの可能性があります。",
        check_point="DB接続状態、通信状態、再試行有無を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"SQLState: (?P<sql_state>[A-Z0-9]+)"),
            template="SQLStateは '{sql_state}' です。一時的なSQLエラーの可能性があります。接続切れ、ロック、タイムアウト、DB負荷、再試行で改善する条件かを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="stackoverflowerror",
        language_hint="Java",
        description="メソッド呼び出しが深くなりすぎた可能性があります。",
        cause_candidate="無限再帰、深い再帰処理の可能性があります。",
        check_point="再帰処理、終了条件、呼び出し回数を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="streamcorruptedexception",
        language_hint="Java",
        description="読み込み対象のデータ形式が壊れている可能性があります。",
        cause_candidate="stream破損、不正データ、保存形式不一致の可能性があります。",
        check_point="保存データ、serialize/deserialze処理、stream内容を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"invalid stream header: (?P<header>[A-Fa-f0-9]+)"),
            template="不正なストリームヘッダーは '{header}' です。読み込んでいるデータがJavaのシリアライズ形式か、ファイルや通信データが壊れていないか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="threaddeath",
        language_hint="Java",
        description="スレッドが強制終了された可能性があります。",
        cause_candidate="Thread.stop実行、強制停止処理の可能性があります。",
        check_point="thread制御処理、stop使用箇所を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="throwable",
        language_hint="Java",
        description="Javaで例外またはエラーが発生している可能性があります。",
        cause_candidate="例外処理発生、エラー発生の可能性があります。",
        check_point="stack trace、詳細メッセージ、発生クラスを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="toomanylistenersexception",
        language_hint="Java",
        description="許可数を超えるリスナーを登録しようとした可能性があります。",
        cause_candidate="listener重複登録、単一listener制限の可能性があります。",
        check_point="listener登録処理、addListener呼び出し回数を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="typenotpresentexception",
        language_hint="Java",
        description="指定した型が見つからなかった可能性があります。",
        cause_candidate="class不足、ライブラリ不足、package変更の可能性があります。",
        check_point="classpath、型名、使用ライブラリを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"Type (?P<type_name>[A-Za-z0-9_.$]+) not present"),
            template="見つからなかった型は '{type_name}' です。クラス名、パッケージ名、依存関係、実行時のクラスパスに含まれているかを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="uncheckedioexception",
        language_hint="Java",
        description="入出力処理で実行時例外が発生した可能性があります。",
        cause_candidate="IO処理失敗、ファイル異常、通信異常の可能性があります。",
        check_point="IO処理内容、原因例外、ファイルや通信状態を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"UncheckedIOException: (?P<cause_exception>[A-Za-z0-9_.$]+)(?:: (?P<message>.+))?"
            ),
            template="包まれている可能性があるIO例外は '{cause_exception}' です。ファイル、ディレクトリ、権限、文字コード、ストリーム処理の元のIOExceptionを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="unmappablecharacterexception",
        language_hint="Java",
        description="指定文字コードへ変換できない文字が含まれている可能性があります。",
        cause_candidate="未対応文字、文字コード不一致の可能性があります。",
        check_point="対象文字列、文字コード設定、encode処理を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"UnmappableCharacterException: Input length = (?P<input_length>\d+)"
            ),
            template="変換できなかった入力の長さは '{input_length}' です。出力先の文字コードで扱えない文字が含まれていないか、Charset指定が合っているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="unsatisfiedlinkerror",
        language_hint="Java",
        description="ネイティブライブラリの読み込みに失敗した可能性があります。",
        cause_candidate="dll/so不足、パス設定ミス、OS不一致の可能性があります。",
        check_point="native library配置、java.library.path、OS環境を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"UnsatisfiedLinkError: no (?P<library_name>[A-Za-z0-9_.$-]+) in java\.library\.path"
            ),
            template="見つからなかったネイティブライブラリは '{library_name}' です。java.library.path、DLL/SO/DYLIBの配置場所、OSやCPUアーキテクチャが合っているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="unsupportedcharsetexception",
        language_hint="Java",
        description="対応していない文字コードを指定した可能性があります。",
        cause_candidate="charset名間違い、未対応charset指定の可能性があります。",
        check_point="charset名、encode/decode設定を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"UnsupportedCharsetException: (?P<charset_name>[A-Za-z0-9_.-]+)"
            ),
            template="サポートされていない文字コード名は '{charset_name}' です。文字コード名のスペル、標準Charset名、実行環境で利用できるCharsetかを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="unsupportedclassversionerror",
        language_hint="Java",
        description="Javaバージョンが対応していない可能性があります。",
        cause_candidate="JDKバージョン不一致、古いJRE使用の可能性があります。",
        check_point="java version、class compile version、実行環境を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"class file version (?P<class_version>\d+\.\d+).*versions up to (?P<runtime_version>\d+\.\d+)"
            ),
            template="クラスファイルのバージョンは '{class_version}'、実行環境が対応している上限は '{runtime_version}' です。コンパイル時と実行時のJavaバージョンが一致しているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="utfdataformatexception",
        language_hint="Java",
        description="UTFデータ形式が不正可能性があります。",
        cause_candidate="UTFデータ破損、不正文字列、読み込み形式不一致の可能性があります。",
        check_point="UTFデータ内容、encode/decode処理、保存形式を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"UTFDataFormatException: (?P<message>.+)"),
            template="UTFデータ形式エラーの詳細は '{message}' です。DataInput/DataOutputのUTF文字列、データ長、読み書き形式が一致しているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="verifyerror",
        language_hint="Java",
        description="bytecode検証に失敗した可能性があります。",
        cause_candidate="class破損、bytecode不整合、ライブラリ競合の可能性があります。",
        check_point="build状態、ライブラリバージョン、class生成処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="virtualmachineerror",
        language_hint="Java",
        description="JVM内部で重大な問題が発生した可能性があります。",
        cause_candidate="メモリ不足、JVM異常、システム障害の可能性があります。",
        check_point="JVMログ、メモリ使用量、実行環境を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="error",
        language_hint="Java",
        description="Java実行環境で重大な問題が発生した可能性があります。",
        cause_candidate="JVM異常、メモリ不足、システム異常の可能性があります。",
        check_point="stack trace、JVM状態、実行環境を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="internalerror",
        language_hint="Java",
        description="JVM内部処理で異常が発生した可能性があります。",
        cause_candidate="JVM不具合、実行環境異常、native処理異常の可能性があります。",
        check_point="JVMバージョン、実行環境、stack traceを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="unknownerror",
        language_hint="Java",
        description="JVMで原因不明の問題が発生した可能性があります。",
        cause_candidate="JVM異常、システム障害、実行環境問題の可能性があります。",
        check_point="JVMログ、実行環境、stack traceを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="exception",
        language_hint="Java",
        description="Java実行中に例外が発生し処理が停止した可能性があります。",
        cause_candidate="実行時エラー、入力不正、処理失敗の可能性があります。",
        check_point="stack trace、詳細メッセージ、発生箇所を確認してください。",
        hint_rule=None,
    ),
]


CSHARP_ANALYSIS_RULES: list[AnalysisRule] = [
    AnalysisRule(
        keyword="nullreferenceexception",
        language_hint="C#",
        description="null状態の値を操作しようとした可能性があります。",
        cause_candidate="初期化不足、null代入、取得失敗の可能性があります。",
        check_point="null対象変数、初期化処理、戻り値を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="invalidoperationexception",
        language_hint="C#",
        description="現在の状態では実行できない処理を呼び出した可能性があります。",
        cause_candidate="状態不正、実行順序不正、初期化不足の可能性があります。",
        check_point="オブジェクト状態、実行順序、初期化処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="argumentnullexception",
        language_hint="C#",
        description="nullを許可していない引数へnullが渡された可能性があります。",
        cause_candidate="null渡し、初期化不足の可能性があります。",
        check_point="引数値、nullチェック、呼び出し元処理を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"Parameter '(?P<parameter_name>[^']+)'"),
            template="nullになっている可能性がある引数は '{parameter_name}' です。呼び出し元で値を渡しているか、null許容か、事前チェックが必要かを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="argumentexception",
        language_hint="C#",
        description="メソッドへ不正な値を渡した可能性があります。",
        cause_candidate="引数値不正、範囲外値、null渡しの可能性があります。",
        check_point="メソッド引数、入力値、バリデーションを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="argumentoutofrangeexception",
        language_hint="C#",
        description="許可範囲外の値を引数へ渡した可能性があります。",
        cause_candidate="index範囲外、不正数値、サイズ異常の可能性があります。",
        check_point="引数値、許可範囲、index値を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="formatexception",
        language_hint="C#",
        description="想定していない形式の値を処理した可能性があります。",
        cause_candidate="数値形式不正、日付形式不正、parse失敗の可能性があります。",
        check_point="入力値、parse処理、expected形式を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="filenotfoundexception",
        language_hint="C#",
        description="指定したファイルが見つからなかった可能性があります。",
        cause_candidate="パス間違い、ファイル未作成、実行場所違いの可能性があります。",
        check_point="ファイルパス、カレントディレクトリ、ファイル存在有無を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"Could not find file '(?P<file_path>[^']+)'"),
            template="見つからなかった可能性があるファイルは '{file_path}' です。ファイルの場所、ファイル名、実行時のカレントディレクトリ、配置漏れを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="directorynotfoundexception",
        language_hint="C#",
        description="指定したディレクトリが見つからなかった可能性があります。",
        cause_candidate="パス間違い、ディレクトリ未作成の可能性があります。",
        check_point="ディレクトリパス、カレントディレクトリ、ディレクトリ存在有無を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"Could not find a part of the path '(?P<path>[^']+)'"),
            template="見つからなかった可能性があるパスは '{path}' です。ディレクトリの存在、ファイル配置、実行時のカレントディレクトリ、パスの区切り文字を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="ioexception",
        language_hint="C#",
        description="ファイルや通信などの入出力処理に失敗した可能性があります。",
        cause_candidate="ファイル未存在、権限不足、通信異常の可能性があります。",
        check_point="ファイルパス、通信先、実行環境を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="unauthorizedaccessexception",
        language_hint="C#",
        description="権限不足で操作が拒否された可能性があります。",
        cause_candidate="ファイル権限不足、管理者権限不足、使用中ファイル操作の可能性があります。",
        check_point="実行権限、対象パス、ファイル使用状況を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"Access to the path '(?P<path>[^']+)' is denied"),
            template="アクセスが拒否されたパスは '{path}' です。ファイルやフォルダの権限、読み取り専用属性、実行ユーザーの権限を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="keynotfoundexception",
        language_hint="C#",
        description="存在しないキーを参照した可能性があります。",
        cause_candidate="キー名間違い、データ未登録の可能性があります。",
        check_point="キー名、Dictionary内容を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="indexoutofrangeexception",
        language_hint="C#",
        description="配列やListの存在しない位置を参照した可能性があります。",
        cause_candidate="index範囲外、ループ条件不正の可能性があります。",
        check_point="index値、配列やListサイズ、loop条件を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="invalidcastexception",
        language_hint="C#",
        description="対応していない型へ変換しようとした可能性があります。",
        cause_candidate="castミス、型確認不足の可能性があります。",
        check_point="cast処理、元の型、変換先型を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Unable to cast object of type '(?P<source_type>[^']+)' to type '(?P<target_type>[^']+)'"
            ),
            template="実際の型は '{source_type}'、変換しようとした型は '{target_type}' です。キャスト前の型、as/isによる判定、ジェネリクスや戻り値の型を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="timeoutexception",
        language_hint="C#",
        description="処理が制限時間内に完了しなかった可能性があります。",
        cause_candidate="長時間処理、通信遅延、DB応答遅延の可能性があります。",
        check_point="timeout設定、実行時間、通信先状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="httprequestexception",
        language_hint="C#",
        description="HTTP通信処理に失敗した可能性があります。",
        cause_candidate="API接続失敗、URL不正、サーバ異常の可能性があります。",
        check_point="URL、HTTPステータス、通信先状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="jsonexception",
        language_hint="C#",
        description="JSON形式が正しくない可能性があります。",
        cause_candidate="JSON構文ミス、型不一致、parse失敗の可能性があります。",
        check_point="JSON内容、プロパティ名、parse処理を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Path: (?P<json_path>[^|]+) \| LineNumber: (?P<line_number>\d+) \| BytePositionInLine: (?P<byte_position>\d+)"
            ),
            template="JSON内の場所は '{json_path}'、行番号は '{line_number}'、バイト位置は '{byte_position}' です。該当項目の型、必須項目、JSON形式が想定と合っているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="sqlexception",
        language_hint="C#",
        description="SQL処理中に問題が発生した可能性があります。",
        cause_candidate="SQL文誤り、DB接続失敗、制約違反の可能性があります。",
        check_point="SQL文、DB接続状態、SQLエラー番号を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"SqlException: (?P<message>.+)"),
            template="SQLエラーの詳細は '{message}' です。SQL文、テーブル名、カラム名、接続先DB、権限、制約違反を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="accessviolationexception",
        language_hint="C#",
        description="不正なメモリ領域へアクセスした可能性があります。",
        cause_candidate="unsafeコード異常、pointer操作異常、native連携異常の可能性があります。",
        check_point="unsafe処理、native DLL、pointer操作を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="aggregateexception",
        language_hint="C#",
        description="非同期処理内で複数の例外が発生した可能性があります。",
        cause_candidate="Task処理失敗、async処理例外、複数thread例外の可能性があります。",
        check_point="InnerExceptions、Task処理、async処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="appdomainunloadedexception",
        language_hint="C#",
        description="解放済みのAppDomainへアクセスしようとした可能性があります。",
        cause_candidate="AppDomain解放後アクセス、thread残存の可能性があります。",
        check_point="AppDomain状態、実行threadを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="applicationexception",
        language_hint="C#",
        description="アプリケーション独自の例外が発生した可能性があります。",
        cause_candidate="独自例外throw、業務処理異常の可能性があります。",
        check_point="throw箇所、独自例外クラス、詳細メッセージを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="arithmeticexception",
        language_hint="C#",
        description="計算処理中に問題が発生した可能性があります。",
        cause_candidate="不正計算、数値演算異常の可能性があります。",
        check_point="計算式、使用数値を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="arraytypemismatchexception",
        language_hint="C#",
        description="配列へ対応していない型を格納しようとした可能性があります。",
        cause_candidate="型不一致、object配列誤使用の可能性があります。",
        check_point="配列型、格納データ型を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="badimageformatexception",
        language_hint="C#",
        description="DLLや実行ファイル形式が不正可能性があります。",
        cause_candidate="DLL破損、x86/x64不一致、.NETバージョン不一致の可能性があります。",
        check_point="DLL形式、実行環境、platform設定を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="cannotunloadappdomainexception",
        language_hint="C#",
        description="AppDomainの解放に失敗した可能性があります。",
        cause_candidate="thread残存、domain使用中の可能性があります。",
        check_point="AppDomain状態、実行threadを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="comexception",
        language_hint="C#",
        description="COMコンポーネント処理に失敗した可能性があります。",
        cause_candidate="COM登録不備、COM呼び出し失敗、権限不足の可能性があります。",
        check_point="COM登録状態、HRESULT、実行権限を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="contextmarshalexception",
        language_hint="C#",
        description="オブジェクトの実行コンテキスト移行に失敗した可能性があります。",
        cause_candidate="remoting異常、context不一致の可能性があります。",
        check_point="remoting処理、context設定を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="cryptographicexception",
        language_hint="C#",
        description="暗号化や復号処理に失敗した可能性があります。",
        cause_candidate="鍵不一致、証明書異常、暗号データ破損の可能性があります。",
        check_point="暗号鍵、証明書、入力データを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="datamisalignedexception",
        language_hint="C#",
        description="メモリ配置が正しくないデータへアクセスした可能性があります。",
        cause_candidate="unsafe処理、memory alignment異常の可能性があります。",
        check_point="unsafeコード、pointer処理、struct定義を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="dbexception",
        language_hint="C#",
        description="データベース処理中に問題が発生した可能性があります。",
        cause_candidate="DB接続失敗、SQL実行失敗、制約違反の可能性があります。",
        check_point="SQL文、DB接続状態、InnerExceptionを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="dividebyzeroexception",
        language_hint="C#",
        description="0で割る計算を実行した可能性があります。",
        cause_candidate="除数が0、計算前チェック不足の可能性があります。",
        check_point="割り算処理、除数の値を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="drivenotfoundexception",
        language_hint="C#",
        description="指定したドライブが見つからなかった可能性があります。",
        cause_candidate="ドライブ未接続、ドライブ名間違いの可能性があります。",
        check_point="ドライブ名、接続状態を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"Could not find the drive '(?P<drive_name>[^']+)'"),
            template="見つからなかったドライブは '{drive_name}' です。ドライブの接続状態、ドライブレター、ネットワークドライブ、実行環境で利用できるパスかを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="duplicatewaitobjectexception",
        language_hint="C#",
        description="同じ待機オブジェクトを重複して指定した可能性があります。",
        cause_candidate="WaitHandle重複、wait対象設定ミスの可能性があります。",
        check_point="WaitHandle配列、wait対象一覧を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="endofstreamexception",
        language_hint="C#",
        description="読み込みデータが途中で終了した可能性があります。",
        cause_candidate="データ不足、stream終端到達の可能性があります。",
        check_point="読み込み回数、stream内容、データサイズを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="entrypointnotfoundexception",
        language_hint="C#",
        description="DLL内の指定メソッドが見つからなかった可能性があります。",
        cause_candidate="DLL関数名間違い、P/Invoke設定ミス、DLLバージョン違いの可能性があります。",
        check_point="DllImport設定、メソッド名、DLL内容を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Unable to find an entry point named '(?P<entry_point>[^']+)' in DLL '(?P<dll_name>[^']+)'"
            ),
            template="見つからなかったエントリポイントは '{entry_point}'、対象DLLは '{dll_name}' です。関数名、DLL名、DllImportの指定、32bit/64bitの一致を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="executionengineexception",
        language_hint="C#",
        description=".NET実行エンジン内部で重大な問題が発生した可能性があります。",
        cause_candidate="CLR異常、unsafe処理異常、native連携異常の可能性があります。",
        check_point="実行環境、unsafeコード、native連携処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="externalexception",
        language_hint="C#",
        description="外部コンポーネント処理で問題が発生した可能性があります。",
        cause_candidate="native処理失敗、COM異常、外部DLL異常の可能性があります。",
        check_point="外部DLL、native処理、実行環境を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="fieldaccessexception",
        language_hint="C#",
        description="アクセス権限のないフィールドへアクセスした可能性があります。",
        cause_candidate="private fieldアクセス、reflection制限の可能性があります。",
        check_point="access modifier、reflection使用箇所、field定義を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"FieldAccessException: (?P<message>.+)"),
            template="フィールドアクセス失敗の詳細は '{message}' です。フィールドのアクセス修飾子、static/instanceの違い、リフレクションやランタイム制約を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="fileloadexception",
        language_hint="C#",
        description="DLLやファイルの読み込みに失敗した可能性があります。",
        cause_candidate="DLL競合、ファイル破損、権限不足の可能性があります。",
        check_point="DLL配置、実行権限、ファイル状態を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Could not load file or assembly '(?P<assembly_name>[^']+)'"
            ),
            template="読み込みに失敗したファイルまたはアセンブリは '{assembly_name}' です。依存関係、DLL配置、バージョン不一致、ビルド出力に含まれているかを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="insufficientexecutionstackexception",
        language_hint="C#",
        description="実行に必要なスタック領域が不足した可能性があります。",
        cause_candidate="深い再帰、stack使用量過多の可能性があります。",
        check_point="再帰処理、メソッド呼び出し回数を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="insufficientmemoryexception",
        language_hint="C#",
        description="使用可能なメモリが不足した可能性があります。",
        cause_candidate="大量データ保持、メモリリーク、大量生成処理の可能性があります。",
        check_point="メモリ使用量、データサイズ、loop生成処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="invaliddataexception",
        language_hint="C#",
        description="不正な形式のデータを読み込んだ可能性があります。",
        cause_candidate="データ破損、フォーマット不一致、不正入力の可能性があります。",
        check_point="入力データ、データ形式、読み込み処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="invalidenumargumentexception",
        language_hint="C#",
        description="Enumに存在しない値を指定した可能性があります。",
        cause_candidate="Enum値不正、数値変換ミスの可能性があります。",
        check_point="Enum値、引数内容、cast処理を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"The value of argument '(?P<argument_name>[^']+)' \((?P<value>[^)]+)\) is invalid for Enum type '(?P<enum_type>[^']+)'"
            ),
            template="無効なenum引数は '{argument_name}'、値は '{value}'、enum型は '{enum_type}' です。定義済みのenum値か、数値変換やキャストが正しいか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="invalidprogramexception",
        language_hint="C#",
        description="実行可能コードが不正な状態可能性があります。",
        cause_candidate="ILコード異常、build不整合、DLL破損の可能性があります。",
        check_point="build状態、DLL状態、実行環境を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="invalidtimezoneexception",
        language_hint="C#",
        description="タイムゾーン情報が不正可能性があります。",
        cause_candidate="timezoneデータ破損、timezone名間違いの可能性があります。",
        check_point="timezone名、OS設定、timezoneデータを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"InvalidTimeZoneException: (?P<time_zone>.+)"),
            template="無効な可能性があるタイムゾーン指定は '{time_zone}' です。タイムゾーンIDのスペル、IANA形式、Windows形式との違い、実行環境で利用できるIDかを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="memberaccessexception",
        language_hint="C#",
        description="アクセス権限のないメンバーへアクセスした可能性があります。",
        cause_candidate="privateアクセス、reflection制限、access modifier問題の可能性があります。",
        check_point="access modifier、member定義、reflection使用箇所を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="methodaccessexception",
        language_hint="C#",
        description="アクセス権限のないメソッドを呼び出した可能性があります。",
        cause_candidate="private method呼び出し、reflection制限、access modifier問題の可能性があります。",
        check_point="メソッド定義、access modifier、呼び出し元を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"MethodAccessException: (?P<message>.+)"),
            template="メソッドアクセス失敗の詳細は '{message}' です。メソッドのアクセス修飾子、static/instanceの違い、リフレクション、ライブラリや実行環境の制限を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="missingfieldexception",
        language_hint="C#",
        description="指定したフィールドが見つからなかった可能性があります。",
        cause_candidate="フィールド削除、名前変更、DLL不整合の可能性があります。",
        check_point="フィールド名、DLLバージョン、class定義を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"Field not found: '(?P<field_name>[^']+)'"),
            template="見つからなかったフィールドは '{field_name}' です。フィールド名、アクセス修飾子、ライブラリやアセンブリのバージョン不一致を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="missingmemberexception",
        language_hint="C#",
        description="指定したメンバーが見つからなかった可能性があります。",
        cause_candidate="メンバー削除、名前変更、DLL不整合の可能性があります。",
        check_point="メンバー名、DLLバージョン、class定義を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="missingmethodexception",
        language_hint="C#",
        description="指定したメソッドが見つからなかった可能性があります。",
        cause_candidate="メソッド削除、シグネチャ変更、DLL不整合の可能性があります。",
        check_point="メソッド名、引数、DLLバージョンを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"Method not found: '(?P<method_signature>[^']+)'"),
            template="見つからなかったメソッドは '{method_signature}' です。メソッド名、引数の型、戻り値、参照しているアセンブリのバージョンを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="multicastnotsupportedexception",
        language_hint="C#",
        description="対応していないdelegate結合を実行した可能性があります。",
        cause_candidate="delegate制限、combine処理不正の可能性があります。",
        check_point="delegate型、combine/remove処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="notfinitenumberexception",
        language_hint="C#",
        description="無限大や非数値を処理しようとした可能性があります。",
        cause_candidate="Infinity発生、NaN発生、計算異常の可能性があります。",
        check_point="計算結果、double/float値、数値変換処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="notimplementedexception",
        language_hint="C#",
        description="未実装の処理が呼び出された可能性があります。",
        cause_candidate="未実装メソッド、仮実装状態の可能性があります。",
        check_point="throw NotImplementedException箇所、呼び出しメソッドを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="notsupportedexception",
        language_hint="C#",
        description="対応していない操作を実行しようとした可能性があります。",
        cause_candidate="未対応機能呼び出し、readonly操作、制限機能使用の可能性があります。",
        check_point="実行メソッド、対象オブジェクト、実装内容を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="objectdisposedexception",
        language_hint="C#",
        description="dispose済みオブジェクトを操作しようとした可能性があります。",
        cause_candidate="dispose後アクセス、using範囲外アクセスの可能性があります。",
        check_point="Dispose呼び出し、usingブロック、オブジェクト寿命を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="operationcanceledexception",
        language_hint="C#",
        description="実行中の処理がキャンセルされた可能性があります。",
        cause_candidate="CancellationToken発火、task中断の可能性があります。",
        check_point="CancellationToken、cancel呼び出し、task状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="overflowexception",
        language_hint="C#",
        description="扱える範囲を超える数値を処理しようとした可能性があります。",
        cause_candidate="数値範囲超過、checked演算の可能性があります。",
        check_point="使用数値、型範囲、計算式を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="pathtoolongexception",
        language_hint="C#",
        description="ファイルパスが長すぎる可能性があります。",
        cause_candidate="深いディレクトリ構造、長いファイル名の可能性があります。",
        check_point="ファイルパス長、ディレクトリ構成を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="pipeexception",
        language_hint="C#",
        description="パイプ通信処理で問題が発生した可能性があります。",
        cause_candidate="通信切断、pipe終了、接続失敗の可能性があります。",
        check_point="pipe状態、通信先状態、接続処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="platformnotsupportedexception",
        language_hint="C#",
        description="現在の実行環境では対応していない機能を使用した可能性があります。",
        cause_candidate="OS未対応、API未対応、実行環境違いの可能性があります。",
        check_point="OS環境、.NETバージョン、使用APIを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="rankexception",
        language_hint="C#",
        description="想定していない次元数の配列を使用した可能性があります。",
        cause_candidate="配列次元不一致、多次元配列誤使用の可能性があります。",
        check_point="配列次元数、メソッド引数、配列定義を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="regexmatchtimeoutexception",
        language_hint="C#",
        description="正規表現処理が制限時間内に完了しなかった可能性があります。",
        cause_candidate="複雑な正規表現、無限に近いpattern探索の可能性があります。",
        check_point="regex pattern、timeout設定、入力文字列を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="securityexception",
        language_hint="C#",
        description="許可されていない操作を実行しようとした可能性があります。",
        cause_candidate="権限不足、セキュリティ制限、アクセス拒否の可能性があります。",
        check_point="実行権限、セキュリティ設定、アクセス対象を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="sehexception",
        language_hint="C#",
        description="nativeコード側で重大な例外が発生した可能性があります。",
        cause_candidate="native DLL異常、unsafe処理異常、メモリ破損の可能性があります。",
        check_point="native DLL、unsafeコード、実行環境を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="serializationexception",
        language_hint="C#",
        description="オブジェクトの保存や復元に失敗した可能性があります。",
        cause_candidate="serialize未対応、データ不整合、class変更の可能性があります。",
        check_point="Serializable設定、保存データ、class構造を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"SerializationException: (?P<message>.+)"),
            template="シリアライズ失敗の詳細は '{message}' です。対象クラス、Serializable/DataContract、保存済みデータとの互換性、型名の変更を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="socketexception",
        language_hint="C#",
        description="ネットワーク通信処理に失敗した可能性があります。",
        cause_candidate="接続失敗、ポート未開放、ネットワーク異常の可能性があります。",
        check_point="接続先IP/Port、ネットワーク状態、サーバ起動状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="stackoverflowexception",
        language_hint="C#",
        description="メソッド呼び出しが深くなりすぎた可能性があります。",
        cause_candidate="無限再帰、深い再帰処理の可能性があります。",
        check_point="再帰処理、終了条件、呼び出し回数を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="synchronizationlockexception",
        language_hint="C#",
        description="lock取得していない状態で同期操作を実行した可能性があります。",
        cause_candidate="Monitor.Exit誤使用、lock不足の可能性があります。",
        check_point="lock処理、Monitor使用箇所、thread制御を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="systemexception",
        language_hint="C#",
        description=".NET実行環境で例外が発生した可能性があります。",
        cause_candidate="実行時異常、システム処理失敗の可能性があります。",
        check_point="stack trace、詳細メッセージ、発生処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="taskcanceledexception",
        language_hint="C#",
        description="実行中のTask処理がキャンセルされた可能性があります。",
        cause_candidate="CancellationToken発火、timeout、task中断の可能性があります。",
        check_point="CancellationToken、timeout設定、task状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="threadabortexception",
        language_hint="C#",
        description="スレッドが強制終了された可能性があります。",
        cause_candidate="Thread.Abort実行、強制停止処理の可能性があります。",
        check_point="Abort呼び出し、thread状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="threadinterruptedexception",
        language_hint="C#",
        description="待機中のスレッドが割り込みされた可能性があります。",
        cause_candidate="Thread.Interrupt実行、wait/sleep中断の可能性があります。",
        check_point="Interrupt呼び出し、sleep/wait処理、thread状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="threadstateexception",
        language_hint="C#",
        description="スレッド状態が不正なまま操作された可能性があります。",
        cause_candidate="start重複実行、thread状態不正の可能性があります。",
        check_point="thread状態、start/stop処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="timezonenotfoundexception",
        language_hint="C#",
        description="指定したタイムゾーンが見つからなかった可能性があります。",
        cause_candidate="timezone名間違い、OS未対応の可能性があります。",
        check_point="timezone ID、OS設定、実行環境を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"The time zone ID '(?P<time_zone_id>[^']+)' was not found"
            ),
            template="見つからなかったタイムゾーンIDは '{time_zone_id}' です。Windows形式とIANA形式の違い、実行環境で利用できるタイムゾーンIDかを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="typeaccessexception",
        language_hint="C#",
        description="アクセス権限のない型へアクセスした可能性があります。",
        cause_candidate="internal/private型アクセス、DLL制限の可能性があります。",
        check_point="access modifier、型定義、assembly設定を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"TypeAccessException: (?P<message>.+)"),
            template="型アクセス失敗の詳細は '{message}' です。型のアクセス修飾子、internal/public、アセンブリ参照、トリミングやAOTの影響を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="typeinitializationexception",
        language_hint="C#",
        description="クラス初期化処理中に例外が発生した可能性があります。",
        cause_candidate="static初期化失敗、初期値設定異常、内部例外発生の可能性があります。",
        check_point="static constructor、初期化処理、InnerExceptionを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"The type initializer for '(?P<type_name>[^']+)' threw an exception"
            ),
            template="初期化に失敗した型は '{type_name}' です。staticコンストラクタ、staticフィールド初期化、設定ファイル読み込み、InnerExceptionを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="typeloadexception",
        language_hint="C#",
        description="指定した型の読み込みに失敗した可能性があります。",
        cause_candidate="DLL不足、型名変更、assembly不整合の可能性があります。",
        check_point="型名、DLL配置、assemblyバージョンを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Could not load type '(?P<type_name>[^']+)' from assembly '(?P<assembly_name>[^']+)'"
            ),
            template="読み込めなかった型は '{type_name}'、対象アセンブリは '{assembly_name}' です。型名、名前空間、アセンブリのバージョン、参照DLLが一致しているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="typeunloadedexception",
        language_hint="C#",
        description="解放済みの型へアクセスしようとした可能性があります。",
        cause_candidate="AppDomain解放、assembly解放後アクセスの可能性があります。",
        check_point="AppDomain状態、assembly状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="uriformatexception",
        language_hint="C#",
        description="URLやURI形式が正しくない可能性があります。",
        cause_candidate="URL形式不正、文字列不足、不正文字の可能性があります。",
        check_point="URI文字列、scheme、URL形式を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="verificationexception",
        language_hint="C#",
        description="実行コードの安全性検証に失敗した可能性があります。",
        cause_candidate="不正ILコード、unsafe処理、DLL異常の可能性があります。",
        check_point="build状態、unsafeコード、DLL状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="webexception",
        language_hint="C#",
        description="Web通信処理に失敗した可能性があります。",
        cause_candidate="HTTP通信失敗、timeout、接続先異常の可能性があります。",
        check_point="URL、HTTPステータス、通信状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="win32exception",
        language_hint="C#",
        description="Windows API処理に失敗した可能性があります。",
        cause_candidate="Win32 API失敗、権限不足、OS依存問題の可能性があります。",
        check_point="Win32 API、エラーコード、実行権限を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="xmlexception",
        language_hint="C#",
        description="XML形式が正しくない可能性があります。",
        cause_candidate="XML構文ミス、タグ不整合、エンコード問題の可能性があります。",
        check_point="XML内容、行番号、タグ構造を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Line (?P<line_number>\d+), position (?P<position>\d+)"
            ),
            template="XML内の行番号は '{line_number}'、位置は '{position}' です。該当位置のタグ、文字コード、XML宣言、余計な文字がないか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="exception",
        language_hint="C#",
        description="C#実行中に例外が発生し処理が停止した可能性があります。",
        cause_candidate="実行時エラー、不正入力、処理失敗の可能性があります。",
        check_point="stack trace、詳細メッセージ、発生箇所を確認してください。",
        hint_rule=None,
    ),
]


JAVASCRIPT_ANALYSIS_RULES: list[AnalysisRule] = [
    AnalysisRule(
        keyword="cannot read properties of undefined",
        language_hint="JavaScript",
        description="undefined状態の値を操作しようとした可能性があります。",
        cause_candidate="値未設定、API取得失敗、配列要素未存在の可能性があります。",
        check_point="対象変数、API戻り値、配列indexを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Cannot read properties of undefined \(reading '(?P<property_name>[^']+)'\)"
            ),
            template="undefinedから読み取ろうとしたプロパティは '{property_name}' です。対象オブジェクトが作成済みか、APIレスポンスや初期値が想定通りか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="cannot read properties of null",
        language_hint="JavaScript",
        description="null状態の値を操作しようとした可能性があります。",
        cause_candidate="DOM取得失敗、値未設定、API取得失敗の可能性があります。",
        check_point="querySelector結果、API戻り値、nullチェックを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Cannot read properties of null \(reading '(?P<property_name>[^']+)'\)"
            ),
            template="nullから読み取ろうとしたプロパティは '{property_name}' です。対象オブジェクトやDOM要素が取得できているか、初期化前に参照していないか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="cannot set properties of undefined",
        language_hint="JavaScript",
        description="undefined状態の値へプロパティを設定しようとした可能性があります。",
        cause_candidate="オブジェクト未初期化、配列要素未存在、API取得失敗の可能性があります。",
        check_point="代入対象の変数、初期化処理、配列indexを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Cannot set properties of undefined \(setting '(?P<property_name>[^']+)'\)"
            ),
            template="undefinedに設定しようとしたプロパティは '{property_name}' です。代入先のオブジェクトが初期化済みか、配列やオブジェクトの作成漏れがないか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="is not a function",
        language_hint="JavaScript",
        description="関数ではない値を関数として呼び出した可能性があります。",
        cause_candidate="メソッド名誤り、import/export誤り、想定外の型の可能性があります。",
        check_point="呼び出し対象の値、関数名、import/exportを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"(?P<function_name>[A-Za-z0-9_.$]+) is not a function"),
            template="関数として呼び出そうとした名前は '{function_name}' です。メソッド名のスペル、戻り値の型、import/export、対象オブジェクトの中身を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="referenceerror",
        language_hint="JavaScript",
        description="存在しない変数や関数を参照した可能性があります。",
        cause_candidate="変数未定義、import漏れ、スコープ外参照の可能性があります。",
        check_point="変数名、import、スコープを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"ReferenceError: (?P<variable_name>[A-Za-z_$][A-Za-z0-9_$]*) is not defined"
            ),
            template="未定義の可能性がある変数は '{variable_name}' です。変数名のスペル、宣言位置、スコープ、import/exportの漏れを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="typeerror",
        language_hint="JavaScript",
        description="想定していない型の値を操作した可能性があります。",
        cause_candidate="undefined参照、null参照、型不一致の可能性があります。",
        check_point="対象変数、データ型、API戻り値を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="syntaxerror",
        language_hint="JavaScript",
        description="JavaScriptの文法が正しくない可能性があります。",
        cause_candidate="括弧閉じ忘れ、カンマ不足、構文ミスの可能性があります。",
        check_point="エラー行、括弧、クォートを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"SyntaxError: (?P<message>.+)"),
            template="構文エラーの詳細は '{message}' です。括弧、カンマ、クォート、予約語、JSONとして正しい形式かを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="unexpected token",
        language_hint="JavaScript",
        description="JavaScriptの文法が正しくない可能性があります。",
        cause_candidate="括弧不一致、カンマ不足、構文ミスの可能性があります。",
        check_point="エラー行、括弧、クォートを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"Unexpected token '(?P<token>[^']+)'"),
            template="想定外として扱われたトークンは '{token}' です。直前の括弧、カンマ、クォート、JSON形式、構文の閉じ忘れを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="unexpected end of input",
        language_hint="JavaScript",
        description="コードが途中で終了している可能性があります。",
        cause_candidate="括弧閉じ忘れ、クォート閉じ忘れ、ファイル途中終了の可能性があります。",
        check_point="括弧、クォート、ファイル末尾を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="module not found",
        language_hint="JavaScript",
        description="指定したモジュールが見つからなかった可能性があります。",
        cause_candidate="package未install、import path誤り、ファイル未配置の可能性があります。",
        check_point="import文、package.json、node_modulesを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"Cannot find module '(?P<module_name>[^']+)'"),
            template="見つからなかったモジュールは '{module_name}' です。npm install済みか、import/requireのパス、package.json、node_modulesを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="failed to fetch",
        language_hint="JavaScript",
        description="fetchによる通信に失敗した可能性があります。",
        cause_candidate="URL誤り、サーバ未起動、CORS制限の可能性があります。",
        check_point="URL、Networkタブ、サーバ状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="blocked by cors policy",
        language_hint="JavaScript",
        description="CORS設定によりブラウザ通信が拒否された可能性があります。",
        cause_candidate="CORS未設定、origin不一致、preflight失敗の可能性があります。",
        check_point="origin、response header、APIサーバ設定を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="uncaught (in promise)",
        language_hint="JavaScript",
        description="Promise内の例外が処理されなかった可能性があります。",
        cause_candidate="catch不足、async処理失敗、API通信失敗の可能性があります。",
        check_point="Promise処理、catch、async/awaitを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Uncaught \(in promise\) (?P<cause_error>[A-Za-z0-9_.$]+)(?:: (?P<message>.+))?"
            ),
            template="Promise内で捕まえられなかったエラーは '{cause_error}' です。await/then/catchの例外処理、非同期処理内の失敗箇所を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="unhandledpromiserejection",
        language_hint="JavaScript",
        description="Promiseの失敗をcatchできていない可能性があります。",
        cause_candidate="catch不足、await先の例外未処理、非同期処理失敗の可能性があります。",
        check_point="async/await、catch、Promiseの戻り値を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"UnhandledPromiseRejection(?:Warning)?: (?P<cause_error>[A-Za-z0-9_.$]+)(?:: (?P<message>.+))?"
            ),
            template="Promise内で未処理になったエラーは '{cause_error}' です。async/awaitのtry-catch、Promiseのcatch、非同期処理内の例外発生箇所を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="enoent",
        language_hint="JavaScript",
        description="指定したファイルやディレクトリが見つからなかった可能性があります。",
        cause_candidate="パス誤り、ファイル未配置、実行場所違いの可能性があります。",
        check_point="ファイルパス、カレントディレクトリ、ファイル存在有無を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"ENOENT: no such file or directory, (?P<operation>[A-Za-z]+) '(?P<file_path>[^']+)'"
            ),
            template="見つからなかったファイルは '{file_path}'、実行しようとした操作は '{operation}' です。ファイルの場所、相対パス、実行時のカレントディレクトリを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="eaddrinuse",
        language_hint="JavaScript",
        description="使用ポートが既に他アプリで利用されている可能性があります。",
        cause_candidate="開発サーバ多重起動、ポート競合の可能性があります。",
        check_point="使用ポート、起動中プロセス、dev server設定を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"EADDRINUSE: address already in use .*:(?P<port>\d+)"),
            template="すでに使用中のポートは '{port}' です。同じポートを使っている別プロセス、起動済みサーバー、ポート番号設定を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="econnrefused",
        language_hint="JavaScript",
        description="接続先に通信を拒否された可能性があります。",
        cause_candidate="サーバ未起動、port誤り、接続先設定ミスの可能性があります。",
        check_point="接続先host、port番号、サーバ起動状態を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"ECONNREFUSED (?P<host>[0-9a-fA-F:.]+):(?P<port>\d+)"),
            template="接続を拒否された接続先は '{host}:{port}' です。接続先サーバーが起動しているか、ポート番号、URL、DBやAPIの接続設定を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="etimedout",
        language_hint="JavaScript",
        description="通信処理が制限時間内に完了しなかった可能性があります。",
        cause_candidate="接続先応答なし、ネットワーク遅延、timeout設定不足の可能性があります。",
        check_point="接続先URL、timeout設定、ネットワーク状態を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"ETIMEDOUT (?P<host>[0-9a-fA-F:.]+):(?P<port>\d+)"),
            template="タイムアウトした接続先は '{host}:{port}' です。接続先サーバー、ネットワーク、ポート番号、APIやDBの応答時間を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="javascript heap out of memory",
        language_hint="JavaScript",
        description="JavaScript実行に必要なメモリが不足した可能性があります。",
        cause_candidate="大量データ処理、build処理のメモリ不足、無限処理の可能性があります。",
        check_point="処理データ量、build設定、Node.jsメモリ上限を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="[vite]",
        language_hint="JavaScript",
        description="Viteの開発サーバーやbuild処理で問題が発生した可能性があります。",
        cause_candidate="import path誤り、依存関係不足、設定不備の可能性があります。",
        check_point="import文、vite.config、依存packageを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="[vue warn]",
        language_hint="JavaScript",
        description="Vueコンポーネント処理で注意が必要な状態可能性があります。",
        cause_candidate="props不足、template記述ミス、component登録不足の可能性があります。",
        check_point="warning内容、component名、props/templateを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="aggregateerror",
        language_hint="JavaScript",
        description="Promise処理などで複数のエラーが同時に発生した可能性があります。",
        cause_candidate="Promise.any失敗、非同期複数失敗の可能性があります。",
        check_point="errors配列、Promise処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="assignment to constant variable",
        language_hint="JavaScript",
        description="constで定義した値を変更しようとした可能性があります。",
        cause_candidate="const再代入、変数定義ミスの可能性があります。",
        check_point="const定義、再代入箇所を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="await is only valid in async functions",
        language_hint="JavaScript",
        description="async関数外でawaitを使用した可能性があります。",
        cause_candidate="async不足、top-level await非対応の可能性があります。",
        check_point="await使用箇所、async定義、実行環境を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="cannot access",
        language_hint="JavaScript",
        description="初期化される前の変数へアクセスした可能性があります。",
        cause_candidate="let/constの初期化前参照、循環import、処理順序誤りの可能性があります。",
        check_point="変数定義位置、参照位置、importの循環を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="cannot use import statement outside a module",
        language_hint="JavaScript",
        description="module設定外でimportを使用した可能性があります。",
        cause_candidate="package.json設定不足、CommonJS/ESM不一致の可能性があります。",
        check_point="package.json、type設定、import/exportを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="evalerror",
        language_hint="JavaScript",
        description="eval関連処理で問題が発生した可能性があります。",
        cause_candidate="eval構文異常、実行コード不正の可能性があります。",
        check_point="eval内容、実行文字列を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="failed prop type",
        language_hint="JavaScript",
        description="propsに想定と違う型の値が渡された可能性があります。",
        cause_candidate="props型不一致、必須props不足、component呼び出しミスの可能性があります。",
        check_point="props値、PropTypes定義、component呼び出しを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Invalid prop `(?P<prop_name>[^`]+)` of type `(?P<actual_type>[^`]+)` supplied to `(?P<component_name>[^`]+)`, expected `(?P<expected_type>[^`]+)`"
            ),
            template="prop名は '{prop_name}'、渡された型は '{actual_type}'、期待される型は '{expected_type}'、対象コンポーネントは '{component_name}' です。propsの渡し方と型定義を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="hydration failed",
        language_hint="JavaScript",
        description="サーバー生成HTMLとブラウザ側描画結果が一致しない可能性があります。",
        cause_candidate="SSR/CSR差異、初期表示値の違い、browser専用API使用の可能性があります。",
        check_point="初期render、window/localStorage使用箇所、サーバー側とクライアント側の表示差を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="identifier has already been declared",
        language_hint="JavaScript",
        description="同じ名前の変数や関数を重複定義した可能性があります。",
        cause_candidate="let重複、const重複、import重複の可能性があります。",
        check_point="変数名、import文、スコープを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Identifier '(?P<identifier_name>[^']+)' has already been declared"
            ),
            template="重複して宣言されている識別子は '{identifier_name}' です。同じスコープ内でlet/const/class/functionを二重定義していないか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="invalid dom property",
        language_hint="JavaScript",
        description="JSXで不正なDOM属性名を使用した可能性があります。",
        cause_candidate="classを使用、forを使用、属性名の大文字小文字ミスの可能性があります。",
        check_point="JSX属性、className/htmlFor、DOM属性名を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Invalid DOM property `(?P<invalid_property>[^`]+)`\. Did you mean `(?P<suggested_property>[^`]+)`"
            ),
            template="無効なDOM属性は '{invalid_property}' です。Reactでは '{suggested_property}' を使う必要があります。JSXの属性名を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="invalid hook call",
        language_hint="JavaScript",
        description="React Hookを使用できない場所で呼び出した可能性があります。",
        cause_candidate="component外でHook使用、条件分岐内でHook使用、React重複installの可能性があります。",
        check_point="useState/useEffect使用箇所、component構造、Reactバージョンを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="maximum call stack size exceeded",
        language_hint="JavaScript",
        description="関数呼び出しが深くなりすぎた可能性があります。",
        cause_candidate="無限再帰、再帰終了条件不足の可能性があります。",
        check_point="recursion処理、関数呼び出しを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="networkerror when attempting to fetch resource",
        language_hint="JavaScript",
        description="ネットワーク通信に失敗した可能性があります。",
        cause_candidate="通信先未接続、ネットワーク異常、CORS制限の可能性があります。",
        check_point="URL、Networkタブ、通信先状態を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="nextrouter was not mounted",
        language_hint="JavaScript",
        description="Next.js Routerが使えない場所で呼び出された可能性があります。",
        cause_candidate="Router使用位置不正、App Router/Page Router混在、test環境でrouter未設定の可能性があります。",
        check_point="useRouter使用箇所、app/pages構成、next/router と next/navigationを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="ng0",
        language_hint="JavaScript",
        description="Angularアプリ実行中にエラーが発生した可能性があります。",
        cause_candidate="template binding異常、DI設定ミス、module設定不備の可能性があります。",
        check_point="エラーコード、component/template、module/provider設定を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="npm err!",
        language_hint="JavaScript",
        description="npm install や npm script の実行に失敗した可能性があります。",
        cause_candidate="package不足、script失敗、依存関係不整合の可能性があります。",
        check_point="npm ERR!の直後、package.json、node_modulesを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="objects are not valid as a react child",
        language_hint="JavaScript",
        description="JSXに表示できないオブジェクトを渡した可能性があります。",
        cause_candidate="objectをそのまま描画、配列やpropsの扱いミス、map処理不足の可能性があります。",
        check_point="JSX内の表示値、props内容、map処理を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"object with keys \{(?P<object_keys>[^}]+)\}"),
            template="React childとして直接描画しようとしたオブジェクトのキーは '{object_keys}' です。オブジェクト全体ではなく、表示したいプロパティを指定して描画してください。",
        ),
    ),
    AnalysisRule(
        keyword="rangeerror",
        language_hint="JavaScript",
        description="許可範囲外の値を使用した可能性があります。",
        cause_candidate="無限再帰、配列長異常、数値範囲異常の可能性があります。",
        check_point="recursion処理、数値、配列サイズを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="require is not defined",
        language_hint="JavaScript",
        description="requireが使用できない環境でrequireを実行した可能性があります。",
        cause_candidate="CommonJS/ESM不一致、module設定不足の可能性があります。",
        check_point="package.json、import/export、type設定を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="too many re-renders",
        language_hint="JavaScript",
        description="state更新により再描画が繰り返されている可能性があります。",
        cause_candidate="render中のsetState、useEffect条件不足、イベント処理の呼び出しミスの可能性があります。",
        check_point="setState呼び出し箇所、useEffect依存配列、onClick指定を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="unexpected token in json",
        language_hint="JavaScript",
        description="JSON形式が正しくない可能性があります。",
        cause_candidate="JSON構文ミス、APIレスポンス形式不一致、HTMLをJSONとして解析の可能性があります。",
        check_point="JSON文字列、APIレスポンス、JSON.parse箇所を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Unexpected token (?P<token>\S+) in JSON at position (?P<position>\d+)"
            ),
            template="JSON内で想定外だったトークンは '{token}'、位置は '{position}' です。JSONの括弧、カンマ、クォート、末尾カンマ、レスポンス内容を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="urierror",
        language_hint="JavaScript",
        description="URIやURLの解析に失敗した可能性があります。",
        cause_candidate="URL形式不正、encode/decode失敗の可能性があります。",
        check_point="URL文字列、encodeURI/decodeURIを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="internalerror",
        language_hint="JavaScript",
        description="JavaScript実行エンジン内部で問題が発生した可能性があります。",
        cause_candidate="recursion異常、engine内部異常の可能性があります。",
        check_point="recursion処理、実行環境を確認してください。",
        hint_rule=None,
    ),
]


SQL_ANALYSIS_RULES: list[AnalysisRule] = [
    AnalysisRule(
        keyword="syntax error",
        language_hint="SQL",
        description="SQLの文法が正しくない可能性があります。",
        cause_candidate="カンマ不足、括弧不一致、SQL構文ミスの可能性があります。",
        check_point="エラー位置、SQL文、括弧やカンマを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r'syntax error at or near "(?P<near_token>[^"]+)"'),
            template="SQL構文エラーの近くにある語句は '{near_token}' です。直前直後のSQL、カンマ、括弧、予約語、句の順番を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="duplicate key value violates unique constraint",
        language_hint="SQL",
        description="重複禁止の値を登録しようとした可能性があります。",
        cause_candidate="UNIQUE重複、主キー重複の可能性があります。",
        check_point="UNIQUE制約、登録値、DBデータを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r'duplicate key value violates unique constraint "(?P<constraint_name>[^"]+)"'
            ),
            template="重複違反になった一意制約は '{constraint_name}' です。同じ値が既に登録されていないか、INSERT/UPDATE対象の一意キーを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="unique constraint failed",
        language_hint="SQL",
        description="重複禁止の値を保存しようとした可能性があります。",
        cause_candidate="主キー重複、UNIQUEカラム重複、登録済みデータ再登録の可能性があります。",
        check_point="対象カラム、保存値、既存データを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"UNIQUE constraint failed: (?P<target>[A-Za-z0-9_.$]+)"
            ),
            template="一意制約違反になった対象は '{target}' です。同じ値が既に登録されていないか、INSERT/UPDATE対象のカラムを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="foreign key constraint fails",
        language_hint="SQL",
        description="関連先に存在しないデータを登録しようとした可能性があります。",
        cause_candidate="外部キー未存在、親データ削除済みの可能性があります。",
        check_point="外部キー値、親テーブル、関連データを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="not null constraint failed",
        language_hint="SQL",
        description="必須項目にNULLを保存しようとした可能性があります。",
        cause_candidate="必須値未設定、request値不足、default値未設定の可能性があります。",
        check_point="NULL対象カラム、INSERT/UPDATE値、テーブル定義を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"NOT NULL constraint failed: (?P<target>[A-Za-z0-9_.$]+)"
            ),
            template="NOT NULL制約違反になった対象は '{target}' です。必須カラムに値が入っているか、INSERT/UPDATE時の値、フォーム入力、初期値を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="column does not exist",
        language_hint="SQL",
        description="指定したカラムが存在しない可能性があります。",
        cause_candidate="カラム名誤り、migration未実行、alias誤りの可能性があります。",
        check_point="カラム名、テーブル定義、migration状態を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r'column "(?P<column_name>[^"]+)" does not exist'),
            template="存在しないカラムとして扱われた名前は '{column_name}' です。カラム名のスペル、テーブル定義、SELECT/WHERE/ORDER BYで参照している名前を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="relation does not exist",
        language_hint="SQL",
        description="指定したテーブルが存在しない可能性があります。",
        cause_candidate="テーブル名誤り、migration未実行、schema違いの可能性があります。",
        check_point="テーブル名、schema、migration状態を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r'relation "(?P<relation_name>[^"]+)" does not exist'),
            template="存在しないrelationとして扱われた名前は '{relation_name}' です。テーブル名、ビュー名、スキーマ名、マイグレーション適用状況を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="no such table",
        language_hint="SQL",
        description="指定したテーブルが存在しない可能性があります。",
        cause_candidate="テーブル未作成、DBファイル違い、migration未実行の可能性があります。",
        check_point="DBファイル、テーブル一覧、migration状態を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"no such table: (?P<table_name>[A-Za-z0-9_.$]+)"),
            template="存在しないテーブルとして扱われた名前は '{table_name}' です。テーブル名、マイグレーション、接続先DB、DBファイルの場所を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="unknown column",
        language_hint="SQL",
        description="指定したカラムが存在しない可能性があります。",
        cause_candidate="カラム名誤り、alias誤り、migration未実行の可能性があります。",
        check_point="カラム名、SELECT文、テーブル定義を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Unknown column '(?P<column_name>[^']+)' in '(?P<context>[^']+)'"
            ),
            template="存在しないカラムとして扱われた名前は '{column_name}'、発生箇所は '{context}' です。カラム名、SELECT/WHERE/ORDER BY、テーブル定義、マイグレーションを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="table already exists",
        language_hint="SQL",
        description="既に存在するテーブルを作成しようとした可能性があります。",
        cause_candidate="migration重複、CREATE TABLE重複実行の可能性があります。",
        check_point="migration履歴、テーブル一覧を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"table (?P<table_name>[A-Za-z0-9_.$]+) already exists"),
            template="既に存在しているテーブルは '{table_name}' です。CREATE TABLEの重複実行、マイグレーション履歴、IF NOT EXISTSの必要性を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="data too long for column",
        language_hint="SQL",
        description="カラムの最大文字数を超える値を保存しようとした可能性があります。",
        cause_candidate="varchar長超過、想定外データ入力の可能性があります。",
        check_point="カラム長、保存値、DB定義を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Data too long for column '(?P<column_name>[^']+)' at row (?P<row_number>\d+)"
            ),
            template="値が長すぎるカラムは '{column_name}'、対象行は '{row_number}' です。入力値の長さ、カラム定義、文字数制限、バリデーションを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="string or binary data would be truncated",
        language_hint="SQL",
        description="カラムサイズを超えるデータを保存しようとした可能性があります。",
        cause_candidate="varchar長超過、binaryサイズ超過の可能性があります。",
        check_point="カラム長、保存データ、DB定義を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="invalid input syntax",
        language_hint="SQL",
        description="指定した型へ変換できない値を使用した可能性があります。",
        cause_candidate="数値変換失敗、日付形式不正、型不一致の可能性があります。",
        check_point="入力値、カラム型、SQL型変換を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r'invalid input syntax for type (?P<data_type>[A-Za-z0-9_ ]+): "(?P<input_value>[^"]+)"'
            ),
            template="変換できなかった型は '{data_type}'、入力値は '{input_value}' です。値の形式、型変換、空文字、数値以外の文字が混ざっていないか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="division by zero",
        language_hint="SQL",
        description="0で割り算を実行した可能性があります。",
        cause_candidate="分母0、NULL/0データ未考慮の可能性があります。",
        check_point="計算式、分母値、CASE条件を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="deadlock detected",
        language_hint="SQL",
        description="複数処理が互いにロック待ち状態になった可能性があります。",
        cause_candidate="同時更新、transaction競合、lock順序不一致の可能性があります。",
        check_point="transaction処理、更新順序、同時アクセスを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="lock wait timeout exceeded",
        language_hint="SQL",
        description="ロック解除待機中に制限時間を超えた可能性があります。",
        cause_candidate="長時間transaction、lock競合、更新集中の可能性があります。",
        check_point="transaction時間、lock状態、同時更新処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="too many connections",
        language_hint="SQL",
        description="DB接続数が上限を超えた可能性があります。",
        cause_candidate="connection解放漏れ、同時接続過多、pool設定不足の可能性があります。",
        check_point="DB接続数、connection pool、長時間接続を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="connection refused",
        language_hint="SQL",
        description="DBサーバへの接続が拒否された可能性があります。",
        cause_candidate="DB未起動、host/port誤り、firewall制限の可能性があります。",
        check_point="DB起動状態、host、portを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="could not connect to server",
        language_hint="SQL",
        description="PostgreSQLサーバへ接続できていない可能性があります。",
        cause_candidate="DB未起動、host/port誤り、ネットワーク制限の可能性があります。",
        check_point="DB起動状態、host、port、接続文字列を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="access denied for user",
        language_hint="SQL",
        description="DBユーザー認証に失敗した可能性があります。",
        cause_candidate="password誤り、user権限不足、host制限の可能性があります。",
        check_point="DBユーザー、password、DB権限を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"Access denied for user '(?P<user_name>[^']+)'@'(?P<host>[^']+)'"
            ),
            template="接続を拒否されたDBユーザーは '{user_name}'、接続元は '{host}' です。ユーザー名、パスワード、権限、接続元ホストの許可設定を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="password authentication failed",
        language_hint="SQL",
        description="PostgreSQLのログイン認証に失敗した可能性があります。",
        cause_candidate="password誤り、user未存在、pg_hba.conf設定の可能性があります。",
        check_point="DBユーザー、password、pg_hba.confを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r'password authentication failed for user "(?P<user_name>[^"]+)"'
            ),
            template="パスワード認証に失敗したDBユーザーは '{user_name}' です。ユーザー名、パスワード、接続先DB、環境変数、認証方式を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="sqlstate[23000]",
        language_hint="SQL",
        description="DB制約に違反するデータを保存しようとした可能性があります。",
        cause_candidate="UNIQUE違反、外部キー違反、NOT NULL違反の可能性があります。",
        check_point="制約名、保存データ、DB定義を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"SQLSTATE\[(?P<sql_state>\d{5})\]"),
            template="SQLSTATEは '{sql_state}' です。制約違反、外部キー制約、一意制約、NOT NULL制約など、DBの整合性ルールに違反していないか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="sqlstate[42s02]",
        language_hint="SQL",
        description="指定したテーブルが存在しない可能性があります。",
        cause_candidate="テーブル未作成、テーブル名誤り、migration未実行の可能性があります。",
        check_point="テーブル名、migration状態、DB定義を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"SQLSTATE\[(?P<sql_state>[A-Z0-9]{5})\]"),
            template="SQLSTATEは '{sql_state}' です。SQLSTATE[42S02] の場合、テーブルまたはビューが存在しない可能性があります。テーブル名、マイグレーション、接続先DBを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="sqlstate[hy000]",
        language_hint="SQL",
        description="DB処理中に汎用的なエラーが発生した可能性があります。",
        cause_candidate="DB接続異常、SQL実行失敗、driver異常の可能性があります。",
        check_point="詳細エラー、SQL文、DB状態を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r"SQLSTATE\[(?P<sql_state>[A-Z0-9]{5})\]"),
            template="SQLSTATEは '{sql_state}' です。HY000は一般的なDBエラーを表すことが多いため、同じログ内の詳細メッセージ、DBエラー番号、SQL文、接続設定を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="ambiguous column name",
        language_hint="SQL",
        description="同じ名前のカラムが複数存在し判別できない可能性があります。",
        cause_candidate="JOIN時カラム重複、alias未指定の可能性があります。",
        check_point="JOIN句、テーブルalias、SELECTカラムを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"ambiguous column name: (?P<column_name>[A-Za-z0-9_.$]+)"
            ),
            template="曖昧だと判定されたカラム名は '{column_name}' です。JOINしているテーブルで同名カラムがないか、テーブル名やエイリアスを付けて参照しているか確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="cannot insert null",
        language_hint="SQL",
        description="NULL禁止カラムへNULLを保存しようとした可能性があります。",
        cause_candidate="必須値不足、default値未設定、request値不足の可能性があります。",
        check_point="NULL対象カラム、INSERT値、DB定義を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r'cannot insert NULL into \("(?P<schema_name>[^"]+)"\."(?P<table_name>[^"]+)"\."(?P<column_name>[^"]+)"\)'
            ),
            template="NULLを入れようとした対象は '{schema_name}.{table_name}.{column_name}' です。必須カラムに値が入っているか、INSERT文、フォーム入力、デフォルト値を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="check constraint failed",
        language_hint="SQL",
        description="DBで定義されたCHECK制約に違反する値を保存しようとした可能性があります。",
        cause_candidate="許可範囲外の値、禁止値、制約条件不一致の可能性があります。",
        check_point="CHECK制約、保存値、アプリ側の入力チェックを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"CHECK constraint failed: (?P<constraint_name>[A-Za-z0-9_.$]+)"
            ),
            template="CHECK制約違反になった対象は '{constraint_name}' です。入力値がDBで定義された条件を満たしているか、範囲、形式、必須条件を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="could not serialize access",
        language_hint="SQL",
        description="同時更新によりtransactionの整合性を保てなかった可能性があります。",
        cause_candidate="同時更新競合、transaction分離レベル、リトライ不足の可能性があります。",
        check_point="transaction処理、同時更新箇所、リトライ処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="current transaction is aborted",
        language_hint="SQL",
        description="Transaction失敗後に処理を継続しようとした可能性があります。",
        cause_candidate="Transaction内例外、rollback未実施の可能性があります。",
        check_point="直前エラー、transaction処理、rollback処理を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="database is locked",
        language_hint="SQL",
        description="DBが他の処理によりロックされている可能性があります。",
        cause_candidate="同時書き込み、transaction未終了、長時間処理の可能性があります。",
        check_point="同時実行処理、transaction、DB接続の閉じ忘れを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="disk full",
        language_hint="SQL",
        description="DB保存領域の空き容量が不足している可能性があります。",
        cause_candidate="DB容量不足、ログ肥大化、backup不足の可能性があります。",
        check_point="ディスク容量、DBサイズ、ログファイルを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="invalid identifier",
        language_hint="SQL",
        description="テーブル名やカラム名が正しくない可能性があります。",
        cause_candidate="カラム名誤り、alias誤り、大文字小文字不一致の可能性があります。",
        check_point="カラム名、テーブル定義、aliasを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(r'"(?P<identifier_name>[^"]+)": invalid identifier'),
            template="不正な識別子として扱われた名前は '{identifier_name}' です。カラム名、別名、テーブル定義、ダブルクォートによる大文字小文字の扱いを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="numeric value out of range",
        language_hint="SQL",
        description="カラムの数値範囲を超える値を保存しようとした可能性があります。",
        cause_candidate="int範囲超過、decimal桁数超過の可能性があります。",
        check_point="保存値、カラム型、桁数設定を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="operand should contain 1 column",
        language_hint="SQL",
        description="1列だけ必要な場所で複数列を返した可能性があります。",
        cause_candidate="subquery列数過多、SELECT項目誤りの可能性があります。",
        check_point="subquery、SELECT列数、比較式を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="ora-00001",
        language_hint="SQL",
        description="一意制約に違反する値を登録しようとした可能性があります。",
        cause_candidate="主キー重複、UNIQUEカラム重複、sequence不整合の可能性があります。",
        check_point="制約名、登録値、既存データ、sequence値を確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"ORA-00001: unique constraint \((?P<constraint_name>[^)]+)\) violated"
            ),
            template="一意制約違反になった制約は '{constraint_name}' です。同じ値が既に登録されていないか、INSERT/UPDATE対象の一意キーを確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="ora-00942",
        language_hint="SQL",
        description="指定したテーブルやViewが存在しない可能性があります。",
        cause_candidate="テーブル未作成、schema違い、権限不足の可能性があります。",
        check_point="テーブル名、schema、DB権限を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="ora-01017",
        language_hint="SQL",
        description="Oracleへのログイン認証に失敗した可能性があります。",
        cause_candidate="ユーザー名誤り、password誤り、接続先DB違いの可能性があります。",
        check_point="DBユーザー、password、接続先、接続文字列を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="ora-01722",
        language_hint="SQL",
        description="数値型へ変換できない値を使用した可能性があります。",
        cause_candidate="数値変換失敗、型不一致、不正文字列の可能性があります。",
        check_point="入力値、カラム型、CAST/TO_NUMBERを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="ora-12541",
        language_hint="SQL",
        description="Oracle Listenerへ接続できていない可能性があります。",
        cause_candidate="listener未起動、host/port誤り、接続先設定誤りの可能性があります。",
        check_point="listener状態、host、port、tnsnames設定を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="out of memory",
        language_hint="SQL",
        description="SQL処理に必要なメモリが不足した可能性があります。",
        cause_candidate="大量データ処理、query負荷過大、DBメモリ不足の可能性があります。",
        check_point="query内容、データ件数、DBメモリ設定を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="permission denied",
        language_hint="SQL",
        description="DB操作権限が不足している可能性があります。",
        cause_candidate="DB権限不足、schema権限不足、user設定不正の可能性があります。",
        check_point="DBユーザー権限、schema権限、実行SQLを確認してください。",
        hint_rule=HintRule(
            pattern=re.compile(
                r"permission denied for (?P<object_type>table|schema|database|sequence) (?P<object_name>[A-Za-z0-9_.$]+)"
            ),
            template="権限が拒否された対象は '{object_type} {object_name}' です。DBユーザーの権限、GRANT設定、接続先DB、スキーマ権限を確認してください。",
        ),
    ),
    AnalysisRule(
        keyword="subquery returns more than 1 row",
        language_hint="SQL",
        description="1件だけ必要な場所で複数行返された可能性があります。",
        cause_candidate="subquery条件不足、重複データの可能性があります。",
        check_point="subquery条件、LIMIT有無、DBデータを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="timeout expired",
        language_hint="SQL",
        description="SQL処理が制限時間内に完了しなかった可能性があります。",
        cause_candidate="重いquery、lock待機、DB負荷過多の可能性があります。",
        check_point="実行SQL、query実行時間、timeout設定を確認してください。",
        hint_rule=None,
    ),
]


COMMON_ANALYSIS_RULES: list[AnalysisRule] = [
    AnalysisRule(
        keyword="failed",
        language_hint="共通",
        description="処理に失敗したことを示す汎用的なエラーです。",
        cause_candidate="設定不足、接続失敗、入力値不正など複数の原因が考えられます。",
        check_point="failed の前後に表示されている詳細メッセージを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="fatal",
        language_hint="共通",
        description="処理を継続できない重大なエラーが発生した可能性があります。",
        cause_candidate="環境設定、依存関係、実行時状態に問題がある可能性があります。",
        check_point="fatal の後に続く詳細メッセージや直前のログを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="warning",
        language_hint="共通",
        description="処理は継続されているが注意が必要な状態の可能性があります。",
        cause_candidate="非推奨機能、設定不足、将来的な動作変更の可能性があります。",
        check_point="warning の内容と対象箇所を確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="exception",
        language_hint="共通",
        description="例外が発生して処理が止まった可能性があります。",
        cause_candidate="具体的な原因は例外名や周辺ログによって変わります。",
        check_point="exception の前後にある具体的な例外名やスタックトレースを確認してください。",
        hint_rule=None,
    ),
    AnalysisRule(
        keyword="error",
        language_hint="共通",
        description="何らかのエラーが発生したことを示す汎用的な行です。",
        cause_candidate="この行だけでは原因を断定できません。",
        check_point="error の前後にある具体的な例外名、失敗理由、行番号を確認してください。",
        hint_rule=None,
    ),
]
