chore: reorganize repository layout and optimize README

This commit is contained in:
袁震
2026-04-06 14:43:19 +08:00
parent a48cd45dbd
commit 5572828d15
9 changed files with 139 additions and 153 deletions
+109 -123
View File
@@ -1,135 +1,28 @@
# shunt-rules
基于 **Surge 单源** 的规则生成器
基于 **Surge 单源** 的规则生成器,统一输出 `Surge / Loon / Clash / Mihomo` 四种格式。
1. 同步上游 `ios_rule_script``rule/Surge` 到本地缓存
2. 本地按分类做合并去重
3. 统一生成多端兼容规则
## 目标
当前输出目录:
- `dist/surge/<Name>.list`
- `dist/loon/<Name>.list`
- `dist/clash/<Name>.yaml`
- `dist/mihomo/<Name>.yaml`
## 设计原则
- 上游只用 `Surge` 源,不直接拉 `Clash`
- `Clash`/`Mihomo` 均由 Surge 规则转换生成
- 本地先合并再转换,避免依赖远端即时拼接
## 运行环境
- Python 3.11+(推荐,支持 TOML 配置)
- Python 3.10(可用 JSON 配置)
## 快速开始
```bash
cd /Users/yuan/Desktop/workspaces/docker/pve/shunt-rules
```
1. 同步上游 Surge 全量源到本地缓存:
```bash
bash scripts/sync_surge_full.sh
```
2. 生成全部分类规则:
```bash
python3 main.py --config config.json
```
3. 只生成指定分类:
```bash
python3 main.py --config config.json --names Apple,YouTube
```
## 配置说明
默认配置文件:`config.json`(已启用本地源模式)。
### `source` 关键字段
- `mode`
- `local`:从本地缓存读取(推荐)
- `gitea`:从 Gitea API 直接读取
- `local_root`:本地缓存根目录(默认 `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. `<Name>.list`
2. `<Name>_Domain.list`
3. `<Name>_Resolve.list`
如果某分类不完整,会自动回退到:
- `<Name>_All.list`
- `<Name>_Domain.list`
- `<Name>_Resolve.list`
- `<Name>.list`
另外,`*_Domain.list` 中无前缀的裸域名会自动规范化为 `DOMAIN-SUFFIX,<domain>`
## 多端转换策略
- `surge`:保留合并后的 Surge 规则
- `loon`:与 Surge 规则兼容输出
- `clash`YAML provider 输出,类型适配:
- 跳过:`USER-AGENT``URL-REGEX`
- 映射:`DEST-PORT -> DST-PORT`
- `mihomo`YAML provider 输出,规则与 Clash 同步适配
## 自动化
### 1) 全仓库自动管理(推荐)
文件:`.gitea/workflows/repo-manage-daily.yml`
- 触发:每天一次(`cron: 5 2 * * *`UTC+ 手动触发
- 流程:
1. 同步上游 Surge 源
2. 生成 `dist/` 规则
3. 自动提交并推送当前仓库变更
需要配置:
- `vars.UPSTREAM_REF`(可选,默认 `master`
### 2) 手动生成工作流(备用)
文件:`.gitea/workflows/generate-rules.yml`
- 触发:手动触发
- 流程:同步上游并生成规则(不自动发布)
- 上游仅使用 `ios_rule_script``rule/Surge`
- 本地先合并与去重,再做多端格式转换
- 输出规则可直接用于常见代理客户端
## 目录结构
```text
shunt-rules/
├── main.py
├── config.json
├── config.example.toml
├── config.example.json
├── scripts/
── sync_surge_full.sh
├── upstream/ # 本地上游缓存(自动生成,默认忽略)
└── rule/Surge/...
├── src/
│ └── rulegen.py # 主程序入口
├── tools/
│ └── sync_surge_full.sh # 同步上游 Surge 源到本地缓存
├── configs/
── config.json # 默认配置(本地缓存模式)
│ └── examples/
├── config.example.json
│ └── config.example.toml
├── data/
│ └── upstream/ # 本地上游缓存(自动生成,默认忽略)
├── dist/
│ ├── surge/
│ ├── loon/
@@ -139,3 +32,96 @@ shunt-rules/
├── 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/<Name>.list`
- `dist/loon/<Name>.list`
- `dist/clash/<Name>.yaml`
- `dist/mihomo/<Name>.yaml`
## 配置说明
默认配置:`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. `<Name>.list`
2. `<Name>_Domain.list`
3. `<Name>_Resolve.list`
若上述文件不存在,会自动回退到:
1. `<Name>_All.list`
2. `<Name>_Domain.list`
3. `<Name>_Resolve.list`
4. `<Name>.list`
另外,`*_Domain.list` 中的裸域名会自动规范化为 `DOMAIN-SUFFIX,<domain>`
## 多端转换策略
- `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`