Skip to content

Release v1.105.0 - #1347

Merged
hitalin merged 18 commits into
mainfrom
develop
Nov 9, 2026
Merged

hitalin merged 18 commits into
mainfrom
develop

Conversation

@hitalin

@hitalin hitalin commented Nov 9, 2026

Copy link
Copy Markdown
Collaborator

Changes

Highlights

実機確認は Linux (WSL2) で移行 / 新規インストール / 常駐ありの 3 通り (#1334 のコメント)。macOS / Windows の移行は未確認。

Closes #1333
Closes #1332
Closes #1334

🤖 Generated with Claude Code

hitalin and others added 17 commits November 9, 2026 20:24
設定ディレクトリの場所 (`app_dir/notedeck`) を知るコードが notecore / notemaid /
src-tauri に散っていた (`SETTINGS_DIR` 定数が 3 クレートに別々、`join("notedeck")` が
各所)。再編 (#1334) で取りこぼさないよう、配置は `app_dir.rs` の値型 `Layout`
(config / data / state / cache) だけが知り、他は `Core::layout()` か
`Layout::from_root()` から受け取る。挙動は変えない。

- `settings_store` の allowlist を「論理 subdir → 置き場 (area) と属性」の写像表にし、
  `Side` (#1106 のリモート構成の死んだ注釈) を廃止。各エントリに `backup` と `ipc`
  (汎用 read / write / list / delete で到達可) を持たせ、`sessions` の特別扱い
  (`reject_sessions`) を `ipc: false` に畳む
- `connections.json` を allowlist に載せる (backup: true, ipc: false)。復元先で ai.json5
  の接続 id が宙に浮かないように。import は `ConnectionsFile` としてパースできるときだけ
- lint `tests/lint/rustSettingsDir.test.ts`: `join("notedeck")` / `SETTINGS_DIR` /
  `settings_base_dir` を app_dir.rs と migrations 以外で禁止 (`// nd-layout-ignore:` で例外)
- `run_fs` に旧バージョンのゴミ (notecore.lock / notemaid.db* / poll_accounts.json /
  logs/notecored.log.*) の削除を足す (warn 止まり)
- notemaid の panic は `logs/last_panic.notemaid.txt` に書く (Linux でアプリと同じ
  `logs/` を共有するため上書きし合っていた)
- notemaid の ai.json5 書込を `json5_out::stringify` (ファイル順保持、JSON5.stringify
  互換) に替える (§2 の先取り。`serde_json::to_string_pretty` は全キー辞書順で、
  フロントと書くたびに形が入れ替わっていた)
- CODEMAP の設定ファイル表を area / backup / ipc で出し直す

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
同じ内容を読んで書けば同じバイト列になり、読んだだけでは書かないようにする。
Git や dotfiles マネージャで設定フォルダを管理したとき、起動しただけで差分が出る
のを止める。

- keybinds.json5 が起動のたびに書き戻されていた (初期読込の代入が deep watch を
  発火させる)。ファイルから写しを入れている間は watch を止め、notemaid が書いた
  後の読み直しでも同じ。利用者のコメントが起動で消えることが無くなる
- AI 設定窓の deep watch は読み直しでも保存を呼ぶので、`useAiConfig.save()` は
  最後に読んだ / 書いた本文と同じなら書かない
- 外観エディタは store 由来の更新を JSON タブへ写すときに書き戻さない
  (別の書き手の変更を自分の写しで潰していた)
- 自動の品質調整 (`applyCssQuality`) は値が変わらないなら performance.json5 を書かない
- 整形を `src/services/json5Document.ts` の `stringifyJson5` に寄せる (2 スペース・
  末尾改行・挿入順。notemaid の `json5_out::stringify` と同じ)。navbar / postform は
  末尾改行が無かったので揃う
- `settingsFileCodecs.test.ts`: 各ルート設定ファイルのコーデックで「読む → 書く →
  読む → 書く」の 2 回目が 1 回目と byte 一致することを検査し、allowlist
  (`ROOT_FILES`) にあってコーデックも除外理由も無いファイルがあれば落ちる
  (新しい設定ファイルは登録必須)

コメントの保持は採らない (JSON5 を AST で編集する実装は大きい)。「再保存で
コメントは消える」はドキュメントに書く (§6)。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
方針は設定、確認の結果は状態。「別の機械で消えたら驚くか」で境界を引き、この機械で
その時に許した事実 (同意、鍵の有無、確認スキップ) と時刻を `state/` に移す。
設定フォルダを clone した先では「接続はあるが鍵も同意も無い」状態になり、使おうと
した時に設定画面が鍵を求める。

- `connections.json` → `state/connections-meta.json`: `exposedTo` / `trustedFor` /
  `trustedPlugins` / `local` (loopback 同意) / `slots` / `lastUsedAt` / `updatedAt` /
  `lastSecretUpdatedAt`。meta は接続の指紋 (`baseUrl` / `authType` / `allowedHosts` /
  `protocol`) を持ち、不一致なら同意を捨てる (設定側で接続を差し替えても古い同意が
  効かない)。旧形 (同居) は最初の読込で分離。`Connection` の wire 型は変えない
  (`connections_store` が load で重ね、save で分ける)
- `permissions.json5` → `state/permissions-meta.json5`: `confirmSkips`。`principals` は
  設定に残す。「今後確認しない」の書込は方針のファイルに触らない (`saveMeta`)。
  notemaid の `permissions_gate::confirm_skipped` も meta を読む
- 安い対策: 前回起動時の external / plugin の実効 granted の写しを meta に置き、起動時
  に広がった方向なら 1 回知らせる (`git pull` や dotfiles マネージャの apply で権限が
  広がったことに気づけるように)
- loopback 同意 (#1293) の `notedeck/loopback/consent.json` も同意なので
  `state/loopback-consent.json` へ (起動時に移動)
- ドット始まりのエントリ (`.git` / `.gitignore` / 一時ファイル) は allowlist / 汎用 IPC /
  バックアップのすべてで無視する (原則 5)
- `.gitignore` の雛形を設定フォルダに「無ければ書く」(§5)。除外は設定ではないもの
  (履歴サイドカー / tutorial / theme-dropins / client / sessions / memos / notemaid /
  一時ファイル) だけで、connections.json と permissions.json5 は乗せてよい

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
窓を動かす・ペットを動かす・投稿する・ズームする操作で `notedeck/` の中のファイルが
変わらないようにする。設定フォルダを Git で管理したとき、使っているだけで差分が
出ない。

- `settings.json5` → `state/ui.json5`: `pet.right` / `pet.bottom` (ドラッグ位置)、
  `ui.zoom`、`postForm.lastUsedVisibilityByAccount` / `lastUsedLocalOnlyByAccount`
  (投稿のたびに書く)。`deck.navWidth` / `lists.favoritedIdsByAccount` / `mute.*` は
  別の機械で消えたら驚く値なので残す。`parseSettings` が剥がし、旧値は settings store
  の初回の書込より前に一度だけ ui.json5 へ持ち越す。`useUiStateStore` は「最後に
  書いた者勝ち・窓間同期あり・エディタ無し」の小さい store (版つき条件付き書込と
  dirtyKeys の衝突マージは settings.json5 だけに残す)
- プロファイル → `state/deck/<id>.json5`: `windows[]` と `columns[].windowId`
  (対で動かさないとポップアウトカラムが復元不能扱いになる)、`aiCurrentSessionId`、
  `query`、`mfmText`、`aiscriptCode`、`aiInitialInput`。`columns[].width` は残す。
  `deckProfileState` に split / merge の純関数を置き、保存は変わった側だけ書く。
  メモリ上のプロファイルは両方を重ねた形のまま。別ウィンドウの書込は設定側 /
  状態側それぞれの変更通知で重ね直す。プロファイル削除で状態側も消し、持ち主の
  無い状態ファイルは起動時 (代表窓) に消す。旧形 (同居) は読めて、代表窓が分ける
- allowlist: `Subdir` に物理ディレクトリ名 `dir` を足し、`deck-state` → `state/deck/`
  (ipc: true, backup: false)、`ui.json5` を state のルートファイルに。state の root
  ファイルは窓間で揃えるので書込を知らせる (設定の root ファイルは従来どおり知らせない)
- プロファイルの本文も標準の整形 (`stringifyJson5`) で書く

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- DESIGN.md: ファイル構造に `state/` と `.gitignore` の雛形を足し、設定と状態の境界
  (「別の機械で消えたら驚くか」)、書込の決定性、「再保存でコメントは消える」を書く。
  バックアップの章に「設定フォルダは Git / dotfiles マネージャで管理できる」を足す:
  公開前提ではない (原則 1) / `git pull` と外部編集はアプリと常駐 notemaid を閉じてから
  (watcher は無い) / clone 先では鍵と同意は無い
- DEVELOPMENT.md: 配置の正本は `app_dir.rs` の `Layout` (lint で散在を禁止)、allowlist
  の属性 (`area` / `backup` / `ipc`)、確認スキップの所在、窓の配置が `state/deck/` に
  あること (「ジオメトリだけ別ファイルに分けると整合が壊れる」は、状態として対で
  分ける判断に差し替え)
- CLAUDE.md: 設定永続化の項に `state/` と決定性・配置の正本を足す

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
カラムは `accountId` (その機械の DB が発行する UUID) でアカウントを指すので、設定
フォルダを別の機械に持ち込む (バックアップの復元 / Git での clone / 同期) とカラムは
アカウントを失っていた。`DeckColumn.account` (user@host) はあったがホスト名を取る
のにしか使われておらず、`account` → `accountId` の解決が無かった。

- 保存時は `accountId` と `account` の両方を書く (`persistConfigIfChanged` が埋める)
- アカウント一覧が揃ったとき / ログインでアカウントが増えたとき、`accountId` がこの
  機械に無く `account` が一致する列は付け替える。一致が無い列は「アカウント未接続」
  のまま残す (カラムは消さない)。ファイルへの書戻しは代表窓だけ
- 再結合の鍵は `user@host` だけ (`host` の別名や移住は追わない)。ゲスト (トークン無し)
  は機械固有なので portable id を持たない

棚卸し (accountId を参照する他の値): `settings.json5` の `lists.favoritedIdsByAccount`
はサーバーから引き直せるキャッシュで付け替えない。ウィジェットは既に `accountKey`
(host:userId) で結び直している。Vault 接続の `accountScope` は別の機械では外れる
(使うときに設定画面で選び直す)。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
この時点では何も動かさない。再編 (config / data / state / cache) に先立って、配置の
版を 1 か所で持ち、旧配置の書き手が居る間に新配置で書き始めないための仕組みを入れる。

- `app_dir::FS_LAYOUT` (= 3) を配置の版の正本にし、notemaid の `FS_LAYOUT` は re-export。
  Hello の照合で旧版の常駐は「版が違う」になる
- 版印 `layout.json5` が root にあれば `Layout::v1` (config/ data/ state/ cache/)、無ければ
  `Layout::legacy`。移行は app だけが行い、daemon と Android の worker は版印に従って選ぶ
- `Layout` に決まった置き場を足す: 画像 / 絵文字 / ペットのキャッシュ、公開 API の
  トークン、notemaid の口座の写し、通知の処理位置、push の状態、notemaid の turns、
  編集履歴、ログ。root 直下の平置きの読み書きはすべてここを通す (`join("...")` を散らさない)
- daemon は lock を取った後・secret store を開く前に `run_fs` を回す (再編しないが、
  版印に従って Layout を選ぶため)
- `notemaid.lock` は移行で動かさない (動かすと旧 daemon の flock が inode に付いて行く)。
  再編後の daemon は `state/notemaid.lock` に加えて root 直下の旧ロックも non-blocking
  で取りに行き、取れなければ旧 daemon が生きているとみなして退く
- Android の worker (push / 巡回の JNI 入口) も `run_fs` を通す (アプリ更新の後、
  アプリを開く前に走りうる)
- 移行の排他 `.layout.lock` (blocking) を用意

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
`<base>.history.json5` は編集前の snapshot (この機械で編集した記録) で、設定の隣に
あるとバックアップに入り、import では本体と 1 組として扱われていた。状態として
`state/history/<subdir|root>/<base>.history.json5` に置き、置き場を知るのは
`settings_store::history_path` だけにする。

- 読み書きは専用の IPC (`read_history_sidecar` / `write_history_sidecar` /
  `delete_history_sidecar`、data 級)。汎用 read / write に「`.history.json5` なら別ルート」
  の名前分岐は入れない。履歴の書込は変更通知を流さない (履歴の表示は都度読む)
- `rename_file` は basename が変わる rename のとき履歴も動かす (無ければ skip、履歴の
  失敗で本体を失敗させない)。TS 側の rename から history 段を消し、削除は
  `removeHistory` (state/history/) を頼む
- 占有判定 (`listProfileDirFiles` 等) に履歴は出なくなる。持ち主の無い履歴は起動時に
  Rust が `state/history/` を見て消す (TS の sweepHistory は廃止)
- バックアップに履歴は入れない。旧バンドルの履歴は捨てて警告 1 行
  (`_native.backup.skippedHistory`)。`custom.css.history.json5` を ROOT_FILES から外し、
  `COMPOUND_EXTS` から `.history.json5` を外す (import のグループ化の対象外)
- 旧配置の履歴 (設定の隣と root の custom.css.history.json5) は起動時に移す。両方
  あれば state 側を残す

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…階 3)

旧配置 (`notedeck/` に設定と記録と状態が同居、キャッシュと状態が root に平置き) を、
何が消してよいものか・同期してよいものかが置き場で分かる形に移す。

- `layout_migration.rs`: 版印 `layout.json5` が無ければ移す。エントリ単位で「移動元が
  あり移動先が無い」ときだけ `rename` (判定は `symlink_metadata`、リンクはリンクのまま
  動かし、深さが変わる先では絶対化)。全か無か (失敗したら逆順で戻して旧配置のまま)。
  `notedeck/` 自体がリンクなら移行しない。両方あるときは型ごとに併合 (sessions / turns /
  memos は `updatedAt` の新しい方、MEMORY.md は行の和集合、それ以外は新を残して旧を
  `notedeck.old-<stamp>/` に退避)。版印は全エントリ成功時にだけ書く。`notemaid.lock` と
  公開仕様の `api-token` は動かさない。移行前に `backups/pre-layout-<stamp>/` (0700) へ
  設定バンドルと DB の写しを置く (前の版の退避は消す)。初回起動は新配置で始める
- 起動順 (`layout_boot.rs`): 版印が無ければ常駐の notemaid を `notemaid.shutdown` で止め
  (再起動ではない)、止められたときだけ `.layout.lock` を取って移す。止められなければ
  移行しない。Android は probe なしで worker と同じ入口。結果は 1 回だけフロントに返し、
  操作が要る人にだけ知らせる (リンク構成 / 退避 / 常駐を止めた / 失敗)
- `tutorial.json5` / `theme-dropins.json5` / `client.json5` はこの機械の記録として
  `state/` へ (旧配置の機械では設定の隣から読む `Area::StateFromV1`)。tutorial は
  バックアップから落ちる (利用者が了承)。採用したテーマのコピーに元の本文の hash
  `dropInSource` を持たせ、記録の無い機械で同じ元ファイルを再採用して複製しない
  (記録はあるが印の無いコピーは起動時に埋める)
- 「設定フォルダを開く」は root を開く。About の診断に Layout の各パスを出す
- Android の backup_rules / data_extraction_rules で state/ cache/ logs/ backups/ data/ と
  notecli.db (wal / shm) を除外
- 再編後の `.gitignore` の雛形は一時ファイルだけ (config には設定しか無い)。旧雛形の
  ままなら移行で消す
- `notemaid/secrets.enc` (Linux の常駐の file secrets) は notemaid の secrets モジュールが
  場所を持つので対象外 (ドキュメントに明記)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
雛形は設定フォルダに置くデータファイルで UI 文言ではないが、crates/ の日本語の直書きは
pre-push の lint が数える。英語で書けば翻訳の対象にもならない。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Android の push / 巡回の JNI 入口も配置の移行 (.layout.lock 待ち) と run_fs を同じ順で通す
- AI ターンのチェックポイントは 0600 で書き、移行時に既存のものも揃える
- 退避 (notedeck.old-*) と移行前のバックアップ (backups/pre-layout-*) は保持期限 (30 日) を
  過ぎたら起動時に消す
- E2E ハーネスは再編後の配置 (config/ + 版印) に種を置く
- ドキュメントに残っていた旧配置のパス (notedeck/sessions 等) を data/ / state/ に直す

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- プロファイルのファイルには portable な `account` (user@host) だけを書き、この機械の
  UUID (`accountId`) は書かない (#1332 の補正)。2 台で同じファイルを共有したとき、
  起動のたびにお互いの UUID で書き直して差分が止まらなくなるのを防ぐ。読むときは
  `unbound:<user@host>` の印を置き、再結合でこの機械の UUID に置き換える (undefined の
  ままだと全アカウントの列と見分けがつかない)。結び直しだけではファイルを書き直さない
- 設定フォルダの中のシンボリックリンク (GNU stow 等がファイル単位で張る) を設定として
  列挙し、保存はリンクの向き先に書く (rename でリンクを実体に置き換えない)。向き先の
  無いリンクは出さない

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… / #1334)

- 新ページ「Git や Dropbox で持ち運ぶ」(ja / en / ko / zh): 持ち運ぶ単位は config/、公開前提
  ではない、アプリと常駐の AI を閉じてから外で書き換える、再保存でコメントは消える、
  Git の手順と別の PC での結び直し (user@host)、dotfiles マネージャ (コピー / リンク)、
  Dropbox は書く PC を 1 台に・競合コピーは読み飛ばして知らせる・data/ と state/ と DB は
  同期しない、旧バージョンからの更新 (backups/pre-layout、リンク構成の張り直し)
- 「設定ファイル」を config / data / state / cache の 4 分割で書き直し、state/ の中身も
  一覧にする。既存ページから参照されている「設定はどこにあるか」の見出しは残す
- 「バックアップ」の対象と置き場の説明を追従
- サイドバーに新ページを 4 言語で足し、訳の sourceHash を更新

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
layout_boot の常駐への shutdown 要求は desktop だけなので、Duration も同じ cfg に置く。
Android の clippy (-D warnings) はタグ push の CI でしか走らないため、手元で気づける
範囲で潰しておく。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-09 に利用者と決めた。Git の pull は利用者が打つ操作なので「アプリと常駐を
閉じてから」で成立するが、同期ソフト (Dropbox 等) の書き戻しはアプリを開いている最中に
届き、2 台で同時に開けば last-writer-wins から抜け出せない。一級にするには外部変更の
watcher・競合コピーの選択 UI・多重起動の排他が要り、それでも同時編集は保証できない。

- site: 「Git で管理する」を主にページを組み替え (ja / en / ko / zh)、同期ソフトの節は
  「できるが保証しない」と制限だけを書く。サイドバーとリンク文言も揃える
- DESIGN.md: 決定と理由、watcher を作らない判断 (不採用) を残す。「端末間同期
  (シンボリックリンク方式)」は条件つきに格下げ

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Linux (WSL2) で旧配置の種を作って 3 通り (旧配置からの移行 / 新規インストール / 常駐
notemaid が居る状態) を通した。移行は 33 項目の検査が全部通り、2 回目以降の起動で
config/ に Git 差分は出ない。見つかった漏れ:

- loopback 同意 (`loopback/consent.json`) と root の編集履歴 (`custom.css.history.json5`)
  が移行の計画に無く「未知のエントリ」として退避されていた。それぞれ
  `state/loopback-consent.json` と `state/history/root/` へ運ぶ
- 旧形の `connections.json` / `permissions.json5` は最初に読むまで分かれなかった。起動時に
  1 回読んで分ける (Rust は connections を、フロントは権限の読込を起動時に始める)
- 設定側に状態が同居していたプロファイルは、portable な形の本文が同じだと書き直されず
  同居したままだった。分けたときは書き直す
- AI ターンのチェックポイント復旧 (`recover`) が、同じディレクトリの `taint.json` /
  `budget.json` / `heartbeat.json` / `workspace-hashes.json` を「読めない記録」として
  毎起動で消していた (以前からの不具合。汚染の記憶と HEARTBEAT の状態が再起動で消える)。
  同居する状態ファイルは掃除の対象から外す
- 新規インストール (何も動かさない) は `migrated: false` で、ログも区別する

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Nov 9, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 162 files, which is 62 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

Run configuration

Commits

Reviewing files that changed from the base of the PR and between 710b445 and a39b8ad.

Files ignored due to path filters: 3

  • Cargo.lock is excluded by !**/*.lock
  • src-tauri/openapi.json is excluded by !src-tauri/openapi.json
  • src/i18n/locale.generated.ts is excluded by !**/*.generated.*
Files selected for processing: 162

  • CLAUDE.md
  • CODEMAP.md
  • DESIGN.md
  • DEVELOPMENT.md
  • crates/notecli/Cargo.toml
  • crates/notecore/locales/en-US.json
  • crates/notecore/locales/ja-JP.json
  • crates/notecore/src/api_tokens.rs
  • crates/notecore/src/app_dir.rs
  • crates/notecore/src/backup_service.rs
  • crates/notecore/src/client_config.rs
  • crates/notecore/src/commands/admin.rs
  • crates/notecore/src/commands/settings.rs
  • crates/notecore/src/commands/table.rs
  • crates/notecore/src/context.rs
  • crates/notecore/src/crash_report.rs
  • crates/notecore/src/edit_history.rs
  • crates/notecore/src/emoji_cache_store.rs
  • crates/notecore/src/image_cache.rs
  • crates/notecore/src/keybinds.rs
  • crates/notecore/src/layout_migration.rs
  • crates/notecore/src/lib.rs
  • crates/notecore/src/loopback_consent.rs
  • crates/notecore/src/migrations.rs
  • crates/notecore/src/navbar.rs
  • crates/notecore/src/performance_settings.rs
  • crates/notecore/src/permissions_gate.rs
  • crates/notecore/src/pet_store.rs
  • crates/notecore/src/settings_events.rs
  • crates/notecore/src/settings_store.rs
  • crates/notecore/src/sidecar/mod.rs
  • crates/notecore/src/sidecar/plugins.rs
  • crates/notecore/src/sidecar/queries.rs
  • crates/notecore/src/sidecar/widgets.rs
  • crates/notecore/src/stream_mode.rs
  • crates/notecore/src/themes.rs
  • crates/notecore/src/vault/connections_store.rs
  • crates/notecore/src/vault/model.rs
  • crates/notemaid/Cargo.toml
  • crates/notemaid/src/ai_config.rs
  • crates/notemaid/src/ai_sessions.rs
  • crates/notemaid/src/ai_turn/checkpoint.rs
  • crates/notemaid/src/ai_turn/compose.rs
  • crates/notemaid/src/ai_turn/mod.rs
  • crates/notemaid/src/commands/ai_sessions.rs
  • crates/notemaid/src/commands/workspace.rs
  • crates/notemaid/src/daemon/accounts.rs
  • crates/notemaid/src/daemon/lock.rs
  • crates/notemaid/src/daemon/run.rs
  • crates/notemaid/src/exec/keybinds.rs
  • crates/notemaid/src/exec/memory.rs
  • crates/notemaid/src/exec/memos.rs
  • crates/notemaid/src/exec/meta.rs
  • crates/notemaid/src/exec/navbar.rs
  • crates/notemaid/src/exec/performance.rs
  • crates/notemaid/src/exec/persona.rs
  • crates/notemaid/src/exec/plugins.rs
  • crates/notemaid/src/exec/queries.rs
  • crates/notemaid/src/exec/styles.rs
  • crates/notemaid/src/exec/themes.rs
  • crates/notemaid/src/exec/widgets.rs
  • crates/notemaid/src/heartbeat.rs
  • crates/notemaid/src/memos.rs
  • crates/notemaid/src/migrations.rs
  • crates/notemaid/src/skills.rs
  • crates/notemaid/src/workspace.rs
  • crates/notemaid/tests/headless_loop.rs
  • locales/en-US.source.json
  • locales/en-US.yml
  • locales/ja-JP.yml
  • package.json
  • scripts/gen-codemap.mjs
  • site/.vitepress/config.mts
  • site/docs/config/backup.md
  • site/docs/config/files.md
  • site/docs/config/sync.md
  • site/en/docs/config/backup.md
  • site/en/docs/config/files.md
  • site/en/docs/config/sync.md
  • site/ko/docs/config/backup.md
  • site/ko/docs/config/files.md
  • site/ko/docs/config/sync.md
  • site/zh/docs/config/backup.md
  • site/zh/docs/config/files.md
  • site/zh/docs/config/sync.md
  • src-tauri/Cargo.toml
  • src-tauri/src/android_push.rs
  • src-tauri/src/android_worker.rs
  • src-tauri/src/commands/backup.rs
  • src-tauri/src/commands/export.rs
  • src-tauri/src/commands/health.rs
  • src-tauri/src/commands/heartbeat.rs
  • src-tauri/src/commands/mod.rs
  • src-tauri/src/commands/settings.rs
  • src-tauri/src/commands/updater.rs
  • src-tauri/src/layout_boot.rs
  • src-tauri/src/lib.rs
  • src-tauri/src/maid_launcher.rs
  • src-tauri/src/notify_cursor_file.rs
  • src-tauri/src/push_store_file.rs
  • src-tauri/src/ui_lang.rs
  • src-tauri/tauri.conf.json
  • src/App.vue
  • src/bindings.ts
  • src/components/deck/DeckPetOverlay.dom.test.ts
  • src/components/deck/DeckPetOverlay.vue
  • src/components/window/AboutContent.vue
  • src/components/window/AppearanceEditorContent.vue
  • src/composables/useAiConfig.ts
  • src/composables/usePostFormState.test.ts
  • src/composables/usePostFormState.ts
  • src/composables/useUiZoom.ts
  • src/main.ts
  • src/permissions/meta.ts
  • src/permissions/store.init.test.ts
  • src/permissions/store.saveFail.test.ts
  • src/permissions/store.serialize.test.ts
  • src/permissions/store.ts
  • src/services/accountRebind.test.ts
  • src/services/accountRebind.ts
  • src/services/deckProfileCodec.ts
  • src/services/deckProfileFiles.ts
  • src/services/deckProfileState.test.ts
  • src/services/deckProfileState.ts
  • src/services/distributable.ts
  • src/services/distributableCodecs/sidecar.ts
  • src/services/distributableCodecs/singleFile.ts
  • src/services/distributableCodecs/themeCodec.ts
  • src/services/json5Document.ts
  • src/services/settingsFileCodecs.test.ts
  • src/services/sidecarFileCollection.test.ts
  • src/services/sidecarFileCollection.ts
  • src/services/singleFileCollection.test.ts
  • src/services/singleFileCollection.ts
  • src/services/themeDropIn.ts
  • src/services/uiState.ts
  • src/settings/schema.ts
  • src/stores/columnQueries.ts
  • src/stores/deck.ts
  • src/stores/deckProfile.ts
  • src/stores/deckProfileFileSync.test.ts
  • src/stores/distributableStore.test.ts
  • src/stores/distributableStore.ts
  • src/stores/keybinds.persist.test.ts
  • src/stores/keybinds.ts
  • src/stores/performance.ts
  • src/stores/plugins.ts
  • src/stores/postForm.test.ts
  • src/stores/postForm.ts
  • src/stores/settings.ts
  • src/stores/skills.ts
  • src/stores/skillsFileSync.test.ts
  • src/stores/tasks.ts
  • src/stores/themeFileSync.test.ts
  • src/stores/themeFileSync.ts
  • src/stores/uiState.ts
  • src/stores/widgets.ts
  • src/tasks/schema.ts
  • src/utils/settingsFs.ts
  • tests/e2e/harness.ts
  • tests/lint/moduleCaches.test.ts
  • tests/lint/rustSettingsDir.test.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

@github-actions

github-actions Bot commented Nov 9, 2026

Copy link
Copy Markdown

API surface diff

外部アプリ向け API 面 (src-tauri/openapi.json / src/bindings.ts) が変更されています。
互換性への影響 (#709) をレビューしてください。

src-tauri/openapi.json |  2 +-
 src/bindings.ts        | 89 ++++++++++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 87 insertions(+), 4 deletions(-)
Full diff
diff --git a/src-tauri/openapi.json b/src-tauri/openapi.json
index c7417e4..ac95cff 100644
--- a/src-tauri/openapi.json
+++ b/src-tauri/openapi.json
@@ -6,7 +6,7 @@
     "license": {
       "name": "MIT"
     },
-    "version": "1.104.0"
+    "version": "1.105.0"
   },
   "paths": {
     "/api": {
diff --git a/src/bindings.ts b/src/bindings.ts
index f12e2f9..6743b44 100644
--- a/src/bindings.ts
+++ b/src/bindings.ts
@@ -2412,8 +2412,45 @@ async renameSettingsFile(subdir: string, oldName: string, newName: string) : Pro
     else return { status: "error", error: e  as any };
 }
 },
+/** @see crates/notecore/src/commands/settings.rs */
+async readHistorySidecar(subdir: string | null, base: string) : Promise<Result<string, { code: string; message: string; apiCode: string | null; i18n: JsonValue | null; retryAfterMs: number | null }>> {
+    try {
+    return { status: "ok", data: await TAURI_INVOKE("read_history_sidecar", { subdir, base }) };
+} catch (e) {
+    if(e instanceof Error) throw e;
+    else return { status: "error", error: e  as any };
+}
+},
+/** @see crates/notecore/src/commands/settings.rs */
+async writeHistorySidecar(subdir: string | null, base: string, content: string) : Promise<Result<null, { code: string; message: string; apiCode: string | null; i18n: JsonValue | null; retryAfterMs: number | null }>> {
+    try {
+    return { status: "ok", data: await TAURI_INVOKE("write_history_sidecar", { subdir, base, content }) };
+} catch (e) {
+    if(e instanceof Error) throw e;
+    else return { status: "error", error: e  as any };
+}
+},
+/** @see crates/notecore/src/commands/settings.rs */
+async deleteHistorySidecar(subdir: string | null, base: string) : Promise<Result<null, { code: string; message: string; apiCode: string | null; i18n: JsonValue | null; retryAfterMs: number | null }>> {
+    try {
+    return { status: "ok", data: await TAURI_INVOKE("delete_history_sidecar", { subdir, base }) };
+} catch (e) {
+    if(e instanceof Error) throw e;
+    else return { status: "error", error: e  as any };
+}
+},
 /**
- * Get the settings directory path (so users can open it in file manager).
+ * この起動での再編の結果 (フロントは起動時に 1 回読んで、操作が要る人にだけ知らせる)
+ *
+ * @see src-tauri/src/layout_boot.rs
+ */
+async layoutMigrationReport() : Promise<LayoutMigrationReport> {
+    return await TAURI_INVOKE("layout_migration_report");
+},
+/**
+ * 「設定フォルダを開く」の先。再編後 (#1334) は root (config / data / state が見える)
+ * を開く。2 本に分けると AI の持ち物 (skills / ai.json5 は config、SOUL / sessions は
+ * data) が割れて迷うため。旧配置なら従来どおり `notedeck/`
  *
  * @see src-tauri/src/commands/settings.rs
  */
@@ -3634,7 +3671,12 @@ trustedPlugins?: TrustedPlugin[];
 /**
  * secret が設定済みの slot 名一覧。keychain 列挙 API がないため metadata 側が source of truth。
  */
-slots?: string[]; lastUsedAt?: string | null; lastSecretUpdatedAt?: string | null; displayName?: string | null; icon?: string | null; notes?: string | null; createdAt: string; updatedAt: string }
+slots?: string[]; lastUsedAt?: string | null; lastSecretUpdatedAt?: string | null; displayName?: string | null; icon?: string | null; notes?: string | null; createdAt: string; 
+/**
+ * 設定側のファイルには書かない (state 側の値。`connections_store::load` が重ね、
+ * 無ければ `created_at`。#1333 §4)
+ */
+updatedAt: string }
 /**
  * 接続種別。v2 で `inbound` (webhook receiver) を追加する余地を残す。
  */
@@ -3858,7 +3900,11 @@ lastPanic: PanicReport | null;
 /**
  * AI (notemaid) がどこでどう動いているか (#1106)。繋がらない / 起動しない理由も含む
  */
-notemaid: NotemaidDiagnostics }
+notemaid: NotemaidDiagnostics; 
+/**
+ * データディレクトリの配置 (#1334)。開発者モードの About に出す
+ */
+layout: LayoutPaths }
 /**
  * デバイスへ流す出来事 (flat。Tauri は `nd:ai-heartbeat-event`)。
  * kind: `started` (source) / `finished` (outcome) / `report` (session_id, created, pending) /
@@ -4007,6 +4053,43 @@ childExited: boolean; childExitCode: number | null;
  * 常駐 (ログイン時タスク) の登録状態
  */
 resident: ResidentStatus }
+export type LayoutMigrationReport = { 
+/**
+ * この起動で再編した
+ */
+migrated: boolean; notices: LayoutNotice[] }
+/**
+ * 利用者に知らせること (操作が要る人だけ)
+ */
+export type LayoutNotice = 
+/**
+ * 旧配置と新配置の両方にあったものを退避した
+ */
+{ kind: "shelved"; dir: string; count: number } | 
+/**
+ * `notedeck/` がリンクなので移行しなかった
+ */
+{ kind: "symlinkedSettings" } | 
+/**
+ * 常駐 notemaid を止めた (更新するまで HEARTBEAT の継続が切れる)
+ */
+{ kind: "standaloneStopped" } | 
+/**
+ * 常駐 notemaid を止められず、移行しなかった
+ */
+{ kind: "residentAlive" } | 
+/**
+ * 失敗して旧配置のまま
+ */
+{ kind: "failed"; message: string }
+/**
+ * データディレクトリの各領域の場所
+ */
+export type LayoutPaths = { 
+/**
+ * 配置の版。`legacy` は再編前
+ */
+version: string; root: string; config: string; data: string; state: string; cache: string }
 /**
  * 表示言語で描き直せる 1 行 (一覧で返す警告など)。`i18n` は `{ text: { key, params } }`
  * の形で、TS は `nativeField(line, 'text')` で表示言語の文にする

@github-actions github-actions Bot added 📖Doc Documentation related issue/PR 🛠️Dev Development of NoteDeck itself rust Pull requests that update rust code javascript Pull requests that update javascript code labels Nov 9, 2026
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Nov 9, 2026 •

Copy link
Copy Markdown

Deploying notedeck with  Cloudflare Pages  Cloudflare Pages

Latest commit: a39b8ad
Status: ✅  Deploy successful!
Preview URL: https://22ac1883.notedeck-d3a.pages.dev
Branch Preview URL: https://develop.notedeck-d3a.pages.dev

View logs

@hitalin hitalin self-assigned this Nov 9, 2026
@claude

claude Bot commented Nov 9, 2026

Copy link
Copy Markdown

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.

- cargo-deny: libsqlite3-sys 0.33 の RUSTSEC-2026-0459 (bundled SQLite の
  WAL 越しの未初期化メモリ露出、CVE-2026-119375)。notecli の rusqlite を
  0.35 → 0.41、refinery を 0.9 → 0.10 に上げて libsqlite3-sys 0.39.1
  (SQLite 3.54.1) にする。API 変更なし (clippy / 全テスト通過)
- rust-android: notify_cursor_file / push_store_file の FILE_NAME は
  Layout 化 (#1334) で参照が無くなっていた。Android ビルドだけ dead_code で
  落ちていたので定数を消す

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@socket-security

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updatedcargo/​refinery@​0.9.2 ⏵ 0.10.010010093100100
Updatedcargo/​rusqlite@​0.35.0 ⏵ 0.41.110010093100100

View full report

@hitalin
hitalin merged commit b1c9df9 into main Nov 9, 2026
31 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🛠️Dev Development of NoteDeck itself 📖Doc Documentation related issue/PR javascript Pull requests that update javascript code rust Pull requests that update rust code

Projects

None yet

1 participant