visionA/docs/autoflow/04-architecture/adr/adr-007-visiona-agent-architecture.md
jim800121chen fb7da5d180 chore(autoflow): migrate .autoflow/ 共享層文件至 docs/autoflow/
依 autoflow-agent workspace v2 設計把 PRD / 設計 / 架構 / 交付類
共享文件從個人層 .autoflow/(ignored)搬到 docs/autoflow/(進 git),
讓團隊可共享產品與架構文件,個人層只留 progress / review / testing 等
per-branch 筆記。

- 02-prd/        21 個檔(PRD、features、market-analysis 等)
- 03-design/     18 個檔(design-spec、wireframes、flows 等)
- 04-architecture/ 31 個檔(TDD、design-doc、ADR×14、API 規格等)
- 07-delivery/   3 個檔(project-summary、phase-0.6-handover、stage-deployment-setup)

合計 73 檔。原檔已從 .autoflow/ 移除(migration 工具執行 git mv,
但因 .autoflow/ 在 .gitignore 中、git 將此操作視為新增、無 rename history)。
2026-05-04 16:55:55 +08:00

4.9 KiB
Raw Blame History

ADR-007visionA Agent 採 fork local-tool 獨立演進(非改造 local-tool

狀態

Accepted — 2026-04-22

背景 (Context)

visionA 雲端版需要在使用者桌機上跑一個「local agent」使得雲端 Web UI 可以透過 tunnel 操作桌機上的 Kneron 裝置。

這個 local agent 本質上是:

  • 完整的 local-tool serverKneronPLUS / camera / inference / device / model / Python runtime / ffmpeg 等邏輯完全一樣)
  • 加上 tunnel client反向連 remote-proxy
  • 加上 3 頁極簡 UI狀態 / 配對 / 設定)
  • 減去 local-tool 原本的裝置 / 模型 / 推論操作 UI這些交給雲端 web

關鍵選擇:

  1. 改造 local-tool:讓 local-tool 本身支援「雲端模式」開關,同一份程式碼兩用。
  2. fork local-tool → visionA Agent:複製一份出來,獨立演進。

使用者在 progress.md 明確提出 4 大原則之一:「local-tool 不要動,可以複製出來」。這個 ADR 把這個原則落地並說明技術細節。

決策 (Decision)

採方案 2fork local-tool 建立新專案 /Users/jimchen/visionA/local-agent/2026-04-22 fork 一次後獨立演進。

實作細節

  • 整包複製server/internal/*server/pkg/*vendor/scripts/、Makefile 結構、wails 配置都從 local-tool 整包搬
  • 新增cmd/visiona-agent/Wails app shellinternal/tunnel/internal/pairing/internal/tokenstore/internal/agentconfig/internal/autostart/internal/connstate/internal/logexport/internal/httpserver/
  • 刪除 / 取代local-tool frontendNext.js 多頁 UI整包刪除改為極簡 Vite + React + shadcn SPA3 頁)
  • 改造wails.json、Bundle ID、App namevisionA Agentcom.innovedus.visiona-agent)、go.modmodule visiona-agent

Sync 策略

2026-04-22 fork 一次後不主動 sync local-tool 的改動。若 local-tool 有重大修復,走手動 cherry-pick(人工 diff 檢視 → apply。這個決策在 progress.md visionA Agent 決策表中明列。

考慮過的替代方案

方案 優點 缺點 排除原因
改造 local-tool 支援雲端模式build tag / feature flag 程式碼唯一來源、維護成本低 兩套 UI 分支讓 local-tool 複雜化;使用者測試需覆蓋兩種模式;違反使用者「不動 local-tool」原則 使用者原則 + 複雜度風險
做成 monorepo 兩個 app 共用 server 模組 代碼復用、一次修多處生效 Go module 設定複雜、一處改動可能破兩個 app、測試矩陣加大 雛形階段不值得,收益不確定
純 headless CLI agent(不用 Wails 最輕量 使用者體驗差(無配對 UI、只能 CLI 貼 token、無法 Log 檢視 / 設定 UX 差
抽象出獨立的 "agent-core" library 優雅 需要設計 API、進一步增加結構複雜度、現階段只有一個 consumer 過度設計

後果 (Consequences)

正面影響

  • 完全符合使用者「不動 local-tool」原則local-tool 後續任何改動都不會直接影響 visionA Agent
  • 獨立演進自由visionA Agent 可以按照雲端整合需求自由改 handler、加欄位、刪 UI不擔心破壞 local-tool 使用者
  • 共同起跑點清楚2026-04-22 的 fork 時間戳記是明確的 baseline未來要追 local-tool 新功能時,知道從哪個 commit 開始 diff
  • 打包獨立:兩個產品各自有 installerBundle ID 不衝突,使用者可以同時裝兩個

負面影響(接受的取捨)

  • 維護成本加倍local-tool 若修了 Kneron driver bug需要手動 cherry-pick 到 visionA Agent
  • 程式碼重複:整個 server/ 目錄存兩份;未來長出差異的機率高
  • Installer 體積重複:同樣的 Python / wheels / ffmpeg bundle 各自打包一份(但反正用戶只裝一個)

風險

  • Cherry-pick 遺漏:修復本 bug 卻忘了同步另一邊 → 建立明確的 review checklist當 local-tool 修 Kneron 相關或 security 相關 bug 時,必須評估是否 cherry-pick 到 agent
  • 長出的差異難以回頭合併:隨時間兩邊結構差異加大,未來若想合併可能已不現實 — 接受這個結果,本 ADR 即假設不會合併
  • 使用者同一台電腦裝兩個可能衝突port / config dir 需要明確隔離bundle ID、app name、data dir 全部不同已處理)

合規性

  • 使用者核心原則「local-tool 不要動」— 由 fork 策略保證
  • 與 Design spec 對齊Bundle ID com.innovedus.visiona-agent 獨立
  • Cherry-pick SOP 文件TODOPhase 1 前補)

相關文件

  • progress.md visionA 產品線 4 大核心原則
  • .autoflow/04-architecture/visiona-agent-tdd.md §2-§3
  • ADR-008tunnel client 複用策略)
  • ADR-009token 儲存策略)