@singbox-iac/cli 0.1.0 → 0.1.1
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.
- package/CONTRIBUTING.md +61 -0
- package/README-en.md +337 -0
- package/README.md +253 -181
- package/dist/cli/command-helpers.d.ts +5 -0
- package/dist/cli/command-helpers.js +27 -3
- package/dist/cli/command-helpers.js.map +1 -1
- package/dist/cli/commands/author.js +1 -7
- package/dist/cli/commands/author.js.map +1 -1
- package/dist/cli/commands/init.js +4 -4
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/setup.d.ts +2 -0
- package/dist/cli/commands/setup.js +356 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/index.js +3 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/modules/fetcher/index.js +1 -1
- package/dist/modules/fetcher/index.js.map +1 -1
- package/dist/modules/natural-language/index.d.ts +10 -0
- package/dist/modules/natural-language/index.js +77 -1
- package/dist/modules/natural-language/index.js.map +1 -1
- package/dist/modules/rule-set-sync/index.d.ts +16 -0
- package/dist/modules/rule-set-sync/index.js +55 -0
- package/dist/modules/rule-set-sync/index.js.map +1 -0
- package/dist/modules/verification/index.d.ts +18 -0
- package/dist/modules/verification/index.js +38 -0
- package/dist/modules/verification/index.js.map +1 -1
- package/docs/releasing.md +15 -6
- package/docs/runtime-on-macos.md +12 -0
- package/package.json +10 -2
package/README.md
CHANGED
|
@@ -1,265 +1,337 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Singbox IaC
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[English](./README-en.md)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://github.com/menlong999/singbox-iac/actions/workflows/ci.yml)
|
|
6
|
+
[](https://www.npmjs.com/package/@singbox-iac/cli)
|
|
7
|
+
[](https://github.com/menlong999/singbox-iac/blob/main/LICENSE)
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
面向 macOS 无头场景的 `sing-box` 订阅编译器。
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
- Route priority should be explicit and testable.
|
|
11
|
-
- Runtime updates should be validated before they touch the live config.
|
|
12
|
-
- `Proxifier`, multiple listeners, AI application routing, and custom rule sets should be first-class use cases.
|
|
11
|
+
`Singbox IaC` 把机场订阅当作节点输入,而不是最终配置本身,再结合固定路由策略、规则集和用户意图,生成可验证、可发布、可定时更新的 `sing-box` 配置。
|
|
13
12
|
|
|
14
|
-
##
|
|
13
|
+
## 项目简介
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
这是一个面向开发者的代理基础设施 CLI。它解决的不是“导入订阅”这个单点问题,而是把订阅、规则、验证、发布和定时更新串成一条可控链路。
|
|
17
16
|
|
|
18
|
-
|
|
17
|
+
核心理念:
|
|
19
18
|
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
- Weak support for process-aware routing, `Proxifier`, and application-specific AI egress policies
|
|
19
|
+
- 订阅只负责提供节点
|
|
20
|
+
- 路由策略由你掌控
|
|
21
|
+
- 配置生成后必须可验证
|
|
22
|
+
- 进程级分流和站点级分流都应该是一等能力
|
|
25
23
|
|
|
26
|
-
|
|
24
|
+
## 为什么要做这个项目
|
|
27
25
|
|
|
28
|
-
|
|
29
|
-
- Deterministic route ordering
|
|
30
|
-
- Human-friendly rule authoring
|
|
31
|
-
- Safe rollout with staging and validation
|
|
32
|
-
- macOS-first headless operation via `launchd`
|
|
26
|
+
很多用户在 macOS 上会使用 Clash Verge 一类 GUI 客户端,再配合机场订阅、全局 JS merge 脚本、Proxifier、规则分组做复杂定制。这个方案能用,但常见问题也很明显:
|
|
33
27
|
|
|
34
|
-
|
|
28
|
+
- 订阅分组粗糙,无法直接表达开发者真实需求
|
|
29
|
+
- GUI 内部合并和脚本 patch 过于黑盒
|
|
30
|
+
- 规则优先级容易被上游订阅变化破坏
|
|
31
|
+
- 某些 AI IDE 或桌面应用不走系统代理,必须依赖 Proxifier
|
|
32
|
+
- 开启 TUN 或全局代理后,本地其他访问可能明显变慢
|
|
33
|
+
- GUI 壳本身资源占用高,不适合长期无头运行
|
|
35
34
|
|
|
36
|
-
|
|
35
|
+
`Singbox IaC` 的目标就是把这些需求收敛成:
|
|
37
36
|
|
|
38
|
-
|
|
39
|
-
- an online converter
|
|
40
|
-
- a one-off template filler
|
|
41
|
-
- a generic multi-client subscription merger
|
|
37
|
+
`subscription -> parse -> compile -> verify -> apply -> schedule`
|
|
42
38
|
|
|
43
|
-
|
|
39
|
+
## 架构图
|
|
44
40
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
41
|
+
```mermaid
|
|
42
|
+
flowchart LR
|
|
43
|
+
A["订阅地址 / 本地订阅文件"] --> B["Fetcher + Decoder"]
|
|
44
|
+
B --> C["Parser (Trojan 链接 -> 中间模型)"]
|
|
45
|
+
C --> D["Compiler"]
|
|
46
|
+
E["自然语言意图 / 极简 DSL"] --> D
|
|
47
|
+
F["内建策略 + Rule Set (.srs)"] --> D
|
|
48
|
+
D --> G["生成 sing-box staging config"]
|
|
49
|
+
G --> H["Check + Route Verification"]
|
|
50
|
+
H --> I["发布 live config"]
|
|
51
|
+
I --> J["Reload / Run sing-box"]
|
|
52
|
+
I --> K["launchd 定时任务"]
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
系统本质上分三层:
|
|
56
|
+
|
|
57
|
+
- 输入层:订阅、规则集、用户意图
|
|
58
|
+
- 编译层:解析器、编译器、策略组装
|
|
59
|
+
- 运行层:校验、发布、重载、定时任务
|
|
60
|
+
|
|
61
|
+
## 用户旅程
|
|
62
|
+
|
|
63
|
+
```mermaid
|
|
64
|
+
flowchart TD
|
|
65
|
+
A["用户提供订阅地址 + 一句话需求"] --> B["setup"]
|
|
66
|
+
B --> C["检测本地环境<br/>macOS / sing-box / Chrome / AI CLI"]
|
|
67
|
+
C --> D["根据意图生成规则"]
|
|
68
|
+
D --> E["同步本地 rule set"]
|
|
69
|
+
E --> F["构建 staging config"]
|
|
70
|
+
F --> G["验证关键路由"]
|
|
71
|
+
G --> H["发布 live config"]
|
|
72
|
+
H --> I["安装 schedule"]
|
|
73
|
+
I --> J["运行或重载 sing-box"]
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
典型开发者路径:
|
|
77
|
+
|
|
78
|
+
1. 填订阅地址
|
|
79
|
+
2. 用一句话描述需求
|
|
80
|
+
3. 自动生成配置并验证关键分流
|
|
81
|
+
4. IDE / AI 应用走 Proxifier,浏览器走普通代理入口
|
|
82
|
+
5. 通过 `launchd` 自动更新配置
|
|
83
|
+
|
|
84
|
+
## 核心功能
|
|
85
|
+
|
|
86
|
+
### 1. 自然语言描述
|
|
87
|
+
|
|
88
|
+
你可以直接用自然语言表达需求,而不是手写原始 `sing-box` JSON:
|
|
89
|
+
|
|
90
|
+
- `GitHub 这类开发类都走香港`
|
|
91
|
+
- `Antigravity 进程级走美国`
|
|
92
|
+
- `Gemini 走新加坡`
|
|
93
|
+
- `Apple TV 和 Netflix 走新加坡`
|
|
94
|
+
|
|
95
|
+
系统会把这些意图编译成内部规则,再进一步生成 `sing-box` 配置。
|
|
96
|
+
|
|
97
|
+
### 2. 极简 DSL
|
|
98
|
+
|
|
99
|
+
对于高级用户,仍然保留了一个极简 YAML DSL,用于补充少量例外规则,而不是逼用户手写整份 `sing-box` JSON。
|
|
100
|
+
|
|
101
|
+
适合的场景:
|
|
102
|
+
|
|
103
|
+
- 某个域名单独走 AI-Out
|
|
104
|
+
- 某个入口固定走特定组
|
|
105
|
+
- 某个站点强制直连
|
|
106
|
+
- 某个端口直接拒绝
|
|
107
|
+
|
|
108
|
+
### 3. 进程级分流
|
|
49
109
|
|
|
50
|
-
|
|
110
|
+
这是很多程序员不会配、但实际非常关键的一类能力。
|
|
51
111
|
|
|
52
|
-
|
|
53
|
-
| --- | --- | --- | --- |
|
|
54
|
-
| Core goal | Convert one config format into another | Provide visual client UX | Compile subscriptions into managed `sing-box` infrastructure |
|
|
55
|
-
| Policy control | Often template-driven | Often merged inside the client | Explicit compiler-controlled route policy |
|
|
56
|
-
| Rule priority | Easy to drift with upstream changes | Often opaque | Fixed ordering and testable behavior |
|
|
57
|
-
| Runtime safety | Usually writes output only | Apply path is often hidden | `build -> check -> publish -> reload` |
|
|
58
|
-
| macOS headless | Usually not a focus | Usually not a focus | First-class |
|
|
59
|
-
| `Proxifier` / multi-listener | Rarely central | Awkward to maintain | Core scenario |
|
|
60
|
-
| AI app routing | Usually manual | Possible but brittle | Policy-level capability |
|
|
61
|
-
| User customization | Template edits / scripts | GUI clicks / raw config edits | Declarative DSL, later NL-to-DSL |
|
|
112
|
+
某些 AI IDE、language server 或桌面应用并不遵守系统代理。`Singbox IaC` 提供专用的 `in-proxifier` 入口,让 Proxifier 可以把指定进程强制送进独立链路,再固定到特定出口组或叶子节点。
|
|
62
113
|
|
|
63
|
-
|
|
114
|
+
典型用途:
|
|
64
115
|
|
|
65
|
-
|
|
116
|
+
- `Antigravity`
|
|
117
|
+
- Cursor
|
|
118
|
+
- 某些 AI IDE 或 language server
|
|
119
|
+
- 其他不走系统代理的桌面应用
|
|
66
120
|
|
|
67
|
-
|
|
68
|
-
- `sing-box` config compilation with fixed route ordering
|
|
69
|
-
- runtime-safe commands: `build`, `check`, `apply`, `run`, `verify`, `update`
|
|
70
|
-
- config-driven route verification with real `sing-box` and headless Chrome
|
|
71
|
-
- simple YAML user-rules DSL with protected insertion points
|
|
72
|
-
- built-in rule templates for common developer and video-site patterns
|
|
73
|
-
- natural-language authoring that generates DSL, builds config, can install `launchd`, and can optionally probe local AI CLIs
|
|
74
|
-
- macOS helper commands: `init`, `doctor`, `schedule install`, `schedule remove`
|
|
121
|
+
这让你可以把这些应用固定到独立入口和独立出口,而不会被普通站点规则打散。
|
|
75
122
|
|
|
76
|
-
|
|
123
|
+
### 4. 站点级与服务级分流
|
|
77
124
|
|
|
78
|
-
|
|
125
|
+
除了进程级,另一个高频需求就是站点级分流:
|
|
126
|
+
|
|
127
|
+
- `GitHub`、Google 服务、常见开发类网站走香港或新加坡
|
|
128
|
+
- `Gemini`、`OpenAI`、`Anthropic` 等 AI 服务走不同出口组
|
|
129
|
+
- `Google Stitch` 这类必须走特定国家出口的站点走专门分组
|
|
130
|
+
- 中国大陆域名和 IP 直连
|
|
131
|
+
- 视频站点如 `Netflix`、`YouTube`、`Amazon Prime`、`Apple TV` 按地区分流
|
|
132
|
+
|
|
133
|
+
## 项目能做什么
|
|
134
|
+
|
|
135
|
+
- 拉取 Base64 Trojan 订阅并解析 share links
|
|
136
|
+
- 编译固定优先级的 `sing-box` 配置
|
|
137
|
+
- 提供普通代理入口和 Proxifier 专用入口
|
|
138
|
+
- 用真实 `sing-box` 和无头 Chrome 做闭环验证
|
|
139
|
+
- 支持“一句话规则生成”
|
|
140
|
+
- 自动同步本地 `.srs` 规则集
|
|
141
|
+
- 发布配置到 `~/.config/sing-box/config.json`
|
|
142
|
+
- 通过 `launchd` 做定时更新
|
|
143
|
+
|
|
144
|
+
## 安装
|
|
145
|
+
|
|
146
|
+
先安装 `sing-box`,确保终端里可以直接执行 `sing-box`。
|
|
147
|
+
|
|
148
|
+
官方文档:
|
|
149
|
+
|
|
150
|
+
- [sing-box package manager docs](https://sing-box.sagernet.org/installation/package-manager/)
|
|
151
|
+
|
|
152
|
+
然后安装 CLI:
|
|
79
153
|
|
|
80
154
|
```bash
|
|
81
|
-
npm
|
|
82
|
-
npm install -g ./singbox-iac-cli-0.1.0.tgz
|
|
155
|
+
npm install -g @singbox-iac/cli
|
|
83
156
|
singbox-iac --help
|
|
84
157
|
```
|
|
85
158
|
|
|
86
|
-
|
|
159
|
+
## 快速开始
|
|
160
|
+
|
|
161
|
+
### 一步完成初始化
|
|
87
162
|
|
|
88
163
|
```bash
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
164
|
+
singbox-iac setup \
|
|
165
|
+
--subscription-url '你的机场订阅地址' \
|
|
166
|
+
--prompt 'GitHub 这类开发类走香港,Antigravity 进程级走美国,Gemini 走新加坡,每30分钟自动更新'
|
|
92
167
|
```
|
|
93
168
|
|
|
94
|
-
|
|
169
|
+
`setup` 会自动:
|
|
95
170
|
|
|
96
|
-
-
|
|
97
|
-
-
|
|
98
|
-
-
|
|
99
|
-
-
|
|
171
|
+
- 生成 `~/.config/singbox-iac/builder.config.yaml`
|
|
172
|
+
- 生成 `~/.config/singbox-iac/rules/custom.rules.yaml`
|
|
173
|
+
- 检查本地环境
|
|
174
|
+
- 下载默认本地 `.srs` 规则集
|
|
175
|
+
- 把一句自然语言转成路由规则
|
|
176
|
+
- 构建 `~/.config/singbox-iac/generated/config.staging.json`
|
|
100
177
|
|
|
101
|
-
|
|
178
|
+
如果你希望首次安装时尽可能自动化,可以这样:
|
|
102
179
|
|
|
103
180
|
```bash
|
|
104
|
-
|
|
181
|
+
singbox-iac setup \
|
|
182
|
+
--subscription-url '你的机场订阅地址' \
|
|
183
|
+
--prompt 'GitHub 这类开发类走香港,Antigravity 进程级走美国,Gemini 走新加坡,每30分钟自动更新' \
|
|
184
|
+
--ready
|
|
105
185
|
```
|
|
106
186
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
- `npm run typecheck`
|
|
110
|
-
- `npm run lint`
|
|
111
|
-
- `npm test`
|
|
112
|
-
- `npm run build`
|
|
113
|
-
- `npm pack`
|
|
114
|
-
- clean-directory install smoke with `singbox-iac --help`
|
|
187
|
+
`--ready` 会额外执行:
|
|
115
188
|
|
|
116
|
-
|
|
189
|
+
- 路由验证
|
|
190
|
+
- 发布 live config
|
|
191
|
+
- 安装定时更新
|
|
117
192
|
|
|
118
|
-
|
|
193
|
+
### 前台运行测试
|
|
119
194
|
|
|
120
195
|
```bash
|
|
121
|
-
|
|
196
|
+
singbox-iac run
|
|
122
197
|
```
|
|
123
198
|
|
|
124
|
-
|
|
199
|
+
默认监听端口:
|
|
125
200
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
```
|
|
201
|
+
- `127.0.0.1:39097`:浏览器 / 系统代理流量
|
|
202
|
+
- `127.0.0.1:39091`:Proxifier 进程流量
|
|
129
203
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
## Planned CLI
|
|
204
|
+
### 日常使用
|
|
133
205
|
|
|
134
206
|
```bash
|
|
135
|
-
singbox-iac
|
|
136
|
-
singbox-iac author
|
|
137
|
-
singbox-iac build
|
|
138
|
-
singbox-iac apply
|
|
139
|
-
singbox-iac update
|
|
140
|
-
singbox-iac doctor
|
|
141
|
-
singbox-iac schedule install
|
|
142
|
-
singbox-iac schedule remove
|
|
143
|
-
singbox-iac templates list
|
|
207
|
+
singbox-iac update --reload
|
|
144
208
|
```
|
|
145
209
|
|
|
146
|
-
|
|
210
|
+
这条命令会执行:
|
|
147
211
|
|
|
148
|
-
|
|
212
|
+
- fetch
|
|
213
|
+
- build
|
|
214
|
+
- verify
|
|
215
|
+
- apply
|
|
216
|
+
- optional reload
|
|
149
217
|
|
|
150
|
-
|
|
151
|
-
- real route verification works
|
|
152
|
-
- real publish flow works
|
|
153
|
-
- simple rule DSL works
|
|
154
|
-
- macOS launchd integration is available
|
|
218
|
+
### 定时更新
|
|
155
219
|
|
|
156
|
-
|
|
220
|
+
```bash
|
|
221
|
+
singbox-iac schedule install
|
|
222
|
+
```
|
|
157
223
|
|
|
158
|
-
|
|
159
|
-
- first real npm publish and release automation
|
|
224
|
+
## 自然语言规则编写
|
|
160
225
|
|
|
161
|
-
|
|
226
|
+
对于大多数场景,不需要手写 `sing-box` JSON,也不需要理解 DSL。
|
|
162
227
|
|
|
163
|
-
|
|
228
|
+
示例:
|
|
164
229
|
|
|
165
|
-
|
|
166
|
-
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
- YAML DSL only for small exceptions
|
|
230
|
+
```bash
|
|
231
|
+
singbox-iac author \
|
|
232
|
+
--prompt 'GitHub 这类开发类都走香港出口,Antigravity 进程级都走独立入口并路由到美国节点,Gemini 都出口到新加坡'
|
|
233
|
+
```
|
|
170
234
|
|
|
171
|
-
|
|
235
|
+
```bash
|
|
236
|
+
singbox-iac author \
|
|
237
|
+
--prompt 'Google 服务和 GitHub 走香港,Amazon Prime 和 Apple TV 走新加坡,国内直连,每45分钟自动更新' \
|
|
238
|
+
--update
|
|
239
|
+
```
|
|
172
240
|
|
|
173
|
-
|
|
174
|
-
- [Rule Templates](/Users/lvyuanfang/Code/SingBoxConfig/docs/rule-templates.md)
|
|
175
|
-
- [Natural-Language Authoring](/Users/lvyuanfang/Code/SingBoxConfig/docs/natural-language-authoring.md)
|
|
241
|
+
作者层支持:
|
|
176
242
|
|
|
177
|
-
|
|
243
|
+
- 默认使用本地确定性意图解析
|
|
244
|
+
- 可选接入本地 AI CLI
|
|
245
|
+
- 写入前先 preview
|
|
246
|
+
- 生成规则后直接闭环 update
|
|
178
247
|
|
|
179
|
-
|
|
248
|
+
## 它和 sing-box 是怎么配合的
|
|
180
249
|
|
|
181
|
-
|
|
250
|
+
它不会替代 `sing-box` 内核本身,而是负责生成和维护 `sing-box` 配置。
|
|
182
251
|
|
|
183
|
-
|
|
184
|
-
- optionally probe a local AI CLI with `provider=auto`
|
|
185
|
-
- optionally integrate any other CLI through `provider=exec`
|
|
186
|
-
- use `author --preview` before writing when changing prompts or providers
|
|
187
|
-
- always validate and compile through the same DSL and `sing-box` pipeline
|
|
252
|
+
典型流程:
|
|
188
253
|
|
|
189
|
-
|
|
254
|
+
1. 拉取订阅
|
|
255
|
+
2. 解析节点
|
|
256
|
+
3. 编译 staging config
|
|
257
|
+
4. 校验配置
|
|
258
|
+
5. 验证关键路由
|
|
259
|
+
6. 发布到 live config 路径
|
|
260
|
+
7. 重载或启动 `sing-box`
|
|
190
261
|
|
|
191
|
-
|
|
192
|
-
- `claude`
|
|
193
|
-
- generic `exec` integrations:
|
|
194
|
-
- `gemini`
|
|
195
|
-
- `codebuddy`
|
|
196
|
-
- `codex`
|
|
197
|
-
- `opencode`
|
|
198
|
-
- `qodercli` / `qoder`
|
|
199
|
-
- tooling-only detection:
|
|
200
|
-
- `trae`
|
|
262
|
+
默认 live 配置路径:
|
|
201
263
|
|
|
202
|
-
|
|
264
|
+
```text
|
|
265
|
+
~/.config/sing-box/config.json
|
|
266
|
+
```
|
|
203
267
|
|
|
204
|
-
|
|
205
|
-
- support broad developer tooling through `provider=exec`
|
|
206
|
-
- allow wrapper scripts for CLIs with noisy or event-stream output
|
|
268
|
+
## 安全性
|
|
207
269
|
|
|
208
|
-
|
|
270
|
+
这个项目默认尽量把敏感信息留在本地:
|
|
209
271
|
|
|
210
|
-
-
|
|
211
|
-
-
|
|
212
|
-
-
|
|
213
|
-
-
|
|
214
|
-
- `
|
|
215
|
-
- `{{output_file}}`
|
|
272
|
+
- 订阅地址只保存在本地 builder config 中
|
|
273
|
+
- 生成的配置写入你的本地配置目录
|
|
274
|
+
- 自然语言作者层默认使用本地确定性解析器
|
|
275
|
+
- 本地 AI CLI 接入是可选的,不是强制依赖
|
|
276
|
+
- 仓库默认忽略本地 token、缓存、生成配置和 `.env`
|
|
216
277
|
|
|
217
|
-
|
|
278
|
+
当前项目不会把订阅地址自动上传到任何远端服务。除非你主动配置外部 AI CLI 或外部命令,否则默认作者层不依赖外部 API。
|
|
218
279
|
|
|
219
|
-
|
|
220
|
-
- fenced JSON blocks
|
|
221
|
-
- a balanced JSON object extracted from longer text
|
|
222
|
-
- output written to `{{output_file}}`
|
|
280
|
+
## 常用命令
|
|
223
281
|
|
|
224
|
-
|
|
282
|
+
```bash
|
|
283
|
+
singbox-iac init
|
|
284
|
+
singbox-iac setup
|
|
285
|
+
singbox-iac author
|
|
286
|
+
singbox-iac build
|
|
287
|
+
singbox-iac check
|
|
288
|
+
singbox-iac apply
|
|
289
|
+
singbox-iac run
|
|
290
|
+
singbox-iac verify
|
|
291
|
+
singbox-iac update
|
|
292
|
+
singbox-iac doctor
|
|
293
|
+
singbox-iac schedule install
|
|
294
|
+
singbox-iac schedule remove
|
|
295
|
+
singbox-iac templates list
|
|
296
|
+
```
|
|
225
297
|
|
|
226
|
-
|
|
298
|
+
## 项目结构
|
|
227
299
|
|
|
228
|
-
-
|
|
229
|
-
-
|
|
230
|
-
-
|
|
300
|
+
- [rules-dsl.md](./docs/rules-dsl.md)
|
|
301
|
+
- [rule-templates.md](./docs/rule-templates.md)
|
|
302
|
+
- [natural-language-authoring.md](./docs/natural-language-authoring.md)
|
|
303
|
+
- [runtime-on-macos.md](./docs/runtime-on-macos.md)
|
|
304
|
+
- [openspec/project.md](./openspec/project.md)
|
|
231
305
|
|
|
232
|
-
|
|
306
|
+
## 当前状态
|
|
233
307
|
|
|
234
|
-
|
|
235
|
-
- selector default changes
|
|
236
|
-
- verification expectation updates
|
|
308
|
+
项目已经是一个可用的 MVP+ CLI:
|
|
237
309
|
|
|
238
|
-
|
|
310
|
+
- 真实订阅拉取可用
|
|
311
|
+
- 真实路由验证可用
|
|
312
|
+
- 真实发布链路可用
|
|
313
|
+
- 自然语言作者层可用
|
|
314
|
+
- npm 包已发布
|
|
315
|
+
- macOS `launchd` 集成可用
|
|
239
316
|
|
|
240
|
-
|
|
317
|
+
当前最值得继续推进的方向:
|
|
241
318
|
|
|
242
|
-
-
|
|
243
|
-
-
|
|
244
|
-
-
|
|
245
|
-
-
|
|
319
|
+
- 支持 Trojan 之外的更多协议
|
|
320
|
+
- 提升自然语言覆盖范围
|
|
321
|
+
- 增加更多本地 AI CLI provider preset
|
|
322
|
+
- 把首次上手继续收敛到真正的一键可用
|
|
246
323
|
|
|
247
|
-
|
|
324
|
+
## 参与贡献
|
|
248
325
|
|
|
249
|
-
|
|
250
|
-
./node_modules/.bin/tsx src/cli/index.ts author \
|
|
251
|
-
--config ./builder.config.local.yaml \
|
|
252
|
-
--provider deterministic \
|
|
253
|
-
--prompt "Google 服务和 GitHub 这类开发类都走香港,Gemini 走新加坡,Antigravity 进程级走美国,每30分钟自动更新" \
|
|
254
|
-
--update
|
|
255
|
-
```
|
|
326
|
+
欢迎提交 issue、PR 和场景反馈,详见 [CONTRIBUTING.md](./CONTRIBUTING.md)。
|
|
256
327
|
|
|
257
|
-
|
|
328
|
+
特别欢迎:
|
|
258
329
|
|
|
259
|
-
-
|
|
330
|
+
- 新的开发者场景模板
|
|
331
|
+
- 不同机场订阅的兼容性样本
|
|
332
|
+
- 自然语言规则表达改进
|
|
333
|
+
- 新的验证用例
|
|
260
334
|
|
|
261
|
-
##
|
|
335
|
+
## 许可证
|
|
262
336
|
|
|
263
|
-
|
|
264
|
-
- [sing-box documentation](https://sing-box.sagernet.org/configuration/)
|
|
265
|
-
- [sing-box migration guide](https://sing-box.sagernet.org/migration/)
|
|
337
|
+
[MIT](./LICENSE)
|
|
@@ -2,5 +2,10 @@ import type { BuilderConfig } from "../config/schema.js";
|
|
|
2
2
|
export interface SharedCommandOptions {
|
|
3
3
|
readonly config?: string;
|
|
4
4
|
}
|
|
5
|
+
export declare function getDefaultConfigDir(): string;
|
|
6
|
+
export declare function getDefaultConfigPath(): string;
|
|
7
|
+
export declare function getDefaultRulesPath(): string;
|
|
5
8
|
export declare function resolveBuilderConfig(options: SharedCommandOptions): Promise<BuilderConfig | undefined>;
|
|
6
9
|
export declare function findDefaultConfigPath(): Promise<string | undefined>;
|
|
10
|
+
export declare function resolvePackageRoot(moduleUrl: string): string;
|
|
11
|
+
export declare function resolveCliEntrypoint(moduleUrl: string): string;
|
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
import { constants } from "node:fs";
|
|
2
2
|
import { access } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
3
4
|
import path from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
4
6
|
import { loadConfig } from "../config/load-config.js";
|
|
5
|
-
|
|
7
|
+
export function getDefaultConfigDir() {
|
|
8
|
+
return path.join(homedir(), ".config", "singbox-iac");
|
|
9
|
+
}
|
|
10
|
+
export function getDefaultConfigPath() {
|
|
11
|
+
return path.join(getDefaultConfigDir(), "builder.config.yaml");
|
|
12
|
+
}
|
|
13
|
+
export function getDefaultRulesPath() {
|
|
14
|
+
return path.join(getDefaultConfigDir(), "rules", "custom.rules.yaml");
|
|
15
|
+
}
|
|
6
16
|
export async function resolveBuilderConfig(options) {
|
|
7
17
|
if (options.config) {
|
|
8
18
|
return loadConfig(options.config);
|
|
@@ -14,8 +24,7 @@ export async function resolveBuilderConfig(options) {
|
|
|
14
24
|
return loadConfig(configPath);
|
|
15
25
|
}
|
|
16
26
|
export async function findDefaultConfigPath() {
|
|
17
|
-
for (const
|
|
18
|
-
const filePath = path.resolve(process.cwd(), candidate);
|
|
27
|
+
for (const filePath of getDefaultConfigCandidates()) {
|
|
19
28
|
if (await fileExists(filePath)) {
|
|
20
29
|
return filePath;
|
|
21
30
|
}
|
|
@@ -31,4 +40,19 @@ async function fileExists(filePath) {
|
|
|
31
40
|
return false;
|
|
32
41
|
}
|
|
33
42
|
}
|
|
43
|
+
function getDefaultConfigCandidates() {
|
|
44
|
+
return [
|
|
45
|
+
path.resolve(process.cwd(), "builder.config.local.yaml"),
|
|
46
|
+
path.resolve(process.cwd(), "builder.config.yaml"),
|
|
47
|
+
getDefaultConfigPath(),
|
|
48
|
+
];
|
|
49
|
+
}
|
|
50
|
+
export function resolvePackageRoot(moduleUrl) {
|
|
51
|
+
return path.resolve(path.dirname(fileURLToPath(moduleUrl)), "../../..");
|
|
52
|
+
}
|
|
53
|
+
export function resolveCliEntrypoint(moduleUrl) {
|
|
54
|
+
const commandModulePath = fileURLToPath(moduleUrl);
|
|
55
|
+
const extension = path.extname(commandModulePath);
|
|
56
|
+
return path.resolve(path.dirname(commandModulePath), "..", `index${extension}`);
|
|
57
|
+
}
|
|
34
58
|
//# sourceMappingURL=command-helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-helpers.js","sourceRoot":"","sources":["../../src/cli/command-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"command-helpers.js","sourceRoot":"","sources":["../../src/cli/command-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAOtD,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,qBAAqB,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAA6B;IAE7B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,qBAAqB,EAAE,CAAC;IACjD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,KAAK,MAAM,QAAQ,IAAI,0BAA0B,EAAE,EAAE,CAAC;QACpD,IAAI,MAAM,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B;IACjC,OAAO;QACL,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,2BAA2B,CAAC;QACxD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,qBAAqB,CAAC;QAClD,oBAAoB,EAAE;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAClD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,MAAM,iBAAiB,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,QAAQ,SAAS,EAAE,CAAC,CAAC;AAClF,CAAC"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import { fileURLToPath } from "node:url";
|
|
3
2
|
import { generateAuthoringPlan } from "../../modules/authoring/index.js";
|
|
4
3
|
import { buildConfigArtifact } from "../../modules/build/index.js";
|
|
5
4
|
import { applyPlanToBuilderConfig, updateBuilderAuthoring, writeGeneratedRules, } from "../../modules/natural-language/index.js";
|
|
6
5
|
import { generateAuthoringPreview } from "../../modules/preview/index.js";
|
|
7
6
|
import { installLaunchdSchedule } from "../../modules/schedule/index.js";
|
|
8
7
|
import { runUpdate } from "../../modules/update/index.js";
|
|
9
|
-
import { findDefaultConfigPath, resolveBuilderConfig } from "../command-helpers.js";
|
|
8
|
+
import { findDefaultConfigPath, resolveBuilderConfig, resolveCliEntrypoint, } from "../command-helpers.js";
|
|
10
9
|
export function registerAuthorCommand(program) {
|
|
11
10
|
program
|
|
12
11
|
.command("author")
|
|
@@ -183,11 +182,6 @@ export function registerAuthorCommand(program) {
|
|
|
183
182
|
function resolvePath(filePath) {
|
|
184
183
|
return filePath.startsWith("/") ? filePath : path.resolve(process.cwd(), filePath);
|
|
185
184
|
}
|
|
186
|
-
function resolveCliEntrypoint(moduleUrl) {
|
|
187
|
-
const commandModulePath = fileURLToPath(moduleUrl);
|
|
188
|
-
const extension = path.extname(commandModulePath);
|
|
189
|
-
return path.resolve(path.dirname(commandModulePath), "..", `index${extension}`);
|
|
190
|
-
}
|
|
191
185
|
function collectOption(value, previous) {
|
|
192
186
|
return [...previous, value];
|
|
193
187
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"author.js","sourceRoot":"","sources":["../../../src/cli/commands/author.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"author.js","sourceRoot":"","sources":["../../../src/cli/commands/author.ts"],"names":[],"mappings":"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"}
|