···192192--------------------------------------------------------------------------------
193193194194/apps/web/src/lib/filebrowser/FileBrowser.svelte:
195195-[ ] Boards panel:
195195+[x] Boards panel:
196196 - listBoards() -> render
197197 - search filter
198198 - open / create / rename / delete
199199200200Inspector drawer (selected board):
201201-[ ] Show "Storage"
202202-[ ] Show schema info:
201201+[x] Show "Storage"
202202+[x] Show schema info:
203203 - declared schema version
204204 - installed schema version
205205-[ ] Show board-level stats (computed live):
205205+[x] Show board-level stats (computed live):
206206 - row counts: pages/shapes/bindings for this board & doc size bytes for docs row
207207 - last updatedAt
208208-[ ] Show migration info:
208208+[x] Show migration info:
209209 - list applied migrations from migrations table (id + appliedAt)
210210 - show "pending" migrations if any (based on known list vs applied)
211211212212Safe deletes:
213213-[ ] deleteBoard must be a single atomic transaction (boards + related tables)
213213+[x] deleteBoard must be a single atomic transaction (boards + related tables)
214214215215(DoD):
216216- Web: you can browse boards, open one, and verify migrations + row counts.
···227227 - tree view with folders
228228[ ] Implement file actions:
229229 - [x] New: create new file
230230- - [ ] Rename: rename file
231231- - [ ] Delete: delete file
230230+ - [ ] Rename: rename file (Tauri command needed)
231231+ - [ ] Delete: delete file (Tauri command needed)
232232 - [x] Open: load file into editor
233233 - [x] Export: save JSON
234234
-1
apps/web/src/lib/canvas/canvas-store.svelte.ts
···430430 let inputAdapter: InputAdapter | null = null;
431431 let canvasInitialized = false;
432432433433- // Initialize canvas-dependent systems when canvas becomes available
434433 $effect(() => {
435434 if (!canvas || canvasInitialized) return;
436435
+1-1
apps/web/src/lib/tests/Canvas.history.test.ts
···332332333333 it("wraps pointer actions in SnapshotCommands and enqueues persistence", async () => {
334334 render(Canvas);
335335- // Wait for onMount to complete and input adapter to be created
335335+336336 await vi.waitFor(() => {
337337 expect(actionHandlers.length).toBeGreaterThan(0);
338338 });
···66export * from "./history";
77export * from "./math";
88export * from "./model";
99-export * from "./persist/DocRepo";
109export * from "./persistence/db";
1110export * from "./persistence/desktop";
1111+export * from "./persistence/repo";
1212export * from "./persistence/stats";
1313export * from "./persistence/web";
1414export * from "./reactivity";
···4455/**
66 * Shared document repository contract used by both web and desktop persistence layers.
77- * Provides the minimal operations required for listing and managing boards.
87 */
98export interface DocRepo {
109 /**
+1-1
packages/core/src/persistence/db.ts
···11import Dexie, { type Transaction } from "dexie";
22import { PageRecord as PageOps } from "../model";
33-import type { BoardMeta, Timestamp } from "../persist/DocRepo";
33+import type { BoardMeta, Timestamp } from "./repo";
44import type { BindingRow, MetaRow, MigrationRow, PageRow, ShapeRow } from "./web";
5566export const DB_NAME = "inkfinite";
+1-1
packages/core/src/persistence/desktop.ts
···11import type { BindingRecord, Document, PageRecord, ShapeRecord } from "../model";
22-import type { BoardMeta } from "../persist/DocRepo";
22+import type { BoardMeta } from "./repo";
33import type { DocOrder, LoadedDoc } from "./web";
4455/**
+1-1
packages/core/src/persistence/stats.ts
···11-import type { Timestamp } from "../persist/DocRepo";
11+import type { Timestamp } from "./repo";
2233export type BoardStats = {
44 pageCount: number;
+1-1
packages/core/src/persistence/web.ts
···99 type ShapeRecord,
1010 ShapeRecord as ShapeOps,
1111} from "../model";
1212-import type { BoardMeta, DocRepo, Timestamp } from "../persist/DocRepo";
1212+import type { BoardMeta, DocRepo, Timestamp } from "./repo";
1313import type { BoardInspectorData, BoardStats, MigrationInfo, SchemaInfo } from "./stats";
1414import { BoardStatsOps, getPendingMigrations } from "./stats";
1515
+1-1
packages/core/src/ui/filebrowser.ts
···11-import type { BoardMeta, DocRepo } from "../persist/DocRepo";
11+import type { BoardMeta, DocRepo } from "../persistence/repo";
2233export type FileBrowserActions = {
44 open(boardId: string): Promise<void>;
+1-1
packages/core/tests/filebrowser.test.ts
···11import { describe, expect, it, vi } from "vitest";
22-import type { DocRepo } from "../src/persist/DocRepo";
22+import type { DocRepo } from "../src/persistence/repo";
33import { FileBrowserVM } from "../src/ui/filebrowser";
4455function createRepoMock(): DocRepo {