ao gong 112374e2a1
CI / lite (push) Successful in 3s
test(gen-script): lock in to_rule() inline-# handling with regression tests
新增 2 个 test method 覆盖 b4a4769 修复的边界 case:
- test_to_rule_strips_inline_hash_comment_before_classifying_no_resolve
  锁定带 inline # 注释的条目(本次修复的真实场景)
  + 验证注释里出现 'no-resolve' / ',DIRECT' 字符串不被误处理
- test_to_rule_preserves_canonical_forms
  锁定 happy path(纯规则、带 no-resolve、带行尾空白)

为让 test_checked_in_router_projections_match_the_rule_source 通过,
同步重生成 router/direct-plain.txt 和 router/direct-rules.yaml。
这俩投影文件自 907fe9d 起就 stale 14+ 条规则(国内 LLM、UGREEN、
Steam 段全没同步),本次连同 b4a4769 的修复一起补齐。

测试结果:python3 -m unittest discover -s tests
  Ran 9 tests in 0.028s — OK
2026-09-05 13:40:50 +08:00

vpn-rules

「哪些连接必须直连、绝不进代理」的规则真源(single source of truth),供电脑端 Clash Verge 和华硕路由器上的 mihomo(Magic Catling2)等消费端同步引用,一处维护、处处生效。

目录结构

vpn-rules/
├── direct.yaml                     # 规则真源(mihomo rule-provider 格式)
├── router/
│   ├── direct-rules.yaml           # 路由器手动粘贴版(`- ` 前缀 + DIRECT 策略)
│   └── direct-plain.txt            # 无 `- ` 前缀纯文本版(规则逐行、无策略)
└── scripts/
    ├── gen_clash_verge_script.py   # 真源 → Clash Verge Script.js 生成器
    ├── gen_router_paste.py         # 真源 → 路由器手动粘贴版生成器
    └── gen_plain_list.py           # 真源 → 纯文本版生成器

为什么需要它

  • 香港代理节点有流量配额(如 BygCloud 100GiB 用满),国内站点/内网流量被隧道进代理会白白烧配额。
  • 必须直连的对象:Windows OneDrive 客户端、FRP 控制面(mTLS)、B 站全系、DeepSeek/MiniMax 等国内 LLM API、 内网/私有 IP 段、国区 iCloud、UGREEN 绿联 NAS 云。
  • 踩坑:Clash Verge 全局 Merge.yaml 的 prepend-rules 会被内核忽略(不生效), 全局直连规则的唯一正确机制是 profiles/Script.js(main(config) 把规则 prepend 进 config.rules)。

消费端接入

Clash Verge(Windows / macOS)

# 按当前平台生成并写入 Clash Verge 数据目录的全局 Script.js
python3 scripts/gen_clash_verge_script.py
# 然后在 Clash Verge 界面点「重启内核」生效

对当前及以后新增/切换的所有订阅生效;订阅更新不会覆盖它。 脚本还会把国内可达的阿里 DNS 和腾讯 DNS DoH 端点补入 dns.fallback,避免境外域名 命中 DIRECT 后因供应商的境外 DNS fallback 不可达而解析失败。 Windows 默认写入 %APPDATA%\io.github.clash-verge-rev.clash-verge-rev\profiles\Script.js; macOS 默认写入 ~/Library/Application Support/io.github.clash-verge-rev.clash-verge-rev/profiles/Script.js。

路由器 mihomo(Magic Catling2 / OpenWrt)

rule-provider 引用(policy 在外层指定),定期自动拉取真源:

rule-providers:
  vpn-direct:
    type: http
    behavior: classical
    url: https://gitea.puyuanfh.cn/ageorge156/vpn-rules/raw/branch/main/direct.yaml
    interval: 86400
    path: ./ruleset/vpn-direct.yaml

rules:
  - RULE-SET,vpn-direct,DIRECT

路由器内网自建 Gitea(192.168.50.2:3000)也可直连:http://192.168.50.2:3000/ageorge156/vpn-rules/raw/branch/main/direct.yaml。

拉不到 URL 时(手动粘贴版):打开 router/direct-rules.yaml,把里面的规则行粘贴到路由器现有规则列表最前面即可,无需联网(生成命令 python3 scripts/gen_router_paste.py)。若工具不支持 - 前缀,用 router/direct-plain.txt(生成命令 python3 scripts/gen_plain_list.py)。

维护流程

  1. 改 direct.yaml(rule-provider 条目,不含策略字段)。
  2. git commit + push 到本仓库 main。
  3. Clash Verge 端重跑 python3 scripts/gen_clash_verge_script.py + 重启内核; 路由器端等 rule-provider 到期自动拉新或手动 reload。
S
Description
No description provided
Readme
86 KiB
Languages
Python 100%