# dsh-quake-alert · QuakeAlert [English](./README.md) · [中文](./README.zh.md) · **日本語** > DeepSeek Harness(DSH)の災害アラートプラグインです。DSH を使っている間に、**日本**の地震・津波・気象災害に加えて、**世界**の地震(EMSC / USGS)と津波(NOAA)の情報をリアルタイムで受け取り、登録した地域としきい値に一致したときに、通知音・ページ内トースト・システム通知でお知らせします。 ⚠️ **免責事項(先にお読みください)**:アラートデータは [P2PQuake](https://www.p2pquake.net/)、気象庁の公開 XML 電文、[EMSC](https://www.seismicportal.eu/)、[USGS](https://earthquake.usgs.gov/)、[NOAA](https://www.tsunami.gov/) が提供または転送するものであり、いずれも公式の直接配信ではありません。緊急地震速報(EEW)をはじめ、内容および配信品質は保証されません。本プラグインの通知は**あくまで参考情報**です。避難の判断は、その地域の公式機関(気象庁 / 米国 NOAA など)の発表に必ず従ってください。本プラグインは DSH のページが開かれている間だけ動作します。 ## 主な機能 - **リアルタイム配信**:P2PQuake へ WebSocket で常時接続し、受信後すぐに解析します(EEW は気象庁の発表から P2PQuake の転送まで、通常は数百ミリ秒程度です)。 - **自動再接続**:指数バックオフ(1 秒 → 最大 60 秒)。P2PQuake は約 10 分ごとに強制的に切断するため、再接続は正常な動作であり操作は不要です。2 種類の「静かな失敗」を検出して復帰します:接続が 15 秒たっても `onopen` にならない場合と、接続後に長時間まったくデータが届かない場合(ハーフオープン:`onclose` もメッセージも来ない、20 分)です。 - **対象とする災害**:P2PQuake からの地震情報(551)・緊急地震速報 EEW(556)・津波予報(552)に加え、**気象庁の防災情報 XML から**土砂災害(土砂災害警戒情報、大雨警報(土砂災害))・洪水(指定河川洪水予報)・大雨・高潮を扱います。 - **対象地域**:**国・地域**ごとに 3 段階で指定します。①「日本」は都道府県(任意で市区町村まで)②「中国大陸」は省 → 地級市 ③「その他の地域」は座標 + 半径。日本の都道府県を未選択の場合は全国を対象にします。 - **中国大陸の地震(0.5.0)**:中国地震台網(CENC)の**地震速報**(秒単位の緊急地震速報に相当、Wolfx 経由)と**地震情報**(分単位の確認・補報)に対応します。中国側のソースは地域別震度を持たないため、「震央 + 半径」で判定します。設定で自分の都市を選ぶだけで、緯度経度は不要です。情報側のしきい値は別のつまみ(既定 M4.5)で、M2.5 の微小地震で埋もれないようにしています。 - **中国大陸の気象災害(0.5.2)**:中央気象台(国家気象センター)が集約する**大雨**・**地質災害**の警報信号(各級の気象台が発表、粒度は県まで)。この 2 種類は**オレンジ以上のみ通知**し、黄・青は履歴に残すだけです。判定は行政区の階層(選択した省 / 地級市)で行い、半径は使いません。警報は期限が切れると一覧から消えるだけです —— **データソースに「解除」のフラグがない**ため、「取消が届かない」ことは「警報がまだ有効」を意味しません。 - **半径は意味のある段階で指定**:地元のみ(約 30 km)/市内とその周辺(約 100 km、新規登録時の既定)/広い範囲(約 300 km)。キロメートル数を直接入力することもできます。 - **世界の地震・津波(0.4.0)**:EMSC の WebSocket リアルタイム配信と USGS の世界地震カタログ(Host 側が唯一の取得元としてポーリング)で世界の地震をカバーし、NOAA の津波 CAP 電文で太平洋などの海域をカバーします。同じ地震が 2 つのソースから届いた場合は「発震時刻 + 震央」で名寄せし、通知は 1 回だけです。 - **世界の関心地点**:気になる場所を「座標 + 半径」で登録します(最大 20 件、ブラウザの位置情報からワンクリックで入力できます)。震央が半径内に入り、かつマグニチュードが世界しきい値(既定 M4.5、変更可)に達したときだけ通知します。日本の地震・津波はこの設定の影響を受けず、これまでどおり都道府県で判定します。関心地点を 1 件も登録していない場合、世界ソースと中国大陸ソースのメッセージは通知もされず、履歴にも残りません。 - **通知しきい値**:地震は観測震度、EEW は予測震度、津波は等級(注意報 / 警報 / 大津波警報)ごとに設定できます。 - **通知方法**:通知音(Web Audio による合成音。地震 / EEW / 津波 / 気象 / 解除でそれぞれ音色が異なります)と音量調整。ページが表示中ならトースト、バックグラウンドならシステム通知。地震と EEW の通知本文には震度(実測または予測)が入るため、強さが一目で分かります。 - **取消・解除の通知**:通知済みの EEW が取消になった場合、または通知済みの津波予報が解除された場合は、下降音で「先のアラートは無効」とお知らせします。通知していないイベントの取消は履歴に記録するだけで、通知はしません。 - **サイレント時間帯**:毎日決まった時間帯は通知しません(ブラウザのローカル時刻。開始が終了より遅い場合は日付をまたぎます)。赤レベル(EEW・津波警報以上・震度6弱以上の地震・警戒レベル4 以上の気象警報)は既定で貫通します(オフにもできます)。抑制されたアラートは履歴に残ります。 - **気象警報は警戒レベル4 以上のみ通知**:気象庁はすべての気象電文に警戒レベルを明示しています。通知するのは L4 以上(「避難指示」相当)だけです。L1〜L3 も取得・解析して履歴に残しますが、L3 が一致した場合はサイドバーのツールチップに 1 行追加されるだけです。詳しくは[警戒レベル表](#警戒レベル日本)を参照してください。 - **接続状態インジケーター**:サイドバー下部のステータスドット(緑=接続済み / 黄=接続・再接続中 / 赤=停止)。ホバーで詳細を表示します。 - **マシン単位の永続化**:設定は Host の settings サービス経由で DSH の `settings.yaml` に保存され、ブラウザやマシンをまたいで保持されます。ブラウザの localStorage はミラー兼、settings サービスが使えないときのフォールバックとして残ります。初回起動時に既存のローカル設定を一度だけ Host へ移行します。 - **市区町村単位の絞り込み**:地震情報を市・区・町・村まで絞り込めます。都道府県ごとの検索可能なリスト(1,917 件)から選択します。観測点名はまず所属する市区町村に正規化するため、公式のさまざまな表記(大阪北区茶屋町→大阪市北区、福島伊達市→伊達市、渡島北斗市→北斗市)が一致します。この粒度があるのは実測震度の観測点のみで、EEW と津波は都道府県単位のままです。正規化できない観測点は取りこぼさず一致扱いにします。 - **データソース切替**:本番(リアルタイム)とサンドボックス(2023 年の履歴を約 30 秒に 1 件再生。テスト用)。 - **重複通知の抑制**:同じ地震の複数発表(震度速報 → 各地の震度、EEW の続報)は 1 回だけ通知し、震度が引き上げられたときのみ再通知します。DSH のページを複数開いても、通知音が鳴るのは 1 つのタブだけです。 - **履歴**:直近 30 件の処理記録(しきい値に達せず通知しなかったものも含みます)。項目をクリックすると詳細が展開されます。 ## 動作の仕組み ``` P2PQuake WebSocket ──┐ (日本:地震 / EEW / 津波、Client が直接接続) EMSC WebSocket ──────┤ (世界:地震、Client が直接接続) ├──▶ パーサー(→ 統一アラートオブジェクト) 気象庁 Atom フィード ─┤ (日本:土砂災害 / 洪水 / 大雨 / 高潮) USGS GeoJSON ────────┤ (世界:地震カタログ) Host がポーリング、Client はローカル差分ルートを読む NOAA CAP ────────────┘ (世界:津波) │ ▼ マッチャー(行政区 × しきい値 / 座標 + 半径) │ 一致 ▼ 通知:通知音 + トースト(前面)/ システム通知(背面) │ ▼ 直近のアラート履歴(localStorage に保存) ``` - リアルタイム処理はすべてブラウザ側(Client 側)で動作します。WebSocket 接続・解析・マッチング・通知・履歴がこれにあたります。Host 側は `quake-alert` settings 名前空間(マシン単位の `settings.yaml`)の登録、読み取り専用ルート `/dsh-quake-alert/areas` での市区町村表と河川予報区域表の配信、そして 3 つのポーリングソースのフィード取得を担当します。 - **2 本のリアルタイム経路(Client が直接接続)**:P2PQuake(日本、秒単位)と EMSC(世界)です。世界の地震の配信頻度は日本よりずっと低く、M4 以上でも平均 30 分に 1 件程度です。そのため EMSC の接続では**「長時間データが届かない場合の検出」に意図的に長いしきい値(3 時間)を使っています**。そうしないと、まったく正常な接続を繰り返し切断・再接続してしまいます。実際の切断は `onclose` と接続時ウォッチドッグが捉えます。 - **3 つのポーリングソース(Host 側が唯一の取得元)**:気象庁 Atom フィード(土砂災害 / 洪水 / 大雨 / 高潮、約 1 分ごと)、USGS GeoJSON(世界の地震カタログ、2 分ごと)、NOAA のイベント一覧 + CAP 電文(津波、5 分ごと)です。Host は取得済みの entry を記憶し、差分をローカルの読み取り専用ルート `/dsh-quake-alert/feed?source=jma|usgs|noaa&since=N` で公開します。Client は 15 秒ごとにそれを読み、各電文を **P2PQuake のメッセージと同じ** `handleAlert` に渡します。外部へのリクエスト元を Host だけにすることで、DSH のタブやウィンドウを複数開いてもリクエストは増えません。気象庁は取得済みファイルの再取得を明確に禁じており、違反した IP は遮断されます。Client はソースごとにカーソルを永続化するため、再読み込みしても続きから再開し、バッファ内の古い警報を再生しません。初回(カーソル未保存)は `?since=tail` で現在位置に合わせるだけで、履歴は再生しません。 - **2 つの監視モードが併存します**:日本ソースは「都道府県 +(任意で)市区町村」で判定します。世界ソースは震央座標しか持たないため、「関心地点 + 半径」を球面距離(Haversine)で判定します。マグニチュードと震度は換算できないため、世界ソースには専用のしきい値(既定 M4.5)があります。 - WebSocket のメッセージは HTTP `/history` と同じ内容ですが、id フィールド名が異なります(WS は `_id`)。パーサーは両方に対応しています。 - 地域名の正規化:EEW / 津波メッセージの地域名(`上川地方北部` や `東京湾内湾` など)は、明示的な地域テーブル → 47 都道府県名の前方一致 → EEW の府県予報区名、の順で解決します。これにより、ある県を登録していればその県のアラートを確実に受け取れます。複数の県にまたがる地域(`有明・八代海` など)は県ごとに展開して判定します。気象庁の電文では都道府県を**地域コードの先頭 2 桁**(これが都道府県コードです)から取ります。名称は 25 例が県をまたいで重複しているため、名前より確実です。河川予報区域は生成した対応表で市区町村に変換します。 - 3 層の重複排除:① メッセージ id(再接続時の再送を防止)② イベントキー(同じ地震の複数発表。震度が上がった場合は通過して再通知)③ タブ間(`BroadcastChannel` により 1 つのページだけが通知)。 - サイレント時間帯は一致判定の後に評価します。抑制されたアラートも理由付きで履歴に残り、赤レベルは既定で貫通します。 ## インストール ```sh # GitHub から直接 dsh plugin --profile web add github:MurasakiIzumi/dsh-quake-alert # dsh web を再起動するとプラグインが有効になります ``` **アップデート**:パッケージを差し替えて `dsh web` を再起動します。Client 側(`client/`)だけの変更はページの再読み込みで反映されますが、`lib/`(Host 側)の変更には再起動が必要です。 ## 使い方 1. **設定 → 灾害预警**(災害アラート)を開きます。 2. **① 日本:都道府県 / 市区町村**:お住まい、または気になる都道府県を選びます(未選択=全国)。 3. **② 中国大陸:省 / 地級市**(0.5.0):省 → 市 → 半径 を選び、「この都市を追加」を押します。「現在地を使用」でブラウザの位置情報から直接追加することもできます(精度が不十分な場合がある旨を明示します)。表の座標は**行政区の中心点**です —— 面積の非常に大きい州・市(ガルゼ、ハルビンなど)では市街地から 100 km 以上離れることがあるため、端にお住まいの場合は半径を広げてください。 4. **通知しきい値**:地震 / EEW / 津波それぞれの最低通知レベルを設定し、不要な通知を減らします。中国大陸の地震情報には専用のしきい値があります。 5. **③ その他の地域:座標 + 半径**(0.4.0):東南アジア・欧米などが気になる場合は、ここで「名称 + 緯度 + 経度 + 半径」を登録します(最大 20 件)。「現在地を使用」を押すと、ブラウザの位置情報から座標をワンクリックで入力できます。震央が半径内に入り、かつマグニチュードが「世界の地震(最低マグニチュード)」に達したときだけ通知します。関心地点を 1 件も登録していない場合、世界ソースと中国大陸ソースのメッセージは通知もされず、履歴にも残りません。ここで入力した座標と、手順 3 で追加した都市は**同じ 1 つのリスト**です。 - この経路をすぐ確認したいときは、同じ区域の下にある「**テスト世界アラートを送信(シナリオ切替)**」を押します。EMSC / USGS / NOAA の 3 種類の**ソース形式そのまま**の電文をローカルで組み立て、実際のパーサーとマッチングを通します。**ネットワーク通信は一切発生しない**ため、何度でも押せます。4 つのシナリオが順に切り替わり、「遠地の地震」は約 550km 離れた場所にあり(半径がそれより小さいと不一致、大きいと一致)、半径の効き方を示します。結果は実際の通知状況をそのまま表示します。 - 「**世界ソースの状態**」には EMSC の接続状態と、気象庁 / USGS / NOAA の 3 つのポーリングソースがそれぞれ何件の差分を受け取ったか、最後の取得が何秒前かが表示されます。経路が生きているかの確認用です(世界の地震はそもそも頻度が低く、何も届かないのは正常な状態です)。 6. **対象とする災害**:3 つのスイッチ —— 地震 / 緊急地震速報、津波、気象災害(土砂災害 / 洪水 / 大雨 / 高潮)。気象災害にはしきい値がありません。警戒レベル4 以上のみ通知する固定動作です。「**テスト気象警報を送信(シナリオ切替)**」はローカルで組み立てた電文で経路全体を確認できます(ネットワーク通信は発生しません)。クリックごとに土砂災害 / 洪水 / 大雨 / 高潮、そして意図的に無音の L3 シナリオへ切り替わります。結果は、実際に通知したか、しなかった場合はその理由をそのまま表示します。 7. **通知と音**:通知音・システム通知を有効にし、音量を調整します。「試聴」ボタンで音色を確認し、「テストシステム通知」で許可と動作を確認できます。 8. **データソース**:通常は「正式」のままにします。経路の確認や動作を見たいときは「サンドボックス」に切り替えます(約 30 秒に 1 件、2023 年の履歴を再生)。 アラートが一致すると、通知音とともに、前面ならトースト、背面ならシステム通知が表示され、「最近のアラート」に記録されます。 ## ソースに接続できない場合(中国本土のネットワーク) 中国本土のネットワークでは、いずれかのデータソースに接続できない・更新が止まる・通知が鳴らない、 といった症状が出ることがあります。これらは本土のネットワークでしか再現せず、開発機の出口は日本に あるため事前検証できません。そこで本プラグインは故障を**見える状態**にし、**AI に読ませる**ための トラブルシューティング文書を用意しています(中国語のみ。読み手が本土のユーザーに限られるため)。 > **[`TROUBLESHOOTING.zh.md`](./TROUBLESHOOTING.zh.md) を AI アシスタントに渡し、手順どおりに > 処理させてください。** この文書は原理を説明せず、「メニューを開いて確認してください」とも言いません。各節は 「トリガー → 実際に実行できるコマンド / 実際に読める状態 → 結果に応じた対処」で構成されています。 AI はネットワークを直せません。AI の役割は**故障の種類を判定**し、**影響範囲**(どの経路が生きて いるか)を明示し、降格できる経路があればそれを選ぶこと。そして「これはあなたには直せない」と はっきり伝えることです。 日常の自己確認にこの文書は不要です。**設定 → 災害アラート → ソース状態** に、各ソースの接続状態・ 受信した増分・失敗回数・増分の欠落・最終取得からの経過が並びます。サイドバー下部の状態ドットを ホバーしても同じ内容(異常のあるソースのみ)を確認できます。 ## 0.4.1 以降の挙動の変更 - **帰属県を特定できない地域の絞り込みが厳密になりました(0.4.2 で調整)。** 同じメッセージ内に 県へ解決できる地域が 1 つでもある場合、解決できない地域は県フィルタに参加しません(未収録の 予報区名が 1 つあるだけで全ユーザーに通知されることがなくなりました)。**すべて**の地域が 解決できない場合のみ通過させます(見逃しより過剰通知を選ぶ方針)。 - **気象災害は「気象台 + 災種」単位で 3 時間のイベント窓にまとめます。** 同じ気象台からの更新・ 区域拡大・継続は 1 回だけ通知し、強度の上昇(L3→L4 など)は再度通知します。時間帯の境界をまたぐ 場合や、同一現象を別の気象台が発表した場合は 2 回通知することがあります(1 回多く鳴らす方を選び、 見逃しを避ける方針)。 - **L4 のゲートは「一致した地域自身のレベル」を見ます**(電文全体の最大値ではありません)。 実例(2026-09-14 兵庫県)では姫路市が L4、相生市が L3、西脇市が L2 で、西脇市だけを關注している 場合に「避難指示級」という誇張された通知が出ることはなくなりました。 - **津波の解除は、電文が予報区の一覧を示している場合のみ一致します。** 一覧のない解除は履歴には 残しますが通知しません(別の海域の解除を自分の事象として伝える「偽の安全」を避けるため)。 - **世界の地震はマグニチュードで重大度を判定します**(EMSC / USGS に震度はありません)。 そのため静音時間帯の赤レベル貫通は M7 以上の世界の地震にも適用されます。 - **「応答はあるがデータが古い」は独立した状態**(中灰)として表示します。JMA のフィード更新時刻や USGS の生成時刻がしきい値を超えると「上流データが期限切れ」となり、「ニュースがない」状態と 区別できます。データ形式の異常は青で表示され、それはユーザーのネットワークの問題ではありません。 - **P2PQuake の時刻は JST からローカルタイムゾーンに変換して表示します**(従来は生の JST 文字列で、 中国本土のユーザーには 1 時間ずれたラベルのない時刻が見えていました)。 ## 既知の制限 - プラグインは DSH のページとともに動作します。ページを閉じると停止し、ブラウザがバックグラウンドのタブを抑制すると通知が遅れる場合があります。 - 取消・解除の通知は、以前に通知したイベントだけが対象です。通知していない取消メッセージは履歴に残るだけで、通知はしません。 - 津波予報(552)には統合できるイベント id がないため、同じ津波の続報(区域追加・等級引き上げ)はその都度通知されます。 - DSH のページを複数開くと、ページごとに **2 本**の WebSocket 接続(P2PQuake と EMSC)を保持します。通知は BroadcastChannel で重複排除されますが、接続数はタブの数だけ増えていきます。P2PQuake には同時接続数の制限があるため、大量に開く場合はご注意ください。 - 複数の DSH ページは**ソースごとのカーソルを共有**します(ソースごとに 1 つ、ページ間で共有)。あるページが処理済みの電文・地震は別のページで再生されません(タブ間の重複排除により、通知するのは常に 1 ページだけです)。代わりに、後から開いた/再読み込みしたページの「最近のアラート」には、すでに消費されたこれらの項目は追加されません。 - 震源情報(551 の「震源情報」「遠地地震」)には震度データが含まれないため、しきい値で判定できません。「最近のアラート」に説明付きで記録されるだけです。 - システム通知の許可は、初回に「テストシステム通知」から行う必要があります。通知音はブラウザの自動再生ポリシーにより、一度ユーザー操作が必要です。 - **カバー範囲**:日本の地震 / EEW / 津波は P2PQuake の WebSocket 配信、気象災害は気象庁の Atom フィード(Host 側が約 1 分ごとにポーリング)から取得します。日本以外は EMSC(リアルタイム配信)、USGS(Host 側が 2 分ごとに地震カタログをポーリング)、NOAA(Host 側が 5 分ごとに津波 CAP をポーリング)がカバーします。**中国大陸**の地震は Wolfx が中継する CENC(中国地震台網)から取得し、Host 側がソースごとに 1 本の常時接続を保持して SSE でページへ配信します。中国大陸の気象警報は別途 nmc.cn の警報信号一覧(Host 側が 120 秒ごとにポーリング)から取得し、接続するのは大雨と地質災害の 2 種類だけです。地域別の気象ソース(米国 NWS、欧州 MeteoAlarm など)は今後のバージョンで計画しています。 - **世界ソースの粒度は日本ソースと異なります**:世界ソースは震央座標とマグニチュードだけで、市区町村単位の情報はありません。津波は NOAA の海域(`SCOTIA SEA` など)単位で、日本の津波予報区とは異なります。日本以外の「土砂災害 / 洪水」は現在のところ取得経路がありません。 - **同じ地震が 2 つの世界ソースからそれぞれ通知される場合があります**:EMSC と USGS で発震時刻が分をまたぐと名寄せに失敗します。取りこぼしより多重通知を選ぶという判断です。 - **中国大陸ソースには取消・最終報のフラグがありません(安全に関わる制約)**:CENC の 2 系統には「取消」も「最終報」も存在しないため、**すでに通知した警報が上流で取り消し・改訂されても、プラグインは「警報は無効になりました」という追記を送れません**。日本の EEW / 津波にある取消の経路は中国大陸ソースには適用できません。これはデータソース側の欠落であり、実装では埋められません。受信した内容は CENC の公式発表を優先してください。 - **中国大陸の気象ソースにも「解除」のフラグがなく、オレンジ警報はサイレント時間帯を貫通しません**:nmc.cn の警報は「現在有効な集合」で、期限が切れると一覧から消えるだけです。プラグインは「解除」という動作を見ることができないため、以前に通知した大雨 / 地質災害の警報が期限切れになっても「警報は無効になりました」という追記は出しません。またオレンジの重大度は公式の等級どおりにマッピングしており(オレンジ ≠ 赤)、サイレント時間帯は既定で赤のみを通すため、夜間に発表されたオレンジ警報は「最近のアラート」に残るだけです。 - **中国大陸の地震速報(EEW)のしきい値は M4.0 前後**:警報自体が希薄(実測で数日に 1 回)なため、日本に比べて通知は明らかに少なくなります。速報(毎日データがある)には専用のマグニチュードしきい値があり、既定は M4.5 で設定画面から変更できます。 - **中国大陸ソースの配信は降格されることがあります**:ページは SSE の常時接続(遅延は秒単位)を使いますが、ネットワーク中間機器に切られた場合(EventSource が使えない / 初回フレームが繰り返し届かない / 接続できても配信されない)は、自動的に 15 秒間隔のポーリングへ降格し、設定画面の「ソース状態」にどちらの経路かを表示します。設定でポーリングを強制することもできます。 - **中国大陸の警報と速報は独立した 2 系統です**:同じ地震を両方が報じた場合は「発震時刻(分)+ 震央(0.1°)」で名寄せして 1 回だけ通知します。分をまたぐ、または震央の測定差が 0.1° を超えると名寄せに失敗し、同じ地震が 2 回通知されることがあります。世界ソースと同じ判断で、取りこぼしより多重通知を選びます。 - **EMSC の接続では「長時間データが届かない場合の検出」に長いしきい値(3 時間)を使います**:世界の M4 以上は平均 30 分に 1 件程度で、メッセージ間隔から接続の死活は判断できません。実際の切断は検出して再接続します。 - 気象警報はしきい値をあえて設けていません。境界は警戒レベル4 に固定で、設定画面にはオン / オフのスイッチしかありません。 - サンドボックスで再生される履歴は震度の低い小規模な地震が大半のため、既定の「震度 4 以上」では長時間一致しないことがありますが、これは正常な動作です。 ## 警戒レベル(日本) 気象庁はすべての気象電文に警戒レベルを明示しています。本プラグインが通知するのは**警戒レベル4 以上のみ**です。 | レベル | 日本の意味 | 代表的な電文 | 本プラグインの動作 | | ------ | -------------------- | ---------------------------------------------------------- | ---------------------------------------------------------------- | | 1 | 心構えを高める | 早期注意情報 | 履歴のみ | | 2 | ハザードマップを確認 | 大雨注意報・洪水注意報(レベル2…) | 履歴のみ | | 3 | 高齢者等が避難を開始 | 大雨警報(土砂災害)・洪水警報(レベル3…) | **サイドバーのツールチップのみ** —— 音もポップアップも出しません | | **4** | **避難指示** | 土砂災害警戒情報・氾濫危険情報・大雨危険警報・高潮危険警報 | **通知** —— 通知音 + トースト / システム通知 | | **5** | 緊急安全確保 | 大雨特別警報・氾濫発生情報 | **通知** | 境界を 4 にした理由:L1〜L2 が求める行動は「ハザードマップの確認」で、デスクトップのポップアップでは担えません。L3 は高齢者など早めの避難が必要な方向けで、DSH の利用場面とは合いません。L4 こそが人の生命・財産に関わる等級で、気象庁が「避難指示」と位置づけるレベルです。L1〜L3 も取得・解析して「最近のアラート」に記録するため、プラグインが受信していたことはいつでも確認できます。 ## 開発 ``` client/src/*.js # クライアント側ソース:標準 ESM モジュール 19 個(明示的な import/export、各先頭に役割と依存) client/client.js # DSH 用の単一ファイル bundle —— rollup が生成。直接編集しない lib/index.js # Host 側:settings 名前空間(schemastery)+ /areas・/feed 読み取り専用ルート lib/poller.js # Host 側:汎用 feed ポーラー(entry の重複排除・リングバッファ・カーソル。単段・二段のソースに対応) lib/global-sources.js # Host 側:USGS / NOAA の feed 解析と URL(気象庁のパーサーは poller の既定値のまま) lib/data/cities.js # 市区町村表(公開データから生成。ブラウザ側へ配信) lib/data/river-areas.js # 河川予報区域 → 市区町村(build-areas.mjs が生成) scripts/build-client.mjs # rollup で client/src を client/client.js にバンドル scripts/build-areas.mjs # 気象庁の公開 zip から河川区域表を再生成 scripts/lib/zip.mjs # 依存ゼロの zip リーダー(ビルドスクリプト共用) scripts/check-imports.mjs # モジュール間参照チェック(import 漏れ・未宣言への代入を検出) cordis.patch.yml # プラグイン行の insert 宣言 tests/sync-test.cjs # 回帰テスト:パーサー / マッチャー / 地域名正規化 / Host ポーラー / 差分取得 / WebSocket 状態機械(node で直接実行、ブラウザ不要) tests/area-tables.cjs # 気象庁の地域名・津波予報区 → 期待される都道府県(テストデータ) ``` ```sh node scripts/build-client.mjs # client/src を編集したら再バンドル node scripts/build-areas.mjs # 気象庁の公開 zip から河川区域表を再生成(要ネットワーク) node scripts/check-imports.mjs # モジュール間参照チェック(import 漏れ・未宣言への代入) node scripts/build-client.mjs --check # コミット済み bundle が古い場合に失敗 node tests/sync-test.cjs # 回帰テスト(1070 項目) node scripts/check-contracts.mjs # 契約チェック:実ソースを取得してパーサーに通し、上流の改版を検出(--offline は samples/ のスナップショットを使用、ネットワーク不要) ``` > **注意**:`tests/sync-test.cjs` が読み込むのは**ビルド済み**の `client/client.js` です。 > `client/src/` を編集したら必ず先に `node scripts/build-client.mjs` を実行してください > (そうしないと前回ビルドの結果を見ることになります)。まとめて実行するなら > `node scripts/build-client.mjs && node tests/sync-test.cjs`。 > > Windows で `pnpm` が「pnpm.ps1 を読み込めません(スクリプト実行が無効)」と出る場合は > `pnpm.cmd check` / `pnpm.cmd test`(または `npx pnpm check`)を使ってください。 > クライアント側のコードは `client/src/*.js` を編集してください。**`client/client.js` は直接編集しません**—— > DSH はクライアント bundle を単一ファイルとして要求するため(フラットなモジュールグラフ:1 bundle = 1 モジュールノード、 > パッケージ内の複数ファイル import は不可)、ESM モジュールはビルド時に rollup でバンドルされます。 > これは DSH 公式プラグインと同じ形態です(配布物はビルド成果物のみ、ソースは複数ファイル)。 > `samples/` と `tests/` はリポジトリに含まれます(外部依存もネットワークアクセスもないプレーンテキストのテスト資産)。クローン後すぐに上記の回帰テストを実行できます。npm パッケージには含まれません(`package.json` の `files` に未記載)。`DESIGN.md` は内部の設計資料です(git 管理外)。 ## 更新履歴 現在のバージョンは **0.5.4** です(レビュー版:表示状態を単一の合成入口にまとめ、定期的な再接続や 停更プローブで「データ形式異常」の青ドットが消えなくなりました。タブをまたいだ履歴の消去が 本当に消えるようになり、JMA の総括電文は実際にレベル 5 のときだけ「特別警報」と表示されます。 CI も契約セルフチェックだけでなく回帰スイートを実行します)。回帰アサーションは 1070 → 1103。各バージョンの詳細は [CHANGELOG.md](./CHANGELOG.md) を参照してください。 ## データ出典 - 地震・津波の情報:[P2PQuake](https://www.p2pquake.net/)(気象庁データの転送、WebSocket 配信) - 気象災害の警報(土砂災害 / 洪水 / 大雨 / 高潮):気象庁[防災情報XML](https://xml.kishou.go.jp/)の Atom フィード(`extra.xml`、毎分更新)を Host 側が取得します。河川予報区域 → 市区町村の表(`lib/data/river-areas.js`)は、気象庁「指定河川洪水予報区域と市区町村に関するCSVファイル」を加工したものです。 - 中国大陸の気象警報(大雨 / 地質災害):[中央気象台](https://www.nmc.cn/)の警報信号一覧(`rest/findAlarm`、Host 側が 120 秒ごとにポーリング)。発表主体は各級の気象台で、詳細ページの本文は別途取得します。 - 世界の地震:[EMSC](https://www.seismicportal.eu/)(WebSocket によるリアルタイム配信)と [USGS](https://earthquake.usgs.gov/)(GeoJSON サマリー、Host 側がポーリング) - 世界の津波:[NOAA / 太平洋津波警報センター](https://www.tsunami.gov/)(CAP 1.2 電文、Host 側がポーリング) - 市区町村表(`lib/data/cities.js`):総務省「都道府県コード及び市区町村コード」(公共データ利用規約 第1.0版)と [jp-local-gov](https://github.com/hideo54/jp-local-gov)(MIT)の政令指定都市の行政区を統合・加工したものです。 ## License MIT © XuZhichao