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>
142 lines
7.6 KiB
Markdown
142 lines
7.6 KiB
Markdown
# 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 / 備註
|
||
1. **Module name 尚未更改** — `go.mod` 仍是 `module edge-ai-platform`。這符合「本階段不修改內容」的承諾,但 M1-3 務必記得要改 module name 並同步所有 import。
|
||
2. **`scripts/drivers/` 順帶帶入** — 來源 `server/scripts/` 下有一個 `drivers/` 子目錄,code-reuse-plan 沒特別列出也沒列入刪除。Backend Agent 一起複製過來了,屬於無害的保守做法。若確認完全用不到,可在 M1-3 或清理階段再決定是否刪除。
|
||
3. **`web/embed.go` 保留但 `web/out/` 未複製** — 這是刻意的:`go:embed` 目標目錄是 `out/`,在 M1 階段因為還沒建 frontend,`embed.go` 編譯會失敗。這是 M1-3 或 frontend 階段要處理的問題(需要先放一個 placeholder `out/` 或改 embed 策略),**請提醒 M1-3 注意此編譯障礙**。
|
||
|
||
---
|
||
|
||
## 可以進入 M1-3 嗎?
|
||
|
||
✅ **可以**。M1-2 所有目標達成,複製完整、跳過正確、內容未動。M1-3 可直接依本報告「M1-3 要修的 import 清單」開始清理工作,建議順序:
|
||
|
||
1. 先刪除 A 清單的 4 個整檔
|
||
2. 再改 B 清單的 5 個檔案(router.go 最關鍵)
|
||
3. 執行 `go mod edit -module visiona-local/server`(或使用者決定的名字)
|
||
4. 全檔 find-replace `edge-ai-platform/` → 新 module path
|
||
5. 處理 `web/embed.go` 的 embed target(建立空 `out/` 或加 build tag)
|
||
6. `cd server && go build ./...` 驗證可通過
|