Cline VS Code 扩展 Workflow 回归修复全解斜杠命令扩展、开关同步与向 Skills 的迁移【免费下载链接】clineAutonomous coding agent as an SDK, IDE extension, or CLI assistant.项目地址: https://gitcode.com/GitHub_Trending/cl/cline本文基于 Cline 仓库中的一份 Changeset 变更记录gold-otters-march.md完整解读这次针对 VS Code 扩展 claude-dev 包的 patch 级修复恢复 Workflow 支持中的四处回归——带文件扩展名的/workflow.md斜杠命令、消息中段命令、启用/禁用开关的生效逻辑以及 webview 启动时的斜杠菜单刷新同时说明 Workflows 管理标签页回归规则模态框并指向 Skills 的迁移方向。读完后你将理解 Cline 中 Workflow 从「Markdown 文件」到「斜杠命令」再到「提示词展开」的完整链路以及每一处修复在源码中的具体落点与测试依据。1. 变更记录说了什么一次针对 Workflow 的回归修复本次变更以 Changeset 文件 .changeset/gold-otters-march.md 形式提交frontmatter 声明变更级别为claude-dev: patch即针对 Cline VS Code 扩展沿用旧包名 claude-dev的补丁级修复。正文一次性列出了五个修复点支持展开/workflow.md这种斜杠命令——这是自动补全实际插入的「遗留文件名拼写」legacy filename spelling支持展开消息中段出现的斜杠命令而非仅消息开头的命令展开过程中尊重 Workflow 的启用/禁用开关enable/disable toggles在 webview 启动时刷新斜杠命令菜单中的 Workflow 列表恢复规则模态框rules modal中的 Workflows 管理标签页——现位于标签列表末尾并带有指向 Skills 的弃用提示。理解这些修复点需要先理解 Cline 中 Workflow 的定位Workflow 是存放在工作区或全局目录下的 Markdown 文件支持.md、.markdown、.txt扩展名用户可以在聊天输入框中以/文件名的斜杠命令形式引用它提交后该命令会被展开为 Workflow 文件正文中的指令内容注入提示词。源码中 slash-command-expansion.ts 的注释明确列出了这三类扩展名与「规范化名称」的对应关系——SDK 侧命令名不含扩展名而 webview 自动补全和遗留开关状态仍保留扩展名正是这种命名差异催生了本次修复的第一、二点。2. 修复一让/workflow.md这种带扩展名的遗留拼写也能展开2.1 回归的根源命名不一致SDK 侧的cline/core在发现 Workflow 时会以 frontmatter 的name字段或去掉扩展名的文件 basename作为命令名而 webview 的自动补全菜单以及旧版 Cline向用户展示的却是/my-workflow.md这样的完整文件名。用户从菜单中选中命令后输入框里实际插入的就是带.md后缀的 token——如果展开逻辑只做精确匹配这些命令就静默失效了。2.2 源码中的多级回退匹配展开逻辑的核心是 findRuntimeCommand它对输入的命令名做了四级回退精确匹配先用原始 token如release.md再尝试去掉扩展名后的形式release逐个与运行时命令表做精确比对大小写不敏感匹配webview 对斜杠命令的高亮与校验是大小写不敏感的因此这里回退到toLowerCase()比对避免「静默不展开」通过文件 basename 解析 frontmatter 重命名这是关键一步——当 Workflow 文件的 frontmattername与文件名不一致时例如文件叫release.md但name: Ship It代码会用规范化名称去扩展名、小写见 canonicalWorkflowName把用户输入的文件名与发现记录workflowRecords的 basename 对齐找到对应记录后优先用稳定的record.id匹配命令SDK 会把 Ship It 规范化为 ship-it直接比较配置名会失败最后再回退到规范化名称比较都未命中则返回undefined命令保持原样不展开。2.3 测试用例的印证slash-command-expansion.test.ts 中有针对该场景的直接断言基础场景expandSlashCommands(/release.md now, commands)的结果是Run the release workflow. now——带扩展名的遗留拼写被成功展开为指令正文重命名场景当命令名已被规范化renamed时仅凭命令表匹配不到/release.md传入workflowRecords[{ name: ship-it, filePath: /repo/.clinerules/workflows/release.md }]后即可解析展开反向验证当该 Workflow 出现在禁用集合中时同一输入保持/release.md原文不展开——这正是第三点修复的联动效果。3. 修复二消息中段的斜杠命令同样被展开3.1 匹配规则任意空白边界后的命令 tokenSDK 自身的resolveRuntimeSlashCommand只处理消息开头的/command但 webview 允许用户在消息中段插入斜杠命令输入框高亮与补全即如此工作旧版扩展也支持中段展开。本次回归修复将该能力恢复实现方式是 SLASH_COMMAND_TOKEN_REGEXconst SLASH_COMMAND_TOKEN_REGEX /(^|\s)(\/[a-zA-Z0-9_.:-])(?\s|$)/g该正则要求命令 token 要么位于消息开头要么前置空白且后接空白或行尾。注释特意说明它与 webview 侧slash-commands.ts中的slashCommandRegex保持同步——即「凡是被聊天输入框高亮/自动补全为命令的 token都能被展开」。3.2 展开语义只展开第一个命中命令expandSlashCommands 遍历所有匹配但对第一个能解析为已知 Workflow/Skill 的命令执行展开用command.instructions替换 token 原文text.slice(0, start) command.instructions text.slice(end)随后立即返回。这与旧版行为及 webview 菜单一致——菜单也只对消息中的第一个命令提供建议。测试用例expect(expandSlashCommands(please run /release.md for v2, commands)).toBe(please run Run the release workflow. for v2)验证了中段展开的前后文均被原样保留。另外值得注意的边界非内置的skill类型命令不在此处展开——SDK 会话注册了skills工具其描述要求模型在用户引用斜杠命令时主动调用指令以工具结果形式到达转写中保留用户输入的原始命令而builtin:前缀的内置技能如/deep-planning与 Workflow 一样继续走内联展开见 expandSlashCommands 内注释。4. 修复三展开时尊重启用/禁用开关含远程锁定的处理4.1 开关的三个作用域Cline 的 Workflow 开关分布在三个作用域中getAvailableSlashCommands 中可见完整的读取链路作用域状态键键的含义工作区local/workspaceworkflowToggles绝对文件路径全局global settingsglobalWorkflowToggles绝对文件路径远程/企业remote全局状态remoteWorkflowToggles远程 Workflow 名称4.2 buildDisabledWorkflowNames 的判定规则buildDisabledWorkflowNames 负责把三套开关聚合为「禁用命令名集合」并在expandSlashCommands中被消费命中的 Workflow 被跳过、保持原样不展开。其判定规则有几处细节值得注意按记录record逐条评估每个命令由「其自身记录」——即真正会被展开的那个文件——的开关状态管辖一个作用域中被禁用的 Workflow 既不能压制、也不能解锁另一个作用域中同名的命令按 basename 对齐开关开关以文件路径为键但命令名可能因 frontmatter 而异因此用文件 basename 的规范化形式做匹配保证「文件名 ≠ 命令名」的 Workflow 仍受其文件开关管辖多作用域同名取「任一启用即启用」enabledByBasename.set(key, (enabledByBasename.get(key) ?? false) || enabled)——因为多作用域的同名文件会坍缩为同一条记录旧版展开逻辑只在「已启用」集合中查找工作区被禁用的文件不应遮蔽全局同名的已启用文件反之亦然远程文件单独处理路径命中.cline/remote-config/…的物化文件由按名称键控的远程开关管辖且alwaysEnabled组织锁定开启的远程 Workflow 恒为启用。远程名称比对前还要经过 sanitizeRemoteSegment——与cline/shared物化器中命名文件的私有函数逐字对齐小写、非法字符折叠为-、截断 80 字符因为它对已规范化名称是幂等的可以安全地用于两侧比对。测试文件 slash-command-expansion.test.ts 中覆盖了对应矩阵本地/全局开关交叉全局启用 工作区禁用 → 仍启用、远程文件 alwaysEnabled、仅存在于全局目录的开关不误伤其他记录等场景。5. 修复四webview 启动时刷新斜杠菜单的 Workflow 列表5.1 启动即同步refreshWorkflowToggles变更点位于 webview 初始化阶段。initializeWebview.ts 在 webview 启动时调用 refreshWorkflowToggles其目的是「让聊天输入的斜杠命令菜单无需用户手动打开规则面板即可感知 Workflow 文件」。这直接解决了回归症状之一用户新建/删除 Workflow 文件后斜杠菜单列表陈旧。5.2 并发安全串行化队列 扫描后合并Workflow 开关刷新并非简单的「扫描目录 → 写状态」workflows.ts 处理了两类并发竞态刷新串行化模块级refreshQueue把重叠的刷新webview 启动、规则面板打开、通过面板创建 Workflow 文件排成队列使每次扫描相对其他刷新是原子的扫描期间发生的文件创建/删除会触发各自独立的、排在队尾的刷新来纠正结果扫描中状态变更的合并mergeToggleStateAfterScan 把异步扫描结果与「扫描前快照」「当前状态」三方合并保证扫描中用户手动翻动的开关值获胜扫描中新增的条目如面板里刚创建的 Workflow被保留扫描中已被删除的条目保持删除仅当文件确实从磁盘消失时才裁剪对应条目。刷新会分别处理全局~/.cline/workflows等全局目录与工作区.clinerules/workflows两个目录分别写回globalWorkflowToggles与workflowToggles最终通过RefreshedRules响应同步到 webview 状态ClineRulesToggleModal 在面板可见时也会主动调用FileServiceClient.refreshRules拉取最新开关。5.3 菜单组装规则本地优先、仅列启用项斜杠菜单的数据来自 getAvailableSlashCommands其组装顺序体现了优先级内置命令section: default→ 工作区启用的 Workflow → 全局启用的 Workflow同名时让位于工作区由localNames去重→ 远程启用的 WorkflowalwaysEnabled || toggles[name] ! false。所有自定义 Workflow 的 description 形如Custom workflow: 文件名且cliCompatible: true。注意菜单名保留.md等扩展名——这正是第二、三节中「遗留拼写」的由来菜单与展开逻辑必须成对兼容。6. 修复五Workflows 管理标签页回归规则模态框并指向 Skills6.1 标签页布局与弃用提示规则模态框 ClineRulesToggleModal.tsx 通过currentView状态在rules | workflows | hooks | skills四个视图间切换第 64 行。本次修复恢复了 Workflows 标签页且按变更记录所述将其置于标签列表末尾并在该视图中放置弃用提示。源码中可确认该提示文案Workflows are being deprecated. Use skills instead.第 608 行附近6.2 Workflows → Skills 的迁移含义从同一组件的 Skills 视图描述第 492 行附近可以看到官方对两者定位的界定「Skills are reusable instruction sets that Cline can activate on-demand. When a task matches a ...」——Skills 是 Cline 可按需激活的可复用指令集且支持全局/工作区/企业远程三级来源。与 Workflow 的差异在展开机制上已有体现skill类型命令默认不做内联展开而是由 SDK 会话注册的skills工具在模型判定任务匹配时拉取见 expandSlashCommands 注释。因此对于新建的可复用指令推荐路径是 SkillsWorkflows 的斜杠展开能力被完整保留以兼容存量用户——本次修复正是「兼容层」质量的回归保障。7. 端到端链路小结把五个修复点串起来Cline VS Code 扩展中 Workflow 的完整生命周期如下发现与同步webview 启动 →refreshWorkflowToggles串行队列 三态合并→globalWorkflowToggles/workflowToggles与磁盘文件对齐菜单呈现getAvailableSlashCommands按「本地优先、仅启用项」组装/xxx.md形式的候选命令用户提交输入框中的 token可能是菜单插入的/release.md也可能手工敲在消息中段经SLASH_COMMAND_TOKEN_REGEX捕获开关裁决buildDisabledWorkflowNames聚合工作区/全局/远程三套开关含alwaysEnabled禁用集合中的命令直接跳过指令展开findRuntimeCommand四级回退精确 → 去扩展名 → 大小写不敏感 → basename 解析重命名命中后将第一个命令 token 原位替换为command.instructions管理界面规则模态框中位于末尾的 Workflows 标签页带弃用提示继续提供开关与文件管理能力新指令建议改用 Skills。本次变更的所有关键行为都有对应测试锚定在 apps/vscode/src/sdk/slash-command-expansion.test.ts 中涉及遗留拼写、中段命令、重命名解析与开关裁决的各分支开关刷新的竞态处理则定义在 workflows.ts。对维护者而言改动这一链路时需要同时留意三处同步约束webview 高亮正则与展开正则保持一致、findRuntimeCommand的扩展名正则与cline/core的发现逻辑保持一致、sanitizeRemoteSegment与cline/shared物化器保持逐字一致——源码注释中均已显式标注这些「Keep in sync」要求。【免费下载链接】clineAutonomous coding agent as an SDK, IDE extension, or CLI assistant.项目地址: https://gitcode.com/GitHub_Trending/cl/cline创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考