@singbox-iac/cli 0.1.0 → 0.1.2

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.
@@ -1,19 +1,19 @@
1
- import { homedir } from "node:os";
2
1
  import path from "node:path";
3
2
  import { initWorkspace } from "../../modules/init/index.js";
3
+ import { getDefaultConfigPath, getDefaultRulesPath, resolvePackageRoot, } from "../command-helpers.js";
4
4
  export function registerInitCommand(program) {
5
5
  program
6
6
  .command("init")
7
7
  .description("Create example singbox-iac configuration assets.")
8
- .option("-c, --config-out <path>", "path to write builder config", "builder.config.local.yaml")
9
- .option("--rules-out <path>", "path to write the custom rules YAML", path.join(homedir(), ".config", "singbox-iac", "rules", "custom.rules.yaml"))
8
+ .option("-c, --config-out <path>", "path to write builder config", getDefaultConfigPath())
9
+ .option("--rules-out <path>", "path to write the custom rules YAML", getDefaultRulesPath())
10
10
  .option("--subscription-url <url>", "seed the generated config with a real subscription URL")
11
11
  .option("-f, --force", "overwrite existing generated assets")
12
12
  .action(async (options) => {
13
13
  const result = await initWorkspace({
14
14
  configOutPath: path.resolve(options.configOut),
15
15
  rulesOutPath: path.resolve(options.rulesOut),
16
- examplesDir: path.resolve(process.cwd(), "examples"),
16
+ examplesDir: path.join(resolvePackageRoot(import.meta.url), "examples"),
17
17
  ...(options.subscriptionUrl ? { subscriptionUrl: options.subscriptionUrl } : {}),
18
18
  force: options.force === true,
19
19
  });
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,yBAAyB,EAAE,8BAA8B,EAAE,2BAA2B,CAAC;SAC9F,MAAM,CACL,oBAAoB,EACpB,qCAAqC,EACrC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAC7E;SACA,MAAM,CAAC,0BAA0B,EAAE,wDAAwD,CAAC;SAC5F,MAAM,CAAC,aAAa,EAAE,qCAAqC,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;YACjC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YAC9C,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC5C,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC;YACpD,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,IAAI;SAC9B,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,CAAC,WAAW,MAAM,CAAC,UAAU,EAAE,EAAE,UAAU,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACjF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,yBAAyB,EAAE,8BAA8B,EAAE,oBAAoB,EAAE,CAAC;SACzF,MAAM,CAAC,oBAAoB,EAAE,qCAAqC,EAAE,mBAAmB,EAAE,CAAC;SAC1F,MAAM,CAAC,0BAA0B,EAAE,wDAAwD,CAAC;SAC5F,MAAM,CAAC,aAAa,EAAE,qCAAqC,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,EAAE;QAC5C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC;YACjC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;YAC9C,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC5C,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC;YACvE,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,IAAI;SAC9B,CAAC,CAAC;QAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,CAAC,WAAW,MAAM,CAAC,UAAU,EAAE,EAAE,UAAU,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACjF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerSetupCommand(program: Command): void;
@@ -0,0 +1,356 @@
1
+ import { spawn } from "node:child_process";
2
+ import { constants } from "node:fs";
3
+ import { access } from "node:fs/promises";
4
+ import net from "node:net";
5
+ import path from "node:path";
6
+ import { loadConfig } from "../../config/load-config.js";
7
+ import { generateAuthoringPlan } from "../../modules/authoring/index.js";
8
+ import { buildConfigArtifact } from "../../modules/build/index.js";
9
+ import { runDoctor } from "../../modules/doctor/index.js";
10
+ import { initWorkspace } from "../../modules/init/index.js";
11
+ import { applyConfig, checkConfig, resolveSingBoxBinary } from "../../modules/manager/index.js";
12
+ import { applyPlanToBuilderConfig, selectVerificationScenariosForPrompt, updateBuilderAuthoring, writeGeneratedRules, } from "../../modules/natural-language/index.js";
13
+ import { syncLocalRuleSets } from "../../modules/rule-set-sync/index.js";
14
+ import { installLaunchdSchedule } from "../../modules/schedule/index.js";
15
+ import { assertVerificationReportPassed, openVisibleChromeWindows, verifyConfigRoutes, } from "../../modules/verification/index.js";
16
+ import { getDefaultConfigPath, getDefaultRulesPath, resolveCliEntrypoint, resolvePackageRoot, } from "../command-helpers.js";
17
+ export function registerSetupCommand(program) {
18
+ program
19
+ .command("setup")
20
+ .description("One-step setup: initialize config, sync rule sets, optionally author rules, and build.")
21
+ .option("-c, --config <path>", "path to builder config YAML", getDefaultConfigPath())
22
+ .option("--rules-out <path>", "target custom-rules file for first-time setup", getDefaultRulesPath())
23
+ .option("--subscription-url <url>", "subscription URL; required on first setup")
24
+ .option("--subscription-file <path>", "use a local subscription file for the initial build")
25
+ .option("-p, --prompt <text>", "optional natural-language routing prompt")
26
+ .option("--provider <provider>", "authoring provider: deterministic, auto, claude, exec")
27
+ .option("--author-timeout-ms <ms>", "timeout for local AI CLI authoring")
28
+ .option("--exec-command <command>", "command for the exec authoring provider")
29
+ .option("--exec-arg <arg>", "append one argument for the exec authoring provider", collectOption, [])
30
+ .option("--skip-rulesets", "skip syncing the configured local rule sets")
31
+ .option("--skip-build", "create/update configuration only and skip the initial build")
32
+ .option("--no-doctor", "skip environment checks during setup")
33
+ .option("--verify", "run runtime verification after the initial build")
34
+ .option("--apply", "publish the generated config to the configured live path")
35
+ .option("--reload", "reload sing-box after a successful publish")
36
+ .option("--run", "run sing-box in the foreground after setup completes")
37
+ .option("--open-browser", "open isolated Chrome windows for prompt-relevant verification URLs")
38
+ .option("--ready", "run the guided first-run activation flow: doctor, verify, publish, and install the schedule")
39
+ .option("--sing-box-bin <path>", "path to sing-box binary")
40
+ .option("--chrome-bin <path>", "path to Chrome binary")
41
+ .option("--install-schedule", "install a launchd job after setup")
42
+ .option("--label <label>", "LaunchAgent label", "org.singbox-iac.update")
43
+ .option("--launch-agents-dir <path>", "override LaunchAgents directory")
44
+ .option("--logs-dir <path>", "override launchd log directory")
45
+ .option("-f, --force", "overwrite generated files during first-time setup and re-download rulesets")
46
+ .option("--no-load", "write the LaunchAgent without calling launchctl bootstrap")
47
+ .action(async (options) => {
48
+ const configPath = resolvePath(options.config);
49
+ const rulesPath = resolvePath(options.rulesOut);
50
+ const createdFreshConfig = options.force === true || !(await pathExists(configPath));
51
+ if (createdFreshConfig) {
52
+ if (!options.subscriptionUrl) {
53
+ throw new Error("setup needs --subscription-url the first time. Existing configs can omit it.");
54
+ }
55
+ await initWorkspace({
56
+ configOutPath: configPath,
57
+ rulesOutPath: rulesPath,
58
+ examplesDir: path.join(resolvePackageRoot(import.meta.url), "examples"),
59
+ subscriptionUrl: options.subscriptionUrl,
60
+ force: options.force === true,
61
+ });
62
+ }
63
+ let builderConfig = await loadConfig(configPath);
64
+ if (!createdFreshConfig && options.subscriptionUrl) {
65
+ await updateBuilderAuthoring({
66
+ configPath,
67
+ subscriptionUrl: options.subscriptionUrl,
68
+ });
69
+ builderConfig = await loadConfig(configPath);
70
+ }
71
+ let effectiveConfig = builderConfig;
72
+ let planSummary;
73
+ if (options.prompt) {
74
+ const planResult = await generateAuthoringPlan({
75
+ prompt: options.prompt,
76
+ config: builderConfig,
77
+ ...(options.provider ? { provider: options.provider } : {}),
78
+ ...(options.authorTimeoutMs
79
+ ? { timeoutMs: Number.parseInt(options.authorTimeoutMs, 10) }
80
+ : {}),
81
+ ...(options.execCommand ? { execCommand: options.execCommand } : {}),
82
+ ...(options.execArg.length > 0 ? { execArgs: options.execArg } : {}),
83
+ });
84
+ effectiveConfig = applyPlanToBuilderConfig(builderConfig, {
85
+ rulesPath: builderConfig.rules.userRulesFile,
86
+ plan: planResult.plan,
87
+ });
88
+ await writeGeneratedRules({
89
+ filePath: effectiveConfig.rules.userRulesFile,
90
+ plan: planResult.plan,
91
+ });
92
+ await updateBuilderAuthoring({
93
+ configPath,
94
+ rulesPath: effectiveConfig.rules.userRulesFile,
95
+ ...(planResult.plan.scheduleIntervalMinutes
96
+ ? { intervalMinutes: planResult.plan.scheduleIntervalMinutes }
97
+ : {}),
98
+ ...(planResult.plan.groupDefaults
99
+ ? { groupDefaults: planResult.plan.groupDefaults }
100
+ : {}),
101
+ ...(planResult.plan.verificationOverrides
102
+ ? { verificationOverrides: planResult.plan.verificationOverrides }
103
+ : {}),
104
+ });
105
+ builderConfig = await loadConfig(configPath);
106
+ effectiveConfig = builderConfig;
107
+ planSummary = {
108
+ providerRequested: planResult.providerRequested,
109
+ providerUsed: planResult.providerUsed,
110
+ templates: planResult.plan.templateIds,
111
+ generatedRules: planResult.plan.beforeBuiltins.length + planResult.plan.afterBuiltins.length,
112
+ notes: planResult.plan.notes,
113
+ };
114
+ }
115
+ const lines = [`Config: ${configPath}`, `Rules: ${effectiveConfig.rules.userRulesFile}`];
116
+ const shouldDoctor = options.doctor !== false || options.ready === true;
117
+ const shouldVerify = options.verify === true || options.ready === true;
118
+ const shouldApply = options.apply === true || options.ready === true;
119
+ const shouldInstallSchedule = options.installSchedule === true || options.ready === true;
120
+ const shouldRun = options.run === true;
121
+ const shouldOpenBrowser = options.openBrowser === true || (options.ready === true && options.run === true);
122
+ if (options.skipBuild && (shouldVerify || shouldApply)) {
123
+ throw new Error("setup cannot use --skip-build together with --verify or --apply.");
124
+ }
125
+ if (options.skipBuild && shouldRun) {
126
+ throw new Error("setup cannot use --skip-build together with --run.");
127
+ }
128
+ if (shouldDoctor) {
129
+ const doctorReport = await runDoctor({
130
+ config: effectiveConfig,
131
+ configPath,
132
+ ...(options.singBoxBin ? { singBoxBinary: resolvePath(options.singBoxBin) } : {}),
133
+ ...(options.chromeBin ? { chromeBinary: resolvePath(options.chromeBin) } : {}),
134
+ ...(options.launchAgentsDir
135
+ ? { launchAgentsDir: resolvePath(options.launchAgentsDir) }
136
+ : {}),
137
+ });
138
+ lines.push(...formatDoctorSummary(doctorReport));
139
+ }
140
+ if (options.skipRulesets) {
141
+ lines.push("Rule sets: skipped");
142
+ }
143
+ else {
144
+ const syncResult = await syncLocalRuleSets({
145
+ ruleSets: effectiveConfig.ruleSets,
146
+ force: options.force === true,
147
+ });
148
+ lines.push(`Rule sets: downloaded ${syncResult.downloaded.length}, skipped ${syncResult.skipped.length}, failed ${syncResult.failed.length}`);
149
+ if (syncResult.failed.length > 0) {
150
+ lines.push(...syncResult.failed.map((failure) => `- ${failure.tag}: ${failure.reason}`));
151
+ }
152
+ }
153
+ if (planSummary) {
154
+ lines.push(`Provider requested: ${planSummary.providerRequested}`);
155
+ lines.push(`Provider used: ${planSummary.providerUsed}`);
156
+ lines.push(`Templates: ${planSummary.templates.length > 0 ? planSummary.templates.join(", ") : "(none)"}`);
157
+ lines.push(`Generated rules: ${planSummary.generatedRules}`);
158
+ if (planSummary.notes.length > 0) {
159
+ lines.push(...planSummary.notes.map((note) => `- ${note}`));
160
+ }
161
+ }
162
+ let buildSummary;
163
+ let schedulePath;
164
+ if (options.skipBuild) {
165
+ lines.push("Staging: skipped");
166
+ }
167
+ else {
168
+ const build = await buildConfigArtifact({
169
+ config: effectiveConfig,
170
+ ...(options.subscriptionFile
171
+ ? { subscriptionFile: resolvePath(options.subscriptionFile) }
172
+ : {}),
173
+ ...(options.subscriptionUrl ? { subscriptionUrl: options.subscriptionUrl } : {}),
174
+ });
175
+ lines.push(`Staging: ${build.outputPath}`);
176
+ lines.push(`Nodes: ${build.nodeCount}`);
177
+ let verification;
178
+ if (shouldVerify) {
179
+ verification = await verifyConfigRoutes({
180
+ configPath: build.outputPath,
181
+ ...(options.singBoxBin ? { singBoxBinary: resolvePath(options.singBoxBin) } : {}),
182
+ ...(options.chromeBin ? { chromeBinary: resolvePath(options.chromeBin) } : {}),
183
+ configuredScenarios: effectiveConfig.verification.scenarios,
184
+ });
185
+ assertVerificationReportPassed(verification);
186
+ lines.push(`Verified scenarios: ${verification.scenarios.filter((scenario) => scenario.passed).length}/${verification.scenarios.length}`);
187
+ }
188
+ if (shouldApply) {
189
+ await applyConfig({
190
+ stagingPath: build.outputPath,
191
+ livePath: effectiveConfig.output.livePath,
192
+ ...(effectiveConfig.output.backupPath
193
+ ? { backupPath: effectiveConfig.output.backupPath }
194
+ : {}),
195
+ ...(options.singBoxBin ? { singBoxBinary: resolvePath(options.singBoxBin) } : {}),
196
+ reload: options.reload === true,
197
+ runtime: effectiveConfig.runtime.reload,
198
+ });
199
+ lines.push(`Live: ${effectiveConfig.output.livePath}`);
200
+ if (effectiveConfig.output.backupPath) {
201
+ lines.push(`Backup: ${effectiveConfig.output.backupPath}`);
202
+ }
203
+ }
204
+ buildSummary = {
205
+ outputPath: build.outputPath,
206
+ nodeCount: build.nodeCount,
207
+ ...(verification ? { verification } : {}),
208
+ };
209
+ }
210
+ if (shouldInstallSchedule) {
211
+ const schedule = await installLaunchdSchedule({
212
+ configPath,
213
+ intervalMinutes: effectiveConfig.schedule.intervalMinutes,
214
+ cliEntrypoint: resolveCliEntrypoint(import.meta.url),
215
+ label: options.label,
216
+ ...(options.launchAgentsDir
217
+ ? { launchAgentsDir: resolvePath(options.launchAgentsDir) }
218
+ : {}),
219
+ ...(options.logsDir ? { logsDir: resolvePath(options.logsDir) } : {}),
220
+ force: options.force === true,
221
+ load: options.load !== false,
222
+ });
223
+ schedulePath = schedule.plistPath;
224
+ lines.push(`LaunchAgent: ${schedule.plistPath}`);
225
+ }
226
+ lines.push(`Proxy ports: mixed ${effectiveConfig.listeners.mixed.listen}:${effectiveConfig.listeners.mixed.port}, proxifier ${effectiveConfig.listeners.proxifier.listen}:${effectiveConfig.listeners.proxifier.port}`);
227
+ if (shouldApply) {
228
+ lines.push("Next: sing-box run -c ~/.config/sing-box/config.json");
229
+ if (schedulePath) {
230
+ lines.push("Schedule: installed and ready for recurring updates");
231
+ }
232
+ else {
233
+ lines.push("Next: singbox-iac schedule install");
234
+ }
235
+ }
236
+ else if (buildSummary) {
237
+ lines.push("Next: singbox-iac run");
238
+ lines.push("Next: singbox-iac update --reload");
239
+ }
240
+ process.stdout.write(`${lines.join("\n")}\n`);
241
+ if (!shouldRun || !buildSummary) {
242
+ return;
243
+ }
244
+ const runConfigPath = shouldApply ? effectiveConfig.output.livePath : buildSummary.outputPath;
245
+ const singBoxBinary = await resolveSingBoxBinary(options.singBoxBin ? resolvePath(options.singBoxBin) : undefined);
246
+ await checkConfig({
247
+ configPath: runConfigPath,
248
+ singBoxBinary,
249
+ });
250
+ const child = spawn(singBoxBinary, ["run", "-c", runConfigPath], {
251
+ stdio: "inherit",
252
+ });
253
+ try {
254
+ await waitForPorts([
255
+ {
256
+ host: effectiveConfig.listeners.mixed.listen,
257
+ port: effectiveConfig.listeners.mixed.port,
258
+ },
259
+ {
260
+ host: effectiveConfig.listeners.proxifier.listen,
261
+ port: effectiveConfig.listeners.proxifier.port,
262
+ },
263
+ ], 15_000);
264
+ if (shouldOpenBrowser) {
265
+ const selectedScenarios = options.prompt
266
+ ? selectVerificationScenariosForPrompt(options.prompt, effectiveConfig.verification.scenarios)
267
+ : effectiveConfig.verification.scenarios.slice(0, Math.min(3, effectiveConfig.verification.scenarios.length));
268
+ const visibleScenarios = selectedScenarios.map((scenario) => ({
269
+ id: scenario.id,
270
+ name: scenario.name,
271
+ url: scenario.url,
272
+ inbound: scenario.inbound,
273
+ }));
274
+ const launches = await openVisibleChromeWindows({
275
+ scenarios: visibleScenarios,
276
+ mixedPort: effectiveConfig.listeners.mixed.port,
277
+ proxifierPort: effectiveConfig.listeners.proxifier.port,
278
+ ...(options.chromeBin ? { chromeBinary: resolvePath(options.chromeBin) } : {}),
279
+ });
280
+ process.stdout.write(`${launches
281
+ .map((launch) => `Opened Chrome for ${launch.inbound} on ${launch.urls.join(", ")} via 127.0.0.1:${launch.proxyPort}`)
282
+ .join("\n")}\n`);
283
+ }
284
+ process.stdout.write(`Running sing-box in foreground: ${runConfigPath}\n`);
285
+ const exitCode = await new Promise((resolve, reject) => {
286
+ child.on("error", reject);
287
+ child.on("close", (code) => resolve(code ?? 0));
288
+ });
289
+ process.exitCode = exitCode;
290
+ }
291
+ finally {
292
+ if (!child.killed && child.exitCode === null) {
293
+ child.kill("SIGINT");
294
+ }
295
+ }
296
+ });
297
+ }
298
+ function resolvePath(filePath) {
299
+ return filePath.startsWith("/") ? filePath : path.resolve(process.cwd(), filePath);
300
+ }
301
+ function collectOption(value, previous) {
302
+ return [...previous, value];
303
+ }
304
+ function formatDoctorSummary(report) {
305
+ const passCount = report.checks.filter((check) => check.status === "PASS").length;
306
+ const warnCount = report.checks.filter((check) => check.status === "WARN").length;
307
+ const failCount = report.checks.filter((check) => check.status === "FAIL").length;
308
+ const lines = [`Doctor: PASS ${passCount}, WARN ${warnCount}, FAIL ${failCount}`];
309
+ for (const check of report.checks.filter((entry) => entry.status !== "PASS" ||
310
+ entry.name === "sing-box" ||
311
+ entry.name === "chrome" ||
312
+ entry.name === "local-ai-clis")) {
313
+ lines.push(`- [${check.status}] ${check.name}: ${check.details}`);
314
+ }
315
+ return lines;
316
+ }
317
+ async function pathExists(filePath) {
318
+ try {
319
+ await access(filePath, constants.F_OK);
320
+ return true;
321
+ }
322
+ catch {
323
+ return false;
324
+ }
325
+ }
326
+ async function waitForPorts(ports, timeoutMs) {
327
+ const startedAt = Date.now();
328
+ while (Date.now() - startedAt < timeoutMs) {
329
+ const allReady = await Promise.all(ports.map((entry) => isTcpPortOpen(entry.host, entry.port)));
330
+ if (allReady.every(Boolean)) {
331
+ return;
332
+ }
333
+ await new Promise((resolve) => setTimeout(resolve, 250));
334
+ }
335
+ throw new Error(`Timed out waiting for local listeners: ${ports
336
+ .map((entry) => `${entry.host}:${entry.port}`)
337
+ .join(", ")}`);
338
+ }
339
+ async function isTcpPortOpen(host, port) {
340
+ return new Promise((resolve) => {
341
+ const socket = net.createConnection({ host, port });
342
+ socket.setTimeout(500);
343
+ socket.on("connect", () => {
344
+ socket.destroy();
345
+ resolve(true);
346
+ });
347
+ socket.on("timeout", () => {
348
+ socket.destroy();
349
+ resolve(false);
350
+ });
351
+ socket.on("error", () => {
352
+ resolve(false);
353
+ });
354
+ });
355
+ }
356
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -11,6 +11,7 @@ import { registerInitCommand } from "./commands/init.js";
11
11
  import { registerReloadCommand } from "./commands/reload.js";
12
12
  import { registerRunCommand } from "./commands/run.js";
13
13
  import { registerScheduleCommand } from "./commands/schedule.js";
14
+ import { registerSetupCommand } from "./commands/setup.js";
14
15
  import { registerTemplatesCommand } from "./commands/templates.js";
15
16
  import { registerUpdateCommand } from "./commands/update.js";
16
17
  import { registerVerifyCommand } from "./commands/verify.js";
@@ -19,8 +20,9 @@ export function createProgram() {
19
20
  program
20
21
  .name("singbox-iac")
21
22
  .description("Policy-first subscription compiler for sing-box on macOS.")
22
- .version("0.1.0");
23
+ .version("0.1.2");
23
24
  registerInitCommand(program);
25
+ registerSetupCommand(program);
24
26
  registerAuthorCommand(program);
25
27
  registerBuildCommand(program);
26
28
  registerCheckCommand(program);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,aAAa,CAAC;SACnB,WAAW,CAAC,2DAA2D,CAAC;SACxE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAElC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAAoB,EAAE,QAA4B;IACtF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,KAAK,QAAQ,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,IAAI,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,aAAa,CAAC;SACnB,WAAW,CAAC,2DAA2D,CAAC;SACxE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAElC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAc;IACtC,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAAoB,EAAE,QAA4B;IACtF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,OAAO,CAAC,KAAK,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,KAAK,QAAQ,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,IAAI,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  export async function fetchSubscription(input) {
2
- const userAgents = ["subconverter/1.0", "curl/8.7.1", "singbox-iac-builder/0.1.0"];
2
+ const userAgents = ["subconverter/1.0", "curl/8.7.1", "singbox-iac/0.1.0"];
3
3
  let fallbackContent = "";
4
4
  for (const userAgent of userAgents) {
5
5
  const response = await fetch(input.url, {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/fetcher/index.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA6B;IACnE,MAAM,UAAU,GAAG,CAAC,kBAAkB,EAAE,YAAY,EAAE,2BAA2B,CAAC,CAAC;IACnF,IAAI,eAAe,GAAG,EAAE,CAAC;IAEzB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;YACtC,OAAO,EAAE;gBACP,MAAM,EAAE,gBAAgB;gBACxB,YAAY,EAAE,SAAS;aACxB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,SAAS;QACX,CAAC;QAED,IAAI,4BAA4B,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,eAAe,GAAG,OAAO,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,4BAA4B,CAAC,OAAe;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvF,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC;SAC9E,QAAQ,CAAC,MAAM,CAAC;SAChB,IAAI,EAAE,CAAC;IAEV,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/fetcher/index.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAA6B;IACnE,MAAM,UAAU,GAAG,CAAC,kBAAkB,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;IAC3E,IAAI,eAAe,GAAG,EAAE,CAAC;IAEzB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;YACtC,OAAO,EAAE;gBACP,MAAM,EAAE,gBAAgB;gBACxB,YAAY,EAAE,SAAS;aACxB;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7F,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,SAAS;QACX,CAAC;QAED,IAAI,4BAA4B,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,eAAe,GAAG,OAAO,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,4BAA4B,CAAC,OAAe;IACnD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvF,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,EAAE,QAAQ,CAAC;SAC9E,QAAQ,CAAC,MAAM,CAAC;SAChB,IAAI,EAAE,CAAC;IAEV,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC"}
@@ -24,7 +24,15 @@ export interface NaturalLanguagePlan {
24
24
  }>;
25
25
  readonly verificationOverrides?: readonly NaturalLanguageVerificationOverride[];
26
26
  }
27
+ export interface PromptSelectableVerificationScenario {
28
+ readonly id: string;
29
+ readonly name: string;
30
+ readonly url: string;
31
+ readonly inbound: "in-mixed" | "in-proxifier";
32
+ readonly expectedOutbound: string;
33
+ }
27
34
  export declare function generateRulesFromPrompt(prompt: string): NaturalLanguagePlan;
35
+ export declare function selectVerificationScenariosForPrompt(prompt: string, scenarios: readonly PromptSelectableVerificationScenario[]): readonly PromptSelectableVerificationScenario[];
28
36
  export declare function writeGeneratedRules(input: {
29
37
  readonly filePath: string;
30
38
  readonly plan: NaturalLanguagePlan;
@@ -37,6 +45,7 @@ export declare function updateBuilderSchedule(input: {
37
45
  export declare function updateBuilderAuthoring(input: {
38
46
  readonly configPath: string;
39
47
  readonly rulesPath?: string;
48
+ readonly subscriptionUrl?: string;
40
49
  readonly intervalMinutes?: number;
41
50
  readonly groupDefaults?: NaturalLanguagePlan["groupDefaults"];
42
51
  readonly verificationOverrides?: NaturalLanguagePlan["verificationOverrides"];
@@ -44,6 +53,7 @@ export declare function updateBuilderAuthoring(input: {
44
53
  export declare function renderUpdatedBuilderConfig(input: {
45
54
  readonly rawConfig: string;
46
55
  readonly rulesPath?: string;
56
+ readonly subscriptionUrl?: string;
47
57
  readonly intervalMinutes?: number;
48
58
  readonly groupDefaults?: NaturalLanguagePlan["groupDefaults"];
49
59
  readonly verificationOverrides?: NaturalLanguagePlan["verificationOverrides"];
@@ -40,6 +40,8 @@ const categoryTemplateDefinitions = [
40
40
  aliases: [
41
41
  "ai工具",
42
42
  "ai 工具",
43
+ "ai类",
44
+ "ai 类",
43
45
  "ai tools",
44
46
  "third-party ai",
45
47
  "developer ai",
@@ -49,7 +51,15 @@ const categoryTemplateDefinitions = [
49
51
  templateId: "developer-ai-sites",
50
52
  },
51
53
  {
52
- aliases: ["开发者网站", "开发工具网站", "developer sites", "developer tools", "dev sites"],
54
+ aliases: [
55
+ "开发者网站",
56
+ "开发者网站类",
57
+ "开发工具网站",
58
+ "开发工具网站类",
59
+ "developer sites",
60
+ "developer tools",
61
+ "dev sites",
62
+ ],
53
63
  templateId: "developer-common-sites",
54
64
  },
55
65
  {
@@ -180,6 +190,65 @@ export function generateRulesFromPrompt(prompt) {
180
190
  ...(verificationOverrides.length > 0 ? { verificationOverrides } : {}),
181
191
  };
182
192
  }
193
+ export function selectVerificationScenariosForPrompt(prompt, scenarios) {
194
+ const text = normalizePrompt(prompt);
195
+ const clauses = splitClauses(text);
196
+ const selected = new Map();
197
+ for (const clause of clauses) {
198
+ const requestedDomains = new Set();
199
+ for (const definition of siteAliasDefinitions) {
200
+ if (definition.aliases.some((alias) => clause.includes(alias))) {
201
+ for (const domain of definition.domains) {
202
+ requestedDomains.add(domain);
203
+ }
204
+ }
205
+ }
206
+ for (const domain of extractExplicitDomains(clause)) {
207
+ requestedDomains.add(domain);
208
+ }
209
+ const wantsProcess = processAliasDefinitions.some((alias) => clause.includes(alias));
210
+ const wantsChinaDirect = clause.includes("国内") ||
211
+ clause.includes("中国") ||
212
+ clause.includes("大陆") ||
213
+ clause.includes("直连") ||
214
+ clause.includes("direct");
215
+ const wantsAiCategory = hasTemplateAlias(clause, "developer-ai-sites");
216
+ const wantsDeveloperCategory = hasTemplateAlias(clause, "developer-common-sites") ||
217
+ clause.includes("github") ||
218
+ clause.includes("google 服务") ||
219
+ clause.includes("google services") ||
220
+ clause.includes("google");
221
+ for (const scenario of scenarios) {
222
+ const host = new URL(scenario.url).hostname.toLowerCase();
223
+ const matchesExplicitDomain = [...requestedDomains].some((domain) => host === domain || host.endsWith(`.${domain}`) || domain.endsWith(`.${host}`));
224
+ const matchesProcess = wantsProcess && scenario.inbound === "in-proxifier";
225
+ const matchesChina = wantsChinaDirect && host.endsWith("baidu.com");
226
+ const matchesAiCategory = wantsAiCategory &&
227
+ [
228
+ "chatgpt.com",
229
+ "openai.com",
230
+ "gemini.google.com",
231
+ "anthropic.com",
232
+ "claude.ai",
233
+ "openrouter.ai",
234
+ "perplexity.ai",
235
+ ].some((domain) => host === domain || host.endsWith(`.${domain}`));
236
+ const matchesDeveloperCategory = wantsDeveloperCategory &&
237
+ ["github.com", "githubusercontent.com", "google.com", "googleapis.com", "gstatic.com"].some((domain) => host === domain || host.endsWith(`.${domain}`));
238
+ if (matchesExplicitDomain ||
239
+ matchesProcess ||
240
+ matchesChina ||
241
+ matchesAiCategory ||
242
+ matchesDeveloperCategory) {
243
+ selected.set(scenario.id, scenario);
244
+ }
245
+ }
246
+ }
247
+ if (selected.size === 0) {
248
+ return scenarios.slice(0, Math.min(3, scenarios.length));
249
+ }
250
+ return scenarios.filter((scenario) => selected.has(scenario.id));
251
+ }
183
252
  export async function writeGeneratedRules(input) {
184
253
  const rendered = renderGeneratedRules(input.plan);
185
254
  await mkdir(path.dirname(input.filePath), { recursive: true });
@@ -205,6 +274,7 @@ export async function updateBuilderAuthoring(input) {
205
274
  const rendered = renderUpdatedBuilderConfig({
206
275
  rawConfig: raw,
207
276
  ...(input.rulesPath ? { rulesPath: input.rulesPath } : {}),
277
+ ...(input.subscriptionUrl ? { subscriptionUrl: input.subscriptionUrl } : {}),
208
278
  ...(input.intervalMinutes ? { intervalMinutes: input.intervalMinutes } : {}),
209
279
  ...(input.groupDefaults ? { groupDefaults: input.groupDefaults } : {}),
210
280
  ...(input.verificationOverrides ? { verificationOverrides: input.verificationOverrides } : {}),
@@ -219,6 +289,12 @@ export function renderUpdatedBuilderConfig(input) {
219
289
  userRulesFile: input.rulesPath,
220
290
  };
221
291
  }
292
+ if (input.subscriptionUrl) {
293
+ parsed.subscription = {
294
+ ...parsed.subscription,
295
+ url: input.subscriptionUrl,
296
+ };
297
+ }
222
298
  if (input.intervalMinutes) {
223
299
  parsed.schedule = {
224
300
  ...parsed.schedule,