hacksh 0.11.0 → 0.12.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
@@ -1,7 +1,8 @@
1
1
  # hacksh
2
2
 
3
3
  Define a type-safe command-line interface with a Zod 4 object schema. The same schema parses and
4
- validates arguments, infers the value passed to `run`, and generates help.
4
+ validates arguments, infers the value passed to `run`, and generates help. Run external commands
5
+ with the context’s `exec`, and use its `logger` for progress and interactive prompts.
5
6
 
6
7
  The name comes from 拍手 (_hakushu_), the Japanese word for "clap", as a nod to
7
8
  [clap](https://github.com/clap-rs/clap), the command-line argument parser for Rust. It is spelled
@@ -30,21 +31,22 @@ import { z } from "zod";
30
31
  import { defineCommand, runMain } from "hacksh";
31
32
 
32
33
  const main = defineCommand({
33
- name: "gh-pr-commits",
34
+ name: "git-summary",
34
35
  version: "0.1.0",
35
- description: "List commits in a GitHub pull request",
36
+ description: "Show a commit summary",
36
37
  args: z.object({
37
- _: z.tuple([
38
- z.coerce.number().int().optional().describe("Pull request number").meta({ title: "PR" }),
39
- ]),
40
- repo: z.string().optional().describe("Repository in OWNER/REPO format"),
41
- verbose: z.boolean().default(false).describe("Show details"),
38
+ _: z.tuple([z.string().default("HEAD").describe("Commit to inspect").meta({ title: "REF" })]),
39
+ repo: z.string().optional().describe("Repository directory"),
42
40
  }),
43
- argOptions: { repo: { alias: "R" }, verbose: { alias: ["v", "V"] } },
44
- async run({ args, rawArgs, extraArgs, passthrough, logger }) {
45
- // args is { _: [number?]; repo?: string; verbose: boolean }
46
- logger.info("Loading commits for {repo}", { repo: args.repo ?? "the current repository" });
47
- logger.debug("Invocation arguments", { rawArgs, extraArgs, passthrough });
41
+ argOptions: { repo: { alias: "C" } },
42
+ async run({ args, exec }) {
43
+ const [ref] = args._;
44
+ const { stdout } = await exec(
45
+ "git",
46
+ ["show", "--no-patch", "--format=%h %s", "--end-of-options", ref],
47
+ { cwd: args.repo },
48
+ );
49
+ console.log(stdout);
48
50
  },
49
51
  });
50
52
 
@@ -52,11 +54,22 @@ await runMain(main);
52
54
  ```
53
55
 
54
56
  ```sh
55
- gh-pr-commits 42 -R owner/repo --verbose
56
- gh-pr-commits --help
57
- gh-pr-commits --version
57
+ git-summary
58
+ git-summary HEAD~1 -C ./my-repo
59
+ git-summary --help
60
+ git-summary --version
58
61
  ```
59
62
 
63
+ Use an `async run` handler and its `exec` for external commands. It captures output, removes one
64
+ final newline, throws on failure, and observes invocation cancellation. Pass arguments as an array;
65
+ there is no command string to quote or split. You do not need a `node:child_process` import or a
66
+ custom process wrapper for these behaviors. See [External commands](#external-commands) for expected
67
+ nonzero exits, stdin, and terminal access.
68
+
69
+ `console.log` above writes the command’s data to stdout. Direct stdout writes are not converted
70
+ to JSON by hacksh’s output mode. Logger events go through the printer; their stream depends on
71
+ the level, so informational logs also share stdout by default.
72
+
60
73
  `--version` is a root-only builtin. It prints the root command's `version`. When the root has
61
74
  none, `runMain` resolves the executable (`process.argv[1]`) through symlinks and prints the
62
75
  `version` of the nearest ancestor `package.json` that declares one, so a published CLI reports its
@@ -67,8 +80,8 @@ are accepted (`--dryRun` and `--dry-run`). Every boolean flag also accepts a `--
67
80
  that sets it to `false`, such as `--no-verbose`, which is how a default-on flag is disabled.
68
81
  Boolean flags also accept the explicit forms `--verbose=true` and
69
82
  `--verbose=false`; other inline values and values on a negated flag (such as
70
- `--no-verbose=false`) are validation errors. Value options accept `--repo owner/repo` and
71
- `--repo=owner/repo`; values such as `false` remain strings for non-boolean fields.
83
+ `--no-verbose=false`) are validation errors. Value options accept `--repo ./my-repo` and
84
+ `--repo=./my-repo`; values such as `false` remain strings for non-boolean fields.
72
85
 
73
86
  ## Positional arguments
74
87
 
@@ -98,8 +111,58 @@ copy out a.txt b.txt # { _: ["out", "a.txt", "b.txt"] }
98
111
  Help and validation errors label each item with its `.meta({ title })`, such as `<DESTINATION>` and
99
112
  `[FILES...]`. Untitled items are labeled by position (`ARG1`, `ARG2`, ...) and an untitled rest is
100
113
  labeled `ARGS`. Use `z.array` instead of a tuple to accept only variadic values. Without a rest,
101
- additional positional arguments are kept in `extraArgs`. Unknown options are also kept in
102
- `extraArgs`; arguments after `--` are kept in `passthrough`.
114
+ additional positional arguments are rejected by default, as are unknown options.
115
+
116
+ ### Unknown arguments and forwarding
117
+
118
+ A command rejects unknown options and excess positional arguments before its `run` handler or
119
+ schema transforms execute. For ordinary commands, declare the accepted arguments in `args`;
120
+ there is no need to inspect `extraArgs` manually. Errors are `HackshValidationError` instances,
121
+ with each rejected token in `issues[].arg`.
122
+
123
+ Everything after `--` is always collected unchanged in `passthrough`, independently of this policy.
124
+ Use that explicit boundary when forwarding arguments to another executable:
125
+
126
+ ```ts
127
+ const forward = defineCommand({
128
+ name: "git-forward",
129
+ async run({ exec, passthrough }) {
130
+ const { stdout } = await exec("git", passthrough);
131
+ console.log(stdout);
132
+ },
133
+ });
134
+ // git-forward -- status --short
135
+ ```
136
+
137
+ For a wrapper that also accepts undeclared arguments before `--`, set `allowUnknownArgs: true`:
138
+
139
+ ```ts
140
+ const wrapper = defineCommand({
141
+ allowUnknownArgs: true,
142
+ async run({ extraArgs, passthrough, exec }) {
143
+ await exec("some-tool", [...extraArgs, ...passthrough]);
144
+ },
145
+ });
146
+ ```
147
+
148
+ `extraArgs` preserves the order of unknown option tokens and excess positional values. Unknown
149
+ options do not consume a following value: if the schema has an unfilled positional slot, that
150
+ value fills it. Known options are still parsed and validated. Use `--` when a child's arguments
151
+ must not be interpreted by this command. A handler that does not use `passthrough` ignores those
152
+ arguments; commands that require rejecting them can check `passthrough.length` explicitly.
153
+
154
+ `allowUnknownArgs` defaults to `false`, inherits down the selected subcommand route, and can be
155
+ overridden by each child. A child's setting does not change validation of its parent's arguments.
156
+ Definitions are not mutated, so reusing a child under another root does not retain inherited settings.
157
+ Standalone `parseArgs` uses the supplied command's setting and does not resolve a parent route.
158
+
159
+ Once routing succeeds, help and root version output take precedence over argument validation,
160
+ including unknown arguments. Routing errors such as an unknown subcommand still fail. A child's
161
+ undeclared `--version` is an unknown argument, since the version builtin belongs to the root.
162
+
163
+ **Migrating from 0.11.0:** unknown input was previously accepted by default. Add
164
+ `allowUnknownArgs: true` to commands that intentionally use `extraArgs`, or to their shared parent.
165
+ No migration is needed for `--` forwarding.
103
166
 
104
167
  ## Argument options
105
168
 
@@ -325,21 +388,27 @@ positive `columns` value, the renderer conservatively counts explicit lines only
325
388
  Every `run` context has an `exec` function that starts an executable with an argument array. It
326
389
  never uses a shell, so spaces, quotes, `$`, `;`, `|`, and `*` in arguments reach the child
327
390
  unchanged. By default it resolves with the captured output and rejects with `HackshExecError`
328
- when the command fails. Pass `reject: false` to receive failures as results instead.
391
+ when the command fails. Pass `reject: false` to receive failures as results instead. Prefer this
392
+ context API to `spawnSync` or a custom subprocess wrapper inside a command handler so execution
393
+ uses the invocation’s environment, cancellation, and printer.
329
394
 
330
395
  ```ts
331
- const sync = defineCommand({
332
- name: "sync",
396
+ const check = defineCommand({
397
+ name: "check-head",
333
398
  async run({ exec, logger }) {
334
- const { stdout: branch } = await exec("git", ["branch", "--show-current"]);
335
- const upstream = await exec("git", ["rev-parse", "--abbrev-ref", "@{upstream}"], {
399
+ const head = await exec("git", ["rev-parse", "--verify", "--quiet", "HEAD^{commit}"], {
336
400
  reject: false,
337
401
  });
338
- if (upstream.status === "failed") {
339
- logger.warn("{branch} has no upstream", { branch });
340
- return;
402
+ if (head.status === "failed") {
403
+ // Only this specific exit means that the revision was not found.
404
+ if (head.reason === "exit-code" && head.exitCode === 1) {
405
+ logger.warn("The repository has no HEAD commit");
406
+ return;
407
+ }
408
+ // Missing executables, cancellation, and other failures must still fail the command.
409
+ throw new Error("Could not inspect HEAD", { cause: head });
341
410
  }
342
- await exec("git", ["pull", "--ff-only"], { cwd: "/path/to/repo", timeout: 60_000 });
411
+ logger.info("HEAD is {commit}", { commit: head.stdout });
343
412
  },
344
413
  });
345
414
  ```
@@ -352,6 +421,20 @@ UTF-8 `stdout` and `stderr` with one final newline removed. A failure's `reason`
352
421
  gives `ExecSuccess`, while `false` or a `boolean` variable gives `ExecResult`, which must be
353
422
  narrowed before reading `exitCode`.
354
423
 
424
+ ### Working with captured output
425
+
426
+ Use `stdout` directly for a single value such as a commit ID or repository path. Do not call
427
+ `.trim()` on paths: surrounding whitespace can be part of the name. `exec` already removes one
428
+ final LF or CRLF; it preserves other whitespace and NUL separators.
429
+
430
+ Interpret structured output according to the child command’s format. If it offers JSON, request
431
+ that format and parse it with `JSON.parse` (and a Zod schema when validation is needed). For Git’s
432
+ `--porcelain -z` output, keep the NUL delimiters and parse the records in a named, application-specific
433
+ helper. Splitting that format on newlines would break paths containing newlines. hacksh does not
434
+ parse Git records or infer whether stdout is text, JSON, or a list.
435
+
436
+ ### Execution options
437
+
355
438
  Options are `cwd`, `env`, `input`, `reject`, `timeout` (milliseconds), `signal` (an
356
439
  `AbortSignal`), `maxBuffer` (bytes per stream, default 100,000,000), and `forceKillAfterDelay`
357
440
  (milliseconds, default 5,000). Every call also stops with `aborted` when the invocation's `signal`
package/dist/index.d.ts CHANGED
@@ -379,6 +379,8 @@ interface CommandDef<S extends ArgsSchema = EmptyArgs> {
379
379
  version?: string;
380
380
  description?: string;
381
381
  hidden?: boolean;
382
+ /** Keep unknown options and excess positionals in extraArgs. Inherits from the parent; defaults to false. */
383
+ allowUnknownArgs?: boolean;
382
384
  args?: S;
383
385
  argOptions?: ArgOptionsMap<S>;
384
386
  subCommands?: Record<string, CommandDef<ArgsSchema>>;
package/dist/index.js CHANGED
@@ -108,6 +108,7 @@ function schemaShape(schema) {
108
108
  //#endregion
109
109
  //#region src/command.ts
110
110
  function defineCommand(def) {
111
+ if (def.allowUnknownArgs !== void 0 && typeof def.allowUnknownArgs !== "boolean") throw new TypeError("allowUnknownArgs must be a boolean");
111
112
  const shape = def.args ? schemaShape(def.args) : {};
112
113
  const positionals = readPositionals(shape);
113
114
  if (positionals) {
@@ -611,6 +612,10 @@ async function parseCommandArgs(command, rawArgs, tokenized = tokenizeCommandArg
611
612
  else if (token.kind === "unknown-option") extraArgs.push(token.value);
612
613
  else if (positionals && (positionals.rest || positionalValues.length < positionals.items.length)) positionalValues.push(token.value);
613
614
  else extraArgs.push(token.value);
615
+ if (!command.allowUnknownArgs && extraArgs.length > 0) throw new HackshValidationError(command, extraArgs.map((arg) => ({
616
+ arg,
617
+ message: "unexpected argument"
618
+ })));
614
619
  const envSources = /* @__PURE__ */ new Map();
615
620
  if (env && command.args) {
616
621
  const shape = schemaShape(command.args);
@@ -2067,7 +2072,8 @@ function resolveCommand(root, rawArgs) {
2067
2072
  const parentPath = commandEnvPath(command);
2068
2073
  command = {
2069
2074
  ...child,
2070
- name: child.name ?? key
2075
+ name: child.name ?? key,
2076
+ allowUnknownArgs: child.allowUnknownArgs ?? command.allowUnknownArgs
2071
2077
  };
2072
2078
  registerCommandPath(command, parentPath === void 0 ? void 0 : [...parentPath, key]);
2073
2079
  remaining = remaining.slice(index + 1);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["#result","safeString","parseNodeArgs","#owner","details","#interactive","#inputValue","#printEvent","#bufferedKeys","#terminal","#signal","#print","#run"],"sources":["../src/options.ts","../src/schema.ts","../src/command.ts","../src/errors.ts","../src/environment.ts","../src/parser.ts","../src/terminal.ts","../src/exec.ts","../src/serialization.ts","../src/printer.ts","../src/pretty.ts","../src/prompts.ts","../src/logger.ts","../src/package-version.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 { Exec } from \"./exec.ts\";\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 exec: Exec;\n signal: AbortSignal;\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 === \"help\") throw new TypeError(\"Option `help` conflicts with the builtin --help\");\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\";\nimport type { ExecFailure } from \"./exec.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 | \"aborted\"\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\n/** An external command that did not succeed; `result` is not enumerable so error summaries omit child output. */\nexport class HackshExecError extends Error {\n readonly #result: ExecFailure;\n\n constructor(message: string, result: ExecFailure, options?: ErrorOptions) {\n super(message, options);\n this.name = \"HackshExecError\";\n this.#result = result;\n }\n\n get result(): ExecFailure {\n return this.#result;\n }\n}\n\n/** A requested process exit status; `runMain` exits with it and reports only a non-empty message. */\nexport class HackshExitError extends Error {\n readonly exitCode: number;\n\n constructor(exitCode: number, message?: string, options?: ErrorOptions) {\n if (!Number.isInteger(exitCode) || exitCode < 0 || exitCode > 255) {\n throw new TypeError(\"Exit code must be an integer from 0 to 255\");\n }\n super(message, options);\n this.name = \"HackshExitError\";\n this.exitCode = exitCode;\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","export type TerminalOwner = \"prompt\" | \"exec\";\n\nexport class TerminalLock {\n #owner: TerminalOwner | undefined;\n\n get owner(): TerminalOwner | undefined {\n return this.#owner;\n }\n\n acquire(owner: TerminalOwner): boolean {\n if (this.#owner !== undefined) return false;\n this.#owner = owner;\n return true;\n }\n\n release(): void {\n this.#owner = undefined;\n }\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport type { Readable } from \"node:stream\";\nimport { HackshExecError } from \"./errors.ts\";\nimport type { ExecPrintEvent, OutputFormat } from \"./printer.ts\";\nimport { TerminalLock } from \"./terminal.ts\";\n\ntype Environment = Readonly<Record<string, string | undefined>>;\n\nexport interface ExecOptions {\n cwd?: string;\n env?: Environment;\n input?: string;\n reject?: boolean;\n timeout?: number;\n signal?: AbortSignal;\n maxBuffer?: number;\n forceKillAfterDelay?: number;\n stdin?: \"pipe\" | \"inherit\";\n stdout?: \"pipe\" | \"inherit\";\n stderr?: \"pipe\" | \"inherit\";\n interactive?: boolean;\n display?: boolean;\n redact?: readonly string[];\n}\n\nexport interface ExecCommand {\n file: string;\n args: readonly string[];\n cwd: string | undefined;\n}\n\nexport interface ExecSuccess {\n status: \"succeeded\";\n command: ExecCommand;\n stdout: string;\n stderr: string;\n exitCode: 0;\n}\n\nexport type ExecFailure = {\n status: \"failed\";\n command: ExecCommand;\n stdout: string;\n stderr: string;\n} & (\n | { reason: \"exit-code\"; exitCode: number }\n | { reason: \"signal\"; signal: string }\n | { reason: \"spawn\"; error: Error }\n | { reason: \"timeout\" | \"aborted\" | \"output-limit\" }\n | { reason: \"json-output\" | \"non-interactive\" | \"overlapping\" }\n);\n\nexport type ExecFailureReason = ExecFailure[\"reason\"];\n\nexport type ExecResult = ExecSuccess | ExecFailure;\n\nexport type ExecReturn<O extends ExecOptions> = \"reject\" extends keyof O\n ? false extends O[\"reject\"]\n ? ExecResult\n : ExecSuccess\n : ExecSuccess;\n\ntype RejectInheritedInput<O> = O extends { input: string; stdin: \"inherit\" } ? never : unknown;\n\nexport type Exec = <const O extends ExecOptions = {}>(\n file: string,\n args?: readonly string[],\n options?: O & { [K in Exclude<keyof O, keyof ExecOptions>]: never } & RejectInheritedInput<O>,\n) => Promise<ExecReturn<O>>;\n\nexport interface ExecContext {\n env: Environment | undefined;\n mode: { format: OutputFormat; interactive: boolean };\n print(event: ExecPrintEvent): void | Promise<void>;\n terminal: TerminalLock;\n signal: AbortSignal;\n}\n\nconst OPTION_KEYS: ReadonlySet<string> = new Set([\n \"cwd\",\n \"env\",\n \"input\",\n \"reject\",\n \"timeout\",\n \"signal\",\n \"maxBuffer\",\n \"forceKillAfterDelay\",\n \"stdin\",\n \"stdout\",\n \"stderr\",\n \"interactive\",\n \"display\",\n \"redact\",\n] satisfies (keyof ExecOptions)[]);\n\ntype TerminationCause = \"timeout\" | \"aborted\" | \"output-limit\";\ntype StreamMode = \"pipe\" | \"inherit\";\ntype ExecStdio = ExecPrintEvent[\"stdio\"];\ntype RefusalReason = \"aborted\" | \"json-output\" | \"non-interactive\" | \"overlapping\";\n\ninterface SpawnError extends NodeJS.ErrnoException {\n spawnargs?: readonly string[];\n}\n\ninterface ExecPlan {\n command: ExecCommand;\n reported: ExecCommand;\n env: NodeJS.ProcessEnv | undefined;\n input: string | undefined;\n reject: boolean;\n timeout: number | undefined;\n signal: AbortSignal;\n maxBuffer: number;\n forceKillAfterDelay: number;\n stdin: StreamMode;\n stdout: StreamMode;\n stderr: StreamMode;\n interactive: boolean;\n display: boolean;\n redact: readonly string[];\n}\n\ninterface Outcome {\n cause: TerminationCause | undefined;\n spawnError: Error | undefined;\n exit: { code: number | null; signal: string | null } | undefined;\n}\n\nconst MAX_DELAY = 2_147_483_647;\nconst REFUSAL_MESSAGE = {\n \"json-output\": \"Command cannot use the terminal in JSON output mode\",\n \"non-interactive\": \"Command requires an interactive terminal\",\n overlapping: \"Command cannot use the terminal while it is in use\",\n} as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction assertNoNul(value: string, label: string): void {\n if (value.includes(\"\\0\")) throw new TypeError(`${label} must not contain NUL characters`);\n}\n\nfunction readInteger(value: unknown, label: string, minimum: number, maximum: number): number {\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < minimum || value > maximum) {\n throw new TypeError(`${label} must be an integer from ${minimum} to ${maximum}`);\n }\n return value;\n}\n\nfunction readEnum<const T extends string>(value: unknown, label: string, allowed: readonly T[]): T {\n if (typeof value === \"string\" && (allowed as readonly string[]).includes(value))\n return value as T;\n throw new TypeError(\n `Exec option \\`${label}\\` must be ${allowed.map((item) => JSON.stringify(item)).join(\" or \")}`,\n );\n}\n\nfunction readBoolean(value: unknown, label: string): boolean {\n if (typeof value !== \"boolean\") throw new TypeError(`Exec option \\`${label}\\` must be a boolean`);\n return value;\n}\n\nfunction readRedact(value: unknown): readonly string[] {\n if (!Array.isArray(value)) throw new TypeError(\"Exec option `redact` must be an array\");\n for (const item of value) {\n if (typeof item !== \"string\" || item === \"\") {\n throw new TypeError(\"Exec option `redact` must contain only non-empty strings\");\n }\n assertNoNul(item, \"Exec option `redact`\");\n }\n return value as readonly string[];\n}\n\nfunction mergeEnvironment(\n base: Environment | undefined,\n overrides: unknown,\n): NodeJS.ProcessEnv | undefined {\n if (overrides === undefined && base === undefined) return undefined;\n if (overrides !== undefined && !isRecord(overrides)) {\n throw new TypeError(\"Exec option `env` must be an object\");\n }\n const merged: NodeJS.ProcessEnv = {};\n for (const [key, value] of Object.entries(base ?? process.env)) {\n if (value !== undefined) merged[key] = value;\n }\n for (const [key, value] of Object.entries(overrides ?? {})) {\n if (key === \"\" || key.includes(\"=\") || key.includes(\"\\0\")) {\n throw new TypeError(`Invalid environment variable name ${JSON.stringify(key)}`);\n }\n if (value === undefined) {\n delete merged[key];\n continue;\n }\n if (typeof value !== \"string\") {\n throw new TypeError(`Environment variable ${key} must be a string or undefined`);\n }\n assertNoNul(value, `Environment variable ${key}`);\n merged[key] = value;\n }\n return merged;\n}\n\nfunction redactValue(value: string, secrets: readonly string[]): string {\n let redacted = value;\n for (const secret of [...secrets].sort((left, right) => right.length - left.length)) {\n redacted = redacted.split(secret).join(\"***\");\n }\n return redacted;\n}\n\nfunction redactCommand(command: ExecCommand, secrets: readonly string[]): ExecCommand {\n if (secrets.length === 0) return command;\n return {\n file: redactValue(command.file, secrets),\n args: command.args.map((arg) => redactValue(arg, secrets)),\n cwd: command.cwd === undefined ? undefined : redactValue(command.cwd, secrets),\n };\n}\n\nfunction redactError(error: Error, secrets: readonly string[]): Error {\n const source = error as SpawnError;\n const redacted = new Error(redactValue(error.message, secrets)) as SpawnError;\n if (typeof error.stack === \"string\") redacted.stack = redactValue(error.stack, secrets);\n if (source.code !== undefined) redacted.code = source.code;\n if (source.errno !== undefined) redacted.errno = source.errno;\n if (typeof source.syscall === \"string\") redacted.syscall = redactValue(source.syscall, secrets);\n if (typeof source.path === \"string\") redacted.path = redactValue(source.path, secrets);\n if (Array.isArray(source.spawnargs)) {\n redacted.spawnargs = source.spawnargs.map((arg) =>\n typeof arg === \"string\" ? redactValue(arg, secrets) : arg,\n );\n }\n return redacted;\n}\n\nfunction observedError(plan: ExecPlan, error: Error): Error {\n return plan.redact.length === 0 ? error : redactError(error, plan.redact);\n}\n\nfunction parsePlan(file: unknown, args: unknown, options: unknown, context: ExecContext): ExecPlan {\n if (typeof file !== \"string\" || file === \"\") {\n throw new TypeError(\"Exec file must be a non-empty string\");\n }\n assertNoNul(file, \"Exec file\");\n const argv = args === undefined ? [] : args;\n if (!Array.isArray(argv) || !argv.every((arg) => typeof arg === \"string\")) {\n throw new TypeError(\"Exec args must be an array of strings\");\n }\n for (const arg of argv) assertNoNul(arg, \"Exec args\");\n const raw = options === undefined ? {} : options;\n if (!isRecord(raw)) throw new TypeError(\"Exec options must be an object\");\n for (const key of Object.keys(raw)) {\n if (!OPTION_KEYS.has(key)) throw new TypeError(`Unknown exec option \\`${key}\\``);\n }\n\n const { cwd, input, reject, timeout, signal, maxBuffer, forceKillAfterDelay } = raw;\n if (cwd !== undefined) {\n if (typeof cwd !== \"string\" || cwd === \"\") {\n throw new TypeError(\"Exec option `cwd` must be a non-empty string\");\n }\n assertNoNul(cwd, \"Exec option `cwd`\");\n }\n if (input !== undefined && typeof input !== \"string\") {\n throw new TypeError(\"Exec option `input` must be a string\");\n }\n if (reject !== undefined && typeof reject !== \"boolean\") {\n throw new TypeError(\"Exec option `reject` must be a boolean\");\n }\n if (signal !== undefined && !(signal instanceof AbortSignal)) {\n throw new TypeError(\"Exec option `signal` must be an AbortSignal\");\n }\n const stdin =\n raw.stdin === undefined ? \"pipe\" : readEnum(raw.stdin, \"stdin\", [\"pipe\", \"inherit\"]);\n const stdout =\n raw.stdout === undefined ? \"pipe\" : readEnum(raw.stdout, \"stdout\", [\"pipe\", \"inherit\"]);\n const stderr =\n raw.stderr === undefined ? \"pipe\" : readEnum(raw.stderr, \"stderr\", [\"pipe\", \"inherit\"]);\n if (input !== undefined && stdin === \"inherit\") {\n throw new TypeError(\"Exec option `input` cannot be combined with stdin inherit\");\n }\n const command = { file, args: [...argv], cwd };\n const redact = raw.redact === undefined ? [] : readRedact(raw.redact);\n return {\n command,\n reported: redactCommand(command, redact),\n env: mergeEnvironment(context.env, raw.env),\n input,\n reject: reject ?? true,\n timeout:\n timeout === undefined\n ? undefined\n : readInteger(timeout, \"Exec option `timeout`\", 1, MAX_DELAY),\n signal: signal === undefined ? context.signal : AbortSignal.any([context.signal, signal]),\n maxBuffer:\n maxBuffer === undefined\n ? 100_000_000\n : readInteger(maxBuffer, \"Exec option `maxBuffer`\", 1, Number.MAX_SAFE_INTEGER),\n forceKillAfterDelay:\n forceKillAfterDelay === undefined\n ? 5_000\n : readInteger(forceKillAfterDelay, \"Exec option `forceKillAfterDelay`\", 0, MAX_DELAY),\n stdin,\n stdout,\n stderr,\n interactive:\n raw.interactive === undefined ? false : readBoolean(raw.interactive, \"interactive\"),\n display: raw.display === undefined ? true : readBoolean(raw.display, \"display\"),\n redact,\n };\n}\n\nfunction stripFinalNewline(text: string): string {\n if (text.endsWith(\"\\r\\n\")) return text.slice(0, -2);\n if (text.endsWith(\"\\n\")) return text.slice(0, -1);\n return text;\n}\n\nfunction collect(stream: Readable, limit: number, onLimit: () => void): () => string {\n const chunks: Buffer[] = [];\n let length = 0;\n let exceeded = false;\n stream.on(\"data\", (chunk: Buffer) => {\n if (exceeded) return;\n const remaining = limit - length;\n if (chunk.length <= remaining) {\n chunks.push(chunk);\n length += chunk.length;\n return;\n }\n chunks.push(chunk.subarray(0, remaining));\n length = limit;\n exceeded = true;\n onLimit();\n });\n return () => stripFinalNewline(Buffer.concat(chunks).toString(\"utf8\"));\n}\n\nfunction toResult(\n command: ExecCommand,\n outcome: Outcome,\n stdout: string,\n stderr: string,\n): ExecResult {\n const failed = { status: \"failed\", command, stdout, stderr } as const;\n if (outcome.cause) return { ...failed, reason: outcome.cause };\n if (outcome.spawnError) return { ...failed, reason: \"spawn\", error: outcome.spawnError };\n const { code, signal } = outcome.exit ?? { code: null, signal: null };\n if (signal !== null) return { ...failed, reason: \"signal\", signal };\n if (code !== 0) return { ...failed, reason: \"exit-code\", exitCode: code ?? 1 };\n return { status: \"succeeded\", command, stdout, stderr, exitCode: 0 };\n}\n\nfunction isSpawnErrno(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"syscall\" in error;\n}\n\nfunction commandStdio(plan: ExecPlan): ExecStdio {\n return {\n stdin: plan.stdin === \"inherit\" ? \"inherit\" : plan.input === undefined ? \"ignore\" : \"input\",\n stdout: plan.stdout,\n stderr: plan.stderr,\n };\n}\n\nfunction usesTerminal(plan: ExecPlan, stdio: ExecStdio): boolean {\n return (\n plan.interactive ||\n stdio.stdin === \"inherit\" ||\n stdio.stdout === \"inherit\" ||\n stdio.stderr === \"inherit\"\n );\n}\n\nfunction startChild(plan: ExecPlan): ChildProcess | Error {\n const stdio = commandStdio(plan);\n try {\n return spawn(plan.command.file, plan.command.args, {\n cwd: plan.command.cwd,\n env: plan.env,\n shell: false,\n windowsHide: true,\n stdio: [\n stdio.stdin === \"inherit\" ? \"inherit\" : stdio.stdin === \"input\" ? \"pipe\" : \"ignore\",\n stdio.stdout,\n stdio.stderr,\n ],\n });\n } catch (error) {\n if (isSpawnErrno(error)) return error;\n throw error;\n }\n}\n\nfunction runPlan(plan: ExecPlan): Promise<ExecResult> {\n const outcome: Outcome = { cause: undefined, spawnError: undefined, exit: undefined };\n if (plan.signal.aborted) {\n outcome.cause = \"aborted\";\n return Promise.resolve(toResult(plan.reported, outcome, \"\", \"\"));\n }\n const child = startChild(plan);\n if (child instanceof Error) {\n outcome.spawnError = observedError(plan, child);\n return Promise.resolve(toResult(plan.reported, outcome, \"\", \"\"));\n }\n\n return new Promise((resolve) => {\n const stdout = child.stdout;\n const stderr = child.stderr;\n let settled = false;\n let killTimer: NodeJS.Timeout | undefined;\n\n const settle = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timeoutTimer);\n clearTimeout(killTimer);\n plan.signal.removeEventListener(\"abort\", onAbort);\n resolve(toResult(plan.reported, outcome, readStdout(), readStderr()));\n };\n const release = () => {\n stdout?.destroy();\n stderr?.destroy();\n settle();\n };\n const terminate = (cause: TerminationCause) => {\n if (settled || outcome.cause) return;\n outcome.cause = cause;\n if (outcome.exit) {\n release();\n return;\n }\n child.kill(\"SIGTERM\");\n killTimer = setTimeout(() => child.kill(\"SIGKILL\"), plan.forceKillAfterDelay);\n };\n const onAbort = () => terminate(\"aborted\");\n\n const readStdout = stdout\n ? collect(stdout, plan.maxBuffer, () => terminate(\"output-limit\"))\n : () => \"\";\n const readStderr = stderr\n ? collect(stderr, plan.maxBuffer, () => terminate(\"output-limit\"))\n : () => \"\";\n const timeoutTimer =\n plan.timeout === undefined ? undefined : setTimeout(() => terminate(\"timeout\"), plan.timeout);\n plan.signal.addEventListener(\"abort\", onAbort, { once: true });\n\n child.on(\"error\", (error) => {\n if (child.pid !== undefined) return;\n outcome.spawnError = observedError(plan, error);\n release();\n });\n child.on(\"exit\", (code, signal) => {\n outcome.exit = { code, signal };\n clearTimeout(killTimer);\n // A grandchild may keep the pipes open after hacksh terminates the direct child.\n if (outcome.cause) release();\n });\n child.on(\"close\", settle);\n\n if (child.stdin) {\n child.stdin.on(\"error\", () => undefined);\n child.stdin.end(plan.input);\n }\n });\n}\n\nfunction formatArgument(value: string): string {\n return value === \"\" || /[\\s\"'\\\\$`;|&<>*?()[\\]{}~#!]/.test(value) ? JSON.stringify(value) : value;\n}\n\nexport function formatExecCommand(command: Pick<ExecCommand, \"file\" | \"args\">): string {\n return [command.file, ...command.args].map(formatArgument).join(\" \");\n}\n\nfunction failureMessage(plan: ExecPlan, result: ExecFailure): string {\n const display = formatExecCommand(plan.reported);\n switch (result.reason) {\n case \"exit-code\":\n return `Command failed with exit code ${result.exitCode}: ${display}`;\n case \"signal\":\n return `Command was terminated by ${result.signal}: ${display}`;\n case \"spawn\": {\n const code = (result.error as NodeJS.ErrnoException).code;\n return `Command could not be started (${code ?? result.error.message}): ${display}`;\n }\n case \"timeout\":\n return `Command timed out after ${plan.timeout} ms: ${display}`;\n case \"aborted\":\n return `Command was aborted: ${display}`;\n case \"output-limit\":\n return `Command output exceeded ${plan.maxBuffer} bytes: ${display}`;\n case \"json-output\":\n case \"non-interactive\":\n case \"overlapping\":\n return `${REFUSAL_MESSAGE[result.reason]}: ${display}`;\n }\n}\n\nfunction emptyFailure(plan: ExecPlan, reason: RefusalReason): ExecFailure {\n return { status: \"failed\", command: plan.reported, stdout: \"\", stderr: \"\", reason };\n}\n\nfunction complete(plan: ExecPlan, result: ExecResult): ExecResult {\n if (result.status === \"failed\" && plan.reject) {\n throw new HackshExecError(\n failureMessage(plan, result),\n result,\n result.reason === \"spawn\" ? { cause: result.error } : undefined,\n );\n }\n return result;\n}\n\nfunction blockedReason(\n plan: ExecPlan,\n context: ExecContext,\n stdio: ExecStdio,\n): \"json-output\" | \"non-interactive\" | undefined {\n const inherited =\n stdio.stdin === \"inherit\" || stdio.stdout === \"inherit\" || stdio.stderr === \"inherit\";\n if (context.mode.format === \"json\" && inherited) return \"json-output\";\n if (plan.interactive && !context.mode.interactive) return \"non-interactive\";\n return undefined;\n}\n\nasync function execute(\n file: unknown,\n args: unknown,\n options: unknown,\n context: ExecContext,\n): Promise<ExecResult> {\n const plan = parsePlan(file, args, options, context);\n if (plan.signal.aborted) return complete(plan, emptyFailure(plan, \"aborted\"));\n\n const stdio = commandStdio(plan);\n const blocked = blockedReason(plan, context, stdio);\n if (blocked) return complete(plan, emptyFailure(plan, blocked));\n\n const holdTerminal = usesTerminal(plan, stdio);\n if (holdTerminal && !context.terminal.acquire(\"exec\")) {\n return complete(plan, emptyFailure(plan, \"overlapping\"));\n }\n try {\n if (plan.display) {\n const { file, args, cwd } = plan.reported;\n await context.print({\n type: \"exec\",\n phase: \"start\",\n command: cwd === undefined ? { file, args } : { file, args, cwd },\n stdio,\n interactive: plan.interactive,\n });\n }\n return complete(plan, await runPlan(plan));\n } finally {\n if (holdTerminal) context.terminal.release();\n }\n}\n\nexport function createExec(context: ExecContext): Exec {\n return ((file, args, options) => execute(file, args, options, context)) as Exec;\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 { formatExecCommand, type ExecCommand } from \"./exec.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\nexport interface ExecPrintEvent {\n type: \"exec\";\n phase: \"start\";\n command: Omit<ExecCommand, \"cwd\"> & { cwd?: string };\n stdio: {\n stdin: \"ignore\" | \"input\" | \"inherit\";\n stdout: \"pipe\" | \"inherit\";\n stderr: \"pipe\" | \"inherit\";\n };\n interactive: boolean;\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 | ExecPrintEvent;\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\" || event.type === \"exec\") 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 case \"exec\":\n return `$ ${formatExecCommand(event.command)}`;\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 { formatExecCommand } from \"./exec.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 =\n | LogLevel\n | \"step\"\n | \"success\"\n | \"usage\"\n | \"version\"\n | \"errorEvent\"\n | \"prompt\"\n | \"exec\";\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 exec: \"$\",\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 exec: \"$\",\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 exec: \"gray\",\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 if (event.type === \"exec\") return \"exec\";\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 case \"exec\": {\n const lines = [formatExecCommand(event.command)];\n if (event.command.cwd !== undefined) lines.push(...propertyLines({ cwd: event.command.cwd }));\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\";\nimport { TerminalLock } from \"./terminal.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 terminal: TerminalLock;\n signal: AbortSignal;\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 readonly #terminal: TerminalLock;\n readonly #signal: AbortSignal;\n\n constructor(options: PromptControllerOptions) {\n this.#interactive = options.interactive;\n this.#inputValue = options.input;\n this.#printEvent = (event) => options.print(event);\n this.#terminal = options.terminal;\n this.#signal = options.signal;\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.#signal.aborted) {\n throw promptError(\"aborted\", prompt, \"Prompt aborted\", this.#signal.reason);\n }\n const input = asInput(this.#inputValue, prompt);\n if (!this.#terminal.acquire(\"prompt\")) {\n throw promptError(\n \"overlapping\",\n prompt,\n this.#terminal.owner === \"exec\"\n ? \"A command is using the terminal\"\n : \"Another prompt is already active\",\n );\n }\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 onAbort = (): void => fail(\"aborted\", \"Prompt aborted\", this.#signal.reason);\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 this.#signal.removeEventListener(\"abort\", onAbort);\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 this.#signal.addEventListener(\"abort\", onAbort, { once: true });\n if (this.#signal.aborted) onAbort();\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.#terminal.release();\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.#terminal.release();\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\";\nimport type { TerminalLock } from \"./terminal.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 terminal: TerminalLock;\n signal: AbortSignal;\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 terminal: options.terminal,\n signal: options.signal,\n });\n return createBoundLogger(printer, [...category], {}, prompts);\n}\n","import { readFile, realpath } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport async function findPackageVersion(entry: string | undefined): Promise<string | undefined> {\n if (!entry) return undefined;\n let directory: string;\n try {\n directory = dirname(await realpath(entry));\n } catch {\n return undefined;\n }\n for (;;) {\n const version = await readPackageVersion(join(directory, \"package.json\"));\n if (version !== undefined) return version;\n const parent = dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n}\n\nasync function readPackageVersion(path: string): Promise<string | undefined> {\n let text: string;\n try {\n text = await readFile(path, \"utf8\");\n } catch {\n return undefined;\n }\n try {\n const { version } = JSON.parse(text) as { version?: unknown };\n return typeof version === \"string\" ? version : undefined;\n } catch {\n return undefined;\n }\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 { schemaShape, type ArgsSchema } from \"./schema.ts\";\nimport type { AnyCommandDef, CommandDef } from \"./command.ts\";\nimport { assertUniqueEnvNames, commandEnvPath, registerCommandPath } from \"./environment.ts\";\nimport { HackshExitError, HackshPromptError, summarizeError, HackshUsageError } from \"./errors.ts\";\nimport { createExec, type ExecContext } from \"./exec.ts\";\nimport { createLogger } from \"./logger.ts\";\nimport { findPackageVersion } from \"./package-version.ts\";\nimport {\n parseCommandArgs,\n tokenizedBefore,\n tokenizeCommandArgs,\n type TokenizedCommandArgs,\n} from \"./parser.ts\";\nimport {\n createJsonPrinter,\n createPrintQueue,\n resolveOutputMode,\n type OutputFormat,\n type Printer,\n type PrintQueue,\n type PrintStream,\n type TerminalInput,\n} from \"./printer.ts\";\nimport { TerminalLock } from \"./terminal.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 output: PreparedOutput,\n env: ExecContext[\"env\"],\n signal: AbortSignal,\n fallbackVersion: () => Promise<string | undefined> = async () => undefined,\n): Promise<unknown> {\n if (root.args && \"version\" in schemaShape(root.args)) {\n throw new TypeError(\"Root option `version` conflicts with the builtin --version\");\n }\n const { printer } = output;\n const argEnv = env ?? process.env;\n const resolved = resolveCommand(root, argv);\n if (resolved.segments[0]?.tokenized.version) {\n const version = root.version ?? (await fallbackVersion()) ?? \"\";\n await printer.print({ type: \"version\", 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 argEnv,\n commandEnvPath(parent.command),\n );\n }\n const parsed = await parseCommandArgs(\n resolved.command,\n resolved.rawArgs,\n resolved.tokenized,\n argEnv,\n commandEnvPath(resolved.command),\n );\n if (!resolved.command.run) {\n throw new HackshUsageError(\"No command specified\", resolved.command);\n }\n signal.throwIfAborted();\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, {\n interactive: output.interactive,\n input: output.input,\n printPrompt: (event) => output.printChecked(event),\n terminal: output.terminal,\n signal,\n }),\n exec: createExec({\n env,\n mode: { format: output.format, interactive: output.interactive },\n print: (event) => printer.print(event),\n terminal: output.terminal,\n signal,\n }),\n signal,\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 signal?: AbortSignal;\n showUsage?: ShowUsageCallback;\n}\n\ninterface PreparedOutput extends PrintQueue {\n format: OutputFormat;\n interactive: boolean;\n input: TerminalInput;\n terminal: TerminalLock;\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 format: mode.format,\n interactive: mode.interactive,\n input,\n terminal: new TerminalLock(),\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, options.env ?? process.env);\n try {\n return await executeCommand(\n root,\n argv,\n options.showUsage ?? showUsage,\n output,\n options.env,\n options.signal ?? new AbortController().signal,\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 if (error instanceof HackshExitError) return error.exitCode;\n return error instanceof HackshPromptError && error.reason === \"cancelled\" ? 130 : 1;\n}\n\nconst SIGNAL_EXIT_CODES = { SIGINT: 130, SIGTERM: 143 } as const;\n\nfunction listenForExitSignals() {\n const controller = new AbortController();\n let exitCode: number | undefined;\n const listeners = Object.entries(SIGNAL_EXIT_CODES).map(([signal, code]) => {\n const listener = (): void => {\n if (exitCode !== undefined) process.exit(code);\n exitCode = code;\n controller.abort(new DOMException(`Received ${signal}`, \"AbortError\"));\n };\n process.on(signal, listener);\n return [signal, listener] as const;\n });\n return {\n signal: controller.signal,\n exitCode: () => exitCode,\n release(): void {\n for (const [signal, listener] of listeners) process.removeListener(signal, listener);\n },\n };\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\nasync function reportCommandError(\n error: unknown,\n output: PrintQueue,\n displayUsage: ShowUsageCallback,\n): Promise<void> {\n if (error instanceof HackshExitError && error.message === \"\") return;\n await output.printer.print({ type: \"error\", error: summarizeError(error) });\n if (error instanceof HackshUsageError) {\n await printUsage(displayUsage, error.command, output.printer, \"stderr\");\n }\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, options.env ?? process.env);\n } catch (error) {\n return reportOutputSetupError(error, options);\n }\n const signals = listenForExitSignals();\n const exit = (code: number): Promise<never> => {\n signals.release();\n return drainAndExit(output, signals.exitCode() ?? code);\n };\n try {\n await executeCommand(\n command,\n options.argv ?? process.argv.slice(2),\n displayUsage,\n output,\n options.env,\n signals.signal,\n () => findPackageVersion(process.argv[1]),\n );\n } catch (error) {\n if (options.onError) {\n await options.onError(error);\n return exit(commandErrorExitCode(error));\n }\n try {\n await reportCommandError(error, output, displayUsage);\n } finally {\n await exit(commandErrorExitCode(error));\n }\n } finally {\n signals.release();\n }\n const signalExitCode = signals.exitCode();\n if (signalExitCode !== undefined) return drainAndExit(output, signalExitCode);\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":["#result","safeString","parseNodeArgs","#owner","details","#interactive","#inputValue","#printEvent","#bufferedKeys","#terminal","#signal","#print","#run"],"sources":["../src/options.ts","../src/schema.ts","../src/command.ts","../src/errors.ts","../src/environment.ts","../src/parser.ts","../src/terminal.ts","../src/exec.ts","../src/serialization.ts","../src/printer.ts","../src/pretty.ts","../src/prompts.ts","../src/logger.ts","../src/package-version.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 { Exec } from \"./exec.ts\";\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 exec: Exec;\n signal: AbortSignal;\n}\n\nexport interface CommandDef<S extends ArgsSchema = EmptyArgs> {\n name?: string;\n version?: string;\n description?: string;\n hidden?: boolean;\n /** Keep unknown options and excess positionals in extraArgs. Inherits from the parent; defaults to false. */\n allowUnknownArgs?: 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 if (def.allowUnknownArgs !== undefined && typeof def.allowUnknownArgs !== \"boolean\") {\n throw new TypeError(\"allowUnknownArgs must be a boolean\");\n }\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 === \"help\") throw new TypeError(\"Option `help` conflicts with the builtin --help\");\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\";\nimport type { ExecFailure } from \"./exec.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 | \"aborted\"\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\n/** An external command that did not succeed; `result` is not enumerable so error summaries omit child output. */\nexport class HackshExecError extends Error {\n readonly #result: ExecFailure;\n\n constructor(message: string, result: ExecFailure, options?: ErrorOptions) {\n super(message, options);\n this.name = \"HackshExecError\";\n this.#result = result;\n }\n\n get result(): ExecFailure {\n return this.#result;\n }\n}\n\n/** A requested process exit status; `runMain` exits with it and reports only a non-empty message. */\nexport class HackshExitError extends Error {\n readonly exitCode: number;\n\n constructor(exitCode: number, message?: string, options?: ErrorOptions) {\n if (!Number.isInteger(exitCode) || exitCode < 0 || exitCode > 255) {\n throw new TypeError(\"Exit code must be an integer from 0 to 255\");\n }\n super(message, options);\n this.name = \"HackshExitError\";\n this.exitCode = exitCode;\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 if (!command.allowUnknownArgs && extraArgs.length > 0) {\n throw new HackshValidationError(\n command,\n extraArgs.map((arg) => ({ arg, message: \"unexpected argument\" })),\n );\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","export type TerminalOwner = \"prompt\" | \"exec\";\n\nexport class TerminalLock {\n #owner: TerminalOwner | undefined;\n\n get owner(): TerminalOwner | undefined {\n return this.#owner;\n }\n\n acquire(owner: TerminalOwner): boolean {\n if (this.#owner !== undefined) return false;\n this.#owner = owner;\n return true;\n }\n\n release(): void {\n this.#owner = undefined;\n }\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport type { Readable } from \"node:stream\";\nimport { HackshExecError } from \"./errors.ts\";\nimport type { ExecPrintEvent, OutputFormat } from \"./printer.ts\";\nimport { TerminalLock } from \"./terminal.ts\";\n\ntype Environment = Readonly<Record<string, string | undefined>>;\n\nexport interface ExecOptions {\n cwd?: string;\n env?: Environment;\n input?: string;\n reject?: boolean;\n timeout?: number;\n signal?: AbortSignal;\n maxBuffer?: number;\n forceKillAfterDelay?: number;\n stdin?: \"pipe\" | \"inherit\";\n stdout?: \"pipe\" | \"inherit\";\n stderr?: \"pipe\" | \"inherit\";\n interactive?: boolean;\n display?: boolean;\n redact?: readonly string[];\n}\n\nexport interface ExecCommand {\n file: string;\n args: readonly string[];\n cwd: string | undefined;\n}\n\nexport interface ExecSuccess {\n status: \"succeeded\";\n command: ExecCommand;\n stdout: string;\n stderr: string;\n exitCode: 0;\n}\n\nexport type ExecFailure = {\n status: \"failed\";\n command: ExecCommand;\n stdout: string;\n stderr: string;\n} & (\n | { reason: \"exit-code\"; exitCode: number }\n | { reason: \"signal\"; signal: string }\n | { reason: \"spawn\"; error: Error }\n | { reason: \"timeout\" | \"aborted\" | \"output-limit\" }\n | { reason: \"json-output\" | \"non-interactive\" | \"overlapping\" }\n);\n\nexport type ExecFailureReason = ExecFailure[\"reason\"];\n\nexport type ExecResult = ExecSuccess | ExecFailure;\n\nexport type ExecReturn<O extends ExecOptions> = \"reject\" extends keyof O\n ? false extends O[\"reject\"]\n ? ExecResult\n : ExecSuccess\n : ExecSuccess;\n\ntype RejectInheritedInput<O> = O extends { input: string; stdin: \"inherit\" } ? never : unknown;\n\nexport type Exec = <const O extends ExecOptions = {}>(\n file: string,\n args?: readonly string[],\n options?: O & { [K in Exclude<keyof O, keyof ExecOptions>]: never } & RejectInheritedInput<O>,\n) => Promise<ExecReturn<O>>;\n\nexport interface ExecContext {\n env: Environment | undefined;\n mode: { format: OutputFormat; interactive: boolean };\n print(event: ExecPrintEvent): void | Promise<void>;\n terminal: TerminalLock;\n signal: AbortSignal;\n}\n\nconst OPTION_KEYS: ReadonlySet<string> = new Set([\n \"cwd\",\n \"env\",\n \"input\",\n \"reject\",\n \"timeout\",\n \"signal\",\n \"maxBuffer\",\n \"forceKillAfterDelay\",\n \"stdin\",\n \"stdout\",\n \"stderr\",\n \"interactive\",\n \"display\",\n \"redact\",\n] satisfies (keyof ExecOptions)[]);\n\ntype TerminationCause = \"timeout\" | \"aborted\" | \"output-limit\";\ntype StreamMode = \"pipe\" | \"inherit\";\ntype ExecStdio = ExecPrintEvent[\"stdio\"];\ntype RefusalReason = \"aborted\" | \"json-output\" | \"non-interactive\" | \"overlapping\";\n\ninterface SpawnError extends NodeJS.ErrnoException {\n spawnargs?: readonly string[];\n}\n\ninterface ExecPlan {\n command: ExecCommand;\n reported: ExecCommand;\n env: NodeJS.ProcessEnv | undefined;\n input: string | undefined;\n reject: boolean;\n timeout: number | undefined;\n signal: AbortSignal;\n maxBuffer: number;\n forceKillAfterDelay: number;\n stdin: StreamMode;\n stdout: StreamMode;\n stderr: StreamMode;\n interactive: boolean;\n display: boolean;\n redact: readonly string[];\n}\n\ninterface Outcome {\n cause: TerminationCause | undefined;\n spawnError: Error | undefined;\n exit: { code: number | null; signal: string | null } | undefined;\n}\n\nconst MAX_DELAY = 2_147_483_647;\nconst REFUSAL_MESSAGE = {\n \"json-output\": \"Command cannot use the terminal in JSON output mode\",\n \"non-interactive\": \"Command requires an interactive terminal\",\n overlapping: \"Command cannot use the terminal while it is in use\",\n} as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction assertNoNul(value: string, label: string): void {\n if (value.includes(\"\\0\")) throw new TypeError(`${label} must not contain NUL characters`);\n}\n\nfunction readInteger(value: unknown, label: string, minimum: number, maximum: number): number {\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < minimum || value > maximum) {\n throw new TypeError(`${label} must be an integer from ${minimum} to ${maximum}`);\n }\n return value;\n}\n\nfunction readEnum<const T extends string>(value: unknown, label: string, allowed: readonly T[]): T {\n if (typeof value === \"string\" && (allowed as readonly string[]).includes(value))\n return value as T;\n throw new TypeError(\n `Exec option \\`${label}\\` must be ${allowed.map((item) => JSON.stringify(item)).join(\" or \")}`,\n );\n}\n\nfunction readBoolean(value: unknown, label: string): boolean {\n if (typeof value !== \"boolean\") throw new TypeError(`Exec option \\`${label}\\` must be a boolean`);\n return value;\n}\n\nfunction readRedact(value: unknown): readonly string[] {\n if (!Array.isArray(value)) throw new TypeError(\"Exec option `redact` must be an array\");\n for (const item of value) {\n if (typeof item !== \"string\" || item === \"\") {\n throw new TypeError(\"Exec option `redact` must contain only non-empty strings\");\n }\n assertNoNul(item, \"Exec option `redact`\");\n }\n return value as readonly string[];\n}\n\nfunction mergeEnvironment(\n base: Environment | undefined,\n overrides: unknown,\n): NodeJS.ProcessEnv | undefined {\n if (overrides === undefined && base === undefined) return undefined;\n if (overrides !== undefined && !isRecord(overrides)) {\n throw new TypeError(\"Exec option `env` must be an object\");\n }\n const merged: NodeJS.ProcessEnv = {};\n for (const [key, value] of Object.entries(base ?? process.env)) {\n if (value !== undefined) merged[key] = value;\n }\n for (const [key, value] of Object.entries(overrides ?? {})) {\n if (key === \"\" || key.includes(\"=\") || key.includes(\"\\0\")) {\n throw new TypeError(`Invalid environment variable name ${JSON.stringify(key)}`);\n }\n if (value === undefined) {\n delete merged[key];\n continue;\n }\n if (typeof value !== \"string\") {\n throw new TypeError(`Environment variable ${key} must be a string or undefined`);\n }\n assertNoNul(value, `Environment variable ${key}`);\n merged[key] = value;\n }\n return merged;\n}\n\nfunction redactValue(value: string, secrets: readonly string[]): string {\n let redacted = value;\n for (const secret of [...secrets].sort((left, right) => right.length - left.length)) {\n redacted = redacted.split(secret).join(\"***\");\n }\n return redacted;\n}\n\nfunction redactCommand(command: ExecCommand, secrets: readonly string[]): ExecCommand {\n if (secrets.length === 0) return command;\n return {\n file: redactValue(command.file, secrets),\n args: command.args.map((arg) => redactValue(arg, secrets)),\n cwd: command.cwd === undefined ? undefined : redactValue(command.cwd, secrets),\n };\n}\n\nfunction redactError(error: Error, secrets: readonly string[]): Error {\n const source = error as SpawnError;\n const redacted = new Error(redactValue(error.message, secrets)) as SpawnError;\n if (typeof error.stack === \"string\") redacted.stack = redactValue(error.stack, secrets);\n if (source.code !== undefined) redacted.code = source.code;\n if (source.errno !== undefined) redacted.errno = source.errno;\n if (typeof source.syscall === \"string\") redacted.syscall = redactValue(source.syscall, secrets);\n if (typeof source.path === \"string\") redacted.path = redactValue(source.path, secrets);\n if (Array.isArray(source.spawnargs)) {\n redacted.spawnargs = source.spawnargs.map((arg) =>\n typeof arg === \"string\" ? redactValue(arg, secrets) : arg,\n );\n }\n return redacted;\n}\n\nfunction observedError(plan: ExecPlan, error: Error): Error {\n return plan.redact.length === 0 ? error : redactError(error, plan.redact);\n}\n\nfunction parsePlan(file: unknown, args: unknown, options: unknown, context: ExecContext): ExecPlan {\n if (typeof file !== \"string\" || file === \"\") {\n throw new TypeError(\"Exec file must be a non-empty string\");\n }\n assertNoNul(file, \"Exec file\");\n const argv = args === undefined ? [] : args;\n if (!Array.isArray(argv) || !argv.every((arg) => typeof arg === \"string\")) {\n throw new TypeError(\"Exec args must be an array of strings\");\n }\n for (const arg of argv) assertNoNul(arg, \"Exec args\");\n const raw = options === undefined ? {} : options;\n if (!isRecord(raw)) throw new TypeError(\"Exec options must be an object\");\n for (const key of Object.keys(raw)) {\n if (!OPTION_KEYS.has(key)) throw new TypeError(`Unknown exec option \\`${key}\\``);\n }\n\n const { cwd, input, reject, timeout, signal, maxBuffer, forceKillAfterDelay } = raw;\n if (cwd !== undefined) {\n if (typeof cwd !== \"string\" || cwd === \"\") {\n throw new TypeError(\"Exec option `cwd` must be a non-empty string\");\n }\n assertNoNul(cwd, \"Exec option `cwd`\");\n }\n if (input !== undefined && typeof input !== \"string\") {\n throw new TypeError(\"Exec option `input` must be a string\");\n }\n if (reject !== undefined && typeof reject !== \"boolean\") {\n throw new TypeError(\"Exec option `reject` must be a boolean\");\n }\n if (signal !== undefined && !(signal instanceof AbortSignal)) {\n throw new TypeError(\"Exec option `signal` must be an AbortSignal\");\n }\n const stdin =\n raw.stdin === undefined ? \"pipe\" : readEnum(raw.stdin, \"stdin\", [\"pipe\", \"inherit\"]);\n const stdout =\n raw.stdout === undefined ? \"pipe\" : readEnum(raw.stdout, \"stdout\", [\"pipe\", \"inherit\"]);\n const stderr =\n raw.stderr === undefined ? \"pipe\" : readEnum(raw.stderr, \"stderr\", [\"pipe\", \"inherit\"]);\n if (input !== undefined && stdin === \"inherit\") {\n throw new TypeError(\"Exec option `input` cannot be combined with stdin inherit\");\n }\n const command = { file, args: [...argv], cwd };\n const redact = raw.redact === undefined ? [] : readRedact(raw.redact);\n return {\n command,\n reported: redactCommand(command, redact),\n env: mergeEnvironment(context.env, raw.env),\n input,\n reject: reject ?? true,\n timeout:\n timeout === undefined\n ? undefined\n : readInteger(timeout, \"Exec option `timeout`\", 1, MAX_DELAY),\n signal: signal === undefined ? context.signal : AbortSignal.any([context.signal, signal]),\n maxBuffer:\n maxBuffer === undefined\n ? 100_000_000\n : readInteger(maxBuffer, \"Exec option `maxBuffer`\", 1, Number.MAX_SAFE_INTEGER),\n forceKillAfterDelay:\n forceKillAfterDelay === undefined\n ? 5_000\n : readInteger(forceKillAfterDelay, \"Exec option `forceKillAfterDelay`\", 0, MAX_DELAY),\n stdin,\n stdout,\n stderr,\n interactive:\n raw.interactive === undefined ? false : readBoolean(raw.interactive, \"interactive\"),\n display: raw.display === undefined ? true : readBoolean(raw.display, \"display\"),\n redact,\n };\n}\n\nfunction stripFinalNewline(text: string): string {\n if (text.endsWith(\"\\r\\n\")) return text.slice(0, -2);\n if (text.endsWith(\"\\n\")) return text.slice(0, -1);\n return text;\n}\n\nfunction collect(stream: Readable, limit: number, onLimit: () => void): () => string {\n const chunks: Buffer[] = [];\n let length = 0;\n let exceeded = false;\n stream.on(\"data\", (chunk: Buffer) => {\n if (exceeded) return;\n const remaining = limit - length;\n if (chunk.length <= remaining) {\n chunks.push(chunk);\n length += chunk.length;\n return;\n }\n chunks.push(chunk.subarray(0, remaining));\n length = limit;\n exceeded = true;\n onLimit();\n });\n return () => stripFinalNewline(Buffer.concat(chunks).toString(\"utf8\"));\n}\n\nfunction toResult(\n command: ExecCommand,\n outcome: Outcome,\n stdout: string,\n stderr: string,\n): ExecResult {\n const failed = { status: \"failed\", command, stdout, stderr } as const;\n if (outcome.cause) return { ...failed, reason: outcome.cause };\n if (outcome.spawnError) return { ...failed, reason: \"spawn\", error: outcome.spawnError };\n const { code, signal } = outcome.exit ?? { code: null, signal: null };\n if (signal !== null) return { ...failed, reason: \"signal\", signal };\n if (code !== 0) return { ...failed, reason: \"exit-code\", exitCode: code ?? 1 };\n return { status: \"succeeded\", command, stdout, stderr, exitCode: 0 };\n}\n\nfunction isSpawnErrno(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"syscall\" in error;\n}\n\nfunction commandStdio(plan: ExecPlan): ExecStdio {\n return {\n stdin: plan.stdin === \"inherit\" ? \"inherit\" : plan.input === undefined ? \"ignore\" : \"input\",\n stdout: plan.stdout,\n stderr: plan.stderr,\n };\n}\n\nfunction usesTerminal(plan: ExecPlan, stdio: ExecStdio): boolean {\n return (\n plan.interactive ||\n stdio.stdin === \"inherit\" ||\n stdio.stdout === \"inherit\" ||\n stdio.stderr === \"inherit\"\n );\n}\n\nfunction startChild(plan: ExecPlan): ChildProcess | Error {\n const stdio = commandStdio(plan);\n try {\n return spawn(plan.command.file, plan.command.args, {\n cwd: plan.command.cwd,\n env: plan.env,\n shell: false,\n windowsHide: true,\n stdio: [\n stdio.stdin === \"inherit\" ? \"inherit\" : stdio.stdin === \"input\" ? \"pipe\" : \"ignore\",\n stdio.stdout,\n stdio.stderr,\n ],\n });\n } catch (error) {\n if (isSpawnErrno(error)) return error;\n throw error;\n }\n}\n\nfunction runPlan(plan: ExecPlan): Promise<ExecResult> {\n const outcome: Outcome = { cause: undefined, spawnError: undefined, exit: undefined };\n if (plan.signal.aborted) {\n outcome.cause = \"aborted\";\n return Promise.resolve(toResult(plan.reported, outcome, \"\", \"\"));\n }\n const child = startChild(plan);\n if (child instanceof Error) {\n outcome.spawnError = observedError(plan, child);\n return Promise.resolve(toResult(plan.reported, outcome, \"\", \"\"));\n }\n\n return new Promise((resolve) => {\n const stdout = child.stdout;\n const stderr = child.stderr;\n let settled = false;\n let killTimer: NodeJS.Timeout | undefined;\n\n const settle = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timeoutTimer);\n clearTimeout(killTimer);\n plan.signal.removeEventListener(\"abort\", onAbort);\n resolve(toResult(plan.reported, outcome, readStdout(), readStderr()));\n };\n const release = () => {\n stdout?.destroy();\n stderr?.destroy();\n settle();\n };\n const terminate = (cause: TerminationCause) => {\n if (settled || outcome.cause) return;\n outcome.cause = cause;\n if (outcome.exit) {\n release();\n return;\n }\n child.kill(\"SIGTERM\");\n killTimer = setTimeout(() => child.kill(\"SIGKILL\"), plan.forceKillAfterDelay);\n };\n const onAbort = () => terminate(\"aborted\");\n\n const readStdout = stdout\n ? collect(stdout, plan.maxBuffer, () => terminate(\"output-limit\"))\n : () => \"\";\n const readStderr = stderr\n ? collect(stderr, plan.maxBuffer, () => terminate(\"output-limit\"))\n : () => \"\";\n const timeoutTimer =\n plan.timeout === undefined ? undefined : setTimeout(() => terminate(\"timeout\"), plan.timeout);\n plan.signal.addEventListener(\"abort\", onAbort, { once: true });\n\n child.on(\"error\", (error) => {\n if (child.pid !== undefined) return;\n outcome.spawnError = observedError(plan, error);\n release();\n });\n child.on(\"exit\", (code, signal) => {\n outcome.exit = { code, signal };\n clearTimeout(killTimer);\n // A grandchild may keep the pipes open after hacksh terminates the direct child.\n if (outcome.cause) release();\n });\n child.on(\"close\", settle);\n\n if (child.stdin) {\n child.stdin.on(\"error\", () => undefined);\n child.stdin.end(plan.input);\n }\n });\n}\n\nfunction formatArgument(value: string): string {\n return value === \"\" || /[\\s\"'\\\\$`;|&<>*?()[\\]{}~#!]/.test(value) ? JSON.stringify(value) : value;\n}\n\nexport function formatExecCommand(command: Pick<ExecCommand, \"file\" | \"args\">): string {\n return [command.file, ...command.args].map(formatArgument).join(\" \");\n}\n\nfunction failureMessage(plan: ExecPlan, result: ExecFailure): string {\n const display = formatExecCommand(plan.reported);\n switch (result.reason) {\n case \"exit-code\":\n return `Command failed with exit code ${result.exitCode}: ${display}`;\n case \"signal\":\n return `Command was terminated by ${result.signal}: ${display}`;\n case \"spawn\": {\n const code = (result.error as NodeJS.ErrnoException).code;\n return `Command could not be started (${code ?? result.error.message}): ${display}`;\n }\n case \"timeout\":\n return `Command timed out after ${plan.timeout} ms: ${display}`;\n case \"aborted\":\n return `Command was aborted: ${display}`;\n case \"output-limit\":\n return `Command output exceeded ${plan.maxBuffer} bytes: ${display}`;\n case \"json-output\":\n case \"non-interactive\":\n case \"overlapping\":\n return `${REFUSAL_MESSAGE[result.reason]}: ${display}`;\n }\n}\n\nfunction emptyFailure(plan: ExecPlan, reason: RefusalReason): ExecFailure {\n return { status: \"failed\", command: plan.reported, stdout: \"\", stderr: \"\", reason };\n}\n\nfunction complete(plan: ExecPlan, result: ExecResult): ExecResult {\n if (result.status === \"failed\" && plan.reject) {\n throw new HackshExecError(\n failureMessage(plan, result),\n result,\n result.reason === \"spawn\" ? { cause: result.error } : undefined,\n );\n }\n return result;\n}\n\nfunction blockedReason(\n plan: ExecPlan,\n context: ExecContext,\n stdio: ExecStdio,\n): \"json-output\" | \"non-interactive\" | undefined {\n const inherited =\n stdio.stdin === \"inherit\" || stdio.stdout === \"inherit\" || stdio.stderr === \"inherit\";\n if (context.mode.format === \"json\" && inherited) return \"json-output\";\n if (plan.interactive && !context.mode.interactive) return \"non-interactive\";\n return undefined;\n}\n\nasync function execute(\n file: unknown,\n args: unknown,\n options: unknown,\n context: ExecContext,\n): Promise<ExecResult> {\n const plan = parsePlan(file, args, options, context);\n if (plan.signal.aborted) return complete(plan, emptyFailure(plan, \"aborted\"));\n\n const stdio = commandStdio(plan);\n const blocked = blockedReason(plan, context, stdio);\n if (blocked) return complete(plan, emptyFailure(plan, blocked));\n\n const holdTerminal = usesTerminal(plan, stdio);\n if (holdTerminal && !context.terminal.acquire(\"exec\")) {\n return complete(plan, emptyFailure(plan, \"overlapping\"));\n }\n try {\n if (plan.display) {\n const { file, args, cwd } = plan.reported;\n await context.print({\n type: \"exec\",\n phase: \"start\",\n command: cwd === undefined ? { file, args } : { file, args, cwd },\n stdio,\n interactive: plan.interactive,\n });\n }\n return complete(plan, await runPlan(plan));\n } finally {\n if (holdTerminal) context.terminal.release();\n }\n}\n\nexport function createExec(context: ExecContext): Exec {\n return ((file, args, options) => execute(file, args, options, context)) as Exec;\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 { formatExecCommand, type ExecCommand } from \"./exec.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\nexport interface ExecPrintEvent {\n type: \"exec\";\n phase: \"start\";\n command: Omit<ExecCommand, \"cwd\"> & { cwd?: string };\n stdio: {\n stdin: \"ignore\" | \"input\" | \"inherit\";\n stdout: \"pipe\" | \"inherit\";\n stderr: \"pipe\" | \"inherit\";\n };\n interactive: boolean;\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 | ExecPrintEvent;\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\" || event.type === \"exec\") 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 case \"exec\":\n return `$ ${formatExecCommand(event.command)}`;\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 { formatExecCommand } from \"./exec.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 =\n | LogLevel\n | \"step\"\n | \"success\"\n | \"usage\"\n | \"version\"\n | \"errorEvent\"\n | \"prompt\"\n | \"exec\";\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 exec: \"$\",\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 exec: \"$\",\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 exec: \"gray\",\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 if (event.type === \"exec\") return \"exec\";\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 case \"exec\": {\n const lines = [formatExecCommand(event.command)];\n if (event.command.cwd !== undefined) lines.push(...propertyLines({ cwd: event.command.cwd }));\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\";\nimport { TerminalLock } from \"./terminal.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 terminal: TerminalLock;\n signal: AbortSignal;\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 readonly #terminal: TerminalLock;\n readonly #signal: AbortSignal;\n\n constructor(options: PromptControllerOptions) {\n this.#interactive = options.interactive;\n this.#inputValue = options.input;\n this.#printEvent = (event) => options.print(event);\n this.#terminal = options.terminal;\n this.#signal = options.signal;\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.#signal.aborted) {\n throw promptError(\"aborted\", prompt, \"Prompt aborted\", this.#signal.reason);\n }\n const input = asInput(this.#inputValue, prompt);\n if (!this.#terminal.acquire(\"prompt\")) {\n throw promptError(\n \"overlapping\",\n prompt,\n this.#terminal.owner === \"exec\"\n ? \"A command is using the terminal\"\n : \"Another prompt is already active\",\n );\n }\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 onAbort = (): void => fail(\"aborted\", \"Prompt aborted\", this.#signal.reason);\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 this.#signal.removeEventListener(\"abort\", onAbort);\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 this.#signal.addEventListener(\"abort\", onAbort, { once: true });\n if (this.#signal.aborted) onAbort();\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.#terminal.release();\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.#terminal.release();\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\";\nimport type { TerminalLock } from \"./terminal.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 terminal: TerminalLock;\n signal: AbortSignal;\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 terminal: options.terminal,\n signal: options.signal,\n });\n return createBoundLogger(printer, [...category], {}, prompts);\n}\n","import { readFile, realpath } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport async function findPackageVersion(entry: string | undefined): Promise<string | undefined> {\n if (!entry) return undefined;\n let directory: string;\n try {\n directory = dirname(await realpath(entry));\n } catch {\n return undefined;\n }\n for (;;) {\n const version = await readPackageVersion(join(directory, \"package.json\"));\n if (version !== undefined) return version;\n const parent = dirname(directory);\n if (parent === directory) return undefined;\n directory = parent;\n }\n}\n\nasync function readPackageVersion(path: string): Promise<string | undefined> {\n let text: string;\n try {\n text = await readFile(path, \"utf8\");\n } catch {\n return undefined;\n }\n try {\n const { version } = JSON.parse(text) as { version?: unknown };\n return typeof version === \"string\" ? version : undefined;\n } catch {\n return undefined;\n }\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 { schemaShape, type ArgsSchema } from \"./schema.ts\";\nimport type { AnyCommandDef, CommandDef } from \"./command.ts\";\nimport { assertUniqueEnvNames, commandEnvPath, registerCommandPath } from \"./environment.ts\";\nimport { HackshExitError, HackshPromptError, summarizeError, HackshUsageError } from \"./errors.ts\";\nimport { createExec, type ExecContext } from \"./exec.ts\";\nimport { createLogger } from \"./logger.ts\";\nimport { findPackageVersion } from \"./package-version.ts\";\nimport {\n parseCommandArgs,\n tokenizedBefore,\n tokenizeCommandArgs,\n type TokenizedCommandArgs,\n} from \"./parser.ts\";\nimport {\n createJsonPrinter,\n createPrintQueue,\n resolveOutputMode,\n type OutputFormat,\n type Printer,\n type PrintQueue,\n type PrintStream,\n type TerminalInput,\n} from \"./printer.ts\";\nimport { TerminalLock } from \"./terminal.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 = {\n ...child,\n name: child.name ?? key,\n allowUnknownArgs: child.allowUnknownArgs ?? command.allowUnknownArgs,\n };\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 output: PreparedOutput,\n env: ExecContext[\"env\"],\n signal: AbortSignal,\n fallbackVersion: () => Promise<string | undefined> = async () => undefined,\n): Promise<unknown> {\n if (root.args && \"version\" in schemaShape(root.args)) {\n throw new TypeError(\"Root option `version` conflicts with the builtin --version\");\n }\n const { printer } = output;\n const argEnv = env ?? process.env;\n const resolved = resolveCommand(root, argv);\n if (resolved.segments[0]?.tokenized.version) {\n const version = root.version ?? (await fallbackVersion()) ?? \"\";\n await printer.print({ type: \"version\", 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 argEnv,\n commandEnvPath(parent.command),\n );\n }\n const parsed = await parseCommandArgs(\n resolved.command,\n resolved.rawArgs,\n resolved.tokenized,\n argEnv,\n commandEnvPath(resolved.command),\n );\n if (!resolved.command.run) {\n throw new HackshUsageError(\"No command specified\", resolved.command);\n }\n signal.throwIfAborted();\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, {\n interactive: output.interactive,\n input: output.input,\n printPrompt: (event) => output.printChecked(event),\n terminal: output.terminal,\n signal,\n }),\n exec: createExec({\n env,\n mode: { format: output.format, interactive: output.interactive },\n print: (event) => printer.print(event),\n terminal: output.terminal,\n signal,\n }),\n signal,\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 signal?: AbortSignal;\n showUsage?: ShowUsageCallback;\n}\n\ninterface PreparedOutput extends PrintQueue {\n format: OutputFormat;\n interactive: boolean;\n input: TerminalInput;\n terminal: TerminalLock;\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 format: mode.format,\n interactive: mode.interactive,\n input,\n terminal: new TerminalLock(),\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, options.env ?? process.env);\n try {\n return await executeCommand(\n root,\n argv,\n options.showUsage ?? showUsage,\n output,\n options.env,\n options.signal ?? new AbortController().signal,\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 if (error instanceof HackshExitError) return error.exitCode;\n return error instanceof HackshPromptError && error.reason === \"cancelled\" ? 130 : 1;\n}\n\nconst SIGNAL_EXIT_CODES = { SIGINT: 130, SIGTERM: 143 } as const;\n\nfunction listenForExitSignals() {\n const controller = new AbortController();\n let exitCode: number | undefined;\n const listeners = Object.entries(SIGNAL_EXIT_CODES).map(([signal, code]) => {\n const listener = (): void => {\n if (exitCode !== undefined) process.exit(code);\n exitCode = code;\n controller.abort(new DOMException(`Received ${signal}`, \"AbortError\"));\n };\n process.on(signal, listener);\n return [signal, listener] as const;\n });\n return {\n signal: controller.signal,\n exitCode: () => exitCode,\n release(): void {\n for (const [signal, listener] of listeners) process.removeListener(signal, listener);\n },\n };\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\nasync function reportCommandError(\n error: unknown,\n output: PrintQueue,\n displayUsage: ShowUsageCallback,\n): Promise<void> {\n if (error instanceof HackshExitError && error.message === \"\") return;\n await output.printer.print({ type: \"error\", error: summarizeError(error) });\n if (error instanceof HackshUsageError) {\n await printUsage(displayUsage, error.command, output.printer, \"stderr\");\n }\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, options.env ?? process.env);\n } catch (error) {\n return reportOutputSetupError(error, options);\n }\n const signals = listenForExitSignals();\n const exit = (code: number): Promise<never> => {\n signals.release();\n return drainAndExit(output, signals.exitCode() ?? code);\n };\n try {\n await executeCommand(\n command,\n options.argv ?? process.argv.slice(2),\n displayUsage,\n output,\n options.env,\n signals.signal,\n () => findPackageVersion(process.argv[1]),\n );\n } catch (error) {\n if (options.onError) {\n await options.onError(error);\n return exit(commandErrorExitCode(error));\n }\n try {\n await reportCommandError(error, output, displayUsage);\n } finally {\n await exit(commandErrorExitCode(error));\n }\n } finally {\n signals.release();\n }\n const signalExitCode = signals.exitCode();\n if (signalExitCode !== undefined) return drainAndExit(output, signalExitCode);\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.11.0",
3
+ "version": "0.12.0",
4
4
  "description": "Type-safe command-line interfaces powered by Zod 4 schemas.",
5
5
  "keywords": [
6
6
  "cli",