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>
7.6 KiB
M1-2 Review — 複製 server core
- 審查者:Reviewer Agent
- 日期:2026-04-10
- 審查對象:
/Users/jimchen/visionA/local-tool/server/ - 來源:
/Users/jimchen/Innovedus/edge-ai-platform/edge-ai-platform/server/
結論:✅ 通過
M1-2 的任務目標是「直接複製 server core,跳過要刪的目錄,不修改內容」。所有檢查項全部符合預期,檔案內容與來源 byte-for-byte 相同,跳過清單 100% 正確。Import 在這個階段壞掉是預期中的事(M1-3 才會清理),以下已預先蒐集 M1-3 要修的完整清單。
跳過清單檢查
| 項目 | 來源是否存在 | 目標是否存在 | 結果 |
|---|---|---|---|
server/internal/cluster/ |
✅ | ❌ | ✅ 正確跳過 |
server/internal/tunnel/ |
✅ | ❌ | ✅ 正確跳過 |
server/internal/flash/ |
✅ | ❌ | ✅ 正確跳過 |
server/internal/update/ |
✅ | ❌ | ✅ 正確跳過 |
server/internal/relay/ |
✅ | ❌ | ✅ 正確跳過(code-reuse-plan 未明列,但符合「relay 相關一律砍」精神) |
server/pkg/hwid/ |
✅ | ❌ | ✅ 正確跳過 |
server/cmd/relay-server/ |
✅ | ❌ | ✅ 正確跳過(目標根本沒有 cmd/ 目錄) |
server/tray/ |
✅ | ❌ | ✅ 正確跳過 |
server/scripts/firmware/ |
✅ | ❌ | ✅ 正確跳過 |
server/scripts/update_kl720_firmware.py |
✅ | ❌ | ✅ 正確跳過 |
server/scripts/__pycache__/ |
✅ | ❌ | ✅ 正確跳過 |
server/web/out/(舊 Next.js 產物) |
✅ | ❌ | ✅ 正確跳過 |
edge-ai-server binary / .next/ |
— | ❌ | ✅ 未帶入 |
驗證方法: 對目標執行 for d in ...; do [ -e "$d" ] && echo FOUND || echo OK; done,全部 OK-MISSING。
必要檔案檢查
| 項目 | 結果 | 備註 |
|---|---|---|
server/main.go |
✅ | 305 行,與來源逐 byte 相同 |
server/go.mod |
✅ | 與來源相同 |
server/go.sum |
✅ | 與來源相同 |
server/internal/api/ |
✅ | 含 handlers、ws、router.go、middleware.go、api_e2e_test.go 全齊 |
server/internal/camera/ |
✅ | |
server/internal/config/ |
✅ | |
server/internal/deps/ |
✅ | |
server/internal/device/ |
✅ | |
server/internal/driver/ |
✅ | |
server/internal/inference/ |
✅ | |
server/internal/model/ |
✅ | |
server/pkg/logger/ |
✅ | |
server/pkg/wsconn/ |
✅ | Backend 判斷保留 — 合理,ws/ 下的 hub/device_events 等會依賴它 |
server/data/models.json |
✅ | |
server/data/nef/ |
✅ | 8 個 .nef 檔、data/ 總大小 73M,符合規格 |
server/scripts/kneron_bridge.py |
✅ | |
server/scripts/requirements.txt |
✅ | |
server/scripts/drivers/ |
✅ | 來源也有,順帶帶入,無衝突 |
server/web/embed.go |
✅ |
注意: server/internal/api/handlers/cluster_handler.go、server/internal/api/ws/flash_ws.go、cluster_flash_ws.go、cluster_inference_ws.go 這四個「檔案層級要刪」的檔案目前「存在」。這符合本階段規則(只跳過整個目錄,不砍單檔;檔案層級的刪除是 M1-3 的工作)。已列入下方 M1-3 待辦。
內容未修改驗證
使用 diff -rq SRC/ DST/ 全面比對,結果:
diff -q main.go→ 完全相同diff -q go.mod→ 完全相同diff -rq internal/→ 只回報Only in SRC: cluster / tunnel / flash / update / relay(全部都是預期要跳過的)diff -rq pkg/→ 只回報Only in SRC: hwid(預期)diff -rq scripts/→ 只回報Only in SRC: __pycache__ / firmware / update_kl720_firmware.py(預期)diff -rq data/→ 無任何差異diff -rq web/→ 只回報Only in SRC: out(預期,舊 build 產物)
結論:除了跳過清單上的項目,其餘檔案與來源 100% 相同。Backend Agent 確實沒動任何內容。
M1-3 要修的 import 清單(預先蒐集)
以下檔案含有「壞掉的 import」或「需要刪除的整檔」,M1-3 必須處理:
A. 需要刪除的整個檔案
| 檔案 | 原因 |
|---|---|
server/internal/api/handlers/cluster_handler.go |
cluster 已砍(removed-code.md §2) |
server/internal/api/ws/flash_ws.go |
flash 已砍 |
server/internal/api/ws/cluster_flash_ws.go |
cluster + flash |
server/internal/api/ws/cluster_inference_ws.go |
cluster |
B. 需要修改 import 與邏輯的檔案
| 檔案 | 壞掉的 import | M1-3 動作 |
|---|---|---|
server/main.go |
internal/cluster(L23)、internal/flash(L27)、internal/tunnel(L30)、pkg/hwid(L31) |
依 removed-code.md §3、§4 刪除 import 與對應變數/啟動邏輯,並同步改 module path(edge-ai-platform → visiona-local/server 或使用者決定的名字) |
server/internal/api/router.go |
internal/cluster(L13)、internal/flash(L15) |
依 api-endpoints.md §4 改寫:移除 clusterMgr / flashSvc / relayToken 參數與對應 routes |
server/internal/api/api_e2e_test.go |
internal/cluster(L14)、internal/flash(L16) |
依 code-reuse-plan §2 改寫:刪除 cluster / flash / auth 測試案例 |
server/internal/api/handlers/device_handler.go |
internal/flash(L11) |
移除 FlashDevice handler 與 flashSvc 注入 |
server/internal/api/handlers/system_handler.go |
internal/update(L9) |
移除 CheckUpdate、giteaURL 參數、update-check handler |
C. Module path 改名(全檔大量影響)
目前 go.mod 仍是 module edge-ai-platform(未改),所以所有 .go 檔中 import "edge-ai-platform/..." 會在 M1-3 改 module 名時一併更新。這是預期內的大規模 find-replace,不算額外壞掉的 import。
D. grep 結果補充
grep -rn "edge-ai-platform/(cluster|tunnel|flash|update|relay|hwid)" server/
僅在上表 6 個檔案命中,其餘檔案乾淨。ws/ 下的剩餘檔案(hub.go、device_events_ws.go、server_logs_ws.go、inference_ws.go)沒有任何壞掉的 import,M1-3 只需保留。
問題
🔴 Critical
無。
🟡 Major
無。M1-2 的範圍就是「複製 + 跳過」,目前所有檔案都在正確位置,內容未動,沒有任何超出職責的改動。
🟢 Minor / 備註
- Module name 尚未更改 —
go.mod仍是module edge-ai-platform。這符合「本階段不修改內容」的承諾,但 M1-3 務必記得要改 module name 並同步所有 import。 scripts/drivers/順帶帶入 — 來源server/scripts/下有一個drivers/子目錄,code-reuse-plan 沒特別列出也沒列入刪除。Backend Agent 一起複製過來了,屬於無害的保守做法。若確認完全用不到,可在 M1-3 或清理階段再決定是否刪除。web/embed.go保留但web/out/未複製 — 這是刻意的:go:embed目標目錄是out/,在 M1 階段因為還沒建 frontend,embed.go編譯會失敗。這是 M1-3 或 frontend 階段要處理的問題(需要先放一個 placeholderout/或改 embed 策略),請提醒 M1-3 注意此編譯障礙。
可以進入 M1-3 嗎?
✅ 可以。M1-2 所有目標達成,複製完整、跳過正確、內容未動。M1-3 可直接依本報告「M1-3 要修的 import 清單」開始清理工作,建議順序:
- 先刪除 A 清單的 4 個整檔
- 再改 B 清單的 5 個檔案(router.go 最關鍵)
- 執行
go mod edit -module visiona-local/server(或使用者決定的名字) - 全檔 find-replace
edge-ai-platform/→ 新 module path - 處理
web/embed.go的 embed target(建立空out/或加 build tag) cd server && go build ./...驗證可通過