@alcyone-labs/arg-parser 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +844 -45
  2. package/dist/examples/fuzzy-demo.d.ts +8 -0
  3. package/dist/examples/fuzzy-demo.d.ts.map +1 -0
  4. package/dist/examples/fuzzy-test-example.d.ts +8 -0
  5. package/dist/examples/fuzzy-test-example.d.ts.map +1 -0
  6. package/dist/examples/fzf-search-cli.d.ts +8 -0
  7. package/dist/examples/fzf-search-cli.d.ts.map +1 -0
  8. package/dist/examples/getting-started.d.ts +27 -0
  9. package/dist/examples/getting-started.d.ts.map +1 -0
  10. package/dist/examples/mcp-preset-transports.d.ts +19 -0
  11. package/dist/examples/mcp-preset-transports.d.ts.map +1 -0
  12. package/dist/examples/simple-cli.d.ts +26 -0
  13. package/dist/examples/simple-cli.d.ts.map +1 -0
  14. package/dist/examples/v1.1.0-showcase.d.ts +16 -0
  15. package/dist/examples/v1.1.0-showcase.d.ts.map +1 -0
  16. package/dist/examples/with-env-example.d.ts +3 -0
  17. package/dist/examples/with-env-example.d.ts.map +1 -0
  18. package/dist/index-6G9StDO_.js +6445 -0
  19. package/dist/index-6G9StDO_.js.map +1 -0
  20. package/dist/index-CqU7Fj3C.cjs +6444 -0
  21. package/dist/index-CqU7Fj3C.cjs.map +1 -0
  22. package/dist/index-Dx_q1msW.js +4682 -0
  23. package/dist/index-Dx_q1msW.js.map +1 -0
  24. package/dist/index.cjs +1704 -60
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.min.mjs +1628 -484
  27. package/dist/index.min.mjs.map +1 -1
  28. package/dist/index.mjs +1660 -59
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/src/ArgParser.d.ts +156 -0
  31. package/dist/src/ArgParser.d.ts.map +1 -0
  32. package/dist/{ArgParser.d.ts → src/ArgParserBase.d.ts} +20 -13
  33. package/dist/src/ArgParserBase.d.ts.map +1 -0
  34. package/dist/{FlagManager.d.ts → src/FlagManager.d.ts} +1 -1
  35. package/dist/src/FlagManager.d.ts.map +1 -0
  36. package/dist/src/fuzzy-test-cli.d.ts +5 -0
  37. package/dist/src/fuzzy-test-cli.d.ts.map +1 -0
  38. package/dist/src/fuzzy-tester.d.ts +101 -0
  39. package/dist/src/fuzzy-tester.d.ts.map +1 -0
  40. package/dist/src/index.d.ts +7 -0
  41. package/dist/src/index.d.ts.map +1 -0
  42. package/dist/src/mcp-integration.d.ts +31 -0
  43. package/dist/src/mcp-integration.d.ts.map +1 -0
  44. package/dist/src/types.d.ts +154 -0
  45. package/dist/src/types.d.ts.map +1 -0
  46. package/dist/sse-B5Jf_YpG.cjs +121 -0
  47. package/dist/sse-B5Jf_YpG.cjs.map +1 -0
  48. package/dist/sse-BDL3h2Ll.js +121 -0
  49. package/dist/sse-BDL3h2Ll.js.map +1 -0
  50. package/dist/sse-DSjLfGFo.js +107 -0
  51. package/dist/sse-DSjLfGFo.js.map +1 -0
  52. package/dist/stdio-Cf19UQO7.js +70 -0
  53. package/dist/stdio-Cf19UQO7.js.map +1 -0
  54. package/dist/stdio-DESvSONI.cjs +94 -0
  55. package/dist/stdio-DESvSONI.cjs.map +1 -0
  56. package/dist/stdio-DLOResWr.js +94 -0
  57. package/dist/stdio-DLOResWr.js.map +1 -0
  58. package/dist/streamableHttp-DXIdDSbF.js +342 -0
  59. package/dist/streamableHttp-DXIdDSbF.js.map +1 -0
  60. package/dist/streamableHttp-DsXlAnqJ.cjs +456 -0
  61. package/dist/streamableHttp-DsXlAnqJ.cjs.map +1 -0
  62. package/dist/streamableHttp-Vd4Qsgko.js +456 -0
  63. package/dist/streamableHttp-Vd4Qsgko.js.map +1 -0
  64. package/dist/types-DSxPEImy.cjs +943 -0
  65. package/dist/types-DSxPEImy.cjs.map +1 -0
  66. package/dist/types-DdsPVLQ5.js +846 -0
  67. package/dist/types-DdsPVLQ5.js.map +1 -0
  68. package/dist/types-DpK81FWv.js +944 -0
  69. package/dist/types-DpK81FWv.js.map +1 -0
  70. package/package.json +18 -7
  71. package/dist/ArgParser.d.ts.map +0 -1
  72. package/dist/FlagManager.d.ts.map +0 -1
  73. package/dist/index.d.ts +0 -2
  74. package/dist/index.d.ts.map +0 -1
  75. package/dist/types.d.ts +0 -91
  76. package/dist/types.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../__vite-browser-external","../src/types.ts","../src/FlagManager.ts","../src/ArgParser.ts"],"sourcesContent":["export default {}","import { z } from \"zod\";\n\n// Forward declaration for ArgParser to avoid circular dependency in HandlerContext\n// This will be replaced or refined once ArgParser.ts is updated to use these types.\ntype ArgParserInstance = any;\n\nexport const zodFlagSchema = z\n .object({\n name: z\n .string()\n .min(1, \"Flag name cannot be empty\")\n .describe(\n \"The output property name, used as a return key `{name: value}`. Must be unique.\",\n ),\n allowLigature: z\n .boolean()\n .default(true)\n .describe(\n \"Enable both forms of flag input, e.g., `./script.js -f=value` and `-f value`.\",\n ),\n allowMultiple: z\n .boolean()\n .default(false)\n .describe(\n \"Allow passing the same flag multiple times, e.g., `-f val1 -f val2` results in an array.\",\n ),\n description: z\n .union([z.string(), z.array(z.string())])\n .describe(\"Textual description for help messages.\"),\n options: z\n .array(z.string().min(1))\n .min(1, \"Flag must have at least one option (e.g., ['-f', '--flag'])\")\n .describe(\"Array of option strings, e.g., ['-f', '--flag'].\"),\n defaultValue: z\n .any()\n .optional()\n .describe(\"Default value if the flag is not provided.\"),\n type: z\n .union([\n z.any().refine((val) => val === String, {\n message: \"Must be String constructor\",\n }),\n z.any().refine((val) => val === Number, {\n message: \"Must be Number constructor\",\n }),\n z.any().refine((val) => val === Boolean, {\n message: \"Must be Boolean constructor\",\n }),\n z.any().refine((val) => val === Array, {\n message: \"Must be Array constructor\",\n }),\n z.any().refine((val) => val === Object, {\n message: \"Must be Object constructor\",\n }),\n z.function().args(z.string()).returns(z.any()), // Custom parser function\n z\n .string()\n .refine(\n (value) =>\n [\"boolean\", \"string\", \"number\", \"array\", \"object\"].includes(\n value.toLowerCase(),\n ),\n {\n message:\n \"Invalid type string. Must be one of 'boolean', 'string', 'number', 'array', 'object'.\",\n },\n ),\n ])\n .default(\"string\")\n .describe(\n \"Expected data type or a custom parser function. Defaults to 'string'.\",\n ),\n mandatory: z\n .union([z.boolean(), z.function().args(z.any()).returns(z.boolean())]) // `z.any()` for parsedArgs flexibility\n .optional()\n .describe(\n \"Makes the flag mandatory, can be a boolean or a function conditional on other args.\",\n ),\n flagOnly: z\n .boolean()\n .default(false)\n .describe(\n \"If true, the flag's presence is noted (true/false), and any subsequent value is not consumed by this flag.\",\n ),\n validate: z // User-provided validation function\n .function()\n .args(z.any().optional(), z.any().optional()) // value, parsedArgs?\n .returns(\n z.union([\n z.boolean(),\n z.string(),\n z.void(),\n z.promise(z.union([z.boolean(), z.string(), z.void()])),\n ]),\n )\n .optional()\n .describe(\n \"Custom validation function for the flag's value (receives value, parsedArgs).\",\n ),\n enum: z // User-provided enum values\n .array(z.any())\n .optional()\n .describe(\"Array of allowed values for the flag.\"),\n })\n .passthrough() // Allow unrecognized properties, they won't be validated or processed beyond alias handling.\n .transform((obj) => {\n const newObj: { [key: string]: any } = { ...obj };\n\n if (\n \"default\" in newObj &&\n newObj[\"default\"] !== undefined &&\n !(\"defaultValue\" in newObj)\n ) {\n newObj[\"defaultValue\"] = newObj[\"default\"];\n }\n\n if (\n \"required\" in newObj &&\n newObj[\"required\"] !== undefined &&\n !(\"mandatory\" in newObj)\n ) {\n newObj[\"mandatory\"] = newObj[\"required\"] as\n | boolean\n | ((parsedArgs: any) => boolean);\n }\n\n return newObj;\n });\n\nexport type IFlagCore = z.input<typeof zodFlagSchema>;\n\nexport type IFlag = IFlagCore & {\n /** @alias defaultValue */\n default?: any;\n /** @alias mandatory */\n required?: boolean | ((parsedArgs: TParsedArgs<any>) => boolean); // `any` for now for TParsedArgs generic\n // This handler seems to be for sub-commands, not specific to flag definition itself\n // It was part of the original IFlag in ArgParser.ts.\n // Consider moving to ISubCommand interface if it's only used there.\n handler?: (ctx: HandlerContext) => void | Promise<void>;\n};\n\nexport type ProcessedFlagCore = z.output<typeof zodFlagSchema>;\n\nexport type ProcessedFlag = Omit<\n ProcessedFlagCore,\n \"type\" | \"validate\" | \"enum\" | \"mandatory\"\n> & {\n type:\n | StringConstructor\n | NumberConstructor\n | BooleanConstructor\n | ArrayConstructor\n | ObjectConstructor\n | ((value: string) => any);\n validate?: (\n value: any,\n parsedArgs?: TParsedArgs<ProcessedFlag[]>,\n ) => boolean | string | void | Promise<boolean | string | void>;\n enum?: any[];\n mandatory?: boolean | ((parsedArgs: TParsedArgs<ProcessedFlag[]>) => boolean);\n};\n\nexport type ResolveType<T> = T extends (...args: any[]) => infer R\n ? R // Function\n : T extends new (...args: any[]) => infer S\n ? S // Constructor\n : T extends \"string\"\n ? string\n : T extends \"number\"\n ? number\n : T extends \"boolean\"\n ? boolean\n : T extends \"array\"\n ? any[]\n : T extends \"object\"\n ? Record<string, any>\n : any; // Fallback\n\nexport type ExtractFlagType<Flag extends ProcessedFlag> =\n Flag[\"flagOnly\"] extends true\n ? Flag[\"allowMultiple\"] extends true\n ? boolean[] // Array of booleans if flagOnly and allowMultiple\n : boolean // Single boolean if flagOnly\n : Flag[\"allowMultiple\"] extends true\n ? Array<ResolveType<Flag[\"type\"]>> // Array of resolved type\n : ResolveType<Flag[\"type\"]>; // Single resolved type\n\nexport type TParsedArgs<Flags extends readonly (IFlag | ProcessedFlag)[]> = {\n // Made generic to support both IFlag and ProcessedFlag arrays\n [K in Flags[number][\"name\"]]: Flags[number] extends ProcessedFlag // Type assertion to help compiler\n ? ExtractFlagType<Extract<Flags[number], { name: K } & ProcessedFlag>>\n : any; // Fallback for IFlag, though ideally, TParsedArgs uses ProcessedFlag\n};\n\nexport type HandlerContext = {\n args: TParsedArgs<ProcessedFlag[]>;\n parentArgs?: TParsedArgs<ProcessedFlag[]>;\n commandChain: string[];\n parser: ArgParserInstance; // Using the forward declared 'any' type\n};\n\n// Forward-declare ArgParser for ISubCommand to use\n// We use 'any' here as ArgParser itself imports types from this file,\n// creating a potential circular dependency for type-checking at this specific point.\n// The actual ArgParser<SubCmdFlags> type will be used in ArgParser.ts.\ntype ArgParserForSubcommand = any;\n\nexport interface ISubCommand {\n name: string;\n description?: string;\n parser: ArgParserForSubcommand;\n handler?: (ctx: HandlerContext) => void | Promise<void>;\n}\n\n// Generic type for the collection of flags an ArgParser instance will manage.\n// Using ProcessedFlag as these are the flags after initial validation and transformation.\nexport type FlagsArray = readonly ProcessedFlag[];\n","import { IFlag, ProcessedFlag, zodFlagSchema } from \"./types\";\n\nexport class FlagManager {\n #_flags: Map<string, ProcessedFlag> = new Map();\n #throwForDuplicateFlags: boolean;\n\n constructor(\n options: { throwForDuplicateFlags?: boolean } = {},\n initialFlags: readonly IFlag[] = [],\n ) {\n this.#throwForDuplicateFlags = options.throwForDuplicateFlags ?? false;\n this.addFlags(initialFlags);\n }\n\n static _safeFlag(flag: IFlag): ProcessedFlag {\n const parsedFromZod = zodFlagSchema.parse(flag);\n\n let resolvedType: ProcessedFlag[\"type\"];\n const inputTypeFromZod = parsedFromZod[\"type\"];\n\n if (typeof inputTypeFromZod === \"string\") {\n switch (inputTypeFromZod.toLowerCase()) {\n case \"boolean\":\n resolvedType = Boolean;\n break;\n case \"string\":\n resolvedType = String;\n break;\n case \"number\":\n resolvedType = Number;\n break;\n case \"array\":\n resolvedType = Array;\n break;\n case \"object\":\n resolvedType = Object;\n break;\n default:\n throw new Error(`Invalid type string: ${inputTypeFromZod}`);\n }\n } else {\n resolvedType = inputTypeFromZod as ProcessedFlag[\"type\"];\n }\n\n return {\n ...parsedFromZod,\n options: parsedFromZod[\"options\"],\n type: resolvedType,\n validate: parsedFromZod[\"validate\"],\n enum: parsedFromZod[\"enum\"],\n mandatory: parsedFromZod[\"mandatory\"],\n };\n }\n\n addFlag(flag: IFlag): this {\n const safeFlag = FlagManager._safeFlag(flag);\n\n if (this.#_flags.has(safeFlag[\"name\"])) {\n if (this.#throwForDuplicateFlags) {\n throw new Error(\n `FlagManager: Flag '${safeFlag[\"name\"]}' already exists.`,\n );\n } else {\n console.warn(\n `Warning: FlagManager: Flag '${safeFlag[\"name\"]}' already exists. Duplicate not added.`,\n );\n return this;\n }\n }\n\n this.#_flags.set(safeFlag[\"name\"], safeFlag);\n return this;\n }\n\n _setProcessedFlagForInheritance(processedFlag: ProcessedFlag): this {\n if (this.#_flags.has(processedFlag[\"name\"])) {\n return this;\n }\n this.#_flags.set(processedFlag[\"name\"], processedFlag);\n return this;\n }\n\n addFlags(flags: readonly IFlag[]): this {\n for (const flag of flags) {\n this.addFlag(flag);\n }\n return this;\n }\n\n hasFlag(name: string): boolean {\n return this.#_flags.has(name);\n }\n\n getFlag(name: string): ProcessedFlag | undefined {\n return this.#_flags.get(name);\n }\n\n get flags(): ProcessedFlag[] {\n return Array.from(this.#_flags.values());\n }\n\n get flagNames(): string[] {\n return Array.from(this.#_flags.values()).map((flag) => flag[\"name\"]);\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { anyOf, char, createRegExp, oneOrMore } from \"magic-regexp\";\nimport { FlagManager } from \"./FlagManager\";\nimport {\n HandlerContext,\n IFlag,\n ISubCommand,\n ProcessedFlag,\n TParsedArgs,\n} from \"./types\";\n\nexport class ArgParserError extends Error {\n public commandChain: string[];\n constructor(\n message: string,\n public cmdChain: string[] = [],\n ) {\n super(message);\n this.name = \"ArgParserError\";\n this.commandChain = cmdChain;\n }\n}\n\n// zodFlagSchema, IFlag (zod-derived), ResolveType, ExtractFlagType, TParsedArgs (original)\n// have been moved to types.ts or are superseded by types from types.ts\n\ninterface IArgParserParams {\n /**\n * Add an extra new line between each flag group,\n * makes the text more readable but uses more space\n *\n * Default: true\n */\n extraNewLine?: boolean;\n /**\n * Wraps the line at width, if shorter, wrapping will be more\n * aggressive. Wrapping is based on words.\n *\n * Default: 50\n * Minimum: 30\n */\n wrapAtWidth?: number;\n /**\n * Controls the placing of right text on the screen.\n * The higher the value, the more to the right the text will be.\n *\n * Default: 30\n * Minimum: 20\n */\n blankSpaceWidth?: number;\n /**\n * Character to display next to the flag to express mandatory fields.\n *\n * Default: *\n */\n mandatoryCharacter?: string;\n /**\n * Throw an error if a flag is added more than once\n * @default false\n */\n throwForDuplicateFlags?: boolean;\n description?: string; // New property for the description\n /**\n * Automatically handle ArgParserErrors by printing a formatted message\n * and exiting. Set to false to catch ArgParserError manually.\n * @default true\n */\n handleErrors?: boolean;\n /**\n * The command name to display in help suggestions (e.g., 'dabl').\n * If not provided, it falls back to appName or guessing from the script path.\n * @since 1.5.1\n */\n appCommandName?: string;\n /**\n * If true, when this parser is added as a sub-command, it will inherit\n * flags from its direct parent *unless* a flag with the same name\n * already exists in this parser. Child flags take precedence.\n * @default false\n */\n inheritParentFlags?: boolean;\n}\n\ninterface IParseOptions {\n /**\n * When true, skips help flag processing (doesn't exit or show help)\n * @default false\n */\n skipHelpHandling?: boolean;\n /**\n * When true, skips the execution of any command handlers.\n * @default false\n */\n skipHandlers?: boolean;\n}\n\ntype TParsedArgsWithRouting<T = any> = T & {\n $commandChain?: string[];\n handlerToExecute?: { handler: Function; context: HandlerContext };\n};\n\ntype RecursiveParseResult = {\n finalArgs: TParsedArgsWithRouting<any>;\n handlerToExecute?: { handler: Function; context: HandlerContext };\n};\n\nexport class ArgParser {\n #appName: string = \"Argument Parser\";\n #appCommandName?: string;\n #subCommandName: string = \"\";\n #parameters: IArgParserParams = {\n extraNewLine: true,\n wrapAtWidth: 50,\n blankSpaceWidth: 30,\n mandatoryCharacter: \"*\",\n };\n #handler?: (ctx: HandlerContext) => void;\n #throwForDuplicateFlags: boolean = false;\n #description?: string;\n #handleErrors: boolean = true;\n #parentParser?: ArgParser;\n #lastParseResult: TParsedArgs<ProcessedFlag[]> = {};\n #inheritParentFlags: boolean = false;\n #subCommands: Map<string, ISubCommand> = new Map();\n #flagManager: FlagManager;\n\n constructor(\n options: IArgParserParams & {\n appName?: string;\n subCommands?: ISubCommand[];\n handler?: (ctx: HandlerContext) => void;\n } = {},\n initialFlags?: readonly IFlag[],\n ) {\n this.#appName = options.appName || \"app\";\n if (\n options.blankSpaceWidth &&\n !isNaN(Number(options.blankSpaceWidth)) &&\n Number(options.blankSpaceWidth) > 20\n )\n this.#parameters.blankSpaceWidth = Number(options.blankSpaceWidth);\n\n if (\n options.wrapAtWidth &&\n !isNaN(Number(options.wrapAtWidth)) &&\n Number(options.wrapAtWidth) > 30\n )\n this.#parameters.wrapAtWidth = Number(options.wrapAtWidth);\n\n if (typeof options.extraNewLine === \"boolean\")\n this.#parameters.extraNewLine = Boolean(options.extraNewLine);\n\n if (typeof options.mandatoryCharacter === \"string\")\n this.#parameters.mandatoryCharacter = options.mandatoryCharacter;\n\n if (typeof options.throwForDuplicateFlags === \"boolean\")\n this.#throwForDuplicateFlags = options.throwForDuplicateFlags;\n\n this.#flagManager = new FlagManager(\n {\n throwForDuplicateFlags: this.#throwForDuplicateFlags,\n },\n initialFlags || [],\n );\n\n this.#handleErrors = options.handleErrors ?? true;\n this.#inheritParentFlags = options.inheritParentFlags ?? false;\n this.#description = options.description;\n this.#handler = options.handler;\n this.#appCommandName = options.appCommandName;\n\n const helpFlag: IFlag = {\n name: \"help\",\n description: \"Display this help message and exits\",\n mandatory: false,\n type: Boolean,\n options: [\"-h\", \"--help\"],\n defaultValue: undefined,\n allowLigature: false,\n allowMultiple: false,\n flagOnly: true,\n enum: [],\n validate: (_value?: any, _parsedArgs?: any) => true, // Ensure signature matches Zod schema for .args()\n };\n this.#flagManager.addFlag(helpFlag); // Add the help flag via FlagManager\n\n if (options.subCommands) {\n for (const sub of options.subCommands) {\n this.addSubCommand(sub);\n }\n }\n }\n\n get flags(): ProcessedFlag[] {\n return this.#flagManager.flags;\n }\n\n get flagNames(): string[] {\n return this.#flagManager.flagNames; // Delegates to FlagManager\n }\n\n private _addToOutput(\n flag: ProcessedFlag, // Changed from Flags[number]\n arg: any,\n output: TParsedArgs<ProcessedFlag[]>,\n _parseOptions?: IParseOptions,\n ) {\n let value: unknown = arg;\n\n if (flag.type === Boolean) {\n if (typeof arg === \"boolean\") {\n value = arg;\n } else if (typeof arg === \"string\") {\n value = /(true|yes|1)/i.test(arg);\n } else {\n value = new (flag[\"type\"] as ObjectConstructor)(value);\n }\n } else if (typeof flag[\"type\"] === \"function\") {\n value = (flag[\"type\"] as Function)(value as string);\n } else if (typeof flag[\"type\"] === \"object\") {\n value = new (flag[\"type\"] as ObjectConstructor)(value);\n }\n\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) {\n const allowedValues = flag[\"enum\"]\n .map((v: any) => (typeof v === \"string\" ? `'${v}'` : v))\n .join(\", \");\n\n if (!flag[\"enum\"].includes(value)) {\n throw new ArgParserError(\n `Invalid value '${value}' for flag '${chalk.yellow(flag[\"name\"])}'. ` +\n `Allowed values: ${allowedValues}`,\n this.getCommandChain(),\n );\n }\n }\n\n if (flag[\"validate\"]) {\n const validationResult = flag[\"validate\"](value, output);\n if (validationResult === false) {\n throw new ArgParserError(\n `Validation failed for flag '${chalk.yellow(flag[\"name\"])}' with value '${value}'`,\n this.getCommandChain(),\n );\n } else if (typeof validationResult === \"string\") {\n throw new ArgParserError(validationResult, this.getCommandChain());\n }\n }\n\n if (flag[\"allowMultiple\"] && !Array.isArray(output[flag[\"name\"]])) {\n output[flag[\"name\"]] = [] as any;\n }\n\n return flag[\"allowMultiple\"]\n ? (output[flag[\"name\"]] as any[]).push(value)\n : (output[flag[\"name\"]] = value as any);\n }\n\n addFlags(flags: readonly IFlag[]): this {\n this.#flagManager.addFlags(flags);\n return this;\n }\n\n addFlag(flag: IFlag): this {\n this.#flagManager.addFlag(flag);\n return this;\n }\n\n addSubCommand(subCommandConfig: ISubCommand): this {\n if (this.#subCommands.has(subCommandConfig.name)) {\n throw new Error(`Sub-command '${subCommandConfig.name}' already exists`);\n }\n\n const subParser = subCommandConfig.parser;\n\n if (!(subParser instanceof ArgParser)) {\n throw new Error(\n `Parser for subcommand '${subCommandConfig.name}' is not an instance of ArgParser. ` +\n `Please provide 'new ArgParser(...)' for the 'parser' property of an ISubCommand.`,\n );\n }\n\n subParser.#parentParser = this;\n subParser.#subCommandName = subCommandConfig.name;\n if (!subParser.#appCommandName && this.#appCommandName) {\n subParser.#appCommandName = this.#appCommandName;\n }\n\n if (subParser.#inheritParentFlags) {\n const parentFlags = this.#flagManager.flags;\n for (const parentFlag of parentFlags) {\n if (!subParser.#flagManager.hasFlag(parentFlag[\"name\"])) {\n subParser.#flagManager._setProcessedFlagForInheritance(parentFlag);\n }\n }\n }\n\n this.#subCommands.set(subCommandConfig.name, subCommandConfig);\n\n if (subCommandConfig.handler) {\n subParser.setHandler(subCommandConfig.handler);\n }\n\n return this;\n }\n\n /**\n * Sets the handler function for this specific parser instance.\n * This handler will be executed if this parser is the final one\n * in the command chain and `executeHandlers` is enabled on the root parser.\n *\n * @param handler - The function to execute.\n * @returns The ArgParser instance for chaining.\n */\n setHandler(handler: (ctx: HandlerContext) => void): this {\n this.#handler = handler;\n return this;\n }\n\n printAll(filePath?: string): void {\n if (filePath) {\n try {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n if (filePath.toLowerCase().endsWith(\".json\")) {\n const outputObject = this.#_buildRecursiveJson(this);\n const jsonString = JSON.stringify(outputObject, null, 2);\n fs.writeFileSync(filePath, jsonString);\n console.log(`ArgParser configuration JSON dumped to: ${filePath}`);\n } else {\n const outputString = this.#_buildRecursiveString(this, 0);\n const plainText = outputString.replace(\n /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,\n \"\",\n );\n fs.writeFileSync(filePath, plainText);\n console.log(`ArgParser configuration text dumped to: ${filePath}`);\n }\n } catch (error) {\n console.error(\n `Error writing ArgParser configuration to file '${filePath}':`,\n error,\n );\n }\n } else {\n console.log(\"\\n--- ArgParser Configuration Dump ---\");\n this.#_printRecursiveToConsole(this, 0);\n console.log(\"--- End Configuration Dump ---\\\\n\");\n }\n }\n\n #_identifyCommandChainAndParsers(\n argsToParse: string[],\n currentParser: ArgParser,\n commandChainSoFar: string[],\n parserChainSoFar: ArgParser[],\n ): {\n finalParser: ArgParser;\n commandChain: string[];\n parserChain: ArgParser[];\n remainingArgs: string[];\n } {\n let subCommandIndex = -1;\n let subCommandName: string | null = null;\n\n for (let i = 0; i < argsToParse.length; i++) {\n const potentialSubCommand = argsToParse[i];\n if (currentParser.#subCommands.has(potentialSubCommand)) {\n subCommandIndex = i;\n subCommandName = potentialSubCommand;\n break;\n }\n }\n\n if (subCommandIndex === -1 || subCommandName === null) {\n return {\n finalParser: currentParser,\n commandChain: commandChainSoFar,\n parserChain: parserChainSoFar,\n remainingArgs: argsToParse,\n };\n }\n\n const subCommandConfig = currentParser.#subCommands.get(subCommandName);\n if (!subCommandConfig || !(subCommandConfig.parser instanceof ArgParser)) {\n throw new Error(\n `Internal error: Subcommand '${subCommandName!}' configuration is invalid or parser is missing.`,\n );\n }\n const nextParser = subCommandConfig.parser;\n const nextArgs = argsToParse.slice(subCommandIndex + 1);\n const nextCommandChain = [...commandChainSoFar, subCommandName];\n const nextParserChain = [...parserChainSoFar, nextParser];\n\n return this.#_identifyCommandChainAndParsers(\n nextArgs,\n nextParser,\n nextCommandChain,\n nextParserChain,\n );\n }\n\n #_handleGlobalChecks(\n processArgs: string[],\n options?: IParseOptions,\n ): boolean {\n if (processArgs.length === 0 && !this.#parentParser && !this.#handler) {\n console.log(this.helpText());\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(0 as never);\n }\n return true;\n }\n\n if (processArgs.includes(\"--LIB-debug-print\")) {\n this.printAll(\"ArgParser.full.json\");\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(0);\n }\n return true;\n }\n\n const { finalParser: identifiedFinalParser } =\n this.#_identifyCommandChainAndParsers(processArgs, this, [], [this]);\n\n if (processArgs.includes(\"--LIB-debug\")) {\n console.log(\n chalk.yellow.bold(\"\\n--- ArgParser --LIB-debug Runtime Context ---\"),\n );\n\n const {\n commandChain: identifiedCommandChain,\n parserChain: _identifiedParserChain,\n } = this.#_identifyCommandChainAndParsers(processArgs, this, [], [this]);\n\n console.log(\n `Identified Command Chain: ${chalk.cyan(identifiedCommandChain.join(\" -> \") || \"(root)\")}`,\n );\n console.log(\n `Identified Final Parser: ${chalk.cyan(identifiedFinalParser.#subCommandName || identifiedFinalParser.#appName)}`,\n );\n\n let currentParser: ArgParser = this;\n let remainingArgs = [...processArgs];\n let accumulatedArgs: TParsedArgs<any> = {};\n const parsingSteps: {\n level: string;\n argsSlice: string[];\n parsed?: TParsedArgs<any>;\n error?: string;\n }[] = [];\n\n const rootSubCommandIndex = remainingArgs.findIndex((arg) =>\n currentParser.#subCommands.has(arg),\n );\n const rootArgsSlice =\n rootSubCommandIndex === -1\n ? remainingArgs\n : remainingArgs.slice(0, rootSubCommandIndex);\n parsingSteps.push({ level: \"(root)\", argsSlice: rootArgsSlice });\n try {\n const { parsedArgs: rootParsedArgs } = currentParser.#parseFlags(\n rootArgsSlice,\n { skipHelpHandling: true },\n );\n parsingSteps[0].parsed = rootParsedArgs;\n accumulatedArgs = { ...accumulatedArgs, ...rootParsedArgs };\n } catch (e: any) {\n parsingSteps[0].error = e.message;\n }\n remainingArgs =\n rootSubCommandIndex === -1\n ? []\n : remainingArgs.slice(rootSubCommandIndex);\n\n for (let i = 0; i < identifiedCommandChain.length; i++) {\n const subCommandName = identifiedCommandChain[i];\n if (!currentParser.#subCommands.has(subCommandName)) {\n parsingSteps.push({\n level: `Error`,\n argsSlice: [],\n error: `Could not find sub-command parser for '${subCommandName}'`,\n });\n break;\n }\n currentParser = currentParser.#subCommands.get(subCommandName)?.parser;\n remainingArgs = remainingArgs.slice(1);\n\n const nextSubCommandIndex = remainingArgs.findIndex((arg) =>\n currentParser.#subCommands.has(arg),\n );\n const currentLevelArgsSlice =\n nextSubCommandIndex === -1\n ? remainingArgs\n : remainingArgs.slice(0, nextSubCommandIndex);\n const stepInfo: {\n level: string;\n argsSlice: string[];\n parsed?: TParsedArgs<any>;\n error?: string;\n } = {\n level: subCommandName,\n argsSlice: currentLevelArgsSlice,\n };\n parsingSteps.push(stepInfo);\n\n try {\n const { parsedArgs: currentLevelParsedArgs } =\n currentParser.#parseFlags(currentLevelArgsSlice, {\n skipHelpHandling: true,\n });\n stepInfo.parsed = currentLevelParsedArgs;\n accumulatedArgs = { ...accumulatedArgs, ...currentLevelParsedArgs };\n } catch (e: any) {\n stepInfo.error = e.message;\n }\n remainingArgs =\n nextSubCommandIndex === -1\n ? []\n : remainingArgs.slice(nextSubCommandIndex);\n }\n\n console.log(chalk.yellow(\"\\nParsing Simulation Steps:\"));\n parsingSteps.forEach((step) => {\n console.log(` Level: ${chalk.cyan(step.level)}`);\n console.log(\n ` Args Slice Considered: ${JSON.stringify(step.argsSlice)}`,\n );\n if (step.parsed) {\n console.log(\n ` Parsed Args at this Level: ${JSON.stringify(step.parsed)}`,\n );\n }\n if (step.error) {\n console.log(\n ` ${chalk.red(\"Error during parse simulation:\")} ${step.error}`,\n );\n }\n });\n\n console.log(\n chalk.yellow(\n \"\\nFinal Accumulated Args State (before final validation):\",\n ),\n );\n console.log(JSON.stringify(accumulatedArgs, null, 2));\n\n console.log(chalk.yellow(\"\\nArguments Remaining After Simulation:\"));\n console.log(JSON.stringify(remainingArgs, null, 2));\n\n console.log(\n chalk.yellow.bold(\n \"\\n--- ArgParser Static Configuration (Final Parser) ---\",\n ),\n );\n identifiedFinalParser.printAll();\n\n console.log(chalk.yellow.bold(\"--- End ArgParser --LIB-debug ---\"));\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(0);\n }\n return true;\n }\n\n // ---- BEGIN ADDED DIAGNOSTIC LOG FOR identifiedFinalParser ----\n let parserNameForLog = \"undefined_parser\";\n if (identifiedFinalParser instanceof ArgParser) {\n // Access private fields only if it's a confirmed ArgParser instance\n parserNameForLog =\n (identifiedFinalParser as any)[\"#subCommandName\"] ||\n (identifiedFinalParser as any)[\"#appName\"];\n } else if (identifiedFinalParser) {\n parserNameForLog =\n (identifiedFinalParser as any).name ||\n (identifiedFinalParser as any).appName ||\n \"unknown_type\";\n }\n // console.log(\n // `[ArgParser #_handleGlobalChecks Debug] identifiedFinalParser: constructor=${identifiedFinalParser ? 'defined' : 'undefined'}, isArgParser=${identifiedFinalParser instanceof ArgParser}, name=${parserNameForLog}`\n // );\n // ---- END ADDED DIAGNOSTIC LOG FOR identifiedFinalParser ----\n\n // ---- BEGIN GUARD FOR identifiedFinalParser ----\n if (!(identifiedFinalParser instanceof ArgParser)) {\n console.error(\n `[ArgParser #_handleGlobalChecks Critical Error] identifiedFinalParser is not an instance of ArgParser. Cannot process help. Name: ${parserNameForLog}, Constructor: ${identifiedFinalParser ? (identifiedFinalParser as any).constructor?.name : \"undefined\"}`,\n );\n // Returning false to prevent further processing with an invalid parser,\n // which could lead to more cryptic errors or incorrect behavior.\n return false;\n }\n // ---- END GUARD FOR identifiedFinalParser ----\n\n const helpFlagDefinition =\n identifiedFinalParser.#flagManager.getFlag(\"help\");\n if (helpFlagDefinition && !options?.skipHelpHandling) {\n const helpOptions = helpFlagDefinition[\"options\"];\n\n // ---- BEGIN ADDED DEBUG AND DEFENSIVE CHECK ----\n // if (!Array.isArray(helpOptions) || helpOptions.length === 0) {\n // console.warn(\n // `[ArgParser Debug] helpOptions is not a valid array or is empty. Value: ${JSON.stringify(helpOptions)}, Type: ${typeof helpOptions}`,\n // `Parser: ${parserNameForLog}`, // Use the determined parserNameForLog\n // );\n // // Potentially, we might even want to return false here or throw,\n // // as help cannot be processed correctly. For now, just log and continue.\n // } else {\n // // Optional: Log the valid helpOptions for debugging successful cases\n // // console.log(`[ArgParser Debug] Valid helpOptions: ${JSON.stringify(helpOptions)} for parser ${parserNameForLog}`);\n // }\n // ---- END ADDED DEBUG AND DEFENSIVE CHECK ----\n\n const helpRequested = processArgs.some((arg) =>\n helpOptions.includes(arg),\n );\n\n if (helpRequested) {\n console.log(identifiedFinalParser.helpText());\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(0 as never);\n }\n return true;\n }\n }\n\n return false;\n }\n\n #_validateMandatoryFlags(\n finalArgs: TParsedArgsWithRouting<any>,\n parserChain: ArgParser[],\n commandChain: string[],\n ): void {\n const finalMandatoryFlagsMissing: {\n name: string;\n parserName: string;\n commandChain: string[];\n }[] = [];\n const checkedFlagNames = new Set<string>();\n\n for (const parser of parserChain) {\n const currentCommandChain = parser.getCommandChain();\n for (const flag of parser.#flagManager.flags) {\n // Use FlagManager\n if (flag[\"name\"] === \"help\" || checkedFlagNames.has(flag[\"name\"]))\n continue;\n\n const isMandatory =\n typeof flag[\"mandatory\"] === \"function\"\n ? flag[\"mandatory\"](finalArgs)\n : flag[\"mandatory\"];\n\n if (!isMandatory) continue;\n\n const value = finalArgs[flag[\"name\"] as keyof typeof finalArgs];\n let currentFlagIsMissing = false;\n\n if (flag[\"allowMultiple\"]) {\n // For allowMultiple, it's missing if undefined OR an empty array\n if (\n value === undefined ||\n (Array.isArray(value) && value.length === 0)\n ) {\n currentFlagIsMissing = true;\n }\n } else {\n // For non-allowMultiple, it's missing if undefined\n if (value === undefined) {\n currentFlagIsMissing = true;\n }\n }\n\n if (currentFlagIsMissing) {\n if (!checkedFlagNames.has(flag[\"name\"])) {\n finalMandatoryFlagsMissing.push({\n name: flag[\"name\"],\n parserName: parser.#subCommandName || parser.#appName,\n commandChain: currentCommandChain,\n });\n checkedFlagNames.add(flag[\"name\"]);\n }\n }\n }\n }\n\n if (finalMandatoryFlagsMissing.length > 0) {\n throw new ArgParserError(\n `Missing mandatory flags: ${finalMandatoryFlagsMissing\n .map((flag) => chalk.yellow(flag[\"name\"]))\n .join(\", \")}`,\n commandChain,\n );\n }\n }\n\n #_applyDefaultValues(\n finalArgs: TParsedArgsWithRouting<any>,\n finalParser: ArgParser,\n ): void {\n for (const flag of finalParser.#flagManager.flags) {\n // Use FlagManager\n const flagName = flag[\"name\"] as string;\n if (\n finalArgs[flagName] === undefined &&\n flag[\"defaultValue\"] !== undefined\n ) {\n if (flag[\"allowMultiple\"]) {\n finalArgs[flagName] = Array.isArray(flag[\"defaultValue\"])\n ? flag[\"defaultValue\"]\n : [flag[\"defaultValue\"]];\n } else {\n finalArgs[flagName] = flag[\"defaultValue\"];\n }\n }\n }\n }\n\n #_prepareAndExecuteHandler(\n handlerToExecute: RecursiveParseResult[\"handlerToExecute\"],\n finalArgs: TParsedArgsWithRouting<any>,\n skipHandlers: boolean,\n ): void {\n if (skipHandlers || !handlerToExecute) {\n return;\n }\n\n const finalParserWhoseHandlerWillRun = handlerToExecute.context.parser;\n const finalParserFlags = finalParserWhoseHandlerWillRun.#flagManager.flags;\n const handlerArgs = handlerToExecute.context.args;\n\n for (const flag of finalParserFlags) {\n const flagName = flag[\"name\"] as keyof typeof finalArgs;\n if (finalArgs.hasOwnProperty(flagName)) {\n (handlerArgs as any)[flagName] = (finalArgs as any)[flagName];\n } else if (\n flag[\"allowMultiple\"] &&\n !handlerArgs.hasOwnProperty(flagName)\n ) {\n (handlerArgs as any)[flagName] = [];\n }\n }\n handlerToExecute.context.args = handlerArgs;\n\n handlerToExecute.handler(handlerToExecute.context);\n }\n\n parse(\n processArgs: string[],\n options?: IParseOptions,\n ): TParsedArgsWithRouting<any> {\n if (this.#_handleGlobalChecks(processArgs, options)) {\n return {} as TParsedArgsWithRouting<any>;\n }\n\n try {\n const {\n finalParser: identifiedFinalParser,\n commandChain: identifiedCommandChain,\n parserChain: identifiedParserChain,\n } = this.#_identifyCommandChainAndParsers(processArgs, this, [], [this]);\n\n const { finalArgs, handlerToExecute } = this._parseRecursive(\n processArgs,\n this,\n {},\n [],\n options,\n );\n\n // Set command chain in final args\n if (identifiedCommandChain.length > 0) {\n (finalArgs as any).$commandChain = identifiedCommandChain;\n }\n\n this.#_validateMandatoryFlags(\n finalArgs,\n identifiedParserChain,\n identifiedCommandChain,\n );\n\n this.#_applyDefaultValues(finalArgs, identifiedFinalParser);\n\n this.#_prepareAndExecuteHandler(\n handlerToExecute,\n finalArgs,\n options?.skipHandlers ?? false,\n );\n\n return finalArgs;\n } catch (error) {\n if (error instanceof ArgParserError) {\n if (this.#handleErrors) {\n this.#displayErrorAndExit(error);\n return {} as TParsedArgsWithRouting<any>;\n } else {\n throw error;\n }\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Recursive helper for parsing arguments and handling sub-commands.\n * This method assumes the global help check has already been performed in `parse`.\n */\n private _parseRecursive(\n argsToParse: string[],\n currentParser: ArgParser,\n accumulatedParentArgs: TParsedArgs<any>,\n commandChainSoFar: string[],\n options?: IParseOptions,\n ): RecursiveParseResult {\n let subCommandIndex = -1;\n let subCommandName: string | null = null;\n\n // Find the index of the first argument that matches a defined sub-command name\n for (let i = 0; i < argsToParse.length; i++) {\n const potentialSubCommand = argsToParse[i];\n if (currentParser.#subCommands.has(potentialSubCommand)) {\n subCommandIndex = i;\n subCommandName = potentialSubCommand;\n break;\n }\n }\n\n // Determine which arguments belong to the current parser level\n const argsForCurrentLevel =\n subCommandIndex === -1\n ? argsToParse\n : argsToParse.slice(0, subCommandIndex);\n\n // Parse flags for the current level using #parseFlags\n const { parsedArgs: currentLevelArgs, firstUnconsumedIndex } =\n currentParser.#parseFlags(argsForCurrentLevel, options);\n\n // Apply default values for the current parser's flags to its args\n currentParser.#_applyDefaultValues(currentLevelArgs, currentParser);\n\n const combinedArgsFromThisAndParents = {\n ...accumulatedParentArgs,\n ...currentLevelArgs,\n };\n\n if (subCommandIndex === -1 || subCommandName === null) {\n if (firstUnconsumedIndex < argsForCurrentLevel.length) {\n const unknownCommand = argsForCurrentLevel[firstUnconsumedIndex];\n throw new ArgParserError(\n `Unknown command: '${chalk.yellow(unknownCommand)}'`,\n commandChainSoFar,\n );\n }\n\n const finalParseResultArgs = { ...combinedArgsFromThisAndParents };\n if (commandChainSoFar.length > 0) {\n finalParseResultArgs[\"$commandChain\"] = commandChainSoFar;\n }\n\n let handlerToExecute: RecursiveParseResult[\"handlerToExecute\"] =\n undefined;\n if (currentParser.#handler) {\n handlerToExecute = {\n handler: currentParser.#handler,\n context: {\n args: currentLevelArgs,\n parentArgs: accumulatedParentArgs,\n commandChain: commandChainSoFar,\n parser: currentParser,\n },\n };\n }\n return { finalArgs: finalParseResultArgs, handlerToExecute };\n }\n if (firstUnconsumedIndex < argsForCurrentLevel.length) {\n const unknownCommand = argsForCurrentLevel[firstUnconsumedIndex];\n throw new ArgParserError(\n `Unknown command: '${chalk.yellow(unknownCommand)}'`,\n commandChainSoFar,\n );\n }\n\n const subCommandConfig = currentParser.#subCommands.get(subCommandName!);\n if (!subCommandConfig || !(subCommandConfig.parser instanceof ArgParser)) {\n // This should ideally not be reached if addSubCommand validated the parser instance\n throw new ArgParserError(\n `Internal error: Subcommand '${subCommandName!}' is misconfigured or its parser is not a valid ArgParser instance.`,\n commandChainSoFar,\n );\n }\n const nextParser = subCommandConfig.parser;\n const nextArgs = argsToParse.slice(subCommandIndex + 1);\n const nextCommandChain = [...commandChainSoFar, subCommandName];\n const combinedArgsForNextLevel = {\n ...accumulatedParentArgs,\n ...currentLevelArgs,\n };\n\n return this._parseRecursive(\n nextArgs,\n nextParser,\n combinedArgsForNextLevel,\n nextCommandChain,\n options,\n );\n }\n\n #parseFlags(\n args: string[],\n options?: IParseOptions,\n ): {\n parsedArgs: TParsedArgs<ProcessedFlag[]>;\n firstUnconsumedIndex: number;\n } {\n const flags = this.#flagManager.flags;\n\n const output: TParsedArgs<ProcessedFlag[]> = Object.fromEntries(\n flags.map((flag) => [\n flag[\"name\"],\n flag[\"allowMultiple\"] ? [] : undefined,\n ]),\n ) as TParsedArgs<ProcessedFlag[]>;\n\n let consumedIndices = new Set<number>();\n\n for (const flagToCheck of flags) {\n if (flagToCheck[\"allowLigature\"] && !flagToCheck[\"flagOnly\"]) {\n const regex = createRegExp(\n anyOf(\n ...flagToCheck[\"options\"].map((option: string) => `${option}=`),\n ),\n oneOrMore(char).groupedAs(\"arg\"),\n );\n for (let i = 0; i < args.length; i++) {\n if (consumedIndices.has(i)) continue;\n const itemToCheck = args[i];\n const matches = regex.exec(`${itemToCheck}`);\n if (matches?.groups?.[\"arg\"]) {\n this._addToOutput(\n flagToCheck,\n matches?.groups?.[\"arg\"],\n output,\n options,\n );\n consumedIndices.add(i);\n if (!flagToCheck[\"allowMultiple\"]) break;\n }\n }\n }\n }\n\n for (const flagToCheck of flags) {\n for (let index = 0; index < args.length; index++) {\n if (consumedIndices.has(index)) continue;\n\n const value = args[index];\n const nextIndex = index + 1;\n const nextValueExists = nextIndex < args.length;\n const nextValue = nextValueExists ? args[nextIndex] : undefined;\n const nextValueIsFlag =\n typeof nextValue === \"string\" && nextValue.startsWith(\"-\");\n\n if (flagToCheck[\"options\"].includes(value)) {\n // Mark the flag itself as consumed immediately\n consumedIndices.add(index);\n\n if (flagToCheck[\"flagOnly\"]) {\n this._addToOutput(flagToCheck, true, output, options);\n } else if (nextValueExists && !nextValueIsFlag) {\n this._addToOutput(flagToCheck, nextValue, output, options);\n consumedIndices.add(nextIndex);\n } else if (flagToCheck[\"type\"] === Boolean) {\n this._addToOutput(flagToCheck, true, output, options);\n }\n if (!flagToCheck[\"allowMultiple\"]) break;\n }\n }\n }\n\n let firstUnconsumedIndex = args.length;\n for (let i = 0; i < args.length; i++) {\n if (!consumedIndices.has(i)) {\n firstUnconsumedIndex = i;\n break;\n }\n }\n\n return { parsedArgs: output, firstUnconsumedIndex };\n }\n\n helpText(): string {\n const cyan = chalk.cyan;\n const green = chalk.green;\n const white = chalk.white;\n const red = chalk.red;\n const dim = chalk.dim;\n\n let rootAppName = this.#appName;\n let current: ArgParser | undefined = this;\n while (current.#parentParser) {\n current = current.#parentParser;\n }\n if (current) {\n rootAppName = current.#appName;\n }\n\n const helpTitle = this.#subCommandName\n ? `${rootAppName} ${this.#subCommandName}`\n : rootAppName;\n\n let help = `${cyan(`${helpTitle} Help`)} (${this.#parameters.mandatoryCharacter} = Mandatory fields):\\n\\n`;\n\n // ---- BEGIN ADDED DIAGNOSTIC LOG ----\n // console.log(\n // `[ArgParser helpText Debug] 'this' context: constructor.name = ${this?.constructor?.name}, is ArgParser instance = ${this instanceof ArgParser}, subCommandName = ${this.#subCommandName || '(root)'}`,\n // );\n // ---- END ADDED DIAGNOSTIC LOG ----\n\n if (this.#description) {\n help += `${white(this.#description)}\\n\\n`;\n }\n\n const indent = (level: number = 1) => \" \".repeat(level);\n\n if (this.#subCommands.size > 0) {\n // Use Map.size\n help += `${cyan(\"Available sub-commands:\")}\\n`;\n // Iterate over Map entries, then sort\n help += Array.from(this.#subCommands.entries())\n .sort(([nameA], [nameB]) => nameA.localeCompare(nameB))\n .map(([name, subCommandConfig]) => {\n // subCommandConfig is an ISubCommand object from the map\n const actualSubParserInstance = subCommandConfig.parser;\n\n // Guard against misconfiguration, though addSubCommand should prevent non-ArgParser instances\n if (!(actualSubParserInstance instanceof ArgParser)) {\n return `${indent()}${green(name.padEnd(20))} [Error: Subcommand '${name}' has an invalid parser configuration]`;\n }\n\n let subHelp = `${indent()}${green(name.padEnd(20))} ${white(actualSubParserInstance.#description || \"\")}`;\n\n const flagsFromSubManager =\n actualSubParserInstance && actualSubParserInstance.#flagManager\n ? actualSubParserInstance.#flagManager.flags\n : undefined;\n const subFlags = (flagsFromSubManager || []).filter(\n (f: ProcessedFlag) => f[\"name\"] !== \"help\",\n );\n if (subFlags.length > 0) {\n subHelp += `\\n${indent(2)}${dim(\"Flags:\")}`;\n subFlags\n .sort((a: ProcessedFlag, b: ProcessedFlag) =>\n a[\"name\"].localeCompare(b[\"name\"]),\n )\n .forEach((f: ProcessedFlag) => {\n const flagOptions = f[\"options\"]\n .map((opt: string) => green(opt))\n .join(\", \");\n const flagDesc = Array.isArray(f[\"description\"])\n ? f[\"description\"][0]\n : f[\"description\"];\n subHelp += `\\n${indent(3)}${flagOptions} - ${dim(flagDesc)}`;\n });\n } else {\n subHelp += `\\n${indent(2)}${dim(\"Flags:\")} none`;\n }\n\n const subSubCommandNames = Array.from(\n actualSubParserInstance.#subCommands.keys(),\n ); // Get keys from actualSubParserInstance's Map\n if (subSubCommandNames.length > 0) {\n subHelp += `\\n${indent(2)}${dim(\"Sub-commands:\")} ${subSubCommandNames.join(\", \")}`;\n } else {\n subHelp += `\\n${indent(2)}${dim(\"Sub-commands:\")} none`;\n }\n\n return subHelp;\n })\n .join(\"\\n\\n\");\n help += \"\\n\";\n }\n\n help += `\\n${cyan(\"Flags:\")}\\n`;\n const localFlags = this.#flagManager.flags; // Use FlagManager for local flags\n if (localFlags.length > 0) {\n help += localFlags\n .sort((flagA, flagB) => flagA[\"name\"].localeCompare(flagB[\"name\"]))\n .map((flag: ProcessedFlag) => {\n // Flag type is ProcessedFlag\n const optionsText = flag[\"options\"]\n .toSorted((a: string, b: string) => a.length - b.length) // Sort by length (shortest first)\n .map((opt: string) => green(opt))\n .join(\", \");\n const isMandatory =\n typeof flag.mandatory === \"function\" ? \"dynamic\" : flag.mandatory;\n const mandatoryIndicator =\n isMandatory === true\n ? ` ${red(this.#parameters.mandatoryCharacter)}`\n : isMandatory === \"dynamic\"\n ? ` ${dim(\"(conditionally mandatory)\")}`\n : \"\";\n\n const descriptionLines = Array.isArray(flag[\"description\"])\n ? flag[\"description\"]\n : [flag[\"description\"]];\n\n const metaLines: string[] = [];\n\n // Determine the type name for display\n let typeName = \"unknown\";\n if (typeof flag[\"type\"] === \"function\") {\n typeName = flag[\"type\"].name || \"custom function\";\n // Make the type names more user-friendly\n if (typeName === \"Boolean\") typeName = \"boolean\";\n if (typeName === \"String\") typeName = \"string\";\n if (typeName === \"Number\") typeName = \"number\";\n if (typeName === \"Array\") typeName = \"array\";\n if (typeName === \"Object\") typeName = \"object\";\n } else if (typeof flag[\"type\"] === \"string\") {\n typeName = flag[\"type\"];\n }\n\n metaLines.push(`Type: ${typeName}`);\n\n if (flag[\"flagOnly\"]) {\n metaLines.push(\"Flag only (no value expected)\");\n }\n if (\n flag[\"defaultValue\"] !== undefined &&\n flag[\"defaultValue\"] !== null\n ) {\n metaLines.push(`Default: ${JSON.stringify(flag[\"defaultValue\"])}`);\n }\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) {\n metaLines.push(\n `Allowed values: ${flag[\"enum\"].map((v: any) => `'${v}'`).join(\", \")}`,\n );\n }\n\n const maxOptionLength = Math.max(\n ...localFlags.map(\n (f: ProcessedFlag) => f[\"options\"].join(\", \").length,\n ),\n 0,\n );\n const formattedOptions =\n optionsText.padEnd(maxOptionLength + 5) + mandatoryIndicator;\n\n return `\n${indent()}${formattedOptions}\n${indent(2)}${white(descriptionLines[0])}\n${metaLines.map((line) => `${indent(3)}${dim(line)}`).join(\"\\n\")}\n${descriptionLines\n .slice(1)\n .map((line) => `\\n${indent(2)}${white(line)}`)\n .join(\"\")}\n `.trim();\n })\n .join(\"\\n\\n\");\n } else {\n help += `${indent()}${dim(\"none\")}`;\n }\n\n return help;\n }\n\n public getSubCommand(name: string): ISubCommand | undefined {\n return this.#subCommands.get(name);\n }\n\n public hasFlag(name: string): boolean {\n // Delegates to FlagManager\n return this.#flagManager.hasFlag(name);\n }\n\n public getCommandChain(): string[] {\n const chain = [];\n let currentParser: ArgParser | undefined = this;\n while (currentParser && currentParser.#parentParser) {\n chain.unshift(currentParser.#subCommandName);\n currentParser = currentParser.#parentParser;\n }\n return chain;\n }\n\n public getLastParseResult(): TParsedArgs<ProcessedFlag[]> {\n return this.#lastParseResult;\n }\n\n #displayErrorAndExit(error: ArgParserError): void {\n let commandNameToSuggest = \"your-script\";\n\n if (this.#appCommandName) {\n commandNameToSuggest = this.#appCommandName;\n } else if (this.#appName && this.#appName !== \"Argument Parser\") {\n commandNameToSuggest = this.#appName;\n } else if (\n typeof process !== \"undefined\" &&\n process.argv &&\n process.argv[1]\n ) {\n try {\n commandNameToSuggest = path.basename(process.argv[1]);\n } catch {}\n }\n\n const commandPath = [\n commandNameToSuggest,\n ...(error.commandChain || []),\n ].join(\" \");\n\n console.error(`\\n${chalk.red.bold(\"Error:\")} ${error.message}`);\n console.error(\n `\\n${chalk.dim(`Try '${commandPath} --help' for usage details.`)}`,\n );\n\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(1 as never);\n } else {\n throw error;\n }\n }\n\n #_printRecursiveToConsole(\n parser: ArgParser,\n level: number,\n visited: Set<ArgParser> = new Set(),\n ): void {\n const indent = \" \".repeat(level);\n const subIndent = \" \".repeat(level + 1);\n const flagIndent = \" \".repeat(level + 2);\n\n console.log(\n `${indent}Parser: ${chalk.blueBright(parser.#subCommandName || parser.#appName)}`,\n );\n if (parser.#description) {\n console.log(`${subIndent}Description: ${parser.#description}`);\n }\n console.log(`${subIndent}Options:`);\n console.log(`${flagIndent}appName: ${parser.#appName}`);\n console.log(\n `${flagIndent}appCommandName: ${parser.#appCommandName ?? chalk.dim(\"undefined\")}`,\n );\n console.log(`${flagIndent}handleErrors: ${parser.#handleErrors}`);\n console.log(\n `${flagIndent}throwForDuplicateFlags: ${parser.#throwForDuplicateFlags}`,\n );\n console.log(\n `${flagIndent}inheritParentFlags: ${parser.#inheritParentFlags}`,\n );\n console.log(`${flagIndent}Handler Defined: ${!!parser.#handler}`);\n console.log(\n `${subIndent}Internal Params: ${JSON.stringify(parser.#parameters)}`,\n );\n\n const flags = parser.#flagManager.flags;\n if (flags.length > 0) {\n console.log(`${subIndent}Flags (${flags.length}):`);\n flags.forEach((flag: ProcessedFlag) => {\n console.log(`${flagIndent}* ${chalk.green(flag[\"name\"])}:`);\n console.log(`${flagIndent} Options: ${flag[\"options\"].join(\", \")}`);\n console.log(\n `${flagIndent} Description: ${Array.isArray(flag[\"description\"]) ? flag[\"description\"].join(\" | \") : flag[\"description\"]}`,\n );\n console.log(\n `${flagIndent} Type: ${typeof flag[\"type\"] === \"function\" ? flag[\"type\"].name || \"custom function\" : flag[\"type\"]}`,\n );\n console.log(\n `${flagIndent} Mandatory: ${typeof flag[\"mandatory\"] === \"function\" ? \"dynamic\" : (flag[\"mandatory\"] ?? false)}`,\n );\n console.log(\n `${flagIndent} Default: ${JSON.stringify(flag[\"defaultValue\"])}`,\n );\n console.log(`${flagIndent} Flag Only: ${flag[\"flagOnly\"]}`);\n console.log(`${flagIndent} Allow Multiple: ${flag[\"allowMultiple\"]}`);\n console.log(`${flagIndent} Allow Ligature: ${flag[\"allowLigature\"]}`);\n console.log(\n `${flagIndent} Enum: ${flag[\"enum\"] && flag[\"enum\"].length > 0 ? flag[\"enum\"].join(\", \") : \"none\"}`,\n );\n console.log(`${flagIndent} Validator Defined: ${!!flag[\"validate\"]}`);\n });\n } else {\n console.log(`${subIndent}Flags: ${chalk.dim(\"none\")}`);\n }\n\n const subCommandParsers = Array.from(parser.#subCommands.values());\n if (subCommandParsers.length > 0) {\n console.log(`${subIndent}Sub-Commands (${subCommandParsers.length}):`);\n subCommandParsers.forEach((subCommand: any) => {\n this.#_printRecursiveToConsole(subCommand.parser, level + 1, visited);\n });\n } else {\n console.log(`${subIndent}Sub-Commands: ${chalk.dim(\"none\")}`);\n }\n }\n\n #_buildRecursiveString(\n parser: ArgParser,\n level: number,\n visited = new Set<ArgParser>(),\n ): string {\n // Add visited set\n if (visited.has(parser)) return \"\"; // Prevent infinite loops for circular structures (if ever possible)\n visited.add(parser);\n\n let output = \"\";\n const indent = \" \".repeat(level);\n const subIndent = \" \".repeat(level + 1);\n const flagIndent = \" \".repeat(level + 2);\n\n const addLine = (line: string) => {\n output += line + \"\\\\n\";\n };\n\n addLine(\n `${indent}Parser: ${parser.#subCommandName || parser.#appName}`, // #appName is guaranteed\n );\n if (parser.#description) {\n addLine(`${subIndent}Description: ${parser.#description}`);\n }\n addLine(`${subIndent}Options:`);\n addLine(`${flagIndent}appName: ${parser.#appName}`);\n addLine(\n `${flagIndent}appCommandName: ${parser.#appCommandName ?? \"undefined\"}`,\n );\n addLine(`${flagIndent}handleErrors: ${parser.#handleErrors}`);\n addLine(\n `${flagIndent}throwForDuplicateFlags: ${parser.#throwForDuplicateFlags}`,\n );\n addLine(`${flagIndent}inheritParentFlags: ${parser.#inheritParentFlags}`);\n addLine(`${flagIndent}Handler Defined: ${!!parser.#handler}`);\n addLine(\n `${subIndent}Internal Params: ${JSON.stringify(parser.#parameters)}`,\n );\n\n const flags = parser.#flagManager.flags;\n if (flags.length > 0) {\n addLine(`${subIndent}Flags (${flags.length}):`);\n flags.forEach((flag: ProcessedFlag) => {\n addLine(`${flagIndent}* ${flag[\"name\"]}:`);\n addLine(`${flagIndent} Options: ${flag[\"options\"].join(\", \")}`);\n addLine(\n `${flagIndent} Description: ${Array.isArray(flag[\"description\"]) ? flag[\"description\"].join(\" | \") : flag[\"description\"]}`,\n );\n let typeName = \"unknown\";\n if (typeof flag[\"type\"] === \"function\") {\n typeName = flag[\"type\"].name || \"custom function\";\n } else if (typeof flag[\"type\"] === \"string\") {\n typeName = flag[\"type\"];\n } else if (typeof flag[\"type\"] === \"object\" && flag[\"type\"]) {\n try {\n typeName = (flag[\"type\"] as any).constructor?.name || \"object\";\n } catch {\n typeName = \"object\";\n }\n }\n addLine(`${flagIndent} Type: ${typeName}`);\n addLine(\n `${flagIndent} Mandatory: ${typeof flag[\"mandatory\"] === \"function\" ? \"dynamic\" : (flag[\"mandatory\"] ?? false)}`,\n );\n addLine(\n `${flagIndent} Default: ${JSON.stringify(flag[\"defaultValue\"])}`,\n );\n addLine(`${flagIndent} Flag Only: ${flag[\"flagOnly\"]}`);\n addLine(`${flagIndent} Allow Multiple: ${flag[\"allowMultiple\"]}`);\n addLine(`${flagIndent} Allow Ligature: ${flag[\"allowLigature\"]}`);\n addLine(\n `${flagIndent} Enum: ${flag[\"enum\"] && flag[\"enum\"].length > 0 ? flag[\"enum\"].join(\", \") : \"none\"}`,\n );\n addLine(`${flagIndent} Validator Defined: ${!!flag[\"validate\"]}`);\n });\n } else {\n addLine(`${subIndent}Flags: none`);\n }\n\n const subCommandParsers = Array.from(parser.#subCommands.values());\n if (subCommandParsers.length > 0) {\n addLine(`${subIndent}Sub-Commands (${subCommandParsers.length}):`);\n subCommandParsers.forEach((subCommand: any) => {\n output += this.#_buildRecursiveString(\n subCommand.parser,\n level + 1,\n visited,\n );\n });\n } else {\n addLine(`${subIndent}Sub-Commands: none`);\n }\n return output;\n }\n\n #_buildRecursiveJson(\n parser: ArgParser,\n visited = new Set<ArgParser>(),\n ): object {\n if (visited.has(parser))\n return {\n note: `Reference to already processed parser: ${parser.#subCommandName || parser.#appName}`,\n };\n visited.add(parser);\n\n const config: any = {\n parserName: parser.#subCommandName || parser.#appName, // #appName is guaranteed\n description: parser.#description,\n options: {\n appName: parser.#appName,\n appCommandName: parser.#appCommandName ?? undefined,\n handleErrors: parser.#handleErrors,\n throwForDuplicateFlags: parser.#throwForDuplicateFlags,\n inheritParentFlags: parser.#inheritParentFlags,\n },\n handlerDefined: !!parser.#handler,\n internalParams: parser.#parameters,\n flags: [],\n subCommands: {}, // Will be an object where keys are sub-command names\n };\n\n const flags = parser.#flagManager.flags;\n config.flags = flags.map((flag: ProcessedFlag) => {\n let typeName = \"unknown\";\n if (typeof flag[\"type\"] === \"function\") {\n typeName = flag[\"type\"].name || \"custom function\";\n } else if (typeof flag[\"type\"] === \"string\") {\n typeName = flag[\"type\"];\n } else if (typeof flag[\"type\"] === \"object\" && flag[\"type\"]) {\n try {\n typeName = (flag[\"type\"] as any).constructor?.name || \"object\";\n } catch {\n typeName = \"object\";\n }\n }\n\n return {\n name: flag[\"name\"],\n options: flag[\"options\"],\n description: flag[\"description\"],\n type: typeName,\n mandatory:\n typeof flag[\"mandatory\"] === \"function\"\n ? \"dynamic\"\n : (flag[\"mandatory\"] ?? false),\n defaultValue: flag[\"defaultValue\"],\n flagOnly: flag[\"flagOnly\"],\n allowMultiple: flag[\"allowMultiple\"],\n allowLigature: flag[\"allowLigature\"],\n enum: flag[\"enum\"],\n validatorDefined: !!flag[\"validate\"],\n };\n });\n\n const subCommands = Array.from(parser.#subCommands.values());\n if (subCommands.length > 0) {\n subCommands.forEach((sub: any) => {\n config.subCommands[sub.name] = this.#_buildRecursiveJson(\n sub.parser,\n visited,\n );\n });\n }\n\n return config;\n }\n}\n"],"names":["_throwForDuplicateFlags","fs"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/types.ts","../src/FlagManager.ts","../src/ArgParserBase.ts","../src/mcp-integration.ts","../src/ArgParser.ts","../src/fuzzy-tester.ts"],"sourcesContent":["import { z } from \"zod\";\n\n// Forward declaration for ArgParser to avoid circular dependency in HandlerContext\n// This will be replaced or refined once ArgParser.ts is updated to use these types.\n// It represents an instance of the ArgParser class.\nexport type ArgParserInstance = any;\n\nexport const zodFlagSchema = z\n .object({\n name: z\n .string()\n .min(1, \"Flag name cannot be empty\")\n .describe(\n \"The output property name, used as a return key `{name: value}`. Must be unique.\",\n ),\n allowLigature: z\n .boolean()\n .default(true)\n .describe(\n \"Enable both forms of flag input, e.g., `./script.js -f=value` and `-f value`.\",\n ),\n allowMultiple: z\n .boolean()\n .default(false)\n .describe(\n \"Allow passing the same flag multiple times, e.g., `-f val1 -f val2` results in an array.\",\n ),\n description: z\n .union([z.string(), z.array(z.string())])\n .describe(\"Textual description for help messages.\"),\n options: z\n .array(z.string().min(1))\n .min(1, \"Flag must have at least one option (e.g., ['-f', '--flag'])\")\n .describe(\"Array of option strings, e.g., ['-f', '--flag'].\"),\n defaultValue: z\n .any()\n .optional()\n .describe(\"Default value if the flag is not provided.\"),\n type: z\n .union([\n z.any().refine((val) => val === String, {\n message: \"Must be String constructor\",\n }),\n z.any().refine((val) => val === Number, {\n message: \"Must be Number constructor\",\n }),\n z.any().refine((val) => val === Boolean, {\n message: \"Must be Boolean constructor\",\n }),\n z.any().refine((val) => val === Array, {\n // Native Array constructor\n message: \"Must be Array constructor\",\n }),\n z.any().refine((val) => val === Object, {\n // Native Object constructor\n message: \"Must be Object constructor\",\n }),\n z.function().args(z.string()).returns(z.any()), // Custom parser function (value: string) => any\n z.string().refine(\n // String literal types\n (value) =>\n [\"boolean\", \"string\", \"number\", \"array\", \"object\"].includes(\n value.toLowerCase(),\n ),\n {\n message:\n \"Invalid type string. Must be one of 'boolean', 'string', 'number', 'array', 'object'.\",\n },\n ),\n ])\n .default(\"string\") // Default type is string if not specified\n .describe(\n \"Expected data type (constructor or string literal) or a custom parser function. Defaults to 'string'.\",\n ),\n mandatory: z\n .union([z.boolean(), z.function().args(z.any()).returns(z.boolean())]) // `z.any()` for parsedArgs flexibility\n .optional()\n .describe(\n \"Makes the flag mandatory, can be a boolean or a function conditional on other args.\",\n ),\n flagOnly: z\n .boolean()\n .default(false)\n .describe(\n \"If true, the flag's presence is noted (true/false), and any subsequent value is not consumed by this flag.\",\n ),\n validate: z // User-provided validation function\n .function()\n .args(z.any().optional(), z.any().optional()) // value, parsedArgs?\n .returns(\n z.union([\n z.boolean(),\n z.string(),\n z.void(),\n z.promise(z.union([z.boolean(), z.string(), z.void()])),\n ]),\n )\n .optional()\n .describe(\n \"Custom validation function for the flag's value (receives value, parsedArgs).\",\n ),\n enum: z // User-provided enum values\n .array(z.any())\n .optional()\n .describe(\"Array of allowed values for the flag.\"),\n })\n .passthrough() // Allow unrecognized properties, they won't be validated or processed beyond alias handling.\n .transform((obj) => {\n // Alias handling for 'default' and 'required'\n const newObj: { [key: string]: any } = { ...obj };\n if (\n \"default\" in newObj &&\n newObj[\"default\"] !== undefined &&\n !(\"defaultValue\" in newObj)\n ) {\n newObj[\"defaultValue\"] = newObj[\"default\"];\n }\n if (\n \"required\" in newObj &&\n newObj[\"required\"] !== undefined &&\n !(\"mandatory\" in newObj)\n ) {\n newObj[\"mandatory\"] = newObj[\"required\"] as\n | boolean\n | ((parsedArgs: any) => boolean);\n }\n return newObj;\n });\n\n/**\n * The raw input type for defining a flag, before Zod processing (aliases, defaults).\n */\nexport type IFlagCore = z.input<typeof zodFlagSchema>;\n\n/**\n * The type of the `type` property in a ProcessedFlagCore object.\n * This represents all valid forms the `type` property can take after Zod processing.\n */\nexport type TParsedArgsTypeFromFlagDef =\n | StringConstructor\n | NumberConstructor\n | BooleanConstructor\n | ArrayConstructor\n | ObjectConstructor\n | ((value: string) => any) // Custom parser function\n | \"string\"\n | \"number\"\n | \"boolean\"\n | \"array\"\n | \"object\"; // String literal types\n\n/**\n * The core type of a flag after Zod processing (defaults applied, aliases resolved),\n * but before some properties are made more specific (like `type` constructor to actual type).\n * This type is output by `zodFlagSchema.parse()`.\n */\nexport type ProcessedFlagCore = Omit<z.output<typeof zodFlagSchema>, \"type\"> & {\n type: TParsedArgsTypeFromFlagDef;\n};\n\n/**\n * The user-facing type for defining a flag. It includes aliases like `default` and `required`.\n * The `handler` property is removed as handlers are typically associated with commands/subcommands, not individual flags.\n */\nexport type IFlag = IFlagCore & {\n /** @alias defaultValue */\n default?: any;\n /** @alias mandatory */\n required?: boolean | ((parsedArgs: TParsedArgs<any>) => boolean);\n};\n\n/**\n * A more refined type for a flag after it has been fully processed by ArgParser,\n * particularly its `type` property and validation/enum/mandatory functions.\n * This is the type that ArgParser would internally work with for parsing and type extraction.\n */\nexport type ProcessedFlag = Omit<\n ProcessedFlagCore,\n \"validate\" | \"enum\" | \"mandatory\"\n> & {\n // `type` is already correctly typed via ProcessedFlagCore.\n validate?: (\n value: any,\n parsedArgs?: TParsedArgs<ProcessedFlag[]>, // Parsed args up to this point\n ) => boolean | string | void | Promise<boolean | string | void>;\n enum?: any[]; // Enum values, type-checked by user or ArgParser\n mandatory?: boolean | ((parsedArgs: TParsedArgs<ProcessedFlag[]>) => boolean);\n};\n\n/**\n * Resolves the TypeScript type from a flag's `type` definition.\n */\nexport type ResolveType<T extends TParsedArgsTypeFromFlagDef> =\n T extends StringConstructor\n ? string\n : T extends NumberConstructor\n ? number\n : T extends BooleanConstructor\n ? boolean\n : T extends ArrayConstructor\n ? any[] // Default to array of any if not further specified\n : T extends ObjectConstructor\n ? Record<string, any> // Default to object with any properties\n : T extends \"string\"\n ? string\n : T extends \"number\"\n ? number\n : T extends \"boolean\"\n ? boolean\n : T extends \"array\"\n ? any[] // Default for string literal 'array'\n : T extends \"object\"\n ? Record<string, any> // Default for string literal 'object'\n : T extends (value: string) => infer R // Custom parser function\n ? R // The return type of the custom parser\n : any; // Fallback type\n\n/**\n * Extracts the final TypeScript type for a flag's value based on its definition,\n * considering `flagOnly` and `allowMultiple` properties.\n */\nexport type ExtractFlagType<TFlag extends ProcessedFlag> =\n TFlag[\"flagOnly\"] extends true // If the flag is a \"flag-only\" (presence) type\n ? TFlag[\"allowMultiple\"] extends true\n ? boolean[] // Multiple presence flags result in an array of booleans\n : boolean // Single presence flag results in a boolean\n : TFlag[\"allowMultiple\"] extends true // If the flag can have multiple values\n ? Array<ResolveType<TFlag[\"type\"]>> // Results in an array of the resolved type\n : ResolveType<TFlag[\"type\"]>; // Single value of the resolved type\n\n/**\n * Represents the structured object of parsed arguments.\n * Keys are flag names, and values are their parsed and typed values.\n * `TFlags` should be the array of `ProcessedFlag` definitions for the specific command.\n */\nexport type TParsedArgs<TFlags extends readonly ProcessedFlag[]> = {\n [K in TFlags[number][\"name\"]]: ExtractFlagType<\n Extract<TFlags[number], { name: K }>\n >;\n};\n\n/**\n * Generic context object passed to command handlers.\n * @template TCurrentCommandArgs Shape of `args` for the current command, derived from its flags.\n * @template TParentCommandArgs Shape of `parentArgs` from the parent command, if any.\n */\nexport type IHandlerContext<\n TCurrentCommandArgs extends Record<string, any> = Record<string, any>,\n TParentCommandArgs extends Record<string, any> = Record<string, any>,\n> = {\n /** Parsed arguments specific to the current command. */\n args: TCurrentCommandArgs;\n /** Parsed arguments from the parent command, if this is a subcommand. */\n parentArgs?: TParentCommandArgs;\n /** The sequence of command names that led to this handler. */\n commandChain: string[];\n /** The `ArgParser` instance that invoked this handler (could be a subcommand's parser). */\n parser: ArgParserInstance;\n /** The parent `ArgParser` instance, if this is a subcommand handler. */\n parentParser?: ArgParserInstance;\n /** Optional: The root `ArgParser` instance of the CLI. */\n // rootParser?: ArgParserInstance;\n};\n\n/**\n * Generic type for the collection of processed flags that an ArgParser instance manages.\n */\nexport type FlagsArray = readonly ProcessedFlag[];\n\n/**\n * Defines a subcommand within an ArgParser setup.\n * @template TSubCommandFlags Flags defined specifically FOR this subcommand.\n * @template TParentCommandFlags Flags defined for the PARENT of this subcommand.\n * @template THandlerReturn The expected return type of the subcommand's handler.\n */\nexport interface ISubCommand<\n TSubCommandFlags extends FlagsArray = FlagsArray,\n TParentCommandFlags extends FlagsArray = FlagsArray,\n THandlerReturn = any,\n> {\n name: string;\n description?: string;\n /** The ArgParser instance for this subcommand, typed with its own flags. */\n // Ideally: parser: ArgParser<TSubCommandFlags>; (if ArgParser class is made generic)\n parser: ArgParserInstance;\n /** Handler function for this subcommand. */\n handler?: (\n ctx: IHandlerContext<\n TParsedArgs<TSubCommandFlags>,\n TParsedArgs<TParentCommandFlags>\n >,\n ) => THandlerReturn | Promise<THandlerReturn>;\n /** Internal flag to identify MCP subcommands for proper exclusion from tool generation */\n isMcp?: boolean;\n}\n\n/**\n * Type for the main handler of an ArgParser instance (root command or a command defined by an ArgParser).\n * @template TParserFlags Flags defined for this ArgParser instance.\n * @template TParentParserFlags Flags of the parent parser, if this parser is used as a subcommand.\n * @template THandlerReturn The expected return type of the handler.\n */\nexport type MainHandler<\n TParserFlags extends FlagsArray = FlagsArray,\n TParentParserFlags extends FlagsArray = FlagsArray,\n THandlerReturn = any,\n> = (\n ctx: IHandlerContext<\n TParsedArgs<TParserFlags>,\n TParsedArgs<TParentParserFlags>\n >,\n) => THandlerReturn | Promise<THandlerReturn>;\n","import { zodFlagSchema } from \"./types\";\nimport type { IFlag, ProcessedFlag } from \"./types\";\n\nexport class FlagManager {\n #_flags: Map<string, ProcessedFlag> = new Map();\n #throwForDuplicateFlags: boolean;\n\n constructor(\n options: { throwForDuplicateFlags?: boolean } = {},\n initialFlags: readonly IFlag[] = [],\n ) {\n this.#throwForDuplicateFlags = options.throwForDuplicateFlags ?? false;\n this.addFlags(initialFlags);\n }\n\n static _safeFlag(flag: IFlag): ProcessedFlag {\n const parsedFromZod = zodFlagSchema.parse(flag);\n\n let resolvedType: ProcessedFlag[\"type\"];\n const inputTypeFromZod = parsedFromZod[\"type\"];\n\n if (typeof inputTypeFromZod === \"string\") {\n switch (inputTypeFromZod.toLowerCase()) {\n case \"boolean\":\n resolvedType = Boolean;\n break;\n case \"string\":\n resolvedType = String;\n break;\n case \"number\":\n resolvedType = Number;\n break;\n case \"array\":\n resolvedType = Array;\n break;\n case \"object\":\n resolvedType = Object;\n break;\n default:\n throw new Error(`Invalid type string: ${inputTypeFromZod}`);\n }\n } else {\n resolvedType = inputTypeFromZod as ProcessedFlag[\"type\"];\n }\n\n return {\n ...parsedFromZod,\n options: parsedFromZod[\"options\"],\n type: resolvedType,\n validate: parsedFromZod[\"validate\"],\n enum: parsedFromZod[\"enum\"],\n mandatory: parsedFromZod[\"mandatory\"],\n };\n }\n\n addFlag(flag: IFlag): this {\n const safeFlag = FlagManager._safeFlag(flag);\n\n if (this.#_flags.has(safeFlag[\"name\"])) {\n if (this.#throwForDuplicateFlags) {\n throw new Error(\n `FlagManager: Flag '${safeFlag[\"name\"]}' already exists.`,\n );\n } else {\n console.warn(\n `Warning: FlagManager: Flag '${safeFlag[\"name\"]}' already exists. Duplicate not added.`,\n );\n return this;\n }\n }\n\n this.#_flags.set(safeFlag[\"name\"], safeFlag);\n return this;\n }\n\n _setProcessedFlagForInheritance(processedFlag: ProcessedFlag): this {\n if (this.#_flags.has(processedFlag[\"name\"])) {\n return this;\n }\n this.#_flags.set(processedFlag[\"name\"], processedFlag);\n return this;\n }\n\n addFlags(flags: readonly IFlag[]): this {\n for (const flag of flags) {\n this.addFlag(flag);\n }\n return this;\n }\n\n hasFlag(name: string): boolean {\n return this.#_flags.has(name);\n }\n\n getFlag(name: string): ProcessedFlag | undefined {\n return this.#_flags.get(name);\n }\n\n get flags(): ProcessedFlag[] {\n return Array.from(this.#_flags.values());\n }\n\n get flagNames(): string[] {\n return Array.from(this.#_flags.values()).map((flag) => flag[\"name\"]);\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport chalk from \"chalk\";\nimport { anyOf, char, createRegExp, oneOrMore } from \"magic-regexp\";\nimport * as yaml from \"js-yaml\";\nimport * as toml from \"@iarna/toml\";\nimport * as dotenv from \"dotenv\";\nimport { FlagManager } from \"./FlagManager\";\nimport type {\n IFlag,\n IHandlerContext,\n ISubCommand,\n ProcessedFlag,\n TParsedArgs,\n} from \"./types\";\n\nexport class ArgParserError extends Error {\n public commandChain: string[];\n constructor(\n message: string,\n public cmdChain: string[] = [],\n ) {\n super(message);\n this.name = \"ArgParserError\";\n this.commandChain = cmdChain;\n }\n}\n\nexport interface IArgParserParams<THandlerReturn = any> {\n /**\n * This is the display name of the app, used in help text\n */\n appName?: string;\n subCommands?: ISubCommand[];\n handler?: (\n ctx: IHandlerContext<any, any>,\n ) => THandlerReturn | Promise<THandlerReturn>;\n\n /**\n * Add an extra new line between each flag group,\n * makes the text more readable but uses more space\n *\n * Default: true\n */\n extraNewLine?: boolean;\n /**\n * Wraps the line at width, if shorter, wrapping will be more\n * aggressive. Wrapping is based on words.\n *\n * Default: 50\n * Minimum: 30\n */\n wrapAtWidth?: number;\n /**\n * Controls the placing of right text on the screen.\n * The higher the value, the more to the right the text will be.\n *\n * Default: 30\n * Minimum: 20\n */\n blankSpaceWidth?: number;\n /**\n * Character to display next to the flag to express mandatory fields.\n *\n * Default: *\n */\n mandatoryCharacter?: string;\n /**\n * Throw an error if a flag is added more than once\n * @default false\n */\n throwForDuplicateFlags?: boolean;\n description?: string; // New property for the description\n /**\n * Automatically handle ArgParserErrors by printing a formatted message\n * and exiting. Set to false to catch ArgParserError manually.\n * @default true\n */\n handleErrors?: boolean;\n /**\n * The command name to display in help suggestions (e.g., 'dabl').\n * If not provided, it falls back to guessing from the script path.\n */\n appCommandName?: string;\n /**\n * If true, when this parser is added as a sub-command, it will inherit\n * flags from its direct parent *unless* a flag with the same name\n * already exists in this parser. Child flags take precedence.\n * @default false\n */\n inheritParentFlags?: boolean;\n}\n\ninterface IParseOptions {\n /**\n * When true, skips help flag processing (doesn't exit or show help)\n * @default false\n */\n skipHelpHandling?: boolean;\n /**\n * When true, skips the execution of any command handlers.\n * @default false\n */\n skipHandlers?: boolean;\n}\n\ntype TParsedArgsWithRouting<T = any> = T & {\n $commandChain?: string[];\n handlerToExecute?: { handler: Function; context: IHandlerContext };\n};\n\ntype RecursiveParseResult = {\n finalArgs: TParsedArgsWithRouting<any>;\n handlerToExecute?: { handler: Function; context: IHandlerContext };\n};\n\nexport class ArgParserBase<THandlerReturn = any> {\n #appName: string = \"Argument Parser\";\n #appCommandName?: string;\n #subCommandName: string = \"\";\n #parameters: IArgParserParams<THandlerReturn> = {\n extraNewLine: true,\n wrapAtWidth: 50,\n blankSpaceWidth: 30,\n mandatoryCharacter: \"*\",\n };\n #handler?: (ctx: IHandlerContext) => void;\n #throwForDuplicateFlags: boolean = false;\n #description?: string;\n #handleErrors: boolean = true;\n #parentParser?: ArgParserBase;\n #lastParseResult: TParsedArgs<ProcessedFlag[]> = {};\n #inheritParentFlags: boolean = false;\n #subCommands: Map<string, ISubCommand> = new Map();\n #flagManager: FlagManager;\n #fuzzyMode: boolean = false;\n\n constructor(\n options: IArgParserParams<THandlerReturn> = {},\n initialFlags?: readonly IFlag[],\n ) {\n this.#appName = options.appName || \"app\";\n if (\n options.blankSpaceWidth &&\n !isNaN(Number(options.blankSpaceWidth)) &&\n Number(options.blankSpaceWidth) > 20\n )\n this.#parameters.blankSpaceWidth = Number(options.blankSpaceWidth);\n\n if (\n options.wrapAtWidth &&\n !isNaN(Number(options.wrapAtWidth)) &&\n Number(options.wrapAtWidth) > 30\n )\n this.#parameters.wrapAtWidth = Number(options.wrapAtWidth);\n\n if (typeof options.extraNewLine === \"boolean\")\n this.#parameters.extraNewLine = Boolean(options.extraNewLine);\n\n if (typeof options.mandatoryCharacter === \"string\")\n this.#parameters.mandatoryCharacter = options.mandatoryCharacter;\n\n if (typeof options.throwForDuplicateFlags === \"boolean\")\n this.#throwForDuplicateFlags = options.throwForDuplicateFlags;\n\n this.#flagManager = new FlagManager(\n {\n throwForDuplicateFlags: this.#throwForDuplicateFlags,\n },\n initialFlags || [],\n );\n\n this.#handleErrors = options.handleErrors ?? true;\n this.#inheritParentFlags = options.inheritParentFlags ?? false;\n this.#description = options.description;\n this.#handler = options.handler;\n this.#appCommandName = options.appCommandName;\n\n const helpFlag: IFlag = {\n name: \"help\",\n description: \"Display this help message and exits\",\n mandatory: false,\n type: Boolean,\n options: [\"-h\", \"--help\"],\n defaultValue: undefined,\n allowLigature: false,\n allowMultiple: false,\n flagOnly: true,\n enum: [],\n validate: (_value?: any, _parsedArgs?: any) => true, // Ensure signature matches Zod schema for .args()\n };\n this.#flagManager.addFlag(helpFlag); // Add the help flag via FlagManager\n\n if (options.subCommands) {\n for (const sub of options.subCommands) {\n this.addSubCommand(sub);\n }\n }\n }\n\n get flags(): ProcessedFlag[] {\n return this.#flagManager.flags;\n }\n\n get flagNames(): string[] {\n return this.#flagManager.flagNames;\n }\n\n public getAppName(): string | undefined {\n return this.#appName;\n }\n\n public getAppCommandName(): string | undefined {\n return this.#appCommandName;\n }\n\n public getSubCommandName(): string {\n return this.#subCommandName;\n }\n\n public getDescription(): string | undefined {\n return this.#description;\n }\n\n public getHandler(): ((ctx: IHandlerContext) => void) | undefined {\n return this.#handler;\n }\n\n public getSubCommands(): Map<string, ISubCommand> {\n return this.#subCommands;\n }\n\n private _addToOutput(\n flag: ProcessedFlag, // Changed from Flags[number]\n arg: any,\n output: TParsedArgs<ProcessedFlag[]>,\n _parseOptions?: IParseOptions,\n ) {\n let value: unknown = arg;\n\n if (flag[\"type\"] === Boolean) {\n if (typeof arg === \"boolean\") {\n value = arg;\n } else if (typeof arg === \"string\") {\n value = /(true|yes|1)/i.test(arg);\n } else {\n value = new (flag[\"type\"] as ObjectConstructor)(value);\n }\n } else if (typeof flag[\"type\"] === \"function\") {\n value = (flag[\"type\"] as Function)(value as string);\n } else if (typeof flag[\"type\"] === \"object\") {\n value = new (flag[\"type\"] as ObjectConstructor)(value);\n }\n\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) {\n const allowedValues = flag[\"enum\"]\n .map((v: any) => (typeof v === \"string\" ? `'${v}'` : v))\n .join(\", \");\n\n if (!flag[\"enum\"].includes(value)) {\n throw new ArgParserError(\n `Invalid value '${value}' for flag '${chalk.yellow(flag[\"name\"])}'. ` +\n `Allowed values: ${allowedValues}`,\n this.getCommandChain(),\n );\n }\n }\n\n if (flag[\"validate\"]) {\n const validationResult = flag[\"validate\"](value, output);\n if (validationResult === false) {\n throw new ArgParserError(\n `Validation failed for flag '${chalk.yellow(flag[\"name\"])}' with value '${value}'`,\n this.getCommandChain(),\n );\n } else if (typeof validationResult === \"string\") {\n throw new ArgParserError(validationResult, this.getCommandChain());\n }\n }\n\n if (flag[\"allowMultiple\"] && !Array.isArray(output[flag[\"name\"]])) {\n output[flag[\"name\"]] = [] as any;\n }\n\n return flag[\"allowMultiple\"]\n ? (output[flag[\"name\"]] as any[]).push(value)\n : (output[flag[\"name\"]] = value as any);\n }\n\n addFlags(flags: readonly IFlag[]): this {\n this.#flagManager.addFlags(flags);\n return this;\n }\n\n addFlag(flag: IFlag): this {\n this.#flagManager.addFlag(flag);\n return this;\n }\n\n addSubCommand(subCommandConfig: ISubCommand): this {\n if (this.#subCommands.has(subCommandConfig.name)) {\n throw new Error(`Sub-command '${subCommandConfig.name}' already exists`);\n }\n\n const subParser = subCommandConfig.parser;\n\n if (!(subParser instanceof ArgParserBase)) {\n throw new Error(\n `Parser for subcommand '${subCommandConfig.name}' is not an instance of ArgParserBase. ` +\n `Please provide 'new ArgParserBase(...)' for the 'parser' property of an ISubCommand.`,\n );\n }\n\n subParser.#parentParser = this;\n subParser.#subCommandName = subCommandConfig.name;\n if (!subParser.#appCommandName && this.#appCommandName) {\n subParser.#appCommandName = this.#appCommandName;\n }\n\n if (subParser.#inheritParentFlags) {\n const parentFlags = this.#flagManager.flags;\n for (const parentFlag of parentFlags) {\n if (!subParser.#flagManager.hasFlag(parentFlag[\"name\"])) {\n subParser.#flagManager._setProcessedFlagForInheritance(parentFlag);\n }\n }\n }\n\n this.#subCommands.set(subCommandConfig.name, subCommandConfig);\n\n if (subCommandConfig.handler) {\n subParser.setHandler(subCommandConfig.handler);\n }\n\n return this;\n }\n\n /**\n * Sets the handler function for this specific parser instance.\n * This handler will be executed if this parser is the final one\n * in the command chain and `executeHandlers` is enabled on the root parser.\n *\n * @param handler - The function to execute.\n * @returns The ArgParser instance for chaining.\n */\n setHandler(\n handler: (\n ctx: IHandlerContext<any, any>,\n ) => THandlerReturn | Promise<THandlerReturn>,\n ): this {\n this.#handler = handler;\n return this;\n }\n\n printAll(filePath?: string): void {\n if (filePath) {\n try {\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n if (filePath.toLowerCase().endsWith(\".json\")) {\n const outputObject = this.#_buildRecursiveJson(this);\n const jsonString = JSON.stringify(outputObject, null, 2);\n fs.writeFileSync(filePath, jsonString);\n console.log(`ArgParser configuration JSON dumped to: ${filePath}`);\n } else {\n const outputString = this.#_buildRecursiveString(this, 0);\n const plainText = outputString.replace(\n /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,\n \"\",\n );\n fs.writeFileSync(filePath, plainText);\n console.log(`ArgParser configuration text dumped to: ${filePath}`);\n }\n } catch (error) {\n console.error(\n `Error writing ArgParser configuration to file '${filePath}':`,\n error,\n );\n }\n } else {\n console.log(\"\\n--- ArgParser Configuration Dump ---\");\n this.#_printRecursiveToConsole(this, 0);\n console.log(\"--- End Configuration Dump ---\\\\n\");\n }\n }\n\n #_identifyCommandChainAndParsers(\n argsToParse: string[],\n currentParser: ArgParserBase,\n commandChainSoFar: string[],\n parserChainSoFar: ArgParserBase[],\n ): {\n finalParser: ArgParserBase;\n commandChain: string[];\n parserChain: ArgParserBase[];\n remainingArgs: string[];\n } {\n let subCommandIndex = -1;\n let subCommandName: string | null = null;\n\n for (let i = 0; i < argsToParse.length; i++) {\n const potentialSubCommand = argsToParse[i];\n if (currentParser.#subCommands.has(potentialSubCommand)) {\n subCommandIndex = i;\n subCommandName = potentialSubCommand;\n break;\n }\n }\n\n if (subCommandIndex === -1 || subCommandName === null) {\n return {\n finalParser: currentParser,\n commandChain: commandChainSoFar,\n parserChain: parserChainSoFar,\n remainingArgs: argsToParse,\n };\n }\n\n const subCommandConfig = currentParser.#subCommands.get(subCommandName);\n if (!subCommandConfig || !(subCommandConfig.parser instanceof ArgParserBase)) {\n throw new Error(\n `Internal error: Subcommand '${subCommandName!}' configuration is invalid or parser is missing.`,\n );\n }\n const nextParser = subCommandConfig.parser;\n const nextArgs = argsToParse.slice(subCommandIndex + 1);\n const nextCommandChain = [...commandChainSoFar, subCommandName];\n const nextParserChain = [...parserChainSoFar, nextParser];\n\n return this.#_identifyCommandChainAndParsers(\n nextArgs,\n nextParser,\n nextCommandChain,\n nextParserChain,\n );\n }\n\n #_handleGlobalChecks(\n processArgs: string[],\n options?: IParseOptions,\n ): boolean {\n // Auto-help should only trigger for root parsers that are intended as main CLI entry points\n // A parser is considered a \"root CLI parser\" if it has appCommandName explicitly set\n // This ensures that only parsers intended as main CLI tools trigger auto-help\n const isRootCliParser = !this.#parentParser && !!this.#appCommandName;\n\n if (processArgs.length === 0 && isRootCliParser && !this.#handler) {\n console.log(this.helpText());\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(0 as never);\n }\n return true;\n }\n\n if (processArgs.includes(\"--s-debug-print\")) {\n this.printAll(\"ArgParser.full.json\");\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(0);\n }\n return true;\n }\n\n // Handle --s-enable-fuzzy system flag to enable fuzzy testing mode\n if (processArgs.includes(\"--s-enable-fuzzy\")) {\n this.#_enableFuzzyMode();\n // Remove the flag from processArgs so it doesn't interfere with parsing\n const fuzzyIndex = processArgs.indexOf(\"--s-enable-fuzzy\");\n processArgs.splice(fuzzyIndex, 1);\n }\n\n // Handle --s-with-env system flag early to modify processArgs before parsing\n const withEnvIndex = processArgs.findIndex(arg => arg === \"--s-with-env\");\n if (withEnvIndex !== -1) {\n if (withEnvIndex + 1 >= processArgs.length) {\n console.error(chalk.red(\"Error: --s-with-env requires a file path argument\"));\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(1);\n }\n return true;\n }\n\n const filePath = processArgs[withEnvIndex + 1];\n if (!filePath || filePath.startsWith(\"-\")) {\n console.error(chalk.red(\"Error: --s-with-env requires a file path argument\"));\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(1);\n }\n return true;\n }\n\n try {\n // Identify the final parser and parser chain for loading configuration\n const { finalParser: identifiedFinalParser, parserChain: identifiedParserChain } =\n this.#_identifyCommandChainAndParsers(processArgs, this, [], [this]);\n\n const envConfigArgs = identifiedFinalParser.#_loadEnvFile(filePath, identifiedParserChain);\n if (envConfigArgs) {\n // Merge environment configuration with process args\n // CLI args take precedence over file configuration\n const mergedArgs = identifiedFinalParser.#_mergeEnvConfigWithArgs(envConfigArgs, processArgs);\n\n // Replace the original processArgs array contents\n processArgs.length = 0;\n processArgs.push(...mergedArgs);\n }\n } catch (error) {\n console.error(chalk.red(`Error loading environment file: ${error instanceof Error ? error.message : String(error)}`));\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(1);\n }\n return true;\n }\n }\n\n\n\n const { finalParser: identifiedFinalParser } =\n this.#_identifyCommandChainAndParsers(processArgs, this, [], [this]);\n\n if (processArgs.includes(\"--s-debug\")) {\n console.log(\n chalk.yellow.bold(\"\\n--- ArgParser --s-debug Runtime Context ---\"),\n );\n\n const {\n commandChain: identifiedCommandChain,\n parserChain: _identifiedParserChain,\n } = this.#_identifyCommandChainAndParsers(processArgs, this, [], [this]);\n\n console.log(\n `Identified Command Chain: ${chalk.cyan(identifiedCommandChain.join(\" -> \") || \"(root)\")}`,\n );\n console.log(\n `Identified Final Parser: ${chalk.cyan(identifiedFinalParser.#subCommandName || identifiedFinalParser.#appName)}`,\n );\n\n let currentParser: ArgParserBase = this;\n let remainingArgs = [...processArgs];\n let accumulatedArgs: TParsedArgs<any> = {};\n const parsingSteps: {\n level: string;\n argsSlice: string[];\n parsed?: TParsedArgs<any>;\n error?: string;\n }[] = [];\n\n const rootSubCommandIndex = remainingArgs.findIndex((arg) =>\n currentParser.#subCommands.has(arg),\n );\n const rootArgsSlice =\n rootSubCommandIndex === -1\n ? remainingArgs\n : remainingArgs.slice(0, rootSubCommandIndex);\n parsingSteps.push({ level: \"(root)\", argsSlice: rootArgsSlice });\n try {\n const { parsedArgs: rootParsedArgs } = currentParser.#parseFlags(\n rootArgsSlice,\n { skipHelpHandling: true },\n );\n parsingSteps[0].parsed = rootParsedArgs;\n accumulatedArgs = { ...accumulatedArgs, ...rootParsedArgs };\n } catch (e: any) {\n parsingSteps[0].error = e.message;\n }\n remainingArgs =\n rootSubCommandIndex === -1\n ? []\n : remainingArgs.slice(rootSubCommandIndex);\n\n for (let i = 0; i < identifiedCommandChain.length; i++) {\n const subCommandName = identifiedCommandChain[i];\n if (!currentParser.#subCommands.has(subCommandName)) {\n parsingSteps.push({\n level: `Error`,\n argsSlice: [],\n error: `Could not find sub-command parser for '${subCommandName}'`,\n });\n break;\n }\n currentParser = currentParser.#subCommands.get(subCommandName)?.parser;\n remainingArgs = remainingArgs.slice(1);\n\n const nextSubCommandIndex = remainingArgs.findIndex((arg) =>\n currentParser.#subCommands.has(arg),\n );\n const currentLevelArgsSlice =\n nextSubCommandIndex === -1\n ? remainingArgs\n : remainingArgs.slice(0, nextSubCommandIndex);\n const stepInfo: {\n level: string;\n argsSlice: string[];\n parsed?: TParsedArgs<any>;\n error?: string;\n } = {\n level: subCommandName,\n argsSlice: currentLevelArgsSlice,\n };\n parsingSteps.push(stepInfo);\n\n try {\n const { parsedArgs: currentLevelParsedArgs } =\n currentParser.#parseFlags(currentLevelArgsSlice, {\n skipHelpHandling: true,\n });\n stepInfo.parsed = currentLevelParsedArgs;\n accumulatedArgs = { ...accumulatedArgs, ...currentLevelParsedArgs };\n } catch (e: any) {\n stepInfo.error = e.message;\n }\n remainingArgs =\n nextSubCommandIndex === -1\n ? []\n : remainingArgs.slice(nextSubCommandIndex);\n }\n\n console.log(chalk.yellow(\"\\nParsing Simulation Steps:\"));\n parsingSteps.forEach((step) => {\n console.log(` Level: ${chalk.cyan(step.level)}`);\n console.log(\n ` Args Slice Considered: ${JSON.stringify(step.argsSlice)}`,\n );\n if (step.parsed) {\n console.log(\n ` Parsed Args at this Level: ${JSON.stringify(step.parsed)}`,\n );\n }\n if (step.error) {\n console.log(\n ` ${chalk.red(\"Error during parse simulation:\")} ${step.error}`,\n );\n }\n });\n\n console.log(\n chalk.yellow(\n \"\\nFinal Accumulated Args State (before final validation):\",\n ),\n );\n console.log(JSON.stringify(accumulatedArgs, null, 2));\n\n console.log(chalk.yellow(\"\\nArguments Remaining After Simulation:\"));\n console.log(JSON.stringify(remainingArgs, null, 2));\n\n console.log(\n chalk.yellow.bold(\n \"\\n--- ArgParser Static Configuration (Final Parser) ---\",\n ),\n );\n identifiedFinalParser.printAll();\n\n console.log(chalk.yellow.bold(\"--- End ArgParser --s-debug ---\"));\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(0);\n }\n return true;\n }\n\n // ---- BEGIN ADDED DIAGNOSTIC LOG FOR identifiedFinalParser ----\n let parserNameForLog = \"undefined_parser\";\n if (identifiedFinalParser instanceof ArgParserBase) {\n // Access private fields only if it's a confirmed ArgParser instance\n parserNameForLog =\n (identifiedFinalParser as any)[\"#subCommandName\"] ||\n (identifiedFinalParser as any)[\"#appName\"];\n } else if (identifiedFinalParser) {\n parserNameForLog =\n (identifiedFinalParser as any).name ||\n (identifiedFinalParser as any).appName ||\n \"unknown_type\";\n }\n // console.log(\n // `[ArgParser #_handleGlobalChecks Debug] identifiedFinalParser: constructor=${identifiedFinalParser ? 'defined' : 'undefined'}, isArgParser=${identifiedFinalParser instanceof ArgParser}, name=${parserNameForLog}`\n // );\n // ---- END ADDED DIAGNOSTIC LOG FOR identifiedFinalParser ----\n\n // ---- BEGIN GUARD FOR identifiedFinalParser ----\n if (!(identifiedFinalParser instanceof ArgParserBase)) {\n console.error(\n `[ArgParser #_handleGlobalChecks Critical Error] identifiedFinalParser is not an instance of ArgParser. Cannot process help. Name: ${parserNameForLog}, Constructor: ${identifiedFinalParser ? (identifiedFinalParser as any).constructor?.name : \"undefined\"}`,\n );\n // Returning false to prevent further processing with an invalid parser,\n // which could lead to more cryptic errors or incorrect behavior.\n return false;\n }\n // ---- END GUARD FOR identifiedFinalParser ----\n\n const helpFlagDefinition =\n identifiedFinalParser.#flagManager.getFlag(\"help\");\n if (helpFlagDefinition && !options?.skipHelpHandling) {\n const helpOptions = helpFlagDefinition[\"options\"];\n\n // ---- BEGIN ADDED DEBUG AND DEFENSIVE CHECK ----\n // if (!Array.isArray(helpOptions) || helpOptions.length === 0) {\n // console.warn(\n // `[ArgParser Debug] helpOptions is not a valid array or is empty. Value: ${JSON.stringify(helpOptions)}, Type: ${typeof helpOptions}`,\n // `Parser: ${parserNameForLog}`, // Use the determined parserNameForLog\n // );\n // // Potentially, we might even want to return false here or throw,\n // // as help cannot be processed correctly. For now, just log and continue.\n // } else {\n // // Optional: Log the valid helpOptions for debugging successful cases\n // // console.log(`[ArgParser Debug] Valid helpOptions: ${JSON.stringify(helpOptions)} for parser ${parserNameForLog}`);\n // }\n // ---- END ADDED DEBUG AND DEFENSIVE CHECK ----\n\n const helpRequested = processArgs.some((arg) =>\n helpOptions.includes(arg),\n );\n\n if (helpRequested) {\n console.log(identifiedFinalParser.helpText());\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(0 as never);\n }\n return true;\n }\n }\n\n return false;\n }\n\n #_validateMandatoryFlags(\n finalArgs: TParsedArgsWithRouting<any>,\n parserChain: ArgParserBase[],\n commandChain: string[],\n ): void {\n const finalMandatoryFlagsMissing: {\n name: string;\n parserName: string;\n commandChain: string[];\n }[] = [];\n const checkedFlagNames = new Set<string>();\n\n // For both MCP and regular subcommands, use the same inheritance-based validation logic\n // Validate all parsers except the root parser when it's not the final destination\n let parsersToValidate: ArgParserBase[] = [...parserChain];\n\n // If there are multiple parsers and the root parser is not the final destination,\n // remove the root parser from validation (unless its flags are inherited)\n if (parserChain.length > 1) {\n const immediateChild = parserChain[1];\n\n // If the immediate child doesn't inherit from root, don't validate root\n if (!immediateChild.#inheritParentFlags) {\n parsersToValidate = parsersToValidate.slice(1);\n }\n }\n\n\n\n for (let i = 0; i < parsersToValidate.length; i++) {\n const parser = parsersToValidate[i];\n const currentCommandChain = parser.getCommandChain();\n\n for (const flag of parser.#flagManager.flags) {\n // Use FlagManager\n if (flag[\"name\"] === \"help\" || checkedFlagNames.has(flag[\"name\"]))\n continue;\n\n // Check if this flag is inherited by the immediate child\n let flagIsInheritedByChild = false;\n\n if (i < parsersToValidate.length - 1) {\n const immediateChild = parsersToValidate[i + 1];\n\n // If the immediate child inherits parent flags AND has this flag,\n // then this flag is inherited and should be validated by the child\n if (immediateChild.#inheritParentFlags && immediateChild.#flagManager.hasFlag(flag[\"name\"])) {\n flagIsInheritedByChild = true;\n }\n }\n\n // Skip validation if this flag is inherited by a child (child will validate it)\n if (flagIsInheritedByChild) continue;\n\n\n\n const isMandatory =\n typeof flag[\"mandatory\"] === \"function\"\n ? flag[\"mandatory\"](finalArgs)\n : flag[\"mandatory\"];\n\n if (!isMandatory) continue;\n\n const value = finalArgs[flag[\"name\"] as keyof typeof finalArgs];\n let currentFlagIsMissing = false;\n\n if (flag[\"allowMultiple\"]) {\n // For allowMultiple, it's missing if undefined OR an empty array\n if (\n value === undefined ||\n (Array.isArray(value) && value.length === 0)\n ) {\n currentFlagIsMissing = true;\n }\n } else {\n // For non-allowMultiple, it's missing if undefined\n if (value === undefined) {\n currentFlagIsMissing = true;\n }\n }\n\n if (currentFlagIsMissing) {\n if (!checkedFlagNames.has(flag[\"name\"])) {\n finalMandatoryFlagsMissing.push({\n name: flag[\"name\"],\n parserName: parser.#subCommandName || parser.#appName,\n commandChain: currentCommandChain,\n });\n checkedFlagNames.add(flag[\"name\"]);\n }\n }\n }\n }\n\n if (finalMandatoryFlagsMissing.length > 0) {\n throw new ArgParserError(\n `Missing mandatory flags: ${finalMandatoryFlagsMissing\n .map((flag) => chalk.yellow(flag[\"name\"]))\n .join(\", \")}`,\n commandChain,\n );\n }\n }\n\n #_applyDefaultValues(\n finalArgs: TParsedArgsWithRouting<any>,\n finalParser: ArgParserBase,\n ): void {\n for (const flag of finalParser.#flagManager.flags) {\n // Use FlagManager\n const flagName = flag[\"name\"] as string;\n if (\n finalArgs[flagName] === undefined &&\n flag[\"defaultValue\"] !== undefined\n ) {\n if (flag[\"allowMultiple\"]) {\n finalArgs[flagName] = Array.isArray(flag[\"defaultValue\"])\n ? flag[\"defaultValue\"]\n : [flag[\"defaultValue\"]];\n } else {\n finalArgs[flagName] = flag[\"defaultValue\"];\n }\n }\n }\n }\n\n #_prepareAndExecuteHandler(\n handlerToExecute: RecursiveParseResult[\"handlerToExecute\"],\n finalArgs: TParsedArgsWithRouting<any>,\n skipHandlers: boolean,\n ): void {\n // Skip handlers if explicitly requested, if no handler exists, or if in fuzzy mode\n if (skipHandlers || !handlerToExecute) {\n return;\n }\n\n // Log handler skipping in fuzzy mode for visibility\n if (this.#fuzzyMode) {\n const commandChain = handlerToExecute.context.commandChain || [];\n const args = handlerToExecute.context.args || {};\n\n // Try to get the original input arguments from the final args if available\n const inputArgs = (finalArgs as any)._originalInputArgs || 'unknown';\n const inputArgsStr = Array.isArray(inputArgs) ? inputArgs.join(' ') : inputArgs;\n\n console.log(`[--s-enable-fuzzy] handler() skipped for command chain: ${commandChain.join(' ') || '(root)'}`);\n console.log(` Input args: [${inputArgsStr}]`);\n console.log(` Parsed args: ${JSON.stringify(args)}`);\n return;\n }\n\n const finalParserWhoseHandlerWillRun = handlerToExecute.context.parser;\n const finalParserFlags = finalParserWhoseHandlerWillRun.#flagManager.flags;\n const handlerArgs = handlerToExecute.context.args;\n\n for (const flag of finalParserFlags) {\n const flagName = flag[\"name\"] as keyof typeof finalArgs;\n if (finalArgs.hasOwnProperty(flagName)) {\n (handlerArgs as any)[flagName] = (finalArgs as any)[flagName];\n } else if (\n flag[\"allowMultiple\"] &&\n !handlerArgs.hasOwnProperty(flagName)\n ) {\n (handlerArgs as any)[flagName] = [];\n }\n }\n handlerToExecute.context.args = handlerArgs;\n\n try {\n const handlerResult = handlerToExecute.handler(handlerToExecute.context);\n\n // Check if result is a Promise (async handler)\n if (handlerResult && typeof handlerResult.then === \"function\") {\n // Store async handler info for ArgParserWithMcp to handle\n (finalArgs as any)._asyncHandlerPromise = handlerResult;\n (finalArgs as any)._asyncHandlerInfo = handlerToExecute;\n\n // Add a catch handler to prevent unhandled rejection warnings\n // The actual error handling will be done in parseAsync()\n handlerResult.catch(() => {\n // Silently ignore - this will be handled properly in parseAsync()\n });\n\n return;\n }\n\n (finalArgs as any).handlerResponse = handlerResult;\n } catch (error) {\n // For synchronous handlers, we can handle sync errors\n if (this.#handleErrors) {\n this.#displayErrorAndExit(\n new ArgParserError(`Handler error: ${error}`, []),\n );\n } else {\n throw error;\n }\n }\n }\n\n parse(\n processArgs: string[],\n options?: IParseOptions,\n ): TParsedArgsWithRouting<any> {\n // Store original args for fuzzy mode logging\n const originalProcessArgs = [...processArgs];\n\n // Check if fuzzy mode is enabled (global fuzzy mode detection)\n // This allows automatic prevention of parse() execution without requiring boilerplate\n // Prevent execution if:\n // 1. ARGPARSER_FUZZY_MODE environment variable is set (during fuzzy test imports)\n // 2. OR --s-enable-fuzzy is in process.argv but not in current processArgs (global fuzzy testing)\n // 3. AND skipHelpHandling is not true (not a programmatic call from fuzzy tester)\n const shouldPreventExecution = typeof process !== 'undefined' && (\n (process.env['ARGPARSER_FUZZY_MODE'] === 'true') ||\n (process.argv &&\n process.argv.includes('--s-enable-fuzzy') &&\n !processArgs.includes('--s-enable-fuzzy'))\n ) && !options?.skipHelpHandling;\n\n if (shouldPreventExecution) {\n // Return a minimal result that indicates fuzzy mode prevented execution\n return {\n _fuzzyModePreventedExecution: true,\n _originalInputArgs: originalProcessArgs\n } as TParsedArgsWithRouting<any>;\n }\n\n if (this.#_handleGlobalChecks(processArgs, options)) {\n return {} as TParsedArgsWithRouting<any>;\n }\n\n try {\n const {\n finalParser: identifiedFinalParser,\n commandChain: identifiedCommandChain,\n parserChain: identifiedParserChain,\n } = this.#_identifyCommandChainAndParsers(processArgs, this, [], [this]);\n\n // Check for --s-save-to-env flag at the final parser level\n if (identifiedFinalParser.#_handleSaveToEnvFlag(processArgs, identifiedParserChain)) {\n return {} as TParsedArgsWithRouting<any>;\n }\n\n const { finalArgs, handlerToExecute } = this._parseRecursive(\n processArgs,\n this,\n {},\n [],\n options,\n undefined,\n );\n\n // Set command chain in final args\n if (identifiedCommandChain.length > 0) {\n (finalArgs as any).$commandChain = identifiedCommandChain;\n }\n\n // Store original args for fuzzy mode logging\n if (this.#fuzzyMode) {\n (finalArgs as any)._originalInputArgs = originalProcessArgs;\n }\n\n // Skip mandatory flag validation in fuzzy mode\n if (!this.#fuzzyMode) {\n this.#_validateMandatoryFlags(\n finalArgs,\n identifiedParserChain,\n identifiedCommandChain,\n );\n }\n\n this.#_applyDefaultValues(finalArgs, identifiedFinalParser);\n\n this.#_prepareAndExecuteHandler(\n handlerToExecute,\n finalArgs,\n options?.skipHandlers ?? false,\n );\n\n return finalArgs;\n } catch (error) {\n if (error instanceof ArgParserError) {\n if (this.#handleErrors) {\n this.#displayErrorAndExit(error);\n return {} as TParsedArgsWithRouting<any>;\n } else {\n throw error;\n }\n } else {\n throw error;\n }\n }\n }\n\n /**\n * Recursive helper for parsing arguments and handling sub-commands.\n * This method assumes the global help check has already been performed in `parse`.\n */\n private _parseRecursive(\n argsToParse: string[],\n currentParser: ArgParserBase,\n accumulatedParentArgs: TParsedArgs<any>,\n commandChainSoFar: string[],\n options?: IParseOptions,\n parentParser?: ArgParserBase,\n ): RecursiveParseResult {\n let subCommandIndex = -1;\n let subCommandName: string | null = null;\n\n // Find the index of the first argument that matches a defined sub-command name\n for (let i = 0; i < argsToParse.length; i++) {\n const potentialSubCommand = argsToParse[i];\n if (currentParser.#subCommands.has(potentialSubCommand)) {\n subCommandIndex = i;\n subCommandName = potentialSubCommand;\n break;\n }\n }\n\n // Determine which arguments belong to the current parser level\n const argsForCurrentLevel =\n subCommandIndex === -1\n ? argsToParse\n : argsToParse.slice(0, subCommandIndex);\n\n // Parse flags for the current level using #parseFlags\n const { parsedArgs: currentLevelArgs, firstUnconsumedIndex } =\n currentParser.#parseFlags(argsForCurrentLevel, options);\n\n // Apply default values for the current parser's flags to its args\n currentParser.#_applyDefaultValues(currentLevelArgs, currentParser);\n\n const combinedArgsFromThisAndParents = {\n ...accumulatedParentArgs,\n ...currentLevelArgs,\n };\n\n if (subCommandIndex === -1 || subCommandName === null) {\n if (firstUnconsumedIndex < argsForCurrentLevel.length) {\n const unknownCommand = argsForCurrentLevel[firstUnconsumedIndex];\n throw new ArgParserError(\n `Unknown command: '${chalk.yellow(unknownCommand)}'`,\n commandChainSoFar,\n );\n }\n\n const finalParseResultArgs = { ...combinedArgsFromThisAndParents };\n if (commandChainSoFar.length > 0) {\n finalParseResultArgs[\"$commandChain\"] = commandChainSoFar;\n }\n\n let handlerToExecute: RecursiveParseResult[\"handlerToExecute\"] =\n undefined;\n if (currentParser.#handler) {\n handlerToExecute = {\n handler: currentParser.#handler,\n context: {\n args: currentLevelArgs,\n parentArgs: accumulatedParentArgs,\n commandChain: commandChainSoFar,\n parser: currentParser,\n parentParser: parentParser,\n },\n };\n }\n return { finalArgs: finalParseResultArgs, handlerToExecute };\n }\n if (firstUnconsumedIndex < argsForCurrentLevel.length) {\n const unknownCommand = argsForCurrentLevel[firstUnconsumedIndex];\n throw new ArgParserError(\n `Unknown command: '${chalk.yellow(unknownCommand)}'`,\n commandChainSoFar,\n );\n }\n\n const subCommandConfig = currentParser.#subCommands.get(subCommandName!);\n if (!subCommandConfig || !(subCommandConfig.parser instanceof ArgParserBase)) {\n // This should ideally not be reached if addSubCommand validated the parser instance\n throw new ArgParserError(\n `Internal error: Subcommand '${subCommandName!}' is misconfigured or its parser is not a valid ArgParser instance.`,\n commandChainSoFar,\n );\n }\n const nextParser = subCommandConfig.parser;\n const nextArgs = argsToParse.slice(subCommandIndex + 1);\n const nextCommandChain = [...commandChainSoFar, subCommandName];\n const combinedArgsForNextLevel = {\n ...accumulatedParentArgs,\n ...currentLevelArgs,\n };\n\n return this._parseRecursive(\n nextArgs,\n nextParser,\n combinedArgsForNextLevel,\n nextCommandChain,\n options,\n currentParser,\n );\n }\n\n #parseFlags(\n args: string[],\n options?: IParseOptions,\n ): {\n parsedArgs: TParsedArgs<ProcessedFlag[]>;\n firstUnconsumedIndex: number;\n } {\n const flags = this.#flagManager.flags;\n\n const output: TParsedArgs<ProcessedFlag[]> = Object.fromEntries(\n flags.map((flag) => [\n flag[\"name\"],\n flag[\"allowMultiple\"] ? [] : undefined,\n ]),\n ) as TParsedArgs<ProcessedFlag[]>;\n\n let consumedIndices = new Set<number>();\n\n for (const flagToCheck of flags) {\n if (flagToCheck[\"allowLigature\"] && !flagToCheck[\"flagOnly\"]) {\n const regex = createRegExp(\n anyOf(\n ...flagToCheck[\"options\"].map((option: string) => `${option}=`),\n ),\n oneOrMore(char).groupedAs(\"arg\"),\n );\n for (let i = 0; i < args.length; i++) {\n if (consumedIndices.has(i)) continue;\n const itemToCheck = args[i];\n const matches = regex.exec(`${itemToCheck}`);\n if (matches?.groups?.[\"arg\"]) {\n this._addToOutput(\n flagToCheck,\n matches?.groups?.[\"arg\"],\n output,\n options,\n );\n consumedIndices.add(i);\n if (!flagToCheck[\"allowMultiple\"]) break;\n }\n }\n }\n }\n\n for (const flagToCheck of flags) {\n for (let index = 0; index < args.length; index++) {\n if (consumedIndices.has(index)) continue;\n\n const value = args[index];\n const nextIndex = index + 1;\n const nextValueExists = nextIndex < args.length;\n const nextValue = nextValueExists ? args[nextIndex] : undefined;\n const nextValueIsFlag =\n typeof nextValue === \"string\" && nextValue.startsWith(\"-\");\n\n if (flagToCheck[\"options\"].includes(value)) {\n // Mark the flag itself as consumed immediately\n consumedIndices.add(index);\n\n if (flagToCheck[\"flagOnly\"]) {\n this._addToOutput(flagToCheck, true, output, options);\n } else if (nextValueExists && !nextValueIsFlag) {\n this._addToOutput(flagToCheck, nextValue, output, options);\n consumedIndices.add(nextIndex);\n } else if (flagToCheck[\"type\"] === Boolean) {\n this._addToOutput(flagToCheck, true, output, options);\n }\n if (!flagToCheck[\"allowMultiple\"]) break;\n }\n }\n }\n\n let firstUnconsumedIndex = args.length;\n for (let i = 0; i < args.length; i++) {\n if (!consumedIndices.has(i)) {\n firstUnconsumedIndex = i;\n break;\n }\n }\n\n return { parsedArgs: output, firstUnconsumedIndex };\n }\n\n helpText(): string {\n const cyan = chalk.cyan;\n const green = chalk.green;\n const white = chalk.white;\n const red = chalk.red;\n const dim = chalk.dim;\n\n let rootAppName = this.#appName;\n let current: ArgParserBase | undefined = this;\n while (current.#parentParser) {\n current = current.#parentParser;\n }\n if (current) {\n rootAppName = current.#appName;\n }\n\n const helpTitle = this.#subCommandName\n ? `${rootAppName} ${this.#subCommandName}`\n : rootAppName;\n\n let help = `${cyan(`${helpTitle} Help`)} (${this.#parameters.mandatoryCharacter} = Mandatory fields):\\n\\n`;\n\n // ---- BEGIN ADDED DIAGNOSTIC LOG ----\n // console.log(\n // `[ArgParser helpText Debug] 'this' context: constructor.name = ${this?.constructor?.name}, is ArgParser instance = ${this instanceof ArgParser}, subCommandName = ${this.#subCommandName || '(root)'}`,\n // );\n // ---- END ADDED DIAGNOSTIC LOG ----\n\n if (this.#description) {\n help += `${white(this.#description)}\\n\\n`;\n }\n\n const indent = (level: number = 1) => \" \".repeat(level);\n\n if (this.#subCommands.size > 0) {\n // Use Map.size\n help += `${cyan(\"Available sub-commands:\")}\\n`;\n // Iterate over Map entries, then sort\n help += Array.from(this.#subCommands.entries())\n .sort(([nameA], [nameB]) => nameA.localeCompare(nameB))\n .map(([name, subCommandConfig]) => {\n // subCommandConfig is an ISubCommand object from the map\n const actualSubParserInstance = subCommandConfig.parser;\n\n // Guard against misconfiguration, though addSubCommand should prevent non-ArgParser instances\n if (!(actualSubParserInstance instanceof ArgParserBase)) {\n return `${indent()}${green(name.padEnd(20))} [Error: Subcommand '${name}' has an invalid parser configuration]`;\n }\n\n let subHelp = `${indent()}${green(name.padEnd(20))} ${white(actualSubParserInstance.#description || \"\")}`;\n\n const flagsFromSubManager =\n actualSubParserInstance && actualSubParserInstance.#flagManager\n ? actualSubParserInstance.#flagManager.flags\n : undefined;\n const subFlags = (flagsFromSubManager || []).filter(\n (f: ProcessedFlag) => f[\"name\"] !== \"help\",\n );\n if (subFlags.length > 0) {\n subHelp += `\\n${indent(2)}${dim(\"Flags:\")}`;\n subFlags\n .sort((a: ProcessedFlag, b: ProcessedFlag) =>\n a[\"name\"].localeCompare(b[\"name\"]),\n )\n .forEach((f: ProcessedFlag) => {\n const flagOptions = f[\"options\"]\n .map((opt: string) => green(opt))\n .join(\", \");\n const flagDesc = Array.isArray(f[\"description\"])\n ? f[\"description\"][0]\n : f[\"description\"];\n subHelp += `\\n${indent(3)}${flagOptions} - ${dim(flagDesc)}`;\n });\n } else {\n subHelp += `\\n${indent(2)}${dim(\"Flags:\")} none`;\n }\n\n const subSubCommandNames = Array.from(\n actualSubParserInstance.#subCommands.keys(),\n ); // Get keys from actualSubParserInstance's Map\n if (subSubCommandNames.length > 0) {\n subHelp += `\\n${indent(2)}${dim(\"Sub-commands:\")} ${subSubCommandNames.join(\", \")}`;\n } else {\n subHelp += `\\n${indent(2)}${dim(\"Sub-commands:\")} none`;\n }\n\n return subHelp;\n })\n .join(\"\\n\\n\");\n help += \"\\n\";\n }\n\n help += `\\n${cyan(\"Flags:\")}\\n`;\n const localFlags = this.#flagManager.flags; // Use FlagManager for local flags\n if (localFlags.length > 0) {\n help += localFlags\n .sort((flagA, flagB) => flagA[\"name\"].localeCompare(flagB[\"name\"]))\n .map((flag: ProcessedFlag) => {\n // Flag type is ProcessedFlag\n const optionsText = flag[\"options\"]\n .slice() // Create a copy before sorting (toSorted only supported by Node 20+)\n .sort((a: string, b: string) => a.length - b.length) // Sort by length (shortest first)\n .map((opt: string) => green(opt))\n .join(\", \");\n const isMandatory =\n typeof flag.mandatory === \"function\" ? \"dynamic\" : flag.mandatory;\n const mandatoryIndicator =\n isMandatory === true\n ? ` ${red(this.#parameters.mandatoryCharacter)}`\n : isMandatory === \"dynamic\"\n ? ` ${dim(\"(conditionally mandatory)\")}`\n : \"\";\n\n const descriptionLines = Array.isArray(flag[\"description\"])\n ? flag[\"description\"]\n : [flag[\"description\"]];\n\n const metaLines: string[] = [];\n\n // Determine the type name for display\n let typeName = \"unknown\";\n if (typeof flag[\"type\"] === \"function\") {\n typeName = flag[\"type\"].name || \"custom function\";\n // Make the type names more user-friendly\n if (typeName === \"Boolean\") typeName = \"boolean\";\n if (typeName === \"String\") typeName = \"string\";\n if (typeName === \"Number\") typeName = \"number\";\n if (typeName === \"Array\") typeName = \"array\";\n if (typeName === \"Object\") typeName = \"object\";\n } else if (typeof flag[\"type\"] === \"string\") {\n typeName = flag[\"type\"];\n }\n\n metaLines.push(`Type: ${typeName}`);\n\n if (flag[\"flagOnly\"]) {\n metaLines.push(\"Flag only (no value expected)\");\n }\n if (\n flag[\"defaultValue\"] !== undefined &&\n flag[\"defaultValue\"] !== null\n ) {\n metaLines.push(`Default: ${JSON.stringify(flag[\"defaultValue\"])}`);\n }\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) {\n metaLines.push(\n `Allowed values: ${flag[\"enum\"].map((v: any) => `'${v}'`).join(\", \")}`,\n );\n }\n\n const maxOptionLength = Math.max(\n ...localFlags.map(\n (f: ProcessedFlag) => f[\"options\"].join(\", \").length,\n ),\n 0,\n );\n const formattedOptions =\n optionsText.padEnd(maxOptionLength + 5) + mandatoryIndicator;\n\n return `\n${indent()}${formattedOptions}\n${indent(2)}${white(descriptionLines[0])}\n${metaLines.map((line) => `${indent(3)}${dim(line)}`).join(\"\\n\")}\n${descriptionLines\n .slice(1)\n .map((line) => `\\n${indent(2)}${white(line)}`)\n .join(\"\")}\n `.trim();\n })\n .join(\"\\n\\n\");\n } else {\n help += `${indent()}${dim(\"none\")}`;\n }\n\n return help;\n }\n\n public getSubCommand(name: string): ISubCommand | undefined {\n return this.#subCommands.get(name);\n }\n\n public hasFlag(name: string): boolean {\n // Delegates to FlagManager\n return this.#flagManager.hasFlag(name);\n }\n\n public getCommandChain(): string[] {\n const chain = [];\n let currentParser: ArgParserBase | undefined = this;\n while (currentParser && currentParser.#parentParser) {\n chain.unshift(currentParser.#subCommandName);\n currentParser = currentParser.#parentParser;\n }\n return chain;\n }\n\n public getLastParseResult(): TParsedArgs<ProcessedFlag[]> {\n return this.#lastParseResult;\n }\n\n /**\n * Enables fuzzy testing mode by disabling error handling and making flags optional\n */\n #_enableFuzzyMode(): void {\n // Enable fuzzy mode flag\n this.#fuzzyMode = true;\n\n // Disable error handling to allow fuzzy tester to catch errors\n this.#handleErrors = false;\n\n // Recursively enable fuzzy mode for all subcommand parsers\n for (const [, subCommand] of this.#subCommands) {\n if (subCommand.parser instanceof ArgParserBase) {\n subCommand.parser.#_enableFuzzyMode();\n }\n }\n }\n\n #displayErrorAndExit(error: ArgParserError): void {\n let commandNameToSuggest = \"your-script\";\n\n if (this.#appCommandName) {\n commandNameToSuggest = this.#appCommandName;\n } else if (this.#appName && this.#appName !== \"Argument Parser\") {\n commandNameToSuggest = this.#appName;\n } else if (\n typeof process !== \"undefined\" &&\n process.argv &&\n process.argv[1]\n ) {\n try {\n commandNameToSuggest = path.basename(process.argv[1]);\n } catch {}\n }\n\n console.error(`\\n${chalk.red.bold(\"Error:\")} ${error.message}`);\n console.error(\n `\\n${chalk.dim(`Try '${commandNameToSuggest} --help' for usage details.`)}`,\n );\n\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(1 as never);\n } else {\n throw error;\n }\n }\n\n #_printRecursiveToConsole(\n parser: ArgParserBase,\n level: number,\n visited: Set<ArgParserBase> = new Set(),\n ): void {\n const indent = \" \".repeat(level);\n const subIndent = \" \".repeat(level + 1);\n const flagIndent = \" \".repeat(level + 2);\n\n console.log(\n `${indent}Parser: ${chalk.blueBright(parser.#subCommandName || parser.#appName)}`,\n );\n if (parser.#description) {\n console.log(`${subIndent}Description: ${parser.#description}`);\n }\n console.log(`${subIndent}Options:`);\n console.log(`${flagIndent}appName: ${parser.#appName}`);\n console.log(\n `${flagIndent}appCommandName: ${parser.#appCommandName ?? chalk.dim(\"undefined\")}`,\n );\n console.log(`${flagIndent}handleErrors: ${parser.#handleErrors}`);\n console.log(\n `${flagIndent}throwForDuplicateFlags: ${parser.#throwForDuplicateFlags}`,\n );\n console.log(\n `${flagIndent}inheritParentFlags: ${parser.#inheritParentFlags}`,\n );\n console.log(`${flagIndent}Handler Defined: ${!!parser.#handler}`);\n console.log(\n `${subIndent}Internal Params: ${JSON.stringify(parser.#parameters)}`,\n );\n\n const flags = parser.#flagManager.flags;\n if (flags.length > 0) {\n console.log(`${subIndent}Flags (${flags.length}):`);\n flags.forEach((flag: ProcessedFlag) => {\n console.log(`${flagIndent}* ${chalk.green(flag[\"name\"])}:`);\n console.log(`${flagIndent} Options: ${flag[\"options\"].join(\", \")}`);\n console.log(\n `${flagIndent} Description: ${Array.isArray(flag[\"description\"]) ? flag[\"description\"].join(\" | \") : flag[\"description\"]}`,\n );\n console.log(\n `${flagIndent} Type: ${typeof flag[\"type\"] === \"function\" ? flag[\"type\"].name || \"custom function\" : flag[\"type\"]}`,\n );\n console.log(\n `${flagIndent} Mandatory: ${typeof flag[\"mandatory\"] === \"function\" ? \"dynamic\" : (flag[\"mandatory\"] ?? false)}`,\n );\n console.log(\n `${flagIndent} Default: ${JSON.stringify(flag[\"defaultValue\"])}`,\n );\n console.log(`${flagIndent} Flag Only: ${flag[\"flagOnly\"]}`);\n console.log(`${flagIndent} Allow Multiple: ${flag[\"allowMultiple\"]}`);\n console.log(`${flagIndent} Allow Ligature: ${flag[\"allowLigature\"]}`);\n console.log(\n `${flagIndent} Enum: ${flag[\"enum\"] && flag[\"enum\"].length > 0 ? flag[\"enum\"].join(\", \") : \"none\"}`,\n );\n console.log(`${flagIndent} Validator Defined: ${!!flag[\"validate\"]}`);\n });\n } else {\n console.log(`${subIndent}Flags: ${chalk.dim(\"none\")}`);\n }\n\n const subCommandParsers = Array.from(parser.#subCommands.values());\n if (subCommandParsers.length > 0) {\n console.log(`${subIndent}Sub-Commands (${subCommandParsers.length}):`);\n subCommandParsers.forEach((subCommand: any) => {\n this.#_printRecursiveToConsole(subCommand.parser, level + 1, visited);\n });\n } else {\n console.log(`${subIndent}Sub-Commands: ${chalk.dim(\"none\")}`);\n }\n }\n\n #_buildRecursiveString(\n parser: ArgParserBase,\n level: number,\n visited = new Set<ArgParserBase>(),\n ): string {\n // Add visited set\n if (visited.has(parser)) return \"\"; // Prevent infinite loops for circular structures (if ever possible)\n visited.add(parser);\n\n let output = \"\";\n const indent = \" \".repeat(level);\n const subIndent = \" \".repeat(level + 1);\n const flagIndent = \" \".repeat(level + 2);\n\n const addLine = (line: string) => {\n output += line + \"\\\\n\";\n };\n\n addLine(\n `${indent}Parser: ${parser.#subCommandName || parser.#appName}`, // #appName is guaranteed\n );\n if (parser.#description) {\n addLine(`${subIndent}Description: ${parser.#description}`);\n }\n addLine(`${subIndent}Options:`);\n addLine(`${flagIndent}appName: ${parser.#appName}`);\n addLine(\n `${flagIndent}appCommandName: ${parser.#appCommandName ?? \"undefined\"}`,\n );\n addLine(`${flagIndent}handleErrors: ${parser.#handleErrors}`);\n addLine(\n `${flagIndent}throwForDuplicateFlags: ${parser.#throwForDuplicateFlags}`,\n );\n addLine(`${flagIndent}inheritParentFlags: ${parser.#inheritParentFlags}`);\n addLine(`${flagIndent}Handler Defined: ${!!parser.#handler}`);\n addLine(\n `${subIndent}Internal Params: ${JSON.stringify(parser.#parameters)}`,\n );\n\n const flags = parser.#flagManager.flags;\n if (flags.length > 0) {\n addLine(`${subIndent}Flags (${flags.length}):`);\n flags.forEach((flag: ProcessedFlag) => {\n addLine(`${flagIndent}* ${flag[\"name\"]}:`);\n addLine(`${flagIndent} Options: ${flag[\"options\"].join(\", \")}`);\n addLine(\n `${flagIndent} Description: ${Array.isArray(flag[\"description\"]) ? flag[\"description\"].join(\" | \") : flag[\"description\"]}`,\n );\n let typeName = \"unknown\";\n if (typeof flag[\"type\"] === \"function\") {\n typeName = flag[\"type\"].name || \"custom function\";\n } else if (typeof flag[\"type\"] === \"string\") {\n typeName = flag[\"type\"];\n } else if (typeof flag[\"type\"] === \"object\" && flag[\"type\"]) {\n try {\n typeName = (flag[\"type\"] as any).constructor?.name || \"object\";\n } catch {\n typeName = \"object\";\n }\n }\n addLine(`${flagIndent} Type: ${typeName}`);\n addLine(\n `${flagIndent} Mandatory: ${typeof flag[\"mandatory\"] === \"function\" ? \"dynamic\" : (flag[\"mandatory\"] ?? false)}`,\n );\n addLine(\n `${flagIndent} Default: ${JSON.stringify(flag[\"defaultValue\"])}`,\n );\n addLine(`${flagIndent} Flag Only: ${flag[\"flagOnly\"]}`);\n addLine(`${flagIndent} Allow Multiple: ${flag[\"allowMultiple\"]}`);\n addLine(`${flagIndent} Allow Ligature: ${flag[\"allowLigature\"]}`);\n addLine(\n `${flagIndent} Enum: ${flag[\"enum\"] && flag[\"enum\"].length > 0 ? flag[\"enum\"].join(\", \") : \"none\"}`,\n );\n addLine(`${flagIndent} Validator Defined: ${!!flag[\"validate\"]}`);\n });\n } else {\n addLine(`${subIndent}Flags: none`);\n }\n\n const subCommandParsers = Array.from(parser.#subCommands.values());\n if (subCommandParsers.length > 0) {\n addLine(`${subIndent}Sub-Commands (${subCommandParsers.length}):`);\n subCommandParsers.forEach((subCommand: any) => {\n output += this.#_buildRecursiveString(\n subCommand.parser,\n level + 1,\n visited,\n );\n });\n } else {\n addLine(`${subIndent}Sub-Commands: none`);\n }\n return output;\n }\n\n #_buildRecursiveJson(\n parser: ArgParserBase,\n visited = new Set<ArgParserBase>(),\n ): object {\n if (visited.has(parser))\n return {\n note: `Reference to already processed parser: ${parser.#subCommandName || parser.#appName}`,\n };\n visited.add(parser);\n\n const config: any = {\n parserName: parser.#subCommandName || parser.#appName, // #appName is guaranteed\n description: parser.#description,\n options: {\n appName: parser.#appName,\n appCommandName: parser.#appCommandName ?? undefined,\n handleErrors: parser.#handleErrors,\n throwForDuplicateFlags: parser.#throwForDuplicateFlags,\n inheritParentFlags: parser.#inheritParentFlags,\n },\n handlerDefined: !!parser.#handler,\n internalParams: parser.#parameters,\n flags: [],\n subCommands: {}, // Will be an object where keys are sub-command names\n };\n\n const flags = parser.#flagManager.flags;\n config.flags = flags.map((flag: ProcessedFlag) => {\n let typeName = \"unknown\";\n if (typeof flag[\"type\"] === \"function\") {\n typeName = flag[\"type\"].name || \"custom function\";\n } else if (typeof flag[\"type\"] === \"string\") {\n typeName = flag[\"type\"];\n } else if (typeof flag[\"type\"] === \"object\" && flag[\"type\"]) {\n try {\n typeName = (flag[\"type\"] as any).constructor?.name || \"object\";\n } catch {\n typeName = \"object\";\n }\n }\n\n return {\n name: flag[\"name\"],\n options: flag[\"options\"],\n description: flag[\"description\"],\n type: typeName,\n mandatory:\n typeof flag[\"mandatory\"] === \"function\"\n ? \"dynamic\"\n : (flag[\"mandatory\"] ?? false),\n defaultValue: flag[\"defaultValue\"],\n flagOnly: flag[\"flagOnly\"],\n allowMultiple: flag[\"allowMultiple\"],\n allowLigature: flag[\"allowLigature\"],\n enum: flag[\"enum\"],\n validatorDefined: !!flag[\"validate\"],\n };\n });\n\n const subCommands = Array.from(parser.#subCommands.values());\n if (subCommands.length > 0) {\n subCommands.forEach((sub: any) => {\n config.subCommands[sub.name] = this.#_buildRecursiveJson(\n sub.parser,\n visited,\n );\n });\n }\n\n return config;\n }\n\n /**\n * Generates a default environment file name based on the app name\n */\n #_generateDefaultEnvFileName(): string {\n let baseName = \"config\";\n\n if (this.#appCommandName) {\n baseName = this.#appCommandName;\n } else if (this.#appName && this.#appName !== \"Argument Parser\") {\n baseName = this.#appName;\n }\n\n // Convert to a safe filename format (PascalCase for .env files)\n baseName = baseName\n .split(/[\\s-_]+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join(\"\");\n\n return `${baseName}.env`;\n }\n\n\n\n /**\n * Handles the --s-save-to-env system flag at the final parser level\n */\n #_handleSaveToEnvFlag(processArgs: string[], parserChain: ArgParserBase[]): boolean {\n const saveToEnvIndex = processArgs.findIndex(arg => arg === \"--s-save-to-env\");\n if (saveToEnvIndex !== -1) {\n let filePath: string;\n\n // Check if a filename is provided\n if (saveToEnvIndex + 1 < processArgs.length) {\n const nextArg = processArgs[saveToEnvIndex + 1];\n if (nextArg && !nextArg.startsWith(\"-\")) {\n filePath = nextArg;\n } else {\n // No filename provided, auto-generate one\n filePath = this.#_generateDefaultEnvFileName();\n }\n } else {\n // No filename provided, auto-generate one\n filePath = this.#_generateDefaultEnvFileName();\n }\n\n try {\n this.#_saveToEnvFile(filePath, processArgs, parserChain);\n console.log(chalk.green(`Environment configuration saved to: ${filePath}`));\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(0);\n }\n return true;\n } catch (error) {\n console.error(chalk.red(`Error saving environment file: ${error instanceof Error ? error.message : String(error)}`));\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(1);\n }\n return true;\n }\n }\n return false;\n }\n\n /**\n * Saves the current parser's flags and their values to an environment file\n * in the specified format based on file extension.\n */\n #_saveToEnvFile(filePath: string, processArgs: string[], parserChain: ArgParserBase[]): void {\n // Determine file format based on extension\n const ext = path.extname(filePath).toLowerCase();\n let format: 'env' | 'yaml' | 'json' | 'toml';\n\n if (ext === '.yaml' || ext === '.yml') {\n format = 'yaml';\n } else if (ext === '.json' || ext === '.jsonc') {\n format = 'json';\n } else if (ext === '.toml' || ext === '.tml') {\n format = 'toml';\n } else {\n format = 'env'; // Default to .env format for no extension or unknown extensions\n }\n\n // Get all flags from the parser chain (current parser and inherited ones from parent chain)\n const allFlags: ProcessedFlag[] = [];\n const seenFlagNames = new Set<string>();\n\n // Start from the final parser (this) and work backwards through the chain\n // This ensures that the final parser's flags take precedence over parent flags\n for (let i = parserChain.length - 1; i >= 0; i--) {\n const parser = parserChain[i];\n for (const flag of parser.#flagManager.flags) {\n if (!seenFlagNames.has(flag[\"name\"])) {\n allFlags.push(flag);\n seenFlagNames.add(flag[\"name\"]);\n }\n }\n }\n\n const flags = allFlags;\n\n // Parse current arguments to see which flags are set\n const { parsedArgs } = this.#parseFlags(processArgs.filter(arg =>\n arg !== '--s-save-to-env' && arg !== filePath\n ));\n\n // Generate content based on format\n let content: string;\n switch (format) {\n case 'env':\n content = this.#_generateEnvFormat(flags, parsedArgs);\n break;\n case 'yaml':\n content = this.#_generateYamlFormat(flags, parsedArgs);\n break;\n case 'json':\n content = this.#_generateJsonFormat(flags, parsedArgs);\n break;\n case 'toml':\n content = this.#_generateTomlFormat(flags, parsedArgs);\n break;\n }\n\n // Ensure directory exists\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n // Write file\n fs.writeFileSync(filePath, content, 'utf8');\n }\n\n /**\n * Loads configuration from an environment file in various formats\n */\n #_loadEnvFile(filePath: string, parserChain: ArgParserBase[]): Record<string, any> {\n if (!fs.existsSync(filePath)) {\n throw new Error(`Configuration file not found: ${filePath}`);\n }\n\n // Determine file format based on extension\n const ext = path.extname(filePath).toLowerCase();\n let format: 'env' | 'yaml' | 'json' | 'toml';\n\n if (ext === '.yaml' || ext === '.yml') {\n format = 'yaml';\n } else if (ext === '.json' || ext === '.jsonc') {\n format = 'json';\n } else if (ext === '.toml' || ext === '.tml') {\n format = 'toml';\n } else {\n format = 'env'; // Default to .env format for no extension or unknown extensions\n }\n\n // Load and parse the file\n const fileContent = fs.readFileSync(filePath, 'utf8');\n let rawConfig: Record<string, any>;\n\n switch (format) {\n case 'env':\n rawConfig = this.#_parseEnvFile(fileContent);\n break;\n case 'yaml':\n rawConfig = this.#_parseYamlFile(fileContent);\n break;\n case 'json':\n rawConfig = this.#_parseJsonFile(fileContent);\n break;\n case 'toml':\n rawConfig = this.#_parseTomlFile(fileContent);\n break;\n }\n\n // Convert the raw configuration to match flag names and types\n return this.#_convertConfigToFlagValues(rawConfig, parserChain);\n }\n\n /**\n * Parses .env file content using dotenv\n */\n #_parseEnvFile(content: string): Record<string, any> {\n const parsed = dotenv.parse(content);\n const result: Record<string, any> = {};\n\n // Convert environment variable names back to flag names\n for (const [envKey, envValue] of Object.entries(parsed)) {\n // Convert UPPER_CASE_WITH_UNDERSCORES back to lowercase-with-dashes\n const flagName = envKey.toLowerCase().replace(/_/g, '-');\n\n // Parse the value based on its content\n if (envValue === 'true') {\n result[flagName] = true;\n } else if (envValue === 'false') {\n result[flagName] = false;\n } else if (/^-?\\d+$/.test(envValue)) {\n result[flagName] = parseInt(envValue, 10);\n } else if (/^-?\\d*\\.\\d+$/.test(envValue)) {\n result[flagName] = parseFloat(envValue);\n } else if (envValue.includes(',')) {\n // Handle comma-separated arrays\n result[flagName] = envValue.split(',').map(v => v.trim());\n } else {\n result[flagName] = envValue;\n }\n }\n\n return result;\n }\n\n /**\n * Parses YAML file content\n */\n #_parseYamlFile(content: string): Record<string, any> {\n const parsed = yaml.load(content) as any;\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('YAML file must contain an object at the root level');\n }\n\n // Remove metadata if present\n const { _meta, ...config } = parsed;\n return config;\n }\n\n /**\n * Parses JSON file content\n */\n #_parseJsonFile(content: string): Record<string, any> {\n const parsed = JSON.parse(content);\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('JSON file must contain an object at the root level');\n }\n\n // Remove metadata if present\n const { _meta, ...config } = parsed;\n return config;\n }\n\n /**\n * Parses TOML file content\n */\n #_parseTomlFile(content: string): Record<string, any> {\n const parsed = toml.parse(content);\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('TOML file must contain an object at the root level');\n }\n\n return parsed;\n }\n\n /**\n * Converts raw configuration values to match flag types and validates them\n */\n #_convertConfigToFlagValues(rawConfig: Record<string, any>, parserChain: ArgParserBase[]): Record<string, any> {\n const result: Record<string, any> = {};\n\n // Get all flags from the parser chain\n const allFlags: ProcessedFlag[] = [];\n const seenFlagNames = new Set<string>();\n\n // Start from the final parser and work backwards through the chain\n for (let i = parserChain.length - 1; i >= 0; i--) {\n const parser = parserChain[i];\n for (const flag of parser.#flagManager.flags) {\n if (!seenFlagNames.has(flag[\"name\"])) {\n allFlags.push(flag);\n seenFlagNames.add(flag[\"name\"]);\n }\n }\n }\n\n // Convert and validate each configuration value\n for (const [configKey, configValue] of Object.entries(rawConfig)) {\n const flag = allFlags.find(f => f[\"name\"] === configKey);\n\n if (!flag) {\n console.warn(chalk.yellow(`Warning: Configuration key '${configKey}' does not match any known flag. Ignoring.`));\n continue;\n }\n\n try {\n const convertedValue = this.#_convertValueToFlagType(configValue, flag);\n result[configKey] = convertedValue;\n } catch (error) {\n console.error(chalk.red(`Error converting configuration value for '${configKey}': ${error instanceof Error ? error.message : String(error)}`));\n if (typeof process === \"object\" && typeof process.exit === \"function\") {\n process.exit(1);\n }\n }\n }\n\n return result;\n }\n\n /**\n * Converts a configuration value to match the expected flag type\n */\n #_convertValueToFlagType(value: any, flag: ProcessedFlag): any {\n const flagType = flag[\"type\"];\n\n // Handle null/undefined\n if (value === null || value === undefined) {\n return value;\n }\n\n // Handle array flags first (before type-specific handling)\n if (flagType === Array || flag[\"allowMultiple\"]) {\n if (Array.isArray(value)) return value;\n if (typeof value === 'string') {\n // Split comma-separated values\n return value.split(',').map(v => v.trim());\n }\n return [value];\n }\n\n // Handle boolean flags\n if (flagType === Boolean) {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') {\n const lowerValue = value.toLowerCase();\n if (lowerValue === 'true' || lowerValue === '1' || lowerValue === 'yes') return true;\n if (lowerValue === 'false' || lowerValue === '0' || lowerValue === 'no') return false;\n }\n throw new Error(`Cannot convert '${value}' to boolean for flag '${flag[\"name\"]}'`);\n }\n\n // Handle string flags\n if (flagType === String) {\n return String(value);\n }\n\n // Handle number flags\n if (flagType === Number) {\n const numValue = Number(value);\n if (isNaN(numValue)) {\n throw new Error(`Cannot convert '${value}' to number for flag '${flag[\"name\"]}'`);\n }\n return numValue;\n }\n\n // Handle enum validation\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) {\n if (!flag[\"enum\"].includes(value)) {\n throw new Error(`Value '${value}' is not allowed for flag '${flag[\"name\"]}'. Allowed values: ${flag[\"enum\"].join(', ')}`);\n }\n }\n\n return value;\n }\n\n /**\n * Merges environment configuration with command line arguments\n * CLI arguments take precedence over file configuration\n */\n #_mergeEnvConfigWithArgs(envConfig: Record<string, any>, processArgs: string[]): string[] {\n const result = [...processArgs];\n\n // Remove --s-with-env and its file path from the arguments\n const withEnvIndex = result.findIndex(arg => arg === \"--s-with-env\");\n if (withEnvIndex !== -1) {\n result.splice(withEnvIndex, 2); // Remove both --s-with-env and the file path\n }\n\n // Convert environment configuration to command line arguments\n // Only add flags that are not already present in the command line\n const existingFlags = new Set<string>();\n\n // Identify existing flags in command line arguments\n for (let i = 0; i < result.length; i++) {\n const arg = result[i];\n if (arg.startsWith('-')) {\n existingFlags.add(arg);\n // Also handle ligature format (--flag=value)\n if (arg.includes('=')) {\n const flagPart = arg.split('=')[0];\n existingFlags.add(flagPart);\n }\n }\n }\n\n // Add environment configuration as command line arguments\n for (const [flagName, flagValue] of Object.entries(envConfig)) {\n const longFlag = `--${flagName}`;\n\n // Skip if flag is already present in command line\n if (existingFlags.has(longFlag)) {\n continue;\n }\n\n // Add the flag and its value\n if (typeof flagValue === 'boolean') {\n if (flagValue) {\n result.push(longFlag);\n }\n // Don't add false boolean flags\n } else if (Array.isArray(flagValue)) {\n // Add multiple values for array flags\n for (const item of flagValue) {\n result.push(longFlag, String(item));\n }\n } else {\n result.push(longFlag, String(flagValue));\n }\n }\n\n return result;\n }\n\n /**\n * Generates environment file content in Bash .env format\n */\n #_generateEnvFormat(flags: ProcessedFlag[], parsedArgs: TParsedArgs<any>): string {\n const lines: string[] = [];\n lines.push('# Environment configuration generated by ArgParser');\n lines.push('# Format: Bash .env style');\n lines.push('');\n\n for (const flag of flags) {\n if (flag[\"name\"] === 'help') continue; // Skip help flag\n\n const flagValue = parsedArgs[flag[\"name\"]];\n const isSet = flagValue !== undefined && flagValue !== null;\n const isMandatory = typeof flag[\"mandatory\"] === 'function' ? false : (flag[\"mandatory\"] ?? false);\n\n // Add comment with flag information\n lines.push(`# ${flag[\"name\"]}: ${Array.isArray(flag[\"description\"]) ? flag[\"description\"].join(' | ') : flag[\"description\"]}`);\n lines.push(`# Options: ${flag[\"options\"].join(', ')}`);\n lines.push(`# Type: ${this.#_getTypeString(flag[\"type\"])}`);\n if (flag[\"defaultValue\"] !== undefined) {\n lines.push(`# Default: ${JSON.stringify(flag[\"defaultValue\"])}`);\n }\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) {\n lines.push(`# Allowed values: ${flag[\"enum\"].join(', ')}`);\n }\n\n // Generate the environment variable line\n const envVarName = flag[\"name\"].toUpperCase().replace(/[^A-Z0-9_]/g, '_');\n let envValue = '';\n\n if (isSet) {\n if (Array.isArray(flagValue)) {\n envValue = flagValue.join(',');\n } else if (typeof flagValue === 'boolean') {\n envValue = flagValue ? 'true' : 'false';\n } else {\n envValue = String(flagValue);\n }\n lines.push(`${envVarName}=\"${envValue}\"`);\n } else {\n // Comment out unset optional flags\n const defaultVal = flag[\"defaultValue\"] !== undefined ? String(flag[\"defaultValue\"]) : '';\n const prefix = isMandatory ? '' : '# ';\n lines.push(`${prefix}${envVarName}=\"${defaultVal}\"`);\n }\n\n lines.push(''); // Empty line between flags\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Generates environment file content in YAML format\n */\n #_generateYamlFormat(flags: ProcessedFlag[], parsedArgs: TParsedArgs<any>): string {\n const config: any = {};\n const comments: string[] = [];\n\n comments.push('# Environment configuration generated by ArgParser');\n comments.push('# Format: YAML');\n comments.push('');\n\n for (const flag of flags) {\n if (flag[\"name\"] === 'help') continue; // Skip help flag\n\n const flagValue = parsedArgs[flag[\"name\"]];\n const isSet = flagValue !== undefined && flagValue !== null;\n const isMandatory = typeof flag[\"mandatory\"] === 'function' ? false : (flag[\"mandatory\"] ?? false);\n\n // Add flag information as comments\n comments.push(`# ${flag[\"name\"]}: ${Array.isArray(flag[\"description\"]) ? flag[\"description\"].join(' | ') : flag[\"description\"]}`);\n comments.push(`# Options: ${flag[\"options\"].join(', ')}`);\n comments.push(`# Type: ${this.#_getTypeString(flag[\"type\"])}`);\n if (flag[\"defaultValue\"] !== undefined) {\n comments.push(`# Default: ${JSON.stringify(flag[\"defaultValue\"])}`);\n }\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) {\n comments.push(`# Allowed values: ${flag[\"enum\"].join(', ')}`);\n }\n\n if (isSet) {\n config[flag[\"name\"]] = flagValue;\n } else if (isMandatory) {\n config[flag[\"name\"]] = flag[\"defaultValue\"] !== undefined ? flag[\"defaultValue\"] : null;\n }\n // Optional unset flags are omitted from YAML but documented in comments\n\n comments.push('');\n }\n\n const yamlContent = yaml.dump(config, {\n indent: 2,\n lineWidth: -1,\n noRefs: true,\n sortKeys: true\n });\n\n return comments.join('\\n') + '\\n' + yamlContent;\n }\n\n /**\n * Generates environment file content in JSON format\n */\n #_generateJsonFormat(flags: ProcessedFlag[], parsedArgs: TParsedArgs<any>): string {\n const config: any = {};\n const metadata: any = {\n _meta: {\n generated_by: 'ArgParser',\n format: 'JSON',\n flags_info: {}\n }\n };\n\n for (const flag of flags) {\n if (flag[\"name\"] === 'help') continue; // Skip help flag\n\n const flagValue = parsedArgs[flag[\"name\"]];\n const isSet = flagValue !== undefined && flagValue !== null;\n const isMandatory = typeof flag[\"mandatory\"] === 'function' ? false : (flag[\"mandatory\"] ?? false);\n\n // Store flag metadata\n metadata._meta.flags_info[flag[\"name\"]] = {\n description: Array.isArray(flag[\"description\"]) ? flag[\"description\"].join(' | ') : flag[\"description\"],\n options: flag[\"options\"],\n type: this.#_getTypeString(flag[\"type\"]),\n mandatory: isMandatory,\n defaultValue: flag[\"defaultValue\"],\n enum: flag[\"enum\"] && flag[\"enum\"].length > 0 ? flag[\"enum\"] : undefined\n };\n\n if (isSet) {\n config[flag[\"name\"]] = flagValue;\n } else if (isMandatory) {\n config[flag[\"name\"]] = flag[\"defaultValue\"] !== undefined ? flag[\"defaultValue\"] : null;\n }\n // Optional unset flags are omitted but documented in metadata\n }\n\n const result = { ...metadata, ...config };\n return JSON.stringify(result, null, 2);\n }\n\n /**\n * Generates environment file content in TOML format\n */\n #_generateTomlFormat(flags: ProcessedFlag[], parsedArgs: TParsedArgs<any>): string {\n const config: any = {};\n const lines: string[] = [];\n\n lines.push('# Environment configuration generated by ArgParser');\n lines.push('# Format: TOML');\n lines.push('');\n\n for (const flag of flags) {\n if (flag[\"name\"] === 'help') continue; // Skip help flag\n\n const flagValue = parsedArgs[flag[\"name\"]];\n const isSet = flagValue !== undefined && flagValue !== null;\n const isMandatory = typeof flag[\"mandatory\"] === 'function' ? false : (flag[\"mandatory\"] ?? false);\n\n // Add flag information as comments\n lines.push(`# ${flag[\"name\"]}: ${Array.isArray(flag[\"description\"]) ? flag[\"description\"].join(' | ') : flag[\"description\"]}`);\n lines.push(`# Options: ${flag[\"options\"].join(', ')}`);\n lines.push(`# Type: ${this.#_getTypeString(flag[\"type\"])}`);\n if (flag[\"defaultValue\"] !== undefined) {\n lines.push(`# Default: ${JSON.stringify(flag[\"defaultValue\"])}`);\n }\n if (flag[\"enum\"] && flag[\"enum\"].length > 0) {\n lines.push(`# Allowed values: ${flag[\"enum\"].join(', ')}`);\n }\n\n if (isSet) {\n config[flag[\"name\"]] = flagValue;\n } else if (isMandatory) {\n config[flag[\"name\"]] = flag[\"defaultValue\"] !== undefined ? flag[\"defaultValue\"] : null;\n }\n // Optional unset flags are omitted from TOML but documented in comments\n\n lines.push('');\n }\n\n const tomlContent = toml.stringify(config);\n return lines.join('\\n') + '\\n' + tomlContent;\n }\n\n /**\n * Helper method to get a string representation of a flag's type\n */\n #_getTypeString(type: any): string {\n if (typeof type === 'function') {\n return type.name || 'custom function';\n } else if (typeof type === 'string') {\n return type;\n } else if (typeof type === 'object' && type) {\n try {\n return (type as any).constructor?.name || 'object';\n } catch {\n return 'object';\n }\n }\n return 'unknown';\n }\n}\n","import { z } from \"zod\";\nimport type { ZodRawShape, ZodTypeAny } from \"zod\";\nimport { ArgParserBase } from \"./ArgParserBase\";\nimport type { IFlag, IHandlerContext, ProcessedFlag, TParsedArgs } from \"./\";\n\n// Assuming these types are correctly exported from src/index.ts\n\n// Structural type for what MCP server.tool() expects\nexport interface IMcpToolStructure {\n name: string;\n description?: string;\n inputSchema: ZodTypeAny;\n outputSchema?: ZodTypeAny;\n execute: (args: any) => Promise<any>;\n}\n\nfunction mapArgParserFlagToZodSchema(flag: IFlag | ProcessedFlag): ZodTypeAny {\n let zodSchema: ZodTypeAny;\n const flagTypeOpt = flag[\"type\"];\n let typeName: string;\n\n if (typeof flagTypeOpt === \"function\") {\n typeName = flagTypeOpt.name.toLowerCase().replace(\"constructor\", \"\");\n } else {\n typeName = String(flagTypeOpt).toLowerCase();\n }\n\n const flagEnum = flag[\"enum\"];\n const allowMultiple = flag[\"allowMultiple\"];\n\n // Handle array flags (allowMultiple: true)\n if (allowMultiple) {\n let itemSchema: ZodTypeAny;\n\n if (flagEnum && Array.isArray(flagEnum) && flagEnum.length > 0) {\n if (flagEnum.every((e) => typeof e === \"string\")) {\n itemSchema = z.enum(flagEnum as [string, ...string[]]);\n } else if (flagEnum.every((e) => typeof e === \"number\")) {\n const literalSchemas = flagEnum.map((val) => z.literal(val));\n if (literalSchemas.length === 1) {\n itemSchema = literalSchemas[0];\n } else {\n itemSchema = z.union(\n literalSchemas as unknown as [\n ZodTypeAny,\n ZodTypeAny,\n ...ZodTypeAny[],\n ],\n );\n }\n } else {\n itemSchema = z.string();\n }\n } else {\n // Default item type based on flag type\n switch (typeName) {\n case \"number\":\n itemSchema = z.number();\n break;\n case \"boolean\":\n itemSchema = z.boolean();\n break;\n default:\n itemSchema = z.string();\n break;\n }\n }\n\n zodSchema = z.array(itemSchema);\n } else {\n // Handle non-array flags\n switch (typeName) {\n case \"string\":\n zodSchema =\n flagEnum &&\n Array.isArray(flagEnum) &&\n flagEnum.length > 0 &&\n flagEnum.every((e) => typeof e === \"string\")\n ? z.enum(flagEnum as [string, ...string[]])\n : z.string();\n break;\n case \"number\":\n if (\n flagEnum &&\n Array.isArray(flagEnum) &&\n flagEnum.length > 0 &&\n flagEnum.every((e) => typeof e === \"number\")\n ) {\n const literalSchemas = flagEnum.map((val) => z.literal(val));\n if (literalSchemas.length === 1) {\n zodSchema = literalSchemas[0];\n } else if (literalSchemas.length >= 2) {\n zodSchema = z.union(\n literalSchemas as unknown as [\n ZodTypeAny,\n ZodTypeAny,\n ...ZodTypeAny[],\n ],\n );\n } else {\n zodSchema = z.number();\n }\n } else {\n zodSchema = z.number();\n }\n break;\n case \"boolean\":\n zodSchema = z.boolean();\n break;\n case \"array\":\n const itemSchema =\n flagEnum &&\n Array.isArray(flagEnum) &&\n flagEnum.length > 0 &&\n flagEnum.every((e) => typeof e === \"string\")\n ? z.enum(flagEnum as [string, ...string[]])\n : z.string(); // Default item type for arrays\n zodSchema = z.array(itemSchema);\n break;\n case \"object\":\n zodSchema = z.record(z.string(), z.any());\n break;\n default:\n console.warn(\n `[MCP Integration] Flag '${flag[\"name\"]}' has an unknown type '${typeName}'. Defaulting to z.string().`,\n );\n zodSchema = z.string();\n break;\n }\n }\n\n const description = flag[\"description\"];\n if (description) {\n zodSchema = zodSchema.describe(\n Array.isArray(description) ? description.join(\"\\n\") : description,\n );\n }\n\n const defaultValue = flag[\"defaultValue\"];\n if (defaultValue !== undefined) {\n zodSchema = zodSchema.default(defaultValue);\n } else if (!flag[\"mandatory\"]) {\n zodSchema = zodSchema.optional();\n }\n return zodSchema;\n}\n\nexport interface GenerateMcpToolsOptions {\n outputSchemaMap?: Record<string, ZodTypeAny>;\n defaultOutputSchema?: ZodTypeAny;\n generateToolName?: (commandPath: string[], appName?: string) => string;\n includeSubCommands?: boolean;\n toolNamePrefix?: string;\n toolNameSuffix?: string;\n}\n\ninterface ISpecialParseResultProps {\n $commandChain?: string[];\n $error?: { type: string; message: string; details?: any };\n handlerResponse?: any;\n}\nexport type IParseExecutionResult = TParsedArgs<ProcessedFlag[]> &\n ISpecialParseResultProps;\n\nexport function generateMcpToolsFromArgParser(\n rootParser: ArgParserBase,\n options?: GenerateMcpToolsOptions,\n): IMcpToolStructure[] {\n const tools: IMcpToolStructure[] = [];\n const visitedParsers = new Set<ArgParserBase>();\n\n function buildToolsRecursively(\n currentParser: ArgParserBase,\n commandPathParts: string[],\n ) {\n if (visitedParsers.has(currentParser)) return;\n visitedParsers.add(currentParser);\n\n const typedRootParser = rootParser as any;\n const typedCurrentParser = currentParser as any;\n\n const appName = typedRootParser.getAppName\n ? typedRootParser.getAppName()\n : typedRootParser[\"#appName\"];\n const currentParserDescription = typedCurrentParser.getDescription\n ? typedCurrentParser.getDescription()\n : typedCurrentParser[\"#description\"];\n const currentParserHandler = typedCurrentParser.getHandler\n ? typedCurrentParser.getHandler()\n : typedCurrentParser[\"#handler\"];\n\n\n\n // ArgParser.ts (line 196) has a public getter `get flags()`\n const currentParserFlags = typedCurrentParser.flags as (\n | IFlag\n | ProcessedFlag\n )[];\n\n const subCommandsMap = typedCurrentParser.getSubCommands\n ? typedCurrentParser.getSubCommands()\n : typedCurrentParser[\"#subCommands\"];\n const currentParserSubCommands = subCommandsMap\n ? Array.from(subCommandsMap.values())\n : [];\n\n let currentParserCommandName = typedCurrentParser.getAppCommandName\n ? typedCurrentParser.getAppCommandName()\n : typedCurrentParser[\"#appCommandName\"];\n if (!currentParserCommandName && currentParser !== rootParser) {\n currentParserCommandName = typedCurrentParser.getSubCommandName\n ? typedCurrentParser.getSubCommandName()\n : typedCurrentParser[\"#subCommandName\"];\n }\n\n // For sub-commands, prefer the command path over the inherited command name\n if (currentParser !== rootParser && commandPathParts.length > 0) {\n currentParserCommandName = commandPathParts[commandPathParts.length - 1];\n }\n const currentParserCommandNameOrAppName =\n currentParserCommandName || appName;\n\n const effectiveCommandName =\n currentParserCommandName ||\n (commandPathParts.length > 0\n ? commandPathParts[commandPathParts.length - 1]\n : appName);\n\n\n\n let toolName: string;\n if (options?.generateToolName) {\n toolName = options.generateToolName(commandPathParts, appName);\n } else {\n // For root parser, use the command name directly\n if (currentParser === rootParser) {\n toolName = currentParserCommandNameOrAppName || appName || \"root_cmd\";\n } else {\n // For sub-parsers, use the effective command name or the last part of the path\n toolName = effectiveCommandName || \"cmd\";\n }\n\n // Clean up the tool name\n toolName = toolName.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n }\n if (!toolName)\n toolName = currentParser === rootParser && appName ? appName : \"cmd\";\n\n // Apply prefix and suffix if provided\n if (options?.toolNamePrefix) {\n toolName = options.toolNamePrefix + toolName;\n }\n if (options?.toolNameSuffix) {\n toolName = toolName + options.toolNameSuffix;\n }\n\n if (currentParserHandler) {\n const flags = currentParserFlags as ProcessedFlag[];\n const zodProperties: ZodRawShape = {};\n const hasHelpFlag = flags.some(flag => flag[\"name\"] === \"help\");\n\n for (const flag of flags) {\n let flagSchema = mapArgParserFlagToZodSchema(flag);\n\n // If there's a help flag, make mandatory fields optional to allow help to work\n // This is necessary because MCP SDK validates the schema before our execute function runs\n if (hasHelpFlag && flag[\"name\"] !== \"help\" && flag[\"mandatory\"]) {\n flagSchema = flagSchema.optional();\n }\n\n zodProperties[flag[\"name\"]] = flagSchema;\n }\n const inputSchema = z.object(zodProperties);\n\n let outputSchema: ZodTypeAny | undefined;\n\n if (options?.outputSchemaMap && options.outputSchemaMap[toolName]) {\n const customSchema = options.outputSchemaMap[toolName];\n outputSchema =\n typeof customSchema === \"object\" && !customSchema._def\n ? z.object(customSchema as unknown as ZodRawShape)\n : customSchema;\n } else if (options?.defaultOutputSchema) {\n outputSchema = options.defaultOutputSchema;\n }\n\n\n\n const tool: IMcpToolStructure = {\n name: toolName,\n description:\n currentParserDescription || `Executes the ${toolName} command.`,\n inputSchema: inputSchema,\n outputSchema: outputSchema,\n async execute(mcpInputArgs: Record<string, any>) {\n // Check if help is requested first, before any other processing\n if (mcpInputArgs['help'] === true) {\n // Generate help text for the specific command path\n let helpParser = rootParser;\n const pathParts = [...commandPathParts];\n\n // Navigate to the correct parser for help\n for (const part of pathParts) {\n const subCmd = (helpParser as any).getSubCommand ? (helpParser as any).getSubCommand(part) : undefined;\n if (subCmd && subCmd.parser) {\n helpParser = subCmd.parser;\n } else {\n break;\n }\n }\n\n const helpText = (helpParser as any).helpText ? (helpParser as any).helpText() : \"Help not available\";\n\n if (options?.outputSchemaMap?.[toolName]) {\n return {\n success: true,\n help: helpText,\n files: [],\n commandExecuted: null,\n stderrOutput: null,\n };\n }\n return { success: true, message: helpText };\n }\n\n // The ArgParser will handle validation based on its flag definitions during parse.\n // The MCP Server uses these Zod schemas directly.\n const argv: string[] = [...commandPathParts];\n const parserFlags = currentParserFlags as ProcessedFlag[];\n\n for (const flagDef of parserFlags) {\n const flagName = flagDef[\"name\"];\n if (mcpInputArgs.hasOwnProperty(flagName)) {\n const value = mcpInputArgs[flagName];\n const flagType = flagDef[\"type\"];\n const flagOptions = flagDef[\"options\"];\n const isFlagOnly = flagDef[\"flagOnly\"];\n const allowMultiple = flagDef[\"allowMultiple\"];\n let flagTypeName =\n typeof flagType === \"function\"\n ? flagType.name.toLowerCase().replace(\"constructor\", \"\")\n : String(flagType).toLowerCase();\n\n argv.push(flagOptions[0]);\n\n if (flagTypeName === \"boolean\") {\n if (value === true && isFlagOnly === false)\n argv.push(String(value));\n else if (value === false && isFlagOnly === false)\n argv.push(String(value));\n } else if (flagTypeName === \"array\") {\n if (Array.isArray(value)) {\n if (allowMultiple) {\n const originalArgvLength = argv.length;\n value.forEach((item) => {\n argv.push(flagOptions[0]);\n argv.push(String(item));\n });\n if (\n value.length > 0 &&\n argv[originalArgvLength - 1] === flagOptions[0]\n ) {\n argv.splice(originalArgvLength - 1, 1);\n }\n } else {\n argv.push(value.join(\",\"));\n }\n } else if (value != null) argv.push(String(value));\n } else if (value !== null && value !== undefined)\n argv.push(String(value));\n }\n }\n\n try {\n // ArgParser instance (rootParser) should be configured with handleErrors: false in its constructor.\n const parseResult = (await rootParser.parse(\n argv,\n )) as IParseExecutionResult;\n\n if (parseResult[\"$error\"]) {\n const errorDetails = parseResult[\"$error\"]!;\n const errPayload = {\n message: `Cmd error: ${errorDetails.type} - ${errorDetails.message}`,\n details: errorDetails.details,\n };\n if (options?.outputSchemaMap?.[toolName]) {\n // Return structured data directly when custom output schema is defined\n return {\n error: errPayload.message,\n files: [],\n commandExecuted: null,\n stderrOutput: errPayload.details?.stderr || null,\n };\n }\n return {\n success: false,\n message: errPayload.message,\n data: errPayload.details,\n };\n }\n\n let handlerResponse = parseResult[\"handlerResponse\"];\n if (handlerResponse === undefined && parseResult[\"$commandChain\"]) {\n let finalParser: ArgParserBase | undefined = rootParser;\n let currentArgs: Record<string, any> = { ...parseResult };\n let resolvedParentArgs: Record<string, any> | undefined =\n undefined;\n const chain = parseResult[\"$commandChain\"]!;\n\n for (let i = 0; i < chain.length; i++) {\n const cmdName = chain[i];\n // Use ArgParser's public getSubCommand method\n const subCmdInfo = finalParser?.getSubCommand\n ? finalParser.getSubCommand(cmdName)\n : undefined;\n\n if (subCmdInfo && subCmdInfo.parser) {\n resolvedParentArgs = { ...currentArgs };\n currentArgs = currentArgs[cmdName] || {};\n finalParser = subCmdInfo.parser as ArgParserBase;\n } else if (\n i === 0 &&\n finalParser &&\n cmdName ===\n ((finalParser as any).getAppCommandName\n ? (finalParser as any).getAppCommandName()\n : (finalParser as any)[\"#appCommandName\"] ||\n ((finalParser as any).getAppName\n ? (finalParser as any).getAppName()\n : (finalParser as any)[\"#appName\"]))\n ) {\n currentArgs = { ...parseResult };\n break;\n } else {\n finalParser = undefined;\n break;\n }\n }\n\n const finalParserTyped = finalParser as any;\n const finalHandler = finalParserTyped.getHandler\n ? finalParserTyped.getHandler()\n : finalParserTyped[\"#handler\"];\n if (finalParser && finalHandler) {\n const handlerToCall = finalHandler as Function;\n const handlerContext: IHandlerContext<any, any> = {\n args: currentArgs,\n commandChain: chain,\n parser: finalParser,\n parentArgs: resolvedParentArgs,\n };\n try {\n handlerResponse = await handlerToCall(handlerContext);\n } catch (handlerError: any) {\n const errorMsg = `Handler error: ${handlerError.message || String(handlerError)}`;\n if (options?.outputSchemaMap?.[toolName]) {\n // Return an object matching the expected output schema with error populated\n return {\n error: errorMsg,\n files: [],\n commandExecuted: null,\n stderrOutput: null,\n };\n }\n return { success: false, message: errorMsg };\n }\n }\n }\n\n if (options?.outputSchemaMap?.[toolName]) {\n // Return structured data directly when custom output schema is defined\n return handlerResponse;\n }\n return { success: true, data: handlerResponse };\n } catch (e: any) {\n // Check if this is a handler error that was thrown due to handleErrors: false\n // In this case, we want to format it consistently with the $error handling above\n let errorMsg: string;\n let errorDetails: any = e;\n\n if (e instanceof Error && e.message) {\n // This is likely a handler error thrown when handleErrors: false\n errorMsg = `Cmd error: handler_error - ${e.message}`;\n errorDetails = { details: e };\n } else {\n // Other types of errors (parsing errors, etc.)\n errorMsg = `MCP tool exec failed: ${e.message || String(e)}`;\n }\n\n if (options?.outputSchemaMap?.[toolName]) {\n // Return an object matching the expected output schema with error populated\n return {\n error: errorMsg,\n files: [],\n commandExecuted: null,\n stderrOutput: errorDetails?.stderr || null,\n };\n }\n return {\n success: false,\n message: errorMsg,\n data: errorDetails\n };\n }\n },\n };\n tools.push(tool);\n }\n\n const subCommands = currentParserSubCommands;\n if (subCommands && (options?.includeSubCommands !== false)) {\n for (const subCmdObj of subCommands) {\n // Skip MCP server sub-commands to avoid infinite recursion\n if ((subCmdObj as any).isMcp === true) {\n continue;\n }\n\n const nextPathParts = [...commandPathParts, (subCmdObj as any).name];\n buildToolsRecursively(\n (subCmdObj as any).parser as ArgParserBase,\n nextPathParts.filter((p) => p),\n );\n }\n }\n }\n buildToolsRecursively(rootParser, []);\n return tools;\n}\n","import { ArgParserBase } from \"./ArgParserBase\";\nimport {\n generateMcpToolsFromArgParser,\n} from \"./mcp-integration\";\nimport type { GenerateMcpToolsOptions, IMcpToolStructure } from \"./mcp-integration\";\nimport type { IHandlerContext } from \"./types\";\n\n/**\n * Configuration for a single MCP transport\n */\nexport type McpTransportConfig = {\n type: \"stdio\" | \"sse\" | \"streamable-http\";\n port?: number;\n host?: string;\n path?: string;\n sessionIdGenerator?: () => string;\n};\n\n/**\n * Configuration options for MCP sub-command\n */\nexport type McpSubCommandOptions = {\n /** Preset transport configurations to use when no CLI flags are provided */\n defaultTransports?: McpTransportConfig[];\n /** Single preset transport configuration (alternative to defaultTransports) */\n defaultTransport?: McpTransportConfig;\n};\n\n/**\n * ArgParser with Model Context Protocol (MCP) integration capabilities.\n *\n * This class adds MCP server functionality on top of the standard ArgParser,\n * allowing CLI tools to be easily exposed as MCP tools with minimal boilerplate.\n *\n * @example\n * ```typescript\n * const parser = new ArgParser({\n * appName: \"My CLI\",\n * appCommandName: \"my-cli\",\n * handler: async (ctx) => ({ result: \"success\" })\n * })\n * .addFlags([...])\n * .addMcpSubCommand(\"serve\", {\n * name: \"my-cli-mcp-server\",\n * version: \"1.0.0\"\n * });\n * ```\n */\nexport class ArgParser<\n THandlerReturn = any,\n> extends ArgParserBase<THandlerReturn> {\n /**\n * Generate MCP tools from this ArgParser instance\n * @param options Optional configuration for MCP tool generation\n * @returns Array of MCP tool structures ready for server registration\n */\n public toMcpTools(options?: GenerateMcpToolsOptions): IMcpToolStructure[] {\n return generateMcpToolsFromArgParser(this, options);\n }\n\n /**\n * Create an MCP server with tools generated from this ArgParser\n * @param serverInfo Server configuration\n * @param toolOptions Optional MCP tool generation options\n * @returns Configured MCP server instance\n */\n public createMcpServer(\n serverInfo: {\n name: string;\n version: string;\n description?: string;\n },\n toolOptions?: GenerateMcpToolsOptions,\n ): any {\n // Dynamic import to avoid circular dependencies\n const { McpServer } = require(\"@modelcontextprotocol/sdk/server/mcp.js\");\n\n const server = new McpServer({\n id: serverInfo.name,\n version: serverInfo.version,\n name: serverInfo.name,\n description: serverInfo.description,\n });\n\n const tools = this.toMcpTools(toolOptions);\n\n // Deduplicate tools by name to avoid registration conflicts\n const uniqueTools = tools.reduce((acc, tool) => {\n if (!acc.find((t) => t.name === tool.name)) {\n acc.push(tool);\n }\n return acc;\n }, [] as IMcpToolStructure[]);\n\n uniqueTools.forEach((tool) => {\n const toolConfig: any = {\n description: tool.description || \"No description provided.\",\n inputSchema: (tool.inputSchema as any).shape || tool.inputSchema,\n };\n\n if (tool.outputSchema) {\n toolConfig.outputSchema = (tool.outputSchema as any).shape || tool.outputSchema;\n }\n\n server.registerTool(tool.name, toolConfig, tool.execute);\n });\n\n return server;\n }\n\n /**\n * Start an MCP server using stdio transport\n * @param serverInfo Server configuration\n * @param toolOptions Optional MCP tool generation options\n * @returns Promise that resolves when server is connected\n */\n public async startMcpServer(\n serverInfo: {\n name: string;\n version: string;\n description?: string;\n },\n toolOptions?: GenerateMcpToolsOptions,\n ): Promise<void> {\n return this.startMcpServerWithTransport(serverInfo, \"stdio\", {}, toolOptions);\n }\n\n /**\n * Start an MCP server with multiple transport types simultaneously\n * @param serverInfo Server configuration\n * @param transports Array of transport configurations\n * @param toolOptions Optional MCP tool generation options\n * @returns Promise that resolves when all servers are started\n */\n public async startMcpServerWithMultipleTransports(\n serverInfo: {\n name: string;\n version: string;\n description?: string;\n },\n transports: Array<{\n type: \"stdio\" | \"sse\" | \"streamable-http\";\n port?: number;\n host?: string;\n path?: string;\n sessionIdGenerator?: () => string;\n }>,\n toolOptions?: GenerateMcpToolsOptions,\n ): Promise<void> {\n const server = this.createMcpServer(serverInfo, toolOptions);\n const startPromises: Promise<void>[] = [];\n\n for (const transportConfig of transports) {\n const promise = this.#_startSingleTransport(server, serverInfo, transportConfig);\n startPromises.push(promise);\n }\n\n await Promise.all(startPromises);\n console.error(`[${serverInfo.name}] All MCP transports started successfully`);\n }\n\n /**\n * Start an MCP server with a specific transport type\n * @param serverInfo Server configuration\n * @param transportType Type of transport to use\n * @param transportOptions Transport-specific options\n * @param toolOptions Optional MCP tool generation options\n * @returns Promise that resolves when server is connected\n */\n public async startMcpServerWithTransport(\n serverInfo: {\n name: string;\n version: string;\n description?: string;\n },\n transportType: \"stdio\" | \"sse\" | \"streamable-http\",\n transportOptions: {\n port?: number;\n host?: string;\n path?: string;\n sessionIdGenerator?: () => string;\n } = {},\n toolOptions?: GenerateMcpToolsOptions,\n ): Promise<void> {\n const server = this.createMcpServer(serverInfo, toolOptions);\n await this.#_startSingleTransport(server, serverInfo, {\n type: transportType,\n ...transportOptions,\n });\n }\n\n /**\n * Private helper method to start a single transport\n */\n async #_startSingleTransport(\n server: any,\n serverInfo: { name: string; version: string; description?: string },\n transportConfig: {\n type: \"stdio\" | \"sse\" | \"streamable-http\";\n port?: number;\n host?: string;\n path?: string;\n sessionIdGenerator?: () => string;\n },\n ): Promise<void> {\n switch (transportConfig.type) {\n case \"stdio\": {\n const { StdioServerTransport } = await import(\"@modelcontextprotocol/sdk/server/stdio.js\");\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(`[${serverInfo.name}] MCP Server started with stdio transport`);\n break;\n }\n\n case \"sse\": {\n const { SSEServerTransport } = await import(\"@modelcontextprotocol/sdk/server/sse.js\");\n const express = (await import(\"express\")).default;\n\n const app = express();\n app.use(express.json());\n\n const port = transportConfig.port || 3000;\n const path = transportConfig.path || \"/sse\";\n\n app.get(path, (_req: any, res: any) => {\n const transport = new SSEServerTransport(path, res);\n server.connect(transport);\n });\n\n await new Promise<void>((resolve) => {\n app.listen(port, transportConfig.host || \"localhost\", () => {\n console.error(`[${serverInfo.name}] MCP Server listening on http://${transportConfig.host || \"localhost\"}:${port}${path} (SSE)`);\n resolve();\n });\n });\n break;\n }\n\n case \"streamable-http\": {\n const { StreamableHTTPServerTransport } = await import(\"@modelcontextprotocol/sdk/server/streamableHttp.js\");\n const express = (await import(\"express\")).default;\n\n const app = express();\n app.use(express.json());\n\n const port = transportConfig.port || 3000;\n const path = transportConfig.path || \"/mcp\";\n\n const transports: { [sessionId: string]: any } = {};\n\n app.all(path, async (req: any, res: any) => {\n const sessionId = req.headers['mcp-session-id'] as string | undefined;\n let transport: any;\n\n if (sessionId && transports[sessionId]) {\n transport = transports[sessionId];\n } else {\n transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: transportConfig.sessionIdGenerator || (() => Math.random().toString(36).substring(7)),\n onsessioninitialized: (sessionId: string) => {\n transports[sessionId] = transport;\n }\n });\n\n transport.onclose = () => {\n if (transport.sessionId) {\n delete transports[transport.sessionId];\n }\n };\n\n await server.connect(transport);\n }\n\n await transport.handleRequest(req, res, req.body);\n });\n\n await new Promise<void>((resolve) => {\n app.listen(port, transportConfig.host || \"localhost\", () => {\n console.error(`[${serverInfo.name}] MCP Server listening on http://${transportConfig.host || \"localhost\"}:${port}${path} (HTTP)`);\n resolve();\n });\n });\n break;\n }\n\n default:\n throw new Error(`Unsupported transport type: ${transportConfig.type}`);\n }\n }\n\n /**\n * Override parse() to handle async handlers properly\n * This allows ArgParser to work with async handlers while keeping\n * backwards compatibility for synchronous usage\n */\n public parse(processArgs: string[], options?: any): any {\n // First, call the parent parse method to get the basic parsing done\n const result = super.parse(processArgs, options);\n\n // If fuzzy mode prevented execution, return the result as-is\n const anyResult = result as any;\n if (anyResult._fuzzyModePreventedExecution) {\n return result;\n }\n\n // Check if there's an async handler that needs to be awaited\n if (anyResult._asyncHandlerPromise) {\n // Return a promise for async handlers\n return this.parseAsync(processArgs, options);\n }\n\n return result;\n }\n\n /**\n * Async version of parse for when async handlers are detected\n */\n public async parseAsync(processArgs: string[], options?: any): Promise<any> {\n // First, call the parent parse method to get the basic parsing done\n const result = super.parse(processArgs, options);\n\n // If fuzzy mode prevented execution, return the result as-is\n const anyResult = result as any;\n if (anyResult._fuzzyModePreventedExecution) {\n return result;\n }\n\n // Check if there's an async handler that needs to be awaited\n if (anyResult._asyncHandlerPromise) {\n try {\n const handlerResult = await anyResult._asyncHandlerPromise;\n anyResult.handlerResponse = handlerResult;\n } catch (error) {\n // Handle async handler errors - respect the handleErrors setting\n if ((this as any)[\"#handleErrors\"]) {\n // When handleErrors is true, catch and wrap the error\n anyResult.$error = {\n type: \"handler_error\",\n message: error instanceof Error ? error.message : String(error),\n details: error,\n };\n } else {\n // When handleErrors is false, throw the error (consistent with sync behavior)\n throw error;\n }\n }\n\n // Clean up the async handler info\n delete anyResult._asyncHandlerPromise;\n delete anyResult._asyncHandlerInfo;\n }\n\n return result;\n }\n\n /**\n * Add an MCP sub-command that starts an MCP server exposing this parser's functionality\n * @param subCommandName Name of the sub-command (default: \"mcp-server\")\n * @param serverInfo Server configuration\n * @param options Optional configuration including preset transports and tool options\n * @returns This ArgParserWithMcp instance for chaining\n */\n public addMcpSubCommand(\n subCommandName: string | undefined,\n serverInfo: {\n name: string;\n version: string;\n description?: string;\n },\n options?: McpSubCommandOptions & { toolOptions?: GenerateMcpToolsOptions },\n ): this;\n\n /**\n * Add an MCP sub-command that starts an MCP server exposing this parser's functionality\n * @param subCommandName Name of the sub-command (default: \"mcp-server\")\n * @param serverInfo Server configuration\n * @param toolOptions Optional MCP tool generation options (backward compatibility)\n * @returns This ArgParserWithMcp instance for chaining\n * @deprecated Use the options parameter instead for better configurability\n */\n public addMcpSubCommand(\n subCommandName: string | undefined,\n serverInfo: {\n name: string;\n version: string;\n description?: string;\n },\n toolOptions?: GenerateMcpToolsOptions,\n ): this;\n\n public addMcpSubCommand(\n subCommandName: string | undefined = \"mcp-server\",\n serverInfo: {\n name: string;\n version: string;\n description?: string;\n },\n optionsOrToolOptions?: (McpSubCommandOptions & { toolOptions?: GenerateMcpToolsOptions }) | GenerateMcpToolsOptions,\n ): this {\n // Handle backward compatibility: if the third parameter is a GenerateMcpToolsOptions object\n // (detected by checking if it has properties that only exist in GenerateMcpToolsOptions)\n let options: McpSubCommandOptions & { toolOptions?: GenerateMcpToolsOptions };\n\n if (optionsOrToolOptions &&\n (typeof optionsOrToolOptions === 'object') &&\n ('includeSubCommands' in optionsOrToolOptions || 'toolNamePrefix' in optionsOrToolOptions || 'toolNameSuffix' in optionsOrToolOptions)) {\n // This is the old GenerateMcpToolsOptions format\n options = { toolOptions: optionsOrToolOptions as GenerateMcpToolsOptions };\n } else {\n // This is the new options format or undefined\n options = (optionsOrToolOptions as McpSubCommandOptions & { toolOptions?: GenerateMcpToolsOptions }) || {};\n }\n\n const { defaultTransports, defaultTransport, toolOptions } = options;\n\n const mcpHandler = async (ctx: IHandlerContext): Promise<void> => {\n if (!ctx.parentParser) {\n console.error(\n \"[MCP Server] Critical: MCP server handler called without a parent parser context.\",\n );\n process.exit(1);\n }\n\n console.error(`[${serverInfo.name}] Starting MCP Server...`);\n\n // Cast parent parser to ArgParser to access MCP methods\n const mcpParser = ctx.parentParser as ArgParser;\n\n // Check if multiple transports are specified via CLI\n const transports = ctx.args[\"transports\"] as string;\n\n if (transports) {\n // Parse multiple transports configuration from CLI\n try {\n const transportConfigs = JSON.parse(transports);\n await mcpParser.startMcpServerWithMultipleTransports(serverInfo, transportConfigs, toolOptions);\n } catch (error: any) {\n console.error(\"❌ Error parsing transports configuration:\", error.message);\n console.error(\"Expected JSON format: '[{\\\"type\\\":\\\"stdio\\\"},{\\\"type\\\":\\\"sse\\\",\\\"port\\\":3001}]'\");\n process.exit(1);\n }\n } else if (defaultTransports && defaultTransports.length > 0) {\n // Use preset multiple transports configuration\n await mcpParser.startMcpServerWithMultipleTransports(serverInfo, defaultTransports, toolOptions);\n } else if (defaultTransport) {\n // Use preset single transport configuration\n await mcpParser.startMcpServerWithTransport(\n serverInfo,\n defaultTransport.type,\n {\n port: defaultTransport.port,\n host: defaultTransport.host,\n path: defaultTransport.path,\n sessionIdGenerator: defaultTransport.sessionIdGenerator,\n },\n toolOptions\n );\n } else {\n // Single transport mode from CLI flags (backwards compatibility)\n const transportType = (ctx.args[\"transport\"] as \"stdio\" | \"sse\" | \"streamable-http\") || \"stdio\";\n const transportOptions = {\n port: ctx.args[\"port\"] as number,\n host: ctx.args[\"host\"] as string,\n path: ctx.args[\"path\"] as string,\n };\n\n await mcpParser.startMcpServerWithTransport(serverInfo, transportType, transportOptions, toolOptions);\n }\n\n // Keep the process alive\n return new Promise(() => {});\n };\n\n // Create sub-command parser with transport options\n const mcpSubParser = new ArgParserBase({}, [\n {\n name: \"transport\",\n description: \"Transport type for MCP server (single transport mode)\",\n options: [\"--transport\", \"-t\"],\n type: \"string\",\n enum: [\"stdio\", \"sse\", \"streamable-http\"],\n defaultValue: \"stdio\",\n },\n {\n name: \"transports\",\n description: \"Multiple transports configuration as JSON array (overrides single transport)\",\n options: [\"--transports\"],\n type: \"string\",\n },\n {\n name: \"port\",\n description: \"Port number for HTTP-based transports (single transport mode)\",\n options: [\"--port\", \"-p\"],\n type: \"number\",\n defaultValue: 3000,\n },\n {\n name: \"host\",\n description: \"Host address for HTTP-based transports (single transport mode)\",\n options: [\"--host\"],\n type: \"string\",\n defaultValue: \"localhost\",\n },\n {\n name: \"path\",\n description: \"Path for HTTP-based transports (single transport mode)\",\n options: [\"--path\"],\n type: \"string\",\n defaultValue: \"/mcp\",\n },\n ]);\n\n this.addSubCommand({\n name: subCommandName,\n description: `Start ${serverInfo.name} as an MCP server`,\n handler: mcpHandler,\n parser: mcpSubParser,\n isMcp: true,\n });\n\n return this;\n }\n\n /**\n * Factory method to create an ArgParser instance with MCP capabilities\n * This provides a clean API for users who want MCP functionality from the start\n */\n public static withMcp<T = any>(\n options?: ConstructorParameters<typeof ArgParserBase>[0],\n initialFlags?: ConstructorParameters<typeof ArgParserBase>[1],\n ): ArgParser<T> {\n return new ArgParser<T>(options as any, initialFlags);\n }\n\n /**\n * Convert an existing ArgParserBase instance to ArgParser with MCP\n * This allows upgrading existing parsers to support MCP\n */\n public static fromArgParser<T = any>(\n parser: ArgParserBase<T>,\n ): ArgParser<T> {\n const originalParser = parser as any;\n\n // Create new instance with the same configuration as the original\n const mcpParser = new ArgParser<T>({\n appName: originalParser.getAppName(),\n appCommandName: originalParser.getAppCommandName(),\n description: originalParser.getDescription(),\n handler: originalParser.getHandler(),\n handleErrors: originalParser[\"#handleErrors\"],\n throwForDuplicateFlags: originalParser[\"#throwForDuplicateFlags\"],\n });\n\n // Copy flags from original parser (excluding help flag which is auto-added)\n const originalFlags = originalParser.flags.filter(\n (flag: any) => flag.name !== \"help\",\n );\n if (originalFlags.length > 0) {\n mcpParser.addFlags(originalFlags);\n }\n\n // Copy additional private fields that aren't in constructor options\n const newParser = mcpParser as any;\n newParser[\"#subCommandName\"] = originalParser[\"#subCommandName\"];\n newParser[\"#parameters\"] = originalParser[\"#parameters\"];\n newParser[\"#parentParser\"] = originalParser[\"#parentParser\"];\n newParser[\"#lastParseResult\"] = originalParser[\"#lastParseResult\"];\n newParser[\"#inheritParentFlags\"] = originalParser[\"#inheritParentFlags\"];\n newParser[\"#subCommands\"] = originalParser[\"#subCommands\"];\n\n return mcpParser;\n }\n}\n","import type { ArgParserBase } from \"./ArgParserBase\";\nimport type { ProcessedFlag, ISubCommand } from \"./types\";\n\nexport interface FuzzyTestOptions {\n /** Maximum depth for command path exploration */\n maxDepth?: number;\n /** Number of random test cases to generate per command path */\n randomTestCases?: number;\n /** Include performance timing in results */\n includePerformance?: boolean;\n /** Test invalid combinations to verify error handling */\n testErrorCases?: boolean;\n /** Verbose output for debugging */\n verbose?: boolean;\n}\n\nexport interface TestResult {\n commandPath: string[];\n args: string[];\n success: boolean;\n error?: string;\n executionTime?: number;\n parsedResult?: any;\n}\n\nexport interface FuzzyTestReport {\n totalTests: number;\n successfulTests: number;\n failedTests: number;\n commandPaths: string[][];\n results: TestResult[];\n summary: {\n coverageByPath: Record<string, { total: number; passed: number }>;\n errorTypes: Record<string, number>;\n };\n}\n\nexport class ArgParserFuzzyTester {\n private parser: ArgParserBase;\n private options: Required<FuzzyTestOptions>;\n\n constructor(parser: ArgParserBase, options: FuzzyTestOptions = {}) {\n this.parser = parser;\n this.options = {\n maxDepth: options.maxDepth ?? 5,\n randomTestCases: options.randomTestCases ?? 10,\n includePerformance: options.includePerformance ?? true,\n testErrorCases: options.testErrorCases ?? true,\n verbose: options.verbose ?? false,\n };\n }\n\n /**\n * Run comprehensive fuzzy testing on the ArgParser instance\n */\n async runFuzzyTest(): Promise<FuzzyTestReport> {\n const commandPaths = this.discoverCommandPaths();\n const results: TestResult[] = [];\n\n if (this.options.verbose) {\n console.log(`Discovered ${commandPaths.length} command paths:`);\n commandPaths.forEach(path => console.log(` ${path.join(' ') || '(root)'}`));\n }\n\n for (const commandPath of commandPaths) {\n const pathResults = await this.testCommandPath(commandPath);\n results.push(...pathResults);\n }\n\n return this.generateReport(commandPaths, results);\n }\n\n /**\n * Discover all possible command paths in the parser\n */\n private discoverCommandPaths(): string[][] {\n const paths: string[][] = [];\n \n // Add root path\n paths.push([]);\n \n // Recursively discover subcommand paths\n this.discoverSubCommandPaths(this.parser, [], paths, 0);\n \n return paths;\n }\n\n /**\n * Recursively discover subcommand paths\n */\n private discoverSubCommandPaths(\n parser: ArgParserBase,\n currentPath: string[],\n allPaths: string[][],\n depth: number\n ): void {\n if (depth >= this.options.maxDepth) return;\n\n const subCommands = this.getSubCommands(parser);\n \n for (const [subCommandName, subCommand] of subCommands) {\n const newPath = [...currentPath, subCommandName];\n allPaths.push(newPath);\n \n // Recursively explore this subcommand's subcommands\n this.discoverSubCommandPaths(subCommand.parser, newPath, allPaths, depth + 1);\n }\n }\n\n /**\n * Get subcommands from a parser instance\n */\n private getSubCommands(parser: ArgParserBase): Map<string, ISubCommand> {\n return parser.getSubCommands();\n }\n\n /**\n * Get flags from a parser instance\n */\n private getFlags(parser: ArgParserBase): ProcessedFlag[] {\n return parser.flags;\n }\n\n /**\n * Test a specific command path with various flag combinations\n */\n private async testCommandPath(commandPath: string[]): Promise<TestResult[]> {\n const results: TestResult[] = [];\n const targetParser = this.getParserForPath(commandPath);\n const flags = this.getFlags(targetParser);\n\n if (this.options.verbose) {\n console.log(`Testing command path: ${commandPath.join(' ') || '(root)'}`);\n }\n\n // Test valid combinations\n const validCombinations = this.generateValidFlagCombinations(flags);\n for (const flagArgs of validCombinations) {\n const fullArgs = [...commandPath, ...flagArgs];\n const result = await this.executeTest(fullArgs, commandPath);\n results.push(result);\n }\n\n // Test random combinations\n for (let i = 0; i < this.options.randomTestCases; i++) {\n const randomArgs = this.generateRandomFlagCombination(flags);\n const fullArgs = [...commandPath, ...randomArgs];\n const result = await this.executeTest(fullArgs, commandPath);\n results.push(result);\n }\n\n // Test error cases if enabled\n if (this.options.testErrorCases) {\n const errorCases = this.generateErrorCases(flags);\n for (const errorArgs of errorCases) {\n const fullArgs = [...commandPath, ...errorArgs];\n const result = await this.executeTest(fullArgs, commandPath, true);\n results.push(result);\n }\n }\n\n return results;\n }\n\n /**\n * Get the parser instance for a specific command path\n */\n private getParserForPath(commandPath: string[]): ArgParserBase {\n let currentParser = this.parser;\n \n for (const command of commandPath) {\n const subCommands = this.getSubCommands(currentParser);\n const subCommand = subCommands.get(command);\n if (!subCommand) {\n throw new Error(`Command path not found: ${commandPath.join(' ')}`);\n }\n currentParser = subCommand.parser;\n }\n \n return currentParser;\n }\n\n /**\n * Generate valid flag combinations for testing\n */\n private generateValidFlagCombinations(flags: ProcessedFlag[]): string[][] {\n const combinations: string[][] = [];\n\n // Separate mandatory and optional flags\n const mandatoryFlags = flags.filter(f =>\n f['name'] !== 'help' &&\n (typeof f['mandatory'] === 'boolean' ? f['mandatory'] : false)\n );\n const optionalFlags = flags.filter(f =>\n f['name'] !== 'help' &&\n (typeof f['mandatory'] === 'boolean' ? !f['mandatory'] : true)\n );\n\n // Generate base combination with all mandatory flags\n const mandatoryArgs: string[] = [];\n for (const flag of mandatoryFlags) {\n const flagArgs = this.generateFlagArgs(flag, 'valid');\n mandatoryArgs.push(...flagArgs);\n }\n\n // Test with just mandatory flags\n if (mandatoryArgs.length > 0) {\n combinations.push([...mandatoryArgs]);\n } else {\n // Test with no flags if no mandatory flags exist\n combinations.push([]);\n }\n\n // Test each optional flag individually (with mandatory flags)\n for (const flag of optionalFlags) {\n const flagArgs = this.generateFlagArgs(flag, 'valid');\n if (flagArgs.length > 0) {\n combinations.push([...mandatoryArgs, ...flagArgs]);\n }\n }\n\n // Test combinations of optional flags (with mandatory flags)\n if (optionalFlags.length > 1) {\n // Test pairs of optional flags\n for (let i = 0; i < optionalFlags.length - 1; i++) {\n for (let j = i + 1; j < optionalFlags.length; j++) {\n const flag1Args = this.generateFlagArgs(optionalFlags[i], 'valid');\n const flag2Args = this.generateFlagArgs(optionalFlags[j], 'valid');\n if (flag1Args.length > 0 && flag2Args.length > 0) {\n combinations.push([...mandatoryArgs, ...flag1Args, ...flag2Args]);\n }\n }\n }\n }\n\n return combinations;\n }\n\n /**\n * Generate random flag combination\n */\n private generateRandomFlagCombination(flags: ProcessedFlag[]): string[] {\n const args: string[] = [];\n const availableFlags = flags.filter(f => f['name'] !== 'help');\n \n // Randomly select flags to include\n for (const flag of availableFlags) {\n if (Math.random() < 0.3) { // 30% chance to include each flag\n const flagArgs = this.generateFlagArgs(flag, 'random');\n args.push(...flagArgs);\n }\n }\n \n return args;\n }\n\n /**\n * Generate error test cases\n */\n private generateErrorCases(flags: ProcessedFlag[]): string[][] {\n const errorCases: string[][] = [];\n \n // Test invalid flag names\n errorCases.push(['--invalid-flag']);\n errorCases.push(['--nonexistent', 'value']);\n \n // Test flags with wrong types\n for (const flag of flags) {\n if (flag['name'] === 'help') continue;\n \n const invalidArgs = this.generateFlagArgs(flag, 'invalid');\n if (invalidArgs.length > 0) {\n errorCases.push(invalidArgs);\n }\n }\n \n return errorCases;\n }\n\n /**\n * Generate arguments for a specific flag\n */\n private generateFlagArgs(flag: ProcessedFlag, mode: 'valid' | 'invalid' | 'random'): string[] {\n const option = flag['options'][0]; // Use first option\n if (!option) return [];\n\n if (flag['flagOnly']) {\n return [option];\n }\n \n const values = this.generateFlagValues(flag, mode);\n const args: string[] = [];\n \n for (const value of values) {\n if (flag['allowLigature'] && Math.random() < 0.5) {\n args.push(`${option}=${value}`);\n } else {\n args.push(option, value);\n }\n }\n \n return args;\n }\n\n /**\n * Generate values for a flag based on its type and constraints\n */\n private generateFlagValues(flag: ProcessedFlag, mode: 'valid' | 'invalid' | 'random'): string[] {\n const count = flag['allowMultiple'] && mode !== 'invalid' ?\n Math.floor(Math.random() * 3) + 1 : 1;\n \n const values: string[] = [];\n \n for (let i = 0; i < count; i++) {\n values.push(this.generateSingleFlagValue(flag, mode));\n }\n \n return values;\n }\n\n /**\n * Generate a single value for a flag\n */\n private generateSingleFlagValue(flag: ProcessedFlag, mode: 'valid' | 'invalid' | 'random'): string {\n if (mode === 'invalid') {\n // Generate intentionally invalid values\n if (flag['type'] === Number) return 'not-a-number';\n if (flag['enum'] && flag['enum'].length > 0) return 'invalid-enum-value';\n if (flag['type'] === Boolean) return 'not-boolean';\n return 'invalid-value';\n }\n \n // Handle enum values\n if (flag['enum'] && flag['enum'].length > 0) {\n const randomIndex = Math.floor(Math.random() * flag['enum'].length);\n return String(flag['enum'][randomIndex]);\n }\n\n // Generate values based on type\n if (flag['type'] === Number) {\n return String(Math.floor(Math.random() * 1000));\n }\n\n if (flag['type'] === Boolean) {\n return Math.random() < 0.5 ? 'true' : 'false';\n }\n \n // Default to string\n const testStrings = [\n 'test-value',\n 'hello-world',\n 'file.txt',\n '/path/to/file',\n 'user@example.com',\n '123',\n 'special-chars-!@#',\n ];\n \n return testStrings[Math.floor(Math.random() * testStrings.length)];\n }\n\n /**\n * Execute a single test case\n */\n private async executeTest(\n args: string[],\n commandPath: string[],\n expectError: boolean = false\n ): Promise<TestResult> {\n const startTime = this.options.includePerformance ? Date.now() : 0;\n\n try {\n // Store the original input arguments for logging visibility\n const originalArgs = [...args];\n\n const testResult = this.parser.parse(args, {\n skipHelpHandling: true\n });\n\n // Store original args in the result for logging\n if (testResult && typeof testResult === 'object') {\n (testResult as any)._originalInputArgs = originalArgs;\n }\n\n const executionTime = this.options.includePerformance ? Date.now() - startTime : undefined;\n\n return {\n commandPath,\n args,\n success: !expectError,\n parsedResult: testResult,\n executionTime,\n };\n } catch (error) {\n const executionTime = this.options.includePerformance ? Date.now() - startTime : undefined;\n\n return {\n commandPath,\n args,\n success: expectError,\n error: error instanceof Error ? error.message : String(error),\n executionTime,\n };\n }\n }\n\n /**\n * Generate comprehensive test report\n */\n private generateReport(commandPaths: string[][], results: TestResult[]): FuzzyTestReport {\n const totalTests = results.length;\n const successfulTests = results.filter(r => r.success).length;\n const failedTests = totalTests - successfulTests;\n \n // Coverage by path\n const coverageByPath: Record<string, { total: number; passed: number }> = {};\n for (const path of commandPaths) {\n const pathKey = path.join(' ') || '(root)';\n const pathResults = results.filter(r => \n JSON.stringify(r.commandPath) === JSON.stringify(path)\n );\n coverageByPath[pathKey] = {\n total: pathResults.length,\n passed: pathResults.filter(r => r.success).length,\n };\n }\n \n // Error types\n const errorTypes: Record<string, number> = {};\n for (const result of results) {\n if (result.error) {\n const errorType = result.error.split(':')[0] || 'Unknown';\n errorTypes[errorType] = (errorTypes[errorType] || 0) + 1;\n }\n }\n \n return {\n totalTests,\n successfulTests,\n failedTests,\n commandPaths,\n results,\n summary: {\n coverageByPath,\n errorTypes,\n },\n };\n }\n}\n"],"names":["_throwForDuplicateFlags","identifiedFinalParser","path","sessionId"],"mappings":"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"}