<mxGraphModel><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="title" value="Skill 系统核心流程" style="text;fontSize=18;fontStyle=1;align=center;fillColor=none;strokeColor=none;" vertex="1" parent="1"><mxGeometry x="200" y="10" width="300" height="30" as="geometry"/></mxCell><mxCell id="user-input" value="用户输入" style="rounded=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=13;fontStyle=1;" vertex="1" parent="1"><mxGeometry x="290" y="50" width="120" height="40" as="geometry"/></mxCell><mxCell id="arr-1" value="" style="endArrow=classic;html=1;" edge="1" parent="1"><mxGeometry><mxPoint x="350" y="90" as="sourcePoint"/><mxPoint x="350" y="120" as="targetPoint"/></mxGeometry></mxCell><mxCell id="match-title" value="skill_router.match_skill(query)" style="rounded=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=12;fontStyle=1;align=center;verticalAlign=top;" vertex="1" parent="1"><mxGeometry x="50" y="120" width="600" height="160" as="geometry"/></mxCell><mxCell id="match-1" value="1️⃣ 显式调用检测 — 正则: (用|使用|调用)\s*skill名 → 9999分" style="text;fontSize=11;align=left;" vertex="1" parent="1"><mxGeometry x="65" y="148" width="570" height="18" as="geometry"/></mxCell><mxCell id="match-2" value="2️⃣ 触发词匹配 — 词边界 \btrigger\b → 3分 · 子串匹配 → 1分 · 多词累加" style="text;fontSize=11;align=left;" vertex="1" parent="1"><mxGeometry x="65" y="170" width="570" height="18" as="geometry"/></mxCell><mxCell id="match-3" value="3️⃣ 排序返回 — 按 (-score, 注册顺序) 排序，最高分 skill 胜出 · 无匹配返回 None" style="text;fontSize=11;align=left;" vertex="1" parent="1"><mxGeometry x="65" y="192" width="570" height="18" as="geometry"/></mxCell><mxCell id="match-example" value="例: "查公司背景调查" → "查公司"(3分) + "背景调查"(3分) = 6分 → b2b-osint" style="text;fontSize=10;align=left;fontStyle=2;color=#666;" vertex="1" parent="1"><mxGeometry x="65" y="215" width="570" height="16" as="geometry"/></mxCell><mxCell id="arr-2" value="有匹配" style="endArrow=classic;html=1;fontSize=10;fontStyle=0;fontColor=#82b366;" edge="1" parent="1"><mxGeometry><mxPoint x="350" y="280" as="sourcePoint"/><mxPoint x="350" y="315" as="targetPoint"/></mxGeometry></mxCell><mxCell id="arr-2b" value="无匹配" style="endArrow=classic;html=1;fontSize=10;fontColor=#b85450;" edge="1" parent="1"><mxGeometry><mxPoint x="680" y="200" as="sourcePoint"/><mxPoint x="740" y="200" as="targetPoint"/></mxGeometry></mxCell><mxCell id="pass-through" value="直接传递原查询\n给 Hermes Agent" style="rounded=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=11;align=center;" vertex="1" parent="1"><mxGeometry x="740" y="180" width="120" height="40" as="geometry"/></mxCell><mxCell id="augment-title" value="skill_router.augment_query(query, skill)" style="rounded=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=12;fontStyle=1;align=center;verticalAlign=top;" vertex="1" parent="1"><mxGeometry x="50" y="315" width="600" height="130" as="geometry"/></mxCell><mxCell id="aug-1" value="1. 查找 SKILL.md: 优先 ~/.hermes/skills/ · 回退 package/skills/" style="text;fontSize=11;align=left;" vertex="1" parent="1"><mxGeometry x="65" y="343" width="570" height="18" as="geometry"/></mxCell><mxCell id="aug-2" value="2. mtime 缓存检查: 命中→直接返回 · 未命中→重新加载并解析 YAML frontmatter" style="text;fontSize=11;align=left;" vertex="1" parent="1"><mxGeometry x="65" y="365" width="570" height="18" as="geometry"/></mxCell><mxCell id="aug-3" value="3. 提取 injection_prompt，拼接到用户 query: augmented = prompt + &quot;\n\n用户问题：&quot; + query" style="text;fontSize=11;align=left;" vertex="1" parent="1"><mxGeometry x="65" y="387" width="570" height="18" as="geometry"/></mxCell><mxCell id="aug-4" value="4. LRU 缓存更新: _INJECTION_CACHE[skill] = (mtime, prompt) · 上限128项" style="text;fontSize=11;align=left;" vertex="1" parent="1"><mxGeometry x="65" y="409" width="570" height="18" as="geometry"/></mxCell><mxCell id="arr-3" value="" style="endArrow=classic;html=1;" edge="1" parent="1"><mxGeometry><mxPoint x="350" y="445" as="sourcePoint"/><mxPoint x="350" y="480" as="targetPoint"/></mxGeometry></mxCell><mxCell id="agent" value="传递给 Hermes Agent\nAgent 根据 injection_prompt\n调用对应工具执行任务" style="rounded=1;fillColor=#e1d5e7;strokeColor=#9673a6;fontSize=12;align=center;" vertex="1" parent="1"><mxGeometry x="250" y="480" width="200" height="55" as="geometry"/></mxCell></root></mxGraphModel>