local-tool/: visionA-local desktop app
- M1: Wails shell + Go server + Next.js UI + Mock mode (macOS dmg ready)
- M2: i18n (zh-TW/en) + Settings 4-tab refactor
- M3: Embedded Python 3.12 runtime (python-build-standalone) + KneronPLUS wheels
- M4: Windows Inno Setup script (build on Windows runner)
- M5: Linux AppImage script + udev rule (build on Linux runner)
- M6: ffmpeg (GPL, pending legal review) + yt-dlp bundled
- Lifecycle: watchServer health check, fatal native dialog,
Wails IPC raise endpoint, stale process cleanup
.autoflow/: full PRD / Design Spec / Architecture / Testing docs
(4 rounds tri-party discussion + cross review)
.github/workflows/: macOS / Windows / Linux build CI
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
190 lines
10 KiB
Markdown
190 lines
10 KiB
Markdown
# visionA-local 設計分析(第一輪)
|
||
|
||
> Design Agent · 第一階段三方聯合討論 · 2026-04-10
|
||
> 本文件為「分析」而非「規格」,目的是盤點現況、指出差異、收斂疑問。
|
||
|
||
---
|
||
|
||
## 1. 原 frontend 的盤點(edge-ai-platform)
|
||
|
||
### 1.1 現有頁面(`src/app/`)
|
||
|
||
| 路由 | 用途 | 去留 |
|
||
|------|------|------|
|
||
| `/`(Dashboard) | 概覽:模型數、裝置數、連線數、活動時間軸 | ✅ 保留,但需拿掉 cluster 相關統計 |
|
||
| `/models` | 模型庫:上傳、切換、比對 `.nef` | ✅ 保留 |
|
||
| `/devices` | USB Kneron 裝置列表、連線狀態、Flash | ✅ 保留 |
|
||
| `/clusters` | 叢集列表 / 建立叢集 | ❌ 砍 |
|
||
| `/workspace/[deviceId]` | 單裝置工作區:攝影機 + 模型 + 推論 | ✅ 保留(核心頁面) |
|
||
| `/workspace/cluster` | 叢集工作區 | ❌ 砍 |
|
||
| `/settings` | 設定頁 | ✅ 保留,需重新設計(見下) |
|
||
|
||
### 1.2 現有元件分類
|
||
|
||
| 分類 | 元件 | 去留 |
|
||
|------|------|------|
|
||
| `camera/` | camera-feed, camera-controls, camera-overlay, source-selector, camera-inference-view, batch-image-thumbnails | ✅ 全保留 |
|
||
| `devices/` | device-card, device-list, device-health-card, flash-dialog, flash-progress, device-connection-log, device-status | ✅ 全保留 |
|
||
| `models/` | model-card, model-grid, model-filters, model-upload-dialog, model-detail, model-comparison-dialog | ✅ 全保留 |
|
||
| `inference/` | inference-panel, classification-result, confidence-slider, performance-metrics, video-progress | ✅ 全保留 |
|
||
| `cluster/` | cluster-card, cluster-list, cluster-create-dialog, cluster-performance | ❌ 全砍 |
|
||
| `dashboard/` | stat-card, activity-timeline, connected-devices-list | ✅ 保留(拿掉 cluster 欄位) |
|
||
| `layout/` | sidebar, header, connection-status, help-button | ✅ 保留但需改寫(見第 2 節) |
|
||
| `onboarding-dialog.tsx`, `guided-tour.tsx` | 新手引導 | ✅ 保留並強化(First-Run) |
|
||
| `relay-token-sync.tsx` | Relay token 同步 | ❌ 砍 |
|
||
| `server-log-viewer.tsx`, `server-status-dashboard.tsx` | 後端狀態 | ✅ 保留(桌面 app 尤其需要) |
|
||
| `theme-sync.tsx`, `lang-sync.tsx`, `store-hydration.tsx` | 基礎設施 | ✅ 保留 |
|
||
|
||
### 1.3 Sidebar 改動
|
||
原 5 項導航去掉 `/clusters`,變成 4 項:Dashboard / Models / Devices / Settings。Logo 字母 `E` 應換成 visionA-local 品牌識別。
|
||
|
||
---
|
||
|
||
## 2. 從「網頁工具」到「桌面 app」的 UX 差異
|
||
|
||
| 維度 | 原 Web 版行為 | 桌面 app 應做的調整 |
|
||
|------|-------------|-------------------|
|
||
| **視窗外觀** | 瀏覽器 tab,有 URL bar、書籤列 | 原生視窗、無 URL bar、使用系統 window chrome;mac 可考慮 frameless + traffic lights |
|
||
| **啟動方式** | 使用者打開瀏覽器輸入 localhost:3721 | 雙擊 app icon 即開;可選開機自啟動(預設關) |
|
||
| **路由表達** | URL 是使用者心智模型 | URL 隱藏在內部,導航完全靠 sidebar;移除 deep link 依賴 |
|
||
| **背景常駐** | 關掉分頁 = 關掉工具 | 關閉視窗 ≠ 結束程式:收進 tray,server 持續運作 |
|
||
| **檔案互動** | 上傳透過 `<input type=file>` | 支援拖放到視窗任一處、支援「以 visionA-local 開啟」系統關聯 `.nef` / 圖片 |
|
||
| **選單列** | 瀏覽器選單 | 原生 menubar:File / Edit / View / Devices / Help,含快捷鍵 |
|
||
| **快捷鍵** | 瀏覽器佔用大量快捷鍵 | 釋放 ⌘N/⌘W/⌘, 等,對應到桌面 app 常見動作 |
|
||
| **主題** | 跟隨 Tailwind theme,手動切換 | 預設跟隨系統(light/dark/auto),記住偏好 |
|
||
| **通知** | 瀏覽器 Notification API(需授權) | 原生 OS 通知(mac Notification Center / Win toast / Linux libnotify) |
|
||
| **更新** | F5 就是最新 | 需要 in-app update 提醒(沿用 Wails updater 或自建) |
|
||
| **字級與密度** | 預設 web 字級 | 桌面 app 可略緊湊,但仍要遵守 44px 觸控目標(平板模式) |
|
||
|
||
---
|
||
|
||
## 3. 首次啟動體驗(First-Run)流程草案
|
||
|
||
使用者下載 `.dmg` / `.exe` / `.AppImage` → 安裝 → 第一次打開。建議流程(最多 3 步,可跳過):
|
||
|
||
```
|
||
Step 1 — 歡迎畫面
|
||
• visionA-local logo + 一句話 value prop
|
||
• "開始使用" / "稍後再說"
|
||
|
||
Step 2 — 執行模式選擇
|
||
• 🟢 真實硬體模式:插上 Kneron USB 裝置即可開始
|
||
• 🟡 Mock 模式:沒有硬體也能探索功能(預設選項,降低門檻)
|
||
• 可隨時在 Settings 切換
|
||
|
||
Step 3 — 硬體偵測(僅真實模式)
|
||
• 自動掃描 USB 裝置
|
||
• 成功 → 顯示偵測到的裝置卡片,CTA「前往 Workspace」
|
||
• 失敗 → 顯示排錯清單(驅動、權限、USB3、重插)+「切換 Mock 模式」備案
|
||
|
||
完成後 → 進入 Dashboard,guided-tour 可選擇啟動
|
||
```
|
||
|
||
**設計重點:**
|
||
- 不強迫註冊、不要 email、不要網路。這是離線工具。
|
||
- Mock 模式作為「我先看看」的無摩擦入口,降低首次挫敗。
|
||
- 硬體偵測失敗要**主動給解法**,不要只顯示紅字。
|
||
|
||
---
|
||
|
||
## 4. Tray 互動設計建議
|
||
|
||
### 狀態圖示(menubar / systray)
|
||
| 狀態 | 圖示 | 說明 |
|
||
|------|------|------|
|
||
| Server 運行中,有裝置連線 | 🟢 實心 logo | 正常 |
|
||
| Server 運行中,無裝置 | ⚪ 淺色 logo | Idle |
|
||
| Server 啟動中 | 🔵 動態 pulse | Loading |
|
||
| Server 錯誤 | 🔴 logo + 驚嘆號 | 需使用者處理 |
|
||
| Mock 模式 | logo + 小 "M" badge | 與真實模式視覺區隔 |
|
||
|
||
### 點擊行為(平台差異)
|
||
|
||
| 平台 | 左鍵 | 右鍵 |
|
||
|------|------|------|
|
||
| macOS | 直接展開選單(mac 慣例,無左右之分) | — |
|
||
| Windows | 叫出主視窗(Win 慣例) | 展開選單 |
|
||
| Linux/GNOME | 展開選單(行為差異大,以選單為主) | 展開選單 |
|
||
|
||
### 選單項目(統一內容)
|
||
```
|
||
▸ 顯示 visionA-local ⌘0
|
||
▸ Server 狀態:Running (localhost:3721) [唯讀]
|
||
─────────
|
||
▸ 快速動作
|
||
├ 新增裝置…
|
||
├ 上傳模型…
|
||
└ 開啟工作區
|
||
─────────
|
||
▸ 模式:● 真實 ○ Mock [可切換]
|
||
▸ 開機自動啟動 [checkbox]
|
||
─────────
|
||
▸ 關於 visionA-local
|
||
▸ 檢查更新…
|
||
▸ 結束 ⌘Q
|
||
```
|
||
|
||
---
|
||
|
||
## 5. 跨平台一致性的取捨
|
||
|
||
**原則:視覺統一 × 互動遵循平台慣例。**
|
||
|
||
| 項目 | 策略 |
|
||
|------|------|
|
||
| 色彩 / 字型 / 間距 / 元件樣式 | 跨平台完全一致(Design Tokens 統一) |
|
||
| 主視窗標題列 | mac frameless + traffic lights;win/linux 用標準 title bar(避免自畫 close button 的坑) |
|
||
| 快捷鍵修飾鍵 | mac 用 ⌘、win/linux 用 Ctrl;由 menu 定義,不手動寫字串 |
|
||
| 右鍵選單 | 原生 context menu(Wails runtime 提供) |
|
||
| 檔案對話框 | 原生 file picker,不自畫 |
|
||
| 通知 | 原生 OS 通知,訊息格式統一 |
|
||
| Tray 圖示尺寸 | mac 16pt template、win 16×16/32×32、linux 22×22,各自獨立資產 |
|
||
| 字型 | 跟隨系統字型(mac SF Pro、win Segoe UI、linux Inter/Ubuntu) |
|
||
|
||
**刻意不一致的地方:** 不要做自定義 title bar、不要覆寫原生選單,越原生越好。
|
||
|
||
---
|
||
|
||
## 6. 需要 PM / Architect 回答的問題
|
||
|
||
### 給 PM
|
||
1. **目標使用者**:主要是 Kneron 工程師內部使用?還是要給客戶 demo?這影響 First-Run 的技術門檻設定。
|
||
2. **Mock 模式的完整度**:Mock 是否要提供預錄的推論結果影片?還是可以完全用假資料?
|
||
3. **多語系**:原專案有 i18n(`useTranslation`),local 版要支援哪些語言?繁中 only 還是 en+zh?
|
||
4. **使用者資料**:模型、裝置設定存哪?`~/Library/Application Support/visionA-local/` 這類 OS 慣例目錄?
|
||
5. **錯誤回報**:是否要內建 feedback / 錯誤回報機制(匿名 telemetry)?
|
||
|
||
### 給 Architect
|
||
1. **單例鎖**:同一台機器同時開多個 visionA-local 視窗時,是否共用同一個後端 server?需要 single-instance lock。
|
||
2. **Port 衝突處理**:3721 被佔用時的 fallback 策略?UI 怎麼呈現?
|
||
3. **Tray 實作**:Wails v2 的 tray API 在 linux 上支援度如何?有無需要 systray fallback?
|
||
4. **檔案關聯**:要不要註冊 `.nef` 為 visionA-local 可開啟?這要寫進 installer。
|
||
5. **深色模式偵測**:Wails 能否偵測系統主題變更並即時 push 給前端?
|
||
6. **原生選單**:Wails 的 menu API 跨平台一致性如何?還是要各平台寫一份?
|
||
|
||
---
|
||
|
||
## 7. 需要使用者本人決定的設計向問題
|
||
|
||
| # | 問題 | 選項 |
|
||
|---|------|------|
|
||
| 1 | **品牌識別** | A. 直接沿用 edge-ai-platform 既有視覺(字母 E),只換名字 / B. 做一個新的 visionA-local logo 與色系 / C. 先用臨時 wordmark,上線前再處理 |
|
||
| 2 | **深色模式策略** | A. 預設跟隨系統 + 可手動覆寫(推薦) / B. 只提供 dark(技術工具常見) / C. 只提供 light |
|
||
| 3 | **首次啟動引導** | A. 強制走完 3 步歡迎流程 / B. 只顯示歡迎畫面,可一鍵跳過 / C. 完全跳過,直接進 Dashboard,用 tooltip 引導 |
|
||
| 4 | **Mock 模式預設** | A. 第一次啟動預設 Mock(零門檻)/ B. 第一次啟動預設真實硬體 / C. 強制使用者選擇 |
|
||
| 5 | **視窗關閉行為** | A. 關閉 = 收進 tray,server 繼續(像 Docker Desktop)/ B. 關閉 = 結束程式 / C. 讓使用者在 Settings 選擇 |
|
||
| 6 | **開機自啟動** | A. 預設關,使用者可開 / B. 首次啟動時詢問 / C. 預設開 |
|
||
| 7 | **多語系範圍** | 繁中 only / 繁中 + 英文 / 全部沿用原專案語言 |
|
||
| 8 | **Dashboard 去 cluster 後的排版** | A. 維持 4 個 stat card,把 cluster 換成別的指標(例:累計推論次數)/ B. 減為 3 個 stat card,讓版面更寬鬆 |
|
||
| 9 | **Tray 是否可選關閉** | A. Tray 是核心體驗,強制常駐 / B. Settings 可關閉 tray,改為傳統 app 模式 |
|
||
| 10 | **Settings 頁面改造程度** | A. 僅移除 relay/cluster 相關設定 / B. 重新設計為桌面 app 風格(分頁式:一般/硬體/模型/外觀/進階) |
|
||
|
||
---
|
||
|
||
## 下一步建議
|
||
|
||
1. 使用者先回答第 7 節的 10 個問題(尤其 1, 2, 3, 4, 5)
|
||
2. 並行進行:Architect 回答第 6 節的技術問題
|
||
3. 第二輪我會產出 IA(資訊架構圖)、First-Run 流程 wireframe、Tray 互動規格、Settings 分頁結構草案
|
||
4. 第三輪再進入完整 Design Tokens + 元件規格 + HTML Prototype
|