@navios/commander 1.5.1 → 1.6.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.
Files changed (35) hide show
  1. package/.turbo/turbo-build.log +48 -49
  2. package/.turbo/turbo-check.log +0 -2
  3. package/.turbo/turbo-lint.log +2 -3
  4. package/.turbo/turbo-test$colon$ci.log +109 -117
  5. package/.turbo/turbo-test.log +107 -0
  6. package/CHANGELOG.md +12 -0
  7. package/dist/src/interfaces/command-handler.interface.d.mts +7 -3
  8. package/dist/src/interfaces/command-handler.interface.d.mts.map +1 -1
  9. package/dist/src/interfaces/commander-execution-context.interface.d.mts +11 -1
  10. package/dist/src/interfaces/commander-execution-context.interface.d.mts.map +1 -1
  11. package/dist/src/services/commander-adapter.service.d.mts +5 -1
  12. package/dist/src/services/commander-adapter.service.d.mts.map +1 -1
  13. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  14. package/dist/tsconfig.tsbuildinfo +1 -1
  15. package/lib/{cli-module.decorator-BzsOEMPH.d.cts → cli-module.decorator-BV3vVKlR.d.cts} +8 -4
  16. package/lib/cli-module.decorator-BV3vVKlR.d.cts.map +1 -0
  17. package/lib/{cli-module.decorator-CCV_elPP.d.mts → cli-module.decorator-DDlgpTgI.d.mts} +19 -5
  18. package/lib/cli-module.decorator-DDlgpTgI.d.mts.map +1 -0
  19. package/lib/index.cjs +17 -5
  20. package/lib/index.cjs.map +1 -1
  21. package/lib/index.d.cts +13 -3
  22. package/lib/index.d.cts.map +1 -1
  23. package/lib/index.d.mts +2 -2
  24. package/lib/index.d.mts.map +1 -1
  25. package/lib/index.mjs +17 -5
  26. package/lib/index.mjs.map +1 -1
  27. package/lib/legacy-compat/index.d.cts +1 -1
  28. package/lib/legacy-compat/index.d.mts +1 -1
  29. package/package.json +2 -2
  30. package/src/__tests__/commander.factory.e2e.spec.mts +105 -13
  31. package/src/interfaces/command-handler.interface.mts +7 -3
  32. package/src/interfaces/commander-execution-context.interface.mts +13 -0
  33. package/src/services/commander-adapter.service.mts +13 -4
  34. package/lib/cli-module.decorator-BzsOEMPH.d.cts.map +0 -1
  35. package/lib/cli-module.decorator-CCV_elPP.d.mts.map +0 -1
@@ -24,20 +24,24 @@ import { z } from "zod/v4";
24
24
  *
25
25
  * @Command({ path: 'greet', optionsSchema })
26
26
  * export class GreetCommand implements CommandHandler<Options> {
27
- * async execute(options: Options) {
27
+ * async execute(options: Options, positionals?: string[]) {
28
28
  * console.log(`Hello, ${options.name}!`)
29
+ * if (positionals?.length) {
30
+ * console.log(`Files: ${positionals.join(', ')}`)
31
+ * }
29
32
  * }
30
33
  * }
31
34
  * ```
32
35
  */
33
36
  interface CommandHandler<TOptions = any> {
34
37
  /**
35
- * Executes the command with the provided options.
38
+ * Executes the command with the provided options and positional arguments.
36
39
  *
37
40
  * @param options - The validated command options (validated against the command's schema if provided)
41
+ * @param positionals - Positional arguments that don't match any option flags
38
42
  * @returns A promise or void
39
43
  */
40
- execute(options: TOptions): void | Promise<void>;
44
+ execute(options: TOptions, positionals?: string[]): void | Promise<void>;
41
45
  }
42
46
  //#endregion
43
47
  //#region src/decorators/command.decorator.d.mts
@@ -210,4 +214,4 @@ declare function CliModule({
210
214
  }?: CliModuleOptions): (target: ClassType, context: ClassDecoratorContext<abstract new (...args: any) => any>) => ClassType;
211
215
  //#endregion
212
216
  export { CommandHandler as a, CommandOptions as i, CliModuleOptions as n, Command as r, CliModule as t };
213
- //# sourceMappingURL=cli-module.decorator-BzsOEMPH.d.cts.map
217
+ //# sourceMappingURL=cli-module.decorator-BV3vVKlR.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-module.decorator-BV3vVKlR.d.cts","names":["CommandHandler","TOptions","Promise","InjectionToken","ClassType","ClassTypeWithInstance","Registry","z","CommandHandler","CommandOptions","ZodObject","Command","path","description","token","optionsSchema","priority","registry","ClassDecoratorContext","ClassType","Registry","CliModuleOptions","Set","CliModule","commands","controllers","imports","guards","overrides","priority","registry","ClassDecoratorContext"],"sources":["../src/interfaces/command-handler.interface.d.mts","../src/decorators/command.decorator.d.mts","../src/decorators/cli-module.decorator.d.mts"],"sourcesContent":["/**\n * Interface that all command classes must implement.\n *\n * Commands decorated with `@Command` must implement this interface.\n * The `execute` method is called when the command is invoked.\n *\n * @template TOptions - The type of options that the command accepts\n *\n * @example\n * ```typescript\n * import { Command, CommandHandler } from '@navios/commander'\n * import { z } from 'zod/v4'\n *\n * const optionsSchema = z.object({\n * name: z.string()\n * })\n *\n * type Options = z.infer<typeof optionsSchema>\n *\n * @Command({ path: 'greet', optionsSchema })\n * export class GreetCommand implements CommandHandler<Options> {\n * async execute(options: Options, positionals?: string[]) {\n * console.log(`Hello, ${options.name}!`)\n * if (positionals?.length) {\n * console.log(`Files: ${positionals.join(', ')}`)\n * }\n * }\n * }\n * ```\n */\nexport interface CommandHandler<TOptions = any> {\n /**\n * Executes the command with the provided options and positional arguments.\n *\n * @param options - The validated command options (validated against the command's schema if provided)\n * @param positionals - Positional arguments that don't match any option flags\n * @returns A promise or void\n */\n execute(options: TOptions, positionals?: string[]): void | Promise<void>\n}\n//# sourceMappingURL=command-handler.interface.d.mts.map\n","import { InjectionToken } from '@navios/core'\n\nimport type { ClassType, ClassTypeWithInstance, Registry } from '@navios/core'\nimport type { z } from 'zod/v4'\n\nimport type { CommandHandler } from '../interfaces/index.mjs'\n/**\n * Options for the `@Command` decorator.\n *\n * @public\n */\nexport interface CommandOptions {\n /**\n * The token to use for the command.\n * If provided, the command will be registered with this token.\n */\n token?: InjectionToken<ClassTypeWithInstance<CommandHandler<any>>>\n /**\n * The command path that users will invoke from the CLI.\n * Can be a single word (e.g., 'greet') or multi-word with colons (e.g., 'user:create', 'db:migrate').\n */\n path: string\n /**\n * Optional description of the command for help text.\n * Displayed when users run `help` or `--help`.\n */\n description?: string\n /**\n * Optional zod/v4 schema for validating command options.\n * If provided, options will be validated and parsed according to this schema.\n */\n optionsSchema?: z.ZodObject\n /**\n * Priority level for the command.\n * Higher priority commands will be loaded first.\n */\n priority?: number\n /**\n * Registry to use for the command.\n * Registry is used to store the command and its options schema.\n */\n registry?: Registry\n}\n/**\n * Decorator that marks a class as a CLI command.\n *\n * The decorated class must implement the `CommandHandler` interface with an `execute` method.\n * The command will be automatically registered when its module is loaded.\n *\n * @param options - Configuration options for the command\n * @returns A class decorator function\n *\n * @example\n * ```typescript\n * import { Command, CommandHandler } from '@navios/commander'\n * import { z } from 'zod/v4'\n *\n * const optionsSchema = z.object({\n * name: z.string(),\n * greeting: z.string().optional().default('Hello')\n * })\n *\n * @Command({\n * path: 'greet',\n * optionsSchema: optionsSchema\n * })\n * export class GreetCommand implements CommandHandler<z.infer<typeof optionsSchema>> {\n * async execute(options) {\n * console.log(`${options.greeting}, ${options.name}!`)\n * }\n * }\n * ```\n */\nexport declare function Command({\n path,\n description,\n token,\n optionsSchema,\n priority,\n registry,\n}: CommandOptions): (\n target: ClassType,\n context: ClassDecoratorContext<abstract new (...args: any) => any>,\n) => any\n//# sourceMappingURL=command.decorator.d.mts.map\n","import type { ClassType, Registry } from '@navios/core'\n/**\n * Options for the `@CliModule` decorator.\n *\n * @public\n */\nexport interface CliModuleOptions {\n /**\n * Array or Set of command classes to register in this module.\n * Commands must be decorated with `@Command`.\n */\n commands?: ClassType[] | Set<ClassType>\n /**\n * Array or Set of controller classes for HTTP endpoints.\n * Allows mixing HTTP and CLI functionality in the same module.\n */\n controllers?: ClassType[] | Set<ClassType>\n /**\n * Array or Set of other modules to import.\n * Imported modules' commands and controllers will be available.\n */\n imports?: ClassType[] | Set<ClassType>\n /**\n * Guards to apply to all controllers in this module.\n * Guards are executed in reverse order (last guard first).\n */\n guards?: ClassType[] | Set<ClassType>\n /**\n * Service override classes to import for side effects.\n * These classes are imported to ensure their @Injectable decorators execute,\n * allowing them to register with the DI system. Overrides should use the same\n * InjectionToken as the original service with a higher priority.\n */\n overrides?: ClassType[] | Set<ClassType>\n /**\n * Priority level for the module.\n * Higher priority modules will be loaded first.\n */\n priority?: number\n /**\n * Registry to use for the module.\n * Registry is used to store the module and its commands.\n */\n registry?: Registry\n}\n/**\n * Decorator that marks a class as a CLI module.\n *\n * This decorator extends the standard @Module decorator, adding support for\n * CLI commands while maintaining full compatibility with HTTP controllers.\n * Modules organize commands and can import other modules to compose larger\n * CLI applications.\n *\n * The module can optionally implement `NaviosModule` interface for lifecycle hooks.\n *\n * @param options - Configuration options for the module\n * @returns A class decorator function\n *\n * @example\n * ```typescript\n * import { CliModule } from '@navios/commander'\n * import { GreetCommand } from './greet.command'\n * import { UserModule } from './user.module'\n *\n * @CliModule({\n * commands: [GreetCommand],\n * imports: [UserModule]\n * })\n * export class AppModule {}\n * ```\n *\n * @example\n * ```typescript\n * // Mixed HTTP and CLI module\n * @CliModule({\n * controllers: [HealthController],\n * commands: [MigrateCommand],\n * imports: [DatabaseModule],\n * })\n * export class AppModule {}\n * ```\n */\nexport declare function CliModule({\n commands,\n controllers,\n imports,\n guards,\n overrides,\n priority,\n registry,\n}?: CliModuleOptions): (\n target: ClassType,\n context: ClassDecoratorContext<abstract new (...args: any) => any>,\n) => ClassType\n//# sourceMappingURL=cli-module.decorator.d.mts.map\n"],"mappings":";;;;;;;;;AA8BA;;;;ACnBA;;;;;;;AA8DA;;;;;;;;;;;;;;ACnEA;AAKamB,UFmBInB,cEnBJmB,CAAAA,WAAAA,GAAAA,CAAAA,CAAAA;EAAkBA;;;;;;;EAULG,OAAAA,CAAAA,OAAAA,EFiBPrB,QEjBOqB,EAAAA,WAAAA,CAAAA,EAAAA,MAAAA,EAAAA,CAAAA,EAAAA,IAAAA,GFiBmCpB,OEjBnCoB,CAAAA,IAAAA,CAAAA;;;;;;ADV1B;;;AAKUnB,UALOM,cAAAA,CAKPN;EAeQI;;;AA0ClB;EACEK,KAAAA,CAAAA,EA1DQT,cA0DRS,CA1DuBP,qBA0DvBO,CA1D6CJ,cA0D7CI,CAAAA,GAAAA,CAAAA,CAAAA,CAAAA;EACAC;;;;EAIAI,IAAAA,EAAAA,MAAAA;EACCR;;;;;;;AC1EH;;EAK+BU,aAAAA,CAAAA,EDoBbZ,CAAAA,CAAEG,SCpBWS;EAAJG;;;;EAUfH,QAAAA,CAAAA,EAAAA,MAAAA;EAAkBA;;;;EAKLG,QAAAA,CAAAA,EDeZhB,QCfYgB;;;;;;AAwDzB;;;;;;;;;;;;;;;;;;;;;;;;;;iBDTwBX,OAAAA;;;;;;;GAOrBF,0BACOL,oBACCc;;;;;;ADpDX;;UExBiBG,gBAAAA;;ADKjB;;;EAKUlB,QAAAA,CAAAA,ECLGgB,SDKHhB,EAAAA,GCLiBmB,GDKjBnB,CCLqBgB,SDKrBhB,CAAAA;EAeQI;;;AA0ClB;EACEK,WAAAA,CAAAA,EC1DcO,SD0DdP,EAAAA,GC1D4BU,GD0D5BV,CC1DgCO,SD0DhCP,CAAAA;EACAC;;;;EAIAI,OAAAA,CAAAA,EC1DUE,SD0DVF,EAAAA,GC1DwBK,GD0DxBL,CC1D4BE,SD0D5BF,CAAAA;EACCR;;;;WCtDQU,cAAcG,IAAIH;;;AApB7B;;;;EAUgBA,SAAAA,CAAAA,EAiBFA,SAjBEA,EAAAA,GAiBYG,GAjBZH,CAiBgBA,SAjBhBA,CAAAA;EAAkBA;;;;EAKRG,QAAAA,CAAAA,EAAAA,MAAAA;EAKfH;;;;EAOqBA,QAAAA,CAAAA,EAUnBC,QAVmBD;;;;AAiDhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAwBI,SAAAA;;;;;;;;IAQpBF,4BACMF,oBACCY,8DACNZ"}
@@ -24,20 +24,24 @@ import { z } from "zod/v4";
24
24
  *
25
25
  * @Command({ path: 'greet', optionsSchema })
26
26
  * export class GreetCommand implements CommandHandler<Options> {
27
- * async execute(options: Options) {
27
+ * async execute(options: Options, positionals?: string[]) {
28
28
  * console.log(`Hello, ${options.name}!`)
29
+ * if (positionals?.length) {
30
+ * console.log(`Files: ${positionals.join(', ')}`)
31
+ * }
29
32
  * }
30
33
  * }
31
34
  * ```
32
35
  */
33
36
  interface CommandHandler<TOptions = any> {
34
37
  /**
35
- * Executes the command with the provided options.
38
+ * Executes the command with the provided options and positional arguments.
36
39
  *
37
40
  * @param options - The validated command options (validated against the command's schema if provided)
41
+ * @param positionals - Positional arguments that don't match any option flags
38
42
  * @returns A promise or void
39
43
  */
40
- execute(options: TOptions): void | Promise<void>;
44
+ execute(options: TOptions, positionals?: string[]): void | Promise<void>;
41
45
  }
42
46
  //#endregion
43
47
  //#region src/interfaces/abstract-cli-adapter.interface.d.mts
@@ -211,11 +215,12 @@ declare class CommanderExecutionContext {
211
215
  private readonly command;
212
216
  private readonly commandPath;
213
217
  private readonly options;
218
+ private readonly positionals;
214
219
  /**
215
220
  * @internal
216
221
  * Creates a new execution context.
217
222
  */
218
- constructor(command: CommandMetadata, commandPath: string, options: any);
223
+ constructor(command: CommandMetadata, commandPath: string, options: any, positionals?: string[]);
219
224
  /**
220
225
  * Gets the command metadata.
221
226
  *
@@ -236,6 +241,15 @@ declare class CommanderExecutionContext {
236
241
  * @returns The validated options object
237
242
  */
238
243
  getOptions(): any;
244
+ /**
245
+ * Gets the positional arguments.
246
+ *
247
+ * Positional arguments are values that don't match any option flags.
248
+ * For example, in `copy --force source.txt dest.txt`, the positionals are `['source.txt', 'dest.txt']`.
249
+ *
250
+ * @returns The positional arguments array
251
+ */
252
+ getPositionals(): string[];
239
253
  }
240
254
  //#endregion
241
255
  //#region src/decorators/command.decorator.d.mts
@@ -408,4 +422,4 @@ declare function CliModule({
408
422
  }?: CliModuleOptions): (target: ClassType, context: ClassDecoratorContext<abstract new (...args: any) => any>) => ClassType;
409
423
  //#endregion
410
424
  export { CommanderExecutionContext as a, extractCommandMetadata as c, CliAdapterOptions as d, CliEnvironment as f, CommandOptions as i, getCommandMetadata as l, CommandHandler as m, CliModuleOptions as n, CommandMetadata as o, AbstractCliAdapterInterface as p, Command as r, CommandMetadataKey as s, CliModule as t, hasCommandMetadata as u };
411
- //# sourceMappingURL=cli-module.decorator-CCV_elPP.d.mts.map
425
+ //# sourceMappingURL=cli-module.decorator-DDlgpTgI.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-module.decorator-DDlgpTgI.d.mts","names":["CommandHandler","TOptions","Promise","AbstractAdapterInterface","AbstractCliAdapterInterface","Promise","Record","Array","AdapterEnvironment","AbstractCliAdapterInterface","CliAdapterOptions","CliEnvironment","ClassType","z","CommandMetadataKey","CommandMetadata","ZodObject","Map","getCommandMetadata","ClassDecoratorContext","extractCommandMetadata","hasCommandMetadata","CommandMetadata","CommanderExecutionContext","InjectionToken","ClassType","ClassTypeWithInstance","Registry","z","CommandHandler","CommandOptions","ZodObject","Command","path","description","token","optionsSchema","priority","registry","ClassDecoratorContext","ClassType","Registry","CliModuleOptions","Set","CliModule","commands","controllers","imports","guards","overrides","priority","registry","ClassDecoratorContext"],"sources":["../src/interfaces/command-handler.interface.d.mts","../src/interfaces/abstract-cli-adapter.interface.d.mts","../src/interfaces/environment.interface.d.mts","../src/metadata/command.metadata.d.mts","../src/interfaces/commander-execution-context.interface.d.mts","../src/decorators/command.decorator.d.mts","../src/decorators/cli-module.decorator.d.mts"],"sourcesContent":["/**\n * Interface that all command classes must implement.\n *\n * Commands decorated with `@Command` must implement this interface.\n * The `execute` method is called when the command is invoked.\n *\n * @template TOptions - The type of options that the command accepts\n *\n * @example\n * ```typescript\n * import { Command, CommandHandler } from '@navios/commander'\n * import { z } from 'zod/v4'\n *\n * const optionsSchema = z.object({\n * name: z.string()\n * })\n *\n * type Options = z.infer<typeof optionsSchema>\n *\n * @Command({ path: 'greet', optionsSchema })\n * export class GreetCommand implements CommandHandler<Options> {\n * async execute(options: Options, positionals?: string[]) {\n * console.log(`Hello, ${options.name}!`)\n * if (positionals?.length) {\n * console.log(`Files: ${positionals.join(', ')}`)\n * }\n * }\n * }\n * ```\n */\nexport interface CommandHandler<TOptions = any> {\n /**\n * Executes the command with the provided options and positional arguments.\n *\n * @param options - The validated command options (validated against the command's schema if provided)\n * @param positionals - Positional arguments that don't match any option flags\n * @returns A promise or void\n */\n execute(options: TOptions, positionals?: string[]): void | Promise<void>\n}\n//# sourceMappingURL=command-handler.interface.d.mts.map\n","import type { AbstractAdapterInterface } from '@navios/core'\n/**\n * Interface for CLI adapters.\n * Extends the base adapter interface with CLI-specific methods.\n *\n * @public\n */\nexport interface AbstractCliAdapterInterface extends AbstractAdapterInterface {\n /**\n * Run the CLI application with the given arguments.\n * Parses arguments and executes the matching command.\n *\n * @param argv - Command-line arguments array (defaults to `process.argv`)\n *\n * @example\n * ```typescript\n * const adapter = app.getAdapter() as AbstractCliAdapterInterface\n * await adapter.run(process.argv)\n * ```\n */\n run(argv?: string[]): Promise<void>\n /**\n * Execute a command programmatically with the provided options.\n *\n * @param path - The command path (e.g., 'greet', 'user:create')\n * @param options - The command options object\n *\n * @example\n * ```typescript\n * await adapter.executeCommand('user:create', {\n * name: 'John',\n * email: 'john@example.com',\n * })\n * ```\n */\n executeCommand(path: string, options: Record<string, unknown>): Promise<void>\n /**\n * Get all registered command paths and their class references.\n *\n * @returns Array of objects containing path and class\n *\n * @example\n * ```typescript\n * const commands = adapter.getAllCommands()\n * commands.forEach(({ path }) => console.log(path))\n * ```\n */\n getAllCommands(): Array<{\n path: string\n class: unknown\n }>\n}\n//# sourceMappingURL=abstract-cli-adapter.interface.d.mts.map\n","import type { AdapterEnvironment } from '@navios/core'\n\nimport type { AbstractCliAdapterInterface } from './abstract-cli-adapter.interface.mjs'\n/**\n * Options for configuring the CLI adapter.\n *\n * @public\n */\nexport interface CliAdapterOptions {}\n/**\n * Environment type definition for CLI adapters.\n * Used with NaviosFactory.create<CliEnvironment>() for type-safe CLI applications.\n *\n * @public\n *\n * @example\n * ```typescript\n * import { NaviosFactory } from '@navios/core'\n * import { defineCliEnvironment, type CliEnvironment } from '@navios/commander'\n *\n * const app = await NaviosFactory.create<CliEnvironment>(AppModule, {\n * adapter: defineCliEnvironment(),\n * })\n * ```\n */\nexport interface CliEnvironment extends AdapterEnvironment {\n options: CliAdapterOptions\n adapter: AbstractCliAdapterInterface\n}\n//# sourceMappingURL=environment.interface.d.mts.map\n","import type { ClassType } from '@navios/core'\nimport type { z } from 'zod/v4'\n/**\n * @internal\n * Symbol key used to store command metadata on classes.\n */\nexport declare const CommandMetadataKey: unique symbol\n/**\n * Metadata associated with a command.\n *\n * @public\n */\nexport interface CommandMetadata {\n /**\n * The command path (e.g., 'greet', 'user:create').\n */\n path: string\n /**\n * Optional description of the command for help text.\n */\n description?: string\n /**\n * Optional zod/v4 schema for validating command options.\n */\n optionsSchema?: z.ZodObject\n /**\n * Map of custom attributes that can be attached to the command.\n */\n customAttributes: Map<string | symbol, any>\n}\n/**\n * Gets or creates command metadata for a class.\n *\n * @internal\n * @param target - The command class\n * @param context - The decorator context\n * @param path - The command path\n * @param description - Optional description for help text\n * @param optionsSchema - Optional zod/v4 schema\n * @returns The command metadata\n */\nexport declare function getCommandMetadata(\n target: ClassType,\n context: ClassDecoratorContext,\n path: string,\n description?: string,\n optionsSchema?: z.ZodObject,\n): CommandMetadata\n/**\n * Extracts command metadata from a class.\n *\n * @param target - The command class\n * @returns The command metadata\n * @throws {Error} If the class is not decorated with @Command\n *\n * @example\n * ```typescript\n * const metadata = extractCommandMetadata(GreetCommand)\n * console.log(metadata.path) // 'greet'\n * ```\n */\nexport declare function extractCommandMetadata(target: ClassType): CommandMetadata\n/**\n * Checks if a class has command metadata.\n *\n * @param target - The class to check\n * @returns `true` if the class is decorated with @Command, `false` otherwise\n */\nexport declare function hasCommandMetadata(target: ClassType): boolean\n//# sourceMappingURL=command.metadata.d.mts.map\n","import type { CommandMetadata } from '../metadata/command.metadata.mjs'\n/**\n * Execution context for a command execution.\n *\n * Provides access to command metadata, path, and validated options during command execution.\n * This context is automatically injected and available via the `CommandExecutionContext` token.\n *\n * @example\n * ```typescript\n * import { inject, Injectable } from '@navios/core'\n * import { CommandExecutionContext } from '@navios/commander'\n *\n * @Injectable()\n * class CommandLogger {\n * private ctx = inject(CommandExecutionContext)\n *\n * log() {\n * console.log('Command:', this.ctx.getCommandPath())\n * console.log('Options:', this.ctx.getOptions())\n * }\n * }\n * ```\n */\nexport declare class CommanderExecutionContext {\n private readonly command\n private readonly commandPath\n private readonly options\n private readonly positionals\n /**\n * @internal\n * Creates a new execution context.\n */\n constructor(command: CommandMetadata, commandPath: string, options: any, positionals?: string[])\n /**\n * Gets the command metadata.\n *\n * @returns The command metadata including path and options schema\n */\n getCommand(): CommandMetadata\n /**\n * Gets the command path that was invoked.\n *\n * @returns The command path (e.g., 'greet', 'user:create')\n */\n getCommandPath(): string\n /**\n * Gets the validated command options.\n *\n * Options are validated against the command's zod/v4 schema if one was provided.\n *\n * @returns The validated options object\n */\n getOptions(): any\n /**\n * Gets the positional arguments.\n *\n * Positional arguments are values that don't match any option flags.\n * For example, in `copy --force source.txt dest.txt`, the positionals are `['source.txt', 'dest.txt']`.\n *\n * @returns The positional arguments array\n */\n getPositionals(): string[]\n}\n//# sourceMappingURL=commander-execution-context.interface.d.mts.map\n","import { InjectionToken } from '@navios/core'\n\nimport type { ClassType, ClassTypeWithInstance, Registry } from '@navios/core'\nimport type { z } from 'zod/v4'\n\nimport type { CommandHandler } from '../interfaces/index.mjs'\n/**\n * Options for the `@Command` decorator.\n *\n * @public\n */\nexport interface CommandOptions {\n /**\n * The token to use for the command.\n * If provided, the command will be registered with this token.\n */\n token?: InjectionToken<ClassTypeWithInstance<CommandHandler<any>>>\n /**\n * The command path that users will invoke from the CLI.\n * Can be a single word (e.g., 'greet') or multi-word with colons (e.g., 'user:create', 'db:migrate').\n */\n path: string\n /**\n * Optional description of the command for help text.\n * Displayed when users run `help` or `--help`.\n */\n description?: string\n /**\n * Optional zod/v4 schema for validating command options.\n * If provided, options will be validated and parsed according to this schema.\n */\n optionsSchema?: z.ZodObject\n /**\n * Priority level for the command.\n * Higher priority commands will be loaded first.\n */\n priority?: number\n /**\n * Registry to use for the command.\n * Registry is used to store the command and its options schema.\n */\n registry?: Registry\n}\n/**\n * Decorator that marks a class as a CLI command.\n *\n * The decorated class must implement the `CommandHandler` interface with an `execute` method.\n * The command will be automatically registered when its module is loaded.\n *\n * @param options - Configuration options for the command\n * @returns A class decorator function\n *\n * @example\n * ```typescript\n * import { Command, CommandHandler } from '@navios/commander'\n * import { z } from 'zod/v4'\n *\n * const optionsSchema = z.object({\n * name: z.string(),\n * greeting: z.string().optional().default('Hello')\n * })\n *\n * @Command({\n * path: 'greet',\n * optionsSchema: optionsSchema\n * })\n * export class GreetCommand implements CommandHandler<z.infer<typeof optionsSchema>> {\n * async execute(options) {\n * console.log(`${options.greeting}, ${options.name}!`)\n * }\n * }\n * ```\n */\nexport declare function Command({\n path,\n description,\n token,\n optionsSchema,\n priority,\n registry,\n}: CommandOptions): (\n target: ClassType,\n context: ClassDecoratorContext<abstract new (...args: any) => any>,\n) => any\n//# sourceMappingURL=command.decorator.d.mts.map\n","import type { ClassType, Registry } from '@navios/core'\n/**\n * Options for the `@CliModule` decorator.\n *\n * @public\n */\nexport interface CliModuleOptions {\n /**\n * Array or Set of command classes to register in this module.\n * Commands must be decorated with `@Command`.\n */\n commands?: ClassType[] | Set<ClassType>\n /**\n * Array or Set of controller classes for HTTP endpoints.\n * Allows mixing HTTP and CLI functionality in the same module.\n */\n controllers?: ClassType[] | Set<ClassType>\n /**\n * Array or Set of other modules to import.\n * Imported modules' commands and controllers will be available.\n */\n imports?: ClassType[] | Set<ClassType>\n /**\n * Guards to apply to all controllers in this module.\n * Guards are executed in reverse order (last guard first).\n */\n guards?: ClassType[] | Set<ClassType>\n /**\n * Service override classes to import for side effects.\n * These classes are imported to ensure their @Injectable decorators execute,\n * allowing them to register with the DI system. Overrides should use the same\n * InjectionToken as the original service with a higher priority.\n */\n overrides?: ClassType[] | Set<ClassType>\n /**\n * Priority level for the module.\n * Higher priority modules will be loaded first.\n */\n priority?: number\n /**\n * Registry to use for the module.\n * Registry is used to store the module and its commands.\n */\n registry?: Registry\n}\n/**\n * Decorator that marks a class as a CLI module.\n *\n * This decorator extends the standard @Module decorator, adding support for\n * CLI commands while maintaining full compatibility with HTTP controllers.\n * Modules organize commands and can import other modules to compose larger\n * CLI applications.\n *\n * The module can optionally implement `NaviosModule` interface for lifecycle hooks.\n *\n * @param options - Configuration options for the module\n * @returns A class decorator function\n *\n * @example\n * ```typescript\n * import { CliModule } from '@navios/commander'\n * import { GreetCommand } from './greet.command'\n * import { UserModule } from './user.module'\n *\n * @CliModule({\n * commands: [GreetCommand],\n * imports: [UserModule]\n * })\n * export class AppModule {}\n * ```\n *\n * @example\n * ```typescript\n * // Mixed HTTP and CLI module\n * @CliModule({\n * controllers: [HealthController],\n * commands: [MigrateCommand],\n * imports: [DatabaseModule],\n * })\n * export class AppModule {}\n * ```\n */\nexport declare function CliModule({\n commands,\n controllers,\n imports,\n guards,\n overrides,\n priority,\n registry,\n}?: CliModuleOptions): (\n target: ClassType,\n context: ClassDecoratorContext<abstract new (...args: any) => any>,\n) => ClassType\n//# sourceMappingURL=cli-module.decorator.d.mts.map\n"],"mappings":"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"}
package/lib/index.cjs CHANGED
@@ -799,13 +799,15 @@ var CliParserService = class {
799
799
  command;
800
800
  commandPath;
801
801
  options;
802
+ positionals;
802
803
  /**
803
804
  * @internal
804
805
  * Creates a new execution context.
805
- */ constructor(command, commandPath, options) {
806
+ */ constructor(command, commandPath, options, positionals = []) {
806
807
  this.command = command;
807
808
  this.commandPath = commandPath;
808
809
  this.options = options;
810
+ this.positionals = positionals;
809
811
  }
810
812
  /**
811
813
  * Gets the command metadata.
@@ -830,6 +832,16 @@ var CliParserService = class {
830
832
  */ getOptions() {
831
833
  return this.options;
832
834
  }
835
+ /**
836
+ * Gets the positional arguments.
837
+ *
838
+ * Positional arguments are values that don't match any option flags.
839
+ * For example, in `copy --force source.txt dest.txt`, the positionals are `['source.txt', 'dest.txt']`.
840
+ *
841
+ * @returns The positional arguments array
842
+ */ getPositionals() {
843
+ return this.positionals;
844
+ }
833
845
  };
834
846
 
835
847
  //#endregion
@@ -1214,7 +1226,7 @@ var CommanderAdapterService = class {
1214
1226
  }
1215
1227
  const command = this.commandRegistry.getByPath(preliminaryParse.command);
1216
1228
  const parsed = command?.metadata.optionsSchema ? this.cliParser.parse(argv, command.metadata.optionsSchema) : preliminaryParse;
1217
- await this.executeCommand(parsed.command, parsed.options);
1229
+ await this.executeCommand(parsed.command, parsed.options, parsed.positionals);
1218
1230
  } catch (error) {
1219
1231
  if (error instanceof Error) {
1220
1232
  this.logger.error(`Error: ${error.message}`);
@@ -1228,20 +1240,20 @@ var CommanderAdapterService = class {
1228
1240
  }
1229
1241
  /**
1230
1242
  * Execute a command programmatically with the provided options.
1231
- */ async executeCommand(path, options = {}) {
1243
+ */ async executeCommand(path, options = {}, positionals = []) {
1232
1244
  const command = this.commandRegistry.getByPath(path);
1233
1245
  if (!command) throw new Error(`[Navios Commander] Command not found: ${path}`);
1234
1246
  const { class: commandClass, metadata } = command;
1235
1247
  let validatedOptions = options;
1236
1248
  if (metadata.optionsSchema) validatedOptions = metadata.optionsSchema.parse(options);
1237
- const executionContext = new CommanderExecutionContext(metadata, path, validatedOptions);
1249
+ const executionContext = new CommanderExecutionContext(metadata, path, validatedOptions, positionals);
1238
1250
  const requestId = `cmd-${Date.now()}-${Math.random().toString(36).substring(7)}`;
1239
1251
  const scopeContainer = this.container.beginRequest(requestId);
1240
1252
  scopeContainer.addInstance(CommandExecutionContext, executionContext);
1241
1253
  try {
1242
1254
  const commandInstance = await scopeContainer.get(commandClass);
1243
1255
  if (!commandInstance.execute) throw new Error(`Command ${path} does not implement execute method`);
1244
- await commandInstance.execute(validatedOptions);
1256
+ await commandInstance.execute(validatedOptions, positionals);
1245
1257
  } finally {
1246
1258
  await scopeContainer.endRequest();
1247
1259
  }
package/lib/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["inject","Logger","z","Command","CommandRegistryService","HelpCommandToken","helpOptionsSchema","object","command","string","optional","token","path","description","optionsSchema","HelpCommand","logger","context","commandRegistry","execute","options","log","formatCommandHelp","formatCommandList","Injectable","CliParserService","parse","argv","optionsSchema","args","slice","length","Error","booleanFields","extractBooleanFields","Set","arrayFields","extractArrayFields","commandParts","i","startsWith","push","command","join","options","positionals","arg","key","equalIndex","indexOf","optionName","optionValue","camelCaseKey","camelCase","isArray","has","parseValue","isBoolean","nextArg","flags","flag","str","replace","_","letter","toUpperCase","value","undefined","test","parseInt","parseFloat","endsWith","JSON","schema","typeName","def","type","shape","fieldSchema","Object","entries","isSchemaBoolean","add","isSchemaArray","currentSchema","innerType","CommanderExecutionContext","command","commandPath","options","getCommand","getCommandPath","getOptions","InjectionToken","CommandExecutionContextInjectionToken","CommandExecutionContext","create","Container","inject","Injectable","Logger","HelpCommand","CommanderExecutionContext","CommandEntryKey","extractCommandMetadata","hasCommandMetadata","CommandExecutionContext","CliParserService","CommandRegistryService","CommanderAdapterService","container","commandRegistry","cliParser","logger","context","options","isReady","setupAdapter","onModulesInit","modules","registerBuiltInCommands","moduleName","metadata","commands","customEntries","get","commandClass","warn","name","commandMetadata","register","path","class","helpMetadata","ready","dispose","clear","run","argv","process","Error","preliminaryParse","parse","help","h","command","executeCommand","getByPath","parsed","optionsSchema","error","message","includes","log","validatedOptions","executionContext","requestId","Date","now","Math","random","toString","substring","scopeContainer","beginRequest","addInstance","commandInstance","execute","endRequest","getAllCommands","getAllAsArray","AdapterToken","CliParserService","CommandRegistryService","CommanderAdapterService","defineCliEnvironment","tokens","Map","ConsoleLogger","NaviosFactory","defineCliEnvironment","dynamicImport","CommanderFactory","create","appModule","options","enableTUI","tuiModule","adapter","tuiOptions","isBun","isBunRuntime","error","console","Error","overrideConsoleLogger","ScreenManager","hideDefaultScreen","app","logger","logLevels","screenManager","get","setup","bind","exitOnCtrlC","sidebarWidth","sidebarPosition","sidebarTitle","autoClose","theme","useMouse","useOpenTUI","undefined","showTimeDiff","showPid","showLogLevel","showPrefix","showContext","showTimestamp"],"sources":["../src/commands/help.command.mts","../src/services/cli-parser.service.mts","../src/interfaces/commander-execution-context.interface.mts","../src/tokens/execution-context.token.mts","../src/services/commander-adapter.service.mts","../src/define-environment.mts","../src/utils/runtime.mts","../src/commander.factory.mts"],"sourcesContent":["import { inject, Logger } from '@navios/core'\nimport { z } from 'zod/v4'\n\nimport { Command } from '../decorators/command.decorator.mjs'\nimport { CommandRegistryService } from '../services/command-registry.service.mjs'\nimport { HelpCommandToken } from '../tokens/help-command.token.mjs'\n\nimport type { CommandHandler } from '../interfaces/command-handler.interface.mjs'\n\nconst helpOptionsSchema = z.object({\n command: z.string().optional(),\n})\n\ntype HelpOptions = z.infer<typeof helpOptionsSchema>\n\n/**\n * Built-in help command that lists all available commands or shows help for a specific command.\n *\n * @public\n */\n@Command({\n token: HelpCommandToken,\n path: 'help',\n description: 'Show available commands or help for a specific command',\n optionsSchema: helpOptionsSchema,\n})\nexport class HelpCommand implements CommandHandler<HelpOptions> {\n private logger = inject(Logger, { context: 'Commander' })\n private commandRegistry = inject(CommandRegistryService)\n\n async execute(options: HelpOptions): Promise<void> {\n if (options.command) {\n this.logger.log(this.commandRegistry.formatCommandHelp(options.command))\n } else {\n this.logger.log(this.commandRegistry.formatCommandList())\n }\n }\n}\n","import { Injectable } from '@navios/core'\n\nimport type { z } from 'zod/v4'\n\n/**\n * Result of parsing command-line arguments.\n *\n * @public\n */\nexport interface ParsedCliArgs {\n /**\n * The command path (e.g., 'greet', 'user:create').\n * Multi-word commands are joined with spaces.\n */\n command: string\n /**\n * Parsed options as key-value pairs.\n * Keys are converted from kebab-case to camelCase.\n */\n options: Record<string, any>\n /**\n * Positional arguments that don't match any option flags.\n */\n positionals: string[]\n}\n\n/**\n * Service for parsing command-line arguments.\n *\n * Handles parsing of various CLI argument formats including:\n * - Long options: `--key value` or `--key=value`\n * - Short options: `-k value` or `-abc` (multiple flags)\n * - Boolean flags\n * - Array options\n * - Positional arguments\n *\n * @public\n */\n@Injectable()\nexport class CliParserService {\n /**\n * Parses command-line arguments from process.argv\n * Commands can be multi-word (e.g., 'db migrate', 'cache clear')\n * Expected format: node script.js command [subcommand...] --flag value --boolean-flag positional1 positional2\n *\n * @param argv - Array of command-line arguments (typically process.argv)\n * @param optionsSchema - Optional zod/v4 schema to determine boolean flags and option types\n * @returns Parsed command (space-separated if multi-word), options, and positional arguments\n */\n parse(argv: string[], optionsSchema?: z.ZodObject): ParsedCliArgs {\n // Skip first two args (node and script path)\n const args = argv.slice(2)\n\n if (args.length === 0) {\n throw new Error('[Navios Commander] No command provided')\n }\n\n // Extract boolean and array field names from schema for accurate parsing\n const booleanFields = optionsSchema\n ? this.extractBooleanFields(optionsSchema)\n : new Set<string>()\n const arrayFields = optionsSchema ? this.extractArrayFields(optionsSchema) : new Set<string>()\n\n // Collect command words until we hit an argument that starts with '-' or '--'\n const commandParts: string[] = []\n let i = 0\n while (i < args.length && !args[i].startsWith('-')) {\n commandParts.push(args[i])\n i++\n }\n\n if (commandParts.length === 0) {\n throw new Error('[Navios Commander] No command provided')\n }\n\n const command = commandParts.join(' ')\n const options: Record<string, any> = {}\n const positionals: string[] = []\n while (i < args.length) {\n const arg = args[i]\n\n if (arg.startsWith('--')) {\n // Long option format: --key=value or --key value\n const key = arg.slice(2)\n const equalIndex = key.indexOf('=')\n\n if (equalIndex !== -1) {\n // Format: --key=value\n const optionName = key.slice(0, equalIndex)\n const optionValue = key.slice(equalIndex + 1)\n const camelCaseKey = this.camelCase(optionName)\n const isArray = arrayFields.has(camelCaseKey) || arrayFields.has(optionName)\n\n if (isArray) {\n // For array fields, accumulate values\n if (!options[camelCaseKey]) {\n options[camelCaseKey] = []\n }\n options[camelCaseKey].push(this.parseValue(optionValue))\n } else {\n options[camelCaseKey] = this.parseValue(optionValue)\n }\n i++\n } else {\n // Format: --key value or --boolean-flag\n const camelCaseKey = this.camelCase(key)\n const isBoolean = booleanFields.has(camelCaseKey) || booleanFields.has(key)\n const isArray = arrayFields.has(camelCaseKey) || arrayFields.has(key)\n const nextArg = args[i + 1]\n\n if (isBoolean) {\n // Known boolean flag from schema\n options[camelCaseKey] = true\n i++\n } else if (isArray && nextArg && !nextArg.startsWith('-')) {\n // Known array field from schema - accumulate values\n if (!options[camelCaseKey]) {\n options[camelCaseKey] = []\n }\n options[camelCaseKey].push(this.parseValue(nextArg))\n i += 2\n } else if (nextArg && !nextArg.startsWith('-')) {\n // Has a value\n options[camelCaseKey] = this.parseValue(nextArg)\n i += 2\n } else {\n // Assume boolean flag\n options[camelCaseKey] = true\n i++\n }\n }\n } else if (arg.startsWith('-') && arg.length > 1 && arg !== '-') {\n // Short option format: -k value or -abc (multiple flags)\n const flags = arg.slice(1)\n\n if (flags.length === 1) {\n // Single short flag: -k value or -k\n const isBoolean = booleanFields.has(flags)\n const isArray = arrayFields.has(flags)\n const nextArg = args[i + 1]\n\n if (isBoolean) {\n // Known boolean flag from schema\n options[flags] = true\n i++\n } else if (isArray && nextArg && !nextArg.startsWith('-')) {\n // Known array field from schema - accumulate values\n if (!options[flags]) {\n options[flags] = []\n }\n options[flags].push(this.parseValue(nextArg))\n i += 2\n } else if (nextArg && !nextArg.startsWith('-')) {\n options[flags] = this.parseValue(nextArg)\n i += 2\n } else {\n options[flags] = true\n i++\n }\n } else {\n // Multiple short flags: -abc -> {a: true, b: true, c: true}\n for (const flag of flags) {\n options[flag] = true\n }\n i++\n }\n } else {\n // Positional argument\n positionals.push(arg)\n i++\n }\n }\n\n return {\n command,\n options,\n positionals,\n }\n }\n\n /**\n * Converts kebab-case to camelCase\n */\n private camelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n }\n\n /**\n * Attempts to parse string values into appropriate types\n */\n private parseValue(value: string): any {\n // Check for boolean\n if (value === 'true') return true\n if (value === 'false') return false\n\n // Check for null/undefined\n if (value === 'null') return null\n if (value === 'undefined') return undefined\n\n // Check for number\n if (/^-?\\d+$/.test(value)) {\n return parseInt(value, 10)\n }\n if (/^-?\\d+\\.\\d+$/.test(value)) {\n return parseFloat(value)\n }\n\n // Check for JSON\n if (\n (value.startsWith('{') && value.endsWith('}')) ||\n (value.startsWith('[') && value.endsWith(']'))\n ) {\n try {\n return JSON.parse(value)\n } catch {\n // If parsing fails, return as string\n return value\n }\n }\n\n // Return as string\n return value\n }\n\n /**\n * Extracts boolean field names from a zod/v4 schema\n * Handles z.ZodObject, zod/v4Optional, and zod/v4Default wrappers\n */\n private extractBooleanFields(schema: z.ZodObject): Set<string> {\n const booleanFields = new Set<string>()\n\n try {\n // Check if schema has _def.typeName (zod/v4 schema structure)\n const typeName = schema.def.type\n\n if (typeName === 'object') {\n // Extract shape from z.ZodObject\n const shape = schema.def.shape\n\n if (shape && typeof shape === 'object') {\n for (const [key, fieldSchema] of Object.entries(shape)) {\n if (this.isSchemaBoolean(fieldSchema as any)) {\n booleanFields.add(key)\n }\n }\n }\n }\n } catch {\n // Silently fail if schema introspection fails\n }\n\n return booleanFields\n }\n\n /**\n * Extracts array field names from a zod/v4 schema\n * Handles z.ZodObject, zod/v4Optional, and zod/v4Default wrappers\n */\n private extractArrayFields(schema: z.ZodObject): Set<string> {\n const arrayFields = new Set<string>()\n\n try {\n const typeName = schema.def.type\n\n if (typeName === 'object') {\n const shape = schema.def.shape\n\n if (shape && typeof shape === 'object') {\n for (const [key, fieldSchema] of Object.entries(shape)) {\n if (this.isSchemaArray(fieldSchema as any)) {\n arrayFields.add(key)\n }\n }\n }\n }\n } catch {\n // Silently fail if schema introspection fails\n }\n\n return arrayFields\n }\n\n /**\n * Checks if a zod/v4 schema represents a boolean type\n * Unwraps zod/v4Optional and zod/v4Default using zod/v4 v4 API\n */\n private isSchemaBoolean(schema: z.ZodType): boolean {\n try {\n let currentSchema = schema\n let typeName = currentSchema.def.type\n\n // Unwrap zod/v4Optional and zod/v4Default using zod/v4 v4's def.innerType\n while (typeName === 'optional' || typeName === 'default') {\n currentSchema = (currentSchema as any)?.def?.innerType || currentSchema\n typeName = currentSchema.def.type\n }\n\n return typeName === 'boolean'\n } catch {\n return false\n }\n }\n\n /**\n * Checks if a zod/v4 schema represents an array type\n * Unwraps zod/v4Optional and zod/v4Default using zod/v4 v4 API\n */\n private isSchemaArray(schema: z.ZodType): boolean {\n try {\n let currentSchema = schema\n let typeName = currentSchema.def.type\n\n // Unwrap zod/v4Optional and zod/v4Default using zod/v4 v4's def.innerType\n while (typeName === 'optional' || typeName === 'default') {\n currentSchema = (currentSchema as any)?.def?.innerType || currentSchema\n typeName = currentSchema.def.type\n }\n\n return typeName === 'array'\n } catch {\n return false\n }\n }\n}\n","import type { CommandMetadata } from '../metadata/command.metadata.mjs'\n\n/**\n * Execution context for a command execution.\n *\n * Provides access to command metadata, path, and validated options during command execution.\n * This context is automatically injected and available via the `CommandExecutionContext` token.\n *\n * @example\n * ```typescript\n * import { inject, Injectable } from '@navios/core'\n * import { CommandExecutionContext } from '@navios/commander'\n *\n * @Injectable()\n * class CommandLogger {\n * private ctx = inject(CommandExecutionContext)\n *\n * log() {\n * console.log('Command:', this.ctx.getCommandPath())\n * console.log('Options:', this.ctx.getOptions())\n * }\n * }\n * ```\n */\nexport class CommanderExecutionContext {\n /**\n * @internal\n * Creates a new execution context.\n */\n constructor(\n private readonly command: CommandMetadata,\n private readonly commandPath: string,\n private readonly options: any,\n ) {}\n\n /**\n * Gets the command metadata.\n *\n * @returns The command metadata including path and options schema\n */\n getCommand(): CommandMetadata {\n return this.command\n }\n\n /**\n * Gets the command path that was invoked.\n *\n * @returns The command path (e.g., 'greet', 'user:create')\n */\n getCommandPath(): string {\n return this.commandPath\n }\n\n /**\n * Gets the validated command options.\n *\n * Options are validated against the command's zod/v4 schema if one was provided.\n *\n * @returns The validated options object\n */\n getOptions(): any {\n return this.options\n }\n}\n","import { InjectionToken } from '@navios/core'\n\nimport type { CommanderExecutionContext } from '../interfaces/index.mjs'\n\nconst CommandExecutionContextInjectionToken = 'CommanderExecutionContextInjectionToken'\n\n/**\n * Injection token for accessing the current command execution context.\n *\n * Use this token with `inject()` to access the `CommanderExecutionContext` in services\n * that need information about the currently executing command.\n *\n * @example\n * ```typescript\n * import { inject, Injectable } from '@navios/core'\n * import { CommandExecutionContext } from '@navios/commander'\n *\n * @Injectable()\n * class MyService {\n * private ctx = inject(CommandExecutionContext)\n *\n * doSomething() {\n * const commandPath = this.ctx.getCommandPath()\n * const options = this.ctx.getOptions()\n * // Use context information...\n * }\n * }\n * ```\n */\nexport const CommandExecutionContext = InjectionToken.create<CommanderExecutionContext>(\n CommandExecutionContextInjectionToken,\n)\n","import { Container, inject, Injectable, InjectionToken, Logger } from '@navios/core'\n\nimport type { ClassType, ModuleMetadata } from '@navios/core'\n\nimport { HelpCommand } from '../commands/help.command.mjs'\nimport { CommanderExecutionContext } from '../interfaces/commander-execution-context.interface.mjs'\nimport { CommandEntryKey } from '../metadata/command-entry.metadata.mjs'\nimport { extractCommandMetadata, hasCommandMetadata } from '../metadata/index.mjs'\nimport { CommandExecutionContext } from '../tokens/index.mjs'\n\nimport type { AbstractCliAdapterInterface } from '../interfaces/abstract-cli-adapter.interface.mjs'\nimport type { CommandHandler } from '../interfaces/command-handler.interface.mjs'\nimport type { CliAdapterOptions } from '../interfaces/environment.interface.mjs'\nimport type { CommandEntryValue } from '../metadata/command-entry.metadata.mjs'\n\nimport { CliParserService } from './cli-parser.service.mjs'\nimport { CommandRegistryService } from './command-registry.service.mjs'\n\n/**\n * CLI adapter service that implements the AbstractCliAdapterInterface.\n * Handles command discovery, registration, parsing, and execution.\n *\n * @public\n */\n@Injectable()\nexport class CommanderAdapterService implements AbstractCliAdapterInterface {\n private container = inject(Container)\n private commandRegistry = inject(CommandRegistryService)\n private cliParser = inject(CliParserService)\n private logger = inject(Logger, { context: 'Commander' })\n\n private options: CliAdapterOptions = {}\n private isReady = false\n\n /**\n * Sets up the adapter with the provided options.\n * Called during application initialization.\n */\n async setupAdapter(options: CliAdapterOptions): Promise<void> {\n this.options = options ?? {}\n }\n\n /**\n * Called after all modules are loaded.\n * Iterates through modules and extracts commands from customEntries.\n */\n async onModulesInit(modules: Map<string, ModuleMetadata>): Promise<void> {\n // Register built-in help command\n this.registerBuiltInCommands()\n\n for (const [moduleName, metadata] of modules) {\n const commands = metadata.customEntries.get(CommandEntryKey) as CommandEntryValue | undefined\n if (!commands) continue\n\n for (const commandClass of commands) {\n if (!hasCommandMetadata(commandClass)) {\n this.logger.warn(\n `Class ${commandClass.name} in module ${moduleName} ` +\n `is listed in commands but has no @Command decorator. Skipping.`,\n )\n continue\n }\n\n const commandMetadata = extractCommandMetadata(commandClass)\n this.commandRegistry.register(commandMetadata.path, {\n class: commandClass,\n metadata: commandMetadata,\n moduleName,\n })\n }\n }\n }\n\n /**\n * Registers built-in commands like help.\n */\n private registerBuiltInCommands(): void {\n const helpMetadata = extractCommandMetadata(HelpCommand)\n this.commandRegistry.register(helpMetadata.path, {\n class: HelpCommand,\n metadata: helpMetadata,\n moduleName: '@navios/commander',\n })\n }\n\n /**\n * Signals that the adapter is ready to handle commands.\n */\n async ready(): Promise<void> {\n this.isReady = true\n }\n\n /**\n * Disposes of the adapter and cleans up resources.\n */\n async dispose(): Promise<void> {\n this.commandRegistry.clear()\n this.isReady = false\n }\n\n /**\n * Run the CLI application with the given arguments.\n * Parses arguments and executes the matching command.\n */\n async run(argv: string[] = process.argv): Promise<void> {\n if (!this.isReady) {\n throw new Error('Adapter not ready. Call app.init() first.')\n }\n\n try {\n // Preliminary parse to find command\n const preliminaryParse = this.cliParser.parse(argv)\n\n // Handle --help or -h flags by showing help for the specific command\n if (preliminaryParse.options.help || preliminaryParse.options.h) {\n // If command is 'help', show general help\n // Otherwise show help for the specific command\n if (preliminaryParse.command === 'help') {\n await this.executeCommand('help', {})\n } else {\n await this.executeCommand('help', { command: preliminaryParse.command })\n }\n return\n }\n\n const command = this.commandRegistry.getByPath(preliminaryParse.command)\n\n // Re-parse with schema if available\n const parsed = command?.metadata.optionsSchema\n ? this.cliParser.parse(argv, command.metadata.optionsSchema)\n : preliminaryParse\n\n await this.executeCommand(parsed.command, parsed.options)\n } catch (error) {\n if (error instanceof Error) {\n this.logger.error(`Error: ${error.message}`)\n if (error.message.includes('Command not found')) {\n this.logger.log('')\n await this.executeCommand('help', {})\n }\n }\n throw error\n }\n }\n\n /**\n * Execute a command programmatically with the provided options.\n */\n async executeCommand(path: string, options: Record<string, unknown> = {}): Promise<void> {\n const command = this.commandRegistry.getByPath(path)\n if (!command) {\n throw new Error(`[Navios Commander] Command not found: ${path}`)\n }\n\n const { class: commandClass, metadata } = command\n\n // Validate options\n let validatedOptions = options\n if (metadata.optionsSchema) {\n validatedOptions = metadata.optionsSchema.parse(options)\n }\n\n // Create execution context\n const executionContext = new CommanderExecutionContext(metadata, path, validatedOptions)\n\n // Begin request scope\n const requestId = `cmd-${Date.now()}-${Math.random().toString(36).substring(7)}`\n const scopeContainer = this.container.beginRequest(requestId)\n scopeContainer.addInstance(CommandExecutionContext, executionContext)\n\n try {\n const commandInstance = await scopeContainer.get<CommandHandler>(\n commandClass as unknown as InjectionToken<CommandHandler>,\n )\n\n if (!commandInstance.execute) {\n throw new Error(`Command ${path} does not implement execute method`)\n }\n\n await commandInstance.execute(validatedOptions)\n } finally {\n await scopeContainer.endRequest()\n }\n }\n\n /**\n * Get all registered command paths and their class references.\n */\n getAllCommands(): Array<{ path: string; class: ClassType }> {\n return this.commandRegistry.getAllAsArray()\n }\n}\n","import { AdapterToken } from '@navios/core'\n\nimport type { AnyInjectableType, InjectionToken } from '@navios/core'\n\nimport { CliParserService } from './services/cli-parser.service.mjs'\nimport { CommandRegistryService } from './services/command-registry.service.mjs'\nimport { CommanderAdapterService } from './services/commander-adapter.service.mjs'\n\n/**\n * Defines the CLI environment configuration for use with NaviosFactory.\n *\n * This function returns the token mappings needed to configure a CLI application.\n * Use it with `NaviosFactory.create()` to create a CLI application.\n *\n * @returns Environment configuration with token mappings\n *\n * @example\n * ```typescript\n * import { NaviosFactory } from '@navios/core'\n * import { defineCliEnvironment, type CliEnvironment } from '@navios/commander'\n *\n * const app = await NaviosFactory.create<CliEnvironment>(AppModule, {\n * adapter: defineCliEnvironment(),\n * })\n * await app.init()\n *\n * const adapter = app.getAdapter() as AbstractCliAdapterInterface\n * await adapter.run(process.argv)\n * ```\n */\nexport function defineCliEnvironment() {\n const tokens = new Map<InjectionToken<any, undefined>, AnyInjectableType>([\n [AdapterToken, CommanderAdapterService],\n ])\n return { tokens }\n}\n\n// Re-export services for direct access if needed\nexport { CommanderAdapterService, CommandRegistryService, CliParserService }\n","/**\n * Dynamic import that bypasses bundler static analysis.\n * Uses Function constructor to prevent bundlers from resolving the import at build time.\n */\nexport function dynamicImport<T = unknown>(modulePath: string): Promise<T> {\n return new Function('modulePath', 'return import(modulePath)')(modulePath) as Promise<T>\n}\n","import { ConsoleLogger, NaviosFactory } from '@navios/core'\n\nimport type { ClassTypeWithInstance, LogLevel, NaviosApplication, NaviosModule } from '@navios/core'\n\nimport { defineCliEnvironment } from './define-environment.mjs'\nimport { dynamicImport } from './utils/index.mjs'\n\nimport type { CliEnvironment } from './interfaces/environment.interface.mjs'\n\n/**\n * Logger display options for CLI applications.\n * All options default to false for cleaner CLI output.\n *\n * @public\n */\nexport interface CommanderLoggerOptions {\n /**\n * Enabled log levels.\n * @default ['log', 'error', 'warn', 'debug', 'verbose', 'fatal']\n */\n logLevels?: LogLevel[]\n /**\n * If true, will print the process ID in the log message.\n * @default false\n */\n showPid?: boolean\n /**\n * If true, will print the log level in the log message.\n * @default true\n */\n showLogLevel?: boolean\n /**\n * If true, will print the prefix/app name in the log message.\n * @default false\n */\n showPrefix?: boolean\n /**\n * If true, will print the context in the log message.\n * @default true\n */\n showContext?: boolean\n /**\n * If true, will print the absolute timestamp in the log message.\n * @default false\n */\n showTimestamp?: boolean\n /**\n * If enabled, will print timestamp difference between current and previous log message.\n * @default false\n */\n showTimeDiff?: boolean\n}\n\n/**\n * TUI-specific options for terminal UI mode.\n * Only used when enableTUI is true.\n *\n * @public\n */\nexport interface CommanderTuiOptions {\n /**\n * Exit on Ctrl+C.\n * @default true\n */\n exitOnCtrlC?: boolean\n /**\n * Adapter to use for the TUI.\n * @default 'none'\n */\n adapter?: 'react' | 'solid' | 'ink' | 'none'\n /**\n * Sidebar width in columns.\n */\n sidebarWidth?: number\n /**\n * Sidebar position.\n */\n sidebarPosition?: 'left' | 'right'\n /**\n * Sidebar header title.\n */\n sidebarTitle?: string\n /**\n * Auto close after all screens complete successfully.\n * Set to true for default delay (5000ms), or specify delay in milliseconds.\n */\n autoClose?: boolean | number\n /**\n * Theme preset name ('dark', 'light', 'high-contrast') or custom theme object.\n */\n theme?: string | Record<string, unknown>\n /**\n * Enable mouse support.\n * @default false\n */\n useMouse?: boolean\n /**\n * Hide the default console logger screen from the sidebar.\n * @default false\n */\n hideDefaultScreen?: boolean\n /**\n * Use OpenTUI for terminal rendering.\n * When true: Full TUI with sidebar, scrolling, interactive prompts.\n * When false: Stdout mode - static screens print immediately, others on completion.\n * @default true for Node.js, false for Bun (OpenTUI not supported)\n */\n useOpenTUI?: boolean\n}\n\n/**\n * Configuration options for CommanderFactory.\n *\n * @public\n */\nexport interface CommanderFactoryOptions {\n /**\n * Enabled log levels.\n * @default ['log', 'error', 'warn', 'debug', 'verbose', 'fatal']\n */\n logLevels?: LogLevel[]\n /**\n * Logger display options. These override the default CLI-friendly logger settings.\n * Ignored when enableTUI is true.\n */\n logger?: CommanderLoggerOptions\n /**\n * Enable TUI mode with @navios/commander-tui.\n * Requires @navios/commander-tui to be installed.\n */\n enableTUI?: boolean\n /**\n * TUI-specific options. Only used when enableTUI is true.\n */\n tuiOptions?: CommanderTuiOptions\n}\n\n/**\n * Factory class for creating CLI applications.\n *\n * This is a convenience wrapper around `NaviosFactory.create()` that\n * configures everything needed for CLI usage. It sets up the CLI adapter\n * and returns a typed `NaviosApplication<CliEnvironment>`.\n *\n * @example\n * ```typescript\n * import { CommanderFactory } from '@navios/commander'\n * import { AppModule } from './app.module'\n *\n * async function bootstrap() {\n * const app = await CommanderFactory.create(AppModule)\n * await app.init()\n *\n * const adapter = app.getAdapter()\n * await adapter.run(process.argv)\n *\n * await app.close()\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Alternative: use NaviosFactory directly\n * import { NaviosFactory } from '@navios/core'\n * import { defineCliEnvironment, type CliEnvironment } from '@navios/commander'\n *\n * const app = await NaviosFactory.create<CliEnvironment>(AppModule, {\n * adapter: defineCliEnvironment(),\n * })\n * ```\n */\nexport class CommanderFactory {\n /**\n * Creates a new CLI application instance configured with the provided module.\n *\n * @param appModule - The root CLI module class decorated with `@CliModule`\n * @param options - Optional configuration options for the CLI application\n * @returns A promise that resolves to a configured NaviosApplication instance\n *\n * @example\n * ```typescript\n * const app = await CommanderFactory.create(AppModule)\n * await app.init()\n *\n * const adapter = app.getAdapter()\n * await adapter.run(process.argv)\n * ```\n */\n static async create<TModule extends NaviosModule = NaviosModule>(\n appModule: ClassTypeWithInstance<TModule>,\n options: CommanderFactoryOptions = {},\n ): Promise<NaviosApplication<CliEnvironment>> {\n if (options.enableTUI) {\n // Dynamic import to keep commander-tui as optional peer dependency\n let tuiModule: typeof import('@navios/commander-tui')\n try {\n // Dynamic imports using Function constructor to bypass bundler static analysis\n tuiModule =\n await dynamicImport<typeof import('@navios/commander-tui')>('@navios/commander-tui')\n // Load the appropriate adapter based on configuration\n const adapter = options.tuiOptions?.adapter\n const isBun = tuiModule.isBunRuntime()\n\n if (adapter === 'ink') {\n await dynamicImport('@navios/tui-adapter-ink')\n } else if (adapter === 'solid' && isBun) {\n await dynamicImport('@navios/tui-adapter-solid')\n } else if (adapter === 'react' && isBun) {\n await dynamicImport('@navios/tui-adapter-react')\n }\n } catch (error) {\n console.error(error)\n throw new Error(\n 'TUI mode requires @navios/commander-tui package. ' +\n 'Install it with: npm install @navios/commander-tui',\n )\n }\n\n const { overrideConsoleLogger, ScreenManager } = tuiModule\n\n // Override the ConsoleLogger service to use the ScreenLogger service instead of the default ConsoleLogger service.\n overrideConsoleLogger(options.tuiOptions?.hideDefaultScreen ?? false)\n\n if (options.tuiOptions?.hideDefaultScreen) {\n // Import the help command override to ensure it is registered\n await import('./overrides/help.command.mjs')\n }\n // Create app without custom logger - TUI override handles it\n const app = await NaviosFactory.create<CliEnvironment>(appModule, {\n adapter: defineCliEnvironment(),\n logger: options.logLevels,\n })\n\n // Get screen manager and bind TUI before returning\n const screenManager = await app.get(ScreenManager)\n screenManager.setup({\n logLevels: options.logLevels,\n })\n await screenManager.bind({\n exitOnCtrlC: options.tuiOptions?.exitOnCtrlC,\n sidebarWidth: options.tuiOptions?.sidebarWidth,\n sidebarPosition: options.tuiOptions?.sidebarPosition,\n sidebarTitle: options.tuiOptions?.sidebarTitle,\n autoClose: options.tuiOptions?.autoClose,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n theme: options.tuiOptions?.theme as any,\n useMouse: options.tuiOptions?.useMouse,\n useOpenTUI:\n options.tuiOptions?.useOpenTUI ??\n (options.tuiOptions?.adapter === 'ink' ? true : undefined),\n })\n\n return app\n }\n\n // Standard (non-TUI) mode - existing behavior unchanged\n const app = await NaviosFactory.create<CliEnvironment>(appModule, {\n adapter: defineCliEnvironment(),\n logger: ConsoleLogger.create({\n logLevels: options.logger?.logLevels,\n showTimeDiff: options.logger?.showTimeDiff ?? false,\n showPid: options.logger?.showPid ?? false,\n showLogLevel: options.logger?.showLogLevel ?? true,\n showPrefix: options.logger?.showPrefix ?? false,\n showContext: options.logger?.showContext ?? true,\n showTimestamp: options.logger?.showTimestamp ?? false,\n }),\n })\n\n return app\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["inject","Logger","z","Command","CommandRegistryService","HelpCommandToken","helpOptionsSchema","object","command","string","optional","token","path","description","optionsSchema","HelpCommand","logger","context","commandRegistry","execute","options","log","formatCommandHelp","formatCommandList","Injectable","CliParserService","parse","argv","optionsSchema","args","slice","length","Error","booleanFields","extractBooleanFields","Set","arrayFields","extractArrayFields","commandParts","i","startsWith","push","command","join","options","positionals","arg","key","equalIndex","indexOf","optionName","optionValue","camelCaseKey","camelCase","isArray","has","parseValue","isBoolean","nextArg","flags","flag","str","replace","_","letter","toUpperCase","value","undefined","test","parseInt","parseFloat","endsWith","JSON","schema","typeName","def","type","shape","fieldSchema","Object","entries","isSchemaBoolean","add","isSchemaArray","currentSchema","innerType","CommanderExecutionContext","command","commandPath","options","positionals","getCommand","getCommandPath","getOptions","getPositionals","InjectionToken","CommandExecutionContextInjectionToken","CommandExecutionContext","create","Container","inject","Injectable","Logger","HelpCommand","CommanderExecutionContext","CommandEntryKey","extractCommandMetadata","hasCommandMetadata","CommandExecutionContext","CliParserService","CommandRegistryService","CommanderAdapterService","container","commandRegistry","cliParser","logger","context","options","isReady","setupAdapter","onModulesInit","modules","registerBuiltInCommands","moduleName","metadata","commands","customEntries","get","commandClass","warn","name","commandMetadata","register","path","class","helpMetadata","ready","dispose","clear","run","argv","process","Error","preliminaryParse","parse","help","h","command","executeCommand","getByPath","parsed","optionsSchema","positionals","error","message","includes","log","validatedOptions","executionContext","requestId","Date","now","Math","random","toString","substring","scopeContainer","beginRequest","addInstance","commandInstance","execute","endRequest","getAllCommands","getAllAsArray","AdapterToken","CliParserService","CommandRegistryService","CommanderAdapterService","defineCliEnvironment","tokens","Map","ConsoleLogger","NaviosFactory","defineCliEnvironment","dynamicImport","CommanderFactory","create","appModule","options","enableTUI","tuiModule","adapter","tuiOptions","isBun","isBunRuntime","error","console","Error","overrideConsoleLogger","ScreenManager","hideDefaultScreen","app","logger","logLevels","screenManager","get","setup","bind","exitOnCtrlC","sidebarWidth","sidebarPosition","sidebarTitle","autoClose","theme","useMouse","useOpenTUI","undefined","showTimeDiff","showPid","showLogLevel","showPrefix","showContext","showTimestamp"],"sources":["../src/commands/help.command.mts","../src/services/cli-parser.service.mts","../src/interfaces/commander-execution-context.interface.mts","../src/tokens/execution-context.token.mts","../src/services/commander-adapter.service.mts","../src/define-environment.mts","../src/utils/runtime.mts","../src/commander.factory.mts"],"sourcesContent":["import { inject, Logger } from '@navios/core'\nimport { z } from 'zod/v4'\n\nimport { Command } from '../decorators/command.decorator.mjs'\nimport { CommandRegistryService } from '../services/command-registry.service.mjs'\nimport { HelpCommandToken } from '../tokens/help-command.token.mjs'\n\nimport type { CommandHandler } from '../interfaces/command-handler.interface.mjs'\n\nconst helpOptionsSchema = z.object({\n command: z.string().optional(),\n})\n\ntype HelpOptions = z.infer<typeof helpOptionsSchema>\n\n/**\n * Built-in help command that lists all available commands or shows help for a specific command.\n *\n * @public\n */\n@Command({\n token: HelpCommandToken,\n path: 'help',\n description: 'Show available commands or help for a specific command',\n optionsSchema: helpOptionsSchema,\n})\nexport class HelpCommand implements CommandHandler<HelpOptions> {\n private logger = inject(Logger, { context: 'Commander' })\n private commandRegistry = inject(CommandRegistryService)\n\n async execute(options: HelpOptions): Promise<void> {\n if (options.command) {\n this.logger.log(this.commandRegistry.formatCommandHelp(options.command))\n } else {\n this.logger.log(this.commandRegistry.formatCommandList())\n }\n }\n}\n","import { Injectable } from '@navios/core'\n\nimport type { z } from 'zod/v4'\n\n/**\n * Result of parsing command-line arguments.\n *\n * @public\n */\nexport interface ParsedCliArgs {\n /**\n * The command path (e.g., 'greet', 'user:create').\n * Multi-word commands are joined with spaces.\n */\n command: string\n /**\n * Parsed options as key-value pairs.\n * Keys are converted from kebab-case to camelCase.\n */\n options: Record<string, any>\n /**\n * Positional arguments that don't match any option flags.\n */\n positionals: string[]\n}\n\n/**\n * Service for parsing command-line arguments.\n *\n * Handles parsing of various CLI argument formats including:\n * - Long options: `--key value` or `--key=value`\n * - Short options: `-k value` or `-abc` (multiple flags)\n * - Boolean flags\n * - Array options\n * - Positional arguments\n *\n * @public\n */\n@Injectable()\nexport class CliParserService {\n /**\n * Parses command-line arguments from process.argv\n * Commands can be multi-word (e.g., 'db migrate', 'cache clear')\n * Expected format: node script.js command [subcommand...] --flag value --boolean-flag positional1 positional2\n *\n * @param argv - Array of command-line arguments (typically process.argv)\n * @param optionsSchema - Optional zod/v4 schema to determine boolean flags and option types\n * @returns Parsed command (space-separated if multi-word), options, and positional arguments\n */\n parse(argv: string[], optionsSchema?: z.ZodObject): ParsedCliArgs {\n // Skip first two args (node and script path)\n const args = argv.slice(2)\n\n if (args.length === 0) {\n throw new Error('[Navios Commander] No command provided')\n }\n\n // Extract boolean and array field names from schema for accurate parsing\n const booleanFields = optionsSchema\n ? this.extractBooleanFields(optionsSchema)\n : new Set<string>()\n const arrayFields = optionsSchema ? this.extractArrayFields(optionsSchema) : new Set<string>()\n\n // Collect command words until we hit an argument that starts with '-' or '--'\n const commandParts: string[] = []\n let i = 0\n while (i < args.length && !args[i].startsWith('-')) {\n commandParts.push(args[i])\n i++\n }\n\n if (commandParts.length === 0) {\n throw new Error('[Navios Commander] No command provided')\n }\n\n const command = commandParts.join(' ')\n const options: Record<string, any> = {}\n const positionals: string[] = []\n while (i < args.length) {\n const arg = args[i]\n\n if (arg.startsWith('--')) {\n // Long option format: --key=value or --key value\n const key = arg.slice(2)\n const equalIndex = key.indexOf('=')\n\n if (equalIndex !== -1) {\n // Format: --key=value\n const optionName = key.slice(0, equalIndex)\n const optionValue = key.slice(equalIndex + 1)\n const camelCaseKey = this.camelCase(optionName)\n const isArray = arrayFields.has(camelCaseKey) || arrayFields.has(optionName)\n\n if (isArray) {\n // For array fields, accumulate values\n if (!options[camelCaseKey]) {\n options[camelCaseKey] = []\n }\n options[camelCaseKey].push(this.parseValue(optionValue))\n } else {\n options[camelCaseKey] = this.parseValue(optionValue)\n }\n i++\n } else {\n // Format: --key value or --boolean-flag\n const camelCaseKey = this.camelCase(key)\n const isBoolean = booleanFields.has(camelCaseKey) || booleanFields.has(key)\n const isArray = arrayFields.has(camelCaseKey) || arrayFields.has(key)\n const nextArg = args[i + 1]\n\n if (isBoolean) {\n // Known boolean flag from schema\n options[camelCaseKey] = true\n i++\n } else if (isArray && nextArg && !nextArg.startsWith('-')) {\n // Known array field from schema - accumulate values\n if (!options[camelCaseKey]) {\n options[camelCaseKey] = []\n }\n options[camelCaseKey].push(this.parseValue(nextArg))\n i += 2\n } else if (nextArg && !nextArg.startsWith('-')) {\n // Has a value\n options[camelCaseKey] = this.parseValue(nextArg)\n i += 2\n } else {\n // Assume boolean flag\n options[camelCaseKey] = true\n i++\n }\n }\n } else if (arg.startsWith('-') && arg.length > 1 && arg !== '-') {\n // Short option format: -k value or -abc (multiple flags)\n const flags = arg.slice(1)\n\n if (flags.length === 1) {\n // Single short flag: -k value or -k\n const isBoolean = booleanFields.has(flags)\n const isArray = arrayFields.has(flags)\n const nextArg = args[i + 1]\n\n if (isBoolean) {\n // Known boolean flag from schema\n options[flags] = true\n i++\n } else if (isArray && nextArg && !nextArg.startsWith('-')) {\n // Known array field from schema - accumulate values\n if (!options[flags]) {\n options[flags] = []\n }\n options[flags].push(this.parseValue(nextArg))\n i += 2\n } else if (nextArg && !nextArg.startsWith('-')) {\n options[flags] = this.parseValue(nextArg)\n i += 2\n } else {\n options[flags] = true\n i++\n }\n } else {\n // Multiple short flags: -abc -> {a: true, b: true, c: true}\n for (const flag of flags) {\n options[flag] = true\n }\n i++\n }\n } else {\n // Positional argument\n positionals.push(arg)\n i++\n }\n }\n\n return {\n command,\n options,\n positionals,\n }\n }\n\n /**\n * Converts kebab-case to camelCase\n */\n private camelCase(str: string): string {\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase())\n }\n\n /**\n * Attempts to parse string values into appropriate types\n */\n private parseValue(value: string): any {\n // Check for boolean\n if (value === 'true') return true\n if (value === 'false') return false\n\n // Check for null/undefined\n if (value === 'null') return null\n if (value === 'undefined') return undefined\n\n // Check for number\n if (/^-?\\d+$/.test(value)) {\n return parseInt(value, 10)\n }\n if (/^-?\\d+\\.\\d+$/.test(value)) {\n return parseFloat(value)\n }\n\n // Check for JSON\n if (\n (value.startsWith('{') && value.endsWith('}')) ||\n (value.startsWith('[') && value.endsWith(']'))\n ) {\n try {\n return JSON.parse(value)\n } catch {\n // If parsing fails, return as string\n return value\n }\n }\n\n // Return as string\n return value\n }\n\n /**\n * Extracts boolean field names from a zod/v4 schema\n * Handles z.ZodObject, zod/v4Optional, and zod/v4Default wrappers\n */\n private extractBooleanFields(schema: z.ZodObject): Set<string> {\n const booleanFields = new Set<string>()\n\n try {\n // Check if schema has _def.typeName (zod/v4 schema structure)\n const typeName = schema.def.type\n\n if (typeName === 'object') {\n // Extract shape from z.ZodObject\n const shape = schema.def.shape\n\n if (shape && typeof shape === 'object') {\n for (const [key, fieldSchema] of Object.entries(shape)) {\n if (this.isSchemaBoolean(fieldSchema as any)) {\n booleanFields.add(key)\n }\n }\n }\n }\n } catch {\n // Silently fail if schema introspection fails\n }\n\n return booleanFields\n }\n\n /**\n * Extracts array field names from a zod/v4 schema\n * Handles z.ZodObject, zod/v4Optional, and zod/v4Default wrappers\n */\n private extractArrayFields(schema: z.ZodObject): Set<string> {\n const arrayFields = new Set<string>()\n\n try {\n const typeName = schema.def.type\n\n if (typeName === 'object') {\n const shape = schema.def.shape\n\n if (shape && typeof shape === 'object') {\n for (const [key, fieldSchema] of Object.entries(shape)) {\n if (this.isSchemaArray(fieldSchema as any)) {\n arrayFields.add(key)\n }\n }\n }\n }\n } catch {\n // Silently fail if schema introspection fails\n }\n\n return arrayFields\n }\n\n /**\n * Checks if a zod/v4 schema represents a boolean type\n * Unwraps zod/v4Optional and zod/v4Default using zod/v4 v4 API\n */\n private isSchemaBoolean(schema: z.ZodType): boolean {\n try {\n let currentSchema = schema\n let typeName = currentSchema.def.type\n\n // Unwrap zod/v4Optional and zod/v4Default using zod/v4 v4's def.innerType\n while (typeName === 'optional' || typeName === 'default') {\n currentSchema = (currentSchema as any)?.def?.innerType || currentSchema\n typeName = currentSchema.def.type\n }\n\n return typeName === 'boolean'\n } catch {\n return false\n }\n }\n\n /**\n * Checks if a zod/v4 schema represents an array type\n * Unwraps zod/v4Optional and zod/v4Default using zod/v4 v4 API\n */\n private isSchemaArray(schema: z.ZodType): boolean {\n try {\n let currentSchema = schema\n let typeName = currentSchema.def.type\n\n // Unwrap zod/v4Optional and zod/v4Default using zod/v4 v4's def.innerType\n while (typeName === 'optional' || typeName === 'default') {\n currentSchema = (currentSchema as any)?.def?.innerType || currentSchema\n typeName = currentSchema.def.type\n }\n\n return typeName === 'array'\n } catch {\n return false\n }\n }\n}\n","import type { CommandMetadata } from '../metadata/command.metadata.mjs'\n\n/**\n * Execution context for a command execution.\n *\n * Provides access to command metadata, path, and validated options during command execution.\n * This context is automatically injected and available via the `CommandExecutionContext` token.\n *\n * @example\n * ```typescript\n * import { inject, Injectable } from '@navios/core'\n * import { CommandExecutionContext } from '@navios/commander'\n *\n * @Injectable()\n * class CommandLogger {\n * private ctx = inject(CommandExecutionContext)\n *\n * log() {\n * console.log('Command:', this.ctx.getCommandPath())\n * console.log('Options:', this.ctx.getOptions())\n * }\n * }\n * ```\n */\nexport class CommanderExecutionContext {\n /**\n * @internal\n * Creates a new execution context.\n */\n constructor(\n private readonly command: CommandMetadata,\n private readonly commandPath: string,\n private readonly options: any,\n private readonly positionals: string[] = [],\n ) {}\n\n /**\n * Gets the command metadata.\n *\n * @returns The command metadata including path and options schema\n */\n getCommand(): CommandMetadata {\n return this.command\n }\n\n /**\n * Gets the command path that was invoked.\n *\n * @returns The command path (e.g., 'greet', 'user:create')\n */\n getCommandPath(): string {\n return this.commandPath\n }\n\n /**\n * Gets the validated command options.\n *\n * Options are validated against the command's zod/v4 schema if one was provided.\n *\n * @returns The validated options object\n */\n getOptions(): any {\n return this.options\n }\n\n /**\n * Gets the positional arguments.\n *\n * Positional arguments are values that don't match any option flags.\n * For example, in `copy --force source.txt dest.txt`, the positionals are `['source.txt', 'dest.txt']`.\n *\n * @returns The positional arguments array\n */\n getPositionals(): string[] {\n return this.positionals\n }\n}\n","import { InjectionToken } from '@navios/core'\n\nimport type { CommanderExecutionContext } from '../interfaces/index.mjs'\n\nconst CommandExecutionContextInjectionToken = 'CommanderExecutionContextInjectionToken'\n\n/**\n * Injection token for accessing the current command execution context.\n *\n * Use this token with `inject()` to access the `CommanderExecutionContext` in services\n * that need information about the currently executing command.\n *\n * @example\n * ```typescript\n * import { inject, Injectable } from '@navios/core'\n * import { CommandExecutionContext } from '@navios/commander'\n *\n * @Injectable()\n * class MyService {\n * private ctx = inject(CommandExecutionContext)\n *\n * doSomething() {\n * const commandPath = this.ctx.getCommandPath()\n * const options = this.ctx.getOptions()\n * // Use context information...\n * }\n * }\n * ```\n */\nexport const CommandExecutionContext = InjectionToken.create<CommanderExecutionContext>(\n CommandExecutionContextInjectionToken,\n)\n","import { Container, inject, Injectable, InjectionToken, Logger } from '@navios/core'\n\nimport type { ClassType, ModuleMetadata } from '@navios/core'\n\nimport { HelpCommand } from '../commands/help.command.mjs'\nimport { CommanderExecutionContext } from '../interfaces/commander-execution-context.interface.mjs'\nimport { CommandEntryKey } from '../metadata/command-entry.metadata.mjs'\nimport { extractCommandMetadata, hasCommandMetadata } from '../metadata/index.mjs'\nimport { CommandExecutionContext } from '../tokens/index.mjs'\n\nimport type { AbstractCliAdapterInterface } from '../interfaces/abstract-cli-adapter.interface.mjs'\nimport type { CommandHandler } from '../interfaces/command-handler.interface.mjs'\nimport type { CliAdapterOptions } from '../interfaces/environment.interface.mjs'\nimport type { CommandEntryValue } from '../metadata/command-entry.metadata.mjs'\n\nimport { CliParserService } from './cli-parser.service.mjs'\nimport { CommandRegistryService } from './command-registry.service.mjs'\n\n/**\n * CLI adapter service that implements the AbstractCliAdapterInterface.\n * Handles command discovery, registration, parsing, and execution.\n *\n * @public\n */\n@Injectable()\nexport class CommanderAdapterService implements AbstractCliAdapterInterface {\n private container = inject(Container)\n private commandRegistry = inject(CommandRegistryService)\n private cliParser = inject(CliParserService)\n private logger = inject(Logger, { context: 'Commander' })\n\n private options: CliAdapterOptions = {}\n private isReady = false\n\n /**\n * Sets up the adapter with the provided options.\n * Called during application initialization.\n */\n async setupAdapter(options: CliAdapterOptions): Promise<void> {\n this.options = options ?? {}\n }\n\n /**\n * Called after all modules are loaded.\n * Iterates through modules and extracts commands from customEntries.\n */\n async onModulesInit(modules: Map<string, ModuleMetadata>): Promise<void> {\n // Register built-in help command\n this.registerBuiltInCommands()\n\n for (const [moduleName, metadata] of modules) {\n const commands = metadata.customEntries.get(CommandEntryKey) as CommandEntryValue | undefined\n if (!commands) continue\n\n for (const commandClass of commands) {\n if (!hasCommandMetadata(commandClass)) {\n this.logger.warn(\n `Class ${commandClass.name} in module ${moduleName} ` +\n `is listed in commands but has no @Command decorator. Skipping.`,\n )\n continue\n }\n\n const commandMetadata = extractCommandMetadata(commandClass)\n this.commandRegistry.register(commandMetadata.path, {\n class: commandClass,\n metadata: commandMetadata,\n moduleName,\n })\n }\n }\n }\n\n /**\n * Registers built-in commands like help.\n */\n private registerBuiltInCommands(): void {\n const helpMetadata = extractCommandMetadata(HelpCommand)\n this.commandRegistry.register(helpMetadata.path, {\n class: HelpCommand,\n metadata: helpMetadata,\n moduleName: '@navios/commander',\n })\n }\n\n /**\n * Signals that the adapter is ready to handle commands.\n */\n async ready(): Promise<void> {\n this.isReady = true\n }\n\n /**\n * Disposes of the adapter and cleans up resources.\n */\n async dispose(): Promise<void> {\n this.commandRegistry.clear()\n this.isReady = false\n }\n\n /**\n * Run the CLI application with the given arguments.\n * Parses arguments and executes the matching command.\n */\n async run(argv: string[] = process.argv): Promise<void> {\n if (!this.isReady) {\n throw new Error('Adapter not ready. Call app.init() first.')\n }\n\n try {\n // Preliminary parse to find command\n const preliminaryParse = this.cliParser.parse(argv)\n\n // Handle --help or -h flags by showing help for the specific command\n if (preliminaryParse.options.help || preliminaryParse.options.h) {\n // If command is 'help', show general help\n // Otherwise show help for the specific command\n if (preliminaryParse.command === 'help') {\n await this.executeCommand('help', {})\n } else {\n await this.executeCommand('help', { command: preliminaryParse.command })\n }\n return\n }\n\n const command = this.commandRegistry.getByPath(preliminaryParse.command)\n\n // Re-parse with schema if available\n const parsed = command?.metadata.optionsSchema\n ? this.cliParser.parse(argv, command.metadata.optionsSchema)\n : preliminaryParse\n\n await this.executeCommand(parsed.command, parsed.options, parsed.positionals)\n } catch (error) {\n if (error instanceof Error) {\n this.logger.error(`Error: ${error.message}`)\n if (error.message.includes('Command not found')) {\n this.logger.log('')\n await this.executeCommand('help', {})\n }\n }\n throw error\n }\n }\n\n /**\n * Execute a command programmatically with the provided options.\n */\n async executeCommand(\n path: string,\n options: Record<string, unknown> = {},\n positionals: string[] = [],\n ): Promise<void> {\n const command = this.commandRegistry.getByPath(path)\n if (!command) {\n throw new Error(`[Navios Commander] Command not found: ${path}`)\n }\n\n const { class: commandClass, metadata } = command\n\n // Validate options\n let validatedOptions = options\n if (metadata.optionsSchema) {\n validatedOptions = metadata.optionsSchema.parse(options)\n }\n\n // Create execution context\n const executionContext = new CommanderExecutionContext(\n metadata,\n path,\n validatedOptions,\n positionals,\n )\n\n // Begin request scope\n const requestId = `cmd-${Date.now()}-${Math.random().toString(36).substring(7)}`\n const scopeContainer = this.container.beginRequest(requestId)\n scopeContainer.addInstance(CommandExecutionContext, executionContext)\n\n try {\n const commandInstance = await scopeContainer.get<CommandHandler>(\n commandClass as unknown as InjectionToken<CommandHandler>,\n )\n\n if (!commandInstance.execute) {\n throw new Error(`Command ${path} does not implement execute method`)\n }\n\n await commandInstance.execute(validatedOptions, positionals)\n } finally {\n await scopeContainer.endRequest()\n }\n }\n\n /**\n * Get all registered command paths and their class references.\n */\n getAllCommands(): Array<{ path: string; class: ClassType }> {\n return this.commandRegistry.getAllAsArray()\n }\n}\n","import { AdapterToken } from '@navios/core'\n\nimport type { AnyInjectableType, InjectionToken } from '@navios/core'\n\nimport { CliParserService } from './services/cli-parser.service.mjs'\nimport { CommandRegistryService } from './services/command-registry.service.mjs'\nimport { CommanderAdapterService } from './services/commander-adapter.service.mjs'\n\n/**\n * Defines the CLI environment configuration for use with NaviosFactory.\n *\n * This function returns the token mappings needed to configure a CLI application.\n * Use it with `NaviosFactory.create()` to create a CLI application.\n *\n * @returns Environment configuration with token mappings\n *\n * @example\n * ```typescript\n * import { NaviosFactory } from '@navios/core'\n * import { defineCliEnvironment, type CliEnvironment } from '@navios/commander'\n *\n * const app = await NaviosFactory.create<CliEnvironment>(AppModule, {\n * adapter: defineCliEnvironment(),\n * })\n * await app.init()\n *\n * const adapter = app.getAdapter() as AbstractCliAdapterInterface\n * await adapter.run(process.argv)\n * ```\n */\nexport function defineCliEnvironment() {\n const tokens = new Map<InjectionToken<any, undefined>, AnyInjectableType>([\n [AdapterToken, CommanderAdapterService],\n ])\n return { tokens }\n}\n\n// Re-export services for direct access if needed\nexport { CommanderAdapterService, CommandRegistryService, CliParserService }\n","/**\n * Dynamic import that bypasses bundler static analysis.\n * Uses Function constructor to prevent bundlers from resolving the import at build time.\n */\nexport function dynamicImport<T = unknown>(modulePath: string): Promise<T> {\n return new Function('modulePath', 'return import(modulePath)')(modulePath) as Promise<T>\n}\n","import { ConsoleLogger, NaviosFactory } from '@navios/core'\n\nimport type { ClassTypeWithInstance, LogLevel, NaviosApplication, NaviosModule } from '@navios/core'\n\nimport { defineCliEnvironment } from './define-environment.mjs'\nimport { dynamicImport } from './utils/index.mjs'\n\nimport type { CliEnvironment } from './interfaces/environment.interface.mjs'\n\n/**\n * Logger display options for CLI applications.\n * All options default to false for cleaner CLI output.\n *\n * @public\n */\nexport interface CommanderLoggerOptions {\n /**\n * Enabled log levels.\n * @default ['log', 'error', 'warn', 'debug', 'verbose', 'fatal']\n */\n logLevels?: LogLevel[]\n /**\n * If true, will print the process ID in the log message.\n * @default false\n */\n showPid?: boolean\n /**\n * If true, will print the log level in the log message.\n * @default true\n */\n showLogLevel?: boolean\n /**\n * If true, will print the prefix/app name in the log message.\n * @default false\n */\n showPrefix?: boolean\n /**\n * If true, will print the context in the log message.\n * @default true\n */\n showContext?: boolean\n /**\n * If true, will print the absolute timestamp in the log message.\n * @default false\n */\n showTimestamp?: boolean\n /**\n * If enabled, will print timestamp difference between current and previous log message.\n * @default false\n */\n showTimeDiff?: boolean\n}\n\n/**\n * TUI-specific options for terminal UI mode.\n * Only used when enableTUI is true.\n *\n * @public\n */\nexport interface CommanderTuiOptions {\n /**\n * Exit on Ctrl+C.\n * @default true\n */\n exitOnCtrlC?: boolean\n /**\n * Adapter to use for the TUI.\n * @default 'none'\n */\n adapter?: 'react' | 'solid' | 'ink' | 'none'\n /**\n * Sidebar width in columns.\n */\n sidebarWidth?: number\n /**\n * Sidebar position.\n */\n sidebarPosition?: 'left' | 'right'\n /**\n * Sidebar header title.\n */\n sidebarTitle?: string\n /**\n * Auto close after all screens complete successfully.\n * Set to true for default delay (5000ms), or specify delay in milliseconds.\n */\n autoClose?: boolean | number\n /**\n * Theme preset name ('dark', 'light', 'high-contrast') or custom theme object.\n */\n theme?: string | Record<string, unknown>\n /**\n * Enable mouse support.\n * @default false\n */\n useMouse?: boolean\n /**\n * Hide the default console logger screen from the sidebar.\n * @default false\n */\n hideDefaultScreen?: boolean\n /**\n * Use OpenTUI for terminal rendering.\n * When true: Full TUI with sidebar, scrolling, interactive prompts.\n * When false: Stdout mode - static screens print immediately, others on completion.\n * @default true for Node.js, false for Bun (OpenTUI not supported)\n */\n useOpenTUI?: boolean\n}\n\n/**\n * Configuration options for CommanderFactory.\n *\n * @public\n */\nexport interface CommanderFactoryOptions {\n /**\n * Enabled log levels.\n * @default ['log', 'error', 'warn', 'debug', 'verbose', 'fatal']\n */\n logLevels?: LogLevel[]\n /**\n * Logger display options. These override the default CLI-friendly logger settings.\n * Ignored when enableTUI is true.\n */\n logger?: CommanderLoggerOptions\n /**\n * Enable TUI mode with @navios/commander-tui.\n * Requires @navios/commander-tui to be installed.\n */\n enableTUI?: boolean\n /**\n * TUI-specific options. Only used when enableTUI is true.\n */\n tuiOptions?: CommanderTuiOptions\n}\n\n/**\n * Factory class for creating CLI applications.\n *\n * This is a convenience wrapper around `NaviosFactory.create()` that\n * configures everything needed for CLI usage. It sets up the CLI adapter\n * and returns a typed `NaviosApplication<CliEnvironment>`.\n *\n * @example\n * ```typescript\n * import { CommanderFactory } from '@navios/commander'\n * import { AppModule } from './app.module'\n *\n * async function bootstrap() {\n * const app = await CommanderFactory.create(AppModule)\n * await app.init()\n *\n * const adapter = app.getAdapter()\n * await adapter.run(process.argv)\n *\n * await app.close()\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Alternative: use NaviosFactory directly\n * import { NaviosFactory } from '@navios/core'\n * import { defineCliEnvironment, type CliEnvironment } from '@navios/commander'\n *\n * const app = await NaviosFactory.create<CliEnvironment>(AppModule, {\n * adapter: defineCliEnvironment(),\n * })\n * ```\n */\nexport class CommanderFactory {\n /**\n * Creates a new CLI application instance configured with the provided module.\n *\n * @param appModule - The root CLI module class decorated with `@CliModule`\n * @param options - Optional configuration options for the CLI application\n * @returns A promise that resolves to a configured NaviosApplication instance\n *\n * @example\n * ```typescript\n * const app = await CommanderFactory.create(AppModule)\n * await app.init()\n *\n * const adapter = app.getAdapter()\n * await adapter.run(process.argv)\n * ```\n */\n static async create<TModule extends NaviosModule = NaviosModule>(\n appModule: ClassTypeWithInstance<TModule>,\n options: CommanderFactoryOptions = {},\n ): Promise<NaviosApplication<CliEnvironment>> {\n if (options.enableTUI) {\n // Dynamic import to keep commander-tui as optional peer dependency\n let tuiModule: typeof import('@navios/commander-tui')\n try {\n // Dynamic imports using Function constructor to bypass bundler static analysis\n tuiModule =\n await dynamicImport<typeof import('@navios/commander-tui')>('@navios/commander-tui')\n // Load the appropriate adapter based on configuration\n const adapter = options.tuiOptions?.adapter\n const isBun = tuiModule.isBunRuntime()\n\n if (adapter === 'ink') {\n await dynamicImport('@navios/tui-adapter-ink')\n } else if (adapter === 'solid' && isBun) {\n await dynamicImport('@navios/tui-adapter-solid')\n } else if (adapter === 'react' && isBun) {\n await dynamicImport('@navios/tui-adapter-react')\n }\n } catch (error) {\n console.error(error)\n throw new Error(\n 'TUI mode requires @navios/commander-tui package. ' +\n 'Install it with: npm install @navios/commander-tui',\n )\n }\n\n const { overrideConsoleLogger, ScreenManager } = tuiModule\n\n // Override the ConsoleLogger service to use the ScreenLogger service instead of the default ConsoleLogger service.\n overrideConsoleLogger(options.tuiOptions?.hideDefaultScreen ?? false)\n\n if (options.tuiOptions?.hideDefaultScreen) {\n // Import the help command override to ensure it is registered\n await import('./overrides/help.command.mjs')\n }\n // Create app without custom logger - TUI override handles it\n const app = await NaviosFactory.create<CliEnvironment>(appModule, {\n adapter: defineCliEnvironment(),\n logger: options.logLevels,\n })\n\n // Get screen manager and bind TUI before returning\n const screenManager = await app.get(ScreenManager)\n screenManager.setup({\n logLevels: options.logLevels,\n })\n await screenManager.bind({\n exitOnCtrlC: options.tuiOptions?.exitOnCtrlC,\n sidebarWidth: options.tuiOptions?.sidebarWidth,\n sidebarPosition: options.tuiOptions?.sidebarPosition,\n sidebarTitle: options.tuiOptions?.sidebarTitle,\n autoClose: options.tuiOptions?.autoClose,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n theme: options.tuiOptions?.theme as any,\n useMouse: options.tuiOptions?.useMouse,\n useOpenTUI:\n options.tuiOptions?.useOpenTUI ??\n (options.tuiOptions?.adapter === 'ink' ? true : undefined),\n })\n\n return app\n }\n\n // Standard (non-TUI) mode - existing behavior unchanged\n const app = await NaviosFactory.create<CliEnvironment>(appModule, {\n adapter: defineCliEnvironment(),\n logger: ConsoleLogger.create({\n logLevels: options.logger?.logLevels,\n showTimeDiff: options.logger?.showTimeDiff ?? false,\n showPid: options.logger?.showPid ?? false,\n showLogLevel: options.logger?.showLogLevel ?? true,\n showPrefix: options.logger?.showPrefix ?? false,\n showContext: options.logger?.showContext ?? true,\n showTimestamp: options.logger?.showTimestamp ?? false,\n }),\n })\n\n return app\n }\n}\n"],"mappings":"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"}
package/lib/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as CommandHandler, i as CommandOptions, n as CliModuleOptions, r as Command, t as CliModule } from "./cli-module.decorator-BzsOEMPH.cjs";
1
+ import { a as CommandHandler, i as CommandOptions, n as CliModuleOptions, r as Command, t as CliModule } from "./cli-module.decorator-BV3vVKlR.cjs";
2
2
  import { AbstractAdapterInterface, AdapterEnvironment, AnyInjectableType, ClassType, ClassTypeWithInstance, InjectionToken, LogLevel, ModuleMetadata, NaviosApplication, NaviosModule } from "@navios/core";
3
3
  import { z } from "zod/v4";
4
4
  export * from "@navios/core";
@@ -370,11 +370,12 @@ declare class CommanderExecutionContext {
370
370
  private readonly command;
371
371
  private readonly commandPath;
372
372
  private readonly options;
373
+ private readonly positionals;
373
374
  /**
374
375
  * @internal
375
376
  * Creates a new execution context.
376
377
  */
377
- constructor(command: CommandMetadata, commandPath: string, options: any);
378
+ constructor(command: CommandMetadata, commandPath: string, options: any, positionals?: string[]);
378
379
  /**
379
380
  * Gets the command metadata.
380
381
  *
@@ -395,6 +396,15 @@ declare class CommanderExecutionContext {
395
396
  * @returns The validated options object
396
397
  */
397
398
  getOptions(): any;
399
+ /**
400
+ * Gets the positional arguments.
401
+ *
402
+ * Positional arguments are values that don't match any option flags.
403
+ * For example, in `copy --force source.txt dest.txt`, the positionals are `['source.txt', 'dest.txt']`.
404
+ *
405
+ * @returns The positional arguments array
406
+ */
407
+ getPositionals(): string[];
398
408
  }
399
409
  //#endregion
400
410
  //#region src/services/cli-parser.service.d.mts
@@ -635,7 +645,7 @@ declare class CommanderAdapterService implements AbstractCliAdapterInterface {
635
645
  /**
636
646
  * Execute a command programmatically with the provided options.
637
647
  */
638
- executeCommand(path: string, options?: Record<string, unknown>): Promise<void>;
648
+ executeCommand(path: string, options?: Record<string, unknown>, positionals?: string[]): Promise<void>;
639
649
  /**
640
650
  * Get all registered command paths and their class references.
641
651
  */