# shunt-rules 基于 **Surge 单源** 的规则生成器,统一输出 `Surge / Loon / Clash / Mihomo` 四种格式。 ## 目标 - 上游仅使用 `ios_rule_script` 的 `rule/Surge` - 本地先合并与去重,再做多端格式转换 - 输出规则可直接用于常见代理客户端 ## 目录结构 ```text shunt-rules/ ├── src/ │ └── rulegen.py # 主程序入口 ├── tools/ │ └── sync_surge_full.sh # 同步上游 Surge 源到本地缓存 ├── configs/ │ ├── config.json # 默认配置(本地缓存模式) │ └── examples/ │ ├── config.example.json │ └── config.example.toml ├── data/ │ └── upstream/ # 本地上游缓存(自动生成,默认忽略) ├── dist/ │ ├── surge/ │ ├── loon/ │ ├── clash/ │ └── mihomo/ └── .gitea/workflows/ ├── repo-manage-daily.yml └── generate-rules.yml ``` ## 运行环境 - Python 3.11+(推荐,支持 TOML 配置) - Python 3.10(可用 JSON 配置) ## 快速开始 在仓库根目录执行: 1. 同步上游 Surge 源到本地缓存 ```bash bash tools/sync_surge_full.sh ``` 2. 生成全部分类规则 ```bash python3 src/rulegen.py --config configs/config.json ``` 3. 只生成指定分类 ```bash python3 src/rulegen.py --config configs/config.json --names Apple,YouTube ``` ## 输出路径 - `dist/surge/.list` - `dist/loon/.list` - `dist/clash/.yaml` - `dist/mihomo/.yaml` ## 快捷方式 - 规则说明:`dist/README.md` - Surge 目录:`dist/surge/` - Loon 目录:`dist/loon/` - Clash 目录:`dist/clash/` - Mihomo 目录:`dist/mihomo/` ## 配置说明 默认配置:`configs/config.json` `source` 关键字段: - `mode`:数据源模式,支持 `local`(本地缓存,推荐)和 `gitea`(通过 Gitea API) - `local_root`:本地缓存根目录(默认 `data/upstream`) - `root`:规则目录(默认 `rule/Surge`) - `filename_pattern`:分类主文件模板(默认 `{name}.list`) - `include_categories`:仅生成白名单分类 - `exclude_categories`:排除分类 `output` 关键字段: - `dir`:输出目录(默认 `dist`) - `clash_no_resolve`:Clash 的 `IP-CIDR/IP-CIDR6` 是否追加 `no-resolve` - `mihomo_no_resolve`:Mihomo 的 `IP-CIDR/IP-CIDR6` 是否追加 `no-resolve` ## 本地合并规则 每个分类优先按以下顺序合并去重: 1. `.list` 2. `_Domain.list` 3. `_Resolve.list` 若上述文件不存在,会自动回退到: 1. `_All.list` 2. `_Domain.list` 3. `_Resolve.list` 4. `.list` 另外,`*_Domain.list` 中的裸域名会自动规范化为 `DOMAIN-SUFFIX,`。 ## 多端转换策略 - `surge`:保留合并后的 Surge 规则 - `loon`:与 Surge 规则兼容输出 - `clash`:YAML provider 输出(跳过 `USER-AGENT`、`URL-REGEX`,并将 `DEST-PORT` 转为 `DST-PORT`) - `mihomo`:YAML provider 输出,转换策略与 Clash 一致 ## 自动化工作流 `repo-manage-daily.yml`: - 每天自动执行(UTC `5 2 * * *`)或手动触发 - 执行同步、生成规则、自动提交推送 `generate-rules.yml`: - 手动触发 - 执行同步与生成,不自动发布 可选变量: - `vars.UPSTREAM_REF`(默认 `master`)