# 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 ./...` 驗證可通過