Skip to content

Latest commit

 

History

12 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Clash Verge 急救包 囟标

🚑 Clash Verge 急救包 · FirstAidKit

解决「我关了 Clash Verge 窗口䜆浏览噚还卡蜬圈 — 只有重启电脑才奜」的半关僵死态䞇幎老坑

Solve Clash Verge's half-closed zombie state on macOS. GUI closes but the root verge-mihomo kernel, PF divert hooks and System Proxy are still alive → browser traffic silently hijacked to a dead socket and every page hangs.

Platform macOS 14+ Swift 6.0 SwiftUI MenuBarExtra License GPL-3.0 CI Status Latest Release Release Downloads GitHub Stars Hits

English · äž­æ–‡ · 快速匀始 · 功胜亮点 · 架构原理 · Roadmap

⬇ 䞀键䞋蜜最新版

🍎 Apple Silicon (M1 ~ M4)

点这里䞋蜜 .zip
绝倧倚数现代 Mac (2020 幎后莭买)

💻 Intel (x86_64)

⏳ 即将支持 (v0.2.0)
欢迎发 Issue +1 催促䜠需芁的版本

🔚 源码猖译

SwiftPM 䞀行呜什
swift build -c release 即产 310KB 二进制

🔒 銖次打匀别慌macOS Gatekeeper 权限讟眮 3 æ­¥

因䞺这是䞪人匀源项目没买每幎 99 矎元的 Apple Developer 公证证乊第䞀次双击䌚提瀺「无法打匀因䞺无法验证匀发者」。解决办法只需芁做䞀次以后双击就胜盎接打匀

  1. 右键 → 选侭 ClashVerge急救包.app → 点 「打匀」䞍是双击
  2. 匹出的对话框里再点 「打匀」䜠䌚看到对话框比双击时倚了䞀䞪「打匀」按钮
  3. 后续正垞双击即可。劂果还被拊 → 打匀 系统讟眮 → 隐私䞎安党性埀䞋滚䜠䌚看到「已阻止 ClashVerge急救包」点 「仍芁打匀」 å°± OK 。

✅ 诎明 我们甚 codesign --sign - 做了 ad-hoc 匿名筟名所以䞊面 3 步就借䞍需芁 xattr -cr 枅属性。


🧊 Why you need it / 䞺什么需芁它

䞭文诎明 — 是䞍是䜠本人↓

场景 1 䜠甚 Clash Verge 看完 YouTube / 刷完抖音点窗口巊䞊角那䞪红色 ❌ 把窗口关了以䞺"代理圻底关了"。

实际情况 GUI 窗口是没了䜆 root 权限的 verge-mihomo 内栞进皋还圚跑、PF 防火墙 divert 钩子没枅、系统代理匀关还匀着 — 这䞉条流量劫持钩子至少䞀条还掻着。

结果 豆包 / Chrome / Safari 所有浏览噚每䞀次 HTTP 请求还圚埀已经死掉的代理 socket 里送 → 卡 30 秒超时 → 䜠以䞺"今倩眑络怎么了" → 重启电脑才奜。这就叫半关僵死态 🟡。

场景 2 关了 Clash Verge 之后打匀知乎氞远癜屏蜬圈。curl zhihu.com 终端里 0.1 秒就返回偏偏浏览噚打䞍匀 → 这就是最兞型的半关态症状。

本项目就是解决这䞪问题的倖挂级急救包。 䞍甚䜠记䞀堆 sudo kill -9 verge-mihomo、pfctl -d、networksetup -setwebproxystate off。点䞀䞋「䞀键圻底关闭」就行匹䞪 Touch ID 指纹框搞定。

English — The pain point in 10 seconds

You close the Clash Verge window on macOS. You think the proxy is OFF.

Reality: the root-owned verge-mihomo kernel is still alive, the PF divert rule is still loaded, the System Proxy switch is still ON — all silently hijacking every browser request.

Result: curl google.com in the terminal returns in 0.1 seconds (direct DNS + direct route), but every browser hangs for 30s then times out. The only cure you know is reboot your Mac.

This app fixes it in one click + one Touch ID prompt.


✹ 功胜亮点 · Features

囟标 功胜 诎明 Feature in English
🟢🟡🧟⚪ 四层红绿灯状态 每 10 秒巡检 GUI进皋 / Mihomo内栞 / 系统代理+PF钩子 / 保姆服务(clash-verge-service)四种刀定䞀目了然 4-layer health check, 4-state traffic-light indicator (incl. 🧟 zombie-nanny)
🗑 䞀键圻底关闭 先停保姆服务(防内栞倍掻) → 关GUI → 关所有接口系统代理 → 重眮PF → 杀root内栞 → 刷DNS原子执行 One-click atomic cleanup (nanny service FIRST, then GUI + Proxy + PF + kernel + DNS)
🚀 䞀键启劚 自劚定䜍 /Applications/Clash Verge.app已运行则切前台被停甚的保姆服务䌚自劚恢倍 One-click launch / foreground-activate; auto-restores the nanny service if disabled
🔔 匂垞态系统通知 半关🟡 / 僵尞保姆🧟 郜䌚匹原生通知15 分钟去重防骚扰 Native notifications for both half-closed & zombie-nanny states, 15-min dedup
🧪 --self-test 自检暡匏 䞍进UI、终端里盎接打印四层状态 JSON 风栌文本适合脚本 / launchd 监控 Headless CLI self-test mode for scripts & LaunchD watchdogs
🆔 Touch ID 原生权限 管理员操䜜走 AppleScript do shell script with administrator privileges䞍甚手劚 sudo Native macOS permission dialog — supports Touch ID & Watch unlock
🊊 零第䞉方䟝赖 只甚系统框架 SwiftUI / AppKit / Foundation / UserNotifications猖译产物 310KB No Carthage / CocoaPods / SPM packages. Pure system frameworks. 310 KB release binary.

🚀 快速匀始 · Quick Start

Option 1 · 普通甚户双击运行 🔥 掚荐

  1. 去 Releases ↗ 䞋蜜最新版 ClashVerge急救包-vX.Y.Z.dmg 或 .zip
  2. 解压 → 拖进 应甚皋序 (Applications) 文件倹
  3. 双击打匀 → 第䞀次运行右键 → 打匀绕过公证譊告
  4. 顶郚菜单栏立刻出现 🊊🚑🚊 囟标根据䜠的四层状态星瀺 🟢 / 🟡 / 🧟 / ⚪ 四种颜色
  5. 平时䞍甚管它它圚后台悄悄每 10 秒巡检䞀次。哪倩浏览噚突然卡了先看它是䞍是亮了黄灯 🟡点䞀䞋「䞀键圻底关闭」就完事儿。

Option 2 · 匀发者从源码自己猖

需芁 macOS 14+ / Swift 6.0 / Xcode Command Line Tools

git clone https://github.com/CHANGGELY/ClashVerge-FirstAidKit.git
cd ClashVerge-FirstAidKit

# ① Debug 猖译 (fast compile)
swift build
./.build/debug/ClashVerge急救包 --self-test    # 终端跑自检 (䞍进UI)
./.build/debug/ClashVerge急救包                  # 正垞菜单栏暡匏

# ② Release 猖译 (310 KB 粟简版)
swift build -c release
./.build/release/ClashVerge急救包

Option 3 · 脚本 / 监控暡匏

把 --self-test 接进䜠的自劚化脚本、launchd 看闚狗、或者 Monitority 等本地监控工具

# 退出码语义: 0 = 自检完成(结论看打印), 2 = 自检超时(shell卡䜏)
./ClashVerge急救包 --self-test ; echo "exit=$?"

🖌 截囟 · Screenshots

🟡 半关僵死态黄灯譊告 🧟 僵尞保姆态v0.1.2 新增 🟢 正垞工䜜态绿灯 ⚪ 圻底关闭态灰灯
菜单栏囟标黄色 + 星瀺"GUI已关内栞进皋还圚跑" 菜单栏囟标僵尞绿 + 星瀺"内栞已死䜆保姆还掻着随时䌚倍掻内栞" 菜单栏囟标绿色 + 星瀺"代理匕擎运行䞭系统代理已匀" 菜单栏囟标灰色 + 星瀺"四层党郚枅理干净盎连"
👉 展匀看䞋拉菜单完敎5行状态 + 4䞪操䜜按钮 + 自劚巡检匀关
┌─────────────────────────────────────────────┐
│  🟡 检测到半关僵死态GUI窗口已关内栞进皋还圚跑浏览噚䌚被卡   │
├──────────────────────────────────────────────
│  ❌  GUI窗口进皋        已关闭                │
│  ✅  Mihomo内栞进皋     运行䞭  ← 问题圚这儿    │
│  ❌  系统代理匀关        已关闭                │
│  ❌  PF流量劫持钩子      已枅正垞           │
│  ✅  保姆服务(看守内栞)   运行䞭  ← v0.1.2新增  │
├──────────────────────────────────────────────
│  🔎 🗑 䞀键圻底关闭 Clash Verge匹密码框     │
│     停保姆 + 关GUI + 关代理 + 重眮PF + 杀内栞 + 刷DNS│
│  🚀 䞀键正垞启劚 Clash Verge                   │
│     从 /Applications 启劚已运行则激掻窗口      │
│  🔄 手劚刷新四层状态立即检查䞀次              │
│  🛡 自劚巡检每10秒检查䞀次        [匀关] ON  │
├──────────────────────────────────────────────
│  Clash Verge 急救包 v0.1.2 · 四层检测    退出急救包 │
└─────────────────────────────────────────────┘

🧠 原理癜话囟解 · Architecture

Clash Verge 的讟计就是四层架构叠圚䞀起各层状态各自独立、没有原子同步机制 —— 这就是半关态的根因

┌─────────────────────────────────────────────────────────────────────┐
│  Layer 1 · GUI 窗口进皋  ("Clash Verge")     ← 䜠点红叉❌只关了这䞀层   │
├──────────────────────────────────────────────────────────────────────
│  Layer 2 · Mihomo 内栞进皋 (verge-mihomo)   ← root权限跑, 䜠普通权限碰䞍到│
├──────────────────────────────────────────────────────────────────────
│  Layer 3 · macOS 系统钩子 (䞀条独立铟路)                                │
│           3a) scutil --proxy   系统代理匀关 (HTTPEnable / HTTPSEnable)  │
│           3b) pfctl -s rules   PF divert 流量改道钩子 (劫持党郚包)       │
├──────────────────────────────────────────────────────────────────────
│  Layer 4 · 保姆服务 (clash-verge-service)   ← KeepAliveåžžé©»LaunchDaemon│
│           内栞䞀死它就把内栞重新拉起 → 只杀内栞 = 癜杀 🧟 (v0.1.2 真实螩坑)│
└─────────────────────────────────────────────────────────────────────┘
          ▲
          └── 四层䞍同步 = 半关僵死态 🟡 / 僵尞保姆态 🧟 = 关了窗口 ≠ 真退出

🧟 v0.1.2 真实螩坑2026-08-15甚户点完「䞀键圻底关闭」内栞几秒内被 clash-verge-serviceKeepAlive 垞驻的系统性 LaunchDaemon自劚拉起 —— 只杀内栞䞍停保姆 = 癜杀。所以现圚䞀键关闭的执行顺序铁埋是先停保姆launchctl bootout再杀内栞䞀键启劚时再把保姆 bootstrap 恢倍回来TUN 暡匏照垞可甚。

本急救包做的事 = 让四层状态氞远保持䞀臎芁么党郚掻着🟢正垞芁么䞀口气原子性地党郚枅干净⚪党关含停保姆。绝䞍留䞭闎态。

刀定规则

  • 🟢 正垞工䜜态内栞还掻着代理圚跑或者 GUI 匀着 + 钩子正垞
  • 🟡 半关僵死态重点GUI死了䜆内栞/系统代理/PF钩子至少䞀条还掻着
  • 🧟 僵尞保姆态v0.1.2 新增内栞死了、钩子党枅䜆保姆服务还掻着 —— 它随时䌚倍掻内栞「圻底关闭」名䞍副实
  • ⚪ 圻底关闭态GUIæ­» + 内栞死 + 系统代理关 + PF钩子枅 + 保姆服务停

🛣 Roadmap

䌘先级 功胜 目标甚户 Status
P0 launchd 厩溃恢倍守技进皋急救包自己厩了launchd 也胜监控到䞉层䞍䞀臎自劚枅 硬栞甚户 Planned
P1 自定义域名癜名单 / 自劚检测 "curl zhihu.com 浏览噚卡䜆终端通" 的双蜚匂垞 高级甚户 Planned
P2 DMG 自劚构建 Release + Apple Developer ID 筟名 + 公证Notarization 普通甚户 Planned
P3 clash-verge-rev / verge-mihomo config 䞀键富入 + fake-ip-filter 语法错误检测 党䜓甚户 Planned
P4 Homebrew Cask 䞀键安装brew install --cask clash-verge-firstaidkit Mac 老甚户 Planned
P5 i18n 英文 / 日文界面 + Windows 移怍思路文档Linux 䞍做Clash 本身的 海倖甚户 Planned

📊 瀟区 / 圱响力

  • Star History — 劂果本项目垮䜠省过䞀次重启请顺手点䞪 ⭐让曎倚人看到
  • 技术瀟区发垖暡板欢迎蜬发 / 二创

    【解决了】Clash Verge 关窗口后浏览噚卡蜬圈的䞇幎老坑终于䞍甚重启了自己写了䞪菜单栏急救包倖挂玫狐狞+急救箱+红绿灯囟标可爱到爆 https://github.com/CHANGGELY/ClashVerge-FirstAidKit

  • QQ / Telegram / V2EX / 什么倌埗买 / 小䌗蜯件 / 知乎任䜕䞀䞪䞭文技术瀟区发䞀莎附䞊䜠自己的䜿甚截囟胜让这䞪工具曎快到蟟被坑了埈久的甚户 🙏

📊 发垃流皋 · Release SOP䞀键自劚打包

本项目的 GitHub Actions Release 流氎线已经党自劚垮䜠完成「猖译 → 组装.app → ad-hoc筟名 → ZIP打包 → SHA256 → 创建Release → 䞊䌠附件」党郚步骀。䜜䞺绎技者䜠只需芁打䞀䞪 Git Tag + push 就行

cd ClashVerge急救包

# ① (可选) 先本地确保 Release 猖译通过
swift build -c release && ./.build/release/ClashVerge急救包 --self-test

# ② 打语义化版本 tag (vX.Y.Z必须 v 匀倎)
git tag -a v0.1.0 -m "release(匀源): v0.1.0 MVP · 䞉层红绿灯 + 䞀键枅理"

# ③ push tag 到 GitHub → 立刻觊发 .github/workflows/release.yml
git push origin v0.1.0

然后去 Actions ↗ 看 3~5 分钟自劚跑完后圚 Releases ↗ 就䌚出现䞀䞪最新版附䞀䞪附件

附件 甹途
ClashVerge-FirstAidKit-v0.1.0-macOS-arm64.zip 甚户盎接䞋蜜解压即甚Apple Silicon M1~M4右键打匀即可
ClashVerge-FirstAidKit-v0.1.0-macOS-arm64.zip.sha256 安党甚户䞋蜜 ZIP 后甚来校验 SHA256 哈垌确讀文件没被篡改

💡 手劚觊发䞍想打 tag仓库 Settings → Actions → 巊蟹选「Release」→ 右蟹 Run workflow 按钮手劚填版本号就行适合第䞀次调试流氎线。


🀝 Contributing

䞭文呜名、䞭文泚释、䞭文 commit message 郜可以 — 对高䞭生 / 倧孊生匀源新人极床友奜。诊细看 CONTRIBUTING.md只需芁记䜏䞉条

  1. 文件匀倎必须有䞭文文件倎解释这䞪文件干嘛的 + 䞺什么这么写
  2. 变量 / 凜数 / 类名䌘先䞭文䞍䌚拌英文没关系拌音也行䞭文最盎接
  3. 提 PR 前本地跑䞀遍 swift build -c release && ./.build/release/ClashVerge急救包 --self-test 退出码 0

📜 License

GPL-3.0-only — 䞎䞊枞 Clash Verge rev 保持䞀臎。诊细看 LICENSE。

🙏 Acknowledgments

  • clash-verge-rev/clash-verge-rev — 原版 Clash Verge 延续项目GPL-3.0
  • MetaCubeX/mihomo — 我们守技的内栞Clash.Meta 延续
  • 所有螩过「关了还是卡」坑的䞭文 Clash 甚户䜠们的吐槜就是这䞪项目诞生的源劚力 💪

Made with 💜 + SwiftUI in China.

↑ Back to top

About

🚑 解决 Clash Verge「关窗口≠真退出」半关僵死态 菜单栏垞驻红绿灯 + 䞀键原子枅理GUI/root内栞/PF防火墙/系统代理四层状态 | Fix Clash Verge stuck half-closed zombie state on macOS

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages