# ADR-003: leWOOOgo 模組化架構 > **狀態**: Accepted > **日期**: 2026-03-19 > **決策者**: CTO + CEO ## 背景 AWOOOI 需要高度模組化的架構,讓開發者能像組樂高一樣快速組合功能。CEO 命名此引擎為 **leWOOOgo** (樂高 + WOOO)。 傳統 monolithic 架構難以擴展,plugin 架構則能支援生態系統發展。 ## 決策 **採用六大積木類別的 Plugin 架構** ``` ┌─────────────────────────────────────────────────────────────────┐ │ leWOOOgo Engine │ ├─────────────────────────────────────────────────────────────────┤ │ │ │ 🧱 INPUT ──────→ 🧠 BRAIN ──────→ 📢 OUTPUT │ │ (觸發器) (AI 處理) (通知) │ │ │ │ │ │ │ │ ↓ │ │ │ │ 🔧 ACTION │ │ │ │ (執行器) │ │ │ │ │ │ │ │ └───────→ 📊 DATA ←───────────────┘ │ │ (儲存) │ │ │ │ 🎨 UI │ │ (介面元件) │ │ │ └─────────────────────────────────────────────────────────────────┘ ``` ### 六大積木類別 | 類別 | 介面 | 用途 | 範例 | |------|------|------|------| | **INPUT** | `TriggerPlugin` | 觸發工作流 | Webhook, Cron, Alert, Email | | **BRAIN** | `AgentProvider` | AI 處理決策 | LLM Router, RAG, Triage, MCP | | **OUTPUT** | `NotificationChannel` | 發送通知 | Telegram, Slack, LINE, Email | | **ACTION** | `ActionExecutor` | 執行操作 | K8s, SSH, Docker, API Call | | **DATA** | `DataAdapter` | 資料存取 | PostgreSQL, Redis, S3, Vector | | **UI** | `WidgetComponent` | 介面元件 | Card, Chart, Timeline, Status | ### 核心介面定義 ```typescript // packages/lewooogo-core/src/interfaces/plugin.ts /** 所有 Plugin 的基礎介面 */ interface LeWOOOgoPlugin { readonly id: string readonly name: string readonly version: string readonly category: 'INPUT' | 'BRAIN' | 'OUTPUT' | 'ACTION' | 'DATA' | 'UI' initialize(): Promise healthCheck(): Promise shutdown(): Promise } /** INPUT 觸發器 */ interface TriggerPlugin extends LeWOOOgoPlugin { category: 'INPUT' subscribe(handler: TriggerHandler): Unsubscribe getSchema(): TriggerSchema } /** BRAIN AI 處理器 */ interface AgentProvider extends LeWOOOgoPlugin { category: 'BRAIN' process(input: AgentInput): Promise getCapabilities(): AgentCapability[] } /** OUTPUT 通知頻道 */ interface NotificationChannel extends LeWOOOgoPlugin { category: 'OUTPUT' send(message: NotificationMessage): Promise getTemplates(): NotificationTemplate[] } /** ACTION 執行器 */ interface ActionExecutor extends LeWOOOgoPlugin { category: 'ACTION' execute(action: ActionRequest): Promise dryRun(action: ActionRequest): Promise rollback(executionId: string): Promise } /** DATA 資料適配器 */ interface DataAdapter extends LeWOOOgoPlugin { category: 'DATA' connect(): Promise query(request: QueryRequest): Promise disconnect(): Promise } /** UI 介面元件 */ interface WidgetComponent extends LeWOOOgoPlugin { category: 'UI' render(props: WidgetProps): ReactNode getConfigSchema(): JSONSchema } ``` ### 資料夾結構 ``` packages/ ├── lewooogo-core/ # 核心引擎 │ ├── src/ │ │ ├── interfaces/ # 六大介面定義 │ │ ├── registry/ # Plugin 註冊中心 │ │ ├── pipeline/ # 工作流引擎 │ │ └── utils/ # 共用工具 │ └── package.json │ ├── lewooogo-input/ # INPUT 積木 │ ├── src/ │ │ ├── webhook/ │ │ ├── cron/ │ │ ├── prometheus-alert/ │ │ └── email-trigger/ │ └── package.json │ ├── lewooogo-brain/ # BRAIN 積木 │ ├── src/ │ │ ├── llm-router/ # LLM 路由器 │ │ ├── mcp-bridge/ # MCP 整合 (ADR-001) │ │ ├── triage-engine/ # 告警分級 │ │ └── rag-provider/ # RAG 檢索 │ └── package.json │ ├── lewooogo-output/ # OUTPUT 積木 │ ├── src/ │ │ ├── telegram/ │ │ ├── slack/ │ │ ├── line/ │ │ └── email/ │ └── package.json │ ├── lewooogo-action/ # ACTION 積木 │ ├── src/ │ │ ├── kubernetes/ │ │ ├── ssh/ │ │ ├── docker/ │ │ └── http-api/ │ └── package.json │ ├── lewooogo-data/ # DATA 積木 │ ├── src/ │ │ ├── postgres/ │ │ ├── redis/ │ │ ├── s3/ │ │ └── vector-db/ │ └── package.json │ └── lewooogo-ui/ # UI 積木 ├── src/ │ ├── cards/ │ ├── charts/ │ ├── timeline/ │ └── status-indicators/ └── package.json ``` ## 理由 ### 1. 開發者體驗 (DX) | 傳統方式 | leWOOOgo 方式 | |---------|--------------| | 修改核心程式碼 | npm install + 註冊 | | 重新部署整體 | 熱插拔 Plugin | | 閱讀大量文檔 | 統一介面 + TypeScript | ### 2. 生態系統潛力 標準介面允許第三方開發 Plugin,形成市場。 ### 3. 測試隔離 每個 Plugin 獨立測試,不影響核心引擎。 ## 後果 ### 優點 - **模組化** 功能獨立開發部署 - **可擴展** 第三方生態系統 - **可測試** 單元測試隔離 - **可維護** 責任分離清晰 ### 缺點 - **初期成本** 需建立完整介面規範 - **效能開銷** Plugin 動態載入有成本 - **版本管理** 多 package 需 monorepo 工具 ### 風險 | 風險 | 緩解措施 | |------|---------| | 介面設計錯誤 | Phase 0 充分討論 + 早期 POC 驗證 | | Plugin 衝突 | Plugin Registry 管理 + 命名空間隔離 | | 效能問題 | 關鍵路徑避免過度抽象,效能測試 | ## Monorepo 工具 採用 **pnpm workspace** + **Turborepo**: ```yaml # pnpm-workspace.yaml packages: - 'apps/*' - 'packages/*' ``` ```json // turbo.json { "pipeline": { "build": { "dependsOn": ["^build"], "outputs": ["dist/**"] }, "test": { "dependsOn": ["build"] } } } ``` ## 參考 - [Turborepo](https://turbo.build/) - [pnpm Workspaces](https://pnpm.io/workspaces) - ADR-001: MCP Protocol 採用 - 會議記錄: `docs/meetings/2026-03-19_FRONTEND_RESTRUCTURE_STRATEGY.md`