路由
参数:$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. 查找候选技能
- 从当前目录运行
python3 <base>/scripts/inventory.py --check。NO CATALOG:告知用户路由器需要一次性执行/route build,提供立即运行的选项,同时使用你自己技能列表中可见的技能来处理请求。- 否则它会打印
catalog in sync,或打印 NEW 技能(已安装但不在目录中,附带其描述)和 GONE 条目(不再安装)。NEW 技能是有效的候选技能。切勿选择 GONE 的条目。
- 如果
--check报告存在覆盖文件,则先读取该文件。它包含用户自己的路由规则(如“UI 美化 -> better-ui,绝不使用 impeccable”)。与目录、其默认选项和你的判断相比,匹配请求的覆盖规则优先级更高。在“原因”列中注明覆盖规则。 - 在
--check第一行打印的目录文件夹中,读取INDEX.md,如果存在则读取PROFILE.md(用户的技术栈和习惯)。 - 选择与请求匹配的 1 到 3 个类别,并仅读取这些类别文件。
每行技能格式为:
- `name` [load] USE: ... | NOT: ... | NEXT: ... | NEEDS: ...
3. 选择技能集
- 选择覆盖整个请求的最小技能集:通常 1 到 3 个技能,最多不超过 5 个。
- 每个工作只用一个技能。切勿加载两个执行相同工作的技能;遵循类别中的“默认选项”。
- 遵守每个技能的 NOT 字段。如果 NOT 指定了更适合此请求的技能,则选用那个。
- 对于相同工作,优先选择项目技能(
[project],来自此仓库的.claude/skills)或用户自己的自定义技能,其次才选择通用技能。 - 如果某个技能列出了 NEEDS 但当前缺失,则说明并选择下一个最佳技能。
- 如果没有技能能增加实际价值,则说“无需技能”并直接完成任务。
- 如果对请求有两种截然不同的理解导致选择不同的技能,则在加载任何技能之前用一个简短的问题向用户询问选项。
4. 展示计划,然后加载
在第一次调用技能工具之前,将以下表格作为可见文本打印出来。这是必需的输出,而非叙述:即使处于简洁或“在工具调用前不显示文本”模式下,也要打印它。
| # | 技能 | 选择原因 | 加载方式 |
|---|---|---|---|
| 1 | skill-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 要求的步骤中获取。仅保留与实际发生情况相符的,不要执行它们。当未加载任何技能时,本部分同样适用。
刷新
当用户安装、移除或更新技能或插件时运行。
- 运行
python3 <base>/scripts/inventory.py --check。如果它打印NO CATALOG,则改为运行构建。 - 对于每个 NEW 技能:读取其 SKILL.md(frontmatter 和前约 80 行),选择其范围匹配的类别文件(
inventory.py在其 TAXONOMY 中列出了固定的类别),并以该文件中其他行相同的格式追加一行。当其 frontmatter 中有disable-model-invocation: true时使用[read <绝对路径>],当技能位于仓库的.claude/skills中时使用[project]。如果类别文件尚不存在,则使用相同的标题(# name、Scope:、Default picks:)创建它。 - 对于每个 GONE 条目:删除其所在行,并将其从任何“Default picks”文本中移除。
- 运行
inventory.py --index,然后再次运行--check直到它打印catalog in sync。报告添加和移除了哪些内容。