@mudah-cli/console 0.1.0 → 0.3.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.
package/dist/command.d.ts CHANGED
@@ -24,6 +24,12 @@ export declare abstract class Command {
24
24
  signature: string;
25
25
  /** One-line description for help output. */
26
26
  description: string;
27
+ /**
28
+ * Blurb for the group this command belongs to. Only meaningful on grouped
29
+ * signatures (`db:migrate`); the first command to set it labels the group
30
+ * in the command list.
31
+ */
32
+ groupDescription: string;
27
33
  /** The application (container, config, events). */
28
34
  app: Application;
29
35
  /** Styled output for the user. */
@@ -38,12 +44,21 @@ export declare abstract class Command {
38
44
  abstract handle(): Promise<number | void> | number | void;
39
45
  /** A positional argument value (or its signature default). */
40
46
  arg(name: string): string | undefined;
47
+ /**
48
+ * Values collected by a variadic argument (`{paths...}`) — empty when the
49
+ * argument doesn't exist or collected nothing.
50
+ */
51
+ list(name: string): string[];
41
52
  /** An option value: boolean for flags, string for `--opt=value`. */
42
53
  option<T extends string | boolean>(name: string): T | undefined;
43
54
  protected promptsInstance(): Prompts;
44
55
  protected ask(question: string, defaultValue?: string): Promise<string>;
45
56
  protected confirm(question: string, defaultValue?: boolean): Promise<boolean>;
46
57
  protected select(question: string, choices: string[]): Promise<string>;
58
+ /** Pick any number of choices (arrow keys + space on a TTY, numbered menu otherwise). */
59
+ protected multiselect(question: string, choices: string[], defaultChecked?: number[]): Promise<string[]>;
60
+ /** Masked text entry — the value is never echoed to the terminal. */
61
+ protected password(question: string): Promise<string>;
47
62
  /**
48
63
  * Render a usage error with this command's usage line. Commands call this
49
64
  * when their own validation fails.
package/dist/command.js CHANGED
@@ -23,6 +23,12 @@ export class Command {
23
23
  signature = '';
24
24
  /** One-line description for help output. */
25
25
  description = '';
26
+ /**
27
+ * Blurb for the group this command belongs to. Only meaningful on grouped
28
+ * signatures (`db:migrate`); the first command to set it labels the group
29
+ * in the command list.
30
+ */
31
+ groupDescription = '';
26
32
  /** The application (container, config, events). */
27
33
  app;
28
34
  /** Styled output for the user. */
@@ -43,6 +49,13 @@ export class Command {
43
49
  arg(name) {
44
50
  return this.input.args[name];
45
51
  }
52
+ /**
53
+ * Values collected by a variadic argument (`{paths...}`) — empty when the
54
+ * argument doesn't exist or collected nothing.
55
+ */
56
+ list(name) {
57
+ return this.input.lists[name] ?? [];
58
+ }
46
59
  /** An option value: boolean for flags, string for `--opt=value`. */
47
60
  option(name) {
48
61
  return this.input.options[name];
@@ -61,6 +74,14 @@ export class Command {
61
74
  select(question, choices) {
62
75
  return this.promptsInstance().select(question, choices);
63
76
  }
77
+ /** Pick any number of choices (arrow keys + space on a TTY, numbered menu otherwise). */
78
+ multiselect(question, choices, defaultChecked) {
79
+ return this.promptsInstance().multiselect(question, choices, { defaultChecked });
80
+ }
81
+ /** Masked text entry — the value is never echoed to the terminal. */
82
+ password(question) {
83
+ return this.promptsInstance().password(question);
84
+ }
64
85
  /**
65
86
  * Render a usage error with this command's usage line. Commands call this
66
87
  * when their own validation fails.
@@ -1 +1 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAA0C,MAAM,gBAAgB,CAAC;AAEpG;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAgB,OAAO;IAC3B,iDAAiD;IACjD,SAAS,GAAG,EAAE,CAAC;IAEf,4CAA4C;IAC5C,WAAW,GAAG,EAAE,CAAC;IAEjB,mDAAmD;IACnD,GAAG,CAAe;IAClB,kCAAkC;IAClC,MAAM,CAAU;IAChB,0CAA0C;IAC1C,KAAK,CAAe;IAEZ,OAAO,GAAmB,IAAI,CAAC;IAE7B,eAAe;QACvB,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,8CAA8C;IAC9C,QAAQ,CAAC,GAAgB,EAAE,MAAc,EAAE,KAAkB;QAC3D,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAKD,8DAA8D;IAC9D,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,oEAAoE;IACpE,MAAM,CAA6B,IAAY;QAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAkB,CAAC;IACnD,CAAC;IAES,eAAe;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAES,GAAG,CAAC,QAAgB,EAAE,YAAqB;QACnD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IAChE,CAAC;IAES,OAAO,CAAC,QAAgB,EAAE,YAAsB;QACxD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IACpE,CAAC;IAES,MAAM,CAAC,QAAgB,EAAE,OAAiB;QAClD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACO,UAAU,CAAC,OAAe,EAAE,IAAa;QACjD,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE;YAC7B,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,SAAS;SACtB,CAAC,CAAC;IACL,CAAC;CACF;AAED,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAA0C,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAoB,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAA0C,MAAM,gBAAgB,CAAC;AAEpG;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,OAAgB,OAAO;IAC3B,iDAAiD;IACjD,SAAS,GAAG,EAAE,CAAC;IAEf,4CAA4C;IAC5C,WAAW,GAAG,EAAE,CAAC;IAEjB;;;;OAIG;IACH,gBAAgB,GAAG,EAAE,CAAC;IAEtB,mDAAmD;IACnD,GAAG,CAAe;IAClB,kCAAkC;IAClC,MAAM,CAAU;IAChB,0CAA0C;IAC1C,KAAK,CAAe;IAEZ,OAAO,GAAmB,IAAI,CAAC;IAE7B,eAAe;QACvB,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED,8CAA8C;IAC9C,QAAQ,CAAC,GAAgB,EAAE,MAAc,EAAE,KAAkB;QAC3D,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAKD,8DAA8D;IAC9D,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,IAAY;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAED,oEAAoE;IACpE,MAAM,CAA6B,IAAY;QAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAkB,CAAC;IACnD,CAAC;IAES,eAAe;QACvB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAES,GAAG,CAAC,QAAgB,EAAE,YAAqB;QACnD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IAChE,CAAC;IAES,OAAO,CAAC,QAAgB,EAAE,YAAsB;QACxD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IACpE,CAAC;IAES,MAAM,CAAC,QAAgB,EAAE,OAAiB;QAClD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,yFAAyF;IAC/E,WAAW,CAAC,QAAgB,EAAE,OAAiB,EAAE,cAAyB;QAClF,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,qEAAqE;IAC3D,QAAQ,CAAC,QAAgB;QACjC,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED;;;OAGG;IACO,UAAU,CAAC,OAAe,EAAE,IAAa;QACjD,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE;YAC7B,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,SAAS;SACtB,CAAC,CAAC;IACL,CAAC;CACF;AAED,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAA0C,MAAM,gBAAgB,CAAC"}
package/dist/help.d.ts CHANGED
@@ -3,7 +3,7 @@ import type { CommandEntry } from './kernel.js';
3
3
  export declare function formatUsage(entry: CommandEntry): string;
4
4
  /** One-line command row for the command list. */
5
5
  export declare function formatCommandRow(entry: CommandEntry, width: number): string;
6
- /** Render the full command list. */
6
+ /** Render the full command list, with grouped commands under headers. */
7
7
  export declare function renderCommandList(appName: string, version: string, entries: CommandEntry[], lines: string[]): void;
8
8
  /** Render single-command help. */
9
9
  export declare function renderCommandHelp(appName: string, entry: CommandEntry, lines: string[]): void;
package/dist/help.js CHANGED
@@ -3,6 +3,10 @@ import { visibleLength } from '@mudah-cli/ui';
3
3
  export function formatUsage(entry) {
4
4
  const parts = [entry.signature.name];
5
5
  for (const arg of entry.signature.args) {
6
+ if (arg.variadic) {
7
+ parts.push(`{${arg.name}...}`);
8
+ continue;
9
+ }
6
10
  if (arg.optional) {
7
11
  parts.push(arg.defaultValue !== undefined ? `{${arg.name}=${arg.defaultValue}}` : `{${arg.name}?}`);
8
12
  }
@@ -22,19 +26,48 @@ export function formatCommandRow(entry, width) {
22
26
  const padded = entry.name + ' '.repeat(Math.max(1, width - visibleLength(entry.name)));
23
27
  return ` ${padded} ${entry.description}`;
24
28
  }
25
- /** Render the full command list. */
29
+ /** Render the full command list, with grouped commands under headers. */
26
30
  export function renderCommandList(appName, version, entries, lines) {
27
31
  lines.push(`${appName} v${version}`, '');
28
32
  if (entries.length === 0) {
29
33
  lines.push('No commands registered.');
30
34
  return;
31
35
  }
32
- lines.push('Commands:');
36
+ const grouped = groupEntries(entries);
37
+ const ungrouped = entries.filter((entry) => entry.group === undefined);
33
38
  const width = Math.max(...entries.map((e) => visibleLength(e.name))) + 2;
39
+ if (ungrouped.length > 0) {
40
+ lines.push('Commands:');
41
+ for (const entry of ungrouped) {
42
+ lines.push(formatCommandRow(entry, width));
43
+ }
44
+ lines.push('');
45
+ }
46
+ for (const [name, commands] of grouped) {
47
+ lines.push(`${name}:`);
48
+ for (const entry of commands) {
49
+ lines.push(formatCommandRow(entry, width));
50
+ }
51
+ lines.push('');
52
+ }
53
+ // A trailing blank line always precedes the footer.
54
+ if (ungrouped.length === 0 && grouped.length > 0)
55
+ lines.pop();
56
+ lines.push(`Use "${appName} <command> --help" for command details.`);
57
+ }
58
+ /** Bucket grouped entries by namespace, in first-seen order. */
59
+ function groupEntries(entries) {
60
+ const buckets = new Map();
34
61
  for (const entry of entries) {
35
- lines.push(formatCommandRow(entry, width));
62
+ if (entry.group === undefined)
63
+ continue;
64
+ const bucket = buckets.get(entry.group);
65
+ if (bucket === undefined)
66
+ buckets.set(entry.group, [entry]);
67
+ else
68
+ bucket.push(entry);
36
69
  }
37
- lines.push('', `Use "${appName} <command> --help" for command details.`);
70
+ return [...buckets.entries()].sort(([a], [b]) => a.localeCompare(b));
38
71
  }
39
72
  /** Render single-command help. */
40
73
  export function renderCommandHelp(appName, entry, lines) {
@@ -47,7 +80,13 @@ export function renderCommandHelp(appName, entry, lines) {
47
80
  lines.push('Arguments:');
48
81
  const width = Math.max(...entry.signature.args.map((a) => a.name.length)) + 2;
49
82
  for (const arg of entry.signature.args) {
50
- const kind = arg.optional ? (arg.defaultValue !== undefined ? `optional (default: ${arg.defaultValue})` : 'optional') : 'required';
83
+ const kind = arg.variadic
84
+ ? 'one or more (variadic)'
85
+ : arg.optional
86
+ ? arg.defaultValue !== undefined
87
+ ? `optional (default: ${arg.defaultValue})`
88
+ : 'optional'
89
+ : 'required';
51
90
  lines.push(` ${arg.name + ' '.repeat(Math.max(1, width - arg.name.length))} ${kind}`);
52
91
  }
53
92
  lines.push('');
package/dist/help.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { Command } from './command.js';
2
2
  export { renderError } from './errors.js';
3
3
  export { formatCommandRow, formatUsage, renderCommandHelp, renderCommandList } from './help.js';
4
- export { ConsoleKernel, type CommandEntry, type CommandModule } from './kernel.js';
4
+ export { ConsoleKernel, splitCommandName, type CommandEntry, type CommandGroup, type CommandModule, } from './kernel.js';
5
5
  export { Prompts, type PromptOptions } from './prompts.js';
6
6
  export { ArgumentParseError, parseInput, parseSignature, type ParsedArg, type ParsedInput, type ParsedOption, type ParsedSignature, } from './signature.js';
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export { Command } from './command.js';
2
2
  export { renderError } from './errors.js';
3
3
  export { formatCommandRow, formatUsage, renderCommandHelp, renderCommandList } from './help.js';
4
- export { ConsoleKernel } from './kernel.js';
4
+ export { ConsoleKernel, splitCommandName, } from './kernel.js';
5
5
  export { Prompts } from './prompts.js';
6
6
  export { ArgumentParseError, parseInput, parseSignature, } from './signature.js';
7
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAChG,OAAO,EAAE,aAAa,EAAyC,MAAM,aAAa,CAAC;AACnF,OAAO,EAAE,OAAO,EAAsB,MAAM,cAAc,CAAC;AAC3D,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,cAAc,GAKf,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAChG,OAAO,EACL,aAAa,EACb,gBAAgB,GAIjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,OAAO,EAAsB,MAAM,cAAc,CAAC;AAC3D,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,cAAc,GAKf,MAAM,gBAAgB,CAAC"}
package/dist/kernel.d.ts CHANGED
@@ -7,7 +7,25 @@ export interface CommandEntry {
7
7
  signature: ParsedSignature;
8
8
  description: string;
9
9
  factory: () => Command;
10
+ /**
11
+ * Namespace prefix, when the name is grouped (`db:migrate` → `db`).
12
+ * Ungrouped commands have `group: undefined`.
13
+ */
14
+ group?: string;
15
+ /** Short blurb for the group, from the first command that declared one. */
16
+ groupDescription?: string;
10
17
  }
18
+ /** A group of commands sharing a namespace. */
19
+ export interface CommandGroup {
20
+ readonly name: string;
21
+ readonly description: string;
22
+ readonly commands: readonly CommandEntry[];
23
+ }
24
+ /** Split `db:migrate` into its group and short name. */
25
+ export declare function splitCommandName(name: string): {
26
+ group: string | undefined;
27
+ name: string;
28
+ };
11
29
  /**
12
30
  * The console kernel: command registry and dispatcher.
13
31
  *
@@ -32,6 +50,15 @@ export declare class ConsoleKernel {
32
50
  list(): CommandEntry[];
33
51
  has(name: string): boolean;
34
52
  get(name: string): CommandEntry | undefined;
53
+ /**
54
+ * Names of every registered group, sorted. Groups come from `group:name`
55
+ * command signatures — registering `db:migrate` creates the `db` group.
56
+ */
57
+ groups(): CommandGroup[];
58
+ /** Commands with no group. */
59
+ ungrouped(): CommandEntry[];
60
+ /** True when a group with this name exists (implying commands under it). */
61
+ hasGroup(name: string): boolean;
35
62
  /** Dispatch argv (command name + arguments). Returns the exit code. */
36
63
  dispatch(argv: string[]): Promise<number>;
37
64
  }
package/dist/kernel.js CHANGED
@@ -1,5 +1,17 @@
1
1
  import { UsageError } from '@mudah-cli/core';
2
2
  import { Command, ArgumentParseError, parseInput, parseSignature, } from './command.js';
3
+ /** Split `db:migrate` into its group and short name. */
4
+ export function splitCommandName(name) {
5
+ const separator = name.indexOf(':');
6
+ if (separator <= 0)
7
+ return { group: undefined, name };
8
+ return { group: name.slice(0, separator), name: name.slice(separator + 1) };
9
+ }
10
+ /** Read an optional `groupDescription` declared on a command instance. */
11
+ function groupDescriptionOf(instance) {
12
+ const value = instance.groupDescription;
13
+ return typeof value === 'string' ? value : undefined;
14
+ }
3
15
  /**
4
16
  * The console kernel: command registry and dispatcher.
5
17
  *
@@ -37,12 +49,20 @@ export class ConsoleKernel {
37
49
  if (this.commands.has(signature.name)) {
38
50
  throw new Error(`[console] Duplicate command name "${signature.name}".`);
39
51
  }
40
- this.commands.set(signature.name, {
52
+ const entry = {
41
53
  name: signature.name,
42
54
  signature,
43
55
  description: instance.description ?? '',
44
56
  factory: () => new Ctor(),
45
- });
57
+ };
58
+ const group = splitCommandName(signature.name).group;
59
+ if (group !== undefined) {
60
+ entry.group = group;
61
+ const declared = groupDescriptionOf(instance);
62
+ if (declared !== undefined)
63
+ entry.groupDescription = declared;
64
+ }
65
+ this.commands.set(signature.name, entry);
46
66
  return this;
47
67
  }
48
68
  /** All registered commands, sorted by name. */
@@ -55,6 +75,41 @@ export class ConsoleKernel {
55
75
  get(name) {
56
76
  return this.commands.get(name);
57
77
  }
78
+ /**
79
+ * Names of every registered group, sorted. Groups come from `group:name`
80
+ * command signatures — registering `db:migrate` creates the `db` group.
81
+ */
82
+ groups() {
83
+ const byName = new Map();
84
+ for (const entry of this.list()) {
85
+ if (entry.group === undefined)
86
+ continue;
87
+ const bucket = byName.get(entry.group);
88
+ if (bucket === undefined)
89
+ byName.set(entry.group, [entry]);
90
+ else
91
+ bucket.push(entry);
92
+ }
93
+ return [...byName.entries()]
94
+ .sort(([a], [b]) => a.localeCompare(b))
95
+ .map(([name, commands]) => ({
96
+ name,
97
+ description: commands.find((c) => c.groupDescription !== undefined)?.groupDescription ?? '',
98
+ commands,
99
+ }));
100
+ }
101
+ /** Commands with no group. */
102
+ ungrouped() {
103
+ return this.list().filter((entry) => entry.group === undefined);
104
+ }
105
+ /** True when a group with this name exists (implying commands under it). */
106
+ hasGroup(name) {
107
+ for (const entry of this.commands.values()) {
108
+ if (entry.group === name)
109
+ return true;
110
+ }
111
+ return false;
112
+ }
58
113
  /** Dispatch argv (command name + arguments). Returns the exit code. */
59
114
  async dispatch(argv) {
60
115
  const name = argv[0];
@@ -1 +1 @@
1
- {"version":3,"file":"kernel.js","sourceRoot":"","sources":["../src/kernel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"kernel.js","sourceRoot":"","sources":["../src/kernel.ts"],"names":[],"mappings":"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"}
package/dist/prompts.d.ts CHANGED
@@ -1,13 +1,22 @@
1
1
  export interface PromptOptions {
2
2
  input?: NodeJS.ReadStream;
3
3
  output?: NodeJS.WritableStream;
4
- /** Bypasses the raw-mode UI entirely (used in tests and non-interactive runs). */
4
+ /** Bypasses the interactive UI entirely (tests and non-interactive runs). */
5
5
  forcedValue?: string;
6
6
  }
7
+ /** What the caller gets back from an interactive select. */
8
+ export interface SelectResult {
9
+ index: number;
10
+ value: string;
11
+ }
7
12
  /**
8
- * Minimal interactive prompts built on `node:readline` (text/confirm) and a
9
- * numbered fallback for selects. Raw-mode arrow-key selection lands in v0.2;
10
- * the interface is already designed for it.
13
+ * Interactive prompts.
14
+ *
15
+ * - Non-TTY (piped/CI) or `forcedValue` set: no raw mode is touched; answers
16
+ * come from defaults/forced values, and list prompts fall back to numbered
17
+ * menus over readline so piped scripts keep working.
18
+ * - TTY: text uses readline; select/multiselect run a raw-mode arrow-key UI
19
+ * through {@link KeyParser} (↑↓ move, space toggles, enter submits).
11
20
  */
12
21
  export declare class Prompts {
13
22
  private rl;
@@ -20,8 +29,24 @@ export declare class Prompts {
20
29
  confirm(question: string, options?: PromptOptions & {
21
30
  defaultValue?: boolean;
22
31
  }): Promise<boolean>;
23
- /** Pick one of the choices by index (1-based). Returns the choice value. */
32
+ /**
33
+ * Pick one choice. Arrow keys on a TTY; numbered menu otherwise.
34
+ * `forcedValue` accepts a 1-based number.
35
+ */
24
36
  select(question: string, choices: string[], options?: PromptOptions): Promise<string>;
25
- /** Close the underlying readline interface. */
26
- dispose(): void;
37
+ /** Like {@link select} but returns the chosen index as well. */
38
+ selectIndex(question: string, choices: string[], options?: PromptOptions): Promise<SelectResult>;
39
+ /**
40
+ * Pick any number of choices (space toggles, enter submits). Returns
41
+ * checked values in display order; comma-separated fallback when piped.
42
+ */
43
+ multiselect(question: string, choices: string[], options?: PromptOptions & {
44
+ defaultChecked?: number[];
45
+ }): Promise<string[]>;
46
+ /** Like {@link multiselect} but returns selected indices. */
47
+ multiSelectIndices(question: string, choices: string[], options?: PromptOptions & {
48
+ defaultChecked?: number[];
49
+ }): Promise<number[]>;
50
+ /** Masked free-text question. No local echo on TTYs; asterisk feedback only. */
51
+ password(question: string, options?: PromptOptions): Promise<string>;
27
52
  }
package/dist/prompts.js CHANGED
@@ -1,14 +1,23 @@
1
1
  import * as readline from 'node:readline';
2
+ import { KeyParser } from '@mudah-cli/terminal';
2
3
  /**
3
- * Minimal interactive prompts built on `node:readline` (text/confirm) and a
4
- * numbered fallback for selects. Raw-mode arrow-key selection lands in v0.2;
5
- * the interface is already designed for it.
4
+ * Interactive prompts.
5
+ *
6
+ * - Non-TTY (piped/CI) or `forcedValue` set: no raw mode is touched; answers
7
+ * come from defaults/forced values, and list prompts fall back to numbered
8
+ * menus over readline so piped scripts keep working.
9
+ * - TTY: text uses readline; select/multiselect run a raw-mode arrow-key UI
10
+ * through {@link KeyParser} (↑↓ move, space toggles, enter submits).
6
11
  */
7
12
  export class Prompts {
8
13
  rl = null;
9
- makeReader() {
14
+ makeReader(input, output) {
10
15
  if (!this.rl) {
11
- this.rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: process.stdin.isTTY === true });
16
+ this.rl = readline.createInterface({
17
+ input: input ?? process.stdin,
18
+ output: output ?? process.stdout,
19
+ terminal: process.stdin.isTTY === true,
20
+ });
12
21
  }
13
22
  return this.rl;
14
23
  }
@@ -16,7 +25,7 @@ export class Prompts {
16
25
  async ask(question, options = {}) {
17
26
  if (options.forcedValue !== undefined)
18
27
  return options.forcedValue;
19
- const rl = this.makeReader();
28
+ const rl = this.makeReader(options.input, options.output);
20
29
  const suffix = options.defaultValue !== undefined ? ` (${options.defaultValue})` : '';
21
30
  return new Promise((resolve) => {
22
31
  rl.question(`${question}${suffix} `, (answer) => {
@@ -36,30 +45,194 @@ export class Prompts {
36
45
  return def;
37
46
  return answer.toLowerCase().startsWith('y');
38
47
  }
39
- /** Pick one of the choices by index (1-based). Returns the choice value. */
48
+ /**
49
+ * Pick one choice. Arrow keys on a TTY; numbered menu otherwise.
50
+ * `forcedValue` accepts a 1-based number.
51
+ */
40
52
  async select(question, choices, options = {}) {
53
+ const result = await this.selectIndex(question, choices, options);
54
+ return result.value;
55
+ }
56
+ /** Like {@link select} but returns the chosen index as well. */
57
+ async selectIndex(question, choices, options = {}) {
58
+ if (choices.length === 0)
59
+ throw new Error('[console] select() requires at least one choice.');
41
60
  if (options.forcedValue !== undefined) {
42
- const choice = choices[Number(options.forcedValue) - 1];
61
+ const index = Number(options.forcedValue) - 1;
62
+ const choice = choices[index];
43
63
  if (!choice)
44
64
  throw new Error(`[console] Forced select value "${options.forcedValue}" is out of range.`);
45
- return choice;
65
+ return { index, value: choice };
46
66
  }
47
- process.stderr.write(`\n${question}\n`);
48
- choices.forEach((choice, i) => {
49
- process.stderr.write(` ${i + 1}. ${choice}\n`);
50
- });
51
- const answer = await this.ask('Choose', options);
52
- const index = Number(answer) - 1;
53
- const choice = choices[index];
54
- if (!choice) {
55
- throw new Error(`[console] Invalid selection "${answer}".`);
67
+ // A caller-provided input stream decides interactivity (fake TTYs in
68
+ // tests); plain process.stdin falls back to numbered menus when piped.
69
+ const interactive = (options.input ?? process.stdin).isTTY === true;
70
+ if (!interactive) {
71
+ writeOut(options.output, `\n${question}\n`);
72
+ choices.forEach((choice, i) => writeOut(options.output, ` ${i + 1}. ${choice}\n`));
73
+ const answer = await this.ask('Choose', options);
74
+ const index = Number(answer) - 1;
75
+ const choice = choices[index];
76
+ if (!choice)
77
+ throw new Error(`[console] Invalid selection "${answer}".`);
78
+ return { index, value: choice };
56
79
  }
57
- return choice;
80
+ const result = await rawSelect(question, choices, { ...options, multi: false });
81
+ return { index: result.index, value: result.value };
82
+ }
83
+ /**
84
+ * Pick any number of choices (space toggles, enter submits). Returns
85
+ * checked values in display order; comma-separated fallback when piped.
86
+ */
87
+ async multiselect(question, choices, options = {}) {
88
+ const indices = await this.multiSelectIndices(question, choices, options);
89
+ return indices.map((i) => choices[i]);
58
90
  }
59
- /** Close the underlying readline interface. */
60
- dispose() {
61
- this.rl?.close();
62
- this.rl = null;
91
+ /** Like {@link multiselect} but returns selected indices. */
92
+ async multiSelectIndices(question, choices, options = {}) {
93
+ if (choices.length === 0)
94
+ throw new Error('[console] multiselect() requires at least one choice.');
95
+ if (options.forcedValue !== undefined) {
96
+ return parseNumberList(options.forcedValue, choices.length);
97
+ }
98
+ const interactive = (options.input ?? process.stdin).isTTY === true;
99
+ if (!interactive) {
100
+ writeOut(options.output, `\n${question}\n`);
101
+ choices.forEach((choice, i) => writeOut(options.output, ` ${i + 1}. ${choice}\n`));
102
+ const answer = await this.ask('Choose (comma-separated numbers)', options);
103
+ return parseNumberList(answer, choices.length);
104
+ }
105
+ const result = await rawSelect(question, choices, { ...options, multi: true });
106
+ return result.indices ?? [];
63
107
  }
108
+ /** Masked free-text question. No local echo on TTYs; asterisk feedback only. */
109
+ async password(question, options = {}) {
110
+ if (options.forcedValue !== undefined)
111
+ return options.forcedValue;
112
+ const input = options.input ?? process.stdin;
113
+ const output = options.output ?? process.stdout;
114
+ writeOut(output, `${question} `);
115
+ if (input.isTTY !== true) {
116
+ const rl = this.makeReader(options.input, options.output);
117
+ const answer = await new Promise((resolve) => rl.question('', resolve));
118
+ writeOut(output, '\n');
119
+ return answer;
120
+ }
121
+ const wasRaw = input.isRaw ?? false;
122
+ input.setRawMode(true);
123
+ input.resume();
124
+ let value = '';
125
+ try {
126
+ await new Promise((resolve) => {
127
+ const parser = new KeyParser();
128
+ const onKey = (chunk) => {
129
+ for (const event of parser.feed(String(chunk))) {
130
+ if (event.name === 'enter') {
131
+ input.off('data', onKey);
132
+ resolve();
133
+ return;
134
+ }
135
+ if (event.name === 'backspace') {
136
+ value = value.slice(0, -1);
137
+ }
138
+ else if (event.ch !== undefined && event.ch >= ' ') {
139
+ value += event.ch;
140
+ writeOut(output, '*');
141
+ }
142
+ }
143
+ };
144
+ input.on('data', onKey);
145
+ });
146
+ }
147
+ finally {
148
+ input.setRawMode(wasRaw);
149
+ writeOut(output, '\n');
150
+ }
151
+ return value;
152
+ }
153
+ }
154
+ /** The shared raw-mode arrow-key picker used by select/multiselect on TTYs. */
155
+ function rawSelect(question, choices, options) {
156
+ const input = options.input ?? process.stdin;
157
+ const output = options.output ?? process.stdout;
158
+ return new Promise((resolve) => {
159
+ let cursor = 0;
160
+ const checked = new Set(options.multi ? (options.defaultChecked ?? []) : []);
161
+ let frameHeight = 0;
162
+ const parser = new KeyParser();
163
+ const render = () => {
164
+ const lines = [`${question}`];
165
+ choices.forEach((choice, i) => {
166
+ const pointer = i === cursor ? '❯ ' : ' ';
167
+ const box = options.multi ? (checked.has(i) ? '[x] ' : '[ ] ') : '';
168
+ lines.push(`${pointer}${box}${choice}`);
169
+ });
170
+ lines.push('', options.multi ? 'space toggle · ↑↓ move · enter submit' : '↑↓ move · enter choose · esc cancel');
171
+ return lines;
172
+ };
173
+ const draw = () => {
174
+ if (frameHeight > 0) {
175
+ writeOut(output, `\x1b[${frameHeight}A\x1b[J`);
176
+ }
177
+ writeOut(output, `${render().join('\n')}\n`);
178
+ frameHeight = render().length;
179
+ };
180
+ const cleanup = (result) => {
181
+ input.off('data', onData);
182
+ if (input.isTTY)
183
+ input.setRawMode(false);
184
+ writeOut(output, `\x1b[${frameHeight}A\x1b[J`);
185
+ resolve(result);
186
+ };
187
+ const onData = (chunk) => {
188
+ // One parser across chunks so split sequences reassemble.
189
+ for (const event of parser.feed(String(chunk))) {
190
+ switch (event.name) {
191
+ case 'up':
192
+ cursor = Math.max(0, cursor - 1);
193
+ break;
194
+ case 'down':
195
+ cursor = Math.min(choices.length - 1, cursor + 1);
196
+ break;
197
+ case 'space':
198
+ if (options.multi) {
199
+ if (checked.has(cursor))
200
+ checked.delete(cursor);
201
+ else
202
+ checked.add(cursor);
203
+ }
204
+ break;
205
+ case 'enter': {
206
+ const value = choices[cursor];
207
+ cleanup(options.multi
208
+ ? { index: cursor, value, indices: [...checked].sort((a, b) => a - b) }
209
+ : { index: cursor, value });
210
+ return;
211
+ }
212
+ case 'escape':
213
+ case 'ctrl+c':
214
+ cleanup({ index: -1, value: '', indices: [] });
215
+ return;
216
+ default:
217
+ break;
218
+ }
219
+ }
220
+ draw();
221
+ };
222
+ input.setRawMode(true);
223
+ input.resume();
224
+ input.on('data', onData);
225
+ draw();
226
+ });
227
+ }
228
+ function parseNumberList(answer, max) {
229
+ const parsed = answer
230
+ .split(',')
231
+ .map((part) => Number(part.trim()) - 1)
232
+ .filter((index) => index >= 0 && index < max);
233
+ return [...new Set(parsed)].sort((a, b) => a - b);
234
+ }
235
+ function writeOut(stream, text) {
236
+ stream?.write(text);
64
237
  }
65
238
  //# sourceMappingURL=prompts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ export interface ParsedArg {
2
2
  name: string;
3
3
  optional: boolean;
4
4
  defaultValue?: string;
5
+ /** Variadic: collects all remaining positionals (`{paths...}`). */
6
+ variadic?: boolean;
5
7
  }
6
8
  export interface ParsedOption {
7
9
  name: string;
@@ -16,6 +18,8 @@ export interface ParsedSignature {
16
18
  }
17
19
  export interface ParsedInput {
18
20
  args: Record<string, string>;
21
+ /** Variadic arg values, keyed by arg name (only for `{name...}`). */
22
+ lists: Record<string, string[]>;
19
23
  options: Record<string, string | boolean>;
20
24
  }
21
25
  /**
@@ -23,13 +27,15 @@ export interface ParsedInput {
23
27
  *
24
28
  * ```
25
29
  * deploy {branch?} {ref=main} [--force] [--env=production]
30
+ * convert {paths...} [--to=webp]
26
31
  * ```
27
32
  */
28
33
  export declare function parseSignature(signature: string): ParsedSignature;
29
34
  /**
30
35
  * Parse raw argv (everything after the command name) against a parsed
31
36
  * signature. Positional values fill args in order; `--name` / `--name=value`
32
- * fill options. Throws `ArgumentParseError` on violations.
37
+ * fill options. A trailing variadic arg collects all remaining positionals.
38
+ * Throws `ArgumentParseError` on violations.
33
39
  */
34
40
  export declare function parseInput(signature: ParsedSignature, argv: string[]): ParsedInput;
35
41
  export declare class ArgumentParseError extends Error {
package/dist/signature.js CHANGED
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * ```
5
5
  * deploy {branch?} {ref=main} [--force] [--env=production]
6
+ * convert {paths...} [--to=webp]
6
7
  * ```
7
8
  */
8
9
  export function parseSignature(signature) {
@@ -10,18 +11,43 @@ export function parseSignature(signature) {
10
11
  const trimmed = signature.trim();
11
12
  const firstSpace = trimmed.search(/\s/);
12
13
  result.name = firstSpace === -1 ? trimmed : trimmed.slice(0, firstSpace);
14
+ // Names are unvalidated elsewhere, so a typo like "db:" would otherwise
15
+ // register an unreachable command instead of failing at authoring time.
16
+ if (!/^[a-zA-Z][a-zA-Z0-9]*(?::[a-zA-Z][a-zA-Z0-9-]*)?$/.test(result.name)) {
17
+ throw new Error(`[console] Invalid command name "${result.name}" in signature "${signature}". Use a name like "deploy" or a group like "db:migrate".`);
18
+ }
19
+ let variadicIndex = -1;
13
20
  for (const match of trimmed.matchAll(/\{([^{}]+)\}/g)) {
14
21
  const inner = match[1];
15
- const parsed = /^([a-zA-Z][\w:.-]*)(\?)?(?:=(.*))?$/.exec(inner);
22
+ // Non-greedy name so trailing "..." is captured by the variadic group,
23
+ // not eaten by the name character class.
24
+ const parsed = /^([a-zA-Z][\w:.-]*?)(\?)?(\.\.\.)?(?:=(.*))?$/.exec(inner);
16
25
  if (!parsed) {
17
26
  throw new Error(`[console] Invalid argument syntax "{${inner}}" in signature "${signature}".`);
18
27
  }
28
+ const isVariadic = parsed[3] !== undefined;
29
+ if (isVariadic && parsed[4] !== undefined) {
30
+ throw new Error(`[console] Variadic argument "{${inner}}" cannot take a default value.`);
31
+ }
32
+ if (isVariadic && parsed[2] === '?') {
33
+ throw new Error(`[console] Variadic argument "{${inner}}" cannot also be optional.`);
34
+ }
35
+ if (isVariadic) {
36
+ if (variadicIndex !== -1) {
37
+ throw new Error(`[console] Only one variadic argument is allowed in signature "${signature}".`);
38
+ }
39
+ variadicIndex = result.args.length;
40
+ }
19
41
  result.args.push({
20
42
  name: parsed[1],
21
43
  optional: parsed[2] === '?',
22
- defaultValue: parsed[3],
44
+ ...(isVariadic ? { variadic: true } : {}),
45
+ defaultValue: parsed[4],
23
46
  });
24
47
  }
48
+ if (variadicIndex !== -1 && variadicIndex !== result.args.length - 1) {
49
+ throw new Error(`[console] Variadic argument must be the final argument in signature "${signature}".`);
50
+ }
25
51
  for (const match of trimmed.matchAll(/\[-{2}([a-zA-Z][\w-]*)(?:=([^}\]]*))?\]/g)) {
26
52
  const name = match[1];
27
53
  const takesValue = match[2] !== undefined;
@@ -36,10 +62,11 @@ export function parseSignature(signature) {
36
62
  /**
37
63
  * Parse raw argv (everything after the command name) against a parsed
38
64
  * signature. Positional values fill args in order; `--name` / `--name=value`
39
- * fill options. Throws `ArgumentParseError` on violations.
65
+ * fill options. A trailing variadic arg collects all remaining positionals.
66
+ * Throws `ArgumentParseError` on violations.
40
67
  */
41
68
  export function parseInput(signature, argv) {
42
- const input = { args: {}, options: {} };
69
+ const input = { args: {}, lists: {}, options: {} };
43
70
  const positionals = [];
44
71
  for (let i = 0; i < argv.length; i++) {
45
72
  const token = argv[i];
@@ -66,11 +93,13 @@ export function parseInput(signature, argv) {
66
93
  throw new ArgumentParseError(`Unknown option "--${name}" for command "${signature.name}".`);
67
94
  }
68
95
  }
69
- // Fill args.
70
- if (positionals.length > signature.args.length) {
96
+ const variadic = signature.args.length > 0 && (signature.args.at(-1)?.variadic === true);
97
+ const fixedArgs = variadic ? signature.args.slice(0, -1) : signature.args;
98
+ if (!variadic && positionals.length > signature.args.length) {
71
99
  throw new ArgumentParseError(`Too many arguments for "${signature.name}": expected at most ${signature.args.length}.`);
72
100
  }
73
- signature.args.forEach((arg, index) => {
101
+ // Fixed args consume positionals in order.
102
+ fixedArgs.forEach((arg, index) => {
74
103
  const value = positionals[index];
75
104
  if (value !== undefined) {
76
105
  input.args[arg.name] = value;
@@ -82,6 +111,15 @@ export function parseInput(signature, argv) {
82
111
  throw new ArgumentParseError(`Missing required argument "${arg.name}" for command "${signature.name}".`);
83
112
  }
84
113
  });
114
+ // The variadic arg collects everything left.
115
+ if (variadic) {
116
+ const collected = positionals.slice(fixedArgs.length);
117
+ const variadicName = signature.args.at(-1).name;
118
+ if (collected.length === 0) {
119
+ throw new ArgumentParseError(`Missing required argument "${variadicName}..." for command "${signature.name}".`);
120
+ }
121
+ input.lists[variadicName] = collected;
122
+ }
85
123
  // Fill options with defaults.
86
124
  for (const option of signature.options) {
87
125
  if (input.options[option.name] === undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"signature.js","sourceRoot":"","sources":["../src/signature.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"signature.js","sourceRoot":"","sources":["../src/signature.ts"],"names":[],"mappings":"AA4BA;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB;IAC9C,MAAM,MAAM,GAAoB,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAEpE,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,IAAI,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAEzE,wEAAwE;IACxE,wEAAwE;IACxE,IAAI,CAAC,mDAAmD,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CACb,mCAAmC,MAAM,CAAC,IAAI,mBAAmB,SAAS,2DAA2D,CACtI,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,GAAG,CAAC,CAAC,CAAC;IACvB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACxB,uEAAuE;QACvE,yCAAyC;QACzC,MAAM,MAAM,GAAG,+CAA+C,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,oBAAoB,SAAS,IAAI,CAAC,CAAC;QACjG,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;QAC3C,IAAI,UAAU,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,iCAAiC,CAAC,CAAC;QAC3F,CAAC;QACD,IAAI,UAAU,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,6BAA6B,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,KAAK,CAAC,iEAAiE,SAAS,IAAI,CAAC,CAAC;YAClG,CAAC;YACD,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QACrC,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YACf,IAAI,EAAE,MAAM,CAAC,CAAC,CAAE;YAChB,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;YAC3B,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;SACxB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,aAAa,KAAK,CAAC,CAAC,IAAI,aAAa,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,wEAAwE,SAAS,IAAI,CAAC,CAAC;IACzG,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,0CAA0C,CAAC,EAAE,CAAC;QACjF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;YAClB,IAAI;YACJ,UAAU;YACV,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;SAChD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,SAA0B,EAAE,IAAc;IACnE,MAAM,KAAK,GAAgB,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAEhE,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACvB,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,WAAW,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM;QACR,CAAC;QACD,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;gBACd,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC1D,CAAC;YACD,SAAS;QACX,CAAC;QACD,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,4BAA4B;IAC5B,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,kBAAkB,CAAC,qBAAqB,IAAI,kBAAkB,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC;IACzF,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;IAE1E,IAAI,CAAC,QAAQ,IAAI,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5D,MAAM,IAAI,kBAAkB,CAC1B,2BAA2B,SAAS,CAAC,IAAI,uBAAuB,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CACzF,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC/B,CAAC;aAAM,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC;QAC1C,CAAC;aAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;YACzB,MAAM,IAAI,kBAAkB,CAAC,8BAA8B,GAAG,CAAC,IAAI,kBAAkB,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC;QAC3G,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,6CAA6C;IAC7C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;QACjD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,kBAAkB,CAC1B,8BAA8B,YAAY,qBAAqB,SAAS,CAAC,IAAI,IAAI,CAClF,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;IACxC,CAAC;IAED,8BAA8B;IAC9B,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YAC7C,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACvF,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mudah-cli/console",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Command system: string signatures, typed dispatch, interactive prompts, and help rendering.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -18,10 +18,10 @@
18
18
  ],
19
19
  "sideEffects": false,
20
20
  "dependencies": {
21
- "@mudah-cli/animation": "^0.1.0",
22
- "@mudah-cli/core": "^0.1.0",
23
- "@mudah-cli/terminal": "^0.1.0",
24
- "@mudah-cli/ui": "^0.1.0"
21
+ "@mudah-cli/animation": "^0.3.0",
22
+ "@mudah-cli/core": "^0.3.0",
23
+ "@mudah-cli/terminal": "^0.3.0",
24
+ "@mudah-cli/ui": "^0.3.0"
25
25
  },
26
26
  "publishConfig": {
27
27
  "access": "public"