@viberaven/cli 0.1.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli.ts", "../src/config.ts", "../../../src/station/fetchUtils.ts", "../../../src/station/backendClient.ts", "../src/account.ts", "../src/auth.ts", "../../../src/station/fileScanner.ts", "../../../src/station/orchestrator.ts", "../../../src/station/engines.ts", "../../../src/station/sifgTemplates.ts", "../../../src/station/providerRegistry.ts", "../../../src/station/missionGraph.ts", "../../../src/station/promptBuilder.ts", "../../../src/station/productionConnections.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/runScan.ts", "../src/artifacts.ts", "../src/report/agentSummary.ts", "../src/report/reportStyles.ts", "../src/report/reportHtml.ts", "../src/openBrowser.ts", "../src/terminalSummary.ts"],
4
+ "sourcesContent": ["import { readFile } from 'node:fs/promises';\r\nimport { join } from 'node:path';\r\nimport {\r\n clearCredentials,\r\n getProjectArtifactsDir,\r\n loadCredentials,\r\n loadStackChoicesFile,\r\n resolveApiBaseUrl,\r\n saveStackChoicesFile\r\n} from './config';\r\nimport { requireCredentials, runDeviceLogin } from './auth';\r\nimport { fetchAccountMe, formatScanLimitMessage, formatUsageLine, syncCredentialsFromAccount } from './account';\r\nimport { runProjectScan } from './runScan';\r\nimport { writeScanArtifacts } from './artifacts';\r\nimport { openPathInBrowser } from './openBrowser';\r\nimport { printScanSummary } from './terminalSummary';\r\nimport type { CliScanArtifact } from './types';\r\nimport type { Gap } from '../../../src/station/types';\r\n\r\nconst VERSION = '0.1.0-beta.0';\r\n\r\nfunction printHelp(): void {\r\n console.log(`viberaven ${VERSION} \u2014 launch readiness for AI-built apps\r\n\r\nUsage:\r\n viberaven login [--api-url <url>]\r\n viberaven logout\r\n viberaven status\r\n viberaven scan [--open] [--json] [--api-url <url>] [path]\r\n viberaven prompt [--gap <id>] [--provider <key>] [--area <key>]\r\n viberaven stack set <area> <provider>\r\n viberaven stack clear <area>\r\n viberaven stack list\r\n\r\nAgent workflow (Claude Code / Codex):\r\n npx -y @viberaven/cli@beta scan --open\r\n Read .viberaven/agent-summary.md and fix the top gap, then scan again.\r\n\r\nEnvironment:\r\n VIBERAVEN_API_URL Managed API base URL (same server as the VS Code extension)\r\n`);\r\n}\r\n\r\nfunction parseArgs(argv: string[]): {\r\n command: string;\r\n flags: Record<string, string | boolean>;\r\n positional: string[];\r\n} {\r\n const flags: Record<string, string | boolean> = {};\r\n const positional: string[] = [];\r\n let command = '';\r\n\r\n for (let i = 0; i < argv.length; i += 1) {\r\n const arg = argv[i];\r\n if (arg === '--help' || arg === '-h') {\r\n flags.help = true;\r\n continue;\r\n }\r\n if (arg.startsWith('--')) {\r\n const key = arg.slice(2);\r\n const next = argv[i + 1];\r\n if (next && !next.startsWith('-')) {\r\n flags[key] = next;\r\n i += 1;\r\n } else {\r\n flags[key] = true;\r\n }\r\n continue;\r\n }\r\n if (!command) {\r\n command = arg;\r\n } else {\r\n positional.push(arg);\r\n }\r\n }\r\n\r\n return { command, flags, positional };\r\n}\r\n\r\nasync function loadLastArtifact(cwd: string): Promise<CliScanArtifact> {\r\n const path = join(getProjectArtifactsDir(cwd), 'last-scan.json');\r\n const raw = await readFile(path, 'utf-8');\r\n return JSON.parse(raw) as CliScanArtifact;\r\n}\r\n\r\nfunction pickGap(\r\n artifact: CliScanArtifact,\r\n options: { gapId?: string; provider?: string; area?: string }\r\n): 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 const rank = { critical: 0, warning: 1, info: 2 };\r\n return [...artifact.gaps].sort(\r\n (a, b) => rank[a.severity] - rank[b.severity] || a.title.localeCompare(b.title)\r\n )[0];\r\n}\r\n\r\nasync function cmdLogin(flags: Record<string, string | boolean>): Promise<void> {\r\n const apiBaseUrl = resolveApiBaseUrl(typeof flags['api-url'] === 'string' ? flags['api-url'] : undefined);\r\n await runDeviceLogin(apiBaseUrl);\r\n}\r\n\r\nasync function cmdLogout(): Promise<void> {\r\n await clearCredentials();\r\n console.log('Signed out.');\r\n}\r\n\r\nasync function cmdStatus(): Promise<number> {\r\n const creds = await loadCredentials();\r\n if (!creds?.accessToken) {\r\n console.log('Not signed in. Run: viberaven login');\r\n return 1;\r\n }\r\n try {\r\n const synced = await syncCredentialsFromAccount(creds);\r\n console.log(`Signed in: ${synced.email ?? '(email unknown)'}`);\r\n console.log(`Plan: ${synced.plan ?? 'unknown'}`);\r\n console.log(formatUsageLine(synced.account.usage));\r\n console.log(`API: ${synced.apiBaseUrl}`);\r\n return 0;\r\n } catch (error) {\r\n console.log(`Signed in (cached): ${creds.email ?? '(email unknown)'}`);\r\n console.log(`Plan: ${creds.plan ?? 'unknown'}`);\r\n console.log(`API: ${creds.apiBaseUrl}`);\r\n console.warn(error instanceof Error ? error.message : String(error));\r\n return 1;\r\n }\r\n}\r\n\r\nasync function cmdScan(\r\n flags: Record<string, string | boolean>,\r\n positional: string[]\r\n): Promise<number> {\r\n const workspacePath = positional[0] ? join(process.cwd(), positional[0]) : process.cwd();\r\n const apiBaseUrl = resolveApiBaseUrl(typeof flags['api-url'] === 'string' ? flags['api-url'] : undefined);\r\n\r\n let accessToken: string;\r\n try {\r\n ({ accessToken } = await requireCredentials(apiBaseUrl));\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 console.log(`Scanning ${workspacePath}\u2026`);\r\n const result = await runProjectScan({ workspacePath, accessToken, apiBaseUrl });\r\n\r\n if (!result.ok) {\r\n if (result.kind === 'scan_limit') {\r\n console.error(formatScanLimitMessage(result.upgradeUrl));\r\n try {\r\n const account = await fetchAccountMe(apiBaseUrl, accessToken);\r\n console.error(formatUsageLine(account.usage));\r\n } catch {\r\n // usage refresh is best-effort when blocked\r\n }\r\n return 2;\r\n }\r\n console.error(result.message);\r\n return 1;\r\n }\r\n\r\n const paths = await writeScanArtifacts({ artifact: result.artifact, cwd: workspacePath });\r\n\r\n if (flags.json) {\r\n console.log(JSON.stringify(result.artifact, null, 2));\r\n return 0;\r\n }\r\n\r\n printScanSummary(result.artifact, paths);\r\n if (result.artifact.usage) {\r\n console.log(formatUsageLine(result.artifact.usage));\r\n }\r\n\r\n if (flags.open) {\r\n try {\r\n await openPathInBrowser(paths.reportPath);\r\n } catch (error) {\r\n console.warn(error instanceof Error ? error.message : String(error));\r\n }\r\n }\r\n\r\n return 0;\r\n}\r\n\r\nasync function cmdPrompt(\r\n flags: Record<string, string | boolean>,\r\n positional: string[]\r\n): Promise<number> {\r\n const cwd = positional[0] ? join(process.cwd(), positional[0]) : process.cwd();\r\n let artifact: CliScanArtifact;\r\n try {\r\n artifact = await loadLastArtifact(cwd);\r\n } catch {\r\n console.error('No scan found. Run: viberaven scan');\r\n return 1;\r\n }\r\n\r\n const gap = pickGap(artifact, {\r\n gapId: typeof flags.gap === 'string' ? flags.gap : undefined,\r\n provider: typeof flags.provider === 'string' ? flags.provider : undefined,\r\n area: typeof flags.area === 'string' ? flags.area : undefined\r\n });\r\n\r\n if (!gap) {\r\n console.error('No matching gap. Run `viberaven scan` or pass --gap <id>.');\r\n return 1;\r\n }\r\n\r\n console.log(gap.copyPrompt);\r\n return 0;\r\n}\r\n\r\nconst STACK_AREAS = new Set(['database', 'auth', 'payments', 'deployment', 'monitoring', 'security']);\r\n\r\nasync function cmdStack(positional: string[]): Promise<number> {\r\n const cwd = process.cwd();\r\n const sub = positional[0];\r\n\r\n if (sub === 'list' || !sub) {\r\n const file = await loadStackChoicesFile(cwd);\r\n const entries = Object.entries(file.choices);\r\n if (entries.length === 0) {\r\n console.log('No provider overrides. Detection runs from repo evidence.');\r\n return 0;\r\n }\r\n for (const [area, choice] of entries) {\r\n console.log(`${area}: ${choice.provider}`);\r\n }\r\n return 0;\r\n }\r\n\r\n if (sub === 'set') {\r\n const area = positional[1];\r\n const provider = positional[2];\r\n if (!area || !provider) {\r\n console.error('Usage: viberaven stack set <area> <provider>');\r\n return 1;\r\n }\r\n if (!STACK_AREAS.has(area)) {\r\n console.error(`Unknown area \"${area}\". Valid: ${[...STACK_AREAS].join(', ')}`);\r\n return 1;\r\n }\r\n const file = await loadStackChoicesFile(cwd);\r\n file.choices[area] = { provider, selectedAt: new Date().toISOString() };\r\n await saveStackChoicesFile(cwd, file);\r\n console.log(`Set ${area} \u2192 ${provider}. Run \\`viberaven scan\\` to re-map.`);\r\n return 0;\r\n }\r\n\r\n if (sub === 'clear') {\r\n const area = positional[1];\r\n const file = await loadStackChoicesFile(cwd);\r\n if (area) {\r\n delete file.choices[area];\r\n } else {\r\n file.choices = {};\r\n }\r\n await saveStackChoicesFile(cwd, file);\r\n console.log(area ? `Cleared ${area}.` : 'Cleared all provider overrides.');\r\n return 0;\r\n }\r\n\r\n console.error(`Unknown stack subcommand \"${sub}\". Use set, clear, or list.`);\r\n return 1;\r\n}\r\n\r\nasync function main(): Promise<number> {\r\n const { command, flags, positional } = parseArgs(process.argv.slice(2));\r\n\r\n if (flags.help) {\r\n printHelp();\r\n return 0;\r\n }\r\n if (!command) {\r\n printHelp();\r\n return 1;\r\n }\r\n\r\n switch (command) {\r\n case 'login':\r\n await cmdLogin(flags);\r\n return 0;\r\n case 'logout':\r\n await cmdLogout();\r\n return 0;\r\n case 'status':\r\n return cmdStatus();\r\n case 'scan':\r\n return cmdScan(flags, positional);\r\n case 'prompt':\r\n return cmdPrompt(flags, positional);\r\n case 'stack':\r\n return cmdStack(positional);\r\n case '--version':\r\n case '-v':\r\n case 'version':\r\n console.log(VERSION);\r\n return 0;\r\n default:\r\n console.error(`Unknown command: ${command}`);\r\n printHelp();\r\n return 1;\r\n }\r\n}\r\n\r\nmain()\r\n .then((code) => {\r\n if (code !== 0) {\r\n process.exitCode = code;\r\n }\r\n })\r\n .catch((error) => {\r\n console.error(error instanceof Error ? error.message : String(error));\r\n process.exitCode = 1;\r\n });\r\n", "import { homedir } from 'node:os';\r\nimport { join } 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}\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\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\nexport async function loadCredentials(): Promise<CliCredentials | undefined> {\r\n try {\r\n const raw = await readFile(getCredentialsPath(), 'utf-8');\r\n const parsed = JSON.parse(raw) as Partial<CliCredentials>;\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: (parsed.apiBaseUrl?.trim() || DEFAULT_API_BASE_URL).replace(/\\/+$/, ''),\r\n email: typeof parsed.email === 'string' ? parsed.email : undefined,\r\n plan: typeof parsed.plan === 'string' ? parsed.plan : undefined\r\n };\r\n } catch {\r\n return undefined;\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", "import { normalizeBaseUrl } from '../../../src/station/backendClient';\r\nimport type { ManagedStationUsage } from '../../../shared/station';\r\nimport { saveCredentials, type CliCredentials } from './config';\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\nexport function formatUsageLine(usage: ManagedStationUsage): string {\r\n const periodLabel = usage.period === 'monthly' ? 'this month' : 'lifetime';\r\n return `Scans: ${usage.used}/${usage.limit} (${periodLabel}, ${usage.plan}) \u00B7 ${usage.remainingPrompts} remaining`;\r\n}\r\n\r\nexport function formatScanLimitMessage(upgradeUrl: string): string {\r\n return [\r\n '',\r\n 'Free scan limit reached. Upgrade to Pro to continue.',\r\n 'Your last scan artifacts are unchanged if you already ran a scan in this repo.',\r\n '',\r\n `Upgrade & account: ${upgradeUrl}`,\r\n ''\r\n ].join('\\n');\r\n}\r\n", "import { pollManagedSignIn, startManagedSignIn } from '../../../src/station/backendClient';\r\nimport { formatUsageLine, syncCredentialsFromAccount } from './account';\r\nimport { loadCredentials, resolveApiBaseUrl, saveCredentials } from './config';\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}\\n`);\r\n console.log('Waiting for approval in the browser\u2026\\n');\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('Sign-in expired. Run `viberaven login` again.');\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 usage = synced.account?.usage;\r\n console.log(`Signed in as ${email} (${synced.plan ?? 'unknown'}).`);\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.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('Sign-in timed out. Run `viberaven login` again.');\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('Not signed in. Run `viberaven login` first (or set credentials via device flow).');\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 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.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 { 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 { buildMissionGraph } from './missionGraph';\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 type { ManagedStationRequest, ManagedStationResponse } from '../../shared/station';\r\nimport type { ProductionConnectionChoices } from './productionConnections';\r\nimport type { SifgGraph } from './sifgTypes';\r\nimport type {\r\n MissionGraph,\r\n ModelStationOutput,\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}\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 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 missionGraph = buildMissionGraph({\r\n stackWiring,\r\n repositoryEvidence,\r\n staticInfrastructureFlowGraph\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 {\r\n kind: 'scan_limit_reached',\r\n upgradeUrl: error.upgradeUrl ?? 'https://viberice.com/account'\r\n };\r\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 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 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\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 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", "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 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', {\r\n docsUrl: 'https://authjs.dev'\r\n }),\r\n provider('neon', 'Neon', ['neon'], ['database'], ['database'], 'neon', {\r\n docsUrl: 'https://neon.tech/docs',\r\n dashboardUrl: 'https://console.neon.tech',\r\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', {\r\n docsUrl: 'https://developer.paddle.com',\r\n dashboardUrl: 'https://vendors.paddle.com',\r\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 },\r\n verification: { supportsReadOnly: false }\r\n }),\r\n provider('vercel', 'Vercel', ['vercel'], ['deployment'], ['deployment'], 'vercel', {\r\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'], [], 'netlify', {\r\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 }),\r\n provider('aws', 'AWS', ['aws'], ['deployment'], [], 'aws', {\r\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', {\r\n docsUrl: 'https://docs.logrocket.com',\r\n dashboardUrl: 'https://app.logrocket.com'\r\n }),\r\n provider('playwright', 'Playwright', ['playwright', 'playwrighttest'], ['testing'], [], 'playwright', {\r\n docsUrl: 'https://playwright.dev/docs/intro',\r\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', 'cloudflare'], ['security'], ['security'], 'bot-protection', {\r\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\r\n .flatMap((area) => sifgTemplatesForRegistryProviderArea(providerKey, area))\r\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 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';\r\nimport type { SifgGraph, SifgLeak, SifgPipeline } from './sifgTypes';\r\n\r\ntype BuildMissionGraphInput = {\r\n stackWiring: StackWiringSummary;\r\n repositoryEvidence: RepositoryEvidenceSummary;\r\n staticInfrastructureFlowGraph?: SifgGraph;\r\n};\r\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 return {\r\n areas,\r\n byArea,\r\n byProvider,\r\n repositoryEvidence: input.repositoryEvidence,\r\n ...(input.staticInfrastructureFlowGraph\r\n ? { staticInfrastructureFlowGraph: input.staticInfrastructureFlowGraph }\r\n : {})\r\n };\r\n}\r\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 {\r\n key: summary.key,\r\n provider: summary.provider,\r\n providerLabel: summary.providerLabel,\r\n area: summary.area,\r\n promptSubject: summary.promptSubject,\r\n readinessPercent: summary.readinessPercent,\r\n checks\r\n };\r\n}\r\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 {\r\n key,\r\n label: AREA_LABELS[key],\r\n readinessPercent: Math.round((passed / Math.max(actionableChecks.length, 1)) * 100),\r\n criticalCount: missing,\r\n providerMissions: missions\r\n };\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 {\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\ntype ProviderDetectionRule = {\r\n area: ProductionConnectionArea;\r\n provider: ProductionConnectionProvider;\r\n label: string;\r\n packages?: RegExp[];\r\n env?: string[];\r\n paths?: RegExp[];\r\n imports?: string[];\r\n docs?: string[];\r\n content?: Array<{ 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\nconst PROVIDER_RULES: ProviderDetectionRule[] = [\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: '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: [/(^|\\/)auth\\.[jt]s$/, /api\\/auth\\//],\r\n imports: ['next-auth', '@auth/core', '@auth/nextjs'],\r\n docs: ['auth.js', 'nextauth', 'next-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: '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: '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) => pattern.test(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) => pattern.test(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 (item.pattern.test(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 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 '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 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 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 }\r\n}\r\n\r\nfunction buildRepoFixPrompt(input: BuildContextualPromptInput): ContextualPrompt {\r\n const sifgSections = input.sifgLeaks?.map(buildSifgFixPromptSection) ?? [];\r\n return {\r\n kind: 'repo-fix',\r\n title: `Repo fix: ${input.promptSubject}`,\r\n body: input.emptyBody ? '' : compactLines([\r\n `Automate ${input.promptSubject} production fixes safely.`,\r\n readinessLine(input),\r\n '',\r\n ...sectionLines([...sifgSections, ...(input.sections ?? [])]),\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 'Rules:',\r\n '- Work only inside the local repository.',\r\n '- Do not open external dashboards.',\r\n '- Do not claim provider dashboard checks are complete.',\r\n '- Do not claim dashboard checks are complete from repo edits.',\r\n '- Do not print, request, store, or invent provider secrets.',\r\n '- Use placeholder env names only.',\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 ...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 '- Use only read-only MCP calls if already configured and authenticated by the IDE.',\r\n '- Never store OAuth tokens, API keys, or MCP credentials.',\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', '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 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 sectionLines(sections: ContextualPromptSection[] | undefined): string[] {\r\n if (!sections || sections.length === 0) {\r\n return [];\r\n }\r\n return sections.flatMap((section) => [\r\n section.heading,\r\n ...section.lines.map((line) => `- ${line}`),\r\n ''\r\n ]);\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 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),\r\n analyzeClerkAuth(ctx),\r\n analyzeAuthJsAuth(ctx),\r\n analyzeSupabaseAuth(ctx),\r\n supabaseDatabase,\r\n analyzeNeonDatabase(ctx),\r\n analyzeTursoDatabase(ctx),\r\n analyzeMongoDatabase(ctx),\r\n analyzePlanetScaleDatabase(ctx),\r\n analyzeStripePayments(ctx),\r\n analyzePaddlePayments(ctx),\r\n analyzeVercelDeployment(ctx),\r\n analyzeNetlifyDeployment(ctx),\r\n analyzeAwsDeployment(ctx),\r\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 {\r\n return summarize({\r\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 });\r\n}\r\n\r\nfunction analyzeSupabaseAuth(ctx: StackContext): StackWiringProviderSummary {\r\n return summarize({\r\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 {\r\n return summarize({\r\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 });\r\n}\r\n\r\nfunction analyzeNeonDatabase(ctx: StackContext): StackWiringProviderSummary {\r\n return databaseSummary(ctx, {\r\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 {\r\n const base = deploymentSummary(ctx, {\r\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 });\r\n}\r\n\r\nfunction analyzeAwsDeployment(ctx: StackContext): StackWiringProviderSummary {\r\n const base = deploymentSummary(ctx, {\r\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 { 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 { productionProvidersByArea, providerLabel } from '../../../src/station/providerRegistry';\r\nimport type { CliProviderOption, 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 buildProviderOptions(): Record<string, CliProviderOption[]> {\r\n const byArea = productionProvidersByArea();\r\n const options: Record<string, CliProviderOption[]> = {};\r\n for (const [area, providers] of Object.entries(byArea)) {\r\n options[area] = providers.map((provider) => ({ provider, label: providerLabel(provider) }));\r\n }\r\n return options;\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 return {\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 providerRegistry: result.providerRegistry,\r\n verificationSummary: result.verificationSummary,\r\n productionCorePercent: computeProductionCorePercent(result.missionGraph),\r\n providerOptions: buildProviderOptions(),\r\n selectedProviders,\r\n usage: result.usage\r\n };\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 = toArtifact(workspacePath, result as StationRunSuccess, selectedProviders);\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 { mkdir, writeFile } from 'node:fs/promises';\r\nimport { join } from 'node:path';\r\nimport type { CliScanArtifact } from './types';\r\nimport { generateAgentSummary } from './report/agentSummary';\r\nimport { generateReportHtml } from './report/reportHtml';\r\nimport { getProjectArtifactsDir } from './config';\r\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 summaryPath: string;\r\n reportPath: string;\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 summaryPath = join(dir, 'agent-summary.md');\r\n const reportPath = join(dir, 'report.html');\r\n\r\n const json = `${JSON.stringify(options.artifact, null, 2)}\\n`;\r\n const summary = generateAgentSummary(options.artifact);\r\n const html = generateReportHtml(options.artifact);\r\n\r\n await writeFile(jsonPath, json, 'utf-8');\r\n await writeFile(summaryPath, summary, 'utf-8');\r\n await writeFile(reportPath, html, 'utf-8');\r\n\r\n return { dir, jsonPath, summaryPath, reportPath };\r\n}\r\n", "import type { CliScanArtifact } from '../types';\r\nimport type { Gap } from '../../../../src/station/types';\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 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('## Top launch gaps (model)');\r\n if (topGaps.length === 0) {\r\n lines.push('_No model gaps returned \u2014 rely on mission map checks above._');\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(` - Prompt: \\`viberaven prompt --gap ${gap.id}\\``);\r\n });\r\n }\r\n\r\n lines.push('');\r\n lines.push('## Agent workflow');\r\n lines.push('1. Pick the highest-severity gap unless the user names an area or provider.');\r\n lines.push('2. Run `viberaven prompt --gap <id>` (or read `copyPrompt` from `last-scan.json`).');\r\n lines.push('3. Implement the fix in the repo.');\r\n lines.push('4. Run `npx -y @viberaven/cli@beta scan` again to verify readiness improved.');\r\n lines.push('5. Tell the user to open `.viberaven/report.html` for the visual mission map.');\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", "// Vendored from media/station.css (studio map visual language) so the CLI\r\n// launch report matches the VibeRaven extension map. Kept standalone \u2014 no\r\n// VS Code webview variables, no plan gating.\r\nexport const REPORT_STYLES = `\r\n:root {\r\n color-scheme: dark;\r\n --vr-gold: rgba(232, 189, 98, 0.92);\r\n --vr-bg: #050608;\r\n --vr-panel: #0c0f12;\r\n --vr-line: rgba(255, 255, 255, 0.1);\r\n --vr-text: rgba(245, 242, 235, 0.96);\r\n --vr-muted: rgba(245, 242, 235, 0.62);\r\n --vr-ease-out: cubic-bezier(0.22, 1, 0.36, 1);\r\n}\r\n* { box-sizing: border-box; }\r\nbody {\r\n margin: 0;\r\n font-family: \"Inter\", \"Segoe UI\", system-ui, sans-serif;\r\n background:\r\n radial-gradient(circle at 50% -10%, rgba(232, 189, 98, 0.08), transparent 45%),\r\n var(--vr-bg);\r\n color: var(--vr-text);\r\n min-height: 100vh;\r\n}\r\n.report-header {\r\n display: flex; justify-content: space-between; align-items: center;\r\n gap: 16px; padding: 18px 26px; border-bottom: 1px solid var(--vr-line);\r\n}\r\n.report-header h1 { margin: 0; font-size: 1.05rem; font-weight: 800; letter-spacing: 0.04em; }\r\n.report-header p { margin: 4px 0 0; color: var(--vr-muted); font-size: 0.8rem; }\r\n.report-score {\r\n padding: 6px 14px; border-radius: 999px; border: 1px solid rgba(232, 189, 98, 0.4);\r\n color: var(--vr-gold); font-size: 0.82rem; font-weight: 800; letter-spacing: 0.04em;\r\n}\r\n.report-workspace {\r\n display: grid; grid-template-columns: minmax(0, 1fr) minmax(320px, 420px);\r\n gap: 18px; padding: 22px; align-items: start;\r\n}\r\n@media (max-width: 920px) { .report-workspace { grid-template-columns: 1fr; } }\r\n\r\n.studio-system-map {\r\n position: relative; min-height: 600px; display: grid;\r\n grid-template-rows: minmax(560px, 1fr); gap: 14px; padding: 14px;\r\n border-radius: 22px; border: 1px solid rgba(232, 189, 98, 0.2);\r\n background:\r\n radial-gradient(circle at 50% 48%, rgba(232, 189, 98, 0.14), transparent 18%),\r\n radial-gradient(circle at 20% 20%, rgba(91, 205, 194, 0.08), transparent 25%),\r\n radial-gradient(circle at 80% 76%, rgba(248, 113, 113, 0.06), transparent 24%),\r\n linear-gradient(160deg, rgba(16, 16, 18, 0.98), rgba(5, 6, 8, 0.99));\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.07), 0 18px 48px rgba(0, 0, 0, 0.42);\r\n overflow: hidden;\r\n}\r\n.studio-node-layer {\r\n position: relative; min-height: 560px; max-width: 680px;\r\n width: min(100%, 680px); justify-self: center; overflow: hidden; border-radius: 16px;\r\n}\r\n.studio-connector-layer {\r\n position: absolute; inset: 32px; pointer-events: none; opacity: 0.5;\r\n background:\r\n radial-gradient(circle at 50% 50%, transparent 0 88px, rgba(232, 189, 98, 0.26) 89px 90px, transparent 91px),\r\n linear-gradient(90deg, transparent 8%, rgba(232, 189, 98, 0.18) 49%, rgba(232, 189, 98, 0.18) 51%, transparent 92%),\r\n linear-gradient(180deg, transparent 10%, rgba(232, 189, 98, 0.14) 49%, rgba(232, 189, 98, 0.14) 51%, transparent 90%);\r\n mask-image: radial-gradient(circle at center, black, transparent 76%);\r\n}\r\n.studio-core-node {\r\n position: absolute; left: 50%; top: 50%; z-index: 3; width: 132px; height: 132px;\r\n transform: translate(-50%, -50%); display: grid; place-items: center; align-content: center;\r\n gap: 5px; border-radius: 999px; border: 1px solid rgba(232, 189, 98, 0.48);\r\n background:\r\n radial-gradient(circle at 50% 22%, rgba(255, 233, 166, 0.24), transparent 42%),\r\n linear-gradient(180deg, rgba(42, 32, 13, 0.98), rgba(10, 10, 12, 0.99));\r\n color: rgba(255, 248, 226, 0.98); text-align: center;\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12), 0 18px 44px rgba(0, 0, 0, 0.48), 0 0 0 10px rgba(232, 189, 98, 0.05);\r\n}\r\n.studio-core-node span { color: var(--vr-gold); font-size: 11px; font-weight: 900; letter-spacing: 0.12em; line-height: 1; }\r\n.studio-core-node strong { font-size: 30px; font-weight: 900; line-height: 1; }\r\n.studio-core-node small { color: rgba(245, 242, 235, 0.66); font-size: 10px; font-weight: 760; letter-spacing: 0.08em; text-transform: uppercase; }\r\n\r\n.studio-node {\r\n position: absolute; z-index: 2; width: 96px; height: 96px; display: grid;\r\n grid-template-columns: 10px minmax(0, 1fr); align-items: center; align-content: center;\r\n gap: 2px 6px; padding: 12px 10px; border-radius: 999px;\r\n border: 1px solid rgba(255, 255, 255, 0.13);\r\n background: linear-gradient(160deg, rgba(22, 23, 26, 0.96), rgba(8, 9, 11, 0.99));\r\n color: var(--vr-text); font: inherit; text-align: left; cursor: pointer;\r\n transform: translate(-50%, -50%);\r\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.07), 0 12px 28px rgba(0, 0, 0, 0.34);\r\n transition: transform 170ms var(--vr-ease-out), border-color 150ms ease, box-shadow 150ms ease;\r\n}\r\n.studio-node:hover { transform: translate(-50%, calc(-50% - 2px)); border-color: rgba(232, 189, 98, 0.34); }\r\n.studio-node:focus-visible { outline: 2px solid rgba(232, 189, 98, 0.78); outline-offset: 3px; }\r\n.studio-node--selected {\r\n border-color: rgba(232, 189, 98, 0.66);\r\n background:\r\n radial-gradient(circle at 20% 10%, rgba(232, 189, 98, 0.18), transparent 42%),\r\n linear-gradient(160deg, rgba(30, 25, 16, 0.98), rgba(9, 9, 11, 0.99));\r\n box-shadow: inset 0 1px 0 rgba(255, 248, 226, 0.1), 0 0 0 1px rgba(232, 189, 98, 0.16), 0 16px 36px rgba(0, 0, 0, 0.4);\r\n}\r\n.studio-node--critical { border-color: rgba(248, 113, 113, 0.58); }\r\n.studio-node--warning { border-color: rgba(245, 158, 11, 0.5); }\r\n.studio-node--in-project {\r\n border-color: rgba(93, 240, 175, 0.66);\r\n background:\r\n radial-gradient(circle at 50% 0%, rgba(93, 240, 175, 0.18), transparent 48%),\r\n linear-gradient(160deg, rgba(7, 34, 28, 0.92), rgba(4, 10, 14, 0.98));\r\n}\r\n.studio-node__dot { grid-row: 1 / 3; width: 9px; height: 9px; border-radius: 999px; background: #d4af37; box-shadow: 0 0 0 4px rgba(212, 175, 55, 0.12); }\r\n.studio-node--critical .studio-node__dot { background: #ef6f6f; box-shadow: 0 0 0 4px rgba(239, 111, 111, 0.13); }\r\n.studio-node--warning .studio-node__dot { background: #f0b94e; box-shadow: 0 0 0 4px rgba(240, 185, 78, 0.13); }\r\n.studio-node__title, .studio-node__provider, .studio-node__meta { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n.studio-node__title { color: rgba(255, 253, 247, 0.98); font-size: 10.5px; font-weight: 860; line-height: 1.05; }\r\n.studio-node__provider { color: rgba(245, 242, 235, 0.64); font-size: 9px; font-weight: 700; line-height: 1.05; }\r\n.studio-node__meta { grid-column: 2; color: var(--vr-gold); font-size: 9px; font-weight: 850; line-height: 1.05; }\r\n.studio-node--critical .studio-node__meta { color: #ef9a9a; }\r\n\r\n.studio-node--appFlow { left: 22%; top: 18%; }\r\n.studio-node--frontend { left: 50%; top: 12%; }\r\n.studio-node--backend { left: 78%; top: 18%; }\r\n.studio-node--auth { left: 14%; top: 38%; }\r\n.studio-node--database { left: 50%; top: 32%; }\r\n.studio-node--payments { left: 86%; top: 40%; }\r\n.studio-node--deployment { left: 18%; top: 64%; }\r\n.studio-node--monitoring { left: 50%; top: 68%; }\r\n.studio-node--security { left: 82%; top: 64%; }\r\n.studio-node--testing { left: 28%; top: 84%; }\r\n.studio-node--landing { left: 50%; top: 88%; }\r\n.studio-node--errorHandling { left: 72%; top: 84%; }\r\n\r\n.studio-setup-panel {\r\n border: 1px solid var(--vr-line); border-radius: 18px; background: var(--vr-panel);\r\n padding: 20px 20px 26px; position: sticky; top: 22px; max-height: calc(100vh - 44px); overflow: auto;\r\n}\r\n.studio-setup-panel__eyebrow { margin: 0; font-size: 0.66rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--vr-muted); }\r\n.studio-setup-panel__title { margin: 6px 0 0; font-size: 1.05rem; font-weight: 800; }\r\n.studio-setup-panel__hint { margin: 6px 0 0; color: var(--vr-muted); font-size: 0.82rem; line-height: 1.5; }\r\n.panel-section { margin-top: 18px; }\r\n.panel-section h3 { margin: 0 0 10px; font-size: 0.7rem; letter-spacing: 0.12em; text-transform: uppercase; color: var(--vr-muted); }\r\n.provider-switch { display: flex; flex-wrap: wrap; gap: 6px; }\r\n.provider-chip {\r\n border: 1px solid var(--vr-line); background: rgba(255,255,255,0.02); color: var(--vr-text);\r\n border-radius: 999px; padding: 5px 11px; font-size: 0.76rem; cursor: pointer; transition: border-color 0.15s;\r\n}\r\n.provider-chip:hover { border-color: rgba(232, 189, 98, 0.45); }\r\n.provider-chip--active { border-color: rgba(93, 240, 175, 0.66); color: rgba(111, 255, 190, 0.96); background: rgba(93, 240, 175, 0.08); }\r\n.switch-hint { margin-top: 8px; font-size: 0.75rem; color: var(--vr-muted); }\r\n.switch-hint code { color: var(--vr-gold); }\r\n.check, .gap-card { border: 1px solid var(--vr-line); border-radius: 12px; padding: 10px 12px; margin-bottom: 8px; background: rgba(0,0,0,0.22); }\r\n.check strong, .gap-card strong { display: block; font-size: 0.86rem; }\r\n.check .status, .gap-card p { margin: 4px 0 0; font-size: 0.78rem; color: var(--vr-muted); line-height: 1.45; }\r\n.status-passed { color: rgba(111, 255, 190, 0.96); }\r\n.status-missing, .status-failed { color: #ef9a9a; }\r\n.status-needs-connection { color: #f0b94e; }\r\n.copy-btn { margin-top: 8px; border: 1px solid var(--vr-line); background: transparent; color: var(--vr-text); border-radius: 8px; padding: 6px 10px; font-size: 0.76rem; cursor: pointer; }\r\n.copy-btn:hover { border-color: rgba(232, 189, 98, 0.45); }\r\n`;\r\n", "import type { CliScanArtifact } from '../types';\r\nimport type { MissionArea } from '../../../../src/station/types';\r\nimport { REPORT_STYLES } from './reportStyles';\r\n\r\nfunction escapeHtml(value: string): string {\r\n return value\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;');\r\n}\r\n\r\n/** Fixed 12-section order + labels, matching the extension Mission Map. */\r\nconst CATEGORY_META: Array<{ key: string; label: string }> = [\r\n { key: 'appFlow', label: 'App Flow' },\r\n { key: 'frontend', label: 'Frontend' },\r\n { key: 'backend', label: 'Backend / API' },\r\n { key: 'auth', label: 'Auth' },\r\n { key: 'database', label: 'Database' },\r\n { key: 'payments', label: 'Payments' },\r\n { key: 'deployment', label: 'Deployment' },\r\n { key: 'monitoring', label: 'Monitoring' },\r\n { key: 'security', label: 'Security' },\r\n { key: 'testing', label: 'Testing' },\r\n { key: 'landing', label: 'Landing / Onboarding' },\r\n { key: 'errorHandling', label: 'Error Handling' }\r\n];\r\n\r\nfunction gapCountForArea(artifact: CliScanArtifact, areaKey: string): number {\r\n return artifact.gaps.filter((g) => g.primaryMapCategory === areaKey).length;\r\n}\r\n\r\nfunction openChecksForArea(area: MissionArea | undefined): number {\r\n if (!area) {\r\n return 0;\r\n }\r\n return area.providerMissions\r\n .flatMap((m) => m.checks)\r\n .filter((c) => c.status === 'missing' || c.status === 'failed' || c.status === 'needs-connection').length;\r\n}\r\n\r\nfunction buildNodeHtml(artifact: CliScanArtifact, meta: { key: string; label: string }): string {\r\n const area = (artifact.missionGraph.areas ?? []).find((a) => a.key === meta.key);\r\n const mission = area?.providerMissions[0];\r\n const provider = mission?.providerLabel ?? '\u2014';\r\n const readiness = mission?.readinessPercent ?? area?.readinessPercent ?? 0;\r\n const openChecks = openChecksForArea(area);\r\n const modelGaps = gapCountForArea(artifact, meta.key);\r\n\r\n const stateClass =\r\n modelGaps > 0\r\n ? ' studio-node--critical'\r\n : openChecks > 0\r\n ? ' studio-node--warning'\r\n : area\r\n ? ' studio-node--in-project'\r\n : '';\r\n\r\n const meta1 =\r\n modelGaps > 0\r\n ? `GAP ${modelGaps}`\r\n : openChecks > 0\r\n ? `${openChecks} stack fix${openChecks === 1 ? '' : 'es'}`\r\n : `${readiness}% health`;\r\n\r\n return `<button type=\"button\" class=\"studio-node studio-node--${escapeHtml(meta.key)}${stateClass}\" data-area-key=\"${escapeHtml(meta.key)}\" aria-label=\"${escapeHtml(meta.label)}\">\r\n <span class=\"studio-node__dot\" aria-hidden=\"true\"></span>\r\n <span class=\"studio-node__title\">${escapeHtml(meta.label)}</span>\r\n <span class=\"studio-node__provider\">${escapeHtml(provider)}</span>\r\n <span class=\"studio-node__meta\">${escapeHtml(meta1)}</span>\r\n </button>`;\r\n}\r\n\r\nexport function generateReportHtml(artifact: CliScanArtifact): string {\r\n const dataJson = JSON.stringify(artifact).replace(/</g, '\\\\u003c');\r\n const nodesHtml = CATEGORY_META.map((meta) => buildNodeHtml(artifact, meta)).join('\\n');\r\n\r\n return `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n <meta charset=\"utf-8\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\r\n <title>VibeRaven Launch Report</title>\r\n <style>${REPORT_STYLES}</style>\r\n</head>\r\n<body>\r\n <header class=\"report-header\">\r\n <div>\r\n <h1>VIBERAVEN \u00B7 LAUNCH REPORT</h1>\r\n <p>${escapeHtml(artifact.workspacePath)} \u00B7 ${escapeHtml(artifact.scannedAt)}</p>\r\n </div>\r\n <div class=\"report-score\">Model ${artifact.score} \u00B7 ${escapeHtml(artifact.scoreLabel)}</div>\r\n </header>\r\n <div class=\"report-workspace\">\r\n <section class=\"studio-system-map\" aria-label=\"Production system map\">\r\n <div class=\"studio-node-layer\">\r\n <div class=\"studio-connector-layer\" aria-hidden=\"true\"></div>\r\n <div class=\"studio-core-node\" aria-label=\"Production core\">\r\n <span>VIBERAVEN</span>\r\n <strong>${artifact.productionCorePercent}%</strong>\r\n <small>Production core</small>\r\n </div>\r\n ${nodesHtml}\r\n </div>\r\n </section>\r\n <aside class=\"studio-setup-panel\" id=\"detail-panel\" aria-live=\"polite\">\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 <p class=\"studio-setup-panel__hint\">${escapeHtml(artifact.summary || 'Click any provider node to see stack checks, launch gaps, and switch providers.')}</p>\r\n </aside>\r\n </div>\r\n <script type=\"application/json\" id=\"scan-data\">${dataJson}</script>\r\n <script>${CLIENT_SCRIPT}</script>\r\n</body>\r\n</html>`;\r\n}\r\n\r\nconst CLIENT_SCRIPT = `\r\n(function () {\r\n var artifact = JSON.parse(document.getElementById('scan-data').textContent);\r\n var panel = document.getElementById('detail-panel');\r\n var areas = (artifact.missionGraph && artifact.missionGraph.areas) || [];\r\n var gaps = artifact.gaps || [];\r\n var providerOptions = artifact.providerOptions || {};\r\n var selectedProviders = artifact.selectedProviders || {};\r\n var LABELS = {\r\n appFlow: 'App Flow', frontend: 'Frontend', backend: 'Backend / API', auth: 'Auth',\r\n database: 'Database', payments: 'Payments', deployment: 'Deployment', monitoring: 'Monitoring',\r\n security: 'Security', testing: 'Testing', landing: 'Landing / Onboarding', errorHandling: 'Error Handling'\r\n };\r\n\r\n function esc(s) {\r\n return String(s == null ? '' : s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\r\n }\r\n function statusClass(status) {\r\n if (status === 'passed') return 'status-passed';\r\n if (status === 'needs-connection') return 'status-needs-connection';\r\n return 'status-missing';\r\n }\r\n\r\n function providerSwitchHtml(areaKey, mission) {\r\n var options = providerOptions[areaKey];\r\n if (!options || !options.length) return '';\r\n var current = selectedProviders[areaKey] || (mission ? (mission.provider || '') : '');\r\n var chips = options.map(function (opt) {\r\n var active = String(opt.provider).toLowerCase() === String(current).toLowerCase();\r\n return '<button type=\"button\" class=\"provider-chip' + (active ? ' provider-chip--active' : '') +\r\n '\" data-switch-area=\"' + esc(areaKey) + '\" data-switch-provider=\"' + esc(opt.provider) + '\">' + esc(opt.label) + '</button>';\r\n }).join('');\r\n return '<div class=\"panel-section\"><h3>Switch provider</h3><div class=\"provider-switch\">' + chips +\r\n '</div><p class=\"switch-hint\" id=\"switch-hint\">Pick a provider, then rescan to re-map this area.</p></div>';\r\n }\r\n\r\n function render(areaKey) {\r\n var area = areas.find(function (a) { return a.key === areaKey; });\r\n document.querySelectorAll('.studio-node').forEach(function (n) {\r\n n.classList.toggle('studio-node--selected', n.getAttribute('data-area-key') === areaKey);\r\n });\r\n var label = (area && area.label) || LABELS[areaKey] || areaKey;\r\n var missions = (area && area.providerMissions) || [];\r\n var mission = missions[0];\r\n var areaGaps = gaps.filter(function (g) { return g.primaryMapCategory === areaKey; });\r\n\r\n var checksHtml = missions.flatMap(function (m) {\r\n return (m.checks || []).map(function (c) {\r\n var ev = (c.evidence && c.evidence[0]) ? c.evidence[0] : (c.promptHint || '');\r\n return '<div class=\"check\"><strong>' + esc(c.label) + '</strong>' +\r\n '<div class=\"status ' + statusClass(c.status) + '\">' + esc(c.status) + '</div>' +\r\n (ev ? '<div class=\"status\">' + esc(ev) + '</div>' : '') + '</div>';\r\n });\r\n }).join('');\r\n\r\n var gapsHtml = areaGaps.map(function (g) {\r\n return '<div class=\"gap-card\"><strong>' + esc(g.title) + '</strong><p>' + esc(g.detail) +\r\n '</p><button type=\"button\" class=\"copy-btn\" data-copy-gap=\"' + esc(g.id) + '\">Copy agent prompt</button></div>';\r\n }).join('');\r\n\r\n var head =\r\n '<p class=\"studio-setup-panel__eyebrow\">' + esc(areaKey) + '</p>' +\r\n '<p class=\"studio-setup-panel__title\">' + esc(label) + '</p>' +\r\n '<p class=\"studio-setup-panel__hint\">' +\r\n (missions.map(function (m) { return esc(m.providerLabel) + ' \u00B7 ' + m.readinessPercent + '% repo readiness'; }).join(' \u00B7 ') || 'No provider detected for this area.') +\r\n '</p>';\r\n\r\n panel.innerHTML = head +\r\n providerSwitchHtml(areaKey, mission) +\r\n '<div class=\"panel-section\"><h3>Stack checks</h3>' + (checksHtml || '<p class=\"switch-hint\">No checks for this area.</p>') + '</div>' +\r\n '<div class=\"panel-section\"><h3>Launch gaps</h3>' + (gapsHtml || '<p class=\"switch-hint\">No model gaps tagged here.</p>') + '</div>';\r\n\r\n panel.querySelectorAll('[data-copy-gap]').forEach(function (btn) {\r\n btn.addEventListener('click', function () {\r\n var gap = gaps.find(function (g) { return g.id === btn.getAttribute('data-copy-gap'); });\r\n if (!gap) return;\r\n navigator.clipboard.writeText(gap.copyPrompt).then(function () {\r\n btn.textContent = 'Copied';\r\n setTimeout(function () { btn.textContent = 'Copy agent prompt'; }, 1200);\r\n });\r\n });\r\n });\r\n\r\n panel.querySelectorAll('[data-switch-provider]').forEach(function (btn) {\r\n btn.addEventListener('click', function () {\r\n var a = btn.getAttribute('data-switch-area');\r\n var p = btn.getAttribute('data-switch-provider');\r\n var cmd = 'viberaven stack set ' + a + ' ' + p + ' && viberaven scan --open';\r\n navigator.clipboard.writeText(cmd);\r\n var hint = document.getElementById('switch-hint');\r\n if (hint) hint.innerHTML = 'Copied: <code>' + esc(cmd) + '</code> \u2014 run it (or ask your agent) to re-map this area.';\r\n panel.querySelectorAll('[data-switch-area=\"' + a + '\"]').forEach(function (c) {\r\n c.classList.toggle('provider-chip--active', c === btn);\r\n });\r\n });\r\n });\r\n }\r\n\r\n document.querySelectorAll('.studio-node').forEach(function (n) {\r\n n.addEventListener('click', function () { render(n.getAttribute('data-area-key')); });\r\n });\r\n if (areas[0]) render(areas[0].key);\r\n})();\r\n`;\r\n", "import { spawn } from 'node:child_process';\r\n\r\nexport async function openPathInBrowser(filePath: string): Promise<void> {\r\n const absolute = filePath;\r\n let command: string;\r\n let args: string[];\r\n\r\n if (process.platform === 'win32') {\r\n command = 'cmd';\r\n args = ['/c', 'start', '', absolute];\r\n } else if (process.platform === 'darwin') {\r\n command = 'open';\r\n args = [absolute];\r\n } else {\r\n command = 'xdg-open';\r\n args = [absolute];\r\n }\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const child = spawn(command, args, { stdio: 'ignore', shell: process.platform === 'win32' });\r\n child.on('error', reject);\r\n child.on('exit', (code) => {\r\n if (code === 0) {\r\n resolve();\r\n } else {\r\n reject(new Error(`Could not open browser (exit ${code ?? 'unknown'}). Open manually: ${absolute}`));\r\n }\r\n });\r\n });\r\n}\r\n", "import type { CliScanArtifact } from './types';\r\n\r\nexport function printScanSummary(\r\n artifact: CliScanArtifact,\r\n paths: { reportPath: string; jsonPath: string; summaryPath: string }\r\n): void {\r\n console.log('');\r\n console.log(`VibeRaven \u00B7 Production core ${artifact.productionCorePercent}% \u00B7 ${artifact.gaps.length} gap(s)`);\r\n console.log(`Score ${artifact.score} \u00B7 ${artifact.scoreLabel}`);\r\n console.log('');\r\n\r\n for (const area of artifact.missionGraph.areas ?? []) {\r\n const mission = area.providerMissions[0];\r\n if (!mission) {\r\n continue;\r\n }\r\n const open = mission.checks.filter(\r\n (c) => c.status === 'missing' || c.status === 'failed' || c.status === 'needs-connection'\r\n ).length;\r\n const modelGaps = artifact.gaps.filter((g) => g.primaryMapCategory === area.key).length;\r\n const gapTag = modelGaps > 0 ? ` GAP ${modelGaps}` : open > 0 ? ` ${open} fix` : '';\r\n const label = area.label.padEnd(18);\r\n const provider = mission.providerLabel.padEnd(14);\r\n console.log(` ${label} ${provider} ${mission.readinessPercent}%${gapTag}`);\r\n }\r\n\r\n console.log('');\r\n console.log('Artifacts:');\r\n console.log(` ${paths.reportPath}`);\r\n console.log(` ${paths.jsonPath}`);\r\n console.log(` ${paths.summaryPath}`);\r\n console.log('');\r\n console.log('Next: viberaven prompt (top gap for your coding agent)');\r\n console.log('Agents: read .viberaven/agent-summary.md');\r\n console.log('');\r\n}\r\n"],
5
+ "mappings": "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",
6
+ "names": ["import_promises", "import_node_path", "import_promises", "e", "import_node_fs", "import_node_path", "fs", "import_node_fs", "import_node_path", "isRecord", "item", "provider", "item", "PROVIDERS", "provider", "item", "normalizePath", "item", "visibleFiles", "visibleFiles", "item", "hasPackage", "packageEvidence", "pathEvidence", "envEvidence", "isClientExecutedPath", "visibleFiles", "AREAS", "buildContext", "item", "normalizePath", "provider", "providerLabel", "raw", "normalized", "scanContext", "fs", "provider", "import_promises", "import_node_path", "provider", "provider", "provider"]
7
+ }