goke 6.8.0 → 6.9.0

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.
@@ -1831,3 +1831,127 @@ describe('middleware', () => {
1831
1831
  expect(order).toEqual(['sync1', 'async', 'sync2', 'action']);
1832
1832
  });
1833
1833
  });
1834
+ describe('use() with sub-CLI composition', () => {
1835
+ test('basic composition: sub-CLI command runs via parent', () => {
1836
+ const parent = goke('mycli');
1837
+ const sub = goke();
1838
+ let matched = '';
1839
+ sub
1840
+ .command('deploy', 'Deploy the app')
1841
+ .action(() => { matched = 'deploy'; });
1842
+ parent.use(sub);
1843
+ parent.parse(['node', 'bin', 'deploy'], { run: true });
1844
+ expect(matched).toBe('deploy');
1845
+ });
1846
+ test('multiple sub-CLIs composed together', () => {
1847
+ const parent = goke('mycli');
1848
+ const subA = goke();
1849
+ const subB = goke();
1850
+ let matched = '';
1851
+ subA.command('login', 'Login').action(() => { matched = 'login'; });
1852
+ subB.command('deploy', 'Deploy').action(() => { matched = 'deploy'; });
1853
+ parent.use(subA).use(subB);
1854
+ parent.parse(['node', 'bin', 'login'], { run: true });
1855
+ expect(matched).toBe('login');
1856
+ matched = '';
1857
+ parent.parse(['node', 'bin', 'deploy'], { run: true });
1858
+ expect(matched).toBe('deploy');
1859
+ });
1860
+ test('sub-CLI command with options and schema coercion', () => {
1861
+ const parent = goke('mycli');
1862
+ const sub = goke();
1863
+ let result = {};
1864
+ sub
1865
+ .command('serve', 'Start server')
1866
+ .option('--port <port>', z.number().describe('Port'))
1867
+ .option('--host <host>', z.string().describe('Host'))
1868
+ .action((options) => { result = options; });
1869
+ parent.use(sub);
1870
+ parent.parse('node bin serve --port 3000 --host localhost'.split(' '), { run: true });
1871
+ expect(result.port).toBe(3000);
1872
+ expect(typeof result.port).toBe('number');
1873
+ expect(result.host).toBe('localhost');
1874
+ });
1875
+ test('sub-CLI command with positional args', () => {
1876
+ const parent = goke('mycli');
1877
+ const sub = goke();
1878
+ let receivedId = '';
1879
+ sub
1880
+ .command('get <id>', 'Get a resource')
1881
+ .action((id) => { receivedId = id; });
1882
+ parent.use(sub);
1883
+ parent.parse(['node', 'bin', 'get', 'abc123'], { run: true });
1884
+ expect(receivedId).toBe('abc123');
1885
+ });
1886
+ test('sub-CLI with multi-word commands', () => {
1887
+ const parent = goke('mycli');
1888
+ const sub = goke();
1889
+ let matched = '';
1890
+ sub.command('mcp login', 'Login to MCP').action(() => { matched = 'mcp login'; });
1891
+ sub.command('mcp logout', 'Logout from MCP').action(() => { matched = 'mcp logout'; });
1892
+ parent.use(sub);
1893
+ parent.parse(['node', 'bin', 'mcp', 'login'], { run: true });
1894
+ expect(matched).toBe('mcp login');
1895
+ matched = '';
1896
+ parent.parse(['node', 'bin', 'mcp', 'logout'], { run: true });
1897
+ expect(matched).toBe('mcp logout');
1898
+ });
1899
+ test('help output includes composed commands', () => {
1900
+ const stdout = createTestOutputStream();
1901
+ const parent = goke('mycli', { stdout });
1902
+ const sub = goke();
1903
+ sub.command('selfhost', 'Set up on your own workspace')
1904
+ .option('-t, --token [token]', 'Admin token');
1905
+ parent.command('init', 'Initialize project');
1906
+ parent.use(sub);
1907
+ parent.help();
1908
+ parent.parse(['node', 'bin', '--help'], { run: false });
1909
+ expect(stdout.text).toContain('init');
1910
+ expect(stdout.text).toContain('selfhost');
1911
+ expect(stdout.text).toContain('Set up on your own workspace');
1912
+ });
1913
+ test('sub-CLI middlewares are NOT copied to parent', () => {
1914
+ const parent = goke('mycli');
1915
+ const sub = goke();
1916
+ let subMiddlewareCalled = false;
1917
+ const order = [];
1918
+ sub.use(() => { subMiddlewareCalled = true; });
1919
+ sub.command('deploy', 'Deploy').action(() => { order.push('deploy'); });
1920
+ parent.use(() => { order.push('parent-mw'); });
1921
+ parent.use(sub);
1922
+ parent.parse(['node', 'bin', 'deploy'], { run: true });
1923
+ expect(subMiddlewareCalled).toBe(false);
1924
+ expect(order).toEqual(['parent-mw', 'deploy']);
1925
+ });
1926
+ test('parent global options are available to composed commands', () => {
1927
+ const parent = goke('mycli');
1928
+ const sub = goke();
1929
+ let result = {};
1930
+ parent.option('--verbose', 'Verbose output');
1931
+ sub
1932
+ .command('build', 'Build')
1933
+ .option('--target <target>', 'Build target')
1934
+ .action((options) => { result = options; });
1935
+ parent.use(sub);
1936
+ parent.parse('node bin build --verbose --target production'.split(' '), { run: true });
1937
+ expect(result.verbose).toBe(true);
1938
+ expect(result.target).toBe('production');
1939
+ });
1940
+ test('composed commands coexist with inline commands', () => {
1941
+ const parent = goke('mycli');
1942
+ const sub = goke();
1943
+ let matched = '';
1944
+ parent.command('init', 'Initialize').action(() => { matched = 'init'; });
1945
+ sub.command('deploy', 'Deploy').action(() => { matched = 'deploy'; });
1946
+ sub.command('rollback', 'Rollback').action(() => { matched = 'rollback'; });
1947
+ parent.use(sub);
1948
+ parent.parse(['node', 'bin', 'init'], { run: true });
1949
+ expect(matched).toBe('init');
1950
+ matched = '';
1951
+ parent.parse(['node', 'bin', 'deploy'], { run: true });
1952
+ expect(matched).toBe('deploy');
1953
+ matched = '';
1954
+ parent.parse(['node', 'bin', 'rollback'], { run: true });
1955
+ expect(matched).toBe('rollback');
1956
+ });
1957
+ });
@@ -312,4 +312,23 @@ describe('createJustBashCommand', () => {
312
312
  exitCode: 7,
313
313
  });
314
314
  });
315
+ test('truncates captured output to just-bash maxOutputSize and appends a notice', async () => {
316
+ const { Bash } = await import('just-bash');
317
+ const cli = gokeTestable('parent');
318
+ cli
319
+ .command('spam-stderr', 'Write too much stderr')
320
+ .action((options, { console }) => {
321
+ console.error('x'.repeat(60));
322
+ console.error('y'.repeat(60));
323
+ });
324
+ const bash = new Bash({
325
+ executionLimits: { maxOutputSize: 80 },
326
+ customCommands: [await cli.createJustBashCommand()],
327
+ });
328
+ const result = await bash.exec('parent spam-stderr');
329
+ expect(result.exitCode).toBe(0);
330
+ expect(result.stdout).toBe('');
331
+ expect(result.stderr.length).toBeLessThanOrEqual(80);
332
+ expect(result.stderr).toBe(`${'x'.repeat(60)}\n[output truncated]\n`);
333
+ });
315
334
  });
@@ -397,6 +397,43 @@ describe('type-level: README TypeScript examples', () => {
397
397
  expectTypeOf(process.cwd).toEqualTypeOf();
398
398
  });
399
399
  });
400
+ test('use() with sub-CLI preserves parent middleware typing', () => {
401
+ const sub = goke();
402
+ sub
403
+ .command('deploy', 'Deploy the app')
404
+ .option('--force', z.boolean())
405
+ .action((options) => {
406
+ // Sub-CLI command's action sees its own options
407
+ expectTypeOf(options.force).toEqualTypeOf();
408
+ });
409
+ goke('test')
410
+ .option('--verbose', z.boolean().default(false).describe('Verbose'))
411
+ .use(sub)
412
+ .use((options) => {
413
+ // Parent middleware still sees parent's accumulated options after .use(subCli)
414
+ expectTypeOf(options.verbose).toEqualTypeOf();
415
+ })
416
+ .command('build', 'Build')
417
+ .option('--target <target>', z.string())
418
+ .action((options) => {
419
+ // Parent's inline command still sees global options
420
+ expectTypeOf(options.verbose).toEqualTypeOf();
421
+ expectTypeOf(options.target).toEqualTypeOf();
422
+ });
423
+ });
424
+ test('use() with sub-CLI does not leak sub-CLI types to parent', () => {
425
+ const sub = goke()
426
+ .option('--sub-only <val>', z.string());
427
+ sub.command('sub-cmd', 'Sub command').action(() => { });
428
+ goke('test')
429
+ .option('--parent-only <val>', z.number())
430
+ .use(sub)
431
+ .use((options) => {
432
+ expectTypeOf(options.parentOnly).toEqualTypeOf();
433
+ // @ts-expect-error subOnly is not declared on the parent
434
+ options.subOnly;
435
+ });
436
+ });
400
437
  test('README global options and middleware example stays typed end-to-end', () => {
401
438
  // `z.boolean().default(false)` and `z.string().default(...)` are
402
439
  // effectively required at runtime: the default applies when the flag is
package/dist/goke.d.ts CHANGED
@@ -553,7 +553,30 @@ declare class Goke<Opts = {}> extends EventEmitter {
553
553
  * }
554
554
  * })
555
555
  * ```
556
+ *
557
+ * Alternatively, pass another `Goke` instance to compose commands from
558
+ * separate files. All commands defined on the sub-CLI are merged into
559
+ * this CLI. Middlewares and global options from the sub-CLI are NOT
560
+ * copied; only commands are composed.
561
+ *
562
+ * @example
563
+ * ```ts
564
+ * // selfhost.ts
565
+ * export const selfhostCli = goke()
566
+ * selfhostCli
567
+ * .command('selfhost', 'Set up on your own workspace')
568
+ * .option('-t, --token [token]', 'Admin token')
569
+ * .action((options) => { ... })
570
+ *
571
+ * // main.ts
572
+ * import { selfhostCli } from './selfhost.js'
573
+ * goke('mycli')
574
+ * .use(selfhostCli)
575
+ * .help()
576
+ * .parse(process.argv)
577
+ * ```
556
578
  */
579
+ use(subCli: Goke<any>): this;
557
580
  use(callback: (options: Opts & DoubleDashOptions, context: GokeExecutionContext) => void | Promise<void>): this;
558
581
  /**
559
582
  * Show help message when `-h, --help` flags appear.
@@ -1 +1 @@
1
- {"version":3,"file":"goke.d.ts","sourceRoot":"","sources":["../src/goke.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"goke.d.ts","sourceRoot":"","sources":["../src/goke.ts"],"names":[],"mappings":"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"}
package/dist/goke.js CHANGED
@@ -822,30 +822,14 @@ class Goke extends EventEmitter {
822
822
  this.globalCommand.options.push(option);
823
823
  return this;
824
824
  }
825
- /**
826
- * Register a middleware function that runs before the matched command action.
827
- *
828
- * Middleware runs in registration order, after option parsing and validation,
829
- * but before the command's `.action()` callback. Useful for reacting to global
830
- * options (e.g. setting up logging, initializing state).
831
- *
832
- * The callback receives the parsed options object, typed according to all
833
- * `.option()` calls that precede this `.use()` in the chain, plus an injected
834
- * execution context with `{ console, process }` for portable output and exits.
835
- *
836
- * @example
837
- * ```ts
838
- * cli
839
- * .option('--verbose', z.boolean().default(false).describe('Verbose'))
840
- * .use((options, { console }) => {
841
- * if (options.verbose) {
842
- * console.log('verbose mode enabled')
843
- * }
844
- * })
845
- * ```
846
- */
847
- use(callback) {
848
- this.middlewares.push({ action: callback });
825
+ use(callbackOrCli) {
826
+ if (callbackOrCli instanceof Goke) {
827
+ for (const command of callbackOrCli.commands) {
828
+ this.commands.push(cloneCommandInto(command, this));
829
+ }
830
+ return this;
831
+ }
832
+ this.middlewares.push({ action: callbackOrCli });
849
833
  return this;
850
834
  }
851
835
  /**
@@ -17,7 +17,7 @@ interface JustBashCommand {
17
17
  trusted: true;
18
18
  execute(args: string[], context?: JustBashExecutionContext): Promise<JustBashExecResult>;
19
19
  }
20
- type JustBashExecutionContext = Pick<CommandContext, 'cwd' | 'env' | 'fs' | 'stdin'>;
20
+ type JustBashExecutionContext = Pick<CommandContext, 'cwd' | 'env' | 'fs' | 'stdin' | 'limits'>;
21
21
  export declare function createJustBashCommand(cli: Goke<any>, options?: {
22
22
  name?: string;
23
23
  }): JustBashCommand;
@@ -1 +1 @@
1
- {"version":3,"file":"just-bash.d.ts","sourceRoot":"","sources":["../src/just-bash.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,WAAW,CAAA;AAC5D,OAAO,IAAyB,MAAM,WAAW,CAAA;AAIjD,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,IAAI,CAAA;IACb,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;CACzF;AAED,KAAK,wBAAwB,GAAG,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC,CAAA;AA4LpF,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EACd,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1B,eAAe,CAqDjB;AAED,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAA"}
1
+ {"version":3,"file":"just-bash.d.ts","sourceRoot":"","sources":["../src/just-bash.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,WAAW,CAAA;AAC5D,OAAO,IAAyB,MAAM,WAAW,CAAA;AAIjD,UAAU,kBAAkB;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,IAAI,CAAA;IACb,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;CACzF;AAED,KAAK,wBAAwB,GAAG,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAA;AAqQ/F,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,EACd,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1B,eAAe,CAsDjB;AAED,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAA"}
package/dist/just-bash.js CHANGED
@@ -8,14 +8,78 @@
8
8
  import { Buffer } from 'node:buffer';
9
9
  import { fileURLToPath } from 'node:url';
10
10
  import { GokeProcessExit } from './goke.js';
11
- function createTextCaptureStream() {
12
- const chunks = [];
13
- return {
14
- get text() {
15
- return chunks.join('');
16
- },
11
+ const TRUNCATION_MESSAGE = '\n[output truncated]\n';
12
+ function createTextCaptureStreams(maxLength) {
13
+ const stdoutChunks = [];
14
+ const stderrChunks = [];
15
+ const limit = maxLength != null && maxLength > 0 ? maxLength : Number.POSITIVE_INFINITY;
16
+ let totalLength = 0;
17
+ let stdoutTruncated = false;
18
+ let stderrTruncated = false;
19
+ const createStream = (stream) => ({
17
20
  write(data) {
18
- chunks.push(data);
21
+ if (totalLength >= limit) {
22
+ if (stream === 'stdout') {
23
+ stdoutTruncated = true;
24
+ }
25
+ else {
26
+ stderrTruncated = true;
27
+ }
28
+ return;
29
+ }
30
+ const remaining = limit - totalLength;
31
+ const text = data.length <= remaining ? data : data.slice(0, remaining);
32
+ if (stream === 'stdout') {
33
+ stdoutChunks.push(text);
34
+ stdoutTruncated ||= text.length !== data.length;
35
+ }
36
+ else {
37
+ stderrChunks.push(text);
38
+ stderrTruncated ||= text.length !== data.length;
39
+ }
40
+ totalLength += text.length;
41
+ },
42
+ });
43
+ const trimEnd = (value, count) => value.slice(0, Math.max(0, value.length - count));
44
+ return {
45
+ stdout: createStream('stdout'),
46
+ stderr: createStream('stderr'),
47
+ getResult() {
48
+ let stdout = stdoutChunks.join('');
49
+ let stderr = stderrChunks.join('');
50
+ if (!stdoutTruncated && !stderrTruncated) {
51
+ return { stdout, stderr };
52
+ }
53
+ const target = stderrTruncated ? 'stderr' : 'stdout';
54
+ const message = limit === Number.POSITIVE_INFINITY
55
+ ? TRUNCATION_MESSAGE
56
+ : TRUNCATION_MESSAGE.slice(0, Math.min(TRUNCATION_MESSAGE.length, limit));
57
+ let overflow = stdout.length + stderr.length + message.length - limit;
58
+ if (Number.isFinite(limit) && overflow > 0) {
59
+ if (target === 'stderr') {
60
+ const stderrTrim = Math.min(overflow, stderr.length);
61
+ stderr = trimEnd(stderr, stderrTrim);
62
+ overflow -= stderrTrim;
63
+ if (overflow > 0) {
64
+ stdout = trimEnd(stdout, overflow);
65
+ }
66
+ }
67
+ else {
68
+ const stdoutTrim = Math.min(overflow, stdout.length);
69
+ stdout = trimEnd(stdout, stdoutTrim);
70
+ overflow -= stdoutTrim;
71
+ if (overflow > 0) {
72
+ stderr = trimEnd(stderr, overflow);
73
+ }
74
+ }
75
+ }
76
+ if (target === 'stderr') {
77
+ stderr += message;
78
+ }
79
+ else {
80
+ stdout += message;
81
+ }
82
+ return { stdout, stderr };
19
83
  },
20
84
  };
21
85
  }
@@ -187,16 +251,15 @@ export function createJustBashCommand(cli, options) {
187
251
  name,
188
252
  trusted: true,
189
253
  async execute(args, context) {
190
- const stdout = createTextCaptureStream();
191
- const stderr = createTextCaptureStream();
254
+ const output = createTextCaptureStreams(context?.limits?.maxOutputSize);
192
255
  const argv = ['node', name, ...args];
193
256
  const cloned = cli.clone({
194
257
  cwd: context?.cwd,
195
258
  env: context ? createJustBashEnvProxy(context.env) : cli.env,
196
259
  fs: context ? createJustBashFs(context.fs, context.cwd) : cli.fs,
197
260
  stdin: context?.stdin,
198
- stdout,
199
- stderr,
261
+ stdout: output.stdout,
262
+ stderr: output.stderr,
200
263
  argv,
201
264
  exit: (code) => {
202
265
  throw new GokeProcessExit(code);
@@ -206,17 +269,19 @@ export function createJustBashCommand(cli, options) {
206
269
  try {
207
270
  cloned.parse(argv, { run: false });
208
271
  await cloned.runMatchedCommand();
272
+ const result = output.getResult();
209
273
  return {
210
- stdout: stdout.text,
211
- stderr: stderr.text,
274
+ stdout: result.stdout,
275
+ stderr: result.stderr,
212
276
  exitCode: 0,
213
277
  };
214
278
  }
215
279
  catch (error) {
216
280
  if (error instanceof GokeProcessExit) {
281
+ const result = output.getResult();
217
282
  return {
218
- stdout: stdout.text,
219
- stderr: stderr.text,
283
+ stdout: result.stdout,
284
+ stderr: result.stderr,
220
285
  exitCode: error.code,
221
286
  };
222
287
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "goke",
3
- "version": "6.8.0",
3
+ "version": "6.9.0",
4
4
  "type": "module",
5
5
  "description": "Simple yet powerful framework for building command-line apps. Inspired by cac.",
6
6
  "repository": {
@@ -2336,3 +2336,169 @@ describe('middleware', () => {
2336
2336
  expect(order).toEqual(['sync1', 'async', 'sync2', 'action'])
2337
2337
  })
2338
2338
  })
2339
+
2340
+ describe('use() with sub-CLI composition', () => {
2341
+ test('basic composition: sub-CLI command runs via parent', () => {
2342
+ const parent = goke('mycli')
2343
+ const sub = goke()
2344
+ let matched = ''
2345
+
2346
+ sub
2347
+ .command('deploy', 'Deploy the app')
2348
+ .action(() => { matched = 'deploy' })
2349
+
2350
+ parent.use(sub)
2351
+ parent.parse(['node', 'bin', 'deploy'], { run: true })
2352
+ expect(matched).toBe('deploy')
2353
+ })
2354
+
2355
+ test('multiple sub-CLIs composed together', () => {
2356
+ const parent = goke('mycli')
2357
+ const subA = goke()
2358
+ const subB = goke()
2359
+ let matched = ''
2360
+
2361
+ subA.command('login', 'Login').action(() => { matched = 'login' })
2362
+ subB.command('deploy', 'Deploy').action(() => { matched = 'deploy' })
2363
+
2364
+ parent.use(subA).use(subB)
2365
+
2366
+ parent.parse(['node', 'bin', 'login'], { run: true })
2367
+ expect(matched).toBe('login')
2368
+
2369
+ matched = ''
2370
+ parent.parse(['node', 'bin', 'deploy'], { run: true })
2371
+ expect(matched).toBe('deploy')
2372
+ })
2373
+
2374
+ test('sub-CLI command with options and schema coercion', () => {
2375
+ const parent = goke('mycli')
2376
+ const sub = goke()
2377
+ let result: any = {}
2378
+
2379
+ sub
2380
+ .command('serve', 'Start server')
2381
+ .option('--port <port>', z.number().describe('Port'))
2382
+ .option('--host <host>', z.string().describe('Host'))
2383
+ .action((options) => { result = options })
2384
+
2385
+ parent.use(sub)
2386
+ parent.parse('node bin serve --port 3000 --host localhost'.split(' '), { run: true })
2387
+
2388
+ expect(result.port).toBe(3000)
2389
+ expect(typeof result.port).toBe('number')
2390
+ expect(result.host).toBe('localhost')
2391
+ })
2392
+
2393
+ test('sub-CLI command with positional args', () => {
2394
+ const parent = goke('mycli')
2395
+ const sub = goke()
2396
+ let receivedId = ''
2397
+
2398
+ sub
2399
+ .command('get <id>', 'Get a resource')
2400
+ .action((id) => { receivedId = id })
2401
+
2402
+ parent.use(sub)
2403
+ parent.parse(['node', 'bin', 'get', 'abc123'], { run: true })
2404
+
2405
+ expect(receivedId).toBe('abc123')
2406
+ })
2407
+
2408
+ test('sub-CLI with multi-word commands', () => {
2409
+ const parent = goke('mycli')
2410
+ const sub = goke()
2411
+ let matched = ''
2412
+
2413
+ sub.command('mcp login', 'Login to MCP').action(() => { matched = 'mcp login' })
2414
+ sub.command('mcp logout', 'Logout from MCP').action(() => { matched = 'mcp logout' })
2415
+
2416
+ parent.use(sub)
2417
+
2418
+ parent.parse(['node', 'bin', 'mcp', 'login'], { run: true })
2419
+ expect(matched).toBe('mcp login')
2420
+
2421
+ matched = ''
2422
+ parent.parse(['node', 'bin', 'mcp', 'logout'], { run: true })
2423
+ expect(matched).toBe('mcp logout')
2424
+ })
2425
+
2426
+ test('help output includes composed commands', () => {
2427
+ const stdout = createTestOutputStream()
2428
+ const parent = goke('mycli', { stdout })
2429
+ const sub = goke()
2430
+
2431
+ sub.command('selfhost', 'Set up on your own workspace')
2432
+ .option('-t, --token [token]', 'Admin token')
2433
+
2434
+ parent.command('init', 'Initialize project')
2435
+ parent.use(sub)
2436
+ parent.help()
2437
+ parent.parse(['node', 'bin', '--help'], { run: false })
2438
+
2439
+ expect(stdout.text).toContain('init')
2440
+ expect(stdout.text).toContain('selfhost')
2441
+ expect(stdout.text).toContain('Set up on your own workspace')
2442
+ })
2443
+
2444
+ test('sub-CLI middlewares are NOT copied to parent', () => {
2445
+ const parent = goke('mycli')
2446
+ const sub = goke()
2447
+ let subMiddlewareCalled = false
2448
+ const order: string[] = []
2449
+
2450
+ sub.use(() => { subMiddlewareCalled = true })
2451
+ sub.command('deploy', 'Deploy').action(() => { order.push('deploy') })
2452
+
2453
+ parent.use(() => { order.push('parent-mw') })
2454
+ parent.use(sub)
2455
+
2456
+ parent.parse(['node', 'bin', 'deploy'], { run: true })
2457
+
2458
+ expect(subMiddlewareCalled).toBe(false)
2459
+ expect(order).toEqual(['parent-mw', 'deploy'])
2460
+ })
2461
+
2462
+ test('parent global options are available to composed commands', () => {
2463
+ const parent = goke('mycli')
2464
+ const sub = goke()
2465
+ let result: any = {}
2466
+
2467
+ parent.option('--verbose', 'Verbose output')
2468
+
2469
+ sub
2470
+ .command('build', 'Build')
2471
+ .option('--target <target>', 'Build target')
2472
+ .action((options) => { result = options })
2473
+
2474
+ parent.use(sub)
2475
+ parent.parse('node bin build --verbose --target production'.split(' '), { run: true })
2476
+
2477
+ expect(result.verbose).toBe(true)
2478
+ expect(result.target).toBe('production')
2479
+ })
2480
+
2481
+ test('composed commands coexist with inline commands', () => {
2482
+ const parent = goke('mycli')
2483
+ const sub = goke()
2484
+ let matched = ''
2485
+
2486
+ parent.command('init', 'Initialize').action(() => { matched = 'init' })
2487
+
2488
+ sub.command('deploy', 'Deploy').action(() => { matched = 'deploy' })
2489
+ sub.command('rollback', 'Rollback').action(() => { matched = 'rollback' })
2490
+
2491
+ parent.use(sub)
2492
+
2493
+ parent.parse(['node', 'bin', 'init'], { run: true })
2494
+ expect(matched).toBe('init')
2495
+
2496
+ matched = ''
2497
+ parent.parse(['node', 'bin', 'deploy'], { run: true })
2498
+ expect(matched).toBe('deploy')
2499
+
2500
+ matched = ''
2501
+ parent.parse(['node', 'bin', 'rollback'], { run: true })
2502
+ expect(matched).toBe('rollback')
2503
+ })
2504
+ })