From 28b125b34f324affbfc37fcb80ec8ad5fcbd7ebb Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 1 Feb 2026 22:27:22 +0800 Subject: [PATCH] fix(openclaw): remove MCP/Skills/Prompts support from OpenClaw OpenClaw only needs provider management functionality, not MCP, Skills, or Prompts features. This commit removes the incorrectly added support: - Revert SCHEMA_VERSION from 6 to 5 (remove v5->v6 migration) - Remove enabled_openclaw field from mcp_servers and skills tables - Remove openclaw field from McpApps and SkillApps structs - Update DAO queries to exclude enabled_openclaw column - Fix frontend components and types to exclude openclaw from MCP/Prompts - Update all related test files --- src-tauri/src/app_config.rs | 22 ++++---------- src-tauri/src/database/dao/mcp.rs | 9 ++---- src-tauri/src/database/dao/skills.rs | 19 +++++------- src-tauri/src/database/mod.rs | 2 +- src-tauri/src/database/schema.rs | 34 +--------------------- src-tauri/src/deeplink/mcp.rs | 6 ++-- src-tauri/src/mcp/claude.rs | 1 - src-tauri/src/mcp/codex.rs | 1 - src-tauri/src/mcp/gemini.rs | 1 - src-tauri/src/mcp/opencode.rs | 1 - src/components/mcp/McpFormModal.tsx | 2 -- src/components/prompts/PromptFormModal.tsx | 5 ++-- src/components/prompts/PromptFormPanel.tsx | 5 ++-- src/types.ts | 1 - tests/msw/state.ts | 8 ++--- 15 files changed, 31 insertions(+), 86 deletions(-) diff --git a/src-tauri/src/app_config.rs b/src-tauri/src/app_config.rs index d53e7f38..323f8a51 100644 --- a/src-tauri/src/app_config.rs +++ b/src-tauri/src/app_config.rs @@ -15,8 +15,6 @@ pub struct McpApps { pub gemini: bool, #[serde(default)] pub opencode: bool, - #[serde(default)] - pub openclaw: bool, } impl McpApps { @@ -27,7 +25,7 @@ impl McpApps { AppType::Codex => self.codex, AppType::Gemini => self.gemini, AppType::OpenCode => self.opencode, - AppType::OpenClaw => self.openclaw, + AppType::OpenClaw => false, // OpenClaw doesn't support MCP } } @@ -38,7 +36,7 @@ impl McpApps { AppType::Codex => self.codex = enabled, AppType::Gemini => self.gemini = enabled, AppType::OpenCode => self.opencode = enabled, - AppType::OpenClaw => self.openclaw = enabled, + AppType::OpenClaw => {} // OpenClaw doesn't support MCP, ignore } } @@ -57,15 +55,12 @@ impl McpApps { if self.opencode { apps.push(AppType::OpenCode); } - if self.openclaw { - apps.push(AppType::OpenClaw); - } apps } /// 检查是否所有应用都未启用 pub fn is_empty(&self) -> bool { - !self.claude && !self.codex && !self.gemini && !self.opencode && !self.openclaw + !self.claude && !self.codex && !self.gemini && !self.opencode } } @@ -80,8 +75,6 @@ pub struct SkillApps { pub gemini: bool, #[serde(default)] pub opencode: bool, - #[serde(default)] - pub openclaw: bool, } impl SkillApps { @@ -92,7 +85,7 @@ impl SkillApps { AppType::Codex => self.codex, AppType::Gemini => self.gemini, AppType::OpenCode => self.opencode, - AppType::OpenClaw => self.openclaw, + AppType::OpenClaw => false, // OpenClaw doesn't support Skills } } @@ -103,7 +96,7 @@ impl SkillApps { AppType::Codex => self.codex = enabled, AppType::Gemini => self.gemini = enabled, AppType::OpenCode => self.opencode = enabled, - AppType::OpenClaw => self.openclaw = enabled, + AppType::OpenClaw => {} // OpenClaw doesn't support Skills, ignore } } @@ -122,15 +115,12 @@ impl SkillApps { if self.opencode { apps.push(AppType::OpenCode); } - if self.openclaw { - apps.push(AppType::OpenClaw); - } apps } /// 检查是否所有应用都未启用 pub fn is_empty(&self) -> bool { - !self.claude && !self.codex && !self.gemini && !self.opencode && !self.openclaw + !self.claude && !self.codex && !self.gemini && !self.opencode } /// 仅启用指定应用(其他应用设为禁用) diff --git a/src-tauri/src/database/dao/mcp.rs b/src-tauri/src/database/dao/mcp.rs index 52d73ef8..d5c60163 100644 --- a/src-tauri/src/database/dao/mcp.rs +++ b/src-tauri/src/database/dao/mcp.rs @@ -13,7 +13,7 @@ impl Database { pub fn get_all_mcp_servers(&self) -> Result, AppError> { let conn = lock_conn!(self.conn); let mut stmt = conn.prepare( - "SELECT id, name, server_config, description, homepage, docs, tags, enabled_claude, enabled_codex, enabled_gemini, enabled_opencode, enabled_openclaw + "SELECT id, name, server_config, description, homepage, docs, tags, enabled_claude, enabled_codex, enabled_gemini, enabled_opencode FROM mcp_servers ORDER BY name ASC, id ASC" ).map_err(|e| AppError::Database(e.to_string()))?; @@ -31,7 +31,6 @@ impl Database { let enabled_codex: bool = row.get(8)?; let enabled_gemini: bool = row.get(9)?; let enabled_opencode: bool = row.get(10)?; - let enabled_openclaw: bool = row.get(11)?; let server = serde_json::from_str(&server_config_str).unwrap_or_default(); let tags = serde_json::from_str(&tags_str).unwrap_or_default(); @@ -47,7 +46,6 @@ impl Database { codex: enabled_codex, gemini: enabled_gemini, opencode: enabled_opencode, - openclaw: enabled_openclaw, }, description, homepage, @@ -72,8 +70,8 @@ impl Database { conn.execute( "INSERT OR REPLACE INTO mcp_servers ( id, name, server_config, description, homepage, docs, tags, - enabled_claude, enabled_codex, enabled_gemini, enabled_opencode, enabled_openclaw - ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12)", + enabled_claude, enabled_codex, enabled_gemini, enabled_opencode + ) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11)", params![ server.id, server.name, @@ -89,7 +87,6 @@ impl Database { server.apps.codex, server.apps.gemini, server.apps.opencode, - server.apps.openclaw, ], ) .map_err(|e| AppError::Database(e.to_string()))?; diff --git a/src-tauri/src/database/dao/skills.rs b/src-tauri/src/database/dao/skills.rs index f29e89a6..2254cb06 100644 --- a/src-tauri/src/database/dao/skills.rs +++ b/src-tauri/src/database/dao/skills.rs @@ -22,7 +22,7 @@ impl Database { let mut stmt = conn .prepare( "SELECT id, name, description, directory, repo_owner, repo_name, repo_branch, - readme_url, enabled_claude, enabled_codex, enabled_gemini, enabled_opencode, enabled_openclaw, installed_at + readme_url, enabled_claude, enabled_codex, enabled_gemini, enabled_opencode, installed_at FROM skills ORDER BY name ASC", ) .map_err(|e| AppError::Database(e.to_string()))?; @@ -43,9 +43,8 @@ impl Database { codex: row.get(9)?, gemini: row.get(10)?, opencode: row.get(11)?, - openclaw: row.get(12)?, }, - installed_at: row.get(13)?, + installed_at: row.get(12)?, }) }) .map_err(|e| AppError::Database(e.to_string()))?; @@ -64,7 +63,7 @@ impl Database { let mut stmt = conn .prepare( "SELECT id, name, description, directory, repo_owner, repo_name, repo_branch, - readme_url, enabled_claude, enabled_codex, enabled_gemini, enabled_opencode, enabled_openclaw, installed_at + readme_url, enabled_claude, enabled_codex, enabled_gemini, enabled_opencode, installed_at FROM skills WHERE id = ?1", ) .map_err(|e| AppError::Database(e.to_string()))?; @@ -84,9 +83,8 @@ impl Database { codex: row.get(9)?, gemini: row.get(10)?, opencode: row.get(11)?, - openclaw: row.get(12)?, }, - installed_at: row.get(13)?, + installed_at: row.get(12)?, }) }); @@ -103,8 +101,8 @@ impl Database { conn.execute( "INSERT OR REPLACE INTO skills (id, name, description, directory, repo_owner, repo_name, repo_branch, - readme_url, enabled_claude, enabled_codex, enabled_gemini, enabled_opencode, enabled_openclaw, installed_at) - VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14)", + readme_url, enabled_claude, enabled_codex, enabled_gemini, enabled_opencode, installed_at) + VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13)", params![ skill.id, skill.name, @@ -118,7 +116,6 @@ impl Database { skill.apps.codex, skill.apps.gemini, skill.apps.opencode, - skill.apps.openclaw, skill.installed_at, ], ) @@ -148,8 +145,8 @@ impl Database { let conn = lock_conn!(self.conn); let affected = conn .execute( - "UPDATE skills SET enabled_claude = ?1, enabled_codex = ?2, enabled_gemini = ?3, enabled_opencode = ?4, enabled_openclaw = ?5 WHERE id = ?6", - params![apps.claude, apps.codex, apps.gemini, apps.opencode, apps.openclaw, id], + "UPDATE skills SET enabled_claude = ?1, enabled_codex = ?2, enabled_gemini = ?3, enabled_opencode = ?4 WHERE id = ?5", + params![apps.claude, apps.codex, apps.gemini, apps.opencode, id], ) .map_err(|e| AppError::Database(e.to_string()))?; Ok(affected > 0) diff --git a/src-tauri/src/database/mod.rs b/src-tauri/src/database/mod.rs index 352593fd..41c26e97 100644 --- a/src-tauri/src/database/mod.rs +++ b/src-tauri/src/database/mod.rs @@ -48,7 +48,7 @@ const DB_BACKUP_RETAIN: usize = 10; /// 当前 Schema 版本号 /// 每次修改表结构时递增,并在 schema.rs 中添加相应的迁移逻辑 -pub(crate) const SCHEMA_VERSION: i32 = 6; +pub(crate) const SCHEMA_VERSION: i32 = 5; /// 安全地序列化 JSON,避免 unwrap panic pub(crate) fn to_json_string(value: &T) -> Result { diff --git a/src-tauri/src/database/schema.rs b/src-tauri/src/database/schema.rs index 92493912..bca3c2de 100644 --- a/src-tauri/src/database/schema.rs +++ b/src-tauri/src/database/schema.rs @@ -58,8 +58,7 @@ impl Database { id TEXT PRIMARY KEY, name TEXT NOT NULL, server_config TEXT NOT NULL, description TEXT, homepage TEXT, docs TEXT, tags TEXT NOT NULL DEFAULT '[]', enabled_claude BOOLEAN NOT NULL DEFAULT 0, enabled_codex BOOLEAN NOT NULL DEFAULT 0, - enabled_gemini BOOLEAN NOT NULL DEFAULT 0, enabled_opencode BOOLEAN NOT NULL DEFAULT 0, - enabled_openclaw BOOLEAN NOT NULL DEFAULT 0 + enabled_gemini BOOLEAN NOT NULL DEFAULT 0, enabled_opencode BOOLEAN NOT NULL DEFAULT 0 )", [], ) @@ -87,7 +86,6 @@ impl Database { enabled_codex BOOLEAN NOT NULL DEFAULT 0, enabled_gemini BOOLEAN NOT NULL DEFAULT 0, enabled_opencode BOOLEAN NOT NULL DEFAULT 0, - enabled_openclaw BOOLEAN NOT NULL DEFAULT 0, installed_at INTEGER NOT NULL DEFAULT 0 )", [], @@ -362,11 +360,6 @@ impl Database { Self::migrate_v4_to_v5(conn)?; Self::set_user_version(conn, 5)?; } - 5 => { - log::info!("迁移数据库从 v5 到 v6(OpenClaw 支持)"); - Self::migrate_v5_to_v6(conn)?; - Self::set_user_version(conn, 6)?; - } _ => { return Err(AppError::Database(format!( "未知的数据库版本 {version},无法迁移到 {SCHEMA_VERSION}" @@ -859,7 +852,6 @@ impl Database { enabled_claude BOOLEAN NOT NULL DEFAULT 0, enabled_codex BOOLEAN NOT NULL DEFAULT 0, enabled_gemini BOOLEAN NOT NULL DEFAULT 0, - enabled_openclaw BOOLEAN NOT NULL DEFAULT 0, installed_at INTEGER NOT NULL DEFAULT 0 )", [], @@ -922,30 +914,6 @@ impl Database { Ok(()) } - /// v5 -> v6 迁移:添加 OpenClaw 支持 - /// - /// 为 mcp_servers 和 skills 表添加 enabled_openclaw 列。 - fn migrate_v5_to_v6(conn: &Connection) -> Result<(), AppError> { - // 为 mcp_servers 表添加 enabled_openclaw 列 - Self::add_column_if_missing( - conn, - "mcp_servers", - "enabled_openclaw", - "BOOLEAN NOT NULL DEFAULT 0", - )?; - - // 为 skills 表添加 enabled_openclaw 列 - Self::add_column_if_missing( - conn, - "skills", - "enabled_openclaw", - "BOOLEAN NOT NULL DEFAULT 0", - )?; - - log::info!("v5 -> v6 迁移完成:已添加 OpenClaw 支持"); - Ok(()) - } - /// 插入默认模型定价数据 /// 格式: (model_id, display_name, input, output, cache_read, cache_creation) /// 注意: model_id 使用短横线格式(如 claude-haiku-4-5),与 API 返回的模型名称标准化后一致 diff --git a/src-tauri/src/deeplink/mcp.rs b/src-tauri/src/deeplink/mcp.rs index 67f3d92c..37df9657 100644 --- a/src-tauri/src/deeplink/mcp.rs +++ b/src-tauri/src/deeplink/mcp.rs @@ -167,7 +167,6 @@ pub(crate) fn parse_mcp_apps(apps_str: &str) -> Result { codex: false, gemini: false, opencode: false, - openclaw: false, }; for app in apps_str.split(',') { @@ -176,7 +175,10 @@ pub(crate) fn parse_mcp_apps(apps_str: &str) -> Result { "codex" => apps.codex = true, "gemini" => apps.gemini = true, "opencode" => apps.opencode = true, - "openclaw" => apps.openclaw = true, + "openclaw" => { + // OpenClaw doesn't support MCP, ignore silently + log::debug!("OpenClaw doesn't support MCP, ignoring in apps parameter"); + } other => { return Err(AppError::InvalidInput(format!( "Invalid app in 'apps': {other}" diff --git a/src-tauri/src/mcp/claude.rs b/src-tauri/src/mcp/claude.rs index 3ba1a310..25d2f426 100644 --- a/src-tauri/src/mcp/claude.rs +++ b/src-tauri/src/mcp/claude.rs @@ -92,7 +92,6 @@ pub fn import_from_claude(config: &mut MultiAppConfig) -> Result Result codex: true, gemini: false, opencode: false, - openclaw: false, }, description: None, homepage: None, diff --git a/src-tauri/src/mcp/gemini.rs b/src-tauri/src/mcp/gemini.rs index b2725da2..c8a7809f 100644 --- a/src-tauri/src/mcp/gemini.rs +++ b/src-tauri/src/mcp/gemini.rs @@ -88,7 +88,6 @@ pub fn import_from_gemini(config: &mut MultiAppConfig) -> Result Result = ({ codex: boolean; gemini: boolean; opencode: boolean; - openclaw: boolean; }>(() => { if (initialData?.apps) { return { ...initialData.apps }; @@ -76,7 +75,6 @@ const McpFormModal: React.FC = ({ codex: defaultEnabledApps.includes("codex"), gemini: defaultEnabledApps.includes("gemini"), opencode: defaultEnabledApps.includes("opencode"), - openclaw: defaultEnabledApps.includes("openclaw"), }; }); diff --git a/src/components/prompts/PromptFormModal.tsx b/src/components/prompts/PromptFormModal.tsx index 195d856f..84e18d25 100644 --- a/src/components/prompts/PromptFormModal.tsx +++ b/src/components/prompts/PromptFormModal.tsx @@ -30,14 +30,13 @@ const PromptFormModal: React.FC = ({ }) => { const { t } = useTranslation(); const appName = t(`apps.${appId}`); - const filenameMap: Record = { + const filenameMap: Record, string> = { claude: "CLAUDE.md", codex: "AGENTS.md", gemini: "GEMINI.md", opencode: "AGENTS.md", - openclaw: "AGENTS.md", }; - const filename = filenameMap[appId]; + const filename = filenameMap[appId as Exclude]; const [name, setName] = useState(""); const [description, setDescription] = useState(""); const [content, setContent] = useState(""); diff --git a/src/components/prompts/PromptFormPanel.tsx b/src/components/prompts/PromptFormPanel.tsx index c4481fa4..fcdc458b 100644 --- a/src/components/prompts/PromptFormPanel.tsx +++ b/src/components/prompts/PromptFormPanel.tsx @@ -24,14 +24,13 @@ const PromptFormPanel: React.FC = ({ }) => { const { t } = useTranslation(); const appName = t(`apps.${appId}`); - const filenameMap: Record = { + const filenameMap: Record, string> = { claude: "CLAUDE.md", codex: "AGENTS.md", gemini: "GEMINI.md", opencode: "AGENTS.md", - openclaw: "AGENTS.md", }; - const filename = filenameMap[appId]; + const filename = filenameMap[appId as Exclude]; const [name, setName] = useState(""); const [description, setDescription] = useState(""); const [content, setContent] = useState(""); diff --git a/src/types.ts b/src/types.ts index 0aaa90ac..dba9bace 100644 --- a/src/types.ts +++ b/src/types.ts @@ -288,7 +288,6 @@ export interface McpApps { codex: boolean; gemini: boolean; opencode: boolean; - openclaw: boolean; } // MCP 服务器条目(v3.7.0 统一结构) diff --git a/tests/msw/state.ts b/tests/msw/state.ts index 2db23484..bb08e101 100644 --- a/tests/msw/state.ts +++ b/tests/msw/state.ts @@ -86,7 +86,7 @@ let mcpConfigs: McpConfigState = { id: "sample", name: "Sample Claude Server", enabled: true, - apps: { claude: true, codex: false, gemini: false, opencode: false, openclaw: false }, + apps: { claude: true, codex: false, gemini: false, opencode: false }, server: { type: "stdio", command: "claude-server", @@ -98,7 +98,7 @@ let mcpConfigs: McpConfigState = { id: "httpServer", name: "HTTP Codex Server", enabled: false, - apps: { claude: false, codex: true, gemini: false, opencode: false, openclaw: false }, + apps: { claude: false, codex: true, gemini: false, opencode: false }, server: { type: "http", url: "http://localhost:3000", @@ -131,7 +131,7 @@ export const resetProviderState = () => { id: "sample", name: "Sample Claude Server", enabled: true, - apps: { claude: true, codex: false, gemini: false, opencode: false, openclaw: false }, + apps: { claude: true, codex: false, gemini: false, opencode: false }, server: { type: "stdio", command: "claude-server", @@ -143,7 +143,7 @@ export const resetProviderState = () => { id: "httpServer", name: "HTTP Codex Server", enabled: false, - apps: { claude: false, codex: true, gemini: false, opencode: false, openclaw: false }, + apps: { claude: false, codex: true, gemini: false, opencode: false }, server: { type: "http", url: "http://localhost:3000",