バックアップ・移行(Export / Import)
別のコンピューターへBlyckを移すとき(例: Windows ノート → macOS Mac mini)、userData フォルダを手動コピーすると、チャットが旧PCの絶対パスを指し、シークレットはOSキーチェーンに縛られて解けず、OS依存バイナリは動きません。
バックアップ・移行は、ボタン一つで荷造りし(export)解き(import)、解くときにパスを自動変換してチャット履歴をそのまま引き継ぎます。Win↔Mac 4方向すべてで動作します。
なぜ手動コピーが壊れるのか
Section titled “なぜ手動コピーが壊れるのか”| 問題 | 内容 |
|---|---|
| 絶対パスの不一致 | チャットが D:\develope\… を指すのに、新PCは /Users/… |
| OS依存のシークレット | DB/SSHパスワード・GitHubトークンがOSキーチェーン(safeStorage)で暗号化され、別PCで復号不可 |
| OS依存のバイナリ | python venv、LSPサーバーなどはコピーしても動かない |
| 巨大な再生成キャッシュ | 検索/埋め込みインデックス(workspace.sqlite 〜226MB)が丸ごと付いてくる |
何を移して何を捨てるか
Section titled “何を移して何を捨てるか”🟢 移行対象(バンドル同梱)
Section titled “🟢 移行対象(バンドル同梱)”chats/— チャット履歴(メッセージを含み、自己完結)blyck-history.db— 変更履歴(VACUUM INTOスナップショット)db-history.json·db-snippets.json— DBクエリ履歴・スニペットlayout.json·blyck-locale.json·embeddings-settings.json— レイアウト・言語・設定connections.json— DB/SSH接続メタ(平文バンドルではシークレットを strip)attachments/·changeSet-snapshots/— オプション
⚫ 除外 — 対象PCで再生成
Section titled “⚫ 除外 — 対象PCで再生成”workspace.sqlite— 検索/埋め込みインデックス(〜226MB)。大部分がコードベース由来のため丸ごと除外するとバンドルが 230MB → 数MB に縮み、対象PCでインデクサーが自動再インデックスします。python-venvs/·lsp-servers/— OSバイナリ(再生成)- Electron/Chromium ランタイムキャッシュ、ログなど
バンドルフォーマット .blyckbundle
Section titled “バンドルフォーマット .blyckbundle”ZIPコンテナ + manifest.json(スキーマ・アプリバージョン・ソースOS・パスルート・ファイル別 sha256)。
backup-YYYY-MM-DD.blyckbundle├── manifest.json└── files/ # userData 相対パスのミラー ├── chats/index.json, chat_*.json ├── blyck-history.db ├── db-history.json, db-snippets.json ├── layout.json, blyck-locale.json, embeddings-settings.json ├── connections.json # 平文バンドルはシークレットを strip ├── attachments/** # オプション └── changeSet-snapshots/** # オプションパスリマッピング — チャットをそのまま引き継ぐ
Section titled “パスリマッピング — チャットをそのまま引き継ぐ”import 時、チャットJSONの権威あるパスフィールドのみを置換します。
| フィールド | リマッピング |
|---|---|
projectRoot | ✅ 置換 |
_lastSentProjectRoot | ✅ 置換 |
extraRoots[] | ✅ 各要素を置換 |
projectRootSftp | ❌ 不変(リモートはPCに非依存) |
messages[] | ❌ 不変(履歴を保存) |
ルールは最長プレフィックスマッチングです — パスがソースルートで始まれば、プレフィックスのみを対象ルートへ置き換え、残りの区切り文字を変換します。マッピングしていないルートはそのまま残します(チャットは開けるがプロジェクトのみ未解決、ユーザーが再オープン)。
クロスOS 4方向(Win↔Mac 全組み合わせ)
Section titled “クロスOS 4方向(Win↔Mac 全組み合わせ)”remapPath はソース区切り文字(分離)とターゲット区切り文字(結合)を別々に扱います。ソース区切り文字はソースルートから自動検出(\/ドライブレター → Win、/ → POSIX)、ターゲット区切り文字は対象OSで決定します。
| 方向 | ソースパス例 | 結果例 |
|---|---|---|
| Win→Win | D:\dev\App\src\a.js | E:\work\App\src\a.js |
| Win→Mac | D:\dev\App\src\a.js | /Users/x/App/src/a.js |
| Mac→Win | /Users/x/dev/App/src/a.js | D:\work\App\src\a.js |
| Mac→Mac | /Users/x/dev/App/src/a.js | /Users/y/App/src/a.js |
ドライブレター/ルートに非依存 — プレフィックス置換なので、D:\ ↔ /Users/ などどのルートの組み合わせもマッピング表で 1:1 に解決されます。
暗号化バンドル + シークレット同梱
Section titled “暗号化バンドル + シークレット同梱”export 時にパスワードを指定すると、バンドル全体を暗号化します。
- 方式: バンドル全体を AES-256-GCM — ZIP内蔵暗号(ZipCrypto)は脆弱なので使わず、zipを作った後に Node 内蔵の
cryptoで丸ごと暗号化します(外部依存ゼロ)。KDFはscrypt、暗号はAES-256-GCM(機密性 + 完全性)。 - パスワード誤入力 = GCM auth tag の検証失敗 →「パスワードが違います」を即座に検知(部分復号なし、データ無変更)。
- 平文ヘッダー(
BLYCKENC1)により、パスワードなしでも暗号化の有無を先に判別します。
シークレットは方向に非依存 — Win safeStorage で復号 → 暗号化バンドル → Mac safeStorage で再暗号化(逆も同じ)のため、Win↔Mac 4方向すべてが成立します。
Export の流れ
Section titled “Export の流れ”- 停止確認 — busy ターンがあれば拒否(データ整合性)
blyck-history.db→VACUUM INTOで単一スナップショット(アプリ実行中でも安全)- 同梱ファイル収集 + ファイル別 sha256
- chats スキャン → distinct なパスルートを
manifest.pathRootsに記録 - シークレット処理 — パスワード未指定: strip / パスワード指定: 平文シークレット同梱
- ZIP パッケージング
- パスワード指定時に AES-256-GCM 暗号化 →
*.blyckbundleを記録
Import の流れ
Section titled “Import の流れ”- inspect — magic で暗号化の有無を判別。暗号化ならパスワード入力プロンプト
- 復号 — パスワード → scrypt → AES-256-GCM。auth tag 失敗時は中断(データ無変更)
- パスリマッピングUI — ソースルートごとの入力欄(ベース名を自動推奨:
D:\develope\Blyck_Web→~/dev/Blyck_Web) - 安全バックアップ — 現在の
chats/・*.dbをuserData/_pre-import-<ts>/へ保存 files/抽出 → userData に書き込み- リマッピング適用 —
projectRoot/_lastSentProjectRoot/extraRootsの最長プレフィックス置換 + 区切り文字の正規化(projectRootSftp・messagesは不変) - シークレット復元 — 暗号化バンドル: 対象OSの safeStorage で再暗号化 / 平文バンドル:「再入力が必要」フラグ
workspace.sqliteなし → 次回実行時に自動再インデックス- 再起動の案内
モード — 置換 vs マージ
Section titled “モード — 置換 vs マージ”| モード | 動作 | 用途 |
|---|---|---|
| 置換(replace) | 現在の chats/・*.db を _pre-import-<ts> にバックアップ後、バンドルで置換 | 新PCへ丸ごと移行 |
| マージ(merge) | 既存インストールに chat id を基準にマージ(置換せず追加) | 2台のPCの作業を1か所にまとめる |
マージが安全な理由は、chats/ が id ごとの個別JSONなので、衝突なくマージできるためです。
- import 前に現在データを自動バックアップ(
_pre-import-<ts>) - manifest のスキーマ/アプリバージョン互換ゲート
- ファイル別 sha256 整合性検証
- チャット busy 中の import 拒否
- 置換前のユーザー明示確認
- 暗号化バンドルのパスワード誤入力 → 復号段階で中断(データ無変更)
- 平文バンドルにはシークレット非同梱(漏洩防止)
Q. チャット履歴は新PCでそのまま開きますか?
→ はい。import 時にパスリマッピングで projectRoot などを新PCのパスへ自動変換するため、チャットとプロジェクトがそのまま引き継がれます。
Q. DB/SSHパスワードを再入力する必要がありますか? → 暗号化バンドル(パスワード指定)でエクスポートすればシークレットが同梱され、対象OSで再暗号化されるため再入力が不要です。平文バンドルはセキュリティ上シークレットを除くため、再入力が必要です。
Q. Windowsで作ったバンドルをMacで解けますか?
→ はい。Win→Mac、Mac→Win を含む4方向すべてに対応します。パス区切り文字(\↔/)とドライブレター/ルートが自動変換されます。
Q. なぜバンドルがこんなに小さいのですか?
→ 226MB台の workspace.sqlite(検索インデックス)はコードベースから再生成可能なので除外します。対象PCでインデクサーが自動再インデックスし、チャット履歴自体はそのまま保存されます。
Q. パスワードを忘れたら? → 復旧手段はありません。AES-256-GCM はパスワードなしでは復号できないため、暗号化バンドルのパスワードは安全に保管してください。
Q. 既存PCの作業にマージしたい場合は? → マージモードを使ってください。chat id を基準にマージし、既存チャットを消さずに追加のみ行います。