Sync Guard
unlistedby takosasi-dev
Warn when a note suddenly loses lines, text, or headings after a sync or an outside edit. Never changes your notes.
Sync Guard
同期や、Obsidian の外からの書き込みで、ノートの行数・文字数・見出しが急に減ったときに、その端末で知らせる Obsidian プラグインです。ノートは 1 つも書き換えず、戻すこともしません(戻し方を示すだけです)。ノートの本文は読まず、Obsidian が作る索引(行数・文字数・見出し)だけを使います。ネットワークには出ません。PC でもモバイルでも動く作りですが、モバイルの実機ではまだ確かめていません。
入れただけでは知らせは出ません。 既定では閾値が全部空で、動き方は「記録だけ」です。知らせを出すには、設定で閾値を入れてから「動き方」を「通知する」にします(下の「閾値の入れ方と当たり方」)。
English summary is at the bottom.
できること
- 縮みの記録: ノートの行・文字・見出しが減るたびに、端末の中の記録に 1 行足す
- 知らせ: 「通知する」で閾値に当たると、自分で閉じるまで残る知らせを出す
- 詳細: 前と後の数、消えた見出しの一覧、戻し方の手順を見せる
- 未確認の一覧: まだ「確認した」を押していない縮みを一覧にする
- 記録のコピー: 記録をタブ区切りの表にしてクリップボードに出す(閾値を決める材料になる)
- 今すぐ比べる: 全部のノートを、今の状態で控えと比べる
- 起動時の比較(既定は OFF): Obsidian を閉じている間に縮んだノートを、起動の後に見つける
- 除外フォルダ: 見張らなくてよいフォルダを外す
向いている vault(前提)
ノートの形に決まりはありません。見るのは Markdown のノート(.md)だけです。複数の端末で同期している vault や、Obsidian の外(スクリプトや AI の道具など)からノートを書き換えることがある vault 向けです。Obsidian 1.14.4 以降が要ります。
ノートごとに、次の 3 つを「控え」として持ち、変わるたびに比べます。
# 買い物メモ
## 今週
- 牛乳
- 卵
- 行: 最後の段落が終わる行までの行数(上の例は 4。末尾の空行は数えない)
- 文字: 最後の段落の終わりまでの文字数
- 見出し: 見出しの並び(上の例は
# 買い物メモと## 今週の 2 つ)
既定の値(待ち時間・記録の上限など)は仮に置いた物です。設定で自分の vault に合わせて書き換えてください。
入れ方
BRAT で入れる(おすすめ)
- コミュニティプラグインの「BRAT」(Obsidian42 - BRAT)を入れて有効にする。
- BRAT の設定 → 「Add Beta plugin」に
takosasi-dev/sync-guardを入れる。 - コミュニティプラグインの一覧で「Sync Guard」を有効にする。
手で入れる
Releases から main.js・manifest.json・styles.css を落とし、vault の .obsidian/plugins/sync-guard/ に置いて、コミュニティプラグインの一覧で有効にします。
使い方
- 起動すると、除外の外の全部の md ノートの行数・文字数・見出しを控える
- ノートが変わるたびに控えと比べる。減っていたら、少し待って(既定 5 秒)比べ直し、まだ減っていれば記録に 1 行足す
- 動き方が「通知する」で閾値に当たると、知らせが出る。押すと詳細が開く
- 詳細の「戻し方」を見て、自分で戻す。済んだら「確認した(今の状態を控えにする)」を押す
閾値の入れ方と当たり方
- しばらく「記録だけ」で使い、「記録をコピー」で普段の減り方を見る(表計算ソフトに貼れる)
- 設定の「閾値(空なら使わない)」に値を入れる
- 「動き方」を「通知する」にする。閾値が 1 つも無いと「閾値が1つも決まっていないので「通知する」にできません」と出て、変わらない
- 行: 「減った量」と「減った割合」の両方が入っているときだけ使う。減った行数が量以上で、かつ 減った行数 ÷ 前の行数 が割合以上なら当たり
- 文字: 行と同じ決まり
- 見出し: 消えた見出しの数が「消えた見出しの数」以上なら当たり
- 3 つのどれか 1 つに当たれば知らせる。閾値を全部消すと「記録だけ」に戻る
値の例(テストで使った物):
| 項目 | 値 |
|---|---|
| 行: 減った量 | 20 |
| 行: 減った割合 | 0.2 |
| 文字: 減った量 | 1000 |
| 文字: 減った割合 | 0.2 |
| 消えた見出しの数 | 3 |
この値だと、100 行のノートが 75 行になる(25 行・25% 減)と当たります。300 行のノートが 270 行になる(30 行・10% 減)や、50 行のノートが 35 行になる(15 行・30% 減)は、行の項目では当たりません。自分の vault に合うかは、記録を見て決めてください。
コマンド
| コマンドパレットに出る名前 | すること |
|---|---|
| 未確認の縮みを一覧する | まだ「確認した」を押していない縮みの一覧を開く |
| 記録をコピー | 記録をタブ区切りの表にしてクリップボードに出す(「記録をコピーしました(12 行・変化の総数 340)」) |
| 今すぐ控えと比べる | 全部のノートを今の状態で比べる(「比べました: 120 件中、縮み 1 件」) |
| 控えを今の状態で取り直す | 確認の窓のあと、全部の控えを今の状態にする。未確認の縮みは全部、確認済みになる |
既定のホットキーはありません。
画面の見方
- 知らせ: 「縮んだノートがあります: メモ/A.md(行 50→20・文字 812→300・消えた見出し 6)。押すと詳細を開きます」。自分で閉じるまで残る
- 詳細: 検出の時刻と種類(変化・作り直し・起動時の比較・削除)、行・文字・見出しの「前」「後」「差」の表、「消えた見出し」の一覧、「戻し方」、ボタン「ノートを開く」「確認した(今の状態を控えにする)」
- 直前にこの端末で打っていたノートには、「この端末のエディタで 10 秒以内に変更がありました(参考)」が付く
- 一覧: 未確認の縮みが 1 行ずつ出る。押すと詳細。確認しないうちにさらに縮むと「その後 2 回縮んだ」が付く。無ければ「未確認の縮みはありません」
- 取り直しの確認の窓: 「すべてのノートの控えを今の状態で取り直します。未確認の縮み 1 件は確認済みになります」。ボタンは「やめる」「取り直す」
- 記録の表の列: 時刻・種類・パス・前後の行と文字と見出しの数・消えた見出しの数・エディタの参考・端末(desktop か mobile)・知らせたか
設定
| 項目 | 既定 | 内容 |
|---|---|---|
| 動き方 | 記録だけ | 「記録だけ」か「通知する」。閾値が 1 つも無い間は「通知する」にできない |
| 除外フォルダ | 空 | 1 行に 1 つ。vault からの相対パス。このフォルダの中のノートは控えも記録も作らない(Foo は Foo/ の中だけに効く) |
| 行: 減った量 | 空 | 減った行数の閾値 |
| 行: 減った割合 | 空 | 0 より大きく 1 以下。量と割合の両方が決まっているときだけ使う |
| 文字: 減った量 | 空 | 減った文字数の閾値 |
| 文字: 減った割合 | 空 | 0 より大きく 1 以下。量と割合の両方が決まっているときだけ使う |
| 消えた見出しの数 | 空 | 消えた見出しがこの数以上なら当たり |
| 落ち着くまで待つ(ミリ秒) | 5000 | 減りを見つけてから比べ直すまでの待ち。同期の途中の状態で知らせないため |
| エディタの参考に使う時間(ミリ秒) | 10000 | この時間のうちにこの端末で打っていたら、詳細に「参考」を付ける |
| 起動時に比べる | OFF | Obsidian を閉じている間に縮んだノートを、起動の後に見つける |
| 起動から比べるまで(ミリ秒) | 30000 | 「起動時に比べる」が ON のときの待ち |
| ノートが消えたときも通知する | OFF | 削除も知らせる(「通知する」で閾値があるときだけ)。OFF でも記録には載る |
| 記録の上限(行) | 2000 | 超えたら古い行から捨てる |
| ファイル復元の保存日数 | 7 | Obsidian の 設定 → ファイル復元 の値を写す。詳細の「期限の目安」にだけ使う |
安全のための決まり
- vault のファイルは 1 つも書き換えない(作る・消す・動かす・戻す、もしない)。ノートの本文も読まない
- 控え・記録・未確認の一覧は、
data.jsonではなく、端末ごとの保存(Obsidian がその端末・その vault のために持つ場所)に置く。同期で運ばれないので、端末ごとに別の記録になる- 中身は、ノートのパス・3 つの数・時刻と、未確認の検出の「消えた見出し」の文字。控えとして残すのは数だけ
- プラグインを無効にしても、この保存は消さない
data.jsonに入るのは設定だけ- クリップボードに書くのは「記録をコピー」のときだけ(記録の表。ノートのパスが入る)
- ネットワークに出ない。Node.js / Electron の機能を使わない(モバイルでも動く作り)
- 1 つのノートの処理で失敗しても、ほかのノートの見張りは続ける(失敗は開発者コンソールに出す)
- 端末の保存に書けないときは「端末に記録を残せません。再起動すると記録が消えます」と出て、動いている間だけ覚えて続ける
動作確認の状況
- 版 0.1.0。Windows の Obsidian 1.14.4 で動作を確認(既定の「記録だけ」では知らせが出ない。上の表の値を入れて「通知する」にし、ノートを Obsidian の外から書き換えて大きく縮めると、知らせ・一覧・記録に出た)
- iPhone・Android の実機は未確認(モバイル表示のエミュレーションで読み込みと表示まで確認)
- 本物の同期で届いた変更で知らせが出るか、端末の保存が再起動の後も残るか、起動時の比較、削除の知らせ、本物のクリップボードへのコピーは、Obsidian の上ではまだ確かめていない(動きの筋道は、作り物のノートを使ったテストで確認)
分かっている限界
- 自分の編集と外からの変更を区別しない。自分で大きく消しても、閾値に当たれば知らせが出る(「確認した」を押せば終わり)
- 戻さない。戻すのは Obsidian のファイル復元か、Sync の版の履歴。「戻し方」の文はその 2 つを使う前提で、画面の名前(Snapshots・View・Copy・Restore など)は英語のまま出る
- Obsidian を閉じている間の縮みは、既定では拾わない(「起動時に比べる」が OFF)。ON にしても、起動時の比較と削除では、消えた見出しの名前は出ない(「起動前の見出しは控えていません」)
- 待ち時間(既定 5 秒)のうちに元に戻った縮みは、記録も知らせもしない。起動の直後で索引がまだ無いノートは、最初の変化を控えにするだけで比べない
- 知らせが出たノートは、「確認した」を押すか、行と文字の両方が縮む前の数以上に戻るまで「未確認」のまま。その間にさらに縮んでも、記録に載るだけで知らせは増えない
- 「記録をコピー」が失敗しても、知らせは出ない
開発
npm install
npm run build # main.js を作る(型チェックつき)
npm test # vitest
npm run lint # eslint-plugin-obsidianmd
数え方・判定・見張りの流れは obsidian を import しない関数とクラスで、テストは作り物のノートと偽のタイマーだけを使います。
ライセンス
MIT。LICENSE を見てください。
English summary
Sync Guard warns you, on that device, when a note suddenly loses lines, text, or headings after a sync or an edit from outside Obsidian.
- Read-only: it never creates, changes, restores, or deletes anything in your vault, and it never reads note bodies. It uses only Obsidian's metadata cache (line count, character count, headings).
- It does not warn out of the box. All thresholds are empty and the mode is "record only". Enter thresholds, then switch the mode to "通知する" (notify).
- A lines or characters threshold needs both an amount and a ratio, and both must be met. A headings threshold is the number of vanished headings. Any one hit triggers a warning.
- Baselines, the record log, and unconfirmed detections are kept in per-device local storage, not in
data.json, so they are not synced.data.jsonholds settings only. - It does not restore anything; the detail view explains how to use Obsidian's File recovery and Sync version history.
- No network access. No Node.js or Electron APIs. The clipboard is written only by the "copy records" command (a TSV table).
- Install with BRAT:
takosasi-dev/sync-guard. Requires Obsidian 1.14.4 or later. The UI is Japanese only. - Tested on Windows desktop (Obsidian 1.14.4) only. Real phones and shrinkage caused by a real sync have not been tested yet.
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.