ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Cherry Studio Code Mate 技能实战:程序化调用 GitHub Copilot CLI 的标准方法与源码实现

Cherry Studio Code Mate 技能实战:程序化调用 GitHub Copilot CLI 的标准方法与源码实现 Cherry Studio Code Mate 技能实战程序化调用 GitHub Copilot CLI 的标准方法与源码实现【免费下载链接】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 内置的 Code Mate 技能文件 code-mate-github-copilot/SKILL.md 为主体系统讲解如何让 Agent 以非交互方式程序化调用 GitHub Copilot CLI 完成仓库分析与编码任务完整的执行流程、命令行参数、认证与权限边界以及该技能在 Cherry Studio 主进程中的安装、同步与回收机制的源码级实现。读完后你可以独立复现 Copilot CLI 的无人值守调用规范并理解 Cherry Studio 如何把这份技能模板条件化地注入到 Agent 的技能库中。这个技能是什么条件内置的 Code Mate 技能模板resources/code-cli-skills/目录下存放着一组“条件内置技能”conditional builtin skills每个受支持的编码 CLI 工具对应一个code-mate-*文件夹GitHub Copilot CLI 对应的是resources/code-cli-skills/code-mate-github-copilot/SKILL.md技能文件采用标准的SKILL.md YAML frontmatter 格式Copilot 这一份的元数据为--- name: code-mate-github-copilot description: Runs GitHub Copilot CLI programmatically for repository analysis and coding tasks. Use when the user asks to delegate work to Copilot CLI or obtain a Copilot coding-agent result. ---从源码结构看技能文件的 frontmatter 不是自由文本而是受测试契约约束的。codeCliTools.test.ts 中的bundles exactly one valid skill for every CLI preset用例会遍历每一个 CLI 预设逐一校验其技能文件满足name必须等于预设的skillFolderNamedescription必须包含. Use when触发条件句式让 Agent 能根据用户意图判断是否启用全文少于 100 行source.split(/\r?\n/).length 100保证技能是可被 Agent 低成本加载的精简指令必须包含command -v executable可用性检查必须包含该 CLI 的标准非交互命令Copilot 为copilot -p prompt -s --output-format json --no-ask-user必须包含Code Mate、Never request, read, print, or copy credentials.、timeout、explicitly request(s|ed) workspace changes、Example:等关键安全措辞。这意味着 SKILL.md 的每一个句子都是“经过审查的契约”而非随意的使用笔记。测试还断言resources/code-cli-skills/下的目录集合与预设列表一一对应任何新增 CLI 都必须同时补齐预设与技能文件。预设注册从 npm 包到技能文件夹的单一事实源每个 CLI 的“获取事实”可执行文件名、安装渠道、技能文件夹集中定义在 codeCliTools.ts 中。GitHub Copilot CLI 的完整预设是defineCodeCliTool({ id: CodeCli.GITHUB_COPILOT_CLI, // github-copilot-cli executable: copilot, skillFolderName: code-mate-github-copilot, packageName: github/copilot, install: npm })defineCodeCliTool会派生出两个派生字段skillNamespace固定为code-cli:github-copilot-cli用于技能归属校验防止误删同名用户技能miseTool计算为npm:github/copilot供 mise 安装器使用。枚举值CodeCli.GITHUB_COPILOT_CLI github-copilot-cli定义在 codeCli.ts。标准执行流程SKILL.md「Run」章节的完整继承技能文件的## Run章节给出了 Agent 调用 Copilot CLI 的规范步骤这里完整保留并逐条解释步骤 1确定工作目录并设置有限超时。Set the Bash working directory to the exact project the user named and set a finite timeout, normally 10 minutes.Copilot CLI 的项目分析能力依赖当前目录仓库上下文、git 状态因此必须先cd到用户点名的项目根目录而不是任意位置。同时要求设置有限超时惯例 10 分钟防止 Agent 被挂起的 CLI 进程无限阻塞——这正是测试强制要求文本包含timeout一词的原因。步骤 2可用性检查缺失即停止。Check availability withcommand -v copilot. If it is missing, stop and ask the user to install GitHub Copilot CLI in Code Mate.用 POSIX 标准的command -v copilot探测可执行文件。检测不到时技能明确要求“停下来让用户在 Code MateCherry Studio 的 CLI 管理页里安装”而不是由 Agent 自行npm install到全局环境——安装动作被统一收敛到应用内的 BinaryManager 通道下文源码部分会说明。步骤 3执行单条非交互任务。Run one non-interactive task:copilot -p prompt -s --output-format json --no-ask-user参数逐一解释参数含义-p prompt以 prompt 模式非交互、一次性任务运行提示词必须作为单个带引号的参数传入避免 shell 词分裂-s使用单次/无会话模式任务结束即退出不留挂起的交互会话--output-format json以 JSONJSONL 流输出结果事件供程序化解析--no-ask-user关闭运行时向用户提问/请求审批的通道使命令可以无人值守执行权限语义见下文步骤 4结果判定规则。Parse stdout as JSONL and treat an error event or nonzero exit as failure; the published exit-code contract is incomplete. Never start the interactive UI or an authentication flow.两条工程要点JSONL 解析 双重失败判据把 stdout 逐行按 JSON 解析只要出现 error 事件或进程退出码非零即判定为失败。技能特别注明“官方发布的退出码契约并不完整”——也就是说不能只看退出码必须同时检查输出事件流这是对 CLI 现状的防御性处理。禁止进入交互态永远不允许启动交互式 UI 或认证流程。Agent 场景下出现交互提示意味着命令形态用错了正确做法是失败并回退而不是等待人工输入。认证与权限边界最小权限的无人值守调用SKILL.md 的## Authentication And Permissions章节定义了三条安全红线是整份技能中约束力最强的部分红线一凭据不可触碰。If Copilot reports a missing login, subscription, or token configuration, stop and ask the user to configure GitHub Copilot CLI in Code Mate. Never request, read, print, or copy credentials.当 Copilot 报告缺少登录、订阅或 token 配置时Agent 只能停止并引导用户在 Code Mate 中完成配置禁止以任何形式索取、读取、打印或复制凭据。这条措辞是测试契约的强制内容Never request, read, print, or copy credentials.属于所有 code-mate 技能共享的安全不变量。从源码结构看这与 Cherry Studio 的整体设计一致主进程对 CLI 登录态只做“存在性探测”例如 CodeCliService.ts 中checkClaudeLogin()的注释明确写着 “Never reads or stores the credential value itself — only its presence”凭据值始终只留在 CLI 自己的密钥存储中。红线二工具默认拒绝deny by default。--no-ask-userprevents an unattended approval prompt. Keep tools denied by default.--no-ask-user的作用是消除无人值守运行时的交互式审批提示其副作用是 Agent 侧必须接受“工具默认被拒绝”的保守姿态——任何未被显式授权的操作请求都会直接失败而不是静默通过。红线三授权必须窄范围禁止--allow-all。When the user explicitly requests workspace changes, add only narrowly scoped--allow-toolentries; never use--allow-allas a shortcut.只有当用户显式要求工作区变更时才追加窄范围的--allow-tool条目按需放行具体工具并且永远不允许以--allow-all作为图省事的捷径。这构成了“默认只读、按需放行、逐个命名”的最小权限模型。标准示例技能末尾给出的实战用例Example: ask Copilot to explain a failing test without modifying files, run the command above, and summarize the final JSONL result plus any denied tool request.即让 Copilot 解释一个失败的测试、不修改任何文件运行上述命令然后总结最终的 JSONL 结果以及任何被拒绝的工具请求——把“哪些工具请求被权限系统挡下了”也纳入汇报保证用户对 Agent 能力边界有完整感知。源码纵深Copilot CLI 为何是“无 Provider”工具在 Cherry Studio 中Copilot CLI 与其他编码 CLI 有一个本质区别它不接受 Cherry 注入的 Provider/模型配置。这一事实分散在三个源码位置互相印证主进程启动门槛。CodeCliService.ts 的run()方法中const isProviderlessCli cliTool CodeCli.QODER_CLI || cliTool CodeCli.GITHUB_COPILOT_CLI只有 Qoder 与 GitHub Copilot CLI 被归入“provider-less”工具跳过 Provider/模型必填校验直接以 CLI 自带的账户登录Copilot 订阅运行。登录能力清单的排除。codeCli.ts 中的LOGIN_CAPABLE_CLI_TOOLS支持“使用自己的登录”虚拟 Provider 的工具集合不包含 CopilotGATEWAY_CAPABLE_CLI_TOOLS可走 Cherry 统一网关的工具集合同样不包含它。从源码结构看Copilot 既不走“Cherry Provider API Key”路线也不走网关注入路线凭据完全由 Copilot CLI 自身管理——这与 SKILL.md 中“停止并让用户在 Code Mate 中配置登录”的指引完全一致。前端模型兼容性。modelSupport.ts 中modelSupportsCliTool()对GITHUB_COPILOT_CLI直接return false在 Code 页面为 Copilot CLI 挑选 Cherry 模型时没有任何模型可选UI 层面从源头杜绝了“给 Copilot 注入模型”的错误操作。技能生命周期从 resources 目录到 Agent 技能库SKILL.md 并非用户手动安装的文件而是随应用打包、按需同步的“条件内置技能”。完整生命周期在 CodeCliService.ts 中闭环1. 模板路径注册。pathRegistry.ts 将路径键feature.code_cli.skills.builtin映射到resources/code-cli-skills只读模板根目录即本技能文件所在的仓库目录。2. 安装即同步技能。用户通过 Code Mate 页面安装 CLIinstallCli→BinaryManager.installByName按npm:github/copilot配方执行后立即调用installCliSkill(preset)const sourcePath path.join( toAsarUnpackedPath(application.getPath(feature.code_cli.skills.builtin)), preset.skillFolderName ) await skillService.syncBuiltinSkill(preset.skillFolderName, sourcePath, app.getVersion(), preset.skillNamespace)toAsarUnpackedPath说明模板从 asar 解包路径读取打包后 resources 目录位于 asar 之外保证可直接被文件 API 访问syncBuiltinSkill以code-cli:github-copilot-cli命名空间登记该技能使其在技能库中带有builtin来源标识。3. 启动时对齐reconcile。onAllReady()阶段执行reconcileCliSkills()对全部 CLI 预设查询 BinaryManager 的快照Copilot CLI 可用snapshot.availability.source ! none就确保技能已安装若检测到应用已卸载snapshot.application?.status absent则调用skillService.uninstallBuiltinSkill(folderName, namespace)回收技能。4. 懒安装兜底。用户绕过页面直接以code_cli.run启动 CLI 时run()发现availability.source none会自动走installCli()注释说明这是 “Name-only lazy install”——CLI 属于 code-owned 工具安装由应用配方决定不写入用户自定义 Preference。5. 技能库侧的保护机制。SkillService.ts 对内置技能有多层防篡改设计uninstallBuiltinSkill会校验skill.source builtin skill.namespace namespace防止误删同名但属于其他命名空间的技能linkMirror()把技能镜像到 Claude Agent SDK 可发现的CLAUDE_CONFIG_DIR/skills目录时对 builtin 技能会计算整个目录的内容哈希并与数据库登记的contentHash比对一旦模板内容被带外修改即拒绝镜像并移除条目新内置技能安装成功后调用enableForAllAgents()让所有 Agent 立即获得该技能。实战检查清单把 SKILL.md 与源码证据合并Agent 侧调用 Copilot CLI 的完整检查清单如下cd到用户指定的项目目录设置约 10 分钟的有限超时command -v copilot探测缺失 → 停止引导用户在 Code Mate 安装应用侧等价于BinaryManager安装npm:github/copilot并同步本技能以单引号参数形式传入提示词执行copilot -p prompt -s --output-format json --no-ask-user逐行解析 JSONL 输出出现 error 事件或退出码非零即判失败官方退出码契约不完整不可只依赖退出码;缺登录/订阅/token → 停止引导用户在 Code Mate 配置全程不读取、不打印任何凭据默认所有工具请求被拒绝仅在用户显式要求工作区变更时追加窄范围--allow-tool禁用--allow-all汇报时同时总结最终 JSONL 结果与被拒绝的工具请求永远不启动交互式 UI 或认证流程。参考路径技能模板主体SKILL.mdCLI 预设单一事实源codeCliTools.ts类型与登录/网关能力集合codeCli.ts启动、懒安装与技能同步CodeCliService.ts技能库安装、镜像与哈希校验SkillService.ts路径注册builtin 模板根目录pathRegistry.ts模型兼容性provider-less 判定modelSupport.ts技能文件契约测试codeCliTools.test.ts【免费下载链接】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),仅供参考
返回列表