hacksh 0.7.0 → 0.8.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 +5 -0
- package/dist/index.js +38 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -57,6 +57,11 @@ gh-pr-commits --help
|
|
|
57
57
|
gh-pr-commits --version
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
+
`--version` is a root-only builtin. It prints the root command's `version`. When the root has
|
|
61
|
+
none, `runMain` resolves the executable (`process.argv[1]`) through symlinks and prints the
|
|
62
|
+
`version` of the nearest ancestor `package.json` that declares one, so a published CLI reports its
|
|
63
|
+
package version without repeating it in code. `runCommand` does not search the filesystem.
|
|
64
|
+
|
|
60
65
|
Boolean fields are flags and other fields take a value. Both a schema key and its kebab-case form
|
|
61
66
|
are accepted (`--dryRun` and `--dry-run`). Every boolean flag also accepts a `--no-` prefixed form
|
|
62
67
|
that sets it to `false`, such as `--no-verbose`, which is how a default-on flag is disabled.
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,8 @@ import { inspect, parseArgs as parseArgs$1, stripVTControlCharacters, styleText
|
|
|
3
3
|
import { spawn } from "node:child_process";
|
|
4
4
|
import { emitKeypressEvents } from "node:readline";
|
|
5
5
|
import { PassThrough } from "node:stream";
|
|
6
|
+
import { readFile, realpath } from "node:fs/promises";
|
|
7
|
+
import { dirname, join } from "node:path";
|
|
6
8
|
//#region src/options.ts
|
|
7
9
|
function kebabCase(value) {
|
|
8
10
|
return value.replaceAll(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
|
|
@@ -1798,6 +1800,38 @@ function createLogger(printer, category, options) {
|
|
|
1798
1800
|
return createBoundLogger(printer, [...category], {}, prompts);
|
|
1799
1801
|
}
|
|
1800
1802
|
//#endregion
|
|
1803
|
+
//#region src/package-version.ts
|
|
1804
|
+
async function findPackageVersion(entry) {
|
|
1805
|
+
if (!entry) return void 0;
|
|
1806
|
+
let directory;
|
|
1807
|
+
try {
|
|
1808
|
+
directory = dirname(await realpath(entry));
|
|
1809
|
+
} catch {
|
|
1810
|
+
return;
|
|
1811
|
+
}
|
|
1812
|
+
for (;;) {
|
|
1813
|
+
const version = await readPackageVersion(join(directory, "package.json"));
|
|
1814
|
+
if (version !== void 0) return version;
|
|
1815
|
+
const parent = dirname(directory);
|
|
1816
|
+
if (parent === directory) return void 0;
|
|
1817
|
+
directory = parent;
|
|
1818
|
+
}
|
|
1819
|
+
}
|
|
1820
|
+
async function readPackageVersion(path) {
|
|
1821
|
+
let text;
|
|
1822
|
+
try {
|
|
1823
|
+
text = await readFile(path, "utf8");
|
|
1824
|
+
} catch {
|
|
1825
|
+
return;
|
|
1826
|
+
}
|
|
1827
|
+
try {
|
|
1828
|
+
const { version } = JSON.parse(text);
|
|
1829
|
+
return typeof version === "string" ? version : void 0;
|
|
1830
|
+
} catch {
|
|
1831
|
+
return;
|
|
1832
|
+
}
|
|
1833
|
+
}
|
|
1834
|
+
//#endregion
|
|
1801
1835
|
//#region src/output.ts
|
|
1802
1836
|
function consoleWriter(method, stream) {
|
|
1803
1837
|
return {
|
|
@@ -2018,13 +2052,14 @@ function resolveCommand(root, rawArgs) {
|
|
|
2018
2052
|
remaining = remaining.slice(index + 1);
|
|
2019
2053
|
}
|
|
2020
2054
|
}
|
|
2021
|
-
async function executeCommand(root, argv, displayUsage, printer, loggerOptions, execContext) {
|
|
2055
|
+
async function executeCommand(root, argv, displayUsage, printer, loggerOptions, execContext, fallbackVersion = async () => void 0) {
|
|
2022
2056
|
const env = execContext.env ?? process.env;
|
|
2023
2057
|
const resolved = resolveCommand(root, argv);
|
|
2024
2058
|
if (resolved.segments[0]?.tokenized.version) {
|
|
2059
|
+
const version = root.version ?? await fallbackVersion() ?? "";
|
|
2025
2060
|
await printer.print({
|
|
2026
2061
|
type: "version",
|
|
2027
|
-
version
|
|
2062
|
+
version
|
|
2028
2063
|
});
|
|
2029
2064
|
return;
|
|
2030
2065
|
}
|
|
@@ -2131,7 +2166,7 @@ async function runMain(command, options = {}) {
|
|
|
2131
2166
|
input: output.input,
|
|
2132
2167
|
printPrompt: (event) => output.printChecked(event),
|
|
2133
2168
|
terminal: output.terminal
|
|
2134
|
-
}, invocationExec(output, options.env));
|
|
2169
|
+
}, invocationExec(output, options.env), () => findPackageVersion(process.argv[1]));
|
|
2135
2170
|
} catch (error) {
|
|
2136
2171
|
if (options.onError) {
|
|
2137
2172
|
await options.onError(error);
|
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","#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/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}\n\nexport interface CommandDef<S extends ArgsSchema = EmptyArgs> {\n name?: string;\n version?: string;\n description?: string;\n hidden?: boolean;\n args?: S;\n argOptions?: ArgOptionsMap<S>;\n subCommands?: Record<string, CommandDef<ArgsSchema>>;\n run?(context: CommandContext<S>): unknown;\n}\n\nexport type AnyCommandDef = CommandDef<ArgsSchema>;\n\nexport function defineCommand<S extends ArgsSchema = EmptyArgs>(def: CommandDef<S>): CommandDef<S> {\n const shape = def.args ? schemaShape(def.args) : {};\n const positionals = readPositionals(shape);\n\n if (positionals) {\n let sawOptional = false;\n for (const { schema, label } of positionals.items) {\n const info = readArgInfo(schema);\n if (isArrayInput(schema)) {\n throw new TypeError(\n `Positional argument \\`${label}\\` cannot be an array; use a tuple rest`,\n );\n }\n if (!info.takesValue) {\n throw new TypeError(`Boolean argument \\`${label}\\` cannot be positional`);\n }\n if (sawOptional && info.required) {\n throw new TypeError(\n `Required positional \\`${label}\\` cannot follow an optional positional`,\n );\n }\n sawOptional ||= !info.required;\n }\n if (def.subCommands && Object.keys(def.subCommands).length > 0) {\n throw new TypeError(\"A command cannot define both positional arguments and subcommands\");\n }\n }\n\n const usedAliases = new Set<string>();\n for (const [key, options] of Object.entries(def.argOptions ?? {})) {\n if (key === POSITIONALS_KEY) {\n throw new TypeError(\"Positional arguments cannot have argument options\");\n }\n const schema = shape[key];\n if (!schema) throw new TypeError(`Unknown argument options key \\`${key}\\``);\n if (options?.env !== undefined) {\n if (options.env === \"\") {\n throw new TypeError(`Environment variable name for \\`${key}\\` cannot be empty`);\n }\n if (isArrayInput(schema)) {\n throw new TypeError(\n `Option \\`${key}\\` cannot use an environment variable because it accepts an array`,\n );\n }\n if (isObjectInput(schema)) {\n throw new TypeError(\n `Option \\`${key}\\` cannot use an environment variable because it accepts an object`,\n );\n }\n }\n if (options?.alias === undefined) continue;\n for (const alias of aliasList(options.alias)) {\n if (alias.length !== 1)\n throw new TypeError(`Alias \\`${alias}\\` must be exactly one character`);\n if (usedAliases.has(alias)) throw new TypeError(`Duplicate alias \\`${alias}\\``);\n usedAliases.add(alias);\n }\n }\n\n for (const key of Object.keys(shape)) {\n if (key !== POSITIONALS_KEY && /^no[-A-Z]/.test(key)) {\n throw new TypeError(`Option \\`${key}\\` conflicts with --no- negation`);\n }\n }\n\n return def;\n}\n","import type { $ZodIssue } from \"zod/v4/core\";\nimport type { AnyCommandDef } from \"./command.ts\";\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 | \"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\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}\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 | undefined;\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(\n file: unknown,\n args: unknown,\n options: unknown,\n baseEnv: Environment | undefined,\n): 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(baseEnv, 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,\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.env);\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}\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\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 }\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 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 onData = (chunk: unknown): void => {\n if (typeof chunk === \"string\" || chunk instanceof Uint8Array) keypressInput.write(chunk);\n else fail(\"input-error\", \"Prompt input produced a non-byte value\");\n };\n const cleanup = (): void => {\n keypressInput.removeListener(\"keypress\", onKeypress);\n keypressInput.destroy();\n input.removeListener(\"data\", onData as (...args: never[]) => void);\n input.removeListener(\"end\", onEnd as (...args: never[]) => void);\n input.removeListener(\"close\", onEnd as (...args: never[]) => void);\n input.removeListener(\"error\", onError as (...args: never[]) => void);\n };\n keypressInput.on(\"keypress\", onKeypress);\n input.on(\"data\", onData as (...args: never[]) => void);\n input.on(\"end\", onEnd as (...args: never[]) => void);\n input.on(\"close\", onEnd as (...args: never[]) => void);\n input.on(\"error\", onError as (...args: never[]) => void);\n input.resume();\n void drainKeys().catch((cause: unknown) =>\n fail(\"input-error\", \"Prompt input could not be processed\", cause),\n );\n });\n outcome = { ok: true, value };\n } catch (cause) {\n outcome = {\n ok: false,\n error:\n cause instanceof HackshPromptError\n ? cause\n : promptError(\"input-error\", prompt, \"Prompt input could not be initialized\", cause),\n };\n }\n\n let restoreError: HackshPromptError | undefined;\n try {\n if (rawChanged) input.setRawMode?.(false);\n if (!originallyFlowing) input.pause();\n } catch (cause) {\n restoreError = promptError(\n \"input-error\",\n prompt,\n \"Prompt input could not be restored\",\n cause,\n );\n }\n const closeWithFailure = async (failure: unknown): Promise<never> => {\n try {\n await this.#print(closed(), prompt);\n } catch {\n // Preserve the error that terminated the prompt, including an earlier printer failure.\n } finally {\n this.#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}\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 });\n return createBoundLogger(printer, [...category], {}, prompts);\n}\n","import { createPrettyPrinter } from \"./pretty.ts\";\nimport {\n createJsonPrinter,\n resolveOutputMode,\n type OutputMode,\n type OutputPreference,\n type OutputWriter,\n type Printer,\n type TerminalInput,\n type TerminalOutput,\n} from \"./printer.ts\";\n\nexport interface OutputOptions {\n output?: OutputPreference;\n /** Use Unicode presentation symbols in pretty output. Defaults to true. */\n unicode?: boolean;\n env?: Readonly<Record<string, string | undefined>>;\n stdin?: TerminalInput;\n stdout?: TerminalOutput;\n stderr?: OutputWriter;\n}\n\nfunction consoleWriter(method: \"log\" | \"error\", stream: TerminalOutput): TerminalOutput {\n return {\n get isTTY() {\n return stream.isTTY;\n },\n get columns() {\n return stream.columns;\n },\n write(text) {\n if (!text.endsWith(\"\\n\")) return stream.write(text);\n console[method](text.slice(0, -1));\n },\n };\n}\n\n/** Resolve the automatic output policy and select its printer for one operation. */\nexport function selectOutputPrinter(\n options: OutputOptions,\n override?: Printer,\n resolvedMode?: OutputMode,\n): Printer {\n const stdin = options.stdin ?? process.stdin;\n const stdout = options.stdout ?? process.stdout;\n const stderr = options.stderr ?? process.stderr;\n const mode =\n resolvedMode ??\n resolveOutputMode({\n output: options.output,\n env: options.env,\n inputIsTTY: stdin.isTTY,\n outputIsTTY: stdout.isTTY,\n });\n if (override) return override;\n if (mode.format === \"json\") return createJsonPrinter({ stdout, stderr });\n\n const useConsole = options.stdout === undefined && options.stderr === undefined;\n return createPrettyPrinter({\n color: mode.color,\n unicode: options.unicode ?? true,\n stdout: options.stdout ?? (useConsole ? consoleWriter(\"log\", stdout) : stdout),\n stderr: options.stderr ?? (useConsole ? consoleWriter(\"error\", process.stderr) : stderr),\n });\n}\n","import type { AnyCommandDef } from \"./command.ts\";\nimport { commandEnvPath, optionEnvNames } from \"./environment.ts\";\nimport { summarizeErrors } from \"./errors.ts\";\nimport { aliasList, kebabCase } from \"./options.ts\";\nimport { selectOutputPrinter, type OutputOptions } from \"./output.ts\";\nimport type { Printer, PrintStream } from \"./printer.ts\";\nimport { POSITIONALS_KEY, readArgInfo, readPositionals, schemaShape } from \"./schema.ts\";\n\nfunction details(\n description: string | undefined,\n required: boolean,\n defaultValue: unknown,\n choices: readonly string[] | undefined,\n envName?: string,\n): string {\n const parts = [description];\n if (choices) parts.push(`(Choices: ${choices.join(\", \")})`);\n if (required) parts.push(\"(Required)\");\n if (defaultValue !== undefined) parts.push(`(Default: ${formatDefault(defaultValue)})`);\n if (envName !== undefined) parts.push(`(Env: ${envName})`);\n return parts.filter(Boolean).join(\" \");\n}\n\nfunction formatDefault(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n return value.toString();\n }\n if (value === null) return \"null\";\n try {\n return JSON.stringify(value) ?? \"undefined\";\n } catch {\n return \"[Unserializable]\";\n }\n}\n\nexport interface UsageArgumentSummary {\n name: string;\n required: boolean;\n variadic: boolean;\n description?: string;\n choices?: readonly string[];\n defaultValue?: unknown;\n}\n\nexport interface UsageOptionSummary {\n name: string;\n flags: readonly string[];\n takesValue: boolean;\n /** Whether the long flag also accepts a `--no-` prefixed form. */\n negatable: boolean;\n valueName?: string;\n required: boolean;\n description?: string;\n choices?: readonly string[];\n defaultValue?: unknown;\n env?: string;\n}\n\nexport interface UsageCommandSummary {\n name: string;\n description?: string;\n}\n\n/** A schema-free description of the useful help metadata for a command. */\nexport interface UsageSummary {\n name: string;\n heading?: string;\n version?: string;\n description?: string;\n synopsis: string;\n arguments: readonly UsageArgumentSummary[];\n options: readonly UsageOptionSummary[];\n commands: readonly UsageCommandSummary[];\n}\n\nfunction heading(command: AnyCommandDef): string | undefined {\n const identity = command.name\n ? `${command.name}${command.version ? ` v${command.version}` : \"\"}`\n : command.version\n ? `v${command.version}`\n : undefined;\n if (command.description && identity) return `${command.description} (${identity})`;\n return command.description ?? identity;\n}\n\n/** Build a serializable help summary without retaining command or schema objects. */\nexport function summarizeUsage(command: AnyCommandDef): UsageSummary {\n const shape = command.args ? schemaShape(command.args) : {};\n const positionals = readPositionals(shape);\n const positionalItems = positionals?.items ?? [];\n const syntax = positionalItems.map(({ schema, label }) =>\n readArgInfo(schema).required ? `<${label}>` : `[${label}]`,\n );\n if (positionals?.rest) syntax.push(`[${positionals.rest.label}...]`);\n if (command.subCommands && Object.keys(command.subCommands).length > 0) syntax.push(\"<COMMAND>\");\n\n const args: UsageArgumentSummary[] = positionalItems.map(({ schema, label }) => {\n const info = readArgInfo(schema);\n return {\n name: label,\n required: info.required,\n variadic: false,\n ...(info.description === undefined ? {} : { description: info.description }),\n ...(info.choices === undefined ? {} : { choices: info.choices }),\n ...(info.defaultValue === undefined\n ? {}\n : { defaultValue: summarizeErrors(info.defaultValue) }),\n };\n });\n if (positionals?.rest) {\n const info = readArgInfo(positionals.rest.schema);\n args.push({\n name: positionals.rest.label,\n required: false,\n variadic: true,\n ...(info.description === undefined ? {} : { description: info.description }),\n ...(info.choices === undefined ? {} : { choices: info.choices }),\n });\n }\n\n const envNames = optionEnvNames(command, commandEnvPath(command));\n const options = Object.entries(shape)\n .filter(([key]) => key !== POSITIONALS_KEY)\n .map(([key, schema]): UsageOptionSummary => {\n const info = readArgInfo(schema);\n const argOptions = command.argOptions?.[key];\n const aliases = argOptions?.alias\n ? aliasList(argOptions.alias).map((item) => `-${item}`)\n : [];\n const name = kebabCase(key);\n const valueName = argOptions?.valueName ?? name;\n const envName = envNames.get(key);\n return {\n name,\n flags: [...aliases, `--${name}`],\n takesValue: info.takesValue,\n negatable: !info.takesValue,\n required: info.required,\n ...(info.takesValue ? { valueName } : {}),\n ...(info.description === undefined ? {} : { description: info.description }),\n ...(info.choices === undefined ? {} : { choices: info.choices }),\n ...(info.defaultValue === undefined\n ? {}\n : { defaultValue: summarizeErrors(info.defaultValue) }),\n ...(envName === undefined ? {} : { env: envName }),\n };\n });\n\n const commands = Object.entries(command.subCommands ?? {})\n .filter(([, child]) => !child.hidden)\n .map(([name, child]) => ({\n name,\n ...(child.description === undefined ? {} : { description: child.description }),\n }));\n const name = command.name ?? \"command\";\n const title = heading(command);\n return {\n name,\n ...(title === undefined ? {} : { heading: title }),\n ...(command.version === undefined ? {} : { version: command.version }),\n ...(command.description === undefined ? {} : { description: command.description }),\n synopsis: `${name} [OPTIONS]${syntax.length ? ` ${syntax.join(\" \")}` : \"\"}`,\n arguments: args,\n options,\n commands,\n };\n}\n\nfunction formatUsage(summary: UsageSummary): string {\n const lines: string[] = [];\n if (summary.heading) lines.push(summary.heading, \"\");\n lines.push(`USAGE ${summary.synopsis}`);\n\n if (summary.arguments.length > 0) {\n lines.push(\"\", \"ARGUMENTS\", \"\");\n for (const argument of summary.arguments) {\n lines.push(\n ` ${argument.name}${argument.variadic ? \"...\" : \"\"} ${details(argument.description, argument.required, argument.defaultValue, argument.choices)}`.trimEnd(),\n );\n }\n }\n\n if (summary.options.length > 0) {\n lines.push(\"\", \"OPTIONS\", \"\");\n for (const option of summary.options) {\n const flags = option.flags.map((flag) => {\n if (!flag.startsWith(\"--\")) return flag;\n if (option.takesValue) return `${flag}=<${option.valueName}>`;\n if (option.negatable) return `--[no-]${flag.slice(2)}`;\n return flag;\n });\n lines.push(\n ` ${flags.join(\", \")} ${details(option.description, option.required, option.defaultValue, option.choices, option.env)}`.trimEnd(),\n );\n }\n }\n\n if (summary.commands.length > 0) {\n lines.push(\"\", \"COMMANDS\", \"\");\n for (const command of summary.commands) {\n lines.push(` ${command.name} ${command.description ?? \"\"}`.trimEnd());\n }\n }\n return lines.join(\"\\n\");\n}\n\nexport type UsageWriter = (text: string) => void | Promise<void>;\n\nexport interface ShowUsageOptions extends OutputOptions {\n write?: UsageWriter;\n printer?: Printer;\n stream?: PrintStream;\n}\n\nexport type UsageOutput = Required<Pick<ShowUsageOptions, \"write\">>;\n\nexport type ShowUsageCallback = (\n command: AnyCommandDef,\n output: UsageOutput,\n) => void | Promise<void>;\n\n/** Generate usage text without writing to stdout or stderr. */\nexport async function renderUsage(command: AnyCommandDef): Promise<string> {\n return formatUsage(summarizeUsage(command));\n}\n\n/** Generate and write usage text, awaiting asynchronous writers. */\nexport async function showUsage(\n command: AnyCommandDef,\n options: ShowUsageOptions = {},\n): Promise<void> {\n const usage = summarizeUsage(command);\n const text = formatUsage(usage);\n if (options.write) return options.write(text);\n const printer = options.printer ?? selectOutputPrinter(options);\n return printer.print({\n type: \"usage\",\n usage,\n text,\n stream: options.stream ?? \"stdout\",\n });\n}\n","import type { ArgsSchema } from \"./schema.ts\";\nimport type { AnyCommandDef, CommandDef } from \"./command.ts\";\nimport { assertUniqueEnvNames, commandEnvPath, registerCommandPath } from \"./environment.ts\";\nimport { HackshPromptError, summarizeError, HackshUsageError } from \"./errors.ts\";\nimport { createExec, type ExecContext } from \"./exec.ts\";\nimport { createLogger } from \"./logger.ts\";\nimport {\n parseCommandArgs,\n tokenizedBefore,\n tokenizeCommandArgs,\n type TokenizedCommandArgs,\n} from \"./parser.ts\";\nimport {\n createJsonPrinter,\n createPrintQueue,\n resolveOutputMode,\n type 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 printer: Printer,\n loggerOptions: Parameters<typeof createLogger>[2],\n execContext: ExecContext,\n): Promise<unknown> {\n const env = execContext.env ?? process.env;\n const resolved = resolveCommand(root, argv);\n if (resolved.segments[0]?.tokenized.version) {\n await printer.print({ type: \"version\", version: root.version ?? \"\" });\n return undefined;\n }\n if (resolved.segments.some(({ tokenized }) => tokenized.help)) {\n await printUsage(displayUsage, resolved.command, printer, \"stdout\");\n return undefined;\n }\n\n for (const parent of resolved.parents) {\n await parseCommandArgs(\n parent.command,\n parent.rawArgs,\n parent.tokenized,\n env,\n commandEnvPath(parent.command),\n );\n }\n const parsed = await parseCommandArgs(\n resolved.command,\n resolved.rawArgs,\n resolved.tokenized,\n env,\n commandEnvPath(resolved.command),\n );\n if (!resolved.command.run) {\n throw new HackshUsageError(\"No command specified\", resolved.command);\n }\n const category = resolved.segments.flatMap(({ command }) =>\n command.name === undefined ? [] : [command.name],\n );\n return resolved.command.run({\n ...parsed,\n cmd: resolved.command,\n rawArgs: resolved.rawArgs,\n logger: createLogger(printer, category, loggerOptions),\n exec: createExec(execContext),\n });\n}\n\nfunction printUsage(\n displayUsage: ShowUsageCallback,\n command: AnyCommandDef,\n printer: Printer,\n stream: PrintStream,\n): void | Promise<void> {\n return displayUsage(command, {\n write: (text) => printer.print({ type: \"usage\", usage: summarizeUsage(command), text, stream }),\n });\n}\n\nexport interface RunCommandOptions extends OutputOptions {\n printer?: Printer;\n showUsage?: ShowUsageCallback;\n}\n\ninterface PreparedOutput extends PrintQueue {\n 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\nfunction invocationExec(output: PreparedOutput, env: ExecContext[\"env\"]): ExecContext {\n return {\n env,\n mode: { format: output.format, interactive: output.interactive },\n print: (event) => output.printer.print(event),\n terminal: output.terminal,\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.printer,\n {\n interactive: output.interactive,\n input: output.input,\n printPrompt: (event) => output.printChecked(event),\n terminal: output.terminal,\n },\n invocationExec(output, options.env),\n );\n } finally {\n await output.drain();\n }\n}\n\nexport interface RunMainOptions extends OutputOptions {\n onError?: (error: unknown) => void | Promise<void>;\n argv?: string[];\n printer?: Printer;\n showUsage?: ShowUsageCallback;\n}\n\nasync function drainAndExit(output: PrintQueue, code = 1): Promise<never> {\n try {\n await output.drain();\n } finally {\n process.exit(code);\n }\n}\n\nfunction commandErrorExitCode(error: unknown): number {\n return error instanceof HackshPromptError && error.reason === \"cancelled\" ? 130 : 1;\n}\n\nasync function reportOutputSetupError(error: unknown, options: RunMainOptions): Promise<never> {\n if (options.onError) {\n await options.onError(error);\n return drainAndExit(createPrintQueue(options.printer ?? { print: () => undefined }));\n }\n\n const output = createPrintQueue(\n options.printer ??\n createJsonPrinter({\n stdout: options.stdout ?? process.stdout,\n stderr: options.stderr ?? process.stderr,\n }),\n );\n await output.printer.print({ type: \"error\", error: summarizeError(error) });\n return drainAndExit(output);\n}\n\nexport async function runMain<S extends ArgsSchema>(\n command: CommandDef<S>,\n options: RunMainOptions = {},\n): Promise<void> {\n const displayUsage = options.showUsage ?? showUsage;\n let output: PreparedOutput;\n try {\n output = prepareOutput(options, options.env ?? process.env);\n } catch (error) {\n return reportOutputSetupError(error, options);\n }\n try {\n await executeCommand(\n command,\n options.argv ?? process.argv.slice(2),\n displayUsage,\n output.printer,\n {\n interactive: output.interactive,\n input: output.input,\n printPrompt: (event) => output.printChecked(event),\n terminal: output.terminal,\n },\n invocationExec(output, options.env),\n );\n } catch (error) {\n if (options.onError) {\n await options.onError(error);\n return drainAndExit(output, commandErrorExitCode(error));\n }\n try {\n if (error instanceof HackshUsageError) {\n await output.printer.print({ type: \"error\", error: summarizeError(error) });\n await printUsage(displayUsage, error.command, output.printer, \"stderr\");\n } else {\n await output.printer.print({\n type: \"error\",\n error: summarizeError(error),\n });\n }\n } finally {\n await drainAndExit(output, commandErrorExitCode(error));\n }\n }\n await output.drain();\n}\n\nexport function createMain<S extends ArgsSchema>(\n command: CommandDef<S>,\n options: RunMainOptions = {},\n): (argv?: string[]) => Promise<void> {\n return (argv) => runMain(command, argv === undefined ? options : { ...options, argv });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["#result","safeString","parseNodeArgs","#owner","details","#interactive","#inputValue","#printEvent","#bufferedKeys","#terminal","#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}\n\nexport interface CommandDef<S extends ArgsSchema = EmptyArgs> {\n name?: string;\n version?: string;\n description?: string;\n hidden?: boolean;\n args?: S;\n argOptions?: ArgOptionsMap<S>;\n subCommands?: Record<string, CommandDef<ArgsSchema>>;\n run?(context: CommandContext<S>): unknown;\n}\n\nexport type AnyCommandDef = CommandDef<ArgsSchema>;\n\nexport function defineCommand<S extends ArgsSchema = EmptyArgs>(def: CommandDef<S>): CommandDef<S> {\n const shape = def.args ? schemaShape(def.args) : {};\n const positionals = readPositionals(shape);\n\n if (positionals) {\n let sawOptional = false;\n for (const { schema, label } of positionals.items) {\n const info = readArgInfo(schema);\n if (isArrayInput(schema)) {\n throw new TypeError(\n `Positional argument \\`${label}\\` cannot be an array; use a tuple rest`,\n );\n }\n if (!info.takesValue) {\n throw new TypeError(`Boolean argument \\`${label}\\` cannot be positional`);\n }\n if (sawOptional && info.required) {\n throw new TypeError(\n `Required positional \\`${label}\\` cannot follow an optional positional`,\n );\n }\n sawOptional ||= !info.required;\n }\n if (def.subCommands && Object.keys(def.subCommands).length > 0) {\n throw new TypeError(\"A command cannot define both positional arguments and subcommands\");\n }\n }\n\n const usedAliases = new Set<string>();\n for (const [key, options] of Object.entries(def.argOptions ?? {})) {\n if (key === POSITIONALS_KEY) {\n throw new TypeError(\"Positional arguments cannot have argument options\");\n }\n const schema = shape[key];\n if (!schema) throw new TypeError(`Unknown argument options key \\`${key}\\``);\n if (options?.env !== undefined) {\n if (options.env === \"\") {\n throw new TypeError(`Environment variable name for \\`${key}\\` cannot be empty`);\n }\n if (isArrayInput(schema)) {\n throw new TypeError(\n `Option \\`${key}\\` cannot use an environment variable because it accepts an array`,\n );\n }\n if (isObjectInput(schema)) {\n throw new TypeError(\n `Option \\`${key}\\` cannot use an environment variable because it accepts an object`,\n );\n }\n }\n if (options?.alias === undefined) continue;\n for (const alias of aliasList(options.alias)) {\n if (alias.length !== 1)\n throw new TypeError(`Alias \\`${alias}\\` must be exactly one character`);\n if (usedAliases.has(alias)) throw new TypeError(`Duplicate alias \\`${alias}\\``);\n usedAliases.add(alias);\n }\n }\n\n for (const key of Object.keys(shape)) {\n if (key !== POSITIONALS_KEY && /^no[-A-Z]/.test(key)) {\n throw new TypeError(`Option \\`${key}\\` conflicts with --no- negation`);\n }\n }\n\n return def;\n}\n","import type { $ZodIssue } from \"zod/v4/core\";\nimport type { AnyCommandDef } from \"./command.ts\";\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 | \"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\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}\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 | undefined;\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(\n file: unknown,\n args: unknown,\n options: unknown,\n baseEnv: Environment | undefined,\n): 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(baseEnv, 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,\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.env);\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}\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\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 }\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 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 onData = (chunk: unknown): void => {\n if (typeof chunk === \"string\" || chunk instanceof Uint8Array) keypressInput.write(chunk);\n else fail(\"input-error\", \"Prompt input produced a non-byte value\");\n };\n const cleanup = (): void => {\n keypressInput.removeListener(\"keypress\", onKeypress);\n keypressInput.destroy();\n input.removeListener(\"data\", onData as (...args: never[]) => void);\n input.removeListener(\"end\", onEnd as (...args: never[]) => void);\n input.removeListener(\"close\", onEnd as (...args: never[]) => void);\n input.removeListener(\"error\", onError as (...args: never[]) => void);\n };\n keypressInput.on(\"keypress\", onKeypress);\n input.on(\"data\", onData as (...args: never[]) => void);\n input.on(\"end\", onEnd as (...args: never[]) => void);\n input.on(\"close\", onEnd as (...args: never[]) => void);\n input.on(\"error\", onError as (...args: never[]) => void);\n input.resume();\n void drainKeys().catch((cause: unknown) =>\n fail(\"input-error\", \"Prompt input could not be processed\", cause),\n );\n });\n outcome = { ok: true, value };\n } catch (cause) {\n outcome = {\n ok: false,\n error:\n cause instanceof HackshPromptError\n ? cause\n : promptError(\"input-error\", prompt, \"Prompt input could not be initialized\", cause),\n };\n }\n\n let restoreError: HackshPromptError | undefined;\n try {\n if (rawChanged) input.setRawMode?.(false);\n if (!originallyFlowing) input.pause();\n } catch (cause) {\n restoreError = promptError(\n \"input-error\",\n prompt,\n \"Prompt input could not be restored\",\n cause,\n );\n }\n const closeWithFailure = async (failure: unknown): Promise<never> => {\n try {\n await this.#print(closed(), prompt);\n } catch {\n // Preserve the error that terminated the prompt, including an earlier printer failure.\n } finally {\n this.#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}\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 });\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 type { ArgsSchema } from \"./schema.ts\";\nimport type { AnyCommandDef, CommandDef } from \"./command.ts\";\nimport { assertUniqueEnvNames, commandEnvPath, registerCommandPath } from \"./environment.ts\";\nimport { HackshPromptError, summarizeError, HackshUsageError } from \"./errors.ts\";\nimport { 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 printer: Printer,\n loggerOptions: Parameters<typeof createLogger>[2],\n execContext: ExecContext,\n fallbackVersion: () => Promise<string | undefined> = async () => undefined,\n): Promise<unknown> {\n const env = execContext.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 env,\n commandEnvPath(parent.command),\n );\n }\n const parsed = await parseCommandArgs(\n resolved.command,\n resolved.rawArgs,\n resolved.tokenized,\n env,\n commandEnvPath(resolved.command),\n );\n if (!resolved.command.run) {\n throw new HackshUsageError(\"No command specified\", resolved.command);\n }\n const category = resolved.segments.flatMap(({ command }) =>\n command.name === undefined ? [] : [command.name],\n );\n return resolved.command.run({\n ...parsed,\n cmd: resolved.command,\n rawArgs: resolved.rawArgs,\n logger: createLogger(printer, category, loggerOptions),\n exec: createExec(execContext),\n });\n}\n\nfunction printUsage(\n displayUsage: ShowUsageCallback,\n command: AnyCommandDef,\n printer: Printer,\n stream: PrintStream,\n): void | Promise<void> {\n return displayUsage(command, {\n write: (text) => printer.print({ type: \"usage\", usage: summarizeUsage(command), text, stream }),\n });\n}\n\nexport interface RunCommandOptions extends OutputOptions {\n printer?: Printer;\n showUsage?: ShowUsageCallback;\n}\n\ninterface PreparedOutput extends PrintQueue {\n 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\nfunction invocationExec(output: PreparedOutput, env: ExecContext[\"env\"]): ExecContext {\n return {\n env,\n mode: { format: output.format, interactive: output.interactive },\n print: (event) => output.printer.print(event),\n terminal: output.terminal,\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.printer,\n {\n interactive: output.interactive,\n input: output.input,\n printPrompt: (event) => output.printChecked(event),\n terminal: output.terminal,\n },\n invocationExec(output, options.env),\n );\n } finally {\n await output.drain();\n }\n}\n\nexport interface RunMainOptions extends OutputOptions {\n onError?: (error: unknown) => void | Promise<void>;\n argv?: string[];\n printer?: Printer;\n showUsage?: ShowUsageCallback;\n}\n\nasync function drainAndExit(output: PrintQueue, code = 1): Promise<never> {\n try {\n await output.drain();\n } finally {\n process.exit(code);\n }\n}\n\nfunction commandErrorExitCode(error: unknown): number {\n return error instanceof HackshPromptError && error.reason === \"cancelled\" ? 130 : 1;\n}\n\nasync function reportOutputSetupError(error: unknown, options: RunMainOptions): Promise<never> {\n if (options.onError) {\n await options.onError(error);\n return drainAndExit(createPrintQueue(options.printer ?? { print: () => undefined }));\n }\n\n const output = createPrintQueue(\n options.printer ??\n createJsonPrinter({\n stdout: options.stdout ?? process.stdout,\n stderr: options.stderr ?? process.stderr,\n }),\n );\n await output.printer.print({ type: \"error\", error: summarizeError(error) });\n return drainAndExit(output);\n}\n\nexport async function runMain<S extends ArgsSchema>(\n command: CommandDef<S>,\n options: RunMainOptions = {},\n): Promise<void> {\n const displayUsage = options.showUsage ?? showUsage;\n let output: PreparedOutput;\n try {\n output = prepareOutput(options, options.env ?? process.env);\n } catch (error) {\n return reportOutputSetupError(error, options);\n }\n try {\n await executeCommand(\n command,\n options.argv ?? process.argv.slice(2),\n displayUsage,\n output.printer,\n {\n interactive: output.interactive,\n input: output.input,\n printPrompt: (event) => output.printChecked(event),\n terminal: output.terminal,\n },\n invocationExec(output, options.env),\n () => findPackageVersion(process.argv[1]),\n );\n } catch (error) {\n if (options.onError) {\n await options.onError(error);\n return drainAndExit(output, commandErrorExitCode(error));\n }\n try {\n if (error instanceof HackshUsageError) {\n await output.printer.print({ type: \"error\", error: summarizeError(error) });\n await printUsage(displayUsage, error.command, output.printer, \"stderr\");\n } else {\n await output.printer.print({\n type: \"error\",\n error: summarizeError(error),\n });\n }\n } finally {\n await drainAndExit(output, commandErrorExitCode(error));\n }\n }\n await output.drain();\n}\n\nexport function createMain<S extends ArgsSchema>(\n command: CommandDef<S>,\n options: RunMainOptions = {},\n): (argv?: string[]) => Promise<void> {\n return (argv) => runMain(command, argv === undefined ? options : { ...options, argv });\n}\n"],"mappings":"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"}
|