@supercheck/cli 0.1.1-rc.1 → 0.1.1-rc.3

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bin/supercheck.ts","../../src/commands/login.ts","../../src/auth/store.ts","../../src/utils/errors.ts","../../src/utils/logger.ts","../../src/version.ts","../../src/utils/proxy.ts","../../src/api/client.ts","../../src/utils/discovery.ts","../../src/utils/slug.ts","../../src/utils/resources.ts","../../src/utils/spinner.ts","../../src/output/formatter.ts","../../src/commands/health.ts","../../src/config/loader.ts","../../src/config/schema.ts","../../src/commands/config.ts","../../src/commands/init.ts","../../src/utils/package-manager.ts","../../src/utils/deps.ts","../../src/utils/uuid.ts","../../src/commands/jobs.ts","../../src/api/authenticated-client.ts","../../src/utils/number.ts","../../src/utils/validation.ts","../../src/utils/exec.ts","../../src/utils/playwright.ts","../../src/commands/runs.ts","../../src/commands/tests.ts","../../src/commands/monitors.ts","../../src/commands/variables.ts","../../src/commands/tags.ts","../../src/commands/diff.ts","../../src/utils/reconcile.ts","../../src/commands/deploy.ts","../../src/utils/paths.ts","../../src/commands/destroy.ts","../../src/commands/pull.ts","../../src/commands/validate.ts","../../src/commands/notifications.ts","../../src/commands/alerts.ts","../../src/commands/audit.ts","../../src/commands/doctor.ts","../../src/commands/upgrade.ts"],"sourcesContent":["import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { loginCommand, logoutCommand, whoamiCommand } from '../commands/login.js'\nimport { healthCommand, locationsCommand } from '../commands/health.js'\nimport { configCommand } from '../commands/config.js'\nimport { initCommand } from '../commands/init.js'\nimport { jobCommand } from '../commands/jobs.js'\nimport { runCommand } from '../commands/runs.js'\nimport { testCommand } from '../commands/tests.js'\nimport { monitorCommand } from '../commands/monitors.js'\nimport { varCommand } from '../commands/variables.js'\nimport { tagCommand } from '../commands/tags.js'\nimport { diffCommand } from '../commands/diff.js'\nimport { deployCommand } from '../commands/deploy.js'\nimport { destroyCommand } from '../commands/destroy.js'\nimport { pullCommand } from '../commands/pull.js'\nimport { validateCommand } from '../commands/validate.js'\nimport { notificationCommand } from '../commands/notifications.js'\nimport { alertCommand } from '../commands/alerts.js'\nimport { auditCommand } from '../commands/audit.js'\nimport { doctorCommand } from '../commands/doctor.js'\nimport { upgradeCommand } from '../commands/upgrade.js'\nimport { setOutputFormat, type OutputFormat } from '../output/formatter.js'\nimport { setQuietMode, setLogLevel } from '../utils/logger.js'\nimport { ApiRequestError, CLIError, ExitCode } from '../utils/errors.js'\nimport { DependencyError } from '../utils/deps.js'\nimport { CLI_VERSION } from '../version.js'\n\nconst program = new Command()\n .name('supercheck')\n .description('Open-source testing, monitoring, and reliability — as code')\n .version(CLI_VERSION, '-v, --version')\n .option('--json', 'Output in JSON format')\n .option('--quiet', 'Suppress non-essential output')\n .option('--debug', 'Enable debug logging')\n .hook('preAction', (_thisCommand, actionCommand) => {\n const opts = program.opts()\n\n if (opts.json) {\n setOutputFormat('json' as OutputFormat)\n }\n\n if (opts.quiet) {\n setQuietMode(true)\n setOutputFormat('quiet' as OutputFormat)\n }\n\n if (opts.debug) {\n setLogLevel('debug')\n }\n\n // Validate that actionCommand exists (just for type safety)\n void actionCommand\n })\n\n// Register commands — auth\nprogram.addCommand(loginCommand)\nprogram.addCommand(logoutCommand)\nprogram.addCommand(whoamiCommand)\n\n// Register commands — project\nprogram.addCommand(initCommand)\nprogram.addCommand(configCommand)\n\n// Register commands — resources\nprogram.addCommand(jobCommand)\nprogram.addCommand(runCommand)\nprogram.addCommand(testCommand)\nprogram.addCommand(monitorCommand)\nprogram.addCommand(varCommand)\nprogram.addCommand(tagCommand)\n\n// Register commands — monitoring-as-code\nprogram.addCommand(diffCommand)\nprogram.addCommand(deployCommand)\nprogram.addCommand(validateCommand)\nprogram.addCommand(destroyCommand)\nprogram.addCommand(pullCommand)\n\n// Register commands — notifications & alerts\nprogram.addCommand(notificationCommand)\nprogram.addCommand(alertCommand)\nprogram.addCommand(auditCommand)\n\n// Register commands — utilities\nprogram.addCommand(healthCommand)\nprogram.addCommand(locationsCommand)\nprogram.addCommand(doctorCommand)\nprogram.addCommand(upgradeCommand)\n\n// Global error handler\nprogram.exitOverride()\n\nasync function main(): Promise<void> {\n try {\n await program.parseAsync(process.argv)\n } catch (err) {\n if (err instanceof ApiRequestError && err.responseBody !== undefined) {\n const details = (() => {\n if (typeof err.responseBody === 'string') {\n return err.responseBody.trim() ? `Details: ${err.responseBody}` : ''\n }\n if (err.responseBody && typeof err.responseBody === 'object') {\n return `Details: ${JSON.stringify(err.responseBody, null, 2)}`\n }\n return err.responseBody ? `Details: ${String(err.responseBody)}` : ''\n })()\n\n const suffix = details ? `\\n${details}\\n` : '\\n'\n console.error(pc.red(`\\n✗ ${err.message}${suffix}`))\n process.exit(err.exitCode)\n }\n\n if (err instanceof DependencyError) {\n console.error(pc.red(`\\n✗ Missing dependency: ${err.dependency}`))\n console.error(pc.yellow(`\\n${err.message}\\n`))\n console.error(pc.dim('Run `supercheck doctor` for a full dependency check.\\n'))\n process.exit(ExitCode.ConfigError)\n }\n\n if (err instanceof CLIError) {\n if (err.exitCode !== ExitCode.Success) {\n console.error(pc.red(`\\n✗ ${err.message}\\n`))\n }\n process.exit(err.exitCode)\n }\n\n // Commander.js exit override throws CommanderError for --help, --version, etc.\n // Check for exitCode property (Commander sets exitCode: 0 for successful exits)\n if (err && typeof err === 'object' && 'exitCode' in err && typeof err.exitCode === 'number') {\n process.exit(err.exitCode)\n }\n\n // Unknown error\n console.error(pc.red(`\\n✗ Unexpected error: ${err instanceof Error ? err.message : String(err)}\\n`))\n process.exit(ExitCode.GeneralError)\n }\n}\n\nmain()\n","import { Command } from 'commander'\nimport {\n setToken,\n setBaseUrl,\n clearAuth,\n getToken,\n getStoredBaseUrl,\n validateTokenFormat,\n} from '../auth/store.js'\nimport { getApiClient } from '../api/client.js'\nimport { logger } from '../utils/logger.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { safeTokenPreview } from '../utils/resources.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { getOutputFormat } from '../output/formatter.js'\n\nexport const loginCommand = new Command('login')\n .description('Authenticate with Supercheck')\n .option('--token <token>', 'Provide a CLI token directly (for CI/CD)')\n .option('--url <url>', 'Supercheck API URL (for self-hosted instances)')\n .action(async (options: { token?: string; url?: string }) => {\n if (options.token) {\n const token = options.token.trim()\n if (!validateTokenFormat(token)) {\n throw new CLIError(\n 'Invalid token. `supercheck login` requires a CLI token (sck_live_* or sck_test_*). Trigger keys (sck_trigger_* / job_*) are only for `supercheck job trigger` via SUPERCHECK_TRIGGER_KEY.',\n ExitCode.AuthError,\n )\n }\n\n // Build client with provided options (don't persist until verified)\n const client = getApiClient({\n baseUrl: options.url,\n token,\n })\n\n try {\n // Verify token using a Bearer-auth-compatible endpoint\n await withSpinner(\n 'Verifying token...',\n () => client.get('/api/cli-tokens'),\n { successText: 'Token verified' },\n )\n } catch {\n throw new CLIError(\n 'Token verification failed. Please check your token and try again.',\n ExitCode.AuthError,\n )\n }\n\n // Token verified — now persist credentials\n setToken(token)\n if (options.url) {\n setBaseUrl(options.url)\n }\n\n const tokenPreview = safeTokenPreview(token)\n logger.success('Authentication successful')\n logger.info(` Token: ${tokenPreview}`)\n if (options.url) {\n logger.info(` API URL: ${options.url}`)\n }\n return\n }\n\n // Interactive login — not yet implemented\n logger.newline()\n logger.info('To authenticate, create a CLI token in the Dashboard:')\n logger.info(' Dashboard → Project Settings → CLI Tokens → Create Token')\n logger.newline()\n if (options.url) {\n logger.info(`Then run: supercheck login --token <your-token> --url ${options.url}`)\n } else {\n logger.info('Then run: supercheck login --token <your-token>')\n }\n logger.newline()\n logger.warn('Browser-based OAuth login is not yet implemented.')\n })\n\nexport const logoutCommand = new Command('logout')\n .description('Remove stored authentication credentials')\n .action(() => {\n clearAuth()\n logger.success('Logged out successfully. Stored credentials removed.')\n })\n\nexport const whoamiCommand = new Command('whoami')\n .description('Show current authentication context')\n .action(async () => {\n const token = getToken()\n if (!token) {\n throw new CLIError(\n 'Not authenticated. Run `supercheck login` to authenticate.',\n ExitCode.AuthError,\n )\n }\n\n const baseUrl = getStoredBaseUrl()\n const client = getApiClient({ token, baseUrl: baseUrl ?? undefined })\n\n try {\n // Use cli-tokens endpoint which supports Bearer auth via requireAuthContext()\n const data = await withSpinner(\n 'Fetching context...',\n async () => {\n const { data } = await client.get<{\n success: boolean\n tokens: Array<{\n id: string\n name: string\n start: string\n enabled: boolean\n createdByName: string\n expiresAt: string | null\n lastRequest: string | null\n }>\n }>('/api/cli-tokens')\n return data\n },\n { successText: 'Context loaded' },\n )\n\n const tokenPreview = safeTokenPreview(token)\n\n // Match the current token against the server's token list by prefix\n const activeToken = data.tokens?.find((t) => t.start && token.startsWith(t.start.replace(/\\.+$/, '')))\n\n // JSON output mode\n if (getOutputFormat() === 'json') {\n const jsonData: Record<string, unknown> = {\n user: activeToken?.createdByName ?? null,\n tokenName: activeToken?.name ?? null,\n tokenPreview,\n apiUrl: baseUrl ?? 'https://app.supercheck.io',\n expiresAt: activeToken?.expiresAt ?? null,\n lastUsed: activeToken?.lastRequest ?? null,\n }\n logger.output(JSON.stringify(jsonData, null, 2))\n return\n }\n\n logger.newline()\n logger.header('Current Context')\n logger.newline()\n if (activeToken?.createdByName && activeToken.createdByName !== '-') {\n logger.info(` User: ${activeToken.createdByName}`)\n }\n if (activeToken?.name) {\n logger.info(` Token: ${activeToken.name} (${tokenPreview})`)\n } else {\n logger.info(` Token: ${tokenPreview}`)\n }\n logger.info(` API URL: ${baseUrl ?? 'https://app.supercheck.io'}`)\n if (activeToken?.expiresAt) {\n logger.info(` Expires: ${activeToken.expiresAt}`)\n }\n if (activeToken?.lastRequest) {\n logger.info(` Last used: ${activeToken.lastRequest}`)\n }\n logger.newline()\n } catch {\n throw new CLIError(\n 'Failed to verify authentication. Your token may be expired or invalid.',\n ExitCode.AuthError,\n )\n }\n })\n","import Conf from 'conf'\nimport { AuthenticationError } from '../utils/errors.js'\nimport { logger } from '../utils/logger.js'\n\nconst TOKEN_PREFIX_LIVE = 'sck_live_'\nconst TOKEN_PREFIX_TEST = 'sck_test_'\nconst TOKEN_PREFIX_TRIGGER = 'sck_trigger_'\nconst TOKEN_PREFIX_TRIGGER_LEGACY = 'job_'\n\nconst VALID_CLI_PREFIXES = [TOKEN_PREFIX_LIVE, TOKEN_PREFIX_TEST]\nconst VALID_TRIGGER_PREFIXES = [TOKEN_PREFIX_TRIGGER, TOKEN_PREFIX_TRIGGER_LEGACY]\n\ninterface AuthData {\n token?: string\n baseUrl?: string\n organization?: string\n project?: string\n}\n\n/**\n * Local credential store using `conf`.\n *\n * SECURITY NOTE: The key below is a static obfuscation key — it prevents\n * casual inspection of the JSON file on disk but does NOT provide real\n * encryption against a determined attacker with file access.\n * For CI/CD and production use, prefer the SUPERCHECK_TOKEN environment\n * variable which bypasses the local store entirely.\n *\n * The `conf` library requires the parameter name `encryptionKey` — it is\n * NOT true encryption in this usage because the key is static and public.\n */\nconst store = new Conf<AuthData>({\n projectName: 'supercheck-cli',\n schema: {\n token: { type: 'string' },\n baseUrl: { type: 'string' },\n organization: { type: 'string' },\n project: { type: 'string' },\n },\n // Static obfuscation key — see SECURITY NOTE above.\n encryptionKey: 'supercheck-cli-v1',\n})\n\n/**\n * Validate that a token has a recognized prefix.\n */\nexport function validateTokenFormat(token: string): boolean {\n return VALID_CLI_PREFIXES.some((prefix) => token.startsWith(prefix))\n}\n\nexport function validateTriggerKeyFormat(token: string): boolean {\n return VALID_TRIGGER_PREFIXES.some((prefix) => token.startsWith(prefix))\n}\n\n/**\n * Get the current authentication token.\n * Priority: env var > stored token\n */\nexport function getToken(): string | null {\n const envToken = process.env.SUPERCHECK_TOKEN\n if (envToken) {\n const trimmed = envToken.trim()\n if (!validateTokenFormat(trimmed)) {\n logger.warn('SUPERCHECK_TOKEN must be a CLI token (sck_live_* or sck_test_*).')\n return null\n }\n return trimmed\n }\n\n const stored = store.get('token')\n if (!stored) return null\n return validateTokenFormat(stored) ? stored : null\n}\n\nexport function getTriggerKey(): string | null {\n const envKey = process.env.SUPERCHECK_TRIGGER_KEY\n if (envKey) {\n const trimmed = envKey.trim()\n if (!validateTriggerKeyFormat(trimmed)) {\n logger.warn('SUPERCHECK_TRIGGER_KEY must start with sck_trigger_ or job_.')\n return null\n }\n return trimmed\n }\n\n // Backward-compatible fallback: allow using SUPERCHECK_TOKEN as a trigger key\n // only if it matches a trigger key prefix.\n const token = process.env.SUPERCHECK_TOKEN\n if (token && validateTriggerKeyFormat(token.trim())) {\n logger.warn('Using SUPERCHECK_TOKEN as a trigger key. Prefer setting SUPERCHECK_TRIGGER_KEY instead.')\n return token.trim()\n }\n\n return null\n}\n\n/**\n * Store a token after validation.\n */\nexport function setToken(token: string): void {\n if (!validateTokenFormat(token)) {\n throw new AuthenticationError(\n `Invalid token format. Token must start with one of: ${VALID_CLI_PREFIXES.join(', ')}`,\n )\n }\n store.set('token', token)\n}\n\n/**\n * Remove stored credentials.\n */\nexport function clearAuth(): void {\n store.delete('token')\n store.delete('baseUrl')\n store.delete('organization')\n store.delete('project')\n}\n\n/**\n * Get the stored base URL override.\n */\nexport function getStoredBaseUrl(): string | null {\n return process.env.SUPERCHECK_URL ?? store.get('baseUrl') ?? null\n}\n\n/**\n * Store a base URL for self-hosted instances.\n */\nexport function setBaseUrl(url: string): void {\n store.set('baseUrl', url)\n}\n\n/**\n * Get the stored organization context.\n */\nexport function getStoredOrganization(): string | null {\n return process.env.SUPERCHECK_ORG ?? store.get('organization') ?? null\n}\n\n/**\n * Store the active organization.\n */\nexport function setOrganization(org: string): void {\n store.set('organization', org)\n}\n\n/**\n * Get the stored project context.\n */\nexport function getStoredProject(): string | null {\n return process.env.SUPERCHECK_PROJECT ?? store.get('project') ?? null\n}\n\n/**\n * Store the active project.\n */\nexport function setProject(project: string): void {\n store.set('project', project)\n}\n\n/**\n * Check if authenticated (token is available).\n */\nexport function isAuthenticated(): boolean {\n return getToken() !== null\n}\n\n/**\n * Require authentication — throw if no token available.\n */\nexport function requireAuth(): string {\n const token = getToken()\n if (!token) {\n throw new AuthenticationError(\n 'Not authenticated. Run `supercheck login` or set SUPERCHECK_TOKEN environment variable.',\n )\n }\n return token\n}\n\nexport function requireTriggerKey(): string {\n const key = getTriggerKey()\n if (!key) {\n throw new AuthenticationError(\n 'Missing trigger key. Set SUPERCHECK_TRIGGER_KEY (sck_trigger_* or job_*) to use `supercheck job trigger`.',\n )\n }\n return key\n}\n","/**\n * Standard CLI exit codes.\n *\n * 0 — Success\n * 1 — General error\n * 2 — Authentication error\n * 3 — Configuration error\n * 4 — Network / API error\n * 5 — Timeout\n */\nexport enum ExitCode {\n Success = 0,\n GeneralError = 1,\n AuthError = 2,\n ConfigError = 3,\n ApiError = 4,\n Timeout = 5,\n}\n\nexport class CLIError extends Error {\n public readonly exitCode: ExitCode\n\n constructor(message: string, exitCode: ExitCode = ExitCode.GeneralError) {\n super(message)\n this.name = 'CLIError'\n this.exitCode = exitCode\n }\n}\n\nexport class AuthenticationError extends CLIError {\n constructor(message: string) {\n super(message, ExitCode.AuthError)\n this.name = 'AuthenticationError'\n }\n}\n\nexport class ConfigurationError extends CLIError {\n constructor(message: string) {\n super(message, ExitCode.ConfigError)\n this.name = 'ConfigurationError'\n }\n}\n\nexport class ApiRequestError extends CLIError {\n public readonly statusCode?: number\n public readonly responseBody?: unknown\n\n constructor(message: string, statusCode?: number, responseBody?: unknown) {\n super(message, ExitCode.ApiError)\n this.name = 'ApiRequestError'\n this.statusCode = statusCode\n this.responseBody = responseBody\n }\n}\n\nexport class TimeoutError extends CLIError {\n constructor(message: string) {\n super(message, ExitCode.Timeout)\n this.name = 'TimeoutError'\n }\n}\n\nexport class ConfigNotFoundError extends CLIError {\n constructor(message: string = 'No supercheck.config.ts found. Run `supercheck init` to create one.') {\n super(message, ExitCode.ConfigError)\n this.name = 'ConfigNotFoundError'\n }\n}\n","import pc from 'picocolors'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent'\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n}\n\nlet currentLevel: LogLevel = 'info'\nlet quietMode = false\n\nexport function setLogLevel(level: LogLevel): void {\n currentLevel = level\n}\n\nexport function setQuietMode(quiet: boolean): void {\n quietMode = quiet\n if (quiet) currentLevel = 'error'\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] >= LOG_LEVELS[currentLevel]\n}\n\nexport const logger = {\n debug(message: string, ...args: unknown[]): void {\n if (shouldLog('debug')) {\n console.error(pc.gray(`[debug] ${message}`), ...args)\n }\n },\n\n info(message: string, ...args: unknown[]): void {\n if (shouldLog('info') && !quietMode) {\n console.error(message, ...args)\n }\n },\n\n success(message: string, ...args: unknown[]): void {\n if (shouldLog('info') && !quietMode) {\n console.error(pc.green(`✓ ${message}`), ...args)\n }\n },\n\n warn(message: string, ...args: unknown[]): void {\n if (shouldLog('warn')) {\n console.error(pc.yellow(`⚠ ${message}`), ...args)\n }\n },\n\n error(message: string, ...args: unknown[]): void {\n if (shouldLog('error')) {\n console.error(pc.red(`✗ ${message}`), ...args)\n }\n },\n\n /**\n * Output data to stdout (not stderr).\n * This is for machine-readable output (JSON, tables).\n */\n output(data: string): void {\n console.log(data)\n },\n\n newline(): void {\n if (!quietMode) console.error('')\n },\n\n /**\n * Print a styled header.\n */\n header(text: string): void {\n if (!quietMode) {\n console.error(pc.bold(pc.cyan(text)))\n }\n },\n}\n","// Version is injected at build time by tsup via define\ndeclare const __CLI_VERSION__: string\n\nexport const CLI_VERSION: string = typeof __CLI_VERSION__ !== 'undefined' ? __CLI_VERSION__ : '0.0.0-dev'\n","import { ProxyAgent } from 'undici'\n\n/**\n * Shared ProxyAgent cache — avoids creating duplicate agents\n * for the same proxy URL within a single CLI run.\n */\nconst proxyAgents = new Map<string, ProxyAgent>()\n\nexport function getProxyAgent(proxyUrl: string): ProxyAgent {\n const existing = proxyAgents.get(proxyUrl)\n if (existing) return existing\n const created = new ProxyAgent(proxyUrl)\n proxyAgents.set(proxyUrl, created)\n return created\n}\n\n/**\n * Clear all cached ProxyAgent instances (useful for testing).\n */\nexport function clearProxyAgents(): void {\n proxyAgents.clear()\n}\n\n/**\n * Check if a URL matches the NO_PROXY exclusion list.\n */\nexport function isNoProxyMatch(url: URL, noProxyRaw: string): boolean {\n const hostname = url.hostname\n const port = url.port || (url.protocol === 'https:' ? '443' : '80')\n const entries = noProxyRaw\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean)\n\n if (entries.includes('*')) return true\n\n for (const entry of entries) {\n const [hostPart, portPart] = entry.split(':')\n const host = hostPart.trim()\n const entryPort = portPart?.trim()\n\n if (!host) continue\n if (entryPort && entryPort !== port) continue\n\n if (host.startsWith('.')) {\n if (hostname.endsWith(host)) return true\n continue\n }\n\n if (hostname === host) return true\n if (hostname.endsWith(`.${host}`)) return true\n }\n\n return false\n}\n\n/**\n * Get the appropriate proxy URL from environment variables for a given URL.\n * Respects HTTPS_PROXY, HTTP_PROXY, and NO_PROXY conventions.\n */\nexport function getProxyEnv(url: URL): string | null {\n const noProxyRaw = process.env.NO_PROXY ?? process.env.no_proxy\n if (noProxyRaw && isNoProxyMatch(url, noProxyRaw)) {\n return null\n }\n\n if (url.protocol === 'https:') {\n return (\n process.env.HTTPS_PROXY ??\n process.env.https_proxy ??\n process.env.HTTP_PROXY ??\n process.env.http_proxy ??\n null\n )\n }\n\n if (url.protocol === 'http:') {\n return process.env.HTTP_PROXY ?? process.env.http_proxy ?? null\n }\n\n return null\n}\n","import { ApiRequestError, TimeoutError } from '../utils/errors.js'\nimport { logger } from '../utils/logger.js'\nimport { CLI_VERSION } from '../version.js'\nimport { getProxyAgent as getSharedProxyAgent, clearProxyAgents, getProxyEnv } from '../utils/proxy.js'\n\nexport { clearProxyAgents }\n\nconst DEFAULT_BASE_URL = 'https://app.supercheck.io'\nconst DEFAULT_TIMEOUT_MS = 30_000\nconst MAX_RETRIES = 3\nconst RETRY_BACKOFF_MS = 1_000\n\nexport interface ApiClientOptions {\n baseUrl?: string\n token?: string\n timeout?: number\n proxy?: string\n}\n\nexport interface ApiResponse<T = unknown> {\n data: T\n status: number\n headers: Headers\n}\n\nexport interface PaginatedResponse<T = unknown> {\n data: T[]\n pagination: {\n total: number\n page: number\n limit: number\n totalPages: number\n hasNextPage: boolean\n hasPrevPage: boolean\n }\n}\n\nexport class ApiClient {\n private baseUrl: string\n private token: string | null\n private timeout: number\n private proxy: string | null\n\n constructor(options: ApiClientOptions = {}) {\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n this.token = options.token ?? null\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT_MS\n this.proxy = options.proxy ?? null\n }\n\n setToken(token: string): void {\n this.token = token\n }\n\n setBaseUrl(url: string): void {\n this.baseUrl = url.replace(/\\/$/, '')\n }\n\n setTimeout(timeout: number): void {\n this.timeout = timeout\n }\n\n setProxy(proxy: string | null): void {\n this.proxy = proxy\n }\n\n private buildHeaders(extraHeaders?: Record<string, string>): Headers {\n const headers = new Headers({\n 'Content-Type': 'application/json',\n 'User-Agent': `supercheck-cli/${CLI_VERSION}`,\n ...extraHeaders,\n })\n\n if (this.token) {\n headers.set('Authorization', `Bearer ${this.token}`)\n }\n\n return headers\n }\n\n private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>): string {\n const url = new URL(`${this.baseUrl}${path}`)\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n return url.toString()\n }\n\n /**\n * Execute an HTTP request with retries, timeout, and rate limit handling.\n *\n * Retry policy:\n * - 429 (rate limit): retried for all methods (with Retry-After header)\n * - 5xx (server error): retried only for idempotent methods (GET, PUT, DELETE, HEAD, OPTIONS)\n * - Network errors: retried only for idempotent methods\n * - POST and PATCH are NOT retried on 5xx/network errors to prevent duplicate mutations\n */\n async request<T = unknown>(\n method: string,\n path: string,\n options?: {\n body?: unknown\n params?: Record<string, string | number | boolean | undefined>\n headers?: Record<string, string>\n retries?: number\n },\n ): Promise<ApiResponse<T>> {\n const url = this.buildUrl(path, options?.params)\n const parsedUrl = new URL(url)\n const headers = this.buildHeaders(options?.headers)\n const maxRetries = options?.retries ?? MAX_RETRIES\n\n // Only retry idempotent methods on server errors and network failures.\n // POST and PATCH are non-idempotent — retrying them risks duplicate creates/triggers/deletes.\n const upperMethod = method.toUpperCase()\n const isIdempotent = ['GET', 'PUT', 'DELETE', 'HEAD', 'OPTIONS'].includes(upperMethod)\n\n let lastError: Error | null = null\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n try {\n const controller = new AbortController()\n timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n // Use explicitly-set proxy, otherwise resolve from env vars (NO_PROXY-aware)\n const proxy = this.proxy || getProxyEnv(parsedUrl)\n const fetchOptions: RequestInit & { dispatcher?: unknown } = {\n method,\n headers,\n body: options?.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n }\n\n if (proxy) {\n fetchOptions.dispatcher = getSharedProxyAgent(proxy)\n }\n\n const response = await fetch(url, fetchOptions)\n\n clearTimeout(timeoutId)\n timeoutId = null\n\n // Rate limit handling\n if (response.status === 429) {\n if (attempt >= maxRetries) {\n throw new ApiRequestError(\n `Rate limited after ${maxRetries + 1} attempts: ${method} ${path}`,\n 429,\n )\n }\n\n const retryAfter = response.headers.get('Retry-After')\n const parsedSeconds = retryAfter ? Number(retryAfter) : NaN\n const waitMs = Number.isFinite(parsedSeconds) && parsedSeconds > 0\n ? parsedSeconds * 1000\n : RETRY_BACKOFF_MS * Math.pow(2, attempt)\n\n logger.warn(`Rate limited. Retrying in ${Math.round(waitMs / 1000)}s...`)\n await this.sleep(waitMs)\n continue\n }\n\n // Server error — retry only for idempotent methods\n if (response.status >= 500 && attempt < maxRetries && isIdempotent) {\n const waitMs = RETRY_BACKOFF_MS * Math.pow(2, attempt)\n logger.debug(`Server error ${response.status}. Retrying in ${waitMs}ms...`)\n await this.sleep(waitMs)\n continue\n }\n\n // Read response body as text first to safely handle empty/non-JSON responses (e.g. 204 No Content)\n const text = await response.text()\n\n // Client error — don't retry\n if (!response.ok) {\n let responseBody: unknown\n try {\n responseBody = JSON.parse(text)\n } catch {\n responseBody = text\n }\n\n throw new ApiRequestError(\n `API request failed: ${method} ${path} → ${response.status}`,\n response.status,\n responseBody,\n )\n }\n\n const data = text ? (JSON.parse(text) as T) : ({} as T)\n\n return {\n data,\n status: response.status,\n headers: response.headers,\n }\n } catch (err) {\n if (err instanceof ApiRequestError) throw err\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n throw new TimeoutError(`Request timed out after ${this.timeout}ms: ${method} ${path}`)\n }\n\n lastError = err as Error\n\n if (attempt < maxRetries && isIdempotent) {\n const waitMs = RETRY_BACKOFF_MS * Math.pow(2, attempt)\n logger.debug(`Network error: ${(err as Error).message}. Retrying in ${waitMs}ms...`)\n await this.sleep(waitMs)\n }\n } finally {\n if (timeoutId !== null) clearTimeout(timeoutId)\n }\n }\n\n throw new ApiRequestError(\n `Request failed after ${maxRetries + 1} attempts: ${lastError?.message ?? 'Unknown error'}`,\n )\n }\n\n async get<T = unknown>(\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n ): Promise<ApiResponse<T>> {\n return this.request<T>('GET', path, { params })\n }\n\n async post<T = unknown>(path: string, body?: unknown): Promise<ApiResponse<T>> {\n return this.request<T>('POST', path, { body })\n }\n\n async put<T = unknown>(path: string, body?: unknown): Promise<ApiResponse<T>> {\n return this.request<T>('PUT', path, { body })\n }\n\n async patch<T = unknown>(path: string, body?: unknown): Promise<ApiResponse<T>> {\n return this.request<T>('PATCH', path, { body })\n }\n\n async delete<T = unknown>(path: string): Promise<ApiResponse<T>> {\n return this.request<T>('DELETE', path)\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n }\n}\n\nlet defaultClient: ApiClient | null = null\n\n/**\n * Get or create the default API client singleton.\n * If options are provided and a client already exists, the token and baseUrl\n * are updated to reflect the caller's intent (e.g., after login).\n */\nexport function getApiClient(options?: ApiClientOptions): ApiClient {\n if (!defaultClient) {\n defaultClient = new ApiClient(options)\n } else if (options) {\n if (options.token !== undefined) defaultClient.setToken(options.token)\n if (options.baseUrl !== undefined) defaultClient.setBaseUrl(options.baseUrl)\n if (options.timeout !== undefined) defaultClient.setTimeout(options.timeout)\n if (options.proxy !== undefined) defaultClient.setProxy(options.proxy)\n }\n return defaultClient\n}\n\n/**\n * Reset the default API client (useful for testing).\n */\nexport function resetApiClient(): void {\n defaultClient = null\n}\n","import { readdirSync, statSync, readFileSync } from 'node:fs'\nimport { resolve, relative, basename } from 'node:path'\nimport { logger } from './logger.js'\n\nexport interface DiscoveredFile {\n absolutePath: string\n relativePath: string\n filename: string\n type: 'playwright' | 'k6'\n}\n\n/**\n * Match files against a simple glob pattern.\n * Supports: ** (any depth), * (any chars in segment)\n */\nfunction matchGlob(filePath: string, pattern: string): boolean {\n // Use safe placeholders (no regex special chars) to protect globs during escaping\n const withPlaceholders = pattern\n .replace(/\\/\\*\\*\\//g, '__GLOBSTAR_SLASH__') // Handle /**/ explicitly to support zero-or-more dirs\n .replace(/\\*\\*/g, '__GLOBSTAR__')\n .replace(/\\*/g, '__STAR__')\n .replace(/\\?/g, '__QMARK__')\n\n // Escape all regex-special characters in the remaining literal text\n const escaped = withPlaceholders.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n // Restore glob wildcards as regex equivalents\n const regexStr = escaped\n .replace(/__GLOBSTAR_SLASH__/g, '(?:/|/.+/)')\n .replace(/__GLOBSTAR__/g, '.*')\n .replace(/__STAR__/g, '[^/]*')\n .replace(/__QMARK__/g, '.')\n\n return new RegExp(`^${regexStr}$`).test(filePath)\n}\n\nconst SKIP_DIRS = new Set([\n 'node_modules', '.git', '.next', '.nuxt', 'dist', 'build',\n 'out', 'coverage', '.turbo', '.cache', '.vercel', 'vendor',\n])\n\n/**\n * Recursively walk a directory, returning all files.\n */\nfunction walkDir(dir: string): string[] {\n const results: string[] = []\n\n try {\n const entries = readdirSync(dir, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = resolve(dir, entry.name)\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue\n results.push(...walkDir(fullPath))\n } else if (entry.isFile()) {\n results.push(fullPath)\n }\n }\n } catch {\n // Directory doesn't exist or isn't readable\n }\n\n return results\n}\n\n/**\n * Extract the static directory prefix from a glob pattern.\n * e.g. '_supercheck_/**\\/*.pw.ts' -> '_supercheck_'\n */\nfunction getGlobStaticPrefix(pattern: string): string | null {\n const parts = pattern.split('/')\n const staticParts: string[] = []\n for (const part of parts) {\n if (part.includes('*') || part.includes('?') || part.includes('{') || part.includes('[')) break\n staticParts.push(part)\n }\n return staticParts.length > 0 ? staticParts.join('/') : null\n}\n\n/**\n * Discover test files matching glob patterns from the config.\n */\nexport function discoverFiles(\n cwd: string,\n patterns: { playwright?: string; k6?: string },\n): DiscoveredFile[] {\n // Collect unique root directories to walk based on glob static prefixes\n const walkRoots = new Set<string>()\n for (const pattern of [patterns.playwright, patterns.k6]) {\n if (!pattern) continue\n const prefix = getGlobStaticPrefix(pattern)\n if (prefix) {\n walkRoots.add(resolve(cwd, prefix))\n } else {\n // Fallback: no static prefix means we must walk cwd\n walkRoots.add(cwd)\n }\n }\n\n // Deduplicate: if cwd is in the set, it subsumes everything else\n if (walkRoots.has(cwd) && walkRoots.size > 1) {\n walkRoots.clear()\n walkRoots.add(cwd)\n }\n\n const allFiles: string[] = []\n for (const root of walkRoots) {\n allFiles.push(...walkDir(root))\n }\n\n const discovered: DiscoveredFile[] = []\n\n for (const absPath of allFiles) {\n const relPath = relative(cwd, absPath)\n const name = basename(absPath)\n\n if (patterns.playwright && matchGlob(relPath, patterns.playwright)) {\n discovered.push({\n absolutePath: absPath,\n relativePath: relPath,\n filename: name,\n type: 'playwright',\n })\n } else if (patterns.k6 && matchGlob(relPath, patterns.k6)) {\n discovered.push({\n absolutePath: absPath,\n relativePath: relPath,\n filename: name,\n type: 'k6',\n })\n }\n }\n\n logger.debug(`Discovered ${discovered.length} test files`)\n return discovered\n}\n\n/**\n * Read a file's content as a UTF-8 string, or return null on error.\n */\nexport function readFileContent(filePath: string): string | null {\n try {\n return readFileSync(filePath, 'utf-8')\n } catch {\n logger.warn(`Cannot read file: ${filePath}`)\n return null\n }\n}\n\n/**\n * Get file size in bytes.\n */\nexport function getFileSize(filePath: string): number {\n try {\n return statSync(filePath).size\n } catch {\n return 0\n }\n}\n","/**\n * Shared utilities for test filename generation and script metadata handling.\n */\n\n/**\n * Convert a string to a URL/filesystem-friendly slug.\n * Used for generating human-readable test filenames from titles.\n *\n * @example\n * slugify('Homepage Check') // 'homepage-check'\n * slugify('load-test') // 'load-test'\n * slugify(' Spaced Title ') // 'spaced-title'\n */\nexport function slugify(text: string): string {\n return (\n text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '') // Remove non-word chars (except spaces and hyphens)\n .replace(/[\\s_]+/g, '-') // Replace spaces/underscores with hyphens\n .replace(/-+/g, '-') // Collapse multiple hyphens\n .replace(/^-|-$/g, '') // Trim leading/trailing hyphens\n .slice(0, 50) || 'test' // Limit length, fallback to 'test'\n )\n}\n\n/**\n * Generate a test filename with a human-readable slug prefix.\n *\n * Format: `{slug}.{uuid}.{pw|k6}.ts`\n *\n * The slug makes files identifiable at a glance in the file explorer,\n * while the UUID ensures stable, deterministic paths that survive\n * test renames (the UUID is the canonical identifier).\n *\n * @example\n * testFilename('019c49bd-...', 'Homepage Check', 'playwright')\n * // → 'homepage-check.019c49bd-....pw.ts'\n */\nexport function testFilename(\n testId: string,\n title: string,\n testType: 'playwright' | 'k6',\n): string {\n const ext = testType === 'k6' ? '.k6.ts' : '.pw.ts'\n const slug = slugify(title)\n return `${slug}.${testId}${ext}`\n}\n\n/**\n * Regex for extracting a UUID from the end of a filename stem.\n * Matches UUID v1–v7 at the end of the string or preceded by a dot separator.\n */\nconst UUID_EXTRACT_REGEX =\n /(?:^|\\.)([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i\n\n/**\n * Extract the UUID from a test filename (with or without slug prefix).\n *\n * Handles both old format (`{uuid}.pw.ts`) and new format (`{slug}.{uuid}.pw.ts`).\n *\n * @returns The UUID string, or `undefined` if no UUID found.\n */\nexport function extractUuidFromFilename(filename: string): string | undefined {\n const base = filename.split(/[/\\\\]/).pop() ?? filename\n const stem = base.replace(/\\.(pw|k6)\\.ts$/, '')\n const match = UUID_EXTRACT_REGEX.exec(stem)\n return match ? match[1] : undefined\n}\n\n/**\n * Strip `@title` metadata from a test script.\n *\n * The `@title` annotation is a local-only developer convenience injected\n * during `supercheck pull`. It should not be included in API payloads or\n * used for diff comparison — the `title` field is the canonical source.\n *\n * Handles:\n * - `// @title My Title\\n\\n` (single-line comment prefix)\n * - `* @title My Title` inside JSDoc blocks\n */\nexport function stripTitleMetadata(script: string): string {\n // Strip leading single-line // @title ... and optional trailing blank line\n let result = script.replace(/^\\/\\/\\s*@title\\s+[^\\n]+\\n\\n?/, '')\n // Strip * @title ... line from JSDoc blocks\n result = result.replace(/\\n\\s*\\*\\s*@title\\s+[^\\n]+/, '')\n return result\n}\n","import { getApiClient } from '../api/client.js'\nimport { discoverFiles, readFileContent } from './discovery.js'\nimport { logger } from './logger.js'\nimport { ApiRequestError } from './errors.js'\nimport { extractUuidFromFilename, stripTitleMetadata } from './slug.js'\nimport type { LocalResource, RemoteResource } from './reconcile.js'\nimport type { SupercheckConfig } from '../config/schema.js'\nimport type { PaginatedResponse } from '../api/client.js'\n\n/**\n * Build local resource list from the loaded config + discovered files.\n */\nexport function buildLocalResources(config: SupercheckConfig, cwd: string): LocalResource[] {\n const resources: LocalResource[] = []\n\n if (config.jobs) {\n for (const job of config.jobs) {\n resources.push({\n id: job.id,\n type: 'job',\n name: job.name,\n definition: {\n ...job,\n tests: normalizeJobTestsToIds(job.tests),\n },\n })\n }\n }\n\n if (config.variables) {\n for (const v of config.variables) {\n resources.push({\n id: v.id,\n type: 'variable',\n name: v.key,\n definition: { key: v.key, value: v.value, isSecret: v.isSecret, description: v.description },\n })\n }\n }\n\n if (config.tags) {\n for (const t of config.tags) {\n resources.push({\n id: t.id,\n type: 'tag',\n name: t.name,\n definition: { name: t.name, color: t.color },\n })\n }\n }\n\n if (Array.isArray(config.monitors)) {\n for (const m of config.monitors) {\n resources.push({\n id: m.id,\n type: 'monitor',\n name: m.name,\n definition: { ...m },\n })\n }\n } else if (typeof config.monitors === 'string') {\n logger.warn(\n `monitors is set to a glob pattern (\"${config.monitors}\") but glob-based monitor discovery is not yet implemented. ` +\n 'Define monitors as an inline array in your config, or remove the monitors field.',\n )\n }\n\n if (Array.isArray(config.statusPages)) {\n for (const sp of config.statusPages) {\n resources.push({\n id: sp.id,\n type: 'statusPage',\n name: sp.name,\n definition: { ...sp },\n })\n }\n } else if (typeof config.statusPages === 'string') {\n logger.warn(\n `statusPages is set to a glob pattern (\"${config.statusPages}\") but glob-based status page discovery is not yet implemented. ` +\n 'Define status pages as an inline array in your config, or remove the statusPages field.',\n )\n }\n\n const patterns = {\n playwright: config.tests?.playwright?.testMatch,\n k6: config.tests?.k6?.testMatch,\n }\n const files = discoverFiles(cwd, patterns)\n for (const file of files) {\n const script = readFileContent(file.absolutePath)\n if (script) {\n // Parse UUID from filename — supports both formats:\n // slug.uuid.pw.ts (new) and uuid.pw.ts (legacy)\n const testId = extractUuidFromFilename(file.filename)\n\n if (!testId) {\n logger.debug(`Test file \"${file.filename}\" does not have a UUID-based filename — will be treated as a new resource`)\n }\n\n // Parse metadata from script content (e.g. // @title My Test Title or * @title My Test Title)\n const titleMatch = script.match(/@title\\s+(.+)$/m)\n const stem = file.filename.replace(/\\.(pw|k6)\\.ts$/, '')\n const title = titleMatch ? titleMatch[1].trim() : stem\n\n // Strip @title metadata from script for comparison/deploy.\n // The @title annotation is local-only developer convenience;\n // the `title` field is the canonical source for the test name.\n const cleanScript = stripTitleMetadata(script)\n\n const displayName = file.relativePath.replace(/^_supercheck_\\//, '')\n\n resources.push({\n id: testId,\n type: 'test',\n name: displayName,\n definition: {\n id: testId,\n title,\n testType: file.type === 'playwright' ? 'playwright' : 'k6',\n script: cleanScript,\n },\n })\n }\n }\n\n return resources\n}\n\n/** Maximum items per page when fetching paginated resources. */\nconst PAGE_LIMIT = 200\n\n/**\n * Fetch all pages of a paginated API endpoint.\n *\n * Iterates through every page so that reconciliation and destroy commands\n * see the complete set of remote resources, regardless of how many exist.\n */\nexport async function fetchAllPages<T = Record<string, unknown>>(\n client: ReturnType<typeof getApiClient>,\n endpoint: string,\n label: string,\n): Promise<T[]> {\n const items: T[] = []\n let page = 1\n let totalPages = 1\n\n do {\n const { data } = await client.get<PaginatedResponse<T>>(endpoint, {\n limit: String(PAGE_LIMIT),\n page: String(page),\n })\n items.push(...data.data)\n\n if (data.pagination) {\n totalPages = data.pagination.totalPages\n }\n\n page++\n } while (page <= totalPages)\n\n if (totalPages > 1) {\n logger.debug(`Fetched ${totalPages} pages of ${label} (${items.length} total)`)\n }\n\n return items\n}\n\n/**\n * Safely extract a string `id` from a raw resource record.\n * Returns `undefined` if the value is missing or not a usable identifier.\n */\nfunction safeId(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined\n const str = String(value)\n if (str === 'undefined' || str === 'null' || str === '') return undefined\n return str\n}\n\n/**\n * Normalize an alertConfig object by removing server defaults.\n * Mirrors the stripping logic in pull.ts buildMonitorDefinitions/buildJobDefinitions.\n */\nfunction normalizeAlertConfig(alert: Record<string, unknown>): Record<string, unknown> | undefined {\n const normalized = { ...alert }\n\n // Remove empty/default values\n if (normalized.customMessage === '' || normalized.customMessage === null) delete normalized.customMessage\n if (normalized.failureThreshold === 1) delete normalized.failureThreshold\n if (normalized.recoveryThreshold === 1) delete normalized.recoveryThreshold\n\n // Remove false boolean flags (they're defaults)\n for (const key of ['alertOnFailure', 'alertOnRecovery', 'alertOnSslExpiration', 'alertOnSuccess', 'alertOnTimeout']) {\n if (normalized[key] === false) delete normalized[key]\n }\n\n // Remove empty notificationProviders array\n if (Array.isArray(normalized.notificationProviders) && (normalized.notificationProviders as string[]).length === 0) {\n delete normalized.notificationProviders\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined\n}\n\n/**\n * Normalize monitor config by removing runtime-only and default fields.\n * Mirrors pull.ts buildMonitorDefinitions stripping logic.\n */\nfunction normalizeMonitorConfig(config: Record<string, unknown>): Record<string, unknown> | undefined {\n const normalized = { ...config }\n\n // Remove runtime-only fields\n delete normalized.sslLastCheckedAt\n delete normalized.aggregatedAlertState\n\n // Clean up default playwrightOptions\n if (normalized.playwrightOptions && typeof normalized.playwrightOptions === 'object') {\n const opts = { ...(normalized.playwrightOptions as Record<string, unknown>) }\n if (opts.retries === 0) delete opts.retries\n if (opts.timeout === 300000) delete opts.timeout\n if (opts.headless === true) delete opts.headless\n normalized.playwrightOptions = Object.keys(opts).length > 0 ? opts : undefined\n if (!normalized.playwrightOptions) delete normalized.playwrightOptions\n }\n\n // Clean up locationConfig\n if (normalized.locationConfig && typeof normalized.locationConfig === 'object') {\n const loc = { ...(normalized.locationConfig as Record<string, unknown>) }\n const hasLocations = Array.isArray(loc.locations) && (loc.locations as string[]).length > 0\n if (!loc.enabled || !hasLocations) {\n delete normalized.locationConfig\n } else {\n if (loc.enabled === true) delete loc.enabled\n if (loc.strategy === 'majority') delete loc.strategy\n if (loc.threshold === 50) delete loc.threshold\n normalized.locationConfig = Object.keys(loc).length > 0 ? loc : undefined\n if (!normalized.locationConfig) delete normalized.locationConfig\n }\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined\n}\n\n/**\n * Normalize remote resource raw data to match the shape that pull generates in config.\n * This ensures round-trip fidelity: pull → diff produces no phantom changes.\n */\nfunction normalizeRemoteRaw(type: string, raw: Record<string, unknown>): Record<string, unknown> {\n const normalized = { ...raw }\n\n // Remove metadata fields that are never written to config\n delete normalized.createdAt\n delete normalized.updatedAt\n delete normalized.projectId\n delete normalized.organizationId\n delete normalized.createdByUserId\n\n if (type === 'monitor') {\n if (normalized.config && typeof normalized.config === 'object') {\n normalized.config = normalizeMonitorConfig(normalized.config as Record<string, unknown>)\n if (!normalized.config) delete normalized.config\n }\n if (normalized.alertConfig && typeof normalized.alertConfig === 'object') {\n normalized.alertConfig = normalizeAlertConfig(normalized.alertConfig as Record<string, unknown>)\n if (!normalized.alertConfig) delete normalized.alertConfig\n }\n }\n\n if (type === 'test') {\n // Map API 'type' to 'testType' matching local resource structure\n // k6/performance tests map to 'k6'; all other types (browser, api, database, custom) map to 'playwright'\n if (normalized.type === 'performance') normalized.testType = 'k6'\n else normalized.testType = 'playwright'\n \n // Remove original 'type' field to avoid field mismatch in diff\n delete normalized.type\n\n // Strip @title metadata from script for clean comparison.\n // The @title is a local-only annotation injected during pull;\n // title is already tracked as a separate field.\n if (typeof normalized.script === 'string') {\n normalized.script = stripTitleMetadata(normalized.script)\n }\n }\n\n if (type === 'job') {\n // Normalize tests array to UUIDs for stable diff/deploy comparisons\n if (Array.isArray(normalized.tests)) {\n normalized.tests = (normalized.tests as Array<Record<string, unknown> | string>).map((t) => {\n if (typeof t === 'string') return extractUuidFromFilename(t) ?? t\n if (t && typeof t === 'object' && t.id) {\n return String(t.id)\n }\n return t\n })\n }\n\n if (normalized.alertConfig && typeof normalized.alertConfig === 'object') {\n normalized.alertConfig = normalizeAlertConfig(normalized.alertConfig as Record<string, unknown>)\n if (!normalized.alertConfig) delete normalized.alertConfig\n }\n\n // Remove runtime state\n delete normalized.status\n }\n\n if (type === 'variable') {\n // Normalize: pull writes value as empty string for secrets, normalise undefined → ''\n if (normalized.value === undefined || normalized.value === null) {\n normalized.value = ''\n }\n }\n\n if (type === 'statusPage') {\n // Normalize description field name: API may use pageDescription\n if (normalized.pageDescription !== undefined && normalized.description === undefined) {\n normalized.description = normalized.pageDescription\n }\n delete normalized.pageDescription\n // Normalize: empty/undefined description\n if (!normalized.description) delete normalized.description\n }\n\n return normalized\n}\n\n/**\n * Normalize job test references to UUIDs.\n * Accepts IDs, filenames, or paths and returns UUIDs when possible.\n */\nfunction normalizeJobTestsToIds(tests: string[] | undefined): string[] | undefined {\n if (!tests) return tests\n\n return tests.map((t) => {\n const id = extractUuidFromFilename(t)\n return id ?? t\n })\n}\n\n/**\n * Fetch remote resources from the Supercheck API.\n */\nexport async function fetchRemoteResources(client: ReturnType<typeof getApiClient>): Promise<RemoteResource[]> {\n const resources: RemoteResource[] = []\n\n try {\n const jobs = await fetchAllPages<Record<string, unknown>>(client, '/api/jobs', 'jobs')\n for (const job of jobs) {\n const id = safeId(job.id)\n if (!id) { logger.debug('Skipping job with missing id'); continue }\n resources.push({ id, type: 'job', name: String(job.name ?? ''), raw: normalizeRemoteRaw('job', job) })\n }\n } catch (err) { logFetchError('jobs', err) }\n\n try {\n const tests = await fetchAllPages<Record<string, unknown>>(client, '/api/tests?includeScript=true', 'tests')\n for (const test of tests) {\n const id = safeId(test.id)\n if (!id) { logger.debug('Skipping test with missing id'); continue }\n resources.push({ id, type: 'test', name: String(test.title ?? ''), raw: normalizeRemoteRaw('test', test) })\n }\n } catch (err) { logFetchError('tests', err) }\n\n try {\n const monitors = await fetchAllPages<Record<string, unknown>>(client, '/api/monitors', 'monitors')\n for (const monitor of monitors) {\n const id = safeId(monitor.id)\n if (!id) { logger.debug('Skipping monitor with missing id'); continue }\n resources.push({ id, type: 'monitor', name: String(monitor.name ?? ''), raw: normalizeRemoteRaw('monitor', monitor) })\n }\n } catch (err) { logFetchError('monitors', err) }\n\n try {\n const { data } = await client.get<Array<Record<string, unknown>>>('/api/variables')\n for (const v of data) {\n const id = safeId(v.id)\n if (!id) { logger.debug('Skipping variable with missing id'); continue }\n resources.push({ id, type: 'variable', name: String(v.key ?? ''), raw: normalizeRemoteRaw('variable', v) })\n }\n } catch (err) { logFetchError('variables', err) }\n\n try {\n const { data } = await client.get<Array<Record<string, unknown>>>('/api/tags')\n for (const t of data) {\n const id = safeId(t.id)\n if (!id) { logger.debug('Skipping tag with missing id'); continue }\n resources.push({ id, type: 'tag', name: String(t.name ?? ''), raw: normalizeRemoteRaw('tag', t) })\n }\n } catch (err) { logFetchError('tags', err) }\n\n try {\n const statusPages = await fetchAllPages<Record<string, unknown>>(client, '/api/status-pages', 'status-pages')\n for (const sp of statusPages) {\n const id = safeId(sp.id)\n if (!id) { logger.debug('Skipping status page with missing id'); continue }\n resources.push({ id, type: 'statusPage', name: String(sp.name ?? ''), raw: normalizeRemoteRaw('statusPage', sp) })\n }\n } catch (err) { logFetchError('status-pages', err) }\n\n return resources\n}\n\n/**\n * Log fetch errors with appropriate severity.\n * 404s are debug-level (resource type may not be enabled), other errors are warnings.\n */\nfunction logFetchError(resourceType: string, err: unknown): void {\n if (err instanceof ApiRequestError && err.statusCode === 404) {\n logger.debug(`Could not fetch ${resourceType} (not found)`)\n } else {\n const msg = err instanceof Error ? err.message : String(err)\n logger.warn(`Could not fetch ${resourceType}: ${msg}`)\n }\n}\n\n/**\n * Map resource type to the correct API endpoint.\n */\nexport function getApiEndpoint(type: string): string {\n switch (type) {\n case 'job': return '/api/jobs'\n case 'test': return '/api/tests'\n case 'monitor': return '/api/monitors'\n case 'variable': return '/api/variables'\n case 'tag': return '/api/tags'\n case 'statusPage': return '/api/status-pages'\n default: throw new Error(`Unknown resource type: ${type}`)\n }\n}\n\n/**\n * Safe token preview that handles short tokens gracefully.\n * Returns a masked version suitable for user-facing log output.\n */\nexport function safeTokenPreview(token: string): string {\n if (!token || token.length === 0) return '(empty)'\n if (token.length <= 4) return `${token.substring(0, 1)}***`\n if (token.length <= 8) {\n return `${token.substring(0, 4)}...`\n }\n if (token.length <= 20) {\n // Show only the prefix (e.g. sck_live_) + a few chars\n return `${token.substring(0, Math.min(token.length - 4, 12))}...`\n }\n return `${token.substring(0, 12)}...${token.substring(token.length - 4)}`\n}\n","import ora, { type Ora } from 'ora'\nimport { getOutputFormat } from '../output/formatter.js'\nimport { logger } from './logger.js'\n\n/**\n * Create a spinner for long-running operations.\n * Spinners are disabled in JSON/quiet mode for clean output.\n */\nexport function createSpinner(text: string): Ora {\n const format = getOutputFormat()\n const isInteractive = format === 'table'\n\n const spinner = ora({\n text,\n // Disable spinner in non-interactive modes\n isSilent: !isInteractive,\n // Use dots style for a clean look\n spinner: 'dots',\n })\n\n return spinner\n}\n\n/**\n * Run an async operation with a spinner.\n * Shows success/failure automatically.\n */\nexport async function withSpinner<T>(\n text: string,\n fn: () => Promise<T>,\n options?: {\n successText?: string | ((result: T) => string)\n failText?: string\n },\n): Promise<T> {\n const spinner = createSpinner(text)\n spinner.start()\n\n try {\n const result = await fn()\n const successMessage =\n typeof options?.successText === 'function'\n ? options.successText(result)\n : options?.successText ?? text.replace(/\\.\\.\\.?$/, '')\n\n spinner.succeed(successMessage)\n return result\n } catch (error) {\n const failMessage = options?.failText ?? text.replace(/\\.\\.\\.?$/, ' failed')\n spinner.fail(failMessage)\n throw error\n }\n}\n\n/**\n * Simple spinner for manual control.\n */\nexport function startSpinner(text: string): {\n succeed: (text?: string) => void\n fail: (text?: string) => void\n update: (text: string) => void\n stop: () => void\n} {\n const format = getOutputFormat()\n const isInteractive = format === 'table'\n\n if (!isInteractive) {\n // In non-interactive mode, just log and return no-ops\n logger.info(text)\n return {\n succeed: (msg) => msg && logger.success(msg),\n fail: (msg) => msg && logger.error(msg),\n update: () => {},\n stop: () => {},\n }\n }\n\n const spinner = ora({ text, spinner: 'dots' }).start()\n\n return {\n succeed: (msg) => spinner.succeed(msg),\n fail: (msg) => spinner.fail(msg),\n update: (msg) => {\n spinner.text = msg\n },\n stop: () => spinner.stop(),\n }\n}\n","import Table from 'cli-table3'\nimport pc from 'picocolors'\nimport { logger } from '../utils/logger.js'\n\nexport type OutputFormat = 'table' | 'json' | 'quiet'\n\nexport type OutputColumn = {\n key: string\n header: string\n width?: number\n format?: (value: unknown, row: Record<string, unknown>) => string\n}\n\nlet currentFormat: OutputFormat = 'table'\n\nexport function setOutputFormat(format: OutputFormat): void {\n currentFormat = format\n}\n\nexport function getOutputFormat(): OutputFormat {\n return currentFormat\n}\n\n/**\n * Format and output data based on the current output format.\n */\nexport function output<T extends Record<string, unknown>>(\n data: T | T[],\n options?: {\n columns?: OutputColumn[]\n },\n): void {\n switch (currentFormat) {\n case 'json':\n logger.output(JSON.stringify(data, null, 2))\n break\n\n case 'quiet':\n // In quiet mode, only output IDs or minimal info\n if (Array.isArray(data)) {\n for (const item of data) {\n if ('id' in item) logger.output(String(item.id))\n }\n } else if ('id' in data) {\n logger.output(String(data.id))\n }\n break\n\n case 'table':\n default:\n outputTable(data, options?.columns)\n break\n }\n}\n\nfunction outputTable<T extends Record<string, unknown>>(\n data: T | T[] | undefined | null,\n columns?: OutputColumn[],\n): void {\n // Handle undefined/null data\n if (data === undefined || data === null) {\n logger.info('No results found.')\n return\n }\n\n // Convert to array and filter out undefined/null items\n const rawItems = Array.isArray(data) ? data : [data]\n const items = rawItems.filter((item): item is T => item !== undefined && item !== null)\n\n if (items.length === 0) {\n logger.info('No results found.')\n return\n }\n\n // Use provided columns or infer from first item\n const cols: OutputColumn[] = columns ?? Object.keys(items[0]).map((key) => ({\n key,\n header: key.charAt(0).toUpperCase() + key.slice(1),\n }))\n\n const table = new Table({\n head: cols.map((c) => c.header),\n style: {\n head: ['cyan'],\n border: ['gray'],\n },\n })\n\n for (const item of items) {\n // Safely access each column value\n table.push(cols.map((c) => formatValue(item?.[c.key], c, item)))\n }\n\n logger.output(table.toString())\n}\n\n/**\n * Status values that should be colorized\n */\nconst STATUS_COLORS: Record<string, 'success' | 'error' | 'warning'> = {\n // Success states (green)\n up: 'success',\n ok: 'success',\n success: 'success',\n passed: 'success',\n active: 'success',\n sent: 'success',\n enabled: 'success',\n healthy: 'success',\n running: 'success',\n completed: 'success',\n\n // Error states (red)\n down: 'error',\n failed: 'error',\n error: 'error',\n blocked: 'error',\n unhealthy: 'error',\n cancelled: 'error',\n canceled: 'error',\n\n // Warning states (yellow)\n paused: 'warning',\n pending: 'warning',\n disabled: 'warning',\n degraded: 'warning',\n unknown: 'warning',\n queued: 'warning',\n warning: 'warning',\n skipped: 'warning',\n inactive: 'warning',\n}\n\n/**\n * Format a status value with color and indicator\n */\nfunction formatStatus(status: string): string {\n const normalizedStatus = status.toLowerCase()\n const colorType = STATUS_COLORS[normalizedStatus]\n\n if (!colorType) {\n return status\n }\n\n switch (colorType) {\n case 'success':\n return pc.green(`● ${status}`)\n case 'error':\n return pc.red(`● ${status}`)\n case 'warning':\n return pc.yellow(`● ${status}`)\n default:\n return status\n }\n}\n\nfunction formatValue(value: unknown, column?: OutputColumn, row?: Record<string, unknown>): string {\n if (column?.format && row) {\n return column.format(value, row)\n }\n\n if (value === null || value === undefined) return pc.dim('-')\n\n if (typeof value === 'boolean') {\n return value ? pc.green('✓') : pc.red('✗')\n }\n\n if (value instanceof Date) return formatDate(value)\n\n if (Array.isArray(value)) {\n // If the array contains objects, serialize them as JSON instead of producing [object Object]\n if (value.length > 0 && typeof value[0] === 'object' && value[0] !== null) {\n return JSON.stringify(value)\n }\n return value.join(', ')\n }\n\n if (typeof value === 'number') {\n const dateForNumber = maybeFormatDate(value, column?.key)\n if (dateForNumber) return dateForNumber\n return String(value)\n }\n\n if (typeof value === 'object') return JSON.stringify(value)\n\n const strValue = String(value)\n\n const dateForString = maybeFormatDate(strValue, column?.key)\n if (dateForString) return dateForString\n\n // Check if this looks like a status value\n if (STATUS_COLORS[strValue.toLowerCase()]) {\n return formatStatus(strValue)\n }\n\n return strValue\n}\n\nconst DATE_KEY_PATTERN = /(At|Date|Time|Timestamp)$/i\n\nfunction maybeFormatDate(value: string | number, key?: string): string | null {\n if (!key && typeof value !== 'string') return null\n\n if (key && !DATE_KEY_PATTERN.test(key) && typeof value !== 'string') return null\n\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) return null\n\n if (typeof value === 'string') {\n const isIsoLike = value.includes('T') || value.endsWith('Z') || /[+-]\\d{2}:?\\d{2}$/.test(value)\n if (!isIsoLike) return null\n return formatDate(date)\n }\n\n return formatDate(date)\n}\n\nfunction formatDate(date: Date): string {\n return date.toISOString().replace('T', ' ').replace('Z', '')\n}\n\n/**\n * Summarize an array of objects for detail view display.\n * Returns a compact string like \"3 items\" or a key preview for small arrays.\n */\nfunction summarizeArray(_key: string, items: unknown[]): string {\n if (items.length === 0) return pc.dim('(none)')\n\n // For simple arrays of primitives, join them\n if (typeof items[0] !== 'object' || items[0] === null) {\n return items.join(', ')\n }\n\n // For arrays of objects, show count + a summary of identifiable fields\n const previews: string[] = []\n for (const item of items.slice(0, 3)) {\n const obj = item as Record<string, unknown>\n // Try common identifier fields\n const name = obj.name ?? obj.title ?? obj.key ?? obj.id\n if (name) previews.push(String(name))\n }\n\n const countStr = `${items.length} ${items.length === 1 ? 'item' : 'items'}`\n if (previews.length === 0) return countStr\n const previewStr = previews.join(', ')\n return items.length > 3\n ? `${countStr} (${previewStr}, ...)`\n : `${countStr} (${previewStr})`\n}\n\n/**\n * Output a single key-value pair detail view.\n *\n * Nested objects are rendered as indented sub-sections.\n * Arrays of objects show a summary count with identifiers.\n */\nexport function outputDetail(data: Record<string, unknown>): void {\n if (currentFormat === 'json') {\n logger.output(JSON.stringify(data, null, 2))\n return\n }\n\n if (currentFormat === 'quiet') {\n if ('id' in data) logger.output(String(data.id))\n return\n }\n\n const keys = Object.keys(data)\n if (keys.length === 0) {\n logger.info('No details available.')\n return\n }\n\n // Separate scalar/simple fields from nested complex fields\n const scalarEntries: [string, unknown][] = []\n const nestedEntries: [string, Record<string, unknown>][] = []\n\n for (const [key, value] of Object.entries(data)) {\n if (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date)\n ) {\n nestedEntries.push([key, value as Record<string, unknown>])\n } else {\n scalarEntries.push([key, value])\n }\n }\n\n // Render scalar fields first\n if (scalarEntries.length > 0) {\n const maxKeyLen = Math.max(...scalarEntries.map(([k]) => k.length))\n for (const [key, value] of scalarEntries) {\n const label = key.padEnd(maxKeyLen + 2)\n let formatted: string\n if (Array.isArray(value)) {\n formatted = summarizeArray(key, value)\n } else {\n formatted = formatValue(value, { key, header: key }, data)\n }\n logger.output(` ${label}${formatted}`)\n }\n }\n\n // Render nested objects as indented sub-sections\n for (const [key, obj] of nestedEntries) {\n logger.output('')\n logger.output(` ${pc.bold(key)}:`)\n const subKeys = Object.keys(obj)\n if (subKeys.length === 0) {\n logger.output(` ${pc.dim('(empty)')}`)\n continue\n }\n const maxSubKeyLen = Math.max(...subKeys.map((k) => k.length))\n for (const [subKey, subVal] of Object.entries(obj)) {\n const subLabel = subKey.padEnd(maxSubKeyLen + 2)\n let formatted: string\n if (Array.isArray(subVal)) {\n formatted = summarizeArray(subKey, subVal)\n } else {\n formatted = formatValue(subVal, { key: subKey, header: subKey }, obj)\n }\n logger.output(` ${subLabel}${formatted}`)\n }\n }\n}\n","import { Command } from 'commander'\nimport { getApiClient } from '../api/client.js'\nimport { getStoredBaseUrl } from '../auth/store.js'\nimport { tryLoadConfig } from '../config/loader.js'\nimport { logger } from '../utils/logger.js'\nimport { output } from '../output/formatter.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { withSpinner } from '../utils/spinner.js'\n\nexport const healthCommand = new Command('health')\n .description('Check Supercheck API health')\n .option('--url <url>', 'Supercheck API URL')\n .action(async (options: { url?: string }) => {\n const configResult = await tryLoadConfig()\n const baseUrl = options.url\n ?? getStoredBaseUrl()\n ?? configResult?.config.api?.baseUrl\n ?? 'https://app.supercheck.io'\n\n const client = getApiClient({ baseUrl })\n\n try {\n const data = await withSpinner(\n `Checking API health at ${baseUrl}...`,\n async () => {\n const { data } = await client.get<{\n status: string\n timestamp?: string\n latencyMs?: number\n checks?: Record<string, { status: string; latencyMs?: number; error?: string }>\n }>('/api/health')\n return data\n },\n { successText: 'Health check complete' },\n )\n\n // Build a flat view for display\n const checks = data.checks ?? {}\n const displayData: Record<string, unknown> = {\n status: data.status,\n database: checks.database?.status ?? 'n/a',\n redis: checks.redis?.status ?? 'n/a',\n s3: checks.s3?.status ?? 'n/a',\n latencyMs: data.latencyMs,\n }\n\n output(displayData as Record<string, unknown>, {\n columns: [\n { key: 'status', header: 'Status' },\n { key: 'database', header: 'Database' },\n { key: 'redis', header: 'Redis' },\n { key: 's3', header: 'S3' },\n { key: 'latencyMs', header: 'Latency (ms)' },\n ],\n })\n\n if (data.status === 'ok') {\n logger.success(`API is healthy at ${baseUrl}`)\n } else {\n throw new CLIError(`API reports degraded status at ${baseUrl}`, ExitCode.ApiError)\n }\n } catch (err) {\n if (err instanceof CLIError) throw err\n logger.error(`Cannot reach API at ${baseUrl}`)\n if (err instanceof Error) {\n logger.debug(err.message)\n }\n throw new CLIError(`Cannot reach API at ${baseUrl}`, ExitCode.ApiError)\n }\n })\n\nexport const locationsCommand = new Command('locations')\n .description('List available execution locations')\n .action(async () => {\n const configResult = await tryLoadConfig()\n const baseUrl = getStoredBaseUrl()\n ?? configResult?.config.api?.baseUrl\n ?? 'https://app.supercheck.io'\n\n const client = getApiClient({ baseUrl })\n\n const locations = await withSpinner(\n 'Fetching execution locations...',\n async () => {\n const { data } = await client.get<\n | { locations: Array<{ id?: string; code?: string; name: string; region: string }> }\n | { success: boolean; data: Array<{ code: string; name: string; region: string }> }\n >('/api/locations')\n\n return 'locations' in data\n ? data.locations\n : (data.data ?? [])\n },\n { successText: 'Locations loaded' },\n )\n\n output(locations as unknown as Record<string, unknown>[], {\n columns: [\n { key: 'code', header: 'Code' },\n { key: 'name', header: 'Name' },\n { key: 'region', header: 'Region' },\n ],\n })\n })\n","import { createJiti } from 'jiti'\nimport { deepmerge } from 'deepmerge-ts'\nimport { existsSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { supercheckConfigSchema, type SupercheckConfig } from './schema.js'\nimport { CLIError, ConfigNotFoundError, ExitCode } from '../utils/errors.js'\n\nconst CONFIG_FILES = [\n 'supercheck.config.ts',\n 'supercheck.config.js',\n 'supercheck.config.mjs',\n]\n\nconst LOCAL_CONFIG_FILES = [\n 'supercheck.config.local.ts',\n 'supercheck.config.local.js',\n 'supercheck.config.local.mjs',\n]\n\n/**\n * Resolve the config file path. Search order:\n * 1. Explicit --config flag\n * 2. supercheck.config.{ts,js,mjs} in cwd\n */\nfunction resolveConfigPath(cwd: string, explicitPath?: string): string | null {\n if (explicitPath) {\n const abs = resolve(cwd, explicitPath)\n if (!existsSync(abs)) {\n throw new CLIError(\n `Config file not found: ${abs}`,\n ExitCode.ConfigError,\n )\n }\n return abs\n }\n\n for (const file of CONFIG_FILES) {\n const abs = resolve(cwd, file)\n if (existsSync(abs)) return abs\n }\n\n return null\n}\n\n/**\n * Resolve local override config file path.\n */\nfunction resolveLocalConfigPath(cwd: string): string | null {\n for (const file of LOCAL_CONFIG_FILES) {\n const abs = resolve(cwd, file)\n if (existsSync(abs)) return abs\n }\n return null\n}\n\n/**\n * Load a TS/JS config file using jiti (zero-config TS execution).\n */\nasync function loadConfigFile(filePath: string): Promise<unknown> {\n const jiti = createJiti(dirname(filePath), {\n interopDefault: true,\n })\n\n const mod = await jiti.import(filePath) as Record<string, unknown>\n return mod.default ?? mod\n}\n\n/**\n * Apply environment variable overrides to the config.\n */\nfunction applyEnvOverrides(config: SupercheckConfig): SupercheckConfig {\n const result = { ...config }\n\n if (process.env.SUPERCHECK_URL) {\n result.api = {\n ...result.api,\n baseUrl: process.env.SUPERCHECK_URL,\n }\n }\n\n if (process.env.SUPERCHECK_ORG) {\n result.project = {\n ...result.project,\n organization: process.env.SUPERCHECK_ORG,\n }\n }\n\n if (process.env.SUPERCHECK_PROJECT) {\n result.project = {\n ...result.project,\n project: process.env.SUPERCHECK_PROJECT,\n }\n }\n\n return result\n}\n\n/**\n * Detect secrets in config values that should never be stored in config files.\n * Checks for all token formats including legacy `job_` prefix trigger keys.\n */\nfunction validateNoSecrets(config: SupercheckConfig): void {\n const configStr = JSON.stringify(config)\n const secretPatterns = [\n /sck_live_[a-zA-Z0-9]+/,\n /sck_trigger_[a-zA-Z0-9]+/,\n /sck_test_[a-zA-Z0-9]+/,\n // Legacy trigger key format: job_ followed by 32+ hex chars\n /job_[a-fA-F0-9]{32,}/,\n ]\n\n for (const pattern of secretPatterns) {\n if (pattern.test(configStr)) {\n throw new CLIError(\n 'Config file contains what appears to be an API token. ' +\n 'Tokens must be stored in environment variables (SUPERCHECK_TOKEN) or the OS keychain, never in config files.',\n ExitCode.ConfigError,\n )\n }\n }\n}\n\nexport interface LoadConfigOptions {\n cwd?: string\n configPath?: string\n}\n\nexport interface LoadConfigResult {\n config: SupercheckConfig\n configPath: string | null\n}\n\n/**\n * Load, merge, validate, and return the Supercheck configuration.\n *\n * Priority (highest to lowest):\n * 1. Environment variables\n * 2. supercheck.config.local.{ts,js,mjs}\n * 3. supercheck.config.{ts,js,mjs}\n */\nexport async function loadConfig(options: LoadConfigOptions = {}): Promise<LoadConfigResult> {\n const cwd = options.cwd ?? process.cwd()\n\n // Load .env file if present (quiet: true suppresses injection logs)\n const { config: loadEnv } = await import('dotenv')\n loadEnv({ path: resolve(cwd, '.env'), quiet: true })\n\n const configPath = resolveConfigPath(cwd, options.configPath)\n if (!configPath) {\n throw new ConfigNotFoundError()\n }\n\n let config = await loadConfigFile(configPath) as SupercheckConfig\n\n const localConfigPath = resolveLocalConfigPath(cwd)\n if (localConfigPath) {\n const localConfig = await loadConfigFile(localConfigPath) as Partial<SupercheckConfig>\n config = deepmerge(config, localConfig) as SupercheckConfig\n }\n\n config = applyEnvOverrides(config)\n\n validateNoSecrets(config)\n\n const parsed = supercheckConfigSchema.safeParse(config)\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map((i) => ` - ${i.path.join('.')}: ${i.message}`)\n .join('\\n')\n throw new CLIError(\n `Invalid configuration:\\n${issues}`,\n ExitCode.ConfigError,\n )\n }\n\n return {\n config: parsed.data,\n configPath,\n }\n}\n\n/**\n * Try to load config, but return null if no config file exists.\n * Used by commands that don't strictly require a config (e.g., login, health).\n */\nexport async function tryLoadConfig(options: LoadConfigOptions = {}): Promise<LoadConfigResult | null> {\n try {\n return await loadConfig(options)\n } catch (err) {\n if (err instanceof ConfigNotFoundError) {\n return null\n }\n throw err\n }\n}\n","import { z } from 'zod'\n\n// --- Leaf schemas ---\n\nexport const tagDefinitionSchema = z.object({\n /** Database UUID. Present for existing resources, omitted for new ones. */\n id: z.string().uuid().optional(),\n name: z.string().min(1),\n color: z.string().optional(),\n})\n\nexport const variableDefinitionSchema = z.object({\n /** Database UUID. Present for existing resources, omitted for new ones. */\n id: z.string().uuid().optional(),\n key: z.string().min(1),\n value: z.string(),\n isSecret: z.boolean().default(false),\n description: z.string().optional(),\n})\n\nexport const notificationProviderDefinitionSchema = z.object({\n /** Database UUID. Present for existing resources, omitted for new ones. */\n id: z.string().uuid().optional(),\n name: z.string().min(1),\n type: z.enum(['email', 'slack', 'webhook', 'telegram', 'discord', 'teams']),\n config: z.record(z.unknown()),\n})\n\n// --- Alert Config ---\n\n/** Base alert configuration shared by monitors and jobs. */\nexport const alertConfigSchema = z.object({\n enabled: z.boolean().optional(),\n notificationProviders: z.array(z.string()).optional(),\n alertOnFailure: z.boolean().optional(),\n alertOnSuccess: z.boolean().optional(),\n alertOnTimeout: z.boolean().optional(),\n alertOnRecovery: z.boolean().optional(),\n alertOnSslExpiration: z.boolean().optional(),\n failureThreshold: z.number().int().positive().optional(),\n recoveryThreshold: z.number().int().positive().optional(),\n customMessage: z.string().optional(),\n}).passthrough()\n\n// --- Playwright & k6 ---\n\nexport const playwrightTestConfigSchema = z.object({\n testMatch: z.string().default('_supercheck_/playwright/**/*.pw.ts'),\n browser: z.enum(['chromium', 'firefox', 'webkit']).default('chromium'),\n})\n\nexport const k6TestConfigSchema = z.object({\n testMatch: z.string().default('_supercheck_/k6/**/*.k6.ts'),\n})\n\nexport const testsConfigSchema = z.object({\n playwright: playwrightTestConfigSchema.optional(),\n k6: k6TestConfigSchema.optional(),\n})\n\n// --- Monitors ---\n\nexport const monitorDefinitionSchema = z.object({\n /** Database UUID. Present for existing resources, omitted for new ones. */\n id: z.string().uuid().optional(),\n name: z.string().min(1),\n description: z.string().optional(),\n type: z.enum(['http_request', 'website', 'ping_host', 'port_check', 'synthetic_test']),\n target: z.string().optional(),\n frequencyMinutes: z.number().int().positive().optional(),\n enabled: z.boolean().optional(),\n config: z.record(z.unknown()).optional(),\n alertConfig: alertConfigSchema.optional(),\n tags: z.array(z.string()).optional(),\n})\n\n// --- Jobs ---\n\nexport const jobDefinitionSchema = z.object({\n /** Database UUID. Present for existing resources, omitted for new ones. */\n id: z.string().uuid().optional(),\n name: z.string().min(1),\n description: z.string().optional(),\n jobType: z.enum(['playwright', 'k6']).optional(),\n tests: z.array(z.string()).min(1),\n cronSchedule: z.string().optional(),\n status: z.string().optional(),\n alertConfig: alertConfigSchema.optional(),\n tags: z.array(z.string()).optional(),\n})\n\n// --- Status Pages ---\n\nexport const statusPageComponentDefinitionSchema = z.object({\n /** Database UUID. Present for existing resources, omitted for new ones. */\n id: z.string().uuid().optional(),\n name: z.string().min(1),\n description: z.string().optional(),\n monitors: z.array(z.string()).optional(),\n position: z.number().int().min(0).optional(),\n})\n\nexport const statusPageDefinitionSchema = z.object({\n /** Database UUID. Present for existing resources, omitted for new ones. */\n id: z.string().uuid().optional(),\n name: z.string().min(1),\n subdomain: z.string().optional(),\n status: z.enum(['draft', 'published', 'archived']).optional(),\n description: z.string().optional(),\n headline: z.string().optional(),\n supportUrl: z.string().optional(),\n components: z.array(statusPageComponentDefinitionSchema).optional(),\n branding: z.object({\n bodyBackgroundColor: z.string().optional(),\n fontColor: z.string().optional(),\n greens: z.string().optional(),\n reds: z.string().optional(),\n }).optional(),\n notifications: z.object({\n allowEmailSubscribers: z.boolean().default(true),\n allowWebhookSubscribers: z.boolean().default(false),\n allowRssFeed: z.boolean().default(true),\n }).optional(),\n})\n\n// --- Project, API, Defaults ---\n\nexport const projectConfigSchema = z.object({\n organization: z.string().min(1),\n project: z.string().min(1),\n})\n\nexport const apiConfigSchema = z.object({\n baseUrl: z.string().url().default('https://app.supercheck.io'),\n})\n\nexport const defaultsConfigSchema = z.object({\n runLocation: z.string().optional(),\n timeout: z.number().int().positive().optional(),\n})\n\n// --- Root config ---\n\nexport const supercheckConfigSchema = z.object({\n schemaVersion: z.literal('1.0'),\n project: projectConfigSchema,\n api: apiConfigSchema.optional(),\n defaults: defaultsConfigSchema.optional(),\n tests: testsConfigSchema.optional(),\n monitors: z.union([\n z.string(),\n z.array(monitorDefinitionSchema),\n ]).optional(),\n statusPages: z.union([\n z.string(),\n z.array(statusPageDefinitionSchema),\n ]).optional(),\n jobs: z.array(jobDefinitionSchema).optional(),\n notificationProviders: z.array(notificationProviderDefinitionSchema).optional(),\n variables: z.array(variableDefinitionSchema).optional(),\n tags: z.array(tagDefinitionSchema).optional(),\n})\n\n// --- Inferred types ---\n\nexport type AlertConfig = z.infer<typeof alertConfigSchema>\nexport type SupercheckConfig = z.infer<typeof supercheckConfigSchema>\nexport type SupercheckUserConfig = z.input<typeof supercheckConfigSchema>\nexport type ProjectConfig = z.infer<typeof projectConfigSchema>\nexport type ApiConfig = z.infer<typeof apiConfigSchema>\nexport type DefaultsConfig = z.infer<typeof defaultsConfigSchema>\nexport type TestsConfig = z.infer<typeof testsConfigSchema>\nexport type PlaywrightTestConfig = z.infer<typeof playwrightTestConfigSchema>\nexport type K6TestConfig = z.infer<typeof k6TestConfigSchema>\nexport type MonitorDefinition = z.infer<typeof monitorDefinitionSchema>\nexport type JobDefinition = z.infer<typeof jobDefinitionSchema>\nexport type StatusPageDefinition = z.infer<typeof statusPageDefinitionSchema>\nexport type StatusPageComponentDefinition = z.infer<typeof statusPageComponentDefinitionSchema>\nexport type NotificationProviderDefinition = z.infer<typeof notificationProviderDefinitionSchema>\nexport type VariableDefinition = z.infer<typeof variableDefinitionSchema>\nexport type TagDefinition = z.infer<typeof tagDefinitionSchema>\n","import { Command } from 'commander'\nimport { loadConfig } from '../config/loader.js'\nimport { logger } from '../utils/logger.js'\nimport { output } from '../output/formatter.js'\n\nexport const configCommand = new Command('config')\n .description('Configuration management')\n\nconfigCommand\n .command('validate')\n .description('Validate supercheck.config.ts')\n .option('--config <path>', 'Path to config file')\n .action(async (options: { config?: string }) => {\n const { config, configPath } = await loadConfig({ configPath: options.config })\n logger.success(`Valid configuration loaded from ${configPath}`)\n logger.info(` Organization: ${config.project.organization}`)\n logger.info(` Project: ${config.project.project}`)\n })\n\nconfigCommand\n .command('print')\n .description('Print the resolved configuration')\n .option('--config <path>', 'Path to config file')\n .action(async (options: { config?: string }) => {\n const { config } = await loadConfig({ configPath: options.config })\n output(config as unknown as Record<string, unknown>)\n })\n","import { Command } from 'commander'\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, appendFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { logger } from '../utils/logger.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { detectPackageManager, ensurePackageJson, installDependencies } from '../utils/package-manager.js'\nimport { installPlaywrightBrowsers, isK6Installed, getK6InstallHint } from '../utils/deps.js'\nimport { uuidv7 } from '../utils/uuid.js'\nimport { slugify } from '../utils/slug.js'\n\nconst CONFIG_TEMPLATE = `import { defineConfig } from '@supercheck/cli'\n\nexport default defineConfig({\n schemaVersion: '1.0',\n project: {\n organization: 'my-org',\n project: 'my-project',\n },\n api: {\n baseUrl: process.env.SUPERCHECK_URL ?? 'https://app.supercheck.io',\n },\n tests: {\n playwright: {\n testMatch: '_supercheck_/playwright/**/*.pw.ts',\n browser: 'chromium',\n },\n k6: {\n testMatch: '_supercheck_/k6/**/*.k6.ts',\n },\n },\n})\n`\n\nconst EXAMPLE_PW_TEST = `// @title Homepage Check\n\nimport { test, expect } from '@playwright/test'\n\ntest('homepage loads successfully', async ({ page }) => {\n await page.goto('https://example.com')\n await expect(page).toHaveTitle(/Example/)\n})\n`\n\nconst EXAMPLE_K6_TEST = `// @title Load Test\n\nimport http from 'k6/http'\nimport { check, sleep } from 'k6'\n\nexport const options = {\n vus: 10,\n duration: '30s',\n}\n\nexport default function () {\n const res = http.get('https://example.com')\n check(res, {\n 'status is 200': (r) => r.status === 200,\n 'response time < 500ms': (r) => r.timings.duration < 500,\n })\n sleep(1)\n}\n`\n\nconst SUPERCHECK_TSCONFIG = `{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"esModuleInterop\": true,\n \"strict\": true,\n \"skipLibCheck\": true,\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"noEmit\": true,\n \"types\": [\"node\", \"k6\"]\n },\n \"include\": [\n \"supercheck.config.ts\",\n \"supercheck.config.local.ts\",\n \"_supercheck_/**/*.ts\"\n ]\n}\n`\n\nconst GITIGNORE_ADDITIONS = `\n# Supercheck CLI\nsupercheck.config.local.ts\nsupercheck.config.local.js\nsupercheck.config.local.mjs\n`\n\nexport const initCommand = new Command('init')\n .description('Initialize a new Supercheck project with config and example tests')\n .option('--force', 'Overwrite existing config file')\n .option('--skip-install', 'Skip automatic dependency installation')\n .option('--skip-examples', 'Skip creating example test files')\n .option('--pm <manager>', 'Package manager to use (npm, yarn, pnpm, bun)')\n .action(async (options: { force?: boolean; skipInstall?: boolean; skipExamples?: boolean; pm?: string }) => {\n const cwd = process.cwd()\n\n const configPath = resolve(cwd, 'supercheck.config.ts')\n if (existsSync(configPath) && !options.force) {\n throw new CLIError(\n 'supercheck.config.ts already exists. Use --force to overwrite.',\n ExitCode.ConfigError,\n )\n }\n\n logger.newline()\n logger.header('Initializing Supercheck project...')\n logger.newline()\n\n // 1. Write supercheck.config.ts\n writeFileSync(configPath, CONFIG_TEMPLATE, 'utf-8')\n logger.success('Created supercheck.config.ts')\n\n // 2. Write tsconfig.supercheck.json for IDE IntelliSense\n const tsconfigPath = resolve(cwd, 'tsconfig.supercheck.json')\n if (!existsSync(tsconfigPath) || options.force) {\n writeFileSync(tsconfigPath, SUPERCHECK_TSCONFIG, 'utf-8')\n logger.success('Created tsconfig.supercheck.json (IDE IntelliSense)')\n }\n\n // 3. Create _supercheck_/ directory structure\n const supercheckDir = resolve(cwd, '_supercheck_')\n const playwrightDir = resolve(supercheckDir, 'playwright')\n const k6Dir = resolve(supercheckDir, 'k6')\n for (const dir of [supercheckDir, playwrightDir, k6Dir]) {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n }\n logger.success('Created _supercheck_/ directory structure')\n\n // 4. Create example test files (unless --skip-examples)\n // Uses UUID v7 filenames to match the server's ID format, preventing\n // duplicate tests on deploy → pull round-trips.\n if (!options.skipExamples) {\n const pwTitle = 'Homepage Check'\n const pwId = uuidv7()\n const pwSlug = slugify(pwTitle)\n const pwFilename = `${pwSlug}.${pwId}.pw.ts`\n const pwTestPath = resolve(cwd, `_supercheck_/playwright/${pwFilename}`)\n if (!existsSync(pwTestPath)) {\n writeFileSync(pwTestPath, EXAMPLE_PW_TEST, 'utf-8')\n logger.success(`Created _supercheck_/playwright/${pwFilename} (Playwright example)`)\n }\n\n const k6Title = 'Load Test'\n const k6Id = uuidv7()\n const k6Slug = slugify(k6Title)\n const k6Filename = `${k6Slug}.${k6Id}.k6.ts`\n const k6TestPath = resolve(cwd, `_supercheck_/k6/${k6Filename}`)\n if (!existsSync(k6TestPath)) {\n writeFileSync(k6TestPath, EXAMPLE_K6_TEST, 'utf-8')\n logger.success(`Created _supercheck_/k6/${k6Filename} (k6 example)`)\n }\n }\n\n // 5. Update .gitignore\n const gitignorePath = resolve(cwd, '.gitignore')\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, 'utf-8')\n if (!content.includes('supercheck.config.local')) {\n appendFileSync(gitignorePath, GITIGNORE_ADDITIONS, 'utf-8')\n logger.success('Updated .gitignore with Supercheck entries')\n }\n }\n\n // 6. Detect package manager\n const pm = (options.pm as 'npm' | 'yarn' | 'pnpm' | 'bun') ?? detectPackageManager(cwd)\n logger.debug(`Detected package manager: ${pm}`)\n\n // 7. Ensure package.json exists\n const createdPkg = ensurePackageJson(cwd)\n if (createdPkg) {\n logger.success('Created package.json')\n }\n\n // 8. Install dependencies\n await installDependencies(cwd, pm, {\n packages: options.skipExamples ? ['@supercheck/cli', 'typescript', '@types/node', '@types/k6'] : ['@supercheck/cli', 'typescript', '@types/node', '@playwright/test', '@types/k6'],\n skipInstall: options.skipInstall ?? false,\n })\n\n // 9. Install Playwright browsers (chromium) — needed for local test execution\n if (!options.skipInstall && !options.skipExamples) {\n logger.newline()\n const browserInstalled = await installPlaywrightBrowsers(cwd, 'chromium')\n if (browserInstalled) {\n logger.success('Playwright chromium browser installed')\n } else {\n logger.warn('Could not install Playwright browsers automatically.')\n logger.info(' Run manually: npx playwright install chromium')\n }\n }\n\n // 10. Check for k6 (optional, for performance tests)\n const k6Status = isK6Installed()\n\n logger.newline()\n logger.header('Supercheck project initialized!')\n logger.newline()\n\n if (!k6Status.installed) {\n logger.warn('k6 is not installed (needed for performance/load tests)')\n logger.info(` Install: ${getK6InstallHint()}`)\n logger.info(' Docs: https://grafana.com/docs/k6/latest/set-up/install-k6/')\n logger.newline()\n }\n\n logger.info('Next steps:')\n logger.info(' 1. Edit supercheck.config.ts with your org/project details')\n logger.info(' 2. Run `supercheck login --token <your-token>` to authenticate')\n logger.info(' 3. Write tests in _supercheck_/playwright and _supercheck_/k6')\n logger.info(' 4. Run `supercheck diff` to preview changes against the cloud')\n logger.info(' 5. Run `supercheck deploy` to push to Supercheck')\n logger.info(' 6. Run `supercheck pull` to sync cloud resources locally')\n logger.newline()\n logger.info('Useful commands:')\n logger.info(' supercheck pull Pull tests & config from the cloud')\n logger.info(' supercheck diff Preview local vs remote differences')\n logger.info(' supercheck deploy Push local config to Supercheck')\n logger.info(' supercheck whoami Check authentication status')\n logger.newline()\n })\n","import { existsSync, writeFileSync } from 'node:fs'\nimport { resolve, basename } from 'node:path'\nimport { logger } from './logger.js'\nimport { CLIError, ExitCode } from './errors.js'\nimport { withSpinner } from './spinner.js'\n\n/**\n * Detect the package manager used in the project.\n * Checks for lock files in order of priority.\n */\nexport function detectPackageManager(cwd: string): 'npm' | 'yarn' | 'pnpm' | 'bun' {\n if (existsSync(resolve(cwd, 'bun.lockb')) || existsSync(resolve(cwd, 'bun.lock'))) return 'bun'\n if (existsSync(resolve(cwd, 'pnpm-lock.yaml'))) return 'pnpm'\n if (existsSync(resolve(cwd, 'yarn.lock'))) return 'yarn'\n return 'npm'\n}\n\n/**\n * Get the install command for dev dependencies based on the detected package manager.\n */\nfunction getInstallCommand(pm: 'npm' | 'yarn' | 'pnpm' | 'bun', packages: string[]): string {\n const pkgs = packages.join(' ')\n switch (pm) {\n case 'bun': return `bun add -d ${pkgs}`\n case 'pnpm': return `pnpm add -D ${pkgs}`\n case 'yarn': return `yarn add -D ${pkgs}`\n case 'npm': return `npm install --save-dev ${pkgs}`\n }\n}\n\n/**\n * Ensure a package.json exists. If not, create a minimal one.\n * Returns true if a new file was created, false if it already existed.\n */\nexport function ensurePackageJson(cwd: string): boolean {\n const pkgPath = resolve(cwd, 'package.json')\n if (existsSync(pkgPath)) return false\n\n const projectName = basename(cwd).toLowerCase().replace(/[^a-z0-9-]/g, '-')\n\n const minimalPkg = {\n name: projectName,\n private: true,\n type: 'module',\n scripts: {\n 'supercheck:deploy': 'supercheck deploy',\n 'supercheck:diff': 'supercheck diff',\n 'supercheck:pull': 'supercheck pull',\n 'supercheck:test': 'supercheck test',\n },\n }\n\n writeFileSync(pkgPath, JSON.stringify(minimalPkg, null, 2) + '\\n', 'utf-8')\n return true\n}\n\n/**\n * Install dev dependencies required for Supercheck tests.\n */\nexport async function installDependencies(\n cwd: string,\n pm: 'npm' | 'yarn' | 'pnpm' | 'bun',\n opts: { \n packages?: string[], \n skipInstall?: boolean \n } = {}\n): Promise<void> {\n if (opts.skipInstall) {\n logger.info('Skipping dependency installation')\n return\n }\n\n const devDeps = opts.packages ?? ['@supercheck/cli', 'typescript', '@types/node']\n const cmd = getInstallCommand(pm, devDeps)\n\n logger.info(`Installing dependencies with ${pm}...`)\n logger.debug(`Running: ${cmd}`)\n\n await withSpinner(\n `Installing ${devDeps.length} packages...`,\n async () => {\n const { execSync } = await import('node:child_process')\n try {\n execSync(cmd, {\n cwd,\n stdio: 'pipe',\n timeout: 120_000, // 2 minute timeout\n env: { ...process.env, NODE_ENV: 'development' },\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n throw new CLIError(\n `Failed to install dependencies. Run manually:\\n ${cmd}\\n\\nError: ${message}`,\n ExitCode.GeneralError,\n )\n }\n },\n { successText: 'Dependencies installed' },\n )\n}\n\n/**\n * Check if k6 is installed and available in the PATH.\n */\nexport async function checkK6Binary(): Promise<boolean> {\n const { execSync } = await import('node:child_process')\n try {\n execSync('k6 version', { stdio: 'ignore' })\n return true\n } catch {\n return false\n }\n}\n","import { execSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport pc from 'picocolors'\nimport { logger } from './logger.js'\n\nexport interface DependencyStatus {\n name: string\n installed: boolean\n version?: string\n detail?: string\n required: boolean\n installHint: string\n}\n\n/**\n * Check if a command is available on PATH.\n */\nexport function isCommandAvailable(command: string): { available: boolean; version?: string } {\n try {\n const output = execSync(`${command} --version`, {\n stdio: 'pipe',\n timeout: 10_000,\n env: { ...process.env },\n }).toString().trim()\n\n // Extract first line only\n const version = output.split('\\n')[0].trim()\n return { available: true, version }\n } catch {\n return { available: false }\n }\n}\n\n/**\n * Check if Playwright browsers are installed by checking for the\n * browser registry (npx playwright install --dry-run is not available).\n */\nexport function arePlaywrightBrowsersInstalled(cwd: string): boolean {\n try {\n execSync('npx playwright install --dry-run 2>&1 || true', {\n cwd,\n stdio: 'pipe',\n timeout: 15_000,\n env: { ...process.env },\n })\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Check if @playwright/test is installed as a dependency in the project.\n */\nexport function isPlaywrightPackageInstalled(cwd: string): boolean {\n try {\n const pkgPath = resolve(cwd, 'node_modules', '@playwright', 'test', 'package.json')\n return existsSync(pkgPath)\n } catch {\n return false\n }\n}\n\n/**\n * Check if k6 binary is available on PATH.\n */\nexport function isK6Installed(): { installed: boolean; version?: string } {\n const result = isCommandAvailable('k6')\n return { installed: result.available, version: result.version }\n}\n\n/**\n * Check if Node.js is available (should always be true if running).\n */\nexport function isNodeInstalled(): { installed: boolean; version?: string } {\n return { installed: true, version: process.version }\n}\n\n/**\n * Install Playwright browsers (chromium by default).\n * Returns true if installation was successful.\n *\n * SECURITY: Browser parameter is validated against allowlist to prevent command injection.\n */\nexport async function installPlaywrightBrowsers(cwd: string, browser = 'chromium'): Promise<boolean> {\n try {\n // SECURITY FIX: Validate browser parameter against allowlist\n const allowedBrowsers = ['chromium', 'firefox', 'webkit', 'chrome', 'msedge']\n if (!allowedBrowsers.includes(browser)) {\n logger.error(`Invalid browser: ${browser}. Allowed: ${allowedBrowsers.join(', ')}`)\n return false\n }\n\n logger.info(`Installing Playwright ${browser} browser...`)\n // SECURITY: Safe to use browser parameter - validated above\n execSync(`npx playwright install ${browser}`, {\n cwd,\n stdio: 'inherit',\n timeout: 300_000, // 5 min timeout for browser download\n env: { ...process.env },\n })\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Run all dependency checks and return a summary.\n */\nexport function checkAllDependencies(cwd: string): DependencyStatus[] {\n const deps: DependencyStatus[] = []\n\n // Node.js\n const node = isNodeInstalled()\n deps.push({\n name: 'Node.js',\n installed: node.installed,\n version: node.version,\n required: true,\n installHint: 'https://nodejs.org/',\n })\n\n // @playwright/test npm package\n const pwPkg = isPlaywrightPackageInstalled(cwd)\n deps.push({\n name: '@playwright/test',\n installed: pwPkg,\n detail: pwPkg ? 'npm package found' : 'npm package not found',\n required: true,\n installHint: 'npm install --save-dev @playwright/test',\n })\n\n // Playwright browsers (chromium)\n if (pwPkg) {\n // Only meaningful to check if package is installed\n const pwCheck = isCommandAvailable('npx playwright --version')\n deps.push({\n name: 'Playwright browsers',\n installed: pwCheck.available,\n version: pwCheck.version,\n detail: pwCheck.available ? 'browsers available' : 'run: npx playwright install chromium',\n required: true,\n installHint: 'npx playwright install chromium',\n })\n } else {\n deps.push({\n name: 'Playwright browsers',\n installed: false,\n detail: 'install @playwright/test first',\n required: true,\n installHint: 'npm install --save-dev @playwright/test && npx playwright install chromium',\n })\n }\n\n // k6 binary\n const k6 = isK6Installed()\n deps.push({\n name: 'k6',\n installed: k6.installed,\n version: k6.version,\n detail: k6.installed ? undefined : 'needed for performance tests',\n required: false,\n installHint: getK6InstallHint(),\n })\n\n return deps\n}\n\n/**\n * Get platform-specific k6 installation instructions.\n */\nexport function getK6InstallHint(): string {\n const platform = process.platform\n switch (platform) {\n case 'darwin':\n return 'brew install k6'\n case 'linux':\n return 'sudo snap install k6 or see https://grafana.com/docs/k6/latest/set-up/install-k6/'\n case 'win32':\n return 'choco install k6 or winget install k6'\n default:\n return 'https://grafana.com/docs/k6/latest/set-up/install-k6/'\n }\n}\n\n/**\n * Format dependency check results for display.\n */\nexport function formatDependencyReport(deps: DependencyStatus[]): string {\n const lines: string[] = []\n let allGood = true\n\n for (const dep of deps) {\n const icon = dep.installed ? pc.green('✓') : dep.required ? pc.red('✗') : pc.yellow('○')\n const name = dep.installed ? dep.name : pc.dim(dep.name)\n const version = dep.version ? pc.dim(` (${dep.version})`) : ''\n const detail = dep.detail && !dep.installed ? pc.dim(` — ${dep.detail}`) : ''\n\n lines.push(` ${icon} ${name}${version}${detail}`)\n\n if (!dep.installed && dep.required) {\n allGood = false\n lines.push(` ${pc.dim('Install:')} ${dep.installHint}`)\n } else if (!dep.installed && !dep.required) {\n lines.push(` ${pc.dim('Install (optional):')} ${dep.installHint}`)\n }\n }\n\n if (allGood) {\n lines.push('')\n lines.push(pc.green(' All required dependencies are installed!'))\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Check if required dependencies for a specific test type are available.\n * Throws CLIError with helpful message if missing.\n */\nexport function ensureDependenciesForTestType(\n cwd: string,\n testType: 'playwright' | 'k6',\n): void {\n if (testType === 'playwright') {\n if (!isPlaywrightPackageInstalled(cwd)) {\n throw new DependencyError(\n 'playwright',\n '@playwright/test is not installed.\\n' +\n ' Install it with: npm install --save-dev @playwright/test\\n' +\n ' Then install browsers: npx playwright install chromium',\n )\n }\n }\n\n if (testType === 'k6') {\n const k6 = isK6Installed()\n if (!k6.installed) {\n throw new DependencyError(\n 'k6',\n `k6 is not installed.\\n` +\n ` Install it with: ${getK6InstallHint()}\\n` +\n ` Documentation: https://grafana.com/docs/k6/latest/set-up/install-k6/`,\n )\n }\n }\n}\n\n/**\n * Error thrown when a required dependency is missing.\n */\nexport class DependencyError extends Error {\n public readonly dependency: string\n\n constructor(dependency: string, message: string) {\n super(message)\n this.name = 'DependencyError'\n this.dependency = dependency\n }\n}\n","import { randomBytes } from 'node:crypto'\n\n/**\n * Generate a UUID v7 (RFC 9562) — time-ordered, globally unique identifier.\n *\n * UUID v7 layout (128 bits):\n * - 48 bits: Unix timestamp in milliseconds\n * - 4 bits: version (0111 = 7)\n * - 12 bits: random (rand_a)\n * - 2 bits: variant (10)\n * - 62 bits: random (rand_b)\n *\n * This matches the UUID v7 format used by the Supercheck app (Drizzle ORM),\n * ensuring consistent ID formats between CLI-created and server-created resources.\n */\nexport function uuidv7(): string {\n const now = Date.now()\n\n // 6 bytes for 48-bit timestamp\n const timestampBytes = new Uint8Array(6)\n let ts = now\n for (let i = 5; i >= 0; i--) {\n timestampBytes[i] = ts & 0xff\n ts = Math.floor(ts / 256)\n }\n\n // 10 bytes of random data for rand_a (12 bits) + variant (2 bits) + rand_b (62 bits)\n const randBytes = randomBytes(10)\n\n // Build 16-byte UUID\n const bytes = new Uint8Array(16)\n\n // Bytes 0-5: timestamp\n bytes.set(timestampBytes, 0)\n\n // Byte 6: version (0111) + rand_a high 4 bits\n bytes[6] = (0x70) | (randBytes[0] & 0x0f)\n\n // Byte 7: rand_a low 8 bits\n bytes[7] = randBytes[1]\n\n // Byte 8: variant (10) + rand_b high 6 bits\n bytes[8] = (0x80) | (randBytes[2] & 0x3f)\n\n // Bytes 9-15: rand_b remaining 56 bits\n bytes[9] = randBytes[3]\n bytes[10] = randBytes[4]\n bytes[11] = randBytes[5]\n bytes[12] = randBytes[6]\n bytes[13] = randBytes[7]\n bytes[14] = randBytes[8]\n bytes[15] = randBytes[9]\n\n // Format as hex string: 8-4-4-4-12\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20, 32),\n ].join('-')\n}\n","import { Command } from 'commander'\nimport { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { ApiClient } from '../api/client.js'\nimport { loadConfig } from '../config/loader.js'\nimport { discoverFiles } from '../utils/discovery.js'\nimport { logger } from '../utils/logger.js'\nimport { output, outputDetail } from '../output/formatter.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { parseIntStrict } from '../utils/number.js'\nimport type { PaginatedResponse } from '../api/client.js'\nimport { getStoredBaseUrl, requireTriggerKey } from '../auth/store.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { extractUuidFromFilename } from '../utils/slug.js'\nimport { normalizeTestTypeForApi, validateScripts, validateScriptTypeMatch } from '../utils/validation.js'\nimport { runCommand } from '../utils/exec.js'\nimport { createTempPlaywrightConfig } from '../utils/playwright.js'\nimport { ensureDependenciesForTestType, DependencyError } from '../utils/deps.js'\n\nexport const jobCommand = new Command('job')\n .description('Manage jobs')\n\ntype LocalJobTest = {\n path: string\n type: 'playwright' | 'k6'\n name: string\n script: string\n}\n\nfunction inferLocalTestType(filePath: string): 'playwright' | 'k6' {\n return filePath.endsWith('.k6.ts') || filePath.endsWith('.k6.js') ? 'k6' : 'playwright'\n}\n\nfunction toDisplayName(cwd: string, filePath: string): string {\n const normalized = filePath.replace(cwd, '').replace(/^\\//, '')\n return normalized.startsWith('_supercheck_/') ? normalized.replace(/^_supercheck_\\//, '') : normalized\n}\n\nfunction resolveJobLocalTests(\n cwd: string,\n tests: string[],\n patterns: { playwright?: string; k6?: string },\n): LocalJobTest[] {\n const files = discoverFiles(cwd, patterns)\n const uuidMap = new Map<string, string>()\n for (const file of files) {\n const uuid = extractUuidFromFilename(file.absolutePath)\n if (uuid) uuidMap.set(uuid, file.absolutePath)\n }\n\n return tests.map((ref) => {\n let resolved: string | undefined\n\n if (ref.endsWith('.pw.ts') || ref.endsWith('.k6.ts') || ref.endsWith('.pw.js') || ref.endsWith('.k6.js')) {\n resolved = resolve(cwd, ref)\n } else if (ref.startsWith('_supercheck_/')) {\n resolved = resolve(cwd, ref)\n } else if (uuidMap.has(ref)) {\n resolved = uuidMap.get(ref)\n }\n\n if (!resolved) {\n throw new CLIError(`Cannot resolve local test for job entry: ${ref}`, ExitCode.ConfigError)\n }\n\n const script = readFileSync(resolved, 'utf-8')\n const type = inferLocalTestType(resolved)\n return { path: resolved, type, name: toDisplayName(cwd, resolved), script }\n })\n}\n\nasync function validateJobTests(\n client: ReturnType<typeof createAuthenticatedClient>,\n tests: LocalJobTest[],\n): Promise<void> {\n // Fast client-side script-type mismatch detection\n for (const test of tests) {\n const declaredType = normalizeTestTypeForApi(test.type)\n const mismatch = validateScriptTypeMatch(test.script, declaredType)\n if (mismatch) {\n throw new CLIError(`${test.name}: ${mismatch}`, ExitCode.ConfigError)\n }\n }\n\n const inputs = tests.map((test) => ({\n name: test.name,\n script: test.script,\n testType: normalizeTestTypeForApi(test.type),\n }))\n\n const results = await validateScripts(client, inputs)\n const failures = results.filter((r) => !r.valid)\n if (failures.length > 0) {\n const details = failures.map((f) => ` - ${f.name}: ${f.error ?? 'Validation failed'}`).join('\\n')\n throw new CLIError(`Validation failed:\\n${details}`, ExitCode.ConfigError)\n }\n}\n\nasync function runLocalJobTests(\n tests: LocalJobTest[],\n cwd: string,\n testMatch?: string,\n): Promise<void> {\n const playwrightTests = tests.filter((t) => t.type === 'playwright').map((t) => t.path)\n const k6Tests = tests.filter((t) => t.type === 'k6').map((t) => t.path)\n\n // Pre-flight dependency checks\n try {\n if (playwrightTests.length > 0) {\n ensureDependenciesForTestType(cwd, 'playwright')\n }\n if (k6Tests.length > 0) {\n ensureDependenciesForTestType(cwd, 'k6')\n }\n } catch (err) {\n if (err instanceof DependencyError) {\n throw new CLIError(err.message, ExitCode.GeneralError)\n }\n throw err\n }\n\n if (playwrightTests.length > 0) {\n logger.header('Running Playwright tests')\n const tempConfig = createTempPlaywrightConfig(cwd, testMatch)\n try {\n const code = await runCommand('npx', ['playwright', 'test', '--config', tempConfig.path, ...playwrightTests], cwd)\n if (code !== 0) {\n throw new CLIError(`Playwright tests failed with exit code ${code}`, ExitCode.GeneralError)\n }\n } finally {\n tempConfig.cleanup()\n }\n }\n\n for (const path of k6Tests) {\n logger.header(`Running k6 test: ${toDisplayName(cwd, path)}`)\n const code = await runCommand('k6', ['run', path], cwd)\n if (code !== 0) {\n throw new CLIError(`k6 test failed with exit code ${code}`, ExitCode.GeneralError)\n }\n }\n}\n\njobCommand\n .command('list')\n .description('List all jobs')\n .option('--page <page>', 'Page number', '1')\n .option('--limit <limit>', 'Items per page', '50')\n .action(async (options: { page: string; limit: string }) => {\n const client = createAuthenticatedClient()\n\n const { data } = await withSpinner(\n 'Fetching jobs',\n () => client.get<PaginatedResponse<Record<string, unknown>>>(\n '/api/jobs',\n { page: options.page, limit: options.limit },\n ),\n )\n\n output(data.data, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'name', header: 'Name' },\n { key: 'status', header: 'Status' },\n { key: 'cronSchedule', header: 'Schedule' },\n { key: 'createdAt', header: 'Created' },\n ],\n })\n\n if (data.pagination) {\n logger.info(\n `\\nPage ${data.pagination.page}/${data.pagination.totalPages} (${data.pagination.total} total)`,\n )\n }\n })\n\nconst keysCommand = jobCommand\n .command('keys')\n .description('Manage job trigger keys')\n\nkeysCommand\n .argument('<jobId>', 'Job ID')\n .action(async (jobId: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching trigger keys',\n () => client.get<{ success: boolean; apiKeys: Array<Record<string, unknown>> }>(\n `/api/jobs/${jobId}/api-keys`,\n ),\n )\n\n output(data.apiKeys ?? [], {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'name', header: 'Name' },\n { key: 'start', header: 'Prefix' },\n { key: 'enabled', header: 'Enabled' },\n { key: 'expiresAt', header: 'Expires' },\n { key: 'lastRequest', header: 'Last used' },\n ],\n })\n })\n\nkeysCommand\n .command('create')\n .description('Create a new trigger key for a job')\n .argument('<jobId>', 'Job ID')\n .requiredOption('--name <name>', 'Key name')\n .option('--expires-in <seconds>', 'Expiry in seconds (min 60)')\n .action(async (jobId: string, options: { name: string; expiresIn?: string }) => {\n const client = createAuthenticatedClient()\n\n const body: Record<string, unknown> = { name: options.name }\n if (options.expiresIn !== undefined) {\n body.expiresIn = parseIntStrict(options.expiresIn, '--expires-in', { min: 60 })\n }\n\n const { data } = await withSpinner(\n 'Creating trigger key',\n () => client.post<{ success: boolean; apiKey: Record<string, unknown> }>(\n `/api/jobs/${jobId}/api-keys`,\n body,\n ),\n )\n\n logger.success('Trigger key created')\n logger.warn('Save the `key` value now. It will only be shown once.')\n outputDetail(data.apiKey)\n })\n\nkeysCommand\n .command('delete')\n .description('Revoke a trigger key')\n .argument('<jobId>', 'Job ID')\n .argument('<keyId>', 'Key ID')\n .action(async (jobId: string, keyId: string) => {\n const client = createAuthenticatedClient()\n await withSpinner(\n 'Revoking trigger key',\n () => client.delete(`/api/jobs/${jobId}/api-keys/${keyId}`),\n )\n logger.success(`Trigger key ${keyId} revoked`)\n })\n\njobCommand\n .command('get <id>')\n .description('Get job details')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching job details',\n () => client.get<Record<string, unknown>>(`/api/jobs/${id}`),\n )\n outputDetail(data)\n })\n\njobCommand\n .command('create')\n .description('Create a new job')\n .requiredOption('--name <name>', 'Job name')\n .requiredOption('--tests <tests...>', 'Test IDs (space or comma separated)')\n .option('--description <description>', 'Job description', '')\n .option('--type <type>', 'Job runner type (playwright, k6)')\n .option('--schedule <cron>', 'Cron schedule expression')\n .option('--dry-run', 'Show what would be sent without creating')\n .action(async (options: { name: string; tests: string[]; description: string; type?: string; schedule?: string; dryRun?: boolean }) => {\n const client = createAuthenticatedClient()\n\n const tests = (options.tests ?? [])\n .flatMap((value) => value.split(','))\n .map((value) => value.trim())\n .filter(Boolean)\n\n if (tests.length === 0) {\n throw new CLIError('At least one test ID is required to create a job.', ExitCode.ConfigError)\n }\n\n const body: Record<string, unknown> = {\n name: options.name,\n description: options.description,\n config: {},\n tests: tests.map((id) => ({ id })),\n }\n if (options.type) body.jobType = options.type\n if (options.schedule) body.cronSchedule = options.schedule\n\n if (options.dryRun) {\n logger.header('Dry run \\u2014 job create payload:')\n logger.info(JSON.stringify(body, null, 2))\n return\n }\n\n const { data } = await withSpinner(\n 'Creating job',\n () => client.post<Record<string, unknown>>('/api/jobs', body),\n )\n const job = (data as Record<string, unknown> & { job?: Record<string, unknown> }).job ?? data\n const jobId = (job as Record<string, unknown>)?.id\n logger.success(`Job \"${options.name}\" created (${jobId ?? 'unknown'})`)\n outputDetail(job as Record<string, unknown>)\n })\n\njobCommand\n .command('update <id>')\n .description('Update job configuration')\n .option('--name <name>', 'Job name')\n .option('--description <description>', 'Job description')\n .option('--schedule <cron>', 'Cron schedule expression')\n .option('--status <status>', 'Job status (active, paused)')\n .option('--dry-run', 'Show what would be sent without updating')\n .action(async (id: string, options: { name?: string; description?: string; schedule?: string; status?: string; dryRun?: boolean }) => {\n const client = createAuthenticatedClient()\n\n const body: Record<string, unknown> = {}\n if (options.name !== undefined) body.name = options.name\n if (options.description !== undefined) body.description = options.description\n if (options.schedule !== undefined) body.cronSchedule = options.schedule\n if (options.status !== undefined) body.status = options.status\n\n if (Object.keys(body).length === 0) {\n logger.warn('No fields to update. Use --name, --description, --schedule, or --status.')\n return\n }\n\n if (options.dryRun) {\n logger.header('Dry run \\u2014 job update payload:')\n logger.info(JSON.stringify(body, null, 2))\n return\n }\n\n const { data } = await withSpinner(\n 'Updating job',\n () => client.patch<Record<string, unknown>>(`/api/jobs/${id}`, body),\n )\n logger.success(`Job ${id} updated`)\n outputDetail(data)\n })\n\njobCommand\n .command('delete <id>')\n .description('Delete a job')\n .option('--force', 'Skip confirmation')\n .action(async (id: string, options: { force?: boolean }) => {\n if (!options.force) {\n const { confirmPrompt } = await import('../utils/prompt.js')\n const confirmed = await confirmPrompt(`Delete job ${id}?`, { default: false })\n if (!confirmed) {\n logger.info('Aborted')\n return\n }\n }\n\n const client = createAuthenticatedClient()\n await withSpinner(\n 'Deleting job',\n () => client.delete(`/api/jobs/${id}`),\n )\n logger.success(`Job ${id} deleted`)\n })\n\njobCommand\n .command('run')\n .description('Run a job immediately')\n .requiredOption('--id <id>', 'Job ID to run')\n .option('--local', 'Run locally')\n .option('--cloud', 'Run on cloud')\n .action(async (options: { id: string; local?: boolean; cloud?: boolean }) => {\n if (options.local && options.cloud) {\n throw new CLIError('--local and --cloud are mutually exclusive.', ExitCode.ConfigError)\n }\n\n const useLocal = options.local === true\n\n if (useLocal) {\n const cwd = process.cwd()\n const { config } = await loadConfig({ cwd })\n const job = config.jobs?.find((j) => j.id === options.id || j.name === options.id)\n\n if (!job) {\n throw new CLIError(`Job ${options.id} not found in local config.`, ExitCode.ConfigError)\n }\n\n const tests = Array.isArray(job.tests) ? job.tests : []\n if (tests.length === 0) {\n throw new CLIError(`Job ${options.id} has no tests.`, ExitCode.GeneralError)\n }\n\n const patterns = {\n playwright: config.tests?.playwright?.testMatch,\n k6: config.tests?.k6?.testMatch,\n }\n\n const localTests = resolveJobLocalTests(cwd, tests, patterns)\n\n const client = createAuthenticatedClient()\n await withSpinner('Validating test scripts...', async () => {\n await validateJobTests(client, localTests)\n }, { successText: 'Test scripts validated' })\n\n await runLocalJobTests(localTests, cwd, config.tests?.playwright?.testMatch)\n return\n }\n\n const client = createAuthenticatedClient()\n\n const { data: jobData } = await withSpinner(\n 'Fetching job details',\n () => client.get<{ tests?: Array<{ id: string; name?: string; title?: string }> }>(\n `/api/jobs/${options.id}`,\n ),\n )\n\n const tests = Array.isArray(jobData.tests) ? jobData.tests : []\n if (tests.length === 0) {\n throw new CLIError(\n `Job ${options.id} has no tests. Add tests to the job before running it.`,\n ExitCode.GeneralError,\n )\n }\n\n const payloadTests = tests.map((test) => ({\n id: test.id,\n name: test.name ?? test.title ?? '',\n }))\n\n const { data } = await withSpinner(\n 'Running job',\n () => client.post<{ runId: string; message: string }>(\n '/api/jobs/run',\n { jobId: options.id, tests: payloadTests, trigger: 'remote' },\n ),\n )\n\n logger.success(`Job started. Run ID: ${data.runId}`)\n outputDetail(data as Record<string, unknown>)\n })\n\njobCommand\n .command('trigger <id>')\n .description('Trigger a job run')\n .option('--wait', 'Wait for the run to complete')\n .option('--timeout <seconds>', 'Maximum wait time in seconds', '300')\n .action(async (id: string, options: { wait?: boolean; timeout: string }) => {\n const triggerClient = new ApiClient({\n token: requireTriggerKey(),\n baseUrl: getStoredBaseUrl() ?? undefined,\n })\n\n const { data } = await withSpinner(\n 'Triggering job',\n () => triggerClient.post<{ runId: string; message: string }>(\n `/api/jobs/${id}/trigger`,\n ),\n )\n\n const runId = (data as { runId?: string; data?: { runId?: string } }).runId\n ?? (data as { data?: { runId?: string } }).data?.runId\n if (!runId) {\n throw new CLIError('Job trigger response did not include a run ID.', ExitCode.ApiError)\n }\n\n logger.success(`Job triggered. Run ID: ${runId}`)\n\n if (options.wait) {\n let statusClient: ReturnType<typeof createAuthenticatedClient>\n try {\n statusClient = createAuthenticatedClient()\n } catch {\n throw new CLIError(\n 'Waiting for completion requires a CLI token. Set SUPERCHECK_TOKEN (sck_live_* or sck_test_).',\n ExitCode.AuthError,\n )\n }\n\n logger.info('Waiting for run to complete...')\n const timeoutMs = parseIntStrict(options.timeout, '--timeout', { min: 1 }) * 1000\n const startTime = Date.now()\n\n while (Date.now() - startTime < timeoutMs) {\n await new Promise((resolve) => setTimeout(resolve, 3000))\n\n const { data: runData } = await statusClient.get<{ status: string }>(\n `/api/runs/${runId}`,\n )\n\n const status = typeof runData.status === 'string' ? runData.status.toLowerCase() : ''\n\n if (['passed', 'failed', 'error', 'blocked'].includes(status)) {\n if (status === 'passed') {\n logger.success(`Run ${runId} passed`)\n } else if (status === 'blocked') {\n logger.error(`Run ${runId} blocked`)\n throw new CLIError(`Run ${runId} blocked`, ExitCode.GeneralError)\n } else {\n logger.error(`Run ${runId} ${status}`)\n throw new CLIError(`Run ${runId} ${status}`, ExitCode.GeneralError)\n }\n outputDetail(runData as Record<string, unknown>)\n return\n }\n\n logger.debug(`Run status: ${status || '(unknown)'}`)\n }\n\n throw new CLIError(\n `Timed out waiting for run to complete after ${options.timeout}s`,\n ExitCode.Timeout,\n )\n }\n })\n","import { getApiClient } from './client.js'\nimport { requireAuth, getStoredBaseUrl } from '../auth/store.js'\nimport { tryLoadConfig } from '../config/loader.js'\nimport type { ApiClient } from './client.js'\n\n/**\n * Create an API client pre-configured with the stored auth token and base URL.\n * Shared across all command modules to avoid repeating this pattern.\n *\n * Base URL resolution order (highest to lowest priority):\n * 1. SUPERCHECK_URL environment variable (via getStoredBaseUrl)\n * 2. Stored base URL from `supercheck login --url` (via getStoredBaseUrl)\n * 3. Config file `api.baseUrl` (from supercheck.config.ts)\n * 4. Default: https://app.supercheck.io\n */\nexport function createAuthenticatedClient(configBaseUrl?: string): ApiClient {\n const token = requireAuth()\n const storedBaseUrl = getStoredBaseUrl()\n const baseUrl = storedBaseUrl ?? configBaseUrl\n return getApiClient({ token, baseUrl: baseUrl ?? undefined })\n}\n\n/**\n * Create an authenticated client with config-aware base URL resolution.\n * Attempts to load the config file to read `api.baseUrl` as a fallback.\n * Use this variant in commands that don't already load the config.\n */\nexport async function createAuthenticatedClientWithConfig(): Promise<ApiClient> {\n const token = requireAuth()\n const storedBaseUrl = getStoredBaseUrl()\n\n if (storedBaseUrl) {\n return getApiClient({ token, baseUrl: storedBaseUrl })\n }\n\n // Try to load config for baseUrl fallback\n const configResult = await tryLoadConfig()\n const configBaseUrl = configResult?.config?.api?.baseUrl\n return getApiClient({ token, baseUrl: configBaseUrl ?? undefined })\n}\n","import { CLIError, ExitCode } from './errors.js'\n\n/**\n * Parse a string to an integer with strict validation.\n */\nexport function parseIntStrict(\n value: string,\n name: string,\n opts?: { min?: number; max?: number },\n): number {\n const parsed = parseInt(value, 10)\n if (!Number.isFinite(parsed)) {\n throw new CLIError(\n `Invalid value for ${name}: \"${value}\" is not a valid integer.`,\n ExitCode.ConfigError,\n )\n }\n if (opts?.min !== undefined && parsed < opts.min) {\n throw new CLIError(\n `Invalid value for ${name}: ${parsed} is below the minimum of ${opts.min}.`,\n ExitCode.ConfigError,\n )\n }\n if (opts?.max !== undefined && parsed > opts.max) {\n throw new CLIError(\n `Invalid value for ${name}: ${parsed} exceeds the maximum of ${opts.max}.`,\n ExitCode.ConfigError,\n )\n }\n return parsed\n}","import { ApiRequestError, CLIError, ExitCode } from './errors.js'\nimport type { ApiClient } from '../api/client.js'\n\nexport type ApiTestType = 'browser' | 'performance' | 'api' | 'database' | 'custom'\n\nconst K6_IMPORT_PATTERN = /import\\s+.*\\s+from\\s+['\"]k6(?:\\/[^'\"]*)?['\"]/\n\n/**\n * Detects whether a script imports any k6 modules.\n * Mirrors the server-side `isK6Script` logic from `k6-validator.ts`.\n */\nexport function isK6Script(script: string): boolean {\n return K6_IMPORT_PATTERN.test(script)\n}\n\n/**\n * Client-side validation that a script's content matches its declared type.\n * Returns an error message if there's a mismatch, or undefined if valid.\n *\n * Rules:\n * - k6 scripts (importing from 'k6/*') MUST have type \"performance\"\n * - Non-k6 scripts MUST NOT have type \"performance\"\n */\nexport function validateScriptTypeMatch(\n script: string,\n declaredType: ApiTestType | undefined,\n): string | undefined {\n if (!script || !declaredType) return undefined\n\n const scriptIsK6 = isK6Script(script)\n\n if (scriptIsK6 && declaredType !== 'performance') {\n return `Script contains k6 imports but test type is \"${declaredType}\". k6 scripts must use type \"performance\".`\n }\n\n if (!scriptIsK6 && declaredType === 'performance') {\n return 'Test type is \"performance\" but script does not contain k6 imports. Performance tests require k6 scripts.'\n }\n\n return undefined\n}\n\nexport interface TestValidationInput {\n name: string\n script: string\n testType?: ApiTestType\n}\n\nexport interface TestValidationResult {\n name: string\n valid: boolean\n error?: string\n warnings?: string[]\n}\n\nexport function normalizeTestTypeForApi(localType: unknown): ApiTestType | undefined {\n if (typeof localType !== 'string') return undefined\n\n const normalized = localType.trim().toLowerCase()\n\n if (normalized === 'playwright') return 'browser'\n if (normalized === 'k6') return 'performance'\n if (normalized === 'load') return 'performance'\n\n if (\n normalized === 'browser' ||\n normalized === 'performance' ||\n normalized === 'api' ||\n normalized === 'database' ||\n normalized === 'custom'\n ) {\n return normalized\n }\n\n return undefined\n}\n\nfunction formatValidationError(responseBody: unknown): string {\n if (responseBody && typeof responseBody === 'object') {\n const body = responseBody as Record<string, unknown>\n if (typeof body.error === 'string') {\n const line = typeof body.line === 'number' ? body.line : undefined\n const column = typeof body.column === 'number' ? body.column : undefined\n if (line !== undefined && column !== undefined) {\n return `${body.error} (line ${line}, column ${column})`\n }\n return body.error\n }\n }\n\n return 'Validation failed'\n}\n\nexport async function validateScripts(\n client: ApiClient,\n inputs: TestValidationInput[],\n): Promise<TestValidationResult[]> {\n const results: TestValidationResult[] = []\n\n for (const input of inputs) {\n if (!input.script || input.script.trim().length === 0) {\n throw new CLIError(`Test \"${input.name}\" has no script content`, ExitCode.ConfigError)\n }\n\n try {\n const { data } = await client.post<{ valid: boolean; warnings?: string[] }>(\n '/api/validate-script',\n {\n script: input.script,\n testType: input.testType,\n },\n )\n\n results.push({\n name: input.name,\n valid: data?.valid ?? true,\n warnings: data?.warnings,\n })\n } catch (err) {\n if (err instanceof ApiRequestError) {\n results.push({\n name: input.name,\n valid: false,\n error: formatValidationError(err.responseBody),\n })\n continue\n }\n\n throw err\n }\n }\n\n return results\n}\n","import { spawn } from 'node:child_process'\n\n/**\n * Run a command with arguments in a child process.\n *\n * SECURITY: This function does NOT use shell=true to prevent command injection.\n * Pass command and args as separate parameters.\n */\nexport function runCommand(command: string, args: string[], cwd?: string): Promise<number> {\n return new Promise((resolve, reject) => {\n // Windows requires the .cmd shim for npm binaries like `npx` when shell is disabled.\n const executable = process.platform === 'win32' && command === 'npx'\n ? 'npx.cmd'\n : command\n\n // SECURITY FIX: Remove shell: true to prevent command injection\n // spawn() with shell: false treats args as literal arguments, not shell commands\n const child = spawn(executable, args, {\n stdio: 'inherit',\n shell: false, // ✓ SECURE: Prevents command injection\n cwd,\n })\n\n child.on('error', (err) => reject(err))\n child.on('close', (code) => resolve(code ?? 0))\n })\n}\n","import { mkdtempSync, writeFileSync, rmSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport type TempPlaywrightConfig = {\n path: string\n cleanup: () => void\n}\n\nexport function createTempPlaywrightConfig(cwd: string, testMatch?: string): TempPlaywrightConfig {\n const dir = mkdtempSync(join(cwd, '.supercheck-playwright-'))\n const filePath = join(dir, 'playwright.supercheck.config.mjs')\n const match = testMatch ?? '_supercheck_/playwright/**/*.pw.ts'\n\n const contents = [\n \"import { defineConfig } from '@playwright/test'\",\n '',\n 'export default defineConfig({',\n ` testDir: ${JSON.stringify(cwd)},`,\n ` testMatch: ${JSON.stringify([match])},`,\n '})',\n '',\n ].join('\\n')\n\n writeFileSync(filePath, contents, 'utf-8')\n\n return {\n path: filePath,\n cleanup: () => {\n rmSync(dir, { recursive: true, force: true })\n },\n }\n}\n","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { requireAuth, getStoredBaseUrl } from '../auth/store.js'\nimport { logger } from '../utils/logger.js'\nimport { output, outputDetail } from '../output/formatter.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport type { PaginatedResponse } from '../api/client.js'\nimport { CLI_VERSION } from '../version.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { getProxyAgent, getProxyEnv } from '../utils/proxy.js'\n\nexport const runCommand = new Command('run')\n .description('Manage runs')\n\nrunCommand\n .command('list')\n .description('List runs')\n .option('--page <page>', 'Page number', '1')\n .option('--limit <limit>', 'Items per page', '50')\n .option('--job <jobId>', 'Filter by job ID')\n .option('--status <status>', 'Filter by status')\n .action(async (options: { page: string; limit: string; status?: string; job?: string }) => {\n const client = createAuthenticatedClient()\n\n const params: Record<string, string> = {\n page: options.page,\n limit: options.limit,\n }\n if (options.job) params.jobId = options.job\n if (options.status) params.status = options.status\n\n const { data } = await withSpinner(\n 'Fetching runs',\n () => client.get<PaginatedResponse<Record<string, unknown>>>(\n '/api/runs',\n params,\n ),\n )\n\n output(data.data, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'jobName', header: 'Job' },\n { key: 'status', header: 'Status' },\n { key: 'trigger', header: 'Trigger' },\n { key: 'startedAt', header: 'Started' },\n ],\n })\n\n if (data.pagination) {\n logger.info(\n `\\nPage ${data.pagination.page}/${data.pagination.totalPages} (${data.pagination.total} total)`,\n )\n }\n })\n\nrunCommand\n .command('get <id>')\n .description('Get run details')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching run details',\n () => client.get<Record<string, unknown>>(`/api/runs/${id}`),\n )\n outputDetail(data)\n })\n\nrunCommand\n .command('status <id>')\n .description('Get run status')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching run status',\n () => client.get<Record<string, unknown>>(`/api/runs/${id}/status`),\n )\n outputDetail(data)\n })\n\nrunCommand\n .command('permissions <id>')\n .description('Get run access permissions')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching run permissions',\n () => client.get<Record<string, unknown>>(`/api/runs/${id}/permissions`),\n )\n const payload = (data as { data?: Record<string, unknown> }).data ?? data\n outputDetail(payload)\n })\n\nrunCommand\n .command('stream <id>')\n .description('Stream live console output from a run')\n .option('--idle-timeout <seconds>', 'Abort if no data received within this period', '60')\n .action(async (id: string, options: { idleTimeout: string }) => {\n const token = requireAuth()\n const baseUrl = getStoredBaseUrl() ?? 'https://app.supercheck.io'\n const idleTimeoutMs = Math.max(Number(options.idleTimeout) || 60, 10) * 1000\n\n const url = `${baseUrl}/api/runs/${id}/stream`\n const parsedUrl = new URL(url)\n\n logger.info(`Streaming output for run ${id}...`)\n logger.newline()\n\n const controller = new AbortController()\n const connectTimeout = setTimeout(() => controller.abort(), 30_000)\n\n try {\n const proxy = getProxyEnv(parsedUrl)\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'text/event-stream',\n 'User-Agent': `supercheck-cli/${CLI_VERSION}`,\n },\n ...(proxy ? { dispatcher: getProxyAgent(proxy) } : {}),\n signal: controller.signal,\n })\n\n clearTimeout(connectTimeout)\n\n if (!response.ok) {\n throw new CLIError(`Failed to connect to stream: ${response.status}`, ExitCode.ApiError)\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new CLIError('No response body for SSE stream', ExitCode.ApiError)\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n let currentEvent = ''\n\n // Idle timeout: abort if no data received within the configured period\n let idleTimer: ReturnType<typeof setTimeout> | undefined\n const resetIdleTimer = () => {\n if (idleTimer) clearTimeout(idleTimer)\n idleTimer = setTimeout(() => controller.abort(), idleTimeoutMs)\n }\n resetIdleTimer()\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n resetIdleTimer()\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n\n for (const line of lines) {\n // SSE comment (keepalive) — ignore\n if (line.startsWith(':')) continue\n\n // SSE event type\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7).trim()\n continue\n }\n\n // SSE retry directive — ignore\n if (line.startsWith('retry:')) continue\n\n // SSE data payload\n if (line.startsWith('data: ')) {\n const data = line.slice(6)\n try {\n const parsed = JSON.parse(data)\n\n switch (currentEvent) {\n case 'console':\n // Server sends { line: \"...\" } for console output\n if (parsed.line !== undefined) {\n process.stdout.write(parsed.line + '\\n')\n }\n break\n case 'status':\n logger.info(`Status: ${parsed.status ?? JSON.stringify(parsed)}`)\n break\n case 'complete':\n logger.success(`Run complete: ${parsed.status ?? 'done'}`)\n if (idleTimer) clearTimeout(idleTimer)\n return\n case 'error':\n logger.error(`Stream error: ${parsed.message ?? JSON.stringify(parsed)}`)\n break\n case 'heartbeat':\n // Server keepalive — no action needed\n break\n default:\n // Unknown or unnamed event — show status/output if present\n if (parsed.output) {\n process.stdout.write(parsed.output)\n } else if (parsed.status) {\n logger.info(`Status: ${parsed.status}`)\n }\n break\n }\n } catch {\n // Raw text output\n process.stdout.write(data)\n }\n // Reset event type after processing data\n currentEvent = ''\n continue\n }\n\n // Empty line marks end of SSE event block — reset event type\n if (line.trim() === '') {\n currentEvent = ''\n }\n }\n }\n\n if (idleTimer) clearTimeout(idleTimer)\n } catch (err) {\n if (err instanceof CLIError) throw err\n if (err instanceof Error && err.name === 'AbortError') {\n throw new CLIError(\n `Stream timed out (no data received for ${Math.round(idleTimeoutMs / 1000)}s)`,\n ExitCode.Timeout,\n )\n }\n throw new CLIError(\n `Stream error: ${err instanceof Error ? err.message : String(err)}`,\n ExitCode.ApiError,\n )\n }\n })\n\nrunCommand\n .command('cancel <id>')\n .description('Cancel a running execution')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Cancelling run',\n () => client.post<Record<string, unknown>>(`/api/runs/${id}/cancel`),\n )\n outputDetail(data)\n })\n","import { Command } from 'commander'\nimport { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { Buffer } from 'node:buffer'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { loadConfig } from '../config/loader.js'\nimport { discoverFiles } from '../utils/discovery.js'\nimport { logger } from '../utils/logger.js'\nimport { output, outputDetail } from '../output/formatter.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport type { PaginatedResponse } from '../api/client.js'\nimport { requireAuth, getStoredBaseUrl } from '../auth/store.js'\nimport { CLI_VERSION } from '../version.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { normalizeTestTypeForApi, validateScripts, validateScriptTypeMatch } from '../utils/validation.js'\nimport { runCommand } from '../utils/exec.js'\nimport { createTempPlaywrightConfig } from '../utils/playwright.js'\nimport { ensureDependenciesForTestType, DependencyError } from '../utils/deps.js'\nimport { getProxyAgent, getProxyEnv } from '../utils/proxy.js'\n\nfunction normalizeTestType(input: string): string {\n return normalizeTestTypeForApi(input) ?? input.trim().toLowerCase()\n}\n\nfunction inferTestType(filename: string): string | undefined {\n if (filename.endsWith('.k6.ts') || filename.endsWith('.k6.js')) return 'k6'\n if (filename.endsWith('.pw.ts') || filename.endsWith('.pw.js') || filename.endsWith('.spec.ts')) return 'playwright'\n return undefined\n}\n\ntype LocalTestFile = {\n path: string\n type: 'playwright' | 'k6'\n name: string\n script: string\n validationType?: ReturnType<typeof normalizeTestTypeForApi>\n}\n\nfunction toDisplayName(cwd: string, filePath: string): string {\n const normalized = filePath.replace(cwd, '').replace(/^\\//, '')\n return normalized.startsWith('_supercheck_/') ? normalized.replace(/^_supercheck_\\//, '') : normalized\n}\n\nfunction collectLocalTests(\n cwd: string,\n patterns: { playwright?: string; k6?: string },\n options: { file?: string; all?: boolean; type?: string },\n): LocalTestFile[] {\n if (options.file) {\n const filePath = resolve(cwd, options.file)\n const type = inferTestType(filePath) ?? (options.type === 'k6' ? 'k6' : 'playwright')\n const validationType = options.type ? normalizeTestTypeForApi(options.type) : normalizeTestTypeForApi(type)\n const script = readFileSync(filePath, 'utf-8')\n return [{\n path: filePath,\n type: type as 'playwright' | 'k6',\n name: toDisplayName(cwd, filePath),\n script,\n validationType,\n }]\n }\n\n const typeFilter = options.type?.toLowerCase()\n const filterType = typeFilter && ['api', 'database', 'custom', 'browser', 'playwright'].includes(typeFilter)\n ? 'playwright'\n : typeFilter === 'performance' || typeFilter === 'load'\n ? 'k6'\n : typeFilter\n\n const files = discoverFiles(cwd, patterns)\n .filter((file) => !filterType || file.type === filterType)\n\n return files.map((file) => {\n const script = readFileSync(file.absolutePath, 'utf-8')\n const validationType = options.type ? normalizeTestTypeForApi(options.type) : normalizeTestTypeForApi(file.type)\n return {\n path: file.absolutePath,\n type: file.type,\n name: toDisplayName(cwd, file.absolutePath),\n script,\n validationType,\n }\n })\n}\n\nasync function validateLocalTests(client: ReturnType<typeof createAuthenticatedClient>, tests: LocalTestFile[]): Promise<void> {\n // First: fast client-side script-type mismatch detection\n for (const test of tests) {\n const declaredType = test.validationType ?? normalizeTestTypeForApi(test.type)\n const mismatch = validateScriptTypeMatch(test.script, declaredType)\n if (mismatch) {\n throw new CLIError(`${test.name}: ${mismatch}`, ExitCode.ConfigError)\n }\n }\n\n // Then: server-side validation (security patterns, AST, etc.)\n const inputs = tests.map((test) => ({\n name: test.name,\n script: test.script,\n testType: test.validationType ?? normalizeTestTypeForApi(test.type),\n }))\n\n const results = await validateScripts(client, inputs)\n const failures = results.filter((r) => !r.valid)\n if (failures.length > 0) {\n const details = failures.map((f) => ` - ${f.name}: ${f.error ?? 'Validation failed'}`).join('\\n')\n throw new CLIError(`Validation failed:\\n${details}`, ExitCode.ConfigError)\n }\n\n const warnings = results.filter((r) => r.warnings && r.warnings.length > 0)\n for (const warn of warnings) {\n logger.warn(`Validation warnings for ${warn.name}: ${(warn.warnings ?? []).join(', ')}`)\n }\n}\n\nasync function runPlaywrightTests(paths: string[], cwd: string, testMatch?: string): Promise<void> {\n if (paths.length === 0) return\n const tempConfig = createTempPlaywrightConfig(cwd, testMatch)\n try {\n const code = await runCommand('npx', ['playwright', 'test', '--config', tempConfig.path, ...paths], cwd)\n if (code !== 0) {\n throw new CLIError(`Playwright tests failed with exit code ${code}`, ExitCode.GeneralError)\n }\n } finally {\n tempConfig.cleanup()\n }\n}\n\nasync function runK6Tests(paths: string[], cwd: string): Promise<void> {\n for (const path of paths) {\n const code = await runCommand('k6', ['run', path], cwd)\n if (code !== 0) {\n throw new CLIError(`k6 test failed with exit code ${code}`, ExitCode.GeneralError)\n }\n }\n}\n\nexport const testCommand = new Command('test')\n .description('Manage tests')\n\ntestCommand\n .command('list')\n .description('List all tests')\n .option('--page <page>', 'Page number', '1')\n .option('--limit <limit>', 'Items per page', '50')\n .option('--search <query>', 'Search by title')\n .option('--type <type>', 'Filter by type (browser, performance, api, database, custom)')\n .action(async (options: { page: string; limit: string; search?: string; type?: string }) => {\n const client = createAuthenticatedClient()\n\n const params: Record<string, string> = {\n page: options.page,\n limit: options.limit,\n }\n if (options.search) params.search = options.search\n if (options.type) params.type = normalizeTestType(options.type)\n\n const { data } = await withSpinner(\n 'Fetching tests',\n () => client.get<PaginatedResponse<Record<string, unknown>>>(\n '/api/tests',\n params,\n ),\n )\n\n output(data.data, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'title', header: 'Title' },\n { key: 'type', header: 'Type' },\n { key: 'createdAt', header: 'Created' },\n ],\n })\n\n if (data.pagination) {\n logger.info(\n `\\nPage ${data.pagination.page}/${data.pagination.totalPages} (${data.pagination.total} total)`,\n )\n }\n })\n\ntestCommand\n .command('get <id>')\n .description('Get test details')\n .option('--include-script', 'Include the test script content')\n .action(async (id: string, options: { includeScript?: boolean }) => {\n const client = createAuthenticatedClient()\n const params: Record<string, string> = {\n includeScript: options.includeScript ? 'true' : 'false',\n }\n\n const { data } = await withSpinner(\n 'Fetching test details',\n () => client.get<Record<string, unknown>>(`/api/tests/${id}`, params),\n )\n outputDetail(data)\n })\n\ntestCommand\n .command('create')\n .description('Create a new test')\n .requiredOption('--title <title>', 'Test title')\n .requiredOption('--file <path>', 'Path to the test script file')\n .option('--type <type>', 'Test type (browser, performance, api, database, custom)')\n .option('--description <description>', 'Test description')\n .option('--dry-run', 'Show what would be sent without creating')\n .action(async (options: { title: string; file: string; type?: string; description?: string; dryRun?: boolean }) => {\n const { readFileSync } = await import('node:fs')\n const { resolve } = await import('node:path')\n\n const filePath = resolve(process.cwd(), options.file)\n let script: string\n\n try {\n script = readFileSync(filePath, 'utf-8')\n } catch {\n throw new CLIError(`Cannot read file: ${filePath}`, ExitCode.GeneralError)\n }\n\n const typeArg = options.type || inferTestType(options.file) || 'playwright'\n\n // Validate script content matches declared type before sending to API\n const typeMismatchError = validateScriptTypeMatch(script, normalizeTestTypeForApi(typeArg))\n if (typeMismatchError) {\n throw new CLIError(typeMismatchError, ExitCode.ConfigError)\n }\n\n const encodedScript = Buffer.from(script, 'utf-8').toString('base64')\n\n const body: Record<string, unknown> = {\n title: options.title,\n script: encodedScript,\n type: normalizeTestType(typeArg),\n }\n if (options.description) body.description = options.description\n\n if (options.dryRun) {\n const preview = { ...body, script: `<base64 ${encodedScript.length} chars>` }\n logger.header('Dry run \\u2014 test create payload:')\n logger.info(JSON.stringify(preview, null, 2))\n return\n }\n\n const client = createAuthenticatedClient()\n\n const { data } = await withSpinner(\n 'Creating test',\n () => client.post<Record<string, unknown>>('/api/tests', body),\n )\n const createdId =\n (data as { test?: { id?: string } }).test?.id ??\n (data as { id?: string }).id\n logger.success(`Test \"${options.title}\" created${createdId ? ` (${createdId})` : ''}`)\n outputDetail(data)\n })\n\ntestCommand\n .command('update <id>')\n .description('Update a test')\n .option('--title <title>', 'Test title')\n .option('--file <path>', 'Path to updated test script')\n .option('--description <description>', 'Test description')\n .option('--dry-run', 'Show what would be sent without updating')\n .action(async (id: string, options: { title?: string; file?: string; description?: string; dryRun?: boolean }) => {\n const client = createAuthenticatedClient()\n\n const body: Record<string, unknown> = {}\n if (options.title !== undefined) body.title = options.title\n if (options.description !== undefined) body.description = options.description\n\n if (options.file) {\n const { readFileSync } = await import('node:fs')\n const { resolve } = await import('node:path')\n const filePath = resolve(process.cwd(), options.file)\n try {\n const raw = readFileSync(filePath, 'utf-8')\n body.script = Buffer.from(raw, 'utf-8').toString('base64')\n } catch {\n throw new CLIError(`Cannot read file: ${filePath}`, ExitCode.GeneralError)\n }\n }\n\n if (Object.keys(body).length === 0) {\n logger.warn('No fields to update. Use --title, --file, or --description.')\n return\n }\n\n if (options.dryRun) {\n const preview = { ...body }\n if (typeof preview.script === 'string') {\n preview.script = `<base64 ${(preview.script as string).length} chars>`\n }\n logger.header('Dry run \\u2014 test update payload:')\n logger.info(JSON.stringify(preview, null, 2))\n return\n }\n\n const { data } = await withSpinner(\n 'Updating test',\n () => client.patch<Record<string, unknown>>(`/api/tests/${id}`, body),\n )\n logger.success(`Test ${id} updated`)\n outputDetail(data)\n })\n\ntestCommand\n .command('delete <id>')\n .description('Delete a test')\n .option('--force', 'Skip confirmation')\n .action(async (id: string, options: { force?: boolean }) => {\n if (!options.force) {\n const { confirmPrompt } = await import('../utils/prompt.js')\n const confirmed = await confirmPrompt(`Delete test ${id}?`, { default: false })\n if (!confirmed) {\n logger.info('Aborted')\n return\n }\n }\n\n const client = createAuthenticatedClient()\n await withSpinner(\n 'Deleting test',\n () => client.delete(`/api/tests/${id}`),\n )\n logger.success(`Test ${id} deleted`)\n })\n\ntestCommand\n .command('run')\n .description('Run tests locally')\n .option('--file <path>', 'Local test file path')\n .option('--all', 'Run all local tests')\n .option('--type <type>', 'Test type filter (browser, performance, api, database, custom)')\n .action(async (options: { file?: string; all?: boolean; type?: string }) => {\n\n if (!options.file && !options.all) {\n throw new CLIError('Local runs require --file <path> or --all.', ExitCode.ConfigError)\n }\n\n const cwd = process.cwd()\n const { config } = await loadConfig({ cwd })\n const client = createAuthenticatedClient()\n const patterns = {\n playwright: config.tests?.playwright?.testMatch,\n k6: config.tests?.k6?.testMatch,\n }\n\n const localTests = collectLocalTests(cwd, patterns, {\n file: options.file,\n all: options.all,\n type: options.type,\n })\n\n if (localTests.length === 0) {\n logger.warn('No local tests found to run.')\n return\n }\n\n await withSpinner('Validating test scripts...', async () => {\n await validateLocalTests(client, localTests)\n }, { successText: 'Test scripts validated' })\n\n const playwrightTests = localTests.filter((t) => t.type === 'playwright').map((t) => t.path)\n const k6Tests = localTests.filter((t) => t.type === 'k6').map((t) => t.path)\n\n // Pre-flight dependency checks\n try {\n if (playwrightTests.length > 0) {\n ensureDependenciesForTestType(cwd, 'playwright')\n }\n if (k6Tests.length > 0) {\n ensureDependenciesForTestType(cwd, 'k6')\n }\n } catch (err) {\n if (err instanceof DependencyError) {\n throw new CLIError(err.message, ExitCode.ConfigError)\n }\n throw err\n }\n\n if (playwrightTests.length > 0) {\n logger.header('Running Playwright tests')\n await runPlaywrightTests(playwrightTests, cwd, config.tests?.playwright?.testMatch)\n }\n\n if (k6Tests.length > 0) {\n logger.header('Running k6 tests')\n await runK6Tests(k6Tests, cwd)\n }\n })\n\ntestCommand\n .command('tags <id>')\n .description('Get test tags')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching test tags',\n () => client.get<Record<string, unknown>[]>(`/api/tests/${id}/tags`),\n )\n output(data, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'name', header: 'Name' },\n { key: 'color', header: 'Color' },\n ],\n })\n })\n\ntestCommand\n .command('validate')\n .description('Validate a test script')\n .requiredOption('--file <path>', 'Path to the test script file')\n .option('--type <type>', 'Test type (browser, performance, api, database, custom)')\n .action(async (options: { file: string; type?: string }) => {\n const cwd = process.cwd()\n const filePath = resolve(cwd, options.file)\n let script: string\n\n try {\n script = readFileSync(filePath, 'utf-8')\n } catch {\n throw new CLIError(`Cannot read file: ${filePath}`, ExitCode.GeneralError)\n }\n\n const typeArg = options.type || inferTestType(options.file) || 'playwright'\n\n // Fast client-side check for script-type mismatch\n const resolvedApiType = normalizeTestTypeForApi(typeArg)\n const typeMismatchError = validateScriptTypeMatch(script, resolvedApiType)\n if (typeMismatchError) {\n throw new CLIError(typeMismatchError, ExitCode.ConfigError)\n }\n\n const client = createAuthenticatedClient()\n\n const results = await withSpinner(\n 'Validating script',\n () => validateScripts(client, [{\n name: toDisplayName(cwd, filePath),\n script,\n testType: normalizeTestTypeForApi(typeArg),\n }]),\n )\n\n const result = results[0]\n if (result?.valid) {\n logger.success(`Script is valid (${typeArg})`)\n if (result.warnings && result.warnings.length > 0) {\n logger.warn(`Warnings: ${result.warnings.join(', ')}`)\n }\n return\n }\n\n throw new CLIError(`Script validation failed: ${result?.error ?? 'Unknown error'}`, ExitCode.GeneralError)\n })\n\ntestCommand\n .command('status <id>')\n .description('Stream live status events for a test')\n .option('--idle-timeout <seconds>', 'Abort if no data received within this period', '60')\n .action(async (id: string, options: { idleTimeout: string }) => {\n const token = requireAuth()\n const baseUrl = getStoredBaseUrl() ?? 'https://app.supercheck.io'\n const idleTimeoutMs = Math.max(Number(options.idleTimeout) || 60, 10) * 1000\n\n const url = `${baseUrl}/api/test-status/events/${id}`\n const parsedUrl = new URL(url)\n\n logger.info(`Streaming status for test ${id}...`)\n logger.newline()\n\n const controller = new AbortController()\n const connectTimeout = setTimeout(() => controller.abort(), 30_000)\n\n try {\n const proxy = getProxyEnv(parsedUrl)\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'text/event-stream',\n 'User-Agent': `supercheck-cli/${CLI_VERSION}`,\n },\n ...(proxy ? { dispatcher: getProxyAgent(proxy) } : {}),\n signal: controller.signal,\n })\n\n clearTimeout(connectTimeout)\n\n if (!response.ok) {\n throw new CLIError(`Failed to connect to status stream: ${response.status}`, ExitCode.ApiError)\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new CLIError('No response body for SSE stream', ExitCode.ApiError)\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n\n let idleTimer: ReturnType<typeof setTimeout> | undefined\n const resetIdleTimer = () => {\n if (idleTimer) clearTimeout(idleTimer)\n idleTimer = setTimeout(() => controller.abort(), idleTimeoutMs)\n }\n resetIdleTimer()\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n resetIdleTimer()\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n\n for (const line of lines) {\n if (line.startsWith(':')) continue\n if (line.startsWith('data: ')) {\n const payload = line.slice(6)\n try {\n const parsed = JSON.parse(payload) as Record<string, unknown>\n outputDetail(parsed)\n } catch {\n process.stdout.write(payload + '\\n')\n }\n }\n }\n }\n\n if (idleTimer) clearTimeout(idleTimer)\n } catch (err) {\n if (err instanceof CLIError) throw err\n if (err instanceof Error && err.name === 'AbortError') {\n throw new CLIError(\n `Stream timed out (no data received for ${Math.round(idleTimeoutMs / 1000)}s)`,\n ExitCode.Timeout,\n )\n }\n throw new CLIError(\n `Stream error: ${err instanceof Error ? err.message : String(err)}`,\n ExitCode.ApiError,\n )\n }\n })\n","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { logger } from '../utils/logger.js'\nimport { getOutputFormat, output, outputDetail } from '../output/formatter.js'\nimport type { PaginatedResponse } from '../api/client.js'\nimport { parseIntStrict } from '../utils/number.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\n\nexport const monitorCommand = new Command('monitor')\n .description('Manage monitors')\n\nmonitorCommand\n .command('list')\n .description('List all monitors')\n .option('--page <page>', 'Page number', '1')\n .option('--limit <limit>', 'Items per page', '50')\n .action(async (options: { page: string; limit: string }) => {\n const client = createAuthenticatedClient()\n\n const { data } = await withSpinner(\n 'Fetching monitors',\n () => client.get<PaginatedResponse<Record<string, unknown>>>(\n '/api/monitors',\n { page: options.page, limit: options.limit },\n ),\n )\n\n output(data.data, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'name', header: 'Name' },\n { key: 'type', header: 'Type' },\n { key: 'status', header: 'Status' },\n { key: 'frequencyMinutes', header: 'Freq (min)' },\n ],\n })\n\n if (data.pagination) {\n logger.info(\n `\\nPage ${data.pagination.page}/${data.pagination.totalPages} (${data.pagination.total} total)`,\n )\n }\n })\n\nmonitorCommand\n .command('get <id>')\n .description('Get monitor details')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching monitor details',\n () => client.get<Record<string, unknown>>(`/api/monitors/${id}`),\n )\n outputDetail(data)\n })\n\nmonitorCommand\n .command('results <id>')\n .description('Get monitor check results')\n .option('--limit <limit>', 'Number of results', '20')\n .option('--page <page>', 'Page number', '1')\n .action(async (id: string, options: { limit: string; page: string }) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching monitor results',\n () => client.get<{ data: Record<string, unknown>[]; pagination?: { page: number; totalPages: number; total: number } }>(\n `/api/monitors/${id}/results`,\n { limit: options.limit, page: options.page },\n ),\n )\n\n output(data.data, {\n columns: [\n { key: 'checkedAt', header: 'Time' },\n { key: 'status', header: 'Status' },\n { key: 'responseTime', header: 'Response (ms)' },\n { key: 'location', header: 'Location' },\n ],\n })\n\n if (data.pagination) {\n logger.info(\n `\\nPage ${data.pagination.page}/${data.pagination.totalPages} (${data.pagination.total} total)`,\n )\n }\n })\n\nmonitorCommand\n .command('stats <id>')\n .description('Get monitor performance statistics')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching monitor statistics',\n () => client.get<Record<string, unknown>>(`/api/monitors/${id}/stats`),\n )\n\n if (getOutputFormat() === 'json') {\n outputDetail(data)\n return\n }\n\n // The API returns { success, data: { period24h, period30d }, meta }\n const statsData = (data.data ?? data) as Record<string, unknown>\n const period24h = statsData.period24h as Record<string, unknown> | undefined\n const period30d = statsData.period30d as Record<string, unknown> | undefined\n\n if (period24h) {\n logger.header('Last 24 Hours')\n outputDetail(period24h)\n logger.info('')\n }\n\n if (period30d) {\n logger.header('Last 30 Days')\n outputDetail(period30d)\n logger.info('')\n }\n\n // Show meta information if available\n const meta = data.meta as Record<string, unknown> | undefined\n if (meta) {\n logger.header('Meta')\n outputDetail(meta)\n }\n })\n\nmonitorCommand\n .command('status <id>')\n .description('Get current monitor status')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching monitor status',\n () => client.get<Record<string, unknown>>(`/api/monitors/${id}`),\n )\n const statusInfo: Record<string, unknown> = {\n id: data.id,\n name: data.name,\n status: data.status,\n lastCheckAt: data.lastCheckAt,\n responseTime: data.responseTime,\n }\n outputDetail(statusInfo)\n })\n\nmonitorCommand\n .command('create')\n .description('Create a new monitor')\n .requiredOption('--name <name>', 'Monitor name')\n .requiredOption('--url <url>', 'URL to monitor')\n .option('--type <type>', 'Monitor type (http_request, website, ping_host, port_check, synthetic_test)', 'http_request')\n .option('--interval-minutes <minutes>', 'Check interval in minutes (1-1440)', '5')\n .option('--interval <seconds>', '[deprecated: use --interval-minutes] Check interval in seconds')\n .option('--timeout <seconds>', 'Request timeout in seconds', '30')\n .option('--method <method>', 'HTTP method (GET, POST, HEAD)', 'GET')\n .option('--dry-run', 'Show what would be sent without creating')\n .action(async (options: { name: string; url: string; type: string; intervalMinutes: string; interval?: string; timeout: string; method: string; dryRun?: boolean }) => {\n const client = createAuthenticatedClient()\n\n let frequencyMinutes: number\n if (options.interval !== undefined) {\n logger.warn('--interval (seconds) is deprecated. Use --interval-minutes instead.')\n const intervalSeconds = parseIntStrict(options.interval, '--interval', { min: 60 })\n if (intervalSeconds % 60 !== 0) {\n throw new CLIError(\n `--interval must be a multiple of 60 seconds. Got ${intervalSeconds}s. Use --interval-minutes for direct minute values.`,\n ExitCode.ConfigError,\n )\n }\n frequencyMinutes = intervalSeconds / 60\n } else {\n frequencyMinutes = parseIntStrict(options.intervalMinutes, '--interval-minutes', { min: 1, max: 1440 })\n }\n\n const body: Record<string, unknown> = {\n name: options.name,\n target: options.url,\n type: options.type,\n frequencyMinutes,\n config: {\n timeout: parseIntStrict(options.timeout, '--timeout', { min: 1 }) * 1000, // API expects milliseconds\n method: options.method,\n },\n }\n\n if (options.dryRun) {\n logger.header('Dry run — monitor create payload:')\n logger.info(JSON.stringify(body, null, 2))\n return\n }\n\n const { data } = await withSpinner(\n 'Creating monitor',\n () => client.post<Record<string, unknown>>('/api/monitors', body),\n )\n logger.success(`Monitor \"${options.name}\" created (${data.id})`)\n outputDetail(data)\n })\n\nmonitorCommand\n .command('update <id>')\n .description('Update a monitor')\n .option('--name <name>', 'Monitor name')\n .option('--url <url>', 'URL to monitor')\n .option('--interval-minutes <minutes>', 'Check interval in minutes (1-1440)')\n .option('--interval <seconds>', '[deprecated: use --interval-minutes] Check interval in seconds')\n .option('--timeout <seconds>', 'Request timeout in seconds')\n .option('--method <method>', 'HTTP method')\n .option('--active <boolean>', 'Enable or disable monitor (true/false)')\n .option('--dry-run', 'Show what would be sent without updating')\n .action(async (id: string, options: { name?: string; url?: string; intervalMinutes?: string; interval?: string; timeout?: string; method?: string; active?: string; dryRun?: boolean }) => {\n const client = createAuthenticatedClient()\n\n const body: Record<string, unknown> = {}\n if (options.name !== undefined) body.name = options.name\n if (options.url !== undefined) body.target = options.url\n if (options.interval !== undefined) {\n logger.warn('--interval (seconds) is deprecated. Use --interval-minutes instead.')\n const intervalSeconds = parseIntStrict(options.interval, '--interval', { min: 60 })\n if (intervalSeconds % 60 !== 0) {\n throw new CLIError(\n `--interval must be a multiple of 60 seconds. Got ${intervalSeconds}s. Use --interval-minutes for direct minute values.`,\n ExitCode.ConfigError,\n )\n }\n body.frequencyMinutes = intervalSeconds / 60\n } else if (options.intervalMinutes !== undefined) {\n body.frequencyMinutes = parseIntStrict(options.intervalMinutes, '--interval-minutes', { min: 1, max: 1440 })\n }\n if (options.active !== undefined) body.enabled = options.active === 'true'\n\n // timeout and method go in config object\n const config: Record<string, unknown> = {}\n if (options.timeout !== undefined) config.timeout = parseIntStrict(options.timeout, '--timeout', { min: 1 }) * 1000\n if (options.method !== undefined) config.method = options.method\n if (Object.keys(config).length > 0) body.config = config\n\n if (Object.keys(body).length === 0) {\n logger.warn('No fields to update. Use --name, --url, --interval-minutes, --timeout, --method, or --active.')\n return\n }\n\n if (options.dryRun) {\n logger.header('Dry run — monitor update payload:')\n logger.info(JSON.stringify(body, null, 2))\n return\n }\n\n const { data } = await withSpinner(\n 'Updating monitor',\n () => client.patch<Record<string, unknown>>(`/api/monitors/${id}`, body),\n )\n logger.success(`Monitor ${id} updated`)\n outputDetail(data)\n })\n\nmonitorCommand\n .command('delete <id>')\n .description('Delete a monitor')\n .option('--force', 'Skip confirmation')\n .action(async (id: string, options: { force?: boolean }) => {\n if (!options.force) {\n const { confirmPrompt } = await import('../utils/prompt.js')\n const confirmed = await confirmPrompt(`Delete monitor ${id}?`, { default: false })\n if (!confirmed) {\n logger.info('Aborted')\n return\n }\n }\n\n const client = createAuthenticatedClient()\n await withSpinner(\n 'Deleting monitor',\n () => client.delete(`/api/monitors/${id}`),\n )\n logger.success(`Monitor ${id} deleted`)\n })\n","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { logger } from '../utils/logger.js'\nimport { output, outputDetail } from '../output/formatter.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { withSpinner } from '../utils/spinner.js'\n\ninterface Variable {\n id: string\n key: string\n value?: string\n isSecret: boolean\n description?: string | null\n createdAt?: string\n}\n\nexport const varCommand = new Command('var')\n .description('Manage project variables')\n\nvarCommand\n .command('list')\n .description('List all variables')\n .action(async () => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching variables',\n () => client.get<Variable[]>('/api/variables'),\n )\n\n output(data as unknown as Record<string, unknown>[], {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'key', header: 'Key' },\n { key: 'isSecret', header: 'Secret' },\n { key: 'createdAt', header: 'Created' },\n ],\n })\n })\n\nvarCommand\n .command('get <key>')\n .description('Get a variable by key name')\n .action(async (key: string) => {\n const client = createAuthenticatedClient()\n const { data: variables } = await withSpinner(\n 'Fetching variable',\n () => client.get<Variable[]>('/api/variables'),\n )\n\n const variable = variables.find((v) => v.key === key)\n if (!variable) {\n throw new CLIError(`Variable \"${key}\" not found`, ExitCode.GeneralError)\n }\n\n outputDetail(variable as unknown as Record<string, unknown>)\n })\n\nvarCommand\n .command('set <key> <value>')\n .description('Create or update a variable')\n .option('--secret', 'Mark as secret (value will be encrypted)')\n .option('--description <description>', 'Variable description')\n .action(async (key: string, value: string, options: { secret?: boolean; description?: string }) => {\n const client = createAuthenticatedClient()\n\n // Check if variable exists\n const { data: variables } = await withSpinner(\n 'Checking existing variables',\n () => client.get<Variable[]>('/api/variables'),\n )\n const existing = variables.find((v) => v.key === key)\n\n if (existing) {\n await withSpinner(\n 'Updating variable',\n () => client.put(`/api/variables/${existing.id}`, {\n key,\n value,\n isSecret: options.secret ?? existing.isSecret,\n ...(options.description !== undefined && { description: options.description }),\n }),\n )\n logger.success(`Variable \"${key}\" updated`)\n } else {\n await withSpinner(\n 'Creating variable',\n () => client.post('/api/variables', {\n key,\n value,\n isSecret: options.secret ?? false,\n ...(options.description !== undefined && { description: options.description }),\n }),\n )\n logger.success(`Variable \"${key}\" created`)\n }\n })\n\nvarCommand\n .command('delete <key>')\n .description('Delete a variable')\n .option('--force', 'Skip confirmation')\n .action(async (key: string, options: { force?: boolean }) => {\n const client = createAuthenticatedClient()\n\n const { data: variables } = await withSpinner(\n 'Fetching variables',\n () => client.get<Variable[]>('/api/variables'),\n )\n const variable = variables.find((v) => v.key === key)\n\n if (!variable) {\n throw new CLIError(`Variable \"${key}\" not found`, ExitCode.GeneralError)\n }\n\n if (!options.force) {\n const { confirmPrompt } = await import('../utils/prompt.js')\n const confirmed = await confirmPrompt(`Delete variable \"${key}\"?`, { default: false })\n if (!confirmed) {\n logger.info('Aborted')\n return\n }\n }\n\n await withSpinner(\n 'Deleting variable',\n () => client.delete(`/api/variables/${variable.id}`),\n )\n logger.success(`Variable \"${key}\" deleted`)\n })\n","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { logger } from '../utils/logger.js'\nimport { output } from '../output/formatter.js'\nimport { withSpinner } from '../utils/spinner.js'\n\nexport const tagCommand = new Command('tag')\n .description('Manage tags')\n\ntagCommand\n .command('list')\n .description('List all tags')\n .action(async () => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching tags',\n () => client.get<Record<string, unknown>[]>('/api/tags'),\n )\n\n output(data, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'name', header: 'Name' },\n { key: 'color', header: 'Color' },\n ],\n })\n })\n\ntagCommand\n .command('create <name>')\n .description('Create a new tag')\n .option('--color <color>', 'Tag color (hex)')\n .action(async (name: string, options: { color?: string }) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Creating tag',\n () => client.post<Record<string, unknown>>('/api/tags', {\n name,\n color: options.color,\n }),\n )\n\n logger.success(`Tag \"${name}\" created (${data.id})`)\n })\n\ntagCommand\n .command('delete <id>')\n .description('Delete a tag')\n .option('--force', 'Skip confirmation')\n .action(async (id: string, options: { force?: boolean }) => {\n if (!options.force) {\n const { confirmPrompt } = await import('../utils/prompt.js')\n const confirmed = await confirmPrompt(`Delete tag ${id}?`, { default: false })\n if (!confirmed) {\n logger.info('Aborted')\n return\n }\n }\n\n const client = createAuthenticatedClient()\n await withSpinner(\n 'Deleting tag',\n () => client.delete(`/api/tags/${id}`),\n )\n logger.success(`Tag ${id} deleted`)\n })\n","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { loadConfig } from '../config/loader.js'\nimport { logger } from '../utils/logger.js'\nimport {\n reconcile,\n formatChangePlan,\n} from '../utils/reconcile.js'\nimport { buildLocalResources, fetchRemoteResources } from '../utils/resources.js'\nimport { withSpinner } from '../utils/spinner.js'\n\n\nexport const diffCommand = new Command('diff')\n .description('Preview changes between local config and the remote Supercheck project')\n .option('--config <path>', 'Path to config file')\n .action(async (options: { config?: string }) => {\n const cwd = process.cwd()\n const { config } = await loadConfig({ cwd, configPath: options.config })\n const client = createAuthenticatedClient(config.api?.baseUrl)\n\n logger.newline()\n\n const { localResources, remoteResources } = await withSpinner(\n 'Comparing local and remote resources...',\n async () => {\n const local = buildLocalResources(config, cwd)\n const remote = await fetchRemoteResources(client)\n return { localResources: local, remoteResources: remote }\n },\n { successText: 'Resources compared' },\n )\n\n logger.debug(`Local: ${localResources.length} resources, Remote: ${remoteResources.length} resources`)\n\n const changes = reconcile(localResources, remoteResources)\n formatChangePlan(changes)\n })\n","import pc from 'picocolors'\nimport { logger } from './logger.js'\n\n/**\n * Represents a resource defined in the local config file.\n */\nexport interface LocalResource {\n /** Database UUID if this resource already exists on the server. Absent for new resources. */\n id?: string\n type: 'test' | 'monitor' | 'job' | 'variable' | 'tag' | 'statusPage'\n name: string\n definition: Record<string, unknown>\n}\n\n/**\n * Represents a resource fetched from the remote Supercheck API.\n */\nexport interface RemoteResource {\n id: string\n type: 'test' | 'monitor' | 'job' | 'variable' | 'tag' | 'statusPage'\n name: string\n raw: Record<string, unknown>\n}\n\nexport type ChangeAction = 'create' | 'update' | 'delete' | 'no-change'\n\nexport interface ResourceChange {\n action: ChangeAction\n type: LocalResource['type']\n id?: string\n name: string\n local?: LocalResource\n remote?: RemoteResource\n details?: string[]\n}\n\n/**\n * Compare local config resources against remote API resources\n * using id-based reconciliation.\n *\n * - Resources with an `id` in local config are matched against remote by `type:id`.\n * - Resources without an `id` in local config are treated as new (create).\n * - Remote resources whose `id` does not appear in any local resource are candidates for deletion.\n */\nexport function reconcile(\n local: LocalResource[],\n remote: RemoteResource[],\n): ResourceChange[] {\n const changes: ResourceChange[] = []\n\n // Build lookup maps by type + id\n const remoteByKey = new Map<string, RemoteResource>()\n for (const r of remote) {\n remoteByKey.set(`${r.type}:${r.id}`, r)\n }\n\n const localByKey = new Map<string, LocalResource>()\n for (const l of local) {\n if (l.id) {\n localByKey.set(`${l.type}:${l.id}`, l)\n }\n }\n\n // Detect creates and updates\n for (const l of local) {\n if (!l.id) {\n // No id = new resource to create\n changes.push({\n action: 'create',\n type: l.type,\n name: l.name,\n local: l,\n })\n continue\n }\n\n const key = `${l.type}:${l.id}`\n const r = remoteByKey.get(key)\n\n if (!r) {\n // Has id but not found on remote — treat as create (might have been deleted server-side)\n changes.push({\n action: 'create',\n type: l.type,\n id: l.id,\n name: l.name,\n local: l,\n })\n } else {\n const diffs = diffFields(l.definition, r.raw)\n if (diffs.length > 0) {\n changes.push({\n action: 'update',\n type: l.type,\n id: l.id,\n name: l.name,\n local: l,\n remote: r,\n details: diffs,\n })\n } else {\n changes.push({\n action: 'no-change',\n type: l.type,\n id: l.id,\n name: l.name,\n local: l,\n remote: r,\n })\n }\n }\n }\n\n // Detect deletes — remote resources NOT in local config\n for (const r of remote) {\n const key = `${r.type}:${r.id}`\n if (!localByKey.has(key)) {\n changes.push({\n action: 'delete',\n type: r.type,\n id: r.id,\n name: r.name,\n remote: r,\n })\n }\n }\n\n return changes\n}\n\n/**\n * Produce a stable JSON string with sorted keys to avoid false diffs\n * caused by different key insertion order in objects.\n */\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(value, (_, v) => {\n if (v && typeof v === 'object' && !Array.isArray(v)) {\n return Object.keys(v).sort().reduce<Record<string, unknown>>((sorted, k) => {\n sorted[k] = (v as Record<string, unknown>)[k]\n return sorted\n }, {})\n }\n return v\n })\n}\n\n/**\n * Shallow diff between local definition fields and remote raw fields.\n * Returns a list of human-readable change descriptions.\n */\nfunction diffFields(local: Record<string, unknown>, remote: Record<string, unknown>): string[] {\n const diffs: string[] = []\n // Only compare fields present in the local definition\n for (const [key, localVal] of Object.entries(local)) {\n // Skip internal/metadata fields\n if (['id', 'createdAt', 'updatedAt', 'projectId', 'organizationId', 'createdByUserId'].includes(key)) continue\n\n const remoteVal = remote[key]\n if (stableStringify(localVal) !== stableStringify(remoteVal)) {\n diffs.push(`${key}: ${JSON.stringify(remoteVal)} -> ${JSON.stringify(localVal)}`)\n }\n }\n return diffs\n}\n\n/**\n * Format a change plan for display in the terminal.\n */\nexport function formatChangePlan(changes: ResourceChange[]): void {\n const creates = changes.filter((c) => c.action === 'create')\n const updates = changes.filter((c) => c.action === 'update')\n const deletes = changes.filter((c) => c.action === 'delete')\n const unchanged = changes.filter((c) => c.action === 'no-change')\n\n logger.newline()\n logger.header('Change Plan')\n logger.newline()\n\n if (creates.length > 0) {\n logger.info(pc.green(` + ${creates.length} to create`))\n for (const c of creates) {\n logger.info(pc.green(` + ${c.type}/${c.name}`))\n }\n }\n\n if (updates.length > 0) {\n logger.info(pc.yellow(` ~ ${updates.length} to update`))\n for (const c of updates) {\n logger.info(pc.yellow(` ~ ${c.type}/${c.name} (${c.id})`))\n if (c.details) {\n for (const d of c.details) {\n logger.info(pc.gray(` ${d}`))\n }\n }\n }\n }\n\n if (deletes.length > 0) {\n logger.info(pc.red(` - ${deletes.length} to delete`))\n for (const c of deletes) {\n logger.info(pc.red(` - ${c.type}/${c.name} (${c.id})`))\n }\n }\n\n if (unchanged.length > 0) {\n logger.info(pc.gray(` = ${unchanged.length} unchanged`))\n }\n\n logger.newline()\n\n const totalChanges = creates.length + updates.length + deletes.length\n if (totalChanges === 0) {\n logger.success('No changes detected. Everything is in sync.')\n } else {\n logger.info(`${pc.bold(String(totalChanges))} change(s) detected.`)\n }\n logger.newline()\n}\n","import { Command } from 'commander'\nimport { renameSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { loadConfig } from '../config/loader.js'\nimport { logger } from '../utils/logger.js'\nimport {\n reconcile,\n formatChangePlan,\n type ResourceChange,\n} from '../utils/reconcile.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { buildLocalResources, fetchRemoteResources, getApiEndpoint } from '../utils/resources.js'\nimport { discoverFiles } from '../utils/discovery.js'\nimport { confirmPrompt } from '../utils/prompt.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { testRelativePath } from '../utils/paths.js'\nimport { normalizeTestTypeForApi, validateScripts, validateScriptTypeMatch } from '../utils/validation.js'\nimport pc from 'picocolors'\n\n\n/**\n * Prepare the body for API request by transforming local config shape\n * back to the raw API shape (reversing pull/normalization logic).\n */\nfunction prepareBodyForApi(type: string, body: Record<string, unknown>): Record<string, unknown> {\n const payload = { ...body }\n\n if (type === 'test') {\n // Map local testType to API \"type\"\n const normalizedType = normalizeTestTypeForApi(payload.testType)\n if (normalizedType) payload.type = normalizedType\n delete payload.testType\n }\n\n if (type === 'job') {\n // Resolve test paths back to UUIDs and wrap in {id} objects\n // API expects tests: Array<{ id: string }>, not string[]\n if (Array.isArray(payload.tests)) {\n payload.tests = (payload.tests as string[]).map((t) => {\n // Extract UUID from path: _supercheck_/homepage.019a1234-....pw.ts\n const match = /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i.exec(t)\n const id = match ? match[1] : t\n return { id }\n })\n }\n }\n\n if (type === 'statusPage') {\n // Map description back to pageDescription\n if (payload.description) {\n payload.pageDescription = payload.description\n delete payload.description\n }\n }\n\n return payload\n}\n\n/**\n * Apply a single resource change via the API.\n */\nasync function applyChange(\n client: import('../api/client.js').ApiClient,\n change: ResourceChange,\n opts: {\n testFilesByName: Map<string, string>\n },\n): Promise<{ success: boolean; error?: string }> {\n try {\n const endpoint = getApiEndpoint(change.type)\n\n switch (change.action) {\n case 'create': {\n const rawBody = { ...change.local!.definition }\n delete (rawBody as { id?: string }).id\n const body = prepareBodyForApi(change.type, rawBody)\n\n const response = await client.post(endpoint, body)\n\n if (change.type === 'test') {\n const responseBody = response.data as { test?: { id?: string; title?: string; type?: string } }\n const createdId = responseBody?.test?.id\n const createdTitle = responseBody?.test?.title ?? change.local?.definition?.title\n\n const testType = change.local?.definition?.testType === 'k6' ? 'k6' : 'playwright'\n\n if (createdId && typeof createdTitle === 'string') {\n const existingPath = opts.testFilesByName.get(change.name)\n if (existingPath) {\n const newRelPath = testRelativePath(createdId, createdTitle, testType)\n const newPath = resolve(process.cwd(), newRelPath)\n\n if (newPath !== existingPath) {\n renameSync(existingPath, newPath)\n }\n }\n }\n }\n return { success: true }\n }\n case 'update': {\n const id = change.id ?? change.remote!.id\n const rawBody = { ...change.local!.definition }\n delete (rawBody as { id?: string }).id\n const body = prepareBodyForApi(change.type, rawBody)\n await client.put(`${endpoint}/${id}`, body)\n return { success: true }\n }\n case 'delete': {\n const id = change.id ?? change.remote!.id\n await client.delete(`${endpoint}/${id}`)\n return { success: true }\n }\n default:\n return { success: true }\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { success: false, error: message }\n }\n}\n\nexport const deployCommand = new Command('deploy')\n .description('Push local config resources to the Supercheck project')\n .option('--config <path>', 'Path to config file')\n .option('--dry-run', 'Show what would change without applying')\n .option('--force', 'Skip confirmation prompt')\n .option('--no-delete', 'Do not delete remote resources missing from config')\n .action(async (options: { config?: string; dryRun?: boolean; force?: boolean; delete?: boolean }) => {\n const cwd = process.cwd()\n const { config } = await loadConfig({ cwd, configPath: options.config })\n const client = createAuthenticatedClient(config.api?.baseUrl)\n\n logger.newline()\n logger.header('Deploying from config...')\n logger.newline()\n\n const { localResources, remoteResources } = await withSpinner(\n 'Comparing local and remote resources...',\n async () => {\n const local = buildLocalResources(config, cwd)\n const remote = await fetchRemoteResources(client)\n return { localResources: local, remoteResources: remote }\n },\n { successText: 'Resources compared' },\n )\n\n let changes = reconcile(localResources, remoteResources)\n\n // Filter out deletes if --no-delete\n if (options.delete === false) {\n changes = changes.filter((c) => c.action !== 'delete')\n }\n\n const actionable = changes.filter((c) => c.action !== 'no-change')\n\n const unsupportedStatusPageMutations = actionable.filter(\n (c) => c.type === 'statusPage' && (c.action === 'create' || c.action === 'update'),\n )\n\n if (unsupportedStatusPageMutations.length > 0) {\n throw new CLIError(\n 'Status page create/update is not supported by the current API. Remove statusPages create/update changes from config (or apply them in the dashboard) and run deploy again.',\n ExitCode.ConfigError,\n )\n }\n\n if (actionable.length === 0) {\n logger.success('No changes to deploy. Everything is in sync.')\n return\n }\n\n formatChangePlan(changes)\n\n if (options.dryRun) {\n logger.info(pc.yellow('Dry run — no changes applied.'))\n return\n }\n\n // Validate test scripts before applying changes\n const testsToValidate = actionable.filter((c) => c.type === 'test' && (c.action === 'create' || c.action === 'update'))\n if (testsToValidate.length > 0) {\n await withSpinner('Validating test scripts...', async () => {\n // Fast client-side script-type mismatch detection\n for (const change of testsToValidate) {\n const script = String(change.local?.definition?.script ?? '')\n const declaredType = normalizeTestTypeForApi(change.local?.definition?.testType)\n const mismatch = validateScriptTypeMatch(script, declaredType)\n if (mismatch) {\n throw new CLIError(`${change.name}: ${mismatch}`, ExitCode.ConfigError)\n }\n }\n\n const inputs = testsToValidate.map((change) => ({\n name: change.name,\n script: String(change.local?.definition?.script ?? ''),\n testType: normalizeTestTypeForApi(change.local?.definition?.testType),\n }))\n\n const results = await validateScripts(client, inputs)\n const failures = results.filter((r) => !r.valid)\n if (failures.length > 0) {\n const details = failures.map((f) => ` - ${f.name}: ${f.error ?? 'Validation failed'}`).join('\\n')\n throw new CLIError(`Validation failed:\\n${details}`, ExitCode.ConfigError)\n }\n\n const warnings = results.filter((r) => r.warnings && r.warnings.length > 0)\n for (const warn of warnings) {\n logger.warn(`Validation warnings for ${warn.name}: ${(warn.warnings ?? []).join(', ')}`)\n }\n }, { successText: 'Test scripts validated' })\n }\n\n if (!options.force) {\n const confirmed = await confirmPrompt('Apply these changes?', { default: false })\n if (!confirmed) {\n logger.info('Deploy aborted.')\n return\n }\n }\n\n // Apply changes\n logger.info('Applying changes...')\n logger.newline()\n\n let succeeded = 0\n let failed = 0\n\n // Apply creates first, then updates, then deletes\n const ordered = [\n ...actionable.filter((c) => c.action === 'create'),\n ...actionable.filter((c) => c.action === 'update'),\n ...actionable.filter((c) => c.action === 'delete'),\n ]\n\n const testFilesByName = new Map<string, string>()\n const patterns = {\n playwright: config.tests?.playwright?.testMatch,\n k6: config.tests?.k6?.testMatch,\n }\n for (const file of discoverFiles(cwd, patterns)) {\n const key = file.relativePath.replace(/^_supercheck_\\//, '')\n testFilesByName.set(key, file.absolutePath)\n }\n\n for (const change of ordered) {\n const actionLabel = change.action === 'create' ? '+' : change.action === 'update' ? '~' : '-'\n const color = change.action === 'create' ? pc.green : change.action === 'update' ? pc.yellow : pc.red\n\n const result = await applyChange(client, change, { testFilesByName })\n\n if (result.success) {\n logger.info(color(` ${actionLabel} ${change.type}/${change.name} ✓`))\n succeeded++\n } else {\n logger.error(` ${actionLabel} ${change.type}/${change.name} ✗ ${result.error}`)\n failed++\n }\n }\n\n logger.newline()\n\n if (failed > 0) {\n throw new CLIError(\n `Deploy completed with errors: ${succeeded} succeeded, ${failed} failed`,\n ExitCode.GeneralError,\n )\n } else {\n logger.success(`Deploy complete: ${succeeded} change(s) applied successfully`)\n }\n })\n","import { testFilename } from './slug.js'\n\nexport type LocalTestType = 'playwright' | 'k6'\n\nexport function testTypeToFolder(testType: LocalTestType): string {\n return testType === 'k6' ? 'k6' : 'playwright'\n}\n\nexport function testRelativePath(\n testId: string,\n title: string,\n testType: LocalTestType,\n): string {\n const folder = testTypeToFolder(testType)\n const filename = testFilename(testId, title, testType)\n return `_supercheck_/${folder}/${filename}`\n}","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { loadConfig } from '../config/loader.js'\nimport { logger } from '../utils/logger.js'\nimport { discoverFiles } from '../utils/discovery.js'\nimport { CLIError, ExitCode, ApiRequestError } from '../utils/errors.js'\nimport { getApiEndpoint, fetchAllPages } from '../utils/resources.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { extractUuidFromFilename } from '../utils/slug.js'\nimport type { SupercheckConfig } from '../config/schema.js'\nimport pc from 'picocolors'\n\n\ninterface ManagedResource {\n id: string\n type: string\n name: string\n}\n\n/**\n * Fetch all managed resources (those whose id appears in the local config) from the API.\n * Resources without an `id` in the config are considered new (not yet deployed) and are skipped.\n */\nasync function fetchManagedResources(\n client: import('../api/client.js').ApiClient,\n config: SupercheckConfig,\n): Promise<ManagedResource[]> {\n const resources: ManagedResource[] = []\n\n // Collect ids from config to know what's managed\n const managedIds = new Set<string>()\n\n if (config.jobs) {\n for (const j of config.jobs) {\n if (j.id) managedIds.add(`job:${j.id}`)\n }\n }\n if (config.variables) {\n for (const v of config.variables) {\n if (v.id) managedIds.add(`variable:${v.id}`)\n }\n }\n if (config.tags) {\n for (const t of config.tags) {\n if (t.id) managedIds.add(`tag:${t.id}`)\n }\n }\n if (Array.isArray(config.monitors)) {\n for (const m of config.monitors) {\n if (m.id) managedIds.add(`monitor:${m.id}`)\n }\n }\n if (Array.isArray(config.statusPages)) {\n for (const sp of config.statusPages) {\n if (sp.id) managedIds.add(`statusPage:${sp.id}`)\n }\n }\n\n // Discover test files — extract UUIDs from filenames to match remote tests by id.\n // Files are named `{slug}.{uuid}.pw.ts` / `{slug}.{uuid}.k6.ts` after `supercheck pull`.\n // Also supports legacy `{uuid}.pw.ts` format.\n const patterns = {\n playwright: config.tests?.playwright?.testMatch,\n k6: config.tests?.k6?.testMatch,\n }\n const cwd = process.cwd()\n const files = discoverFiles(cwd, patterns)\n const testIds = new Set<string>()\n for (const f of files) {\n const uuid = extractUuidFromFilename(f.filename)\n if (uuid) {\n testIds.add(uuid)\n }\n }\n\n // Fetch remote resources and filter to managed ones\n try {\n const jobs = await fetchAllPages<Record<string, unknown>>(client, '/api/jobs', 'jobs')\n for (const job of jobs) {\n if (job.id && managedIds.has(`job:${String(job.id)}`)) {\n resources.push({ id: String(job.id), type: 'job', name: String(job.name ?? '') })\n }\n }\n } catch (err) { logDestroyFetchError('jobs', err) }\n\n try {\n const tests = await fetchAllPages<Record<string, unknown>>(client, '/api/tests', 'tests')\n for (const test of tests) {\n // Match by database id — local test files are named `{uuid}.pw.ts`\n if (test.id && testIds.has(String(test.id))) {\n resources.push({ id: String(test.id), type: 'test', name: String(test.title ?? '') })\n }\n }\n } catch (err) { logDestroyFetchError('tests', err) }\n\n try {\n const monitors = await fetchAllPages<Record<string, unknown>>(client, '/api/monitors', 'monitors')\n for (const monitor of monitors) {\n if (monitor.id && managedIds.has(`monitor:${String(monitor.id)}`)) {\n resources.push({ id: String(monitor.id), type: 'monitor', name: String(monitor.name ?? '') })\n }\n }\n } catch (err) { logDestroyFetchError('monitors', err) }\n\n try {\n const { data } = await client.get<Array<Record<string, unknown>>>('/api/variables')\n for (const v of data) {\n if (v.id && managedIds.has(`variable:${String(v.id)}`)) {\n resources.push({ id: String(v.id), type: 'variable', name: String(v.key ?? '') })\n }\n }\n } catch (err) { logDestroyFetchError('variables', err) }\n\n try {\n const { data } = await client.get<Array<Record<string, unknown>>>('/api/tags')\n for (const t of data) {\n if (t.id && managedIds.has(`tag:${String(t.id)}`)) {\n resources.push({ id: String(t.id), type: 'tag', name: String(t.name ?? '') })\n }\n }\n } catch (err) { logDestroyFetchError('tags', err) }\n\n try {\n const statusPages = await fetchAllPages<Record<string, unknown>>(client, '/api/status-pages', 'status-pages')\n for (const sp of statusPages) {\n if (sp.id && managedIds.has(`statusPage:${String(sp.id)}`)) {\n resources.push({ id: String(sp.id), type: 'statusPage', name: String(sp.name ?? '') })\n }\n }\n } catch (err) { logDestroyFetchError('status-pages', err) }\n\n return resources\n}\n\n/**\n * Log fetch errors with appropriate severity for the destroy command.\n */\nfunction logDestroyFetchError(resourceType: string, err: unknown): void {\n if (err instanceof ApiRequestError && err.statusCode === 404) {\n logger.debug(`Could not fetch ${resourceType} (not found)`)\n } else {\n const msg = err instanceof Error ? err.message : String(err)\n logger.warn(`Could not fetch ${resourceType}: ${msg}`)\n }\n}\n\nexport const destroyCommand = new Command('destroy')\n .description('Tear down managed resources from the Supercheck project')\n .option('--config <path>', 'Path to config file')\n .option('--dry-run', 'Show what would be destroyed without applying')\n .option('--force', 'Skip confirmation prompt')\n .action(async (options: { config?: string; dryRun?: boolean; force?: boolean }) => {\n const cwd = process.cwd()\n const { config } = await loadConfig({ cwd, configPath: options.config })\n const client = createAuthenticatedClient(config.api?.baseUrl)\n\n logger.newline()\n\n const managed = await withSpinner(\n 'Scanning for managed resources...',\n () => fetchManagedResources(client, config),\n { successText: 'Scan complete' },\n )\n\n if (managed.length === 0) {\n logger.success('No managed resources found on the remote project.')\n return\n }\n\n logger.header('Resources to destroy:')\n logger.newline()\n for (const r of managed) {\n logger.info(pc.red(` - ${r.type}/${r.name} [${r.id}]`))\n }\n logger.newline()\n logger.warn(`This will permanently delete ${pc.bold(String(managed.length))} resource(s).`)\n logger.newline()\n\n if (options.dryRun) {\n logger.info(pc.yellow('Dry run — no resources destroyed.'))\n return\n }\n\n if (!options.force) {\n throw new CLIError(\n 'Use --force to confirm destruction, or --dry-run to preview.',\n ExitCode.GeneralError,\n )\n }\n\n logger.info('Destroying resources...')\n logger.newline()\n\n let succeeded = 0\n let failed = 0\n\n // Delete in reverse dependency order:\n // Jobs reference tests, so jobs must be deleted first to unblock test deletion.\n // Monitors and status pages are independent, then vars/tags last.\n const deleteOrder = ['statusPage', 'job', 'monitor', 'variable', 'tag', 'test']\n const sorted = [...managed].sort((a, b) => deleteOrder.indexOf(a.type) - deleteOrder.indexOf(b.type))\n\n for (const resource of sorted) {\n try {\n const endpoint = getApiEndpoint(resource.type)\n await client.delete(`${endpoint}/${resource.id}`)\n logger.info(pc.red(` - ${resource.type}/${resource.name} ✓`))\n succeeded++\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n logger.error(` - ${resource.type}/${resource.name} ✗ ${msg}`)\n failed++\n }\n }\n\n logger.newline()\n\n if (failed > 0) {\n throw new CLIError(\n `Destroy completed with errors: ${succeeded} destroyed, ${failed} failed`,\n ExitCode.GeneralError,\n )\n } else {\n logger.success(`Destroy complete: ${succeeded} resource(s) removed`)\n }\n })\n","import { Command } from 'commander'\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, unlinkSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { tryLoadConfig } from '../config/loader.js'\nimport { getStoredBaseUrl, getStoredOrganization, getStoredProject } from '../auth/store.js'\nimport { logger } from '../utils/logger.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { CLIError, ExitCode, ApiRequestError } from '../utils/errors.js'\nimport { fetchAllPages } from '../utils/resources.js'\nimport { detectPackageManager, ensurePackageJson, installDependencies } from '../utils/package-manager.js'\nimport { extractUuidFromFilename } from '../utils/slug.js'\nimport { testRelativePath, testTypeToFolder } from '../utils/paths.js'\n\nimport pc from 'picocolors'\nimport type { ApiClient } from '../api/client.js'\n\n// ────────────────────────────────────────────────────────────────\n// Types for fetched remote resources\n// ────────────────────────────────────────────────────────────────\n\ninterface RemoteTest {\n id: string\n title: string\n description?: string\n type: string // 'browser' | 'performance' | 'api' etc.\n priority?: string\n script?: string\n tags?: Array<{ id: string; name: string; color?: string }>\n createdAt?: string\n updatedAt?: string\n}\n\ninterface RemoteMonitor {\n id: string\n name: string\n description?: string\n type: string // 'http_request' | 'website' | 'ping_host' | 'port_check' | 'synthetic_test'\n target?: string\n frequencyMinutes?: number\n enabled?: boolean\n status?: string\n config?: Record<string, unknown>\n alertConfig?: Record<string, unknown>\n organizationId?: string\n projectId?: string\n createdAt?: string\n updatedAt?: string\n}\n\ninterface RemoteJob {\n id: string\n name: string\n description?: string\n jobType?: string\n cronSchedule?: string\n status?: string\n alertConfig?: Record<string, unknown>\n tests?: Array<{ id: string; title?: string; type?: string }>\n lastRunAt?: string\n nextRunAt?: string\n createdAt?: string\n updatedAt?: string\n}\n\ninterface RemoteVariable {\n id: string\n key: string\n value?: string\n isSecret: boolean\n description?: string | null\n}\n\ninterface RemoteTag {\n id: string\n name: string\n color?: string\n}\n\ninterface RemoteStatusPage {\n id: string\n name: string\n subdomain?: string\n status?: string\n pageDescription?: string\n headline?: string\n supportUrl?: string\n allowEmailSubscribers?: boolean\n allowWebhookSubscribers?: boolean\n allowRssFeed?: boolean\n cssBodyBackgroundColor?: string\n cssFontColor?: string\n cssGreens?: string\n cssReds?: string\n createdAt?: string\n updatedAt?: string\n}\n\ninterface RemoteContext {\n organization: { id: string; name: string | null; slug: string | null }\n project: { id: string; name: string; slug: string | null; isDefault: boolean }\n}\n\ninterface PullSummary {\n tests: number\n monitors: number\n jobs: number\n variables: number\n tags: number\n statusPages: number\n skipped: number\n errors: string[]\n}\n\n// ────────────────────────────────────────────────────────────────\n// Helpers\n// ────────────────────────────────────────────────────────────────\n\n/**\n * Map API test type back to user-facing type name.\n */\nfunction mapTestType(apiType: string): 'playwright' | 'k6' {\n if (apiType === 'performance' || apiType === 'k6') return 'k6'\n return 'playwright'\n}\n\n// testFilename and extractUuidFromFilename are imported from '../utils/slug.js'\n\n/**\n * Write a file only if the content has changed, avoiding unnecessary git diffs.\n * Returns true if the file was written (new or changed), false if unchanged.\n */\nfunction writeIfChanged(filePath: string, content: string): boolean {\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, 'utf-8')\n if (existing === content) return false\n }\n\n const dir = dirname(filePath)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n\n writeFileSync(filePath, content, 'utf-8')\n return true\n}\n\n/**\n * Decode a base64-encoded script, with fallback to raw string.\n *\n * Uses a round-trip verification: decode from base64, then re-encode and compare\n * against the original (ignoring trailing whitespace/padding). This prevents\n * false positives where plain text that happens to be valid base64 is silently\n * corrupted.\n */\nfunction decodeScript(script: string | undefined): string | null {\n if (!script) return null\n\n // Try base64 first — scripts from the API are typically base64-encoded\n try {\n const trimmed = script.trim()\n const decoded = Buffer.from(trimmed, 'base64').toString('utf-8')\n\n // Round-trip check: re-encode and verify it matches the original.\n // This catches plain-text strings that Node's lenient base64 parser\n // would silently \"decode\" into garbage.\n const reEncoded = Buffer.from(decoded, 'utf-8').toString('base64')\n if (reEncoded !== trimmed) {\n // Not genuine base64 — return the original script as-is\n return script\n }\n\n // Validate that the decoded content looks like text/code (not garbled binary)\n const isTextLike =\n decoded.length > 0 &&\n Array.from(decoded).every((char) => {\n const code = char.codePointAt(0) ?? 0\n return code === 0x09 || code === 0x0a || code === 0x0d || code >= 0x20\n })\n\n if (isTextLike) {\n return decoded\n }\n } catch {\n // Not valid base64 — treat as raw\n }\n\n return script\n}\n\n// ────────────────────────────────────────────────────────────────\n// Fetch functions\n// ────────────────────────────────────────────────────────────────\n\nasync function fetchContext(client: ApiClient): Promise<RemoteContext | null> {\n try {\n const { data } = await client.get<{ success: boolean } & RemoteContext>('/api/context')\n // Validate that we got meaningful data\n if (data?.organization?.id && data?.project?.id) {\n return data\n }\n logger.debug('Context response missing organization or project ID')\n return null\n } catch (err) {\n logger.warn(`Could not fetch project context: ${err instanceof Error ? err.message : String(err)}`)\n logger.debug('Organization and project will be set to placeholder values. Re-run after fixing connectivity.')\n return null\n }\n}\n\nasync function fetchTests(client: ApiClient): Promise<RemoteTest[]> {\n try {\n return await fetchAllPages<RemoteTest>(client, '/api/tests', 'tests')\n } catch (err) {\n if (err instanceof ApiRequestError && err.statusCode === 404) return []\n throw err\n }\n}\n\nasync function fetchMonitors(client: ApiClient): Promise<RemoteMonitor[]> {\n try {\n return await fetchAllPages<RemoteMonitor>(client, '/api/monitors', 'monitors')\n } catch (err) {\n if (err instanceof ApiRequestError && err.statusCode === 404) return []\n throw err\n }\n}\n\nasync function fetchJobs(client: ApiClient): Promise<RemoteJob[]> {\n try {\n return await fetchAllPages<RemoteJob>(client, '/api/jobs', 'jobs')\n } catch (err) {\n if (err instanceof ApiRequestError && err.statusCode === 404) return []\n throw err\n }\n}\n\nasync function fetchVariables(client: ApiClient): Promise<RemoteVariable[]> {\n try {\n const { data } = await client.get<RemoteVariable[]>('/api/variables')\n return data\n } catch (err) {\n if (err instanceof ApiRequestError && err.statusCode === 404) return []\n throw err\n }\n}\n\nasync function fetchTags(client: ApiClient): Promise<RemoteTag[]> {\n try {\n const { data } = await client.get<RemoteTag[]>('/api/tags')\n return data\n } catch (err) {\n if (err instanceof ApiRequestError && err.statusCode === 404) return []\n throw err\n }\n}\n\nasync function fetchStatusPages(client: ApiClient): Promise<RemoteStatusPage[]> {\n try {\n return await fetchAllPages<RemoteStatusPage>(client, '/api/status-pages', 'status-pages')\n } catch (err) {\n if (err instanceof ApiRequestError && err.statusCode === 404) return []\n throw err\n }\n}\n\n// ────────────────────────────────────────────────────────────────\n// Writers — write remote resources to local files\n// ────────────────────────────────────────────────────────────────\n\n/**\n * Pull test scripts into _supercheck_/ directory.\n * Each test is saved as a {slug}.{uuid}.pw.ts or {slug}.{uuid}.k6.ts file.\n */\nfunction pullTests(tests: RemoteTest[], cwd: string, summary: PullSummary): void {\n const baseDir = resolve(cwd, '_supercheck_')\n if (!existsSync(baseDir)) {\n mkdirSync(baseDir, { recursive: true })\n }\n\n // Build a map of existing UUID → filename for rename detection.\n // When a test is renamed on the server, we replace the old file\n // (with the old slug) instead of leaving an orphan.\n const existingByUuid = new Map<string, string>()\n try {\n for (const folder of ['playwright', 'k6']) {\n const folderPath = resolve(baseDir, folder)\n if (!existsSync(folderPath)) continue\n for (const file of readdirSync(folderPath)) {\n const uuid = extractUuidFromFilename(file)\n if (uuid) existingByUuid.set(uuid, `${folder}/${file}`)\n }\n }\n } catch {\n // Directory may not exist yet — that's fine\n }\n\n for (const test of tests) {\n try {\n const testType = mapTestType(test.type)\n const relPath = testRelativePath(test.id, test.title, testType)\n const folderPath = resolve(baseDir, testTypeToFolder(testType))\n if (!existsSync(folderPath)) {\n mkdirSync(folderPath, { recursive: true })\n }\n\n let script = decodeScript(test.script)\n if (!script) {\n logger.debug(`Skipping test \"${test.title}\" — no script content`)\n summary.skipped++\n continue\n }\n\n // Inject/Update @title metadata to preserve human-readable name in local file\n // Prefer JSDoc injection if a block exists, otherwise use single-line comment\n if (/@title\\s+/.test(script)) {\n // Update existing @title (works for both // @title and * @title)\n script = script.replace(/(@title\\s+)(.+?)(\\r?\\n|\\*\\/|$)/, `$1${test.title}$3`)\n } else if (/\\/\\*\\*([\\s\\S]*?)\\*\\//.test(script)) {\n // Inject into existing JSDoc\n script = script.replace(/(\\/\\*\\*)/, `$1\\n * @title ${test.title}`)\n } else {\n // No JSDoc or existing title, prepend // @title\n script = `// @title ${test.title}\\n\\n${script}`\n }\n\n // Clean up old file if UUID exists but filename changed (e.g., test renamed)\n const existingFilename = existingByUuid.get(test.id)\n const currentFile = relPath.replace(/^_supercheck_\\//, '')\n if (existingFilename && existingFilename !== currentFile) {\n const oldPath = resolve(baseDir, existingFilename)\n try {\n unlinkSync(oldPath)\n logger.debug(` Renamed: ${existingFilename} → ${currentFile}`)\n } catch {\n // Old file may have been manually deleted — ignore\n }\n }\n\n const filePath = resolve(cwd, relPath)\n const written = writeIfChanged(filePath, script)\n\n if (written) {\n logger.info(pc.green(` + ${relPath}`))\n summary.tests++\n } else {\n logger.debug(` = ${relPath} (unchanged)`)\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n summary.errors.push(`test \"${test.title}\": ${msg}`)\n }\n }\n}\n\n/**\n * Build monitor definitions from remote data.\n * Produces a clean config by removing defaults and runtime-only fields\n * while keeping field names compatible with the API for round-trip support.\n */\nfunction buildMonitorDefinitions(\n monitors: RemoteMonitor[],\n): Record<string, unknown>[] {\n return monitors.map((m) => {\n const def: Record<string, unknown> = {\n id: m.id,\n name: m.name,\n type: m.type,\n }\n\n if (m.description) def.description = m.description\n if (m.target) def.target = m.target\n if (m.frequencyMinutes !== undefined) def.frequencyMinutes = m.frequencyMinutes\n if (m.enabled !== undefined) def.enabled = m.enabled\n\n // Pass config through, stripping only runtime/default noise\n if (m.config && typeof m.config === 'object') {\n const config = { ...m.config } as Record<string, unknown>\n\n // Remove runtime-only fields\n delete config.sslLastCheckedAt\n delete config.aggregatedAlertState\n\n // Clean up default playwrightOptions (retries:0, timeout:300000, headless:true)\n if (config.playwrightOptions && typeof config.playwrightOptions === 'object') {\n const opts = { ...(config.playwrightOptions as Record<string, unknown>) }\n if (opts.retries === 0) delete opts.retries\n if (opts.timeout === 300000) delete opts.timeout\n if (opts.headless === true) delete opts.headless\n config.playwrightOptions = Object.keys(opts).length > 0 ? opts : undefined\n if (!config.playwrightOptions) delete config.playwrightOptions\n }\n\n // Clean up locationConfig: remove defaults, drop if empty/disabled\n if (config.locationConfig && typeof config.locationConfig === 'object') {\n const loc = { ...(config.locationConfig as Record<string, unknown>) }\n const hasLocations = Array.isArray(loc.locations) && (loc.locations as string[]).length > 0\n if (!loc.enabled || !hasLocations) {\n // Disabled or no locations — remove entirely\n delete config.locationConfig\n } else {\n // Remove default values to reduce noise\n if (loc.enabled === true) delete loc.enabled\n if (loc.strategy === 'majority') delete loc.strategy\n if (loc.threshold === 50) delete loc.threshold\n config.locationConfig = Object.keys(loc).length > 0 ? loc : undefined\n if (!config.locationConfig) delete config.locationConfig\n }\n }\n\n if (Object.keys(config).length > 0) def.config = config\n }\n\n // Pass alertConfig through, stripping only defaults\n if (m.alertConfig && typeof m.alertConfig === 'object') {\n const alert = { ...m.alertConfig } as Record<string, unknown>\n\n // Remove empty/default values\n if (alert.customMessage === '' || alert.customMessage === null) delete alert.customMessage\n if (alert.failureThreshold === 1) delete alert.failureThreshold\n if (alert.recoveryThreshold === 1) delete alert.recoveryThreshold\n\n // Remove false boolean flags (they're defaults)\n for (const key of ['alertOnFailure', 'alertOnRecovery', 'alertOnSslExpiration', 'alertOnSuccess', 'alertOnTimeout']) {\n if (alert[key] === false) delete alert[key]\n }\n\n // Remove empty notificationProviders array\n if (Array.isArray(alert.notificationProviders) && (alert.notificationProviders as string[]).length === 0) {\n delete alert.notificationProviders\n }\n\n if (Object.keys(alert).length > 0) def.alertConfig = alert\n }\n\n return def\n })\n}\n\n/**\n * Build job definitions from remote data.\n * testMap resolves test UUIDs to file paths for human-readable references.\n * Omits runtime state (status) and cleans up alertConfig defaults.\n */\nfunction buildJobDefinitions(\n jobs: RemoteJob[],\n testMap: Map<string, string>,\n): Record<string, unknown>[] {\n return jobs.map((j) => {\n const def: Record<string, unknown> = {\n id: j.id,\n name: j.name,\n tests: (j.tests ?? []).map((t) => {\n // Resolve test UUID to file path if available, otherwise keep UUID\n return testMap.get(t.id) ?? t.id\n }),\n }\n\n if (j.description) def.description = j.description\n if (j.jobType) def.jobType = j.jobType\n if (j.cronSchedule) def.cronSchedule = j.cronSchedule\n // Note: `status` is intentionally omitted — it's runtime state, not config\n\n // Pass alertConfig through, stripping only defaults\n if (j.alertConfig && typeof j.alertConfig === 'object') {\n const alert = { ...j.alertConfig } as Record<string, unknown>\n\n // Remove empty/default values\n if (alert.customMessage === '' || alert.customMessage === null) delete alert.customMessage\n if (alert.failureThreshold === 1) delete alert.failureThreshold\n if (alert.recoveryThreshold === 1) delete alert.recoveryThreshold\n\n // Remove false boolean flags (they're defaults)\n for (const key of ['alertOnFailure', 'alertOnRecovery', 'alertOnSslExpiration', 'alertOnSuccess', 'alertOnTimeout']) {\n if (alert[key] === false) delete alert[key]\n }\n\n // Remove empty notificationProviders array\n if (Array.isArray(alert.notificationProviders) && (alert.notificationProviders as string[]).length === 0) {\n delete alert.notificationProviders\n }\n\n if (Object.keys(alert).length > 0) def.alertConfig = alert\n }\n\n return def\n })\n}\n\n/**\n * Build variable definitions from remote data.\n * Secret values are never written to config.\n */\nfunction buildVariableDefinitions(variables: RemoteVariable[]): Record<string, unknown>[] {\n return variables.map((v) => {\n const def: Record<string, unknown> = {\n id: v.id,\n key: v.key,\n isSecret: v.isSecret,\n }\n\n if (v.description) def.description = v.description\n\n if (v.isSecret) {\n // SECURITY: Never write secret values to config files.\n // Use environment variables or `supercheck var set` for secret values.\n const envVarName = v.key.toUpperCase()\n // Use bracket notation for names that aren't valid JS identifiers\n // (e.g. keys containing dashes, dots, spaces, or starting with digits)\n const isValidIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(envVarName)\n def.value = isValidIdentifier\n ? `\\${${envVarName}}`\n : `\\${[${envVarName}]}`\n } else {\n def.value = v.value ?? ''\n }\n\n return def\n })\n}\n\n/**\n * Build tag definitions from remote data.\n */\nfunction buildTagDefinitions(tags: RemoteTag[]): Record<string, unknown>[] {\n return tags.map((t) => {\n const def: Record<string, unknown> = {\n id: t.id,\n name: t.name,\n }\n if (t.color) def.color = t.color\n return def\n })\n}\n\n/**\n * Build status page definitions from remote data.\n * Keeps essential config only — branding and styling are managed via the dashboard.\n */\nfunction buildStatusPageDefinitions(pages: RemoteStatusPage[]): Record<string, unknown>[] {\n return pages.map((p) => {\n const def: Record<string, unknown> = {\n id: p.id,\n name: p.name,\n }\n\n if (p.subdomain) def.subdomain = p.subdomain\n if (p.status) def.status = p.status\n if (p.pageDescription) def.description = p.pageDescription\n if (p.headline) def.headline = p.headline\n if (p.supportUrl) def.supportUrl = p.supportUrl\n\n // Note: branding (colors, fonts) is intentionally omitted —\n // visual customization is better managed via the dashboard.\n\n return def\n })\n}\n\n// ────────────────────────────────────────────────────────────────\n// Config generator\n// ────────────────────────────────────────────────────────────────\n\n/**\n * Generate a supercheck.config.ts file from pulled remote resources.\n */\nfunction generateConfigContent(opts: {\n orgId: string\n projectId: string\n baseUrl: string\n monitors: Record<string, unknown>[]\n jobs: Record<string, unknown>[]\n variables: Record<string, unknown>[]\n tags: Record<string, unknown>[]\n statusPages: Record<string, unknown>[]\n}): string {\n const parts: string[] = []\n\n parts.push(`import { defineConfig } from '@supercheck/cli'`)\n parts.push('')\n parts.push('export default defineConfig({')\n parts.push(` schemaVersion: '1.0',`)\n parts.push('')\n\n // Project\n parts.push(' // Project identifiers — found in Dashboard > Project Settings')\n parts.push(' project: {')\n parts.push(` organization: '${opts.orgId}',`)\n parts.push(` project: '${opts.projectId}',`)\n parts.push(' },')\n parts.push('')\n\n // API\n parts.push(' // API connection — set SUPERCHECK_URL env var for self-hosted or staging')\n parts.push(' api: {')\n parts.push(` baseUrl: process.env.SUPERCHECK_URL ?? '${opts.baseUrl}',`)\n parts.push(' },')\n parts.push('')\n\n // Tests\n parts.push(' // Test file patterns — Playwright (.pw.ts) and k6 (.k6.ts) scripts')\n parts.push(' tests: {')\n parts.push(' playwright: {')\n parts.push(` testMatch: '_supercheck_/playwright/**/*.pw.ts',`)\n parts.push(' },')\n parts.push(' k6: {')\n parts.push(` testMatch: '_supercheck_/k6/**/*.k6.ts',`)\n parts.push(' },')\n parts.push(' },')\n\n // Monitors\n if (opts.monitors.length > 0) {\n parts.push('')\n parts.push(' // Monitors — uptime checks, HTTP requests, synthetic tests')\n parts.push(` monitors: ${formatArray(opts.monitors, 2)},`)\n }\n\n // Jobs\n if (opts.jobs.length > 0) {\n parts.push('')\n parts.push(' // Jobs — scheduled or triggered test execution groups')\n parts.push(` jobs: ${formatArray(opts.jobs, 2)},`)\n }\n\n // Variables\n if (opts.variables.length > 0) {\n parts.push('')\n parts.push(' // Variables — key-value pairs available to tests at runtime')\n parts.push(' // Secret values use process.env references — set them in your shell or CI/CD')\n parts.push(` variables: ${formatArray(opts.variables, 2)},`)\n }\n\n // Tags\n if (opts.tags.length > 0) {\n parts.push('')\n parts.push(' // Tags — labels for organizing tests, monitors, and jobs')\n parts.push(` tags: ${formatArray(opts.tags, 2)},`)\n }\n\n // Status Pages\n if (opts.statusPages.length > 0) {\n parts.push('')\n parts.push(' // Status Pages — public dashboards showing monitor health')\n parts.push(` statusPages: ${formatArray(opts.statusPages, 2)},`)\n }\n\n parts.push('})')\n parts.push('')\n\n // Footer comment with getting started guide and CLI commands\n parts.push('/**')\n parts.push(' * Supercheck — Getting Started')\n parts.push(' * ────────────────────────────────────────────────────────────────')\n parts.push(' *')\n parts.push(' * This file was generated by `supercheck pull`. It is the source of truth')\n parts.push(' * for your Supercheck project configuration.')\n parts.push(' *')\n parts.push(' * Getting Started:')\n parts.push(' * 1. Install dependencies:')\n parts.push(' * npm install -D @supercheck/cli typescript @types/node')\n parts.push(' * # If using Playwright tests, also install:')\n parts.push(' * npm install -D @playwright/test')\n parts.push(' * # If using k6 tests, also install types and k6 runtime:')\n parts.push(' * npm install -D @types/k6')\n parts.push(' * # Install k6 runtime: https://grafana.com/docs/k6/latest/set-up/install-k6/')\n parts.push(' *')\n parts.push(' * 2. Review the configuration above and make any changes you need.')\n parts.push(' * 3. Preview what will change: npx supercheck diff')\n parts.push(' * 4. Deploy your changes: npx supercheck deploy')\n parts.push(' * 5. Re-sync from cloud: npx supercheck pull')\n parts.push(' *')\n parts.push(' * CLI Commands:')\n parts.push(' * supercheck pull Pull remote config & test scripts to local')\n parts.push(' * supercheck diff Compare local config vs remote')\n parts.push(' * supercheck deploy Deploy local config to the cloud')\n parts.push(' * supercheck destroy Remove all managed resources from the cloud')\n parts.push(' *')\n parts.push(' * supercheck test list List all tests')\n parts.push(' * supercheck test validate Validate a local test script')\n parts.push(' * supercheck test run --local Run local test scripts')\n parts.push(' *')\n parts.push(' * supercheck monitor list List all monitors')\n parts.push(' * supercheck job list List all jobs')\n parts.push(' * supercheck job run --id <id> Run a job immediately')\n parts.push(' *')\n parts.push(' * supercheck config validate Validate this config file')\n parts.push(' * supercheck health Check API connectivity')\n parts.push(' * supercheck whoami Show current authentication info')\n parts.push(' *')\n parts.push(' * CI/CD Integration:')\n parts.push(' * Set the SUPERCHECK_TOKEN environment variable in your CI/CD pipeline')\n parts.push(' * and run `supercheck deploy` to push changes automatically.')\n parts.push(' *')\n parts.push(` * Documentation: https://supercheck.io/docs/app/welcome`)\n parts.push(' */')\n parts.push('')\n\n return parts.join('\\n')\n}\n\n/**\n * Format an array of objects as indented TypeScript-like syntax.\n */\nfunction formatArray(arr: Record<string, unknown>[], baseIndent: number): string {\n const indent = ' '.repeat(baseIndent)\n const innerIndent = ' '.repeat(baseIndent + 1)\n\n if (arr.length === 0) return '[]'\n\n const items = arr.map((obj) => {\n const fields = Object.entries(obj)\n .map(([key, value]) => `${innerIndent} ${key}: ${formatValue(value, baseIndent + 2)},`)\n .join('\\n')\n return `${innerIndent}{\\n${fields}\\n${innerIndent}}`\n })\n\n return `[\\n${items.join(',\\n')}\\n${indent}]`\n}\n\n/**\n * Format a value for TypeScript source output.\n * Produces clean, readable TS syntax (not JSON.stringify).\n */\nfunction formatValue(value: unknown, indent = 0): string {\n if (typeof value === 'string') {\n // Check if it's an env var reference like ${VAR_NAME} or ${[VAR-NAME]}\n if (value.startsWith('${') && value.endsWith('}')) {\n const inner = value.slice(2, -1)\n // Bracket-notation reference: ${[VAR-NAME]} → process.env['VAR-NAME']\n if (inner.startsWith('[') && inner.endsWith(']')) {\n const varName = inner.slice(1, -1)\n return `process.env['${varName.replace(/'/g, \"\\\\'\")}'] ?? ''`\n }\n return `process.env.${inner} ?? ''`\n }\n return `'${value.replace(/'/g, \"\\\\'\")}'`\n }\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n if (value === null || value === undefined) return 'undefined'\n if (Array.isArray(value)) {\n if (value.length === 0) return '[]'\n if (value.every((v) => typeof v === 'string')) {\n return `[${value.map((v) => `'${String(v).replace(/'/g, \"\\\\'\")}'`).join(', ')}]`\n }\n // Array of objects or mixed\n const innerIndent = ' '.repeat(indent + 1)\n const items = value.map((v) => `${innerIndent}${formatValue(v, indent + 1)}`)\n return `[\\n${items.join(',\\n')}\\n${' '.repeat(indent)}]`\n }\n if (typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n if (entries.length === 0) return '{}'\n const innerIndent = ' '.repeat(indent + 1)\n const fields = entries\n .map(([key, v]) => `${innerIndent}${key}: ${formatValue(v, indent + 1)}`)\n .join(',\\n')\n return `{\\n${fields},\\n${' '.repeat(indent)}}`\n }\n return String(value)\n}\n\n// ────────────────────────────────────────────────────────────────\n// Pull Command\n// ────────────────────────────────────────────────────────────────\n\nexport const pullCommand = new Command('pull')\n .description('Pull tests, monitors, jobs, status pages, and config from the Supercheck cloud into the local project')\n .option('--config <path>', 'Path to config file')\n .option('--force', 'Overwrite existing local files without prompting')\n .option('--tests-only', 'Only pull test scripts')\n .option('--config-only', 'Only pull config (monitors, jobs, variables, tags, status pages)')\n .option('--dry-run', 'Show what would be pulled without writing files')\n .action(async (options: {\n config?: string\n force?: boolean\n testsOnly?: boolean\n configOnly?: boolean\n dryRun?: boolean\n }) => {\n // Validate mutually exclusive flags\n if (options.testsOnly && options.configOnly) {\n throw new CLIError(\n '--tests-only and --config-only are mutually exclusive. Use one or neither.',\n ExitCode.ConfigError,\n )\n }\n\n const cwd = process.cwd()\n\n // Try loading existing config for baseUrl context\n const existing = await tryLoadConfig({ cwd, configPath: options.config })\n\n const client = createAuthenticatedClient(existing?.config?.api?.baseUrl)\n\n logger.newline()\n logger.header('Pulling from Supercheck cloud...')\n logger.newline()\n\n // ── Fetch project/org context and all remote resources in parallel ──\n const [context, tests, monitors, jobs, variables, tags, statusPages] = await withSpinner(\n 'Fetching remote resources...',\n async () => {\n const results = await Promise.all([\n fetchContext(client),\n options.configOnly ? Promise.resolve([]) : fetchTests(client),\n options.testsOnly ? Promise.resolve([]) : fetchMonitors(client),\n options.testsOnly ? Promise.resolve([]) : fetchJobs(client),\n options.testsOnly ? Promise.resolve([]) : fetchVariables(client),\n options.testsOnly ? Promise.resolve([]) : fetchTags(client),\n options.testsOnly ? Promise.resolve([]) : fetchStatusPages(client),\n ])\n return results as [RemoteContext | null, RemoteTest[], RemoteMonitor[], RemoteJob[], RemoteVariable[], RemoteTag[], RemoteStatusPage[]]\n },\n { successText: 'Fetched remote resources' },\n )\n\n logger.debug(`Found: ${tests.length} tests, ${monitors.length} monitors, ${jobs.length} jobs, ${variables.length} variables, ${tags.length} tags, ${statusPages.length} status pages`)\n\n const totalResources = tests.length + monitors.length + jobs.length + variables.length + tags.length + statusPages.length\n if (totalResources === 0) {\n logger.warn('No resources found on the remote project.')\n logger.info('Hint: Create tests and monitors in the Supercheck dashboard, then run `supercheck pull` again.')\n return\n }\n\n // ── Dry run summary ──\n if (options.dryRun) {\n logger.newline()\n logger.header('Resources that would be pulled:')\n logger.newline()\n\n if (tests.length > 0) {\n logger.info(pc.cyan(` Tests (${tests.length}):`))\n for (const t of tests) {\n const testType = mapTestType(t.type)\n logger.info(` ${t.title} (${testType})`)\n }\n }\n if (monitors.length > 0) {\n logger.info(pc.cyan(` Monitors (${monitors.length}):`))\n for (const m of monitors) logger.info(` ${m.name} (${m.type}, every ${m.frequencyMinutes ?? '?'}min)`)\n }\n if (jobs.length > 0) {\n logger.info(pc.cyan(` Jobs (${jobs.length}):`))\n for (const j of jobs) logger.info(` ${j.name}${j.cronSchedule ? ` (${j.cronSchedule})` : ''}`)\n }\n if (variables.length > 0) {\n logger.info(pc.cyan(` Variables (${variables.length}):`))\n for (const v of variables) logger.info(` ${v.key}${v.isSecret ? ' (secret)' : ''}`)\n }\n if (tags.length > 0) {\n logger.info(pc.cyan(` Tags (${tags.length}):`))\n for (const t of tags) logger.info(` ${t.name}`)\n }\n if (statusPages.length > 0) {\n logger.info(pc.cyan(` Status Pages (${statusPages.length}):`))\n for (const sp of statusPages) logger.info(` ${sp.name} (${sp.status ?? 'draft'})`)\n }\n\n logger.newline()\n logger.info(pc.yellow('Dry run — no files written.'))\n logger.newline()\n return\n }\n\n // ── Confirm if not --force ──\n if (!options.force) {\n logger.info(`Found ${pc.bold(String(totalResources))} resources to pull.`)\n logger.info('This will write test scripts and update supercheck.config.ts.')\n logger.newline()\n\n const { confirmPrompt } = await import('../utils/prompt.js')\n const confirmed = await confirmPrompt('Continue?', { default: true })\n if (!confirmed) {\n logger.info('Pull aborted.')\n return\n }\n logger.newline()\n }\n\n const summary: PullSummary = {\n tests: 0,\n monitors: 0,\n jobs: 0,\n variables: 0,\n tags: 0,\n statusPages: 0,\n skipped: 0,\n errors: [],\n }\n\n // ── Pull test scripts ──\n if (!options.configOnly && tests.length > 0) {\n logger.header('Tests:')\n\n // For tests that need full script content, fetch individually\n // (list endpoint may not include script)\n const fullTests: RemoteTest[] = []\n for (const t of tests) {\n if (t.script) {\n fullTests.push(t)\n } else {\n // Fetch individual test to get the script\n try {\n const { data } = await withSpinner(\n `Fetching script for \"${t.title}\"`,\n () => client.get<RemoteTest>(\n `/api/tests/${t.id}`,\n { includeScript: 'true' },\n ),\n )\n fullTests.push(data)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n logger.warn(` Could not fetch script for \"${t.title}\": ${msg}`)\n summary.errors.push(`test \"${t.title}\": ${msg}`)\n }\n }\n }\n\n pullTests(fullTests, cwd, summary)\n logger.newline()\n }\n\n // ── Install dependencies if package.json is missing ──\n const pkgPath = resolve(cwd, 'package.json')\n if (!options.dryRun && !existsSync(pkgPath)) {\n logger.newline()\n logger.info('Initializing project dependencies...')\n \n const pm = detectPackageManager(cwd)\n ensurePackageJson(cwd)\n \n const packages = ['@supercheck/cli', 'typescript', '@types/node']\n \n // Auto-detect required test packages\n const hasPlaywright = tests.some(t => mapTestType(t.type) === 'playwright')\n const hasK6 = tests.some(t => mapTestType(t.type) === 'k6')\n \n if (hasPlaywright) packages.push('@playwright/test')\n if (hasK6) packages.push('@types/k6')\n \n await installDependencies(cwd, pm, {\n packages,\n skipInstall: false, \n })\n \n // Write tsconfig.supercheck.json for IDE IntelliSense if not present\n const tsconfigPath = resolve(cwd, 'tsconfig.supercheck.json')\n if (!existsSync(tsconfigPath)) {\n const tsconfigContent = JSON.stringify({\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n esModuleInterop: true,\n strict: true,\n skipLibCheck: true,\n resolveJsonModule: true,\n isolatedModules: true,\n noEmit: true,\n types: ['node', ...(hasK6 ? ['k6'] : [])],\n },\n include: [\n 'supercheck.config.ts',\n 'supercheck.config.local.ts',\n '_supercheck_/**/*.ts',\n ],\n }, null, 2) + '\\n'\n writeFileSync(tsconfigPath, tsconfigContent, 'utf-8')\n logger.success('Created tsconfig.supercheck.json (IDE IntelliSense)')\n }\n\n logger.success('Project initialized with dependencies')\n }\n\n // ── Build config from remote resources ──\n if (!options.testsOnly) {\n // Build a test ID -> file path map for job test references\n const testMap = new Map<string, string>()\n for (const t of tests) {\n const testType = mapTestType(t.type)\n const filePath = testRelativePath(t.id, t.title, testType)\n testMap.set(t.id, filePath)\n }\n\n const monitorDefs = buildMonitorDefinitions(monitors)\n const jobDefs = buildJobDefinitions(jobs, testMap)\n const variableDefs = buildVariableDefinitions(variables)\n const tagDefs = buildTagDefinitions(tags)\n const statusPageDefs = buildStatusPageDefinitions(statusPages)\n\n summary.monitors = monitors.length\n summary.jobs = jobs.length\n summary.variables = variables.length\n summary.tags = tags.length\n summary.statusPages = statusPages.length\n\n // Resolve org/project identity — prefer context API, fall back to resource data.\n // Skip 'unknown-*' from previous broken pulls to avoid self-reinforcing fallback.\n const existingOrg = existing?.config?.project?.organization\n const existingProject = existing?.config?.project?.project\n const firstMonitor = monitors[0]\n const orgId = context?.organization?.id\n ?? firstMonitor?.organizationId\n ?? getStoredOrganization()\n ?? (existingOrg && !existingOrg.startsWith('unknown') ? existingOrg : null)\n ?? 'unknown-org'\n const projectId = context?.project?.id\n ?? firstMonitor?.projectId\n ?? getStoredProject()\n ?? (existingProject && !existingProject.startsWith('unknown') ? existingProject : null)\n ?? 'unknown-project'\n const baseUrl = existing?.config?.api?.baseUrl\n ?? getStoredBaseUrl()\n ?? 'https://app.supercheck.io'\n\n const configContent = generateConfigContent({\n orgId,\n projectId,\n baseUrl,\n monitors: monitorDefs,\n jobs: jobDefs,\n variables: variableDefs,\n tags: tagDefs,\n statusPages: statusPageDefs,\n })\n\n const configPath = resolve(cwd, 'supercheck.config.ts')\n const configChanged = writeIfChanged(configPath, configContent)\n\n if (configChanged) {\n logger.header('Config:')\n if (monitorDefs.length > 0) logger.info(pc.green(` + ${monitorDefs.length} monitor(s)`))\n if (jobDefs.length > 0) logger.info(pc.green(` + ${jobDefs.length} job(s)`))\n if (variableDefs.length > 0) logger.info(pc.green(` + ${variableDefs.length} variable(s)`))\n if (tagDefs.length > 0) logger.info(pc.green(` + ${tagDefs.length} tag(s)`))\n if (statusPageDefs.length > 0) logger.info(pc.green(` + ${statusPageDefs.length} status page(s)`))\n logger.success('Updated supercheck.config.ts')\n } else {\n logger.info('supercheck.config.ts is already up to date')\n }\n }\n\n // ── Summary ──\n logger.newline()\n\n const totalWritten = summary.tests + summary.monitors + summary.jobs + summary.variables + summary.tags + summary.statusPages\n const totalErrors = summary.errors.length\n\n if (totalErrors > 0) {\n logger.header('Errors:')\n for (const err of summary.errors) {\n logger.error(` ${err}`)\n }\n logger.newline()\n }\n\n if (totalWritten === 0 && summary.skipped === 0 && totalErrors === 0) {\n logger.success('Everything is already in sync.')\n } else {\n const resultParts: string[] = []\n if (summary.tests > 0) resultParts.push(`${summary.tests} test(s)`)\n if (summary.monitors > 0) resultParts.push(`${summary.monitors} monitor(s)`)\n if (summary.jobs > 0) resultParts.push(`${summary.jobs} job(s)`)\n if (summary.variables > 0) resultParts.push(`${summary.variables} variable(s)`)\n if (summary.tags > 0) resultParts.push(`${summary.tags} tag(s)`)\n if (summary.statusPages > 0) resultParts.push(`${summary.statusPages} status page(s)`)\n if (summary.skipped > 0) resultParts.push(`${summary.skipped} skipped`)\n\n if (resultParts.length > 0) {\n logger.success(`Pull complete: ${resultParts.join(', ')}`)\n }\n }\n\n logger.newline()\n logger.info('Next steps:')\n logger.info(' 1. Install dependencies: npm install -D @supercheck/cli typescript')\n logger.info(' 2. Preview changes: npx supercheck diff')\n logger.info(' 3. Deploy changes: npx supercheck deploy')\n logger.newline()\n logger.info('Tip: Review the changes, then commit to version control.')\n logger.newline()\n })\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { loadConfig } from '../config/loader.js'\nimport { buildLocalResources } from '../utils/resources.js'\nimport { normalizeTestTypeForApi, validateScripts, validateScriptTypeMatch } from '../utils/validation.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { logger } from '../utils/logger.js'\nimport { withSpinner } from '../utils/spinner.js'\n\nexport const validateCommand = new Command('validate')\n .description('Validate local test scripts against Supercheck rules')\n .option('--config <path>', 'Path to config file')\n .action(async (options: { config?: string }) => {\n const cwd = process.cwd()\n const { config } = await loadConfig({ cwd, configPath: options.config })\n const client = createAuthenticatedClient()\n\n const localResources = buildLocalResources(config, cwd)\n const tests = localResources.filter((r) => r.type === 'test')\n\n if (tests.length === 0) {\n logger.warn('No local tests found to validate.')\n return\n }\n\n // Pre-flight: fast client-side script-type mismatch detection\n let preflightFailed = false\n for (const test of tests) {\n const script = String(test.definition?.script ?? '')\n const declaredType = normalizeTestTypeForApi(test.definition?.testType)\n const mismatch = validateScriptTypeMatch(script, declaredType)\n if (mismatch) {\n logger.error(`${pc.red('✗')} ${test.name}: ${mismatch}`)\n preflightFailed = true\n }\n }\n if (preflightFailed) {\n throw new CLIError('Script-type mismatch detected. Fix the test type or script content before validating.', ExitCode.ConfigError)\n }\n\n const inputs = tests.map((test) => ({\n name: test.name,\n script: String(test.definition?.script ?? ''),\n testType: normalizeTestTypeForApi(test.definition?.testType),\n }))\n\n const results = await withSpinner('Validating test scripts...', async () => {\n return validateScripts(client, inputs)\n }, { successText: 'Validation complete' })\n\n logger.newline()\n logger.header('Validation Results')\n logger.newline()\n\n let failed = 0\n for (const result of results) {\n if (result.valid) {\n logger.info(pc.green(` ✓ ${result.name}`))\n if (result.warnings && result.warnings.length > 0) {\n logger.info(pc.yellow(` Warnings: ${result.warnings.join(', ')}`))\n }\n } else {\n failed++\n logger.info(pc.red(` ✗ ${result.name}`))\n logger.info(pc.gray(` ${result.error ?? 'Validation failed'}`))\n }\n }\n\n logger.newline()\n\n if (failed > 0) {\n throw new CLIError(`Validation failed for ${failed} test(s).`, ExitCode.ConfigError)\n }\n\n logger.success('All tests passed validation.')\n })","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { logger } from '../utils/logger.js'\nimport { output, outputDetail } from '../output/formatter.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { withSpinner } from '../utils/spinner.js'\n\nexport const notificationCommand = new Command('notification')\n .alias('notifications')\n .description('Manage notification providers')\n\nnotificationCommand\n .command('list')\n .description('List notification providers')\n .action(async () => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching notification providers',\n () => client.get<Record<string, unknown>[]>('/api/notification-providers'),\n )\n\n output(data, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'name', header: 'Name' },\n { key: 'type', header: 'Type' },\n { key: 'enabled', header: 'Enabled' },\n { key: 'lastUsed', header: 'Last Used' },\n ],\n })\n })\n\nnotificationCommand\n .command('get <id>')\n .description('Get notification provider details')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching provider details',\n () => client.get<Record<string, unknown>>(`/api/notification-providers/${id}`),\n )\n outputDetail(data)\n })\n\nnotificationCommand\n .command('create')\n .description('Create a notification provider')\n .requiredOption('--type <type>', 'Provider type (email, slack, webhook, telegram, discord, teams)')\n .requiredOption('--name <name>', 'Provider name')\n .option('--config <json>', 'Provider config as JSON string')\n .action(async (options: { type: string; name: string; config?: string }) => {\n const validTypes = ['email', 'slack', 'webhook', 'telegram', 'discord', 'teams']\n if (!validTypes.includes(options.type)) {\n throw new CLIError(\n `Invalid provider type. Must be one of: ${validTypes.join(', ')}`,\n ExitCode.GeneralError,\n )\n }\n\n let config: Record<string, unknown> = {}\n if (options.config) {\n try {\n config = JSON.parse(options.config)\n } catch {\n throw new CLIError('Invalid JSON in --config', ExitCode.GeneralError)\n }\n }\n\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Creating notification provider',\n () => client.post<Record<string, unknown>>('/api/notification-providers', {\n name: options.name,\n type: options.type,\n config: { name: options.name, ...config },\n }),\n )\n\n logger.success(`Notification provider \"${options.name}\" created (${data.id})`)\n outputDetail(data)\n })\n\nnotificationCommand\n .command('update <id>')\n .description('Update a notification provider')\n .option('--name <name>', 'Provider name')\n .option('--type <type>', 'Provider type')\n .option('--config <json>', 'Provider config as JSON string (replaces entire config — include all fields)')\n .action(async (id: string, options: { name?: string; type?: string; config?: string }) => {\n const client = createAuthenticatedClient()\n\n if (!options.name && !options.type && !options.config) {\n logger.warn('No fields to update. Use --name, --type, or --config.')\n return\n }\n\n // Fetch existing provider for name/type fallback\n // SECURITY: The GET response returns sanitized/masked config.\n // We must NOT merge user-provided config with the masked config,\n // as that would overwrite real credentials with masked placeholders.\n const { data: existing } = await withSpinner(\n 'Fetching existing provider',\n () => client.get<Record<string, unknown>>(`/api/notification-providers/${id}`),\n )\n\n const maskedFields = (existing.maskedFields as string[] | undefined) ?? []\n\n const updatedName = options.name ?? String(existing.name ?? '')\n const updatedType = options.type ?? String(existing.type ?? '')\n\n // Build config for the update\n let updatedConfig: Record<string, unknown>\n if (options.config) {\n // User provided explicit config — use it directly (don't merge with masked values)\n try {\n updatedConfig = JSON.parse(options.config)\n } catch {\n throw new CLIError('Invalid JSON in --config', ExitCode.GeneralError)\n }\n } else if (maskedFields.length > 0) {\n // No config provided AND existing config has masked fields.\n // Cannot safely send the masked config back — it would overwrite real credentials.\n // Only update name/type fields via a targeted request.\n logger.debug('Skipping config field (contains masked secrets that cannot be round-tripped safely)')\n updatedConfig = undefined as unknown as Record<string, unknown>\n } else {\n // Existing config has no masked fields — safe to send it back\n updatedConfig = (existing.config as Record<string, unknown>) ?? {}\n }\n\n // Ensure config.name stays in sync with top-level name\n if (updatedConfig) {\n updatedConfig.name = updatedName\n }\n\n const body: Record<string, unknown> = {\n name: updatedName,\n type: updatedType,\n }\n\n // Only include config if we have a safe value to send\n if (updatedConfig) {\n body.config = updatedConfig\n }\n\n const { data } = await withSpinner(\n 'Updating notification provider',\n () => client.put<Record<string, unknown>>(`/api/notification-providers/${id}`, body),\n )\n logger.success(`Notification provider ${id} updated`)\n outputDetail(data)\n })\n\nnotificationCommand\n .command('delete <id>')\n .description('Delete a notification provider')\n .option('--force', 'Skip confirmation')\n .action(async (id: string, options: { force?: boolean }) => {\n if (!options.force) {\n const { confirmPrompt } = await import('../utils/prompt.js')\n const confirmed = await confirmPrompt(`Delete notification provider ${id}?`, { default: false })\n if (!confirmed) {\n logger.info('Aborted')\n return\n }\n }\n\n const client = createAuthenticatedClient()\n await withSpinner(\n 'Deleting notification provider',\n () => client.delete(`/api/notification-providers/${id}`),\n )\n logger.success(`Notification provider ${id} deleted`)\n })\n\nnotificationCommand\n .command('test')\n .description('Send a test notification to verify provider configuration')\n .requiredOption('--type <type>', 'Provider type (email, slack, webhook, telegram, discord, teams)')\n .requiredOption('--config <json>', 'Provider config as JSON string')\n .action(async (options: { type: string; config: string }) => {\n const validTypes = ['email', 'slack', 'webhook', 'telegram', 'discord', 'teams']\n if (!validTypes.includes(options.type)) {\n throw new CLIError(\n `Invalid provider type. Must be one of: ${validTypes.join(', ')}`,\n ExitCode.GeneralError,\n )\n }\n\n let config: Record<string, unknown> = {}\n try {\n config = JSON.parse(options.config)\n } catch {\n throw new CLIError('Invalid JSON in --config', ExitCode.GeneralError)\n }\n\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Sending test notification',\n () => client.post<{ success: boolean; message?: string; error?: string }>(\n '/api/notification-providers/test',\n { type: options.type, config },\n ),\n )\n\n if (data.success) {\n logger.success(data.message ?? 'Test notification sent successfully')\n } else {\n throw new CLIError(data.error ?? 'Test notification failed', ExitCode.GeneralError)\n }\n })\n","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { output } from '../output/formatter.js'\nimport { logger } from '../utils/logger.js'\nimport type { PaginatedResponse } from '../api/client.js'\nimport { withSpinner } from '../utils/spinner.js'\n\nexport const alertCommand = new Command('alert')\n .alias('alerts')\n .description('View alert history')\n\nalertCommand\n .command('history')\n .description('Get alert history')\n .option('--page <page>', 'Page number', '1')\n .option('--limit <limit>', 'Number of results per page', '50')\n .action(async (options: { page: string; limit: string }) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching alert history',\n () => client.get<\n PaginatedResponse<Record<string, unknown>> | Record<string, unknown>[]\n >('/api/alerts/history', { page: options.page, limit: options.limit }),\n )\n\n // Handle both flat array and paginated response\n const items = Array.isArray(data) ? data : data.data\n const pagination = Array.isArray(data) ? null : data.pagination\n\n output(items, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'targetType', header: 'Target Type' },\n { key: 'targetName', header: 'Target' },\n { key: 'type', header: 'Alert Type' },\n { key: 'status', header: 'Status' },\n { key: 'timestamp', header: 'Time' },\n ],\n })\n\n if (pagination) {\n logger.info(\n `\\nPage ${pagination.page}/${pagination.totalPages} (${pagination.total} total)`,\n )\n }\n })\n","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { logger } from '../utils/logger.js'\nimport { output } from '../output/formatter.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { withSpinner } from '../utils/spinner.js'\n\ninterface AuditResponse {\n success: boolean\n data: {\n logs: Array<{\n id: string\n action: string\n details: unknown\n createdAt: string\n user: { id: string; name: string | null; email: string | null }\n }>\n pagination: {\n currentPage: number\n totalPages: number\n totalCount: number\n limit: number\n hasNext: boolean\n hasPrev: boolean\n }\n }\n}\n\nexport const auditCommand = new Command('audit')\n .description('View audit logs (admin)')\n .option('--page <page>', 'Page number', '1')\n .option('--limit <limit>', 'Items per page', '20')\n .option('--search <query>', 'Search by action')\n .option('--action <action>', 'Filter by action type')\n .action(async (options: { page: string; limit: string; search?: string; action?: string }) => {\n const client = createAuthenticatedClient()\n\n const params: Record<string, string> = {\n page: options.page,\n limit: options.limit,\n }\n if (options.search) params.search = options.search\n if (options.action) params.action = options.action\n\n const { data } = await withSpinner(\n 'Fetching audit logs',\n () => client.get<AuditResponse>('/api/audit', params),\n )\n\n if (!data.success) {\n throw new CLIError('Failed to fetch audit logs', ExitCode.ApiError)\n }\n\n const rows = data.data.logs.map((log) => ({\n id: log.id,\n action: log.action,\n user: log.user?.email ?? log.user?.name ?? '-',\n createdAt: log.createdAt,\n }))\n\n output(rows, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'action', header: 'Action' },\n { key: 'user', header: 'User' },\n { key: 'createdAt', header: 'Date' },\n ],\n })\n\n const { pagination } = data.data\n if (pagination) {\n logger.info(\n `\\nPage ${pagination.currentPage}/${pagination.totalPages} (${pagination.totalCount} total)`,\n )\n }\n })\n","import { Command } from 'commander'\nimport { logger } from '../utils/logger.js'\nimport { checkAllDependencies, formatDependencyReport, installPlaywrightBrowsers } from '../utils/deps.js'\nimport { output } from '../output/formatter.js'\nimport { getOutputFormat } from '../output/formatter.js'\nimport { tryLoadConfig } from '../config/loader.js'\nimport { getStoredBaseUrl, isAuthenticated } from '../auth/store.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport pc from 'picocolors'\n\nexport const doctorCommand = new Command('doctor')\n .description('Check that all dependencies and configuration are set up correctly')\n .option('--fix', 'Attempt to automatically fix missing dependencies')\n .action(async (options: { fix?: boolean }) => {\n const cwd = process.cwd()\n const format = getOutputFormat()\n\n logger.newline()\n logger.header('Supercheck Doctor')\n logger.newline()\n\n // 1. Check dependencies\n logger.info(pc.bold('Dependencies:'))\n const deps = checkAllDependencies(cwd)\n\n if (format === 'json') {\n output(deps as unknown as Record<string, unknown>[], {\n columns: [\n { key: 'name', header: 'Dependency' },\n { key: 'installed', header: 'Installed' },\n { key: 'version', header: 'Version' },\n { key: 'required', header: 'Required' },\n { key: 'installHint', header: 'Install' },\n ],\n })\n } else {\n logger.output(formatDependencyReport(deps))\n }\n\n logger.newline()\n\n // 2. Check authentication\n logger.info(pc.bold('Authentication:'))\n const hasAuth = isAuthenticated()\n if (hasAuth) {\n const baseUrl = getStoredBaseUrl() ?? 'https://app.supercheck.io'\n logger.output(` ${pc.green('✓')} Authenticated (${pc.dim(baseUrl)})`)\n } else {\n logger.output(` ${pc.yellow('○')} Not authenticated — run: supercheck login --token <token>`)\n }\n\n logger.newline()\n\n // 3. Check configuration\n logger.info(pc.bold('Configuration:'))\n const configResult = await tryLoadConfig()\n if (configResult) {\n logger.output(` ${pc.green('✓')} supercheck.config.ts found`)\n const org = configResult.config.project?.organization\n const proj = configResult.config.project?.project\n if (org && proj) {\n logger.output(` ${pc.green('✓')} Project: ${pc.dim(`${org}/${proj}`)}`)\n } else {\n logger.output(` ${pc.yellow('○')} Project org/project not configured in supercheck.config.ts`)\n }\n } else {\n logger.output(` ${pc.yellow('○')} No supercheck.config.ts — run: supercheck init`)\n }\n\n logger.newline()\n\n // 4. Auto-fix if requested\n const missingRequired = deps.filter((d) => !d.installed && d.required)\n if (options.fix && missingRequired.length > 0) {\n logger.header('Attempting to fix missing dependencies...')\n logger.newline()\n\n for (const dep of missingRequired) {\n if (dep.name === 'Playwright browsers') {\n const ok = await installPlaywrightBrowsers(cwd)\n if (ok) {\n logger.success('Playwright browsers installed')\n } else {\n logger.error(`Failed to install Playwright browsers. Run manually: ${dep.installHint}`)\n }\n } else if (dep.name === '@playwright/test') {\n logger.info(`Install @playwright/test:`)\n logger.info(` ${dep.installHint}`)\n }\n }\n logger.newline()\n }\n\n // 5. Summary\n if (missingRequired.length === 0 && hasAuth && configResult) {\n logger.success('Everything looks good! You\\'re ready to use Supercheck.')\n } else {\n const issues: string[] = []\n if (missingRequired.length > 0) {\n issues.push(`${missingRequired.length} missing required dependency(s)`)\n }\n if (!hasAuth) {\n issues.push('not authenticated')\n }\n if (!configResult) {\n issues.push('no config file')\n }\n logger.warn(`Issues found: ${issues.join(', ')}`)\n\n if (!options.fix && missingRequired.length > 0) {\n logger.info(`Run ${pc.bold('supercheck doctor --fix')} to attempt automatic fixes.`)\n }\n }\n\n logger.newline()\n\n // Exit with error code if required deps are missing\n if (missingRequired.length > 0) {\n throw new CLIError(\n `Missing ${missingRequired.length} required dependency(s). Run 'supercheck doctor --fix' or install manually.`,\n ExitCode.ConfigError,\n )\n }\n })\n","import { Command } from 'commander'\nimport { spawn } from 'node:child_process'\nimport { logger } from '../utils/logger.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { confirmPrompt } from '../utils/prompt.js'\nimport { getOutputFormat, output } from '../output/formatter.js'\nimport { withSpinner } from '../utils/spinner.js'\n\nconst PACKAGE_NAME = '@supercheck/cli'\nconst TAG_PATTERN = /^[a-z0-9][a-z0-9._-]*$/i\n\nfunction normalizeTag(tag: string): string {\n const trimmed = tag.trim()\n if (trimmed.startsWith('v') && trimmed.length > 1 && /\\d/.test(trimmed[1])) {\n return trimmed.slice(1)\n }\n return trimmed\n}\n\nfunction getDefaultTag(): string {\n return 'latest'\n}\n\nfunction detectPackageManager(): 'npm' | 'yarn' | 'pnpm' | 'bun' {\n const userAgent = process.env.npm_config_user_agent ?? ''\n if (userAgent.includes('pnpm')) return 'pnpm'\n if (userAgent.includes('yarn')) return 'yarn'\n if (userAgent.includes('bun')) return 'bun'\n return 'npm'\n}\n\nfunction buildInstallCommand(\n pm: 'npm' | 'yarn' | 'pnpm' | 'bun',\n pkgSpec: string,\n): { command: string; args: string[]; preview: string } {\n switch (pm) {\n case 'yarn': {\n const args = ['global', 'add', pkgSpec]\n return { command: 'yarn', args, preview: `yarn ${args.join(' ')}` }\n }\n case 'pnpm': {\n const args = ['add', '-g', pkgSpec]\n return { command: 'pnpm', args, preview: `pnpm ${args.join(' ')}` }\n }\n case 'bun': {\n const args = ['add', '-g', pkgSpec]\n return { command: 'bun', args, preview: `bun ${args.join(' ')}` }\n }\n case 'npm':\n default: {\n const args = ['install', '-g', pkgSpec]\n return { command: 'npm', args, preview: `npm ${args.join(' ')}` }\n }\n }\n}\n\nfunction runInstallCommand(command: string, args: string[]): Promise<number> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { stdio: 'inherit' })\n child.on('error', (err) => reject(err))\n child.on('close', (code) => resolve(code ?? 0))\n })\n}\n\nexport const upgradeCommand = new Command('upgrade')\n .description('Upgrade the Supercheck CLI to the latest version')\n .option('--tag <tag>', 'NPM dist-tag or version (latest, next, canary, 0.1.1-beta.1)')\n .option('--package-manager <pm>', 'Package manager to use (npm, yarn, pnpm, bun)')\n .option('-y, --yes', 'Skip confirmation prompt')\n .option('--dry-run', 'Print the upgrade command without running it')\n .action(async (options: { tag?: string; packageManager?: string; yes?: boolean; dryRun?: boolean }) => {\n const format = getOutputFormat()\n const tag = normalizeTag(options.tag ?? getDefaultTag())\n\n if (!TAG_PATTERN.test(tag)) {\n throw new CLIError(\n `Invalid tag \"${tag}\". Use a valid dist-tag (latest, next, canary) or version (0.1.1-beta.1).`,\n ExitCode.ConfigError,\n )\n }\n\n const pm = (options.packageManager ?? detectPackageManager()) as 'npm' | 'yarn' | 'pnpm' | 'bun'\n if (!['npm', 'yarn', 'pnpm', 'bun'].includes(pm)) {\n throw new CLIError(\n `Unsupported package manager \"${pm}\". Use npm, yarn, pnpm, or bun.`,\n ExitCode.ConfigError,\n )\n }\n\n const pkgSpec = `${PACKAGE_NAME}@${tag}`\n const install = buildInstallCommand(pm, pkgSpec)\n\n if (options.dryRun) {\n const payload = {\n action: 'upgrade',\n package: PACKAGE_NAME,\n tag,\n packageManager: pm,\n command: install.preview,\n dryRun: true,\n }\n\n if (format === 'json') {\n output(payload)\n } else {\n logger.info(`Upgrade command: ${install.preview}`)\n }\n return\n }\n\n if (!options.yes) {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new CLIError(\n 'Upgrade requires confirmation. Re-run with --yes to skip the prompt.',\n ExitCode.ConfigError,\n )\n }\n\n const confirmed = await confirmPrompt(`Upgrade Supercheck CLI using ${pm}?`, { default: false })\n if (!confirmed) {\n logger.info('Upgrade cancelled.')\n return\n }\n }\n\n let code = 0\n try {\n code = await withSpinner(\n 'Upgrading Supercheck CLI...',\n () => runInstallCommand(install.command, install.args),\n )\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n throw new CLIError(`Failed to run upgrade command: ${message}`, ExitCode.GeneralError)\n }\n if (code !== 0) {\n throw new CLIError(`Upgrade failed with exit code ${code}.`, ExitCode.GeneralError)\n }\n\n if (format === 'json') {\n output({\n action: 'upgrade',\n package: PACKAGE_NAME,\n tag,\n packageManager: pm,\n command: install.preview,\n success: true,\n })\n return\n }\n\n logger.success(`Supercheck CLI upgraded (${pkgSpec}).`)\n })\n"],"mappings":"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","names":["Command","pc","resolve","pc","pc","data","Command","resolve","resolve","Command","data","Command","Command","Command","existsSync","writeFileSync","readFileSync","resolve","existsSync","resolve","basename","existsSync","resolve","basename","execSync","existsSync","resolve","pc","output","resolve","existsSync","pc","Command","resolve","existsSync","writeFileSync","readFileSync","Command","readFileSync","resolve","resolve","writeFileSync","Command","resolve","readFileSync","confirmPrompt","tests","client","Command","runCommand","Command","Command","readFileSync","resolve","Buffer","toDisplayName","resolve","readFileSync","Command","Buffer","confirmPrompt","Command","Command","confirmPrompt","Command","Command","confirmPrompt","Command","Command","confirmPrompt","Command","pc","pc","Command","Command","resolve","pc","resolve","Command","Command","pc","Command","Command","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","resolve","dirname","pc","existsSync","readFileSync","dirname","mkdirSync","writeFileSync","resolve","readdirSync","formatValue","Command","confirmPrompt","Command","pc","Command","pc","Command","Command","confirmPrompt","Command","Command","Command","Command","Command","pc","Command","Command","spawn","detectPackageManager","resolve","spawn","Command","Command","runCommand","pc"]}
1
+ {"version":3,"sources":["../../src/bin/supercheck.ts","../../src/commands/login.ts","../../src/auth/store.ts","../../src/utils/errors.ts","../../src/utils/logger.ts","../../src/version.ts","../../src/utils/proxy.ts","../../src/api/client.ts","../../src/utils/discovery.ts","../../src/utils/slug.ts","../../src/utils/resources.ts","../../src/utils/spinner.ts","../../src/output/formatter.ts","../../src/commands/health.ts","../../src/config/loader.ts","../../src/config/schema.ts","../../src/commands/config.ts","../../src/commands/init.ts","../../src/utils/package-manager.ts","../../src/utils/deps.ts","../../src/utils/uuid.ts","../../src/commands/jobs.ts","../../src/api/authenticated-client.ts","../../src/utils/number.ts","../../src/utils/validation.ts","../../src/utils/exec.ts","../../src/utils/playwright.ts","../../src/commands/runs.ts","../../src/commands/tests.ts","../../src/commands/monitors.ts","../../src/commands/variables.ts","../../src/commands/tags.ts","../../src/commands/diff.ts","../../src/utils/reconcile.ts","../../src/commands/deploy.ts","../../src/utils/paths.ts","../../src/commands/destroy.ts","../../src/commands/pull.ts","../../src/commands/validate.ts","../../src/commands/notifications.ts","../../src/commands/alerts.ts","../../src/commands/audit.ts","../../src/commands/doctor.ts","../../src/commands/upgrade.ts"],"sourcesContent":["import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { loginCommand, logoutCommand, whoamiCommand } from '../commands/login.js'\nimport { healthCommand, locationsCommand } from '../commands/health.js'\nimport { configCommand } from '../commands/config.js'\nimport { initCommand } from '../commands/init.js'\nimport { jobCommand } from '../commands/jobs.js'\nimport { runCommand } from '../commands/runs.js'\nimport { testCommand } from '../commands/tests.js'\nimport { monitorCommand } from '../commands/monitors.js'\nimport { varCommand } from '../commands/variables.js'\nimport { tagCommand } from '../commands/tags.js'\nimport { diffCommand } from '../commands/diff.js'\nimport { deployCommand } from '../commands/deploy.js'\nimport { destroyCommand } from '../commands/destroy.js'\nimport { pullCommand } from '../commands/pull.js'\nimport { validateCommand } from '../commands/validate.js'\nimport { notificationCommand } from '../commands/notifications.js'\nimport { alertCommand } from '../commands/alerts.js'\nimport { auditCommand } from '../commands/audit.js'\nimport { doctorCommand } from '../commands/doctor.js'\nimport { upgradeCommand } from '../commands/upgrade.js'\nimport { setOutputFormat, type OutputFormat } from '../output/formatter.js'\nimport { setQuietMode, setLogLevel } from '../utils/logger.js'\nimport { ApiRequestError, CLIError, ExitCode } from '../utils/errors.js'\nimport { DependencyError } from '../utils/deps.js'\nimport { CLI_VERSION } from '../version.js'\n\nconst program = new Command()\n .name('supercheck')\n .description('Open-source testing, monitoring, and reliability — as code')\n .version(CLI_VERSION, '-v, --version')\n .option('--json', 'Output in JSON format')\n .option('--quiet', 'Suppress non-essential output')\n .option('--debug', 'Enable debug logging')\n .hook('preAction', (_thisCommand, actionCommand) => {\n const opts = program.opts()\n\n if (opts.json) {\n setOutputFormat('json' as OutputFormat)\n }\n\n if (opts.quiet) {\n setQuietMode(true)\n setOutputFormat('quiet' as OutputFormat)\n }\n\n if (opts.debug) {\n setLogLevel('debug')\n }\n\n // Validate that actionCommand exists (just for type safety)\n void actionCommand\n })\n\n// Register commands — auth\nprogram.addCommand(loginCommand)\nprogram.addCommand(logoutCommand)\nprogram.addCommand(whoamiCommand)\n\n// Register commands — project\nprogram.addCommand(initCommand)\nprogram.addCommand(configCommand)\n\n// Register commands — resources\nprogram.addCommand(jobCommand)\nprogram.addCommand(runCommand)\nprogram.addCommand(testCommand)\nprogram.addCommand(monitorCommand)\nprogram.addCommand(varCommand)\nprogram.addCommand(tagCommand)\n\n// Register commands — monitoring-as-code\nprogram.addCommand(diffCommand)\nprogram.addCommand(deployCommand)\nprogram.addCommand(validateCommand)\nprogram.addCommand(destroyCommand)\nprogram.addCommand(pullCommand)\n\n// Register commands — notifications & alerts\nprogram.addCommand(notificationCommand)\nprogram.addCommand(alertCommand)\nprogram.addCommand(auditCommand)\n\n// Register commands — utilities\nprogram.addCommand(healthCommand)\nprogram.addCommand(locationsCommand)\nprogram.addCommand(doctorCommand)\nprogram.addCommand(upgradeCommand)\n\n// Global error handler\nprogram.exitOverride()\n\nasync function main(): Promise<void> {\n try {\n await program.parseAsync(process.argv)\n } catch (err) {\n if (err instanceof ApiRequestError && err.responseBody !== undefined) {\n const details = (() => {\n if (typeof err.responseBody === 'string') {\n return err.responseBody.trim() ? `Details: ${err.responseBody}` : ''\n }\n if (err.responseBody && typeof err.responseBody === 'object') {\n return `Details: ${JSON.stringify(err.responseBody, null, 2)}`\n }\n return err.responseBody ? `Details: ${String(err.responseBody)}` : ''\n })()\n\n const suffix = details ? `\\n${details}\\n` : '\\n'\n console.error(pc.red(`\\n✗ ${err.message}${suffix}`))\n process.exit(err.exitCode)\n }\n\n if (err instanceof DependencyError) {\n console.error(pc.red(`\\n✗ Missing dependency: ${err.dependency}`))\n console.error(pc.yellow(`\\n${err.message}\\n`))\n console.error(pc.dim('Run `supercheck doctor` for a full dependency check.\\n'))\n process.exit(ExitCode.ConfigError)\n }\n\n if (err instanceof CLIError) {\n if (err.exitCode !== ExitCode.Success) {\n console.error(pc.red(`\\n✗ ${err.message}\\n`))\n }\n process.exit(err.exitCode)\n }\n\n // Commander.js exit override throws CommanderError for --help, --version, etc.\n // Check for exitCode property (Commander sets exitCode: 0 for successful exits)\n if (err && typeof err === 'object' && 'exitCode' in err && typeof err.exitCode === 'number') {\n process.exit(err.exitCode)\n }\n\n // Unknown error\n console.error(pc.red(`\\n✗ Unexpected error: ${err instanceof Error ? err.message : String(err)}\\n`))\n process.exit(ExitCode.GeneralError)\n }\n}\n\nmain()\n","import { Command } from 'commander'\nimport {\n setToken,\n setBaseUrl,\n clearAuth,\n getToken,\n getStoredBaseUrl,\n validateTokenFormat,\n} from '../auth/store.js'\nimport { getApiClient } from '../api/client.js'\nimport { logger } from '../utils/logger.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { safeTokenPreview } from '../utils/resources.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { getOutputFormat } from '../output/formatter.js'\n\nexport const loginCommand = new Command('login')\n .description('Authenticate with Supercheck')\n .option('--token <token>', 'Provide a CLI token directly (for CI/CD)')\n .option('--url <url>', 'Supercheck API URL (for self-hosted instances)')\n .action(async (options: { token?: string; url?: string }) => {\n if (options.token) {\n const token = options.token.trim()\n if (!validateTokenFormat(token)) {\n throw new CLIError(\n 'Invalid token. `supercheck login` requires a CLI token (sck_live_* or sck_test_*). Trigger keys (sck_trigger_* / job_*) are only for `supercheck job trigger` via SUPERCHECK_TRIGGER_KEY.',\n ExitCode.AuthError,\n )\n }\n\n // Build client with provided options (don't persist until verified)\n const client = getApiClient({\n baseUrl: options.url,\n token,\n })\n\n try {\n // Verify token using a Bearer-auth-compatible endpoint\n await withSpinner(\n 'Verifying token...',\n () => client.get('/api/cli-tokens'),\n { successText: 'Token verified' },\n )\n } catch {\n throw new CLIError(\n 'Token verification failed. Please check your token and try again.',\n ExitCode.AuthError,\n )\n }\n\n // Token verified — now persist credentials\n setToken(token)\n if (options.url) {\n setBaseUrl(options.url)\n }\n\n const tokenPreview = safeTokenPreview(token)\n logger.success('Authentication successful')\n logger.info(` Token: ${tokenPreview}`)\n if (options.url) {\n logger.info(` API URL: ${options.url}`)\n }\n return\n }\n\n // Interactive login — not yet implemented\n logger.newline()\n logger.info('To authenticate, create a CLI token in the Dashboard:')\n logger.info(' Dashboard → Project Settings → CLI Tokens → Create Token')\n logger.newline()\n if (options.url) {\n logger.info(`Then run: supercheck login --token <your-token> --url ${options.url}`)\n } else {\n logger.info('Then run: supercheck login --token <your-token>')\n }\n logger.newline()\n logger.warn('Browser-based OAuth login is not yet implemented.')\n })\n\nexport const logoutCommand = new Command('logout')\n .description('Remove stored authentication credentials')\n .action(() => {\n clearAuth()\n logger.success('Logged out successfully. Stored credentials removed.')\n })\n\nexport const whoamiCommand = new Command('whoami')\n .description('Show current authentication context')\n .action(async () => {\n const token = getToken()\n if (!token) {\n throw new CLIError(\n 'Not authenticated. Run `supercheck login` to authenticate.',\n ExitCode.AuthError,\n )\n }\n\n const baseUrl = getStoredBaseUrl()\n const client = getApiClient({ token, baseUrl: baseUrl ?? undefined })\n\n try {\n // Use cli-tokens endpoint which supports Bearer auth via requireAuthContext()\n const data = await withSpinner(\n 'Fetching context...',\n async () => {\n const { data } = await client.get<{\n success: boolean\n tokens: Array<{\n id: string\n name: string\n start: string\n enabled: boolean\n createdByName: string\n expiresAt: string | null\n lastRequest: string | null\n }>\n }>('/api/cli-tokens')\n return data\n },\n { successText: 'Context loaded' },\n )\n\n const tokenPreview = safeTokenPreview(token)\n\n // Match the current token against the server's token list by prefix\n const activeToken = data.tokens?.find((t) => t.start && token.startsWith(t.start.replace(/\\.+$/, '')))\n\n // JSON output mode\n if (getOutputFormat() === 'json') {\n const jsonData: Record<string, unknown> = {\n user: activeToken?.createdByName ?? null,\n tokenName: activeToken?.name ?? null,\n tokenPreview,\n apiUrl: baseUrl ?? 'https://app.supercheck.io',\n expiresAt: activeToken?.expiresAt ?? null,\n lastUsed: activeToken?.lastRequest ?? null,\n }\n logger.output(JSON.stringify(jsonData, null, 2))\n return\n }\n\n logger.newline()\n logger.header('Current Context')\n logger.newline()\n if (activeToken?.createdByName && activeToken.createdByName !== '-') {\n logger.info(` User: ${activeToken.createdByName}`)\n }\n if (activeToken?.name) {\n logger.info(` Token: ${activeToken.name} (${tokenPreview})`)\n } else {\n logger.info(` Token: ${tokenPreview}`)\n }\n logger.info(` API URL: ${baseUrl ?? 'https://app.supercheck.io'}`)\n if (activeToken?.expiresAt) {\n logger.info(` Expires: ${activeToken.expiresAt}`)\n }\n if (activeToken?.lastRequest) {\n logger.info(` Last used: ${activeToken.lastRequest}`)\n }\n logger.newline()\n } catch {\n throw new CLIError(\n 'Failed to verify authentication. Your token may be expired or invalid.',\n ExitCode.AuthError,\n )\n }\n })\n","import Conf from 'conf'\nimport { AuthenticationError } from '../utils/errors.js'\nimport { logger } from '../utils/logger.js'\n\nconst TOKEN_PREFIX_LIVE = 'sck_live_'\nconst TOKEN_PREFIX_TEST = 'sck_test_'\nconst TOKEN_PREFIX_TRIGGER = 'sck_trigger_'\nconst TOKEN_PREFIX_TRIGGER_LEGACY = 'job_'\n\nconst VALID_CLI_PREFIXES = [TOKEN_PREFIX_LIVE, TOKEN_PREFIX_TEST]\nconst VALID_TRIGGER_PREFIXES = [TOKEN_PREFIX_TRIGGER, TOKEN_PREFIX_TRIGGER_LEGACY]\n\ninterface AuthData {\n token?: string\n baseUrl?: string\n organization?: string\n project?: string\n}\n\n/**\n * Local credential store using `conf`.\n *\n * SECURITY NOTE: The key below is a static obfuscation key — it prevents\n * casual inspection of the JSON file on disk but does NOT provide real\n * encryption against a determined attacker with file access.\n * For CI/CD and production use, prefer the SUPERCHECK_TOKEN environment\n * variable which bypasses the local store entirely.\n *\n * The `conf` library requires the parameter name `encryptionKey` — it is\n * NOT true encryption in this usage because the key is static and public.\n */\nconst store = new Conf<AuthData>({\n projectName: 'supercheck-cli',\n schema: {\n token: { type: 'string' },\n baseUrl: { type: 'string' },\n organization: { type: 'string' },\n project: { type: 'string' },\n },\n // Static obfuscation key — see SECURITY NOTE above.\n encryptionKey: 'supercheck-cli-v1',\n})\n\n/**\n * Validate that a token has a recognized prefix.\n */\nexport function validateTokenFormat(token: string): boolean {\n return VALID_CLI_PREFIXES.some((prefix) => token.startsWith(prefix))\n}\n\nexport function validateTriggerKeyFormat(token: string): boolean {\n return VALID_TRIGGER_PREFIXES.some((prefix) => token.startsWith(prefix))\n}\n\n/**\n * Get the current authentication token.\n * Priority: env var > stored token\n */\nexport function getToken(): string | null {\n const envToken = process.env.SUPERCHECK_TOKEN\n if (envToken) {\n const trimmed = envToken.trim()\n if (!validateTokenFormat(trimmed)) {\n logger.warn('SUPERCHECK_TOKEN must be a CLI token (sck_live_* or sck_test_*).')\n return null\n }\n return trimmed\n }\n\n const stored = store.get('token')\n if (!stored) return null\n return validateTokenFormat(stored) ? stored : null\n}\n\nexport function getTriggerKey(): string | null {\n const envKey = process.env.SUPERCHECK_TRIGGER_KEY\n if (envKey) {\n const trimmed = envKey.trim()\n if (!validateTriggerKeyFormat(trimmed)) {\n logger.warn('SUPERCHECK_TRIGGER_KEY must start with sck_trigger_ or job_.')\n return null\n }\n return trimmed\n }\n\n // Backward-compatible fallback: allow using SUPERCHECK_TOKEN as a trigger key\n // only if it matches a trigger key prefix.\n const token = process.env.SUPERCHECK_TOKEN\n if (token && validateTriggerKeyFormat(token.trim())) {\n logger.warn('Using SUPERCHECK_TOKEN as a trigger key. Prefer setting SUPERCHECK_TRIGGER_KEY instead.')\n return token.trim()\n }\n\n return null\n}\n\n/**\n * Store a token after validation.\n */\nexport function setToken(token: string): void {\n if (!validateTokenFormat(token)) {\n throw new AuthenticationError(\n `Invalid token format. Token must start with one of: ${VALID_CLI_PREFIXES.join(', ')}`,\n )\n }\n store.set('token', token)\n}\n\n/**\n * Remove stored credentials.\n */\nexport function clearAuth(): void {\n store.delete('token')\n store.delete('baseUrl')\n store.delete('organization')\n store.delete('project')\n}\n\n/**\n * Get the stored base URL override.\n */\nexport function getStoredBaseUrl(): string | null {\n return process.env.SUPERCHECK_URL ?? store.get('baseUrl') ?? null\n}\n\n/**\n * Store a base URL for self-hosted instances.\n */\nexport function setBaseUrl(url: string): void {\n store.set('baseUrl', url)\n}\n\n/**\n * Get the stored organization context.\n */\nexport function getStoredOrganization(): string | null {\n return process.env.SUPERCHECK_ORG ?? store.get('organization') ?? null\n}\n\n/**\n * Store the active organization.\n */\nexport function setOrganization(org: string): void {\n store.set('organization', org)\n}\n\n/**\n * Get the stored project context.\n */\nexport function getStoredProject(): string | null {\n return process.env.SUPERCHECK_PROJECT ?? store.get('project') ?? null\n}\n\n/**\n * Store the active project.\n */\nexport function setProject(project: string): void {\n store.set('project', project)\n}\n\n/**\n * Check if authenticated (token is available).\n */\nexport function isAuthenticated(): boolean {\n return getToken() !== null\n}\n\n/**\n * Require authentication — throw if no token available.\n */\nexport function requireAuth(): string {\n const token = getToken()\n if (!token) {\n throw new AuthenticationError(\n 'Not authenticated. Run `supercheck login` or set SUPERCHECK_TOKEN environment variable.',\n )\n }\n return token\n}\n\nexport function requireTriggerKey(): string {\n const key = getTriggerKey()\n if (!key) {\n throw new AuthenticationError(\n 'Missing trigger key. Set SUPERCHECK_TRIGGER_KEY (sck_trigger_* or job_*) to use `supercheck job trigger`.',\n )\n }\n return key\n}\n","/**\n * Standard CLI exit codes.\n *\n * 0 — Success\n * 1 — General error\n * 2 — Authentication error\n * 3 — Configuration error\n * 4 — Network / API error\n * 5 — Timeout\n */\nexport enum ExitCode {\n Success = 0,\n GeneralError = 1,\n AuthError = 2,\n ConfigError = 3,\n ApiError = 4,\n Timeout = 5,\n}\n\nexport class CLIError extends Error {\n public readonly exitCode: ExitCode\n\n constructor(message: string, exitCode: ExitCode = ExitCode.GeneralError) {\n super(message)\n this.name = 'CLIError'\n this.exitCode = exitCode\n }\n}\n\nexport class AuthenticationError extends CLIError {\n constructor(message: string) {\n super(message, ExitCode.AuthError)\n this.name = 'AuthenticationError'\n }\n}\n\nexport class ConfigurationError extends CLIError {\n constructor(message: string) {\n super(message, ExitCode.ConfigError)\n this.name = 'ConfigurationError'\n }\n}\n\nexport class ApiRequestError extends CLIError {\n public readonly statusCode?: number\n public readonly responseBody?: unknown\n\n constructor(message: string, statusCode?: number, responseBody?: unknown) {\n super(message, ExitCode.ApiError)\n this.name = 'ApiRequestError'\n this.statusCode = statusCode\n this.responseBody = responseBody\n }\n}\n\nexport class TimeoutError extends CLIError {\n constructor(message: string) {\n super(message, ExitCode.Timeout)\n this.name = 'TimeoutError'\n }\n}\n\nexport class ConfigNotFoundError extends CLIError {\n constructor(message: string = 'No supercheck.config.ts found. Run `supercheck init` to create one.') {\n super(message, ExitCode.ConfigError)\n this.name = 'ConfigNotFoundError'\n }\n}\n","import pc from 'picocolors'\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent'\n\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n silent: 4,\n}\n\nlet currentLevel: LogLevel = 'info'\nlet quietMode = false\n\nexport function setLogLevel(level: LogLevel): void {\n currentLevel = level\n}\n\nexport function setQuietMode(quiet: boolean): void {\n quietMode = quiet\n if (quiet) currentLevel = 'error'\n}\n\nfunction shouldLog(level: LogLevel): boolean {\n return LOG_LEVELS[level] >= LOG_LEVELS[currentLevel]\n}\n\nexport const logger = {\n debug(message: string, ...args: unknown[]): void {\n if (shouldLog('debug')) {\n console.error(pc.gray(`[debug] ${message}`), ...args)\n }\n },\n\n info(message: string, ...args: unknown[]): void {\n if (shouldLog('info') && !quietMode) {\n console.error(message, ...args)\n }\n },\n\n success(message: string, ...args: unknown[]): void {\n if (shouldLog('info') && !quietMode) {\n console.error(pc.green(`✓ ${message}`), ...args)\n }\n },\n\n warn(message: string, ...args: unknown[]): void {\n if (shouldLog('warn')) {\n console.error(pc.yellow(`⚠ ${message}`), ...args)\n }\n },\n\n error(message: string, ...args: unknown[]): void {\n if (shouldLog('error')) {\n console.error(pc.red(`✗ ${message}`), ...args)\n }\n },\n\n /**\n * Output data to stdout (not stderr).\n * This is for machine-readable output (JSON, tables).\n */\n output(data: string): void {\n console.log(data)\n },\n\n newline(): void {\n if (!quietMode) console.error('')\n },\n\n /**\n * Print a styled header.\n */\n header(text: string): void {\n if (!quietMode) {\n console.error(pc.bold(pc.cyan(text)))\n }\n },\n}\n","// Version is injected at build time by tsup via define\ndeclare const __CLI_VERSION__: string\n\nexport const CLI_VERSION: string = typeof __CLI_VERSION__ !== 'undefined' ? __CLI_VERSION__ : '0.0.0-dev'\n","import { ProxyAgent } from 'undici'\n\n/**\n * Shared ProxyAgent cache — avoids creating duplicate agents\n * for the same proxy URL within a single CLI run.\n */\nconst proxyAgents = new Map<string, ProxyAgent>()\n\nexport function getProxyAgent(proxyUrl: string): ProxyAgent {\n const existing = proxyAgents.get(proxyUrl)\n if (existing) return existing\n const created = new ProxyAgent(proxyUrl)\n proxyAgents.set(proxyUrl, created)\n return created\n}\n\n/**\n * Clear all cached ProxyAgent instances (useful for testing).\n */\nexport function clearProxyAgents(): void {\n proxyAgents.clear()\n}\n\n/**\n * Check if a URL matches the NO_PROXY exclusion list.\n */\nexport function isNoProxyMatch(url: URL, noProxyRaw: string): boolean {\n const hostname = url.hostname\n const port = url.port || (url.protocol === 'https:' ? '443' : '80')\n const entries = noProxyRaw\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean)\n\n if (entries.includes('*')) return true\n\n for (const entry of entries) {\n const [hostPart, portPart] = entry.split(':')\n const host = hostPart.trim()\n const entryPort = portPart?.trim()\n\n if (!host) continue\n if (entryPort && entryPort !== port) continue\n\n if (host.startsWith('.')) {\n if (hostname.endsWith(host)) return true\n continue\n }\n\n if (hostname === host) return true\n if (hostname.endsWith(`.${host}`)) return true\n }\n\n return false\n}\n\n/**\n * Get the appropriate proxy URL from environment variables for a given URL.\n * Respects HTTPS_PROXY, HTTP_PROXY, and NO_PROXY conventions.\n */\nexport function getProxyEnv(url: URL): string | null {\n const noProxyRaw = process.env.NO_PROXY ?? process.env.no_proxy\n if (noProxyRaw && isNoProxyMatch(url, noProxyRaw)) {\n return null\n }\n\n if (url.protocol === 'https:') {\n return (\n process.env.HTTPS_PROXY ??\n process.env.https_proxy ??\n process.env.HTTP_PROXY ??\n process.env.http_proxy ??\n null\n )\n }\n\n if (url.protocol === 'http:') {\n return process.env.HTTP_PROXY ?? process.env.http_proxy ?? null\n }\n\n return null\n}\n","import { ApiRequestError, TimeoutError } from '../utils/errors.js'\nimport { logger } from '../utils/logger.js'\nimport { CLI_VERSION } from '../version.js'\nimport { getProxyAgent as getSharedProxyAgent, clearProxyAgents, getProxyEnv } from '../utils/proxy.js'\n\nexport { clearProxyAgents }\n\nconst DEFAULT_BASE_URL = 'https://app.supercheck.io'\nconst DEFAULT_TIMEOUT_MS = 30_000\nconst MAX_RETRIES = 3\nconst RETRY_BACKOFF_MS = 1_000\n\nexport interface ApiClientOptions {\n baseUrl?: string\n token?: string\n timeout?: number\n proxy?: string\n}\n\nexport interface ApiResponse<T = unknown> {\n data: T\n status: number\n headers: Headers\n}\n\nexport interface PaginatedResponse<T = unknown> {\n data: T[]\n pagination: {\n total: number\n page: number\n limit: number\n totalPages: number\n hasNextPage: boolean\n hasPrevPage: boolean\n }\n}\n\nexport class ApiClient {\n private baseUrl: string\n private token: string | null\n private timeout: number\n private proxy: string | null\n\n constructor(options: ApiClientOptions = {}) {\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n this.token = options.token ?? null\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT_MS\n this.proxy = options.proxy ?? null\n }\n\n setToken(token: string): void {\n this.token = token\n }\n\n setBaseUrl(url: string): void {\n this.baseUrl = url.replace(/\\/$/, '')\n }\n\n setTimeout(timeout: number): void {\n this.timeout = timeout\n }\n\n setProxy(proxy: string | null): void {\n this.proxy = proxy\n }\n\n private buildHeaders(extraHeaders?: Record<string, string>): Headers {\n const headers = new Headers({\n 'Content-Type': 'application/json',\n 'User-Agent': `supercheck-cli/${CLI_VERSION}`,\n ...extraHeaders,\n })\n\n if (this.token) {\n headers.set('Authorization', `Bearer ${this.token}`)\n }\n\n return headers\n }\n\n private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>): string {\n const url = new URL(`${this.baseUrl}${path}`)\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value))\n }\n }\n }\n return url.toString()\n }\n\n /**\n * Execute an HTTP request with retries, timeout, and rate limit handling.\n *\n * Retry policy:\n * - 429 (rate limit): retried for all methods (with Retry-After header)\n * - 5xx (server error): retried only for idempotent methods (GET, PUT, DELETE, HEAD, OPTIONS)\n * - Network errors: retried only for idempotent methods\n * - POST and PATCH are NOT retried on 5xx/network errors to prevent duplicate mutations\n */\n async request<T = unknown>(\n method: string,\n path: string,\n options?: {\n body?: unknown\n params?: Record<string, string | number | boolean | undefined>\n headers?: Record<string, string>\n retries?: number\n },\n ): Promise<ApiResponse<T>> {\n const url = this.buildUrl(path, options?.params)\n const parsedUrl = new URL(url)\n const headers = this.buildHeaders(options?.headers)\n const maxRetries = options?.retries ?? MAX_RETRIES\n\n // Only retry idempotent methods on server errors and network failures.\n // POST and PATCH are non-idempotent — retrying them risks duplicate creates/triggers/deletes.\n const upperMethod = method.toUpperCase()\n const isIdempotent = ['GET', 'PUT', 'DELETE', 'HEAD', 'OPTIONS'].includes(upperMethod)\n\n let lastError: Error | null = null\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n try {\n const controller = new AbortController()\n timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n // Use explicitly-set proxy, otherwise resolve from env vars (NO_PROXY-aware)\n const proxy = this.proxy || getProxyEnv(parsedUrl)\n const fetchOptions: RequestInit & { dispatcher?: unknown } = {\n method,\n headers,\n body: options?.body ? JSON.stringify(options.body) : undefined,\n signal: controller.signal,\n }\n\n if (proxy) {\n fetchOptions.dispatcher = getSharedProxyAgent(proxy)\n }\n\n const response = await fetch(url, fetchOptions)\n\n clearTimeout(timeoutId)\n timeoutId = null\n\n // Rate limit handling\n if (response.status === 429) {\n if (attempt >= maxRetries) {\n throw new ApiRequestError(\n `Rate limited after ${maxRetries + 1} attempts: ${method} ${path}`,\n 429,\n )\n }\n\n const retryAfter = response.headers.get('Retry-After')\n const parsedSeconds = retryAfter ? Number(retryAfter) : NaN\n const waitMs = Number.isFinite(parsedSeconds) && parsedSeconds > 0\n ? parsedSeconds * 1000\n : RETRY_BACKOFF_MS * Math.pow(2, attempt)\n\n logger.warn(`Rate limited. Retrying in ${Math.round(waitMs / 1000)}s...`)\n await this.sleep(waitMs)\n continue\n }\n\n // Server error — retry only for idempotent methods\n if (response.status >= 500 && attempt < maxRetries && isIdempotent) {\n const waitMs = RETRY_BACKOFF_MS * Math.pow(2, attempt)\n logger.debug(`Server error ${response.status}. Retrying in ${waitMs}ms...`)\n await this.sleep(waitMs)\n continue\n }\n\n // Read response body as text first to safely handle empty/non-JSON responses (e.g. 204 No Content)\n const text = await response.text()\n\n // Client error — don't retry\n if (!response.ok) {\n let responseBody: unknown\n try {\n responseBody = JSON.parse(text)\n } catch {\n responseBody = text\n }\n\n throw new ApiRequestError(\n `API request failed: ${method} ${path} → ${response.status}`,\n response.status,\n responseBody,\n )\n }\n\n const data = text ? (JSON.parse(text) as T) : ({} as T)\n\n return {\n data,\n status: response.status,\n headers: response.headers,\n }\n } catch (err) {\n if (err instanceof ApiRequestError) throw err\n\n if (err instanceof DOMException && err.name === 'AbortError') {\n throw new TimeoutError(`Request timed out after ${this.timeout}ms: ${method} ${path}`)\n }\n\n lastError = err as Error\n\n if (attempt < maxRetries && isIdempotent) {\n const waitMs = RETRY_BACKOFF_MS * Math.pow(2, attempt)\n logger.debug(`Network error: ${(err as Error).message}. Retrying in ${waitMs}ms...`)\n await this.sleep(waitMs)\n }\n } finally {\n if (timeoutId !== null) clearTimeout(timeoutId)\n }\n }\n\n throw new ApiRequestError(\n `Request failed after ${maxRetries + 1} attempts: ${lastError?.message ?? 'Unknown error'}`,\n )\n }\n\n async get<T = unknown>(\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n ): Promise<ApiResponse<T>> {\n return this.request<T>('GET', path, { params })\n }\n\n async post<T = unknown>(path: string, body?: unknown): Promise<ApiResponse<T>> {\n return this.request<T>('POST', path, { body })\n }\n\n async put<T = unknown>(path: string, body?: unknown): Promise<ApiResponse<T>> {\n return this.request<T>('PUT', path, { body })\n }\n\n async patch<T = unknown>(path: string, body?: unknown): Promise<ApiResponse<T>> {\n return this.request<T>('PATCH', path, { body })\n }\n\n async delete<T = unknown>(path: string): Promise<ApiResponse<T>> {\n return this.request<T>('DELETE', path)\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n }\n}\n\nlet defaultClient: ApiClient | null = null\n\n/**\n * Get or create the default API client singleton.\n * If options are provided and a client already exists, the token and baseUrl\n * are updated to reflect the caller's intent (e.g., after login).\n */\nexport function getApiClient(options?: ApiClientOptions): ApiClient {\n if (!defaultClient) {\n defaultClient = new ApiClient(options)\n } else if (options) {\n if (options.token !== undefined) defaultClient.setToken(options.token)\n if (options.baseUrl !== undefined) defaultClient.setBaseUrl(options.baseUrl)\n if (options.timeout !== undefined) defaultClient.setTimeout(options.timeout)\n if (options.proxy !== undefined) defaultClient.setProxy(options.proxy)\n }\n return defaultClient\n}\n\n/**\n * Reset the default API client (useful for testing).\n */\nexport function resetApiClient(): void {\n defaultClient = null\n}\n","import { readdirSync, statSync, readFileSync } from 'node:fs'\nimport { resolve, relative, basename } from 'node:path'\nimport { logger } from './logger.js'\n\nexport interface DiscoveredFile {\n absolutePath: string\n relativePath: string\n filename: string\n type: 'playwright' | 'k6'\n}\n\n/**\n * Match files against a simple glob pattern.\n * Supports: ** (any depth), * (any chars in segment)\n */\nfunction matchGlob(filePath: string, pattern: string): boolean {\n // Use safe placeholders (no regex special chars) to protect globs during escaping\n const withPlaceholders = pattern\n .replace(/\\/\\*\\*\\//g, '__GLOBSTAR_SLASH__') // Handle /**/ explicitly to support zero-or-more dirs\n .replace(/\\*\\*/g, '__GLOBSTAR__')\n .replace(/\\*/g, '__STAR__')\n .replace(/\\?/g, '__QMARK__')\n\n // Escape all regex-special characters in the remaining literal text\n const escaped = withPlaceholders.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n // Restore glob wildcards as regex equivalents\n const regexStr = escaped\n .replace(/__GLOBSTAR_SLASH__/g, '(?:/|/.+/)')\n .replace(/__GLOBSTAR__/g, '.*')\n .replace(/__STAR__/g, '[^/]*')\n .replace(/__QMARK__/g, '.')\n\n return new RegExp(`^${regexStr}$`).test(filePath)\n}\n\nconst SKIP_DIRS = new Set([\n 'node_modules', '.git', '.next', '.nuxt', 'dist', 'build',\n 'out', 'coverage', '.turbo', '.cache', '.vercel', 'vendor',\n])\n\n/**\n * Recursively walk a directory, returning all files.\n */\nfunction walkDir(dir: string): string[] {\n const results: string[] = []\n\n try {\n const entries = readdirSync(dir, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = resolve(dir, entry.name)\n if (entry.isDirectory()) {\n if (SKIP_DIRS.has(entry.name)) continue\n results.push(...walkDir(fullPath))\n } else if (entry.isFile()) {\n results.push(fullPath)\n }\n }\n } catch {\n // Directory doesn't exist or isn't readable\n }\n\n return results\n}\n\n/**\n * Extract the static directory prefix from a glob pattern.\n * e.g. '_supercheck_/**\\/*.pw.ts' -> '_supercheck_'\n */\nfunction getGlobStaticPrefix(pattern: string): string | null {\n const parts = pattern.split('/')\n const staticParts: string[] = []\n for (const part of parts) {\n if (part.includes('*') || part.includes('?') || part.includes('{') || part.includes('[')) break\n staticParts.push(part)\n }\n return staticParts.length > 0 ? staticParts.join('/') : null\n}\n\n/**\n * Discover test files matching glob patterns from the config.\n */\nexport function discoverFiles(\n cwd: string,\n patterns: { playwright?: string; k6?: string },\n): DiscoveredFile[] {\n // Collect unique root directories to walk based on glob static prefixes\n const walkRoots = new Set<string>()\n for (const pattern of [patterns.playwright, patterns.k6]) {\n if (!pattern) continue\n const prefix = getGlobStaticPrefix(pattern)\n if (prefix) {\n walkRoots.add(resolve(cwd, prefix))\n } else {\n // Fallback: no static prefix means we must walk cwd\n walkRoots.add(cwd)\n }\n }\n\n // Deduplicate: if cwd is in the set, it subsumes everything else\n if (walkRoots.has(cwd) && walkRoots.size > 1) {\n walkRoots.clear()\n walkRoots.add(cwd)\n }\n\n const allFiles: string[] = []\n for (const root of walkRoots) {\n allFiles.push(...walkDir(root))\n }\n\n const discovered: DiscoveredFile[] = []\n\n for (const absPath of allFiles) {\n const relPath = relative(cwd, absPath)\n const name = basename(absPath)\n\n if (patterns.playwright && matchGlob(relPath, patterns.playwright)) {\n discovered.push({\n absolutePath: absPath,\n relativePath: relPath,\n filename: name,\n type: 'playwright',\n })\n } else if (patterns.k6 && matchGlob(relPath, patterns.k6)) {\n discovered.push({\n absolutePath: absPath,\n relativePath: relPath,\n filename: name,\n type: 'k6',\n })\n }\n }\n\n logger.debug(`Discovered ${discovered.length} test files`)\n return discovered\n}\n\n/**\n * Read a file's content as a UTF-8 string, or return null on error.\n */\nexport function readFileContent(filePath: string): string | null {\n try {\n return readFileSync(filePath, 'utf-8')\n } catch {\n logger.warn(`Cannot read file: ${filePath}`)\n return null\n }\n}\n\n/**\n * Get file size in bytes.\n */\nexport function getFileSize(filePath: string): number {\n try {\n return statSync(filePath).size\n } catch {\n return 0\n }\n}\n","/**\n * Shared utilities for test filename generation and script metadata handling.\n */\n\n/**\n * Convert a string to a URL/filesystem-friendly slug.\n * Used for generating human-readable test filenames from titles.\n *\n * @example\n * slugify('Homepage Check') // 'homepage-check'\n * slugify('load-test') // 'load-test'\n * slugify(' Spaced Title ') // 'spaced-title'\n */\nexport function slugify(text: string): string {\n return (\n text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, '') // Remove non-word chars (except spaces and hyphens)\n .replace(/[\\s_]+/g, '-') // Replace spaces/underscores with hyphens\n .replace(/-+/g, '-') // Collapse multiple hyphens\n .replace(/^-|-$/g, '') // Trim leading/trailing hyphens\n .slice(0, 50) || 'test' // Limit length, fallback to 'test'\n )\n}\n\n/**\n * Generate a test filename with a human-readable slug prefix.\n *\n * Format: `{slug}.{uuid}.{pw|k6}.ts`\n *\n * The slug makes files identifiable at a glance in the file explorer,\n * while the UUID ensures stable, deterministic paths that survive\n * test renames (the UUID is the canonical identifier).\n *\n * @example\n * testFilename('019c49bd-...', 'Homepage Check', 'playwright')\n * // → 'homepage-check.019c49bd-....pw.ts'\n */\nexport function testFilename(\n testId: string,\n title: string,\n testType: 'playwright' | 'k6',\n): string {\n const ext = testType === 'k6' ? '.k6.ts' : '.pw.ts'\n const slug = slugify(title)\n return `${slug}.${testId}${ext}`\n}\n\n/**\n * Regex for extracting a UUID from the end of a filename stem.\n * Matches UUID v1–v7 at the end of the string or preceded by a dot separator.\n */\nconst UUID_EXTRACT_REGEX =\n /(?:^|\\.)([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i\n\n/**\n * Extract the UUID from a test filename (with or without slug prefix).\n *\n * Handles both old format (`{uuid}.pw.ts`) and new format (`{slug}.{uuid}.pw.ts`).\n *\n * @returns The UUID string, or `undefined` if no UUID found.\n */\nexport function extractUuidFromFilename(filename: string): string | undefined {\n const base = filename.split(/[/\\\\]/).pop() ?? filename\n const stem = base.replace(/\\.(pw|k6)\\.ts$/, '')\n const match = UUID_EXTRACT_REGEX.exec(stem)\n return match ? match[1] : undefined\n}\n\n/**\n * Strip `@title` metadata from a test script.\n *\n * The `@title` annotation is a local-only developer convenience injected\n * during `supercheck pull`. It should not be included in API payloads or\n * used for diff comparison — the `title` field is the canonical source.\n *\n * Handles:\n * - `// @title My Title\\n\\n` (single-line comment prefix)\n * - `* @title My Title` inside JSDoc blocks\n */\nexport function stripTitleMetadata(script: string): string {\n // Strip leading single-line // @title ... and optional trailing blank line\n let result = script.replace(/^\\/\\/\\s*@title\\s+[^\\n]+\\n\\n?/, '')\n // Strip * @title ... line from JSDoc blocks\n result = result.replace(/\\n\\s*\\*\\s*@title\\s+[^\\n]+/, '')\n return result\n}\n","import { getApiClient } from '../api/client.js'\nimport { discoverFiles, readFileContent } from './discovery.js'\nimport { logger } from './logger.js'\nimport { ApiRequestError } from './errors.js'\nimport { extractUuidFromFilename, stripTitleMetadata } from './slug.js'\nimport type { LocalResource, RemoteResource } from './reconcile.js'\nimport type { SupercheckConfig } from '../config/schema.js'\nimport type { PaginatedResponse } from '../api/client.js'\n\n/**\n * Build local resource list from the loaded config + discovered files.\n */\nexport function buildLocalResources(config: SupercheckConfig, cwd: string): LocalResource[] {\n const resources: LocalResource[] = []\n\n if (config.jobs) {\n for (const job of config.jobs) {\n resources.push({\n id: job.id,\n type: 'job',\n name: job.name,\n definition: {\n ...job,\n tests: normalizeJobTestsToIds(job.tests),\n },\n })\n }\n }\n\n if (config.variables) {\n for (const v of config.variables) {\n resources.push({\n id: v.id,\n type: 'variable',\n name: v.key,\n definition: { key: v.key, value: v.value, isSecret: v.isSecret, description: v.description },\n })\n }\n }\n\n if (config.tags) {\n for (const t of config.tags) {\n resources.push({\n id: t.id,\n type: 'tag',\n name: t.name,\n definition: { name: t.name, color: t.color },\n })\n }\n }\n\n if (Array.isArray(config.monitors)) {\n for (const m of config.monitors) {\n resources.push({\n id: m.id,\n type: 'monitor',\n name: m.name,\n definition: { ...m },\n })\n }\n } else if (typeof config.monitors === 'string') {\n logger.warn(\n `monitors is set to a glob pattern (\"${config.monitors}\") but glob-based monitor discovery is not yet implemented. ` +\n 'Define monitors as an inline array in your config, or remove the monitors field.',\n )\n }\n\n if (Array.isArray(config.statusPages)) {\n for (const sp of config.statusPages) {\n resources.push({\n id: sp.id,\n type: 'statusPage',\n name: sp.name,\n definition: { ...sp },\n })\n }\n } else if (typeof config.statusPages === 'string') {\n logger.warn(\n `statusPages is set to a glob pattern (\"${config.statusPages}\") but glob-based status page discovery is not yet implemented. ` +\n 'Define status pages as an inline array in your config, or remove the statusPages field.',\n )\n }\n\n const patterns = {\n playwright: config.tests?.playwright?.testMatch,\n k6: config.tests?.k6?.testMatch,\n }\n const files = discoverFiles(cwd, patterns)\n for (const file of files) {\n const script = readFileContent(file.absolutePath)\n if (script) {\n // Parse UUID from filename — supports both formats:\n // slug.uuid.pw.ts (new) and uuid.pw.ts (legacy)\n const testId = extractUuidFromFilename(file.filename)\n\n if (!testId) {\n logger.debug(`Test file \"${file.filename}\" does not have a UUID-based filename — will be treated as a new resource`)\n }\n\n // Parse metadata from script content (e.g. // @title My Test Title or * @title My Test Title)\n const titleMatch = script.match(/@title\\s+(.+)$/m)\n const stem = file.filename.replace(/\\.(pw|k6)\\.ts$/, '')\n const title = titleMatch ? titleMatch[1].trim() : stem\n\n // Strip @title metadata from script for comparison/deploy.\n // The @title annotation is local-only developer convenience;\n // the `title` field is the canonical source for the test name.\n const cleanScript = stripTitleMetadata(script)\n\n const displayName = file.relativePath.replace(/^_supercheck_\\//, '')\n\n resources.push({\n id: testId,\n type: 'test',\n name: displayName,\n definition: {\n id: testId,\n title,\n testType: file.type === 'playwright' ? 'playwright' : 'k6',\n script: cleanScript,\n },\n })\n }\n }\n\n return resources\n}\n\n/** Maximum items per page when fetching paginated resources. */\nconst PAGE_LIMIT = 200\n\n/**\n * Fetch all pages of a paginated API endpoint.\n *\n * Iterates through every page so that reconciliation and destroy commands\n * see the complete set of remote resources, regardless of how many exist.\n */\nexport async function fetchAllPages<T = Record<string, unknown>>(\n client: ReturnType<typeof getApiClient>,\n endpoint: string,\n label: string,\n): Promise<T[]> {\n const items: T[] = []\n let page = 1\n let totalPages = 1\n\n do {\n const { data } = await client.get<PaginatedResponse<T>>(endpoint, {\n limit: String(PAGE_LIMIT),\n page: String(page),\n })\n items.push(...data.data)\n\n if (data.pagination) {\n totalPages = data.pagination.totalPages\n }\n\n page++\n } while (page <= totalPages)\n\n if (totalPages > 1) {\n logger.debug(`Fetched ${totalPages} pages of ${label} (${items.length} total)`)\n }\n\n return items\n}\n\n/**\n * Safely extract a string `id` from a raw resource record.\n * Returns `undefined` if the value is missing or not a usable identifier.\n */\nfunction safeId(value: unknown): string | undefined {\n if (value === undefined || value === null) return undefined\n const str = String(value)\n if (str === 'undefined' || str === 'null' || str === '') return undefined\n return str\n}\n\n/**\n * Normalize an alertConfig object by removing server defaults.\n * Mirrors the stripping logic in pull.ts buildMonitorDefinitions/buildJobDefinitions.\n */\nfunction normalizeAlertConfig(alert: Record<string, unknown>): Record<string, unknown> | undefined {\n const normalized = { ...alert }\n\n // Remove empty/default values\n if (normalized.customMessage === '' || normalized.customMessage === null) delete normalized.customMessage\n if (normalized.failureThreshold === 1) delete normalized.failureThreshold\n if (normalized.recoveryThreshold === 1) delete normalized.recoveryThreshold\n\n // Remove false boolean flags (they're defaults)\n for (const key of ['alertOnFailure', 'alertOnRecovery', 'alertOnSslExpiration', 'alertOnSuccess', 'alertOnTimeout']) {\n if (normalized[key] === false) delete normalized[key]\n }\n\n // Remove empty notificationProviders array\n if (Array.isArray(normalized.notificationProviders) && (normalized.notificationProviders as string[]).length === 0) {\n delete normalized.notificationProviders\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined\n}\n\n/**\n * Normalize monitor config by removing runtime-only and default fields.\n * Mirrors pull.ts buildMonitorDefinitions stripping logic.\n */\nfunction normalizeMonitorConfig(config: Record<string, unknown>): Record<string, unknown> | undefined {\n const normalized = { ...config }\n\n // Remove runtime-only fields\n delete normalized.sslLastCheckedAt\n delete normalized.aggregatedAlertState\n\n // Clean up default playwrightOptions\n if (normalized.playwrightOptions && typeof normalized.playwrightOptions === 'object') {\n const opts = { ...(normalized.playwrightOptions as Record<string, unknown>) }\n if (opts.retries === 0) delete opts.retries\n if (opts.timeout === 300000) delete opts.timeout\n if (opts.headless === true) delete opts.headless\n normalized.playwrightOptions = Object.keys(opts).length > 0 ? opts : undefined\n if (!normalized.playwrightOptions) delete normalized.playwrightOptions\n }\n\n // Clean up locationConfig\n if (normalized.locationConfig && typeof normalized.locationConfig === 'object') {\n const loc = { ...(normalized.locationConfig as Record<string, unknown>) }\n const hasLocations = Array.isArray(loc.locations) && (loc.locations as string[]).length > 0\n if (!loc.enabled || !hasLocations) {\n delete normalized.locationConfig\n } else {\n if (loc.enabled === true) delete loc.enabled\n if (loc.strategy === 'majority') delete loc.strategy\n if (loc.threshold === 50) delete loc.threshold\n normalized.locationConfig = Object.keys(loc).length > 0 ? loc : undefined\n if (!normalized.locationConfig) delete normalized.locationConfig\n }\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined\n}\n\n/**\n * Normalize remote resource raw data to match the shape that pull generates in config.\n * This ensures round-trip fidelity: pull → diff produces no phantom changes.\n */\nfunction normalizeRemoteRaw(type: string, raw: Record<string, unknown>): Record<string, unknown> {\n const normalized = { ...raw }\n\n // Remove metadata fields that are never written to config\n delete normalized.createdAt\n delete normalized.updatedAt\n delete normalized.projectId\n delete normalized.organizationId\n delete normalized.createdByUserId\n\n if (type === 'monitor') {\n if (normalized.config && typeof normalized.config === 'object') {\n normalized.config = normalizeMonitorConfig(normalized.config as Record<string, unknown>)\n if (!normalized.config) delete normalized.config\n }\n if (normalized.alertConfig && typeof normalized.alertConfig === 'object') {\n normalized.alertConfig = normalizeAlertConfig(normalized.alertConfig as Record<string, unknown>)\n if (!normalized.alertConfig) delete normalized.alertConfig\n }\n }\n\n if (type === 'test') {\n // Map API 'type' to 'testType' matching local resource structure\n // k6/performance tests map to 'k6'; all other types (browser, api, database, custom) map to 'playwright'\n if (normalized.type === 'performance') normalized.testType = 'k6'\n else normalized.testType = 'playwright'\n \n // Remove original 'type' field to avoid field mismatch in diff\n delete normalized.type\n\n // Strip @title metadata from script for clean comparison.\n // The @title is a local-only annotation injected during pull;\n // title is already tracked as a separate field.\n if (typeof normalized.script === 'string') {\n normalized.script = stripTitleMetadata(normalized.script)\n }\n }\n\n if (type === 'job') {\n // Normalize tests array to UUIDs for stable diff/deploy comparisons\n if (Array.isArray(normalized.tests)) {\n normalized.tests = (normalized.tests as Array<Record<string, unknown> | string>).map((t) => {\n if (typeof t === 'string') return extractUuidFromFilename(t) ?? t\n if (t && typeof t === 'object' && t.id) {\n return String(t.id)\n }\n return t\n })\n }\n\n if (normalized.alertConfig && typeof normalized.alertConfig === 'object') {\n normalized.alertConfig = normalizeAlertConfig(normalized.alertConfig as Record<string, unknown>)\n if (!normalized.alertConfig) delete normalized.alertConfig\n }\n\n // Remove runtime state\n delete normalized.status\n }\n\n if (type === 'variable') {\n // Normalize: pull writes value as empty string for secrets, normalise undefined → ''\n if (normalized.value === undefined || normalized.value === null) {\n normalized.value = ''\n }\n }\n\n if (type === 'statusPage') {\n // Normalize description field name: API may use pageDescription\n if (normalized.pageDescription !== undefined && normalized.description === undefined) {\n normalized.description = normalized.pageDescription\n }\n delete normalized.pageDescription\n // Normalize: empty/undefined description\n if (!normalized.description) delete normalized.description\n }\n\n return normalized\n}\n\n/**\n * Normalize job test references to UUIDs.\n * Accepts IDs, filenames, or paths and returns UUIDs when possible.\n */\nfunction normalizeJobTestsToIds(tests: string[] | undefined): string[] | undefined {\n if (!tests) return tests\n\n return tests.map((t) => {\n const id = extractUuidFromFilename(t)\n return id ?? t\n })\n}\n\n/**\n * Fetch remote resources from the Supercheck API.\n */\nexport async function fetchRemoteResources(client: ReturnType<typeof getApiClient>): Promise<RemoteResource[]> {\n const resources: RemoteResource[] = []\n\n try {\n const jobs = await fetchAllPages<Record<string, unknown>>(client, '/api/jobs', 'jobs')\n for (const job of jobs) {\n const id = safeId(job.id)\n if (!id) { logger.debug('Skipping job with missing id'); continue }\n resources.push({ id, type: 'job', name: String(job.name ?? ''), raw: normalizeRemoteRaw('job', job) })\n }\n } catch (err) { logFetchError('jobs', err) }\n\n try {\n const tests = await fetchAllPages<Record<string, unknown>>(client, '/api/tests?includeScript=true', 'tests')\n for (const test of tests) {\n const id = safeId(test.id)\n if (!id) { logger.debug('Skipping test with missing id'); continue }\n resources.push({ id, type: 'test', name: String(test.title ?? ''), raw: normalizeRemoteRaw('test', test) })\n }\n } catch (err) { logFetchError('tests', err) }\n\n try {\n const monitors = await fetchAllPages<Record<string, unknown>>(client, '/api/monitors', 'monitors')\n for (const monitor of monitors) {\n const id = safeId(monitor.id)\n if (!id) { logger.debug('Skipping monitor with missing id'); continue }\n resources.push({ id, type: 'monitor', name: String(monitor.name ?? ''), raw: normalizeRemoteRaw('monitor', monitor) })\n }\n } catch (err) { logFetchError('monitors', err) }\n\n try {\n const { data } = await client.get<Array<Record<string, unknown>>>('/api/variables')\n for (const v of data) {\n const id = safeId(v.id)\n if (!id) { logger.debug('Skipping variable with missing id'); continue }\n resources.push({ id, type: 'variable', name: String(v.key ?? ''), raw: normalizeRemoteRaw('variable', v) })\n }\n } catch (err) { logFetchError('variables', err) }\n\n try {\n const { data } = await client.get<Array<Record<string, unknown>>>('/api/tags')\n for (const t of data) {\n const id = safeId(t.id)\n if (!id) { logger.debug('Skipping tag with missing id'); continue }\n resources.push({ id, type: 'tag', name: String(t.name ?? ''), raw: normalizeRemoteRaw('tag', t) })\n }\n } catch (err) { logFetchError('tags', err) }\n\n try {\n const statusPages = await fetchAllPages<Record<string, unknown>>(client, '/api/status-pages', 'status-pages')\n for (const sp of statusPages) {\n const id = safeId(sp.id)\n if (!id) { logger.debug('Skipping status page with missing id'); continue }\n resources.push({ id, type: 'statusPage', name: String(sp.name ?? ''), raw: normalizeRemoteRaw('statusPage', sp) })\n }\n } catch (err) { logFetchError('status-pages', err) }\n\n return resources\n}\n\n/**\n * Log fetch errors with appropriate severity.\n * 404s are debug-level (resource type may not be enabled), other errors are warnings.\n */\nfunction logFetchError(resourceType: string, err: unknown): void {\n if (err instanceof ApiRequestError && err.statusCode === 404) {\n logger.debug(`Could not fetch ${resourceType} (not found)`)\n } else {\n const msg = err instanceof Error ? err.message : String(err)\n logger.warn(`Could not fetch ${resourceType}: ${msg}`)\n }\n}\n\n/**\n * Map resource type to the correct API endpoint.\n */\nexport function getApiEndpoint(type: string): string {\n switch (type) {\n case 'job': return '/api/jobs'\n case 'test': return '/api/tests'\n case 'monitor': return '/api/monitors'\n case 'variable': return '/api/variables'\n case 'tag': return '/api/tags'\n case 'statusPage': return '/api/status-pages'\n default: throw new Error(`Unknown resource type: ${type}`)\n }\n}\n\n/**\n * Safe token preview that handles short tokens gracefully.\n * Returns a masked version suitable for user-facing log output.\n */\nexport function safeTokenPreview(token: string): string {\n if (!token || token.length === 0) return '(empty)'\n if (token.length <= 4) return `${token.substring(0, 1)}***`\n if (token.length <= 8) {\n return `${token.substring(0, 4)}...`\n }\n if (token.length <= 20) {\n // Show only the prefix (e.g. sck_live_) + a few chars\n return `${token.substring(0, Math.min(token.length - 4, 12))}...`\n }\n return `${token.substring(0, 12)}...${token.substring(token.length - 4)}`\n}\n","import ora, { type Ora } from 'ora'\nimport { getOutputFormat } from '../output/formatter.js'\nimport { logger } from './logger.js'\n\n/**\n * Create a spinner for long-running operations.\n * Spinners are disabled in JSON/quiet mode for clean output.\n */\nexport function createSpinner(text: string): Ora {\n const format = getOutputFormat()\n const isInteractive = format === 'table'\n\n const spinner = ora({\n text,\n // Disable spinner in non-interactive modes\n isSilent: !isInteractive,\n // Use dots style for a clean look\n spinner: 'dots',\n })\n\n return spinner\n}\n\n/**\n * Run an async operation with a spinner.\n * Shows success/failure automatically.\n */\nexport async function withSpinner<T>(\n text: string,\n fn: () => Promise<T>,\n options?: {\n successText?: string | ((result: T) => string)\n failText?: string\n },\n): Promise<T> {\n const spinner = createSpinner(text)\n spinner.start()\n\n try {\n const result = await fn()\n const successMessage =\n typeof options?.successText === 'function'\n ? options.successText(result)\n : options?.successText ?? text.replace(/\\.\\.\\.?$/, '')\n\n spinner.succeed(successMessage)\n return result\n } catch (error) {\n const failMessage = options?.failText ?? text.replace(/\\.\\.\\.?$/, ' failed')\n spinner.fail(failMessage)\n throw error\n }\n}\n\n/**\n * Simple spinner for manual control.\n */\nexport function startSpinner(text: string): {\n succeed: (text?: string) => void\n fail: (text?: string) => void\n update: (text: string) => void\n stop: () => void\n} {\n const format = getOutputFormat()\n const isInteractive = format === 'table'\n\n if (!isInteractive) {\n // In non-interactive mode, just log and return no-ops\n logger.info(text)\n return {\n succeed: (msg) => msg && logger.success(msg),\n fail: (msg) => msg && logger.error(msg),\n update: () => {},\n stop: () => {},\n }\n }\n\n const spinner = ora({ text, spinner: 'dots' }).start()\n\n return {\n succeed: (msg) => spinner.succeed(msg),\n fail: (msg) => spinner.fail(msg),\n update: (msg) => {\n spinner.text = msg\n },\n stop: () => spinner.stop(),\n }\n}\n","import Table from 'cli-table3'\nimport pc from 'picocolors'\nimport { logger } from '../utils/logger.js'\n\nexport type OutputFormat = 'table' | 'json' | 'quiet'\n\nexport type OutputColumn = {\n key: string\n header: string\n width?: number\n format?: (value: unknown, row: Record<string, unknown>) => string\n}\n\nlet currentFormat: OutputFormat = 'table'\n\nexport function setOutputFormat(format: OutputFormat): void {\n currentFormat = format\n}\n\nexport function getOutputFormat(): OutputFormat {\n return currentFormat\n}\n\n/**\n * Format and output data based on the current output format.\n */\nexport function output<T extends Record<string, unknown>>(\n data: T | T[],\n options?: {\n columns?: OutputColumn[]\n },\n): void {\n switch (currentFormat) {\n case 'json':\n logger.output(JSON.stringify(data, null, 2))\n break\n\n case 'quiet':\n // In quiet mode, only output IDs or minimal info\n if (Array.isArray(data)) {\n for (const item of data) {\n if ('id' in item) logger.output(String(item.id))\n }\n } else if ('id' in data) {\n logger.output(String(data.id))\n }\n break\n\n case 'table':\n default:\n outputTable(data, options?.columns)\n break\n }\n}\n\nfunction outputTable<T extends Record<string, unknown>>(\n data: T | T[] | undefined | null,\n columns?: OutputColumn[],\n): void {\n // Handle undefined/null data\n if (data === undefined || data === null) {\n logger.info('No results found.')\n return\n }\n\n // Convert to array and filter out undefined/null items\n const rawItems = Array.isArray(data) ? data : [data]\n const items = rawItems.filter((item): item is T => item !== undefined && item !== null)\n\n if (items.length === 0) {\n logger.info('No results found.')\n return\n }\n\n // Use provided columns or infer from first item\n const cols: OutputColumn[] = columns ?? Object.keys(items[0]).map((key) => ({\n key,\n header: key.charAt(0).toUpperCase() + key.slice(1),\n }))\n\n const table = new Table({\n head: cols.map((c) => c.header),\n style: {\n head: ['cyan'],\n border: ['gray'],\n },\n })\n\n for (const item of items) {\n // Safely access each column value\n table.push(cols.map((c) => formatValue(item?.[c.key], c, item)))\n }\n\n logger.output(table.toString())\n}\n\n/**\n * Status values that should be colorized\n */\nconst STATUS_COLORS: Record<string, 'success' | 'error' | 'warning'> = {\n // Success states (green)\n up: 'success',\n ok: 'success',\n success: 'success',\n passed: 'success',\n active: 'success',\n sent: 'success',\n enabled: 'success',\n healthy: 'success',\n running: 'success',\n completed: 'success',\n\n // Error states (red)\n down: 'error',\n failed: 'error',\n error: 'error',\n blocked: 'error',\n unhealthy: 'error',\n cancelled: 'error',\n canceled: 'error',\n\n // Warning states (yellow)\n paused: 'warning',\n pending: 'warning',\n disabled: 'warning',\n degraded: 'warning',\n unknown: 'warning',\n queued: 'warning',\n warning: 'warning',\n skipped: 'warning',\n inactive: 'warning',\n}\n\n/**\n * Format a status value with color and indicator\n */\nfunction formatStatus(status: string): string {\n const normalizedStatus = status.toLowerCase()\n const colorType = STATUS_COLORS[normalizedStatus]\n\n if (!colorType) {\n return status\n }\n\n switch (colorType) {\n case 'success':\n return pc.green(`● ${status}`)\n case 'error':\n return pc.red(`● ${status}`)\n case 'warning':\n return pc.yellow(`● ${status}`)\n default:\n return status\n }\n}\n\nfunction formatValue(value: unknown, column?: OutputColumn, row?: Record<string, unknown>): string {\n if (column?.format && row) {\n return column.format(value, row)\n }\n\n if (value === null || value === undefined) return pc.dim('-')\n\n if (typeof value === 'boolean') {\n return value ? pc.green('✓') : pc.red('✗')\n }\n\n if (value instanceof Date) return formatDate(value)\n\n if (Array.isArray(value)) {\n // If the array contains objects, serialize them as JSON instead of producing [object Object]\n if (value.length > 0 && typeof value[0] === 'object' && value[0] !== null) {\n return JSON.stringify(value)\n }\n return value.join(', ')\n }\n\n if (typeof value === 'number') {\n const dateForNumber = maybeFormatDate(value, column?.key)\n if (dateForNumber) return dateForNumber\n return String(value)\n }\n\n if (typeof value === 'object') return JSON.stringify(value)\n\n const strValue = String(value)\n\n const dateForString = maybeFormatDate(strValue, column?.key)\n if (dateForString) return dateForString\n\n // Check if this looks like a status value\n if (STATUS_COLORS[strValue.toLowerCase()]) {\n return formatStatus(strValue)\n }\n\n return strValue\n}\n\nconst DATE_KEY_PATTERN = /(At|Date|Time|Timestamp)$/i\n\nfunction maybeFormatDate(value: string | number, key?: string): string | null {\n if (!key && typeof value !== 'string') return null\n\n if (key && !DATE_KEY_PATTERN.test(key) && typeof value !== 'string') return null\n\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) return null\n\n if (typeof value === 'string') {\n const isIsoLike = value.includes('T') || value.endsWith('Z') || /[+-]\\d{2}:?\\d{2}$/.test(value)\n if (!isIsoLike) return null\n return formatDate(date)\n }\n\n return formatDate(date)\n}\n\nfunction formatDate(date: Date): string {\n return date.toISOString().replace('T', ' ').replace('Z', '')\n}\n\n/**\n * Summarize an array of objects for detail view display.\n * Returns a compact string like \"3 items\" or a key preview for small arrays.\n */\nfunction summarizeArray(_key: string, items: unknown[]): string {\n if (items.length === 0) return pc.dim('(none)')\n\n // For simple arrays of primitives, join them\n if (typeof items[0] !== 'object' || items[0] === null) {\n return items.join(', ')\n }\n\n // For arrays of objects, show count + a summary of identifiable fields\n const previews: string[] = []\n for (const item of items.slice(0, 3)) {\n const obj = item as Record<string, unknown>\n // Try common identifier fields\n const name = obj.name ?? obj.title ?? obj.key ?? obj.id\n if (name) previews.push(String(name))\n }\n\n const countStr = `${items.length} ${items.length === 1 ? 'item' : 'items'}`\n if (previews.length === 0) return countStr\n const previewStr = previews.join(', ')\n return items.length > 3\n ? `${countStr} (${previewStr}, ...)`\n : `${countStr} (${previewStr})`\n}\n\n/**\n * Output a single key-value pair detail view.\n *\n * Nested objects are rendered as indented sub-sections.\n * Arrays of objects show a summary count with identifiers.\n */\nexport function outputDetail(data: Record<string, unknown>): void {\n if (currentFormat === 'json') {\n logger.output(JSON.stringify(data, null, 2))\n return\n }\n\n if (currentFormat === 'quiet') {\n if ('id' in data) logger.output(String(data.id))\n return\n }\n\n const keys = Object.keys(data)\n if (keys.length === 0) {\n logger.info('No details available.')\n return\n }\n\n // Separate scalar/simple fields from nested complex fields\n const scalarEntries: [string, unknown][] = []\n const nestedEntries: [string, Record<string, unknown>][] = []\n\n for (const [key, value] of Object.entries(data)) {\n if (\n value !== null &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date)\n ) {\n nestedEntries.push([key, value as Record<string, unknown>])\n } else {\n scalarEntries.push([key, value])\n }\n }\n\n // Render scalar fields first\n if (scalarEntries.length > 0) {\n const maxKeyLen = Math.max(...scalarEntries.map(([k]) => k.length))\n for (const [key, value] of scalarEntries) {\n const label = key.padEnd(maxKeyLen + 2)\n let formatted: string\n if (Array.isArray(value)) {\n formatted = summarizeArray(key, value)\n } else {\n formatted = formatValue(value, { key, header: key }, data)\n }\n logger.output(` ${label}${formatted}`)\n }\n }\n\n // Render nested objects as indented sub-sections\n for (const [key, obj] of nestedEntries) {\n logger.output('')\n logger.output(` ${pc.bold(key)}:`)\n const subKeys = Object.keys(obj)\n if (subKeys.length === 0) {\n logger.output(` ${pc.dim('(empty)')}`)\n continue\n }\n const maxSubKeyLen = Math.max(...subKeys.map((k) => k.length))\n for (const [subKey, subVal] of Object.entries(obj)) {\n const subLabel = subKey.padEnd(maxSubKeyLen + 2)\n let formatted: string\n if (Array.isArray(subVal)) {\n formatted = summarizeArray(subKey, subVal)\n } else {\n formatted = formatValue(subVal, { key: subKey, header: subKey }, obj)\n }\n logger.output(` ${subLabel}${formatted}`)\n }\n }\n}\n","import { Command } from 'commander'\nimport { getApiClient } from '../api/client.js'\nimport { getStoredBaseUrl } from '../auth/store.js'\nimport { tryLoadConfig } from '../config/loader.js'\nimport { logger } from '../utils/logger.js'\nimport { output } from '../output/formatter.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { withSpinner } from '../utils/spinner.js'\n\nexport const healthCommand = new Command('health')\n .description('Check Supercheck API health')\n .option('--url <url>', 'Supercheck API URL')\n .action(async (options: { url?: string }) => {\n const configResult = await tryLoadConfig()\n const baseUrl = options.url\n ?? getStoredBaseUrl()\n ?? configResult?.config.api?.baseUrl\n ?? 'https://app.supercheck.io'\n\n const client = getApiClient({ baseUrl })\n\n try {\n const data = await withSpinner(\n `Checking API health at ${baseUrl}...`,\n async () => {\n const { data } = await client.get<{\n status: string\n timestamp?: string\n latencyMs?: number\n checks?: Record<string, { status: string; latencyMs?: number; error?: string }>\n }>('/api/health')\n return data\n },\n { successText: 'Health check complete' },\n )\n\n // Build a flat view for display\n const checks = data.checks ?? {}\n const displayData: Record<string, unknown> = {\n status: data.status,\n database: checks.database?.status ?? 'n/a',\n redis: checks.redis?.status ?? 'n/a',\n s3: checks.s3?.status ?? 'n/a',\n latencyMs: data.latencyMs,\n }\n\n output(displayData as Record<string, unknown>, {\n columns: [\n { key: 'status', header: 'Status' },\n { key: 'database', header: 'Database' },\n { key: 'redis', header: 'Redis' },\n { key: 's3', header: 'S3' },\n { key: 'latencyMs', header: 'Latency (ms)' },\n ],\n })\n\n if (data.status === 'ok') {\n logger.success(`API is healthy at ${baseUrl}`)\n } else {\n throw new CLIError(`API reports degraded status at ${baseUrl}`, ExitCode.ApiError)\n }\n } catch (err) {\n if (err instanceof CLIError) throw err\n logger.error(`Cannot reach API at ${baseUrl}`)\n if (err instanceof Error) {\n logger.debug(err.message)\n }\n throw new CLIError(`Cannot reach API at ${baseUrl}`, ExitCode.ApiError)\n }\n })\n\nexport const locationsCommand = new Command('locations')\n .description('List available execution locations')\n .action(async () => {\n const configResult = await tryLoadConfig()\n const baseUrl = getStoredBaseUrl()\n ?? configResult?.config.api?.baseUrl\n ?? 'https://app.supercheck.io'\n\n const client = getApiClient({ baseUrl })\n\n const locations = await withSpinner(\n 'Fetching execution locations...',\n async () => {\n const { data } = await client.get<\n | { locations: Array<{ id?: string; code?: string; name: string; region: string }> }\n | { success: boolean; data: Array<{ code: string; name: string; region: string }> }\n >('/api/locations')\n\n return 'locations' in data\n ? data.locations\n : (data.data ?? [])\n },\n { successText: 'Locations loaded' },\n )\n\n output(locations as unknown as Record<string, unknown>[], {\n columns: [\n { key: 'code', header: 'Code' },\n { key: 'name', header: 'Name' },\n { key: 'region', header: 'Region' },\n ],\n })\n })\n","import { createJiti } from 'jiti'\nimport { deepmerge } from 'deepmerge-ts'\nimport { existsSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { supercheckConfigSchema, type SupercheckConfig } from './schema.js'\nimport { CLIError, ConfigNotFoundError, ExitCode } from '../utils/errors.js'\n\nconst CONFIG_FILES = [\n 'supercheck.config.ts',\n 'supercheck.config.js',\n 'supercheck.config.mjs',\n]\n\nconst LOCAL_CONFIG_FILES = [\n 'supercheck.config.local.ts',\n 'supercheck.config.local.js',\n 'supercheck.config.local.mjs',\n]\n\n/**\n * Resolve the config file path. Search order:\n * 1. Explicit --config flag\n * 2. supercheck.config.{ts,js,mjs} in cwd\n */\nfunction resolveConfigPath(cwd: string, explicitPath?: string): string | null {\n if (explicitPath) {\n const abs = resolve(cwd, explicitPath)\n if (!existsSync(abs)) {\n throw new CLIError(\n `Config file not found: ${abs}`,\n ExitCode.ConfigError,\n )\n }\n return abs\n }\n\n for (const file of CONFIG_FILES) {\n const abs = resolve(cwd, file)\n if (existsSync(abs)) return abs\n }\n\n return null\n}\n\n/**\n * Resolve local override config file path.\n */\nfunction resolveLocalConfigPath(cwd: string): string | null {\n for (const file of LOCAL_CONFIG_FILES) {\n const abs = resolve(cwd, file)\n if (existsSync(abs)) return abs\n }\n return null\n}\n\n/**\n * Load a TS/JS config file using jiti (zero-config TS execution).\n */\nasync function loadConfigFile(filePath: string): Promise<unknown> {\n const jiti = createJiti(dirname(filePath), {\n interopDefault: true,\n })\n\n const mod = await jiti.import(filePath) as Record<string, unknown>\n return mod.default ?? mod\n}\n\n/**\n * Apply environment variable overrides to the config.\n */\nfunction applyEnvOverrides(config: SupercheckConfig): SupercheckConfig {\n const result = { ...config }\n\n if (process.env.SUPERCHECK_URL) {\n result.api = {\n ...result.api,\n baseUrl: process.env.SUPERCHECK_URL,\n }\n }\n\n if (process.env.SUPERCHECK_ORG) {\n result.project = {\n ...result.project,\n organization: process.env.SUPERCHECK_ORG,\n }\n }\n\n if (process.env.SUPERCHECK_PROJECT) {\n result.project = {\n ...result.project,\n project: process.env.SUPERCHECK_PROJECT,\n }\n }\n\n return result\n}\n\n/**\n * Detect secrets in config values that should never be stored in config files.\n * Checks for all token formats including legacy `job_` prefix trigger keys.\n */\nfunction validateNoSecrets(config: SupercheckConfig): void {\n const configStr = JSON.stringify(config)\n const secretPatterns = [\n /sck_live_[a-zA-Z0-9]+/,\n /sck_trigger_[a-zA-Z0-9]+/,\n /sck_test_[a-zA-Z0-9]+/,\n // Legacy trigger key format: job_ followed by 32+ hex chars\n /job_[a-fA-F0-9]{32,}/,\n ]\n\n for (const pattern of secretPatterns) {\n if (pattern.test(configStr)) {\n throw new CLIError(\n 'Config file contains what appears to be an API token. ' +\n 'Tokens must be stored in environment variables (SUPERCHECK_TOKEN) or the OS keychain, never in config files.',\n ExitCode.ConfigError,\n )\n }\n }\n}\n\nexport interface LoadConfigOptions {\n cwd?: string\n configPath?: string\n}\n\nexport interface LoadConfigResult {\n config: SupercheckConfig\n configPath: string | null\n}\n\n/**\n * Load, merge, validate, and return the Supercheck configuration.\n *\n * Priority (highest to lowest):\n * 1. Environment variables\n * 2. supercheck.config.local.{ts,js,mjs}\n * 3. supercheck.config.{ts,js,mjs}\n */\nexport async function loadConfig(options: LoadConfigOptions = {}): Promise<LoadConfigResult> {\n const cwd = options.cwd ?? process.cwd()\n\n // Load .env file if present (quiet: true suppresses injection logs)\n const { config: loadEnv } = await import('dotenv')\n loadEnv({ path: resolve(cwd, '.env'), quiet: true })\n\n const configPath = resolveConfigPath(cwd, options.configPath)\n if (!configPath) {\n throw new ConfigNotFoundError()\n }\n\n let config = await loadConfigFile(configPath) as SupercheckConfig\n\n const localConfigPath = resolveLocalConfigPath(cwd)\n if (localConfigPath) {\n const localConfig = await loadConfigFile(localConfigPath) as Partial<SupercheckConfig>\n config = deepmerge(config, localConfig) as SupercheckConfig\n }\n\n config = applyEnvOverrides(config)\n\n validateNoSecrets(config)\n\n const parsed = supercheckConfigSchema.safeParse(config)\n if (!parsed.success) {\n const issues = parsed.error.issues\n .map((i) => ` - ${i.path.join('.')}: ${i.message}`)\n .join('\\n')\n throw new CLIError(\n `Invalid configuration:\\n${issues}`,\n ExitCode.ConfigError,\n )\n }\n\n return {\n config: parsed.data,\n configPath,\n }\n}\n\n/**\n * Try to load config, but return null if no config file exists.\n * Used by commands that don't strictly require a config (e.g., login, health).\n */\nexport async function tryLoadConfig(options: LoadConfigOptions = {}): Promise<LoadConfigResult | null> {\n try {\n return await loadConfig(options)\n } catch (err) {\n if (err instanceof ConfigNotFoundError) {\n return null\n }\n throw err\n }\n}\n","import { z } from 'zod'\n\n// --- Leaf schemas ---\n\nexport const tagDefinitionSchema = z.object({\n /** Database UUID. Present for existing resources, omitted for new ones. */\n id: z.string().uuid().optional(),\n name: z.string().min(1),\n color: z.string().optional(),\n})\n\nexport const variableDefinitionSchema = z.object({\n /** Database UUID. Present for existing resources, omitted for new ones. */\n id: z.string().uuid().optional(),\n key: z.string().min(1),\n value: z.string(),\n isSecret: z.boolean().default(false),\n description: z.string().optional(),\n})\n\nexport const notificationProviderDefinitionSchema = z.object({\n /** Database UUID. Present for existing resources, omitted for new ones. */\n id: z.string().uuid().optional(),\n name: z.string().min(1),\n type: z.enum(['email', 'slack', 'webhook', 'telegram', 'discord', 'teams']),\n config: z.record(z.unknown()),\n})\n\n// --- Alert Config ---\n\n/** Base alert configuration shared by monitors and jobs. */\nexport const alertConfigSchema = z.object({\n enabled: z.boolean().optional(),\n notificationProviders: z.array(z.string()).optional(),\n alertOnFailure: z.boolean().optional(),\n alertOnSuccess: z.boolean().optional(),\n alertOnTimeout: z.boolean().optional(),\n alertOnRecovery: z.boolean().optional(),\n alertOnSslExpiration: z.boolean().optional(),\n failureThreshold: z.number().int().positive().optional(),\n recoveryThreshold: z.number().int().positive().optional(),\n customMessage: z.string().optional(),\n}).passthrough()\n\n// --- Playwright & k6 ---\n\nexport const playwrightTestConfigSchema = z.object({\n testMatch: z.string().default('_supercheck_/playwright/**/*.pw.ts'),\n browser: z.enum(['chromium', 'firefox', 'webkit']).default('chromium'),\n})\n\nexport const k6TestConfigSchema = z.object({\n testMatch: z.string().default('_supercheck_/k6/**/*.k6.ts'),\n})\n\nexport const testsConfigSchema = z.object({\n playwright: playwrightTestConfigSchema.optional(),\n k6: k6TestConfigSchema.optional(),\n})\n\n// --- Monitors ---\n\nexport const monitorDefinitionSchema = z.object({\n /** Database UUID. Present for existing resources, omitted for new ones. */\n id: z.string().uuid().optional(),\n name: z.string().min(1),\n description: z.string().optional(),\n type: z.enum(['http_request', 'website', 'ping_host', 'port_check', 'synthetic_test']),\n target: z.string().optional(),\n frequencyMinutes: z.number().int().positive().optional(),\n enabled: z.boolean().optional(),\n config: z.record(z.unknown()).optional(),\n alertConfig: alertConfigSchema.optional(),\n tags: z.array(z.string()).optional(),\n})\n\n// --- Jobs ---\n\nexport const jobDefinitionSchema = z.object({\n /** Database UUID. Present for existing resources, omitted for new ones. */\n id: z.string().uuid().optional(),\n name: z.string().min(1),\n description: z.string().optional(),\n jobType: z.enum(['playwright', 'k6']).optional(),\n tests: z.array(z.string()).min(1),\n cronSchedule: z.string().optional(),\n status: z.string().optional(),\n alertConfig: alertConfigSchema.optional(),\n tags: z.array(z.string()).optional(),\n})\n\n// --- Status Pages ---\n\nexport const statusPageComponentDefinitionSchema = z.object({\n /** Database UUID. Present for existing resources, omitted for new ones. */\n id: z.string().uuid().optional(),\n name: z.string().min(1),\n description: z.string().optional(),\n monitors: z.array(z.string()).optional(),\n position: z.number().int().min(0).optional(),\n})\n\nexport const statusPageDefinitionSchema = z.object({\n /** Database UUID. Present for existing resources, omitted for new ones. */\n id: z.string().uuid().optional(),\n name: z.string().min(1),\n subdomain: z.string().optional(),\n status: z.enum(['draft', 'published', 'archived']).optional(),\n description: z.string().optional(),\n headline: z.string().optional(),\n supportUrl: z.string().optional(),\n components: z.array(statusPageComponentDefinitionSchema).optional(),\n branding: z.object({\n bodyBackgroundColor: z.string().optional(),\n fontColor: z.string().optional(),\n greens: z.string().optional(),\n reds: z.string().optional(),\n }).optional(),\n notifications: z.object({\n allowEmailSubscribers: z.boolean().default(true),\n allowWebhookSubscribers: z.boolean().default(false),\n allowRssFeed: z.boolean().default(true),\n }).optional(),\n})\n\n// --- Project, API, Defaults ---\n\nexport const projectConfigSchema = z.object({\n organization: z.string().min(1),\n project: z.string().min(1),\n})\n\nexport const apiConfigSchema = z.object({\n baseUrl: z.string().url().default('https://app.supercheck.io'),\n})\n\nexport const defaultsConfigSchema = z.object({\n runLocation: z.string().optional(),\n timeout: z.number().int().positive().optional(),\n})\n\n// --- Root config ---\n\nexport const supercheckConfigSchema = z.object({\n schemaVersion: z.literal('1.0'),\n project: projectConfigSchema,\n api: apiConfigSchema.optional(),\n defaults: defaultsConfigSchema.optional(),\n tests: testsConfigSchema.optional(),\n monitors: z.union([\n z.string(),\n z.array(monitorDefinitionSchema),\n ]).optional(),\n statusPages: z.union([\n z.string(),\n z.array(statusPageDefinitionSchema),\n ]).optional(),\n jobs: z.array(jobDefinitionSchema).optional(),\n notificationProviders: z.array(notificationProviderDefinitionSchema).optional(),\n variables: z.array(variableDefinitionSchema).optional(),\n tags: z.array(tagDefinitionSchema).optional(),\n})\n\n// --- Inferred types ---\n\nexport type AlertConfig = z.infer<typeof alertConfigSchema>\nexport type SupercheckConfig = z.infer<typeof supercheckConfigSchema>\nexport type SupercheckUserConfig = z.input<typeof supercheckConfigSchema>\nexport type ProjectConfig = z.infer<typeof projectConfigSchema>\nexport type ApiConfig = z.infer<typeof apiConfigSchema>\nexport type DefaultsConfig = z.infer<typeof defaultsConfigSchema>\nexport type TestsConfig = z.infer<typeof testsConfigSchema>\nexport type PlaywrightTestConfig = z.infer<typeof playwrightTestConfigSchema>\nexport type K6TestConfig = z.infer<typeof k6TestConfigSchema>\nexport type MonitorDefinition = z.infer<typeof monitorDefinitionSchema>\nexport type JobDefinition = z.infer<typeof jobDefinitionSchema>\nexport type StatusPageDefinition = z.infer<typeof statusPageDefinitionSchema>\nexport type StatusPageComponentDefinition = z.infer<typeof statusPageComponentDefinitionSchema>\nexport type NotificationProviderDefinition = z.infer<typeof notificationProviderDefinitionSchema>\nexport type VariableDefinition = z.infer<typeof variableDefinitionSchema>\nexport type TagDefinition = z.infer<typeof tagDefinitionSchema>\n","import { Command } from 'commander'\nimport { loadConfig } from '../config/loader.js'\nimport { logger } from '../utils/logger.js'\nimport { output } from '../output/formatter.js'\n\nexport const configCommand = new Command('config')\n .description('Configuration management')\n\nconfigCommand\n .command('validate')\n .description('Validate supercheck.config.ts')\n .option('--config <path>', 'Path to config file')\n .action(async (options: { config?: string }) => {\n const { config, configPath } = await loadConfig({ configPath: options.config })\n logger.success(`Valid configuration loaded from ${configPath}`)\n logger.info(` Organization: ${config.project.organization}`)\n logger.info(` Project: ${config.project.project}`)\n })\n\nconfigCommand\n .command('print')\n .description('Print the resolved configuration')\n .option('--config <path>', 'Path to config file')\n .action(async (options: { config?: string }) => {\n const { config } = await loadConfig({ configPath: options.config })\n output(config as unknown as Record<string, unknown>)\n })\n","import { Command } from 'commander'\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, appendFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { logger } from '../utils/logger.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { detectPackageManager, ensurePackageJson, installDependencies } from '../utils/package-manager.js'\nimport { installPlaywrightBrowsers, isK6Installed, getK6InstallHint } from '../utils/deps.js'\nimport { uuidv7 } from '../utils/uuid.js'\nimport { slugify } from '../utils/slug.js'\n\nconst CONFIG_TEMPLATE = `import { defineConfig } from '@supercheck/cli'\n\nexport default defineConfig({\n schemaVersion: '1.0',\n project: {\n organization: 'my-org',\n project: 'my-project',\n },\n api: {\n baseUrl: process.env.SUPERCHECK_URL ?? 'https://app.supercheck.io',\n },\n tests: {\n playwright: {\n testMatch: '_supercheck_/playwright/**/*.pw.ts',\n browser: 'chromium',\n },\n k6: {\n testMatch: '_supercheck_/k6/**/*.k6.ts',\n },\n },\n})\n`\n\nconst EXAMPLE_PW_TEST = `// @title Homepage Check\n\nimport { test, expect } from '@playwright/test'\n\ntest('homepage loads successfully', async ({ page }) => {\n await page.goto('https://example.com')\n await expect(page).toHaveTitle(/Example/)\n})\n`\n\nconst EXAMPLE_K6_TEST = `// @title Load Test\n\nimport http from 'k6/http'\nimport { check, sleep } from 'k6'\n\nexport const options = {\n vus: 10,\n duration: '30s',\n}\n\nexport default function () {\n const res = http.get('https://example.com')\n check(res, {\n 'status is 200': (r) => r.status === 200,\n 'response time < 500ms': (r) => r.timings.duration < 500,\n })\n sleep(1)\n}\n`\n\nconst SUPERCHECK_TSCONFIG = `{\n \"compilerOptions\": {\n \"target\": \"ES2022\",\n \"module\": \"ESNext\",\n \"moduleResolution\": \"bundler\",\n \"esModuleInterop\": true,\n \"strict\": true,\n \"skipLibCheck\": true,\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"noEmit\": true,\n \"types\": [\"node\", \"k6\"]\n },\n \"include\": [\n \"supercheck.config.ts\",\n \"supercheck.config.local.ts\",\n \"_supercheck_/**/*.ts\"\n ]\n}\n`\n\nconst GITIGNORE_ADDITIONS = `\n# Supercheck CLI\nsupercheck.config.local.ts\nsupercheck.config.local.js\nsupercheck.config.local.mjs\n`\n\nexport const initCommand = new Command('init')\n .description('Initialize a new Supercheck project with config and example tests')\n .option('--force', 'Overwrite existing config file')\n .option('--skip-install', 'Skip automatic dependency installation')\n .option('--skip-examples', 'Skip creating example test files')\n .option('--pm <manager>', 'Package manager to use (npm, yarn, pnpm, bun)')\n .action(async (options: { force?: boolean; skipInstall?: boolean; skipExamples?: boolean; pm?: string }) => {\n const cwd = process.cwd()\n\n const configPath = resolve(cwd, 'supercheck.config.ts')\n if (existsSync(configPath) && !options.force) {\n throw new CLIError(\n 'supercheck.config.ts already exists. Use --force to overwrite.',\n ExitCode.ConfigError,\n )\n }\n\n logger.newline()\n logger.header('Initializing Supercheck project...')\n logger.newline()\n\n // 1. Write supercheck.config.ts\n writeFileSync(configPath, CONFIG_TEMPLATE, 'utf-8')\n logger.success('Created supercheck.config.ts')\n\n // 2. Write tsconfig.supercheck.json for IDE IntelliSense\n const tsconfigPath = resolve(cwd, 'tsconfig.supercheck.json')\n if (!existsSync(tsconfigPath) || options.force) {\n writeFileSync(tsconfigPath, SUPERCHECK_TSCONFIG, 'utf-8')\n logger.success('Created tsconfig.supercheck.json (IDE IntelliSense)')\n }\n\n // 3. Create _supercheck_/ directory structure\n const supercheckDir = resolve(cwd, '_supercheck_')\n const playwrightDir = resolve(supercheckDir, 'playwright')\n const k6Dir = resolve(supercheckDir, 'k6')\n for (const dir of [supercheckDir, playwrightDir, k6Dir]) {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n }\n logger.success('Created _supercheck_/ directory structure')\n\n // 4. Create example test files (unless --skip-examples)\n // Uses UUID v7 filenames to match the server's ID format, preventing\n // duplicate tests on deploy → pull round-trips.\n if (!options.skipExamples) {\n const pwTitle = 'Homepage Check'\n const pwId = uuidv7()\n const pwSlug = slugify(pwTitle)\n const pwFilename = `${pwSlug}.${pwId}.pw.ts`\n const pwTestPath = resolve(cwd, `_supercheck_/playwright/${pwFilename}`)\n if (!existsSync(pwTestPath)) {\n writeFileSync(pwTestPath, EXAMPLE_PW_TEST, 'utf-8')\n logger.success(`Created _supercheck_/playwright/${pwFilename} (Playwright example)`)\n }\n\n const k6Title = 'Load Test'\n const k6Id = uuidv7()\n const k6Slug = slugify(k6Title)\n const k6Filename = `${k6Slug}.${k6Id}.k6.ts`\n const k6TestPath = resolve(cwd, `_supercheck_/k6/${k6Filename}`)\n if (!existsSync(k6TestPath)) {\n writeFileSync(k6TestPath, EXAMPLE_K6_TEST, 'utf-8')\n logger.success(`Created _supercheck_/k6/${k6Filename} (k6 example)`)\n }\n }\n\n // 5. Update .gitignore\n const gitignorePath = resolve(cwd, '.gitignore')\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, 'utf-8')\n if (!content.includes('supercheck.config.local')) {\n appendFileSync(gitignorePath, GITIGNORE_ADDITIONS, 'utf-8')\n logger.success('Updated .gitignore with Supercheck entries')\n }\n }\n\n // 6. Detect package manager\n const pm = (options.pm as 'npm' | 'yarn' | 'pnpm' | 'bun') ?? detectPackageManager(cwd)\n logger.debug(`Detected package manager: ${pm}`)\n\n // 7. Ensure package.json exists\n const createdPkg = ensurePackageJson(cwd)\n if (createdPkg) {\n logger.success('Created package.json')\n }\n\n // 8. Install dependencies\n await installDependencies(cwd, pm, {\n packages: options.skipExamples ? ['@supercheck/cli', 'typescript', '@types/node', '@types/k6'] : ['@supercheck/cli', 'typescript', '@types/node', '@playwright/test', '@types/k6'],\n skipInstall: options.skipInstall ?? false,\n })\n\n // 9. Install Playwright browsers (chromium) — needed for local test execution\n if (!options.skipInstall && !options.skipExamples) {\n logger.newline()\n const browserInstalled = await installPlaywrightBrowsers(cwd, 'chromium')\n if (browserInstalled) {\n logger.success('Playwright chromium browser installed')\n } else {\n logger.warn('Could not install Playwright browsers automatically.')\n logger.info(' Run manually: npx playwright install chromium')\n }\n }\n\n // 10. Check for k6 (optional, for performance tests)\n const k6Status = isK6Installed()\n\n logger.newline()\n logger.header('Supercheck project initialized!')\n logger.newline()\n\n if (!k6Status.installed) {\n logger.warn('k6 is not installed (needed for performance/load tests)')\n logger.info(` Install: ${getK6InstallHint()}`)\n logger.info(' Docs: https://grafana.com/docs/k6/latest/set-up/install-k6/')\n logger.newline()\n }\n\n logger.info('Next steps:')\n logger.info(' 1. Edit supercheck.config.ts with your org/project details')\n logger.info(' 2. Run `supercheck login --token <your-token>` to authenticate')\n logger.info(' 3. Write tests in _supercheck_/playwright and _supercheck_/k6')\n logger.info(' 4. Run `supercheck diff` to preview changes against the cloud')\n logger.info(' 5. Run `supercheck deploy` to push to Supercheck')\n logger.info(' 6. Run `supercheck pull` to sync cloud resources locally')\n logger.newline()\n logger.info('Useful commands:')\n logger.info(' supercheck pull Pull tests & config from the cloud')\n logger.info(' supercheck diff Preview local vs remote differences')\n logger.info(' supercheck deploy Push local config to Supercheck')\n logger.info(' supercheck whoami Check authentication status')\n logger.newline()\n })\n","import { existsSync, writeFileSync } from 'node:fs'\nimport { resolve, basename } from 'node:path'\nimport { logger } from './logger.js'\nimport { CLIError, ExitCode } from './errors.js'\nimport { withSpinner } from './spinner.js'\n\n/**\n * Detect the package manager used in the project.\n * Checks for lock files in order of priority.\n */\nexport function detectPackageManager(cwd: string): 'npm' | 'yarn' | 'pnpm' | 'bun' {\n if (existsSync(resolve(cwd, 'bun.lockb')) || existsSync(resolve(cwd, 'bun.lock'))) return 'bun'\n if (existsSync(resolve(cwd, 'pnpm-lock.yaml'))) return 'pnpm'\n if (existsSync(resolve(cwd, 'yarn.lock'))) return 'yarn'\n return 'npm'\n}\n\n/**\n * Get the install command for dev dependencies based on the detected package manager.\n */\nfunction getInstallCommand(pm: 'npm' | 'yarn' | 'pnpm' | 'bun', packages: string[]): string {\n const pkgs = packages.join(' ')\n switch (pm) {\n case 'bun': return `bun add -d ${pkgs}`\n case 'pnpm': return `pnpm add -D ${pkgs}`\n case 'yarn': return `yarn add -D ${pkgs}`\n case 'npm': return `npm install --save-dev ${pkgs}`\n }\n}\n\n/**\n * Ensure a package.json exists. If not, create a minimal one.\n * Returns true if a new file was created, false if it already existed.\n */\nexport function ensurePackageJson(cwd: string): boolean {\n const pkgPath = resolve(cwd, 'package.json')\n if (existsSync(pkgPath)) return false\n\n const projectName = basename(cwd).toLowerCase().replace(/[^a-z0-9-]/g, '-')\n\n const minimalPkg = {\n name: projectName,\n private: true,\n type: 'module',\n scripts: {\n 'supercheck:deploy': 'supercheck deploy',\n 'supercheck:diff': 'supercheck diff',\n 'supercheck:pull': 'supercheck pull',\n 'supercheck:test': 'supercheck test',\n },\n }\n\n writeFileSync(pkgPath, JSON.stringify(minimalPkg, null, 2) + '\\n', 'utf-8')\n return true\n}\n\n/**\n * Install dev dependencies required for Supercheck tests.\n */\nexport async function installDependencies(\n cwd: string,\n pm: 'npm' | 'yarn' | 'pnpm' | 'bun',\n opts: { \n packages?: string[], \n skipInstall?: boolean \n } = {}\n): Promise<void> {\n if (opts.skipInstall) {\n logger.info('Skipping dependency installation')\n return\n }\n\n const devDeps = opts.packages ?? ['@supercheck/cli', 'typescript', '@types/node']\n const cmd = getInstallCommand(pm, devDeps)\n\n logger.info(`Installing dependencies with ${pm}...`)\n logger.debug(`Running: ${cmd}`)\n\n await withSpinner(\n `Installing ${devDeps.length} packages...`,\n async () => {\n const { execSync } = await import('node:child_process')\n try {\n execSync(cmd, {\n cwd,\n stdio: 'pipe',\n timeout: 120_000, // 2 minute timeout\n env: { ...process.env, NODE_ENV: 'development' },\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n throw new CLIError(\n `Failed to install dependencies. Run manually:\\n ${cmd}\\n\\nError: ${message}`,\n ExitCode.GeneralError,\n )\n }\n },\n { successText: 'Dependencies installed' },\n )\n}\n\n/**\n * Check if k6 is installed and available in the PATH.\n */\nexport async function checkK6Binary(): Promise<boolean> {\n const { execSync } = await import('node:child_process')\n try {\n execSync('k6 version', { stdio: 'ignore' })\n return true\n } catch {\n return false\n }\n}\n","import { execSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport pc from 'picocolors'\nimport { logger } from './logger.js'\n\nexport interface DependencyStatus {\n name: string\n installed: boolean\n version?: string\n detail?: string\n required: boolean\n installHint: string\n}\n\n/**\n * Check if a command is available on PATH.\n */\nexport function isCommandAvailable(command: string): { available: boolean; version?: string } {\n try {\n const output = execSync(`${command} --version`, {\n stdio: 'pipe',\n timeout: 10_000,\n env: { ...process.env },\n }).toString().trim()\n\n // Extract first line only\n const version = output.split('\\n')[0].trim()\n return { available: true, version }\n } catch {\n return { available: false }\n }\n}\n\n/**\n * Check if Playwright browsers are installed by checking for the\n * browser registry (npx playwright install --dry-run is not available).\n */\nexport function arePlaywrightBrowsersInstalled(cwd: string): boolean {\n try {\n execSync('npx playwright install --dry-run 2>&1 || true', {\n cwd,\n stdio: 'pipe',\n timeout: 15_000,\n env: { ...process.env },\n })\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Check if @playwright/test is installed as a dependency in the project.\n */\nexport function isPlaywrightPackageInstalled(cwd: string): boolean {\n try {\n const pkgPath = resolve(cwd, 'node_modules', '@playwright', 'test', 'package.json')\n return existsSync(pkgPath)\n } catch {\n return false\n }\n}\n\n/**\n * Check if k6 binary is available on PATH.\n */\nexport function isK6Installed(): { installed: boolean; version?: string } {\n const result = isCommandAvailable('k6')\n return { installed: result.available, version: result.version }\n}\n\n/**\n * Check if Node.js is available (should always be true if running).\n */\nexport function isNodeInstalled(): { installed: boolean; version?: string } {\n return { installed: true, version: process.version }\n}\n\n/**\n * Install Playwright browsers (chromium by default).\n * Returns true if installation was successful.\n *\n * SECURITY: Browser parameter is validated against allowlist to prevent command injection.\n */\nexport async function installPlaywrightBrowsers(cwd: string, browser = 'chromium'): Promise<boolean> {\n try {\n // SECURITY FIX: Validate browser parameter against allowlist\n const allowedBrowsers = ['chromium', 'firefox', 'webkit', 'chrome', 'msedge']\n if (!allowedBrowsers.includes(browser)) {\n logger.error(`Invalid browser: ${browser}. Allowed: ${allowedBrowsers.join(', ')}`)\n return false\n }\n\n logger.info(`Installing Playwright ${browser} browser...`)\n // SECURITY: Safe to use browser parameter - validated above\n execSync(`npx playwright install ${browser}`, {\n cwd,\n stdio: 'inherit',\n timeout: 300_000, // 5 min timeout for browser download\n env: { ...process.env },\n })\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Run all dependency checks and return a summary.\n */\nexport function checkAllDependencies(cwd: string): DependencyStatus[] {\n const deps: DependencyStatus[] = []\n\n // Node.js\n const node = isNodeInstalled()\n deps.push({\n name: 'Node.js',\n installed: node.installed,\n version: node.version,\n required: true,\n installHint: 'https://nodejs.org/',\n })\n\n // @playwright/test npm package\n const pwPkg = isPlaywrightPackageInstalled(cwd)\n deps.push({\n name: '@playwright/test',\n installed: pwPkg,\n detail: pwPkg ? 'npm package found' : 'npm package not found',\n required: true,\n installHint: 'npm install --save-dev @playwright/test',\n })\n\n // Playwright browsers (chromium)\n if (pwPkg) {\n // Only meaningful to check if package is installed\n const pwCheck = isCommandAvailable('npx playwright --version')\n deps.push({\n name: 'Playwright browsers',\n installed: pwCheck.available,\n version: pwCheck.version,\n detail: pwCheck.available ? 'browsers available' : 'run: npx playwright install chromium',\n required: true,\n installHint: 'npx playwright install chromium',\n })\n } else {\n deps.push({\n name: 'Playwright browsers',\n installed: false,\n detail: 'install @playwright/test first',\n required: true,\n installHint: 'npm install --save-dev @playwright/test && npx playwright install chromium',\n })\n }\n\n // k6 binary\n const k6 = isK6Installed()\n deps.push({\n name: 'k6',\n installed: k6.installed,\n version: k6.version,\n detail: k6.installed ? undefined : 'needed for performance tests',\n required: false,\n installHint: getK6InstallHint(),\n })\n\n return deps\n}\n\n/**\n * Get platform-specific k6 installation instructions.\n */\nexport function getK6InstallHint(): string {\n const platform = process.platform\n switch (platform) {\n case 'darwin':\n return 'brew install k6'\n case 'linux':\n return 'sudo snap install k6 or see https://grafana.com/docs/k6/latest/set-up/install-k6/'\n case 'win32':\n return 'choco install k6 or winget install k6'\n default:\n return 'https://grafana.com/docs/k6/latest/set-up/install-k6/'\n }\n}\n\n/**\n * Format dependency check results for display.\n */\nexport function formatDependencyReport(deps: DependencyStatus[]): string {\n const lines: string[] = []\n let allGood = true\n\n for (const dep of deps) {\n const icon = dep.installed ? pc.green('✓') : dep.required ? pc.red('✗') : pc.yellow('○')\n const name = dep.installed ? dep.name : pc.dim(dep.name)\n const version = dep.version ? pc.dim(` (${dep.version})`) : ''\n const detail = dep.detail && !dep.installed ? pc.dim(` — ${dep.detail}`) : ''\n\n lines.push(` ${icon} ${name}${version}${detail}`)\n\n if (!dep.installed && dep.required) {\n allGood = false\n lines.push(` ${pc.dim('Install:')} ${dep.installHint}`)\n } else if (!dep.installed && !dep.required) {\n lines.push(` ${pc.dim('Install (optional):')} ${dep.installHint}`)\n }\n }\n\n if (allGood) {\n lines.push('')\n lines.push(pc.green(' All required dependencies are installed!'))\n }\n\n return lines.join('\\n')\n}\n\n/**\n * Check if required dependencies for a specific test type are available.\n * Throws CLIError with helpful message if missing.\n */\nexport function ensureDependenciesForTestType(\n cwd: string,\n testType: 'playwright' | 'k6',\n): void {\n if (testType === 'playwright') {\n if (!isPlaywrightPackageInstalled(cwd)) {\n throw new DependencyError(\n 'playwright',\n '@playwright/test is not installed.\\n' +\n ' Install it with: npm install --save-dev @playwright/test\\n' +\n ' Then install browsers: npx playwright install chromium',\n )\n }\n }\n\n if (testType === 'k6') {\n const k6 = isK6Installed()\n if (!k6.installed) {\n throw new DependencyError(\n 'k6',\n `k6 is not installed.\\n` +\n ` Install it with: ${getK6InstallHint()}\\n` +\n ` Documentation: https://grafana.com/docs/k6/latest/set-up/install-k6/`,\n )\n }\n }\n}\n\n/**\n * Error thrown when a required dependency is missing.\n */\nexport class DependencyError extends Error {\n public readonly dependency: string\n\n constructor(dependency: string, message: string) {\n super(message)\n this.name = 'DependencyError'\n this.dependency = dependency\n }\n}\n","import { randomBytes } from 'node:crypto'\n\n/**\n * Generate a UUID v7 (RFC 9562) — time-ordered, globally unique identifier.\n *\n * UUID v7 layout (128 bits):\n * - 48 bits: Unix timestamp in milliseconds\n * - 4 bits: version (0111 = 7)\n * - 12 bits: random (rand_a)\n * - 2 bits: variant (10)\n * - 62 bits: random (rand_b)\n *\n * This matches the UUID v7 format used by the Supercheck app (Drizzle ORM),\n * ensuring consistent ID formats between CLI-created and server-created resources.\n */\nexport function uuidv7(): string {\n const now = Date.now()\n\n // 6 bytes for 48-bit timestamp\n const timestampBytes = new Uint8Array(6)\n let ts = now\n for (let i = 5; i >= 0; i--) {\n timestampBytes[i] = ts & 0xff\n ts = Math.floor(ts / 256)\n }\n\n // 10 bytes of random data for rand_a (12 bits) + variant (2 bits) + rand_b (62 bits)\n const randBytes = randomBytes(10)\n\n // Build 16-byte UUID\n const bytes = new Uint8Array(16)\n\n // Bytes 0-5: timestamp\n bytes.set(timestampBytes, 0)\n\n // Byte 6: version (0111) + rand_a high 4 bits\n bytes[6] = (0x70) | (randBytes[0] & 0x0f)\n\n // Byte 7: rand_a low 8 bits\n bytes[7] = randBytes[1]\n\n // Byte 8: variant (10) + rand_b high 6 bits\n bytes[8] = (0x80) | (randBytes[2] & 0x3f)\n\n // Bytes 9-15: rand_b remaining 56 bits\n bytes[9] = randBytes[3]\n bytes[10] = randBytes[4]\n bytes[11] = randBytes[5]\n bytes[12] = randBytes[6]\n bytes[13] = randBytes[7]\n bytes[14] = randBytes[8]\n bytes[15] = randBytes[9]\n\n // Format as hex string: 8-4-4-4-12\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('')\n return [\n hex.slice(0, 8),\n hex.slice(8, 12),\n hex.slice(12, 16),\n hex.slice(16, 20),\n hex.slice(20, 32),\n ].join('-')\n}\n","import { Command } from 'commander'\nimport { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { ApiClient } from '../api/client.js'\nimport { loadConfig } from '../config/loader.js'\nimport { discoverFiles } from '../utils/discovery.js'\nimport { logger } from '../utils/logger.js'\nimport { output, outputDetail } from '../output/formatter.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { parseIntStrict } from '../utils/number.js'\nimport type { PaginatedResponse } from '../api/client.js'\nimport { getStoredBaseUrl, requireTriggerKey } from '../auth/store.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { extractUuidFromFilename } from '../utils/slug.js'\nimport { normalizeTestTypeForApi, validateScripts, validateScriptTypeMatch } from '../utils/validation.js'\nimport { runCommand } from '../utils/exec.js'\nimport { createTempPlaywrightConfig } from '../utils/playwright.js'\nimport { ensureDependenciesForTestType, DependencyError } from '../utils/deps.js'\n\nexport const jobCommand = new Command('job')\n .description('Manage jobs')\n\ntype LocalJobTest = {\n path: string\n type: 'playwright' | 'k6'\n name: string\n script: string\n}\n\nfunction inferLocalTestType(filePath: string): 'playwright' | 'k6' {\n return filePath.endsWith('.k6.ts') || filePath.endsWith('.k6.js') ? 'k6' : 'playwright'\n}\n\nfunction toDisplayName(cwd: string, filePath: string): string {\n const normalized = filePath.replace(cwd, '').replace(/^\\//, '')\n return normalized.startsWith('_supercheck_/') ? normalized.replace(/^_supercheck_\\//, '') : normalized\n}\n\nfunction resolveJobLocalTests(\n cwd: string,\n tests: string[],\n patterns: { playwright?: string; k6?: string },\n): LocalJobTest[] {\n const files = discoverFiles(cwd, patterns)\n const uuidMap = new Map<string, string>()\n for (const file of files) {\n const uuid = extractUuidFromFilename(file.absolutePath)\n if (uuid) uuidMap.set(uuid, file.absolutePath)\n }\n\n return tests.map((ref) => {\n let resolved: string | undefined\n\n if (ref.endsWith('.pw.ts') || ref.endsWith('.k6.ts') || ref.endsWith('.pw.js') || ref.endsWith('.k6.js')) {\n resolved = resolve(cwd, ref)\n } else if (ref.startsWith('_supercheck_/')) {\n resolved = resolve(cwd, ref)\n } else if (uuidMap.has(ref)) {\n resolved = uuidMap.get(ref)\n }\n\n if (!resolved) {\n throw new CLIError(`Cannot resolve local test for job entry: ${ref}`, ExitCode.ConfigError)\n }\n\n const script = readFileSync(resolved, 'utf-8')\n const type = inferLocalTestType(resolved)\n return { path: resolved, type, name: toDisplayName(cwd, resolved), script }\n })\n}\n\nasync function validateJobTests(\n client: ReturnType<typeof createAuthenticatedClient>,\n tests: LocalJobTest[],\n): Promise<void> {\n // Fast client-side script-type mismatch detection\n for (const test of tests) {\n const declaredType = normalizeTestTypeForApi(test.type)\n const mismatch = validateScriptTypeMatch(test.script, declaredType)\n if (mismatch) {\n throw new CLIError(`${test.name}: ${mismatch}`, ExitCode.ConfigError)\n }\n }\n\n const inputs = tests.map((test) => ({\n name: test.name,\n script: test.script,\n testType: normalizeTestTypeForApi(test.type),\n }))\n\n const results = await validateScripts(client, inputs)\n const failures = results.filter((r) => !r.valid)\n if (failures.length > 0) {\n const details = failures.map((f) => ` - ${f.name}: ${f.error ?? 'Validation failed'}`).join('\\n')\n throw new CLIError(`Validation failed:\\n${details}`, ExitCode.ConfigError)\n }\n}\n\nasync function runLocalJobTests(\n tests: LocalJobTest[],\n cwd: string,\n testMatch?: string,\n): Promise<void> {\n const playwrightTests = tests.filter((t) => t.type === 'playwright').map((t) => t.path)\n const k6Tests = tests.filter((t) => t.type === 'k6').map((t) => t.path)\n\n // Pre-flight dependency checks\n try {\n if (playwrightTests.length > 0) {\n ensureDependenciesForTestType(cwd, 'playwright')\n }\n if (k6Tests.length > 0) {\n ensureDependenciesForTestType(cwd, 'k6')\n }\n } catch (err) {\n if (err instanceof DependencyError) {\n throw new CLIError(err.message, ExitCode.GeneralError)\n }\n throw err\n }\n\n if (playwrightTests.length > 0) {\n logger.header('Running Playwright tests')\n const tempConfig = createTempPlaywrightConfig(cwd, testMatch)\n try {\n const code = await runCommand('npx', ['playwright', 'test', '--config', tempConfig.path, ...playwrightTests], cwd)\n if (code !== 0) {\n throw new CLIError(`Playwright tests failed with exit code ${code}`, ExitCode.GeneralError)\n }\n } finally {\n tempConfig.cleanup()\n }\n }\n\n for (const path of k6Tests) {\n logger.header(`Running k6 test: ${toDisplayName(cwd, path)}`)\n const code = await runCommand('k6', ['run', path], cwd)\n if (code !== 0) {\n throw new CLIError(`k6 test failed with exit code ${code}`, ExitCode.GeneralError)\n }\n }\n}\n\njobCommand\n .command('list')\n .description('List all jobs')\n .option('--page <page>', 'Page number', '1')\n .option('--limit <limit>', 'Items per page', '50')\n .action(async (options: { page: string; limit: string }) => {\n const client = createAuthenticatedClient()\n\n const { data } = await withSpinner(\n 'Fetching jobs',\n () => client.get<PaginatedResponse<Record<string, unknown>>>(\n '/api/jobs',\n { page: options.page, limit: options.limit },\n ),\n )\n\n output(data.data, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'name', header: 'Name' },\n { key: 'status', header: 'Status' },\n { key: 'cronSchedule', header: 'Schedule' },\n { key: 'createdAt', header: 'Created' },\n ],\n })\n\n if (data.pagination) {\n logger.info(\n `\\nPage ${data.pagination.page}/${data.pagination.totalPages} (${data.pagination.total} total)`,\n )\n }\n })\n\nconst keysCommand = jobCommand\n .command('keys')\n .description('Manage job trigger keys')\n\nkeysCommand\n .argument('<jobId>', 'Job ID')\n .action(async (jobId: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching trigger keys',\n () => client.get<{ success: boolean; apiKeys: Array<Record<string, unknown>> }>(\n `/api/jobs/${jobId}/api-keys`,\n ),\n )\n\n output(data.apiKeys ?? [], {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'name', header: 'Name' },\n { key: 'start', header: 'Prefix' },\n { key: 'enabled', header: 'Enabled' },\n { key: 'expiresAt', header: 'Expires' },\n { key: 'lastRequest', header: 'Last used' },\n ],\n })\n })\n\nkeysCommand\n .command('create')\n .description('Create a new trigger key for a job')\n .argument('<jobId>', 'Job ID')\n .requiredOption('--name <name>', 'Key name')\n .option('--expires-in <seconds>', 'Expiry in seconds (min 60)')\n .action(async (jobId: string, options: { name: string; expiresIn?: string }) => {\n const client = createAuthenticatedClient()\n\n const body: Record<string, unknown> = { name: options.name }\n if (options.expiresIn !== undefined) {\n body.expiresIn = parseIntStrict(options.expiresIn, '--expires-in', { min: 60 })\n }\n\n const { data } = await withSpinner(\n 'Creating trigger key',\n () => client.post<{ success: boolean; apiKey: Record<string, unknown> }>(\n `/api/jobs/${jobId}/api-keys`,\n body,\n ),\n )\n\n logger.success('Trigger key created')\n logger.warn('Save the `key` value now. It will only be shown once.')\n outputDetail(data.apiKey)\n })\n\nkeysCommand\n .command('delete')\n .description('Revoke a trigger key')\n .argument('<jobId>', 'Job ID')\n .argument('<keyId>', 'Key ID')\n .action(async (jobId: string, keyId: string) => {\n const client = createAuthenticatedClient()\n await withSpinner(\n 'Revoking trigger key',\n () => client.delete(`/api/jobs/${jobId}/api-keys/${keyId}`),\n )\n logger.success(`Trigger key ${keyId} revoked`)\n })\n\njobCommand\n .command('get <id>')\n .description('Get job details')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching job details',\n () => client.get<Record<string, unknown>>(`/api/jobs/${id}`),\n )\n outputDetail(data)\n })\n\njobCommand\n .command('create')\n .description('Create a new job')\n .requiredOption('--name <name>', 'Job name')\n .requiredOption('--tests <tests...>', 'Test IDs (space or comma separated)')\n .option('--description <description>', 'Job description', '')\n .option('--type <type>', 'Job runner type (playwright, k6)')\n .option('--schedule <cron>', 'Cron schedule expression')\n .option('--dry-run', 'Show what would be sent without creating')\n .action(async (options: { name: string; tests: string[]; description: string; type?: string; schedule?: string; dryRun?: boolean }) => {\n const client = createAuthenticatedClient()\n\n const tests = (options.tests ?? [])\n .flatMap((value) => value.split(','))\n .map((value) => value.trim())\n .filter(Boolean)\n\n if (tests.length === 0) {\n throw new CLIError('At least one test ID is required to create a job.', ExitCode.ConfigError)\n }\n\n const body: Record<string, unknown> = {\n name: options.name,\n description: options.description,\n config: {},\n tests: tests.map((id) => ({ id })),\n }\n if (options.type) body.jobType = options.type\n if (options.schedule) body.cronSchedule = options.schedule\n\n if (options.dryRun) {\n logger.header('Dry run \\u2014 job create payload:')\n logger.info(JSON.stringify(body, null, 2))\n return\n }\n\n const { data } = await withSpinner(\n 'Creating job',\n () => client.post<Record<string, unknown>>('/api/jobs', body),\n )\n const job = (data as Record<string, unknown> & { job?: Record<string, unknown> }).job ?? data\n const jobId = (job as Record<string, unknown>)?.id\n logger.success(`Job \"${options.name}\" created (${jobId ?? 'unknown'})`)\n outputDetail(job as Record<string, unknown>)\n })\n\njobCommand\n .command('update <id>')\n .description('Update job configuration')\n .option('--name <name>', 'Job name')\n .option('--description <description>', 'Job description')\n .option('--schedule <cron>', 'Cron schedule expression')\n .option('--status <status>', 'Job status (active, paused)')\n .option('--dry-run', 'Show what would be sent without updating')\n .action(async (id: string, options: { name?: string; description?: string; schedule?: string; status?: string; dryRun?: boolean }) => {\n const client = createAuthenticatedClient()\n\n const body: Record<string, unknown> = {}\n if (options.name !== undefined) body.name = options.name\n if (options.description !== undefined) body.description = options.description\n if (options.schedule !== undefined) body.cronSchedule = options.schedule\n if (options.status !== undefined) body.status = options.status\n\n if (Object.keys(body).length === 0) {\n logger.warn('No fields to update. Use --name, --description, --schedule, or --status.')\n return\n }\n\n if (options.dryRun) {\n logger.header('Dry run \\u2014 job update payload:')\n logger.info(JSON.stringify(body, null, 2))\n return\n }\n\n const { data } = await withSpinner(\n 'Updating job',\n () => client.patch<Record<string, unknown>>(`/api/jobs/${id}`, body),\n )\n logger.success(`Job ${id} updated`)\n outputDetail(data)\n })\n\njobCommand\n .command('delete <id>')\n .description('Delete a job')\n .option('--force', 'Skip confirmation')\n .action(async (id: string, options: { force?: boolean }) => {\n if (!options.force) {\n const { confirmPrompt } = await import('../utils/prompt.js')\n const confirmed = await confirmPrompt(`Delete job ${id}?`, { default: false })\n if (!confirmed) {\n logger.info('Aborted')\n return\n }\n }\n\n const client = createAuthenticatedClient()\n await withSpinner(\n 'Deleting job',\n () => client.delete(`/api/jobs/${id}`),\n )\n logger.success(`Job ${id} deleted`)\n })\n\njobCommand\n .command('run')\n .description('Run a job immediately')\n .requiredOption('--id <id>', 'Job ID to run')\n .option('--local', 'Run locally')\n .option('--cloud', 'Run on cloud')\n .action(async (options: { id: string; local?: boolean; cloud?: boolean }) => {\n if (options.local && options.cloud) {\n throw new CLIError('--local and --cloud are mutually exclusive.', ExitCode.ConfigError)\n }\n\n const useLocal = options.local === true\n\n if (useLocal) {\n const cwd = process.cwd()\n const { config } = await loadConfig({ cwd })\n const job = config.jobs?.find((j) => j.id === options.id || j.name === options.id)\n\n if (!job) {\n throw new CLIError(`Job ${options.id} not found in local config.`, ExitCode.ConfigError)\n }\n\n const tests = Array.isArray(job.tests) ? job.tests : []\n if (tests.length === 0) {\n throw new CLIError(`Job ${options.id} has no tests.`, ExitCode.GeneralError)\n }\n\n const patterns = {\n playwright: config.tests?.playwright?.testMatch,\n k6: config.tests?.k6?.testMatch,\n }\n\n const localTests = resolveJobLocalTests(cwd, tests, patterns)\n\n const client = createAuthenticatedClient()\n await withSpinner('Validating test scripts...', async () => {\n await validateJobTests(client, localTests)\n }, { successText: 'Test scripts validated' })\n\n await runLocalJobTests(localTests, cwd, config.tests?.playwright?.testMatch)\n return\n }\n\n const client = createAuthenticatedClient()\n\n const { data: jobData } = await withSpinner(\n 'Fetching job details',\n () => client.get<{ tests?: Array<{ id: string; name?: string; title?: string }> }>(\n `/api/jobs/${options.id}`,\n ),\n )\n\n const tests = Array.isArray(jobData.tests) ? jobData.tests : []\n if (tests.length === 0) {\n throw new CLIError(\n `Job ${options.id} has no tests. Add tests to the job before running it.`,\n ExitCode.GeneralError,\n )\n }\n\n const payloadTests = tests.map((test) => ({\n id: test.id,\n name: test.name ?? test.title ?? '',\n }))\n\n const { data } = await withSpinner(\n 'Running job',\n () => client.post<{ runId: string; message: string }>(\n '/api/jobs/run',\n { jobId: options.id, tests: payloadTests, trigger: 'remote' },\n ),\n )\n\n logger.success(`Job started. Run ID: ${data.runId}`)\n outputDetail(data as Record<string, unknown>)\n })\n\njobCommand\n .command('trigger <id>')\n .description('Trigger a job run')\n .option('--wait', 'Wait for the run to complete')\n .option('--timeout <seconds>', 'Maximum wait time in seconds', '300')\n .action(async (id: string, options: { wait?: boolean; timeout: string }) => {\n const triggerClient = new ApiClient({\n token: requireTriggerKey(),\n baseUrl: getStoredBaseUrl() ?? undefined,\n })\n\n const { data } = await withSpinner(\n 'Triggering job',\n () => triggerClient.post<{ runId: string; message: string }>(\n `/api/jobs/${id}/trigger`,\n ),\n )\n\n const runId = (data as { runId?: string; data?: { runId?: string } }).runId\n ?? (data as { data?: { runId?: string } }).data?.runId\n if (!runId) {\n throw new CLIError('Job trigger response did not include a run ID.', ExitCode.ApiError)\n }\n\n logger.success(`Job triggered. Run ID: ${runId}`)\n\n if (options.wait) {\n let statusClient: ReturnType<typeof createAuthenticatedClient>\n try {\n statusClient = createAuthenticatedClient()\n } catch {\n throw new CLIError(\n 'Waiting for completion requires a CLI token. Set SUPERCHECK_TOKEN (sck_live_* or sck_test_).',\n ExitCode.AuthError,\n )\n }\n\n logger.info('Waiting for run to complete...')\n const timeoutMs = parseIntStrict(options.timeout, '--timeout', { min: 1 }) * 1000\n const startTime = Date.now()\n\n while (Date.now() - startTime < timeoutMs) {\n await new Promise((resolve) => setTimeout(resolve, 3000))\n\n const { data: runData } = await statusClient.get<{ status: string }>(\n `/api/runs/${runId}`,\n )\n\n const status = typeof runData.status === 'string' ? runData.status.toLowerCase() : ''\n\n if (['passed', 'failed', 'error', 'blocked'].includes(status)) {\n if (status === 'passed') {\n logger.success(`Run ${runId} passed`)\n } else if (status === 'blocked') {\n logger.error(`Run ${runId} blocked`)\n throw new CLIError(`Run ${runId} blocked`, ExitCode.GeneralError)\n } else {\n logger.error(`Run ${runId} ${status}`)\n throw new CLIError(`Run ${runId} ${status}`, ExitCode.GeneralError)\n }\n outputDetail(runData as Record<string, unknown>)\n return\n }\n\n logger.debug(`Run status: ${status || '(unknown)'}`)\n }\n\n throw new CLIError(\n `Timed out waiting for run to complete after ${options.timeout}s`,\n ExitCode.Timeout,\n )\n }\n })\n","import { getApiClient } from './client.js'\nimport { requireAuth, getStoredBaseUrl } from '../auth/store.js'\nimport { tryLoadConfig } from '../config/loader.js'\nimport type { ApiClient } from './client.js'\n\n/**\n * Create an API client pre-configured with the stored auth token and base URL.\n * Shared across all command modules to avoid repeating this pattern.\n *\n * Base URL resolution order (highest to lowest priority):\n * 1. SUPERCHECK_URL environment variable (via getStoredBaseUrl)\n * 2. Stored base URL from `supercheck login --url` (via getStoredBaseUrl)\n * 3. Config file `api.baseUrl` (from supercheck.config.ts)\n * 4. Default: https://app.supercheck.io\n */\nexport function createAuthenticatedClient(configBaseUrl?: string): ApiClient {\n const token = requireAuth()\n const storedBaseUrl = getStoredBaseUrl()\n const baseUrl = storedBaseUrl ?? configBaseUrl\n return getApiClient({ token, baseUrl: baseUrl ?? undefined })\n}\n\n/**\n * Create an authenticated client with config-aware base URL resolution.\n * Attempts to load the config file to read `api.baseUrl` as a fallback.\n * Use this variant in commands that don't already load the config.\n */\nexport async function createAuthenticatedClientWithConfig(): Promise<ApiClient> {\n const token = requireAuth()\n const storedBaseUrl = getStoredBaseUrl()\n\n if (storedBaseUrl) {\n return getApiClient({ token, baseUrl: storedBaseUrl })\n }\n\n // Try to load config for baseUrl fallback\n const configResult = await tryLoadConfig()\n const configBaseUrl = configResult?.config?.api?.baseUrl\n return getApiClient({ token, baseUrl: configBaseUrl ?? undefined })\n}\n","import { CLIError, ExitCode } from './errors.js'\n\n/**\n * Parse a string to an integer with strict validation.\n */\nexport function parseIntStrict(\n value: string,\n name: string,\n opts?: { min?: number; max?: number },\n): number {\n const parsed = parseInt(value, 10)\n if (!Number.isFinite(parsed)) {\n throw new CLIError(\n `Invalid value for ${name}: \"${value}\" is not a valid integer.`,\n ExitCode.ConfigError,\n )\n }\n if (opts?.min !== undefined && parsed < opts.min) {\n throw new CLIError(\n `Invalid value for ${name}: ${parsed} is below the minimum of ${opts.min}.`,\n ExitCode.ConfigError,\n )\n }\n if (opts?.max !== undefined && parsed > opts.max) {\n throw new CLIError(\n `Invalid value for ${name}: ${parsed} exceeds the maximum of ${opts.max}.`,\n ExitCode.ConfigError,\n )\n }\n return parsed\n}","import { ApiRequestError, CLIError, ExitCode } from './errors.js'\nimport type { ApiClient } from '../api/client.js'\n\nexport type ApiTestType = 'browser' | 'performance' | 'api' | 'database' | 'custom'\n\nconst K6_IMPORT_PATTERN = /import\\s+.*\\s+from\\s+['\"]k6(?:\\/[^'\"]*)?['\"]/\n\n/**\n * Detects whether a script imports any k6 modules.\n * Mirrors the server-side `isK6Script` logic from `k6-validator.ts`.\n */\nexport function isK6Script(script: string): boolean {\n return K6_IMPORT_PATTERN.test(script)\n}\n\n/**\n * Client-side validation that a script's content matches its declared type.\n * Returns an error message if there's a mismatch, or undefined if valid.\n *\n * Rules:\n * - k6 scripts (importing from 'k6/*') MUST have type \"performance\"\n * - Non-k6 scripts MUST NOT have type \"performance\"\n */\nexport function validateScriptTypeMatch(\n script: string,\n declaredType: ApiTestType | undefined,\n): string | undefined {\n if (!script || !declaredType) return undefined\n\n const scriptIsK6 = isK6Script(script)\n\n if (scriptIsK6 && declaredType !== 'performance') {\n return `Script contains k6 imports but test type is \"${declaredType}\". k6 scripts must use type \"performance\".`\n }\n\n if (!scriptIsK6 && declaredType === 'performance') {\n return 'Test type is \"performance\" but script does not contain k6 imports. Performance tests require k6 scripts.'\n }\n\n return undefined\n}\n\nexport interface TestValidationInput {\n name: string\n script: string\n testType?: ApiTestType\n}\n\nexport interface TestValidationResult {\n name: string\n valid: boolean\n error?: string\n warnings?: string[]\n}\n\nexport function normalizeTestTypeForApi(localType: unknown): ApiTestType | undefined {\n if (typeof localType !== 'string') return undefined\n\n const normalized = localType.trim().toLowerCase()\n\n if (normalized === 'playwright') return 'browser'\n if (normalized === 'k6') return 'performance'\n if (normalized === 'load') return 'performance'\n\n if (\n normalized === 'browser' ||\n normalized === 'performance' ||\n normalized === 'api' ||\n normalized === 'database' ||\n normalized === 'custom'\n ) {\n return normalized\n }\n\n return undefined\n}\n\nfunction formatValidationError(responseBody: unknown): string {\n if (responseBody && typeof responseBody === 'object') {\n const body = responseBody as Record<string, unknown>\n if (typeof body.error === 'string') {\n const line = typeof body.line === 'number' ? body.line : undefined\n const column = typeof body.column === 'number' ? body.column : undefined\n if (line !== undefined && column !== undefined) {\n return `${body.error} (line ${line}, column ${column})`\n }\n return body.error\n }\n }\n\n return 'Validation failed'\n}\n\nexport async function validateScripts(\n client: ApiClient,\n inputs: TestValidationInput[],\n): Promise<TestValidationResult[]> {\n const results: TestValidationResult[] = []\n\n for (const input of inputs) {\n if (!input.script || input.script.trim().length === 0) {\n throw new CLIError(`Test \"${input.name}\" has no script content`, ExitCode.ConfigError)\n }\n\n try {\n const { data } = await client.post<{ valid: boolean; warnings?: string[] }>(\n '/api/validate-script',\n {\n script: input.script,\n testType: input.testType,\n },\n )\n\n results.push({\n name: input.name,\n valid: data?.valid ?? true,\n warnings: data?.warnings,\n })\n } catch (err) {\n if (err instanceof ApiRequestError) {\n results.push({\n name: input.name,\n valid: false,\n error: formatValidationError(err.responseBody),\n })\n continue\n }\n\n throw err\n }\n }\n\n return results\n}\n","import { spawn } from 'node:child_process'\n\n/**\n * Run a command with arguments in a child process.\n *\n * SECURITY: This function does NOT use shell=true to prevent command injection.\n * Pass command and args as separate parameters.\n */\nexport function runCommand(command: string, args: string[], cwd?: string): Promise<number> {\n return new Promise((resolve, reject) => {\n // Windows requires the .cmd shim for npm binaries like `npx` when shell is disabled.\n const executable = process.platform === 'win32' && command === 'npx'\n ? 'npx.cmd'\n : command\n\n // SECURITY FIX: Remove shell: true to prevent command injection\n // spawn() with shell: false treats args as literal arguments, not shell commands\n const child = spawn(executable, args, {\n stdio: 'inherit',\n shell: false, // ✓ SECURE: Prevents command injection\n cwd,\n })\n\n child.on('error', (err) => reject(err))\n child.on('close', (code) => resolve(code ?? 0))\n })\n}\n","import { mkdtempSync, writeFileSync, rmSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport type TempPlaywrightConfig = {\n path: string\n cleanup: () => void\n}\n\nexport function createTempPlaywrightConfig(cwd: string, testMatch?: string): TempPlaywrightConfig {\n const dir = mkdtempSync(join(cwd, '.supercheck-playwright-'))\n const filePath = join(dir, 'playwright.supercheck.config.mjs')\n const match = testMatch ?? '_supercheck_/playwright/**/*.pw.ts'\n\n const contents = [\n \"import { defineConfig } from '@playwright/test'\",\n '',\n 'export default defineConfig({',\n ` testDir: ${JSON.stringify(cwd)},`,\n ` testMatch: ${JSON.stringify([match])},`,\n '})',\n '',\n ].join('\\n')\n\n writeFileSync(filePath, contents, 'utf-8')\n\n return {\n path: filePath,\n cleanup: () => {\n rmSync(dir, { recursive: true, force: true })\n },\n }\n}\n","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { requireAuth, getStoredBaseUrl } from '../auth/store.js'\nimport { logger } from '../utils/logger.js'\nimport { output, outputDetail } from '../output/formatter.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport type { PaginatedResponse } from '../api/client.js'\nimport { CLI_VERSION } from '../version.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { getProxyAgent, getProxyEnv } from '../utils/proxy.js'\n\nexport const runCommand = new Command('run')\n .description('Manage runs')\n\nrunCommand\n .command('list')\n .description('List runs')\n .option('--page <page>', 'Page number', '1')\n .option('--limit <limit>', 'Items per page', '50')\n .option('--job <jobId>', 'Filter by job ID')\n .option('--status <status>', 'Filter by status')\n .action(async (options: { page: string; limit: string; status?: string; job?: string }) => {\n const client = createAuthenticatedClient()\n\n const params: Record<string, string> = {\n page: options.page,\n limit: options.limit,\n }\n if (options.job) params.jobId = options.job\n if (options.status) params.status = options.status\n\n const { data } = await withSpinner(\n 'Fetching runs',\n () => client.get<PaginatedResponse<Record<string, unknown>>>(\n '/api/runs',\n params,\n ),\n )\n\n output(data.data, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'jobName', header: 'Job' },\n { key: 'status', header: 'Status' },\n { key: 'trigger', header: 'Trigger' },\n { key: 'startedAt', header: 'Started' },\n ],\n })\n\n if (data.pagination) {\n logger.info(\n `\\nPage ${data.pagination.page}/${data.pagination.totalPages} (${data.pagination.total} total)`,\n )\n }\n })\n\nrunCommand\n .command('get <id>')\n .description('Get run details')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching run details',\n () => client.get<Record<string, unknown>>(`/api/runs/${id}`),\n )\n outputDetail(data)\n })\n\nrunCommand\n .command('status <id>')\n .description('Get run status')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching run status',\n () => client.get<Record<string, unknown>>(`/api/runs/${id}/status`),\n )\n outputDetail(data)\n })\n\nrunCommand\n .command('permissions <id>')\n .description('Get run access permissions')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching run permissions',\n () => client.get<Record<string, unknown>>(`/api/runs/${id}/permissions`),\n )\n const payload = (data as { data?: Record<string, unknown> }).data ?? data\n outputDetail(payload)\n })\n\nrunCommand\n .command('stream <id>')\n .description('Stream live console output from a run')\n .option('--idle-timeout <seconds>', 'Abort if no data received within this period', '60')\n .action(async (id: string, options: { idleTimeout: string }) => {\n const token = requireAuth()\n const baseUrl = getStoredBaseUrl() ?? 'https://app.supercheck.io'\n const idleTimeoutMs = Math.max(Number(options.idleTimeout) || 60, 10) * 1000\n\n const url = `${baseUrl}/api/runs/${id}/stream`\n const parsedUrl = new URL(url)\n\n logger.info(`Streaming output for run ${id}...`)\n logger.newline()\n\n const controller = new AbortController()\n const connectTimeout = setTimeout(() => controller.abort(), 30_000)\n\n try {\n const proxy = getProxyEnv(parsedUrl)\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'text/event-stream',\n 'User-Agent': `supercheck-cli/${CLI_VERSION}`,\n },\n ...(proxy ? { dispatcher: getProxyAgent(proxy) } : {}),\n signal: controller.signal,\n })\n\n clearTimeout(connectTimeout)\n\n if (!response.ok) {\n throw new CLIError(`Failed to connect to stream: ${response.status}`, ExitCode.ApiError)\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new CLIError('No response body for SSE stream', ExitCode.ApiError)\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n let currentEvent = ''\n\n // Idle timeout: abort if no data received within the configured period\n let idleTimer: ReturnType<typeof setTimeout> | undefined\n const resetIdleTimer = () => {\n if (idleTimer) clearTimeout(idleTimer)\n idleTimer = setTimeout(() => controller.abort(), idleTimeoutMs)\n }\n resetIdleTimer()\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n resetIdleTimer()\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n\n for (const line of lines) {\n // SSE comment (keepalive) — ignore\n if (line.startsWith(':')) continue\n\n // SSE event type\n if (line.startsWith('event: ')) {\n currentEvent = line.slice(7).trim()\n continue\n }\n\n // SSE retry directive — ignore\n if (line.startsWith('retry:')) continue\n\n // SSE data payload\n if (line.startsWith('data: ')) {\n const data = line.slice(6)\n try {\n const parsed = JSON.parse(data)\n\n switch (currentEvent) {\n case 'console':\n // Server sends { line: \"...\" } for console output\n if (parsed.line !== undefined) {\n process.stdout.write(parsed.line + '\\n')\n }\n break\n case 'status':\n logger.info(`Status: ${parsed.status ?? JSON.stringify(parsed)}`)\n break\n case 'complete':\n logger.success(`Run complete: ${parsed.status ?? 'done'}`)\n if (idleTimer) clearTimeout(idleTimer)\n return\n case 'error':\n logger.error(`Stream error: ${parsed.message ?? JSON.stringify(parsed)}`)\n break\n case 'heartbeat':\n // Server keepalive — no action needed\n break\n default:\n // Unknown or unnamed event — show status/output if present\n if (parsed.output) {\n process.stdout.write(parsed.output)\n } else if (parsed.status) {\n logger.info(`Status: ${parsed.status}`)\n }\n break\n }\n } catch {\n // Raw text output\n process.stdout.write(data)\n }\n // Reset event type after processing data\n currentEvent = ''\n continue\n }\n\n // Empty line marks end of SSE event block — reset event type\n if (line.trim() === '') {\n currentEvent = ''\n }\n }\n }\n\n if (idleTimer) clearTimeout(idleTimer)\n } catch (err) {\n if (err instanceof CLIError) throw err\n if (err instanceof Error && err.name === 'AbortError') {\n throw new CLIError(\n `Stream timed out (no data received for ${Math.round(idleTimeoutMs / 1000)}s)`,\n ExitCode.Timeout,\n )\n }\n throw new CLIError(\n `Stream error: ${err instanceof Error ? err.message : String(err)}`,\n ExitCode.ApiError,\n )\n }\n })\n\nrunCommand\n .command('cancel <id>')\n .description('Cancel a running execution')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Cancelling run',\n () => client.post<Record<string, unknown>>(`/api/runs/${id}/cancel`),\n )\n outputDetail(data)\n })\n","import { Command } from 'commander'\nimport { readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { Buffer } from 'node:buffer'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { loadConfig } from '../config/loader.js'\nimport { discoverFiles } from '../utils/discovery.js'\nimport { logger } from '../utils/logger.js'\nimport { output, outputDetail } from '../output/formatter.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport type { PaginatedResponse } from '../api/client.js'\nimport { requireAuth, getStoredBaseUrl } from '../auth/store.js'\nimport { CLI_VERSION } from '../version.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { normalizeTestTypeForApi, validateScripts, validateScriptTypeMatch } from '../utils/validation.js'\nimport { runCommand } from '../utils/exec.js'\nimport { createTempPlaywrightConfig } from '../utils/playwright.js'\nimport { ensureDependenciesForTestType, DependencyError } from '../utils/deps.js'\nimport { getProxyAgent, getProxyEnv } from '../utils/proxy.js'\n\nfunction normalizeTestType(input: string): string {\n return normalizeTestTypeForApi(input) ?? input.trim().toLowerCase()\n}\n\nfunction inferTestType(filename: string): string | undefined {\n if (filename.endsWith('.k6.ts') || filename.endsWith('.k6.js')) return 'k6'\n if (filename.endsWith('.pw.ts') || filename.endsWith('.pw.js') || filename.endsWith('.spec.ts')) return 'playwright'\n return undefined\n}\n\ntype LocalTestFile = {\n path: string\n type: 'playwright' | 'k6'\n name: string\n script: string\n validationType?: ReturnType<typeof normalizeTestTypeForApi>\n}\n\nfunction toDisplayName(cwd: string, filePath: string): string {\n const normalized = filePath.replace(cwd, '').replace(/^\\//, '')\n return normalized.startsWith('_supercheck_/') ? normalized.replace(/^_supercheck_\\//, '') : normalized\n}\n\nfunction collectLocalTests(\n cwd: string,\n patterns: { playwright?: string; k6?: string },\n options: { file?: string; all?: boolean; type?: string },\n): LocalTestFile[] {\n if (options.file) {\n const filePath = resolve(cwd, options.file)\n const type = inferTestType(filePath) ?? (options.type === 'k6' ? 'k6' : 'playwright')\n const validationType = options.type ? normalizeTestTypeForApi(options.type) : normalizeTestTypeForApi(type)\n const script = readFileSync(filePath, 'utf-8')\n return [{\n path: filePath,\n type: type as 'playwright' | 'k6',\n name: toDisplayName(cwd, filePath),\n script,\n validationType,\n }]\n }\n\n const typeFilter = options.type?.toLowerCase()\n const filterType = typeFilter && ['api', 'database', 'custom', 'browser', 'playwright'].includes(typeFilter)\n ? 'playwright'\n : typeFilter === 'performance' || typeFilter === 'load'\n ? 'k6'\n : typeFilter\n\n const files = discoverFiles(cwd, patterns)\n .filter((file) => !filterType || file.type === filterType)\n\n return files.map((file) => {\n const script = readFileSync(file.absolutePath, 'utf-8')\n const validationType = options.type ? normalizeTestTypeForApi(options.type) : normalizeTestTypeForApi(file.type)\n return {\n path: file.absolutePath,\n type: file.type,\n name: toDisplayName(cwd, file.absolutePath),\n script,\n validationType,\n }\n })\n}\n\nasync function validateLocalTests(client: ReturnType<typeof createAuthenticatedClient>, tests: LocalTestFile[]): Promise<void> {\n // First: fast client-side script-type mismatch detection\n for (const test of tests) {\n const declaredType = test.validationType ?? normalizeTestTypeForApi(test.type)\n const mismatch = validateScriptTypeMatch(test.script, declaredType)\n if (mismatch) {\n throw new CLIError(`${test.name}: ${mismatch}`, ExitCode.ConfigError)\n }\n }\n\n // Then: server-side validation (security patterns, AST, etc.)\n const inputs = tests.map((test) => ({\n name: test.name,\n script: test.script,\n testType: test.validationType ?? normalizeTestTypeForApi(test.type),\n }))\n\n const results = await validateScripts(client, inputs)\n const failures = results.filter((r) => !r.valid)\n if (failures.length > 0) {\n const details = failures.map((f) => ` - ${f.name}: ${f.error ?? 'Validation failed'}`).join('\\n')\n throw new CLIError(`Validation failed:\\n${details}`, ExitCode.ConfigError)\n }\n\n const warnings = results.filter((r) => r.warnings && r.warnings.length > 0)\n for (const warn of warnings) {\n logger.warn(`Validation warnings for ${warn.name}: ${(warn.warnings ?? []).join(', ')}`)\n }\n}\n\nasync function runPlaywrightTests(paths: string[], cwd: string, testMatch?: string): Promise<void> {\n if (paths.length === 0) return\n const tempConfig = createTempPlaywrightConfig(cwd, testMatch)\n try {\n const code = await runCommand('npx', ['playwright', 'test', '--config', tempConfig.path, ...paths], cwd)\n if (code !== 0) {\n throw new CLIError(`Playwright tests failed with exit code ${code}`, ExitCode.GeneralError)\n }\n } finally {\n tempConfig.cleanup()\n }\n}\n\nasync function runK6Tests(paths: string[], cwd: string): Promise<void> {\n for (const path of paths) {\n const code = await runCommand('k6', ['run', path], cwd)\n if (code !== 0) {\n throw new CLIError(`k6 test failed with exit code ${code}`, ExitCode.GeneralError)\n }\n }\n}\n\nexport const testCommand = new Command('test')\n .description('Manage tests')\n\ntestCommand\n .command('list')\n .description('List all tests')\n .option('--page <page>', 'Page number', '1')\n .option('--limit <limit>', 'Items per page', '50')\n .option('--search <query>', 'Search by title')\n .option('--type <type>', 'Filter by type (browser, performance, api, database, custom)')\n .action(async (options: { page: string; limit: string; search?: string; type?: string }) => {\n const client = createAuthenticatedClient()\n\n const params: Record<string, string> = {\n page: options.page,\n limit: options.limit,\n }\n if (options.search) params.search = options.search\n if (options.type) params.type = normalizeTestType(options.type)\n\n const { data } = await withSpinner(\n 'Fetching tests',\n () => client.get<PaginatedResponse<Record<string, unknown>>>(\n '/api/tests',\n params,\n ),\n )\n\n output(data.data, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'title', header: 'Title' },\n { key: 'type', header: 'Type' },\n { key: 'createdAt', header: 'Created' },\n ],\n })\n\n if (data.pagination) {\n logger.info(\n `\\nPage ${data.pagination.page}/${data.pagination.totalPages} (${data.pagination.total} total)`,\n )\n }\n })\n\ntestCommand\n .command('get <id>')\n .description('Get test details')\n .option('--include-script', 'Include the test script content')\n .action(async (id: string, options: { includeScript?: boolean }) => {\n const client = createAuthenticatedClient()\n const params: Record<string, string> = {\n includeScript: options.includeScript ? 'true' : 'false',\n }\n\n const { data } = await withSpinner(\n 'Fetching test details',\n () => client.get<Record<string, unknown>>(`/api/tests/${id}`, params),\n )\n outputDetail(data)\n })\n\ntestCommand\n .command('create')\n .description('Create a new test')\n .requiredOption('--title <title>', 'Test title')\n .requiredOption('--file <path>', 'Path to the test script file')\n .option('--type <type>', 'Test type (browser, performance, api, database, custom)')\n .option('--description <description>', 'Test description')\n .option('--dry-run', 'Show what would be sent without creating')\n .action(async (options: { title: string; file: string; type?: string; description?: string; dryRun?: boolean }) => {\n const { readFileSync } = await import('node:fs')\n const { resolve } = await import('node:path')\n\n const filePath = resolve(process.cwd(), options.file)\n let script: string\n\n try {\n script = readFileSync(filePath, 'utf-8')\n } catch {\n throw new CLIError(`Cannot read file: ${filePath}`, ExitCode.GeneralError)\n }\n\n const typeArg = options.type || inferTestType(options.file) || 'playwright'\n\n // Validate script content matches declared type before sending to API\n const typeMismatchError = validateScriptTypeMatch(script, normalizeTestTypeForApi(typeArg))\n if (typeMismatchError) {\n throw new CLIError(typeMismatchError, ExitCode.ConfigError)\n }\n\n const encodedScript = Buffer.from(script, 'utf-8').toString('base64')\n\n const body: Record<string, unknown> = {\n title: options.title,\n script: encodedScript,\n type: normalizeTestType(typeArg),\n }\n if (options.description) body.description = options.description\n\n if (options.dryRun) {\n const preview = { ...body, script: `<base64 ${encodedScript.length} chars>` }\n logger.header('Dry run \\u2014 test create payload:')\n logger.info(JSON.stringify(preview, null, 2))\n return\n }\n\n const client = createAuthenticatedClient()\n\n const { data } = await withSpinner(\n 'Creating test',\n () => client.post<Record<string, unknown>>('/api/tests', body),\n )\n const createdId =\n (data as { test?: { id?: string } }).test?.id ??\n (data as { id?: string }).id\n logger.success(`Test \"${options.title}\" created${createdId ? ` (${createdId})` : ''}`)\n outputDetail(data)\n })\n\ntestCommand\n .command('update <id>')\n .description('Update a test')\n .option('--title <title>', 'Test title')\n .option('--file <path>', 'Path to updated test script')\n .option('--description <description>', 'Test description')\n .option('--dry-run', 'Show what would be sent without updating')\n .action(async (id: string, options: { title?: string; file?: string; description?: string; dryRun?: boolean }) => {\n const client = createAuthenticatedClient()\n\n const body: Record<string, unknown> = {}\n if (options.title !== undefined) body.title = options.title\n if (options.description !== undefined) body.description = options.description\n\n if (options.file) {\n const { readFileSync } = await import('node:fs')\n const { resolve } = await import('node:path')\n const filePath = resolve(process.cwd(), options.file)\n try {\n const raw = readFileSync(filePath, 'utf-8')\n body.script = Buffer.from(raw, 'utf-8').toString('base64')\n } catch {\n throw new CLIError(`Cannot read file: ${filePath}`, ExitCode.GeneralError)\n }\n }\n\n if (Object.keys(body).length === 0) {\n logger.warn('No fields to update. Use --title, --file, or --description.')\n return\n }\n\n if (options.dryRun) {\n const preview = { ...body }\n if (typeof preview.script === 'string') {\n preview.script = `<base64 ${(preview.script as string).length} chars>`\n }\n logger.header('Dry run \\u2014 test update payload:')\n logger.info(JSON.stringify(preview, null, 2))\n return\n }\n\n const { data } = await withSpinner(\n 'Updating test',\n () => client.patch<Record<string, unknown>>(`/api/tests/${id}`, body),\n )\n logger.success(`Test ${id} updated`)\n outputDetail(data)\n })\n\ntestCommand\n .command('delete <id>')\n .description('Delete a test')\n .option('--force', 'Skip confirmation')\n .action(async (id: string, options: { force?: boolean }) => {\n if (!options.force) {\n const { confirmPrompt } = await import('../utils/prompt.js')\n const confirmed = await confirmPrompt(`Delete test ${id}?`, { default: false })\n if (!confirmed) {\n logger.info('Aborted')\n return\n }\n }\n\n const client = createAuthenticatedClient()\n await withSpinner(\n 'Deleting test',\n () => client.delete(`/api/tests/${id}`),\n )\n logger.success(`Test ${id} deleted`)\n })\n\ntestCommand\n .command('run')\n .description('Run tests locally')\n .option('--file <path>', 'Local test file path')\n .option('--all', 'Run all local tests')\n .option('--type <type>', 'Test type filter (browser, performance, api, database, custom)')\n .action(async (options: { file?: string; all?: boolean; type?: string }) => {\n\n if (!options.file && !options.all) {\n throw new CLIError('Local runs require --file <path> or --all.', ExitCode.ConfigError)\n }\n\n const cwd = process.cwd()\n const { config } = await loadConfig({ cwd })\n const client = createAuthenticatedClient()\n const patterns = {\n playwright: config.tests?.playwright?.testMatch,\n k6: config.tests?.k6?.testMatch,\n }\n\n const localTests = collectLocalTests(cwd, patterns, {\n file: options.file,\n all: options.all,\n type: options.type,\n })\n\n if (localTests.length === 0) {\n logger.warn('No local tests found to run.')\n return\n }\n\n await withSpinner('Validating test scripts...', async () => {\n await validateLocalTests(client, localTests)\n }, { successText: 'Test scripts validated' })\n\n const playwrightTests = localTests.filter((t) => t.type === 'playwright').map((t) => t.path)\n const k6Tests = localTests.filter((t) => t.type === 'k6').map((t) => t.path)\n\n // Pre-flight dependency checks\n try {\n if (playwrightTests.length > 0) {\n ensureDependenciesForTestType(cwd, 'playwright')\n }\n if (k6Tests.length > 0) {\n ensureDependenciesForTestType(cwd, 'k6')\n }\n } catch (err) {\n if (err instanceof DependencyError) {\n throw new CLIError(err.message, ExitCode.ConfigError)\n }\n throw err\n }\n\n if (playwrightTests.length > 0) {\n logger.header('Running Playwright tests')\n await runPlaywrightTests(playwrightTests, cwd, config.tests?.playwright?.testMatch)\n }\n\n if (k6Tests.length > 0) {\n logger.header('Running k6 tests')\n await runK6Tests(k6Tests, cwd)\n }\n })\n\ntestCommand\n .command('tags <id>')\n .description('Get test tags')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching test tags',\n () => client.get<Record<string, unknown>[]>(`/api/tests/${id}/tags`),\n )\n output(data, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'name', header: 'Name' },\n { key: 'color', header: 'Color' },\n ],\n })\n })\n\ntestCommand\n .command('validate')\n .description('Validate a test script')\n .requiredOption('--file <path>', 'Path to the test script file')\n .option('--type <type>', 'Test type (browser, performance, api, database, custom)')\n .action(async (options: { file: string; type?: string }) => {\n const cwd = process.cwd()\n const filePath = resolve(cwd, options.file)\n let script: string\n\n try {\n script = readFileSync(filePath, 'utf-8')\n } catch {\n throw new CLIError(`Cannot read file: ${filePath}`, ExitCode.GeneralError)\n }\n\n const typeArg = options.type || inferTestType(options.file) || 'playwright'\n\n // Fast client-side check for script-type mismatch\n const resolvedApiType = normalizeTestTypeForApi(typeArg)\n const typeMismatchError = validateScriptTypeMatch(script, resolvedApiType)\n if (typeMismatchError) {\n throw new CLIError(typeMismatchError, ExitCode.ConfigError)\n }\n\n const client = createAuthenticatedClient()\n\n const results = await withSpinner(\n 'Validating script',\n () => validateScripts(client, [{\n name: toDisplayName(cwd, filePath),\n script,\n testType: normalizeTestTypeForApi(typeArg),\n }]),\n )\n\n const result = results[0]\n if (result?.valid) {\n logger.success(`Script is valid (${typeArg})`)\n if (result.warnings && result.warnings.length > 0) {\n logger.warn(`Warnings: ${result.warnings.join(', ')}`)\n }\n return\n }\n\n throw new CLIError(`Script validation failed: ${result?.error ?? 'Unknown error'}`, ExitCode.GeneralError)\n })\n\ntestCommand\n .command('status <id>')\n .description('Stream live status events for a test')\n .option('--idle-timeout <seconds>', 'Abort if no data received within this period', '60')\n .action(async (id: string, options: { idleTimeout: string }) => {\n const token = requireAuth()\n const baseUrl = getStoredBaseUrl() ?? 'https://app.supercheck.io'\n const idleTimeoutMs = Math.max(Number(options.idleTimeout) || 60, 10) * 1000\n\n const url = `${baseUrl}/api/test-status/events/${id}`\n const parsedUrl = new URL(url)\n\n logger.info(`Streaming status for test ${id}...`)\n logger.newline()\n\n const controller = new AbortController()\n const connectTimeout = setTimeout(() => controller.abort(), 30_000)\n\n try {\n const proxy = getProxyEnv(parsedUrl)\n const response = await fetch(url, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Accept': 'text/event-stream',\n 'User-Agent': `supercheck-cli/${CLI_VERSION}`,\n },\n ...(proxy ? { dispatcher: getProxyAgent(proxy) } : {}),\n signal: controller.signal,\n })\n\n clearTimeout(connectTimeout)\n\n if (!response.ok) {\n throw new CLIError(`Failed to connect to status stream: ${response.status}`, ExitCode.ApiError)\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new CLIError('No response body for SSE stream', ExitCode.ApiError)\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n\n let idleTimer: ReturnType<typeof setTimeout> | undefined\n const resetIdleTimer = () => {\n if (idleTimer) clearTimeout(idleTimer)\n idleTimer = setTimeout(() => controller.abort(), idleTimeoutMs)\n }\n resetIdleTimer()\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n resetIdleTimer()\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n\n for (const line of lines) {\n if (line.startsWith(':')) continue\n if (line.startsWith('data: ')) {\n const payload = line.slice(6)\n try {\n const parsed = JSON.parse(payload) as Record<string, unknown>\n outputDetail(parsed)\n } catch {\n process.stdout.write(payload + '\\n')\n }\n }\n }\n }\n\n if (idleTimer) clearTimeout(idleTimer)\n } catch (err) {\n if (err instanceof CLIError) throw err\n if (err instanceof Error && err.name === 'AbortError') {\n throw new CLIError(\n `Stream timed out (no data received for ${Math.round(idleTimeoutMs / 1000)}s)`,\n ExitCode.Timeout,\n )\n }\n throw new CLIError(\n `Stream error: ${err instanceof Error ? err.message : String(err)}`,\n ExitCode.ApiError,\n )\n }\n })\n","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { logger } from '../utils/logger.js'\nimport { getOutputFormat, output, outputDetail } from '../output/formatter.js'\nimport type { PaginatedResponse } from '../api/client.js'\nimport { parseIntStrict } from '../utils/number.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\n\nexport const monitorCommand = new Command('monitor')\n .description('Manage monitors')\n\nmonitorCommand\n .command('list')\n .description('List all monitors')\n .option('--page <page>', 'Page number', '1')\n .option('--limit <limit>', 'Items per page', '50')\n .action(async (options: { page: string; limit: string }) => {\n const client = createAuthenticatedClient()\n\n const { data } = await withSpinner(\n 'Fetching monitors',\n () => client.get<PaginatedResponse<Record<string, unknown>>>(\n '/api/monitors',\n { page: options.page, limit: options.limit },\n ),\n )\n\n output(data.data, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'name', header: 'Name' },\n { key: 'type', header: 'Type' },\n { key: 'status', header: 'Status' },\n { key: 'frequencyMinutes', header: 'Freq (min)' },\n ],\n })\n\n if (data.pagination) {\n logger.info(\n `\\nPage ${data.pagination.page}/${data.pagination.totalPages} (${data.pagination.total} total)`,\n )\n }\n })\n\nmonitorCommand\n .command('get <id>')\n .description('Get monitor details')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching monitor details',\n () => client.get<Record<string, unknown>>(`/api/monitors/${id}`),\n )\n outputDetail(data)\n })\n\nmonitorCommand\n .command('results <id>')\n .description('Get monitor check results')\n .option('--limit <limit>', 'Number of results', '20')\n .option('--page <page>', 'Page number', '1')\n .action(async (id: string, options: { limit: string; page: string }) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching monitor results',\n () => client.get<{ data: Record<string, unknown>[]; pagination?: { page: number; totalPages: number; total: number } }>(\n `/api/monitors/${id}/results`,\n { limit: options.limit, page: options.page },\n ),\n )\n\n output(data.data, {\n columns: [\n { key: 'checkedAt', header: 'Time' },\n { key: 'status', header: 'Status' },\n { key: 'responseTime', header: 'Response (ms)' },\n { key: 'location', header: 'Location' },\n ],\n })\n\n if (data.pagination) {\n logger.info(\n `\\nPage ${data.pagination.page}/${data.pagination.totalPages} (${data.pagination.total} total)`,\n )\n }\n })\n\nmonitorCommand\n .command('stats <id>')\n .description('Get monitor performance statistics')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching monitor statistics',\n () => client.get<Record<string, unknown>>(`/api/monitors/${id}/stats`),\n )\n\n if (getOutputFormat() === 'json') {\n outputDetail(data)\n return\n }\n\n // The API returns { success, data: { period24h, period30d }, meta }\n const statsData = (data.data ?? data) as Record<string, unknown>\n const period24h = statsData.period24h as Record<string, unknown> | undefined\n const period30d = statsData.period30d as Record<string, unknown> | undefined\n\n if (period24h) {\n logger.header('Last 24 Hours')\n outputDetail(period24h)\n logger.info('')\n }\n\n if (period30d) {\n logger.header('Last 30 Days')\n outputDetail(period30d)\n logger.info('')\n }\n\n // Show meta information if available\n const meta = data.meta as Record<string, unknown> | undefined\n if (meta) {\n logger.header('Meta')\n outputDetail(meta)\n }\n })\n\nmonitorCommand\n .command('status <id>')\n .description('Get current monitor status')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching monitor status',\n () => client.get<Record<string, unknown>>(`/api/monitors/${id}`),\n )\n const statusInfo: Record<string, unknown> = {\n id: data.id,\n name: data.name,\n status: data.status,\n lastCheckAt: data.lastCheckAt,\n responseTime: data.responseTime,\n }\n outputDetail(statusInfo)\n })\n\nmonitorCommand\n .command('create')\n .description('Create a new monitor')\n .requiredOption('--name <name>', 'Monitor name')\n .requiredOption('--url <url>', 'URL to monitor')\n .option('--type <type>', 'Monitor type (http_request, website, ping_host, port_check, synthetic_test)', 'http_request')\n .option('--interval-minutes <minutes>', 'Check interval in minutes (1-1440)', '5')\n .option('--interval <seconds>', '[deprecated: use --interval-minutes] Check interval in seconds')\n .option('--timeout <seconds>', 'Request timeout in seconds', '30')\n .option('--method <method>', 'HTTP method (GET, POST, HEAD)', 'GET')\n .option('--dry-run', 'Show what would be sent without creating')\n .action(async (options: { name: string; url: string; type: string; intervalMinutes: string; interval?: string; timeout: string; method: string; dryRun?: boolean }) => {\n const client = createAuthenticatedClient()\n\n let frequencyMinutes: number\n if (options.interval !== undefined) {\n logger.warn('--interval (seconds) is deprecated. Use --interval-minutes instead.')\n const intervalSeconds = parseIntStrict(options.interval, '--interval', { min: 60 })\n if (intervalSeconds % 60 !== 0) {\n throw new CLIError(\n `--interval must be a multiple of 60 seconds. Got ${intervalSeconds}s. Use --interval-minutes for direct minute values.`,\n ExitCode.ConfigError,\n )\n }\n frequencyMinutes = intervalSeconds / 60\n } else {\n frequencyMinutes = parseIntStrict(options.intervalMinutes, '--interval-minutes', { min: 1, max: 1440 })\n }\n\n const body: Record<string, unknown> = {\n name: options.name,\n target: options.url,\n type: options.type,\n frequencyMinutes,\n config: {\n timeout: parseIntStrict(options.timeout, '--timeout', { min: 1 }) * 1000, // API expects milliseconds\n method: options.method,\n },\n }\n\n if (options.dryRun) {\n logger.header('Dry run — monitor create payload:')\n logger.info(JSON.stringify(body, null, 2))\n return\n }\n\n const { data } = await withSpinner(\n 'Creating monitor',\n () => client.post<Record<string, unknown>>('/api/monitors', body),\n )\n logger.success(`Monitor \"${options.name}\" created (${data.id})`)\n outputDetail(data)\n })\n\nmonitorCommand\n .command('update <id>')\n .description('Update a monitor')\n .option('--name <name>', 'Monitor name')\n .option('--url <url>', 'URL to monitor')\n .option('--interval-minutes <minutes>', 'Check interval in minutes (1-1440)')\n .option('--interval <seconds>', '[deprecated: use --interval-minutes] Check interval in seconds')\n .option('--timeout <seconds>', 'Request timeout in seconds')\n .option('--method <method>', 'HTTP method')\n .option('--active <boolean>', 'Enable or disable monitor (true/false)')\n .option('--dry-run', 'Show what would be sent without updating')\n .action(async (id: string, options: { name?: string; url?: string; intervalMinutes?: string; interval?: string; timeout?: string; method?: string; active?: string; dryRun?: boolean }) => {\n const client = createAuthenticatedClient()\n\n const body: Record<string, unknown> = {}\n if (options.name !== undefined) body.name = options.name\n if (options.url !== undefined) body.target = options.url\n if (options.interval !== undefined) {\n logger.warn('--interval (seconds) is deprecated. Use --interval-minutes instead.')\n const intervalSeconds = parseIntStrict(options.interval, '--interval', { min: 60 })\n if (intervalSeconds % 60 !== 0) {\n throw new CLIError(\n `--interval must be a multiple of 60 seconds. Got ${intervalSeconds}s. Use --interval-minutes for direct minute values.`,\n ExitCode.ConfigError,\n )\n }\n body.frequencyMinutes = intervalSeconds / 60\n } else if (options.intervalMinutes !== undefined) {\n body.frequencyMinutes = parseIntStrict(options.intervalMinutes, '--interval-minutes', { min: 1, max: 1440 })\n }\n if (options.active !== undefined) body.enabled = options.active === 'true'\n\n // timeout and method go in config object\n const config: Record<string, unknown> = {}\n if (options.timeout !== undefined) config.timeout = parseIntStrict(options.timeout, '--timeout', { min: 1 }) * 1000\n if (options.method !== undefined) config.method = options.method\n if (Object.keys(config).length > 0) body.config = config\n\n if (Object.keys(body).length === 0) {\n logger.warn('No fields to update. Use --name, --url, --interval-minutes, --timeout, --method, or --active.')\n return\n }\n\n if (options.dryRun) {\n logger.header('Dry run — monitor update payload:')\n logger.info(JSON.stringify(body, null, 2))\n return\n }\n\n const { data } = await withSpinner(\n 'Updating monitor',\n () => client.patch<Record<string, unknown>>(`/api/monitors/${id}`, body),\n )\n logger.success(`Monitor ${id} updated`)\n outputDetail(data)\n })\n\nmonitorCommand\n .command('delete <id>')\n .description('Delete a monitor')\n .option('--force', 'Skip confirmation')\n .action(async (id: string, options: { force?: boolean }) => {\n if (!options.force) {\n const { confirmPrompt } = await import('../utils/prompt.js')\n const confirmed = await confirmPrompt(`Delete monitor ${id}?`, { default: false })\n if (!confirmed) {\n logger.info('Aborted')\n return\n }\n }\n\n const client = createAuthenticatedClient()\n await withSpinner(\n 'Deleting monitor',\n () => client.delete(`/api/monitors/${id}`),\n )\n logger.success(`Monitor ${id} deleted`)\n })\n","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { logger } from '../utils/logger.js'\nimport { output, outputDetail } from '../output/formatter.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { withSpinner } from '../utils/spinner.js'\n\ninterface Variable {\n id: string\n key: string\n value?: string\n isSecret: boolean\n description?: string | null\n createdAt?: string\n}\n\nexport const varCommand = new Command('var')\n .description('Manage project variables')\n\nvarCommand\n .command('list')\n .description('List all variables')\n .action(async () => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching variables',\n () => client.get<Variable[]>('/api/variables'),\n )\n\n output(data as unknown as Record<string, unknown>[], {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'key', header: 'Key' },\n { key: 'isSecret', header: 'Secret' },\n { key: 'createdAt', header: 'Created' },\n ],\n })\n })\n\nvarCommand\n .command('get <key>')\n .description('Get a variable by key name')\n .action(async (key: string) => {\n const client = createAuthenticatedClient()\n const { data: variables } = await withSpinner(\n 'Fetching variable',\n () => client.get<Variable[]>('/api/variables'),\n )\n\n const variable = variables.find((v) => v.key === key)\n if (!variable) {\n throw new CLIError(`Variable \"${key}\" not found`, ExitCode.GeneralError)\n }\n\n outputDetail(variable as unknown as Record<string, unknown>)\n })\n\nvarCommand\n .command('set <key> <value>')\n .description('Create or update a variable')\n .option('--secret', 'Mark as secret (value will be encrypted)')\n .option('--description <description>', 'Variable description')\n .action(async (key: string, value: string, options: { secret?: boolean; description?: string }) => {\n const client = createAuthenticatedClient()\n\n // Check if variable exists\n const { data: variables } = await withSpinner(\n 'Checking existing variables',\n () => client.get<Variable[]>('/api/variables'),\n )\n const existing = variables.find((v) => v.key === key)\n\n if (existing) {\n await withSpinner(\n 'Updating variable',\n () => client.put(`/api/variables/${existing.id}`, {\n key,\n value,\n isSecret: options.secret ?? existing.isSecret,\n ...(options.description !== undefined && { description: options.description }),\n }),\n )\n logger.success(`Variable \"${key}\" updated`)\n } else {\n await withSpinner(\n 'Creating variable',\n () => client.post('/api/variables', {\n key,\n value,\n isSecret: options.secret ?? false,\n ...(options.description !== undefined && { description: options.description }),\n }),\n )\n logger.success(`Variable \"${key}\" created`)\n }\n })\n\nvarCommand\n .command('delete <key>')\n .description('Delete a variable')\n .option('--force', 'Skip confirmation')\n .action(async (key: string, options: { force?: boolean }) => {\n const client = createAuthenticatedClient()\n\n const { data: variables } = await withSpinner(\n 'Fetching variables',\n () => client.get<Variable[]>('/api/variables'),\n )\n const variable = variables.find((v) => v.key === key)\n\n if (!variable) {\n throw new CLIError(`Variable \"${key}\" not found`, ExitCode.GeneralError)\n }\n\n if (!options.force) {\n const { confirmPrompt } = await import('../utils/prompt.js')\n const confirmed = await confirmPrompt(`Delete variable \"${key}\"?`, { default: false })\n if (!confirmed) {\n logger.info('Aborted')\n return\n }\n }\n\n await withSpinner(\n 'Deleting variable',\n () => client.delete(`/api/variables/${variable.id}`),\n )\n logger.success(`Variable \"${key}\" deleted`)\n })\n","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { logger } from '../utils/logger.js'\nimport { output } from '../output/formatter.js'\nimport { withSpinner } from '../utils/spinner.js'\n\nexport const tagCommand = new Command('tag')\n .description('Manage tags')\n\ntagCommand\n .command('list')\n .description('List all tags')\n .action(async () => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching tags',\n () => client.get<Record<string, unknown>[]>('/api/tags'),\n )\n\n output(data, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'name', header: 'Name' },\n { key: 'color', header: 'Color' },\n ],\n })\n })\n\ntagCommand\n .command('create <name>')\n .description('Create a new tag')\n .option('--color <color>', 'Tag color (hex)')\n .action(async (name: string, options: { color?: string }) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Creating tag',\n () => client.post<Record<string, unknown>>('/api/tags', {\n name,\n color: options.color,\n }),\n )\n\n logger.success(`Tag \"${name}\" created (${data.id})`)\n })\n\ntagCommand\n .command('delete <id>')\n .description('Delete a tag')\n .option('--force', 'Skip confirmation')\n .action(async (id: string, options: { force?: boolean }) => {\n if (!options.force) {\n const { confirmPrompt } = await import('../utils/prompt.js')\n const confirmed = await confirmPrompt(`Delete tag ${id}?`, { default: false })\n if (!confirmed) {\n logger.info('Aborted')\n return\n }\n }\n\n const client = createAuthenticatedClient()\n await withSpinner(\n 'Deleting tag',\n () => client.delete(`/api/tags/${id}`),\n )\n logger.success(`Tag ${id} deleted`)\n })\n","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { loadConfig } from '../config/loader.js'\nimport { logger } from '../utils/logger.js'\nimport {\n reconcile,\n formatChangePlan,\n} from '../utils/reconcile.js'\nimport { buildLocalResources, fetchRemoteResources } from '../utils/resources.js'\nimport { withSpinner } from '../utils/spinner.js'\n\n\nexport const diffCommand = new Command('diff')\n .description('Preview changes between local config and the remote Supercheck project')\n .option('--config <path>', 'Path to config file')\n .action(async (options: { config?: string }) => {\n const cwd = process.cwd()\n const { config } = await loadConfig({ cwd, configPath: options.config })\n const client = createAuthenticatedClient(config.api?.baseUrl)\n\n logger.newline()\n\n const { localResources, remoteResources } = await withSpinner(\n 'Comparing local and remote resources...',\n async () => {\n const local = buildLocalResources(config, cwd)\n const remote = await fetchRemoteResources(client)\n return { localResources: local, remoteResources: remote }\n },\n { successText: 'Resources compared' },\n )\n\n logger.debug(`Local: ${localResources.length} resources, Remote: ${remoteResources.length} resources`)\n\n const changes = reconcile(localResources, remoteResources)\n formatChangePlan(changes)\n })\n","import pc from 'picocolors'\nimport { logger } from './logger.js'\n\n/**\n * Represents a resource defined in the local config file.\n */\nexport interface LocalResource {\n /** Database UUID if this resource already exists on the server. Absent for new resources. */\n id?: string\n type: 'test' | 'monitor' | 'job' | 'variable' | 'tag' | 'statusPage'\n name: string\n definition: Record<string, unknown>\n}\n\n/**\n * Represents a resource fetched from the remote Supercheck API.\n */\nexport interface RemoteResource {\n id: string\n type: 'test' | 'monitor' | 'job' | 'variable' | 'tag' | 'statusPage'\n name: string\n raw: Record<string, unknown>\n}\n\nexport type ChangeAction = 'create' | 'update' | 'delete' | 'no-change'\n\nexport interface ResourceChange {\n action: ChangeAction\n type: LocalResource['type']\n id?: string\n name: string\n local?: LocalResource\n remote?: RemoteResource\n details?: string[]\n}\n\n/**\n * Compare local config resources against remote API resources\n * using id-based reconciliation.\n *\n * - Resources with an `id` in local config are matched against remote by `type:id`.\n * - Resources without an `id` in local config are treated as new (create).\n * - Remote resources whose `id` does not appear in any local resource are candidates for deletion.\n */\nexport function reconcile(\n local: LocalResource[],\n remote: RemoteResource[],\n): ResourceChange[] {\n const changes: ResourceChange[] = []\n\n // Build lookup maps by type + id\n const remoteByKey = new Map<string, RemoteResource>()\n for (const r of remote) {\n remoteByKey.set(`${r.type}:${r.id}`, r)\n }\n\n const localByKey = new Map<string, LocalResource>()\n for (const l of local) {\n if (l.id) {\n localByKey.set(`${l.type}:${l.id}`, l)\n }\n }\n\n // Detect creates and updates\n for (const l of local) {\n if (!l.id) {\n // No id = new resource to create\n changes.push({\n action: 'create',\n type: l.type,\n name: l.name,\n local: l,\n })\n continue\n }\n\n const key = `${l.type}:${l.id}`\n const r = remoteByKey.get(key)\n\n if (!r) {\n // Has id but not found on remote — treat as create (might have been deleted server-side)\n changes.push({\n action: 'create',\n type: l.type,\n id: l.id,\n name: l.name,\n local: l,\n })\n } else {\n const diffs = diffFields(l.definition, r.raw)\n if (diffs.length > 0) {\n changes.push({\n action: 'update',\n type: l.type,\n id: l.id,\n name: l.name,\n local: l,\n remote: r,\n details: diffs,\n })\n } else {\n changes.push({\n action: 'no-change',\n type: l.type,\n id: l.id,\n name: l.name,\n local: l,\n remote: r,\n })\n }\n }\n }\n\n // Detect deletes — remote resources NOT in local config\n for (const r of remote) {\n const key = `${r.type}:${r.id}`\n if (!localByKey.has(key)) {\n changes.push({\n action: 'delete',\n type: r.type,\n id: r.id,\n name: r.name,\n remote: r,\n })\n }\n }\n\n return changes\n}\n\n/**\n * Produce a stable JSON string with sorted keys to avoid false diffs\n * caused by different key insertion order in objects.\n */\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(value, (_, v) => {\n if (v && typeof v === 'object' && !Array.isArray(v)) {\n return Object.keys(v).sort().reduce<Record<string, unknown>>((sorted, k) => {\n sorted[k] = (v as Record<string, unknown>)[k]\n return sorted\n }, {})\n }\n return v\n })\n}\n\n/**\n * Shallow diff between local definition fields and remote raw fields.\n * Returns a list of human-readable change descriptions.\n */\nfunction diffFields(local: Record<string, unknown>, remote: Record<string, unknown>): string[] {\n const diffs: string[] = []\n // Only compare fields present in the local definition\n for (const [key, localVal] of Object.entries(local)) {\n // Skip internal/metadata fields\n if (['id', 'createdAt', 'updatedAt', 'projectId', 'organizationId', 'createdByUserId'].includes(key)) continue\n\n const remoteVal = remote[key]\n if (stableStringify(localVal) !== stableStringify(remoteVal)) {\n diffs.push(`${key}: ${JSON.stringify(remoteVal)} -> ${JSON.stringify(localVal)}`)\n }\n }\n return diffs\n}\n\n/**\n * Format a change plan for display in the terminal.\n */\nexport function formatChangePlan(changes: ResourceChange[]): void {\n const creates = changes.filter((c) => c.action === 'create')\n const updates = changes.filter((c) => c.action === 'update')\n const deletes = changes.filter((c) => c.action === 'delete')\n const unchanged = changes.filter((c) => c.action === 'no-change')\n\n logger.newline()\n logger.header('Change Plan')\n logger.newline()\n\n if (creates.length > 0) {\n logger.info(pc.green(` + ${creates.length} to create`))\n for (const c of creates) {\n logger.info(pc.green(` + ${c.type}/${c.name}`))\n }\n }\n\n if (updates.length > 0) {\n logger.info(pc.yellow(` ~ ${updates.length} to update`))\n for (const c of updates) {\n logger.info(pc.yellow(` ~ ${c.type}/${c.name} (${c.id})`))\n if (c.details) {\n for (const d of c.details) {\n logger.info(pc.gray(` ${d}`))\n }\n }\n }\n }\n\n if (deletes.length > 0) {\n logger.info(pc.red(` - ${deletes.length} to delete`))\n for (const c of deletes) {\n logger.info(pc.red(` - ${c.type}/${c.name} (${c.id})`))\n }\n }\n\n if (unchanged.length > 0) {\n logger.info(pc.gray(` = ${unchanged.length} unchanged`))\n }\n\n logger.newline()\n\n const totalChanges = creates.length + updates.length + deletes.length\n if (totalChanges === 0) {\n logger.success('No changes detected. Everything is in sync.')\n } else {\n logger.info(`${pc.bold(String(totalChanges))} change(s) detected.`)\n }\n logger.newline()\n}\n","import { Command } from 'commander'\nimport { renameSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { loadConfig } from '../config/loader.js'\nimport { logger } from '../utils/logger.js'\nimport {\n reconcile,\n formatChangePlan,\n type ResourceChange,\n} from '../utils/reconcile.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { buildLocalResources, fetchRemoteResources, getApiEndpoint } from '../utils/resources.js'\nimport { discoverFiles } from '../utils/discovery.js'\nimport { confirmPrompt } from '../utils/prompt.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { testRelativePath } from '../utils/paths.js'\nimport { normalizeTestTypeForApi, validateScripts, validateScriptTypeMatch } from '../utils/validation.js'\nimport pc from 'picocolors'\n\n\n/**\n * Prepare the body for API request by transforming local config shape\n * back to the raw API shape (reversing pull/normalization logic).\n */\nfunction prepareBodyForApi(type: string, body: Record<string, unknown>): Record<string, unknown> {\n const payload = { ...body }\n\n if (type === 'test') {\n // Map local testType to API \"type\"\n const normalizedType = normalizeTestTypeForApi(payload.testType)\n if (normalizedType) payload.type = normalizedType\n delete payload.testType\n }\n\n if (type === 'job') {\n // Resolve test paths back to UUIDs and wrap in {id} objects\n // API expects tests: Array<{ id: string }>, not string[]\n if (Array.isArray(payload.tests)) {\n payload.tests = (payload.tests as string[]).map((t) => {\n // Extract UUID from path: _supercheck_/homepage.019a1234-....pw.ts\n const match = /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/i.exec(t)\n const id = match ? match[1] : t\n return { id }\n })\n }\n }\n\n if (type === 'statusPage') {\n // Map description back to pageDescription\n if (payload.description) {\n payload.pageDescription = payload.description\n delete payload.description\n }\n }\n\n return payload\n}\n\n/**\n * Apply a single resource change via the API.\n */\nasync function applyChange(\n client: import('../api/client.js').ApiClient,\n change: ResourceChange,\n opts: {\n testFilesByName: Map<string, string>\n },\n): Promise<{ success: boolean; error?: string }> {\n try {\n const endpoint = getApiEndpoint(change.type)\n\n switch (change.action) {\n case 'create': {\n const rawBody = { ...change.local!.definition }\n delete (rawBody as { id?: string }).id\n const body = prepareBodyForApi(change.type, rawBody)\n\n const response = await client.post(endpoint, body)\n\n if (change.type === 'test') {\n const responseBody = response.data as { test?: { id?: string; title?: string; type?: string } }\n const createdId = responseBody?.test?.id\n const createdTitle = responseBody?.test?.title ?? change.local?.definition?.title\n\n const testType = change.local?.definition?.testType === 'k6' ? 'k6' : 'playwright'\n\n if (createdId && typeof createdTitle === 'string') {\n const existingPath = opts.testFilesByName.get(change.name)\n if (existingPath) {\n const newRelPath = testRelativePath(createdId, createdTitle, testType)\n const newPath = resolve(process.cwd(), newRelPath)\n\n if (newPath !== existingPath) {\n renameSync(existingPath, newPath)\n }\n }\n }\n }\n return { success: true }\n }\n case 'update': {\n const id = change.id ?? change.remote!.id\n const rawBody = { ...change.local!.definition }\n delete (rawBody as { id?: string }).id\n const body = prepareBodyForApi(change.type, rawBody)\n await client.put(`${endpoint}/${id}`, body)\n return { success: true }\n }\n case 'delete': {\n const id = change.id ?? change.remote!.id\n await client.delete(`${endpoint}/${id}`)\n return { success: true }\n }\n default:\n return { success: true }\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n return { success: false, error: message }\n }\n}\n\nexport const deployCommand = new Command('deploy')\n .description('Push local config resources to the Supercheck project')\n .option('--config <path>', 'Path to config file')\n .option('--dry-run', 'Show what would change without applying')\n .option('--force', 'Skip confirmation prompt')\n .option('--no-delete', 'Do not delete remote resources missing from config')\n .action(async (options: { config?: string; dryRun?: boolean; force?: boolean; delete?: boolean }) => {\n const cwd = process.cwd()\n const { config } = await loadConfig({ cwd, configPath: options.config })\n const client = createAuthenticatedClient(config.api?.baseUrl)\n\n logger.newline()\n logger.header('Deploying from config...')\n logger.newline()\n\n const { localResources, remoteResources } = await withSpinner(\n 'Comparing local and remote resources...',\n async () => {\n const local = buildLocalResources(config, cwd)\n const remote = await fetchRemoteResources(client)\n return { localResources: local, remoteResources: remote }\n },\n { successText: 'Resources compared' },\n )\n\n let changes = reconcile(localResources, remoteResources)\n\n // Filter out deletes if --no-delete\n if (options.delete === false) {\n changes = changes.filter((c) => c.action !== 'delete')\n }\n\n const actionable = changes.filter((c) => c.action !== 'no-change')\n\n const unsupportedStatusPageMutations = actionable.filter(\n (c) => c.type === 'statusPage' && (c.action === 'create' || c.action === 'update'),\n )\n\n if (unsupportedStatusPageMutations.length > 0) {\n throw new CLIError(\n 'Status page create/update is not supported by the current API. Remove statusPages create/update changes from config (or apply them in the dashboard) and run deploy again.',\n ExitCode.ConfigError,\n )\n }\n\n if (actionable.length === 0) {\n logger.success('No changes to deploy. Everything is in sync.')\n return\n }\n\n formatChangePlan(changes)\n\n if (options.dryRun) {\n logger.info(pc.yellow('Dry run — no changes applied.'))\n return\n }\n\n // Validate test scripts before applying changes\n const testsToValidate = actionable.filter((c) => c.type === 'test' && (c.action === 'create' || c.action === 'update'))\n if (testsToValidate.length > 0) {\n await withSpinner('Validating test scripts...', async () => {\n // Fast client-side script-type mismatch detection\n for (const change of testsToValidate) {\n const script = String(change.local?.definition?.script ?? '')\n const declaredType = normalizeTestTypeForApi(change.local?.definition?.testType)\n const mismatch = validateScriptTypeMatch(script, declaredType)\n if (mismatch) {\n throw new CLIError(`${change.name}: ${mismatch}`, ExitCode.ConfigError)\n }\n }\n\n const inputs = testsToValidate.map((change) => ({\n name: change.name,\n script: String(change.local?.definition?.script ?? ''),\n testType: normalizeTestTypeForApi(change.local?.definition?.testType),\n }))\n\n const results = await validateScripts(client, inputs)\n const failures = results.filter((r) => !r.valid)\n if (failures.length > 0) {\n const details = failures.map((f) => ` - ${f.name}: ${f.error ?? 'Validation failed'}`).join('\\n')\n throw new CLIError(`Validation failed:\\n${details}`, ExitCode.ConfigError)\n }\n\n const warnings = results.filter((r) => r.warnings && r.warnings.length > 0)\n for (const warn of warnings) {\n logger.warn(`Validation warnings for ${warn.name}: ${(warn.warnings ?? []).join(', ')}`)\n }\n }, { successText: 'Test scripts validated' })\n }\n\n if (!options.force) {\n const confirmed = await confirmPrompt('Apply these changes?', { default: false })\n if (!confirmed) {\n logger.info('Deploy aborted.')\n return\n }\n }\n\n // Apply changes\n logger.info('Applying changes...')\n logger.newline()\n\n let succeeded = 0\n let failed = 0\n\n // Apply creates first, then updates, then deletes\n const ordered = [\n ...actionable.filter((c) => c.action === 'create'),\n ...actionable.filter((c) => c.action === 'update'),\n ...actionable.filter((c) => c.action === 'delete'),\n ]\n\n const testFilesByName = new Map<string, string>()\n const patterns = {\n playwright: config.tests?.playwright?.testMatch,\n k6: config.tests?.k6?.testMatch,\n }\n for (const file of discoverFiles(cwd, patterns)) {\n const key = file.relativePath.replace(/^_supercheck_\\//, '')\n testFilesByName.set(key, file.absolutePath)\n }\n\n for (const change of ordered) {\n const actionLabel = change.action === 'create' ? '+' : change.action === 'update' ? '~' : '-'\n const color = change.action === 'create' ? pc.green : change.action === 'update' ? pc.yellow : pc.red\n\n const result = await applyChange(client, change, { testFilesByName })\n\n if (result.success) {\n logger.info(color(` ${actionLabel} ${change.type}/${change.name} ✓`))\n succeeded++\n } else {\n logger.error(` ${actionLabel} ${change.type}/${change.name} ✗ ${result.error}`)\n failed++\n }\n }\n\n logger.newline()\n\n if (failed > 0) {\n throw new CLIError(\n `Deploy completed with errors: ${succeeded} succeeded, ${failed} failed`,\n ExitCode.GeneralError,\n )\n } else {\n logger.success(`Deploy complete: ${succeeded} change(s) applied successfully`)\n }\n })\n","import { testFilename } from './slug.js'\n\nexport type LocalTestType = 'playwright' | 'k6'\n\nexport function testTypeToFolder(testType: LocalTestType): string {\n return testType === 'k6' ? 'k6' : 'playwright'\n}\n\nexport function testRelativePath(\n testId: string,\n title: string,\n testType: LocalTestType,\n): string {\n const folder = testTypeToFolder(testType)\n const filename = testFilename(testId, title, testType)\n return `_supercheck_/${folder}/${filename}`\n}","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { loadConfig } from '../config/loader.js'\nimport { logger } from '../utils/logger.js'\nimport { discoverFiles } from '../utils/discovery.js'\nimport { CLIError, ExitCode, ApiRequestError } from '../utils/errors.js'\nimport { getApiEndpoint, fetchAllPages } from '../utils/resources.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { extractUuidFromFilename } from '../utils/slug.js'\nimport type { SupercheckConfig } from '../config/schema.js'\nimport pc from 'picocolors'\n\n\ninterface ManagedResource {\n id: string\n type: string\n name: string\n}\n\n/**\n * Fetch all managed resources (those whose id appears in the local config) from the API.\n * Resources without an `id` in the config are considered new (not yet deployed) and are skipped.\n */\nasync function fetchManagedResources(\n client: import('../api/client.js').ApiClient,\n config: SupercheckConfig,\n): Promise<ManagedResource[]> {\n const resources: ManagedResource[] = []\n\n // Collect ids from config to know what's managed\n const managedIds = new Set<string>()\n\n if (config.jobs) {\n for (const j of config.jobs) {\n if (j.id) managedIds.add(`job:${j.id}`)\n }\n }\n if (config.variables) {\n for (const v of config.variables) {\n if (v.id) managedIds.add(`variable:${v.id}`)\n }\n }\n if (config.tags) {\n for (const t of config.tags) {\n if (t.id) managedIds.add(`tag:${t.id}`)\n }\n }\n if (Array.isArray(config.monitors)) {\n for (const m of config.monitors) {\n if (m.id) managedIds.add(`monitor:${m.id}`)\n }\n }\n if (Array.isArray(config.statusPages)) {\n for (const sp of config.statusPages) {\n if (sp.id) managedIds.add(`statusPage:${sp.id}`)\n }\n }\n\n // Discover test files — extract UUIDs from filenames to match remote tests by id.\n // Files are named `{slug}.{uuid}.pw.ts` / `{slug}.{uuid}.k6.ts` after `supercheck pull`.\n // Also supports legacy `{uuid}.pw.ts` format.\n const patterns = {\n playwright: config.tests?.playwright?.testMatch,\n k6: config.tests?.k6?.testMatch,\n }\n const cwd = process.cwd()\n const files = discoverFiles(cwd, patterns)\n const testIds = new Set<string>()\n for (const f of files) {\n const uuid = extractUuidFromFilename(f.filename)\n if (uuid) {\n testIds.add(uuid)\n }\n }\n\n // Fetch remote resources and filter to managed ones\n try {\n const jobs = await fetchAllPages<Record<string, unknown>>(client, '/api/jobs', 'jobs')\n for (const job of jobs) {\n if (job.id && managedIds.has(`job:${String(job.id)}`)) {\n resources.push({ id: String(job.id), type: 'job', name: String(job.name ?? '') })\n }\n }\n } catch (err) { logDestroyFetchError('jobs', err) }\n\n try {\n const tests = await fetchAllPages<Record<string, unknown>>(client, '/api/tests', 'tests')\n for (const test of tests) {\n // Match by database id — local test files are named `{uuid}.pw.ts`\n if (test.id && testIds.has(String(test.id))) {\n resources.push({ id: String(test.id), type: 'test', name: String(test.title ?? '') })\n }\n }\n } catch (err) { logDestroyFetchError('tests', err) }\n\n try {\n const monitors = await fetchAllPages<Record<string, unknown>>(client, '/api/monitors', 'monitors')\n for (const monitor of monitors) {\n if (monitor.id && managedIds.has(`monitor:${String(monitor.id)}`)) {\n resources.push({ id: String(monitor.id), type: 'monitor', name: String(monitor.name ?? '') })\n }\n }\n } catch (err) { logDestroyFetchError('monitors', err) }\n\n try {\n const { data } = await client.get<Array<Record<string, unknown>>>('/api/variables')\n for (const v of data) {\n if (v.id && managedIds.has(`variable:${String(v.id)}`)) {\n resources.push({ id: String(v.id), type: 'variable', name: String(v.key ?? '') })\n }\n }\n } catch (err) { logDestroyFetchError('variables', err) }\n\n try {\n const { data } = await client.get<Array<Record<string, unknown>>>('/api/tags')\n for (const t of data) {\n if (t.id && managedIds.has(`tag:${String(t.id)}`)) {\n resources.push({ id: String(t.id), type: 'tag', name: String(t.name ?? '') })\n }\n }\n } catch (err) { logDestroyFetchError('tags', err) }\n\n try {\n const statusPages = await fetchAllPages<Record<string, unknown>>(client, '/api/status-pages', 'status-pages')\n for (const sp of statusPages) {\n if (sp.id && managedIds.has(`statusPage:${String(sp.id)}`)) {\n resources.push({ id: String(sp.id), type: 'statusPage', name: String(sp.name ?? '') })\n }\n }\n } catch (err) { logDestroyFetchError('status-pages', err) }\n\n return resources\n}\n\n/**\n * Log fetch errors with appropriate severity for the destroy command.\n */\nfunction logDestroyFetchError(resourceType: string, err: unknown): void {\n if (err instanceof ApiRequestError && err.statusCode === 404) {\n logger.debug(`Could not fetch ${resourceType} (not found)`)\n } else {\n const msg = err instanceof Error ? err.message : String(err)\n logger.warn(`Could not fetch ${resourceType}: ${msg}`)\n }\n}\n\nexport const destroyCommand = new Command('destroy')\n .description('Tear down managed resources from the Supercheck project')\n .option('--config <path>', 'Path to config file')\n .option('--dry-run', 'Show what would be destroyed without applying')\n .option('--force', 'Skip confirmation prompt')\n .action(async (options: { config?: string; dryRun?: boolean; force?: boolean }) => {\n const cwd = process.cwd()\n const { config } = await loadConfig({ cwd, configPath: options.config })\n const client = createAuthenticatedClient(config.api?.baseUrl)\n\n logger.newline()\n\n const managed = await withSpinner(\n 'Scanning for managed resources...',\n () => fetchManagedResources(client, config),\n { successText: 'Scan complete' },\n )\n\n if (managed.length === 0) {\n logger.success('No managed resources found on the remote project.')\n return\n }\n\n logger.header('Resources to destroy:')\n logger.newline()\n for (const r of managed) {\n logger.info(pc.red(` - ${r.type}/${r.name} [${r.id}]`))\n }\n logger.newline()\n logger.warn(`This will permanently delete ${pc.bold(String(managed.length))} resource(s).`)\n logger.newline()\n\n if (options.dryRun) {\n logger.info(pc.yellow('Dry run — no resources destroyed.'))\n return\n }\n\n if (!options.force) {\n throw new CLIError(\n 'Use --force to confirm destruction, or --dry-run to preview.',\n ExitCode.GeneralError,\n )\n }\n\n logger.info('Destroying resources...')\n logger.newline()\n\n let succeeded = 0\n let failed = 0\n\n // Delete in reverse dependency order:\n // Jobs reference tests, so jobs must be deleted first to unblock test deletion.\n // Monitors and status pages are independent, then vars/tags last.\n const deleteOrder = ['statusPage', 'job', 'monitor', 'variable', 'tag', 'test']\n const sorted = [...managed].sort((a, b) => deleteOrder.indexOf(a.type) - deleteOrder.indexOf(b.type))\n\n for (const resource of sorted) {\n try {\n const endpoint = getApiEndpoint(resource.type)\n await client.delete(`${endpoint}/${resource.id}`)\n logger.info(pc.red(` - ${resource.type}/${resource.name} ✓`))\n succeeded++\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n logger.error(` - ${resource.type}/${resource.name} ✗ ${msg}`)\n failed++\n }\n }\n\n logger.newline()\n\n if (failed > 0) {\n throw new CLIError(\n `Destroy completed with errors: ${succeeded} destroyed, ${failed} failed`,\n ExitCode.GeneralError,\n )\n } else {\n logger.success(`Destroy complete: ${succeeded} resource(s) removed`)\n }\n })\n","import { Command } from 'commander'\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync, unlinkSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { tryLoadConfig } from '../config/loader.js'\nimport { getStoredBaseUrl, getStoredOrganization, getStoredProject } from '../auth/store.js'\nimport { logger } from '../utils/logger.js'\nimport { withSpinner } from '../utils/spinner.js'\nimport { CLIError, ExitCode, ApiRequestError } from '../utils/errors.js'\nimport { fetchAllPages } from '../utils/resources.js'\nimport { detectPackageManager, ensurePackageJson, installDependencies } from '../utils/package-manager.js'\nimport { extractUuidFromFilename } from '../utils/slug.js'\nimport { testRelativePath, testTypeToFolder } from '../utils/paths.js'\n\nimport pc from 'picocolors'\nimport type { ApiClient } from '../api/client.js'\n\n// ────────────────────────────────────────────────────────────────\n// Types for fetched remote resources\n// ────────────────────────────────────────────────────────────────\n\ninterface RemoteTest {\n id: string\n title: string\n description?: string\n type: string // 'browser' | 'performance' | 'api' etc.\n priority?: string\n script?: string\n tags?: Array<{ id: string; name: string; color?: string }>\n createdAt?: string\n updatedAt?: string\n}\n\ninterface RemoteMonitor {\n id: string\n name: string\n description?: string\n type: string // 'http_request' | 'website' | 'ping_host' | 'port_check' | 'synthetic_test'\n target?: string\n frequencyMinutes?: number\n enabled?: boolean\n status?: string\n config?: Record<string, unknown>\n alertConfig?: Record<string, unknown>\n organizationId?: string\n projectId?: string\n createdAt?: string\n updatedAt?: string\n}\n\ninterface RemoteJob {\n id: string\n name: string\n description?: string\n jobType?: string\n cronSchedule?: string\n status?: string\n alertConfig?: Record<string, unknown>\n tests?: Array<{ id: string; title?: string; type?: string }>\n lastRunAt?: string\n nextRunAt?: string\n createdAt?: string\n updatedAt?: string\n}\n\ninterface RemoteVariable {\n id: string\n key: string\n value?: string\n isSecret: boolean\n description?: string | null\n}\n\ninterface RemoteTag {\n id: string\n name: string\n color?: string\n}\n\ninterface RemoteStatusPage {\n id: string\n name: string\n subdomain?: string\n status?: string\n pageDescription?: string\n headline?: string\n supportUrl?: string\n allowEmailSubscribers?: boolean\n allowWebhookSubscribers?: boolean\n allowRssFeed?: boolean\n cssBodyBackgroundColor?: string\n cssFontColor?: string\n cssGreens?: string\n cssReds?: string\n createdAt?: string\n updatedAt?: string\n}\n\ninterface RemoteContext {\n organization: { id: string; name: string | null; slug: string | null }\n project: { id: string; name: string; slug: string | null; isDefault: boolean }\n}\n\ninterface PullSummary {\n tests: number\n monitors: number\n jobs: number\n variables: number\n tags: number\n statusPages: number\n skipped: number\n errors: string[]\n}\n\n// ────────────────────────────────────────────────────────────────\n// Helpers\n// ────────────────────────────────────────────────────────────────\n\n/**\n * Map API test type back to user-facing type name.\n */\nfunction mapTestType(apiType: string): 'playwright' | 'k6' {\n if (apiType === 'performance' || apiType === 'k6') return 'k6'\n return 'playwright'\n}\n\n// testFilename and extractUuidFromFilename are imported from '../utils/slug.js'\n\n/**\n * Write a file only if the content has changed, avoiding unnecessary git diffs.\n * Returns true if the file was written (new or changed), false if unchanged.\n */\nfunction writeIfChanged(filePath: string, content: string): boolean {\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, 'utf-8')\n if (existing === content) return false\n }\n\n const dir = dirname(filePath)\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n\n writeFileSync(filePath, content, 'utf-8')\n return true\n}\n\n/**\n * Decode a base64-encoded script, with fallback to raw string.\n *\n * Uses a round-trip verification: decode from base64, then re-encode and compare\n * against the original (ignoring trailing whitespace/padding). This prevents\n * false positives where plain text that happens to be valid base64 is silently\n * corrupted.\n */\nfunction decodeScript(script: string | undefined): string | null {\n if (!script) return null\n\n // Try base64 first — scripts from the API are typically base64-encoded\n try {\n const trimmed = script.trim()\n const decoded = Buffer.from(trimmed, 'base64').toString('utf-8')\n\n // Round-trip check: re-encode and verify it matches the original.\n // This catches plain-text strings that Node's lenient base64 parser\n // would silently \"decode\" into garbage.\n const reEncoded = Buffer.from(decoded, 'utf-8').toString('base64')\n if (reEncoded !== trimmed) {\n // Not genuine base64 — return the original script as-is\n return script\n }\n\n // Validate that the decoded content looks like text/code (not garbled binary)\n const isTextLike =\n decoded.length > 0 &&\n Array.from(decoded).every((char) => {\n const code = char.codePointAt(0) ?? 0\n return code === 0x09 || code === 0x0a || code === 0x0d || code >= 0x20\n })\n\n if (isTextLike) {\n return decoded\n }\n } catch {\n // Not valid base64 — treat as raw\n }\n\n return script\n}\n\n// ────────────────────────────────────────────────────────────────\n// Fetch functions\n// ────────────────────────────────────────────────────────────────\n\nasync function fetchContext(client: ApiClient): Promise<RemoteContext | null> {\n try {\n const { data } = await client.get<{ success: boolean } & RemoteContext>('/api/context')\n // Validate that we got meaningful data\n if (data?.organization?.id && data?.project?.id) {\n return data\n }\n logger.debug('Context response missing organization or project ID')\n return null\n } catch (err) {\n logger.warn(`Could not fetch project context: ${err instanceof Error ? err.message : String(err)}`)\n logger.debug('Organization and project will be set to placeholder values. Re-run after fixing connectivity.')\n return null\n }\n}\n\nasync function fetchTests(client: ApiClient): Promise<RemoteTest[]> {\n try {\n return await fetchAllPages<RemoteTest>(client, '/api/tests', 'tests')\n } catch (err) {\n if (err instanceof ApiRequestError && err.statusCode === 404) return []\n throw err\n }\n}\n\nasync function fetchMonitors(client: ApiClient): Promise<RemoteMonitor[]> {\n try {\n return await fetchAllPages<RemoteMonitor>(client, '/api/monitors', 'monitors')\n } catch (err) {\n if (err instanceof ApiRequestError && err.statusCode === 404) return []\n throw err\n }\n}\n\nasync function fetchJobs(client: ApiClient): Promise<RemoteJob[]> {\n try {\n return await fetchAllPages<RemoteJob>(client, '/api/jobs', 'jobs')\n } catch (err) {\n if (err instanceof ApiRequestError && err.statusCode === 404) return []\n throw err\n }\n}\n\nasync function fetchVariables(client: ApiClient): Promise<RemoteVariable[]> {\n try {\n const { data } = await client.get<RemoteVariable[]>('/api/variables')\n return data\n } catch (err) {\n if (err instanceof ApiRequestError && err.statusCode === 404) return []\n throw err\n }\n}\n\nasync function fetchTags(client: ApiClient): Promise<RemoteTag[]> {\n try {\n const { data } = await client.get<RemoteTag[]>('/api/tags')\n return data\n } catch (err) {\n if (err instanceof ApiRequestError && err.statusCode === 404) return []\n throw err\n }\n}\n\nasync function fetchStatusPages(client: ApiClient): Promise<RemoteStatusPage[]> {\n try {\n return await fetchAllPages<RemoteStatusPage>(client, '/api/status-pages', 'status-pages')\n } catch (err) {\n if (err instanceof ApiRequestError && err.statusCode === 404) return []\n throw err\n }\n}\n\n// ────────────────────────────────────────────────────────────────\n// Writers — write remote resources to local files\n// ────────────────────────────────────────────────────────────────\n\n/**\n * Pull test scripts into _supercheck_/ directory.\n * Each test is saved as a {slug}.{uuid}.pw.ts or {slug}.{uuid}.k6.ts file.\n */\nfunction pullTests(tests: RemoteTest[], cwd: string, summary: PullSummary): void {\n const baseDir = resolve(cwd, '_supercheck_')\n if (!existsSync(baseDir)) {\n mkdirSync(baseDir, { recursive: true })\n }\n\n // Build a map of existing UUID → filename for rename detection.\n // When a test is renamed on the server, we replace the old file\n // (with the old slug) instead of leaving an orphan.\n const existingByUuid = new Map<string, string>()\n try {\n for (const folder of ['playwright', 'k6']) {\n const folderPath = resolve(baseDir, folder)\n if (!existsSync(folderPath)) continue\n for (const file of readdirSync(folderPath)) {\n const uuid = extractUuidFromFilename(file)\n if (uuid) existingByUuid.set(uuid, `${folder}/${file}`)\n }\n }\n } catch {\n // Directory may not exist yet — that's fine\n }\n\n for (const test of tests) {\n try {\n const testType = mapTestType(test.type)\n const relPath = testRelativePath(test.id, test.title, testType)\n const folderPath = resolve(baseDir, testTypeToFolder(testType))\n if (!existsSync(folderPath)) {\n mkdirSync(folderPath, { recursive: true })\n }\n\n let script = decodeScript(test.script)\n if (!script) {\n logger.debug(`Skipping test \"${test.title}\" — no script content`)\n summary.skipped++\n continue\n }\n\n // Inject/Update @title metadata to preserve human-readable name in local file\n // Prefer JSDoc injection if a block exists, otherwise use single-line comment\n if (/@title\\s+/.test(script)) {\n // Update existing @title (works for both // @title and * @title)\n script = script.replace(/(@title\\s+)(.+?)(\\r?\\n|\\*\\/|$)/, `$1${test.title}$3`)\n } else if (/\\/\\*\\*([\\s\\S]*?)\\*\\//.test(script)) {\n // Inject into existing JSDoc\n script = script.replace(/(\\/\\*\\*)/, `$1\\n * @title ${test.title}`)\n } else {\n // No JSDoc or existing title, prepend // @title\n script = `// @title ${test.title}\\n\\n${script}`\n }\n\n // Clean up old file if UUID exists but filename changed (e.g., test renamed)\n const existingFilename = existingByUuid.get(test.id)\n const currentFile = relPath.replace(/^_supercheck_\\//, '')\n if (existingFilename && existingFilename !== currentFile) {\n const oldPath = resolve(baseDir, existingFilename)\n try {\n unlinkSync(oldPath)\n logger.debug(` Renamed: ${existingFilename} → ${currentFile}`)\n } catch {\n // Old file may have been manually deleted — ignore\n }\n }\n\n const filePath = resolve(cwd, relPath)\n const written = writeIfChanged(filePath, script)\n\n if (written) {\n logger.info(pc.green(` + ${relPath}`))\n summary.tests++\n } else {\n logger.debug(` = ${relPath} (unchanged)`)\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n summary.errors.push(`test \"${test.title}\": ${msg}`)\n }\n }\n}\n\n/**\n * Build monitor definitions from remote data.\n * Produces a clean config by removing defaults and runtime-only fields\n * while keeping field names compatible with the API for round-trip support.\n */\nfunction buildMonitorDefinitions(\n monitors: RemoteMonitor[],\n): Record<string, unknown>[] {\n return monitors.map((m) => {\n const def: Record<string, unknown> = {\n id: m.id,\n name: m.name,\n type: m.type,\n }\n\n if (m.description) def.description = m.description\n if (m.target) def.target = m.target\n if (m.frequencyMinutes !== undefined) def.frequencyMinutes = m.frequencyMinutes\n if (m.enabled !== undefined) def.enabled = m.enabled\n\n // Pass config through, stripping only runtime/default noise\n if (m.config && typeof m.config === 'object') {\n const config = { ...m.config } as Record<string, unknown>\n\n // Remove runtime-only fields\n delete config.sslLastCheckedAt\n delete config.aggregatedAlertState\n\n // Clean up default playwrightOptions (retries:0, timeout:300000, headless:true)\n if (config.playwrightOptions && typeof config.playwrightOptions === 'object') {\n const opts = { ...(config.playwrightOptions as Record<string, unknown>) }\n if (opts.retries === 0) delete opts.retries\n if (opts.timeout === 300000) delete opts.timeout\n if (opts.headless === true) delete opts.headless\n config.playwrightOptions = Object.keys(opts).length > 0 ? opts : undefined\n if (!config.playwrightOptions) delete config.playwrightOptions\n }\n\n // Clean up locationConfig: remove defaults, drop if empty/disabled\n if (config.locationConfig && typeof config.locationConfig === 'object') {\n const loc = { ...(config.locationConfig as Record<string, unknown>) }\n const hasLocations = Array.isArray(loc.locations) && (loc.locations as string[]).length > 0\n if (!loc.enabled || !hasLocations) {\n // Disabled or no locations — remove entirely\n delete config.locationConfig\n } else {\n // Remove default values to reduce noise\n if (loc.enabled === true) delete loc.enabled\n if (loc.strategy === 'majority') delete loc.strategy\n if (loc.threshold === 50) delete loc.threshold\n config.locationConfig = Object.keys(loc).length > 0 ? loc : undefined\n if (!config.locationConfig) delete config.locationConfig\n }\n }\n\n if (Object.keys(config).length > 0) def.config = config\n }\n\n // Pass alertConfig through, stripping only defaults\n if (m.alertConfig && typeof m.alertConfig === 'object') {\n const alert = { ...m.alertConfig } as Record<string, unknown>\n\n // Remove empty/default values\n if (alert.customMessage === '' || alert.customMessage === null) delete alert.customMessage\n if (alert.failureThreshold === 1) delete alert.failureThreshold\n if (alert.recoveryThreshold === 1) delete alert.recoveryThreshold\n\n // Remove false boolean flags (they're defaults)\n for (const key of ['alertOnFailure', 'alertOnRecovery', 'alertOnSslExpiration', 'alertOnSuccess', 'alertOnTimeout']) {\n if (alert[key] === false) delete alert[key]\n }\n\n // Remove empty notificationProviders array\n if (Array.isArray(alert.notificationProviders) && (alert.notificationProviders as string[]).length === 0) {\n delete alert.notificationProviders\n }\n\n if (Object.keys(alert).length > 0) def.alertConfig = alert\n }\n\n return def\n })\n}\n\n/**\n * Build job definitions from remote data.\n * testMap resolves test UUIDs to file paths for human-readable references.\n * Omits runtime state (status) and cleans up alertConfig defaults.\n */\nfunction buildJobDefinitions(\n jobs: RemoteJob[],\n testMap: Map<string, string>,\n): Record<string, unknown>[] {\n return jobs.map((j) => {\n const def: Record<string, unknown> = {\n id: j.id,\n name: j.name,\n tests: (j.tests ?? []).map((t) => {\n // Resolve test UUID to file path if available, otherwise keep UUID\n return testMap.get(t.id) ?? t.id\n }),\n }\n\n if (j.description) def.description = j.description\n if (j.jobType) def.jobType = j.jobType\n if (j.cronSchedule) def.cronSchedule = j.cronSchedule\n // Note: `status` is intentionally omitted — it's runtime state, not config\n\n // Pass alertConfig through, stripping only defaults\n if (j.alertConfig && typeof j.alertConfig === 'object') {\n const alert = { ...j.alertConfig } as Record<string, unknown>\n\n // Remove empty/default values\n if (alert.customMessage === '' || alert.customMessage === null) delete alert.customMessage\n if (alert.failureThreshold === 1) delete alert.failureThreshold\n if (alert.recoveryThreshold === 1) delete alert.recoveryThreshold\n\n // Remove false boolean flags (they're defaults)\n for (const key of ['alertOnFailure', 'alertOnRecovery', 'alertOnSslExpiration', 'alertOnSuccess', 'alertOnTimeout']) {\n if (alert[key] === false) delete alert[key]\n }\n\n // Remove empty notificationProviders array\n if (Array.isArray(alert.notificationProviders) && (alert.notificationProviders as string[]).length === 0) {\n delete alert.notificationProviders\n }\n\n if (Object.keys(alert).length > 0) def.alertConfig = alert\n }\n\n return def\n })\n}\n\n/**\n * Build variable definitions from remote data.\n * Secret values are never written to config.\n */\nfunction buildVariableDefinitions(variables: RemoteVariable[]): Record<string, unknown>[] {\n return variables.map((v) => {\n const def: Record<string, unknown> = {\n id: v.id,\n key: v.key,\n isSecret: v.isSecret,\n }\n\n if (v.description) def.description = v.description\n\n if (v.isSecret) {\n // SECURITY: Never write secret values to config files.\n // Use environment variables or `supercheck var set` for secret values.\n const envVarName = v.key.toUpperCase()\n // Use bracket notation for names that aren't valid JS identifiers\n // (e.g. keys containing dashes, dots, spaces, or starting with digits)\n const isValidIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(envVarName)\n def.value = isValidIdentifier\n ? `\\${${envVarName}}`\n : `\\${[${envVarName}]}`\n } else {\n def.value = v.value ?? ''\n }\n\n return def\n })\n}\n\n/**\n * Build tag definitions from remote data.\n */\nfunction buildTagDefinitions(tags: RemoteTag[]): Record<string, unknown>[] {\n return tags.map((t) => {\n const def: Record<string, unknown> = {\n id: t.id,\n name: t.name,\n }\n if (t.color) def.color = t.color\n return def\n })\n}\n\n/**\n * Build status page definitions from remote data.\n * Keeps essential config only — branding and styling are managed via the dashboard.\n */\nfunction buildStatusPageDefinitions(pages: RemoteStatusPage[]): Record<string, unknown>[] {\n return pages.map((p) => {\n const def: Record<string, unknown> = {\n id: p.id,\n name: p.name,\n }\n\n if (p.subdomain) def.subdomain = p.subdomain\n if (p.status) def.status = p.status\n if (p.pageDescription) def.description = p.pageDescription\n if (p.headline) def.headline = p.headline\n if (p.supportUrl) def.supportUrl = p.supportUrl\n\n // Note: branding (colors, fonts) is intentionally omitted —\n // visual customization is better managed via the dashboard.\n\n return def\n })\n}\n\n// ────────────────────────────────────────────────────────────────\n// Config generator\n// ────────────────────────────────────────────────────────────────\n\n/**\n * Generate a supercheck.config.ts file from pulled remote resources.\n */\nfunction generateConfigContent(opts: {\n orgId: string\n projectId: string\n baseUrl: string\n monitors: Record<string, unknown>[]\n jobs: Record<string, unknown>[]\n variables: Record<string, unknown>[]\n tags: Record<string, unknown>[]\n statusPages: Record<string, unknown>[]\n}): string {\n const parts: string[] = []\n\n parts.push(`import { defineConfig } from '@supercheck/cli'`)\n parts.push('')\n parts.push('export default defineConfig({')\n parts.push(` schemaVersion: '1.0',`)\n parts.push('')\n\n // Project\n parts.push(' // Project identifiers — found in Dashboard > Project Settings')\n parts.push(' project: {')\n parts.push(` organization: '${opts.orgId}',`)\n parts.push(` project: '${opts.projectId}',`)\n parts.push(' },')\n parts.push('')\n\n // API\n parts.push(' // API connection — set SUPERCHECK_URL env var for self-hosted or staging')\n parts.push(' api: {')\n parts.push(` baseUrl: process.env.SUPERCHECK_URL ?? '${opts.baseUrl}',`)\n parts.push(' },')\n parts.push('')\n\n // Tests\n parts.push(' // Test file patterns — Playwright (.pw.ts) and k6 (.k6.ts) scripts')\n parts.push(' tests: {')\n parts.push(' playwright: {')\n parts.push(` testMatch: '_supercheck_/playwright/**/*.pw.ts',`)\n parts.push(' },')\n parts.push(' k6: {')\n parts.push(` testMatch: '_supercheck_/k6/**/*.k6.ts',`)\n parts.push(' },')\n parts.push(' },')\n\n // Monitors\n if (opts.monitors.length > 0) {\n parts.push('')\n parts.push(' // Monitors — uptime checks, HTTP requests, synthetic tests')\n parts.push(` monitors: ${formatArray(opts.monitors, 2)},`)\n }\n\n // Jobs\n if (opts.jobs.length > 0) {\n parts.push('')\n parts.push(' // Jobs — scheduled or triggered test execution groups')\n parts.push(` jobs: ${formatArray(opts.jobs, 2)},`)\n }\n\n // Variables\n if (opts.variables.length > 0) {\n parts.push('')\n parts.push(' // Variables — key-value pairs available to tests at runtime')\n parts.push(' // Secret values use process.env references — set them in your shell or CI/CD')\n parts.push(` variables: ${formatArray(opts.variables, 2)},`)\n }\n\n // Tags\n if (opts.tags.length > 0) {\n parts.push('')\n parts.push(' // Tags — labels for organizing tests, monitors, and jobs')\n parts.push(` tags: ${formatArray(opts.tags, 2)},`)\n }\n\n // Status Pages\n if (opts.statusPages.length > 0) {\n parts.push('')\n parts.push(' // Status Pages — public dashboards showing monitor health')\n parts.push(` statusPages: ${formatArray(opts.statusPages, 2)},`)\n }\n\n parts.push('})')\n parts.push('')\n\n // Footer comment with getting started guide and CLI commands\n parts.push('/**')\n parts.push(' * Supercheck — Getting Started')\n parts.push(' * ────────────────────────────────────────────────────────────────')\n parts.push(' *')\n parts.push(' * This file was generated by `supercheck pull`. It is the source of truth')\n parts.push(' * for your Supercheck project configuration.')\n parts.push(' *')\n parts.push(' * Getting Started:')\n parts.push(' * 1. Install dependencies:')\n parts.push(' * npm install -D @supercheck/cli typescript @types/node')\n parts.push(' * # If using Playwright tests, also install:')\n parts.push(' * npm install -D @playwright/test')\n parts.push(' * # If using k6 tests, also install types and k6 runtime:')\n parts.push(' * npm install -D @types/k6')\n parts.push(' * # Install k6 runtime: https://grafana.com/docs/k6/latest/set-up/install-k6/')\n parts.push(' *')\n parts.push(' * 2. Review the configuration above and make any changes you need.')\n parts.push(' * 3. Preview what will change: npx supercheck diff')\n parts.push(' * 4. Deploy your changes: npx supercheck deploy')\n parts.push(' * 5. Re-sync from cloud: npx supercheck pull')\n parts.push(' *')\n parts.push(' * CLI Commands:')\n parts.push(' * supercheck pull Pull remote config & test scripts to local')\n parts.push(' * supercheck diff Compare local config vs remote')\n parts.push(' * supercheck deploy Deploy local config to the cloud')\n parts.push(' * supercheck destroy Remove all managed resources from the cloud')\n parts.push(' *')\n parts.push(' * supercheck test list List all tests')\n parts.push(' * supercheck test validate Validate a local test script')\n parts.push(' * supercheck test run --local Run local test scripts')\n parts.push(' *')\n parts.push(' * supercheck monitor list List all monitors')\n parts.push(' * supercheck job list List all jobs')\n parts.push(' * supercheck job run --id <id> Run a job immediately')\n parts.push(' *')\n parts.push(' * supercheck config validate Validate this config file')\n parts.push(' * supercheck health Check API connectivity')\n parts.push(' * supercheck whoami Show current authentication info')\n parts.push(' *')\n parts.push(' * CI/CD Integration:')\n parts.push(' * Set the SUPERCHECK_TOKEN environment variable in your CI/CD pipeline')\n parts.push(' * and run `supercheck deploy` to push changes automatically.')\n parts.push(' *')\n parts.push(` * Documentation: https://supercheck.io/docs/app/welcome`)\n parts.push(' */')\n parts.push('')\n\n return parts.join('\\n')\n}\n\n/**\n * Format an array of objects as indented TypeScript-like syntax.\n */\nfunction formatArray(arr: Record<string, unknown>[], baseIndent: number): string {\n const indent = ' '.repeat(baseIndent)\n const innerIndent = ' '.repeat(baseIndent + 1)\n\n if (arr.length === 0) return '[]'\n\n const items = arr.map((obj) => {\n const fields = Object.entries(obj)\n .map(([key, value]) => `${innerIndent} ${key}: ${formatValue(value, baseIndent + 2)},`)\n .join('\\n')\n return `${innerIndent}{\\n${fields}\\n${innerIndent}}`\n })\n\n return `[\\n${items.join(',\\n')}\\n${indent}]`\n}\n\n/**\n * Format a value for TypeScript source output.\n * Produces clean, readable TS syntax (not JSON.stringify).\n */\nfunction formatValue(value: unknown, indent = 0): string {\n if (typeof value === 'string') {\n // Check if it's an env var reference like ${VAR_NAME} or ${[VAR-NAME]}\n if (value.startsWith('${') && value.endsWith('}')) {\n const inner = value.slice(2, -1)\n // Bracket-notation reference: ${[VAR-NAME]} → process.env['VAR-NAME']\n if (inner.startsWith('[') && inner.endsWith(']')) {\n const varName = inner.slice(1, -1)\n return `process.env['${varName.replace(/'/g, \"\\\\'\")}'] ?? ''`\n }\n return `process.env.${inner} ?? ''`\n }\n return `'${value.replace(/'/g, \"\\\\'\")}'`\n }\n if (typeof value === 'number' || typeof value === 'boolean') return String(value)\n if (value === null || value === undefined) return 'undefined'\n if (Array.isArray(value)) {\n if (value.length === 0) return '[]'\n if (value.every((v) => typeof v === 'string')) {\n return `[${value.map((v) => `'${String(v).replace(/'/g, \"\\\\'\")}'`).join(', ')}]`\n }\n // Array of objects or mixed\n const innerIndent = ' '.repeat(indent + 1)\n const items = value.map((v) => `${innerIndent}${formatValue(v, indent + 1)}`)\n return `[\\n${items.join(',\\n')}\\n${' '.repeat(indent)}]`\n }\n if (typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n if (entries.length === 0) return '{}'\n const innerIndent = ' '.repeat(indent + 1)\n const fields = entries\n .map(([key, v]) => `${innerIndent}${key}: ${formatValue(v, indent + 1)}`)\n .join(',\\n')\n return `{\\n${fields},\\n${' '.repeat(indent)}}`\n }\n return String(value)\n}\n\n// ────────────────────────────────────────────────────────────────\n// Pull Command\n// ────────────────────────────────────────────────────────────────\n\nexport const pullCommand = new Command('pull')\n .description('Pull tests, monitors, jobs, status pages, and config from the Supercheck cloud into the local project')\n .option('--config <path>', 'Path to config file')\n .option('--force', 'Overwrite existing local files without prompting')\n .option('--tests-only', 'Only pull test scripts')\n .option('--config-only', 'Only pull config (monitors, jobs, variables, tags, status pages)')\n .option('--dry-run', 'Show what would be pulled without writing files')\n .action(async (options: {\n config?: string\n force?: boolean\n testsOnly?: boolean\n configOnly?: boolean\n dryRun?: boolean\n }) => {\n // Validate mutually exclusive flags\n if (options.testsOnly && options.configOnly) {\n throw new CLIError(\n '--tests-only and --config-only are mutually exclusive. Use one or neither.',\n ExitCode.ConfigError,\n )\n }\n\n const cwd = process.cwd()\n\n // Try loading existing config for baseUrl context\n const existing = await tryLoadConfig({ cwd, configPath: options.config })\n\n const client = createAuthenticatedClient(existing?.config?.api?.baseUrl)\n\n logger.newline()\n logger.header('Pulling from Supercheck cloud...')\n logger.newline()\n\n // ── Fetch project/org context and all remote resources in parallel ──\n const [context, tests, monitors, jobs, variables, tags, statusPages] = await withSpinner(\n 'Fetching remote resources...',\n async () => {\n const results = await Promise.all([\n fetchContext(client),\n options.configOnly ? Promise.resolve([]) : fetchTests(client),\n options.testsOnly ? Promise.resolve([]) : fetchMonitors(client),\n options.testsOnly ? Promise.resolve([]) : fetchJobs(client),\n options.testsOnly ? Promise.resolve([]) : fetchVariables(client),\n options.testsOnly ? Promise.resolve([]) : fetchTags(client),\n options.testsOnly ? Promise.resolve([]) : fetchStatusPages(client),\n ])\n return results as [RemoteContext | null, RemoteTest[], RemoteMonitor[], RemoteJob[], RemoteVariable[], RemoteTag[], RemoteStatusPage[]]\n },\n { successText: 'Fetched remote resources' },\n )\n\n logger.debug(`Found: ${tests.length} tests, ${monitors.length} monitors, ${jobs.length} jobs, ${variables.length} variables, ${tags.length} tags, ${statusPages.length} status pages`)\n\n const totalResources = tests.length + monitors.length + jobs.length + variables.length + tags.length + statusPages.length\n if (totalResources === 0) {\n logger.warn('No resources found on the remote project.')\n logger.info('Hint: Create tests and monitors in the Supercheck dashboard, then run `supercheck pull` again.')\n return\n }\n\n // ── Dry run summary ──\n if (options.dryRun) {\n logger.newline()\n logger.header('Resources that would be pulled:')\n logger.newline()\n\n if (tests.length > 0) {\n logger.info(pc.cyan(` Tests (${tests.length}):`))\n for (const t of tests) {\n const testType = mapTestType(t.type)\n logger.info(` ${t.title} (${testType})`)\n }\n }\n if (monitors.length > 0) {\n logger.info(pc.cyan(` Monitors (${monitors.length}):`))\n for (const m of monitors) logger.info(` ${m.name} (${m.type}, every ${m.frequencyMinutes ?? '?'}min)`)\n }\n if (jobs.length > 0) {\n logger.info(pc.cyan(` Jobs (${jobs.length}):`))\n for (const j of jobs) logger.info(` ${j.name}${j.cronSchedule ? ` (${j.cronSchedule})` : ''}`)\n }\n if (variables.length > 0) {\n logger.info(pc.cyan(` Variables (${variables.length}):`))\n for (const v of variables) logger.info(` ${v.key}${v.isSecret ? ' (secret)' : ''}`)\n }\n if (tags.length > 0) {\n logger.info(pc.cyan(` Tags (${tags.length}):`))\n for (const t of tags) logger.info(` ${t.name}`)\n }\n if (statusPages.length > 0) {\n logger.info(pc.cyan(` Status Pages (${statusPages.length}):`))\n for (const sp of statusPages) logger.info(` ${sp.name} (${sp.status ?? 'draft'})`)\n }\n\n logger.newline()\n logger.info(pc.yellow('Dry run — no files written.'))\n logger.newline()\n return\n }\n\n // ── Confirm if not --force ──\n if (!options.force) {\n logger.info(`Found ${pc.bold(String(totalResources))} resources to pull.`)\n logger.info('This will write test scripts and update supercheck.config.ts.')\n logger.newline()\n\n const { confirmPrompt } = await import('../utils/prompt.js')\n const confirmed = await confirmPrompt('Continue?', { default: true })\n if (!confirmed) {\n logger.info('Pull aborted.')\n return\n }\n logger.newline()\n }\n\n const summary: PullSummary = {\n tests: 0,\n monitors: 0,\n jobs: 0,\n variables: 0,\n tags: 0,\n statusPages: 0,\n skipped: 0,\n errors: [],\n }\n\n // ── Pull test scripts ──\n if (!options.configOnly && tests.length > 0) {\n logger.header('Tests:')\n\n // For tests that need full script content, fetch individually\n // (list endpoint may not include script)\n const fullTests: RemoteTest[] = []\n for (const t of tests) {\n if (t.script) {\n fullTests.push(t)\n } else {\n // Fetch individual test to get the script\n try {\n const { data } = await withSpinner(\n `Fetching script for \"${t.title}\"`,\n () => client.get<RemoteTest>(\n `/api/tests/${t.id}`,\n { includeScript: 'true' },\n ),\n )\n fullTests.push(data)\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err)\n logger.warn(` Could not fetch script for \"${t.title}\": ${msg}`)\n summary.errors.push(`test \"${t.title}\": ${msg}`)\n }\n }\n }\n\n pullTests(fullTests, cwd, summary)\n logger.newline()\n }\n\n // ── Install dependencies if package.json is missing ──\n const pkgPath = resolve(cwd, 'package.json')\n if (!options.dryRun && !existsSync(pkgPath)) {\n logger.newline()\n logger.info('Initializing project dependencies...')\n \n const pm = detectPackageManager(cwd)\n ensurePackageJson(cwd)\n \n const packages = ['@supercheck/cli', 'typescript', '@types/node']\n \n // Auto-detect required test packages\n const hasPlaywright = tests.some(t => mapTestType(t.type) === 'playwright')\n const hasK6 = tests.some(t => mapTestType(t.type) === 'k6')\n \n if (hasPlaywright) packages.push('@playwright/test')\n if (hasK6) packages.push('@types/k6')\n \n await installDependencies(cwd, pm, {\n packages,\n skipInstall: false, \n })\n \n // Write tsconfig.supercheck.json for IDE IntelliSense if not present\n const tsconfigPath = resolve(cwd, 'tsconfig.supercheck.json')\n if (!existsSync(tsconfigPath)) {\n const tsconfigContent = JSON.stringify({\n compilerOptions: {\n target: 'ES2022',\n module: 'ESNext',\n moduleResolution: 'bundler',\n esModuleInterop: true,\n strict: true,\n skipLibCheck: true,\n resolveJsonModule: true,\n isolatedModules: true,\n noEmit: true,\n types: ['node', ...(hasK6 ? ['k6'] : [])],\n },\n include: [\n 'supercheck.config.ts',\n 'supercheck.config.local.ts',\n '_supercheck_/**/*.ts',\n ],\n }, null, 2) + '\\n'\n writeFileSync(tsconfigPath, tsconfigContent, 'utf-8')\n logger.success('Created tsconfig.supercheck.json (IDE IntelliSense)')\n }\n\n logger.success('Project initialized with dependencies')\n }\n\n // ── Build config from remote resources ──\n if (!options.testsOnly) {\n // Build a test ID -> file path map for job test references\n const testMap = new Map<string, string>()\n for (const t of tests) {\n const testType = mapTestType(t.type)\n const filePath = testRelativePath(t.id, t.title, testType)\n testMap.set(t.id, filePath)\n }\n\n const monitorDefs = buildMonitorDefinitions(monitors)\n const jobDefs = buildJobDefinitions(jobs, testMap)\n const variableDefs = buildVariableDefinitions(variables)\n const tagDefs = buildTagDefinitions(tags)\n const statusPageDefs = buildStatusPageDefinitions(statusPages)\n\n summary.monitors = monitors.length\n summary.jobs = jobs.length\n summary.variables = variables.length\n summary.tags = tags.length\n summary.statusPages = statusPages.length\n\n // Resolve org/project identity — prefer context API, fall back to resource data.\n // Skip 'unknown-*' from previous broken pulls to avoid self-reinforcing fallback.\n const existingOrg = existing?.config?.project?.organization\n const existingProject = existing?.config?.project?.project\n const firstMonitor = monitors[0]\n const orgId = context?.organization?.id\n ?? firstMonitor?.organizationId\n ?? getStoredOrganization()\n ?? (existingOrg && !existingOrg.startsWith('unknown') ? existingOrg : null)\n ?? 'unknown-org'\n const projectId = context?.project?.id\n ?? firstMonitor?.projectId\n ?? getStoredProject()\n ?? (existingProject && !existingProject.startsWith('unknown') ? existingProject : null)\n ?? 'unknown-project'\n const baseUrl = existing?.config?.api?.baseUrl\n ?? getStoredBaseUrl()\n ?? 'https://app.supercheck.io'\n\n const configContent = generateConfigContent({\n orgId,\n projectId,\n baseUrl,\n monitors: monitorDefs,\n jobs: jobDefs,\n variables: variableDefs,\n tags: tagDefs,\n statusPages: statusPageDefs,\n })\n\n const configPath = resolve(cwd, 'supercheck.config.ts')\n const configChanged = writeIfChanged(configPath, configContent)\n\n if (configChanged) {\n logger.header('Config:')\n if (monitorDefs.length > 0) logger.info(pc.green(` + ${monitorDefs.length} monitor(s)`))\n if (jobDefs.length > 0) logger.info(pc.green(` + ${jobDefs.length} job(s)`))\n if (variableDefs.length > 0) logger.info(pc.green(` + ${variableDefs.length} variable(s)`))\n if (tagDefs.length > 0) logger.info(pc.green(` + ${tagDefs.length} tag(s)`))\n if (statusPageDefs.length > 0) logger.info(pc.green(` + ${statusPageDefs.length} status page(s)`))\n logger.success('Updated supercheck.config.ts')\n } else {\n logger.info('supercheck.config.ts is already up to date')\n }\n }\n\n // ── Summary ──\n logger.newline()\n\n const totalWritten = summary.tests + summary.monitors + summary.jobs + summary.variables + summary.tags + summary.statusPages\n const totalErrors = summary.errors.length\n\n if (totalErrors > 0) {\n logger.header('Errors:')\n for (const err of summary.errors) {\n logger.error(` ${err}`)\n }\n logger.newline()\n }\n\n if (totalWritten === 0 && summary.skipped === 0 && totalErrors === 0) {\n logger.success('Everything is already in sync.')\n } else {\n const resultParts: string[] = []\n if (summary.tests > 0) resultParts.push(`${summary.tests} test(s)`)\n if (summary.monitors > 0) resultParts.push(`${summary.monitors} monitor(s)`)\n if (summary.jobs > 0) resultParts.push(`${summary.jobs} job(s)`)\n if (summary.variables > 0) resultParts.push(`${summary.variables} variable(s)`)\n if (summary.tags > 0) resultParts.push(`${summary.tags} tag(s)`)\n if (summary.statusPages > 0) resultParts.push(`${summary.statusPages} status page(s)`)\n if (summary.skipped > 0) resultParts.push(`${summary.skipped} skipped`)\n\n if (resultParts.length > 0) {\n logger.success(`Pull complete: ${resultParts.join(', ')}`)\n }\n }\n\n logger.newline()\n logger.info('Next steps:')\n logger.info(' 1. Install dependencies: npm install -D @supercheck/cli typescript')\n logger.info(' 2. Preview changes: npx supercheck diff')\n logger.info(' 3. Deploy changes: npx supercheck deploy')\n logger.newline()\n logger.info('Tip: Review the changes, then commit to version control.')\n logger.newline()\n })\n","import { Command } from 'commander'\nimport pc from 'picocolors'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { loadConfig } from '../config/loader.js'\nimport { buildLocalResources } from '../utils/resources.js'\nimport { normalizeTestTypeForApi, validateScripts, validateScriptTypeMatch } from '../utils/validation.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { logger } from '../utils/logger.js'\nimport { withSpinner } from '../utils/spinner.js'\n\nexport const validateCommand = new Command('validate')\n .description('Validate local test scripts against Supercheck rules')\n .option('--config <path>', 'Path to config file')\n .action(async (options: { config?: string }) => {\n const cwd = process.cwd()\n const { config } = await loadConfig({ cwd, configPath: options.config })\n const client = createAuthenticatedClient()\n\n const localResources = buildLocalResources(config, cwd)\n const tests = localResources.filter((r) => r.type === 'test')\n\n if (tests.length === 0) {\n logger.warn('No local tests found to validate.')\n return\n }\n\n // Pre-flight: fast client-side script-type mismatch detection\n let preflightFailed = false\n for (const test of tests) {\n const script = String(test.definition?.script ?? '')\n const declaredType = normalizeTestTypeForApi(test.definition?.testType)\n const mismatch = validateScriptTypeMatch(script, declaredType)\n if (mismatch) {\n logger.error(`${pc.red('✗')} ${test.name}: ${mismatch}`)\n preflightFailed = true\n }\n }\n if (preflightFailed) {\n throw new CLIError('Script-type mismatch detected. Fix the test type or script content before validating.', ExitCode.ConfigError)\n }\n\n const inputs = tests.map((test) => ({\n name: test.name,\n script: String(test.definition?.script ?? ''),\n testType: normalizeTestTypeForApi(test.definition?.testType),\n }))\n\n const results = await withSpinner('Validating test scripts...', async () => {\n return validateScripts(client, inputs)\n }, { successText: 'Validation complete' })\n\n logger.newline()\n logger.header('Validation Results')\n logger.newline()\n\n let failed = 0\n for (const result of results) {\n if (result.valid) {\n logger.info(pc.green(` ✓ ${result.name}`))\n if (result.warnings && result.warnings.length > 0) {\n logger.info(pc.yellow(` Warnings: ${result.warnings.join(', ')}`))\n }\n } else {\n failed++\n logger.info(pc.red(` ✗ ${result.name}`))\n logger.info(pc.gray(` ${result.error ?? 'Validation failed'}`))\n }\n }\n\n logger.newline()\n\n if (failed > 0) {\n throw new CLIError(`Validation failed for ${failed} test(s).`, ExitCode.ConfigError)\n }\n\n logger.success('All tests passed validation.')\n })","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { logger } from '../utils/logger.js'\nimport { output, outputDetail } from '../output/formatter.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { withSpinner } from '../utils/spinner.js'\n\nexport const notificationCommand = new Command('notification')\n .alias('notifications')\n .description('Manage notification providers')\n\nnotificationCommand\n .command('list')\n .description('List notification providers')\n .action(async () => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching notification providers',\n () => client.get<Record<string, unknown>[]>('/api/notification-providers'),\n )\n\n output(data, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'name', header: 'Name' },\n { key: 'type', header: 'Type' },\n { key: 'enabled', header: 'Enabled' },\n { key: 'lastUsed', header: 'Last Used' },\n ],\n })\n })\n\nnotificationCommand\n .command('get <id>')\n .description('Get notification provider details')\n .action(async (id: string) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching provider details',\n () => client.get<Record<string, unknown>>(`/api/notification-providers/${id}`),\n )\n outputDetail(data)\n })\n\nnotificationCommand\n .command('create')\n .description('Create a notification provider')\n .requiredOption('--type <type>', 'Provider type (email, slack, webhook, telegram, discord, teams)')\n .requiredOption('--name <name>', 'Provider name')\n .option('--config <json>', 'Provider config as JSON string')\n .action(async (options: { type: string; name: string; config?: string }) => {\n const validTypes = ['email', 'slack', 'webhook', 'telegram', 'discord', 'teams']\n if (!validTypes.includes(options.type)) {\n throw new CLIError(\n `Invalid provider type. Must be one of: ${validTypes.join(', ')}`,\n ExitCode.GeneralError,\n )\n }\n\n let config: Record<string, unknown> = {}\n if (options.config) {\n try {\n config = JSON.parse(options.config)\n } catch {\n throw new CLIError('Invalid JSON in --config', ExitCode.GeneralError)\n }\n }\n\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Creating notification provider',\n () => client.post<Record<string, unknown>>('/api/notification-providers', {\n name: options.name,\n type: options.type,\n config: { name: options.name, ...config },\n }),\n )\n\n logger.success(`Notification provider \"${options.name}\" created (${data.id})`)\n outputDetail(data)\n })\n\nnotificationCommand\n .command('update <id>')\n .description('Update a notification provider')\n .option('--name <name>', 'Provider name')\n .option('--type <type>', 'Provider type')\n .option('--config <json>', 'Provider config as JSON string (replaces entire config — include all fields)')\n .action(async (id: string, options: { name?: string; type?: string; config?: string }) => {\n const client = createAuthenticatedClient()\n\n if (!options.name && !options.type && !options.config) {\n logger.warn('No fields to update. Use --name, --type, or --config.')\n return\n }\n\n // Fetch existing provider for name/type fallback\n // SECURITY: The GET response returns sanitized/masked config.\n // We must NOT merge user-provided config with the masked config,\n // as that would overwrite real credentials with masked placeholders.\n const { data: existing } = await withSpinner(\n 'Fetching existing provider',\n () => client.get<Record<string, unknown>>(`/api/notification-providers/${id}`),\n )\n\n const maskedFields = (existing.maskedFields as string[] | undefined) ?? []\n\n const updatedName = options.name ?? String(existing.name ?? '')\n const updatedType = options.type ?? String(existing.type ?? '')\n\n // Build config for the update\n let updatedConfig: Record<string, unknown>\n if (options.config) {\n // User provided explicit config — use it directly (don't merge with masked values)\n try {\n updatedConfig = JSON.parse(options.config)\n } catch {\n throw new CLIError('Invalid JSON in --config', ExitCode.GeneralError)\n }\n } else if (maskedFields.length > 0) {\n // No config provided AND existing config has masked fields.\n // Cannot safely send the masked config back — it would overwrite real credentials.\n // Only update name/type fields via a targeted request.\n logger.debug('Skipping config field (contains masked secrets that cannot be round-tripped safely)')\n updatedConfig = undefined as unknown as Record<string, unknown>\n } else {\n // Existing config has no masked fields — safe to send it back\n updatedConfig = (existing.config as Record<string, unknown>) ?? {}\n }\n\n // Ensure config.name stays in sync with top-level name\n if (updatedConfig) {\n updatedConfig.name = updatedName\n }\n\n const body: Record<string, unknown> = {\n name: updatedName,\n type: updatedType,\n }\n\n // Only include config if we have a safe value to send\n if (updatedConfig) {\n body.config = updatedConfig\n }\n\n const { data } = await withSpinner(\n 'Updating notification provider',\n () => client.put<Record<string, unknown>>(`/api/notification-providers/${id}`, body),\n )\n logger.success(`Notification provider ${id} updated`)\n outputDetail(data)\n })\n\nnotificationCommand\n .command('delete <id>')\n .description('Delete a notification provider')\n .option('--force', 'Skip confirmation')\n .action(async (id: string, options: { force?: boolean }) => {\n if (!options.force) {\n const { confirmPrompt } = await import('../utils/prompt.js')\n const confirmed = await confirmPrompt(`Delete notification provider ${id}?`, { default: false })\n if (!confirmed) {\n logger.info('Aborted')\n return\n }\n }\n\n const client = createAuthenticatedClient()\n await withSpinner(\n 'Deleting notification provider',\n () => client.delete(`/api/notification-providers/${id}`),\n )\n logger.success(`Notification provider ${id} deleted`)\n })\n\nnotificationCommand\n .command('test')\n .description('Send a test notification to verify provider configuration')\n .requiredOption('--type <type>', 'Provider type (email, slack, webhook, telegram, discord, teams)')\n .requiredOption('--config <json>', 'Provider config as JSON string')\n .action(async (options: { type: string; config: string }) => {\n const validTypes = ['email', 'slack', 'webhook', 'telegram', 'discord', 'teams']\n if (!validTypes.includes(options.type)) {\n throw new CLIError(\n `Invalid provider type. Must be one of: ${validTypes.join(', ')}`,\n ExitCode.GeneralError,\n )\n }\n\n let config: Record<string, unknown> = {}\n try {\n config = JSON.parse(options.config)\n } catch {\n throw new CLIError('Invalid JSON in --config', ExitCode.GeneralError)\n }\n\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Sending test notification',\n () => client.post<{ success: boolean; message?: string; error?: string }>(\n '/api/notification-providers/test',\n { type: options.type, config },\n ),\n )\n\n if (data.success) {\n logger.success(data.message ?? 'Test notification sent successfully')\n } else {\n throw new CLIError(data.error ?? 'Test notification failed', ExitCode.GeneralError)\n }\n })\n","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { output } from '../output/formatter.js'\nimport { logger } from '../utils/logger.js'\nimport type { PaginatedResponse } from '../api/client.js'\nimport { withSpinner } from '../utils/spinner.js'\n\nexport const alertCommand = new Command('alert')\n .alias('alerts')\n .description('View alert history')\n\nalertCommand\n .command('history')\n .description('Get alert history')\n .option('--page <page>', 'Page number', '1')\n .option('--limit <limit>', 'Number of results per page', '50')\n .action(async (options: { page: string; limit: string }) => {\n const client = createAuthenticatedClient()\n const { data } = await withSpinner(\n 'Fetching alert history',\n () => client.get<\n PaginatedResponse<Record<string, unknown>> | Record<string, unknown>[]\n >('/api/alerts/history', { page: options.page, limit: options.limit }),\n )\n\n // Handle both flat array and paginated response\n const items = Array.isArray(data) ? data : data.data\n const pagination = Array.isArray(data) ? null : data.pagination\n\n output(items, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'targetType', header: 'Target Type' },\n { key: 'targetName', header: 'Target' },\n { key: 'type', header: 'Alert Type' },\n { key: 'status', header: 'Status' },\n { key: 'timestamp', header: 'Time' },\n ],\n })\n\n if (pagination) {\n logger.info(\n `\\nPage ${pagination.page}/${pagination.totalPages} (${pagination.total} total)`,\n )\n }\n })\n","import { Command } from 'commander'\nimport { createAuthenticatedClient } from '../api/authenticated-client.js'\nimport { logger } from '../utils/logger.js'\nimport { output } from '../output/formatter.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { withSpinner } from '../utils/spinner.js'\n\ninterface AuditResponse {\n success: boolean\n data: {\n logs: Array<{\n id: string\n action: string\n details: unknown\n createdAt: string\n user: { id: string; name: string | null; email: string | null }\n }>\n pagination: {\n currentPage: number\n totalPages: number\n totalCount: number\n limit: number\n hasNext: boolean\n hasPrev: boolean\n }\n }\n}\n\nexport const auditCommand = new Command('audit')\n .description('View audit logs (admin)')\n .option('--page <page>', 'Page number', '1')\n .option('--limit <limit>', 'Items per page', '20')\n .option('--search <query>', 'Search by action')\n .option('--action <action>', 'Filter by action type')\n .action(async (options: { page: string; limit: string; search?: string; action?: string }) => {\n const client = createAuthenticatedClient()\n\n const params: Record<string, string> = {\n page: options.page,\n limit: options.limit,\n }\n if (options.search) params.search = options.search\n if (options.action) params.action = options.action\n\n const { data } = await withSpinner(\n 'Fetching audit logs',\n () => client.get<AuditResponse>('/api/audit', params),\n )\n\n if (!data.success) {\n throw new CLIError('Failed to fetch audit logs', ExitCode.ApiError)\n }\n\n const rows = data.data.logs.map((log) => ({\n id: log.id,\n action: log.action,\n user: log.user?.email ?? log.user?.name ?? '-',\n createdAt: log.createdAt,\n }))\n\n output(rows, {\n columns: [\n { key: 'id', header: 'ID' },\n { key: 'action', header: 'Action' },\n { key: 'user', header: 'User' },\n { key: 'createdAt', header: 'Date' },\n ],\n })\n\n const { pagination } = data.data\n if (pagination) {\n logger.info(\n `\\nPage ${pagination.currentPage}/${pagination.totalPages} (${pagination.totalCount} total)`,\n )\n }\n })\n","import { Command } from 'commander'\nimport { logger } from '../utils/logger.js'\nimport { checkAllDependencies, formatDependencyReport, installPlaywrightBrowsers } from '../utils/deps.js'\nimport { output } from '../output/formatter.js'\nimport { getOutputFormat } from '../output/formatter.js'\nimport { tryLoadConfig } from '../config/loader.js'\nimport { getStoredBaseUrl, isAuthenticated } from '../auth/store.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport pc from 'picocolors'\n\nexport const doctorCommand = new Command('doctor')\n .description('Check that all dependencies and configuration are set up correctly')\n .option('--fix', 'Attempt to automatically fix missing dependencies')\n .action(async (options: { fix?: boolean }) => {\n const cwd = process.cwd()\n const format = getOutputFormat()\n\n logger.newline()\n logger.header('Supercheck Doctor')\n logger.newline()\n\n // 1. Check dependencies\n logger.info(pc.bold('Dependencies:'))\n const deps = checkAllDependencies(cwd)\n\n if (format === 'json') {\n output(deps as unknown as Record<string, unknown>[], {\n columns: [\n { key: 'name', header: 'Dependency' },\n { key: 'installed', header: 'Installed' },\n { key: 'version', header: 'Version' },\n { key: 'required', header: 'Required' },\n { key: 'installHint', header: 'Install' },\n ],\n })\n } else {\n logger.output(formatDependencyReport(deps))\n }\n\n logger.newline()\n\n // 2. Check authentication\n logger.info(pc.bold('Authentication:'))\n const hasAuth = isAuthenticated()\n if (hasAuth) {\n const baseUrl = getStoredBaseUrl() ?? 'https://app.supercheck.io'\n logger.output(` ${pc.green('✓')} Authenticated (${pc.dim(baseUrl)})`)\n } else {\n logger.output(` ${pc.yellow('○')} Not authenticated — run: supercheck login --token <token>`)\n }\n\n logger.newline()\n\n // 3. Check configuration\n logger.info(pc.bold('Configuration:'))\n const configResult = await tryLoadConfig()\n if (configResult) {\n logger.output(` ${pc.green('✓')} supercheck.config.ts found`)\n const org = configResult.config.project?.organization\n const proj = configResult.config.project?.project\n if (org && proj) {\n logger.output(` ${pc.green('✓')} Project: ${pc.dim(`${org}/${proj}`)}`)\n } else {\n logger.output(` ${pc.yellow('○')} Project org/project not configured in supercheck.config.ts`)\n }\n } else {\n logger.output(` ${pc.yellow('○')} No supercheck.config.ts — run: supercheck init`)\n }\n\n logger.newline()\n\n // 4. Auto-fix if requested\n const missingRequired = deps.filter((d) => !d.installed && d.required)\n if (options.fix && missingRequired.length > 0) {\n logger.header('Attempting to fix missing dependencies...')\n logger.newline()\n\n for (const dep of missingRequired) {\n if (dep.name === 'Playwright browsers') {\n const ok = await installPlaywrightBrowsers(cwd)\n if (ok) {\n logger.success('Playwright browsers installed')\n } else {\n logger.error(`Failed to install Playwright browsers. Run manually: ${dep.installHint}`)\n }\n } else if (dep.name === '@playwright/test') {\n logger.info(`Install @playwright/test:`)\n logger.info(` ${dep.installHint}`)\n }\n }\n logger.newline()\n }\n\n // 5. Summary\n if (missingRequired.length === 0 && hasAuth && configResult) {\n logger.success('Everything looks good! You\\'re ready to use Supercheck.')\n } else {\n const issues: string[] = []\n if (missingRequired.length > 0) {\n issues.push(`${missingRequired.length} missing required dependency(s)`)\n }\n if (!hasAuth) {\n issues.push('not authenticated')\n }\n if (!configResult) {\n issues.push('no config file')\n }\n logger.warn(`Issues found: ${issues.join(', ')}`)\n\n if (!options.fix && missingRequired.length > 0) {\n logger.info(`Run ${pc.bold('supercheck doctor --fix')} to attempt automatic fixes.`)\n }\n }\n\n logger.newline()\n\n // Exit with error code if required deps are missing\n if (missingRequired.length > 0) {\n throw new CLIError(\n `Missing ${missingRequired.length} required dependency(s). Run 'supercheck doctor --fix' or install manually.`,\n ExitCode.ConfigError,\n )\n }\n })\n","import { Command } from 'commander'\nimport { spawn } from 'node:child_process'\nimport { logger } from '../utils/logger.js'\nimport { CLIError, ExitCode } from '../utils/errors.js'\nimport { confirmPrompt } from '../utils/prompt.js'\nimport { getOutputFormat, output } from '../output/formatter.js'\nimport { withSpinner } from '../utils/spinner.js'\n\nconst PACKAGE_NAME = '@supercheck/cli'\nconst RELEASE_TARGET_PATTERN = /^(latest|v?\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?)$/\n\nfunction normalizeTag(tag: string): string {\n const trimmed = tag.trim()\n if (trimmed.startsWith('v') && trimmed.length > 1 && /\\d/.test(trimmed[1])) {\n return trimmed.slice(1)\n }\n return trimmed\n}\n\nfunction getDefaultTag(): string {\n return 'latest'\n}\n\nfunction detectPackageManager(): 'npm' | 'yarn' | 'pnpm' | 'bun' {\n const userAgent = process.env.npm_config_user_agent ?? ''\n if (userAgent.includes('pnpm')) return 'pnpm'\n if (userAgent.includes('yarn')) return 'yarn'\n if (userAgent.includes('bun')) return 'bun'\n return 'npm'\n}\n\nfunction buildInstallCommand(\n pm: 'npm' | 'yarn' | 'pnpm' | 'bun',\n pkgSpec: string,\n): { command: string; args: string[]; preview: string } {\n switch (pm) {\n case 'yarn': {\n const args = ['global', 'add', pkgSpec]\n return { command: 'yarn', args, preview: `yarn ${args.join(' ')}` }\n }\n case 'pnpm': {\n const args = ['add', '-g', pkgSpec]\n return { command: 'pnpm', args, preview: `pnpm ${args.join(' ')}` }\n }\n case 'bun': {\n const args = ['add', '-g', pkgSpec]\n return { command: 'bun', args, preview: `bun ${args.join(' ')}` }\n }\n case 'npm':\n default: {\n const args = ['install', '-g', pkgSpec]\n return { command: 'npm', args, preview: `npm ${args.join(' ')}` }\n }\n }\n}\n\nfunction runInstallCommand(command: string, args: string[]): Promise<number> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { stdio: 'inherit' })\n child.on('error', (err) => reject(err))\n child.on('close', (code) => resolve(code ?? 0))\n })\n}\n\nexport const upgradeCommand = new Command('upgrade')\n .description('Upgrade the Supercheck CLI to the latest version')\n .option('--tag <tag>', 'Release target to install (latest or explicit version)')\n .option('--package-manager <pm>', 'Package manager to use (npm, yarn, pnpm, bun)')\n .option('-y, --yes', 'Skip confirmation prompt')\n .option('--dry-run', 'Print the upgrade command without running it')\n .action(async (options: { tag?: string; packageManager?: string; yes?: boolean; dryRun?: boolean }) => {\n const format = getOutputFormat()\n const tag = normalizeTag(options.tag ?? getDefaultTag())\n\n if (!RELEASE_TARGET_PATTERN.test(tag)) {\n throw new CLIError(\n `Invalid target \"${tag}\". Use \"latest\" or an explicit version (for example 0.1.1-rc.2).`,\n ExitCode.ConfigError,\n )\n }\n\n const pm = (options.packageManager ?? detectPackageManager()) as 'npm' | 'yarn' | 'pnpm' | 'bun'\n if (!['npm', 'yarn', 'pnpm', 'bun'].includes(pm)) {\n throw new CLIError(\n `Unsupported package manager \"${pm}\". Use npm, yarn, pnpm, or bun.`,\n ExitCode.ConfigError,\n )\n }\n\n const pkgSpec = `${PACKAGE_NAME}@${tag}`\n const install = buildInstallCommand(pm, pkgSpec)\n\n if (options.dryRun) {\n const payload = {\n action: 'upgrade',\n package: PACKAGE_NAME,\n tag,\n packageManager: pm,\n command: install.preview,\n dryRun: true,\n }\n\n if (format === 'json') {\n output(payload)\n } else {\n logger.info(`Upgrade command: ${install.preview}`)\n }\n return\n }\n\n if (!options.yes) {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new CLIError(\n 'Upgrade requires confirmation. Re-run with --yes to skip the prompt.',\n ExitCode.ConfigError,\n )\n }\n\n const confirmed = await confirmPrompt(`Upgrade Supercheck CLI using ${pm}?`, { default: false })\n if (!confirmed) {\n logger.info('Upgrade cancelled.')\n return\n }\n }\n\n let code = 0\n try {\n code = await withSpinner(\n 'Upgrading Supercheck CLI...',\n () => runInstallCommand(install.command, install.args),\n )\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n throw new CLIError(`Failed to run upgrade command: ${message}`, ExitCode.GeneralError)\n }\n if (code !== 0) {\n throw new CLIError(`Upgrade failed with exit code ${code}.`, ExitCode.GeneralError)\n }\n\n if (format === 'json') {\n output({\n action: 'upgrade',\n package: PACKAGE_NAME,\n tag,\n packageManager: pm,\n command: install.preview,\n success: true,\n })\n return\n }\n\n logger.success(`Supercheck CLI upgraded (${pkgSpec}).`)\n })\n"],"mappings":"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","names":["Command","pc","resolve","pc","pc","data","Command","resolve","resolve","Command","data","Command","Command","Command","existsSync","writeFileSync","readFileSync","resolve","existsSync","resolve","basename","existsSync","resolve","basename","execSync","existsSync","resolve","pc","output","resolve","existsSync","pc","Command","resolve","existsSync","writeFileSync","readFileSync","Command","readFileSync","resolve","resolve","writeFileSync","Command","resolve","readFileSync","confirmPrompt","tests","client","Command","runCommand","Command","Command","readFileSync","resolve","Buffer","toDisplayName","resolve","readFileSync","Command","Buffer","confirmPrompt","Command","Command","confirmPrompt","Command","Command","confirmPrompt","Command","Command","confirmPrompt","Command","pc","pc","Command","Command","resolve","pc","resolve","Command","Command","pc","Command","Command","existsSync","mkdirSync","writeFileSync","readFileSync","readdirSync","resolve","dirname","pc","existsSync","readFileSync","dirname","mkdirSync","writeFileSync","resolve","readdirSync","formatValue","Command","confirmPrompt","Command","pc","Command","pc","Command","Command","confirmPrompt","Command","Command","Command","Command","Command","pc","Command","Command","spawn","detectPackageManager","resolve","spawn","Command","Command","runCommand","pc"]}