diff --git a/.oxlintrc.json b/.oxlintrc.json index 8b3c6ecc..26523a87 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -5,8 +5,14 @@ "node": true, "es6": true }, + "categories": { + "correctness": "error" + }, "rules": { - "eslint/no-unused-vars": "error", + "eslint/no-unused-vars": [ + "error", + { "fix": { "imports": "safe-fix", "variables": "suggestion" } } + ], "eslint/prefer-const": "error", "eslint/no-useless-escape": "error", "eslint/no-empty": ["error", { "allowEmptyCatch": true }], diff --git a/src/__tests__/test-utils/session-factories.ts b/src/__tests__/test-utils/session-factories.ts index 997c9eca..7184599d 100644 --- a/src/__tests__/test-utils/session-factories.ts +++ b/src/__tests__/test-utils/session-factories.ts @@ -1,10 +1,7 @@ import type { SessionState } from '../../daemon/types.ts'; import { IOS_SIMULATOR, ANDROID_EMULATOR, MACOS_DEVICE } from './device-fixtures.ts'; -export function makeSession( - name: string, - overrides?: Partial, -): SessionState { +export function makeSession(name: string, overrides?: Partial): SessionState { return { name, device: IOS_SIMULATOR, @@ -14,23 +11,14 @@ export function makeSession( }; } -export function makeIosSession( - name: string, - overrides?: Partial, -): SessionState { +export function makeIosSession(name: string, overrides?: Partial): SessionState { return makeSession(name, { device: IOS_SIMULATOR, ...overrides }); } -export function makeAndroidSession( - name: string, - overrides?: Partial, -): SessionState { +export function makeAndroidSession(name: string, overrides?: Partial): SessionState { return makeSession(name, { device: ANDROID_EMULATOR, ...overrides }); } -export function makeMacOsSession( - name: string, - overrides?: Partial, -): SessionState { +export function makeMacOsSession(name: string, overrides?: Partial): SessionState { return makeSession(name, { device: MACOS_DEVICE, ...overrides }); } diff --git a/src/core/__tests__/dispatch-push.test.ts b/src/core/__tests__/dispatch-push.test.ts index 448a0f6b..d8b31615 100644 --- a/src/core/__tests__/dispatch-push.test.ts +++ b/src/core/__tests__/dispatch-push.test.ts @@ -59,7 +59,10 @@ test('dispatch push prefers existing brace-prefixed payload file over inline par process.env.AGENT_DEVICE_TEST_ARGS_FILE = argsLogPath; try { - const result = await dispatchCommand(ANDROID_EMULATOR, 'push', ['com.example.app', payloadPath]); + const result = await dispatchCommand(ANDROID_EMULATOR, 'push', [ + 'com.example.app', + payloadPath, + ]); assert.deepEqual(result, { platform: 'android', package: 'com.example.app', diff --git a/src/core/__tests__/dispatch-trigger-app-event.test.ts b/src/core/__tests__/dispatch-trigger-app-event.test.ts index 01ae4493..0f646e46 100644 --- a/src/core/__tests__/dispatch-trigger-app-event.test.ts +++ b/src/core/__tests__/dispatch-trigger-app-event.test.ts @@ -44,7 +44,10 @@ test('trigger-app-event validates payload JSON', async () => { try { await assert.rejects( () => - dispatchCommand(ANDROID_EMULATOR, 'trigger-app-event', ['screenshot_taken', '{invalid-json']), + dispatchCommand(ANDROID_EMULATOR, 'trigger-app-event', [ + 'screenshot_taken', + '{invalid-json', + ]), (error: unknown) => { assert.equal(error instanceof AppError, true); assert.equal((error as AppError).code, 'INVALID_ARGS'); @@ -126,7 +129,9 @@ test('trigger-app-event prefers platform-specific template over global template' process.env.AGENT_DEVICE_ANDROID_APP_EVENT_URL_TEMPLATE = 'myapp://android?name={event}'; try { - const result = await dispatchCommand(ANDROID_EMULATOR, 'trigger-app-event', ['screenshot_taken']); + const result = await dispatchCommand(ANDROID_EMULATOR, 'trigger-app-event', [ + 'screenshot_taken', + ]); assert.equal(result?.eventUrl, 'myapp://android?name=screenshot_taken'); } finally { process.env.PATH = previousPath; diff --git a/src/core/dispatch-resolve.ts b/src/core/dispatch-resolve.ts index 39fa5dca..60d94549 100644 --- a/src/core/dispatch-resolve.ts +++ b/src/core/dispatch-resolve.ts @@ -82,7 +82,13 @@ export async function resolveAppleDevice( throw new AppError('DEVICE_NOT_FOUND', 'No devices found', { selector }); } -export const resolveIosDevice = resolveAppleDevice; +export async function resolveIosDevice( + devices: DeviceInfo[], + selector: AppleDeviceSelector, + context: { simulatorSetPath?: string }, +): Promise { + return await resolveAppleDevice(devices, selector, context); +} export async function resolveTargetDevice(flags: ResolveDeviceFlags): Promise { const normalizedPlatform = normalizePlatformSelector(flags.platform); diff --git a/src/daemon/__tests__/request-router-android-modal.test.ts b/src/daemon/__tests__/request-router-android-modal.test.ts index cdfa3d85..affb715b 100644 --- a/src/daemon/__tests__/request-router-android-modal.test.ts +++ b/src/daemon/__tests__/request-router-android-modal.test.ts @@ -61,7 +61,6 @@ vi.mock('../../utils/exec.ts', () => ({ }), })); - function makeAndroidSession(name: string): SessionState { return { name, diff --git a/src/platforms/android/devices.ts b/src/platforms/android/devices.ts index 793138e0..41bf13d2 100644 --- a/src/platforms/android/devices.ts +++ b/src/platforms/android/devices.ts @@ -435,17 +435,6 @@ export async function ensureAndroidEmulatorBooted(params: { }; } -export async function ensureAndroidEmulatorHeadlessBooted(params: { - avdName: string; - serial?: string; - timeoutMs?: number; -}): Promise { - return await ensureAndroidEmulatorBooted({ - ...params, - headless: true, - }); -} - export async function waitForAndroidBoot(serial: string, timeoutMs = 60000): Promise { const timeoutBudget = timeoutMs; const deadline = Deadline.fromTimeoutMs(timeoutBudget); diff --git a/src/platforms/ios/devices.ts b/src/platforms/ios/devices.ts index 00959d12..abbab872 100644 --- a/src/platforms/ios/devices.ts +++ b/src/platforms/ios/devices.ts @@ -371,5 +371,3 @@ export async function listAppleDevices( devices = mergeAppleDevices(devices, devicectlDevices); return mergeAppleDevices(devices, xctraceDevices); } - -export const listIosDevices = listAppleDevices; diff --git a/src/platforms/linux/screenshot.ts b/src/platforms/linux/screenshot.ts index 0d674160..8c7fd4f6 100644 --- a/src/platforms/linux/screenshot.ts +++ b/src/platforms/linux/screenshot.ts @@ -19,9 +19,6 @@ const screenshotResolver = createLinuxToolResolver({ 'scrot, import (ImageMagick), or gnome-screenshot is required for screenshots on X11. Install via your package manager.', }); -/** Reset cached tool (for testing). */ -export const resetScreenshotToolCache = screenshotResolver.resetCache; - /** * Capture a screenshot of the Linux desktop. * diff --git a/src/utils/cli-config.ts b/src/utils/cli-config.ts index fc775553..bb59f51c 100644 --- a/src/utils/cli-config.ts +++ b/src/utils/cli-config.ts @@ -26,28 +26,6 @@ export function resolveConfigBackedFlagDefaults(options: { return mergeDefinedFlags(defaults, readEnvFlagDefaults(env, options.command)); } -export function readEnvFlagDefaultsForKeys( - env: EnvMap, - keys: readonly FlagKey[], -): Partial { - const flags: Partial = {}; - for (const key of keys) { - const spec = getOptionSpec(key); - if (!spec) continue; - const envValue = spec.env.names - .map((name) => ({ name, value: env[name] })) - .find((entry) => typeof entry.value === 'string' && entry.value.trim().length > 0); - if (!envValue) continue; - (flags as Record)[key] = parseOptionValueFromSource( - spec, - envValue.value as string, - `environment variable ${envValue.name}`, - envValue.name, - ); - } - return flags; -} - function resolveConfigPaths( cwd: string, explicitCliConfigPath: string | undefined, diff --git a/src/utils/cli-option-schema.ts b/src/utils/cli-option-schema.ts index 26d8e569..1906967b 100644 --- a/src/utils/cli-option-schema.ts +++ b/src/utils/cli-option-schema.ts @@ -39,10 +39,6 @@ const LEGACY_ENV_VAR_NAMES: Partial> = { const optionSpecs = buildOptionSpecs(); const optionSpecByKey = new Map(optionSpecs.map((spec) => [spec.key, spec])); -export function getOptionSpecs(): readonly OptionSpec[] { - return optionSpecs; -} - export function getOptionSpec(key: FlagKey): OptionSpec | undefined { return optionSpecByKey.get(key); } diff --git a/src/utils/timeouts.ts b/src/utils/timeouts.ts index 22bad7d0..269d0930 100644 --- a/src/utils/timeouts.ts +++ b/src/utils/timeouts.ts @@ -6,4 +6,10 @@ export function resolveTimeoutMs(raw: string | undefined, fallback: number, min: } /** Alias for `resolveTimeoutMs` — semantically marks the caller expects seconds. */ -export const resolveTimeoutSeconds = resolveTimeoutMs; +export function resolveTimeoutSeconds( + raw: string | undefined, + fallback: number, + min: number, +): number { + return resolveTimeoutMs(raw, fallback, min); +}