@boneskull/bargs 4.0.1 → 4.1.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.
@@ -0,0 +1,565 @@
1
+ "use strict";
2
+ /**
3
+ * Shell completion script generation for bargs CLIs.
4
+ *
5
+ * Provides dynamic shell completion support for bash, zsh, and fish shells. The
6
+ * generated scripts call back to the CLI to get completion candidates.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.validateShell = exports.getCompletionCandidates = exports.generateCompletionScript = void 0;
12
+ /**
13
+ * Sanitize a CLI name for use as a shell function name.
14
+ *
15
+ * Ensures the result is a valid POSIX identifier: starts with a letter or
16
+ * underscore, contains only alphanumeric characters and underscores.
17
+ *
18
+ * @function
19
+ * @param name - The CLI name to sanitize
20
+ * @returns A valid shell function name
21
+ */
22
+ const sanitizeFunctionName = (name) => {
23
+ // Replace any non-alphanumeric character with underscore
24
+ let sanitized = name.replace(/[^a-zA-Z0-9]/g, '_');
25
+ // Collapse multiple consecutive underscores
26
+ sanitized = sanitized.replace(/_+/g, '_');
27
+ // Remove leading/trailing underscores
28
+ sanitized = sanitized.replace(/^_+|_+$/g, '');
29
+ // Ensure it starts with a letter or underscore (not a digit)
30
+ if (/^[0-9]/.test(sanitized)) {
31
+ sanitized = `_${sanitized}`;
32
+ }
33
+ // Fallback for empty result
34
+ if (!sanitized) {
35
+ sanitized = 'cli';
36
+ }
37
+ return sanitized;
38
+ };
39
+ /**
40
+ * Generate bash completion script.
41
+ *
42
+ * @function
43
+ */
44
+ const generateBashScript = (cliName) => {
45
+ const funcName = `_${sanitizeFunctionName(cliName)}_completions`;
46
+ return `# bash completion for ${cliName}
47
+ # Add to ~/.bashrc or ~/.bash_profile:
48
+ # source <(${cliName} --completion-script bash)
49
+ # Or:
50
+ # ${cliName} --completion-script bash >> ~/.bashrc
51
+
52
+ ${funcName}() {
53
+ local IFS=$'\\n'
54
+ local cur="\${COMP_WORDS[COMP_CWORD]}"
55
+
56
+ # Call CLI to get completions
57
+ local completions
58
+ completions=($("${cliName}" --get-bargs-completions bash "\${COMP_WORDS[@]}"))
59
+
60
+ # Filter by current word prefix
61
+ COMPREPLY=($(compgen -W "\${completions[*]}" -- "\${cur}"))
62
+
63
+ # Fall back to file completion if no matches and not completing an option
64
+ if [[ \${#COMPREPLY[@]} -eq 0 && "\${cur}" != -* ]]; then
65
+ compopt -o default
66
+ fi
67
+ }
68
+
69
+ complete -o default -F ${funcName} ${cliName}
70
+ `;
71
+ };
72
+ /**
73
+ * Generate zsh completion script.
74
+ *
75
+ * @function
76
+ */
77
+ const generateZshScript = (cliName) => {
78
+ const funcName = `_${sanitizeFunctionName(cliName)}`;
79
+ return `#compdef ${cliName}
80
+ # zsh completion for ${cliName}
81
+ # Add to ~/.zshrc:
82
+ # source <(${cliName} --completion-script zsh)
83
+ # Or save to a file in your $fpath:
84
+ # ${cliName} --completion-script zsh > ~/.zsh/completions/_${cliName}
85
+
86
+ ${funcName}() {
87
+ local completions
88
+
89
+ # Call CLI to get completions with descriptions
90
+ completions=("\${(@f)$("${cliName}" --get-bargs-completions zsh "\${words[@]}")}")
91
+
92
+ if [[ \${#completions[@]} -gt 0 && -n "\${completions[1]}" ]]; then
93
+ # Check if completions have descriptions (format: "value:description")
94
+ if [[ "\${completions[1]}" == *":"* ]]; then
95
+ _describe 'completions' completions
96
+ else
97
+ compadd -a completions
98
+ fi
99
+ fi
100
+ }
101
+
102
+ compdef ${funcName} ${cliName}
103
+ `;
104
+ };
105
+ /**
106
+ * Generate fish completion script.
107
+ *
108
+ * @function
109
+ */
110
+ const generateFishScript = (cliName) => {
111
+ const funcName = `__fish_${sanitizeFunctionName(cliName)}_complete`;
112
+ return `# fish completion for ${cliName}
113
+ # Save to ~/.config/fish/completions/${cliName}.fish:
114
+ # ${cliName} --completion-script fish > ~/.config/fish/completions/${cliName}.fish
115
+
116
+ function ${funcName}
117
+ set -l tokens (commandline -opc)
118
+ ${cliName} --get-bargs-completions fish $tokens
119
+ end
120
+
121
+ # Disable file completions by default, let the CLI decide
122
+ complete -c ${cliName} -f -a '(${funcName})'
123
+ `;
124
+ };
125
+ /**
126
+ * Generate a shell completion script for the given CLI.
127
+ *
128
+ * The generated script calls back to the CLI with `--get-bargs-completions` to
129
+ * get completion candidates dynamically.
130
+ *
131
+ * @example
132
+ *
133
+ * ```typescript
134
+ * // Output script for bash
135
+ * console.log(generateCompletionScript('mytool', 'bash'));
136
+ * // Redirect to shell config: mytool --completion-script bash >> ~/.bashrc
137
+ * ```
138
+ *
139
+ * @function
140
+ * @param cliName - The name of the CLI executable
141
+ * @param shell - The target shell ('bash', 'zsh', or 'fish')
142
+ * @returns The completion script as a string
143
+ * @group Completion
144
+ */
145
+ const generateCompletionScript = (cliName, shell) => {
146
+ switch (shell) {
147
+ case 'bash':
148
+ return generateBashScript(cliName);
149
+ case 'fish':
150
+ return generateFishScript(cliName);
151
+ case 'zsh':
152
+ return generateZshScript(cliName);
153
+ default:
154
+ throw new Error(`Unsupported shell: ${shell}`);
155
+ }
156
+ };
157
+ exports.generateCompletionScript = generateCompletionScript;
158
+ /**
159
+ * Extract completion metadata from internal CLI state.
160
+ *
161
+ * @function
162
+ */
163
+ const extractCompletionMetadata = (state) => {
164
+ const globalOptions = extractOptionsInfo(state.globalParser?.__optionsSchema ?? {});
165
+ const commands = new Map();
166
+ for (const [name, entry] of state.commands) {
167
+ // Skip the internal default command marker
168
+ if (name === '__default__') {
169
+ continue;
170
+ }
171
+ if (entry.type === 'command') {
172
+ commands.set(name, {
173
+ aliases: entry.aliases ?? [],
174
+ description: entry.description,
175
+ name,
176
+ options: extractOptionsInfo(entry.cmd.__optionsSchema),
177
+ positionals: extractPositionalsInfo(entry.cmd.__positionalsSchema),
178
+ });
179
+ }
180
+ else if (entry.type === 'nested') {
181
+ commands.set(name, {
182
+ aliases: entry.aliases ?? [],
183
+ description: entry.description,
184
+ name,
185
+ nestedBuilder: entry.builder,
186
+ options: [],
187
+ positionals: [],
188
+ });
189
+ }
190
+ }
191
+ return {
192
+ commands,
193
+ globalOptions,
194
+ name: state.name,
195
+ };
196
+ };
197
+ /**
198
+ * Check if a value is an internal builder with __getState method.
199
+ *
200
+ * @function
201
+ */
202
+ const isInternalBuilder = (value) => {
203
+ return (typeof value === 'object' &&
204
+ value !== null &&
205
+ '__getState' in value &&
206
+ typeof value.__getState === 'function');
207
+ };
208
+ /**
209
+ * Extract metadata from a nested builder.
210
+ *
211
+ * @function
212
+ */
213
+ const extractNestedMetadata = (nestedBuilder) => {
214
+ if (!isInternalBuilder(nestedBuilder)) {
215
+ return undefined;
216
+ }
217
+ return extractCompletionMetadata(nestedBuilder.__getState());
218
+ };
219
+ /**
220
+ * Extract option info from options schema.
221
+ *
222
+ * @function
223
+ */
224
+ const extractOptionsInfo = (schema) => {
225
+ const options = [];
226
+ for (const [name, def] of Object.entries(schema)) {
227
+ // Skip hidden options
228
+ if (def.hidden) {
229
+ continue;
230
+ }
231
+ const aliases = [];
232
+ if ('aliases' in def && Array.isArray(def.aliases)) {
233
+ for (const alias of def.aliases) {
234
+ if (alias.length === 1) {
235
+ aliases.push(`-${alias}`);
236
+ }
237
+ else {
238
+ aliases.push(`--${alias}`);
239
+ }
240
+ }
241
+ }
242
+ options.push({
243
+ aliases,
244
+ choices: getChoices(def),
245
+ description: def.description,
246
+ name: `--${name}`,
247
+ takesValue: def.type !== 'boolean' && def.type !== 'count',
248
+ type: def.type,
249
+ });
250
+ // Add --no-<name> for boolean options
251
+ if (def.type === 'boolean') {
252
+ options.push({
253
+ aliases: [],
254
+ description: def.description ? `Disable ${def.description}` : undefined,
255
+ name: `--no-${name}`,
256
+ takesValue: false,
257
+ type: 'boolean',
258
+ });
259
+ }
260
+ }
261
+ return options;
262
+ };
263
+ /**
264
+ * Extract positional info from positionals schema.
265
+ *
266
+ * @function
267
+ */
268
+ const extractPositionalsInfo = (schema) => schema.map((pos) => ({
269
+ choices: getChoices(pos),
270
+ description: pos.description,
271
+ name: pos.name ?? 'arg',
272
+ type: pos.type,
273
+ }));
274
+ /**
275
+ * Get choices from an option or positional definition.
276
+ *
277
+ * @function
278
+ */
279
+ const getChoices = (def) => {
280
+ if ('choices' in def && Array.isArray(def.choices)) {
281
+ return def.choices;
282
+ }
283
+ return undefined;
284
+ };
285
+ /**
286
+ * Find a command by name or alias in the metadata.
287
+ *
288
+ * @function
289
+ */
290
+ const findCommand = (metadata, name) => {
291
+ // Try direct match
292
+ const direct = metadata.commands.get(name);
293
+ if (direct) {
294
+ return direct;
295
+ }
296
+ // Try alias match
297
+ for (const [, cmd] of metadata.commands) {
298
+ if (cmd.aliases.includes(name)) {
299
+ return cmd;
300
+ }
301
+ }
302
+ return undefined;
303
+ };
304
+ /**
305
+ * Analyze command context from args, recursively handling nested commands.
306
+ *
307
+ * @function
308
+ */
309
+ const getCommandContext = (metadata, args, accumulatedOptions = []) => {
310
+ // Accumulate global options from this level
311
+ const options = [...accumulatedOptions, ...metadata.globalOptions];
312
+ if (metadata.commands.size === 0) {
313
+ return {
314
+ accumulatedOptions: options,
315
+ availableCommands: [],
316
+ needsCommand: false,
317
+ positionalIndex: 0,
318
+ };
319
+ }
320
+ // Find the first non-option argument (potential command)
321
+ // Note: The last arg is the current word being completed, so we don't count it
322
+ // as a completed positional
323
+ let commandName;
324
+ let commandArgIndex = -1;
325
+ // Process all args except the last one (which is being completed)
326
+ const completedArgs = args.slice(0, -1);
327
+ for (let i = 0; i < completedArgs.length; i++) {
328
+ const arg = completedArgs[i];
329
+ if (!arg.startsWith('-')) {
330
+ // First non-option is the command at this level
331
+ commandName = arg;
332
+ commandArgIndex = i;
333
+ break;
334
+ }
335
+ }
336
+ // Check if the command name matches a known command or alias
337
+ if (commandName) {
338
+ const cmd = findCommand(metadata, commandName);
339
+ if (cmd) {
340
+ // Check if this is a nested command - if so, recurse
341
+ if (cmd.nestedBuilder) {
342
+ const nestedMetadata = extractNestedMetadata(cmd.nestedBuilder);
343
+ if (nestedMetadata) {
344
+ // Get remaining args after this command
345
+ const remainingArgs = completedArgs.slice(commandArgIndex + 1);
346
+ // Add the current word being completed
347
+ if (args.length > 0) {
348
+ remainingArgs.push(args[args.length - 1]);
349
+ }
350
+ return getCommandContext(nestedMetadata, remainingArgs, options);
351
+ }
352
+ }
353
+ // It's a leaf command - calculate positional index
354
+ let positionalIndex = 0;
355
+ for (let i = commandArgIndex + 1; i < completedArgs.length; i++) {
356
+ const arg = completedArgs[i];
357
+ if (!arg.startsWith('-')) {
358
+ positionalIndex++;
359
+ }
360
+ }
361
+ return {
362
+ accumulatedOptions: options,
363
+ availableCommands: [],
364
+ currentCommand: cmd,
365
+ needsCommand: false,
366
+ positionalIndex,
367
+ };
368
+ }
369
+ }
370
+ // No valid command yet at this level - need to show available commands
371
+ return {
372
+ accumulatedOptions: options,
373
+ availableCommands: Array.from(metadata.commands.values()),
374
+ needsCommand: true,
375
+ positionalIndex: 0,
376
+ };
377
+ };
378
+ /**
379
+ * Get all options available in the current context.
380
+ *
381
+ * @function
382
+ */
383
+ const getAllOptionsForContext = (metadata, args) => {
384
+ // getCommandContext now accumulates global options from all parent levels
385
+ const commandContext = getCommandContext(metadata, args);
386
+ // Start with accumulated options (includes all global options from parent levels)
387
+ const options = [...commandContext.accumulatedOptions];
388
+ // Add command-specific options if we're in a leaf command
389
+ if (commandContext.currentCommand) {
390
+ options.push(...commandContext.currentCommand.options);
391
+ }
392
+ return options;
393
+ };
394
+ /**
395
+ * Format candidates for shell output.
396
+ *
397
+ * @function
398
+ */
399
+ const formatCandidates = (candidates, shell) => {
400
+ switch (shell) {
401
+ case 'fish':
402
+ // fish supports descriptions with tab separator
403
+ return candidates.map((c) => c.description ? `${c.value}\t${c.description}` : c.value);
404
+ case 'zsh':
405
+ // zsh supports descriptions in format "value:description"
406
+ return candidates.map((c) => c.description ? `${c.value}:${c.description}` : c.value);
407
+ case 'bash':
408
+ default:
409
+ // bash doesn't support descriptions in basic completion
410
+ return candidates.map((c) => c.value);
411
+ }
412
+ };
413
+ /**
414
+ * Get command candidates.
415
+ *
416
+ * @function
417
+ */
418
+ const getCommandCandidates = (commands, _currentWord, shell) => {
419
+ const candidates = [];
420
+ for (const cmd of commands) {
421
+ candidates.push({ description: cmd.description, value: cmd.name });
422
+ for (const alias of cmd.aliases) {
423
+ candidates.push({
424
+ description: cmd.description ? `(alias) ${cmd.description}` : '(alias)',
425
+ value: alias,
426
+ });
427
+ }
428
+ }
429
+ return formatCandidates(candidates, shell);
430
+ };
431
+ /**
432
+ * Get option candidates.
433
+ *
434
+ * @function
435
+ */
436
+ const getOptionCandidates = (metadata, args, shell) => {
437
+ const allOptions = getAllOptionsForContext(metadata, args);
438
+ const candidates = [];
439
+ for (const opt of allOptions) {
440
+ candidates.push({ description: opt.description, value: opt.name });
441
+ for (const alias of opt.aliases) {
442
+ candidates.push({ description: opt.description, value: alias });
443
+ }
444
+ }
445
+ return formatCandidates(candidates, shell);
446
+ };
447
+ /**
448
+ * Get candidates for option values (enum choices).
449
+ *
450
+ * @function
451
+ */
452
+ const getOptionValueCandidates = (metadata, prevWord, args, shell) => {
453
+ // Find the option definition
454
+ const allOptions = getAllOptionsForContext(metadata, args);
455
+ for (const opt of allOptions) {
456
+ if (opt.name === prevWord || opt.aliases.includes(prevWord)) {
457
+ if (opt.choices && opt.choices.length > 0) {
458
+ return {
459
+ candidates: formatCandidates(opt.choices.map((c) => ({ description: undefined, value: c })), shell),
460
+ found: true,
461
+ };
462
+ }
463
+ // Option takes a value but no specific choices - let shell do file completion
464
+ if (opt.takesValue) {
465
+ return { candidates: [], found: true };
466
+ }
467
+ // Boolean/count option - doesn't take a value, so prev word isn't an option expecting a value
468
+ return { candidates: [], found: false };
469
+ }
470
+ }
471
+ // Option not found
472
+ return { candidates: [], found: false };
473
+ };
474
+ /**
475
+ * Get positional candidates (for enum positionals).
476
+ *
477
+ * @function
478
+ */
479
+ const getPositionalCandidates = (command, positionalIndex, shell) => {
480
+ if (positionalIndex >= command.positionals.length) {
481
+ // Check for variadic last positional
482
+ const lastPos = command.positionals[command.positionals.length - 1];
483
+ if (lastPos?.type !== 'variadic') {
484
+ return [];
485
+ }
486
+ // Use the variadic positional's choices if any
487
+ if (lastPos.choices && lastPos.choices.length > 0) {
488
+ return formatCandidates(lastPos.choices.map((c) => ({ description: undefined, value: c })), shell);
489
+ }
490
+ return [];
491
+ }
492
+ const pos = command.positionals[positionalIndex];
493
+ if (!pos || !pos.choices || pos.choices.length === 0) {
494
+ return [];
495
+ }
496
+ return formatCandidates(pos.choices.map((c) => ({ description: undefined, value: c })), shell);
497
+ };
498
+ /**
499
+ * Get completion candidates for the current command line state.
500
+ *
501
+ * Analyzes the provided words to determine context and returns appropriate
502
+ * completion suggestions.
503
+ *
504
+ * @function
505
+ * @param state - Internal CLI state containing commands and options
506
+ * @param shell - The shell requesting completions (affects output format)
507
+ * @param words - The command line words (COMP_WORDS in bash)
508
+ * @returns Array of completion candidates (one per line when output)
509
+ * @group Completion
510
+ */
511
+ const getCompletionCandidates = (state, shell, words) => {
512
+ const metadata = extractCompletionMetadata(state);
513
+ // Remove the CLI name from words if present
514
+ const args = words.length > 1 ? words.slice(1) : [];
515
+ const currentWord = args.length > 0 ? (args[args.length - 1] ?? '') : '';
516
+ const prevWord = args.length > 1 ? args[args.length - 2] : undefined;
517
+ // Check if we're completing an option value
518
+ if (prevWord?.startsWith('-')) {
519
+ const result = getOptionValueCandidates(metadata, prevWord, args, shell);
520
+ // If we found the option and it takes a value, return the result
521
+ // (which may be empty to allow file completion)
522
+ if (result.found) {
523
+ return result.candidates;
524
+ }
525
+ }
526
+ // Check if current word is an option
527
+ if (currentWord.startsWith('-')) {
528
+ return getOptionCandidates(metadata, args, shell);
529
+ }
530
+ // Check if we need to complete a command
531
+ const commandContext = getCommandContext(metadata, args);
532
+ if (commandContext.needsCommand) {
533
+ return getCommandCandidates(commandContext.availableCommands, currentWord, shell);
534
+ }
535
+ // Check if we're in a command and need positional completion
536
+ if (commandContext.currentCommand) {
537
+ const positionalCandidates = getPositionalCandidates(commandContext.currentCommand, commandContext.positionalIndex, shell);
538
+ if (positionalCandidates.length > 0) {
539
+ return positionalCandidates;
540
+ }
541
+ }
542
+ // Default: offer commands if we have them, or options
543
+ if (metadata.commands.size > 0) {
544
+ return getCommandCandidates(Array.from(metadata.commands.values()), currentWord, shell);
545
+ }
546
+ return getOptionCandidates(metadata, args, shell);
547
+ };
548
+ exports.getCompletionCandidates = getCompletionCandidates;
549
+ /**
550
+ * Validate that a shell name is supported.
551
+ *
552
+ * @function
553
+ * @param shell - The shell name to validate
554
+ * @returns The validated shell type
555
+ * @throws Error if the shell is not supported
556
+ * @group Completion
557
+ */
558
+ const validateShell = (shell) => {
559
+ if (shell === 'bash' || shell === 'zsh' || shell === 'fish') {
560
+ return shell;
561
+ }
562
+ throw new Error(`Unsupported shell: "${shell}". Supported shells: bash, zsh, fish`);
563
+ };
564
+ exports.validateShell = validateShell;
565
+ //# sourceMappingURL=completion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.js","sourceRoot":"","sources":["../src/completion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Shell completion script generation for bargs CLIs.
3
+ *
4
+ * Provides dynamic shell completion support for bash, zsh, and fish shells. The
5
+ * generated scripts call back to the CLI to get completion candidates.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import type { OptionsSchema, PositionalsSchema } from "./types.cjs";
10
+ /**
11
+ * Supported shell types for completion script generation.
12
+ *
13
+ * @group Completion
14
+ */
15
+ export type Shell = 'bash' | 'fish' | 'zsh';
16
+ /**
17
+ * Command entry in internal state.
18
+ */
19
+ type CommandEntry = {
20
+ /** Alternative names for this command */
21
+ aliases?: string[];
22
+ /** Command definition with schemas */
23
+ cmd: {
24
+ /** Options schema for this command */
25
+ __optionsSchema: OptionsSchema;
26
+ /** Positionals schema for this command */
27
+ __positionalsSchema: PositionalsSchema;
28
+ };
29
+ /** Command description for help text */
30
+ description?: string;
31
+ /** Discriminator for leaf commands */
32
+ type: 'command';
33
+ } | {
34
+ /** Alternative names for this command */
35
+ aliases?: string[];
36
+ /** Nested CLI builder for subcommands */
37
+ builder: unknown;
38
+ /** Command description for help text */
39
+ description?: string;
40
+ /** Discriminator for nested command groups */
41
+ type: 'nested';
42
+ };
43
+ /**
44
+ * Internal CLI state structure (matches bargs.ts InternalCliState).
45
+ */
46
+ interface InternalCliState {
47
+ /** Map of command aliases to canonical command names */
48
+ aliasMap: Map<string, string>;
49
+ /** Map of command names to their entries */
50
+ commands: Map<string, CommandEntry>;
51
+ /** Global parser with options and positionals schemas */
52
+ globalParser?: {
53
+ /** Global options schema */
54
+ __optionsSchema: OptionsSchema;
55
+ /** Global positionals schema */
56
+ __positionalsSchema: PositionalsSchema;
57
+ };
58
+ /** CLI executable name */
59
+ name: string;
60
+ }
61
+ /**
62
+ * Generate a shell completion script for the given CLI.
63
+ *
64
+ * The generated script calls back to the CLI with `--get-bargs-completions` to
65
+ * get completion candidates dynamically.
66
+ *
67
+ * @example
68
+ *
69
+ * ```typescript
70
+ * // Output script for bash
71
+ * console.log(generateCompletionScript('mytool', 'bash'));
72
+ * // Redirect to shell config: mytool --completion-script bash >> ~/.bashrc
73
+ * ```
74
+ *
75
+ * @function
76
+ * @param cliName - The name of the CLI executable
77
+ * @param shell - The target shell ('bash', 'zsh', or 'fish')
78
+ * @returns The completion script as a string
79
+ * @group Completion
80
+ */
81
+ export declare const generateCompletionScript: (cliName: string, shell: Shell) => string;
82
+ /**
83
+ * Get completion candidates for the current command line state.
84
+ *
85
+ * Analyzes the provided words to determine context and returns appropriate
86
+ * completion suggestions.
87
+ *
88
+ * @function
89
+ * @param state - Internal CLI state containing commands and options
90
+ * @param shell - The shell requesting completions (affects output format)
91
+ * @param words - The command line words (COMP_WORDS in bash)
92
+ * @returns Array of completion candidates (one per line when output)
93
+ * @group Completion
94
+ */
95
+ export declare const getCompletionCandidates: (state: InternalCliState, shell: Shell, words: string[]) => string[];
96
+ /**
97
+ * Validate that a shell name is supported.
98
+ *
99
+ * @function
100
+ * @param shell - The shell name to validate
101
+ * @returns The validated shell type
102
+ * @throws Error if the shell is not supported
103
+ * @group Completion
104
+ */
105
+ export declare const validateShell: (shell: string) => Shell;
106
+ export {};
107
+ //# sourceMappingURL=completion.d.ts.map