From ee272fa222d06a563b1f2908b6394f3e1f3778a2 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 14 Oct 2026 22:43:44 +0000 Subject: [PATCH 1/3] chore: use American spellings in comments, docs, copy and internal names Co-Authored-By: chance --- CLAUDE.md | 6 +++- README.md | 2 +- scripts/command-smoke.sh | 2 +- scripts/prompt-ownership-pty.fixture.ts | 4 +-- scripts/prompt-ownership-pty.md | 2 +- ...bin-readonly-installer.integration.spec.ts | 2 +- src/catalog/confirm.spec.ts | 4 +-- src/catalog/confirm.ts | 6 ++-- src/commands/api/index.ts | 2 +- src/commands/api/interactive.ts | 24 +++++++-------- src/commands/connection.spec.ts | 2 +- src/commands/connection.ts | 2 +- src/commands/debug.ts | 2 +- src/commands/directory.spec.ts | 2 +- src/commands/directory.ts | 2 +- src/commands/env.ts | 8 ++--- src/commands/environment.ts | 2 +- src/commands/setup.spec.ts | 2 +- src/commands/setup.ts | 2 +- src/integrations/react-router/utils.spec.ts | 4 +-- src/integrations/react-router/utils.ts | 8 ++--- .../adapters/cli-adapter.coordination.spec.ts | 6 ++-- src/lib/adapters/cli-adapter.spec.ts | 6 ++-- src/lib/adapters/cli-adapter.ts | 14 ++++----- src/lib/adapters/headless-adapter.spec.ts | 2 +- src/lib/adapters/headless-adapter.ts | 2 +- src/lib/adapters/tui-adapter.spec.ts | 14 ++++----- src/lib/adapters/tui-adapter.ts | 2 +- src/lib/authkit-application-setup.spec.ts | 6 ++-- src/lib/authkit-application-setup.ts | 4 +-- src/lib/configuration-recovery.spec.ts | 4 +-- src/lib/configuration-recovery.ts | 6 ++-- src/lib/ensure-auth.spec.ts | 6 ++-- src/lib/environment-target.spec.ts | 2 +- src/lib/environment-target.ts | 2 +- src/lib/events.ts | 4 +-- src/lib/failure-classifier.spec.ts | 2 +- src/lib/installer-core.spec.ts | 8 ++--- src/lib/installer-core.test-utils.ts | 2 +- src/lib/installer-core.ts | 30 +++++++++---------- src/lib/installer-core.types.ts | 4 +-- src/lib/preferences.ts | 2 +- src/lib/preflight-authkit.spec.ts | 2 +- src/lib/preflight-authkit.ts | 2 +- src/lib/resolve-install-credentials.spec.ts | 2 +- src/lib/resolve-install-credentials.ts | 4 +-- src/lib/run-with-core.ts | 4 +-- .../upload-environment-variables/index.ts | 6 ++-- src/test/setup.ts | 2 +- src/tui/components/TaskList.tsx | 12 ++++---- src/tui/content/content.spec.ts | 4 +-- src/tui/content/installer-content.json | 2 +- src/tui/content/schema.ts | 2 +- src/tui/model/run-model.spec.ts | 10 +++---- src/tui/model/run-model.ts | 18 +++++------ src/tui/theme.ts | 2 +- src/utils/analytics.spec.ts | 2 +- src/utils/exit-codes.spec.ts | 8 ++--- src/utils/exit-codes.ts | 8 ++--- src/utils/help-json.ts | 2 +- src/utils/output.spec.ts | 4 +-- src/utils/ui-utils.spec.ts | 18 +++++------ src/utils/ui-utils.ts | 24 +++++++-------- src/utils/ui.spec.ts | 2 +- src/utils/ui.ts | 4 +-- 65 files changed, 183 insertions(+), 179 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 100cd42d..a2f99c46 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -15,7 +15,7 @@ WorkOS CLI for installing AuthKit integrations and managing WorkOS resources (or - **Output**: Auto-switches to JSON when piped or `--json` flag. `WORKOS_FORCE_TTY=1` overrides. - **Auth**: Exits code 4 instead of opening browser. Resource commands (organization, user, role, permission, membership, invitation, session, event, feature-flag, org-domain, portal, webhook, config) use the dashboard session from a prior `workos auth login`; expired access tokens refresh silently while the stored refresh token is valid, so only a truly dead session exits 4. `WORKOS_API_KEY` applies only to `workos api` and the still-REST commands (`connection`, `directory`, `audit-log`, `api-key`, `vault`, plus the workflow/debug commands `seed`, `setup-org`, `onboard-user`, `verify-login`, `debug-sso`, `debug-sync`, `migrations`). - **Errors**: Structured JSON to stderr: `{ "error": { "code": "...", "message": "..." } }` -- **Exit codes**: 0=success, 1=error, 2=cancelled, 4=auth required (follows `gh` CLI convention) +- **Exit codes**: 0=success, 1=error, 2=canceled, 4=auth required (follows `gh` CLI convention) - **Headless flags**: `--no-branch`, `--no-git-check`. CI mode (`WORKOS_MODE=ci`) auto-continues past a dirty tree without `--no-git-check`; agent mode requires the flag. - **Installer Git policy**: Generated changes stay unstaged/uncommitted; pre-existing staging is preserved. No installer-controlled staging, commits, pushes, PR creation, or commit/PR text generation. `--commit`, `--no-commit`, and `--create-pr` are deprecated compatibility-only no-ops, with human-only notices. Branch prompts/`--no-branch` remain unchanged; branches do not isolate uncommitted work. Change reporting is scoped to `installDir` and may include pre-existing changes. @@ -46,6 +46,10 @@ shipped once already. unexpected field divergence. Its `ACCEPTED` map lists deliberate curations only; a casing-only difference appearing there is a bug, not an accepted divergence. +## Spelling + +Use American English in code, comments, docs and UI copy (`canceled`, `behavior`, `organization`). The `cancelled` values that already ship are public contracts: the JSON error code, `termination.reason`, `installer.outcome`, `setup.outcome` and the `workos debug reset --json` key. Leave them as they are unless you also plan the migration. + ## Tech Constraints - **Bun** only; the shipped CLI is a Bun-compiled standalone binary diff --git a/README.md b/README.md index f2c51eda..803158c9 100644 --- a/README.md +++ b/README.md @@ -678,7 +678,7 @@ workos install --api-key sk_test_xxx --client-id client_xxx 2>/dev/null | ---- | ----------------------- | | 0 | Success | | 1 | General error | -| 2 | Cancelled | +| 2 | Canceled | | 4 | Authentication required | ### Environment Variables diff --git a/scripts/command-smoke.sh b/scripts/command-smoke.sh index 3e831c3e..0a4a27ee 100644 --- a/scripts/command-smoke.sh +++ b/scripts/command-smoke.sh @@ -6,7 +6,7 @@ # JSON errors on stderr, and JSON output on stdout. Everything here is # offline-safe — CI runs it inside a --network none container, and release # smoke runs it on native hardware for every platform binary. Exit code 2 -# (cancelled) needs an interactive session and is covered by unit tests. +# (canceled) needs an interactive session and is covered by unit tests. # # POSIX sh only: this runs in debian-slim and Alpine containers (no bash) # and under Git Bash on the Windows runners. diff --git a/scripts/prompt-ownership-pty.fixture.ts b/scripts/prompt-ownership-pty.fixture.ts index a54e575b..6a6da5bf 100644 --- a/scripts/prompt-ownership-pty.fixture.ts +++ b/scripts/prompt-ownership-pty.fixture.ts @@ -49,7 +49,7 @@ const config = { emitter, sendEvent(event: { type: string }) { events.push(event.type); - if (event.type === 'GIT_CANCELLED') { + if (event.type === 'GIT_CANCELED') { emitter.emit('complete', { success: false, summary: 'Synthetic cancellation' }); finished(); } @@ -96,7 +96,7 @@ try { assert.equal(process.stdin.listenerCount('readable'), inputBefore); assert.equal(emitter.listenerCount('agent:start'), 0); if (scenario === 'answers') assert.deepEqual(events, ['ENV_SCAN_DECLINED', 'SCAFFOLD_CONFIRMED']); - if (scenario === 'cancel') assert(events.includes('GIT_CANCELLED')); + if (scenario === 'cancel') assert(events.includes('GIT_CANCELED')); // Leave the process alive long enough to detect orphaned redraw intervals. await delay(400); await report('clean'); diff --git a/scripts/prompt-ownership-pty.md b/scripts/prompt-ownership-pty.md index 31de3563..9f407132 100644 --- a/scripts/prompt-ownership-pty.md +++ b/scripts/prompt-ownership-pty.md @@ -14,7 +14,7 @@ The UI facade has one spinner owner across terminal and hosted rendering. Replacement, stop, clear, and host teardown retire handles permanently. Only an actually drawn spinner line can be erased. Queued prompt callers reserve the terminal before awaiting input; existing and newly started spinners remain suspended until all questions settle. Handback resumes the current owner, never the entry handle. Terminal completion/error lines wait behind input; hosted warnings/errors remain immediately visible. -Prompt requests retain their host and are cancelled on host teardown rather than opening a late inquirer question. A one-turn queued handoff lets the installer process cancellation before the next question opens. The adapter counts queued prompt callers, supplies its cancellation signal to every prompt, and drains its handlers before normal hosted teardown. Exit/signal teardown also detaches CLI handlers. +Prompt requests retain their host and are canceled on host teardown rather than opening a late inquirer question. A one-turn queued handoff lets the installer process cancellation before the next question opens. The adapter counts queued prompt callers, supplies its cancellation signal to every prompt, and drains its handlers before normal hosted teardown. Exit/signal teardown also detaches CLI handlers. Agent success ends the spinner without requiring validation (Rails/`--no-validate`); failure, completion, cancellation and stop retire animation. Logging no longer stops/recreates adapter spinners: the facade borrows the current owner's line. This prevents a stale adapter handle from reclaiming an obsolete phase. Hosted logs are delivered in their original phase to preserve transcript filtering. diff --git a/src/bin-readonly-installer.integration.spec.ts b/src/bin-readonly-installer.integration.spec.ts index 43c72bfc..ac10f1bb 100644 --- a/src/bin-readonly-installer.integration.spec.ts +++ b/src/bin-readonly-installer.integration.spec.ts @@ -281,7 +281,7 @@ describe('installer leaves changes uncommitted through the real parser and orche it('cancels before the agent without asking any post-install questions', () => { git(project, 'checkout', '-qb', 'existing-feature'); const result = run(['install', '--no-branch', '--create-pr'], { TEST_HUMAN: '1', TEST_CANCEL: '1' }); - expect(result.stdout).toContain('cancelled'); + expect(result.stdout).toContain('canceled'); expect(result.evidence.some((e) => e.kind === 'agent-options')).toBe(false); expect(result.evidence.filter((e) => e.kind === 'prompt').map((e) => e.value)).toEqual(['Continue anyway?']); }); diff --git a/src/catalog/confirm.spec.ts b/src/catalog/confirm.spec.ts index e1f3e5db..738ce433 100644 --- a/src/catalog/confirm.spec.ts +++ b/src/catalog/confirm.spec.ts @@ -113,7 +113,7 @@ describe('confirmDestructive', () => { expect(mockConfirm).not.toHaveBeenCalled(); }); - it('exits 2 (CANCELLED) when the interactive prompt is declined', async () => { + it('exits 2 (CANCELED) when the interactive prompt is declined', async () => { setInteractionMode({ mode: 'human', source: 'default' }); setOutputMode('human'); mockConfirm.mockResolvedValue(false); @@ -121,7 +121,7 @@ describe('confirmDestructive', () => { expect(mockConfirm).toHaveBeenCalledOnce(); }); - it('exits 2 (CANCELLED) when the interactive prompt is cancelled (Ctrl+C)', async () => { + it('exits 2 (CANCELED) when the interactive prompt is canceled (Ctrl+C)', async () => { setInteractionMode({ mode: 'human', source: 'default' }); setOutputMode('human'); const cancelSymbol = Symbol('ui-cancel'); diff --git a/src/catalog/confirm.ts b/src/catalog/confirm.ts index 1749c550..51b909eb 100644 --- a/src/catalog/confirm.ts +++ b/src/catalog/confirm.ts @@ -18,7 +18,7 @@ import { isCiMode, isPromptAllowed } from '../utils/interaction-mode.js'; * `src/utils/exit-codes.ts`): * - Non-interactive + destructive + no `--yes` => exit 1, `confirmation_required` * - Non-interactive + `--yes` => proceed (resolves) - * - Interactive, user cancels => exit 2 (CANCELLED) + * - Interactive, user cancels => exit 2 (CANCELED) * - Interactive, user confirms => proceed (resolves) * * Note: exit 2 is reserved for active prompt cancellation only. A @@ -60,8 +60,8 @@ export async function confirmDestructive( console.log(`\n${chalk.yellow('About to')} ${opts.action}`); const ok = await ui.confirm({ message: 'Proceed?' }); if (!ok || ui.isCancel(ok)) { - // Active cancellation of an interactive prompt => CANCELLED (exit 2). - exitWithCode(ExitCode.CANCELLED); + // Active cancellation of an interactive prompt => CANCELED (exit 2). + exitWithCode(ExitCode.CANCELED); } } diff --git a/src/commands/api/index.ts b/src/commands/api/index.ts index 685f10df..5f124974 100644 --- a/src/commands/api/index.ts +++ b/src/commands/api/index.ts @@ -145,7 +145,7 @@ export async function runApiRequest(endpoint: string, options: ApiCommandOptions if (hasBody) prettyPrint(body); const ok = await ui.confirm({ message: 'Proceed?' }); if (!ok || ui.isCancel(ok)) { - exitWithCode(ExitCode.CANCELLED); + exitWithCode(ExitCode.CANCELED); } } diff --git a/src/commands/api/interactive.ts b/src/commands/api/interactive.ts index f1f080ef..88e41f99 100644 --- a/src/commands/api/interactive.ts +++ b/src/commands/api/interactive.ts @@ -6,8 +6,8 @@ import { resolveApiKey, resolveApiBaseUrl } from '../../lib/api-key.js'; import { ExitCode, exitWithCode } from '../../utils/exit-codes.js'; import { exitWithError } from '../../utils/output.js'; -function assertNotCancelled(value: T | symbol): T { - if (ui.isCancel(value)) exitWithCode(ExitCode.CANCELLED); +function assertNotCanceled(value: T | symbol): T { + if (ui.isCancel(value)) exitWithCode(ExitCode.CANCELED); return value as T; } @@ -15,7 +15,7 @@ export async function apiInteractive(options?: { apiKey?: string }): Promise { @@ -26,7 +26,7 @@ export async function apiInteractive(options?: { apiKey?: string }): Promise({ message: 'Select an endpoint:', options: endpoints.map((e) => ({ @@ -39,7 +39,7 @@ export async function apiInteractive(options?: { apiKey?: string }): Promise 0) { - const wantsOptional = assertNotCancelled( + const wantsOptional = assertNotCanceled( await ui.confirm({ message: `Add optional query parameters? (${optionalParams.length} available)`, initialValue: false, @@ -80,7 +80,7 @@ export async function apiInteractive(options?: { apiKey?: string }): Promise { mockConfirm.mockResolvedValue(false); await runConnectionDelete('conn_01ABC', {}, 'sk_test'); expect(mockSdk.sso.deleteConnection).not.toHaveBeenCalled(); - expect(consoleOutput.some((l) => l.includes('cancelled'))).toBe(true); + expect(consoleOutput.some((l) => l.includes('canceled'))).toBe(true); }); it('cancels on user cancel', async () => { diff --git a/src/commands/connection.ts b/src/commands/connection.ts index dd0ee35f..0e8826ba 100644 --- a/src/commands/connection.ts +++ b/src/commands/connection.ts @@ -201,7 +201,7 @@ export async function runConnectionDelete( }); if (ui.isCancel(confirmed) || !confirmed) { - console.log('Delete cancelled.'); + console.log('Delete canceled.'); return; } } diff --git a/src/commands/debug.ts b/src/commands/debug.ts index 71da12a6..91b77872 100644 --- a/src/commands/debug.ts +++ b/src/commands/debug.ts @@ -249,7 +249,7 @@ export async function runDebugReset({ if (isJsonMode()) { outputJson({ cleared: false, cancelled: true }); } else { - ui.log.info('Reset cancelled'); + ui.log.info('Reset canceled'); } return; } diff --git a/src/commands/directory.spec.ts b/src/commands/directory.spec.ts index 9f171b09..99227efc 100644 --- a/src/commands/directory.spec.ts +++ b/src/commands/directory.spec.ts @@ -169,7 +169,7 @@ describe('directory commands', () => { mockConfirm.mockResolvedValue(false); await runDirectoryDelete('directory_01ABC', {}, 'sk_test'); expect(mockSdk.directorySync.deleteDirectory).not.toHaveBeenCalled(); - expect(consoleOutput.some((l) => l.includes('cancelled'))).toBe(true); + expect(consoleOutput.some((l) => l.includes('canceled'))).toBe(true); }); it('cancels on user cancel', async () => { diff --git a/src/commands/directory.ts b/src/commands/directory.ts index 9963f068..4a3e01ec 100644 --- a/src/commands/directory.ts +++ b/src/commands/directory.ts @@ -100,7 +100,7 @@ export async function runDirectoryDelete( }); if (ui.isCancel(confirmed) || !confirmed) { - console.log('Delete cancelled.'); + console.log('Delete canceled.'); return; } } diff --git a/src/commands/env.ts b/src/commands/env.ts index 994f7938..2a31a9f8 100644 --- a/src/commands/env.ts +++ b/src/commands/env.ts @@ -65,7 +65,7 @@ export async function runEnvAdd(options: { message: 'Enter a name for the environment (e.g., production, sandbox, local)', validate: (value) => validateEnvName(value), }); - if (ui.isCancel(nameResult)) exitWithCode(ExitCode.CANCELLED); + if (ui.isCancel(nameResult)) exitWithCode(ExitCode.CANCELED); name = nameResult; const typeResult = await ui.select({ @@ -75,7 +75,7 @@ export async function runEnvAdd(options: { { value: 'sandbox', label: 'Sandbox' }, ], }); - if (ui.isCancel(typeResult)) exitWithCode(ExitCode.CANCELLED); + if (ui.isCancel(typeResult)) exitWithCode(ExitCode.CANCELED); const apiKeyResult = await ui.password({ message: 'Enter the API key for this environment', @@ -84,7 +84,7 @@ export async function runEnvAdd(options: { return undefined; }, }); - if (ui.isCancel(apiKeyResult)) exitWithCode(ExitCode.CANCELLED); + if (ui.isCancel(apiKeyResult)) exitWithCode(ExitCode.CANCELED); apiKey = apiKeyResult; const config = getOrCreateConfig(); @@ -280,7 +280,7 @@ export async function runEnvSwitch(name?: string): Promise { message: 'Select an environment', options, }); - if (ui.isCancel(selected)) exitWithCode(ExitCode.CANCELLED); + if (ui.isCancel(selected)) exitWithCode(ExitCode.CANCELED); name = selected as string; } diff --git a/src/commands/environment.ts b/src/commands/environment.ts index cd9115cd..416a677a 100644 --- a/src/commands/environment.ts +++ b/src/commands/environment.ts @@ -138,7 +138,7 @@ export async function runEnvironmentUse(environmentIdArg?: string): Promise { expect(hints.some((m) => m.includes('workos mcp install'))).toBe(true); }); - it('treats cancel (ctrl-c) as skip — no decline recorded, but emits a cancelled event', async () => { + it('treats cancel (ctrl-c) as skip — no decline recorded, but emits a canceled event', async () => { detectSome(); vi.mocked(ui.confirm).mockResolvedValue(CANCEL); diff --git a/src/commands/setup.ts b/src/commands/setup.ts index e494c24e..90aaed61 100644 --- a/src/commands/setup.ts +++ b/src/commands/setup.ts @@ -302,7 +302,7 @@ function emitSetupEvent( extraAttributes: { 'setup.trigger': trigger, // `accepted` kept for back-compat dashboards; `outcome` distinguishes a - // deliberate "no" (declined) from a walk-away/ctrl-c (cancelled). + // deliberate "no" (declined) from a walk-away/ctrl-c (canceled). 'setup.accepted': outcome === 'accepted', 'setup.outcome': outcome, 'setup.skills_agents': agents.skills.join(','), diff --git a/src/integrations/react-router/utils.spec.ts b/src/integrations/react-router/utils.spec.ts index 093c5a2a..711d1420 100644 --- a/src/integrations/react-router/utils.spec.ts +++ b/src/integrations/react-router/utils.spec.ts @@ -10,10 +10,10 @@ vi.mock('../../utils/ui.js', () => ({ }, })); -// Passthrough abortIfCancelled + a package.json with no react-router version, so +// Passthrough abortIfCanceled + a package.json with no react-router version, so // getReactRouterMode always hits the ambiguous "no version" prompt branch. vi.mock('../../utils/ui-utils.js', () => ({ - abortIfCancelled: vi.fn(async (p) => await p), + abortIfCanceled: vi.fn(async (p) => await p), getPackageDotJson: vi.fn(async () => ({})), })); diff --git a/src/integrations/react-router/utils.ts b/src/integrations/react-router/utils.ts index c6483ded..b091a0ec 100644 --- a/src/integrations/react-router/utils.ts +++ b/src/integrations/react-router/utils.ts @@ -1,6 +1,6 @@ import { major } from 'semver'; import fg from 'fast-glob'; -import { abortIfCancelled, getPackageDotJson } from '../../utils/ui-utils.js'; +import { abortIfCanceled, getPackageDotJson } from '../../utils/ui-utils.js'; import ui from '../../utils/ui.js'; import { getVersionBucket } from '../../utils/semver.js'; import type { InstallerOptions } from '../../utils/types.js'; @@ -100,7 +100,7 @@ export async function getReactRouterMode(options: InstallerOptions): Promise { } }); - it('cancelling the first question never opens the now-moot queued sibling', async () => { + it('canceling the first question never opens the now-moot queued sibling', async () => { sendEvent.mockImplementation((event) => { - if (event.type === 'GIT_CANCELLED') emitter.emit('complete', { success: false, summary: 'Cancelled' }); + if (event.type === 'GIT_CANCELED') emitter.emit('complete', { success: false, summary: 'Canceled' }); }); emitter.emit('agent:start', {}); emitter.emit('git:dirty', { files: ['fixture.rb'] }); @@ -157,7 +157,7 @@ describe('CLI adapter with real UI coordination', () => { questions[0].answer(false as never); await drain(); expect(questions.map((q) => q.message)).toEqual(['Continue anyway?']); - expect(output()).toContain('Cancelled'); + expect(output()).toContain('Canceled'); expect(vi.getTimerCount()).toBe(0); }); diff --git a/src/lib/adapters/cli-adapter.spec.ts b/src/lib/adapters/cli-adapter.spec.ts index f1780aca..27bfc6fc 100644 --- a/src/lib/adapters/cli-adapter.spec.ts +++ b/src/lib/adapters/cli-adapter.spec.ts @@ -202,7 +202,7 @@ describe('CLIAdapter', () => { expect(sendEvent).toHaveBeenCalledWith({ type: 'GIT_CONFIRMED' }); }); - it('sends GIT_CANCELLED on decline', async () => { + it('sends GIT_CANCELED on decline', async () => { await adapter.start(); const ui = await import('../../utils/ui.js'); vi.mocked(ui.default.confirm).mockResolvedValue(false); @@ -211,7 +211,7 @@ describe('CLIAdapter', () => { await new Promise((r) => setTimeout(r, 10)); - expect(sendEvent).toHaveBeenCalledWith({ type: 'GIT_CANCELLED' }); + expect(sendEvent).toHaveBeenCalledWith({ type: 'GIT_CANCELED' }); }); it('sends CREDENTIALS_SUBMITTED on credentials form', async () => { @@ -231,7 +231,7 @@ describe('CLIAdapter', () => { }); }); - it('sends CANCEL when credentials form is cancelled', async () => { + it('sends CANCEL when credentials form is canceled', async () => { await adapter.start(); const ui = await import('../../utils/ui.js'); vi.mocked(ui.default.isCancel).mockReturnValue(true); diff --git a/src/lib/adapters/cli-adapter.ts b/src/lib/adapters/cli-adapter.ts index 047a50ba..2b905843 100644 --- a/src/lib/adapters/cli-adapter.ts +++ b/src/lib/adapters/cli-adapter.ts @@ -40,7 +40,7 @@ export class CLIAdapter implements InstallerAdapter { // Aborts in-flight/queued prompts when the run ends (cancellation, ctrl-c). // The installer's `preparing` state can queue a second prompt behind a live - // one (git-dirty + protected-branch); if the first is cancelled, this signal + // one (git-dirty + protected-branch); if the first is canceled, this signal // stops the queued sibling from opening a now-moot question. private promptAbort: AbortController | null = null; @@ -118,7 +118,7 @@ export class CLIAdapter implements InstallerAdapter { const handleSigInt = () => { this.promptAbort?.abort(); if (this.spinner) { - this.spinner.stop('Cancelled'); + this.spinner.stop('Canceled'); this.spinner = null; } this.sendEvent({ type: 'CANCEL' }); @@ -184,7 +184,7 @@ export class CLIAdapter implements InstallerAdapter { async stop(): Promise { if (!this.isStarted) return; - // Abort any in-flight/queued prompt so a cancelled run can't leave a + // Abort any in-flight/queued prompt so a canceled run can't leave a // now-moot sibling question open (e.g. the branch prompt after git-cancel). this.promptAbort?.abort(); @@ -456,7 +456,7 @@ export class CLIAdapter implements InstallerAdapter { ); this.sendEvent({ - type: ui.isCancel(confirmed) || !confirmed ? 'GIT_CANCELLED' : 'GIT_CONFIRMED', + type: ui.isCancel(confirmed) || !confirmed ? 'GIT_CANCELED' : 'GIT_CONFIRMED', }); }; @@ -600,9 +600,9 @@ export class CLIAdapter implements InstallerAdapter { }; private handleComplete = ({ success, summary, completion }: InstallerEvents['complete']): void => { - // Fires synchronously during the cancelled-state transition (emitCancelled), + // Fires synchronously during the canceled-state transition (emitCanceled), // BEFORE a queued sibling prompt's microtask runs — so aborting here makes a - // cancelled run's still-queued prompt (e.g. the branch select after a + // canceled run's still-queued prompt (e.g. the branch select after a // git-dirty "No") open with an already-aborted signal and resolve to CANCEL // without ever rendering a now-moot question. this.promptAbort?.abort(); @@ -663,7 +663,7 @@ export class CLIAdapter implements InstallerAdapter { ); this.sendEvent({ - type: ui.isCancel(confirmed) || !confirmed ? 'SCAFFOLD_CANCELLED' : 'SCAFFOLD_CONFIRMED', + type: ui.isCancel(confirmed) || !confirmed ? 'SCAFFOLD_CANCELED' : 'SCAFFOLD_CONFIRMED', }); }; diff --git a/src/lib/adapters/headless-adapter.spec.ts b/src/lib/adapters/headless-adapter.spec.ts index eabe6197..12feb171 100644 --- a/src/lib/adapters/headless-adapter.spec.ts +++ b/src/lib/adapters/headless-adapter.spec.ts @@ -125,7 +125,7 @@ describe('HeadlessAdapter', () => { files: ['package.json'], }); expect(mockWriteNDJSON).toHaveBeenCalledWith(expect.objectContaining({ type: 'error', code: 'git_dirty' })); - expect(sendEvent).toHaveBeenCalledWith({ type: 'GIT_CANCELLED' }); + expect(sendEvent).toHaveBeenCalledWith({ type: 'GIT_CANCELED' }); expect(mockExit).toHaveBeenCalledWith(1); await adapter.stop(); }); diff --git a/src/lib/adapters/headless-adapter.ts b/src/lib/adapters/headless-adapter.ts index 16e31cc6..f670fa79 100644 --- a/src/lib/adapters/headless-adapter.ts +++ b/src/lib/adapters/headless-adapter.ts @@ -209,7 +209,7 @@ export class HeadlessAdapter implements InstallerAdapter { 'Commit or stash your changes, or rerun with --no-git-check to proceed.', }); writeNDJSON({ type: 'git:decision', action: 'cancel' }); - this.sendEvent({ type: 'GIT_CANCELLED' }); + this.sendEvent({ type: 'GIT_CANCELED' }); process.exit(ExitCode.GENERAL_ERROR); }; diff --git a/src/lib/adapters/tui-adapter.spec.ts b/src/lib/adapters/tui-adapter.spec.ts index fc5abc4a..4cdaa5e5 100644 --- a/src/lib/adapters/tui-adapter.spec.ts +++ b/src/lib/adapters/tui-adapter.spec.ts @@ -77,7 +77,7 @@ describe('TuiAdapter', () => { expect(afterExit()).toContain('stray line'); }); - it("answers the plain CLI's git-dirty question inline (No → GIT_CANCELLED)", async () => { + it("answers the plain CLI's git-dirty question inline (No → GIT_CANCELED)", async () => { await adapter.start(); emitter.emit('git:dirty', { files: ['a.ts', 'b.ts'] }); @@ -91,7 +91,7 @@ describe('TuiAdapter', () => { expect(at('b.ts')).toBe(at('a.ts') + 1); expect(at('? Continue anyway?')).toBe(at('b.ts') + 1); stdin.press('n'); - await waitFor(() => expect(sendEvent).toHaveBeenCalledWith({ type: 'GIT_CANCELLED' })); + await waitFor(() => expect(sendEvent).toHaveBeenCalledWith({ type: 'GIT_CANCELED' })); await waitFor(() => expect(frame()).not.toContain('? Continue anyway?')); }); @@ -138,7 +138,7 @@ describe('TuiAdapter', () => { expect(await answer).toBe('abc'); }); - it('cancels an open question on esc, the same as cancelling it in the plain CLI', async () => { + it('cancels an open question on esc, the same as canceling it in the plain CLI', async () => { await adapter.start(); emitter.emit('branch:prompt', { branch: 'main' }); await waitFor(() => expect(frame()).toContain('Create a feature branch?')); @@ -175,11 +175,11 @@ describe('TuiAdapter', () => { stdin.press(KEY.ctrlC); await waitFor(() => expect(complete).toHaveBeenCalledOnce()); expect(runWithCoreSigint).toHaveBeenCalledOnce(); - expect(actor.getSnapshot().value).toBe('cancelled'); + expect(actor.getSnapshot().value).toBe('canceled'); expect(aborted).toHaveBeenCalledOnce(); expect(exit).not.toHaveBeenCalled(); await adapter.stop(); - expect(afterExit()).toContain('cancelled'); + expect(afterExit()).toContain('canceled'); expect(getUiHost()).toBeNull(); expect(stdin.rawMode).toBe(false); } finally { @@ -379,7 +379,7 @@ describe('TuiAdapter', () => { await waitFor(() => expect(frame()).toContain('? Still there?')); await adapter.stop(); expect(isCancel(await answer)).toBe(true); - expect(afterExit()).toContain('✗ Still there? cancelled'); + expect(afterExit()).toContain('✗ Still there? canceled'); }); it('keeps queued questions visible and answerable through phase/status replacement', async () => { @@ -433,7 +433,7 @@ describe('TuiAdapter', () => { expect(stdout.output()).toBe(stoppedOutput); expect(write).not.toHaveBeenCalled(); expect(stdout.output()).not.toContain(`? ${scaffoldQuestion}`); - expect(afterExit()).toContain(`✗ ${scanQuestion} cancelled`); + expect(afterExit()).toContain(`✗ ${scanQuestion} canceled`); expect(afterExit()).not.toContain('buffered before stop'); expect(afterExit()).toContain("The agent's step-by-step log is in the installer log"); expect(stdin.listenerCount('readable')).toBe(listeners); diff --git a/src/lib/adapters/tui-adapter.ts b/src/lib/adapters/tui-adapter.ts index 0d928d41..39fb5907 100644 --- a/src/lib/adapters/tui-adapter.ts +++ b/src/lib/adapters/tui-adapter.ts @@ -58,7 +58,7 @@ interface PendingPrompt { /** How an answered prompt reads in the scrollback, like inquirer leaves it. */ function answeredLine(request: UiPromptRequest, value: unknown): string { const message = request.message; - if (isCancel(value)) return `${INDENT}${chalk.red('✗')} ${message} ${chalk.dim('cancelled')}`; + if (isCancel(value)) return `${INDENT}${chalk.red('✗')} ${message} ${chalk.dim('canceled')}`; let answer: string; switch (request.kind) { case 'confirm': diff --git a/src/lib/authkit-application-setup.spec.ts b/src/lib/authkit-application-setup.spec.ts index 14afa0f4..31a97841 100644 --- a/src/lib/authkit-application-setup.spec.ts +++ b/src/lib/authkit-application-setup.spec.ts @@ -1070,7 +1070,7 @@ describe('Unauthorized configuration recovery', () => { }, ); - it.each(['failed', 'cancelled', 'not-authenticated'])( + it.each(['failed', 'canceled', 'not-authenticated'])( 'leaves post-agent files and target untouched when dashboard auth checking is %s', async (outcome) => { const context = contextFor(directory, 'nextjs'); @@ -1085,10 +1085,10 @@ describe('Unauthorized configuration recovery', () => { }); else vi.mocked(ensureAuthenticated).mockRejectedValue( - outcome === 'cancelled' ? new CliExit(2) : new Error('fake_private_auth_error'), + outcome === 'canceled' ? new CliExit(2) : new Error('fake_private_auth_error'), ); await expect(configureNextjsApplicationUrls(context)).rejects.toMatchObject({ - code: outcome === 'cancelled' ? 'cancelled' : 'auth_required', + code: outcome === 'canceled' ? 'cancelled' : 'auth_required', message: expect.not.stringContaining('fake_private_auth_error'), }); expect(await readFile(join(directory, '.env.local'), 'utf8')).toBe(before); diff --git a/src/lib/authkit-application-setup.ts b/src/lib/authkit-application-setup.ts index 49e52230..b9639f3a 100644 --- a/src/lib/authkit-application-setup.ts +++ b/src/lib/authkit-application-setup.ts @@ -200,11 +200,11 @@ async function configureApplicationAttempt( if (!callbackRegistered) { throw new InstallDeclinedError(`Callback URL is not registered or verified. ${reason}`, code); } - // A cancelled recovery is a cancelled install, even after a partial write: + // A canceled recovery is a canceled install, even after a partial write: // never let it continue to completion as an unverified success. if (code === 'cancelled') { throw new InstallDeclinedError( - `Setup cancelled after the callback URL was registered; the remaining settings are unverified. ${reason}`, + `Setup canceled after the callback URL was registered; the remaining settings are unverified. ${reason}`, code, ); } diff --git a/src/lib/configuration-recovery.spec.ts b/src/lib/configuration-recovery.spec.ts index d4bacb4c..2370340e 100644 --- a/src/lib/configuration-recovery.spec.ts +++ b/src/lib/configuration-recovery.spec.ts @@ -76,10 +76,10 @@ describe('revoked but locally unexpired session policy', () => { }, ); - it.each(['manual', CANCEL])('does not run authentication when recovery is declined or cancelled', async (choice) => { + it.each(['manual', CANCEL])('does not run authentication when recovery is declined or canceled', async (choice) => { vi.mocked(ui.select).mockResolvedValue(choice); const result = await recoverConfigurationAccess({ token: fakeSession.accessToken }); - expect(result).toMatchObject({ reason: expect.stringContaining(choice === CANCEL ? 'cancelled' : 'declined') }); + expect(result).toMatchObject({ reason: expect.stringContaining(choice === CANCEL ? 'canceled' : 'declined') }); expect(getCredentials).not.toHaveBeenCalled(); expect(runLogin).not.toHaveBeenCalled(); expect(clearCredentials).not.toHaveBeenCalled(); diff --git a/src/lib/configuration-recovery.ts b/src/lib/configuration-recovery.ts index b20cbcfe..9ea100a7 100644 --- a/src/lib/configuration-recovery.ts +++ b/src/lib/configuration-recovery.ts @@ -60,7 +60,7 @@ export async function recoverConfigurationAccess( { value: 'manual', label: 'Configure manually', hint: 'Leave credentials unchanged' }, ], }); - if (ui.isCancel(choice)) return { reason: `Unauthorized recovery cancelled. ${hint}`, code: 'cancelled' }; + if (ui.isCancel(choice)) return { reason: `Unauthorized recovery canceled. ${hint}`, code: 'cancelled' }; if (choice !== 'retry') return { reason: `Unauthorized recovery declined; manual configuration selected. ${hint}` }; try { @@ -103,8 +103,8 @@ export async function recoverConfigurationAccess( } return { token, credentials }; } catch (error) { - if (error instanceof CliExit && error.exitCode === ExitCode.CANCELLED) { - return { reason: `Unauthorized recovery cancelled. ${hint}`, code: 'cancelled' }; + if (error instanceof CliExit && error.exitCode === ExitCode.CANCELED) { + return { reason: `Unauthorized recovery canceled. ${hint}`, code: 'cancelled' }; } return { reason: `Authentication recovery failed. Application credentials were left unchanged. ${hint}` }; } diff --git a/src/lib/ensure-auth.spec.ts b/src/lib/ensure-auth.spec.ts index 81b7d5a7..6863799a 100644 --- a/src/lib/ensure-auth.spec.ts +++ b/src/lib/ensure-auth.spec.ts @@ -253,10 +253,10 @@ describe('ensure-auth', () => { expect(mockRunLogin).toHaveBeenCalledOnce(); }); - it('returns authenticated=false if login is cancelled', async () => { - // No credentials, login doesn't create them (user cancelled) + it('returns authenticated=false if login is canceled', async () => { + // No credentials, login doesn't create them (user canceled) mockRunLogin.mockImplementation(() => { - // Don't save credentials - simulates user cancelling + // Don't save credentials - simulates user canceling }); const result = await ensureAuthenticated(); diff --git a/src/lib/environment-target.spec.ts b/src/lib/environment-target.spec.ts index ee5b9192..16368ecf 100644 --- a/src/lib/environment-target.spec.ts +++ b/src/lib/environment-target.spec.ts @@ -238,7 +238,7 @@ describe('resolveEnvironmentTarget', () => { expect(getConfig()?.environments.staging.environmentId).toBe('env_b'); }); - it('exits cancelled (code 2) when the picker is dismissed', async () => { + it('exits canceled (code 2) when the picker is dismissed', async () => { seedProfile({}); mockGraphqlRequest.mockResolvedValue(teamData([{ id: 'env_a' }])); vi.mocked(ui.select).mockResolvedValue(Symbol('cancel')); diff --git a/src/lib/environment-target.ts b/src/lib/environment-target.ts index 366a3090..1fb1c827 100644 --- a/src/lib/environment-target.ts +++ b/src/lib/environment-target.ts @@ -207,7 +207,7 @@ export async function resolveEnvironmentTarget( if (isPromptAllowed()) { const choice = await promptForEnvironment(environments); - if (choice === null) exitWithCode(ExitCode.CANCELLED); + if (choice === null) exitWithCode(ExitCode.CANCELED); // Persist so the picker runs at most once per profile (no-op without an // active profile — the choice then applies to this invocation only). // Healing never changes which profile is active, so the earlier config diff --git a/src/lib/events.ts b/src/lib/events.ts index 7016a4c7..c001330e 100644 --- a/src/lib/events.ts +++ b/src/lib/events.ts @@ -72,7 +72,7 @@ export interface InstallerEvents { 'git:clean': Record; 'git:dirty': { files: string[] }; 'git:dirty:confirmed': Record; - 'git:dirty:cancelled': Record; + 'git:dirty:canceled': Record; 'credentials:gathering': { requiresApiKey: boolean }; /** * Credentials were already on `options` when the machine started. `source` @@ -176,7 +176,7 @@ const INSTALLER_EVENT_REGISTRY = { 'git:clean': true, 'git:dirty': true, 'git:dirty:confirmed': true, - 'git:dirty:cancelled': true, + 'git:dirty:canceled': true, 'credentials:gathering': true, 'credentials:found': true, 'credentials:env:detected': true, diff --git a/src/lib/failure-classifier.spec.ts b/src/lib/failure-classifier.spec.ts index b70738de..c1824fe1 100644 --- a/src/lib/failure-classifier.spec.ts +++ b/src/lib/failure-classifier.spec.ts @@ -7,7 +7,7 @@ import { } from './failure-classifier.js'; /** - * The verbatim strings from the incident, plus the neighbouring shapes that + * The verbatim strings from the incident, plus the neighboring shapes that * must NOT reclassify. The ordering inside classifyAgentFailure is the entire * fix: every `deterministic` row below also matches a transient pattern, so a * careless reorder turns them all back into "try again in a few minutes". diff --git a/src/lib/installer-core.spec.ts b/src/lib/installer-core.spec.ts index fb67e290..3a523982 100644 --- a/src/lib/installer-core.spec.ts +++ b/src/lib/installer-core.spec.ts @@ -298,10 +298,10 @@ describe('InstallerCore State Machine', () => { dirtyActor.send({ type: 'START' }); await new Promise((r) => setTimeout(r, 50)); - dirtyActor.send({ type: 'GIT_CANCELLED' }); + dirtyActor.send({ type: 'GIT_CANCELED' }); await new Promise((r) => setTimeout(r, 50)); - expect(dirtyActor.getSnapshot().value).toBe('cancelled'); + expect(dirtyActor.getSnapshot().value).toBe('canceled'); dirtyActor.stop(); }); }); @@ -685,12 +685,12 @@ describe('InstallerCore State Machine', () => { actor.send({ type: 'START' }); await new Promise((r) => setTimeout(r, 50)); - actor.send({ type: 'SCAFFOLD_CANCELLED' }); + actor.send({ type: 'SCAFFOLD_CANCELED' }); await new Promise((r) => setTimeout(r, 50)); expect(ran).toBe(false); expect(skipped).toBe(true); - expect(actor.getSnapshot().value).toBe('cancelled'); + expect(actor.getSnapshot().value).toBe('canceled'); actor.stop(); }); diff --git a/src/lib/installer-core.test-utils.ts b/src/lib/installer-core.test-utils.ts index 446f2743..43c5bcea 100644 --- a/src/lib/installer-core.test-utils.ts +++ b/src/lib/installer-core.test-utils.ts @@ -36,7 +36,7 @@ export function createEventCapture() { 'git:clean', 'git:dirty', 'git:dirty:confirmed', - 'git:dirty:cancelled', + 'git:dirty:canceled', 'credentials:gathering', 'credentials:found', 'credentials:request', diff --git a/src/lib/installer-core.ts b/src/lib/installer-core.ts index e94efdc6..53db9d02 100644 --- a/src/lib/installer-core.ts +++ b/src/lib/installer-core.ts @@ -69,8 +69,8 @@ export const installerMachine = setup({ emitGitConfirmed: ({ context }) => { context.emitter.emit('git:dirty:confirmed', {}); }, - emitGitCancelled: ({ context }) => { - context.emitter.emit('git:dirty:cancelled', {}); + emitGitCanceled: ({ context }) => { + context.emitter.emit('git:dirty:canceled', {}); }, emitScaffoldChecking: ({ context }) => { context.emitter.emit('scaffold:checking', {}); @@ -235,8 +235,8 @@ export const installerMachine = setup({ }, }), - emitCancelled: ({ context }) => { - context.emitter.emit('complete', { success: false, summary: 'Installer cancelled by user' }); + emitCanceled: ({ context }) => { + context.emitter.emit('complete', { success: false, summary: 'Installer canceled by user' }); }, emitError: ({ context }) => { // Must NOT be 'An unexpected error occurred': that is the LLM gateway's @@ -380,7 +380,7 @@ export const installerMachine = setup({ // Global event handlers - CANCEL can be sent from any state on: { CANCEL: { - target: '.cancelled', + target: '.canceled', }, }, @@ -463,8 +463,8 @@ export const installerMachine = setup({ SCAFFOLD_CONFIRMED: { target: 'running', }, - SCAFFOLD_CANCELLED: { - target: '#installer.cancelled', + SCAFFOLD_CANCELED: { + target: '#installer.canceled', actions: ['emitScaffoldSkipped', { type: 'emitStateExit', params: { state: 'scaffold' } }], }, }, @@ -564,9 +564,9 @@ export const installerMachine = setup({ target: 'done', actions: ['emitGitConfirmed'], }, - GIT_CANCELLED: { - target: '#installer.cancelled', - actions: ['emitGitCancelled'], + GIT_CANCELED: { + target: '#installer.canceled', + actions: ['emitGitCanceled'], }, }, }, @@ -609,7 +609,7 @@ export const installerMachine = setup({ target: 'done', }, BRANCH_CANCEL: { - target: '#installer.cancelled', + target: '#installer.canceled', }, }, }, @@ -742,7 +742,7 @@ export const installerMachine = setup({ actions: assign({ envScanConsent: () => false }), }, CANCEL: { - target: '#installer.cancelled', + target: '#installer.canceled', actions: { type: 'emitStateExit', params: { state: 'gatheringCredentials' } }, }, }, @@ -882,7 +882,7 @@ export const installerMachine = setup({ target: 'runningDeviceAuth', }, CANCEL: { - target: '#installer.cancelled', + target: '#installer.canceled', actions: { type: 'emitStateExit', params: { state: 'gatheringCredentials' } }, }, }, @@ -1005,9 +1005,9 @@ export const installerMachine = setup({ entry: [{ type: 'emitStateEnter', params: { state: 'complete' } }, 'emitComplete'], }, - cancelled: { + canceled: { type: 'final', - entry: [{ type: 'emitStateEnter', params: { state: 'cancelled' } }, 'emitCancelled'], + entry: [{ type: 'emitStateEnter', params: { state: 'canceled' } }, 'emitCanceled'], }, error: { diff --git a/src/lib/installer-core.types.ts b/src/lib/installer-core.types.ts index 68d3c1fb..8db7e757 100644 --- a/src/lib/installer-core.types.ts +++ b/src/lib/installer-core.types.ts @@ -84,10 +84,10 @@ export type InstallerMachineEvent = | { type: 'START' } | { type: 'SKIP_AUTH' } | { type: 'GIT_CONFIRMED' } - | { type: 'GIT_CANCELLED' } + | { type: 'GIT_CANCELED' } // Scaffold events | { type: 'SCAFFOLD_CONFIRMED' } - | { type: 'SCAFFOLD_CANCELLED' } + | { type: 'SCAFFOLD_CANCELED' } | { type: 'CREDENTIALS_SUBMITTED'; apiKey: string; clientId: string } | { type: 'CANCEL' } // Credential discovery events diff --git a/src/lib/preferences.ts b/src/lib/preferences.ts index 0008c2b3..22fa978a 100644 --- a/src/lib/preferences.ts +++ b/src/lib/preferences.ts @@ -257,7 +257,7 @@ export function clearSetupDecline(): void { * through to the saved preference. * * This is a deliberate, documented change from the old `WORKOS_TELEMETRY !== - * 'false'` behaviour: previously `WORKOS_TELEMETRY=1` forced telemetry on even + * 'false'` behavior: previously `WORKOS_TELEMETRY=1` forced telemetry on even * for opted-out users; now an opt-out is respected unless the env var * explicitly says 'true'. */ diff --git a/src/lib/preflight-authkit.spec.ts b/src/lib/preflight-authkit.spec.ts index 2c8c55f2..118a8416 100644 --- a/src/lib/preflight-authkit.spec.ts +++ b/src/lib/preflight-authkit.spec.ts @@ -293,7 +293,7 @@ describe('preflight-authkit', () => { expect(readdirSync(testDir)).toEqual(['package.json']); }); - it('throws CliExit (exit 2) when the prompt is cancelled', async () => { + it('throws CliExit (exit 2) when the prompt is canceled', async () => { writePackageJson(testDir, { '@workos-inc/authkit-nextjs': '^2.6.0' }); mockConfirm.mockResolvedValueOnce(Symbol('workos.prompt.cancel')); diff --git a/src/lib/preflight-authkit.ts b/src/lib/preflight-authkit.ts index 070a8c49..ec918ce8 100644 --- a/src/lib/preflight-authkit.ts +++ b/src/lib/preflight-authkit.ts @@ -102,6 +102,6 @@ export async function assertNoExistingAuthKit(opts: { installDir: string; force? const proceed = await ui.confirm({ message: 'Continue anyway?' }); if (ui.isCancel(proceed) || !proceed) { - exitWithCode(ExitCode.CANCELLED, { code: 'cancelled', message: 'Install cancelled.' }); + exitWithCode(ExitCode.CANCELED, { code: 'cancelled', message: 'Install canceled.' }); } } diff --git a/src/lib/resolve-install-credentials.spec.ts b/src/lib/resolve-install-credentials.spec.ts index a3969eeb..2fd13cab 100644 --- a/src/lib/resolve-install-credentials.spec.ts +++ b/src/lib/resolve-install-credentials.spec.ts @@ -538,7 +538,7 @@ describe('resolveInstallCredentials', () => { expect(Date.now() - start).toBeLessThan(10_000); // bounded, not the 30s fetch timeout const call = mockSelect.mock.calls[0][0] as { options: Array<{ disabled?: string }> }; expect(call.options.every((o) => !o.disabled)).toBe(true); - // The abandoned request is cancelled too — its socket and abort timer + // The abandoned request is canceled too — its socket and abort timer // must not hold the event loop open past CLI exit. expect(fetchSignal?.aborted).toBe(true); }, 15_000); diff --git a/src/lib/resolve-install-credentials.ts b/src/lib/resolve-install-credentials.ts index 522755f9..78193272 100644 --- a/src/lib/resolve-install-credentials.ts +++ b/src/lib/resolve-install-credentials.ts @@ -63,7 +63,7 @@ export async function maybePickInstallEnvironment( // dead endpoint's 30s fetch timeout must not stall installer startup (or // the single-profile silent path), so the fetch is bounded. Only a // currently-valid token is used — never a refresh: the race abandons the - // loser without cancelling it, and a refresh outliving the picker can + // loser without canceling it, and a refresh outliving the picker can // answer invalid_grant AFTER the installer's own auth flow wrote a new // session, and invalid_grant clears the credential store. An expired // session just degrades to the local-only picker; the machine's auth check @@ -151,7 +151,7 @@ export async function maybePickInstallEnvironment( ], initialValue: config.activeEnvironment, }); - if (ui.isCancel(choice)) exitWithCode(ExitCode.CANCELLED); + if (ui.isCancel(choice)) exitWithCode(ExitCode.CANCELED); if (choice !== config.activeEnvironment) setActiveEnvironment(String(choice)); return getActiveEnvironment(); } diff --git a/src/lib/run-with-core.ts b/src/lib/run-with-core.ts index 699246bd..f56c833e 100644 --- a/src/lib/run-with-core.ts +++ b/src/lib/run-with-core.ts @@ -756,7 +756,7 @@ export async function runWithCore(options: InstallerOptions): Promise { try { await maybePickInstallEnvironment(getActiveEnvironment(), augmentedOptions.installDir); } catch (error) { - // Cancelling the picker ends the run before the try/finally below, so + // Canceling the picker ends the run before the try/finally below, so // release the adapter here (the full-screen one owns the terminal). await adapter.stop(); throw error; @@ -785,7 +785,7 @@ export async function runWithCore(options: InstallerOptions): Promise { const err = snapshot.context.error; installerStatus = 'error'; reject(err ?? new Error('Wizard failed')); - } else if (snapshot.value === 'cancelled') { + } else if (snapshot.value === 'canceled') { installerStatus = 'cancelled'; resolve(); } else { diff --git a/src/steps/upload-environment-variables/index.ts b/src/steps/upload-environment-variables/index.ts index fd7791c9..b36927fd 100644 --- a/src/steps/upload-environment-variables/index.ts +++ b/src/steps/upload-environment-variables/index.ts @@ -2,7 +2,7 @@ import type { Integration } from '../../lib/constants.js'; import { traceStep } from '../../telemetry.js'; import { analytics } from '../../utils/analytics.js'; import ui from '../../utils/ui.js'; -import { abortIfCancelled } from '../../utils/ui-utils.js'; +import { abortIfCanceled } from '../../utils/ui-utils.js'; import { isPromptAllowed } from '../../utils/interaction-mode.js'; import type { InstallerOptions } from '../../utils/types.js'; import { EnvironmentProvider } from './EnvironmentProvider.js'; @@ -39,7 +39,7 @@ export const uploadEnvironmentVariablesStep = async ( } // Non-interactive mode: default to skipping the upload rather than prompting - // (or failing fast via the abortIfCancelled guard below). + // (or failing fast via the abortIfCanceled guard below). if (!isPromptAllowed()) { analytics.capture('installer interaction', { action: 'not uploading environment variables', @@ -50,7 +50,7 @@ export const uploadEnvironmentVariablesStep = async ( return []; } - const upload: boolean = await abortIfCancelled( + const upload: boolean = await abortIfCanceled( ui.select({ message: `It looks like you are using ${provider.name}. Would you like to upload the environment variables?`, options: [ diff --git a/src/test/setup.ts b/src/test/setup.ts index baffcb81..bfb0df85 100644 --- a/src/test/setup.ts +++ b/src/test/setup.ts @@ -9,7 +9,7 @@ import { vi } from 'vitest'; * file-fallback storage is forced, so an un-mocked spec would wipe a * developer's real CLI login (this happened — that's why this exists). * - * Specs that need richer keyring behaviour (e.g. simulating an unavailable + * Specs that need richer keyring behavior (e.g. simulating an unavailable * keychain) still declare their own vi.mock('@napi-rs/keyring', ...); a * per-file mock overrides this global default. The __IS_TEST_MOCK__ sentinel * is asserted by src/test/keyring-isolation.spec.ts so removing this setup diff --git a/src/tui/components/TaskList.tsx b/src/tui/components/TaskList.tsx index 76c97f7c..d254e3b5 100644 --- a/src/tui/components/TaskList.tsx +++ b/src/tui/components/TaskList.tsx @@ -66,11 +66,11 @@ function TaskRow({ row, spinner }: { row: Row; spinner: string }) { {glyphs.warning} {row.label} ); - case 'cancelled': + case 'canceled': return ( {pad} - {glyphs.cancelled} {row.label} + {glyphs.canceled} {row.label} ); case 'skipped': @@ -135,7 +135,7 @@ export function ProgressLine({ tasks, width }: { tasks: TaskView[]; width: numbe const done = counted.filter((t) => t.status === 'completed').length; const count = `${done} of ${counted.length} done`; const active = tasks.find((t) => t.status === 'in_progress'); - const failed = tasks.find((t) => t.status === 'failed' || t.status === 'cancelled'); + const failed = tasks.find((t) => t.status === 'failed' || t.status === 'canceled'); const next = tasks.find((t) => t.status === 'next'); const spinner = useSpinner(Boolean(active)); @@ -151,10 +151,10 @@ export function ProgressLine({ tasks, width }: { tasks: TaskView[]; width: numbe ); } else if (failed) { - const cancelled = failed.status === 'cancelled'; + const canceled = failed.status === 'canceled'; line = ( - - {`${cancelled ? glyphs.cancelled : glyphs.failed} ${failed.label} ${cancelled ? 'cancelled' : 'failed'}`} + + {`${canceled ? glyphs.canceled : glyphs.failed} ${failed.label} ${canceled ? 'canceled' : 'failed'}`} {` · ${count}`} ); diff --git a/src/tui/content/content.spec.ts b/src/tui/content/content.spec.ts index 870ba300..de0c70cc 100644 --- a/src/tui/content/content.spec.ts +++ b/src/tui/content/content.spec.ts @@ -106,8 +106,8 @@ describe('content validation', () => { it('requires exactly the declared outcomes for variant events', () => { const missing = raw(); - delete missing.walkthrough.complete.cancelled; - expect(problems(missing)).toContain('outcomes must be exactly success, setup-required, failure, cancelled'); + delete missing.walkthrough.complete.canceled; + expect(problems(missing)).toContain('outcomes must be exactly success, setup-required, failure, canceled'); const flat = raw(); flat.walkthrough.complete = 'Done.'; diff --git a/src/tui/content/installer-content.json b/src/tui/content/installer-content.json index e8a8cab2..70c4ce13 100644 --- a/src/tui/content/installer-content.json +++ b/src/tui/content/installer-content.json @@ -113,7 +113,7 @@ "success": "All done. AuthKit is installed. Start your app and complete your first sign-up.", "setup-required": "The code is in. Some WorkOS settings need a look in the dashboard (listed above). Then start your app and complete your first sign-up.", "failure": "The install didn't finish. The details will be shown when this screen closes.", - "cancelled": "Stopped. The installer was cancelled." + "canceled": "Stopped. The installer was canceled." } }, "tips": [ diff --git a/src/tui/content/schema.ts b/src/tui/content/schema.ts index d6af5f08..945cecdf 100644 --- a/src/tui/content/schema.ts +++ b/src/tui/content/schema.ts @@ -63,7 +63,7 @@ export const WALKTHROUGH_PARAMS: Partial> = { 'validation:complete': ['passed', 'failed'], 'postinstall:unavailable': ['not-git', 'error'], - complete: ['success', 'setup-required', 'failure', 'cancelled'], + complete: ['success', 'setup-required', 'failure', 'canceled'], }; const PLACEHOLDER = /\{([a-zA-Z][a-zA-Z0-9]*)\}/g; diff --git a/src/tui/model/run-model.spec.ts b/src/tui/model/run-model.spec.ts index 9f802080..7f69fe80 100644 --- a/src/tui/model/run-model.spec.ts +++ b/src/tui/model/run-model.spec.ts @@ -97,7 +97,7 @@ const RANK: Record = { completed: 2, skipped: 2, failed: 2, - cancelled: 2, + canceled: 2, next: 2, attention: 2, }; @@ -322,7 +322,7 @@ describe('run model: tasks follow real installer events', () => { const run = start(options(), actors({ checkGitStatus }), (r) => { if (!answered && texts(r.model.getSnapshot()).some((t) => t.includes('uncommitted'))) { answered = true; - queueMicrotask(() => r.actor.send({ type: 'GIT_CANCELLED' })); + queueMicrotask(() => r.actor.send({ type: 'GIT_CANCELED' })); } }); await run.done; @@ -331,9 +331,9 @@ describe('run model: tasks follow real installer events', () => { expect(texts(final, 'narration')).toContain( "You have uncommitted changes (files: 3), so I'll check with you before going further.", ); - expect(statuses(final)).toMatchObject({ inspect: 'cancelled', credentials: 'pending' }); - expect(final.outcome).toBe('cancelled'); - expect(final.walkthrough.at(-1)!.text).toBe((content.walkthrough.complete as Record).cancelled); + expect(statuses(final)).toMatchObject({ inspect: 'canceled', credentials: 'pending' }); + expect(final.outcome).toBe('canceled'); + expect(final.walkthrough.at(-1)!.text).toBe((content.walkthrough.complete as Record).canceled); }); it('shows the scaffold task only when this run scaffolds', async () => { diff --git a/src/tui/model/run-model.ts b/src/tui/model/run-model.ts index b0600082..91829245 100644 --- a/src/tui/model/run-model.ts +++ b/src/tui/model/run-model.ts @@ -45,7 +45,7 @@ export type TaskStatus = | 'completed' | 'skipped' | 'failed' - | 'cancelled' + | 'canceled' | 'next' | 'attention'; @@ -83,7 +83,7 @@ export interface WalkthroughEntry { text: string; } -export type RunOutcome = 'success' | 'failure' | 'cancelled'; +export type RunOutcome = 'success' | 'failure' | 'canceled'; export interface RunSnapshot { /** Tasks to display, in order. Optional tasks appear once they start. */ @@ -188,10 +188,10 @@ export function createRunModel(options: RunModelOptions): RunModel { let prompt: UiPromptRequest | null = null; let integration: string | undefined; let outcome: RunOutcome | null = null; - let cancelled = false; + let canceled = false; // The task whose phase just exited. Every exit is immediately followed by the - // next state's enter, which settles it: completed, or failed/cancelled when - // the machine went to error/cancelled instead. Settling there (not on exit) + // next state's enter, which settles it: completed, or failed/canceled when + // the machine went to error/canceled instead. Settling there (not on exit) // keeps a failing task from flashing "completed" first. let exiting: TaskId | null = null; let lastFile: string | null = null; @@ -315,14 +315,14 @@ export function createRunModel(options: RunModelOptions): RunModel { // ── Phases → tasks ──────────────────────────────────────────────────────── function onEnter({ state }: InstallerEvents['state:enter']): void { - const ended = state === 'error' || state === 'cancelled'; - const settle: TaskStatus = state === 'error' ? 'failed' : state === 'cancelled' ? 'cancelled' : 'completed'; + const ended = state === 'error' || state === 'canceled'; + const settle: TaskStatus = state === 'error' ? 'failed' : state === 'canceled' ? 'canceled' : 'completed'; const settling = exiting ?? (ended ? current() : undefined); exiting = null; if (settling) setTask(settling, settle); if (ended) { - cancelled ||= state === 'cancelled'; + canceled ||= state === 'canceled'; for (const items of substatus.values()) { for (const [id, s] of items) if (s === 'in_progress') items.set(id, settle); } @@ -433,7 +433,7 @@ export function createRunModel(options: RunModelOptions): RunModel { 'postinstall:unavailable': ({ reason }) => narrate('postinstall:unavailable', {}, reason), complete: ({ success }) => { - outcome = success ? 'success' : cancelled ? 'cancelled' : 'failure'; + outcome = success ? 'success' : canceled ? 'canceled' : 'failure'; const pending = outcome === 'success' && needsAttention(); narrate( 'complete', diff --git a/src/tui/theme.ts b/src/tui/theme.ts index 62fff77e..5d42ad49 100644 --- a/src/tui/theme.ts +++ b/src/tui/theme.ts @@ -17,7 +17,7 @@ export const glyphs = { failed: '✗', pending: '○', skipped: '–', - cancelled: '■', + canceled: '■', pointer: '›', bullet: '·', warning: '!', diff --git a/src/utils/analytics.spec.ts b/src/utils/analytics.spec.ts index ac659500..191d6027 100644 --- a/src/utils/analytics.spec.ts +++ b/src/utils/analytics.spec.ts @@ -369,7 +369,7 @@ describe('Analytics', () => { ); }); - it('supports cancelled outcome', async () => { + it('supports canceled outcome', async () => { await analytics.shutdown('cancelled'); expect(mockQueueEvent).toHaveBeenCalledWith( diff --git a/src/utils/exit-codes.spec.ts b/src/utils/exit-codes.spec.ts index 63fe2acc..7628525a 100644 --- a/src/utils/exit-codes.spec.ts +++ b/src/utils/exit-codes.spec.ts @@ -18,7 +18,7 @@ describe('exit-codes', () => { it('has correct values', () => { expect(ExitCode.SUCCESS).toBe(0); expect(ExitCode.GENERAL_ERROR).toBe(1); - expect(ExitCode.CANCELLED).toBe(2); + expect(ExitCode.CANCELED).toBe(2); expect(ExitCode.AUTH_REQUIRED).toBe(4); }); }); @@ -31,10 +31,10 @@ describe('exit-codes', () => { }); }); - it('maps cancelled to exit 2', () => { + it('maps canceled to exit 2', () => { expect(resolveErrorCode('cancelled')).toEqual({ reason: 'cancelled', - exit: ExitCode.CANCELLED, + exit: ExitCode.CANCELED, }); }); @@ -107,7 +107,7 @@ describe('exit-codes', () => { it('includes termination reason derived from exit code in context', () => { try { - exitWithCode(ExitCode.CANCELLED); + exitWithCode(ExitCode.CANCELED); } catch (e) { expect((e as InstanceType).context?.reason).toBe('cancelled'); } diff --git a/src/utils/exit-codes.ts b/src/utils/exit-codes.ts index 3d2bdab9..24f0bd8f 100644 --- a/src/utils/exit-codes.ts +++ b/src/utils/exit-codes.ts @@ -3,7 +3,7 @@ * * 0 = Success * 1 = General error - * 2 = Cancelled (e.g., Ctrl+C, user cancelled prompt) + * 2 = Canceled (e.g., Ctrl+C, user canceled prompt) * 4 = Authentication required */ @@ -17,7 +17,7 @@ import type { TerminationReason } from './telemetry-types.js'; export const ExitCode = { SUCCESS: 0, GENERAL_ERROR: 1, - CANCELLED: 2, + CANCELED: 2, AUTH_REQUIRED: 4, } as const; @@ -28,7 +28,7 @@ const ERROR_CODE_MAP: Record { errorSpy.mockRestore(); }); - it('throws CliExit with exit code 2 for cancelled', () => { + it('throws CliExit with exit code 2 for canceled', () => { const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); try { - exitWithError({ code: 'cancelled', message: 'User cancelled' }); + exitWithError({ code: 'cancelled', message: 'User canceled' }); expect.fail('expected exitWithError to throw'); } catch (e) { expect(e).toBeInstanceOf(CliExit); diff --git a/src/utils/ui-utils.spec.ts b/src/utils/ui-utils.spec.ts index 24e6a84c..bf6a043b 100644 --- a/src/utils/ui-utils.spec.ts +++ b/src/utils/ui-utils.spec.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; /** * Locks the Layer-1 invariant of the agent/CI path fix: when prompts are not - * allowed (agent/ci/non-TTY), abortIfCancelled must fail fast with a structured + * allowed (agent/ci/non-TTY), abortIfCanceled must fail fast with a structured * CliExit *without awaiting* the input promise — awaiting a never-resolving * prompt is exactly the hang this guard fixes. */ @@ -33,9 +33,9 @@ const { setInteractionMode, resetInteractionModeForTests } = await import('./int const { CliExit } = await import('./cli-exit.js'); const { setOutputMode } = await import('./output.js'); const { analytics } = await import('./analytics.js'); -const { abortIfCancelled, getOrAskForWorkOSCredentials } = await import('./ui-utils.js'); +const { abortIfCanceled, getOrAskForWorkOSCredentials } = await import('./ui-utils.js'); -describe('abortIfCancelled — non-interactive guard', () => { +describe('abortIfCanceled — non-interactive guard', () => { beforeEach(() => { resetInteractionModeForTests(); setOutputMode('human'); @@ -51,12 +51,12 @@ describe('abortIfCancelled — non-interactive guard', () => { it('agent mode throws CliExit without awaiting the input promise', async () => { setInteractionMode({ mode: 'agent', source: 'env' }); // A never-resolving input: if the guard awaited it, this test would time out. - await expect(abortIfCancelled(new Promise(() => {}))).rejects.toThrow(CliExit); + await expect(abortIfCanceled(new Promise(() => {}))).rejects.toThrow(CliExit); }); it('ci mode throws CliExit without awaiting the input promise', async () => { setInteractionMode({ mode: 'ci', source: 'env' }); - await expect(abortIfCancelled(new Promise(() => {}))).rejects.toThrow(CliExit); + await expect(abortIfCanceled(new Promise(() => {}))).rejects.toThrow(CliExit); }); it('emits a structured non_interactive_prompt error in JSON mode', async () => { @@ -64,7 +64,7 @@ describe('abortIfCancelled — non-interactive guard', () => { setOutputMode('json'); const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); - await expect(abortIfCancelled(new Promise(() => {}))).rejects.toThrow(CliExit); + await expect(abortIfCanceled(new Promise(() => {}))).rejects.toThrow(CliExit); expect(errorSpy).toHaveBeenCalled(); const payload = JSON.parse(String(errorSpy.mock.calls[0][0])); @@ -76,14 +76,14 @@ describe('abortIfCancelled — non-interactive guard', () => { it('human mode passes a resolved value through', async () => { setInteractionMode({ mode: 'human', source: 'default' }); vi.mocked(ui.isCancel).mockReturnValue(false); - await expect(abortIfCancelled('value')).resolves.toBe('value'); + await expect(abortIfCanceled('value')).resolves.toBe('value'); }); - it('does not flush a cancelled session on the happy path (no per-prompt dead-time)', async () => { + it('does not flush a canceled session on the happy path (no per-prompt dead-time)', async () => { setInteractionMode({ mode: 'human', source: 'default' }); vi.mocked(ui.isCancel).mockReturnValue(false); - await abortIfCancelled('value'); + await abortIfCanceled('value'); // shutdown('cancelled') must fire ONLY on an actual cancel — never on a // resolved prompt (regression guard for the 3s-per-prompt flush bug). diff --git a/src/utils/ui-utils.ts b/src/utils/ui-utils.ts index e29efbd2..b72a7f58 100644 --- a/src/utils/ui-utils.ts +++ b/src/utils/ui-utils.ts @@ -53,11 +53,11 @@ export interface CliSetupConfigContent { export async function abort(message?: string, status?: number): Promise { await analytics.shutdown('cancelled'); - ui.outro(message ?? 'Installer setup cancelled.'); + ui.outro(message ?? 'Installer setup canceled.'); return process.exit(status ?? 1); } -export async function abortIfCancelled( +export async function abortIfCanceled( input: T | Promise, integration?: Integration, ): Promise> { @@ -94,7 +94,7 @@ export async function abortIfCancelled( const docsUrl = integration ? INTEGRATION_CONFIG[integration].docsUrl : 'https://workos.com/docs/user-management'; ui.cancel( - `Installer setup cancelled. You can read the documentation for ${ + `Installer setup canceled. You can read the documentation for ${ integration ?? 'WorkOS AuthKit' } at ${chalk.cyan(docsUrl)} to continue with the setup manually.`, ); @@ -120,7 +120,7 @@ export async function confirmContinueIfNoOrDirtyGitRepo(options: Pick { - const selection = await abortIfCancelled<{ value: string; index: number } | symbol>( + const selection = await abortIfCanceled<{ value: string; index: number } | symbol>( ui.select({ maxItems: 12, message: message, @@ -249,7 +249,7 @@ export async function confirmContinueIfPackageVersionNotSupported({ ); ui.note(note ?? `Please upgrade to ${acceptableVersions} if you wish to use the WorkOS AuthKit installer.`); - const continueWithUnsupportedVersion = await abortIfCancelled( + const continueWithUnsupportedVersion = await abortIfCanceled( ui.confirm({ message: 'Do you want to continue anyway?', }), @@ -313,7 +313,7 @@ export async function installPackage({ }): Promise<{ packageManager?: PackageManager }> { return traceStep('install-package', async () => { if (alreadyInstalled && askBeforeUpdating) { - const shouldUpdatePackage = await abortIfCancelled( + const shouldUpdatePackage = await abortIfCanceled( ui.confirm({ message: `The ${chalk.bold.cyan( packageNameDisplayLabel ?? packageName, @@ -427,7 +427,7 @@ export async function ensurePackageIsInstalled( analytics.setTag(`${packageName.toLowerCase()}-installed`, installed); if (!installed) { - const continueWithoutPackage = await abortIfCancelled( + const continueWithoutPackage = await abortIfCanceled( ui.confirm({ message: `${packageName} does not seem to be installed. Do you still want to continue?`, initialValue: false, @@ -512,7 +512,7 @@ export async function getPackageManager( ? 'Multiple package managers detected. Please select one:' : 'Please select your package manager.'; - const selectedPackageManager = await abortIfCancelled( + const selectedPackageManager = await abortIfCanceled( ui.select({ message, options: pkgOptions.map((packageManager) => ({ @@ -592,7 +592,7 @@ export async function getOrAskForWorkOSCredentials( if (requireApiKey && !apiKey) { ui.log.info(`${chalk.dim('ℹ️ Your API key will be hidden for security and saved to .env.local')}`); - apiKey = (await abortIfCancelled( + apiKey = (await abortIfCanceled( ui.password({ message: 'Enter your WorkOS API Key', validate: (value) => { @@ -609,7 +609,7 @@ export async function getOrAskForWorkOSCredentials( } if (!clientId) { - clientId = (await abortIfCancelled( + clientId = (await abortIfCanceled( ui.text({ message: 'Enter your WorkOS Client ID', placeholder: 'client_...', diff --git a/src/utils/ui.spec.ts b/src/utils/ui.spec.ts index d9e37db7..43081713 100644 --- a/src/utils/ui.spec.ts +++ b/src/utils/ui.spec.ts @@ -353,7 +353,7 @@ describe('spinner ownership (AUTH-6732)', () => { expect(output()).toContain('working'); }); - it('does not open pre-aborted or cancelled queued prompts', async () => { + it('does not open pre-aborted or canceled queued prompts', async () => { const controller = new AbortController(); controller.abort(); expect(await ui.confirm({ message: 'moot', signal: controller.signal })).toBe(CANCEL); diff --git a/src/utils/ui.ts b/src/utils/ui.ts index 512b5bae..757a6955 100644 --- a/src/utils/ui.ts +++ b/src/utils/ui.ts @@ -327,7 +327,7 @@ function spinner(): Spinner { /** * Returned by a prompt when the user cancels (ctrl-c) or a signal aborts it. * Typed as a plain `symbol` (not `unique symbol`) to preserve the exact - * generic-inference behavior at call sites like `assertNotCancelled(v: T | symbol)`. + * generic-inference behavior at call sites like `assertNotCanceled(v: T | symbol)`. */ export const CANCEL: symbol = Symbol('workos.prompt.cancel'); @@ -337,7 +337,7 @@ export function isCancel(value: unknown): value is symbol { } /** Print a cancellation line. */ -export function cancel(message = 'Cancelled'): void { +export function cancel(message = 'Canceled'): void { if (uiHost) { uiHost.line({ kind: 'plain', message, rendered: dim(message), stream: 'stderr' }); return; From 5525e59756123dccc0f6c4cc940368d7b5876c97 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 14 Oct 2026 22:45:46 +0000 Subject: [PATCH 2/3] test: stub maybeOfferSkillsUpdate in readonly installer fixture Co-Authored-By: chance --- src/test/readonly-installer.fixture.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/readonly-installer.fixture.ts b/src/test/readonly-installer.fixture.ts index b4a96846..4c141fcf 100644 --- a/src/test/readonly-installer.fixture.ts +++ b/src/test/readonly-installer.fixture.ts @@ -92,7 +92,7 @@ mock.module('../lib/resolve-install-credentials.js', () => ({ maybePickInstallEnvironment: async () => {}, resolveStagingCredentials: forbidden('staging credentials'), })); -mock.module('../commands/setup.js', () => ({ maybeRunSetupAfter: async () => {} })); +mock.module('../commands/setup.js', () => ({ maybeRunSetupAfter: async () => {}, maybeOfferSkillsUpdate: async () => {} })); const credentials = await import('../lib/credentials.js'); mock.module('../lib/credentials.js', () => ({ ...credentials, getAccessToken: () => 'offline-test-token' })); const application = await import('../lib/authkit-application-setup.js'); From 1876290ed3ae809abc8a51a01f62f7803c6fae6a Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 14 Oct 2026 22:45:52 +0000 Subject: [PATCH 3/3] style: format readonly installer fixture Co-Authored-By: chance --- src/test/readonly-installer.fixture.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/readonly-installer.fixture.ts b/src/test/readonly-installer.fixture.ts index 4c141fcf..95732210 100644 --- a/src/test/readonly-installer.fixture.ts +++ b/src/test/readonly-installer.fixture.ts @@ -92,7 +92,10 @@ mock.module('../lib/resolve-install-credentials.js', () => ({ maybePickInstallEnvironment: async () => {}, resolveStagingCredentials: forbidden('staging credentials'), })); -mock.module('../commands/setup.js', () => ({ maybeRunSetupAfter: async () => {}, maybeOfferSkillsUpdate: async () => {} })); +mock.module('../commands/setup.js', () => ({ + maybeRunSetupAfter: async () => {}, + maybeOfferSkillsUpdate: async () => {}, +})); const credentials = await import('../lib/credentials.js'); mock.module('../lib/credentials.js', () => ({ ...credentials, getAccessToken: () => 'offline-test-token' })); const application = await import('../lib/authkit-application-setup.js');