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>
129 lines
6.0 KiB
Markdown
129 lines
6.0 KiB
Markdown
# 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 編譯失敗)
|