仕組み
dotweaveの動作原理と設計思想について。
内部の仕組みを理解すると、dotweaveの動作が予測しやすくなります。 このガイドでは、メンタルモデル、pushとpullのデータフロー、そして 設計上の判断について説明します。
メンタルモデル
Section titled “メンタルモデル”dotweaveは、ローカルの設定ファイルとGitで管理されるsyncディレクトリの間の 双方向ミラーと考えてください:
- 作業中はローカルファイルが正規データです。
- syncディレクトリはミラーで、Gitリモートにpushして別のマシンで pullできます。
dotweaveはファイルを勝手に変更しません — pushでミラーを更新するか、pullで
ミラーからの変更を適用するか、明示的に実行します。
データフロー
Section titled “データフロー”エディタ → ローカルファイル → dotweave push → syncディレクトリ → git push → リモート ↓別のマシン ← dotweave pull ← syncディレクトリ ← git pull ← リモート2つの独立した操作があります。Gitによる転送はその間に位置しますが、 すべて自分でコントロールします。
pushフロー
Section titled “pushフロー”-
manifest.jsoncを読み込む — dotweaveが設定ファイルを読み取り、 すべてのトラッキングファイルとその設定を把握します。 -
ローカルファイルを走査する — 各エントリについて、現在のプラットフォームの 解決済み
localPathにあるファイルを読み取ります。 -
既存のアーティファクトと比較する — syncディレクトリのファイルがすでに 同一であれば、何も書き込みません。
-
シークレットを暗号化する — secretとマークされたエントリは、書き込み前に ageで暗号化されます。
-
アーティファクトを書き込む — (暗号化されている場合もある)内容が syncディレクトリ内の
repoPathに書き込まれます。
pullフロー
Section titled “pullフロー”-
manifest.jsoncを読み込む — 同じ設定ファイル、同じ解決ロジックです。 -
アーティファクトを読み取る — dotweaveがsyncディレクトリから各ファイルを 読み取ります。
-
シークレットを復号する — 暗号化されたファイルはローカルのageキーで 復号されます。
-
ローカルパスに書き込む — 内容が解決済みの
localPathに書き込まれます。 -
パーミッションを適用する — 設定ファイルに記録されたファイルパーミッションが 復元され、意図せずファイルが誰でも読める状態になることを防ぎます。
設計上の判断
Section titled “設計上の判断”ローカルファースト
Section titled “ローカルファースト”エディタはディスク上の実際のファイルに書き込み、dotweaveはそのファイルを読み取ります。 データベースもデーモンもバックグラウンドウォッチャーもありません。同期のタイミングは 自分で決めます。
シンボリックリンクなし
Section titled “シンボリックリンクなし”一部のdotfileマネージャーは、設定ファイルをリポジトリへのシンボリックリンクに 置き換えます。dotweaveは意図的にファイルをコピーします。これにより、パーミッションの 問題、ファイルシステム間の問題、シンボリックリンクを辿らないツールによる想定外の動作を 回避します。
age暗号化
Section titled “age暗号化”シークレットはsyncディレクトリ内でageを 使って保存時に暗号化されます。ageはそのシンプルさから選ばれました — 単一のキーファイル、 キーサーバー不要、有効期限管理不要。プライベートキーがマシンの外に出ることはありません。
Gitをトランスポートとして活用
Section titled “Gitをトランスポートとして活用”dotweaveは独自の同期プロトコルを発明するのではなく、Gitに乗っかっています。 ブランチ、履歴、マージコンフリクトツール、そしてホスティング(GitHub、GitLabなど)が そのまま使えます。
syncディレクトリの構造
Section titled “syncディレクトリの構造”syncディレクトリは予測可能なレイアウトの通常のGitリポジトリです。 詳細についてはディレクトリ構造ガイドをご覧ください。
概要:
~/dotfiles/ ← syncディレクトリのルート(Gitリポジトリ)├── manifest.jsonc ← トラッキングファイル一覧の設定ファイル├── .age-key ← ageプライベートキー(git-ignored)├── .age-recipients ← 暗号化用のage公開鍵└── ... ← dotweave pushで書き込まれるアーティファクト