{"id":"09694194-6e7c-445e-b250-f7d27598be46","shortId":"ngSukN","kind":"skill","title":"clash-routes","tagline":"查看指定进程的代理线路。通过 Mihomo API 查询当前活跃连接，显示进程匹配的规则和代理链路。用于确认某个进程（如 claude、chrome）走的是哪条订阅线路","description":"# Clash 线路查看工具\n\n查看当前活跃连接的代理线路信息，确认指定进程走的是哪条订阅/代理链。\n\n用户传入的参数：$ARGUMENTS\n如果用户没有传入参数，显示所有活跃连接（按进程分组）。\n\n## 执行流程\n\n### 第一步：获取 Mihomo API 凭证\n\n读取 Clash Verge 配置获取 API secret：\n\n```bash\nSECRET=$(grep '^secret:' \"/Users/lifcc/Library/Application Support/io.github.clash-verge-rev.clash-verge-rev/clash-verge.yaml\" 2>/dev/null | awk '{print $2}')\n[ -z \"$SECRET\" ] && SECRET=$(grep '^secret:' \"/Users/lifcc/.config/clash/config.yaml\" 2>/dev/null | awk '{print $2}')\necho \"Secret: ${SECRET:-(未找到)}\"\n```\n\n### 第二步：查询连接信息\n\n优先使用 Unix socket，fallback 到 HTTP：\n\n```bash\n# Unix socket 方式（Clash Verge Rev）\nSOCKET=\"/var/tmp/verge/verge-mihomo.sock\"\nif [ -S \"$SOCKET\" ]; then\n  CONNECTIONS=$(curl -s --unix-socket \"$SOCKET\" \"http://localhost/connections\" -H \"Authorization: Bearer $SECRET\" 2>/dev/null)\nelse\n  # HTTP fallback\n  CONTROLLER=$(grep '^external-controller:' \"/Users/lifcc/Library/Application Support/io.github.clash-verge-rev.clash-verge-rev/clash-verge.yaml\" 2>/dev/null | awk '{print $2}' | tr -d \"'\\\"\")\n  [ -z \"$CONTROLLER\" ] && CONTROLLER=\"127.0.0.1:9090\"\n  CONNECTIONS=$(curl -s \"http://$CONTROLLER/connections\" -H \"Authorization: Bearer $SECRET\" 2>/dev/null)\nfi\n```\n\n### 第三步：解析并展示线路\n\n用 Python 解析 JSON，按进程分组显示：\n\n```python\nimport json, sys\n\ndata = json.loads(sys.stdin.read())\nconnections = data.get(\"connections\", [])\n\n# 过滤进程名（如果指定了参数）\nprocess_filter = \"参数中的进程名\" # 从 $ARGUMENTS 获取\n\nresults = []\nfor conn in connections:\n  meta = conn.get(\"metadata\", {})\n  process = meta.get(\"process\", \"unknown\")\n  host = meta.get(\"host\", \"\") or meta.get(\"destinationIP\", \"\")\n  port = meta.get(\"destinationPort\", \"\")\n  rule = conn.get(\"rule\", \"\") + (\"/\" + conn.get(\"rulePayload\", \"\") if conn.get(\"rulePayload\") else \"\")\n  chains = conn.get(\"chains\", [])\n  network = meta.get(\"network\", \"\")\n\n  if process_filter and process_filter.lower() not in process.lower():\n    continue\n\n  results.append({\n    \"process\": process,\n    \"host\": f\"{host}:{port}\" if port else host,\n    \"rule\": rule,\n    \"chains\": \" → \".join(reversed(chains)) if chains else \"DIRECT\",\n    \"network\": network.upper(),\n  })\n\n# 按进程分组\nfrom collections import defaultdict\ngrouped = defaultdict(list)\nfor r in results:\n  grouped[r[\"process\"]].append(r)\n\nfor process, conns in sorted(grouped.items()):\n  print(f\"\\n{'='*60}\")\n  print(f\"进程: {process} ({len(conns)} 个连接)\")\n  print(f\"{'='*60}\")\n\n  # 按链路去重统计\n  chain_stats = defaultdict(lambda: {\"count\": 0, \"hosts\": set()})\n  for c in conns:\n    key = f\"{c['rule']} → {c['chains']}\"\n    chain_stats[key][\"count\"] += 1\n    chain_stats[key][\"hosts\"].add(c[\"host\"])\n\n  for route, info in sorted(chain_stats.items(), key=lambda x: -x[1][\"count\"]):\n    print(f\"  线路: {route}\")\n    print(f\"  连接数: {info['count']}\")\n    hosts = sorted(info[\"hosts\"])\n    if len(hosts) <= 5:\n      print(f\"  目标: {', '.join(hosts)}\")\n    else:\n      print(f\"  目标: {', '.join(hosts[:5])} ... (+{len(hosts)-5})\")\n    print()\n```\n\n### 完整的一键执行命令\n\n将上面的步骤组合成一个完整的 bash 命令执行：\n\n```bash\nSECRET=$(grep '^secret:' \"/Users/lifcc/Library/Application Support/io.github.clash-verge-rev.clash-verge-rev/clash-verge.yaml\" 2>/dev/null | awk '{print $2}')\nSOCKET=\"/var/tmp/verge/verge-mihomo.sock\"\nFILTER=\"$ARGUMENTS\"\n\nif [ -S \"$SOCKET\" ]; then\n  DATA=$(curl -s --unix-socket \"$SOCKET\" \"http://localhost/connections\" -H \"Authorization: Bearer $SECRET\" 2>/dev/null)\nelse\n  CONTROLLER=$(grep '^external-controller:' \"/Users/lifcc/Library/Application Support/io.github.clash-verge-rev.clash-verge-rev/clash-verge.yaml\" 2>/dev/null | awk '{print $2}' | tr -d \"'\\\"\")\n  [ -z \"$CONTROLLER\" ] && CONTROLLER=\"127.0.0.1:9090\"\n  DATA=$(curl -s \"http://$CONTROLLER/connections\" -H \"Authorization: Bearer $SECRET\" 2>/dev/null)\nfi\n\nif [ -z \"$DATA\" ] || echo \"$DATA\" | python3 -c \"import sys,json; json.load(sys.stdin)\" 2>/dev/null; [ $? -ne 0 ]; then\n  # 验证 JSON 有效性\n  :\nfi\n\necho \"$DATA\" | python3 -c \"\nimport json, sys\nfrom collections import defaultdict\n\ndata = json.loads(sys.stdin.read())\nconns = data.get('connections', [])\nfilt = '$FILTER'.strip().lower()\n\nresults = []\nfor c in conns:\n    m = c.get('metadata', {})\n    proc = m.get('process', 'unknown')\n    if filt and filt not in proc.lower():\n        continue\n    host = m.get('host', '') or m.get('destinationIP', '')\n    port = m.get('destinationPort', '')\n    rule = c.get('rule', '')\n    rp = c.get('rulePayload', '')\n    if rp:\n        rule += '/' + rp\n    chains = c.get('chains', [])\n    chain_str = ' → '.join(reversed(chains)) if chains else 'DIRECT'\n    results.append({'process': proc, 'host': f'{host}:{port}' if port else host, 'rule': rule, 'chains': chain_str})\n\ngrouped = defaultdict(list)\nfor r in results:\n    grouped[r['process']].append(r)\n\nif not grouped:\n    target = filt if filt else '任何进程'\n    print(f'未找到 {target} 的活跃连接')\n    sys.exit(0)\n\ntotal = sum(len(v) for v in grouped.values())\nprint(f'共 {total} 个活跃连接，涉及 {len(grouped)} 个进程')\n\nfor proc, pconns in sorted(grouped.items()):\n    print(f'\\n{\\\"=\\\"*60}')\n    print(f'进程: {proc} ({len(pconns)} 个连接)')\n    print(f'{\\\"=\\\"*60}')\n    chain_stats = defaultdict(lambda: {'count': 0, 'hosts': set()})\n    for c in pconns:\n        key = f'{c[\\\"rule\\\"]} → {c[\\\"chains\\\"]}'\n        chain_stats[key]['count'] += 1\n        chain_stats[key]['hosts'].add(c['host'])\n    for route, info in sorted(chain_stats.items(), key=lambda x: -x[1]['count']):\n        print(f'  线路: {route}')\n        print(f'  连接数: {info[\\\"count\\\"]}')\n        hosts = sorted(info['hosts'])\n        if len(hosts) <= 5:\n            print(f'  目标: {\\\", \\\".join(hosts)}')\n        else:\n            print(f'  目标: {\\\", \\\".join(hosts[:5])} ... (+{len(hosts)-5})')\n        print()\n\"\n```\n\n## 输出格式\n\n按进程分组，每个进程显示：\n- **线路**：匹配规则 → 代理链路（如 `ProcessName/claude → 🤖 AI → 🇯🇵 日本 东京`）\n- **连接数**：该线路上的活跃连接数量\n- **目标**：连接的目标域名/IP\n\n## 使用示例\n\n- `/clash-routes` - 查看所有进程的线路\n- `/clash-routes claude` - 只看 claude 进程\n- `/clash-routes chrome` - 只看 chrome 进程\n- `/clash-routes telegram` - 只看 telegram 进程\n\n## 注意事项\n\n- 只读操作，不修改任何配置\n- 需要 Clash Verge Rev 或 mihomo 正在运行\n- 通过 Unix socket 访问比 HTTP 更可靠（不受 external-controller 配置影响）\n- 用中文输出所有信息","tags":["clash","routes","claude","arsenal","majiayu000","agent-skills","ai-agents","ai-coding-assistant","automation","claude-code","code-review","developer-tools"],"capabilities":["skill","source-majiayu000","skill-clash-routes","topic-agent-skills","topic-ai-agents","topic-ai-coding-assistant","topic-automation","topic-claude","topic-claude-code","topic-code-review","topic-developer-tools","topic-devops","topic-productivity","topic-prompt-engineering","topic-python"],"categories":["claude-arsenal"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/majiayu000/claude-arsenal/clash-routes","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add majiayu000/claude-arsenal","source_repo":"https://github.com/majiayu000/claude-arsenal","install_from":"skills.sh"}},"qualityScore":"0.464","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 29 github stars · SKILL.md body (6,021 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-01T07:01:12.711Z","embedding":null,"createdAt":"2026-04-18T22:24:02.371Z","updatedAt":"2026-05-01T07:01:12.711Z","lastSeenAt":"2026-05-01T07:01:12.711Z","tsv":"'-5':335,652 '/clash-routes':671,673,678,683 '/dev/null':44,55,97,109,129,348,373,383,403,418 '/ip':669 '/users/lifcc/.config/clash/config.yaml':53 '/users/lifcc/library/application':41,106,345,380 '/var/tmp/verge/verge-mihomo.sock':79,353 '0':267,420,541,584 '1':284,302,601,619 '127.0.0.1':118,392 '2':43,47,54,58,96,108,112,128,347,351,372,382,386,402,417 '5':320,332,637,649 '60':250,260,568,578 '9090':119,393 'add':289,606 'ai':662 'api':7,29,35 'append':239,524 'argument':21,154,355 'author':93,125,369,399 'awk':45,56,110,349,384 'bash':37,71,339,341 'bearer':94,126,370,400 'c':271,276,278,290,411,429,449,588,593,595,607 'c.get':453,477,480,487 'chain':186,188,214,217,219,262,279,280,285,486,488,489,493,495,511,512,579,596,597,602 'chain_stats.items':297,614 'chrome':13,679,681 'clash':2,15,32,75,692 'clash-rout':1 'claud':12,674,676 'collect':226,434 'conn':158,243,256,273,440,451 'conn.get':162,178,180,183,187 'connect':84,120,145,147,160,442 'continu':200,466 'control':101,105,116,117,375,379,390,391,707 'controller/connections':123,397 'count':266,283,303,312,583,600,620,629 'curl':85,121,361,395 'd':114,388 'data':142,360,394,407,409,427,437 'data.get':146,441 'defaultdict':228,230,264,436,515,581 'destinationip':173,472 'destinationport':176,475 'direct':221,497 'echo':59,408,426 'els':98,185,210,220,326,374,496,507,533,643 'extern':104,378,706 'external-control':103,377,705 'f':205,248,252,259,275,305,309,322,328,502,536,551,566,570,577,592,622,626,639,645 'fallback':68,100 'fi':130,404,425 'filt':443,460,462,530,532 'filter':151,194,354,444 'grep':39,51,102,343,376 'group':229,236,514,521,528,557 'grouped.items':246,564 'grouped.values':549 'h':92,124,368,398 'host':168,170,204,206,211,268,288,291,313,316,319,325,331,334,467,469,501,503,508,585,605,608,630,633,636,642,648,651 'http':70,99,702 'import':139,227,412,430,435 'info':294,311,315,611,628,632 'join':215,324,330,491,641,647 'json':136,140,414,423,431 'json.load':415 'json.loads':143,438 'key':274,282,287,298,591,599,604,615 'lambda':265,299,582,616 'len':255,318,333,544,556,573,635,650 'list':231,516 'localhost/connections':91,367 'lower':446 'm':452 'm.get':456,468,471,474 'meta':161 'meta.get':165,169,172,175,190 'metadata':163,454 'mihomo':6,28,696 'n':249,567 'ne':419 'network':189,191,222 'network.upper':223 'pconn':561,574,590 'port':174,207,209,473,504,506 'print':46,57,111,247,251,258,304,308,321,327,336,350,385,535,550,565,569,576,621,625,638,644,653 'proc':455,500,560,572 'proc.lower':465 'process':150,164,166,193,202,203,238,242,254,457,499,523 'process.lower':199 'process_filter.lower':196 'processname/claude':661 'python':134,138 'python3':410,428 'r':233,237,240,518,522,525 'result':156,235,447,520 'results.append':201,498 'rev':77,694 'revers':216,492 'rout':3,293,307,610,624 'rp':479,483,485 'rule':177,179,212,213,277,476,478,484,509,510,594 'rulepayload':181,184,481 'secret':36,38,40,49,50,52,60,61,95,127,342,344,371,401 'set':269,586 'skill' 'skill-clash-routes' 'socket':67,73,78,82,89,90,352,358,365,366,700 'sort':245,296,314,563,613,631 'source-majiayu000' 'stat':263,281,286,580,598,603 'str':490,513 'strip':445 'sum':543 'support/io.github.clash-verge-rev.clash-verge-rev/clash-verge.yaml':42,107,346,381 'sys':141,413,432 'sys.exit':540 'sys.stdin':416 'sys.stdin.read':144,439 'target':529,538 'telegram':684,686 'topic-agent-skills' 'topic-ai-agents' 'topic-ai-coding-assistant' 'topic-automation' 'topic-claude' 'topic-claude-code' 'topic-code-review' 'topic-developer-tools' 'topic-devops' 'topic-productivity' 'topic-prompt-engineering' 'topic-python' 'total':542,553 'tr':113,387 'unix':66,72,88,364,699 'unix-socket':87,363 'unknown':167,458 'v':545,547 'verg':33,76,693 'x':300,301,617,618 'z':48,115,389,406 '不修改任何配置':690 '不受':704 '东京':664 '个活跃连接':554 '个进程':558 '个连接':257,575 '从':153 '代理链':19 '代理链路':659 '任何进程':534 '优先使用':65 '使用示例':670 '共':552 '凭证':30 '到':69 '匹配规则':658 '参数中的进程名':152 '只看':675,680,685 '只读操作':689 '命令执行':340 '如':11,660 '如果指定了参数':149 '如果用户没有传入参数':22 '完整的一键执行命令':337 '将上面的步骤组合成一个完整的':338 '或':695 '执行流程':25 '按进程分组':24,224,655 '按进程分组显示':137 '按链路去重统计':261 '方式':74 '日本':663 '显示所有活跃连接':23 '显示进程匹配的规则和代理链路':9 '更可靠':703 '有效性':424 '未找到':62,537 '查看当前活跃连接的代理线路信息':17 '查看所有进程的线路':672 '查看指定进程的代理线路':4 '查询当前活跃连接':8 '查询连接信息':64 '正在运行':697 '每个进程显示':656 '注意事项':688 '涉及':555 '用':133 '用中文输出所有信息':709 '用于确认某个进程':10 '用户传入的参数':20 '的活跃连接':539 '目标':323,329,640,646,667 '确认指定进程走的是哪条订阅':18 '第一步':26 '第三步':131 '第二步':63 '线路':306,623,657 '线路查看工具':16 '获取':27,155 '解析':135 '解析并展示线路':132 '访问比':701 '该线路上的活跃连接数量':666 '读取':31 '走的是哪条订阅线路':14 '输出格式':654 '过滤进程名':148 '进程':253,571,677,682,687 '连接数':310,627,665 '连接的目标域名':668 '通过':5,698 '配置影响':708 '配置获取':34 '需要':691 '验证':422","prices":[{"id":"e264af17-0616-4a12-bc5a-3ba8c36db239","listingId":"09694194-6e7c-445e-b250-f7d27598be46","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"majiayu000","category":"claude-arsenal","install_from":"skills.sh"},"createdAt":"2026-04-18T22:24:02.371Z"}],"sources":[{"listingId":"09694194-6e7c-445e-b250-f7d27598be46","source":"github","sourceId":"majiayu000/claude-arsenal/clash-routes","sourceUrl":"https://github.com/majiayu000/claude-arsenal/tree/main/skills/clash-routes","isPrimary":false,"firstSeenAt":"2026-04-18T22:24:02.371Z","lastSeenAt":"2026-05-01T07:01:12.711Z"}],"details":{"listingId":"09694194-6e7c-445e-b250-f7d27598be46","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"majiayu000","slug":"clash-routes","github":{"repo":"majiayu000/claude-arsenal","stars":29,"topics":["agent-skills","ai-agents","ai-coding-assistant","automation","claude","claude-code","code-review","developer-tools","devops","productivity","prompt-engineering","python","software-development","typescript","workflows"],"license":"mit","html_url":"https://github.com/majiayu000/claude-arsenal","pushed_at":"2026-04-29T04:12:22Z","description":"52 production-ready Claude Code skills and 7 specialized agents for software development, DevOps, product workflows, and automation.","skill_md_sha":"42cfa737e3fcfa71043023a8d1078ea8282c4ba3","skill_md_path":"skills/clash-routes/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/majiayu000/claude-arsenal/tree/main/skills/clash-routes"},"layout":"multi","source":"github","category":"claude-arsenal","frontmatter":{"name":"clash-routes","description":"查看指定进程的代理线路。通过 Mihomo API 查询当前活跃连接，显示进程匹配的规则和代理链路。用于确认某个进程（如 claude、chrome）走的是哪条订阅线路"},"skills_sh_url":"https://skills.sh/majiayu000/claude-arsenal/clash-routes"},"updatedAt":"2026-05-01T07:01:12.711Z"}}