Community编程与开发github.com

medjbilou/claude-skill-router

技能路由器。仅在用户消息包含“/route”(开头、结尾或单独发送)时使用;切勿自行调用。从所有安装的技能中挑选1到5个最合适的技能处理用户请求,显示加载了哪些技能及原因,执行任务,然后建议接下来运行哪些技能及何时运行。

claude-skill-router 是什么?

该技能充当智能路由中心,在用户明确请求时(通过添加“/route”标签),分析用户请求并从所有已安装的技能中自动挑选出最合适的1到5个技能来执行任务。它支持Claude Code、Cursor等AI代理平台,通过读取个人技能目录和项目配置文件,确保每次只加载能覆盖请求完整范围的最小技能集。技能会显示选中的技能列表及选择理由,执行过程中可动态调整,最后生成执行报告并建议后续可运行的技能。其核心价值在于避免手动选择和切换技能,提升AI代理在复杂多步骤任务中的效率和准确性。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/medjbilou/claude-skill-router/tree/HEAD/skills/route

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

路由

参数:$ARGUMENTS

以下 <base> 指此文本上方显示的“此技能的基目录”。脚本位于 <base>/scripts/inventory.py。个人目录默认位于 ~/.claude/route-catalog/(或 $ROUTE_CATALOG_DIR 指定的路径),绝不会存放在插件内部。

0. 查找请求

用户编写正常提示并在末尾添加 /route。根据用户自己的话来理解请求:

  • /route 与提示位于同一条消息中(之前或之后):请求是该整条消息去掉 /route 后的内容。
  • /route 单独发送:请求是用户的上一条(或多条,若属于同一任务)消息,需结合对话内容阅读。切勿将孤立的“/route”视为请求。
  • 上述参数中包含文本:将其视为请求或其一部分,但如果用户自己的消息内容不同,则以用户消息为准。
  • 如果在 /route 到达之前你已经开始处理该请求,则检查已完成的工作,只路由剩余部分。不要重做已完成的步骤。
  • 如果请求是 build,则阅读 <base>/BUILD.md 并遵循它。如果是 refresh,则跳转到刷新。

保留用户的提示作为任务。不要将提示缩减到单个技能覆盖的部分:提示的每个部分都必须由加载的技能或你自己的工作来覆盖。

1. 理解请求

给自己写一行:目标、交付物、涉及的技术或文件、以及阶段(计划、构建、调试、审查、验证、发布、文档、媒体、运维)。使用对话内容:像“修复它”或“制作视频”这样的请求指的是刚才讨论的内容。此时不要探索代码库。

早期退出:如果请求很简单(如重命名、单行修复、普通问题),打印“无需技能:<原因>”并直接完成任务。不要读取目录。

如果项目的 CLAUDE.md 要求在任何工作开始前执行第一步(例如“在诊断前搜索运行手册中的错误文本”),则立即执行该步骤。其结果可能会改变所需技能。

2. 查找候选技能

  1. 从当前目录运行 python3 <base>/scripts/inventory.py --check。
    • NO CATALOG:告知用户路由器需要一次性执行 /route build,提供立即运行的选项,同时使用你自己技能列表中可见的技能来处理请求。
    • 否则它会打印 catalog in sync,或打印 NEW 技能(已安装但不在目录中,附带其描述)和 GONE 条目(不再安装)。NEW 技能是有效的候选技能。切勿选择 GONE 的条目。
  2. 如果 --check 报告存在覆盖文件,则先读取该文件。它包含用户自己的路由规则(如“UI 美化 -> better-ui,绝不使用 impeccable”)。与目录、其默认选项和你的判断相比,匹配请求的覆盖规则优先级更高。在“原因”列中注明覆盖规则。
  3. 在 --check 第一行打印的目录文件夹中,读取 INDEX.md,如果存在则读取 PROFILE.md(用户的技术栈和习惯)。
  4. 选择与请求匹配的 1 到 3 个类别,并仅读取这些类别文件。 每行技能格式为:- `name` [load] USE: ... | NOT: ... | NEXT: ... | NEEDS: ...

3. 选择技能集

  • 选择覆盖整个请求的最小技能集:通常 1 到 3 个技能,最多不超过 5 个。
  • 每个工作只用一个技能。切勿加载两个执行相同工作的技能;遵循类别中的“默认选项”。
  • 遵守每个技能的 NOT 字段。如果 NOT 指定了更适合此请求的技能,则选用那个。
  • 对于相同工作,优先选择项目技能([project],来自此仓库的 .claude/skills)或用户自己的自定义技能,其次才选择通用技能。
  • 如果某个技能列出了 NEEDS 但当前缺失,则说明并选择下一个最佳技能。
  • 如果没有技能能增加实际价值,则说“无需技能”并直接完成任务。
  • 如果对请求有两种截然不同的理解导致选择不同的技能,则在加载任何技能之前用一个简短的问题向用户询问选项。

4. 展示计划,然后加载

在第一次调用技能工具之前,将以下表格作为可见文本打印出来。这是必需的输出,而非叙述:即使处于简洁或“在工具调用前不显示文本”模式下,也要打印它。

#技能选择原因加载方式
1skill-name一行与请求相关的说明skill / read / builtin / project

某行可能是有条件的:在“原因”列中写入“仅当 <条件>”,并且仅在条件满足时才加载它。

在表格下方为每个可能发送消息、部署、删除数据、消耗付费额度或写入生产环境的步骤添加“副作用”注释,无论该步骤是由技能还是工作本身执行的。在该步骤之前请求用户确认。否则无需等待继续执行。

按表格顺序加载技能(先计划,再构建,然后验证):

  • [skill]、[builtin]、[project]:使用准确名称调用技能工具,并将该技能应处理的请求部分作为 args 传递。
  • [read <path>]:技能工具拒绝此技能(仅限用户)。读取 <path> 处的文件并像加载了它一样遵循其中的指示。
  • 如果调用技能失败,则改为读取该技能的 SKILL.md(使用 inventory.py 不加参数可以打印所有路径)并说明情况。

5. 执行工作

一起遵循已加载的技能。当两个技能冲突时,对于任务的那部分,更具体的技能胜出。用户的 CLAUDE.md 文件和显式指令优先级高于所有技能。 如果中途出现新的需求(例如修复需要迁移),则再加载一个技能并一行说明:“同时加载 x:<原因>”。

6. 检查、记录、报告并建议下一步运行什么

结束检查:当加载了两个或更多技能,或者请求包含多个部分时,在最终回复之前检查每个部分。对于每个加载的技能以及请求中未被任何技能覆盖的部分,决定完成/部分完成/受阻状态,并提供证据(文件:行号、测试结果、命令输出)。在最终回复中以简短表格形式呈现:

部分技能状态证据

如果有部分完成或受阻,说出缺少了什么,而不是直接宣告任务完成。对于单技能单部分请求,跳过此表格。

日志记录:运行一次 python3 <base>/scripts/inventory.py --log '<json>',其中包含一个 JSON 对象:request(请求,最多 160 个字符,不包含秘密信息)、loaded(加载的技能)、used(实际塑造了工作的已加载技能指令)、unused(已加载但未使用)、skipped(计划但未执行的技能)、next(你建议的下一个技能)、no_skill(当不需要技能时为 true)、check(“done”、“partial”、“blocked”或“n/a”)。日志记录是路由的一部分,不可省略。如果命令失败,用一行说明并继续执行。后续可使用 inventory.py --report 查看 /route 加载了什么、工作使用了什么以及用户遵循了多少个 Next 技能。

在最终回复的开头用一行说明哪些技能已运行,以便用户即使在表格滚动后也能看到:已使用技能:a、b(如果某个计划技能未执行,则添加 跳过 c:<原因> ``,或 已使用技能:无(<原因>))。

在最终回复的末尾添加以下部分:

接下来可使用的技能

  • skill-name:何时使用(现在 / 提交前 / 推送前 / 部署后 / 每周一次),以及原因。

最多给出 3 个。从已加载技能的 NEXT 字段、所读取类别的“默认选项”以及项目 CLAUDE.md 要求的步骤中获取。仅保留与实际发生情况相符的,不要执行它们。当未加载任何技能时,本部分同样适用。

刷新

当用户安装、移除或更新技能或插件时运行。

  1. 运行 python3 <base>/scripts/inventory.py --check。如果它打印 NO CATALOG,则改为运行构建。
  2. 对于每个 NEW 技能:读取其 SKILL.md(frontmatter 和前约 80 行),选择其范围匹配的类别文件(inventory.py 在其 TAXONOMY 中列出了固定的类别),并以该文件中其他行相同的格式追加一行。当其 frontmatter 中有 disable-model-invocation: true 时使用 [read <绝对路径>],当技能位于仓库的 .claude/skills 中时使用 [project]。如果类别文件尚不存在,则使用相同的标题(# name、Scope:、Default picks:)创建它。
  3. 对于每个 GONE 条目:删除其所在行,并将其从任何“Default picks”文本中移除。
  4. 运行 inventory.py --index,然后再次运行 --check 直到它打印 catalog in sync。报告添加和移除了哪些内容。

相关技能