# M1-9 Review — 複製 Wails installer shell 改名為 visiona-local **審查日期**:2026-04-11 **審查對象**:`/Users/jimchen/visionA/local-tool/visiona-local/` **任務描述**:從 `edge-ai-platform/installer/` 複製 Wails 殼層,改名為 `visiona-local`,只處理命名與 metadata,不碰邏輯 ## 結論:✅ 通過 所有必要檔案就位,命名規則一致(`visiona-local` 全小寫 for module/binary/bundle ID、`visionA-local` 駝峰 for 產品顯示名),Bundle ID 正確,三平台 wheels 都在,Makefile target 已就緒但註解掉實際執行。`platform_*.go` / `app.go` 邏輯完全沒動,符合 M1-9 範圍。可以進 M1-10。 --- ## 檢查清單 ### 1. 必要檔案存在 | 檔案 | 狀態 | 備註 | |------|------|------| | `app.go` | ✅ | 26502 bytes,未動 | | `main.go` | ✅ | 623 bytes | | `wails.json` | ✅ | | | `go.mod` | ✅ | `module visiona-local` | | `go.sum` | ✅ | 7137 bytes | | `platform_darwin.go` | ✅ | 未動 | | `platform_linux.go` | ✅ | 未動 | | `platform_windows.go` | ✅ | 未動 | | `embed.go` | ✅ | `//go:embed all:payload` | | `build/darwin/Info.plist` | ✅ | | | `frontend/` | ✅ | 有 index.html / app.js / style.css / wailsjs | | `wheels/` | ✅ | macos / linux / windows 三子目錄齊全 | ### 2. wails.json 內容 | 欄位 | 期望 | 實際 | 狀態 | |------|------|------|------| | `name` | `visiona-local` | `visiona-local` | ✅ | | `outputfilename` | `visiona-local` | `visiona-local` | ✅ | | `info.productName` | `visionA-local`(駝峰) | `visionA-local` | ✅ | | `info.companyName` | `Innovedus` | `Innovedus` | ✅ | | `author.name` | — | `Innovedus` | ✅ | | `info.copyright` | — | `Copyright 2026 Innovedus` | ✅ | ### 3. go.mod module ```go module visiona-local go 1.22.0 require github.com/wailsapp/wails/v2 v2.11.0 ``` ✅ 正確 ### 4. Info.plist | 欄位 | 期望 | 實際 | 狀態 | |------|------|------|------| | `CFBundleName` | `visionA-local` | `visionA-local` | ✅ | | `CFBundleDisplayName` | `visionA-local` | `visionA-local` | ✅ | | `CFBundleIdentifier` | `com.innovedus.visiona-local` | `com.innovedus.visiona-local` | ✅ | | `CFBundleExecutable` | `{{.OutputFilename}}`(由 wails 填入) | `{{.OutputFilename}}` | ✅ | | `CFBundleVersion` / `CFBundleShortVersionString` | `{{.Info.ProductVersion}}` | 同 | ✅ | | 沒有殘留 `{{.Name}}` / `{{.Identifier}}` placeholder | — | 僅剩 `{{.OutputFilename}}` / `{{.Info.*}}`(Wails 標準欄位,會在 build 時填入) | ✅ | 說明:`{{.OutputFilename}}`、`{{.Info.ProductVersion}}`、`{{.Info.Copyright}}`、`{{.Info.Comments}}` 等是 Wails 標準 template,會在 `wails build` 時從 `wails.json` 填入,不是需要手動清掉的 placeholder。關鍵的 `{{.Name}}` / `{{.Identifier}}` 已經硬編碼為正確值。 ### 5. 未誤動邏輯 - `app.go` 26502 bytes、`platform_*.go` 體積與 edge-ai-platform 相近 → 未改動 ✅ - grep `edge-ai-platform` 只在 `platform_darwin.go` / `platform_linux.go` 的資料目錄字串 literal 出現(4 筆),符合 M1-9 不動邏輯的範圍 ✅ ### 6. Makefile `wails-macos` target ```makefile wails-macos: ## wails build darwin/amd64 → visiona-local/build/bin/visiona-local.app @echo "[M1-9] wails-macos target 已就緒;實際執行在 M1-12 啟用" @echo " cd visiona-local && wails build -platform darwin/amd64 -clean" # cd visiona-local && wails build -platform darwin/amd64 -clean ``` ✅ target 已寫入 `.PHONY`,實際 `wails build` 指令被註解掉,只印提示訊息,符合 M1-9 不跑 build 的要求。 ### 7. wheels/ 三平台 | 平台 | 檔案 | 狀態 | |------|------|------| | macOS | `KneronPLUS-2.0.0-py3-none-any.whl` | ✅ | | Linux | `KneronPLUS-2.0.0-py3-none-any.whl` | ✅ | | Windows | `KneronPLUS-3.1.2-py3-none-any.whl` | ✅(版本差異屬正常,KneronPLUS Windows 版本號本來就不同) | --- ## 問題 ### 🔴 Blocker 無 ### 🟡 Major 無 ### 🟢 Minor / 提示(不阻擋 M1-9 通過,M1-10 處理) 1. **`main.go` 的 `Title: "Edge AI Platform Installer"`** - 位置:`visiona-local/main.go:18` - 說明:視窗標題仍是原 installer 字串。M1-10 要整個改寫 app.go + main.go 為 visionA-local 的 Python 雙策略空殼,屆時會一併改為 `"visionA-local Installer"` 或類似。列為提示,不在 M1-9 修正。 2. **`platform_darwin.go` / `platform_linux.go` 的 `.edge-ai-platform` 資料目錄字串** - 位置:`platform_darwin.go:17,22`、`platform_linux.go:17,22` - 說明:共 4 筆 literal,對應原 installer 的 `~/.edge-ai-platform` 資料目錄。依第四輪決策 R4-5,新資料目錄為全小寫 `visiona-local`(macOS 改到 `~/Library/Application Support/visionA-local/`)。題目明確說此屬 M1-10 範圍,此處只標記。 3. **`embed.go` 的 `//go:embed all:payload`** - 目前 `visiona-local/` 下**沒有** `payload/` 目錄,在 M1-11 打包前,`go build` / `wails build` 會失敗(`pattern all:payload: no matching files found`)。 - M1-9 沒有要求 build 通過,且 Makefile `wails-macos` 實際指令已被註解,所以不阻擋此任務。但請 M1-10/M1-11 注意:在第一次嘗試 build 前,至少要先建立 `payload/.gitkeep` 或臨時空檔案,避免 embed 編譯炸掉。 4. **`frontend/` 仍是原 installer 的舊 UI**(`index.html` / `app.js`) - M1-10 改寫 installer 邏輯時應同步改 UI,此處僅確認檔案存在,未檢查內容,符合 M1-9 範圍。 --- ## 可以進 M1-10 嗎? ✅ **可以**。 M1-9 目標(複製殼、改命名、改 metadata、不動邏輯)已達成。M1-10 的工作建議如下: 1. 改寫 `main.go` 的視窗標題為 visionA-local 2. 改寫 `app.go` / `platform_*.go` 為 Python runtime 雙策略(A 內嵌 python-build-standalone + B fallback 偵測系統 Python) 3. 更新 `platform_darwin.go` / `platform_linux.go` 的資料目錄常數(`~/Library/Application Support/visionA-local/` 與 `~/.config/visiona-local/`) 4. 改寫 `frontend/` installer UI 5. 建立 `payload/.gitkeep`(避免 embed 編譯失敗)