adb-ready 0.0.1-alpha.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 +65 -0
- package/dist/cli.js +2632 -0
- package/dist/cli.js.map +31 -0
- package/package.json +67 -0
- package/schema/config-v1.schema.json +58 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cli.ts", "../src/cli/main.ts", "../src/app/commands.ts", "../src/adb/client.ts", "../src/platform/process-runner.ts", "../src/adb/parsers.ts", "../src/domain/contracts.ts", "../src/core/event-bus.ts", "../src/core/redaction.ts", "../src/domain/problems.ts", "../src/platform/executable.ts", "../src/platform/runtime.ts", "../src/config/loader.ts", "../src/ui/ascii-scene.ts", "../src/ui/style.ts", "../src/ui/select.ts", "../src/ui/home.ts", "../src/ui/spinner.ts", "../src/ui/progress-renderer.ts", "../src/ui/result-renderer.ts", "../src/ui/terminal.ts", "../src/cli/arguments.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"#!/usr/bin/env node\n\nimport process from \"node:process\";\nimport { processIo, runCli } from \"./cli/main.js\";\n\nconst controller = new AbortController();\nconst abort = () => controller.abort();\nprocess.once(\"SIGINT\", abort);\nprocess.once(\"SIGTERM\", abort);\n\ntry {\n process.exitCode = await runCli(process.argv.slice(2), processIo(), {}, controller.signal);\n} finally {\n process.removeListener(\"SIGINT\", abort);\n process.removeListener(\"SIGTERM\", abort);\n}\n",
|
|
6
|
+
"import { randomUUID } from \"node:crypto\";\nimport process from \"node:process\";\nimport manifest from \"../../package.json\" with { type: \"json\" };\nimport {\n type CommandDependencies,\n type CommandExecution,\n type DevicesData,\n runDevices,\n runDoctor,\n} from \"../app/commands.js\";\nimport { loadConfig } from \"../config/loader.js\";\nimport type { ConfigError, ConfigValues } from \"../config/types.js\";\nimport { EventBus } from \"../core/event-bus.js\";\nimport { redactText } from \"../core/redaction.js\";\nimport {\n ExitCode,\n type Problem,\n type ResultEnvelope,\n SCHEMA_VERSION,\n} from \"../domain/contracts.js\";\nimport { ProblemCode } from \"../domain/problems.js\";\nimport { clearInteractiveScreen, showHomeScreen } from \"../ui/home.js\";\nimport { ProgressRenderer } from \"../ui/progress-renderer.js\";\nimport { NdjsonEventRenderer, renderResult } from \"../ui/result-renderer.js\";\nimport { type SelectInput, selectOne } from \"../ui/select.js\";\nimport type { TextSink } from \"../ui/spinner.js\";\nimport { resolveTerminalCapabilities, type TerminalCapabilities } from \"../ui/terminal.js\";\nimport { type CliOptions, type OutputFormat, parseArguments } from \"./arguments.js\";\n\nexport const VERSION = manifest.version;\n\nexport const HELP = `ADB Ready\n\nMake an Android target ready, then keep the development session working.\n\nUsage:\n adb-ready [command] [options]\n adbr [command] [options]\n\nCommands:\n doctor Inspect the local ADB environment\n devices List visible Android targets\n help [doctor|devices] Show help\n version Show version\n\nOutput:\n --format FORMAT human, plain, json, or ndjson\n --json Alias for --format json\n --quiet Hide successful human output\n --verbose Include diagnostic evidence\n --[no-]color Override color detection\n --[no-]unicode Override Unicode detection\n --[no-]animation Override motion detection\n\nExecution:\n --non-interactive Never prompt or control the terminal\n --timeout DURATION Positive duration such as 500ms, 5s, or 1m\n --adb PATH Use an explicit ADB executable\n --adb-host HOST Use an explicit ADB server host\n --adb-port PORT Use an explicit ADB server port\n --config PATH Use an explicit project configuration file\n --select Interactively select from listed devices\n\nOther:\n -h, --help Show help\n -V, --version Show version\n`;\n\nconst COMMAND_HELP = {\n doctor: `Usage: adb-ready doctor [options]\n\nRuns read-only host, ADB capability, server, and target diagnostics.\n`,\n devices: `Usage: adb-ready devices [options]\n\nLists every target visible to ADB. Add --select to open the keyboard picker.\n`,\n} as const;\n\nexport interface CliInput extends SelectInput {\n isTTY?: boolean;\n}\n\nexport interface CliOutput extends TextSink {\n isTTY?: boolean;\n columns?: number;\n}\n\nexport interface CliIo {\n input: CliInput;\n output: CliOutput;\n error: CliOutput;\n cwd: string;\n env: NodeJS.ProcessEnv;\n}\n\nexport interface CliDependencies extends CommandDependencies {\n loadConfig?: typeof loadConfig;\n}\n\nfunction inferredFormat(argv: readonly string[]): OutputFormat {\n let format: OutputFormat = \"human\";\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index];\n if (argument === \"--json\") {\n format = \"json\";\n } else if (argument?.startsWith(\"--format=\")) {\n const value = argument.slice(\"--format=\".length);\n if (value === \"human\" || value === \"plain\" || value === \"json\" || value === \"ndjson\") {\n format = value;\n }\n } else if (argument === \"--format\") {\n const value = argv[index + 1];\n if (value === \"human\" || value === \"plain\" || value === \"json\" || value === \"ndjson\") {\n format = value;\n }\n index += 1;\n }\n }\n return format;\n}\n\nfunction capabilities(\n options: CliOptions | undefined,\n values: ConfigValues,\n io: CliIo,\n target: \"error\" | \"output\",\n fallbackFormat: OutputFormat,\n): TerminalCapabilities {\n const stream = target === \"error\" ? io.error : io.output;\n return resolveTerminalCapabilities({\n format: options?.format ?? fallbackFormat,\n nonInteractive: options?.nonInteractive === true || values.interactive === false,\n ...(values.color === undefined ? {} : { color: values.color }),\n ...(values.unicode === undefined ? {} : { unicode: values.unicode }),\n ...(values.animation === undefined ? {} : { animation: values.animation }),\n ...(values.interactive === undefined ? {} : { interactive: values.interactive }),\n env: io.env,\n inputIsTTY: io.input.isTTY === true,\n outputIsTTY: stream.isTTY === true,\n ...(stream.columns === undefined ? {} : { columns: stream.columns }),\n });\n}\n\nfunction failureResult(\n command: string,\n problems: Problem[],\n dependencies: CliDependencies,\n): ResultEnvelope<null> {\n const clock = dependencies.clock ?? (() => new Date());\n const now = clock();\n const commandId = (dependencies.idFactory ?? randomUUID)();\n return {\n schemaVersion: SCHEMA_VERSION,\n command,\n commandId,\n ok: false,\n startedAt: now.toISOString(),\n finishedAt: now.toISOString(),\n durationMs: 0,\n data: null,\n problems: problems.map((problem) => ({\n ...problem,\n correlation: { ...problem.correlation, commandId },\n })),\n };\n}\n\nfunction inputProblem(code: string, summary: string, detail: string, commandId = \"cli\"): Problem {\n return {\n code,\n category: \"input.cli\",\n severity: \"error\",\n summary,\n detail,\n retryable: true,\n evidence: [],\n actions: [],\n correlation: { commandId },\n };\n}\n\nfunction configProblems(errors: readonly ConfigError[]): Problem[] {\n return errors.map((error) => ({\n code: error.code,\n category: \"input.configuration\",\n severity: \"error\",\n summary: error.message,\n detail: `Invalid ${error.source} configuration at ${error.path}.`,\n retryable: true,\n evidence: [\n { source: \"configuration\", field: \"path\", value: error.path },\n ...(error.location === undefined\n ? []\n : [\n {\n source: \"configuration\",\n field: \"location\",\n value: redactText(error.location).value,\n } as const,\n ]),\n ],\n actions: [],\n correlation: { commandId: \"configuration\" },\n }));\n}\n\nfunction renderFailure(result: ResultEnvelope<null>, format: OutputFormat, io: CliIo): void {\n renderResult(result, {\n format,\n capabilities: capabilities(undefined, {}, io, \"output\", format),\n sink: format === \"human\" ? io.error : io.output,\n verbose: false,\n });\n}\n\nfunction cliConfig(options: CliOptions): ConfigValues {\n return {\n ...(options.adbPath === undefined ? {} : { adbPath: options.adbPath }),\n ...(options.adbHost === undefined ? {} : { adbHost: options.adbHost }),\n ...(options.adbPort === undefined ? {} : { adbPort: options.adbPort }),\n ...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs }),\n ...(options.color === undefined ? {} : { color: options.color }),\n ...(options.unicode === undefined ? {} : { unicode: options.unicode }),\n ...(options.animation === undefined ? {} : { animation: options.animation }),\n ...(options.nonInteractive ? { interactive: false } : {}),\n };\n}\n\nfunction selectionProblem(\n result: SelectResultKind,\n commandId: string,\n): { problem: Problem; exitCode: ExitCode } {\n if (result === \"interrupt\" || result === \"signal\") {\n return {\n problem: inputProblem(\n ProblemCode.OperationInterrupted,\n \"Target selection was interrupted.\",\n \"Run the command again when you are ready to select a target.\",\n commandId,\n ),\n exitCode: ExitCode.Interrupted,\n };\n }\n if (result === \"unavailable\") {\n return {\n problem: inputProblem(\n ProblemCode.InteractiveSelectionUnavailable,\n \"Interactive target selection is unavailable.\",\n \"Run this command in a capable terminal or omit --select.\",\n commandId,\n ),\n exitCode: ExitCode.InvalidInput,\n };\n }\n return {\n problem: inputProblem(\n ProblemCode.TargetSelectionCancelled,\n \"Target selection was cancelled.\",\n \"No target was selected.\",\n commandId,\n ),\n exitCode: ExitCode.InvalidInput,\n };\n}\n\ntype SelectResultKind = \"escape\" | \"interrupt\" | \"signal\" | \"unavailable\";\n\nasync function runInteractiveSession(\n io: CliIo,\n dependencies: CliDependencies,\n terminal: TerminalCapabilities,\n signal?: AbortSignal,\n): Promise<number> {\n let presentation: \"full\" | \"menu\" = \"full\";\n\n while (true) {\n const home = await showHomeScreen({\n version: VERSION,\n input: io.input,\n sink: io.error,\n capabilities: terminal,\n presentation,\n ...(signal === undefined ? {} : { signal }),\n });\n if (home.kind === \"cancelled\") {\n return ExitCode.Interrupted;\n }\n if (home.kind !== \"action\") {\n return ExitCode.InvalidInput;\n }\n if (home.action === \"exit\") {\n return ExitCode.Success;\n }\n\n clearInteractiveScreen(io.error, terminal);\n await runCliInternal([home.action], io, dependencies, signal);\n if (signal?.aborted === true) {\n return ExitCode.Interrupted;\n }\n presentation = \"menu\";\n }\n}\n\nasync function selectDevice(\n execution: CommandExecution<DevicesData>,\n io: CliIo,\n terminal: TerminalCapabilities,\n signal?: AbortSignal,\n): Promise<CommandExecution<DevicesData>> {\n const data = execution.result.data;\n if (data === null) {\n return execution;\n }\n const selectable = data.devices.filter(({ state }) => state === \"device\");\n if (selectable.length === 0) {\n const problem = inputProblem(\n ProblemCode.NoSelectableTarget,\n \"No ready Android target can be selected.\",\n \"Connect or recover a target until ADB reports the device state.\",\n execution.result.commandId,\n );\n return {\n exitCode: ExitCode.Target,\n result: { ...execution.result, ok: false, problems: [...execution.result.problems, problem] },\n };\n }\n\n const selection = await selectOne({\n title: \"Select an Android target\",\n options: data.devices.map((device) => ({\n value: device,\n label: device.model ?? device.serial,\n description: `${device.serial} · ${device.state}`,\n disabled: device.state !== \"device\",\n recommended: selectable.length === 1 && device.serial === selectable[0]?.serial,\n })),\n input: io.input,\n sink: io.error,\n capabilities: terminal,\n ...(signal === undefined ? {} : { signal }),\n });\n\n if (selection.kind === \"selected\") {\n return {\n ...execution,\n result: {\n ...execution.result,\n data: { ...data, selected: selection.value },\n },\n };\n }\n\n const failure = selectionProblem(\n selection.kind === \"unavailable\" ? \"unavailable\" : selection.reason,\n execution.result.commandId,\n );\n return {\n exitCode: failure.exitCode,\n result: {\n ...execution.result,\n ok: false,\n problems: [...execution.result.problems, failure.problem],\n },\n };\n}\n\nasync function runCliInternal(\n argv: readonly string[],\n io: CliIo,\n dependencies: CliDependencies = {},\n signal?: AbortSignal,\n): Promise<number> {\n const fallbackFormat = inferredFormat(argv);\n let effectiveArgv = argv;\n if (argv.length === 0) {\n const homeCapabilities = capabilities(undefined, {}, io, \"error\", \"human\");\n if (homeCapabilities.interactive) {\n return await runInteractiveSession(io, dependencies, homeCapabilities, signal);\n } else {\n effectiveArgv = [\"help\"];\n }\n }\n\n const parsed = parseArguments(effectiveArgv);\n if (!parsed.ok) {\n const failure = failureResult(\n \"cli\",\n [inputProblem(parsed.code, parsed.message, \"Run adb-ready --help for usage.\")],\n dependencies,\n );\n renderFailure(failure, fallbackFormat, io);\n return ExitCode.InvalidInput;\n }\n\n const options = parsed.options;\n if (options.command === \"help\") {\n io.output.write(options.helpTarget === undefined ? HELP : COMMAND_HELP[options.helpTarget]);\n return ExitCode.Success;\n }\n if (options.command === \"version\") {\n io.output.write(`${VERSION}\\n`);\n return ExitCode.Success;\n }\n\n const loaded = await (dependencies.loadConfig ?? loadConfig)({\n cwd: io.cwd,\n env: io.env,\n ...(options.configPath === undefined ? {} : { projectConfigPath: options.configPath }),\n explicitProjectConfig: options.configPath !== undefined,\n cli: cliConfig(options),\n });\n if (!loaded.ok) {\n const failure = failureResult(options.command, configProblems(loaded.errors), dependencies);\n renderFailure(failure, options.format, io);\n return ExitCode.InvalidInput;\n }\n\n const values = loaded.config.values;\n const errorCapabilities = capabilities(options, values, io, \"error\", options.format);\n const outputCapabilities = capabilities(options, values, io, \"output\", options.format);\n const bus = dependencies.bus ?? new EventBus(dependencies.clock);\n const progress =\n options.format === \"human\" && !options.quiet\n ? new ProgressRenderer({\n bus,\n sink: io.error,\n capabilities: errorCapabilities,\n verbose: options.verbose,\n })\n : undefined;\n const events = options.format === \"ndjson\" ? new NdjsonEventRenderer(bus, io.output) : undefined;\n const commandDependencies = { ...dependencies, bus };\n const config = {\n ...(values.adbPath === undefined ? {} : { adbPath: values.adbPath }),\n ...(values.adbHost === undefined ? {} : { adbHost: values.adbHost }),\n ...(values.adbPort === undefined ? {} : { adbPort: values.adbPort }),\n timeoutMs: values.timeoutMs,\n };\n\n let execution: CommandExecution<DevicesData> | Awaited<ReturnType<typeof runDoctor>>;\n try {\n execution =\n options.command === \"doctor\"\n ? await runDoctor(config, commandDependencies, signal)\n : await runDevices(config, commandDependencies, signal);\n } finally {\n progress?.dispose();\n events?.dispose();\n }\n\n if (options.command === \"devices\" && options.select) {\n execution = await selectDevice(\n execution as CommandExecution<DevicesData>,\n io,\n errorCapabilities,\n signal,\n );\n }\n\n if (options.format !== \"human\" || !options.quiet || !execution.result.ok) {\n const human = options.format === \"human\";\n renderResult(execution.result, {\n format: options.format,\n capabilities: human ? errorCapabilities : outputCapabilities,\n sink: human ? io.error : io.output,\n verbose: options.verbose,\n });\n }\n return execution.exitCode;\n}\n\nexport async function runCli(\n argv: readonly string[],\n io: CliIo,\n dependencies: CliDependencies = {},\n signal?: AbortSignal,\n): Promise<number> {\n try {\n return await runCliInternal(argv, io, dependencies, signal);\n } catch (caught) {\n const message = redactText(caught instanceof Error ? caught.message : String(caught)).value;\n const problem: Problem = {\n code: \"INTERNAL_ERROR\",\n category: \"internal.unexpected\",\n severity: \"error\",\n summary: \"ADB Ready encountered an unexpected internal error.\",\n detail: \"The operation stopped safely. Re-run with --verbose when reporting this issue.\",\n retryable: false,\n evidence: message === \"\" ? [] : [{ source: \"internal\", field: \"message\", value: message }],\n actions: [],\n correlation: { commandId: \"cli\" },\n };\n renderFailure(failureResult(\"cli\", [problem], dependencies), inferredFormat(argv), io);\n return ExitCode.Internal;\n }\n}\n\nexport function processIo(): CliIo {\n return {\n input: process.stdin,\n output: process.stdout,\n error: process.stderr,\n cwd: process.cwd(),\n env: process.env,\n };\n}\n",
|
|
7
|
+
"import { randomUUID } from \"node:crypto\";\nimport { AdbClient } from \"../adb/client.js\";\nimport type { AdbDevice, AdbVersion } from \"../adb/parsers.js\";\nimport { EventBus } from \"../core/event-bus.js\";\nimport { redactText } from \"../core/redaction.js\";\nimport {\n ExitCode,\n type Problem,\n type ResultEnvelope,\n SCHEMA_VERSION,\n} from \"../domain/contracts.js\";\nimport {\n adbNotFoundProblem,\n adbOptionalProbeProblem,\n adbProcessProblem,\n noTargetsProblem,\n ProblemCode,\n problemsForDevices,\n} from \"../domain/problems.js\";\nimport { locateAdb } from \"../platform/executable.js\";\nimport type { ProcessResult, ProcessRunner } from \"../platform/process-runner.js\";\nimport { detectRuntime, type RuntimeInfo } from \"../platform/runtime.js\";\n\nexport interface CommandConfig {\n adbPath?: string;\n adbHost?: string;\n adbPort?: number;\n timeoutMs?: number;\n}\n\nexport interface CommandDependencies {\n bus?: EventBus;\n clock?: () => Date;\n idFactory?: () => string;\n locateAdb?: typeof locateAdb;\n runner?: ProcessRunner;\n runtime?: () => RuntimeInfo;\n}\n\nexport interface CommandExecution<T> {\n result: ResultEnvelope<T>;\n exitCode: ExitCode;\n}\n\nexport interface DoctorData {\n runtime: RuntimeInfo;\n adb: {\n path: string;\n version: Omit<AdbVersion, \"raw\">;\n hostFeatures: string[];\n serverStatus: Record<string, string> | null;\n };\n devices: AdbDevice[];\n}\n\nexport interface DevicesData {\n adbPath: string;\n devices: AdbDevice[];\n selected?: AdbDevice;\n}\n\ninterface CommandContext {\n bus: EventBus;\n clock: () => Date;\n command: string;\n commandId: string;\n started: Date;\n}\n\nfunction processSucceeded(result: ProcessResult): boolean {\n return (\n result.spawnError === undefined && result.exitCode === 0 && !result.timedOut && !result.aborted\n );\n}\n\nfunction exitCodeForProblems(problems: readonly Problem[]): ExitCode {\n const errors = problems.filter(({ severity }) => severity === \"error\");\n if (errors.length === 0) {\n return ExitCode.Success;\n }\n if (errors.some(({ code }) => code === ProblemCode.OperationInterrupted)) {\n return ExitCode.Interrupted;\n }\n if (errors.some(({ category }) => category.startsWith(\"environment.\"))) {\n return ExitCode.Environment;\n }\n if (errors.some(({ category }) => category.startsWith(\"target.\"))) {\n return ExitCode.Target;\n }\n return ExitCode.AdbOperation;\n}\n\nfunction createContext(command: string, dependencies: CommandDependencies): CommandContext {\n const clock = dependencies.clock ?? (() => new Date());\n const commandId = (dependencies.idFactory ?? randomUUID)();\n const bus = dependencies.bus ?? new EventBus(clock);\n const started = clock();\n\n bus.emit({\n type: \"command.started\",\n source: `command.${command}`,\n severity: \"info\",\n message: `Running ${command}`,\n correlation: { commandId },\n });\n\n return { bus, clock, command, commandId, started };\n}\n\nfunction finish<T>(\n context: CommandContext,\n data: T | null,\n problems: Problem[],\n): CommandExecution<T> {\n const finished = context.clock();\n const exitCode = exitCodeForProblems(problems);\n const ok = exitCode === ExitCode.Success;\n const result: ResultEnvelope<T> = {\n schemaVersion: SCHEMA_VERSION,\n command: context.command,\n commandId: context.commandId,\n ok,\n startedAt: context.started.toISOString(),\n finishedAt: finished.toISOString(),\n durationMs: Math.max(0, finished.getTime() - context.started.getTime()),\n data,\n problems,\n };\n\n context.bus.emit({\n type: ok ? \"command.completed\" : \"command.failed\",\n source: `command.${context.command}`,\n severity: ok ? \"info\" : \"error\",\n message: ok ? `${context.command} completed` : `${context.command} failed`,\n correlation: { commandId: context.commandId },\n data: { exitCode, problemCount: problems.length },\n });\n\n return { result, exitCode };\n}\n\nfunction redactedPath(value: string): string {\n return redactText(value).value;\n}\n\nfunction redactedRecord(values: Record<string, string>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(values).map(([key, value]) => [key, redactText(value).value]),\n );\n}\n\nasync function resolveAdb(\n context: CommandContext,\n config: CommandConfig,\n dependencies: CommandDependencies,\n): Promise<string | undefined> {\n const operationId = (dependencies.idFactory ?? randomUUID)();\n const correlation = { commandId: context.commandId, operationId };\n context.bus.emit({\n type: \"operation.started\",\n source: \"host.adb-path\",\n severity: \"info\",\n message: \"Locating ADB\",\n correlation,\n });\n\n const executable = await (dependencies.locateAdb ?? locateAdb)({\n ...(config.adbPath === undefined ? {} : { explicitPath: config.adbPath }),\n });\n\n context.bus.emit({\n type: executable === undefined ? \"operation.failed\" : \"operation.completed\",\n source: \"host.adb-path\",\n severity: executable === undefined ? \"error\" : \"info\",\n message: executable === undefined ? \"ADB was not found\" : \"ADB was found\",\n correlation,\n ...(executable === undefined ? {} : { data: { path: redactedPath(executable) } }),\n });\n\n return executable;\n}\n\nfunction createClient(\n executable: string,\n context: CommandContext,\n config: CommandConfig,\n dependencies: CommandDependencies,\n): AdbClient {\n return new AdbClient({\n executable,\n bus: context.bus,\n correlation: { commandId: context.commandId },\n ...(config.adbHost === undefined ? {} : { host: config.adbHost }),\n ...(config.adbPort === undefined ? {} : { port: config.adbPort }),\n ...(config.timeoutMs === undefined ? {} : { timeoutMs: config.timeoutMs }),\n ...(dependencies.runner === undefined ? {} : { runner: dependencies.runner }),\n ...(dependencies.idFactory === undefined ? {} : { idFactory: dependencies.idFactory }),\n });\n}\n\nfunction operationProblem(\n operation: string,\n observation: { operationId: string; process: ProcessResult },\n commandId: string,\n): Problem {\n return adbProcessProblem(operation, observation.process, {\n commandId,\n operationId: observation.operationId,\n });\n}\n\nexport async function runDoctor(\n config: CommandConfig = {},\n dependencies: CommandDependencies = {},\n signal?: AbortSignal,\n): Promise<CommandExecution<DoctorData>> {\n const context = createContext(\"doctor\", dependencies);\n const problems: Problem[] = [];\n const executable = await resolveAdb(context, config, dependencies);\n if (executable === undefined) {\n problems.push(adbNotFoundProblem({ commandId: context.commandId }, config.adbPath));\n return finish<DoctorData>(context, null, problems);\n }\n\n const client = createClient(executable, context, config, dependencies);\n const version = await client.version(signal);\n if (!processSucceeded(version.process)) {\n problems.push(operationProblem(\"version\", version, context.commandId));\n return finish<DoctorData>(context, null, problems);\n }\n\n const hostFeatures = await client.hostFeatures(signal);\n if (!processSucceeded(hostFeatures.process)) {\n const problem = operationProblem(\"host-features\", hostFeatures, context.commandId);\n if (problem.code === ProblemCode.OperationInterrupted) {\n problems.push(problem);\n return finish<DoctorData>(context, null, problems);\n }\n problems.push(\n adbOptionalProbeProblem(\"host-features\", hostFeatures.process, problem.correlation),\n );\n }\n\n let serverStatus: Record<string, string> | null = null;\n if (processSucceeded(hostFeatures.process) && hostFeatures.value.includes(\"server_status\")) {\n const status = await client.serverStatus(signal);\n if (processSucceeded(status.process)) {\n serverStatus = redactedRecord(status.value);\n } else {\n const problem = operationProblem(\"server-status\", status, context.commandId);\n if (problem.code === ProblemCode.OperationInterrupted) {\n problems.push(problem);\n return finish<DoctorData>(context, null, problems);\n }\n problems.push(adbOptionalProbeProblem(\"server-status\", status.process, problem.correlation));\n }\n }\n\n const devices = await client.devices(signal);\n if (!processSucceeded(devices.process)) {\n problems.push(operationProblem(\"devices\", devices, context.commandId));\n return finish<DoctorData>(context, null, problems);\n }\n\n problems.push(...problemsForDevices(devices.value, { commandId: context.commandId }, \"warning\"));\n if (devices.value.length === 0) {\n problems.push(noTargetsProblem({ commandId: context.commandId }));\n }\n\n const versionData: Omit<AdbVersion, \"raw\"> = {\n ...(version.value.protocolVersion === undefined\n ? {}\n : { protocolVersion: version.value.protocolVersion }),\n ...(version.value.platformToolsVersion === undefined\n ? {}\n : { platformToolsVersion: version.value.platformToolsVersion }),\n ...(version.value.installedAs === undefined\n ? {}\n : { installedAs: redactedPath(version.value.installedAs) }),\n };\n\n return finish(\n context,\n {\n runtime: (dependencies.runtime ?? detectRuntime)(),\n adb: {\n path: redactedPath(executable),\n version: versionData,\n hostFeatures: processSucceeded(hostFeatures.process) ? hostFeatures.value : [],\n serverStatus,\n },\n devices: devices.value,\n },\n problems,\n );\n}\n\nexport async function runDevices(\n config: CommandConfig = {},\n dependencies: CommandDependencies = {},\n signal?: AbortSignal,\n): Promise<CommandExecution<DevicesData>> {\n const context = createContext(\"devices\", dependencies);\n const problems: Problem[] = [];\n const executable = await resolveAdb(context, config, dependencies);\n if (executable === undefined) {\n problems.push(adbNotFoundProblem({ commandId: context.commandId }, config.adbPath));\n return finish<DevicesData>(context, null, problems);\n }\n\n const client = createClient(executable, context, config, dependencies);\n const devices = await client.devices(signal);\n if (!processSucceeded(devices.process)) {\n problems.push(operationProblem(\"devices\", devices, context.commandId));\n return finish<DevicesData>(context, null, problems);\n }\n\n problems.push(...problemsForDevices(devices.value, { commandId: context.commandId }, \"warning\"));\n if (devices.value.length === 0) {\n problems.push(noTargetsProblem({ commandId: context.commandId }));\n }\n\n return finish(context, { adbPath: redactedPath(executable), devices: devices.value }, problems);\n}\n",
|
|
8
|
+
"import { randomUUID } from \"node:crypto\";\nimport type { EventBus } from \"../core/event-bus.js\";\nimport type { Correlation, JsonValue } from \"../domain/contracts.js\";\nimport {\n type ProcessRequest,\n type ProcessResult,\n type ProcessRunner,\n runProcess,\n} from \"../platform/process-runner.js\";\nimport {\n type AdbDevice,\n type AdbVersion,\n parseAdbDevices,\n parseAdbVersion,\n parseFeatureList,\n parseKeyValueLines,\n} from \"./parsers.js\";\n\nexport interface AdbClientOptions {\n executable: string;\n bus: EventBus;\n correlation: Pick<Correlation, \"commandId\">;\n host?: string;\n port?: number;\n timeoutMs?: number;\n runner?: ProcessRunner;\n idFactory?: () => string;\n}\n\nexport interface AdbObservation<T> {\n operationId: string;\n process: ProcessResult;\n value: T;\n}\n\nfunction processMetadata(result: ProcessResult): Record<string, JsonValue> {\n return {\n durationMs: result.durationMs,\n exitCode: result.exitCode,\n signal: result.signal,\n timedOut: result.timedOut,\n aborted: result.aborted,\n stdoutTruncated: result.stdoutTruncated,\n stderrTruncated: result.stderrTruncated,\n ...(result.spawnError === undefined\n ? {}\n : {\n spawnError: {\n ...(result.spawnError.code === undefined ? {} : { code: result.spawnError.code }),\n message: result.spawnError.message,\n },\n }),\n };\n}\n\nexport class AdbClient {\n readonly #options: AdbClientOptions;\n readonly #runner: ProcessRunner;\n readonly #idFactory: () => string;\n\n constructor(options: AdbClientOptions) {\n this.#options = options;\n this.#runner = options.runner ?? runProcess;\n this.#idFactory = options.idFactory ?? randomUUID;\n }\n\n async version(signal?: AbortSignal): Promise<AdbObservation<AdbVersion>> {\n return await this.#observe(\n \"version\",\n \"Checking ADB version\",\n [\"version\"],\n parseAdbVersion,\n signal,\n false,\n );\n }\n\n async hostFeatures(signal?: AbortSignal): Promise<AdbObservation<string[]>> {\n return await this.#observe(\n \"host-features\",\n \"Checking ADB host features\",\n [\"host-features\"],\n parseFeatureList,\n signal,\n );\n }\n\n async serverStatus(signal?: AbortSignal): Promise<AdbObservation<Record<string, string>>> {\n return await this.#observe(\n \"server-status\",\n \"Checking ADB server status\",\n [\"server-status\"],\n parseKeyValueLines,\n signal,\n );\n }\n\n async devices(signal?: AbortSignal): Promise<AdbObservation<AdbDevice[]>> {\n return await this.#observe(\n \"devices\",\n \"Discovering Android targets\",\n [\"devices\", \"-l\"],\n parseAdbDevices,\n signal,\n );\n }\n\n #serverArguments(): string[] {\n return [\n ...(this.#options.host === undefined ? [] : [\"-H\", this.#options.host]),\n ...(this.#options.port === undefined ? [] : [\"-P\", String(this.#options.port)]),\n ];\n }\n\n async #observe<T>(\n operation: string,\n message: string,\n args: string[],\n parse: (output: string) => T,\n signal: AbortSignal | undefined,\n useServerArguments = true,\n ): Promise<AdbObservation<T>> {\n const operationId = this.#idFactory();\n const correlation = { commandId: this.#options.correlation.commandId, operationId };\n const finalArgs = [...(useServerArguments ? this.#serverArguments() : []), ...args];\n\n this.#options.bus.emit({\n type: \"operation.started\",\n source: `adb.${operation}`,\n severity: \"info\",\n message,\n correlation,\n data: { executable: this.#options.executable, args: finalArgs },\n });\n\n const request: ProcessRequest = {\n executable: this.#options.executable,\n args: finalArgs,\n ...(this.#options.timeoutMs === undefined ? {} : { timeoutMs: this.#options.timeoutMs }),\n ...(signal === undefined ? {} : { signal }),\n };\n const result = await this.#runner(request);\n const succeeded =\n result.spawnError === undefined &&\n result.exitCode === 0 &&\n !result.timedOut &&\n !result.aborted;\n\n this.#options.bus.emit({\n type: succeeded ? \"operation.completed\" : \"operation.failed\",\n source: `adb.${operation}`,\n severity: succeeded ? \"info\" : \"error\",\n message: succeeded ? `${message} completed` : `${message} failed`,\n correlation,\n data: processMetadata(result),\n });\n\n return {\n operationId,\n process: result,\n value: parse(result.stdout),\n };\n }\n}\n",
|
|
9
|
+
"import { spawn } from \"node:child_process\";\nimport process from \"node:process\";\n\nexport type ProcessStdio = \"capture\" | \"inherit\";\n\nexport interface ProcessRequest {\n executable: string;\n args?: readonly string[];\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n signal?: AbortSignal;\n timeoutMs?: number;\n killSignal?: NodeJS.Signals;\n stdio?: ProcessStdio;\n maxBufferBytes?: number;\n}\n\nexport interface ProcessResult {\n executable: string;\n args: string[];\n startedAt: string;\n finishedAt: string;\n durationMs: number;\n exitCode: number | null;\n signal: NodeJS.Signals | null;\n stdout: string;\n stderr: string;\n stdoutTruncated: boolean;\n stderrTruncated: boolean;\n timedOut: boolean;\n aborted: boolean;\n spawnError?: {\n code?: string;\n message: string;\n };\n}\n\nexport type ProcessRunner = (request: ProcessRequest) => Promise<ProcessResult>;\n\nconst DEFAULT_MAX_BUFFER_BYTES = 4 * 1024 * 1024;\n\ninterface BoundedCapture {\n append(chunk: Uint8Array): void;\n text(): string;\n readonly truncated: boolean;\n}\n\nfunction createBoundedCapture(maxBytes: number): BoundedCapture {\n const chunks: Uint8Array[] = [];\n let size = 0;\n let truncated = false;\n\n return {\n append(chunk) {\n if (size >= maxBytes) {\n truncated = true;\n return;\n }\n\n const remaining = maxBytes - size;\n const accepted = chunk.byteLength <= remaining ? chunk : chunk.subarray(0, remaining);\n chunks.push(accepted);\n size += accepted.byteLength;\n if (accepted.byteLength !== chunk.byteLength) {\n truncated = true;\n }\n },\n text() {\n const merged = new Uint8Array(size);\n let offset = 0;\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(merged);\n },\n get truncated() {\n return truncated;\n },\n };\n}\n\nexport async function runProcess(request: ProcessRequest): Promise<ProcessResult> {\n const args = [...(request.args ?? [])];\n const started = new Date();\n const startedAt = started.toISOString();\n const maxBufferBytes = request.maxBufferBytes ?? DEFAULT_MAX_BUFFER_BYTES;\n\n if (!Number.isSafeInteger(maxBufferBytes) || maxBufferBytes < 0) {\n throw new RangeError(\"maxBufferBytes must be a non-negative safe integer\");\n }\n if (\n request.timeoutMs !== undefined &&\n (!Number.isSafeInteger(request.timeoutMs) || request.timeoutMs < 0)\n ) {\n throw new RangeError(\"timeoutMs must be a non-negative safe integer\");\n }\n\n const stdout = createBoundedCapture(maxBufferBytes);\n const stderr = createBoundedCapture(maxBufferBytes);\n const stdio = request.stdio ?? \"capture\";\n let timedOut = false;\n let aborted = request.signal?.aborted ?? false;\n let spawnError: ProcessResult[\"spawnError\"];\n\n return await new Promise<ProcessResult>((resolve) => {\n const child = spawn(request.executable, args, {\n cwd: request.cwd,\n env: { ...process.env, ...request.env },\n shell: false,\n stdio: stdio === \"inherit\" ? \"inherit\" : [\"ignore\", \"pipe\", \"pipe\"],\n windowsHide: true,\n });\n\n if (stdio === \"capture\") {\n child.stdout?.on(\"data\", (chunk: Uint8Array) => stdout.append(chunk));\n child.stderr?.on(\"data\", (chunk: Uint8Array) => stderr.append(chunk));\n }\n\n const killSignal = request.killSignal ?? \"SIGTERM\";\n const abort = () => {\n aborted = true;\n if (child.exitCode === null && child.signalCode === null) {\n child.kill(killSignal);\n }\n };\n\n request.signal?.addEventListener(\"abort\", abort, { once: true });\n if (request.signal?.aborted) {\n abort();\n }\n\n const timeout =\n request.timeoutMs === undefined\n ? undefined\n : setTimeout(() => {\n timedOut = true;\n if (child.exitCode === null && child.signalCode === null) {\n child.kill(killSignal);\n }\n }, request.timeoutMs);\n\n child.once(\"error\", (error: NodeJS.ErrnoException) => {\n spawnError = {\n ...(error.code === undefined ? {} : { code: error.code }),\n message: error.message,\n };\n });\n\n child.once(\"close\", (exitCode, signal) => {\n if (timeout !== undefined) {\n clearTimeout(timeout);\n }\n request.signal?.removeEventListener(\"abort\", abort);\n\n const finished = new Date();\n resolve({\n executable: request.executable,\n args,\n startedAt,\n finishedAt: finished.toISOString(),\n durationMs: Math.max(0, finished.getTime() - started.getTime()),\n exitCode: spawnError === undefined ? exitCode : null,\n signal: spawnError === undefined ? signal : null,\n stdout: stdout.text(),\n stderr: stderr.text(),\n stdoutTruncated: stdout.truncated,\n stderrTruncated: stderr.truncated,\n timedOut,\n aborted,\n ...(spawnError === undefined ? {} : { spawnError }),\n });\n });\n });\n}\n",
|
|
10
|
+
"export type AdbDeviceState =\n | \"bootloader\"\n | \"device\"\n | \"no-permissions\"\n | \"offline\"\n | \"recovery\"\n | \"sideload\"\n | \"unauthorized\"\n | \"unknown\";\n\nexport interface AdbDevice {\n serial: string;\n state: AdbDeviceState;\n product?: string;\n model?: string;\n device?: string;\n transportId?: string;\n usb?: string;\n properties: Record<string, string>;\n unparsed: string[];\n}\n\nexport interface AdbVersion {\n protocolVersion?: string;\n platformToolsVersion?: string;\n installedAs?: string;\n raw: string;\n}\n\nconst KNOWN_STATES = new Set<AdbDeviceState>([\n \"bootloader\",\n \"device\",\n \"offline\",\n \"recovery\",\n \"sideload\",\n \"unauthorized\",\n]);\n\nfunction normalizeState(tokens: string[]): { state: AdbDeviceState; consumed: number } {\n if (tokens[0] === \"no\" && tokens[1] === \"permissions\") {\n return { state: \"no-permissions\", consumed: 2 };\n }\n const candidate = tokens[0] as AdbDeviceState | undefined;\n if (candidate !== undefined && KNOWN_STATES.has(candidate)) {\n return { state: candidate, consumed: 1 };\n }\n return { state: \"unknown\", consumed: candidate === undefined ? 0 : 1 };\n}\n\nexport function parseAdbDevices(output: string): AdbDevice[] {\n const devices: AdbDevice[] = [];\n let sawHeader = false;\n\n for (const rawLine of output.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\")) {\n const line = rawLine.trim();\n if (line === \"\") {\n continue;\n }\n if (line.startsWith(\"List of devices attached\")) {\n sawHeader = true;\n continue;\n }\n if (!sawHeader || line.startsWith(\"* daemon\") || line.startsWith(\"adb server\")) {\n continue;\n }\n\n const tokens = line.split(/\\s+/u);\n const serial = tokens.shift();\n if (serial === undefined || serial === \"\") {\n continue;\n }\n\n const { state, consumed } = normalizeState(tokens);\n const details = tokens.slice(consumed);\n const properties: Record<string, string> = {};\n const unparsed: string[] = [];\n\n for (const token of details) {\n const separator = token.indexOf(\":\");\n if (separator <= 0) {\n unparsed.push(token);\n continue;\n }\n properties[token.slice(0, separator)] = token.slice(separator + 1);\n }\n\n devices.push({\n serial,\n state,\n ...(properties.product === undefined ? {} : { product: properties.product }),\n ...(properties.model === undefined ? {} : { model: properties.model.replaceAll(\"_\", \" \") }),\n ...(properties.device === undefined ? {} : { device: properties.device }),\n ...(properties.transport_id === undefined ? {} : { transportId: properties.transport_id }),\n ...(properties.usb === undefined ? {} : { usb: properties.usb }),\n properties,\n unparsed,\n });\n }\n\n return devices;\n}\n\nexport function parseAdbVersion(output: string): AdbVersion {\n const normalized = output.replaceAll(\"\\r\\n\", \"\\n\").trim();\n const protocolVersion = normalized.match(/Android Debug Bridge version\\s+([^\\s]+)/iu)?.[1];\n const platformToolsVersion = normalized.match(/^Version\\s+([^\\s]+)/imu)?.[1];\n const installedAs = normalized.match(/^Installed as\\s+(.+)$/imu)?.[1]?.trim();\n\n return {\n ...(protocolVersion === undefined ? {} : { protocolVersion }),\n ...(platformToolsVersion === undefined ? {} : { platformToolsVersion }),\n ...(installedAs === undefined ? {} : { installedAs }),\n raw: normalized,\n };\n}\n\nexport function parseFeatureList(output: string): string[] {\n return [\n ...new Set(\n output\n .trim()\n .split(/[\\s,]+/u)\n .map((feature) => feature.trim())\n .filter(Boolean),\n ),\n ].sort();\n}\n\nexport function parseKeyValueLines(output: string): Record<string, string> {\n const values: Record<string, string> = {};\n for (const rawLine of output.replaceAll(\"\\r\\n\", \"\\n\").split(\"\\n\")) {\n const separator = rawLine.indexOf(\":\");\n if (separator <= 0) {\n continue;\n }\n const key = rawLine.slice(0, separator).trim();\n const value = rawLine.slice(separator + 1).trim();\n if (key !== \"\") {\n values[key] = value;\n }\n }\n return values;\n}\n",
|
|
11
|
+
"export const SCHEMA_VERSION = 1 as const;\n\nexport type JsonPrimitive = boolean | null | number | string;\nexport type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue };\n\nexport type Severity = \"debug\" | \"info\" | \"warning\" | \"error\";\n\nexport interface Correlation {\n commandId: string;\n operationId?: string;\n targetId?: string;\n}\n\nexport interface AdbReadyEvent {\n schemaVersion: typeof SCHEMA_VERSION;\n sequence: number;\n timestamp: string;\n type: string;\n source: string;\n severity: Severity;\n message: string;\n correlation: Correlation;\n data?: Record<string, JsonValue>;\n}\n\nexport type Risk =\n | \"none\"\n | \"read-only\"\n | \"local-additive\"\n | \"device-reversible\"\n | \"shared-global\"\n | \"destructive\"\n | \"open-world\";\n\nexport interface Evidence {\n source: string;\n field?: string;\n value: JsonValue;\n redacted?: boolean;\n}\n\nexport interface SuggestedAction {\n id: string;\n title: string;\n kind: \"command\" | \"user\" | \"documentation\";\n risk: Risk;\n automatic: boolean;\n idempotent?: boolean;\n command?: {\n executable: string;\n args: string[];\n };\n}\n\nexport interface Problem {\n code: string;\n category: string;\n severity: Extract<Severity, \"warning\" | \"error\">;\n summary: string;\n detail: string;\n retryable: boolean;\n evidence: Evidence[];\n actions: SuggestedAction[];\n correlation: Correlation;\n}\n\nexport interface OperationPlanStep {\n id: string;\n title: string;\n risk: Risk;\n executable?: string;\n args?: string[];\n}\n\nexport interface OperationPlan {\n schemaVersion: typeof SCHEMA_VERSION;\n dryRun: boolean;\n steps: OperationPlanStep[];\n}\n\nexport interface TargetReference {\n id: string;\n serial: string;\n state: string;\n transport: \"emulator\" | \"tcp\" | \"tls-mdns\" | \"usb\" | \"unknown\";\n}\n\nexport interface ResultEnvelope<T = JsonValue> {\n schemaVersion: typeof SCHEMA_VERSION;\n command: string;\n commandId: string;\n ok: boolean;\n startedAt: string;\n finishedAt: string;\n durationMs: number;\n data: T | null;\n problems: Problem[];\n}\n\nexport enum ExitCode {\n Success = 0,\n InvalidInput = 2,\n Environment = 10,\n Target = 20,\n AdbOperation = 30,\n ChildProcess = 40,\n Interrupted = 130,\n Internal = 70,\n}\n",
|
|
12
|
+
"import {\n type AdbReadyEvent,\n type Correlation,\n type JsonValue,\n SCHEMA_VERSION,\n type Severity,\n} from \"../domain/contracts.js\";\n\nexport interface EventInput {\n type: string;\n source: string;\n severity: Severity;\n message: string;\n correlation: Correlation;\n data?: Record<string, JsonValue>;\n}\n\nexport type EventListener = (event: AdbReadyEvent) => void;\n\nexport class EventBus {\n readonly #clock: () => Date;\n readonly #listeners = new Set<EventListener>();\n #sequence = 0;\n\n constructor(clock: () => Date = () => new Date()) {\n this.#clock = clock;\n }\n\n subscribe(listener: EventListener): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n\n emit(input: EventInput): AdbReadyEvent {\n const event: AdbReadyEvent = {\n schemaVersion: SCHEMA_VERSION,\n sequence: ++this.#sequence,\n timestamp: this.#clock().toISOString(),\n type: input.type,\n source: input.source,\n severity: input.severity,\n message: input.message,\n correlation: input.correlation,\n ...(input.data === undefined ? {} : { data: input.data }),\n };\n\n for (const listener of this.#listeners) {\n listener(event);\n }\n\n return event;\n }\n}\n",
|
|
13
|
+
"import { homedir } from \"node:os\";\n\nexport interface RedactionResult {\n value: string;\n replacements: number;\n}\n\nexport interface RedactionOptions {\n homeDirectory?: string;\n additionalLiterals?: readonly string[];\n}\n\nconst REDACTED = \"[REDACTED]\";\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/gu, \"\\\\$&\");\n}\n\nfunction replaceAndCount(\n input: string,\n expression: RegExp,\n replacement: string | ((substring: string, ...args: string[]) => string),\n): RedactionResult {\n let replacements = 0;\n const value = input.replace(expression, (...args: [string, ...string[]]) => {\n replacements += 1;\n return typeof replacement === \"string\" ? replacement : replacement(...args);\n });\n return { value, replacements };\n}\n\nexport function redactText(input: string, options: RedactionOptions = {}): RedactionResult {\n let value = input;\n let replacements = 0;\n\n const patterns: Array<{\n expression: RegExp;\n replacement: string | ((substring: string, ...args: string[]) => string);\n }> = [\n {\n expression: /\\b((?:authorization\\s*[:=]\\s*)?Bearer)\\s+[^\\s,;]+/giu,\n replacement: (_match, prefix) => `${prefix} ${REDACTED}`,\n },\n {\n expression:\n /\\b(api[_-]?key|access[_-]?token|auth|password|passwd|secret)\\b(\\s*[:=]\\s*)([\"']?)[^\\s,\"';]+\\3/giu,\n replacement: (_match, name, separator) => `${name}${separator}${REDACTED}`,\n },\n {\n expression: /\\b(authorization)(\\s*[:=]\\s*)(?!Bearer\\b)([\"']?)[^\\s,\"';]+\\3/giu,\n replacement: (_match, name, separator) => `${name}${separator}${REDACTED}`,\n },\n {\n expression: /\\b(pair(?:ing)?(?:\\s+code)?)(\\s*[:=]\\s*)\\d{6}\\b/giu,\n replacement: (_match, name, separator) => `${name}${separator}${REDACTED}`,\n },\n {\n expression: /([?&](?:access_token|api_key|apikey|auth|password|secret|token)=)[^&#\\s]*/giu,\n replacement: (_match, prefix) => `${prefix}${REDACTED}`,\n },\n ];\n\n for (const pattern of patterns) {\n const result = replaceAndCount(value, pattern.expression, pattern.replacement);\n value = result.value;\n replacements += result.replacements;\n }\n\n const homeDirectory = options.homeDirectory ?? homedir();\n if (homeDirectory.length > 1) {\n const result = replaceAndCount(value, new RegExp(escapeRegExp(homeDirectory), \"gu\"), \"~\");\n value = result.value;\n replacements += result.replacements;\n }\n\n for (const literal of options.additionalLiterals ?? []) {\n if (literal === \"\") {\n continue;\n }\n const result = replaceAndCount(value, new RegExp(escapeRegExp(literal), \"gu\"), REDACTED);\n value = result.value;\n replacements += result.replacements;\n }\n\n return { value, replacements };\n}\n",
|
|
14
|
+
"import type { AdbDevice } from \"../adb/parsers.js\";\nimport { redactText } from \"../core/redaction.js\";\nimport type { ProcessResult } from \"../platform/process-runner.js\";\nimport type { Correlation, Evidence, Problem, SuggestedAction } from \"./contracts.js\";\n\nexport const ProblemCode = {\n AdbCommandFailed: \"ADB_COMMAND_FAILED\",\n AdbNotFound: \"ADB_NOT_FOUND\",\n AdbOptionalProbeFailed: \"ADB_OPTIONAL_PROBE_FAILED\",\n AdbServerUnavailable: \"ADB_SERVER_UNAVAILABLE\",\n AdbTimeout: \"ADB_TIMEOUT\",\n InteractiveSelectionUnavailable: \"INTERACTIVE_SELECTION_UNAVAILABLE\",\n MultipleTargets: \"MULTIPLE_TARGETS\",\n NoSelectableTarget: \"NO_SELECTABLE_TARGET\",\n NoTargets: \"NO_TARGETS\",\n OperationInterrupted: \"OPERATION_INTERRUPTED\",\n TargetSelectionCancelled: \"TARGET_SELECTION_CANCELLED\",\n TargetNoPermissions: \"TARGET_NO_PERMISSIONS\",\n TargetOffline: \"TARGET_OFFLINE\",\n TargetUnauthorized: \"TARGET_UNAUTHORIZED\",\n TargetUnknownState: \"TARGET_UNKNOWN_STATE\",\n} as const;\n\nfunction retryDevicesAction(): SuggestedAction {\n return {\n id: \"retry_device_probe\",\n title: \"Check visible devices again\",\n kind: \"command\",\n risk: \"read-only\",\n automatic: true,\n idempotent: true,\n command: { executable: \"adb\", args: [\"devices\", \"-l\"] },\n };\n}\n\nexport function adbNotFoundProblem(correlation: Correlation, requestedPath?: string): Problem {\n return {\n code: ProblemCode.AdbNotFound,\n category: \"environment.executable\",\n severity: \"error\",\n summary: \"ADB was not found.\",\n detail:\n requestedPath === undefined\n ? \"Install Android SDK Platform-Tools or provide an explicit ADB path.\"\n : `The configured ADB executable could not be used: ${requestedPath}`,\n retryable: true,\n evidence:\n requestedPath === undefined\n ? []\n : [{ source: \"configuration\", field: \"adb.path\", value: requestedPath }],\n actions: [\n {\n id: \"configure_adb_path\",\n title: \"Provide the ADB executable with --adb PATH\",\n kind: \"user\",\n risk: \"none\",\n automatic: false,\n },\n ],\n correlation,\n };\n}\n\nfunction processEvidence(result: ProcessResult): Evidence[] {\n const redacted = redactText(result.stderr.trim());\n return [\n { source: \"process\", field: \"exitCode\", value: result.exitCode },\n { source: \"process\", field: \"signal\", value: result.signal },\n { source: \"process\", field: \"timedOut\", value: result.timedOut },\n ...(redacted.value === \"\"\n ? []\n : [\n {\n source: \"process\",\n field: \"stderr\",\n value: redacted.value.slice(0, 2_000),\n redacted: redacted.replacements > 0,\n } satisfies Evidence,\n ]),\n ];\n}\n\nexport function adbProcessProblem(\n operation: string,\n result: ProcessResult,\n correlation: Correlation,\n): Problem {\n if (result.spawnError?.code === \"ENOENT\") {\n return adbNotFoundProblem(correlation, result.executable);\n }\n\n if (result.aborted) {\n return {\n code: ProblemCode.OperationInterrupted,\n category: \"process.interrupted\",\n severity: \"error\",\n summary: `ADB ${operation} was interrupted.`,\n detail: \"The operation stopped after receiving an interruption request.\",\n retryable: true,\n evidence: processEvidence(result),\n actions: [],\n correlation,\n };\n }\n\n if (result.timedOut) {\n return {\n code: ProblemCode.AdbTimeout,\n category: \"adb.timeout\",\n severity: \"error\",\n summary: `ADB ${operation} timed out.`,\n detail: \"The operation did not finish within the configured timeout.\",\n retryable: true,\n evidence: processEvidence(result),\n actions: [retryDevicesAction()],\n correlation,\n };\n }\n\n const daemonUnavailable = /cannot connect to daemon|failed to start daemon|server.*failed/iu.test(\n result.stderr,\n );\n return {\n code: daemonUnavailable ? ProblemCode.AdbServerUnavailable : ProblemCode.AdbCommandFailed,\n category: daemonUnavailable ? \"adb.server\" : \"adb.operation\",\n severity: \"error\",\n summary: daemonUnavailable ? \"The ADB server is unavailable.\" : `ADB ${operation} failed.`,\n detail: daemonUnavailable\n ? \"ADB Ready could not communicate with the configured ADB server.\"\n : \"ADB returned an unsuccessful result for this operation.\",\n retryable: true,\n evidence: processEvidence(result),\n actions: [retryDevicesAction()],\n correlation,\n };\n}\n\nexport function adbOptionalProbeProblem(\n operation: string,\n result: ProcessResult,\n correlation: Correlation,\n): Problem {\n const failure = adbProcessProblem(operation, result, correlation);\n\n return {\n ...failure,\n code: ProblemCode.AdbOptionalProbeFailed,\n category: \"adb.capability\",\n severity: \"warning\",\n summary: `Optional ADB ${operation} probe failed.`,\n detail:\n \"Core diagnostics can continue, but this ADB capability could not be inspected reliably.\",\n };\n}\n\nfunction targetEvidence(device: AdbDevice): Evidence[] {\n return [\n { source: \"adb.devices\", field: \"serial\", value: device.serial },\n { source: \"adb.devices\", field: \"state\", value: device.state },\n ];\n}\n\nexport function problemsForDevices(\n devices: readonly AdbDevice[],\n correlation: Correlation,\n severity: Problem[\"severity\"] = \"error\",\n): Problem[] {\n const problems: Problem[] = [];\n\n for (const device of devices) {\n if (device.state === \"unauthorized\") {\n problems.push({\n code: ProblemCode.TargetUnauthorized,\n category: \"target.authorization\",\n severity,\n summary: \"An Android target has not authorized this computer.\",\n detail: \"Accept the RSA authorization prompt on the target, then retry the probe.\",\n retryable: true,\n evidence: targetEvidence(device),\n actions: [\n {\n id: \"accept_device_prompt\",\n title: \"Accept the RSA prompt on the Android target\",\n kind: \"user\",\n risk: \"none\",\n automatic: false,\n },\n retryDevicesAction(),\n ],\n correlation,\n });\n } else if (device.state === \"offline\") {\n problems.push({\n code: ProblemCode.TargetOffline,\n category: \"target.transport\",\n severity,\n summary: \"An Android target is offline.\",\n detail: \"ADB knows this transport, but it cannot currently communicate with the target.\",\n retryable: true,\n evidence: targetEvidence(device),\n actions: [retryDevicesAction()],\n correlation,\n });\n } else if (device.state === \"no-permissions\") {\n problems.push({\n code: ProblemCode.TargetNoPermissions,\n category: \"target.permissions\",\n severity,\n summary: \"The host does not have permission to use an Android target.\",\n detail: \"Check the host USB permissions and Android developer authorization setup.\",\n retryable: true,\n evidence: targetEvidence(device),\n actions: [\n {\n id: \"review_usb_permissions\",\n title: \"Review host USB permission setup\",\n kind: \"documentation\",\n risk: \"none\",\n automatic: false,\n },\n ],\n correlation,\n });\n } else if (device.state === \"unknown\") {\n problems.push({\n code: ProblemCode.TargetUnknownState,\n category: \"target.state\",\n severity: \"warning\",\n summary: \"ADB reported an unknown target state.\",\n detail: \"The target remains visible, but ADB Ready will not assume it is usable.\",\n retryable: true,\n evidence: targetEvidence(device),\n actions: [retryDevicesAction()],\n correlation,\n });\n }\n }\n\n return problems;\n}\n\nexport function noTargetsProblem(correlation: Correlation): Problem {\n return {\n code: ProblemCode.NoTargets,\n category: \"target.selection\",\n severity: \"warning\",\n summary: \"No Android targets are visible.\",\n detail: \"Connect a target over USB, start an emulator, or enable Wireless debugging.\",\n retryable: true,\n evidence: [{ source: \"adb.devices\", field: \"count\", value: 0 }],\n actions: [retryDevicesAction()],\n correlation,\n };\n}\n\nexport function multipleTargetsProblem(\n devices: readonly AdbDevice[],\n correlation: Correlation,\n): Problem {\n return {\n code: ProblemCode.MultipleTargets,\n category: \"target.selection\",\n severity: \"error\",\n summary: \"Multiple Android targets require an explicit selection.\",\n detail: \"Choose one interactively or provide an explicit target selector.\",\n retryable: true,\n evidence: [\n { source: \"adb.devices\", field: \"serials\", value: devices.map(({ serial }) => serial) },\n ],\n actions: [\n {\n id: \"select_target\",\n title: \"Select one Android target\",\n kind: \"user\",\n risk: \"none\",\n automatic: false,\n },\n ],\n correlation,\n };\n}\n",
|
|
15
|
+
"import { constants } from \"node:fs\";\nimport { access, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport process from \"node:process\";\n\nexport interface ExecutableSearchOptions {\n explicitPath?: string;\n env?: NodeJS.ProcessEnv;\n homeDirectory?: string;\n platform?: NodeJS.Platform;\n}\n\nasync function isExecutable(candidate: string, platform: NodeJS.Platform): Promise<boolean> {\n try {\n await access(candidate, platform === \"win32\" ? constants.F_OK : constants.X_OK);\n return (await stat(candidate)).isFile();\n } catch {\n return false;\n }\n}\n\nfunction windowsExtensions(env: NodeJS.ProcessEnv): string[] {\n const value = env.PATHEXT ?? \".COM;.EXE;.BAT;.CMD\";\n return value\n .split(\";\")\n .map((extension) => extension.trim().toLowerCase())\n .filter(Boolean);\n}\n\nfunction candidateNames(name: string, platform: NodeJS.Platform, env: NodeJS.ProcessEnv): string[] {\n const pathApi = platform === \"win32\" ? path.win32 : path.posix;\n if (platform !== \"win32\" || pathApi.extname(name) !== \"\") {\n return [name];\n }\n return [name, ...windowsExtensions(env).map((extension) => `${name}${extension}`)];\n}\n\nasync function resolveFromPath(\n name: string,\n env: NodeJS.ProcessEnv,\n platform: NodeJS.Platform,\n): Promise<string | undefined> {\n const pathValue = env.PATH ?? env.Path ?? env.path;\n if (pathValue === undefined) {\n return undefined;\n }\n\n const delimiter = platform === \"win32\" ? \";\" : \":\";\n const pathApi = platform === \"win32\" ? path.win32 : path.posix;\n for (const directory of pathValue.split(delimiter)) {\n if (directory.trim() === \"\") {\n continue;\n }\n for (const candidateName of candidateNames(name, platform, env)) {\n const candidate = pathApi.resolve(directory.replace(/^\"|\"$/g, \"\"), candidateName);\n if (await isExecutable(candidate, platform)) {\n return candidate;\n }\n }\n }\n\n return undefined;\n}\n\nfunction sdkCandidates(\n env: NodeJS.ProcessEnv,\n platform: NodeJS.Platform,\n homeDirectory: string,\n): string[] {\n const pathApi = platform === \"win32\" ? path.win32 : path.posix;\n const executable = platform === \"win32\" ? \"adb.exe\" : \"adb\";\n const roots = [env.ANDROID_SDK_ROOT, env.ANDROID_HOME].filter(\n (value): value is string => value !== undefined && value.trim() !== \"\",\n );\n\n if (platform === \"darwin\") {\n roots.push(pathApi.join(homeDirectory, \"Library\", \"Android\", \"sdk\"));\n } else if (platform === \"win32\") {\n if (env.LOCALAPPDATA !== undefined) {\n roots.push(pathApi.join(env.LOCALAPPDATA, \"Android\", \"Sdk\"));\n }\n } else {\n roots.push(pathApi.join(homeDirectory, \"Android\", \"Sdk\"));\n }\n\n return [...new Set(roots.map((root) => pathApi.join(root, \"platform-tools\", executable)))];\n}\n\nexport async function locateAdb(\n options: ExecutableSearchOptions = {},\n): Promise<string | undefined> {\n const env = options.env ?? process.env;\n const platform = options.platform ?? process.platform;\n const pathApi = platform === \"win32\" ? path.win32 : path.posix;\n\n if (options.explicitPath !== undefined) {\n const explicit = options.explicitPath.trim();\n if (explicit === \"\") {\n return undefined;\n }\n if (pathApi.isAbsolute(explicit) || explicit.includes(\"/\") || explicit.includes(\"\\\\\")) {\n const candidate = pathApi.resolve(explicit);\n return (await isExecutable(candidate, platform)) ? candidate : undefined;\n }\n return await resolveFromPath(explicit, env, platform);\n }\n\n const fromPath = await resolveFromPath(\"adb\", env, platform);\n if (fromPath !== undefined) {\n return fromPath;\n }\n\n for (const candidate of sdkCandidates(env, platform, options.homeDirectory ?? homedir())) {\n if (await isExecutable(candidate, platform)) {\n return candidate;\n }\n }\n\n return undefined;\n}\n",
|
|
16
|
+
"import process from \"node:process\";\n\nexport type RuntimeName = \"bun\" | \"deno\" | \"node\" | \"unknown\";\n\nexport interface RuntimeInfo {\n name: RuntimeName;\n version: string;\n nodeCompatibilityVersion?: string;\n platform: NodeJS.Platform;\n architecture: string;\n}\n\nexport function detectRuntime(): RuntimeInfo {\n const versions = process.versions as Record<string, string | undefined>;\n\n if (versions.bun !== undefined) {\n return {\n name: \"bun\",\n version: versions.bun,\n ...(versions.node === undefined ? {} : { nodeCompatibilityVersion: versions.node }),\n platform: process.platform,\n architecture: process.arch,\n };\n }\n\n if (versions.deno !== undefined) {\n return {\n name: \"deno\",\n version: versions.deno,\n ...(versions.node === undefined ? {} : { nodeCompatibilityVersion: versions.node }),\n platform: process.platform,\n architecture: process.arch,\n };\n }\n\n if (versions.node !== undefined) {\n return {\n name: \"node\",\n version: versions.node,\n platform: process.platform,\n architecture: process.arch,\n };\n }\n\n return {\n name: \"unknown\",\n version: \"unknown\",\n platform: process.platform,\n architecture: process.arch,\n };\n}\n",
|
|
17
|
+
"import { readFile, stat } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport process from \"node:process\";\nimport type {\n ConfigError,\n ConfigKey,\n ConfigLoadResult,\n ConfigProvenance,\n ConfigSource,\n ConfigValues,\n LoadedConfig,\n} from \"./types.js\";\n\nexport interface LoadConfigOptions {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n platform?: NodeJS.Platform;\n homeDirectory?: string;\n userConfigPath?: string;\n projectConfigPath?: string;\n explicitProjectConfig?: boolean;\n cli?: ConfigValues;\n}\n\nconst DEFAULTS: Required<Pick<ConfigValues, \"timeoutMs\">> = { timeoutMs: 5_000 };\nconst ROOT_KEYS = new Set([\"$schema\", \"version\", \"adb\", \"timeoutMs\", \"output\"]);\nconst ADB_KEYS = new Set([\"path\", \"host\", \"port\"]);\nconst OUTPUT_KEYS = new Set([\"color\", \"unicode\", \"animation\", \"interactive\"]);\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction error(\n source: ConfigError[\"source\"],\n location: string | undefined,\n pathValue: string,\n message: string,\n code: ConfigError[\"code\"] = \"CONFIG_INVALID_VALUE\",\n): ConfigError {\n return {\n code,\n path: pathValue,\n message,\n source,\n ...(location === undefined ? {} : { location }),\n };\n}\n\nfunction validateUnknownKeys(\n value: Record<string, unknown>,\n allowed: Set<string>,\n prefix: string,\n source: ConfigError[\"source\"],\n location: string,\n errors: ConfigError[],\n): void {\n for (const key of Object.keys(value)) {\n if (!allowed.has(key)) {\n errors.push(\n error(source, location, `${prefix}${key}`, `Unknown configuration key: ${prefix}${key}`),\n );\n }\n }\n}\n\nfunction validateDocument(\n document: unknown,\n source: Extract<ConfigSource, \"project\" | \"user\">,\n location: string,\n): { values: ConfigValues; errors: ConfigError[] } {\n const errors: ConfigError[] = [];\n const values: ConfigValues = {};\n if (!isObject(document)) {\n return {\n values,\n errors: [error(source, location, \"$\", \"Configuration must be a JSON object.\")],\n };\n }\n\n validateUnknownKeys(document, ROOT_KEYS, \"\", source, location, errors);\n if (document.$schema !== undefined && typeof document.$schema !== \"string\") {\n errors.push(error(source, location, \"$schema\", \"$schema must be a string.\"));\n }\n if (document.version !== 1) {\n errors.push(error(source, location, \"version\", \"version must be exactly 1.\"));\n }\n\n if (document.timeoutMs !== undefined) {\n if (\n !Number.isSafeInteger(document.timeoutMs) ||\n (document.timeoutMs as number) < 1 ||\n (document.timeoutMs as number) > 2_147_483_647\n ) {\n errors.push(\n error(source, location, \"timeoutMs\", \"timeoutMs must be an integer from 1 to 2147483647.\"),\n );\n } else {\n values.timeoutMs = document.timeoutMs as number;\n }\n }\n\n if (document.adb !== undefined) {\n if (!isObject(document.adb)) {\n errors.push(error(source, location, \"adb\", \"adb must be an object.\"));\n } else {\n validateUnknownKeys(document.adb, ADB_KEYS, \"adb.\", source, location, errors);\n for (const [key, configKey] of [\n [\"path\", \"adbPath\"],\n [\"host\", \"adbHost\"],\n ] as const) {\n const candidate = document.adb[key];\n if (candidate !== undefined) {\n if (typeof candidate !== \"string\" || candidate.trim() === \"\") {\n errors.push(\n error(source, location, `adb.${key}`, `adb.${key} must be a non-empty string.`),\n );\n } else {\n values[configKey] = candidate;\n }\n }\n }\n if (document.adb.port !== undefined) {\n if (\n !Number.isSafeInteger(document.adb.port) ||\n (document.adb.port as number) < 1 ||\n (document.adb.port as number) > 65_535\n ) {\n errors.push(\n error(source, location, \"adb.port\", \"adb.port must be an integer from 1 to 65535.\"),\n );\n } else {\n values.adbPort = document.adb.port as number;\n }\n }\n }\n }\n\n if (document.output !== undefined) {\n if (!isObject(document.output)) {\n errors.push(error(source, location, \"output\", \"output must be an object.\"));\n } else {\n validateUnknownKeys(document.output, OUTPUT_KEYS, \"output.\", source, location, errors);\n for (const [key, configKey] of [\n [\"color\", \"color\"],\n [\"unicode\", \"unicode\"],\n [\"animation\", \"animation\"],\n [\"interactive\", \"interactive\"],\n ] as const) {\n const candidate = document.output[key];\n if (candidate !== undefined) {\n if (typeof candidate !== \"boolean\") {\n errors.push(\n error(source, location, `output.${key}`, `output.${key} must be a boolean.`),\n );\n } else {\n values[configKey] = candidate;\n }\n }\n }\n }\n }\n\n return { values, errors };\n}\n\nasync function fileExists(file: string): Promise<boolean> {\n try {\n return (await stat(file)).isFile();\n } catch {\n return false;\n }\n}\n\nexport function defaultUserConfigPath(\n platform: NodeJS.Platform,\n env: NodeJS.ProcessEnv,\n homeDirectory: string,\n): string {\n const platformPath = platform === \"win32\" ? path.win32 : path.posix;\n if (env.XDG_CONFIG_HOME !== undefined && env.XDG_CONFIG_HOME.trim() !== \"\") {\n return platformPath.join(env.XDG_CONFIG_HOME, \"adb-ready\", \"config.json\");\n }\n if (platform === \"win32\" && env.APPDATA !== undefined && env.APPDATA.trim() !== \"\") {\n return platformPath.join(env.APPDATA, \"adb-ready\", \"config.json\");\n }\n if (platform === \"darwin\") {\n return platformPath.join(\n homeDirectory,\n \"Library\",\n \"Application Support\",\n \"adb-ready\",\n \"config.json\",\n );\n }\n return platformPath.join(homeDirectory, \".config\", \"adb-ready\", \"config.json\");\n}\n\nexport async function findProjectConfig(startDirectory: string): Promise<string | undefined> {\n let current = path.resolve(startDirectory);\n while (true) {\n const candidate = path.join(current, \"adb-ready.config.json\");\n if (await fileExists(candidate)) {\n return candidate;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n return undefined;\n }\n current = parent;\n }\n}\n\nasync function readConfigDocument(\n file: string,\n source: Extract<ConfigSource, \"project\" | \"user\">,\n required: boolean,\n): Promise<{ values: ConfigValues; errors: ConfigError[]; loaded: boolean }> {\n let raw: string;\n try {\n raw = await readFile(file, \"utf8\");\n } catch (caught) {\n const code = (caught as NodeJS.ErrnoException).code;\n if (!required && code === \"ENOENT\") {\n return { values: {}, errors: [], loaded: false };\n }\n return {\n values: {},\n errors: [\n error(\n source,\n file,\n \"$\",\n `Configuration file could not be read: ${file}`,\n \"CONFIG_NOT_FOUND\",\n ),\n ],\n loaded: false,\n };\n }\n\n let document: unknown;\n try {\n document = JSON.parse(raw);\n } catch (caught) {\n return {\n values: {},\n errors: [\n error(\n source,\n file,\n \"$\",\n `Invalid JSON: ${caught instanceof Error ? caught.message : \"unknown parse error\"}`,\n \"CONFIG_INVALID_JSON\",\n ),\n ],\n loaded: true,\n };\n }\n\n const validated = validateDocument(document, source, file);\n return { ...validated, loaded: true };\n}\n\nfunction parseEnvironment(env: NodeJS.ProcessEnv): { values: ConfigValues; errors: ConfigError[] } {\n const values: ConfigValues = {};\n const errors: ConfigError[] = [];\n const strings = [\n [\"ADB_READY_ADB_PATH\", \"adbPath\"],\n [\"ADB_READY_ADB_HOST\", \"adbHost\"],\n ] as const;\n for (const [name, key] of strings) {\n const candidate = env[name];\n if (candidate !== undefined) {\n if (candidate.trim() === \"\") {\n errors.push(error(\"environment\", name, name, `${name} cannot be empty.`));\n } else {\n values[key] = candidate;\n }\n }\n }\n\n const integers = [\n [\"ADB_READY_ADB_PORT\", \"adbPort\", 65_535],\n [\"ADB_READY_TIMEOUT_MS\", \"timeoutMs\", 2_147_483_647],\n ] as const;\n for (const [name, key, maximum] of integers) {\n const candidate = env[name];\n if (candidate !== undefined) {\n const parsed = Number(candidate);\n if (!Number.isSafeInteger(parsed) || parsed < 1 || parsed > maximum) {\n errors.push(\n error(\"environment\", name, name, `${name} must be an integer from 1 to ${maximum}.`),\n );\n } else {\n values[key] = parsed;\n }\n }\n }\n\n const booleans = [\n [\"ADB_READY_COLOR\", \"color\"],\n [\"ADB_READY_UNICODE\", \"unicode\"],\n [\"ADB_READY_ANIMATION\", \"animation\"],\n [\"ADB_READY_INTERACTIVE\", \"interactive\"],\n ] as const;\n for (const [name, key] of booleans) {\n const candidate = env[name];\n if (candidate !== undefined) {\n const normalized = candidate.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\n values[key] = true;\n } else if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\n values[key] = false;\n } else {\n errors.push(\n error(\"environment\", name, name, `${name} must be true/false, 1/0, yes/no, or on/off.`),\n );\n }\n }\n }\n\n return { values, errors };\n}\n\nfunction applyValues(\n target: ConfigValues,\n provenance: Record<ConfigKey, ConfigProvenance | undefined>,\n values: ConfigValues,\n source: ConfigSource,\n location?: string,\n): void {\n for (const key of Object.keys(values) as ConfigKey[]) {\n const value = values[key];\n if (value !== undefined) {\n Object.assign(target, { [key]: value });\n provenance[key] = { source, ...(location === undefined ? {} : { location }) };\n }\n }\n}\n\nexport async function loadConfig(options: LoadConfigOptions = {}): Promise<ConfigLoadResult> {\n const cwd = options.cwd ?? process.cwd();\n const env = options.env ?? process.env;\n const platform = options.platform ?? process.platform;\n const homeDirectory = options.homeDirectory ?? homedir();\n const userFile = options.userConfigPath ?? defaultUserConfigPath(platform, env, homeDirectory);\n const environmentProjectFile = env.ADB_READY_CONFIG?.trim();\n const projectFile =\n options.projectConfigPath ??\n (environmentProjectFile === undefined || environmentProjectFile === \"\"\n ? options.explicitProjectConfig\n ? undefined\n : await findProjectConfig(cwd)\n : path.resolve(cwd, environmentProjectFile));\n const projectRequired =\n (options.explicitProjectConfig ?? false) ||\n (environmentProjectFile !== undefined && environmentProjectFile !== \"\");\n const errors: ConfigError[] = [];\n const values: ConfigValues = {};\n const provenance = {} as Record<ConfigKey, ConfigProvenance | undefined>;\n const files: LoadedConfig[\"files\"] = {};\n\n applyValues(values, provenance, DEFAULTS, \"default\");\n\n const user = await readConfigDocument(userFile, \"user\", false);\n errors.push(...user.errors);\n if (user.loaded) {\n files.user = userFile;\n applyValues(values, provenance, user.values, \"user\", userFile);\n }\n\n if (projectFile !== undefined) {\n const project = await readConfigDocument(projectFile, \"project\", projectRequired);\n errors.push(...project.errors);\n if (project.loaded) {\n files.project = projectFile;\n applyValues(values, provenance, project.values, \"project\", projectFile);\n }\n } else if (projectRequired) {\n errors.push(\n error(\n \"project\",\n undefined,\n \"$\",\n \"An explicit project configuration path is required.\",\n \"CONFIG_NOT_FOUND\",\n ),\n );\n }\n\n const environment = parseEnvironment(env);\n errors.push(...environment.errors);\n applyValues(values, provenance, environment.values, \"environment\");\n applyValues(values, provenance, options.cli ?? {}, \"cli\");\n\n if (errors.length > 0) {\n return { ok: false, errors };\n }\n\n return {\n ok: true,\n config: {\n values: values as LoadedConfig[\"values\"],\n provenance,\n files,\n },\n };\n}\n",
|
|
18
|
+
"export interface LinkCoreFrameOptions {\n angleX: number;\n angleY: number;\n width?: number;\n height?: number;\n}\n\ninterface Point3D {\n x: number;\n y: number;\n z: number;\n}\n\nconst FACE_SHADES = \".,:;=+*#%@\";\nconst LINK_PATH: readonly Point3D[] = [\n { x: 1.34, y: -0.42, z: 0 },\n { x: 0.72, y: -1.02, z: 0 },\n { x: -0.7, y: -1.02, z: 0 },\n { x: -1.34, y: -0.42, z: 0 },\n { x: -1.34, y: 0.42, z: 0 },\n { x: -0.7, y: 1.02, z: 0 },\n { x: 0.72, y: 1.02, z: 0 },\n { x: 1.34, y: 0.42, z: 0 },\n];\n\nfunction rotate(point: Point3D, angleX: number, angleY: number): Point3D {\n const sinX = Math.sin(angleX);\n const cosX = Math.cos(angleX);\n const sinY = Math.sin(angleY);\n const cosY = Math.cos(angleY);\n const afterX = {\n x: point.x,\n y: point.y * cosX - point.z * sinX,\n z: point.y * sinX + point.z * cosX,\n };\n return {\n x: afterX.x * cosY + afterX.z * sinY,\n y: afterX.y,\n z: -afterX.x * sinY + afterX.z * cosY,\n };\n}\n\nfunction orientForLink(point: Point3D, link: 0 | 1, offset = true): Point3D {\n if (link === 0) {\n return point;\n }\n return {\n x: point.z + (offset ? 0.2 : 0),\n y: point.y,\n z: -point.x,\n };\n}\n\nfunction normalize(point: Point3D): Point3D {\n const length = Math.hypot(point.x, point.y, point.z) || 1;\n return { x: point.x / length, y: point.y / length, z: point.z / length };\n}\n\nfunction mix(\n origin: Point3D,\n along: Point3D,\n alongAmount: number,\n across: Point3D,\n acrossAmount: number,\n depthAmount: number,\n): Point3D {\n return {\n x: origin.x + along.x * alongAmount + across.x * acrossAmount,\n y: origin.y + along.y * alongAmount + across.y * acrossAmount,\n z: origin.z + depthAmount,\n };\n}\n\n/** Renders ADB Ready's split-link core: two solid, open angular links locked in 3D. */\nexport function renderLinkCoreFrame(options: LinkCoreFrameOptions): string[] {\n const width = Math.max(10, Math.floor(options.width ?? 36));\n const height = Math.max(5, Math.floor(options.height ?? 14));\n const pixels = Array.from({ length: width * height }, () => \" \");\n const depth = new Float64Array(width * height);\n const camera = 4.8;\n const focalX = width * 1.18;\n const focalY = focalX * 0.48;\n const light = normalize({ x: -0.45, y: 0.7, z: 1 });\n\n const plot = (localPoint: Point3D, localNormal: Point3D, link: 0 | 1, edge = false) => {\n const point = rotate(orientForLink(localPoint, link), options.angleX, options.angleY);\n const normal = normalize(\n rotate(orientForLink(localNormal, link, false), options.angleX, options.angleY),\n );\n const inverseDepth = 1 / (camera - point.z);\n const x = Math.round(width / 2 + point.x * focalX * inverseDepth);\n const y = Math.round(height / 2 - point.y * focalY * inverseDepth);\n if (x < 0 || x >= width || y < 0 || y >= height) {\n return;\n }\n const index = x + y * width;\n const biasedDepth = inverseDepth + (edge ? 0.0008 : 0);\n if (biasedDepth <= (depth[index] ?? 0)) {\n return;\n }\n depth[index] = biasedDepth;\n const diffuse = Math.max(0, normal.x * light.x + normal.y * light.y + normal.z * light.z);\n const rim = (1 - Math.abs(normal.z)) ** 2 * 0.22;\n const luminance = Math.min(1, 0.16 + diffuse * 0.72 + rim + link * 0.04);\n const shadeIndex = Math.min(FACE_SHADES.length - 1, Math.floor(luminance * FACE_SHADES.length));\n pixels[index] = edge ? (luminance > 0.58 ? \"@\" : \"#\") : (FACE_SHADES[shadeIndex] ?? \".\");\n };\n\n const halfBand = 0.19;\n const halfDepth = 0.16;\n const step = 0.045;\n\n for (const link of [0, 1] as const) {\n for (let segment = 0; segment < LINK_PATH.length - 1; segment += 1) {\n const from = LINK_PATH[segment];\n const to = LINK_PATH[segment + 1];\n if (from === undefined || to === undefined) {\n continue;\n }\n const delta = { x: to.x - from.x, y: to.y - from.y, z: 0 };\n const length = Math.hypot(delta.x, delta.y);\n const along = { x: delta.x / length, y: delta.y / length, z: 0 };\n const across = { x: -along.y, y: along.x, z: 0 };\n\n for (let distance = 0; distance <= length; distance += step) {\n for (let lateral = -halfBand; lateral <= halfBand; lateral += step) {\n plot(mix(from, along, distance, across, lateral, halfDepth), { x: 0, y: 0, z: 1 }, link);\n plot(\n mix(from, along, distance, across, lateral, -halfDepth),\n { x: 0, y: 0, z: -1 },\n link,\n );\n }\n for (let extrusion = -halfDepth; extrusion <= halfDepth; extrusion += step) {\n plot(mix(from, along, distance, across, halfBand, extrusion), across, link);\n plot(\n mix(from, along, distance, across, -halfBand, extrusion),\n { x: -across.x, y: -across.y, z: 0 },\n link,\n );\n }\n\n for (const lateral of [-halfBand, halfBand]) {\n for (const extrusion of [-halfDepth, halfDepth]) {\n plot(\n mix(from, along, distance, across, lateral, extrusion),\n { x: 0, y: 0, z: extrusion > 0 ? 1 : -1 },\n link,\n true,\n );\n }\n }\n }\n }\n }\n\n return Array.from({ length: height }, (_, row) =>\n pixels\n .slice(row * width, (row + 1) * width)\n .join(\"\")\n .trimEnd(),\n );\n}\n",
|
|
19
|
+
"import type { TerminalCapabilities } from \"./terminal.js\";\n\nconst ANSI_PATTERN =\n // biome-ignore lint/suspicious/noControlCharactersInRegex: terminal sanitization intentionally matches ANSI control bytes.\n /[\\x1B\\x9B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\\\/#&.:=?%@~_]+)*)?\\x07)|(?:(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))/gu;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: untrusted terminal text must not retain C0/C1 controls.\nconst CONTROL_PATTERN = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x9F]/gu;\n\nexport interface Symbols {\n active: string;\n failure: string;\n pending: string;\n recovered: string;\n skipped: string;\n success: string;\n warning: string;\n branch: string;\n end: string;\n}\n\nexport function sanitizeTerminalText(value: string): string {\n return value\n .replace(ANSI_PATTERN, \"\")\n .replaceAll(\"\\r\", \" \")\n .replaceAll(\"\\n\", \" \")\n .replaceAll(\"\\t\", \" \")\n .replace(CONTROL_PATTERN, \"\")\n .replace(/\\s{2,}/gu, \" \")\n .trim();\n}\n\nexport function symbols(capabilities: TerminalCapabilities): Symbols {\n return capabilities.unicode\n ? {\n active: \"◆\",\n failure: \"✕\",\n pending: \"○\",\n recovered: \"↻\",\n skipped: \"–\",\n success: \"✓\",\n warning: \"!\",\n branch: \"├─\",\n end: \"└─\",\n }\n : {\n active: \">\",\n failure: \"x\",\n pending: \"o\",\n recovered: \"~\",\n skipped: \"-\",\n success: \"+\",\n warning: \"!\",\n branch: \"|-\",\n end: \"`-\",\n };\n}\n\nfunction color(code: number, value: string, capabilities: TerminalCapabilities): string {\n return capabilities.color ? `\\u001B[${String(code)}m${value}\\u001B[0m` : value;\n}\n\nexport const style = {\n accent: (value: string, capabilities: TerminalCapabilities) => color(36, value, capabilities),\n dim: (value: string, capabilities: TerminalCapabilities) => color(2, value, capabilities),\n failure: (value: string, capabilities: TerminalCapabilities) => color(31, value, capabilities),\n strong: (value: string, capabilities: TerminalCapabilities) => color(1, value, capabilities),\n success: (value: string, capabilities: TerminalCapabilities) => color(32, value, capabilities),\n warning: (value: string, capabilities: TerminalCapabilities) => color(33, value, capabilities),\n};\n",
|
|
20
|
+
"import type { TextSink } from \"./spinner.js\";\nimport { sanitizeTerminalText, style, symbols } from \"./style.js\";\nimport type { TerminalCapabilities } from \"./terminal.js\";\n\nexport interface SelectOption<T> {\n value: T;\n label: string;\n description?: string;\n recommended?: boolean;\n disabled?: boolean;\n}\n\nexport type SelectResult<T> =\n | { kind: \"selected\"; value: T }\n | { kind: \"cancelled\"; reason: \"escape\" | \"interrupt\" | \"signal\" }\n | { kind: \"unavailable\" };\n\nexport interface SelectInput {\n isRaw?: boolean;\n setRawMode?(enabled: boolean): unknown;\n resume(): unknown;\n pause(): unknown;\n on(event: \"data\", listener: (chunk: Uint8Array | string) => void): unknown;\n off(event: \"data\", listener: (chunk: Uint8Array | string) => void): unknown;\n}\n\nexport interface SelectOptions<T> {\n title: string;\n options: readonly SelectOption<T>[];\n input: SelectInput;\n sink: TextSink;\n capabilities: TerminalCapabilities;\n signal?: AbortSignal;\n preamble?: (frame: number) => readonly string[];\n refreshIntervalMs?: number;\n}\n\nfunction truncate(value: string, width: number): string {\n if (value.length <= width) {\n return value;\n }\n return width <= 3 ? value.slice(0, width) : `${value.slice(0, width - 3)}...`;\n}\n\nfunction wrap(value: string, width: number): string[] {\n const clean = sanitizeTerminalText(value);\n if (clean.length <= width) {\n return [clean];\n }\n const lines: string[] = [];\n let line = \"\";\n for (const word of clean.split(\" \")) {\n if (word.length > width) {\n if (line !== \"\") {\n lines.push(line);\n line = \"\";\n }\n for (let start = 0; start < word.length; start += width) {\n lines.push(word.slice(start, start + width));\n }\n continue;\n }\n const candidate = line === \"\" ? word : `${line} ${word}`;\n if (candidate.length > width) {\n lines.push(line);\n line = word;\n } else {\n line = candidate;\n }\n }\n if (line !== \"\") {\n lines.push(line);\n }\n return lines;\n}\n\nfunction nextEnabled<T>(\n options: readonly SelectOption<T>[],\n current: number,\n direction: -1 | 1,\n): number {\n for (let offset = 1; offset <= options.length; offset += 1) {\n const candidate = (current + direction * offset + options.length) % options.length;\n if (options[candidate]?.disabled !== true) {\n return candidate;\n }\n }\n return current;\n}\n\nfunction initialIndex<T>(options: readonly SelectOption<T>[]): number {\n const recommended = options.findIndex(\n (option) => option.recommended === true && option.disabled !== true,\n );\n if (recommended !== -1) {\n return recommended;\n }\n return options.findIndex((option) => option.disabled !== true);\n}\n\nfunction renderMenu<T>(\n options: SelectOptions<T>,\n selected: number,\n previousLineCount: number,\n frame: number,\n): number {\n const { capabilities, sink } = options;\n const glyphs = symbols(capabilities);\n if (previousLineCount > 0) {\n sink.write(`\\u001B[${String(previousLineCount)}F`);\n }\n const top = capabilities.unicode ? \"╭─\" : \"+-\";\n const bottom = capabilities.unicode ? \"╰─\" : \"+-\";\n const rail = capabilities.unicode ? \"│\" : \"|\";\n const compact = capabilities.columns < 60;\n const help = capabilities.unicode\n ? \"↑↓ move · 1-9 jump · enter open\"\n : \"up/down · 1-9 jump · enter open\";\n const lines = [...(options.preamble?.(frame) ?? [])];\n lines.push(\n `${style.dim(top, capabilities)} ${style.strong(\n truncate(sanitizeTerminalText(options.title), Math.max(8, capabilities.columns - 4)),\n capabilities,\n )}`,\n );\n options.options.forEach((option, index) => {\n const isSelected = index === selected;\n const pointer = isSelected\n ? style.accent(glyphs.active, capabilities)\n : style.dim(option.disabled === true ? glyphs.skipped : glyphs.pending, capabilities);\n const number = style.dim(`[${String(index + 1)}]`, capabilities);\n const disabled = option.disabled === true ? \" · unavailable\" : \"\";\n const recommended = option.recommended === true ? \" · recommended\" : \"\";\n const label = truncate(\n `${sanitizeTerminalText(option.label)}${disabled}${recommended}`,\n Math.max(8, capabilities.columns - 10),\n );\n const styledLabel =\n option.disabled === true\n ? style.dim(label, capabilities)\n : isSelected\n ? style.strong(label, capabilities)\n : label;\n lines.push(` ${pointer} ${number} ${styledLabel}`);\n if (option.description !== undefined) {\n for (const description of wrap(option.description, Math.max(10, capabilities.columns - 9))) {\n const descriptionRail = isSelected ? style.accent(rail, capabilities) : \" \";\n lines.push(` ${descriptionRail} ${style.dim(description, capabilities)}`);\n }\n }\n });\n lines.push(`${style.dim(bottom, capabilities)} ${style.dim(help, capabilities)}`);\n if (compact) {\n lines.push(` ${style.dim(\"esc close\", capabilities)}`);\n } else {\n lines[lines.length - 1] += style.dim(\" · esc close\", capabilities);\n }\n\n for (const line of lines) {\n sink.write(`\\u001B[2K${line}\\n`);\n }\n return lines.length;\n}\n\nexport async function selectOne<T>(options: SelectOptions<T>): Promise<SelectResult<T>> {\n if (!options.capabilities.interactive || options.input.setRawMode === undefined) {\n return { kind: \"unavailable\" };\n }\n let selected = initialIndex(options.options);\n if (selected === -1) {\n return { kind: \"unavailable\" };\n }\n\n return await new Promise<SelectResult<T>>((resolve) => {\n const wasRaw = options.input.isRaw === true;\n let lineCount = 0;\n let frame = 0;\n let settled = false;\n let refreshTimer: ReturnType<typeof setInterval> | undefined;\n\n const attempt = (operation: () => unknown) => {\n try {\n operation();\n } catch {\n // Terminal cleanup is best-effort; every independent restoration must still run.\n }\n };\n const cleanup = () => {\n attempt(() => options.input.off(\"data\", onData));\n attempt(() => options.signal?.removeEventListener(\"abort\", onAbort));\n if (refreshTimer !== undefined) {\n clearInterval(refreshTimer);\n }\n if (!wasRaw) {\n attempt(() => options.input.setRawMode?.(false));\n }\n attempt(() => options.input.pause());\n attempt(() => options.sink.write(\"\\u001B[?25h\"));\n };\n const settle = (result: SelectResult<T>) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(result);\n };\n const draw = () => {\n lineCount = renderMenu(options, selected, lineCount, frame);\n };\n const onAbort = () => settle({ kind: \"cancelled\", reason: \"signal\" });\n const onData = (chunk: Uint8Array | string) => {\n const input = typeof chunk === \"string\" ? chunk : new TextDecoder().decode(chunk);\n if (input.includes(\"\\u0003\")) {\n settle({ kind: \"cancelled\", reason: \"interrupt\" });\n return;\n }\n if (input === \"\\u001B\") {\n settle({ kind: \"cancelled\", reason: \"escape\" });\n return;\n }\n if (input.includes(\"\\u001B[A\")) {\n selected = nextEnabled(options.options, selected, -1);\n draw();\n return;\n }\n if (input.includes(\"\\u001B[B\")) {\n selected = nextEnabled(options.options, selected, 1);\n draw();\n return;\n }\n const shortcut = input.match(/^[1-9]$/u);\n if (shortcut !== null) {\n const index = Number(shortcut[0]) - 1;\n if (options.options[index] !== undefined && options.options[index]?.disabled !== true) {\n selected = index;\n draw();\n }\n return;\n }\n if (input.includes(\"\\r\") || input.includes(\"\\n\")) {\n const selectedOption = options.options[selected];\n if (selectedOption !== undefined && selectedOption.disabled !== true) {\n settle({ kind: \"selected\", value: selectedOption.value });\n }\n }\n };\n\n try {\n options.sink.write(\"\\u001B[?25l\");\n options.input.setRawMode?.(true);\n options.input.resume();\n options.input.on(\"data\", onData);\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n draw();\n if (options.preamble !== undefined && options.capabilities.animation) {\n refreshTimer = setInterval(\n () => {\n frame += 1;\n draw();\n },\n Math.max(32, options.refreshIntervalMs ?? 90),\n );\n }\n } catch {\n settle({ kind: \"unavailable\" });\n return;\n }\n\n if (options.signal?.aborted) {\n onAbort();\n }\n });\n}\n",
|
|
21
|
+
"import { renderLinkCoreFrame } from \"./ascii-scene.js\";\nimport { type SelectInput, selectOne } from \"./select.js\";\nimport type { TextSink } from \"./spinner.js\";\nimport { style } from \"./style.js\";\nimport type { TerminalCapabilities } from \"./terminal.js\";\n\nexport type HomeAction = \"devices\" | \"doctor\" | \"exit\" | \"help\" | \"version\";\nexport type HomeResult =\n | { kind: \"action\"; action: HomeAction }\n | { kind: \"cancelled\"; reason: \"interrupt\" | \"signal\" }\n | { kind: \"unavailable\" };\n\nexport interface HomeScreenOptions {\n version: string;\n input: SelectInput;\n sink: TextSink;\n capabilities: TerminalCapabilities;\n signal?: AbortSignal;\n refreshIntervalMs?: number;\n presentation?: \"full\" | \"menu\";\n}\n\nfunction fit(value: string, width: number): string {\n if (value.length <= width) {\n return value.padEnd(width);\n }\n return width <= 3 ? value.slice(0, width) : `${value.slice(0, width - 3)}...`;\n}\n\nfunction productPanel(version: string, capabilities: TerminalCapabilities): string[] {\n const unicode = capabilities.unicode;\n const width = 36;\n const inner = width - 4;\n const top = unicode ? `╭─${\"─\".repeat(width - 4)}╮` : `+-${\"-\".repeat(width - 4)}+`;\n const bottom = unicode ? `╰${\"─\".repeat(width - 2)}╯` : `+${\"-\".repeat(width - 2)}+`;\n const side = unicode ? \"│\" : \"|\";\n const rows = [\n \"ADB READY\",\n \"Android setup. No guesswork.\",\n \"\",\n \"CHECK ADB and your local setup\",\n \"SEE every visible target\",\n \"USE human or JSON output\",\n \"\",\n `adb-ready v${version}`,\n ];\n return [\n style.dim(top, capabilities),\n ...rows.map((row, index) => {\n const content = fit(row, inner);\n const styled =\n index === 0\n ? style.strong(content, capabilities)\n : index === 1\n ? style.accent(content, capabilities)\n : style.dim(content, capabilities);\n return `${style.dim(side, capabilities)} ${styled} ${style.dim(side, capabilities)}`;\n }),\n style.dim(bottom, capabilities),\n ];\n}\n\nfunction center(value: string, width: number): string {\n const padding = Math.max(0, Math.floor((width - value.length) / 2));\n return `${\" \".repeat(padding)}${value}`;\n}\n\nfunction homePreamble(\n frame: number,\n version: string,\n capabilities: TerminalCapabilities,\n): string[] {\n const angleX = 0.38 + Math.sin(frame * 0.035) * 0.12;\n const angleY = frame * 0.045;\n\n if (capabilities.columns < 76) {\n const width = Math.max(20, Math.min(34, capabilities.columns - 4));\n const core = renderLinkCoreFrame({ angleX, angleY, width, height: 12 });\n return [\n ...core.map((line) => style.accent(center(line, capabilities.columns), capabilities)),\n \"\",\n style.strong(center(\"ADB READY\", capabilities.columns), capabilities),\n style.dim(center(\"Android setup. No guesswork.\", capabilities.columns), capabilities),\n style.dim(center(`v${version}`, capabilities.columns), capabilities),\n \"\",\n ];\n }\n\n const coreWidth = 36;\n const core = renderLinkCoreFrame({ angleX, angleY, width: coreWidth, height: 14 });\n const panel = productPanel(version, capabilities);\n const panelOffset = 2;\n return core\n .map((line, index) => {\n const left = style.accent(line.padEnd(coreWidth), capabilities);\n const right = index >= panelOffset ? (panel[index - panelOffset] ?? \"\") : \"\";\n return `${left} ${right}`.trimEnd();\n })\n .concat(\"\");\n}\n\nconst COMPACT_WORDMARK = [\n \" ## ### ### ### #### ## ### # #\",\n \"# # # # # # # # # # # # # # #\",\n \"#### # # ### ### ### #### # # ## \",\n \"# # # # # # # # # # # # # # \",\n \"# # ### ### # # #### # # ### # \",\n];\n\nfunction compactSessionPreamble(capabilities: TerminalCapabilities): string[] {\n const unicode = capabilities.unicode;\n const width = Math.max(20, Math.min(45, capabilities.columns));\n const inner = width - 4;\n const top = unicode ? `╭${\"─\".repeat(width - 2)}╮` : `+${\"-\".repeat(width - 2)}+`;\n const bottom = unicode ? `╰${\"─\".repeat(width - 2)}╯` : `+${\"-\".repeat(width - 2)}+`;\n const side = unicode ? \"│\" : \"|\";\n const wordmark = width >= 45 ? COMPACT_WORDMARK : [\"ADB READY\"];\n const rows = wordmark.map((line) => {\n const content = fit(center(line, inner), inner);\n return `${style.dim(side, capabilities)} ${style.accent(content, capabilities)} ${style.dim(side, capabilities)}`;\n });\n\n return [\"\", style.dim(top, capabilities), ...rows, style.dim(bottom, capabilities), \"\"];\n}\n\nexport function clearInteractiveScreen(sink: TextSink, capabilities: TerminalCapabilities): void {\n if (capabilities.interactive) {\n sink.write(\"\\u001B[2J\\u001B[H\");\n }\n}\n\nexport async function showHomeScreen(options: HomeScreenOptions): Promise<HomeResult> {\n if (!options.capabilities.interactive) {\n return { kind: \"unavailable\" };\n }\n\n const presentation = options.presentation ?? \"full\";\n if (presentation === \"full\") {\n clearInteractiveScreen(options.sink, options.capabilities);\n }\n const selection = await selectOne({\n title: presentation === \"full\" ? \"WHAT DO YOU WANT TO DO?\" : \"ACTIONS\",\n options: [\n {\n value: \"doctor\" as const,\n label: \"Check my setup\",\n description: \"Validate runtime, ADB, server, and target access\",\n recommended: true,\n },\n {\n value: \"devices\" as const,\n label: \"Show Android targets\",\n description: \"See connected devices and running emulators\",\n },\n {\n value: \"version\" as const,\n label: \"Show version\",\n description: `ADB Ready ${options.version}`,\n },\n {\n value: \"help\" as const,\n label: \"View command reference\",\n description: \"Explore commands, flags, and automation output\",\n },\n { value: \"exit\" as const, label: \"Exit\", description: \"Close ADB Ready\" },\n ],\n input: options.input,\n sink: options.sink,\n capabilities:\n presentation === \"full\"\n ? options.capabilities\n : { ...options.capabilities, animation: false },\n preamble: (frame: number) =>\n presentation === \"full\"\n ? homePreamble(frame, options.version, options.capabilities)\n : compactSessionPreamble(options.capabilities),\n ...(options.refreshIntervalMs === undefined\n ? {}\n : { refreshIntervalMs: options.refreshIntervalMs }),\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n });\n\n if (selection.kind === \"unavailable\") {\n return selection;\n }\n if (selection.kind === \"cancelled\") {\n return selection.reason === \"escape\"\n ? { kind: \"action\", action: \"exit\" }\n : { kind: \"cancelled\", reason: selection.reason };\n }\n return { kind: \"action\", action: selection.value };\n}\n",
|
|
22
|
+
"import { sanitizeTerminalText, style, symbols } from \"./style.js\";\nimport type { TerminalCapabilities } from \"./terminal.js\";\n\nexport interface TextSink {\n write(chunk: string): unknown;\n}\n\nexport interface TimerScheduler {\n setInterval(callback: () => void, milliseconds: number): unknown;\n clearInterval(handle: unknown): void;\n}\n\nconst scheduler: TimerScheduler = {\n setInterval: (callback, milliseconds) => setInterval(callback, milliseconds),\n clearInterval: (handle) => clearInterval(handle as ReturnType<typeof setInterval>),\n};\n\nexport class Spinner {\n readonly #sink: TextSink;\n readonly #capabilities: TerminalCapabilities;\n readonly #scheduler: TimerScheduler;\n #timer: unknown;\n #frame = 0;\n #message = \"\";\n #cursorHidden = false;\n\n constructor(\n sink: TextSink,\n capabilities: TerminalCapabilities,\n timerScheduler: TimerScheduler = scheduler,\n ) {\n this.#sink = sink;\n this.#capabilities = capabilities;\n this.#scheduler = timerScheduler;\n }\n\n start(message: string): void {\n this.stopAnimation();\n this.#message = sanitizeTerminalText(message);\n if (!this.#capabilities.animation) {\n return;\n }\n this.hideCursor();\n this.drawFrame();\n this.#timer = this.#scheduler.setInterval(() => this.drawFrame(), 80);\n }\n\n succeed(message = this.#message): void {\n this.finish(\"success\", message);\n }\n\n fail(message = this.#message): void {\n this.finish(\"failure\", message);\n }\n\n warn(message = this.#message): void {\n this.finish(\"warning\", message);\n }\n\n dispose(): void {\n this.stopAnimation();\n this.showCursor();\n }\n\n private finish(status: \"failure\" | \"success\" | \"warning\", message: string): void {\n this.stopAnimation();\n if (this.#capabilities.animation) {\n this.#sink.write(\"\\r\\u001B[2K\");\n }\n const glyphs = symbols(this.#capabilities);\n const symbol =\n status === \"success\"\n ? style.success(glyphs.success, this.#capabilities)\n : status === \"warning\"\n ? style.warning(glyphs.warning, this.#capabilities)\n : style.failure(glyphs.failure, this.#capabilities);\n this.#sink.write(`${symbol} ${sanitizeTerminalText(message)}\\n`);\n this.showCursor();\n }\n\n private drawFrame(): void {\n const frames = this.#capabilities.unicode\n ? [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"]\n : [\"-\", \"\\\\\", \"|\", \"/\"];\n const frame = frames[this.#frame % frames.length] ?? frames[0] ?? \">\";\n this.#frame += 1;\n this.#sink.write(`\\r\\u001B[2K${style.accent(frame, this.#capabilities)} ${this.#message}`);\n }\n\n private stopAnimation(): void {\n if (this.#timer !== undefined) {\n this.#scheduler.clearInterval(this.#timer);\n this.#timer = undefined;\n }\n }\n\n private hideCursor(): void {\n if (!this.#cursorHidden) {\n this.#sink.write(\"\\u001B[?25l\");\n this.#cursorHidden = true;\n }\n }\n\n private showCursor(): void {\n if (this.#cursorHidden) {\n this.#sink.write(\"\\u001B[?25h\");\n this.#cursorHidden = false;\n }\n }\n}\n",
|
|
23
|
+
"import type { EventBus } from \"../core/event-bus.js\";\nimport type { AdbReadyEvent } from \"../domain/contracts.js\";\nimport { Spinner, type TextSink, type TimerScheduler } from \"./spinner.js\";\nimport type { TerminalCapabilities } from \"./terminal.js\";\n\nexport class ProgressRenderer {\n readonly #spinner: Spinner;\n readonly #unsubscribe: () => void;\n readonly #verbose: boolean;\n readonly #sink: TextSink;\n\n constructor(options: {\n bus: EventBus;\n sink: TextSink;\n capabilities: TerminalCapabilities;\n verbose?: boolean;\n scheduler?: TimerScheduler;\n }) {\n this.#sink = options.sink;\n this.#verbose = options.verbose ?? false;\n this.#spinner = new Spinner(options.sink, options.capabilities, options.scheduler);\n this.#unsubscribe = options.bus.subscribe((event) => this.onEvent(event));\n }\n\n dispose(): void {\n this.#unsubscribe();\n this.#spinner.dispose();\n }\n\n private onEvent(event: AdbReadyEvent): void {\n if (event.type === \"operation.started\") {\n this.#spinner.start(event.message);\n } else if (event.type === \"operation.completed\") {\n this.#spinner.succeed(event.message.replace(/ completed$/u, \"\"));\n } else if (event.type === \"operation.failed\") {\n this.#spinner.fail(event.message.replace(/ failed$/u, \"\"));\n } else if (this.#verbose) {\n this.#sink.write(`› ${event.message}\\n`);\n }\n }\n}\n",
|
|
24
|
+
"import type { AdbDevice } from \"../adb/parsers.js\";\nimport type { DevicesData, DoctorData } from \"../app/commands.js\";\nimport type { OutputFormat } from \"../cli/arguments.js\";\nimport type { EventBus } from \"../core/event-bus.js\";\nimport type { AdbReadyEvent, Problem, ResultEnvelope } from \"../domain/contracts.js\";\nimport type { TextSink } from \"./spinner.js\";\nimport { sanitizeTerminalText, style, symbols } from \"./style.js\";\nimport type { TerminalCapabilities } from \"./terminal.js\";\n\nexport type CommandResult = ResultEnvelope<unknown>;\n\nexport interface ResultRenderOptions {\n format: OutputFormat;\n capabilities: TerminalCapabilities;\n sink: TextSink;\n verbose?: boolean;\n}\n\nfunction clean(value: unknown): string {\n return sanitizeTerminalText(String(value));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isDoctorData(value: unknown): value is DoctorData {\n return (\n isRecord(value) &&\n isRecord(value.runtime) &&\n isRecord(value.adb) &&\n Array.isArray(value.devices)\n );\n}\n\nfunction hasDevices(value: unknown): value is DoctorData | DevicesData {\n return isRecord(value) && Array.isArray(value.devices);\n}\n\nfunction deviceLabel(device: AdbDevice): string {\n const identity = device.model ?? device.product ?? device.device;\n return identity === undefined\n ? `${clean(device.serial)} · ${clean(device.state)}`\n : `${clean(identity)} · ${clean(device.serial)} · ${clean(device.state)}`;\n}\n\nfunction problemLines(\n problem: Problem,\n capabilities: TerminalCapabilities,\n verbose: boolean,\n): string[] {\n const glyphs = symbols(capabilities);\n const marker =\n problem.severity === \"error\"\n ? style.failure(glyphs.failure, capabilities)\n : style.warning(glyphs.warning, capabilities);\n const lines = [\n `${marker} ${style.strong(clean(problem.summary), capabilities)}`,\n ` ${clean(problem.detail)}`,\n ];\n const action = problem.actions[0];\n if (action !== undefined) {\n lines.push(` ${style.accent(\"Next:\", capabilities)} ${clean(action.title)}`);\n }\n if (verbose) {\n for (const evidence of problem.evidence) {\n const field =\n evidence.field === undefined ? evidence.source : `${evidence.source}.${evidence.field}`;\n lines.push(\n ` ${style.dim(`${clean(field)}: ${clean(JSON.stringify(evidence.value))}`, capabilities)}`,\n );\n }\n }\n return lines;\n}\n\nfunction renderHuman(result: CommandResult, options: ResultRenderOptions): void {\n const { capabilities, sink } = options;\n const glyphs = symbols(capabilities);\n const lines: string[] = [];\n lines.push(\n `${style.strong(\"ADB Ready\", capabilities)} ${style.dim(`· ${clean(result.command)}`, capabilities)}`,\n \"\",\n );\n\n if (result.command === \"doctor\" && isDoctorData(result.data)) {\n const data = result.data;\n const runtime = `${data.runtime.name} ${data.runtime.version}`;\n const adbVersion = data.adb.version.platformToolsVersion ?? \"unknown version\";\n lines.push(\n `${style.success(glyphs.success, capabilities)} Runtime ${clean(runtime)} · ${clean(data.runtime.platform)}/${clean(data.runtime.architecture)}`,\n `${style.success(glyphs.success, capabilities)} ADB Platform-Tools ${clean(adbVersion)}`,\n `${style.success(glyphs.success, capabilities)} Path ${clean(data.adb.path)}`,\n `${style.success(glyphs.success, capabilities)} Features ${String(data.adb.hostFeatures.length)} detected`,\n \"\",\n );\n }\n\n if (hasDevices(result.data)) {\n const devices = result.data.devices;\n lines.push(style.strong(`Targets (${String(devices.length)})`, capabilities));\n if (devices.length === 0) {\n lines.push(`${style.dim(glyphs.end, capabilities)} None visible`);\n } else {\n devices.forEach((device, index) => {\n const branch = index === devices.length - 1 ? glyphs.end : glyphs.branch;\n lines.push(`${style.dim(branch, capabilities)} ${deviceLabel(device)}`);\n });\n }\n if (\"selected\" in result.data && result.data.selected !== undefined) {\n lines.push(\n `${style.accent(glyphs.active, capabilities)} Selected ${deviceLabel(result.data.selected)}`,\n );\n }\n }\n\n if (result.problems.length > 0) {\n lines.push(\"\", style.strong(\"Diagnostics\", capabilities));\n for (const problem of result.problems) {\n lines.push(...problemLines(problem, capabilities, options.verbose ?? false));\n }\n }\n\n const status = result.ok\n ? `${style.success(glyphs.success, capabilities)} Completed in ${String(result.durationMs)}ms`\n : `${style.failure(glyphs.failure, capabilities)} Failed in ${String(result.durationMs)}ms`;\n lines.push(\"\", status);\n sink.write(`${lines.join(\"\\n\")}\\n`);\n}\n\nfunction renderPlain(result: CommandResult, sink: TextSink): void {\n sink.write(`command=${clean(result.command)}\\n`);\n sink.write(`ok=${String(result.ok)}\\n`);\n sink.write(`duration_ms=${String(result.durationMs)}\\n`);\n if (isDoctorData(result.data)) {\n const data = result.data;\n sink.write(`runtime=${clean(data.runtime.name)}\\n`);\n sink.write(`runtime_version=${clean(data.runtime.version)}\\n`);\n sink.write(`adb_version=${clean(data.adb.version.platformToolsVersion ?? \"unknown\")}\\n`);\n }\n if (hasDevices(result.data)) {\n sink.write(`device_count=${String(result.data.devices.length)}\\n`);\n result.data.devices.forEach((device, index) => {\n sink.write(`device_${String(index)}=${deviceLabel(device)}\\n`);\n });\n if (\"selected\" in result.data && result.data.selected !== undefined) {\n sink.write(`selected=${deviceLabel(result.data.selected)}\\n`);\n }\n }\n for (const problem of result.problems) {\n sink.write(`problem=${clean(problem.code)}:${clean(problem.summary)}\\n`);\n }\n}\n\nexport function renderResult(result: CommandResult, options: ResultRenderOptions): void {\n if (options.format === \"json\") {\n options.sink.write(`${JSON.stringify(result)}\\n`);\n } else if (options.format === \"ndjson\") {\n options.sink.write(`${JSON.stringify({ kind: \"result\", ...result })}\\n`);\n } else if (options.format === \"plain\") {\n renderPlain(result, options.sink);\n } else {\n renderHuman(result, options);\n }\n}\n\nexport class NdjsonEventRenderer {\n readonly #unsubscribe: () => void;\n\n constructor(bus: EventBus, sink: TextSink) {\n this.#unsubscribe = bus.subscribe((event) => this.write(event, sink));\n }\n\n dispose(): void {\n this.#unsubscribe();\n }\n\n private write(event: AdbReadyEvent, sink: TextSink): void {\n sink.write(`${JSON.stringify({ kind: \"event\", ...event })}\\n`);\n }\n}\n",
|
|
25
|
+
"import type { OutputFormat } from \"../cli/arguments.js\";\n\nexport interface TerminalPreferences {\n format: OutputFormat;\n nonInteractive: boolean;\n color?: boolean;\n unicode?: boolean;\n animation?: boolean;\n interactive?: boolean;\n env?: NodeJS.ProcessEnv;\n inputIsTTY: boolean;\n outputIsTTY: boolean;\n columns?: number;\n}\n\nexport interface TerminalCapabilities {\n interactive: boolean;\n color: boolean;\n unicode: boolean;\n animation: boolean;\n columns: number;\n}\n\nfunction environmentFlag(value: string | undefined): boolean {\n if (value === undefined) {\n return false;\n }\n return ![\"\", \"0\", \"false\", \"no\", \"off\"].includes(value.trim().toLowerCase());\n}\n\nexport function resolveTerminalCapabilities(\n preferences: TerminalPreferences,\n): TerminalCapabilities {\n const env = preferences.env ?? {};\n const human = preferences.format === \"human\";\n const dumb = env.TERM?.toLowerCase() === \"dumb\";\n const ci = environmentFlag(env.CI);\n const reducedMotion = environmentFlag(env.ADB_READY_REDUCED_MOTION);\n const noColorEnvironment = Object.hasOwn(env, \"NO_COLOR\");\n const locale = `${env.LC_ALL ?? \"\"} ${env.LC_CTYPE ?? \"\"} ${env.LANG ?? \"\"}`;\n const localeSupportsUnicode = /UTF-?8/iu.test(locale);\n const interactive =\n human &&\n preferences.nonInteractive === false &&\n preferences.interactive !== false &&\n preferences.inputIsTTY &&\n preferences.outputIsTTY &&\n !ci &&\n !dumb;\n const colorPreference = preferences.color ?? !noColorEnvironment;\n const unicodePreference = preferences.unicode ?? localeSupportsUnicode;\n\n return {\n interactive,\n color: human && preferences.outputIsTTY && !dumb && colorPreference,\n unicode: human && unicodePreference,\n animation:\n interactive && preferences.animation !== false && !reducedMotion && !environmentFlag(env.CI),\n columns: Math.max(20, preferences.columns ?? 80),\n };\n}\n",
|
|
26
|
+
"export type CommandName = \"devices\" | \"doctor\" | \"help\" | \"version\";\nexport type OutputFormat = \"human\" | \"json\" | \"ndjson\" | \"plain\";\n\nexport interface CliOptions {\n command: CommandName;\n helpTarget?: Exclude<CommandName, \"help\" | \"version\">;\n format: OutputFormat;\n quiet: boolean;\n verbose: boolean;\n nonInteractive: boolean;\n color?: boolean;\n unicode?: boolean;\n animation?: boolean;\n timeoutMs?: number;\n adbPath?: string;\n adbHost?: string;\n adbPort?: number;\n configPath?: string;\n select: boolean;\n}\n\nexport interface CliParseFailure {\n ok: false;\n code: \"CLI_INVALID_OPTION\" | \"CLI_INVALID_VALUE\" | \"CLI_USAGE\";\n message: string;\n option?: string;\n}\n\nexport interface CliParseSuccess {\n ok: true;\n options: CliOptions;\n}\n\nexport type CliParseResult = CliParseFailure | CliParseSuccess;\n\nconst COMMANDS = new Set<CommandName>([\"devices\", \"doctor\", \"help\", \"version\"]);\nconst BOOLEAN_OPTIONS = new Set([\n \"-h\",\n \"--help\",\n \"-V\",\n \"--version\",\n \"--json\",\n \"--quiet\",\n \"--verbose\",\n \"--non-interactive\",\n \"--color\",\n \"--no-color\",\n \"--unicode\",\n \"--no-unicode\",\n \"--animation\",\n \"--no-animation\",\n \"--select\",\n]);\n\nfunction failure(code: CliParseFailure[\"code\"], message: string, option?: string): CliParseFailure {\n return { ok: false, code, message, ...(option === undefined ? {} : { option }) };\n}\n\nfunction parseDuration(value: string): number | undefined {\n const match = value.match(/^(\\d+(?:\\.\\d+)?)(ms|s|m)?$/u);\n if (match === null) {\n return undefined;\n }\n const amount = Number(match[1]);\n const unit = match[2] ?? \"ms\";\n const multiplier = unit === \"m\" ? 60_000 : unit === \"s\" ? 1_000 : 1;\n const milliseconds = amount * multiplier;\n return Number.isSafeInteger(milliseconds) && milliseconds > 0 ? milliseconds : undefined;\n}\n\nfunction splitLongOption(argument: string): { option: string; inlineValue?: string } {\n const separator = argument.indexOf(\"=\");\n if (separator === -1) {\n return { option: argument };\n }\n return { option: argument.slice(0, separator), inlineValue: argument.slice(separator + 1) };\n}\n\nexport function parseArguments(argv: readonly string[]): CliParseResult {\n let command: CommandName | undefined;\n let helpTarget: CliOptions[\"helpTarget\"];\n let format: OutputFormat = \"human\";\n let quiet = false;\n let verbose = false;\n let nonInteractive = false;\n let color: boolean | undefined;\n let unicode: boolean | undefined;\n let animation: boolean | undefined;\n let timeoutMs: number | undefined;\n let adbPath: string | undefined;\n let adbHost: string | undefined;\n let adbPort: number | undefined;\n let configPath: string | undefined;\n let select = false;\n\n for (let index = 0; index < argv.length; index += 1) {\n const argument = argv[index];\n if (argument === undefined) {\n continue;\n }\n\n if (!argument.startsWith(\"-\")) {\n if (!COMMANDS.has(argument as CommandName)) {\n return failure(\"CLI_USAGE\", `Unknown command: ${argument}`);\n }\n const candidate = argument as CommandName;\n if (command === undefined) {\n command = candidate;\n continue;\n }\n if (command === \"help\" && (candidate === \"doctor\" || candidate === \"devices\")) {\n helpTarget = candidate;\n continue;\n }\n return failure(\"CLI_USAGE\", `Unexpected argument: ${argument}`);\n }\n\n const { option, inlineValue } = splitLongOption(argument);\n if (inlineValue !== undefined && BOOLEAN_OPTIONS.has(option)) {\n return failure(\"CLI_INVALID_OPTION\", `${option} does not accept a value.`, option);\n }\n const readValue = (): CliParseFailure | string => {\n if (inlineValue !== undefined) {\n return inlineValue;\n }\n const value = argv[index + 1];\n if (value === undefined || value.startsWith(\"-\")) {\n return failure(\"CLI_INVALID_VALUE\", `${option} requires a value.`, option);\n }\n index += 1;\n return value;\n };\n\n if (option === \"-h\" || option === \"--help\") {\n if (command === \"doctor\" || command === \"devices\") {\n helpTarget = command;\n }\n command = \"help\";\n } else if (option === \"-V\" || option === \"--version\") {\n command = \"version\";\n } else if (option === \"--json\") {\n format = \"json\";\n } else if (option === \"--format\") {\n const value = readValue();\n if (typeof value !== \"string\") {\n return value;\n }\n if (!new Set<OutputFormat>([\"human\", \"json\", \"ndjson\", \"plain\"]).has(value as OutputFormat)) {\n return failure(\n \"CLI_INVALID_VALUE\",\n `Invalid format: ${value}. Expected human, plain, json, or ndjson.`,\n option,\n );\n }\n format = value as OutputFormat;\n } else if (option === \"--quiet\") {\n quiet = true;\n } else if (option === \"--verbose\") {\n verbose = true;\n } else if (option === \"--non-interactive\") {\n nonInteractive = true;\n } else if (option === \"--color\") {\n color = true;\n } else if (option === \"--no-color\") {\n color = false;\n } else if (option === \"--unicode\") {\n unicode = true;\n } else if (option === \"--no-unicode\") {\n unicode = false;\n } else if (option === \"--animation\") {\n animation = true;\n } else if (option === \"--no-animation\") {\n animation = false;\n } else if (option === \"--select\") {\n select = true;\n } else if (option === \"--timeout\") {\n const value = readValue();\n if (typeof value !== \"string\") {\n return value;\n }\n timeoutMs = parseDuration(value);\n if (timeoutMs === undefined) {\n return failure(\n \"CLI_INVALID_VALUE\",\n `Invalid timeout: ${value}. Use a positive duration such as 500ms, 5s, or 1m.`,\n option,\n );\n }\n } else if (option === \"--adb\") {\n const value = readValue();\n if (typeof value !== \"string\") {\n return value;\n }\n if (value.trim() === \"\") {\n return failure(\"CLI_INVALID_VALUE\", \"--adb cannot be empty.\", option);\n }\n adbPath = value;\n } else if (option === \"--adb-host\") {\n const value = readValue();\n if (typeof value !== \"string\") {\n return value;\n }\n if (value.trim() === \"\") {\n return failure(\"CLI_INVALID_VALUE\", \"--adb-host cannot be empty.\", option);\n }\n adbHost = value;\n } else if (option === \"--adb-port\") {\n const value = readValue();\n if (typeof value !== \"string\") {\n return value;\n }\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed < 1 || parsed > 65_535) {\n return failure(\"CLI_INVALID_VALUE\", `Invalid ADB server port: ${value}.`, option);\n }\n adbPort = parsed;\n } else if (option === \"--config\") {\n const value = readValue();\n if (typeof value !== \"string\") {\n return value;\n }\n if (value.trim() === \"\") {\n return failure(\"CLI_INVALID_VALUE\", \"--config cannot be empty.\", option);\n }\n configPath = value;\n } else {\n return failure(\"CLI_INVALID_OPTION\", `Unknown option: ${option}`, option);\n }\n }\n\n if (quiet && verbose) {\n return failure(\"CLI_USAGE\", \"--quiet and --verbose cannot be used together.\");\n }\n\n command ??= \"help\";\n if (select && command !== \"devices\") {\n return failure(\"CLI_USAGE\", \"--select can only be used with the devices command.\", \"--select\");\n }\n if (select && nonInteractive) {\n return failure(\"CLI_USAGE\", \"--select cannot be combined with --non-interactive.\", \"--select\");\n }\n if (select && format !== \"human\") {\n return failure(\"CLI_USAGE\", \"--select can only be used with human output.\", \"--select\");\n }\n\n return {\n ok: true,\n options: {\n command,\n ...(helpTarget === undefined ? {} : { helpTarget }),\n format,\n quiet,\n verbose,\n nonInteractive,\n ...(color === undefined ? {} : { color }),\n ...(unicode === undefined ? {} : { unicode }),\n ...(animation === undefined ? {} : { animation }),\n ...(timeoutMs === undefined ? {} : { timeoutMs }),\n ...(adbPath === undefined ? {} : { adbPath }),\n ...(adbHost === undefined ? {} : { adbHost }),\n ...(adbPort === undefined ? {} : { adbPort }),\n ...(configPath === undefined ? {} : { configPath }),\n select,\n },\n };\n}\n"
|
|
27
|
+
],
|
|
28
|
+
"mappings": "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",
|
|
29
|
+
"debugId": "E7C1326D860AA56164756E2164756E21",
|
|
30
|
+
"names": []
|
|
31
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "adb-ready",
|
|
3
|
+
"version": "0.0.1-alpha.0",
|
|
4
|
+
"description": "Make an Android target ready, then keep the development session working.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"adb-ready": "dist/cli.js",
|
|
8
|
+
"adbr": "dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"schema",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=22"
|
|
17
|
+
},
|
|
18
|
+
"packageManager": "bun@1.3.11",
|
|
19
|
+
"scripts": {
|
|
20
|
+
"dev": "bun run src/cli.ts",
|
|
21
|
+
"build": "bun run scripts/build.mjs",
|
|
22
|
+
"typecheck": "tsc --noEmit",
|
|
23
|
+
"lint": "biome check .",
|
|
24
|
+
"format": "biome check --write .",
|
|
25
|
+
"ui:playground": "bun run scripts/ui-playground.ts",
|
|
26
|
+
"ui:check": "bun run scripts/ui-playground.ts --all --non-interactive",
|
|
27
|
+
"test": "bun test",
|
|
28
|
+
"test:commands": "bun run build && bun run scripts/command-matrix.mjs",
|
|
29
|
+
"test:integration": "bun test tests/integration",
|
|
30
|
+
"smoke": "bun run build && bun run scripts/runtime-smoke.mjs",
|
|
31
|
+
"pack:check": "bun run build && bun run scripts/package-check.mjs",
|
|
32
|
+
"privacy:check": "bun run scripts/privacy-check.mjs",
|
|
33
|
+
"verify": "bun run scripts/verify.mjs",
|
|
34
|
+
"verify:real-adb": "bun run build && bun run scripts/real-adb-check.mjs",
|
|
35
|
+
"check": "bun run verify",
|
|
36
|
+
"prepack": "bun run build"
|
|
37
|
+
},
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "git+https://github.com/Adam014/adb-ready.git"
|
|
41
|
+
},
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/Adam014/adb-ready/issues"
|
|
44
|
+
},
|
|
45
|
+
"homepage": "https://github.com/Adam014/adb-ready#readme",
|
|
46
|
+
"keywords": [
|
|
47
|
+
"adb",
|
|
48
|
+
"android",
|
|
49
|
+
"cli",
|
|
50
|
+
"developer-tools",
|
|
51
|
+
"expo",
|
|
52
|
+
"react-native",
|
|
53
|
+
"wireless-debugging"
|
|
54
|
+
],
|
|
55
|
+
"license": "UNLICENSED",
|
|
56
|
+
"publishConfig": {
|
|
57
|
+
"access": "public"
|
|
58
|
+
},
|
|
59
|
+
"devDependencies": {
|
|
60
|
+
"@arethetypeswrong/cli": "0.18.5",
|
|
61
|
+
"@biomejs/biome": "2.5.12",
|
|
62
|
+
"@types/bun": "1.4.2",
|
|
63
|
+
"@types/node": "22.20.2",
|
|
64
|
+
"publint": "0.3.24",
|
|
65
|
+
"typescript": "7.0.2"
|
|
66
|
+
}
|
|
67
|
+
}
|