@viberaven/cli 1.1.9 → 1.1.11

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.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/config.ts", "../../../src/station/fetchUtils.ts", "../../../src/station/backendClient.ts", "../src/statusLabels.ts", "../src/account.ts", "../src/openBrowser.ts", "../src/contracts/commands.ts", "../src/auth.ts", "../../../src/station/fileScanner.ts", "../../../src/station/engines.ts", "../../../src/station/launchValidation.ts", "../../../src/station/sifgTemplates.ts", "../../../src/station/providerRegistry.ts", "../../../src/station/verificationLayer/types.ts", "../../../src/station/verificationLayer/mergeIntoMissionGraph.ts", "../../../src/station/missionGraph.ts", "../../../src/station/productionConnections.ts", "../../../src/station/providerTruth.ts", "../../../src/station/promptBuilder.ts", "../../../src/station/envEvidence.ts", "../../../src/station/repositoryEvidence.ts", "../../../src/station/scanContext.ts", "../../../src/station/sifgExtractors.ts", "../../../src/station/sifgEngine.ts", "../../../src/station/sifgPrompt.ts", "../../../src/station/promptRouting.ts", "../../../src/station/stackAutomation.ts", "../../../src/station/supabaseWiring.ts", "../../../src/station/stackWiring.ts", "../../../src/station/verification.ts", "../../../src/station/verificationLayer/shared/connection.ts", "../../../src/station/verificationLayer/shared/buildCheck.ts", "../../../src/station/verificationLayer/shared/repoSignals.ts", "../../../src/station/verificationLayer/mock/mockGitHubVerifier.ts", "../../../src/station/verificationLayer/mock/mockStripeVerifier.ts", "../../../src/station/verificationLayer/mock/mockSupabaseVerifier.ts", "../../../src/station/verificationLayer/mock/mockVercelVerifier.ts", "../../../src/station/verificationLayer/registry.ts", "../../../src/station/verificationLayer/registerDefaults.ts", "../../../src/station/verificationLayer/runVerificationLayer.ts", "../../../src/station/orchestrator.ts", "../../../src/station/stackMapProviderOptions.ts", "../src/report/hydrateArtifact.ts", "../src/runScan.ts", "../src/capabilities/classify.ts", "../src/capabilities/database.ts", "../src/capabilities/payments.ts", "../src/capabilities/scaling.ts", "../src/capabilities/security.ts", "../src/capabilities/webhooks.ts", "../src/capabilities/index.ts", "../src/contracts/contextMap.ts", "../src/contracts/gateResult.ts", "../src/contracts/gapEvidence.ts", "../../../shared/productionMapLanes.ts", "../../../shared/planLimits.ts", "../src/playbooks/checkMap.ts", "../src/playbooks/playbooksRoot.ts", "../src/playbooks/types.ts", "../src/playbooks/validate.ts", "../src/playbooks/loadPlaybook.ts", "../src/playbooks/manualChecks.ts", "../src/tui/menu.ts", "../src/resolveNextAction.ts", "../src/report/agentSummary.ts", "../src/buildTaskList.ts", "../src/report/launchPlaybook.ts", "../../../src/webview/getStationHtml.ts", "../src/report/reportHtml.ts", "../src/report/reportAssets.ts", "../src/sanitizeArtifact.ts", "../src/actions/canonical.ts", "../src/actions/derive.ts", "../src/actions/registry.ts", "../src/actions/artifacts.ts", "../src/artifacts.ts", "../src/output/json.ts", "../src/output/jsonl.ts", "../src/commands/strictGate.ts", "../src/report/refreshReport.ts", "../src/clipboard.ts", "../../../node_modules/picocolors/picocolors.js", "../src/report/missionSelection.ts", "../src/terminalSummary.ts", "../../../shared/runnerSafeFix.ts", "../src/runnerConnect.ts", "../../../node_modules/sisteransi/src/index.js", "../../../node_modules/node_modules/.pnpm/ansi-regex@6.1.0/node_modules/ansi-regex/index.js", "../../../node_modules/node_modules/.pnpm/strip-ansi@7.1.0/node_modules/strip-ansi/index.js", "../../../node_modules/node_modules/.pnpm/eastasianwidth@0.2.0/node_modules/eastasianwidth/eastasianwidth.js", "../../../node_modules/node_modules/.pnpm/emoji-regex@9.2.2/node_modules/emoji-regex/index.js", "../../../node_modules/node_modules/.pnpm/string-width@5.1.2/node_modules/string-width/index.js", "../../../node_modules/node_modules/.pnpm/ansi-styles@6.2.1/node_modules/ansi-styles/index.js", "../../../node_modules/node_modules/.pnpm/wrap-ansi@8.1.0/node_modules/wrap-ansi/index.js", "../../../node_modules/@clack/core/src/utils/settings.ts", "../../../node_modules/@clack/core/src/utils/string.ts", "../../../node_modules/@clack/core/src/utils/index.ts", "../../../node_modules/@clack/core/src/prompts/prompt.ts", "../../../node_modules/@clack/core/src/prompts/confirm.ts", "../../../node_modules/@clack/core/src/prompts/group-multiselect.ts", "../../../node_modules/@clack/core/src/prompts/multi-select.ts", "../../../node_modules/@clack/core/src/prompts/password.ts", "../../../node_modules/@clack/core/src/prompts/select.ts", "../../../node_modules/@clack/core/src/prompts/select-key.ts", "../../../node_modules/@clack/core/src/prompts/text.ts", "../../../node_modules/node_modules/.pnpm/is-unicode-supported@1.3.0/node_modules/is-unicode-supported/index.js", "../../../node_modules/@clack/prompts/src/index.ts", "../src/agentPrompt.ts", "../src/version.ts", "../src/commands/guide.ts", "../src/commands/audit.ts", "../src/commands/agentRulesBlock.ts", "../src/commands/cursorRulesPack.ts", "../src/commands/agentTargets.ts", "../src/commands/seedPackageJsonScripts.ts", "../src/commands/initRules.ts", "../src/commands/next.ts", "../src/commands/open.ts", "../src/tui/runInteractive.ts", "../src/commands/condense.ts", "../src/heal/pathSafety.ts", "../src/heal/recipes/emptyCatch.ts", "../src/heal/recipes/envAuthSecret.ts", "../src/heal/recipes/envNodeEnv.ts", "../src/heal/recipes/envDatabaseUrl.ts", "../src/heal/recipes/nextjsErrorBoundary.ts", "../src/heal/recipes/nextjsHealthRoute.ts", "../src/heal/recipes/nextjsLoadingState.ts", "../src/heal/recipes/nextjsNotFound.ts", "../src/heal/recipes/supabaseRls.ts", "../src/heal/recipes/nextjsCspHeader.ts", "../src/heal/recipes/nextjsRateLimit.ts", "../src/heal/recipes/eslintRestrictedImports.ts", "../src/heal/recipes/index.ts", "../src/heal/apply.ts", "../src/heal/plan.ts", "../src/heal/prompt.ts", "../src/loopState.ts", "../src/commands/heal.ts", "../src/stackRecommend.ts", "../src/commands/runInit.ts", "../src/commands/doctorAgents.ts", "../src/commands/runDoctor.ts", "../src/npm/popularPackages.ts", "../src/npm/validateNpmPackage.ts", "../src/commands/runValidateNpmPackage.ts", "../src/commands/runAudit.ts", "../src/actions/render.ts", "../src/commands/actions.ts", "../src/commands/verifyAction.ts", "../src/output/nextActionBlock.ts", "../src/commands/preview.ts", "../src/report/providerLogos.ts", "../src/local-ui/prompts.ts", "../src/local-ui/providerLaunchPaths.ts", "../src/local-ui/artifactAdapter.ts", "../src/local-ui/static/appClient.ts", "../src/local-ui/static/appCss.ts", "../src/local-ui/static/appHtml.ts", "../src/local-ui/server.ts", "../src/providerMcpBridge.ts", "../src/cli.ts"],
4
+ "sourcesContent": ["import { homedir } from 'node:os';\r\nimport { dirname, join, parse, resolve } from 'node:path';\r\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\r\nimport { constants } from 'node:fs';\r\nimport { access } from 'node:fs/promises';\r\n\r\n/** Same default as the shipped VS Code extension (`getBackendBaseUrl`). */\r\nexport const DEFAULT_API_BASE_URL =\r\n 'https://jaohiwzjhtwljyqligpu.supabase.co/functions/v1/viberice-api';\r\n\r\nexport interface CliCredentials {\r\n accessToken: string;\r\n apiBaseUrl: string;\r\n email?: string;\r\n plan?: string;\r\n runnerSessionId?: string;\r\n runnerAccessToken?: string;\r\n}\r\n\r\nexport interface RunnerSessionCredentials {\r\n runnerSessionId: string;\r\n runnerAccessToken: string;\r\n apiBaseUrl: string;\r\n}\r\n\r\nexport interface CliStackChoice {\r\n provider: string;\r\n selectedAt: string;\r\n}\r\n\r\nexport interface CliStackChoicesFile {\r\n version: 1;\r\n choices: Record<string, CliStackChoice>;\r\n}\r\n\r\nexport function getStackChoicesPath(cwd: string = process.cwd()): string {\r\n return join(getProjectArtifactsDir(cwd), 'stack.json');\r\n}\r\n\r\nexport function getConfigDir(): string {\r\n const override = process.env.VIBERAVEN_CONFIG_DIR?.trim();\r\n if (override) {\r\n return override;\r\n }\r\n if (process.platform === 'win32') {\r\n const appData = process.env.APPDATA?.trim();\r\n if (appData) {\r\n return join(appData, 'viberaven');\r\n }\r\n }\r\n return join(homedir(), '.config', 'viberaven');\r\n}\r\n\r\nexport function getCredentialsPath(): string {\r\n return join(getConfigDir(), 'credentials.json');\r\n}\r\n\r\nexport function getProjectArtifactsDir(cwd: string = process.cwd()): string {\r\n return join(cwd, '.viberaven');\r\n}\r\n\r\nconst LAST_SCAN_FILE = 'last-scan.json';\r\n\r\n/**\r\n * Walk up from `startDir` for `.viberaven/last-scan.json` (nearest ancestor wins).\r\n */\r\nexport async function findArtifactsWorkspace(startDir: string = process.cwd()): Promise<string | undefined> {\r\n let dir = resolve(startDir);\r\n const fsRoot = parse(dir).root;\r\n\r\n while (true) {\r\n try {\r\n await access(join(dir, '.viberaven', LAST_SCAN_FILE), constants.F_OK);\r\n return dir;\r\n } catch {\r\n // keep walking up\r\n }\r\n const parent = dirname(dir);\r\n if (parent === dir || dir === fsRoot) {\r\n return undefined;\r\n }\r\n dir = parent;\r\n }\r\n}\r\n\r\n/**\r\n * Best folder for scan/read artifacts: nearest `.viberaven` scan, else git root, else `startDir`.\r\n */\r\nexport async function resolveWorkspaceRoot(startDir: string = process.cwd()): Promise<string> {\r\n const withArtifacts = await findArtifactsWorkspace(startDir);\r\n if (withArtifacts) {\r\n return withArtifacts;\r\n }\r\n\r\n let dir = resolve(startDir);\r\n const fsRoot = parse(dir).root;\r\n\r\n while (true) {\r\n try {\r\n await access(join(dir, '.git'), constants.F_OK);\r\n return dir;\r\n } catch {\r\n // keep walking up\r\n }\r\n const parent = dirname(dir);\r\n if (parent === dir || dir === fsRoot) {\r\n return resolve(startDir);\r\n }\r\n dir = parent;\r\n }\r\n}\r\n\r\nexport async function ensureConfigDir(): Promise<string> {\r\n const dir = getConfigDir();\r\n await mkdir(dir, { recursive: true });\r\n return dir;\r\n}\r\n\r\nasync function readCredentialsFileRaw(): Promise<Partial<CliCredentials>> {\r\n try {\r\n const raw = await readFile(getCredentialsPath(), 'utf-8');\r\n return JSON.parse(raw) as Partial<CliCredentials>;\r\n } catch {\r\n return {};\r\n }\r\n}\r\n\r\nfunction normalizeApiBaseUrl(value: string | undefined): string {\r\n return (value?.trim() || DEFAULT_API_BASE_URL).replace(/\\/+$/, '');\r\n}\r\n\r\nfunction parseStoredCredentials(parsed: Partial<CliCredentials>): CliCredentials | undefined {\r\n if (typeof parsed.accessToken !== 'string' || !parsed.accessToken.trim()) {\r\n return undefined;\r\n }\r\n return {\r\n accessToken: parsed.accessToken.trim(),\r\n apiBaseUrl: normalizeApiBaseUrl(parsed.apiBaseUrl),\r\n email: typeof parsed.email === 'string' ? parsed.email : undefined,\r\n plan: typeof parsed.plan === 'string' ? parsed.plan : undefined,\r\n runnerSessionId:\r\n typeof parsed.runnerSessionId === 'string' && parsed.runnerSessionId.trim()\r\n ? parsed.runnerSessionId.trim()\r\n : undefined,\r\n runnerAccessToken:\r\n typeof parsed.runnerAccessToken === 'string' && parsed.runnerAccessToken.trim()\r\n ? parsed.runnerAccessToken.trim()\r\n : undefined\r\n };\r\n}\r\n\r\nexport async function loadRunnerSessionCredentials(): Promise<RunnerSessionCredentials | undefined> {\r\n const parsed = await readCredentialsFileRaw();\r\n const runnerSessionId =\r\n typeof parsed.runnerSessionId === 'string' ? parsed.runnerSessionId.trim() : '';\r\n const runnerAccessToken =\r\n typeof parsed.runnerAccessToken === 'string' ? parsed.runnerAccessToken.trim() : '';\r\n if (!runnerSessionId || !runnerAccessToken) {\r\n return undefined;\r\n }\r\n return {\r\n runnerSessionId,\r\n runnerAccessToken,\r\n apiBaseUrl: normalizeApiBaseUrl(parsed.apiBaseUrl)\r\n };\r\n}\r\n\r\nexport async function saveRunnerSessionCredentials(input: RunnerSessionCredentials): Promise<void> {\r\n await ensureConfigDir();\r\n const existing = await readCredentialsFileRaw();\r\n const merged: Partial<CliCredentials> = {\r\n ...existing,\r\n runnerSessionId: input.runnerSessionId,\r\n runnerAccessToken: input.runnerAccessToken,\r\n apiBaseUrl: normalizeApiBaseUrl(input.apiBaseUrl)\r\n };\r\n await writeFile(getCredentialsPath(), `${JSON.stringify(merged, null, 2)}\\n`, {\r\n mode: constants.S_IRUSR | constants.S_IWUSR\r\n });\r\n}\r\n\r\nexport async function loadCredentials(): Promise<CliCredentials | undefined> {\r\n const parsed = await readCredentialsFileRaw();\r\n const fromDisk = parseStoredCredentials(parsed);\r\n if (fromDisk) {\r\n return fromDisk;\r\n }\r\n\r\n const accessToken = process.env.VIBERAVEN_ACCESS_TOKEN?.trim();\r\n if (!accessToken) {\r\n return undefined;\r\n }\r\n return {\r\n accessToken,\r\n apiBaseUrl: resolveApiBaseUrl()\r\n };\r\n}\r\n\r\nexport async function saveCredentials(credentials: CliCredentials): Promise<void> {\r\n await ensureConfigDir();\r\n await writeFile(getCredentialsPath(), `${JSON.stringify(credentials, null, 2)}\\n`, {\r\n mode: constants.S_IRUSR | constants.S_IWUSR\r\n });\r\n}\r\n\r\nexport async function clearCredentials(): Promise<void> {\r\n try {\r\n await access(getCredentialsPath());\r\n await writeFile(getCredentialsPath(), '{}\\n');\r\n } catch {\r\n // no credentials file\r\n }\r\n}\r\n\r\nexport function resolveApiBaseUrl(flag?: string): string {\r\n const fromFlag = flag?.trim();\r\n if (fromFlag) {\r\n return fromFlag.replace(/\\/+$/, '');\r\n }\r\n const fromEnv = process.env.VIBERAVEN_API_URL?.trim() || process.env.VRAVEN_API_URL?.trim();\r\n if (fromEnv) {\r\n return fromEnv.replace(/\\/+$/, '');\r\n }\r\n return DEFAULT_API_BASE_URL;\r\n}\r\n\r\nexport async function loadStackChoicesFile(cwd: string): Promise<CliStackChoicesFile> {\r\n try {\r\n const raw = await readFile(getStackChoicesPath(cwd), 'utf-8');\r\n const parsed = JSON.parse(raw) as Partial<CliStackChoicesFile>;\r\n if (parsed && parsed.version === 1 && parsed.choices && typeof parsed.choices === 'object') {\r\n return { version: 1, choices: parsed.choices };\r\n }\r\n } catch {\r\n // optional file\r\n }\r\n return { version: 1, choices: {} };\r\n}\r\n\r\nexport async function saveStackChoicesFile(cwd: string, file: CliStackChoicesFile): Promise<void> {\r\n await mkdir(getProjectArtifactsDir(cwd), { recursive: true });\r\n await writeFile(getStackChoicesPath(cwd), `${JSON.stringify(file, null, 2)}\\n`, 'utf-8');\r\n}\r\n", "/**\r\n * True when the failure is a low-level network/transport error (no HTTP response),\r\n * e.g. ECONNREFUSED to localhost, DNS failure, or offline.\r\n */\r\nexport function isNetworkFetchFailure(error: unknown): boolean {\r\n if (error == null) {\r\n return false;\r\n }\r\n\r\n if (error instanceof TypeError) {\r\n const m = error.message;\r\n if (m === 'fetch failed' || m.toLowerCase().includes('fetch failed') || m.includes('Failed to fetch')) {\r\n return true;\r\n }\r\n }\r\n\r\n if (error instanceof AggregateError) {\r\n return error.errors.some((e) => isNetworkFetchFailure(e));\r\n }\r\n\r\n if (error instanceof Error && 'cause' in error && (error as Error & { cause?: unknown }).cause != null) {\r\n return isNetworkFetchFailure((error as Error & { cause?: unknown }).cause);\r\n }\r\n\r\n const e = error as NodeJS.ErrnoException;\r\n if (typeof e.code === 'string') {\r\n if (\r\n ['ECONNREFUSED', 'ECONNRESET', 'ENOTFOUND', 'EAI_AGAIN', 'ETIMEDOUT', 'ENETUNREACH', 'EHOSTUNREACH'].includes(\r\n e.code\r\n )\r\n ) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n", "import type { DevicePollResponse, DeviceStartResponse } from '../../shared/auth';\nimport { isNetworkFetchFailure } from './fetchUtils';\nimport type {\n ManagedStationRequest,\n ManagedStationResponse,\n ManagedStationUsage\n} from '../../shared/station';\n\nexport const MANAGED_ACCESS_TOKEN_SECRET_KEY = 'viberice.managedAccessToken';\nexport const MANAGED_SESSION_STATE_KEY = 'viberice.managedSession';\n\nexport interface ManagedAccount {\n email?: string;\n plan?: string;\n trialEndsAt?: string | null;\n}\n\nexport interface ManagedSession {\n account?: ManagedAccount;\n usage?: ManagedUsage;\n}\n\nexport type ManagedUsage = ManagedStationUsage;\n\nexport type ManagedSignInStart = DeviceStartResponse;\n\nexport type ManagedSignInPoll =\n | DevicePollResponse\n | { status: 'expired' | 'denied' };\n\nexport async function startManagedSignIn(baseUrl: string): Promise<ManagedSignInStart> {\n const payload = await postJson(`${normalizeBaseUrl(baseUrl)}/v1/auth/device/start`, undefined, {\n failurePrefix: 'Managed sign-in start'\n });\n\n if (!isManagedSignInStart(payload)) {\n throw new Error('Managed sign-in start response was invalid.');\n }\n\n return payload;\n}\n\nexport async function pollManagedSignIn(\n baseUrl: string,\n deviceCode: string\n): Promise<ManagedSignInPoll> {\n let payload: unknown;\n try {\n payload = await postJson(\n `${normalizeBaseUrl(baseUrl)}/v1/auth/device/poll`,\n { deviceCode },\n { failurePrefix: 'Managed sign-in poll' }\n );\n } catch (error) {\n if (error instanceof BackendHttpError && error.status === 410) {\n return { status: 'expired' };\n }\n\n throw error;\n }\n\n if (!isManagedSignInPoll(payload)) {\n throw new Error('Managed sign-in poll response was invalid.');\n }\n\n return payload;\n}\n\nexport async function runManagedStation(\n baseUrl: string,\n accessToken: string,\n payload: ManagedStationRequest\n): Promise<ManagedStationResponse> {\n const responsePayload = await postJson(`${normalizeBaseUrl(baseUrl)}/v1/station/run`, payload, {\n accessToken,\n failurePrefix: 'Managed station run'\n });\n\n if (!isManagedStationResponse(responsePayload)) {\n throw new Error('Managed station run response was invalid.');\n }\n\n return responsePayload;\n}\n\nasync function postJson(\n url: string,\n payload: unknown,\n options: { accessToken?: string; failurePrefix: string }\n): Promise<unknown> {\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(options.accessToken ? { Authorization: `Bearer ${options.accessToken}` } : {})\n },\n // Fastify rejects `Content-Type: application/json` with an empty body (FST_ERR_CTP_EMPTY_JSON_BODY).\n body: JSON.stringify(payload === undefined ? {} : payload)\n });\n } catch (error) {\n if (isNetworkFetchFailure(error)) {\n throw new Error(\n `Could not reach the VibeRaven backend at ${url}. Check your network, then sign in again if needed.`,\n { cause: error }\n );\n }\n throw error;\n }\n\n if (!response.ok) {\n const bodyText = await readError(response);\n let upgradeUrl: string | undefined;\n try {\n const parsed = JSON.parse(bodyText) as Record<string, unknown>;\n if (typeof parsed.upgrade_url === 'string' && parsed.upgrade_url.length > 0) {\n upgradeUrl = parsed.upgrade_url;\n }\n } catch {\n /* body may not be JSON */\n }\n throw new BackendHttpError(\n `${options.failurePrefix} failed with ${response.status}: ${bodyText}`,\n response.status,\n upgradeUrl\n );\n }\n\n return response.json();\n}\n\nasync function readError(response: Response): Promise<string> {\n try {\n const body = await response.text();\n return body.trim() || response.statusText || 'Unknown error';\n } catch {\n return response.statusText || 'Unknown error';\n }\n}\n\nexport function normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, '');\n}\n\nfunction isManagedSignInStart(value: unknown): value is ManagedSignInStart {\n return (\n isRecord(value) &&\n isNonEmptyString(value.deviceCode) &&\n isNonEmptyString(value.verificationUrl) &&\n typeof value.pollIntervalSeconds === 'number' &&\n value.pollIntervalSeconds > 0 &&\n isNonEmptyString(value.expiresAt)\n );\n}\n\nfunction isManagedSignInPoll(value: unknown): value is ManagedSignInPoll {\n if (!isRecord(value) || !isNonEmptyString(value.status)) {\n return false;\n }\n\n if (value.status === 'pending' || value.status === 'expired' || value.status === 'denied') {\n return true;\n }\n\n return (\n value.status === 'approved' &&\n isNonEmptyString(value.accessToken) &&\n isManagedAccount(value.account)\n );\n}\n\nfunction isManagedStationResponse(value: unknown): value is ManagedStationResponse {\n return (\n isRecord(value) &&\n (value.status === 'stable' || value.status === 'drifting' || value.status === 'chaos') &&\n isNonEmptyString(value.reason) &&\n isNonEmptyString(value.impact) &&\n (value.confidence === 'low' || value.confidence === 'medium' || value.confidence === 'high') &&\n typeof value.output === 'string' &&\n isManagedUsage(value.usage)\n );\n}\n\nfunction isManagedAccount(value: unknown): value is ManagedAccount {\n return (\n isRecord(value) &&\n isNonEmptyString(value.email) &&\n (value.plan === 'free' || value.plan === 'pro') &&\n (value.trialEndsAt === null || isNonEmptyString(value.trialEndsAt))\n );\n}\n\nfunction isManagedUsage(value: unknown): value is ManagedUsage {\n if (!isRecord(value) || (value.plan !== 'free' && value.plan !== 'pro')) {\n return false;\n }\n if (value.remainingPrompts !== null && typeof value.remainingPrompts !== 'number') {\n return false;\n }\n if (typeof value.used !== 'number' || typeof value.limit !== 'number') {\n return false;\n }\n if (value.period !== 'lifetime' && value.period !== 'monthly') {\n return false;\n }\n if (!Array.isArray(value.unlockedMapCategoryKeys)) {\n return false;\n }\n return value.unlockedMapCategoryKeys.every((k) => typeof k === 'string');\n}\n\nexport class BackendHttpError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly upgradeUrl?: string\n ) {\n super(message);\n }\n}\n\nfunction isOptionalString(value: unknown): boolean {\n return value === undefined || typeof value === 'string';\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n", "export const READY = 'READY';\nexport const LOGIN_REQUIRED = 'LOGIN_REQUIRED';\nexport const UPGRADE_REQUIRED = 'UPGRADE_REQUIRED';\nexport const MANUAL_ACTION_REQUIRED = 'MANUAL_ACTION_REQUIRED';\nexport const AGENT_ACTION = 'AGENT_ACTION';\nexport const ERROR = 'ERROR';\n\nexport type AgentStatusLabel =\n | typeof READY\n | typeof LOGIN_REQUIRED\n | typeof UPGRADE_REQUIRED\n | typeof MANUAL_ACTION_REQUIRED\n | typeof AGENT_ACTION\n | typeof ERROR;\n\nexport function formatAgentStatus(label: AgentStatusLabel, message: string): string {\n return `${label}: ${message}`;\n}\n", "import { normalizeBaseUrl } from '../../../src/station/backendClient';\r\nimport type { ManagedStationUsage } from '../../../shared/station';\r\nimport { saveCredentials, type CliCredentials } from './config';\r\nimport { formatAgentStatus, UPGRADE_REQUIRED } from './statusLabels';\r\nimport type { CliScanArtifact } from './types';\r\n\r\nexport interface AccountMeResponse {\r\n email: string;\r\n plan: 'free' | 'pro';\r\n trialEndsAt?: string | null;\r\n usage: ManagedStationUsage;\r\n billing?: {\r\n status?: string | null;\r\n renewsAt?: string | null;\r\n endsAt?: string | null;\r\n currentPeriodStart?: string | null;\r\n };\r\n}\r\n\r\nexport async function fetchAccountMe(\r\n apiBaseUrl: string,\r\n accessToken: string\r\n): Promise<AccountMeResponse> {\r\n const url = `${normalizeBaseUrl(apiBaseUrl)}/v1/account/me`;\r\n let response: Response;\r\n try {\r\n response = await fetch(url, {\r\n headers: { Authorization: `Bearer ${accessToken}` }\r\n });\r\n } catch (error) {\r\n const cause = error instanceof Error ? error.message : String(error);\r\n throw new Error(`Could not reach VibeRaven API at ${url}: ${cause}`);\r\n }\r\n\r\n if (response.status === 401) {\r\n throw new Error('Session expired. Run `viberaven login` again.');\r\n }\r\n\r\n const bodyText = await response.text();\r\n if (!response.ok) {\r\n throw new Error(`Account lookup failed (${response.status}): ${bodyText.trim() || response.statusText}`);\r\n }\r\n\r\n const data = JSON.parse(bodyText) as AccountMeResponse;\r\n if (!data.usage || (data.plan !== 'free' && data.plan !== 'pro')) {\r\n throw new Error('Account response was missing usage or plan.');\r\n }\r\n return data;\r\n}\r\n\r\nexport async function syncCredentialsFromAccount(\r\n credentials: CliCredentials\r\n): Promise<CliCredentialsWithAccount> {\r\n const account = await fetchAccountMe(credentials.apiBaseUrl, credentials.accessToken);\r\n const updated: CliCredentials = {\r\n ...credentials,\r\n email: account.email,\r\n plan: account.plan\r\n };\r\n await saveCredentials(updated);\r\n return { ...updated, account };\r\n}\r\n\r\nexport type CliCredentialsWithAccount = CliCredentials & { account: AccountMeResponse };\r\n\r\n/** Attach account strip fields for static report.html (best-effort). */\r\nexport async function enrichArtifactWithAccount(\r\n artifact: CliScanArtifact,\r\n apiBaseUrl: string,\r\n accessToken: string\r\n): Promise<CliScanArtifact> {\r\n try {\r\n const account = await fetchAccountMe(apiBaseUrl, accessToken);\r\n return {\r\n ...artifact,\r\n accountEmail: account.email,\r\n plan: account.plan,\r\n usage: account.usage,\r\n usageLine: formatUsageLine(account.usage)\r\n };\r\n } catch {\r\n return artifact;\r\n }\r\n}\r\n\r\nexport function formatUsageLine(usage: ManagedStationUsage): string {\n const periodLabel = usage.period === 'monthly' ? 'this month' : 'lifetime';\n return `Scans: ${usage.used}/${usage.limit} (${periodLabel}, ${usage.plan}) \u00B7 ${usage.remainingPrompts} remaining`;\n}\n\nfunction normalizeUpgradeUrl(url: string): string {\n return url.replace('https://viberice.com/account', 'https://viberaven.dev/account');\n}\n\nexport function formatScanLimitMessage(upgradeUrl: string): string {\n const safeUpgradeUrl = normalizeUpgradeUrl(upgradeUrl);\n return [\n '',\n formatAgentStatus(UPGRADE_REQUIRED, 'Free scan limit reached. Upgrade to Pro to continue.'),\n 'Your last scan artifacts are unchanged if you already ran a scan in this repo.',\n 'Do not keep retrying this scan until the user upgrades or quota resets.',\n '',\n `Upgrade & account: ${safeUpgradeUrl}`,\n ''\n ].join('\\n');\n}\n", "import { spawn } from 'node:child_process';\n\nexport interface OpenCommand {\n command: string;\n args: string[];\n shell: boolean;\n}\n\nexport function createOpenCommand(\n target: string,\n platform: NodeJS.Platform = process.platform\n): OpenCommand {\n if (platform === 'win32') {\n return {\n command: 'rundll32',\n args: ['url.dll,FileProtocolHandler', target],\n shell: false\n };\n }\n if (platform === 'darwin') {\n return { command: 'open', args: [target], shell: false };\n }\n return { command: 'xdg-open', args: [target], shell: false };\n}\n\nasync function openWithSystemDefault(target: string): Promise<void> {\n const { command, args, shell } = createOpenCommand(target);\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command, args, { stdio: 'ignore', shell });\n child.on('error', reject);\n child.on('exit', (code) => {\n if (code === 0) {\n resolve();\r\n } else {\r\n reject(new Error(`Could not open browser (exit ${code ?? 'unknown'}). Open manually: ${target}`));\r\n }\r\n });\r\n });\r\n}\r\n\r\nexport async function openPathInBrowser(filePath: string): Promise<void> {\r\n await openWithSystemDefault(filePath);\r\n}\r\n\r\nexport async function openUrlInBrowser(url: string): Promise<void> {\r\n const trimmed = url.trim();\r\n if (!/^https?:\\/\\//i.test(trimmed)) {\r\n throw new Error(`Not a valid http(s) URL: ${url}`);\r\n }\r\n await openWithSystemDefault(trimmed);\r\n}\r\n", "export const PUBLIC_PACKAGE = 'viberaven';\nexport const PUBLIC_COMMAND = `npx -y ${PUBLIC_PACKAGE}`;\nexport const PUBLIC_AGENT_MODE_COMMAND = `${PUBLIC_COMMAND} --agent-mode`;\nexport const PUBLIC_VERIFY_COMMAND = `${PUBLIC_COMMAND} --verify`;\nexport const PUBLIC_STRICT_COMMAND = `${PUBLIC_COMMAND} --strict`;\nexport const PUBLIC_CONDENSE_COMMAND = `${PUBLIC_COMMAND} --condense`;\nexport const PUBLIC_INIT_ALL_COMMAND = `${PUBLIC_COMMAND} init --agents all`;\nexport const PUBLIC_AUDIT_COMMAND = `${PUBLIC_COMMAND} audit --vercel-supabase`;\nexport const PUBLIC_NEXT_JSON_COMMAND = `${PUBLIC_COMMAND} next --json`;\nexport const PUBLIC_CLEAN_PLAN_COMMAND = `${PUBLIC_COMMAND} clean --plan`;\nexport const PUBLIC_ACTIONS_COMMAND = `${PUBLIC_COMMAND} actions`;\n\nexport function promptGapCommand(gapId: string): string {\n return `${PUBLIC_COMMAND} prompt --gap ${gapId}`;\n}\n\nexport function healPlanGapCommand(gapId: string): string {\n return `${PUBLIC_COMMAND} --heal --plan --gap ${gapId}`;\n}\n\nexport function healPromptGapCommand(gapId: string): string {\n return `${PUBLIC_COMMAND} --heal --prompt --gap ${gapId}`;\n}\n\nexport function healApplyGapCommand(gapId: string): string {\n return `${PUBLIC_COMMAND} --heal --apply --gap ${gapId}`;\n}\n\nexport function verifyActionCommand(actionId: string): string {\n return `${PUBLIC_COMMAND} verify --action ${actionId}`;\n}\n", "import { pollManagedSignIn, startManagedSignIn } from '../../../src/station/backendClient';\r\nimport { formatUsageLine, syncCredentialsFromAccount } from './account';\r\nimport { loadCredentials, resolveApiBaseUrl, saveCredentials } from './config';\r\nimport { openUrlInBrowser } from './openBrowser';\r\nimport { PUBLIC_COMMAND } from './contracts/commands';\r\nimport { formatAgentStatus, LOGIN_REQUIRED } from './statusLabels';\r\n\r\nconst PUBLIC_LOGIN_COMMAND = `${PUBLIC_COMMAND} login`;\r\n\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nexport async function runDeviceLogin(apiBaseUrl: string): Promise<void> {\r\n const signIn = await startManagedSignIn(apiBaseUrl);\r\n const verificationUrl = buildVerificationUrl(signIn.verificationUrl, signIn.deviceCode);\r\n\r\n console.log('\\nVibeRaven sign-in\\n');\r\n console.log(`Open: ${verificationUrl}`);\r\n console.log(`Code: ${signIn.deviceCode}`);\r\n console.log(`LOGIN_URL_READY: ${verificationUrl}`);\r\n console.log(\r\n 'LOGIN_INSTRUCTION: Open this URL for the user, complete VibeRaven browser approval, then wait for the CLI to continue automatically.\\n'\r\n );\r\n try {\n await openUrlInBrowser(verificationUrl);\n console.log('Opened the VibeRaven approval page in your browser.');\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n console.log(\n 'LOGIN_BROWSER_MANUAL: Automatic browser open failed. Open the LOGIN_URL_READY URL manually; the CLI is still waiting.'\n );\n console.log(`LOGIN_BROWSER_DETAIL: ${detail}`);\n }\n console.log('Waiting for approval in the browser\u2026\\n');\r\n\r\n console.log('LOGIN_WAITING: Complete approval in the browser, then VibeRaven will continue automatically.');\r\n\r\n const expiresAt = Date.parse(signIn.expiresAt);\r\n const pollMs = Math.max(2, signIn.pollIntervalSeconds) * 1000;\r\n\r\n while (Date.now() < expiresAt) {\r\n const result = await pollManagedSignIn(apiBaseUrl, signIn.deviceCode);\r\n if (result.status === 'pending') {\r\n await sleep(pollMs);\r\n continue;\r\n }\r\n if (result.status === 'expired') {\r\n throw new Error(formatAgentStatus(LOGIN_REQUIRED, `Sign-in expired. Ask the user to run \\`${PUBLIC_LOGIN_COMMAND}\\`, complete browser/device approval, then rerun \\`${PUBLIC_COMMAND}\\`.`));\r\n }\r\n if (result.status === 'denied') {\r\n throw new Error('Sign-in was denied.');\r\n }\r\n if (result.status === 'approved') {\r\n const baseCreds = {\r\n accessToken: result.accessToken,\r\n apiBaseUrl,\r\n email: result.account?.email,\r\n plan: result.account?.plan\r\n };\r\n await saveCredentials(baseCreds);\r\n try {\r\n const synced = await syncCredentialsFromAccount(baseCreds);\r\n const email = synced.email ?? 'your account';\r\n const plan = synced.plan ?? 'unknown';\r\n const usage = synced.account?.usage;\r\n console.log(`Signed in as ${email} (${plan}).`);\r\n console.log(`LOGIN_APPROVED: Signed in as ${email} (${plan}).`);\r\n if (usage) {\r\n console.log(formatUsageLine(usage));\r\n }\r\n } catch (error) {\r\n const email = result.account?.email ?? 'your account';\r\n console.log(`Signed in as ${email}.`);\r\n console.log(`LOGIN_APPROVED: Signed in as ${email}.`);\r\n console.warn(\r\n error instanceof Error\r\n ? `Could not refresh account usage: ${error.message}`\r\n : 'Could not refresh account usage.'\r\n );\r\n }\r\n return;\r\n }\r\n }\r\n\r\n throw new Error(formatAgentStatus(LOGIN_REQUIRED, `Sign-in timed out. Ask the user to run \\`${PUBLIC_LOGIN_COMMAND}\\`, complete browser/device approval, then rerun \\`${PUBLIC_COMMAND}\\`.`));\r\n}\r\n\r\nfunction buildVerificationUrl(verificationUrl: string, deviceCode: string): string {\r\n try {\r\n const url = new URL(verificationUrl);\r\n url.searchParams.set('device_code', deviceCode);\r\n return url.toString();\r\n } catch {\r\n const separator = verificationUrl.includes('?') ? '&' : '?';\r\n return `${verificationUrl}${separator}device_code=${encodeURIComponent(deviceCode)}`;\r\n }\r\n}\r\n\r\nexport async function requireCredentials(apiBaseUrl?: string): Promise<{\r\n accessToken: string;\r\n apiBaseUrl: string;\r\n}> {\r\n const creds = await loadCredentials();\r\n const base = apiBaseUrl ?? creds?.apiBaseUrl ?? resolveApiBaseUrl();\r\n if (!creds?.accessToken) {\r\n throw new Error(formatAgentStatus(LOGIN_REQUIRED, `Not signed in. Ask the user to run \\`${PUBLIC_LOGIN_COMMAND}\\`, complete browser/device approval, then rerun \\`${PUBLIC_COMMAND}\\`.`));\r\n }\r\n return { accessToken: creds.accessToken, apiBaseUrl: base };\r\n}\r\n", "import { promises as fs } from 'node:fs';\r\nimport { join, relative, basename, sep } from 'node:path';\r\nimport type { ScanResult, ScannedFile, StackSignalKey } from './types';\r\n\r\nconst ALWAYS_SKIP = new Set([\r\n 'node_modules', '.git', '.next', 'dist', 'build', 'out',\r\n '.cache', 'coverage', '.nyc_output', 'storybook-static',\r\n 'public', 'static', '.turbo', '.vercel'\r\n]);\r\n\r\nconst SECRET_PATTERNS = [\r\n /\\.env$/, /\\.env\\..+/, /\\.pem$/, /\\.key$/,\r\n /\\.p8$/, /\\.p12$/, /\\.pfx$/, /\\.ppk$/,\r\n /secrets?\\./i, /credentials?\\./i, /\\.secret\\./i,\r\n /service[-_]?account/i, /private[-_]?key/i\r\n];\r\n\r\nconst SECRET_FILE_NAMES = new Set([\r\n '.npmrc',\r\n '.netrc',\r\n '.pypirc',\r\n 'id_rsa',\r\n 'id_dsa',\r\n 'id_ecdsa',\r\n 'id_ed25519',\r\n 'npmrc',\r\n 'kubeconfig',\r\n 'dockerconfigjson'\r\n]);\r\n\r\nconst HIGH_SIGNAL_FILES = [\r\n 'package.json', 'tsconfig.json', 'SPEC.md', 'README.md',\r\n '.env.example', 'middleware.ts', 'middleware.js',\r\n 'vite.config.ts', 'vite.config.js',\r\n 'next.config.ts', 'next.config.js',\r\n 'tailwind.config.ts', 'tailwind.config.js',\r\n 'vercel.json', 'sentry.client.config.ts', 'sentry.server.config.ts',\r\n 'playwright.config.ts', 'playwright.config.js',\r\n 'drizzle.config.ts', 'drizzle.config.js',\r\n 'prisma/schema.prisma', 'supabase/config.toml',\r\n 'src/middleware.ts', 'app/middleware.ts',\r\n];\r\n\r\nconst STACK_SIGNAL_PATHS: Record<StackSignalKey, string[]> = {\r\n hasSupabase: ['supabase/config.toml', 'src/utils/supabase.ts', 'lib/supabase.ts'],\r\n hasPrisma: ['prisma/schema.prisma'],\r\n hasDrizzle: ['drizzle.config.ts', 'drizzle.config.js'],\r\n hasMongoose: [],\r\n hasNextJs: ['next.config.ts', 'next.config.js', 'app/layout.tsx'],\r\n hasVite: ['vite.config.ts', 'vite.config.js'],\r\n hasAuth: [\r\n 'middleware.ts', 'src/middleware.ts', 'app/middleware.ts',\r\n 'src/lib/auth.ts', 'lib/auth.ts', 'auth.config.ts'\r\n ],\r\n hasTests: ['jest.config.ts', 'vitest.config.ts'],\r\n hasDocker: ['Dockerfile', 'docker-compose.yml', 'docker-compose.yaml'],\r\n hasCI: ['.github/workflows', '.gitlab-ci.yml', 'circle.yml'],\r\n hasStripe: [],\r\n hasPolar: [],\r\n hasClerk: [],\r\n hasAuthJs: [],\r\n hasPaddle: [],\r\n hasVercel: ['vercel.json'],\r\n hasSentry: ['sentry.client.config.ts', 'sentry.server.config.ts', 'instrumentation.ts'],\r\n hasPostHog: [],\r\n hasPlaywright: ['playwright.config.ts', 'playwright.config.js'],\r\n hasUpstash: [],\r\n hasTurnstile: [],\r\n hasNeon: [],\r\n hasMongoDb: [],\r\n hasPlanetScale: [],\r\n hasTurso: ['turso/config.toml'],\r\n hasLanding: ['landing', 'pages/index.tsx', 'app/page.tsx', 'index.html'],\r\n hasRateLimit: [],\r\n hasEnvExample: ['.env.example'],\r\n hasRobots: ['public/robots.txt', 'robots.txt'],\r\n hasSitemap: ['public/sitemap.xml', 'sitemap.xml'],\r\n hasErrorBoundary: [],\r\n hasLoadingStates: [],\r\n};\r\n\r\nexport interface DeepScanOptions {\r\n maxFiles: number;\r\n maxBytesPerFile: number;\r\n maxTotalBytes: number;\r\n maxDepth: number;\r\n}\r\n\r\nconst DEFAULT_OPTIONS: DeepScanOptions = {\r\n maxFiles: 80,\r\n maxBytesPerFile: 6000,\r\n maxTotalBytes: 120000,\r\n maxDepth: 8,\r\n};\r\n\r\nexport async function deepScanWorkspace(\r\n workspaceRoot: string,\r\n options: Partial<DeepScanOptions> = {}\r\n): Promise<ScanResult> {\r\n const opts = { ...DEFAULT_OPTIONS, ...options };\r\n let ignoredByGitignore: (relPath: string) => boolean = () => false;\r\n\r\n try {\r\n const gitignoreContent = await fs.readFile(join(workspaceRoot, '.gitignore'), 'utf-8');\r\n ignoredByGitignore = createGitignoreMatcher(gitignoreContent);\r\n } catch {\r\n // No .gitignore is fine\r\n }\r\n\r\n const allFiles: string[] = [];\r\n const secretsFound: string[] = [];\r\n\r\n async function walk(dir: string, depth: number): Promise<void> {\r\n if (depth > opts.maxDepth) return;\r\n let entries: import('node:fs').Dirent<string>[];\r\n try {\r\n entries = await fs.readdir(dir, { withFileTypes: true });\r\n } catch {\r\n return;\r\n }\r\n entries.sort((a, b) => a.name.localeCompare(b.name));\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry.name);\r\n const relPath = relative(workspaceRoot, fullPath);\r\n\r\n if (entry.isDirectory()) {\r\n if (ALWAYS_SKIP.has(entry.name)) {\r\n if (entry.name === 'public' || entry.name === 'static') {\r\n await collectPublicMetadataFiles(fullPath, relPath, depth + 1);\r\n }\r\n continue;\r\n }\r\n if (relPath && ignoredByGitignore(relPath)) continue;\r\n await walk(fullPath, depth + 1);\r\n } else {\r\n if (relPath && ignoredByGitignore(relPath)) continue;\r\n if (isSecretFileName(entry.name)) {\r\n secretsFound.push(relPath);\r\n continue;\r\n }\r\n allFiles.push(relPath);\r\n }\r\n }\r\n }\r\n\r\n async function collectPublicMetadataFiles(dir: string, relDir: string, depth: number): Promise<void> {\r\n if (depth > opts.maxDepth) return;\r\n let entries: import('node:fs').Dirent<string>[];\r\n try {\r\n entries = await fs.readdir(dir, { withFileTypes: true });\r\n } catch {\r\n return;\r\n }\r\n entries.sort((a, b) => a.name.localeCompare(b.name));\r\n\r\n for (const entry of entries) {\r\n const fullPath = join(dir, entry.name);\r\n const relPath = join(relDir, entry.name);\r\n if (entry.isDirectory()) {\r\n await collectPublicMetadataFiles(fullPath, relPath, depth + 1);\r\n continue;\r\n }\r\n if (/^(robots\\.txt|sitemap\\.xml)$/i.test(entry.name)) {\r\n allFiles.push(relPath);\r\n }\r\n }\r\n }\r\n\r\n await walk(workspaceRoot, 0);\r\n\r\n const scored = allFiles\r\n .map((f) => ({ path: f, score: scoreFile(f) }))\r\n .sort((a, b) => b.score - a.score || a.path.localeCompare(b.path))\r\n .slice(0, opts.maxFiles);\r\n\r\n let totalBytes = 0;\r\n const scannedFiles: ScannedFile[] = [];\r\n\r\n for (const { path: relPath, score } of scored) {\r\n if (totalBytes >= opts.maxTotalBytes) break;\r\n const fullPath = join(workspaceRoot, relPath);\r\n let content: string | null = null;\r\n let sizeBytes = 0;\r\n\r\n try {\r\n const raw = await fs.readFile(fullPath);\r\n if (isLikelyBinary(raw)) {\r\n scannedFiles.push({ path: relPath, content: null, isSecret: false, sizeBytes: raw.length, heat: Math.round(score) });\r\n continue;\r\n }\r\n const text = raw.toString('utf-8');\r\n const safeText = redactSecretValues(text);\r\n sizeBytes = Buffer.byteLength(text, 'utf-8');\r\n const budget = Math.min(opts.maxBytesPerFile, opts.maxTotalBytes - totalBytes);\r\n content = safeText.slice(0, budget);\r\n totalBytes += Math.min(sizeBytes, budget);\r\n } catch {\r\n // Unreadable file \u2014 still record path\r\n }\r\n\r\n scannedFiles.push({ path: relPath, content, isSecret: false, sizeBytes, heat: Math.round(score) });\r\n }\r\n\r\n // Stack signals from file paths\r\n const allPathsSet = new Set(allFiles);\r\n const stackSignals: Partial<Record<StackSignalKey, boolean>> = {};\r\n\r\n for (const [signal, paths] of Object.entries(STACK_SIGNAL_PATHS) as Array<[StackSignalKey, string[]]>) {\r\n if (paths.length > 0) {\r\n stackSignals[signal] = paths.some(\r\n (p) => allPathsSet.has(p) || [...allPathsSet].some((ap) => ap.replace(/\\\\/g, '/').includes(p))\r\n );\r\n }\r\n }\r\n\r\n // Stack signals from package.json files across monorepos/sub-apps.\r\n const packageDeps = await readPackageDependencies(workspaceRoot, allFiles);\r\n const packageDepsLower = packageDeps.map((dep) => dep.toLowerCase());\r\n const pathBlob = allFiles.map((file) => file.replace(/\\\\/g, '/').toLowerCase()).join('\\n');\r\n const contentBlob = scannedFiles\r\n .filter((file) => !file.isSecret && typeof file.content === 'string')\r\n .map((file) => file.content as string)\r\n .join('\\n')\r\n .toLowerCase();\r\n const repoBlob = `${packageDepsLower.join('\\n')}\\n${pathBlob}\\n${contentBlob}`;\r\n\r\n stackSignals.hasSupabase = Boolean(stackSignals.hasSupabase) || hasPackage(packageDepsLower, ['@supabase/']) || /\\bsupabase\\b/.test(repoBlob);\r\n stackSignals.hasStripe = hasPackage(packageDepsLower, ['stripe']) || /\\bstripe_(secret_key|webhook_secret)\\b/.test(repoBlob) || /stripe/.test(pathBlob);\r\n stackSignals.hasPolar = hasPackage(packageDepsLower, ['@polar-sh/']) || /\\bpolar_(access_token|webhook_secret|pro_product_id|sandbox)\\b/.test(repoBlob) || /\\bpolar\\b/.test(pathBlob);\r\n stackSignals.hasClerk = hasPackage(packageDepsLower, ['@clerk/']) || /\\bclerk_(secret_key|publishable_key)\\b|\\bnext_public_clerk_/.test(repoBlob);\r\n stackSignals.hasAuthJs = hasPackage(packageDepsLower, ['next-auth', '@auth/']) || /\\b(auth_secret|nextauth_secret)\\b|\\bauth\\.js\\b/.test(repoBlob);\r\n stackSignals.hasAuth = Boolean(stackSignals.hasAuth) || Boolean(stackSignals.hasClerk) || Boolean(stackSignals.hasAuthJs) || /\\bauthmiddleware\\b|\\bclerkmiddleware\\b/.test(repoBlob);\r\n stackSignals.hasPaddle = hasPackage(packageDepsLower, ['@paddle/', 'paddle']) || /\\bpaddle_(api_key|webhook_secret|client_token)\\b/.test(repoBlob);\r\n stackSignals.hasVercel = Boolean(stackSignals.hasVercel) || hasPackage(packageDepsLower, ['@vercel/']) || /\\bvercel\\.json\\b|\\bvercel\\b/.test(repoBlob);\r\n stackSignals.hasSentry = Boolean(stackSignals.hasSentry) || hasPackage(packageDepsLower, ['@sentry/']) || /\\bsentry_dsn\\b|\\bsentry\\.init\\b|\\bsentry\\b/.test(repoBlob);\r\n stackSignals.hasPostHog = hasPackage(packageDepsLower, ['posthog-js', 'posthog-node']) || /\\b(next_public_)?posthog_key\\b|\\bposthog\\.init\\b|\\bposthog\\b/.test(repoBlob);\r\n stackSignals.hasPlaywright = Boolean(stackSignals.hasPlaywright) || hasPackage(packageDepsLower, ['@playwright/test']) || /(^|\\/)playwright\\.config\\.[jt]s\\b|\\.spec\\.[jt]sx?\\b/.test(pathBlob);\r\n stackSignals.hasUpstash = hasPackage(packageDepsLower, ['@upstash/']) || /\\bupstash_redis_rest_(url|token)\\b|\\bupstash\\b/.test(repoBlob);\r\n stackSignals.hasTurnstile = hasPackage(packageDepsLower, ['turnstile']) || /\\bturnstile_(secret_key|site_key)\\b|\\bnext_public_turnstile_site_key\\b|\\bcloudflare turnstile\\b/.test(repoBlob);\r\n stackSignals.hasNeon = hasPackage(packageDepsLower, ['@neondatabase/']) || /\\bneon_database_url\\b|\\bneon\\b/.test(repoBlob);\r\n stackSignals.hasMongoDb = hasPackage(packageDepsLower, ['mongodb', 'mongoose']) || /\\bmongodb_(uri|url)\\b|\\bmongodb\\b/.test(repoBlob);\r\n stackSignals.hasPlanetScale = hasPackage(packageDepsLower, ['@planetscale/database']) || /\\bplanetscale_database_url\\b|\\bplanetscale\\b/.test(repoBlob);\r\n stackSignals.hasTurso = hasPackage(packageDepsLower, ['@libsql/client']) || /\\bturso_(database_url|auth_token)\\b|\\bturso\\b/.test(repoBlob);\r\n stackSignals.hasMongoose = packageDepsLower.includes('mongoose');\r\n stackSignals.hasTests = Boolean(stackSignals.hasTests) || hasPackage(packageDepsLower, ['vitest', 'jest', '@playwright/test', 'cypress']) || /\\.test\\.[jt]sx?\\b|\\.spec\\.[jt]sx?\\b/.test(pathBlob);\r\n stackSignals.hasRateLimit = packageDeps.some((d) =>\r\n ['express-rate-limit', 'rate-limiter-flexible', '@fastify/rate-limit', 'upstash'].some((r) => d.includes(r))\r\n ) || scanContainsRateLimit(scannedFiles);\r\n stackSignals.hasCI = Boolean(stackSignals.hasCI) || /(^|\\n)\\.github\\/workflows\\/[^/\\n]+\\.ya?ml(\\n|$)|(^|\\n)(\\.gitlab-ci\\.yml|circle\\.yml)(\\n|$)/i.test(pathBlob);\r\n stackSignals.hasRobots = Boolean(stackSignals.hasRobots) || /(^|\\n|\\/)robots\\.txt(\\n|$)/i.test(pathBlob);\r\n stackSignals.hasSitemap = Boolean(stackSignals.hasSitemap) || /(^|\\n|\\/)sitemap\\.xml(\\n|$)/i.test(pathBlob);\r\n stackSignals.hasErrorBoundary = Boolean(stackSignals.hasErrorBoundary) ||\r\n /(^|\\n|\\/)(error|error-boundary|errorboundary)\\.[jt]sx?(\\n|$)|(^|\\n).*errorboundary\\.[jt]sx?(\\n|$)/i.test(pathBlob) ||\r\n /\\b(componentdidcatch|errorboundary|react\\.component<.*error)/i.test(contentBlob);\r\n stackSignals.hasLoadingStates = Boolean(stackSignals.hasLoadingStates) ||\r\n /(^|\\n|\\/)(loading|skeleton|spinner)\\.[jt]sx?(\\n|$)|(^|\\n).*skeleton\\.[jt]sx?(\\n|$)/i.test(pathBlob) ||\r\n /\\b(isloading|loading state|suspense fallback|<skeleton|<spinner)/i.test(contentBlob);\r\n\r\n return {\r\n files: scannedFiles,\r\n stackSignals,\r\n packageDeps,\r\n fileTree: allFiles.slice(0, 200).join('\\n'),\r\n secretsFound,\r\n totalFilesScanned: allFiles.length,\r\n };\r\n}\r\n\r\nfunction hasPackage(packageDepsLower: string[], needles: string[]): boolean {\r\n return needles.some((needle) => packageDepsLower.some((dep) => dep === needle || dep.includes(needle)));\r\n}\r\n\r\nfunction scoreFile(relPath: string): number {\r\n const name = basename(relPath);\r\n const parts = relPath.split(sep);\r\n let score = 0;\r\n\r\n if (HIGH_SIGNAL_FILES.some((f) => relPath === f || relPath.replace(/\\\\/g, '/').endsWith(f))) score += 10;\r\n if (/config|Config/.test(name)) score += 6;\r\n if (/auth|middleware|guard|permission|role|policy/i.test(relPath)) score += 7;\r\n if (/schema|migration|seed|\\.prisma/i.test(relPath)) score += 6;\r\n if (/\\.github[/\\\\]workflows[/\\\\].+\\.ya?ml$|\\.gitlab-ci\\.yml$|circle\\.yml$/i.test(relPath)) score += 9;\r\n if (/(^|[/\\\\])robots\\.txt$|(^|[/\\\\])sitemap\\.xml$/i.test(relPath)) score += 9;\r\n if (/sentry\\.(client|server)\\.config\\.[jt]s$|instrumentation\\.[jt]s$/i.test(relPath)) score += 9;\r\n if (/error[-_]?boundary|errorboundary|(^|[/\\\\])error\\.[jt]sx?$/i.test(relPath)) score += 8;\r\n if (/(^|[/\\\\])loading\\.[jt]sx?$|skeleton|spinner/i.test(relPath)) score += 7;\r\n if (/webhook|checkout|billing|rate-?limit|validation|validator/i.test(relPath)) score += 7;\r\n if (parts.includes('api') || parts.includes('routes')) score += 5;\r\n if (['main.ts', 'main.tsx', 'index.ts', 'index.tsx', 'App.tsx', 'App.ts',\r\n 'layout.tsx', 'page.tsx', 'server.ts', 'app.ts'].includes(name)) score += 5;\r\n if (/types?|\\.d\\.ts/.test(name)) score += 3;\r\n if (parts.some((p) => ['hooks', 'store', 'stores', 'context'].includes(p))) score += 4;\r\n if (/db|database/i.test(relPath)) score += 5;\r\n score -= Math.max(0, parts.length - 3) * 0.5;\r\n\r\n return score;\r\n}\r\n\r\nasync function readPackageDependencies(workspaceRoot: string, allFiles: string[]): Promise<string[]> {\r\n const deps = new Set<string>();\r\n const packagePaths = allFiles.filter((file) => basename(file) === 'package.json');\r\n\r\n for (const relPath of packagePaths) {\r\n try {\r\n const raw = await fs.readFile(join(workspaceRoot, relPath), 'utf-8');\r\n const pkg = JSON.parse(raw) as Record<string, unknown>;\r\n for (const key of ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies']) {\r\n const group = pkg[key];\r\n if (!group || typeof group !== 'object' || Array.isArray(group)) {\r\n continue;\r\n }\r\n for (const name of Object.keys(group)) {\r\n deps.add(name);\r\n }\r\n }\r\n } catch {\r\n // Invalid or unreadable package.json files should not fail the scan.\r\n }\r\n }\r\n\r\n return [...deps].sort();\r\n}\r\n\r\nfunction scanContainsRateLimit(files: ScannedFile[]): boolean {\r\n const haystack = files\r\n .filter((file) => typeof file.content === 'string' && /[/\\\\](api|routes|server|src)[/\\\\]|app\\.(ts|js)$/i.test(file.path))\r\n .map((file) => file.content as string)\r\n .join('\\n');\r\n\r\n return /\\b(rateLimit|rateLimiter|rate-limiter|rateLimitBuckets|Too many requests)\\b/i.test(haystack);\r\n}\r\n\r\nfunction redactSecretValues(text: string): string {\r\n return text\r\n .replace(/\\b(sk_(?:live|test)_[A-Za-z0-9]{12,}|sk-proj-[A-Za-z0-9_-]{16,}|sk-[A-Za-z0-9_-]{20,}|whsec_[A-Za-z0-9]{12,}|rk_(?:live|test)_[A-Za-z0-9]{12,})\\b/g, '[REDACTED_SECRET]')\r\n .replace(\r\n /\\b([A-Z0-9_]*(?:SECRET|TOKEN|API_KEY|PRIVATE_KEY|SERVICE_ROLE|PASSWORD|WEBHOOK_SECRET)[A-Z0-9_]*)[ \\t]*=[ \\t]*(['\"]?)([^\\s'\"`#]+)\\2/g,\r\n (_match, key: string, quote: string, value: string) => value.length > 0 ? `${key}=${quote}[REDACTED_SECRET]${quote}` : `${key}=`\r\n );\r\n}\r\n\r\nfunction isSecretFileName(fileName: string): boolean {\r\n if (fileName === '.env.example') {\r\n return false;\r\n }\r\n\r\n if (SECRET_FILE_NAMES.has(fileName.toLowerCase())) {\r\n return true;\r\n }\r\n\r\n return SECRET_PATTERNS.some((pattern) => pattern.test(fileName));\r\n}\r\n\r\nfunction isLikelyBinary(buffer: Buffer): boolean {\r\n return buffer.includes(0);\r\n}\r\n\r\ntype GitignoreRule = {\r\n directoryOnly: boolean;\r\n anchored: boolean;\r\n hasSlash: boolean;\r\n pattern: string;\r\n regex: RegExp;\r\n};\r\n\r\nfunction createGitignoreMatcher(gitignoreContent: string): (relPath: string) => boolean {\r\n const rules = gitignoreContent\r\n .split(/\\r?\\n/)\r\n .map((line) => line.trim())\r\n .filter((line) => line.length > 0 && !line.startsWith('#') && !line.startsWith('!'))\r\n .map(parseGitignoreRule);\r\n\r\n return (relPath: string) => {\r\n const normalized = relPath.replace(/\\\\/g, '/').replace(/^\\/+/, '');\r\n return rules.some((rule) => ruleMatchesPath(rule, normalized));\r\n };\r\n}\r\n\r\nfunction parseGitignoreRule(raw: string): GitignoreRule {\r\n const anchored = raw.startsWith('/');\r\n let pattern = raw.replace(/^\\/+/, '');\r\n const directoryOnly = pattern.endsWith('/');\r\n pattern = pattern.replace(/\\/+$/, '');\r\n const hasSlash = pattern.includes('/');\r\n\r\n return {\r\n directoryOnly,\r\n anchored,\r\n hasSlash,\r\n pattern,\r\n regex: new RegExp(`^${gitignoreGlobToRegex(pattern)}$`)\r\n };\r\n}\r\n\r\nfunction ruleMatchesPath(rule: GitignoreRule, relPath: string): boolean {\r\n const candidates = rule.anchored || rule.hasSlash ? [relPath] : relPath.split('/');\r\n const directMatch = candidates.some((candidate) => rule.regex.test(candidate));\r\n if (directMatch && !rule.directoryOnly) {\r\n return true;\r\n }\r\n if (directMatch && rule.directoryOnly) {\r\n return true;\r\n }\r\n\r\n if (!rule.directoryOnly) {\r\n return false;\r\n }\r\n\r\n if (rule.anchored || rule.hasSlash) {\r\n return relPath === rule.pattern || relPath.startsWith(`${rule.pattern}/`);\r\n }\r\n\r\n return relPath.split('/').includes(rule.pattern);\r\n}\r\n\r\nfunction gitignoreGlobToRegex(pattern: string): string {\r\n let out = '';\r\n for (let i = 0; i < pattern.length; i += 1) {\r\n const ch = pattern[i];\r\n if (ch === '*') {\r\n out += '[^/]*';\r\n continue;\r\n }\r\n if (ch === '?') {\r\n out += '[^/]';\r\n continue;\r\n }\r\n out += escapeRegex(ch);\r\n }\r\n return out;\r\n}\r\n\r\nfunction escapeRegex(value: string): string {\r\n return value.replace(/[|\\\\{}()[\\]^$+?.]/g, '\\\\$&');\r\n}\r\n", "import type {\r\n Gap,\r\n GapCategory,\r\n GapSeverity,\r\n ModelStationOutput,\r\n ProductionMapCategoryKey,\r\n ProductionChecklist,\r\n ToolSuggestion,\r\n} from './types';\r\nimport type { ManagedStationResponse } from '../../shared/station';\r\n\r\nconst VALID_SEVERITY: GapSeverity[] = ['critical', 'warning', 'info'];\r\nconst VALID_CATEGORIES: GapCategory[] = [\r\n 'SECURITY & AUTH', 'DATABASE & DATA', 'ERROR HANDLING', 'DEPLOYMENT',\r\n 'PERFORMANCE', 'MISSING FEATURES', 'EDGE CASES & RISKS', 'LANDING & MARKETING'\r\n];\r\nconst VALID_MAP_CATEGORIES: ProductionMapCategoryKey[] = [\r\n 'appFlow',\r\n 'frontend',\r\n 'backend',\r\n 'auth',\r\n 'database',\r\n 'payments',\r\n 'deployment',\r\n 'monitoring',\r\n 'security',\r\n 'testing',\r\n 'landing',\r\n 'errorHandling',\r\n];\r\nconst MAP_CATEGORY_RULES: Array<{ key: ProductionMapCategoryKey; match: RegExp }> = [\r\n { key: 'monitoring', match: /\\b(monitor|monitoring|observability|sentry|logrocket|posthog|analytics|telemetry|logs?)\\b/i },\r\n { key: 'errorHandling', match: /\\b(error handling|error boundary|exception|unhandled|crash|fallback|failure|failures|rejected promise)\\b/i },\r\n { key: 'auth', match: /\\b(auth|login|logout|session|jwt|oauth|supabase auth|protected route|role|roles|permission|permissions)\\b/i },\r\n { key: 'payments', match: /\\b(payment|payments|billing|checkout|stripe|polar|paddle|subscription|webhook|lemon squeezy|lemonsqueezy|invoice)\\b/i },\r\n { key: 'backend', match: /\\b(backend|api|server|route|handler|endpoint|station run|station runs|fastify|express)\\b/i },\r\n { key: 'security', match: /\\b(security|secret|secrets|rate limit|ratelimit|csrf|xss|bot|abuse|signature)\\b/i },\r\n { key: 'database', match: /\\b(database|data|postgres|mysql|mongo|schema|migration|storage|rls|supabase|repository)\\b/i },\r\n { key: 'deployment', match: /\\b(deploy|deployment|hosting|vercel|netlify|docker|ci|pipeline|environment|env|release)\\b/i },\r\n { key: 'testing', match: /\\b(test|testing|spec|coverage|vitest|jest|playwright|cypress|qa)\\b/i },\r\n { key: 'landing', match: /\\b(landing|marketing|homepage|hero|cta|pricing|seo|sitemap|robots|onboarding|funnel)\\b/i },\r\n { key: 'frontend', match: /\\b(frontend|react|ui|component|layout|state|loading|client)\\b/i },\r\n { key: 'appFlow', match: /\\b(app flow|ux|user flow|journey|activation|empty state)\\b/i },\r\n];\r\nconst SEVERITY_RANK: Record<GapSeverity, number> = { info: 0, warning: 1, critical: 2 };\r\n\r\nfunction isRecord(v: unknown): v is Record<string, unknown> {\r\n return typeof v === 'object' && v !== null && !Array.isArray(v);\r\n}\r\n\r\nfunction clampScore(v: unknown, fallback = 50): number {\r\n if (typeof v !== 'number' || Number.isNaN(v)) return fallback;\r\n return Math.max(0, Math.min(100, Math.round(v)));\r\n}\r\n\r\nfunction stableVisibleScore(v: unknown, fallback = 50): number {\r\n const clamped = clampScore(v, fallback);\r\n return Math.max(0, Math.min(100, Math.round(clamped / 5) * 5));\r\n}\r\n\r\nfunction toStringArray(v: unknown): string[] {\r\n if (!Array.isArray(v)) return [];\r\n return v.filter((item): item is string => typeof item === 'string');\r\n}\r\n\r\nfunction isProductionMapCategoryKey(value: unknown): value is ProductionMapCategoryKey {\r\n return typeof value === 'string' && VALID_MAP_CATEGORIES.includes(value as ProductionMapCategoryKey);\r\n}\r\n\r\nfunction uniqueMapCategories(values: ProductionMapCategoryKey[]): ProductionMapCategoryKey[] {\r\n const seen = new Set<ProductionMapCategoryKey>();\r\n const out: ProductionMapCategoryKey[] = [];\r\n for (const value of values) {\r\n if (!seen.has(value)) {\r\n seen.add(value);\r\n out.push(value);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nfunction fallbackMapCategoryForGap(category: GapCategory, text: string): ProductionMapCategoryKey {\r\n switch (category) {\r\n case 'SECURITY & AUTH':\r\n return /\\b(auth|login|session|oauth|jwt|role|permission|protected route)\\b/i.test(text) ? 'auth' : 'security';\r\n case 'DATABASE & DATA':\r\n return 'database';\r\n case 'ERROR HANDLING':\r\n return 'errorHandling';\r\n case 'DEPLOYMENT':\r\n return 'deployment';\r\n case 'PERFORMANCE':\r\n return 'frontend';\r\n case 'LANDING & MARKETING':\r\n return 'landing';\r\n case 'EDGE CASES & RISKS':\r\n return 'testing';\r\n case 'MISSING FEATURES':\r\n default:\r\n return 'appFlow';\r\n }\r\n}\r\n\r\nfunction inferMapCategories(\r\n category: GapCategory,\r\n title: string,\r\n detail: string,\r\n copyPrompt: string,\r\n explicitPrimary: unknown,\r\n explicitAffected: unknown\r\n): ProductionMapCategoryKey[] {\r\n const text = [category, title, detail, copyPrompt].filter(Boolean).join(' ');\r\n const fallback = fallbackMapCategoryForGap(category, text);\r\n const matched = MAP_CATEGORY_RULES.filter((rule) => rule.match.test(text)).map((rule) => rule.key);\r\n const explicit = isProductionMapCategoryKey(explicitPrimary) ? [explicitPrimary] : [];\r\n const affected = Array.isArray(explicitAffected)\r\n ? explicitAffected.filter(isProductionMapCategoryKey)\r\n : [];\r\n\r\n const primarySeed = matched[0] ? [matched[0], fallback] : [fallback];\r\n return uniqueMapCategories([...explicit, ...primarySeed, ...matched, ...affected]);\r\n}\r\n\r\nfunction slugify(value: string): string {\r\n return value\r\n .trim()\r\n .toLowerCase()\r\n .replace(/&/g, 'and')\r\n .replace(/[^a-z0-9]+/g, '-')\r\n .replace(/^-+|-+$/g, '')\r\n .slice(0, 52);\r\n}\r\n\r\nfunction normalizeToolSuggestion(v: unknown): ToolSuggestion | null {\r\n if (!isRecord(v)) return null;\r\n const name = typeof v.name === 'string' ? v.name.trim() : '';\r\n const url = typeof v.url === 'string' ? v.url.trim() : '';\r\n if (!name || !url) return null;\r\n return { name, url, reason: typeof v.reason === 'string' ? v.reason : '' };\r\n}\r\n\r\nexport function normalizeGap(v: unknown): Gap | null {\r\n if (!isRecord(v)) return null;\r\n const title = typeof v.title === 'string' ? v.title.trim() : '';\r\n const copyPrompt = typeof v.copyPrompt === 'string' ? v.copyPrompt.trim() : '';\r\n if (!title || !copyPrompt) return null;\r\n\r\n const severity = VALID_SEVERITY.includes(v.severity as GapSeverity)\r\n ? (v.severity as GapSeverity)\r\n : 'warning';\r\n\r\n const category = VALID_CATEGORIES.includes(v.category as GapCategory)\r\n ? (v.category as GapCategory)\r\n : 'MISSING FEATURES';\r\n\r\n const toolSuggestions = Array.isArray(v.toolSuggestions)\r\n ? v.toolSuggestions.map(normalizeToolSuggestion).filter((t): t is ToolSuggestion => t !== null)\r\n : [];\r\n\r\n const affectedMapCategories = inferMapCategories(\r\n category,\r\n title,\r\n typeof v.detail === 'string' ? v.detail : '',\r\n copyPrompt,\r\n v.primaryMapCategory,\r\n v.affectedMapCategories\r\n );\r\n\r\n return {\r\n id: typeof v.id === 'string' && v.id.trim() ? v.id.trim() : `gap-${slugify(title) || 'root'}`,\r\n category,\r\n severity,\r\n title,\r\n detail: typeof v.detail === 'string' ? v.detail : '',\r\n copyPrompt,\r\n toolSuggestions,\r\n mcpSuggestion: typeof v.mcpSuggestion === 'string' ? v.mcpSuggestion : null,\r\n primaryMapCategory: affectedMapCategories[0],\r\n affectedMapCategories,\r\n };\r\n}\r\n\r\nfunction rootGapKey(gap: Gap): string {\r\n const titleKey = slugify(gap.title);\r\n if (titleKey) {\r\n return titleKey;\r\n }\r\n return slugify([gap.category, gap.copyPrompt].join(' ')) || gap.id;\r\n}\r\n\r\nfunction mergeToolSuggestions(a: ToolSuggestion[], b: ToolSuggestion[]): ToolSuggestion[] {\r\n const seen = new Set<string>();\r\n const out: ToolSuggestion[] = [];\r\n for (const tool of [...a, ...b]) {\r\n const key = `${tool.name.trim().toLowerCase()}|${tool.url.trim().toLowerCase()}`;\r\n if (!seen.has(key)) {\r\n seen.add(key);\r\n out.push(tool);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nfunction mergeRootGaps(a: Gap, b: Gap): Gap {\r\n const severity = SEVERITY_RANK[b.severity] > SEVERITY_RANK[a.severity] ? b.severity : a.severity;\r\n return {\r\n ...a,\r\n severity,\r\n detail: b.detail.length > a.detail.length ? b.detail : a.detail,\r\n copyPrompt: b.copyPrompt.length > a.copyPrompt.length ? b.copyPrompt : a.copyPrompt,\r\n toolSuggestions: mergeToolSuggestions(a.toolSuggestions, b.toolSuggestions),\r\n mcpSuggestion: a.mcpSuggestion ?? b.mcpSuggestion,\r\n primaryMapCategory: a.primaryMapCategory,\r\n affectedMapCategories: a.affectedMapCategories,\r\n };\r\n}\r\n\r\nfunction dedupeRootGaps(gaps: Gap[]): Gap[] {\r\n const byKey = new Map<string, Gap>();\r\n const order: string[] = [];\r\n for (const gap of gaps) {\r\n const key = rootGapKey(gap);\r\n const existing = byKey.get(key);\r\n if (!existing) {\r\n byKey.set(key, gap);\r\n order.push(key);\r\n continue;\r\n }\r\n byKey.set(key, mergeRootGaps(existing, gap));\r\n }\r\n return order.map((key) => byKey.get(key)).filter((gap): gap is Gap => Boolean(gap));\r\n}\r\n\r\nfunction normalizeChecklist(v: unknown): ProductionChecklist {\r\n const defaults: ProductionChecklist = {\r\n security: 50, database: 50, auth: 50, errorHandling: 50,\r\n deployment: 50, testing: 50, landing: 50, monitoring: 50\r\n };\r\n if (!isRecord(v)) return defaults;\r\n return {\r\n security: clampScore(v.security),\r\n database: clampScore(v.database),\r\n auth: clampScore(v.auth),\r\n errorHandling: clampScore(v.errorHandling),\r\n deployment: clampScore(v.deployment),\r\n testing: clampScore(v.testing),\r\n landing: clampScore(v.landing),\r\n monitoring: clampScore(v.monitoring),\r\n };\r\n}\r\n\r\nexport function normalizeModelOutput(raw: Partial<ModelStationOutput>): ModelStationOutput {\r\n const gaps = Array.isArray(raw.gaps)\r\n ? raw.gaps.map(normalizeGap).filter((g): g is Gap => g !== null)\r\n : [];\r\n const uniqueGaps = dedupeRootGaps(gaps);\r\n\r\n return {\r\n score: stableVisibleScore(raw.score),\r\n scoreLabel: typeof raw.scoreLabel === 'string' && raw.scoreLabel.trim() ? raw.scoreLabel : 'Drifting',\r\n summary: typeof raw.summary === 'string' && raw.summary.trim() ? raw.summary : 'Scan complete.',\r\n archetype: typeof raw.archetype === 'string' && raw.archetype.trim() ? raw.archetype : 'unknown',\r\n gaps: uniqueGaps,\r\n stackDetected: toStringArray(raw.stackDetected),\r\n missingLayers: toStringArray(raw.missingLayers),\r\n quickWins: toStringArray(raw.quickWins),\r\n productionChecklist: normalizeChecklist(raw.productionChecklist),\r\n };\r\n}\r\n\r\nexport function adaptManagedStationResponse(response: ManagedStationResponse): ModelStationOutput {\r\n const structured = parseManagedStructuredOutput(response.output);\r\n if (structured) {\r\n return structured;\r\n }\r\n\r\n const scoreMap: Record<string, number> = { stable: 75, drifting: 50, chaos: 25 };\r\n const labelMap: Record<string, string> = { stable: 'Stable', drifting: 'Drifting', chaos: 'Chaos' };\r\n const score = scoreMap[response.status] ?? 50;\r\n\r\n const gaps: Gap[] = [];\r\n if (response.output && response.output.trim()) {\r\n gaps.push({\r\n id: 'managed-output',\r\n category: 'MISSING FEATURES',\r\n severity: 'warning',\r\n title: 'Station recommendation',\r\n detail: response.reason,\r\n copyPrompt: response.output,\r\n toolSuggestions: [],\r\n mcpSuggestion: null,\r\n primaryMapCategory: 'appFlow',\r\n affectedMapCategories: ['appFlow'],\r\n });\r\n }\r\n\r\n const checklist: ProductionChecklist = {\r\n security: score, database: score, auth: score, errorHandling: score,\r\n deployment: score, testing: score, landing: score, monitoring: score,\r\n };\r\n\r\n return {\r\n score,\r\n scoreLabel: labelMap[response.status] ?? 'Drifting',\r\n summary: response.reason,\r\n archetype: 'unknown',\r\n gaps,\r\n stackDetected: [],\r\n missingLayers: [],\r\n quickWins: [],\r\n productionChecklist: checklist,\r\n };\r\n}\r\n\r\nfunction parseManagedStructuredOutput(output: string): ModelStationOutput | null {\r\n try {\r\n const parsed = JSON.parse(output) as Partial<ModelStationOutput>;\r\n if (!Array.isArray(parsed.gaps) || !isRecord(parsed.productionChecklist)) {\r\n return null;\r\n }\r\n return normalizeModelOutput(parsed);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n", "import type {\r\n Gap,\r\n LaunchValidationIssue,\r\n LaunchValidationReport,\r\n MissionGraph,\r\n ModelStationOutput,\r\n ProductionConnectionArea,\r\n ProviderTruthRow,\r\n ProviderTruthSnapshot,\r\n VerificationArea\r\n} from './types';\r\n\r\nexport interface BuildLaunchValidationReportInput {\r\n model?: ModelStationOutput;\r\n providerTruth?: ProviderTruthSnapshot;\r\n missionGraph?: MissionGraph;\r\n gaps?: Gap[];\r\n generatedAt?: string;\r\n}\r\n\r\nconst VERIFICATION_AREAS: readonly VerificationArea[] = [\r\n 'auth',\r\n 'database',\r\n 'payments',\r\n 'deployment',\r\n 'monitoring',\r\n 'security',\r\n 'testing',\r\n 'landing',\r\n 'frontend',\r\n 'backend',\r\n 'appFlow',\r\n 'errorHandling'\r\n];\r\n\r\nconst LAUNCH_CRITICAL_AREAS: readonly VerificationArea[] = [\r\n 'auth',\r\n 'database',\r\n 'payments',\r\n 'deployment',\r\n 'security'\r\n];\r\n\r\nconst LIVE_PROOF_REQUIRED_AREAS: readonly ProductionConnectionArea[] = [\r\n 'auth',\r\n 'database',\r\n 'payments'\r\n];\r\n\r\nconst ACTIONABLE_PROVIDER_CHECK_ROLES = [\r\n 'using-now',\r\n 'runtime-code',\r\n 'selected',\r\n 'conflict',\r\n 'live-verified',\r\n 'manual-confirmed'\r\n] as const;\r\n\r\nexport function buildLaunchValidationReport(\r\n input: BuildLaunchValidationReportInput\r\n): LaunchValidationReport {\r\n void input.missionGraph;\r\n\r\n const conflictIssues = (input.providerTruth?.areas ?? []).flatMap((area) =>\r\n area.conflicts.map((conflict, index): LaunchValidationIssue => ({\r\n id: `provider-conflict-${area.area}-${conflict.type}-${index}`,\r\n area: area.area,\r\n severity: conflict.severity,\r\n title: conflict.title,\r\n detail: conflict.detail,\r\n promptTemplate: conflict.recommendedAction.promptTemplate\r\n }))\r\n );\r\n\r\n const gapIssues = (input.gaps ?? [])\r\n .filter((gap) => gap.severity !== 'info')\r\n .map((gap): LaunchValidationIssue => {\r\n const area = gapArea(gap);\r\n return {\r\n id: `gap-${gap.id}`,\r\n area,\r\n severity: gap.severity,\r\n title: gap.title,\r\n detail: gap.detail,\r\n promptTemplate: gap.severity === 'critical' && isLaunchCriticalArea(area)\r\n ? 'launch-blocker'\r\n : 'repo-fix'\r\n };\r\n });\r\n\r\n const providerCoverageWarnings = providerCoverageIssues(input.providerTruth);\r\n\r\n const missingLiveProofWarnings = (input.providerTruth?.areas ?? [])\r\n .filter((area) =>\r\n area.liveVerified === null &&\r\n providerLiveProofCandidate(area) !== null &&\r\n LIVE_PROOF_REQUIRED_AREAS.includes(area.area) &&\r\n !(\r\n hasCompletedManualConfirmation(providerLiveProofCandidate(area)!) &&\r\n providerLiveProofCandidate(area)!.mcpProof.status === 'unsupported'\r\n )\r\n )\r\n .map((area): LaunchValidationIssue => {\r\n const usingNow = providerLiveProofCandidate(area)!;\r\n const hasManualConfirmation = hasCompletedManualConfirmation(usingNow);\r\n return {\r\n id: `live-proof-missing-${area.area}-${usingNow.provider}`,\r\n area: area.area,\r\n severity: 'warning',\r\n title: hasManualConfirmation\r\n ? `${area.area} live proof is missing after manual confirmation`\r\n : `${area.area} live proof is missing`,\r\n detail: hasManualConfirmation\r\n ? `${usingNow.providerLabel} manual proof is complete, but live provider proof has not been verified.`\r\n : `${usingNow.providerLabel} has runtime repo evidence, but no live provider proof has been verified.`,\r\n promptTemplate: usingNow.mcpProof.status === 'unsupported'\r\n ? 'manual-check'\r\n : 'mcp-verification'\r\n };\r\n });\r\n\r\n const missingLiveProofKeys = new Set(\r\n missingLiveProofWarnings.map((issue) => issue.id.replace('live-proof-missing-', ''))\r\n );\r\n const providerRows = (input.providerTruth?.areas ?? []).flatMap((area) =>\r\n area.rows.map((row) => ({\r\n row,\r\n skipCheck: missingLiveProofKeys.has(`${row.area}-${row.provider}`)\r\n }))\r\n );\r\n const mcpChecks = providerRows\r\n .filter(({ row, skipCheck }) =>\r\n !skipCheck &&\r\n isActionableProviderCheckRow(row) &&\r\n row.roles.some((role) => role === 'needs-mcp' || role === 'mcp-failed')\r\n )\r\n .map(({ row }): LaunchValidationIssue => ({\r\n id: `mcp-check-${row.area}-${row.provider}`,\r\n area: row.area,\r\n severity: 'warning',\r\n title: `${row.providerLabel} MCP verification required`,\r\n detail: `${row.providerLabel} needs MCP verification before launch confidence is clean.`,\r\n promptTemplate: 'mcp-verification'\r\n }));\r\n const manualChecks = providerRows\r\n .filter(({ row, skipCheck }) =>\r\n !skipCheck &&\r\n isActionableProviderCheckRow(row) &&\r\n !hasCompletedManualConfirmation(row) &&\r\n row.roles.some((role) => role === 'manual-only')\r\n )\r\n .map(({ row }): LaunchValidationIssue => ({\r\n id: `manual-check-${row.area}-${row.provider}`,\r\n area: row.area,\r\n severity: 'warning',\r\n title: `${row.providerLabel} manual verification required`,\r\n detail: `${row.providerLabel} requires manual provider proof review.`,\r\n promptTemplate: 'manual-check'\r\n }));\r\n\r\n const criticalConflictIssues = conflictIssues.filter((issue) => issue.severity === 'critical');\r\n const blockingGapIssues = gapIssues.filter((issue) =>\r\n issue.severity === 'critical' && isLaunchCriticalArea(issue.area)\r\n );\r\n const blockers = [...criticalConflictIssues, ...blockingGapIssues];\r\n const warnings = [\r\n ...conflictIssues.filter((issue) => issue.severity !== 'critical'),\r\n ...gapIssues\r\n .filter((issue) => issue.severity !== 'critical' || !isLaunchCriticalArea(issue.area))\r\n .map((issue) => issue.severity === 'critical' ? { ...issue, severity: 'warning' as const } : issue),\r\n ...providerCoverageWarnings,\r\n ...missingLiveProofWarnings\r\n ];\r\n const status = blockers.length > 0\r\n ? 'no-go'\r\n : warnings.length > 0 || manualChecks.length > 0 || mcpChecks.length > 0\r\n ? 'go-with-warnings'\r\n : 'go';\r\n\r\n return {\r\n version: 1,\r\n generatedAt: input.generatedAt ?? input.providerTruth?.generatedAt ?? new Date().toISOString(),\r\n status,\r\n score: input.model?.score ?? 0,\r\n summary: launchSummary(status, blockers.length),\r\n blockers,\r\n warnings,\r\n manualChecks,\r\n mcpChecks\r\n };\r\n}\r\n\r\nfunction providerCoverageIssues(providerTruth?: ProviderTruthSnapshot): LaunchValidationIssue[] {\r\n if (!providerTruth || providerTruth.areas.length === 0) {\r\n return [\r\n {\r\n id: 'provider-truth-incomplete',\r\n area: 'appFlow',\r\n severity: 'warning',\r\n title: 'Provider truth is incomplete',\r\n detail: 'Provider truth was not available, so launch validation needs manual provider confirmation before returning a clean go.',\r\n promptTemplate: 'manual-check'\r\n }\r\n ];\r\n }\r\n\r\n const hasLaunchCriticalProviderTruth = providerTruth.areas.some((area) =>\r\n isLaunchCriticalArea(area.area) &&\r\n (\r\n Boolean(area.usingNow) ||\r\n Boolean(area.runtimeDetected) ||\r\n Boolean(area.liveVerified) ||\r\n area.rows.some(isActionableProviderCheckRow)\r\n )\r\n );\r\n\r\n if (hasLaunchCriticalProviderTruth) {\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n id: 'launch-critical-provider-truth-missing',\r\n area: 'appFlow',\r\n severity: 'warning',\r\n title: 'Launch-critical provider truth is missing',\r\n detail: 'No launch-critical provider area has checked provider state, so provider coverage must be verified before returning a clean go.',\r\n promptTemplate: 'mcp-verification'\r\n }\r\n ];\r\n}\r\n\r\nfunction providerLiveProofCandidate(area: ProviderTruthSnapshot['areas'][number]): ProviderTruthRow | null {\r\n if (area.liveVerified) {\r\n return null;\r\n }\r\n return area.runtimeDetected ?? area.usingNow ?? null;\r\n}\r\n\r\nfunction isActionableProviderCheckRow(row: ProviderTruthRow): boolean {\r\n return row.roles.some((role) => ACTIONABLE_PROVIDER_CHECK_ROLES.includes(\r\n role as (typeof ACTIONABLE_PROVIDER_CHECK_ROLES)[number]\r\n ));\r\n}\r\n\r\nfunction hasCompletedManualConfirmation(row: ProviderTruthRow): boolean {\r\n return row.manualProof.status === 'manual-confirmed' ||\r\n row.roles.some((role) => role === 'manual-confirmed');\r\n}\r\n\r\nfunction gapArea(gap: Gap): ProductionConnectionArea | VerificationArea {\r\n return VERIFICATION_AREAS.includes(gap.primaryMapCategory as VerificationArea)\r\n ? (gap.primaryMapCategory as VerificationArea)\r\n : 'appFlow';\r\n}\r\n\r\nfunction isLaunchCriticalArea(area: ProductionConnectionArea | VerificationArea): boolean {\r\n return LAUNCH_CRITICAL_AREAS.includes(area as VerificationArea);\r\n}\r\n\r\nfunction launchSummary(status: LaunchValidationReport['status'], blockerCount: number): string {\r\n if (status === 'no-go') {\r\n return `${blockerCount} launch blocker${blockerCount === 1 ? '' : 's'}`;\r\n }\r\n if (status === 'go-with-warnings') {\r\n return 'Launchable only with remaining warnings and provider proof checks';\r\n }\r\n return 'No critical launch blockers detected';\r\n}\r\n", "import type {\r\n ProductionConnectionProvider,\r\n StackWiringArea,\r\n StackWiringKey,\r\n StackWiringProvider\r\n} from './types';\r\n\r\ntype SifgTemplateRegistryProvider =\r\n | StackWiringProvider\r\n | ProductionConnectionProvider\r\n | 'netlify'\r\n | 'aws'\r\n | 'playwright';\r\n\r\nexport interface SifgTemplate {\r\n id: string;\r\n label: string;\r\n registryProvider: SifgTemplateRegistryProvider;\r\n providerKey: StackWiringKey;\r\n area: StackWiringArea;\r\n sourceMatchers: Array<Record<string, string>>;\r\n requiredGuards: Array<{\r\n kind: string;\r\n symbols: string[];\r\n requiresEnvNames?: string[];\r\n mustPrecede: string[];\r\n }>;\r\n forbiddenFlows: Array<Record<string, string>>;\r\n repoFixPolicy: {\r\n allowedFileGlobs: string[];\r\n blockedFileGlobs: string[];\r\n requiresApproval: true;\r\n };\r\n}\r\n\r\nconst BLOCKED_PRODUCT_GLOBS = ['landing/**', 'services/api/**', 'marketing/**'];\r\n\r\nconst TEMPLATES: SifgTemplate[] = [\r\n {\r\n id: 'template:payments:stripe:webhook-ingress',\r\n label: 'Stripe webhook ingress',\r\n registryProvider: 'stripe',\r\n providerKey: 'stripe-payments',\r\n area: 'payments',\r\n sourceMatchers: [\r\n { kind: 'route-handler', framework: 'nextjs-app-router', routePattern: '/api/**/stripe/**', method: 'POST' },\r\n { kind: 'sdk-symbol', importName: 'stripe', member: 'webhooks.constructEvent' }\r\n ],\r\n requiredGuards: [\r\n {\r\n kind: 'signature-verifier',\r\n symbols: ['stripe.webhooks.constructEvent'],\r\n requiresEnvNames: ['STRIPE_WEBHOOK_SECRET'],\r\n mustPrecede: ['database-write', 'entitlement-update', 'provider-mutation']\r\n },\r\n {\r\n kind: 'idempotency-guard',\r\n symbols: ['event.id', 'idempotencyKey', 'processed_events'],\r\n mustPrecede: ['entitlement-update']\r\n }\r\n ],\r\n forbiddenFlows: [\r\n { from: 'request-body', to: 'database-write', unlessGuardedBy: 'signature-verifier' },\r\n { from: 'env:STRIPE_SECRET_KEY', to: 'client-bundle', severity: 'critical' }\r\n ],\r\n repoFixPolicy: {\r\n allowedFileGlobs: ['app/**/route.ts', 'src/server/**', 'lib/server/**'],\r\n blockedFileGlobs: BLOCKED_PRODUCT_GLOBS,\r\n requiresApproval: true\r\n }\r\n },\r\n {\r\n id: 'template:auth:protected-data-access',\r\n label: 'Protected data access',\r\n registryProvider: 'clerk',\r\n providerKey: 'clerk-auth',\r\n area: 'auth',\r\n sourceMatchers: [{ kind: 'route-handler', routePattern: '/api/**', method: 'ANY' }],\r\n requiredGuards: [{ kind: 'auth-guard', symbols: ['auth', 'getServerSession', 'currentUser'], mustPrecede: ['database-read', 'database-write'] }],\r\n forbiddenFlows: [{ from: 'private-data', to: 'response', unlessGuardedBy: 'auth-guard' }],\r\n repoFixPolicy: {\r\n allowedFileGlobs: ['app/**/route.ts', 'src/server/**', 'lib/server/**', 'middleware.ts', 'src/middleware.ts'],\r\n blockedFileGlobs: BLOCKED_PRODUCT_GLOBS,\r\n requiresApproval: true\r\n }\r\n },\r\n {\r\n id: 'template:database:supabase:service-role-boundary',\r\n label: 'Supabase service role boundary',\r\n registryProvider: 'supabase',\r\n providerKey: 'supabase-database',\r\n area: 'database',\r\n sourceMatchers: [{ kind: 'env-read', envName: 'SUPABASE_SERVICE_ROLE_KEY' }],\r\n requiredGuards: [{ kind: 'server-only-boundary', symbols: ['server-only'], mustPrecede: ['database-read', 'database-write'] }],\r\n forbiddenFlows: [{ from: 'env:SUPABASE_SERVICE_ROLE_KEY', to: 'client-bundle', severity: 'critical' }],\r\n repoFixPolicy: {\r\n allowedFileGlobs: ['src/server/**', 'lib/server/**', 'app/**/route.ts', 'supabase/**'],\r\n blockedFileGlobs: BLOCKED_PRODUCT_GLOBS,\r\n requiresApproval: true\r\n }\r\n },\r\n {\r\n id: 'template:security:public-route-abuse-guard',\r\n label: 'Public route abuse guard',\r\n registryProvider: 'rate-limit',\r\n providerKey: 'rate-limit-security',\r\n area: 'security',\r\n sourceMatchers: [{ kind: 'route-handler', routePattern: '/api/**', method: 'ANY' }],\r\n requiredGuards: [{ kind: 'rate-limit-guard', symbols: ['ratelimit', 'rateLimit', 'upstash'], mustPrecede: ['provider-mutation', 'database-write'] }],\r\n forbiddenFlows: [{ from: 'public-request', to: 'expensive-sink', unlessGuardedBy: 'rate-limit-guard' }],\r\n repoFixPolicy: {\r\n allowedFileGlobs: ['app/**/route.ts', 'src/server/**', 'lib/server/**'],\r\n blockedFileGlobs: BLOCKED_PRODUCT_GLOBS,\r\n requiresApproval: true\r\n }\r\n },\r\n {\r\n id: 'template:security:secret-boundary',\r\n label: 'Secret boundary',\r\n registryProvider: 'secrets-hygiene',\r\n providerKey: 'secrets-hygiene-security',\r\n area: 'security',\r\n sourceMatchers: [{ kind: 'env-read', envName: '*' }],\r\n requiredGuards: [{ kind: 'server-only-boundary', symbols: ['server-only'], mustPrecede: ['client-bundle'] }],\r\n forbiddenFlows: [{ from: 'env:*', to: 'client-bundle', severity: 'critical' }],\r\n repoFixPolicy: {\r\n allowedFileGlobs: ['src/**', 'lib/**', 'app/**'],\r\n blockedFileGlobs: BLOCKED_PRODUCT_GLOBS,\r\n requiresApproval: true\r\n }\r\n },\r\n {\r\n id: 'template:errorHandling:safe-error-response',\r\n label: 'Safe error response',\r\n registryProvider: 'sentry',\r\n providerKey: 'sentry-error-handling',\r\n area: 'errorHandling',\r\n sourceMatchers: [{ kind: 'throw-or-catch', routePattern: '/api/**' }],\r\n requiredGuards: [{ kind: 'error-capture', symbols: ['Sentry.captureException', 'captureException'], mustPrecede: ['safe-response'] }],\r\n forbiddenFlows: [{ from: 'provider-error', to: 'client-response', unlessGuardedBy: 'safe-response' }],\r\n repoFixPolicy: {\r\n allowedFileGlobs: ['app/**/route.ts', 'src/server/**', 'lib/server/**'],\r\n blockedFileGlobs: BLOCKED_PRODUCT_GLOBS,\r\n requiresApproval: true\r\n }\r\n }\r\n];\r\n\r\nexport const SIFG_TEMPLATE_IDS = TEMPLATES.map((template) => template.id);\r\n\r\nexport function allSifgTemplates(): SifgTemplate[] {\r\n return TEMPLATES.map((template) => ({\r\n ...template,\r\n sourceMatchers: template.sourceMatchers.map((matcher) => ({ ...matcher })),\r\n requiredGuards: template.requiredGuards.map((guard) => ({\r\n ...guard,\r\n symbols: [...guard.symbols],\r\n requiresEnvNames: guard.requiresEnvNames ? [...guard.requiresEnvNames] : undefined,\r\n mustPrecede: [...guard.mustPrecede]\r\n })),\r\n forbiddenFlows: template.forbiddenFlows.map((flow) => ({ ...flow })),\r\n repoFixPolicy: {\r\n allowedFileGlobs: [...template.repoFixPolicy.allowedFileGlobs],\r\n blockedFileGlobs: [...template.repoFixPolicy.blockedFileGlobs],\r\n requiresApproval: true\r\n }\r\n }));\r\n}\r\n\r\nexport function sifgTemplatesForProviderKey(providerKey: StackWiringKey): SifgTemplate[] {\r\n return allSifgTemplates().filter((template) => template.providerKey === providerKey);\r\n}\r\n\r\nexport function sifgTemplatesForRegistryProviderArea(\r\n registryProvider: SifgTemplateRegistryProvider,\r\n area: StackWiringArea\r\n): SifgTemplate[] {\r\n return allSifgTemplates().filter((template) =>\r\n template.registryProvider === registryProvider && template.area === area\r\n );\r\n}\r\n", "import type {\r\n ProductionConnectionArea,\r\n ProductionConnectionProvider,\r\n ProviderMcpTemplate,\r\n ProviderRegistryEntry,\r\n ProviderRegistrySnapshot,\r\n ProviderRegistryStatus,\r\n StackWiringArea,\r\n StackWiringKey\r\n} from './types';\r\nimport { sifgTemplatesForRegistryProviderArea } from './sifgTemplates';\r\n\r\nexport const PROVIDER_REGISTRY_STALE_AFTER_DAYS = 45;\r\n\r\ntype RegistryProvider = ProviderRegistryEntry['provider'];\r\ntype NonProductionRegistryProvider = Exclude<RegistryProvider, ProductionConnectionProvider>;\r\ntype ProviderSeedBase = Omit<ProviderRegistryEntry, 'provider' | 'productionAreas' | 'status'>;\r\ntype ProductionProviderSeed = ProviderSeedBase & {\r\n provider: ProductionConnectionProvider;\r\n productionAreas: ProductionConnectionArea[];\r\n};\r\ntype NonProductionProviderSeed = ProviderSeedBase & {\r\n provider: NonProductionRegistryProvider;\r\n productionAreas: [];\r\n};\r\ntype ProviderSeed = ProductionProviderSeed | NonProductionProviderSeed;\r\n\r\nconst PROVIDERS: ProviderSeed[] = [\r\n provider('supabase', 'Supabase', ['supabase'], ['database', 'landing'], ['database', 'auth'], 'supabase', {\r\n docsUrl: 'https://supabase.com/docs',\r\n dashboardUrl: 'https://supabase.com/dashboard',\r\n mcp: {\r\n label: 'Supabase',\r\n serverName: 'supabase',\r\n vscodeServer: { type: 'http', url: 'https://mcp.supabase.com/mcp?read_only=true' },\r\n cursorServer: { url: 'https://mcp.supabase.com/mcp?read_only=true' },\r\n keyInstructions: 'For hosted Supabase MCP, no API key goes in this file. Your IDE opens browser OAuth after you add the server. A Supabase access token is only needed for CI/manual-header setups, where it is passed as Authorization: Bearer ${SUPABASE_ACCESS_TOKEN}.'\r\n },\r\n verification: { supportsReadOnly: true }\r\n }),\r\n provider('supabase-auth', 'Supabase Auth', ['supabaseauth'], ['auth'], [], 'supabase', {\r\n docsUrl: 'https://supabase.com/docs/guides/auth',\r\n dashboardUrl: 'https://supabase.com/dashboard'\r\n }),\r\n provider('clerk', 'Clerk', ['clerk'], ['auth'], ['auth'], 'clerk', {\r\n docsUrl: 'https://clerk.com/docs',\r\n dashboardUrl: 'https://dashboard.clerk.com',\r\n mcp: {\r\n label: 'Clerk',\r\n serverName: 'clerk',\r\n vscodeServer: { type: 'http', url: 'https://mcp.clerk.com/mcp' },\r\n cursorServer: { url: 'https://mcp.clerk.com/mcp' },\r\n keyInstructions: 'Clerk MCP uses your Clerk credentials. If your IDE asks for a token, create one from the Clerk Dashboard developer settings.'\r\n },\r\n verification: { supportsReadOnly: true }\r\n }),\r\n provider('authjs', 'Auth.js', ['authjs', 'auth', 'nextauth'], ['auth'], ['auth'], 'authjs', {\n docsUrl: 'https://authjs.dev'\n }),\n provider('auth0', 'Auth0', ['auth0'], ['auth'], ['auth'], 'auth0', {\n docsUrl: 'https://auth0.com/docs',\n dashboardUrl: 'https://manage.auth0.com'\n }),\n provider('better-auth', 'Better Auth', ['betterauth', 'better-auth'], ['auth'], ['auth'], 'better-auth', {\n docsUrl: 'https://www.better-auth.com/docs'\n }),\n provider('firebase', 'Firebase', ['firebase', 'firestore'], ['database'], ['database'], 'firebase', {\n docsUrl: 'https://firebase.google.com/docs',\n dashboardUrl: 'https://console.firebase.google.com'\n }),\n provider('neon', 'Neon', ['neon'], ['database'], ['database'], 'neon', {\n docsUrl: 'https://neon.tech/docs',\n dashboardUrl: 'https://console.neon.tech',\n mcp: {\r\n label: 'Neon',\r\n serverName: 'neon',\r\n vscodeServer: { type: 'http', url: 'https://mcp.neon.tech/mcp' },\r\n cursorServer: { url: 'https://mcp.neon.tech/mcp' },\r\n keyInstructions: 'Neon MCP normally opens browser OAuth. Use Neon project/database credentials only when your IDE asks for them.'\r\n },\r\n verification: { supportsReadOnly: true }\r\n }),\r\n provider('planetscale', 'PlanetScale', ['planetscale'], ['database'], ['database'], 'planetscale', {\r\n docsUrl: 'https://planetscale.com/docs',\r\n dashboardUrl: 'https://app.planetscale.com',\r\n mcp: {\r\n label: 'PlanetScale',\r\n serverName: 'planetscale',\r\n vscodeServer: { type: 'http', url: 'https://mcp.pscale.dev/mcp/planetscale' },\r\n cursorServer: { url: 'https://mcp.pscale.dev/mcp/planetscale' },\r\n keyInstructions: 'PlanetScale MCP normally opens browser OAuth. Use a PlanetScale service token only for local/manual fallback setups.'\r\n },\r\n verification: { supportsReadOnly: true }\r\n }),\r\n provider('mongodb', 'MongoDB Atlas', ['mongodb', 'mongodbatlas'], ['database'], ['database'], 'mongodb', {\r\n docsUrl: 'https://www.mongodb.com/docs',\r\n dashboardUrl: 'https://cloud.mongodb.com',\r\n mcp: {\r\n label: 'MongoDB',\r\n serverName: 'mongodb',\r\n vscodeServer: { type: 'stdio', command: 'npx', args: ['-y', 'mongodb-mcp-server', '--connectionString', 'mongodb://localhost:27017/myDatabase', '--readOnly'] },\r\n cursorServer: { command: 'npx', args: ['-y', 'mongodb-mcp-server', '--connectionString', 'mongodb://localhost:27017/myDatabase', '--readOnly'] },\r\n keyInstructions: 'MongoDB MCP runs locally. Replace the connection string placeholder with a local or Atlas connection string and keep readOnly until you trust the workflow.'\r\n },\r\n verification: { supportsReadOnly: false }\r\n }),\r\n provider('turso', 'Turso', ['turso'], ['database'], ['database'], 'turso', {\r\n docsUrl: 'https://docs.turso.tech',\r\n dashboardUrl: 'https://app.turso.tech'\r\n }),\r\n provider('stripe', 'Stripe', ['stripe'], ['payments'], ['payments'], 'stripe', {\r\n docsUrl: 'https://docs.stripe.com',\r\n dashboardUrl: 'https://dashboard.stripe.com',\r\n mcp: {\r\n label: 'Stripe',\r\n serverName: 'stripe',\r\n vscodeServer: { type: 'http', url: 'https://mcp.stripe.com' },\r\n cursorServer: { url: 'https://mcp.stripe.com' },\r\n keyInstructions: 'Stripe remote MCP normally authenticates with OAuth in the IDE. For local or custom bearer-token setups, use a restricted Stripe secret key from Developers > API keys.'\r\n },\r\n verification: { supportsReadOnly: true }\r\n }),\r\n provider('paddle', 'Paddle', ['paddle'], ['payments'], ['payments'], 'paddle', {\n docsUrl: 'https://developer.paddle.com',\n dashboardUrl: 'https://vendors.paddle.com',\n mcp: {\r\n label: 'Paddle',\r\n serverName: 'paddle',\r\n vscodeServer: { type: 'stdio', command: 'npx', args: ['-y', '@paddle/paddle-mcp', '--api-key=YOUR_API_KEY', '--environment=sandbox', '--tools=non-destructive'] },\r\n cursorServer: { command: 'npx', args: ['-y', '@paddle/paddle-mcp', '--api-key=YOUR_API_KEY', '--environment=sandbox', '--tools=non-destructive'] },\r\n keyInstructions: 'Paddle MCP needs your Paddle authentication. Replace YOUR_API_KEY with a sandbox or production API key before enabling write-capable tools.'\r\n },\n verification: { supportsReadOnly: false }\n }),\n provider('polar', 'Polar', ['polar', 'polarsh'], ['payments'], ['payments'], 'polar', {\n docsUrl: 'https://polar.sh/docs',\n dashboardUrl: 'https://polar.sh/dashboard',\n verification: { supportsReadOnly: false }\n }),\n provider('lemon-squeezy', 'Lemon Squeezy', ['lemonsqueezy', 'lemon-squeezy', 'lemon squeezy'], ['payments'], ['payments'], 'lemon-squeezy', {\n docsUrl: 'https://docs.lemonsqueezy.com',\n dashboardUrl: 'https://app.lemonsqueezy.com'\n }),\n provider('vercel', 'Vercel', ['vercel'], ['deployment'], ['deployment'], 'vercel', {\n docsUrl: 'https://vercel.com/docs',\r\n dashboardUrl: 'https://vercel.com/dashboard',\r\n mcp: {\r\n label: 'Vercel',\r\n serverName: 'vercel',\r\n vscodeServer: { type: 'http', url: 'https://mcp.vercel.com' },\r\n cursorServer: { url: 'https://mcp.vercel.com' },\r\n keyInstructions: 'Vercel MCP is a remote OAuth server. Finish the browser sign-in your IDE opens; only use a Vercel token for a separate CLI/local fallback.'\r\n },\r\n verification: { supportsReadOnly: true }\r\n }),\r\n provider('netlify', 'Netlify', ['netlify'], ['deployment'], ['deployment'], 'netlify', {\n docsUrl: 'https://docs.netlify.com',\r\n dashboardUrl: 'https://app.netlify.com',\r\n mcp: {\r\n label: 'Netlify',\r\n serverName: 'netlify',\r\n vscodeServer: { type: 'stdio', command: 'npx', args: ['-y', '@netlify/mcp'] },\r\n cursorServer: { command: 'npx', args: ['-y', '@netlify/mcp'] },\r\n keyInstructions: 'Netlify MCP uses Netlify authentication from the IDE or CLI. Finish the browser sign-in or token prompt it opens.'\r\n },\r\n verification: { supportsReadOnly: false }\r\n }),\n provider('render', 'Render', ['render', 'rendercom'], ['deployment'], ['deployment'], 'render', {\n docsUrl: 'https://render.com/docs',\n dashboardUrl: 'https://dashboard.render.com'\n }),\n provider('railway', 'Railway', ['railway', 'railwayapp'], ['deployment'], ['deployment'], 'railway', {\n docsUrl: 'https://docs.railway.com',\n dashboardUrl: 'https://railway.com'\n }),\n provider('cloudflare', 'Cloudflare', ['cloudflare', 'cloudflarepages', 'workers'], ['deployment'], ['deployment'], 'cloudflare', {\n docsUrl: 'https://developers.cloudflare.com',\n dashboardUrl: 'https://dash.cloudflare.com',\n mcp: {\n label: 'Cloudflare',\n serverName: 'cloudflare-api',\n vscodeServer: { type: 'http', url: 'https://mcp.cloudflare.com/mcp' },\n cursorServer: { url: 'https://mcp.cloudflare.com/mcp' },\n keyInstructions: 'Cloudflare MCP uses Cloudflare account authentication. Finish browser sign-in or provide an API token only when prompted.'\n },\n verification: { supportsReadOnly: true }\n }),\n provider('aws', 'AWS', ['aws'], ['deployment'], ['deployment'], 'aws', {\n docsUrl: 'https://docs.aws.amazon.com',\r\n dashboardUrl: 'https://console.aws.amazon.com'\r\n }),\r\n provider('sentry', 'Sentry', ['sentry'], ['monitoring', 'errorHandling'], ['monitoring'], 'sentry', {\r\n docsUrl: 'https://docs.sentry.io',\r\n dashboardUrl: 'https://sentry.io',\r\n mcp: {\r\n label: 'Sentry',\r\n serverName: 'sentry',\r\n vscodeServer: { type: 'http', url: 'https://mcp.sentry.dev/mcp' },\r\n cursorServer: { url: 'https://mcp.sentry.dev/mcp' },\r\n keyInstructions: 'Sentry MCP is a remote MCP server. Finish the IDE/browser authentication flow; only use a Sentry auth token for separate local or CLI fallback setups.'\r\n },\r\n verification: { supportsReadOnly: true }\r\n }),\r\n provider('posthog', 'PostHog', ['posthog'], ['monitoring', 'errorHandling', 'landing'], ['monitoring'], 'posthog', {\r\n docsUrl: 'https://posthog.com/docs',\r\n dashboardUrl: 'https://app.posthog.com',\r\n mcp: {\r\n label: 'PostHog',\r\n serverName: 'posthog',\r\n vscodeServer: { type: 'http', url: 'https://mcp.posthog.com/mcp' },\r\n cursorServer: { url: 'https://mcp.posthog.com/mcp' },\r\n keyInstructions: 'PostHog MCP opens an authentication flow. Use a PostHog personal API key only if the IDE or local fallback asks for one.'\r\n },\r\n verification: { supportsReadOnly: true }\r\n }),\r\n provider('logrocket', 'LogRocket', ['logrocket'], ['monitoring'], ['monitoring'], 'logrocket', {\n docsUrl: 'https://docs.logrocket.com',\n dashboardUrl: 'https://app.logrocket.com'\n }),\n provider('github', 'GitHub Actions', ['github', 'githubactions'], ['testing'], [], 'github', {\n docsUrl: 'https://docs.github.com/actions',\n dashboardUrl: 'https://github.com',\n mcp: {\n label: 'GitHub',\n serverName: 'github',\n vscodeServer: { type: 'http', url: 'https://api.githubcopilot.com/mcp/' },\n cursorServer: { url: 'https://api.githubcopilot.com/mcp/' },\n keyInstructions: 'GitHub MCP should use IDE/GitHub authentication. Use read-only repository, Actions, and branch-protection queries for verification.'\n },\n verification: { supportsReadOnly: true }\n }),\n provider('playwright', 'Playwright', ['playwright', 'playwrighttest'], ['testing'], [], 'playwright', {\n docsUrl: 'https://playwright.dev/docs/intro',\n mcp: {\r\n label: 'Playwright',\r\n serverName: 'playwright',\r\n vscodeServer: { type: 'stdio', command: 'npx', args: ['-y', '@playwright/mcp@latest'] },\r\n cursorServer: { command: 'npx', args: ['-y', '@playwright/mcp@latest'] },\r\n keyInstructions: 'Playwright MCP runs locally through npx and normally does not need an API key.'\r\n },\r\n verification: { supportsReadOnly: false }\r\n }),\r\n provider('rate-limit', 'Rate limiting', ['upstash', 'upstashratelimit', 'ratelimit', 'ratelimiting', 'expressratelimit'], ['security'], ['security'], 'rate-limit', {\r\n docsUrl: 'https://upstash.com/docs/redis/sdks/ratelimit/overview',\r\n dashboardUrl: 'https://console.upstash.com',\r\n mcp: {\r\n label: 'Upstash',\r\n serverName: 'upstash',\r\n vscodeServer: { type: 'stdio', command: 'npx', args: ['-y', '@upstash/mcp-server@latest', '--email', '<UPSTASH_EMAIL>', '--api-key', '<UPSTASH_API_KEY>'] },\r\n cursorServer: { command: 'npx', args: ['-y', '@upstash/mcp-server@latest', '--email', '<UPSTASH_EMAIL>', '--api-key', '<UPSTASH_API_KEY>'] },\r\n keyInstructions: 'Upstash MCP needs your Upstash account email and API key. Replace the placeholders before enabling the server.'\r\n },\r\n verification: { supportsReadOnly: false }\r\n }),\r\n provider('bot-protection', 'Bot protection', ['botprotection', 'cloudflareturnstile', 'turnstile'], ['security'], ['security'], 'bot-protection', {\n docsUrl: 'https://developers.cloudflare.com/turnstile',\r\n dashboardUrl: 'https://dash.cloudflare.com',\r\n mcp: {\r\n label: 'Cloudflare',\r\n serverName: 'cloudflare-api',\r\n vscodeServer: { type: 'http', url: 'https://mcp.cloudflare.com/mcp' },\r\n cursorServer: { url: 'https://mcp.cloudflare.com/mcp' },\r\n keyInstructions: 'Cloudflare MCP uses Cloudflare account authentication. Finish browser sign-in or provide an API token only when prompted.'\r\n },\r\n verification: { supportsReadOnly: true }\r\n }),\r\n provider('secrets-hygiene', 'Secrets hygiene', ['secretshygiene', 'envhygiene'], ['security'], ['security'], 'secrets-hygiene'),\r\n provider('figma', 'Figma', ['figma'], ['appFlow'], [], 'figma', { docsUrl: 'https://help.figma.com' }),\r\n provider('storybook', 'Storybook', ['storybook'], ['appFlow'], [], 'storybook', { docsUrl: 'https://storybook.js.org/docs' }),\r\n provider('product-spec', 'Product Spec', ['productspec', 'prd'], ['appFlow'], [], 'product-spec'),\r\n provider('route-map', 'Route Map', ['routemap', 'routes'], ['appFlow'], [], 'route-map'),\r\n provider('react', 'React', ['react', 'reactjs'], ['frontend'], [], 'react', { docsUrl: 'https://react.dev' }),\r\n provider('vue', 'Vue', ['vue', 'vuejs'], ['frontend'], [], 'vue', { docsUrl: 'https://vuejs.org/guide' }),\r\n provider('svelte', 'Svelte', ['svelte', 'sveltekit'], ['frontend'], [], 'svelte', { docsUrl: 'https://svelte.dev/docs' }),\r\n provider('angular', 'Angular', ['angular'], ['frontend'], [], 'angular', { docsUrl: 'https://angular.dev' }),\r\n provider('node', 'Node.js', ['node', 'nodejs', 'node.js'], ['backend'], [], 'nodejs', { docsUrl: 'https://nodejs.org/docs/latest/api' }),\r\n provider('python', 'Python / FastAPI', ['python', 'pythonfastapi', 'fastapi'], ['backend'], [], 'python', { docsUrl: 'https://fastapi.tiangolo.com' }),\r\n provider('rails', 'Rails', ['rails', 'rubyonrails'], ['backend'], [], 'rails', { docsUrl: 'https://guides.rubyonrails.org' }),\r\n provider('go', 'Go', ['go', 'golang'], ['backend'], [], 'go', { docsUrl: 'https://go.dev/doc' }),\r\n provider('vitest', 'Vitest', ['vitest'], ['testing'], [], 'vitest', { docsUrl: 'https://vitest.dev' })\r\n];\r\n\r\nconst PROVIDERS_BY_KEY = new Map<string, ProviderSeed>(PROVIDERS.map((entry) => [entry.provider, entry]));\r\nconst PROVIDERS_BY_ALIAS = new Map<string, ProviderSeed>();\r\nfor (const entry of PROVIDERS) {\r\n PROVIDERS_BY_ALIAS.set(normalizeProviderToken(entry.provider), entry);\r\n for (const alias of entry.aliases) {\r\n PROVIDERS_BY_ALIAS.set(normalizeProviderToken(alias), entry);\r\n }\r\n}\r\n\r\nexport function getProviderRegistryEntry(provider: string): ProviderRegistryEntry | null {\r\n const entry = PROVIDERS_BY_ALIAS.get(normalizeProviderToken(provider)) ?? null;\r\n return entry ? withStatus(entry, new Date()) : null;\r\n}\r\n\r\nexport function normalizeProviderKey(provider: string): string {\r\n return PROVIDERS_BY_ALIAS.get(normalizeProviderToken(provider))?.provider ?? normalizeProviderToken(provider);\r\n}\r\n\r\nexport function providerLabel(provider: string): string {\r\n return getProviderRegistryEntry(provider)?.label ?? titleizeProvider(provider);\r\n}\r\n\r\nexport function productionProviders(): ProductionConnectionProvider[] {\r\n return PROVIDERS\r\n .filter(isProductionProviderSeed)\r\n .map((entry) => entry.provider);\r\n}\r\n\r\nexport function productionProvidersByArea(): Record<ProductionConnectionArea, readonly ProductionConnectionProvider[]> {\r\n return {\r\n database: providersForProductionArea('database'),\r\n auth: providersForProductionArea('auth'),\r\n payments: providersForProductionArea('payments'),\r\n deployment: providersForProductionArea('deployment'),\r\n monitoring: providersForProductionArea('monitoring'),\r\n security: providersForProductionArea('security')\r\n };\r\n}\r\n\r\nexport function mcpTemplateForProvider(provider: string): ProviderMcpTemplate | null {\r\n const normalized = normalizeProviderKey(provider);\r\n const entry = PROVIDERS_BY_KEY.get(normalized);\r\n if (entry?.mcp) {\r\n return cloneMcpTemplate(entry.mcp);\r\n }\r\n if (normalized === 'supabase-auth') {\r\n const supabaseMcp = PROVIDERS_BY_KEY.get('supabase')?.mcp;\r\n return supabaseMcp ? cloneMcpTemplate(supabaseMcp) : null;\r\n }\r\n return null;\r\n}\r\n\r\nexport function stackWiringKeyHasMcp(key: StackWiringKey): boolean {\r\n return Boolean(mcpTemplateForProvider(providerFromStackWiringKey(key)));\r\n}\r\n\r\nexport function mcpProviderIdForStackWiringKey(key: StackWiringKey): string | null {\r\n const provider = providerFromStackWiringKey(key);\r\n return mcpTemplateForProvider(provider) ? mcpServerProviderId(provider) : null;\r\n}\r\n\r\nexport function buildProviderRegistrySnapshot(now = new Date()): ProviderRegistrySnapshot {\r\n const providers = PROVIDERS.map((entry) => withStatus(entry, now));\r\n return {\r\n version: 1,\r\n source: 'bundled',\r\n generatedAt: now.toISOString(),\r\n staleAfterDays: PROVIDER_REGISTRY_STALE_AFTER_DAYS,\r\n status: providers.some((entry) => entry.status === 'stale') ? 'stale' : 'fresh',\r\n providers\r\n };\r\n}\r\n\r\nfunction provider(\r\n providerKey: ProductionConnectionProvider,\r\n label: string,\r\n aliases: string[],\r\n areas: StackWiringArea[],\r\n productionAreas: ProductionConnectionArea[],\r\n iconKey: string,\r\n extras?: Partial<Omit<ProviderSeedBase, 'label' | 'aliases' | 'areas' | 'iconKey' | 'verifiedAt'>>\r\n): ProductionProviderSeed;\r\nfunction provider(\r\n providerKey: NonProductionRegistryProvider,\r\n label: string,\r\n aliases: string[],\r\n areas: StackWiringArea[],\r\n productionAreas: [],\r\n iconKey: string,\r\n extras?: Partial<Omit<ProviderSeedBase, 'label' | 'aliases' | 'areas' | 'iconKey' | 'verifiedAt'>>\r\n): NonProductionProviderSeed;\r\nfunction provider(\r\n providerKey: RegistryProvider,\r\n label: string,\r\n aliases: string[],\r\n areas: StackWiringArea[],\r\n productionAreas: ProductionConnectionArea[],\r\n iconKey: string,\r\n extras: Partial<Omit<ProviderSeedBase, 'label' | 'aliases' | 'areas' | 'iconKey' | 'verifiedAt'>> = {}\r\n): ProviderSeed {\r\n const sifgTemplateIds = areas\n .flatMap((area) => sifgTemplatesForRegistryProviderArea(providerKey as never, area))\n .map((template) => template.id);\r\n\r\n return {\r\n provider: providerKey,\r\n label,\r\n aliases,\r\n areas,\r\n productionAreas,\r\n iconKey,\r\n verifiedAt: '2026-05-18',\r\n ...(sifgTemplateIds.length > 0 ? { sifgTemplateIds } : {}),\r\n ...extras\r\n } as ProviderSeed;\r\n}\r\n\r\nfunction providersForProductionArea(area: ProductionConnectionArea): ProductionConnectionProvider[] {\r\n return PROVIDERS\r\n .filter(isProductionProviderSeed)\r\n .filter((entry) => entry.productionAreas.includes(area))\r\n .map((entry) => entry.provider);\r\n}\r\n\r\nfunction isProductionProviderSeed(entry: ProviderSeed): entry is ProductionProviderSeed {\r\n return entry.productionAreas.length > 0;\r\n}\r\n\r\nfunction withStatus(entry: ProviderSeed, now: Date): ProviderRegistryEntry {\r\n const mcp = entry.mcp ? cloneMcpTemplate(entry.mcp) : undefined;\r\n const verification = entry.verification ? { ...entry.verification } : undefined;\r\n return {\r\n provider: entry.provider,\r\n label: entry.label,\r\n aliases: [...entry.aliases],\r\n areas: [...entry.areas],\r\n productionAreas: [...entry.productionAreas],\r\n iconKey: entry.iconKey,\r\n ...(entry.sifgTemplateIds ? { sifgTemplateIds: [...entry.sifgTemplateIds] } : {}),\r\n ...(entry.docsUrl ? { docsUrl: entry.docsUrl } : {}),\r\n ...(entry.dashboardUrl ? { dashboardUrl: entry.dashboardUrl } : {}),\r\n ...(mcp ? { mcp } : {}),\r\n ...(verification ? { verification } : {}),\r\n verifiedAt: entry.verifiedAt,\r\n status: registryStatus(entry.verifiedAt, now)\r\n };\r\n}\r\n\r\nfunction cloneMcpTemplate(template: ProviderMcpTemplate): ProviderMcpTemplate {\r\n return {\r\n label: template.label,\r\n serverName: template.serverName,\r\n vscodeServer: cloneRecord(template.vscodeServer),\r\n cursorServer: cloneRecord(template.cursorServer),\r\n keyInstructions: template.keyInstructions\r\n };\r\n}\r\n\r\nfunction cloneRecord(record: Record<string, unknown>): Record<string, unknown> {\r\n return Object.fromEntries(\r\n Object.entries(record).map(([key, value]) => [key, cloneUnknown(value)])\r\n );\r\n}\r\n\r\nfunction cloneUnknown(value: unknown): unknown {\r\n if (Array.isArray(value)) {\r\n return value.map(cloneUnknown);\r\n }\r\n if (value && typeof value === 'object') {\r\n return cloneRecord(value as Record<string, unknown>);\r\n }\r\n return value;\r\n}\r\n\r\nfunction registryStatus(verifiedAt: string, now: Date): ProviderRegistryStatus {\r\n const verifiedTime = Date.parse(`${verifiedAt}T00:00:00.000Z`);\r\n if (Number.isNaN(verifiedTime)) {\r\n return 'stale';\r\n }\r\n const ageMs = now.getTime() - verifiedTime;\r\n return ageMs > PROVIDER_REGISTRY_STALE_AFTER_DAYS * 24 * 60 * 60 * 1000 ? 'stale' : 'fresh';\r\n}\r\n\r\nfunction normalizeProviderToken(provider: string): string {\r\n return provider\r\n .toLowerCase()\r\n .replace(/&/g, 'and')\r\n .replace(/[^a-z0-9]+/g, '');\r\n}\r\n\r\nfunction providerFromStackWiringKey(key: StackWiringKey): string {\r\n return key\r\n .replace(/-(app-flow|frontend|backend|security|auth|database|payments|deployment|landing|monitoring|testing|error-handling)$/, '')\r\n .replace(/^supabase-database$/, 'supabase')\r\n .replace(/^supabase-landing$/, 'supabase')\r\n .replace(/^supabase-auth$/, 'supabase-auth');\r\n}\r\n\r\nfunction mcpServerProviderId(provider: string): string {\r\n if (provider === 'supabase-auth') {\r\n return 'supabase';\r\n }\r\n if (provider === 'rate-limit') {\r\n return 'upstash';\r\n }\r\n if (provider === 'bot-protection') {\r\n return 'cloudflare';\r\n }\r\n return provider;\r\n}\r\n\r\nfunction titleizeProvider(provider: string): string {\r\n return provider.replace(/(^|-)([a-z])/g, (_match, prefix: string, letter: string) =>\r\n `${prefix ? ' ' : ''}${letter.toUpperCase()}`\r\n );\r\n}\r\n", "import type {\r\n McpVerifierStateSnapshot,\r\n RepositoryEvidenceSummary,\r\n ScanResult,\r\n StackWiringArea,\r\n StackWiringSummary\r\n} from '../types';\r\n\r\nexport type VerificationProviderId = 'vercel' | 'supabase' | 'stripe' | 'github';\r\n\r\nexport type ProviderConnectionState =\r\n | 'not_configured'\r\n | 'configured'\r\n | 'connected'\r\n | 'failed'\r\n | 'unsupported'\r\n | 'unknown_runtime';\r\n\r\n/** Where proof for this check is expected to come from. */\r\nexport type EvidenceSource = 'repo' | 'provider' | 'manual' | 'mcp';\r\n\r\n/** Outcome of a check \u2014 separate from evidence source. */\r\nexport type VerificationResultStatus =\r\n | 'verified'\r\n | 'missing'\r\n | 'unknown'\r\n | 'needs_mcp'\r\n | 'manual';\r\n\r\nexport type VerificationFixType =\r\n | 'repo-fix'\r\n | 'provider-config'\r\n | 'manual-dashboard'\r\n | 'mcp-connect';\r\n\r\nexport type VerificationSeverity = 'critical' | 'warning' | 'info';\r\n\r\nexport interface Provider {\r\n id: VerificationProviderId;\r\n label: string;\r\n areas: StackWiringArea[];\r\n}\r\n\r\nexport interface VerificationCheck {\r\n id: string;\r\n provider: VerificationProviderId;\r\n area: StackWiringArea;\r\n title: string;\r\n description: string;\r\n requiredEvidence: string[];\r\n repoSignals: string[];\r\n providerSignals: string[];\r\n evidenceSource: EvidenceSource;\r\n status: VerificationResultStatus;\r\n fixType: VerificationFixType;\r\n severity: VerificationSeverity;\r\n evidenceRefs: string[];\r\n manualAction?: string;\r\n}\r\n\r\nexport interface RepoProviderDiff {\r\n id: string;\r\n provider: VerificationProviderId;\r\n area: StackWiringArea;\r\n title: string;\r\n description: string;\r\n repoExpectation: string;\r\n providerActual: string;\r\n severity: VerificationSeverity;\r\n suggestedFix: VerificationFixType;\r\n evidenceRefs: string[];\r\n}\r\n\r\nexport interface ProviderConfigDetection {\r\n provider: VerificationProviderId;\r\n detected: boolean;\r\n signals: string[];\r\n}\r\n\r\nexport interface ProviderVerifierResult {\r\n provider: VerificationProviderId;\r\n connectionState: ProviderConnectionState;\r\n config: ProviderConfigDetection;\r\n checks: VerificationCheck[];\r\n diffs: RepoProviderDiff[];\r\n repoReadinessPercent: number;\r\n providerReadinessPercent: number;\r\n}\r\n\r\nexport interface VerificationLayerSnapshot {\r\n version: 1;\r\n generatedAt: string;\r\n runtimeMode: 'mock' | 'mcp';\r\n providers: ProviderVerifierResult[];\r\n checks: VerificationCheck[];\r\n diffs: RepoProviderDiff[];\r\n repoReadinessPercent: number;\r\n providerReadinessPercent: number;\r\n}\r\n\r\nexport interface VerifierContext {\r\n workspaceRoot: string;\r\n scan: ScanResult;\r\n stackWiring: StackWiringSummary;\r\n repositoryEvidence: RepositoryEvidenceSummary;\r\n mcpVerifierState?: McpVerifierStateSnapshot;\r\n}\r\n\r\nexport interface ProviderVerifier {\r\n readonly provider: VerificationProviderId;\r\n detectConfig(ctx: VerifierContext): ProviderConfigDetection;\r\n connectStatus(ctx: VerifierContext): ProviderConnectionState;\r\n runChecks(ctx: VerifierContext): VerificationCheck[];\r\n buildDiffs(ctx: VerifierContext): RepoProviderDiff[];\r\n}\r\n\r\nexport function providerCheckId(provider: VerificationProviderId, checkKey: string): string {\r\n return `${provider}:${checkKey}`;\r\n}\r\n\r\nconst PROVIDER_CONNECTION_BLOCKS_VERIFY: ProviderConnectionState[] = [\r\n 'not_configured',\r\n 'configured',\r\n 'unknown_runtime',\r\n 'unsupported'\r\n];\r\n\r\nexport function coerceProviderVerificationStatus(\r\n status: VerificationResultStatus,\r\n connectionState: ProviderConnectionState\r\n): VerificationResultStatus {\r\n if (status !== 'verified') {\r\n return status;\r\n }\r\n if (PROVIDER_CONNECTION_BLOCKS_VERIFY.includes(connectionState)) {\r\n return connectionState === 'not_configured' || connectionState === 'configured'\r\n ? 'needs_mcp'\r\n : 'unknown';\r\n }\r\n return status;\r\n}\r\n\r\nexport function mapVerificationStatusToMissionStatus(\r\n status: VerificationResultStatus\r\n): 'passed' | 'missing' | 'unknown' | 'needs-connection' | 'manual-required' | 'failed' {\r\n switch (status) {\r\n case 'verified':\r\n return 'passed';\r\n case 'missing':\r\n return 'missing';\r\n case 'unknown':\r\n return 'unknown';\r\n case 'needs_mcp':\r\n return 'needs-connection';\r\n case 'manual':\r\n return 'manual-required';\r\n default:\r\n return 'failed';\r\n }\r\n}\r\n\r\nexport function mapEvidenceSourceToLegacyEvidenceClass(\r\n source: EvidenceSource,\r\n status: VerificationResultStatus\r\n): 'repo-verified' | 'missing-repo-fix' | 'mcp-verifier' | 'manual-dashboard' {\r\n if (source === 'repo') {\r\n return status === 'verified' ? 'repo-verified' : 'missing-repo-fix';\r\n }\r\n if (source === 'manual') {\r\n return 'manual-dashboard';\r\n }\r\n if (source === 'mcp') {\n return 'mcp-verifier';\n }\n return 'mcp-verifier';\n}\n\r\nexport function isProviderLayerCheck(check: VerificationCheck): boolean {\r\n return check.evidenceSource === 'provider' || check.evidenceSource === 'mcp';\r\n}\r\n\r\nexport function isRepoLayerCheck(check: VerificationCheck): boolean {\r\n return check.evidenceSource === 'repo';\r\n}\r\n\r\nexport function computeLayerReadinessPercent(\r\n checks: VerificationCheck[],\r\n layer: 'repo' | 'provider'\r\n): number {\r\n const filtered = checks.filter((check) =>\r\n layer === 'repo' ? isRepoLayerCheck(check) : isProviderLayerCheck(check)\r\n );\r\n if (filtered.length === 0) {\r\n return 100;\r\n }\r\n const verified = filtered.filter((check) => check.status === 'verified').length;\r\n return Math.round((verified / filtered.length) * 100);\r\n}\r\n\r\nexport function aggregateReadinessPercents(\r\n providerResults: ProviderVerifierResult[]\r\n): { repoReadinessPercent: number; providerReadinessPercent: number } {\r\n if (providerResults.length === 0) {\r\n return { repoReadinessPercent: 100, providerReadinessPercent: 100 };\r\n }\r\n const repoSum = providerResults.reduce((sum, r) => sum + r.repoReadinessPercent, 0);\r\n const providerSum = providerResults.reduce((sum, r) => sum + r.providerReadinessPercent, 0);\r\n return {\r\n repoReadinessPercent: Math.round(repoSum / providerResults.length),\r\n providerReadinessPercent: Math.round(providerSum / providerResults.length)\r\n };\r\n}\r\n", "import type {\r\n MissionCheck,\r\n MissionEvidenceClass,\r\n MissionGraph,\r\n ProviderMission,\r\n StackWiringArea,\r\n StackWiringKey\r\n} from '../types';\r\nimport {\r\n mapEvidenceSourceToLegacyEvidenceClass,\r\n mapVerificationStatusToMissionStatus,\r\n type VerificationCheck,\r\n type VerificationLayerSnapshot,\r\n type VerificationProviderId\r\n} from './types';\r\n\r\nconst PROVIDER_WIRING_KEY: Partial<Record<VerificationProviderId, StackWiringKey>> = {\r\n vercel: 'vercel-deployment',\r\n supabase: 'supabase-database',\r\n stripe: 'stripe-payments'\r\n};\r\n\r\nexport function mergeVerificationIntoMissionGraph(\r\n graph: MissionGraph,\r\n layer: VerificationLayerSnapshot\r\n): MissionGraph {\r\n const providerMissions = graph.areas.flatMap((area) => area.providerMissions);\r\n const missionByKey = new Map(providerMissions.map((mission) => [mission.key, mission]));\r\n\r\n for (const layerCheck of layer.checks) {\r\n if (layerCheck.evidenceSource === 'repo') {\r\n continue;\r\n }\r\n\r\n const mission = resolveTargetMission(graph, missionByKey, layerCheck);\r\n if (!mission) {\r\n continue;\r\n }\r\n\r\n if (mission.checks.some((check) => check.verificationCheckId === layerCheck.id || check.id === missionRowId(layerCheck.id))) {\r\n continue;\r\n }\r\n\r\n mission.checks.push(verificationCheckToMissionCheck(layerCheck, mission));\r\n }\r\n\r\n recomputeMissionReadiness(providerMissions);\r\n const areas = rebuildAreas(providerMissions);\r\n\r\n return {\r\n ...graph,\r\n areas,\r\n byArea: areas.reduce<MissionGraph['byArea']>((acc, area) => {\r\n acc[area.key] = area;\r\n return acc;\r\n }, {}),\r\n byProvider: providerMissions.reduce<MissionGraph['byProvider']>((acc, mission) => {\r\n acc[mission.key] = mission;\r\n return acc;\r\n }, {}),\r\n verificationLayer: layer\r\n };\r\n}\r\n\r\nfunction resolveTargetMission(\r\n graph: MissionGraph,\r\n missionByKey: Map<StackWiringKey, ProviderMission>,\r\n layerCheck: VerificationCheck\r\n): ProviderMission | undefined {\r\n const wiringKey = PROVIDER_WIRING_KEY[layerCheck.provider];\r\n if (wiringKey) {\r\n return missionByKey.get(wiringKey) ?? graph.byProvider[wiringKey];\r\n }\r\n\r\n if (layerCheck.provider === 'github') {\r\n return (\r\n missionByKey.get('vitest-testing') ??\r\n missionByKey.get('playwright-testing') ??\r\n ensureGitHubMission(graph, missionByKey, layerCheck.area)\r\n );\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction ensureGitHubMission(\r\n graph: MissionGraph,\r\n missionByKey: Map<StackWiringKey, ProviderMission>,\r\n area: StackWiringArea\r\n): ProviderMission {\r\n const key = 'vitest-testing' as StackWiringKey;\r\n const existing = missionByKey.get(key);\r\n if (existing) {\r\n return existing;\r\n }\r\n\r\n const mission: ProviderMission = {\r\n key,\r\n provider: 'vitest',\r\n providerLabel: 'GitHub Actions',\r\n area,\r\n promptSubject: 'GitHub Actions CI',\r\n readinessPercent: 0,\r\n repoReadinessPercent: 100,\r\n providerReadinessPercent: 0,\r\n checks: []\r\n };\r\n missionByKey.set(key, mission);\r\n const areaEntry = graph.areas.find((entry) => entry.key === area);\r\n if (areaEntry) {\r\n areaEntry.providerMissions.push(mission);\r\n }\r\n return mission;\r\n}\r\n\r\nfunction missionRowId(verificationCheckId: string): string {\r\n return `vl-${verificationCheckId}`;\r\n}\r\n\r\nfunction verificationCheckToMissionCheck(\r\n layerCheck: VerificationCheck,\r\n mission: ProviderMission\r\n): MissionCheck {\r\n const evidenceClass = legacyEvidenceClassFor(layerCheck);\r\n const status = mapVerificationStatusToMissionStatus(layerCheck.status);\r\n\r\n return {\r\n id: missionRowId(layerCheck.id),\r\n label: layerCheck.title,\r\n providerKey: mission.key,\r\n providerLabel: mission.providerLabel,\r\n area: layerCheck.area,\r\n evidenceClass,\r\n status,\r\n evidence: [...layerCheck.repoSignals, ...layerCheck.providerSignals, ...layerCheck.evidenceRefs],\r\n promptHint: layerCheck.manualAction ?? layerCheck.description,\r\n evidenceSource: layerCheck.evidenceSource,\r\n verificationStatus: layerCheck.status,\r\n verificationCheckId: layerCheck.id\r\n };\r\n}\r\n\r\nfunction legacyEvidenceClassFor(layerCheck: VerificationCheck): MissionEvidenceClass {\r\n return mapEvidenceSourceToLegacyEvidenceClass(layerCheck.evidenceSource, layerCheck.status);\r\n}\r\n\r\nfunction recomputeMissionReadiness(missions: ProviderMission[]): void {\r\n for (const mission of missions) {\r\n mission.repoReadinessPercent = readinessPercentForRepoChecks(mission.checks);\r\n mission.providerReadinessPercent = readinessPercentForProviderChecks(mission.checks);\r\n mission.readinessPercent = mission.repoReadinessPercent;\r\n }\r\n}\r\n\r\nexport function readinessPercentForRepoChecks(checks: MissionCheck[]): number {\r\n const repoChecks = checks.filter(isRepoLayerMissionCheck);\r\n if (repoChecks.length === 0) {\r\n return 100;\r\n }\r\n const verified = repoChecks.filter((check) => isVerifiedMissionCheck(check)).length;\r\n return Math.round((verified / repoChecks.length) * 100);\r\n}\r\n\r\nexport function readinessPercentForProviderChecks(checks: MissionCheck[]): number {\r\n const providerChecks = checks.filter(isProviderLayerMissionCheck);\r\n if (providerChecks.length === 0) {\r\n return 100;\r\n }\r\n const verified = providerChecks.filter((check) => isVerifiedMissionCheck(check)).length;\r\n return Math.round((verified / providerChecks.length) * 100);\r\n}\r\n\r\nfunction isRepoLayerMissionCheck(check: MissionCheck): boolean {\r\n if (check.evidenceSource === 'provider' || check.evidenceSource === 'mcp' || check.evidenceSource === 'manual') {\r\n return false;\r\n }\r\n if (check.evidenceSource === 'repo') {\r\n return true;\r\n }\r\n return check.evidenceClass === 'repo-verified' || check.evidenceClass === 'missing-repo-fix';\r\n}\r\n\r\nfunction isProviderLayerMissionCheck(check: MissionCheck): boolean {\r\n if (check.evidenceSource === 'provider' || check.evidenceSource === 'mcp') {\r\n return true;\r\n }\r\n return check.evidenceClass === 'mcp-verifier';\r\n}\r\n\r\nfunction isVerifiedMissionCheck(check: MissionCheck): boolean {\r\n if (check.verificationStatus) {\r\n return check.verificationStatus === 'verified';\r\n }\r\n return check.status === 'passed' || check.status === 'user-confirmed';\r\n}\r\n\r\nfunction rebuildAreas(providerMissions: ProviderMission[]): MissionGraph['areas'] {\r\n const byArea = new Map<StackWiringArea, ProviderMission[]>();\r\n for (const mission of providerMissions) {\r\n const list = byArea.get(mission.area) ?? [];\r\n list.push(mission);\r\n byArea.set(mission.area, list);\r\n }\r\n\r\n const AREA_LABELS: Record<StackWiringArea, string> = {\r\n appFlow: 'App Flow',\r\n frontend: 'Frontend',\r\n backend: 'Backend / API',\r\n database: 'Database',\r\n auth: 'Auth',\r\n payments: 'Payments',\r\n deployment: 'Deployment',\r\n monitoring: 'Monitoring',\r\n security: 'Security',\r\n testing: 'Testing',\r\n landing: 'Landing / Onboarding',\r\n errorHandling: 'Error Handling'\r\n };\r\n\r\n return [...byArea.entries()].map(([key, missions]) => {\r\n const repoChecks = missions.flatMap((m) => m.checks).filter(isRepoLayerMissionCheck);\r\n const providerChecks = missions.flatMap((m) => m.checks).filter(isProviderLayerMissionCheck);\r\n const repoReadinessPercent = percentVerified(repoChecks);\r\n const providerReadinessPercent = percentVerified(providerChecks);\r\n const criticalCount = missions\r\n .flatMap((m) => m.checks)\r\n .filter(\r\n (check) =>\r\n isProviderLayerMissionCheck(check) &&\r\n (check.verificationStatus === 'missing' || check.status === 'missing' || check.status === 'failed')\r\n ).length;\r\n\r\n return {\r\n key,\r\n label: AREA_LABELS[key],\r\n readinessPercent: repoReadinessPercent,\r\n repoReadinessPercent,\r\n providerReadinessPercent,\r\n criticalCount,\r\n providerMissions: missions\r\n };\r\n });\r\n}\r\n\r\nfunction percentVerified(checks: MissionCheck[]): number {\r\n if (checks.length === 0) {\r\n return 100;\r\n }\r\n const verified = checks.filter((check) => isVerifiedMissionCheck(check)).length;\r\n return Math.round((verified / checks.length) * 100);\r\n}\r\n", "import type {\r\n MissionArea,\r\n MissionCheck,\r\n MissionCheckStatus,\r\n MissionEvidenceClass,\r\n MissionGraph,\r\n ProviderMission,\r\n RepositoryEvidenceSummary,\r\n StackWiringArea,\r\n StackWiringItem,\r\n StackWiringProviderSummary,\r\n StackWiringSummary\r\n} from './types';\r\nimport { stackWiringKeyHasMcp } from './providerRegistry';\nimport type { SifgGraph, SifgLeak, SifgPipeline } from './sifgTypes';\nimport { mergeVerificationIntoMissionGraph } from './verificationLayer/mergeIntoMissionGraph';\nimport type { VerificationLayerSnapshot } from './verificationLayer/types';\n\r\ntype BuildMissionGraphInput = {\n stackWiring: StackWiringSummary;\n repositoryEvidence: RepositoryEvidenceSummary;\n staticInfrastructureFlowGraph?: SifgGraph;\n verificationLayer?: VerificationLayerSnapshot;\n};\n\r\nconst AREA_LABELS: Record<StackWiringArea, string> = {\r\n appFlow: 'App Flow',\r\n frontend: 'Frontend',\r\n backend: 'Backend / API',\r\n database: 'Database',\r\n auth: 'Auth',\r\n payments: 'Payments',\r\n deployment: 'Deployment',\r\n monitoring: 'Monitoring',\r\n security: 'Security',\r\n testing: 'Testing',\r\n landing: 'Landing / Onboarding',\r\n errorHandling: 'Error Handling'\r\n};\r\n\r\nexport function buildMissionGraph(input: BuildMissionGraphInput): MissionGraph {\r\n const providerMissions = input.stackWiring.items.map(toProviderMission);\r\n if (input.staticInfrastructureFlowGraph) {\r\n overlaySifgLeaks(providerMissions, input.staticInfrastructureFlowGraph);\r\n }\r\n const byProvider = providerMissions.reduce<MissionGraph['byProvider']>((acc, mission) => {\r\n acc[mission.key] = mission;\r\n return acc;\r\n }, {});\r\n const areas = buildAreas(providerMissions);\r\n const byArea = areas.reduce<MissionGraph['byArea']>((acc, area) => {\r\n acc[area.key] = area;\r\n return acc;\r\n }, {});\r\n\r\n const graph: MissionGraph = {\n areas,\n byArea,\n byProvider,\n repositoryEvidence: input.repositoryEvidence,\n ...(input.staticInfrastructureFlowGraph\n ? { staticInfrastructureFlowGraph: input.staticInfrastructureFlowGraph }\n : {})\n };\n return input.verificationLayer ? mergeVerificationIntoMissionGraph(graph, input.verificationLayer) : graph;\n}\n\r\nfunction toProviderMission(summary: StackWiringProviderSummary): ProviderMission {\r\n const checks = summary.items.map((item) => toMissionCheck(summary, item));\r\n if (stackWiringKeyHasMcp(summary.key)) {\r\n checks.push({\r\n id: `${summary.key}-mcp-verifier`,\r\n label: `${summary.providerLabel} MCP verifier available`,\r\n providerKey: summary.key,\r\n providerLabel: summary.providerLabel,\r\n area: summary.area,\r\n evidenceClass: 'mcp-verifier',\r\n status: 'needs-connection',\r\n evidence: [],\r\n promptHint: `Connect the official ${summary.providerLabel} MCP/tool verifier before claiming external dashboard state.`\r\n });\r\n }\r\n\r\n return {\n key: summary.key,\n provider: summary.provider,\n providerLabel: summary.providerLabel,\n area: summary.area,\n promptSubject: summary.promptSubject,\n readinessPercent: summary.readinessPercent,\n repoReadinessPercent: summary.readinessPercent,\n providerReadinessPercent: checks.some((check) => check.evidenceClass === 'mcp-verifier') ? 0 : 100,\n checks\n };\n}\n\r\nfunction toMissionCheck(summary: StackWiringProviderSummary, item: StackWiringItem): MissionCheck {\r\n const evidenceClass = evidenceClassForStatus(item.status);\r\n return {\r\n id: item.id,\r\n label: item.label,\r\n providerKey: summary.key,\r\n providerLabel: summary.providerLabel,\r\n area: summary.area,\r\n evidenceClass,\r\n status: missionStatusForEvidenceClass(evidenceClass),\r\n evidence: item.evidence,\r\n promptHint: item.promptHint\r\n };\r\n}\r\n\r\nfunction evidenceClassForStatus(status: StackWiringItem['status']): MissionEvidenceClass {\r\n if (status === 'passed') {\r\n return 'repo-verified';\r\n }\r\n if (status === 'manual') {\r\n return 'manual-dashboard';\r\n }\r\n return 'missing-repo-fix';\r\n}\r\n\r\nfunction missionStatusForEvidenceClass(evidenceClass: MissionEvidenceClass): MissionCheckStatus {\r\n if (evidenceClass === 'repo-verified') {\r\n return 'passed';\r\n }\r\n if (evidenceClass === 'manual-dashboard') {\r\n return 'manual-required';\r\n }\r\n if (evidenceClass === 'mcp-verifier') {\r\n return 'needs-connection';\r\n }\r\n return 'missing';\r\n}\r\n\r\nfunction overlaySifgLeaks(providerMissions: ProviderMission[], graph: SifgGraph): void {\r\n const pipelinesById = new Map(graph.pipelines.map((pipeline) => [pipeline.id, pipeline]));\r\n const leaksByPipeline = new Map<string, SifgLeak[]>();\r\n const providerCheckIds = new Map(\r\n providerMissions.map((mission) => [\r\n mission.key,\r\n new Set(mission.checks.map((check) => check.id))\r\n ])\r\n );\r\n\r\n for (const leak of graph.leaks) {\r\n const leaks = leaksByPipeline.get(leak.pipelineId) ?? [];\r\n leaks.push(leak);\r\n leaksByPipeline.set(leak.pipelineId, leaks);\r\n }\r\n\r\n for (const [pipelineId, leaks] of leaksByPipeline.entries()) {\r\n const pipeline = pipelinesById.get(pipelineId);\r\n const providerKey = pipeline?.providerKey ?? leaks[0]?.providerKey;\r\n if (!providerKey) {\r\n continue;\r\n }\r\n\r\n const mission = providerMissions.find((candidate) => candidate.key === providerKey);\r\n if (!mission) {\r\n continue;\r\n }\r\n\r\n const usedCheckIds = providerCheckIds.get(mission.key) ?? new Set<string>();\r\n const check = toSifgMissionCheck(mission, pipeline, pipelineId, leaks, usedCheckIds);\r\n mission.checks.push(check);\r\n usedCheckIds.add(check.id);\r\n providerCheckIds.set(mission.key, usedCheckIds);\r\n }\r\n\r\n for (const mission of providerMissions) {\r\n mission.readinessPercent = readinessPercentForChecks(mission.checks);\r\n }\r\n}\r\n\r\nfunction toSifgMissionCheck(\r\n mission: ProviderMission,\r\n pipeline: SifgPipeline | undefined,\r\n pipelineId: string,\r\n leaks: SifgLeak[],\r\n usedCheckIds: Set<string>\r\n): MissionCheck {\r\n const firstLeak = leaks[0];\r\n const baseCheckId = pipeline?.missionCheckIds[0] ?? firstLeak?.id ?? pipelineId;\r\n const checkId = uniqueSifgCheckId(baseCheckId, pipelineId, firstLeak?.id, usedCheckIds);\r\n const evidence = leaks.flatMap((leak) =>\r\n leak.evidencePath.map((step) => `${step.file}:${step.range.startLine}-${step.range.endLine}`)\r\n );\r\n\r\n return {\r\n id: checkId,\r\n label: pipeline?.label ?? firstLeak?.summary ?? 'SIFG structural leak',\r\n providerKey: mission.key,\r\n providerLabel: mission.providerLabel,\r\n area: mission.area,\r\n evidenceClass: 'missing-repo-fix',\r\n status: 'missing',\r\n evidence,\r\n promptHint: firstLeak?.repoFix.requiredOutcome ?? 'Fix the SIFG structural leak in repository code.',\r\n sifg: {\r\n pipelineId,\r\n leakIds: leaks.map((leak) => leak.id),\r\n proofStatus: 'leak'\r\n }\r\n };\r\n}\r\n\r\nfunction uniqueSifgCheckId(\r\n baseCheckId: string,\r\n pipelineId: string,\r\n leakId: string | undefined,\r\n usedCheckIds: Set<string>\r\n): string {\r\n if (!usedCheckIds.has(baseCheckId)) {\r\n return baseCheckId;\r\n }\r\n\r\n const suffix = stableSifgSuffix(pipelineId) || (leakId ? stableSifgSuffix(leakId) : '') || 'sifg';\r\n const suffixed = `${baseCheckId}--${suffix}`;\r\n if (!usedCheckIds.has(suffixed)) {\r\n return suffixed;\r\n }\r\n\r\n let counter = 2;\r\n while (usedCheckIds.has(`${suffixed}-${counter}`)) {\r\n counter += 1;\r\n }\r\n return `${suffixed}-${counter}`;\r\n}\r\n\r\nfunction stableSifgSuffix(id: string): string {\r\n return id.split(':').filter(Boolean).at(-1)?.replace(/[^a-zA-Z0-9._-]/g, '-') ?? '';\r\n}\r\n\r\nfunction readinessPercentForChecks(checks: MissionCheck[]): number {\r\n const actionableChecks = checks.filter(isActionableCheck);\r\n const passed = actionableChecks.filter((check) => check.status === 'passed').length;\r\n return Math.round((passed / Math.max(actionableChecks.length, 1)) * 100);\r\n}\r\n\r\nfunction isActionableCheck(check: MissionCheck): boolean {\r\n return check.evidenceClass !== 'manual-dashboard' && check.evidenceClass !== 'mcp-verifier';\r\n}\r\n\r\nfunction buildAreas(providerMissions: ProviderMission[]): MissionArea[] {\r\n const byArea = new Map<StackWiringArea, ProviderMission[]>();\r\n for (const mission of providerMissions) {\r\n const current = byArea.get(mission.area) ?? [];\r\n current.push(mission);\r\n byArea.set(mission.area, current);\r\n }\r\n\r\n return [...byArea.entries()].map(([key, missions]) => {\r\n const actionableChecks = missions\r\n .flatMap((mission) => mission.checks)\r\n .filter(isActionableCheck);\r\n const passed = actionableChecks.filter((check) => check.status === 'passed').length;\r\n const missing = actionableChecks.filter((check) => check.status === 'missing' || check.status === 'failed').length;\r\n\r\n return {\n key,\n label: AREA_LABELS[key],\n readinessPercent: Math.round((passed / Math.max(actionableChecks.length, 1)) * 100),\n repoReadinessPercent: Math.round((passed / Math.max(actionableChecks.length, 1)) * 100),\n providerReadinessPercent: missions.some((mission) =>\n mission.checks.some((check) => check.evidenceClass === 'mcp-verifier')\n ) ? 0 : 100,\n criticalCount: missing,\n providerMissions: missions\n };\n });\n}\n", "import type {\r\n ProductionConnectionArea,\r\n ProductionConnectionChoice,\r\n ProductionConnectionChoices,\r\n ProductionConnectionEvidence,\r\n ProductionConnectionProvider,\r\n ProductionConnectionStatus,\r\n ProductionConnectionSummary,\r\n ScanResult\r\n} from './types';\r\nimport {\r\n normalizeProviderKey,\r\n productionProviders,\r\n productionProvidersByArea,\r\n providerLabel\r\n} from './providerRegistry';\r\n\r\nexport type {\r\n ProductionConnectionArea,\r\n ProductionConnectionChoice,\r\n ProductionConnectionChoices,\r\n ProductionConnectionEvidence,\r\n ProductionConnectionProvider,\r\n ProductionConnectionStatus,\r\n ProductionConnectionSummary\r\n} from './types';\r\n\r\nconst AREAS: ProductionConnectionArea[] = [\r\n 'database',\r\n 'auth',\r\n 'payments',\r\n 'deployment',\r\n 'monitoring',\r\n 'security'\r\n];\r\n\r\nconst PROVIDERS = productionProviders();\r\nconst PROVIDERS_BY_AREA = productionProvidersByArea();\r\n\r\ntype EvidenceMap = Partial<Record<ProductionConnectionArea, ProductionConnectionEvidence>>;\r\n\r\ntype ScannableFile = {\r\n path: string;\r\n displayPath: string;\r\n content: string;\r\n lowerContent: string;\r\n};\r\n\r\nexport type ProviderDetectionRule = {\r\n area: ProductionConnectionArea;\r\n provider: ProductionConnectionProvider;\r\n label: string;\r\n packages?: readonly RegExp[];\r\n env?: readonly string[];\r\n paths?: readonly RegExp[];\r\n imports?: readonly string[];\r\n docs?: readonly string[];\r\n content?: readonly Readonly<{ pattern: RegExp; signal: string }>[];\r\n};\r\n\r\ntype RawProductionConnectionChoice = {\r\n provider?: unknown;\r\n selectedAt?: unknown;\r\n};\r\n\r\ntype ChoiceInput =\r\n | ProductionConnectionChoices\r\n | Partial<Record<string, RawProductionConnectionChoice | undefined>>\r\n | null\r\n | undefined;\r\n\r\nexport const PROVIDER_RULES: readonly ProviderDetectionRule[] = freezeProviderRules([\r\n {\r\n area: 'database',\r\n provider: 'supabase',\r\n label: 'Supabase',\r\n packages: [/@supabase\\//],\r\n env: ['VITE_SUPABASE_URL', 'NEXT_PUBLIC_SUPABASE_URL', 'SUPABASE_URL', 'SUPABASE_SERVICE_ROLE_KEY'],\r\n paths: [/supabase\\/config\\.toml$/, /(^|\\/)(lib|utils)\\/supabase\\.[jt]s$/],\r\n imports: ['@supabase/supabase-js', '@supabase/ssr'],\r\n docs: ['supabase']\r\n },\r\n {\r\n area: 'database',\r\n provider: 'firebase',\r\n label: 'Firebase',\r\n packages: [/^firebase$/, /^firebase-admin$/, /@firebase\\//],\r\n env: ['FIREBASE_PROJECT_ID', 'NEXT_PUBLIC_FIREBASE_PROJECT_ID', 'VITE_FIREBASE_PROJECT_ID', 'GOOGLE_APPLICATION_CREDENTIALS'],\r\n paths: [/firebase/, /firestore/],\r\n imports: ['firebase/app', 'firebase/firestore', 'firebase-admin'],\r\n content: [{ pattern: /getFirestore\\s*\\(|collection\\s*\\(|firebase-admin/i, signal: 'code: Firebase/Firestore usage' }],\r\n docs: ['firebase', 'firestore']\r\n },\r\n {\r\n area: 'database',\r\n provider: 'neon',\r\n label: 'Neon',\r\n packages: [/@neondatabase\\//],\r\n env: ['NEON_DATABASE_URL'],\r\n imports: ['@neondatabase/serverless'],\r\n docs: ['neon']\r\n },\r\n {\r\n area: 'database',\r\n provider: 'planetscale',\r\n label: 'PlanetScale',\r\n packages: [/@planetscale\\/database/],\r\n env: ['PLANETSCALE_DATABASE_URL'],\r\n imports: ['@planetscale/database'],\r\n docs: ['planetscale']\r\n },\r\n {\r\n area: 'database',\r\n provider: 'mongodb',\r\n label: 'MongoDB',\r\n packages: [/^mongodb$/, /^mongoose$/],\r\n env: ['MONGODB_URI', 'MONGODB_URL', 'MONGODB_ATLAS_URI'],\r\n imports: ['mongodb', 'mongoose'],\r\n docs: ['mongodb', 'mongo atlas']\r\n },\r\n {\r\n area: 'database',\r\n provider: 'turso',\r\n label: 'Turso',\r\n packages: [/@libsql\\/client/],\r\n env: ['TURSO_DATABASE_URL', 'TURSO_AUTH_TOKEN'],\r\n imports: ['@libsql/client'],\r\n docs: ['turso']\r\n },\r\n {\r\n area: 'auth',\r\n provider: 'clerk',\r\n label: 'Clerk',\r\n packages: [/@clerk\\//],\r\n env: ['CLERK_SECRET_KEY', 'NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY'],\r\n paths: [/middleware\\.[jt]sx?$/],\r\n imports: ['@clerk/nextjs', '@clerk/clerk-react', '@clerk/express'],\r\n docs: ['clerk']\r\n },\r\n {\r\n area: 'auth',\r\n provider: 'authjs',\r\n label: 'Auth.js',\r\n packages: [/^next-auth$/, /^@auth\\//],\r\n env: ['AUTH_SECRET', 'NEXTAUTH_SECRET', 'NEXTAUTH_URL'],\r\n paths: [/api\\/auth\\//],\r\n imports: ['next-auth', '@auth/core', '@auth/nextjs'],\r\n content: [{ pattern: /NextAuth\\s*\\(|getServerSession|useSession\\s*\\(/i, signal: 'code: Auth.js session or route handler' }],\r\n docs: ['auth.js', 'nextauth', 'next-auth']\r\n },\r\n {\r\n area: 'auth',\r\n provider: 'auth0',\r\n label: 'Auth0',\r\n packages: [/@auth0\\//],\r\n env: ['AUTH0_SECRET', 'AUTH0_ISSUER_BASE_URL', 'AUTH0_CLIENT_ID', 'AUTH0_CLIENT_SECRET', 'AUTH0_DOMAIN'],\r\n paths: [/api\\/auth/, /auth0/],\r\n imports: ['@auth0/nextjs-auth0', '@auth0/auth0-react', 'express-openid-connect'],\r\n content: [{ pattern: /handleAuth|withPageAuthRequired|withApiAuthRequired|getSession/i, signal: 'code: Auth0 session or route protection' }],\r\n docs: ['auth0']\r\n },\r\n {\r\n area: 'auth',\r\n provider: 'better-auth',\r\n label: 'Better Auth',\r\n packages: [/^better-auth$/],\r\n env: ['BETTER_AUTH_SECRET', 'BETTER_AUTH_URL', 'AUTH_SECRET', 'DATABASE_URL'],\r\n paths: [/better-auth/, /auth\\.[jt]s$/],\r\n imports: ['better-auth'],\r\n content: [{ pattern: /betterAuth\\s*\\(|auth\\.api|auth\\.handler/i, signal: 'code: Better Auth config' }],\r\n docs: ['better auth', 'better-auth']\r\n },\r\n {\r\n area: 'payments',\r\n provider: 'stripe',\r\n label: 'Stripe',\r\n packages: [/^stripe$/, /@stripe\\//],\r\n env: ['STRIPE_SECRET_KEY', 'STRIPE_WEBHOOK_SECRET', 'NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY'],\r\n paths: [/stripe.*webhook/, /webhook.*stripe/, /stripe.*checkout/, /checkout.*stripe/],\r\n imports: ['stripe', '@stripe/stripe-js'],\r\n docs: ['stripe']\r\n },\r\n {\r\n area: 'payments',\r\n provider: 'paddle',\r\n label: 'Paddle',\r\n packages: [/@paddle\\//],\r\n env: ['PADDLE_API_KEY', 'PADDLE_WEBHOOK_SECRET', 'NEXT_PUBLIC_PADDLE_CLIENT_TOKEN'],\r\n paths: [/paddle.*webhook/, /webhook.*paddle/, /paddle.*checkout/, /checkout.*paddle/],\r\n imports: ['@paddle/paddle-js', '@paddle/paddle-node-sdk'],\r\n docs: ['paddle']\r\n },\r\n {\r\n area: 'payments',\r\n provider: 'polar',\r\n label: 'Polar',\r\n packages: [/@polar-sh\\//],\r\n env: ['POLAR_ACCESS_TOKEN', 'POLAR_WEBHOOK_SECRET', 'POLAR_PRODUCT_ID', 'POLAR_PRO_PRODUCT_ID'],\r\n paths: [/polar.*webhook/, /webhook.*polar/, /polar.*checkout/, /checkout.*polar/],\r\n imports: ['@polar-sh/sdk'],\r\n content: [{ pattern: /api\\.polar\\.sh|polar.*checkout|createCheckoutSession/i, signal: 'code: Polar checkout or API usage' }],\r\n docs: ['polar']\r\n },\r\n {\r\n area: 'payments',\r\n provider: 'lemon-squeezy',\r\n label: 'Lemon Squeezy',\r\n packages: [/@lemonsqueezy\\//, /^lemonsqueezy\\.ts$/],\r\n env: ['LEMON_SQUEEZY_API_KEY', 'LEMONSQUEEZY_API_KEY', 'LEMON_SQUEEZY_WEBHOOK_SECRET', 'LEMON_SQUEEZY_STORE_ID', 'LEMON_SQUEEZY_VARIANT_ID'],\r\n paths: [/lemon.*webhook/, /webhook.*lemon/, /lemon.*checkout/, /checkout.*lemon/, /lemonsqueezy/],\r\n imports: ['@lemonsqueezy/lemonsqueezy.js', 'lemonsqueezy.ts'],\r\n content: [{ pattern: /api\\.lemonsqueezy\\.com|lemon.*checkout|checkout_url|variant_id/i, signal: 'code: Lemon Squeezy checkout or API usage' }],\r\n docs: ['lemon squeezy', 'lemonsqueezy']\r\n },\r\n {\r\n area: 'deployment',\r\n provider: 'vercel',\r\n label: 'Vercel',\r\n packages: [/@vercel\\//],\r\n env: ['VERCEL_TOKEN', 'VERCEL_PROJECT_ID', 'VERCEL_ORG_ID'],\r\n paths: [/vercel\\.json$/],\r\n docs: ['vercel']\r\n },\r\n {\r\n area: 'deployment',\r\n provider: 'netlify',\r\n label: 'Netlify',\r\n packages: [/@netlify\\//],\r\n env: ['NETLIFY_AUTH_TOKEN', 'NETLIFY_SITE_ID'],\r\n paths: [/netlify\\.toml$/, /\\.netlify\\//, /(^|\\/)_redirects$/],\r\n imports: ['@netlify/functions'],\r\n docs: ['netlify']\r\n },\r\n {\r\n area: 'deployment',\r\n provider: 'render',\r\n label: 'Render',\r\n env: ['RENDER_API_KEY', 'RENDER_SERVICE_ID'],\r\n paths: [/render\\.ya?ml$/, /(^|\\/)\\.render\\//],\r\n content: [{ pattern: /render\\.yaml|render\\.yml|render deploy|render service/i, signal: 'code: Render deployment config' }],\r\n docs: ['render.com', 'render deployment']\r\n },\r\n {\r\n area: 'deployment',\r\n provider: 'railway',\r\n label: 'Railway',\r\n env: ['RAILWAY_TOKEN', 'RAILWAY_PROJECT_ID', 'RAILWAY_SERVICE_ID'],\r\n paths: [/railway\\.json$/, /nixpacks\\.toml$/, /(^|\\/)Procfile$/],\r\n content: [{ pattern: /railway up|railway deploy|nixpacks|railway\\.json/i, signal: 'code: Railway deployment config' }],\r\n docs: ['railway']\r\n },\r\n {\r\n area: 'deployment',\r\n provider: 'cloudflare',\r\n label: 'Cloudflare',\r\n packages: [/^wrangler$/, /@cloudflare\\//],\r\n env: ['CLOUDFLARE_API_TOKEN', 'CLOUDFLARE_ACCOUNT_ID', 'CF_PAGES'],\r\n paths: [/wrangler\\.toml$/, /wrangler\\.json$/, /(^|\\/)_headers$/, /(^|\\/)_redirects$/],\r\n imports: ['@cloudflare/workers-types'],\r\n content: [{ pattern: /compatibility_date|pages_build_output_dir|cloudflare pages|cloudflare workers/i, signal: 'code: Cloudflare Pages/Workers config' }],\r\n docs: ['cloudflare', 'workers', 'pages']\r\n },\r\n {\r\n area: 'deployment',\r\n provider: 'aws',\r\n label: 'AWS',\r\n packages: [/@aws-sdk\\//, /^aws-cdk-lib$/, /^serverless$/],\r\n env: ['AWS_REGION', 'AWS_ACCESS_KEY_ID'],\r\n paths: [/serverless\\.ya?ml$/, /template\\.ya?ml$/, /cdk\\.json$/, /amplify\\//],\r\n imports: ['aws-sdk', '@aws-sdk/client'],\r\n docs: ['aws', 'amplify', 'serverless']\r\n },\r\n {\r\n area: 'monitoring',\r\n provider: 'sentry',\r\n label: 'Sentry',\r\n packages: [/@sentry\\//],\r\n env: ['SENTRY_DSN', 'NEXT_PUBLIC_SENTRY_DSN', 'SENTRY_AUTH_TOKEN'],\r\n paths: [/sentry\\.(client|server)\\.config\\.[jt]s$/, /instrumentation\\.[jt]s$/],\r\n imports: ['@sentry/nextjs', '@sentry/node', '@sentry/react'],\r\n content: [{ pattern: /sentry\\.init\\s*\\(/i, signal: 'init: Sentry.init' }],\r\n docs: ['sentry']\r\n },\r\n {\r\n area: 'monitoring',\r\n provider: 'posthog',\r\n label: 'PostHog',\r\n packages: [/^posthog-js$/, /^posthog-node$/],\r\n env: ['POSTHOG_KEY', 'NEXT_PUBLIC_POSTHOG_KEY', 'NEXT_PUBLIC_POSTHOG_HOST'],\r\n imports: ['posthog-js', 'posthog-node'],\r\n content: [{ pattern: /posthog\\.init\\s*\\(/i, signal: 'init: posthog.init' }],\r\n docs: ['posthog']\r\n },\r\n {\r\n area: 'monitoring',\r\n provider: 'logrocket',\r\n label: 'LogRocket',\r\n packages: [/^logrocket$/],\r\n env: ['LOGROCKET_APP_ID', 'NEXT_PUBLIC_LOGROCKET_APP_ID'],\r\n imports: ['logrocket'],\r\n content: [{ pattern: /logrocket\\.init\\s*\\(/i, signal: 'init: LogRocket.init' }],\r\n docs: ['logrocket']\r\n },\r\n {\r\n area: 'security',\r\n provider: 'rate-limit',\r\n label: 'Upstash rate limit',\r\n packages: [/@upstash\\/ratelimit/, /express-rate-limit/, /rate-limiter-flexible/, /@fastify\\/rate-limit/],\r\n env: ['UPSTASH_REDIS_REST_URL', 'UPSTASH_REDIS_REST_TOKEN'],\r\n paths: [/rate-?limit/, /ratelimit/],\r\n imports: ['@upstash/ratelimit', 'express-rate-limit', 'rate-limiter-flexible', '@fastify/rate-limit'],\r\n content: [{ pattern: /\\brateLimit\\b|\\bRatelimit\\b|\\bToo many requests\\b/i, signal: 'code: rate limit guard' }],\r\n docs: ['upstash', 'rate limit']\r\n },\r\n {\r\n area: 'security',\r\n provider: 'bot-protection',\r\n label: 'Cloudflare Turnstile',\r\n packages: [/turnstile/],\r\n env: ['NEXT_PUBLIC_TURNSTILE_SITE_KEY', 'TURNSTILE_SECRET_KEY', 'TURNSTILE_SITE_KEY'],\r\n paths: [/turnstile/, /bot.?protection/],\r\n imports: ['@marsidev/react-turnstile', 'react-turnstile'],\r\n content: [{ pattern: /\\bturnstile\\b|\\bcf-turnstile\\b|\\brecaptcha\\b|\\bhcaptcha\\b/i, signal: 'code: bot protection guard' }],\r\n docs: ['turnstile', 'cloudflare turnstile', 'bot protection']\r\n }\r\n]);\r\n\r\nexport function normalizeProductionChoice(input: ChoiceInput): ProductionConnectionChoices {\r\n const source = isObject(input) && isObject(input.choices) ? input.choices : input;\r\n const choices: ProductionConnectionChoices['choices'] = {};\r\n\r\n if (!isObject(source)) {\r\n return { version: 1, choices };\r\n }\r\n\r\n for (const [areaKey, value] of Object.entries(source)) {\r\n const area = normalizeArea(areaKey);\r\n const provider = normalizeProviderForArea(area, isObject(value) ? value.provider : undefined);\r\n\r\n if (!area || !provider) {\r\n continue;\r\n }\r\n\r\n const selectedAt = isObject(value) ? normalizeSelectedAt(value.selectedAt) : null;\r\n if (!selectedAt) {\r\n continue;\r\n }\r\n\r\n choices[area] = { provider, selectedAt };\r\n }\r\n\r\n return { version: 1, choices };\r\n}\r\n\r\nexport function detectProductionConnectionEvidence(scan: ScanResult): EvidenceMap {\r\n const evidence: EvidenceMap = {};\r\n const deps = scan.packageDeps.map((dep) => dep.toLowerCase());\r\n const files = scan.files.map((file) => ({\r\n path: normalizePath(file.path),\r\n displayPath: file.path.replace(/\\\\/g, '/'),\r\n content: file.isSecret || typeof file.content !== 'string' ? '' : file.content,\r\n lowerContent: file.isSecret || typeof file.content !== 'string' ? '' : file.content.toLowerCase()\r\n }));\r\n const secretPathBlob = scan.secretsFound.map((path) => normalizePath(path)).join('\\n');\r\n const pathBlob = `${scan.fileTree}\\n${files.map((file) => file.path).join('\\n')}`.toLowerCase();\r\n const contentBlob = files.map((file) => file.lowerContent).join('\\n').slice(0, 120000);\r\n const secretsHygieneBlob = `${pathBlob}\\n${secretPathBlob}`;\r\n\r\n for (const rule of PROVIDER_RULES) {\r\n detectProvider(evidence, rule, deps, files, pathBlob);\r\n }\r\n\r\n detectSecretsHygiene(evidence, secretsHygieneBlob);\r\n\r\n for (const item of Object.values(evidence)) {\r\n if (!item) {\r\n continue;\r\n }\r\n applyVerificationStatus(item, pathBlob, contentBlob);\r\n }\r\n\r\n return evidence;\r\n}\r\n\r\nexport function summarizeProductionConnections(\r\n choices: ProductionConnectionChoices | null | undefined,\r\n evidence: EvidenceMap\r\n): {\r\n byArea: Partial<Record<ProductionConnectionArea, ProductionConnectionSummary>>;\r\n items: ProductionConnectionSummary[];\r\n stackRow: ProductionConnectionSummary[];\r\n} {\r\n const normalized = normalizeProductionChoice(choices);\r\n const byArea: Partial<Record<ProductionConnectionArea, ProductionConnectionSummary>> = {};\r\n const items: ProductionConnectionSummary[] = [];\r\n\r\n for (const area of AREAS) {\r\n const detected = evidence[area];\r\n const selected = normalized.choices[area];\r\n let summary: ProductionConnectionSummary | null = null;\r\n\r\n if (detected) {\r\n summary = {\r\n area,\r\n provider: detected.provider,\r\n source: 'detected',\r\n status: detected.status,\r\n label: `${providerLabel(detected.provider)} detected`,\r\n signals: detected.signals\r\n };\r\n } else if (selected) {\r\n summary = {\r\n area,\r\n provider: selected.provider,\r\n source: 'selected',\r\n status: ['selected', 'setup-not-verified'],\r\n label: `${providerLabel(selected.provider)} selected - setup not verified`,\r\n signals: [`Selected locally at ${selected.selectedAt}`]\r\n };\r\n }\r\n\r\n if (summary) {\r\n byArea[area] = summary;\r\n items.push(summary);\r\n }\r\n }\r\n\r\n const stackRow = items.filter((item) => item.provider !== null);\r\n\r\n return { byArea, items, stackRow };\r\n}\r\n\r\nexport function buildProductionConnectionContext(\r\n choices: ProductionConnectionChoices | null | undefined,\r\n evidence: EvidenceMap\r\n): string {\r\n const summary = summarizeProductionConnections(choices, evidence);\r\n const lines = summary.items.map((item) => `${item.area}: ${item.label}`);\r\n\r\n if (lines.some((line) => line.includes('selected - setup not verified'))) {\r\n lines.push('Do not treat selected as connected; only detected repo evidence can verify setup.');\r\n }\r\n\r\n return lines.length > 0 ? lines.join('\\n') : 'production connections: no selected or detected providers';\r\n}\r\n\r\nfunction detectProvider(\r\n evidence: EvidenceMap,\r\n rule: ProviderDetectionRule,\r\n deps: string[],\r\n files: ScannableFile[],\r\n pathBlob: string\r\n): void {\r\n if (evidence[rule.area]) {\r\n return;\r\n }\r\n\r\n const signals = collectSignals(rule, deps, files, pathBlob);\r\n if (signals.length === 0) {\r\n return;\r\n }\r\n\r\n evidence[rule.area] = {\r\n area: rule.area,\r\n provider: rule.provider,\r\n status: ['detected'],\r\n signals\r\n };\r\n}\r\n\r\nfunction collectSignals(\r\n rule: ProviderDetectionRule,\r\n deps: string[],\r\n files: ScannableFile[],\r\n pathBlob: string\r\n): string[] {\r\n const signals: string[] = [];\r\n\r\n for (const dep of deps) {\r\n if ((rule.packages ?? []).some((pattern) => testRegex(pattern, dep))) {\r\n addSignal(signals, `package: ${dep}`);\r\n }\r\n }\r\n\r\n const upperContents = files.map((file) => file.content).join('\\n').toUpperCase();\r\n for (const envName of rule.env ?? []) {\r\n if (upperContents.includes(envName.toUpperCase())) {\r\n addSignal(signals, `env: ${envName}`);\r\n }\r\n }\r\n\r\n const pathLines = pathBlob.split(/\\r?\\n/).map((path) => path.trim()).filter(Boolean);\r\n for (const path of pathLines) {\r\n if ((rule.paths ?? []).some((pattern) => testRegex(pattern, path))) {\r\n addSignal(signals, `${pathSignalPrefix(path)}: ${path}`);\r\n }\r\n }\r\n\r\n for (const file of files) {\r\n for (const importName of rule.imports ?? []) {\r\n if (containsImport(file.lowerContent, importName)) {\r\n addSignal(signals, `import: ${importName}`);\r\n }\r\n }\r\n\r\n for (const item of rule.content ?? []) {\r\n if (testRegex(item.pattern, file.content)) {\r\n addSignal(signals, item.signal);\r\n }\r\n }\r\n\r\n if (isDocsPath(file.path)) {\r\n for (const docsTerm of rule.docs ?? []) {\r\n if (file.lowerContent.includes(docsTerm.toLowerCase())) {\r\n addSignal(signals, `docs: ${file.displayPath} mentions ${rule.label}`);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return signals;\r\n}\r\n\r\nfunction containsImport(content: string, importName: string): boolean {\r\n const escaped = importName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').toLowerCase();\r\n return new RegExp(`(?:from\\\\s+['\"]${escaped}['\"]|import\\\\s*\\\\(\\\\s*['\"]${escaped}['\"]|require\\\\s*\\\\(\\\\s*['\"]${escaped}['\"])`).test(content);\r\n}\r\n\r\nfunction isDocsPath(path: string): boolean {\r\n return /(^|\\/)(readme|product|spec)\\.md$/.test(path) || /(^|\\/)docs\\/.*\\.md$/.test(path);\r\n}\r\n\r\nfunction pathSignalPrefix(path: string): string {\r\n if (/webhook|checkout|billing|api\\/|route\\.[jt]s$/.test(path)) {\r\n return 'route';\r\n }\r\n if (/config|\\.json$|\\.toml$|\\.ya?ml$/.test(path)) {\r\n return 'config';\r\n }\r\n return 'file';\r\n}\r\n\r\nfunction addSignal(signals: string[], signal: string): void {\r\n if (!signals.includes(signal)) {\r\n signals.push(signal);\r\n }\r\n}\r\n\r\nfunction freezeProviderRules(rules: ProviderDetectionRule[]): readonly ProviderDetectionRule[] {\r\n for (const rule of rules) {\r\n Object.freeze(rule.packages ?? []);\r\n Object.freeze(rule.env ?? []);\r\n Object.freeze(rule.paths ?? []);\r\n Object.freeze(rule.imports ?? []);\r\n Object.freeze(rule.docs ?? []);\r\n if (rule.content) {\r\n for (const item of rule.content) {\r\n Object.freeze(item);\r\n }\r\n Object.freeze(rule.content);\r\n }\r\n Object.freeze(rule);\r\n }\r\n\r\n return Object.freeze(rules);\r\n}\r\n\r\nfunction testRegex(pattern: RegExp, value: string): boolean {\r\n pattern.lastIndex = 0;\r\n return pattern.test(value);\r\n}\r\n\r\nfunction detectSecretsHygiene(evidence: EvidenceMap, secretsHygieneBlob: string): void {\r\n if (evidence.security) {\r\n return;\r\n }\r\n\r\n const signals: string[] = [];\r\n if (/(^|[/\\\\])\\.env\\.example\\b/m.test(secretsHygieneBlob)) {\r\n signals.push('file: .env.example');\r\n }\r\n if (/(^|[/\\\\])\\.env(\\.|$)/m.test(secretsHygieneBlob)) {\r\n signals.push('secret file excluded from scan');\r\n }\r\n if (signals.length === 0) {\r\n return;\r\n }\r\n\r\n evidence.security = {\r\n area: 'security',\r\n provider: 'secrets-hygiene',\r\n status: ['detected'],\r\n signals\r\n };\r\n}\r\n\r\nfunction applyVerificationStatus(\r\n evidence: ProductionConnectionEvidence,\r\n pathBlob: string,\r\n contentBlob: string\r\n): void {\r\n if (evidence.provider === 'secrets-hygiene') {\r\n addStatus(evidence.status, 'repo-verified');\r\n return;\r\n }\r\n\r\n const hasEnv = envPatternFor(evidence.provider).test(contentBlob);\r\n const hasWebhook = webhookPatternFor(evidence.provider).test(`${pathBlob}\\n${contentBlob}`);\r\n\r\n if (hasEnv || hasWebhook || evidence.area === 'deployment') {\r\n addStatus(evidence.status, 'repo-verified');\r\n }\r\n\r\n if (evidence.area === 'payments' && !hasWebhook) {\r\n addStatus(evidence.status, 'needs-webhook');\r\n }\r\n\r\n if (!hasEnv && evidence.area !== 'deployment') {\r\n addStatus(evidence.status, 'needs-env');\r\n }\r\n}\r\n\r\nfunction envPatternFor(provider: ProductionConnectionProvider): RegExp {\r\n switch (provider) {\r\n case 'supabase':\r\n return /\\b((vite|next_public)_)?supabase_(url|anon_key|service_role_key)\\b/i;\r\n case 'clerk':\r\n return /\\b(clerk_secret_key|next_public_clerk_)/i;\r\n case 'authjs':\r\n return /\\b(auth_secret|nextauth_secret)\\b/i;\r\n case 'neon':\r\n return /\\b(neon_database_url|database_url)\\b/i;\r\n case 'planetscale':\r\n return /\\b(planetscale_database_url|database_url)\\b/i;\r\n case 'mongodb':\r\n return /\\b(mongodb_uri|mongodb_url|database_url)\\b/i;\r\n case 'turso':\r\n return /\\b(turso_database_url|turso_auth_token|database_url)\\b/i;\r\n case 'stripe':\r\n return /\\bstripe_(secret_key|webhook_secret)\\b/i;\r\n case 'paddle':\r\n return /\\bpaddle_(api_key|webhook_secret|client_token)\\b/i;\r\n case 'polar':\r\n return /\\bpolar_(access_token|webhook_secret|pro_product_id|sandbox)\\b/i;\r\n case 'sentry':\r\n return /\\bsentry_dsn\\b/i;\r\n case 'posthog':\r\n return /\\b(posthog_key|next_public_posthog_key)\\b/i;\r\n case 'logrocket':\r\n return /\\b(logrocket_app_id|next_public_logrocket_app_id)\\b/i;\r\n case 'rate-limit':\r\n return /\\b(upstash_redis_rest_url|upstash_redis_rest_token)\\b/i;\r\n case 'bot-protection':\r\n return /\\b(next_public_turnstile_site_key|turnstile_secret_key|turnstile_site_key)\\b/i;\r\n default:\r\n return /\\b[A-Z0-9_]+_(KEY|SECRET|TOKEN|URL)\\b/i;\r\n }\r\n}\r\n\r\nfunction webhookPatternFor(provider: ProductionConnectionProvider): RegExp {\r\n switch (provider) {\r\n case 'stripe':\r\n return /\\bstripe\\b.*\\bwebhook\\b|\\bwebhook\\b.*\\bstripe\\b/i;\r\n case 'paddle':\r\n return /\\bpaddle\\b.*\\bwebhook\\b|\\bwebhook\\b.*\\bpaddle\\b/i;\r\n case 'polar':\r\n return /\\bpolar\\b.*\\bwebhook\\b|\\bwebhook\\b.*\\bpolar\\b/i;\r\n default:\r\n return /\\bwebhook\\b/i;\r\n }\r\n}\r\n\r\nfunction addStatus(status: ProductionConnectionStatus[], value: ProductionConnectionStatus): void {\r\n if (!status.includes(value)) {\r\n status.push(value);\r\n }\r\n}\r\n\r\nfunction normalizeArea(value: unknown): ProductionConnectionArea | null {\r\n const normalized = String(value).toLowerCase();\r\n return AREAS.includes(normalized as ProductionConnectionArea) ? (normalized as ProductionConnectionArea) : null;\r\n}\r\n\r\nfunction normalizeProvider(value: unknown): ProductionConnectionProvider | null {\r\n const normalized = normalizeProviderKey(String(value));\r\n const productionProvider = normalized === 'supabase-auth' ? 'supabase' : normalized;\r\n return PROVIDERS.includes(productionProvider as ProductionConnectionProvider)\r\n ? (productionProvider as ProductionConnectionProvider)\r\n : null;\r\n}\r\n\r\nfunction normalizeProviderForArea(\r\n area: ProductionConnectionArea | null,\r\n value: unknown\r\n): ProductionConnectionProvider | null {\r\n if (!area) {\r\n return null;\r\n }\r\n\r\n const provider = normalizeProvider(value);\r\n if (!provider || !PROVIDERS_BY_AREA[area].includes(provider)) {\r\n return null;\r\n }\r\n\r\n return provider;\r\n}\r\n\r\nfunction normalizeSelectedAt(value: unknown): string | null {\r\n if (typeof value === 'string') {\r\n const date = new Date(value);\r\n if (!Number.isNaN(date.getTime())) {\r\n return date.toISOString();\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction normalizePath(path: string): string {\r\n return path.replace(/\\\\/g, '/').toLowerCase();\r\n}\r\n\r\nfunction isObject(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null;\r\n}\r\n", "import {\r\n normalizeProductionChoice,\r\n PROVIDER_RULES,\r\n type ProductionConnectionChoices,\r\n type ProviderDetectionRule\r\n} from './productionConnections';\r\nimport { mcpTemplateForProvider, providerLabel } from './providerRegistry';\r\nimport type {\r\n McpVerifierStateSnapshot,\r\n ProductionConnectionArea,\r\n ProductionConnectionProvider,\r\n ProviderTruthArea,\r\n ProviderTruthConfidence,\r\n ProviderTruthConflict,\r\n ProviderTruthEvidenceItem,\r\n ProviderTruthEvidenceKind,\r\n ProviderTruthRecommendedAction,\r\n ProviderTruthRole,\r\n ProviderTruthRow,\r\n ProviderTruthSnapshot,\r\n ScanResult\r\n} from './types';\r\nimport type { VerificationLayerSnapshot } from './verificationLayer/types';\r\n\r\nexport interface BuildProviderTruthInput {\r\n scan: ScanResult;\r\n choices: ProductionConnectionChoices;\r\n mcpVerifierState?: McpVerifierStateSnapshot;\r\n verificationLayer?: VerificationLayerSnapshot;\r\n generatedAt?: string;\r\n}\r\n\r\ntype ProviderEvidencePathClass = 'runtime' | 'weak';\r\n\r\ntype ScannableFile = {\r\n path: string;\r\n displayPath: string;\r\n content: string;\r\n executableContent: string;\r\n lowerContent: string;\r\n lowerExecutableContent: string;\r\n};\r\n\r\nconst AREAS: ProductionConnectionArea[] = [\r\n 'database',\r\n 'auth',\r\n 'payments',\r\n 'deployment',\r\n 'monitoring',\r\n 'security'\r\n];\r\n\r\nconst WEAK_PATH_SEGMENTS = new Set([\r\n 'tmp',\r\n 'out',\r\n 'outputs',\r\n 'videos',\r\n 'marketing',\r\n 'docs',\r\n 'tests',\r\n '__tests__',\r\n 'examples',\r\n 'demo'\r\n]);\r\n\r\nconst TEST_FILE_PATTERN = /\\.(test|spec)\\.[jt]sx?$/;\r\n\r\nexport function classifyProviderEvidencePath(path: string): ProviderEvidencePathClass {\r\n const normalized = normalizePath(path);\r\n const segments = normalized.split('/').filter(Boolean);\r\n\r\n if (\r\n isDocsLikePath(normalized) ||\r\n segments.some((segment) => WEAK_PATH_SEGMENTS.has(segment)) ||\r\n TEST_FILE_PATTERN.test(normalized)\r\n ) {\r\n return 'weak';\r\n }\r\n\r\n return 'runtime';\r\n}\r\n\r\nexport function buildProviderTruthSnapshot(input: BuildProviderTruthInput): ProviderTruthSnapshot {\r\n const choices = normalizeProductionChoice(input.choices);\r\n const deps = input.scan.packageDeps.map((dep) => dep.toLowerCase());\r\n const files = input.scan.files.map(toScannableFile);\r\n const pathLines = collectPathLines(input.scan, files);\r\n const rowsByArea: Partial<Record<ProductionConnectionArea, ProviderTruthRow[]>> = {};\r\n\r\n void input.mcpVerifierState;\r\n void input.verificationLayer;\r\n\r\n for (const rule of PROVIDER_RULES) {\r\n const evidence = collectProviderTruthEvidence(rule, deps, files, pathLines);\r\n const selected = choices.choices[rule.area]?.provider === rule.provider;\r\n\r\n if (evidence.length === 0 && !selected) {\r\n continue;\r\n }\r\n\r\n const row = buildRow(rule, evidence, selected);\r\n rowsByArea[rule.area] = [...(rowsByArea[rule.area] ?? []), row];\r\n }\r\n\r\n for (const [area, choice] of Object.entries(choices.choices) as Array<[\r\n ProductionConnectionArea,\r\n { provider: ProductionConnectionProvider } | undefined\r\n ]>) {\r\n if (!choice) {\r\n continue;\r\n }\r\n\r\n const existing = rowsByArea[area]?.some((row) => row.provider === choice.provider);\r\n if (existing) {\r\n continue;\r\n }\r\n\r\n rowsByArea[area] = [\r\n ...(rowsByArea[area] ?? []),\r\n buildSelectedOnlyRow(area, choice.provider)\r\n ];\r\n }\r\n\r\n const areas = AREAS.map((area) => buildArea(area, rowsByArea[area] ?? []));\r\n const summary = {\r\n liveVerifiedCount: areas.filter((area) => area.liveVerified).length,\r\n conflictCount: areas.reduce((count, area) => count + area.conflicts.length, 0),\r\n needsMcpCount: areas.reduce(\r\n (count, area) => count + area.rows.filter((row) => row.roles.includes('needs-mcp')).length,\r\n 0\r\n ),\r\n manualOnlyCount: areas.reduce((count, area) => count + area.rows.filter(rowRequiresManualFallback).length, 0)\r\n };\r\n\r\n return {\r\n version: 1,\r\n generatedAt: input.generatedAt ?? new Date().toISOString(),\r\n areas,\r\n summary\r\n };\r\n}\r\n\r\nfunction collectProviderTruthEvidence(\r\n rule: ProviderDetectionRule,\r\n deps: string[],\r\n files: ScannableFile[],\r\n pathLines: string[]\r\n): ProviderTruthEvidenceItem[] {\r\n const evidence: ProviderTruthEvidenceItem[] = [];\r\n\r\n for (const dep of deps) {\r\n if ((rule.packages ?? []).some((pattern) => testRegex(pattern, dep))) {\r\n addEvidence(evidence, rule, {\r\n kind: 'package-installed',\r\n strength: 'medium',\r\n label: `${rule.label} package installed`,\r\n detail: dep,\r\n points: 20,\r\n isRuntimeEvidence: false\r\n });\r\n }\r\n }\r\n\r\n for (const path of pathLines) {\r\n if (!(rule.paths ?? []).some((pattern) => testRegex(pattern, path))) {\r\n continue;\r\n }\r\n\r\n const pathClass = classifyProviderEvidencePath(path);\r\n const kind = weakPathKind(path, 'active-runtime-route') ?? routeKind(path);\r\n addEvidence(evidence, rule, {\r\n kind,\r\n strength: pathClass === 'runtime' ? 'strong' : 'weak',\r\n label: `${rule.label} ${pathClass === 'runtime' ? 'runtime route or path' : 'weak path reference'}`,\r\n file: path,\r\n points: pathClass === 'runtime' ? 35 : weakEvidencePoints(path),\r\n isRuntimeEvidence: pathClass === 'runtime'\r\n });\r\n }\r\n\r\n for (const file of files) {\r\n const pathClass = classifyProviderEvidencePath(file.path);\r\n const sourceContent = pathClass === 'runtime' ? file.executableContent : file.content;\r\n const sourceLowerContent = pathClass === 'runtime' ? file.lowerExecutableContent : file.lowerContent;\r\n\r\n for (const envName of rule.env ?? []) {\r\n if (!sourceContent.toUpperCase().includes(envName.toUpperCase())) {\r\n continue;\r\n }\r\n\r\n addEvidence(evidence, rule, {\r\n kind: pathClass === 'runtime' ? 'runtime-env-usage' : 'env-name-only',\r\n strength: pathClass === 'runtime' ? 'medium' : 'weak',\r\n label: `${rule.label} env name ${pathClass === 'runtime' ? 'used in runtime source' : 'mentioned outside runtime source'}`,\r\n file: file.displayPath,\r\n detail: envName,\r\n points: pathClass === 'runtime' ? 20 : weakEvidencePoints(file.path),\r\n isRuntimeEvidence: pathClass === 'runtime'\r\n });\r\n }\r\n\r\n for (const importName of rule.imports ?? []) {\r\n if (!containsImport(sourceLowerContent, importName)) {\r\n continue;\r\n }\r\n\r\n const weakKind = weakPathKind(file.path, 'sdk-import-source');\r\n addEvidence(evidence, rule, {\r\n kind: weakKind ?? 'sdk-import-source',\r\n strength: pathClass === 'runtime' ? 'strong' : 'weak',\r\n label: `${rule.label} SDK import ${pathClass === 'runtime' ? 'in runtime source' : 'outside runtime source'}`,\r\n file: file.displayPath,\r\n detail: importName,\r\n points: pathClass === 'runtime' ? 35 : weakEvidencePoints(file.path),\r\n isRuntimeEvidence: pathClass === 'runtime'\r\n });\r\n }\r\n\r\n for (const item of rule.content ?? []) {\r\n if (!testRegex(item.pattern, sourceContent)) {\r\n continue;\r\n }\r\n\r\n const strongKind = contentSignalKind(item.signal);\r\n const weakKind = weakPathKind(file.path, strongKind);\r\n addEvidence(evidence, rule, {\r\n kind: weakKind ?? strongKind,\r\n strength: pathClass === 'runtime' ? 'strong' : 'weak',\r\n label: `${rule.label} ${pathClass === 'runtime' ? 'runtime content signal' : 'weak content reference'}`,\r\n file: file.displayPath,\r\n detail: item.signal,\r\n points: pathClass === 'runtime' ? 35 : weakEvidencePoints(file.path),\r\n isRuntimeEvidence: pathClass === 'runtime'\r\n });\r\n }\r\n\r\n if (isDocsLikePath(file.path)) {\r\n for (const docsTerm of rule.docs ?? []) {\r\n if (!file.lowerContent.includes(docsTerm.toLowerCase())) {\r\n continue;\r\n }\r\n\r\n addEvidence(evidence, rule, {\r\n kind: 'docs-mention',\r\n strength: 'weak',\r\n label: `${rule.label} mentioned in docs`,\r\n file: file.displayPath,\r\n detail: docsTerm,\r\n points: 4,\r\n isRuntimeEvidence: false\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return evidence.sort(compareEvidence);\r\n}\r\n\r\nfunction buildRow(\r\n rule: ProviderDetectionRule,\r\n evidence: ProviderTruthEvidenceItem[],\r\n selected: boolean\r\n): ProviderTruthRow {\r\n const score = evidence.reduce((total, item) => total + item.points, 0);\r\n const roles = rolesForEvidence(evidence, selected);\r\n applyMcpSupportRoles(rule.provider, roles);\r\n const confidence = confidenceForEvidence(evidence, roles);\r\n const mcpProof = mcpProofForProvider(rule.provider);\r\n\r\n return {\r\n area: rule.area,\r\n provider: rule.provider,\r\n providerLabel: providerLabel(rule.provider),\r\n roles,\r\n confidence,\r\n score,\r\n statusBadges: statusBadgesForRoles(roles, confidence),\r\n evidence,\r\n mcpProof,\r\n manualProof: {\r\n status: 'not-checked',\r\n evidence: []\r\n },\r\n recommendedActions: [recommendedActionForRoles(roles)]\r\n };\r\n}\r\n\r\nfunction buildSelectedOnlyRow(area: ProductionConnectionArea, provider: ProductionConnectionProvider): ProviderTruthRow {\r\n const roles: ProviderTruthRole[] = ['selected'];\r\n applyMcpSupportRoles(provider, roles);\r\n const mcpProof = mcpProofForProvider(provider);\r\n\r\n return {\r\n area,\r\n provider,\r\n providerLabel: providerLabel(provider),\r\n roles,\r\n confidence: 'low',\r\n score: 0,\r\n statusBadges: ['SELECTED'],\r\n evidence: [],\r\n mcpProof,\r\n manualProof: {\r\n status: 'not-checked',\r\n evidence: []\r\n },\r\n recommendedActions: [recommendedActionForRoles(roles)]\r\n };\r\n}\r\n\r\nfunction buildArea(area: ProductionConnectionArea, rows: ProviderTruthRow[]): ProviderTruthArea {\r\n const sortedRows = rows.sort(compareRows);\r\n const runtimeDetected = sortedRows.find((row) =>\r\n row.evidence.some((item) => item.strength === 'strong' && item.isRuntimeEvidence)\r\n ) ?? null;\r\n\r\n for (const row of sortedRows) {\r\n row.roles = row.roles.filter((role) => role !== 'using-now');\r\n if (row === runtimeDetected) {\r\n addRole(row.roles, 'runtime-code');\r\n row.confidence = 'high';\r\n } else {\r\n row.roles = row.roles.filter((role) => role !== 'runtime-code');\r\n row.confidence = confidenceForEvidence(row.evidence, row.roles);\r\n }\r\n row.statusBadges = statusBadgesForRoles(row.roles, row.confidence);\r\n row.recommendedActions = [recommendedActionForRoles(row.roles)];\r\n }\r\n\r\n const selected = sortedRows.find((row) => row.roles.includes('selected')) ?? null;\r\n const liveVerified = sortedRows.find((row) =>\r\n row.roles.includes('live-verified') || row.mcpProof.status === 'live-verified'\r\n ) ?? null;\r\n if (liveVerified) {\r\n addRole(liveVerified.roles, 'using-now');\r\n liveVerified.statusBadges = statusBadgesForRoles(liveVerified.roles, liveVerified.confidence);\r\n liveVerified.recommendedActions = [recommendedActionForRoles(liveVerified.roles)];\r\n }\r\n const usingNow = liveVerified;\r\n const conflicts = conflictsForArea(area, selected, runtimeDetected);\r\n\r\n if (conflicts.length > 0) {\r\n for (const row of sortedRows) {\r\n if (conflicts.some((conflict) => conflict.providerKeys.includes(row.provider))) {\r\n addRole(row.roles, 'conflict');\r\n row.statusBadges = statusBadgesForRoles(row.roles, row.confidence);\r\n row.recommendedActions = [recommendedActionForRoles(row.roles)];\r\n }\r\n }\r\n }\r\n\r\n return {\r\n area,\r\n rows: sortedRows,\r\n usingNow,\r\n runtimeDetected,\r\n liveVerified,\r\n selected,\r\n conflicts,\r\n recommendedAction: areaRecommendedAction(area, sortedRows, conflicts)\r\n };\r\n}\r\n\r\nfunction conflictsForArea(\r\n area: ProductionConnectionArea,\r\n selected: ProviderTruthRow | null,\r\n runtimeDetected: ProviderTruthRow | null\r\n): ProviderTruthConflict[] {\r\n if (!selected || !runtimeDetected || selected.provider === runtimeDetected.provider || runtimeDetected.confidence !== 'high') {\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n type: 'selected-vs-repo',\r\n severity: launchCriticalArea(area) ? 'critical' : 'warning',\r\n title: `${area} provider mismatch`,\r\n detail: `${selected.providerLabel} is selected, but runtime repository evidence points to ${runtimeDetected.providerLabel}. Decide which provider is intended before launch validation continues.`,\r\n providerKeys: [selected.provider, runtimeDetected.provider],\r\n evidence: runtimeDetected.evidence,\r\n recommendedAction: {\r\n kind: 'resolve-conflict',\r\n label: 'Resolve provider mismatch',\r\n reason: 'The selected provider differs from high-confidence runtime repo evidence.',\r\n promptTemplate: 'provider-mismatch-decision',\r\n primary: true\r\n }\r\n }\r\n ];\r\n}\r\n\r\nfunction rolesForEvidence(evidence: ProviderTruthEvidenceItem[], selected: boolean): ProviderTruthRole[] {\r\n const roles: ProviderTruthRole[] = [];\r\n const hasStrongRuntime = evidence.some((item) => item.strength === 'strong' && item.isRuntimeEvidence);\r\n const hasRepoEvidence = evidence.length > 0;\r\n const hasOnlyDocs = evidence.length > 0 && evidence.every((item) => item.kind === 'docs-mention');\r\n const hasWeakNonRuntimeSource = evidence.some(\r\n (item) => item.strength === 'weak' && !item.isRuntimeEvidence && item.kind !== 'package-installed'\r\n );\r\n const hasOnlyPackages = evidence.length > 0 && evidence.every((item) => item.kind === 'package-installed');\r\n\r\n if (hasStrongRuntime) {\r\n roles.push('runtime-code');\r\n }\r\n if (selected) {\r\n roles.push('selected');\r\n }\r\n if (hasRepoEvidence) {\r\n roles.push('detected-in-repo');\r\n }\r\n if (hasOnlyDocs) {\r\n roles.push('mentioned-only');\r\n } else if (hasWeakNonRuntimeSource && !hasStrongRuntime) {\r\n roles.push('legacy-or-unused');\r\n }\r\n if (hasOnlyPackages) {\r\n roles.push('alternative');\r\n }\r\n\r\n return roles.length > 0 ? roles : ['alternative'];\r\n}\r\n\r\nfunction confidenceForEvidence(\r\n evidence: ProviderTruthEvidenceItem[],\r\n roles: ProviderTruthRole[]\r\n): ProviderTruthConfidence {\r\n if (roles.includes('live-verified') || roles.includes('using-now') || roles.includes('runtime-code')) {\r\n return 'high';\r\n }\r\n if (evidence.some((item) => item.strength === 'medium')) {\r\n return 'medium';\r\n }\r\n if (evidence.length > 0 || roles.includes('selected')) {\r\n return 'low';\r\n }\r\n return 'none';\r\n}\r\n\r\nfunction recommendedActionForRoles(roles: ProviderTruthRole[]): ProviderTruthRecommendedAction {\r\n if (roles.includes('conflict')) {\r\n return {\r\n kind: 'resolve-conflict',\r\n label: 'Resolve provider mismatch',\r\n reason: 'This provider is part of a selected-vs-repository mismatch that must be resolved before launch validation continues.',\r\n promptTemplate: 'provider-mismatch-decision',\r\n primary: true\r\n };\r\n }\r\n\r\n if (roles.includes('needs-mcp')) {\r\n return {\r\n kind: 'connect-mcp',\r\n label: 'Connect MCP and verify provider',\r\n reason: 'This provider has an MCP template, but no live provider proof was checked in this task.',\r\n promptTemplate: 'mcp-verification',\r\n primary: true\r\n };\r\n }\r\n\r\n if (roles.includes('manual-only')) {\r\n return {\r\n kind: 'manual-check',\r\n label: 'Verify provider manually',\r\n reason: 'No MCP template is available for this provider, so live proof requires manual dashboard verification.',\r\n promptTemplate: 'manual-check',\r\n primary: true\r\n };\r\n }\r\n\r\n if (roles.includes('live-verified') || roles.includes('using-now')) {\r\n return {\r\n kind: 'none',\r\n label: 'Live provider verified',\r\n reason: 'Authenticated MCP/API proof verified this provider as live.',\r\n promptTemplate: null,\r\n primary: false\r\n };\r\n }\r\n\r\n if (roles.includes('runtime-code')) {\r\n return {\r\n kind: 'manual-check',\r\n label: 'Confirm provider in dashboard',\r\n reason: 'Runtime repo evidence exists, but no live provider proof was checked in this task.',\r\n promptTemplate: 'manual-check',\r\n primary: true\r\n };\r\n }\r\n\r\n if (roles.includes('mentioned-only') || roles.includes('legacy-or-unused')) {\r\n return {\r\n kind: 'manual-check',\r\n label: 'Check whether this provider is still intended',\r\n reason: 'Evidence appears outside runtime source, so it should not be treated as active.',\r\n promptTemplate: 'manual-check',\r\n primary: true\r\n };\r\n }\r\n\r\n return {\r\n kind: 'connect-mcp',\r\n label: 'Connect MCP or verify manually',\r\n reason: 'Repo evidence alone cannot prove a live provider connection.',\r\n promptTemplate: 'mcp-verification',\r\n primary: true\r\n };\r\n}\r\n\r\nfunction areaRecommendedAction(\r\n area: ProductionConnectionArea,\r\n rows: ProviderTruthRow[],\r\n conflicts: ProviderTruthConflict[]\r\n): ProviderTruthRecommendedAction {\r\n const primaryConflict = conflicts.find((conflict) => conflict.recommendedAction.primary);\r\n if (primaryConflict) {\r\n return primaryConflict.recommendedAction;\r\n }\r\n\r\n const primary = rows[0]?.recommendedActions[0];\r\n if (primary) {\r\n return primary;\r\n }\r\n\r\n return {\r\n kind: 'manual-check',\r\n label: `Review ${area} provider`,\r\n reason: 'No provider candidates were found in the repository scan.',\r\n promptTemplate: 'manual-check',\r\n primary: true\r\n };\r\n}\r\n\r\nfunction statusBadgesForRoles(roles: ProviderTruthRole[], confidence: ProviderTruthConfidence): string[] {\r\n const badges: string[] = [];\r\n if (roles.includes('conflict')) {\r\n badges.push('CONFLICT');\r\n }\r\n if (roles.includes('live-verified')) {\r\n badges.push('USING NOW');\r\n }\r\n if (roles.includes('runtime-code') || roles.includes('using-now')) {\r\n badges.push('RUNTIME CODE');\r\n }\r\n if (roles.includes('detected-in-repo')) {\r\n badges.push('REPO EVIDENCE');\r\n }\r\n if (roles.includes('legacy-or-unused')) {\r\n badges.push('LEGACY OR UNUSED');\r\n }\r\n if (roles.includes('needs-mcp')) {\r\n badges.push('NEEDS MCP');\r\n }\r\n if (roles.includes('manual-only')) {\r\n badges.push('MANUAL ONLY');\r\n }\r\n if (roles.includes('mentioned-only')) {\r\n badges.push('MENTIONED ONLY');\r\n }\r\n if (roles.includes('selected')) {\r\n badges.push('SELECTED');\r\n }\r\n badges.push(confidence.toUpperCase());\r\n return badges;\r\n}\r\n\r\nfunction addEvidence(\r\n evidence: ProviderTruthEvidenceItem[],\r\n rule: ProviderDetectionRule,\r\n item: Omit<ProviderTruthEvidenceItem, 'id' | 'isLiveProof' | 'isManualProof'>\r\n): void {\r\n const id = [\r\n rule.area,\r\n rule.provider,\r\n item.kind,\r\n item.file ?? '',\r\n item.detail ?? item.label\r\n ].map(slug).filter(Boolean).join('-');\r\n\r\n if (evidence.some((existing) => existing.id === id)) {\r\n return;\r\n }\r\n\r\n evidence.push({\r\n id,\r\n ...item,\r\n isLiveProof: false,\r\n isManualProof: false\r\n });\r\n}\r\n\r\nfunction weakPathKind(path: string, fallback: ProviderTruthEvidenceKind): ProviderTruthEvidenceKind | null {\r\n if (classifyProviderEvidencePath(path) === 'runtime') {\r\n return null;\r\n }\r\n if (isDocsLikePath(path)) {\r\n return 'docs-mention';\r\n }\r\n if (/(^|\\/)(__tests__|tests)(\\/|$)|\\.(test|spec)\\.[jt]sx?$/.test(normalizePath(path))) {\r\n return 'test-reference';\r\n }\r\n if (/(^|\\/)(tmp|out|outputs|videos|marketing|examples|demo)(\\/|$)/.test(normalizePath(path))) {\r\n return 'tmp-demo-example';\r\n }\r\n return fallback;\r\n}\r\n\r\nfunction routeKind(path: string): ProviderTruthEvidenceKind {\r\n if (/webhook/.test(path)) {\r\n return 'webhook-handler';\r\n }\r\n if (/checkout|billing/.test(path)) {\r\n return 'checkout-handler';\r\n }\r\n if (/config|\\.json$|\\.toml$|\\.ya?ml$/.test(path)) {\r\n return 'deployment-config';\r\n }\r\n return 'active-runtime-route';\r\n}\r\n\r\nfunction contentSignalKind(signal: string): ProviderTruthEvidenceKind {\r\n if (/checkout/i.test(signal)) {\r\n return 'checkout-handler';\r\n }\r\n if (/webhook/i.test(signal)) {\r\n return 'webhook-handler';\r\n }\r\n if (/config/i.test(signal)) {\r\n return 'provider-config';\r\n }\r\n return 'active-runtime-route';\r\n}\r\n\r\nfunction weakEvidencePoints(path: string): number {\r\n if (isDocsLikePath(path)) {\r\n return 4;\r\n }\r\n if (/(^|\\/)(__tests__|tests)(\\/|$)|\\.(test|spec)\\.[jt]sx?$/.test(normalizePath(path))) {\r\n return 6;\r\n }\r\n return 8;\r\n}\r\n\r\nfunction toScannableFile(file: ScanResult['files'][number]): ScannableFile {\r\n const content = file.isSecret || typeof file.content !== 'string' ? '' : file.content;\r\n const executableContent = stripComments(content);\r\n return {\r\n path: normalizePath(file.path),\r\n displayPath: file.path.replace(/\\\\/g, '/'),\r\n content,\r\n executableContent,\r\n lowerContent: content.toLowerCase(),\r\n lowerExecutableContent: executableContent.toLowerCase()\r\n };\r\n}\r\n\r\nfunction collectPathLines(scan: ScanResult, files: ScannableFile[]): string[] {\r\n const paths = new Set<string>();\r\n\r\n for (const path of scan.fileTree.split(/\\r?\\n/)) {\r\n const normalized = normalizePath(path.trim());\r\n if (normalized) {\r\n paths.add(normalized);\r\n }\r\n }\r\n for (const file of files) {\r\n paths.add(file.path);\r\n }\r\n\r\n return [...paths];\r\n}\r\n\r\nfunction containsImport(content: string, importName: string): boolean {\r\n const escaped = importName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').toLowerCase();\r\n return new RegExp(`(?:from\\\\s+['\"]${escaped}['\"]|import\\\\s*\\\\(\\\\s*['\"]${escaped}['\"]|require\\\\s*\\\\(\\\\s*['\"]${escaped}['\"])`).test(content);\r\n}\r\n\r\nfunction isDocsLikePath(path: string): boolean {\r\n const normalized = normalizePath(path);\r\n return /(^|\\/)(readme|product|spec)\\.mdx?$/.test(normalized) || /(^|\\/)docs\\/.*\\.mdx?$/.test(normalized);\r\n}\r\n\r\nfunction stripComments(content: string): string {\r\n return content\r\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\r\n .replace(/(^|[^:])\\/\\/.*$/gm, '$1');\r\n}\r\n\r\nfunction compareRows(a: ProviderTruthRow, b: ProviderTruthRow): number {\r\n return rowPriority(b) - rowPriority(a) || b.score - a.score || a.provider.localeCompare(b.provider);\r\n}\r\n\r\nfunction compareEvidence(a: ProviderTruthEvidenceItem, b: ProviderTruthEvidenceItem): number {\r\n return b.points - a.points || a.kind.localeCompare(b.kind) || (a.file ?? '').localeCompare(b.file ?? '');\r\n}\r\n\r\nfunction normalizePath(path: string): string {\r\n return path.replace(/\\\\/g, '/').toLowerCase();\r\n}\r\n\r\nfunction rowPriority(row: ProviderTruthRow): number {\r\n if (row.roles.includes('live-verified')) {\r\n return 600;\r\n }\r\n if (row.roles.includes('runtime-code') || row.roles.includes('using-now')) {\r\n return 500;\r\n }\r\n if (row.evidence.some((item) => item.strength === 'strong' && item.isRuntimeEvidence)) {\r\n return 450;\r\n }\r\n if (row.roles.includes('selected')) {\r\n return 400;\r\n }\r\n if (\r\n row.roles.includes('detected-in-repo') &&\r\n row.evidence.some((item) => item.strength !== 'weak' && item.kind !== 'package-installed')\r\n ) {\r\n return 300;\r\n }\r\n if (row.roles.includes('detected-in-repo')) {\r\n return 200;\r\n }\r\n return 100;\r\n}\r\n\r\nfunction rowRequiresManualFallback(row: ProviderTruthRow): boolean {\r\n return row.roles.includes('manual-only') || row.mcpProof.status === 'unsupported';\r\n}\r\n\r\nfunction launchCriticalArea(area: ProductionConnectionArea): boolean {\r\n return area === 'payments' ||\r\n area === 'auth' ||\r\n area === 'database' ||\r\n area === 'deployment' ||\r\n area === 'security';\r\n}\r\n\r\nfunction applyMcpSupportRoles(provider: ProductionConnectionProvider, roles: ProviderTruthRole[]): void {\r\n addRole(roles, mcpTemplateForProvider(provider) ? 'needs-mcp' : 'manual-only');\r\n}\r\n\r\nfunction mcpProofForProvider(provider: ProductionConnectionProvider): ProviderTruthRow['mcpProof'] {\r\n const template = mcpTemplateForProvider(provider);\r\n if (!template) {\r\n return {\r\n status: 'unsupported',\r\n evidence: [],\r\n readOnly: true\r\n };\r\n }\r\n\r\n return {\r\n status: 'needs-mcp',\r\n providerServerId: template.serverName,\r\n evidence: [],\r\n readOnly: true\r\n };\r\n}\r\n\r\nfunction testRegex(pattern: RegExp, value: string): boolean {\r\n pattern.lastIndex = 0;\r\n return pattern.test(value);\r\n}\r\n\r\nfunction slug(value: string): string {\r\n return value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\r\n}\r\n\r\nfunction addRole(roles: ProviderTruthRole[], role: ProviderTruthRole): void {\r\n if (!roles.includes(role)) {\r\n roles.unshift(role);\r\n }\r\n}\r\n", "import type { ScanResult } from './types';\r\n\r\nexport function buildAnalysisPrompt(\r\n scan: ScanResult,\r\n specContent?: string,\r\n productionConnectionContext?: string,\r\n scannerEvidenceContext?: string,\r\n stackWiringContext?: string,\r\n stackAutomationContext?: string\r\n): string {\r\n const sections: string[] = [];\r\n\r\n const detectedStack = (Object.entries(scan.stackSignals) as Array<[string, boolean | undefined]>)\r\n .filter(([, v]) => v === true)\r\n .map(([k]) => k)\r\n .join(', ');\r\n\r\n sections.push(`## PROJECT CONTEXT\r\nTotal files in repo: ${scan.totalFilesScanned}\r\nFiles analyzed: ${scan.files.length}\r\nDetected stack signals: ${detectedStack || 'none detected'}\r\nAll dependencies: ${scan.packageDeps.join(', ') || 'none found'}\r\nSecret files found (contents not read): ${scan.secretsFound.join(', ') || 'none'}\r\n`);\r\n\r\n if (scan.fileTree) {\r\n sections.push(`## FILE TREE (compact)\r\n${scan.fileTree}\r\n`);\r\n }\r\n\r\n if (specContent && specContent.trim().length > 0) {\r\n sections.push(`## PROJECT SPEC (SPEC.md)\r\n${specContent.slice(0, 4000)}\r\n`);\r\n }\r\n\r\n const filesWithContent = scan.files.filter((f) => !f.isSecret && f.content !== null && f.content.trim().length > 0);\r\n if (filesWithContent.length > 0) {\r\n sections.push('## FILE CONTENTS (highest relevance first)');\r\n for (const file of filesWithContent) {\r\n const safePath = file.path.replace(/[\\r\\n]/g, ' ');\r\n const escapedContent = (file.content as string).replace(/`{3}/g, '\\\\`\\\\`\\\\`');\r\n sections.push(`### ${safePath} (heat: ${file.heat})\\n\\`\\`\\`\\n${escapedContent}\\n\\`\\`\\`\\n`);\r\n }\r\n }\r\n\r\n if (productionConnectionContext && productionConnectionContext.trim().length > 0) {\r\n sections.push(productionConnectionContext.trim());\r\n }\r\n\r\n if (scannerEvidenceContext && scannerEvidenceContext.trim().length > 0) {\r\n sections.push(`## LOCAL SCANNER EVIDENCE\r\n${scannerEvidenceContext.trim()}\r\n`);\r\n }\r\n\r\n if (stackWiringContext && stackWiringContext.trim().length > 0) {\r\n sections.push(stackWiringContext.trim());\r\n }\r\n\r\n if (stackAutomationContext && stackAutomationContext.trim().length > 0) {\r\n sections.push(stackAutomationContext.trim());\r\n }\r\n\r\n sections.push(`## YOUR TASK\r\n\r\nYou are a senior software engineer reviewing a vibe-coded project for production readiness.\r\nAnalyze everything above and return ONLY valid JSON with this exact structure:\r\n\r\n{\r\n \"score\": 75,\r\n \"scoreLabel\": \"Stable\",\r\n \"summary\": \"2 critical gaps before launch\",\r\n \"archetype\": \"saas-app\",\r\n \"gaps\": [\r\n {\r\n \"id\": \"unique-kebab-id\",\r\n \"category\": \"SECURITY & AUTH\",\r\n \"severity\": \"critical\",\r\n \"title\": \"No rate limiting on API routes\",\r\n \"detail\": \"Any user can spam your API endpoints causing cost and abuse.\",\r\n \"primaryMapCategory\": \"security\",\r\n \"affectedMapCategories\": [\"security\", \"backend\", \"auth\"],\r\n \"copyPrompt\": \"Harden API rate limiting. First inspect src, route handlers, middleware, and existing auth/session helpers. Identify every public or write-heavy endpoint that can be abused. Implement: 1. Add Upstash rate limiting to sensitive API routes. 2. Use conservative defaults such as 10 requests per minute per IP for auth/write endpoints. 3. Return clear 429 responses without leaking internals. Constraints: Preserve existing API contracts unless they are unsafe. Do not rely on client-side checks for server protection. Verification: Add or update tests/manual checks for allowed and rate-limited requests. Run the relevant test suite and TypeScript check. Summarize what changed and what scanner/rescan evidence should confirm.\",\r\n \"toolSuggestions\": [\r\n {\r\n \"name\": \"Upstash Rate Limit\",\r\n \"url\": \"https://upstash.com/docs/redis/sdks/ratelimit-ts/overview\",\r\n \"reason\": \"Best rate limiter for serverless/edge\"\r\n }\r\n ],\r\n \"mcpSuggestion\": null\r\n }\r\n ],\r\n \"stackDetected\": [\"nextjs\", \"supabase\", \"typescript\"],\r\n \"missingLayers\": [\"landing-page\", \"error-monitoring\"],\r\n \"quickWins\": [\"Add .env.example\", \"Add error boundary to root layout\"],\r\n \"productionChecklist\": {\r\n \"security\": 40,\r\n \"database\": 80,\r\n \"auth\": 60,\r\n \"errorHandling\": 30,\r\n \"deployment\": 70,\r\n \"testing\": 10,\r\n \"landing\": 50,\r\n \"monitoring\": 0\r\n }\r\n}\r\n\r\nGap categories must be one of:\r\nSECURITY & AUTH, DATABASE & DATA, ERROR HANDLING, DEPLOYMENT,\r\nPERFORMANCE, MISSING FEATURES, EDGE CASES & RISKS, LANDING & MARKETING\r\n\r\nMission Map category keys must be one of:\r\nappFlow, frontend, backend, auth, database, payments, deployment, monitoring, security, testing, landing, errorHandling\r\n\r\nSeverity: critical (blocks launch), warning (should fix soon), info (nice to have)\r\nScore: 0-100 overall production readiness. Be honest \u2014 most vibe-coded projects score 30-60.\r\nUse a stable scoring rubric: the same evidence should receive the same score on repeat scans. Do not move the score up or down for wording variety; only change it when the scanned evidence changes.\r\n\r\nReturn unique root gaps, not one copy of the same root problem for each affected section. For each gap:\r\n- Set primaryMapCategory to the single Mission Map section that should own/count the blocker.\r\n- Set affectedMapCategories to related sections that the blocker touches, but do not duplicate the gap for those sections.\r\n- Example: \"No production error monitoring is wired up\" should be one monitoring gap with affectedMapCategories such as [\"monitoring\", \"errorHandling\", \"auth\", \"payments\", \"backend\"], not separate auth, billing, backend, and error gaps.\r\n- Example: \"Auth enforcement is split across app layers\" should be one auth or security gap, depending on the strongest evidence, not repeated across every protected route.\r\n\r\nFor toolSuggestions: suggest real tools that solve this specific gap.\r\n- Database gaps: suggest Supabase, PlanetScale, Neon, Turso, or MongoDB Atlas based on detected stack.\r\n- Auth gaps: suggest Supabase Auth, Clerk, NextAuth, or Lucia based on detected stack.\r\n- Monitoring: suggest Sentry, LogRocket, or PostHog.\r\n- Deployment: suggest Vercel, Railway, Fly.io, or Render.\r\n\r\nEvery copyPrompt must be ready to paste into a coding agent. Use this VibeRaven execution structure inside the string:\r\n\r\n1. Start with the outcome in one sentence.\r\n2. Include a \"First inspect\" paragraph naming concrete files, directories, or helpers from the scanned project when possible.\r\n3. Include an \"Implement\" section with numbered steps.\r\n4. Include a \"Constraints\" section with safety rules and behavior that must not break.\r\n5. Include a \"Verification\" section with tests, commands, manual checks, or scanner evidence.\r\n6. End by asking the agent to \"Summarize what changed\" and what remains manual or external.\r\n\r\nMake each gap Raven-friendly: include a concrete copyPrompt, likely tool paths where relevant, and verification steps the user or scanner can check after implementation. Do not claim external dashboard setup is complete from repo evidence alone. If a step needs a provider dashboard, account, MCP connection, billing console, OAuth callback, RLS setting, alert route, or any other external system, say so explicitly and mark it as manual or MCP-verifiable instead of repo-verifiable.\r\n\r\nBe specific. A vibe coder needs to know EXACTLY what to do, not generic advice.\r\nReturn ONLY the JSON object \u2014 no markdown, no explanation.\r\n`);\r\n\r\n return sections.join('\\n');\r\n}\r\n", "import type { EnvEvidenceMode, EnvVarEvidence, ScanResult } from './types';\r\n\r\nfunction normalizeEvidencePath(path: string): string {\r\n return path.replace(/\\\\/g, '/');\r\n}\r\n\r\nfunction uniquePaths(paths: string[]): string[] {\r\n return Array.from(new Set(paths.map(normalizeEvidencePath)));\r\n}\r\n\r\nfunction escapeRegExp(value: string): string {\r\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\nfunction stripEnvValueQuotes(value: string): string {\r\n const trimmed = value.trim();\r\n const quote = trimmed[0];\r\n\r\n if ((quote === '\"' || quote === \"'\") && trimmed.endsWith(quote)) {\r\n return trimmed.slice(1, -1);\r\n }\r\n\r\n return trimmed;\r\n}\r\n\r\nexport function classifySafeEnvMode(value: string): EnvEvidenceMode {\r\n const normalized = stripEnvValueQuotes(value).toLowerCase();\r\n\r\n if (/^(?:sk|pk|rk)_test_/.test(normalized) || normalized.includes('_test_') || normalized.includes('test_example')) {\r\n return 'test';\r\n }\r\n\r\n if (/^(?:sk|pk|rk)_live_/.test(normalized) || normalized.includes('_live_') || normalized.includes('live_example')) {\r\n return 'live';\r\n }\r\n\r\n return 'unknown';\r\n}\r\n\r\nexport function collectEnvVarEvidence(scan: ScanResult, names: string[]): EnvVarEvidence[] {\r\n const nonSecretFiles = scan.files.filter((file) => !file.isSecret && typeof file.content === 'string');\r\n const secretEvidence = uniquePaths(scan.secretsFound);\r\n\r\n return names.map((name) => {\r\n const assignmentPattern = new RegExp(\r\n String.raw`^[ \\t]*(?:export[ \\t]+)?${escapeRegExp(name)}[ \\t]*=[ \\t]*([^\\r\\n#]*)`,\r\n 'm'\r\n );\r\n const namePattern = new RegExp(\r\n String.raw`^[ \\t]*(?:export[ \\t]+)?${escapeRegExp(name)}(?:[ \\t]*=|[ \\t]*(?:#|$))`,\r\n 'm'\r\n );\r\n const contentEvidence: string[] = [];\r\n const nameOnlyEvidence: string[] = [];\r\n const nonEmptyAssignmentEvidence: string[] = [];\r\n let mode: EnvEvidenceMode = 'unknown';\r\n\r\n for (const file of nonSecretFiles) {\r\n const content = file.content as string;\r\n const assignment = content.match(assignmentPattern);\r\n\r\n if (assignment) {\r\n const value = assignment[1] ?? '';\r\n const classifiedMode = classifySafeEnvMode(value);\r\n\r\n if (classifiedMode !== 'unknown') {\r\n contentEvidence.push(file.path);\r\n mode = classifiedMode;\r\n continue;\r\n }\r\n\r\n if (stripEnvValueQuotes(value).length > 0) {\r\n nonEmptyAssignmentEvidence.push(file.path);\r\n continue;\r\n }\r\n }\r\n\r\n if (namePattern.test(content)) {\r\n nameOnlyEvidence.push(file.path);\r\n }\r\n }\r\n\r\n if (contentEvidence.length > 0) {\r\n return {\r\n name,\r\n present: true,\r\n mode,\r\n source: 'non-secret-content',\r\n evidence: uniquePaths(contentEvidence).map((path) => `file: ${path}`)\r\n };\r\n }\r\n\r\n if (nonEmptyAssignmentEvidence.length > 0) {\r\n return {\r\n name,\r\n present: true,\r\n mode: 'unknown',\r\n source: 'non-secret-content',\r\n evidence: uniquePaths(nonEmptyAssignmentEvidence).map((path) => `file: ${path}`)\r\n };\r\n }\r\n\r\n if (nameOnlyEvidence.length > 0) {\r\n return {\r\n name,\r\n present: true,\r\n mode: 'unknown',\r\n source: 'variable-name-only',\r\n evidence: uniquePaths(nameOnlyEvidence).map((path) => `file: ${path}`)\r\n };\r\n }\r\n\r\n if (secretEvidence.length > 0) {\r\n return {\r\n name,\r\n present: false,\r\n mode: 'unknown',\r\n source: 'secret-file-path',\r\n evidence: secretEvidence.map((path) => `secret file: ${path}`)\r\n };\r\n }\r\n\r\n return {\r\n name,\r\n present: false,\r\n mode: 'unknown',\r\n source: 'variable-name-only',\r\n evidence: []\r\n };\r\n });\r\n}\r\n", "import { collectEnvVarEvidence } from './envEvidence';\r\nimport type {\r\n RepositoryEvidenceItem,\r\n RepositoryEvidenceSummary,\r\n ScanResult,\r\n ScannedFile\r\n} from './types';\r\n\r\nconst CORE_ENV_NAMES = [\r\n 'STRIPE_SECRET_KEY',\r\n 'STRIPE_WEBHOOK_SECRET',\r\n 'NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY',\r\n 'GOOGLE_CLIENT_ID',\r\n 'GOOGLE_CLIENT_SECRET',\r\n 'NEXT_PUBLIC_SUPABASE_URL',\r\n 'NEXT_PUBLIC_SUPABASE_ANON_KEY',\r\n 'SUPABASE_SERVICE_ROLE_KEY',\r\n 'NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY',\r\n 'CLERK_SECRET_KEY',\r\n 'AUTH_SECRET',\r\n 'NEXTAUTH_SECRET',\r\n 'VERCEL_PROJECT_ID',\r\n 'SENTRY_DSN',\r\n 'NEXT_PUBLIC_SENTRY_DSN',\r\n 'SENTRY_AUTH_TOKEN',\r\n 'NEXT_PUBLIC_POSTHOG_KEY',\r\n 'PADDLE_API_KEY',\r\n 'PADDLE_WEBHOOK_SECRET',\r\n 'UPSTASH_REDIS_REST_URL',\r\n 'UPSTASH_REDIS_REST_TOKEN',\r\n 'NEXT_PUBLIC_TURNSTILE_SITE_KEY',\r\n 'TURNSTILE_SECRET_KEY'\r\n];\r\n\r\nconst SECRET_ENV_REFERENCE = /\\b(?:STRIPE_SECRET_KEY|STRIPE_WEBHOOK_SECRET|GOOGLE_CLIENT_SECRET|SUPABASE_SERVICE_ROLE_KEY|CLERK_SECRET_KEY|AUTH_SECRET|NEXTAUTH_SECRET|SENTRY_AUTH_TOKEN|PADDLE_API_KEY|PADDLE_WEBHOOK_SECRET|UPSTASH_REDIS_REST_TOKEN|TURNSTILE_SECRET_KEY)\\b/i;\r\nconst RLS_POLICY = /enable\\s+row\\s+level\\s+security|create\\s+policy|alter\\s+policy/i;\r\nconst WEBHOOK_SIGNATURE = /webhooks\\.constructevent|stripe-signature|verify(?:signature|webhook)|svix\\.webhook|webhook\\.verify/i;\r\nconst RATE_LIMIT = /ratelimit|rate-limit|rate_limiter|too many requests|status\\s*:\\s*429/i;\r\nconst OAUTH_CALLBACK = /oauth|callback|redirect_uri|redirecturl|authorized redirect|allowed redirect/i;\r\nconst SECURITY_HEADERS = /content-security-policy|strict-transport-security|x-frame-options|x-content-type-options|referrer-policy|permissions-policy/i;\r\nconst SERVICE_ROLE = /\\bSUPABASE_SERVICE_ROLE_KEY\\b|service[-_]?role/i;\r\nconst SERVER_ONLY_HINT = /server-only|\\.server\\.|\\/server\\/|app\\/api\\/|pages\\/api\\/|\\/api\\/|route\\.[jt]s|actions?\\.[jt]s/i;\r\nconst ENV_OR_DOC_PATH = /(^|\\/)(\\.env\\.example|env\\.example|readme|docs?)|\\.md$/i;\r\n\r\nexport function analyzeRepositoryEvidence(scan: ScanResult): RepositoryEvidenceSummary {\r\n const files = visibleFiles(scan);\r\n const pathBlob = `${scan.fileTree}\\n${scan.files.map((file) => file.path).join('\\n')}`.replace(/\\\\/g, '/');\r\n const contentBlob = files.map((file) => file.content as string).join('\\n');\r\n\r\n return {\r\n env: collectEnvVarEvidence(scan, CORE_ENV_NAMES),\r\n security: [\r\n clientSecretReference(files),\r\n serviceRoleScope(files),\r\n foundOrMissing(\r\n 'supabase-rls-policy',\r\n 'Supabase RLS policy evidence',\r\n RLS_POLICY.test(contentBlob),\r\n evidenceFor(files, RLS_POLICY)\r\n ),\r\n foundOrMissing(\r\n 'webhook-signature-verification',\r\n 'Webhook signature verification evidence',\r\n WEBHOOK_SIGNATURE.test(contentBlob),\r\n evidenceFor(files, WEBHOOK_SIGNATURE)\r\n ),\r\n foundOrMissing(\r\n 'rate-limit-evidence',\r\n 'Rate limit evidence',\r\n Boolean(scan.stackSignals.hasRateLimit) || RATE_LIMIT.test(contentBlob),\r\n evidenceFor(files, RATE_LIMIT)\r\n ),\r\n foundOrMissing(\r\n 'oauth-callback-evidence',\r\n 'OAuth callback or redirect evidence',\r\n OAUTH_CALLBACK.test(`${contentBlob}\\n${pathBlob}`),\r\n evidenceFor(files, OAUTH_CALLBACK).concat(pathEvidence(scan, OAUTH_CALLBACK))\r\n ),\r\n foundOrMissing(\r\n 'security-headers',\r\n 'Security headers evidence',\r\n SECURITY_HEADERS.test(contentBlob),\r\n evidenceFor(files, SECURITY_HEADERS)\r\n )\r\n ]\r\n };\r\n}\r\n\r\nfunction visibleFiles(scan: ScanResult): ScannedFile[] {\r\n return scan.files.filter((file) => !file.isSecret && typeof file.content === 'string');\r\n}\r\n\r\nfunction foundOrMissing(id: string, label: string, found: boolean, evidence: string[]): RepositoryEvidenceItem {\r\n return {\r\n id,\r\n label,\r\n status: found ? 'found' : 'missing',\r\n evidence: unique(evidence).slice(0, 6)\r\n };\r\n}\r\n\r\nfunction clientSecretReference(files: ScannedFile[]): RepositoryEvidenceItem {\r\n const risky = files.filter((file) => isClientReachableFile(file) && SECRET_ENV_REFERENCE.test(file.content as string));\r\n return {\r\n id: 'client-secret-reference',\r\n label: 'No client-side secret references found',\r\n status: risky.length > 0 ? 'risk' : 'found',\r\n evidence: risky.map((file) => `file: ${normalizePath(file.path)}`).slice(0, 6)\r\n };\r\n}\r\n\r\nfunction serviceRoleScope(files: ScannedFile[]): RepositoryEvidenceItem {\r\n const references = files.filter((file) => SERVICE_ROLE.test(file.content as string));\r\n const risky = references.filter((file) => isClientReachableFile(file) && !SERVER_ONLY_HINT.test(normalizePath(file.path)));\r\n if (risky.length > 0) {\r\n return {\r\n id: 'service-role-scope',\r\n label: 'Supabase service role stays server-only',\r\n status: 'risk',\r\n evidence: risky.map((file) => `file: ${normalizePath(file.path)}`).slice(0, 6)\r\n };\r\n }\r\n\r\n const serverEvidence = references.filter((file) => isServerOnlyPath(file.path) && !isEnvOrDocPath(file.path));\r\n\r\n return {\r\n id: 'service-role-scope',\r\n label: 'Supabase service role stays server-only',\r\n status: serverEvidence.length > 0 ? 'found' : 'unknown',\r\n evidence: serverEvidence.map((file) => `file: ${normalizePath(file.path)}`).slice(0, 6)\r\n };\r\n}\r\n\r\nfunction evidenceFor(files: ScannedFile[], pattern: RegExp): string[] {\r\n return files\r\n .filter((file) => pattern.test(file.content as string))\r\n .map((file) => `file: ${normalizePath(file.path)}`)\r\n .slice(0, 6);\r\n}\r\n\r\nfunction pathEvidence(scan: ScanResult, pattern: RegExp): string[] {\r\n return scan.files\r\n .map((file) => normalizePath(file.path))\r\n .filter((path) => pattern.test(path))\r\n .map((path) => `file: ${path}`)\r\n .slice(0, 6);\r\n}\r\n\r\nfunction isClientReachableFile(file: ScannedFile): boolean {\r\n const content = file.content as string;\r\n const normalized = normalizePath(file.path).toLowerCase();\r\n if (hasUseClientDirective(content)) {\r\n return true;\r\n }\r\n if (/\\.client\\.[jt]sx?$|(^|\\/)(client|frontend|public)\\//.test(normalized)) {\r\n return true;\r\n }\r\n\r\n return isBrowserOnlyPath(file.path) && /\\b(window|document|localStorage|sessionStorage|navigator|useEffect|onClick)\\b/.test(content);\r\n}\r\n\r\nfunction hasUseClientDirective(content: string): boolean {\r\n return /^(?:\\s|;|\\/\\/[^\\n]*(?:\\n|$)|\\/\\*[\\s\\S]*?\\*\\/)*['\"]use client['\"]/.test(content);\r\n}\r\n\r\nfunction isBrowserOnlyPath(path: string): boolean {\r\n const normalized = normalizePath(path).toLowerCase();\r\n if (isServerOnlyPath(path)) {\r\n return false;\r\n }\r\n\r\n return (\r\n /(^|\\/)(components|hooks|contexts|providers)\\//.test(normalized) ||\r\n /\\.(jsx|tsx)$/.test(normalized)\r\n );\r\n}\r\n\r\nfunction isServerOnlyPath(path: string): boolean {\r\n const normalized = normalizePath(path).toLowerCase();\r\n return /\\/api\\/|app\\/api\\/|pages\\/api\\/|route\\.[jt]s$|\\.server\\.[jt]sx?$|\\/server\\//.test(normalized);\r\n}\r\n\r\nfunction isEnvOrDocPath(path: string): boolean {\r\n return ENV_OR_DOC_PATH.test(normalizePath(path).toLowerCase());\r\n}\r\n\r\nfunction normalizePath(path: string): string {\r\n return path.replace(/\\\\/g, '/');\r\n}\r\n\r\nfunction unique(values: string[]): string[] {\r\n return [...new Set(values)];\r\n}\r\n", "import type { ScanResult, StationScanContext } from './types';\n\nexport function computeStationScanContext(scan: ScanResult): StationScanContext {\n const s = scan.stackSignals;\n const hasDb = Boolean(s.hasSupabase || s.hasPrisma || s.hasDrizzle || s.hasMongoose);\n const pathBlob = `${scan.fileTree}\\n${scan.files.map((f) => f.path).join('\\n')}`;\n const apiHeavy = /[/\\\\]api[/\\\\]|[/\\\\]routes[/\\\\]|\\btrpc\\b|\\bserver\\.(ts|js|mjs)\\b/i.test(pathBlob);\n\n const sqlish = scan.files\n .filter((f) => /\\.sql$/i.test(f.path) && typeof f.content === 'string')\n .map((f) => f.content as string)\n .join('\\n')\n .slice(0, 80000);\n const rlsInSql = /create\\s+policy|enable\\s+row\\s+level\\s+security|alter\\s+table.*enable\\s+row\\s+level/i.test(\n sqlish\n );\n const rlsPaths = /supabase\\/migrations[/\\\\].*\\.sql|\\/policies\\/|_rls\\.sql|\\brls\\b/i.test(pathBlob);\n const rlsHint = rlsPaths || rlsInSql;\n\n return {\n suggestDatabaseLayer: !hasDb && apiHeavy,\n suggestSupabaseRlsReview: Boolean(s.hasSupabase && !rlsHint),\n suggestLandingPage: Boolean(!s.hasLanding && (s.hasNextJs || s.hasVite)),\n };\n}\n", "import type { SifgNodeKind, SifgRange } from './sifgTypes';\r\nimport type { ScanResult, StackWiringArea, StackWiringKey } from './types';\r\n\r\ntype CandidateBucket = 'sources' | 'guards' | 'sinks';\r\n\r\nexport interface SifgCandidate {\r\n kind: SifgNodeKind;\r\n area: StackWiringArea;\r\n providerKey: StackWiringKey;\r\n label: string;\r\n file: string;\r\n range: SifgRange;\r\n symbol: string;\r\n evidence: Record<string, string>;\r\n secretPolicy: 'no-values';\r\n}\r\n\r\nexport interface SifgUnknownCandidate {\r\n file: string;\r\n range: SifgRange;\r\n reason: 'Dynamic handler forwarding prevents deterministic flow proof.';\r\n}\r\n\r\nexport interface SifgCandidateSet {\r\n sources: SifgCandidate[];\r\n guards: SifgCandidate[];\r\n sinks: SifgCandidate[];\r\n unknowns: SifgUnknownCandidate[];\r\n}\r\n\r\nconst ROUTE_FILE_PATTERN = /^(?:src\\/)?app\\/api\\/(?:.*\\/)?route\\.(?:ts|js)$/;\r\nconst ROUTE_METHOD_PATTERN = /export\\s+async\\s+function\\s+(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\\b/;\r\nconst POST_METHOD_PATTERN = /export\\s+async\\s+function\\s+POST\\b/;\r\nconst STRIPE_SIGNATURE_PATTERN = /webhooks\\.constructEvent\\b/;\r\nconst PRISMA_WRITE_PATTERN = /\\bprisma\\.[A-Za-z0-9_]+\\.(?:create|update|delete)\\s*\\(/;\r\nconst SUPABASE_WRITE_PATTERN = /\\bsupabase\\.from\\s*\\([^)]*\\)\\s*\\.\\s*(?:insert|update|delete)\\s*\\(/;\r\nconst DB_WRITE_PATTERN = /\\bdb\\.(?:insert|update|delete)\\s*\\(/;\r\nconst DYNAMIC_FORWARD_PATTERN = /return\\s+handler\\s*\\(\\s*req\\s*\\)/;\r\n\r\nexport function extractSifgCandidates(scan: ScanResult): SifgCandidateSet {\r\n const candidates: SifgCandidateSet = {\r\n sources: [],\r\n guards: [],\r\n sinks: [],\r\n unknowns: []\r\n };\r\n\r\n for (const scannedFile of scan.files) {\r\n if (scannedFile.isSecret || typeof scannedFile.content !== 'string') {\r\n continue;\r\n }\r\n\r\n const file = scannedFile.path.replace(/\\\\/g, '/');\r\n const content = scannedFile.content;\r\n const isRouteFile = ROUTE_FILE_PATTERN.test(file);\r\n\r\n if (isRouteFile && ROUTE_METHOD_PATTERN.test(content)) {\r\n const symbol = POST_METHOD_PATTERN.test(content) ? 'POST' : 'ANY';\r\n const isStripePostRoute = /stripe/i.test(file) && symbol === 'POST';\r\n addCandidate(candidates, 'sources', {\r\n kind: 'entrypoint',\r\n area: isStripePostRoute ? 'payments' : 'security',\r\n providerKey: isStripePostRoute ? 'stripe-payments' : 'rate-limit-security',\r\n label: isStripePostRoute ? 'Stripe route handler' : 'API route handler',\r\n file,\r\n range: rangeForMatch(content, symbol === 'POST' ? POST_METHOD_PATTERN : ROUTE_METHOD_PATTERN),\r\n symbol,\r\n evidence: { detector: 'nextjs-route-handler', symbol },\r\n secretPolicy: 'no-values'\r\n });\r\n }\r\n\r\n if (/stripe/i.test(`${file}\\n${content}`) && STRIPE_SIGNATURE_PATTERN.test(content)) {\r\n addCandidate(candidates, 'guards', {\r\n kind: 'signature-verifier',\r\n area: 'payments',\r\n providerKey: 'stripe-payments',\r\n label: 'Stripe signature verifier',\r\n file,\r\n range: rangeForMatch(content, STRIPE_SIGNATURE_PATTERN),\r\n symbol: 'stripe.webhooks.constructEvent',\r\n evidence: {\r\n detector: 'stripe-signature-guard',\r\n proof: 'stripe.webhooks.constructEvent'\r\n },\r\n secretPolicy: 'no-values'\r\n });\r\n }\r\n\r\n const databaseWritePattern = firstMatchingPattern(content, [\r\n PRISMA_WRITE_PATTERN,\r\n SUPABASE_WRITE_PATTERN,\r\n DB_WRITE_PATTERN\r\n ]);\r\n if (databaseWritePattern) {\r\n addCandidate(candidates, 'sinks', {\r\n kind: 'database-write',\r\n area: 'database',\r\n providerKey: 'supabase-database',\r\n label: 'Database write',\r\n file,\r\n range: rangeForMatch(content, databaseWritePattern),\r\n symbol: 'database-write',\r\n evidence: { detector: 'database-write', symbol: 'database-write' },\r\n secretPolicy: 'no-values'\r\n });\r\n }\r\n\r\n if (isRouteFile && DYNAMIC_FORWARD_PATTERN.test(content)) {\r\n candidates.unknowns.push({\r\n file,\r\n range: rangeForMatch(content, DYNAMIC_FORWARD_PATTERN),\r\n reason: 'Dynamic handler forwarding prevents deterministic flow proof.'\r\n });\r\n }\r\n }\r\n\r\n return candidates;\r\n}\r\n\r\nfunction addCandidate(\r\n candidates: SifgCandidateSet,\r\n bucket: CandidateBucket,\r\n candidate: SifgCandidate\r\n): void {\r\n candidates[bucket].push(candidate);\r\n}\r\n\r\nfunction firstMatchingPattern(content: string, patterns: RegExp[]): RegExp | null {\r\n return patterns.find((pattern) => pattern.test(content)) ?? null;\r\n}\r\n\r\nfunction rangeForMatch(content: string, pattern: RegExp): SifgRange {\r\n const match = pattern.exec(content);\r\n if (!match || match.index < 0) {\r\n return { startLine: 1, endLine: 1 };\r\n }\r\n\r\n const startLine = lineNumberAtOffset(content, match.index);\r\n const endOffset = Math.max(match.index, match.index + match[0].length - 1);\r\n const endLine = lineNumberAtOffset(content, endOffset);\r\n return { startLine, endLine };\r\n}\r\n\r\nfunction lineNumberAtOffset(content: string, offset: number): number {\r\n let line = 1;\r\n for (let index = 0; index < offset; index += 1) {\r\n if (content[index] === '\\n') {\r\n line += 1;\r\n }\r\n }\r\n return line;\r\n}\r\n", "import { extractSifgCandidates, type SifgCandidate } from './sifgExtractors';\r\nimport { allSifgTemplates, type SifgTemplate } from './sifgTemplates';\r\nimport type { ScanResult } from './types';\r\nimport type {\r\n SifgEdge,\r\n SifgGraph,\r\n SifgGraphStatus,\r\n SifgLeak,\r\n SifgNode,\r\n SifgNodeKind,\r\n SifgPipeline,\r\n SifgSeverity\r\n} from './sifgTypes';\r\n\r\nconst STRIPE_PIPELINE_ID_PREFIX = 'pipeline:payments:stripe:webhook-ingress';\r\nconst STRIPE_LEAK_ID_PREFIX = 'leak:payments:stripe:missing-signature-before-db';\r\nconst STRIPE_MISSION_CHECK_ID = 'stripe-webhook-signature-verification';\r\n\r\nexport function buildStaticInfrastructureFlowGraph(scan: ScanResult, now = new Date()): SifgGraph {\r\n const candidates = extractSifgCandidates(scan);\r\n const templates = allSifgTemplates();\r\n const nodeIndex = new Map<SifgCandidate, SifgNode>();\r\n const usedNodeIds = new Set<string>();\r\n\r\n const nodes = [...candidates.sources, ...candidates.guards, ...candidates.sinks].map((candidate) => {\r\n const node = candidateToNode(candidate, usedNodeIds);\r\n nodeIndex.set(candidate, node);\r\n return node;\r\n });\r\n\r\n const edges: SifgEdge[] = [];\r\n const pipelines: SifgPipeline[] = [];\r\n const leaks: SifgLeak[] = [];\r\n const stripeTemplate = templates.find((template) => template.id === 'template:payments:stripe:webhook-ingress');\r\n\r\n if (stripeTemplate && scan.stackSignals.hasStripe) {\r\n evaluateStripeWebhookIngress({\r\n candidates,\r\n nodeIndex,\r\n edges,\r\n pipelines,\r\n leaks,\r\n stripeTemplate\r\n });\r\n }\r\n\r\n return sanitizeGraph({\r\n version: 1,\r\n graphId: `sifg:workspace:${now.toISOString()}`,\r\n generatedAt: now.toISOString(),\r\n registryVersion: 1,\r\n status: graphStatus(pipelines, leaks),\r\n nodes,\r\n edges,\r\n pipelines,\r\n leaks\r\n });\r\n}\r\n\r\ninterface StripeEvaluationInput {\r\n candidates: ReturnType<typeof extractSifgCandidates>;\r\n nodeIndex: Map<SifgCandidate, SifgNode>;\r\n edges: SifgEdge[];\r\n pipelines: SifgPipeline[];\r\n leaks: SifgLeak[];\r\n stripeTemplate: SifgTemplate;\r\n}\r\n\r\nfunction evaluateStripeWebhookIngress(input: StripeEvaluationInput): void {\r\n const stripeSources = input.candidates.sources\r\n .filter((candidate) =>\r\n candidate.kind === 'entrypoint' &&\r\n candidate.providerKey === 'stripe-payments' &&\r\n candidate.symbol === 'POST'\r\n )\r\n .sort(compareCandidatePosition);\r\n\r\n for (const sourceCandidate of stripeSources) {\r\n const source = input.nodeIndex.get(sourceCandidate);\r\n if (!source) {\r\n continue;\r\n }\r\n\r\n const sameFileGuards = input.candidates.guards\r\n .filter((candidate) => candidate.file === source.file && candidate.kind === 'signature-verifier')\r\n .sort(compareCandidatePosition);\r\n const sameFileSinks = input.candidates.sinks\r\n .filter((candidate) => candidate.file === source.file && candidate.kind === 'database-write')\r\n .sort(compareCandidatePosition);\r\n const guard = sameFileGuards.map((candidate) => input.nodeIndex.get(candidate)).find(isSifgNode);\r\n const sink = sameFileSinks.map((candidate) => input.nodeIndex.get(candidate)).find(isSifgNode);\r\n const hasUnknown = input.candidates.unknowns.some((unknown) => unknown.file === source.file);\r\n const requiredEdges: string[] = [];\r\n const forbiddenEdges: string[] = [];\r\n const sourceSuffix = sourceSlug(source);\r\n const pipelineId = `${STRIPE_PIPELINE_ID_PREFIX}:${sourceSuffix}`;\r\n\r\n let status: SifgGraphStatus = 'unknown';\r\n let severity: SifgSeverity = 'warning';\r\n\r\n if (guard && sink && guard.range.startLine < sink.range.startLine) {\r\n const edge = buildEdge(source, sink, 'guarded-flow', 'verified', guard);\r\n input.edges.push(edge);\r\n requiredEdges.push(edge.id);\r\n status = 'verified';\r\n severity = 'info';\r\n } else if (sink && (!guard || guard.range.startLine > sink.range.startLine)) {\r\n const edge = buildEdge(source, sink, 'forbidden-flow', 'leak');\r\n input.edges.push(edge);\r\n forbiddenEdges.push(edge.id);\r\n status = 'leak';\r\n severity = 'critical';\r\n input.leaks.push(buildStripeMissingSignatureLeak(\r\n source,\r\n sink,\r\n input.stripeTemplate,\r\n pipelineId,\r\n `${STRIPE_LEAK_ID_PREFIX}:${sourceSuffix}`\r\n ));\r\n } else if (hasUnknown) {\r\n const target = sink ?? guard ?? source;\r\n const edge = buildEdge(source, target, 'unknown-flow', 'unknown');\r\n input.edges.push(edge);\r\n requiredEdges.push(edge.id);\r\n }\r\n\r\n input.pipelines.push({\r\n id: pipelineId,\r\n area: 'payments',\r\n providerKey: 'stripe-payments',\r\n label: input.stripeTemplate.label,\r\n source: source.id,\r\n requiredEdges,\r\n forbiddenEdges,\r\n status,\r\n severity,\r\n missionCheckIds: [STRIPE_MISSION_CHECK_ID]\r\n });\r\n }\r\n}\r\n\r\nfunction candidateToNode(candidate: SifgCandidate, usedNodeIds: Set<string>): SifgNode {\r\n const baseId = sanitizeId(`node:${candidate.kind}:${candidate.file}:${candidate.range.startLine}`);\r\n const id = uniqueId(baseId, usedNodeIds);\r\n\r\n return {\r\n id,\r\n area: candidate.area,\r\n providerKey: candidate.providerKey,\r\n kind: candidate.kind,\r\n label: symbolicNodeLabel(candidate),\r\n file: candidate.file,\r\n range: { ...candidate.range },\r\n evidence: normalizeCandidateEvidence(candidate),\r\n secretPolicy: 'no-values'\r\n };\r\n}\r\n\r\nfunction buildEdge(\r\n source: SifgNode,\r\n target: SifgNode,\r\n kind: SifgEdge['kind'],\r\n status: SifgEdge['status'],\r\n guard?: SifgNode\r\n): SifgEdge {\r\n return {\r\n id: sanitizeId(`edge:${kind}:${source.id}:${target.id}`),\r\n from: source.id,\r\n to: target.id,\r\n kind,\r\n status,\r\n evidence: [{\r\n file: target.file,\r\n range: target.range,\r\n proof: guard ? `${guard.kind}: ${guard.evidence.symbol ?? guard.label}` : target.kind\r\n }]\r\n };\r\n}\r\n\r\nfunction buildStripeMissingSignatureLeak(\r\n source: SifgNode,\r\n sink: SifgNode,\r\n stripeTemplate: SifgTemplate,\r\n pipelineId: string,\r\n leakId: string\r\n): SifgLeak {\r\n const requiredGuard = stripeTemplate.requiredGuards.find((guard) => guard.kind === 'signature-verifier');\r\n const guardKind = normalizeTemplateGuardKind(requiredGuard?.kind);\r\n\r\n return {\r\n id: leakId,\r\n pipelineId,\r\n area: 'payments',\r\n providerKey: 'stripe-payments',\r\n kind: 'missing-mandatory-guard',\r\n severity: 'critical',\r\n summary: 'Stripe webhook request body reaches database code without proven signature verification.',\r\n evidencePath: [\r\n { nodeId: source.id, file: source.file, range: source.range, role: 'source' },\r\n { nodeId: sink.id, file: sink.file, range: sink.range, role: 'sink' }\r\n ],\r\n missingGuard: {\r\n expectedNodeKind: guardKind,\r\n expectedEvidence: buildExpectedGuardEvidence(requiredGuard, guardKind)\r\n },\r\n repoFix: {\r\n allowedFiles: [source.file],\r\n forbiddenFiles: [...stripeTemplate.repoFixPolicy.blockedFileGlobs],\r\n requiredOutcome: buildRequiredOutcome(requiredGuard, guardKind)\r\n }\r\n };\r\n}\r\n\r\nfunction graphStatus(pipelines: SifgPipeline[], leaks: SifgLeak[]): SifgGraphStatus {\r\n if (leaks.length > 0) {\r\n return 'leak';\r\n }\r\n\r\n if (pipelines.some((pipeline) => pipeline.status === 'unknown')) {\r\n return 'unknown';\r\n }\r\n\r\n if (pipelines.some((pipeline) => pipeline.status === 'verified')) {\r\n return 'verified';\r\n }\r\n\r\n return 'unknown';\r\n}\r\n\r\nfunction compareCandidatePosition(left: SifgCandidate, right: SifgCandidate): number {\r\n return left.file.localeCompare(right.file) || left.range.startLine - right.range.startLine;\r\n}\r\n\r\nfunction isSifgNode(value: SifgNode | undefined): value is SifgNode {\r\n return Boolean(value);\r\n}\r\n\r\nfunction symbolicNodeLabel(candidate: SifgCandidate): string {\r\n if (candidate.providerKey === 'stripe-payments' && candidate.kind === 'entrypoint') {\r\n return 'Stripe webhook entrypoint';\r\n }\r\n\r\n if (candidate.kind === 'signature-verifier') {\r\n return 'Stripe signature verifier';\r\n }\r\n\r\n if (candidate.kind === 'database-write') {\r\n return 'Database write sink';\r\n }\r\n\r\n return `${candidate.providerKey} ${candidate.kind}`;\r\n}\r\n\r\nfunction normalizeCandidateEvidence(candidate: SifgCandidate): Record<string, string> {\r\n return {\r\n detector: normalizeDetector(candidate.evidence.detector, candidate.kind),\r\n symbol: normalizeSymbol(candidate)\r\n };\r\n}\r\n\r\nfunction normalizeDetector(detector: string | undefined, kind: SifgCandidate['kind']): string {\r\n if (detector && /^[a-z0-9-]+$/i.test(detector)) {\r\n return detector;\r\n }\r\n\r\n return kind;\r\n}\r\n\r\nfunction normalizeSymbol(candidate: SifgCandidate): string {\r\n if (candidate.kind === 'entrypoint' && (candidate.symbol === 'POST' || candidate.symbol === 'ANY')) {\r\n return candidate.symbol;\r\n }\r\n\r\n if (\r\n candidate.kind === 'signature-verifier' &&\r\n (candidate.symbol.includes('stripe.webhooks.constructEvent') ||\r\n candidate.evidence.proof?.includes('stripe.webhooks.constructEvent'))\r\n ) {\r\n return 'stripe.webhooks.constructEvent';\r\n }\r\n\r\n if (candidate.kind === 'database-write') {\r\n return 'database-write';\r\n }\r\n\r\n return candidate.kind;\r\n}\r\n\r\nfunction normalizeTemplateGuardKind(kind: string | undefined): SifgNodeKind {\r\n return kind === 'signature-verifier' ? 'signature-verifier' : 'signature-verifier';\r\n}\r\n\r\nfunction buildExpectedGuardEvidence(\r\n guard: SifgTemplate['requiredGuards'][number] | undefined,\r\n guardKind: SifgNodeKind\r\n): string {\r\n const symbols = guard?.symbols.length ? guard.symbols.join(', ') : guardKind;\r\n const envNames = guard?.requiresEnvNames?.length ? ` using ${guard.requiresEnvNames.join(', ')}` : '';\r\n const targets = guard?.mustPrecede.length ? ` before ${formatList(guard.mustPrecede)}` : '';\r\n return `${guardKind}: ${symbols}${envNames}${targets}`;\r\n}\r\n\r\nfunction buildRequiredOutcome(\r\n guard: SifgTemplate['requiredGuards'][number] | undefined,\r\n guardKind: SifgNodeKind\r\n): string {\r\n const symbols = guard?.symbols.length ? guard.symbols.join(', ') : guardKind;\r\n const envNames = guard?.requiresEnvNames?.length ? ` using ${guard.requiresEnvNames.join(', ')}` : '';\r\n const targets = guard?.mustPrecede.length ? formatList(guard.mustPrecede) : 'database-write';\r\n return `Verify ${guardKind} (${symbols}${envNames}) before ${targets}.`;\r\n}\r\n\r\nfunction formatList(items: string[]): string {\r\n if (items.length <= 1) {\r\n return items.join('');\r\n }\r\n\r\n if (items.length === 2) {\r\n return `${items[0]} or ${items[1]}`;\r\n }\r\n\r\n return `${items.slice(0, -1).join(', ')}, or ${items[items.length - 1]}`;\r\n}\r\n\r\nfunction uniqueId(baseId: string, usedNodeIds: Set<string>): string {\r\n let id = baseId;\r\n let suffix = 2;\r\n while (usedNodeIds.has(id)) {\r\n id = `${baseId}.${suffix}`;\r\n suffix += 1;\r\n }\r\n usedNodeIds.add(id);\r\n return id;\r\n}\r\n\r\nfunction sanitizeId(value: string): string {\r\n return value.replace(/[^a-zA-Z0-9:._-]/g, '-');\r\n}\r\n\r\nfunction sourceSlug(source: SifgNode): string {\r\n return sanitizeId(source.id);\r\n}\r\n\r\nfunction sanitizeGraph(graph: SifgGraph): SifgGraph {\r\n return redactStructured(graph) as SifgGraph;\r\n}\r\n\r\nfunction redactStructured(value: unknown): unknown {\r\n if (typeof value === 'string') {\r\n return redactSecretLike(value);\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.map(redactStructured);\r\n }\r\n\r\n if (value && typeof value === 'object') {\r\n return Object.fromEntries(\r\n Object.entries(value).map(([key, child]) => [key, redactStructured(child)])\r\n );\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction redactSecretLike(value: string): string {\r\n return value\r\n .replace(/\\bsk_(?:live|test)_[a-zA-Z0-9_]+\\b/g, '[redacted]')\r\n .replace(/\\bBearer\\s+[a-zA-Z0-9._~+/=-]+\\b/gi, 'Bearer [redacted]')\r\n .replace(/\\b(api[_-]?key|access[_-]?token|refresh[_-]?token|secret)\\s*[:=]\\s*[^\\s\"'`,;)}]+/gi, '$1=[redacted]');\r\n}\r\n", "import type { ContextualPromptSection } from './promptRouting';\r\nimport type { SifgLeak } from './sifgTypes';\r\n\r\nexport function buildSifgFixPromptSection(leak: SifgLeak): ContextualPromptSection {\r\n return {\r\n heading: 'SIFG leak context',\r\n lines: [\r\n `Leak ID: ${sanitizePromptValue(leak.id)}`,\r\n `Pipeline ID: ${sanitizePromptValue(leak.pipelineId)}`,\r\n `Severity: ${sanitizePromptValue(leak.severity)}`,\r\n `Summary: ${sanitizePromptValue(leak.summary)}`,\r\n `Evidence path: ${evidencePathLine(leak)}`,\r\n leak.missingGuard\r\n ? `Missing guard: ${sanitizePromptValue(leak.missingGuard.expectedNodeKind)} (${sanitizePromptValue(leak.missingGuard.expectedEvidence)})`\r\n : 'Missing guard: none',\r\n `Allowed files: ${sanitizeList(leak.repoFix.allowedFiles)}`,\r\n `Blocked files: ${sanitizeList(leak.repoFix.forbiddenFiles)}`,\r\n `Required outcome: ${sanitizePromptValue(leak.repoFix.requiredOutcome)}`,\r\n 'Manual dashboard and MCP checks remain separate.',\r\n 'Do not read, print, invent, or store real secret values.',\r\n 'After editing, rescan VibeRaven so SIFG can verify the structural flow.'\r\n ]\r\n };\r\n}\r\n\r\nfunction evidencePathLine(leak: SifgLeak): string {\r\n if (leak.evidencePath.length === 0) {\r\n return 'none';\r\n }\r\n return leak.evidencePath\r\n .map((step) => `${sanitizePromptValue(step.role)} ${sanitizePromptValue(step.file)}:${step.range.startLine}-${step.range.endLine}`)\r\n .join(' -> ');\r\n}\r\n\r\nfunction sanitizeList(values: string[]): string {\r\n return values.map(sanitizePromptValue).join(', ');\r\n}\r\n\r\nfunction sanitizePromptValue(value: string): string {\r\n return value\r\n .replace(/[\\r\\n\\t]+/g, ' ')\r\n .replace(/[\\u0000-\\u001f\\u007f]+/g, ' ')\r\n .replace(/\\s{2,}/g, ' ')\r\n .trim()\r\n .replace(/\\b(Authorization\\s*:\\s*Bearer)\\s+[A-Za-z0-9._~+/=-]{8,}/gi, '$1 [redacted]')\r\n .replace(\r\n /\\b(client_secret|secret|password|access_token|refresh_token|private_key)\\s*([:=])\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s,;]+)/gi,\r\n (_match, key: string, separator: string) => `${key}${separator === ':' ? ': ' : '='}[redacted]`\r\n )\r\n .replace(/\\b(apiKey|accessToken|refreshToken|serviceRoleKey)\\s*:\\s*(?:\"[^\"]+\"|'[^']+'|[^\\s,;]+)/g, '$1: [redacted]')\r\n .replace(/\\b(apiKey|accessToken|refreshToken|serviceRoleKey)\\s*=\\s*(?:\"[^\"]+\"|'[^']+'|[^\\s,;]+)/g, '$1=[redacted]')\r\n .replace(\r\n /\\b([A-Za-z_][A-Za-z0-9_.-]*(?:SECRET|TOKEN|PASSWORD|PRIVATE_KEY|SERVICE_ROLE_KEY|apiKey|ApiKey|apikey|api_key|accessToken|refreshToken|serviceRoleKey)[A-Za-z0-9_.-]*)\\s*([:=])\\s*(?:\"[^\"]+\"|'[^']+'|[^\\s,;]+)/g,\r\n '$1$2[redacted]'\r\n )\r\n .replace(/\\b(?:whsec|github_pat|ghp|gho|ghu|ghs|ghr|gh_pat)_[A-Za-z0-9_]{8,}\\b/g, '[redacted-secret]')\r\n .replace(/\\b(?:sk|pk)_(?:live|test)_[a-zA-Z0-9_]+\\b/g, '[redacted-secret]')\r\n .replace(/\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]{2,}\\.[A-Za-z0-9_-]{2,}\\b/g, '[redacted-secret]');\r\n}\r\n", "import type {\r\n ContextualPrompt,\r\n ContextualPromptKind,\r\n StackAutomationAction\r\n} from './types';\r\nimport { buildSifgFixPromptSection } from './sifgPrompt';\r\nimport type { SifgLeak } from './sifgTypes';\r\n\r\nexport interface ContextualPromptSection {\r\n heading: string;\r\n lines: string[];\r\n}\r\n\r\nexport interface BuildContextualPromptInput {\r\n kind: ContextualPromptKind;\r\n promptSubject: string;\r\n providerLabel?: string;\r\n passedCount?: number;\r\n totalCount?: number;\r\n readinessPercent?: number;\r\n repoFixes?: StackAutomationAction[];\r\n manualChecks?: StackAutomationAction[];\r\n mcpProvider?: string | null;\r\n ravenGap?: {\r\n title: string;\r\n detail?: string;\r\n };\r\n sections?: ContextualPromptSection[];\r\n sifgLeaks?: SifgLeak[];\r\n afterEditing?: string[];\r\n emptyBody?: boolean;\r\n}\r\n\r\nexport function buildContextualPrompt(input: BuildContextualPromptInput): ContextualPrompt {\r\n switch (input.kind) {\r\n case 'repo-fix':\r\n return buildRepoFixPrompt(input);\r\n case 'manual-checklist':\r\n return buildManualChecklistPrompt(input);\r\n case 'mcp-verification':\r\n return buildMcpVerificationPrompt(input);\r\n case 'raven-gap':\r\n return buildRavenGapPrompt(input);\r\n case 'provider-mismatch-decision':\r\n return buildProviderMismatchDecisionPrompt(input);\r\n case 'manual-check':\r\n return buildManualCheckPrompt(input);\r\n case 'rescan-proof':\r\n return buildRescanProofPrompt(input);\r\n case 'launch-blocker':\r\n return buildLaunchBlockerPrompt(input);\r\n }\r\n}\r\n\r\nfunction buildRepoFixPrompt(input: BuildContextualPromptInput): ContextualPrompt {\r\n const sifgSections = input.sifgLeaks?.map(buildSifgFixPromptSection) ?? [];\r\n const sections = [...sifgSections, ...(input.sections ?? [])];\r\n return {\r\n kind: 'repo-fix',\r\n title: `Repo fix: ${input.promptSubject}`,\r\n body: input.emptyBody ? '' : compactLines([\r\n 'Outcome:',\r\n 'Fix the scoped VibeRaven production gaps.',\r\n `Fix ${input.promptSubject} as a senior engineer: implement repo-visible launch fixes first, keep provider truth separate, and leave no ambiguity about what remains external.`,\r\n readinessLine(input),\r\n '',\r\n 'Repo fixes to make:',\r\n actionLines(input.repoFixes, '- No repo fixes are currently missing.'),\r\n '',\r\n 'Manual checks to preserve as manual:',\r\n actionLines(input.manualChecks, '- No manual dashboard checks are listed.'),\r\n '',\r\n 'First inspect:',\r\n bulletLines(firstInspectLines(sections)),\r\n '',\r\n 'Implement:',\r\n bulletLines(sectionContentLines(sections, ['implement'], [\r\n 'Make the smallest repo-only changes needed for the listed repo fixes.',\r\n 'Follow the existing framework, file structure, and naming style.'\r\n ])),\r\n '',\r\n 'Constraints:',\r\n '- Work only inside the local repository.',\r\n '- Do not open external dashboards.',\r\n '- Do not request, print, or store secrets.',\r\n '- Use env names only.',\r\n '- Do not claim provider dashboard work is complete from repo edits.',\r\n '- Keep MCP/manual provider checks separate from repo verification.',\r\n '- Do not switch providers unless the user explicitly asked.',\r\n '- Do not treat generic database evidence as provider-specific evidence.',\r\n '- Do not claim dashboard/live provider setup from repo evidence.',\r\n '- Change only files needed for the listed repo fixes.',\r\n '- Treat SIFG leak IDs as the source of truth for repo-local structural gaps.',\r\n '- Do not edit outside SIFG allowed files when SIFG context is present.',\r\n '- Follow the existing framework, file structure, and naming style.',\r\n '- Keep secrets in server-only code and env examples.',\r\n ...bulletLines(sectionContentLines(sections, ['constraint'], [])),\r\n '',\r\n 'Verification:',\r\n bulletLines(sectionContentLines(sections, ['verification', 'verify'], [\r\n 'Run the closest relevant build, test, lint, or typecheck command.'\r\n ])),\r\n '- Rescan with VibeRaven and confirm repo evidence changed.',\r\n '- Keep MCP/manual provider checks separate from repo verification.',\r\n '- Do not claim provider dashboard work is complete from repo edits.',\r\n '- Summarize what changed, what was verified, and what remains external or manual.',\r\n ...prefixedLines(input.afterEditing, '', 'After editing:')\r\n ]),\r\n allowedActions: ['edit-repo', 'run-local-tests'],\r\n forbiddenActions: ['verify-dashboard', 'open-dashboard', 'request-secrets', 'store-secrets', 'invent-secrets']\r\n };\r\n}\r\n\r\nfunction buildManualChecklistPrompt(input: BuildContextualPromptInput): ContextualPrompt {\r\n return {\r\n kind: 'manual-checklist',\r\n title: `Manual checklist: ${input.promptSubject}`,\r\n body: compactLines([\r\n `Prepare manual setup checklist for ${input.promptSubject}.`,\r\n '',\r\n 'Rules:',\r\n '- Prepare a checklist for the developer.',\r\n '- Do not mark dashboard setup complete.',\r\n '- Do not request, print, store, or invent secrets.',\r\n '',\r\n 'Manual checks:',\r\n actionLines(input.manualChecks, '- No manual dashboard checks are listed.')\r\n ]),\r\n allowedActions: ['explain-manual-steps'],\r\n forbiddenActions: ['mark-dashboard-complete', 'request-secrets', 'store-secrets', 'invent-secrets']\r\n };\r\n}\r\n\r\nfunction buildMcpVerificationPrompt(input: BuildContextualPromptInput): ContextualPrompt {\r\n return {\r\n kind: 'mcp-verification',\r\n title: `MCP verification: ${input.promptSubject}`,\r\n body: compactLines([\r\n `Verify ${input.promptSubject} after VibeRaven automation.`,\r\n input.mcpProvider ? `MCP verifier: ${input.mcpProvider}.` : 'MCP verifier: none configured.',\r\n '',\r\n 'Rules:',\r\n '- MCP/API proof is the only path that can mark provider live as verified.',\r\n '- Manual confirmation is separate and does not create live proof.',\r\n '- Do not ask for or display real secrets.',\r\n '- Use only read-only MCP calls if already configured and authenticated by the IDE.',\r\n '- Do not mutate provider resources, settings, webhooks, billing, domains, projects, or dashboard state.',\r\n '- Never store OAuth tokens, API keys, or MCP credentials.',\r\n '- Do not request, print, or store secrets.',\r\n '- Report MCP evidence as verifier evidence, not manual dashboard completion.',\r\n '- If the verifier is unavailable, say that and stop.',\r\n '',\r\n 'Verification:',\r\n '- Rescan the repo and confirm missing checks moved to passed where repo evidence exists.',\r\n '- Report any remaining missing repo fixes separately from dashboard/manual checks.',\r\n '- If no repo fixes remain, keep the remaining dashboard/manual checks explicit instead of editing unrelated code.'\r\n ]),\r\n allowedActions: ['read-only-mcp', 'summarize-evidence'],\r\n forbiddenActions: ['write-mcp', 'mutate-provider', 'store-mcp-credentials', 'request-secrets', 'mark-dashboard-complete']\r\n };\r\n}\r\n\r\nfunction buildRavenGapPrompt(input: BuildContextualPromptInput): ContextualPrompt {\r\n const gapTitle = input.ravenGap?.title ?? input.promptSubject;\r\n return {\r\n kind: 'raven-gap',\r\n title: `Raven gap: ${gapTitle}`,\r\n body: compactLines([\r\n `Fix Raven product gap: ${gapTitle}.`,\r\n input.ravenGap?.detail ? `Gap detail: ${input.ravenGap.detail}` : '',\r\n '',\r\n 'Rules:',\r\n '- Fix only the Raven product gap described.',\r\n '- Work only in the repo.',\r\n '- Do not rewrite unrelated product areas.',\r\n '- Do not open dashboards or claim external setup.',\r\n '',\r\n 'After editing:',\r\n '- Run the closest relevant local tests, compile, or typecheck command.',\r\n '- Summarize changed files and verified commands.'\r\n ]),\r\n allowedActions: ['edit-repo', 'run-local-tests'],\r\n forbiddenActions: ['open-dashboard', 'claim-external-setup', 'rewrite-unrelated-product-areas']\r\n };\r\n}\r\n\r\nfunction buildProviderMismatchDecisionPrompt(input: BuildContextualPromptInput): ContextualPrompt {\r\n const area = input.promptSubject.replace(/\\s+provider$/i, '').trim() || input.promptSubject;\r\n return {\r\n kind: 'provider-mismatch-decision',\r\n title: `Provider mismatch decision: ${input.promptSubject}`,\r\n body: compactLines([\r\n 'Outcome:',\r\n `Decide the intended ${area} provider before changing code.`,\r\n `Resolve the provider mismatch for ${input.promptSubject}. Decide which provider VibeRaven should label as the active runtime repo provider, without claiming live provider verification.`,\r\n '',\r\n 'First inspect:',\r\n bulletLines(firstInspectLines(input.sections)),\r\n '',\r\n 'Constraints:',\r\n '- Do not migrate providers.',\r\n '- Do not edit files.',\r\n '- Selected provider is context only and does not mean connected.',\r\n '- Do not edit code until the intended provider is explicit.',\r\n '- Do not remove provider code, packages, env names, webhooks, routes, or config.',\r\n '- Do not request, print, or store secrets.',\r\n '- Use env names only.',\r\n '- Keep repo evidence separate from live provider proof.',\r\n '',\r\n 'Decision output:',\r\n '- Cite the file paths and evidence that identify the active runtime provider.',\r\n '- Explain what VibeRaven should label as active runtime repo evidence.',\r\n '- State that only authenticated MCP/API proof can mark a provider as using now/live verified.',\r\n '- Identify any legacy, alternative, mentioned-only, or selected-but-not-used providers.',\r\n '- State what remains manual or MCP-verifiable without claiming dashboard verification.'\r\n ]),\r\n allowedActions: ['summarize-evidence'],\r\n forbiddenActions: ['edit-repo', 'migrate-provider', 'remove-provider', 'request-secrets', 'store-secrets', 'invent-secrets']\r\n };\r\n}\r\n\r\nfunction buildManualCheckPrompt(input: BuildContextualPromptInput): ContextualPrompt {\r\n return {\r\n kind: 'manual-check',\r\n title: `Manual provider check: ${input.promptSubject}`,\r\n body: compactLines([\r\n 'Outcome:',\r\n `Prepare the manual provider check for ${input.promptSubject} without treating it as live proof.`,\r\n input.providerLabel ? `Provider: ${input.providerLabel}.` : '',\r\n '',\r\n 'Rules:',\r\n '- Do not ask for secret values.',\r\n '- Ask only for provider names, project names, environment names, webhook names, callback URLs, domains, modes, and settings.',\r\n '- Keep manual confirmation separate from live proof.',\r\n '- Do not claim MCP or runtime verification from a manual checklist.',\r\n '',\r\n 'Return:',\r\n '- What can be manual-confirmed by the developer.',\r\n '- What is still not live-verified.',\r\n '- What evidence would require read-only MCP or provider dashboard confirmation.'\r\n ]),\r\n allowedActions: ['explain-manual-steps', 'summarize-evidence'],\r\n forbiddenActions: ['mark-dashboard-complete', 'request-secrets', 'store-secrets', 'invent-secrets']\r\n };\r\n}\r\n\r\nfunction buildRescanProofPrompt(input: BuildContextualPromptInput): ContextualPrompt {\r\n return {\r\n kind: 'rescan-proof',\r\n title: `Rescan proof: ${input.promptSubject}`,\r\n body: compactLines([\r\n 'Outcome:',\r\n `Prove the ${input.promptSubject} repo evidence improved after fixes.`,\r\n '',\r\n 'Verification:',\r\n '- Rescan with VibeRaven and verify scanner-visible evidence changed.',\r\n '- Confirm provider truth classification should improve from the new repo evidence.',\r\n '- Do not expose secrets; cite env names only.',\r\n '- List remaining manual/MCP checks separately.',\r\n '- Do not claim dashboard verification or live provider state from repo evidence.',\r\n '',\r\n 'Return:',\r\n '- Changed scanner-visible file paths and evidence.',\r\n '- Provider truth labels that should improve.',\r\n '- Remaining external, manual, or MCP verification needed.'\r\n ]),\r\n allowedActions: ['summarize-evidence'],\r\n forbiddenActions: ['edit-repo', 'request-secrets', 'store-secrets', 'invent-secrets', 'mark-dashboard-complete']\r\n };\r\n}\r\n\r\nfunction buildLaunchBlockerPrompt(input: BuildContextualPromptInput): ContextualPrompt {\r\n const blockerTitle = input.ravenGap?.title ?? input.promptSubject;\r\n const blockerDetail = input.ravenGap?.detail;\r\n return {\r\n kind: 'launch-blocker',\r\n title: `Launch blocker: ${blockerTitle}`,\r\n body: compactLines([\r\n 'Outcome:',\r\n `Fix the launch blocker for ${blockerTitle} so VibeRaven can decide whether it can move from no-go.`,\r\n blockerDetail ? `Why it blocks launch: ${blockerDetail}` : '',\r\n '',\r\n 'First inspect:',\r\n bulletLines(firstInspectLines(input.sections)),\r\n '',\r\n 'Implement:',\r\n bulletLines(sectionContentLines(input.sections, ['implement'], [\r\n 'Make the smallest repo-only change that creates scanner-visible evidence for the blocker.',\r\n 'Preserve existing architecture and provider boundaries.'\r\n ])),\r\n '',\r\n 'Constraints:',\r\n '- Work only inside the local repository.',\r\n '- Do not hide, lower, or downgrade severity without concrete repo evidence.',\r\n '- Do not request, print, or store secrets.',\r\n '- Use env names only.',\r\n '- Do not claim provider dashboard work is complete from repo edits.',\r\n '- Keep MCP/manual provider checks separate from repo verification.',\r\n ...bulletLines(sectionContentLines(input.sections, ['constraint'], [])),\r\n '',\r\n 'Verification:',\r\n bulletLines(sectionContentLines(input.sections, ['verification', 'verify'], [\r\n 'Run the closest relevant build, test, lint, or typecheck command.'\r\n ])),\r\n '- Rescan with VibeRaven and confirm repo evidence changed.',\r\n '- Explain whether the blocker can move from no-go, and what remains external or manual.',\r\n '- Summarize what changed, what was verified, and what remains external or manual.'\r\n ]),\r\n allowedActions: ['edit-repo', 'run-local-tests', 'summarize-evidence'],\r\n forbiddenActions: ['verify-dashboard', 'open-dashboard', 'request-secrets', 'store-secrets', 'invent-secrets', 'lower-severity-without-evidence']\r\n };\r\n}\r\n\r\nfunction readinessLine(input: BuildContextualPromptInput): string {\r\n if (input.passedCount === undefined || input.totalCount === undefined || input.readinessPercent === undefined) {\r\n return '';\r\n }\r\n return `Current readiness: ${input.passedCount}/${input.totalCount} repo checks passed (${input.readinessPercent}%).`;\r\n}\r\n\r\nfunction actionLines(actions: StackAutomationAction[] | undefined, fallback: string): string {\r\n if (!actions || actions.length === 0) {\r\n return fallback;\r\n }\r\n return actions.map((action) => `- ${action.label}: ${action.promptHint}`).join('\\n');\r\n}\r\n\r\nfunction firstInspectLines(sections: ContextualPromptSection[] | undefined): string[] {\r\n const inspectLines = sections?.flatMap((section) => {\r\n const heading = section.heading.toLowerCase();\r\n if (heading.includes('sifg')) {\r\n return [section.heading, ...section.lines];\r\n }\r\n return heading.includes('inspect') ? section.lines : [];\r\n }) ?? [];\r\n return dedupeLines(inspectLines.length > 0 ? inspectLines : [\r\n 'Inspect the relevant repo evidence, routes, config, env examples, tests, and scanner-visible files before deciding or editing.'\r\n ]);\r\n}\r\n\r\nfunction sectionContentLines(\r\n sections: ContextualPromptSection[] | undefined,\r\n headingMatches: string[],\r\n fallback: string[]\r\n): string[] {\r\n if (!sections || sections.length === 0) {\r\n return fallback;\r\n }\r\n const matches = sections.flatMap((section) => {\r\n const heading = section.heading.toLowerCase();\r\n return headingMatches.some((match) => heading.includes(match))\r\n ? section.lines\r\n : [];\r\n });\r\n return dedupeLines(matches.length > 0 ? matches : fallback);\r\n}\r\n\r\nfunction dedupeLines(lines: string[]): string[] {\r\n const seen = new Set<string>();\r\n return lines.filter((line) => {\r\n const normalized = line.trim();\r\n if (!normalized || seen.has(normalized)) {\r\n return false;\r\n }\r\n seen.add(normalized);\r\n return true;\r\n });\r\n}\r\n\r\nfunction bulletLines(lines: string[]): string[] {\r\n return lines.map((line) => `- ${line}`);\r\n}\r\n\r\nfunction prefixedLines(lines: string[] | undefined, fallback: string, heading: string): string[] {\r\n if (!lines || lines.length === 0) {\r\n return fallback ? [heading, fallback] : [];\r\n }\r\n return ['', heading, ...lines.map((line) => `- ${line}`)];\r\n}\r\n\r\nfunction compactLines(lines: Array<string | string[]>): string {\r\n return lines.flat().join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim();\r\n}\r\n", "import type {\r\n ContextualPrompt,\r\n ContextualPromptKind,\r\n StackAutomationAction,\r\n StackAutomationRecipe,\r\n StackAutomationSummary,\r\n StackWiringItem,\r\n StackWiringKey,\r\n StackWiringProviderSummary,\r\n StackWiringSummary\r\n} from './types';\r\nimport type { SifgGraph, SifgLeak } from './sifgTypes';\r\nimport { mcpProviderIdForStackWiringKey } from './providerRegistry';\r\nimport { buildContextualPrompt, type ContextualPromptSection } from './promptRouting';\r\n\r\ntype PromptProfile = {\r\n inspect: string[];\r\n implement: string[];\r\n constraints: string[];\r\n verify: string[];\r\n};\r\n\r\nconst GENERIC_PROMPT_PROFILE: PromptProfile = {\r\n inspect: [\r\n 'Review the relevant routes, server code, client code, config files, package scripts, and env examples before editing.',\r\n 'Identify existing conventions for file names, imports, validation, and error handling.'\r\n ],\r\n implement: [\r\n 'Make the smallest repo-only changes needed for the missing checks.',\r\n 'Keep changes aligned with the current framework and folder structure.'\r\n ],\r\n constraints: [\r\n 'Do not call provider APIs, mutate external projects, or edit webview/dashboard state.',\r\n 'Keep secrets in server-only code and documented env examples.'\r\n ],\r\n verify: [\r\n 'Run the closest relevant build, test, lint, or typecheck command.',\r\n 'Confirm repo evidence exists for each fixed item and list manual checks separately.'\r\n ]\r\n};\r\n\r\nconst PROMPT_PROFILES: Partial<Record<StackWiringKey, PromptProfile>> = {\r\n 'stripe-payments': {\r\n inspect: [\r\n 'Inspect app/api, pages/api, server routes, checkout actions, webhook handlers, and .env.example before editing.',\r\n 'Check how STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, price IDs, and success/cancel URLs are currently named.'\r\n ],\r\n implement: [\r\n 'Add or tighten a server-side Stripe webhook route that verifies signatures with webhooks.constructEvent before processing events.',\r\n 'Document required Stripe env names and keep checkout/session creation on the server.'\r\n ],\r\n constraints: [\r\n 'Do not create products, prices, customers, or webhooks through the Stripe API.',\r\n 'Do not mark live-mode products, webhook endpoint registration, or dashboard settings complete from repo edits.'\r\n ],\r\n verify: [\r\n 'Run the relevant route/unit tests or typecheck for payment code.',\r\n 'Confirm webhook secret usage and server-only Stripe code are visible in repo evidence.'\r\n ]\r\n },\r\n 'clerk-auth': {\r\n inspect: [\r\n 'Inspect middleware, protected routes, layout providers, server actions, and auth-related env examples.',\r\n 'Check current Clerk package usage, publishable key names, secret key names, and redirect handling.'\r\n ],\r\n implement: [\r\n 'Add route protection, auth provider setup, and server-side user checks where missing.',\r\n 'Document NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY, CLERK_SECRET_KEY, and required redirect URLs in repo examples.'\r\n ],\r\n constraints: [\r\n 'Do not configure Clerk dashboard applications, domains, or production instances.',\r\n 'Do not expose secret keys to client bundles.'\r\n ],\r\n verify: [\r\n 'Run auth-related tests or typecheck.',\r\n 'Confirm protected-route and env documentation evidence exists in the repo.'\r\n ]\r\n },\r\n 'supabase-database': {\r\n inspect: [\r\n 'Inspect Supabase client/server helpers, migrations, SQL policies, schema files, and env examples.',\r\n 'Check whether service-role usage is isolated to server-only paths.'\r\n ],\r\n implement: [\r\n 'Add missing schema, migration, RLS policy, and typed client evidence where repo checks require it.',\r\n 'Document SUPABASE_URL, anon key, and server-only service role env names without committing secrets.'\r\n ],\r\n constraints: [\r\n 'Do not call Supabase APIs, create remote projects, run dashboard changes, or apply migrations remotely.',\r\n 'Do not place service-role keys in client-accessible code.'\r\n ],\r\n verify: [\r\n 'Run database-related tests, migration checks, or typecheck available in the repo.',\r\n 'Confirm RLS and migration evidence is repo-visible and dashboard checks remain manual.'\r\n ]\r\n },\r\n 'vercel-deployment': {\r\n inspect: [\r\n 'Inspect vercel.json, package scripts, framework config, environment examples, and CI/deploy workflows.',\r\n 'Check build command, output settings, redirects, rewrites, and serverless/edge function usage.'\r\n ],\r\n implement: [\r\n 'Add repo deployment configuration, build scripts, env documentation, or route settings needed for missing checks.',\r\n 'Keep deployment assumptions encoded in config files rather than external dashboard state.'\r\n ],\r\n constraints: [\r\n 'Do not deploy, promote, link, or mutate Vercel projects.',\r\n 'Do not claim production domains, env vars, or dashboard settings are configured from repo edits.'\r\n ],\r\n verify: [\r\n 'Run the project build or compile command.',\r\n 'Confirm deployment config evidence exists and list dashboard checks as manual.'\r\n ]\r\n },\r\n 'sentry-monitoring': {\r\n inspect: [\r\n 'Inspect Sentry initialization, framework instrumentation files, error boundaries, source map config, and env examples.',\r\n 'Check client/server DSN separation and release/environment tagging conventions.'\r\n ],\r\n implement: [\r\n 'Add missing Sentry initialization, error capture, tracing, source map, or env documentation evidence.',\r\n 'Ensure captured errors include useful context without leaking secrets or PII.'\r\n ],\r\n constraints: [\r\n 'Do not create Sentry projects, upload releases, or change dashboard alert rules.',\r\n 'Do not hardcode DSNs or auth tokens outside env examples.'\r\n ],\r\n verify: [\r\n 'Run monitoring-related tests, build, or typecheck.',\r\n 'Confirm instrumentation and env evidence are present while dashboard checks remain manual.'\r\n ]\r\n },\r\n 'posthog-monitoring': {\r\n inspect: [\r\n 'Inspect PostHog initialization, analytics providers, event capture calls, consent handling, and env examples.',\r\n 'Check whether user identity, feature flags, and client/server keys are separated correctly.'\r\n ],\r\n implement: [\r\n 'Add missing PostHog setup, event capture, opt-in/consent, feature flag, or env documentation evidence.',\r\n 'Keep analytics initialization resilient around loading, routing, and disabled-key states.'\r\n ],\r\n constraints: [\r\n 'Do not create PostHog projects, change dashboard events, or mutate feature flags remotely.',\r\n 'Do not capture secrets, raw tokens, or unnecessary PII.'\r\n ],\r\n verify: [\r\n 'Run analytics-related tests, build, or typecheck.',\r\n 'Confirm repo evidence for initialization, capture, and privacy controls.'\r\n ]\r\n },\r\n 'react-frontend': {\r\n inspect: [\r\n 'Inspect components, routes, state/data-loading paths, forms, styling, and existing design-system patterns.',\r\n 'Check current loading, error, empty, and responsive states before editing.'\r\n ],\r\n implement: [\r\n 'Add missing loading states, error states, empty states, accessibility attributes, and responsive layout behavior.',\r\n 'Use existing component patterns and keep visual changes focused on the listed repo fixes.'\r\n ],\r\n constraints: [\r\n 'Do not edit external design tools, dashboards, or webview automation state.',\r\n 'Do not replace the app framework or introduce unrelated UI rewrites.'\r\n ],\r\n verify: [\r\n 'Run frontend tests, typecheck, or build.',\r\n 'Confirm loading, error, and responsive behavior have repo-visible evidence.'\r\n ]\r\n },\r\n 'node-backend': {\r\n inspect: [\r\n 'Inspect API routes, controllers, services, middleware, validation, logging, and env examples.',\r\n 'Check current error handling, request validation, authentication boundaries, and server startup scripts.'\r\n ],\r\n implement: [\r\n 'Add missing validation, error handling, health checks, logging, or server-only env documentation evidence.',\r\n 'Keep backend changes small and aligned with existing route/service patterns.'\r\n ],\r\n constraints: [\r\n 'Do not call production provider APIs or mutate external infrastructure.',\r\n 'Do not expose secrets in logs, client responses, or committed examples.'\r\n ],\r\n verify: [\r\n 'Run backend tests, typecheck, or compile.',\r\n 'Confirm fixed checks have repo evidence and operational dashboard checks stay manual.'\r\n ]\r\n }\r\n};\r\n\r\nexport function buildStackAutomationSummary(\r\n stackWiring: StackWiringSummary,\r\n options: { staticInfrastructureFlowGraph?: SifgGraph } = {}\r\n): StackAutomationSummary {\r\n const items = stackWiring.items.map((stack) => buildStackAutomationRecipe(stack, sifgLeaksForStack(stack, options.staticInfrastructureFlowGraph)));\r\n const byKey = items.reduce<StackAutomationSummary['byKey']>((acc, recipe) => {\r\n acc[recipe.key] = recipe;\r\n return acc;\r\n }, {});\r\n return { items, byKey };\r\n}\r\n\r\nexport function buildStackAutomationContext(summary: StackAutomationSummary): string {\r\n const lines = ['## STACK AUTOMATION'];\r\n for (const recipe of summary.items) {\r\n lines.push(`${recipe.key}: ${recipe.automationLevel}; repo fixes=${recipe.repoFixes.length}; manual checks=${recipe.manualChecks.length}; mcp=${recipe.mcpProvider ?? 'none'}`);\r\n for (const fix of recipe.repoFixes.slice(0, 6)) {\r\n lines.push(`${recipe.key} fix: ${fix.label} - ${fix.promptHint}`);\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction buildStackAutomationRecipe(stack: StackWiringProviderSummary, sifgLeaks: SifgLeak[] = []): StackAutomationRecipe {\r\n const confirmedChecks = stack.items.filter((item) => item.status === 'passed').map(toAction);\r\n const repoFixes = stack.items.filter((item) => item.status === 'missing').map(toAction);\r\n const manualChecks = stack.items.filter((item) => item.status === 'manual').map(toAction);\r\n const mcpProvider = mcpProviderIdForStackWiringKey(stack.key);\r\n const hasRepoFixContext = repoFixes.length > 0 || sifgLeaks.length > 0;\r\n const automationLevel = !hasRepoFixContext && manualChecks.length > 0 ? 'manual-only' : mcpProvider ? 'repo-prompt-plus-mcp' : 'repo-prompt';\r\n const promptRoutes = buildPromptRoutes(stack, repoFixes, manualChecks, mcpProvider, automationLevel, sifgLeaks);\r\n return {\r\n key: stack.key,\r\n provider: stack.provider,\r\n providerLabel: stack.providerLabel,\r\n area: stack.area,\r\n promptSubject: stack.promptSubject,\r\n readinessPercent: stack.readinessPercent,\r\n repoFixes,\r\n manualChecks,\r\n confirmedChecks,\r\n mcpProvider,\r\n repoPrompt: promptRoutes['repo-fix']?.body ?? '',\r\n verificationPrompt: verificationPromptForRecipe(promptRoutes, automationLevel, manualChecks, sifgLeaks),\r\n automationLevel,\r\n promptRoutes\r\n };\r\n}\r\n\r\nfunction toAction(item: StackWiringItem): StackAutomationAction {\r\n return {\r\n id: item.id,\r\n label: item.label,\r\n status: item.status,\r\n promptHint: item.promptHint,\r\n evidence: item.evidence\r\n };\r\n}\r\n\r\nfunction buildPromptRoutes(\r\n stack: StackWiringProviderSummary,\r\n repoFixes: StackAutomationAction[],\r\n manualChecks: StackAutomationAction[],\r\n mcpProvider: string | null,\r\n automationLevel: StackAutomationRecipe['automationLevel'],\r\n sifgLeaks: SifgLeak[]\r\n): Partial<Record<ContextualPromptKind, ContextualPrompt>> {\r\n return {\r\n 'repo-fix': buildContextualPrompt({\r\n kind: 'repo-fix',\r\n promptSubject: stack.promptSubject,\r\n providerLabel: stack.providerLabel,\r\n passedCount: stack.passedCount,\r\n totalCount: stack.totalCount,\r\n readinessPercent: stack.readinessPercent,\r\n repoFixes,\r\n manualChecks,\r\n sifgLeaks,\r\n sections: buildRepoPromptSections(stack),\r\n afterEditing: [\r\n 'Run the relevant build/test/typecheck command.',\r\n 'Summarize changed files, verified commands, and manual checks still needed.'\r\n ],\r\n emptyBody: automationLevel === 'manual-only'\r\n }),\r\n 'manual-checklist': buildContextualPrompt({\r\n kind: 'manual-checklist',\r\n promptSubject: stack.promptSubject,\r\n providerLabel: stack.providerLabel,\r\n manualChecks\r\n }),\r\n 'mcp-verification': buildContextualPrompt({\r\n kind: 'mcp-verification',\r\n promptSubject: stack.promptSubject,\r\n providerLabel: stack.providerLabel,\r\n mcpProvider\r\n })\r\n };\r\n}\r\n\r\nfunction sifgLeaksForStack(stack: StackWiringProviderSummary, graph: SifgGraph | undefined): SifgLeak[] {\r\n if (!graph) {\r\n return [];\r\n }\r\n return graph.leaks.filter((leak) => leak.providerKey === stack.key);\r\n}\r\n\r\nfunction verificationPromptForRecipe(\r\n promptRoutes: Partial<Record<ContextualPromptKind, ContextualPrompt>>,\r\n automationLevel: StackAutomationRecipe['automationLevel'],\r\n manualChecks: StackAutomationAction[],\r\n sifgLeaks: SifgLeak[]\r\n): string {\r\n const manualPrompt = promptRoutes['manual-checklist']?.body ?? '';\r\n const mcpPrompt = promptRoutes['mcp-verification']?.body ?? '';\r\n if (automationLevel === 'manual-only') {\r\n return manualPrompt || mcpPrompt;\r\n }\r\n if (sifgLeaks.length > 0 && manualChecks.length > 0) {\r\n return [manualPrompt, mcpPrompt].filter(Boolean).join('\\n\\n');\r\n }\r\n return mcpPrompt;\r\n}\r\n\r\nfunction buildRepoPromptSections(stack: StackWiringProviderSummary): ContextualPromptSection[] {\r\n const profile = PROMPT_PROFILES[stack.key] ?? GENERIC_PROMPT_PROFILE;\r\n return [\r\n { heading: 'Inspect first:', lines: profile.inspect },\r\n { heading: 'Implement:', lines: profile.implement },\r\n { heading: 'Provider constraints:', lines: profile.constraints },\r\n { heading: 'Verification:', lines: profile.verify }\r\n ];\r\n}\r\n", "import type { ScanResult, StackWiringItem, StackWiringStatus, SupabaseDatabaseWiringSummary } from './types';\r\n\r\ntype ScannableFile = {\r\n path: string;\r\n normalizedPath: string;\r\n content: string;\r\n lowerContent: string;\r\n};\r\n\r\nexport function analyzeSupabaseDatabaseWiring(scan: ScanResult): SupabaseDatabaseWiringSummary {\r\n const files = visibleFiles(scan);\r\n const deps = scan.packageDeps.map((dep) => dep.toLowerCase());\r\n const pathBlob = `${scan.fileTree}\\n${scan.files.map((file) => file.path).join('\\n')}`.replace(/\\\\/g, '/').toLowerCase();\r\n const contentBlob = files.map((file) => file.lowerContent).join('\\n');\r\n\r\n const items: StackWiringItem[] = [\r\n item(\r\n 'package-installed',\r\n 'Supabase package installed',\r\n deps.some((dep) => dep === '@supabase/supabase-js' || dep === '@supabase/ssr' || dep.startsWith('@supabase/')),\r\n packageEvidence(deps),\r\n 'Install the correct Supabase package for this app framework.'\r\n ),\r\n item(\r\n 'env-names-documented',\r\n 'Supabase env names documented',\r\n hasSupabaseUrl(contentBlob) && hasSupabaseAnonKey(contentBlob),\r\n envEvidence(contentBlob),\r\n 'Document NEXT_PUBLIC_SUPABASE_URL/VITE_SUPABASE_URL and the matching anon key in an env example or config docs.'\r\n ),\r\n item(\r\n 'client-file-exists',\r\n 'Supabase client file exists',\r\n hasSupabaseClient(files, pathBlob),\r\n clientEvidence(files, pathBlob),\r\n 'Create a Supabase client helper that follows the existing app structure.'\r\n ),\r\n item(\r\n 'database-query-usage',\r\n 'Database query usage found',\r\n /\\.from\\s*\\(\\s*['\"][a-z0-9_]+['\"]\\s*\\)/i.test(contentBlob),\r\n queryEvidence(files),\r\n 'Use the Supabase client from server-safe code paths for real database reads or writes.'\r\n ),\r\n item(\r\n 'schema-or-migrations',\r\n 'Schema or migration file found',\r\n hasSchemaOrMigration(files, pathBlob),\r\n schemaEvidence(files, pathBlob),\r\n 'Add a checked-in schema or migration path so database structure is reproducible.'\r\n ),\r\n item(\r\n 'rls-policy-evidence',\r\n 'Supabase RLS policy evidence found',\r\n hasRlsEvidence(files, pathBlob),\r\n rlsEvidence(files, pathBlob),\r\n 'Add or document Supabase RLS policies for user-owned tables before launch.'\r\n ),\r\n item(\r\n 'generated-types',\r\n 'Generated database types found',\r\n hasGeneratedTypes(files, pathBlob),\r\n generatedTypeEvidence(files, pathBlob),\r\n 'Generate and commit Supabase database types for safer app code.'\r\n ),\r\n serviceRoleSafetyItem(files)\r\n ];\r\n\r\n const passedCount = items.filter((entry) => entry.status === 'passed').length;\r\n const totalCount = items.length;\r\n const readinessPercent = Math.round((passedCount / Math.max(totalCount, 1)) * 100);\r\n\r\n return {\r\n key: 'supabase-database',\r\n provider: 'supabase',\r\n providerLabel: 'Supabase',\r\n area: 'database',\r\n areaLabel: 'Database',\r\n promptSubject: 'Supabase database',\r\n items,\r\n passedCount,\r\n totalCount,\r\n readinessPercent\r\n };\r\n}\r\n\r\nexport function buildSupabaseDatabaseWiringPrompt(wiring: SupabaseDatabaseWiringSummary): string {\r\n const passed = wiring.items.filter((entry) => entry.status === 'passed');\r\n const missing = wiring.items.filter((entry) => entry.status === 'missing');\r\n const passedLines = passed.length > 0\r\n ? passed.map((entry) => `- ${entry.label}${formatEvidence(entry.evidence)}`).join('\\n')\r\n : '- No Supabase wiring checks passed yet.';\r\n const missingLines = missing.length > 0\r\n ? missing.map((entry) => `- ${entry.label}: ${entry.promptHint}`).join('\\n')\r\n : '- No missing Supabase database wiring checks were found by VibeRaven.';\r\n\r\n return [\r\n 'Wire Supabase database for this app safely.',\r\n '',\r\n `Current Supabase database wiring readiness: ${wiring.passedCount}/${wiring.totalCount} checks passed (${wiring.readinessPercent}%).`,\r\n '',\r\n 'Repo evidence already found:',\r\n passedLines,\r\n '',\r\n 'Missing Supabase database wiring checks:',\r\n missingLines,\r\n '',\r\n 'First inspect the existing package.json files, env examples, Supabase client helpers, database access files, and supabase/ or migrations/ directories. Identify the current framework and data access pattern before editing.',\r\n '',\r\n 'Implement:',\r\n '1. Close only the missing Supabase database wiring checks listed above.',\r\n '2. Follow the existing file structure and naming patterns.',\r\n '3. Keep database setup reproducible through checked-in schema, migrations, or documented generation commands.',\r\n '4. Keep service-role keys out of frontend and client-executed files.',\r\n '',\r\n 'Constraints:',\r\n '- Do not rewrite unrelated auth, payments, UI, billing, or deployment code.',\r\n '- Do not claim Supabase dashboard setup is complete from repo evidence alone.',\r\n '- Do not expose SUPABASE_SERVICE_ROLE_KEY to browser code, Vite public env, or NEXT_PUBLIC env variables.',\r\n '',\r\n 'Verification:',\r\n '- Run the relevant TypeScript/build/test command for this repo.',\r\n '- Confirm VibeRaven can rescan and move the missing Supabase wiring checks to passed where repo evidence exists.',\r\n '- Summarize what changed and what still requires manual Supabase dashboard verification.'\r\n ].join('\\n');\r\n}\r\n\r\nexport function buildSupabaseDatabaseWiringContext(wiring: SupabaseDatabaseWiringSummary): string {\r\n const lines = [\r\n '## SUPABASE DATABASE WIRING',\r\n `${wiring.passedCount}/${wiring.totalCount} checks passed (${wiring.readinessPercent}%).`\r\n ];\r\n\r\n for (const entry of wiring.items) {\r\n const evidence = entry.evidence.length > 0 ? ` (${entry.evidence.slice(0, 3).join('; ')})` : '';\r\n lines.push(`${entry.status}: ${entry.label}${evidence}`);\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction visibleFiles(scan: ScanResult): ScannableFile[] {\r\n return scan.files\r\n .filter((file) => !file.isSecret && typeof file.content === 'string')\r\n .map((file) => ({\r\n path: file.path.replace(/\\\\/g, '/'),\r\n normalizedPath: file.path.replace(/\\\\/g, '/').toLowerCase(),\r\n content: file.content as string,\r\n lowerContent: (file.content as string).toLowerCase()\r\n }));\r\n}\r\n\r\nfunction item(\r\n id: string,\r\n label: string,\r\n passed: boolean,\r\n evidence: string[],\r\n promptHint: string\r\n): StackWiringItem {\r\n return {\r\n id,\r\n label,\r\n status: passed ? 'passed' : 'missing',\r\n evidence,\r\n promptHint\r\n };\r\n}\r\n\r\nfunction packageEvidence(deps: string[]): string[] {\r\n return deps.filter((dep) => dep === '@supabase/supabase-js' || dep === '@supabase/ssr' || dep.startsWith('@supabase/'))\r\n .map((dep) => `package: ${dep}`);\r\n}\r\n\r\nfunction hasSupabaseUrl(contentBlob: string): boolean {\r\n return /\\b(vite_|next_public_)?supabase_url\\b/i.test(contentBlob);\r\n}\r\n\r\nfunction hasSupabaseAnonKey(contentBlob: string): boolean {\r\n return /\\b(vite_|next_public_)?supabase_anon_key\\b/i.test(contentBlob);\r\n}\r\n\r\nfunction envEvidence(contentBlob: string): string[] {\r\n const evidence: string[] = [];\r\n if (hasSupabaseUrl(contentBlob)) {\r\n evidence.push('env: SUPABASE_URL');\r\n }\r\n if (hasSupabaseAnonKey(contentBlob)) {\r\n evidence.push('env: SUPABASE_ANON_KEY');\r\n }\r\n return evidence;\r\n}\r\n\r\nfunction hasSupabaseClient(files: ScannableFile[], pathBlob: string): boolean {\r\n return /(^|\\n|\\/)(lib|utils|src\\/lib|src\\/utils)\\/supabase\\.[jt]s\\b/i.test(pathBlob) ||\r\n files.some((file) => /createclient\\s*\\(/i.test(file.content) && /@supabase\\/(supabase-js|ssr)/i.test(file.content));\r\n}\r\n\r\nfunction clientEvidence(files: ScannableFile[], pathBlob: string): string[] {\r\n const evidence: string[] = [];\r\n const pathMatch = pathBlob.split(/\\r?\\n/).find((path) => /(^|\\/)(lib|utils|src\\/lib|src\\/utils)\\/supabase\\.[jt]s\\b/i.test(path));\r\n if (pathMatch) {\r\n evidence.push(`file: ${pathMatch}`);\r\n }\r\n const importFile = files.find((file) => /createclient\\s*\\(/i.test(file.content) && /@supabase\\/(supabase-js|ssr)/i.test(file.content));\r\n if (importFile && !evidence.includes(`file: ${importFile.path}`)) {\r\n evidence.push(`file: ${importFile.path}`);\r\n }\r\n return evidence;\r\n}\r\n\r\nfunction queryEvidence(files: ScannableFile[]): string[] {\r\n return files\r\n .filter((file) => /\\.from\\s*\\(\\s*['\"][a-z0-9_]+['\"]\\s*\\)/i.test(file.content))\r\n .slice(0, 4)\r\n .map((file) => `query: ${file.path}`);\r\n}\r\n\r\nfunction hasSchemaOrMigration(files: ScannableFile[], pathBlob: string): boolean {\r\n return /(^|\\n|\\/)supabase\\/migrations\\/[^/\\n]+\\.sql\\b/i.test(pathBlob) ||\r\n /(^|\\n|\\/)(migrations?|schema)\\/[^/\\n]+\\.(sql|ts|js)\\b/i.test(pathBlob) ||\r\n files.some((file) => /create\\s+table|alter\\s+table/i.test(file.content));\r\n}\r\n\r\nfunction schemaEvidence(files: ScannableFile[], pathBlob: string): string[] {\r\n const path = pathBlob.split(/\\r?\\n/).find((entry) =>\r\n /(^|\\/)supabase\\/migrations\\/[^/]+\\.sql\\b/i.test(entry) ||\r\n /(^|\\/)(migrations?|schema)\\/[^/]+\\.(sql|ts|js)\\b/i.test(entry)\r\n );\r\n if (path) {\r\n return [`schema: ${path}`];\r\n }\r\n const file = files.find((entry) => /create\\s+table|alter\\s+table/i.test(entry.content));\r\n return file ? [`schema: ${file.path}`] : [];\r\n}\r\n\r\nfunction hasRlsEvidence(files: ScannableFile[], pathBlob: string): boolean {\r\n return /\\/policies\\/|_rls\\.sql|\\brls\\b/i.test(pathBlob) ||\r\n files.some((file) => /enable\\s+row\\s+level\\s+security|create\\s+policy|alter\\s+table[\\s\\S]{0,200}enable\\s+row\\s+level/i.test(file.content));\r\n}\r\n\r\nfunction rlsEvidence(files: ScannableFile[], pathBlob: string): string[] {\r\n const path = pathBlob.split(/\\r?\\n/).find((entry) => /\\/policies\\/|_rls\\.sql|\\brls\\b/i.test(entry));\r\n if (path) {\r\n return [`rls: ${path}`];\r\n }\r\n const file = files.find((entry) => /enable\\s+row\\s+level\\s+security|create\\s+policy|alter\\s+table[\\s\\S]{0,200}enable\\s+row\\s+level/i.test(entry.content));\r\n return file ? [`rls: ${file.path}`] : [];\r\n}\r\n\r\nfunction hasGeneratedTypes(files: ScannableFile[], pathBlob: string): boolean {\r\n return /database\\.types\\.[jt]s\\b|supabase.*types\\.[jt]s\\b|types\\/database\\.[jt]s\\b/i.test(pathBlob) ||\r\n files.some((file) => /export\\s+type\\s+database\\b|export\\s+interface\\s+database\\b/i.test(file.content));\r\n}\r\n\r\nfunction generatedTypeEvidence(files: ScannableFile[], pathBlob: string): string[] {\r\n const path = pathBlob.split(/\\r?\\n/).find((entry) =>\r\n /database\\.types\\.[jt]s\\b|supabase.*types\\.[jt]s\\b|types\\/database\\.[jt]s\\b/i.test(entry)\r\n );\r\n if (path) {\r\n return [`types: ${path}`];\r\n }\r\n const file = files.find((entry) => /export\\s+type\\s+database\\b|export\\s+interface\\s+database\\b/i.test(entry.content));\r\n return file ? [`types: ${file.path}`] : [];\r\n}\r\n\r\nfunction serviceRoleSafetyItem(files: ScannableFile[]): StackWiringItem {\r\n const exposed = files.filter((file) =>\r\n isClientExecutedPath(file.normalizedPath) &&\r\n /\\bsupabase_service_role_key\\b|next_public_supabase_service_role|vite_supabase_service_role/i.test(file.content)\r\n );\r\n return {\r\n id: 'service-role-not-exposed',\r\n label: 'Service role key not exposed to frontend',\r\n status: exposed.length > 0 ? 'missing' : 'passed',\r\n evidence: exposed.slice(0, 4).map((file) => `unsafe reference: ${file.path}`),\r\n promptHint: 'Move service-role usage to server-only code and use public anon keys in frontend clients.'\r\n };\r\n}\r\n\r\nfunction isClientExecutedPath(path: string): boolean {\r\n return /\\.(tsx|jsx)$/.test(path) ||\r\n /(^|\\/)(components|pages|app|client|frontend|web)\\//.test(path) ||\r\n /\\.client\\.[jt]sx?$/.test(path);\r\n}\r\n\r\nfunction formatEvidence(evidence: string[]): string {\r\n return evidence.length > 0 ? ` (${evidence.slice(0, 3).join('; ')})` : '';\r\n}\r\n", "import { analyzeSupabaseDatabaseWiring } from './supabaseWiring';\r\nimport type {\r\n ScanResult,\r\n ScannedFile,\r\n StackWiringItem,\r\n StackWiringKey,\r\n StackWiringProviderSummary,\r\n StackWiringSummary\r\n} from './types';\r\n\r\ntype VisibleFile = {\r\n path: string;\r\n normalizedPath: string;\r\n content: string;\r\n lowerContent: string;\r\n};\r\n\r\ntype StackContext = {\r\n scan: ScanResult;\r\n files: VisibleFile[];\r\n deps: string[];\r\n pathBlob: string;\r\n contentBlob: string;\r\n};\r\n\r\nexport function analyzeStackWiring(scan: ScanResult): StackWiringSummary {\r\n const ctx = buildContext(scan);\r\n const supabaseDatabase = analyzeSupabaseDatabaseWiring(scan);\r\n const items: StackWiringProviderSummary[] = [\r\n analyzeFigmaAppFlow(ctx),\r\n analyzeStorybookAppFlow(ctx),\r\n analyzeProductSpecAppFlow(ctx),\r\n analyzeRouteMapAppFlow(ctx),\r\n analyzeReactFrontend(ctx),\r\n analyzeVueFrontend(ctx),\r\n analyzeSvelteFrontend(ctx),\r\n analyzeAngularFrontend(ctx),\r\n analyzeNodeBackend(ctx),\r\n analyzePythonBackend(ctx),\r\n analyzeRailsBackend(ctx),\r\n analyzeGoBackend(ctx),\r\n analyzeRateLimitSecurity(ctx),\r\n analyzeBotProtectionSecurity(ctx),\r\n analyzeSecretsHygiene(ctx),\n analyzeClerkAuth(ctx),\n analyzeAuthJsAuth(ctx),\n analyzeAuth0Auth(ctx),\n analyzeBetterAuth(ctx),\n analyzeSupabaseAuth(ctx),\n supabaseDatabase,\n analyzeFirebaseDatabase(ctx),\n analyzeNeonDatabase(ctx),\n analyzeTursoDatabase(ctx),\n analyzeMongoDatabase(ctx),\n analyzePlanetScaleDatabase(ctx),\n analyzeStripePayments(ctx),\n analyzePaddlePayments(ctx),\n analyzePolarPayments(ctx),\n analyzeLemonSqueezyPayments(ctx),\n analyzeVercelDeployment(ctx),\n analyzeNetlifyDeployment(ctx),\n analyzeRenderDeployment(ctx),\n analyzeRailwayDeployment(ctx),\n analyzeCloudflareDeployment(ctx),\n analyzeAwsDeployment(ctx),\n analyzeSupabaseLanding(ctx),\r\n analyzePostHogMonitoring(ctx),\r\n analyzeSentryMonitoring(ctx),\r\n analyzeLogRocketMonitoring(ctx),\r\n analyzeVitestTesting(ctx),\r\n analyzePlaywrightTesting(ctx),\r\n analyzeSentryErrorHandling(ctx),\r\n analyzePostHogErrorHandling(ctx)\r\n ];\r\n const byKey = items.reduce<Partial<Record<StackWiringKey, StackWiringProviderSummary>>>((acc, summary) => {\r\n acc[summary.key] = summary;\r\n return acc;\r\n }, {});\r\n\r\n return {\r\n items,\r\n byKey,\r\n supabaseDatabase\r\n };\r\n}\r\n\r\nexport function buildStackWiringPrompt(summary: StackWiringProviderSummary): string {\r\n const passed = summary.items.filter((entry) => entry.status === 'passed');\r\n const missing = summary.items.filter((entry) => entry.status === 'missing');\r\n const manual = summary.items.filter((entry) => entry.status === 'manual');\r\n const passedLines = passed.length > 0\r\n ? passed.map((entry) => `- ${entry.label}${formatEvidence(entry.evidence)}`).join('\\n')\r\n : `- No ${summary.promptSubject} checks passed yet.`;\r\n const missingLines = missing.length > 0\r\n ? missing.map((entry) => `- ${entry.label}: ${entry.promptHint}`).join('\\n')\r\n : `- No missing ${summary.promptSubject} checks were found by VibeRaven.`;\r\n const manualLines = manual.length > 0\r\n ? manual.map((entry) => `- ${entry.label}: ${entry.promptHint}`).join('\\n')\r\n : '- No manual dashboard checks were listed.';\r\n\r\n return [\r\n `Wire ${summary.promptSubject} for this app safely.`,\r\n '',\r\n `Current ${summary.promptSubject} readiness: ${summary.passedCount}/${summary.totalCount} repo checks passed (${summary.readinessPercent}%).`,\r\n '',\r\n 'Repo evidence already found:',\r\n passedLines,\r\n '',\r\n `Missing ${summary.promptSubject} checks:`,\r\n missingLines,\r\n '',\r\n 'Manual checks that repo evidence cannot prove:',\r\n manualLines,\r\n '',\r\n 'First inspect the existing package.json files, env examples, framework routes, provider helpers, and server/client boundaries before editing.',\r\n '',\r\n 'Implement:',\r\n `1. Close only the missing ${summary.promptSubject} checks listed above.`,\r\n '2. Follow the existing file structure and naming patterns.',\r\n '3. Keep provider secrets in server-only code and documented env templates.',\r\n '4. Keep external dashboard work explicit instead of claiming it from repo evidence.',\r\n '',\r\n 'Constraints:',\r\n '- Do not rewrite unrelated auth, payments, UI, billing, deployment, or analytics code.',\r\n '- Do not expose secret keys to browser code, public env variables, or client-executed files.',\r\n '- Do not claim external provider dashboard setup is complete from repo evidence alone.',\r\n '',\r\n 'Verification:',\r\n '- Run the relevant TypeScript/build/test command for this repo.',\r\n '- Confirm VibeRaven can rescan and move the missing checks to passed where repo evidence exists.',\r\n '- Summarize what changed and what still requires manual provider dashboard verification.'\r\n ].join('\\n');\r\n}\r\n\r\nexport function buildStackWiringContext(summary: StackWiringSummary): string {\r\n const lines = ['## STACK READINESS'];\r\n for (const stack of summary.items) {\r\n lines.push(`${stack.key}: ${stack.passedCount}/${stack.totalCount} repo checks passed (${stack.readinessPercent}%).`);\r\n for (const entry of stack.items) {\r\n const evidence = entry.evidence.length > 0 ? ` (${entry.evidence.slice(0, 3).join('; ')})` : '';\r\n lines.push(`${stack.key} ${entry.status}: ${entry.label}${evidence}`);\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction analyzeFigmaAppFlow(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'figma-app-flow',\r\n provider: 'figma',\r\n providerLabel: 'Figma',\r\n area: 'appFlow',\r\n areaLabel: 'App Flow / UX',\r\n promptSubject: 'Figma app flow',\r\n items: [\r\n item('flow-doc-found', 'Flow or design doc found', /figma|wireframe|user flow|journey|prototype|screen map/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /figma|wireframe|user flow|journey|prototype|screen map/i), 'Add or link a simple screen flow, user journey, or Figma handoff note.'),\r\n item('onboarding-states-found', 'Onboarding and empty states documented', /onboarding|empty state|first run|activation|welcome/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /onboarding|empty state|first run|activation|welcome/i), 'Document the first-run, empty, loading, and error states for the main user journey.'),\r\n item('primary-cta-found', 'Primary user action is visible', /primary cta|call to action|cta|start|continue|create|connect/i.test(ctx.contentBlob), fileEvidence(ctx, /primary cta|call to action|cta|start|continue|create|connect/i), 'Make the main action obvious on the key product screens.'),\r\n manualItem('figma-source-checked', 'Current Figma or flow source checked', 'Confirm the latest Figma/design source still matches the implemented product flow.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeStorybookAppFlow(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'storybook-app-flow',\r\n provider: 'storybook',\r\n providerLabel: 'Storybook',\r\n area: 'appFlow',\r\n areaLabel: 'App Flow / UX',\r\n promptSubject: 'Storybook app flow',\r\n items: [\r\n item('storybook-package-found', 'Storybook package installed', hasPackage(ctx, [/^storybook$/, /^@storybook\\//]) || /\\.storybook\\/|\\.stories\\.[jt]sx?\\b/i.test(ctx.pathBlob), packageEvidence(ctx, [/^storybook$/, /^@storybook\\//]).concat(pathEvidence(ctx, /\\.storybook\\/|\\.stories\\.[jt]sx?\\b/i)), 'Install or confirm Storybook for visible component state coverage.'),\r\n item('stories-found', 'Component stories found', /\\.stories\\.[jt]sx?\\b|\\.mdx\\b/i.test(ctx.pathBlob), pathEvidence(ctx, /\\.stories\\.[jt]sx?\\b|\\.mdx\\b/i), 'Add stories for the primary product components.'),\r\n item('state-variants-found', 'Loading, empty, or error variants found', /loading|empty|error|disabled|success|variant/i.test(ctx.contentBlob), fileEvidence(ctx, /loading|empty|error|disabled|success|variant/i), 'Cover loading, empty, error, disabled, and success variants in stories.'),\r\n manualItem('storybook-reviewed', 'Current Storybook states reviewed', 'Open Storybook and confirm the primary user journey states still match the product.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeProductSpecAppFlow(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'product-spec-app-flow',\r\n provider: 'product-spec',\r\n providerLabel: 'Product Spec',\r\n area: 'appFlow',\r\n areaLabel: 'App Flow / UX',\r\n promptSubject: 'product spec app flow',\r\n items: [\r\n item('spec-doc-found', 'Product spec or PRD found', /prd|product requirements|requirements|product spec|specification/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /prd|product requirements|requirements|product spec|specification/i).concat(pathEvidence(ctx, /prd|requirements|spec/i)), 'Add a short product spec or PRD for the main workflow.'),\r\n item('acceptance-criteria-found', 'Acceptance criteria or user stories found', /acceptance criteria|user stor(y|ies)|jobs to be done|given\\s+.*when\\s+.*then/i.test(ctx.contentBlob), fileEvidence(ctx, /acceptance criteria|user stor(y|ies)|jobs to be done|given\\s+.*when\\s+.*then/i), 'Document acceptance criteria or user stories for the main flow.'),\r\n item('success-metric-found', 'Success metric or activation goal found', /success metric|activation|north star|conversion|retention|time to value/i.test(ctx.contentBlob), fileEvidence(ctx, /success metric|activation|north star|conversion|retention|time to value/i), 'Define the activation or success metric for this workflow.'),\r\n manualItem('latest-product-intent-checked', 'Latest product intent checked', 'Confirm the spec still matches the current product direction and user promise.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeRouteMapAppFlow(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'route-map-app-flow',\r\n provider: 'route-map',\r\n providerLabel: 'Route Map',\r\n area: 'appFlow',\r\n areaLabel: 'App Flow / UX',\r\n promptSubject: 'route map app flow',\r\n items: [\r\n item('routes-found', 'App routes found', /(^|\\n|\\/)(app|pages|routes)\\//i.test(ctx.pathBlob) || /router|route map|sitemap/i.test(ctx.contentBlob), pathEvidence(ctx, /(^|\\/)(app|pages|routes)\\//i).concat(fileEvidence(ctx, /router|route map|sitemap/i)), 'Map the key routes or screens in the repo.'),\r\n item('navigation-documented', 'Navigation path documented', /navigation|nav|breadcrumb|route map|screen map|journey/i.test(ctx.contentBlob), fileEvidence(ctx, /navigation|nav|breadcrumb|route map|screen map|journey/i), 'Document how users move through the primary screens.'),\r\n item('protected-or-edge-routes-found', 'Protected or edge routes noted', /protected|auth required|404|not-found|error route|redirect/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /protected|auth required|404|not-found|error route|redirect/i), 'Mark protected, redirect, 404, and error routes explicitly.'),\r\n manualItem('core-journey-clicked', 'Core journey clicked manually', 'Click through the core route path in the running app and verify the map is current.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeReactFrontend(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'react-frontend',\r\n provider: 'react',\r\n providerLabel: 'React',\r\n area: 'frontend',\r\n areaLabel: 'Frontend',\r\n promptSubject: 'React frontend',\r\n items: [\r\n item('package-installed', 'React package installed', hasPackage(ctx, [/^react$/, /^next$/, /^vite$/]) || Boolean(ctx.scan.stackSignals.hasNextJs || ctx.scan.stackSignals.hasVite), packageEvidence(ctx, [/^react$/, /^next$/, /^vite$/]), 'Install or confirm the React framework package used by this app.'),\r\n item('component-structure-found', 'Component structure found', /(^|\\n|\\/)(src\\/)?(components|app|pages)\\//i.test(ctx.pathBlob), pathEvidence(ctx, /(^|\\/)(src\\/)?(components|app|pages)\\//i), 'Keep UI components in a predictable app/pages/components structure.'),\r\n item('loading-state-found', 'Loading state found', Boolean(ctx.scan.stackSignals.hasLoadingStates) || /loading\\.tsx|skeleton|spinner|aria-busy|isloading/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /loading\\.tsx|skeleton|spinner|aria-busy|isloading/i), 'Add loading states for async product views.'),\r\n item('error-state-found', 'Error boundary or empty state found', Boolean(ctx.scan.stackSignals.hasErrorBoundary) || /errorboundary|global-error|empty state|not-found\\.tsx/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /errorboundary|global-error|empty state|not-found\\.tsx/i), 'Add error and empty states for the primary product workflow.'),\r\n manualItem('responsive-ui-checked', 'Responsive UI checked manually', 'Open the main screens at mobile and desktop widths and confirm there is no overflow or overlapping text.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeVueFrontend(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'vue-frontend',\r\n provider: 'vue',\r\n providerLabel: 'Vue',\r\n area: 'frontend',\r\n areaLabel: 'Frontend',\r\n promptSubject: 'Vue frontend',\r\n items: [\r\n item('package-installed', 'Vue package installed', hasPackage(ctx, [/^vue$/, /^nuxt$/, /^@vitejs\\/plugin-vue$/]), packageEvidence(ctx, [/^vue$/, /^nuxt$/, /^@vitejs\\/plugin-vue$/]), 'Install or confirm Vue, Nuxt, or the Vue build plugin used by this app.'),\r\n item('component-structure-found', 'Vue component structure found', /\\.vue\\b|(^|\\n|\\/)(src\\/)?(components|pages|layouts)\\//i.test(ctx.pathBlob), pathEvidence(ctx, /\\.vue\\b|(^|\\/)(src\\/)?(components|pages|layouts)\\//i), 'Keep Vue components, pages, and layouts in predictable folders.'),\r\n item('routing-or-layout-found', 'Vue routing or layout found', /vue-router|routerview|router-view|<router-view|(^|\\n|\\/)pages\\//i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /vue-router|routerview|router-view|<router-view/i).concat(pathEvidence(ctx, /(^|\\/)pages\\//i)), 'Add or confirm Vue Router, Nuxt pages, or layout routing for the main product screens.'),\r\n item('loading-or-error-state-found', 'Loading or error state found', /loading|suspense|error|empty state|isloading/i.test(ctx.contentBlob), fileEvidence(ctx, /loading|suspense|error|empty state|isloading/i), 'Add loading, empty, and error states for async Vue screens.'),\r\n manualItem('responsive-ui-checked', 'Responsive UI checked manually', 'Open the main Vue screens at mobile and desktop widths and confirm there is no overflow or overlapping text.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeSvelteFrontend(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'svelte-frontend',\r\n provider: 'svelte',\r\n providerLabel: 'Svelte',\r\n area: 'frontend',\r\n areaLabel: 'Frontend',\r\n promptSubject: 'Svelte frontend',\r\n items: [\r\n item('package-installed', 'Svelte package installed', hasPackage(ctx, [/^svelte$/, /^@sveltejs\\/kit$/]), packageEvidence(ctx, [/^svelte$/, /^@sveltejs\\/kit$/]), 'Install or confirm Svelte or SvelteKit for this app.'),\r\n item('component-structure-found', 'Svelte component or route structure found', /\\.svelte\\b|(^|\\n|\\/)src\\/routes\\//i.test(ctx.pathBlob), pathEvidence(ctx, /\\.svelte\\b|(^|\\/)src\\/routes\\//i), 'Keep Svelte components and routes in predictable folders.'),\r\n item('load-or-form-found', 'Svelte load or form handling found', /\\bload\\s*=|export\\s+(async\\s+)?function\\s+load|actions\\s*=|use:enhance/i.test(ctx.contentBlob), fileEvidence(ctx, /\\bload\\s*=|export\\s+(async\\s+)?function\\s+load|actions\\s*=|use:enhance/i), 'Use SvelteKit load functions or actions for route data and form flows.'),\r\n item('loading-or-error-state-found', 'Loading or error state found', /loading|error|empty state|\\+error\\.svelte/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /loading|error|empty state|\\+error\\.svelte/i), 'Add loading, empty, and error states for async Svelte screens.'),\r\n manualItem('responsive-ui-checked', 'Responsive UI checked manually', 'Open the main Svelte screens at mobile and desktop widths and confirm there is no overflow or overlapping text.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeAngularFrontend(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'angular-frontend',\r\n provider: 'angular',\r\n providerLabel: 'Angular',\r\n area: 'frontend',\r\n areaLabel: 'Frontend',\r\n promptSubject: 'Angular frontend',\r\n items: [\r\n item('package-installed', 'Angular package installed', hasPackage(ctx, [/^@angular\\/core$/, /^@angular\\/router$/, /^@angular\\/cli$/]), packageEvidence(ctx, [/^@angular\\/core$/, /^@angular\\/router$/, /^@angular\\/cli$/]), 'Install or confirm Angular framework packages for this app.'),\r\n item('component-structure-found', 'Angular component structure found', /\\.component\\.ts\\b|angular\\.json|(^|\\n|\\/)src\\/app\\//i.test(ctx.pathBlob), pathEvidence(ctx, /\\.component\\.ts\\b|angular\\.json|(^|\\/)src\\/app\\//i), 'Keep Angular components and app modules or standalone routes in predictable folders.'),\r\n item('routing-found', 'Angular routing found', /routermodule|providerouter|router-outlet|routes\\s*:/i.test(ctx.contentBlob), fileEvidence(ctx, /routermodule|providerouter|router-outlet|routes\\s*:/i), 'Add or confirm Angular Router for the primary product screens.'),\r\n item('loading-or-error-state-found', 'Loading or error state found', /loading|isloading|error|empty state|catcherror/i.test(ctx.contentBlob), fileEvidence(ctx, /loading|isloading|error|empty state|catcherror/i), 'Add loading, empty, and error states for async Angular screens.'),\r\n manualItem('responsive-ui-checked', 'Responsive UI checked manually', 'Open the main Angular screens at mobile and desktop widths and confirm there is no overflow or overlapping text.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeNodeBackend(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'node-backend',\r\n provider: 'node',\r\n providerLabel: 'Node.js',\r\n area: 'backend',\r\n areaLabel: 'Backend / API',\r\n promptSubject: 'Node.js backend',\r\n items: [\r\n item('server-runtime-found', 'Server runtime or API framework found', hasPackage(ctx, [/^express$/, /^fastify$/, /^hono$/, /^next$/, /^@nestjs\\//]) || /api\\/|route\\.[jt]s|server\\.[jt]s/i.test(ctx.pathBlob), packageEvidence(ctx, [/^express$/, /^fastify$/, /^hono$/, /^next$/, /^@nestjs\\//]).concat(pathEvidence(ctx, /api\\/|route\\.[jt]s|server\\.[jt]s/i)), 'Add a clear server/API runtime or route structure.'),\r\n item('api-routes-found', 'API routes found', /api\\/|route\\.[jt]s|routes?\\//i.test(ctx.pathBlob), pathEvidence(ctx, /api\\/|route\\.[jt]s|routes?\\//i), 'Create server routes for backend operations instead of pushing secrets into frontend code.'),\r\n item('request-validation-found', 'Request validation found', hasPackage(ctx, [/^zod$/, /^joi$/, /^yup$/, /^valibot$/]) || /z\\.object|safeparse|request validation|validate\\s*\\(/i.test(ctx.contentBlob), packageEvidence(ctx, [/^zod$/, /^joi$/, /^yup$/, /^valibot$/]).concat(fileEvidence(ctx, /z\\.object|safeparse|request validation|validate\\s*\\(/i)), 'Validate request bodies and parameters before processing backend operations.'),\r\n item('backend-error-handling-found', 'Backend error handling found', /try\\s*{|catch\\s*\\(|next\\(error\\)|return\\s+new\\s+response\\([^)]*500|status\\s*:\\s*500/i.test(ctx.contentBlob), fileEvidence(ctx, /try\\s*{|catch\\s*\\(|next\\(error\\)|status\\s*:\\s*500/i), 'Add consistent backend error handling for API routes.'),\r\n manualItem('production-runtime-checked', 'Production runtime limits checked', 'Confirm serverless/runtime limits, body size, timeout, and region choices for production.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzePythonBackend(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'python-backend',\r\n provider: 'python',\r\n providerLabel: 'Python / FastAPI',\r\n area: 'backend',\r\n areaLabel: 'Backend / API',\r\n promptSubject: 'Python backend',\r\n items: [\r\n item('server-runtime-found', 'Python API framework found', hasPackage(ctx, [/^fastapi$/, /^flask$/, /^django$/, /^pydantic$/]) || /fastapi|flask|django|pydantic/i.test(ctx.contentBlob), packageEvidence(ctx, [/^fastapi$/, /^flask$/, /^django$/, /^pydantic$/]).concat(fileEvidence(ctx, /fastapi|flask|django|pydantic/i)), 'Add or confirm FastAPI, Flask, Django, or the Python API framework used by this app.'),\r\n item('api-entry-found', 'Python API entrypoint found', /(^|\\n|\\/)(api\\/)?(main|app)\\.py\\b|(^|\\n|\\/)manage\\.py\\b/i.test(ctx.pathBlob), pathEvidence(ctx, /(^|\\/)(api\\/)?(main|app)\\.py\\b|(^|\\/)manage\\.py\\b/i), 'Keep a clear Python API entrypoint for production routes.'),\r\n item('request-validation-found', 'Request validation found', /basemodel|pydantic|serializer|marshmallow|request validation/i.test(ctx.contentBlob), fileEvidence(ctx, /basemodel|pydantic|serializer|marshmallow|request validation/i), 'Validate request bodies and parameters before processing backend operations.'),\r\n item('backend-error-handling-found', 'Backend error handling found', /exception_handler|try\\s*:|except\\s+|raise\\s+http|abort\\(|handler404|handler500/i.test(ctx.contentBlob), fileEvidence(ctx, /exception_handler|try\\s*:|except\\s+|raise\\s+http|abort\\(|handler404|handler500/i), 'Add consistent backend error handling for Python routes.'),\r\n manualItem('production-runtime-checked', 'Production runtime limits checked', 'Confirm server/runtime limits, worker count, timeout, and region choices for production.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeRailsBackend(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'rails-backend',\r\n provider: 'rails',\r\n providerLabel: 'Rails',\r\n area: 'backend',\r\n areaLabel: 'Backend / API',\r\n promptSubject: 'Rails backend',\r\n items: [\r\n item('rails-runtime-found', 'Rails runtime found', hasPackage(ctx, [/^rails$/]) || /gem ['\"]rails['\"]|rails\\.application|actioncontroller/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), packageEvidence(ctx, [/^rails$/]).concat(fileEvidence(ctx, /gem ['\"]rails['\"]|rails\\.application|actioncontroller/i)), 'Add or confirm Rails is the backend runtime for this app.'),\r\n item('controllers-or-routes-found', 'Controllers or routes found', /app\\/controllers\\/|config\\/routes\\.rb/i.test(ctx.pathBlob) || /resources\\s+:|namespace\\s+:|ActionController/i.test(ctx.contentBlob), pathEvidence(ctx, /app\\/controllers\\/|config\\/routes\\.rb/i).concat(fileEvidence(ctx, /resources\\s+:|namespace\\s+:|ActionController/i)), 'Keep Rails controllers and routes visible in the repo.'),\r\n item('request-validation-found', 'Validation or strong params found', /validates\\s+:|params\\.require|permit\\(|ActiveModel::Serializer|dry-validation/i.test(ctx.contentBlob), fileEvidence(ctx, /validates\\s+:|params\\.require|permit\\(|ActiveModel::Serializer|dry-validation/i), 'Validate request bodies and model inputs before processing backend operations.'),\r\n item('backend-error-handling-found', 'Backend error handling found', /rescue_from|rescue\\s+|render\\s+json:.*status:|head\\s+:/i.test(ctx.contentBlob), fileEvidence(ctx, /rescue_from|rescue\\s+|render\\s+json:.*status:|head\\s+:/i), 'Add consistent Rails error handling for API routes.'),\r\n manualItem('production-runtime-checked', 'Production runtime limits checked', 'Confirm Puma/workers, job queues, database pool, timeout, and region choices for production.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeGoBackend(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'go-backend',\r\n provider: 'go',\r\n providerLabel: 'Go',\r\n area: 'backend',\r\n areaLabel: 'Backend / API',\r\n promptSubject: 'Go backend',\r\n items: [\r\n item('go-runtime-found', 'Go API runtime found', /(^|\\n|\\/)go\\.mod\\b|gin-gonic|go-chi|gofiber|net\\/http/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /gin-gonic|go-chi|gofiber|net\\/http/i).concat(pathEvidence(ctx, /(^|\\/)go\\.mod\\b/i)), 'Add or confirm Go modules and the HTTP framework used by this app.'),\r\n item('handlers-or-routes-found', 'Handlers or routes found', /\\.go\\b/i.test(ctx.pathBlob) && /\\b(GET|POST|PUT|DELETE)\\s*\\(|http\\.Handle|HandleFunc|router\\./i.test(ctx.contentBlob), fileEvidence(ctx, /\\b(GET|POST|PUT|DELETE)\\s*\\(|http\\.Handle|HandleFunc|router\\./i), 'Keep Go handlers and route registration visible in the repo.'),\r\n item('request-validation-found', 'Request validation found', /validator|binding:|bindjson|shouldbind|json\\.newdecoder|validate\\./i.test(ctx.contentBlob), fileEvidence(ctx, /validator|binding:|bindjson|shouldbind|json\\.newdecoder|validate\\./i), 'Validate request bodies and parameters before processing backend operations.'),\r\n item('backend-error-handling-found', 'Backend error handling found', /if\\s+err\\s*!=\\s*nil|http\\.Error|statusinternalservererror|c\\.json\\([^)]*500/i.test(ctx.contentBlob), fileEvidence(ctx, /if\\s+err\\s*!=\\s*nil|http\\.Error|statusinternalservererror|c\\.json\\([^)]*500/i), 'Add consistent Go error handling for API routes.'),\r\n manualItem('production-runtime-checked', 'Production runtime limits checked', 'Confirm binary build, health checks, timeout, concurrency, and region choices for production.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeClerkAuth(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'clerk-auth',\r\n provider: 'clerk',\r\n providerLabel: 'Clerk',\r\n area: 'auth',\r\n areaLabel: 'Auth',\r\n promptSubject: 'Clerk auth',\r\n items: [\r\n item('package-installed', 'Clerk package installed', hasPackage(ctx, [/^@clerk\\//]), packageEvidence(ctx, [/^@clerk\\//]), 'Install the Clerk package that matches this app framework.'),\r\n item('env-names-documented', 'Clerk env names documented', hasAllContent(ctx, [/next_public_clerk_publishable_key/i, /clerk_secret_key/i]), envEvidence(ctx, [/next_public_clerk_publishable_key/i, /clerk_secret_key/i]), 'Document NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY and CLERK_SECRET_KEY in an env example or setup docs.'),\r\n item('route-protection-found', 'Auth middleware or route protection found', /(^|\\n|\\/)middleware\\.[jt]sx?\\b/i.test(ctx.pathBlob) || /clerkmiddleware|authmiddleware|createRouteMatcher/i.test(ctx.contentBlob), fileEvidence(ctx, /middleware\\.[jt]sx?$|clerkmiddleware|authmiddleware|createRouteMatcher/i), 'Add Clerk middleware or route guards around authenticated app routes.'),\r\n item('provider-mounted', 'Clerk provider mounted', /clerkprovider/i.test(ctx.contentBlob), fileEvidence(ctx, /clerkprovider/i), 'Mount ClerkProvider in the app root or framework-specific provider layer.'),\r\n item('sign-in-flow-found', 'Sign-in or sign-up flow found', /sign-?in|sign-?up/i.test(ctx.pathBlob) || /<\\s*sign(in|up)\\b|sign(in|up)button/i.test(ctx.contentBlob), fileEvidence(ctx, /sign-?in|sign-?up|<\\s*sign(in|up)\\b|sign(in|up)button/i), 'Add a visible sign-in/sign-up route or component for users.'),\r\n item('server-auth-usage-found', 'Server auth usage found', /\\bauth\\s*\\(|currentuser\\s*\\(|getauth\\s*\\(/i.test(ctx.contentBlob), fileEvidence(ctx, /\\bauth\\s*\\(|currentuser\\s*\\(|getauth\\s*\\(/i), 'Use Clerk server auth in protected data routes or server components.'),\r\n secretSafetyItem(ctx, 'secret-not-exposed', 'Clerk secret key not exposed to frontend', /clerk_secret_key|sk_live_/i, 'Move Clerk secret key usage to server-only files and keep frontend code on publishable keys.'),\r\n manualItem('production-dashboard-checked', 'Production Clerk app and domains checked', 'Confirm production domains, OAuth redirects, allowed origins, and social provider settings in Clerk Dashboard.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeAuthJsAuth(ctx: StackContext): StackWiringProviderSummary {\n return summarize({\n key: 'authjs-auth',\r\n provider: 'authjs',\r\n providerLabel: 'Auth.js',\r\n area: 'auth',\r\n areaLabel: 'Auth',\r\n promptSubject: 'Auth.js auth',\r\n items: [\r\n item('package-installed', 'Auth.js package installed', hasPackage(ctx, [/^next-auth$/, /^@auth\\//]), packageEvidence(ctx, [/^next-auth$/, /^@auth\\//]), 'Install next-auth or the correct @auth package for this framework.'),\r\n item('env-names-documented', 'Auth secret env documented', /auth_secret|nextauth_secret/i.test(ctx.contentBlob), envEvidence(ctx, [/auth_secret/i, /nextauth_secret/i, /nextauth_url/i]), 'Document AUTH_SECRET or NEXTAUTH_SECRET in env examples or setup docs.'),\r\n item('auth-config-found', 'Auth config found', /(^|\\n|\\/)auth\\.[jt]s\\b|nextauth|NextAuth\\s*\\(/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /auth\\.[jt]s$|nextauth|NextAuth\\s*\\(/i), 'Add a central Auth.js config with providers and callbacks.'),\r\n item('route-handler-found', 'Auth route handler found', /api\\/auth|handlers\\s*:\\s*{|GET|POST/i.test(ctx.pathBlob + '\\n' + ctx.contentBlob), pathEvidence(ctx, /api\\/auth/i).concat(fileEvidence(ctx, /handlers\\s*:\\s*{|NextAuth\\s*\\(/i)), 'Expose the Auth.js route handler expected by this framework.'),\r\n item('session-usage-found', 'Session usage found', /\\bauth\\s*\\(|getserversession|usesession\\s*\\(/i.test(ctx.contentBlob), fileEvidence(ctx, /\\bauth\\s*\\(|getserversession|usesession\\s*\\(/i), 'Use server or client session checks around authenticated product routes.'),\r\n secretSafetyItem(ctx, 'secret-not-exposed', 'Auth secret not exposed to frontend', /auth_secret|nextauth_secret/i, 'Move Auth.js secrets to server-only env and never expose them through public env variables.'),\r\n manualItem('production-provider-checked', 'Production OAuth providers checked', 'Confirm OAuth app callback URLs, secrets, and production domain settings in each provider dashboard.')\r\n ]\r\n });\n}\n\nfunction analyzeAuth0Auth(ctx: StackContext): StackWiringProviderSummary {\n return summarize({\n key: 'auth0-auth',\n provider: 'auth0',\n providerLabel: 'Auth0',\n area: 'auth',\n areaLabel: 'Auth',\n promptSubject: 'Auth0 auth',\n items: [\n item('package-installed', 'Auth0 package installed', hasPackage(ctx, [/@auth0\\//]), packageEvidence(ctx, [/@auth0\\//]), 'Install the Auth0 package that matches this framework.'),\n item('env-names-documented', 'Auth0 env names documented', /auth0_secret|auth0_issuer_base_url|auth0_client_id|auth0_client_secret|auth0_domain/i.test(ctx.contentBlob), envEvidence(ctx, [/auth0_secret/i, /auth0_issuer_base_url/i, /auth0_client_id/i, /auth0_client_secret/i, /auth0_domain/i]), 'Document Auth0 issuer/domain, client ID, client secret, and app secret env names in safe examples.'),\n item('auth-route-found', 'Auth0 callback or auth route found', /api\\/auth|auth0|handleauth|callback/i.test(ctx.pathBlob + '\\n' + ctx.contentBlob), pathEvidence(ctx, /api\\/auth|callback/i).concat(fileEvidence(ctx, /auth0|handleauth|callback/i)), 'Expose the Auth0 callback/login/logout routes required by this framework.'),\n item('session-usage-found', 'Auth0 session usage found', /getsession|withapirequiredauth|withpagerequiredauth|useuser\\s*\\(/i.test(ctx.contentBlob), fileEvidence(ctx, /getsession|withapirequiredauth|withpagerequiredauth|useuser\\s*\\(/i), 'Use Auth0 session checks around authenticated app routes and API handlers.'),\n item('route-protection-found', 'Protected route evidence found', /withpagerequiredauth|withapirequiredauth|middleware|protected|requires?auth/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /withpagerequiredauth|withapirequiredauth|middleware|protected|requires?auth/i), 'Protect private routes with Auth0 middleware or server session guards.'),\n secretSafetyItem(ctx, 'secret-not-exposed', 'Auth0 secrets not exposed to frontend', /auth0_client_secret|auth0_secret/i, 'Keep Auth0 secrets in server-only env and never expose them through public env variables.'),\n manualItem('production-dashboard-checked', 'Production Auth0 app checked', 'Confirm callback URLs, logout URLs, allowed origins, social connections, MFA, and production domain in Auth0.')\n ]\n });\n}\n\nfunction analyzeBetterAuth(ctx: StackContext): StackWiringProviderSummary {\n return summarize({\n key: 'better-auth-auth',\n provider: 'better-auth',\n providerLabel: 'Better Auth',\n area: 'auth',\n areaLabel: 'Auth',\n promptSubject: 'Better Auth',\n items: [\n item('package-installed', 'Better Auth package installed', hasPackage(ctx, [/^better-auth$/]), packageEvidence(ctx, [/^better-auth$/]), 'Install Better Auth for this app framework.'),\n item('env-names-documented', 'Better Auth env names documented', /better_auth_secret|better_auth_url|auth_secret|database_url/i.test(ctx.contentBlob), envEvidence(ctx, [/better_auth_secret/i, /better_auth_url/i, /auth_secret/i, /database_url/i]), 'Document BETTER_AUTH_SECRET, BETTER_AUTH_URL, and database env names in safe examples.'),\n item('auth-config-found', 'Better Auth config found', /betterauth\\s*\\(|better-auth|auth\\.api|auth\\.handler/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /betterauth\\s*\\(|better-auth|auth\\.api|auth\\.handler/i), 'Add a central Better Auth config and route handler.'),\n item('database-adapter-found', 'Auth database adapter or schema found', /database|adapter|drizzle|prisma|schema|migration/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /adapter|drizzle|prisma|schema|migration/i), 'Persist Better Auth users/sessions through a real database adapter and migrations.'),\n item('session-usage-found', 'Session usage found', /getsession|usesession|auth\\.api\\.getsession|session/i.test(ctx.contentBlob), fileEvidence(ctx, /getsession|usesession|auth\\.api\\.getsession|session/i), 'Use Better Auth session reads around private product routes.'),\n secretSafetyItem(ctx, 'secret-not-exposed', 'Better Auth secret not exposed to frontend', /better_auth_secret|auth_secret/i, 'Keep Better Auth secrets in server-only env and never expose them through public env variables.'),\n manualItem('production-auth-checked', 'Production auth settings checked', 'Confirm production base URL, trusted origins, OAuth apps, email settings, and session policy.')\n ]\n });\n}\n\nfunction analyzeSupabaseAuth(ctx: StackContext): StackWiringProviderSummary {\n return summarize({\n key: 'supabase-auth',\r\n provider: 'supabase-auth',\r\n providerLabel: 'Supabase Auth',\r\n area: 'auth',\r\n areaLabel: 'Auth',\r\n promptSubject: 'Supabase Auth',\r\n items: [\r\n item('package-installed', 'Supabase auth package installed', hasPackage(ctx, [/@supabase\\//]), packageEvidence(ctx, [/@supabase\\//]), 'Install @supabase/supabase-js or @supabase/ssr for auth helpers.'),\r\n item('env-names-documented', 'Supabase auth env names documented', /supabase_url/i.test(ctx.contentBlob) && /supabase_anon_key/i.test(ctx.contentBlob), envEvidence(ctx, [/supabase_url/i, /supabase_anon_key/i]), 'Document SUPABASE_URL and SUPABASE_ANON_KEY style env names in examples or setup docs.'),\r\n item('auth-helper-found', 'Supabase auth helper found', /auth\\.getuser|auth\\.getsession|auth\\.signin|auth\\.signup|createServerClient|createBrowserClient/i.test(ctx.contentBlob), fileEvidence(ctx, /auth\\.getuser|auth\\.getsession|auth\\.signin|auth\\.signup|createServerClient|createBrowserClient/i), 'Use Supabase auth helpers for session reads and sign-in flows.'),\r\n item('protected-route-found', 'Protected route or server session check found', /auth\\.getuser|auth\\.getsession|middleware|protected/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /auth\\.getuser|auth\\.getsession|middleware|protected/i), 'Protect signed-in routes with a server session check or middleware.'),\r\n secretSafetyItem(ctx, 'service-role-not-exposed', 'Service role key not exposed to frontend', /supabase_service_role_key|next_public_supabase_service_role|vite_supabase_service_role/i, 'Keep service-role keys in server-only code and use anon keys in frontend clients.'),\r\n manualItem('production-auth-dashboard-checked', 'Production Supabase Auth settings checked', 'Confirm site URL, redirect URLs, email provider, OAuth providers, and auth policies in Supabase Dashboard.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeStripePayments(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'stripe-payments',\r\n provider: 'stripe',\r\n providerLabel: 'Stripe',\r\n area: 'payments',\r\n areaLabel: 'Payments',\r\n promptSubject: 'Stripe payments',\r\n items: [\r\n item('package-installed', 'Stripe package installed', hasPackage(ctx, [/^stripe$/, /^@stripe\\//]), packageEvidence(ctx, [/^stripe$/, /^@stripe\\//]), 'Install Stripe server/client packages that match this app framework.'),\r\n item('env-names-documented', 'Stripe env names documented', hasAllContent(ctx, [/stripe_secret_key/i, /stripe_webhook_secret/i]), envEvidence(ctx, [/stripe_secret_key/i, /stripe_webhook_secret/i, /next_public_stripe_publishable_key/i]), 'Document STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET, and publishable key names in env examples or setup docs.'),\r\n item('checkout-session-found', 'Checkout session creation found', /checkout\\.sessions\\.create|redirecttocheckout/i.test(ctx.contentBlob), fileEvidence(ctx, /checkout\\.sessions\\.create|redirecttocheckout/i), 'Create a server-side Stripe Checkout session path for paid plans.'),\r\n item('webhook-route-found', 'Stripe webhook route found', /stripe.*webhook|webhook.*stripe/i.test(ctx.pathBlob), pathEvidence(ctx, /stripe.*webhook|webhook.*stripe/i), 'Add a Stripe webhook route for subscription and payment lifecycle events.'),\r\n item('webhook-signature-found', 'Webhook signature verification found', /webhooks\\.constructevent/i.test(ctx.contentBlob), fileEvidence(ctx, /webhooks\\.constructevent/i), 'Verify Stripe webhook signatures with STRIPE_WEBHOOK_SECRET before processing events.'),\r\n item('billing-management-found', 'Subscription or customer portal found', /billingportal\\.sessions\\.create|subscriptions\\.create|mode\\s*:\\s*['\"]subscription['\"]/i.test(ctx.contentBlob), fileEvidence(ctx, /billingportal\\.sessions\\.create|subscriptions\\.create|mode\\s*:\\s*['\"]subscription['\"]/i), 'Add subscription creation or customer portal handling for paid users.'),\r\n secretSafetyItem(ctx, 'secret-not-exposed', 'Stripe secret key not exposed to frontend', /stripe_secret_key|sk_live_|sk_test_/i, 'Move Stripe secret-key usage to server-only routes and use publishable keys in frontend code.'),\r\n manualItem('production-dashboard-checked', 'Production Stripe products and webhooks checked', 'Confirm live-mode products, prices, webhook endpoint URL, and event list in Stripe Dashboard.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzePaddlePayments(ctx: StackContext): StackWiringProviderSummary {\n return summarize({\n key: 'paddle-payments',\r\n provider: 'paddle',\r\n providerLabel: 'Paddle',\r\n area: 'payments',\r\n areaLabel: 'Payments',\r\n promptSubject: 'Paddle payments',\r\n items: [\r\n item('package-installed', 'Paddle package installed', hasPackage(ctx, [/@paddle\\//]), packageEvidence(ctx, [/@paddle\\//]), 'Install Paddle client/server SDK packages that match this app framework.'),\r\n item('env-names-documented', 'Paddle env names documented', /paddle_api_key|paddle_webhook_secret|next_public_paddle/i.test(ctx.contentBlob), envEvidence(ctx, [/paddle_api_key/i, /paddle_webhook_secret/i, /next_public_paddle_client_token/i]), 'Document Paddle API key, webhook secret, and public client token env names.'),\r\n item('checkout-found', 'Paddle checkout flow found', /paddle.*checkout|checkout.*paddle|paddle\\.checkout|openCheckout/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /paddle.*checkout|checkout.*paddle|paddle\\.checkout|openCheckout/i), 'Add a Paddle checkout flow for paid plans.'),\r\n item('webhook-route-found', 'Paddle webhook route found', /paddle.*webhook|webhook.*paddle/i.test(ctx.pathBlob), pathEvidence(ctx, /paddle.*webhook|webhook.*paddle/i), 'Add a Paddle webhook route for subscription lifecycle events.'),\r\n item('webhook-signature-found', 'Paddle webhook verification found', /verify.*paddle|paddle.*signature|webhook.*signature/i.test(ctx.contentBlob), fileEvidence(ctx, /verify.*paddle|paddle.*signature|webhook.*signature/i), 'Verify Paddle webhook signatures before processing events.'),\r\n secretSafetyItem(ctx, 'secret-not-exposed', 'Paddle secret not exposed to frontend', /paddle_api_key|paddle_webhook_secret/i, 'Move Paddle API keys and webhook secrets to server-only code.'),\r\n manualItem('production-dashboard-checked', 'Production Paddle products and webhooks checked', 'Confirm live products, prices, tax settings, webhook URL, and event list in Paddle Dashboard.')\r\n ]\r\n });\n}\n\nfunction analyzePolarPayments(ctx: StackContext): StackWiringProviderSummary {\n return summarize({\n key: 'polar-payments',\n provider: 'polar',\n providerLabel: 'Polar',\n area: 'payments',\n areaLabel: 'Payments',\n promptSubject: 'Polar payments',\n items: [\n item('api-client-found', 'Polar SDK or API client found', hasPackage(ctx, [/@polar-sh\\//]) || Boolean(ctx.scan.stackSignals.hasPolar) || /api\\.polar\\.sh|sandbox-api\\.polar\\.sh|polarbillingservice/i.test(ctx.contentBlob), packageEvidence(ctx, [/@polar-sh\\//]).concat(fileEvidence(ctx, /api\\.polar\\.sh|sandbox-api\\.polar\\.sh|polarbillingservice/i)), 'Add a Polar SDK or server-side API client for checkout and customer state.'),\n item('env-names-documented', 'Polar env names documented', /polar_access_token|polar_webhook_secret|polar_pro_product_id/i.test(ctx.contentBlob), envEvidence(ctx, [/polar_access_token/i, /polar_webhook_secret/i, /polar_pro_product_id/i, /polar_sandbox/i]), 'Document POLAR_ACCESS_TOKEN, POLAR_WEBHOOK_SECRET, and product ID env names in safe examples.'),\n item('checkout-found', 'Polar checkout flow found', /polar.*checkout|checkout.*polar|\\/checkouts\\b|createcheckoutsession/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /polar.*checkout|checkout.*polar|\\/checkouts\\b|createcheckoutsession/i), 'Add a server-side Polar checkout flow for paid plans.'),\n item('webhook-route-found', 'Polar webhook route found', /polar.*webhook|webhook.*polar/i.test(ctx.pathBlob + '\\n' + ctx.contentBlob), pathEvidence(ctx, /polar.*webhook|webhook.*polar/i).concat(fileEvidence(ctx, /polar.*webhook|webhook.*polar/i)), 'Add a Polar webhook route for subscription and customer lifecycle events.'),\n item('webhook-signature-found', 'Polar webhook verification found', /polar_webhook_secret|verify.*polar|polar.*signature|webhook.*signature/i.test(ctx.contentBlob), fileEvidence(ctx, /polar_webhook_secret|verify.*polar|polar.*signature|webhook.*signature/i), 'Verify Polar webhook signatures before processing billing events.'),\n item('customer-state-found', 'Polar customer or subscription state found', /external_customer_id|customer_portal|customer[_-]?state|polar_subscription_id|polar_customer_id/i.test(ctx.contentBlob), fileEvidence(ctx, /external_customer_id|customer_portal|customer[_-]?state|polar_subscription_id|polar_customer_id/i), 'Persist Polar customer/subscription state and expose a customer portal path for paid users.'),\n secretSafetyItem(ctx, 'secret-not-exposed', 'Polar secret not exposed to frontend', /polar_access_token|polar_webhook_secret/i, 'Move Polar access tokens and webhook secrets to server-only code.'),\n manualItem('production-dashboard-checked', 'Production Polar products and webhooks checked', 'Confirm products, prices, customer portal, webhook URL, and event list in Polar Dashboard.')\n ]\n });\n}\n\nfunction analyzeLemonSqueezyPayments(ctx: StackContext): StackWiringProviderSummary {\n return summarize({\n key: 'lemon-squeezy-payments',\n provider: 'lemon-squeezy',\n providerLabel: 'Lemon Squeezy',\n area: 'payments',\n areaLabel: 'Payments',\n promptSubject: 'Lemon Squeezy payments',\n items: [\n item('api-client-found', 'Lemon Squeezy SDK or API client found', hasPackage(ctx, [/@lemonsqueezy\\//, /^lemonsqueezy\\.ts$/]) || /api\\.lemonsqueezy\\.com|lemonsqueezy|lemon_squeezy/i.test(ctx.contentBlob), packageEvidence(ctx, [/@lemonsqueezy\\//, /^lemonsqueezy\\.ts$/]).concat(fileEvidence(ctx, /api\\.lemonsqueezy\\.com|lemonsqueezy|lemon_squeezy/i)), 'Add a server-side Lemon Squeezy API client for checkout and subscription state.'),\n item('env-names-documented', 'Lemon Squeezy env names documented', /lemon_squeezy_api_key|lemonsqueezy_api_key|lemon_squeezy_webhook_secret|lemon_squeezy_store_id|lemon_squeezy_variant_id/i.test(ctx.contentBlob), envEvidence(ctx, [/lemon_squeezy_api_key/i, /lemonsqueezy_api_key/i, /lemon_squeezy_webhook_secret/i, /lemon_squeezy_store_id/i, /lemon_squeezy_variant_id/i]), 'Document Lemon Squeezy API key, webhook secret, store ID, and variant/product ID env names.'),\n item('checkout-found', 'Lemon Squeezy checkout flow found', /lemon.*checkout|checkout.*lemon|checkout_url|variant_id|store_id/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /lemon.*checkout|checkout.*lemon|checkout_url|variant_id|store_id/i), 'Create a checkout URL/session flow for paid plans.'),\n item('webhook-route-found', 'Lemon Squeezy webhook route found', /lemon.*webhook|webhook.*lemon|lemonsqueezy.*webhook/i.test(ctx.pathBlob + '\\n' + ctx.contentBlob), pathEvidence(ctx, /lemon.*webhook|webhook.*lemon|lemonsqueezy.*webhook/i).concat(fileEvidence(ctx, /lemonsqueezy.*webhook|lemon.*webhook/i)), 'Add a Lemon Squeezy webhook route for order/subscription lifecycle events.'),\n item('webhook-signature-found', 'Lemon Squeezy webhook verification found', /x-signature|lemon_squeezy_webhook_secret|verify.*lemon|webhook.*signature/i.test(ctx.contentBlob), fileEvidence(ctx, /x-signature|lemon_squeezy_webhook_secret|verify.*lemon|webhook.*signature/i), 'Verify Lemon Squeezy webhook signatures before processing billing events.'),\n secretSafetyItem(ctx, 'secret-not-exposed', 'Lemon Squeezy secret not exposed to frontend', /lemon_squeezy_api_key|lemonsqueezy_api_key|lemon_squeezy_webhook_secret/i, 'Move Lemon Squeezy API keys and webhook secrets to server-only code.'),\n manualItem('production-dashboard-checked', 'Production Lemon Squeezy store checked', 'Confirm products, variants, tax/merchant settings, license keys if used, and webhook URL in Lemon Squeezy.')\n ]\n });\n}\n\nfunction analyzeFirebaseDatabase(ctx: StackContext): StackWiringProviderSummary {\n return databaseSummary(ctx, {\n key: 'firebase-database',\n provider: 'firebase',\n providerLabel: 'Firebase',\n promptSubject: 'Firebase database',\n packagePatterns: [/^firebase$/, /^firebase-admin$/, /@firebase\\//],\n envPatterns: [/firebase_project_id/i, /firestore_database_url/i, /next_public_firebase/i, /vite_firebase/i, /google_application_credentials/i],\n usagePatterns: [/firebase\\/firestore/i, /getfirestore\\s*\\(|collection\\s*\\(|doc\\s*\\(|firebase-admin/i],\n manualLabel: 'Production Firebase project checked',\n manualHint: 'Confirm production project, Firestore rules, indexes, backups, service account scope, and billing limits in Firebase.'\n });\n}\n\nfunction analyzeNeonDatabase(ctx: StackContext): StackWiringProviderSummary {\n return databaseSummary(ctx, {\n key: 'neon-database',\r\n provider: 'neon',\r\n providerLabel: 'Neon',\r\n promptSubject: 'Neon database',\r\n packagePatterns: [/@neondatabase\\//],\r\n envPatterns: [/neon_database_url/i, /database_url/i],\r\n usagePatterns: [/@neondatabase\\/serverless/i, /\\bneon\\s*\\(/i, /\\bsql`/i],\r\n manualLabel: 'Production Neon branch and pooling checked',\r\n manualHint: 'Confirm production branch, pooled connection string, backups, and region in Neon.'\r\n });\r\n}\r\n\r\nfunction analyzeTursoDatabase(ctx: StackContext): StackWiringProviderSummary {\r\n return databaseSummary(ctx, {\r\n key: 'turso-database',\r\n provider: 'turso',\r\n providerLabel: 'Turso',\r\n promptSubject: 'Turso database',\r\n packagePatterns: [/@libsql\\/client/],\r\n envPatterns: [/turso_database_url/i, /turso_auth_token/i],\r\n usagePatterns: [/@libsql\\/client/i, /createClient\\s*\\(/i],\r\n manualLabel: 'Production Turso database checked',\r\n manualHint: 'Confirm production database, auth token scope, replica/region, and backup strategy in Turso.'\r\n });\r\n}\r\n\r\nfunction analyzeMongoDatabase(ctx: StackContext): StackWiringProviderSummary {\r\n return databaseSummary(ctx, {\r\n key: 'mongodb-database',\r\n provider: 'mongodb',\r\n providerLabel: 'MongoDB',\r\n promptSubject: 'MongoDB database',\r\n packagePatterns: [/^mongodb$/, /^mongoose$/],\r\n envPatterns: [/mongodb_uri/i, /mongodb_url/i, /mongodb_atlas_uri/i],\r\n usagePatterns: [/new\\s+MongoClient|mongoose\\.connect|mongodb/i],\r\n manualLabel: 'Production MongoDB Atlas settings checked',\r\n manualHint: 'Confirm Atlas network access, database user permissions, backups, indexes, and production cluster sizing.'\r\n });\r\n}\r\n\r\nfunction analyzePlanetScaleDatabase(ctx: StackContext): StackWiringProviderSummary {\r\n return databaseSummary(ctx, {\r\n key: 'planetscale-database',\r\n provider: 'planetscale',\r\n providerLabel: 'PlanetScale',\r\n promptSubject: 'PlanetScale database',\r\n packagePatterns: [/@planetscale\\/database/],\r\n envPatterns: [/planetscale_database_url/i, /database_url/i],\r\n usagePatterns: [/@planetscale\\/database/i, /connect\\s*\\(/i],\r\n manualLabel: 'Production PlanetScale branch checked',\r\n manualHint: 'Confirm production branch, deploy requests, connection credentials, backups, and schema migration workflow.'\r\n });\r\n}\r\n\r\nfunction analyzeVercelDeployment(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'vercel-deployment',\r\n provider: 'vercel',\r\n providerLabel: 'Vercel',\r\n area: 'deployment',\r\n areaLabel: 'Deployment',\r\n promptSubject: 'Vercel deployment',\r\n items: [\r\n item('deploy-target-detected', 'Vercel-compatible app detected', Boolean(ctx.scan.stackSignals.hasVercel || ctx.scan.stackSignals.hasNextJs || ctx.scan.stackSignals.hasVite || /vercel\\.json|next\\.config|vite\\.config/i.test(ctx.pathBlob)), pathEvidence(ctx, /vercel\\.json|next\\.config|vite\\.config/i), 'Confirm this app has a Vercel-compatible framework or deployment target.'),\r\n item('build-script-found', 'Production build script found', /\"build\"\\s*:\\s*\"[^\"]+\"/i.test(ctx.contentBlob), fileEvidence(ctx, /\"build\"\\s*:\\s*\"[^\"]+\"/i), 'Add a package.json build script that Vercel can run.'),\r\n item('deployment-config-found', 'Deployment config or command found', /vercel\\.json/i.test(ctx.pathBlob) || /\"deploy\"\\s*:\\s*\"[^\"]*vercel/i.test(ctx.contentBlob), pathEvidence(ctx, /vercel\\.json/i).concat(fileEvidence(ctx, /\"deploy\"\\s*:\\s*\"[^\"]*vercel/i)), 'Add vercel.json or a documented Vercel deploy command when the project needs custom deployment behavior.'),\r\n item('env-template-found', 'Production env template found', Boolean(ctx.scan.stackSignals.hasEnvExample || /(^|\\n|\\/)\\.env\\.example\\b|env\\.example|environment variables/i.test(ctx.pathBlob + '\\n' + ctx.contentBlob)), pathEvidence(ctx, /\\.env\\.example|env\\.example/i), 'Document production env variable names in .env.example or setup docs.'),\r\n item('preview-or-ci-found', 'Preview deploy or CI config found', Boolean(ctx.scan.stackSignals.hasCI || /\\.github\\/workflows|vercel\\.json/i.test(ctx.pathBlob)), pathEvidence(ctx, /\\.github\\/workflows|vercel\\.json/i), 'Add CI or Vercel preview-deploy configuration so production changes are tested before release.'),\r\n manualItem('production-dashboard-checked', 'Production Vercel env and domain checked', 'Confirm production env values, project link, framework preset, build command, and production domain in Vercel Dashboard.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeNetlifyDeployment(ctx: StackContext): StackWiringProviderSummary {\n const base = deploymentSummary(ctx, {\n key: 'netlify-deployment',\r\n provider: 'netlify',\r\n providerLabel: 'Netlify',\r\n promptSubject: 'Netlify deployment',\r\n packagePatterns: [/@netlify\\//],\r\n configPatterns: [/netlify\\.toml/i, /\\.netlify\\//i],\r\n envPatterns: [/netlify_auth_token/i, /netlify_site_id/i],\r\n manualLabel: 'Production Netlify env and domain checked',\r\n manualHint: 'Confirm build command, publish directory, functions runtime, env values, redirects, and production domain in Netlify.'\r\n });\r\n const redirectsOrFunctionsPattern = /(\\[\\[redirects\\]\\]|(^|\\n|\\/)_redirects\\b|(^|\\n|\\/)netlify\\/functions\\/|\\[functions\\]|functions\\s*=)/i;\r\n return summarize({\r\n ...base,\r\n items: [\r\n ...base.items.filter((entry) => entry.status !== 'manual'),\r\n item('redirects-or-functions-found', 'Redirects or Netlify Functions found', redirectsOrFunctionsPattern.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, redirectsOrFunctionsPattern).concat(pathEvidence(ctx, redirectsOrFunctionsPattern)), 'Add Netlify redirects or functions configuration when deployment behavior depends on routing or serverless handlers.'),\r\n ...base.items.filter((entry) => entry.status === 'manual')\r\n ]\r\n });\n}\n\nfunction analyzeRenderDeployment(ctx: StackContext): StackWiringProviderSummary {\n const base = deploymentSummary(ctx, {\n key: 'render-deployment',\n provider: 'render',\n providerLabel: 'Render',\n promptSubject: 'Render deployment',\n packagePatterns: [],\n configPatterns: [/render\\.ya?ml/i, /(^|\\n|\\/)\\.render\\//i],\n envPatterns: [/render_api_key/i, /render_service_id/i],\n manualLabel: 'Production Render service checked',\n manualHint: 'Confirm service type, build/start commands, env groups, health checks, custom domain, autoscaling, and rollback strategy in Render.'\n });\n const servicePattern = /render\\.ya?ml|healthcheckpath|startcommand|buildcommand|envvars|services:\\s*|type:\\s*web/i;\n return summarize({\n ...base,\n items: [\n ...base.items.filter((entry) => entry.status !== 'manual'),\n item('service-config-found', 'Render service config found', servicePattern.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, servicePattern).concat(pathEvidence(ctx, servicePattern)), 'Add render.yaml or deployment docs covering service type, commands, health checks, and env groups.'),\n ...base.items.filter((entry) => entry.status === 'manual')\n ]\n });\n}\n\nfunction analyzeRailwayDeployment(ctx: StackContext): StackWiringProviderSummary {\n const base = deploymentSummary(ctx, {\n key: 'railway-deployment',\n provider: 'railway',\n providerLabel: 'Railway',\n promptSubject: 'Railway deployment',\n packagePatterns: [],\n configPatterns: [/railway\\.json/i, /nixpacks\\.toml/i, /(^|\\n|\\/)Procfile\\b/i],\n envPatterns: [/railway_token/i, /railway_project_id/i, /railway_service_id/i],\n manualLabel: 'Production Railway service checked',\n manualHint: 'Confirm service, variables, start command, volumes/databases, custom domain, deploy policy, and logs in Railway.'\n });\n const servicePattern = /railway\\.json|nixpacks\\.toml|railway up|railway deploy|Procfile|startCommand|healthcheck/i;\n return summarize({\n ...base,\n items: [\n ...base.items.filter((entry) => entry.status !== 'manual'),\n item('service-config-found', 'Railway service config found', servicePattern.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, servicePattern).concat(pathEvidence(ctx, servicePattern)), 'Add Railway/Nixpacks/Procfile config or deployment docs for commands, health checks, and service wiring.'),\n ...base.items.filter((entry) => entry.status === 'manual')\n ]\n });\n}\n\nfunction analyzeCloudflareDeployment(ctx: StackContext): StackWiringProviderSummary {\n const base = deploymentSummary(ctx, {\n key: 'cloudflare-deployment',\n provider: 'cloudflare',\n providerLabel: 'Cloudflare',\n promptSubject: 'Cloudflare deployment',\n packagePatterns: [/^wrangler$/, /@cloudflare\\//],\n configPatterns: [/wrangler\\.toml/i, /wrangler\\.json/i, /_headers\\b/i, /_redirects\\b/i],\n envPatterns: [/cloudflare_api_token/i, /cloudflare_account_id/i, /cf_pages/i],\n manualLabel: 'Production Cloudflare project checked',\n manualHint: 'Confirm Pages/Workers project, DNS, routes, compatibility date, env vars/secrets, cache rules, and rollback settings in Cloudflare.'\n });\n const edgePattern = /wrangler\\.toml|wrangler\\.json|compatibility_date|pages_build_output_dir|workers_dev|routes?\\s*=|cloudflare pages|cloudflare workers/i;\n return summarize({\n ...base,\n items: [\n ...base.items.filter((entry) => entry.status !== 'manual'),\n item('edge-config-found', 'Cloudflare Pages or Workers config found', edgePattern.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, edgePattern).concat(pathEvidence(ctx, edgePattern)), 'Add Wrangler/Pages config for build output, compatibility date, routes, and edge runtime behavior.'),\n ...base.items.filter((entry) => entry.status === 'manual')\n ]\n });\n}\n\nfunction analyzeAwsDeployment(ctx: StackContext): StackWiringProviderSummary {\n const base = deploymentSummary(ctx, {\n key: 'aws-deployment',\r\n provider: 'aws',\r\n providerLabel: 'AWS',\r\n promptSubject: 'AWS deployment',\r\n packagePatterns: [/@aws-sdk\\//, /^aws-cdk-lib$/, /^serverless$/],\r\n configPatterns: [/serverless\\.ya?ml/i, /template\\.ya?ml/i, /cdk\\.json/i, /amplify\\//i, /\\.github\\/workflows/i],\r\n envPatterns: [/aws_region/i, /aws_access_key_id/i],\r\n manualLabel: 'Production AWS account and IAM checked',\r\n manualHint: 'Confirm IAM permissions, region, secrets, logs, alarms, domains, and rollback strategy in AWS.'\r\n });\r\n const infrastructurePattern = /serverless\\.ya?ml|template\\.ya?ml|cdk\\.json|sst\\.config|terraform|cloudformation|aws-cdk-lib|provider:\\s*\\n\\s*name:\\s*aws|resources:\\s*|functions:\\s*/i;\r\n return summarize({\r\n ...base,\r\n items: [\r\n ...base.items.filter((entry) => entry.status !== 'manual'),\r\n item('infrastructure-config-found', 'AWS infrastructure config found', infrastructurePattern.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, infrastructurePattern).concat(pathEvidence(ctx, infrastructurePattern)), 'Add reproducible AWS infrastructure config such as Serverless, CDK, SAM, CloudFormation, or Terraform.'),\r\n ...base.items.filter((entry) => entry.status === 'manual')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeSupabaseLanding(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'supabase-landing',\r\n provider: 'supabase',\r\n providerLabel: 'Supabase',\r\n area: 'landing',\r\n areaLabel: 'Landing / Onboarding',\r\n promptSubject: 'Supabase landing data',\r\n items: [\r\n item('package-installed', 'Supabase package installed', hasPackage(ctx, [/@supabase\\//]), packageEvidence(ctx, [/@supabase\\//]), 'Install Supabase client/server helpers for waitlist or onboarding storage.'),\r\n item('env-names-documented', 'Supabase env names documented', /supabase_url/i.test(ctx.contentBlob) && /supabase_anon_key/i.test(ctx.contentBlob), envEvidence(ctx, [/supabase_url/i, /supabase_anon_key/i]), 'Document Supabase URL and anon key env names for landing/onboarding data.'),\r\n item('lead-table-usage-found', 'Lead or onboarding data usage found', /waitlist|lead|onboarding|signup|profiles|subscribers/i.test(ctx.contentBlob), fileEvidence(ctx, /waitlist|lead|onboarding|signup|profiles|subscribers/i), 'Store waitlist, lead, or onboarding records in a clear Supabase table.'),\r\n item('form-submit-found', 'Form submission path found', /formdata|onSubmit|action=|submit|insert\\s*\\(/i.test(ctx.contentBlob), fileEvidence(ctx, /formdata|onSubmit|action=|submit|insert\\s*\\(/i), 'Wire the landing/onboarding form to a real server-safe submission path.'),\r\n manualItem('production-data-policy-checked', 'Production data policy checked', 'Confirm table permissions, spam handling, and privacy policy alignment in Supabase.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeSentryMonitoring(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'sentry-monitoring',\r\n provider: 'sentry',\r\n providerLabel: 'Sentry',\r\n area: 'monitoring',\r\n areaLabel: 'Monitoring',\r\n promptSubject: 'Sentry monitoring',\r\n items: [\r\n item('package-installed', 'Sentry package installed', hasPackage(ctx, [/^@sentry\\//]), packageEvidence(ctx, [/^@sentry\\//]), 'Install the Sentry package that matches this app framework.'),\r\n item('env-names-documented', 'Sentry DSN env documented', /sentry_dsn|next_public_sentry_dsn/i.test(ctx.contentBlob), envEvidence(ctx, [/sentry_dsn/i, /next_public_sentry_dsn/i]), 'Document SENTRY_DSN or NEXT_PUBLIC_SENTRY_DSN in env examples or setup docs.'),\r\n item('init-found', 'Sentry initialization found', /sentry\\.init\\s*\\(|instrumentation\\.[jt]s/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /sentry\\.init\\s*\\(|instrumentation\\.[jt]s/i), 'Initialize Sentry in the framework entrypoint for client and server errors.'),\r\n item('error-capture-found', 'Error capture or boundary found', /captureexception|global-error|errorboundary|onerror/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /captureexception|global-error|errorboundary|onerror/i), 'Capture production exceptions through Sentry error boundaries or server handlers.'),\r\n item('release-config-found', 'Release or source map config found', /sentry_auth_token|withsentryconfig|sentry-cli|sourcemap/i.test(ctx.contentBlob), fileEvidence(ctx, /sentry_auth_token|withsentryconfig|sentry-cli|sourcemap/i), 'Configure Sentry releases or source maps so production stack traces are useful.'),\r\n manualItem('production-dashboard-checked', 'Production Sentry project checked', 'Confirm DSN, environment names, alerts, retention, and source-map upload status in Sentry.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzePostHogMonitoring(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'posthog-monitoring',\r\n provider: 'posthog',\r\n providerLabel: 'PostHog',\r\n area: 'monitoring',\r\n areaLabel: 'Monitoring',\r\n promptSubject: 'PostHog analytics',\r\n items: [\r\n item('package-installed', 'PostHog package installed', hasPackage(ctx, [/^posthog-js$/, /^posthog-node$/]), packageEvidence(ctx, [/^posthog-js$/, /^posthog-node$/]), 'Install posthog-js or posthog-node for the app surface that needs analytics.'),\r\n item('env-names-documented', 'PostHog env names documented', /posthog_key|next_public_posthog_key/i.test(ctx.contentBlob), envEvidence(ctx, [/posthog_key/i, /next_public_posthog_key/i, /next_public_posthog_host/i]), 'Document NEXT_PUBLIC_POSTHOG_KEY and host/project settings in env examples or setup docs.'),\r\n item('init-found', 'PostHog initialization found', /posthog\\.init\\s*\\(/i.test(ctx.contentBlob), fileEvidence(ctx, /posthog\\.init\\s*\\(/i), 'Initialize PostHog once in the app client/provider layer.'),\r\n item('provider-or-wrapper-found', 'Analytics provider or wrapper found', /posthogprovider|analytics\\/posthog|useposthog/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /posthogprovider|analytics\\/posthog|useposthog/i), 'Add a reusable analytics provider or wrapper instead of scattering raw setup code.'),\r\n item('event-capture-found', 'Product event capture found', /posthog\\.capture\\s*\\(/i.test(ctx.contentBlob), fileEvidence(ctx, /posthog\\.capture\\s*\\(/i), 'Capture at least one activation or conversion event.'),\r\n item('identity-found', 'User identify or group call found', /posthog\\.identify\\s*\\(|posthog\\.group\\s*\\(/i.test(ctx.contentBlob), fileEvidence(ctx, /posthog\\.identify\\s*\\(|posthog\\.group\\s*\\(/i), 'Identify signed-in users or groups where privacy rules allow it.'),\r\n manualItem('production-dashboard-checked', 'Production PostHog project checked', 'Confirm project key, allowed domains, privacy settings, autocapture choice, and retention in PostHog.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeLogRocketMonitoring(ctx: StackContext): StackWiringProviderSummary {\r\n const privacyScrubbingPattern = /requestSanitizer|responseSanitizer|dom\\.inputSanitizer|dom\\.textSanitizer|maskAllInputs|maskInputOptions|sanitize|scrub|redact|privacy/i;\r\n return summarize({\r\n key: 'logrocket-monitoring',\r\n provider: 'logrocket',\r\n providerLabel: 'LogRocket',\r\n area: 'monitoring',\r\n areaLabel: 'Monitoring',\r\n promptSubject: 'LogRocket monitoring',\r\n items: [\r\n item('package-installed', 'LogRocket package installed', hasPackage(ctx, [/^logrocket$/]), packageEvidence(ctx, [/^logrocket$/]), 'Install LogRocket for session replay if this product needs replay debugging.'),\r\n item('env-names-documented', 'LogRocket app id env documented', /logrocket_app_id|next_public_logrocket_app_id/i.test(ctx.contentBlob), envEvidence(ctx, [/logrocket_app_id/i, /next_public_logrocket_app_id/i]), 'Document the LogRocket app id env name.'),\r\n item('init-found', 'LogRocket initialization found', /logrocket\\.init\\s*\\(/i.test(ctx.contentBlob), fileEvidence(ctx, /logrocket\\.init\\s*\\(/i), 'Initialize LogRocket once in the client app shell.'),\r\n item('identify-found', 'User identification found', /logrocket\\.identify\\s*\\(/i.test(ctx.contentBlob), fileEvidence(ctx, /logrocket\\.identify\\s*\\(/i), 'Identify signed-in users where privacy rules allow it.'),\r\n item('privacy-scrubbing-found', 'Privacy scrubbing found', privacyScrubbingPattern.test(ctx.contentBlob), fileEvidence(ctx, privacyScrubbingPattern), 'Add repo-visible LogRocket privacy scrubbing for sensitive DOM fields or network payloads.'),\r\n manualItem('production-dashboard-checked', 'Production LogRocket privacy settings checked', 'Confirm app id, domain, privacy masking, network scrubbing, and retention in LogRocket.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeVitestTesting(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'vitest-testing',\r\n provider: 'vitest',\r\n providerLabel: 'Vitest',\r\n area: 'testing',\r\n areaLabel: 'Testing',\r\n promptSubject: 'Vitest tests',\r\n items: [\r\n item('package-installed', 'Vitest package installed', hasPackage(ctx, [/^vitest$/]), packageEvidence(ctx, [/^vitest$/]), 'Install Vitest for unit or component test coverage.'),\r\n item('test-script-found', 'Test script found', /\"test\"\\s*:\\s*\"[^\"]*(vitest|npm run|pnpm|yarn)/i.test(ctx.contentBlob), fileEvidence(ctx, /\"test\"\\s*:\\s*\"[^\"]*(vitest|npm run|pnpm|yarn)/i), 'Add a package.json test script that runs Vitest.'),\r\n item('test-files-found', 'Unit test files found', Boolean(ctx.scan.stackSignals.hasTests) || /\\.(test|spec)\\.[jt]sx?\\b/i.test(ctx.pathBlob), pathEvidence(ctx, /\\.(test|spec)\\.[jt]sx?\\b/i), 'Add unit tests for critical product logic.'),\r\n item('assertions-found', 'Assertions found', /expect\\s*\\(|assert\\s*\\(|test\\s*\\(/i.test(ctx.contentBlob), fileEvidence(ctx, /expect\\s*\\(|assert\\s*\\(|test\\s*\\(/i), 'Ensure tests include real assertions, not only smoke imports.'),\r\n manualItem('coverage-risk-reviewed', 'Critical path coverage reviewed', 'Confirm auth, billing, database, and main user flows have meaningful tests.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzePlaywrightTesting(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'playwright-testing',\r\n provider: 'playwright',\r\n providerLabel: 'Playwright',\r\n area: 'testing',\r\n areaLabel: 'Testing',\r\n promptSubject: 'Playwright tests',\r\n items: [\r\n item('package-installed', 'Playwright package installed', hasPackage(ctx, [/@playwright\\/test/]) || Boolean(ctx.scan.stackSignals.hasPlaywright), packageEvidence(ctx, [/@playwright\\/test/]), 'Install @playwright/test for browser-flow coverage.'),\r\n item('config-found', 'Playwright config found', /playwright\\.config\\.[jt]s/i.test(ctx.pathBlob), pathEvidence(ctx, /playwright\\.config\\.[jt]s/i), 'Add a Playwright config with browser and base URL settings.'),\r\n item('e2e-tests-found', 'Browser flow tests found', /(^|\\n|\\/)(e2e|tests?)\\/[^/\\n]+\\.(spec|test)\\.[jt]s/i.test(ctx.pathBlob), pathEvidence(ctx, /(^|\\/)(e2e|tests?)\\/[^/]+\\.(spec|test)\\.[jt]s/i), 'Add at least one browser test for the core signup or happy path.'),\r\n item('page-actions-found', 'Real browser actions found', /page\\.goto|page\\.click|page\\.getByRole|expect\\(page/i.test(ctx.contentBlob), fileEvidence(ctx, /page\\.goto|page\\.click|page\\.getByRole|expect\\(page/i), 'Use real browser actions and visible assertions in Playwright tests.'),\r\n manualItem('production-like-test-env-checked', 'Production-like test env checked', 'Confirm test env variables, seed data, and CI browser dependencies are ready.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeSentryErrorHandling(ctx: StackContext): StackWiringProviderSummary {\r\n const base = analyzeSentryMonitoring(ctx);\r\n return summarize({\r\n ...base,\r\n key: 'sentry-error-handling',\r\n area: 'errorHandling',\r\n areaLabel: 'Error Handling',\r\n promptSubject: 'Sentry error handling',\r\n items: [\r\n ...base.items.filter((entry) => entry.id !== 'release-config-found'),\r\n item('user-facing-fallback-found', 'User-facing error fallback found', /global-error|errorboundary|fallback|try again|toast/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /global-error|errorboundary|fallback|try again|toast/i), 'Add a user-facing fallback for production errors.'),\r\n manualItem('alert-routing-checked', 'Production alert routing checked', 'Confirm alert routing and issue ownership in Sentry.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzePostHogErrorHandling(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'posthog-error-handling',\r\n provider: 'posthog',\r\n providerLabel: 'PostHog',\r\n area: 'errorHandling',\r\n areaLabel: 'Error Handling',\r\n promptSubject: 'PostHog error events',\r\n items: [\r\n item('package-installed', 'PostHog package installed', hasPackage(ctx, [/^posthog-js$/, /^posthog-node$/]), packageEvidence(ctx, [/^posthog-js$/, /^posthog-node$/]), 'Install PostHog before using it for error or recovery events.'),\r\n item('env-names-documented', 'PostHog env names documented', /posthog_key|next_public_posthog_key/i.test(ctx.contentBlob), envEvidence(ctx, [/posthog_key/i, /next_public_posthog_key/i]), 'Document PostHog project env names.'),\r\n item('error-event-capture-found', 'Error or recovery event capture found', /posthog\\.capture\\s*\\([^)]*(error|exception|failed|recovery|retry)/i.test(ctx.contentBlob), fileEvidence(ctx, /posthog\\.capture\\s*\\([^)]*(error|exception|failed|recovery|retry)/i), 'Capture meaningful error or recovery events for product analytics.'),\r\n item('fallback-state-found', 'Fallback state found', /errorboundary|global-error|fallback|try again|retry/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /errorboundary|global-error|fallback|try again|retry/i), 'Add fallback states that users can recover from.'),\r\n manualItem('privacy-settings-checked', 'Error analytics privacy checked', 'Confirm error analytics avoid sensitive payloads and follow the product privacy policy.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeRateLimitSecurity(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'rate-limit-security',\r\n provider: 'rate-limit',\r\n providerLabel: 'Rate limiting',\r\n area: 'security',\r\n areaLabel: 'Security',\r\n promptSubject: 'rate limiting',\r\n items: [\r\n item('package-installed', 'Rate limit package installed', hasPackage(ctx, [/@upstash\\/ratelimit/, /express-rate-limit/, /rate-limiter-flexible/, /@fastify\\/rate-limit/]) || Boolean(ctx.scan.stackSignals.hasRateLimit), packageEvidence(ctx, [/@upstash\\/ratelimit/, /express-rate-limit/, /rate-limiter-flexible/, /@fastify\\/rate-limit/]), 'Install a rate-limit library appropriate for this backend.'),\r\n item('env-names-documented', 'Rate limit backing store env documented', /upstash_redis_rest_url|redis_url|rate_limit/i.test(ctx.contentBlob), envEvidence(ctx, [/upstash_redis_rest_url/i, /upstash_redis_rest_token/i, /redis_url/i]), 'Document Redis or provider env names used by rate limiting.'),\r\n item('guard-code-found', 'Rate limit guard code found', /ratelimit|rateLimit|Too many requests|429/i.test(ctx.contentBlob), fileEvidence(ctx, /ratelimit|rateLimit|Too many requests|429/i), 'Add a rate-limit guard to expensive or abusive API routes.'),\r\n item('api-route-coverage-found', 'Protected API route found', /api\\/|route\\.[jt]s/i.test(ctx.pathBlob) && /ratelimit|rateLimit|429/i.test(ctx.contentBlob), pathEvidence(ctx, /api\\/|route\\.[jt]s/i), 'Apply rate limits to public mutation, auth, AI, or checkout endpoints.'),\r\n manualItem('production-thresholds-checked', 'Production thresholds checked', 'Confirm limits, burst behavior, and allowlists match real production traffic.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeBotProtectionSecurity(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\n key: 'bot-protection-security',\r\n provider: 'bot-protection',\r\n providerLabel: 'Bot protection',\r\n area: 'security',\r\n areaLabel: 'Security',\r\n promptSubject: 'bot protection',\r\n items: [\r\n item('package-or-widget-found', 'Bot protection package or widget found', hasPackage(ctx, [/turnstile|recaptcha|hcaptcha/]) || /turnstile|recaptcha|hcaptcha|cf-turnstile/i.test(ctx.contentBlob), packageEvidence(ctx, [/turnstile|recaptcha|hcaptcha/]).concat(fileEvidence(ctx, /turnstile|recaptcha|hcaptcha|cf-turnstile/i)), 'Add Turnstile, reCAPTCHA, hCaptcha, or an equivalent bot check for exposed forms.'),\r\n item('env-names-documented', 'Bot protection env names documented', /turnstile.*(site|secret)|recaptcha.*(site|secret)|hcaptcha.*(site|secret)/i.test(ctx.contentBlob), envEvidence(ctx, [/turnstile/i, /recaptcha/i, /hcaptcha/i]), 'Document site key and secret key env names.'),\r\n item('server-verification-found', 'Server-side bot verification found', /siteverify|turnstile.*verify|recaptcha.*verify|hcaptcha.*verify/i.test(ctx.contentBlob), fileEvidence(ctx, /siteverify|turnstile.*verify|recaptcha.*verify|hcaptcha.*verify/i), 'Verify bot tokens server-side before accepting form or signup requests.'),\r\n manualItem('production-challenge-checked', 'Production challenge settings checked', 'Confirm allowed domains, challenge mode, and privacy settings in the bot-protection provider.')\r\n ]\r\n });\r\n}\r\n\r\nfunction analyzeSecretsHygiene(ctx: StackContext): StackWiringProviderSummary {\r\n const unsafePublicSecret = ctx.files.filter((file) =>\r\n isClientExecutedPath(file.normalizedPath) &&\r\n /(secret_key|api_secret|private_key|service_role|webhook_secret|password)/i.test(file.content)\r\n );\r\n return summarize({\r\n key: 'secrets-hygiene-security',\r\n provider: 'secrets-hygiene',\r\n providerLabel: 'Secrets hygiene',\r\n area: 'security',\r\n areaLabel: 'Security',\r\n promptSubject: 'secrets hygiene',\r\n items: [\r\n item('env-example-found', 'Env example or docs found', Boolean(ctx.scan.stackSignals.hasEnvExample) || /\\.env\\.example|env\\.example|environment variables/i.test(ctx.pathBlob + '\\n' + ctx.contentBlob), pathEvidence(ctx, /\\.env\\.example|env\\.example/i), 'Add an env example or setup docs with variable names only.'),\r\n item('secret-files-ignored', 'Secret files detected as private', Array.isArray(ctx.scan.secretsFound) && ctx.scan.secretsFound.length > 0, ctx.scan.secretsFound.slice(0, 4).map((path) => `secret file: ${path}`), 'Keep real .env files private and out of copied prompts or docs.'),\r\n item('frontend-secrets-clean', 'No obvious frontend secret exposure found', unsafePublicSecret.length === 0, unsafePublicSecret.slice(0, 4).map((file) => `unsafe reference: ${file.path}`), 'Move secret values and private keys out of frontend/client-executed files.'),\r\n item('gitignore-env-found', 'Env files ignored by git', /\\.gitignore/i.test(ctx.pathBlob) && /\\.env/i.test(ctx.contentBlob), pathEvidence(ctx, /\\.gitignore/i), 'Ensure .gitignore excludes real .env files while keeping .env.example committed.'),\r\n manualItem('production-secret-rotation-checked', 'Production secret rotation checked', 'Confirm production secrets can be rotated and revoked in provider dashboards.')\r\n ]\r\n });\r\n}\r\n\r\nfunction databaseSummary(\r\n ctx: StackContext,\r\n spec: {\r\n key: StackWiringKey;\r\n provider: StackWiringProviderSummary['provider'];\r\n providerLabel: string;\r\n promptSubject: string;\r\n packagePatterns: RegExp[];\r\n envPatterns: RegExp[];\r\n usagePatterns: RegExp[];\r\n manualLabel: string;\r\n manualHint: string;\r\n }\r\n): StackWiringProviderSummary {\r\n const usagePattern = new RegExp(spec.usagePatterns.map((pattern) => pattern.source).join('|'), 'i');\r\n const indexOrPerformancePattern = /create\\s+(unique\\s+)?index|\\bindex\\s*:\\s*true|@@index|\\.index\\s*\\(|\\bindexes\\b|\\bexplain\\s*\\(|connection\\s*pool|pooling|pgbouncer/i;\r\n return summarize({\r\n key: spec.key,\r\n provider: spec.provider,\r\n providerLabel: spec.providerLabel,\r\n area: 'database',\r\n areaLabel: 'Database',\r\n promptSubject: spec.promptSubject,\r\n items: [\r\n item('package-installed', `${spec.providerLabel} package installed`, hasPackage(ctx, spec.packagePatterns), packageEvidence(ctx, spec.packagePatterns), `Install the ${spec.providerLabel} package or SDK for this app.`),\r\n item('env-names-documented', `${spec.providerLabel} env names documented`, spec.envPatterns.some((pattern) => pattern.test(ctx.contentBlob)), envEvidence(ctx, spec.envPatterns), `Document ${spec.providerLabel} connection env names in an env example or setup docs.`),\r\n item('client-or-connection-found', `${spec.providerLabel} connection code found`, usagePattern.test(ctx.contentBlob), fileEvidence(ctx, usagePattern), `Add ${spec.providerLabel} connection code in a server-safe helper.`),\r\n item('query-usage-found', 'Database query usage found', /select\\s*\\(|insert\\s*\\(|update\\s*\\(|delete\\s*\\(|findOne|findMany|collection\\s*\\(|execute\\s*\\(|query\\s*\\(|sql`/i.test(ctx.contentBlob), fileEvidence(ctx, /select\\s*\\(|insert\\s*\\(|update\\s*\\(|delete\\s*\\(|findOne|findMany|collection\\s*\\(|execute\\s*\\(|query\\s*\\(|sql`/i), 'Use the database connection for real reads or writes.'),\r\n item('schema-or-model-found', 'Schema, model, or migration found', /schema|migration|model|create\\s+table|mongoose\\.schema|drizzle|prisma/i.test(ctx.contentBlob + '\\n' + ctx.pathBlob), fileEvidence(ctx, /schema|migration|model|create\\s+table|mongoose\\.schema|drizzle|prisma/i), 'Keep schema, models, or migrations reproducible in the repo.'),\r\n item('index-or-performance-evidence', 'Index or performance evidence found', indexOrPerformancePattern.test(ctx.contentBlob), fileEvidence(ctx, indexOrPerformancePattern), 'Add repo-visible indexes, query plans, connection pooling, or equivalent performance evidence for production database access.'),\r\n manualItem('production-dashboard-checked', spec.manualLabel, spec.manualHint)\r\n ]\r\n });\r\n}\r\n\r\nfunction deploymentSummary(\r\n ctx: StackContext,\r\n spec: {\r\n key: StackWiringKey;\r\n provider: StackWiringProviderSummary['provider'];\r\n providerLabel: string;\r\n promptSubject: string;\r\n packagePatterns: RegExp[];\r\n configPatterns: RegExp[];\r\n envPatterns: RegExp[];\r\n manualLabel: string;\r\n manualHint: string;\r\n }\r\n): StackWiringProviderSummary {\r\n const configPattern = new RegExp(spec.configPatterns.map((pattern) => pattern.source).join('|'), 'i');\r\n return summarize({\r\n key: spec.key,\r\n provider: spec.provider,\r\n providerLabel: spec.providerLabel,\r\n area: 'deployment',\r\n areaLabel: 'Deployment',\r\n promptSubject: spec.promptSubject,\r\n items: [\r\n item('package-or-config-found', `${spec.providerLabel} package or config found`, hasPackage(ctx, spec.packagePatterns) || configPattern.test(ctx.pathBlob), packageEvidence(ctx, spec.packagePatterns).concat(pathEvidence(ctx, configPattern)), `Add ${spec.providerLabel} config when this project needs provider-specific deployment behavior.`),\r\n item('build-script-found', 'Production build script found', /\"build\"\\s*:\\s*\"[^\"]+\"/i.test(ctx.contentBlob), fileEvidence(ctx, /\"build\"\\s*:\\s*\"[^\"]+\"/i), 'Add a package.json build script for production deploys.'),\r\n item('env-names-documented', 'Deployment env names documented', spec.envPatterns.some((pattern) => pattern.test(ctx.contentBlob)) || /\\.env\\.example|environment variables/i.test(ctx.pathBlob + '\\n' + ctx.contentBlob), envEvidence(ctx, spec.envPatterns).concat(pathEvidence(ctx, /\\.env\\.example/i)), 'Document production env variable names needed by deployment.'),\r\n item('ci-or-deploy-doc-found', 'CI or deploy docs found', /\\.github\\/workflows|deploy|deployment|preview/i.test(ctx.pathBlob + '\\n' + ctx.contentBlob), pathEvidence(ctx, /\\.github\\/workflows/i).concat(fileEvidence(ctx, /deploy|deployment|preview/i)), 'Document or automate deployment and preview checks.'),\r\n manualItem('production-dashboard-checked', spec.manualLabel, spec.manualHint)\r\n ]\r\n });\r\n}\r\n\r\nfunction buildContext(scan: ScanResult): StackContext {\r\n const files = visibleFiles(scan);\r\n return {\r\n scan,\r\n files,\r\n deps: scan.packageDeps.map((dep) => dep.toLowerCase()),\r\n pathBlob: `${scan.fileTree}\\n${scan.files.map((file) => file.path).join('\\n')}`.replace(/\\\\/g, '/').toLowerCase(),\r\n contentBlob: files.map((file) => file.lowerContent).join('\\n')\r\n };\r\n}\r\n\r\nfunction visibleFiles(scan: ScanResult): VisibleFile[] {\r\n return scan.files\r\n .filter((file: ScannedFile) => !file.isSecret && typeof file.content === 'string')\r\n .map((file) => ({\r\n path: file.path.replace(/\\\\/g, '/'),\r\n normalizedPath: file.path.replace(/\\\\/g, '/').toLowerCase(),\r\n content: file.content as string,\r\n lowerContent: (file.content as string).toLowerCase()\r\n }));\r\n}\r\n\r\nfunction summarize(summary: Omit<StackWiringProviderSummary, 'passedCount' | 'totalCount' | 'readinessPercent'>): StackWiringProviderSummary {\r\n const repoItems = summary.items.filter((entry) => entry.status !== 'manual');\r\n const passedCount = repoItems.filter((entry) => entry.status === 'passed').length;\r\n const totalCount = repoItems.length;\r\n return {\r\n ...summary,\r\n passedCount,\r\n totalCount,\r\n readinessPercent: Math.round((passedCount / Math.max(totalCount, 1)) * 100)\r\n };\r\n}\r\n\r\nfunction item(id: string, label: string, passed: boolean, evidence: string[], promptHint: string): StackWiringItem {\r\n return {\r\n id,\r\n label,\r\n status: passed ? 'passed' : 'missing',\r\n evidence,\r\n promptHint\r\n };\r\n}\r\n\r\nfunction manualItem(id: string, label: string, promptHint: string): StackWiringItem {\r\n return {\r\n id,\r\n label,\r\n status: 'manual',\r\n evidence: [],\r\n promptHint\r\n };\r\n}\r\n\r\nfunction secretSafetyItem(ctx: StackContext, id: string, label: string, pattern: RegExp, promptHint: string): StackWiringItem {\r\n const exposed = ctx.files.filter((file) => isClientExecutedPath(file.normalizedPath) && pattern.test(file.content));\r\n return {\r\n id,\r\n label,\r\n status: exposed.length > 0 ? 'missing' : 'passed',\r\n evidence: exposed.slice(0, 4).map((file) => `unsafe reference: ${file.path}`),\r\n promptHint\r\n };\r\n}\r\n\r\nfunction hasPackage(ctx: StackContext, patterns: RegExp[]): boolean {\r\n return ctx.deps.some((dep) => patterns.some((pattern) => pattern.test(dep)));\r\n}\r\n\r\nfunction hasAllContent(ctx: StackContext, patterns: RegExp[]): boolean {\r\n return patterns.every((pattern) => pattern.test(ctx.contentBlob));\r\n}\r\n\r\nfunction packageEvidence(ctx: StackContext, patterns: RegExp[]): string[] {\r\n return ctx.deps\r\n .filter((dep) => patterns.some((pattern) => pattern.test(dep)))\r\n .slice(0, 4)\r\n .map((dep) => `package: ${dep}`);\r\n}\r\n\r\nfunction envEvidence(ctx: StackContext, patterns: RegExp[]): string[] {\r\n const evidence: string[] = [];\r\n for (const pattern of patterns) {\r\n if (pattern.test(ctx.contentBlob)) {\r\n evidence.push(`env: ${pattern.source.replace(/\\\\b|\\(|\\)|\\?|\\||\\^|\\$|_/g, ' ').trim().toUpperCase().replace(/\\s+/g, '_')}`);\r\n }\r\n }\r\n return evidence.slice(0, 4);\r\n}\r\n\r\nfunction pathEvidence(ctx: StackContext, pattern: RegExp): string[] {\r\n return ctx.pathBlob\r\n .split(/\\r?\\n/)\r\n .filter((path) => pattern.test(path))\r\n .slice(0, 4)\r\n .map((path) => `file: ${path}`);\r\n}\r\n\r\nfunction fileEvidence(ctx: StackContext, pattern: RegExp): string[] {\r\n return ctx.files\r\n .filter((file) => pattern.test(file.path) || pattern.test(file.content))\r\n .slice(0, 4)\r\n .map((file) => `file: ${file.path}`);\r\n}\r\n\r\nfunction isClientExecutedPath(path: string): boolean {\r\n return /\\.(tsx|jsx)$/.test(path) ||\r\n /(^|\\/)(components|pages|app|client|frontend|web)\\//.test(path) ||\r\n /\\.client\\.[jt]sx?$/.test(path);\r\n}\r\n\r\nfunction formatEvidence(evidence: string[]): string {\r\n return evidence.length > 0 ? ` (${evidence.slice(0, 3).join('; ')})` : '';\r\n}\r\n", "import type {\r\n ProductionConnectionSummary,\r\n ScanResult,\r\n VerificationArea,\r\n VerificationAreaSummary,\r\n VerificationItem,\r\n VerificationItemStatus,\r\n VerificationSummary\r\n} from './types';\r\n\r\ntype ProductionConnectionSummaryPayload = {\r\n byArea: Partial<Record<string, ProductionConnectionSummary>>;\r\n items: ProductionConnectionSummary[];\r\n stackRow: ProductionConnectionSummary[];\r\n};\r\n\r\ntype VerificationContext = {\n deps: Set<string>;\n paths: Set<string>;\n contents: string;\n secretPaths: Set<string>;\n scan: ScanResult;\n};\n\nconst PROVIDER_LABELS: Record<string, string> = {\n supabase: 'Supabase',\n clerk: 'Clerk',\n authjs: 'Auth.js',\n neon: 'Neon',\n planetscale: 'PlanetScale',\n mongodb: 'MongoDB',\n turso: 'Turso',\n stripe: 'Stripe',\n paddle: 'Paddle',\n vercel: 'Vercel',\n sentry: 'Sentry',\n posthog: 'PostHog',\n logrocket: 'LogRocket',\n 'rate-limit': 'Rate limit',\n 'bot-protection': 'Bot protection',\n 'secrets-hygiene': 'Secrets hygiene'\n};\n\nconst AREAS: VerificationArea[] = [\n 'auth',\r\n 'database',\r\n 'payments',\r\n 'deployment',\r\n 'monitoring',\r\n 'security',\r\n 'testing',\r\n 'landing',\r\n 'frontend',\r\n 'backend',\r\n 'appFlow',\r\n 'errorHandling'\r\n];\r\n\r\nconst CONTENT_CAP = 500_000;\r\n\r\nexport function buildVerificationSummary(\n scan: ScanResult,\n productionConnections: ProductionConnectionSummaryPayload\n): VerificationSummary {\n const ctx = buildContext(scan);\n const byArea: VerificationSummary['byArea'] = {};\n\r\n for (const area of AREAS) {\r\n byArea[area] = emptyArea(area);\r\n }\r\n\r\n applyAuthRules(byArea.auth!, ctx);\r\n applyDatabaseRules(byArea.database!, ctx);\r\n applyPaymentRules(byArea.payments!, ctx);\r\n applyDeploymentRules(byArea.deployment!, ctx);\r\n applyMonitoringRules(byArea.monitoring!, ctx);\r\n applySecurityRules(byArea.security!, ctx);\r\n applyTestingRules(byArea.testing!, ctx);\r\n applyLandingRules(byArea.landing!, ctx);\r\n applyFrontendRules(byArea.frontend!, ctx);\r\n applyBackendRules(byArea.backend!, ctx);\n applyAppFlowRules(byArea.appFlow!, ctx);\n applyErrorHandlingRules(byArea.errorHandling!, ctx);\n applyProductionConnectionEvidence(byArea, productionConnections);\n\n return { byArea };\n}\n\nexport function buildVerificationEvidenceContext(summary: VerificationSummary): string {\n const lines: string[] = [];\n for (const area of AREAS) {\n const areaSummary = summary.byArea[area];\n if (!areaSummary) {\n continue;\n }\n const found = areaSummary.found.slice(0, 6).map(formatVerificationContextItem);\n const missing = areaSummary.missing.slice(0, 6).map(formatVerificationContextItem);\n if (found.length > 0) {\n lines.push(`${area} found: ${found.join(' | ')}`);\n }\n if (missing.length > 0) {\n lines.push(`${area} missing: ${missing.join(' | ')}`);\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction formatVerificationContextItem(item: VerificationItem): string {\n return item.detail ? `${item.label} (${item.detail})` : item.label;\n}\n\r\nfunction buildContext(scan: ScanResult): VerificationContext {\r\n const deps = new Set(scan.packageDeps.map((dep) => dep.toLowerCase()));\r\n const paths = new Set<string>();\r\n const secretPaths = new Set<string>();\r\n const contentParts: string[] = [];\r\n let contentLength = 0;\r\n\r\n for (const line of scan.fileTree.split(/\\r?\\n/)) {\r\n const normalized = normalizePath(line);\r\n if (normalized) {\r\n paths.add(normalized);\r\n }\r\n }\r\n\r\n for (const file of scan.files) {\r\n if (!file.isSecret) {\r\n const normalized = normalizePath(file.path);\r\n if (normalized) {\r\n paths.add(normalized);\r\n }\r\n }\r\n\r\n if (!file.isSecret && file.content) {\r\n const next = file.content.toLowerCase();\r\n const remaining = CONTENT_CAP - contentLength;\r\n if (remaining > 0) {\r\n contentParts.push(next.slice(0, remaining));\r\n contentLength += Math.min(next.length, remaining);\r\n }\r\n }\r\n }\r\n\r\n for (const secretPath of scan.secretsFound) {\r\n const normalized = normalizePath(secretPath);\r\n if (normalized) {\r\n secretPaths.add(normalized);\r\n }\r\n }\r\n\r\n return {\r\n deps,\r\n paths,\r\n contents: contentParts.join('\\n'),\r\n secretPaths,\r\n scan\r\n };\r\n}\r\n\r\nfunction emptyArea(area: VerificationArea): VerificationAreaSummary {\r\n return {\r\n area,\r\n found: [],\r\n missing: [],\r\n manual: []\r\n };\r\n}\r\n\r\nfunction normalizePath(path: string): string {\r\n return path\r\n .replace(/\\\\/g, '/')\r\n .replace(/^[\\s\\u2500\\u2502\\u2514\\u251c>*+-]+/u, '')\r\n .trim()\r\n .toLowerCase();\r\n}\r\n\r\nfunction addFound(area: VerificationAreaSummary, label: string, source: string, detail?: string): void {\r\n addItem(area, 'found', label, source, detail);\r\n}\r\n\r\nfunction addMissing(area: VerificationAreaSummary, label: string, source: string, detail?: string): void {\r\n addItem(area, 'missing', label, source, detail);\r\n}\r\n\r\nfunction addManual(area: VerificationAreaSummary, label: string, source: string, detail?: string): void {\r\n addItem(area, 'manual', label, source, detail);\r\n}\r\n\r\nfunction addItem(\r\n area: VerificationAreaSummary,\r\n status: VerificationItemStatus,\r\n label: string,\r\n source: string,\r\n detail?: string\r\n): void {\r\n const item = compactItem(label, status, source, detail);\r\n const bucket = area[status];\r\n if (!bucket.some((existing) => existing.label === item.label)) {\r\n bucket.push(item);\r\n }\r\n}\r\n\r\nfunction compactItem(\r\n label: string,\r\n status: VerificationItemStatus,\r\n source: string,\r\n detail?: string\r\n): VerificationItem {\r\n return detail ? { label, status, source, detail } : { label, status, source };\r\n}\r\n\r\nfunction hasDep(ctx: VerificationContext, patterns: string[]): boolean {\r\n return patterns.some((pattern) => {\r\n const normalized = pattern.toLowerCase();\r\n return [...ctx.deps].some((dep) => dep === normalized || dep.includes(normalized));\r\n });\r\n}\r\n\r\nfunction hasPath(ctx: VerificationContext, patterns: RegExp[]): boolean {\r\n return [...ctx.paths].some((path) => !ctx.secretPaths.has(path) && patterns.some((pattern) => pattern.test(path)));\r\n}\r\n\r\nfunction hasContent(ctx: VerificationContext, patterns: RegExp[]): boolean {\r\n return patterns.some((pattern) => pattern.test(ctx.contents));\r\n}\r\n\r\nfunction hasEnvName(ctx: VerificationContext, names: string[]): boolean {\r\n return names.some((name) => ctx.contents.includes(name.toLowerCase()));\r\n}\r\n\r\nfunction applyAuthRules(area: VerificationAreaSummary, ctx: VerificationContext): void {\r\n if (hasDep(ctx, ['@clerk/nextjs', 'clerk'])) {\r\n addFound(area, 'Clerk dependency found', 'package.json dependencies');\r\n } else if (hasDep(ctx, ['next-auth', '@auth/core', '@auth/nextjs'])) {\r\n addFound(area, 'Auth.js dependency found', 'package.json dependencies');\r\n } else if (hasDep(ctx, ['@supabase/supabase-js', '@supabase/auth-helpers-nextjs', '@supabase/ssr'])) {\r\n addFound(area, 'Supabase auth dependency found', 'package.json dependencies');\r\n } else {\r\n addMissing(area, 'Auth dependency missing', 'package.json dependencies');\r\n }\r\n\r\n if (\r\n hasPath(ctx, [/^middleware\\.[jt]sx?$/, /\\/middleware\\.[jt]sx?$/]) ||\r\n hasContent(ctx, [/clerkmiddleware\\s*\\(/, /withauth\\s*\\(/, /authmiddleware\\s*\\(/])\r\n ) {\r\n addFound(area, 'Auth middleware found', 'middleware file or auth middleware call');\r\n } else {\r\n addMissing(area, 'Auth middleware missing', 'middleware file or auth middleware call');\r\n }\r\n\r\n if (\r\n hasEnvName(ctx, [\r\n 'NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY',\r\n 'CLERK_SECRET_KEY',\r\n 'NEXTAUTH_SECRET',\r\n 'AUTH_SECRET',\r\n 'SUPABASE_SERVICE_ROLE_KEY',\r\n 'NEXT_PUBLIC_SUPABASE_ANON_KEY'\r\n ])\r\n ) {\r\n addFound(area, 'Auth env names listed', 'non-secret scanned content');\r\n } else {\r\n addMissing(area, 'Auth env names missing', 'non-secret scanned content');\r\n }\r\n\r\n addManual(area, 'Provider dashboard settings', 'external provider dashboard');\r\n addManual(area, 'Real production auth keys', 'external provider dashboard');\r\n}\r\n\r\nfunction applyDatabaseRules(area: VerificationAreaSummary, ctx: VerificationContext): void {\n if (hasDep(ctx, ['prisma', 'drizzle-orm', '@supabase/supabase-js', 'mongoose', 'mongodb', '@neondatabase/serverless'])) {\n addFound(area, 'Database dependency found', 'package.json dependencies');\n } else {\r\n addMissing(area, 'Database dependency missing', 'package.json dependencies');\r\n }\r\n\r\n if (hasPath(ctx, [/prisma\\/schema\\.prisma$/, /migrations?\\//, /drizzle\\//, /schema\\.(ts|js|sql)$/])) {\n addFound(area, 'Schema or migration file found', 'repo paths');\n } else {\n addMissing(area, 'Schema or migration file missing', 'repo paths');\n }\n\n if (\n hasContent(ctx, [\n /prisma\\.[a-z0-9_]+\\.(find|create|update|delete|upsert|aggregate)/i,\n /\\bdb\\.(select|insert|update|delete|query)\\s*\\(/i,\n /\\bmongoose\\.model\\s*\\(/i,\n /\\bnew\\s+mongoclient\\s*\\(/i,\n /\\bcreateclient\\s*\\([^)]*supabase/i,\n /\\.from\\s*\\(\\s*['\"][a-z0-9_]+['\"]\\s*\\)/i\n ])\n ) {\n addFound(area, 'Database query usage found', 'repo evidence');\n }\n\n if (ctx.scan.stackSignals.hasSupabase || hasDep(ctx, ['@supabase/supabase-js', '@supabase/ssr'])) {\n if (\n hasPath(ctx, [/supabase\\/migrations\\/.*\\.sql$/, /\\/policies\\//, /rls/i]) ||\n hasContent(ctx, [/enable\\s+row\\s+level\\s+security/i, /create\\s+policy/i, /alter\\s+table[\\s\\S]{0,200}enable\\s+row\\s+level/i])\n ) {\n addFound(area, 'Supabase RLS policy evidence found', 'repo evidence');\n } else {\n addMissing(area, 'Supabase RLS policy evidence missing', 'repo evidence');\n }\n }\n\n if (\n hasEnvName(ctx, [\n 'DATABASE_URL',\n 'POSTGRES_URL',\n 'SUPABASE_URL',\n 'NEXT_PUBLIC_SUPABASE_URL',\n 'NEON_DATABASE_URL',\n 'PLANETSCALE_DATABASE_URL',\n 'MONGODB_URI',\n 'MONGODB_URL',\n 'TURSO_DATABASE_URL',\n 'TURSO_AUTH_TOKEN'\n ])\r\n ) {\r\n addFound(area, 'Database env names listed', 'non-secret scanned content');\r\n } else {\r\n addMissing(area, 'Database env names missing', 'non-secret scanned content');\r\n }\r\n\r\n addManual(area, 'Hosted DB project settings', 'external database dashboard');\r\n addManual(area, 'Production access policy', 'external database dashboard');\r\n}\r\n\r\nfunction applyPaymentRules(area: VerificationAreaSummary, ctx: VerificationContext): void {\r\n if (hasDep(ctx, ['stripe'])) {\r\n addFound(area, 'Stripe dependency found', 'package.json dependencies');\r\n } else if (hasDep(ctx, ['@paddle/paddle-js', 'paddle'])) {\r\n addFound(area, 'Paddle dependency found', 'package.json dependencies');\r\n } else {\r\n addMissing(area, 'Payment dependency missing', 'package.json dependencies');\r\n }\r\n\r\n if (\r\n hasPath(ctx, [\r\n /stripe\\/.*webhook/,\r\n /webhook.*stripe/,\r\n /paddle\\/.*webhook/,\r\n /webhook.*paddle/,\r\n /stripe\\/route\\.[jt]s$/,\r\n /paddle\\/route\\.[jt]s$/\r\n ]) ||\r\n hasContent(ctx, [/stripe[^.\\n]*webhook/, /webhook[^.\\n]*stripe/, /paddle[^.\\n]*webhook/, /webhook[^.\\n]*paddle/, /constructevent\\s*\\(/])\r\n ) {\r\n addFound(area, 'Payment webhook route found', 'repo paths or webhook handler code');\r\n } else {\r\n addMissing(area, 'Payment webhook route missing', 'repo paths or webhook handler code');\r\n }\r\n\r\n if (\r\n hasPath(ctx, [\r\n /checkout/,\r\n /billing/,\r\n /stripe\\/.*session/,\r\n /session.*stripe/,\r\n /paddle\\/.*session/,\r\n /session.*paddle/\r\n ]) ||\r\n hasContent(ctx, [/checkout\\.sessions\\.create\\s*\\(/, /createcheckoutsession/, /billing_portal/])\r\n ) {\r\n addFound(area, 'Checkout/session route found', 'repo paths or checkout code');\r\n } else {\r\n addMissing(area, 'Checkout/session route missing', 'repo paths or checkout code');\r\n }\r\n\r\n if (\r\n hasEnvName(ctx, [\r\n 'STRIPE_SECRET_KEY',\r\n 'STRIPE_WEBHOOK_SECRET',\r\n 'NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY',\r\n 'PADDLE_API_KEY',\r\n 'PADDLE_WEBHOOK_SECRET',\r\n 'NEXT_PUBLIC_PADDLE_CLIENT_TOKEN'\r\n ])\r\n ) {\r\n addFound(area, 'Payment env names listed', 'non-secret scanned content');\r\n } else {\r\n addMissing(area, 'Payment env names missing', 'non-secret scanned content');\r\n }\r\n\r\n addManual(area, 'Provider dashboard configuration', 'external payment dashboard');\r\n addManual(area, 'Webhook endpoint registered with provider', 'external payment dashboard');\r\n}\r\n\r\nfunction applyDeploymentRules(area: VerificationAreaSummary, ctx: VerificationContext): void {\n if (hasPath(ctx, [/vercel\\.json$/, /netlify\\.toml$/, /render\\.ya?ml$/, /dockerfile$/, /docker-compose\\.ya?ml$/])) {\n addFound(area, 'Deployment config found', 'repo paths');\n } else {\r\n addMissing(area, 'Deployment config missing', 'repo paths');\r\n }\r\n\r\n if (hasContent(ctx, [/\"build\"\\s*:/])) {\n addFound(area, 'Build script found', 'package scripts');\n } else {\n addMissing(area, 'Build script missing', 'package scripts');\n }\n\n if (ctx.scan.stackSignals.hasCI || hasPath(ctx, [/(^|\\/)\\.github\\/workflows\\/[^/]+\\.ya?ml$/, /(^|\\/)\\.gitlab-ci\\.yml$/, /(^|\\/)circle\\.yml$/])) {\n addFound(area, 'CI config found', 'repo paths');\n } else {\n addMissing(area, 'CI config missing', 'repo paths');\n }\n\n addManual(area, 'Hosting environment variables checked', 'hosting dashboard');\n addManual(area, 'DNS and production domain checked', 'hosting dashboard');\n}\r\n\r\nfunction applyMonitoringRules(area: VerificationAreaSummary, ctx: VerificationContext): void {\r\n if (hasDep(ctx, ['@sentry/nextjs', '@sentry/node', 'posthog-js', 'logrocket'])) {\r\n addFound(area, 'Monitoring dependency found', 'package.json dependencies');\r\n } else {\r\n addMissing(area, 'Monitoring dependency missing', 'package.json dependencies');\r\n }\r\n\r\n if (hasContent(ctx, [/sentry\\.init\\s*\\(/, /posthog\\.init\\s*\\(/, /logrocket\\.init\\s*\\(/])) {\r\n addFound(area, 'Monitoring SDK init found', 'non-secret scanned content');\r\n } else {\r\n addMissing(area, 'Monitoring SDK init missing', 'non-secret scanned content');\r\n }\r\n\r\n if (hasEnvName(ctx, ['SENTRY_DSN', 'NEXT_PUBLIC_SENTRY_DSN', 'NEXT_PUBLIC_POSTHOG_KEY', 'LOGROCKET_APP_ID'])) {\r\n addFound(area, 'Monitoring env names listed', 'non-secret scanned content');\r\n } else {\r\n addMissing(area, 'Monitoring env names missing', 'non-secret scanned content');\r\n }\r\n\r\n addManual(area, 'Dashboard receiving events', 'external monitoring dashboard');\r\n}\r\n\r\nfunction applySecurityRules(area: VerificationAreaSummary, ctx: VerificationContext): void {\r\n if (ctx.scan.stackSignals.hasRateLimit || hasDep(ctx, ['@upstash/ratelimit']) || hasContent(ctx, [/ratelimit/, /rate limit/])) {\r\n addFound(area, 'Rate limit evidence found', 'repo evidence');\r\n } else {\r\n addMissing(area, 'Rate limit evidence missing', 'repo evidence');\r\n }\r\n\r\n if (hasContent(ctx, [/bot protection/, /turnstile/, /recaptcha/, /hcaptcha/]) || hasDep(ctx, ['@marsidev/react-turnstile'])) {\r\n addFound(area, 'Bot protection evidence found', 'repo evidence');\r\n } else {\r\n addMissing(area, 'Bot protection evidence missing', 'repo evidence');\r\n }\r\n\r\n if (ctx.scan.stackSignals.hasEnvExample || hasPath(ctx, [/\\.env\\.example$/, /\\.env\\.sample$/, /example\\.env$/])) {\r\n addFound(area, '.env.example found', 'repo paths');\r\n } else {\r\n addMissing(area, '.env.example missing', 'repo paths');\r\n }\r\n\r\n if (ctx.secretPaths.size > 0) {\r\n addFound(area, 'Secret-like files excluded from scan content', 'secret filename list');\r\n }\r\n\r\n addManual(area, 'WAF and abuse controls', 'hosting or security dashboard');\r\n addManual(area, 'Real secret rotation', 'production secret manager');\r\n}\r\n\r\nfunction applyTestingRules(area: VerificationAreaSummary, ctx: VerificationContext): void {\n if (hasDep(ctx, ['vitest', 'jest', '@playwright/test', 'cypress', 'mocha']) || hasContent(ctx, [/\"test\"\\s*:/])) {\n addFound(area, 'Test tooling found', 'package.json dependencies or scripts');\n } else {\n addMissing(area, 'Test tooling missing', 'package.json dependencies or scripts');\n }\n\n if (hasDep(ctx, ['@playwright/test']) || hasPath(ctx, [/playwright\\.config\\.[jt]s$/])) {\n addFound(area, 'Playwright dependency found', 'package.json dependencies or config');\n }\n\n if (ctx.scan.stackSignals.hasTests || hasPath(ctx, [/\\.test\\.[jt]sx?$/, /\\.spec\\.[jt]sx?$/, /__tests__\\//])) {\n addFound(area, 'Test files found', 'repo paths');\n } else {\n addMissing(area, 'Test files missing', 'repo paths');\n }\n\n if (hasDep(ctx, ['@playwright/test']) && hasPath(ctx, [/\\.spec\\.[jt]sx?$/, /e2e\\//, /tests?\\//])) {\n addFound(area, 'End-to-end test files found', 'repo paths');\n }\n\n if (ctx.scan.stackSignals.hasCI || hasPath(ctx, [/(^|\\/)\\.github\\/workflows\\/[^/]+\\.ya?ml$/, /(^|\\/)\\.gitlab-ci\\.yml$/, /(^|\\/)circle\\.yml$/])) {\n addFound(area, 'CI workflow found', 'repo paths');\n }\n\n addManual(area, 'CI status', 'CI provider dashboard');\n}\n\r\nfunction applyLandingRules(area: VerificationAreaSummary, ctx: VerificationContext): void {\r\n if (\r\n ctx.scan.stackSignals.hasLanding ||\r\n hasPath(ctx, [/app\\/page\\.[jt]sx?$/, /pages\\/index\\.[jt]sx?$/, /landing\\//, /home\\.[jt]sx?$/])\r\n ) {\r\n addFound(area, 'Landing page found', 'repo paths');\r\n } else {\r\n addMissing(area, 'Landing page missing', 'repo paths');\r\n }\r\n\r\n if (hasPath(ctx, [/pricing/, /account/, /onboarding/])) {\r\n addFound(area, 'Pricing/account/onboarding path found', 'repo paths');\r\n } else {\r\n addMissing(area, 'Pricing/account/onboarding path missing', 'repo paths');\r\n }\r\n\r\n if (hasContent(ctx, [/analytics/, /posthog/, /gtag\\(/, /plausible/])) {\n addFound(area, 'Funnel or analytics evidence found', 'non-secret scanned content');\n } else {\n addMissing(area, 'Funnel or analytics evidence missing', 'non-secret scanned content');\n }\n\n if (ctx.scan.stackSignals.hasRobots && ctx.scan.stackSignals.hasSitemap) {\n addFound(area, 'SEO crawl files found', 'repo paths');\n } else {\n addMissing(area, 'SEO crawl files missing', 'repo paths');\n }\n\n addManual(area, 'Conversion quality', 'manual product review');\n}\n\r\nfunction applyFrontendRules(area: VerificationAreaSummary, ctx: VerificationContext): void {\r\n if (hasDep(ctx, ['react', 'vue', 'svelte', '@angular/core']) || hasPath(ctx, [/src\\/.*\\.[jt]sx$/, /app\\/.*\\.[jt]sx$/])) {\r\n addFound(area, 'Frontend framework evidence found', 'repo evidence');\r\n } else {\r\n addMissing(area, 'Frontend framework evidence missing', 'repo evidence');\r\n }\r\n\r\n if (ctx.scan.stackSignals.hasLoadingStates || hasPath(ctx, [/loading\\.[jt]sx?$/]) || hasContent(ctx, [/loading/i])) {\r\n addFound(area, 'Loading state evidence found', 'repo evidence');\r\n } else {\r\n addMissing(area, 'Loading state evidence missing', 'repo evidence');\r\n }\r\n\r\n addManual(area, 'Responsive UX review', 'manual product review');\r\n}\r\n\r\nfunction applyBackendRules(area: VerificationAreaSummary, ctx: VerificationContext): void {\n if (hasPath(ctx, [/api\\//, /route\\.[jt]s$/, /server\\.[jt]s$/, /controllers?\\//])) {\r\n addFound(area, 'Backend route evidence found', 'repo paths');\r\n } else {\r\n addMissing(area, 'Backend route evidence missing', 'repo paths');\r\n }\r\n\r\n if (\n hasDep(ctx, ['zod', 'joi', 'yup', 'valibot', '@sinclair/typebox', 'class-validator']) ||\n hasContent(ctx, [\n /\\bzod\\b/,\n /\\bjoi\\b/,\n /\\byup\\b/,\n /\\bvalibot\\b/,\n /from\\s+['\"]joi['\"]/,\n /require\\s*\\(\\s*['\"]joi['\"]\\s*\\)/,\n /\\.safeparse\\s*\\(/,\n /\\.parse\\s*\\(/,\n /request validation/\n ])\n ) {\n addFound(area, 'Input validation evidence found', 'non-secret scanned content');\r\n } else {\r\n addMissing(area, 'Input validation evidence missing', 'non-secret scanned content');\r\n }\r\n\r\n addManual(area, 'Production data behavior reviewed', 'manual product review');\r\n}\r\n\r\nfunction applyAppFlowRules(area: VerificationAreaSummary, ctx: VerificationContext): void {\r\n if (hasPath(ctx, [/onboarding/, /dashboard/, /account/, /settings/])) {\r\n addFound(area, 'Core app flow paths found', 'repo paths');\r\n } else {\r\n addMissing(area, 'Core app flow paths missing', 'repo paths');\r\n }\r\n\r\n if (hasContent(ctx, [/redirect\\(/, /router\\.push/, /navigate\\(/])) {\r\n addFound(area, 'Navigation flow evidence found', 'non-secret scanned content');\r\n } else {\r\n addMissing(area, 'Navigation flow evidence missing', 'non-secret scanned content');\r\n }\r\n\r\n addManual(area, 'End-to-end user journey checked', 'manual product review');\r\n}\r\n\r\nfunction applyErrorHandlingRules(area: VerificationAreaSummary, ctx: VerificationContext): void {\n if (\n ctx.scan.stackSignals.hasErrorBoundary ||\n hasPath(ctx, [/error\\.[jt]sx?$/, /error-boundary/i, /errorboundary/i]) ||\n hasContent(ctx, [/componentdidcatch/i, /\\berrorboundary\\b/i, /react\\.component/i])\n ) {\n addFound(area, 'Error boundary evidence found', 'repo evidence');\n } else {\n addMissing(area, 'Error boundary evidence missing', 'repo evidence');\r\n }\r\n\r\n if (hasContent(ctx, [/try\\s*{/, /\\.catch\\s*\\(/, /throw new error/])) {\r\n addFound(area, 'Runtime error handling evidence found', 'non-secret scanned content');\r\n } else {\r\n addMissing(area, 'Runtime error handling evidence missing', 'non-secret scanned content');\r\n }\r\n\n addManual(area, 'Production failure paths reviewed', 'manual product review');\n}\n\nfunction applyProductionConnectionEvidence(\n byArea: VerificationSummary['byArea'],\n productionConnections: ProductionConnectionSummaryPayload\n): void {\n const summaries = collectProductionConnectionSummaries(productionConnections);\n\n for (const summary of summaries) {\n if (!summary || summary.source !== 'detected' || !summary.provider) {\n continue;\n }\n\n const area = byArea[summary.area as VerificationArea];\n if (!area) {\n continue;\n }\n\n const provider = providerLabel(summary.provider);\n const detail = summary.signals.length > 0 ? summary.signals.slice(0, 4).join('; ') : undefined;\n addFound(area, `${provider} detected by scanner`, 'production connection scanner', detail);\n\n if (summary.status.includes('needs-env')) {\n addMissing(area, `${provider} env evidence missing`, 'production connection scanner');\n }\n if (summary.status.includes('needs-webhook')) {\n addMissing(area, `${provider} webhook evidence missing`, 'production connection scanner');\n }\n }\n}\n\nfunction collectProductionConnectionSummaries(\n productionConnections: ProductionConnectionSummaryPayload\n): ProductionConnectionSummary[] {\n const seen = new Set<string>();\n const summaries: ProductionConnectionSummary[] = [];\n\n function add(summary: ProductionConnectionSummary | undefined): void {\n if (!summary || !summary.provider) {\n return;\n }\n const key = `${summary.area}:${summary.provider}:${summary.source}`;\n if (seen.has(key)) {\n return;\n }\n seen.add(key);\n summaries.push(summary);\n }\n\n for (const summary of Object.values(productionConnections.byArea)) {\n add(summary);\n }\n for (const summary of productionConnections.items) {\n add(summary);\n }\n for (const summary of productionConnections.stackRow) {\n add(summary);\n }\n\n return summaries;\n}\n\nfunction providerLabel(provider: string): string {\n return PROVIDER_LABELS[provider] ?? provider.replace(/(^|-)([a-z])/g, (_: string, prefix: string, letter: string) =>\n `${prefix === '-' ? ' ' : ''}${letter.toUpperCase()}`\n );\n}\n", "import type { McpVerifierStateSnapshot } from '../../types';\r\nimport type { ProviderConnectionState, VerificationProviderId, VerificationResultStatus } from '../types';\r\n\r\nconst MCP_PROVIDER_MAP: Partial<Record<VerificationProviderId, string>> = {\n vercel: 'vercel',\n supabase: 'supabase',\n stripe: 'stripe',\n github: 'github'\n};\n\r\nexport function resolveProviderConnectionState(\r\n provider: VerificationProviderId,\r\n mcpVerifierState: McpVerifierStateSnapshot | undefined\r\n): ProviderConnectionState {\r\n const registryProvider = MCP_PROVIDER_MAP[provider];\r\n if (!registryProvider || !mcpVerifierState) {\r\n return 'unknown_runtime';\r\n }\r\n\r\n const record = mcpVerifierState.records.find((entry) => entry.provider === registryProvider);\r\n if (!record) {\r\n return 'unknown_runtime';\r\n }\r\n\r\n switch (record.status) {\r\n case 'configured':\r\n return 'configured';\r\n case 'missing':\r\n return 'not_configured';\r\n case 'unsupported':\r\n return 'unsupported';\r\n case 'stale':\r\n return 'configured';\r\n default:\r\n return 'unknown_runtime';\r\n }\r\n}\r\n\r\nexport function providerResultStatus(input: {\r\n connectionState: ProviderConnectionState;\r\n repoExpectationMet: boolean;\r\n providerObservationMet: boolean;\r\n}): VerificationResultStatus {\r\n if (input.connectionState === 'connected') {\r\n return input.providerObservationMet ? 'verified' : 'missing';\r\n }\r\n\r\n if (!input.repoExpectationMet) {\r\n return 'missing';\r\n }\r\n\r\n if (input.connectionState === 'not_configured' || input.connectionState === 'configured') {\r\n return 'needs_mcp';\r\n }\r\n\r\n if (input.connectionState === 'unsupported') {\r\n return 'manual';\r\n }\r\n\r\n return 'unknown';\r\n}\r\n", "import type {\r\n EvidenceSource,\r\n ProviderConnectionState,\r\n VerificationCheck,\r\n VerificationFixType,\r\n VerificationProviderId,\r\n VerificationResultStatus,\r\n VerificationSeverity\r\n} from '../types';\r\nimport type { StackWiringArea } from '../../types';\r\nimport { providerCheckId } from '../types';\r\nimport { providerResultStatus } from './connection';\r\n\r\nexport function buildVerificationCheck(input: {\r\n provider: VerificationProviderId;\r\n checkKey: string;\r\n area: StackWiringArea;\r\n title: string;\r\n description: string;\r\n evidenceSource: EvidenceSource;\r\n connectionState: ProviderConnectionState;\r\n repoExpectationMet: boolean;\r\n providerObservationMet: boolean;\r\n fixType: VerificationFixType;\r\n severity: VerificationSeverity;\r\n repoSignals: string[];\r\n providerSignals: string[];\r\n requiredEvidence?: string[];\r\n evidenceRefs?: string[];\r\n manualAction?: string;\r\n}): VerificationCheck {\r\n const status =\r\n input.evidenceSource === 'repo'\r\n ? (input.repoExpectationMet ? 'verified' : 'missing')\r\n : providerResultStatus({\r\n connectionState: input.connectionState,\r\n repoExpectationMet: input.repoExpectationMet,\r\n providerObservationMet: input.providerObservationMet\r\n });\r\n\r\n return {\r\n id: providerCheckId(input.provider, input.checkKey),\r\n provider: input.provider,\r\n area: input.area,\r\n title: input.title,\r\n description: input.description,\r\n requiredEvidence: input.requiredEvidence ?? [],\r\n repoSignals: input.repoSignals,\r\n providerSignals: input.providerSignals,\r\n evidenceSource: input.evidenceSource,\r\n status,\r\n fixType: input.fixType,\r\n severity: input.severity,\r\n evidenceRefs: input.evidenceRefs ?? [],\r\n manualAction: input.manualAction\r\n };\r\n}\r\n", "import { collectEnvVarEvidence } from '../../envEvidence';\r\nimport type { RepositoryEvidenceSummary, ScanResult, ScannedFile } from '../../types';\r\n\r\nexport type RepoScanContext = {\r\n files: VisibleFile[];\r\n pathBlob: string;\r\n contentBlob: string;\r\n deps: string[];\r\n};\r\n\r\nexport type VisibleFile = {\r\n path: string;\r\n normalizedPath: string;\r\n content: string;\r\n lowerContent: string;\r\n};\r\n\r\nconst ENV_NAME_PATTERN =\r\n /\\b(?:process\\.env|import\\.meta\\.env)\\.([A-Z][A-Z0-9_]{2,})\\b/g;\r\nconst ENV_ASSIGNMENT_PATTERN = /^[ \\t]*(?:export[ \\t]+)?([A-Z][A-Z0-9_]{2,})[ \\t]*=/gm;\r\nconst SUPABASE_TABLE_PATTERN = /\\.from\\s*\\(\\s*['\"]([a-z0-9_]+)['\"]\\s*\\)/gi;\r\nconst STRIPE_WEBHOOK_PATH_PATTERN = /(^|\\/)(api\\/webhooks\\/stripe|api\\/stripe\\/webhook|webhooks\\/stripe)[^/\\s]*/i;\r\nconst GITHUB_WORKFLOW_PATTERN = /(^|\\/)\\.github\\/workflows\\/([^/\\n]+\\.ya?ml)/i;\r\n\r\nexport function buildRepoScanContext(scan: ScanResult): RepoScanContext {\r\n const files = visibleFiles(scan);\r\n return {\r\n files,\r\n pathBlob: `${scan.fileTree}\\n${scan.files.map((file) => file.path).join('\\n')}`.replace(/\\\\/g, '/'),\r\n contentBlob: files.map((file) => file.lowerContent).join('\\n'),\r\n deps: scan.packageDeps.map((dep) => dep.toLowerCase())\r\n };\r\n}\r\n\r\nexport function visibleFiles(scan: ScanResult): VisibleFile[] {\r\n return scan.files\r\n .filter((file) => !file.isSecret && typeof file.content === 'string')\r\n .map((file) => ({\r\n path: file.path.replace(/\\\\/g, '/'),\r\n normalizedPath: file.path.replace(/\\\\/g, '/').toLowerCase(),\r\n content: file.content as string,\r\n lowerContent: (file.content as string).toLowerCase()\r\n }));\r\n}\r\n\r\nexport function collectReferencedEnvNames(\r\n scan: ScanResult,\r\n repositoryEvidence: RepositoryEvidenceSummary\r\n): string[] {\r\n const names = new Set<string>();\r\n\r\n for (const entry of repositoryEvidence.env) {\r\n if (entry.present || entry.evidence.length > 0) {\r\n names.add(entry.name);\r\n }\r\n }\r\n\r\n for (const file of visibleFiles(scan)) {\r\n if (!/(^|\\/)\\.env(\\.|$)|env\\.example|readme/i.test(file.normalizedPath)) {\r\n ENV_NAME_PATTERN.lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n while ((match = ENV_NAME_PATTERN.exec(file.content)) !== null) {\r\n names.add(match[1]);\r\n }\r\n }\r\n\r\n if (/\\.env\\.example|env\\.example/i.test(file.normalizedPath)) {\r\n ENV_ASSIGNMENT_PATTERN.lastIndex = 0;\r\n let assignment: RegExpExecArray | null;\r\n while ((assignment = ENV_ASSIGNMENT_PATTERN.exec(file.content)) !== null) {\r\n names.add(assignment[1]);\r\n }\r\n }\r\n }\r\n\r\n const supplemental = collectEnvVarEvidence(scan, [...names]);\r\n for (const entry of supplemental) {\r\n if (entry.present || entry.evidence.length > 0) {\r\n names.add(entry.name);\r\n }\r\n }\r\n\r\n return [...names].sort();\r\n}\r\n\r\nexport function collectEnvExampleNames(scan: ScanResult): string[] {\r\n const names = new Set<string>();\r\n for (const file of visibleFiles(scan)) {\r\n if (!/\\.env\\.example|env\\.example/i.test(file.normalizedPath)) {\r\n continue;\r\n }\r\n ENV_ASSIGNMENT_PATTERN.lastIndex = 0;\r\n let assignment: RegExpExecArray | null;\r\n while ((assignment = ENV_ASSIGNMENT_PATTERN.exec(file.content)) !== null) {\r\n names.add(assignment[1]);\r\n }\r\n }\r\n return [...names].sort();\r\n}\r\n\r\nexport function hasRlsMigrationEvidence(repo: RepoScanContext): boolean {\r\n return /\\/policies\\/|_rls\\.sql|\\brls\\b/i.test(repo.pathBlob) ||\r\n repo.files.some((file) =>\r\n /enable\\s+row\\s+level\\s+security|create\\s+policy|alter\\s+table[\\s\\S]{0,200}enable\\s+row\\s+level/i.test(\r\n file.content\r\n )\r\n );\r\n}\r\n\r\nexport function collectSupabaseReferencedTables(repo: RepoScanContext): string[] {\r\n const tables = new Set<string>();\r\n for (const file of repo.files) {\r\n SUPABASE_TABLE_PATTERN.lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n while ((match = SUPABASE_TABLE_PATTERN.exec(file.content)) !== null) {\r\n tables.add(match[1]);\r\n }\r\n }\r\n return [...tables].sort();\r\n}\r\n\r\nexport function findStripeWebhookRoute(repo: RepoScanContext): string | null {\r\n const pathMatch = repo.pathBlob.match(STRIPE_WEBHOOK_PATH_PATTERN);\r\n if (pathMatch) {\r\n return pathMatch[0].replace(/^\\//, '');\r\n }\r\n const file = repo.files.find((entry) => /stripe.*webhook|webhook.*stripe/i.test(entry.normalizedPath));\r\n return file ? file.path : null;\r\n}\r\n\r\nexport function hasStripeWebhookSignature(repo: RepoScanContext): boolean {\r\n return /webhooks\\.constructevent/i.test(repo.contentBlob);\r\n}\r\n\r\nexport function collectStripePriceEnvNames(repo: RepoScanContext, referencedEnv: string[]): string[] {\r\n return referencedEnv.filter((name) => /^STRIPE_(PRICE_|PRODUCT_)/i.test(name) || /STRIPE.*PRICE/i.test(name));\r\n}\r\n\r\nexport function findGithubWorkflowPaths(repo: RepoScanContext): string[] {\r\n const paths = new Set<string>();\r\n for (const line of repo.pathBlob.split(/\\r?\\n/)) {\r\n const match = line.match(GITHUB_WORKFLOW_PATTERN);\r\n if (match) {\r\n paths.add(line.trim());\r\n }\r\n }\r\n return [...paths].sort();\r\n}\r\n\r\nexport function pathEvidence(files: VisibleFile[], pattern: RegExp, limit = 4): string[] {\r\n return files\r\n .filter((file) => pattern.test(file.normalizedPath) || pattern.test(file.content))\r\n .slice(0, limit)\r\n .map((file) => `file: ${file.path}`);\r\n}\r\n", "import { buildVerificationCheck } from '../shared/buildCheck';\r\nimport { resolveProviderConnectionState } from '../shared/connection';\r\nimport { buildRepoScanContext, findGithubWorkflowPaths } from '../shared/repoSignals';\r\nimport { providerCheckId } from '../types';\r\nimport type {\r\n ProviderConfigDetection,\r\n ProviderConnectionState,\r\n ProviderVerifier,\r\n RepoProviderDiff,\r\n VerificationCheck,\r\n VerifierContext\r\n} from '../types';\r\n\r\nexport const mockGitHubVerifier: ProviderVerifier = {\r\n provider: 'github',\r\n\r\n detectConfig(ctx: VerifierContext): ProviderConfigDetection {\r\n const repo = buildRepoScanContext(ctx.scan);\r\n const workflows = findGithubWorkflowPaths(repo);\r\n const signals: string[] = [];\r\n if (ctx.scan.stackSignals.hasCI) {\r\n signals.push('stack: hasCI');\r\n }\r\n for (const workflow of workflows) {\r\n signals.push(`workflow: ${workflow}`);\r\n }\r\n const detected = workflows.length > 0 || Boolean(ctx.scan.stackSignals.hasCI);\r\n return { provider: 'github', detected, signals };\r\n },\r\n\r\n connectStatus(ctx: VerifierContext): ProviderConnectionState {\r\n return resolveProviderConnectionState('github', ctx.mcpVerifierState);\r\n },\r\n\r\n runChecks(ctx: VerifierContext): VerificationCheck[] {\r\n const connectionState = this.connectStatus(ctx);\r\n const repo = buildRepoScanContext(ctx.scan);\r\n const workflows = findGithubWorkflowPaths(repo);\r\n\r\n return [\r\n buildVerificationCheck({\r\n provider: 'github',\r\n checkKey: 'actions-run-status',\r\n area: 'testing',\r\n title: 'GitHub Actions run status',\r\n description: 'Recent workflow run conclusions require live GitHub API or MCP access.',\r\n evidenceSource: 'provider',\r\n connectionState,\r\n repoExpectationMet: workflows.length > 0,\r\n providerObservationMet: false,\r\n fixType: 'mcp-connect',\r\n severity: 'warning',\r\n repoSignals: workflows.map((path) => `workflow: ${path}`),\r\n providerSignals: ['GitHub Actions API or MCP'],\r\n requiredEvidence: ['Latest workflow run status on default branch']\r\n }),\r\n buildVerificationCheck({\r\n provider: 'github',\r\n checkKey: 'required-checks',\r\n area: 'testing',\r\n title: 'Required GitHub checks',\r\n description: 'Branch protection and required check contexts need live GitHub verification.',\r\n evidenceSource: 'provider',\r\n connectionState,\r\n repoExpectationMet: workflows.length > 0,\r\n providerObservationMet: false,\r\n fixType: 'mcp-connect',\r\n severity: 'warning',\r\n repoSignals: workflows,\r\n providerSignals: ['GitHub branch protection API or MCP'],\r\n requiredEvidence: ['Required status checks configured for production branch']\r\n }),\r\n buildVerificationCheck({\r\n provider: 'github',\r\n checkKey: 'failed-checks-recent',\r\n area: 'testing',\r\n title: 'Recent failed GitHub checks',\r\n description: 'Failed workflow runs in the last 7 days require live GitHub verification.',\r\n evidenceSource: 'provider',\r\n connectionState,\r\n repoExpectationMet: workflows.length > 0,\r\n providerObservationMet: false,\r\n fixType: 'mcp-connect',\r\n severity: 'critical',\r\n repoSignals: workflows,\r\n providerSignals: ['GitHub check run API or MCP'],\r\n requiredEvidence: ['No failing required checks on latest default-branch commit']\r\n })\r\n ];\r\n },\r\n\r\n buildDiffs(ctx: VerifierContext): RepoProviderDiff[] {\r\n const repo = buildRepoScanContext(ctx.scan);\r\n const workflows = findGithubWorkflowPaths(repo);\r\n if (workflows.length === 0) {\r\n return [];\r\n }\r\n\r\n return [\r\n {\r\n id: providerCheckId('github', 'ci-status-unverified'),\r\n provider: 'github',\r\n area: 'testing',\r\n title: 'CI status not verified',\r\n description:\r\n 'GitHub workflow files exist in the repo, but recent Actions conclusions have not been fetched.',\r\n repoExpectation: `Workflows: ${workflows.join(', ')}`,\r\n providerActual: 'Not verified (mock \u2014 connect GitHub MCP read-only)',\r\n severity: 'warning',\r\n suggestedFix: 'mcp-connect',\r\n evidenceRefs: workflows.map((path) => `workflow: ${path}`)\r\n }\r\n ];\r\n }\r\n};\r\n", "import { buildVerificationCheck } from '../shared/buildCheck';\r\nimport { resolveProviderConnectionState } from '../shared/connection';\r\nimport {\r\n buildRepoScanContext,\r\n collectReferencedEnvNames,\r\n collectStripePriceEnvNames,\r\n findStripeWebhookRoute,\r\n hasStripeWebhookSignature\r\n} from '../shared/repoSignals';\r\nimport { providerCheckId } from '../types';\r\nimport type {\r\n ProviderConfigDetection,\r\n ProviderConnectionState,\r\n ProviderVerifier,\r\n RepoProviderDiff,\r\n VerificationCheck,\r\n VerifierContext\r\n} from '../types';\r\n\r\nconst REQUIRED_STRIPE_EVENTS = [\r\n 'checkout.session.completed',\r\n 'customer.subscription.updated',\r\n 'customer.subscription.deleted',\r\n 'invoice.payment_failed'\r\n];\r\n\r\n/** Mock Stripe dashboard state \u2014 replaced by Stripe MCP in phase 2. */\r\nconst MOCK_STRIPE_HAS_WEBHOOK_ENDPOINT = false;\r\nconst MOCK_STRIPE_CONFIGURED_EVENTS = new Set<string>();\r\nconst MOCK_STRIPE_LIVE_PRICE_IDS = new Set<string>();\r\n\r\nexport const mockStripeVerifier: ProviderVerifier = {\r\n provider: 'stripe',\r\n\r\n detectConfig(ctx: VerifierContext): ProviderConfigDetection {\r\n const repo = buildRepoScanContext(ctx.scan);\r\n const signals: string[] = [];\r\n if (ctx.scan.stackSignals.hasStripe) {\r\n signals.push('stack: hasStripe');\r\n }\r\n if (repo.deps.some((dep) => dep === 'stripe' || dep.startsWith('@stripe/'))) {\r\n signals.push('package: stripe');\r\n }\r\n if (findStripeWebhookRoute(repo)) {\r\n signals.push(`route: ${findStripeWebhookRoute(repo)}`);\r\n }\r\n const detected = signals.length > 0;\r\n return { provider: 'stripe', detected, signals };\r\n },\r\n\r\n connectStatus(ctx: VerifierContext): ProviderConnectionState {\r\n return resolveProviderConnectionState('stripe', ctx.mcpVerifierState);\r\n },\r\n\r\n runChecks(ctx: VerifierContext): VerificationCheck[] {\r\n const connectionState = this.connectStatus(ctx);\r\n const repo = buildRepoScanContext(ctx.scan);\r\n const webhookRoute = findStripeWebhookRoute(repo);\r\n const referencedEnv = collectReferencedEnvNames(ctx.scan, ctx.repositoryEvidence);\r\n const priceEnvNames = collectStripePriceEnvNames(repo, referencedEnv);\r\n const missingEvents = REQUIRED_STRIPE_EVENTS.filter((event) => !MOCK_STRIPE_CONFIGURED_EVENTS.has(event));\r\n\r\n return [\r\n buildVerificationCheck({\r\n provider: 'stripe',\r\n checkKey: 'dashboard-webhook-endpoint',\r\n area: 'payments',\r\n title: 'Stripe dashboard webhook endpoint',\r\n description: webhookRoute\r\n ? 'Repo defines a webhook route; Stripe dashboard endpoint must match and be reachable.'\r\n : 'No Stripe webhook route found in repo; dashboard endpoint check still applies when Stripe is used.',\r\n evidenceSource: 'provider',\r\n connectionState,\r\n repoExpectationMet: Boolean(webhookRoute),\r\n providerObservationMet: MOCK_STRIPE_HAS_WEBHOOK_ENDPOINT,\r\n fixType: 'provider-config',\r\n severity: 'critical',\r\n repoSignals: webhookRoute ? [`route: ${webhookRoute}`] : [],\r\n providerSignals: ['Stripe webhooks API or MCP'],\r\n requiredEvidence: ['Webhook endpoint URL registered in Stripe'],\r\n manualAction: 'Register the production webhook URL in Stripe Dashboard \u2192 Developers \u2192 Webhooks.'\r\n }),\r\n buildVerificationCheck({\r\n provider: 'stripe',\r\n checkKey: 'webhook-events',\r\n area: 'payments',\r\n title: 'Stripe webhook event subscriptions',\r\n description:\r\n missingEvents.length > 0\r\n ? `Missing required events: ${missingEvents.join(', ')}`\r\n : 'Required subscription lifecycle events are configured (mock).',\r\n evidenceSource: 'provider',\r\n connectionState,\r\n repoExpectationMet: Boolean(webhookRoute && hasStripeWebhookSignature(repo)),\r\n providerObservationMet: missingEvents.length === 0,\r\n fixType: 'provider-config',\r\n severity: 'critical',\r\n repoSignals: hasStripeWebhookSignature(repo) ? ['webhooks.constructEvent in repo'] : [],\r\n providerSignals: ['Stripe webhook endpoint event list'],\r\n requiredEvidence: REQUIRED_STRIPE_EVENTS.map((event) => `event: ${event}`)\r\n }),\r\n buildVerificationCheck({\r\n provider: 'stripe',\r\n checkKey: 'live-price-ids',\r\n area: 'payments',\r\n title: 'Stripe live price IDs',\r\n description:\r\n priceEnvNames.length > 0\r\n ? 'Price/product env vars are referenced in repo; live Stripe prices must match.'\r\n : 'No Stripe price env vars detected; confirm products/prices if billing is enabled.',\r\n evidenceSource: 'provider',\r\n connectionState,\r\n repoExpectationMet: priceEnvNames.length > 0,\r\n providerObservationMet:\r\n priceEnvNames.length > 0 &&\r\n priceEnvNames.every((name) => MOCK_STRIPE_LIVE_PRICE_IDS.has(name)),\r\n fixType: 'provider-config',\r\n severity: priceEnvNames.length > 0 ? 'warning' : 'info',\r\n repoSignals: priceEnvNames.map((name) => `env: ${name}`),\r\n providerSignals: ['Stripe products/prices API or MCP'],\r\n requiredEvidence: ['Live price IDs match env configuration']\r\n })\r\n ];\r\n },\r\n\r\n buildDiffs(ctx: VerifierContext): RepoProviderDiff[] {\r\n const repo = buildRepoScanContext(ctx.scan);\r\n const webhookRoute = findStripeWebhookRoute(repo);\r\n const diffs: RepoProviderDiff[] = [];\r\n\r\n if (webhookRoute && !MOCK_STRIPE_HAS_WEBHOOK_ENDPOINT) {\r\n diffs.push({\r\n id: providerCheckId('stripe', 'webhook-endpoint-mismatch'),\r\n provider: 'stripe',\r\n area: 'payments',\r\n title: 'Stripe webhook endpoint not registered',\r\n description:\r\n 'The repo implements a webhook handler, but no matching endpoint is registered in the mock Stripe account.',\r\n repoExpectation: `Webhook route: ${webhookRoute}`,\r\n providerActual: 'No Stripe webhook endpoint (mock empty dashboard)',\r\n severity: 'critical',\r\n suggestedFix: 'provider-config',\r\n evidenceRefs: [`route: ${webhookRoute}`]\r\n });\r\n }\r\n\r\n const referencedEnv = collectReferencedEnvNames(ctx.scan, ctx.repositoryEvidence);\r\n if (referencedEnv.includes('STRIPE_WEBHOOK_SECRET') && !MOCK_STRIPE_HAS_WEBHOOK_ENDPOINT) {\r\n diffs.push({\r\n id: providerCheckId('stripe', 'webhook-secret-without-endpoint'),\r\n provider: 'stripe',\r\n area: 'payments',\r\n title: 'STRIPE_WEBHOOK_SECRET without dashboard endpoint',\r\n description:\r\n 'Repo expects STRIPE_WEBHOOK_SECRET but Stripe dashboard webhook endpoint is not confirmed.',\r\n repoExpectation: 'STRIPE_WEBHOOK_SECRET referenced in repo',\r\n providerActual: 'No webhook endpoint to deliver signed events',\r\n severity: 'critical',\r\n suggestedFix: 'provider-config',\r\n evidenceRefs: ['env: STRIPE_WEBHOOK_SECRET']\r\n });\r\n }\r\n\r\n return diffs;\r\n }\r\n};\r\n", "import { buildVerificationCheck } from '../shared/buildCheck';\r\nimport { resolveProviderConnectionState } from '../shared/connection';\r\nimport {\r\n buildRepoScanContext,\r\n collectSupabaseReferencedTables,\r\n hasRlsMigrationEvidence\r\n} from '../shared/repoSignals';\r\nimport { providerCheckId } from '../types';\r\nimport type {\r\n ProviderConfigDetection,\r\n ProviderConnectionState,\r\n ProviderVerifier,\r\n RepoProviderDiff,\r\n VerificationCheck,\r\n VerifierContext\r\n} from '../types';\r\n\r\nexport const mockSupabaseVerifier: ProviderVerifier = {\r\n provider: 'supabase',\r\n\r\n detectConfig(ctx: VerifierContext): ProviderConfigDetection {\r\n const repo = buildRepoScanContext(ctx.scan);\r\n const signals: string[] = [];\r\n if (ctx.scan.stackSignals.hasSupabase) {\r\n signals.push('stack: hasSupabase');\r\n }\r\n if (repo.deps.some((dep) => dep.startsWith('@supabase/'))) {\r\n signals.push(`package: ${repo.deps.find((dep) => dep.startsWith('@supabase/'))}`);\r\n }\r\n if (/\\/supabase\\/migrations\\//i.test(repo.pathBlob)) {\r\n signals.push('path: supabase/migrations');\r\n }\r\n const detected = signals.length > 0;\r\n return { provider: 'supabase', detected, signals };\r\n },\r\n\r\n connectStatus(ctx: VerifierContext): ProviderConnectionState {\r\n return resolveProviderConnectionState('supabase', ctx.mcpVerifierState);\r\n },\r\n\r\n runChecks(ctx: VerifierContext): VerificationCheck[] {\r\n const connectionState = this.connectStatus(ctx);\r\n const repo = buildRepoScanContext(ctx.scan);\r\n const tables = collectSupabaseReferencedTables(repo);\r\n const rlsInRepo = hasRlsMigrationEvidence(repo);\r\n\r\n return [\r\n buildVerificationCheck({\r\n provider: 'supabase',\r\n checkKey: 'live-rls-enabled',\r\n area: 'database',\r\n title: 'Live Supabase RLS enabled',\r\n description: rlsInRepo\r\n ? 'Repo contains RLS migration/policy evidence; live project RLS must be confirmed via Supabase MCP or dashboard.'\r\n : 'No RLS migration evidence in repo; live project likely needs RLS before launch.',\r\n evidenceSource: 'provider',\r\n connectionState,\r\n repoExpectationMet: rlsInRepo,\r\n providerObservationMet: false,\r\n fixType: rlsInRepo ? 'mcp-connect' : 'provider-config',\r\n severity: 'critical',\r\n repoSignals: rlsInRepo ? ['migration/policy references RLS'] : ['no RLS migration detected'],\r\n providerSignals: ['Supabase project policy API or MCP'],\r\n requiredEvidence: ['RLS enabled on user-owned tables in live project'],\r\n manualAction: 'Enable RLS and policies in Supabase Dashboard \u2192 Authentication \u2192 Policies.'\r\n }),\r\n buildVerificationCheck({\r\n provider: 'supabase',\r\n checkKey: 'live-policies',\r\n area: 'database',\r\n title: 'Live Supabase policies',\r\n description: 'Row policies on referenced tables require live Supabase verification.',\r\n evidenceSource: 'provider',\r\n connectionState,\r\n repoExpectationMet: tables.length > 0,\r\n providerObservationMet: false,\r\n fixType: 'mcp-connect',\r\n severity: tables.length > 0 ? 'critical' : 'info',\r\n repoSignals: tables.map((table) => `table referenced: ${table}`),\r\n providerSignals: ['Supabase policy list API or MCP'],\r\n requiredEvidence: ['Policies exist for tables used in application code']\r\n }),\r\n buildVerificationCheck({\r\n provider: 'supabase',\r\n checkKey: 'referenced-tables-protected',\r\n area: 'database',\r\n title: 'Referenced tables protected in live project',\r\n description:\r\n tables.length > 0\r\n ? `Application code references ${tables.length} Supabase table(s); confirm live RLS/policies cover them.`\r\n : 'No Supabase table references detected in scanned code.',\r\n evidenceSource: 'provider',\r\n connectionState,\r\n repoExpectationMet: tables.length > 0 && rlsInRepo,\r\n providerObservationMet: false,\r\n fixType: 'provider-config',\r\n severity: 'warning',\r\n repoSignals: tables.map((table) => `.from(\"${table}\")`),\r\n providerSignals: ['Live table policy map'],\r\n requiredEvidence: ['Each referenced public table has RLS + policy in production']\r\n })\r\n ];\r\n },\r\n\r\n buildDiffs(ctx: VerifierContext): RepoProviderDiff[] {\r\n const repo = buildRepoScanContext(ctx.scan);\r\n const tables = collectSupabaseReferencedTables(repo);\r\n const rlsInRepo = hasRlsMigrationEvidence(repo);\r\n const diffs: RepoProviderDiff[] = [];\r\n\r\n if (!rlsInRepo && tables.length > 0) {\r\n diffs.push({\r\n id: providerCheckId('supabase', 'rls-migration-gap'),\r\n provider: 'supabase',\r\n area: 'database',\r\n title: 'RLS migration missing for referenced tables',\r\n description:\r\n 'Code queries Supabase tables but no RLS migration/policy evidence was found in the repo.',\r\n repoExpectation: `Tables referenced: ${tables.join(', ')}`,\r\n providerActual: 'Live RLS state unknown without Supabase MCP',\r\n severity: 'critical',\r\n suggestedFix: 'repo-fix',\r\n evidenceRefs: tables.map((table) => `table: ${table}`)\r\n });\r\n }\r\n\r\n if (rlsInRepo) {\r\n diffs.push({\r\n id: providerCheckId('supabase', 'live-rls-unverified'),\r\n provider: 'supabase',\r\n area: 'database',\r\n title: 'Live RLS not verified',\r\n description:\r\n 'Repo includes RLS migration/policy files, but live Supabase project RLS has not been confirmed.',\r\n repoExpectation: 'RLS policies defined in repo migrations',\r\n providerActual: 'Not verified (mock \u2014 connect Supabase MCP read-only)',\r\n severity: 'critical',\r\n suggestedFix: 'mcp-connect',\r\n evidenceRefs: repo.files\r\n .filter((file) => /enable\\s+row\\s+level\\s+security|create\\s+policy/i.test(file.content))\r\n .slice(0, 3)\r\n .map((file) => `file: ${file.path}`)\r\n });\r\n }\r\n\r\n return diffs;\r\n }\r\n};\r\n", "import { buildVerificationCheck } from '../shared/buildCheck';\r\nimport { resolveProviderConnectionState } from '../shared/connection';\r\nimport {\r\n buildRepoScanContext,\r\n collectEnvExampleNames,\r\n collectReferencedEnvNames\r\n} from '../shared/repoSignals';\r\nimport { providerCheckId } from '../types';\r\nimport type {\r\n ProviderConfigDetection,\r\n ProviderConnectionState,\r\n ProviderVerifier,\r\n RepoProviderDiff,\r\n VerificationCheck,\r\n VerifierContext\r\n} from '../types';\r\n\r\n/** Mock production env store \u2014 replaced by MCP Vercel project env fetch in phase 2. */\r\nconst MOCK_VERCEL_PRODUCTION_ENV = new Set<string>();\r\n\r\nfunction deploymentEnvCandidates(ctx: VerifierContext): string[] {\r\n const referenced = collectReferencedEnvNames(ctx.scan, ctx.repositoryEvidence);\r\n const fromExample = collectEnvExampleNames(ctx.scan);\r\n const names = new Set([...referenced, ...fromExample]);\r\n return [...names].filter((name) => {\r\n if (/^VERCEL_/i.test(name)) {\r\n return true;\r\n }\r\n if (/^(DATABASE_URL|NEXT_PUBLIC_|VITE_|SUPABASE_|STRIPE_|CLERK_|SENTRY_|POSTHOG_|PADDLE_|AUTH_|NEXTAUTH_)/i.test(name)) {\r\n return true;\r\n }\r\n return referenced.includes(name) && fromExample.includes(name);\r\n });\r\n}\r\n\r\nexport const mockVercelVerifier: ProviderVerifier = {\r\n provider: 'vercel',\r\n\r\n detectConfig(ctx: VerifierContext): ProviderConfigDetection {\r\n const repo = buildRepoScanContext(ctx.scan);\r\n const signals: string[] = [];\r\n if (ctx.scan.stackSignals.hasVercel) {\r\n signals.push('stack: hasVercel');\r\n }\r\n if (/vercel\\.json/i.test(repo.pathBlob)) {\r\n signals.push('path: vercel.json');\r\n }\r\n if (ctx.scan.stackSignals.hasNextJs || ctx.scan.stackSignals.hasVite) {\r\n signals.push('framework: Vercel-compatible');\r\n }\r\n const detected = signals.length > 0;\r\n return { provider: 'vercel', detected, signals };\r\n },\r\n\r\n connectStatus(ctx: VerifierContext): ProviderConnectionState {\r\n return resolveProviderConnectionState('vercel', ctx.mcpVerifierState);\r\n },\r\n\r\n runChecks(ctx: VerifierContext): VerificationCheck[] {\r\n const connectionState = this.connectStatus(ctx);\r\n const candidates = deploymentEnvCandidates(ctx);\r\n const missingOnVercel = candidates.filter((name) => !MOCK_VERCEL_PRODUCTION_ENV.has(name));\r\n const repo = buildRepoScanContext(ctx.scan);\r\n\r\n const checks: VerificationCheck[] = [\r\n buildVerificationCheck({\r\n provider: 'vercel',\r\n checkKey: 'production-env-sync',\r\n area: 'deployment',\r\n title: 'Vercel production environment variables',\r\n description:\r\n missingOnVercel.length > 0\r\n ? `${missingOnVercel.length} repo-referenced env var(s) are not confirmed in Vercel production.`\r\n : 'Repo env names align with the mock Vercel production snapshot.',\r\n evidenceSource: 'provider',\r\n connectionState,\r\n repoExpectationMet: candidates.length > 0,\r\n providerObservationMet: missingOnVercel.length === 0,\r\n fixType: 'provider-config',\r\n severity: missingOnVercel.length > 0 ? 'critical' : 'info',\r\n repoSignals: missingOnVercel.map((name) => `env expected: ${name}`),\r\n providerSignals:\r\n connectionState === 'connected'\r\n ? ['Vercel production env API']\r\n : ['Awaiting Vercel MCP read-only env lookup'],\r\n requiredEvidence: ['Vercel production env var names and values (redacted)'],\r\n manualAction: 'Add missing keys in Vercel Project Settings \u2192 Environment Variables (Production).'\r\n }),\r\n buildVerificationCheck({\r\n provider: 'vercel',\r\n checkKey: 'latest-deployment',\r\n area: 'deployment',\r\n title: 'Latest Vercel deployment status',\r\n description: 'Production deployment health requires live Vercel project access.',\r\n evidenceSource: 'provider',\r\n connectionState,\r\n repoExpectationMet: Boolean(ctx.scan.stackSignals.hasVercel || /vercel\\.json/i.test(repo.pathBlob)),\r\n providerObservationMet: false,\r\n fixType: 'mcp-connect',\r\n severity: 'warning',\r\n repoSignals: repo.pathBlob.split(/\\r?\\n/).filter((p) => /vercel\\.json/i.test(p)).slice(0, 3),\r\n providerSignals: ['Vercel deployments API or MCP'],\r\n requiredEvidence: ['Latest production deployment state']\r\n }),\r\n buildVerificationCheck({\r\n provider: 'vercel',\r\n checkKey: 'production-domain',\r\n area: 'deployment',\r\n title: 'Vercel production domain',\r\n description: 'Custom domain and DNS status require live Vercel project access.',\r\n evidenceSource: 'provider',\r\n connectionState,\r\n repoExpectationMet: Boolean(ctx.scan.stackSignals.hasVercel || ctx.scan.stackSignals.hasNextJs),\r\n providerObservationMet: false,\r\n fixType: 'mcp-connect',\r\n severity: 'warning',\r\n repoSignals: [],\r\n providerSignals: ['Vercel domains API or MCP'],\r\n requiredEvidence: ['Production domain assignment and DNS verification']\r\n })\r\n ];\r\n\r\n return checks;\r\n },\r\n\r\n buildDiffs(ctx: VerifierContext): RepoProviderDiff[] {\r\n const candidates = deploymentEnvCandidates(ctx);\r\n return candidates\r\n .filter((name) => !MOCK_VERCEL_PRODUCTION_ENV.has(name))\r\n .map((name) => ({\r\n id: providerCheckId('vercel', `env-missing-${name.toLowerCase()}`),\r\n provider: 'vercel',\r\n area: 'deployment',\r\n title: `${name} missing in Vercel production`,\r\n description: `The repo references ${name}, but the mock Vercel production env snapshot does not include it.`,\r\n repoExpectation: `Referenced in repo (.env.example, code, or env evidence)`,\r\n providerActual: 'Not present in Vercel production (mock empty snapshot)',\r\n severity: /SECRET|KEY|TOKEN|PASSWORD/i.test(name) ? 'critical' : 'warning',\r\n suggestedFix: 'provider-config',\r\n evidenceRefs: collectReferencedEnvNames(ctx.scan, ctx.repositoryEvidence)\r\n .filter((entry) => entry === name)\r\n .map((entry) => `env: ${entry}`)\r\n }));\r\n }\r\n};\r\n", "import type { ProviderVerifier } from './types';\r\n\r\nconst verifiers: ProviderVerifier[] = [];\r\n\r\nexport function registerProviderVerifier(verifier: ProviderVerifier): void {\r\n const existing = verifiers.findIndex((entry) => entry.provider === verifier.provider);\r\n if (existing >= 0) {\r\n verifiers[existing] = verifier;\r\n return;\r\n }\r\n verifiers.push(verifier);\r\n}\r\n\r\nexport function getRegisteredVerifiers(): ProviderVerifier[] {\r\n return [...verifiers];\r\n}\r\n\r\nexport function clearRegisteredVerifiers(): void {\r\n verifiers.length = 0;\r\n}\r\n", "import { mockGitHubVerifier } from './mock/mockGitHubVerifier';\r\nimport { mockStripeVerifier } from './mock/mockStripeVerifier';\r\nimport { mockSupabaseVerifier } from './mock/mockSupabaseVerifier';\r\nimport { mockVercelVerifier } from './mock/mockVercelVerifier';\r\nimport { getRegisteredVerifiers, registerProviderVerifier } from './registry';\r\n\r\nlet defaultsRegistered = false;\r\n\r\nexport function ensureDefaultVerifiersRegistered(): void {\r\n if (defaultsRegistered) {\r\n return;\r\n }\r\n registerProviderVerifier(mockVercelVerifier);\r\n registerProviderVerifier(mockSupabaseVerifier);\r\n registerProviderVerifier(mockStripeVerifier);\r\n registerProviderVerifier(mockGitHubVerifier);\r\n defaultsRegistered = true;\r\n}\r\n\r\n/** Test helper \u2014 reset registration between tests. */\r\nexport function resetDefaultVerifiersRegistration(): void {\r\n defaultsRegistered = false;\r\n}\r\n\r\nexport function listDefaultVerifierProviders(): string[] {\r\n ensureDefaultVerifiersRegistered();\r\n return getRegisteredVerifiers().map((verifier) => verifier.provider);\r\n}\r\n", "import { ensureDefaultVerifiersRegistered } from './registerDefaults';\r\nimport { getRegisteredVerifiers } from './registry';\r\nimport {\r\n aggregateReadinessPercents,\r\n computeLayerReadinessPercent,\r\n coerceProviderVerificationStatus,\r\n type ProviderVerifier,\r\n type ProviderVerifierResult,\r\n type VerificationCheck,\r\n type VerificationLayerSnapshot,\r\n type VerifierContext\r\n} from './types';\r\n\r\nfunction runVerifier(verifier: ProviderVerifier, ctx: VerifierContext): ProviderVerifierResult | null {\r\n const config = verifier.detectConfig(ctx);\r\n if (!config.detected) {\r\n return null;\r\n }\r\n\r\n const connectionState = verifier.connectStatus(ctx);\r\n const rawChecks = verifier.runChecks(ctx);\r\n const checks = rawChecks.map((check) => ({\r\n ...check,\r\n status: coerceProviderVerificationStatus(check.status, connectionState)\r\n }));\r\n const diffs = verifier.buildDiffs(ctx);\r\n\r\n return {\r\n provider: verifier.provider,\r\n connectionState,\r\n config,\r\n checks,\r\n diffs,\r\n repoReadinessPercent: computeLayerReadinessPercent(checks, 'repo'),\r\n providerReadinessPercent: computeLayerReadinessPercent(checks, 'provider')\r\n };\r\n}\r\n\r\nexport function runVerificationLayer(\r\n ctx: VerifierContext,\r\n options?: { registerDefaults?: boolean }\r\n): VerificationLayerSnapshot {\r\n if (options?.registerDefaults !== false) {\r\n ensureDefaultVerifiersRegistered();\r\n }\r\n const providers = getRegisteredVerifiers()\r\n .map((verifier) => runVerifier(verifier, ctx))\r\n .filter((result): result is ProviderVerifierResult => result !== null);\r\n\r\n const checks = providers.flatMap((result) => result.checks);\r\n const diffs = providers.flatMap((result) => result.diffs);\r\n const { repoReadinessPercent, providerReadinessPercent } = aggregateReadinessPercents(providers);\r\n\r\n return {\r\n version: 1,\r\n generatedAt: new Date().toISOString(),\r\n runtimeMode: 'mock',\r\n providers,\r\n checks,\r\n diffs,\r\n repoReadinessPercent,\r\n providerReadinessPercent\r\n };\r\n}\r\n", "import { promises as fs } from 'node:fs';\r\nimport { join } from 'node:path';\r\nimport { BackendHttpError } from './backendClient';\r\nimport { adaptManagedStationResponse, normalizeModelOutput } from './engines';\r\nimport { isNetworkFetchFailure } from './fetchUtils';\r\nimport { buildLaunchValidationReport } from './launchValidation';\r\nimport { buildMissionGraph } from './missionGraph';\r\nimport { buildProviderTruthSnapshot } from './providerTruth';\r\nimport { buildProviderRegistrySnapshot } from './providerRegistry';\r\nimport { buildAnalysisPrompt } from './promptBuilder';\r\nimport {\r\n buildProductionConnectionContext,\r\n detectProductionConnectionEvidence,\r\n normalizeProductionChoice,\r\n summarizeProductionConnections\r\n} from './productionConnections';\r\nimport { analyzeRepositoryEvidence } from './repositoryEvidence';\r\nimport { computeStationScanContext } from './scanContext';\r\nimport { buildStaticInfrastructureFlowGraph } from './sifgEngine';\r\nimport { buildStackAutomationContext, buildStackAutomationSummary } from './stackAutomation';\r\nimport { analyzeStackWiring, buildStackWiringContext } from './stackWiring';\r\nimport { buildVerificationEvidenceContext, buildVerificationSummary } from './verification';\r\nimport { runVerificationLayer } from './verificationLayer/runVerificationLayer';\r\nimport type { ManagedStationRequest, ManagedStationResponse } from '../../shared/station';\r\nimport type { ProductionConnectionChoices } from './productionConnections';\r\nimport type { SifgGraph } from './sifgTypes';\r\nimport type {\r\n LaunchValidationReport,\r\n McpVerifierStateSnapshot,\r\n MissionGraph,\r\n ModelStationOutput,\r\n ProviderTruthSnapshot,\r\n RepositoryEvidenceSummary,\r\n ScanResult,\r\n ScannedFile,\r\n StackAutomationSummary,\r\n StackWiringSummary,\r\n StationScanContext,\r\n VerificationSummary\r\n} from './types';\r\n\r\ninterface StationOrchestratorDeps {\r\n scanWorkspace: (root: string) => Promise<ScanResult>;\r\n fetchStationOutput: (prompt: string, configuration?: unknown) => Promise<Partial<ModelStationOutput>>;\r\n getManagedAccessToken?: () => Promise<string | undefined>;\r\n runManagedStation?: (\r\n accessToken: string,\r\n payload: ManagedStationRequest\r\n ) => Promise<ManagedStationResponse>;\r\n /**\r\n * When false (default for shipped builds), Station never falls back to BYOK/local OpenAI \u2014\r\n * users must be signed in and reach the managed API.\r\n */\r\n isLocalStationFallbackAllowed?: () => boolean | Promise<boolean>;\r\n getProductionConnectionChoices?: () => Promise<ProductionConnectionChoices | undefined>;\r\n getMcpVerifierState?: () => Promise<McpVerifierStateSnapshot | undefined> | McpVerifierStateSnapshot | undefined;\r\n}\r\n\r\ninterface StationOrchestratorInput {\r\n workspaceRoot: string;\r\n prompt: string;\r\n configuration?: unknown;\r\n}\r\n\r\nexport interface StationRunResult extends ModelStationOutput {\r\n scannedFiles: ScannedFile[];\r\n scanContext: StationScanContext;\r\n providerRegistry: ReturnType<typeof buildProviderRegistrySnapshot>;\r\n productionConnections: ReturnType<typeof summarizeProductionConnections>;\r\n verificationSummary: VerificationSummary;\r\n stackWiring: StackWiringSummary;\r\n stackAutomation: StackAutomationSummary;\r\n repositoryEvidence: RepositoryEvidenceSummary;\r\n providerTruth: ProviderTruthSnapshot;\r\n launchValidation: LaunchValidationReport;\r\n missionGraph: MissionGraph;\r\n staticInfrastructureFlowGraph: SifgGraph;\r\n usage?: ManagedStationResponse['usage'];\r\n}\r\n\r\nexport interface ScanLimitResult {\r\n kind: 'scan_limit_reached';\r\n upgradeUrl: string;\r\n}\r\n\r\nexport interface ManagedRequiredResult {\r\n kind: 'managed_required';\r\n message: string;\r\n}\r\n\r\n/** Managed API rejected the stored access token (wrong server or rotated API secret). */\r\nexport interface ManagedSessionInvalidResult {\r\n kind: 'managed_session_invalid';\r\n message: string;\r\n}\r\n\r\nexport type OrchestratorResult =\r\n | StationRunResult\r\n | ScanLimitResult\r\n | ManagedRequiredResult\r\n | ManagedSessionInvalidResult;\r\n\r\nexport function isScanLimitResult(value: OrchestratorResult): value is ScanLimitResult {\r\n return (value as ScanLimitResult).kind === 'scan_limit_reached';\r\n}\r\n\r\nexport function isManagedRequiredResult(value: OrchestratorResult): value is ManagedRequiredResult {\r\n return (value as ManagedRequiredResult).kind === 'managed_required';\r\n}\r\n\r\nexport function isManagedSessionInvalidResult(\r\n value: OrchestratorResult\r\n): value is ManagedSessionInvalidResult {\r\n return (value as ManagedSessionInvalidResult).kind === 'managed_session_invalid';\r\n}\r\n\r\nexport function createStationOrchestrator(deps: StationOrchestratorDeps) {\r\n return {\r\n async run(input: StationOrchestratorInput): Promise<OrchestratorResult> {\r\n const allowLocal = Boolean(await deps.isLocalStationFallbackAllowed?.());\r\n\r\n const scan = await deps.scanWorkspace(input.workspaceRoot);\r\n const productionConnectionChoices = await loadProductionConnectionChoices(deps);\r\n const productionConnectionEvidence = detectProductionConnectionEvidence(scan);\r\n const productionConnections = summarizeProductionConnections(\r\n productionConnectionChoices,\r\n productionConnectionEvidence\r\n );\r\n const productionConnectionContext = buildProductionConnectionContext(\r\n productionConnectionChoices,\r\n productionConnectionEvidence\r\n );\r\n const verificationSummary = buildVerificationSummary(scan, productionConnections);\r\n const verificationEvidenceContext = buildVerificationEvidenceContext(verificationSummary);\r\n const stackWiring: StackWiringSummary = analyzeStackWiring(scan);\r\n const stackWiringContext = buildStackWiringContext(stackWiring);\r\n const repositoryEvidence = analyzeRepositoryEvidence(scan);\r\n const providerRegistry = buildProviderRegistrySnapshot();\r\n const staticInfrastructureFlowGraph = buildStaticInfrastructureFlowGraph(scan);\r\n const stackAutomation = buildStackAutomationSummary(stackWiring, { staticInfrastructureFlowGraph });\r\n const stackAutomationContext = buildStackAutomationContext(stackAutomation);\r\n const mcpVerifierState = await deps.getMcpVerifierState?.();\r\n const verificationLayer = runVerificationLayer({\r\n workspaceRoot: input.workspaceRoot,\r\n scan,\r\n stackWiring,\r\n repositoryEvidence,\r\n mcpVerifierState\r\n });\r\n const providerTruth = buildProviderTruthSnapshot({\r\n scan,\r\n choices: productionConnectionChoices,\r\n mcpVerifierState,\r\n verificationLayer\r\n });\r\n const missionGraph = buildMissionGraph({\r\n stackWiring,\r\n repositoryEvidence,\r\n staticInfrastructureFlowGraph,\r\n verificationLayer\r\n });\r\n const specContent = await readSpec(input.workspaceRoot);\r\n const modelPrompt = buildAnalysisPrompt(\r\n scan,\r\n specContent,\r\n productionConnectionContext,\r\n verificationEvidenceContext,\r\n stackWiringContext,\r\n stackAutomationContext\r\n );\r\n\r\n const managedToken = await deps.getManagedAccessToken?.();\r\n let managedResponse: ManagedStationResponse | undefined;\r\n\r\n if (managedToken && deps.runManagedStation) {\r\n try {\r\n managedResponse = await deps.runManagedStation(managedToken, {\r\n prompt: modelPrompt,\r\n workspacePath: input.workspaceRoot,\r\n specMarkdown: specContent.trim().length > 0 ? specContent : null,\r\n files: scan.files\r\n .filter((f) => !f.isSecret && f.content !== null)\r\n .slice(0, 20)\r\n .map((f) => ({\r\n path: f.path,\r\n summary: f.content!.slice(0, 200),\r\n heat: f.heat >= 7 ? 'hot' : f.heat >= 4 ? 'warm' : 'cool',\r\n })),\r\n });\r\n } catch (error) {\r\n if (error instanceof BackendHttpError && error.status === 402) {\r\n return {\n kind: 'scan_limit_reached',\n upgradeUrl: error.upgradeUrl ?? 'https://viberaven.dev/account'\n };\n }\r\n if (error instanceof BackendHttpError && error.status === 401) {\r\n return {\r\n kind: 'managed_session_invalid',\r\n message:\r\n 'VibeRaven returned 401 Unauthorized for this scan. Your saved sign-in no longer matches the managed API. Use VibeRaven: Sign Out, then VibeRaven: Sign In again.'\r\n };\r\n }\r\n if (isNetworkFetchFailure(error)) {\r\n if (!allowLocal) {\r\n return {\r\n kind: 'managed_required',\r\n message:\r\n 'Could not reach the VibeRaven managed API. This is not a Pro-only restriction \u2014 Free accounts include two managed scans once the server is reachable. Check your connection, then retry.'\r\n };\r\n }\r\n // fall through to BYOK below\r\n } else {\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n if (managedResponse !== undefined) {\r\n const raw: Partial<ModelStationOutput> = adaptManagedStationResponse(managedResponse);\r\n const normalized = normalizeModelOutput(raw);\r\n const scanContext = computeStationScanContext(scan);\r\n const launchValidation = buildLaunchValidationReport({\r\n model: normalized,\r\n providerTruth,\r\n missionGraph,\r\n gaps: normalized.gaps\r\n });\r\n return {\r\n ...normalized,\r\n scannedFiles: scan.files,\r\n scanContext,\r\n providerRegistry,\r\n productionConnections,\r\n verificationSummary,\r\n stackWiring,\r\n stackAutomation,\r\n repositoryEvidence,\r\n providerTruth,\r\n launchValidation,\r\n missionGraph,\r\n staticInfrastructureFlowGraph,\r\n usage: managedResponse.usage\r\n };\r\n }\r\n\r\n if (!allowLocal) {\r\n return {\r\n kind: 'managed_required',\r\n message:\r\n managedToken && deps.runManagedStation\r\n ? 'Managed scan could not complete. Sign in again or check your VibeRaven backend URL.'\r\n : 'Sign in to VibeRaven (VibeRaven: Sign In) to run managed scans. Local-only API keys are disabled in this build unless you turn on \u201CAllow local Station without managed account\u201D in settings.'\r\n };\r\n }\r\n\r\n const raw: Partial<ModelStationOutput> = await deps.fetchStationOutput(modelPrompt, input.configuration);\r\n const normalized = normalizeModelOutput(raw);\r\n const scanContext = computeStationScanContext(scan);\r\n const launchValidation = buildLaunchValidationReport({\r\n model: normalized,\r\n providerTruth,\r\n missionGraph,\r\n gaps: normalized.gaps\r\n });\r\n\r\n return {\r\n ...normalized,\r\n scannedFiles: scan.files,\r\n scanContext,\r\n providerRegistry,\r\n productionConnections,\r\n verificationSummary,\r\n stackWiring,\r\n stackAutomation,\r\n repositoryEvidence,\r\n providerTruth,\r\n launchValidation,\r\n missionGraph,\r\n staticInfrastructureFlowGraph\r\n };\r\n },\r\n };\r\n}\r\n\r\nasync function readSpec(workspaceRoot: string): Promise<string> {\r\n try {\r\n return await fs.readFile(join(workspaceRoot, 'SPEC.md'), 'utf-8');\r\n } catch {\r\n return '';\r\n }\r\n}\r\n\r\nasync function loadProductionConnectionChoices(\r\n deps: StationOrchestratorDeps\r\n): Promise<ProductionConnectionChoices> {\r\n try {\r\n return normalizeProductionChoice(await deps.getProductionConnectionChoices?.());\r\n } catch {\r\n return normalizeProductionChoice(undefined);\r\n }\r\n}\r\n", "/** Stack-map provider choices \u2014 keep in sync with `STACK_MAP_PROVIDER_OPTIONS` in `media/station.js`. */\r\n\r\nexport type StackMapProviderOption = {\r\n name: string;\r\n toolName: string;\r\n description: string;\r\n};\r\n\r\nexport const STACK_MAP_PROVIDER_OPTIONS: Record<string, StackMapProviderOption[]> = {\r\n appFlow: [\r\n { name: 'Figma', toolName: 'Figma', description: 'Map flows, screens, and onboarding states' },\r\n { name: 'Storybook', toolName: 'Storybook', description: 'Component states and UI variants' },\r\n { name: 'Product Spec', toolName: 'product-spec', description: 'PRD, acceptance criteria, and success goals' },\r\n { name: 'Route Map', toolName: 'route-map', description: 'Routes, navigation, and protected paths' }\r\n ],\r\n frontend: [\r\n { name: 'React', toolName: 'React', description: 'Component UI and client state' },\r\n { name: 'Vue', toolName: 'Vue', description: 'Vue or Nuxt product UI' },\r\n { name: 'Svelte', toolName: 'Svelte', description: 'SvelteKit routes and components' },\r\n { name: 'Angular', toolName: 'Angular', description: 'Angular components and router' }\r\n ],\r\n backend: [\r\n { name: 'Node.js', toolName: 'Node.js', description: 'API routes and server behavior' },\r\n { name: 'Python / FastAPI', toolName: 'Python', description: 'Python API services and validation' },\r\n { name: 'Rails', toolName: 'Rails', description: 'Rails routes, controllers, and models' },\r\n { name: 'Go', toolName: 'Go', description: 'Go HTTP handlers and services' }\r\n ],\r\n security: [\r\n { name: 'Rate limiting', toolName: 'rate-limit', description: 'Protect API routes from abuse and retry loops' },\r\n { name: 'Bot protection', toolName: 'bot protection', description: 'Screen bots before expensive flows' },\r\n { name: 'Secrets hygiene', toolName: 'secrets hygiene', description: 'Keep env examples and secret files safe' }\r\n ],\r\n auth: [\r\n { name: 'Clerk', toolName: 'Clerk', description: 'Managed auth' },\r\n { name: 'Auth.js', toolName: 'Auth.js', description: 'Framework auth' },\r\n { name: 'Supabase Auth', toolName: 'Supabase Auth', description: 'Auth with Supabase' },\r\n { name: 'Auth0', toolName: 'Auth0', description: 'Enterprise identity and social login' },\r\n { name: 'Better Auth', toolName: 'better-auth', description: 'Type-safe auth in your codebase' }\r\n ],\r\n database: [\r\n { name: 'Supabase', toolName: 'Supabase', description: 'Postgres + auth + storage' },\r\n { name: 'Neon', toolName: 'Neon', description: 'Serverless Postgres' },\r\n { name: 'Turso', toolName: 'Turso', description: 'Edge SQLite' },\r\n { name: 'MongoDB', toolName: 'MongoDB', description: 'Document database' },\r\n { name: 'PlanetScale', toolName: 'PlanetScale', description: 'Serverless MySQL' }\r\n ],\r\n payments: [\r\n { name: 'Stripe', toolName: 'Stripe', description: 'Global standard' },\r\n { name: 'Paddle', toolName: 'Paddle', description: 'MoR subscriptions' },\r\n { name: 'Polar', toolName: 'Polar', description: 'Developer-native MoR billing' },\r\n { name: 'Lemon Squeezy', toolName: 'Lemon Squeezy', description: 'Digital products and SaaS billing' }\r\n ],\r\n deployment: [\r\n { name: 'Vercel', toolName: 'Vercel', description: 'Preview, env, domains' },\r\n { name: 'Netlify', toolName: 'Netlify', description: 'Static and serverless deploy' },\r\n { name: 'Render', toolName: 'Render', description: 'Simple web services and background jobs' },\r\n { name: 'Railway', toolName: 'Railway', description: 'Fast deploy loops and managed infra' },\r\n { name: 'Cloudflare', toolName: 'Cloudflare', description: 'Pages, Workers, DNS, and edge stack' },\r\n { name: 'AWS', toolName: 'AWS', description: 'Cloud infrastructure' }\r\n ],\r\n landing: [\r\n { name: 'Supabase', toolName: 'Supabase', description: 'Waitlist and onboarding data' },\r\n { name: 'PostHog', toolName: 'PostHog', description: 'Activation tracking' }\r\n ],\r\n monitoring: [\r\n { name: 'Sentry', toolName: 'Sentry', description: 'Errors and replay' },\r\n { name: 'PostHog', toolName: 'PostHog', description: 'Analytics and events' },\r\n { name: 'LogRocket', toolName: 'LogRocket', description: 'Session replay' }\r\n ],\r\n testing: [\r\n { name: 'Vitest', toolName: 'Vitest', description: 'Unit coverage' },\r\n { name: 'Playwright', toolName: 'Playwright', description: 'Browser flows' },\r\n { name: 'GitHub', toolName: 'GitHub', description: 'Actions CI and PR checks' },\r\n { name: 'GitLab', toolName: 'GitLab', description: 'Pipelines and merge checks' }\r\n ],\r\n errorHandling: [\r\n { name: 'Sentry', toolName: 'Sentry', description: 'Exception capture' },\r\n { name: 'PostHog', toolName: 'PostHog', description: 'Error events' }\r\n ]\r\n};\r\n\r\nexport function stackMapProviderOptionsForArea(\r\n areaKey: string\r\n): Array<{ provider: string; label: string; description: string }> {\r\n const rows = STACK_MAP_PROVIDER_OPTIONS[areaKey] ?? [];\r\n return rows.slice(0, 6).map((row) => ({\r\n provider: row.toolName,\r\n label: row.name,\r\n description: row.description\r\n }));\r\n}\r\n", "import { stackMapProviderOptionsForArea } from '../../../../src/station/stackMapProviderOptions';\r\nimport type { CliScanArtifact } from '../types';\r\n\r\nconst STACK_MAP_AREAS = [\r\n 'appFlow',\r\n 'frontend',\r\n 'backend',\r\n 'auth',\r\n 'database',\r\n 'payments',\r\n 'deployment',\r\n 'monitoring',\r\n 'security',\r\n 'testing',\r\n 'landing',\r\n 'errorHandling'\r\n] as const;\r\n\r\n/** Ensures report UI has the same provider lists as the VS Code extension (stack map). */\r\nexport function hydrateArtifactForReport(artifact: CliScanArtifact): CliScanArtifact {\r\n const providerOptions = { ...(artifact.providerOptions ?? {}) };\r\n for (const area of STACK_MAP_AREAS) {\r\n providerOptions[area] = stackMapProviderOptionsForArea(area);\r\n }\r\n return { ...artifact, providerOptions };\r\n}\r\n", "import { join } from 'node:path';\r\nimport { deepScanWorkspace } from '../../../src/station/fileScanner';\r\nimport {\r\n createStationOrchestrator,\r\n isManagedRequiredResult,\r\n isManagedSessionInvalidResult,\r\n isScanLimitResult,\r\n type StationRunResult\r\n} from '../../../src/station/orchestrator';\r\nimport { runManagedStation } from '../../../src/station/backendClient';\r\nimport type { ProductionConnectionChoices } from '../../../src/station/productionConnections';\r\nimport { hydrateArtifactForReport } from './report/hydrateArtifact';\r\nimport type { CliScanArtifact, StationRunSuccess } from './types';\r\nimport { loadStackChoicesFile } from './config';\r\n\r\nfunction computeProductionCorePercent(missionGraph: StationRunResult['missionGraph']): number {\r\n const areas = missionGraph.areas ?? [];\r\n if (areas.length === 0) {\r\n return 0;\r\n }\r\n const sum = areas.reduce((acc, area) => acc + (area.readinessPercent ?? 0), 0);\r\n return Math.round(sum / areas.length);\r\n}\r\n\r\nfunction toArtifact(\r\n workspacePath: string,\r\n result: StationRunSuccess,\r\n selectedProviders: Record<string, string>\r\n): CliScanArtifact {\r\n const artifact: CliScanArtifact = {\r\n version: 1,\r\n scannedAt: new Date().toISOString(),\r\n workspacePath,\r\n score: result.score,\r\n scoreLabel: result.scoreLabel,\r\n summary: result.summary,\r\n archetype: result.archetype,\r\n gaps: result.gaps,\r\n missionGraph: result.missionGraph,\r\n stackWiring: result.stackWiring,\r\n stackAutomation: result.stackAutomation,\r\n providerRegistry: result.providerRegistry,\r\n verificationSummary: result.verificationSummary,\r\n productionCorePercent: computeProductionCorePercent(result.missionGraph),\r\n selectedProviders,\r\n usage: result.usage\r\n };\r\n\r\n if (result.providerTruth) {\r\n artifact.providerTruth = result.providerTruth;\r\n }\r\n if (result.launchValidation) {\r\n artifact.launchValidation = result.launchValidation;\r\n }\r\n\r\n return artifact;\r\n}\r\n\r\nasync function loadProductionChoices(workspacePath: string): Promise<ProductionConnectionChoices | undefined> {\r\n const file = await loadStackChoicesFile(workspacePath);\r\n if (Object.keys(file.choices).length === 0) {\r\n return undefined;\r\n }\r\n // The orchestrator normalizes this shape via `normalizeProductionChoice`.\r\n return file as unknown as ProductionConnectionChoices;\r\n}\r\n\r\nexport type RunScanOptions = {\r\n workspacePath?: string;\r\n accessToken: string;\r\n apiBaseUrl: string;\r\n};\r\n\r\nexport type RunScanResult =\r\n | { ok: true; artifact: CliScanArtifact }\r\n | { ok: false; kind: 'scan_limit'; upgradeUrl: string }\r\n | { ok: false; kind: 'auth_required'; message: string }\r\n | { ok: false; kind: 'session_invalid'; message: string }\r\n | { ok: false; kind: 'error'; message: string };\r\n\r\nexport async function runProjectScan(options: RunScanOptions): Promise<RunScanResult> {\r\n const workspacePath = options.workspacePath ?? process.cwd();\r\n const orchestrator = createStationOrchestrator({\r\n scanWorkspace: (root) => deepScanWorkspace(root),\r\n getManagedAccessToken: async () => options.accessToken,\r\n runManagedStation: async (token, payload) => runManagedStation(options.apiBaseUrl, token, payload),\r\n getProductionConnectionChoices: () => loadProductionChoices(workspacePath),\r\n isLocalStationFallbackAllowed: async () => false,\r\n fetchStationOutput: async () => {\r\n throw new Error('Local OpenAI fallback is disabled in the CLI. Use `viberaven login`.');\r\n }\r\n });\r\n\r\n try {\r\n const result = await orchestrator.run({\r\n workspaceRoot: workspacePath,\r\n prompt: 'Full station scan for CLI launch report',\r\n configuration: undefined\r\n });\r\n\r\n if (isScanLimitResult(result)) {\r\n return { ok: false, kind: 'scan_limit', upgradeUrl: result.upgradeUrl };\r\n }\r\n if (isManagedRequiredResult(result)) {\r\n return { ok: false, kind: 'auth_required', message: result.message };\r\n }\r\n if (isManagedSessionInvalidResult(result)) {\r\n return { ok: false, kind: 'session_invalid', message: result.message };\r\n }\r\n\r\n const stackFile = await loadStackChoicesFile(workspacePath);\r\n const selectedProviders: Record<string, string> = {};\r\n for (const [area, choice] of Object.entries(stackFile.choices)) {\r\n if (choice && typeof choice.provider === 'string') {\r\n selectedProviders[area] = choice.provider;\r\n }\r\n }\r\n const artifact = hydrateArtifactForReport(\r\n toArtifact(workspacePath, result as StationRunSuccess, selectedProviders)\r\n );\r\n return { ok: true, artifact };\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error);\r\n return { ok: false, kind: 'error', message };\r\n }\r\n}\r\n\r\nexport function defaultPromptPath(workspacePath: string): string {\r\n return join(workspacePath, '.viberaven', 'last-scan.json');\r\n}\r\n", "import type { Gap } from '../../../../src/station/types';\nimport type { CapabilityKey, CapabilityStatus } from '../contracts/status';\n\nexport function gapText(gap: Gap): string {\n return `${gap.id} ${gap.title} ${gap.detail} ${gap.primaryMapCategory}`.toLowerCase();\n}\n\nexport function statusForGaps(gaps: Gap[]): CapabilityStatus {\n if (gaps.some((gap) => gap.severity === 'critical')) return 'critical';\n if (gaps.some((gap) => gap.severity === 'warning')) return 'warning';\n if (gaps.length > 0) return 'warning';\n return 'unknown';\n}\n\nexport function unique(values: string[]): string[] {\n return Array.from(new Set(values)).sort();\n}\n\nexport function capabilityFromArea(area: string): CapabilityKey | undefined {\n const normalized = area.toLowerCase();\n if (normalized.includes('database')) return 'database';\n if (normalized.includes('security') || normalized.includes('auth')) return 'security';\n if (normalized.includes('payment')) return 'payments';\n if (normalized.includes('webhook')) return 'webhooks';\n if (normalized.includes('deploy') || normalized.includes('runtime')) return 'scaling';\n return undefined;\n}\n", "import type { CapabilityPack } from './types';\nimport { gapText } from './classify';\n\nexport const databasePack: CapabilityPack = {\n key: 'database',\n classify(gap) {\n const text = gapText(gap);\n return /database|supabase|rls|migration|postgres|pooler|query/.test(text);\n },\n riskTags(gap) {\n const text = gapText(gap);\n return [\n text.includes('rls') ? 'rls' : '',\n text.includes('migration') ? 'migration' : '',\n text.includes('pooler') || text.includes('5432') || text.includes('6543') ? 'connection-pooling' : '',\n ].filter(Boolean);\n },\n};\n", "import type { CapabilityPack } from './types';\nimport { gapText } from './classify';\n\nexport const paymentsPack: CapabilityPack = {\n key: 'payments',\n classify(gap) {\n const text = gapText(gap);\n return /payment|stripe|checkout|billing|entitlement|subscription|refund|cancel/.test(text);\n },\n riskTags(gap) {\n const text = gapText(gap);\n return [\n text.includes('entitlement') ? 'entitlement-source' : '',\n text.includes('checkout') ? 'checkout-flow' : '',\n text.includes('refund') || text.includes('cancel') ? 'lifecycle-state' : '',\n ].filter(Boolean);\n },\n};\n", "import type { CapabilityPack } from './types';\nimport { gapText } from './classify';\n\nexport const scalingPack: CapabilityPack = {\n key: 'scaling',\n classify(gap) {\n const text = gapText(gap);\n return /serverless|vercel|pooler|rate limit|rate-limit|cache|queue|cron|worker|runtime|connection/.test(text);\n },\n riskTags(gap) {\n const text = gapText(gap);\n return [\n text.includes('serverless') || text.includes('vercel') ? 'serverless' : '',\n text.includes('pooler') || text.includes('connection') ? 'db-connection' : '',\n text.includes('rate limit') || text.includes('rate-limit') ? 'rate-limit' : '',\n ].filter(Boolean);\n },\n};\n", "import type { CapabilityPack } from './types';\nimport { gapText } from './classify';\n\nexport const securityPack: CapabilityPack = {\n key: 'security',\n classify(gap) {\n const text = gapText(gap);\n return /secret|service role|token|api key|auth|authorization|browser-exposed|cors|csrf|session/.test(text);\n },\n riskTags(gap) {\n const text = gapText(gap);\n return [\n text.includes('secret') || text.includes('api key') || text.includes('service role') ? 'secret-boundary' : '',\n text.includes('auth') || text.includes('authorization') ? 'auth-boundary' : '',\n text.includes('browser') ? 'browser-exposure' : '',\n ].filter(Boolean);\n },\n};\n", "import type { CapabilityPack } from './types';\nimport { gapText } from './classify';\n\nexport const webhooksPack: CapabilityPack = {\n key: 'webhooks',\n classify(gap) {\n const text = gapText(gap);\n return /webhook|signature|idempotency|retry|replay|dead-letter/.test(text);\n },\n riskTags(gap) {\n const text = gapText(gap);\n return [\n text.includes('signature') ? 'signature' : '',\n text.includes('idempotency') ? 'idempotency' : '',\n text.includes('retry') || text.includes('dead-letter') ? 'retry-semantics' : '',\n ].filter(Boolean);\n },\n};\n", "import type { Gap } from '../../../../src/station/types';\nimport type { CapabilityKey } from '../contracts/status';\nimport { capabilityFromArea, statusForGaps, unique } from './classify';\nimport { databasePack } from './database';\nimport { paymentsPack } from './payments';\nimport { scalingPack } from './scaling';\nimport { securityPack } from './security';\nimport { webhooksPack } from './webhooks';\nimport type { CapabilityPack, CapabilitySummary } from './types';\n\nconst PACKS: CapabilityPack[] = [scalingPack, securityPack, webhooksPack, paymentsPack, databasePack];\n\nexport function classifyGapCapability(gap: Gap): CapabilityKey {\n const direct = PACKS.find((pack) => pack.classify(gap));\n if (direct) return direct.key;\n return capabilityFromArea(String(gap.primaryMapCategory)) ?? 'security';\n}\n\nexport function summarizeCapabilities(gaps: Gap[]): CapabilitySummary {\n const result = Object.fromEntries(\n PACKS.map((pack) => [\n pack.key,\n { key: pack.key, status: 'unknown' as const, topGapIds: [], evidenceCount: 0, riskTags: [] },\n ]),\n ) as unknown as CapabilitySummary;\n\n for (const pack of PACKS) {\n const matching = gaps.filter((gap) => classifyGapCapability(gap) === pack.key);\n result[pack.key] = {\n key: pack.key,\n status: statusForGaps(matching),\n topGapIds: matching.slice(0, 5).map((gap) => gap.id),\n evidenceCount: matching.length,\n riskTags: unique(matching.flatMap((gap) => pack.riskTags(gap))),\n };\n }\n\n return result;\n}\n\nexport type { CapabilitySummary };\n", "import type { CliScanArtifact } from '../types';\nimport { summarizeCapabilities } from '../capabilities';\nimport {\n PUBLIC_NEXT_JSON_COMMAND,\n PUBLIC_STRICT_COMMAND,\n PUBLIC_VERIFY_COMMAND,\n promptGapCommand,\n} from './commands';\n\nexport type ContextMap = {\n $schema: 'https://viberaven.dev/schemas/context-map.schema.json';\n schemaVersion: 'v1';\n generatedAt: string;\n workspace: {\n root: string;\n packageManager: string;\n languages: string[];\n frameworks: string[];\n };\n agentContract: {\n readFirst: string;\n machineResult: string;\n contextMap: string;\n verifyCommand: string;\n strictCommand: string;\n nextCommand: string;\n };\n stack: {\n deployment: string[];\n database: string[];\n auth: string[];\n payments: string[];\n monitoring: string[];\n };\n capabilityGraph: ReturnType<typeof summarizeCapabilities>;\n productionGate: {\n status: string;\n criticalCount: number;\n warningCount: number;\n providerDashboardChecksRequired: boolean;\n };\n topGaps: Array<{\n id: string;\n severity: string;\n title: string;\n area: string;\n promptCommand: string;\n }>;\n};\n\nexport function generateContextMap(artifact: CliScanArtifact): ContextMap {\n const criticalCount = artifact.gaps.filter((gap) => gap.severity === 'critical').length;\n const warningCount = artifact.gaps.filter((gap) => gap.severity === 'warning').length;\n return {\n $schema: 'https://viberaven.dev/schemas/context-map.schema.json',\n schemaVersion: 'v1',\n generatedAt: artifact.scannedAt,\n workspace: {\n root: artifact.workspacePath,\n packageManager: 'unknown',\n languages: ['typescript'],\n frameworks: artifact.archetype ? [artifact.archetype] : [],\n },\n agentContract: {\n readFirst: '.viberaven/agent-tasklist.md',\n machineResult: '.viberaven/gate-result.json',\n contextMap: '.viberaven/context-map.json',\n verifyCommand: PUBLIC_VERIFY_COMMAND,\n strictCommand: PUBLIC_STRICT_COMMAND,\n nextCommand: PUBLIC_NEXT_JSON_COMMAND,\n },\n stack: {\n deployment: artifact.selectedProviders?.deployment ? [artifact.selectedProviders.deployment] : [],\n database: artifact.selectedProviders?.database ? [artifact.selectedProviders.database] : [],\n auth: artifact.selectedProviders?.auth ? [artifact.selectedProviders.auth] : [],\n payments: artifact.selectedProviders?.payments ? [artifact.selectedProviders.payments] : [],\n monitoring: artifact.selectedProviders?.monitoring ? [artifact.selectedProviders.monitoring] : [],\n },\n capabilityGraph: summarizeCapabilities(artifact.gaps),\n productionGate: {\n status: criticalCount > 0 ? 'not_clear' : warningCount > 0 ? 'warning' : 'clear',\n criticalCount,\n warningCount,\n providerDashboardChecksRequired: true,\n },\n topGaps: artifact.gaps.slice(0, 10).map((gap) => ({\n id: gap.id,\n severity: gap.severity,\n title: gap.title,\n area: String(gap.primaryMapCategory),\n promptCommand: promptGapCommand(gap.id),\n })),\n };\n}\n", "import type { CliScanArtifact } from '../types';\nimport { summarizeCapabilities } from '../capabilities';\nimport type { CapabilityKey, GateStatus } from './status';\nimport {\n PUBLIC_NEXT_JSON_COMMAND,\n PUBLIC_STRICT_COMMAND,\n PUBLIC_VERIFY_COMMAND,\n promptGapCommand,\n} from './commands';\n\nexport type GateResultMode = 'scan' | 'verify' | 'strict' | 'agent-mode' | 'condense' | 'error';\n\nexport type GateResult = {\n $schema: 'https://viberaven.dev/schemas/gate-result.schema.json';\n schemaVersion: 'v1';\n runId: string;\n mode: GateResultMode;\n generatedAt: string;\n workspace: {\n root: string;\n packageManager: string;\n languages: string[];\n frameworks: string[];\n };\n gate: {\n status: GateStatus;\n criticalCount: number;\n warningCount: number;\n providerBoundaryRequired: boolean;\n };\n capabilities: Record<CapabilityKey, string>;\n topGapIds: string[];\n artifacts: {\n tasklist: string;\n contextMap: string;\n gateResult: string;\n gapsDir: string;\n healDir: string;\n };\n commands: {\n verify: string;\n strict: string;\n next: string;\n promptFirstGap?: string;\n };\n redaction: {\n applied: boolean;\n count: number;\n };\n /** Populated only when --agent-mode flag is set. Tells the agent what to do next. */\n nextAction?: {\n gapId?: string;\n type: string;\n title: string;\n mcpTool?: string;\n mcpArgs?: Record<string, unknown>;\n requiresUserAction: boolean;\n batchSize: number;\n batchApplied: number;\n scanNow: boolean;\n stalled: boolean;\n stalledScans: number;\n };\n};\n\nfunction gateStatus(criticalCount: number, warningCount: number): GateStatus {\n if (criticalCount > 0) return 'not_clear';\n if (warningCount > 0) return 'warning';\n return 'clear';\n}\n\nfunction runIdFrom(scannedAt: string): string {\n return `vr_${scannedAt.replace(/\\D/g, '').slice(0, 14) || 'scan'}`;\n}\n\nexport function generateGateResult(\n artifact: CliScanArtifact,\n options: { mode?: GateResultMode; redactionCount?: number } = {}\n): GateResult {\n const criticalCount = artifact.gaps.filter((gap) => gap.severity === 'critical').length;\n const warningCount = artifact.gaps.filter((gap) => gap.severity === 'warning').length;\n const capabilities = summarizeCapabilities(artifact.gaps);\n const topGapIds = artifact.gaps.slice(0, 10).map((gap) => gap.id);\n const firstGapId = topGapIds[0];\n\n return {\n $schema: 'https://viberaven.dev/schemas/gate-result.schema.json',\n schemaVersion: 'v1',\n runId: runIdFrom(artifact.scannedAt),\n mode: options.mode ?? 'scan',\n generatedAt: artifact.scannedAt,\n workspace: {\n root: artifact.workspacePath,\n packageManager: 'unknown',\n languages: ['typescript'],\n frameworks: artifact.archetype ? [artifact.archetype] : [],\n },\n gate: {\n status: gateStatus(criticalCount, warningCount),\n criticalCount,\n warningCount,\n providerBoundaryRequired: true,\n },\n capabilities: {\n scaling: capabilities.scaling.status,\n security: capabilities.security.status,\n webhooks: capabilities.webhooks.status,\n payments: capabilities.payments.status,\n database: capabilities.database.status,\n },\n topGapIds,\n artifacts: {\n tasklist: '.viberaven/agent-tasklist.md',\n contextMap: '.viberaven/context-map.json',\n gateResult: '.viberaven/gate-result.json',\n gapsDir: '.viberaven/gaps',\n healDir: '.viberaven/heal',\n },\n commands: {\n verify: PUBLIC_VERIFY_COMMAND,\n strict: PUBLIC_STRICT_COMMAND,\n next: PUBLIC_NEXT_JSON_COMMAND,\n ...(firstGapId ? { promptFirstGap: promptGapCommand(firstGapId) } : {}),\n },\n redaction: {\n applied: (options.redactionCount ?? 0) > 0,\n count: options.redactionCount ?? 0,\n },\n };\n}\n", "import type { Gap } from '../../../../src/station/types';\nimport type { CliScanArtifact } from '../types';\nimport { classifyGapCapability } from '../capabilities';\nimport { healPlanGapCommand, promptGapCommand, PUBLIC_VERIFY_COMMAND } from './commands';\n\nexport type GapEvidenceFile = {\n path: string;\n content: {\n $schema: 'https://viberaven.dev/schemas/gap.schema.json';\n schemaVersion: 'v1';\n id: string;\n severity: Gap['severity'];\n capability: ReturnType<typeof classifyGapCapability>;\n title: string;\n summary: string;\n evidence: Array<{ file?: string; kind: string; redacted: boolean }>;\n commands: {\n prompt: string;\n healPlan: string;\n verify: string;\n };\n providerBoundary: {\n requiresDashboardCheck: boolean;\n reason: string;\n };\n };\n};\n\nfunction summarizeGap(gap: Gap): string {\n return `${gap.title}. See the tasklist and original scan for redacted detail.`;\n}\n\nexport function generateGapEvidenceFiles(artifact: CliScanArtifact): GapEvidenceFile[] {\n return artifact.gaps.slice(0, 50).map((gap) => ({\n path: `.viberaven/gaps/${gap.id}.json`,\n content: {\n $schema: 'https://viberaven.dev/schemas/gap.schema.json',\n schemaVersion: 'v1',\n id: gap.id,\n severity: gap.severity,\n capability: classifyGapCapability(gap),\n title: gap.title,\n summary: summarizeGap(gap),\n evidence: [{ kind: String(gap.primaryMapCategory), redacted: true }],\n commands: {\n prompt: promptGapCommand(gap.id),\n healPlan: healPlanGapCommand(gap.id),\n verify: PUBLIC_VERIFY_COMMAND,\n },\n providerBoundary: {\n requiresDashboardCheck: true,\n reason: 'Repo evidence cannot prove live provider dashboard state.',\n },\n },\n }));\n}\n", "import type { DeployProviderArea } from './deploy';\r\n\r\n/** Web deploy launch map lane keys (`landing/src/data/stackCatalog.ts`). */\r\nexport type WebStackLaneKey =\r\n | 'appflow'\r\n | 'frontend'\r\n | 'backend'\r\n | 'auth'\r\n | 'database'\r\n | 'payments'\r\n | 'deploy'\r\n | 'monitoring'\r\n | 'analytics'\r\n | 'security'\r\n | 'testing'\r\n | 'onboarding';\r\n\r\n/** Extension Station production map category keys (`media/station.js` PRODUCTION_MAP_CATEGORIES). */\r\nexport type ExtensionMapCategoryKey =\r\n | 'appFlow'\r\n | 'frontend'\r\n | 'backend'\r\n | 'auth'\r\n | 'database'\r\n | 'payments'\r\n | 'deployment'\r\n | 'monitoring'\r\n | 'security'\r\n | 'testing'\r\n | 'landing'\r\n | 'errorHandling';\r\n\r\nexport type ProductionMapLane = {\r\n webKey: WebStackLaneKey;\r\n extensionKey: ExtensionMapCategoryKey;\r\n title: string;\r\n deployArea?: DeployProviderArea;\r\n};\r\n\r\n/**\r\n * Canonical 12-lane alignment between web deploy UI and extension Station map.\r\n *\r\n * Ordered by extension key (matches `PRODUCTION_MAP_CATEGORIES` in `media/station.js`).\r\n *\r\n * Renamed keys (same lane, different identifiers):\r\n * - web `deploy` \u2194 extension `deployment`\r\n * - web `onboarding` \u2194 extension `landing`\r\n *\r\n * Monitoring / analytics split (web has two lanes; extension categories differ):\r\n * - Web `analytics` \u2194 extension `monitoring` \u2014 extension label is \"Monitoring / Analytics\"\r\n * and covers PostHog-style product telemetry.\r\n * - Web `monitoring` \u2194 extension `errorHandling` \u2014 web lane focuses on Sentry / LogRocket\r\n * observability; extension `errorHandling` covers reliability and error-boundary work.\r\n */\r\nexport const PRODUCTION_MAP_LANES: readonly ProductionMapLane[] = [\r\n { webKey: 'appflow', extensionKey: 'appFlow', title: 'App flow / UX' },\r\n { webKey: 'frontend', extensionKey: 'frontend', title: 'Frontend' },\r\n { webKey: 'backend', extensionKey: 'backend', title: 'Backend / API' },\r\n { webKey: 'auth', extensionKey: 'auth', title: 'Auth', deployArea: 'auth' },\r\n { webKey: 'database', extensionKey: 'database', title: 'Database', deployArea: 'database' },\r\n { webKey: 'payments', extensionKey: 'payments', title: 'Payments', deployArea: 'payments' },\r\n { webKey: 'deploy', extensionKey: 'deployment', title: 'Deployment', deployArea: 'deployment' },\r\n { webKey: 'analytics', extensionKey: 'monitoring', title: 'Analytics', deployArea: 'analytics' },\r\n { webKey: 'security', extensionKey: 'security', title: 'Security' },\r\n { webKey: 'testing', extensionKey: 'testing', title: 'Testing' },\r\n { webKey: 'onboarding', extensionKey: 'landing', title: 'Onboarding' },\r\n { webKey: 'monitoring', extensionKey: 'errorHandling', title: 'Monitoring', deployArea: 'monitoring' },\r\n] as const;\r\n\r\nconst WEB_TO_EXTENSION = Object.fromEntries(\r\n PRODUCTION_MAP_LANES.map((lane) => [lane.webKey, lane.extensionKey]),\r\n) as Record<WebStackLaneKey, ExtensionMapCategoryKey>;\r\n\r\nconst EXTENSION_TO_WEB = Object.fromEntries(\r\n PRODUCTION_MAP_LANES.map((lane) => [lane.extensionKey, lane.webKey]),\r\n) as Record<ExtensionMapCategoryKey, WebStackLaneKey>;\r\n\r\nconst TITLE_BY_WEB_KEY = Object.fromEntries(\r\n PRODUCTION_MAP_LANES.map((lane) => [lane.webKey, lane.title]),\r\n) as Record<WebStackLaneKey, string>;\r\n\r\nexport function webLaneToExtensionKey(webKey: WebStackLaneKey): ExtensionMapCategoryKey {\r\n return WEB_TO_EXTENSION[webKey];\r\n}\r\n\r\nexport function extensionKeyToWebLane(extensionKey: ExtensionMapCategoryKey): WebStackLaneKey {\r\n return EXTENSION_TO_WEB[extensionKey];\r\n}\r\n\r\nexport function laneTitleForWebKey(webKey: WebStackLaneKey): string {\r\n return TITLE_BY_WEB_KEY[webKey];\r\n}\r\n\r\nexport function laneDefinitionForWebKey(webKey: WebStackLaneKey): ProductionMapLane {\r\n const lane = PRODUCTION_MAP_LANES.find((entry) => entry.webKey === webKey);\r\n if (!lane) {\r\n throw new Error(`Unknown web stack lane: ${webKey}`);\r\n }\r\n return lane;\r\n}\r\n", "/**\r\n * Launch plan limits (single source of truth for API + extension UI copy).\r\n * Import from `shared/` only \u2014 avoid coupling browser bundles to Node-only paths.\r\n */\r\nimport { PRODUCTION_MAP_LANES, type ExtensionMapCategoryKey } from './productionMapLanes';\r\n\r\nexport const FREE_TRIAL_TOTAL_STATION_RUNS = 2;\r\n\r\nexport const PRO_MONTHLY_STATION_RUNS = 50;\r\n\r\n/** Production map category keys \u2014 must match `PRODUCTION_MAP_CATEGORIES[].key` in `media/station.js`. */\r\nexport const FREE_TRIAL_UNLOCKED_MAP_CATEGORY_KEYS = [\r\n 'appFlow',\r\n 'frontend',\r\n 'backend',\r\n 'auth',\r\n 'database',\r\n 'payments'\r\n] as const;\r\n\r\n/** Extension Station keys \u2014 derived from `PRODUCTION_MAP_LANES` (see `shared/productionMapLanes.ts`). */\r\nexport const PRODUCTION_MAP_CATEGORY_KEYS_ALL = PRODUCTION_MAP_LANES.map(\r\n (lane) => lane.extensionKey,\r\n) as readonly ExtensionMapCategoryKey[];\r\n\r\n/** Web deploy launch map uses `webKey` from the same `PRODUCTION_MAP_LANES` module. */\r\n\r\nexport type ProductionMapCategoryKey = (typeof PRODUCTION_MAP_CATEGORY_KEYS_ALL)[number];\r\n", "import type { MissionCheck } from '../../../../src/station/types';\r\n\r\nexport const CHECK_TO_PLAYBOOK: Record<string, string> = {\r\n 'vercel-deployment': 'vercel',\r\n 'vercel-project': 'vercel',\r\n 'supabase-project': 'supabase',\r\n 'supabase-env': 'supabase',\r\n 'stripe-webhook': 'stripe',\r\n 'stripe-product': 'stripe',\r\n 'stripe-keys': 'stripe'\r\n};\r\n\r\nexport function mapCheckToPlaybook(check: MissionCheck): string {\r\n if (CHECK_TO_PLAYBOOK[check.id]) {\r\n return CHECK_TO_PLAYBOOK[check.id];\r\n }\r\n const providerKey = check.providerKey.toLowerCase();\r\n if (providerKey.includes('vercel') || check.area === 'deployment') {\r\n return 'vercel';\r\n }\r\n if (providerKey.includes('stripe') || check.area === 'payments') {\r\n return 'stripe';\r\n }\r\n if (providerKey.includes('supabase') && check.area === 'auth') {\r\n return 'auth-supabase';\r\n }\r\n if (providerKey.includes('supabase') || check.area === 'database') {\r\n return 'supabase';\r\n }\r\n if (check.area === 'auth') {\r\n return 'auth-supabase';\r\n }\r\n return 'vercel';\r\n}\r\n", "import { existsSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nexport function playbooksRoot(): string {\r\n const candidates = [join(__dirname, 'playbooks'), join(__dirname, '..', '..', 'playbooks')];\r\n for (const dir of candidates) {\r\n if (existsSync(join(dir, 'vercel.json'))) {\r\n return dir;\r\n }\r\n }\r\n throw new Error('VibeRaven playbooks directory not found (expected vercel.json)');\r\n}\r\n", "export interface PlaybookPasteTarget {\r\n file: string;\r\n keys: string[];\r\n}\r\n\r\nexport interface PlaybookStep {\r\n id: string;\r\n title: string;\r\n instruction: string;\r\n openUrl?: string;\r\n copyValues?: string[];\r\n pasteTarget?: PlaybookPasteTarget;\r\n events?: string[];\r\n}\r\n\r\nexport interface Playbook {\r\n id: string;\r\n provider: string;\r\n title: string;\r\n steps: PlaybookStep[];\r\n}\r\n\r\nexport const PLAYBOOK_PROVIDERS = ['vercel', 'supabase', 'stripe', 'auth-supabase'] as const;\r\n\r\nexport type PlaybookProvider = (typeof PLAYBOOK_PROVIDERS)[number];\r\n", "import type { Playbook, PlaybookStep } from './types';\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction assertStep(step: unknown, index: number): PlaybookStep {\r\n if (!isRecord(step)) {\r\n throw new Error(`Playbook step ${index + 1} must be an object`);\r\n }\r\n if (typeof step.id !== 'string' || !step.id.trim()) {\r\n throw new Error(`Playbook step ${index + 1} missing id`);\r\n }\r\n if (typeof step.title !== 'string' || !step.title.trim()) {\r\n throw new Error(`Playbook step ${index + 1} missing title`);\r\n }\r\n if (typeof step.instruction !== 'string' || !step.instruction.trim()) {\r\n throw new Error(`Playbook step ${index + 1} missing instruction`);\r\n }\r\n const parsed: PlaybookStep = {\r\n id: step.id,\r\n title: step.title,\r\n instruction: step.instruction\r\n };\r\n if (step.openUrl !== undefined) {\r\n if (typeof step.openUrl !== 'string') {\r\n throw new Error(`Playbook step ${step.id} openUrl must be a string`);\r\n }\r\n parsed.openUrl = step.openUrl;\r\n }\r\n if (step.copyValues !== undefined) {\r\n if (!Array.isArray(step.copyValues) || step.copyValues.some((v) => typeof v !== 'string')) {\r\n throw new Error(`Playbook step ${step.id} copyValues must be string[]`);\r\n }\r\n parsed.copyValues = step.copyValues;\r\n }\r\n if (step.events !== undefined) {\r\n if (!Array.isArray(step.events) || step.events.some((v) => typeof v !== 'string')) {\r\n throw new Error(`Playbook step ${step.id} events must be string[]`);\r\n }\r\n parsed.events = step.events;\r\n }\r\n if (step.pasteTarget !== undefined) {\r\n if (!isRecord(step.pasteTarget)) {\r\n throw new Error(`Playbook step ${step.id} pasteTarget must be an object`);\r\n }\r\n const file = step.pasteTarget.file;\r\n const keys = step.pasteTarget.keys;\r\n if (typeof file !== 'string' || !Array.isArray(keys) || keys.some((k) => typeof k !== 'string')) {\r\n throw new Error(`Playbook step ${step.id} pasteTarget invalid`);\r\n }\r\n parsed.pasteTarget = { file, keys };\r\n }\r\n return parsed;\r\n}\r\n\r\nexport function parsePlaybook(raw: unknown): Playbook {\r\n if (!isRecord(raw)) {\r\n throw new Error('Playbook must be an object');\r\n }\r\n if (typeof raw.id !== 'string' || typeof raw.provider !== 'string' || typeof raw.title !== 'string') {\r\n throw new Error('Playbook missing id, provider, or title');\r\n }\r\n if (!Array.isArray(raw.steps) || raw.steps.length === 0) {\r\n throw new Error(`Playbook ${raw.id} must have at least one step`);\r\n }\r\n return {\r\n id: raw.id,\r\n provider: raw.provider,\r\n title: raw.title,\r\n steps: raw.steps.map((step, index) => assertStep(step, index))\r\n };\r\n}\r\n", "import { readFileSync } from 'node:fs';\r\nimport { readFile as readFileAsync } from 'node:fs/promises';\r\nimport { join } from 'node:path';\r\nimport { playbooksRoot } from './playbooksRoot';\r\nimport { PLAYBOOK_PROVIDERS, type Playbook, type PlaybookProvider } from './types';\r\nimport { parsePlaybook } from './validate';\r\n\r\nexport function normalizePlaybookProvider(input: string): PlaybookProvider | undefined {\r\n const key = input.trim().toLowerCase();\r\n if (key === 'auth' || key === 'supabase-auth') {\r\n return 'auth-supabase';\r\n }\r\n return PLAYBOOK_PROVIDERS.find((provider) => provider === key);\r\n}\r\n\r\nexport function listPlaybookProviders(): PlaybookProvider[] {\r\n return [...PLAYBOOK_PROVIDERS];\r\n}\r\n\r\nexport async function loadPlaybook(provider: string): Promise<Playbook> {\r\n const normalized = normalizePlaybookProvider(provider);\r\n if (!normalized) {\r\n throw new Error(\r\n `Unknown provider \"${provider}\". Available: ${PLAYBOOK_PROVIDERS.join(', ')}`\r\n );\r\n }\r\n const path = join(playbooksRoot(), `${normalized}.json`);\r\n const raw = JSON.parse(await readFileAsync(path, 'utf-8')) as unknown;\r\n const playbook = parsePlaybook(raw);\r\n if (playbook.provider !== normalized) {\r\n throw new Error(`Playbook file ${normalized}.json has mismatched provider field`);\r\n }\r\n return playbook;\r\n}\r\n\r\nexport function loadPlaybookSync(provider: string): Playbook {\r\n const normalized = normalizePlaybookProvider(provider);\r\n if (!normalized) {\r\n throw new Error(\r\n `Unknown provider \"${provider}\". Available: ${PLAYBOOK_PROVIDERS.join(', ')}`\r\n );\r\n }\r\n const path = join(playbooksRoot(), `${normalized}.json`);\r\n const raw = JSON.parse(readFileSync(path, 'utf-8')) as unknown;\r\n const playbook = parsePlaybook(raw);\r\n if (playbook.provider !== normalized) {\r\n throw new Error(`Playbook file ${normalized}.json has mismatched provider field`);\r\n }\r\n return playbook;\r\n}\r\n", "import type { ProductionMapCategoryKey } from '../../../../shared/planLimits';\r\nimport type { MissionCheck } from '../../../../src/station/types';\r\nimport type { CliScanArtifact } from '../types';\r\n\r\nexport function isManualProviderCheck(check: MissionCheck): boolean {\r\n return (\r\n check.evidenceClass === 'manual-dashboard' ||\r\n check.evidenceClass === 'mcp-verifier' ||\r\n check.evidenceSource === 'provider' ||\r\n check.evidenceSource === 'mcp' ||\r\n check.status === 'needs-connection' ||\r\n check.status === 'unknown'\r\n );\r\n}\r\n\r\nexport interface ManualCheckRef {\r\n areaLabel: string;\r\n providerLabel: string;\r\n check: MissionCheck;\r\n mapCategory: ProductionMapCategoryKey;\r\n}\r\n\r\nexport function collectManualChecks(artifact: CliScanArtifact): ManualCheckRef[] {\r\n const refs: ManualCheckRef[] = [];\r\n for (const area of artifact.missionGraph.areas ?? []) {\r\n for (const mission of area.providerMissions) {\r\n for (const check of mission.checks) {\r\n if (!isManualProviderCheck(check)) {\r\n continue;\r\n }\r\n refs.push({\r\n areaLabel: area.label,\r\n providerLabel: mission.providerLabel,\r\n check,\r\n mapCategory: area.key\r\n });\r\n }\r\n }\r\n }\r\n return refs;\r\n}\r\n", "import { readFile } from 'node:fs/promises';\r\nimport { join } from 'node:path';\r\nimport { findArtifactsWorkspace, getProjectArtifactsDir } from '../config';\r\nimport type { CliScanArtifact } from '../types';\r\nimport type { Gap } from '../../../../src/station/types';\r\n\r\nexport type PickGapOptions = {\r\n gapId?: string;\r\n provider?: string;\r\n area?: string;\r\n};\r\n\r\nexport type MenuAction =\r\n | 'next'\r\n | 'scan'\r\n | 'gaps'\r\n | 'prompt'\r\n | 'guide'\n | 'open-dashboard'\n | 'open-report'\n | 'agent-rules'\n | 'audit'\n | 'auth'\n | 'exit';\n\r\nconst SEVERITY_RANK: Record<Gap['severity'], number> = {\r\n critical: 0,\r\n warning: 1,\r\n info: 2\r\n};\r\n\r\nexport class ScanNotFoundError extends Error {\r\n constructor(message = 'No scan found. Run a scan first.') {\r\n super(message);\r\n this.name = 'ScanNotFoundError';\r\n }\r\n}\r\n\r\nexport function isScanNotFoundError(error: unknown): error is ScanNotFoundError {\r\n return error instanceof ScanNotFoundError;\r\n}\r\n\r\nexport function needsScanMessage(startDir?: string): string {\r\n const cwd = startDir ?? process.cwd();\r\n return [\r\n 'No CLI scan found for this folder.',\r\n `Looking from: ${cwd}`,\r\n 'Choose \"Scan project\", or run the menu from your repo root (where .viberaven/ lives).',\r\n 'VS Code extension scans stay inside the editor \u2014 run a CLI scan once to create .viberaven/ on disk.'\r\n ].join('\\n');\r\n}\r\n\r\nexport function sortGapsByPriority(gaps: Gap[]): Gap[] {\r\n return [...gaps].sort(\r\n (a, b) =>\r\n SEVERITY_RANK[a.severity] - SEVERITY_RANK[b.severity] || a.title.localeCompare(b.title)\r\n );\r\n}\r\n\r\nexport function pickGap(artifact: CliScanArtifact, options: PickGapOptions = {}): Gap | undefined {\r\n if (options.gapId) {\r\n return artifact.gaps.find((g) => g.id === options.gapId);\r\n }\r\n if (options.provider) {\r\n const key = options.provider.toLowerCase();\r\n return artifact.gaps.find(\r\n (g) =>\r\n g.primaryMapCategory === key ||\r\n g.title.toLowerCase().includes(key) ||\r\n g.id.toLowerCase().includes(key)\r\n );\r\n }\r\n if (options.area) {\r\n return artifact.gaps.find((g) => g.primaryMapCategory === options.area);\r\n }\r\n return sortGapsByPriority(artifact.gaps)[0];\r\n}\r\n\r\nexport function formatTopGapsList(artifact: CliScanArtifact, limit = 10): string {\r\n const sorted = sortGapsByPriority(artifact.gaps);\r\n if (sorted.length === 0) {\r\n return 'No gaps found \u2014 production core looks solid.';\r\n }\r\n return sorted\r\n .slice(0, limit)\r\n .map((gap, index) => {\r\n const severity = gap.severity.toUpperCase().padEnd(8);\r\n const area = gap.primaryMapCategory.padEnd(12);\r\n return `${index + 1}. [${severity}] ${area} ${gap.title}`;\r\n })\r\n .join('\\n');\r\n}\r\n\r\nexport async function loadLastArtifact(startDir: string): Promise<CliScanArtifact> {\r\n const workspace = await findArtifactsWorkspace(startDir);\r\n if (!workspace) {\r\n throw new ScanNotFoundError(needsScanMessage(startDir));\r\n }\r\n const path = join(getProjectArtifactsDir(workspace), 'last-scan.json');\r\n try {\r\n const raw = await readFile(path, 'utf-8');\r\n return JSON.parse(raw) as CliScanArtifact;\r\n } catch {\r\n throw new ScanNotFoundError(needsScanMessage(startDir));\r\n }\r\n}\r\n\r\nexport async function getReportPath(startDir: string): Promise<string | undefined> {\r\n const workspace = await findArtifactsWorkspace(startDir);\r\n if (!workspace) {\r\n return undefined;\r\n }\r\n return join(getProjectArtifactsDir(workspace), 'report.html');\r\n}\r\n", "import {\r\n FREE_TRIAL_UNLOCKED_MAP_CATEGORY_KEYS,\r\n type ProductionMapCategoryKey\r\n} from '../../../shared/planLimits';\r\nimport { mapCheckToPlaybook } from './playbooks/checkMap';\r\nimport { loadPlaybookSync } from './playbooks/loadPlaybook';\r\nimport { collectManualChecks } from './playbooks/manualChecks';\r\nimport type { NextAction } from './nextAction';\r\nimport { sortGapsByPriority } from './tui/menu';\r\nimport type { CliScanArtifact } from './types';\r\n\r\nconst UPGRADE_URL = 'https://viberaven.dev/pricing';\r\nconst LOCKED_LANE_LABELS: Record<string, string> = {\r\n deployment: 'Deployment',\r\n monitoring: 'Monitoring / Analytics',\r\n security: 'Security',\r\n testing: 'Testing',\r\n landing: 'Onboarding',\r\n errorHandling: 'Error handling / observability'\r\n};\r\n\r\nfunction unlockedKeys(artifact: CliScanArtifact): Set<ProductionMapCategoryKey> {\r\n const keys = artifact.usage?.unlockedMapCategoryKeys ?? FREE_TRIAL_UNLOCKED_MAP_CATEGORY_KEYS;\r\n return new Set(keys);\r\n}\r\n\r\nexport function resolveNextAction(artifact: CliScanArtifact): NextAction {\r\n const unlocked = unlockedKeys(artifact);\r\n\r\n const repoGap = sortGapsByPriority(artifact.gaps).find((gap) =>\r\n unlocked.has(gap.primaryMapCategory)\r\n );\r\n if (repoGap) {\r\n return {\r\n type: 'repo-fix',\r\n title: repoGap.title,\r\n detail: repoGap.detail,\r\n command: `viberaven prompt --gap ${repoGap.id}`\r\n };\r\n }\r\n\r\n const manual = collectManualChecks(artifact).find((item) => unlocked.has(item.mapCategory));\r\n if (manual) {\r\n const provider = mapCheckToPlaybook(manual.check);\r\n let openUrl: string | undefined;\r\n try {\r\n const playbook = loadPlaybookSync(provider);\r\n openUrl = playbook.steps[0]?.openUrl;\r\n } catch {\r\n openUrl = undefined;\r\n }\r\n return {\r\n type: 'provider-guide',\r\n title: manual.check.label,\r\n detail:\r\n manual.check.promptHint ||\r\n `Configure ${manual.providerLabel} in the provider dashboard (${manual.areaLabel}).`,\r\n provider,\r\n playbookStep: 1,\r\n command: `viberaven guide ${provider} --step 1`,\r\n openUrl\r\n };\r\n }\r\n\r\n const lockedGap = sortGapsByPriority(artifact.gaps).find(\r\n (gap) => !unlocked.has(gap.primaryMapCategory)\r\n );\r\n if (lockedGap) {\r\n const lane = lockedGap.primaryMapCategory;\r\n return {\r\n type: 'upgrade',\r\n title: lockedGap.title,\r\n detail: `Free plan covers 6/12 mission map lanes. Upgrade to fix ${LOCKED_LANE_LABELS[lane] ?? lane}.`,\r\n lockedLane: lane,\r\n upgradeUrl: UPGRADE_URL\r\n };\r\n }\r\n\r\n const lockedManual = collectManualChecks(artifact).find((item) => !unlocked.has(item.mapCategory));\r\n if (lockedManual) {\r\n const lane = lockedManual.mapCategory;\r\n return {\r\n type: 'upgrade',\r\n title: lockedManual.check.label,\r\n detail: `This check is in the ${LOCKED_LANE_LABELS[lane] ?? lane} lane (Pro).`,\r\n lockedLane: lane,\r\n upgradeUrl: UPGRADE_URL\r\n };\r\n }\r\n\r\n if (unlocked.size < 12) {\r\n return {\r\n type: 'done',\r\n title: 'No blockers in unlocked lanes',\r\n detail:\r\n 'Run scan again after changes. Upgrade for deployment, monitoring, security, testing, and onboarding lanes.',\r\n upgradeUrl: UPGRADE_URL\r\n };\r\n }\r\n\r\n return {\r\n type: 'done',\r\n title: 'No blockers found',\r\n detail: 'Re-scan after changes to confirm production readiness.'\r\n };\r\n}\r\n", "import { PRODUCTION_MAP_CATEGORY_KEYS_ALL } from '../../../../shared/planLimits';\r\nimport { PUBLIC_VERIFY_COMMAND } from '../contracts/commands';\r\nimport { resolveNextAction } from '../resolveNextAction';\r\nimport type { CliScanArtifact } from '../types';\r\nimport type { Gap } from '../../../../src/station/types';\r\n\r\nconst UPGRADE_URL = 'https://viberaven.dev/pricing';\r\nconst LOCKED_LANE_KEYS = [\r\n 'deployment',\r\n 'monitoring',\r\n 'security',\r\n 'testing',\r\n 'landing',\r\n 'errorHandling'\r\n] as const;\r\n\r\nconst SEVERITY_ORDER: Record<Gap['severity'], number> = {\r\n critical: 0,\r\n warning: 1,\r\n info: 2\r\n};\r\n\r\nfunction sortGaps(gaps: Gap[]): Gap[] {\r\n return [...gaps].sort((a, b) => {\r\n const sev = SEVERITY_ORDER[a.severity] - SEVERITY_ORDER[b.severity];\r\n if (sev !== 0) {\r\n return sev;\r\n }\r\n return a.title.localeCompare(b.title);\r\n });\r\n}\r\n\r\nexport function generateAgentSummary(artifact: CliScanArtifact): string {\r\n const lines: string[] = [];\r\n const topGaps = sortGaps(artifact.gaps).slice(0, 8);\r\n\r\n lines.push('# VibeRaven agent summary', '');\r\n lines.push(`Scanned: \\`${artifact.workspacePath}\\``);\r\n lines.push(`At: ${artifact.scannedAt}`);\r\n lines.push(\r\n `Production core: **${artifact.productionCorePercent}%** \\u00b7 Model score: **${artifact.score}** (${artifact.scoreLabel})`\r\n );\r\n lines.push('');\r\n\r\n const next = resolveNextAction(artifact);\r\n lines.push('## Next action', '');\r\n lines.push(`**${next.title}** \u2014 ${next.detail}`);\r\n if (next.command) {\r\n lines.push(`Command: \\`${next.command}\\``);\r\n }\r\n if (next.upgradeUrl) {\r\n lines.push(`Upgrade: ${next.upgradeUrl}`);\r\n }\r\n lines.push('');\r\n\r\n const unlockedCount = artifact.usage?.unlockedMapCategoryKeys.length ?? 6;\r\n if (unlockedCount < PRODUCTION_MAP_CATEGORY_KEYS_ALL.length) {\r\n lines.push('## Locked lanes (Pro)', '');\r\n lines.push(\r\n 'Free plan unlocks 6/12 mission map lanes. Pro unlocks deployment, monitoring, security, testing, onboarding, and error handling.'\r\n );\r\n lines.push('');\r\n for (const key of LOCKED_LANE_KEYS) {\r\n lines.push(`- ${key}`);\r\n }\r\n lines.push('');\r\n lines.push(`Upgrade: ${UPGRADE_URL}`);\r\n lines.push('');\r\n }\r\n\r\n lines.push('## Suggested stack', '');\r\n lines.push(\r\n 'React + Tailwind + shadcn/ui + Supabase + Vercel (agent-default stack for lowest launch friction)'\r\n );\r\n lines.push('');\r\n\r\n lines.push('## Summary');\r\n lines.push(artifact.summary || '_No summary returned._');\r\n lines.push('');\r\n lines.push('## Mission map (repo wiring)');\r\n lines.push('');\r\n lines.push('| Area | Provider | Readiness | Notes |');\r\n lines.push('|------|----------|-----------|-------|');\r\n\r\n for (const area of artifact.missionGraph.areas ?? []) {\r\n for (const mission of area.providerMissions) {\r\n const failed = mission.checks.filter(\r\n (c) => c.status === 'missing' || c.status === 'failed' || c.status === 'needs-connection'\r\n ).length;\r\n const notes =\r\n failed > 0\r\n ? `${failed} open check${failed === 1 ? '' : 's'}`\r\n : `${mission.readinessPercent}% repo checks`;\r\n lines.push(\r\n `| ${area.label} | ${mission.providerLabel} | ${mission.readinessPercent}% | ${notes} |`\r\n );\r\n }\r\n }\r\n\r\n lines.push('');\r\n lines.push('## Agent-code actions');\r\n if (topGaps.length === 0) {\r\n lines.push('_No model gaps returned. Review mission map checks before changing code._');\r\n } else {\r\n topGaps.forEach((gap, index) => {\r\n lines.push(\r\n `${index + 1}. **${gap.title}** (\\`${gap.id}\\`, ${gap.severity}, map: \\`${gap.primaryMapCategory}\\`)`\r\n );\r\n lines.push(` - ${gap.detail}`);\r\n lines.push(` - Command: \\`viberaven prompt --gap ${gap.id}\\``);\r\n if (gap.copyPrompt) {\r\n lines.push(` - Prompt: ${gap.copyPrompt}`);\r\n }\r\n });\r\n }\r\n\r\n const manualChecks = (artifact.missionGraph.areas ?? []).flatMap((area) =>\r\n area.providerMissions.flatMap((mission) =>\r\n mission.checks\r\n .filter(\r\n (check) =>\r\n check.evidenceClass === 'manual-dashboard' ||\r\n check.evidenceClass === 'mcp-verifier' ||\r\n check.evidenceSource === 'provider' ||\r\n check.evidenceSource === 'mcp' ||\r\n check.status === 'needs-connection' ||\r\n check.status === 'unknown'\r\n )\r\n .map((check) => ({ area: area.label, provider: mission.providerLabel, check }))\r\n )\r\n );\r\n\r\n lines.push('');\r\n lines.push('## Human-provider actions');\r\n if (manualChecks.length === 0) {\r\n lines.push('_No manual provider actions were identified in this scan._');\r\n } else {\r\n manualChecks.slice(0, 8).forEach((item, index) => {\r\n lines.push(`${index + 1}. **${item.check.label}** (${item.area} / ${item.provider})`);\r\n lines.push(\r\n ` - ${item.check.promptHint || 'Ask the user to confirm this in the provider dashboard or through read-only MCP.'}`\r\n );\r\n });\r\n }\r\n lines.push('');\r\n lines.push('Do not claim human-provider actions as repo-code fixes.');\r\n\r\n lines.push('');\r\n lines.push('## Agent workflow');\r\n lines.push('1. Read `.viberaven/agent-tasklist.md` first for the production gate.');\r\n lines.push('2. Read `.viberaven/launch-playbook.md` for the full checklist.');\r\n lines.push('3. Run `viberaven next --json` - one action at a time.');\r\n lines.push('4. Repo fix: `viberaven prompt --gap <id>` then implement.');\r\n lines.push('5. Provider: `viberaven guide <provider> --step N` and `viberaven open <provider>`.');\r\n lines.push(`6. Run \\`${PUBLIC_VERIFY_COMMAND}\\` to rescan and refresh \\`.viberaven/agent-tasklist.md\\`.`);\r\n lines.push('');\r\n\r\n if (artifact.usage) {\r\n lines.push('## Account usage');\r\n lines.push(\r\n `- Plan: ${artifact.usage.plan} \\u00b7 Scans used: ${artifact.usage.used}/${artifact.usage.limit} (${artifact.usage.period})`\r\n );\r\n lines.push('');\r\n }\r\n\r\n return `${lines.join('\\n')}\\n`;\r\n}\r\n", "import {\n FREE_TRIAL_UNLOCKED_MAP_CATEGORY_KEYS,\n type ProductionMapCategoryKey,\n} from '../../../shared/planLimits';\nimport { PUBLIC_VERIFY_COMMAND } from './contracts/commands';\nimport type { ProviderAction, TaskItem } from './contracts/taskItem';\nimport { mapCheckToPlaybook } from './playbooks/checkMap';\nimport { loadPlaybookSync } from './playbooks/loadPlaybook';\nimport { PLAYBOOK_PROVIDERS } from './playbooks/types';\nimport { sortGapsByPriority } from './tui/menu';\nimport type { CliScanArtifact } from './types';\n\n// ---------------------------------------------------------------------------\n// Recipe registry\n// The recipes/ directory currently contains function-based recipes, not a\n// HealRecipe typed registry. We maintain a static set of known gapIds that\n// have an automated recipe so that buildTaskList can classify them as\n// 'repo-code' without importing every recipe module.\n// ---------------------------------------------------------------------------\n\nconst KNOWN_RECIPE_GAP_IDS: ReadonlySet<string> = new Set([\n // emptyCatch (original recipe)\n 'empty-catch',\n 'empty_catch',\n 'emptyCatch',\n // W3 env-add recipes\n 'auth_secret_missing',\n 'node_env_not_set',\n 'database_url_missing',\n // W3 file-create recipes\n 'missing_error_boundary',\n 'missing_health_route',\n 'missing_loading_state',\n 'missing_404_page',\n // W3 file-patch recipes\n 'missing_csp_header',\n 'missing_rate_limit',\n 'eslint_restricted_imports',\n // NOTE: 'rls_disabled' is intentionally NOT here \u2014 it is provider-action only,\n // canAutoApply=false, and should be classified as 'provider-action' by buildTaskList.\n]);\n\nfunction hasRecipe(gapId: string): boolean {\n if (KNOWN_RECIPE_GAP_IDS.has(gapId)) return true;\n // Fuzzy: any gap whose id contains known recipe tokens\n const lower = gapId.toLowerCase();\n return lower.includes('empty') && lower.includes('catch');\n}\n\n// ---------------------------------------------------------------------------\n// Playbook provider lookup \u2014 try to map a gap to a known playbook provider\n// ---------------------------------------------------------------------------\n\nfunction gapToPlaybookProvider(gap: { primaryMapCategory: string; id: string }): string | undefined {\n const cat = gap.primaryMapCategory.toLowerCase();\n\n // Direct category \u2192 provider mapping\n if (cat === 'deployment') return 'vercel';\n if (cat === 'payments') return 'stripe';\n if (cat === 'auth') return 'auth-supabase';\n if (cat === 'database') return 'supabase';\n\n // Heuristic from gap id\n const id = gap.id.toLowerCase();\n if (id.includes('vercel') || id.includes('deploy')) return 'vercel';\n if (id.includes('stripe') || id.includes('payment')) return 'stripe';\n if (id.includes('supabase') || id.includes('database') || id.includes('db')) return 'supabase';\n if (id.includes('auth')) return 'auth-supabase';\n\n return undefined;\n}\n\nfunction hasPlaybook(gap: { primaryMapCategory: string; id: string }): boolean {\n try {\n const provider = gapToPlaybookProvider(gap);\n if (!provider) return false;\n // Validate the provider is known\n return (PLAYBOOK_PROVIDERS as readonly string[]).includes(provider);\n } catch {\n return false;\n }\n}\n\nfunction buildProviderAction(\n gap: { primaryMapCategory: string; id: string; title: string },\n provider: string\n): ProviderAction | undefined {\n try {\n const playbook = loadPlaybookSync(provider);\n const step = playbook.steps[0];\n if (!step) return undefined;\n\n return {\n provider,\n dashboardUrl: step.openUrl ?? `https://${provider}.com`,\n // PlaybookStep uses `instruction` \u2014 map to exactStep\n exactStep: step.instruction,\n // No envKeyName/envKeyExample in current PlaybookStep schema \u2014 leave undefined\n envKeyName: undefined,\n envKeyExample: undefined,\n // Use step title as the done signal\n doneSignal: `${step.title} step completed`,\n verifyCommand: PUBLIC_VERIFY_COMMAND,\n };\n } catch {\n return undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Unlocked lane detection (mirrors resolveNextAction.ts \u2014 copied to avoid circular)\n// ---------------------------------------------------------------------------\n\nfunction unlockedKeys(artifact: CliScanArtifact): Set<ProductionMapCategoryKey> {\n const keys = artifact.usage?.unlockedMapCategoryKeys ?? FREE_TRIAL_UNLOCKED_MAP_CATEGORY_KEYS;\n return new Set(keys);\n}\n\n// ---------------------------------------------------------------------------\n// Main exports\n// ---------------------------------------------------------------------------\n\n/**\n * Build a prioritised, structured task list from a scan artifact.\n * Each gap becomes exactly one TaskItem with an actionable fix classification.\n */\nexport function buildTaskList(artifact: CliScanArtifact): TaskItem[] {\n const unlocked = unlockedKeys(artifact);\n const sorted = sortGapsByPriority(artifact.gaps);\n\n return sorted.map((gap, index) => {\n const id = `TASK-${String(index + 1).padStart(3, '0')}`;\n const isLocked = !unlocked.has(gap.primaryMapCategory as ProductionMapCategoryKey);\n\n // ----- Determine fixType -----\n let fixType: TaskItem['fixType'];\n\n if (isLocked) {\n fixType = 'upgrade-required';\n } else if (hasRecipe(gap.id)) {\n fixType = 'repo-code';\n } else if (hasPlaybook(gap)) {\n fixType = 'provider-action';\n } else {\n fixType = 'manual-verify';\n }\n\n // ----- Build per-fixType fields -----\n const base: TaskItem = {\n id,\n gapId: gap.id,\n severity: gap.severity,\n fixType,\n title: gap.title,\n verifyCommand: PUBLIC_VERIFY_COMMAND,\n requiresUserAction: fixType !== 'repo-code',\n };\n\n if (fixType === 'repo-code') {\n // Automated recipe available \u2014 agent calls viberaven_heal_apply\n base.mcpTool = 'viberaven_heal_apply';\n base.mcpArgs = { gap: gap.id, yes: true };\n base.requiresUserAction = false;\n // Hint from scanner\n if (gap.copyPrompt) {\n base.exactFix = gap.copyPrompt.trim();\n }\n } else if (fixType === 'provider-action') {\n // Look up playbook step for guided provider action\n try {\n const provider = gapToPlaybookProvider(gap);\n if (provider) {\n const pa = buildProviderAction(gap, provider);\n if (pa) {\n base.providerAction = pa;\n base.action = pa.exactStep;\n }\n }\n } catch {\n // Degrade gracefully to manual-verify if playbook loading fails\n base.fixType = 'manual-verify';\n }\n base.requiresUserAction = true;\n }\n // upgrade-required and manual-verify: requiresUserAction stays true\n\n return base;\n });\n}\n\n/**\n * Render a TaskItem array as markdown \u2014 one TASK-NNN block per gap.\n */\nexport function buildTaskListMarkdown(tasks: TaskItem[]): string {\n if (tasks.length === 0) {\n return '# VibeRaven Agent Tasklist\\n\\n_No gaps found \u2014 production core looks solid._\\n';\n }\n\n const lines: string[] = ['# VibeRaven Agent Tasklist', ''];\n\n for (const task of tasks) {\n const severityLabel = task.severity.toUpperCase();\n\n lines.push(`## ${task.id} \u00B7 ${task.gapId} \u00B7 ${severityLabel}`, '');\n lines.push(`**Fix type:** ${task.fixType} `);\n\n if (task.file) {\n lines.push(`**File:** \\`${task.file}\\` `);\n }\n\n if (task.action) {\n lines.push(`**Action:** ${task.action} `);\n }\n\n if (task.exactFix) {\n lines.push(`**Exact fix:** ${task.exactFix} `);\n } else {\n lines.push(`**Exact fix:** No automated recipe \u2014 see scanner hint. `);\n }\n\n lines.push(`**Verify:** \\`${task.verifyCommand}\\` `);\n\n if (task.mcpTool && task.mcpArgs) {\n lines.push(\n `**MCP:** \\`${task.mcpTool} ${JSON.stringify(task.mcpArgs)}\\` `\n );\n }\n\n lines.push(`**Requires user action:** ${task.requiresUserAction}`);\n\n if (task.providerAction) {\n const pa = task.providerAction;\n lines.push('');\n lines.push('**Provider action:**');\n lines.push(`- Provider: ${pa.provider}`);\n lines.push(`- Dashboard: ${pa.dashboardUrl}`);\n lines.push(`- Step: ${pa.exactStep}`);\n if (pa.envKeyName) lines.push(`- Env key: \\`${pa.envKeyName}\\``);\n if (pa.doneSignal) lines.push(`- Done when: ${pa.doneSignal}`);\n if (pa.mcpAlternative) lines.push(`- MCP alternative: \\`${pa.mcpAlternative}\\``);\n }\n\n lines.push('');\n }\n\n return `${lines.join('\\n')}\\n`;\n}\n", "import {\r\n FREE_TRIAL_UNLOCKED_MAP_CATEGORY_KEYS,\r\n PRODUCTION_MAP_CATEGORY_KEYS_ALL,\r\n type ProductionMapCategoryKey\r\n} from '../../../../shared/planLimits';\r\nimport { mapCheckToPlaybook } from '../playbooks/checkMap';\r\nimport { collectManualChecks } from '../playbooks/manualChecks';\r\nimport { sortGapsByPriority } from '../tui/menu';\r\nimport { PUBLIC_VERIFY_COMMAND } from '../contracts/commands';\r\nimport type { CliScanArtifact } from '../types';\r\n\r\nconst UPGRADE_URL = 'https://viberaven.dev/pricing';\r\n\r\nfunction unlockedSet(artifact: CliScanArtifact): Set<ProductionMapCategoryKey> {\r\n return new Set(artifact.usage?.unlockedMapCategoryKeys ?? FREE_TRIAL_UNLOCKED_MAP_CATEGORY_KEYS);\r\n}\r\n\r\nexport function generateLaunchPlaybook(artifact: CliScanArtifact): string {\r\n const lines: string[] = [];\r\n const unlocked = unlockedSet(artifact);\r\n const isPro = unlocked.size >= PRODUCTION_MAP_CATEGORY_KEYS_ALL.length;\r\n\r\n lines.push('# VibeRaven launch playbook', '');\r\n lines.push(`Generated from scan at ${artifact.scannedAt}. Work top to bottom.`, '');\r\n\r\n lines.push('## Repo fixes (agent code)', '');\r\n const repoGaps = sortGapsByPriority(artifact.gaps).filter((gap) =>\r\n unlocked.has(gap.primaryMapCategory)\r\n );\r\n if (repoGaps.length === 0) {\r\n lines.push('_No repo-code gaps in unlocked lanes._', '');\r\n } else {\r\n for (const gap of repoGaps) {\r\n lines.push(`- [ ] ${gap.title} \u2014 \\`viberaven prompt --gap ${gap.id}\\``);\r\n }\r\n lines.push('');\r\n }\r\n\r\n lines.push('## Provider setup (human + agent)', '');\r\n const manuals = collectManualChecks(artifact).filter((item) => unlocked.has(item.mapCategory));\r\n if (manuals.length === 0) {\r\n lines.push('_No provider dashboard steps in unlocked lanes._', '');\r\n } else {\r\n for (const item of manuals) {\r\n const provider = mapCheckToPlaybook(item.check);\r\n lines.push(\r\n `- [ ] ${item.check.label} (${item.areaLabel}) \u2014 \\`viberaven guide ${provider} --step 1\\``\r\n );\r\n }\r\n lines.push('');\r\n }\r\n\r\n if (!isPro) {\r\n lines.push('## [Pro] Deployment, monitoring, and full map', '');\r\n const proGaps = sortGapsByPriority(artifact.gaps).filter(\r\n (gap) => !unlocked.has(gap.primaryMapCategory)\r\n );\r\n const proManuals = collectManualChecks(artifact).filter((item) => !unlocked.has(item.mapCategory));\r\n if (proGaps.length === 0 && proManuals.length === 0) {\r\n lines.push('_No Pro-only blockers detected._', '');\r\n } else {\r\n for (const gap of proGaps.slice(0, 6)) {\r\n lines.push(`- [ ] ${gap.title} [Pro] \u2014 upgrade at ${UPGRADE_URL}`);\r\n }\r\n for (const item of proManuals.slice(0, 6)) {\r\n lines.push(`- [ ] ${item.check.label} [Pro] \u2014 upgrade at ${UPGRADE_URL}`);\r\n }\r\n lines.push('');\r\n }\r\n }\r\n\r\n lines.push('## Agent loop', '');\r\n lines.push('1. Read `.viberaven/agent-tasklist.md` for the current production gate.');\r\n lines.push('2. `viberaven next --json`');\r\n lines.push('3. Fix repo or run `viberaven guide <provider>`');\r\n lines.push(`4. Run \\`${PUBLIC_VERIFY_COMMAND}\\` to refresh the gate and \\`.viberaven/agent-tasklist.md\\`.`);\r\n lines.push('');\r\n\r\n return `${lines.join('\\n')}\\n`;\r\n}\r\n", "import type { StationBackgroundKind } from './stationBackground';\r\n\r\nexport type StationHtmlOptions = {\r\n /** `panel` = bottom panel (full width); default = sidebar width */\r\n surface?: 'panel' | 'sidebar';\r\n /** Visual skin used by the Station webview. */\r\n skin?: 'editorial' | 'classic';\r\n /** Optional logo image used in the Studio rail. */\r\n logoImageUri?: string;\r\n /** From `Webview.cspSource` - allows CSS/JS (see `resolveStationCspSource` fallback) */\r\n cspSource: string;\r\n /** Optional `asWebviewUri` to a mood image under `media/` */\r\n backgroundImageUri?: string;\r\n /** Tunes CSS (`landscape` for wide bottom panel art, `portrait` for vertical, `legacy` for old `station-bg.png`) */\r\n backgroundKind?: StationBackgroundKind;\r\n};\r\n\r\nfunction escapeHtmlAttrValue(value: string): string {\r\n return value\r\n .replace(/&/g, '&amp;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/</g, '&lt;');\r\n}\r\n\r\nfunction buildCsp(nonce: string, cspSource: string): string {\r\n // Use webview.cspSource so bundled CSS/JS origins match; a single asWebviewUri string often fails the strict check.\r\n // fonts.googleapis.com / fonts.gstatic.com: match landing typography inside the webview.\r\n return `default-src 'none'; style-src ${cspSource} 'unsafe-inline' https://fonts.googleapis.com; script-src 'nonce-${nonce}' ${cspSource}; img-src ${cspSource} https: data:; font-src ${cspSource} https://fonts.gstatic.com https: data:; connect-src 'none';`;\r\n}\r\n\r\n/** Minimal HTML if `resolveWebviewView` throws - still styled so you see the error. */\r\nexport function getStationViewErrorHtml(message: string): string {\r\n const safe = String(message)\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;');\r\n return `<!DOCTYPE html>\r\n <html lang=\"en\"><head><meta charset=\"UTF-8\" /><title>Station</title></head>\r\n <body style=\"margin:0;padding:14px 16px;font:14px/1.5 system-ui;background:#0a0a0a;color:#e8e4dc\">\r\n <p style=\"margin:0 0 6px;font-weight:700;letter-spacing:0.04em;color:#d4af37\">VibeRaven</p>\r\n <p style=\"margin:0;opacity:0.85\">The panel could not load. Check the <strong>Extension Host</strong> output for details.</p>\r\n <pre style=\"margin:10px 0 0;white-space:pre-wrap;word-break:break-word;opacity:0.75;font-size:13px\">${safe}</pre>\r\n </body></html>`;\r\n}\r\n\r\nexport function getStationHtml(\r\n nonce: string,\r\n cssUri: string,\r\n jsUri: string,\r\n options: StationHtmlOptions\r\n): string {\r\n const surface = options.surface ?? 'sidebar';\r\n const skin = options.skin ?? 'editorial';\r\n const csp = escapeHtmlAttrValue(buildCsp(nonce, options.cspSource));\r\n const logoHtml = options.logoImageUri\r\n ? `<img class=\"studio-top-rail__logo\" src=\"${escapeHtmlAttrValue(options.logoImageUri)}\" alt=\"\" width=\"32\" height=\"32\" />`\r\n : '';\r\n const bgData = options.backgroundImageUri\r\n ? ` data-bg-uri=\"${escapeHtmlAttrValue(encodeURIComponent(options.backgroundImageUri))}\"`\r\n : '';\r\n const bgKindData =\r\n options.backgroundImageUri && options.backgroundKind\r\n ? ` data-bg-kind=\"${options.backgroundKind}\"`\r\n : '';\r\n return `<!DOCTYPE html>\r\n <html lang=\"en\" data-surface=\"${surface}\" data-skin=\"${skin}\"${bgData}${bgKindData}>\r\n <head>\r\n <meta charset=\"UTF-8\" />\r\n <meta http-equiv=\"Content-Security-Policy\" content=\"${csp}\">\r\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\r\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin />\r\n <link\r\n rel=\"stylesheet\"\r\n href=\"https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&amp;family=JetBrains+Mono:wght@400;600&amp;display=swap\"\r\n />\r\n <link rel=\"stylesheet\" href=\"${cssUri}\">\r\n <title>VibeRaven</title>\r\n </head>\r\n <body data-surface=\"${surface}\">\r\n <div class=\"station-app\">\r\n <!-- Session lives outside station-pre-mc so it stays visible during Mission Control takeover (scan/results). -->\r\n <div data-section=\"session\" class=\"mc-session cockpit-session station-account-strip\" aria-live=\"polite\"></div>\r\n <div id=\"station-pre-mc\" class=\"station-pre-mc\" aria-label=\"Station setup and workspace scan\">\r\n <div class=\"station-cockpit\">\r\n <header class=\"cockpit-hero\" role=\"banner\">\r\n <div class=\"cockpit-hero__text\">\r\n <p class=\"cockpit-hero__brand\" id=\"station-brand\">VIBERAVEN</p>\r\n <h1 class=\"cockpit-hero__title\">Mission Map</h1>\r\n <p class=\"cockpit-hero__lead\">\r\n <strong>Scan Project</strong> reads your workspace and opens a full-stack cockpit with stack choices, config previews, gap evidence, and verification steps.\r\n </p>\r\n <p class=\"cockpit-hero__whatsnew\" role=\"note\">\r\n <strong>VibeRaven</strong> turns each section into a guided setup flow: choose the stack, copy the config path, apply the prompt, then rescan for repo evidence.\r\n </p>\r\n </div>\r\n </header>\r\n\r\n <section class=\"command-deck\" aria-label=\"Station scan\">\r\n <h2 class=\"command-deck__label\">Project scan</h2>\r\n <p class=\"command-deck__hint\">Open the cockpit map, choose stack cards, preview config, and verify each section from repo evidence.</p>\r\n <p id=\"prompt-form-tip\" class=\"sr-only\">Submit runs a full VibeRaven scan on this workspace.</p>\r\n <form id=\"prompt-form\" class=\"command-deck__form\" aria-describedby=\"prompt-form-tip\" title=\"Run VibeRaven scan on this workspace\">\r\n <input type=\"hidden\" id=\"prompt-input\" name=\"prompt\" value=\"\" autocomplete=\"off\" />\r\n <div class=\"command-deck__cta\">\r\n <button type=\"submit\" class=\"command-deck__run\" title=\"Scan this workspace and open Mission Map\">\r\n <span class=\"command-deck__run-text\">Scan Project</span>\r\n <span class=\"command-deck__run-sub\">Open cockpit map with stack controls</span>\r\n <span class=\"command-deck__run-glow\" aria-hidden=\"true\"></span>\r\n </button>\r\n </div>\r\n </form>\r\n </section>\r\n </div>\r\n </div>\r\n\r\n <div class=\"station-stage\" role=\"region\" aria-label=\"Station scan and Mission Control\">\r\n <div id=\"mc-idle\" class=\"mc-state mc-state--idle\">\r\n <div class=\"mc-idle__hero\">\r\n <p class=\"mc-idle__tagline\">Ready to scan your project</p>\r\n <p class=\"mc-idle__sub\">Station reads your repo and maps every gap between now and production.</p>\r\n </div>\r\n </div>\r\n\r\n <div id=\"mc-scanning\" class=\"mc-state mc-state--scanning\" role=\"status\" aria-live=\"polite\" hidden>\r\n <div class=\"mc-scan-loader\" aria-hidden=\"true\">\r\n <span class=\"mc-scan-loader__frame\">\r\n <span class=\"mc-scan-loader__grid\"></span>\r\n <span class=\"mc-scan-loader__sweep\"></span>\r\n <span class=\"mc-scan-loader__spark mc-scan-loader__spark--a\"></span>\r\n <span class=\"mc-scan-loader__spark mc-scan-loader__spark--b\"></span>\r\n </span>\r\n <span class=\"mc-scan-loader__rows\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </span>\r\n </div>\r\n <div class=\"mc-scan__readout\">\r\n <p id=\"mc-scan-label\" class=\"mc-scan__label\">Reading your files...</p>\r\n <div class=\"mc-bar-track\">\r\n <div id=\"mc-bar-fill\" class=\"mc-bar-fill\" role=\"progressbar\" aria-label=\"Scan progress\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" style=\"width:0%\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"mc-results\" class=\"mc-state mc-state--results\" hidden role=\"region\" aria-labelledby=\"mc-results-title\">\r\n <h2 id=\"mc-results-title\" class=\"sr-only\">Mission Control results</h2>\r\n <div id=\"mc-error\" class=\"mc-error\" hidden role=\"alert\" aria-live=\"assertive\"></div>\r\n <div class=\"studio-shell\" aria-label=\"VibeRaven Studio cockpit\">\r\n <header class=\"studio-top-rail\" aria-label=\"Studio status\">\r\n ${logoHtml}\r\n <div class=\"studio-top-rail__brand\">\r\n <span class=\"studio-top-rail__wordmark\">VIBERAVEN</span>\r\n <span class=\"studio-top-rail__label\">MISSION MAP</span>\r\n </div>\r\n </header>\r\n\r\n <div class=\"studio-workspace\">\r\n <nav class=\"studio-nav-rail\" aria-label=\"Studio areas\">\r\n <span class=\"studio-nav-rail__item studio-nav-rail__item--active\" aria-label=\"Architecture\">ARCH</span>\r\n <span class=\"studio-nav-rail__item\" aria-label=\"Flow\">FLOW</span>\r\n <span class=\"studio-nav-rail__item\" aria-label=\"Terminal\">TERM</span>\r\n <span class=\"studio-nav-rail__item\" aria-label=\"Security\">SEC</span>\r\n </nav>\r\n\r\n <main id=\"studio-map-canvas\" class=\"studio-map-canvas\" aria-label=\"Interactive full-stack system map\">\r\n <div class=\"mc-score-row mc-score-row--v3 studio-score-row\">\r\n <div class=\"mc-score-headline\" aria-live=\"polite\">\r\n <span class=\"mc-score-strip__title\">Production readiness</span>\r\n <span id=\"mc-score-pct\" class=\"mc-score-pct mc3-score-pct\">-</span>\r\n <span id=\"mc-score-label\" class=\"mc-score-label mc3-score-label\">production-ready</span>\r\n </div>\r\n </div>\r\n <div class=\"mc-bar-track mc-bar-track--results mc3-results-track studio-readiness-track\">\r\n <div id=\"mc-results-bar\" class=\"mc-bar-fill mc3-results-fill\" role=\"progressbar\" aria-label=\"Production readiness score\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"0\" style=\"width:0%\"></div>\r\n </div>\r\n <div class=\"mc-status-bundle studio-status-bundle\">\r\n <p class=\"mc-status-line__eyebrow\">Scan summary</p>\r\n <p id=\"mc-status-line\" class=\"mc-status-line mc-status-line--v3\"></p>\r\n </div>\r\n <div id=\"mc-plan-pills\" class=\"mc3-plan-pills\" hidden aria-label=\"Selected implementation paths\"></div>\r\n <p id=\"mc-score-hint\" class=\"mc-score-hint sr-only\"></p>\r\n <div id=\"mc-announce\" class=\"sr-only\" aria-live=\"polite\" aria-relevant=\"additions text\"></div>\r\n <div id=\"mc-production-map\" class=\"mc-production-map studio-production-map\" hidden aria-label=\"Production readiness map\"></div>\r\n <div id=\"mc-scan-insights\" class=\"mc-scan-insights\" hidden aria-label=\"Scanner-driven suggestions\"></div>\r\n <div id=\"mc-groups\" class=\"mc-groups\" role=\"group\" aria-label=\"Production gaps and actions\"></div>\r\n <ul id=\"mc-quick-wins\" class=\"mc-quick-wins\" hidden></ul>\r\n </main>\r\n\r\n <aside id=\"studio-setup-panel\" class=\"studio-setup-panel\" aria-label=\"Selected section setup\">\r\n <div class=\"studio-setup-panel__empty\">\r\n <p class=\"studio-setup-panel__eyebrow\">No section selected</p>\r\n <p class=\"studio-setup-panel__title\">Choose a node on the map</p>\r\n </div>\r\n </aside>\r\n </div>\r\n <div id=\"mcp-helper-modal\" class=\"mcp-helper-modal\" hidden></div>\r\n\r\n <details class=\"mc-spec-notes\" id=\"mc-spec-notes\">\r\n <summary class=\"mc-spec-notes__toggle\">SPEC / doc follow-ups from this scan</summary>\r\n <p class=\"mc-spec-notes__intro\">\r\n <strong>What this is:</strong> a separate list from the gaps above. Each line is something Station thinks should be <strong>reflected in your written spec</strong>.\r\n </p>\r\n <div data-section=\"spec-update\" class=\"mc-spec-notes__body\"></div>\r\n </details>\r\n <p id=\"mc-last-scanned\" class=\"mc-last-scanned mc-last-scanned--footer\" aria-live=\"polite\"></p>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"mc3-prompt-modal\" class=\"mc3-prompt-modal\" hidden>\r\n <div class=\"mc3-prompt-modal__backdrop\" data-station-action=\"mc3-close-prompt-modal\" aria-hidden=\"true\"></div>\r\n <div\r\n class=\"mc3-prompt-modal__panel\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby=\"mc3-prompt-modal-title\"\r\n tabindex=\"-1\"\r\n >\r\n <div class=\"mc3-prompt-modal__head\">\r\n <h2 id=\"mc3-prompt-modal-title\" class=\"mc3-prompt-modal__title\">Agent prompt</h2>\r\n <button type=\"button\" class=\"mc3-prompt-modal__close\" data-station-action=\"mc3-close-prompt-modal\" aria-label=\"Close\">\r\n \u00D7\r\n </button>\r\n </div>\r\n <pre id=\"mc3-prompt-modal-body\" class=\"mc3-prompt-modal__pre\"></pre>\r\n <div class=\"mc3-prompt-modal__foot\">\r\n <button\r\n type=\"button\"\r\n class=\"mc3-prompt-modal__copy\"\r\n data-station-action=\"mc3-modal-copy-prompt\"\r\n data-prompt=\"\"\r\n >\r\n Copy prompt\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <script nonce=\"${nonce}\" src=\"${jsUri}\"></script>\r\n </body>\r\n </html>`;\r\n}\r\n", "import type { CliScanArtifact } from '../types';\nimport { getStationHtml } from '../../../../src/webview/getStationHtml';\nimport { hydrateArtifactForReport } from './hydrateArtifact';\n\nconst STATIC_REPORT_NONCE = 'viberaven-static-report';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object';\n}\n\nfunction stripEvidenceFields(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(stripEvidenceFields);\n }\n if (!isRecord(value)) {\n return value;\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n key === 'evidence' ? [] : stripEvidenceFields(entry)\n ])\n );\n}\n\nfunction stripProviderTruthEvidence(artifact: CliScanArtifact): CliScanArtifact {\n if (!artifact.providerTruth) {\n return artifact;\n }\n return {\n ...artifact,\n providerTruth: stripEvidenceFields(artifact.providerTruth) as CliScanArtifact['providerTruth']\n };\n}\n\nconst CATEGORY_KEYS = [\n 'appFlow',\n 'frontend',\n 'backend',\n 'auth',\n 'database',\n 'payments',\n 'deployment',\n 'monitoring',\n 'security',\n 'testing',\n 'landing',\n 'errorHandling'\n];\n\nfunction defaultAreaKey(artifact: CliScanArtifact): string {\n const fromGap = artifact.gaps[0]?.primaryMapCategory;\n if (fromGap) {\n return fromGap;\n }\n const areas = artifact.missionGraph.areas ?? [];\n if (areas.some((area) => area.key === 'frontend')) {\n return 'frontend';\n }\n const fromArea = areas.find((area) => CATEGORY_KEYS.includes(area.key))?.key;\n return fromArea ?? 'frontend';\n}\n\nfunction buildStaticSession(artifact: CliScanArtifact): Record<string, unknown> {\n return {\n signedIn: Boolean(artifact.accountEmail || artifact.usage || artifact.plan),\n account: {\n email: artifact.accountEmail ?? '',\n plan: artifact.plan ?? artifact.usage?.plan ?? 'free'\n },\n usage: artifact.usage ?? null\n };\n}\n\nfunction staticStateScript(artifact: CliScanArtifact): string {\n const state = {\n lastPayload: artifact,\n lastScannedAt: artifact.scannedAt,\n selectedProductionCategoryKey: defaultAreaKey(artifact),\n selectedProviders: artifact.selectedProviders ?? {},\n productionConnectionChoices: { version: 1, choices: {} },\n staticSession: buildStaticSession(artifact)\n };\n const stateJson = JSON.stringify(state).replace(/</g, '\\\\u003c');\n return `<script nonce=\"${STATIC_REPORT_NONCE}\">\nwindow.__VIBERAVEN_STATIC_STATE__ = ${stateJson};\nfunction acquireVsCodeApi() {\n var state = window.__VIBERAVEN_STATIC_STATE__ || {};\n return {\n getState: function () { return state; },\n setState: function (nextState) {\n state = Object.assign({}, state, nextState || {});\n window.__VIBERAVEN_STATIC_STATE__ = state;\n },\n postMessage: function (message) {\n if (!message || typeof message !== 'object') return;\n if (message.type === 'session:refresh') {\n window.postMessage({ type: 'session:update', payload: state.staticSession || null }, '*');\n return;\n }\n if (message.type === 'station:openExternal' && typeof message.url === 'string') {\n window.open(message.url, '_blank', 'noopener,noreferrer');\n return;\n }\n if (message.type === 'station:copy' && typeof message.text === 'string' && navigator.clipboard) {\n navigator.clipboard.writeText(message.text).catch(function () {});\n }\n }\n };\n}\n</script>`;\n}\n\nexport function generateReportHtml(artifact: CliScanArtifact): string {\n const hydrated = stripProviderTruthEvidence(hydrateArtifactForReport(artifact));\n const html = getStationHtml(STATIC_REPORT_NONCE, 'report/station.css', 'report/station.js', {\n surface: 'panel',\n skin: 'editorial',\n cspSource: \"'self'\",\n logoImageUri: 'report/assets/viberaven-logo.png'\n });\n return html.replace(\n `<script nonce=\"${STATIC_REPORT_NONCE}\" src=\"report/station.js\"></script>`,\n `${staticStateScript(hydrated)}\n <script nonce=\"${STATIC_REPORT_NONCE}\" src=\"report/station.js\"></script>`\n );\n}\n", "import { existsSync } from 'node:fs';\r\nimport { dirname, join } from 'node:path';\r\n\r\n/** Directory containing station.css, report-cli.css, and assets/ for bundled CLI reports. */\r\nexport function getBundledReportAssetsDir(): string {\r\n const base = __dirname;\r\n const candidates = [\n join(base, 'report'),\n join(base, '..', 'assets', 'report'),\n join(base, '..', '..', 'assets', 'report'),\n join(process.cwd(), 'packages', 'cli', 'assets', 'report'),\n join(process.cwd(), 'assets', 'report')\n ];\n for (const dir of candidates) {\r\n if (existsSync(join(dir, 'station.css'))) {\r\n return dir;\r\n }\r\n }\r\n throw new Error('Report assets missing. Run `npm run sync-report-assets` and `npm run build` in packages/cli.');\r\n}\r\n\r\nexport const REPORT_ASSET_FILES = [\r\n 'station.css',\n 'station.js',\n 'report-cli.css',\n 'assets/viberaven-logo.png',\r\n 'assets/provider-authjs.svg',\r\n 'assets/provider-aws.svg',\r\n 'assets/provider-logrocket.svg'\r\n] as const;\r\n", "import type { CliScanArtifact } from './types';\r\n\r\n/** Patterns aligned with `src/station/fileScanner.ts` \u2014 never persist secrets in `.viberaven/`. */\r\nconst INLINE_SECRET_PATTERNS: RegExp[] = [\r\n /\\b(sk_(?:live|test)_[A-Za-z0-9]{12,}|sk-proj-[A-Za-z0-9_-]{16,}|sk-[A-Za-z0-9_-]{20,})\\b/g,\r\n /\\b(whsec_[A-Za-z0-9]{12,}|rk_(?:live|test)_[A-Za-z0-9]{12,})\\b/g,\r\n /\\bghp_[A-Za-z0-9]{36,}\\b/g,\r\n /\\bgithub_pat_[A-Za-z0-9_]{50,}\\b/g,\r\n /\\bxox[bp]-[A-Za-z0-9-]{20,}\\b/g,\r\n /\\bxapp-[A-Za-z0-9-]{20,}\\b/g,\r\n /\\beyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\b/g,\r\n /-----BEGIN [A-Z ]*PRIVATE KEY-----[\\s\\S]*?-----END [A-Z ]*PRIVATE KEY-----/g\r\n];\r\n\r\nconst SENSITIVE_ENV_KEYS =\r\n /(?:^|_)(?:ACCESS_TOKEN|AUTHORIZATION|API_KEY|SECRET|SECRET_KEY|SERVICE_ROLE_KEY|TOKEN|PASSWORD|PRIVATE_KEY|CREDENTIALS?)(?:$|_)/i;\r\n\r\nfunction redactString(value: string): string {\r\n let out = value;\r\n for (const pattern of INLINE_SECRET_PATTERNS) {\r\n out = out.replace(pattern, pattern.source.includes('PRIVATE KEY') ? '[REDACTED_PRIVATE_KEY]' : '[REDACTED_SECRET]');\r\n }\r\n out = out.replace(/\\bAuthorization\\s*:\\s*([A-Za-z][A-Za-z0-9._-]*)\\s+[^\\s;,]+/gi, 'Authorization: $1 [REDACTED]');\r\n return out.replace(\r\n /\\b([A-Za-z0-9_]*(?:ACCESS_TOKEN|AUTHORIZATION|API_KEY|SECRET|SECRET_KEY|SERVICE_ROLE_KEY|TOKEN|PASSWORD|PRIVATE_KEY|CREDENTIALS?)[A-Za-z0-9_]*)\\s*=\\s*[\"']?[^\"'\\s;,]+[\"']?/gi,\r\n '$1=[REDACTED]'\r\n );\r\n}\r\n\r\nfunction redactUnknown(value: unknown): unknown {\r\n if (typeof value === 'string') {\r\n return redactString(value);\r\n }\r\n if (Array.isArray(value)) {\r\n return value.map(redactUnknown);\r\n }\r\n if (value && typeof value === 'object') {\r\n const record = value as Record<string, unknown>;\r\n const next: Record<string, unknown> = {};\r\n for (const [key, entry] of Object.entries(record)) {\r\n if (SENSITIVE_ENV_KEYS.test(key)) {\r\n next[key] = '[REDACTED]';\r\n } else {\r\n next[key] = redactUnknown(entry);\r\n }\r\n }\r\n return next;\r\n }\r\n return value;\r\n}\r\n\r\n/** Strip likely secrets before writing scan artifacts to disk. */\r\nexport function sanitizeArtifactForDisk(artifact: CliScanArtifact): CliScanArtifact {\r\n return redactUnknown(artifact) as CliScanArtifact;\r\n}\r\n", "import type { ActionKeyInput } from './types';\n\nconst REPO_MARKERS = [\n '/app/',\n '/src/',\n '/pages/',\n '/components/',\n '/lib/',\n '/server/',\n '/api/',\n '/supabase/',\n '/prisma/',\n '/drizzle/',\n '/db/',\n '/migrations/',\n '/vercel/',\n '/.github/',\n];\n\nfunction slashPath(value: string): string {\n return value.replace(/\\\\/g, '/').replace(/\\/+/g, '/').trim();\n}\n\nfunction stripQueryAndHash(value: string): string {\n const queryIndex = value.search(/[?#]/);\n return queryIndex === -1 ? value : value.slice(0, queryIndex);\n}\n\nfunction trimSlashes(value: string): string {\n return value.replace(/^\\/+/, '').replace(/\\/+$/, '');\n}\n\nfunction stripWindowsDrive(value: string): string {\n return value.replace(/^[a-z]:\\//i, '');\n}\n\nfunction stripAbsolutePrefix(value: string): string {\n const normalized = slashPath(value);\n const isAbsolute = /^[a-z]:\\//i.test(normalized) || normalized.startsWith('/');\n if (!isAbsolute) {\n return normalized;\n }\n\n const lower = normalized.toLowerCase();\n\n for (const marker of REPO_MARKERS) {\n const index = lower.lastIndexOf(marker);\n if (index !== -1) {\n return normalized.slice(index + 1);\n }\n }\n\n return stripWindowsDrive(normalized).replace(/^users\\/[^/]+\\//i, '').replace(/^home\\/[^/]+\\//i, '');\n}\n\nexport function normalizeActionPath(path: string): string {\n return trimSlashes(stripAbsolutePrefix(stripQueryAndHash(path))).toLowerCase();\n}\n\nexport function displayRepoPath(path: string): string {\n return trimSlashes(stripAbsolutePrefix(stripQueryAndHash(path)));\n}\n\nexport function normalizeActionValues(values: string[] = []): string[] {\n return Array.from(new Set(values.map((value) => value.trim().toLowerCase()).filter(Boolean))).sort();\n}\n\nfunction normalizeSegment(value: string | undefined): string | undefined {\n const normalized = value?.trim().toLowerCase();\n return normalized || undefined;\n}\n\nexport function buildActionKey(input: ActionKeyInput): string {\n const segments = [\n normalizeSegment(input.kind),\n normalizeSegment(input.provider),\n normalizeSegment(input.category),\n input.target ? normalizeActionPath(input.target) : undefined,\n ].filter((segment): segment is string => Boolean(segment));\n\n const values = normalizeActionValues(input.values);\n if (values.length > 0) {\n segments.push(values.join(','));\n }\n\n return segments.join(':');\n}\n\nfunction normalizeFingerprintValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n const normalized = value.map((entry) => normalizeFingerprintValue(entry)).filter((entry) => entry !== undefined);\n if (normalized.every((entry) => typeof entry === 'string')) {\n return Array.from(new Set(normalized as string[])).sort();\n }\n return normalized;\n }\n\n if (value && typeof value === 'object') {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>)\n .filter(([, entry]) => entry !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => [key, normalizeFingerprintValue(entry)]),\n );\n }\n\n if (typeof value === 'string') {\n return value.trim();\n }\n\n return value;\n}\n\nexport function actionFingerprint(value: unknown): string {\n return JSON.stringify(normalizeFingerprintValue(value));\n}\n", "import { buildActionKey, displayRepoPath, normalizeActionPath } from './canonical';\nimport type { VibeRavenAction } from './types';\nimport { PUBLIC_COMMAND } from '../contracts/commands';\nimport type { TaskItem } from '../contracts/taskItem';\nimport type { CliScanArtifact } from '../types';\n\nexport interface DeriveActionsInput {\n artifact: CliScanArtifact;\n tasks: TaskItem[];\n paths: {\n reportPath: string;\n playbookPath: string;\n };\n}\n\nfunction verifyActionCommand(id: string): string {\n return `${PUBLIC_COMMAND} verify --action ${id}`;\n}\n\nfunction providerTitle(task: TaskItem): string {\n const provider = task.providerAction?.provider.toLowerCase();\n if (provider === 'stripe') {\n return 'Connect Stripe Webhook';\n }\n if (provider === 'supabase') {\n return 'Confirm Supabase Production Proof';\n }\n if (provider === 'vercel') {\n return 'Confirm Vercel Production Setup';\n }\n return task.title;\n}\n\nfunction deriveProviderAction(task: TaskItem): VibeRavenAction {\n const provider = task.providerAction?.provider.toLowerCase() ?? 'provider';\n const exactStep = task.providerAction?.exactStep ?? task.title;\n const title = providerTitle(task);\n const actionKey = buildActionKey({\n kind: 'provider-action',\n provider,\n category: task.gapId,\n target: exactStep,\n values: [task.providerAction?.doneSignal ?? ''],\n });\n\n return {\n id: 'pending',\n actionKey,\n revision: 1,\n kind: 'provider-action',\n provider,\n title,\n status: provider === 'supabase' ? 'waiting-on-database-proof' : 'waiting-on-provider',\n severity: task.severity,\n gapId: task.gapId,\n readiness: [task.providerAction?.doneSignal ?? 'Provider step identified'],\n target: {\n type: 'provider',\n label: exactStep,\n provider,\n },\n verifyCommand: verifyActionCommand('pending'),\n resumeInstruction: `${title} is complete. Continue VibeRaven from pending.`,\n };\n}\n\nfunction deriveRepoCodeAction(task: TaskItem): VibeRavenAction {\n const targetSource = task.file ?? task.gapId;\n const canonicalFile = normalizeActionPath(targetSource);\n const displayFile = displayRepoPath(targetSource);\n const actionKey = buildActionKey({\n kind: 'repo-code',\n provider: 'repo',\n category: task.gapId,\n target: canonicalFile,\n values: [task.mcpTool ?? '', task.exactFix ?? ''],\n });\n\n return {\n id: 'pending',\n actionKey,\n revision: 1,\n kind: 'repo-code',\n title: task.title,\n status: 'active',\n severity: task.severity,\n gapId: task.gapId,\n readiness: [task.exactFix ?? 'Repo-code fix is available'],\n target: task.file\n ? { type: 'file', label: 'Repo target', path: displayFile }\n : { type: 'command', label: 'Apply repo fix', command: task.mcpTool ?? `${PUBLIC_COMMAND} prompt --gap ${task.gapId}` },\n fileTargets: task.file ? [{ path: displayFile, reason: task.exactFix }] : undefined,\n verifyCommand: verifyActionCommand('pending'),\n resumeInstruction: `${task.title} is complete. Continue VibeRaven from pending.`,\n mcpTool: task.mcpTool,\n mcpArgs: task.mcpArgs,\n fallbackCommand: `${PUBLIC_COMMAND} --heal --apply --gap ${task.gapId} --yes`,\n };\n}\n\nfunction deriveVerifyAction(): VibeRavenAction {\n return {\n id: 'pending',\n actionKey: buildActionKey({\n kind: 'verify',\n provider: 'gate',\n category: 'final',\n target: `${PUBLIC_COMMAND} --strict`,\n }),\n revision: 1,\n kind: 'verify',\n title: 'Run Final Verification',\n status: 'blocked',\n readiness: ['Run after provider and repo-code actions are complete'],\n target: { type: 'command', label: 'Final strict gate', command: `${PUBLIC_COMMAND} --strict` },\n verifyCommand: `${PUBLIC_COMMAND} --strict`,\n resumeInstruction: 'Final verification finished. Continue VibeRaven from pending.',\n };\n}\n\nexport function deriveCurrentActions(input: DeriveActionsInput): VibeRavenAction[] {\n const primaryActions = input.tasks\n .filter((task) => task.fixType === 'provider-action' || task.fixType === 'repo-code')\n .map((task) => (task.fixType === 'provider-action' ? deriveProviderAction(task) : deriveRepoCodeAction(task)));\n\n return [...primaryActions, deriveVerifyAction()];\n}\n", "import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { getProjectArtifactsDir } from '../config';\nimport { actionFingerprint } from './canonical';\nimport type { VibeRavenAction, VibeRavenActionRegistry, VibeRavenRegistryRecord } from './types';\n\nexport function emptyActionRegistry(): VibeRavenActionRegistry {\n return { version: 1, nextId: 1, actions: {} };\n}\n\nexport function actionRegistryPath(cwd: string): string {\n return join(getProjectArtifactsDir(cwd), 'action-registry.json');\n}\n\nexport async function loadActionRegistry(cwd: string): Promise<VibeRavenActionRegistry> {\n try {\n const parsed = JSON.parse(await readFile(actionRegistryPath(cwd), 'utf8')) as VibeRavenActionRegistry;\n if (parsed.version === 1 && Number.isInteger(parsed.nextId) && parsed.actions) {\n return parsed;\n }\n } catch {\n // Missing or invalid registry starts fresh.\n }\n\n return emptyActionRegistry();\n}\n\nexport async function saveActionRegistry(cwd: string, registry: VibeRavenActionRegistry): Promise<void> {\n const dir = getProjectArtifactsDir(cwd);\n await mkdir(dir, { recursive: true });\n await writeFile(actionRegistryPath(cwd), `${JSON.stringify(registry, null, 2)}\\n`, 'utf8');\n}\n\nfunction nextActionId(registry: VibeRavenActionRegistry): string {\n const id = `VR-A${registry.nextId}`;\n registry.nextId += 1;\n return id;\n}\n\nfunction currentFingerprint(action: VibeRavenAction): string {\n return actionFingerprint({\n kind: action.kind,\n title: action.title,\n provider: action.provider,\n readiness: action.readiness ?? [],\n target: action.target,\n copyPayloads: action.copyPayloads ?? [],\n fileTargets: action.fileTargets ?? [],\n verifyCommand: action.verifyCommand,\n resumeInstruction: action.resumeInstruction,\n });\n}\n\nfunction replaceActionHandle(value: string | undefined, id: string): string | undefined {\n return value?.replace(/pending|VR-A\\d+/g, id);\n}\n\nfunction replaceActionTarget(action: VibeRavenAction, id: string): VibeRavenAction['target'] {\n const { target } = action;\n if (!target) {\n return undefined;\n }\n\n if (target.type === 'url') {\n return { ...target, href: replaceActionHandle(target.href, id) ?? target.href };\n }\n\n if (target.type === 'command' || target.type === 'verify') {\n return { ...target, command: replaceActionHandle(target.command, id) ?? target.command };\n }\n\n return target;\n}\n\nexport async function assignActionIds(input: {\n cwd: string;\n actions: VibeRavenAction[];\n currentGapIds?: Set<string>;\n now?: string;\n}): Promise<{ actions: VibeRavenAction[]; registry: VibeRavenActionRegistry }> {\n const now = input.now ?? new Date().toISOString();\n const registry = await loadActionRegistry(input.cwd);\n const seen = new Set<string>();\n\n const actions = input.actions.map((action) => {\n seen.add(action.actionKey);\n const fingerprint = currentFingerprint(action);\n let entry = registry.actions[action.actionKey];\n\n if (!entry) {\n entry = {\n id: nextActionId(registry),\n actionKey: action.actionKey,\n status: 'active',\n createdAt: now,\n lastSeenAt: now,\n revision: 1,\n fingerprint,\n title: action.title,\n gapId: action.gapId,\n kind: action.kind,\n provider: action.provider,\n };\n } else {\n entry.status = 'active';\n entry.lastSeenAt = now;\n entry.title = action.title;\n entry.gapId = action.gapId;\n entry.kind = action.kind;\n entry.provider = action.provider;\n if (entry.fingerprint !== fingerprint) {\n entry.revision += 1;\n entry.fingerprint = fingerprint;\n }\n }\n\n registry.actions[action.actionKey] = entry;\n return {\n ...action,\n id: entry.id,\n revision: entry.revision,\n verifyCommand: replaceActionHandle(action.verifyCommand, entry.id),\n resumeInstruction: replaceActionHandle(action.resumeInstruction, entry.id),\n target: replaceActionTarget(action, entry.id),\n };\n });\n\n for (const entry of Object.values(registry.actions)) {\n if (entry.status === 'active' && !seen.has(entry.actionKey)) {\n entry.status = entry.gapId && input.currentGapIds && !input.currentGapIds.has(entry.gapId) ? 'resolved' : 'stale';\n }\n }\n\n await saveActionRegistry(input.cwd, registry);\n return { actions, registry };\n}\n\nexport async function resolveActionById(cwd: string, id: string): Promise<VibeRavenRegistryRecord | undefined> {\n const registry = await loadActionRegistry(cwd);\n return Object.values(registry.actions).find((entry) => entry.id === id);\n}\n", "import { writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { getProjectArtifactsDir } from '../config';\nimport type { TaskItem } from '../contracts/taskItem';\nimport type { CliScanArtifact } from '../types';\nimport { deriveCurrentActions } from './derive';\nimport { assignActionIds, actionRegistryPath } from './registry';\nimport type { VibeRavenActionsManifest } from './types';\n\nexport interface WriteActionArtifactsInput {\n cwd: string;\n artifact: CliScanArtifact;\n tasks: TaskItem[];\n paths: {\n reportPath: string;\n playbookPath: string;\n };\n}\n\nexport interface WriteActionArtifactsResult {\n actionsPath: string;\n actionRegistryPath: string;\n manifest: VibeRavenActionsManifest;\n}\n\nfunction gateStatus(artifact: CliScanArtifact): 'clear' | 'not_clear' | 'unknown' {\n if (!Array.isArray(artifact.gaps)) {\n return 'unknown';\n }\n return artifact.gaps.length === 0 ? 'clear' : 'not_clear';\n}\n\nexport async function writeActionArtifacts(input: WriteActionArtifactsInput): Promise<WriteActionArtifactsResult> {\n const derived = deriveCurrentActions({\n artifact: input.artifact,\n tasks: input.tasks,\n paths: input.paths,\n });\n const currentGapIds = new Set(input.artifact.gaps.map((gap) => gap.id));\n const assigned = await assignActionIds({\n cwd: input.cwd,\n actions: derived,\n currentGapIds,\n });\n const manifest: VibeRavenActionsManifest = {\n version: 1,\n generatedAt: new Date().toISOString(),\n workspaceRoot: '.',\n gateStatus: gateStatus(input.artifact),\n actions: assigned.actions,\n };\n const actionsPath = join(getProjectArtifactsDir(input.cwd), 'actions.json');\n await writeFile(actionsPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\n\n return {\n actionsPath,\n actionRegistryPath: actionRegistryPath(input.cwd),\n manifest,\n };\n}\n", "import { copyFile, mkdir, writeFile } from 'node:fs/promises';\r\nimport { join } from 'node:path';\r\nimport type { CliScanArtifact } from './types';\r\nimport { generateContextMap } from './contracts/contextMap';\r\nimport { generateGateResult } from './contracts/gateResult';\r\nimport { generateGapEvidenceFiles } from './contracts/gapEvidence';\r\nimport { generateAgentSummary } from './report/agentSummary';\r\nimport { buildTaskList, buildTaskListMarkdown } from './buildTaskList';\r\nimport { generateLaunchPlaybook } from './report/launchPlaybook';\r\nimport { generateReportHtml } from './report/reportHtml';\r\nimport { getBundledReportAssetsDir, REPORT_ASSET_FILES } from './report/reportAssets';\nimport { getProjectArtifactsDir } from './config';\nimport { sanitizeArtifactForDisk } from './sanitizeArtifact';\nimport { writeActionArtifacts } from './actions/artifacts';\n\r\nexport interface WriteArtifactsOptions {\r\n artifact: CliScanArtifact;\r\n cwd?: string;\r\n}\r\n\r\nexport interface WriteArtifactsResult {\r\n dir: string;\r\n jsonPath: string;\r\n gateResultPath: string;\r\n contextMapPath: string;\r\n gapsDir: string;\r\n tasklistPath: string;\r\n summaryPath: string;\r\n playbookPath: string;\n reportPath: string;\n reportAssetsDir: string;\n actionsPath: string;\n actionRegistryPath: string;\n}\n\r\nasync function copyReportAssets(reportAssetsDir: string): Promise<void> {\r\n const sourceDir = getBundledReportAssetsDir();\r\n await mkdir(join(reportAssetsDir, 'assets'), { recursive: true });\r\n\r\n for (const rel of REPORT_ASSET_FILES) {\r\n await copyFile(join(sourceDir, rel), join(reportAssetsDir, rel));\r\n }\r\n}\r\n\r\nexport async function writeScanArtifacts(options: WriteArtifactsOptions): Promise<WriteArtifactsResult> {\r\n const cwd = options.cwd ?? options.artifact.workspacePath;\r\n const dir = getProjectArtifactsDir(cwd);\r\n await mkdir(dir, { recursive: true });\r\n\r\n const jsonPath = join(dir, 'last-scan.json');\r\n const gateResultPath = join(dir, 'gate-result.json');\r\n const contextMapPath = join(dir, 'context-map.json');\r\n const gapsDir = join(dir, 'gaps');\r\n const tasklistPath = join(dir, 'agent-tasklist.md');\r\n const summaryPath = join(dir, 'agent-summary.md');\r\n const playbookPath = join(dir, 'launch-playbook.md');\r\n const reportPath = join(dir, 'report.html');\r\n const reportAssetsDir = join(dir, 'report');\r\n\r\n await mkdir(gapsDir, { recursive: true });\r\n\r\n const safe = sanitizeArtifactForDisk(options.artifact);\r\n const json = `${JSON.stringify(safe, null, 2)}\\n`;\r\n const summary = generateAgentSummary(safe);\r\n const playbook = generateLaunchPlaybook(safe);\r\n const html = generateReportHtml(safe);\r\n const tasks = buildTaskList(safe);\r\n const tasklist = buildTaskListMarkdown(tasks);\r\n const gateResult = `${JSON.stringify(generateGateResult(safe), null, 2)}\\n`;\r\n const contextMap = `${JSON.stringify(generateContextMap(safe), null, 2)}\\n`;\r\n const gapEvidenceFiles = generateGapEvidenceFiles(safe);\r\n\r\n await copyReportAssets(reportAssetsDir);\r\n await writeFile(gateResultPath, gateResult, 'utf-8');\r\n await writeFile(contextMapPath, contextMap, 'utf-8');\r\n for (const gap of gapEvidenceFiles) {\r\n await writeFile(join(dir, 'gaps', `${gap.content.id}.json`), `${JSON.stringify(gap.content, null, 2)}\\n`, 'utf-8');\r\n }\r\n await writeFile(tasklistPath, tasklist, 'utf-8');\r\n await writeFile(jsonPath, json, 'utf-8');\r\n await writeFile(summaryPath, summary, 'utf-8');\n await writeFile(playbookPath, playbook, 'utf-8');\n await writeFile(reportPath, html, 'utf-8');\n const actionArtifacts = await writeActionArtifacts({\n cwd,\n artifact: safe,\n tasks,\n paths: { reportPath, playbookPath },\n });\n\n return {\n dir,\n jsonPath,\r\n gateResultPath,\r\n contextMapPath,\r\n gapsDir,\r\n tasklistPath,\r\n summaryPath,\r\n playbookPath,\n reportPath,\n reportAssetsDir,\n actionsPath: actionArtifacts.actionsPath,\n actionRegistryPath: actionArtifacts.actionRegistryPath,\n };\n}\n", "import type { GateResult } from '../contracts/gateResult';\n\nexport function renderGateResultJson(result: GateResult): string {\n return `${JSON.stringify(result, null, 2)}\\n`;\n}\n", "import type { GateResult } from '../contracts/gateResult';\n\nexport type VibeRavenJsonlEvent =\n | { type: 'viberaven.run.started'; runId: string; mode: string }\n | { type: 'viberaven.artifact.written'; path: string }\n | { type: 'viberaven.gap.detected'; id: string; severity: string; area: string }\n | { type: 'viberaven.run.completed'; gateStatus: string; criticalCount: number; warningCount: number };\n\nexport function gateResultEvents(result: GateResult): VibeRavenJsonlEvent[] {\n return [\n { type: 'viberaven.run.started', runId: result.runId, mode: result.mode },\n { type: 'viberaven.artifact.written', path: result.artifacts.gateResult },\n { type: 'viberaven.artifact.written', path: result.artifacts.tasklist },\n { type: 'viberaven.artifact.written', path: result.artifacts.contextMap },\n ...result.topGapIds.map((id) => ({ type: 'viberaven.gap.detected' as const, id, severity: 'unknown', area: 'unknown' })),\n {\n type: 'viberaven.run.completed',\n gateStatus: result.gate.status,\n criticalCount: result.gate.criticalCount,\n warningCount: result.gate.warningCount,\n },\n ];\n}\n\nexport function renderJsonlEvents(result: GateResult): string {\n return `${gateResultEvents(result).map((event) => JSON.stringify(event)).join('\\n')}\\n`;\n}\n", "import type { GateResult } from '../contracts/gateResult';\n\nexport function exitCodeForStrictGate(\n result: GateResult,\n options: { failOnWarnings?: boolean } = {}\n): number {\n if (result.gate.status === 'error') return 2;\n if (result.gate.status === 'unknown') return 3;\n if (result.gate.status === 'not_clear') return 1;\n if (options.failOnWarnings && result.gate.warningCount > 0) return 1;\n return 0;\n}\n", "import { loadLastArtifact, ScanNotFoundError } from '../tui/menu';\r\nimport { writeScanArtifacts, type WriteArtifactsResult } from '../artifacts';\r\nimport { findArtifactsWorkspace } from '../config';\r\n\r\n/** Rebuild `.viberaven/report.html` from existing `last-scan.json` (no API scan). */\r\nexport async function refreshReportFromDisk(startDir: string): Promise<WriteArtifactsResult> {\r\n const workspace = await findArtifactsWorkspace(startDir);\r\n if (!workspace) {\r\n throw new ScanNotFoundError();\r\n }\r\n const artifact = await loadLastArtifact(startDir);\r\n return writeScanArtifacts({ artifact, cwd: workspace });\r\n}\r\n", "import { spawn } from 'node:child_process';\r\n\r\n/**\r\n * Copy text to the system clipboard (Windows clip, macOS pbcopy, Linux wl-copy/xclip).\r\n */\r\nexport async function copyToClipboard(text: string): Promise<void> {\r\n if (!text) {\r\n throw new Error('Nothing to copy.');\r\n }\r\n\r\n if (process.platform === 'win32') {\r\n await pipeToCommand('clip', text);\r\n return;\r\n }\r\n\r\n if (process.platform === 'darwin') {\r\n await pipeToCommand('pbcopy', text);\r\n return;\r\n }\r\n\r\n try {\r\n await pipeToCommand('wl-copy', text);\r\n return;\r\n } catch {\r\n // fall through\r\n }\r\n\r\n try {\r\n await pipeToCommand('xclip', text, ['-selection', 'clipboard']);\r\n return;\r\n } catch {\r\n throw new Error('Clipboard unavailable. Install wl-clipboard or xclip, or copy from the terminal output.');\r\n }\r\n}\r\n\r\nfunction pipeToCommand(command: string, text: string, extraArgs: string[] = []): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const child = spawn(command, extraArgs, { stdio: ['pipe', 'ignore', 'ignore'] });\r\n child.on('error', reject);\r\n child.on('close', (code) => {\r\n if (code === 0) {\r\n resolve();\r\n } else {\r\n reject(new Error(`${command} exited with code ${code ?? 'unknown'}`));\r\n }\r\n });\r\n child.stdin?.write(text, 'utf8', (error) => {\r\n if (error) {\r\n reject(error);\r\n return;\r\n }\r\n child.stdin?.end();\r\n });\r\n });\r\n}\r\n", "let p = process || {}, argv = p.argv || [], env = p.env || {}\nlet isColorSupported =\n\t!(!!env.NO_COLOR || argv.includes(\"--no-color\")) &&\n\t(!!env.FORCE_COLOR || argv.includes(\"--color\") || p.platform === \"win32\" || ((p.stdout || {}).isTTY && env.TERM !== \"dumb\") || !!env.CI)\n\nlet formatter = (open, close, replace = open) =>\n\tinput => {\n\t\tlet string = \"\" + input, index = string.indexOf(close, open.length)\n\t\treturn ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close\n\t}\n\nlet replaceClose = (string, close, replace, index) => {\n\tlet result = \"\", cursor = 0\n\tdo {\n\t\tresult += string.substring(cursor, index) + replace\n\t\tcursor = index + close.length\n\t\tindex = string.indexOf(close, cursor)\n\t} while (~index)\n\treturn result + string.substring(cursor)\n}\n\nlet createColors = (enabled = isColorSupported) => {\n\tlet f = enabled ? formatter : () => String\n\treturn {\n\t\tisColorSupported: enabled,\n\t\treset: f(\"\\x1b[0m\", \"\\x1b[0m\"),\n\t\tbold: f(\"\\x1b[1m\", \"\\x1b[22m\", \"\\x1b[22m\\x1b[1m\"),\n\t\tdim: f(\"\\x1b[2m\", \"\\x1b[22m\", \"\\x1b[22m\\x1b[2m\"),\n\t\titalic: f(\"\\x1b[3m\", \"\\x1b[23m\"),\n\t\tunderline: f(\"\\x1b[4m\", \"\\x1b[24m\"),\n\t\tinverse: f(\"\\x1b[7m\", \"\\x1b[27m\"),\n\t\thidden: f(\"\\x1b[8m\", \"\\x1b[28m\"),\n\t\tstrikethrough: f(\"\\x1b[9m\", \"\\x1b[29m\"),\n\n\t\tblack: f(\"\\x1b[30m\", \"\\x1b[39m\"),\n\t\tred: f(\"\\x1b[31m\", \"\\x1b[39m\"),\n\t\tgreen: f(\"\\x1b[32m\", \"\\x1b[39m\"),\n\t\tyellow: f(\"\\x1b[33m\", \"\\x1b[39m\"),\n\t\tblue: f(\"\\x1b[34m\", \"\\x1b[39m\"),\n\t\tmagenta: f(\"\\x1b[35m\", \"\\x1b[39m\"),\n\t\tcyan: f(\"\\x1b[36m\", \"\\x1b[39m\"),\n\t\twhite: f(\"\\x1b[37m\", \"\\x1b[39m\"),\n\t\tgray: f(\"\\x1b[90m\", \"\\x1b[39m\"),\n\n\t\tbgBlack: f(\"\\x1b[40m\", \"\\x1b[49m\"),\n\t\tbgRed: f(\"\\x1b[41m\", \"\\x1b[49m\"),\n\t\tbgGreen: f(\"\\x1b[42m\", \"\\x1b[49m\"),\n\t\tbgYellow: f(\"\\x1b[43m\", \"\\x1b[49m\"),\n\t\tbgBlue: f(\"\\x1b[44m\", \"\\x1b[49m\"),\n\t\tbgMagenta: f(\"\\x1b[45m\", \"\\x1b[49m\"),\n\t\tbgCyan: f(\"\\x1b[46m\", \"\\x1b[49m\"),\n\t\tbgWhite: f(\"\\x1b[47m\", \"\\x1b[49m\"),\n\n\t\tblackBright: f(\"\\x1b[90m\", \"\\x1b[39m\"),\n\t\tredBright: f(\"\\x1b[91m\", \"\\x1b[39m\"),\n\t\tgreenBright: f(\"\\x1b[92m\", \"\\x1b[39m\"),\n\t\tyellowBright: f(\"\\x1b[93m\", \"\\x1b[39m\"),\n\t\tblueBright: f(\"\\x1b[94m\", \"\\x1b[39m\"),\n\t\tmagentaBright: f(\"\\x1b[95m\", \"\\x1b[39m\"),\n\t\tcyanBright: f(\"\\x1b[96m\", \"\\x1b[39m\"),\n\t\twhiteBright: f(\"\\x1b[97m\", \"\\x1b[39m\"),\n\n\t\tbgBlackBright: f(\"\\x1b[100m\", \"\\x1b[49m\"),\n\t\tbgRedBright: f(\"\\x1b[101m\", \"\\x1b[49m\"),\n\t\tbgGreenBright: f(\"\\x1b[102m\", \"\\x1b[49m\"),\n\t\tbgYellowBright: f(\"\\x1b[103m\", \"\\x1b[49m\"),\n\t\tbgBlueBright: f(\"\\x1b[104m\", \"\\x1b[49m\"),\n\t\tbgMagentaBright: f(\"\\x1b[105m\", \"\\x1b[49m\"),\n\t\tbgCyanBright: f(\"\\x1b[106m\", \"\\x1b[49m\"),\n\t\tbgWhiteBright: f(\"\\x1b[107m\", \"\\x1b[49m\"),\n\t}\n}\n\nmodule.exports = createColors()\nmodule.exports.createColors = createColors\n", "import type { MissionArea } from '../../../../src/station/types';\n\nexport type ProviderMission = MissionArea['providerMissions'][number];\n\nexport function normalizeProviderToken(value: string): string {\n return value.toLowerCase().replace(/&/g, 'and').replace(/[^a-z0-9]+/g, '');\n}\n\nexport function missionMatchesProvider(mission: ProviderMission, provider: string): boolean {\n const current = normalizeProviderToken(provider);\n return normalizeProviderToken(mission.provider || mission.providerLabel || mission.key) === current ||\n normalizeProviderToken(mission.providerLabel || mission.provider || mission.key) === current;\n}\n\nexport function missionEvidenceScore(mission: ProviderMission): number {\n const repoVerified = mission.checks.filter((check) => check.evidenceClass === 'repo-verified' || check.status === 'passed').length;\n const missing = mission.checks.filter((check) =>\n check.evidenceClass === 'missing-repo-fix' || check.status === 'missing' || check.status === 'failed'\n ).length;\n return repoVerified * 100 + (mission.readinessPercent ?? 0) - missing;\n}\n\nexport function preferredMissionForArea(area: MissionArea | undefined, selectedProvider: string): ProviderMission | undefined {\n const missions = area?.providerMissions ?? [];\n if (missions.length === 0) {\n return undefined;\n }\n const selected = selectedProvider ? missions.find((mission) => missionMatchesProvider(mission, selectedProvider)) : undefined;\n if (selected) {\n return selected;\n }\n return [...missions].sort((a, b) => missionEvidenceScore(b) - missionEvidenceScore(a))[0] ?? missions[0];\n}\n\nexport function openChecksForMission(mission: ProviderMission | undefined): number {\n if (!mission) {\n return 0;\n }\n return mission.checks.filter((check) =>\n check.status === 'missing' || check.status === 'failed' || check.status === 'needs-connection'\n ).length;\n}\n", "import pc from 'picocolors';\nimport type { CliScanArtifact } from './types';\nimport { openChecksForMission, preferredMissionForArea } from './report/missionSelection';\nimport { AGENT_ACTION, formatAgentStatus, MANUAL_ACTION_REQUIRED, READY } from './statusLabels';\nimport { resolveNextAction } from './resolveNextAction';\n\r\nfunction boxLine(content: string, width: number): string {\r\n const inner = content.length > width - 4 ? content.slice(0, width - 7) + '\u2026' : content;\r\n const padding = ' '.repeat(Math.max(0, width - inner.length - 4));\r\n return `${pc.dim('\u2502')} ${inner}${padding} ${pc.dim('\u2502')}`;\r\n}\r\n\r\nfunction readinessColor(percent: number): (text: string) => string {\r\n if (percent >= 70) {\r\n return pc.green;\r\n }\r\n if (percent >= 40) {\r\n return pc.yellow;\r\n }\r\n return pc.red;\r\n}\r\n\r\nfunction gapTagColor(modelGaps: number, open: number): (text: string) => string {\r\n if (modelGaps > 0) {\r\n return pc.red;\r\n }\r\n if (open > 0) {\r\n return pc.yellow;\r\n }\r\n return pc.dim;\r\n}\r\n\r\nfunction manualActionCheckCount(artifact: CliScanArtifact): number {\r\n return (artifact.missionGraph.areas ?? []).reduce((areaTotal, area) => {\r\n return areaTotal + area.providerMissions.reduce((missionTotal, mission) => {\r\n return missionTotal + mission.checks.filter(\r\n (check) =>\r\n check.evidenceClass === 'manual-dashboard' ||\r\n check.evidenceClass === 'mcp-verifier' ||\r\n check.evidenceSource === 'provider' ||\r\n check.evidenceSource === 'mcp' ||\r\n check.status === 'needs-connection' ||\r\n check.status === 'unknown'\r\n ).length;\r\n }, 0);\r\n }, 0);\r\n}\r\n\r\nexport function printScanSummary(\r\n artifact: CliScanArtifact,\r\n paths: { reportPath: string; jsonPath: string; summaryPath: string; playbookPath: string }\r\n): void {\r\n const pct = artifact.productionCorePercent;\r\n const gapCount = artifact.gaps.length;\r\n const pctColor = readinessColor(pct);\r\n\r\n const headline = `${pc.bold('VibeRaven')} \u00B7 ${pctColor(`Production core ${pct}%`)} \u00B7 ${gapCount} gap(s)`;\r\n const subline = `Score ${artifact.score} \u00B7 ${artifact.scoreLabel}`;\r\n const width = Math.max(headline.length, subline.length, 44) + 4;\r\n\r\n console.log('');\r\n console.log(pc.dim('\u250C') + pc.dim('\u2500'.repeat(width - 2)) + pc.dim('\u2510'));\r\n console.log(boxLine(headline, width));\r\n console.log(boxLine(subline, width));\r\n console.log(pc.dim('\u2514') + pc.dim('\u2500'.repeat(width - 2)) + pc.dim('\u2518'));\r\n console.log('');\r\n\r\n for (const area of artifact.missionGraph.areas ?? []) {\r\n const mission = preferredMissionForArea(area, artifact.selectedProviders?.[area.key] ?? '');\r\n if (!mission) {\r\n continue;\r\n }\r\n const open = openChecksForMission(mission);\r\n const modelGaps = artifact.gaps.filter((g) => g.primaryMapCategory === area.key).length;\r\n const tag =\r\n modelGaps > 0 ? ` GAP ${modelGaps}` : open > 0 ? ` ${open} fix` : '';\r\n const tagColored = tag ? gapTagColor(modelGaps, open)(tag) : '';\r\n const label = area.label.padEnd(18);\r\n const provider = mission.providerLabel.padEnd(14);\r\n const readiness = readinessColor(mission.readinessPercent)(`${mission.readinessPercent}%`);\r\n console.log(` ${pc.dim(label)} ${provider} ${readiness}${tagColored}`);\r\n }\r\n\r\n console.log('');\r\n console.log(pc.bold('Artifacts:'));\r\n console.log(pc.dim(` ${paths.reportPath}`));\r\n console.log(pc.dim(` ${paths.jsonPath}`));\r\n console.log(pc.dim(` ${paths.summaryPath}`));\n console.log(pc.dim(` ${paths.playbookPath}`));\n console.log('');\n\n const next = resolveNextAction(artifact);\n console.log(`Open report: ${paths.reportPath}`);\n console.log(`Next action: ${next.title}`);\n console.log(next.detail);\n if (next.command) {\n console.log(`Run: ${next.command}`);\n }\n if (next.openUrl) {\n console.log(`Open: ${next.openUrl}`);\n }\n if (next.upgradeUrl) {\n console.log(`Upgrade: ${next.upgradeUrl}`);\n }\n console.log(formatAgentStatus(AGENT_ACTION, 'Keep operating: read .viberaven/agent-tasklist.md, apply the next safe repo fix, then continue the VibeRaven loop.'));\n console.log('');\n\n if (artifact.usage) {\n const lanes = artifact.usage.unlockedMapCategoryKeys.length;\n console.log(\r\n pc.dim(\r\n `Scans: ${artifact.usage.used}/${artifact.usage.limit} used \u00B7 ${lanes}/12 lanes \u00B7 \\`viberaven next\\` for one action`\r\n )\r\n );\r\n if (lanes < 12) {\r\n console.log(pc.dim('Upgrade for deploy/monitoring/testing lanes: https://viberaven.dev/pricing'));\r\n }\r\n console.log('');\r\n }\r\n console.log(pc.dim('Press Enter in `viberaven` menu to rescan \u00B7 `viberaven next` for top action'));\r\n console.log(pc.dim('Agents: read .viberaven/agent-summary.md and launch-playbook.md'));\r\n console.log(formatAgentStatus(READY, `Scan complete. Read ${paths.summaryPath} before changing code.`));\r\n const manualCount = manualActionCheckCount(artifact);\r\n if (manualCount > 0) {\r\n console.log(formatAgentStatus(MANUAL_ACTION_REQUIRED, `${manualCount} provider dashboard or read-only MCP check${manualCount === 1 ? '' : 's'} require user/provider verification. Do not claim these as repo-code fixes.`));\r\n }\r\n console.log('');\r\n}\r\n", "import type { RunnerJobKind } from './deploy';\r\n\r\nexport type SafeFixJobKind = Extract<RunnerJobKind, 'create_file' | 'apply_patch'>;\r\n\r\nexport type RunnerSafeFixInput = {\r\n approved: true;\r\n path: string;\r\n content: string;\r\n expectedExistingContent?: string;\r\n description?: string;\r\n reason?: string;\r\n riskLevel: 'low' | 'medium';\r\n verificationCommand?: string;\r\n};\r\n\r\nexport type SafeFixValidationResult =\r\n | { ok: true; input: RunnerSafeFixInput }\r\n | { ok: false; reason: string };\r\n\r\nconst MAX_SAFE_FIX_CONTENT_BYTES = 200_000;\r\nconst ALLOWED_VERIFICATION_COMMANDS = new Set([\r\n 'npm run build',\r\n 'npm run test',\r\n 'npm test',\r\n 'pnpm build',\r\n 'pnpm test',\r\n 'yarn build',\r\n 'yarn test',\r\n 'bun run build',\r\n 'bun run test',\r\n 'bun test'\r\n]);\r\n\r\nexport function validateSafeFixJobInput(\r\n kind: RunnerJobKind,\r\n rawInput: unknown\r\n): SafeFixValidationResult {\r\n if (kind !== 'create_file' && kind !== 'apply_patch') {\r\n return isEmptyInput(rawInput)\r\n ? { ok: true, input: {} as RunnerSafeFixInput }\r\n : { ok: false, reason: 'Runner job input is only supported for safe-fix jobs.' };\r\n }\r\n\r\n if (!isRecord(rawInput)) {\r\n return { ok: false, reason: 'Safe fix input must be an object.' };\r\n }\r\n if (rawInput.approved !== true) {\r\n return { ok: false, reason: 'Safe fix requires explicit approval.' };\r\n }\r\n if (rawInput.riskLevel !== 'low' && rawInput.riskLevel !== 'medium') {\r\n return { ok: false, reason: 'Safe fix risk level must be low or medium.' };\r\n }\r\n if (typeof rawInput.path !== 'string') {\r\n return { ok: false, reason: 'Safe fix path is required.' };\r\n }\r\n const pathValidation = validateSafeFixRelativePath(rawInput.path);\r\n if (!pathValidation.ok) {\r\n return pathValidation;\r\n }\r\n if (typeof rawInput.content !== 'string') {\r\n return { ok: false, reason: 'Safe fix content is required.' };\r\n }\r\n if (!isSafeText(rawInput.content)) {\r\n return { ok: false, reason: 'Safe fix content must be bounded text.' };\r\n }\r\n if (containsSecretLikeValue(rawInput.content)) {\r\n return { ok: false, reason: 'Safe fix content contains a secret-like value.' };\r\n }\r\n if (kind === 'apply_patch') {\r\n if (typeof rawInput.expectedExistingContent !== 'string') {\r\n return { ok: false, reason: 'Safe update requires expectedExistingContent.' };\r\n }\r\n if (!isSafeText(rawInput.expectedExistingContent)) {\r\n return { ok: false, reason: 'Expected existing content must be bounded text.' };\r\n }\r\n if (containsSecretLikeValue(rawInput.expectedExistingContent)) {\r\n return { ok: false, reason: 'Expected existing content contains a secret-like value.' };\r\n }\r\n }\r\n if (\r\n typeof rawInput.description !== 'string' &&\r\n typeof rawInput.reason !== 'string'\r\n ) {\r\n return { ok: false, reason: 'Safe fix requires a description or reason.' };\r\n }\r\n\r\n const verificationCommand =\r\n typeof rawInput.verificationCommand === 'string'\r\n ? rawInput.verificationCommand.trim()\r\n : undefined;\r\n if (verificationCommand && !ALLOWED_VERIFICATION_COMMANDS.has(verificationCommand)) {\r\n return { ok: false, reason: 'Verification command must be a build or test package script.' };\r\n }\r\n\r\n return {\r\n ok: true,\r\n input: {\r\n approved: true,\r\n path: pathValidation.path,\r\n content: rawInput.content,\r\n ...(kind === 'apply_patch' ? { expectedExistingContent: rawInput.expectedExistingContent as string } : {}),\r\n ...(typeof rawInput.description === 'string' ? { description: rawInput.description } : {}),\r\n ...(typeof rawInput.reason === 'string' ? { reason: rawInput.reason } : {}),\r\n riskLevel: rawInput.riskLevel,\r\n ...(verificationCommand ? { verificationCommand } : {})\r\n }\r\n };\r\n}\r\n\r\nexport function validateSafeFixRelativePath(path: string): { ok: true; path: string } | { ok: false; reason: string } {\r\n const trimmed = path.trim();\r\n if (!trimmed) {\r\n return { ok: false, reason: 'Safe fix path must not be empty.' };\r\n }\r\n if (\r\n trimmed.startsWith('/') ||\r\n trimmed.startsWith('\\\\') ||\r\n trimmed.startsWith('//') ||\r\n trimmed.startsWith('\\\\\\\\') ||\r\n /^[A-Za-z]:[\\\\/]/.test(trimmed)\r\n ) {\r\n return { ok: false, reason: 'Safe fix path must be relative.' };\r\n }\r\n\r\n const normalized = trimmed.replace(/\\\\/g, '/');\r\n const segments = normalized.split('/');\r\n if (segments.some((segment) => segment === '' || segment === '.' || segment === '..')) {\r\n return { ok: false, reason: 'Safe fix path must not traverse directories.' };\r\n }\r\n if (segments.some((segment) => segment === '.git' || segment === 'node_modules')) {\r\n return { ok: false, reason: 'Safe fix path targets a blocked directory.' };\r\n }\r\n\r\n const basename = segments.at(-1)?.toLowerCase() ?? '';\r\n if (basename !== '.env.example' && (basename === '.env' || basename.startsWith('.env.'))) {\r\n return { ok: false, reason: 'Safe fix path targets an environment secret file.' };\r\n }\r\n if (isSecretLikeFilename(basename)) {\r\n return { ok: false, reason: 'Safe fix path targets a secret-like file.' };\r\n }\r\n if (!isAllowedSafeFixPath(normalized)) {\r\n return { ok: false, reason: 'Safe fix path is outside the V1 allowlist.' };\r\n }\r\n\r\n return { ok: true, path: normalized };\r\n}\r\n\r\nexport function isSafeFixJobKind(kind: RunnerJobKind): kind is SafeFixJobKind {\r\n return kind === 'create_file' || kind === 'apply_patch';\r\n}\r\n\r\nexport function containsSecretLikeValue(value: string): boolean {\r\n return SECRET_VALUE_PATTERNS.some((pattern) => pattern.test(value));\r\n}\r\n\r\nconst SECRET_VALUE_PATTERNS = [\r\n /-----BEGIN [A-Z ]*PRIVATE KEY-----[\\s\\S]*?-----END [A-Z ]*PRIVATE KEY-----/i,\r\n /\\b(?:postgres|postgresql|mysql|mongodb|redis):\\/\\/[^:\\s/@]+:[^@\\s]+@/i,\r\n /\\b(?:ghp_[A-Za-z0-9]{36,}|github_pat_[A-Za-z0-9_]{50,})\\b/,\r\n /\\b(?:sk_live_|sk_test_)[A-Za-z0-9]{16,}\\b/,\r\n /\\bsk-[A-Za-z0-9_-]{20,}\\b/,\r\n /\\bwhsec_[A-Za-z0-9]{12,}\\b/,\r\n /\\beyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\b/\r\n];\r\n\r\nfunction isAllowedSafeFixPath(path: string): boolean {\r\n if (path === '.env.example') {\r\n return true;\r\n }\r\n const segments = path.split('/');\r\n if (segments.length !== 2) {\r\n return false;\r\n }\r\n const [dir, filename] = segments;\r\n if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(filename)) {\r\n return false;\r\n }\r\n if (dir === 'docs') {\r\n return filename.endsWith('.md');\r\n }\r\n if (dir === '.viberaven') {\r\n return filename.endsWith('.md') || filename.endsWith('.json');\r\n }\r\n return false;\r\n}\r\n\r\nfunction isSecretLikeFilename(filename: string): boolean {\r\n return (\r\n filename.includes('service-account') ||\r\n filename.includes('credential') ||\r\n filename.includes('credentials') ||\r\n filename.includes('private-key') ||\r\n filename.includes('private_key') ||\r\n filename === 'id_rsa' ||\r\n filename === 'id_dsa' ||\r\n filename === 'id_ed25519' ||\r\n filename.endsWith('.pem') ||\r\n filename.endsWith('.p12') ||\r\n filename.endsWith('.pfx') ||\r\n filename.includes('secret')\r\n );\r\n}\r\n\r\nfunction isSafeText(value: string): boolean {\r\n return !value.includes('\\0') && new TextEncoder().encode(value).length <= MAX_SAFE_FIX_CONTENT_BYTES;\r\n}\r\n\r\nfunction isEmptyInput(value: unknown): boolean {\r\n return value === undefined || (isRecord(value) && Object.keys(value).length === 0);\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null && !Array.isArray(value);\r\n}\r\n", "import { access, link, lstat, mkdir, readFile, realpath, rename, rm, writeFile } from 'node:fs/promises';\r\nimport { basename, dirname, isAbsolute, join, relative, resolve } from 'node:path';\r\nimport { execFile } from 'node:child_process';\r\nimport { randomUUID } from 'node:crypto';\r\n\r\nimport type {\r\n DeploySession,\r\n ProofItem,\r\n RedactedLocalRepo,\r\n RunnerActionResult,\r\n RunnerCapability,\r\n RunnerHandshakeRequest,\r\n RunnerHandshakeResponse,\r\n RunnerJob,\r\n RunnerQueuedJobsResponse\r\n} from '../../../shared/deploy';\r\nimport { loadCredentials, saveRunnerSessionCredentials } from './config';\r\nimport { runProjectScan, type RunScanResult } from './runScan';\r\nimport { sanitizeArtifactForDisk } from './sanitizeArtifact';\r\nimport type { CliScanArtifact } from './types';\r\nimport {\r\n isSafeFixJobKind,\r\n type RunnerSafeFixInput,\r\n validateSafeFixJobInput\r\n} from '../../../shared/runnerSafeFix';\r\n\r\nexport type PackageManager = DeploySession['packageManager'];\r\n\r\nexport interface CommandResult {\r\n ok: boolean;\r\n stdout: string;\r\n stderr?: string;\r\n}\r\n\r\nexport type CommandRunner = (command: string, args: string[], cwd: string) => Promise<CommandResult>;\r\nexport type FetchLike = (url: string, init: RequestInit) => Promise<Response>;\r\nexport type RunProjectScanFn = typeof runProjectScan;\r\n\r\nexport interface RunnerConnectArgs {\r\n launchSessionId: string;\r\n oneTimeToken: string;\r\n once: boolean;\r\n}\r\n\r\nexport interface RunnerConnectOptions extends RunnerConnectArgs {\r\n apiBaseUrl: string;\r\n workspaceRoot: string;\r\n runnerVersion: string;\r\n commandRunner?: CommandRunner;\r\n fetchImpl?: FetchLike;\r\n runProjectScan?: RunProjectScanFn;\r\n}\r\n\r\nexport interface RunnerWatchOptions {\r\n apiBaseUrl: string;\r\n workspaceRoot: string;\r\n runnerSessionId: string;\r\n runnerAccessToken: string;\r\n redactionSecrets?: string[];\r\n commandRunner?: CommandRunner;\r\n fetchImpl?: FetchLike;\r\n runProjectScan?: RunProjectScanFn;\r\n pollIntervalMs?: number;\r\n signal?: AbortSignal;\r\n onPollError?: (error: unknown) => void;\r\n}\r\n\r\nexport const RUNNER_POLL_INTERVAL_MS = 3000;\r\n\r\nexport const RUNNER_CAPABILITIES: RunnerCapability[] = [\r\n 'read_files',\r\n 'run_build',\r\n 'run_tests',\r\n 'apply_patch',\r\n 'open_url',\r\n 'deep_station_scan'\r\n];\r\n\r\nexport function parseRunnerConnectFlags(flags: Record<string, string | boolean>): RunnerConnectArgs {\r\n const launchSessionId = typeof flags.session === 'string' ? flags.session.trim() : '';\r\n const oneTimeToken = typeof flags.token === 'string' ? flags.token.trim() : '';\r\n\r\n if (!launchSessionId || !oneTimeToken) {\r\n throw new Error('Usage: viberaven connect --session <launchSessionId> --token <oneTimeToken>');\r\n }\r\n\r\n return { launchSessionId, oneTimeToken, once: flags.once === true };\r\n}\r\n\r\nexport async function runRunnerConnect(options: RunnerConnectOptions): Promise<RunnerHandshakeResponse> {\r\n const localRepo = await collectLocalRepoMetadata(options.workspaceRoot, options.commandRunner);\r\n const payload = buildRunnerHandshakeRequest({\r\n launchSessionId: options.launchSessionId,\r\n oneTimeToken: options.oneTimeToken,\r\n runnerVersion: options.runnerVersion,\r\n localRepo\r\n });\r\n\r\n const handshake = await postRunnerHandshake(options.apiBaseUrl, payload, options.fetchImpl);\r\n await saveRunnerSessionCredentials({\r\n runnerSessionId: handshake.runnerSession.id,\r\n runnerAccessToken: handshake.runnerAccessToken,\r\n apiBaseUrl: options.apiBaseUrl\r\n });\r\n\r\n if (options.once) {\r\n await pollRunnerJobsOnce({\r\n apiBaseUrl: options.apiBaseUrl,\r\n workspaceRoot: options.workspaceRoot,\r\n runnerSessionId: handshake.runnerSession.id,\r\n runnerAccessToken: handshake.runnerAccessToken,\r\n redactionSecrets: [options.oneTimeToken],\r\n commandRunner: options.commandRunner ?? runCommand,\r\n fetchImpl: options.fetchImpl ?? fetch,\r\n runProjectScan: options.runProjectScan\r\n });\r\n }\r\n return handshake;\r\n}\r\n\r\nexport function buildRunnerWatchOptions(input: {\r\n apiBaseUrl: string;\r\n workspaceRoot: string;\r\n handshake: RunnerHandshakeResponse;\r\n oneTimeToken?: string;\r\n commandRunner?: CommandRunner;\r\n fetchImpl?: FetchLike;\r\n runProjectScan?: RunProjectScanFn;\r\n}): RunnerWatchOptions {\r\n return {\r\n apiBaseUrl: input.apiBaseUrl,\r\n workspaceRoot: input.workspaceRoot,\r\n runnerSessionId: input.handshake.runnerSession.id,\r\n runnerAccessToken: input.handshake.runnerAccessToken,\r\n redactionSecrets: input.oneTimeToken ? [input.oneTimeToken] : undefined,\r\n commandRunner: input.commandRunner,\r\n fetchImpl: input.fetchImpl,\r\n runProjectScan: input.runProjectScan\r\n };\r\n}\r\n\r\nexport async function runRunnerWatchLoop(options: RunnerWatchOptions): Promise<void> {\r\n const pollIntervalMs = options.pollIntervalMs ?? RUNNER_POLL_INTERVAL_MS;\r\n const signal = options.signal;\r\n\r\n while (!signal?.aborted) {\r\n try {\r\n await pollRunnerJobsOnce(options);\r\n } catch (error) {\r\n if (options.onPollError) {\r\n options.onPollError(error);\r\n } else {\r\n throw error;\r\n }\r\n }\r\n\r\n try {\r\n await sleepForRunnerPoll(pollIntervalMs, signal);\r\n } catch {\r\n break;\r\n }\r\n }\r\n}\r\n\r\nfunction sleepForRunnerPoll(ms: number, signal?: AbortSignal): Promise<void> {\r\n if (signal?.aborted) {\r\n return Promise.reject(createRunnerWatchAbortError());\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const timer = setTimeout(() => {\r\n cleanup();\r\n resolve();\r\n }, ms);\r\n\r\n const onAbort = () => {\r\n cleanup();\r\n reject(createRunnerWatchAbortError());\r\n };\r\n\r\n const cleanup = () => {\r\n clearTimeout(timer);\r\n signal?.removeEventListener('abort', onAbort);\r\n };\r\n\r\n signal?.addEventListener('abort', onAbort, { once: true });\r\n });\r\n}\r\n\r\nfunction createRunnerWatchAbortError(): Error {\r\n return new Error('Runner watch stopped.');\r\n}\r\n\r\nexport async function pollRunnerJobsOnce(options: {\r\n apiBaseUrl: string;\r\n workspaceRoot: string;\r\n runnerSessionId: string;\r\n runnerAccessToken: string;\r\n redactionSecrets?: string[];\r\n commandRunner?: CommandRunner;\r\n fetchImpl?: FetchLike;\r\n runProjectScan?: RunProjectScanFn;\r\n}): Promise<RunnerJob[]> {\r\n const fetchImpl = options.fetchImpl ?? fetch;\r\n const response = await fetchJson<RunnerQueuedJobsResponse>(\r\n `${normalizeBaseUrl(options.apiBaseUrl)}/v1/runner/sessions/${encodeURIComponent(options.runnerSessionId)}/jobs`,\r\n {\r\n method: 'GET',\r\n headers: { Authorization: `Bearer ${options.runnerAccessToken}` }\r\n },\r\n fetchImpl,\r\n 'Runner job poll failed'\r\n );\r\n\r\n const completed: RunnerJob[] = [];\r\n for (const job of response.jobs) {\r\n await fetchJson<unknown>(\r\n `${normalizeBaseUrl(options.apiBaseUrl)}/v1/runner/jobs/${encodeURIComponent(job.id)}/ack`,\r\n {\r\n method: 'POST',\r\n headers: { Authorization: `Bearer ${options.runnerAccessToken}` }\r\n },\r\n fetchImpl,\r\n 'Runner job acknowledgement failed'\r\n );\r\n const result = await executeRunnerJob(job, {\r\n workspaceRoot: options.workspaceRoot,\r\n apiBaseUrl: options.apiBaseUrl,\r\n commandRunner: options.commandRunner ?? runCommand,\r\n runProjectScan: options.runProjectScan,\r\n redactionSecrets: [options.runnerAccessToken, ...(options.redactionSecrets ?? [])]\r\n });\r\n await fetchJson<unknown>(\r\n `${normalizeBaseUrl(options.apiBaseUrl)}/v1/runner/jobs/${encodeURIComponent(job.id)}/result`,\r\n {\r\n method: 'POST',\r\n headers: {\r\n Authorization: `Bearer ${options.runnerAccessToken}`,\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(result)\r\n },\r\n fetchImpl,\r\n 'Runner job result upload failed'\r\n );\r\n completed.push(job);\r\n }\r\n return completed;\r\n}\r\n\r\nasync function executeRunnerJob(\r\n job: RunnerJob,\r\n options: {\r\n workspaceRoot: string;\r\n apiBaseUrl: string;\r\n commandRunner: CommandRunner;\r\n runProjectScan?: RunProjectScanFn;\r\n redactionSecrets?: string[];\r\n }\r\n): Promise<RunnerActionResult> {\r\n if (job.kind === 'run_build' || job.kind === 'run_tests') {\r\n const scriptName = job.kind === 'run_build' ? 'build' : 'test';\r\n return executePackageScriptJob(job, scriptName, options);\r\n }\r\n\r\n if (job.kind === 'deep_station_scan' || job.kind === 'rescan') {\r\n return executeStationScanJob(job, options);\r\n }\r\n\r\n if (job.kind === 'prepare_deploy') {\r\n return summarizeSafeNoopJob(job);\r\n }\r\n\r\n if (isSafeFixJobKind(job.kind)) {\r\n return executeSafeFixJob(job, options.workspaceRoot);\r\n }\r\n\r\n return {\r\n jobId: job.id,\r\n status: 'needs_user',\r\n redacted: true,\r\n outputSummary: [`Unsupported runner job kind: ${job.kind}`],\r\n proofItems: [\r\n proofItemForJob(job, 'runner_summary', 'Runner job skipped', `Unsupported runner job kind: ${job.kind}`, [])\r\n ]\r\n };\r\n}\r\n\r\nasync function executeSafeFixJob(job: RunnerJob, workspaceRoot: string): Promise<RunnerActionResult> {\r\n const validation = validateSafeFixJobInput(job.kind, job.input);\r\n if (!validation.ok) {\r\n return safeFixNeedsUser(job, 'SAFE_FIX_VALIDATION_FAILED', validation.reason);\r\n }\r\n\r\n const input = validation.input;\r\n const target = await resolveSafeFixTarget(workspaceRoot, input.path);\r\n if (!target.ok) {\r\n return safeFixNeedsUser(job, 'SAFE_FIX_VALIDATION_FAILED', target.reason);\r\n }\r\n\r\n if (job.kind === 'create_file') {\r\n return createSafeFixFile(job, input, target.path);\r\n }\r\n return applySafeFixReplacement(job, input, target.path);\r\n}\r\n\r\nasync function createSafeFixFile(\r\n job: RunnerJob,\r\n input: RunnerSafeFixInput,\r\n targetPath: string\r\n): Promise<RunnerActionResult> {\r\n try {\r\n await access(targetPath);\r\n return safeFixNeedsUser(job, 'SAFE_FIX_TARGET_EXISTS', `Refusing to overwrite ${input.path}.`);\r\n } catch {\r\n // Missing target is required for create_file.\r\n }\r\n\r\n try {\r\n await mkdir(dirname(targetPath), { recursive: true });\r\n await writeNewFileAtomically(targetPath, input.content);\r\n } catch {\r\n return safeFixNeedsUser(job, 'SAFE_FIX_WRITE_FAILED', `Could not create ${input.path}.`);\r\n }\r\n return safeFixSucceeded(job, input, 'created file', 'delete created file');\r\n}\r\n\r\nasync function applySafeFixReplacement(\r\n job: RunnerJob,\r\n input: RunnerSafeFixInput,\r\n targetPath: string\r\n): Promise<RunnerActionResult> {\r\n let current: string;\r\n try {\r\n current = await readFile(targetPath, 'utf-8');\r\n } catch {\r\n return safeFixNeedsUser(job, 'SAFE_FIX_TARGET_MISSING', `Cannot update missing file ${input.path}.`);\r\n }\r\n if (current.includes('\\0')) {\r\n return safeFixNeedsUser(job, 'SAFE_FIX_BINARY_FILE', `Refusing to update binary-looking file ${input.path}.`);\r\n }\r\n if (current !== input.expectedExistingContent) {\r\n return safeFixNeedsUser(\r\n job,\r\n 'SAFE_FIX_EXPECTED_CONTENT_MISMATCH',\r\n `Current file content did not match expected content for ${input.path}.`\r\n );\r\n }\r\n\r\n try {\r\n await replaceFileAtomically(targetPath, input.content);\r\n } catch {\r\n return safeFixNeedsUser(job, 'SAFE_FIX_WRITE_FAILED', `Could not update ${input.path}.`);\r\n }\r\n return safeFixSucceeded(job, input, 'updated file', 'restore previous content captured locally');\r\n}\r\n\r\nfunction safeFixSucceeded(\r\n job: RunnerJob,\r\n input: RunnerSafeFixInput,\r\n operation: 'created file' | 'updated file',\r\n rollback: string\r\n): RunnerActionResult {\r\n const summary = `${operation} ${input.path}`;\r\n const outputSummary = [\r\n summary,\r\n `rollback: ${rollback}`,\r\n ...(input.verificationCommand ? [`verification: ${input.verificationCommand}`] : [])\r\n ];\r\n return {\r\n jobId: job.id,\r\n status: 'succeeded',\r\n redacted: true,\r\n outputSummary,\r\n proofItems: [\r\n proofItemForJob(job, 'repo_evidence', 'Safe fix proof', summary, [\r\n `path: ${input.path}`,\r\n `operation: ${operation}`,\r\n `rollback: ${rollback}`,\r\n ...(input.verificationCommand ? [`verification: ${input.verificationCommand}`] : [])\r\n ])\r\n ]\r\n };\r\n}\r\n\r\nfunction safeFixNeedsUser(job: RunnerJob, code: string, message: string): RunnerActionResult {\r\n const summary = redactRunnerProofText(message);\r\n return {\r\n jobId: job.id,\r\n status: 'needs_user',\r\n redacted: true,\r\n outputSummary: [summary],\r\n error: {\r\n code,\r\n message: summary\r\n },\r\n proofItems: [proofItemForJob(job, 'runner_summary', 'Safe fix skipped', summary, [])]\r\n };\r\n}\r\n\r\nasync function resolveSafeFixTarget(\r\n workspaceRoot: string,\r\n relativePath: string\r\n): Promise<{ ok: true; path: string } | { ok: false; reason: string }> {\r\n const root = await realpath(workspaceRoot).catch(() => resolve(workspaceRoot));\r\n const target = resolve(root, relativePath);\r\n if (!isInsideRoot(root, target)) {\r\n return { ok: false, reason: 'Safe fix target escaped the workspace root.' };\r\n }\r\n\r\n const parent = dirname(target);\r\n const parentReal = await realpathNearestExisting(parent, root);\r\n if (!isInsideRoot(root, parentReal)) {\r\n return { ok: false, reason: 'Safe fix parent path escaped the workspace root.' };\r\n }\r\n\r\n const targetReal = await realpath(target).catch(() => null);\r\n if (targetReal && !isInsideRoot(root, targetReal)) {\r\n return { ok: false, reason: 'Safe fix target path escaped the workspace root.' };\r\n }\r\n\r\n return { ok: true, path: target };\r\n}\r\n\r\nasync function realpathNearestExisting(path: string, root: string): Promise<string> {\r\n let candidate = path;\r\n while (isInsideRoot(root, candidate)) {\r\n try {\r\n await lstat(candidate);\r\n return realpath(candidate);\r\n } catch {\r\n const next = dirname(candidate);\r\n if (next === candidate) {\r\n break;\r\n }\r\n candidate = next;\r\n }\r\n }\r\n return root;\r\n}\r\n\r\nfunction isInsideRoot(root: string, candidate: string): boolean {\r\n const rel = relative(root, candidate);\r\n return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));\r\n}\r\n\r\nasync function writeNewFileAtomically(targetPath: string, content: string): Promise<void> {\r\n const tempPath = tempPathFor(targetPath);\r\n try {\r\n await writeFile(tempPath, content, { encoding: 'utf-8', flag: 'wx' });\r\n await link(tempPath, targetPath);\r\n } finally {\r\n await rm(tempPath, { force: true }).catch(() => undefined);\r\n }\r\n}\r\n\r\nasync function replaceFileAtomically(targetPath: string, content: string): Promise<void> {\r\n const tempPath = tempPathFor(targetPath);\r\n try {\r\n await writeFile(tempPath, content, { encoding: 'utf-8', flag: 'wx' });\r\n await rename(tempPath, targetPath);\r\n } finally {\r\n await rm(tempPath, { force: true }).catch(() => undefined);\r\n }\r\n}\r\n\r\nfunction tempPathFor(targetPath: string): string {\r\n return join(dirname(targetPath), `.${basename(targetPath)}.${randomUUID()}.tmp`);\r\n}\r\n\r\nasync function executePackageScriptJob(\r\n job: RunnerJob,\r\n scriptName: 'build' | 'test',\r\n options: { workspaceRoot: string; commandRunner: CommandRunner; redactionSecrets?: string[] }\r\n): Promise<RunnerActionResult> {\r\n const packageJson = await readPackageJson(options.workspaceRoot);\r\n if (!packageJson.scripts?.[scriptName]) {\r\n return {\r\n jobId: job.id,\r\n status: 'needs_user',\r\n redacted: true,\r\n outputSummary: [`package.json has no ${scriptName} script`],\r\n proofItems: [\r\n proofItemForJob(job, 'runner_summary', `${scriptName} script missing`, `package.json has no ${scriptName} script`, [])\r\n ]\r\n };\r\n }\r\n\r\n const packageManager = await detectPackageManager(options.workspaceRoot);\r\n const command = packageManager === 'unknown' ? 'npm' : packageManager;\r\n const args = packageScriptArgs(command, scriptName);\r\n const result = await options.commandRunner(command, args, options.workspaceRoot);\r\n const outputSummary = summarizeCommandOutput(`${command} ${args.join(' ')}`, result, options.redactionSecrets ?? []);\r\n\r\n return {\r\n jobId: job.id,\r\n status: result.ok ? 'succeeded' : 'failed',\r\n redacted: true,\r\n outputSummary,\r\n error: result.ok\r\n ? undefined\r\n : {\r\n code: 'PACKAGE_SCRIPT_FAILED',\r\n message: `${scriptName} script failed`\r\n },\r\n proofItems: [\r\n proofItemForJob(\r\n job,\r\n 'command_output',\r\n `${scriptName} script proof`,\r\n `${command} ${args.join(' ')} ${result.ok ? 'succeeded' : 'failed'}`,\r\n outputSummary,\r\n options.redactionSecrets ?? []\r\n )\r\n ]\r\n };\r\n}\r\n\r\nasync function executeStationScanJob(\r\n job: RunnerJob,\r\n options: {\r\n workspaceRoot: string;\r\n apiBaseUrl: string;\r\n runProjectScan?: RunProjectScanFn;\r\n redactionSecrets?: string[];\r\n }\r\n): Promise<RunnerActionResult> {\r\n const credentials = await loadCredentials();\r\n if (!credentials?.accessToken) {\r\n return stationScanNeedsUser(\r\n job,\r\n 'SCAN_AUTH_REQUIRED',\r\n 'Sign in with `viberaven login` before the runner can execute station scans.',\r\n options.redactionSecrets ?? []\r\n );\r\n }\r\n\r\n const scan = options.runProjectScan ?? runProjectScan;\r\n const scanResult = await scan({\r\n workspacePath: options.workspaceRoot,\r\n accessToken: credentials.accessToken,\r\n apiBaseUrl: options.apiBaseUrl || credentials.apiBaseUrl\r\n });\r\n\r\n if (!scanResult.ok) {\r\n return stationScanFailure(job, scanResult, options.redactionSecrets ?? []);\r\n }\r\n\r\n const artifact = sanitizeArtifactForDisk(scanResult.artifact);\r\n const proof = buildStationScanProof(job.kind, artifact);\r\n const redactionSecrets = options.redactionSecrets ?? [];\r\n const proofItem = proofItemForJob(\r\n job,\r\n 'repo_evidence',\r\n stationScanProofLabel(job.kind),\r\n proof.summary,\r\n proof.evidence,\r\n redactionSecrets\r\n );\r\n\r\n return {\r\n jobId: job.id,\r\n status: 'succeeded',\r\n redacted: true,\r\n outputSummary: [proofItem.summary, ...proofItem.evidence.slice(0, 6)],\r\n proofItems: [proofItem]\r\n };\r\n}\r\n\r\nfunction stationScanProofLabel(kind: RunnerJob['kind']): string {\r\n return kind === 'rescan' ? 'Rescan proof' : 'Deep station scan proof';\r\n}\r\n\r\nfunction buildStationScanProof(\r\n kind: RunnerJob['kind'],\r\n artifact: CliScanArtifact\r\n): { summary: string; evidence: string[] } {\r\n const actionLabel = kind === 'rescan' ? 'Rescan' : 'Deep station scan';\r\n const summary = `${actionLabel} completed: production core ${artifact.productionCorePercent}% \u00B7 score ${artifact.score} (${artifact.scoreLabel})`;\r\n const evidence = [\r\n `scannedAt: ${artifact.scannedAt}`,\r\n `workspace: ${artifact.workspacePath}`,\r\n `productionCorePercent: ${artifact.productionCorePercent}`,\r\n `score: ${artifact.score} (${artifact.scoreLabel})`,\r\n `gaps: ${artifact.gaps.length}`,\r\n `summary: ${artifact.summary || 'No summary returned.'}`\r\n ];\r\n\r\n for (const gap of artifact.gaps.slice(0, 5)) {\r\n evidence.push(`gap: ${gap.title} (${gap.severity})`);\r\n }\r\n\r\n for (const area of (artifact.missionGraph.areas ?? []).slice(0, 6)) {\r\n for (const mission of area.providerMissions.slice(0, 1)) {\r\n evidence.push(`mission: ${area.label} \u00B7 ${mission.providerLabel} \u00B7 ${mission.readinessPercent}%`);\r\n }\r\n }\r\n\r\n return { summary, evidence };\r\n}\r\n\r\nfunction stationScanFailure(job: RunnerJob, result: Exclude<RunScanResult, { ok: true }>, redactionSecrets: string[]): RunnerActionResult {\r\n if (result.kind === 'scan_limit') {\r\n return stationScanNeedsUser(\r\n job,\r\n 'SCAN_LIMIT_REACHED',\r\n `Scan limit reached. Upgrade at ${result.upgradeUrl}.`,\r\n redactionSecrets\r\n );\r\n }\r\n if (result.kind === 'auth_required' || result.kind === 'session_invalid') {\r\n return stationScanNeedsUser(job, 'SCAN_AUTH_REQUIRED', result.message, redactionSecrets);\r\n }\r\n return {\r\n jobId: job.id,\r\n status: 'failed',\r\n redacted: true,\r\n outputSummary: [redactRunnerProofText(result.message, redactionSecrets)],\r\n error: {\r\n code: 'STATION_SCAN_FAILED',\r\n message: redactRunnerProofText(result.message, redactionSecrets)\r\n },\r\n proofItems: [\r\n proofItemForJob(\r\n job,\r\n 'runner_summary',\r\n 'Station scan failed',\r\n result.message,\r\n [],\r\n redactionSecrets\r\n )\r\n ]\r\n };\r\n}\r\n\r\nfunction stationScanNeedsUser(\r\n job: RunnerJob,\r\n code: string,\r\n message: string,\r\n redactionSecrets: string[]\r\n): RunnerActionResult {\r\n const summary = redactRunnerProofText(message, redactionSecrets);\r\n return {\r\n jobId: job.id,\r\n status: 'needs_user',\r\n redacted: true,\r\n outputSummary: [summary],\r\n error: {\r\n code,\r\n message: summary\r\n },\r\n proofItems: [proofItemForJob(job, 'runner_summary', 'Station scan skipped', summary, [], redactionSecrets)]\r\n };\r\n}\r\n\r\nfunction summarizeSafeNoopJob(job: RunnerJob): RunnerActionResult {\r\n const summary = 'Prepared deploy proof summary; no files were changed.';\r\n return {\r\n jobId: job.id,\r\n status: 'succeeded',\r\n redacted: true,\r\n outputSummary: [summary],\r\n proofItems: [proofItemForJob(job, 'runner_summary', 'Runner summary', summary, [])]\r\n };\r\n}\r\n\r\nfunction proofItemForJob(\r\n job: RunnerJob,\r\n kind: ProofItem['kind'],\r\n label: string,\r\n summary: string,\r\n evidence: string[],\r\n redactionSecrets: string[] = []\r\n): Omit<ProofItem, 'id' | 'createdAt'> {\r\n return {\r\n deploySessionId: job.deploySessionId,\r\n runnerSessionId: job.runnerSessionId,\r\n jobId: job.id,\r\n kind,\r\n label,\r\n summary: redactRunnerProofText(summary, redactionSecrets),\r\n evidence: evidence.map((value) => redactRunnerProofText(value, redactionSecrets)),\r\n redacted: true\r\n };\r\n}\r\n\r\nasync function readPackageJson(workspaceRoot: string): Promise<{ scripts?: Record<string, string> }> {\r\n try {\r\n const raw = await readFile(join(workspaceRoot, 'package.json'), 'utf-8');\r\n const parsed = JSON.parse(raw) as unknown;\r\n if (isRecord(parsed) && isRecord(parsed.scripts)) {\r\n return { scripts: Object.fromEntries(Object.entries(parsed.scripts).filter(([, value]) => typeof value === 'string')) as Record<string, string> };\r\n }\r\n } catch {\r\n // Missing or invalid package.json is reported as a missing script.\r\n }\r\n return {};\r\n}\r\n\r\nfunction packageScriptArgs(command: string, scriptName: 'build' | 'test'): string[] {\r\n if (command === 'yarn') {\r\n return [scriptName];\r\n }\r\n return ['run', scriptName];\r\n}\r\n\r\nfunction summarizeCommandOutput(label: string, result: CommandResult, redactionSecrets: string[] = []): string[] {\r\n const lines = `${result.stdout}\\n${result.stderr ?? ''}`\r\n .split(/\\r?\\n/)\r\n .map((line) => redactRunnerProofText(line.trim(), redactionSecrets))\r\n .filter(Boolean)\r\n .slice(0, 8);\r\n return [`${label} ${result.ok ? 'succeeded' : 'failed'}`, ...lines];\r\n}\r\n\r\nfunction redactRunnerProofText(value: string, additionalSecrets: string[] = []): string {\r\n let out = redactAdditionalSecrets(value, additionalSecrets);\r\n out = out.replace(\r\n /\\b([A-Za-z0-9_]*(?:DATABASE_URL|ACCESS_TOKEN|AUTHORIZATION|API_KEY|SECRET|SECRET_KEY|SERVICE_ROLE_KEY|TOKEN|PASSWORD|PRIVATE_KEY|CREDENTIALS?)[A-Za-z0-9_]*)\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\"'\\s;,]+)/gi,\r\n '$1=[REDACTED]'\r\n );\r\n out = out.replace(/\\b((?:postgres|postgresql|mysql|mongodb|redis):\\/\\/)([^:\\s/@]+):([^@\\s]+)@/gi, '$1[REDACTED]@');\r\n out = out.replace(\r\n /\\b(ghp_[A-Za-z0-9]{36,}|github_pat_[A-Za-z0-9_]{50,}|sk-proj-[A-Za-z0-9_-]{16,}|sk-[A-Za-z0-9_-]{20,}|sk_(?:live|test)_[A-Za-z0-9]{12,}|rk_(?:live|test)_[A-Za-z0-9]{12,}|whsec_[A-Za-z0-9]{12,}|sb_secret_[A-Za-z0-9_-]{16,}|sbp_[A-Za-z0-9_-]{16,}|vercel_[A-Za-z0-9_-]{16,}|xox[baprs]-[A-Za-z0-9-]{20,}|xapp-[A-Za-z0-9-]{20,})\\b/g,\r\n '[REDACTED_SECRET]'\r\n );\r\n out = out.replace(/\\beyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\b/g, '[REDACTED_SECRET]');\r\n out = out.replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----[\\s\\S]*?-----END [A-Z ]*PRIVATE KEY-----/g, '[REDACTED_PRIVATE_KEY]');\r\n out = out.replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----/g, '[REDACTED_PRIVATE_KEY]');\r\n out = out.replace(/-----END [A-Z ]*PRIVATE KEY-----/g, '[REDACTED_PRIVATE_KEY]');\r\n out = out.replace(/\\bAuthorization\\s*:\\s*([A-Za-z][A-Za-z0-9._-]*)\\s+[^\\s;,]+/gi, 'Authorization: $1 [REDACTED]');\r\n return out.length > 500 ? `${out.slice(0, 497)}...` : out;\r\n}\r\n\r\nfunction redactAdditionalSecrets(value: string, additionalSecrets: string[]): string {\r\n let out = value;\r\n const normalized = [...new Set(additionalSecrets.map((secret) => secret.trim()).filter((secret) => secret.length >= 8))]\r\n .sort((a, b) => b.length - a.length);\r\n for (const secret of normalized) {\r\n out = out.replace(new RegExp(escapeRegExp(secret), 'g'), '[REDACTED_SECRET]');\r\n }\r\n return out;\r\n}\r\n\r\nfunction escapeRegExp(value: string): string {\r\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n\r\nasync function fetchJson<T>(\r\n url: string,\r\n init: RequestInit,\r\n fetchImpl: FetchLike,\r\n errorPrefix: string\r\n): Promise<T> {\r\n let response: Response;\r\n try {\r\n response = await fetchImpl(url, init);\r\n } catch (error) {\r\n const detail = error instanceof Error ? error.message : String(error);\r\n throw new Error(`${errorPrefix}: ${detail}`);\r\n }\r\n\r\n const bodyText = await response.text();\r\n if (!response.ok) {\r\n const detail = formatErrorBody(bodyText, response.statusText);\r\n throw new Error(`${errorPrefix} (${response.status}): ${detail}`);\r\n }\r\n\r\n if (!bodyText.trim()) {\r\n return undefined as T;\r\n }\r\n\r\n try {\r\n return JSON.parse(bodyText) as T;\r\n } catch (error) {\r\n throw new Error(`${errorPrefix}: response was not valid JSON.`, { cause: error });\r\n }\r\n}\r\n\r\nexport async function collectLocalRepoMetadata(\r\n workspaceRoot: string,\r\n commandRunner: CommandRunner = runCommand\r\n): Promise<RedactedLocalRepo> {\r\n const [remoteResult, branchResult, headResult, statusResult, packageManager] = await Promise.all([\r\n commandRunner('git', ['remote', '-v'], workspaceRoot),\r\n commandRunner('git', ['branch', '--show-current'], workspaceRoot),\r\n commandRunner('git', ['rev-parse', 'HEAD'], workspaceRoot),\r\n commandRunner('git', ['status', '--porcelain'], workspaceRoot),\r\n detectPackageManager(workspaceRoot)\r\n ]);\r\n\r\n const branch = branchResult.ok ? emptyToNull(branchResult.stdout) : null;\r\n const headSha = headResult.ok ? normalizeSha(headResult.stdout) : null;\r\n const dirty = statusResult.ok ? statusResult.stdout.trim().length > 0 : undefined;\r\n\r\n return {\r\n rootName: basename(workspaceRoot) || 'workspace',\r\n remotes: remoteResult.ok ? parseGitRemotes(remoteResult.stdout) : [],\r\n branch,\r\n headSha,\r\n dirty,\r\n packageManager\r\n };\r\n}\r\n\r\nexport async function detectPackageManager(workspaceRoot: string): Promise<PackageManager> {\r\n const checks: Array<[PackageManager, string]> = [\r\n ['pnpm', 'pnpm-lock.yaml'],\r\n ['yarn', 'yarn.lock'],\r\n ['bun', 'bun.lockb'],\r\n ['bun', 'bun.lock'],\r\n ['npm', 'package-lock.json']\r\n ];\r\n\r\n for (const [manager, file] of checks) {\r\n try {\r\n await access(join(workspaceRoot, file));\r\n return manager;\r\n } catch {\r\n // try next lockfile\r\n }\r\n }\r\n\r\n return 'unknown';\r\n}\r\n\r\nexport function buildRunnerHandshakeRequest(input: {\r\n launchSessionId: string;\r\n oneTimeToken: string;\r\n runnerVersion: string;\r\n localRepo: RedactedLocalRepo;\r\n}): RunnerHandshakeRequest {\r\n return {\r\n launchSessionId: input.launchSessionId,\r\n oneTimeToken: input.oneTimeToken,\r\n runnerKind: 'cli',\r\n runnerVersion: input.runnerVersion,\r\n capabilities: RUNNER_CAPABILITIES,\r\n localRepo: input.localRepo\r\n };\r\n}\r\n\r\nexport async function postRunnerHandshake(\r\n apiBaseUrl: string,\r\n payload: RunnerHandshakeRequest,\r\n fetchImpl: FetchLike = fetch\r\n): Promise<RunnerHandshakeResponse> {\r\n const url = `${normalizeBaseUrl(apiBaseUrl)}/v1/runner/handshake`;\r\n let response: Response;\r\n\r\n try {\r\n response = await fetchImpl(url, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify(payload)\r\n });\r\n } catch (error) {\r\n const detail = error instanceof Error ? error.message : String(error);\r\n throw new Error(`Could not reach VibeRaven API at ${url}: ${detail}`);\r\n }\r\n\r\n const bodyText = await response.text();\r\n if (!response.ok) {\r\n const detail = formatErrorBody(bodyText, response.statusText);\r\n if (response.status === 401) {\r\n throw new Error(\r\n 'Runner handshake failed (401): This connect token is wrong, expired, or already used. In the VibeRaven dashboard click \"Show connect command\", copy the full command immediately, and run it once from your project folder.',\r\n );\r\n }\r\n throw new Error(`Runner handshake failed (${response.status}): ${detail}`);\r\n }\r\n\r\n let parsed: unknown;\r\n try {\r\n parsed = JSON.parse(bodyText) as unknown;\r\n } catch (error) {\r\n throw new Error('Runner handshake response was not valid JSON.', { cause: error });\r\n }\r\n\r\n if (!isRunnerHandshakeResponse(parsed)) {\r\n throw new Error('Runner handshake response was invalid.');\r\n }\r\n\r\n return parsed;\r\n}\r\n\r\nexport function formatRepoMatch(repoMatch: RunnerHandshakeResponse['repoMatch']): string {\r\n switch (repoMatch) {\r\n case 'matched':\r\n return 'matched';\r\n case 'remote_mismatch':\r\n return 'remote mismatch';\r\n case 'branch_mismatch':\r\n return 'branch mismatch';\r\n case 'unknown':\r\n return 'unknown';\r\n default:\r\n return repoMatch;\r\n }\r\n}\r\n\r\nasync function runCommand(command: string, args: string[], cwd: string): Promise<CommandResult> {\r\n return new Promise((resolve) => {\r\n execFile(command, args, { cwd, windowsHide: true }, (error, stdout, stderr) => {\r\n resolve({\r\n ok: !error,\r\n stdout: String(stdout ?? ''),\r\n stderr: String(stderr ?? '')\r\n });\r\n });\r\n });\r\n}\r\n\r\nfunction parseGitRemotes(stdout: string): RedactedLocalRepo['remotes'] {\r\n const remotes = new Map<string, RedactedLocalRepo['remotes'][number]>();\r\n\r\n for (const line of stdout.split(/\\r?\\n/)) {\r\n const match = line.match(/^(\\S+)\\s+(\\S+)(?:\\s+\\((fetch|push)\\))?$/);\r\n if (!match) {\r\n continue;\r\n }\r\n\r\n const name = match[1].trim();\r\n const normalizedUrl = normalizeRemoteUrl(match[2]);\r\n if (!name || !normalizedUrl) {\r\n continue;\r\n }\r\n\r\n const key = `${name}\\0${normalizedUrl}`;\r\n remotes.set(key, {\r\n name,\r\n normalizedUrl,\r\n provider: detectRemoteProvider(normalizedUrl)\r\n });\r\n }\r\n\r\n return [...remotes.values()];\r\n}\r\n\r\nfunction normalizeRemoteUrl(rawUrl: string): string | null {\r\n const trimmed = rawUrl.trim();\r\n if (isLocalRemotePath(trimmed)) {\r\n return null;\r\n }\r\n\r\n const scpLike = trimmed.match(/^(?:[^@]+@)?([^:]+):(.+)$/);\r\n if (scpLike && !trimmed.includes('://')) {\r\n return stripGitSuffix(`https://${scpLike[1]}/${scpLike[2]}`);\r\n }\r\n\r\n try {\r\n const parsed = new URL(trimmed);\r\n parsed.username = '';\r\n parsed.password = '';\r\n parsed.hash = '';\r\n parsed.search = '';\r\n if (parsed.protocol === 'file:') {\r\n return null;\r\n }\r\n if (parsed.protocol === 'ssh:') {\r\n parsed.protocol = 'https:';\r\n }\r\n return stripGitSuffix(parsed.toString().replace(/\\/+$/, ''));\r\n } catch {\r\n return stripGitSuffix(trimmed.replace(/\\/\\/[^/@]+@/, '//'));\r\n }\r\n}\r\n\r\nfunction isLocalRemotePath(value: string): boolean {\r\n return (\r\n /^[A-Za-z]:[\\\\/]/.test(value) ||\r\n /^\\/\\/[^/]/.test(value) ||\r\n /^\\/(?!\\/)/.test(value) ||\r\n /^~[\\\\/]/.test(value) ||\r\n /^\\.{1,2}[\\\\/]/.test(value) ||\r\n /^\\\\\\\\/.test(value) ||\r\n /^file:\\/\\//i.test(value)\r\n );\r\n}\r\n\r\nfunction stripGitSuffix(url: string): string {\r\n return url.replace(/\\.git$/i, '').replace(/\\/+$/, '');\r\n}\r\n\r\nfunction detectRemoteProvider(normalizedUrl: string): RedactedLocalRepo['remotes'][number]['provider'] {\r\n const hostname = getHostname(normalizedUrl);\r\n if (hostname.includes('github.com')) {\r\n return 'github';\r\n }\r\n if (hostname.includes('gitlab.com')) {\r\n return 'gitlab';\r\n }\r\n if (hostname.includes('bitbucket.org')) {\r\n return 'bitbucket';\r\n }\r\n return 'unknown';\r\n}\r\n\r\nfunction getHostname(value: string): string {\r\n try {\r\n return new URL(value).hostname.toLowerCase();\r\n } catch {\r\n return value.toLowerCase();\r\n }\r\n}\r\n\r\nfunction emptyToNull(value: string): string | null {\r\n const trimmed = value.trim();\r\n return trimmed.length > 0 ? trimmed : null;\r\n}\r\n\r\nfunction normalizeSha(value: string): string | null {\r\n const trimmed = value.trim();\r\n return /^[0-9a-f]{7,64}$/i.test(trimmed) ? trimmed : null;\r\n}\r\n\r\nfunction normalizeBaseUrl(baseUrl: string): string {\r\n return baseUrl.trim().replace(/\\/+$/, '');\r\n}\r\n\r\nfunction formatErrorBody(bodyText: string, statusText: string): string {\r\n const trimmed = bodyText.trim();\r\n if (!trimmed) {\r\n return statusText || 'Unknown error';\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(trimmed) as Record<string, unknown>;\r\n if (typeof parsed.message === 'string') {\r\n return parsed.message;\r\n }\r\n if (typeof parsed.error === 'string') {\r\n return parsed.error;\r\n }\r\n } catch {\r\n // plain text body\r\n }\r\n\r\n return trimmed;\r\n}\r\n\r\nfunction isRunnerHandshakeResponse(value: unknown): value is RunnerHandshakeResponse {\r\n if (!isRecord(value) || !isRecord(value.runnerSession)) {\r\n return false;\r\n }\r\n\r\n return (\r\n typeof value.runnerAccessToken === 'string' &&\r\n isRepoMatch(value.repoMatch) &&\r\n Array.isArray(value.allowedJobKinds) &&\r\n typeof value.pollAfterMs === 'number' &&\r\n typeof value.runnerSession.id === 'string' &&\r\n typeof value.runnerSession.deploySessionId === 'string' &&\r\n isRepoMatch(value.runnerSession.repoMatch)\r\n );\r\n}\r\n\r\nfunction isRepoMatch(value: unknown): value is RunnerHandshakeResponse['repoMatch'] {\r\n return value === 'matched' || value === 'remote_mismatch' || value === 'branch_mismatch' || value === 'unknown';\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null;\r\n}\r\n", "'use strict';\n\nconst ESC = '\\x1B';\nconst CSI = `${ESC}[`;\nconst beep = '\\u0007';\n\nconst cursor = {\n to(x, y) {\n if (!y) return `${CSI}${x + 1}G`;\n return `${CSI}${y + 1};${x + 1}H`;\n },\n move(x, y) {\n let ret = '';\n\n if (x < 0) ret += `${CSI}${-x}D`;\n else if (x > 0) ret += `${CSI}${x}C`;\n\n if (y < 0) ret += `${CSI}${-y}A`;\n else if (y > 0) ret += `${CSI}${y}B`;\n\n return ret;\n },\n up: (count = 1) => `${CSI}${count}A`,\n down: (count = 1) => `${CSI}${count}B`,\n forward: (count = 1) => `${CSI}${count}C`,\n backward: (count = 1) => `${CSI}${count}D`,\n nextLine: (count = 1) => `${CSI}E`.repeat(count),\n prevLine: (count = 1) => `${CSI}F`.repeat(count),\n left: `${CSI}G`,\n hide: `${CSI}?25l`,\n show: `${CSI}?25h`,\n save: `${ESC}7`,\n restore: `${ESC}8`\n}\n\nconst scroll = {\n up: (count = 1) => `${CSI}S`.repeat(count),\n down: (count = 1) => `${CSI}T`.repeat(count)\n}\n\nconst erase = {\n screen: `${CSI}2J`,\n up: (count = 1) => `${CSI}1J`.repeat(count),\n down: (count = 1) => `${CSI}J`.repeat(count),\n line: `${CSI}2K`,\n lineEnd: `${CSI}K`,\n lineStart: `${CSI}1K`,\n lines(count) {\n let clear = '';\n for (let i = 0; i < count; i++)\n clear += this.line + (i < count - 1 ? cursor.up() : '');\n if (count)\n clear += cursor.left;\n return clear;\n }\n}\n\nmodule.exports = { cursor, scroll, erase, beep };\n", "export default function ansiRegex({onlyFirst = false} = {}) {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)';\n\tconst pattern = [\n\t\t`[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?${ST})`,\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]))',\n\t].join('|');\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n", "import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n", "var eaw = {};\n\nif ('undefined' == typeof module) {\n window.eastasianwidth = eaw;\n} else {\n module.exports = eaw;\n}\n\neaw.eastAsianWidth = function(character) {\n var x = character.charCodeAt(0);\n var y = (character.length == 2) ? character.charCodeAt(1) : 0;\n var codePoint = x;\n if ((0xD800 <= x && x <= 0xDBFF) && (0xDC00 <= y && y <= 0xDFFF)) {\n x &= 0x3FF;\n y &= 0x3FF;\n codePoint = (x << 10) | y;\n codePoint += 0x10000;\n }\n\n if ((0x3000 == codePoint) ||\n (0xFF01 <= codePoint && codePoint <= 0xFF60) ||\n (0xFFE0 <= codePoint && codePoint <= 0xFFE6)) {\n return 'F';\n }\n if ((0x20A9 == codePoint) ||\n (0xFF61 <= codePoint && codePoint <= 0xFFBE) ||\n (0xFFC2 <= codePoint && codePoint <= 0xFFC7) ||\n (0xFFCA <= codePoint && codePoint <= 0xFFCF) ||\n (0xFFD2 <= codePoint && codePoint <= 0xFFD7) ||\n (0xFFDA <= codePoint && codePoint <= 0xFFDC) ||\n (0xFFE8 <= codePoint && codePoint <= 0xFFEE)) {\n return 'H';\n }\n if ((0x1100 <= codePoint && codePoint <= 0x115F) ||\n (0x11A3 <= codePoint && codePoint <= 0x11A7) ||\n (0x11FA <= codePoint && codePoint <= 0x11FF) ||\n (0x2329 <= codePoint && codePoint <= 0x232A) ||\n (0x2E80 <= codePoint && codePoint <= 0x2E99) ||\n (0x2E9B <= codePoint && codePoint <= 0x2EF3) ||\n (0x2F00 <= codePoint && codePoint <= 0x2FD5) ||\n (0x2FF0 <= codePoint && codePoint <= 0x2FFB) ||\n (0x3001 <= codePoint && codePoint <= 0x303E) ||\n (0x3041 <= codePoint && codePoint <= 0x3096) ||\n (0x3099 <= codePoint && codePoint <= 0x30FF) ||\n (0x3105 <= codePoint && codePoint <= 0x312D) ||\n (0x3131 <= codePoint && codePoint <= 0x318E) ||\n (0x3190 <= codePoint && codePoint <= 0x31BA) ||\n (0x31C0 <= codePoint && codePoint <= 0x31E3) ||\n (0x31F0 <= codePoint && codePoint <= 0x321E) ||\n (0x3220 <= codePoint && codePoint <= 0x3247) ||\n (0x3250 <= codePoint && codePoint <= 0x32FE) ||\n (0x3300 <= codePoint && codePoint <= 0x4DBF) ||\n (0x4E00 <= codePoint && codePoint <= 0xA48C) ||\n (0xA490 <= codePoint && codePoint <= 0xA4C6) ||\n (0xA960 <= codePoint && codePoint <= 0xA97C) ||\n (0xAC00 <= codePoint && codePoint <= 0xD7A3) ||\n (0xD7B0 <= codePoint && codePoint <= 0xD7C6) ||\n (0xD7CB <= codePoint && codePoint <= 0xD7FB) ||\n (0xF900 <= codePoint && codePoint <= 0xFAFF) ||\n (0xFE10 <= codePoint && codePoint <= 0xFE19) ||\n (0xFE30 <= codePoint && codePoint <= 0xFE52) ||\n (0xFE54 <= codePoint && codePoint <= 0xFE66) ||\n (0xFE68 <= codePoint && codePoint <= 0xFE6B) ||\n (0x1B000 <= codePoint && codePoint <= 0x1B001) ||\n (0x1F200 <= codePoint && codePoint <= 0x1F202) ||\n (0x1F210 <= codePoint && codePoint <= 0x1F23A) ||\n (0x1F240 <= codePoint && codePoint <= 0x1F248) ||\n (0x1F250 <= codePoint && codePoint <= 0x1F251) ||\n (0x20000 <= codePoint && codePoint <= 0x2F73F) ||\n (0x2B740 <= codePoint && codePoint <= 0x2FFFD) ||\n (0x30000 <= codePoint && codePoint <= 0x3FFFD)) {\n return 'W';\n }\n if ((0x0020 <= codePoint && codePoint <= 0x007E) ||\n (0x00A2 <= codePoint && codePoint <= 0x00A3) ||\n (0x00A5 <= codePoint && codePoint <= 0x00A6) ||\n (0x00AC == codePoint) ||\n (0x00AF == codePoint) ||\n (0x27E6 <= codePoint && codePoint <= 0x27ED) ||\n (0x2985 <= codePoint && codePoint <= 0x2986)) {\n return 'Na';\n }\n if ((0x00A1 == codePoint) ||\n (0x00A4 == codePoint) ||\n (0x00A7 <= codePoint && codePoint <= 0x00A8) ||\n (0x00AA == codePoint) ||\n (0x00AD <= codePoint && codePoint <= 0x00AE) ||\n (0x00B0 <= codePoint && codePoint <= 0x00B4) ||\n (0x00B6 <= codePoint && codePoint <= 0x00BA) ||\n (0x00BC <= codePoint && codePoint <= 0x00BF) ||\n (0x00C6 == codePoint) ||\n (0x00D0 == codePoint) ||\n (0x00D7 <= codePoint && codePoint <= 0x00D8) ||\n (0x00DE <= codePoint && codePoint <= 0x00E1) ||\n (0x00E6 == codePoint) ||\n (0x00E8 <= codePoint && codePoint <= 0x00EA) ||\n (0x00EC <= codePoint && codePoint <= 0x00ED) ||\n (0x00F0 == codePoint) ||\n (0x00F2 <= codePoint && codePoint <= 0x00F3) ||\n (0x00F7 <= codePoint && codePoint <= 0x00FA) ||\n (0x00FC == codePoint) ||\n (0x00FE == codePoint) ||\n (0x0101 == codePoint) ||\n (0x0111 == codePoint) ||\n (0x0113 == codePoint) ||\n (0x011B == codePoint) ||\n (0x0126 <= codePoint && codePoint <= 0x0127) ||\n (0x012B == codePoint) ||\n (0x0131 <= codePoint && codePoint <= 0x0133) ||\n (0x0138 == codePoint) ||\n (0x013F <= codePoint && codePoint <= 0x0142) ||\n (0x0144 == codePoint) ||\n (0x0148 <= codePoint && codePoint <= 0x014B) ||\n (0x014D == codePoint) ||\n (0x0152 <= codePoint && codePoint <= 0x0153) ||\n (0x0166 <= codePoint && codePoint <= 0x0167) ||\n (0x016B == codePoint) ||\n (0x01CE == codePoint) ||\n (0x01D0 == codePoint) ||\n (0x01D2 == codePoint) ||\n (0x01D4 == codePoint) ||\n (0x01D6 == codePoint) ||\n (0x01D8 == codePoint) ||\n (0x01DA == codePoint) ||\n (0x01DC == codePoint) ||\n (0x0251 == codePoint) ||\n (0x0261 == codePoint) ||\n (0x02C4 == codePoint) ||\n (0x02C7 == codePoint) ||\n (0x02C9 <= codePoint && codePoint <= 0x02CB) ||\n (0x02CD == codePoint) ||\n (0x02D0 == codePoint) ||\n (0x02D8 <= codePoint && codePoint <= 0x02DB) ||\n (0x02DD == codePoint) ||\n (0x02DF == codePoint) ||\n (0x0300 <= codePoint && codePoint <= 0x036F) ||\n (0x0391 <= codePoint && codePoint <= 0x03A1) ||\n (0x03A3 <= codePoint && codePoint <= 0x03A9) ||\n (0x03B1 <= codePoint && codePoint <= 0x03C1) ||\n (0x03C3 <= codePoint && codePoint <= 0x03C9) ||\n (0x0401 == codePoint) ||\n (0x0410 <= codePoint && codePoint <= 0x044F) ||\n (0x0451 == codePoint) ||\n (0x2010 == codePoint) ||\n (0x2013 <= codePoint && codePoint <= 0x2016) ||\n (0x2018 <= codePoint && codePoint <= 0x2019) ||\n (0x201C <= codePoint && codePoint <= 0x201D) ||\n (0x2020 <= codePoint && codePoint <= 0x2022) ||\n (0x2024 <= codePoint && codePoint <= 0x2027) ||\n (0x2030 == codePoint) ||\n (0x2032 <= codePoint && codePoint <= 0x2033) ||\n (0x2035 == codePoint) ||\n (0x203B == codePoint) ||\n (0x203E == codePoint) ||\n (0x2074 == codePoint) ||\n (0x207F == codePoint) ||\n (0x2081 <= codePoint && codePoint <= 0x2084) ||\n (0x20AC == codePoint) ||\n (0x2103 == codePoint) ||\n (0x2105 == codePoint) ||\n (0x2109 == codePoint) ||\n (0x2113 == codePoint) ||\n (0x2116 == codePoint) ||\n (0x2121 <= codePoint && codePoint <= 0x2122) ||\n (0x2126 == codePoint) ||\n (0x212B == codePoint) ||\n (0x2153 <= codePoint && codePoint <= 0x2154) ||\n (0x215B <= codePoint && codePoint <= 0x215E) ||\n (0x2160 <= codePoint && codePoint <= 0x216B) ||\n (0x2170 <= codePoint && codePoint <= 0x2179) ||\n (0x2189 == codePoint) ||\n (0x2190 <= codePoint && codePoint <= 0x2199) ||\n (0x21B8 <= codePoint && codePoint <= 0x21B9) ||\n (0x21D2 == codePoint) ||\n (0x21D4 == codePoint) ||\n (0x21E7 == codePoint) ||\n (0x2200 == codePoint) ||\n (0x2202 <= codePoint && codePoint <= 0x2203) ||\n (0x2207 <= codePoint && codePoint <= 0x2208) ||\n (0x220B == codePoint) ||\n (0x220F == codePoint) ||\n (0x2211 == codePoint) ||\n (0x2215 == codePoint) ||\n (0x221A == codePoint) ||\n (0x221D <= codePoint && codePoint <= 0x2220) ||\n (0x2223 == codePoint) ||\n (0x2225 == codePoint) ||\n (0x2227 <= codePoint && codePoint <= 0x222C) ||\n (0x222E == codePoint) ||\n (0x2234 <= codePoint && codePoint <= 0x2237) ||\n (0x223C <= codePoint && codePoint <= 0x223D) ||\n (0x2248 == codePoint) ||\n (0x224C == codePoint) ||\n (0x2252 == codePoint) ||\n (0x2260 <= codePoint && codePoint <= 0x2261) ||\n (0x2264 <= codePoint && codePoint <= 0x2267) ||\n (0x226A <= codePoint && codePoint <= 0x226B) ||\n (0x226E <= codePoint && codePoint <= 0x226F) ||\n (0x2282 <= codePoint && codePoint <= 0x2283) ||\n (0x2286 <= codePoint && codePoint <= 0x2287) ||\n (0x2295 == codePoint) ||\n (0x2299 == codePoint) ||\n (0x22A5 == codePoint) ||\n (0x22BF == codePoint) ||\n (0x2312 == codePoint) ||\n (0x2460 <= codePoint && codePoint <= 0x24E9) ||\n (0x24EB <= codePoint && codePoint <= 0x254B) ||\n (0x2550 <= codePoint && codePoint <= 0x2573) ||\n (0x2580 <= codePoint && codePoint <= 0x258F) ||\n (0x2592 <= codePoint && codePoint <= 0x2595) ||\n (0x25A0 <= codePoint && codePoint <= 0x25A1) ||\n (0x25A3 <= codePoint && codePoint <= 0x25A9) ||\n (0x25B2 <= codePoint && codePoint <= 0x25B3) ||\n (0x25B6 <= codePoint && codePoint <= 0x25B7) ||\n (0x25BC <= codePoint && codePoint <= 0x25BD) ||\n (0x25C0 <= codePoint && codePoint <= 0x25C1) ||\n (0x25C6 <= codePoint && codePoint <= 0x25C8) ||\n (0x25CB == codePoint) ||\n (0x25CE <= codePoint && codePoint <= 0x25D1) ||\n (0x25E2 <= codePoint && codePoint <= 0x25E5) ||\n (0x25EF == codePoint) ||\n (0x2605 <= codePoint && codePoint <= 0x2606) ||\n (0x2609 == codePoint) ||\n (0x260E <= codePoint && codePoint <= 0x260F) ||\n (0x2614 <= codePoint && codePoint <= 0x2615) ||\n (0x261C == codePoint) ||\n (0x261E == codePoint) ||\n (0x2640 == codePoint) ||\n (0x2642 == codePoint) ||\n (0x2660 <= codePoint && codePoint <= 0x2661) ||\n (0x2663 <= codePoint && codePoint <= 0x2665) ||\n (0x2667 <= codePoint && codePoint <= 0x266A) ||\n (0x266C <= codePoint && codePoint <= 0x266D) ||\n (0x266F == codePoint) ||\n (0x269E <= codePoint && codePoint <= 0x269F) ||\n (0x26BE <= codePoint && codePoint <= 0x26BF) ||\n (0x26C4 <= codePoint && codePoint <= 0x26CD) ||\n (0x26CF <= codePoint && codePoint <= 0x26E1) ||\n (0x26E3 == codePoint) ||\n (0x26E8 <= codePoint && codePoint <= 0x26FF) ||\n (0x273D == codePoint) ||\n (0x2757 == codePoint) ||\n (0x2776 <= codePoint && codePoint <= 0x277F) ||\n (0x2B55 <= codePoint && codePoint <= 0x2B59) ||\n (0x3248 <= codePoint && codePoint <= 0x324F) ||\n (0xE000 <= codePoint && codePoint <= 0xF8FF) ||\n (0xFE00 <= codePoint && codePoint <= 0xFE0F) ||\n (0xFFFD == codePoint) ||\n (0x1F100 <= codePoint && codePoint <= 0x1F10A) ||\n (0x1F110 <= codePoint && codePoint <= 0x1F12D) ||\n (0x1F130 <= codePoint && codePoint <= 0x1F169) ||\n (0x1F170 <= codePoint && codePoint <= 0x1F19A) ||\n (0xE0100 <= codePoint && codePoint <= 0xE01EF) ||\n (0xF0000 <= codePoint && codePoint <= 0xFFFFD) ||\n (0x100000 <= codePoint && codePoint <= 0x10FFFD)) {\n return 'A';\n }\n\n return 'N';\n};\n\neaw.characterLength = function(character) {\n var code = this.eastAsianWidth(character);\n if (code == 'F' || code == 'W' || code == 'A') {\n return 2;\n } else {\n return 1;\n }\n};\n\n// Split a string considering surrogate-pairs.\nfunction stringToArray(string) {\n return string.match(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[^\\uD800-\\uDFFF]/g) || [];\n}\n\neaw.length = function(string) {\n var characters = stringToArray(string);\n var len = 0;\n for (var i = 0; i < characters.length; i++) {\n len = len + this.characterLength(characters[i]);\n }\n return len;\n};\n\neaw.slice = function(text, start, end) {\n textLen = eaw.length(text)\n start = start ? start : 0;\n end = end ? end : 1;\n if (start < 0) {\n start = textLen + start;\n }\n if (end < 0) {\n end = textLen + end;\n }\n var result = '';\n var eawLen = 0;\n var chars = stringToArray(text);\n for (var i = 0; i < chars.length; i++) {\n var char = chars[i];\n var charLen = eaw.length(char);\n if (eawLen >= start - (charLen == 2 ? 1 : 0)) {\n if (eawLen + charLen <= end) {\n result += char;\n } else {\n break;\n }\n }\n eawLen += charLen;\n }\n return result;\n};\n", "\"use strict\";\n\nmodule.exports = function () {\n // https://mths.be/emoji\n return /\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67)\\uDB40\\uDC7F|(?:\\uD83E\\uDDD1\\uD83C\\uDFFF\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83D\\uDC68(?:\\uD83C\\uDFFB(?:\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFF]))|\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))?|(?:\\uD83C[\\uDFFC-\\uDFFF])\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFF]))|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\u200D(?:(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFFF|\\uD83C\\uDFFE|\\uD83C\\uDFFD|\\uD83C\\uDFFC)?|(?:\\uD83D\\uDC69(?:\\uD83C\\uDFFB\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|(?:\\uD83C[\\uDFFC-\\uDFFF])\\u200D\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69]))|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC69(?:\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83E\\uDDD1(?:\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|\\uD83D\\uDE36\\u200D\\uD83C\\uDF2B|\\uD83C\\uDFF3\\uFE0F\\u200D\\u26A7|\\uD83D\\uDC3B\\u200D\\u2744|(?:(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD4\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\uD83C\\uDFF4\\u200D\\u2620|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD4\\uDDD6-\\uDDDD])\\u200D[\\u2640\\u2642]|[\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u2328\\u23CF\\u23ED-\\u23EF\\u23F1\\u23F2\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB\\u25FC\\u2600-\\u2604\\u260E\\u2611\\u2618\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u2692\\u2694-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A7\\u26B0\\u26B1\\u26C8\\u26CF\\u26D1\\u26D3\\u26E9\\u26F0\\u26F1\\u26F4\\u26F7\\u26F8\\u2702\\u2708\\u2709\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2733\\u2734\\u2744\\u2747\\u2763\\u27A1\\u2934\\u2935\\u2B05-\\u2B07\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDE02\\uDE37\\uDF21\\uDF24-\\uDF2C\\uDF36\\uDF7D\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E\\uDF9F\\uDFCD\\uDFCE\\uDFD4-\\uDFDF\\uDFF5\\uDFF7]|\\uD83D[\\uDC3F\\uDCFD\\uDD49\\uDD4A\\uDD6F\\uDD70\\uDD73\\uDD76-\\uDD79\\uDD87\\uDD8A-\\uDD8D\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA\\uDECB\\uDECD-\\uDECF\\uDEE0-\\uDEE5\\uDEE9\\uDEF0\\uDEF3])\\uFE0F|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDE35\\u200D\\uD83D\\uDCAB|\\uD83D\\uDE2E\\u200D\\uD83D\\uDCA8|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF|\\uD83C\\uDFFE|\\uD83C\\uDFFD|\\uD83C\\uDFFC|\\uD83C\\uDFFB)?|\\uD83D\\uDC69(?:\\uD83C\\uDFFF|\\uD83C\\uDFFE|\\uD83C\\uDFFD|\\uD83C\\uDFFC|\\uD83C\\uDFFB)?|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF6\\uD83C\\uDDE6|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83D\\uDC08\\u200D\\u2B1B|\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDD25|\\uD83E\\uDE79)|\\uD83D\\uDC41\\uFE0F|\\uD83C\\uDFF3\\uFE0F|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|[#\\*0-9]\\uFE0F\\u20E3|\\u2764\\uFE0F|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD4\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDFF4|(?:[\\u270A\\u270B]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDC8F\\uDC91\\uDCAA\\uDD7A\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0C\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2\\uDDD3\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270C\\u270D]|\\uD83D[\\uDD74\\uDD90])(?:\\uFE0F|\\uD83C[\\uDFFB-\\uDFFF])|[\\u270A\\u270B]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC08\\uDC15\\uDC3B\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDC8F\\uDC91\\uDCAA\\uDD7A\\uDD95\\uDD96\\uDE2E\\uDE35\\uDE36\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0C\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2\\uDDD3\\uDDD5]|\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD4\\uDDD6-\\uDDDD]|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF]|[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF84\\uDF86-\\uDF93\\uDFA0-\\uDFC1\\uDFC5\\uDFC6\\uDFC8\\uDFC9\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC07\\uDC09-\\uDC14\\uDC16-\\uDC3A\\uDC3C-\\uDC3E\\uDC40\\uDC44\\uDC45\\uDC51-\\uDC65\\uDC6A\\uDC79-\\uDC7B\\uDC7D-\\uDC80\\uDC84\\uDC88-\\uDC8E\\uDC90\\uDC92-\\uDCA9\\uDCAB-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDDA4\\uDDFB-\\uDE2D\\uDE2F-\\uDE34\\uDE37-\\uDE44\\uDE48-\\uDE4A\\uDE80-\\uDEA2\\uDEA4-\\uDEB3\\uDEB7-\\uDEBF\\uDEC1-\\uDEC5\\uDED0-\\uDED2\\uDED5-\\uDED7\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D\\uDD0E\\uDD10-\\uDD17\\uDD1D\\uDD20-\\uDD25\\uDD27-\\uDD2F\\uDD3A\\uDD3F-\\uDD45\\uDD47-\\uDD76\\uDD78\\uDD7A-\\uDDB4\\uDDB7\\uDDBA\\uDDBC-\\uDDCB\\uDDD0\\uDDE0-\\uDDFF\\uDE70-\\uDE74\\uDE78-\\uDE7A\\uDE80-\\uDE86\\uDE90-\\uDEA8\\uDEB0-\\uDEB6\\uDEC0-\\uDEC2\\uDED0-\\uDED6]|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5-\\uDED7\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0C-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD78\\uDD7A-\\uDDCB\\uDDCD-\\uDDFF\\uDE70-\\uDE74\\uDE78-\\uDE7A\\uDE80-\\uDE86\\uDE90-\\uDEA8\\uDEB0-\\uDEB6\\uDEC0-\\uDEC2\\uDED0-\\uDED6])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26A7\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5-\\uDED7\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFC\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0C-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD78\\uDD7A-\\uDDCB\\uDDCD-\\uDDFF\\uDE70-\\uDE74\\uDE78-\\uDE7A\\uDE80-\\uDE86\\uDE90-\\uDEA8\\uDEB0-\\uDEB6\\uDEC0-\\uDEC2\\uDED0-\\uDED6])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0C\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDD77\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g;\n};\n", "import stripAnsi from 'strip-ansi';\nimport eastAsianWidth from 'eastasianwidth';\nimport emojiRegex from 'emoji-regex';\n\nexport default function stringWidth(string, options = {}) {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\toptions = {\n\t\tambiguousIsNarrow: true,\n\t\t...options\n\t};\n\n\tstring = stripAnsi(string);\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = string.replace(emojiRegex(), ' ');\n\n\tconst ambiguousCharacterWidth = options.ambiguousIsNarrow ? 1 : 2;\n\tlet width = 0;\n\n\tfor (const character of string) {\n\t\tconst codePoint = character.codePointAt(0);\n\n\t\t// Ignore control characters\n\t\tif (codePoint <= 0x1F || (codePoint >= 0x7F && codePoint <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (codePoint >= 0x300 && codePoint <= 0x36F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst code = eastAsianWidth.eastAsianWidth(character);\n\t\tswitch (code) {\n\t\t\tcase 'F':\n\t\t\tcase 'W':\n\t\t\t\twidth += 2;\n\t\t\t\tbreak;\n\t\t\tcase 'A':\n\t\t\t\twidth += ambiguousCharacterWidth;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\twidth += 1;\n\t\t}\n\t}\n\n\treturn width;\n}\n", "const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue: (red, green, blue) => {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue: hex => {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue: code => {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n", "import stringWidth from 'string-width';\nimport stripAnsi from 'strip-ansi';\nimport ansiStyles from 'ansi-styles';\n\nconst ESCAPES = new Set([\n\t'\\u001B',\n\t'\\u009B',\n]);\n\nconst END_CODE = 39;\nconst ANSI_ESCAPE_BELL = '\\u0007';\nconst ANSI_CSI = '[';\nconst ANSI_OSC = ']';\nconst ANSI_SGR_TERMINATOR = 'm';\nconst ANSI_ESCAPE_LINK = `${ANSI_OSC}8;;`;\n\nconst wrapAnsiCode = code => `${ESCAPES.values().next().value}${ANSI_CSI}${code}${ANSI_SGR_TERMINATOR}`;\nconst wrapAnsiHyperlink = uri => `${ESCAPES.values().next().value}${ANSI_ESCAPE_LINK}${uri}${ANSI_ESCAPE_BELL}`;\n\n// Calculate the length of words split on ' ', ignoring\n// the extra characters added by ansi escape codes\nconst wordLengths = string => string.split(' ').map(character => stringWidth(character));\n\n// Wrap a long word across multiple rows\n// Ansi escape codes do not count towards length\nconst wrapWord = (rows, word, columns) => {\n\tconst characters = [...word];\n\n\tlet isInsideEscape = false;\n\tlet isInsideLinkEscape = false;\n\tlet visible = stringWidth(stripAnsi(rows[rows.length - 1]));\n\n\tfor (const [index, character] of characters.entries()) {\n\t\tconst characterLength = stringWidth(character);\n\n\t\tif (visible + characterLength <= columns) {\n\t\t\trows[rows.length - 1] += character;\n\t\t} else {\n\t\t\trows.push(character);\n\t\t\tvisible = 0;\n\t\t}\n\n\t\tif (ESCAPES.has(character)) {\n\t\t\tisInsideEscape = true;\n\t\t\tisInsideLinkEscape = characters.slice(index + 1).join('').startsWith(ANSI_ESCAPE_LINK);\n\t\t}\n\n\t\tif (isInsideEscape) {\n\t\t\tif (isInsideLinkEscape) {\n\t\t\t\tif (character === ANSI_ESCAPE_BELL) {\n\t\t\t\t\tisInsideEscape = false;\n\t\t\t\t\tisInsideLinkEscape = false;\n\t\t\t\t}\n\t\t\t} else if (character === ANSI_SGR_TERMINATOR) {\n\t\t\t\tisInsideEscape = false;\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tvisible += characterLength;\n\n\t\tif (visible === columns && index < characters.length - 1) {\n\t\t\trows.push('');\n\t\t\tvisible = 0;\n\t\t}\n\t}\n\n\t// It's possible that the last row we copy over is only\n\t// ansi escape characters, handle this edge-case\n\tif (!visible && rows[rows.length - 1].length > 0 && rows.length > 1) {\n\t\trows[rows.length - 2] += rows.pop();\n\t}\n};\n\n// Trims spaces from a string ignoring invisible sequences\nconst stringVisibleTrimSpacesRight = string => {\n\tconst words = string.split(' ');\n\tlet last = words.length;\n\n\twhile (last > 0) {\n\t\tif (stringWidth(words[last - 1]) > 0) {\n\t\t\tbreak;\n\t\t}\n\n\t\tlast--;\n\t}\n\n\tif (last === words.length) {\n\t\treturn string;\n\t}\n\n\treturn words.slice(0, last).join(' ') + words.slice(last).join('');\n};\n\n// The wrap-ansi module can be invoked in either 'hard' or 'soft' wrap mode\n//\n// 'hard' will never allow a string to take up more than columns characters\n//\n// 'soft' allows long words to expand past the column length\nconst exec = (string, columns, options = {}) => {\n\tif (options.trim !== false && string.trim() === '') {\n\t\treturn '';\n\t}\n\n\tlet returnValue = '';\n\tlet escapeCode;\n\tlet escapeUrl;\n\n\tconst lengths = wordLengths(string);\n\tlet rows = [''];\n\n\tfor (const [index, word] of string.split(' ').entries()) {\n\t\tif (options.trim !== false) {\n\t\t\trows[rows.length - 1] = rows[rows.length - 1].trimStart();\n\t\t}\n\n\t\tlet rowLength = stringWidth(rows[rows.length - 1]);\n\n\t\tif (index !== 0) {\n\t\t\tif (rowLength >= columns && (options.wordWrap === false || options.trim === false)) {\n\t\t\t\t// If we start with a new word but the current row length equals the length of the columns, add a new row\n\t\t\t\trows.push('');\n\t\t\t\trowLength = 0;\n\t\t\t}\n\n\t\t\tif (rowLength > 0 || options.trim === false) {\n\t\t\t\trows[rows.length - 1] += ' ';\n\t\t\t\trowLength++;\n\t\t\t}\n\t\t}\n\n\t\t// In 'hard' wrap mode, the length of a line is never allowed to extend past 'columns'\n\t\tif (options.hard && lengths[index] > columns) {\n\t\t\tconst remainingColumns = (columns - rowLength);\n\t\t\tconst breaksStartingThisLine = 1 + Math.floor((lengths[index] - remainingColumns - 1) / columns);\n\t\t\tconst breaksStartingNextLine = Math.floor((lengths[index] - 1) / columns);\n\t\t\tif (breaksStartingNextLine < breaksStartingThisLine) {\n\t\t\t\trows.push('');\n\t\t\t}\n\n\t\t\twrapWord(rows, word, columns);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (rowLength + lengths[index] > columns && rowLength > 0 && lengths[index] > 0) {\n\t\t\tif (options.wordWrap === false && rowLength < columns) {\n\t\t\t\twrapWord(rows, word, columns);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\trows.push('');\n\t\t}\n\n\t\tif (rowLength + lengths[index] > columns && options.wordWrap === false) {\n\t\t\twrapWord(rows, word, columns);\n\t\t\tcontinue;\n\t\t}\n\n\t\trows[rows.length - 1] += word;\n\t}\n\n\tif (options.trim !== false) {\n\t\trows = rows.map(row => stringVisibleTrimSpacesRight(row));\n\t}\n\n\tconst pre = [...rows.join('\\n')];\n\n\tfor (const [index, character] of pre.entries()) {\n\t\treturnValue += character;\n\n\t\tif (ESCAPES.has(character)) {\n\t\t\tconst {groups} = new RegExp(`(?:\\\\${ANSI_CSI}(?<code>\\\\d+)m|\\\\${ANSI_ESCAPE_LINK}(?<uri>.*)${ANSI_ESCAPE_BELL})`).exec(pre.slice(index).join('')) || {groups: {}};\n\t\t\tif (groups.code !== undefined) {\n\t\t\t\tconst code = Number.parseFloat(groups.code);\n\t\t\t\tescapeCode = code === END_CODE ? undefined : code;\n\t\t\t} else if (groups.uri !== undefined) {\n\t\t\t\tescapeUrl = groups.uri.length === 0 ? undefined : groups.uri;\n\t\t\t}\n\t\t}\n\n\t\tconst code = ansiStyles.codes.get(Number(escapeCode));\n\n\t\tif (pre[index + 1] === '\\n') {\n\t\t\tif (escapeUrl) {\n\t\t\t\treturnValue += wrapAnsiHyperlink('');\n\t\t\t}\n\n\t\t\tif (escapeCode && code) {\n\t\t\t\treturnValue += wrapAnsiCode(code);\n\t\t\t}\n\t\t} else if (character === '\\n') {\n\t\t\tif (escapeCode && code) {\n\t\t\t\treturnValue += wrapAnsiCode(escapeCode);\n\t\t\t}\n\n\t\t\tif (escapeUrl) {\n\t\t\t\treturnValue += wrapAnsiHyperlink(escapeUrl);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn returnValue;\n};\n\n// For each newline, invoke the method separately\nexport default function wrapAnsi(string, columns, options) {\n\treturn String(string)\n\t\t.normalize()\n\t\t.replace(/\\r\\n/g, '\\n')\n\t\t.split('\\n')\n\t\t.map(line => exec(line, columns, options))\n\t\t.join('\\n');\n}\n", "const actions = ['up', 'down', 'left', 'right', 'space', 'enter', 'cancel'] as const;\nexport type Action = (typeof actions)[number];\n\n/** Global settings for Clack programs, stored in memory */\ninterface InternalClackSettings {\n\tactions: Set<Action>;\n\taliases: Map<string, Action>;\n}\n\nexport const settings: InternalClackSettings = {\n\tactions: new Set(actions),\n\taliases: new Map<string, Action>([\n\t\t// vim support\n\t\t['k', 'up'],\n\t\t['j', 'down'],\n\t\t['h', 'left'],\n\t\t['l', 'right'],\n\t\t['\\x03', 'cancel'],\n\t\t// opinionated defaults!\n\t\t['escape', 'cancel'],\n\t]),\n};\n\nexport interface ClackSettings {\n\t/**\n\t * Set custom global aliases for the default actions.\n\t * This will not overwrite existing aliases, it will only add new ones!\n\t *\n\t * @param aliases - An object that maps aliases to actions\n\t * @default { k: 'up', j: 'down', h: 'left', l: 'right', '\\x03': 'cancel', 'escape': 'cancel' }\n\t */\n\taliases: Record<string, Action>;\n}\n\nexport function updateSettings(updates: ClackSettings) {\n\tfor (const _key in updates) {\n\t\tconst key = _key as keyof ClackSettings;\n\t\tif (!Object.hasOwn(updates, key)) continue;\n\t\tconst value = updates[key];\n\n\t\tswitch (key) {\n\t\t\tcase 'aliases': {\n\t\t\t\tfor (const alias in value) {\n\t\t\t\t\tif (!Object.hasOwn(value, alias)) continue;\n\t\t\t\t\tif (!settings.aliases.has(alias)) {\n\t\t\t\t\t\tsettings.aliases.set(alias, value[alias]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Check if a key is an alias for a default action\n * @param key - The raw key which might match to an action\n * @param action - The action to match\n * @returns boolean\n */\nexport function isActionKey(key: string | Array<string | undefined>, action: Action) {\n\tif (typeof key === 'string') {\n\t\treturn settings.aliases.get(key) === action;\n\t}\n\n\tfor (const value of key) {\n\t\tif (value === undefined) continue;\n\t\tif (isActionKey(value, action)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n", "export function diffLines(a: string, b: string) {\n\tif (a === b) return;\n\n\tconst aLines = a.split('\\n');\n\tconst bLines = b.split('\\n');\n\tconst diff: number[] = [];\n\n\tfor (let i = 0; i < Math.max(aLines.length, bLines.length); i++) {\n\t\tif (aLines[i] !== bLines[i]) diff.push(i);\n\t}\n\n\treturn diff;\n}\n", "import { stdin, stdout } from 'node:process';\nimport type { Key } from 'node:readline';\nimport * as readline from 'node:readline';\nimport type { Readable } from 'node:stream';\nimport { cursor } from 'sisteransi';\nimport { isActionKey } from './settings';\n\nexport * from './string';\nexport * from './settings';\n\nconst isWindows = globalThis.process.platform.startsWith('win');\n\nexport const CANCEL_SYMBOL = Symbol('clack:cancel');\n\nexport function isCancel(value: unknown): value is symbol {\n\treturn value === CANCEL_SYMBOL;\n}\n\nexport function setRawMode(input: Readable, value: boolean) {\n\tconst i = input as typeof stdin;\n\n\tif (i.isTTY) i.setRawMode(value);\n}\n\nexport function block({\n\tinput = stdin,\n\toutput = stdout,\n\toverwrite = true,\n\thideCursor = true,\n} = {}) {\n\tconst rl = readline.createInterface({\n\t\tinput,\n\t\toutput,\n\t\tprompt: '',\n\t\ttabSize: 1,\n\t});\n\treadline.emitKeypressEvents(input, rl);\n\tif (input.isTTY) input.setRawMode(true);\n\n\tconst clear = (data: Buffer, { name, sequence }: Key) => {\n\t\tconst str = String(data);\n\t\tif (isActionKey([str, name, sequence], 'cancel')) {\n\t\t\tif (hideCursor) output.write(cursor.show);\n\t\t\tprocess.exit(0);\n\t\t\treturn;\n\t\t}\n\t\tif (!overwrite) return;\n\t\tconst dx = name === 'return' ? 0 : -1;\n\t\tconst dy = name === 'return' ? -1 : 0;\n\n\t\treadline.moveCursor(output, dx, dy, () => {\n\t\t\treadline.clearLine(output, 1, () => {\n\t\t\t\tinput.once('keypress', clear);\n\t\t\t});\n\t\t});\n\t};\n\tif (hideCursor) output.write(cursor.hide);\n\tinput.once('keypress', clear);\n\n\treturn () => {\n\t\tinput.off('keypress', clear);\n\t\tif (hideCursor) output.write(cursor.show);\n\n\t\t// Prevent Windows specific issues: https://github.com/bombshell-dev/clack/issues/176\n\t\tif (input.isTTY && !isWindows) input.setRawMode(false);\n\n\t\t// @ts-expect-error fix for https://github.com/nodejs/node/issues/31762#issuecomment-1441223907\n\t\trl.terminal = false;\n\t\trl.close();\n\t};\n}\n", "import { stdin, stdout } from 'node:process';\nimport readline, { type Key, type ReadLine } from 'node:readline';\nimport type { Readable } from 'node:stream';\nimport { Writable } from 'node:stream';\nimport { cursor, erase } from 'sisteransi';\nimport wrap from 'wrap-ansi';\n\nimport { CANCEL_SYMBOL, diffLines, isActionKey, setRawMode, settings } from '../utils';\n\nimport type { ClackEvents, ClackState } from '../types';\nimport type { Action } from '../utils';\n\nexport interface PromptOptions<Self extends Prompt> {\n\trender(this: Omit<Self, 'prompt'>): string | undefined;\n\tplaceholder?: string;\n\tinitialValue?: any;\n\tvalidate?: ((value: any) => string | Error | undefined) | undefined;\n\tinput?: Readable;\n\toutput?: Writable;\n\tdebug?: boolean;\n\tsignal?: AbortSignal;\n}\n\nexport default class Prompt {\n\tprotected input: Readable;\n\tprotected output: Writable;\n\tprivate _abortSignal?: AbortSignal;\n\n\tprivate rl: ReadLine | undefined;\n\tprivate opts: Omit<PromptOptions<Prompt>, 'render' | 'input' | 'output'>;\n\tprivate _render: (context: Omit<Prompt, 'prompt'>) => string | undefined;\n\tprivate _track = false;\n\tprivate _prevFrame = '';\n\tprivate _subscribers = new Map<string, { cb: (...args: any) => any; once?: boolean }[]>();\n\tprotected _cursor = 0;\n\n\tpublic state: ClackState = 'initial';\n\tpublic error = '';\n\tpublic value: any;\n\n\tconstructor(options: PromptOptions<Prompt>, trackValue = true) {\n\t\tconst { input = stdin, output = stdout, render, signal, ...opts } = options;\n\n\t\tthis.opts = opts;\n\t\tthis.onKeypress = this.onKeypress.bind(this);\n\t\tthis.close = this.close.bind(this);\n\t\tthis.render = this.render.bind(this);\n\t\tthis._render = render.bind(this);\n\t\tthis._track = trackValue;\n\t\tthis._abortSignal = signal;\n\n\t\tthis.input = input;\n\t\tthis.output = output;\n\t}\n\n\t/**\n\t * Unsubscribe all listeners\n\t */\n\tprotected unsubscribe() {\n\t\tthis._subscribers.clear();\n\t}\n\n\t/**\n\t * Set a subscriber with opts\n\t * @param event - The event name\n\t */\n\tprivate setSubscriber<T extends keyof ClackEvents>(\n\t\tevent: T,\n\t\topts: { cb: ClackEvents[T]; once?: boolean }\n\t) {\n\t\tconst params = this._subscribers.get(event) ?? [];\n\t\tparams.push(opts);\n\t\tthis._subscribers.set(event, params);\n\t}\n\n\t/**\n\t * Subscribe to an event\n\t * @param event - The event name\n\t * @param cb - The callback\n\t */\n\tpublic on<T extends keyof ClackEvents>(event: T, cb: ClackEvents[T]) {\n\t\tthis.setSubscriber(event, { cb });\n\t}\n\n\t/**\n\t * Subscribe to an event once\n\t * @param event - The event name\n\t * @param cb - The callback\n\t */\n\tpublic once<T extends keyof ClackEvents>(event: T, cb: ClackEvents[T]) {\n\t\tthis.setSubscriber(event, { cb, once: true });\n\t}\n\n\t/**\n\t * Emit an event with data\n\t * @param event - The event name\n\t * @param data - The data to pass to the callback\n\t */\n\tpublic emit<T extends keyof ClackEvents>(event: T, ...data: Parameters<ClackEvents[T]>) {\n\t\tconst cbs = this._subscribers.get(event) ?? [];\n\t\tconst cleanup: (() => void)[] = [];\n\n\t\tfor (const subscriber of cbs) {\n\t\t\tsubscriber.cb(...data);\n\n\t\t\tif (subscriber.once) {\n\t\t\t\tcleanup.push(() => cbs.splice(cbs.indexOf(subscriber), 1));\n\t\t\t}\n\t\t}\n\n\t\tfor (const cb of cleanup) {\n\t\t\tcb();\n\t\t}\n\t}\n\n\tpublic prompt() {\n\t\treturn new Promise<string | symbol>((resolve, reject) => {\n\t\t\tif (this._abortSignal) {\n\t\t\t\tif (this._abortSignal.aborted) {\n\t\t\t\t\tthis.state = 'cancel';\n\n\t\t\t\t\tthis.close();\n\t\t\t\t\treturn resolve(CANCEL_SYMBOL);\n\t\t\t\t}\n\n\t\t\t\tthis._abortSignal.addEventListener(\n\t\t\t\t\t'abort',\n\t\t\t\t\t() => {\n\t\t\t\t\t\tthis.state = 'cancel';\n\t\t\t\t\t\tthis.close();\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true }\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst sink = new Writable();\n\t\t\tsink._write = (chunk, encoding, done) => {\n\t\t\t\tif (this._track) {\n\t\t\t\t\tthis.value = this.rl?.line.replace(/\\t/g, '');\n\t\t\t\t\tthis._cursor = this.rl?.cursor ?? 0;\n\t\t\t\t\tthis.emit('value', this.value);\n\t\t\t\t}\n\t\t\t\tdone();\n\t\t\t};\n\t\t\tthis.input.pipe(sink);\n\n\t\t\tthis.rl = readline.createInterface({\n\t\t\t\tinput: this.input,\n\t\t\t\toutput: sink,\n\t\t\t\ttabSize: 2,\n\t\t\t\tprompt: '',\n\t\t\t\tescapeCodeTimeout: 50,\n\t\t\t\tterminal: true,\n\t\t\t});\n\t\t\treadline.emitKeypressEvents(this.input, this.rl);\n\t\t\tthis.rl.prompt();\n\t\t\tif (this.opts.initialValue !== undefined && this._track) {\n\t\t\t\tthis.rl.write(this.opts.initialValue);\n\t\t\t}\n\n\t\t\tthis.input.on('keypress', this.onKeypress);\n\t\t\tsetRawMode(this.input, true);\n\t\t\tthis.output.on('resize', this.render);\n\n\t\t\tthis.render();\n\n\t\t\tthis.once('submit', () => {\n\t\t\t\tthis.output.write(cursor.show);\n\t\t\t\tthis.output.off('resize', this.render);\n\t\t\t\tsetRawMode(this.input, false);\n\t\t\t\tresolve(this.value);\n\t\t\t});\n\t\t\tthis.once('cancel', () => {\n\t\t\t\tthis.output.write(cursor.show);\n\t\t\t\tthis.output.off('resize', this.render);\n\t\t\t\tsetRawMode(this.input, false);\n\t\t\t\tresolve(CANCEL_SYMBOL);\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate onKeypress(char: string, key?: Key) {\n\t\tif (this.state === 'error') {\n\t\t\tthis.state = 'active';\n\t\t}\n\t\tif (key?.name) {\n\t\t\tif (!this._track && settings.aliases.has(key.name)) {\n\t\t\t\tthis.emit('cursor', settings.aliases.get(key.name));\n\t\t\t}\n\t\t\tif (settings.actions.has(key.name as Action)) {\n\t\t\t\tthis.emit('cursor', key.name as Action);\n\t\t\t}\n\t\t}\n\t\tif (char && (char.toLowerCase() === 'y' || char.toLowerCase() === 'n')) {\n\t\t\tthis.emit('confirm', char.toLowerCase() === 'y');\n\t\t}\n\t\tif (char === '\\t' && this.opts.placeholder) {\n\t\t\tif (!this.value) {\n\t\t\t\tthis.rl?.write(this.opts.placeholder);\n\t\t\t\tthis.emit('value', this.opts.placeholder);\n\t\t\t}\n\t\t}\n\t\tif (char) {\n\t\t\tthis.emit('key', char.toLowerCase());\n\t\t}\n\n\t\tif (key?.name === 'return') {\n\t\t\tif (!this.value && this.opts.placeholder) {\n\t\t\t\tthis.rl?.write(this.opts.placeholder);\n\t\t\t\tthis.emit('value', this.opts.placeholder);\n\t\t\t}\n\n\t\t\tif (this.opts.validate) {\n\t\t\t\tconst problem = this.opts.validate(this.value);\n\t\t\t\tif (problem) {\n\t\t\t\t\tthis.error = problem instanceof Error ? problem.message : problem;\n\t\t\t\t\tthis.state = 'error';\n\t\t\t\t\tthis.rl?.write(this.value);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.state !== 'error') {\n\t\t\t\tthis.state = 'submit';\n\t\t\t}\n\t\t}\n\n\t\tif (isActionKey([char, key?.name, key?.sequence], 'cancel')) {\n\t\t\tthis.state = 'cancel';\n\t\t}\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\tthis.emit('finalize');\n\t\t}\n\t\tthis.render();\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\tprotected close() {\n\t\tthis.input.unpipe();\n\t\tthis.input.removeListener('keypress', this.onKeypress);\n\t\tthis.output.write('\\n');\n\t\tsetRawMode(this.input, false);\n\t\tthis.rl?.close();\n\t\tthis.rl = undefined;\n\t\tthis.emit(`${this.state}`, this.value);\n\t\tthis.unsubscribe();\n\t}\n\n\tprivate restoreCursor() {\n\t\tconst lines =\n\t\t\twrap(this._prevFrame, process.stdout.columns, { hard: true }).split('\\n').length - 1;\n\t\tthis.output.write(cursor.move(-999, lines * -1));\n\t}\n\n\tprivate render() {\n\t\tconst frame = wrap(this._render(this) ?? '', process.stdout.columns, { hard: true });\n\t\tif (frame === this._prevFrame) return;\n\n\t\tif (this.state === 'initial') {\n\t\t\tthis.output.write(cursor.hide);\n\t\t} else {\n\t\t\tconst diff = diffLines(this._prevFrame, frame);\n\t\t\tthis.restoreCursor();\n\t\t\t// If a single line has changed, only update that line\n\t\t\tif (diff && diff?.length === 1) {\n\t\t\t\tconst diffLine = diff[0];\n\t\t\t\tthis.output.write(cursor.move(0, diffLine));\n\t\t\t\tthis.output.write(erase.lines(1));\n\t\t\t\tconst lines = frame.split('\\n');\n\t\t\t\tthis.output.write(lines[diffLine]);\n\t\t\t\tthis._prevFrame = frame;\n\t\t\t\tthis.output.write(cursor.move(0, lines.length - diffLine - 1));\n\t\t\t\treturn;\n\t\t\t\t// If many lines have changed, rerender everything past the first line\n\t\t\t}\n\t\t\tif (diff && diff?.length > 1) {\n\t\t\t\tconst diffLine = diff[0];\n\t\t\t\tthis.output.write(cursor.move(0, diffLine));\n\t\t\t\tthis.output.write(erase.down());\n\t\t\t\tconst lines = frame.split('\\n');\n\t\t\t\tconst newLines = lines.slice(diffLine);\n\t\t\t\tthis.output.write(newLines.join('\\n'));\n\t\t\t\tthis._prevFrame = frame;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.output.write(erase.down());\n\t\t}\n\n\t\tthis.output.write(frame);\n\t\tif (this.state === 'initial') {\n\t\t\tthis.state = 'active';\n\t\t}\n\t\tthis._prevFrame = frame;\n\t}\n}\n", "import { cursor } from 'sisteransi';\nimport Prompt, { type PromptOptions } from './prompt';\n\ninterface ConfirmOptions extends PromptOptions<ConfirmPrompt> {\n\tactive: string;\n\tinactive: string;\n\tinitialValue?: boolean;\n}\nexport default class ConfirmPrompt extends Prompt {\n\tget cursor() {\n\t\treturn this.value ? 0 : 1;\n\t}\n\n\tprivate get _value() {\n\t\treturn this.cursor === 0;\n\t}\n\n\tconstructor(opts: ConfirmOptions) {\n\t\tsuper(opts, false);\n\t\tthis.value = !!opts.initialValue;\n\n\t\tthis.on('value', () => {\n\t\t\tthis.value = this._value;\n\t\t});\n\n\t\tthis.on('confirm', (confirm) => {\n\t\t\tthis.output.write(cursor.move(0, -1));\n\t\t\tthis.value = confirm;\n\t\t\tthis.state = 'submit';\n\t\t\tthis.close();\n\t\t});\n\n\t\tthis.on('cursor', () => {\n\t\t\tthis.value = !this.value;\n\t\t});\n\t}\n}\n", "import Prompt, { type PromptOptions } from './prompt';\n\ninterface GroupMultiSelectOptions<T extends { value: any }>\n\textends PromptOptions<GroupMultiSelectPrompt<T>> {\n\toptions: Record<string, T[]>;\n\tinitialValues?: T['value'][];\n\trequired?: boolean;\n\tcursorAt?: T['value'];\n\tselectableGroups?: boolean;\n}\nexport default class GroupMultiSelectPrompt<T extends { value: any }> extends Prompt {\n\toptions: (T & { group: string | boolean })[];\n\tcursor = 0;\n\t#selectableGroups: boolean;\n\n\tgetGroupItems(group: string): T[] {\n\t\treturn this.options.filter((o) => o.group === group);\n\t}\n\n\tisGroupSelected(group: string) {\n\t\tconst items = this.getGroupItems(group);\n\t\treturn items.every((i) => this.value.includes(i.value));\n\t}\n\n\tprivate toggleValue() {\n\t\tconst item = this.options[this.cursor];\n\t\tif (item.group === true) {\n\t\t\tconst group = item.value;\n\t\t\tconst groupedItems = this.getGroupItems(group);\n\t\t\tif (this.isGroupSelected(group)) {\n\t\t\t\tthis.value = this.value.filter(\n\t\t\t\t\t(v: string) => groupedItems.findIndex((i) => i.value === v) === -1\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.value = [...this.value, ...groupedItems.map((i) => i.value)];\n\t\t\t}\n\t\t\tthis.value = Array.from(new Set(this.value));\n\t\t} else {\n\t\t\tconst selected = this.value.includes(item.value);\n\t\t\tthis.value = selected\n\t\t\t\t? this.value.filter((v: T['value']) => v !== item.value)\n\t\t\t\t: [...this.value, item.value];\n\t\t}\n\t}\n\n\tconstructor(opts: GroupMultiSelectOptions<T>) {\n\t\tsuper(opts, false);\n\t\tconst { options } = opts;\n\t\tthis.#selectableGroups = opts.selectableGroups !== false;\n\t\tthis.options = Object.entries(options).flatMap(([key, option]) => [\n\t\t\t{ value: key, group: true, label: key },\n\t\t\t...option.map((opt) => ({ ...opt, group: key })),\n\t\t]) as any;\n\t\tthis.value = [...(opts.initialValues ?? [])];\n\t\tthis.cursor = Math.max(\n\t\t\tthis.options.findIndex(({ value }) => value === opts.cursorAt),\n\t\t\tthis.#selectableGroups ? 0 : 1\n\t\t);\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up': {\n\t\t\t\t\tthis.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;\n\t\t\t\t\tconst currentIsGroup = this.options[this.cursor]?.group === true;\n\t\t\t\t\tif (!this.#selectableGroups && currentIsGroup) {\n\t\t\t\t\t\tthis.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right': {\n\t\t\t\t\tthis.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;\n\t\t\t\t\tconst currentIsGroup = this.options[this.cursor]?.group === true;\n\t\t\t\t\tif (!this.#selectableGroups && currentIsGroup) {\n\t\t\t\t\t\tthis.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'space':\n\t\t\t\t\tthis.toggleValue();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n}\n", "import Prompt, { type PromptOptions } from './prompt';\n\ninterface MultiSelectOptions<T extends { value: any }> extends PromptOptions<MultiSelectPrompt<T>> {\n\toptions: T[];\n\tinitialValues?: T['value'][];\n\trequired?: boolean;\n\tcursorAt?: T['value'];\n}\nexport default class MultiSelectPrompt<T extends { value: any }> extends Prompt {\n\toptions: T[];\n\tcursor = 0;\n\n\tprivate get _value() {\n\t\treturn this.options[this.cursor].value;\n\t}\n\n\tprivate toggleAll() {\n\t\tconst allSelected = this.value.length === this.options.length;\n\t\tthis.value = allSelected ? [] : this.options.map((v) => v.value);\n\t}\n\n\tprivate toggleValue() {\n\t\tconst selected = this.value.includes(this._value);\n\t\tthis.value = selected\n\t\t\t? this.value.filter((value: T['value']) => value !== this._value)\n\t\t\t: [...this.value, this._value];\n\t}\n\n\tconstructor(opts: MultiSelectOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\t\tthis.value = [...(opts.initialValues ?? [])];\n\t\tthis.cursor = Math.max(\n\t\t\tthis.options.findIndex(({ value }) => value === opts.cursorAt),\n\t\t\t0\n\t\t);\n\t\tthis.on('key', (char) => {\n\t\t\tif (char === 'a') {\n\t\t\t\tthis.toggleAll();\n\t\t\t}\n\t\t});\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up':\n\t\t\t\t\tthis.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right':\n\t\t\t\t\tthis.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'space':\n\t\t\t\t\tthis.toggleValue();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n}\n", "import color from 'picocolors';\nimport Prompt, { type PromptOptions } from './prompt';\n\ninterface PasswordOptions extends PromptOptions<PasswordPrompt> {\n\tmask?: string;\n}\nexport default class PasswordPrompt extends Prompt {\n\tvalueWithCursor = '';\n\tprivate _mask = '•';\n\tget cursor() {\n\t\treturn this._cursor;\n\t}\n\tget masked() {\n\t\treturn this.value.replaceAll(/./g, this._mask);\n\t}\n\tconstructor({ mask, ...opts }: PasswordOptions) {\n\t\tsuper(opts);\n\t\tthis._mask = mask ?? '•';\n\n\t\tthis.on('finalize', () => {\n\t\t\tthis.valueWithCursor = this.masked;\n\t\t});\n\t\tthis.on('value', () => {\n\t\t\tif (this.cursor >= this.value.length) {\n\t\t\t\tthis.valueWithCursor = `${this.masked}${color.inverse(color.hidden('_'))}`;\n\t\t\t} else {\n\t\t\t\tconst s1 = this.masked.slice(0, this.cursor);\n\t\t\t\tconst s2 = this.masked.slice(this.cursor);\n\t\t\t\tthis.valueWithCursor = `${s1}${color.inverse(s2[0])}${s2.slice(1)}`;\n\t\t\t}\n\t\t});\n\t}\n}\n", "import Prompt, { type PromptOptions } from './prompt';\n\ninterface SelectOptions<T extends { value: any }> extends PromptOptions<SelectPrompt<T>> {\n\toptions: T[];\n\tinitialValue?: T['value'];\n}\nexport default class SelectPrompt<T extends { value: any }> extends Prompt {\n\toptions: T[];\n\tcursor = 0;\n\n\tprivate get _value() {\n\t\treturn this.options[this.cursor];\n\t}\n\n\tprivate changeValue() {\n\t\tthis.value = this._value.value;\n\t}\n\n\tconstructor(opts: SelectOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\t\tthis.cursor = this.options.findIndex(({ value }) => value === opts.initialValue);\n\t\tif (this.cursor === -1) this.cursor = 0;\n\t\tthis.changeValue();\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up':\n\t\t\t\t\tthis.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right':\n\t\t\t\t\tthis.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tthis.changeValue();\n\t\t});\n\t}\n}\n", "import Prompt, { type PromptOptions } from './prompt';\n\ninterface SelectKeyOptions<T extends { value: any }> extends PromptOptions<SelectKeyPrompt<T>> {\n\toptions: T[];\n}\nexport default class SelectKeyPrompt<T extends { value: any }> extends Prompt {\n\toptions: T[];\n\tcursor = 0;\n\n\tconstructor(opts: SelectKeyOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\t\tconst keys = this.options.map(({ value: [initial] }) => initial?.toLowerCase());\n\t\tthis.cursor = Math.max(keys.indexOf(opts.initialValue), 0);\n\n\t\tthis.on('key', (key) => {\n\t\t\tif (!keys.includes(key)) return;\n\t\t\tconst value = this.options.find(({ value: [initial] }) => initial?.toLowerCase() === key);\n\t\t\tif (value) {\n\t\t\t\tthis.value = value.value;\n\t\t\t\tthis.state = 'submit';\n\t\t\t\tthis.emit('submit');\n\t\t\t}\n\t\t});\n\t}\n}\n", "import color from 'picocolors';\nimport Prompt, { type PromptOptions } from './prompt';\n\nexport interface TextOptions extends PromptOptions<TextPrompt> {\n\tplaceholder?: string;\n\tdefaultValue?: string;\n}\n\nexport default class TextPrompt extends Prompt {\n\tget valueWithCursor() {\n\t\tif (this.state === 'submit') {\n\t\t\treturn this.value;\n\t\t}\n\t\tif (this.cursor >= this.value.length) {\n\t\t\treturn `${this.value}█`;\n\t\t}\n\t\tconst s1 = this.value.slice(0, this.cursor);\n\t\tconst [s2, ...s3] = this.value.slice(this.cursor);\n\t\treturn `${s1}${color.inverse(s2)}${s3.join('')}`;\n\t}\n\tget cursor() {\n\t\treturn this._cursor;\n\t}\n\tconstructor(opts: TextOptions) {\n\t\tsuper(opts);\n\n\t\tthis.on('finalize', () => {\n\t\t\tif (!this.value) {\n\t\t\t\tthis.value = opts.defaultValue;\n\t\t\t}\n\t\t});\n\t}\n}\n", "import process from 'node:process';\n\nexport default function isUnicodeSupported() {\n\tif (process.platform !== 'win32') {\n\t\treturn process.env.TERM !== 'linux'; // Linux console (kernel)\n\t}\n\n\treturn Boolean(process.env.CI)\n\t\t|| Boolean(process.env.WT_SESSION) // Windows Terminal\n\t\t|| Boolean(process.env.TERMINUS_SUBLIME) // Terminus (<0.2.27)\n\t\t|| process.env.ConEmuTask === '{cmd::Cmder}' // ConEmu and cmder\n\t\t|| process.env.TERM_PROGRAM === 'Terminus-Sublime'\n\t\t|| process.env.TERM_PROGRAM === 'vscode'\n\t\t|| process.env.TERM === 'xterm-256color'\n\t\t|| process.env.TERM === 'alacritty'\n\t\t|| process.env.TERMINAL_EMULATOR === 'JetBrains-JediTerm';\n}\n", "import { stripVTControlCharacters as strip } from 'node:util';\nimport {\n\tConfirmPrompt,\n\tGroupMultiSelectPrompt,\n\tMultiSelectPrompt,\n\tPasswordPrompt,\n\tSelectKeyPrompt,\n\tSelectPrompt,\n\ttype State,\n\tTextPrompt,\n\tblock,\n\tisCancel,\n} from '@clack/core';\nimport isUnicodeSupported from 'is-unicode-supported';\nimport color from 'picocolors';\nimport { cursor, erase } from 'sisteransi';\n\nexport { isCancel } from '@clack/core';\nexport { updateSettings, type ClackSettings } from '@clack/core';\n\nconst unicode = isUnicodeSupported();\nconst s = (c: string, fallback: string) => (unicode ? c : fallback);\nconst S_STEP_ACTIVE = s('◆', '*');\nconst S_STEP_CANCEL = s('■', 'x');\nconst S_STEP_ERROR = s('▲', 'x');\nconst S_STEP_SUBMIT = s('◇', 'o');\n\nconst S_BAR_START = s('┌', 'T');\nconst S_BAR = s('│', '|');\nconst S_BAR_END = s('└', '—');\n\nconst S_RADIO_ACTIVE = s('●', '>');\nconst S_RADIO_INACTIVE = s('○', ' ');\nconst S_CHECKBOX_ACTIVE = s('◻', '[•]');\nconst S_CHECKBOX_SELECTED = s('◼', '[+]');\nconst S_CHECKBOX_INACTIVE = s('◻', '[ ]');\nconst S_PASSWORD_MASK = s('▪', '•');\n\nconst S_BAR_H = s('─', '-');\nconst S_CORNER_TOP_RIGHT = s('╮', '+');\nconst S_CONNECT_LEFT = s('├', '+');\nconst S_CORNER_BOTTOM_RIGHT = s('╯', '+');\n\nconst S_INFO = s('●', '•');\nconst S_SUCCESS = s('◆', '*');\nconst S_WARN = s('▲', '!');\nconst S_ERROR = s('■', 'x');\n\nconst symbol = (state: State) => {\n\tswitch (state) {\n\t\tcase 'initial':\n\t\tcase 'active':\n\t\t\treturn color.cyan(S_STEP_ACTIVE);\n\t\tcase 'cancel':\n\t\t\treturn color.red(S_STEP_CANCEL);\n\t\tcase 'error':\n\t\t\treturn color.yellow(S_STEP_ERROR);\n\t\tcase 'submit':\n\t\t\treturn color.green(S_STEP_SUBMIT);\n\t}\n};\n\ninterface LimitOptionsParams<TOption> {\n\toptions: TOption[];\n\tmaxItems: number | undefined;\n\tcursor: number;\n\tstyle: (option: TOption, active: boolean) => string;\n}\n\nconst limitOptions = <TOption>(params: LimitOptionsParams<TOption>): string[] => {\n\tconst { cursor, options, style } = params;\n\n\tconst paramMaxItems = params.maxItems ?? Number.POSITIVE_INFINITY;\n\tconst outputMaxItems = Math.max(process.stdout.rows - 4, 0);\n\t// We clamp to minimum 5 because anything less doesn't make sense UX wise\n\tconst maxItems = Math.min(outputMaxItems, Math.max(paramMaxItems, 5));\n\tlet slidingWindowLocation = 0;\n\n\tif (cursor >= slidingWindowLocation + maxItems - 3) {\n\t\tslidingWindowLocation = Math.max(Math.min(cursor - maxItems + 3, options.length - maxItems), 0);\n\t} else if (cursor < slidingWindowLocation + 2) {\n\t\tslidingWindowLocation = Math.max(cursor - 2, 0);\n\t}\n\n\tconst shouldRenderTopEllipsis = maxItems < options.length && slidingWindowLocation > 0;\n\tconst shouldRenderBottomEllipsis =\n\t\tmaxItems < options.length && slidingWindowLocation + maxItems < options.length;\n\n\treturn options\n\t\t.slice(slidingWindowLocation, slidingWindowLocation + maxItems)\n\t\t.map((option, i, arr) => {\n\t\t\tconst isTopLimit = i === 0 && shouldRenderTopEllipsis;\n\t\t\tconst isBottomLimit = i === arr.length - 1 && shouldRenderBottomEllipsis;\n\t\t\treturn isTopLimit || isBottomLimit\n\t\t\t\t? color.dim('...')\n\t\t\t\t: style(option, i + slidingWindowLocation === cursor);\n\t\t});\n};\n\nexport interface TextOptions {\n\tmessage: string;\n\tplaceholder?: string;\n\tdefaultValue?: string;\n\tinitialValue?: string;\n\tvalidate?: (value: string) => string | Error | undefined;\n}\nexport const text = (opts: TextOptions) => {\n\treturn new TextPrompt({\n\t\tvalidate: opts.validate,\n\t\tplaceholder: opts.placeholder,\n\t\tdefaultValue: opts.defaultValue,\n\t\tinitialValue: opts.initialValue,\n\t\trender() {\n\t\t\tconst title = `${color.gray(S_BAR)}\\n${symbol(this.state)} ${opts.message}\\n`;\n\t\t\tconst placeholder = opts.placeholder\n\t\t\t\t? color.inverse(opts.placeholder[0]) + color.dim(opts.placeholder.slice(1))\n\t\t\t\t: color.inverse(color.hidden('_'));\n\t\t\tconst value = !this.value ? placeholder : this.valueWithCursor;\n\n\t\t\tswitch (this.state) {\n\t\t\t\tcase 'error':\n\t\t\t\t\treturn `${title.trim()}\\n${color.yellow(S_BAR)} ${value}\\n${color.yellow(\n\t\t\t\t\t\tS_BAR_END\n\t\t\t\t\t)} ${color.yellow(this.error)}\\n`;\n\t\t\t\tcase 'submit':\n\t\t\t\t\treturn `${title}${color.gray(S_BAR)} ${color.dim(this.value || opts.placeholder)}`;\n\t\t\t\tcase 'cancel':\n\t\t\t\t\treturn `${title}${color.gray(S_BAR)} ${color.strikethrough(\n\t\t\t\t\t\tcolor.dim(this.value ?? '')\n\t\t\t\t\t)}${this.value?.trim() ? `\\n${color.gray(S_BAR)}` : ''}`;\n\t\t\t\tdefault:\n\t\t\t\t\treturn `${title}${color.cyan(S_BAR)} ${value}\\n${color.cyan(S_BAR_END)}\\n`;\n\t\t\t}\n\t\t},\n\t}).prompt() as Promise<string | symbol>;\n};\n\nexport interface PasswordOptions {\n\tmessage: string;\n\tmask?: string;\n\tvalidate?: (value: string) => string | Error | undefined;\n}\nexport const password = (opts: PasswordOptions) => {\n\treturn new PasswordPrompt({\n\t\tvalidate: opts.validate,\n\t\tmask: opts.mask ?? S_PASSWORD_MASK,\n\t\trender() {\n\t\t\tconst title = `${color.gray(S_BAR)}\\n${symbol(this.state)} ${opts.message}\\n`;\n\t\t\tconst value = this.valueWithCursor;\n\t\t\tconst masked = this.masked;\n\n\t\t\tswitch (this.state) {\n\t\t\t\tcase 'error':\n\t\t\t\t\treturn `${title.trim()}\\n${color.yellow(S_BAR)} ${masked}\\n${color.yellow(\n\t\t\t\t\t\tS_BAR_END\n\t\t\t\t\t)} ${color.yellow(this.error)}\\n`;\n\t\t\t\tcase 'submit':\n\t\t\t\t\treturn `${title}${color.gray(S_BAR)} ${color.dim(masked)}`;\n\t\t\t\tcase 'cancel':\n\t\t\t\t\treturn `${title}${color.gray(S_BAR)} ${color.strikethrough(color.dim(masked ?? ''))}${\n\t\t\t\t\t\tmasked ? `\\n${color.gray(S_BAR)}` : ''\n\t\t\t\t\t}`;\n\t\t\t\tdefault:\n\t\t\t\t\treturn `${title}${color.cyan(S_BAR)} ${value}\\n${color.cyan(S_BAR_END)}\\n`;\n\t\t\t}\n\t\t},\n\t}).prompt() as Promise<string | symbol>;\n};\n\nexport interface ConfirmOptions {\n\tmessage: string;\n\tactive?: string;\n\tinactive?: string;\n\tinitialValue?: boolean;\n}\nexport const confirm = (opts: ConfirmOptions) => {\n\tconst active = opts.active ?? 'Yes';\n\tconst inactive = opts.inactive ?? 'No';\n\treturn new ConfirmPrompt({\n\t\tactive,\n\t\tinactive,\n\t\tinitialValue: opts.initialValue ?? true,\n\t\trender() {\n\t\t\tconst title = `${color.gray(S_BAR)}\\n${symbol(this.state)} ${opts.message}\\n`;\n\t\t\tconst value = this.value ? active : inactive;\n\n\t\t\tswitch (this.state) {\n\t\t\t\tcase 'submit':\n\t\t\t\t\treturn `${title}${color.gray(S_BAR)} ${color.dim(value)}`;\n\t\t\t\tcase 'cancel':\n\t\t\t\t\treturn `${title}${color.gray(S_BAR)} ${color.strikethrough(\n\t\t\t\t\t\tcolor.dim(value)\n\t\t\t\t\t)}\\n${color.gray(S_BAR)}`;\n\t\t\t\tdefault: {\n\t\t\t\t\treturn `${title}${color.cyan(S_BAR)} ${\n\t\t\t\t\t\tthis.value\n\t\t\t\t\t\t\t? `${color.green(S_RADIO_ACTIVE)} ${active}`\n\t\t\t\t\t\t\t: `${color.dim(S_RADIO_INACTIVE)} ${color.dim(active)}`\n\t\t\t\t\t} ${color.dim('/')} ${\n\t\t\t\t\t\t!this.value\n\t\t\t\t\t\t\t? `${color.green(S_RADIO_ACTIVE)} ${inactive}`\n\t\t\t\t\t\t\t: `${color.dim(S_RADIO_INACTIVE)} ${color.dim(inactive)}`\n\t\t\t\t\t}\\n${color.cyan(S_BAR_END)}\\n`;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}).prompt() as Promise<boolean | symbol>;\n};\n\ntype Primitive = Readonly<string | boolean | number>;\n\nexport type Option<Value> = Value extends Primitive\n\t? {\n\t\t\t/**\n\t\t\t * Internal data for this option.\n\t\t\t */\n\t\t\tvalue: Value;\n\t\t\t/**\n\t\t\t * The optional, user-facing text for this option.\n\t\t\t *\n\t\t\t * By default, the `value` is converted to a string.\n\t\t\t */\n\t\t\tlabel?: string;\n\t\t\t/**\n\t\t\t * An optional hint to display to the user when\n\t\t\t * this option might be selected.\n\t\t\t *\n\t\t\t * By default, no `hint` is displayed.\n\t\t\t */\n\t\t\thint?: string;\n\t\t}\n\t: {\n\t\t\t/**\n\t\t\t * Internal data for this option.\n\t\t\t */\n\t\t\tvalue: Value;\n\t\t\t/**\n\t\t\t * Required. The user-facing text for this option.\n\t\t\t */\n\t\t\tlabel: string;\n\t\t\t/**\n\t\t\t * An optional hint to display to the user when\n\t\t\t * this option might be selected.\n\t\t\t *\n\t\t\t * By default, no `hint` is displayed.\n\t\t\t */\n\t\t\thint?: string;\n\t\t};\n\nexport interface SelectOptions<Value> {\n\tmessage: string;\n\toptions: Option<Value>[];\n\tinitialValue?: Value;\n\tmaxItems?: number;\n}\n\nexport const select = <Value>(opts: SelectOptions<Value>) => {\n\tconst opt = (option: Option<Value>, state: 'inactive' | 'active' | 'selected' | 'cancelled') => {\n\t\tconst label = option.label ?? String(option.value);\n\t\tswitch (state) {\n\t\t\tcase 'selected':\n\t\t\t\treturn `${color.dim(label)}`;\n\t\t\tcase 'active':\n\t\t\t\treturn `${color.green(S_RADIO_ACTIVE)} ${label} ${\n\t\t\t\t\toption.hint ? color.dim(`(${option.hint})`) : ''\n\t\t\t\t}`;\n\t\t\tcase 'cancelled':\n\t\t\t\treturn `${color.strikethrough(color.dim(label))}`;\n\t\t\tdefault:\n\t\t\t\treturn `${color.dim(S_RADIO_INACTIVE)} ${color.dim(label)}`;\n\t\t}\n\t};\n\n\treturn new SelectPrompt({\n\t\toptions: opts.options,\n\t\tinitialValue: opts.initialValue,\n\t\trender() {\n\t\t\tconst title = `${color.gray(S_BAR)}\\n${symbol(this.state)} ${opts.message}\\n`;\n\n\t\t\tswitch (this.state) {\n\t\t\t\tcase 'submit':\n\t\t\t\t\treturn `${title}${color.gray(S_BAR)} ${opt(this.options[this.cursor], 'selected')}`;\n\t\t\t\tcase 'cancel':\n\t\t\t\t\treturn `${title}${color.gray(S_BAR)} ${opt(\n\t\t\t\t\t\tthis.options[this.cursor],\n\t\t\t\t\t\t'cancelled'\n\t\t\t\t\t)}\\n${color.gray(S_BAR)}`;\n\t\t\t\tdefault: {\n\t\t\t\t\treturn `${title}${color.cyan(S_BAR)} ${limitOptions({\n\t\t\t\t\t\tcursor: this.cursor,\n\t\t\t\t\t\toptions: this.options,\n\t\t\t\t\t\tmaxItems: opts.maxItems,\n\t\t\t\t\t\tstyle: (item, active) => opt(item, active ? 'active' : 'inactive'),\n\t\t\t\t\t}).join(`\\n${color.cyan(S_BAR)} `)}\\n${color.cyan(S_BAR_END)}\\n`;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}).prompt() as Promise<Value | symbol>;\n};\n\nexport const selectKey = <Value extends string>(opts: SelectOptions<Value>) => {\n\tconst opt = (\n\t\toption: Option<Value>,\n\t\tstate: 'inactive' | 'active' | 'selected' | 'cancelled' = 'inactive'\n\t) => {\n\t\tconst label = option.label ?? String(option.value);\n\t\tif (state === 'selected') {\n\t\t\treturn `${color.dim(label)}`;\n\t\t}\n\t\tif (state === 'cancelled') {\n\t\t\treturn `${color.strikethrough(color.dim(label))}`;\n\t\t}\n\t\tif (state === 'active') {\n\t\t\treturn `${color.bgCyan(color.gray(` ${option.value} `))} ${label} ${\n\t\t\t\toption.hint ? color.dim(`(${option.hint})`) : ''\n\t\t\t}`;\n\t\t}\n\t\treturn `${color.gray(color.bgWhite(color.inverse(` ${option.value} `)))} ${label} ${\n\t\t\toption.hint ? color.dim(`(${option.hint})`) : ''\n\t\t}`;\n\t};\n\n\treturn new SelectKeyPrompt({\n\t\toptions: opts.options,\n\t\tinitialValue: opts.initialValue,\n\t\trender() {\n\t\t\tconst title = `${color.gray(S_BAR)}\\n${symbol(this.state)} ${opts.message}\\n`;\n\n\t\t\tswitch (this.state) {\n\t\t\t\tcase 'submit':\n\t\t\t\t\treturn `${title}${color.gray(S_BAR)} ${opt(\n\t\t\t\t\t\tthis.options.find((opt) => opt.value === this.value) ?? opts.options[0],\n\t\t\t\t\t\t'selected'\n\t\t\t\t\t)}`;\n\t\t\t\tcase 'cancel':\n\t\t\t\t\treturn `${title}${color.gray(S_BAR)} ${opt(this.options[0], 'cancelled')}\\n${color.gray(\n\t\t\t\t\t\tS_BAR\n\t\t\t\t\t)}`;\n\t\t\t\tdefault: {\n\t\t\t\t\treturn `${title}${color.cyan(S_BAR)} ${this.options\n\t\t\t\t\t\t.map((option, i) => opt(option, i === this.cursor ? 'active' : 'inactive'))\n\t\t\t\t\t\t.join(`\\n${color.cyan(S_BAR)} `)}\\n${color.cyan(S_BAR_END)}\\n`;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}).prompt() as Promise<Value | symbol>;\n};\n\nexport interface MultiSelectOptions<Value> {\n\tmessage: string;\n\toptions: Option<Value>[];\n\tinitialValues?: Value[];\n\tmaxItems?: number;\n\trequired?: boolean;\n\tcursorAt?: Value;\n}\nexport const multiselect = <Value>(opts: MultiSelectOptions<Value>) => {\n\tconst opt = (\n\t\toption: Option<Value>,\n\t\tstate: 'inactive' | 'active' | 'selected' | 'active-selected' | 'submitted' | 'cancelled'\n\t) => {\n\t\tconst label = option.label ?? String(option.value);\n\t\tif (state === 'active') {\n\t\t\treturn `${color.cyan(S_CHECKBOX_ACTIVE)} ${label} ${\n\t\t\t\toption.hint ? color.dim(`(${option.hint})`) : ''\n\t\t\t}`;\n\t\t}\n\t\tif (state === 'selected') {\n\t\t\treturn `${color.green(S_CHECKBOX_SELECTED)} ${color.dim(label)} ${\n\t\t\t\toption.hint ? color.dim(`(${option.hint})`) : ''\n\t\t\t}`;\n\t\t}\n\t\tif (state === 'cancelled') {\n\t\t\treturn `${color.strikethrough(color.dim(label))}`;\n\t\t}\n\t\tif (state === 'active-selected') {\n\t\t\treturn `${color.green(S_CHECKBOX_SELECTED)} ${label} ${\n\t\t\t\toption.hint ? color.dim(`(${option.hint})`) : ''\n\t\t\t}`;\n\t\t}\n\t\tif (state === 'submitted') {\n\t\t\treturn `${color.dim(label)}`;\n\t\t}\n\t\treturn `${color.dim(S_CHECKBOX_INACTIVE)} ${color.dim(label)}`;\n\t};\n\n\treturn new MultiSelectPrompt({\n\t\toptions: opts.options,\n\t\tinitialValues: opts.initialValues,\n\t\trequired: opts.required ?? true,\n\t\tcursorAt: opts.cursorAt,\n\t\tvalidate(selected: Value[]) {\n\t\t\tif (this.required && selected.length === 0)\n\t\t\t\treturn `Please select at least one option.\\n${color.reset(\n\t\t\t\t\tcolor.dim(\n\t\t\t\t\t\t`Press ${color.gray(color.bgWhite(color.inverse(' space ')))} to select, ${color.gray(\n\t\t\t\t\t\t\tcolor.bgWhite(color.inverse(' enter '))\n\t\t\t\t\t\t)} to submit`\n\t\t\t\t\t)\n\t\t\t\t)}`;\n\t\t},\n\t\trender() {\n\t\t\tconst title = `${color.gray(S_BAR)}\\n${symbol(this.state)} ${opts.message}\\n`;\n\n\t\t\tconst styleOption = (option: Option<Value>, active: boolean) => {\n\t\t\t\tconst selected = this.value.includes(option.value);\n\t\t\t\tif (active && selected) {\n\t\t\t\t\treturn opt(option, 'active-selected');\n\t\t\t\t}\n\t\t\t\tif (selected) {\n\t\t\t\t\treturn opt(option, 'selected');\n\t\t\t\t}\n\t\t\t\treturn opt(option, active ? 'active' : 'inactive');\n\t\t\t};\n\n\t\t\tswitch (this.state) {\n\t\t\t\tcase 'submit': {\n\t\t\t\t\treturn `${title}${color.gray(S_BAR)} ${\n\t\t\t\t\t\tthis.options\n\t\t\t\t\t\t\t.filter(({ value }) => this.value.includes(value))\n\t\t\t\t\t\t\t.map((option) => opt(option, 'submitted'))\n\t\t\t\t\t\t\t.join(color.dim(', ')) || color.dim('none')\n\t\t\t\t\t}`;\n\t\t\t\t}\n\t\t\t\tcase 'cancel': {\n\t\t\t\t\tconst label = this.options\n\t\t\t\t\t\t.filter(({ value }) => this.value.includes(value))\n\t\t\t\t\t\t.map((option) => opt(option, 'cancelled'))\n\t\t\t\t\t\t.join(color.dim(', '));\n\t\t\t\t\treturn `${title}${color.gray(S_BAR)} ${\n\t\t\t\t\t\tlabel.trim() ? `${label}\\n${color.gray(S_BAR)}` : ''\n\t\t\t\t\t}`;\n\t\t\t\t}\n\t\t\t\tcase 'error': {\n\t\t\t\t\tconst footer = this.error\n\t\t\t\t\t\t.split('\\n')\n\t\t\t\t\t\t.map((ln, i) =>\n\t\t\t\t\t\t\ti === 0 ? `${color.yellow(S_BAR_END)} ${color.yellow(ln)}` : ` ${ln}`\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join('\\n');\n\t\t\t\t\treturn `${title + color.yellow(S_BAR)} ${limitOptions({\n\t\t\t\t\t\toptions: this.options,\n\t\t\t\t\t\tcursor: this.cursor,\n\t\t\t\t\t\tmaxItems: opts.maxItems,\n\t\t\t\t\t\tstyle: styleOption,\n\t\t\t\t\t}).join(`\\n${color.yellow(S_BAR)} `)}\\n${footer}\\n`;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\treturn `${title}${color.cyan(S_BAR)} ${limitOptions({\n\t\t\t\t\t\toptions: this.options,\n\t\t\t\t\t\tcursor: this.cursor,\n\t\t\t\t\t\tmaxItems: opts.maxItems,\n\t\t\t\t\t\tstyle: styleOption,\n\t\t\t\t\t}).join(`\\n${color.cyan(S_BAR)} `)}\\n${color.cyan(S_BAR_END)}\\n`;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}).prompt() as Promise<Value[] | symbol>;\n};\n\nexport interface GroupMultiSelectOptions<Value> {\n\tmessage: string;\n\toptions: Record<string, Option<Value>[]>;\n\tinitialValues?: Value[];\n\trequired?: boolean;\n\tcursorAt?: Value;\n\tselectableGroups?: boolean;\n}\nexport const groupMultiselect = <Value>(opts: GroupMultiSelectOptions<Value>) => {\n\tconst { selectableGroups = true } = opts;\n\tconst opt = (\n\t\toption: Option<Value>,\n\t\tstate:\n\t\t\t| 'inactive'\n\t\t\t| 'active'\n\t\t\t| 'selected'\n\t\t\t| 'active-selected'\n\t\t\t| 'group-active'\n\t\t\t| 'group-active-selected'\n\t\t\t| 'submitted'\n\t\t\t| 'cancelled',\n\t\toptions: Option<Value>[] = []\n\t) => {\n\t\tconst label = option.label ?? String(option.value);\n\t\tconst isItem = typeof (option as any).group === 'string';\n\t\tconst next = isItem && (options[options.indexOf(option) + 1] ?? { group: true });\n\t\tconst isLast = isItem && (next as any).group === true;\n\t\tconst prefix = isItem ? (selectableGroups ? `${isLast ? S_BAR_END : S_BAR} ` : ' ') : '';\n\n\t\tif (state === 'active') {\n\t\t\treturn `${color.dim(prefix)}${color.cyan(S_CHECKBOX_ACTIVE)} ${label} ${\n\t\t\t\toption.hint ? color.dim(`(${option.hint})`) : ''\n\t\t\t}`;\n\t\t}\n\t\tif (state === 'group-active') {\n\t\t\treturn `${prefix}${color.cyan(S_CHECKBOX_ACTIVE)} ${color.dim(label)}`;\n\t\t}\n\t\tif (state === 'group-active-selected') {\n\t\t\treturn `${prefix}${color.green(S_CHECKBOX_SELECTED)} ${color.dim(label)}`;\n\t\t}\n\t\tif (state === 'selected') {\n\t\t\tconst selectedCheckbox = isItem || selectableGroups ? color.green(S_CHECKBOX_SELECTED) : '';\n\t\t\treturn `${color.dim(prefix)}${selectedCheckbox} ${color.dim(label)} ${\n\t\t\t\toption.hint ? color.dim(`(${option.hint})`) : ''\n\t\t\t}`;\n\t\t}\n\t\tif (state === 'cancelled') {\n\t\t\treturn `${color.strikethrough(color.dim(label))}`;\n\t\t}\n\t\tif (state === 'active-selected') {\n\t\t\treturn `${color.dim(prefix)}${color.green(S_CHECKBOX_SELECTED)} ${label} ${\n\t\t\t\toption.hint ? color.dim(`(${option.hint})`) : ''\n\t\t\t}`;\n\t\t}\n\t\tif (state === 'submitted') {\n\t\t\treturn `${color.dim(label)}`;\n\t\t}\n\t\tconst unselectedCheckbox = isItem || selectableGroups ? color.dim(S_CHECKBOX_INACTIVE) : '';\n\t\treturn `${color.dim(prefix)}${unselectedCheckbox} ${color.dim(label)}`;\n\t};\n\n\treturn new GroupMultiSelectPrompt({\n\t\toptions: opts.options,\n\t\tinitialValues: opts.initialValues,\n\t\trequired: opts.required ?? true,\n\t\tcursorAt: opts.cursorAt,\n\t\tselectableGroups,\n\t\tvalidate(selected: Value[]) {\n\t\t\tif (this.required && selected.length === 0)\n\t\t\t\treturn `Please select at least one option.\\n${color.reset(\n\t\t\t\t\tcolor.dim(\n\t\t\t\t\t\t`Press ${color.gray(color.bgWhite(color.inverse(' space ')))} to select, ${color.gray(\n\t\t\t\t\t\t\tcolor.bgWhite(color.inverse(' enter '))\n\t\t\t\t\t\t)} to submit`\n\t\t\t\t\t)\n\t\t\t\t)}`;\n\t\t},\n\t\trender() {\n\t\t\tconst title = `${color.gray(S_BAR)}\\n${symbol(this.state)} ${opts.message}\\n`;\n\n\t\t\tswitch (this.state) {\n\t\t\t\tcase 'submit': {\n\t\t\t\t\treturn `${title}${color.gray(S_BAR)} ${this.options\n\t\t\t\t\t\t.filter(({ value }) => this.value.includes(value))\n\t\t\t\t\t\t.map((option) => opt(option, 'submitted'))\n\t\t\t\t\t\t.join(color.dim(', '))}`;\n\t\t\t\t}\n\t\t\t\tcase 'cancel': {\n\t\t\t\t\tconst label = this.options\n\t\t\t\t\t\t.filter(({ value }) => this.value.includes(value))\n\t\t\t\t\t\t.map((option) => opt(option, 'cancelled'))\n\t\t\t\t\t\t.join(color.dim(', '));\n\t\t\t\t\treturn `${title}${color.gray(S_BAR)} ${\n\t\t\t\t\t\tlabel.trim() ? `${label}\\n${color.gray(S_BAR)}` : ''\n\t\t\t\t\t}`;\n\t\t\t\t}\n\t\t\t\tcase 'error': {\n\t\t\t\t\tconst footer = this.error\n\t\t\t\t\t\t.split('\\n')\n\t\t\t\t\t\t.map((ln, i) =>\n\t\t\t\t\t\t\ti === 0 ? `${color.yellow(S_BAR_END)} ${color.yellow(ln)}` : ` ${ln}`\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.join('\\n');\n\t\t\t\t\treturn `${title}${color.yellow(S_BAR)} ${this.options\n\t\t\t\t\t\t.map((option, i, options) => {\n\t\t\t\t\t\t\tconst selected =\n\t\t\t\t\t\t\t\tthis.value.includes(option.value) ||\n\t\t\t\t\t\t\t\t(option.group === true && this.isGroupSelected(`${option.value}`));\n\t\t\t\t\t\t\tconst active = i === this.cursor;\n\t\t\t\t\t\t\tconst groupActive =\n\t\t\t\t\t\t\t\t!active &&\n\t\t\t\t\t\t\t\ttypeof option.group === 'string' &&\n\t\t\t\t\t\t\t\tthis.options[this.cursor].value === option.group;\n\t\t\t\t\t\t\tif (groupActive) {\n\t\t\t\t\t\t\t\treturn opt(option, selected ? 'group-active-selected' : 'group-active', options);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (active && selected) {\n\t\t\t\t\t\t\t\treturn opt(option, 'active-selected', options);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (selected) {\n\t\t\t\t\t\t\t\treturn opt(option, 'selected', options);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn opt(option, active ? 'active' : 'inactive', options);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join(`\\n${color.yellow(S_BAR)} `)}\\n${footer}\\n`;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\treturn `${title}${color.cyan(S_BAR)} ${this.options\n\t\t\t\t\t\t.map((option, i, options) => {\n\t\t\t\t\t\t\tconst selected =\n\t\t\t\t\t\t\t\tthis.value.includes(option.value) ||\n\t\t\t\t\t\t\t\t(option.group === true && this.isGroupSelected(`${option.value}`));\n\t\t\t\t\t\t\tconst active = i === this.cursor;\n\t\t\t\t\t\t\tconst groupActive =\n\t\t\t\t\t\t\t\t!active &&\n\t\t\t\t\t\t\t\ttypeof option.group === 'string' &&\n\t\t\t\t\t\t\t\tthis.options[this.cursor].value === option.group;\n\t\t\t\t\t\t\tif (groupActive) {\n\t\t\t\t\t\t\t\treturn opt(option, selected ? 'group-active-selected' : 'group-active', options);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (active && selected) {\n\t\t\t\t\t\t\t\treturn opt(option, 'active-selected', options);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (selected) {\n\t\t\t\t\t\t\t\treturn opt(option, 'selected', options);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn opt(option, active ? 'active' : 'inactive', options);\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join(`\\n${color.cyan(S_BAR)} `)}\\n${color.cyan(S_BAR_END)}\\n`;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t}).prompt() as Promise<Value[] | symbol>;\n};\n\nexport const note = (message = '', title = '') => {\n\tconst lines = `\\n${message}\\n`.split('\\n');\n\tconst titleLen = strip(title).length;\n\tconst len =\n\t\tMath.max(\n\t\t\tlines.reduce((sum, ln) => {\n\t\t\t\tconst line = strip(ln);\n\t\t\t\treturn line.length > sum ? line.length : sum;\n\t\t\t}, 0),\n\t\t\ttitleLen\n\t\t) + 2;\n\tconst msg = lines\n\t\t.map(\n\t\t\t(ln) =>\n\t\t\t\t`${color.gray(S_BAR)} ${color.dim(ln)}${' '.repeat(len - strip(ln).length)}${color.gray(\n\t\t\t\t\tS_BAR\n\t\t\t\t)}`\n\t\t)\n\t\t.join('\\n');\n\tprocess.stdout.write(\n\t\t`${color.gray(S_BAR)}\\n${color.green(S_STEP_SUBMIT)} ${color.reset(title)} ${color.gray(\n\t\t\tS_BAR_H.repeat(Math.max(len - titleLen - 1, 1)) + S_CORNER_TOP_RIGHT\n\t\t)}\\n${msg}\\n${color.gray(S_CONNECT_LEFT + S_BAR_H.repeat(len + 2) + S_CORNER_BOTTOM_RIGHT)}\\n`\n\t);\n};\n\nexport const cancel = (message = '') => {\n\tprocess.stdout.write(`${color.gray(S_BAR_END)} ${color.red(message)}\\n\\n`);\n};\n\nexport const intro = (title = '') => {\n\tprocess.stdout.write(`${color.gray(S_BAR_START)} ${title}\\n`);\n};\n\nexport const outro = (message = '') => {\n\tprocess.stdout.write(`${color.gray(S_BAR)}\\n${color.gray(S_BAR_END)} ${message}\\n\\n`);\n};\n\nexport type LogMessageOptions = {\n\tsymbol?: string;\n};\nexport const log = {\n\tmessage: (message = '', { symbol = color.gray(S_BAR) }: LogMessageOptions = {}) => {\n\t\tconst parts = [`${color.gray(S_BAR)}`];\n\t\tif (message) {\n\t\t\tconst [firstLine, ...lines] = message.split('\\n');\n\t\t\tparts.push(`${symbol} ${firstLine}`, ...lines.map((ln) => `${color.gray(S_BAR)} ${ln}`));\n\t\t}\n\t\tprocess.stdout.write(`${parts.join('\\n')}\\n`);\n\t},\n\tinfo: (message: string) => {\n\t\tlog.message(message, { symbol: color.blue(S_INFO) });\n\t},\n\tsuccess: (message: string) => {\n\t\tlog.message(message, { symbol: color.green(S_SUCCESS) });\n\t},\n\tstep: (message: string) => {\n\t\tlog.message(message, { symbol: color.green(S_STEP_SUBMIT) });\n\t},\n\twarn: (message: string) => {\n\t\tlog.message(message, { symbol: color.yellow(S_WARN) });\n\t},\n\t/** alias for `log.warn()`. */\n\twarning: (message: string) => {\n\t\tlog.warn(message);\n\t},\n\terror: (message: string) => {\n\t\tlog.message(message, { symbol: color.red(S_ERROR) });\n\t},\n};\n\nconst prefix = `${color.gray(S_BAR)} `;\nexport const stream = {\n\tmessage: async (\n\t\titerable: Iterable<string> | AsyncIterable<string>,\n\t\t{ symbol = color.gray(S_BAR) }: LogMessageOptions = {}\n\t) => {\n\t\tprocess.stdout.write(`${color.gray(S_BAR)}\\n${symbol} `);\n\t\tlet lineWidth = 3;\n\t\tfor await (let chunk of iterable) {\n\t\t\tchunk = chunk.replace(/\\n/g, `\\n${prefix}`);\n\t\t\tif (chunk.includes('\\n')) {\n\t\t\t\tlineWidth = 3 + strip(chunk.slice(chunk.lastIndexOf('\\n'))).length;\n\t\t\t}\n\t\t\tconst chunkLen = strip(chunk).length;\n\t\t\tif (lineWidth + chunkLen < process.stdout.columns) {\n\t\t\t\tlineWidth += chunkLen;\n\t\t\t\tprocess.stdout.write(chunk);\n\t\t\t} else {\n\t\t\t\tprocess.stdout.write(`\\n${prefix}${chunk.trimStart()}`);\n\t\t\t\tlineWidth = 3 + strip(chunk.trimStart()).length;\n\t\t\t}\n\t\t}\n\t\tprocess.stdout.write('\\n');\n\t},\n\tinfo: (iterable: Iterable<string> | AsyncIterable<string>) => {\n\t\treturn stream.message(iterable, { symbol: color.blue(S_INFO) });\n\t},\n\tsuccess: (iterable: Iterable<string> | AsyncIterable<string>) => {\n\t\treturn stream.message(iterable, { symbol: color.green(S_SUCCESS) });\n\t},\n\tstep: (iterable: Iterable<string> | AsyncIterable<string>) => {\n\t\treturn stream.message(iterable, { symbol: color.green(S_STEP_SUBMIT) });\n\t},\n\twarn: (iterable: Iterable<string> | AsyncIterable<string>) => {\n\t\treturn stream.message(iterable, { symbol: color.yellow(S_WARN) });\n\t},\n\t/** alias for `log.warn()`. */\n\twarning: (iterable: Iterable<string> | AsyncIterable<string>) => {\n\t\treturn stream.warn(iterable);\n\t},\n\terror: (iterable: Iterable<string> | AsyncIterable<string>) => {\n\t\treturn stream.message(iterable, { symbol: color.red(S_ERROR) });\n\t},\n};\n\nexport interface SpinnerOptions {\n\tindicator?: 'dots' | 'timer';\n}\n\nexport const spinner = ({ indicator = 'dots' }: SpinnerOptions = {}) => {\n\tconst frames = unicode ? ['◒', '◐', '◓', '◑'] : ['•', 'o', 'O', '0'];\n\tconst delay = unicode ? 80 : 120;\n\tconst isCI = process.env.CI === 'true';\n\n\tlet unblock: () => void;\n\tlet loop: NodeJS.Timeout;\n\tlet isSpinnerActive = false;\n\tlet _message = '';\n\tlet _prevMessage: string | undefined = undefined;\n\tlet _origin: number = performance.now();\n\n\tconst handleExit = (code: number) => {\n\t\tconst msg = code > 1 ? 'Something went wrong' : 'Canceled';\n\t\tif (isSpinnerActive) stop(msg, code);\n\t};\n\n\tconst errorEventHandler = () => handleExit(2);\n\tconst signalEventHandler = () => handleExit(1);\n\n\tconst registerHooks = () => {\n\t\t// Reference: https://nodejs.org/api/process.html#event-uncaughtexception\n\t\tprocess.on('uncaughtExceptionMonitor', errorEventHandler);\n\t\t// Reference: https://nodejs.org/api/process.html#event-unhandledrejection\n\t\tprocess.on('unhandledRejection', errorEventHandler);\n\t\t// Reference Signal Events: https://nodejs.org/api/process.html#signal-events\n\t\tprocess.on('SIGINT', signalEventHandler);\n\t\tprocess.on('SIGTERM', signalEventHandler);\n\t\tprocess.on('exit', handleExit);\n\t};\n\n\tconst clearHooks = () => {\n\t\tprocess.removeListener('uncaughtExceptionMonitor', errorEventHandler);\n\t\tprocess.removeListener('unhandledRejection', errorEventHandler);\n\t\tprocess.removeListener('SIGINT', signalEventHandler);\n\t\tprocess.removeListener('SIGTERM', signalEventHandler);\n\t\tprocess.removeListener('exit', handleExit);\n\t};\n\n\tconst clearPrevMessage = () => {\n\t\tif (_prevMessage === undefined) return;\n\t\tif (isCI) process.stdout.write('\\n');\n\t\tconst prevLines = _prevMessage.split('\\n');\n\t\tprocess.stdout.write(cursor.move(-999, prevLines.length - 1));\n\t\tprocess.stdout.write(erase.down(prevLines.length));\n\t};\n\n\tconst parseMessage = (msg: string): string => {\n\t\treturn msg.replace(/\\.+$/, '');\n\t};\n\n\tconst formatTimer = (origin: number): string => {\n\t\tconst duration = (performance.now() - origin) / 1000;\n\t\tconst min = Math.floor(duration / 60);\n\t\tconst secs = Math.floor(duration % 60);\n\t\treturn min > 0 ? `[${min}m ${secs}s]` : `[${secs}s]`;\n\t};\n\n\tconst start = (msg = ''): void => {\n\t\tisSpinnerActive = true;\n\t\tunblock = block();\n\t\t_message = parseMessage(msg);\n\t\t_origin = performance.now();\n\t\tprocess.stdout.write(`${color.gray(S_BAR)}\\n`);\n\t\tlet frameIndex = 0;\n\t\tlet indicatorTimer = 0;\n\t\tregisterHooks();\n\t\tloop = setInterval(() => {\n\t\t\tif (isCI && _message === _prevMessage) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tclearPrevMessage();\n\t\t\t_prevMessage = _message;\n\t\t\tconst frame = color.magenta(frames[frameIndex]);\n\n\t\t\tif (isCI) {\n\t\t\t\tprocess.stdout.write(`${frame} ${_message}...`);\n\t\t\t} else if (indicator === 'timer') {\n\t\t\t\tprocess.stdout.write(`${frame} ${_message} ${formatTimer(_origin)}`);\n\t\t\t} else {\n\t\t\t\tconst loadingDots = '.'.repeat(Math.floor(indicatorTimer)).slice(0, 3);\n\t\t\t\tprocess.stdout.write(`${frame} ${_message}${loadingDots}`);\n\t\t\t}\n\n\t\t\tframeIndex = frameIndex + 1 < frames.length ? frameIndex + 1 : 0;\n\t\t\tindicatorTimer = indicatorTimer < frames.length ? indicatorTimer + 0.125 : 0;\n\t\t}, delay);\n\t};\n\n\tconst stop = (msg = '', code = 0): void => {\n\t\tisSpinnerActive = false;\n\t\tclearInterval(loop);\n\t\tclearPrevMessage();\n\t\tconst step =\n\t\t\tcode === 0\n\t\t\t\t? color.green(S_STEP_SUBMIT)\n\t\t\t\t: code === 1\n\t\t\t\t\t? color.red(S_STEP_CANCEL)\n\t\t\t\t\t: color.red(S_STEP_ERROR);\n\t\t_message = parseMessage(msg ?? _message);\n\t\tif (indicator === 'timer') {\n\t\t\tprocess.stdout.write(`${step} ${_message} ${formatTimer(_origin)}\\n`);\n\t\t} else {\n\t\t\tprocess.stdout.write(`${step} ${_message}\\n`);\n\t\t}\n\t\tclearHooks();\n\t\tunblock();\n\t};\n\n\tconst message = (msg = ''): void => {\n\t\t_message = parseMessage(msg ?? _message);\n\t};\n\n\treturn {\n\t\tstart,\n\t\tstop,\n\t\tmessage,\n\t};\n};\n\nexport type PromptGroupAwaitedReturn<T> = {\n\t[P in keyof T]: Exclude<Awaited<T[P]>, symbol>;\n};\n\nexport interface PromptGroupOptions<T> {\n\t/**\n\t * Control how the group can be canceled\n\t * if one of the prompts is canceled.\n\t */\n\tonCancel?: (opts: { results: Prettify<Partial<PromptGroupAwaitedReturn<T>>> }) => void;\n}\n\ntype Prettify<T> = {\n\t[P in keyof T]: T[P];\n} & {};\n\nexport type PromptGroup<T> = {\n\t[P in keyof T]: (opts: {\n\t\tresults: Prettify<Partial<PromptGroupAwaitedReturn<Omit<T, P>>>>;\n\t}) => undefined | Promise<T[P] | undefined>;\n};\n\n/**\n * Define a group of prompts to be displayed\n * and return a results of objects within the group\n */\nexport const group = async <T>(\n\tprompts: PromptGroup<T>,\n\topts?: PromptGroupOptions<T>\n): Promise<Prettify<PromptGroupAwaitedReturn<T>>> => {\n\tconst results = {} as any;\n\tconst promptNames = Object.keys(prompts);\n\n\tfor (const name of promptNames) {\n\t\tconst prompt = prompts[name as keyof T];\n\t\tconst result = await prompt({ results })?.catch((e) => {\n\t\t\tthrow e;\n\t\t});\n\n\t\t// Pass the results to the onCancel function\n\t\t// so the user can decide what to do with the results\n\t\t// TODO: Switch to callback within core to avoid isCancel Fn\n\t\tif (typeof opts?.onCancel === 'function' && isCancel(result)) {\n\t\t\tresults[name] = 'canceled';\n\t\t\topts.onCancel({ results });\n\t\t\tcontinue;\n\t\t}\n\n\t\tresults[name] = result;\n\t}\n\n\treturn results;\n};\n\nexport type Task = {\n\t/**\n\t * Task title\n\t */\n\ttitle: string;\n\t/**\n\t * Task function\n\t */\n\ttask: (message: (string: string) => void) => string | Promise<string> | void | Promise<void>;\n\n\t/**\n\t * If enabled === false the task will be skipped\n\t */\n\tenabled?: boolean;\n};\n\n/**\n * Define a group of tasks to be executed\n */\nexport const tasks = async (tasks: Task[]) => {\n\tfor (const task of tasks) {\n\t\tif (task.enabled === false) continue;\n\n\t\tconst s = spinner();\n\t\ts.start(task.title);\n\t\tconst result = await task.task(s.message);\n\t\ts.stop(result || task.title);\n\t}\n};\n", "import type { Gap } from '../../../src/station/types';\nimport {\n PUBLIC_AUDIT_COMMAND,\n PUBLIC_CLEAN_PLAN_COMMAND,\n PUBLIC_COMMAND,\n} from './contracts/commands';\nimport type { CliScanArtifact } from './types';\n\nfunction compact(value: unknown): string {\n return String(value ?? '').replace(/\\s+/g, ' ').trim();\n}\n\nfunction originalHint(gap: Gap): string {\n const hint = compact(gap.copyPrompt);\n return hint ? hint : 'No scanner hint was returned for this gap.';\n}\n\nexport function buildAgentFixPrompt(artifact: CliScanArtifact, gap: Gap): string {\n const affected = [gap.primaryMapCategory, ...(gap.affectedMapCategories ?? [])]\n .filter(Boolean)\n .filter((value, index, all) => all.indexOf(value) === index)\n .join(', ');\n\n return [\n 'You are an AI coding agent using VibeRaven as the production-readiness map.',\n '',\n 'Goal: turn this demo/MVP into a more production-ready app by fixing one repo-code gap at a time.',\n '',\n `Project: ${artifact.workspacePath}`,\n `Current VibeRaven state: production core ${artifact.productionCorePercent}% | score ${artifact.score} (${artifact.scoreLabel})`,\n `Gap: ${gap.title}`,\n `Gap id: ${gap.id}`,\n `Severity: ${gap.severity}`,\n `Production area: ${gap.primaryMapCategory}${affected ? ` | affected: ${affected}` : ''}`,\n `Scanner detail: ${compact(gap.detail)}`,\n '',\n 'Required workflow:',\n '1. Read `.viberaven/agent-summary.md` and `.viberaven/launch-playbook.md` before changing code.',\n '2. If VibeRaven prints LOGIN_URL_READY, open that URL for the user using the available browser tool or system browser. Tell the user: \"I opened VibeRaven sign-in so you can approve access; I will continue after approval.\" Do not ask for passwords, tokens, cookies, or secrets.',\n '3. If the browser cannot open automatically, use the printed LOGIN_URL_READY URL. Keep the terminal process alive while the user approves.',\n '4. Inspect the real implementation files. Do not assume framework/provider wiring from package names alone.',\n '5. Make the smallest durable repo-code change that addresses this specific gap.',\n '6. Keep provider dashboard work separate. Open provider dashboards only when VibeRaven asks for a provider/manual action, and explain why you opened them.',\n `7. For Vercel + Supabase apps, run \\`${PUBLIC_AUDIT_COMMAND}\\` before claiming production readiness.`,\n '8. Treat that audit as local repo evidence only; do not claim provider dashboard settings are fixed unless the user verifies them or read-only provider MCP confirms them.',\n '9. Do not claim provider dashboard or read-only MCP checks as repo-code fixes.',\n `10. VibeRaven cleanup is non-destructive. You may run \\`${PUBLIC_CLEAN_PLAN_COMMAND}\\` only to create a reviewable context cleanup plan, not to delete code.`,\n '',\n 'Implementation constraints:',\n '- Prefer the existing stack and local patterns already in the repo.',\n '- Do not add a new auth, database, payment, monitoring, or deployment provider unless the scan/playbook explicitly asks for that migration.',\n '- Do not expose secrets, create fake env values, or mark live-provider proof complete without user/provider confirmation.',\n '- Keep the change scoped to this gap; leave unrelated refactors alone.',\n '',\n 'Verification:',\n '- Run the relevant local tests, typecheck, lint, or build command for the touched area.',\n `- Run \\`${PUBLIC_COMMAND}\\` again. In an agent/non-interactive shell this should rescan and refresh \\`.viberaven/\\` artifacts.`,\n '- Report what changed, what verification passed, and which VibeRaven gap remains next.',\n '',\n 'Original scanner hint:',\n originalHint(gap)\n ].join('\\n');\n}\n", "export const VERSION = '1.1.11';\n", "import pc from 'picocolors';\r\nimport { loadPlaybook, listPlaybookProviders } from '../playbooks/loadPlaybook';\r\nimport type { PlaybookStep } from '../playbooks/types';\r\n\r\nexport interface GuideCommandOptions {\r\n provider: string;\r\n step?: number;\r\n json?: boolean;\r\n}\r\n\r\nfunction formatPasteTarget(step: PlaybookStep): string | undefined {\r\n if (!step.pasteTarget) {\r\n return undefined;\r\n }\r\n return `${step.pasteTarget.file} \u2192 ${step.pasteTarget.keys.join(', ')}`;\r\n}\r\n\r\nexport async function runGuideCommand(options: GuideCommandOptions): Promise<number> {\r\n let playbook;\r\n try {\r\n playbook = await loadPlaybook(options.provider);\r\n } catch (error) {\r\n console.error(error instanceof Error ? error.message : String(error));\r\n console.error(`Available providers: ${listPlaybookProviders().join(', ')}`);\r\n return 1;\r\n }\r\n\r\n const total = playbook.steps.length;\r\n const stepIndex = Math.min(Math.max((options.step ?? 1) - 1, 0), total - 1);\r\n const step = playbook.steps[stepIndex];\r\n\r\n if (options.json) {\r\n console.log(\r\n JSON.stringify(\r\n {\r\n provider: playbook.provider,\r\n step: stepIndex + 1,\r\n total,\r\n id: step.id,\r\n title: step.title,\r\n instruction: step.instruction,\r\n openUrl: step.openUrl ?? null,\r\n copyValues: step.copyValues ?? [],\r\n pasteTarget: step.pasteTarget ?? null,\r\n events: step.events ?? []\r\n },\r\n null,\r\n 2\r\n )\r\n );\r\n return 0;\r\n }\r\n\r\n console.log('');\r\n console.log(pc.bold(`Step ${stepIndex + 1}/${total} \u2014 ${step.title}`));\r\n console.log(pc.dim('\u2500'.repeat(Math.max(24, step.title.length + 8))));\r\n console.log(step.instruction);\r\n if (step.events?.length) {\r\n console.log('');\r\n console.log(pc.bold('Events:'));\r\n for (const event of step.events) {\r\n console.log(` \u2022 ${event}`);\r\n }\r\n }\r\n const paste = formatPasteTarget(step);\r\n if (paste) {\r\n console.log('');\r\n console.log(pc.bold('Paste target:'), paste);\r\n }\r\n if (step.openUrl) {\r\n console.log('');\r\n console.log(pc.bold('Open:'), `viberaven open ${playbook.provider}`);\r\n console.log(pc.dim(step.openUrl));\r\n }\r\n console.log('');\r\n return 0;\r\n}\r\n", "import { readdir, readFile, stat } from 'node:fs/promises';\nimport { join, relative } from 'node:path';\n\nexport type AuditInputFile = {\n path: string;\n content: string;\n};\n\nexport type VercelSupabaseAuditInput = {\n projectRoot: string;\n files: AuditInputFile[];\n};\n\nexport type VercelSupabaseAuditCheck = {\n id:\n | 'supabase-rls-policy-proof'\n | 'supabase-rls-policy-quality'\n | 'supabase-view-security-invoker'\n | 'supabase-security-definer-boundary'\n | 'supabase-service-role-boundary'\n | 'vercel-supabase-pooler-port';\n title: string;\n status: 'pass' | 'needs_work';\n summary: string;\n evidence: string[];\n};\n\nexport type VercelSupabaseAuditResult = {\n status: 'pass' | 'needs_work';\n summary: string;\n checks: VercelSupabaseAuditCheck[];\n};\n\nconst ENV_FILES = [\n '.env',\n '.env.local',\n '.env.development',\n '.env.production',\n '.env.example',\n '.env.sample',\n 'vercel.json'\n];\n\nconst SQL_ROOTS = ['supabase', 'migrations', 'db', 'database'];\nconst SKIP_DIRS = new Set(['.git', 'node_modules', '.next', 'dist', 'build', 'coverage']);\nconst SENSITIVE_ENV_KEY = /\\b[A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|SERVICE_ROLE|DATABASE_URL|POSTGRES_URL)[A-Z0-9_]*\\b/i;\n\nfunction evidencePort(line: string): string {\n const match = line.match(/:(5432|6543)\\b/);\n return match ? ` (:${match[1]})` : '';\n}\n\nfunction redactEvidenceLine(line: string): string {\n const envMatch = line.match(/^\\s*([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|SERVICE_ROLE|DATABASE_URL|POSTGRES_URL)[A-Z0-9_]*)\\s*[:=]/i);\n if (envMatch || SENSITIVE_ENV_KEY.test(line)) {\n const key = envMatch?.[1] ?? line.match(SENSITIVE_ENV_KEY)?.[0] ?? '<sensitive>';\n return `${key}=<redacted>${evidencePort(line)}`;\n }\n\n return line.replace(/\\bpostgres(?:ql)?:\\/\\/[^@\\s]+@/gi, (match) => {\n const protocol = match.startsWith('postgresql://') ? 'postgresql://' : 'postgres://';\n return `${protocol}<redacted>@`;\n });\n}\n\nfunction lineEvidence(file: AuditInputFile, pattern: RegExp): string[] {\n return file.content\n .split(/\\r?\\n/)\n .map((line, index) => ({ line: line.trim(), lineNumber: index + 1 }))\n .filter(({ line }) => pattern.test(line))\n .map(({ line, lineNumber }) => `${file.path}:${lineNumber}: ${redactEvidenceLine(line)}`);\n}\n\nfunction lineNumberAt(content: string, index: number): number {\n return content.slice(0, index).split(/\\r?\\n/).length;\n}\n\nfunction statementEvidence(file: AuditInputFile, pattern: RegExp): string[] {\n const evidence: string[] = [];\n for (const match of file.content.matchAll(pattern)) {\n evidence.push(\n `${file.path}:${lineNumberAt(file.content, match.index ?? 0)}: ${redactEvidenceLine(\n String(match[0]).replace(/\\s+/g, ' ').trim()\n )}`\n );\n }\n return evidence;\n}\n\nfunction normalizeIdent(value: string | undefined): string {\n return (value ?? '').replace(/^\"|\"$/g, '').toLowerCase();\n}\n\nfunction canonicalPublicTable(schema: string | undefined, table: string): string | undefined {\n const normalizedSchema = normalizeIdent(schema);\n if (normalizedSchema && normalizedSchema !== 'public') {\n return undefined;\n }\n return `public.${normalizeIdent(table)}`;\n}\n\nfunction parseRelationRef(ref: string): string | undefined {\n const parts = ref.split('.').map((part) => normalizeIdent(part.trim()));\n if (parts.length === 1) {\n return `public.${parts[0]}`;\n }\n if (parts.length === 2 && parts[0] === 'public') {\n return `public.${parts[1]}`;\n }\n return undefined;\n}\n\ntype RelationEvidence = {\n relation: string;\n evidence: string;\n};\n\nfunction relationEvidence(files: AuditInputFile[], pattern: RegExp, relationGroup = 'relation'): RelationEvidence[] {\n const evidence: RelationEvidence[] = [];\n for (const file of files) {\n for (const match of file.content.matchAll(pattern)) {\n const groups = match.groups ?? {};\n const relation = parseRelationRef(String(groups[relationGroup] ?? ''));\n if (!relation) {\n continue;\n }\n evidence.push({\n relation,\n evidence: `${file.path}:${lineNumberAt(file.content, match.index ?? 0)}: ${redactEvidenceLine(\n String(match[0]).replace(/\\s+/g, ' ').trim()\n )}`\n });\n }\n }\n return evidence;\n}\n\nfunction sqlFiles(files: AuditInputFile[]): AuditInputFile[] {\n return files.filter((file) => file.path.toLowerCase().endsWith('.sql'));\n}\n\nfunction buildRlsCheck(files: AuditInputFile[]): VercelSupabaseAuditCheck {\n const sql = sqlFiles(files);\n const createdTables: RelationEvidence[] = [];\n for (const file of sql) {\n const pattern =\n /\\bcreate\\s+table\\s+(?:if\\s+not\\s+exists\\s+)?(?:(?<schema>\"?[A-Za-z_][\\w$]*\"?)\\.)?(?<table>\"?[A-Za-z_][\\w$]*\"?)/gi;\n for (const match of file.content.matchAll(pattern)) {\n const relation = canonicalPublicTable(match.groups?.schema, String(match.groups?.table ?? ''));\n if (!relation) {\n continue;\n }\n createdTables.push({\n relation,\n evidence: `${file.path}:${lineNumberAt(file.content, match.index ?? 0)}: ${redactEvidenceLine(\n String(match[0]).replace(/\\s+/g, ' ').trim()\n )}`\n });\n }\n }\n const enabledTables = new Set(\n relationEvidence(\n sql,\n /\\balter\\s+table\\s+(?:if\\s+exists\\s+)?(?:only\\s+)?(?<relation>(?:\"?[A-Za-z_][\\w$]*\"?\\.)?\"?[A-Za-z_][\\w$]*\"?)\\s+enable\\s+row\\s+level\\s+security\\b/gi\n ).map((item) => item.relation)\n );\n const policyTables = new Set(\n relationEvidence(\n sql,\n /\\bcreate\\s+policy\\b[\\s\\S]*?\\bon\\s+(?<relation>(?:\"?[A-Za-z_][\\w$]*\"?\\.)?\"?[A-Za-z_][\\w$]*\"?)[\\s\\S]*?;/gi\n ).map((item) => item.relation)\n );\n const rlsEvidence = sql.flatMap((file) => lineEvidence(file, /\\benable\\s+row\\s+level\\s+security\\b/i));\n const policyEvidence = sql.flatMap((file) => lineEvidence(file, /\\bcreate\\s+policy\\b/i));\n const missingTableEvidence = createdTables\n .filter(({ relation }) => !enabledTables.has(relation) || !policyTables.has(relation))\n .map(({ relation, evidence }) => `Missing RLS/policy coverage for ${relation}; created at ${evidence}`);\n const status =\n createdTables.length > 0\n ? missingTableEvidence.length === 0\n ? 'pass'\n : 'needs_work'\n : rlsEvidence.length > 0 && policyEvidence.length > 0\n ? 'pass'\n : 'needs_work';\n\n return {\n id: 'supabase-rls-policy-proof',\n title: 'Supabase RLS policy proof',\n status,\n summary:\n status === 'pass'\n ? createdTables.length > 0\n ? 'Found table-level SQL evidence for row level security and matching policies on public tables.'\n : 'Found SQL evidence for row level security and at least one policy.'\n : missingTableEvidence.length > 0\n ? `Missing table-level RLS or policy evidence: ${missingTableEvidence.map((item) => item.match(/for ([^;]+)/)?.[1] ?? item).join(', ')}.`\n : 'Missing SQL evidence for both `enable row level security` and `create policy`.',\n evidence: [...missingTableEvidence.slice(0, 5), ...rlsEvidence.slice(0, 5), ...policyEvidence.slice(0, 5)]\n };\n}\n\nfunction buildRlsPolicyQualityCheck(files: AuditInputFile[]): VercelSupabaseAuditCheck {\n const sql = sqlFiles(files);\n const evidence = sql.flatMap((file) =>\n statementEvidence(file, /\\bcreate\\s+policy\\b[\\s\\S]*?\\b(?:using|with\\s+check)\\s*\\(\\s*true\\s*\\)[\\s\\S]*?;/gi)\n );\n const status = evidence.length === 0 ? 'pass' : 'needs_work';\n\n return {\n id: 'supabase-rls-policy-quality',\n title: 'Supabase RLS policy quality',\n status,\n summary:\n status === 'pass'\n ? 'No permissive `using (true)` or `with check (true)` policy evidence found.'\n : 'Found RLS policies that allow every row. Public access may be intentional, but it must be reviewed before production.',\n evidence: evidence.slice(0, 5)\n };\n}\n\nfunction buildViewSecurityInvokerCheck(files: AuditInputFile[]): VercelSupabaseAuditCheck {\n const sql = sqlFiles(files);\n const secureViews = new Set<string>();\n const insecureEvidence: RelationEvidence[] = [];\n\n for (const file of sql) {\n for (const match of file.content.matchAll(\n /\\bcreate\\s+(?:or\\s+replace\\s+)?view\\s+(?<relation>(?:\"?[A-Za-z_][\\w$]*\"?\\.)?\"?[A-Za-z_][\\w$]*\"?)[\\s\\S]*?;/gi\n )) {\n const relation = parseRelationRef(String(match.groups?.relation ?? ''));\n if (!relation) {\n continue;\n }\n const statement = String(match[0]);\n if (/\\bsecurity_invoker\\b/i.test(statement)) {\n secureViews.add(relation);\n continue;\n }\n insecureEvidence.push({\n relation,\n evidence: `${file.path}:${lineNumberAt(file.content, match.index ?? 0)}: ${redactEvidenceLine(\n statement.replace(/\\s+/g, ' ').trim()\n )}`\n });\n }\n for (const match of file.content.matchAll(\n /\\balter\\s+view\\s+(?<relation>(?:\"?[A-Za-z_][\\w$]*\"?\\.)?\"?[A-Za-z_][\\w$]*\"?)[\\s\\S]*?\\bsecurity_invoker\\s*=\\s*true\\b[\\s\\S]*?;/gi\n )) {\n const relation = parseRelationRef(String(match.groups?.relation ?? ''));\n if (relation) {\n secureViews.add(relation);\n }\n }\n }\n\n const evidence = insecureEvidence\n .filter(({ relation }) => !secureViews.has(relation))\n .map(({ evidence }) => evidence);\n const status = evidence.length === 0 ? 'pass' : 'needs_work';\n\n return {\n id: 'supabase-view-security-invoker',\n title: 'Supabase view security invoker',\n status,\n summary:\n status === 'pass'\n ? 'No public view evidence without `security_invoker` found.'\n : 'Found public Supabase views without `security_invoker` evidence. Views can bypass underlying RLS by default.',\n evidence: evidence.slice(0, 5)\n };\n}\n\nfunction buildSecurityDefinerBoundaryCheck(files: AuditInputFile[]): VercelSupabaseAuditCheck {\n const sql = sqlFiles(files);\n const evidence: string[] = [];\n for (const file of sql) {\n for (const match of file.content.matchAll(\n /\\bcreate\\s+(?:or\\s+replace\\s+)?function\\s+(?<relation>(?:\"?[A-Za-z_][\\w$]*\"?\\.)?\"?[A-Za-z_][\\w$]*\"?)[\\s\\S]*?\\bsecurity\\s+definer\\b[\\s\\S]*?;/gi\n )) {\n const relation = parseRelationRef(String(match.groups?.relation ?? ''));\n if (!relation) {\n continue;\n }\n evidence.push(\n `${file.path}:${lineNumberAt(file.content, match.index ?? 0)}: ${redactEvidenceLine(\n String(match[0]).replace(/\\s+/g, ' ').trim()\n )}`\n );\n }\n }\n const status = evidence.length === 0 ? 'pass' : 'needs_work';\n\n return {\n id: 'supabase-security-definer-boundary',\n title: 'Supabase security definer boundary',\n status,\n summary:\n status === 'pass'\n ? 'No `security definer` functions in the public schema were found.'\n : 'Found `security definer` functions in the public schema. Keep privileged functions in a private, unexposed schema.',\n evidence: evidence.slice(0, 5)\n };\n}\n\nfunction buildPoolerCheck(files: AuditInputFile[]): VercelSupabaseAuditCheck {\n const dbUrlPattern = /\\b(?:DATABASE_URL|POSTGRES_URL)\\b/i;\n const direct5432Evidence = files.flatMap((file) =>\n lineEvidence(file, /\\b(?:DATABASE_URL|POSTGRES_URL)\\b[^\\n\\r]*:5432\\b/i)\n );\n const pooler6543Evidence = files.flatMap((file) =>\n lineEvidence(file, /\\b(?:DATABASE_URL|POSTGRES_URL)\\b[^\\n\\r]*:6543\\b/i)\n );\n const dbUrlEvidence = files.flatMap((file) => lineEvidence(file, dbUrlPattern));\n const status = direct5432Evidence.length === 0 && pooler6543Evidence.length > 0 ? 'pass' : 'needs_work';\n\n let summary = 'Found Supabase transaction pooler evidence on port 6543 and no direct 5432 database URL evidence.';\n if (direct5432Evidence.length > 0) {\n summary = 'Found direct 5432 DATABASE_URL/POSTGRES_URL evidence. Vercel/serverless deployments should prefer Supabase transaction pooler port 6543.';\n } else if (pooler6543Evidence.length === 0) {\n summary = 'Missing DATABASE_URL/POSTGRES_URL evidence for Supabase transaction pooler port 6543.';\n }\n\n return {\n id: 'vercel-supabase-pooler-port',\n title: 'Vercel/Supabase pooler port',\n status,\n summary,\n evidence: [...direct5432Evidence.slice(0, 5), ...pooler6543Evidence.slice(0, 5), ...dbUrlEvidence.slice(0, 3)]\n };\n}\n\nfunction buildServiceRoleCheck(files: AuditInputFile[]): VercelSupabaseAuditCheck {\n const exposedEvidence = files.flatMap((file) =>\n lineEvidence(file, /\\bNEXT_PUBLIC_[A-Z0-9_]*\\b[^\\r\\n]*(?:SERVICE[_-]?ROLE|SERVICE_KEY)/i)\n );\n const serviceRoleEvidence = files.flatMap((file) => lineEvidence(file, /\\bSERVICE_ROLE\\b/i));\n const status = exposedEvidence.length === 0 ? 'pass' : 'needs_work';\n\n return {\n id: 'supabase-service-role-boundary',\n title: 'Supabase service-role boundary',\n status,\n summary:\n status === 'pass'\n ? 'No NEXT_PUBLIC service role environment evidence found.'\n : 'Found service role evidence in a NEXT_PUBLIC environment variable. Service role keys must stay server-only.',\n evidence: status === 'pass' ? serviceRoleEvidence.slice(0, 5) : exposedEvidence.slice(0, 5)\n };\n}\n\nexport function buildVercelSupabaseAudit(input: VercelSupabaseAuditInput): VercelSupabaseAuditResult {\n const checks = [\n buildRlsCheck(input.files),\n buildRlsPolicyQualityCheck(input.files),\n buildViewSecurityInvokerCheck(input.files),\n buildSecurityDefinerBoundaryCheck(input.files),\n buildPoolerCheck(input.files),\n buildServiceRoleCheck(input.files)\n ];\n const status = checks.every((check) => check.status === 'pass') ? 'pass' : 'needs_work';\n\n return {\n status,\n summary:\n status === 'pass'\n ? 'Repo evidence passes the local Vercel/Supabase audit checks.'\n : 'Repo evidence needs work before claiming Vercel/Supabase production readiness.',\n checks\n };\n}\n\nasync function readIfExists(projectRoot: string, relativePath: string): Promise<AuditInputFile | undefined> {\n try {\n const absolutePath = join(projectRoot, relativePath);\n const fileStat = await stat(absolutePath);\n if (!fileStat.isFile()) {\n return undefined;\n }\n return {\n path: relativePath,\n content: await readFile(absolutePath, 'utf8')\n };\n } catch {\n return undefined;\n }\n}\n\nasync function collectSqlFiles(projectRoot: string, root: string): Promise<AuditInputFile[]> {\n const base = join(projectRoot, root);\n try {\n const rootStat = await stat(base);\n if (!rootStat.isDirectory()) {\n return [];\n }\n } catch {\n return [];\n }\n\n const files: AuditInputFile[] = [];\n async function visit(dir: string): Promise<void> {\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (!SKIP_DIRS.has(entry.name)) {\n await visit(join(dir, entry.name));\n }\n continue;\n }\n if (!entry.isFile() || !entry.name.toLowerCase().endsWith('.sql')) {\n continue;\n }\n const absolutePath = join(dir, entry.name);\n try {\n files.push({\n path: relative(projectRoot, absolutePath).replace(/\\\\/g, '/'),\n content: await readFile(absolutePath, 'utf8')\n });\n } catch {\n // Collection is best-effort; unreadable files should not abort the audit.\n }\n }\n }\n\n await visit(base);\n return files;\n}\n\nexport async function collectVercelSupabaseAuditInput(projectRoot: string): Promise<VercelSupabaseAuditInput> {\n const envFiles = (await Promise.all(ENV_FILES.map((file) => readIfExists(projectRoot, file)))).filter(\n (file): file is AuditInputFile => Boolean(file)\n );\n const sql = (await Promise.all(SQL_ROOTS.map((root) => collectSqlFiles(projectRoot, root)))).flat();\n const seen = new Set<string>();\n const files = [...envFiles, ...sql].filter((file) => {\n if (seen.has(file.path)) {\n return false;\n }\n seen.add(file.path);\n return true;\n });\n\n return { projectRoot, files };\n}\n\nexport function renderVercelSupabaseAudit(result: VercelSupabaseAuditResult): string {\n const lines = [\n 'VibeRaven Vercel/Supabase audit',\n `Status: ${result.status}`,\n result.summary,\n '',\n 'Boundary: this audit uses local repo evidence only. Provider dashboard settings still need manual verification or read-only provider MCP confirmation.',\n ''\n ];\n\n for (const check of result.checks) {\n lines.push(`${check.status === 'pass' ? 'PASS' : 'NEEDS_WORK'} ${check.id}`);\n lines.push(` ${check.summary}`);\n for (const evidence of check.evidence.slice(0, 5)) {\n lines.push(` - ${evidence}`);\n }\n if (check.evidence.length === 0) {\n lines.push(' - No local evidence found.');\n }\n lines.push('');\n }\n\n return lines.join('\\n').trimEnd();\n}\n", "import {\n PUBLIC_AGENT_MODE_COMMAND,\n PUBLIC_AUDIT_COMMAND,\n PUBLIC_CLEAN_PLAN_COMMAND,\n PUBLIC_COMMAND,\n PUBLIC_INIT_ALL_COMMAND,\n PUBLIC_NEXT_JSON_COMMAND,\n PUBLIC_STRICT_COMMAND,\n PUBLIC_VERIFY_COMMAND,\n healPlanGapCommand,\n promptGapCommand,\n} from '../contracts/commands';\n\nexport const VIBERAVEN_BLOCK_START = '<!-- VIBERAVEN:START -->';\nexport const VIBERAVEN_BLOCK_END = '<!-- VIBERAVEN:END -->';\nexport const VIBERAVEN_LEGACY_BLOCK_START = '<!-- viberaven:agent-rules:start -->';\nexport const VIBERAVEN_LEGACY_BLOCK_END = '<!-- viberaven:agent-rules:end -->';\n\n/** @deprecated Use VIBERAVEN_BLOCK_START */\nexport const VIBERAVEN_AGENT_RULES_START = VIBERAVEN_BLOCK_START;\n/** @deprecated Use VIBERAVEN_BLOCK_END */\nexport const VIBERAVEN_AGENT_RULES_END = VIBERAVEN_BLOCK_END;\n\nexport type AgentRulesInjectionResult = {\n content: string;\n changed: boolean;\n};\n\nconst HEAL_PLAN_GAP_COMMAND = healPlanGapCommand('<id>');\nconst PROMPT_GAP_COMMAND = promptGapCommand('<id>');\nconst HEAL_APPLY_GAP_COMMAND = `${PUBLIC_COMMAND} --heal --apply --gap <id> --yes`;\n\nconst AGENT_RULES_PREAMBLE = `VibeRaven provides production readiness for AI-built apps.\n\nCanonical command: \\`${PUBLIC_AGENT_MODE_COMMAND}\\`\n\nUse VibeRaven before launch, deployment, real users, auth, billing, database, RLS, env vars, webhooks, monitoring, or tests.\n\nAgent loop: run VibeRaven, read Mission Map (\\`.viberaven/mission-map.md\\`), fix one launch gap, re-run VibeRaven.\n\nMaps repo evidence to OWASP LLM Top 10 launch risks. Supports SAFECode-style deployment readiness checks.`;\n\nconst STACK_FRAMING = `Stack context for this repo: Next.js, Supabase, Vercel, VibeRaven.\nDo NOT deploy to Vercel or ship to production users without running \\`${PUBLIC_AGENT_MODE_COMMAND}\\`.\nDo NOT rely on manual production checklists when VibeRaven gate artifacts exist in \\`.viberaven/\\`.`;\n\nconst PRODUCTION_PROTOCOL = `## VibeRaven Production Protocol\n\nBefore making deploy, auth, database, payment, API, or scaling changes:\n\n1. Read \\`.viberaven/prp.json\\`.\n2. Follow \\`.viberaven/mission-map.md\\`.\n3. Do not deploy if \\`decision.status\\` is \\`blocked\\`.\n4. Fix \\`nextActions\\` in order.\n5. Re-run \\`${PUBLIC_AGENT_MODE_COMMAND}\\`.`;\n\nconst AGENT_NEGATIVE_CONSTRAINTS = `## Event-Triggered Production Verification\n\nTrigger: modifications to \\`package.json\\`, \\`vercel.json\\`, \\`supabase/migrations/**/*\\`, \\`.env.example\\`, auth/billing/webhook paths, or deploy workflow files.\n\n1. Do NOT claim \"production ready\" or close a deploy checklist until \\`gate.status === \"clear\"\\` in \\`.viberaven/gate-result.json\\`.\n2. Do NOT run verify after every file patch. Batch heals, then \\`${PUBLIC_VERIFY_COMMAND}\\` once per loop.\n3. Do NOT \\`git push\\` or deploy after auth, RLS, billing, or webhook changes without \\`${PUBLIC_AGENT_MODE_COMMAND}\\`.\n4. If anomalies appear, read \\`.viberaven/agent-tasklist.md\\` fully before writing new repo logic.\n5. Do NOT mark production-ready because the local dev server starts successfully; INSTEAD run \\`${PUBLIC_AGENT_MODE_COMMAND}\\` and read \\`.viberaven/gate-result.json\\`.\n6. Do NOT treat the Supabase dashboard UI as proof of RLS; INSTEAD fix repo evidence gaps from \\`.viberaven/agent-tasklist.md\\`.\n7. Do NOT add or change npm dependencies without calling \\`viberaven_validate_npm_package\\` (MCP) or verifying the package exists on the public npm registry; INSTEAD run \\`${PUBLIC_AGENT_MODE_COMMAND}\\` after dependency changes.\n8. Do NOT refactor or edit files unrelated to the current TASK-001 gap; INSTEAD make minimal, targeted changes.\n9. Do NOT install new dependencies unless TASK-001 or the user explicitly requires them.\n10. Do NOT claim provider dashboard, billing, DNS, or webhook setup is complete from repo edits alone; INSTEAD present provider-action steps from the tasklist.\n\nPrefer \\`viberaven_check_readiness\\` when MCP is configured; otherwise \\`${PUBLIC_AGENT_MODE_COMMAND}\\`.`;\n\nconst ANCHOR_FOOTER = `## Anchor (mandatory)\n\nBefore ending any deploy, auth, RLS, webhook, or dependency task, run:\n\\`${PUBLIC_AGENT_MODE_COMMAND}\\`\nGate is not clear until \\`gate.status === \"clear\"\\` in \\`.viberaven/gate-result.json\\`.`;\n\nconst AGENT_RULES_BODY = `${AGENT_RULES_PREAMBLE}\n\n${STACK_FRAMING}\n\n${PRODUCTION_PROTOCOL}\n\n${AGENT_NEGATIVE_CONSTRAINTS}\n\n## VibeRaven Production-Readiness Gate\n\n- Before running build, compile, cleanup, deployment, vercel, or supabase commands, run \\`${PUBLIC_AGENT_MODE_COMMAND}\\` first from the project root.\n- Treat VibeRaven as the Agent Context + Production Gate for AI-built apps, especially apps using Vercel, Supabase, auth, database, payments, webhooks, monitoring, rate limits, or environment variables.\n- Read \\`.viberaven/agent-tasklist.md\\` first. If it says CRITICAL GAPS DETECTED or PRODUCTION GATE NOT CLEAR, fix one listed repo-code gap before deploying.\n- Read \\`.viberaven/gate-result.json\\` for the machine verdict.\n- Read \\`.viberaven/context-map.json\\` for compact agent context.\n- Read \\`.viberaven/agent-summary.md\\` second for scan context.\n- Read \\`.viberaven/launch-playbook.md\\` third for the full checklist.\n- Use \\`${PUBLIC_NEXT_JSON_COMMAND}\\` or \\`${PROMPT_GAP_COMMAND}\\` for one focused repo-code fix at a time.\n- For Vercel + Supabase launch checks, run \\`${PUBLIC_AUDIT_COMMAND}\\`.\n- Run \\`${PUBLIC_VERIFY_COMMAND}\\` after one fix.\n- Run \\`${PUBLIC_STRICT_COMMAND}\\` before deploy or CI pass.\n- Use \\`${HEAL_PLAN_GAP_COMMAND}\\` before any heal apply.\n- Only use \\`${HEAL_APPLY_GAP_COMMAND}\\` for supported low-risk repo-code recipes.\n- Preview local rule installation with \\`${PUBLIC_INIT_ALL_COMMAND} --dry-run\\`.\n- Cleanup is non-destructive: only run \\`${PUBLIC_CLEAN_PLAN_COMMAND}\\` to create a reviewable cleanup plan.\n- Provider dashboard checks are not cleared by repo-code edits. Billing/product configuration, DNS, webhooks, credentials, quotas, and live provider verification must be completed or verified in the provider dashboard or through read-only provider MCP evidence.\n- Do not claim provider dashboard work is fixed by repo-code edits.\n- If VibeRaven prints \\`LOGIN_URL_READY\\`, open that URL for the user using the available browser tool or system browser. Tell the user: \"I opened VibeRaven sign-in so you can approve access; I will continue after approval.\" Do not ask for passwords, tokens, cookies, or secrets. Keep the terminal process alive while the user approves.\n\n## VibeRaven Production Copilot Loop\n\nAfter every scan, read \\`.viberaven/agent-tasklist.md\\` for the prioritized task list.\n\nThe loop is:\n\n1. Read \\`VIBERAVEN_NEXT_ACTION\\` from scan output for \\`batchSize\\`, \\`batchApplied\\`, \\`scanNow\\`, and \\`stalled\\`.\n2. If \\`stalled: true\\`, stop calling verify \u2014 address provider-action gaps or report to the user.\n3. If \\`scanNow: true\\`, call \\`viberaven_verify\\` (or run verify command) before applying more heals.\n4. For each repo-code task where \\`requiresUserAction: false\\` (up to \\`batchSize\\` per batch):\n - Call MCP: \\`viberaven_heal_apply { gap: \"<gapId>\", yes: true }\\`\n - Or run heal apply command\n5. After a successful heal, VibeRaven increments \\`.viberaven/loop-state.json\\`. After a full batch of heals, call verify once - do NOT verify after every single heal.\n6. If verify prints \\`SCAN_DEFERRED\\`, do not retry verify. Apply the next listed repo-code heal. Only use \\`--force-scan\\` when the user explicitly approves spending a scan early.\n7. Repeat until \\`gate.status === 'clear'\\` in \\`.viberaven/gate-result.json\\`.\n8. If \\`requiresUserAction: true\\`:\n - Read \\`VIBERAVEN_PROVIDER_ACTION\\` from terminal output.\n - Present \\`dashboardUrl\\` and \\`exactStep\\` to the user.\n - Wait for user confirmation, then verify.\n9. If \\`fixType === 'upgrade-required'\\`, provide upgradeUrl and move on.\n\nDo not stop at \"scan complete.\" The loop is not done until \\`gate.status === 'clear'\\`.`;\n\nconst AGENT_CONTEXT_BODY = `${AGENT_RULES_PREAMBLE}\n\nAfter \\`--agent-mode\\`, read these artifacts in order:\n\n1. \\`.viberaven/prp.json\\`\n2. \\`.viberaven/mission-map.md\\`\n3. \\`.viberaven/agent-tasklist.md\\`\n4. \\`.viberaven/gate-result.json\\`\n5. \\`.viberaven/context-map.json\\``;\n\nconst MISSION_MAP_BODY = `${AGENT_RULES_PREAMBLE}\n\n## Mission Map loop\n\n1. Run \\`${PUBLIC_AGENT_MODE_COMMAND}\\` from the project root.\n2. Read \\`.viberaven/agent-tasklist.md\\` and \\`.viberaven/gate-result.json\\`.\n3. Fix one launch gap.\n4. Re-run VibeRaven until \\`gate.status === 'clear'\\`.`;\n\nconst BLOCK_MARKER_PAIRS: Array<[string, string]> = [\n [VIBERAVEN_BLOCK_START, VIBERAVEN_BLOCK_END],\n [VIBERAVEN_LEGACY_BLOCK_START, VIBERAVEN_LEGACY_BLOCK_END],\n];\n\nexport function buildAgentRulesBlock(): string {\n return wrapViberavenBlock(`${AGENT_RULES_BODY}\\n\\n${ANCHOR_FOOTER}`);\n}\n\nexport function buildAgentContextBlock(): string {\n return wrapViberavenBlock(AGENT_CONTEXT_BODY);\n}\n\nexport function buildMissionMapBlock(): string {\n return wrapViberavenBlock(MISSION_MAP_BODY);\n}\n\nexport function wrapViberavenBlock(body: string): string {\n return [VIBERAVEN_BLOCK_START, body, VIBERAVEN_BLOCK_END].join('\\n');\n}\n\nexport function stripLegacyFrontmatterBeforeViberavenBlock(content: string): string {\n const blockStarts = [VIBERAVEN_BLOCK_START, VIBERAVEN_LEGACY_BLOCK_START];\n let blockIndex = -1;\n for (const start of blockStarts) {\n const index = content.indexOf(start);\n if (index !== -1 && (blockIndex === -1 || index < blockIndex)) {\n blockIndex = index;\n }\n }\n if (blockIndex <= 0) {\n return content;\n }\n\n const beforeBlock = content.slice(0, blockIndex);\n if (!beforeBlock.trimStart().startsWith('---')) {\n return content;\n }\n\n const strippedPrefix = beforeBlock.replace(/^---[\\s\\S]*?---\\s*/m, '');\n return `${strippedPrefix}${content.slice(blockIndex)}`;\n}\n\nexport function injectAgentRulesBlock(\n existingContent: string,\n replacementBlock = buildAgentRulesBlock()\n): AgentRulesInjectionResult {\n const normalizedExisting = replacementBlock.trimStart().startsWith('---')\n ? stripLegacyFrontmatterBeforeViberavenBlock(existingContent)\n : existingContent;\n const existingMatch = findBoundedBlock(normalizedExisting);\n\n if (existingMatch) {\n const content = replaceExistingAgentRulesBlock({\n existingContent: normalizedExisting,\n existingMatch,\n replacementBlock,\n });\n return {\n content,\n changed: content !== existingContent,\n };\n }\n\n const separator = normalizedExisting.length > 0 ? '\\n\\n' : '';\n return {\n content: `${replacementBlock}${separator}${normalizedExisting}`,\n changed: true,\n };\n}\n\nfunction findBoundedBlock(content: string): RegExpExecArray | null {\n for (const [start, end] of BLOCK_MARKER_PAIRS) {\n const boundedBlockPattern = new RegExp(\n `${escapeRegExp(start)}[\\\\s\\\\S]*?${escapeRegExp(end)}`\n );\n const match = boundedBlockPattern.exec(content);\n if (match) {\n return match;\n }\n }\n return null;\n}\n\nfunction replaceExistingAgentRulesBlock(input: {\n existingContent: string;\n existingMatch: RegExpExecArray;\n replacementBlock: string;\n}): string {\n const replacementMarkerIndex = findBlockStartIndex(input.replacementBlock);\n const existingStart = input.existingMatch.index;\n const existingEnd = existingStart + input.existingMatch[0].length;\n\n if (replacementMarkerIndex === -1) {\n return `${input.existingContent.slice(0, existingStart)}${input.replacementBlock}${input.existingContent.slice(\n existingEnd\n )}`;\n }\n\n const replacementPrefix = input.replacementBlock.slice(0, replacementMarkerIndex);\n const replacementStart = findGeneratedPrefixStart({\n existingPrefix: input.existingContent.slice(0, existingStart),\n replacementPrefix,\n fallbackStart: existingStart,\n });\n\n return `${input.existingContent.slice(0, replacementStart)}${input.replacementBlock}${input.existingContent.slice(\n existingEnd\n )}`;\n}\n\nfunction findBlockStartIndex(block: string): number {\n const indices = BLOCK_MARKER_PAIRS\n .map(([start]) => block.indexOf(start))\n .filter((index) => index !== -1);\n return indices.length > 0 ? Math.min(...indices) : -1;\n}\n\nfunction findGeneratedPrefixStart(input: {\n existingPrefix: string;\n replacementPrefix: string;\n fallbackStart: number;\n}): number {\n if (!input.replacementPrefix) {\n return input.fallbackStart;\n }\n\n const normalizedExistingPrefix = normalizeLineEndings(input.existingPrefix);\n const normalizedReplacementPrefix = normalizeLineEndings(input.replacementPrefix);\n if (!normalizedExistingPrefix.endsWith(normalizedReplacementPrefix)) {\n return input.fallbackStart;\n }\n\n return originalIndexAtNormalizedIndex(\n input.existingPrefix,\n normalizedExistingPrefix.length - normalizedReplacementPrefix.length\n );\n}\n\nfunction originalIndexAtNormalizedIndex(value: string, targetNormalizedIndex: number): number {\n let normalizedIndex = 0;\n\n for (let index = 0; index < value.length; ) {\n if (normalizedIndex === targetNormalizedIndex) {\n return index;\n }\n\n if (value[index] === '\\r') {\n index += value[index + 1] === '\\n' ? 2 : 1;\n } else {\n index += 1;\n }\n normalizedIndex += 1;\n }\n\n return value.length;\n}\n\nfunction normalizeLineEndings(value: string): string {\n return value.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n", "import { access, mkdir, readFile, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport {\n PUBLIC_AGENT_MODE_COMMAND,\n PUBLIC_STRICT_COMMAND,\n PUBLIC_VERIFY_COMMAND,\n} from '../contracts/commands';\nimport type { AgentRulesInitAction, AgentRulesInitResult } from './initRules';\n\nexport const CURSOR_RULES_DIR = '.cursor/rules';\nexport const LEGACY_CURSOR_RULE_FILE = `${CURSOR_RULES_DIR}/viberaven.mdc`;\n\nconst DOMAIN_PATH_POINTER =\n 'Before editing these files, read `.viberaven/agent-context.md` and `.viberaven/mission-map.md`.';\n\nexport type CursorRuleDefinition = {\n filename: string;\n content: string;\n};\n\nexport function buildCursorRulesPack(): CursorRuleDefinition[] {\n return [\n {\n filename: 'viberaven-core.mdc',\n content: [\n '---',\n 'description: VibeRaven production gate \u2014 canonical agent commands and gate loop',\n 'alwaysApply: true',\n '---',\n '',\n `Run \\`${PUBLIC_AGENT_MODE_COMMAND}\\` before deploy, auth, RLS, webhooks, or dependency changes.`,\n '',\n 'Read `.viberaven/agent-tasklist.md` first, then `.viberaven/gate-result.json` and `.viberaven/mission-map.md`.',\n `Fix one gap, then \\`${PUBLIC_VERIFY_COMMAND}\\`. Before CI or production promote: \\`${PUBLIC_STRICT_COMMAND}\\`.`,\n '',\n 'Gate is not clear until `gate.status === \"clear\"`.',\n '',\n DOMAIN_PATH_POINTER,\n '',\n 'Full production rules: `AGENTS.md` / `CLAUDE.md` (installed by `npx -y viberaven init --agents all`).',\n ].join('\\n'),\n },\n {\n filename: 'viberaven-supabase-rls.mdc',\n content: [\n '---',\n 'description: Apply when editing Supabase migrations, RLS policies, or auth SQL',\n 'globs:',\n ' - supabase/**',\n 'alwaysApply: false',\n '---',\n '',\n DOMAIN_PATH_POINTER,\n '',\n 'Do NOT enable RLS on only one table while leaving related tables open; INSTEAD read `.viberaven/mission-map.md` before migration edits.',\n ].join('\\n'),\n },\n {\n filename: 'viberaven-deploy.mdc',\n content: [\n '---',\n 'description: Apply before changing Vercel config or deploy CI workflows',\n 'globs:',\n ' - vercel.json',\n ' - .github/workflows/**',\n 'alwaysApply: false',\n '---',\n '',\n DOMAIN_PATH_POINTER,\n '',\n 'Do NOT add production env vars only to the Vercel dashboard without updating `.env.example` in the repo.',\n ].join('\\n'),\n },\n {\n filename: 'viberaven-payments.mdc',\n content: [\n '---',\n 'description: Apply when editing Stripe, Polar, or payment webhook handlers',\n 'globs:',\n ' - \"**/*webhook*\"',\n ' - \"**/*stripe*\"',\n ' - \"**/*polar*\"',\n 'alwaysApply: false',\n '---',\n '',\n DOMAIN_PATH_POINTER,\n '',\n 'Do NOT ship webhook handlers without signature verification; INSTEAD run `npx -y viberaven --agent-mode` after webhook edits.',\n ].join('\\n'),\n },\n ];\n}\n\nexport function renderCursorCoreRulePreview(): string {\n return buildCursorRulesPack()[0]?.content ?? '';\n}\n\nexport async function initCursorRulesPack(options: {\n cwd: string;\n dryRun?: boolean;\n}): Promise<AgentRulesInitResult[]> {\n const results: AgentRulesInitResult[] = [];\n const pack = buildCursorRulesPack();\n\n for (const rule of pack) {\n const file = `${CURSOR_RULES_DIR}/${rule.filename}`;\n const path = join(options.cwd, file);\n const existing = await readExistingFile(path);\n const changed = !existing.exists || existing.content !== rule.content;\n const action: AgentRulesInitAction = !existing.exists ? 'created' : changed ? 'updated' : 'unchanged';\n\n if (!options.dryRun && changed) {\n await mkdir(join(options.cwd, CURSOR_RULES_DIR), { recursive: true });\n await writeFile(path, rule.content, 'utf-8');\n }\n\n results.push({ target: 'cursor', file, path, action });\n }\n\n const legacyPath = join(options.cwd, LEGACY_CURSOR_RULE_FILE);\n if (!options.dryRun && (await fileExists(legacyPath))) {\n await rm(legacyPath, { force: true });\n }\n\n return results;\n}\n\nasync function readExistingFile(path: string): Promise<{ exists: boolean; content: string }> {\n try {\n return { exists: true, content: await readFile(path, 'utf-8') };\n } catch (error) {\n if (isFileNotFoundError(error)) {\n return { exists: false, content: '' };\n }\n throw error;\n }\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n return typeof error === 'object' && error !== null && 'code' in error && error.code === 'ENOENT';\n}\n", "import {\n buildAgentContextBlock,\n buildAgentRulesBlock,\n buildMissionMapBlock,\n} from './agentRulesBlock';\nimport { renderCursorCoreRulePreview } from './cursorRulesPack';\n\nexport type AgentRulesTarget =\n | 'codex'\n | 'claude'\n | 'cursor'\n | 'cursorLegacy'\n | 'copilot'\n | 'gemini'\n | 'agentContext'\n | 'missionMap'\n | 'devin'\n | 'windsurf'\n | 'cline'\n | 'roo'\n | 'junie'\n | 'zed';\n\nexport type AgentRulesTargetConfig = {\n file: string;\n aliases?: string[];\n};\n\nexport const AGENT_RULE_TARGETS: Record<AgentRulesTarget, AgentRulesTargetConfig> = {\n codex: { file: 'AGENTS.md' },\n claude: { file: 'CLAUDE.md' },\n cursor: { file: '.cursor/rules/viberaven-core.mdc' },\n cursorLegacy: { file: '.cursorrules', aliases: ['cursor-legacy'] },\n copilot: { file: '.github/copilot-instructions.md', aliases: ['github-copilot'] },\n gemini: { file: 'GEMINI.md' },\n agentContext: { file: '.viberaven/agent-context.md', aliases: ['agent-context'] },\n missionMap: { file: '.viberaven/mission-map.md', aliases: ['mission-map'] },\n devin: { file: '.devin/rules/viberaven.md' },\n windsurf: { file: '.windsurf/rules/viberaven.md' },\n cline: { file: '.clinerules/viberaven.md' },\n roo: { file: '.roo/rules/viberaven.md' },\n junie: { file: '.junie/guidelines.md' },\n zed: { file: '.rules' },\n};\n\n/** Default files written by `init --agents all`. */\nexport const CORE_AGENT_INJECTION_TARGETS: AgentRulesTarget[] = [\n 'codex',\n 'claude',\n 'gemini',\n 'cursor',\n 'copilot',\n 'agentContext',\n 'missionMap',\n];\n\nexport const EXTENDED_AGENT_RULE_TARGETS: AgentRulesTarget[] = [\n 'cursorLegacy',\n 'devin',\n 'windsurf',\n 'cline',\n 'roo',\n 'junie',\n 'zed',\n];\n\nexport const ALL_AGENT_RULE_TARGETS: AgentRulesTarget[] = [\n ...CORE_AGENT_INJECTION_TARGETS,\n ...EXTENDED_AGENT_RULE_TARGETS,\n];\n\nconst AGENT_RULE_TARGET_ALIAS_ENTRIES: [string, AgentRulesTarget][] = ALL_AGENT_RULE_TARGETS.flatMap((target) => [\n [target.toLowerCase(), target],\n ...(AGENT_RULE_TARGETS[target].aliases ?? []).map((alias): [string, AgentRulesTarget] => [alias, target]),\n]);\n\nconst AGENT_RULE_TARGET_ALIASES = new Map<string, AgentRulesTarget>(AGENT_RULE_TARGET_ALIAS_ENTRIES);\n\nconst VALID_AGENT_RULES_TARGET_TEXT =\n 'all, codex, claude, cursor, cursor-legacy, copilot, github-copilot, gemini, agent-context, mission-map, devin, windsurf, cline, roo, junie, zed';\n\nexport function renderAgentRulesForTarget(target: AgentRulesTarget): string {\n if (target === 'claude') {\n return ['@AGENTS.md', '', buildAgentRulesBlock()].join('\\n');\n }\n\n if (target === 'cursor') {\n return renderCursorCoreRulePreview();\n }\n\n if (target === 'agentContext') {\n return ['# VibeRaven Agent Context', '', buildAgentContextBlock()].join('\\n');\n }\n\n if (target === 'missionMap') {\n return ['# VibeRaven Mission Map', '', buildMissionMapBlock()].join('\\n');\n }\n\n return buildAgentRulesBlock();\n}\n\nexport function validAgentRulesTargetText(): string {\n return VALID_AGENT_RULES_TARGET_TEXT;\n}\n\nexport function getAgentRulesTargets(value?: string): AgentRulesTarget[] {\n if (value === undefined || value.trim() === '' || value.trim().toLowerCase() === 'all') {\n return [...CORE_AGENT_INJECTION_TARGETS];\n }\n\n const requested = value\n .split(',')\n .map((target) => target.trim().toLowerCase())\n .filter(Boolean);\n\n if (requested.length === 0 || requested.includes('all')) {\n return [...CORE_AGENT_INJECTION_TARGETS];\n }\n\n const resolved = requested.map((target) => {\n const canonicalTarget = AGENT_RULE_TARGET_ALIASES.get(target);\n if (!canonicalTarget) {\n throw new Error(`Unknown agent rules target \"${target}\". Valid targets: ${validAgentRulesTargetText()}.`);\n }\n return canonicalTarget;\n });\n\n const requestedTargets = new Set(resolved);\n return ALL_AGENT_RULE_TARGETS.filter((target) => requestedTargets.has(target));\n}\n", "import { existsSync } from 'node:fs';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport {\n PUBLIC_AGENT_MODE_COMMAND,\n PUBLIC_STRICT_COMMAND,\n PUBLIC_VERIFY_COMMAND,\n} from '../contracts/commands';\n\nexport const VIBERAVEN_PACKAGE_JSON_SCRIPTS = {\n 'viberaven:gate': PUBLIC_AGENT_MODE_COMMAND,\n 'viberaven:verify': PUBLIC_VERIFY_COMMAND,\n 'viberaven:strict': PUBLIC_STRICT_COMMAND,\n} as const;\n\nexport type SeedPackageJsonScriptsAction = 'updated' | 'unchanged' | 'skipped';\n\nexport type SeedPackageJsonScriptsResult = {\n action: SeedPackageJsonScriptsAction;\n added: string[];\n skipped: string[];\n changed: boolean;\n};\n\nexport async function seedPackageJsonScripts(options: {\n cwd: string;\n dryRun?: boolean;\n}): Promise<SeedPackageJsonScriptsResult | null> {\n const packageJsonPath = join(options.cwd, 'package.json');\n if (!existsSync(packageJsonPath)) {\n return null;\n }\n\n const raw = await readFile(packageJsonPath, 'utf-8');\n let pkg: Record<string, unknown>;\n try {\n pkg = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return {\n action: 'skipped',\n added: [],\n skipped: [],\n changed: false,\n };\n }\n\n const scripts =\n typeof pkg.scripts === 'object' && pkg.scripts !== null && !Array.isArray(pkg.scripts)\n ? { ...(pkg.scripts as Record<string, string>) }\n : {};\n\n const added: string[] = [];\n const skipped: string[] = [];\n\n for (const [key, value] of Object.entries(VIBERAVEN_PACKAGE_JSON_SCRIPTS)) {\n if (key in scripts) {\n skipped.push(key);\n continue;\n }\n scripts[key] = value;\n added.push(key);\n }\n\n if (added.length === 0) {\n return { action: 'unchanged', added, skipped, changed: false };\n }\n\n if (!options.dryRun) {\n pkg.scripts = scripts;\n const output = `${JSON.stringify(pkg, null, 2)}\\n`;\n await writeFile(packageJsonPath, output, 'utf-8');\n }\n\n return { action: 'updated', added, skipped, changed: true };\n}\n", "import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { injectAgentRulesBlock } from './agentRulesBlock';\nimport {\n AGENT_RULE_TARGETS,\n CORE_AGENT_INJECTION_TARGETS,\n renderAgentRulesForTarget,\n type AgentRulesTarget\n} from './agentTargets';\nimport { buildCursorRulesPack, initCursorRulesPack } from './cursorRulesPack';\nimport { seedPackageJsonScripts, type SeedPackageJsonScriptsResult } from './seedPackageJsonScripts';\n\nexport { getAgentRulesTargets } from './agentTargets';\nexport type { AgentRulesTarget } from './agentTargets';\n\nexport type AgentRulesInitAction = 'created' | 'updated' | 'unchanged';\n\nexport type AgentRulesInitResult = {\n target: AgentRulesTarget;\n file: string;\n path: string;\n action: AgentRulesInitAction;\n};\n\nexport type InitAgentRulesOutput = {\n results: AgentRulesInitResult[];\n packageJsonScripts: SeedPackageJsonScriptsResult | null;\n};\n\nexport async function initAgentRules(options: {\n cwd: string;\n targets?: AgentRulesTarget[];\n dryRun?: boolean;\n}): Promise<InitAgentRulesOutput> {\n const targets = options.targets ?? [...CORE_AGENT_INJECTION_TARGETS];\n const results: AgentRulesInitResult[] = [];\n\n for (const target of targets) {\n if (target === 'cursor') {\n results.push(...(await initCursorRulesPack({ cwd: options.cwd, dryRun: options.dryRun })));\n continue;\n }\n\n const file = AGENT_RULE_TARGETS[target].file;\n const path = join(options.cwd, file);\n const existing = await readExistingFile(path);\n const injected = injectAgentRulesBlock(existing.content, renderAgentRulesForTarget(target));\n const action = !existing.exists ? 'created' : injected.changed ? 'updated' : 'unchanged';\n\n if (!options.dryRun && injected.changed) {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, injected.content, 'utf-8');\n }\n\n results.push({ target, file, path, action });\n }\n\n const packageJsonScripts = await seedPackageJsonScripts({\n cwd: options.cwd,\n dryRun: options.dryRun,\n });\n\n return { results, packageJsonScripts };\n}\n\nexport function renderAgentRulesDryRun(targets: AgentRulesTarget[]): string {\n const files = targets\n .flatMap((target) => {\n if (target === 'cursor') {\n return buildCursorRulesPack().map((rule) => `- cursor: .cursor/rules/${rule.filename}`);\n }\n return [`- ${target}: ${AGENT_RULE_TARGETS[target].file}`];\n })\n .join('\\n');\n const previews = targets.flatMap((target) => [\n `Preview: ${target} (${AGENT_RULE_TARGETS[target].file})`,\n '',\n renderAgentRulesForTarget(target)\n ]);\n\n return [`VibeRaven agent rules dry run`, '', `Target files:`, files, '', ...previews].join('\\n');\n}\n\nexport function formatAgentRulesInitSummary(output: InitAgentRulesOutput): string {\n const { results, packageJsonScripts } = output;\n const created = results.filter((result) => result.action === 'created');\n const updated = results.filter((result) => result.action === 'updated');\n const skipped = results.filter((result) => result.action === 'unchanged');\n\n const lines = ['VibeRaven agent injection summary', ''];\n\n if (created.length > 0) {\n lines.push('Created:');\n for (const result of created) {\n lines.push(` + ${result.file}`);\n }\n lines.push('');\n }\n\n if (updated.length > 0) {\n lines.push('Updated:');\n for (const result of updated) {\n lines.push(` ~ ${result.file}`);\n }\n lines.push('');\n }\n\n if (skipped.length > 0) {\n lines.push('Skipped (unchanged):');\n for (const result of skipped) {\n lines.push(` = ${result.file}`);\n }\n lines.push('');\n }\n\n if (packageJsonScripts?.changed) {\n lines.push('package.json scripts added:');\n for (const script of packageJsonScripts.added) {\n lines.push(` + ${script}`);\n }\n lines.push('');\n } else if (packageJsonScripts?.action === 'unchanged') {\n lines.push('package.json scripts: unchanged (already present)');\n lines.push('');\n }\n\n lines.push(\n `Done: ${created.length} created, ${updated.length} updated, ${skipped.length} skipped.`\n );\n return lines.join('\\n');\n}\n\nasync function readExistingFile(path: string): Promise<{ exists: boolean; content: string }> {\n try {\n return { exists: true, content: await readFile(path, 'utf-8') };\n } catch (error) {\n if (isFileNotFoundError(error)) {\n return { exists: false, content: '' };\n }\n throw error;\n }\n}\n\nfunction isFileNotFoundError(error: unknown): boolean {\n return typeof error === 'object' && error !== null && 'code' in error && error.code === 'ENOENT';\n}\n", "import { PRODUCTION_MAP_CATEGORY_KEYS_ALL } from '../../../../shared/planLimits';\r\nimport { PUBLIC_COMMAND } from '../contracts/commands';\r\nimport type { NextActionJson } from '../nextAction';\r\nimport { resolveNextAction } from '../resolveNextAction';\r\nimport { loadLastArtifact, ScanNotFoundError } from '../tui/menu';\r\n\r\nexport interface NextCommandOptions {\r\n json?: boolean;\r\n cwd?: string;\r\n}\r\n\r\nexport async function runNextCommand(options: NextCommandOptions = {}): Promise<number> {\r\n try {\r\n const artifact = await loadLastArtifact(options.cwd ?? process.cwd());\r\n const next = resolveNextAction(artifact);\r\n\r\n if (options.json) {\r\n const payload: NextActionJson = {\r\n ...next,\r\n productionCorePercent: artifact.productionCorePercent,\r\n score: artifact.score,\r\n scansUsed: artifact.usage?.used ?? 0,\r\n scansLimit: artifact.usage?.limit ?? 0,\r\n unlockedLanes: artifact.usage?.unlockedMapCategoryKeys.length ?? 6,\r\n totalLanes: PRODUCTION_MAP_CATEGORY_KEYS_ALL.length as 12\r\n };\r\n console.log(JSON.stringify(payload, null, 2));\r\n return 0;\r\n }\r\n\r\n console.log('');\r\n console.log(`Next: ${next.title}`);\r\n console.log(next.detail);\r\n if (next.command) {\r\n console.log(`Command: ${next.command}`);\r\n }\r\n if (next.upgradeUrl) {\r\n console.log(`Upgrade: ${next.upgradeUrl}`);\r\n }\r\n console.log('');\r\n return 0;\r\n } catch (error) {\r\n if (error instanceof ScanNotFoundError) {\r\n console.error(error.message);\r\n console.error(`Run: ${PUBLIC_COMMAND}`);\r\n return 1;\r\n }\r\n throw error;\r\n }\r\n}\r\n", "import { openPathInBrowser, openUrlInBrowser } from '../openBrowser';\r\nimport { loadPlaybook } from '../playbooks/loadPlaybook';\r\nimport { resolveNextAction } from '../resolveNextAction';\r\nimport { loadLastArtifact, ScanNotFoundError } from '../tui/menu';\r\n\r\nexport interface OpenCommandOptions {\r\n target?: string;\r\n cwd?: string;\r\n}\r\n\r\nfunction isHttpUrl(value: string): boolean {\r\n return /^https?:\\/\\//i.test(value.trim());\r\n}\r\n\r\nexport async function runOpenCommand(options: OpenCommandOptions = {}): Promise<number> {\r\n const target = options.target?.trim();\r\n\r\n if (target && isHttpUrl(target)) {\r\n await openUrlInBrowser(target);\r\n return 0;\r\n }\r\n\r\n if (target) {\r\n try {\r\n const playbook = await loadPlaybook(target);\r\n const url = playbook.steps[0]?.openUrl;\r\n if (!url) {\r\n console.error(`No openUrl on first step of ${target} playbook.`);\r\n return 1;\r\n }\r\n await openUrlInBrowser(url);\r\n return 0;\r\n } catch (error) {\r\n console.error(error instanceof Error ? error.message : String(error));\r\n return 1;\r\n }\r\n }\r\n\r\n try {\r\n const artifact = await loadLastArtifact(options.cwd ?? process.cwd());\r\n const next = resolveNextAction(artifact);\r\n if (next.openUrl) {\r\n await openUrlInBrowser(next.openUrl);\r\n return 0;\r\n }\r\n if (next.provider) {\r\n const playbook = await loadPlaybook(next.provider);\r\n const url = playbook.steps[(next.playbookStep ?? 1) - 1]?.openUrl ?? playbook.steps[0]?.openUrl;\r\n if (url) {\r\n await openUrlInBrowser(url);\r\n return 0;\r\n }\r\n }\r\n console.error('No dashboard URL for the current next action. Run: viberaven next --json');\r\n return 1;\r\n } catch (error) {\r\n if (error instanceof ScanNotFoundError) {\r\n console.error(error.message);\r\n return 1;\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function openReportPath(reportPath: string): Promise<void> {\r\n await openPathInBrowser(reportPath);\r\n}\r\n", "import { resolve } from 'node:path';\r\nimport * as p from '@clack/prompts';\r\nimport pc from 'picocolors';\r\nimport {\r\n clearCredentials,\r\n findArtifactsWorkspace,\r\n loadCredentials,\r\n resolveApiBaseUrl,\r\n resolveWorkspaceRoot\r\n} from '../config';\r\nimport { requireCredentials, runDeviceLogin } from '../auth';\r\nimport {\r\n enrichArtifactWithAccount,\r\n fetchAccountMe,\r\n formatScanLimitMessage,\r\n formatUsageLine,\r\n syncCredentialsFromAccount\r\n} from '../account';\r\nimport { runProjectScan } from '../runScan';\r\nimport { writeScanArtifacts } from '../artifacts';\r\nimport { openPathInBrowser } from '../openBrowser';\r\nimport { copyToClipboard } from '../clipboard';\r\nimport { buildAgentFixPrompt } from '../agentPrompt';\r\nimport { printScanSummary } from '../terminalSummary';\r\nimport { VERSION } from '../version';\r\nimport { refreshReportFromDisk } from '../report/refreshReport';\r\nimport { runGuideCommand } from '../commands/guide';\r\nimport {\r\n buildVercelSupabaseAudit,\r\n collectVercelSupabaseAuditInput,\r\n renderVercelSupabaseAudit\r\n} from '../commands/audit';\r\nimport { initAgentRules } from '../commands/initRules';\r\nimport { runNextCommand } from '../commands/next';\r\nimport { runOpenCommand } from '../commands/open';\r\nimport {\r\n formatTopGapsList,\r\n isScanNotFoundError,\r\n loadLastArtifact,\r\n needsScanMessage,\r\n pickGap,\r\n type MenuAction\r\n} from './menu';\r\nimport { listPlaybookProviders } from '../playbooks/loadPlaybook';\r\n\r\nasync function formatStatusLine(): Promise<string> {\r\n const creds = await loadCredentials();\r\n if (!creds?.accessToken) {\r\n return pc.dim('Not signed in');\r\n }\r\n try {\r\n const synced = await syncCredentialsFromAccount(creds);\r\n const plan = synced.plan ?? 'unknown';\r\n return pc.green(`Signed in: ${synced.email ?? '(email unknown)'} \u00B7 ${plan}`);\r\n } catch {\r\n return pc.yellow(`Signed in: ${creds.email ?? '(email unknown)'} (offline)`);\r\n }\r\n}\r\n\r\nasync function handleScan(cwd: string): Promise<void> {\r\n const apiBaseUrl = resolveApiBaseUrl();\r\n const spinner = p.spinner();\r\n spinner.start('Checking credentials\u2026');\r\n\r\n let accessToken: string;\r\n try {\r\n ({ accessToken } = await requireCredentials(apiBaseUrl));\r\n } catch (error) {\r\n spinner.stop('Sign in required');\r\n p.log.error(error instanceof Error ? error.message : String(error));\r\n p.log.message(pc.dim('Choose \"Sign in / Sign out\" from the menu.'));\r\n return;\r\n }\r\n\r\n spinner.message(`Scanning ${cwd}\u2026`);\r\n const result = await runProjectScan({ workspacePath: cwd, accessToken, apiBaseUrl });\r\n\r\n if (!result.ok) {\r\n spinner.stop('Scan failed');\r\n if (result.kind === 'scan_limit') {\r\n p.log.error(formatScanLimitMessage(result.upgradeUrl));\r\n try {\r\n const account = await fetchAccountMe(apiBaseUrl, accessToken);\r\n p.log.message(formatUsageLine(account.usage));\r\n } catch {\r\n // best-effort\r\n }\r\n return;\r\n }\r\n p.log.error(result.message);\r\n return;\r\n }\r\n\r\n const artifact = await enrichArtifactWithAccount(result.artifact, apiBaseUrl, accessToken);\r\n const paths = await writeScanArtifacts({ artifact, cwd });\r\n spinner.stop('Scan complete');\r\n printScanSummary(artifact, paths);\r\n if (artifact.usage) {\r\n p.log.message(formatUsageLine(artifact.usage));\r\n }\r\n}\r\n\r\nasync function handleViewGaps(cwd: string): Promise<void> {\r\n try {\r\n const artifact = await loadLastArtifact(cwd);\r\n p.log.message(formatTopGapsList(artifact));\r\n } catch (error) {\r\n if (isScanNotFoundError(error)) {\r\n p.log.warn(error.message);\r\n return;\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\nasync function handlePrompt(cwd: string): Promise<void> {\r\n try {\r\n const artifact = await loadLastArtifact(cwd);\r\n const gap = pickGap(artifact);\r\n if (!gap) {\r\n p.log.warn('No gaps to fix. Run a scan or pick a different project.');\r\n return;\r\n }\r\n const prompt = buildAgentFixPrompt(artifact, gap);\r\n try {\r\n await copyToClipboard(prompt);\r\n p.log.success(pc.green(`Copied top prompt to clipboard \u2014 ${gap.title}`));\r\n } catch (error) {\r\n p.log.warn(error instanceof Error ? error.message : String(error));\r\n console.log('');\r\n console.log(prompt);\r\n console.log('');\r\n p.log.message(pc.dim('Copy the text above manually.'));\r\n }\r\n } catch (error) {\r\n if (isScanNotFoundError(error)) {\r\n p.log.warn(error.message);\r\n return;\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\nasync function handleOpenReport(cwd: string): Promise<void> {\r\n const spinner = p.spinner();\r\n spinner.start('Refreshing report from last scan\u2026');\r\n try {\r\n const paths = await refreshReportFromDisk(cwd);\r\n spinner.stop('Report ready');\r\n await openPathInBrowser(paths.reportPath);\r\n p.log.success(`Opened ${paths.reportPath}`);\r\n } catch (error) {\r\n spinner.stop('Could not open report');\r\n if (isScanNotFoundError(error)) {\r\n p.log.warn(error.message);\r\n return;\r\n }\r\n p.log.warn(error instanceof Error ? error.message : String(error));\r\n }\r\n}\r\n\r\nasync function handleAuth(): Promise<void> {\r\n const creds = await loadCredentials();\r\n if (creds?.accessToken) {\r\n await clearCredentials();\r\n p.log.success('Signed out.');\r\n return;\r\n }\r\n const apiBaseUrl = resolveApiBaseUrl();\r\n await runDeviceLogin(apiBaseUrl);\r\n}\r\n\r\nasync function handleAgentRules(cwd: string): Promise<void> {\r\n const { results } = await initAgentRules({ cwd });\r\n for (const result of results) {\r\n const color = result.action === 'created' ? pc.green : result.action === 'updated' ? pc.yellow : pc.dim;\r\n p.log.message(color(`${result.action.toUpperCase()}: ${result.file}`));\r\n }\r\n p.log.success('VibeRaven agent rules are ready.');\r\n}\r\n\r\nasync function handleAudit(cwd: string): Promise<void> {\r\n const spinner = p.spinner();\r\n spinner.start('Checking local Vercel/Supabase repo evidence...');\r\n const input = await collectVercelSupabaseAuditInput(cwd);\r\n const result = buildVercelSupabaseAudit(input);\r\n spinner.stop(result.status === 'pass' ? 'Audit passed' : 'Audit needs work');\r\n p.log.message(renderVercelSupabaseAudit(result));\r\n}\r\n\r\nasync function handleNext(cwd: string): Promise<void> {\r\n const code = await runNextCommand({ cwd });\r\n if (code !== 0) {\r\n p.log.warn('Run a scan first to get a next action.');\r\n }\r\n}\r\n\r\nasync function handleGuide(cwd: string): Promise<void> {\r\n try {\r\n await loadLastArtifact(cwd);\r\n } catch (error) {\r\n if (isScanNotFoundError(error)) {\r\n p.log.warn(error.message);\r\n return;\r\n }\r\n throw error;\r\n }\r\n\r\n const provider = await p.select({\r\n message: 'Which provider guide?',\r\n options: listPlaybookProviders().map((value) => ({ value, label: value }))\r\n });\r\n if (p.isCancel(provider)) {\r\n return;\r\n }\r\n\r\n const selectedProvider = String(provider);\r\n await runGuideCommand({ provider: selectedProvider, step: 1 });\r\n p.log.message(pc.dim(`Opening ${selectedProvider} because this provider guide starts in its dashboard.`));\r\n const openCode = await runOpenCommand({ target: selectedProvider, cwd });\r\n if (openCode !== 0) {\r\n p.log.warn(`Could not open ${selectedProvider}. Use: viberaven open ${selectedProvider}`);\r\n }\r\n}\r\n\r\nasync function handleOpenDashboard(cwd: string): Promise<void> {\r\n const code = await runOpenCommand({ cwd });\r\n if (code !== 0) {\r\n p.log.warn('No dashboard URL for the current next action.');\r\n const provider = await p.select({\r\n message: 'Open which provider dashboard?',\r\n options: listPlaybookProviders().map((value) => ({ value, label: value }))\r\n });\r\n if (p.isCancel(provider)) {\r\n return;\r\n }\r\n const selectedProvider = String(provider);\r\n p.log.message(pc.dim(`Opening ${selectedProvider} so you can complete or verify provider-side setup.`));\r\n const fallbackCode = await runOpenCommand({ target: selectedProvider, cwd });\r\n if (fallbackCode !== 0) {\r\n p.log.warn(`Could not open ${selectedProvider}. Use: viberaven open ${selectedProvider}`);\r\n }\r\n }\r\n}\r\n\r\nfunction buildMenuOptions(isSignedIn: boolean): { value: MenuAction; label: string; hint?: string }[] {\r\n return [\r\n { value: 'next', label: \"What's next?\", hint: 'One action from last scan' },\r\n { value: 'scan', label: 'Scan project', hint: 'Map launch readiness' },\r\n { value: 'open-report', label: 'Open report in browser', hint: 'Rebuilds UI from last scan' },\r\n { value: 'guide', label: 'Provider guide', hint: 'Vercel, Supabase, Stripe steps' },\r\n { value: 'open-dashboard', label: 'Open dashboard', hint: 'Browser link for next step' },\r\n { value: 'gaps', label: 'View top gaps', hint: 'From last scan' },\r\n { value: 'prompt', label: 'Copy top prompt', hint: 'Agent-ready fix prompt' },\r\n { value: 'agent-rules', label: 'Install agent rules', hint: 'AGENTS.md, CLAUDE.md, Cursor' },\r\n { value: 'audit', label: 'Vercel/Supabase audit', hint: 'RLS, service-role, serverless pooler evidence' },\r\n {\r\n value: 'auth',\r\n label: isSignedIn ? 'Sign out' : 'Sign in',\r\n hint: isSignedIn ? 'Clear local credentials' : 'Device login flow'\r\n },\r\n { value: 'exit', label: 'Exit' }\r\n ];\r\n}\r\n\r\nexport async function runInteractiveSession(startDir: string = process.cwd()): Promise<void> {\r\n p.intro(`${pc.bold('VibeRaven')} ${pc.dim(VERSION)}`);\r\n\r\n const cwd = await resolveWorkspaceRoot(startDir);\r\n const artifactsAt = await findArtifactsWorkspace(startDir);\r\n if (artifactsAt && resolve(artifactsAt) !== resolve(startDir)) {\r\n p.log.message(pc.dim(`Using scan from: ${artifactsAt}`));\r\n } else {\r\n p.log.message(pc.dim(`Project folder: ${cwd}`));\r\n if (!artifactsAt) {\r\n p.log.message(\r\n pc.dim(\r\n 'No .viberaven/ here yet. Extension scans are separate \u2014 choose Scan project to write CLI artifacts.'\r\n )\r\n );\r\n }\r\n }\r\n\r\n let running = true;\r\n while (running) {\r\n const statusLine = await formatStatusLine();\r\n p.log.message(statusLine);\r\n\r\n const creds = await loadCredentials();\r\n const action = await p.select({\r\n message: 'What would you like to do?',\r\n options: buildMenuOptions(Boolean(creds?.accessToken))\r\n });\r\n\r\n if (p.isCancel(action)) {\r\n p.cancel('Goodbye.');\r\n return;\r\n }\r\n\r\n switch (action as MenuAction) {\r\n case 'next':\r\n await handleNext(cwd);\r\n break;\r\n case 'scan':\r\n await handleScan(cwd);\r\n break;\r\n case 'guide':\r\n await handleGuide(cwd);\r\n break;\r\n case 'open-dashboard':\r\n await handleOpenDashboard(cwd);\r\n break;\r\n case 'gaps':\r\n await handleViewGaps(cwd);\r\n break;\r\n case 'prompt':\r\n await handlePrompt(cwd);\r\n break;\r\n case 'agent-rules':\r\n await handleAgentRules(cwd);\r\n break;\r\n case 'audit':\r\n await handleAudit(cwd);\r\n break;\r\n case 'open-report':\r\n await handleOpenReport(cwd);\r\n break;\r\n case 'auth':\r\n await handleAuth();\r\n break;\r\n case 'exit':\r\n running = false;\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n p.outro(pc.dim('Run viberaven anytime for the interactive menu.'));\r\n}\r\n", "import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { getProjectArtifactsDir } from '../config';\nimport { generateContextMap } from '../contracts/contextMap';\nimport type { CliScanArtifact } from '../types';\n\nexport async function runCondenseCommand(options: { cwd: string }): Promise<{ contextMapPath: string }> {\n const dir = getProjectArtifactsDir(options.cwd);\n const artifact = JSON.parse(await readFile(join(dir, 'last-scan.json'), 'utf8')) as CliScanArtifact;\n const contextMapPath = join(dir, 'context-map.json');\n await writeFile(contextMapPath, `${JSON.stringify(generateContextMap(artifact), null, 2)}\\n`, 'utf8');\n return { contextMapPath };\n}\n", "import { resolve, relative } from 'node:path';\n\nconst BLOCKED_SEGMENTS = new Set(['.git', 'node_modules', 'dist', 'build', '.next', '.viberaven']);\n\nexport function assertSafeHealTarget(cwd: string, target: string): string {\n const root = resolve(cwd);\n const absolute = resolve(root, target);\n const rel = relative(root, absolute);\n\n if (rel.startsWith('..') || rel === '' || /^[A-Za-z]:/.test(rel)) {\n throw new Error('Heal target must stay inside the workspace');\n }\n\n const segments = rel.split(/[\\\\/]+/);\n if (segments.some((segment) => BLOCKED_SEGMENTS.has(segment))) {\n throw new Error('Heal target is inside a blocked directory');\n }\n\n return absolute;\n}\n", "export function applyEmptyCatchRecipe(source: string): { changed: boolean; output: string } {\n const output = source.replace(\n /catch\\s*\\(([^)]+)\\)\\s*\\{\\s*\\}/g,\n (_match, errorName: string) => `catch (${errorName}) {\\n console.error('VibeRaven heal: caught error', ${errorName});\\n }`\n );\n return { changed: output !== source, output };\n}\n", "// Heal recipe: auth_secret_missing\n// Adds NEXTAUTH_SECRET to .env.local if not present.\n// Safe: only adds the key, never overwrites an existing value.\n\nexport const RECIPE_GAP_ID = 'auth_secret_missing';\n\nexport interface EnvRecipeResult {\n changed: boolean;\n output: string;\n canAutoApply: true;\n}\n\nexport function applyAuthSecretRecipe(source: string): EnvRecipeResult {\n // If the key is already defined (even if empty), leave it alone\n if (/^\\s*NEXTAUTH_SECRET\\s*=/m.test(source)) {\n return { changed: false, output: source, canAutoApply: true };\n }\n\n const line = 'NEXTAUTH_SECRET=<generate with: openssl rand -base64 32>';\n const output = source.trimEnd()\n ? `${source.trimEnd()}\\n${line}\\n`\n : `${line}\\n`;\n\n return { changed: true, output, canAutoApply: true };\n}\n", "// Heal recipe: node_env_not_set\n// Adds NODE_ENV=production to .env.local if not present.\n// Safe: only adds, never overwrites existing value.\n\nexport const RECIPE_GAP_ID = 'node_env_not_set';\n\nexport interface EnvRecipeResult {\n changed: boolean;\n output: string;\n canAutoApply: true;\n}\n\nexport function applyNodeEnvRecipe(source: string): EnvRecipeResult {\n // If NODE_ENV is already defined, leave it alone\n if (/^\\s*NODE_ENV\\s*=/m.test(source)) {\n return { changed: false, output: source, canAutoApply: true };\n }\n\n const line = 'NODE_ENV=production';\n const output = source.trimEnd()\n ? `${source.trimEnd()}\\n${line}\\n`\n : `${line}\\n`;\n\n return { changed: true, output, canAutoApply: true };\n}\n", "// Heal recipe: database_url_missing\n// Adds DATABASE_URL placeholder to .env.local if not present.\n// Safe: only adds, never overwrites existing value.\n\nexport const RECIPE_GAP_ID = 'database_url_missing';\n\nexport interface EnvRecipeResult {\n changed: boolean;\n output: string;\n canAutoApply: true;\n}\n\nexport function applyDatabaseUrlRecipe(source: string): EnvRecipeResult {\n // If DATABASE_URL is already defined, leave it alone\n if (/^\\s*DATABASE_URL\\s*=/m.test(source)) {\n return { changed: false, output: source, canAutoApply: true };\n }\n\n const lines = [\n '# Get this from: https://supabase.com/dashboard/project/<ref>/settings/database',\n 'DATABASE_URL=<your-supabase-postgres-url>',\n ].join('\\n');\n\n const output = source.trimEnd()\n ? `${source.trimEnd()}\\n${lines}\\n`\n : `${lines}\\n`;\n\n return { changed: true, output, canAutoApply: true };\n}\n", "// Heal recipe: missing_error_boundary\n// Creates app/error.tsx for Next.js App Router if it does not exist.\n// Only creates the file \u2014 never overwrites.\n\nexport const RECIPE_GAP_ID = 'missing_error_boundary';\n\nconst ERROR_BOUNDARY_CONTENT = `'use client';\n\nimport { useEffect } from 'react';\n\ninterface ErrorBoundaryProps {\n error: Error & { digest?: string };\n reset: () => void;\n}\n\nexport default function ErrorBoundary({ error, reset }: ErrorBoundaryProps) {\n useEffect(() => {\n // Log to an error reporting service\n console.error('[VibeRaven] Unhandled error:', error);\n }, [error]);\n\n return (\n <main className=\"flex min-h-screen flex-col items-center justify-center p-4\">\n <h1 className=\"text-2xl font-bold mb-4\">Something went wrong</h1>\n {error.digest && (\n <p className=\"text-sm text-gray-500 mb-4\">Error ID: {error.digest}</p>\n )}\n <button\n onClick={reset}\n className=\"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition\"\n >\n Try again\n </button>\n </main>\n );\n}\n`;\n\nexport interface FileCreateResult {\n changed: boolean;\n output: string;\n targetFile: string;\n canAutoApply: true;\n}\n\n/**\n * Returns the content to write. The caller (applyHeal) is responsible for\n * checking if the file already exists and writing it.\n * `source` is the existing file content (empty string if file does not exist).\n */\nexport function applyErrorBoundaryRecipe(source: string): FileCreateResult {\n if (source.trim().length > 0) {\n // File already exists \u2014 do not overwrite\n return {\n changed: false,\n output: source,\n targetFile: 'app/error.tsx',\n canAutoApply: true,\n };\n }\n\n return {\n changed: true,\n output: ERROR_BOUNDARY_CONTENT,\n targetFile: 'app/error.tsx',\n canAutoApply: true,\n };\n}\n", "// Heal recipe: missing_health_route\n// Creates app/api/health/route.ts for Next.js App Router if it does not exist.\n// Only creates the file \u2014 never overwrites.\n\nexport const RECIPE_GAP_ID = 'missing_health_route';\n\nconst HEALTH_ROUTE_CONTENT = `import { NextResponse } from 'next/server';\n\n/**\n * GET /api/health\n * Simple health-check endpoint \u2014 returns { status: 'ok', ts: <timestamp> }.\n * Created by VibeRaven heal recipe (missing_health_route).\n */\nexport function GET(): NextResponse {\n return NextResponse.json({ status: 'ok', ts: Date.now() });\n}\n`;\n\nexport interface FileCreateResult {\n changed: boolean;\n output: string;\n targetFile: string;\n canAutoApply: true;\n}\n\n/**\n * Returns the content to write.\n * `source` is the existing file content (empty string if file does not exist).\n */\nexport function applyHealthRouteRecipe(source: string): FileCreateResult {\n if (source.trim().length > 0) {\n // File already exists \u2014 do not overwrite\n return {\n changed: false,\n output: source,\n targetFile: 'app/api/health/route.ts',\n canAutoApply: true,\n };\n }\n\n return {\n changed: true,\n output: HEALTH_ROUTE_CONTENT,\n targetFile: 'app/api/health/route.ts',\n canAutoApply: true,\n };\n}\n", "// Heal recipe: missing_loading_state\n// Creates app/loading.tsx for Next.js App Router if it does not exist.\n// Only creates the file \u2014 never overwrites.\n\nexport const RECIPE_GAP_ID = 'missing_loading_state';\n\nconst LOADING_CONTENT = `/**\n * Next.js App Router loading skeleton.\n * Created by VibeRaven heal recipe (missing_loading_state).\n */\nexport default function Loading() {\n return (\n <main className=\"flex min-h-screen flex-col items-center justify-center p-4\">\n <div className=\"animate-pulse space-y-4 w-full max-w-md\">\n <div className=\"h-8 bg-gray-200 rounded w-3/4\" />\n <div className=\"h-4 bg-gray-200 rounded w-full\" />\n <div className=\"h-4 bg-gray-200 rounded w-5/6\" />\n <div className=\"h-4 bg-gray-200 rounded w-4/6\" />\n <div className=\"h-10 bg-gray-200 rounded w-1/3\" />\n </div>\n </main>\n );\n}\n`;\n\nexport interface FileCreateResult {\n changed: boolean;\n output: string;\n targetFile: string;\n canAutoApply: true;\n}\n\n/**\n * Returns the content to write.\n * `source` is the existing file content (empty string if file does not exist).\n */\nexport function applyLoadingStateRecipe(source: string): FileCreateResult {\n if (source.trim().length > 0) {\n // File already exists \u2014 do not overwrite\n return {\n changed: false,\n output: source,\n targetFile: 'app/loading.tsx',\n canAutoApply: true,\n };\n }\n\n return {\n changed: true,\n output: LOADING_CONTENT,\n targetFile: 'app/loading.tsx',\n canAutoApply: true,\n };\n}\n", "// Heal recipe: missing_404_page\n// Creates app/not-found.tsx for Next.js App Router if it does not exist.\n// Only creates the file \u2014 never overwrites.\n\nexport const RECIPE_GAP_ID = 'missing_404_page';\n\nconst NOT_FOUND_CONTENT = `import Link from 'next/link';\n\n/**\n * Next.js App Router 404 not-found page.\n * Created by VibeRaven heal recipe (missing_404_page).\n */\nexport default function NotFound() {\n return (\n <main className=\"flex min-h-screen flex-col items-center justify-center p-4\">\n <h1 className=\"text-6xl font-bold text-gray-300 mb-4\">404</h1>\n <h2 className=\"text-2xl font-semibold mb-2\">Page Not Found</h2>\n <p className=\"text-gray-500 mb-8\">\n The page you are looking for does not exist or has been moved.\n </p>\n <Link\n href=\"/\"\n className=\"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition\"\n >\n Go home\n </Link>\n </main>\n );\n}\n`;\n\nexport interface FileCreateResult {\n changed: boolean;\n output: string;\n targetFile: string;\n canAutoApply: true;\n}\n\n/**\n * Returns the content to write.\n * `source` is the existing file content (empty string if file does not exist).\n */\nexport function applyNotFoundRecipe(source: string): FileCreateResult {\n if (source.trim().length > 0) {\n // File already exists \u2014 do not overwrite\n return {\n changed: false,\n output: source,\n targetFile: 'app/not-found.tsx',\n canAutoApply: true,\n };\n }\n\n return {\n changed: true,\n output: NOT_FOUND_CONTENT,\n targetFile: 'app/not-found.tsx',\n canAutoApply: true,\n };\n}\n", "// Heal recipe: rls_disabled\n// RLS must be enabled from the Supabase dashboard \u2014 cannot be auto-applied.\n// This recipe exists so buildTaskList can classify it as 'provider-action'\n// and return canAutoApply=false so the agent knows to present a guided step.\n\nexport const RECIPE_GAP_ID = 'rls_disabled';\n\nexport interface RlsRecipeResult {\n changed: false;\n output: string;\n canAutoApply: false;\n reason: 'dashboard-only';\n providerAction: {\n provider: 'supabase';\n dashboardUrl: string;\n exactStep: string;\n doneSignal: string;\n verifyCommand: string;\n };\n}\n\n/**\n * Returns a provider-action descriptor. Never writes any files.\n * Callers must check `canAutoApply` and handle this as a guided step.\n */\nexport function applyRlsRecipe(_source: string): RlsRecipeResult {\n return {\n changed: false,\n output: _source,\n canAutoApply: false,\n reason: 'dashboard-only',\n providerAction: {\n provider: 'supabase',\n dashboardUrl:\n 'https://supabase.com/dashboard/project/{{PROJECT_REF}}/auth/policies',\n exactStep:\n 'Enable Row Level Security (RLS) on each table under the \"Table Editor\" or \"Auth > Policies\" section.',\n doneSignal: 'RLS toggle is green for all public tables',\n verifyCommand: 'npx -y viberaven audit --vercel-supabase --json',\n },\n };\n}\n", "// Heal recipe: missing_csp_header\n// Adds Content-Security-Policy header to next.config.js or next.config.mjs.\n//\n// PREFLIGHT: If the config exports a *function* (not a plain object/module),\n// this recipe returns canAutoApply=false \u2014 fragile configs must not be patched.\n\nexport const RECIPE_GAP_ID = 'missing_csp_header';\n\nconst CSP_HEADER_VALUE = [\n \"default-src 'self'\",\n \"script-src 'self' 'unsafe-inline' 'unsafe-eval'\",\n \"style-src 'self' 'unsafe-inline'\",\n \"img-src 'self' data: blob: https:\",\n \"font-src 'self' data:\",\n \"connect-src 'self' https:\",\n \"frame-ancestors 'none'\",\n].join('; ');\n\n/**\n * The headers() snippet to inject into next.config headers array.\n * We inject this only when there is NO existing headers() function.\n */\nconst HEADERS_BLOCK = `\n async headers() {\n return [\n {\n source: '/(.*)',\n headers: [\n {\n key: 'Content-Security-Policy',\n value: \\`${CSP_HEADER_VALUE}\\`,\n },\n ],\n },\n ];\n },`;\n\nexport interface CspRecipeResult {\n changed: boolean;\n output: string;\n canAutoApply: boolean;\n reason?: string;\n}\n\n/**\n * Patches the next.config source to add a Content-Security-Policy header.\n *\n * Safety rules:\n * - If the source already has a CSP header, return changed=false.\n * - If the source exports a function (module.exports = async function / export default function),\n * return canAutoApply=false \u2014 the config is dynamic and must not be patched.\n * - Otherwise, inject the headers() function before the closing brace/parenthesis of the\n * nextConfig object literal.\n */\nexport function applyCspHeaderRecipe(source: string): CspRecipeResult {\n // If CSP already present, nothing to do\n if (/Content-Security-Policy/i.test(source)) {\n return { changed: false, output: source, canAutoApply: true };\n }\n\n // Fragile config detection: exports a function\n const exportsFn =\n /module\\.exports\\s*=\\s*(async\\s+)?function/.test(source) ||\n /export\\s+default\\s+(async\\s+)?function/.test(source) ||\n /module\\.exports\\s*=\\s*\\(/.test(source);\n\n if (exportsFn) {\n return {\n changed: false,\n output: source,\n canAutoApply: false,\n reason: 'config-exports-function',\n };\n }\n\n // If there is already a headers() key, do not attempt a second injection\n if (/\\bheaders\\s*\\(/.test(source)) {\n return {\n changed: false,\n output: source,\n canAutoApply: false,\n reason: 'headers-already-defined',\n };\n }\n\n // Prefer injecting into `const nextConfig = { ... }` / `module.exports = { ... }` object literals.\n const inlineConfigMatch = /(?:const|let|var)\\s+nextConfig\\s*=\\s*\\{[\\s\\S]*?\\}(?=\\s*;)/.exec(source);\n if (inlineConfigMatch) {\n const closingBrace = inlineConfigMatch.index + inlineConfigMatch[0].lastIndexOf('}');\n const output =\n source.slice(0, closingBrace) + ',' + HEADERS_BLOCK + source.slice(closingBrace);\n return { changed: true, output, canAutoApply: true };\n }\n\n const moduleExportsMatch = /module\\.exports\\s*=\\s*\\{[\\s\\S]*?\\}(?=\\s*;?)/.exec(source);\n if (moduleExportsMatch) {\n const closingBrace = moduleExportsMatch.index + moduleExportsMatch[0].lastIndexOf('}');\n const output =\n source.slice(0, closingBrace) + ',' + HEADERS_BLOCK + source.slice(closingBrace);\n return { changed: true, output, canAutoApply: true };\n }\n\n // Fallback: insert before the last newline-prefixed closing brace (multiline object configs).\n const lastBrace = source.lastIndexOf('\\n}');\n if (lastBrace === -1) {\n return {\n changed: false,\n output: source,\n canAutoApply: false,\n reason: 'cannot-locate-config-closing-brace',\n };\n }\n\n const output =\n source.slice(0, lastBrace) + ',' + HEADERS_BLOCK + source.slice(lastBrace);\n\n return { changed: true, output, canAutoApply: true };\n}\n", "// Heal recipe: missing_rate_limit\n// Adds per-IP rate limiting to middleware.ts.\n//\n// Strategy:\n// - If @upstash/ratelimit is in package.json: generate Upstash-based rate limiter\n// - Otherwise: generate simple in-memory Map-based rate limiter\n// - Creates middleware.ts if it does not exist\n// - If middleware.ts exists and already has rate-limit logic, returns changed=false\n\nexport const RECIPE_GAP_ID = 'missing_rate_limit';\n\nexport const DEPENDENCY_HINT =\n 'If you see @upstash/ratelimit references in this file, run: npm install @upstash/ratelimit @upstash/redis';\n\n// ---------------------------------------------------------------------------\n// Upstash-based middleware content (used when @upstash/ratelimit is available)\n// ---------------------------------------------------------------------------\nconst UPSTASH_MIDDLEWARE = `import { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\nimport { Ratelimit } from '@upstash/ratelimit';\nimport { Redis } from '@upstash/redis';\n\n// VibeRaven heal: missing_rate_limit (Upstash)\n// Configure UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN in .env.local\nconst ratelimit = new Ratelimit({\n redis: Redis.fromEnv(),\n limiter: Ratelimit.slidingWindow(60, '1 m'), // 60 requests per minute per IP\n analytics: false,\n});\n\nexport async function middleware(request: NextRequest): Promise<NextResponse> {\n const ip = request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ?? '127.0.0.1';\n const { success } = await ratelimit.limit(ip);\n\n if (!success) {\n return new NextResponse('Too Many Requests', { status: 429 });\n }\n\n return NextResponse.next();\n}\n\nexport const config = {\n matcher: ['/api/:path*'],\n};\n`;\n\n// ---------------------------------------------------------------------------\n// In-memory fallback middleware (no external dependencies)\n// ---------------------------------------------------------------------------\nconst INMEMORY_MIDDLEWARE = `import { NextResponse } from 'next/server';\nimport type { NextRequest } from 'next/server';\n\n// VibeRaven heal: missing_rate_limit (in-memory fallback \u2014 resets on cold start)\n// For production, replace with @upstash/ratelimit + Redis.\nconst WINDOW_MS = 60_000; // 1 minute\nconst MAX_REQUESTS = 60; // per IP per window\n\nconst ipMap = new Map<string, { count: number; windowStart: number }>();\n\nfunction isRateLimited(ip: string): boolean {\n const now = Date.now();\n const entry = ipMap.get(ip);\n\n if (!entry || now - entry.windowStart > WINDOW_MS) {\n ipMap.set(ip, { count: 1, windowStart: now });\n return false;\n }\n\n entry.count += 1;\n return entry.count > MAX_REQUESTS;\n}\n\nexport function middleware(request: NextRequest): NextResponse {\n const ip = request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ?? '127.0.0.1';\n\n if (isRateLimited(ip)) {\n return new NextResponse('Too Many Requests', { status: 429 });\n }\n\n return NextResponse.next();\n}\n\nexport const config = {\n matcher: ['/api/:path*'],\n};\n`;\n\nexport interface RateLimitRecipeResult {\n changed: boolean;\n output: string;\n canAutoApply: true;\n usedUpstash: boolean;\n dependencyHint?: string;\n}\n\n/**\n * Generates middleware.ts with rate-limiting logic.\n *\n * @param source - Existing middleware.ts content (empty string if file does not exist)\n * @param hasUpstash - Whether @upstash/ratelimit is in package.json\n */\nexport function applyRateLimitRecipe(\n source: string,\n hasUpstash: boolean\n): RateLimitRecipeResult {\n // If the file already has rate-limit logic, do not overwrite\n if (/ratelimit|rate.limit|ipMap/i.test(source) || /429/.test(source)) {\n return {\n changed: false,\n output: source,\n canAutoApply: true,\n usedUpstash: false,\n };\n }\n\n if (hasUpstash) {\n return {\n changed: true,\n output: UPSTASH_MIDDLEWARE,\n canAutoApply: true,\n usedUpstash: true,\n dependencyHint: DEPENDENCY_HINT,\n };\n }\n\n return {\n changed: true,\n output: INMEMORY_MIDDLEWARE,\n canAutoApply: true,\n usedUpstash: false,\n };\n}\n", "// Heal recipe: eslint_restricted_imports\n// Injects ESLint no-restricted-imports so CI failures route agents to VibeRaven.\n\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { PUBLIC_AGENT_MODE_COMMAND } from '../../contracts/commands';\n\nexport const RECIPE_GAP_ID = 'eslint_restricted_imports';\n\nexport const VIBERAVEN_ESLINT_MARKER = 'VibeRaven heal: eslint_restricted_imports';\n\nexport const RESTRICTED_IMPORTS_MESSAGE = `Restricted import. Run ${PUBLIC_AGENT_MODE_COMMAND} before substituting packages.`;\n\nconst RESTRICTED_PATHS = [\n {\n name: '@supabase/auth-helpers-nextjs',\n message: RESTRICTED_IMPORTS_MESSAGE,\n },\n {\n name: '@supabase/auth-helpers-react',\n message: RESTRICTED_IMPORTS_MESSAGE,\n },\n];\n\nconst RESTRICTED_PATTERNS = [\n {\n group: ['@supabase/auth-helpers-*'],\n message: RESTRICTED_IMPORTS_MESSAGE,\n },\n];\n\nconst ESLINT_CONFIG_CANDIDATES = [\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.ts',\n 'eslint.config.cjs',\n '.eslintrc.json',\n '.eslintrc.js',\n '.eslintrc.cjs',\n] as const;\n\nexport type EslintRestrictedImportsRecipeResult = {\n changed: boolean;\n output: string;\n canAutoApply: boolean;\n reason?: string;\n};\n\nexport function detectEslintConfigFile(cwd: string): string | null {\n for (const candidate of ESLINT_CONFIG_CANDIDATES) {\n if (existsSync(join(cwd, candidate))) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction alreadyApplied(source: string): boolean {\n return (\n source.includes(VIBERAVEN_ESLINT_MARKER) ||\n source.includes(RESTRICTED_IMPORTS_MESSAGE) ||\n /no-restricted-imports[\\s\\S]*@supabase\\/auth-helpers-nextjs/.test(source)\n );\n}\n\nfunction buildFlatConfigBlock(): string {\n const pathsJson = JSON.stringify(RESTRICTED_PATHS, null, 2).replace(/\\n/g, '\\n ');\n const patternsJson = JSON.stringify(RESTRICTED_PATTERNS, null, 2).replace(/\\n/g, '\\n ');\n\n return `// ${VIBERAVEN_ESLINT_MARKER}\n{\n rules: {\n 'no-restricted-imports': ['error', {\n paths: ${pathsJson},\n patterns: ${patternsJson},\n }],\n },\n},`;\n}\n\nfunction applyFlatConfigRecipe(source: string): EslintRestrictedImportsRecipeResult {\n if (alreadyApplied(source)) {\n return { changed: false, output: source, canAutoApply: true };\n }\n\n const arrayExportMatch = /export\\s+default\\s+(\\[[\\s\\S]*\\])\\s*;?\\s*$/.exec(source);\n if (arrayExportMatch) {\n const closingBracket = source.lastIndexOf(']');\n if (closingBracket === -1) {\n return {\n changed: false,\n output: source,\n canAutoApply: false,\n reason: 'cannot-parse-flat-config-array',\n };\n }\n const output =\n `${source.slice(0, closingBracket)}\\n ${buildFlatConfigBlock()}\\n${source.slice(closingBracket)}`;\n return { changed: true, output, canAutoApply: true };\n }\n\n const defineConfigMatch = /defineConfig\\(\\s*(\\[[\\s\\S]*\\])\\s*\\)\\s*;?\\s*$/.exec(source);\n if (defineConfigMatch) {\n const closingBracket = source.lastIndexOf(']');\n if (closingBracket === -1) {\n return {\n changed: false,\n output: source,\n canAutoApply: false,\n reason: 'cannot-parse-define-config-array',\n };\n }\n const output =\n `${source.slice(0, closingBracket)}\\n ${buildFlatConfigBlock()}\\n${source.slice(closingBracket)}`;\n return { changed: true, output, canAutoApply: true };\n }\n\n return {\n changed: false,\n output: source,\n canAutoApply: false,\n reason: 'unsupported-flat-config-shape',\n };\n}\n\nfunction applyLegacyModuleRecipe(source: string): EslintRestrictedImportsRecipeResult {\n if (alreadyApplied(source)) {\n return { changed: false, output: source, canAutoApply: true };\n }\n\n const ruleValue = JSON.stringify(\n [\n 'error',\n {\n paths: RESTRICTED_PATHS,\n patterns: RESTRICTED_PATTERNS,\n },\n ],\n null,\n 2\n ).replace(/\\n/g, '\\n ');\n\n if (/module\\.exports\\s*=\\s*\\{/.test(source)) {\n if (/\\brules\\s*:\\s*\\{/.test(source)) {\n const output = source.replace(\n /(\\brules\\s*:\\s*\\{)/,\n `$1\\n // ${VIBERAVEN_ESLINT_MARKER}\\n 'no-restricted-imports': ${ruleValue},`\n );\n return { changed: true, output, canAutoApply: true };\n }\n\n const output = source.replace(\n /(module\\.exports\\s*=\\s*\\{)/,\n `$1\\n // ${VIBERAVEN_ESLINT_MARKER}\\n rules: {\\n 'no-restricted-imports': ${ruleValue},\\n },`\n );\n return { changed: true, output, canAutoApply: true };\n }\n\n return {\n changed: false,\n output: source,\n canAutoApply: false,\n reason: 'unsupported-legacy-eslint-module',\n };\n}\n\nfunction applyJsonRecipe(source: string): EslintRestrictedImportsRecipeResult {\n let config: Record<string, unknown>;\n try {\n config = JSON.parse(source) as Record<string, unknown>;\n } catch {\n return {\n changed: false,\n output: source,\n canAutoApply: false,\n reason: 'invalid-eslint-json',\n };\n }\n\n if (alreadyApplied(source)) {\n return { changed: false, output: source, canAutoApply: true };\n }\n\n const rules =\n typeof config.rules === 'object' && config.rules !== null && !Array.isArray(config.rules)\n ? { ...(config.rules as Record<string, unknown>) }\n : {};\n\n if ('no-restricted-imports' in rules) {\n return {\n changed: false,\n output: source,\n canAutoApply: false,\n reason: 'no-restricted-imports-already-defined',\n };\n }\n\n rules['no-restricted-imports'] = [\n 'error',\n {\n paths: RESTRICTED_PATHS,\n patterns: RESTRICTED_PATTERNS,\n },\n ];\n\n config.rules = rules;\n return {\n changed: true,\n output: `${JSON.stringify(config, null, 2)}\\n`,\n canAutoApply: true,\n };\n}\n\nexport function applyEslintRestrictedImportsRecipe(\n source: string,\n configFile: string\n): EslintRestrictedImportsRecipeResult {\n if (configFile.endsWith('.json')) {\n return applyJsonRecipe(source);\n }\n\n if (configFile.startsWith('eslint.config.')) {\n return applyFlatConfigRecipe(source);\n }\n\n return applyLegacyModuleRecipe(source);\n}\n", "/**\n * Recipe dispatcher for gap-based heal apply.\n *\n * This module routes `gapId` to the appropriate recipe function.\n * It is imported by apply.ts alongside the existing emptyCatch recipe.\n *\n * IMPORTANT: This does NOT modify apply.ts logic \u2014 it provides a standalone\n * dispatch function that apply.ts can call when gapId is present.\n */\n\nimport { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { applyAuthSecretRecipe } from './envAuthSecret';\nimport { applyNodeEnvRecipe } from './envNodeEnv';\nimport { applyDatabaseUrlRecipe } from './envDatabaseUrl';\nimport { applyErrorBoundaryRecipe } from './nextjsErrorBoundary';\nimport { applyHealthRouteRecipe } from './nextjsHealthRoute';\nimport { applyLoadingStateRecipe } from './nextjsLoadingState';\nimport { applyNotFoundRecipe } from './nextjsNotFound';\nimport { applyRlsRecipe } from './supabaseRls';\nimport { applyCspHeaderRecipe } from './nextjsCspHeader';\nimport { applyRateLimitRecipe } from './nextjsRateLimit';\nimport {\n applyEslintRestrictedImportsRecipe,\n detectEslintConfigFile,\n} from './eslintRestrictedImports';\n\nexport interface DispatchResult {\n /** Whether the recipe made a change */\n changed: boolean;\n /** The output content to write */\n output: string;\n /** The relative file path to write (relative to workspace root) */\n targetFile: string;\n /** Whether the recipe can be auto-applied (false = provider-action only) */\n canAutoApply: boolean;\n /** Human-readable reason if canAutoApply=false */\n reason?: string;\n /** Hint to install a dependency */\n dependencyHint?: string;\n /** Recipe name for the HealResult.recipe field */\n recipeName: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helper: determine default target file for a gapId\n// ---------------------------------------------------------------------------\n\nfunction defaultTargetFile(gapId: string): string | undefined {\n const map: Record<string, string> = {\n auth_secret_missing: '.env.local',\n node_env_not_set: '.env.local',\n database_url_missing: '.env.local',\n missing_error_boundary: 'app/error.tsx',\n missing_health_route: 'app/api/health/route.ts',\n missing_loading_state: 'app/loading.tsx',\n missing_404_page: 'app/not-found.tsx',\n rls_disabled: '', // no file \u2014 provider-action\n missing_csp_header: 'next.config.js',\n missing_rate_limit: 'middleware.ts',\n eslint_restricted_imports: '',\n };\n return map[gapId];\n}\n\n// ---------------------------------------------------------------------------\n// Helper: read existing file content or return '' if not found\n// ---------------------------------------------------------------------------\n\nasync function readSourceOrEmpty(absolutePath: string): Promise<string> {\n if (!existsSync(absolutePath)) return '';\n return readFile(absolutePath, 'utf8');\n}\n\n// ---------------------------------------------------------------------------\n// Helper: detect @upstash/ratelimit in the workspace package.json\n// ---------------------------------------------------------------------------\n\nasync function detectUpstash(cwd: string): Promise<boolean> {\n try {\n const pkgPath = join(cwd, 'package.json');\n if (!existsSync(pkgPath)) return false;\n const raw = await readFile(pkgPath, 'utf8');\n const pkg = JSON.parse(raw) as Record<string, unknown>;\n const deps = {\n ...(pkg['dependencies'] as Record<string, string> | undefined ?? {}),\n ...(pkg['devDependencies'] as Record<string, string> | undefined ?? {}),\n };\n return '@upstash/ratelimit' in deps;\n } catch {\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main dispatch function\n// ---------------------------------------------------------------------------\n\n/**\n * Dispatches a heal recipe by gapId.\n * Returns null if no recipe exists for this gapId (caller should fall back to emptyCatch).\n */\nexport async function dispatchRecipeByGapId(\n gapId: string,\n cwd: string,\n explicitTarget?: string\n): Promise<DispatchResult | null> {\n const targetFile = explicitTarget ?? defaultTargetFile(gapId);\n if (targetFile === undefined) return null; // unknown gapId\n\n // ---- env-add recipes ----\n if (\n gapId === 'auth_secret_missing' ||\n gapId === 'node_env_not_set' ||\n gapId === 'database_url_missing'\n ) {\n const absolutePath = join(cwd, targetFile);\n const source = await readSourceOrEmpty(absolutePath);\n let result: { changed: boolean; output: string };\n if (gapId === 'auth_secret_missing') result = applyAuthSecretRecipe(source);\n else if (gapId === 'node_env_not_set') result = applyNodeEnvRecipe(source);\n else result = applyDatabaseUrlRecipe(source);\n\n return {\n ...result,\n targetFile,\n canAutoApply: true,\n recipeName: gapId,\n };\n }\n\n // ---- file-create recipes ----\n if (gapId === 'missing_error_boundary') {\n const absolutePath = join(cwd, 'app/error.tsx');\n const source = await readSourceOrEmpty(absolutePath);\n const result = applyErrorBoundaryRecipe(source);\n return { ...result, canAutoApply: true, recipeName: gapId };\n }\n\n if (gapId === 'missing_health_route') {\n const absolutePath = join(cwd, 'app/api/health/route.ts');\n const source = await readSourceOrEmpty(absolutePath);\n const result = applyHealthRouteRecipe(source);\n return { ...result, canAutoApply: true, recipeName: gapId };\n }\n\n if (gapId === 'missing_loading_state') {\n const absolutePath = join(cwd, 'app/loading.tsx');\n const source = await readSourceOrEmpty(absolutePath);\n const result = applyLoadingStateRecipe(source);\n return { ...result, canAutoApply: true, recipeName: gapId };\n }\n\n if (gapId === 'missing_404_page') {\n const absolutePath = join(cwd, 'app/not-found.tsx');\n const source = await readSourceOrEmpty(absolutePath);\n const result = applyNotFoundRecipe(source);\n return { ...result, canAutoApply: true, recipeName: gapId };\n }\n\n // ---- provider-action only (no auto-apply) ----\n if (gapId === 'rls_disabled') {\n const result = applyRlsRecipe('');\n return {\n changed: false,\n output: '',\n targetFile: '',\n canAutoApply: false,\n reason: result.reason,\n recipeName: gapId,\n };\n }\n\n // ---- file-patch recipes ----\n if (gapId === 'missing_csp_header') {\n // Try next.config.js first, then next.config.mjs\n let configFile = 'next.config.js';\n let absolutePath = join(cwd, configFile);\n if (!existsSync(absolutePath)) {\n configFile = 'next.config.mjs';\n absolutePath = join(cwd, configFile);\n }\n const source = await readSourceOrEmpty(absolutePath);\n const result = applyCspHeaderRecipe(source);\n return {\n ...result,\n targetFile: configFile,\n recipeName: gapId,\n };\n }\n\n if (gapId === 'missing_rate_limit') {\n const hasUpstash = await detectUpstash(cwd);\n const middlewarePath = join(cwd, 'middleware.ts');\n const source = await readSourceOrEmpty(middlewarePath);\n const result = applyRateLimitRecipe(source, hasUpstash);\n return {\n ...result,\n targetFile: 'middleware.ts',\n canAutoApply: true,\n recipeName: gapId,\n };\n }\n\n if (gapId === 'eslint_restricted_imports') {\n const configFile = detectEslintConfigFile(cwd);\n if (!configFile) {\n return {\n changed: false,\n output: '',\n targetFile: '',\n canAutoApply: false,\n reason: 'no-eslint-config',\n recipeName: gapId,\n };\n }\n\n const absolutePath = join(cwd, configFile);\n const source = await readSourceOrEmpty(absolutePath);\n const result = applyEslintRestrictedImportsRecipe(source, configFile);\n return {\n changed: result.changed,\n output: result.output,\n targetFile: configFile,\n canAutoApply: result.canAutoApply,\n reason: result.reason,\n recipeName: gapId,\n };\n }\n\n return null; // no recipe for this gapId\n}\n\n/**\n * Returns true if a gap-based recipe exists for the given gapId.\n */\nexport function gapHasRecipe(gapId: string): boolean {\n return defaultTargetFile(gapId) !== undefined;\n}\n", "import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { dirname, join, relative } from 'node:path';\nimport { assertSafeHealTarget } from './pathSafety';\nimport { applyEmptyCatchRecipe } from './recipes/emptyCatch';\nimport { dispatchRecipeByGapId } from './recipes/index';\nimport type { HealCommandOptions, HealResult } from './types';\n\nfunction healId(): string {\n return `heal_${new Date().toISOString().replace(/\\D/g, '').slice(0, 14)}`;\n}\n\nexport async function applyHeal(options: HealCommandOptions): Promise<HealResult> {\n const id = healId();\n if (!options.yes) {\n return {\n $schema: 'https://viberaven.dev/schemas/heal-result.schema.json',\n schemaVersion: 'v1',\n runId: 'vr_heal_apply',\n healId: id,\n mode: 'apply',\n status: 'refused_dangerous',\n gapId: options.gapId,\n target: options.target,\n changedFiles: [],\n artifacts: {},\n rollback: { available: false, instructions: 'Re-run with --yes to allow guarded repo-code edits.' },\n };\n }\n\n // ---------------------------------------------------------------------------\n // Gap-based dispatch (W3): route by gapId when no explicit target is given,\n // or when gapId maps to a known recipe.\n // This block runs BEFORE the legacy emptyCatch path.\n // ---------------------------------------------------------------------------\n if (options.gapId) {\n const dispatched = await dispatchRecipeByGapId(\n options.gapId,\n options.cwd,\n options.target\n );\n\n if (dispatched !== null) {\n // Provider-action only \u2014 cannot auto-apply\n if (!dispatched.canAutoApply) {\n return {\n $schema: 'https://viberaven.dev/schemas/heal-result.schema.json',\n schemaVersion: 'v1',\n runId: 'vr_heal_apply',\n healId: id,\n mode: 'apply',\n status: 'refused_unsupported',\n gapId: options.gapId,\n changedFiles: [],\n artifacts: {},\n rollback: {\n available: false,\n instructions: dispatched.reason ?? 'This gap requires a manual provider-dashboard action.',\n },\n };\n }\n\n if (!dispatched.changed) {\n return {\n $schema: 'https://viberaven.dev/schemas/heal-result.schema.json',\n schemaVersion: 'v1',\n runId: 'vr_heal_apply',\n healId: id,\n mode: 'apply',\n status: 'refused_unsupported',\n gapId: options.gapId,\n target: dispatched.targetFile || options.target,\n changedFiles: [],\n artifacts: {},\n rollback: { available: false, instructions: 'Recipe matched but no change was needed (already applied or file already exists).' },\n };\n }\n\n // Write the output file\n const absoluteTarget = join(options.cwd, dispatched.targetFile);\n // Safety check on the resolved path\n assertSafeHealTarget(options.cwd, dispatched.targetFile);\n // Ensure parent directory exists (for file-create recipes)\n await mkdir(dirname(absoluteTarget), { recursive: true });\n\n // Save before snapshot only if the file existed\n const healDir = join(options.cwd, '.viberaven', 'heal', id);\n await mkdir(join(healDir, 'before'), { recursive: true });\n const beforeContent = existsSync(absoluteTarget)\n ? await readFile(absoluteTarget, 'utf8')\n : '';\n await writeFile(join(healDir, 'before', 'target.txt'), beforeContent, 'utf8');\n await writeFile(absoluteTarget, dispatched.output, 'utf8');\n\n const patch = [\n `--- ${dispatched.targetFile}`,\n `+++ ${dispatched.targetFile}`,\n '@@ VibeRaven guarded heal @@',\n beforeContent || '(new file)',\n '--- after ---',\n dispatched.output,\n '',\n ].join('\\n');\n await writeFile(join(healDir, 'patch.diff'), patch, 'utf8');\n\n const result: HealResult = {\n $schema: 'https://viberaven.dev/schemas/heal-result.schema.json',\n schemaVersion: 'v1',\n runId: 'vr_heal_apply',\n healId: id,\n mode: 'apply',\n status: 'applied_verify_not_run',\n gapId: options.gapId,\n recipe: dispatched.recipeName,\n target: dispatched.targetFile,\n changedFiles: [relative(options.cwd, absoluteTarget).replace(/\\\\/g, '/')],\n artifacts: {\n patch: `.viberaven/heal/${id}/patch.diff`,\n result: `.viberaven/heal/${id}/result.json`,\n },\n rollback: {\n available: true,\n instructions: 'Restore .viberaven/heal/<healId>/before/target.txt to the target file or apply the reverse patch.',\n },\n };\n await writeFile(join(healDir, 'result.json'), `${JSON.stringify(result, null, 2)}\\n`, 'utf8');\n return result;\n }\n // No recipe found for this gapId \u2014 fall through to legacy emptyCatch path\n }\n\n // ---------------------------------------------------------------------------\n // Legacy emptyCatch path (original behavior, unchanged)\n // ---------------------------------------------------------------------------\n\n if (!options.target) {\n return {\n $schema: 'https://viberaven.dev/schemas/heal-result.schema.json',\n schemaVersion: 'v1',\n runId: 'vr_heal_apply',\n healId: id,\n mode: 'apply',\n status: 'refused_unsupported',\n gapId: options.gapId,\n changedFiles: [],\n artifacts: {},\n rollback: { available: false, instructions: 'Apply requires a supported --target file in 1.0.' },\n };\n }\n\n const absolute = assertSafeHealTarget(options.cwd, options.target);\n const before = await readFile(absolute, 'utf8');\n const recipe = applyEmptyCatchRecipe(before);\n if (!recipe.changed) {\n return {\n $schema: 'https://viberaven.dev/schemas/heal-result.schema.json',\n schemaVersion: 'v1',\n runId: 'vr_heal_apply',\n healId: id,\n mode: 'apply',\n status: 'refused_unsupported',\n target: options.target,\n gapId: options.gapId,\n changedFiles: [],\n artifacts: {},\n rollback: { available: false, instructions: 'No supported heal recipe matched this file.' },\n };\n }\n\n const healDir = join(options.cwd, '.viberaven', 'heal', id);\n await mkdir(join(healDir, 'before'), { recursive: true });\n await writeFile(join(healDir, 'before', 'target.txt'), before, 'utf8');\n await writeFile(absolute, recipe.output, 'utf8');\n const patch = [\n `--- ${options.target}`,\n `+++ ${options.target}`,\n '@@ VibeRaven guarded heal @@',\n before,\n '--- after ---',\n recipe.output,\n '',\n ].join('\\n');\n await writeFile(join(healDir, 'patch.diff'), patch, 'utf8');\n\n const result: HealResult = {\n $schema: 'https://viberaven.dev/schemas/heal-result.schema.json',\n schemaVersion: 'v1',\n runId: 'vr_heal_apply',\n healId: id,\n mode: 'apply',\n status: 'applied_verify_not_run',\n gapId: options.gapId,\n recipe: 'empty-catch-safe-response',\n target: options.target,\n changedFiles: [relative(options.cwd, absolute).replace(/\\\\/g, '/')],\n artifacts: {\n patch: `.viberaven/heal/${id}/patch.diff`,\n result: `.viberaven/heal/${id}/result.json`,\n },\n rollback: {\n available: true,\n instructions: 'Restore .viberaven/heal/<healId>/before/target.txt to the target file or apply the reverse patch.',\n },\n };\n await writeFile(join(healDir, 'result.json'), `${JSON.stringify(result, null, 2)}\\n`, 'utf8');\n return result;\n}\n", "import { mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { PUBLIC_VERIFY_COMMAND } from '../contracts/commands';\nimport type { HealCommandOptions, HealResult } from './types';\n\nfunction healId(): string {\n return `heal_${new Date().toISOString().replace(/\\D/g, '').slice(0, 14)}`;\n}\n\nexport async function writeHealPlan(options: HealCommandOptions): Promise<HealResult> {\n const dir = join(options.cwd, '.viberaven');\n await mkdir(dir, { recursive: true });\n const id = healId();\n const target = options.target ?? `gap:${options.gapId}`;\n const markdown = [\n '# VibeRaven Heal Plan',\n '',\n `Target: \\`${target}\\``,\n `Mode: \\`${options.mode}\\``,\n '',\n 'This plan is non-destructive. It does not edit source files.',\n '',\n `Verify after manual fix: \\`${PUBLIC_VERIFY_COMMAND}\\``,\n '',\n ].join('\\n');\n\n const result: HealResult = {\n $schema: 'https://viberaven.dev/schemas/heal-result.schema.json',\n schemaVersion: 'v1',\n runId: 'vr_heal_plan',\n healId: id,\n mode: 'plan',\n status: 'planned',\n gapId: options.gapId,\n target: options.target,\n changedFiles: [],\n artifacts: { plan: '.viberaven/heal-plan.md' },\n rollback: { available: false, instructions: 'No source files were changed.' },\n };\n\n await writeFile(join(dir, 'heal-plan.md'), markdown, 'utf8');\n await writeFile(join(dir, 'heal-plan.json'), `${JSON.stringify(result, null, 2)}\\n`, 'utf8');\n return result;\n}\n", "import { mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { PUBLIC_VERIFY_COMMAND } from '../contracts/commands';\nimport type { HealCommandOptions, HealResult } from './types';\n\nfunction healId(): string {\n return `heal_${new Date().toISOString().replace(/\\D/g, '').slice(0, 14)}`;\n}\n\nexport async function writeHealPrompt(options: HealCommandOptions): Promise<HealResult> {\n const dir = join(options.cwd, '.viberaven');\n await mkdir(dir, { recursive: true });\n const id = healId();\n const target = options.target ?? `gap:${options.gapId}`;\n const prompt = [\n '# VibeRaven Heal Prompt',\n '',\n `Fix only this target: \\`${target}\\`.`,\n '',\n '- Do not request secrets.',\n '- Do not edit provider dashboards.',\n '- Do not change migrations, auth authorization logic, payment correctness, or webhook signature logic unless a VibeRaven recipe explicitly supports it.',\n `- After the fix, run \\`${PUBLIC_VERIFY_COMMAND}\\`.`,\n '',\n ].join('\\n');\n\n const result: HealResult = {\n $schema: 'https://viberaven.dev/schemas/heal-result.schema.json',\n schemaVersion: 'v1',\n runId: 'vr_heal_prompt',\n healId: id,\n mode: 'prompt',\n status: 'prompt_written',\n gapId: options.gapId,\n target: options.target,\n changedFiles: [],\n artifacts: { prompt: '.viberaven/heal-prompt.md' },\n rollback: { available: false, instructions: 'No source files were changed.' },\n };\n\n await writeFile(join(dir, 'heal-prompt.md'), prompt, 'utf8');\n return result;\n}\n", "import { readFile, writeFile, mkdir } from 'fs/promises';\nimport { join } from 'path';\n\nexport interface LoopState {\n batchApplied: number; // heals applied since last scan \u2014 resets to 0 after every verify\n lastGapCount: number; // gap count from most recent scan (-1 = never scanned)\n stalledScans: number; // consecutive scans where gap count did not drop\n appliedGapIdsSinceScan?: string[];\n}\n\nconst DEFAULT_LOOP_STATE: LoopState = {\n batchApplied: 0,\n lastGapCount: -1,\n stalledScans: 0,\n appliedGapIdsSinceScan: [],\n};\n\nfunction loopStatePath(workspaceRoot: string): string {\n return join(workspaceRoot, '.viberaven', 'loop-state.json');\n}\n\n/**\n * Read .viberaven/loop-state.json.\n * If missing or malformed, returns the default state. Never throws.\n */\nexport async function loadLoopState(workspaceRoot: string): Promise<LoopState> {\n try {\n const raw = await readFile(loopStatePath(workspaceRoot), 'utf8');\n const parsed = JSON.parse(raw) as unknown;\n if (\n parsed !== null &&\n typeof parsed === 'object' &&\n !Array.isArray(parsed) &&\n typeof (parsed as Record<string, unknown>).batchApplied === 'number' &&\n typeof (parsed as Record<string, unknown>).lastGapCount === 'number' &&\n typeof (parsed as Record<string, unknown>).stalledScans === 'number'\n ) {\n const p = parsed as Record<string, unknown>;\n const appliedGapIdsSinceScan = Array.isArray(p.appliedGapIdsSinceScan)\n ? p.appliedGapIdsSinceScan.filter((value): value is string => typeof value === 'string')\n : [];\n return {\n batchApplied: p.batchApplied as number,\n lastGapCount: p.lastGapCount as number,\n stalledScans: p.stalledScans as number,\n appliedGapIdsSinceScan,\n };\n }\n return { ...DEFAULT_LOOP_STATE };\n } catch {\n return { ...DEFAULT_LOOP_STATE };\n }\n}\n\n/**\n * Write .viberaven/loop-state.json.\n * Never throws \u2014 logs a warning on failure.\n */\nexport async function saveLoopState(workspaceRoot: string, state: LoopState): Promise<void> {\n try {\n const dir = join(workspaceRoot, '.viberaven');\n await mkdir(dir, { recursive: true });\n await writeFile(loopStatePath(workspaceRoot), JSON.stringify(state, null, 2) + '\\n', 'utf8');\n } catch (err) {\n console.warn('[VibeRaven] Could not save loop-state.json:', err instanceof Error ? err.message : String(err));\n }\n}\n\n/**\n * Increment batchApplied by 1 (pure, returns new state).\n */\nexport function incrementBatch(state: LoopState, gapId?: string): LoopState {\n const appliedGapIdsSinceScan = [...(state.appliedGapIdsSinceScan ?? [])];\n if (gapId && !appliedGapIdsSinceScan.includes(gapId)) {\n appliedGapIdsSinceScan.push(gapId);\n }\n return { ...state, batchApplied: state.batchApplied + 1, appliedGapIdsSinceScan };\n}\n\n/**\n * Called after every verify/scan. Resets batchApplied, updates stall tracking.\n *\n * Rules:\n * - Always set batchApplied = 0.\n * - If lastGapCount === -1 (first scan ever): stalledScans = 0, lastGapCount = newGapCount.\n * - If newGapCount < lastGapCount (progress): stalledScans = 0, lastGapCount = newGapCount.\n * - If newGapCount >= lastGapCount (no progress, not first scan): stalledScans + 1, lastGapCount = newGapCount.\n */\nexport function resetBatch(state: LoopState, newGapCount: number): LoopState {\n if (state.lastGapCount === -1) {\n // First scan ever\n return { batchApplied: 0, lastGapCount: newGapCount, stalledScans: 0, appliedGapIdsSinceScan: [] };\n }\n if (newGapCount < state.lastGapCount) {\n // Progress made\n return { batchApplied: 0, lastGapCount: newGapCount, stalledScans: 0, appliedGapIdsSinceScan: [] };\n }\n // No progress (newGapCount >= lastGapCount)\n return {\n batchApplied: 0,\n lastGapCount: newGapCount,\n stalledScans: state.stalledScans + 1,\n appliedGapIdsSinceScan: [],\n };\n}\n", "import { applyHeal } from '../heal/apply';\nimport { assertSafeHealTarget } from '../heal/pathSafety';\nimport { writeHealPlan } from '../heal/plan';\nimport { writeHealPrompt } from '../heal/prompt';\nimport type { HealCommandOptions, HealResult } from '../heal/types';\nimport { incrementBatch, loadLoopState, saveLoopState } from '../loopState';\n\nexport async function runHealCommand(options: HealCommandOptions): Promise<HealResult> {\n if (!options.target && !options.gapId) {\n throw new Error('Heal requires --target <file> or --gap <id>.');\n }\n\n if (options.target) {\n assertSafeHealTarget(options.cwd, options.target);\n }\n\n if (options.mode === 'plan') return writeHealPlan(options);\n if (options.mode === 'prompt') return writeHealPrompt(options);\n const result = await applyHeal(options);\n if (result.status.startsWith('applied_') && result.changedFiles.length > 0) {\n const loopState = await loadLoopState(options.cwd);\n await saveLoopState(options.cwd, incrementBatch(loopState, result.gapId));\n }\n return result;\n}\n", "import { readFile } from 'node:fs/promises';\r\nimport { existsSync } from 'node:fs';\r\nimport { join } from 'node:path';\r\n\r\nexport interface StackRecommendation {\r\n frontend: string;\r\n ui: string;\r\n database: string;\r\n auth: string;\r\n deploy: string;\r\n detected: boolean;\r\n reason: string;\r\n}\r\n\r\nconst DEFAULT_STACK: StackRecommendation = {\r\n frontend: 'react',\r\n ui: 'tailwind + shadcn/ui',\r\n database: 'supabase',\r\n auth: 'supabase',\r\n deploy: 'vercel',\r\n detected: false,\r\n reason: 'Agent-default stack for lowest launch friction when repo signals are ambiguous'\r\n};\r\n\r\nexport async function recommendStack(cwd: string = process.cwd()): Promise<StackRecommendation> {\r\n const pkgPath = join(cwd, 'package.json');\r\n if (!existsSync(pkgPath)) {\r\n return DEFAULT_STACK;\r\n }\r\n\r\n const pkg = JSON.parse(await readFile(pkgPath, 'utf-8')) as {\r\n dependencies?: Record<string, string>;\r\n devDependencies?: Record<string, string>;\r\n };\r\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\r\n const names = Object.keys(deps).join(' ').toLowerCase();\r\n\r\n const rec: StackRecommendation = {\r\n ...DEFAULT_STACK,\r\n detected: true,\r\n reason: 'Inferred from package.json dependencies'\r\n };\r\n\r\n if (names.includes('next')) {\r\n rec.frontend = 'next.js (react)';\r\n rec.deploy = 'vercel';\r\n } else if (names.includes('vite') || names.includes('react')) {\r\n rec.frontend = 'react';\r\n }\r\n\r\n if (names.includes('@supabase/supabase-js') || names.includes('supabase')) {\r\n rec.database = 'supabase';\r\n rec.auth = 'supabase';\r\n } else if (names.includes('@neondatabase') || names.includes('drizzle')) {\r\n rec.database = names.includes('neon') ? 'neon' : 'postgres';\r\n }\r\n\r\n if (names.includes('tailwindcss')) {\r\n rec.ui = names.includes('@radix-ui') ? 'tailwind + shadcn/ui' : 'tailwind';\r\n }\r\n\r\n if (names.includes('@clerk/')) {\r\n rec.auth = 'clerk';\r\n }\r\n\r\n return rec;\r\n}\r\n", "import { getAgentRulesTargets, initAgentRules, renderAgentRulesDryRun, formatAgentRulesInitSummary } from './initRules';\n\nexport async function runInitCommand(options: {\n cwd: string;\n agents?: string;\n dryRun?: boolean;\n}): Promise<number> {\n let targets;\n try {\n targets = getAgentRulesTargets(options.agents);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n return 1;\n }\n\n if (options.dryRun) {\n console.log(renderAgentRulesDryRun(targets));\n return 0;\n }\n\n const output = await initAgentRules({\n cwd: options.cwd,\n targets,\n dryRun: false,\n });\n\n console.log(formatAgentRulesInitSummary(output));\n return 0;\n}\n", "import { access, readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { PUBLIC_AGENT_MODE_COMMAND } from '../contracts/commands';\nimport { AGENT_RULE_TARGETS, CORE_AGENT_INJECTION_TARGETS } from './agentTargets';\n\nexport type DoctorCheckStatus = 'pass' | 'fail';\n\nexport type DoctorCheck = {\n id: string;\n status: DoctorCheckStatus;\n message: string;\n};\n\nexport type DoctorAgentsReport = {\n ok: boolean;\n checks: DoctorCheck[];\n};\n\nconst REQUIRED_EXISTENCE_CHECKS = [\n { id: 'agents-md', file: 'AGENTS.md' },\n { id: 'claude-md', file: 'CLAUDE.md' },\n { id: 'cursor-core-rule', file: '.cursor/rules/viberaven-core.mdc' },\n { id: 'copilot-instructions', file: '.github/copilot-instructions.md' },\n] as const;\n\nconst OPTIONAL_CURSOR_PACK_CHECKS = [\n { id: 'cursor-supabase-rule', file: '.cursor/rules/viberaven-supabase-rls.mdc' },\n { id: 'cursor-deploy-rule', file: '.cursor/rules/viberaven-deploy.mdc' },\n { id: 'cursor-payments-rule', file: '.cursor/rules/viberaven-payments.mdc' },\n] as const;\n\nconst STALE_PATTERNS = [\n { id: 'stale-beta-scan', pattern: '@beta scan' },\n { id: 'stale-viberaven-station', pattern: 'viberaven-station' },\n { id: 'stale-viberice', pattern: 'viberice' },\n] as const;\n\nexport async function checkAgentInjection(cwd: string): Promise<DoctorAgentsReport> {\n const checks: DoctorCheck[] = [];\n\n for (const item of REQUIRED_EXISTENCE_CHECKS) {\n const exists = await fileExists(join(cwd, item.file));\n checks.push({\n id: item.id,\n status: exists ? 'pass' : 'fail',\n message: exists ? `${item.file} exists` : `Missing ${item.file}`,\n });\n }\n\n for (const item of OPTIONAL_CURSOR_PACK_CHECKS) {\n const exists = await fileExists(join(cwd, item.file));\n checks.push({\n id: item.id,\n status: exists ? 'pass' : 'fail',\n message: exists\n ? `${item.file} exists`\n : `Missing ${item.file} \u2014 run npx -y viberaven init --agents all`,\n });\n }\n\n const legacyCursorPath = join(cwd, '.cursor/rules/viberaven.mdc');\n if (await fileExists(legacyCursorPath)) {\n const legacyContent = await readFile(legacyCursorPath, 'utf-8');\n const hasCoreSplit = await fileExists(join(cwd, '.cursor/rules/viberaven-core.mdc'));\n if (!hasCoreSplit || legacyContent.includes('alwaysApply: true')) {\n checks.push({\n id: 'cursor-legacy-mdc',\n status: 'fail',\n message:\n 'Legacy .cursor/rules/viberaven.mdc detected \u2014 run npx -y viberaven init --agents all to migrate to the split Cursor pack',\n });\n }\n }\n\n for (const target of CORE_AGENT_INJECTION_TARGETS) {\n const file =\n target === 'cursor' ? '.cursor/rules/viberaven-core.mdc' : AGENT_RULE_TARGETS[target].file;\n const path = join(cwd, file);\n const exists = await fileExists(path);\n\n if (!exists) {\n checks.push({\n id: `canonical-${target}`,\n status: 'fail',\n message: `Cannot verify canonical command \u2014 missing ${file}`,\n });\n continue;\n }\n\n const content = await readFile(path, 'utf-8');\n const hasCommand = content.includes(PUBLIC_AGENT_MODE_COMMAND);\n checks.push({\n id: `canonical-${target}`,\n status: hasCommand ? 'pass' : 'fail',\n message: hasCommand\n ? `Canonical command found in ${file}`\n : `Missing canonical command in ${file}`,\n });\n\n for (const stale of STALE_PATTERNS) {\n if (content.includes(stale.pattern)) {\n checks.push({\n id: `${stale.id}-${target}`,\n status: 'fail',\n message: `Stale ${stale.pattern} reference in ${file}`,\n });\n }\n }\n }\n\n return {\n ok: checks.every((check) => check.status === 'pass'),\n checks,\n };\n}\n\nexport function formatDoctorAgentsReport(report: DoctorAgentsReport): string {\n const lines = ['VibeRaven agent injection doctor', ''];\n\n for (const check of report.checks) {\n const icon = check.status === 'pass' ? '\u2713' : '\u2717';\n lines.push(`${icon} ${check.message}`);\n }\n\n lines.push('');\n lines.push(report.ok ? 'All agent injection checks passed.' : 'Agent injection checks failed.');\n return lines.join('\\n');\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n", "import { checkAgentInjection, formatDoctorAgentsReport } from './doctorAgents';\n\nexport async function runDoctorAgentsCommand(options: { cwd: string }): Promise<number> {\n const report = await checkAgentInjection(options.cwd);\n console.log(formatDoctorAgentsReport(report));\n return report.ok ? 0 : 1;\n}\n", "/** Top npm packages common in AI-built app stacks (typosquat reference list). */\nexport const POPULAR_NPM_PACKAGES: readonly string[] = [\n 'next',\n 'react',\n 'react-dom',\n 'vue',\n '@vue/cli',\n 'express',\n 'lodash',\n 'axios',\n 'stripe',\n '@stripe/stripe-js',\n 'supabase',\n '@supabase/supabase-js',\n '@prisma/client',\n 'prisma',\n 'typescript',\n 'eslint',\n 'prettier',\n 'tailwindcss',\n 'vite',\n 'zod',\n 'dotenv',\n 'jsonwebtoken',\n 'bcrypt',\n 'mongoose',\n 'pg',\n 'redis',\n 'ioredis',\n 'winston',\n '@sentry/node',\n '@sentry/nextjs',\n 'firebase',\n '@clerk/nextjs',\n 'openai',\n '@anthropic-ai/sdk',\n 'vercel',\n '@vercel/analytics',\n];\n", "import { PUBLIC_AGENT_MODE_COMMAND } from '../contracts/commands';\nimport { POPULAR_NPM_PACKAGES } from './popularPackages';\n\nexport type NpmPackageVerdict = 'ok' | 'not_found' | 'suspicious';\n\nexport interface NpmPackageValidation {\n name: string;\n verdict: NpmPackageVerdict;\n reasons: string[];\n registryUrl: string;\n followUpCommand: typeof PUBLIC_AGENT_MODE_COMMAND;\n}\n\nconst REGISTRY_BASE = 'https://registry.npmjs.org';\nconst NEW_PACKAGE_DAYS = 14;\nconst TYPOSQUAT_MAX_DISTANCE = 2;\nconst LOW_PUBLISH_COUNT = 3;\n\ntype NpmRegistryPackage = {\n description?: string;\n maintainers?: unknown[];\n time?: { created?: string };\n versions?: Record<string, unknown>;\n};\n\nexport function levenshteinDistance(a: string, b: string): number {\n if (a === b) return 0;\n if (a.length === 0) return b.length;\n if (b.length === 0) return a.length;\n\n const matrix: number[][] = Array.from({ length: a.length + 1 }, () =>\n Array.from({ length: b.length + 1 }, () => 0)\n );\n\n for (let i = 0; i <= a.length; i += 1) matrix[i][0] = i;\n for (let j = 0; j <= b.length; j += 1) matrix[0][j] = j;\n\n for (let i = 1; i <= a.length; i += 1) {\n for (let j = 1; j <= b.length; j += 1) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n matrix[i][j] = Math.min(\n matrix[i - 1][j] + 1,\n matrix[i][j - 1] + 1,\n matrix[i - 1][j - 1] + cost\n );\n }\n }\n\n return matrix[a.length][b.length];\n}\n\nfunction daysSince(isoDate: string, now = Date.now()): number {\n const created = Date.parse(isoDate);\n if (!Number.isFinite(created)) return Number.POSITIVE_INFINITY;\n return (now - created) / (1000 * 60 * 60 * 24);\n}\n\nfunction closestPopularPackage(name: string): { pkg: string; distance: number } | null {\n let best: { pkg: string; distance: number } | null = null;\n\n for (const popular of POPULAR_NPM_PACKAGES) {\n const distance = levenshteinDistance(name, popular);\n if (distance <= TYPOSQUAT_MAX_DISTANCE && (!best || distance < best.distance)) {\n best = { pkg: popular, distance };\n }\n }\n\n return best;\n}\n\nfunction buildBase(name: string): Pick<NpmPackageValidation, 'name' | 'registryUrl' | 'followUpCommand'> {\n const normalized = name.trim().toLowerCase();\n return {\n name: normalized,\n registryUrl: `${REGISTRY_BASE}/${encodeURIComponent(normalized)}`,\n followUpCommand: PUBLIC_AGENT_MODE_COMMAND,\n };\n}\n\nexport async function validateNpmPackage(\n name: string,\n options?: { fetch?: typeof fetch; now?: number }\n): Promise<NpmPackageValidation> {\n const fetchFn = options?.fetch ?? fetch;\n const now = options?.now ?? Date.now();\n const base = buildBase(name);\n\n if (!base.name) {\n return {\n ...base,\n verdict: 'not_found',\n reasons: ['Package name is empty.'],\n };\n }\n\n let response: Response;\n try {\n response = await fetchFn(base.registryUrl);\n } catch {\n return {\n ...base,\n verdict: 'not_found',\n reasons: ['Could not reach the public npm registry.'],\n };\n }\n\n if (response.status === 404) {\n return {\n ...base,\n verdict: 'not_found',\n reasons: [`Package \"${base.name}\" was not found on the public npm registry.`],\n };\n }\n\n if (!response.ok) {\n return {\n ...base,\n verdict: 'suspicious',\n reasons: [`Unexpected npm registry response: HTTP ${response.status}.`],\n };\n }\n\n const data = (await response.json()) as NpmRegistryPackage;\n const reasons: string[] = [];\n let suspicious = false;\n\n const created = data.time?.created;\n if (created) {\n const ageDays = daysSince(created, now);\n const closest = closestPopularPackage(base.name);\n if (ageDays < NEW_PACKAGE_DAYS && closest && closest.pkg !== base.name) {\n suspicious = true;\n reasons.push(\n `Package was published ${Math.max(0, Math.floor(ageDays))} day(s) ago and its name is within ${TYPOSQUAT_MAX_DISTANCE} character edits of popular package \"${closest.pkg}\".`\n );\n }\n }\n\n const description = (data.description ?? '').trim();\n const maintainerCount = Array.isArray(data.maintainers) ? data.maintainers.length : 0;\n const publishCount = data.versions ? Object.keys(data.versions).length : 0;\n\n if (!description && maintainerCount === 0 && publishCount <= LOW_PUBLISH_COUNT) {\n suspicious = true;\n reasons.push(\n 'Package has an empty description, no listed maintainers, and very few published versions.'\n );\n }\n\n if (suspicious) {\n return { ...base, verdict: 'suspicious', reasons };\n }\n\n return {\n ...base,\n verdict: 'ok',\n reasons: ['Package exists on the public npm registry with no v1 suspicious signals.'],\n };\n}\n\nexport async function validateNpmPackages(\n names: string[],\n options?: { fetch?: typeof fetch; now?: number }\n): Promise<NpmPackageValidation[]> {\n return Promise.all(names.map((name) => validateNpmPackage(name, options)));\n}\n", "import { validateNpmPackage, validateNpmPackages } from '../npm/validateNpmPackage';\n\nexport async function runValidateNpmPackageCommand(options: {\n names: string[];\n json?: boolean;\n}): Promise<number> {\n const names = options.names.map((name) => name.trim()).filter(Boolean);\n\n if (names.length === 0) {\n console.error('Usage: viberaven validate-npm-package [--json] <package> [package...]');\n return 1;\n }\n\n const results =\n names.length === 1\n ? [await validateNpmPackage(names[0])]\n : await validateNpmPackages(names);\n\n const payload = names.length === 1 ? results[0] : { results };\n\n if (options.json) {\n console.log(JSON.stringify(payload, null, 2));\n } else {\n for (const result of results) {\n console.log(`${result.name}: ${result.verdict}`);\n for (const reason of result.reasons) {\n console.log(` - ${reason}`);\n }\n console.log(` followUp: ${result.followUpCommand}`);\n }\n }\n\n const hasBlocking = results.some((result) => result.verdict !== 'ok');\n return hasBlocking ? 2 : 0;\n}\n", "import {\n buildVercelSupabaseAudit,\n collectVercelSupabaseAuditInput,\n renderVercelSupabaseAudit,\n} from './audit';\n\nexport async function runAuditCommand(input: {\n cwd: string;\n json?: boolean;\n}): Promise<number> {\n const auditInput = await collectVercelSupabaseAuditInput(input.cwd);\n const result = buildVercelSupabaseAudit(auditInput);\n\n if (input.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else {\n process.stdout.write(`${renderVercelSupabaseAudit(result)}\\n`);\n }\n\n return result.status === 'pass' ? 0 : 1;\n}\n", "import type { VibeRavenAction, VibeRavenActionsManifest, VibeRavenActionTarget } from './types';\n\nfunction redact(text: string): string {\n return text\n .replace(\n /\\b([A-Z0-9_]*(?:SECRET|TOKEN|KEY|PASSWORD|DATABASE_URL|POSTGRES_URL|SERVICE_ROLE)[A-Z0-9_]*)=([^,\\s]+)/gi,\n '$1=<redacted>',\n )\n .replace(/\\bpostgres(?:ql)?:\\/\\/[^@\\s]+@/gi, 'postgresql://<redacted>@')\n .replace(/[A-Za-z]:\\\\[^\\s`\"]+/g, '<repo-relative-path>')\n .replace(/\\b\\/Users\\/[^\\s`\"]+/g, '<repo-relative-path>')\n .replace(/\\b\\/home\\/[^\\s`\"]+/g, '<repo-relative-path>')\n .replace(/\\beyJ[A-Za-z0-9._-]*\\b/g, '<redacted>');\n}\n\nfunction stringifyPayload(value: unknown): string {\n if (Array.isArray(value)) {\n return value.map((entry) => String(entry)).join('\\n');\n }\n if (value && typeof value === 'object') {\n return JSON.stringify(value, null, 2);\n }\n return String(value ?? '');\n}\n\nfunction fenceFor(format: string): string {\n if (format === 'bash' || format === 'sql' || format === 'json') {\n return format;\n }\n return 'txt';\n}\n\nfunction renderTarget(target: VibeRavenActionTarget | undefined): string[] {\n if (!target) {\n return [];\n }\n\n if (target.type === 'url') {\n return [`Open: ${redact(target.href || target.label)}`];\n }\n if (target.type === 'file') {\n return [`File: ${redact(target.path)}`];\n }\n if (target.type === 'command') {\n return ['Run:', '```bash', redact(target.command), '```'];\n }\n if (target.type === 'provider') {\n return [`Provider: ${redact(target.label)}`];\n }\n return ['Verify:', '```bash', redact(target.command), '```'];\n}\n\nfunction renderReadiness(action: VibeRavenAction): string | undefined {\n const readiness = action.readiness?.slice(0, 2).map(redact).filter(Boolean);\n if (!readiness || readiness.length === 0) {\n return undefined;\n }\n return `Ready: ${readiness.join(', ')}`;\n}\n\nfunction renderCopyPayload(action: VibeRavenAction): string[] {\n const payload = action.copyPayloads?.[0];\n if (!payload) {\n return [];\n }\n\n const raw = stringifyPayload(payload.value);\n if (raw.length > 500) {\n return [];\n }\n\n return [`Copy: ${redact(payload.label)}`, `\\`\\`\\`${fenceFor(payload.format)}`, redact(raw), '```'];\n}\n\nfunction renderVerifyCommand(action: VibeRavenAction): string[] {\n if (!action.verifyCommand) {\n return [];\n }\n if (action.target?.type === 'verify' && action.target.command === action.verifyCommand) {\n return [];\n }\n return ['Verify:', '```bash', redact(action.verifyCommand), '```'];\n}\n\nfunction renderAction(action: VibeRavenAction): string[] {\n return [\n `[${action.id}] ${redact(action.title)}`,\n `Status: ${action.status}`,\n renderReadiness(action),\n ...renderTarget(action.target),\n ...renderCopyPayload(action),\n ...renderVerifyCommand(action),\n action.resumeInstruction ? `Resume: \"${redact(action.resumeInstruction)}\"` : undefined,\n ].filter((line): line is string => Boolean(line));\n}\n\nexport function renderActionSurface(\n manifest: VibeRavenActionsManifest,\n options: { limit?: number } = {},\n): string {\n const visibleActions =\n typeof options.limit === 'number' ? manifest.actions.slice(0, options.limit) : manifest.actions;\n\n const lines = [\n 'VibeRaven Production Actions',\n `Gate: ${manifest.gateStatus}`,\n `Showing: ${visibleActions.length} of ${manifest.actions.length} current actions`,\n 'Full state: .viberaven/actions.json',\n '',\n ];\n\n for (const action of visibleActions) {\n lines.push(...renderAction(action), '');\n }\n\n return `${lines.join('\\n').trimEnd()}\\n`;\n}\n", "import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { renderActionSurface } from '../actions/render';\nimport type { VibeRavenActionsManifest } from '../actions/types';\nimport { getProjectArtifactsDir } from '../config';\n\nexport async function runActionsCommand(input: { cwd: string; json?: boolean }): Promise<number> {\n const actionsPath = join(getProjectArtifactsDir(input.cwd), 'actions.json');\n let raw: string;\n\n try {\n raw = await readFile(actionsPath, 'utf8');\n } catch {\n process.stderr.write('No VibeRaven actions found. Run `npx -y viberaven --agent-mode` first.\\n');\n return 1;\n }\n\n if (input.json) {\n process.stdout.write(raw.endsWith('\\n') ? raw : `${raw}\\n`);\n return 0;\n }\n\n const manifest = JSON.parse(raw) as VibeRavenActionsManifest;\n process.stdout.write(renderActionSurface(manifest));\n return 0;\n}\n", "import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { resolveActionById } from '../actions/registry';\nimport type { VibeRavenActionsManifest } from '../actions/types';\nimport { getProjectArtifactsDir } from '../config';\n\nasync function currentActionExists(cwd: string, actionId: string): Promise<boolean> {\n try {\n const raw = await readFile(join(getProjectArtifactsDir(cwd), 'actions.json'), 'utf8');\n const manifest = JSON.parse(raw) as VibeRavenActionsManifest;\n return manifest.actions.some((action) => action.id === actionId);\n } catch {\n return false;\n }\n}\n\nexport async function runVerifyActionCommand(input: { cwd: string; actionId: string }): Promise<number> {\n const entry = await resolveActionById(input.cwd, input.actionId);\n if (!entry) {\n process.stdout.write(\n `Action ${input.actionId} is not in the registry. Run \\`npx -y viberaven actions\\` for current actions.\\n`,\n );\n return 1;\n }\n\n if (entry.status === 'resolved') {\n process.stdout.write(\n `Action ${entry.id} (${entry.title ?? 'untitled action'}) is already resolved. Run \\`npx -y viberaven actions\\` for current actions.\\n`,\n );\n return 0;\n }\n\n if (entry.status === 'replaced') {\n process.stdout.write(\n `Action ${entry.id} (${entry.title ?? 'untitled action'}) was replaced${entry.replacedBy ? ` by ${entry.replacedBy}` : ''}. Run \\`npx -y viberaven actions\\` for current actions.\\n`,\n );\n return 1;\n }\n\n if (entry.status === 'stale' || !(await currentActionExists(input.cwd, input.actionId))) {\n process.stdout.write(\n `Action ${entry.id} (${entry.title ?? 'untitled action'}) is not in the current action surface. Run \\`npx -y viberaven actions\\` or rescan with \\`npx -y viberaven --agent-mode\\`.\\n`,\n );\n return 1;\n }\n\n process.stdout.write(\n `Verifying ${entry.id} (${entry.title ?? 'untitled action'}).\\nRun \\`npx -y viberaven --verify\\` to refresh the production gate for this action.\\n`,\n );\n return 0;\n}\n", "import type { TaskItem } from '../contracts/taskItem';\nimport type { LoopState } from '../loopState';\n\nexport type NextActionExecutionStep = {\n kind:\n | 'apply-repo-fix'\n | 'open-provider-step'\n | 'wait-for-user'\n | 'verify'\n | 'continue-loop'\n | 'upgrade'\n | 'stop';\n command?: string;\n note?: string;\n};\n\nexport interface NextActionBlock {\n gapId?: string;\n type: 'repo-code' | 'verify' | 'provider-action' | 'upgrade-required' | 'stalled' | 'done';\n title: string;\n agentInstruction: string;\n executionPlan: NextActionExecutionStep[];\n mcpTool?: string;\n mcpArgs?: Record<string, unknown>;\n fallbackCommand?: string;\n requiresUserAction: boolean;\n batchSize: number;\n batchApplied: number;\n remainingInBatch: number;\n scanNow: boolean;\n stalled: boolean;\n stalledScans: number;\n stallReason?: 'no-recipes' | 'provider-action-required' | 'unknown';\n upgradeUrl?: string;\n}\n\n/**\n * Build the VIBERAVEN_NEXT_ACTION block from the current task list and loop state.\n *\n * Priority order:\n * stalled > verify (scanNow) > repo-code > provider-action > upgrade-required > done\n */\nexport function buildNextActionBlock(\n tasks: TaskItem[],\n loopState: LoopState,\n plan: string\n): NextActionBlock {\n const batchSize = plan === 'pro' ? 10 : 3;\n const batchApplied = loopState.batchApplied;\n const remainingInBatch = batchSize - batchApplied;\n const scanNow = batchApplied >= batchSize;\n const stalled = loopState.stalledScans >= 2;\n const stalledScans = loopState.stalledScans;\n\n const base = { batchSize, batchApplied, remainingInBatch, scanNow, stalled, stalledScans };\n\n if (stalled) {\n const stallReason = resolveStallReason(tasks);\n return {\n ...base,\n type: 'stalled',\n title: 'Loop stalled - no gap reduction after 2+ consecutive scans',\n agentInstruction:\n 'Stop the scan loop. Explain the blocker plainly, then either guide the provider/user action or report that no safe repo-code recipe is available.',\n executionPlan: [\n { kind: 'stop', note: 'Do not keep spending scans while the loop is stalled.' },\n ],\n requiresUserAction: true,\n stallReason,\n };\n }\n\n if (scanNow) {\n return {\n ...base,\n type: 'verify',\n title: 'Batch complete - run verify to rescan before next batch',\n agentInstruction:\n 'Run verify now, read the refreshed VibeRaven artifacts, then continue with the next safe repo fix or provider step. Do not stop at a summary.',\n executionPlan: [\n { kind: 'verify', command: 'viberaven_verify' },\n { kind: 'continue-loop', note: 'After verify, continue until the gate is clear or a provider/user blocker remains.' },\n ],\n mcpTool: 'viberaven_verify',\n mcpArgs: {},\n requiresUserAction: false,\n };\n }\n\n const repoCodeTask = tasks.find((task) => task.fixType === 'repo-code' && !task.requiresUserAction);\n if (repoCodeTask) {\n const fallbackCommand = repoCodeTask.mcpArgs\n ? `npx -y viberaven --heal --apply --gap ${repoCodeTask.gapId} --yes`\n : undefined;\n\n return {\n ...base,\n type: 'repo-code',\n gapId: repoCodeTask.gapId,\n title: repoCodeTask.title,\n agentInstruction:\n 'Apply this repo-code fix now using the MCP tool or fallback command, then continue the local VibeRaven loop. Do not stop at a summary.',\n executionPlan: [\n {\n kind: 'apply-repo-fix',\n command: repoCodeTask.mcpTool ?? fallbackCommand,\n note: 'Patch only this gap and preserve unrelated user changes.',\n },\n { kind: 'continue-loop', note: 'Apply remaining safe repo fixes until the batch is full, then verify once.' },\n ],\n mcpTool: repoCodeTask.mcpTool,\n mcpArgs: repoCodeTask.mcpArgs,\n fallbackCommand,\n requiresUserAction: false,\n };\n }\n\n const providerTask = tasks.find((task) => task.fixType === 'provider-action');\n if (providerTask) {\n return {\n ...base,\n type: 'provider-action',\n gapId: providerTask.gapId,\n title: providerTask.title,\n agentInstruction:\n 'Open or present the provider step now. If browser/tool access is available, open the dashboard link for the user; otherwise show the exact step and copy values. Do not keep telling the user to verify until the provider step is done.',\n executionPlan: [\n { kind: 'open-provider-step', note: 'Use VIBERAVEN_PROVIDER_ACTION for the exact dashboard step and URL.' },\n { kind: 'wait-for-user', note: 'Wait for confirmation or read-only MCP evidence before verifying.' },\n ],\n requiresUserAction: true,\n };\n }\n\n const upgradeTask = tasks.find((task) => task.fixType === 'upgrade-required');\n if (upgradeTask) {\n return {\n ...base,\n type: 'upgrade-required',\n gapId: upgradeTask.gapId,\n title: upgradeTask.title,\n agentInstruction:\n 'Explain that this production lane needs an upgrade or connected provider evidence. Continue with any remaining unlocked repo-code fixes if present; otherwise stop cleanly.',\n executionPlan: [\n { kind: 'upgrade', command: 'https://viberaven.dev/pricing' },\n { kind: 'stop', note: 'Do not pretend locked lanes or provider state were fixed locally.' },\n ],\n requiresUserAction: true,\n upgradeUrl: 'https://viberaven.dev/pricing',\n };\n }\n\n return {\n ...base,\n type: 'done',\n title: 'All gaps resolved - production gate is clear',\n agentInstruction:\n 'The repo-code gate is clear. Run strict before deploy and still verify provider dashboard state through MCP or the provider dashboard.',\n executionPlan: [\n { kind: 'verify', command: 'npx -y viberaven --strict' },\n { kind: 'stop', note: 'Do not deploy until provider dashboard state is verified where applicable.' },\n ],\n requiresUserAction: false,\n };\n}\n\nfunction resolveStallReason(\n tasks: TaskItem[]\n): 'no-recipes' | 'provider-action-required' | 'unknown' {\n if (tasks.length === 0) return 'no-recipes';\n\n const allUpgradeOrEmpty = tasks.every((task) => task.fixType === 'upgrade-required');\n if (allUpgradeOrEmpty) return 'no-recipes';\n\n const allProviderAction = tasks.every((task) => task.fixType === 'provider-action');\n if (allProviderAction) return 'provider-action-required';\n\n return 'unknown';\n}\n\nconst NEXT_ACTION_START = 'VIBERAVEN_NEXT_ACTION_START';\nconst NEXT_ACTION_END = 'VIBERAVEN_NEXT_ACTION_END';\n\nconst PROVIDER_ACTION_START = 'VIBERAVEN_PROVIDER_ACTION_START';\nconst PROVIDER_ACTION_END = 'VIBERAVEN_PROVIDER_ACTION_END';\n\n/**\n * Build the VIBERAVEN_PROVIDER_ACTION JSON object for a provider-action task.\n */\nexport function buildProviderActionBlock(task: TaskItem): object | undefined {\n if (task.fixType !== 'provider-action' || !task.providerAction) {\n return undefined;\n }\n\n const pa = task.providerAction;\n return {\n VIBERAVEN_PROVIDER_ACTION: {\n gap: task.gapId,\n provider: pa.provider,\n dashboardUrl: pa.dashboardUrl,\n exactStep: pa.exactStep,\n envKeyName: pa.envKeyName ?? null,\n envKeyExample: pa.envKeyExample ?? null,\n doneSignal: pa.doneSignal,\n verifyCommand: task.verifyCommand,\n mcpAlternative: task.mcpTool ?? pa.mcpAlternative ?? null,\n },\n };\n}\n\n/**\n * Print the VIBERAVEN_PROVIDER_ACTION block to stdout for the first\n * provider-action task that requires user action.\n */\nexport function printProviderActionBlock(tasks: TaskItem[]): void {\n const task = tasks.find(\n (entry) => entry.fixType === 'provider-action' && entry.requiresUserAction === true\n );\n if (!task) return;\n\n const block = buildProviderActionBlock(task);\n if (!block) return;\n\n console.log(PROVIDER_ACTION_START);\n console.log(JSON.stringify(block, null, 2));\n console.log(PROVIDER_ACTION_END);\n}\n\n/**\n * Print the VIBERAVEN_NEXT_ACTION block to stdout.\n */\nexport function printNextActionBlock(block: NextActionBlock): void {\n console.log(NEXT_ACTION_START);\n console.log(JSON.stringify(block, null, 2));\n console.log(NEXT_ACTION_END);\n}\n", "import pc from 'picocolors';\nimport { buildTaskList } from '../buildTaskList';\nimport { buildNextActionBlock } from '../output/nextActionBlock';\nimport type { CliScanArtifact } from '../types';\nimport { VERSION } from '../version';\n\nfunction previewArtifact(cwd: string): CliScanArtifact {\n return {\n version: 1,\n scannedAt: new Date().toISOString(),\n workspacePath: cwd,\n score: 42,\n scoreLabel: 'Blocked',\n summary: 'Vercel, Supabase, and Stripe are detected, but launch-critical provider setup is not proven yet.',\n archetype: 'ai-built-saas',\n plan: 'free',\n productionCorePercent: 40,\n usage: {\n plan: 'free',\n remainingPrompts: 0,\n used: 0,\n limit: 0,\n period: 'lifetime',\n unlockedMapCategoryKeys: ['appFlow', 'frontend', 'backend', 'auth', 'database', 'payments'],\n },\n gaps: [\n {\n id: 'auth_secret_missing',\n category: 'SECURITY & AUTH',\n severity: 'critical',\n title: 'Create production auth secret',\n detail: 'The app needs a production session secret before real users sign in.',\n copyPrompt: 'Generate and document NEXTAUTH_SECRET or the equivalent auth secret for this stack.',\n toolSuggestions: [],\n mcpSuggestion: null,\n primaryMapCategory: 'auth',\n affectedMapCategories: [],\n },\n {\n id: 'rls_disabled',\n category: 'DATABASE & DATA',\n severity: 'critical',\n title: 'Verify Supabase RLS before launch',\n detail: 'Database access must be protected by Row Level Security or equivalent server-side controls.',\n copyPrompt: 'Open Supabase and verify RLS policies for user-owned tables.',\n toolSuggestions: [],\n mcpSuggestion: null,\n primaryMapCategory: 'database',\n affectedMapCategories: [],\n },\n {\n id: 'stripe_webhook_secret_missing',\n category: 'PAYMENTS',\n severity: 'critical',\n title: 'Connect Stripe webhook secret',\n detail: 'Stripe webhook signature verification needs STRIPE_WEBHOOK_SECRET before live payments.',\n copyPrompt: 'Create a Stripe webhook endpoint and add STRIPE_WEBHOOK_SECRET to the deployment environment.',\n toolSuggestions: [],\n mcpSuggestion: null,\n primaryMapCategory: 'payments',\n affectedMapCategories: [],\n },\n ],\n missionGraph: {\n areas: [],\n byArea: {},\n byProvider: {},\n repositoryEvidence: { env: [], security: [] },\n },\n stackWiring: { items: [], byKey: {} },\n providerRegistry: {\n version: 1,\n source: 'bundled',\n generatedAt: new Date().toISOString(),\n status: 'fresh',\n staleAfterDays: 14,\n providers: [],\n },\n } as CliScanArtifact;\n}\n\nfunction check(done: boolean, text: string): string {\n const mark = done ? pc.green('[x]') : pc.yellow('[ ]');\n return ` ${mark} ${text}`;\n}\n\nexport async function runPreviewCommand(options: {\n cwd: string;\n agentMode: boolean;\n json: boolean;\n}): Promise<number> {\n const artifact = previewArtifact(options.cwd);\n const tasks = buildTaskList(artifact);\n const next = buildNextActionBlock(tasks, {\n batchApplied: 1,\n appliedGapIdsSinceScan: ['auth_secret_missing'],\n lastGapCount: artifact.gaps.length,\n stalledScans: 0,\n }, 'free');\n\n if (options.json) {\n console.log(JSON.stringify({ artifact, tasks, next }, null, 2));\n return 0;\n }\n\n console.log(pc.dim(`VibeRaven ${VERSION} preview - local rehearsal, no login or API spend.`));\n console.log(pc.bold('VibeRaven'));\n console.log('Taking this app from demo to production.');\n console.log('');\n console.log(`${pc.bold('Status:')} ${pc.red('BLOCKED')} | vercel + supabase + stripe | 3 launch gaps`);\n console.log('');\n console.log(pc.bold('Progress'));\n console.log(check(true, 'Understand the stack and launch gaps'));\n console.log(check(true, 'Patch the first repo-owned secret gap'));\n console.log(check(false, 'Open Supabase and verify RLS policies'));\n console.log(check(false, 'Connect Stripe webhook signing secret'));\n console.log(check(false, 'Verify again before launch'));\n console.log('');\n console.log(pc.bold('I can do now'));\n console.log(' 1. Add missing env names and agent rules.');\n console.log(' 2. Prepare focused repo fixes the coding agent can apply.');\n console.log(' 3. Keep the launch loop moving until provider proof is needed.');\n console.log('');\n console.log(pc.bold('I need you for'));\n console.log(' 1. Supabase: open the project and confirm RLS policies.');\n console.log(' 2. Stripe: create or open the webhook endpoint.');\n console.log(' 3. Deployment: paste provider secrets into Vercel or your host.');\n console.log('');\n console.log(pc.bold('Open'));\n console.log(` supabase: ${pc.cyan('https://supabase.com/dashboard')}`);\n console.log(` stripe: ${pc.cyan('https://dashboard.stripe.com/')}`);\n console.log('');\n console.log(`${pc.bold('Copy env names:')} NEXTAUTH_SECRET, STRIPE_WEBHOOK_SECRET`);\n console.log(`${pc.bold('Next:')} I will guide the blocked provider setup, then verify when you confirm it is done.`);\n\n if (options.agentMode) {\n console.log('');\n console.log(pc.dim('Agent note: render the checklist above as the live timeline; update [ ] to [x] as work completes.'));\n }\n\n return 0;\n}\n", "/** Provider logo SVGs \u2014 kept in sync with `media/station.js` `providerLogoSvg()`. */\r\n\r\nconst PROVIDER_LOGOS: Record<string, string> = {\r\n supabase:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M13.8 2.4 5.6 13.1c-.5.7 0 1.7.9 1.7h4.7l-1 6.1c-.2 1 .9 1.6 1.5.8l8.1-10.8c.5-.7 0-1.7-.9-1.7h-4.7l1-6.1c.2-1-.8-1.6-1.4-.7Z\"/></svg>',\r\n clerk:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"none\" stroke=\"#6C47FF\" stroke-width=\"3\" stroke-linecap=\"round\" d=\"M18.7 8.6A7.4 7.4 0 1 0 18.7 15.4\"/><circle cx=\"12\" cy=\"12\" r=\"2.5\" fill=\"#6C47FF\"/></svg>',\r\n authjs:\r\n '<svg viewBox=\"0 0 24 24\" preserveAspectRatio=\"xMidYMid meet\" aria-hidden=\"true\"><path fill=\"#18C6CF\" d=\"M12 2.3 4.2 6.7v5.1c0 4.6 3.2 8.5 7.8 10 4.6-1.5 7.8-5.4 7.8-10V6.7L12 2.3Z\"/><path fill=\"#8B2FF5\" d=\"M12 2.3v19.5c-1.5-.5-2.9-1.3-4.1-2.3L12 2.3Z\"/><path fill=\"#FFF7DF\" d=\"M12 5.3 9.4 18.2c.8.7 1.6 1.2 2.6 1.6V5.3Z\"/><path fill=\"#FF8A00\" d=\"m12 2.3 4.1 17.2c-1.2 1-2.6 1.8-4.1 2.3V2.3Z\"/></svg>',\r\n auth0:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect fill=\"#EB5424\" x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"3.2\"/><path fill=\"#ffffff\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"m12 6.2 1.45 4.46h4.69l-3.8 2.76 1.45 4.46L12 15.12 8.21 17.88l1.45-4.46-3.8-2.76h4.69L12 6.2Zm0 3.4-.52 1.6h-1.69l1.37 1-.52 1.6L12 12.8l1.36.99-.52-1.6 1.37-.99h-1.69L12 9.6Z\"/></svg>',\r\n 'better-auth':\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><rect fill=\"#171717\" x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"4\"/><path fill=\"#ffffff\" d=\"M8 8h3v3H8V8Zm5 0h3v3h-3V8ZM8 13h3v3H8v-3Zm5 0h3v3h-3v-3Z\"/></svg>',\r\n polar:\r\n '<svg viewBox=\"0 0 29 29\" aria-hidden=\"true\"><path fill=\"#0062FF\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M9.077 23.057c4.801 3.25 11.328 1.992 14.577-2.808 3.25-4.801 1.993-11.328-2.808-14.578C16.045 2.422 9.519 3.679 6.269 8.48c-3.25 4.801-1.993 11.327 2.808 14.577Zm1.393.086c4.392 2.247 9.963.138 12.444-4.711 2.48-4.848.93-10.6-3.461-12.847-4.392-2.247-9.963-.138-12.443 4.711-2.481 4.848-.932 10.6 3.46 12.847Z\"/><path fill=\"#0062FF\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11.722 24.29c3.965 1.29 8.628-2.118 10.417-7.613 1.788-5.495.024-10.996-3.94-12.286-3.964-1.29-8.628 2.118-10.416 7.613-1.789 5.495-.025 10.995 3.939 12.286Zm1.213-.418c3.355.716 6.982-2.961 8.102-8.212 1.12-5.252-.691-10.089-4.046-10.804-3.356-.716-6.983 2.96-8.103 8.212-1.12 5.251.692 10.088 4.047 10.804Z\"/><path fill=\"#0062FF\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M13.854 24.738c2.652.284 5.3-4.14 5.912-9.882.613-5.74-1.04-10.624-3.692-10.907-2.653-.283-5.3 4.141-5.913 9.882-.613 5.741 1.04 10.624 3.693 10.907Zm1.241-1.747c1.92-.031 3.415-3.917 3.34-8.68-.075-4.764-1.693-8.6-3.612-8.57-1.92.03-3.415 3.916-3.34 8.68.076 4.763 1.693 8.6 3.612 8.57Z\"/></svg>',\r\n 'lemon-squeezy':\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"#FACC15\" d=\"M18.6 5.4c-4.9-.7-9.9 1.9-12.1 6.4-1.5 3-.7 5.9 1.7 7.2 2.7 1.4 6.5-.2 8.9-3.8 2-3 2.7-6.6 1.5-9.8Z\"/><path fill=\"#111827\" d=\"M8.5 17.5c1.4.7 3.7-.4 5.3-2.6 1.4-2 2.1-4.5 1.9-6.8-2.9.5-5.6 2.3-7 4.9-1.1 2-.9 3.8.8 4.5Z\" opacity=\".16\"/><path fill=\"#111827\" d=\"M13.7 5.2c2-.8 4-.9 5.8-.4-.9 1.5-2.6 2.4-4.3 2.2-1-.1-1.6-.8-1.5-1.8Z\"/></svg>',\r\n github:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"currentColor\" d=\"M12 2C6.48 2 2 6.58 2 12.26c0 4.52 2.87 8.35 6.86 9.71.5.1.69-.22.69-.49 0-.24-.01-.87-.01-1.7-2.78.62-3.37-1.36-3.37-1.36-.45-1.17-1.11-1.48-1.11-1.48-.91-.64.07-.63.07-.63 1 .07 1.53 1.05 1.53 1.05.9 1.56 2.36 1.11 2.94.85.09-.67.35-1.11.63-1.37-2.22-.26-4.56-1.14-4.56-5.07 0-1.12.39-2.03 1.03-2.75-.1-.26-.45-1.3.1-2.7 0 0 .84-.28 2.75 1.05A9.2 9.2 0 0 1 12 6.84c.85 0 1.71.12 2.51.34 1.91-1.33 2.75-1.05 2.75-1.05.55 1.4.2 2.44.1 2.7.64.72 1.03 1.63 1.03 2.75 0 3.94-2.34 4.8-4.57 5.06.36.32.68.94.68 1.9 0 1.37-.01 2.47-.01 2.8 0 .27.18.6.7.49A10.03 10.03 0 0 0 22 12.26C22 6.58 17.52 2 12 2Z\"/></svg>',\r\n gitlab:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"#FC6D26\" d=\"M23.2 9.4 12 2.2.8 9.4l1.4 8.2L12 21.8l9.8-4.2 1.4-8.2Z\"/><path fill=\"#E24329\" d=\"M12 2.2v7.1l3.8 1.9 1.8-5.5L12 2.2Z\"/><path fill=\"#FC6D26\" d=\"M12 10.2 7.7 12l1.8-5.5L12 2.2Z\"/><path fill=\"#FCA326\" d=\"M.8 9.4 12 21.8 7.7 12 12 10.2Z\"/><path fill=\"#FC6D26\" d=\"M12 10.2l4.3 1.8 6.1-2.6L12 2.2Z\"/></svg>',\r\n neon:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M5 4.5c0-1 .8-1.7 1.7-1.3l9.5 4.3c1.1.5 1.8 1.6 1.8 2.8v8.6c0 1-.8 1.7-1.7 1.3L6.8 15.9A3 3 0 0 1 5 13.1V4.5Zm4.1 4.1v5l4.9 2.2v-5L9.1 8.6Z\"/></svg>',\r\n planetscale:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"currentColor\" d=\"M19.1 4.9A10 10 0 0 0 4.9 19.1L19.1 4.9Zm-12 16A10 10 0 0 0 20.9 7.1L7.1 20.9Z\"/></svg>',\r\n mongodb:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 2c3 3 4.8 6.2 4.8 9.6 0 4.2-2.2 7.1-4.8 9.9-2.6-2.8-4.8-5.7-4.8-9.9C7.2 8.2 9 5 12 2Zm0 5.2v10.2\"/></svg>',\r\n turso:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M4 7.5h16v3H4v-3Zm0 6h16v3H4v-3ZM7.5 4h9v3h-9V4Zm0 13h9v3h-9v-3Z\"/></svg>',\r\n stripe:\r\n '<svg viewBox=\"0 0 24 24\" preserveAspectRatio=\"xMidYMid meet\" aria-hidden=\"true\"><path fill=\"#635BFF\" d=\"M4.5 15.4c1.5.9 3.5 1.4 5.4 1.4 1.6 0 2.5-.4 2.5-1.2 0-.7-.7-1-3-1.5-3-.7-4.7-1.8-4.7-4.1 0-2.6 2.1-4.4 5.8-4.4 2.1 0 3.9.4 5.3 1.1v3.4a10 10 0 0 0-5.1-1.4c-1.5 0-2.2.4-2.2 1.1 0 .7.8 1 3 1.5 3.1.7 4.8 1.8 4.8 4.1 0 2.7-2.2 4.5-6.2 4.5-2.2 0-4.3-.5-5.6-1.3v-3.2Z\"/></svg>',\r\n paddle:\r\n '<svg viewBox=\"0 0 90 90\" aria-hidden=\"true\"><rect x=\"11\" y=\"11\" width=\"68\" height=\"68\" rx=\"17\" fill=\"#101318\"/><rect x=\"11.5\" y=\"11.5\" width=\"67\" height=\"67\" rx=\"16.5\" fill=\"none\" stroke=\"#343942\"/><path fill=\"#FFD21E\" d=\"M8.49991 17C8.51217 21.6945 12.3128 25.5001 17 25.5001C12.3128 25.5001 8.51217 29.3055 8.49991 34C8.48783 29.3055 4.68717 25.5001 0 25.5001C4.68717 25.5001 8.48783 21.6945 8.49991 17Z\" transform=\"translate(19.5 -31.5) scale(3)\"/></svg>',\r\n vercel:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 4 22 20H2L12 4Z\"/></svg>',\r\n netlify:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"#00C7B7\" d=\"M8.1 7.1h2.5l3.8 6.2V7.1h2.5v9.8h-2.4l-3.9-6.2v6.2H8.1V7.1Z\"/><path fill=\"#111827\" d=\"M3 10.5h4.1v3H3v-3Zm16.9 0H22v3h-2.1v-3ZM10.5 3H13.5v4.1h-3.1V3Zm0 16.9H13.5V22h-3.1v-2.1Z\"/></svg>',\r\n aws:\r\n '<svg viewBox=\"0 0 24 24\" preserveAspectRatio=\"xMidYMid meet\" aria-hidden=\"true\"><path fill=\"#FF9900\" d=\"M6.763 10.582c4.95-2.283 10.563-2.283 15.475 0 .532.243.848.741.848 1.256 0 .532-.323 1.026-.85 1.256-4.912 2.283-10.525 2.283-15.474 0-.528-.23-.851-.724-.851-.279 0-.544.098-.754.243-4.95 2.283-10.563 2.283-15.475 0-.532-.243-.848-.741-.848-1.256 0-.532.323-1.026.85-1.256.228-.098.492-.196.754-.196.279 0 .544.098.754.243Z\"/><path fill=\"#FF9900\" d=\"M12 3.65c-2.772 0-5.027 1.147-5.027 2.553S9.228 8.756 12 8.756s5.027-1.147 5.027-2.553S14.772 3.65 12 3.65Z\"/></svg>',\r\n sentry:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 3 22 20H2L12 3Zm0 5.1L6.8 17h2.1l3.1-5.3 3.1 5.3h2.1L12 8.1Z\"/></svg>',\r\n posthog:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"#1D4AFF\" d=\"M5.2 6.1h8.2c3 0 5.3 2 5.3 5.1 0 3.2-2.3 5.2-5.3 5.2H5.2V6.1Z\"/><path fill=\"#F54E00\" d=\"M4.1 4h4.2a2.35 2.35 0 0 1 0 4.7H4.1V4Z\"/><circle cx=\"13.7\" cy=\"11.75\" r=\"1.1\" fill=\"#F9BD2B\"/><path fill=\"#F54E00\" d=\"m16.5 9.35 2-1.15.85 1.3-2.15 1.3-.7-1.45Zm.38 4.78 2.42.86-.78 1.6-2.4-1.02.76-1.44Z\"/></svg>',\r\n playwright:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"#2EAD33\" d=\"M8.4 8.2 5.4 17.2h2.3l.8-2.8h2.7l.8 2.8h2.3L11.6 8.2H8.4Zm1.1 4.8.8-2.4.8 2.4H9.5Z\"/><path fill=\"#E2574C\" d=\"M15.6 8.2 12.6 17.2h2.3l.8-2.8h2.7l.8 2.8h2.3L18.8 8.2h-3.2Zm1.1 4.8.8-2.4.8 2.4h-1.6Z\"/><ellipse fill=\"#2EAD33\" cx=\"9.5\" cy=\"13.1\" rx=\"1.1\" ry=\"1.4\"/><ellipse fill=\"#E2574C\" cx=\"16.5\" cy=\"13.1\" rx=\"1.1\" ry=\"1.4\"/></svg>',\r\n logrocket:\r\n '<svg viewBox=\"0 0 24 24\" preserveAspectRatio=\"xMidYMid meet\" aria-hidden=\"true\"><rect x=\"2\" y=\"2\" width=\"20\" height=\"20\" rx=\"5\" fill=\"#764ABC\"/><path fill=\"#FFFFFF\" d=\"M12 7.4c2.7 0 4.9 2.2 4.9 4.9s-2.2 4.9-4.9 4.9-4.9-2.2-4.9-4.9 4.9-4.9 4.9-4.9Zm0 1.9a3 3 0 1 0 0 6 3 3 0 0 0 0-6Zm-3.2 7.4h6.4v1.5H8.8v-1.5Z\"/></svg>',\r\n figma:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M8.5 3h3.5v6H8.5a3 3 0 1 1 0-6Zm3.5 6h3.5a3 3 0 1 0 0-6H12v6Zm0 0h3.5a3 3 0 1 1 0 6H12V9Zm-3.5 0H12v6H8.5a3 3 0 1 1 0-6ZM8.5 15H12v2.5A3.5 3.5 0 1 1 8.5 15Z\"/></svg>',\r\n storybook:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6.2 3.4 17.9 2l.7 18.1-12.4.7V3.4Zm8.7 3.2.3 2.4 1.7-1.3 1.7 1.1.3-3.4-4 .5v.7Zm-5.2 5.1c0 2 1.6 3.5 4.2 3.5 2.4 0 3.8-1.2 3.8-3 0-1.7-1.1-2.6-3.4-3l-1.2-.2c-.7-.1-1-.4-1-.8 0-.5.5-.8 1.3-.8.9 0 1.5.4 1.8 1.1l2.1-.8c-.5-1.4-1.8-2.2-3.8-2.2-2.3 0-3.8 1.2-3.8 2.9 0 1.6 1.1 2.5 3.3 2.9l1.2.2c.8.1 1.1.4 1.1.9 0 .6-.5.9-1.4.9-1.1 0-1.8-.5-2.1-1.3l-2.1.7Z\"/></svg>',\r\n 'product-spec':\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6 3.2h9.2L19 7v13.8H6V3.2Zm8.2 1.9v3h3l-3-3ZM8.4 10h7.2v1.7H8.4V10Zm0 3.2h7.2v1.7H8.4v-1.7Zm0 3.2h4.9v1.7H8.4v-1.7Z\"/></svg>',\r\n 'route-map':\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M6.5 4.2a3 3 0 0 1 3 3c0 2-3 5.1-3 5.1s-3-3.1-3-5.1a3 3 0 0 1 3-3Zm0 1.8a1.2 1.2 0 1 0 0 2.4 1.2 1.2 0 0 0 0-2.4Zm11 5.8a3 3 0 0 1 3 3c0 2-3 5.1-3 5.1s-3-3.1-3-5.1a3 3 0 0 1 3-3Zm0 1.8a1.2 1.2 0 1 0 0 2.4 1.2 1.2 0 0 0 0-2.4ZM9.5 7h2.1c2.8 0 4.9 2 4.9 4.8h-2c0-1.7-1.2-2.8-2.9-2.8H9.5V7Zm4.9 10h-2.1c-2.8 0-4.9-2-4.9-4.8h2c0 1.7 1.2 2.8 2.9 2.8h2.1v2Z\"/></svg>',\r\n react:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><circle cx=\"12\" cy=\"12\" r=\"2.2\"/><ellipse cx=\"12\" cy=\"12\" rx=\"9\" ry=\"3.6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\"/><ellipse cx=\"12\" cy=\"12\" rx=\"9\" ry=\"3.6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" transform=\"rotate(60 12 12)\"/><ellipse cx=\"12\" cy=\"12\" rx=\"9\" ry=\"3.6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" transform=\"rotate(120 12 12)\"/></svg>',\r\n vue: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M2.6 4h5.1L12 11.4 16.3 4h5.1L12 20 2.6 4Zm5.6 0L12 10.5 15.8 4h-2.7L12 5.9 10.9 4H8.2Z\"/></svg>',\r\n svelte:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"#FF3E00\" d=\"M17 3.4a5.1 5.1 0 0 0-6.8 1.4L6.5 9.7a4.5 4.5 0 0 0 .8 6.3 5 5 0 0 0 6.8-1.2l.6-.8a1.55 1.55 0 0 0-.3-2.2 1.75 1.75 0 0 0-2.3.4l-.6.8a1.3 1.3 0 0 1-1.8.3 1.15 1.15 0 0 1-.2-1.6l3.7-4.8a1.3 1.3 0 0 1 1.8-.4c.5.4.6 1.1.2 1.6l-.3.4 2.8 2 .3-.4a4.65 4.65 0 0 0-1-6.7Zm-9.8 17.2a5.1 5.1 0 0 0 6.8-1.4l3.7-4.9a4.5 4.5 0 0 0-.8-6.3 5 5 0 0 0-6.8 1.2l-.6.8a1.55 1.55 0 0 0 .3 2.2 1.75 1.75 0 0 0 2.3-.4l.6-.8a1.3 1.3 0 0 1 1.8-.3 1.15 1.15 0 0 1 .2 1.6L11 17.1a1.3 1.3 0 0 1-1.8.4 1.15 1.15 0 0 1-.2-1.6l.3-.4-2.8-2-.3.4a4.65 4.65 0 0 0 1 6.7Z\"/></svg>',\r\n angular:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 2.5 20.5 5.6 19.2 17 12 21.5 4.8 17 3.5 5.6 12 2.5Zm0 4.2-5 11h2.4l1-2.4h3.2l1 2.4H17l-5-11Zm0 3.8 1.1 2.9h-2.2l1.1-2.9Z\"/></svg>',\r\n nodejs:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 2.5 20.2 7v10L12 21.5 3.8 17V7L12 2.5Zm-3.8 6.7v5.6h1.9v-3.1l3.8 3.1h1.9V9.2h-1.9v3.2l-3.8-3.2H8.2Z\"/></svg>',\r\n python:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M11.8 3c2.7 0 4.2.8 4.2 2.5V9H9.6A2.6 2.6 0 0 0 7 11.6V13H4.5C3.5 13 3 12.2 3 11c0-3.2 1.9-4.9 5.6-4.9h3.8V5H8.8V3.6A10 10 0 0 1 11.8 3Zm-1.4 1.5a.8.8 0 1 0 0 1.6.8.8 0 0 0 0-1.6ZM12.2 21c-2.7 0-4.2-.8-4.2-2.5V15h6.4a2.6 2.6 0 0 0 2.6-2.6V11h2.5c1 0 1.5.8 1.5 2 0 3.2-1.9 4.9-5.6 4.9h-3.8V19h3.6v1.4a10 10 0 0 1-3 .6Zm1.4-3.1a.8.8 0 1 0 0 1.6.8.8 0 0 0 0-1.6Z\"/></svg>',\r\n rails:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M3 17.7C5.8 9.5 11.7 5.2 21 4.8v3.1C13.5 8.3 8.7 11.6 6 18.5L3 17.7Zm4.6.7c2.1-5 5.9-7.5 11.4-7.9v2.4c-4.4.4-7.4 2.5-9 6.2l-2.4-.7Zm4.7.7c1.3-2.4 3.4-3.7 6.7-4.1v2.2c-2.2.4-3.6 1.3-4.5 2.6l-2.2-.7Z\"/></svg>',\r\n go: '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M3 8.2h7.4v1.5H3V8.2Zm-1 3h7.4v1.5H2v-1.5Zm2 3h5.4v1.5H4v-1.5Zm10.5-6.1c3.1 0 5.5 2 5.5 4.6s-2.4 4.6-5.5 4.6-5.5-2-5.5-4.6 2.4-4.6 5.5-4.6Zm0 2.1c-1.7 0-3 1.1-3 2.5s1.3 2.5 3 2.5 3-1.1 3-2.5-1.3-2.5-3-2.5Zm5.1-2h2.4l-1.2 9h-2.4l1.2-9Z\"/></svg>',\r\n 'testing-library':\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M7 3h10v4.2l-3.4 4.5 5.4 7.9c.5.8 0 1.9-1 1.9H6c-1 0-1.6-1.1-1-1.9l5.4-7.9L7 7.2V3Zm3 3.5 2 2.7 2-2.7H10Zm1.9 8.4-2.6 3.8h5.4l-2.8-3.8Z\"/></svg>',\r\n vitest:\r\n '<svg viewBox=\"0 0 24 24\" preserveAspectRatio=\"xMidYMid meet\" aria-hidden=\"true\"><path fill=\"#FCC72B\" d=\"M13.4 3 21 7.4 12 21 3 7.4 10.6 3l1.4 4.5L13.4 3Zm-1.4 7.3-2.1 4h4.2l-2.1-4Z\"/><path fill=\"#729B1B\" d=\"M12 10.3 9.9 14.3h4.2L12 10.3Z\"/></svg>',\r\n 'rate-limit':\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M12 3a9 9 0 1 0 9 9h-3a6 6 0 1 1-1.8-4.3L13 11h8V3l-2.7 2.7A9 9 0 0 0 12 3Z\"/></svg>',\r\n 'bot-protection':\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"#f38020\" d=\"M12 2.4 20 5.5v6.2c0 4.75-3.12 8.1-8 10.1-4.88-2-8-5.35-8-10.1V5.5l8-3.1Z\"/><path fill=\"#fff7df\" d=\"M12 5.9 16.9 8v3.72c0 2.64-1.8 4.64-4.9 6.05-3.1-1.41-4.9-3.41-4.9-6.05V8L12 5.9Z\"/><path fill=\"#f38020\" d=\"M12 8.2a3.15 3.15 0 0 1 3.15 3.15A3.15 3.15 0 0 1 12 14.5a3.15 3.15 0 0 1-3.15-3.15A3.15 3.15 0 0 1 12 8.2Zm0 1.65a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3Z\"/></svg>',\r\n 'secrets-hygiene':\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path d=\"M7 10V7a5 5 0 0 1 10 0v3h1.5v11h-13V10H7Zm3 0h4V7a2 2 0 0 0-4 0v3Z\"/></svg>',\r\n firebase:\r\n '<svg viewBox=\"0 0 24 24\" aria-hidden=\"true\"><path fill=\"#FFCA28\" d=\"M5.65 17.9 7.8 4.7c.08-.48.74-.58.96-.15l2.18 4.18 1.72-3.28c.2-.38.75-.33.88.08l4.82 12.37-6.35 3.56-6.36-3.56Z\"/><path fill=\"#FFA000\" d=\"m10.95 8.73-5.3 9.17 6.36 3.56 6.35-3.56-5.7-12.45-1.71 3.28Z\"/><path fill=\"#F57C00\" d=\"m5.65 17.9 5.3-9.17 1.06 12.73-6.36-3.56Z\"/></svg>',\r\n cloudflare:\r\n '<svg viewBox=\"0 0 32 32\" aria-hidden=\"true\"><rect x=\"7\" y=\"7\" width=\"21\" height=\"21\" rx=\"1.3\" fill=\"#111827\"/><rect x=\"4\" y=\"4\" width=\"21\" height=\"21\" rx=\"1.3\" fill=\"#f38020\"/><path fill=\"#ffb647\" d=\"M20.7 17.1h2.4c1.5 0 2.7-1 2.7-2.2 0-1.1-.9-2-2.2-2.2-.5-1.8-2.1-3-4-3-.9 0-1.8.3-2.5.8 1 .7 1.7 1.8 1.9 3.1 1.4.3 2.4 1.5 2.4 2.9 0 .2 0 .4-.1.6h-.6Z\"/><path fill=\"#fff7df\" d=\"M9 17.1h10.7c1.3 0 2.4-.9 2.4-2.1 0-1.1-1-2-2.3-2.1-.5-1.9-2.3-3.3-4.4-3.3-1.7 0-3.2.9-4 2.3-.4-.2-.8-.3-1.3-.3-1.5 0-2.8 1-3.1 2.4-1.2.2-2.1 1-2.1 1.9 0 .7.5 1.2 1.2 1.2H9Z\"/><path fill=\"#fff7df\" d=\"M8.2 19.1h12.5c.5 0 .9.4.9.9s-.4.9-.9.9H8.2c-.5 0-.9-.4-.9-.9s.4-.9.9-.9Z\"/></svg>'\r\n};\r\n\r\nconst ALIASES: Record<string, string> = {\r\n authjs: 'authjs',\r\n 'auth.js': 'authjs',\r\n nextauth: 'authjs',\r\n posthog: 'posthog',\r\n node: 'nodejs',\r\n nodejs: 'nodejs',\r\n 'node.js': 'nodejs',\r\n express: 'nodejs',\r\n expressjs: 'nodejs',\r\n supabase: 'supabase',\r\n clerk: 'clerk',\r\n stripe: 'stripe',\r\n vercel: 'vercel',\r\n 'supabase auth': 'supabase',\r\n supabaseauth: 'supabase',\r\n 'bot protection': 'bot-protection',\r\n botprotection: 'bot-protection',\r\n 'secrets hygiene': 'secrets-hygiene',\r\n secretshygiene: 'secrets-hygiene',\r\n 'rate limiting': 'rate-limit',\r\n ratelimiting: 'rate-limit',\r\n polar: 'polar',\r\n lemonsqueezy: 'lemon-squeezy',\r\n 'lemon squeezy': 'lemon-squeezy',\r\n 'lemon-squeezy': 'lemon-squeezy',\r\n github: 'github',\r\n gitlab: 'gitlab',\r\n auth0: 'auth0',\r\n 'better-auth': 'better-auth',\r\n betterauth: 'better-auth',\r\n firebase: 'firebase',\r\n firestore: 'firebase',\r\n 'mongodb atlas': 'mongodb',\r\n logrocket: 'logrocket',\r\n sentry: 'sentry',\r\n figma: 'figma',\r\n react: 'react',\r\n vitest: 'vitest',\r\n playwright: 'playwright',\r\n neon: 'neon',\r\n planetscale: 'planetscale',\r\n 'planet scale': 'planetscale',\r\n mongodb: 'mongodb',\r\n netlify: 'netlify',\r\n render: 'render',\r\n rendercom: 'render',\r\n railway: 'railway',\r\n railwayapp: 'railway',\r\n cloudflare: 'cloudflare',\r\n cloudflarepages: 'cloudflare',\r\n workers: 'cloudflare',\r\n aws: 'aws',\r\n paddle: 'paddle',\r\n turso: 'turso',\r\n vue: 'vue',\r\n svelte: 'svelte',\r\n angular: 'angular',\r\n python: 'python',\r\n rails: 'rails',\r\n go: 'go',\r\n storybook: 'storybook',\r\n productspec: 'product-spec',\r\n prd: 'product-spec',\r\n routemap: 'route-map',\r\n routes: 'route-map',\r\n ratelimit: 'rate-limit'\r\n};\r\n\r\n/** CDN slugs that 404 or resolve to the wrong brand \u2014 keep inline SVG in PROVIDER_LOGOS. */\r\nexport const INLINE_ONLY_LOGO_KEYS = new Set([\r\n 'auth0',\r\n 'authjs',\r\n 'better-auth',\r\n 'clerk',\r\n 'cloudflare',\r\n 'lemon-squeezy',\r\n 'netlify',\r\n 'paddle',\r\n 'polar',\r\n 'posthog',\r\n 'svelte'\r\n]);\r\n\r\n/** Bundled SVGs under `report/assets/` \u2014 official marks; avoids CSS fill/squash on inline paths. */\r\nexport const PROVIDER_ASSET_FILES: Record<string, string> = {\r\n authjs: 'provider-authjs.svg',\r\n logrocket: 'provider-logrocket.svg',\r\n aws: 'provider-aws.svg'\r\n};\r\n\r\nconst REPORT_ASSET_PREFIX = 'report/assets';\r\n\r\nexport function providerAssetUrl(key: string): string | undefined {\r\n const file = PROVIDER_ASSET_FILES[key];\r\n return file ? `${REPORT_ASSET_PREFIX}/${file}` : undefined;\r\n}\r\n\r\nexport function providerAssetUrls(): Record<string, string> {\r\n return Object.fromEntries(\r\n Object.keys(PROVIDER_ASSET_FILES)\r\n .map((key) => [key, providerAssetUrl(key)])\r\n .filter((entry): entry is [string, string] => Boolean(entry[1]))\r\n ) as Record<string, string>;\r\n}\r\n\r\n/**\r\n * CDN brand marks (aligned with landing `stackIcons`) \u2014 clearer than tiny inline SVGs\r\n * in sidebar tiles and map nodes. Internal controls keep inline SVG only.\r\n */\r\nexport const PROVIDER_ICON_URLS: Record<string, string> = {\n supabase: 'https://cdn.simpleicons.org/supabase/3ECF8E',\n clerk: 'https://cdn.simpleicons.org/clerk/6C47FF',\n authjs: 'https://authjs.dev/img/etc/logo-sm.webp',\n auth0: 'https://cdn.simpleicons.org/auth0/EB5424',\n firebase: 'https://cdn.simpleicons.org/firebase/FFCA28',\r\n neon: 'https://cdn.simpleicons.org/neon/00E599',\r\n planetscale: 'https://cdn.simpleicons.org/planetscale/000000',\r\n mongodb: 'https://cdn.simpleicons.org/mongodb/47A248',\r\n turso: 'https://cdn.simpleicons.org/turso/4FF8D2',\r\n 'lemon-squeezy': 'https://cdn.simpleicons.org/lemonsqueezy/FFC233',\r\n stripe: 'https://cdn.simpleicons.org/stripe/635BFF',\r\n github: 'https://cdn.simpleicons.org/github/181717',\r\n gitlab: 'https://cdn.simpleicons.org/gitlab/FC6D26',\r\n vercel: 'https://cdn.simpleicons.org/vercel/000000',\r\n netlify: 'https://cdn.simpleicons.org/netlify/00C7B7',\r\n render: 'https://cdn.simpleicons.org/render/46E3B7',\r\n railway: 'https://cdn.simpleicons.org/railway/0B0D0E',\r\n cloudflare: 'https://cdn.simpleicons.org/cloudflare/F38020',\n sentry: 'https://cdn.simpleicons.org/sentry/362D59',\n posthog: 'https://cdn.simpleicons.org/posthog/F54E00',\n resend: 'https://cdn.simpleicons.org/resend/000000',\n upstash: 'https://cdn.simpleicons.org/upstash/00E9A3',\n playwright:\n 'https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/playwright/playwright-original.svg',\r\n figma: 'https://cdn.simpleicons.org/figma/F24E1E',\r\n storybook: 'https://cdn.simpleicons.org/storybook/FF4785',\r\n react: 'https://cdn.simpleicons.org/react/61DAFB',\r\n vue: 'https://cdn.simpleicons.org/vuedotjs/4FC08D',\r\n svelte: 'https://cdn.simpleicons.org/svelte/FF3E00',\r\n angular: 'https://cdn.simpleicons.org/angular/DD0031',\r\n nodejs: 'https://cdn.simpleicons.org/nodedotjs/5FA04E',\r\n python: 'https://cdn.simpleicons.org/python/3776AB',\r\n rails: 'https://cdn.simpleicons.org/rubyonrails/D30001',\r\n go: 'https://cdn.simpleicons.org/go/00ADD8',\r\n 'testing-library': 'https://cdn.simpleicons.org/testinglibrary/E33332',\r\n vitest: 'https://cdn.simpleicons.org/vitest/FCC72B'\r\n};\r\n\r\n/** Logos with embedded brand colors \u2014 do not force `fill: currentColor` in the report. */\r\nexport const BRAND_LOGO_KEYS = new Set([\r\n 'auth0',\r\n 'authjs',\r\n 'aws',\r\n 'better-auth',\r\n 'clerk',\r\n 'gitlab',\r\n 'lemon-squeezy',\r\n 'logrocket',\r\n 'netlify',\r\n 'auth0',\r\n 'paddle',\r\n 'playwright',\r\n 'polar',\r\n 'posthog',\r\n 'stripe',\r\n 'svelte',\r\n 'vitest'\r\n]);\r\n\r\nfunction resolveLogoKey(raw: string, compact: string): string {\r\n if (ALIASES[raw]) {\r\n return ALIASES[raw];\r\n }\r\n if (ALIASES[compact]) {\r\n return ALIASES[compact];\r\n }\r\n if (PROVIDER_LOGOS[compact]) {\r\n return compact;\r\n }\r\n\r\n const parts = raw.split('-').filter(Boolean);\r\n if (parts.length >= 2) {\r\n const first = parts[0];\r\n if (PROVIDER_LOGOS[first] || ALIASES[first]) {\r\n return ALIASES[first] ?? first;\r\n }\r\n const twoPart = parts.slice(0, 2).join('');\r\n if (PROVIDER_LOGOS[twoPart] || ALIASES[twoPart]) {\r\n return ALIASES[twoPart] ?? twoPart;\r\n }\r\n const twoHyphen = parts.slice(0, 2).join('-');\r\n if (ALIASES[twoHyphen]) {\r\n return ALIASES[twoHyphen];\r\n }\r\n }\r\n\r\n return compact;\r\n}\r\n\r\nexport function normalizeProviderKey(providerOrLabel: string | undefined): string {\r\n if (!providerOrLabel) {\r\n return '';\r\n }\r\n const raw = String(providerOrLabel).trim().toLowerCase();\r\n const compact = raw.replace(/[^a-z0-9]+/g, '');\r\n return resolveLogoKey(raw, compact);\r\n}\r\n\r\n/** Prefer mission provider keys like `vercel-deployment` and display labels. */\r\nexport function resolveProviderLogoKey(\r\n ...candidates: Array<string | undefined>\r\n): string {\r\n for (const candidate of candidates) {\r\n const key = normalizeProviderKey(candidate);\r\n if (key && PROVIDER_LOGOS[key]) {\r\n return key;\r\n }\r\n }\r\n for (const candidate of candidates) {\r\n const key = normalizeProviderKey(candidate);\r\n if (key) {\r\n return key;\r\n }\r\n }\r\n return '';\r\n}\r\n\r\nexport function providerLogoClass(\r\n providerOrLabel: string | undefined,\r\n ...moreCandidates: Array<string | undefined>\r\n): string {\r\n const key = resolveProviderLogoKey(providerOrLabel, ...moreCandidates) || normalizeProviderKey(providerOrLabel);\r\n if (!key) {\r\n return '';\r\n }\r\n return ` provider-logo--${key}${BRAND_LOGO_KEYS.has(key) ? ' provider-logo--brand' : ''}`;\r\n}\r\n\r\nfunction providerIconImgHtml(iconUrl: string, logoKey: string): string {\r\n return `<img class=\"provider-logo__img\" src=\"${iconUrl}\" alt=\"\" decoding=\"async\" data-provider-logo-key=\"${logoKey}\" />`;\r\n}\r\n\r\nexport function providerLogoHtml(\r\n providerOrLabel: string | undefined,\r\n labelFallback?: string,\r\n ...moreCandidates: Array<string | undefined>\r\n): string {\r\n const key =\r\n resolveProviderLogoKey(providerOrLabel, labelFallback, ...moreCandidates) ||\r\n normalizeProviderKey(providerOrLabel);\r\n const svg = key && PROVIDER_LOGOS[key];\r\n const assetUrl = key ? providerAssetUrl(key) : undefined;\r\n if (assetUrl) {\r\n return providerIconImgHtml(assetUrl, key);\r\n }\r\n if (key && INLINE_ONLY_LOGO_KEYS.has(key) && svg) {\r\n return svg;\r\n }\r\n if (svg) {\r\n return svg;\r\n }\r\n const iconUrl = key && PROVIDER_ICON_URLS[key];\r\n if (iconUrl) {\r\n return providerIconImgHtml(iconUrl, key);\r\n }\r\n const label = (labelFallback ?? providerOrLabel ?? '?').trim();\r\n const initials = label ? label.slice(0, 2).toUpperCase() : '?';\r\n return `<span aria-hidden=\"true\">${initials}</span>`;\r\n}\r\n\r\n/** Short benefit lines \u2014 kept in sync with `providerBenefitText()` in `media/station.js`. */\r\nconst LOCAL_UI_BRAND_ICON_KEYS = new Set([\n 'authjs',\n 'clerk',\n 'github',\n 'posthog',\n 'resend',\n 'sentry',\n 'stripe',\n 'supabase',\n 'upstash',\n 'vercel'\n]);\n\nexport function providerRailLogoHtml(\n providerOrLabel: string | undefined,\n labelFallback?: string,\n ...moreCandidates: Array<string | undefined>\n): string {\n const key =\n resolveProviderLogoKey(providerOrLabel, labelFallback, ...moreCandidates) ||\n normalizeProviderKey(providerOrLabel);\n const iconUrl = key && LOCAL_UI_BRAND_ICON_KEYS.has(key) ? PROVIDER_ICON_URLS[key] : undefined;\n if (iconUrl) {\n return providerIconImgHtml(iconUrl, key);\n }\n return providerLogoHtml(providerOrLabel, labelFallback, ...moreCandidates);\n}\n\nexport const PROVIDER_BENEFITS: Record<string, string> = {\n supabase: 'Best when you want auth, data, and storage in one stack.',\r\n clerk: 'Fastest managed auth path with clean session primitives.',\r\n authjs: 'Best when you want framework-owned auth and full control.',\r\n neon: 'Good serverless Postgres fit for Vercel-style apps.',\r\n planetscale: 'Good fit for branching MySQL workflows.',\r\n mongodb: 'Good when the app already models document data.',\r\n turso: 'Good edge SQLite option for lightweight apps.',\r\n stripe: 'Best supported global payment ecosystem.',\r\n paddle: 'Handles merchant-of-record subscription operations.',\r\n polar: 'MoR billing built for developers shipping SaaS.',\r\n 'lemon-squeezy': 'Sell digital products and subscriptions with less setup.',\r\n github: 'Best for GitHub Actions CI and required PR checks.',\r\n gitlab: 'Best for GitLab CI pipelines and merge gates.',\r\n vercel: 'Best fit for preview deploys, envs, and domains.',\r\n netlify: 'Good fit for static and serverless deploy workflows.',\r\n render: 'Good fit for simple web services and background jobs.',\r\n railway: 'Good fit for fast deploy loops and managed infra.',\r\n cloudflare: 'Good fit for Pages, Workers, DNS, and edge stack.',\r\n aws: 'Best when the app needs direct cloud infrastructure control.',\r\n sentry: 'Best first choice for production errors and traces.',\r\n posthog: 'Best for product analytics and funnel verification.',\r\n auth0: 'Enterprise identity with rules, MFA, and social login.',\r\n firebase: 'Good fit when auth, Firestore, and hosting stay in one Google stack.',\r\n 'better-auth': 'Type-safe auth you own in your codebase.',\r\n playwright: 'Best for browser-flow verification and UI regression checks.',\r\n logrocket: 'Best when session replay is the missing evidence.',\r\n 'rate-limit': 'Protects API routes from abuse and retry loops.',\r\n 'bot-protection': 'Adds bot screening before expensive flows.',\r\n 'secrets-hygiene': 'Hardens env handling and secret exposure risk.',\r\n figma: 'Best for screen flows, handoff, and UX alignment.',\r\n storybook: 'Best for proving component states before production.',\r\n react: 'Best fit for common component UI and app-router projects.',\r\n vue: 'Good fit for Vue or Nuxt product interfaces.',\r\n svelte: 'Good fit for SvelteKit route-first apps.',\r\n angular: 'Good fit for structured enterprise frontend workflows.',\r\n nodejs: 'Best fit for JavaScript API routes and server behavior.',\r\n python: 'Good fit for FastAPI-style APIs and typed validation.',\r\n rails: 'Good fit for full-stack CRUD and convention-heavy APIs.',\r\n go: 'Good fit for lean, fast HTTP services.',\r\n vitest: 'Fast unit and integration tests for modern JS apps.',\r\n 'testing-library': 'User-centric component testing primitives.'\r\n};\r\n\r\nexport function providerBenefitText(providerOrLabel: string | undefined, fallback?: string): string {\r\n const key = normalizeProviderKey(providerOrLabel);\r\n return (key && PROVIDER_BENEFITS[key]) || fallback || 'Useful path for this section.';\r\n}\r\n\r\n/** Embedded in static report for client-side provider tiles. */\r\nexport function providerLogosPayloadJson(): string {\r\n return JSON.stringify({\r\n logos: PROVIDER_LOGOS,\r\n iconUrls: PROVIDER_ICON_URLS,\r\n assetUrls: providerAssetUrls(),\r\n inlineOnly: [...INLINE_ONLY_LOGO_KEYS],\r\n aliases: ALIASES,\r\n benefits: PROVIDER_BENEFITS,\r\n brandKeys: [...BRAND_LOGO_KEYS]\r\n }).replace(/</g, '\\\\u003c');\r\n}\r\n", "export interface BuildLocalUiPromptInput {\n projectName: string;\n providerName: string;\n itemTitle: string;\n issueSummary: string;\n gapId?: string;\n}\n\nexport function buildLocalUiPrompt(input: BuildLocalUiPromptInput): string {\n const lines = [\n 'You are fixing one VibeRaven production-readiness gap.',\n '',\n `Project: ${input.projectName}`,\n `Provider: ${input.providerName}`,\n `Launch path item: ${input.itemTitle}`,\n input.gapId ? `Gap: ${input.gapId}` : undefined,\n `Current issue: ${input.issueSummary}`,\n '',\n 'Read:',\n '- .viberaven/agent-tasklist.md',\n '- .viberaven/context-map.json',\n '- .viberaven/gate-result.json',\n '',\n 'Fix only this repo-code gap.',\n 'Do not claim production-ready until VibeRaven verify is clear.',\n 'Provider dashboard setup remains manual unless VibeRaven has live provider evidence.',\n 'After the fix, run:',\n 'npx -y viberaven --verify'\n ].filter((line): line is string => line !== undefined);\n\n return lines.join('\\n');\n}\n", "import type { LocalUiLaunchPathItem } from './types';\n\nexport interface LaunchPathTemplate {\n id: string;\n name: string;\n area: string;\n title: string;\n items: Array<Omit<LocalUiLaunchPathItem, 'state' | 'shortReason'>>;\n}\n\nfunction item(providerId: string, id: string, title: string, source: LocalUiLaunchPathItem['source']): Omit<LocalUiLaunchPathItem, 'state' | 'shortReason'> {\n return { id: `${providerId}-${id}`, providerId, title, source };\n}\n\nconst catalog: LaunchPathTemplate[] = [\n {\n id: 'supabase',\n name: 'Supabase',\n area: 'Database',\n title: 'Supabase launch path',\n items: [\n item('supabase', 'migrations', 'Schema and migrations', 'repo'),\n item('supabase', 'rls', 'RLS policies', 'repo'),\n item('supabase', 'auth-callbacks', 'Auth callbacks', 'repo'),\n item('supabase', 'production-env', 'Production env', 'repo'),\n item('supabase', 'final-verification', 'Final verification', 'verify')\n ]\n },\n {\n id: 'vercel',\n name: 'Vercel',\n area: 'Deployment',\n title: 'Vercel launch path',\n items: [\n item('vercel', 'project-link', 'Project link', 'repo'),\n item('vercel', 'production-env', 'Production env', 'repo'),\n item('vercel', 'build-command', 'Build command', 'repo'),\n item('vercel', 'domain-redirects', 'Domain and redirects', 'manual'),\n item('vercel', 'deployment', 'Final deployment', 'verify')\n ]\n },\n {\n id: 'stripe',\n name: 'Stripe',\n area: 'Payments',\n title: 'Stripe launch path',\n items: [\n item('stripe', 'product-price', 'Product and price', 'manual'),\n item('stripe', 'checkout-route', 'Checkout route', 'repo'),\n item('stripe', 'webhook-route', 'Webhook route', 'repo'),\n item('stripe', 'signature', 'Signature verification', 'repo'),\n item('stripe', 'test-event', 'Test event', 'manual')\n ]\n },\n {\n id: 'github',\n name: 'GitHub',\n area: 'CI',\n title: 'GitHub launch path',\n items: [\n item('github', 'repo', 'Repo detected', 'repo'),\n item('github', 'workflow', 'CI workflow', 'repo'),\n item('github', 'checks', 'Required checks', 'manual'),\n item('github', 'secrets', 'Secret names', 'repo'),\n item('github', 'branch-protection', 'Branch protection', 'manual')\n ]\n },\n {\n id: 'sentry',\n name: 'Sentry',\n area: 'Monitoring',\n title: 'Sentry launch path',\n items: [\n item('sentry', 'sdk', 'SDK installed', 'repo'),\n item('sentry', 'dsn', 'DSN env', 'repo'),\n item('sentry', 'boundary', 'Error boundary', 'repo'),\n item('sentry', 'source-maps', 'Source maps', 'repo'),\n item('sentry', 'event', 'Production event', 'manual')\n ]\n },\n {\n id: 'posthog',\n name: 'PostHog',\n area: 'Analytics',\n title: 'PostHog launch path',\n items: [\n item('posthog', 'sdk', 'SDK installed', 'repo'),\n item('posthog', 'key', 'Project key env', 'repo'),\n item('posthog', 'capture', 'Event capture', 'repo'),\n item('posthog', 'privacy', 'Privacy defaults', 'repo'),\n item('posthog', 'dashboard', 'Dashboard check', 'manual')\n ]\n },\n {\n id: 'clerk',\n name: 'Clerk',\n area: 'Auth',\n title: 'Clerk launch path',\n items: [\n item('clerk', 'middleware', 'Protected routes', 'repo'),\n item('clerk', 'env', 'Production env', 'repo'),\n item('clerk', 'callbacks', 'Redirect URLs', 'manual'),\n item('clerk', 'session', 'Session handling', 'repo')\n ]\n },\n {\n id: 'authjs',\n name: 'Auth.js',\n area: 'Auth',\n title: 'Auth.js launch path',\n items: [\n item('authjs', 'secret', 'Auth secret', 'repo'),\n item('authjs', 'providers', 'OAuth providers', 'repo'),\n item('authjs', 'callbacks', 'Callback URLs', 'manual'),\n item('authjs', 'session', 'Session strategy', 'repo')\n ]\n },\n {\n id: 'resend',\n name: 'Resend',\n area: 'Email',\n title: 'Resend launch path',\n items: [\n item('resend', 'api-key', 'API key env', 'repo'),\n item('resend', 'domain', 'Sending domain', 'manual'),\n item('resend', 'templates', 'Email templates', 'repo'),\n item('resend', 'test-send', 'Test send', 'manual')\n ]\n },\n {\n id: 'upstash',\n name: 'Upstash',\n area: 'Cache and rate limits',\n title: 'Upstash launch path',\n items: [\n item('upstash', 'env', 'Redis env', 'repo'),\n item('upstash', 'rate-limit', 'Rate limit path', 'repo'),\n item('upstash', 'quota', 'Quota check', 'manual'),\n item('upstash', 'verify', 'Final verification', 'verify')\n ]\n }\n];\n\nexport function listLocalUiProviderCatalog(): LaunchPathTemplate[] {\n return catalog.map((provider) => ({\n ...provider,\n items: provider.items.map((launchItem) => ({ ...launchItem }))\n }));\n}\n\nexport function getLaunchPathTemplate(providerId: string): LaunchPathTemplate | undefined {\n const normalized = providerId.trim().toLowerCase();\n return listLocalUiProviderCatalog().find((provider) => provider.id === normalized);\n}\n", "import { basename, join } from 'node:path';\nimport type { CliScanArtifact } from '../types';\nimport { providerRailLogoHtml, resolveProviderLogoKey } from '../report/providerLogos';\nimport type {\n LocalUiLaunchPathItem,\n LocalUiMissionControl,\n LocalUiProofLadder,\n LocalUiProvider,\n LocalUiProviderCockpit,\n LocalUiState\n} from './types';\nimport { buildLocalUiPrompt } from './prompts';\nimport { listLocalUiProviderCatalog, type LaunchPathTemplate } from './providerLaunchPaths';\n\ntype GapLike = CliScanArtifact['gaps'][number];\n\nconst providerHints: Record<string, string[]> = {\n supabase: ['supabase', 'rls', 'database', 'postgres'],\n vercel: ['vercel', 'deployment', 'deploy', 'env'],\n stripe: ['stripe', 'webhook', 'checkout', 'payment', 'billing'],\n github: ['github', 'ci', 'workflow', 'branch'],\n sentry: ['sentry', 'monitoring', 'error handling', 'exception'],\n posthog: ['posthog', 'analytics', 'frontend-loading'],\n clerk: ['clerk'],\n authjs: ['auth.js', 'authjs', 'nextauth', 'auth'],\n resend: ['resend', 'email'],\n upstash: ['upstash', 'redis', 'rate limit']\n};\n\nfunction projectNameFromPath(pathValue: string): string {\n return basename(pathValue.replace(/[\\\\/]$/, '')) || 'current repo';\n}\n\nfunction gapSearchText(gap: GapLike): string {\n return [\n gap.id,\n gap.title,\n gap.detail,\n gap.category,\n gap.primaryMapCategory,\n ...(gap.affectedMapCategories ?? [])\n ]\n .join(' ')\n .toLowerCase();\n}\n\nfunction gapDirectText(gap: GapLike): string {\n return [gap.id, gap.title, gap.detail, gap.category].join(' ').toLowerCase();\n}\n\nfunction gapMatchesProvider(gap: GapLike, providerId: string): boolean {\n const text = gapSearchText(gap);\n return (providerHints[providerId] ?? [providerId]).some((hint) => text.includes(hint));\n}\n\nfunction providerGaps(artifact: CliScanArtifact, providerId: string): GapLike[] {\n return artifact.gaps.filter((gap) => gapMatchesProvider(gap, providerId));\n}\n\nfunction stateReason(gap: GapLike | undefined): string {\n if (!gap) return 'Repo evidence found';\n if (gap.severity === 'critical') return 'Critical launch blocker';\n if (gap.severity === 'warning') return 'Needs repo fix';\n return 'Needs verification';\n}\n\nfunction itemState(gap: GapLike | undefined, index: number): LocalUiLaunchPathItem['state'] {\n if (!gap) return index === 0 ? 'ready' : 'not_checked';\n if (gap.severity === 'critical') return 'blocked';\n return 'needs_fix';\n}\n\nfunction providerState(gaps: GapLike[]): LocalUiProvider['state'] {\n if (gaps.some((gap) => gap.severity === 'critical')) return 'needs_repo_fix';\n if (gaps.length > 0) return 'needs_repo_fix';\n return 'repo_evidence_found';\n}\n\nfunction providerStatusText(state: LocalUiProvider['state']): string {\n switch (state) {\n case 'needs_repo_fix':\n return 'Needs repo fix';\n case 'repo_evidence_found':\n return 'Repo evidence found';\n case 'live_verified':\n return 'Live verified';\n case 'requires_user_action':\n return 'User action';\n case 'blocked':\n return 'Blocked';\n case 'error':\n return 'Error';\n case 'connect_live':\n return 'Connect live';\n case 'not_detected':\n default:\n return 'Not detected';\n }\n}\n\nfunction verifyActionForGap(gap: GapLike | undefined): { label: 'Verify'; commandPreview: string; intent: 'verify_action' | 'verify_gate'; actionId?: string } {\n if (gap?.id) {\n return {\n label: 'Verify',\n commandPreview: `npx -y viberaven verify --action ${gap.id}`,\n intent: 'verify_action',\n actionId: gap.id\n };\n }\n return {\n label: 'Verify',\n commandPreview: 'npx -y viberaven --verify',\n intent: 'verify_gate'\n };\n}\n\nfunction proofForProvider(providerId: string, gap: GapLike | undefined): LocalUiProofLadder {\n if (!gap) {\n return {\n level: 'code_only',\n summary: 'Repo evidence exists. Live provider proof is still optional for this step.',\n checks: [\n { label: 'Code found', status: 'yes', source: 'repo' },\n { label: 'Live provider verified', status: 'unknown', source: 'live' }\n ]\n };\n }\n\n const isProviderProofGap = gapSearchText(gap).includes('live') || gapSearchText(gap).includes('proof') || gapSearchText(gap).includes('webhook');\n return {\n level: isProviderProofGap ? 'dashboard_needed' : 'code_only',\n summary: isProviderProofGap\n ? 'The code exists, but production proof is still missing.'\n : 'Code evidence needs work before live proof matters.',\n checks: [\n { label: 'Code found', status: 'yes', source: 'repo' },\n { label: providerId === 'stripe' ? 'Env key name found' : 'Repo evidence found', status: 'yes', source: 'repo' },\n { label: 'Live provider verified', status: 'no', source: 'live' },\n { label: 'Production secret proof', status: 'no', source: 'dashboard' }\n ]\n };\n}\n\nfunction whereToClick(providerId: string): string {\n switch (providerId) {\n case 'stripe':\n return 'Developers -> Webhooks -> Select endpoint -> Signing secret';\n case 'supabase':\n return 'Table editor -> select table -> Policies -> Enable RLS';\n case 'vercel':\n return 'Project settings -> Environment variables -> Production';\n default:\n return 'Open provider dashboard -> complete the selected production action';\n }\n}\n\nfunction youLane(providerId: string, providerName: string, gap: GapLike | undefined): { title: string; body: string } {\n if (providerId === 'stripe') {\n return {\n title: 'Confirm Stripe webhook proof',\n body: 'Create or open the Stripe webhook endpoint, then confirm the production signing secret is available in the deployment provider.'\n };\n }\n if (providerId === 'supabase') {\n return {\n title: 'Confirm Supabase production proof',\n body: 'Open Supabase and confirm the selected table, auth, or environment step is complete for production.'\n };\n }\n if (providerId === 'vercel') {\n return {\n title: 'Confirm Vercel production settings',\n body: 'Open Vercel and confirm the production environment, deployment, or domain setting that blocks launch.'\n };\n }\n return {\n title: `Confirm ${providerName} provider proof`,\n body: gap?.detail ?? `Open ${providerName} and complete the selected production action.`\n };\n}\n\nfunction agentLane(providerId: string, gap: GapLike | undefined): { title: string; body: string } {\n if (providerId === 'stripe') {\n return {\n title: 'Make the webhook handler production-safe',\n body: 'Ask the coding agent to verify signature handling, idempotency, and narrow repo evidence. Keep the full repair prompt in the right panel.'\n };\n }\n if (gap) {\n return {\n title: 'Fix repo evidence if needed',\n body: `Fix only \"${gap.title}\" in the repo. Use the full Agent prompt on the right, then run verification.`\n };\n }\n return {\n title: 'Fix repo evidence if needed',\n body: 'Ask the coding agent to fix only the selected VibeRaven repo-code gap, then verify again.'\n };\n}\n\nfunction cockpitForProvider(template: LaunchPathTemplate, gap: GapLike | undefined): LocalUiProviderCockpit {\n const verify = verifyActionForGap(gap);\n return {\n action: {\n id: `${template.id}-current-action`,\n title: gap?.title ?? `Verify ${template.name} launch proof`,\n whyThisMatters: gap?.detail ?? `${template.name} can look wired in code while production proof is still missing.`,\n whereToClick: whereToClick(template.id),\n lanes: {\n you: youLane(template.id, template.name, gap),\n agent: agentLane(template.id, gap),\n verify\n }\n },\n proof: proofForProvider(template.id, gap)\n };\n}\n\nfunction mapProvider(template: LaunchPathTemplate, artifact: CliScanArtifact, projectName: string): LocalUiProvider {\n const gaps = providerGaps(artifact, template.id);\n const primaryGap = gaps[0];\n const state = providerState(gaps);\n const launchPath = template.items.map((item, index): LocalUiLaunchPathItem => ({\n ...item,\n state: itemState(primaryGap, index),\n shortReason: index === 0 ? stateReason(primaryGap) : primaryGap ? 'Verify after the first fix' : 'Not checked yet'\n }));\n const selectedItem = launchPath.find((item) => item.state === 'blocked' || item.state === 'needs_fix') ?? launchPath[0];\n const issueSummary = primaryGap?.detail ?? `${template.name} has repo evidence. Connect live provider verification when the local fixes are complete.`;\n const prompt = buildLocalUiPrompt({\n projectName,\n providerName: template.name,\n itemTitle: selectedItem.title,\n issueSummary,\n gapId: primaryGap?.id\n });\n\n return {\n id: template.id,\n name: template.name,\n area: template.area,\n iconHtml: providerRailLogoHtml(resolveProviderLogoKey(template.id), template.name),\n state,\n statusText: providerStatusText(state),\n connectLabel: state === 'repo_evidence_found' ? 'Connect live' : undefined,\n launchPath,\n selectedItemId: selectedItem.id,\n cockpit: cockpitForProvider(template, primaryGap),\n nextFix: {\n id: primaryGap?.id ?? `${template.id}-verify-live`,\n title: primaryGap?.title ?? `Verify ${template.name} launch path`,\n whyItMatters: primaryGap?.detail ?? `${template.name} needs repo evidence and provider truth before real users rely on it.`,\n whatToChange: primaryGap?.copyPrompt ?? 'Review the launch path, complete any manual provider steps, then verify with VibeRaven.',\n verifyInstruction: 'Run VibeRaven verify after the repo or provider change is complete.',\n prompt,\n artifactRefs: [\n '.viberaven/agent-tasklist.md',\n '.viberaven/context-map.json',\n '.viberaven/gate-result.json'\n ]\n }\n };\n}\n\nfunction primaryGap(artifact: CliScanArtifact): GapLike | undefined {\n return artifact.gaps.find((gap) => gap.severity === 'critical') ?? artifact.gaps[0];\n}\n\nfunction providerIdForGap(gap: GapLike | undefined): string {\n if (!gap) return 'supabase';\n const directText = gapDirectText(gap);\n const directMatch = listLocalUiProviderCatalog().find((provider) => directText.includes(provider.id) || directText.includes(provider.name.toLowerCase()));\n if (directMatch) return directMatch.id;\n return listLocalUiProviderCatalog().find((provider) => gapMatchesProvider(gap, provider.id))?.id ?? 'supabase';\n}\n\nfunction buildMissionControl(artifact: CliScanArtifact, selectedProvider: LocalUiProvider): LocalUiMissionControl {\n const gap = primaryGap(artifact);\n const canLaunch = artifact.gaps.length === 0 && artifact.score >= 80 ? 'yes' : 'not_yet';\n const proof = selectedProvider.cockpit?.proof ?? proofForProvider(selectedProvider.id, gap);\n const mainBlocker = gap?.title ?? (canLaunch === 'yes' ? 'No launch blocker detected' : 'Run a scan to find the main blocker');\n return {\n canLaunch,\n answer: canLaunch === 'yes' ? 'Yes.' : 'Not yet.',\n mainBlocker,\n nextAction: gap?.title ?? 'Run VibeRaven scan',\n fixNext: {\n label: 'Fix next',\n target: gap\n ? { kind: 'provider', providerId: selectedProvider.id, actionId: selectedProvider.cockpit?.action.id ?? `${selectedProvider.id}-current-action` }\n : { kind: 'verify', verify: { label: 'Verify', commandPreview: 'npx -y viberaven --verify', intent: 'verify_gate' } }\n },\n environment: {\n local: 'Local evidence found',\n preview: 'Preview not verified',\n production: canLaunch === 'yes' ? 'Production proof clear' : 'Production proof missing'\n },\n proof,\n changedSinceLastScan: {\n summary: gap ? `1 blocker active since ${artifact.scannedAt ?? 'last scan'}` : 'No new blockers detected',\n details: gap ? [gap.title] : []\n },\n scaleBasics: [\n {\n risk: 'Webhook may run twice',\n whyItMatters: 'Payment providers can send the same event more than once.',\n status: artifact.gaps.some((item) => gapSearchText(item).includes('webhook')) ? 'missing' : 'unknown'\n },\n {\n risk: 'Database may struggle with real users',\n whyItMatters: 'Serverless apps often need production-safe database connection pooling.',\n status: artifact.gaps.some((item) => gapSearchText(item).includes('pool')) ? 'missing' : 'unknown'\n }\n ]\n };\n}\n\nexport function emptyLocalUiState(cwd: string): LocalUiState {\n const projectName = projectNameFromPath(cwd);\n const artifact = {\n version: 1,\n scannedAt: undefined,\n workspacePath: cwd,\n score: 0,\n scoreLabel: 'Not scanned',\n summary: 'Run a scan to build provider launch paths.',\n archetype: 'unknown',\n productionCorePercent: 0,\n gaps: [],\n missionGraph: { areas: [], byArea: {}, byProvider: {}, repositoryEvidence: { env: [], security: [] } },\n stackWiring: { items: [], byKey: {} },\n providerRegistry: { version: 1, source: 'bundled', generatedAt: new Date().toISOString(), status: 'fresh', staleAfterDays: 14, providers: [] }\n } as unknown as CliScanArtifact;\n const state = mapArtifactToLocalUiState(artifact);\n return {\n ...state,\n project: {\n ...state.project,\n name: 'Project'\n },\n empty: true\n };\n}\n\nexport function mapArtifactToLocalUiState(artifact: CliScanArtifact): LocalUiState {\n const projectName = projectNameFromPath(artifact.workspacePath);\n const providers = listLocalUiProviderCatalog().map((template) => mapProvider(template, artifact, projectName));\n const globalProviderId = providerIdForGap(primaryGap(artifact));\n const selectedProvider =\n providers.find((provider) => provider.id === globalProviderId) ??\n providers.find((provider) => provider.state === 'needs_repo_fix') ??\n providers.find((provider) => provider.state === 'repo_evidence_found') ??\n providers[0];\n\n return {\n product: 'VibeRaven',\n tagline: 'From AI demo to production',\n command: 'npx -y viberaven',\n project: {\n name: projectName,\n path: artifact.workspacePath,\n archetype: artifact.archetype,\n scannedAt: artifact.scannedAt\n },\n gate: {\n status: artifact.gaps.length === 0 && artifact.score >= 80 ? 'clear' : 'not_clear',\n label: artifact.gaps.length === 0 && artifact.score >= 80 ? 'Ready' : 'Gate not clear',\n score: artifact.score,\n productionCorePercent: artifact.productionCorePercent\n },\n missionControl: buildMissionControl(artifact, selectedProvider),\n providers,\n selectedProviderId: selectedProvider.id,\n currentPrompt: selectedProvider.nextFix?.prompt ?? '',\n artifacts: {\n tasklist: join('.viberaven', 'agent-tasklist.md'),\n contextMap: join('.viberaven', 'context-map.json'),\n gateResult: join('.viberaven', 'gate-result.json'),\n lastScan: join('.viberaven', 'last-scan.json')\n },\n empty: false\n };\n}\n", "export const localUiClientJs = `\nconst stateEl = document.getElementById('vr-state');\nconst providerList = document.getElementById('vr-provider-list');\nconst center = document.getElementById('vr-center');\nconst promptEl = document.getElementById('vr-prompt');\nconst startupEl = document.getElementById('vr-startup');\nconst startupNext = document.getElementById('vr-startup-next');\nconst startupNameInput = document.getElementById('vr-startup-project-name');\nconst startupVersionInput = document.getElementById('vr-startup-project-version');\nconst startupImageInput = document.getElementById('vr-startup-project-image');\nconst startupMark = document.getElementById('vr-startup-mark');\nconst startupPreviewImage = document.getElementById('vr-startup-preview-image');\nconst startupAddIcon = document.getElementById('vr-startup-add-icon');\nconst topbarProjectName = document.getElementById('vr-topbar-project-name');\nconst topbarProjectImage = document.getElementById('vr-topbar-project-image');\nconst copyStatusEl = document.getElementById('vr-copy-status');\nconst providerSearch = document.querySelector('.vr-provider-search');\nconst guidePanel = document.getElementById('vr-guide-panel');\nconst guideTitle = document.getElementById('vr-guide-title');\nconst guideKicker = document.getElementById('vr-guide-kicker');\nconst guideSummary = document.getElementById('vr-guide-summary');\nconst guideBody = document.getElementById('vr-guide-body');\nlet currentState = JSON.parse(stateEl.textContent);\nlet selectedProviderId = currentState.selectedProviderId;\nlet providerFilter = '';\n\nfunction escapeHtml(value) {\n return String(value)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\nfunction labelForState(state) {\n return String(state).replace(/_/g, ' ');\n}\n\nfunction launchStateLabel(state) {\n switch (state) {\n case 'ready':\n return 'Ready';\n case 'blocked':\n return 'Blocked';\n case 'needs_fix':\n return 'Pending';\n case 'requires_user_action':\n return 'Action needed';\n case 'needs_connect':\n return 'Connect';\n case 'not_checked':\n default:\n return 'Pending';\n }\n}\n\nfunction evidenceCounts() {\n const checks = currentState.missionControl.proof.checks || [];\n return {\n found: checks.filter((check) => check.status === 'yes').length,\n missing: checks.filter((check) => check.status === 'no' || check.status === 'unknown').length\n };\n}\n\nfunction closeGuidePanel() {\n guidePanel.classList.remove('is-open');\n guidePanel.setAttribute('aria-hidden', 'true');\n}\n\nfunction openGuidePanel({ kicker, title, summary, body }) {\n guideKicker.textContent = kicker;\n guideTitle.textContent = title;\n guideSummary.textContent = summary;\n guideBody.innerHTML = body;\n guidePanel.classList.add('is-open');\n guidePanel.setAttribute('aria-hidden', 'false');\n}\n\nasync function copyText(value) {\n if (navigator.clipboard && navigator.clipboard.writeText) {\n try {\n await navigator.clipboard.writeText(value);\n return true;\n } catch {\n // Fall back to the hidden textarea path below.\n }\n }\n const textarea = document.createElement('textarea');\n textarea.value = value;\n textarea.setAttribute('readonly', '');\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n const copied = document.execCommand('copy');\n textarea.remove();\n return copied;\n}\n\nfunction showCopyStatus(message) {\n copyStatusEl.textContent = message;\n copyStatusEl.hidden = false;\n window.setTimeout(() => {\n copyStatusEl.hidden = true;\n }, 1800);\n}\n\nfunction guidanceStep(label, title, body) {\n return '<section class=\"vr-guide-step\"><span>' + escapeHtml(label) + '</span><div><strong>' +\n escapeHtml(title) + '</strong><p>' + escapeHtml(body) + '</p></div></section>';\n}\n\nfunction tasklistMarkup(text) {\n const lines = text.split('\\\\n').filter((line) => line.trim()).slice(0, 12);\n return '<div class=\"vr-guide-note\"><strong>How to use this</strong><p>Read the first active gap, fix only that repo or provider step, then run verify from VibeRaven.</p></div>' +\n '<pre class=\"vr-guide-pre\">' + escapeHtml(lines.join('\\\\n')) + '</pre>';\n}\n\nfunction docsMarkup() {\n return '<div class=\"vr-guide-note\"><strong>Launch docs</strong><p>Use these references when you need the deeper production-readiness context behind this screen.</p></div>' +\n '<div class=\"vr-guide-links\">' +\n '<a href=\"https://viberaven.dev/how-to-launch-ai-app-safely\" target=\"_blank\" rel=\"noreferrer\">How to launch an AI-built app safely</a>' +\n '<a href=\"https://viberaven.dev/ai-app-production-checklist\" target=\"_blank\" rel=\"noreferrer\">AI app production checklist</a>' +\n '<a href=\"https://viberaven.dev/vercel-preview-to-production-checklist\" target=\"_blank\" rel=\"noreferrer\">Vercel preview to production checklist</a>' +\n '<a href=\"https://viberaven.dev/what-is-rls-supabase-ai-apps\" target=\"_blank\" rel=\"noreferrer\">Supabase RLS guide</a>' +\n '</div>';\n}\n\nfunction workspaceMarkup() {\n return '<div class=\"vr-guide-note\"><strong>' + escapeHtml(currentState.project.name) + '</strong><p>' +\n escapeHtml(currentState.project.path || 'Current workspace') + '</p></div>' +\n '<div class=\"vr-guide-steps\">' +\n guidanceStep('State', currentState.gate.label, 'VibeRaven keeps repo evidence, provider proof, and verification state separate.') +\n guidanceStep('Version', currentState.project.version || 'Version not set', 'Edit this from the startup screen when you want the launch view to use a cleaner display version.') +\n guidanceStep('Command', currentState.command, 'Use the local launch console command for the open-source UI path.') +\n '</div><button class=\"vr-button vr-button-primary vr-guide-edit-project\" type=\"button\">Edit project screen</button>';\n}\n\nfunction notificationMarkup() {\n const mission = currentState.missionControl;\n return '<div class=\"vr-guide-note\"><strong>Launch signals</strong><p>' + escapeHtml(mission.changedSinceLastScan.summary) + '</p></div>' +\n '<div class=\"vr-guide-steps\">' +\n guidanceStep('Status', mission.answer, mission.mainBlocker) +\n guidanceStep('Next', mission.nextAction, 'Use Fix next or Take action to stay on the safest current move.') +\n guidanceStep('Proof', labelForState(mission.proof.level), mission.proof.summary) +\n '</div>';\n}\n\nfunction providerGuideMarkup(provider, cockpit) {\n return '<div class=\"vr-guide-note\"><strong>Do one safe thing next</strong><p>This guide keeps the provider action focused. Complete the user step only when dashboard proof is required.</p></div>' +\n '<div class=\"vr-guide-steps\">' +\n guidanceStep('You', cockpit.action.lanes.you.title, cockpit.action.lanes.you.body) +\n guidanceStep('Agent', cockpit.action.lanes.agent.title, cockpit.action.lanes.agent.body) +\n guidanceStep('Verify', cockpit.action.lanes.verify.label, cockpit.action.lanes.verify.commandPreview) +\n '</div><div class=\"vr-guide-note\"><strong>Where to click</strong><p>' + escapeHtml(cockpit.action.whereToClick) + '</p></div>' +\n '<button class=\"vr-button vr-button-primary vr-guide-run\" type=\"button\" data-verify-intent=\"' +\n escapeHtml(cockpit.action.lanes.verify.intent) + '\" data-action-id=\"' + escapeHtml(cockpit.action.lanes.verify.actionId || '') + '\">Run verify</button>';\n}\n\nfunction selectedProvider() {\n return currentState.providers.find((provider) => provider.id === selectedProviderId) || currentState.providers[0];\n}\n\nfunction primaryProviders() {\n const query = providerFilter.trim().toLowerCase();\n if (!query) return currentState.providers;\n return currentState.providers.filter((provider) =>\n [provider.name, provider.statusText, provider.area].join(' ').toLowerCase().includes(query)\n );\n}\n\nfunction missionMarkup() {\n const mission = currentState.missionControl;\n const counts = evidenceCounts();\n return '<section class=\"vr-mission\" aria-label=\"Project Mission Control\">' +\n '<div class=\"vr-mission-answer\"><span>Current status</span><strong>' + escapeHtml(mission.answer) + '</strong></div>' +\n '<div class=\"vr-mission-copy\"><span>Main blocker</span><strong>' + escapeHtml(mission.mainBlocker) + '</strong></div>' +\n '<div class=\"vr-mission-copy\"><span>Next step</span><strong>' + escapeHtml(mission.nextAction) + '</strong></div>' +\n '<div class=\"vr-mission-evidence\"><span>Evidence</span><strong><i class=\"is-found\"></i>' + String(counts.found) + ' found</strong><strong><i class=\"is-missing\"></i>' + String(counts.missing) + ' missing</strong></div>' +\n '</section>';\n}\n\nfunction renderProviders() {\n providerList.innerHTML = primaryProviders().map((provider) => {\n const selected = provider.id === selectedProviderId ? ' is-selected' : '';\n return '<button class=\"vr-provider' + selected + '\" data-provider=\"' + escapeHtml(provider.id) + '\" data-state=\"' + escapeHtml(provider.state) + '\">' +\n '<span class=\"vr-provider-icon\">' + provider.iconHtml + '</span>' +\n '<span><span class=\"vr-provider-name\">' + escapeHtml(provider.name) + '</span>' +\n '<span class=\"vr-provider-state\">' + escapeHtml(provider.statusText) + '</span></span>' +\n '</button>';\n }).join('');\n}\n\nfunction renderCenter() {\n const provider = selectedProvider();\n const selectedItem = provider.launchPath.find((item) => item.id === provider.selectedItemId) || provider.launchPath[0];\n const cockpit = provider.cockpit;\n const proof = cockpit.proof;\n center.innerHTML =\n missionMarkup() +\n '<div class=\"vr-panel-head\"><div><p class=\"vr-eyebrow\">' + escapeHtml(provider.area) + '</p>' +\n '<h1>Your launch path</h1>' +\n '<p class=\"vr-muted\">We will guide you through every step to production readiness.</p></div>' +\n '<div class=\"vr-panel-actions\"><button id=\"vr-preview-report\" class=\"vr-button vr-button-preview\" type=\"button\">Preview report</button>' +\n '<button class=\"vr-button vr-button-primary\" type=\"button\" data-verify-intent=\"' + escapeHtml(cockpit.action.lanes.verify.intent) + '\" data-action-id=\"' + escapeHtml(cockpit.action.lanes.verify.actionId || '') + '\">Run verify</button></div></div>' +\n '<div class=\"vr-path\">' +\n provider.launchPath.map((item, index) =>\n '<button class=\"vr-path-row' + (item.id === selectedItem.id ? ' is-focused' : '') + '\" type=\"button\" data-path-item=\"' + escapeHtml(item.id) + '\" data-step=\"' + String(index + 1) + '\">' +\n '<span class=\"vr-step\"><span>' + String(index + 1) + '</span></span>' +\n '<span class=\"vr-path-icon\" data-source=\"' + escapeHtml(item.source) + '\" data-state=\"' + escapeHtml(item.state) + '\" aria-hidden=\"true\"></span>' +\n '<span><strong>' + escapeHtml(item.title) + '</strong><br><span class=\"vr-muted\">' + escapeHtml(item.shortReason) + '</span></span>' +\n '<span class=\"vr-state\" data-state=\"' + escapeHtml(item.state) + '\">' + escapeHtml(launchStateLabel(item.state)) + '</span>' +\n '</button>'\n ).join('') +\n '<section class=\"vr-next\"><div class=\"vr-next-head\"><div><span><i class=\"vr-next-glyph\" aria-hidden=\"true\"></i>Next action</span><p class=\"vr-muted\">Complete the following to keep the launch path moving.</p></div></div>' +\n '<article class=\"vr-next-action\"><span class=\"vr-next-badge\">High impact</span><div><strong>' + escapeHtml(cockpit.action.title) + '</strong><p>' + escapeHtml(cockpit.action.whyThisMatters) + '</p></div>' +\n '<button class=\"vr-button vr-button-take\" type=\"button\" data-open-guide=\"provider\">Take action</button></article>' +\n '<div class=\"vr-action-flow\" aria-label=\"Action impact\">' +\n '<span data-step=\"Impact\"><b>Impact</b>High - blocks next step</span>' +\n '<span data-step=\"Effort\"><b>Effort</b>Low</span>' +\n '<span data-step=\"ETA\"><b>ETA</b>~ 2 min</span>' +\n '</div>' +\n '<section class=\"vr-proof\"><h2>Proof ladder</h2><p>' + escapeHtml(labelForState(proof.level)) + '</p><strong>' + escapeHtml(proof.summary) + '</strong>' +\n '<div class=\"vr-proof-checks\">' + proof.checks.map((check) =>\n '<span><b>' + escapeHtml(check.label) + '</b><em>' + escapeHtml(check.status) + '</em></span>'\n ).join('') + '</div></section>' +\n '<details class=\"vr-details\"><summary>Changed since last scan</summary><p>' + escapeHtml(currentState.missionControl.changedSinceLastScan.summary) + '</p></details>' +\n '<details class=\"vr-details\"><summary>Scale basics</summary>' + currentState.missionControl.scaleBasics.map((item) =>\n '<p><strong>' + escapeHtml(item.risk) + '</strong><br>' + escapeHtml(item.whyItMatters) + '</p>'\n ).join('') + '</details></section>' +\n '</div>';\n promptEl.textContent = provider.nextFix.prompt;\n}\n\nfunction render() {\n renderProviders();\n renderCenter();\n}\n\nfunction enterConsole() {\n applyStartupProjectEdits();\n startupEl.classList.add('is-dismissed');\n}\n\nfunction applyStartupProjectEdits() {\n const nextName = startupNameInput.value.trim() || currentState.project.name;\n const nextVersion = startupVersionInput.value.trim() || currentState.project.version || '';\n currentState.project.name = nextName;\n currentState.project.version = nextVersion;\n topbarProjectName.textContent = nextName;\n}\n\nfunction updateProjectImage(src) {\n if (!src) return;\n startupPreviewImage.hidden = false;\n startupPreviewImage.src = src;\n topbarProjectImage.hidden = false;\n topbarProjectImage.src = src;\n startupMark.classList.remove('is-empty');\n startupAddIcon.textContent = 'Change';\n}\n\nfunction scrollActionIntoView() {\n window.setTimeout(() => {\n const nextAction = center.querySelector('.vr-next');\n if (nextAction) nextAction.scrollIntoView({ block: 'start', behavior: 'smooth' });\n }, 0);\n}\n\nproviderList.addEventListener('click', (event) => {\n const button = event.target.closest('[data-provider]');\n if (!button) return;\n selectedProviderId = button.getAttribute('data-provider');\n render();\n});\n\ncenter.addEventListener('click', (event) => {\n const pathRow = event.target.closest('[data-path-item]');\n if (!pathRow) return;\n const provider = selectedProvider();\n provider.selectedItemId = pathRow.getAttribute('data-path-item');\n render();\n});\n\ncenter.addEventListener('click', (event) => {\n const button = event.target.closest('#vr-fix-next');\n if (!button) return;\n const target = currentState.missionControl.fixNext.target;\n if (target.kind === 'provider') {\n selectedProviderId = target.providerId;\n render();\n scrollActionIntoView();\n return;\n }\n if (target.kind === 'verify') {\n runVerifyIntent(target.verify);\n }\n});\n\ncenter.addEventListener('click', (event) => {\n const button = event.target.closest('[data-open-guide=\"provider\"]');\n if (!button) return;\n const provider = selectedProvider();\n openGuidePanel({\n kicker: provider.name + ' action',\n title: provider.cockpit.action.title,\n summary: 'Use this as the focused path for the selected provider. Keep the repo fix, provider step, and verification separate.',\n body: providerGuideMarkup(provider, provider.cockpit)\n });\n});\n\ndocument.getElementById('vr-copy-prompt').addEventListener('click', async () => {\n const copied = await copyText(promptEl.textContent);\n showCopyStatus(copied ? 'Copied to clipboard' : 'Copy failed. Select the prompt text manually.');\n});\n\nasync function runAction(path) {\n const response = await fetch(path, { method: 'POST' });\n currentState = await response.json();\n selectedProviderId = currentState.selectedProviderId;\n render();\n}\n\nasync function runVerifyIntent(verify) {\n const response = await fetch('/api/verify-intent', {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ intent: verify.intent, actionId: verify.actionId })\n });\n currentState = await response.json();\n selectedProviderId = currentState.selectedProviderId;\n render();\n}\n\ncenter.addEventListener('click', (event) => {\n const button = event.target.closest('[data-verify-intent]');\n if (!button) return;\n runVerifyIntent({\n intent: button.getAttribute('data-verify-intent'),\n actionId: button.getAttribute('data-action-id') || undefined\n });\n});\n\ncenter.addEventListener('click', async (event) => {\n const button = event.target.closest('#vr-preview-report');\n if (!button) return;\n const response = await fetch('/api/artifacts/report');\n if (!response.ok) {\n openGuidePanel({\n kicker: 'Report',\n title: 'Preview report',\n summary: 'No report artifact is available yet. Run VibeRaven once to create .viberaven/report.html.',\n body: '<div class=\"vr-guide-note\"><strong>Missing artifact</strong><p>.viberaven/report.html was not found for this workspace.</p></div>'\n });\n return;\n }\n const reportWindow = window.open('/api/artifacts/report', '_blank', 'noopener,noreferrer');\n if (reportWindow) return;\n openGuidePanel({\n kicker: 'Report',\n title: 'Preview report',\n summary: 'The browser blocked the report tab. Open .viberaven/report.html from this workspace, or rerun VibeRaven to refresh it.',\n body: '<div class=\"vr-guide-note\"><strong>Report artifact</strong><p>.viberaven/report.html</p></div>'\n });\n});\n\ndocument.addEventListener('click', (event) => {\n const button = event.target.closest('.vr-quick-button[data-verify-intent]');\n if (!button) return;\n runVerifyIntent({\n intent: button.getAttribute('data-verify-intent'),\n actionId: button.getAttribute('data-action-id') || undefined\n });\n});\n\ndocument.addEventListener('click', (event) => {\n const button = event.target.closest('.vr-guide-run[data-verify-intent]');\n if (!button) return;\n closeGuidePanel();\n runVerifyIntent({\n intent: button.getAttribute('data-verify-intent'),\n actionId: button.getAttribute('data-action-id') || undefined\n });\n});\n\ndocument.getElementById('vr-open-tasklist').addEventListener('click', async () => {\n openGuidePanel({\n kicker: 'Tasklist',\n title: 'Open tasklist',\n summary: 'A short view of the current VibeRaven tasklist. Start with the first active launch gap.',\n body: '<div class=\"vr-guide-note\"><strong>Loading tasklist</strong><p>Reading .viberaven/agent-tasklist.md from this project.</p></div>'\n });\n const response = await fetch('/api/artifacts/tasklist');\n const text = response.ok ? await response.text() : 'Tasklist is not available yet. Run VibeRaven from this project to create it.';\n openGuidePanel({\n kicker: 'Tasklist',\n title: 'Open tasklist',\n summary: 'A short view of the current VibeRaven tasklist. Start with the first active launch gap.',\n body: tasklistMarkup(text)\n });\n});\n\ndocument.getElementById('vr-view-docs').addEventListener('click', () => {\n openGuidePanel({\n kicker: 'Docs',\n title: 'Launch docs',\n summary: 'Short references for production readiness, provider proof, and launch verification.',\n body: docsMarkup()\n });\n});\n\ndocument.getElementById('vr-open-help').addEventListener('click', () => {\n openGuidePanel({\n kicker: 'Help',\n title: 'Need help?',\n summary: 'Use this when the next provider action is unclear.',\n body: docsMarkup()\n });\n});\n\ndocument.getElementById('vr-workspace-menu').addEventListener('click', () => {\n openGuidePanel({\n kicker: 'Workspace',\n title: 'Workspace',\n summary: 'Current project identity and VibeRaven command context.',\n body: workspaceMarkup()\n });\n});\n\ndocument.getElementById('vr-new-project').addEventListener('click', () => {\n startupEl.classList.remove('is-dismissed');\n startupNameInput.focus();\n startupNameInput.select();\n});\n\ndocument.getElementById('vr-notifications').addEventListener('click', () => {\n openGuidePanel({\n kicker: 'Signals',\n title: 'Launch signals',\n summary: 'What changed, what blocks launch, and what proof is still missing.',\n body: notificationMarkup()\n });\n});\n\ndocument.addEventListener('click', (event) => {\n const button = event.target.closest('.vr-guide-edit-project');\n if (!button) return;\n closeGuidePanel();\n startupEl.classList.remove('is-dismissed');\n startupNameInput.focus();\n startupNameInput.select();\n});\n\ndocument.getElementById('vr-guide-close').addEventListener('click', closeGuidePanel);\ndocument.getElementById('vr-guide-backdrop').addEventListener('click', closeGuidePanel);\ndocument.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') closeGuidePanel();\n});\n\ndocument.getElementById('vr-run-scan').addEventListener('click', async () => {\n const copied = await copyText(currentState.command);\n openGuidePanel({\n kicker: 'Command',\n title: copied ? 'Command copied' : 'Run VibeRaven',\n summary: copied ? 'Paste this in your terminal when you want to reopen the local launch console.' : 'Copy this command from the panel below.',\n body: '<div class=\"vr-guide-note\"><strong>' + escapeHtml(currentState.command) + '</strong><p>This opens the local launch console. Agent-mode scans remain separate.</p></div>'\n });\n});\ndocument.getElementById('vr-run-verify').addEventListener('click', () => runVerifyIntent({ intent: 'verify_gate' }));\nproviderSearch.addEventListener('input', () => {\n providerFilter = providerSearch.value;\n renderProviders();\n});\nstartupNext.addEventListener('click', enterConsole);\nstartupNameInput.addEventListener('input', applyStartupProjectEdits);\nstartupVersionInput.addEventListener('input', applyStartupProjectEdits);\nstartupPreviewImage.addEventListener('error', () => {\n startupPreviewImage.hidden = true;\n startupMark.classList.add('is-empty');\n startupAddIcon.textContent = 'Add icon';\n});\ntopbarProjectImage.addEventListener('error', () => {\n topbarProjectImage.hidden = true;\n});\nstartupImageInput.addEventListener('change', () => {\n const file = startupImageInput.files && startupImageInput.files[0];\n if (!file) return;\n updateProjectImage(URL.createObjectURL(file));\n});\n\nrender();\n`;\n", "export const localUiCss = `\n:root {\n --vr-page: #fbfbfa;\n --vr-panel: #ffffff;\n --vr-panel-warm: #fffaf4;\n --vr-soft: #f6f7f8;\n --vr-border: #e6e8ec;\n --vr-border-strong: #d7dce4;\n --vr-text: #111417;\n --vr-muted: #667085;\n --vr-faint: #98a2b3;\n --vr-accent: #ff7a00;\n --vr-accent-soft: #fff2e2;\n --vr-success: #18a865;\n --vr-warning: #f59f00;\n --vr-danger: #e02424;\n --vr-black: #071018;\n --vr-purple: #7c3aed;\n --vr-radius: 8px;\n}\n\n* { box-sizing: border-box; }\nhtml, body { height: 100%; }\nbody {\n margin: 0;\n overflow: hidden;\n background: var(--vr-page);\n color: var(--vr-text);\n font-family: Geist, \"Segoe UI\", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n font-size: 12px;\n}\nbutton, input { font: inherit; }\nbutton { cursor: pointer; }\n\n.vr-shell {\n height: 100dvh;\n min-height: 100vh;\n display: grid;\n grid-template-rows: 68px minmax(0, 1fr) 38px;\n background: var(--vr-page);\n}\n\n.vr-topbar {\n display: grid;\n grid-template-columns: minmax(340px, 1fr) minmax(240px, 310px) auto;\n align-items: center;\n gap: 18px;\n padding: 0 26px;\n border-bottom: 1px solid var(--vr-border);\n background: rgba(251, 251, 250, 0.96);\n box-shadow: 0 1px 0 rgba(17, 20, 23, 0.02);\n}\n.vr-brand-lockup {\n display: flex;\n align-items: center;\n gap: 14px;\n min-width: 0;\n}\n.vr-raven-mark {\n width: 58px;\n height: 46px;\n display: inline-grid;\n place-items: center;\n overflow: visible;\n}\n.vr-raven-mark img {\n width: 54px;\n height: 54px;\n display: block;\n object-fit: contain;\n transform: translateY(1px);\n}\n.vr-brand-lockup strong {\n font-size: 28px;\n line-height: 1;\n font-weight: 760;\n white-space: nowrap;\n}\n.vr-tagline {\n padding: 9px 18px;\n border: 1px solid #eef0f4;\n border-radius: 10px;\n background: #f4f6f8;\n color: #475467;\n font-size: 14px;\n font-weight: 600;\n white-space: nowrap;\n}\n.vr-project-picker {\n width: 100%;\n min-width: 0;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n border: 1px solid var(--vr-border);\n border-radius: var(--vr-radius, 8px);\n background: #ffffff;\n color: var(--vr-text);\n padding: 9px 14px;\n font-size: 12px;\n font-weight: 650;\n}\n.vr-project-picker::before {\n content: \"\";\n width: 18px;\n height: 13px;\n border: 1.6px solid currentColor;\n border-radius: 3px;\n clip-path: polygon(0 28%, 36% 28%, 43% 8%, 100% 8%, 100% 100%, 0 100%);\n background: linear-gradient(180deg, rgba(17, 20, 23, 0.03), rgba(17, 20, 23, 0.08));\n flex: 0 0 auto;\n}\n.vr-project-picker::after {\n content: \"\";\n width: 7px;\n height: 7px;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n transform: rotate(45deg) translateY(-2px);\n opacity: 0.7;\n flex: 0 0 auto;\n}\n.vr-project-picker span {\n min-width: 0;\n flex: 1;\n overflow: hidden;\n text-align: left;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.vr-top-actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 12px;\n}\n.vr-live-status {\n display: inline-flex;\n align-items: center;\n gap: 9px;\n min-height: 44px;\n padding: 9px 16px;\n border: 1px solid var(--vr-border);\n border-radius: var(--vr-radius, 8px);\n background: #ffffff;\n color: var(--vr-text);\n font-size: 12px;\n font-weight: 650;\n}\n.vr-status-dot {\n width: 8px;\n height: 8px;\n border-radius: 99px;\n background: var(--vr-success);\n}\n.vr-icon-button {\n width: 44px;\n height: 44px;\n display: inline-grid;\n place-items: center;\n border: 1px solid var(--vr-border);\n border-radius: 999px;\n background: #ffffff;\n}\n.vr-gear-icon {\n width: 20px;\n height: 20px;\n border: 1.9px solid #475467;\n border-radius: 99px;\n position: relative;\n}\n.vr-gear-icon::before {\n content: \"\";\n position: absolute;\n inset: 4px;\n border-radius: 99px;\n background: #475467;\n}\n.vr-button {\n border: 1px solid var(--vr-border);\n border-radius: 8px;\n background: #ffffff;\n color: var(--vr-text);\n padding: 9px 12px;\n font-size: 13px;\n font-weight: 650;\n}\n.vr-button:hover, .vr-icon-button:hover, .vr-provider:hover, .vr-path-row:hover, .vr-quick-button:hover {\n border-color: #cfd4dc;\n}\n.vr-button:active, .vr-icon-button:active, .vr-provider:active, .vr-path-row:active, .vr-quick-button:active {\n transform: translateY(1px);\n}\n.vr-button-primary {\n border-color: var(--vr-black);\n background: var(--vr-black);\n color: #ffffff;\n}\n.vr-top-actions .vr-button-primary {\n min-width: 128px;\n height: 44px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n font-size: 15px;\n border-radius: 9px;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 8px 18px rgba(7, 16, 24, 0.12);\n}\n.vr-guide-button {\n border-color: var(--vr-purple);\n background: var(--vr-purple);\n color: #ffffff;\n}\n\n.vr-main {\n min-height: 0;\n display: grid;\n grid-template-columns: 360px minmax(600px, 1fr) 520px;\n overflow: hidden;\n}\n.vr-rail, .vr-center-panel, .vr-right-rail {\n min-width: 0;\n min-height: 0;\n}\n.vr-rail {\n display: block;\n overflow: auto;\n border-right: 1px solid var(--vr-border);\n background: var(--vr-page);\n padding: 36px 28px 28px;\n}\n.vr-rail-head {\n padding: 0;\n}\n.vr-rail-head h2 {\n margin: 0 0 16px;\n color: var(--vr-text);\n font-size: 16px;\n line-height: 1;\n font-weight: 750;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.vr-rail-head h2::before {\n content: \"\";\n width: 17px;\n height: 15px;\n display: inline-block;\n background:\n linear-gradient(var(--vr-muted) 0 0) 8px 2px / 9px 1.5px no-repeat,\n linear-gradient(var(--vr-muted) 0 0) 8px 7px / 9px 1.5px no-repeat,\n linear-gradient(var(--vr-muted) 0 0) 8px 12px / 9px 1.5px no-repeat,\n radial-gradient(circle, var(--vr-muted) 1.7px, transparent 2px) 0 0 / 7px 5px repeat-y;\n}\n.vr-provider-search {\n width: 100%;\n height: 44px;\n border: 1px solid var(--vr-border);\n border-radius: 9px;\n background: #ffffff;\n color: var(--vr-text);\n padding: 0 12px;\n margin-bottom: 18px;\n font-size: 13px;\n}\n.vr-provider-search::placeholder { color: #98a2b3; }\n.vr-provider-list {\n display: grid;\n gap: 10px;\n align-content: start;\n overflow: visible;\n padding: 0;\n}\n.vr-provider {\n width: 100%;\n position: relative;\n display: grid;\n grid-template-columns: 42px minmax(0, 1fr);\n gap: 14px;\n align-items: center;\n min-height: 64px;\n border: 1px solid var(--vr-border);\n border-radius: 10px;\n background: #ffffff;\n padding: 11px 32px 11px 14px;\n text-align: left;\n box-shadow: 0 1px 2px rgba(16, 24, 40, 0.02);\n}\n.vr-provider::after {\n content: \"\";\n position: absolute;\n right: 14px;\n top: 50%;\n width: 7px;\n height: 7px;\n border-radius: 99px;\n background: var(--vr-faint);\n transform: translateY(-50%);\n}\n.vr-provider[data-state=\"repo_evidence_found\"]::after,\n.vr-provider[data-state=\"live_verified\"]::after { background: var(--vr-success); }\n.vr-provider[data-state=\"needs_repo_fix\"]::after,\n.vr-provider[data-state=\"requires_user_action\"]::after,\n.vr-provider[data-state=\"connect_live\"]::after { background: var(--vr-warning); }\n.vr-provider[data-state=\"blocked\"]::after,\n.vr-provider[data-state=\"error\"]::after { background: var(--vr-danger); }\n.vr-provider.is-selected {\n border-color: var(--vr-accent);\n background: #fffaf5;\n box-shadow: 0 8px 22px rgba(255, 122, 0, 0.08);\n}\n.vr-provider-icon {\n position: relative;\n width: 42px;\n height: 42px;\n display: grid;\n place-items: center;\n border: 1px solid rgba(17, 20, 23, 0.08);\n border-radius: 11px;\n background: linear-gradient(180deg, #ffffff, #f8fafc);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.85), 0 8px 18px rgba(16, 24, 40, 0.045);\n overflow: hidden;\n}\n.vr-provider-icon svg, .vr-provider-icon img {\n width: 30px;\n height: 30px;\n display: block;\n object-fit: contain;\n position: relative;\n z-index: 1;\n}\n.vr-provider[data-provider=\"supabase\"] .vr-provider-icon { background: linear-gradient(145deg, #effdf7, #ffffff 62%); border-color: rgba(62, 207, 142, 0.28); }\n.vr-provider[data-provider=\"vercel\"] .vr-provider-icon { background: linear-gradient(145deg, #ffffff, #f2f4f7); border-color: rgba(17, 20, 23, 0.12); }\n.vr-provider[data-provider=\"stripe\"] .vr-provider-icon { background: linear-gradient(145deg, #f4f3ff, #ffffff 64%); border-color: rgba(99, 91, 255, 0.24); }\n.vr-provider[data-provider=\"github\"] .vr-provider-icon { background: linear-gradient(145deg, #f5f7fa, #ffffff); border-color: rgba(24, 23, 23, 0.12); }\n.vr-provider[data-provider=\"sentry\"] .vr-provider-icon { background: linear-gradient(145deg, #f6f2fb, #ffffff 62%); border-color: rgba(54, 45, 89, 0.22); }\n.vr-provider[data-provider=\"posthog\"] .vr-provider-icon { background: linear-gradient(145deg, #fff4eb, #ffffff 62%); border-color: rgba(245, 78, 0, 0.24); }\n.vr-provider[data-provider=\"clerk\"] .vr-provider-icon { background: linear-gradient(145deg, #f5f1ff, #ffffff 62%); border-color: rgba(108, 71, 255, 0.22); }\n.vr-provider[data-provider=\"authjs\"] .vr-provider-icon { background: linear-gradient(145deg, #f1eaff, #fff8df 86%); border-color: rgba(117, 67, 255, 0.24); }\n.vr-provider[data-provider=\"resend\"] .vr-provider-icon { background: linear-gradient(145deg, #ffffff, #f3f4f6); border-color: rgba(17, 20, 23, 0.12); }\n.vr-provider[data-provider=\"upstash\"] .vr-provider-icon { background: linear-gradient(145deg, #ebfff8, #ffffff 62%); border-color: rgba(0, 233, 163, 0.26); }\n.vr-provider-name {\n display: block;\n overflow: hidden;\n color: var(--vr-text);\n font-size: 14px;\n font-weight: 750;\n line-height: 1.1;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.vr-provider-state {\n display: block;\n margin-top: 6px;\n overflow: hidden;\n color: var(--vr-accent);\n font-size: 12px;\n font-weight: 700;\n line-height: 1.1;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.vr-provider[data-state=\"repo_evidence_found\"] .vr-provider-state,\n.vr-provider[data-state=\"live_verified\"] .vr-provider-state { color: #0f9d58; }\n.vr-provider[data-state=\"blocked\"] .vr-provider-state,\n.vr-provider[data-state=\"error\"] .vr-provider-state { color: var(--vr-danger); }\n.vr-run-card {\n display: grid;\n gap: 6px;\n margin: 20px 0 0;\n padding: 18px;\n border: 1px solid var(--vr-border);\n border-radius: 10px;\n background: #ffffff;\n box-shadow: 0 1px 2px rgba(16, 24, 40, 0.02);\n}\n.vr-run-card strong { font-size: 13px; }\n.vr-run-card span {\n color: var(--vr-muted);\n font-size: 13px;\n line-height: 1.35;\n}\n.vr-terminal-button {\n width: 100%;\n border: 0;\n border-radius: 7px;\n background: var(--vr-black);\n color: #ffffff;\n padding: 11px 12px;\n text-align: left;\n font: 13px/1.2 \"JetBrains Mono\", \"SFMono-Regular\", Consolas, monospace;\n}\n\n.vr-center-panel {\n overflow: auto;\n padding: 42px 48px 40px;\n border-right: 1px solid var(--vr-border);\n background: var(--vr-page);\n}\n.vr-mission {\n position: relative;\n display: grid;\n grid-template-columns: minmax(132px, 0.64fr) minmax(0, 1.35fr) minmax(0, 1.35fr) auto;\n gap: 10px;\n align-items: stretch;\n margin: 0 0 30px;\n max-width: 100%;\n padding: 12px;\n border: 1px solid var(--vr-border);\n border-radius: 14px;\n background: #ffffff;\n box-shadow: 0 14px 36px rgba(16, 24, 40, 0.04);\n overflow: hidden;\n animation: vrUiRise 360ms cubic-bezier(0.16, 1, 0.3, 1) both;\n}\n.vr-mission::before {\n content: none;\n}\n.vr-mission::after {\n content: none;\n}\n.vr-mission div {\n min-width: 0;\n display: grid;\n align-content: center;\n gap: 4px;\n position: relative;\n z-index: 1;\n}\n.vr-mission span {\n color: #667085;\n font-size: 11px;\n font-weight: 760;\n letter-spacing: 0;\n}\n.vr-mission strong {\n overflow: hidden;\n color: var(--vr-text);\n font-size: 13px;\n line-height: 1.25;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.vr-mission-answer {\n border-radius: 10px;\n background: #f7f8fa;\n padding: 13px 14px;\n box-shadow: inset 0 0 0 1px rgba(17, 20, 23, 0.045);\n}\n.vr-mission-answer span { color: #667085; }\n.vr-mission-answer strong {\n color: var(--vr-text);\n font-size: 21px;\n letter-spacing: 0;\n}\n.vr-mission-copy {\n border-radius: 10px;\n background: #ffffff;\n padding: 12px 13px;\n box-shadow: inset 0 0 0 1px rgba(17, 20, 23, 0.045);\n}\n.vr-mission-copy strong {\n display: -webkit-box;\n min-height: 34px;\n overflow: hidden;\n white-space: normal;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n}\n.vr-mission #vr-fix-next {\n position: relative;\n z-index: 1;\n min-width: 104px;\n align-self: center;\n min-height: 40px;\n border-radius: 10px;\n}\n.vr-env-row {\n grid-column: 1 / -1;\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 0;\n padding-top: 12px;\n border-top: 1px solid var(--vr-border);\n}\n.vr-env-row span {\n display: flex;\n align-items: center;\n min-width: 0;\n gap: 7px;\n border-radius: 0;\n background: transparent;\n padding: 3px 11px;\n color: var(--vr-muted);\n font-size: 12px;\n box-shadow: none;\n}\n.vr-env-row span + span {\n border-left: 1px solid var(--vr-border);\n}\n.vr-env-row span::before {\n content: \"\";\n width: 6px;\n height: 6px;\n flex: 0 0 auto;\n border-radius: 99px;\n background: var(--vr-warning);\n box-shadow: none;\n}\n.vr-env-row b {\n min-width: 0;\n overflow: hidden;\n color: var(--vr-text);\n font-weight: 650;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.vr-panel-head {\n position: relative;\n max-width: 100%;\n margin: 0;\n padding: 0 0 26px 78px;\n}\n.vr-panel-head::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: -2px;\n width: 58px;\n height: 58px;\n border-radius: 12px;\n background: linear-gradient(135deg, #29d28f, #00a870);\n clip-path: polygon(54% 0, 100% 0, 62% 48%, 100% 48%, 36% 100%, 48% 58%, 12% 58%);\n}\n.vr-panel-head .vr-eyebrow { display: none; }\n.vr-panel-head h1 {\n margin: 0 0 8px;\n font-size: 34px;\n line-height: 1.15;\n font-weight: 780;\n}\n.vr-muted {\n color: var(--vr-muted);\n font-size: 14px;\n line-height: 1.35;\n}\n.vr-path {\n position: relative;\n display: grid;\n gap: 14px;\n max-width: 100%;\n margin: 0;\n padding: 0 0 0 72px;\n}\n.vr-path::before {\n content: \"\";\n position: absolute;\n left: 27px;\n top: -16px;\n bottom: 30px;\n width: 1px;\n background: repeating-linear-gradient(to bottom, #f5b16b 0 9px, transparent 9px 18px);\n}\n.vr-path-row {\n position: relative;\n z-index: 1;\n width: 100%;\n display: grid;\n grid-template-columns: 48px minmax(0, 1fr) auto;\n gap: 18px;\n align-items: center;\n min-height: 90px;\n border: 1px solid var(--vr-border);\n border-radius: 12px;\n background: #ffffff;\n padding: 22px 24px;\n text-align: left;\n box-shadow: 0 12px 28px rgba(16, 24, 40, 0.035);\n animation: vrUiRise 360ms cubic-bezier(0.16, 1, 0.3, 1) both;\n transition: transform 180ms cubic-bezier(0.16, 1, 0.3, 1), border-color 180ms ease, box-shadow 180ms ease, background 180ms ease;\n}\n.vr-path-row:nth-child(1) { animation-delay: 80ms; }\n.vr-path-row:nth-child(2) { animation-delay: 125ms; }\n.vr-path-row:nth-child(3) { animation-delay: 170ms; }\n.vr-path-row:nth-child(4) { animation-delay: 215ms; }\n.vr-path-row:nth-child(5) { animation-delay: 260ms; }\n.vr-path-row:hover {\n transform: translateY(-2px);\n box-shadow: 0 16px 34px rgba(16, 24, 40, 0.065);\n}\n.vr-path-row::before {\n content: attr(data-step);\n position: absolute;\n left: -72px;\n top: 22px;\n width: 40px;\n height: 40px;\n border: 1px solid var(--vr-border-strong);\n border-radius: 999px;\n background: #ffffff;\n display: grid;\n place-items: center;\n color: #344054;\n font-size: 15px;\n font-weight: 800;\n}\n.vr-path-row.is-focused {\n border-color: #ffb36b;\n background: #ffffff;\n box-shadow: 0 14px 30px rgba(255, 122, 0, 0.09);\n}\n.vr-path-row.is-focused::before {\n border-color: var(--vr-accent);\n background: #fff4e9;\n color: var(--vr-accent);\n}\n.vr-step { display: none; }\n.vr-path-icon {\n width: 44px;\n height: 44px;\n display: grid;\n place-items: center;\n border-radius: 10px;\n background: var(--vr-soft);\n color: #566273;\n position: relative;\n}\n.vr-path-row.is-focused .vr-path-icon {\n background: #fff0df;\n color: var(--vr-accent);\n}\n.vr-path-icon::before,\n.vr-path-icon::after {\n content: \"\";\n position: absolute;\n box-sizing: border-box;\n}\n.vr-path-icon[data-source=\"repo\"]::before {\n width: 15px;\n height: 19px;\n border: 2px solid currentColor;\n border-radius: 2px;\n background: transparent;\n}\n.vr-path-icon[data-source=\"repo\"]::after {\n width: 7px;\n height: 2px;\n top: 19px;\n left: 19px;\n border-radius: 999px;\n background: currentColor;\n box-shadow: 0 4px 0 currentColor;\n}\n.vr-path-icon[data-source=\"manual\"]::before {\n width: 20px;\n height: 20px;\n border: 2px solid currentColor;\n border-radius: 4px;\n transform: rotate(45deg);\n}\n.vr-path-icon[data-source=\"manual\"]::after {\n width: 8px;\n height: 8px;\n border-right: 2px solid currentColor;\n border-bottom: 2px solid currentColor;\n transform: rotate(45deg) translate(-1px, -1px);\n}\n.vr-path-icon[data-source=\"verify\"]::before {\n width: 22px;\n height: 22px;\n border: 2px solid currentColor;\n border-radius: 99px;\n}\n.vr-path-icon[data-source=\"verify\"]::after {\n width: 10px;\n height: 6px;\n border-left: 2px solid currentColor;\n border-bottom: 2px solid currentColor;\n transform: rotate(-45deg) translate(1px, -1px);\n}\n.vr-path-icon[data-source=\"live\"]::before {\n width: 21px;\n height: 14px;\n border: 2px solid currentColor;\n border-radius: 8px;\n}\n.vr-path-icon[data-source=\"live\"]::after {\n width: 5px;\n height: 5px;\n border-radius: 99px;\n background: currentColor;\n}\n.vr-dot {\n width: 8px;\n height: 8px;\n border-radius: 99px;\n background: var(--vr-faint);\n}\n.vr-dot[data-state=\"ready\"] { background: var(--vr-success); }\n.vr-dot[data-state=\"needs_fix\"],\n.vr-dot[data-state=\"requires_user_action\"] { background: var(--vr-warning); }\n.vr-dot[data-state=\"blocked\"] { background: var(--vr-danger); }\n.vr-path-row strong {\n display: inline-block;\n margin-bottom: 6px;\n color: var(--vr-text);\n font-size: 15px;\n line-height: 1.25;\n}\n.vr-state {\n align-self: center;\n border-radius: 99px;\n background: var(--vr-soft);\n color: #475467;\n padding: 7px 13px;\n font-size: 12px;\n font-weight: 650;\n white-space: nowrap;\n}\n.vr-next {\n margin: 36px 0 0 72px;\n padding: 0;\n border: 1px solid var(--vr-border);\n border-radius: 14px;\n background: #ffffff;\n box-shadow: 0 14px 36px rgba(16, 24, 40, 0.045);\n overflow: hidden;\n animation: vrUiRise 420ms cubic-bezier(0.16, 1, 0.3, 1) 290ms both;\n}\n.vr-next-head {\n display: grid;\n grid-template-columns: 1fr;\n gap: 18px;\n align-items: center;\n padding: 22px 26px 18px;\n border-bottom: 1px solid var(--vr-border);\n}\n.vr-next-head > div > span {\n display: inline-flex;\n margin-bottom: 8px;\n border-radius: 999px;\n background: #f7f8fa;\n color: var(--vr-accent);\n padding: 5px 9px;\n font-size: 11px;\n font-weight: 800;\n letter-spacing: 0;\n}\n.vr-next h2, .vr-side-head h2 {\n margin: 0 0 4px;\n font-size: 19px;\n line-height: 1.2;\n}\n.vr-next-action {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n gap: 16px;\n align-items: center;\n margin: 0;\n padding: 20px 26px;\n border: 0;\n border-bottom: 1px solid var(--vr-border);\n border-radius: 0;\n background: #ffffff;\n}\n.vr-next-badge {\n width: 38px;\n height: 38px;\n display: grid;\n place-items: center;\n border-radius: 999px;\n background: #f7f8fa;\n color: var(--vr-text);\n font-size: 11px;\n font-weight: 800;\n box-shadow: inset 0 0 0 1px var(--vr-border);\n animation: none;\n}\n.vr-next-action strong {\n color: var(--vr-text);\n font-size: 15px;\n line-height: 1.25;\n}\n.vr-next-action p {\n margin: 6px 0 0;\n color: var(--vr-muted);\n font-size: 13px;\n line-height: 1.45;\n}\n.vr-next-controls {\n display: flex;\n align-items: center;\n gap: 9px;\n white-space: nowrap;\n}\n.vr-next-controls .vr-button {\n min-height: 38px;\n padding: 9px 13px;\n border-radius: 9px;\n}\n.vr-click-path {\n display: grid;\n gap: 4px;\n margin-bottom: 14px;\n padding: 14px;\n border: 1px solid var(--vr-border);\n border-radius: 10px;\n background: var(--vr-soft);\n}\n.vr-click-path span {\n color: var(--vr-muted);\n font-size: 11px;\n font-weight: 700;\n text-transform: uppercase;\n}\n.vr-click-path strong {\n font-size: 13px;\n line-height: 1.3;\n}\n.vr-action-flow {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 0;\n padding: 16px 26px;\n margin: 0;\n border-bottom: 1px solid var(--vr-border);\n}\n.vr-action-flow span {\n min-width: 0;\n border: 0;\n border-radius: 0;\n background: transparent;\n padding: 8px 13px 8px 42px;\n color: var(--vr-muted);\n font-size: 12px;\n line-height: 1.35;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n position: relative;\n transition: transform 160ms ease, border-color 160ms ease, background 160ms ease;\n}\n.vr-action-flow span:hover {\n transform: none;\n border-color: transparent;\n background: transparent;\n}\n.vr-action-flow span + span {\n border-left: 1px solid var(--vr-border);\n}\n.vr-action-flow span::before {\n content: attr(data-step);\n position: absolute;\n left: 12px;\n top: 50%;\n width: 20px;\n height: 20px;\n display: grid;\n place-items: center;\n border-radius: 999px;\n background: #f7f8fa;\n color: var(--vr-muted);\n border: 1px solid var(--vr-border);\n font-size: 11px;\n font-weight: 850;\n transform: translateY(-50%);\n}\n.vr-action-flow b {\n display: block;\n margin-bottom: 4px;\n color: var(--vr-accent);\n font-size: 12px;\n}\n.vr-lanes {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n gap: 12px;\n margin-bottom: 14px;\n}\n.vr-lanes section {\n display: grid;\n align-content: start;\n gap: 8px;\n min-height: 150px;\n border: 1px solid var(--vr-border);\n border-radius: 10px;\n background: #ffffff;\n padding: 16px;\n}\n.vr-lanes h3 {\n margin: 0;\n color: var(--vr-accent);\n font-size: 12px;\n}\n.vr-lanes strong {\n font-size: 14px;\n line-height: 1.25;\n}\n.vr-lanes p {\n margin: 0;\n color: var(--vr-muted);\n font-size: 13px;\n line-height: 1.45;\n}\n.vr-proof {\n display: grid;\n gap: 10px;\n margin: 0;\n padding: 20px 26px;\n border: 0;\n border-bottom: 1px solid var(--vr-border);\n border-radius: 0;\n background: #ffffff;\n}\n.vr-proof h2 {\n margin: 0;\n font-size: 15px;\n}\n.vr-proof p {\n margin: 0;\n color: var(--vr-muted);\n font-size: 12px;\n}\n.vr-proof strong {\n color: var(--vr-text);\n font-size: 13px;\n line-height: 1.3;\n}\n.vr-proof-checks {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: 0 18px;\n border-top: 1px solid var(--vr-border);\n}\n.vr-proof-checks span {\n display: flex;\n justify-content: space-between;\n gap: 8px;\n border-top: 0;\n padding: 9px 0;\n border-bottom: 1px solid var(--vr-border);\n font-size: 12px;\n}\n.vr-proof-checks em {\n color: var(--vr-muted);\n font-style: normal;\n}\n.vr-details {\n border-top: 0;\n padding: 12px 26px;\n color: var(--vr-muted);\n font-size: 13px;\n}\n.vr-details + .vr-details { border-top: 1px solid var(--vr-border); }\n.vr-details summary {\n color: var(--vr-text);\n cursor: pointer;\n font-weight: 750;\n}\n.vr-details p {\n margin: 7px 0 0;\n line-height: 1.35;\n}\n\n.vr-right-rail {\n display: grid;\n align-content: start;\n gap: 24px;\n overflow: auto;\n padding: 30px 38px 28px 30px;\n background: var(--vr-page);\n}\n.vr-side-card {\n border: 1px solid var(--vr-border);\n border-radius: 14px;\n background: #ffffff;\n overflow: hidden;\n box-shadow: 0 12px 30px rgba(16, 24, 40, 0.04);\n}\n.vr-agent-card {\n min-height: 320px;\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n}\n.vr-side-head {\n display: flex;\n align-items: start;\n justify-content: space-between;\n gap: 16px;\n padding: 20px 24px 14px;\n}\n.vr-eyebrow {\n margin: 0 0 8px;\n color: var(--vr-muted);\n font-size: 14px;\n line-height: 1.4;\n}\n.vr-copy-button {\n min-height: 34px;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n border: 1px solid #d9dee7;\n border-radius: 9px;\n background: #ffffff;\n color: #111417;\n padding: 0 12px;\n font-size: 12px;\n font-weight: 700;\n box-shadow: 0 8px 18px rgba(16, 24, 40, 0.045);\n transition: transform 140ms cubic-bezier(0.23, 1, 0.32, 1), border-color 140ms ease, box-shadow 140ms ease;\n}\n.vr-copy-button:hover {\n border-color: #aeb6c3;\n box-shadow: 0 10px 22px rgba(16, 24, 40, 0.07);\n}\n.vr-copy-button:active {\n transform: scale(0.97);\n}\n.vr-copy-button span {\n width: 14px;\n height: 14px;\n border: 1.6px solid currentColor;\n border-radius: 4px;\n position: relative;\n opacity: 0.8;\n}\n.vr-copy-button span::before {\n content: \"\";\n position: absolute;\n left: 3px;\n top: -5px;\n width: 8px;\n height: 5px;\n border: 1.6px solid currentColor;\n border-bottom: 0;\n border-radius: 4px 4px 0 0;\n background: #ffffff;\n}\n.vr-prompt {\n margin: 0 24px 24px;\n padding: 22px;\n overflow: auto;\n border: 1px solid var(--vr-border);\n border-radius: 10px;\n background: linear-gradient(135deg, #f6fffb, #ffffff 74%);\n color: #111417;\n font: 13px/1.55 \"JetBrains Mono\", \"SFMono-Regular\", Consolas, monospace;\n min-height: 220px;\n white-space: pre-wrap;\n}\n.vr-prompt-shell {\n margin: 0 24px 24px;\n display: grid;\n}\n.vr-quick-actions {\n display: grid;\n gap: 10px;\n padding: 0 24px 18px;\n}\n.vr-quick-button {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 42px;\n border: 1px solid var(--vr-border);\n border-radius: 9px;\n background: #ffffff;\n color: var(--vr-text);\n padding: 10px 12px;\n font-size: 13px;\n font-weight: 750;\n text-align: left;\n}\n.vr-quick-button::after {\n content: \"\";\n width: 6px;\n height: 6px;\n border-right: 1px solid var(--vr-muted);\n border-bottom: 1px solid var(--vr-muted);\n transform: rotate(-45deg);\n}\n.vr-side-note {\n margin: 0;\n padding: 0 24px 20px;\n color: var(--vr-muted);\n font-size: 13px;\n}\n.vr-bottombar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 7px 20px;\n border-top: 1px solid var(--vr-border);\n background: #ffffff;\n color: var(--vr-muted);\n font-size: 13px;\n}\n.vr-command {\n color: var(--vr-text);\n font-family: \"JetBrains Mono\", \"SFMono-Regular\", Consolas, monospace;\n}\n\n.vr-guide-panel {\n position: fixed;\n inset: 0;\n z-index: 30;\n display: grid;\n place-items: end;\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n transition: opacity 180ms ease, visibility 180ms ease;\n}\n.vr-guide-panel.is-open {\n opacity: 1;\n visibility: visible;\n pointer-events: auto;\n}\n.vr-guide-backdrop {\n position: absolute;\n inset: 0;\n z-index: 0;\n padding: 0;\n border: 0;\n border-radius: 0;\n background: rgba(17, 20, 23, 0.24);\n backdrop-filter: blur(2px);\n cursor: default;\n}\n.vr-guide-sheet {\n position: relative;\n z-index: 1;\n width: min(620px, 100%);\n height: 100%;\n display: grid;\n grid-template-rows: auto minmax(0, 1fr);\n border-left: 1px solid var(--vr-border);\n background: #ffffff;\n box-shadow: -24px 0 60px rgba(16, 24, 40, 0.16);\n transform: translateX(28px);\n opacity: 1;\n transition: transform 220ms cubic-bezier(0.16, 1, 0.3, 1), opacity 180ms ease;\n}\n.vr-guide-panel.is-open .vr-guide-sheet {\n transform: translateX(0);\n opacity: 1;\n}\n.vr-guide-head {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n gap: 16px;\n align-items: start;\n padding: 24px 28px;\n border-bottom: 1px solid var(--vr-border);\n background: #ffffff;\n}\n.vr-guide-kicker {\n margin: 0 0 8px;\n color: var(--vr-muted);\n font-size: 12px;\n font-weight: 750;\n}\n.vr-guide-head h2 {\n margin: 0;\n color: var(--vr-text);\n font-size: 23px;\n line-height: 1.15;\n}\n.vr-guide-head p:not(.vr-guide-kicker) {\n margin: 8px 0 0;\n color: #475467;\n font-size: 14px;\n line-height: 1.45;\n}\n.vr-guide-close {\n width: 38px;\n height: 38px;\n border-radius: 999px;\n display: grid;\n place-items: center;\n padding: 0;\n}\n.vr-guide-close::before,\n.vr-guide-close::after {\n content: \"\";\n width: 15px;\n height: 1.8px;\n background: currentColor;\n grid-area: 1 / 1;\n border-radius: 999px;\n}\n.vr-guide-close::before { transform: rotate(45deg); }\n.vr-guide-close::after { transform: rotate(-45deg); }\n.vr-guide-body {\n overflow: auto;\n display: grid;\n align-content: start;\n gap: 14px;\n padding: 24px 28px 30px;\n}\n.vr-guide-note,\n.vr-guide-step {\n border: 1px solid var(--vr-border);\n border-radius: 12px;\n background: #ffffff;\n padding: 18px;\n box-shadow: 0 10px 22px rgba(16, 24, 40, 0.035);\n animation: vrGuideItemIn 260ms cubic-bezier(0.16, 1, 0.3, 1) both;\n}\n.vr-guide-note strong,\n.vr-guide-step strong {\n display: block;\n margin-bottom: 8px;\n font-size: 15px;\n}\n.vr-guide-note p,\n.vr-guide-step p {\n margin: 0;\n color: #475467;\n font-size: 14px;\n line-height: 1.5;\n}\n.vr-guide-steps {\n display: grid;\n gap: 10px;\n}\n.vr-guide-step {\n display: grid;\n grid-template-columns: 62px minmax(0, 1fr);\n gap: 14px;\n}\n.vr-guide-step > span {\n align-self: start;\n border-radius: 999px;\n background: var(--vr-accent-soft);\n color: var(--vr-accent);\n padding: 7px 10px;\n text-align: center;\n font-size: 12px;\n font-weight: 800;\n}\n.vr-guide-pre {\n margin: 0;\n border: 1px solid var(--vr-border);\n border-radius: 12px;\n background: #ffffff;\n padding: 18px;\n color: var(--vr-text);\n font: 12px/1.55 \"JetBrains Mono\", \"SFMono-Regular\", Consolas, monospace;\n white-space: pre-wrap;\n}\n.vr-guide-run {\n justify-self: start;\n}\n\n.vr-startup {\n position: fixed;\n inset: 0;\n z-index: 20;\n display: grid;\n place-items: center;\n padding: 28px;\n background:\n radial-gradient(circle at 50% 27%, rgba(255, 122, 0, 0.11), transparent 34%),\n radial-gradient(circle at 50% 66%, rgba(1, 10, 17, 0.08), transparent 36%),\n linear-gradient(180deg, rgba(251, 251, 250, 0.94), rgba(246, 247, 248, 0.98));\n transition: opacity 260ms ease, visibility 260ms ease;\n}\n.vr-startup::before {\n content: \"\";\n position: absolute;\n inset: 0;\n background:\n linear-gradient(100deg, transparent 0%, rgba(255, 255, 255, 0.72) 48%, transparent 54%),\n repeating-linear-gradient(180deg, rgba(1, 10, 17, 0.018) 0 1px, transparent 1px 7px);\n opacity: 0.55;\n transform: translateX(-35%);\n animation: vrStartupSweep 3200ms ease-in-out infinite;\n pointer-events: none;\n}\n.vr-startup.is-dismissed {\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n}\n.vr-startup-card {\n position: relative;\n width: min(760px, 100%);\n display: grid;\n justify-items: center;\n gap: 18px;\n padding: 52px 64px 48px;\n border: 1px solid rgba(218, 224, 233, 0.95);\n border-radius: 22px;\n background:\n linear-gradient(180deg, rgba(255, 255, 255, 0.97), rgba(255, 255, 255, 0.9)),\n radial-gradient(circle at 50% 0%, rgba(255, 122, 0, 0.1), transparent 42%);\n box-shadow: 0 42px 118px rgba(17, 20, 23, 0.16);\n animation: vrStartupIn 520ms cubic-bezier(0.16, 1, 0.3, 1) both;\n overflow: hidden;\n}\n.vr-boot-line {\n position: absolute;\n top: 0;\n left: 34px;\n right: 34px;\n height: 2px;\n background: rgba(230, 233, 237, 0.72);\n overflow: hidden;\n}\n.vr-boot-line span {\n display: block;\n width: 38%;\n height: 100%;\n background: linear-gradient(90deg, transparent, #ff7a00, transparent);\n animation: vrBootLine 1800ms ease-in-out infinite;\n}\n.vr-startup-mark {\n position: relative;\n width: 86px;\n height: 86px;\n display: grid;\n place-items: center;\n border: 1px solid var(--vr-border);\n border-radius: 24px;\n background: #ffffff;\n box-shadow: 0 16px 38px rgba(17, 20, 23, 0.08);\n cursor: pointer;\n transition: transform 160ms ease, box-shadow 160ms ease, border-color 160ms ease;\n animation: vrStartupPulse 2400ms ease-in-out infinite;\n}\n.vr-startup-mark.is-empty {\n background:\n linear-gradient(180deg, #ffffff, #f8f9fb);\n}\n.vr-startup-mark:hover,\n.vr-startup-mark:focus-within {\n border-color: rgba(255, 122, 0, 0.58);\n box-shadow: 0 18px 42px rgba(255, 122, 0, 0.16);\n transform: translateY(-1px);\n}\n.vr-startup-mark img {\n width: 86px;\n height: 86px;\n object-fit: contain;\n border-radius: 23px;\n}\n.vr-startup-mark img[hidden] {\n display: none;\n}\n.vr-startup-add-icon {\n position: absolute;\n inset: 0;\n display: none;\n align-items: flex-start;\n justify-content: center;\n padding-top: 47px;\n color: #667085;\n font-size: 12px;\n font-weight: 780;\n line-height: 1;\n letter-spacing: 0;\n}\n.vr-startup-mark.is-empty .vr-startup-add-icon {\n display: flex;\n}\n.vr-startup-mark.is-empty .vr-startup-add-icon::before,\n.vr-startup-mark.is-empty .vr-startup-add-icon::after {\n content: \"\";\n position: absolute;\n top: 27px;\n left: 50%;\n width: 18px;\n height: 2px;\n border-radius: 999px;\n background: #98a2b3;\n transform: translateX(-50%);\n}\n.vr-startup-mark.is-empty .vr-startup-add-icon::after {\n transform: translateX(-50%) rotate(90deg);\n}\n.vr-startup-mark input {\n position: absolute;\n width: 1px;\n height: 1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n}\n.vr-edit-chip {\n position: absolute;\n bottom: -12px;\n left: 50%;\n z-index: 1;\n transform: translateX(-50%) translateY(4px);\n white-space: nowrap;\n padding: 5px 8px;\n border: 1px solid var(--vr-border);\n border-radius: 999px;\n background: rgba(255, 255, 255, 0.96);\n color: var(--vr-text);\n font-size: 9px;\n font-weight: 760;\n opacity: 0;\n box-shadow: 0 10px 24px rgba(17, 20, 23, 0.12);\n transition: opacity 160ms ease, transform 160ms ease;\n}\n.vr-startup-mark:hover .vr-edit-chip,\n.vr-startup-mark:focus-within .vr-edit-chip {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n}\n.vr-startup-kicker {\n margin: 2px 0 0;\n color: var(--vr-muted);\n font-size: 11px;\n font-weight: 700;\n}\n.vr-startup-title-input {\n width: min(100%, 560px);\n min-height: 58px;\n border: 1px solid transparent;\n border-radius: 13px;\n background: transparent;\n padding: 0 14px;\n max-width: 100%;\n color: var(--vr-text);\n font-size: 46px;\n line-height: 1.05;\n font-weight: 820;\n text-align: center;\n letter-spacing: 0;\n outline: none;\n}\n.vr-startup-title-input:hover {\n background: rgba(247, 249, 251, 0.68);\n}\n.vr-startup-title-input:focus {\n border-color: rgba(255, 122, 0, 0.38);\n background: rgba(255, 250, 244, 0.82);\n box-shadow: 0 0 0 4px rgba(255, 122, 0, 0.12);\n}\n.vr-startup-meta {\n width: min(100%, 330px);\n min-height: 48px;\n display: grid;\n grid-template-columns: auto minmax(72px, 1fr);\n align-items: center;\n justify-content: center;\n gap: 10px;\n padding: 0 20px;\n border: 0;\n border-radius: 999px;\n background: #f2f3f5;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.82);\n cursor: text;\n}\n.vr-startup-meta span {\n color: #7a8392;\n font-size: 12px;\n font-weight: 650;\n line-height: 1;\n text-transform: none;\n}\n.vr-startup-meta input {\n width: 100%;\n min-width: 0;\n border: 0;\n background: transparent;\n color: var(--vr-text);\n font-size: 16px;\n font-weight: 760;\n text-align: left;\n outline: none;\n}\n.vr-startup-meta:focus-within {\n background: #eef0f3;\n box-shadow: 0 0 0 3px rgba(17, 20, 23, 0.055), inset 0 1px 0 rgba(255, 255, 255, 0.88);\n}\n.vr-startup-next {\n position: relative;\n width: min(100%, 330px);\n min-height: 48px;\n margin-top: -4px;\n overflow: hidden;\n border: 0;\n border-radius: 999px;\n background: #050505;\n color: #ffffff;\n font-size: 16px;\n font-weight: 720;\n letter-spacing: 0;\n box-shadow: 0 16px 34px rgba(5, 5, 5, 0.16);\n transition: transform 150ms ease, box-shadow 150ms ease, background 150ms ease;\n}\n.vr-startup-next::before {\n content: none;\n}\n.vr-startup-next:hover {\n transform: translateY(-1px);\n background: #101010;\n box-shadow: 0 18px 40px rgba(5, 5, 5, 0.2);\n}\n.vr-startup-next:active {\n transform: translateY(0);\n box-shadow: 0 10px 24px rgba(5, 5, 5, 0.14);\n}\n\n/* Workspace console refresh */\n.vr-shell {\n grid-template-rows: 78px minmax(0, 1fr);\n background: #fbfcfd;\n}\n.vr-bottombar { display: none; }\n.vr-topbar {\n grid-template-columns: minmax(360px, 1fr) minmax(172px, 210px) minmax(274px, auto);\n min-height: 78px;\n padding: 0 28px;\n background: rgba(255, 255, 255, 0.94);\n backdrop-filter: blur(18px);\n}\n.vr-brand-lockup { gap: 16px; }\n.vr-raven-mark {\n width: 42px;\n height: 42px;\n}\n.vr-raven-mark img {\n width: 48px;\n height: 48px;\n}\n.vr-brand-lockup strong {\n font-size: 28px;\n font-weight: 820;\n letter-spacing: -0.01em;\n}\n.vr-tagline {\n border-color: #edf0f4;\n border-radius: 999px;\n background: #f7f8fa;\n padding: 9px 18px;\n color: #475467;\n font-size: 13px;\n}\n.vr-top-actions {\n gap: 12px;\n min-width: 0;\n justify-self: end;\n}\n.vr-project-picker {\n width: 176px;\n min-height: 44px;\n border-radius: 10px;\n padding: 0 14px;\n background: #ffffff;\n box-shadow: 0 8px 22px rgba(16, 24, 40, 0.035);\n}\n.vr-project-picker::before {\n width: 18px;\n height: 18px;\n border: 0;\n border-radius: 6px;\n clip-path: none;\n opacity: 0.92;\n background:\n linear-gradient(#667085 0 0) 5px 5px / 3px 3px no-repeat,\n linear-gradient(#667085 0 0) 10px 5px / 3px 3px no-repeat,\n linear-gradient(#667085 0 0) 5px 10px / 3px 3px no-repeat,\n linear-gradient(#667085 0 0) 10px 10px / 3px 3px no-repeat,\n #f8fafc;\n box-shadow: inset 0 0 0 1.5px #667085;\n}\n.vr-project-picker span {\n font-size: 13px;\n font-weight: 760;\n}\n.vr-button-soft {\n min-width: 86px;\n min-height: 44px;\n border-color: rgba(24, 168, 101, 0.34);\n border-radius: 10px;\n background: #ffffff;\n color: #0f9d58;\n}\n.vr-button-soft::before {\n content: \"+\";\n margin-right: 7px;\n font-weight: 850;\n}\n.vr-icon-button {\n position: relative;\n width: 44px;\n height: 44px;\n}\n.vr-icon-button::after {\n content: \"\";\n position: absolute;\n right: 7px;\n top: 7px;\n width: 7px;\n height: 7px;\n border: 2px solid #ffffff;\n border-radius: 99px;\n background: #18a865;\n}\n.vr-bell-icon {\n position: relative;\n width: 19px;\n height: 18px;\n display: block;\n}\n.vr-bell-icon::before {\n content: \"\";\n position: absolute;\n left: 4px;\n top: 2px;\n width: 11px;\n height: 12px;\n border: 1.8px solid #344054;\n border-bottom: 0;\n border-radius: 9px 9px 4px 4px;\n}\n.vr-bell-icon::after {\n content: \"\";\n position: absolute;\n left: 2px;\n bottom: 2px;\n width: 15px;\n height: 6px;\n border-bottom: 1.8px solid #344054;\n border-radius: 0 0 9px 9px;\n box-shadow: 6px 4px 0 -4px #344054;\n}\n.vr-top-actions .vr-button-primary {\n min-width: 116px;\n border-radius: 10px;\n background: #071018;\n}\n.vr-main {\n grid-template-columns: 306px minmax(680px, 1fr) 430px;\n background: #fbfcfd;\n}\n.vr-rail {\n padding: 28px 26px;\n background: #fbfcfd;\n}\n.vr-rail-head h2 {\n margin-bottom: 18px;\n font-size: 17px;\n}\n.vr-provider-search {\n height: 42px;\n border-radius: 10px;\n padding-left: 38px;\n background:\n radial-gradient(circle at 17px 50%, transparent 0 6px, #667085 6.5px 7.7px, transparent 8px),\n linear-gradient(45deg, transparent 48%, #667085 49% 57%, transparent 58%) 24px 25px / 9px 9px no-repeat,\n #ffffff;\n}\n.vr-provider {\n min-height: 62px;\n border-radius: 11px;\n padding: 10px 31px 10px 13px;\n box-shadow: 0 8px 18px rgba(16, 24, 40, 0.028);\n}\n.vr-provider.is-selected {\n border-color: rgba(24, 168, 101, 0.72);\n background: linear-gradient(90deg, rgba(24, 168, 101, 0.055), #ffffff 72%);\n box-shadow: 0 12px 26px rgba(24, 168, 101, 0.08);\n}\n.vr-provider-state {\n color: #f07800;\n font-size: 11px;\n}\n.vr-run-card {\n margin-top: 24px;\n border-radius: 13px;\n padding: 18px;\n}\n.vr-terminal-button {\n position: relative;\n min-height: 40px;\n border-radius: 8px;\n padding-right: 38px;\n}\n.vr-terminal-button::after {\n content: \"\";\n position: absolute;\n right: 13px;\n top: 50%;\n width: 12px;\n height: 14px;\n border: 1.5px solid rgba(255, 255, 255, 0.78);\n border-radius: 3px;\n transform: translateY(-50%);\n box-shadow: -4px -4px 0 -2px rgba(255, 255, 255, 0.42);\n}\n.vr-center-panel {\n padding: 28px 32px 34px;\n background:\n radial-gradient(circle at 50% 26%, rgba(24, 168, 101, 0.035), transparent 32%),\n #fbfcfd;\n}\n.vr-mission {\n grid-template-columns: 0.8fr 1.25fr 1.25fr 0.9fr;\n gap: 0;\n margin-bottom: 36px;\n padding: 0;\n border-radius: 14px;\n background: rgba(255, 255, 255, 0.92);\n}\n.vr-mission > div {\n min-height: 112px;\n padding: 26px 30px;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n}\n.vr-mission > div + div {\n border-left: 1px solid var(--vr-border);\n}\n.vr-mission span {\n color: #667085;\n font-size: 12px;\n}\n.vr-mission strong {\n font-size: 14px;\n font-weight: 760;\n}\n.vr-mission-answer strong {\n font-size: 22px;\n}\n.vr-mission-evidence {\n grid-template-columns: 1fr;\n}\n.vr-mission-evidence strong {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n min-height: 0;\n}\n.vr-mission-evidence i {\n width: 8px;\n height: 8px;\n border-radius: 99px;\n}\n.vr-mission-evidence .is-found { background: #18a865; }\n.vr-mission-evidence .is-missing { background: #f59f00; }\n.vr-panel-head {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: start;\n gap: 24px;\n padding: 0 0 30px 78px;\n}\n.vr-panel-head::before {\n background: linear-gradient(135deg, #28d68a, #12a66a);\n}\n.vr-panel-head h1 {\n font-size: 34px;\n font-weight: 820;\n letter-spacing: -0.01em;\n}\n.vr-panel-actions {\n display: flex;\n gap: 12px;\n padding-top: 8px;\n}\n.vr-panel-actions .vr-button {\n min-height: 44px;\n border-radius: 11px;\n padding: 0 18px;\n}\n.vr-button-preview {\n padding-left: 40px !important;\n position: relative;\n}\n.vr-button-preview::before {\n content: \"\";\n position: absolute;\n left: 17px;\n top: 50%;\n width: 15px;\n height: 10px;\n border: 1.8px solid #344054;\n border-radius: 999px / 70%;\n transform: translateY(-50%);\n}\n.vr-button-preview::after {\n content: \"\";\n position: absolute;\n left: 23px;\n top: 50%;\n width: 4px;\n height: 4px;\n border-radius: 99px;\n background: #344054;\n transform: translateY(-50%);\n}\n.vr-path {\n gap: 12px;\n padding-left: 78px;\n}\n.vr-path::before {\n left: 30px;\n background: linear-gradient(#d5f3e7, #d5f3e7);\n}\n.vr-path-row {\n min-height: 78px;\n grid-template-columns: 44px minmax(0, 1fr) 128px 22px;\n border-radius: 13px;\n padding: 17px 24px 17px 18px;\n box-shadow: 0 10px 24px rgba(16, 24, 40, 0.035);\n}\n.vr-path-row::after {\n content: \"\";\n width: 8px;\n height: 8px;\n justify-self: end;\n border-right: 1.8px solid #344054;\n border-bottom: 1.8px solid #344054;\n transform: rotate(-45deg);\n}\n.vr-path-row::before {\n left: -78px;\n top: 19px;\n width: 42px;\n height: 42px;\n}\n.vr-path-row.is-focused {\n border-color: rgba(24, 168, 101, 0.48);\n box-shadow: 0 14px 32px rgba(24, 168, 101, 0.075);\n}\n.vr-path-row.is-focused::before {\n border-color: #18a865;\n background: #f1fff8;\n color: #0f9d58;\n}\n.vr-path-icon {\n width: 42px;\n height: 42px;\n border-radius: 10px;\n background: #edf9f3;\n color: #18a865;\n}\n.vr-path-row.is-focused .vr-path-icon {\n background: #eafbf3;\n color: #18a865;\n}\n.vr-state {\n justify-self: end;\n background: transparent;\n color: #667085;\n padding: 0;\n}\n.vr-state[data-state=\"ready\"] {\n color: #0f9d58;\n}\n.vr-state[data-state=\"ready\"]::before,\n.vr-state[data-state=\"needs_fix\"]::before,\n.vr-state[data-state=\"not_checked\"]::before {\n content: \"\";\n display: inline-block;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n vertical-align: -2px;\n border-radius: 99px;\n border: 1.7px solid currentColor;\n}\n.vr-state[data-state=\"ready\"]::before {\n background:\n linear-gradient(135deg, transparent 45%, #0f9d58 46% 58%, transparent 59%) 3px 6px / 7px 5px no-repeat;\n}\n.vr-next {\n margin: 32px 0 0 78px;\n border-radius: 15px;\n background: rgba(255, 255, 255, 0.94);\n}\n.vr-next-head {\n padding: 24px 28px;\n}\n.vr-next-head > div {\n display: flex;\n align-items: center;\n gap: 14px;\n}\n.vr-next-head > div > span {\n margin: 0;\n background: #fff5ea;\n color: #bc5700;\n font-size: 17px;\n}\n.vr-next-glyph {\n width: 28px;\n height: 28px;\n margin-right: 10px;\n display: inline-grid;\n place-items: center;\n vertical-align: -8px;\n border-radius: 9px;\n position: relative;\n background: #ffead5;\n box-shadow: inset 0 0 0 1px rgba(255, 122, 0, 0.2);\n}\n.vr-next-glyph::before {\n content: \"\";\n position: absolute;\n left: 8px;\n top: 13px;\n width: 13px;\n height: 2px;\n border-radius: 999px;\n background: #ff7a00;\n}\n.vr-next-glyph::after {\n content: \"\";\n position: absolute;\n right: 7px;\n top: 8px;\n width: 9px;\n height: 9px;\n border-top: 2px solid #ff7a00;\n border-right: 2px solid #ff7a00;\n transform: rotate(45deg);\n}\n.vr-next-head > div > span::before {\n content: none;\n}\n.vr-next-action {\n grid-template-columns: auto minmax(0, 1fr) auto;\n padding: 24px 28px;\n}\n.vr-next-badge {\n width: auto;\n height: 36px;\n padding: 0 16px;\n background: #fff5ea;\n color: #bc5700;\n box-shadow: inset 0 0 0 1px rgba(255, 122, 0, 0.18);\n}\n.vr-button-take {\n min-width: 126px;\n min-height: 46px;\n border-color: rgba(255, 122, 0, 0.38);\n color: #bc5700;\n background: #fffaf4;\n}\n.vr-action-flow {\n margin: 0 28px 28px;\n border: 0;\n border-radius: 12px;\n background: #f7f9fb;\n padding: 18px 22px;\n}\n.vr-action-flow span::before {\n content: none;\n}\n.vr-action-flow span {\n padding: 0 18px;\n}\n.vr-action-flow b {\n color: #667085;\n}\n.vr-proof,\n.vr-details {\n display: none;\n}\n.vr-right-rail {\n gap: 18px;\n padding: 26px 34px 28px 28px;\n background: #fbfcfd;\n}\n.vr-side-card {\n border-radius: 14px;\n box-shadow: 0 14px 32px rgba(16, 24, 40, 0.045);\n}\n.vr-agent-card {\n min-height: 430px;\n}\n.vr-side-head {\n padding: 22px 22px 14px;\n}\n.vr-eyebrow {\n font-size: 13px;\n}\n.vr-prompt {\n min-height: 270px;\n margin: 0;\n border: 1px solid #d9dee7;\n border-radius: 18px;\n background:\n linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(248, 250, 252, 0.96)),\n #ffffff;\n padding: 18px 20px;\n color: #121820;\n font-size: 12px;\n line-height: 1.58;\n box-shadow:\n inset 0 1px 0 rgba(255, 255, 255, 0.9),\n 0 16px 34px rgba(16, 24, 40, 0.055);\n}\n.vr-prompt-shell {\n margin: 0 22px 18px;\n padding: 0;\n}\n.vr-prompt-shell::after {\n content: \"\";\n width: 18px;\n height: 18px;\n margin-left: 26px;\n margin-top: -23px;\n border-left: 1px solid #d9dee7;\n border-bottom: 1px solid #d9dee7;\n border-bottom-left-radius: 5px;\n background: #f8fafc;\n transform: rotate(-45deg);\n pointer-events: none;\n}\n.vr-copy-status {\n margin: 0 22px 22px;\n border: 1px solid rgba(24, 168, 101, 0.16);\n border-radius: 10px;\n background: #eefbf4;\n color: #0f9d58;\n padding: 14px 16px;\n font-size: 13px;\n font-weight: 760;\n}\n.vr-quick-actions {\n padding: 0 20px 20px;\n}\n.vr-quick-button {\n min-height: 64px;\n border-radius: 12px;\n padding: 14px 16px;\n}\n.vr-quick-button span {\n display: grid;\n gap: 5px;\n}\n.vr-quick-button b {\n color: var(--vr-text);\n font-size: 13px;\n}\n.vr-quick-button em {\n color: var(--vr-muted);\n font-size: 12px;\n font-style: normal;\n font-weight: 500;\n}\n.vr-help-card {\n padding-bottom: 20px;\n}\n.vr-help-link {\n margin: 0 22px;\n border: 0;\n background: transparent;\n color: #0f9d58;\n padding: 0;\n font-size: 13px;\n font-weight: 780;\n text-align: left;\n}\n.vr-guide-links {\n display: grid;\n gap: 10px;\n}\n.vr-guide-links a {\n display: flex;\n align-items: center;\n justify-content: space-between;\n min-height: 48px;\n border: 1px solid var(--vr-border);\n border-radius: 10px;\n background: #ffffff;\n color: #0f1720;\n padding: 0 14px;\n text-decoration: none;\n font-weight: 700;\n}\n.vr-guide-links a::after {\n content: \"\";\n width: 7px;\n height: 7px;\n border-right: 1.6px solid #667085;\n border-bottom: 1.6px solid #667085;\n transform: rotate(-45deg);\n}\n\n@keyframes vrStartupIn {\n from { opacity: 0; transform: translateY(12px) scale(0.985); }\n to { opacity: 1; transform: translateY(0) scale(1); }\n}\n\n@keyframes vrStartupSweep {\n 0%, 18% { transform: translateX(-45%); opacity: 0; }\n 38%, 62% { opacity: 0.55; }\n 82%, 100% { transform: translateX(45%); opacity: 0; }\n}\n\n@keyframes vrBootLine {\n 0% { transform: translateX(-110%); }\n 55%, 100% { transform: translateX(265%); }\n}\n\n@keyframes vrStartupPulse {\n 0%, 100% { box-shadow: 0 16px 38px rgba(17, 20, 23, 0.08); }\n 50% { box-shadow: 0 18px 48px rgba(255, 122, 0, 0.15); }\n}\n\n@keyframes vrGuideItemIn {\n from { opacity: 0; transform: translateY(10px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes vrUiRise {\n from { opacity: 0; transform: translateY(12px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n@keyframes vrMissionSweep {\n 0%, 58% { opacity: 0; transform: translateX(0) skewX(-18deg); }\n 68% { opacity: 0.72; }\n 84%, 100% { opacity: 0; transform: translateX(520%) skewX(-18deg); }\n}\n\n@keyframes vrBadgeBreathe {\n 0%, 100% { transform: scale(1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 0 0 0 rgba(7, 16, 24, 0); }\n 50% { transform: scale(1.025); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 0 0 5px rgba(7, 16, 24, 0.045); }\n}\n\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 1ms !important;\n animation-iteration-count: 1 !important;\n scroll-behavior: auto !important;\n transition-duration: 1ms !important;\n }\n}\n\n@media (max-width: 1240px) {\n .vr-topbar { grid-template-columns: minmax(220px, 1fr) auto; }\n .vr-project-picker { display: none; }\n .vr-main { grid-template-columns: 260px minmax(0, 1fr); }\n .vr-right-rail {\n grid-column: 1 / -1;\n border-left: 0;\n border-top: 1px solid var(--vr-border);\n }\n}\n\n@media (max-width: 820px) {\n body { overflow: auto; }\n .vr-shell { grid-template-rows: auto 1fr auto; }\n .vr-topbar {\n grid-template-columns: 1fr;\n gap: 10px;\n padding: 12px;\n }\n .vr-brand-lockup { flex-wrap: wrap; }\n .vr-main {\n grid-template-columns: 1fr;\n overflow: visible;\n }\n .vr-rail { border-right: 0; border-bottom: 1px solid var(--vr-border); max-height: 330px; }\n .vr-center-panel { overflow: visible; padding: 20px 14px 28px; border-right: 0; }\n .vr-right-rail {\n grid-column: 1 / -1;\n grid-template-columns: 1fr;\n padding: 20px 14px 28px;\n }\n .vr-mission {\n grid-template-columns: 1fr 1fr;\n }\n .vr-path-row { grid-template-columns: 1fr; }\n .vr-path { padding-left: 54px; }\n .vr-path-row::before { left: -54px; }\n .vr-next { margin-left: 54px; }\n .vr-lanes {\n grid-template-columns: 1fr;\n }\n .vr-action-flow {\n grid-template-columns: 1fr;\n }\n}\n\n@media (max-width: 640px) {\n .vr-mission,\n .vr-env-row,\n .vr-proof-checks {\n grid-template-columns: 1fr;\n }\n .vr-startup-card {\n padding: 28px 22px;\n }\n .vr-startup-title-input {\n font-size: 34px;\n }\n .vr-state {\n justify-self: start;\n }\n .vr-next {\n margin-left: 0;\n }\n .vr-next-head {\n grid-template-columns: 1fr;\n padding: 20px;\n }\n .vr-next-action {\n grid-template-columns: 1fr;\n padding: 20px;\n }\n .vr-next-badge {\n width: auto;\n height: 30px;\n justify-self: start;\n padding: 0 12px;\n }\n .vr-next-controls {\n display: grid;\n grid-template-columns: 1fr;\n width: 100%;\n }\n .vr-next-controls .vr-button {\n width: 100%;\n }\n .vr-action-flow {\n padding: 16px 20px 20px;\n }\n .vr-bottombar {\n flex-wrap: wrap;\n padding: 6px 10px;\n }\n}\n`;\n", "import type { LocalUiState } from '../types';\nimport { localUiClientJs } from './appClient';\nimport { localUiCss } from './appCss';\n\nfunction escapeJsonForHtml(value: unknown): string {\n return JSON.stringify(value).replace(/</g, '\\\\u003c');\n}\n\nfunction escapeHtml(value: unknown): string {\n return String(value)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\nfunction formatProjectDisplayName(value: string): string {\n const scopedName = value.trim().replace(/^@[^/]+\\//, '');\n const readable = scopedName.replace(/[-_]+/g, ' ').replace(/\\s+/g, ' ').trim();\n if (!readable) return value;\n return readable.charAt(0).toUpperCase() + readable.slice(1);\n}\n\nexport function renderLocalUiHtml(state: LocalUiState): string {\n const projectVersion = state.project.version ?? '';\n const projectDisplayName = formatProjectDisplayName(state.project.name);\n return `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>VibeRaven Local Launch Console</title>\n <style>${localUiCss}</style>\n </head>\n <body>\n <div class=\"vr-shell\">\n <header class=\"vr-topbar\">\n <div class=\"vr-brand-lockup\" aria-label=\"VibeRaven\">\n <span class=\"vr-raven-mark\" aria-hidden=\"true\"><img id=\"vr-topbar-project-image\" src=\"/report/assets/viberaven-logo.png\" alt=\"\" /></span>\n <strong>VibeRaven</strong>\n <span class=\"vr-tagline\">From AI demo to production</span>\n </div>\n <button id=\"vr-workspace-menu\" class=\"vr-project-picker\" type=\"button\" aria-label=\"Workspace\">\n <span id=\"vr-topbar-project-name\">${escapeHtml(projectDisplayName)}</span>\n </button>\n <div class=\"vr-top-actions\">\n <button id=\"vr-new-project\" class=\"vr-button vr-button-soft\" type=\"button\">New</button>\n <button id=\"vr-notifications\" class=\"vr-icon-button\" type=\"button\" aria-label=\"Notifications\"><span class=\"vr-bell-icon\" aria-hidden=\"true\"></span></button>\n <button id=\"vr-run-verify\" class=\"vr-button vr-button-primary\">Verify now</button>\n </div>\n </header>\n <main class=\"vr-main\">\n <aside class=\"vr-rail\">\n <div class=\"vr-rail-head\">\n <h2>Providers</h2>\n <input class=\"vr-provider-search\" type=\"search\" placeholder=\"Search providers...\" aria-label=\"Search providers\" />\n </div>\n <div id=\"vr-provider-list\" class=\"vr-provider-list\"></div>\n <div class=\"vr-run-card\">\n <strong>Run VibeRaven</strong>\n <span>Check your project from the terminal.</span>\n <button id=\"vr-run-scan\" class=\"vr-terminal-button\" type=\"button\">$ npx -y viberaven</button>\n </div>\n </aside>\n <section id=\"vr-center\" class=\"vr-center-panel\"></section>\n <aside class=\"vr-right-rail\">\n <section class=\"vr-side-card vr-agent-card\">\n <div class=\"vr-side-head\">\n <div>\n <p class=\"vr-eyebrow\">Run this with your coding agent.</p>\n <h2>Agent prompt</h2>\n </div>\n <button id=\"vr-copy-prompt\" class=\"vr-copy-button\" type=\"button\"><span aria-hidden=\"true\"></span>Copy</button>\n </div>\n <div class=\"vr-prompt-shell\">\n <pre id=\"vr-prompt\" class=\"vr-prompt\"></pre>\n </div>\n <p id=\"vr-copy-status\" class=\"vr-copy-status\" hidden>Copied to clipboard</p>\n </section>\n <section class=\"vr-side-card\">\n <div class=\"vr-side-head\">\n <div>\n <p class=\"vr-eyebrow\">Manual controls</p>\n <h2>Quick actions</h2>\n </div>\n </div>\n <div class=\"vr-quick-actions\">\n <button id=\"vr-open-tasklist\" class=\"vr-quick-button\" type=\"button\"><span><b>Open task list</b><em>See all pending tasks</em></span></button>\n <button class=\"vr-quick-button\" type=\"button\" data-verify-intent=\"verify_gate\"><span><b>Run verify</b><em>Validate your setup</em></span></button>\n <button id=\"vr-view-docs\" class=\"vr-quick-button\" type=\"button\"><span><b>View docs</b><em>Launch guide and best practices</em></span></button>\n </div>\n </section>\n <section class=\"vr-side-card vr-help-card\">\n <div class=\"vr-side-head\">\n <div>\n <h2>Need help?</h2>\n <p class=\"vr-eyebrow\">Read the launch guide or open support context.</p>\n </div>\n </div>\n <button id=\"vr-open-help\" class=\"vr-help-link\" type=\"button\">Open help center</button>\n </section>\n </aside>\n </main>\n <footer class=\"vr-bottombar\">\n <span class=\"vr-command\">npx -y viberaven</span>\n <span>${state.gate.label}</span>\n <span>${state.project.scannedAt ?? 'No scan yet'}</span>\n </footer>\n </div>\n <section id=\"vr-startup\" class=\"vr-startup\" aria-label=\"VibeRaven startup\">\n <div class=\"vr-startup-card\">\n <div class=\"vr-boot-line\" aria-hidden=\"true\"><span></span></div>\n <label id=\"vr-startup-mark\" class=\"vr-startup-mark\" aria-label=\"Change project image\" title=\"Change project image\">\n <img id=\"vr-startup-preview-image\" src=\"/report/assets/viberaven-logo.png\" alt=\"\" />\n <span id=\"vr-startup-add-icon\" class=\"vr-startup-add-icon\" aria-hidden=\"true\">Add icon</span>\n <span class=\"vr-edit-chip\">Change image</span>\n <input id=\"vr-startup-project-image\" type=\"file\" accept=\"image/*\" />\n </label>\n <p class=\"vr-startup-kicker\">Project Mission Control</p>\n <input id=\"vr-startup-project-name\" class=\"vr-startup-title-input\" aria-label=\"Edit project name\" type=\"text\" value=\"${escapeHtml(projectDisplayName)}\" autocomplete=\"off\" />\n <label id=\"vr-startup-version-pill\" class=\"vr-startup-meta\">\n <span>Current version</span>\n <input id=\"vr-startup-project-version\" aria-label=\"Edit current version\" type=\"text\" value=\"${escapeHtml(projectVersion)}\" placeholder=\"1.0.0\" inputmode=\"decimal\" autocomplete=\"off\" />\n </label>\n <button id=\"vr-startup-next\" class=\"vr-startup-next\" type=\"button\">Enter</button>\n </div>\n </section>\n <section id=\"vr-guide-panel\" class=\"vr-guide-panel\" aria-hidden=\"true\">\n <button id=\"vr-guide-backdrop\" class=\"vr-guide-backdrop\" type=\"button\" aria-label=\"Close guidance\"></button>\n <article class=\"vr-guide-sheet\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"vr-guide-title\">\n <header class=\"vr-guide-head\">\n <div>\n <p id=\"vr-guide-kicker\" class=\"vr-guide-kicker\">Guidance</p>\n <h2 id=\"vr-guide-title\">Guidance</h2>\n <p id=\"vr-guide-summary\">Short next steps for this launch action.</p>\n </div>\n <button id=\"vr-guide-close\" class=\"vr-guide-close\" type=\"button\" aria-label=\"Close guidance\"></button>\n </header>\n <div id=\"vr-guide-body\" class=\"vr-guide-body\"></div>\n </article>\n </section>\n <script id=\"vr-state\" type=\"application/json\">${escapeJsonForHtml(state)}</script>\n <script>${localUiClientJs}</script>\n </body>\n</html>`;\n}\n", "import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { readFile } from 'node:fs/promises';\nimport { extname, join, resolve } from 'node:path';\nimport type { AddressInfo } from 'node:net';\nimport type { RunScanCommandResult } from '../cli';\nimport type { CliScanArtifact } from '../types';\nimport { openUrlInBrowser } from '../openBrowser';\nimport { getBundledReportAssetsDir } from '../report/reportAssets';\nimport { emptyLocalUiState, mapArtifactToLocalUiState } from './artifactAdapter';\nimport { renderLocalUiHtml } from './static/appHtml';\nimport type { LocalUiState } from './types';\n\nexport type LocalUiScanRunner = (\n flags: Record<string, string | boolean>,\n positional: string[]\n) => Promise<RunScanCommandResult>;\n\nexport interface StartLocalUiServerOptions {\n cwd: string;\n port?: number;\n openBrowser?: boolean;\n scanRunner?: LocalUiScanRunner;\n}\n\nexport interface LocalUiServerHandle {\n url: string;\n close(): Promise<void>;\n}\n\nasync function defaultScanRunner(flags: Record<string, string | boolean>, positional: string[]): Promise<RunScanCommandResult> {\n const cli = await import('../cli');\n return cli.runScanCommand(flags, positional);\n}\n\nasync function readPackageMetadata(cwd: string): Promise<{ name?: string; version?: string }> {\n try {\n const raw = await readFile(join(cwd, 'package.json'), 'utf8');\n const parsed: unknown = JSON.parse(raw);\n if (!isRecord(parsed)) return {};\n return {\n name: typeof parsed.name === 'string' && parsed.name.trim() ? parsed.name.trim() : undefined,\n version: typeof parsed.version === 'string' && parsed.version.trim() ? parsed.version.trim() : undefined\n };\n } catch {\n return {};\n }\n}\n\nfunction isPlaceholderProjectName(value: string | undefined): boolean {\n if (!value) return true;\n const normalized = value.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');\n return (\n normalized === '' ||\n normalized === 'project' ||\n normalized === 'npx-open-source-check' ||\n normalized.startsWith('viberaven-local-ui')\n );\n}\n\nasync function enrichProjectMetadata(state: LocalUiState, cwd: string): Promise<LocalUiState> {\n const metadata = await readPackageMetadata(cwd);\n if (!metadata.name && !metadata.version) return state;\n return {\n ...state,\n project: {\n ...state.project,\n name: metadata.name && !isPlaceholderProjectName(metadata.name) ? metadata.name : state.project.name,\n version: metadata.version ?? state.project.version\n }\n };\n}\n\nasync function readState(cwd: string): Promise<LocalUiState> {\n let state: LocalUiState;\n try {\n const raw = await readFile(join(cwd, '.viberaven', 'last-scan.json'), 'utf8');\n state = mapArtifactToLocalUiState(JSON.parse(raw) as CliScanArtifact);\n } catch {\n state = emptyLocalUiState(cwd);\n }\n return enrichProjectMetadata(state, cwd);\n}\n\nfunction sendJson(response: ServerResponse, value: unknown): void {\n response.writeHead(200, { 'content-type': 'application/json; charset=utf-8' });\n response.end(`${JSON.stringify(value, null, 2)}\\n`);\n}\n\nfunction sendText(response: ServerResponse, status: number, text: string): void {\n response.writeHead(status, { 'content-type': 'text/plain; charset=utf-8' });\n response.end(text);\n}\n\nfunction sendBinary(response: ServerResponse, status: number, contentType: string, body: Buffer): void {\n response.writeHead(status, { 'content-type': contentType });\n response.end(body);\n}\n\nasync function readJsonBody(request: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = [];\n for await (const chunk of request) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n if (chunks.length === 0) return {};\n return JSON.parse(Buffer.concat(chunks).toString('utf8')) as unknown;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction flagsForVerifyIntent(value: unknown): Record<string, string | boolean> | null {\n if (!isRecord(value) || typeof value.intent !== 'string') return null;\n switch (value.intent) {\n case 'verify_action':\n return typeof value.actionId === 'string' && value.actionId.trim()\n ? { verify: true, action: value.actionId.trim() }\n : null;\n case 'verify_gate':\n return { verify: true };\n case 'strict_gate':\n return { strict: true };\n case 'agent_mode_scan':\n return { 'agent-mode': true };\n default:\n return null;\n }\n}\n\nasync function sendArtifact(cwd: string, rel: string, response: ServerResponse): Promise<void> {\n const absolute = resolve(cwd, rel);\n const root = resolve(cwd);\n if (!absolute.startsWith(root)) {\n sendText(response, 403, 'Forbidden');\n return;\n }\n try {\n const text = await readFile(absolute, 'utf8');\n sendText(response, 200, text);\n } catch {\n sendText(response, 404, 'Artifact not found');\n }\n}\n\nasync function sendExtensionIcon(cwd: string, response: ServerResponse): Promise<void> {\n try {\n const body = await readFile(join(cwd, 'media', 'extension-icon.png'));\n sendBinary(response, 200, 'image/png', body);\n } catch {\n sendText(response, 404, 'Icon not found');\n }\n}\n\nfunction contentTypeForAsset(pathname: string): string {\n switch (extname(pathname).toLowerCase()) {\n case '.svg':\n return 'image/svg+xml; charset=utf-8';\n case '.png':\n return 'image/png';\n case '.css':\n return 'text/css; charset=utf-8';\n case '.js':\n return 'text/javascript; charset=utf-8';\n default:\n return 'application/octet-stream';\n }\n}\n\nasync function sendBundledReportAsset(pathname: string, response: ServerResponse): Promise<void> {\n const rel = decodeURIComponent(pathname.replace(/^\\/report\\//, ''));\n const assetRoot = resolve(getBundledReportAssetsDir());\n const absolute = resolve(assetRoot, rel);\n if (!absolute.startsWith(assetRoot)) {\n sendText(response, 403, 'Forbidden');\n return;\n }\n try {\n const body = await readFile(absolute);\n sendBinary(response, 200, contentTypeForAsset(absolute), body);\n } catch {\n sendText(response, 404, 'Asset not found');\n }\n}\n\nasync function handleRequest(\n request: IncomingMessage,\n response: ServerResponse,\n options: Required<Pick<StartLocalUiServerOptions, 'cwd' | 'scanRunner'>>\n): Promise<void> {\n const url = new URL(request.url ?? '/', 'http://127.0.0.1');\n if (request.method === 'GET' && url.pathname === '/') {\n const state = await readState(options.cwd);\n response.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });\n response.end(renderLocalUiHtml(state));\n return;\n }\n if (request.method === 'GET' && url.pathname === '/api/project') {\n sendJson(response, await readState(options.cwd));\n return;\n }\n if (request.method === 'GET' && url.pathname === '/api/artifacts/tasklist') {\n await sendArtifact(options.cwd, join('.viberaven', 'agent-tasklist.md'), response);\n return;\n }\n if (request.method === 'GET' && url.pathname === '/api/artifacts/report') {\n await sendArtifact(options.cwd, join('.viberaven', 'report.html'), response);\n return;\n }\n if (request.method === 'GET' && url.pathname === '/assets/extension-icon.png') {\n await sendExtensionIcon(options.cwd, response);\n return;\n }\n if (request.method === 'GET' && url.pathname.startsWith('/report/')) {\n await sendBundledReportAsset(url.pathname, response);\n return;\n }\n if (request.method === 'POST' && url.pathname === '/api/scan') {\n await options.scanRunner({ 'agent-mode': true }, [options.cwd]);\n sendJson(response, await readState(options.cwd));\n return;\n }\n if (request.method === 'POST' && url.pathname === '/api/verify') {\n await options.scanRunner({ verify: true }, [options.cwd]);\n sendJson(response, await readState(options.cwd));\n return;\n }\n if (request.method === 'POST' && url.pathname === '/api/verify-intent') {\n let body: unknown;\n try {\n body = await readJsonBody(request);\n } catch {\n sendText(response, 400, 'Invalid JSON');\n return;\n }\n const flags = flagsForVerifyIntent(body);\n if (!flags) {\n sendText(response, 400, 'Unsupported verify intent');\n return;\n }\n await options.scanRunner(flags, [options.cwd]);\n sendJson(response, await readState(options.cwd));\n return;\n }\n sendText(response, 404, 'Not found');\n}\n\nfunction listen(server: ReturnType<typeof createServer>, startPort: number): Promise<number> {\n return new Promise((resolveListen, reject) => {\n const tryPort = (port: number) => {\n const onError = (error: NodeJS.ErrnoException) => {\n server.off('listening', onListening);\n if (error.code === 'EADDRINUSE' && port !== 0) {\n tryPort(port + 1);\n return;\n }\n reject(error);\n };\n const onListening = () => {\n server.off('error', onError);\n const address = server.address() as AddressInfo;\n resolveListen(address.port);\n };\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(port, '127.0.0.1');\n };\n tryPort(startPort);\n });\n}\n\nexport async function startLocalUiServer(options: StartLocalUiServerOptions): Promise<LocalUiServerHandle> {\n const cwd = resolve(options.cwd);\n const scanRunner = options.scanRunner ?? defaultScanRunner;\n const server = createServer((request, response) => {\n handleRequest(request, response, { cwd, scanRunner }).catch((error) => {\n sendText(response, 500, error instanceof Error ? error.message : String(error));\n });\n });\n const port = await listen(server, options.port ?? 4177);\n const url = `http://127.0.0.1:${port}`;\n if (options.openBrowser !== false) {\n await openUrlInBrowser(url).catch((error) => {\n console.warn(error instanceof Error ? error.message : String(error));\n });\n }\n return {\n url,\n close: () =>\n new Promise<void>((resolveClose, reject) => {\n server.close((error) => (error ? reject(error) : resolveClose()));\n })\n };\n}\n\nexport async function waitForServerShutdown(): Promise<void> {\n await new Promise<void>((resolveWait) => {\n const done = () => resolveWait();\n process.once('SIGINT', done);\n process.once('SIGTERM', done);\n });\n}\n", "import { existsSync, readFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport type ProviderVerifyResult = {\n verified: boolean;\n proof?: string;\n reason?: string;\n upgradeUrl?: string;\n mcpUnavailable?: boolean;\n fallbackCommand?: string;\n};\n\nexport type ProviderMcpConfig = {\n command?: string;\n args?: string[];\n url?: string;\n source: string;\n};\n\nconst UPGRADE_URL = 'https://viberaven.dev/pricing';\nconst FALLBACK_COMMAND = 'npx -y viberaven audit --vercel-supabase --json';\nconst SUPPORTED_PROVIDERS = new Set(['supabase', 'vercel']);\n\nlet configPathsOverride: string[] | undefined;\n\nexport function setMcpConfigPathsForTest(paths?: string[]): void {\n configPathsOverride = paths;\n}\n\nexport function defaultMcpConfigPaths(): string[] {\n const home = homedir();\n return [\n join(home, '.config', 'claude', 'claude_desktop_config.json'),\n join(home, '.cursor', 'mcp.json'),\n join(home, '.gemini', 'antigravity', 'mcp_config.json'),\n ];\n}\n\nfunction resolveConfigPaths(): string[] {\n return configPathsOverride ?? defaultMcpConfigPaths();\n}\n\nfunction parseMcpServers(raw: unknown): Record<string, unknown> | undefined {\n if (!raw || typeof raw !== 'object') {\n return undefined;\n }\n\n const obj = raw as Record<string, unknown>;\n if (obj.mcpServers && typeof obj.mcpServers === 'object') {\n return obj.mcpServers as Record<string, unknown>;\n }\n\n if (obj.servers && typeof obj.servers === 'object') {\n return obj.servers as Record<string, unknown>;\n }\n\n return undefined;\n}\n\nfunction findServerEntry(servers: Record<string, unknown>, provider: string): unknown {\n if (servers[provider]) {\n return servers[provider];\n }\n\n const key = Object.keys(servers).find((candidate) => candidate.toLowerCase() === provider);\n return key ? servers[key] : undefined;\n}\n\nexport function findProviderMcpConfig(\n provider: string,\n configPaths?: string[]\n): ProviderMcpConfig | undefined {\n const paths = configPaths ?? resolveConfigPaths();\n\n for (const path of paths) {\n if (!existsSync(path)) {\n continue;\n }\n\n try {\n const raw = JSON.parse(readFileSync(path, 'utf8')) as unknown;\n const servers = parseMcpServers(raw);\n if (!servers) {\n continue;\n }\n\n const entry = findServerEntry(servers, provider);\n if (!entry || typeof entry !== 'object') {\n continue;\n }\n\n const server = entry as Record<string, unknown>;\n return {\n command: typeof server.command === 'string' ? server.command : undefined,\n args: Array.isArray(server.args)\n ? server.args.filter((arg): arg is string => typeof arg === 'string')\n : undefined,\n url: typeof server.url === 'string' ? server.url : undefined,\n source: path,\n };\n } catch {\n continue;\n }\n }\n\n return undefined;\n}\n\nexport async function verifyProviderGap(options: {\n provider: string;\n check: string;\n cwd: string;\n plan: string;\n}): Promise<ProviderVerifyResult> {\n if (options.plan !== 'pro') {\n return {\n verified: false,\n reason: 'pro-required',\n upgradeUrl: UPGRADE_URL,\n };\n }\n\n const provider = options.provider.toLowerCase().trim();\n if (!SUPPORTED_PROVIDERS.has(provider)) {\n return {\n verified: false,\n reason: 'unsupported-provider',\n };\n }\n\n const mcpConfig = findProviderMcpConfig(provider);\n if (!mcpConfig) {\n return {\n verified: false,\n mcpUnavailable: true,\n fallbackCommand: FALLBACK_COMMAND,\n };\n }\n\n // V1: provider MCP child-process verification is deferred; config presence is not enough yet.\n return {\n verified: false,\n mcpUnavailable: true,\n fallbackCommand: FALLBACK_COMMAND,\n };\n}\n", "import { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport {\n\n clearCredentials,\n\n loadCredentials,\n loadRunnerSessionCredentials,\n\n loadStackChoicesFile,\n\n resolveApiBaseUrl,\n resolveWorkspaceRoot,\n saveStackChoicesFile\n\n} from './config';\n\nimport { requireCredentials, runDeviceLogin } from './auth';\n\nimport {\n enrichArtifactWithAccount,\n fetchAccountMe,\n formatScanLimitMessage,\n formatUsageLine,\n syncCredentialsFromAccount\n} from './account';\n\nimport { runProjectScan } from './runScan';\n\nimport { writeScanArtifacts, type WriteArtifactsResult } from './artifacts';\nimport type { GateResult } from './contracts/gateResult';\nimport { renderGateResultJson } from './output/json';\nimport { renderJsonlEvents } from './output/jsonl';\nimport { exitCodeForStrictGate } from './commands/strictGate';\n\nimport { refreshReportFromDisk } from './report/refreshReport';\n\nimport { openPathInBrowser } from './openBrowser';\n\nimport { copyToClipboard } from './clipboard';\nimport { printScanSummary } from './terminalSummary';\nimport { ERROR, formatAgentStatus, LOGIN_REQUIRED } from './statusLabels';\nimport { sanitizeArtifactForDisk } from './sanitizeArtifact';\nimport {\n buildRunnerWatchOptions,\n formatRepoMatch,\n parseRunnerConnectFlags,\n runRunnerConnect,\n runRunnerWatchLoop\n} from './runnerConnect';\n\nimport { isScanNotFoundError, loadLastArtifact, pickGap } from './tui/menu';\n\nimport { runInteractiveSession } from './tui/runInteractive';\n\nimport { runGuideCommand } from './commands/guide';\nimport { runNextCommand } from './commands/next';\nimport { runOpenCommand } from './commands/open';\nimport { runCondenseCommand } from './commands/condense';\nimport { runHealCommand } from './commands/heal';\nimport { resolveNextAction } from './resolveNextAction';\nimport { PRODUCTION_MAP_CATEGORY_KEYS_ALL } from '../../../shared/planLimits';\nimport { recommendStack } from './stackRecommend';\n\nimport { PUBLIC_AGENT_MODE_COMMAND, PUBLIC_INIT_ALL_COMMAND } from './contracts/commands';\nimport { runInitCommand } from './commands/runInit';\nimport { runDoctorAgentsCommand } from './commands/runDoctor';\nimport { runValidateNpmPackageCommand } from './commands/runValidateNpmPackage';\nimport { runAuditCommand } from './commands/runAudit';\nimport { runActionsCommand } from './commands/actions';\nimport { runVerifyActionCommand } from './commands/verifyAction';\nimport { runPreviewCommand } from './commands/preview';\nimport { startLocalUiServer, waitForServerShutdown } from './local-ui/server';\nimport { VERSION } from './version';\nimport { loadLoopState, saveLoopState, resetBatch } from './loopState';\nimport {\n buildNextActionBlock,\n printNextActionBlock,\n printProviderActionBlock,\n} from './output/nextActionBlock';\nimport { buildTaskList } from './buildTaskList';\nimport { verifyProviderGap } from './providerMcpBridge';\nimport { renderActionSurface } from './actions/render';\nimport type { VibeRavenActionsManifest } from './actions/types';\n\n\n\nexport function printHelp(): void {\n\n console.log(`viberaven ${VERSION} \u2014 launch readiness for AI-built apps\n\n\n\nUsage:\n\n viberaven Open the local launch console for human TTY use\n\n viberaven ui [path] Open the local launch console\n\n viberaven tui Same interactive menu\n\n viberaven login [--api-url <url>]\n\n viberaven logout\n\n viberaven status\n\n viberaven actions [--json] [path]\n Print current chat-native production action surface\n\n viberaven preview [--agent-mode] [--json]\n Local production rehearsal for videos and onboarding; no login or API spend\n\n viberaven connect --session <id> --token <token> [--once] [--api-url <url>]\n Handshake, save runner session, then watch for jobs (Ctrl+C to stop)\n\n viberaven watch [--api-url <url>]\n Poll runner jobs using saved session credentials until Ctrl+C\n\n viberaven scan [--open] [--json] [--api-url <url>] [path]\n\n viberaven --agent-mode [--json|--jsonl] [path]\n Agent-first scan; writes tasklist, gate-result, context-map, and per-gap JSON\n\n viberaven --strict[=warning] [path]\n Fail when production gate is not clear; warning mode also fails on warnings\n\n viberaven --condense [path]\n Refresh .viberaven/context-map.json from the last scan\n\n viberaven report [--open] [path]\n Rebuild report.html from last scan (no new API scan)\n\n viberaven prompt [--gap <id>] [--provider <key>] [--area <key>] [--no-copy]\n\n viberaven stack set <area> <provider>\n\n viberaven stack clear <area>\n\n viberaven stack list\n\n viberaven stack recommend\n Suggest agent-default stack from package.json\n\n viberaven next [--json] [path]\n Next action from last scan (repo fix, provider guide, or upgrade)\n\n viberaven guide <provider> [--step N] [--json]\n Provider setup wizard (vercel, supabase, stripe, auth-supabase)\n\n viberaven open [provider|url]\n Open dashboard URL from next action or playbook\n\n viberaven init [--agents all|codex,claude,...] [--dry-run] [path]\n Install bounded VibeRaven agent rules (${PUBLIC_INIT_ALL_COMMAND})\n\n viberaven doctor --agents [path]\n Verify agent instruction files and canonical commands\n\n viberaven audit --vercel-supabase [--json] [path]\n Local Vercel/Supabase repo evidence audit (RLS, pooler, secrets)\n\n\n\nAgent workflow (Claude Code / Codex):\n\n ${PUBLIC_AGENT_MODE_COMMAND}\n\n Read .viberaven/agent-tasklist.md first, .viberaven/gate-result.json for the machine verdict, then .viberaven/context-map.json\n\n viberaven next --json \u2192 guide/open \u2192 scan again\n\n\n\nHumans: run \\`viberaven\\` for the local launch console or \\`VIBERAVEN_TUI=1 viberaven\\` for the older menu.\n\nAgents: use \\`${PUBLIC_AGENT_MODE_COMMAND}\\` directly (no --open required).\n\n\n\nEnvironment:\n\n VIBERAVEN_API_URL Managed API base URL (same server as the VS Code extension)\n\nSecurity:\n\n CLI scans use VibeRaven login \u2014 not OPENAI_API_KEY. See packages/cli/SECURITY.md.\n\n`);\n\n}\n\n\n\nexport function parseArgs(argv: string[]): {\n\n command: string;\n\n flags: Record<string, string | boolean>;\n\n positional: string[];\n\n} {\n\n const flags: Record<string, string | boolean> = {};\n\n const positional: string[] = [];\n\n let command = '';\n\n\n\n for (let i = 0; i < argv.length; i += 1) {\n\n const arg = argv[i];\n\n if (arg === '--help' || arg === '-h') {\n\n flags.help = true;\n\n continue;\n\n }\n\n if (arg === '--version' || arg === '-v') {\n\n flags.version = true;\n\n continue;\n\n }\n\n if (arg.startsWith('--')) {\n\n const equalsIndex = arg.indexOf('=');\n\n const key = equalsIndex === -1 ? arg.slice(2) : arg.slice(2, equalsIndex);\n\n if (equalsIndex !== -1) {\n\n flags[key] = arg.slice(equalsIndex + 1);\n\n continue;\n\n }\n\n const next = argv[i + 1];\n\n if (\n next &&\n !isBooleanFlag(command, key) &&\n (!next.startsWith('-') || shouldConsumeLeadingHyphenValue(command, key, next))\n ) {\n\n flags[key] = next;\n\n i += 1;\n\n } else {\n\n flags[key] = true;\n\n }\n\n continue;\n\n }\n\n if (!command) {\n\n command = arg;\n\n } else {\n\n positional.push(arg);\n\n }\n\n }\n\n\n\n return { command, flags, positional };\n\n}\n\nfunction isBooleanFlag(command: string, key: string): boolean {\n if ([\n 'agent-mode',\n 'json',\n 'jsonl',\n 'condense',\n 'heal',\n 'plan',\n 'prompt',\n 'apply',\n 'yes',\n 'no-verify',\n 'force-scan',\n ].includes(key)) {\n return true;\n }\n if (key === 'strict') return true;\n if (key === 'open' && (command === '' || command === 'scan' || command === 'report')) return true;\n if (key === 'verify' && command === '') return true;\n if (key === 'vercel-supabase' && command === 'audit') return true;\n if (key === 'json' && command === 'validate-npm-package') return true;\n if (key === 'dry-run' && command === 'init') return true;\n if (key === 'agents' && command === 'doctor') return true;\n return false;\n}\n\nfunction shouldConsumeLeadingHyphenValue(command: string, key: string, value: string): boolean {\n\n return command === 'connect' && (key === 'session' || key === 'token') && !value.startsWith('--');\n\n}\n\nfunction hasFlag(flags: Record<string, string | boolean>, key: string): boolean {\n return flags[key] === true || typeof flags[key] === 'string';\n}\n\nasync function guardEarlyVerifyScan(input: {\n flags: Record<string, string | boolean>;\n positional: string[];\n wantsStrict: boolean;\n}): Promise<number | undefined> {\n if (input.flags['force-scan'] === true) {\n return undefined;\n }\n\n const verifyLike = input.flags.verify === true || input.wantsStrict;\n if (!verifyLike) {\n return undefined;\n }\n\n const workspacePath = input.positional[0]\n ? join(process.cwd(), input.positional[0])\n : await resolveWorkspaceRoot(process.cwd());\n const loopState = await loadLoopState(workspacePath);\n if (loopState.batchApplied <= 0) {\n return undefined;\n }\n\n let artifact;\n try {\n artifact = await loadLastArtifact(workspacePath);\n } catch {\n return undefined;\n }\n\n const plan = artifact.plan ?? (await loadCredentials())?.plan ?? 'free';\n const batchSize = plan === 'pro' ? 10 : 3;\n if (loopState.batchApplied >= batchSize) {\n return undefined;\n }\n\n const appliedGapIds = new Set(loopState.appliedGapIdsSinceScan ?? []);\n const remainingRepoCodeTasks = buildTaskList(artifact).filter(\n (task) =>\n task.fixType === 'repo-code' &&\n task.requiresUserAction === false &&\n !appliedGapIds.has(task.gapId)\n );\n\n if (remainingRepoCodeTasks.length === 0) {\n return undefined;\n }\n\n const nextTask = remainingRepoCodeTasks[0];\n console.error('SCAN_DEFERRED: Local heal batch is not full yet, so VibeRaven is protecting scan quota.');\n console.error(`Batch progress: ${loopState.batchApplied}/${batchSize} local heals applied since the last scan.`);\n console.error(`Next local heal: npx -y viberaven --heal --apply --gap ${nextTask.gapId} --yes`);\n console.error('Run verify again after the batch is full, or add --force-scan if the user explicitly wants to spend a scan now.');\n return 4;\n}\n\nexport type DefaultEntrypointMode = 'local-ui' | 'interactive' | 'agent-scan';\n\nexport function resolveDefaultEntrypointMode(options: {\n stdinIsTTY: boolean;\n stdoutIsTTY: boolean;\n env: Record<string, string | undefined>;\n}): DefaultEntrypointMode {\n if (options.env.VIBERAVEN_TUI === '1') return 'interactive';\n if (options.env.VIBERAVEN_AGENT === '1') return 'agent-scan';\n return 'local-ui';\n}\n\nexport type RunScanCommandResult = {\n exitCode: number;\n artifacts?: WriteArtifactsResult;\n};\n\nexport function formatScanJsonStdout(artifact: Parameters<typeof sanitizeArtifactForDisk>[0]): string {\n\n return JSON.stringify(sanitizeArtifactForDisk(artifact), null, 2);\n\n}\n\n\n\nasync function cmdLogin(flags: Record<string, string | boolean>): Promise<void> {\n\n const apiBaseUrl = resolveApiBaseUrl(typeof flags['api-url'] === 'string' ? flags['api-url'] : undefined);\n\n await runDeviceLogin(apiBaseUrl);\n\n}\n\n\n\nasync function cmdLogout(): Promise<void> {\n\n await clearCredentials();\n\n console.log('Signed out.');\n\n}\n\nasync function cmdProviderVerify(\n flags: Record<string, string | boolean>,\n positional: string[]\n): Promise<number> {\n const provider = typeof flags.provider === 'string' ? flags.provider : positional[0];\n const check = typeof flags.check === 'string' ? flags.check : positional[1];\n\n if (!provider || !check) {\n console.error('Usage: viberaven provider-verify --provider <supabase|vercel> --check <id> [--plan free|pro]');\n return 1;\n }\n\n let plan = typeof flags.plan === 'string' ? flags.plan : 'free';\n if (!flags.plan) {\n const creds = await loadCredentials();\n if (creds?.plan === 'pro' || creds?.plan === 'free') {\n plan = creds.plan;\n }\n }\n\n const result = await verifyProviderGap({\n provider,\n check,\n cwd: process.cwd(),\n plan,\n });\n\n console.log(JSON.stringify(result, null, 2));\n return result.verified ? 0 : 1;\n}\n\n\n\nasync function cmdStatus(\n flags: Record<string, string | boolean>,\n positional: string[]\n): Promise<number> {\n\n const creds = await loadCredentials();\n\n if (!creds?.accessToken) {\n\n console.log('Not signed in. Run: viberaven login');\n\n return 1;\n\n }\n\n const startDir = positional[0] ? join(process.cwd(), positional[0]) : process.cwd();\n let artifact: Awaited<ReturnType<typeof loadLastArtifact>> | undefined;\n try {\n artifact = await loadLastArtifact(startDir);\n } catch {\n artifact = undefined;\n }\n\n try {\n\n const synced = await syncCredentialsFromAccount(creds);\n const usage = synced.account.usage;\n const next = artifact ? resolveNextAction(artifact) : undefined;\n\n if (flags.json) {\n console.log(\n JSON.stringify(\n {\n email: synced.email ?? creds.email ?? null,\n plan: synced.plan ?? creds.plan ?? usage.plan,\n scansUsed: usage.used,\n scansLimit: usage.limit,\n period: usage.period,\n productionCorePercent: artifact?.productionCorePercent ?? null,\n score: artifact?.score ?? null,\n unlockedLanes: usage.unlockedMapCategoryKeys.length,\n totalLanes: PRODUCTION_MAP_CATEGORY_KEYS_ALL.length,\n next: next ?? null,\n apiBaseUrl: synced.apiBaseUrl\n },\n null,\n 2\n )\n );\n return 0;\n }\n\n console.log(`Signed in: ${synced.email ?? '(email unknown)'}`);\n\n console.log(`Plan: ${synced.plan ?? 'unknown'}`);\n\n console.log(formatUsageLine(usage));\n\n if (artifact) {\n console.log(`Production core: ${artifact.productionCorePercent}% \u00B7 Score ${artifact.score}`);\n console.log(\n `Lanes: ${usage.unlockedMapCategoryKeys.length}/${PRODUCTION_MAP_CATEGORY_KEYS_ALL.length} unlocked`\n );\n if (next) {\n console.log(`Next: ${next.title}`);\n }\n } else {\n console.log('No local scan yet. Run: viberaven scan');\n }\n\n console.log(`API: ${synced.apiBaseUrl}`);\n\n return 0;\n\n } catch (error) {\n\n console.log(`Signed in (cached): ${creds.email ?? '(email unknown)'}`);\n\n console.log(`Plan: ${creds.plan ?? 'unknown'}`);\n\n console.log(`API: ${creds.apiBaseUrl}`);\n\n console.warn(error instanceof Error ? error.message : String(error));\n\n return 1;\n\n }\n\n}\n\nfunction createRunnerWatchAbortController(): AbortController {\n const controller = new AbortController();\n const onSigint = () => {\n console.log('\\nStopping runner watch...');\n controller.abort();\n };\n process.once('SIGINT', onSigint);\n controller.signal.addEventListener(\n 'abort',\n () => {\n process.off('SIGINT', onSigint);\n },\n { once: true }\n );\n return controller;\n}\n\nasync function cmdConnect(flags: Record<string, string | boolean>): Promise<number> {\n let connectArgs;\n\n try {\n connectArgs = parseRunnerConnectFlags(flags);\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n return 1;\n }\n\n const apiBaseUrl = resolveApiBaseUrl(typeof flags['api-url'] === 'string' ? flags['api-url'] : undefined);\n const workspaceRoot = await resolveWorkspaceRoot(process.cwd());\n\n try {\n console.log(`Connecting VibeRaven runner from ${workspaceRoot}...`);\n const result = await runRunnerConnect({\n ...connectArgs,\n apiBaseUrl,\n workspaceRoot,\n runnerVersion: VERSION\n });\n\n const repoMatch = formatRepoMatch(result.repoMatch);\n console.log(`Connected runner session: ${result.runnerSession.id}`);\n console.log(`Repo match: ${repoMatch}`);\n\n if (result.repoMatch !== 'matched') {\n console.log('The web cockpit remains the command center. Return there to review the repo mismatch before continuing.');\n }\n\n if (!connectArgs.once) {\n console.log('Watching for runner jobs. Press Ctrl+C to stop.');\n const watchController = createRunnerWatchAbortController();\n await runRunnerWatchLoop({\n ...buildRunnerWatchOptions({\n apiBaseUrl,\n workspaceRoot,\n handshake: result,\n oneTimeToken: connectArgs.oneTimeToken\n }),\n signal: watchController.signal,\n onPollError: (error) => {\n console.warn(error instanceof Error ? error.message : String(error));\n }\n });\n }\n\n return 0;\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error));\n console.error('The web cockpit remains the command center. Return there to create a fresh runner command if needed.');\n return 1;\n }\n}\n\nasync function cmdWatch(flags: Record<string, string | boolean>): Promise<number> {\n const savedRunner = await loadRunnerSessionCredentials();\n if (!savedRunner) {\n console.error('No saved runner session. Run: viberaven connect --session <id> --token <token>');\n return 1;\n }\n\n const apiBaseUrl = resolveApiBaseUrl(\n typeof flags['api-url'] === 'string' ? flags['api-url'] : savedRunner.apiBaseUrl\n );\n const workspaceRoot = await resolveWorkspaceRoot(process.cwd());\n const watchController = createRunnerWatchAbortController();\n\n try {\n console.log(`Watching runner jobs for session ${savedRunner.runnerSessionId} from ${workspaceRoot}...`);\n console.log('Press Ctrl+C to stop.');\n await runRunnerWatchLoop({\n apiBaseUrl,\n workspaceRoot,\n runnerSessionId: savedRunner.runnerSessionId,\n runnerAccessToken: savedRunner.runnerAccessToken,\n signal: watchController.signal,\n onPollError: (error) => {\n console.warn(error instanceof Error ? error.message : String(error));\n }\n });\n return 0;\n } catch (error) {\n if (watchController.signal.aborted) {\n return 0;\n }\n console.error(error instanceof Error ? error.message : String(error));\n return 1;\n }\n}\n\n\n\nexport async function runScanCommand(\n\n flags: Record<string, string | boolean>,\n\n positional: string[],\n\n options?: { deferMachineOutput?: boolean }\n\n): Promise<RunScanCommandResult> {\n\n const workspacePath = positional[0]\n ? join(process.cwd(), positional[0])\n : await resolveWorkspaceRoot(process.cwd());\n\n const apiBaseUrl = resolveApiBaseUrl(typeof flags['api-url'] === 'string' ? flags['api-url'] : undefined);\n\n\n\n let accessToken: string;\n\n try {\n\n ({ accessToken } = await requireCredentials(apiBaseUrl));\n\n } catch (error) {\n\n const message = error instanceof Error ? error.message : String(error);\n\n if (message.startsWith(`${LOGIN_REQUIRED}:`)) {\n console.log('LOGIN_REQUIRED: Starting VibeRaven browser sign-in so this scan can continue.');\n console.log('AGENT_ACTION: Open the VibeRaven approval URL for the user if the browser does not open automatically.');\n await runDeviceLogin(apiBaseUrl);\n console.log('LOGIN_RESUME: Sign-in complete. Continuing the original scan.');\n try {\n ({ accessToken } = await requireCredentials(apiBaseUrl));\n } catch (retryError) {\n console.error(retryError instanceof Error ? retryError.message : String(retryError));\n return { exitCode: 1 };\n }\n } else {\n console.error(message);\n return { exitCode: 1 };\n }\n\n }\n\n\n\n if (!options?.deferMachineOutput) {\n console.log(`Scanning ${workspacePath}\u2026`);\n }\n\n const result = await runProjectScan({ workspacePath, accessToken, apiBaseUrl });\n\n\n\n if (!result.ok) {\n\n if (result.kind === 'scan_limit') {\n\n console.error(formatScanLimitMessage(result.upgradeUrl));\n\n try {\n\n const account = await fetchAccountMe(apiBaseUrl, accessToken);\n\n console.error(formatUsageLine(account.usage));\n\n } catch {\n\n // usage refresh is best-effort when blocked\n\n }\n\n console.error('Tip: `viberaven report` rebuilds from last-scan.json without using a scan.');\n\n return { exitCode: 2 };\n\n }\n\n if (result.kind === 'auth_required' || result.kind === 'session_invalid') {\n console.error(formatAgentStatus(LOGIN_REQUIRED, result.message));\n return { exitCode: 1 };\n }\n\n console.error(formatAgentStatus(ERROR, result.message));\n\n return { exitCode: 1 };\n\n }\n\n\n\n const artifact = await enrichArtifactWithAccount(result.artifact, apiBaseUrl, accessToken);\n\n const paths = await writeScanArtifacts({ artifact, cwd: workspacePath });\n\n\n\n if (flags.json && !options?.deferMachineOutput) {\n\n console.log(formatScanJsonStdout(artifact));\n\n return { exitCode: 0, artifacts: paths };\n\n }\n\n if (!options?.deferMachineOutput) {\n printScanSummary(artifact, paths);\n }\n\n if (artifact.usage && !options?.deferMachineOutput) {\n\n console.log(formatUsageLine(artifact.usage));\n\n }\n\n if (flags['agent-mode'] && !options?.deferMachineOutput) {\n const loopState = await loadLoopState(workspacePath);\n const openGapCount = artifact.gaps.length;\n const updatedState = resetBatch(loopState, openGapCount);\n const tasks = buildTaskList(artifact);\n const plan = artifact.plan ?? 'free';\n const block = buildNextActionBlock(tasks, updatedState, plan);\n printNextActionBlock(block);\n printProviderActionBlock(tasks);\n try {\n const manifest = JSON.parse(await readFile(paths.actionsPath, 'utf8')) as VibeRavenActionsManifest;\n console.log(renderActionSurface(manifest, { limit: 5 }).trimEnd());\n } catch (error) {\n console.warn(error instanceof Error ? error.message : String(error));\n }\n await saveLoopState(workspacePath, updatedState);\n }\n\n if (flags.open) {\n\n try {\n\n await openPathInBrowser(paths.reportPath);\n\n } catch (error) {\n\n console.warn(error instanceof Error ? error.message : String(error));\n\n }\n\n }\n\n\n\n return { exitCode: 0, artifacts: paths };\n\n}\n\n\n\nasync function cmdReport(\n flags: Record<string, string | boolean>,\n positional: string[]\n): Promise<number> {\n const startDir = positional[0] ? join(process.cwd(), positional[0]) : process.cwd();\n\n try {\n const paths = await refreshReportFromDisk(startDir);\n console.log(`Report refreshed: ${paths.reportPath}`);\n\n if (flags.open) {\n try {\n await openPathInBrowser(paths.reportPath);\n } catch (error) {\n console.warn(error instanceof Error ? error.message : String(error));\n }\n }\n\n return 0;\n } catch (error) {\n if (isScanNotFoundError(error)) {\n console.error(error.message);\n return 1;\n }\n console.error(error instanceof Error ? error.message : String(error));\n return 1;\n }\n}\n\nasync function cmdPrompt(\n\n flags: Record<string, string | boolean>,\n\n positional: string[]\n\n): Promise<number> {\n\n const startDir = positional[0] ? join(process.cwd(), positional[0]) : process.cwd();\n\n let artifact;\n\n try {\n\n artifact = await loadLastArtifact(startDir);\n\n } catch (error) {\n\n console.error(error instanceof Error ? error.message : 'No scan found. Run: viberaven scan');\n\n return 1;\n\n }\n\n\n\n const gap = pickGap(artifact, {\n\n gapId: typeof flags.gap === 'string' ? flags.gap : undefined,\n\n provider: typeof flags.provider === 'string' ? flags.provider : undefined,\n\n area: typeof flags.area === 'string' ? flags.area : undefined\n\n });\n\n\n\n if (!gap) {\n\n console.error('No matching gap. Run `viberaven scan` or pass --gap <id>.');\n\n return 1;\n\n }\n\n\n\n const skipCopy = flags['no-copy'] === true;\n\n if (!skipCopy) {\n try {\n await copyToClipboard(gap.copyPrompt);\n console.log(`Copied to clipboard: ${gap.title}`);\n return 0;\n } catch (error) {\n console.warn(error instanceof Error ? error.message : String(error));\n }\n }\n\n console.log(gap.copyPrompt);\n\n return 0;\n\n}\n\n\n\nconst STACK_AREAS = new Set(['database', 'auth', 'payments', 'deployment', 'monitoring', 'security']);\n\n\n\nasync function cmdStack(positional: string[]): Promise<number> {\n\n const cwd = process.cwd();\n\n const sub = positional[0];\n\n\n\n if (sub === 'recommend') {\n const rec = await recommendStack(cwd);\n console.log(JSON.stringify(rec, null, 2));\n return 0;\n }\n\n if (sub === 'list' || !sub) {\n\n const file = await loadStackChoicesFile(cwd);\n\n const entries = Object.entries(file.choices);\n\n if (entries.length === 0) {\n\n console.log('No provider overrides. Detection runs from repo evidence.');\n\n return 0;\n\n }\n\n for (const [area, choice] of entries) {\n\n console.log(`${area}: ${choice.provider}`);\n\n }\n\n return 0;\n\n }\n\n\n\n if (sub === 'set') {\n\n const area = positional[1];\n\n const provider = positional[2];\n\n if (!area || !provider) {\n\n console.error('Usage: viberaven stack set <area> <provider>');\n\n return 1;\n\n }\n\n if (!STACK_AREAS.has(area)) {\n\n console.error(`Unknown area \"${area}\". Valid: ${[...STACK_AREAS].join(', ')}`);\n\n return 1;\n\n }\n\n const file = await loadStackChoicesFile(cwd);\n\n file.choices[area] = { provider, selectedAt: new Date().toISOString() };\n\n await saveStackChoicesFile(cwd, file);\n\n console.log(`Set ${area} \u2192 ${provider}. Run \\`viberaven scan\\` to re-map.`);\n\n return 0;\n\n }\n\n\n\n if (sub === 'clear') {\n\n const area = positional[1];\n\n const file = await loadStackChoicesFile(cwd);\n\n if (area) {\n\n delete file.choices[area];\n\n } else {\n\n file.choices = {};\n\n }\n\n await saveStackChoicesFile(cwd, file);\n\n console.log(area ? `Cleared ${area}.` : 'Cleared all provider overrides.');\n\n return 0;\n\n }\n\n\n\n console.error(`Unknown stack subcommand \"${sub}\". Use set, clear, or list.`);\n\n return 1;\n\n}\n\n\n\nexport async function main(): Promise<number> {\n\n const { command, flags, positional } = parseArgs(process.argv.slice(2));\n\n\n\n if (flags.help) {\n\n printHelp();\n\n return 0;\n\n }\n\n if (flags.version || command === 'version') {\n\n console.log(VERSION);\n\n return 0;\n\n }\n\n const isAgentMode = hasFlag(flags, 'agent-mode');\n const wantsJson = hasFlag(flags, 'json');\n const wantsJsonl = hasFlag(flags, 'jsonl');\n const wantsStrict = hasFlag(flags, 'strict');\n\n if (flags.condense) {\n const cwd = positional[0] ? join(process.cwd(), positional[0]) : process.cwd();\n const result = await runCondenseCommand({ cwd });\n console.log(`VibeRaven context map refreshed: ${result.contextMapPath}`);\n return 0;\n }\n\n if (flags.heal) {\n const mode = flags.apply ? 'apply' : flags.prompt ? 'prompt' : 'plan';\n const result = await runHealCommand({\n cwd: process.cwd(),\n mode,\n target: typeof flags.target === 'string' ? flags.target : undefined,\n gapId: typeof flags.gap === 'string' ? flags.gap : undefined,\n yes: flags.yes === true,\n noVerify: flags['no-verify'] === true,\n });\n console.log(JSON.stringify(result, null, 2));\n return result.status.startsWith('refused') || result.status === 'failed' ? 1 : 0;\n }\n\n if (!command && flags.verify === true && typeof flags.action === 'string') {\n return runVerifyActionCommand({\n cwd: positional[0] ? join(process.cwd(), positional[0]) : process.cwd(),\n actionId: flags.action,\n });\n }\n\n if (!command && (isAgentMode || flags.verify === true || wantsJson || wantsJsonl || wantsStrict)) {\n const guardedExitCode = await guardEarlyVerifyScan({ flags, positional, wantsStrict });\n if (guardedExitCode !== undefined) {\n return guardedExitCode;\n }\n\n const deferMachineOutput = wantsJson || wantsJsonl;\n const scanResult = await runScanCommand(flags, positional, { deferMachineOutput });\n\n if ((wantsJson || wantsJsonl) && !scanResult.artifacts) {\n console.error('VibeRaven could not produce machine output because scan artifacts were not written.');\n return 3;\n }\n\n const gateResult =\n scanResult.artifacts && (wantsJson || wantsJsonl || wantsStrict)\n ? (JSON.parse(await readFile(scanResult.artifacts.gateResultPath, 'utf8')) as GateResult)\n : undefined;\n const strictExitCode =\n wantsStrict && gateResult\n ? exitCodeForStrictGate(gateResult, { failOnWarnings: flags.strict === 'warning' })\n : scanResult.exitCode;\n\n if (wantsJson && gateResult) {\n process.stdout.write(renderGateResultJson(gateResult));\n return strictExitCode;\n }\n\n if (wantsJsonl && gateResult) {\n process.stdout.write(renderJsonlEvents(gateResult));\n return strictExitCode;\n }\n\n if (wantsStrict && gateResult) {\n return strictExitCode;\n }\n\n return scanResult.exitCode;\n }\n\n if (!command) {\n const mode = resolveDefaultEntrypointMode({\n stdinIsTTY: Boolean(process.stdin.isTTY),\n stdoutIsTTY: Boolean(process.stdout.isTTY),\n env: process.env\n });\n\n if (mode === 'local-ui') {\n const cwd = positional[0] ? join(process.cwd(), positional[0]) : process.cwd();\n const handle = await startLocalUiServer({ cwd });\n console.log(`VibeRaven local UI: ${handle.url}`);\n await waitForServerShutdown();\n await handle.close();\n return 0;\n }\n\n if (mode === 'interactive') {\n await runInteractiveSession();\n return 0;\n }\n\n const scanResult = await runScanCommand({ 'agent-mode': true }, positional);\n return scanResult.exitCode;\n }\n\n\n\n switch (command) {\n\n case 'tui':\n\n case 'interactive':\n\n await runInteractiveSession();\n\n return 0;\n\n case 'ui': {\n const cwd = positional[0] ? join(process.cwd(), positional[0]) : process.cwd();\n const handle = await startLocalUiServer({ cwd });\n console.log(`VibeRaven local UI: ${handle.url}`);\n await waitForServerShutdown();\n await handle.close();\n return 0;\n }\n\n case 'login':\n\n await cmdLogin(flags);\n\n return 0;\n\n case 'logout':\n\n await cmdLogout();\n\n return 0;\n\n case 'status':\n\n return cmdStatus(flags, positional);\n\n case 'actions':\n return runActionsCommand({\n cwd: positional[0] ? join(process.cwd(), positional[0]) : process.cwd(),\n json: Boolean(flags.json),\n });\n\n case 'preview':\n return runPreviewCommand({\n cwd: positional[0] ? join(process.cwd(), positional[0]) : process.cwd(),\n agentMode: flags['agent-mode'] === true,\n json: Boolean(flags.json),\n });\n\n case 'next':\n\n return runNextCommand({\n json: Boolean(flags.json),\n cwd: positional[0] ? join(process.cwd(), positional[0]) : process.cwd()\n });\n\n case 'guide': {\n const provider = positional[0];\n if (!provider) {\n console.error('Usage: viberaven guide <provider> [--step N] [--json]');\n return 1;\n }\n const stepRaw = flags.step;\n const step = typeof stepRaw === 'string' ? Number.parseInt(stepRaw, 10) : undefined;\n return runGuideCommand({\n provider,\n step: Number.isFinite(step) ? step : undefined,\n json: Boolean(flags.json)\n });\n }\n\n case 'open':\n return runOpenCommand({\n target: positional[0],\n cwd: process.cwd()\n });\n\n case 'connect':\n\n return cmdConnect(flags);\n\n case 'watch':\n\n return cmdWatch(flags);\n\n case 'scan': {\n\n const scanResult = await runScanCommand(flags, positional);\n return scanResult.exitCode;\n }\n\n case 'report':\n\n return cmdReport(flags, positional);\n\n case 'prompt':\n\n return cmdPrompt(flags, positional);\n\n case 'stack':\n\n return cmdStack(positional);\n\n case 'provider-verify':\n\n return cmdProviderVerify(flags, positional);\n\n case 'init': {\n const cwd = positional[0] ? join(process.cwd(), positional[0]) : process.cwd();\n const agents = typeof flags.agents === 'string' ? flags.agents : undefined;\n return runInitCommand({\n cwd,\n agents,\n dryRun: flags['dry-run'] === true,\n });\n }\n\n case 'doctor':\n if (flags.agents !== true) {\n console.error('Usage: viberaven doctor --agents [path]');\n return 1;\n }\n return runDoctorAgentsCommand({\n cwd: positional[0] ? join(process.cwd(), positional[0]) : process.cwd(),\n });\n\n case 'validate-npm-package':\n return runValidateNpmPackageCommand({\n names: positional,\n json: Boolean(flags.json),\n });\n\n case 'audit':\n if (flags['vercel-supabase'] !== true) {\n console.error('Usage: viberaven audit --vercel-supabase [--json] [path]');\n return 1;\n }\n return runAuditCommand({\n cwd: positional[0] ? join(process.cwd(), positional[0]) : process.cwd(),\n json: Boolean(flags.json),\n });\n\n default:\n\n console.error(`Unknown command: ${command}`);\n\n printHelp();\n\n return 1;\n\n }\n\n}\n\n\n\nif (require.main === module) {\n\n main()\n\n .then((code) => {\n\n if (code !== 0) {\n\n process.exitCode = code;\n\n }\n\n })\n\n .catch((error) => {\n\n console.error(error instanceof Error ? error.message : String(error));\n\n process.exitCode = 1;\n\n });\n\n}\n"],
5
+ "mappings": "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UA,MAAV,QACA,QAAUA,MAAaA,MAAa,QAC1BA,MAAV,QACUA,MAAV,QACA,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QAC1BA,MAAV,QACA,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QAC1BA,MAAV,QACUA,MAAV,QACUA,MAAV,QACUA,MAAV,QACA,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QAC1BA,MAAV,QACUA,MAAV,QACUA,MAAV,QACUA,MAAV,QACUA,MAAV,QACA,QAAUA,MAAaA,MAAa,QAC1BA,MAAV,QACUA,MAAV,QACA,QAAUA,MAAaA,MAAa,QAC1BA,MAAV,QACA,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QAC1BA,MAAV,QACUA,MAAV,QACUA,MAAV,QACA,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QAC1BA,MAAV,QACUA,MAAV,QACUA,MAAV,QACUA,MAAV,QACUA,MAAV,QACA,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QAC1BA,MAAV,QACA,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QAC1BA,MAAV,QACA,QAAUA,MAAaA,MAAa,QAC1BA,MAAV,QACA,QAAUA,MAAaA,MAAa,QACpC,QAAUA,MAAaA,MAAa,QAC1BA,MAAV,QACUA,MAAV,QACUA,MAAV,QACUA,MAAV,QACA,QAAUA,MAAaA,MAAa,QACpC,QAAUA,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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACA/B,IAAa;AAAb;AAAA;AAAA;AAAO,IAAM,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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",
6
+ "names": ["import_promises", "m", "e", "k", "resolve", "resolve", "fs", "b", "p", "d", "import_node_fs", "import_node_path", "isRecord", "item", "b", "g", "provider", "provider", "check", "check", "AREA_LABELS", "m", "item", "check", "provider", "item", "PROVIDERS", "normalizePath", "AREAS", "testRegex", "containsImport", "item", "provider", "b", "k", "normalizePath", "item", "visibleFiles", "item", "hasPackage", "packageEvidence", "pathEvidence", "envEvidence", "isClientExecutedPath", "visibleFiles", "buildContext", "AREAS", "item", "normalizePath", "provider", "providerLabel", "_", "provider", "visibleFiles", "p", "check", "raw", "normalized", "scanContext", "launchValidation", "fs", "import_node_fs", "import_node_path", "unique", "unique", "check", "import_node_fs", "import_node_path", "init_types", "isRecord", "k", "provider", "readFileAsync", "import_node_fs", "import_promises", "import_node_path", "init_types", "check", "b", "SEVERITY_RANK", "g", "import_promises", "import_node_path", "item", "provider", "b", "UPGRADE_URL", "check", "item", "provider", "unlockedKeys", "init_types", "item", "provider", "UPGRADE_URL", "isRecord", "import_node_fs", "import_node_path", "isAbsolute", "provider", "import_promises", "import_node_path", "init_registry", "gateStatus", "import_promises", "import_node_path", "init_registry", "import_promises", "import_node_path", "init_artifacts", "init_artifacts", "resolve", "import_node_child_process", "exports", "module", "p", "normalizeProviderToken", "provider", "check", "b", "pc", "check", "g", "provider", "isRecord", "basename", "resolve", "normalizeBaseUrl", "isRecord", "b", "escapeRegExp", "import_promises", "import_node_path", "import_node_child_process", "exports", "module", "x", "y", "ansiRegex", "onlyFirst", "pattern", "stripAnsi", "string", "regex", "e", "stringWidth", "options", "emojiRegex", "ambiguousCharacterWidth", "width", "character", "codePoint", "eastAsianWidth", "assembleStyles", "codes", "groupName", "group", "styles", "styleName", "style", "wrapAnsi16", "wrapAnsi256", "wrapAnsi16m", "ANSI_BACKGROUND_OFFSET", "red", "green", "blue", "hex", "matches", "colorString", "integer", "code", "remainder", "value", "result", "wrapAnsi", "columns", "line", "exec", "isActionKey", "key", "action", "settings", "diffLines", "a", "b", "aLines", "bLines", "diff", "i", "isCancel", "CANCEL_SYMBOL", "setRawMode", "input", "block", "stdin", "output", "stdout", "overwrite", "hideCursor", "rl", "readline", "clear", "data", "name", "sequence", "str", "cursor", "dx", "dy", "isWindows", "foregroundColorNames", "backgroundColorNames", "ansiStyles", "ESCAPES", "END_CODE", "ANSI_ESCAPE_BELL", "ANSI_CSI", "ANSI_OSC", "ANSI_SGR_TERMINATOR", "ANSI_ESCAPE_LINK", "wrapAnsiCode", "wrapAnsiHyperlink", "wordLengths", "wrapWord", "stringVisibleTrimSpacesRight", "actions", "v", "s", "Prompt", "_selectableGroups", "SelectPrompt", "eaw", "module", "x", "y", "stringToArray", "characters", "len", "text", "start", "end", "eawLen", "chars", "char", "charLen", "offset", "uri", "rows", "word", "isInsideEscape", "isInsideLinkEscape", "visible", "index", "characterLength", "words", "last", "returnValue", "escapeCode", "escapeUrl", "lengths", "rowLength", "remainingColumns", "breaksStartingThisLine", "row", "pre", "groups", "t", "trackValue", "__publicField", "render", "signal", "opts", "event", "params", "cb", "cbs", "cleanup", "subscriber", "resolve", "reject", "sink", "Writable", "chunk", "encoding", "done", "problem", "lines", "wrap", "frame", "diffLine", "erase", "newLines", "u", "isUnicodeSupported", "process", "unicode", "s", "S_STEP_ACTIVE", "S_STEP_CANCEL", "S_STEP_ERROR", "S_STEP_SUBMIT", "S_BAR_START", "S_BAR", "S_BAR_END", "S_RADIO_ACTIVE", "S_RADIO_INACTIVE", "S_CHECKBOX_ACTIVE", "S_CHECKBOX_SELECTED", "S_CHECKBOX_INACTIVE", "S_PASSWORD_MASK", "S_BAR_H", "S_CORNER_TOP_RIGHT", "S_CONNECT_LEFT", "S_CORNER_BOTTOM_RIGHT", "S_INFO", "S_SUCCESS", "S_WARN", "S_ERROR", "symbol", "limitOptions", "select", "cancel", "intro", "outro", "log", "prefix", "spinner", "c", "fallback", "state", "color", "params", "cursor", "options", "style", "paramMaxItems", "outputMaxItems", "maxItems", "slidingWindowLocation", "shouldRenderTopEllipsis", "shouldRenderBottomEllipsis", "option", "i", "arr", "isTopLimit", "isBottomLimit", "opts", "opt", "label", "SelectPrompt", "title", "item", "active", "message", "parts", "firstLine", "lines", "ln", "indicator", "frames", "delay", "isCI", "unblock", "loop", "isSpinnerActive", "_message", "_prevMessage", "_origin", "handleExit", "code", "msg", "stop", "errorEventHandler", "signalEventHandler", "registerHooks", "clearHooks", "clearPrevMessage", "prevLines", "erase", "parseMessage", "formatTimer", "origin", "duration", "min", "secs", "start", "block", "frameIndex", "indicatorTimer", "frame", "loadingDots", "step", "pc", "import_picocolors", "item", "rlsEvidence", "evidence", "check", "import_promises", "import_node_path", "escapeRegExp", "import_promises", "import_node_path", "import_node_fs", "import_promises", "import_node_path", "readExistingFile", "isFileNotFoundError", "import_promises", "import_node_path", "pc", "Y", "M", "provider", "import_node_path", "import_picocolors", "init_dist", "init_artifacts", "import_promises", "import_node_path", "import_node_path", "output", "output", "import_node_fs", "import_node_path", "import_node_fs", "import_promises", "import_node_path", "healDir", "patch", "result", "import_promises", "import_node_fs", "import_node_path", "healId", "import_promises", "import_node_path", "healId", "import_promises", "import_node_path", "p", "import_promises", "import_promises", "import_node_fs", "import_node_path", "item", "fileExists", "check", "import_promises", "import_node_path", "b", "j", "import_promises", "import_node_path", "import_promises", "import_node_path", "init_registry", "pc", "import_picocolors", "compact", "normalizeProviderKey", "item", "provider", "primaryGap", "item", "provider", "import_node_path", "isRecord", "import_promises", "import_node_path", "provider", "UPGRADE_URL", "import_node_fs", "import_node_os", "import_node_path", "provider", "check", "import_promises", "import_node_path", "init_artifacts"]
7
+ }