proxyctl 0.1.4__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. {proxyctl-0.1.4 → proxyctl-0.3.0}/PKG-INFO +23 -1
  2. {proxyctl-0.1.4 → proxyctl-0.3.0}/README.md +22 -0
  3. proxyctl-0.3.0/man/proxyctl.1 +269 -0
  4. {proxyctl-0.1.4 → proxyctl-0.3.0}/pyproject.toml +4 -2
  5. {proxyctl-0.1.4 → proxyctl-0.3.0}/src/proxyctl/__init__.py +1 -1
  6. proxyctl-0.3.0/src/proxyctl/_io.py +425 -0
  7. {proxyctl-0.1.4 → proxyctl-0.3.0}/src/proxyctl/audit.py +79 -2
  8. {proxyctl-0.1.4 → proxyctl-0.3.0}/src/proxyctl/check.py +215 -32
  9. {proxyctl-0.1.4 → proxyctl-0.3.0}/src/proxyctl/cli.py +1001 -189
  10. proxyctl-0.3.0/src/proxyctl/completion.py +223 -0
  11. proxyctl-0.3.0/src/proxyctl/explain.py +1346 -0
  12. {proxyctl-0.1.4 → proxyctl-0.3.0}/src/proxyctl/status.py +69 -20
  13. {proxyctl-0.1.4 → proxyctl-0.3.0}/src/proxyctl/trace.py +52 -12
  14. {proxyctl-0.1.4 → proxyctl-0.3.0}/.gitignore +0 -0
  15. {proxyctl-0.1.4 → proxyctl-0.3.0}/LICENSE +0 -0
  16. {proxyctl-0.1.4 → proxyctl-0.3.0}/src/proxyctl/builtin_plugins/__init__.py +0 -0
  17. {proxyctl-0.1.4 → proxyctl-0.3.0}/src/proxyctl/builtin_plugins/connectivity_basic.py +0 -0
  18. {proxyctl-0.1.4 → proxyctl-0.3.0}/src/proxyctl/builtin_plugins/corp_network.py +0 -0
  19. {proxyctl-0.1.4 → proxyctl-0.3.0}/src/proxyctl/core/__init__.py +0 -0
  20. {proxyctl-0.1.4 → proxyctl-0.3.0}/src/proxyctl/core/plugin.py +0 -0
  21. {proxyctl-0.1.4 → proxyctl-0.3.0}/src/proxyctl/engine/__init__.py +0 -0
  22. {proxyctl-0.1.4 → proxyctl-0.3.0}/src/proxyctl/engine/base.py +0 -0
  23. {proxyctl-0.1.4 → proxyctl-0.3.0}/src/proxyctl/engine/mihomo.py +0 -0
  24. {proxyctl-0.1.4 → proxyctl-0.3.0}/src/proxyctl/engine/singbox.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: proxyctl
3
- Version: 0.1.4
3
+ Version: 0.3.0
4
4
  Summary: Proxy configuration lifecycle management for macOS and Linux
5
5
  Project-URL: Homepage, https://github.com/crhan/proxyctl
6
6
  Project-URL: Issues, https://github.com/crhan/proxyctl/issues
@@ -46,6 +46,28 @@ proxyctl 是一套 macOS 代理管理工具,核心价值在于提供**配置
46
46
 
47
47
  它不告诉你"用什么配置",而是帮你"管好配置"。
48
48
 
49
+ ## For AI Agents
50
+
51
+ proxyctl 把 agent 友好度做成一等公民。完整接入协议见
52
+ [AGENTS.md](AGENTS.md)(仓库视角)与 `proxyctl agent-guide`(运行时视角)。
53
+
54
+ ```bash
55
+ proxyctl agent-guide # Agent 入门 markdown(动态注入路径/端口)
56
+ proxyctl --version --json # schema_version + supported_features 探测
57
+ proxyctl commands --json # 全部命令元数据(机读)
58
+ proxyctl commands --schema # 上面 JSON 的 JSON Schema
59
+ proxyctl explain # "我想改 X 去哪?" 速查
60
+ proxyctl doctor --json # 5 项健康打分
61
+ PROXYCTL_AGENT=1 proxyctl <cmd> # 一键 --json + 关色 + 非交互
62
+ ```
63
+
64
+ - envelope schema v2:`schema_version / cmd / ok / data / error / code / hints[] / warnings[] / doc / meta{{ts,elapsed_ms,proxyctl_version,request_id}}`
65
+ - 退出码分语义:`0 OK / 2 USAGE / 3 NOT_FOUND / 4 PERMISSION / 5 ENGINE_DOWN / 6 CONFIG_ERR / 7 NETWORK_ERR / 8 LOCKED / 9 TIMEOUT / 10 DEPENDENCY_MISSING`
66
+ - 写命令支持 `--dry-run` 输出结构化 plan;`audit/check` 支持 `--plain` TSV
67
+ - `proxyctl help <cmd>` 与 `<cmd> --help` 同源;错误带可执行 hints + explain topic
68
+ - 非 TTY 自动关色;不读 stdin / 不 prompt;写操作 fcntl.flock 互斥
69
+ - 从 0.2.x 升级见 [MIGRATION-0.3.md](MIGRATION-0.3.md)
70
+
49
71
  ## 核心功能
50
72
 
51
73
  ### 状态面板
@@ -17,6 +17,28 @@ proxyctl 是一套 macOS 代理管理工具,核心价值在于提供**配置
17
17
 
18
18
  它不告诉你"用什么配置",而是帮你"管好配置"。
19
19
 
20
+ ## For AI Agents
21
+
22
+ proxyctl 把 agent 友好度做成一等公民。完整接入协议见
23
+ [AGENTS.md](AGENTS.md)(仓库视角)与 `proxyctl agent-guide`(运行时视角)。
24
+
25
+ ```bash
26
+ proxyctl agent-guide # Agent 入门 markdown(动态注入路径/端口)
27
+ proxyctl --version --json # schema_version + supported_features 探测
28
+ proxyctl commands --json # 全部命令元数据(机读)
29
+ proxyctl commands --schema # 上面 JSON 的 JSON Schema
30
+ proxyctl explain # "我想改 X 去哪?" 速查
31
+ proxyctl doctor --json # 5 项健康打分
32
+ PROXYCTL_AGENT=1 proxyctl <cmd> # 一键 --json + 关色 + 非交互
33
+ ```
34
+
35
+ - envelope schema v2:`schema_version / cmd / ok / data / error / code / hints[] / warnings[] / doc / meta{{ts,elapsed_ms,proxyctl_version,request_id}}`
36
+ - 退出码分语义:`0 OK / 2 USAGE / 3 NOT_FOUND / 4 PERMISSION / 5 ENGINE_DOWN / 6 CONFIG_ERR / 7 NETWORK_ERR / 8 LOCKED / 9 TIMEOUT / 10 DEPENDENCY_MISSING`
37
+ - 写命令支持 `--dry-run` 输出结构化 plan;`audit/check` 支持 `--plain` TSV
38
+ - `proxyctl help <cmd>` 与 `<cmd> --help` 同源;错误带可执行 hints + explain topic
39
+ - 非 TTY 自动关色;不读 stdin / 不 prompt;写操作 fcntl.flock 互斥
40
+ - 从 0.2.x 升级见 [MIGRATION-0.3.md](MIGRATION-0.3.md)
41
+
20
42
  ## 核心功能
21
43
 
22
44
  ### 状态面板
@@ -0,0 +1,269 @@
1
+ .TH PROXYCTL 1 "2026-05" "proxyctl 0.3.0" "User Commands"
2
+ .SH NAME
3
+ proxyctl \- Proxy configuration lifecycle management for macOS / Linux
4
+ .SH SYNOPSIS
5
+ .B proxyctl
6
+ [\fB--json\fR | \fB--plain\fR] [\fB--dry-run\fR] [\fB--no-color\fR] [\fB--quiet\fR]
7
+ \fICOMMAND\fR [\fIARGS...\fR]
8
+ .SH DESCRIPTION
9
+ .B proxyctl
10
+ 是一套面向 macOS(含 Linux 部分支持)的代理引擎生命周期管理工具,
11
+ 管 mihomo / sing-box 的启停、状态、健康检查、DNS 防护、配置切换。
12
+ .PP
13
+ 它不负责安装代理引擎、不改具体规则、不改订阅——这些去 mihomo 自身的配置文件里改。
14
+ .PP
15
+ \fBAI Agent 友好(v0.3)\fR:
16
+ envelope schema v2(meta.ts/elapsed_ms/proxyctl_version/request_id);
17
+ 所有写命令支持 \fB--dry-run\fR 输出结构化 plan;
18
+ audit / check 支持 \fB--plain\fR TSV 输出;
19
+ \fBPROXYCTL_AGENT=1\fR 一键开启 JSON + 关色 + 非交互;
20
+ 错误信息一律带 \fIhints[]\fR + \fIdoc\fR(指向 explain topic);
21
+ 退出码分语义;写操作 fcntl.flock 互斥锁。
22
+ 详细接入协议见 \fBproxyctl agent-guide\fR 与仓库根 \fIAGENTS.md\fR。
23
+ .SH GLOBAL OPTIONS
24
+ .TP
25
+ .BR --json
26
+ 读类命令输出 envelope JSON (schema v2)。\fBbench --json\fR / \fBlog --json\fR
27
+ 是 NDJSON 流式(log 含首行 meta header)。与 \fB--plain\fR 互斥。
28
+ .TP
29
+ .BR --plain
30
+ \fBaudit\fR / \fBcheck\fR 输出 TSV(无 ANSI / 无 box / 无 emoji)。与 \fB--json\fR 互斥。
31
+ .TP
32
+ .BR --dry-run
33
+ 写命令预演:输出 \fIdata.plan = [PlanStep, ...]\fR(不真正执行)。
34
+ PlanStep 字段:step / action / target / reversible / requires_sudo /
35
+ side_effects / summary。
36
+ 适用:mode / engine / fix / audit apply / config set / daemon /
37
+ dns-lock / dns-unlock。
38
+ .TP
39
+ .BR --no-color
40
+ 关闭 ANSI 颜色(默认按 isatty / NO_COLOR / TERM=dumb / PROXYCTL_NO_COLOR 自动判断)。
41
+ .TP
42
+ .BR --quiet ", " -q
43
+ 抑制非必要输出。
44
+ .TP
45
+ .BR --help ", " -h
46
+ 显示帮助。子命令也支持:\fBproxyctl <cmd> --help\fR 或 \fBproxyctl help <cmd>\fR。
47
+ .TP
48
+ .BR --version ", " -v
49
+ 显示版本。\fB--version --json\fR 输出 envelope,含 \fIsupported_features\fR
50
+ 能力清单(agent 用以探测)。
51
+ .PP
52
+ 所有 flag \fB位置无关\fR——可出现在命令前/后/中。
53
+ .SH COMMANDS
54
+ .SS 自描述(Agent 入口)
55
+ .TP
56
+ .B proxyctl agent-guide
57
+ 输出给 LLM 的运行时入门 markdown(能力地图 / 引导路径 / 决策树 / envelope 字段表 / 锁文件位置 / footgun)。
58
+ .TP
59
+ \fBproxyctl explain\fR [\fITOPIC\fR]
60
+ 无参输出"想改 X 去哪?"速查表;带 topic 输出卡片。
61
+ topic:rules, nodes, config, dns, engine, ports, extra-daemons, env,
62
+ corp-dns, plugins, troubleshooting, exit-codes, agent, flags,
63
+ subscription, agent-protocol, locks。
64
+ .TP
65
+ .B proxyctl commands [--json] [--schema]
66
+ 列出全部命令的元数据:side_effects (list[enum]) / conditional_side_effects /
67
+ supports_dry_run / needs_sudo / interactive / exit_codes / examples。
68
+ \fB--schema\fR 输出该 data 的 JSON Schema (Draft 2020-12)。
69
+ .TP
70
+ \fBproxyctl config\fR \fIpath\fR | \fIget\fR <key> | \fIset\fR <key> <value>
71
+ 查询 / 修改 proxyctl 自身配置。支持 dot 路径(\fBcorp_dns.server\fR)。
72
+ \fBset\fR 是原子写 + .bak 备份 + YAML 校验 + 失败回滚;支持 \fB--dry-run\fR。
73
+ .TP
74
+ .B proxyctl doctor [--json]
75
+ 极简 5 项健康打分:engine_up / port_listen / dns_ok / system_proxy_ok /
76
+ connectivity_ok。\fB--json\fR 额外含 informational 字段:
77
+ engine / mode / port / config_path / engine_config_path / lock_held / lock_path。
78
+ .TP
79
+ .B proxyctl help [\fICOMMAND\fR]
80
+ 顶层帮助 / 单命令完整说明。等价 \fBproxyctl --help\fR / \fBproxyctl <cmd> --help\fR。
81
+ .TP
82
+ \fBproxyctl completion\fR \fIbash\fR | \fIzsh\fR | \fIfish\fR
83
+ 生成 shell 补全脚本。
84
+
85
+ .SS 生命周期(写:sudo + process + system)
86
+ .TP
87
+ .B proxyctl start / stop / restart / restart-clean
88
+ 启停代理引擎(写系统 DNS / 代理 / launchd)。restart-clean 额外清缓存。
89
+ .TP
90
+ .B proxyctl fix [--dry-run]
91
+ 修复 DNS / 代理 / 热重载(system + cache)。
92
+ .TP
93
+ .B proxyctl recover
94
+ 切网后软恢复:热重载 + 清 fakeip + 重测代理组(不重启进程)。
95
+
96
+ .SS 模式 / 引擎(写:sudo + config-write)
97
+ .TP
98
+ \fBproxyctl mode\fR [\fItun\fR|\fIproxy\fR] [\fB--dry-run\fR]
99
+ 切换 tun / proxy 模式。无参输出当前 mode。
100
+ .TP
101
+ \fBproxyctl engine\fR [\fImihomo\fR|\fIsingbox\fR] [\fB--dry-run\fR]
102
+ 切换代理引擎后端。无参输出当前。需 sudo + process restart。
103
+
104
+ .SS 诊断(只读 / network-io)
105
+ .TP
106
+ .B proxyctl status [--json]
107
+ 系统状态面板(引擎 / 端口 / TUN / DNS / 代理 / 网络 / Tailscale)。
108
+ .TP
109
+ .B proxyctl check [--json|--plain]
110
+ 4 阶段健康检查:basic / groups / connectivity / outbound-ip。
111
+ \fB--plain\fR 输出 TSV(stage / ok / detail)。
112
+ .TP
113
+ \fBproxyctl trace\fR \fIDOMAIN\fR [\fB--json\fR]
114
+ 4 阶段域名链路诊断:DNS 解析 / 规则匹配预测 / 连通性 / 实际连接。
115
+ .TP
116
+ .B proxyctl audit [\fIDAYS\fR | apply [DAYS]] [--json|--plain] [--dry-run]
117
+ 扫描日志找疑似应直连域名。\fBapply\fR 写 rules 段(建议先 \fB--dry-run\fR)。
118
+ \fB--plain\fR 输出 candidates TSV(host / count / ip / country)。
119
+ .TP
120
+ .B proxyctl bench [\fIGROUPS...\fR] [--json]
121
+ 代理组测速。\fB--json\fR 为 NDJSON 流式(每节点一行)+ 末尾 summary envelope。
122
+
123
+ .SS Daemon / 看门狗(写:sudo + process)
124
+ .TP
125
+ \fBproxyctl daemon\fR [\fINAME\fR] [\fISUBCMD\fR] [\fB--dry-run\fR]
126
+ 管理 \fIconfig.extra_daemons\fR 中声明的辅助 daemon。SUBCMD: start/stop/restart/status/log。
127
+ .TP
128
+ \fBproxyctl claude-proxy\fR [\fISUBCMD\fR]
129
+ \fBproxyctl daemon claude-proxy <subcmd>\fR 的别名。
130
+ .TP
131
+ .B proxyctl dns-lock [--reload] [--dry-run]
132
+ 启动 DNS 看门狗 daemon(对抗 DHCP / VPN DNS 覆盖)。
133
+ .TP
134
+ .B proxyctl dns-unlock [--dry-run]
135
+ 停止 DNS 看门狗。
136
+
137
+ .SS 工具
138
+ .TP
139
+ .B proxyctl env [--unset]
140
+ 输出 / 清除 HTTP_PROXY / HTTPS_PROXY / NO_PROXY 环境变量(可 \fIeval\fR)。
141
+ .TP
142
+ .B proxyctl log [--tail \fIN\fR] [--no-follow] [--json]
143
+ 查看后端日志。默认 \fItail -f\fR;\fB--json\fR 为 NDJSON(首行 meta header + 数据行)。
144
+ .TP
145
+ .B proxyctl plugins [--json]
146
+ 显示已加载插件。
147
+
148
+ .SH JSON ENVELOPE (schema v2)
149
+ 读类命令在 \fB--json\fR 模式下输出统一 envelope:
150
+ .PP
151
+ .nf
152
+ .RS 4
153
+ {
154
+ "schema_version": 2,
155
+ "cmd": "status",
156
+ "ok": true,
157
+ "data": { ... },
158
+ "error": null,
159
+ "code": 0,
160
+ "hints": [],
161
+ "warnings": [],
162
+ "doc": null,
163
+ "meta": {
164
+ "ts": "2026-05-17T08:00:00Z",
165
+ "elapsed_ms": 12,
166
+ "proxyctl_version": "0.3.0",
167
+ "request_id": "..."
168
+ }
169
+ }
170
+ .RE
171
+ .fi
172
+ .PP
173
+ 失败时 \fIok: false\fR / \fIerror\fR / \fIcode\fR / \fIhints\fR 填充;
174
+ envelope 写 stdout,人类可读错误同时写 stderr。
175
+ \fBlog --json\fR 与 \fBbench --json\fR 是 NDJSON 流式。
176
+ .SH EXIT CODES
177
+ .TP
178
+ .B 0
179
+ 成功
180
+ .TP
181
+ .B 1
182
+ 通用失败(旧路径兼容)
183
+ .TP
184
+ .B 2
185
+ USAGE — 未识别命令 / 参数错;常伴有 did-you-mean
186
+ .TP
187
+ .B 3
188
+ NOT_FOUND — 资源不存在(daemon 未声明 / 配置文件缺失等)
189
+ .TP
190
+ .B 4
191
+ PERMISSION — sudo / 写文件失败
192
+ .TP
193
+ .B 5
194
+ ENGINE_DOWN — 引擎未运行
195
+ .TP
196
+ .B 6
197
+ CONFIG_ERR — 配置文件语法 / 字段错
198
+ .TP
199
+ .B 7
200
+ NETWORK_ERR — 上游 API / 网络错
201
+ .TP
202
+ .B 8
203
+ LOCKED — 并发锁未拿到(hints 含锁文件路径)
204
+ .TP
205
+ .B 9
206
+ TIMEOUT — 命令超时
207
+ .TP
208
+ .B 10
209
+ DEPENDENCY_MISSING — 依赖二进制 / 脚本缺失
210
+ .SH ENVIRONMENT
211
+ .TP
212
+ .B PROXYCTL_AGENT
213
+ 设为 \fI1\fR / \fItrue\fR / \fIyes\fR 等价 \fB--json\fR + \fB--no-color\fR + 非交互承诺。
214
+ .TP
215
+ .B PROXYCTL_NO_COLOR
216
+ 等价 \fB--no-color\fR。
217
+ .TP
218
+ .B PROXYCTL_DEBUG
219
+ 打印插件加载 / hook 调用日志到 stderr。
220
+ .TP
221
+ .B NO_COLOR
222
+ 遵循 https://no-color.org/。
223
+ .SH FILES
224
+ .TP
225
+ .I ~/.config/proxyctl/config.yaml
226
+ proxyctl 自身配置(API token / 端口 / 企业 DNS / extra_daemons / no_proxy_extra / plugins_disabled)。
227
+ .TP
228
+ .I ~/.config/mihomo/config.yaml
229
+ mihomo 引擎配置(rules / proxies / proxy-providers / dns / tun)。
230
+ .TP
231
+ .I ~/.config/proxyctl/.lock.{system,config,daemon}
232
+ 写操作 fcntl.flock 锁文件。LOCKED(8) 错误时 hints 会列出具体路径。
233
+ .TP
234
+ .I ~/.config/proxyctl/plugins/*.py
235
+ 用户插件目录。
236
+ .SH EXAMPLES
237
+ .PP
238
+ 快速接入(agent):
239
+ .RS 4
240
+ .nf
241
+ proxyctl agent-guide
242
+ proxyctl --version --json | jq .data.supported_features
243
+ proxyctl commands --json | jq '.data.commands[] | select(.side_effects == [])'
244
+ proxyctl doctor --json
245
+ .fi
246
+ .RE
247
+ .PP
248
+ 安全地试一个写命令:
249
+ .RS 4
250
+ .nf
251
+ proxyctl mode tun --dry-run --json | jq .data.plan
252
+ .fi
253
+ .RE
254
+ .PP
255
+ 故障排查决策树:
256
+ .RS 4
257
+ .nf
258
+ proxyctl doctor --json # 1. 看 score 与各项布尔
259
+ proxyctl trace github.com --json
260
+ proxyctl fix # 自动修 DNS / 代理
261
+ .fi
262
+ .RE
263
+ .SH SEE ALSO
264
+ \fBmihomo\fR(1), \fBsing-box\fR(1).
265
+ .PP
266
+ 项目地址 https://github.com/crhan/proxyctl
267
+ .PP
268
+ 仓库视角的开发约定:AGENTS.md。
269
+ 迁移指南(0.2.x → 0.3.0):MIGRATION-0.3.md。
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "proxyctl"
3
- version = "0.1.4"
3
+ version = "0.3.0"
4
4
  description = "Proxy configuration lifecycle management for macOS and Linux"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -37,6 +37,7 @@ proxyctl = "proxyctl.cli:main"
37
37
  dev = [
38
38
  "pytest>=8.0",
39
39
  "pytest-cov>=5.0",
40
+ "jsonschema>=4.0",
40
41
  ]
41
42
 
42
43
  [build-system]
@@ -47,7 +48,8 @@ build-backend = "hatchling.build"
47
48
  packages = ["src/proxyctl"]
48
49
 
49
50
  [tool.hatch.build.targets.sdist]
50
- include = ["src/proxyctl", "README.md", "LICENSE", "pyproject.toml"]
51
+ include = ["src/proxyctl", "README.md", "LICENSE", "pyproject.toml",
52
+ "man/proxyctl.1"]
51
53
 
52
54
  [tool.pytest.ini_options]
53
55
  minversion = "8.0"
@@ -1,3 +1,3 @@
1
1
  """proxyctl — Proxy configuration lifecycle management."""
2
2
 
3
- __version__ = "0.1.2"
3
+ __version__ = "0.2.2"