Releases: crhan/proxyctl
Releases · crhan/proxyctl
v0.5.13
Compare
Sorry, something went wrong.
No results found
Fixed
proxyctl check 连通性面板的 via 列不再显示热 reload 前遗留的旧路由。
mihomo 热 reload 不会掐断旧 keep-alive 连接,规则改过之后旧连接仍挂着旧
路由链;反查 /connections 时命中第一条就返回,会把遗留连接的旧链路当成
当前路由显示。现在在所有 host 匹配的连接里取 start 最新的一条,via
显示的始终是当前规则下的真实路由。
v0.5.12
Compare
Sorry, something went wrong.
No results found
Fixed
proxyctl env 不再把 no_proxy_extra 中的裸 IPv6 CIDR 写入 NO_PROXY。
这避免 Python/httpx 工具把类似 fd7a:115c::/48 的条目误解析为带非法端口的
URL;域名、IPv4 CIDR 和默认本地绕过项保持不变。
Changed
proxyctl trace 的 [4/4] 实际连接 改为按链路聚合并给出明确结论。
旧版逐条平铺活跃连接、且只取其中一条与规则预测对比,在改规则后的过渡态
(新连接走代理、旧连接仍复用原链路并存)下会自相矛盾地误报"预测出口 X,
实际出口 Y"。新版把相同链路的连接合并计数、累加流量,按"链路是否命中预测
出口"分类,并区分三种结论:全部命中(与规则一致)/ 全部未命中(规则可能
未生效或被前置规则截胡)/ 新旧并存(旧连接在建连时已定死链路,会随超时
自然断开,刷新后即全部走预测出口)。判定改用"预测组名是否出现在链路中"的
集合判定,消除旧版"出口"一词在告警行(取链路入口组)与详情行(取末端节点)
指代不一致的歧义。
[4/4] 连接采集改为 host 精确匹配优先。 仅在拿不到 host(典型 fake-ip
模式)时才回退按 destinationIP 匹配,避免 Cloudflare 等共享 IP 把同 IP
其他站点的连接误算进当前域名。
v0.5.11
Compare
Sorry, something went wrong.
No results found
Fixed
proxyctl trace 的规则预测现在尊重 no-resolve 标志。
域名经 HTTP 代理 / fake-ip 连接时,带 no-resolve 的 IP 规则(如
IP-CIDR,100.64.0.0/10,DIRECT,no-resolve)会被引擎跳过;[2/4] 规则匹配
不再误报命中这类规则,预测出口与 [4/4] 实际链路一致。命中其他规则时,
会提示有哪些 no-resolve IP 规则因当前连接为域名而被跳过。
v0.5.10
Compare
Sorry, something went wrong.
No results found
Fixed
proxyctl check 连通性面板的 via 列现在按可见宽度对齐。
彩色状态码和 ok / 200 / 401 这类不同长度状态不再导致 via 列左右漂移。
proxyctl check 连通性 via 列不再普遍显示 ?。 v0.5.9 引入的
反查是在 curl 测试结束之后 才查 mihomo /connections,而短连接
curl 一退出连接就从连接表移除,几乎抓不到自己刚发的请求 —— 只有恰好
有外部进程在持续访问同一 host(如 Claude Code 长连 api.anthropic.com)
时才会被"蹭"到显示出来。本版改为在 curl 测试进行中 并发轮询
/connections,趁连接还活着抓到真实链路;抓不到时回退到既有的外部
连接探测;都没找到时显示 via —(em dash 友好占位)而非 via ?。
内置 connectivity-basic 插件不再 hardcode 个人代理组名 claude。
原先 anthropic target 写死了 expected_proxy="claude",且出口探测里
写死了 OutboundProbe(name="claude", …),导致没有 claude 组的用户
跑 check 会被误判 expected claude, got … 且出口 IP 段多一行无意义
的 claude。命名组校验和命名出口探测属本机特例,请在
~/.config/proxyctl/plugins/ 的用户插件里追加。
proxyctl check 出口 IP 不再出现同名 direct 行重复。 旧的去重
key 把 url 也算进比较,内置插件的 https://myip.ipip.net 和用户
插件的 http://myip.ipip.net 仅协议不同就漏了去重 → 同一出口显示
两行。本版按 (name, mode) 折叠:同名同模式视为同一出口行,后加载的
用户插件覆盖内置同名探测(本机特例优先),显示顺序保持稳定。
proxyctl audit 现在能识别任意命名代理组下的 DOMAIN-SUFFIX 规则。
_load_rules 原本只把 outbound ∈ {direct, proxy, claude} 三个名字
归类,其它命名组(如 residential-tw / jp-streaming 等)的规则被
完全忽略 → audit 统计偏低、推荐误报。本版改为"非 direct、非
block/reject 即视为代理类",任何命名代理组的规则都正确进入
proxy_suffixes。
Changed
_connectivity_line_value("proxy") 默认值从 "?" 改为 "—"(em dash),
仅影响 check 连通性表 via 列反查失败时 的占位字符。JSON 字段
data.stages.connectivity[].line 在该场景下从字符串 "?" 变为 "—";
消费方判断"是否有真实链路"建议改用 route_chain 非空,而不要 string-match
这个占位。
v0.5.9
Compare
Sorry, something went wrong.
No results found
Added
proxyctl connections 支持位置参数关键字 + 跨字段智能匹配。
现在可直接写 proxyctl connections codex 443,等价于
--query codex --query 443。每个关键字独立判定命中维度:纯数字关键字
对 target_port / source_port / pid 做精确比较,文本关键字对
target_host / destination_ip / app / process / command 做大小写
不敏感子串匹配;多关键字之间取 AND ,每个关键字必须至少命中一个维度。
JSON 输出在每条命中行新增 match_reasons: {keyword: [dimensions]} 字段,
显示是哪个关键字命中了哪些维度(当本次调用没有任何关键字时,该字段不会
出现在 row dict 上——消费方应按 "key may be absent" 处理)。人类视图启用
ANSI 高亮(黄底黑字)标出命中子串,并在 0 行命中时打印关键字 + 尝试过的
维度提示(仅在本次提供了关键字时打印;仅有 --app 等结构化过滤而无关键字
时不会打这个提示)。
LocalConnection.to_dict() 的 JSON 输出新增 command 字段 ,把
ps -o command= 抓到的完整命令行一并暴露,方便位置参数关键字按命令行匹配,
也便于消费方调试。
proxyctl connections --verbose 在人类视图展开 socket 明细。
默认 human 视图只渲染目的站点汇总(数量、路由、链路、持有进程计数);加上
--verbose 后会在每个目的站点下逐条展开 socket 明细:完整进程路径、命令行、
Mihomo rule / rule_payload / chains / upload / download / start / route_kind,
以及本次位置参数关键字的命中维度(命中: kw=dim1+dim2)。JSON 输出不受
此 flag 影响,明细一直在 proxy_owner_connections[] 里。
proxyctl connections 人类视图的上传/下载/开始时间改用人类单位。
上传/下载字节数现在显示为 8.0 KiB / 1.5 MiB 等二进制单位,而不再是
原始字节数;开始时间在 ISO 8601 时间戳后追加相对时长,如
2026-05-23T17:20:27.854916+08:00 (5m20s 前),方便快速判断连接生命周期。
解析失败时回退到原始时间戳,不掩盖原数据。
proxyctl connections --verbose 自动读取 traffic store 历史数据。
开启 --verbose 后,命令会去 ~/.cache/proxyctl/traffic_events.ndjson
(或 traffic_store_dir 指向的位置)加载 proxyctl traffic sample/watch
采样积累的事件流,按 host 索引后挂到每条 socket 上。每个 socket 明细下方
会展开历史块:累计上传/下载、首次/末次见到的时间(含相对时长)、
历史连接数、出现过的进程列表。build_report 输出顶层新增 history_status
字段记录是否加载成功、读取到几条事件,便于 JSON 消费方判断;human 视图
在 traffic events 为空时一次性提示用户先跑 proxyctl traffic watch。
proxyctl check 连通性面板新增实际路由显示。 proxy 模式的 URL 探测
会从本地 Mihomo /connections 读取该站点实际命中的链路,并在人类输出中
显示为 via <group> → <leaf>;直连探测显示 via direct,DNS/TCP 探测
显示 via -,拿不到活跃连接时显示 via ?。JSON 输出中的每个
connectivity row 同步新增 line 和 route_chain 字段。
proxyctl check 内置连通性基线新增 OpenAI API 探测。
默认站点现在包含 openai(https://api.openai.com/v1/models),并将
anthropic 从根路径改为 https://api.anthropic.com/v1/models,让 AI
API 健康检查更接近真实调用路径;4xx 仍按“链路已通”处理。
Changed
proxyctl connections --query 语义升级(行为变化)。 之前 --query
是把多个值在 process + target + contexts 拼成的大串上做 OR 子串匹配;
现在与位置参数共用 AND + 跨字段独立判定逻辑。多值场景下结果可能比旧版本
更窄(旧 OR → 新 AND),但单值场景下匹配范围反而更宽(不再依赖字段被拼接
的顺序)。脚本里使用 --query 的用户请确认这一语义变化。
proxyctl check 连通性成功行统一使用 via ... 表达。
成功命中期望代理组时,人类输出不再同时显示 线路 <leaf> 和 via ...;
所有连通性行统一保留 via <route>。只有期望组不匹配时才追加错误说明。
proxyctl check 会去重内置插件与用户插件提供的完全相同探测项。
当旧用户插件仍声明与内置插件相同的 connectivity target 或 outbound probe
时,人类输出不再重复显示同一站点或同一出口 IP;不同 URL 或不同 mode 的
同名自定义探测项仍会保留。
Fixed
proxyctl check 的 URL 连通性探测改用 HTTP/1.1,避免 Discord 一类站点
因 HTTP/2 协商异常被误报为 timeout。 当 curl 返回 HTTP code 000
时,人类输出现在会显示 stderr 中的简短错误原因;没有 stderr 时仍显示
timeout。
v0.5.8
Compare
Sorry, something went wrong.
No results found
Fixed
proxyctl check 的出口 IP 归属地补全不再依赖被测代理线路。
第 4 阶段会直连查询已探测到的 IP 归属地,避免 claude 出口失败时影响
direct 或 proxy 的归属地显示。
Changed
出口 IP 归属地补全现在并发执行。 proxy / claude / direct
的归属地查询互不阻塞,单个出口查询慢或失败不会拖慢其他出口的显示。
v0.5.7
Compare
Sorry, something went wrong.
No results found
Changed
proxyctl check 现在会显示 mihomo 规则实际引用的代理组。 像
claude 这类不挂在默认 proxy 组下面、但被 DOMAIN-SUFFIX,...,claude
规则命中的业务组,会和 proxy 一起出现在代理组检查段,方便维护者从同一个
视图确认规则、组和节点状态。
proxyctl check 现在会验证 Anthropic 连通性及 Claude 线路命中。
连通性阶段新增 anthropic 检查,并在请求后通过本地 mihomo /connections
确认链路末端为 claude。
出口 IP 探测现在覆盖 proxy、claude、direct 三类出口。 第 4 阶段
会同时显示默认代理出口、Claude 规则出口和直连出口,方便确认分流是否生效。
v0.5.6
Compare
Sorry, something went wrong.
No results found
Added
新增 proxyctl traffic 线路/软件流量统计。 snapshot 读取 Mihomo
/connections 的 upload / download 并按线路、链路、软件或路由聚合;
sample / watch 可把连接计数器增量写入本地缓存;report --since 1h
可按已记录增量生成历史窗口报表。watch 在人类输出模式下会每次采样实时打印
进度行。命令复用 connections 的 --host /
--chain / --route / --preset / --agent 过滤。首次采样只建立基线,
不回填此前已经产生的字节,避免把活跃连接当前计数误算成历史累计。
Fixed
proxyctl connections 现在能显示 macOS Network/System Extension
接管后的 Mihomo 连接 owner 与实际代理链路。 当 OpenAI / ChatGPT 等
连接被本机网络扩展接管时,lsof 只能看到扩展进程而不是原始 App。
本版在 macOS 上补充 netstat -anv 反向归因,JSON 新增
proxy_owner_connections[],包含 socket owner、是否为系统扩展、
Mihomo route_kind / chains / routed_via_proxy,并新增
proxy_owner_groups[] 按 rulePayload / host / IP 聚合目的地。如果同一
目的组出现不同 chains 或 route kind,会输出 warning=mixed_chains
/ mixed_route_kind 和 summary 里的
inconsistent_proxy_owner_group_count,从而能判断连接是否经过 Mihomo、
最终是 proxy 还是 direct 路由,以及同一组线路是否一致。
proxyctl connections 默认输出全量目的站点,并新增多维过滤。
无参数时不再默认限制 Codex / Claude / ChatGPT;需要 AI 视角时使用
--preset ai。新增 --host 按 host / rulePayload / IP 过滤,--preset
使用预设(ai / openai / anthropic / coding 等),--agent 按工具
过滤(codex / claude / chatgpt / openclaw 等),--chain /
--line 按 Mihomo 链路节点过滤,--route 按 route kind 过滤
(proxy / direct / reject / unknown,同时接受中文别名),
--query / --filter 做全文过滤。不同维度之间取 AND,同一维度内多个值取 OR。
--app Codex / --app Claude 保持向后兼容,分别匹配 App 与 CLI 两类上下文。
proxyctl connections 的人类输出改用目的站点汇总。 默认输出只按
目的站点展示数量、候选 App / CLI、路由和链路;每个目的站点下会统计
持有进程连接数,例如 com.antgroup.asp(pid=47283):8,系统扩展也按普通
进程展示。人类输出里的上下文显示为 Claude App / Claude CLI 等可读
名称,并使用多行布局展示候选、链路、主机和持有进程,避免长字段挤在
同一行;--json 里的 proxy_owner_connections[] 仍保留逐条 socket 明细。
v0.5.5
Compare
Sorry, something went wrong.
No results found
Fixed
proxyctl check 的 selector/fallback 代理组现在显示全部子组与
真节点成员,不再只显示 now 那一个子组。 v0.5.3 / v0.5.4 的"精简
显示"为了避免节点重复,把 now 之外的兄弟子组 summary 行和混在
子组里的真节点成员(如 local-13659)都跳过了,导致典型 claude → [residential-sg, residential-us, local-13659] 这种结构里用户只能看到
当前命中的那一个子组,连"还有哪些可选线路"都不知道。本版恢复全部
子组 summary 可见 + 真节点成员可见,但仍只对 now 子组展开叶子
节点列表(保留 v0.5.3 跨组去重 (详见上方) 行为),单组从 ~50 行
精简到 5-7 行的目标不变。
Added
新增 proxyctl connections 只读诊断命令。 该命令读取本机
lsof / ss / ps 连接信息,并在 mihomo 后端下用本地
/connections API 按 metadata.sourcePort 关联连接详情。默认过滤
Codex / Claude / ChatGPT,--app <name> 可重复指定应用过滤,--all
查看所有进程;--json 输出 envelope v2,包含进程、PID、fd、本地源端口、
是否连接到 proxy_port、mihomo host/destination/rule/rulePayload/chains/
upload/download/start,以及 unmatched 原因。非 mihomo 后端或本地 API 不可用
时降级输出本机连接并标注 unmatched。
v0.5.4
Compare
Sorry, something went wrong.
No results found
Fixed
doctor 在 Linux + proxy 模式下不再误报 dns_ok 失败。 旧逻辑
_dns_points_to_loopback() 简单粗暴读 /etc/resolv.conf 看是否含
127.0.0.1,但 Ubuntu / Debian 标准是 systemd-resolved 在 127.0.0.53:53
起 stub resolver,永远不会匹配 → 永远判 ✗ → doctor 给出 next: proxyctl fix
的错误建议,且 fix 的 plan 显示 macOS 风格的 networksetup 步骤(实际
cmd_fix Linux 路径根本不跑这些)。本版 doctor 改用 mode-aware
_dns_check_ok(mode):proxy 模式直接返回 True(流量走 HTTP/SOCKS 代理,
mihomo 不在 :53 监听,系统 DNS 用 systemd-resolved/DHCP 默认即可),
tun / mixed / 未知模式保留旧的回环判定。doctor 人类输出 dns_ok 描述行
按 mode 切换:(proxy 模式无需 DNS 劫持) 或 (系统 DNS 含 127.0.0.1)。
fix --dry-run 在 Linux 不再输出 macOS 风格的 DNS 改写步骤。
_plan_fix 按平台分支:Linux 只输出 1 步 http_put(Clash API 热重载),
与 cmd_fix 实际 Linux 路径对齐;macOS 保留三步(DNS reset + cache
flush + reload)。之前 Linux 用户 dry-run 会被 plan 误导以为 fix 要改
系统 DNS。
Compatibility
data.dns_ok 字段类型不变(仍是 bool);但 proxy 模式下该字段含义
从"系统 DNS 是否含 127.0.0.1"变为"DNS 配置对当前 mode 是否健康"。
agent 消费 data.dns_ok 的逻辑无需调整。
data.plan[].action 枚举不变;Linux 平台 fix plan 步数从 3 降到 1。