类型: Skill Router Plugin(确定性技能路由器)
仓库:
https://github.com/cascharly/opencode-triage版本: 1.3.2 | License: MIT
1. 这是什么插件?
opencode-triage 是一个为 OpenCode 添加确定性 Skill 路由能力的插件。核心概念:

🎯 不依赖 LLM 解析 — 使用纯关键词匹配算法,零 PowerShell,零 LLM 解析开销 💾 节省约 90% tokens — 将所有 skills 从 system prompt 中隐藏,按需加载 🔍 智能路由 — 通过关键词评分自动发现并匹配最合适的 skill ⚡ 即时响应 — 缓存机制 + 文件监听,5秒内自动刷新
想象一下:就像一个智能分诊台,根据你的描述自动把你派到正确的专家科室,而不是让每个医生都听你从头讲一遍病史。
Triage 路由 vs 传统全量注入:
| Token 消耗 | ||
| Context 污染 | ||
| 匹配精度 | ||
| 扩展性 | ||
| 延迟 |
2. 用来做什么?
使用它来:
✅ 管理 50+ 个 skills 而 token 消耗几乎为零 ✅ 自动匹配最佳 skill — 说"备份数据库"就路由到 backup skill ✅ 独立控制全局/项目级 skills — 两套作用域互不干扰 ✅ 远程搜索缺失的 skills — 自动从 skills.sh 和 superpowers 推荐 ✅ Toast 通知 — 路由结果、完成状态实时反馈 ✅ 文件监听 — 新安装的 skill 自动隐藏(ON 模式下)
典型工作流:
你安装了 30 个 skills(测试、部署、数据库、文档、重构...)没有 Triage:┌─────────────────────────────────────┐│ System Prompt: 50,000 tokens │ ← 所有 skills 全在里面│ - test-skill (2000 tokens) ││ - deploy-skill (3000 tokens) ││ - db-skill (2500 tokens) ││ ... (27 more) ││ ││ 你: "帮我备份一下数据库" ││ AI: [困惑地看着 30 个 skills] │└─────────────────────────────────────┘有 Triage(ON 模式):┌─────────────────────────────────────┐│ System Prompt: 5,000 tokens │ ← 干净清爽│ ││ 你: "帮我备份一下数据库" ││ Triage: 🔍 匹配中... ││ ✅ 路由到: db-backup │ ← 仅加载这 1 个│ Loaded: db-backup ✓ │└─────────────────────────────────────┘3. 如何使用?
安装
在 ~/.config/opencode/opencode.json 或 .opencode/opencode.json 中:
{"$schema": "https://opencode.ai/config.json","plugin": ["opencode-triage"]}安装后运行 bun install(或 npm install -g opencode-triage),postinstall 脚本会自动创建 /triage 命令文件。

核心命令
① 启用 Triage(隐藏 skills)
/triage on # 隐藏全局 + 项目 skills(推荐)/triage on --local# 仅隐藏项目级 skills/triage on --global # 仅隐藏全局 skills/triage on --both # 同 /triage on② 禁用 Triage(暴露 skills)
/triage off # 暴露全局 + 项目 skills/triage off --local# 仅暴露项目级 skills/triage off --global # 仅暴露全局 skills③ 查看状态
/triage status # 显示插件状态 + 所有 skills 列表④ 去重
/triage dedupe # 移除项目级重复 skills(保留全局版本)⑤ 对比查看
/triage compare # 并排对比 project vs global skills⑥ 模式切换
/triage mode auto # 自动模式:启动时自动隐藏(写入 autoHide: true)/triage mode manual # 手动模式:需要手动 /triage on/offAI 侧使用(triage 工具)
插件注册了 triage() 工具,AI 可以在对话中直接调用:
用户: 我需要备份 PostgreSQL 数据库AI: 让我查找合适的技能... triage({ query: "backup postgresql database" }) → SKILL ROUTED: pg-backup → Matched by: name:backup, desc:postgresql, desc:database → [加载 pg-backup 的完整内容]当多个 skills 匹配时,返回候选列表供选择:
→ Multiple matches for "deploy". Pick one: 1. deploy-vercel -- Deploy to Vercel edge network 2. deploy-docker -- Containerize and deploy with Docker 3. deploy-aws -- Deploy to AWS Lambda or ECS Example: triage({ query: "deploy-vercel" })通知系统
插件还注册了 notify() 工具,AI 可以调用它显示 Toast 通知:
notify({ message: "Build complete", variant: "success" }) // 绿色notify({ message: "Fetching data...", variant: "info" }) // 蓝色notify({ message: "Operation failed", variant: "error" }) // 红色notify({ message: "Disk almost full", variant: "warning" }) // 黄色4. 扫描目录结构
Triage 会扫描 6 个目录(3 个项目级 + 3 个全局级):
.agent/skills/ | ||
.agents/skills/ | ||
.claude/skills/ | ||
.opencode/skills/ | ||
~/.agents/skills/ | ||
~/.claude/skills/ | ||
~/.config/opencode/skills/ |
优先级: 项目级 > 全局级(同名 skill 以项目级为准)
5. 评分引擎详解
匹配算法
查询: "backup my database"分词: ["backup", "database"] (过滤了 "my",长度 < 3)对每个 skill 计算:┌─────────────────────────────────────────────────────┐│ Skill: pg-backup ││ Name: "pg-backup" ││ Desc: "PostgreSQL backup and restore utilities" ││ ││ 名称匹配 (权重 ×3): ││ "backup" → 子串匹配 → 10 × 3 = 30 ││ ││ 描述匹配 (权重 ×1): ││ "backup" → 完整词匹配 → 15 × 1 = 15 ││ "database" → 子串匹配 → 10 × 1 = 10 ││ ││ 总分: 55 ││ matchedBy: "name:backup, desc:backup, desc:database"│└─────────────────────────────────────────────────────┘评分规则
\bword\b) | 45 | ||
includes) | 30 | ||
自动路由阈值
THRESHOLD = 30 — 第一名与第二名的分数差 ≥ 30 时自动路由 差值 < 30 → 返回候选列表让 AI/用户选择 只有 1 个匹配 → 直接路由
一个名称完全匹配就能达到 45 分,超过阈值。所以精确命名非常重要!
6. Skill 文件格式
标准 SKILL.md 结构
---name: my-skill-name # 技能名称(可选,默认用目录名)description: > # 支持 folded 语法(多行折叠) 这是一段较长的描述文字, 可以写很多行,会被合并成一行---# 这里是 skill 的实际内容# 会被加载到 AI context 中# 支持完整的 Markdown 格式## 使用说明...Frontmatter 解析支持
单行: description: Some text hereFolded 块: description: >+ 缩进行自动去除 UTF-8 BOM(Windows 兼容)
文件状态
SKILL.md | Exposed | |
SKILL.md.disabled | Hidden |
Triage 的魔法: 即使 skill 被 hidden(.disabled),路由器仍然可以发现和加载它!只是不会污染 system prompt。

7. 何时使用?
在以下情况使用:
安装了 10+ 个 skills,token 消耗成为问题 Skills 有明确的功能边界(名称和描述清晰) 需要精准路由而不是让 AI 猜测 在多个项目间切换,每个项目有不同的 skills 想要干净的 system prompt 使用免费/低价模型,对 token 敏感
不要在以下情况使用:
只有 1-3 个 skills(不值得折腾) Skills 命名混乱、描述不清(匹配率低) 需要 skills 始终可见(如核心工具链) 使用需要全量上下文的特殊工作流
8. 高级配置
环境变量
OPENCODE_TRIAGE_EXCLUDED | "triage,debug,test" |
配置持久化
/triage on 和 /triage off 会自动写入配置文件:
// ~/.config/opencode/opencode.jsonc{"plugin": [ ["opencode-triage", { "autoHide": true }] // ON 状态// "opencode-triage" // OFF 状态(无选项) ]}启动流程:
插件加载 → 读取 autoHide配置autoHide: true→ 自动重命名所有SKILL.md→SKILL.md.disabled启动文件监听器 → 新 skill 自动隐藏 显示 Toast 通知:"N skill(s) auto-hidden by triage"
Dry Run 预览
/triage on --dry-run # 预览会改哪些文件,但不实际执行JSON 输出
/triage status --json # JSON 格式输出,方便脚本处理9. 与其他插件配合
| oh-my-opencode | ||
| opencode-background-agents | ||
| opencode-notify | ||
| opencode-supermemory | ||
| Cursor / Windsurf | /triage off 切换回全量模式 |
重要注意事项
1. 重启要求
每次执行 /triage on 或 /triage off 后,必须重启 OpenCode 才能生效。插件会提示你:
Restart opencode for changes to take effect.2. 缓存机制
技能缓存 5 秒 TTL( CACHE_TTL_MS = 5000)CLI 更改后最多等 5 秒即可被插件感知 无需重启即可看到状态变化(但文件重命名仍需重启)
3. 安全限制
Skill 文件大小限制:1MB — 防止内存耗尽攻击 路径遍历防护: 拒绝 ..,.,/,\作为 skill 名符号链接跳过: 不跟踪 symlink 目录 正则转义: 所有用户输入都经过 escapeRegex()处理
4. 远程搜索降级
当本地无匹配 skill 时,Triage 会:
先检查是否有 find-skillsskill(本地搜索)再请求 skills.sh API(远程搜索,3 秒超时)最后查 obra/superpowersGitHub 仓库(3 秒超时)
网络不可达时会静默失败,不影响主流程。
5. 排除自身
triage skill 自身永远被排除在路由之外(防止无限递归)。可通过环境变量自定义排除列表。
有用链接
仓库: https://github.com/cascharly/opencode-triage npm: npm install opencode-triageSkills 市场: https://skills.sh Superpowers: https://github.com/obra/superpowers OpenCode 文档: https://opencode.ai
快速参考卡
# 安装npm install -g opencode-triage# 基本操作/triage on # 启用(隐藏 skills)/triage off # 禁用(暴露 skills)/triage status # 查看状态# 作用域控制/triage on --local# 仅项目级/triage on --global # 仅全局级# 高级/triage mode auto # 自动模式/triage dedupe # 去重/triage compare # 对比/triage on --dry-run # 预览评分公式: score = Σ(name_matches × 3 × bonus) + Σ(desc_matches × 1 × bonus) bonus: 完整词=15, 子串=10 阈值: gap ≥ 30 → 自动路由 gap < 30 → 返回候选列表一句话总结: Triage 就像是 OpenCode 的「技能分诊台」— 它把 50 个 skills 从你的 system prompt 里藏起来,只在你说出需求的那一刻,精准地把那一个正确的 skill 送到 AI 手中。省 token、省时间、更聪明。
夜雨聆风