|
|
3355a096b8
|
feat(local-tool): 首次啟動自動安裝 Kneron WinUSB driver
行為改變:Wails app 首次啟動會在 venv 就緒後、spawn server 前自動呼叫
libwdi 安裝 Kneron WinUSB driver。使用者不再需要手動點「安裝 USB Driver」
按鈕(按鈕保留供失敗後重試用)。
實作:
- startServer() step 1.5 新增 ensureDriverInstalled() 呼叫
- 用 <dataDir>/.driver-installed 記號檔避免每次啟動都彈 UAC
- 失敗不擋 server 啟動,只寫 log,使用者可稍後手動重試
- 新增 app-level log helper appLog() 寫到 <dataDir>/logs/wails.log
(Wails Windows 以 windowsgui subsystem build,os.Stderr 指向 null device,
沒有這個檔使用者看不到 startup 期間的 debug 訊息)
- 手動 InstallKneronDriver binding 成功時也寫記號檔
使用者移除 .driver-installed 檔就能強制重裝(例如 Windows 更新把 driver 弄壞時)。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 08:03:37 +08:00 |
|
|
|
d1ff55005a
|
debug(local-tool): driver install verbose 輸出 + 安裝後自我驗證
- Python script 對每個 PID install 後 capture traceback,不再 swallow
- 裝完立刻 scan_devices() 驗證 SDK 能不能開 handle,印 is_connectable
- 安裝結果完整寫到 server.stderr.log(而不是只回錯誤摘要)
- 判斷 DONE 標記 + 至少一個 OK 才算成功
這讓我們能清楚看到 libwdi 到底是「沒權限 / DLL 載入失敗 / 綁定成功但
裝置 is_connectable 還是 False(代表 driver 層級 OK 但裝置需要重插)」
哪一種情境,而不是只看到籠統的「error 28」。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 07:38:43 +08:00 |
|
|
|
4902cb5531
|
feat(local-tool): Kneron WinUSB driver 透過 KneronPLUS SDK libwdi 安裝
根因:
KP_ERROR_CONNECT_FAILED (error code 28) — Kneron USB 裝置預設沒綁定
WinUSB driver,SDK 無法開 handle。原 .iss 的 pnputil /add-driver 做法
需要 .cat 簽章(Windows 10/11 driver signing enforcement),我們沒有。
參考 edge-ai-platform/installer/platform_windows.go 的 installKneronDriverViaSDK:
KneronPLUS SDK 內建 libwdi wrapper — kp.core.install_driver_for_windows(pid)
libwdi 會自動用臨時自簽憑證,不需要 .cat 檔,只需要 UAC 提權。
實作:
- server/internal/api/handlers/system_driver_windows.go(新):
組 Python script → kp.core.install_driver_for_windows 對 KL520/KL720/KL720_LEGACY →
PowerShell Start-Process -Verb RunAs 提權執行 → 結果寫 temp 檔讀回
- server/internal/api/handlers/system_driver_other.go(新):非 Windows stub
- system_handler.go: NewSystemHandler 新增 pythonBin 參數 + InstallDriver handler
先判斷 runtime.GOOS==windows 才執行
- router.go: 新增 POST /system/install-driver
- main.go: 解析 pythonBin(VISIONA_PYTHON env var → cfg.PythonBin)傳入
前端:
- frontend/src/app/devices/page.tsx:Windows only 多一個「安裝 USB Driver」按鈕
(用 navigator.userAgent 判斷平台)
- frontend/src/stores/device-store.ts:connect 失敗訊息偵測 winusb / error 28 /
KP_ERROR_CONNECT_FAILED 特徵字串,回一條明確的繁中提示引導使用者去點按鈕
Wails app 端:
- visiona-local/app.go: 新增 InstallKneronDriver() binding 作為備用入口(目前前端沒用到,
因為前端跑在 http://127.0.0.1 不是 wails://,但保留給未來 splash 階段觸發用)
- visiona-local/platform_{windows,darwin,linux}.go: installKneronWinUSBDriver 平台實作
/ 跨平台 stub
.iss:
- 移除 pnputil /add-driver 的 [Run] entry(它是 silent-fail 的 dead code,
因為沒 .cat 簽章)
- 新增註解說明:driver 安裝改由 app 端呼叫 libwdi 完成
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 05:25:32 +08:00 |
|
|
|
f8533a6b04
|
fix(local-tool): sidebar icon + Wails Windows icon.ico + 掃裝置路徑修復
sidebar E icon:
- frontend/src/components/layout/sidebar.tsx 左上角的 "E" 方塊換成 <img> 指向
/visiona-logo.png,從 frontend/public/visiona-logo.png serve
Wails 桌面/工作列 icon:
- 把 branding/icon.ico 複製到 visiona-local/build/windows/icon.ico
- Wails v2 Windows build 偵測到這個檔案就會直接用它當 exe embedded icon,
不再從 appicon.png 自動 resize(解析度更好)
掃裝置根因修復:
1. server main.go:新增 resolveBridgeScript() 智慧找 kneron_bridge.py
- 優先 <exe>/scripts/kneron_bridge.py
- fallback <exe>/../scripts/... 對應 Windows installer 的 {app}\bin\ + {app}\scripts\ 佈局
- fallback <exe>/../Resources/scripts/... 對應 macOS app bundle
2. server kneron/detector.go:ResolvePython 重寫
- 最高優先:VISIONA_PYTHON 環境變數(由 Wails 殼層注入)
- 加入 visiona-local 新路徑:%APPDATA%\visiona-local\runtime\venv、
~/Library/Application Support/visiona-local/runtime/venv、
~/.local/share/visiona-local/runtime/venv
- 保留 edge-ai-platform 舊路徑作為 legacy fallback
3. visiona-local/app.go:spawn server 時 export VISIONA_PYTHON=<pyBin>
讓 detector 直接用 Wails 殼層已經 resolve 好的 python interpreter,
不再自己獨立去找造成不一致。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 04:59:23 +08:00 |
|
|
|
50a3f73acd
|
feat(local-tool): 品牌視覺設計 + 內建模型首次啟動 seed
#8 首次啟動 seed 內建模型:
- app.go 新增 seedUserDataDir() 在 server spawn 之前執行
- 若 user data-dir 缺 models.json,從 locateBundleDataDir() 複製
models.json + nef/ 預置模型過去
- 新增 locateBundleDataDir() / copyFile() / copyDirRecursive() helper
- user 第一次開 app 會看到 8 個 Kneron 預置 .nef 模型(kl520×5 + kl720×3)
#5 #6 #7 品牌視覺:
- 新增 branding/ 目錄存放設計資產與生成工具
- logo.svg(向量原始稿)
- icon-{16,...,1024}.png(10 種尺寸)
- icon.ico(Windows 多解析度 ICO,PNG-in-ICO 格式)
- icon.icns(macOS)
- tools/gen_icon.go + gen_ico.go(純 Go 生成工具,未來調整 logo 用)
- README.md + 色票表
- 部署:
- visiona-local/build/appicon.png → Wails build 會嵌入 exe
- visiona-local/frontend/icon.png → splash 使用
- frontend/src/app/favicon.ico + icon.png → Next.js App Router favicon
- splash page 升級:加 logo icon + 品牌名 visionA Local + tagline Edge AI Workspace
- Wails window title: "visionA Local — Edge AI Workspace"
- wails.json productName: "visionA Local"
- Next.js metadata title + icons
- i18n: en/zh-TW 把殘留的 "Edge AI 平台" 字串改為 visionA Local 品牌
- .iss: SetupIconFile 指向 branding/icon.ico + UninstallDisplayIcon +
ArchitecturesAllowed 改 x64compatible 修掉之前的 deprecation warning
品牌色票:
- 主色 #4F7EFF(電子藍)
- 輔色 #6EF3C5(mint 點綴)
- 深色背景漸層 #1A1F36 → #0E1222
- 警示 #FF6B6B
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 04:42:41 +08:00 |
|
|
|
8e7b6ae435
|
feat(local-tool): clean build 為預設 + 藏 server 小黑窗 + 預設真實模式
Makefile:
- 新增 clean-all target:clean + wails build/ + frontend build/ + server embed
- 新增 clean-build-exe / clean-build-dmg / clean-build-appimage
bootstrap-windows.ps1:
- 預設改為 clean build(每次重做 wails + server binary + frontend embed)
- 保留 vendor/ 快取避免重下 200MB+ 第三方相依
- 需要 fast path(只重跑 iscc)時設 VISIONA_FAST=1
app.go:
- configureSysProcAttr() 注入子行程,Windows 下 CREATE_NO_WINDOW 藏掉 server 小黑窗
- 覆蓋 server spawn / tar 解壓 / venv 建立 / pip install 四個關鍵點
- mockMode 預設改 false(依使用者決策 Q8,預設走真實硬體模式)
需要強制 mock 時設環境變數 VISIONA_MOCK=1
platform_{windows,darwin,linux}.go:
- 新增 configureSysProcAttr(cmd):Windows 設 HideWindow + CREATE_NO_WINDOW,
macOS/Linux 空實作
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 04:25:09 +08:00 |
|
|
|
eb52f8c690
|
fix(local-tool): locateServerBinary 找 {app}\bin\ 子目錄(Windows/Linux installer 佈局)
根因:Windows installer 把 visiona-local-server.exe 裝到 {app}\bin\
(.iss 的 DestDir: "{app}\bin"),但 locateServerBinary 只搜
exeDir\visiona-local-server.exe 和 macOS bundle 專屬路徑,
Windows/Linux 打包後的 bin/ 子目錄完全沒被搜尋,導致執行時
"server binary not found" 嚴重錯誤。
修法:
- locateServerBinary 第一優先搜 exeDir\bin\visiona-local-server
(Inno Setup installer / AppImage 的標準佈局)
- 開發模式 fallback 新增 payload/<goos>/bin/ 候選路徑
- 同時修正 locateBundleBinDir / locateBundledPythonAssets 的開發模式
fallback 寫死 "payload/darwin",改用 runtime.GOOS 動態選 payload 子目錄
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 03:45:17 +08:00 |
|
|
|
83981e5b1b
|
docs(local-tool): progress.md 記錄 M7 Windows 一鍵 build + splash regression
- 新增 M7-A:Windows 一鍵 build 工具鏈踩坑紀錄(11 項修好)
- 新增 M7-B:splash regression P0 修復(visiona-local/frontend 殘留 wizard → 改為 splash+redirect)
- 補「M1 驗收流程漏看 Wails 視窗內容」到未解決問題,作為後續 M 任務驗收 checklist
- 補 ffmpeg GPL release blocker 到未解決問題清單
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 03:35:20 +08:00 |
|
|
|
570e040a67
|
fix(local-tool): Wails 主視窗改為 splash + redirect 到 Next.js 主 UI
根因:visiona-local/frontend/ 是從 edge-ai-platform 複製過來的 installer wizard
HTML/JS/CSS,整組沒清理。main.go 的 //go:embed all:frontend 把這堆 wizard
直接當 Wails 主視窗內容,使用者開啟 app 看到的就是 "Edge AI Platform Installer"
而不是 Next.js 主 UI。macOS dmg 版本也有同樣問題,只是之前驗證時沒開 Wails
視窗而是用瀏覽器直連 localhost:3721 所以沒抓到。
修法:把 visiona-local/frontend/ 重寫為極簡 splash:
- index.html:splash 畫面
- app.js:import GetServerStatus / GetServerURL binding,輪詢直到 server ready,
window.location.replace(url + '/') 跳到 Next.js 主 UI
- style.css:splash 樣式
Next.js 主 UI 不使用任何 Wails JS binding(純 HTTP API),所以從 wails://
跳到 http://127.0.0.1:<port>/ 後功能完整可用。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 03:32:31 +08:00 |
|
|
|
1c5866ed14
|
debug(local-tool): Windows build 失敗追蹤
Makefile _run-iscc:
- 開頭印出 ISCC 環境變數和 PATH 前幾項,確認有沒有正確傳進來
bootstrap-windows.ps1:
- 不再用 bash.exe -lc "..." 傳整條字串(含空格路徑會被 PS 雙層 quoting 切斷)
- 改寫成 tmp .sh 檔,用 bash.exe -l file.sh 執行
- 執行前印出 script 內容,執行後刪掉 tmp 檔
- script 開頭加 'set -e' 確保任何一行失敗立即停止並回非 0
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 03:17:07 +08:00 |
|
|
|
06031206af
|
feat(local-tool): Windows build fast path + 產物驗證
Makefile:
- 新增 exe-only target:只跑 iscc 打包 installer,不重 build wails/payload
- 拆出 _run-iscc 共用 recipe,exe 和 exe-only 都依賴它
bootstrap-windows.ps1:
- 偵測 visiona-local.exe / server.exe / ffmpeg.exe / python.tar.gz 都在時走 fast path
只跑 make exe-only,省掉重複 wails build 的數分鐘
- 跑完驗證 dist\visiona-local-*-windows-x64.exe 確實存在,否則明確 Fail 並提示手動 iscc 指令
使用情境:使用者刪掉 dist\ 想重打 installer,再跑一次 bootstrap 就能秒出 .exe
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 03:11:42 +08:00 |
|
|
|
4521ee3119
|
fix(local-tool): Inno Setup 6.3+ 不再內建 ChineseTraditional.isl
Inno Setup 6.3 起官方只保留 ChineseSimplified,繁體中文語系需額外下載。
改為以 WITH_TRAD_CHINESE 宏條件啟用,預設只用英文 installer UI,
避免在新版 Inno Setup 上直接 compile error。
這只影響「安裝精靈本身」的語系,應用程式 UI 的 i18n 不受影響。
未來若要帶繁體中文 installer,下載 istrans 檔案後用 iscc /DWITH_TRAD_CHINESE=1 編譯。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 02:45:51 +08:00 |
|
|
|
80252b12dc
|
chore(local-tool): 為 make exe 加診斷輸出
印出 iscc 的 cwd、exit code、dist/ 實際內容,
避免靜默失敗讓人找不到產物去向。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 02:41:51 +08:00 |
|
|
|
dbad729da3
|
fix(local-tool): Inno Setup 偵測加入 user-scope 安裝路徑
winget 7.x 的 Inno Setup 可能裝到 %LOCALAPPDATA%\Programs\Inno Setup 6\
而非傳統的 Program Files (x86)。新增 user-scope 固定路徑 + HKCU 登錄檔 +
%LOCALAPPDATA%\Programs 遞迴掃描三種偵測方式。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 02:35:13 +08:00 |
|
|
|
e6f7afe8db
|
fix(local-tool): 強化 Inno Setup 偵測,支援 ISCC 環境變數 override
Makefile (exe target):
- 新增 ISCC 環境變數 override(絕對路徑優先)
- 偵測順序:\$ISCC → command -v iscc → 已知絕對路徑
- 找不到時列出已嘗試路徑方便 debug
bootstrap-windows.ps1:
- Find-Iscc 函數改用多層策略:固定路徑 → 登錄檔 InstallLocation → Program Files 遞迴掃描
- 偵測不到就自動 winget --force 重裝再試一次
- 同時 export PATH 和 ISCC 雙保險傳給 Makefile
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 02:27:38 +08:00 |
|
|
|
634e4011fd
|
fix(local-tool): bootstrap 把 Inno Setup 目錄加進 MSYS2 bash PATH
winget 裝的 Inno Setup 6 在 'C:\Program Files (x86)\Inno Setup 6\',
不在 PATH 裡,MSYS2 bash 找不到 iscc.exe 導致 make exe 失敗。
改由 bootstrap 主動偵測安裝路徑並 export 進 bash session PATH。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 02:23:37 +08:00 |
|
|
|
13ce654ac2
|
fix(local-tool): ffmpeg zip 下載改用相對路徑
Windows 版 python.exe 不懂 MSYS2 的 /tmp 路徑語法,會拿著字面值 '/tmp/...'
去 Windows filesystem 找不到檔案。改下載到 vendor/ffmpeg/windows/ffmpeg-win.zip
相對路徑,bash 跟 python 都看得懂。
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 02:17:18 +08:00 |
|
|
|
a66fd5665b
|
fix(local-tool): 繞過 Windows Store 的 python stub
- Makefile:vendor-wheels-windows / vendor-ffmpeg-windows 改用迴圈偵測真實 python
排除 WindowsApps 路徑下的 Store alias stub,優先使用 VISIONA_PYTHON 環境變數
- Makefile:vendor-ffmpeg-windows 解壓完驗證檔案存在,失敗時 exit 1 而非靜默
- bootstrap-windows.ps1:主動找 winget 裝的真實 python.exe(LOCALAPPDATA / Program Files / py launcher),
轉成 MSYS2 路徑後以 VISIONA_PYTHON 傳給 Makefile
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 02:11:16 +08:00 |
|
|
|
071964bddd
|
fix(local-tool): Windows build 跨平台相容性修正
Makefile:
- vendor-wheels-windows 自動偵測 pip3/pip/python -m pip,MSYS2 bash 裡沒 pip3 也能跑
- vendor-ffmpeg-windows 改用 python zipfile 解壓,移除 unzip 依賴
- 新增 build-server-windows / build-server-linux 兩個 cross-build target
- payload-windows / payload-linux 改依賴對應的 build-server-*,不再只印警告
bootstrap-windows.ps1:
- 設定 MSYS2_PATH_TYPE=inherit,讓 MSYS2 bash 繼承 Windows PATH 找到 go/pnpm/python/wails
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 01:58:25 +08:00 |
|
|
|
ba15097e9d
|
fix(local-tool): PowerShell 5.1 compatibility for bootstrap-windows.ps1
- 改用陣列 + -join ' && ' 組 bash 指令,避開 PS5.1 不支援 && 運算子
- 加入 UTF-8 BOM,避免 Windows 10 預設用 ANSI/Big5 解讀造成中文亂碼
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-12 01:44:06 +08:00 |
|
|
|
5a8d2797c2
|
chore(local-tool): rename local_tool → local-tool, add linux/windows bootstrap scripts
- 統一目錄名為 local-tool(連字號),修正所有文件中殘留的底線版本
- 新增 scripts/bootstrap-linux.sh 與 scripts/bootstrap-windows.ps1
一鍵安裝依賴(Go/Node/pnpm/Wails/MSYS2)並執行 payload + installer build
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
2026-04-11 23:23:29 +08:00 |
|
|
|
4e370bb730
|
docs: move Repository section from README to .claude/repo-notes.md
Repository mirror info and pushall alias is local-only convention,
not user-facing. Move to .claude/ as local memo.
|
2026-04-11 22:17:32 +08:00 |
|
|
|
c54f16fca0
|
Initial commit: visionA monorepo with local-tool subproject
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>
|
2026-04-11 22:10:38 +08:00 |
|