brainstate

Uddoo/mihomo-smart-selector · source

Snapshot 0 · 2026-11-04T12:47:28Z · JavaScript · MIT

Content fingerprintd0783ba2e51fa3676544d56b57483ba4332c32c53533afdef67d74a708b5e1c9

GitHub description at capture

Compare Mihomo / OpenClash nodes by service. Retest candidates, compare with your current node, and review switch outcomes. 按服务复测与对比节点,让切换有依据。

README at capture

<p align="center">
  <img src="docs/assets/branding/social-preview.png" width="1280" alt="Mihomo Smart Selector — 扫描、对比、确认切换。界面预览使用演示数据。" />
</p>
<h1 align="center">Mihomo Smart Selector</h1>
<p align="center"><strong>按服务选节点,让每次切换都有依据。</strong></p>
<p align="center">给现有 Mihomo / OpenClash 加一个节点对比工作台。<br>全量初筛、重点复测、对比当前节点,再由你确认切换。</p>
<p align="center">
  <a href="#quick-start"><strong>下载使用</strong></a> ·
  <a href="#showcase">看看使用流程</a> ·
  <a href="#contributing">参与共创</a> ·
  <a href="README.en.md">English</a>
</p>
<p align="center">
  <a href="https://github.com/Uddoo/mihomo-smart-selector/releases"><img src="https://img.shields.io/github/v/release/Uddoo/mihomo-smart-selector?sort=semver&amp;label=%E7%89%88%E6%9C%AC" alt="最新正式版本" /></a>
  <a href="https://github.com/Uddoo/mihomo-smart-selector/actions/workflows/ci.yml"><img src="https://github.com/Uddoo/mihomo-smart-selector/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI 状态" /></a>
  <a href="https://github.com/Uddoo/mihomo-smart-selector/actions/workflows/codeql.yml"><img src="https://github.com/Uddoo/mihomo-smart-selector/actions/workflows/codeql.yml/badge.svg?branch=main" alt="CodeQL 状态" /></a>
  <a href="LICENSE"><img src="https://img.shields.io/badge/%E8%AE%B8%E5%8F%AF%E8%AF%81-MIT-blue" alt="MIT 许可证" /></a>
</p>
<p align="center">
  <a href="#quick-start"><img src="https://img.shields.io/badge/%E6%A1%8C%E9%9D%A2%E7%89%88-Windows%20%7C%20macOS-0078D4" alt="桌面版:Windows / macOS" /></a>
  <a href="docs/first-contribution.md#中文"><img src="https://img.shields.io/badge/PRs-%E6%AC%A2%E8%BF%8E%E8%B4%A1%E7%8C%AE-brightgreen" alt="欢迎贡献:首次贡献指南" /></a>
</p>

![中文实机工作台:历史扫描结果、节点排名与已过期的候选比较](docs/assets/screenshots/scan-workbench-live-20260911-zh-CN.png)
<p align="center"><sub>2026-09-11 通过 Microsoft Edge 以 1440 × 1000 截取,便于看清文字与控件。当前查看的是 2026-09-09 的扫描记录,保留真实过期提示。<a href="docs/screenshots.zh-CN.md">查看八个页面与展开的扫描筛选。</a></sub></p>
<p align="center"><strong>单文件部署 · 扫描手动选择 · 监控按需自动切换</strong></p>

## 它能帮你做什么?

| 你想知道的 | 工作台提供的依据 |
| --- | --- |
| **这个服务该用哪个节点?** | 选择 ChatGPT、YouTube、GitHub 或自定义探测模板,并保存策略组与服务的绑定。 |
| **这个候选值得切换吗?** | 全量初筛后,复测前 K 名与当前节点;并排查看 P95、成功次数与采样依据。 |
| **刚才的切换成功了吗?** | 手动确认后回读 Controller,展示操作与审计状态;结果未知时可以核对。 |
| **长期运行表现如何?** | 同时看当前健康与历史覆盖率,追踪事件,并按需开启故障自动切换。 |
| **当前网络能访问哪些常用服务?** | 独立的[连通性测试](docs/connectivity.md)页面按地区展示 48 个服务,由浏览器本机采样,支持全部重测与分组刷新。 |

服务与 Mihomo / OpenClash 配合运行。扫描不修改订阅,也不切换正在评估的业务策略组;
可选的严格验证与出口检查使用独立探测组。Controller 密钥始终保留在后端。

<a id="quick-start"></a>
## 下载与使用

<p>
  <a href="https://github.com/Uddoo/mihomo-smart-selector/releases"><img src="https://img.shields.io/github/downloads/Uddoo/mihomo-smart-selector/total?label=%E9%99%84%E4%BB%B6%E4%B8%8B%E8%BD%BD" alt="Release 附件累计下载次数" /></a>
  <sub>累计 Release 附件下载次数,含校验文件。</sub>
</p>

**已经在用 Mihomo / OpenClash / Clash Party?先下载便携包。**
你需要一个正在运行的 Mihomo、它的 HTTP Controller 地址与密钥,以及要比较的 `Selector` 策略组。
桌面便携包 **无需安装 Go 或 Node.js**。

打开 **[最新正式版](https://github.com/Uddoo/mihomo-smart-selector/releases/latest)**,
展开 **Assets**,按设备下载:

| 你的设备 | 选择文件名以此结尾的附件 | 安装说明 |
| --- | --- | --- |
| Windows · Intel / AMD 64 位 | `windows-amd64.zip` | [Windows 指南](docs/windows.md#中文) |
| Windows on ARM | `windows-arm64.zip` | [Windows 指南](docs/windows.md#中文) |
| Mac · Apple Silicon(M 系列) | `darwin-arm64.tar.gz` | [macOS 指南](docs/macos.md#中文) |
| Mac · Intel | `darwin-amd64.tar.gz` | [macOS 指南](docs/macos.md#中文) |
| OpenWrt / iStoreOS 路由器 · Linux | 按设备架构从源码构建 | [构建、预检、安装与回滚](deploy/openwrt/README.md) |

<p>
  <a href="deploy/openwrt/README.md"><img src="https://img.shields.io/badge/%E8%B7%AF%E7%94%B1%E5%99%A8%E9%83%A8%E7%BD%B2-OpenWrt%20%2F%20iStoreOS-00A2DF" alt="OpenWrt / iStoreOS 路由器部署指南" /></a>
  <sub>按设备架构从源码构建。</sub>
</p>

完整文件名还包含版本号。**Source code (zip/tar.gz)** 用于源码开发;Linux 目前走源码构建路径,
桌面便携包不能直接装到路由器。下载时查看该版本的说明与 `SHA256SUMS.txt` 校验文件。

1. **启动:** 将整个压缩包解压到可写目录。Windows 双击 `mihomo-smart-selector.exe`;
   macOS 双击 `start.command`,保持启动终端运行。首次启动会在程序旁创建 `config.yaml`。
2. **连接:** 打开 **[localhost:8788](http://127.0.0.1:8788)** → **偏好设置 → Mihomo 连接**,
   填写 Controller 地址和密钥,测试并保存,再点击 **重启服务 → 确认重启**。
   此操作重载本应用的运行环境。[连接设置说明](docs/connection-settings.md)
3. **比较:** 选择业务策略组与服务模板,运行一次 **稳定模式** 扫描,比较复测候选与当前节点。
   决定切换时确认选择,再到选择历史核对 Controller 回读结果。

**连接提示:** 两个程序在同一台电脑时,Controller 地址可能是 `http://127.0.0.1:9090`,
以客户端实际配置为准;HTTP / SOCKS / mixed 代理端口承担的是代理流量。
连接路由器时,填写运行本服务的设备能够访问的路由器地址。
Clash Party 用户可以在客户端 **内核设置** 中找到 Controller 的监听地址与访问密钥。
[查看已脱敏的 Clash Party 设置截图](docs/assets/screenshots/clash-party-controller-settings-20260911-redacted.png)

当前便携包尚未签名,系统要求、首次启动放行与升级步骤见各平台指南。
本机使用保留默认回环监听;LAN 部署需按文档配置访问 token 与可信 CIDR。

**想先看看?** 浏览[实机截图导览](docs/screenshots.zh-CN.md),或用模拟节点运行
[本地 Mock 演示](#development),无需订阅。

<a id="showcase"></a>
## 从扫描到决定切换

扫描结果支持多级排序视图、测量说明,以及带预览的 CSV / Markdown 导出和复制。
[查看结果使用说明](docs/scan-results.md#中文)。

| 步骤 | 重点看什么 |
| --- | --- |
| **选服务** | 选择 ChatGPT、YouTube、GitHub 或自定义模板,绑定自己的策略组。 |
| **初筛与复测** | 稳定模式先筛选符合条件的节点,再复测前 K 名与当前节点;一起看成功次数、P95 时延和测量时间。 |
| **确认与核对** | 明确选择后,历史记录保留操作意图和 Controller 的已确认、失败或不确定结果;不确定的操作可以继续核对。 |
| **观察长期表现** | 启用监控计划并保持后端服务运行,关闭网页仍会采集历史;查看健康状态、覆盖率与事件,按需开启故障自动切换。 |

<details>
<summary><strong>展开查看监控与选择历史</strong></summary>

![中文持续监控:当前健康、24 小时评分与历史覆盖率](docs/assets/screenshots/monitoring-overview-live-20260911-zh-CN.png)

*2026-09-11 实机截图。覆盖率与成功率衡量不同问题;图中开启的故障自动切换是该部署的设置,产品默认关闭。*

![中文选择历史:已有切换与 Controller 回读确认](docs/assets/screenshots/selection-history-live-20260911-zh-CN.png)

*已有的监控切换记录,截图时没有触发切换。策略组选择已确认,不代表既有连接已经迁移。*

</details>

[浏览全部页面](docs/screenshots.zh-CN.md) · [展开的扫描筛选](docs/screenshots.zh-CN.md#scan-filters) ·
[节点目录与地区推断](docs/region-classification.md)

## 也考虑到了长期使用

- **刷新后接着看:** 页面重载会恢复活动扫描,服务重启后可以查看已中断任务。
- **探测有预算:** 扫描共享全局并发,同组防重复,并限制同时运行的任务数量。
- **历史有边界:** 扫描与审计分别设置保留策略,查看存储占用,并在确认后手动清理。
- **切换有条件:** 检查结果有效期与可选服务条件,先保存操作意图,再回读确认结果。

这些能力由一个 Go 服务、内嵌 Vue 界面和 SQLite 存储提供。普通扫描保持手动选择;持续监控可显式开启故障自动切换。

**持续监控:** 启用监控计划后,本项目后端会定期通过 Mihomo Controller 发起探测,并将结果保存在配置的 SQLite 数据库中。
支持同时监控多个策略组,每组独立配置候选、服务模板、启停状态和故障自动切换;同一节点加入不同任务时,观测历史分别保存。所有任务共享探测预算与存储配额。
无论部署在路由器、Windows 还是 macOS,只要运行本项目的设备保持唤醒、后端进程持续运行,关闭网页都不会中断监控。
退出桌面程序或停止路由器上的本项目服务会停止采样;仅连接到路由器上的 Mihomo,不会把本项目的监控计划交给路由器运行。
支持 1h/24h/7d 分析、小时聚合、历史序列、Provider 共同异常提示与匿名诊断包。
少于 100 个有效样本显示“积累中”,未完整覆盖所选窗口或覆盖不足时显示暂定分。长连接尚未验证。开启“故障自动切换”后,当前节点确认不可用时,
从健康的监控候选中,优先选择与最高成功率相差不超过容差且 P95 较低的节点,其余候选按成功率兜底;容差按任务配置,默认 8 个百分点,设为 0 恢复成功率优先。切换前复测并记录审计;自动切换默认关闭。
[持续监控使用说明 →](docs/monitoring.md)
[运行维护与恢复说明 →](docs/operations.md)

<a id="compatibility"></a>
## 已验证环境与项目状态

**版本 `v0.5.0`:监控出口与独立 IP 情报,改进手机工作台。** ChatGPT 监控展示出口 IPv4/IPv6 与四家 IP 情报来源,支持网页配置凭据;设置分类保留草稿,扫描比较与连通性首屏更清晰。IP 情报不改变健康评分或自动切换。升级前请查看[兼容性说明](docs/releases/v0.5.0.md#升级与兼容性)。本 README 跟随 `main`,下载版本以对应的
[Release 说明](https://github.com/Uddoo/mihomo-smart-selector/releases) 为准。
主分支的改进可能尚未包含在公开下载包中,使用新描述的行为前请核对安装版本。

| 验证类型 | 范围 |
| --- | --- |
| **本地运行** | Windows,使用内置 mock Controller 和浏览器流程测试。 |
| **路由器运行** | NanoPi R5S LTS / ARM64,iStoreOS 24.10.8。2026-09-11 通过 Edge 以 1440 × 1000 截取八个页面及展开的扫描筛选,共 18 张双语图,前端资源对应提交 `b0570dc`。截图展示当时的界面状态,不作为端到端业务或长连接可靠性的证明。 |
| **构建验证** | CI 配置覆盖 Linux ARM64、AMD64;当前结果以顶部实时 CI 徽章为准。构建成功不等同于所有设备均已实机验证。 |

项目仍在开发中,`v1.0.0` 前配置和 API 兼容性可能变化。界面支持简体中文和英文,可通过页头语言选择器切换。
HTTP 可达不等于登录、播放或地区解锁成功;严格验证和出口验证独立展示,不混同于性能评分。

专用验证会在探测前后核对当前节点。探测组恢复失败或无法确认时,会在扫描历史中保留独立警告,
请到 Controller 核对该组的当前选择。回读无法消除与其他客户端的全部竞态,也不能验证代理入口的路由配置。

<a id="contributing"></a>
## 一起改进下一版

<p>
  <a href="https://github.com/Uddoo/mihomo-smart-selector/stargazers"><img src="https://img.shields.io/github/stars/Uddoo/mihomo-smart-selector?style=flat&amp;logo=github&amp;label=Star%20%E6%94%B6%E8%97%8F" alt="GitHub Star 数量" /></a>
  <a href="https://github.com/Uddoo/mihomo-smart-selector/issues?q=is%3Aissue%20is%3Aopen%20label%3A%22good%20first%20issue%22"><img src="https://img.shields.io/github/issues/Uddoo/mihomo-smart-selector/good%20first%20issue?label=%E5%85%A5%E9%97%A8%E4%BB%BB%E5%8A%A1" alt="开放的 good first issue 数量" /></a>
</p>

**从一台设备、一个页面或一个测试用例开始。** 欢迎中文和英文反馈,不需要承诺长期投入。

| 你愿意帮忙的方向 | 一份有用的首次贡献 |
| --- | --- |
| **在自己的设备上试用** | 记录系统、架构、应用与客户端版本,以及连接和扫描在哪一步成功或卡住。 |
| **文档与双语文案** | 讲清一个配置步骤,或校对一个页面的空状态与错误提示。 |
| **Go 测试** | 用虚构节点名称补充地区分类边界用例,先约定预期结果。 |
| **打包与 OpenWrt** | 一起明确 Linux 发布包、校验与设备验证方案;这类工作先讨论实现范围。 |

[首次贡献指南与具体方向](docs/first-contribution.md#中文) ·
[查看现有 Issue](https://github.com/Uddoo/mihomo-smart-selector/issues) ·
[反馈安装与使用体验](https://github.com/Uddoo/mihomo-smart-selector/issues/new?template=installation_feedback.yml)

动手前先搜索现有 Issue;有相同任务就在其中说明意向,没有则先开一个 Issue 对齐范围。
指南中的方向是讨论起点,不代表已分配的 Issue 或版本交付承诺。
开发与验证流程见 [CONTRIBUTING.md](CONTRIBUTING.md),敏感问题按 [SECURITY.md](SECURITY.md) 报告。

如果它帮你选到了更合适的节点,欢迎 **Star 收藏**。带着可复现的问题回来,或提交一个小改进,也很有帮助。

<a id="docs"></a>
## 按需查阅文档

| 我想…… | 文档 |
| --- | --- |
| 浏览当前中文版界面 | [实机截图导览](docs/screenshots.zh-CN.md) |
| 使用自己的组名、服务或私有地址 | [服务适配与持久化设置](docs/service-adaptation.md) |
| 安装到路由器 | [部署、预检与回滚](deploy/openwrt/README.md) |
| 看懂监控状态、趋势、事件与自动切换 | [持续监控说明与实机截图](docs/monitoring.md) |
| 理解推断地区、待确认或隐藏条目 | [地区推断与条目分类](docs/region-classification.md) |
| 了解评分、隔离方式或 API | [架构与验证边界](docs/architecture.md) |
| 定位源码、状态职责与历史设计 | [项目结构](docs/project-structure.md) · [设计记录](docs/design/README.md) |
| 了解重启恢复、审计状态或清理规则 | [长期运行与异常恢复](docs/operations.md) |
| 排查问题或反馈 Bug | [排障与反馈指南](docs/troubleshooting.md) |
| 查看最近变化 | [更新记录](CHANGELOG.md) |

<a id="faq"></a>
## 常见问题

**已经有 `url-test`,为什么还需要它?** Mihomo 原生
[`url-test`](https://wiki.metacubex.one/en/config/proxy-groups/url-test/) 已支持测试 URL、间隔与切换容差,
简单自动选线可能已经够用。本项目补充可视化的比较过程:分阶段采样、当前节点与候选对照、
历史覆盖率以及切换审计,适合希望看懂依据、再决定是否切换的用户。

**包含代理节点或订阅吗?** 需要你已有的 Mihomo 环境与节点;本项目提供配套工作台,不提供订阅或代理内核。

**扫描会切换我正在使用的业务节点吗?** 不会,普通扫描需要你明确确认选择后才会切换业务组。
可选验证会临时调整独立探测组,并在结束时尝试恢复。持续监控是独立机制:只有显式开启故障自动切换后,才会在当前节点确认不可用时自动选择候选。

**为什么分数更高的节点有时排在后面?** 稳定模式优先展示已复测节点。
同一阶段内按评分、成功率、较低 P95 排序;仅初筛的候选可以先单独复测再选择。

**为什么不能选择某个节点?** 操作旁会显示原因,例如扫描未完成、结果已过期、
节点已移出策略组、成功率不足、未满足服务条件,或之前的切换仍待核对。

**某个服务一直探测失败怎么办?** 先检查 Controller 连接和探测模板。
私有服务需要通过 Profile 覆盖规则填写实际服务地址。[排障指南 →](docs/troubleshooting.md)

<a id="development"></a>
<details>
<summary><strong>本地 Mock 演示、源码构建与测试</strong></summary>

<p>
  <a href="go.mod"><img src="https://img.shields.io/github/go-mod/go-version/Uddoo/mihomo-smart-selector/main?logo=go&amp;label=Go" alt="go.mod 声明的 Go 版本" /></a>
  <a href="web/package.json"><img src="https://img.shields.io/github/package-json/dependency-version/Uddoo/mihomo-smart-selector/vue/main?filename=web%2Fpackage.json&amp;logo=vuedotjs&amp;label=Vue" alt="package.json 声明的 Vue 版本范围" /></a>
  <a href="web/package.json"><img src="https://img.shields.io/github/package-json/dependency-version/Uddoo/mihomo-smart-selector/dev/typescript/main?filename=web%2Fpackage.json&amp;logo=typescript&amp;label=TypeScript" alt="package.json 声明的 TypeScript 版本范围" /></a>
</p>

### 本地 Mock 演示

需要 **Go 1.27.3 或更高版本** 与两个终端。Vue 界面已嵌入,演示无需 Node.js、订阅或真实 Controller 密钥。

终端 1:

```sh
git clone https://github.com/Uddoo/mihomo-smart-selector.git
cd mihomo-smart-selector
go run ./cmd/mihomo-mock
```

终端 2,在克隆后的仓库目录运行:

```sh
go run ./cmd/mihomo-smart-selector -config config.dev.example.yaml
```

打开 [localhost:8788](http://127.0.0.1:8788),选择稳定模式并开始扫描。
**Mock 时延是模拟数据**,不代表你的真实网络表现。确保 9090 与 8788 端口空闲;
命令可用于 PowerShell 与 POSIX shell,首次运行会下载 Go 依赖,分别按 Ctrl+C 停止进程。

从源码连接自己的 Controller 时,将 `config.example.yaml` 复制为 `config.yaml`,运行
`go run ./cmd/mihomo-smart-selector -config config.yaml`,再按上方步骤配置连接。
复制的配置与数据不要提交到仓库。

### 构建与验证

前端开发除 Go 1.27.3 或更高版本外,还需要 Node.js ≥22.12、pnpm 11.19.x。
项目局部 Go 工具链可以放在 `.tools/go`;该目录不包含在新 clone 中。

```sh
go mod download
pnpm --dir web install --frozen-lockfile
pnpm --dir web build
go vet ./...
go test ./...
go build -o bin/mihomo-smart-selector ./cmd/mihomo-smart-selector
```

Windows 下将构建输出路径改为 `bin/mihomo-smart-selector.exe`。
仓库验证使用 PowerShell:

```powershell
./tools/verify.ps1
./tools/smoke-test.ps1
```

验证覆盖格式、模块、测试、前端资源、工作流与 shell 语法、依赖漏洞和密钥检查。
`-SkipSecurity` 用于更快的本地迭代;CI 配置包含 Go race detector。
进程级 smoke test 使用隔离的本地 mock,并在结束后清理测试进程。

参与前请阅读 [CONTRIBUTING.md](CONTRIBUTING.md)、[行为准则](CODE_OF_CONDUCT.md)
和[维护者配置说明](docs/open-source-setup.md)。密钥、订阅地址和私有服务信息不应进入提交或公开反馈;
敏感问题按 [SECURITY.md](SECURITY.md) 的流程报告。

</details>

---

[MIT 许可证](LICENSE) · [反馈问题](https://github.com/Uddoo/mihomo-smart-selector/issues/new/choose) · [English](README.en.md)