agent-yes 1.52.1 → 1.52.3
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/dist/cli.js +21 -6
- package/package.json +1 -1
- package/ts/buildRustArgs.spec.ts +274 -0
- package/ts/buildRustArgs.ts +38 -0
- package/ts/cli.ts +3 -15
package/dist/cli.js
CHANGED
|
@@ -4505,7 +4505,7 @@ const Yargs = YargsFactory(esm_default);
|
|
|
4505
4505
|
//#endregion
|
|
4506
4506
|
//#region package.json
|
|
4507
4507
|
var name = "agent-yes";
|
|
4508
|
-
var version = "1.52.
|
|
4508
|
+
var version = "1.52.3";
|
|
4509
4509
|
|
|
4510
4510
|
//#endregion
|
|
4511
4511
|
//#region ts/parseCliArgs.ts
|
|
@@ -4879,6 +4879,25 @@ async function getRustBinary(options = {}) {
|
|
|
4879
4879
|
}
|
|
4880
4880
|
}
|
|
4881
4881
|
|
|
4882
|
+
//#endregion
|
|
4883
|
+
//#region ts/buildRustArgs.ts
|
|
4884
|
+
/**
|
|
4885
|
+
* Build arguments for the Rust binary from process.argv.
|
|
4886
|
+
*
|
|
4887
|
+
* IMPORTANT: The CLI name (e.g. "claude") must be appended at the END of the
|
|
4888
|
+
* arg list, not prepended. The Rust binary uses clap with `trailing_var_arg`,
|
|
4889
|
+
* which means once a positional arg is encountered, all subsequent args are
|
|
4890
|
+
* treated as positional — so any flags (like --timeout) after the CLI name
|
|
4891
|
+
* would be silently swallowed.
|
|
4892
|
+
*/
|
|
4893
|
+
function buildRustArgs(argv, cliFromScript, supportedClis) {
|
|
4894
|
+
const rawRustArgs = argv.slice(2).filter((arg) => arg !== "--rust" && !arg.startsWith("--rust="));
|
|
4895
|
+
const hasSwarmArg = rawRustArgs.some((arg) => arg === "--swarm" || arg.startsWith("--swarm="));
|
|
4896
|
+
const hasCliArg = rawRustArgs.some((arg) => arg.startsWith("--cli=") || arg === "--cli") || rawRustArgs.some((arg) => supportedClis.includes(arg));
|
|
4897
|
+
if (cliFromScript && !hasCliArg && !hasSwarmArg) return [...rawRustArgs, cliFromScript];
|
|
4898
|
+
return rawRustArgs;
|
|
4899
|
+
}
|
|
4900
|
+
|
|
4882
4901
|
//#endregion
|
|
4883
4902
|
//#region ts/cli.ts
|
|
4884
4903
|
const config = parseCliArgs(process.argv);
|
|
@@ -4890,11 +4909,7 @@ if (config.useRust) {
|
|
|
4890
4909
|
console.error(err instanceof Error ? err.message : String(err));
|
|
4891
4910
|
process.exit(1);
|
|
4892
4911
|
}
|
|
4893
|
-
const
|
|
4894
|
-
const hasSwarmArg = rawRustArgs.some((arg) => arg === "--swarm" || arg.startsWith("--swarm="));
|
|
4895
|
-
const cliFromScript = config.cli;
|
|
4896
|
-
const hasCliArg = rawRustArgs.some((arg) => arg.startsWith("--cli=") || arg === "--cli") || rawRustArgs.some((arg) => SUPPORTED_CLIS.includes(arg));
|
|
4897
|
-
const rustArgs = cliFromScript && !hasCliArg && !hasSwarmArg ? [cliFromScript, ...rawRustArgs] : rawRustArgs;
|
|
4912
|
+
const rustArgs = buildRustArgs(process.argv, config.cli, SUPPORTED_CLIS);
|
|
4898
4913
|
if (config.verbose) {
|
|
4899
4914
|
console.log(`[rust] Using binary: ${rustBinary}`);
|
|
4900
4915
|
console.log(`[rust] Args: ${rustArgs.join(" ")}`);
|
package/package.json
CHANGED
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
#!/usr/bin/env bun test
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { buildRustArgs } from "./buildRustArgs";
|
|
4
|
+
|
|
5
|
+
const SUPPORTED_CLIS = ["claude", "gemini", "codex", "copilot", "cursor", "grok", "qwen", "auggie", "amp", "opencode"];
|
|
6
|
+
|
|
7
|
+
// Helper: simulate argv as [node, script, ...userArgs]
|
|
8
|
+
function argv(...userArgs: string[]): string[] {
|
|
9
|
+
return ["node", "/path/to/claude-yes", ...userArgs];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
describe("buildRustArgs", () => {
|
|
13
|
+
// ─── Core: CLI name positioning ────────────────────────────────────
|
|
14
|
+
// The CLI name MUST appear after all flags to avoid clap's trailing_var_arg
|
|
15
|
+
// swallowing named flags as positional args.
|
|
16
|
+
|
|
17
|
+
describe("CLI name is always appended at the end (not prepended)", () => {
|
|
18
|
+
it("appends CLI name after flags", () => {
|
|
19
|
+
const result = buildRustArgs(argv("--timeout", "1h"), "claude", SUPPORTED_CLIS);
|
|
20
|
+
expect(result).toEqual(["--timeout", "1h", "claude"]);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("appends CLI name after multiple flags", () => {
|
|
24
|
+
const result = buildRustArgs(argv("--timeout", "30s", "--verbose", "--robust", "true"), "claude", SUPPORTED_CLIS);
|
|
25
|
+
expect(result).toEqual(["--timeout", "30s", "--verbose", "--robust", "true", "claude"]);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("CLI name is the last element", () => {
|
|
29
|
+
const result = buildRustArgs(argv("--timeout", "5m"), "codex", SUPPORTED_CLIS);
|
|
30
|
+
expect(result[result.length - 1]).toBe("codex");
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
// ─── The original bug: --timeout swallowed by trailing_var_arg ─────
|
|
35
|
+
|
|
36
|
+
describe("regression: flags must not be swallowed by CLI name position", () => {
|
|
37
|
+
it("--timeout is preserved before CLI name (the original bug)", () => {
|
|
38
|
+
const result = buildRustArgs(argv("--timeout", "1h"), "claude", SUPPORTED_CLIS);
|
|
39
|
+
const timeoutIdx = result.indexOf("--timeout");
|
|
40
|
+
const cliIdx = result.indexOf("claude");
|
|
41
|
+
expect(timeoutIdx).toBeGreaterThanOrEqual(0);
|
|
42
|
+
expect(cliIdx).toBeGreaterThan(timeoutIdx);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("--verbose is preserved before CLI name", () => {
|
|
46
|
+
const result = buildRustArgs(argv("--verbose"), "claude", SUPPORTED_CLIS);
|
|
47
|
+
const verboseIdx = result.indexOf("--verbose");
|
|
48
|
+
const cliIdx = result.indexOf("claude");
|
|
49
|
+
expect(verboseIdx).toBeGreaterThanOrEqual(0);
|
|
50
|
+
expect(cliIdx).toBeGreaterThan(verboseIdx);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it("-c (continue) flag is preserved before CLI name", () => {
|
|
54
|
+
const result = buildRustArgs(argv("-c"), "claude", SUPPORTED_CLIS);
|
|
55
|
+
expect(result.indexOf("-c")).toBeLessThan(result.indexOf("claude"));
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("--robust flag is preserved before CLI name", () => {
|
|
59
|
+
const result = buildRustArgs(argv("--robust", "true"), "gemini", SUPPORTED_CLIS);
|
|
60
|
+
expect(result.indexOf("--robust")).toBeLessThan(result.indexOf("gemini"));
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("all flags come before CLI name in complex invocation", () => {
|
|
64
|
+
const result = buildRustArgs(
|
|
65
|
+
argv("--timeout", "1h", "--verbose", "-c", "--robust", "true"),
|
|
66
|
+
"claude",
|
|
67
|
+
SUPPORTED_CLIS,
|
|
68
|
+
);
|
|
69
|
+
const cliIdx = result.indexOf("claude");
|
|
70
|
+
for (const flag of ["--timeout", "--verbose", "-c", "--robust"]) {
|
|
71
|
+
expect(result.indexOf(flag)).toBeLessThan(cliIdx);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// ─── --rust flag filtering ─────────────────────────────────────────
|
|
77
|
+
|
|
78
|
+
describe("--rust flag is filtered out", () => {
|
|
79
|
+
it("removes --rust from args", () => {
|
|
80
|
+
const result = buildRustArgs(argv("--rust", "--timeout", "30s"), "claude", SUPPORTED_CLIS);
|
|
81
|
+
expect(result).not.toContain("--rust");
|
|
82
|
+
expect(result).toContain("--timeout");
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("removes --rust= variant from args", () => {
|
|
86
|
+
const result = buildRustArgs(argv("--rust=true", "--verbose"), "claude", SUPPORTED_CLIS);
|
|
87
|
+
expect(result).not.toContain("--rust=true");
|
|
88
|
+
expect(result).toContain("--verbose");
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("removes --rust regardless of position", () => {
|
|
92
|
+
const result = buildRustArgs(argv("--verbose", "--rust", "--timeout", "5m"), "claude", SUPPORTED_CLIS);
|
|
93
|
+
expect(result).not.toContain("--rust");
|
|
94
|
+
expect(result).toEqual(["--verbose", "--timeout", "5m", "claude"]);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// ─── CLI name detection in args ────────────────────────────────────
|
|
99
|
+
|
|
100
|
+
describe("does not duplicate CLI name if already in args", () => {
|
|
101
|
+
it("skips appending when CLI name is already a positional arg", () => {
|
|
102
|
+
const result = buildRustArgs(argv("--timeout", "30s", "claude"), "claude", SUPPORTED_CLIS);
|
|
103
|
+
expect(result).toEqual(["--timeout", "30s", "claude"]);
|
|
104
|
+
expect(result.filter((a) => a === "claude")).toHaveLength(1);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("skips appending when --cli= flag is used", () => {
|
|
108
|
+
const result = buildRustArgs(argv("--cli=gemini", "--timeout", "30s"), "claude", SUPPORTED_CLIS);
|
|
109
|
+
expect(result).toEqual(["--cli=gemini", "--timeout", "30s"]);
|
|
110
|
+
expect(result).not.toContain("claude");
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it("skips appending when --cli flag is used (separate value)", () => {
|
|
114
|
+
const result = buildRustArgs(argv("--cli", "gemini", "--timeout", "30s"), "claude", SUPPORTED_CLIS);
|
|
115
|
+
expect(result).toEqual(["--cli", "gemini", "--timeout", "30s"]);
|
|
116
|
+
expect(result).not.toContain("claude");
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it("detects any supported CLI name in args", () => {
|
|
120
|
+
for (const cli of ["gemini", "codex", "copilot", "cursor", "grok"]) {
|
|
121
|
+
const result = buildRustArgs(argv("--timeout", "1m", cli), "claude", SUPPORTED_CLIS);
|
|
122
|
+
expect(result).not.toContain("claude");
|
|
123
|
+
expect(result).toContain(cli);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
// ─── Swarm mode ────────────────────────────────────────────────────
|
|
129
|
+
|
|
130
|
+
describe("swarm mode skips CLI name", () => {
|
|
131
|
+
it("does not append CLI name when --swarm is present", () => {
|
|
132
|
+
const result = buildRustArgs(argv("--swarm", "my-topic"), "claude", SUPPORTED_CLIS);
|
|
133
|
+
expect(result).toEqual(["--swarm", "my-topic"]);
|
|
134
|
+
expect(result).not.toContain("claude");
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("does not append CLI name when --swarm= is present", () => {
|
|
138
|
+
const result = buildRustArgs(argv("--swarm=my-topic"), "claude", SUPPORTED_CLIS);
|
|
139
|
+
expect(result).toEqual(["--swarm=my-topic"]);
|
|
140
|
+
expect(result).not.toContain("claude");
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it("does not append CLI name for bare --swarm", () => {
|
|
144
|
+
const result = buildRustArgs(argv("--swarm"), "claude", SUPPORTED_CLIS);
|
|
145
|
+
expect(result).toEqual(["--swarm"]);
|
|
146
|
+
expect(result).not.toContain("claude");
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
// ─── No CLI from script name ───────────────────────────────────────
|
|
151
|
+
|
|
152
|
+
describe("no CLI from script name (agent-yes / ay)", () => {
|
|
153
|
+
it("returns raw args when cliFromScript is undefined", () => {
|
|
154
|
+
const result = buildRustArgs(argv("--timeout", "30s"), undefined, SUPPORTED_CLIS);
|
|
155
|
+
expect(result).toEqual(["--timeout", "30s"]);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it("returns raw args when cliFromScript is empty string", () => {
|
|
159
|
+
const result = buildRustArgs(argv("--timeout", "30s"), "", SUPPORTED_CLIS);
|
|
160
|
+
expect(result).toEqual(["--timeout", "30s"]);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// ─── Edge cases ────────────────────────────────────────────────────
|
|
165
|
+
|
|
166
|
+
describe("edge cases", () => {
|
|
167
|
+
it("handles no user args at all", () => {
|
|
168
|
+
const result = buildRustArgs(["node", "/path/to/claude-yes"], "claude", SUPPORTED_CLIS);
|
|
169
|
+
expect(result).toEqual(["claude"]);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it("handles -- prompt separator correctly", () => {
|
|
173
|
+
const result = buildRustArgs(
|
|
174
|
+
argv("--timeout", "1h", "--", "do", "the", "thing"),
|
|
175
|
+
"claude",
|
|
176
|
+
SUPPORTED_CLIS,
|
|
177
|
+
);
|
|
178
|
+
expect(result).toEqual(["--timeout", "1h", "--", "do", "the", "thing", "claude"]);
|
|
179
|
+
expect(result.indexOf("--timeout")).toBeLessThan(result.lastIndexOf("claude"));
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it("handles -p prompt flag", () => {
|
|
183
|
+
const result = buildRustArgs(argv("-p", "hello world"), "claude", SUPPORTED_CLIS);
|
|
184
|
+
expect(result).toEqual(["-p", "hello world", "claude"]);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it("preserves args with hyphen values (e.g. negative numbers)", () => {
|
|
188
|
+
const result = buildRustArgs(argv("--some-flag", "-1"), "claude", SUPPORTED_CLIS);
|
|
189
|
+
expect(result).toEqual(["--some-flag", "-1", "claude"]);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it("handles multiple --rust flags (all filtered)", () => {
|
|
193
|
+
const result = buildRustArgs(argv("--rust", "--rust", "--verbose"), "claude", SUPPORTED_CLIS);
|
|
194
|
+
expect(result).toEqual(["--verbose", "claude"]);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it("does not treat --swarm-topic as --swarm", () => {
|
|
198
|
+
const result = buildRustArgs(argv("--swarm-topic", "my-topic"), "claude", SUPPORTED_CLIS);
|
|
199
|
+
// --swarm-topic is NOT --swarm, so CLI name should still be appended
|
|
200
|
+
expect(result).toContain("claude");
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
it("does not treat --cli-like strings inside values as CLI names", () => {
|
|
204
|
+
// e.g. --prompt "use claude to ..." should not detect "claude" as a CLI arg
|
|
205
|
+
// because "use claude to ..." is a value, not a standalone arg
|
|
206
|
+
const result = buildRustArgs(argv("-p", "use claude to fix"), undefined, SUPPORTED_CLIS);
|
|
207
|
+
// "claude" appears inside a value, but since cliFromScript is undefined, nothing appended
|
|
208
|
+
expect(result).toEqual(["-p", "use claude to fix"]);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
// ─── Real-world command scenarios ──────────────────────────────────
|
|
213
|
+
|
|
214
|
+
describe("real-world scenarios", () => {
|
|
215
|
+
it("claude-yes --rust --timeout 1h (the original failing case)", () => {
|
|
216
|
+
const result = buildRustArgs(argv("--rust", "--timeout", "1h"), "claude", SUPPORTED_CLIS);
|
|
217
|
+
expect(result).toEqual(["--timeout", "1h", "claude"]);
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
it("claude-yes --rust --timeout 30s --verbose", () => {
|
|
221
|
+
const result = buildRustArgs(argv("--rust", "--timeout", "30s", "--verbose"), "claude", SUPPORTED_CLIS);
|
|
222
|
+
expect(result).toEqual(["--timeout", "30s", "--verbose", "claude"]);
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
it("claude-yes --rust -c (continue session)", () => {
|
|
226
|
+
const result = buildRustArgs(argv("--rust", "-c"), "claude", SUPPORTED_CLIS);
|
|
227
|
+
expect(result).toEqual(["-c", "claude"]);
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
it("codex-yes --rust --timeout 5m -- fix all bugs", () => {
|
|
231
|
+
const result = buildRustArgs(
|
|
232
|
+
argv("--rust", "--timeout", "5m", "--", "fix", "all", "bugs"),
|
|
233
|
+
"codex",
|
|
234
|
+
SUPPORTED_CLIS,
|
|
235
|
+
);
|
|
236
|
+
expect(result).toEqual(["--timeout", "5m", "--", "fix", "all", "bugs", "codex"]);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it("agent-yes --rust claude --timeout 1h (explicit CLI in args)", () => {
|
|
240
|
+
const result = buildRustArgs(argv("--rust", "claude", "--timeout", "1h"), undefined, SUPPORTED_CLIS);
|
|
241
|
+
// cliFromScript is undefined (agent-yes), CLI already in args
|
|
242
|
+
expect(result).toEqual(["claude", "--timeout", "1h"]);
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
it("agent-yes --rust --swarm my-project --timeout 1h", () => {
|
|
246
|
+
const result = buildRustArgs(
|
|
247
|
+
argv("--rust", "--swarm", "my-project", "--timeout", "1h"),
|
|
248
|
+
"claude",
|
|
249
|
+
SUPPORTED_CLIS,
|
|
250
|
+
);
|
|
251
|
+
// Swarm mode: no CLI name appended
|
|
252
|
+
expect(result).toEqual(["--swarm", "my-project", "--timeout", "1h"]);
|
|
253
|
+
expect(result).not.toContain("claude");
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
it("gemini-yes --rust --timeout 2m --verbose -p 'hello'", () => {
|
|
257
|
+
const result = buildRustArgs(
|
|
258
|
+
argv("--rust", "--timeout", "2m", "--verbose", "-p", "hello"),
|
|
259
|
+
"gemini",
|
|
260
|
+
SUPPORTED_CLIS,
|
|
261
|
+
);
|
|
262
|
+
expect(result).toEqual(["--timeout", "2m", "--verbose", "-p", "hello", "gemini"]);
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
it("claude-yes --rust --auto=no --timeout 10m", () => {
|
|
266
|
+
const result = buildRustArgs(
|
|
267
|
+
argv("--rust", "--auto=no", "--timeout", "10m"),
|
|
268
|
+
"claude",
|
|
269
|
+
SUPPORTED_CLIS,
|
|
270
|
+
);
|
|
271
|
+
expect(result).toEqual(["--auto=no", "--timeout", "10m", "claude"]);
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build arguments for the Rust binary from process.argv.
|
|
3
|
+
*
|
|
4
|
+
* IMPORTANT: The CLI name (e.g. "claude") must be appended at the END of the
|
|
5
|
+
* arg list, not prepended. The Rust binary uses clap with `trailing_var_arg`,
|
|
6
|
+
* which means once a positional arg is encountered, all subsequent args are
|
|
7
|
+
* treated as positional — so any flags (like --timeout) after the CLI name
|
|
8
|
+
* would be silently swallowed.
|
|
9
|
+
*/
|
|
10
|
+
export function buildRustArgs(
|
|
11
|
+
argv: string[],
|
|
12
|
+
cliFromScript: string | undefined,
|
|
13
|
+
supportedClis: readonly string[],
|
|
14
|
+
): string[] {
|
|
15
|
+
// Filter out --rust flag (already handled by TS layer)
|
|
16
|
+
const rawRustArgs = argv
|
|
17
|
+
.slice(2)
|
|
18
|
+
.filter((arg) => arg !== "--rust" && !arg.startsWith("--rust="));
|
|
19
|
+
|
|
20
|
+
// Check if swarm mode is requested (don't append CLI name for swarm mode)
|
|
21
|
+
const hasSwarmArg = rawRustArgs.some(
|
|
22
|
+
(arg) => arg === "--swarm" || arg.startsWith("--swarm="),
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
// Check if CLI is already specified in args
|
|
26
|
+
const hasCliArg =
|
|
27
|
+
rawRustArgs.some(
|
|
28
|
+
(arg) => arg.startsWith("--cli=") || arg === "--cli",
|
|
29
|
+
) || rawRustArgs.some((arg) => supportedClis.includes(arg));
|
|
30
|
+
|
|
31
|
+
// Append CLI name at the end so it doesn't trigger trailing_var_arg in clap,
|
|
32
|
+
// which would cause all subsequent args (like --timeout) to be treated as positional
|
|
33
|
+
if (cliFromScript && !hasCliArg && !hasSwarmArg) {
|
|
34
|
+
return [...rawRustArgs, cliFromScript];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return rawRustArgs;
|
|
38
|
+
}
|
package/ts/cli.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { logger } from "./logger.ts";
|
|
|
10
10
|
import { PidStore } from "./pidStore.ts";
|
|
11
11
|
import { displayVersion } from "./versionChecker.ts";
|
|
12
12
|
import { getRustBinary } from "./rustBinary.ts";
|
|
13
|
+
import { buildRustArgs } from "./buildRustArgs.ts";
|
|
13
14
|
|
|
14
15
|
// Parse CLI arguments
|
|
15
16
|
const config = parseCliArgs(process.argv);
|
|
@@ -26,21 +27,8 @@ if (config.useRust) {
|
|
|
26
27
|
process.exit(1);
|
|
27
28
|
}
|
|
28
29
|
|
|
29
|
-
// Build args for Rust binary
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
// Check if swarm mode is requested (don't prepend CLI name for swarm mode)
|
|
33
|
-
const hasSwarmArg = rawRustArgs.some(arg => arg === '--swarm' || arg.startsWith('--swarm='));
|
|
34
|
-
|
|
35
|
-
// Prepend CLI name if detected from script name but not already in args
|
|
36
|
-
// This ensures codex-yes --rust passes "codex" to the Rust binary
|
|
37
|
-
// Skip prepending for swarm mode since it doesn't spawn a CLI
|
|
38
|
-
const cliFromScript = config.cli;
|
|
39
|
-
const hasCliArg = rawRustArgs.some(arg => arg.startsWith('--cli=') || arg === '--cli') ||
|
|
40
|
-
rawRustArgs.some(arg => SUPPORTED_CLIS.includes(arg));
|
|
41
|
-
const rustArgs = cliFromScript && !hasCliArg && !hasSwarmArg
|
|
42
|
-
? [cliFromScript, ...rawRustArgs]
|
|
43
|
-
: rawRustArgs;
|
|
30
|
+
// Build args for Rust binary
|
|
31
|
+
const rustArgs = buildRustArgs(process.argv, config.cli, SUPPORTED_CLIS);
|
|
44
32
|
|
|
45
33
|
if (config.verbose) {
|
|
46
34
|
console.log(`[rust] Using binary: ${rustBinary}`);
|