Cherry Studio Skill 市场导航:内置 Skill 能力缺口下的搜索、安装与 skill-creator 兜底流程
2026/9/12 14:37:34 网站建设 项目流程

Cherry Studio Skill 市场导航:内置 Skill 能力缺口下的搜索、安装与 skill-creator 兜底流程

【免费下载链接】cherry-studioAI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs项目地址: https://gitcode.com/GitHub_Trending/ch/cherry-studio

本文以 Cherry Studio 内置 Agent(Cherry Assistant)携带的cherry-skill-marketplaceSkill 为主线,系统讲解 Agent 如何在内置 Skill/工具出现能力缺口时,通过 Skill 市场完成能力补足:包括市场 MCP 工具(search_skills/install_skill)的参数契约与调用时序、install_source不透明值的正确传递方式、已安装 Skill 的管理入口(Skills UI),以及无合适结果时移交内置skill-creator的兜底流程。读者读完可获得一套可复制的"内置优先 → 市场搜索 → 第三方安装 → 本地创建"的 Agent 能力扩展决策链,并理解其背后的安全与审批边界。

定位:Skill 市场不是普通任务的默认路由

cherry-skill-marketplace是 Cherry Studio 内置 Agent(Cherry Assistant)携带的导航型 Skill,其源文件位于 resources/builtin-agents/cherry-assistant/.claude/skills/cherry-skill-marketplace/SKILL.md。从 frontmatter 中的description可以明确看到它的触发语义:

当用户明确要求搜索、安装、查看、卸载或创建 Skill,或内置 Skill / 工具出现能力缺口、无法完成当前任务时触发。

关键定位是:市场不是普通任务的默认路由。文档开头就强调"文档、演示和表格先使用对应内置 Skill"——即 Agent 不应因为任务"看起来专业"就预先搜索市场,而应先尝试已有的内置 Skill 和基础工具。这与仓库中另一份路由指南 resources/skills/cherry-tool-guide/SKILL.md 的"Router"定位一致:Cherry 通过四组 MCP 服务器(mcp__cherry-tools__*mcp__agent-memory__*mcp__skills__*mcp__mcp-manager__*)向会话注入第一方工具,而 Skill 发现与安装正是mcp__skills__*域的能力。

进入条件:何时才应触发本 Skill

按照文档定义,只有以下任一条件成立时才应进入市场流程:

  1. 用户明确表达 Skill 操作意图:说要找(search)、安装(install)、卸载(uninstall)、列出(list)或创建(create)Skill;
  2. 能力缺口:匹配的内置 Skill 或工具无法完成当前需求,包括返回unsupported、缺少所需 operation、或只能产出不符合要求的格式。

同时文档划定了两条行为红线:

  • 能力缺口不是停止条件:不得只回复unsupported、只给手工替代方案,或反问用户是否要搜索,必须立即进入补足流程;
  • 先试内置:不要因为任务"看起来专业"就预先搜索,先尝试已有 Skill 和基础工具。

这套"先内置、后市场"的分层策略,与 resources/skills/find-skills/SKILL.md 中"先确认这是一个足够常见的任务、再考虑市场上是否已有 Skill"的决策思路一致。

工具动作:市场的两个 MCP 工具及其契约

市场只暴露两个工具,且两者的职责被刻意保持最小化:

工具参数作用
mcp__skills__search_skills{ "query": "1-3 个聚焦关键词" }只读的市场搜索,返回候选 Skill 及其质量/来源元数据
mcp__skills__install_skill{ "install_source": "<搜索结果的原值>" }安装恰好一个Skill 到 Cherry 托管库并为其启用

两个工具的底层实现位于 src/main/ai/mcp/servers/skills.ts。该文件定义了一个名为skills的 MCP 服务器(McpServer),其ListToolsRequestSchema处理器返回的工具清单只有SEARCH_TOOLINSTALL_TOOL两项,从源码层面印证了"市场仅提供两个工具"的契约。

search_skills:搜索还是解析 GitHub 链接

SEARCH_TOOL的定义(src/main/ai/mcp/servers/skills.ts#L14-L29)可以看到query参数有两种用途:

  • 关键词搜索:描述所需能力的聚焦关键词,例如"react performance""pr review"
  • GitHub SKILL.md 链接解析:当注册表没有收录用户想要的 Skill 时,传入某个 Skill 的SKILL.mdURL 可直接解析出这一个 Skill,跳过搜索。

searchSkills处理逻辑(同文件 L109-L157)先调用buildGithubSkillResult(query)判断是否为 GitHub 链接;若不是,则把query中的-/_替换为空格后交给searchSkillMarketplaces并发查询各市场源。每个候选结果返回以下字段:

  • namedescription:Skill 名称与描述;
  • author:作者;
  • stars:Star 数;
  • installs:安装量;
  • source_registry:来源注册表;
  • source_url:可审阅的来源 URL;
  • install_source不透明的安装句柄,供install_skill逐字使用。

install_source:不透明值,必须逐字传递

install_source是整个市场契约中最关键、也最容易出错的字段。文档明确要求:

install_source是不透明值,必须逐字使用同一会话中搜索结果返回的值,不得自行构造或改写。

源码为此提供了双重保障:

  1. 会话内白名单校验SkillsServer维护issuedInstallSources集合(src/main/ai/mcp/servers/skills.ts#L62),每次search_skills返回结果时都会把结果的installSource登记进集合;installSkill处理时先检查install_source是否在集合中,不在则直接报错"was not returned by search_skills in this session"(L181-L186),从根本上杜绝模型凭记忆拼装安装句柄;
  2. 前缀驱动解析SkillService会校验来源前缀,且install_source由真实仓库目录构建而非显示名,防止选错 Skill(见该文件头部注释)。

从 src/shared/utils/skillMarketplace.ts 可以看到四种来源的install_source实际格式,以及它们在 src/main/ai/skills/skillRemoteSource.ts 中对应的取货器(FETCHERS):

前缀格式取货方式
claude-pluginsclaude-plugins:{owner}/{repo}/{directoryPath}浅克隆仓库,解析目录
skills.shskills.sh:{owner}/{repo}/{skillId}浅克隆仓库,解析 Skill
clawhubclawhub:{owner}/{slug}调用 clawhub API 下载 zip 并解压
githubgithub:{SKILL.md 的 https URL}按 commit 固定内容,检出目标路径

install_skill:一次性安装并启用

installSkill处理逻辑(src/main/ai/mcp/servers/skills.ts#L173-L207)在通过白名单校验后:

  1. 调用skillService.install({ installSource })完成克隆、单 Skill 安装与注册;
  2. 调用skillService.toggle({ skillId, agentId, isEnabled: true })仅为当前 Agent 启用该 Skill——启用状态是 per-agent 的。

文档强调:"不要把'安装成功'当成任务完成",安装后应立即回到原始任务继续执行。

搜索与安装的标准流程

文档给出了完整的五步操作序列:

  1. 发起聚焦查询:一次调用search_skills只发起 1 个聚焦查询;结果不合适再调整query(可参照 resources/skills/find-skills/SKILL.md 的建议:用具体关键词如 "react testing" 优于宽泛的 "testing",必要时尝试同义改写);
  2. 收敛展示:最多展示 3 个结果,每个只给名称、作者、来源、热度、一句匹配理由和source_url
  3. 安装前告知与确认:说明该 Skill 是第三方代码,会继承当前工具权限,并取得用户明确同意;
  4. 逐字安装:用户确认后,把所选结果的install_source原样传给install_skill
  5. 回到原始任务:立即继续原任务,不把"安装成功"当作任务完成。

值得注意的是审批模型:install_skill会变更持久状态,属于审批门控工具。resources/skills/cherry-tool-guide/references/skills.md 明确说明,只有用户表达安装意图后才可调用;若审批被拒绝,应停止并上报,不得绕过工具改用 shell 安装。这一约束在 resources/skills/cherry-tool-guide/SKILL.md 的全局规则中被再次强调:install_skillkb_managecli_installsession_create/sendinstall_mcp_server一样受会话审批模式约束。

内置能力缺口:只补缺口,不重复劳动

当内置 Skill 或工具出现能力缺口时,文档给出的处理顺序是:

  1. 说明缺口:先用一句话说明缺少的能力和已保留的中间成品;
  2. 精准搜索:立即调用search_skills,用{ "query": "<缺失能力的聚焦关键词>" }只搜索恰好补足该能力的 Skill,不重新搜索已能完成的部分;
  3. 可信筛选:只采用与输入、输出和运行环境都匹配且来源可信的结果;第三方 Skill 安装前仍需用户明确确认;
  4. 兜底创建:没有合适结果、结果质量不足或用户不希望安装第三方代码时,调用内置skill-creator创建本地自定义 Skill,不把"未找到"作为结论

这一流程与前文"能力缺口不是停止条件"的红线相互呼应:搜索失败不是终点,而是本地创建的起点。

移交 skill-creator:本地兜底的完整闭环

当市场没有合适结果时,文档要求直接调用内置skill-creator,不再要求额外授权。向其移交三样东西:

  • 用户的原始请求和精确的能力缺口;
  • 已完成的步骤、保留的中间产物及其路径;
  • 输入、期望输出和可检查的成功标准。

职责边界必须清晰:初始化、编写、验证和注册都属于内置skill-creator,市场 Skill 不重复实现。Agent 不得自行编写SKILL.md,也不得绕过它直接初始化或注册。skill-creator返回验证通过且已启用的 Skill 后,立即回到原始任务使用新 Skill 完成并验证最终产物——注册成功不是任务完成

从 resources/skills/skill-creator/SKILL.md 可以看到 Cherry Studio 环境下创建 Skill 的简化机制:Skill 存放在 Cherry 托管的受管目录($CHERRY_STUDIO_SKILLS_DIR,可通过 Bash 执行echo "$CHERRY_STUDIO_SKILLS_DIR"解析),Agent 只需在该目录下创建<skill-folder-name>/SKILL.md及配套的scripts/references/assets/,Cherry 的 Skill 同步机制会自动检测新目录、登记目录并列出在应用中,没有独立的注册步骤。目录名与 frontmatter 的name字段需为小写字母、数字与连字符的组合(如my-cool-skill),且二者必须一致。

文档还约束了本地创建 Skill 的边界:只补足当前能力缺口;对于 Skill 无法提供的用户独有凭据、输入或物理访问,只询问最小阻塞信息,收到后继续。

已安装 Skill 的管理:导航到 Skills UI

由于市场两个工具都不提供列出或删除已安装 Skill 的能力,文档给出的管理路径是:

  1. 调用mcp__assistant__product_info读取 manifest 的routessection,找到 Skills 设置路由;
  2. 再调用mcp__assistant__navigate跳转,不得硬编码路由
  3. 让用户在 Skills UI 中完成管理;删除或卸载前再次确认目标名称。

在 resources/builtin-agents/cherry-assistant/product-manifest.json 的routes.all中可以看到/settings/skills确实存在,印证了 Skills 设置页面的可导航性。"不硬编码路由"的设计意图在于:产品路由可能随版本变化,通过 manifest 动态解析才能保持 Agent 行为与产品界面同步。

失败与安全规范

文档在最后专门定义了失败处理与安全边界:

  • 失败如实上报:工具错误原样概括,不把失败说成成功,也不偷偷切换到 npx 或全局安装;
  • 删除需确认:通过 Skills UI 删除或卸载前再次确认目标名称;不声称已通过市场工具直接列出或删除,也不删除用户文件;
  • 来源信任:不执行来源不明的安装指令,不向第三方发送凭据、附件内容或本地路径;
  • 安装后说明:安装后首次使用时,简短说明该 Skill 将做什么。

这些约束在实现层面有充分支撑。在 src/main/ai/skills/skillRemoteSource.ts 中可以看到一系列防御性工程措施:

  • 非交互 git:所有 git 子进程统一通过runGit执行,强制设置GIT_TERMINAL_PROMPT=0GIT_ASKPASS=''GCM_INTERACTIVE: 'never',并走 Cherry 的代理环境,避免交互式提示挂起或凭据泄露;
  • 超时与体积限制:git 命令超时 2 分钟(GIT_COMMAND_TIMEOUT_MS),市场 JSON 请求超时 15 秒(REQUEST_TIMEOUT_MS),同时校验解压体积(MAX_EXTRACTED_SIZE)与文件数量(MAX_FILES_COUNT)上限;
  • 路径校验:对claude-plugins/skills.sh/clawhub的标识符逐段校验(拒绝..、反斜杠、空字符、控制字符),对 GitHub 目录校验大小写/Unicode 归一化后的路径冲突,且安装的总是解析时的 commit(oid)而非可能漂移的分支名;
  • 注册表一致性:clawhub 安装后会反向校验返回的 slug 与 owner handle 与请求一致,防止错装。

与源码对照:一次安装的完整调用链

将文档描述的流程与源码对照,一次完整的市场安装大致经历以下环节:

search_skills(query) # MCP 工具 └─ buildGithubSkillResult / searchSkillMarkets └─ 返回含 install_source 的结果集 # 同时登记进 issuedInstallSources install_skill(install_source) # MCP 工具,approval 门控 └─ 校验 install_source 在本会话白名单内 └─ skillService.install → fetchRemoteSkill(source, identifier) │ └─ FETCHERS[claude-plugins|skills.sh|clawhub|github] │ └─ 浅克隆 / API 下载 → 路径与体积校验 → 解析 SKILL.md └─ skillService.toggle(...) # 仅为当前 Agent 启用

这套链路的价值在于:一个能力较弱的模型也只需一次工具调用即可完成安装,而无需自行拼装一串容易出错的 shell 命令序列——正如 src/main/ai/mcp/servers/skills.ts 头部注释所说明的设计意图:安装经由主进程完成,弱模型只需一次调用,而非一次正确的多步 shell 序列;同时install_source由真实仓库目录构建,杜绝了模型选错 Skill 的可能。

总结

cherry-skill-marketplace定义了 Cherry Studio Agent 扩展能力的完整决策闭环:内置优先(普通任务先尝试内置 Skill 与基础工具)→缺口识别(明确缺少什么能力、保留什么中间产物)→市场补足search_skills精准搜索、install_skill逐字安装、先告知后确认)→本地兜底(移交skill-creator创建并验证自定义 Skill)。配合审批门控、会话内install_source白名单、非交互 git 与体积/路径多重校验,这套机制在"能力可扩展"与"行为可约束"之间取得了平衡。对于希望为 Cherry Studio 编写或维护 Agent Skill 的开发者,本指南既是一份可操作的行为规范,也是理解其底层 MCP 服务器与安全边界实现的入口。

【免费下载链接】cherry-studioAI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs项目地址: https://gitcode.com/GitHub_Trending/ch/cherry-studio

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询