From 7c063e5aab5a8ce6990ac3a774304df1b9c35f87 Mon Sep 17 00:00:00 2001 From: Roberto Musso Date: Thu, 19 Feb 2026 16:51:18 +0100 Subject: [PATCH] chore: mark US-004 complete in prd.json and update progress log Co-Authored-By: Claude Sonnet 4.6 --- prd.json | 4 ++-- progress.txt | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/prd.json b/prd.json index d897c8b..979064a 100644 --- a/prd.json +++ b/prd.json @@ -69,8 +69,8 @@ "Verify in browser using dev-browser skill" ], "priority": 4, - "passes": false, - "notes": "" + "passes": true, + "notes": "Completed: electron-store@8 sidebar collapse persistence via settings tRPC router, @fontsource/geist replacing Google Fonts CDN, right-edge 'keep scrolling for AI' label in all views, ESLint fixed with eslint-import-resolver-typescript" }, { "id": "US-005", diff --git a/progress.txt b/progress.txt index 37055d3..47152be 100644 --- a/progress.txt +++ b/progress.txt @@ -6,6 +6,9 @@ - All DB tables use `CREATE TABLE IF NOT EXISTS` for non-destructive migrations - All IDs are UUIDs generated via `crypto.randomUUID()` - TypeScript strict mode + noUncheckedIndexedAccess enabled; always account for possible undefined on array access +- electron-store@8 (CJS) used for app settings; use lazy init pattern `getStore()` like `getDb()` to avoid calling before app ready +- ESLint uses `eslint-import-resolver-typescript` to resolve `@/*` aliases; configured in `.eslintrc.json` under `settings.import/resolver` +- App settings (sidebar state, etc.) exposed via `settings` tRPC sub-router for type-safe renderer access --- @@ -26,3 +29,22 @@ - The TRPCProvider must wrap QueryClientProvider (or be a sibling); both need the same queryClient instance - Stub routers return empty arrays or null — they will be replaced in US-005 through US-008 --- + +## 2026-02-19 - US-004 +- What was implemented: + - Installed: electron-store@8 (CJS-compatible, for persistent app settings), @fontsource/geist (self-hosted Geist font), eslint-import-resolver-typescript (ESLint path alias fix) + - Created `src/main/store.ts` with lazy `getStore()` pattern using electron-store + - Added `settings` tRPC sub-router with `getSidebarCollapsed` query and `setSidebarCollapsed` mutation + - Updated `src/renderer/components/layout/AppShell.tsx` to: persist sidebar collapse via tRPC, add right-edge 'keep scrolling for AI' vertical label with ChevronDown icon + - Updated `src/renderer/globals.css`: replaced Google Fonts CDN with @fontsource/geist imports (weights 400/500/600) + - Updated `index.html`: removed Google Fonts CDN links + - Updated `.eslintrc.json`: added eslint-import-resolver-typescript to fix @/* alias resolution (fixed all 7 pre-existing lint errors) +- Files changed: .eslintrc.json, index.html, package.json, package-lock.json, src/main/router/index.ts, src/main/store.ts (new), src/renderer/components/layout/AppShell.tsx, src/renderer/globals.css +- **Learnings for future iterations:** + - Use electron-store@8 (not v9+) — v9+ is ESM-only and breaks with CommonJS main process + - electron-store must NOT be initialized at module import time (before app.ready); use lazy `getStore()` like `getDb()` pattern + - For sidebar/UI state loaded from IPC: use `localState ?? queryData ?? default` pattern to avoid flash while query resolves + - @fontsource packages are the npm equivalent of Google Fonts — import weight-specific CSS files (e.g., `@fontsource/geist/400.css`) + - ESLint `import/no-unresolved` requires `eslint-import-resolver-typescript` with `alwaysTryTypes: true` to resolve TypeScript path aliases + - The `writingMode: 'vertical-rl'` + `transform: 'rotate(180deg)'` CSS pattern creates bottom-to-top text for vertical affordance labels +---