fix: 修复文件层级重构后的架构问题

- 恢复 IPC 类型声明 (src/electron-api.d.ts),修复 31 个 TS2339 错误
- 修复构建断裂:vite.config.ts 改回 electron.vite.config.ts
- 修复 2 个 verbatimModuleSyntax type-import 报错
- 修正 .gitignore 构建产物路径 (electron-dist/ -> dist-electron/ + release/)
- 清理 55+ 处过时路径注释
- 更新 AGENTS.md 架构文档与 IPC 通道表
- 修正 docs/ROADMAP.md 过时引用
This commit is contained in:
2026-07-10 23:22:53 +08:00
parent fe7801062f
commit 157af4399f
62 changed files with 222 additions and 102 deletions
+71 -39
View File
@@ -1,4 +1,4 @@
# AGENTS.md JRedisDesktop v2
# AGENTS.md - JRedisDesktop v2
## Project identity
@@ -6,10 +6,10 @@ Fork of [AnotherRedisDesktopManager](https://github.com/qishibo/AnotherRedisDesk
## Stack
- **Shell:** Electron 43 (`electron/main/index.ts`)
- **Preload:** `electron/preload/index.ts` (contextBridge, typed API)
- **Shell:** Electron 43 (`electron/main.ts`)
- **Preload:** `electron/preload.ts` (contextBridge, typed API)
- **Renderer:** Vue 3 + Pinia + Element Plus + Vue Router (`src/`)
- **Shared:** `electron/shared/types.ts` (cross-process types)
- **IPC types:** `src/electron-api.d.ts` (ElectronAPI interface, global Window augmentation)
- **Build:** electron-vite + Vite 6 + TypeScript 5
- **Redis client:** ioredis 5 (main process only)
- **Persistence:** electron-store + safeStorage (credentials)
@@ -18,46 +18,46 @@ Fork of [AnotherRedisDesktopManager](https://github.com/qishibo/AnotherRedisDesk
```bash
npm run dev # electron-vite dev (HMR, renderer on :5173)
npm run build # production build electron-dist/
npm run build # production build -> dist-electron/
npm start # preview built app
npm run build:unpack # build + electron-builder --dir
npm run build:win # build + electron-builder --win
npm run build:mac # build + electron-builder --mac
npm run build:linux # build + electron-builder --linux
npm run lint # eslint --fix
```
## Architecture
```
Electron main (electron/main/)
├── index.ts # Window creation, app lifecycle
├── redis/ # Redis service modules
├── index.ts # Unified export
│ ├── connection.ts # connect, disconnect, isClientConnected
│ ├── keys.ts # scan, delete, rename, ttl, batchDelete
│ ├── string.ts # get, set
│ ├── hash.ts # hscan, hset, hdel
│ ├── list.ts # range, push, set, remove
│ ├── set.ts # members, add, remove
│ ├── zset.ts # range, add, remove
│ ├── stream.ts # info, range, add, trim
│ ├── server.ts # info, select, ping, slowlog
│ ├── pubsub.ts # SUBSCRIBE/UNSUBSCRIBE
│ ├── commandLogger.ts # command execution log
│ └── format.ts # value decode/format detection
Electron main (electron/)
├── main.ts # Window creation, app lifecycle
├── preload.ts # contextBridge.exposeInMainWorld
├── ipc-handlers.ts # all IPC channel handlers
├── store.ts # electron-store (connections, settings)
├── credential.ts # safeStorage encrypt/decrypt
├── win-state.ts # window position persistence
├── updater.ts # electron-updater (check/download/install)
└── ipc-handlers.ts # all IPC channel handlers
Preload (electron/preload/)
├── index.ts # contextBridge.exposeInMainWorld
└── index.d.ts # ElectronAPI type declarations
└── redis/ # Redis service modules
├── index.ts # Unified export
├── connection.ts # connect, disconnect, isClientConnected
├── keys.ts # scan, delete, rename, ttl, batchDelete
├── string.ts # get, set
├── hash.ts # hscan, hset, hdel
├── list.ts # range, push, set, remove
├── set.ts # members, add, remove
├── zset.ts # range, add, remove
├── stream.ts # info, range, add, trim
├── server.ts # info, select, ping, slowlog
├── pubsub.ts # SUBSCRIBE/UNSUBSCRIBE
├── commandLogger.ts # command execution log
└── format.ts # value decode/format detection
Renderer (src/)
├── main.ts # Vue 3 bootstrap (Pinia, Element Plus)
├── App.vue # Shell layout (TitleBar + Sidebar + MainArea + StatusBar)
├── env.d.ts # Vite client + *.vue / *.css module declarations
├── electron-api.d.ts # ElectronAPI interface + global Window augmentation
├── stores/
│ ├── app.ts # theme, fontSize, scanCount
│ ├── connection.ts # connections CRUD, connect/disconnect, health check
@@ -91,7 +91,10 @@ Renderer (src/)
│ ├── index.ts # useI18n composable
│ └── locales/
│ ├── en.ts # English
── zh-CN.ts # 中文
── zh-CN.ts # 中文
│ ├── ja.ts # 日本語
│ ├── ko.ts # 한국어
│ └── de.ts # Deutsch
├── composables/
│ └── useKeyboard.ts # keyboard shortcut handler
├── styles/
@@ -110,57 +113,82 @@ Renderer (src/)
| `redis:connect` | invoke | Create Redis connection |
| `redis:disconnect` | invoke | Close connection |
| `redis:execute` | invoke | Execute arbitrary command |
| `redis:getInfo` | invoke | INFO server info |
| `redis:ping` | invoke | Health check ping |
| `redis:isConnected` | invoke | Check connection status |
| `redis:scanKeys` | invoke | SCAN with pattern |
| `redis:getKeyType` | invoke | TYPE of a key |
| `redis:getKeyTTL` | invoke | TTL of a key |
| `redis:deleteKey` | invoke | DEL a single key |
| `redis:existsKey` | invoke | EXISTS check |
| `redis:getString` | invoke | GET string value |
| `redis:setString` | invoke | SET string value |
| `redis:hashScan` | invoke | HSCAN fields |
| `redis:hashSet` | invoke | HSET field |
| `redis:hashDel` | invoke | HDEL field |
| `redis:listRange` | invoke | LRANGE elements |
| `redis:listLength` | invoke | LLEN |
| `redis:listPush` | invoke | RPUSH elements |
| `redis:listSet` | invoke | LSET element |
| `redis:listRemove` | invoke | LREM elements |
| `redis:setMembers` | invoke | SMEMBERS |
| `redis:setSize` | invoke | SCARD |
| `redis:setAdd` | invoke | SADD members |
| `redis:setRemove` | invoke | SREM members |
| `redis:zsetRange` | invoke | ZRANGE with scores |
| `redis:zsetSize` | invoke | ZCARD |
| `redis:zsetAdd` | invoke | ZADD member |
| `redis:zsetRemove` | invoke | ZREM members |
| `redis:streamInfo` | invoke | XINFO STREAM |
| `redis:streamRange` | invoke | XRANGE entries |
| `redis:streamAdd` | invoke | XADD entry |
| `redis:streamTrim` | invoke | XTRIM |
| `redis:streamDel` | invoke | XDEL entries |
| `redis:streamGroups` | invoke | XINFO GROUPS |
| `redis:streamConsumers` | invoke | XINFO CONSUMERS |
| `redis:streamGroupCreate` | invoke | XGROUP CREATE |
| `redis:streamGroupDestroy` | invoke | XGROUP DESTROY |
| `redis:streamAck` | invoke | XACK messages |
| `redis:batchDelete` | invoke | Pipeline DEL multiple keys |
| `redis:renameKey` | invoke | RENAME key |
| `redis:setTTL` | invoke | EXPIRE/PERSIST |
| `redis:selectDb` | invoke | SELECT database |
| `redis:dbSize` | invoke | DBSIZE |
| `redis:slowLogGet` | invoke | SLOWLOG GET |
| `redis:slowLogLen` | invoke | SLOWLOG LEN |
| `redis:memoryUsage` | invoke | MEMORY USAGE |
| `redis:subscribe` | invoke | SUBSCRIBE to channels |
| `redis:unsubscribe` | invoke | UNSUBSCRIBE from channels |
| `redis:subscribeMessage` | send | Push subscribed message to renderer |
| `redis:monitor` | invoke | Start MONITOR stream |
| `redis:monitorStop` | invoke | Stop MONITOR stream |
| `redis:monitorMessage` | send | Push monitored command to renderer |
| `redis:getCommandLog` | invoke | Get command execution log |
| `redis:clearCommandLog` | invoke | Clear command log |
| `redis:decodeValue` | invoke | Decode value by format |
| `redis:detectFormat` | invoke | Auto-detect value format |
| `redis:customFormat` | invoke | Custom external formatter |
| `redis:streamGroups` | invoke | XINFO GROUPS |
| `redis:streamConsumers` | invoke | XINFO CONSUMERS |
| `redis:streamGroupCreate` | invoke | XGROUP CREATE |
| `redis:streamGroupDestroy` | invoke | XGROUP DESTROY |
| `redis:streamAck` | invoke | XACK messages |
| `redis:rejsonGet` | invoke | JSON.GET value |
| `redis:rejsonSet` | invoke | JSON.SET value |
| `storage:getConnections` | invoke | Read connections |
| `storage:saveConnection` | invoke | Save connection |
| `storage:deleteConnection` | invoke | Delete connection |
| `storage:reorderConnections` | invoke | Reorder connections |
| `storage:getSettings` | invoke | Read settings |
| `storage:saveSettings` | invoke | Save settings |
| `credential:encrypt` | invoke | safeStorage encrypt |
| `credential:decrypt` | invoke | safeStorage decrypt |
| `dialog:openFile` | invoke | Open file picker |
| `theme:get` | invoke | Get OS dark mode |
| `theme:set` | send | Set theme source |
| `theme:os-updated` | send | Push OS theme change to renderer |
| `window:minimize` | send | Minimize window |
| `window:maximize` | send | Toggle maximize |
| `window:close` | send | Close window |
| `updater:check` | invoke | Check for updates |
| `updater:download` | invoke | Download update |
| `updater:install` | invoke | Quit and install update |
| `updater:status` | send | Push updater status to renderer |
## Keyboard Shortcuts
@@ -175,21 +203,25 @@ Renderer (src/)
## Build config
- `electron.vite.config.ts` defines three build targets: main, preload, renderer
- Main + preload output to `dist-electron/`; renderer to `dist-electron/renderer/`
- electron-builder packages into `release/`
- Renderer dev server runs on port 5173
- Main/preload use `externalizeDepsPlugin()` to keep node_modules external
- `@renderer` alias resolves to `src`
## TypeScript
- Root `tsconfig.json` references `tsconfig.node.json` (main + preload) and `tsconfig.web.json` (renderer)
- Node target includes `src/main/**/*`, `src/preload/**/*`, `electron.vite.config.ts`
- Web target includes `src/**/*`
- `@renderer` alias resolves to `src`
- Root `tsconfig.json` references `tsconfig.node.json` (main + preload) and `tsconfig.app.json` (renderer)
- Node target (`tsconfig.node.json`) includes `electron/**/*` + `electron.vite.config.ts`
- App target (`tsconfig.app.json`) includes `src/**/*`
- Both use `verbatimModuleSyntax` (type-only imports required) and `moduleResolution: "bundler"`
- `src/electron-api.d.ts` declares the `ElectronAPI` interface and augments global `Window`
## Security
- `contextIsolation: true` renderer has zero Node.js access
- `nodeIntegration: false` no Node globals in renderer
- `safeStorage` OS-level encryption for credentials
- `contextIsolation: true` - renderer has zero Node.js access
- `nodeIntegration: false` - no Node globals in renderer
- `safeStorage` - OS-level encryption for credentials
- All Redis operations go through typed IPC to main process
## Legacy