lov-clash-tun-doctor
诊断并可回滚地修复 Clash Verge Rev TUN 导致的应用联网故障:微信图片发不出、朋友圈加载慢、开 TUN 后卡住、规则误走 DIRECT/代理、代理超时、IPv6 失效。 Use when the user mentions "Clash TUN 排障", "微信图片发不出去", "diagnose Clash TUN app connectivity".
Informações da origem
- Repositório
- lovstudio/clash-tun-doctor-skill
- Última atividade na origem
- 31 de outubro de 2026 às 08:49
- Idioma detectado do SKILL.md
- inglês
- Estrelas
- 1
- Forks
- 0
Opções de instalação
Por padrão, está selecionado o prompt que primeiro revisa a origem. Você pode mudar para um comando direto ou baixar uma cópia local.
Revise os arquivos de origem
Leia o SKILL.md e os arquivos complementares exibidos pelo SkillsMP antes de decidir se vai instalar.
Exibindo SKILL.md
SKILL.md
Instruções da origem · Visualização somente leitura- name
- lov-clash-tun-doctor
- description
- 诊断并可回滚地修复 Clash Verge Rev TUN 导致的应用联网故障:微信图片发不出、朋友圈加载慢、开 TUN 后卡住、规则误走 DIRECT/代理、代理超时、IPv6 失效。 Use when the user mentions "Clash TUN 排障", "微信图片发不出去", "diagnose Clash TUN app connectivity".
- license
- MIT
- compatibility
- Requires macOS with Clash Verge Rev (Mihomo core in sidecar or service mode) and Python 3.8+ standard library. Other platforms need explicit --data-dir and --socket values.
- metadata
- {"author":"contributors","version":"0.6.2","tags":["clash","mihomo","tun","network","diagnostics","wechat","macos"]}
# Clash 网络医生 · Clash Network Doctor
Evidence-first diagnosis and reversible repair for application networking
failures behind Clash Verge Rev TUN mode.
## Triggers
### Activate when
- “微信图片发不出去”“朋友圈图片加载慢”“修复微信 TUN 网络”“Clash TUN 排障”
- "Help me diagnose Clash TUN app connectivity: the app works without TUN but
hangs with it."
- An application works without TUN but fails, stalls, or loses media with TUN.
- WeChat text works while image uploads or Moments images fail.
- A rule change makes the symptom worse or the app remains stuck on Loading.
- The subscription says `ipv6: false`, but runtime traffic still uses IPv6.
- Clash logs contain `no route to host`, `context deadline exceeded`, or an
unexpected rule/strategy for the affected process.
- A blocked site such as `chatgpt.com` fails through one proxy node while other
sites work through the same node.
### Do not activate when
- Generic subscription acquisition, node purchasing, or bypassing
organizational network policy.
- Chaining an IPRoyal static residential exit behind RayLink: use
`lov-iproyal-raylink`.
- A website URL blocked inside WeChat (a weixin110 appeal): that is a Tencent
policy decision, not TUN routing.
## Skill Group Composition
Read `references/skill-composition.md` before routing to or extending an
adjacent Skill.
## Workflow (MANDATORY)
### Step 0: Resolve the skill and Clash data directories
Resolve `SKILL_DIR` from the installed skill context. For manual execution:
```bash
export SKILL_DIR="/path/to/lov-clash-tun-doctor"
```
The CLI resolves the Clash Verge Rev data directory in this order:
1. `--data-dir`
2. `SKILL_CLASH_TUN_DOCTOR_DATA_DIR`
3. macOS Clash Verge Rev default under `~/Library/Application Support/`
Never hard-code a user's home directory.
### Step 1: Diagnose before proposing a rule
Run the read-only command first:
```bash
python3 "$SKILL_DIR/scripts/clash_tun_doctor.py" diagnose --app wechat
```
Report concrete evidence from all available layers:
- App-level `config.yaml` overrides.
- Generated `clash-verge.yaml` top-level and DNS IPv6 values.
- Runtime `/configs`, `/rules`, and `/connections` through Mihomo's Unix socket.
- Recent core-log failures for the target application.
Core logs follow the running mode. In owner-scoped service mode (socket under
`clash-verge-service/users/<uid>/`) Mihomo writes to
`/Library/Application Support/clash-verge-service/users/<uid>/logs/service_latest.log`
(`/var/lib/clash-verge-service/...` on Linux), which is root-only; data-dir logs
then belong to an earlier mode and are ignored. Otherwise the newest of
`<data-dir>/logs/sidecar`, `<data-dir>/service-logs/service`, and
`<data-dir>/logs/service` is used. When no log is readable, diagnosis prints
`Recent logs: UNAVAILABLE` with every location and reason (JSON counts are
`null`); never read that as "no errors". Collect log evidence instead with:
```bash
python3 "$SKILL_DIR/scripts/clash_tun_doctor.py" diagnose --app wechat --live-logs 15
```
Reproduce the failure during the window: `--live-logs` samples Mihomo's live
`/logs` stream through the controller socket and needs no root.
The runtime socket is auto-detected in this order, and the first one whose
controller answers wins:
1. `--socket`, when given (no fallback).
2. `-ext-ctl-unix` of the running Mihomo core process.
3. `external-controller-unix` in the generated `clash-verge.yaml`.
4. Service mode: `/var/run/clash-verge-service/users/<uid>/verge-mihomo.sock`.
5. Sidecar default `/tmp/verge/verge-mihomo.sock`, then `<data-dir>/mihomo.sock`.
`diagnose` and `direct-list` exit non-zero and list every candidate with its
failure reason when none answers. Never report runtime IPv6, rules, or
connections as healthy without a reachable socket.
Treat screenshots and runtime state as truth. A rule saying `DIRECT` does not
prove the connection succeeded.
### Step 2: Choose the narrowest repair
Use `references/troubleshooting.md` to map evidence to a repair. For the proven
WeChat pattern, use the built-in repair:
```bash
python3 "$SKILL_DIR/scripts/clash_tun_doctor.py" fix-wechat
```
This is a dry run. It previews:
- Direct rules for the WeChat processes and media domains.
- Disabling the app-level IPv6 override that can supersede subscription and
extension settings.
- The exact files that would be backed up and changed.
Do not route the whole application through a proxy merely because direct media
failed. First check proxy health and IPv6 errors; a proxy timeout can turn one
failed image into a fully stuck application.
For a browser site or application with multiple dependency hosts, generate one
evidence-backed DIRECT list instead of adding domains one by one:
```bash
python3 "$SKILL_DIR/scripts/clash_tun_doctor.py" direct-list \
--app miracleplus \
--host apply.miracleplus.com \
--output ./miracleplus-direct.yaml
```
The command reads active connections and recent rotated service logs, deduplicates
hostnames, and includes only:
- Hosts explicitly supplied with `--host`.
- Hosts previously observed through a non-DIRECT route.
- Hosts already maintained as explicit DIRECT rules.
Hosts observed only through a healthy DIRECT route are reported as ignored
instead of bloating the explicit list.
### Step 3: Apply only with user authorization
For a DIRECT list, preview first, then persist and hot-load it:
```bash
python3 "$SKILL_DIR/scripts/clash_tun_doctor.py" direct-list \
--app miracleplus \
--host apply.miracleplus.com \
--apply
```
This path must merge with existing `prepend` rules, create a timestamped backup,
update the generated config, hot-load Mihomo through its Unix socket, and verify
the runtime. Keep Clash Verge running throughout this rule-only flow.
The hot-load is `PUT /configs?force=true` with a 60-second timeout:
- Owner-scoped service mode (socket under `clash-verge-service/users/<uid>/`)
sends the generated config as `payload`, with `external-controller-unix`
pinned to the live socket. Its core's home is the root-owned `runtime`
directory, so Mihomo refuses every user-writable config path with
`HTTP 400: path is not subpath of home directory or SAFE_PATHS`.
- Other modes load `clash-verge.yaml` by `path`; a path refused for
`SAFE_PATHS` is retried once as a payload.
- Never copy configs into the runtime directory, use `sudo`, or restart the
core to make a path reload work.
If Mihomo refuses or never answers the reload, the command restores the
original files, exits 2, and prints Mihomo's raw error in `reason` and
`reload_attempts[].error`. Quote that error instead of guessing a cause. After
`no HTTP response: timed out` the core may still finish loading the config, so
rerun `diagnose` to read the live rules before retrying.
After an accepted reload, the command re-detects the controller socket in the
Step 1 order, requires every listed host as an exact `DOMAIN -> DIRECT` rule in
`/rules`, and requires every user choice to survive: each Selector's proxy and
each pinned (`fixed` non-empty) URLTest/Fallback group. Unpinned URLTest and
Fallback groups re-pick on every reload and are not compared. Any failure sets
`ok: false` and lists the problem in `verification.issues`; the files stay
saved, so report the backup path and offer `rollback --apply` instead of
claiming success.
Connections opened before the reload keep their old chain until they close.
Judge the new rules only by connections that appear afterwards (`/connections`
ids absent before the reload), or restart the affected application first.
For the specialized WeChat IPv6 repair, run:
```bash
python3 "$SKILL_DIR/scripts/clash_tun_doctor.py" fix-wechat --apply
```
The command must:
1. Stop Clash Verge before editing its generated global settings.
2. Create a timestamped backup and manifest.
3. Set the global IPv6 override to `false`.
4. Prepend persistent WeChat `DIRECT` rules in the current profile's rule file.
5. Restart Clash Verge and verify final/runtime state.
If verification fails, report the backup path and do not claim success.
### Step 4: Restart the affected application and verify the user path
Close stale connections or restart the affected application. Re-run diagnosis:
```bash
python3 "$SKILL_DIR/scripts/clash_tun_doctor.py" diagnose --app wechat --json
```
For the WeChat IPv6 failure, success requires all of the following:
- Runtime `ipv6` is `false`.
- WeChat rules resolve to `DIRECT`.
- New WeChat destinations are IPv4.
- New logs no longer show WeChat `no route to host` errors.
- The user can send an image and load Moments images.
### Step 5: Roll back when needed
```bash
python3 "$SKILL_DIR/scripts/clash_tun_doctor.py" rollback --apply
```
Rollback restores the newest backup by default. Never delete backups
automatically.
## CLI Reference
| Command / option | Default | Description |
|---|---|---|
| `diagnose` | — | Read configuration, runtime state, connections, and logs. |
| `direct-list` | — | Discover, export, or apply an evidence-backed DIRECT host list. |
| `fix-wechat` | dry run | Preview or apply the proven WeChat repair. |
| `rollback` | dry run | Preview or restore the latest repair backup. |
| `--data-dir PATH` | auto | Clash Verge Rev application data directory. |
| `--socket PATH` | auto | Mihomo controller Unix socket; see the detection order in Step 1. |
| `--app NAME` | `wechat` | Application filter used by diagnosis. |
| `--host HOST` | — | Seed an exact host in a DIRECT list; repeatable. |
| `--output PATH` | — | Save a Mihomo classical rule-provider YAML list. |
| `--live-logs SECONDS` | off | Diagnose from Mihomo's live `/logs` stream instead of log files. |
| `--log-limit N` | `4000` | Recent lines inspected in each rotated core log. |
| `--apply` | false | Authorize filesystem changes and restart/restore actions. |
| `--no-reload` | false | Persist a DIRECT list without runtime hot-load. |
| `--no-restart` | false | Apply changes without restarting Clash Verge. |
| `--json` | false | Emit machine-readable diagnosis output. |
## Dependencies
Python 3.8+ standard library only.
## Runtime context (shared)
运行前读取本 Skill 包的 `skill.yaml`,由宿主提供 `skill-runtime/v1` 上下文。字段解析顺序为:当前请求、项目上下文、个人 Preferences、品牌 Profile、通用默认值。
- 只使用 Manifest 声明的字段;Profile 保存公开品牌事实,Preferences 保存个人工作偏好。
- `required: true` 字段缺失时,按 Manifest 的问题配置向用户提出一个聚焦问题;用户明确同意后再保存回答。
- 报错提供可复制的 `context_id`、字段路径与来源,诊断内容避开秘密、完整私人路径和原始配置。
## 通用反馈闭环
用户在 Skill 驱动任务中提出修改意见时,继续当前产物前必须执行:
1. 先判断意见是 `task-specific`(仅本次)还是 `reusable`(可跨任务复用)。
2. `task-specific` 只修改当前任务,不改 Skill。
3. `reusable` 先确定作用域:领域规则先更新对应 canonical Skill;适用于所有 Skill 的规则先更新共享规范。
4. 完成规则更新、版本、lint 与分发核验后,再把修改应用到当前任务。
5. `reusable` 修改会使此前的“确认”“继续”“发吧”失效;完成当前产物修改和回读后必须停下,等待用户下一步指示,不自动进入发布、提交或其他外部写入。
Ver no GitHub