hacksh 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -156,6 +156,39 @@ above sets `verbose`; `--help` and `--version` remain available. Output selectio
156
156
  any additional command-line flags, so names such as `--json`, `--output`, and `--log-format` remain
157
157
  available to application schemas.
158
158
 
159
+ ### Environment variables
160
+
161
+ Every named option of a command tree whose root has a `name` can also be set from an environment
162
+ variable. The name joins the root name, the subcommand keys on the route, and the option key in
163
+ upper snake case.
164
+
165
+ ```ts
166
+ const deploy = defineCommand({
167
+ args: z.object({ target: z.string(), dryRun: z.boolean().default(false), token: z.string() }),
168
+ argOptions: { token: { env: "GITHUB_TOKEN" } },
169
+ run: ({ args }) => args,
170
+ });
171
+ const main = defineCommand({ name: "my-cli", subCommands: { deploy } });
172
+ ```
173
+
174
+ ```sh
175
+ MY_CLI_DEPLOY_TARGET=prod MY_CLI_DEPLOY_DRY_RUN=true GITHUB_TOKEN=t my-cli deploy
176
+ # { target: "prod", dryRun: true, token: "t" }
177
+ ```
178
+
179
+ - A command-line argument wins over the environment, and the environment wins over the schema
180
+ default. `--no-dry-run` overrides `MY_CLI_DEPLOY_DRY_RUN=true`.
181
+ - Values go through the same schema as command-line values. Boolean options accept only `true`
182
+ and `false`. An empty value is a value, not an unset variable.
183
+ - `env: "NAME"` replaces the derived name and `env: false` turns it off. Array and object options,
184
+ positional arguments, and commands under an unnamed root get no derived name.
185
+ - Help shows the name as `(Env: MY_CLI_DEPLOY_TARGET)`, and `UsageOptionSummary.env` carries it.
186
+ Errors name the variable but never include its value.
187
+ - `runCommand`, `runMain`, and `createMain` read the `env` option, defaulting to `process.env`.
188
+ `parseArgs(command, argv, { env })` reads the environment only when `env` is given.
189
+ - Two options that resolve to the same name on one route, such as a root `deployTarget` and a
190
+ `deploy` subcommand's `target`, make the invocation throw a `TypeError`.
191
+
159
192
  ## Subcommands
160
193
 
161
194
  ```ts
package/dist/index.d.ts CHANGED
@@ -76,6 +76,7 @@ interface UsageOptionSummary {
76
76
  description?: string;
77
77
  choices?: readonly string[];
78
78
  defaultValue?: unknown;
79
+ env?: string;
79
80
  }
80
81
  interface UsageCommandSummary {
81
82
  name: string;
@@ -278,6 +279,7 @@ declare const POSITIONALS_KEY = "_";
278
279
  interface ArgOptions {
279
280
  alias?: string | readonly string[];
280
281
  valueName?: string;
282
+ env?: string | false;
281
283
  }
282
284
  type ArgOptionsMap<S extends ArgsSchema> = Partial<Record<OptionKey<S>, ArgOptions>>;
283
285
  interface CommandContext<S extends ArgsSchema> {
@@ -304,8 +306,11 @@ declare function defineCommand<S extends ArgsSchema = EmptyArgs>(def: CommandDef
304
306
  //#region src/parser.d.ts
305
307
  /**
306
308
  * Parse and validate one command segment without routing, builtin handling, or output.
309
+ * Environment variables are read only when `options.env` is provided.
307
310
  */
308
- declare function parseArgs<S extends ArgsSchema>(command: CommandDef<S>, argv: string[]): Promise<output<S>>;
311
+ declare function parseArgs<S extends ArgsSchema>(command: CommandDef<S>, argv: string[], options?: {
312
+ readonly env?: Readonly<Record<string, string | undefined>>;
313
+ }): Promise<output<S>>;
309
314
  //#endregion
310
315
  //#region src/pretty.d.ts
311
316
  interface PrettyPrinterOptions {
package/dist/index.js CHANGED
@@ -87,6 +87,10 @@ function enumChoices(schema) {
87
87
  function isArrayInput(schema) {
88
88
  return definition(unwrapInput(schema)).type === "array";
89
89
  }
90
+ /** Whether the schema accepts an object after removing supported input wrappers. */
91
+ function isObjectInput(schema) {
92
+ return definition(unwrapInput(schema)).type === "object";
93
+ }
90
94
  function unwrapInput(schema) {
91
95
  let current = schema;
92
96
  for (;;) {
@@ -117,7 +121,13 @@ function defineCommand(def) {
117
121
  const usedAliases = /* @__PURE__ */ new Set();
118
122
  for (const [key, options] of Object.entries(def.argOptions ?? {})) {
119
123
  if (key === "_") throw new TypeError("Positional arguments cannot have argument options");
120
- if (!shape[key]) throw new TypeError(`Unknown argument options key \`${key}\``);
124
+ const schema = shape[key];
125
+ if (!schema) throw new TypeError(`Unknown argument options key \`${key}\``);
126
+ if (options?.env !== void 0) {
127
+ if (options.env === "") throw new TypeError(`Environment variable name for \`${key}\` cannot be empty`);
128
+ if (isArrayInput(schema)) throw new TypeError(`Option \`${key}\` cannot use an environment variable because it accepts an array`);
129
+ if (isObjectInput(schema)) throw new TypeError(`Option \`${key}\` cannot use an environment variable because it accepts an object`);
130
+ }
121
131
  if (options?.alias === void 0) continue;
122
132
  for (const alias of aliasList(options.alias)) {
123
133
  if (alias.length !== 1) throw new TypeError(`Alias \`${alias}\` must be exactly one character`);
@@ -323,6 +333,58 @@ function summarizeError(error) {
323
333
  };
324
334
  }
325
335
  //#endregion
336
+ //#region src/environment.ts
337
+ const commandPaths = /* @__PURE__ */ new WeakMap();
338
+ function registerCommandPath(command, path) {
339
+ commandPaths.set(command, path);
340
+ }
341
+ function commandEnvPath(command) {
342
+ if (!commandPaths.has(command)) return command.name ? [command.name] : void 0;
343
+ return commandPaths.get(command);
344
+ }
345
+ function envSegment(segment) {
346
+ return kebabCase(segment).replaceAll(/[^A-Za-z0-9]+/g, "_").toUpperCase();
347
+ }
348
+ function optionEnvNames(command, path) {
349
+ const names = /* @__PURE__ */ new Map();
350
+ if (!command.args) return names;
351
+ for (const [key, schema] of Object.entries(schemaShape(command.args))) {
352
+ if (key === "_") continue;
353
+ if (isArrayInput(schema) || isObjectInput(schema)) continue;
354
+ const configured = command.argOptions?.[key]?.env;
355
+ if (configured === false) continue;
356
+ if (typeof configured === "string") {
357
+ names.set(key, configured);
358
+ continue;
359
+ }
360
+ if (path === void 0 || path.length === 0) continue;
361
+ names.set(key, [...path, key].map(envSegment).join("_"));
362
+ }
363
+ return names;
364
+ }
365
+ function envOptionLabel(path, key) {
366
+ const flag = `--${kebabCase(key)}`;
367
+ const command = path?.slice(1).join(" ");
368
+ return command ? `${command} ${flag}` : flag;
369
+ }
370
+ function assertUniqueEnvNames(segments) {
371
+ const owners = /* @__PURE__ */ new Map();
372
+ for (const segment of segments) for (const [key, envName] of optionEnvNames(segment.command, segment.path)) {
373
+ const label = envOptionLabel(segment.path, key);
374
+ const previous = owners.get(envName);
375
+ if (previous !== void 0) throw new TypeError(`Environment variable \`${envName}\` is used by both \`${previous}\` and \`${label}\``);
376
+ owners.set(envName, label);
377
+ }
378
+ }
379
+ function readEnvValue(env, name) {
380
+ try {
381
+ const value = env[name];
382
+ return typeof value === "string" ? value : void 0;
383
+ } catch {
384
+ return;
385
+ }
386
+ }
387
+ //#endregion
326
388
  //#region src/parser.ts
327
389
  function optionModel(command) {
328
390
  const definitions = /* @__PURE__ */ new Map();
@@ -500,14 +562,17 @@ function tokenizedBefore(tokenized, endIndex) {
500
562
  versionIndex: version ? tokenized.versionIndex : void 0
501
563
  };
502
564
  }
503
- function zodIssues(command, issues) {
504
- return issues.map((issue) => ({
505
- arg: displayName(command, issue.path),
506
- message: issue.message,
507
- issue
508
- }));
565
+ function zodIssues(command, issues, envSources) {
566
+ return issues.map((issue) => {
567
+ const key = issue.path[0];
568
+ return {
569
+ arg: (typeof key === "string" ? envSources.get(key) : void 0) ?? displayName(command, issue.path),
570
+ message: issue.message,
571
+ issue
572
+ };
573
+ });
509
574
  }
510
- async function parseCommandArgs(command, rawArgs, tokenized = tokenizeCommandArgs(command, rawArgs)) {
575
+ async function parseCommandArgs(command, rawArgs, tokenized = tokenizeCommandArgs(command, rawArgs), env, envPath) {
511
576
  if (tokenized.issues.length > 0) throw new HackshValidationError(command, tokenized.issues.map(({ issue }) => issue));
512
577
  const input = {};
513
578
  const positionals = commandPositionals(command);
@@ -518,13 +583,34 @@ async function parseCommandArgs(command, rawArgs, tokenized = tokenizeCommandArg
518
583
  else if (token.kind === "unknown-option") extraArgs.push(token.value);
519
584
  else if (positionals && (positionals.rest || positionalValues.length < positionals.items.length)) positionalValues.push(token.value);
520
585
  else extraArgs.push(token.value);
586
+ const envSources = /* @__PURE__ */ new Map();
587
+ if (env && command.args) {
588
+ const shape = schemaShape(command.args);
589
+ const envIssues = [];
590
+ for (const [key, envName] of optionEnvNames(command, envPath)) {
591
+ if (input[key] !== void 0) continue;
592
+ const value = readEnvValue(env, envName);
593
+ if (value === void 0) continue;
594
+ if (readArgInfo(shape[key]).takesValue) input[key] = value;
595
+ else if (value === "true" || value === "false") input[key] = value === "true";
596
+ else {
597
+ envIssues.push({
598
+ arg: envName,
599
+ message: "expects true or false"
600
+ });
601
+ continue;
602
+ }
603
+ envSources.set(key, envName);
604
+ }
605
+ if (envIssues.length > 0) throw new HackshValidationError(command, envIssues);
606
+ }
521
607
  if (!command.args) return {
522
608
  args: input,
523
609
  passthrough: tokenized.passthrough,
524
610
  extraArgs
525
611
  };
526
612
  const result = await safeParseAsync(command.args, input);
527
- if (!result.success) throw new HackshValidationError(command, zodIssues(command, result.error.issues));
613
+ if (!result.success) throw new HackshValidationError(command, zodIssues(command, result.error.issues, envSources));
528
614
  return {
529
615
  args: result.data,
530
616
  passthrough: tokenized.passthrough,
@@ -533,9 +619,15 @@ async function parseCommandArgs(command, rawArgs, tokenized = tokenizeCommandArg
533
619
  }
534
620
  /**
535
621
  * Parse and validate one command segment without routing, builtin handling, or output.
622
+ * Environment variables are read only when `options.env` is provided.
536
623
  */
537
- async function parseArgs(command, argv) {
538
- return (await parseCommandArgs(command, argv)).args;
624
+ async function parseArgs(command, argv, options) {
625
+ const envPath = command.name ? [command.name] : void 0;
626
+ if (options?.env !== void 0) assertUniqueEnvNames([{
627
+ command,
628
+ path: envPath
629
+ }]);
630
+ return (await parseCommandArgs(command, argv, tokenizeCommandArgs(command, argv), options?.env, envPath)).args;
539
631
  }
540
632
  //#endregion
541
633
  //#region src/serialization.ts
@@ -1334,11 +1426,12 @@ function selectOutputPrinter(options, override, resolvedMode) {
1334
1426
  }
1335
1427
  //#endregion
1336
1428
  //#region src/usage.ts
1337
- function details(description, required, defaultValue, choices) {
1429
+ function details(description, required, defaultValue, choices, envName) {
1338
1430
  const parts = [description];
1339
1431
  if (choices) parts.push(`(Choices: ${choices.join(", ")})`);
1340
1432
  if (required) parts.push("(Required)");
1341
1433
  if (defaultValue !== void 0) parts.push(`(Default: ${formatDefault(defaultValue)})`);
1434
+ if (envName !== void 0) parts.push(`(Env: ${envName})`);
1342
1435
  return parts.filter(Boolean).join(" ");
1343
1436
  }
1344
1437
  function formatDefault(value) {
@@ -1385,12 +1478,14 @@ function summarizeUsage(command) {
1385
1478
  ...info.choices === void 0 ? {} : { choices: info.choices }
1386
1479
  });
1387
1480
  }
1481
+ const envNames = optionEnvNames(command, commandEnvPath(command));
1388
1482
  const options = Object.entries(shape).filter(([key]) => key !== "_").map(([key, schema]) => {
1389
1483
  const info = readArgInfo(schema);
1390
1484
  const argOptions = command.argOptions?.[key];
1391
1485
  const aliases = argOptions?.alias ? aliasList(argOptions.alias).map((item) => `-${item}`) : [];
1392
1486
  const name = kebabCase(key);
1393
1487
  const valueName = argOptions?.valueName ?? name;
1488
+ const envName = envNames.get(key);
1394
1489
  return {
1395
1490
  name,
1396
1491
  flags: [...aliases, `--${name}`],
@@ -1400,7 +1495,8 @@ function summarizeUsage(command) {
1400
1495
  ...info.takesValue ? { valueName } : {},
1401
1496
  ...info.description === void 0 ? {} : { description: info.description },
1402
1497
  ...info.choices === void 0 ? {} : { choices: info.choices },
1403
- ...info.defaultValue === void 0 ? {} : { defaultValue: summarizeErrors(info.defaultValue) }
1498
+ ...info.defaultValue === void 0 ? {} : { defaultValue: summarizeErrors(info.defaultValue) },
1499
+ ...envName === void 0 ? {} : { env: envName }
1404
1500
  };
1405
1501
  });
1406
1502
  const commands = Object.entries(command.subCommands ?? {}).filter(([, child]) => !child.hidden).map(([name, child]) => ({
@@ -1437,7 +1533,7 @@ function formatUsage(summary) {
1437
1533
  if (option.negatable) return `--[no-]${flag.slice(2)}`;
1438
1534
  return flag;
1439
1535
  });
1440
- lines.push(` ${flags.join(", ")} ${details(option.description, option.required, option.defaultValue, option.choices)}`.trimEnd());
1536
+ lines.push(` ${flags.join(", ")} ${details(option.description, option.required, option.defaultValue, option.choices, option.env)}`.trimEnd());
1441
1537
  }
1442
1538
  }
1443
1539
  if (summary.commands.length > 0) {
@@ -1464,12 +1560,6 @@ async function showUsage(command, options = {}) {
1464
1560
  }
1465
1561
  //#endregion
1466
1562
  //#region src/run.ts
1467
- function namedChild(child, name) {
1468
- return child.name ? child : {
1469
- ...child,
1470
- name
1471
- };
1472
- }
1473
1563
  function resolveCommand(root, rawArgs) {
1474
1564
  let command = root;
1475
1565
  let remaining = rawArgs;
@@ -1485,15 +1575,19 @@ function resolveCommand(root, rawArgs) {
1485
1575
  tokenized
1486
1576
  };
1487
1577
  segments.push(segment);
1578
+ assertUniqueEnvNames(segments.map(({ command }) => ({
1579
+ command,
1580
+ path: commandEnvPath(command)
1581
+ })));
1488
1582
  return {
1489
1583
  ...segment,
1490
1584
  parents,
1491
1585
  segments
1492
1586
  };
1493
1587
  }
1494
- const name = remaining[index];
1495
- const child = command.subCommands?.[name];
1496
- if (!child) throw new HackshUsageError(`Unknown command \`${name}\``, command);
1588
+ const key = remaining[index];
1589
+ const child = command.subCommands?.[key];
1590
+ if (!child) throw new HackshUsageError(`Unknown command \`${key}\``, command);
1497
1591
  const prefix = remaining.slice(0, index);
1498
1592
  const segment = {
1499
1593
  command,
@@ -1502,11 +1596,16 @@ function resolveCommand(root, rawArgs) {
1502
1596
  };
1503
1597
  parents.push(segment);
1504
1598
  segments.push(segment);
1505
- command = namedChild(child, name);
1599
+ const parentPath = commandEnvPath(command);
1600
+ command = {
1601
+ ...child,
1602
+ name: child.name ?? key
1603
+ };
1604
+ registerCommandPath(command, parentPath === void 0 ? void 0 : [...parentPath, key]);
1506
1605
  remaining = remaining.slice(index + 1);
1507
1606
  }
1508
1607
  }
1509
- async function executeCommand(root, argv, displayUsage, printer, loggerOptions) {
1608
+ async function executeCommand(root, argv, displayUsage, printer, loggerOptions, env) {
1510
1609
  const resolved = resolveCommand(root, argv);
1511
1610
  if (resolved.segments[0]?.tokenized.version) {
1512
1611
  await printer.print({
@@ -1519,8 +1618,8 @@ async function executeCommand(root, argv, displayUsage, printer, loggerOptions)
1519
1618
  await printUsage(displayUsage, resolved.command, printer, "stdout");
1520
1619
  return;
1521
1620
  }
1522
- for (const parent of resolved.parents) await parseCommandArgs(parent.command, parent.rawArgs, parent.tokenized);
1523
- const parsed = await parseCommandArgs(resolved.command, resolved.rawArgs, resolved.tokenized);
1621
+ for (const parent of resolved.parents) await parseCommandArgs(parent.command, parent.rawArgs, parent.tokenized, env, commandEnvPath(parent.command));
1622
+ const parsed = await parseCommandArgs(resolved.command, resolved.rawArgs, resolved.tokenized, env, commandEnvPath(resolved.command));
1524
1623
  if (!resolved.command.run) throw new HackshUsageError("No command specified", resolved.command);
1525
1624
  const category = resolved.segments.flatMap(({ command }) => command.name === void 0 ? [] : [command.name]);
1526
1625
  return resolved.command.run({
@@ -1538,11 +1637,11 @@ function printUsage(displayUsage, command, printer, stream) {
1538
1637
  stream
1539
1638
  }) });
1540
1639
  }
1541
- function prepareOutput(options) {
1640
+ function prepareOutput(options, env) {
1542
1641
  const input = options.stdin ?? process.stdin;
1543
1642
  const mode = resolveOutputMode({
1544
1643
  output: options.output,
1545
- env: options.env,
1644
+ env,
1546
1645
  inputIsTTY: input.isTTY,
1547
1646
  outputIsTTY: (options.stdout ?? process.stdout).isTTY
1548
1647
  });
@@ -1553,13 +1652,14 @@ function prepareOutput(options) {
1553
1652
  };
1554
1653
  }
1555
1654
  async function runCommand(root, argv, options = {}) {
1556
- const output = prepareOutput(options);
1655
+ const env = options.env ?? process.env;
1656
+ const output = prepareOutput(options, env);
1557
1657
  try {
1558
1658
  return await executeCommand(root, argv, options.showUsage ?? showUsage, output.printer, {
1559
1659
  interactive: output.interactive,
1560
1660
  input: output.input,
1561
1661
  printPrompt: (event) => output.printChecked(event)
1562
- });
1662
+ }, env);
1563
1663
  } finally {
1564
1664
  await output.drain();
1565
1665
  }
@@ -1591,9 +1691,10 @@ async function reportOutputSetupError(error, options) {
1591
1691
  }
1592
1692
  async function runMain(command, options = {}) {
1593
1693
  const displayUsage = options.showUsage ?? showUsage;
1694
+ const env = options.env ?? process.env;
1594
1695
  let output;
1595
1696
  try {
1596
- output = prepareOutput(options);
1697
+ output = prepareOutput(options, env);
1597
1698
  } catch (error) {
1598
1699
  return reportOutputSetupError(error, options);
1599
1700
  }
@@ -1602,7 +1703,7 @@ async function runMain(command, options = {}) {
1602
1703
  interactive: output.interactive,
1603
1704
  input: output.input,
1604
1705
  printPrompt: (event) => output.printChecked(event)
1605
- });
1706
+ }, env);
1606
1707
  } catch (error) {
1607
1708
  if (options.onError) {
1608
1709
  await options.onError(error);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["safeString","parseNodeArgs","details","#interactive","#inputValue","#printEvent","#bufferedKeys","#print","#run","#active"],"sources":["../src/options.ts","../src/schema.ts","../src/command.ts","../src/errors.ts","../src/parser.ts","../src/serialization.ts","../src/printer.ts","../src/pretty.ts","../src/prompts.ts","../src/logger.ts","../src/output.ts","../src/usage.ts","../src/run.ts"],"sourcesContent":["export function kebabCase(value: string): string {\n return value.replaceAll(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\nexport function aliasList(value: string | readonly string[]): readonly string[] {\n return typeof value === \"string\" ? [value] : value;\n}\n","import { globalRegistry, type $ZodObject, type $ZodType } from \"zod/v4/core\";\n\nexport type ArgsSchema = $ZodObject;\nexport type EmptyArgs = $ZodObject<{}>;\nexport type ShapeOf<S extends ArgsSchema> = S[\"_zod\"][\"def\"][\"shape\"];\nexport type ArgKey<S extends ArgsSchema> = Extract<keyof ShapeOf<S>, string>;\nexport type OptionKey<S extends ArgsSchema> = Exclude<ArgKey<S>, typeof POSITIONALS_KEY>;\n\nexport const POSITIONALS_KEY = \"_\";\n\nexport interface ArgInfo {\n readonly takesValue: boolean;\n readonly required: boolean;\n readonly defaultValue: unknown;\n readonly description: string | undefined;\n readonly title: string | undefined;\n readonly choices: readonly string[] | undefined;\n}\n\nexport interface Positional {\n readonly schema: $ZodType;\n readonly label: string;\n}\n\nexport interface Positionals {\n readonly items: readonly Positional[];\n readonly rest: Positional | undefined;\n}\n\ntype ZodDef = Record<string, unknown> & { type: string };\n\nfunction definition(schema: $ZodType): ZodDef {\n return schema._zod.def as ZodDef;\n}\n\nfunction innerSchema(def: ZodDef): $ZodType | undefined {\n switch (def.type) {\n case \"optional\":\n case \"nonoptional\":\n case \"nullable\":\n case \"default\":\n case \"prefault\":\n case \"catch\":\n case \"readonly\":\n return def.innerType as $ZodType;\n case \"pipe\":\n return def.in as $ZodType;\n default:\n return undefined;\n }\n}\n\n/** Read only the common zod/v4/core definition and registry structures. */\nexport function readArgInfo(schema: $ZodType): ArgInfo {\n let current: $ZodType | undefined = schema;\n let required = true;\n let defaultValue: unknown;\n let description: string | undefined;\n let title: string | undefined;\n\n while (current) {\n const metadata = globalRegistry.get(current);\n description ??= metadata?.description;\n title ??= metadata?.title;\n\n const def = definition(current);\n if (def.type === \"optional\" || def.type === \"default\" || def.type === \"prefault\") {\n required = false;\n }\n if (def.type === \"default\" && defaultValue === undefined) defaultValue = def.defaultValue;\n current = innerSchema(def);\n }\n\n const base = unwrapInput(schema);\n return {\n takesValue: definition(base).type !== \"boolean\",\n required,\n defaultValue,\n description,\n title,\n choices: enumChoices(base),\n };\n}\n\n/** Read the `_` tuple or array schema that declares positional arguments. */\nexport function readPositionals(shape: Record<string, $ZodType>): Positionals | undefined {\n const field = shape[POSITIONALS_KEY];\n if (!field) return undefined;\n const def = definition(unwrapInput(field));\n let items: readonly $ZodType[];\n let rest: $ZodType | undefined;\n if (def.type === \"tuple\") {\n items = def.items as readonly $ZodType[];\n rest = (def.rest as $ZodType | null) ?? undefined;\n } else if (def.type === \"array\") {\n items = [];\n rest = def.element as $ZodType;\n } else {\n throw new TypeError(\"Positional arguments `_` must use a tuple or array schema\");\n }\n return {\n items: items.map((schema, index) => ({\n schema,\n label: readArgInfo(schema).title ?? `ARG${index + 1}`,\n })),\n rest: rest && { schema: rest, label: readArgInfo(rest).title ?? \"ARGS\" },\n };\n}\n\nfunction enumChoices(schema: $ZodType): readonly string[] | undefined {\n const def = definition(schema);\n const candidate = def.type === \"array\" ? unwrapInput(def.element as $ZodType) : schema;\n const candidateDef = definition(candidate);\n if (candidateDef.type !== \"enum\") return undefined;\n const values = candidate._zod.values;\n return values ? [...values].map(String) : undefined;\n}\n\n/** Whether the schema accepts an array after removing supported input wrappers. */\nexport function isArrayInput(schema: $ZodType): boolean {\n return definition(unwrapInput(schema)).type === \"array\";\n}\n\nfunction unwrapInput(schema: $ZodType): $ZodType {\n let current = schema;\n for (;;) {\n const inner = innerSchema(definition(current));\n if (!inner) return current;\n current = inner;\n }\n}\n\nexport function schemaShape(schema: ArgsSchema): Record<string, $ZodType> {\n return schema._zod.def.shape as Record<string, $ZodType>;\n}\n","import type { output } from \"zod/v4/core\";\nimport type { Logger } from \"./logger.ts\";\nimport { aliasList } from \"./options.ts\";\nimport {\n isArrayInput,\n POSITIONALS_KEY,\n readArgInfo,\n readPositionals,\n schemaShape,\n type ArgsSchema,\n type EmptyArgs,\n type OptionKey,\n} from \"./schema.ts\";\n\nexport interface ArgOptions {\n alias?: string | readonly string[];\n valueName?: string;\n}\n\nexport type ArgOptionsMap<S extends ArgsSchema> = Partial<Record<OptionKey<S>, ArgOptions>>;\n\nexport interface CommandContext<S extends ArgsSchema> {\n cmd: CommandDef<S>;\n args: output<S>;\n rawArgs: string[];\n passthrough: string[];\n extraArgs: string[];\n logger: Logger;\n}\n\nexport interface CommandDef<S extends ArgsSchema = EmptyArgs> {\n name?: string;\n version?: string;\n description?: string;\n hidden?: boolean;\n args?: S;\n argOptions?: ArgOptionsMap<S>;\n subCommands?: Record<string, CommandDef<ArgsSchema>>;\n run?(context: CommandContext<S>): unknown;\n}\n\nexport type AnyCommandDef = CommandDef<ArgsSchema>;\n\nexport function defineCommand<S extends ArgsSchema = EmptyArgs>(def: CommandDef<S>): CommandDef<S> {\n const shape = def.args ? schemaShape(def.args) : {};\n const positionals = readPositionals(shape);\n\n if (positionals) {\n let sawOptional = false;\n for (const { schema, label } of positionals.items) {\n const info = readArgInfo(schema);\n if (isArrayInput(schema)) {\n throw new TypeError(\n `Positional argument \\`${label}\\` cannot be an array; use a tuple rest`,\n );\n }\n if (!info.takesValue) {\n throw new TypeError(`Boolean argument \\`${label}\\` cannot be positional`);\n }\n if (sawOptional && info.required) {\n throw new TypeError(\n `Required positional \\`${label}\\` cannot follow an optional positional`,\n );\n }\n sawOptional ||= !info.required;\n }\n if (def.subCommands && Object.keys(def.subCommands).length > 0) {\n throw new TypeError(\"A command cannot define both positional arguments and subcommands\");\n }\n }\n\n const usedAliases = new Set<string>();\n for (const [key, options] of Object.entries(def.argOptions ?? {})) {\n if (key === POSITIONALS_KEY) {\n throw new TypeError(\"Positional arguments cannot have argument options\");\n }\n if (!shape[key]) throw new TypeError(`Unknown argument options key \\`${key}\\``);\n if (options?.alias === undefined) continue;\n for (const alias of aliasList(options.alias)) {\n if (alias.length !== 1)\n throw new TypeError(`Alias \\`${alias}\\` must be exactly one character`);\n if (usedAliases.has(alias)) throw new TypeError(`Duplicate alias \\`${alias}\\``);\n usedAliases.add(alias);\n }\n }\n\n for (const key of Object.keys(shape)) {\n if (key !== POSITIONALS_KEY && /^no[-A-Z]/.test(key)) {\n throw new TypeError(`Option \\`${key}\\` conflicts with --no- negation`);\n }\n }\n\n return def;\n}\n","import type { $ZodIssue } from \"zod/v4/core\";\nimport type { AnyCommandDef } from \"./command.ts\";\n\nexport interface HackshIssue {\n arg: string;\n message: string;\n issue?: $ZodIssue;\n}\n\nexport class HackshUsageError extends Error {\n readonly command: AnyCommandDef;\n\n constructor(message: string, command: AnyCommandDef, options?: ErrorOptions) {\n super(message, options);\n this.name = \"HackshUsageError\";\n this.command = command;\n }\n}\n\nexport class HackshValidationError extends HackshUsageError {\n readonly issues: ReadonlyArray<HackshIssue>;\n\n constructor(command: AnyCommandDef, issues: ReadonlyArray<HackshIssue>) {\n super(\n `Invalid arguments:\\n${issues.map(({ arg, message }) => ` ${arg}: ${message}`).join(\"\\n\")}`,\n command,\n );\n this.name = \"HackshValidationError\";\n this.issues = issues;\n }\n}\n\nexport type PromptKind = \"select\" | \"confirm\" | \"text\";\n\nexport type HackshPromptErrorReason =\n | \"non-interactive\"\n | \"cancelled\"\n | \"eof\"\n | \"overlapping\"\n | \"invalid-options\"\n | \"input-error\"\n | \"printer-error\";\n\nexport interface PromptErrorDetails {\n kind: PromptKind;\n message: string;\n choices?: readonly string[];\n}\n\n/** An input request that could not be completed safely. */\nexport class HackshPromptError extends Error {\n readonly reason: HackshPromptErrorReason;\n readonly prompt: PromptErrorDetails;\n\n constructor(\n reason: HackshPromptErrorReason,\n prompt: PromptErrorDetails,\n message: string,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.name = \"HackshPromptError\";\n this.reason = reason;\n this.prompt = prompt;\n }\n}\n\nexport type HackshErrorKind = \"error\" | \"prompt\" | \"usage\" | \"validation\" | \"thrown\";\n\nexport interface ValidationIssueSummary {\n arg: string;\n message: string;\n code?: string;\n path?: readonly PropertyKey[];\n details?: Readonly<Record<string, unknown>>;\n}\n\nexport interface HackshErrorSummary {\n kind: HackshErrorKind;\n name: string;\n message: string;\n stack?: string;\n cause?: unknown;\n issues?: readonly ValidationIssueSummary[];\n properties?: Readonly<Record<string, unknown>>;\n value?: unknown;\n}\n\nfunction safeString(value: unknown, fallback: string): string {\n try {\n return String(value);\n } catch {\n return fallback;\n }\n}\n\nfunction readProperty(value: object, key: PropertyKey): unknown {\n try {\n return Reflect.get(value, key);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction enumerableKeys(value: object): string[] {\n try {\n return Object.keys(value);\n } catch {\n return [];\n }\n}\n\nfunction hasToJSON(value: object): boolean {\n try {\n return typeof Reflect.get(value, \"toJSON\") === \"function\";\n } catch {\n return false;\n }\n}\n\nfunction isPlainObject(value: object): boolean {\n try {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n } catch {\n return false;\n }\n}\n\nfunction summarizeIssue(\n { arg, message, issue }: HackshIssue,\n seen: WeakMap<object, unknown>,\n): ValidationIssueSummary {\n if (!issue) return { arg, message };\n const details: Record<string, unknown> = {};\n for (const key of enumerableKeys(issue)) {\n if ([\"code\", \"path\", \"message\", \"inst\"].includes(key)) continue;\n details[key] = summarizeErrors(readProperty(issue, key), seen);\n }\n const code = readProperty(issue, \"code\");\n const path = readProperty(issue, \"path\");\n return {\n arg,\n message,\n ...(typeof code === \"string\" ? { code } : {}),\n ...(Array.isArray(path) ? { path } : {}),\n ...(Object.keys(details).length === 0 ? {} : { details }),\n };\n}\n\nfunction errorKind(error: Error): HackshErrorKind {\n if (error instanceof HackshPromptError) return \"prompt\";\n if (error instanceof HackshValidationError) return \"validation\";\n if (error instanceof HackshUsageError) return \"usage\";\n return \"error\";\n}\n\nfunction summarizeErrorWithSeen(error: Error, seen: WeakMap<object, unknown>): HackshErrorSummary {\n const summary: HackshErrorSummary = {\n kind: errorKind(error),\n name: safeString(readProperty(error, \"name\"), \"Error\"),\n message: safeString(readProperty(error, \"message\"), \"[Unserializable error message]\"),\n };\n seen.set(error, summary);\n\n const stack = readProperty(error, \"stack\");\n const cause = readProperty(error, \"cause\");\n if (typeof stack === \"string\") summary.stack = stack;\n if (cause !== undefined) summary.cause = summarizeErrors(cause, seen);\n if (error instanceof HackshValidationError) {\n summary.issues = error.issues.map((issue) => summarizeIssue(issue, seen));\n }\n\n const reserved = new Set([\"name\", \"message\", \"stack\", \"cause\", \"command\", \"issues\"]);\n const properties: Record<string, unknown> = {};\n for (const key of enumerableKeys(error)) {\n if (reserved.has(key)) continue;\n properties[key] = summarizeErrors(readProperty(error, key), seen);\n }\n if (Object.keys(properties).length > 0) summary.properties = properties;\n return summary;\n}\n\n/** Recursively replace Error values with command- and schema-free summaries. */\nexport function summarizeErrors(\n value: unknown,\n seen: WeakMap<object, unknown> = new WeakMap(),\n): unknown {\n if (typeof value !== \"object\" || value === null) return value;\n const existing = seen.get(value);\n if (existing !== undefined) return existing;\n if (value instanceof Error) return summarizeErrorWithSeen(value, seen);\n\n if (Array.isArray(value)) {\n const result: unknown[] = [];\n seen.set(value, result);\n let changed = false;\n for (const item of value) {\n const summarized = summarizeErrors(item, seen);\n result.push(summarized);\n changed ||= summarized !== item;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n }\n if (value instanceof Map) {\n const result = new Map<unknown, unknown>();\n seen.set(value, result);\n let changed = false;\n for (const [key, item] of value) {\n const summarizedKey = summarizeErrors(key, seen);\n const summarizedItem = summarizeErrors(item, seen);\n result.set(summarizedKey, summarizedItem);\n changed ||= summarizedKey !== key || summarizedItem !== item;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n }\n if (value instanceof Set) {\n const result = new Set<unknown>();\n seen.set(value, result);\n let changed = false;\n for (const item of value) {\n const summarized = summarizeErrors(item, seen);\n result.add(summarized);\n changed ||= summarized !== item;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n }\n if (ArrayBuffer.isView(value) || hasToJSON(value) || !isPlainObject(value)) return value;\n\n const result: Record<string, unknown> = {};\n seen.set(value, result);\n let changed = false;\n for (const key of enumerableKeys(value)) {\n const original = readProperty(value, key);\n const summarized = summarizeErrors(original, seen);\n result[key] = summarized;\n changed ||= summarized !== original;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n}\n\n/** Convert any thrown value into a canonical error description. */\nexport function summarizeError(error: unknown): HackshErrorSummary {\n if (error instanceof Error) return summarizeErrorWithSeen(error, new WeakMap());\n return {\n kind: \"thrown\",\n name: \"NonErrorThrown\",\n message: safeString(error, \"[Unserializable thrown value]\"),\n value: summarizeErrors(error),\n };\n}\n","import { parseArgs as parseNodeArgs } from \"node:util\";\nimport { safeParseAsync, type $ZodIssue, type output } from \"zod/v4/core\";\nimport type { AnyCommandDef, CommandDef } from \"./command.ts\";\nimport { HackshValidationError, type HackshIssue } from \"./errors.ts\";\nimport { aliasList, kebabCase } from \"./options.ts\";\nimport {\n POSITIONALS_KEY,\n readArgInfo,\n readPositionals,\n schemaShape,\n type ArgsSchema,\n type Positionals,\n} from \"./schema.ts\";\n\nexport interface ParsedCommand<S extends ArgsSchema> {\n args: output<S>;\n passthrough: string[];\n extraArgs: string[];\n}\n\ninterface OptionDefinition {\n readonly key: string;\n readonly kebabName: string;\n readonly takesValue: boolean;\n}\n\ninterface OptionModel {\n readonly definitions: Map<string, OptionDefinition>;\n readonly parserOptions: Record<string, { type: \"string\" | \"boolean\"; short?: string }>;\n readonly aliases: Set<string>;\n}\n\ninterface KnownOptionToken {\n readonly kind: \"known-option\";\n readonly index: number;\n readonly definition: OptionDefinition;\n readonly value: string | boolean;\n}\n\ninterface UnknownOptionToken {\n readonly kind: \"unknown-option\";\n readonly index: number;\n readonly value: string;\n}\n\ninterface PositionalToken {\n readonly kind: \"positional\";\n readonly index: number;\n readonly value: string;\n}\n\ntype CommandToken = KnownOptionToken | UnknownOptionToken | PositionalToken;\n\nexport interface TokenizedCommandArgs {\n readonly tokens: readonly CommandToken[];\n readonly passthrough: string[];\n readonly issues: readonly IndexedIssue[];\n readonly help: boolean;\n readonly helpIndex: number | undefined;\n readonly version: boolean;\n readonly versionIndex: number | undefined;\n}\n\ninterface IndexedIssue {\n readonly index: number;\n readonly issue: HackshIssue;\n}\n\nfunction optionModel(command: AnyCommandDef): OptionModel {\n const definitions = new Map<string, OptionDefinition>();\n const parserOptions: OptionModel[\"parserOptions\"] = {};\n const allAliases = new Set<string>();\n\n if (command.args) {\n for (const [key, schema] of Object.entries(schemaShape(command.args))) {\n if (key === POSITIONALS_KEY) continue;\n const alias = command.argOptions?.[key]?.alias;\n const aliases = alias ? aliasList(alias) : [];\n const definition: OptionDefinition = {\n key,\n kebabName: kebabCase(key),\n takesValue: readArgInfo(schema).takesValue,\n };\n const type = definition.takesValue ? \"string\" : \"boolean\";\n for (const name of new Set([key, definition.kebabName])) {\n definitions.set(name, definition);\n parserOptions[name] = { type };\n }\n for (const alias of aliases) {\n allAliases.add(alias);\n definitions.set(alias, definition);\n parserOptions[alias] = { type, short: alias };\n }\n }\n }\n return { definitions, parserOptions, aliases: allAliases };\n}\n\nfunction commandPositionals(command: AnyCommandDef): Positionals | undefined {\n return command.args ? readPositionals(schemaShape(command.args)) : undefined;\n}\n\nfunction displayName(command: AnyCommandDef, path: readonly PropertyKey[]): string {\n const [first, index] = path;\n if (typeof first !== \"string\") return \"arguments\";\n if (first !== POSITIONALS_KEY) return `--${kebabCase(first)}`;\n const positionals = commandPositionals(command);\n if (!positionals || typeof index !== \"number\") return \"arguments\";\n const item = positionals.items[index];\n if (item) return `<${item.label}>`;\n return positionals.rest ? `<${positionals.rest.label}...>` : \"arguments\";\n}\n\nexport function tokenizeCommandArgs(\n command: AnyCommandDef,\n rawArgs: readonly string[],\n): TokenizedCommandArgs {\n const model = optionModel(command);\n const separator = rawArgs.indexOf(\"--\");\n const beforeSeparator = separator === -1 ? [...rawArgs] : rawArgs.slice(0, separator);\n const passthrough = separator === -1 ? [] : rawArgs.slice(separator + 1);\n const negativeIndexes = new Set<number>();\n const valuedNegativeIndexes = new Set<number>();\n const issues: IndexedIssue[] = [];\n let recordedMissingValue = false;\n const parserArgs = beforeSeparator.map((raw, index) => {\n if (!raw.startsWith(\"--no-\")) return raw;\n const equals = raw.indexOf(\"=\");\n const name = raw.slice(5, equals === -1 ? undefined : equals);\n const definition = model.definitions.get(name);\n if (!definition || definition.takesValue) return raw;\n negativeIndexes.add(index);\n if (equals !== -1) {\n valuedNegativeIndexes.add(index);\n return `--${definition.key}${raw.slice(equals)}`;\n }\n return `--${definition.key}`;\n });\n\n const parsed = parseNodeArgs({\n args: parserArgs,\n options: model.parserOptions,\n allowPositionals: true,\n strict: false,\n tokens: true,\n });\n const tokens: CommandToken[] = [];\n const unknownIndexes = new Set<number>();\n let help = false;\n let helpIndex: number | undefined;\n let version = false;\n let versionIndex: number | undefined;\n for (const token of parsed.tokens) {\n if (token.kind === \"positional\") {\n tokens.push({ kind: \"positional\", index: token.index, value: token.value });\n continue;\n }\n if (token.kind !== \"option\") continue;\n const isHelp =\n token.rawName === \"--help\" || (token.rawName === \"-h\" && !model.aliases.has(\"h\"));\n const isVersion =\n token.rawName === \"--version\" || (token.rawName === \"-v\" && !model.aliases.has(\"v\"));\n if (isHelp) {\n help = true;\n helpIndex ??= token.index;\n }\n if (isVersion) {\n version = true;\n versionIndex ??= token.index;\n }\n const definition = model.definitions.get(token.name);\n if (definition) {\n if (\n definition.takesValue &&\n (token.value === undefined ||\n (!token.inlineValue && token.value.startsWith(\"-\") && token.value !== \"-\"))\n ) {\n if (!recordedMissingValue) {\n issues.push({\n index: token.index,\n issue: { arg: `--${definition.kebabName}`, message: \"requires a value\" },\n });\n recordedMissingValue = true;\n }\n }\n let value: string | boolean = token.value ?? true;\n if (!definition.takesValue) {\n if (valuedNegativeIndexes.has(token.index)) {\n const rawName = beforeSeparator[token.index]!.split(\"=\", 1)[0]!;\n issues.push({\n index: token.index,\n issue: { arg: rawName, message: \"does not accept a value\" },\n });\n value = false;\n } else if (negativeIndexes.has(token.index)) {\n value = false;\n } else if (token.inlineValue) {\n if (token.value === \"true\") value = true;\n else if (token.value === \"false\") value = false;\n else {\n issues.push({\n index: token.index,\n issue: { arg: token.rawName, message: \"expects true or false\" },\n });\n }\n }\n }\n tokens.push({\n kind: \"known-option\",\n index: token.index,\n definition,\n value: definition.takesValue ? (token.value ?? \"\") : value,\n });\n } else if (!unknownIndexes.has(token.index)) {\n unknownIndexes.add(token.index);\n tokens.push({\n kind: \"unknown-option\",\n index: token.index,\n value: beforeSeparator[token.index]!,\n });\n }\n }\n\n return {\n tokens,\n passthrough,\n issues,\n help,\n helpIndex,\n version,\n versionIndex,\n };\n}\n\nexport function tokenizedBefore(\n tokenized: TokenizedCommandArgs,\n endIndex: number,\n): TokenizedCommandArgs {\n const help = tokenized.helpIndex !== undefined && tokenized.helpIndex < endIndex;\n const version = tokenized.versionIndex !== undefined && tokenized.versionIndex < endIndex;\n return {\n tokens: tokenized.tokens.filter((token) => token.index < endIndex),\n passthrough: [],\n issues: tokenized.issues.filter(({ index }) => index < endIndex),\n help,\n helpIndex: help ? tokenized.helpIndex : undefined,\n version,\n versionIndex: version ? tokenized.versionIndex : undefined,\n };\n}\n\nfunction zodIssues(command: AnyCommandDef, issues: readonly $ZodIssue[]): HackshIssue[] {\n return issues.map((issue) => ({\n arg: displayName(command, issue.path),\n message: issue.message,\n issue,\n }));\n}\n\nexport async function parseCommandArgs<S extends ArgsSchema>(\n command: CommandDef<S>,\n rawArgs: string[],\n tokenized: TokenizedCommandArgs = tokenizeCommandArgs(command, rawArgs),\n): Promise<ParsedCommand<S>> {\n if (tokenized.issues.length > 0) {\n throw new HackshValidationError(\n command,\n tokenized.issues.map(({ issue }) => issue),\n );\n }\n\n const input: Record<string, string | boolean | string[] | undefined> = {};\n const positionals = commandPositionals(command);\n const positionalValues: string[] = [];\n if (positionals) input[POSITIONALS_KEY] = positionalValues;\n const extraArgs: string[] = [];\n for (const token of tokenized.tokens) {\n if (token.kind === \"known-option\") input[token.definition.key] = token.value;\n else if (token.kind === \"unknown-option\") extraArgs.push(token.value);\n else if (\n positionals &&\n (positionals.rest || positionalValues.length < positionals.items.length)\n ) {\n positionalValues.push(token.value);\n } else extraArgs.push(token.value);\n }\n\n if (!command.args)\n return { args: input as output<S>, passthrough: tokenized.passthrough, extraArgs };\n const result = await safeParseAsync(command.args, input);\n if (!result.success)\n throw new HackshValidationError(command, zodIssues(command, result.error.issues));\n return { args: result.data, passthrough: tokenized.passthrough, extraArgs };\n}\n\n/**\n * Parse and validate one command segment without routing, builtin handling, or output.\n */\nexport async function parseArgs<S extends ArgsSchema>(\n command: CommandDef<S>,\n argv: string[],\n): Promise<output<S>> {\n return (await parseCommandArgs(command, argv)).args;\n}\n","import { stripVTControlCharacters } from \"node:util\";\nimport { summarizeError } from \"./errors.ts\";\n\nfunction safeString(value: unknown): string {\n try {\n return String(value);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction normalizeProperty(value: object, key: PropertyKey, ancestors: Set<object>): unknown {\n try {\n return normalizeJson(Reflect.get(value, key), ancestors);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction normalizedKeys(value: object): string[] | undefined {\n try {\n return Object.keys(value);\n } catch {\n return undefined;\n }\n}\n\nconst noToJson = Symbol(\"noToJson\");\n\nfunction normalizedToJson(value: object, ancestors: Set<object>): unknown {\n let toJSON: unknown;\n try {\n toJSON = Reflect.get(value, \"toJSON\");\n } catch {\n return noToJson;\n }\n if (typeof toJSON !== \"function\") return noToJson;\n try {\n const result = Reflect.apply(toJSON, value, []);\n return result === value ? noToJson : normalizeJson(result, ancestors);\n } catch {\n return noToJson;\n }\n}\n\nfunction isArrayBufferView(value: object): value is ArrayBufferView {\n try {\n return ArrayBuffer.isView(value);\n } catch {\n return false;\n }\n}\n\n/** Normalize arbitrary event data into values accepted by JSON.stringify. */\nexport function normalizeJson(value: unknown, ancestors = new Set<object>()): unknown {\n switch (typeof value) {\n case \"string\":\n return stripVTControlCharacters(value);\n case \"boolean\":\n return value;\n case \"number\":\n return Number.isFinite(value) ? value : null;\n case \"bigint\":\n return value.toString();\n case \"undefined\":\n return \"[undefined]\";\n case \"symbol\":\n return `[symbol:${stripVTControlCharacters(value.description ?? \"\")}]`;\n case \"function\":\n return `[function:${stripVTControlCharacters(value.name || \"anonymous\")}]`;\n case \"object\":\n break;\n }\n if (value === null) return null;\n if (ancestors.has(value)) return \"[Circular]\";\n\n const nextAncestors = new Set(ancestors).add(value);\n if (value instanceof Error) return normalizeJson(summarizeError(value), nextAncestors);\n\n const jsonValue = normalizedToJson(value, nextAncestors);\n if (jsonValue !== noToJson) return jsonValue;\n\n if (isArrayBufferView(value)) {\n if (value instanceof DataView) {\n return Array.from(new Uint8Array(value.buffer, value.byteOffset, value.byteLength));\n }\n try {\n return Array.from(value as unknown as Iterable<unknown>, (item) =>\n normalizeJson(item, nextAncestors),\n );\n } catch {\n return \"[Unserializable]\";\n }\n }\n if (value instanceof ArrayBuffer) return Array.from(new Uint8Array(value));\n if (Array.isArray(value)) {\n return Array.from({ length: value.length }, (_, index) =>\n normalizeProperty(value, index, nextAncestors),\n );\n }\n if (value instanceof Map) {\n try {\n return [...value].map(([key, item]) => [\n normalizeJson(key, nextAncestors),\n normalizeJson(item, nextAncestors),\n ]);\n } catch {\n return \"[Unserializable]\";\n }\n }\n if (value instanceof Set) {\n try {\n return [...value].map((item) => normalizeJson(item, nextAncestors));\n } catch {\n return \"[Unserializable]\";\n }\n }\n\n const keys = normalizedKeys(value);\n if (!keys) return safeString(value);\n const result: Record<string, unknown> = {};\n for (const key of keys) {\n result[stripVTControlCharacters(key)] = normalizeProperty(value, key, nextAncestors);\n }\n return result;\n}\n","import type { HackshErrorSummary } from \"./errors.ts\";\nimport type { LogRecord } from \"./logger.ts\";\nimport { normalizeJson } from \"./serialization.ts\";\nimport type { UsageSummary } from \"./usage.ts\";\n\nexport type PrintStream = \"stdout\" | \"stderr\";\nexport type OutputPreference = \"auto\" | \"pretty\" | \"json\";\nexport type OutputFormat = Exclude<OutputPreference, \"auto\">;\n\nexport interface OutputMode {\n format: OutputFormat;\n interactive: boolean;\n color: boolean;\n}\n\nexport interface ResolveOutputModeOptions {\n output?: OutputPreference;\n env?: Readonly<Record<string, string | undefined>>;\n inputIsTTY?: boolean;\n outputIsTTY?: boolean;\n}\n\nfunction fallbackValue(value: unknown): string {\n try {\n return String(value);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction validatePreference(value: unknown, source: string): OutputPreference | undefined {\n if (value === undefined) return undefined;\n if (value === \"auto\" || value === \"pretty\" || value === \"json\") return value;\n throw new TypeError(\n `Invalid ${source} value ${fallbackValue(value)}; expected auto, pretty, or json`,\n );\n}\n\nfunction readEnvironment(\n env: Readonly<Record<string, string | undefined>>,\n key: string,\n): string | undefined {\n try {\n return env[key];\n } catch {\n return undefined;\n }\n}\n\n/** Resolve output behavior once, before command routing or argument parsing. */\nexport function resolveOutputMode(options: ResolveOutputModeOptions = {}): OutputMode {\n const env = options.env ?? process.env;\n const configured = validatePreference(options.output, \"output\");\n const overridden = validatePreference(readEnvironment(env, \"HACKSH_OUTPUT\"), \"HACKSH_OUTPUT\");\n const requested = overridden ?? configured ?? \"auto\";\n const ci = Boolean(readEnvironment(env, \"CI\"));\n const format = requested === \"auto\" ? (ci ? \"json\" : \"pretty\") : requested;\n const inputIsTTY = options.inputIsTTY ?? process.stdin.isTTY === true;\n const outputIsTTY = options.outputIsTTY ?? process.stdout.isTTY === true;\n return {\n format,\n interactive: format === \"pretty\" && !ci && inputIsTTY && outputIsTTY,\n color: format === \"pretty\" && outputIsTTY && !readEnvironment(env, \"NO_COLOR\"),\n };\n}\n\nexport interface UsagePrintEvent {\n type: \"usage\";\n usage: UsageSummary;\n text: string;\n stream: PrintStream;\n}\n\nexport interface VersionPrintEvent {\n type: \"version\";\n version: string;\n}\n\nexport interface ErrorPrintEvent {\n type: \"error\";\n error: HackshErrorSummary;\n}\n\nexport interface LogPrintEvent {\n type: \"log\";\n record: LogRecord;\n}\n\nexport interface PromptChoiceState {\n value: string;\n label: string;\n hint?: string;\n selected: boolean;\n}\n\nexport type PromptStatus = \"active\" | \"error\" | \"submitted\" | \"closed\";\n\ninterface PromptStateBase {\n message: string;\n status: PromptStatus;\n error?: string;\n}\n\nexport interface SelectPromptState extends PromptStateBase {\n kind: \"select\";\n choices: readonly PromptChoiceState[];\n value: string;\n}\n\nexport interface ConfirmPromptState extends PromptStateBase {\n kind: \"confirm\";\n value: boolean;\n defaultValue?: boolean;\n}\n\nexport interface TextPromptState extends PromptStateBase {\n kind: \"text\";\n value: string;\n placeholder?: string;\n}\n\nexport type PromptState = SelectPromptState | ConfirmPromptState | TextPromptState;\n\nexport interface PromptPrintEvent {\n type: \"prompt\";\n prompt: PromptState;\n}\n\n/** A semantic, command- and schema-free output value emitted by hacksh. */\nexport type PrintEvent =\n | UsagePrintEvent\n | VersionPrintEvent\n | ErrorPrintEvent\n | LogPrintEvent\n | PromptPrintEvent;\n\n/** Receives every output event produced by one command invocation. */\nexport interface Printer {\n print(event: PrintEvent): void | Promise<void>;\n}\n\nfunction isErrorLevel(level: LogRecord[\"level\"]): boolean {\n return level === \"warning\" || level === \"error\" || level === \"fatal\";\n}\n\nexport function eventStream(event: PrintEvent): PrintStream {\n if (event.type === \"error\") return \"stderr\";\n if (event.type === \"usage\") return event.stream;\n if (event.type === \"log\" && isErrorLevel(event.record.level)) return \"stderr\";\n return \"stdout\";\n}\n\nfunction formatTextEvent(event: PrintEvent): string {\n switch (event.type) {\n case \"usage\":\n return event.text;\n case \"version\":\n return event.version;\n case \"error\":\n return event.error.kind === \"usage\" || event.error.kind === \"validation\"\n ? event.error.message\n : `Error: ${event.error.message}`;\n case \"log\":\n return event.record.message;\n case \"prompt\":\n return event.prompt.message;\n }\n}\n\n/** Undecorated console compatibility adapter; automatic output uses the selected format printer. */\nexport const consolePrinter: Printer = {\n print(event) {\n const text = formatTextEvent(event);\n return eventStream(event) === \"stdout\" ? console.log(text) : console.error(text);\n },\n};\n\nexport interface OutputWriter {\n write(text: string): unknown;\n}\n\nexport interface TerminalInput {\n readonly isTTY?: boolean;\n readonly isRaw?: boolean;\n readonly readableFlowing?: boolean | null;\n setRawMode?(mode: boolean): unknown;\n resume(): unknown;\n pause(): unknown;\n on(event: string, listener: (...args: never[]) => void): unknown;\n removeListener(event: string, listener: (...args: never[]) => void): unknown;\n}\n\nexport interface TerminalOutput extends OutputWriter {\n readonly isTTY?: boolean;\n readonly columns?: number;\n}\n\nexport interface JsonPrinterOptions {\n stdout?: OutputWriter;\n stderr?: OutputWriter;\n}\n\nexport interface StreamPrinterOptions {\n stdout: OutputWriter;\n stderr: OutputWriter;\n}\n\n/** Create an undecorated stream-backed compatibility adapter. */\nexport function createStreamPrinter(options: StreamPrinterOptions): Printer {\n return {\n print(event) {\n const writer = eventStream(event) === \"stdout\" ? options.stdout : options.stderr;\n writer.write(`${formatTextEvent(event)}\\n`);\n },\n };\n}\n\n/** Create a one-semantic-event-per-line JSON printer. */\nexport function createJsonPrinter(options: JsonPrinterOptions = {}): Printer {\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n return {\n print(event) {\n let serialized: string;\n try {\n serialized = JSON.stringify(normalizeJson(event));\n } catch {\n serialized = JSON.stringify({\n type: event.type,\n serializationError: \"Event data could not be serialized\",\n });\n }\n const line = `${serialized}\\n`;\n (eventStream(event) === \"stdout\" ? stdout : stderr).write(line);\n },\n };\n}\n\nexport interface PrintQueue {\n printer: Printer;\n printChecked(event: PrintEvent): Promise<void>;\n drain(): Promise<void>;\n}\n\n/** Serialize printer calls and retain failures until the invocation drains its output. */\nexport function createPrintQueue(target: Printer): PrintQueue {\n let pending: Promise<void> | undefined;\n let failure: unknown;\n let failed = false;\n\n function recordFailure(error: unknown): void {\n if (!failed) failure = error;\n failed = true;\n }\n\n function track(execution: Promise<void>, retainFailure: boolean): Promise<void> {\n const barrier = execution.catch((error: unknown) => {\n if (retainFailure) recordFailure(error);\n });\n pending = barrier;\n void barrier.then(() => {\n if (pending === barrier) pending = undefined;\n });\n return retainFailure ? barrier : execution;\n }\n\n function enqueue(event: PrintEvent, retainFailure: boolean): void | Promise<void> {\n if (pending)\n return track(\n pending.then(() => target.print(event)),\n retainFailure,\n );\n try {\n const result = target.print(event);\n if (result) return track(Promise.resolve(result), retainFailure);\n } catch (error) {\n if (retainFailure) recordFailure(error);\n else return Promise.reject(error);\n }\n }\n\n const printer: Printer = {\n print(event) {\n return enqueue(event, true);\n },\n };\n\n return {\n printer,\n async printChecked(event) {\n await enqueue(event, false);\n },\n async drain() {\n await pending;\n if (failed) throw failure;\n },\n };\n}\n","import { inspect, stripVTControlCharacters, styleText } from \"node:util\";\nimport type { HackshErrorSummary } from \"./errors.ts\";\nimport type { LogLevel, LogRecord } from \"./logger.ts\";\nimport {\n eventStream,\n type OutputWriter,\n type Printer,\n type PrintEvent,\n type TerminalOutput,\n} from \"./printer.ts\";\n\ntype PrettyMark = LogLevel | \"step\" | \"success\" | \"usage\" | \"version\" | \"errorEvent\" | \"prompt\";\ntype TextStyle = Parameters<typeof styleText>[0];\n\ninterface PrettySymbols {\n bar: string;\n marks: Record<PrettyMark, string>;\n}\n\nconst unicodeSymbols: PrettySymbols = {\n bar: \"│\",\n marks: {\n trace: \"·\",\n debug: \"◆\",\n info: \"●\",\n warning: \"▲\",\n error: \"■\",\n fatal: \"✖\",\n step: \"◇\",\n success: \"✔\",\n usage: \"◆\",\n version: \"●\",\n errorEvent: \"■\",\n prompt: \"?\",\n },\n};\n\nconst asciiSymbols: PrettySymbols = {\n bar: \"|\",\n marks: {\n trace: \".\",\n debug: \":\",\n info: \"i\",\n warning: \"!\",\n error: \"x\",\n fatal: \"X\",\n step: \">\",\n success: \"+\",\n usage: \"?\",\n version: \"i\",\n errorEvent: \"x\",\n prompt: \"?\",\n },\n};\n\nconst markStyles: Record<PrettyMark, TextStyle> = {\n trace: \"gray\",\n debug: \"magenta\",\n info: \"blue\",\n warning: \"yellow\",\n error: \"red\",\n fatal: [\"bgRed\", \"white\", \"bold\"],\n step: \"cyan\",\n success: \"green\",\n usage: \"cyan\",\n version: \"blue\",\n errorEvent: \"red\",\n prompt: \"cyan\",\n};\n\nexport interface PrettyPrinterOptions {\n color: boolean;\n unicode: boolean;\n stdout?: TerminalOutput;\n stderr?: OutputWriter;\n}\n\nfunction safelyInspect(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return inspect(value, {\n breakLength: 80,\n colors: false,\n compact: false,\n depth: null,\n sorted: true,\n });\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction propertyLines(properties: Readonly<Record<string, unknown>>): string[] {\n const lines: string[] = [];\n for (const key of Object.keys(properties).sort()) {\n const rendered = ` ${key}: ${safelyInspect(properties[key])}`.split(\"\\n\");\n lines.push(rendered[0] ?? \"\");\n for (const continuation of rendered.slice(1)) lines.push(` ${continuation}`);\n }\n return lines;\n}\n\nfunction logLines(record: LogRecord): string[] {\n const category = record.category.length > 0 ? `[${record.category.join(\":\")}] ` : \"\";\n const message = record.message.split(\"\\n\");\n return [\n `${category}${message[0] ?? \"\"}`,\n ...message.slice(1),\n ...propertyLines(record.properties),\n ];\n}\n\nfunction errorLines(error: HackshErrorSummary): string[] {\n const lines = error.message.split(\"\\n\");\n const details: Record<string, unknown> = {};\n if (error.cause !== undefined) details.cause = error.cause;\n if (error.properties !== undefined) Object.assign(details, error.properties);\n if (error.value !== undefined) details.value = error.value;\n return [...lines, ...propertyLines(details)];\n}\n\nfunction eventMark(event: PrintEvent): PrettyMark {\n if (event.type === \"usage\") return \"usage\";\n if (event.type === \"version\") return \"version\";\n if (event.type === \"error\") return \"errorEvent\";\n if (event.type === \"prompt\") return event.prompt.status === \"submitted\" ? \"success\" : \"prompt\";\n return event.record.kind === \"message\" ? event.record.level : event.record.kind;\n}\n\nfunction eventLines(event: PrintEvent): string[] {\n switch (event.type) {\n case \"usage\":\n return event.text.split(\"\\n\");\n case \"version\":\n return event.version.split(\"\\n\");\n case \"error\":\n return errorLines(event.error);\n case \"log\":\n return logLines(event.record);\n case \"prompt\": {\n const { prompt } = event;\n if (prompt.status === \"submitted\") {\n const result =\n prompt.kind === \"select\"\n ? (prompt.choices.find(({ value }) => value === prompt.value)?.label ?? prompt.value)\n : prompt.kind === \"confirm\"\n ? prompt.value\n ? \"Yes\"\n : \"No\"\n : prompt.value;\n return [`${prompt.message}: ${result}`];\n }\n const lines = [prompt.message];\n if (prompt.kind === \"select\") {\n for (const choice of prompt.choices) {\n lines.push(\n `${choice.selected ? \">\" : \" \"} ${choice.label}${choice.hint ? ` — ${choice.hint}` : \"\"}`,\n );\n }\n } else if (prompt.kind === \"confirm\") {\n lines.push(\n `${prompt.value ? \"Yes\" : \"No\"}${prompt.defaultValue === undefined ? \"\" : ` (default: ${prompt.defaultValue ? \"yes\" : \"no\"})`}`,\n );\n } else {\n lines.push(prompt.value || (prompt.placeholder ? `(${prompt.placeholder})` : \"\"));\n }\n if (prompt.error) lines.push(prompt.error);\n return lines;\n }\n }\n}\n\nfunction colorize(enabled: boolean, style: TextStyle, text: string): string {\n return enabled ? styleText(style, text, { validateStream: false }) : text;\n}\n\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\nconst combiningMark = /\\p{Mark}/u;\nconst pictograph = /\\p{Extended_Pictographic}/u;\n\nfunction isWideCodePoint(codePoint: number): boolean {\n return (\n codePoint >= 0x1100 &&\n (codePoint <= 0x115f ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd))\n );\n}\n\nfunction displayWidth(text: string): number {\n let width = 0;\n for (const { segment } of graphemeSegmenter.segment(stripVTControlCharacters(text))) {\n if (segment === \"\\t\") {\n width += 8 - (width % 8);\n continue;\n }\n if (\n pictograph.test(segment) ||\n Array.from(segment).some((value) => isWideCodePoint(value.codePointAt(0)!))\n ) {\n width += 2;\n continue;\n }\n for (const value of segment) {\n const codePoint = value.codePointAt(0)!;\n if (codePoint < 0x20 || (codePoint >= 0x7f && codePoint < 0xa0)) continue;\n if (codePoint === 0x200d || (codePoint >= 0xfe00 && codePoint <= 0xfe0f)) continue;\n if (!combiningMark.test(value)) width += 1;\n }\n }\n return width;\n}\n\nfunction renderedRows(rendered: string, columns: number | undefined): number {\n const width =\n Number.isInteger(columns) && columns !== undefined && columns > 0 ? columns : undefined;\n return rendered.split(\"\\n\").reduce((rows, line) => {\n if (!width) return rows + 1;\n return rows + Math.max(1, Math.ceil(displayWidth(line) / width));\n }, 0);\n}\n\n/** Create the fixed human-readable renderer used for pretty output. */\nexport function createPrettyPrinter(options: PrettyPrinterOptions): Printer {\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n const symbols = options.unicode ? unicodeSymbols : asciiSymbols;\n let activePrompt: { rendered: string; lines: number } | undefined;\n\n function render(event: PrintEvent): string {\n const mark = eventMark(event);\n const lines = eventLines(event);\n const firstPrefix = colorize(options.color, markStyles[mark], symbols.marks[mark]);\n const barPrefix = colorize(options.color, \"gray\", symbols.bar);\n return lines\n .map((line, index) => `${index === 0 ? firstPrefix : barPrefix}${line ? ` ${line}` : \"\"}`)\n .join(\"\\n\");\n }\n\n function eraseActivePrompt(): string {\n return activePrompt ? \"\\u001b[1A\\u001b[2K\".repeat(activePrompt.lines) : \"\";\n }\n\n return {\n print(event) {\n const rendered = render(event);\n if (event.type === \"prompt\") {\n const erase = eraseActivePrompt();\n if (event.prompt.status === \"closed\") {\n activePrompt = undefined;\n if (erase) stdout.write(erase);\n return;\n }\n if (event.prompt.status === \"submitted\") activePrompt = undefined;\n else activePrompt = { rendered, lines: renderedRows(rendered, stdout.columns) };\n stdout.write(`${erase}${rendered}\\n`);\n return;\n }\n\n const erase = eraseActivePrompt();\n if (!activePrompt) {\n (eventStream(event) === \"stdout\" ? stdout : stderr).write(`${rendered}\\n`);\n return;\n }\n\n stdout.write(erase);\n if (event.type === \"error\") activePrompt = undefined;\n (eventStream(event) === \"stdout\" ? stdout : stderr).write(`${rendered}\\n`);\n if (activePrompt) stdout.write(`${activePrompt.rendered}\\n`);\n },\n };\n}\n","import { emitKeypressEvents } from \"node:readline\";\nimport { PassThrough } from \"node:stream\";\nimport type { HackshPromptErrorReason, PromptErrorDetails, PromptKind } from \"./errors.ts\";\nimport { HackshPromptError } from \"./errors.ts\";\nimport type {\n ConfirmPromptState,\n Printer,\n PromptState,\n PromptStatus,\n SelectPromptState,\n TerminalInput,\n TextPromptState,\n} from \"./printer.ts\";\n\nexport interface SelectOption<T extends string> {\n value: T;\n label?: string;\n hint?: string;\n}\n\nexport interface SelectOptions<T extends string> {\n message: string;\n options: readonly SelectOption<T>[];\n initialValue?: T;\n}\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n}\n\nexport interface TextOptions {\n message: string;\n placeholder?: string;\n validate?(value: string): string | undefined;\n}\n\nexport interface Prompter {\n select<const T extends string>(options: SelectOptions<T>): Promise<T>;\n confirm(options: ConfirmOptions): Promise<boolean>;\n text(options: TextOptions): Promise<string>;\n}\n\ninterface Key {\n name?: string;\n ctrl?: boolean;\n meta?: boolean;\n sequence?: string;\n}\n\ninterface PromptControllerOptions {\n interactive: boolean;\n input: TerminalInput;\n print(event: Parameters<Printer[\"print\"]>[0]): Promise<void>;\n}\n\ninterface BufferedKeypress {\n character: string | undefined;\n key: Key;\n}\n\nfunction details(\n kind: PromptKind,\n message: unknown,\n choices?: readonly string[],\n): PromptErrorDetails {\n let normalizedMessage: string;\n try {\n normalizedMessage = typeof message === \"string\" ? message : String(message);\n } catch {\n normalizedMessage = \"[Unserializable prompt message]\";\n }\n return {\n kind,\n message: normalizedMessage,\n ...(choices === undefined ? {} : { choices }),\n };\n}\n\nfunction promptError(\n reason: HackshPromptErrorReason,\n prompt: PromptErrorDetails,\n message: string,\n cause?: unknown,\n): HackshPromptError {\n return new HackshPromptError(\n reason,\n prompt,\n message,\n cause === undefined ? undefined : { cause },\n );\n}\n\nfunction validateMessage(kind: PromptKind, message: unknown, choices?: readonly string[]): void {\n if (typeof message !== \"string\" || message.length === 0) {\n throw promptError(\n \"invalid-options\",\n details(kind, message, choices),\n `Invalid ${kind} prompt: message must be a non-empty string`,\n );\n }\n}\n\nfunction asInput(value: TerminalInput, prompt: PromptErrorDetails): TerminalInput {\n if (\n typeof value !== \"object\" ||\n value === null ||\n typeof Reflect.get(value, \"on\") !== \"function\" ||\n typeof Reflect.get(value, \"removeListener\") !== \"function\" ||\n typeof Reflect.get(value, \"resume\") !== \"function\" ||\n typeof Reflect.get(value, \"pause\") !== \"function\"\n ) {\n throw promptError(\"input-error\", prompt, \"Interactive input is not a readable stream\");\n }\n return value;\n}\n\nexport class PromptController implements Prompter {\n readonly #interactive: boolean;\n readonly #inputValue: TerminalInput;\n readonly #printEvent: PromptControllerOptions[\"print\"];\n readonly #bufferedKeys: BufferedKeypress[] = [];\n #active = false;\n\n constructor(options: PromptControllerOptions) {\n this.#interactive = options.interactive;\n this.#inputValue = options.input;\n this.#printEvent = (event) => options.print(event);\n }\n\n async #print(state: PromptState, prompt: PromptErrorDetails): Promise<void> {\n try {\n await this.#printEvent({ type: \"prompt\", prompt: state });\n } catch (cause) {\n throw promptError(\"printer-error\", prompt, \"The prompt could not be displayed\", cause);\n }\n }\n\n async #run<T>(\n prompt: PromptErrorDetails,\n initial: PromptState,\n accept: (character: string, key: Key) => T | undefined,\n update: (character: string, key: Key) => PromptState | undefined,\n submitted: (value: T) => PromptState,\n closed: () => PromptState,\n ): Promise<T> {\n if (!this.#interactive) {\n throw promptError(\n \"non-interactive\",\n prompt,\n `Cannot request ${prompt.kind} input in non-interactive mode: ${prompt.message}`,\n );\n }\n if (this.#active) {\n throw promptError(\"overlapping\", prompt, \"Another prompt is already active\");\n }\n\n const input = asInput(this.#inputValue, prompt);\n this.#active = true;\n let originallyFlowing = false;\n let rawChanged = false;\n let outcome: { ok: true; value: T } | { ok: false; error: unknown };\n try {\n originallyFlowing = input.readableFlowing === true;\n if (input.setRawMode && input.isRaw !== true) {\n input.setRawMode(true);\n rawChanged = true;\n }\n await this.#print(initial, prompt);\n\n const value = await new Promise<T>((resolve, reject) => {\n const keypressInput = new PassThrough();\n emitKeypressEvents(keypressInput);\n let settled = false;\n let draining = false;\n let finalized = false;\n let completion: (() => void) | undefined;\n const queuedKeys = this.#bufferedKeys.splice(0);\n const finalize = (): void => {\n if (finalized || !settled || draining) return;\n finalized = true;\n cleanup();\n completion?.();\n };\n const finish = (action: () => void): void => {\n if (settled) return;\n settled = true;\n completion = action;\n finalize();\n };\n const fail = (reason: HackshPromptErrorReason, message: string, cause?: unknown): void => {\n finish(() => reject(promptError(reason, prompt, message, cause)));\n };\n const handleKeypress = async (\n character: string | undefined,\n key: Key = {},\n ): Promise<void> => {\n if (settled) return;\n if ((key.ctrl && key.name === \"c\") || key.name === \"escape\") {\n fail(\"cancelled\", \"Prompt cancelled\");\n return;\n }\n if (key.ctrl && key.name === \"d\") {\n fail(\"eof\", \"Prompt input ended before a value was submitted\");\n return;\n }\n try {\n const value = accept(character ?? \"\", key);\n if (value !== undefined) {\n finish(() => resolve(value));\n return;\n }\n const state = update(character ?? \"\", key);\n if (state) await this.#print(state, prompt);\n } catch (cause) {\n if (cause instanceof HackshPromptError) finish(() => reject(cause));\n else fail(\"input-error\", \"Prompt input could not be processed\", cause);\n }\n };\n const drainKeys = async (): Promise<void> => {\n if (draining || finalized) return;\n draining = true;\n try {\n while (queuedKeys.length > 0) {\n if (settled) {\n this.#bufferedKeys.push(...queuedKeys.splice(0));\n break;\n }\n const next = queuedKeys.shift()!;\n await handleKeypress(next.character, next.key);\n }\n } finally {\n draining = false;\n finalize();\n }\n };\n const onKeypress = (character: string | undefined, key: Key = {}): void => {\n queuedKeys.push({ character, key });\n void drainKeys().catch((cause: unknown) =>\n fail(\"input-error\", \"Prompt input could not be processed\", cause),\n );\n };\n const onEnd = (): void => fail(\"eof\", \"Prompt input ended before a value was submitted\");\n const onError = (cause: unknown): void => fail(\"input-error\", \"Prompt input failed\", cause);\n const onData = (chunk: unknown): void => {\n if (typeof chunk === \"string\" || chunk instanceof Uint8Array) keypressInput.write(chunk);\n else fail(\"input-error\", \"Prompt input produced a non-byte value\");\n };\n const cleanup = (): void => {\n keypressInput.removeListener(\"keypress\", onKeypress);\n keypressInput.destroy();\n input.removeListener(\"data\", onData as (...args: never[]) => void);\n input.removeListener(\"end\", onEnd as (...args: never[]) => void);\n input.removeListener(\"close\", onEnd as (...args: never[]) => void);\n input.removeListener(\"error\", onError as (...args: never[]) => void);\n };\n keypressInput.on(\"keypress\", onKeypress);\n input.on(\"data\", onData as (...args: never[]) => void);\n input.on(\"end\", onEnd as (...args: never[]) => void);\n input.on(\"close\", onEnd as (...args: never[]) => void);\n input.on(\"error\", onError as (...args: never[]) => void);\n input.resume();\n void drainKeys().catch((cause: unknown) =>\n fail(\"input-error\", \"Prompt input could not be processed\", cause),\n );\n });\n outcome = { ok: true, value };\n } catch (cause) {\n outcome = {\n ok: false,\n error:\n cause instanceof HackshPromptError\n ? cause\n : promptError(\"input-error\", prompt, \"Prompt input could not be initialized\", cause),\n };\n }\n\n let restoreError: HackshPromptError | undefined;\n try {\n if (rawChanged) input.setRawMode?.(false);\n if (!originallyFlowing) input.pause();\n } catch (cause) {\n restoreError = promptError(\n \"input-error\",\n prompt,\n \"Prompt input could not be restored\",\n cause,\n );\n }\n const closeWithFailure = async (failure: unknown): Promise<never> => {\n try {\n await this.#print(closed(), prompt);\n } catch {\n // Preserve the error that terminated the prompt, including an earlier printer failure.\n } finally {\n this.#active = false;\n }\n throw failure;\n };\n if (restoreError) return closeWithFailure(restoreError);\n if (!outcome.ok) return closeWithFailure(outcome.error);\n try {\n await this.#print(submitted(outcome.value), prompt);\n return outcome.value;\n } catch (error) {\n try {\n await this.#print(closed(), prompt);\n } catch {\n // The submitted-state failure remains the primary error.\n }\n throw error;\n } finally {\n this.#active = false;\n }\n }\n\n async select<const T extends string>(options: SelectOptions<T>): Promise<T> {\n const choices = Array.isArray(options?.options)\n ? options.options.map((option) =>\n typeof option === \"object\" && option !== null && typeof option.value === \"string\"\n ? option.value\n : \"[Invalid choice]\",\n )\n : [];\n const prompt = details(\"select\", options?.message, choices);\n validateMessage(\"select\", options?.message, choices);\n if (!Array.isArray(options.options) || options.options.length === 0) {\n throw promptError(\"invalid-options\", prompt, \"A select prompt requires at least one choice\");\n }\n const seen = new Set<string>();\n for (const option of options.options) {\n if (\n typeof option !== \"object\" ||\n option === null ||\n typeof option.value !== \"string\" ||\n option.value.length === 0 ||\n (option.label !== undefined && typeof option.label !== \"string\") ||\n (option.hint !== undefined && typeof option.hint !== \"string\")\n ) {\n throw promptError(\n \"invalid-options\",\n prompt,\n \"Select choices must have valid string values\",\n );\n }\n if (seen.has(option.value)) {\n throw promptError(\"invalid-options\", prompt, `Duplicate select choice: ${option.value}`);\n }\n seen.add(option.value);\n }\n let selected = options.initialValue === undefined ? 0 : choices.indexOf(options.initialValue);\n if (selected < 0) {\n throw promptError(\n \"invalid-options\",\n prompt,\n `Unknown initial select value: ${String(options.initialValue)}`,\n );\n }\n const state = (status: PromptStatus = \"active\"): SelectPromptState => ({\n kind: \"select\",\n message: options.message,\n status,\n value: options.options[selected]!.value,\n choices: options.options.map(({ value, label, hint }, index) => ({\n value,\n label: label ?? value,\n ...(hint === undefined ? {} : { hint }),\n selected: index === selected,\n })),\n });\n const value = await this.#run<T>(\n prompt,\n state(),\n (_character, key) =>\n key.name === \"return\" || key.name === \"enter\"\n ? options.options[selected]!.value\n : undefined,\n (_character, key) => {\n if (key.name !== \"up\" && key.name !== \"down\") return undefined;\n selected =\n (selected + (key.name === \"up\" ? -1 : 1) + options.options.length) %\n options.options.length;\n return state();\n },\n () => state(\"submitted\"),\n () => state(\"closed\"),\n );\n return value;\n }\n\n async confirm(options: ConfirmOptions): Promise<boolean> {\n const prompt = details(\"confirm\", options?.message);\n validateMessage(\"confirm\", options?.message);\n if (options.initialValue !== undefined && typeof options.initialValue !== \"boolean\") {\n throw promptError(\"invalid-options\", prompt, \"Confirm initialValue must be a boolean\");\n }\n const value = options.initialValue ?? false;\n const state = (result: boolean, status: PromptStatus = \"active\"): ConfirmPromptState => ({\n kind: \"confirm\",\n message: options.message,\n status,\n value: result,\n ...(options.initialValue === undefined ? {} : { defaultValue: options.initialValue }),\n });\n const result = await this.#run<boolean>(\n prompt,\n state(value),\n (character, key) => {\n if (key.name === \"return\" || key.name === \"enter\") return value;\n if (character.toLowerCase() === \"y\") return true;\n if (character.toLowerCase() === \"n\") return false;\n return undefined;\n },\n () => undefined,\n (submitted) => state(submitted, \"submitted\"),\n () => state(value, \"closed\"),\n );\n return result;\n }\n\n async text(options: TextOptions): Promise<string> {\n const prompt = details(\"text\", options?.message);\n validateMessage(\"text\", options?.message);\n if (options.placeholder !== undefined && typeof options.placeholder !== \"string\") {\n throw promptError(\"invalid-options\", prompt, \"Text placeholder must be a string\");\n }\n if (options.validate !== undefined && typeof options.validate !== \"function\") {\n throw promptError(\"invalid-options\", prompt, \"Text validate must be a function\");\n }\n let value = \"\";\n let validationError: string | undefined;\n const state = (\n status: PromptStatus = validationError ? \"error\" : \"active\",\n ): TextPromptState => ({\n kind: \"text\",\n message: options.message,\n status,\n value,\n ...(options.placeholder === undefined ? {} : { placeholder: options.placeholder }),\n ...(validationError === undefined ? {} : { error: validationError }),\n });\n const result = await this.#run<string>(\n prompt,\n state(),\n (_character, key) => {\n if (key.name !== \"return\" && key.name !== \"enter\") return undefined;\n let error: string | undefined;\n try {\n error = options.validate?.(value);\n } catch (cause) {\n throw promptError(\"input-error\", prompt, \"Text validation failed\", cause);\n }\n if (error !== undefined && typeof error !== \"string\") {\n throw promptError(\n \"input-error\",\n prompt,\n \"Text validation must return a string or undefined\",\n );\n }\n validationError = error || undefined;\n return validationError === undefined ? value : undefined;\n },\n (character, key) => {\n if (key.name === \"return\" || key.name === \"enter\") return state();\n validationError = undefined;\n if (key.name === \"backspace\") value = Array.from(value).slice(0, -1).join(\"\");\n else if (!key.ctrl && !key.meta && character.length > 0) value += character;\n else return undefined;\n return state();\n },\n () => state(\"submitted\"),\n () => state(\"closed\"),\n );\n return result;\n }\n}\n","import type { Printer, TerminalInput } from \"./printer.ts\";\nimport { summarizeErrors } from \"./errors.ts\";\nimport type { Prompter } from \"./prompts.ts\";\nimport { PromptController } from \"./prompts.ts\";\n\nexport type LogLevel = \"trace\" | \"debug\" | \"info\" | \"warning\" | \"error\" | \"fatal\";\n\nexport type LogKind = \"message\" | \"step\" | \"success\";\n\nexport type LogProperties = Record<string, unknown>;\n\n/** A structured message emitted by a command's logger. */\nexport interface LogRecord {\n level: LogLevel;\n kind: LogKind;\n category: readonly string[];\n message: string;\n rawMessage: string;\n properties: LogProperties;\n timestamp: number;\n}\n\nexport interface Logger extends Prompter {\n readonly category: readonly string[];\n trace(message: string, properties?: LogProperties): void;\n debug(message: string, properties?: LogProperties): void;\n info(message: string, properties?: LogProperties): void;\n warn(message: string, properties?: LogProperties): void;\n error(message: string | Error, properties?: LogProperties): void;\n fatal(message: string | Error, properties?: LogProperties): void;\n step(message: string, properties?: LogProperties): void;\n success(message: string, properties?: LogProperties): void;\n with(properties: LogProperties): Logger;\n getChild(category: string): Logger;\n}\n\nfunction interpolate(message: string, properties: LogProperties): string {\n return message.replace(/\\{([^{}]+)\\}/g, (placeholder, key: string) => {\n if (!Object.hasOwn(properties, key)) return placeholder;\n try {\n return String(properties[key]);\n } catch {\n return placeholder;\n }\n });\n}\n\nfunction createBoundLogger(\n printer: Printer,\n category: readonly string[],\n boundProperties: LogProperties,\n prompts: PromptController,\n): Logger {\n function emit(\n level: LogLevel,\n kind: LogKind,\n input: string | Error,\n properties: LogProperties = {},\n ): void {\n const rawMessage = input instanceof Error ? input.message : input;\n const mergedProperties = { ...boundProperties, ...properties };\n if (input instanceof Error) mergedProperties.error = input;\n const summarizedProperties = summarizeErrors(mergedProperties) as LogProperties;\n\n void printer.print({\n type: \"log\",\n record: {\n level,\n kind,\n category,\n message: interpolate(rawMessage, mergedProperties),\n rawMessage,\n properties: summarizedProperties,\n timestamp: Date.now(),\n },\n });\n }\n\n return {\n category,\n trace: (message, properties) => emit(\"trace\", \"message\", message, properties),\n debug: (message, properties) => emit(\"debug\", \"message\", message, properties),\n info: (message, properties) => emit(\"info\", \"message\", message, properties),\n warn: (message, properties) => emit(\"warning\", \"message\", message, properties),\n error: (message, properties) => emit(\"error\", \"message\", message, properties),\n fatal: (message, properties) => emit(\"fatal\", \"message\", message, properties),\n step: (message, properties) => emit(\"info\", \"step\", message, properties),\n success: (message, properties) => emit(\"info\", \"success\", message, properties),\n select: (options) => prompts.select(options),\n confirm: (options) => prompts.confirm(options),\n text: (options) => prompts.text(options),\n with: (properties) =>\n createBoundLogger(printer, category, { ...boundProperties, ...properties }, prompts),\n getChild: (child) => createBoundLogger(printer, [...category, child], boundProperties, prompts),\n };\n}\n\nexport interface CreateLoggerOptions {\n interactive: boolean;\n input: TerminalInput;\n printPrompt(event: Parameters<Printer[\"print\"]>[0]): Promise<void>;\n}\n\n/** Create the logger for one command invocation. */\nexport function createLogger(\n printer: Printer,\n category: readonly string[],\n options: CreateLoggerOptions,\n): Logger {\n const prompts = new PromptController({\n interactive: options.interactive,\n input: options.input,\n print: (event) => options.printPrompt(event),\n });\n return createBoundLogger(printer, [...category], {}, prompts);\n}\n","import { createPrettyPrinter } from \"./pretty.ts\";\nimport {\n createJsonPrinter,\n resolveOutputMode,\n type OutputMode,\n type OutputPreference,\n type OutputWriter,\n type Printer,\n type TerminalInput,\n type TerminalOutput,\n} from \"./printer.ts\";\n\nexport interface OutputOptions {\n output?: OutputPreference;\n /** Use Unicode presentation symbols in pretty output. Defaults to true. */\n unicode?: boolean;\n env?: Readonly<Record<string, string | undefined>>;\n stdin?: TerminalInput;\n stdout?: TerminalOutput;\n stderr?: OutputWriter;\n}\n\nfunction consoleWriter(method: \"log\" | \"error\", stream: TerminalOutput): TerminalOutput {\n return {\n get isTTY() {\n return stream.isTTY;\n },\n get columns() {\n return stream.columns;\n },\n write(text) {\n if (!text.endsWith(\"\\n\")) return stream.write(text);\n console[method](text.slice(0, -1));\n },\n };\n}\n\n/** Resolve the automatic output policy and select its printer for one operation. */\nexport function selectOutputPrinter(\n options: OutputOptions,\n override?: Printer,\n resolvedMode?: OutputMode,\n): Printer {\n const stdin = options.stdin ?? process.stdin;\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n const mode =\n resolvedMode ??\n resolveOutputMode({\n output: options.output,\n env: options.env,\n inputIsTTY: stdin.isTTY,\n outputIsTTY: stdout.isTTY,\n });\n if (override) return override;\n if (mode.format === \"json\") return createJsonPrinter({ stdout, stderr });\n\n const useConsole = options.stdout === undefined && options.stderr === undefined;\n return createPrettyPrinter({\n color: mode.color,\n unicode: options.unicode ?? true,\n stdout: options.stdout ?? (useConsole ? consoleWriter(\"log\", stdout) : stdout),\n stderr: options.stderr ?? (useConsole ? consoleWriter(\"error\", process.stderr) : stderr),\n });\n}\n","import type { AnyCommandDef } from \"./command.ts\";\nimport { summarizeErrors } from \"./errors.ts\";\nimport { aliasList, kebabCase } from \"./options.ts\";\nimport { selectOutputPrinter, type OutputOptions } from \"./output.ts\";\nimport type { Printer, PrintStream } from \"./printer.ts\";\nimport { POSITIONALS_KEY, readArgInfo, readPositionals, schemaShape } from \"./schema.ts\";\n\nfunction details(\n description: string | undefined,\n required: boolean,\n defaultValue: unknown,\n choices: readonly string[] | undefined,\n): string {\n const parts = [description];\n if (choices) parts.push(`(Choices: ${choices.join(\", \")})`);\n if (required) parts.push(\"(Required)\");\n if (defaultValue !== undefined) parts.push(`(Default: ${formatDefault(defaultValue)})`);\n return parts.filter(Boolean).join(\" \");\n}\n\nfunction formatDefault(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return value.toString();\n }\n if (value === null) return \"null\";\n try {\n return JSON.stringify(value) ?? \"undefined\";\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nexport interface UsageArgumentSummary {\n name: string;\n required: boolean;\n variadic: boolean;\n description?: string;\n choices?: readonly string[];\n defaultValue?: unknown;\n}\n\nexport interface UsageOptionSummary {\n name: string;\n flags: readonly string[];\n takesValue: boolean;\n /** Whether the long flag also accepts a `--no-` prefixed form. */\n negatable: boolean;\n valueName?: string;\n required: boolean;\n description?: string;\n choices?: readonly string[];\n defaultValue?: unknown;\n}\n\nexport interface UsageCommandSummary {\n name: string;\n description?: string;\n}\n\n/** A schema-free description of the useful help metadata for a command. */\nexport interface UsageSummary {\n name: string;\n heading?: string;\n version?: string;\n description?: string;\n synopsis: string;\n arguments: readonly UsageArgumentSummary[];\n options: readonly UsageOptionSummary[];\n commands: readonly UsageCommandSummary[];\n}\n\nfunction heading(command: AnyCommandDef): string | undefined {\n const identity = command.name\n ? `${command.name}${command.version ? ` v${command.version}` : \"\"}`\n : command.version\n ? `v${command.version}`\n : undefined;\n if (command.description && identity) return `${command.description} (${identity})`;\n return command.description ?? identity;\n}\n\n/** Build a serializable help summary without retaining command or schema objects. */\nexport function summarizeUsage(command: AnyCommandDef): UsageSummary {\n const shape = command.args ? schemaShape(command.args) : {};\n const positionals = readPositionals(shape);\n const positionalItems = positionals?.items ?? [];\n const syntax = positionalItems.map(({ schema, label }) =>\n readArgInfo(schema).required ? `<${label}>` : `[${label}]`,\n );\n if (positionals?.rest) syntax.push(`[${positionals.rest.label}...]`);\n if (command.subCommands && Object.keys(command.subCommands).length > 0) syntax.push(\"<COMMAND>\");\n\n const args: UsageArgumentSummary[] = positionalItems.map(({ schema, label }) => {\n const info = readArgInfo(schema);\n return {\n name: label,\n required: info.required,\n variadic: false,\n ...(info.description === undefined ? {} : { description: info.description }),\n ...(info.choices === undefined ? {} : { choices: info.choices }),\n ...(info.defaultValue === undefined\n ? {}\n : { defaultValue: summarizeErrors(info.defaultValue) }),\n };\n });\n if (positionals?.rest) {\n const info = readArgInfo(positionals.rest.schema);\n args.push({\n name: positionals.rest.label,\n required: false,\n variadic: true,\n ...(info.description === undefined ? {} : { description: info.description }),\n ...(info.choices === undefined ? {} : { choices: info.choices }),\n });\n }\n\n const options = Object.entries(shape)\n .filter(([key]) => key !== POSITIONALS_KEY)\n .map(([key, schema]): UsageOptionSummary => {\n const info = readArgInfo(schema);\n const argOptions = command.argOptions?.[key];\n const aliases = argOptions?.alias\n ? aliasList(argOptions.alias).map((item) => `-${item}`)\n : [];\n const name = kebabCase(key);\n const valueName = argOptions?.valueName ?? name;\n return {\n name,\n flags: [...aliases, `--${name}`],\n takesValue: info.takesValue,\n negatable: !info.takesValue,\n required: info.required,\n ...(info.takesValue ? { valueName } : {}),\n ...(info.description === undefined ? {} : { description: info.description }),\n ...(info.choices === undefined ? {} : { choices: info.choices }),\n ...(info.defaultValue === undefined\n ? {}\n : { defaultValue: summarizeErrors(info.defaultValue) }),\n };\n });\n\n const commands = Object.entries(command.subCommands ?? {})\n .filter(([, child]) => !child.hidden)\n .map(([name, child]) => ({\n name,\n ...(child.description === undefined ? {} : { description: child.description }),\n }));\n const name = command.name ?? \"command\";\n const title = heading(command);\n return {\n name,\n ...(title === undefined ? {} : { heading: title }),\n ...(command.version === undefined ? {} : { version: command.version }),\n ...(command.description === undefined ? {} : { description: command.description }),\n synopsis: `${name} [OPTIONS]${syntax.length ? ` ${syntax.join(\" \")}` : \"\"}`,\n arguments: args,\n options,\n commands,\n };\n}\n\nfunction formatUsage(summary: UsageSummary): string {\n const lines: string[] = [];\n if (summary.heading) lines.push(summary.heading, \"\");\n lines.push(`USAGE ${summary.synopsis}`);\n\n if (summary.arguments.length > 0) {\n lines.push(\"\", \"ARGUMENTS\", \"\");\n for (const argument of summary.arguments) {\n lines.push(\n ` ${argument.name}${argument.variadic ? \"...\" : \"\"} ${details(argument.description, argument.required, argument.defaultValue, argument.choices)}`.trimEnd(),\n );\n }\n }\n\n if (summary.options.length > 0) {\n lines.push(\"\", \"OPTIONS\", \"\");\n for (const option of summary.options) {\n const flags = option.flags.map((flag) => {\n if (!flag.startsWith(\"--\")) return flag;\n if (option.takesValue) return `${flag}=<${option.valueName}>`;\n if (option.negatable) return `--[no-]${flag.slice(2)}`;\n return flag;\n });\n lines.push(\n ` ${flags.join(\", \")} ${details(option.description, option.required, option.defaultValue, option.choices)}`.trimEnd(),\n );\n }\n }\n\n if (summary.commands.length > 0) {\n lines.push(\"\", \"COMMANDS\", \"\");\n for (const command of summary.commands) {\n lines.push(` ${command.name} ${command.description ?? \"\"}`.trimEnd());\n }\n }\n return lines.join(\"\\n\");\n}\n\nexport type UsageWriter = (text: string) => void | Promise<void>;\n\nexport interface ShowUsageOptions extends OutputOptions {\n write?: UsageWriter;\n printer?: Printer;\n stream?: PrintStream;\n}\n\nexport type UsageOutput = Required<Pick<ShowUsageOptions, \"write\">>;\n\nexport type ShowUsageCallback = (\n command: AnyCommandDef,\n output: UsageOutput,\n) => void | Promise<void>;\n\n/** Generate usage text without writing to stdout or stderr. */\nexport async function renderUsage(command: AnyCommandDef): Promise<string> {\n return formatUsage(summarizeUsage(command));\n}\n\n/** Generate and write usage text, awaiting asynchronous writers. */\nexport async function showUsage(\n command: AnyCommandDef,\n options: ShowUsageOptions = {},\n): Promise<void> {\n const usage = summarizeUsage(command);\n const text = formatUsage(usage);\n if (options.write) return options.write(text);\n const printer = options.printer ?? selectOutputPrinter(options);\n return printer.print({\n type: \"usage\",\n usage,\n text,\n stream: options.stream ?? \"stdout\",\n });\n}\n","import type { ArgsSchema } from \"./schema.ts\";\nimport type { AnyCommandDef, CommandDef } from \"./command.ts\";\nimport { HackshPromptError, summarizeError, HackshUsageError } from \"./errors.ts\";\nimport { createLogger } from \"./logger.ts\";\nimport {\n parseCommandArgs,\n tokenizedBefore,\n tokenizeCommandArgs,\n type TokenizedCommandArgs,\n} from \"./parser.ts\";\nimport {\n createJsonPrinter,\n createPrintQueue,\n resolveOutputMode,\n type Printer,\n type PrintQueue,\n type PrintStream,\n type TerminalInput,\n} from \"./printer.ts\";\nimport { selectOutputPrinter, type OutputOptions } from \"./output.ts\";\nimport { showUsage, summarizeUsage, type ShowUsageCallback } from \"./usage.ts\";\n\nexport type { OutputOptions } from \"./output.ts\";\n\ninterface CommandSegment {\n command: AnyCommandDef;\n rawArgs: string[];\n tokenized: TokenizedCommandArgs;\n}\n\ninterface ResolvedCommand extends CommandSegment {\n parents: CommandSegment[];\n segments: CommandSegment[];\n}\n\nfunction namedChild(child: AnyCommandDef, name: string): AnyCommandDef {\n return child.name ? child : { ...child, name };\n}\n\nfunction resolveCommand(root: AnyCommandDef, rawArgs: string[]): ResolvedCommand {\n let command = root;\n let remaining = rawArgs;\n const parents: ResolvedCommand[\"parents\"] = [];\n const segments: ResolvedCommand[\"segments\"] = [];\n\n for (;;) {\n const tokenized = tokenizeCommandArgs(command, remaining);\n const index = command.subCommands\n ? tokenized.tokens.find((token) => token.kind === \"positional\")?.index\n : undefined;\n if (index === undefined) {\n const segment = { command, rawArgs: remaining, tokenized };\n segments.push(segment);\n return { ...segment, parents, segments };\n }\n const name = remaining[index]!;\n const child = command.subCommands?.[name];\n if (!child) throw new HackshUsageError(`Unknown command \\`${name}\\``, command);\n const prefix = remaining.slice(0, index);\n const segment = { command, rawArgs: prefix, tokenized: tokenizedBefore(tokenized, index) };\n parents.push(segment);\n segments.push(segment);\n command = namedChild(child, name);\n remaining = remaining.slice(index + 1);\n }\n}\n\nasync function executeCommand<S extends ArgsSchema>(\n root: CommandDef<S>,\n argv: string[],\n displayUsage: ShowUsageCallback,\n printer: Printer,\n loggerOptions: Parameters<typeof createLogger>[2],\n): Promise<unknown> {\n const resolved = resolveCommand(root, argv);\n if (resolved.segments[0]?.tokenized.version) {\n await printer.print({ type: \"version\", version: root.version ?? \"\" });\n return undefined;\n }\n if (resolved.segments.some(({ tokenized }) => tokenized.help)) {\n await printUsage(displayUsage, resolved.command, printer, \"stdout\");\n return undefined;\n }\n\n for (const parent of resolved.parents) {\n await parseCommandArgs(parent.command, parent.rawArgs, parent.tokenized);\n }\n const parsed = await parseCommandArgs(resolved.command, resolved.rawArgs, resolved.tokenized);\n if (!resolved.command.run) {\n throw new HackshUsageError(\"No command specified\", resolved.command);\n }\n const category = resolved.segments.flatMap(({ command }) =>\n command.name === undefined ? [] : [command.name],\n );\n return resolved.command.run({\n ...parsed,\n cmd: resolved.command,\n rawArgs: resolved.rawArgs,\n logger: createLogger(printer, category, loggerOptions),\n });\n}\n\nfunction printUsage(\n displayUsage: ShowUsageCallback,\n command: AnyCommandDef,\n printer: Printer,\n stream: PrintStream,\n): void | Promise<void> {\n return displayUsage(command, {\n write: (text) => printer.print({ type: \"usage\", usage: summarizeUsage(command), text, stream }),\n });\n}\n\nexport interface RunCommandOptions extends OutputOptions {\n printer?: Printer;\n showUsage?: ShowUsageCallback;\n}\n\ninterface PreparedOutput extends PrintQueue {\n interactive: boolean;\n input: TerminalInput;\n}\n\nfunction prepareOutput(options: RunCommandOptions): PreparedOutput {\n const input = options.stdin ?? process.stdin;\n const mode = resolveOutputMode({\n output: options.output,\n env: options.env,\n inputIsTTY: input.isTTY,\n outputIsTTY: (options.stdout ?? process.stdout).isTTY,\n });\n return {\n ...createPrintQueue(selectOutputPrinter(options, options.printer, mode)),\n interactive: mode.interactive,\n input,\n };\n}\n\nexport async function runCommand<S extends ArgsSchema>(\n root: CommandDef<S>,\n argv: string[],\n options: RunCommandOptions = {},\n): Promise<unknown> {\n const output = prepareOutput(options);\n try {\n return await executeCommand(root, argv, options.showUsage ?? showUsage, output.printer, {\n interactive: output.interactive,\n input: output.input,\n printPrompt: (event) => output.printChecked(event),\n });\n } finally {\n await output.drain();\n }\n}\n\nexport interface RunMainOptions extends OutputOptions {\n onError?: (error: unknown) => void | Promise<void>;\n argv?: string[];\n printer?: Printer;\n showUsage?: ShowUsageCallback;\n}\n\nasync function drainAndExit(output: PrintQueue, code = 1): Promise<never> {\n try {\n await output.drain();\n } finally {\n process.exit(code);\n }\n}\n\nfunction commandErrorExitCode(error: unknown): number {\n return error instanceof HackshPromptError && error.reason === \"cancelled\" ? 130 : 1;\n}\n\nasync function reportOutputSetupError(error: unknown, options: RunMainOptions): Promise<never> {\n if (options.onError) {\n await options.onError(error);\n return drainAndExit(createPrintQueue(options.printer ?? { print: () => undefined }));\n }\n\n const output = createPrintQueue(\n options.printer ??\n createJsonPrinter({\n stdout: options.stdout ?? process.stdout,\n stderr: options.stderr ?? process.stderr,\n }),\n );\n await output.printer.print({ type: \"error\", error: summarizeError(error) });\n return drainAndExit(output);\n}\n\nexport async function runMain<S extends ArgsSchema>(\n command: CommandDef<S>,\n options: RunMainOptions = {},\n): Promise<void> {\n const displayUsage = options.showUsage ?? showUsage;\n let output: PreparedOutput;\n try {\n output = prepareOutput(options);\n } catch (error) {\n return reportOutputSetupError(error, options);\n }\n try {\n await executeCommand(\n command,\n options.argv ?? process.argv.slice(2),\n displayUsage,\n output.printer,\n {\n interactive: output.interactive,\n input: output.input,\n printPrompt: (event) => output.printChecked(event),\n },\n );\n } catch (error) {\n if (options.onError) {\n await options.onError(error);\n return drainAndExit(output, commandErrorExitCode(error));\n }\n try {\n if (error instanceof HackshUsageError) {\n await output.printer.print({ type: \"error\", error: summarizeError(error) });\n await printUsage(displayUsage, error.command, output.printer, \"stderr\");\n } else {\n await output.printer.print({\n type: \"error\",\n error: summarizeError(error),\n });\n }\n } finally {\n await drainAndExit(output, commandErrorExitCode(error));\n }\n }\n await output.drain();\n}\n\nexport function createMain<S extends ArgsSchema>(\n command: CommandDef<S>,\n options: RunMainOptions = {},\n): (argv?: string[]) => Promise<void> {\n return (argv) => runMain(command, argv === undefined ? options : { ...options, argv });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["safeString","parseNodeArgs","details","#interactive","#inputValue","#printEvent","#bufferedKeys","#print","#run","#active"],"sources":["../src/options.ts","../src/schema.ts","../src/command.ts","../src/errors.ts","../src/environment.ts","../src/parser.ts","../src/serialization.ts","../src/printer.ts","../src/pretty.ts","../src/prompts.ts","../src/logger.ts","../src/output.ts","../src/usage.ts","../src/run.ts"],"sourcesContent":["export function kebabCase(value: string): string {\n return value.replaceAll(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\nexport function aliasList(value: string | readonly string[]): readonly string[] {\n return typeof value === \"string\" ? [value] : value;\n}\n","import { globalRegistry, type $ZodObject, type $ZodType } from \"zod/v4/core\";\n\nexport type ArgsSchema = $ZodObject;\nexport type EmptyArgs = $ZodObject<{}>;\nexport type ShapeOf<S extends ArgsSchema> = S[\"_zod\"][\"def\"][\"shape\"];\nexport type ArgKey<S extends ArgsSchema> = Extract<keyof ShapeOf<S>, string>;\nexport type OptionKey<S extends ArgsSchema> = Exclude<ArgKey<S>, typeof POSITIONALS_KEY>;\n\nexport const POSITIONALS_KEY = \"_\";\n\nexport interface ArgInfo {\n readonly takesValue: boolean;\n readonly required: boolean;\n readonly defaultValue: unknown;\n readonly description: string | undefined;\n readonly title: string | undefined;\n readonly choices: readonly string[] | undefined;\n}\n\nexport interface Positional {\n readonly schema: $ZodType;\n readonly label: string;\n}\n\nexport interface Positionals {\n readonly items: readonly Positional[];\n readonly rest: Positional | undefined;\n}\n\ntype ZodDef = Record<string, unknown> & { type: string };\n\nfunction definition(schema: $ZodType): ZodDef {\n return schema._zod.def as ZodDef;\n}\n\nfunction innerSchema(def: ZodDef): $ZodType | undefined {\n switch (def.type) {\n case \"optional\":\n case \"nonoptional\":\n case \"nullable\":\n case \"default\":\n case \"prefault\":\n case \"catch\":\n case \"readonly\":\n return def.innerType as $ZodType;\n case \"pipe\":\n return def.in as $ZodType;\n default:\n return undefined;\n }\n}\n\n/** Read only the common zod/v4/core definition and registry structures. */\nexport function readArgInfo(schema: $ZodType): ArgInfo {\n let current: $ZodType | undefined = schema;\n let required = true;\n let defaultValue: unknown;\n let description: string | undefined;\n let title: string | undefined;\n\n while (current) {\n const metadata = globalRegistry.get(current);\n description ??= metadata?.description;\n title ??= metadata?.title;\n\n const def = definition(current);\n if (def.type === \"optional\" || def.type === \"default\" || def.type === \"prefault\") {\n required = false;\n }\n if (def.type === \"default\" && defaultValue === undefined) defaultValue = def.defaultValue;\n current = innerSchema(def);\n }\n\n const base = unwrapInput(schema);\n return {\n takesValue: definition(base).type !== \"boolean\",\n required,\n defaultValue,\n description,\n title,\n choices: enumChoices(base),\n };\n}\n\n/** Read the `_` tuple or array schema that declares positional arguments. */\nexport function readPositionals(shape: Record<string, $ZodType>): Positionals | undefined {\n const field = shape[POSITIONALS_KEY];\n if (!field) return undefined;\n const def = definition(unwrapInput(field));\n let items: readonly $ZodType[];\n let rest: $ZodType | undefined;\n if (def.type === \"tuple\") {\n items = def.items as readonly $ZodType[];\n rest = (def.rest as $ZodType | null) ?? undefined;\n } else if (def.type === \"array\") {\n items = [];\n rest = def.element as $ZodType;\n } else {\n throw new TypeError(\"Positional arguments `_` must use a tuple or array schema\");\n }\n return {\n items: items.map((schema, index) => ({\n schema,\n label: readArgInfo(schema).title ?? `ARG${index + 1}`,\n })),\n rest: rest && { schema: rest, label: readArgInfo(rest).title ?? \"ARGS\" },\n };\n}\n\nfunction enumChoices(schema: $ZodType): readonly string[] | undefined {\n const def = definition(schema);\n const candidate = def.type === \"array\" ? unwrapInput(def.element as $ZodType) : schema;\n const candidateDef = definition(candidate);\n if (candidateDef.type !== \"enum\") return undefined;\n const values = candidate._zod.values;\n return values ? [...values].map(String) : undefined;\n}\n\n/** Whether the schema accepts an array after removing supported input wrappers. */\nexport function isArrayInput(schema: $ZodType): boolean {\n return definition(unwrapInput(schema)).type === \"array\";\n}\n\n/** Whether the schema accepts an object after removing supported input wrappers. */\nexport function isObjectInput(schema: $ZodType): boolean {\n return definition(unwrapInput(schema)).type === \"object\";\n}\n\nfunction unwrapInput(schema: $ZodType): $ZodType {\n let current = schema;\n for (;;) {\n const inner = innerSchema(definition(current));\n if (!inner) return current;\n current = inner;\n }\n}\n\nexport function schemaShape(schema: ArgsSchema): Record<string, $ZodType> {\n return schema._zod.def.shape as Record<string, $ZodType>;\n}\n","import type { output } from \"zod/v4/core\";\nimport type { Logger } from \"./logger.ts\";\nimport { aliasList } from \"./options.ts\";\nimport {\n isArrayInput,\n isObjectInput,\n POSITIONALS_KEY,\n readArgInfo,\n readPositionals,\n schemaShape,\n type ArgsSchema,\n type EmptyArgs,\n type OptionKey,\n} from \"./schema.ts\";\n\nexport interface ArgOptions {\n alias?: string | readonly string[];\n valueName?: string;\n env?: string | false;\n}\n\nexport type ArgOptionsMap<S extends ArgsSchema> = Partial<Record<OptionKey<S>, ArgOptions>>;\n\nexport interface CommandContext<S extends ArgsSchema> {\n cmd: CommandDef<S>;\n args: output<S>;\n rawArgs: string[];\n passthrough: string[];\n extraArgs: string[];\n logger: Logger;\n}\n\nexport interface CommandDef<S extends ArgsSchema = EmptyArgs> {\n name?: string;\n version?: string;\n description?: string;\n hidden?: boolean;\n args?: S;\n argOptions?: ArgOptionsMap<S>;\n subCommands?: Record<string, CommandDef<ArgsSchema>>;\n run?(context: CommandContext<S>): unknown;\n}\n\nexport type AnyCommandDef = CommandDef<ArgsSchema>;\n\nexport function defineCommand<S extends ArgsSchema = EmptyArgs>(def: CommandDef<S>): CommandDef<S> {\n const shape = def.args ? schemaShape(def.args) : {};\n const positionals = readPositionals(shape);\n\n if (positionals) {\n let sawOptional = false;\n for (const { schema, label } of positionals.items) {\n const info = readArgInfo(schema);\n if (isArrayInput(schema)) {\n throw new TypeError(\n `Positional argument \\`${label}\\` cannot be an array; use a tuple rest`,\n );\n }\n if (!info.takesValue) {\n throw new TypeError(`Boolean argument \\`${label}\\` cannot be positional`);\n }\n if (sawOptional && info.required) {\n throw new TypeError(\n `Required positional \\`${label}\\` cannot follow an optional positional`,\n );\n }\n sawOptional ||= !info.required;\n }\n if (def.subCommands && Object.keys(def.subCommands).length > 0) {\n throw new TypeError(\"A command cannot define both positional arguments and subcommands\");\n }\n }\n\n const usedAliases = new Set<string>();\n for (const [key, options] of Object.entries(def.argOptions ?? {})) {\n if (key === POSITIONALS_KEY) {\n throw new TypeError(\"Positional arguments cannot have argument options\");\n }\n const schema = shape[key];\n if (!schema) throw new TypeError(`Unknown argument options key \\`${key}\\``);\n if (options?.env !== undefined) {\n if (options.env === \"\") {\n throw new TypeError(`Environment variable name for \\`${key}\\` cannot be empty`);\n }\n if (isArrayInput(schema)) {\n throw new TypeError(\n `Option \\`${key}\\` cannot use an environment variable because it accepts an array`,\n );\n }\n if (isObjectInput(schema)) {\n throw new TypeError(\n `Option \\`${key}\\` cannot use an environment variable because it accepts an object`,\n );\n }\n }\n if (options?.alias === undefined) continue;\n for (const alias of aliasList(options.alias)) {\n if (alias.length !== 1)\n throw new TypeError(`Alias \\`${alias}\\` must be exactly one character`);\n if (usedAliases.has(alias)) throw new TypeError(`Duplicate alias \\`${alias}\\``);\n usedAliases.add(alias);\n }\n }\n\n for (const key of Object.keys(shape)) {\n if (key !== POSITIONALS_KEY && /^no[-A-Z]/.test(key)) {\n throw new TypeError(`Option \\`${key}\\` conflicts with --no- negation`);\n }\n }\n\n return def;\n}\n","import type { $ZodIssue } from \"zod/v4/core\";\nimport type { AnyCommandDef } from \"./command.ts\";\n\nexport interface HackshIssue {\n arg: string;\n message: string;\n issue?: $ZodIssue;\n}\n\nexport class HackshUsageError extends Error {\n readonly command: AnyCommandDef;\n\n constructor(message: string, command: AnyCommandDef, options?: ErrorOptions) {\n super(message, options);\n this.name = \"HackshUsageError\";\n this.command = command;\n }\n}\n\nexport class HackshValidationError extends HackshUsageError {\n readonly issues: ReadonlyArray<HackshIssue>;\n\n constructor(command: AnyCommandDef, issues: ReadonlyArray<HackshIssue>) {\n super(\n `Invalid arguments:\\n${issues.map(({ arg, message }) => ` ${arg}: ${message}`).join(\"\\n\")}`,\n command,\n );\n this.name = \"HackshValidationError\";\n this.issues = issues;\n }\n}\n\nexport type PromptKind = \"select\" | \"confirm\" | \"text\";\n\nexport type HackshPromptErrorReason =\n | \"non-interactive\"\n | \"cancelled\"\n | \"eof\"\n | \"overlapping\"\n | \"invalid-options\"\n | \"input-error\"\n | \"printer-error\";\n\nexport interface PromptErrorDetails {\n kind: PromptKind;\n message: string;\n choices?: readonly string[];\n}\n\n/** An input request that could not be completed safely. */\nexport class HackshPromptError extends Error {\n readonly reason: HackshPromptErrorReason;\n readonly prompt: PromptErrorDetails;\n\n constructor(\n reason: HackshPromptErrorReason,\n prompt: PromptErrorDetails,\n message: string,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.name = \"HackshPromptError\";\n this.reason = reason;\n this.prompt = prompt;\n }\n}\n\nexport type HackshErrorKind = \"error\" | \"prompt\" | \"usage\" | \"validation\" | \"thrown\";\n\nexport interface ValidationIssueSummary {\n arg: string;\n message: string;\n code?: string;\n path?: readonly PropertyKey[];\n details?: Readonly<Record<string, unknown>>;\n}\n\nexport interface HackshErrorSummary {\n kind: HackshErrorKind;\n name: string;\n message: string;\n stack?: string;\n cause?: unknown;\n issues?: readonly ValidationIssueSummary[];\n properties?: Readonly<Record<string, unknown>>;\n value?: unknown;\n}\n\nfunction safeString(value: unknown, fallback: string): string {\n try {\n return String(value);\n } catch {\n return fallback;\n }\n}\n\nfunction readProperty(value: object, key: PropertyKey): unknown {\n try {\n return Reflect.get(value, key);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction enumerableKeys(value: object): string[] {\n try {\n return Object.keys(value);\n } catch {\n return [];\n }\n}\n\nfunction hasToJSON(value: object): boolean {\n try {\n return typeof Reflect.get(value, \"toJSON\") === \"function\";\n } catch {\n return false;\n }\n}\n\nfunction isPlainObject(value: object): boolean {\n try {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n } catch {\n return false;\n }\n}\n\nfunction summarizeIssue(\n { arg, message, issue }: HackshIssue,\n seen: WeakMap<object, unknown>,\n): ValidationIssueSummary {\n if (!issue) return { arg, message };\n const details: Record<string, unknown> = {};\n for (const key of enumerableKeys(issue)) {\n if ([\"code\", \"path\", \"message\", \"inst\"].includes(key)) continue;\n details[key] = summarizeErrors(readProperty(issue, key), seen);\n }\n const code = readProperty(issue, \"code\");\n const path = readProperty(issue, \"path\");\n return {\n arg,\n message,\n ...(typeof code === \"string\" ? { code } : {}),\n ...(Array.isArray(path) ? { path } : {}),\n ...(Object.keys(details).length === 0 ? {} : { details }),\n };\n}\n\nfunction errorKind(error: Error): HackshErrorKind {\n if (error instanceof HackshPromptError) return \"prompt\";\n if (error instanceof HackshValidationError) return \"validation\";\n if (error instanceof HackshUsageError) return \"usage\";\n return \"error\";\n}\n\nfunction summarizeErrorWithSeen(error: Error, seen: WeakMap<object, unknown>): HackshErrorSummary {\n const summary: HackshErrorSummary = {\n kind: errorKind(error),\n name: safeString(readProperty(error, \"name\"), \"Error\"),\n message: safeString(readProperty(error, \"message\"), \"[Unserializable error message]\"),\n };\n seen.set(error, summary);\n\n const stack = readProperty(error, \"stack\");\n const cause = readProperty(error, \"cause\");\n if (typeof stack === \"string\") summary.stack = stack;\n if (cause !== undefined) summary.cause = summarizeErrors(cause, seen);\n if (error instanceof HackshValidationError) {\n summary.issues = error.issues.map((issue) => summarizeIssue(issue, seen));\n }\n\n const reserved = new Set([\"name\", \"message\", \"stack\", \"cause\", \"command\", \"issues\"]);\n const properties: Record<string, unknown> = {};\n for (const key of enumerableKeys(error)) {\n if (reserved.has(key)) continue;\n properties[key] = summarizeErrors(readProperty(error, key), seen);\n }\n if (Object.keys(properties).length > 0) summary.properties = properties;\n return summary;\n}\n\n/** Recursively replace Error values with command- and schema-free summaries. */\nexport function summarizeErrors(\n value: unknown,\n seen: WeakMap<object, unknown> = new WeakMap(),\n): unknown {\n if (typeof value !== \"object\" || value === null) return value;\n const existing = seen.get(value);\n if (existing !== undefined) return existing;\n if (value instanceof Error) return summarizeErrorWithSeen(value, seen);\n\n if (Array.isArray(value)) {\n const result: unknown[] = [];\n seen.set(value, result);\n let changed = false;\n for (const item of value) {\n const summarized = summarizeErrors(item, seen);\n result.push(summarized);\n changed ||= summarized !== item;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n }\n if (value instanceof Map) {\n const result = new Map<unknown, unknown>();\n seen.set(value, result);\n let changed = false;\n for (const [key, item] of value) {\n const summarizedKey = summarizeErrors(key, seen);\n const summarizedItem = summarizeErrors(item, seen);\n result.set(summarizedKey, summarizedItem);\n changed ||= summarizedKey !== key || summarizedItem !== item;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n }\n if (value instanceof Set) {\n const result = new Set<unknown>();\n seen.set(value, result);\n let changed = false;\n for (const item of value) {\n const summarized = summarizeErrors(item, seen);\n result.add(summarized);\n changed ||= summarized !== item;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n }\n if (ArrayBuffer.isView(value) || hasToJSON(value) || !isPlainObject(value)) return value;\n\n const result: Record<string, unknown> = {};\n seen.set(value, result);\n let changed = false;\n for (const key of enumerableKeys(value)) {\n const original = readProperty(value, key);\n const summarized = summarizeErrors(original, seen);\n result[key] = summarized;\n changed ||= summarized !== original;\n }\n if (changed) return result;\n seen.set(value, value);\n return value;\n}\n\n/** Convert any thrown value into a canonical error description. */\nexport function summarizeError(error: unknown): HackshErrorSummary {\n if (error instanceof Error) return summarizeErrorWithSeen(error, new WeakMap());\n return {\n kind: \"thrown\",\n name: \"NonErrorThrown\",\n message: safeString(error, \"[Unserializable thrown value]\"),\n value: summarizeErrors(error),\n };\n}\n","import type { AnyCommandDef } from \"./command.ts\";\nimport { kebabCase } from \"./options.ts\";\nimport { isArrayInput, isObjectInput, POSITIONALS_KEY, schemaShape } from \"./schema.ts\";\n\nconst commandPaths = new WeakMap<AnyCommandDef, readonly string[] | undefined>();\n\nexport function registerCommandPath(\n command: AnyCommandDef,\n path: readonly string[] | undefined,\n): void {\n commandPaths.set(command, path);\n}\n\nexport function commandEnvPath(command: AnyCommandDef): readonly string[] | undefined {\n if (!commandPaths.has(command)) return command.name ? [command.name] : undefined;\n return commandPaths.get(command);\n}\n\nfunction envSegment(segment: string): string {\n return kebabCase(segment)\n .replaceAll(/[^A-Za-z0-9]+/g, \"_\")\n .toUpperCase();\n}\n\nexport function optionEnvNames(\n command: AnyCommandDef,\n path: readonly string[] | undefined,\n): ReadonlyMap<string, string> {\n const names = new Map<string, string>();\n if (!command.args) return names;\n for (const [key, schema] of Object.entries(schemaShape(command.args))) {\n if (key === POSITIONALS_KEY) continue;\n if (isArrayInput(schema) || isObjectInput(schema)) continue;\n const configured = command.argOptions?.[key]?.env;\n if (configured === false) continue;\n if (typeof configured === \"string\") {\n names.set(key, configured);\n continue;\n }\n if (path === undefined || path.length === 0) continue;\n names.set(key, [...path, key].map(envSegment).join(\"_\"));\n }\n return names;\n}\n\nfunction envOptionLabel(path: readonly string[] | undefined, key: string): string {\n const flag = `--${kebabCase(key)}`;\n const command = path?.slice(1).join(\" \");\n return command ? `${command} ${flag}` : flag;\n}\n\nexport function assertUniqueEnvNames(\n segments: readonly {\n command: AnyCommandDef;\n path: readonly string[] | undefined;\n }[],\n): void {\n const owners = new Map<string, string>();\n for (const segment of segments) {\n for (const [key, envName] of optionEnvNames(segment.command, segment.path)) {\n const label = envOptionLabel(segment.path, key);\n const previous = owners.get(envName);\n if (previous !== undefined) {\n throw new TypeError(\n `Environment variable \\`${envName}\\` is used by both \\`${previous}\\` and \\`${label}\\``,\n );\n }\n owners.set(envName, label);\n }\n }\n}\n\nexport function readEnvValue(\n env: Readonly<Record<string, string | undefined>>,\n name: string,\n): string | undefined {\n try {\n const value = env[name];\n return typeof value === \"string\" ? value : undefined;\n } catch {\n return undefined;\n }\n}\n","import { parseArgs as parseNodeArgs } from \"node:util\";\nimport { safeParseAsync, type $ZodIssue, type output } from \"zod/v4/core\";\nimport type { AnyCommandDef, CommandDef } from \"./command.ts\";\nimport { assertUniqueEnvNames, optionEnvNames, readEnvValue } from \"./environment.ts\";\nimport { HackshValidationError, type HackshIssue } from \"./errors.ts\";\nimport { aliasList, kebabCase } from \"./options.ts\";\nimport {\n POSITIONALS_KEY,\n readArgInfo,\n readPositionals,\n schemaShape,\n type ArgsSchema,\n type Positionals,\n} from \"./schema.ts\";\n\nexport interface ParsedCommand<S extends ArgsSchema> {\n args: output<S>;\n passthrough: string[];\n extraArgs: string[];\n}\n\ninterface OptionDefinition {\n readonly key: string;\n readonly kebabName: string;\n readonly takesValue: boolean;\n}\n\ninterface OptionModel {\n readonly definitions: Map<string, OptionDefinition>;\n readonly parserOptions: Record<string, { type: \"string\" | \"boolean\"; short?: string }>;\n readonly aliases: Set<string>;\n}\n\ninterface KnownOptionToken {\n readonly kind: \"known-option\";\n readonly index: number;\n readonly definition: OptionDefinition;\n readonly value: string | boolean;\n}\n\ninterface UnknownOptionToken {\n readonly kind: \"unknown-option\";\n readonly index: number;\n readonly value: string;\n}\n\ninterface PositionalToken {\n readonly kind: \"positional\";\n readonly index: number;\n readonly value: string;\n}\n\ntype CommandToken = KnownOptionToken | UnknownOptionToken | PositionalToken;\n\nexport interface TokenizedCommandArgs {\n readonly tokens: readonly CommandToken[];\n readonly passthrough: string[];\n readonly issues: readonly IndexedIssue[];\n readonly help: boolean;\n readonly helpIndex: number | undefined;\n readonly version: boolean;\n readonly versionIndex: number | undefined;\n}\n\ninterface IndexedIssue {\n readonly index: number;\n readonly issue: HackshIssue;\n}\n\nfunction optionModel(command: AnyCommandDef): OptionModel {\n const definitions = new Map<string, OptionDefinition>();\n const parserOptions: OptionModel[\"parserOptions\"] = {};\n const allAliases = new Set<string>();\n\n if (command.args) {\n for (const [key, schema] of Object.entries(schemaShape(command.args))) {\n if (key === POSITIONALS_KEY) continue;\n const alias = command.argOptions?.[key]?.alias;\n const aliases = alias ? aliasList(alias) : [];\n const definition: OptionDefinition = {\n key,\n kebabName: kebabCase(key),\n takesValue: readArgInfo(schema).takesValue,\n };\n const type = definition.takesValue ? \"string\" : \"boolean\";\n for (const name of new Set([key, definition.kebabName])) {\n definitions.set(name, definition);\n parserOptions[name] = { type };\n }\n for (const alias of aliases) {\n allAliases.add(alias);\n definitions.set(alias, definition);\n parserOptions[alias] = { type, short: alias };\n }\n }\n }\n return { definitions, parserOptions, aliases: allAliases };\n}\n\nfunction commandPositionals(command: AnyCommandDef): Positionals | undefined {\n return command.args ? readPositionals(schemaShape(command.args)) : undefined;\n}\n\nfunction displayName(command: AnyCommandDef, path: readonly PropertyKey[]): string {\n const [first, index] = path;\n if (typeof first !== \"string\") return \"arguments\";\n if (first !== POSITIONALS_KEY) return `--${kebabCase(first)}`;\n const positionals = commandPositionals(command);\n if (!positionals || typeof index !== \"number\") return \"arguments\";\n const item = positionals.items[index];\n if (item) return `<${item.label}>`;\n return positionals.rest ? `<${positionals.rest.label}...>` : \"arguments\";\n}\n\nexport function tokenizeCommandArgs(\n command: AnyCommandDef,\n rawArgs: readonly string[],\n): TokenizedCommandArgs {\n const model = optionModel(command);\n const separator = rawArgs.indexOf(\"--\");\n const beforeSeparator = separator === -1 ? [...rawArgs] : rawArgs.slice(0, separator);\n const passthrough = separator === -1 ? [] : rawArgs.slice(separator + 1);\n const negativeIndexes = new Set<number>();\n const valuedNegativeIndexes = new Set<number>();\n const issues: IndexedIssue[] = [];\n let recordedMissingValue = false;\n const parserArgs = beforeSeparator.map((raw, index) => {\n if (!raw.startsWith(\"--no-\")) return raw;\n const equals = raw.indexOf(\"=\");\n const name = raw.slice(5, equals === -1 ? undefined : equals);\n const definition = model.definitions.get(name);\n if (!definition || definition.takesValue) return raw;\n negativeIndexes.add(index);\n if (equals !== -1) {\n valuedNegativeIndexes.add(index);\n return `--${definition.key}${raw.slice(equals)}`;\n }\n return `--${definition.key}`;\n });\n\n const parsed = parseNodeArgs({\n args: parserArgs,\n options: model.parserOptions,\n allowPositionals: true,\n strict: false,\n tokens: true,\n });\n const tokens: CommandToken[] = [];\n const unknownIndexes = new Set<number>();\n let help = false;\n let helpIndex: number | undefined;\n let version = false;\n let versionIndex: number | undefined;\n for (const token of parsed.tokens) {\n if (token.kind === \"positional\") {\n tokens.push({ kind: \"positional\", index: token.index, value: token.value });\n continue;\n }\n if (token.kind !== \"option\") continue;\n const isHelp =\n token.rawName === \"--help\" || (token.rawName === \"-h\" && !model.aliases.has(\"h\"));\n const isVersion =\n token.rawName === \"--version\" || (token.rawName === \"-v\" && !model.aliases.has(\"v\"));\n if (isHelp) {\n help = true;\n helpIndex ??= token.index;\n }\n if (isVersion) {\n version = true;\n versionIndex ??= token.index;\n }\n const definition = model.definitions.get(token.name);\n if (definition) {\n if (\n definition.takesValue &&\n (token.value === undefined ||\n (!token.inlineValue && token.value.startsWith(\"-\") && token.value !== \"-\"))\n ) {\n if (!recordedMissingValue) {\n issues.push({\n index: token.index,\n issue: { arg: `--${definition.kebabName}`, message: \"requires a value\" },\n });\n recordedMissingValue = true;\n }\n }\n let value: string | boolean = token.value ?? true;\n if (!definition.takesValue) {\n if (valuedNegativeIndexes.has(token.index)) {\n const rawName = beforeSeparator[token.index]!.split(\"=\", 1)[0]!;\n issues.push({\n index: token.index,\n issue: { arg: rawName, message: \"does not accept a value\" },\n });\n value = false;\n } else if (negativeIndexes.has(token.index)) {\n value = false;\n } else if (token.inlineValue) {\n if (token.value === \"true\") value = true;\n else if (token.value === \"false\") value = false;\n else {\n issues.push({\n index: token.index,\n issue: { arg: token.rawName, message: \"expects true or false\" },\n });\n }\n }\n }\n tokens.push({\n kind: \"known-option\",\n index: token.index,\n definition,\n value: definition.takesValue ? (token.value ?? \"\") : value,\n });\n } else if (!unknownIndexes.has(token.index)) {\n unknownIndexes.add(token.index);\n tokens.push({\n kind: \"unknown-option\",\n index: token.index,\n value: beforeSeparator[token.index]!,\n });\n }\n }\n\n return {\n tokens,\n passthrough,\n issues,\n help,\n helpIndex,\n version,\n versionIndex,\n };\n}\n\nexport function tokenizedBefore(\n tokenized: TokenizedCommandArgs,\n endIndex: number,\n): TokenizedCommandArgs {\n const help = tokenized.helpIndex !== undefined && tokenized.helpIndex < endIndex;\n const version = tokenized.versionIndex !== undefined && tokenized.versionIndex < endIndex;\n return {\n tokens: tokenized.tokens.filter((token) => token.index < endIndex),\n passthrough: [],\n issues: tokenized.issues.filter(({ index }) => index < endIndex),\n help,\n helpIndex: help ? tokenized.helpIndex : undefined,\n version,\n versionIndex: version ? tokenized.versionIndex : undefined,\n };\n}\n\nfunction zodIssues(\n command: AnyCommandDef,\n issues: readonly $ZodIssue[],\n envSources: ReadonlyMap<string, string>,\n): HackshIssue[] {\n return issues.map((issue) => {\n const key = issue.path[0];\n const envName = typeof key === \"string\" ? envSources.get(key) : undefined;\n return {\n arg: envName ?? displayName(command, issue.path),\n message: issue.message,\n issue,\n };\n });\n}\n\nexport async function parseCommandArgs<S extends ArgsSchema>(\n command: CommandDef<S>,\n rawArgs: string[],\n tokenized: TokenizedCommandArgs = tokenizeCommandArgs(command, rawArgs),\n env?: Readonly<Record<string, string | undefined>>,\n envPath?: readonly string[],\n): Promise<ParsedCommand<S>> {\n if (tokenized.issues.length > 0) {\n throw new HackshValidationError(\n command,\n tokenized.issues.map(({ issue }) => issue),\n );\n }\n\n const input: Record<string, string | boolean | string[] | undefined> = {};\n const positionals = commandPositionals(command);\n const positionalValues: string[] = [];\n if (positionals) input[POSITIONALS_KEY] = positionalValues;\n const extraArgs: string[] = [];\n for (const token of tokenized.tokens) {\n if (token.kind === \"known-option\") input[token.definition.key] = token.value;\n else if (token.kind === \"unknown-option\") extraArgs.push(token.value);\n else if (\n positionals &&\n (positionals.rest || positionalValues.length < positionals.items.length)\n ) {\n positionalValues.push(token.value);\n } else extraArgs.push(token.value);\n }\n\n const envSources = new Map<string, string>();\n if (env && command.args) {\n const shape = schemaShape(command.args);\n const envIssues: HackshIssue[] = [];\n for (const [key, envName] of optionEnvNames(command, envPath)) {\n if (input[key] !== undefined) continue;\n const value = readEnvValue(env, envName);\n if (value === undefined) continue;\n if (readArgInfo(shape[key]!).takesValue) {\n input[key] = value;\n } else if (value === \"true\" || value === \"false\") {\n input[key] = value === \"true\";\n } else {\n envIssues.push({ arg: envName, message: \"expects true or false\" });\n continue;\n }\n envSources.set(key, envName);\n }\n if (envIssues.length > 0) throw new HackshValidationError(command, envIssues);\n }\n\n if (!command.args)\n return { args: input as output<S>, passthrough: tokenized.passthrough, extraArgs };\n const result = await safeParseAsync(command.args, input);\n if (!result.success) {\n throw new HackshValidationError(command, zodIssues(command, result.error.issues, envSources));\n }\n return { args: result.data, passthrough: tokenized.passthrough, extraArgs };\n}\n\n/**\n * Parse and validate one command segment without routing, builtin handling, or output.\n * Environment variables are read only when `options.env` is provided.\n */\nexport async function parseArgs<S extends ArgsSchema>(\n command: CommandDef<S>,\n argv: string[],\n options?: { readonly env?: Readonly<Record<string, string | undefined>> },\n): Promise<output<S>> {\n const envPath = command.name ? [command.name] : undefined;\n if (options?.env !== undefined) assertUniqueEnvNames([{ command, path: envPath }]);\n return (\n await parseCommandArgs(command, argv, tokenizeCommandArgs(command, argv), options?.env, envPath)\n ).args;\n}\n","import { stripVTControlCharacters } from \"node:util\";\nimport { summarizeError } from \"./errors.ts\";\n\nfunction safeString(value: unknown): string {\n try {\n return String(value);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction normalizeProperty(value: object, key: PropertyKey, ancestors: Set<object>): unknown {\n try {\n return normalizeJson(Reflect.get(value, key), ancestors);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction normalizedKeys(value: object): string[] | undefined {\n try {\n return Object.keys(value);\n } catch {\n return undefined;\n }\n}\n\nconst noToJson = Symbol(\"noToJson\");\n\nfunction normalizedToJson(value: object, ancestors: Set<object>): unknown {\n let toJSON: unknown;\n try {\n toJSON = Reflect.get(value, \"toJSON\");\n } catch {\n return noToJson;\n }\n if (typeof toJSON !== \"function\") return noToJson;\n try {\n const result = Reflect.apply(toJSON, value, []);\n return result === value ? noToJson : normalizeJson(result, ancestors);\n } catch {\n return noToJson;\n }\n}\n\nfunction isArrayBufferView(value: object): value is ArrayBufferView {\n try {\n return ArrayBuffer.isView(value);\n } catch {\n return false;\n }\n}\n\n/** Normalize arbitrary event data into values accepted by JSON.stringify. */\nexport function normalizeJson(value: unknown, ancestors = new Set<object>()): unknown {\n switch (typeof value) {\n case \"string\":\n return stripVTControlCharacters(value);\n case \"boolean\":\n return value;\n case \"number\":\n return Number.isFinite(value) ? value : null;\n case \"bigint\":\n return value.toString();\n case \"undefined\":\n return \"[undefined]\";\n case \"symbol\":\n return `[symbol:${stripVTControlCharacters(value.description ?? \"\")}]`;\n case \"function\":\n return `[function:${stripVTControlCharacters(value.name || \"anonymous\")}]`;\n case \"object\":\n break;\n }\n if (value === null) return null;\n if (ancestors.has(value)) return \"[Circular]\";\n\n const nextAncestors = new Set(ancestors).add(value);\n if (value instanceof Error) return normalizeJson(summarizeError(value), nextAncestors);\n\n const jsonValue = normalizedToJson(value, nextAncestors);\n if (jsonValue !== noToJson) return jsonValue;\n\n if (isArrayBufferView(value)) {\n if (value instanceof DataView) {\n return Array.from(new Uint8Array(value.buffer, value.byteOffset, value.byteLength));\n }\n try {\n return Array.from(value as unknown as Iterable<unknown>, (item) =>\n normalizeJson(item, nextAncestors),\n );\n } catch {\n return \"[Unserializable]\";\n }\n }\n if (value instanceof ArrayBuffer) return Array.from(new Uint8Array(value));\n if (Array.isArray(value)) {\n return Array.from({ length: value.length }, (_, index) =>\n normalizeProperty(value, index, nextAncestors),\n );\n }\n if (value instanceof Map) {\n try {\n return [...value].map(([key, item]) => [\n normalizeJson(key, nextAncestors),\n normalizeJson(item, nextAncestors),\n ]);\n } catch {\n return \"[Unserializable]\";\n }\n }\n if (value instanceof Set) {\n try {\n return [...value].map((item) => normalizeJson(item, nextAncestors));\n } catch {\n return \"[Unserializable]\";\n }\n }\n\n const keys = normalizedKeys(value);\n if (!keys) return safeString(value);\n const result: Record<string, unknown> = {};\n for (const key of keys) {\n result[stripVTControlCharacters(key)] = normalizeProperty(value, key, nextAncestors);\n }\n return result;\n}\n","import type { HackshErrorSummary } from \"./errors.ts\";\nimport type { LogRecord } from \"./logger.ts\";\nimport { normalizeJson } from \"./serialization.ts\";\nimport type { UsageSummary } from \"./usage.ts\";\n\nexport type PrintStream = \"stdout\" | \"stderr\";\nexport type OutputPreference = \"auto\" | \"pretty\" | \"json\";\nexport type OutputFormat = Exclude<OutputPreference, \"auto\">;\n\nexport interface OutputMode {\n format: OutputFormat;\n interactive: boolean;\n color: boolean;\n}\n\nexport interface ResolveOutputModeOptions {\n output?: OutputPreference;\n env?: Readonly<Record<string, string | undefined>>;\n inputIsTTY?: boolean;\n outputIsTTY?: boolean;\n}\n\nfunction fallbackValue(value: unknown): string {\n try {\n return String(value);\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction validatePreference(value: unknown, source: string): OutputPreference | undefined {\n if (value === undefined) return undefined;\n if (value === \"auto\" || value === \"pretty\" || value === \"json\") return value;\n throw new TypeError(\n `Invalid ${source} value ${fallbackValue(value)}; expected auto, pretty, or json`,\n );\n}\n\nfunction readEnvironment(\n env: Readonly<Record<string, string | undefined>>,\n key: string,\n): string | undefined {\n try {\n return env[key];\n } catch {\n return undefined;\n }\n}\n\n/** Resolve output behavior once, before command routing or argument parsing. */\nexport function resolveOutputMode(options: ResolveOutputModeOptions = {}): OutputMode {\n const env = options.env ?? process.env;\n const configured = validatePreference(options.output, \"output\");\n const overridden = validatePreference(readEnvironment(env, \"HACKSH_OUTPUT\"), \"HACKSH_OUTPUT\");\n const requested = overridden ?? configured ?? \"auto\";\n const ci = Boolean(readEnvironment(env, \"CI\"));\n const format = requested === \"auto\" ? (ci ? \"json\" : \"pretty\") : requested;\n const inputIsTTY = options.inputIsTTY ?? process.stdin.isTTY === true;\n const outputIsTTY = options.outputIsTTY ?? process.stdout.isTTY === true;\n return {\n format,\n interactive: format === \"pretty\" && !ci && inputIsTTY && outputIsTTY,\n color: format === \"pretty\" && outputIsTTY && !readEnvironment(env, \"NO_COLOR\"),\n };\n}\n\nexport interface UsagePrintEvent {\n type: \"usage\";\n usage: UsageSummary;\n text: string;\n stream: PrintStream;\n}\n\nexport interface VersionPrintEvent {\n type: \"version\";\n version: string;\n}\n\nexport interface ErrorPrintEvent {\n type: \"error\";\n error: HackshErrorSummary;\n}\n\nexport interface LogPrintEvent {\n type: \"log\";\n record: LogRecord;\n}\n\nexport interface PromptChoiceState {\n value: string;\n label: string;\n hint?: string;\n selected: boolean;\n}\n\nexport type PromptStatus = \"active\" | \"error\" | \"submitted\" | \"closed\";\n\ninterface PromptStateBase {\n message: string;\n status: PromptStatus;\n error?: string;\n}\n\nexport interface SelectPromptState extends PromptStateBase {\n kind: \"select\";\n choices: readonly PromptChoiceState[];\n value: string;\n}\n\nexport interface ConfirmPromptState extends PromptStateBase {\n kind: \"confirm\";\n value: boolean;\n defaultValue?: boolean;\n}\n\nexport interface TextPromptState extends PromptStateBase {\n kind: \"text\";\n value: string;\n placeholder?: string;\n}\n\nexport type PromptState = SelectPromptState | ConfirmPromptState | TextPromptState;\n\nexport interface PromptPrintEvent {\n type: \"prompt\";\n prompt: PromptState;\n}\n\n/** A semantic, command- and schema-free output value emitted by hacksh. */\nexport type PrintEvent =\n | UsagePrintEvent\n | VersionPrintEvent\n | ErrorPrintEvent\n | LogPrintEvent\n | PromptPrintEvent;\n\n/** Receives every output event produced by one command invocation. */\nexport interface Printer {\n print(event: PrintEvent): void | Promise<void>;\n}\n\nfunction isErrorLevel(level: LogRecord[\"level\"]): boolean {\n return level === \"warning\" || level === \"error\" || level === \"fatal\";\n}\n\nexport function eventStream(event: PrintEvent): PrintStream {\n if (event.type === \"error\") return \"stderr\";\n if (event.type === \"usage\") return event.stream;\n if (event.type === \"log\" && isErrorLevel(event.record.level)) return \"stderr\";\n return \"stdout\";\n}\n\nfunction formatTextEvent(event: PrintEvent): string {\n switch (event.type) {\n case \"usage\":\n return event.text;\n case \"version\":\n return event.version;\n case \"error\":\n return event.error.kind === \"usage\" || event.error.kind === \"validation\"\n ? event.error.message\n : `Error: ${event.error.message}`;\n case \"log\":\n return event.record.message;\n case \"prompt\":\n return event.prompt.message;\n }\n}\n\n/** Undecorated console compatibility adapter; automatic output uses the selected format printer. */\nexport const consolePrinter: Printer = {\n print(event) {\n const text = formatTextEvent(event);\n return eventStream(event) === \"stdout\" ? console.log(text) : console.error(text);\n },\n};\n\nexport interface OutputWriter {\n write(text: string): unknown;\n}\n\nexport interface TerminalInput {\n readonly isTTY?: boolean;\n readonly isRaw?: boolean;\n readonly readableFlowing?: boolean | null;\n setRawMode?(mode: boolean): unknown;\n resume(): unknown;\n pause(): unknown;\n on(event: string, listener: (...args: never[]) => void): unknown;\n removeListener(event: string, listener: (...args: never[]) => void): unknown;\n}\n\nexport interface TerminalOutput extends OutputWriter {\n readonly isTTY?: boolean;\n readonly columns?: number;\n}\n\nexport interface JsonPrinterOptions {\n stdout?: OutputWriter;\n stderr?: OutputWriter;\n}\n\nexport interface StreamPrinterOptions {\n stdout: OutputWriter;\n stderr: OutputWriter;\n}\n\n/** Create an undecorated stream-backed compatibility adapter. */\nexport function createStreamPrinter(options: StreamPrinterOptions): Printer {\n return {\n print(event) {\n const writer = eventStream(event) === \"stdout\" ? options.stdout : options.stderr;\n writer.write(`${formatTextEvent(event)}\\n`);\n },\n };\n}\n\n/** Create a one-semantic-event-per-line JSON printer. */\nexport function createJsonPrinter(options: JsonPrinterOptions = {}): Printer {\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n return {\n print(event) {\n let serialized: string;\n try {\n serialized = JSON.stringify(normalizeJson(event));\n } catch {\n serialized = JSON.stringify({\n type: event.type,\n serializationError: \"Event data could not be serialized\",\n });\n }\n const line = `${serialized}\\n`;\n (eventStream(event) === \"stdout\" ? stdout : stderr).write(line);\n },\n };\n}\n\nexport interface PrintQueue {\n printer: Printer;\n printChecked(event: PrintEvent): Promise<void>;\n drain(): Promise<void>;\n}\n\n/** Serialize printer calls and retain failures until the invocation drains its output. */\nexport function createPrintQueue(target: Printer): PrintQueue {\n let pending: Promise<void> | undefined;\n let failure: unknown;\n let failed = false;\n\n function recordFailure(error: unknown): void {\n if (!failed) failure = error;\n failed = true;\n }\n\n function track(execution: Promise<void>, retainFailure: boolean): Promise<void> {\n const barrier = execution.catch((error: unknown) => {\n if (retainFailure) recordFailure(error);\n });\n pending = barrier;\n void barrier.then(() => {\n if (pending === barrier) pending = undefined;\n });\n return retainFailure ? barrier : execution;\n }\n\n function enqueue(event: PrintEvent, retainFailure: boolean): void | Promise<void> {\n if (pending)\n return track(\n pending.then(() => target.print(event)),\n retainFailure,\n );\n try {\n const result = target.print(event);\n if (result) return track(Promise.resolve(result), retainFailure);\n } catch (error) {\n if (retainFailure) recordFailure(error);\n else return Promise.reject(error);\n }\n }\n\n const printer: Printer = {\n print(event) {\n return enqueue(event, true);\n },\n };\n\n return {\n printer,\n async printChecked(event) {\n await enqueue(event, false);\n },\n async drain() {\n await pending;\n if (failed) throw failure;\n },\n };\n}\n","import { inspect, stripVTControlCharacters, styleText } from \"node:util\";\nimport type { HackshErrorSummary } from \"./errors.ts\";\nimport type { LogLevel, LogRecord } from \"./logger.ts\";\nimport {\n eventStream,\n type OutputWriter,\n type Printer,\n type PrintEvent,\n type TerminalOutput,\n} from \"./printer.ts\";\n\ntype PrettyMark = LogLevel | \"step\" | \"success\" | \"usage\" | \"version\" | \"errorEvent\" | \"prompt\";\ntype TextStyle = Parameters<typeof styleText>[0];\n\ninterface PrettySymbols {\n bar: string;\n marks: Record<PrettyMark, string>;\n}\n\nconst unicodeSymbols: PrettySymbols = {\n bar: \"│\",\n marks: {\n trace: \"·\",\n debug: \"◆\",\n info: \"●\",\n warning: \"▲\",\n error: \"■\",\n fatal: \"✖\",\n step: \"◇\",\n success: \"✔\",\n usage: \"◆\",\n version: \"●\",\n errorEvent: \"■\",\n prompt: \"?\",\n },\n};\n\nconst asciiSymbols: PrettySymbols = {\n bar: \"|\",\n marks: {\n trace: \".\",\n debug: \":\",\n info: \"i\",\n warning: \"!\",\n error: \"x\",\n fatal: \"X\",\n step: \">\",\n success: \"+\",\n usage: \"?\",\n version: \"i\",\n errorEvent: \"x\",\n prompt: \"?\",\n },\n};\n\nconst markStyles: Record<PrettyMark, TextStyle> = {\n trace: \"gray\",\n debug: \"magenta\",\n info: \"blue\",\n warning: \"yellow\",\n error: \"red\",\n fatal: [\"bgRed\", \"white\", \"bold\"],\n step: \"cyan\",\n success: \"green\",\n usage: \"cyan\",\n version: \"blue\",\n errorEvent: \"red\",\n prompt: \"cyan\",\n};\n\nexport interface PrettyPrinterOptions {\n color: boolean;\n unicode: boolean;\n stdout?: TerminalOutput;\n stderr?: OutputWriter;\n}\n\nfunction safelyInspect(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return inspect(value, {\n breakLength: 80,\n colors: false,\n compact: false,\n depth: null,\n sorted: true,\n });\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nfunction propertyLines(properties: Readonly<Record<string, unknown>>): string[] {\n const lines: string[] = [];\n for (const key of Object.keys(properties).sort()) {\n const rendered = ` ${key}: ${safelyInspect(properties[key])}`.split(\"\\n\");\n lines.push(rendered[0] ?? \"\");\n for (const continuation of rendered.slice(1)) lines.push(` ${continuation}`);\n }\n return lines;\n}\n\nfunction logLines(record: LogRecord): string[] {\n const category = record.category.length > 0 ? `[${record.category.join(\":\")}] ` : \"\";\n const message = record.message.split(\"\\n\");\n return [\n `${category}${message[0] ?? \"\"}`,\n ...message.slice(1),\n ...propertyLines(record.properties),\n ];\n}\n\nfunction errorLines(error: HackshErrorSummary): string[] {\n const lines = error.message.split(\"\\n\");\n const details: Record<string, unknown> = {};\n if (error.cause !== undefined) details.cause = error.cause;\n if (error.properties !== undefined) Object.assign(details, error.properties);\n if (error.value !== undefined) details.value = error.value;\n return [...lines, ...propertyLines(details)];\n}\n\nfunction eventMark(event: PrintEvent): PrettyMark {\n if (event.type === \"usage\") return \"usage\";\n if (event.type === \"version\") return \"version\";\n if (event.type === \"error\") return \"errorEvent\";\n if (event.type === \"prompt\") return event.prompt.status === \"submitted\" ? \"success\" : \"prompt\";\n return event.record.kind === \"message\" ? event.record.level : event.record.kind;\n}\n\nfunction eventLines(event: PrintEvent): string[] {\n switch (event.type) {\n case \"usage\":\n return event.text.split(\"\\n\");\n case \"version\":\n return event.version.split(\"\\n\");\n case \"error\":\n return errorLines(event.error);\n case \"log\":\n return logLines(event.record);\n case \"prompt\": {\n const { prompt } = event;\n if (prompt.status === \"submitted\") {\n const result =\n prompt.kind === \"select\"\n ? (prompt.choices.find(({ value }) => value === prompt.value)?.label ?? prompt.value)\n : prompt.kind === \"confirm\"\n ? prompt.value\n ? \"Yes\"\n : \"No\"\n : prompt.value;\n return [`${prompt.message}: ${result}`];\n }\n const lines = [prompt.message];\n if (prompt.kind === \"select\") {\n for (const choice of prompt.choices) {\n lines.push(\n `${choice.selected ? \">\" : \" \"} ${choice.label}${choice.hint ? ` — ${choice.hint}` : \"\"}`,\n );\n }\n } else if (prompt.kind === \"confirm\") {\n lines.push(\n `${prompt.value ? \"Yes\" : \"No\"}${prompt.defaultValue === undefined ? \"\" : ` (default: ${prompt.defaultValue ? \"yes\" : \"no\"})`}`,\n );\n } else {\n lines.push(prompt.value || (prompt.placeholder ? `(${prompt.placeholder})` : \"\"));\n }\n if (prompt.error) lines.push(prompt.error);\n return lines;\n }\n }\n}\n\nfunction colorize(enabled: boolean, style: TextStyle, text: string): string {\n return enabled ? styleText(style, text, { validateStream: false }) : text;\n}\n\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\nconst combiningMark = /\\p{Mark}/u;\nconst pictograph = /\\p{Extended_Pictographic}/u;\n\nfunction isWideCodePoint(codePoint: number): boolean {\n return (\n codePoint >= 0x1100 &&\n (codePoint <= 0x115f ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||\n (codePoint >= 0xff00 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd))\n );\n}\n\nfunction displayWidth(text: string): number {\n let width = 0;\n for (const { segment } of graphemeSegmenter.segment(stripVTControlCharacters(text))) {\n if (segment === \"\\t\") {\n width += 8 - (width % 8);\n continue;\n }\n if (\n pictograph.test(segment) ||\n Array.from(segment).some((value) => isWideCodePoint(value.codePointAt(0)!))\n ) {\n width += 2;\n continue;\n }\n for (const value of segment) {\n const codePoint = value.codePointAt(0)!;\n if (codePoint < 0x20 || (codePoint >= 0x7f && codePoint < 0xa0)) continue;\n if (codePoint === 0x200d || (codePoint >= 0xfe00 && codePoint <= 0xfe0f)) continue;\n if (!combiningMark.test(value)) width += 1;\n }\n }\n return width;\n}\n\nfunction renderedRows(rendered: string, columns: number | undefined): number {\n const width =\n Number.isInteger(columns) && columns !== undefined && columns > 0 ? columns : undefined;\n return rendered.split(\"\\n\").reduce((rows, line) => {\n if (!width) return rows + 1;\n return rows + Math.max(1, Math.ceil(displayWidth(line) / width));\n }, 0);\n}\n\n/** Create the fixed human-readable renderer used for pretty output. */\nexport function createPrettyPrinter(options: PrettyPrinterOptions): Printer {\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n const symbols = options.unicode ? unicodeSymbols : asciiSymbols;\n let activePrompt: { rendered: string; lines: number } | undefined;\n\n function render(event: PrintEvent): string {\n const mark = eventMark(event);\n const lines = eventLines(event);\n const firstPrefix = colorize(options.color, markStyles[mark], symbols.marks[mark]);\n const barPrefix = colorize(options.color, \"gray\", symbols.bar);\n return lines\n .map((line, index) => `${index === 0 ? firstPrefix : barPrefix}${line ? ` ${line}` : \"\"}`)\n .join(\"\\n\");\n }\n\n function eraseActivePrompt(): string {\n return activePrompt ? \"\\u001b[1A\\u001b[2K\".repeat(activePrompt.lines) : \"\";\n }\n\n return {\n print(event) {\n const rendered = render(event);\n if (event.type === \"prompt\") {\n const erase = eraseActivePrompt();\n if (event.prompt.status === \"closed\") {\n activePrompt = undefined;\n if (erase) stdout.write(erase);\n return;\n }\n if (event.prompt.status === \"submitted\") activePrompt = undefined;\n else activePrompt = { rendered, lines: renderedRows(rendered, stdout.columns) };\n stdout.write(`${erase}${rendered}\\n`);\n return;\n }\n\n const erase = eraseActivePrompt();\n if (!activePrompt) {\n (eventStream(event) === \"stdout\" ? stdout : stderr).write(`${rendered}\\n`);\n return;\n }\n\n stdout.write(erase);\n if (event.type === \"error\") activePrompt = undefined;\n (eventStream(event) === \"stdout\" ? stdout : stderr).write(`${rendered}\\n`);\n if (activePrompt) stdout.write(`${activePrompt.rendered}\\n`);\n },\n };\n}\n","import { emitKeypressEvents } from \"node:readline\";\nimport { PassThrough } from \"node:stream\";\nimport type { HackshPromptErrorReason, PromptErrorDetails, PromptKind } from \"./errors.ts\";\nimport { HackshPromptError } from \"./errors.ts\";\nimport type {\n ConfirmPromptState,\n Printer,\n PromptState,\n PromptStatus,\n SelectPromptState,\n TerminalInput,\n TextPromptState,\n} from \"./printer.ts\";\n\nexport interface SelectOption<T extends string> {\n value: T;\n label?: string;\n hint?: string;\n}\n\nexport interface SelectOptions<T extends string> {\n message: string;\n options: readonly SelectOption<T>[];\n initialValue?: T;\n}\n\nexport interface ConfirmOptions {\n message: string;\n initialValue?: boolean;\n}\n\nexport interface TextOptions {\n message: string;\n placeholder?: string;\n validate?(value: string): string | undefined;\n}\n\nexport interface Prompter {\n select<const T extends string>(options: SelectOptions<T>): Promise<T>;\n confirm(options: ConfirmOptions): Promise<boolean>;\n text(options: TextOptions): Promise<string>;\n}\n\ninterface Key {\n name?: string;\n ctrl?: boolean;\n meta?: boolean;\n sequence?: string;\n}\n\ninterface PromptControllerOptions {\n interactive: boolean;\n input: TerminalInput;\n print(event: Parameters<Printer[\"print\"]>[0]): Promise<void>;\n}\n\ninterface BufferedKeypress {\n character: string | undefined;\n key: Key;\n}\n\nfunction details(\n kind: PromptKind,\n message: unknown,\n choices?: readonly string[],\n): PromptErrorDetails {\n let normalizedMessage: string;\n try {\n normalizedMessage = typeof message === \"string\" ? message : String(message);\n } catch {\n normalizedMessage = \"[Unserializable prompt message]\";\n }\n return {\n kind,\n message: normalizedMessage,\n ...(choices === undefined ? {} : { choices }),\n };\n}\n\nfunction promptError(\n reason: HackshPromptErrorReason,\n prompt: PromptErrorDetails,\n message: string,\n cause?: unknown,\n): HackshPromptError {\n return new HackshPromptError(\n reason,\n prompt,\n message,\n cause === undefined ? undefined : { cause },\n );\n}\n\nfunction validateMessage(kind: PromptKind, message: unknown, choices?: readonly string[]): void {\n if (typeof message !== \"string\" || message.length === 0) {\n throw promptError(\n \"invalid-options\",\n details(kind, message, choices),\n `Invalid ${kind} prompt: message must be a non-empty string`,\n );\n }\n}\n\nfunction asInput(value: TerminalInput, prompt: PromptErrorDetails): TerminalInput {\n if (\n typeof value !== \"object\" ||\n value === null ||\n typeof Reflect.get(value, \"on\") !== \"function\" ||\n typeof Reflect.get(value, \"removeListener\") !== \"function\" ||\n typeof Reflect.get(value, \"resume\") !== \"function\" ||\n typeof Reflect.get(value, \"pause\") !== \"function\"\n ) {\n throw promptError(\"input-error\", prompt, \"Interactive input is not a readable stream\");\n }\n return value;\n}\n\nexport class PromptController implements Prompter {\n readonly #interactive: boolean;\n readonly #inputValue: TerminalInput;\n readonly #printEvent: PromptControllerOptions[\"print\"];\n readonly #bufferedKeys: BufferedKeypress[] = [];\n #active = false;\n\n constructor(options: PromptControllerOptions) {\n this.#interactive = options.interactive;\n this.#inputValue = options.input;\n this.#printEvent = (event) => options.print(event);\n }\n\n async #print(state: PromptState, prompt: PromptErrorDetails): Promise<void> {\n try {\n await this.#printEvent({ type: \"prompt\", prompt: state });\n } catch (cause) {\n throw promptError(\"printer-error\", prompt, \"The prompt could not be displayed\", cause);\n }\n }\n\n async #run<T>(\n prompt: PromptErrorDetails,\n initial: PromptState,\n accept: (character: string, key: Key) => T | undefined,\n update: (character: string, key: Key) => PromptState | undefined,\n submitted: (value: T) => PromptState,\n closed: () => PromptState,\n ): Promise<T> {\n if (!this.#interactive) {\n throw promptError(\n \"non-interactive\",\n prompt,\n `Cannot request ${prompt.kind} input in non-interactive mode: ${prompt.message}`,\n );\n }\n if (this.#active) {\n throw promptError(\"overlapping\", prompt, \"Another prompt is already active\");\n }\n\n const input = asInput(this.#inputValue, prompt);\n this.#active = true;\n let originallyFlowing = false;\n let rawChanged = false;\n let outcome: { ok: true; value: T } | { ok: false; error: unknown };\n try {\n originallyFlowing = input.readableFlowing === true;\n if (input.setRawMode && input.isRaw !== true) {\n input.setRawMode(true);\n rawChanged = true;\n }\n await this.#print(initial, prompt);\n\n const value = await new Promise<T>((resolve, reject) => {\n const keypressInput = new PassThrough();\n emitKeypressEvents(keypressInput);\n let settled = false;\n let draining = false;\n let finalized = false;\n let completion: (() => void) | undefined;\n const queuedKeys = this.#bufferedKeys.splice(0);\n const finalize = (): void => {\n if (finalized || !settled || draining) return;\n finalized = true;\n cleanup();\n completion?.();\n };\n const finish = (action: () => void): void => {\n if (settled) return;\n settled = true;\n completion = action;\n finalize();\n };\n const fail = (reason: HackshPromptErrorReason, message: string, cause?: unknown): void => {\n finish(() => reject(promptError(reason, prompt, message, cause)));\n };\n const handleKeypress = async (\n character: string | undefined,\n key: Key = {},\n ): Promise<void> => {\n if (settled) return;\n if ((key.ctrl && key.name === \"c\") || key.name === \"escape\") {\n fail(\"cancelled\", \"Prompt cancelled\");\n return;\n }\n if (key.ctrl && key.name === \"d\") {\n fail(\"eof\", \"Prompt input ended before a value was submitted\");\n return;\n }\n try {\n const value = accept(character ?? \"\", key);\n if (value !== undefined) {\n finish(() => resolve(value));\n return;\n }\n const state = update(character ?? \"\", key);\n if (state) await this.#print(state, prompt);\n } catch (cause) {\n if (cause instanceof HackshPromptError) finish(() => reject(cause));\n else fail(\"input-error\", \"Prompt input could not be processed\", cause);\n }\n };\n const drainKeys = async (): Promise<void> => {\n if (draining || finalized) return;\n draining = true;\n try {\n while (queuedKeys.length > 0) {\n if (settled) {\n this.#bufferedKeys.push(...queuedKeys.splice(0));\n break;\n }\n const next = queuedKeys.shift()!;\n await handleKeypress(next.character, next.key);\n }\n } finally {\n draining = false;\n finalize();\n }\n };\n const onKeypress = (character: string | undefined, key: Key = {}): void => {\n queuedKeys.push({ character, key });\n void drainKeys().catch((cause: unknown) =>\n fail(\"input-error\", \"Prompt input could not be processed\", cause),\n );\n };\n const onEnd = (): void => fail(\"eof\", \"Prompt input ended before a value was submitted\");\n const onError = (cause: unknown): void => fail(\"input-error\", \"Prompt input failed\", cause);\n const onData = (chunk: unknown): void => {\n if (typeof chunk === \"string\" || chunk instanceof Uint8Array) keypressInput.write(chunk);\n else fail(\"input-error\", \"Prompt input produced a non-byte value\");\n };\n const cleanup = (): void => {\n keypressInput.removeListener(\"keypress\", onKeypress);\n keypressInput.destroy();\n input.removeListener(\"data\", onData as (...args: never[]) => void);\n input.removeListener(\"end\", onEnd as (...args: never[]) => void);\n input.removeListener(\"close\", onEnd as (...args: never[]) => void);\n input.removeListener(\"error\", onError as (...args: never[]) => void);\n };\n keypressInput.on(\"keypress\", onKeypress);\n input.on(\"data\", onData as (...args: never[]) => void);\n input.on(\"end\", onEnd as (...args: never[]) => void);\n input.on(\"close\", onEnd as (...args: never[]) => void);\n input.on(\"error\", onError as (...args: never[]) => void);\n input.resume();\n void drainKeys().catch((cause: unknown) =>\n fail(\"input-error\", \"Prompt input could not be processed\", cause),\n );\n });\n outcome = { ok: true, value };\n } catch (cause) {\n outcome = {\n ok: false,\n error:\n cause instanceof HackshPromptError\n ? cause\n : promptError(\"input-error\", prompt, \"Prompt input could not be initialized\", cause),\n };\n }\n\n let restoreError: HackshPromptError | undefined;\n try {\n if (rawChanged) input.setRawMode?.(false);\n if (!originallyFlowing) input.pause();\n } catch (cause) {\n restoreError = promptError(\n \"input-error\",\n prompt,\n \"Prompt input could not be restored\",\n cause,\n );\n }\n const closeWithFailure = async (failure: unknown): Promise<never> => {\n try {\n await this.#print(closed(), prompt);\n } catch {\n // Preserve the error that terminated the prompt, including an earlier printer failure.\n } finally {\n this.#active = false;\n }\n throw failure;\n };\n if (restoreError) return closeWithFailure(restoreError);\n if (!outcome.ok) return closeWithFailure(outcome.error);\n try {\n await this.#print(submitted(outcome.value), prompt);\n return outcome.value;\n } catch (error) {\n try {\n await this.#print(closed(), prompt);\n } catch {\n // The submitted-state failure remains the primary error.\n }\n throw error;\n } finally {\n this.#active = false;\n }\n }\n\n async select<const T extends string>(options: SelectOptions<T>): Promise<T> {\n const choices = Array.isArray(options?.options)\n ? options.options.map((option) =>\n typeof option === \"object\" && option !== null && typeof option.value === \"string\"\n ? option.value\n : \"[Invalid choice]\",\n )\n : [];\n const prompt = details(\"select\", options?.message, choices);\n validateMessage(\"select\", options?.message, choices);\n if (!Array.isArray(options.options) || options.options.length === 0) {\n throw promptError(\"invalid-options\", prompt, \"A select prompt requires at least one choice\");\n }\n const seen = new Set<string>();\n for (const option of options.options) {\n if (\n typeof option !== \"object\" ||\n option === null ||\n typeof option.value !== \"string\" ||\n option.value.length === 0 ||\n (option.label !== undefined && typeof option.label !== \"string\") ||\n (option.hint !== undefined && typeof option.hint !== \"string\")\n ) {\n throw promptError(\n \"invalid-options\",\n prompt,\n \"Select choices must have valid string values\",\n );\n }\n if (seen.has(option.value)) {\n throw promptError(\"invalid-options\", prompt, `Duplicate select choice: ${option.value}`);\n }\n seen.add(option.value);\n }\n let selected = options.initialValue === undefined ? 0 : choices.indexOf(options.initialValue);\n if (selected < 0) {\n throw promptError(\n \"invalid-options\",\n prompt,\n `Unknown initial select value: ${String(options.initialValue)}`,\n );\n }\n const state = (status: PromptStatus = \"active\"): SelectPromptState => ({\n kind: \"select\",\n message: options.message,\n status,\n value: options.options[selected]!.value,\n choices: options.options.map(({ value, label, hint }, index) => ({\n value,\n label: label ?? value,\n ...(hint === undefined ? {} : { hint }),\n selected: index === selected,\n })),\n });\n const value = await this.#run<T>(\n prompt,\n state(),\n (_character, key) =>\n key.name === \"return\" || key.name === \"enter\"\n ? options.options[selected]!.value\n : undefined,\n (_character, key) => {\n if (key.name !== \"up\" && key.name !== \"down\") return undefined;\n selected =\n (selected + (key.name === \"up\" ? -1 : 1) + options.options.length) %\n options.options.length;\n return state();\n },\n () => state(\"submitted\"),\n () => state(\"closed\"),\n );\n return value;\n }\n\n async confirm(options: ConfirmOptions): Promise<boolean> {\n const prompt = details(\"confirm\", options?.message);\n validateMessage(\"confirm\", options?.message);\n if (options.initialValue !== undefined && typeof options.initialValue !== \"boolean\") {\n throw promptError(\"invalid-options\", prompt, \"Confirm initialValue must be a boolean\");\n }\n const value = options.initialValue ?? false;\n const state = (result: boolean, status: PromptStatus = \"active\"): ConfirmPromptState => ({\n kind: \"confirm\",\n message: options.message,\n status,\n value: result,\n ...(options.initialValue === undefined ? {} : { defaultValue: options.initialValue }),\n });\n const result = await this.#run<boolean>(\n prompt,\n state(value),\n (character, key) => {\n if (key.name === \"return\" || key.name === \"enter\") return value;\n if (character.toLowerCase() === \"y\") return true;\n if (character.toLowerCase() === \"n\") return false;\n return undefined;\n },\n () => undefined,\n (submitted) => state(submitted, \"submitted\"),\n () => state(value, \"closed\"),\n );\n return result;\n }\n\n async text(options: TextOptions): Promise<string> {\n const prompt = details(\"text\", options?.message);\n validateMessage(\"text\", options?.message);\n if (options.placeholder !== undefined && typeof options.placeholder !== \"string\") {\n throw promptError(\"invalid-options\", prompt, \"Text placeholder must be a string\");\n }\n if (options.validate !== undefined && typeof options.validate !== \"function\") {\n throw promptError(\"invalid-options\", prompt, \"Text validate must be a function\");\n }\n let value = \"\";\n let validationError: string | undefined;\n const state = (\n status: PromptStatus = validationError ? \"error\" : \"active\",\n ): TextPromptState => ({\n kind: \"text\",\n message: options.message,\n status,\n value,\n ...(options.placeholder === undefined ? {} : { placeholder: options.placeholder }),\n ...(validationError === undefined ? {} : { error: validationError }),\n });\n const result = await this.#run<string>(\n prompt,\n state(),\n (_character, key) => {\n if (key.name !== \"return\" && key.name !== \"enter\") return undefined;\n let error: string | undefined;\n try {\n error = options.validate?.(value);\n } catch (cause) {\n throw promptError(\"input-error\", prompt, \"Text validation failed\", cause);\n }\n if (error !== undefined && typeof error !== \"string\") {\n throw promptError(\n \"input-error\",\n prompt,\n \"Text validation must return a string or undefined\",\n );\n }\n validationError = error || undefined;\n return validationError === undefined ? value : undefined;\n },\n (character, key) => {\n if (key.name === \"return\" || key.name === \"enter\") return state();\n validationError = undefined;\n if (key.name === \"backspace\") value = Array.from(value).slice(0, -1).join(\"\");\n else if (!key.ctrl && !key.meta && character.length > 0) value += character;\n else return undefined;\n return state();\n },\n () => state(\"submitted\"),\n () => state(\"closed\"),\n );\n return result;\n }\n}\n","import type { Printer, TerminalInput } from \"./printer.ts\";\nimport { summarizeErrors } from \"./errors.ts\";\nimport type { Prompter } from \"./prompts.ts\";\nimport { PromptController } from \"./prompts.ts\";\n\nexport type LogLevel = \"trace\" | \"debug\" | \"info\" | \"warning\" | \"error\" | \"fatal\";\n\nexport type LogKind = \"message\" | \"step\" | \"success\";\n\nexport type LogProperties = Record<string, unknown>;\n\n/** A structured message emitted by a command's logger. */\nexport interface LogRecord {\n level: LogLevel;\n kind: LogKind;\n category: readonly string[];\n message: string;\n rawMessage: string;\n properties: LogProperties;\n timestamp: number;\n}\n\nexport interface Logger extends Prompter {\n readonly category: readonly string[];\n trace(message: string, properties?: LogProperties): void;\n debug(message: string, properties?: LogProperties): void;\n info(message: string, properties?: LogProperties): void;\n warn(message: string, properties?: LogProperties): void;\n error(message: string | Error, properties?: LogProperties): void;\n fatal(message: string | Error, properties?: LogProperties): void;\n step(message: string, properties?: LogProperties): void;\n success(message: string, properties?: LogProperties): void;\n with(properties: LogProperties): Logger;\n getChild(category: string): Logger;\n}\n\nfunction interpolate(message: string, properties: LogProperties): string {\n return message.replace(/\\{([^{}]+)\\}/g, (placeholder, key: string) => {\n if (!Object.hasOwn(properties, key)) return placeholder;\n try {\n return String(properties[key]);\n } catch {\n return placeholder;\n }\n });\n}\n\nfunction createBoundLogger(\n printer: Printer,\n category: readonly string[],\n boundProperties: LogProperties,\n prompts: PromptController,\n): Logger {\n function emit(\n level: LogLevel,\n kind: LogKind,\n input: string | Error,\n properties: LogProperties = {},\n ): void {\n const rawMessage = input instanceof Error ? input.message : input;\n const mergedProperties = { ...boundProperties, ...properties };\n if (input instanceof Error) mergedProperties.error = input;\n const summarizedProperties = summarizeErrors(mergedProperties) as LogProperties;\n\n void printer.print({\n type: \"log\",\n record: {\n level,\n kind,\n category,\n message: interpolate(rawMessage, mergedProperties),\n rawMessage,\n properties: summarizedProperties,\n timestamp: Date.now(),\n },\n });\n }\n\n return {\n category,\n trace: (message, properties) => emit(\"trace\", \"message\", message, properties),\n debug: (message, properties) => emit(\"debug\", \"message\", message, properties),\n info: (message, properties) => emit(\"info\", \"message\", message, properties),\n warn: (message, properties) => emit(\"warning\", \"message\", message, properties),\n error: (message, properties) => emit(\"error\", \"message\", message, properties),\n fatal: (message, properties) => emit(\"fatal\", \"message\", message, properties),\n step: (message, properties) => emit(\"info\", \"step\", message, properties),\n success: (message, properties) => emit(\"info\", \"success\", message, properties),\n select: (options) => prompts.select(options),\n confirm: (options) => prompts.confirm(options),\n text: (options) => prompts.text(options),\n with: (properties) =>\n createBoundLogger(printer, category, { ...boundProperties, ...properties }, prompts),\n getChild: (child) => createBoundLogger(printer, [...category, child], boundProperties, prompts),\n };\n}\n\nexport interface CreateLoggerOptions {\n interactive: boolean;\n input: TerminalInput;\n printPrompt(event: Parameters<Printer[\"print\"]>[0]): Promise<void>;\n}\n\n/** Create the logger for one command invocation. */\nexport function createLogger(\n printer: Printer,\n category: readonly string[],\n options: CreateLoggerOptions,\n): Logger {\n const prompts = new PromptController({\n interactive: options.interactive,\n input: options.input,\n print: (event) => options.printPrompt(event),\n });\n return createBoundLogger(printer, [...category], {}, prompts);\n}\n","import { createPrettyPrinter } from \"./pretty.ts\";\nimport {\n createJsonPrinter,\n resolveOutputMode,\n type OutputMode,\n type OutputPreference,\n type OutputWriter,\n type Printer,\n type TerminalInput,\n type TerminalOutput,\n} from \"./printer.ts\";\n\nexport interface OutputOptions {\n output?: OutputPreference;\n /** Use Unicode presentation symbols in pretty output. Defaults to true. */\n unicode?: boolean;\n env?: Readonly<Record<string, string | undefined>>;\n stdin?: TerminalInput;\n stdout?: TerminalOutput;\n stderr?: OutputWriter;\n}\n\nfunction consoleWriter(method: \"log\" | \"error\", stream: TerminalOutput): TerminalOutput {\n return {\n get isTTY() {\n return stream.isTTY;\n },\n get columns() {\n return stream.columns;\n },\n write(text) {\n if (!text.endsWith(\"\\n\")) return stream.write(text);\n console[method](text.slice(0, -1));\n },\n };\n}\n\n/** Resolve the automatic output policy and select its printer for one operation. */\nexport function selectOutputPrinter(\n options: OutputOptions,\n override?: Printer,\n resolvedMode?: OutputMode,\n): Printer {\n const stdin = options.stdin ?? process.stdin;\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n const mode =\n resolvedMode ??\n resolveOutputMode({\n output: options.output,\n env: options.env,\n inputIsTTY: stdin.isTTY,\n outputIsTTY: stdout.isTTY,\n });\n if (override) return override;\n if (mode.format === \"json\") return createJsonPrinter({ stdout, stderr });\n\n const useConsole = options.stdout === undefined && options.stderr === undefined;\n return createPrettyPrinter({\n color: mode.color,\n unicode: options.unicode ?? true,\n stdout: options.stdout ?? (useConsole ? consoleWriter(\"log\", stdout) : stdout),\n stderr: options.stderr ?? (useConsole ? consoleWriter(\"error\", process.stderr) : stderr),\n });\n}\n","import type { AnyCommandDef } from \"./command.ts\";\nimport { commandEnvPath, optionEnvNames } from \"./environment.ts\";\nimport { summarizeErrors } from \"./errors.ts\";\nimport { aliasList, kebabCase } from \"./options.ts\";\nimport { selectOutputPrinter, type OutputOptions } from \"./output.ts\";\nimport type { Printer, PrintStream } from \"./printer.ts\";\nimport { POSITIONALS_KEY, readArgInfo, readPositionals, schemaShape } from \"./schema.ts\";\n\nfunction details(\n description: string | undefined,\n required: boolean,\n defaultValue: unknown,\n choices: readonly string[] | undefined,\n envName?: string,\n): string {\n const parts = [description];\n if (choices) parts.push(`(Choices: ${choices.join(\", \")})`);\n if (required) parts.push(\"(Required)\");\n if (defaultValue !== undefined) parts.push(`(Default: ${formatDefault(defaultValue)})`);\n if (envName !== undefined) parts.push(`(Env: ${envName})`);\n return parts.filter(Boolean).join(\" \");\n}\n\nfunction formatDefault(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return value.toString();\n }\n if (value === null) return \"null\";\n try {\n return JSON.stringify(value) ?? \"undefined\";\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nexport interface UsageArgumentSummary {\n name: string;\n required: boolean;\n variadic: boolean;\n description?: string;\n choices?: readonly string[];\n defaultValue?: unknown;\n}\n\nexport interface UsageOptionSummary {\n name: string;\n flags: readonly string[];\n takesValue: boolean;\n /** Whether the long flag also accepts a `--no-` prefixed form. */\n negatable: boolean;\n valueName?: string;\n required: boolean;\n description?: string;\n choices?: readonly string[];\n defaultValue?: unknown;\n env?: string;\n}\n\nexport interface UsageCommandSummary {\n name: string;\n description?: string;\n}\n\n/** A schema-free description of the useful help metadata for a command. */\nexport interface UsageSummary {\n name: string;\n heading?: string;\n version?: string;\n description?: string;\n synopsis: string;\n arguments: readonly UsageArgumentSummary[];\n options: readonly UsageOptionSummary[];\n commands: readonly UsageCommandSummary[];\n}\n\nfunction heading(command: AnyCommandDef): string | undefined {\n const identity = command.name\n ? `${command.name}${command.version ? ` v${command.version}` : \"\"}`\n : command.version\n ? `v${command.version}`\n : undefined;\n if (command.description && identity) return `${command.description} (${identity})`;\n return command.description ?? identity;\n}\n\n/** Build a serializable help summary without retaining command or schema objects. */\nexport function summarizeUsage(command: AnyCommandDef): UsageSummary {\n const shape = command.args ? schemaShape(command.args) : {};\n const positionals = readPositionals(shape);\n const positionalItems = positionals?.items ?? [];\n const syntax = positionalItems.map(({ schema, label }) =>\n readArgInfo(schema).required ? `<${label}>` : `[${label}]`,\n );\n if (positionals?.rest) syntax.push(`[${positionals.rest.label}...]`);\n if (command.subCommands && Object.keys(command.subCommands).length > 0) syntax.push(\"<COMMAND>\");\n\n const args: UsageArgumentSummary[] = positionalItems.map(({ schema, label }) => {\n const info = readArgInfo(schema);\n return {\n name: label,\n required: info.required,\n variadic: false,\n ...(info.description === undefined ? {} : { description: info.description }),\n ...(info.choices === undefined ? {} : { choices: info.choices }),\n ...(info.defaultValue === undefined\n ? {}\n : { defaultValue: summarizeErrors(info.defaultValue) }),\n };\n });\n if (positionals?.rest) {\n const info = readArgInfo(positionals.rest.schema);\n args.push({\n name: positionals.rest.label,\n required: false,\n variadic: true,\n ...(info.description === undefined ? {} : { description: info.description }),\n ...(info.choices === undefined ? {} : { choices: info.choices }),\n });\n }\n\n const envNames = optionEnvNames(command, commandEnvPath(command));\n const options = Object.entries(shape)\n .filter(([key]) => key !== POSITIONALS_KEY)\n .map(([key, schema]): UsageOptionSummary => {\n const info = readArgInfo(schema);\n const argOptions = command.argOptions?.[key];\n const aliases = argOptions?.alias\n ? aliasList(argOptions.alias).map((item) => `-${item}`)\n : [];\n const name = kebabCase(key);\n const valueName = argOptions?.valueName ?? name;\n const envName = envNames.get(key);\n return {\n name,\n flags: [...aliases, `--${name}`],\n takesValue: info.takesValue,\n negatable: !info.takesValue,\n required: info.required,\n ...(info.takesValue ? { valueName } : {}),\n ...(info.description === undefined ? {} : { description: info.description }),\n ...(info.choices === undefined ? {} : { choices: info.choices }),\n ...(info.defaultValue === undefined\n ? {}\n : { defaultValue: summarizeErrors(info.defaultValue) }),\n ...(envName === undefined ? {} : { env: envName }),\n };\n });\n\n const commands = Object.entries(command.subCommands ?? {})\n .filter(([, child]) => !child.hidden)\n .map(([name, child]) => ({\n name,\n ...(child.description === undefined ? {} : { description: child.description }),\n }));\n const name = command.name ?? \"command\";\n const title = heading(command);\n return {\n name,\n ...(title === undefined ? {} : { heading: title }),\n ...(command.version === undefined ? {} : { version: command.version }),\n ...(command.description === undefined ? {} : { description: command.description }),\n synopsis: `${name} [OPTIONS]${syntax.length ? ` ${syntax.join(\" \")}` : \"\"}`,\n arguments: args,\n options,\n commands,\n };\n}\n\nfunction formatUsage(summary: UsageSummary): string {\n const lines: string[] = [];\n if (summary.heading) lines.push(summary.heading, \"\");\n lines.push(`USAGE ${summary.synopsis}`);\n\n if (summary.arguments.length > 0) {\n lines.push(\"\", \"ARGUMENTS\", \"\");\n for (const argument of summary.arguments) {\n lines.push(\n ` ${argument.name}${argument.variadic ? \"...\" : \"\"} ${details(argument.description, argument.required, argument.defaultValue, argument.choices)}`.trimEnd(),\n );\n }\n }\n\n if (summary.options.length > 0) {\n lines.push(\"\", \"OPTIONS\", \"\");\n for (const option of summary.options) {\n const flags = option.flags.map((flag) => {\n if (!flag.startsWith(\"--\")) return flag;\n if (option.takesValue) return `${flag}=<${option.valueName}>`;\n if (option.negatable) return `--[no-]${flag.slice(2)}`;\n return flag;\n });\n lines.push(\n ` ${flags.join(\", \")} ${details(option.description, option.required, option.defaultValue, option.choices, option.env)}`.trimEnd(),\n );\n }\n }\n\n if (summary.commands.length > 0) {\n lines.push(\"\", \"COMMANDS\", \"\");\n for (const command of summary.commands) {\n lines.push(` ${command.name} ${command.description ?? \"\"}`.trimEnd());\n }\n }\n return lines.join(\"\\n\");\n}\n\nexport type UsageWriter = (text: string) => void | Promise<void>;\n\nexport interface ShowUsageOptions extends OutputOptions {\n write?: UsageWriter;\n printer?: Printer;\n stream?: PrintStream;\n}\n\nexport type UsageOutput = Required<Pick<ShowUsageOptions, \"write\">>;\n\nexport type ShowUsageCallback = (\n command: AnyCommandDef,\n output: UsageOutput,\n) => void | Promise<void>;\n\n/** Generate usage text without writing to stdout or stderr. */\nexport async function renderUsage(command: AnyCommandDef): Promise<string> {\n return formatUsage(summarizeUsage(command));\n}\n\n/** Generate and write usage text, awaiting asynchronous writers. */\nexport async function showUsage(\n command: AnyCommandDef,\n options: ShowUsageOptions = {},\n): Promise<void> {\n const usage = summarizeUsage(command);\n const text = formatUsage(usage);\n if (options.write) return options.write(text);\n const printer = options.printer ?? selectOutputPrinter(options);\n return printer.print({\n type: \"usage\",\n usage,\n text,\n stream: options.stream ?? \"stdout\",\n });\n}\n","import type { ArgsSchema } from \"./schema.ts\";\nimport type { AnyCommandDef, CommandDef } from \"./command.ts\";\nimport { assertUniqueEnvNames, commandEnvPath, registerCommandPath } from \"./environment.ts\";\nimport { HackshPromptError, summarizeError, HackshUsageError } from \"./errors.ts\";\nimport { createLogger } from \"./logger.ts\";\nimport {\n parseCommandArgs,\n tokenizedBefore,\n tokenizeCommandArgs,\n type TokenizedCommandArgs,\n} from \"./parser.ts\";\nimport {\n createJsonPrinter,\n createPrintQueue,\n resolveOutputMode,\n type Printer,\n type PrintQueue,\n type PrintStream,\n type TerminalInput,\n} from \"./printer.ts\";\nimport { selectOutputPrinter, type OutputOptions } from \"./output.ts\";\nimport { showUsage, summarizeUsage, type ShowUsageCallback } from \"./usage.ts\";\n\nexport type { OutputOptions } from \"./output.ts\";\n\ninterface CommandSegment {\n command: AnyCommandDef;\n rawArgs: string[];\n tokenized: TokenizedCommandArgs;\n}\n\ninterface ResolvedCommand extends CommandSegment {\n parents: CommandSegment[];\n segments: CommandSegment[];\n}\n\nfunction resolveCommand(root: AnyCommandDef, rawArgs: string[]): ResolvedCommand {\n let command = root;\n let remaining = rawArgs;\n const parents: ResolvedCommand[\"parents\"] = [];\n const segments: ResolvedCommand[\"segments\"] = [];\n\n for (;;) {\n const tokenized = tokenizeCommandArgs(command, remaining);\n const index = command.subCommands\n ? tokenized.tokens.find((token) => token.kind === \"positional\")?.index\n : undefined;\n if (index === undefined) {\n const segment = { command, rawArgs: remaining, tokenized };\n segments.push(segment);\n assertUniqueEnvNames(\n segments.map(({ command }) => ({ command, path: commandEnvPath(command) })),\n );\n return { ...segment, parents, segments };\n }\n const key = remaining[index]!;\n const child = command.subCommands?.[key];\n if (!child) throw new HackshUsageError(`Unknown command \\`${key}\\``, command);\n const prefix = remaining.slice(0, index);\n const segment = { command, rawArgs: prefix, tokenized: tokenizedBefore(tokenized, index) };\n parents.push(segment);\n segments.push(segment);\n const parentPath = commandEnvPath(command);\n command = { ...child, name: child.name ?? key };\n registerCommandPath(command, parentPath === undefined ? undefined : [...parentPath, key]);\n remaining = remaining.slice(index + 1);\n }\n}\n\nasync function executeCommand<S extends ArgsSchema>(\n root: CommandDef<S>,\n argv: string[],\n displayUsage: ShowUsageCallback,\n printer: Printer,\n loggerOptions: Parameters<typeof createLogger>[2],\n env: Readonly<Record<string, string | undefined>>,\n): Promise<unknown> {\n const resolved = resolveCommand(root, argv);\n if (resolved.segments[0]?.tokenized.version) {\n await printer.print({ type: \"version\", version: root.version ?? \"\" });\n return undefined;\n }\n if (resolved.segments.some(({ tokenized }) => tokenized.help)) {\n await printUsage(displayUsage, resolved.command, printer, \"stdout\");\n return undefined;\n }\n\n for (const parent of resolved.parents) {\n await parseCommandArgs(\n parent.command,\n parent.rawArgs,\n parent.tokenized,\n env,\n commandEnvPath(parent.command),\n );\n }\n const parsed = await parseCommandArgs(\n resolved.command,\n resolved.rawArgs,\n resolved.tokenized,\n env,\n commandEnvPath(resolved.command),\n );\n if (!resolved.command.run) {\n throw new HackshUsageError(\"No command specified\", resolved.command);\n }\n const category = resolved.segments.flatMap(({ command }) =>\n command.name === undefined ? [] : [command.name],\n );\n return resolved.command.run({\n ...parsed,\n cmd: resolved.command,\n rawArgs: resolved.rawArgs,\n logger: createLogger(printer, category, loggerOptions),\n });\n}\n\nfunction printUsage(\n displayUsage: ShowUsageCallback,\n command: AnyCommandDef,\n printer: Printer,\n stream: PrintStream,\n): void | Promise<void> {\n return displayUsage(command, {\n write: (text) => printer.print({ type: \"usage\", usage: summarizeUsage(command), text, stream }),\n });\n}\n\nexport interface RunCommandOptions extends OutputOptions {\n printer?: Printer;\n showUsage?: ShowUsageCallback;\n}\n\ninterface PreparedOutput extends PrintQueue {\n interactive: boolean;\n input: TerminalInput;\n}\n\nfunction prepareOutput(\n options: RunCommandOptions,\n env: Readonly<Record<string, string | undefined>>,\n): PreparedOutput {\n const input = options.stdin ?? process.stdin;\n const mode = resolveOutputMode({\n output: options.output,\n env,\n inputIsTTY: input.isTTY,\n outputIsTTY: (options.stdout ?? process.stdout).isTTY,\n });\n return {\n ...createPrintQueue(selectOutputPrinter(options, options.printer, mode)),\n interactive: mode.interactive,\n input,\n };\n}\n\nexport async function runCommand<S extends ArgsSchema>(\n root: CommandDef<S>,\n argv: string[],\n options: RunCommandOptions = {},\n): Promise<unknown> {\n const env = options.env ?? process.env;\n const output = prepareOutput(options, env);\n try {\n return await executeCommand(\n root,\n argv,\n options.showUsage ?? showUsage,\n output.printer,\n {\n interactive: output.interactive,\n input: output.input,\n printPrompt: (event) => output.printChecked(event),\n },\n env,\n );\n } finally {\n await output.drain();\n }\n}\n\nexport interface RunMainOptions extends OutputOptions {\n onError?: (error: unknown) => void | Promise<void>;\n argv?: string[];\n printer?: Printer;\n showUsage?: ShowUsageCallback;\n}\n\nasync function drainAndExit(output: PrintQueue, code = 1): Promise<never> {\n try {\n await output.drain();\n } finally {\n process.exit(code);\n }\n}\n\nfunction commandErrorExitCode(error: unknown): number {\n return error instanceof HackshPromptError && error.reason === \"cancelled\" ? 130 : 1;\n}\n\nasync function reportOutputSetupError(error: unknown, options: RunMainOptions): Promise<never> {\n if (options.onError) {\n await options.onError(error);\n return drainAndExit(createPrintQueue(options.printer ?? { print: () => undefined }));\n }\n\n const output = createPrintQueue(\n options.printer ??\n createJsonPrinter({\n stdout: options.stdout ?? process.stdout,\n stderr: options.stderr ?? process.stderr,\n }),\n );\n await output.printer.print({ type: \"error\", error: summarizeError(error) });\n return drainAndExit(output);\n}\n\nexport async function runMain<S extends ArgsSchema>(\n command: CommandDef<S>,\n options: RunMainOptions = {},\n): Promise<void> {\n const displayUsage = options.showUsage ?? showUsage;\n const env = options.env ?? process.env;\n let output: PreparedOutput;\n try {\n output = prepareOutput(options, env);\n } catch (error) {\n return reportOutputSetupError(error, options);\n }\n try {\n await executeCommand(\n command,\n options.argv ?? process.argv.slice(2),\n displayUsage,\n output.printer,\n {\n interactive: output.interactive,\n input: output.input,\n printPrompt: (event) => output.printChecked(event),\n },\n env,\n );\n } catch (error) {\n if (options.onError) {\n await options.onError(error);\n return drainAndExit(output, commandErrorExitCode(error));\n }\n try {\n if (error instanceof HackshUsageError) {\n await output.printer.print({ type: \"error\", error: summarizeError(error) });\n await printUsage(displayUsage, error.command, output.printer, \"stderr\");\n } else {\n await output.printer.print({\n type: \"error\",\n error: summarizeError(error),\n });\n }\n } finally {\n await drainAndExit(output, commandErrorExitCode(error));\n }\n }\n await output.drain();\n}\n\nexport function createMain<S extends ArgsSchema>(\n command: CommandDef<S>,\n options: RunMainOptions = {},\n): (argv?: string[]) => Promise<void> {\n return (argv) => runMain(command, argv === undefined ? options : { ...options, argv });\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hacksh",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "description": "Type-safe command-line interfaces powered by Zod 4 schemas.",
5
5
  "keywords": [
6
6
  "cli",