{"version":3,"sources":["../../src/cli/const.ts","../../src/cli/utils/exec.ts","../../src/cli/workflow-prompts.ts","../../src/cli/workflow-state.ts","../../src/cli/resolve-project-root.ts","../../src/cli/doc-read-audit.ts","../../src/cli/detect-framework.ts","../../src/cli/project-source-scan.ts","../../src/cli/install-manifest.ts","../../src/types/shared.ts","../../src/fetchSurvey/utils/constants.ts","../../src/fetchSurvey/utils/url.ts","../../src/utils/decodeInstanceJwt.ts","../../src/fetchSurvey/utils/extractSurveyLanguages.ts","../../src/fetchSurvey/constants/questionConfigKeys.ts","../../src/surveyLogic/fields/questionHintUtils.ts","../../src/fetchSurvey/utils/mappers/question/shared/configUtils.ts","../../src/fetchSurvey/utils/mappers/question/shared/resolveQuestionShell.ts","../../src/fetchSurvey/utils/mappers/question/shared/mapLogicFilters.ts","../../src/fetchSurvey/utils/mappers/question/shared/mapSkipLogics.ts","../../src/fetchSurvey/utils/mappers/question/shared/mapDisplayLogic.ts","../../src/fetchSurvey/utils/mappers/question/shared/mapQuestionDisplayVariants.ts","../../src/fetchSurvey/utils/mappers/question/shared/attachQuestionLogics.ts","../../src/fetchSurvey/constants/questionTypes.ts","../../src/fetchSurvey/utils/mappers/question/shared/choiceRandomization.ts","../../src/fetchSurvey/utils/mappers/question/mcq/applyMcqChoiceRandomization.ts","../../src/fetchSurvey/utils/mappers/question/shared/mapAnswerLogic.ts","../../src/fetchSurvey/utils/mappers/question/mcq/extractOtherOptionConfig.ts","../../src/fetchSurvey/utils/mappers/question/mcq/buildMcqOptions.ts","../../src/fetchSurvey/utils/mappers/question/mcq/extractAnswerConditions.ts","../../src/fetchSurvey/utils/mappers/question/mcq/extractDefaultOptionIds.ts","../../src/fetchSurvey/utils/mappers/question/mcq/mapMcqQuestion.ts","../../src/logger/logger.ts","../../src/fetchSurvey/logger/mapperLogger.ts","../../src/fetchSurvey/constants/displayStyles.ts","../../src/fetchSurvey/utils/mappers/question/labels/extractHintLabels.ts","../../src/fetchSurvey/utils/mappers/question/matrix/buildSelectableScalePoints.ts","../../src/fetchSurvey/utils/mappers/question/nps/buildNpsScalePoints.ts","../../src/fetchSurvey/utils/mappers/question/nps/mapNpsQuestion.ts","../../src/fetchSurvey/utils/mappers/question/textInput/mapTextInputQuestion.ts","../../src/fetchSurvey/utils/mappers/question/shared/detectMatrixFormat.ts","../../src/fetchSurvey/utils/mappers/question/matrix/resolveStatementText.ts","../../src/fetchSurvey/utils/mappers/question/cfmMatrix/buildCfmStatementRows.ts","../../src/fetchSurvey/utils/mappers/question/matrix/buildScaleColumns.ts","../../src/fetchSurvey/utils/mappers/question/cfmMatrix/mapCfmMatrixQuestion.ts","../../src/fetchSurvey/utils/mappers/question/shared/detectDisplayStyle.ts","../../src/fetchSurvey/utils/mappers/question/matrix/buildSimpleStatementRows.ts","../../src/fetchSurvey/utils/mappers/question/matrix/resolveMatrixScaleOptions.ts","../../src/fetchSurvey/utils/mappers/question/csat/mapCsatQuestion.ts","../../src/fetchSurvey/utils/mappers/question/ratingMatrix/mapRatingMatrixQuestion.ts","../../src/fetchSurvey/utils/mappers/question/sliderMatrix/buildSliderMatrixRows.ts","../../src/fetchSurvey/utils/mappers/question/sliderMatrix/mapSliderMatrixQuestion.ts","../../src/fetchSurvey/utils/mappers/question/textAndMedia/buildMediaConfig.ts","../../src/fetchSurvey/utils/mappers/question/textAndMedia/mapTextAndMediaQuestion.ts","../../src/fetchSurvey/utils/mappers/question/fileUpload/mapFileUploadQuestion.ts","../../src/fetchSurvey/utils/mappers/question/heatmap/buildHeatmapRegions.ts","../../src/fetchSurvey/utils/mappers/question/heatmap/mapHeatmapQuestion.ts","../../src/fetchSurvey/utils/mappers/question/rankOrder/buildRankOrderOptions.ts","../../src/fetchSurvey/utils/mappers/question/rankOrder/mapRankOrderQuestion.ts","../../src/fetchSurvey/utils/mappers/question/registry.ts","../../src/fetchSurvey/utils/mappers/question/index.ts","../../src/fetchSurvey/utils/mappers/survey/mapCtaButton.ts","../../src/fetchSurvey/utils/mapSurveyPages.ts","../../src/fetchSurvey/utils/mappers/survey/mapSpecialPages.ts","../../src/fetchSurvey/utils/mappers/survey/mapSurvey.ts","../../src/cli/ui-config-types.ts","../../src/cli/fetch-survey-inventory.ts","../../src/cli/survey-inventory-extract.ts","../../src/cli/layout-audit.ts","../../src/cli/layout-tasks.ts","../../src/cli/mcq-other-tasks.ts","../../src/cli/fill-implementation-plan.ts","../../src/cli/sync-from-fetch.ts","../../src/cli/verify-layout.ts","../../src/cli/verify-interactions.ts","../../src/cli/resolve-deploy-target.ts","../../src/cli/create-distribution.ts","../../src/cli/deploy.ts","../../src/cli/utils/nodeCheck.ts","../../src/cli/utils/prompts.ts","../../src/cli/utils/vercelCliCheck.ts","../../src/cli/utils/vercelLoginCheck.ts","../../src/cli/utils/vercelDeploy.ts","../../src/cli/scaffold-check.ts","../../src/cli/scaffold-validation.ts","../../src/cli/verify-build.ts","../../src/cli/seed-phase5.ts","../../src/cli/vite-scaffold.ts","../../src/cli/index.ts"],"sourcesContent":["export const colors = {\n  reset: '\\x1b[0m',\n  bold: '\\x1b[1m',\n  green: '\\x1b[32m',\n  red: '\\x1b[31m',\n  cyan: '\\x1b[36m',\n  yellow: '\\x1b[33m',\n  dim: '\\x1b[2m',\n};\n\n/** Production distribution dashboard — agents use this when CFM_DASHBOARD_API is unset. */\nexport const DEFAULT_DISTRIBUTION_DASHBOARD_URL =\n  'https://distribution-dashboard-three.vercel.app';\n","import { execSync, spawn } from 'child_process';\nimport type { ExecSyncOptions } from 'child_process';\n\nexport interface RunCommandOptions {\n  cwd?: string;\n}\n\n// Check if a shell executable is available in the user's system PATH\nexport function hasCommand(cmd: string): boolean {\n  try {\n    const checkCmd = process.platform === 'win32' ? `where ${cmd}` : `command -v ${cmd}`;\n    execSync(checkCmd, { stdio: 'ignore' });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\nconst inheritShellOptions: ExecSyncOptions = {\n  stdio: 'inherit',\n  shell: process.platform === 'win32' ? 'cmd.exe' : '/bin/sh',\n};\n\n// Execute a command synchronously and capture output/return code\nexport function runCommandSync(cmd: string, args: string[], options: RunCommandOptions = {}): boolean {\n  try {\n    const fullCmd = `${cmd} ${args.join(' ')}`;\n    execSync(fullCmd, { ...inheritShellOptions, cwd: options.cwd });\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n// Spawn an interactive command that inherits stdin/stdout/stderr\nexport function runCommandInteractive(cmd: string, args: string[]): Promise<number | null> {\n  return new Promise((resolve) => {\n    const child = spawn(cmd, args, {\n      stdio: 'inherit',\n      shell: true,\n    });\n\n    child.on('close', (code) => {\n      resolve(code);\n    });\n  });\n}\n","/** Canonical client-facing prompts — keep in sync with agent docs and lint-agent-docs.sh */\n\nimport { DEFAULT_DISTRIBUTION_DASHBOARD_URL } from './const';\n\nexport const CLIENT_CHAT_HEADER = 'COPY TO CLIENT CHAT';\nexport const AGENT_ONLY_HEADER = 'AGENT ONLY — do not paste below to client';\n\nconst BORDER = '═'.repeat(56);\n\n/** Step 5 — Instance ID (INPUT 2) */\nexport const INPUT_2_CLIENT_CHAT = `Hi! I've finished building your survey app on my side.\n\nTo load your real survey questions (instead of demo data), I need one thing from you:\n\n**Your survey instance ID** — a long access token from Sprinklr. It usually looks like three chunks of letters and numbers separated by dots.\n\n**What to do:** Copy that token from Sprinklr and paste it in your next message here.\n\n**What happens next:** I'll connect it, restart the preview, and send you a link to try the survey on your computer.`;\n\n/** Step 7 — Deploy + platform (INPUT 3) */\nexport const INPUT_4A_CLIENT_CHAT = `Your survey design is ready.\n\n**Would you like to publish it as a live link people can open in their browser?**\n\n**Please reply:** **yes** or **no**\n\nIf **yes**, also tell me which hosting you prefer:\n- **AWS** (Sprinklr / enterprise CDN — recommended for production surveys)\n- **Vercel** (quick hosting alternative)\n\nExample reply: \"yes, AWS\" or \"no\"`;\n\nexport const CFM_NEXT_STEP_ASK_DEPLOY = 'CFM_NEXT_STEP=ASK_DEPLOY';\n\nexport type DeployTargetLabel = 'aws' | 'vercel';\n\nexport function formatDeployTargetLabel(target: DeployTargetLabel): string {\n  return target === 'vercel' ? 'Vercel' : 'AWS';\n}\n\nexport function formatInput5ClientChat(surveyId: string): string {\n  return `Almost there! One last step to create your **shareable live link**.\n\nI've set everything up on my side. You just need to generate a short code in our distribution dashboard — then paste it back to me and I'll publish the link.\n\n| | |\n|---|---|\n| **Your Survey ID** | \\`${surveyId}\\` |\n| **Open this dashboard** | ${DEFAULT_DISTRIBUTION_DASHBOARD_URL} |\n\n**What to do:**\n1. Open the dashboard link above\n2. Click **Create distribution**\n3. Paste your **Survey ID** from the table and click **Generate key**\n4. Copy the key that appears (a short code like \\`a3f91c2e8b4d7016\\`)\n5. Paste that key in your next message here\n\n**What happens next:** I'll publish your live survey link and send it to you in this chat.\n\n*(You don't need to click Deploy in the dashboard — I'll handle that once you send me the key.)*`;\n}\n\nexport function formatDistributionDoneClientChat(liveUrl: string): string {\n  return `Done! Your survey is live.\n\n**Share this link with participants:**\n${liveUrl}\n\nThe dashboard also shows this link as **Deployed** with an **Open** button.\n\nWant another link for the same survey (e.g. a second campaign)? Say the word — we'll generate a new key the same way.`;\n}\n\nexport function formatInput2BClientChat(devUrl: string): string {\n  return `Your survey is connected.\n\n**Preview link:** ${devUrl}\n\n**What to do:**\n1. Open the link above\n2. Click **Let's Get Started** (or **Start Survey**) on the intro page\n3. Confirm the survey loads and looks right\n\nReply **\"looks good\"** when you're happy with the preview, or tell me what to fix.`;\n}\n\nexport function formatClientChatBlock(step: string, title: string, body: string): string {\n  return [BORDER, `  ${CLIENT_CHAT_HEADER} — ${step}: ${title}`, BORDER, '', body, ''].join('\\n');\n}\n\nexport function formatAgentOnlyBlock(body: string): string {\n  return [BORDER, `  ${AGENT_ONLY_HEADER}`, BORDER, '', body, '', BORDER].join('\\n');\n}\n\nexport function formatInput2ClientChatBlock(): string {\n  return formatClientChatBlock('Step 5 of 9', 'Connect your survey', INPUT_2_CLIENT_CHAT);\n}\n\nexport function formatInput2AgentBlock(): string {\n  return formatAgentOnlyBlock(\n    [\n      'After the client pastes their instance ID:',\n      '1. Paste into .env / .env.local per instance-id-quick-wire.md',\n      '2. Restart the dev server',\n      '3. npx cfm-sdk sync-from-fetch → implement §3c layout branches',\n      '4. npx cfm-sdk verify-layout --from-fetch (before sharing preview)',\n    ].join('\\n'),\n  );\n}\n\nexport function formatInput2HandoffBlocks(): string {\n  return [formatInput2ClientChatBlock(), formatInput2AgentBlock()].join('\\n');\n}\n\nexport function formatInput2BHandoffBlocks(devUrl: string): string {\n  return [\n    formatClientChatBlock('Step 6 of 9', 'Preview your survey', formatInput2BClientChat(devUrl)),\n    formatAgentOnlyBlock(\n      [\n        'After client confirms preview:',\n        '  npx cfm-sdk verify-build',\n      ].join('\\n'),\n    ),\n  ].join('\\n');\n}\n\nexport function formatLayoutBlockedFooter(): string {\n  return formatAgentOnlyBlock(\n    [\n      'BLOCKED: Complete HOOK 3 — fill layout-audit.md (Broken = 0)',\n      'BLOCKED: Run matrix grep block for each §3c row (reverification-hooks.md)',\n      'BLOCKED: npx cfm-sdk verify-layout --from-fetch',\n      'DO NOT share preview URL until verify-layout exit 0',\n      'Next: implement §3c branches → verify-layout → Phase 5b (visual skin) → verify-build',\n    ].join('\\n'),\n  );\n}\n\n/** Step 6 preview handoff — only after verify-layout passes. */\nexport function formatPreviewReadyHandoffBlocks(devUrl: string): string {\n  return [\n    formatInput2BHandoffBlocks(devUrl),\n    formatAgentOnlyBlock(\n      'verify-layout passed — safe to share Step 6 COPY TO CLIENT CHAT above.',\n    ),\n  ].join('\\n');\n}\n\nexport function formatInput4AClientChatBlock(): string {\n  return formatClientChatBlock('Step 7 of 9', 'Publish live link', INPUT_4A_CLIENT_CHAT);\n}\n\nexport function formatInput4DeployAgentBlock(): string {\n  return formatAgentOnlyBlock(\n    [\n      'After the client answers deploy + platform:',\n      '  npx cfm-sdk set-deploy-target aws|vercel',\n      '',\n      'If deploy yes + AWS: show Step 8 (distribution key) — do NOT run deploy-to-aws.sh.',\n      'If deploy yes + Vercel: npx cfm-sdk deploy',\n      'If deploy no: stop — survey stays on localhost only.',\n    ].join('\\n'),\n  );\n}\n\nexport function formatInput4DeployHandoffBlocks(): string {\n  return [formatInput4AClientChatBlock(), formatInput4DeployAgentBlock()].join('\\n');\n}\n\nexport function formatInput5HandoffBlocks(surveyId: string): string {\n  return [\n    formatClientChatBlock(\n      'Step 8 of 9',\n      'Generate your distribution key',\n      formatInput5ClientChat(surveyId),\n    ),\n    formatAgentOnlyBlock(\n      [\n        'Wait for the client to paste the key.',\n        'Then run: npx cfm-sdk create-distribution --s3-key=<key>',\n        '',\n        'Do NOT share any live URL until create-distribution prints ✓ Dashboard updated.',\n      ].join('\\n'),\n    ),\n  ].join('\\n');\n}\n\nexport function formatDistributionDoneHandoffBlocks(liveUrl: string): string {\n  return formatClientChatBlock(\n    'Step 9 of 9',\n    'Your survey is live',\n    formatDistributionDoneClientChat(liveUrl),\n  );\n}\n\nexport function formatDeployGateFailure(): string {\n  return [\n    'FAIL: Deploy not confirmed.',\n    '',\n    'Ask Step 7 client message first (deploy yes/no).',\n    'After client says yes + platform, run: npx cfm-sdk set-deploy-target aws|vercel',\n  ].join('\\n');\n}\n\n/** All CLIENT_CHAT bodies for jargon lint in tests */\nexport function getClientChatBodies(): string[] {\n  return [\n    INPUT_2_CLIENT_CHAT,\n    INPUT_4A_CLIENT_CHAT,\n    formatInput5ClientChat('example-survey-id'),\n    formatDistributionDoneClientChat('https://example.com/live'),\n    formatInput2BClientChat('http://localhost:3000'),\n  ];\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { formatDeployGateFailure } from './workflow-prompts';\n\nexport const WORKFLOW_STATE_FILE = '.cfm-agent-state.json';\n\nexport interface AgentWorkflowState {\n  version: 1;\n  coreVerifyPassedAt: string | null;\n  layoutVerifyPassedAt: string | null;\n  deployConfirmed: boolean | null;\n  distributionS3Key: string | null;\n}\n\nfunction statePath(projectRoot: string): string {\n  return path.join(projectRoot, WORKFLOW_STATE_FILE);\n}\n\nexport function isWorkflowGateSkipped(): boolean {\n  return process.env.CFM_SKIP_WORKFLOW_GATE === '1';\n}\n\nexport function readWorkflowState(projectRoot: string): AgentWorkflowState | null {\n  const file = statePath(projectRoot);\n  if (!fs.existsSync(file)) return null;\n  try {\n    const raw = JSON.parse(fs.readFileSync(file, 'utf8')) as AgentWorkflowState & {\n      input3?: unknown;\n    };\n    if (raw.version !== 1) return null;\n    return {\n      version: 1,\n      coreVerifyPassedAt: raw.coreVerifyPassedAt ?? null,\n      layoutVerifyPassedAt: raw.layoutVerifyPassedAt ?? null,\n      deployConfirmed: raw.deployConfirmed ?? null,\n      distributionS3Key: raw.distributionS3Key ?? null,\n    };\n  } catch {\n    return null;\n  }\n}\n\nfunction writeWorkflowState(projectRoot: string, state: AgentWorkflowState): void {\n  fs.writeFileSync(statePath(projectRoot), `${JSON.stringify(state, null, 2)}\\n`, 'utf8');\n}\n\nexport function writeCoreVerifyPassed(projectRoot: string): void {\n  const existing = readWorkflowState(projectRoot);\n  writeWorkflowState(projectRoot, {\n    version: 1,\n    coreVerifyPassedAt: new Date().toISOString(),\n    layoutVerifyPassedAt: existing?.layoutVerifyPassedAt ?? null,\n    deployConfirmed: existing?.deployConfirmed ?? null,\n    distributionS3Key: existing?.distributionS3Key ?? null,\n  });\n}\n\nexport function writeLayoutVerifyPassed(projectRoot: string): void {\n  const existing = readWorkflowState(projectRoot) ?? {\n    version: 1 as const,\n    coreVerifyPassedAt: null,\n    layoutVerifyPassedAt: null,\n    deployConfirmed: null,\n    distributionS3Key: null,\n  };\n  writeWorkflowState(projectRoot, {\n    ...existing,\n    layoutVerifyPassedAt: new Date().toISOString(),\n  });\n}\n\nexport function recordDeployConfirmed(projectRoot: string): AgentWorkflowState {\n  const existing = readWorkflowState(projectRoot);\n  if (!existing?.coreVerifyPassedAt) {\n    throw new Error(\n      'Core verify not recorded. Run npx cfm-sdk verify-build successfully before set-deploy-target.',\n    );\n  }\n  const next: AgentWorkflowState = {\n    ...existing,\n    deployConfirmed: true,\n  };\n  writeWorkflowState(projectRoot, next);\n  return next;\n}\n\nexport function recordDistributionS3Key(projectRoot: string, s3Key: string): AgentWorkflowState {\n  const existing = readWorkflowState(projectRoot);\n  if (!existing?.deployConfirmed) {\n    throw new Error(formatDeployGateFailure());\n  }\n  const next: AgentWorkflowState = {\n    ...existing,\n    distributionS3Key: s3Key.trim(),\n  };\n  writeWorkflowState(projectRoot, next);\n  return next;\n}\n\nexport function assertDeployAllowed(projectRoot: string): void {\n  if (isWorkflowGateSkipped()) return;\n\n  const state = readWorkflowState(projectRoot);\n  if (!state?.coreVerifyPassedAt) {\n    throw new Error(\n      'Core verify not recorded. Run npx cfm-sdk verify-build successfully before deploy.',\n    );\n  }\n  if (state.deployConfirmed !== true) {\n    throw new Error(formatDeployGateFailure());\n  }\n}\n\nexport function assertDistributionDeployAllowed(projectRoot: string, s3Key?: string): void {\n  if (isWorkflowGateSkipped()) return;\n\n  assertDeployAllowed(projectRoot);\n  if (!s3Key?.trim()) {\n    throw new Error(\n      'Missing --s3-key. Display Step 9 client message and wait for the client to paste their distribution key.',\n    );\n  }\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nfunction hasSurveyProjectMarkers(root: string): boolean {\n  if (fs.existsSync(path.join(root, 'src', 'components', 'Question.tsx'))) return true;\n  if (fs.existsSync(path.join(root, 'implementation_plan.md'))) return true;\n  const pkgPath = path.join(root, 'package.json');\n  if (fs.existsSync(pkgPath)) {\n    try {\n      const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as {\n        dependencies?: Record<string, string>;\n        devDependencies?: Record<string, string>;\n      };\n      const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n      if (\n        deps['@explorer02/cfm-survey-sdk'] ||\n        deps['@repo/sdk'] ||\n        Object.keys(deps).some(key => key.includes('cfm-survey-sdk'))\n      ) {\n        return true;\n      }\n    } catch {\n      return false;\n    }\n  }\n  return false;\n}\n\n/** Prefer cwd with survey project markers over stale INIT_CWD from yarn. */\nexport function resolveProjectRoot(explicit?: string): string {\n  if (explicit) return explicit;\n  const cwd = process.cwd();\n  if (hasSurveyProjectMarkers(cwd)) return cwd;\n  const initCwd = process.env.INIT_CWD;\n  if (initCwd && hasSurveyProjectMarkers(initCwd)) {\n    return initCwd;\n  }\n  return cwd;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { colors } from './const';\n\nconst c = colors;\n\nconst OK_MAX = 150;\nconst WARN_MAX = 250;\n\nconst SLOW_HINTS: Record<string, string> = {\n  'MANIFEST.json': 'skim MANIFEST.routing.json instead',\n  '00-integration/agent-per-type-verification.md': 'mandatory fast-path gate — read Data/Logic/SDK rows for §3b types only',\n  '00-integration/layout-cookbook.md': 'card-per-type reference — read only your fetched types\\' cards, not the whole file',\n  '00-integration/reverification-hooks.md': 'read only the HOOK section for your current moment + audit template at HOOK 3',\n  '00-integration/phase-5-6-build-gate.md': 'read build-gate/verify-core.md only',\n  '00-integration/mockup-to-config-guide.md': 'read mockup/index.md + mockup-styling-paths.json',\n  '00-integration/agent-execution-flow.md': 'read execution-flow/index.md on fast path skip',\n  '00-integration/agent-operating-contract.md': 'read operating-contract/index.md on fast path skip',\n  '00-integration/aws-deploy.md': 'INPUT 3 deploy only — read deploy/aws/index.md',\n};\n\nconst MANDATORY_FAST_PATH_READS = new Set([\n  '00-integration/agent-per-type-verification.md',\n  '00-integration/layout-cookbook.md',\n]);\n\nfunction normalizeRelPath(rel: string): string {\n  return rel.replace(/^\\.\\.\\//, '');\n}\n\nexport type DocTier = 'ok' | 'warn' | 'slow' | 'missing';\n\nexport interface DocAuditEntry {\n  relPath: string;\n  lines: number;\n  tier: DocTier;\n  hint?: string;\n}\n\nexport interface DocReadAuditResult {\n  profile: string;\n  entries: DocAuditEntry[];\n  slow: DocAuditEntry[];\n  totalLines: number;\n  ok: boolean;\n}\n\nexport function getSdkDocsRoot(): string {\n  return path.join(__dirname, '..', '..', 'templates', 'docs');\n}\n\nfunction tierForLines(lines: number): DocTier {\n  if (lines <= OK_MAX) return 'ok';\n  if (lines <= WARN_MAX) return 'warn';\n  return 'slow';\n}\n\nfunction resolveDocPath(docsRoot: string, rel: string): string | null {\n  const normalized = rel.split('#')[0]!.split('?')[0]!;\n  if (normalized.includes('*')) return null;\n\n  const candidates = [\n    path.join(docsRoot, normalized),\n    path.join(docsRoot, '..', normalized),\n  ];\n\n  for (const abs of candidates) {\n    if (fs.existsSync(abs) && fs.statSync(abs).isFile()) return abs;\n  }\n  return null;\n}\n\nfunction countLines(filePath: string): number {\n  return fs.readFileSync(filePath, 'utf8').split('\\n').length;\n}\n\nfunction collectManifestPaths(manifest: Record<string, unknown>, profile: string, phaseId?: string): string[] {\n  const paths = new Set<string>();\n\n  if (profile === 'fastPath') {\n    const fp = manifest.fastPath as { read?: string[]; readWhenMockup?: string[] } | undefined;\n    for (const p of fp?.read ?? []) paths.add(p);\n  } else if (profile === 'phase' && phaseId !== undefined) {\n    const phases = manifest.phases as Array<Record<string, unknown>> | undefined;\n    const phase = phases?.find((p) => String(p.id) === String(phaseId));\n    if (phase) {\n      for (const key of Object.keys(phase)) {\n        if (!key.startsWith('read')) continue;\n        const val = phase[key];\n        if (Array.isArray(val)) {\n          for (const p of val) if (typeof p === 'string') paths.add(p);\n        }\n      }\n    }\n  } else if (profile === 'perType') {\n    const qt = manifest.questionTypes as Record<string, Record<string, string>> | undefined;\n    for (const entry of Object.values(qt ?? {})) {\n      for (const field of ['spineSlice', 'blueprint', 'reference', 'uiSpec'] as const) {\n        const p = entry[field];\n        if (typeof p === 'string') paths.add(p);\n      }\n    }\n  }\n\n  return [...paths];\n}\n\nfunction hintFor(relPath: string): string | undefined {\n  const key = relPath.replace(/^\\.\\.\\//, '');\n  return SLOW_HINTS[key] ?? SLOW_HINTS[relPath];\n}\n\nexport function auditDocPaths(\n  docsRoot: string,\n  relPaths: string[],\n  profileLabel: string,\n): DocReadAuditResult {\n  const entries: DocAuditEntry[] = [];\n\n  for (const rel of relPaths) {\n    const abs = resolveDocPath(docsRoot, rel);\n    if (!abs) {\n      entries.push({ relPath: rel, lines: 0, tier: 'missing' });\n      continue;\n    }\n    const lines = countLines(abs);\n    const tier = tierForLines(lines);\n    const hint = tier === 'slow' || tier === 'warn' ? hintFor(rel.replace(/^\\.\\.\\//, '')) : undefined;\n    entries.push({ relPath: rel, lines, tier, hint });\n  }\n\n  entries.sort((a, b) => b.lines - a.lines);\n  const slow = entries.filter((e) => e.tier === 'slow');\n  const blockingSlow = slow.filter((e) => !MANDATORY_FAST_PATH_READS.has(normalizeRelPath(e.relPath)));\n  const totalLines = entries.reduce((sum, e) => sum + e.lines, 0);\n\n  return {\n    profile: profileLabel,\n    entries,\n    slow,\n    totalLines,\n    ok: blockingSlow.length === 0,\n  };\n}\n\nexport function loadManifest(docsRoot: string): Record<string, unknown> {\n  const manifestPath = path.join(docsRoot, 'MANIFEST.json');\n  return JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as Record<string, unknown>;\n}\n\nexport function runDocReadAudit(options: {\n  docsRoot?: string;\n  profile?: 'fastPath' | 'phase' | 'perType';\n  phaseId?: string;\n  warnOnly?: boolean;\n  ci?: boolean;\n  writeInventory?: boolean;\n}): number {\n  const docsRoot = options.docsRoot ?? getSdkDocsRoot();\n  const profile = options.profile ?? 'fastPath';\n  const manifest = loadManifest(docsRoot);\n\n  const relPaths =\n    profile === 'phase'\n      ? collectManifestPaths(manifest, 'phase', options.phaseId)\n      : profile === 'perType'\n        ? collectManifestPaths(manifest, 'perType')\n        : collectManifestPaths(manifest, 'fastPath');\n\n  const label =\n    profile === 'phase' ? `phase ${options.phaseId ?? '?'}` : profile === 'perType' ? 'perType' : 'fastPath';\n  const result = auditDocPaths(docsRoot, relPaths, label);\n\n  console.log(`\\n${c.bold}Doc read budget audit (${result.profile})${c.reset}`);\n  console.log('─'.repeat(40));\n\n  for (const entry of result.entries) {\n    const tag =\n      entry.tier === 'ok'\n        ? `${c.green}OK  ${c.reset}`\n        : entry.tier === 'warn'\n          ? `${c.yellow}WARN${c.reset}`\n          : entry.tier === 'slow'\n            ? `${c.red}SLOW${c.reset}`\n            : `${c.red}MISS${c.reset}`;\n    const hint = entry.hint ? ` — ${entry.hint}` : '';\n    const lineLabel = entry.tier === 'missing' ? 'missing' : `${entry.lines} lines`;\n    console.log(`${tag} ${entry.relPath.padEnd(42)} ${lineLabel}${hint}`);\n  }\n\n  console.log(`\\n${c.dim}Total: ${result.totalLines} lines across ${result.entries.length} paths${c.reset}`);\n\n  if (result.slow.length > 0) {\n    console.log(`\\n${c.yellow}A few doc reads are taking longer than expected even from temp files:${c.reset}`);\n    for (const entry of result.slow) {\n      const hint = entry.hint ? ` — ${entry.hint}` : '';\n      console.log(`  - ${entry.relPath} (${entry.lines} lines)${hint}`);\n    }\n  }\n\n  if (options.writeInventory) {\n    const inventory: Record<string, { lines: number; tier: DocTier }> = {};\n    for (const entry of result.entries) {\n      if (entry.tier !== 'missing') {\n        inventory[entry.relPath] = { lines: entry.lines, tier: entry.tier };\n      }\n    }\n    manifest.docInventory = {\n      generatedBy: 'npx cfm-sdk doc-read-audit --write',\n      caps: { ok: OK_MAX, warn: WARN_MAX },\n      profile: result.profile,\n      files: inventory,\n    };\n    fs.writeFileSync(\n      path.join(docsRoot, 'MANIFEST.json'),\n      `${JSON.stringify(manifest, null, 2)}\\n`,\n      'utf8',\n    );\n    console.log(`\\n${c.green}OK:${c.reset} Wrote docInventory to MANIFEST.json`);\n  }\n\n  if (result.ok || options.warnOnly) {\n    return 0;\n  }\n  if (options.ci) {\n    return 1;\n  }\n  return result.slow.length > 0 ? 1 : 0;\n}\n\nexport function formatDocBudgetHint(docsRoot?: string): string {\n  const root = docsRoot ?? getSdkDocsRoot();\n  const manifest = loadManifest(root);\n  const relPaths = collectManifestPaths(manifest, 'fastPath');\n  const result = auditDocPaths(root, relPaths, 'fastPath');\n  return `Doc budget: npx cfm-sdk doc-read-audit — fast path reads ${result.entries.length} files (~${result.totalLines} lines)`;\n}\n","import * as fs from 'fs';\nimport * as net from 'net';\nimport * as path from 'path';\n\nexport type AgentFramework = 'nextjs' | 'vite' | 'cra' | 'unknown';\n\nconst SDK_PACKAGE_NAMES = ['@explorer02/cfm-survey-sdk', '@repo/sdk'] as const;\n\nfunction readPortFromEnv(): number | undefined {\n  const raw = process.env.PORT?.trim();\n  if (!raw) return undefined;\n  const n = Number(raw);\n  return Number.isFinite(n) && n > 0 ? n : undefined;\n}\n\nfunction readViteDevPort(projectRoot: string): number {\n  const candidates = [\n    path.join(projectRoot, 'vite.config.ts'),\n    path.join(projectRoot, 'vite.config.js'),\n    path.join(projectRoot, 'vite.config.mjs'),\n  ];\n  for (const filePath of candidates) {\n    if (!fs.existsSync(filePath)) continue;\n    const source = fs.readFileSync(filePath, 'utf8');\n    const match = source.match(/server\\s*:\\s*\\{[^}]*port\\s*:\\s*(\\d+)/s);\n    if (match) return Number(match[1]);\n  }\n  return 5173;\n}\n\nconst DEFAULT_PROBE_PORTS = [3000, 5173, 5174, 3001] as const;\n\n/** Ordered candidate ports for live dev-server probe (deduped). */\nexport function buildSurveyDevPortCandidates(projectRoot: string): number[] {\n  const ports: number[] = [];\n  const portFromEnv = readPortFromEnv();\n  if (portFromEnv) ports.push(portFromEnv);\n\n  const pkgPath = path.join(projectRoot, 'package.json');\n  if (fs.existsSync(pkgPath)) {\n    const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as {\n      dependencies?: Record<string, string>;\n      devDependencies?: Record<string, string>;\n    };\n    const framework = detectFramework(pkg);\n    if (framework === 'vite') {\n      ports.push(readViteDevPort(projectRoot));\n    } else if (framework === 'nextjs' || framework === 'cra') {\n      ports.push(3000);\n    }\n  }\n\n  ports.push(...DEFAULT_PROBE_PORTS);\n  return [...new Set(ports)];\n}\n\nexport type PortProbeFn = (port: number) => Promise<boolean>;\n\n/** Returns true when something accepts TCP on localhost:{port}. */\nexport function probeLocalPort(port: number, timeoutMs = 800): Promise<boolean> {\n  return new Promise((resolve) => {\n    const socket = net.connect({ port, host: '127.0.0.1' });\n    const onDone = (alive: boolean) => {\n      socket.removeAllListeners();\n      socket.destroy();\n      resolve(alive);\n    };\n    socket.setTimeout(timeoutMs);\n    socket.once('connect', () => onDone(true));\n    socket.once('timeout', () => onDone(false));\n    socket.once('error', () => onDone(false));\n  });\n}\n\nexport interface ResolveLiveSurveyDevUrlResult {\n  url: string;\n  probed: boolean;\n  warning?: string;\n}\n\n/** Probe candidate ports; fall back to config/default URL with warning when none respond. */\nexport async function resolveLiveSurveyDevUrl(\n  projectRoot: string,\n  options?: { probe?: PortProbeFn },\n): Promise<ResolveLiveSurveyDevUrlResult> {\n  const probe = options?.probe ?? probeLocalPort;\n  const candidates = buildSurveyDevPortCandidates(projectRoot);\n\n  for (const port of candidates) {\n    if (await probe(port)) {\n      return { url: `http://localhost:${port}`, probed: true };\n    }\n  }\n\n  const fallback = resolveSurveyDevUrl(projectRoot);\n  return {\n    url: fallback,\n    probed: false,\n    warning:\n      'No listening dev server found on candidate ports; using config/default URL. Start `npm run dev` and re-probe before sharing preview.',\n  };\n}\n\n/** Default local survey app URL for client handoff after INPUT 2 / Phase 6c. */\nexport function resolveSurveyDevUrl(projectRoot: string): string {\n  const pkgPath = path.join(projectRoot, 'package.json');\n  let framework: AgentFramework = 'unknown';\n  if (fs.existsSync(pkgPath)) {\n    const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as {\n      dependencies?: Record<string, string>;\n      devDependencies?: Record<string, string>;\n    };\n    framework = detectFramework(pkg);\n  }\n\n  const portFromEnv = readPortFromEnv();\n  if (portFromEnv) return `http://localhost:${portFromEnv}`;\n\n  switch (framework) {\n    case 'vite':\n      return `http://localhost:${readViteDevPort(projectRoot)}`;\n    case 'nextjs':\n    case 'cra':\n      return 'http://localhost:3000';\n    default:\n      return 'http://localhost:3000';\n  }\n}\n\nexport function detectFramework(packageJson: {\n  dependencies?: Record<string, string>;\n  devDependencies?: Record<string, string>;\n}): AgentFramework {\n  const deps = {\n    ...packageJson.dependencies,\n    ...packageJson.devDependencies,\n  };\n\n  if (deps.next) return 'nextjs';\n  if (deps.vite) return 'vite';\n  if (deps['react-scripts']) return 'cra';\n  return 'unknown';\n}\n\nexport function resolveSdkPackageName(packageJson: {\n  dependencies?: Record<string, string>;\n  devDependencies?: Record<string, string>;\n}): string | undefined {\n  const deps = {\n    ...packageJson.dependencies,\n    ...packageJson.devDependencies,\n  };\n\n  return SDK_PACKAGE_NAMES.find((name) => Boolean(deps[name]));\n}\n\nexport function isAwsDeployTarget(surveyUiConfig: { deploy?: { target?: string } }): boolean {\n  return surveyUiConfig.deploy?.target === 'aws';\n}\n\nexport function nextConfigIncludesTranspilePackages(\n  nextConfigSource: string,\n  sdkPackageName: string,\n): boolean {\n  return (\n    nextConfigSource.includes('transpilePackages') &&\n    nextConfigSource.includes(sdkPackageName)\n  );\n}\n\nexport function nextConfigHasStaticExport(nextConfigSource: string): boolean {\n  return (\n    /output\\s*:\\s*['\"]export['\"]/.test(nextConfigSource) &&\n    /assetPrefix\\s*:\\s*['\"]\\.\\/['\"]/.test(nextConfigSource)\n  );\n}\n\nexport function viteConfigHasRelativeBase(viteConfigSource: string): boolean {\n  return /base\\s*:\\s*['\"]\\.\\/['\"]/.test(viteConfigSource);\n}\n\nexport function sourceHasNextImports(source: string): boolean {\n  return /from\\s+['\"]next\\//.test(source);\n}\n\nexport function sourceHasUseClientDirective(source: string): boolean {\n  return /^['\"]use client['\"];?\\s*$/m.test(source);\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\n\nconst SOURCE_DIRS = ['src', 'components', 'app', 'lib'] as const;\n\nconst INTRO_PAGE_CANDIDATES = [\n  'src/components/IntroPage.tsx',\n  'components/IntroPage.tsx',\n  'app/components/IntroPage.tsx',\n] as const;\n\nconst SURVEY_PAGE_CANDIDATES = [\n  'src/components/SurveyPage.tsx',\n  'components/SurveyPage.tsx',\n  'app/components/SurveyPage.tsx',\n] as const;\n\nconst END_PAGE_CANDIDATES = [\n  'src/components/EndPage.tsx',\n  'components/EndPage.tsx',\n  'app/components/EndPage.tsx',\n] as const;\n\nconst QUESTION_CANDIDATES = [\n  'src/components/Question.tsx',\n  'components/Question.tsx',\n  'app/components/Question.tsx',\n] as const;\n\nconst MATRIX_SCALE_FILES = [\n  'CsatMatrixScale.tsx',\n  'SliderMatrixScale.tsx',\n  'LikertMatrixScale.tsx',\n] as const;\n\nconst MATRIX_RELATED_FILES = [\n  ...MATRIX_SCALE_FILES,\n  'MatrixDropdown.tsx',\n] as const;\n\nconst AGENT_AUTHORED_STYLE_FILES = [\n  'src/components/SurveyPage.tsx',\n  'components/SurveyPage.tsx',\n  'app/components/SurveyPage.tsx',\n  'src/globals.css',\n  'src/index.css',\n  'src/app/globals.css',\n  'app/globals.css',\n  'src/app/layout.tsx',\n  'app/layout.tsx',\n] as const;\n\nconst HARDCODED_HEX = /#[0-9A-Fa-f]{3,8}\\b/;\nconst HARDCODED_RGB = /\\brgba?\\s*\\(/;\n\nfunction collectSourceFiles(projectRoot: string): string[] {\n  const files: string[] = [];\n  for (const dir of SOURCE_DIRS) {\n    const abs = path.join(projectRoot, dir);\n    if (!fs.existsSync(abs)) continue;\n    walk(abs, files);\n  }\n  return files;\n}\n\nfunction walk(dir: string, out: string[]): void {\n  for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n    const abs = path.join(dir, entry.name);\n    if (entry.isDirectory()) {\n      if (entry.name === 'node_modules' || entry.name === '.next' || entry.name === 'dist') {\n        continue;\n      }\n      walk(abs, out);\n    } else if (/\\.(tsx?|jsx?|mjs|cjs)$/.test(entry.name)) {\n      out.push(abs);\n    }\n  }\n}\n\nfunction findFirstExisting(projectRoot: string, candidates: readonly string[]): string | null {\n  for (const rel of candidates) {\n    const abs = path.join(projectRoot, rel);\n    if (fs.existsSync(abs)) return rel;\n  }\n  return null;\n}\n\nfunction isAllowedStyleLine(line: string): boolean {\n  const trimmed = line.trim();\n  if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*')) return true;\n  if (trimmed.includes('var(--cfm-')) return true;\n  if (/url\\s*\\(#/.test(trimmed)) return true;\n  return false;\n}\n\nexport function scanHardcodedStyleIssues(projectRoot: string): string[] {\n  const issues: string[] = [];\n\n  for (const rel of AGENT_AUTHORED_STYLE_FILES) {\n    const abs = path.join(projectRoot, rel);\n    if (!fs.existsSync(abs)) continue;\n\n    const content = fs.readFileSync(abs, 'utf8');\n    const lines = content.split('\\n');\n\n    for (let i = 0; i < lines.length; i++) {\n      const line = lines[i];\n      if (isAllowedStyleLine(line)) continue;\n      if (HARDCODED_HEX.test(line) || HARDCODED_RGB.test(line)) {\n        issues.push(`${rel}:${i + 1}: hardcoded color — use survey-ui-config.json + var(--cfm-*)`);\n      }\n    }\n  }\n\n  return issues;\n}\n\nexport function scanIntroStartIssues(projectRoot: string): string[] {\n  const issues: string[] = [];\n  const introRel = findFirstExisting(projectRoot, INTRO_PAGE_CANDIDATES);\n\n  if (!introRel) {\n    issues.push(\n      'IntroPage.tsx missing — author an intro page with a Start button that dispatches onAction START',\n    );\n    return issues;\n  }\n\n  const introContent = fs.readFileSync(path.join(projectRoot, introRel), 'utf8');\n\n  if (!/data-cfm-btn-start/.test(introContent)) {\n    issues.push(`${introRel}: Start button missing data-cfm-btn-start`);\n  }\n  if (!/onClick=\\{onStart\\}|onClick=\\{\\s*onStart\\s*\\}/.test(introContent)) {\n    issues.push(`${introRel}: Start button must use onClick={onStart}`);\n  }\n  if (/\\{showStart &&|showStart &&/.test(introContent)) {\n    issues.push(`${introRel}: conditional Start (showStart) — always render Start button`);\n  }\n\n  const surveyRel = findFirstExisting(projectRoot, SURVEY_PAGE_CANDIDATES);\n  if (!surveyRel) return issues;\n\n  const surveyContent = fs.readFileSync(path.join(projectRoot, surveyRel), 'utf8');\n  const hasIntroPhase = /phase\\.kind\\s*===\\s*['\"]intro['\"]|kind\\s*===\\s*['\"]intro['\"]/.test(\n    surveyContent,\n  );\n\n  if (hasIntroPhase && !/<IntroPage/.test(surveyContent)) {\n    issues.push(\n      `${surveyRel}: intro phase must render <IntroPage /> — do not inline header/description only`,\n    );\n  }\n  if (/<IntroPage/.test(surveyContent) && !/type:\\s*['\"]START['\"]/.test(surveyContent)) {\n    issues.push(`${surveyRel}: IntroPage must wire onAction({ type: 'START' })`);\n  }\n\n  return issues;\n}\n\nfunction endPageFiltersEmailCtAs(content: string): boolean {\n  if (/endPageCtas\\s*\\(/.test(content)) return true;\n  if (/sendEmailResponse,\\s*resumptionNotification,\\s*reopenNotification/.test(content)) {\n    return true;\n  }\n  return false;\n}\n\nexport function scanEndPageCtaIssues(projectRoot: string): string[] {\n  const endRel = findFirstExisting(projectRoot, END_PAGE_CANDIDATES);\n  if (!endRel) return [];\n\n  const content = fs.readFileSync(path.join(projectRoot, endRel), 'utf8');\n  if (!/<SpecialPageCtaSection/.test(content)) return [];\n\n  if (endPageFiltersEmailCtAs(content)) return [];\n\n  if (/ctas=\\{[^}]*page\\.ctas[^}]*\\}/.test(content)) {\n    return [\n      `${endRel}: EndPage must filter email CTAs via endPageCtas(page.ctas) before SpecialPageCtaSection — see 15-end-page.md`,\n    ];\n  }\n\n  return [];\n}\n\nexport interface MatrixVariantPlanRow {\n  questionId: string;\n  type: string;\n  displayStyle: string;\n  gridLayout: string;\n  statementLayout: string;\n  transposeTable: string;\n  selectionMode: string;\n  hasNotApplicableOption: string;\n  branchOn?: string;\n  scaleAnchorLabelCount?: string;\n}\n\nfunction parseTruthyFlag(value: string | undefined): boolean {\n  if (!value) return false;\n  const v = value.trim().toLowerCase();\n  return v === 'true' || v === 'yes';\n}\n\nexport function readMatrixVariantsFromPlan(projectRoot: string): MatrixVariantPlanRow[] {\n  const planPath = path.join(projectRoot, 'implementation_plan.md');\n  if (!fs.existsSync(planPath)) return [];\n\n  const content = fs.readFileSync(planPath, 'utf8');\n  const section = content.split('## 3c. Matrix variant inventory')[1];\n  if (!section) return [];\n\n  const tablePart = section.split('##')[0] ?? '';\n  const lines = tablePart.split('\\n').filter((l) => l.trim().startsWith('|'));\n  const rows: MatrixVariantPlanRow[] = [];\n\n  for (const line of lines) {\n    if (line.includes('questionId')) continue;\n    // Skip markdown separator rows (only pipes, dashes, colons, whitespace) — including\n    // multi-column separators like `|------|------|` that a single-dash regex misses.\n    if (/^[\\s|:-]+$/.test(line)) continue;\n    if (line.includes('(no matrix questions in fetch)')) continue;\n\n    const cells = line\n      .split('|')\n      .map((c) => c.trim())\n      .filter(Boolean);\n    if (cells.length < 6) continue;\n\n    if (cells.length >= 10) {\n      rows.push({\n        questionId: cells[0],\n        type: cells[1],\n        displayStyle: cells[2],\n        gridLayout: cells[3],\n        statementLayout: cells[4],\n        transposeTable: cells[5],\n        selectionMode: cells[6],\n        hasNotApplicableOption: cells[7],\n        branchOn: cells[8],\n        scaleAnchorLabelCount: cells[9],\n      });\n      continue;\n    }\n\n    if (cells.length >= 9) {\n      rows.push({\n        questionId: cells[0],\n        type: cells[1],\n        displayStyle: cells[2],\n        gridLayout: cells[3],\n        statementLayout: cells[4],\n        transposeTable: cells[5],\n        selectionMode: cells[6],\n        hasNotApplicableOption: cells[7],\n        branchOn: cells[8],\n      });\n      continue;\n    }\n\n    if (cells.length >= 8) {\n      rows.push({\n        questionId: cells[0],\n        type: cells[1],\n        displayStyle: cells[2],\n        gridLayout: cells[3],\n        statementLayout: cells[4],\n        transposeTable: cells[5],\n        selectionMode: cells[6],\n        hasNotApplicableOption: cells[7],\n      });\n      continue;\n    }\n\n    // Legacy §3c (6 columns, no gridLayout / hasNA)\n    rows.push({\n      questionId: cells[0],\n      type: cells[1],\n      displayStyle: cells[2],\n      gridLayout: '—',\n      statementLayout: cells[3],\n      transposeTable: cells[4],\n      selectionMode: cells[5],\n      hasNotApplicableOption: cells[6] ?? '—',\n    });\n  }\n\n  return rows;\n}\n\nfunction readScaleValuesContent(projectRoot: string): string {\n  for (const file of collectSourceFiles(projectRoot)) {\n    if (path.basename(file) === 'scaleValues.ts') {\n      return fs.readFileSync(file, 'utf8');\n    }\n  }\n  return '';\n}\n\nfunction matrixScaleFileForType(type: string): string | undefined {\n  if (type === 'CFM_MATRIX') return 'LikertMatrixScale.tsx';\n  if (type === 'CSAT_MATRIX' || type === 'RATING_MATRIX') return 'CsatMatrixScale.tsx';\n  if (type === 'SLIDER_MATRIX') return 'SliderMatrixScale.tsx';\n  return undefined;\n}\n\nfunction extractFunctionBody(content: string, name: string): string {\n  const re = new RegExp(`function\\\\s+${name}\\\\b[\\\\s\\\\S]*?(?=\\\\nfunction\\\\s+\\\\w|$)`);\n  return content.match(re)?.[0] ?? '';\n}\n\nfunction stripHoverTooltipBlocks(source: string): string {\n  return source.replace(/\\{isHovered\\s*&&[\\s\\S]*?\\}\\s*\\)\\s*\\}/g, '');\n}\n\nfunction numberedCellUsesColLabel(content: string): boolean {\n  for (const fn of ['CsatMatrixGrid', 'CsatMatrixCarousel']) {\n    const body = extractFunctionBody(content, fn);\n    if (!body || !/\\bisNumbered\\b/.test(body)) continue;\n\n    const stripped = stripHoverTooltipBlocks(body);\n    if (!/displayIdx\\s*\\+\\s*1/.test(body) && /col\\.label/.test(stripped)) {\n      return true;\n    }\n\n    if (\n      /isNumbered[\\s\\S]{0,3500}col\\.label/.test(stripped) &&\n      (/<\\/button>[\\s\\S]{0,600}col\\.label/.test(stripped) ||\n        /dangerouslySetInnerHTML[\\s\\S]{0,80}col\\.label/.test(stripped))\n    ) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction anchorUsesJustifyBetweenWithoutAbsolute(content: string): boolean {\n  if (!/scaleAnchorLabels/.test(content)) return false;\n\n  const anchorBlocks = content.match(/scaleAnchorLabels[\\s\\S]{0,1800}/g);\n  if (!anchorBlocks?.length) return false;\n\n  return anchorBlocks.some((block) => {\n    const hasJustify =\n      /justify-between/.test(block) ||\n      /justifyContent:\\s*['\"]space-between['\"]/.test(block);\n    const hasAbsolute = /position:\\s*['\"]absolute['\"]/.test(block);\n    return hasJustify && !hasAbsolute;\n  });\n}\n\nfunction likertMissingNonNaScaleColumns(content: string): boolean {\n  if (!/scaleColumns|gridCols/.test(content)) return false;\n  return !/nonNaScaleColumns/.test(content);\n}\n\nfunction likertNaInGridLoop(content: string): boolean {\n  if (/nonNaScaleColumns/.test(content)) return false;\n  return /gridCols\\.map|scaleColumns\\.map/.test(content);\n}\n\nfunction csatCarouselDuplicateLabels(content: string): boolean {\n  const carousel = extractFunctionBody(content, 'CsatMatrixCarousel');\n  if (!carousel) return false;\n  if (!/\\bisNumbered\\b|\\bisEmoji\\b|\\bisStar\\b/.test(carousel)) return false;\n  const stripped = stripHoverTooltipBlocks(carousel);\n  return (\n    /<\\/button>[\\s\\S]{0,600}col\\.label/.test(stripped) ||\n    /dangerouslySetInnerHTML[\\s\\S]{0,80}col\\.label/.test(stripped)\n  );\n}\n\nfunction csatNaHeaderGapWhenAnchors(content: string): boolean {\n  if (!/scaleAnchorLabels/.test(content) || !/hasNotApplicable/.test(content)) return false;\n\n  const showLabelsBlock = content.match(/showLabels[\\s\\S]{0,2500}/);\n  if (!showLabelsBlock) return false;\n\n  const block = showLabelsBlock[0];\n  const reservesNaSlot = /hasNotApplicable[\\s\\S]{0,120}flexShrink:\\s*0/.test(block);\n  const hasNaHeaderText = /['\"]N\\/A['\"]|Not Applicable|>\\s*N\\/A\\s*</.test(block);\n  return reservesNaSlot && !hasNaHeaderText;\n}\n\nfunction likertBipolarStructureWeak(content: string): boolean {\n  if (!/oppositeStatementText/.test(content)) return true;\n  if (/flex-1|flex:\\s*1\\b|flex:\\s*['\"]1['\"]|w-1\\/4/.test(content)) return false;\n  if (/0\\s*0\\s*25%|flex:\\s*isBipolar/.test(content)) {\n    return bipolarGridOnlyWithoutMiddleFlex(content);\n  }\n  return true;\n}\n\n/** Bipolar using grid `0 0 25%` without a flex-1 middle scale zone. */\nfunction bipolarGridOnlyWithoutMiddleFlex(content: string): boolean {\n  if (!/0\\s*0\\s*25%/.test(content)) return false;\n  return !/flex-1|flex:\\s*1\\b|flex:\\s*['\"]1['\"]/.test(content);\n}\n\nfunction csatNaInGridLoop(content: string): boolean {\n  if (/nonNaScaleColumns/.test(content)) return false;\n  return /scaleColumns\\.map/.test(content);\n}\n\nfunction ratingGraphicsUsesNumericIndex(content: string): boolean {\n  if (!/isGraphics|displayStyle\\s*===\\s*['\"]graphics['\"]/.test(content)) return false;\n  if (!/CustomSliderTrack/.test(content)) return false;\n  return (\n    /typeof\\s+\\w+\\s*===\\s*['\"]number['\"]/.test(content) ||\n    /value=\\{\\s*\\w+\\s*\\}/.test(content) && /rowAnswers\\[|answers\\[/.test(content) && !/findIndex/.test(content)\n  );\n}\n\nfunction graphicsLabelsInsideStatementLoop(content: string): boolean {\n  if (!/isGraphics|displayStyle\\s*===\\s*['\"]graphics['\"]/.test(content)) return false;\n  if (/GraphicsColumnLabelsRow/.test(content)) {\n    return /statementRows\\.map[\\s\\S]{0,2500}GraphicsColumnLabelsRow/.test(content);\n  }\n  return /statementRows\\.map[\\s\\S]{0,2000}scaleColumns\\.map[\\s\\S]{0,1200}(col\\.label|dangerouslySetInnerHTML)/.test(\n    content,\n  );\n}\n\nfunction matrixScaleFlexOnlyWithoutGrid(content: string): boolean {\n  const hasGrid =\n    /gridTemplateColumns/.test(content) ||\n    /repeat\\s*\\(\\s*\\$\\{?\\s*m\\s*\\}?/.test(content) ||\n    /repeat\\s*\\([^)]*,\\s*1fr\\s*\\)/.test(content);\n  if (hasGrid) return false;\n  const hasFlexCells =\n    /(?:className=['\"][^'\"]*gap-|gap:\\s*\\d+|justify-between|justifyContent:\\s*['\"]space-between['\"])/.test(\n      content,\n    );\n  const hasCellLoop = /scaleColumns\\.map|gridCols\\.map|nonNaScaleColumns\\(/.test(content);\n  return hasFlexCells && hasCellLoop;\n}\n\nfunction pushAutoFitIssue(\n  issues: string[],\n  name: string,\n  variantId: string | undefined,\n  strict: boolean,\n): void {\n  const msg = variantId\n    ? `Matrix carousel parity (${variantId}): auto-fit minmax in index map — use shared gridTemplateColumns — see layout-cookbook/shared.md`\n    : `Matrix carousel parity: auto-fit minmax in ${name} — header/cell index map may drift — see layout-cookbook/shared.md`;\n  if (strict) {\n    issues.push(msg);\n  } else {\n    issues.push(`${MATRIX_NEAR_MISS_PREFIX} ${msg}`);\n  }\n}\n\nfunction likertCarouselLacksBipolar(content: string): boolean {\n  const carousel = extractFunctionBody(content, 'LikertMatrixCarouselLayout');\n  if (!carousel) return false;\n  return !/oppositeStatementText|isBipolar/.test(carousel);\n}\n\nfunction matrixFileHasAutoFitMinmax(content: string): boolean {\n  return /auto-fit\\s+minmax|repeat\\s*\\(\\s*auto-fit/i.test(content);\n}\n\nfunction carouselMissingNavSignals(content: string): boolean {\n  if (!/Carousel|gridLayout\\s*===\\s*['\"]carousel['\"]/.test(content)) return false;\n  return !/activeCarouselIndex|setActiveCarousel|Prev|Next|\\d+\\s*\\/\\s*\\d+|carouselIndex/i.test(\n    content,\n  );\n}\n\nexport const MATRIX_NEAR_MISS_PREFIX = 'NEAR-MISS:';\n\nexport function isMatrixLayoutNearMiss(issue: string): boolean {\n  return issue.startsWith(MATRIX_NEAR_MISS_PREFIX);\n}\n\nexport function partitionMatrixLayoutIssues(issues: string[]): {\n  blocking: string[];\n  nearMisses: string[];\n} {\n  const blocking: string[] = [];\n  const nearMisses: string[] = [];\n  for (const issue of issues) {\n    if (isMatrixLayoutNearMiss(issue)) nearMisses.push(issue);\n    else blocking.push(issue);\n  }\n  return { blocking, nearMisses };\n}\n\nfunction readMatrixFileContents(projectRoot: string): Map<string, string> {\n  const out = new Map<string, string>();\n  for (const file of collectSourceFiles(projectRoot)) {\n    const basename = path.basename(file);\n    if (!(MATRIX_RELATED_FILES as readonly string[]).includes(basename)) continue;\n    out.set(basename, fs.readFileSync(file, 'utf8'));\n  }\n  return out;\n}\n\nfunction questionDispatcherContent(projectRoot: string): string {\n  const rel = findFirstExisting(projectRoot, QUESTION_CANDIDATES);\n  if (!rel) return '';\n  return fs.readFileSync(path.join(projectRoot, rel), 'utf8');\n}\n\nexport interface ScanMatrixLayoutOptions {\n  /** When true, index-map anti-patterns fail instead of NEAR-MISS (HOOK 3 / verify-layout). */\n  strict?: boolean;\n}\n\nexport function scanMatrixLayoutIssues(\n  projectRoot: string,\n  options: ScanMatrixLayoutOptions = {},\n): string[] {\n  const strict = options.strict ?? false;\n  const issues: string[] = [];\n  const files = readMatrixFileContents(projectRoot);\n  if (files.size === 0) return issues;\n\n  const matrixBlob = [...files.entries()]\n    .map(([name, content]) => `// ${name}\\n${content}`)\n    .join('\\n');\n\n  for (const [name, content] of files) {\n    if ((MATRIX_SCALE_FILES as readonly string[]).includes(name)) {\n      if (!/<select[\\s>]/i.test(content) && !/<details[\\s>]/i.test(content)) continue;\n      issues.push(\n        `${name}: matrix dropdown must use custom MatrixDropdown — no native <select> or <details>`,\n      );\n    }\n  }\n\n  const variants = readMatrixVariantsFromPlan(projectRoot);\n  const hasBipolar = variants.some(\n    (r) => r.type === 'CFM_MATRIX' && /bipolar/i.test(r.statementLayout),\n  );\n  const hasTranspose = variants.some((r) => /true/i.test(r.transposeTable));\n  const hasRatingGraphics = variants.some(\n    (r) => r.type === 'RATING_MATRIX' && /graphics/i.test(r.displayStyle),\n  );\n  const hasDropdownStyle = variants.some((r) => {\n    if (r.type === 'CFM_MATRIX') {\n      return /dropdown/i.test(r.gridLayout);\n    }\n    return /dropdown|selectbox/i.test(r.displayStyle);\n  });\n\n  if (hasBipolar) {\n    const likert = files.get('LikertMatrixScale.tsx');\n    if (likert && likertBipolarStructureWeak(likert)) {\n      issues.push(\n        'Matrix bipolar layout: LikertMatrixScale.tsx — 3-zone row with oppositeStatementText in right column (see layout-cookbook/cfm_matrix.md)',\n      );\n    }\n    if (likert && likertCarouselLacksBipolar(likert)) {\n      issues.push(\n        `${MATRIX_NEAR_MISS_PREFIX} Matrix bipolar layout: carousel branch lacks bipolar 3-zone — see layout-cookbook/shared.md`,\n      );\n    }\n  }\n\n  if (hasTranspose) {\n    if (!/transposeTable/.test(matrixBlob)) {\n      issues.push(\n        'Matrix scale components: §3c has transposeTable — branch with swapped row/col iteration (see layout-cookbook.md)',\n      );\n    }\n  }\n\n  if (hasRatingGraphics) {\n    const csat = files.get('CsatMatrixScale.tsx') ?? '';\n    if (!/CustomSliderTrack/.test(csat)) {\n      issues.push(\n        'CsatMatrixScale.tsx: §3c has RATING_MATRIX graphics — use CustomSliderTrack per row, not cell button grid',\n      );\n    }\n    if (csat && ratingGraphicsUsesNumericIndex(csat)) {\n      issues.push(\n        'Matrix graphics value: CsatMatrixScale.tsx must use findIndex from stored column id — not typeof number or raw answer index — see layout-cookbook/rating_matrix.md',\n      );\n    }\n    if (csat && graphicsLabelsInsideStatementLoop(csat)) {\n      issues.push(\n        'Matrix graphics labels: CsatMatrixScale.tsx must render GraphicsColumnLabelsRow once outside statementRows.map — see layout-cookbook/rating_matrix.md',\n      );\n    }\n    const question = questionDispatcherContent(projectRoot);\n    if (question && /RATING_MATRIX[\\s\\S]{0,400}SliderMatrixScale/.test(question)) {\n      issues.push(\n        'Question.tsx: RATING_MATRIX graphics must use CsatMatrixScale + CustomSliderTrack — not SliderMatrixScale',\n      );\n    }\n  }\n\n  if (hasDropdownStyle) {\n    if (!/MatrixDropdown/.test(matrixBlob)) {\n      issues.push(\n        'Matrix components: §3c has dropdown/selectbox displayStyle — use MatrixDropdown per row',\n      );\n    }\n  }\n\n  const scaleValuesContent = readScaleValuesContent(projectRoot);\n  const scaleValuesHasNonNa = /nonNaScaleColumns/.test(scaleValuesContent);\n  const matrixScalesUseNonNa = [...files.entries()]\n    .filter(([name]) => (MATRIX_SCALE_FILES as readonly string[]).includes(name))\n    .some(([, content]) => /nonNaScaleColumns/.test(content));\n\n  if (!scaleValuesHasNonNa || !matrixScalesUseNonNa) {\n    issues.push(\n      'Matrix label index: nonNaScaleColumns required in scaleValues.ts and matrix scale components — see layout-cookbook/shared.md',\n    );\n  }\n\n  const likertContent = files.get('LikertMatrixScale.tsx') ?? '';\n  const csatContent = files.get('CsatMatrixScale.tsx') ?? '';\n  if (likertContent && likertMissingNonNaScaleColumns(likertContent)) {\n    issues.push(\n      'Matrix label index: LikertMatrixScale.tsx must use nonNaScaleColumns for gridCols/scaleColumns — see layout-cookbook/shared.md',\n    );\n  }\n  if (likertContent && likertNaInGridLoop(likertContent)) {\n    issues.push(\n      'Matrix N/A trailing: LikertMatrixScale.tsx maps full scaleColumns/gridCols — use nonNaScaleColumns + trailing N/A slot — see layout-cookbook/cfm_matrix.md',\n    );\n  }\n  if (csatContent && csatNaInGridLoop(csatContent)) {\n    issues.push(\n      'Matrix N/A trailing: CsatMatrixScale.tsx maps full scaleColumns — use nonNaScaleColumns + trailing N/A slot — see layout-cookbook/csat_matrix.md',\n    );\n  }\n\n  const hasMultiColumnMatrix = variants.some(\n    (v) => v.type !== 'SLIDER_MATRIX' && !/graphics/i.test(v.displayStyle),\n  );\n\n  for (const [name, content] of files) {\n    if (!(MATRIX_SCALE_FILES as readonly string[]).includes(name)) continue;\n    if (matrixFileHasAutoFitMinmax(content)) {\n      const carouselVariant = variants.find(\n        (v) => /carousel/i.test(v.gridLayout) && matrixScaleFileForType(v.type) === name,\n      );\n      if (carouselVariant) {\n        pushAutoFitIssue(issues, name, carouselVariant.questionId, strict);\n      } else {\n        issues.push(\n          `${MATRIX_NEAR_MISS_PREFIX} Matrix carousel parity: auto-fit minmax in ${name} — header/cell index map may drift — see layout-cookbook/shared.md`,\n        );\n      }\n    }\n    if (strict && hasMultiColumnMatrix && matrixScaleFlexOnlyWithoutGrid(content)) {\n      issues.push(\n        `Matrix grid skeleton: ${name} uses flex gap/justify-between without gridTemplateColumns repeat(m, 1fr) — see layout-cookbook/shared.md`,\n      );\n    }\n    if (carouselMissingNavSignals(content)) {\n      issues.push(\n        `${MATRIX_NEAR_MISS_PREFIX} Matrix carousel chrome: ${name} missing row navigation/position indicator — see layout-cookbook/shared.md`,\n      );\n    }\n  }\n\n  if (hasBipolar && strict) {\n    const likert = files.get('LikertMatrixScale.tsx');\n    if (likert && bipolarGridOnlyWithoutMiddleFlex(likert)) {\n      issues.push(\n        'Matrix bipolar layout: LikertMatrixScale.tsx uses grid 0 0 25% without flex-1 middle zone — use 25% | flex-1 | 25% — see layout-cookbook/cfm_matrix.md',\n      );\n    }\n  }\n\n  if (csatContent && csatCarouselDuplicateLabels(csatContent)) {\n    issues.push(\n      'Matrix label index: CsatMatrixScale carousel renders col.label below emoji/star/numbered cells — see layout-cookbook/csat_matrix.md',\n    );\n  }\n  if (csatContent && csatNaHeaderGapWhenAnchors(csatContent)) {\n    issues.push(\n      'Matrix N/A trailing: CsatMatrixScale scaleAnchorLabels row reserves N/A spacer without N/A header text — see layout-cookbook/csat_matrix.md',\n    );\n  }\n  if (csatContent && numberedCellUsesColLabel(csatContent)) {\n    issues.push(\n      'Matrix label index: CsatMatrixScale numbered cells must use displayIdx+1 badge — not col.label in cell/carousel — see layout-cookbook/csat_matrix.md',\n    );\n  }\n  if (\n    likertContent &&\n    /oppositeStatementText/.test(likertContent) &&\n    !/0\\s*0\\s*25%|flex:\\s*isBipolar/.test(likertContent)\n  ) {\n    issues.push(\n      'Matrix bipolar layout: LikertMatrixScale.tsx references oppositeStatementText but lacks 3-zone right column — see layout-cookbook/cfm_matrix.md',\n    );\n  }\n\n  for (const variant of variants) {\n    if (parseTruthyFlag(variant.hasNotApplicableOption)) {\n      const hasNaPattern =\n        /hasNotApplicableOption/.test(matrixBlob) &&\n        (/'N\\/A'|Not Applicable|hasNotApplicableOption\\s*&&/.test(matrixBlob));\n      if (!hasNaPattern) {\n        issues.push(\n          `Matrix N/A trailing (${variant.questionId}): hasNA in §3c — N/A slot in header and every row — see layout-cookbook/csat_matrix.md`,\n        );\n      }\n    }\n\n    if (/carousel/i.test(variant.gridLayout)) {\n      const scaleFile = matrixScaleFileForType(variant.type);\n      const scaleContent = scaleFile ? files.get(scaleFile) ?? '' : '';\n      const hasCarouselBranch =\n        /carousel|Carousel|gridLayout\\s*===\\s*['\"]carousel['\"]/.test(scaleContent);\n      if (!hasCarouselBranch) {\n        issues.push(\n          `Matrix carousel parity (${variant.questionId}): §3c gridLayout=carousel — header + cell loops share same column index map — see layout-cookbook/cfm_matrix.md`,\n        );\n      }\n    }\n\n    if (/numbered/i.test(variant.displayStyle) && variant.type !== 'SLIDER_MATRIX') {\n      const csat = files.get('CsatMatrixScale.tsx') ?? '';\n      if (numberedCellUsesColLabel(csat)) {\n        issues.push(\n          `Matrix label index (${variant.questionId}): numbered cells must use displayIdx+1 badge — not col.label — see layout-cookbook/csat_matrix.md`,\n        );\n      }\n      if (\n        csat &&\n        /isStandardRadio/.test(csat) &&\n        !/isNumbered/.test(csat) &&\n        !/CsatMatrixGrid/.test(csat)\n      ) {\n        issues.push(\n          `Matrix label index (${variant.questionId}): numbered §3c must route to grid/carousel with isNumbered — not vertical list only — see layout-cookbook/csat_matrix.md`,\n        );\n      }\n    }\n  }\n\n  const likertContentForAnchor = files.get('LikertMatrixScale.tsx') ?? '';\n  if (anchorUsesJustifyBetweenWithoutAbsolute(csatContent)) {\n    issues.push(\n      'Matrix label index: scaleAnchorLabels anchor row uses justify-between without position:absolute — use % anchors — see layout-cookbook/shared.md',\n    );\n  }\n  if (anchorUsesJustifyBetweenWithoutAbsolute(likertContentForAnchor)) {\n    issues.push(\n      'Matrix label index: scaleAnchorLabels anchor row uses justify-between without position:absolute — use % anchors — see layout-cookbook/shared.md',\n    );\n  }\n\n  return issues;\n}\n\nexport function scanMatrixLayoutIssuesStrict(projectRoot: string): string[] {\n  return scanMatrixLayoutIssues(projectRoot, { strict: true });\n}\n\n/**\n * Fail-closed guard for the §3c enforcement chain.\n *\n * The structural matrix checks (bipolar / transpose / graphics / dropdown) are all derived\n * from `implementation_plan.md` §3c. If matrix component files exist but §3c is empty, those\n * checks silently no-op. At the Phase-6 gate (full `verify-build`, run AFTER `sync-from-fetch`)\n * an empty §3c means the agent skipped `sync-from-fetch` or never populated the inventory — so\n * the layout checks never ran. Surface that as a blocking issue instead of passing silently.\n *\n * Only meaningful post-sync: do NOT call this from `--fast` (which legitimately runs before\n * `sync-from-fetch`).\n */\nexport function scanMatrixInventoryGap(projectRoot: string): string[] {\n  const files = readMatrixFileContents(projectRoot);\n  if (files.size === 0) return [];\n\n  const variants = readMatrixVariantsFromPlan(projectRoot);\n  if (variants.length > 0) return [];\n\n  return [\n    'Matrix component files exist but implementation_plan.md §3c is empty — run `npx cfm-sdk sync-from-fetch` and fill §3c, then re-verify (matrix layout checks depend on §3c). See layout-cookbook.md.',\n  ];\n}\n\nexport function scanMatrixStatementIssues(projectRoot: string): string[] {\n  const issues: string[] = [];\n\n  for (const file of collectSourceFiles(projectRoot)) {\n    const basename = path.basename(file);\n    if (!(MATRIX_SCALE_FILES as readonly string[]).includes(basename)) continue;\n\n    const content = fs.readFileSync(file, 'utf8');\n    const rel = path.relative(projectRoot, file);\n    if (!/shouldShowMatrixStatementLabels/.test(content)) {\n      issues.push(\n        `${rel}: must call shouldShowMatrixStatementLabels(question) for single- vs multi-row statement labels`,\n      );\n    }\n  }\n\n  return issues;\n}\n\nexport function readMcqOtherFlagFromPlan(projectRoot: string): boolean | null {\n  const planPath = path.join(projectRoot, 'implementation_plan.md');\n  if (!fs.existsSync(planPath)) return null;\n\n  const content = fs.readFileSync(planPath, 'utf8');\n  const match = content.match(/\\*\\*MCQ Other option in fetch:\\*\\*\\s*(yes|no)/i);\n  if (!match) return null;\n  return match[1].toLowerCase() === 'yes';\n}\n\nexport function readMcqOtherPickersFlagFromPlan(projectRoot: string): boolean | null {\n  const planPath = path.join(projectRoot, 'implementation_plan.md');\n  if (!fs.existsSync(planPath)) return null;\n\n  const content = fs.readFileSync(planPath, 'utf8');\n  const match = content.match(/\\*\\*MCQ Other phone\\/postal\\/date pickers:\\*\\*\\s*(yes|no)/i);\n  if (!match) return null;\n  return match[1].toLowerCase() === 'yes';\n}\n\nfunction stripLineComments(content: string): string {\n  return content\n    .split('\\n')\n    .map((line) => line.replace(/\\/\\/.*$/, '').replace(/\\/\\*[\\s\\S]*?\\*\\//g, ''))\n    .join('\\n');\n}\n\nfunction findComponentFile(projectRoot: string, basename: string): string | null {\n  for (const file of collectSourceFiles(projectRoot)) {\n    if (path.basename(file) === basename) return file;\n  }\n  return null;\n}\n\nfunction readPackageJsonContent(projectRoot: string): string {\n  const pkgPath = path.join(projectRoot, 'package.json');\n  if (!fs.existsSync(pkgPath)) return '';\n  return fs.readFileSync(pkgPath, 'utf8');\n}\n\n/** FAIL when CFM component branches on displayStyle (field does not exist on type). */\nexport function scanLikertDisplayStyleMisuse(projectRoot: string): string[] {\n  const likertRel = findFirstExisting(projectRoot, [\n    'src/components/LikertMatrixScale.tsx',\n    'components/LikertMatrixScale.tsx',\n    'app/components/LikertMatrixScale.tsx',\n  ]);\n  if (!likertRel) return [];\n\n  const content = fs.readFileSync(path.join(projectRoot, likertRel), 'utf8');\n  const stripped = stripLineComments(content);\n  if (/\\bdisplayStyle\\b/.test(stripped)) {\n    return [\n      `${likertRel}: CFM_MATRIX has no displayStyle — use question.gridLayout === 'dropdown' — see field-binding-map.md`,\n    ];\n  }\n  return [];\n}\n\n/** FAIL when CsatStarIcons uses NPS-style half-fill anti-pattern. */\nexport function scanCsatStarIconAntiPattern(projectRoot: string): string[] {\n  const variants = readMatrixVariantsFromPlan(projectRoot);\n  const hasStar =\n    variants.some((v) => v.type === 'CSAT_MATRIX' && /star/i.test(v.displayStyle)) ||\n    variants.length === 0;\n\n  if (!hasStar) return [];\n\n  const iconsPath = findComponentFile(projectRoot, 'icons.tsx');\n  if (!iconsPath) return [];\n\n  const content = fs.readFileSync(iconsPath, 'utf8');\n  if (/index\\s*<\\s*Math\\.ceil|ceil\\s*\\(\\s*total\\s*\\/\\s*2\\s*\\)/.test(content)) {\n    return [\n      `${path.relative(projectRoot, iconsPath)}: CsatStarIcons must use filled === selected only — not NPS half-fill — see client-lib-folder.md`,\n    ];\n  }\n  return [];\n}\n\n/** FAIL when fetch requires MCQ Other pickers but client uses plain inputs. */\nexport function scanMcqOtherPickerIssues(projectRoot: string): string[] {\n  if (readMcqOtherPickersFlagFromPlan(projectRoot) !== true) return [];\n\n  const issues: string[] = [];\n  const countryRel = findFirstExisting(projectRoot, [\n    'src/components/McqOtherCountrySelect.tsx',\n    'components/McqOtherCountrySelect.tsx',\n  ]);\n  const dateRel = findFirstExisting(projectRoot, [\n    'src/components/McqOtherDatePicker.tsx',\n    'components/McqOtherDatePicker.tsx',\n  ]);\n  const inputRel = findFirstExisting(projectRoot, [\n    'src/components/McqOtherInput.tsx',\n    'components/McqOtherInput.tsx',\n  ]);\n\n  if (!countryRel) {\n    issues.push(\n      'McqOtherCountrySelect.tsx missing — survey has PHONE_NUMBER/POSTAL_CODE Other — see 21-mcq-other-input.md',\n    );\n  }\n  if (!dateRel) {\n    issues.push('McqOtherDatePicker.tsx missing — survey has DATE Other — see 21-mcq-other-input.md');\n  }\n\n  const pkg = readPackageJsonContent(projectRoot);\n  if (!/react-international-phone/.test(pkg)) {\n    issues.push('package.json: missing react-international-phone — required for MCQ Other phone/postal');\n  }\n  if (!/react-datepicker/.test(pkg)) {\n    issues.push('package.json: missing react-datepicker — required for MCQ Other date');\n  }\n\n  if (inputRel) {\n    const inputContent = fs.readFileSync(path.join(projectRoot, inputRel), 'utf8');\n    if (/type\\s*=\\s*[\"']date[\"']/i.test(inputContent)) {\n      issues.push(`${inputRel}: DATE Other must use McqOtherDatePicker — not type=\"date\"`);\n    }\n    if (/<select[\\s>]/i.test(inputContent) && /country/i.test(inputContent)) {\n      issues.push(\n        `${inputRel}: use McqOtherCountrySelect for country — not plain <select> — see layout-cookbook/mcq.md`,\n      );\n    }\n  }\n\n  return issues;\n}\n\nfunction parseAnchorLabelCount(value: string | undefined): number {\n  if (!value || value.trim() === '—') return 0;\n  const n = parseInt(value.trim(), 10);\n  return Number.isFinite(n) && n > 0 ? n : 0;\n}\n\nfunction surveyPlanHasType(projectRoot: string, type: string): boolean {\n  const planPath = path.join(projectRoot, 'implementation_plan.md');\n  if (!fs.existsSync(planPath)) return false;\n  const content = fs.readFileSync(planPath, 'utf8');\n  const section = content.split('## 3b.')[1]?.split('##')[0] ?? content;\n  return (\n    new RegExp(`\\\\|\\\\s*${type}\\\\s*\\\\|`).test(section) ||\n    section.includes(`\\`${type}\\``) ||\n    section.includes(type)\n  );\n}\n\nfunction extractLikertCarouselBlock(content: string): string {\n  const fn = content.match(/function\\s+LikertMatrixCarousel[\\s\\S]*?(?=\\nfunction\\s|\\nexport\\s|$)/);\n  return fn?.[0] ?? '';\n}\n\n/** Carousel shows stmt + inline radios but no scale-column header row (Q13). */\nfunction likertCarouselLacksScaleHeader(content: string): boolean {\n  const block = extractLikertCarouselBlock(content);\n  const searchBlock =\n    block ||\n    (content.match(/gridLayout\\s*===\\s*['\"]carousel['\"][\\\\s\\\\S]{0,4000}/)?.[0] ?? '');\n  if (!searchBlock) return false;\n  if (/renderCarouselHeader|CarouselHeaderRow|renderHeaderRow|HeaderRow/.test(searchBlock)) {\n    return false;\n  }\n  if (!/scaleColumns\\.map/.test(searchBlock)) return true;\n  const stmtIdx = searchBlock.search(/statementText|row\\.statementText/);\n  const firstMap = searchBlock.search(/scaleColumns\\.map/);\n  if (stmtIdx >= 0 && firstMap >= 0 && firstMap < stmtIdx) {\n    return !/col\\.label|\\.label/.test(searchBlock.slice(firstMap, stmtIdx + 300));\n  }\n  return stmtIdx < 0 || firstMap > stmtIdx;\n}\n\n/** FAIL when heatmap click handler lacks maxClicksAllowed guard. */\nexport function scanHeatmapMaxClicksIssues(projectRoot: string): string[] {\n  const heatmapRel = findFirstExisting(projectRoot, [\n    'src/components/HeatmapScale.tsx',\n    'components/HeatmapScale.tsx',\n  ]);\n  if (!heatmapRel && !surveyPlanHasType(projectRoot, 'HEATMAP')) return [];\n\n  if (!heatmapRel) {\n    return ['HeatmapScale.tsx missing — survey has HEATMAP — see layout-cookbook/heatmap.md'];\n  }\n\n  const content = fs.readFileSync(path.join(projectRoot, heatmapRel), 'utf8');\n  const issues: string[] = [];\n  if (!/maxClicksAllowed/.test(content)) {\n    issues.push(`${heatmapRel}: must enforce question.maxClicksAllowed — see layout-cookbook/heatmap.md`);\n  } else if (\n    !/spots\\.length\\s*<\\s*question\\.maxClicksAllowed|maxClicksAllowed.*spots\\.length|spots\\.length\\s*>=\\s*question\\.maxClicksAllowed/.test(\n      content,\n    )\n  ) {\n    issues.push(\n      `${heatmapRel}: handleClick must guard new spots with spots.length < question.maxClicksAllowed — see layout-cookbook/heatmap.md`,\n    );\n  }\n  if (/maxClicksAllowed/.test(content) && !/question\\.maxClicksAllowed/.test(content)) {\n    issues.push(\n      `${heatmapRel}: read maxClicksAllowed from question — not hardcoded — see agent-per-type-verification/heatmap.md`,\n    );\n  }\n  return issues;\n}\n\n/** FAIL when §3c CFM bipolar has anchors but Likert lacks scaleAnchorLabels header wiring. */\nexport function scanBipolarAnchorHeaderIssues(projectRoot: string): string[] {\n  const variants = readMatrixVariantsFromPlan(projectRoot);\n  const needsHeader = variants.some(\n    (v) =>\n      v.type === 'CFM_MATRIX' &&\n      /bipolar/i.test(v.statementLayout) &&\n      parseAnchorLabelCount(v.scaleAnchorLabelCount) > 0,\n  );\n  if (!needsHeader) return [];\n\n  const likertRel = findFirstExisting(projectRoot, [\n    'src/components/LikertMatrixScale.tsx',\n    'components/LikertMatrixScale.tsx',\n  ]);\n  if (!likertRel) {\n    return ['LikertMatrixScale.tsx missing — CFM bipolar with anchors in §3c — see cfm_matrix.md'];\n  }\n\n  const content = fs.readFileSync(path.join(projectRoot, likertRel), 'utf8');\n  const issues: string[] = [];\n  if (!/scaleAnchorLabels/.test(content)) {\n    issues.push(\n      `${likertRel}: §3c bipolar with anchors — render scaleAnchorLabels header row with 25% spacers — see cfm_matrix.md`,\n    );\n  }\n  if (anchorUsesJustifyBetweenWithoutAbsolute(content)) {\n    issues.push(\n      `${likertRel}: bipolar anchor row must use position:absolute + % — not justify-between — see scale-position-math.md`,\n    );\n  }\n  return issues;\n}\n\n/** FAIL when §3c carousel CFM lacks scale-column header inside carousel card. */\nexport function scanCarouselScaleHeaderIssues(projectRoot: string): string[] {\n  const variants = readMatrixVariantsFromPlan(projectRoot);\n  const hasCfmCarousel = variants.some(\n    (v) => v.type === 'CFM_MATRIX' && /carousel/i.test(v.gridLayout),\n  );\n  if (!hasCfmCarousel) return [];\n\n  const likertRel = findFirstExisting(projectRoot, [\n    'src/components/LikertMatrixScale.tsx',\n    'components/LikertMatrixScale.tsx',\n  ]);\n  if (!likertRel) return [];\n\n  const content = fs.readFileSync(path.join(projectRoot, likertRel), 'utf8');\n  if (likertCarouselLacksScaleHeader(content)) {\n    return [\n      `${likertRel}: CFM carousel (§3c) — render scaleColumns header row inside card before statement — see cfm_matrix.md (Q13)`,\n    ];\n  }\n  return [];\n}\n\n/** FAIL when RATING graphics uses flex distribute for labels instead of columnPercent map. */\nexport function scanRatingGraphicsIndexMapIssues(projectRoot: string): string[] {\n  const variants = readMatrixVariantsFromPlan(projectRoot);\n  const hasGraphics = variants.some(\n    (v) => v.type === 'RATING_MATRIX' && /graphics/i.test(v.displayStyle),\n  );\n  if (!hasGraphics) return [];\n\n  const csatRel = findFirstExisting(projectRoot, [\n    'src/components/CsatMatrixScale.tsx',\n    'components/CsatMatrixScale.tsx',\n  ]);\n  if (!csatRel) return [];\n\n  const content = fs.readFileSync(path.join(projectRoot, csatRel), 'utf8');\n  const issues: string[] = [];\n  const graphicsBlock =\n    content.match(/isGraphics[\\s\\S]{0,6000}/)?.[0] ??\n    content.match(/displayStyle\\s*===\\s*['\"]graphics['\"][\\\\s\\\\S]{0,6000}/)?.[0] ??\n    '';\n\n  if (graphicsBlock) {\n    if (\n      (/justify-around|justify-between|justifyContent:\\s*['\"]space-between['\"]/.test(graphicsBlock) ||\n        /justifyContent:\\s*['\"]space-around['\"]/.test(graphicsBlock)) &&\n      !/columnPercent|0\\.5\\s*\\/\\s*m|translateX\\(-50%\\)/.test(graphicsBlock)\n    ) {\n      issues.push(\n        `${csatRel}: RATING graphics labels must use columnPercent + absolute % — not flex distribute — see rating_matrix.md (Q22)`,\n      );\n    }\n  }\n\n  const trackRel = findFirstExisting(projectRoot, [\n    'src/components/CustomSliderTrack.tsx',\n    'components/CustomSliderTrack.tsx',\n  ]);\n  if (trackRel) {\n    const track = fs.readFileSync(path.join(projectRoot, trackRel), 'utf8');\n    if (/tickLabels[\\s\\S]{0,400}<span|tickLabels[\\s\\S]{0,400}<div/.test(track)) {\n      issues.push(\n        `${trackRel}: tickLabels are tooltip-only — do not render visible label DOM on track — see custom-slider-track.md`,\n      );\n    }\n  }\n\n  return issues;\n}\n\n/** FAIL when SLIDER_MATRIX has both anchors and ticks in one header layer. */\nexport function scanSliderDualHeaderIssues(projectRoot: string): string[] {\n  if (!surveyPlanHasType(projectRoot, 'SLIDER_MATRIX')) return [];\n\n  const sliderRel = findFirstExisting(projectRoot, [\n    'src/components/SliderMatrixScale.tsx',\n    'components/SliderMatrixScale.tsx',\n  ]);\n  if (!sliderRel) return [];\n\n  const content = fs.readFileSync(path.join(projectRoot, sliderRel), 'utf8');\n  const hasAnchors = /scaleAnchorLabels/.test(content);\n  const hasTicks = /ticks\\.marks|tickValues|renderHeaderRow/.test(content);\n  if (!hasAnchors || !hasTicks) return [];\n\n  if (/bottom-0[\\s\\S]{0,800}top-0|top-0[\\s\\S]{0,800}bottom-0/.test(content)) {\n    return [\n      `${sliderRel}: dual header (anchors + ticks) must use two stacked rows — not bottom-0 + top-0 in one layer — see slider_matrix.md (Q11)`,\n    ];\n  }\n  if (/h-10|height:\\s*['\"]?40|height:\\s*40/.test(content) && /scaleAnchorLabels/.test(content) && /ticks/.test(content)) {\n    const headerBlock = content.match(/renderHeaderRow[\\s\\S]{0,2500}/)?.[0] ?? content;\n    const rowContainers = (headerBlock.match(/relative|position:\\s*['\"]relative['\"]/g) ?? []).length;\n    if (rowContainers < 2 && !/header-stack|tick-row|anchor-row/i.test(headerBlock)) {\n      return [\n        `${sliderRel}: when both scaleAnchorLabels and ticks.marks — use two header rows (tick badges then anchors) — see slider_matrix.md`,\n      ];\n    }\n  }\n  return [];\n}\n\n/** FAIL when SLIDER_MATRIX renders tick badges inside row loop track. */\nexport function scanSliderPerRowTickBadges(projectRoot: string): string[] {\n  if (!surveyPlanHasType(projectRoot, 'SLIDER_MATRIX')) return [];\n\n  const sliderRel = findFirstExisting(projectRoot, [\n    'src/components/SliderMatrixScale.tsx',\n    'components/SliderMatrixScale.tsx',\n  ]);\n  if (!sliderRel) return [];\n\n  const content = fs.readFileSync(path.join(projectRoot, sliderRel), 'utf8');\n  const rowLoop =\n    content.match(/statementRows\\.map[\\s\\S]{0,3500}/)?.[0] ??\n    content.match(/statementRows\\.map[\\s\\S]{0,3500}/)?.[0] ??\n    '';\n  if (!rowLoop) return [];\n\n  if (/CustomSliderTrack[\\s\\S]{0,800}ticks\\s*=/.test(rowLoop) || /tickValues\\.map[\\s\\S]{0,400}CustomSliderTrack/.test(rowLoop)) {\n    return [\n      `${sliderRel}: SLIDER_MATRIX — tick badges belong in common header once, not per-row CustomSliderTrack — see slider_matrix.md (Q11)`,\n    ];\n  }\n  if (/CustomSliderTrack[\\s\\S]{0,1200}tickLabels[\\s\\S]{0,400}<span|CustomSliderTrack[\\s\\S]{0,1200}tickLabels[\\s\\S]{0,400}<div/.test(rowLoop)) {\n    return [\n      `${sliderRel}: SLIDER_MATRIX — visible tick label DOM inside row track — use renderCommonTickHeader + trackOnly — see header-label-overlay.md`,\n    ];\n  }\n  return [];\n}\n\n/** FAIL when CustomSliderTrack renders tooltip DOM while parent matrix has common header. */\nexport function scanMatrixTrackTooltipDom(projectRoot: string): string[] {\n  const trackRel = findFirstExisting(projectRoot, [\n    'src/components/CustomSliderTrack.tsx',\n    'components/CustomSliderTrack.tsx',\n  ]);\n  if (!trackRel) return [];\n\n  const track = fs.readFileSync(path.join(projectRoot, trackRel), 'utf8');\n  const hasTooltipDom =\n    /tooltip|Tooltip/.test(track) &&\n    (/<span[\\s\\S]{0,200}tooltip|tooltip[\\s\\S]{0,400}<span|<div[\\s\\S]{0,200}tooltip|tooltip[\\s\\S]{0,400}<div/i.test(track) ||\n      /isHovered|isDragging/.test(track));\n  if (!hasTooltipDom) return [];\n\n  const parentFiles = [\n    'src/components/SliderMatrixScale.tsx',\n    'components/SliderMatrixScale.tsx',\n    'src/components/CsatMatrixScale.tsx',\n    'components/CsatMatrixScale.tsx',\n  ];\n  for (const rel of parentFiles) {\n    const abs = path.join(projectRoot, rel);\n    if (!fs.existsSync(abs)) continue;\n    const parent = fs.readFileSync(abs, 'utf8');\n    if (/renderHeaderRow|GraphicsColumnLabelsRow|renderCommonTickHeader|renderCommonHeader/.test(parent)) {\n      if (!/hideTooltip/.test(track) && !/hideTooltip/.test(parent)) {\n        return [\n          `${trackRel}: matrix parent ${rel} has common header — suppress in-track tooltip (hideTooltip) — see header-label-overlay.md`,\n        ];\n      }\n    }\n  }\n  return [];\n}\n\n/** FAIL when pointerLeave clears drag without pointer capture. */\nexport function scanCustomSliderPointerLeave(projectRoot: string): string[] {\n  const trackRel = findFirstExisting(projectRoot, [\n    'src/components/CustomSliderTrack.tsx',\n    'components/CustomSliderTrack.tsx',\n  ]);\n  if (!trackRel) return [];\n\n  const content = fs.readFileSync(path.join(projectRoot, trackRel), 'utf8');\n  const hasLeaveDeactivate =\n    /onPointerLeave|onMouseLeave/.test(content) &&\n    (/setIsDragging\\s*\\(\\s*false\\s*\\)|setActive\\s*\\(\\s*false\\s*\\)|setIsHovered\\s*\\(\\s*false\\s*\\)[\\s\\S]{0,80}setIsDragging/.test(content));\n  const hasCapture = /setPointerCapture|releasePointerCapture/.test(content);\n  if (hasLeaveDeactivate && !hasCapture) {\n    return [\n      `${trackRel}: use pointer capture on range input — do not deactivate drag on pointerLeave alone — see custom-slider-track.md`,\n    ];\n  }\n  return [];\n}\n\n/** FAIL when survey needs position helpers but scaleValues.ts lacks them. */\nexport function scanScaleValuesPositionHelpers(projectRoot: string): string[] {\n  const variants = readMatrixVariantsFromPlan(projectRoot);\n  const needsDiscrete = variants.some(\n    (v) => v.type === 'RATING_MATRIX' && /graphics/i.test(v.displayStyle),\n  );\n  const needsContinuous =\n    surveyPlanHasType(projectRoot, 'SLIDER_MATRIX') ||\n    variants.some((v) => v.type === 'CSAT_MATRIX' && /graphics/i.test(v.displayStyle));\n\n  if (!needsDiscrete && !needsContinuous) return [];\n\n  const scaleRel = findFirstExisting(projectRoot, [\n    'src/lib/surveyUi/scaleValues.ts',\n    'lib/surveyUi/scaleValues.ts',\n  ]);\n  if (!scaleRel) {\n    return ['lib/surveyUi/scaleValues.ts missing — add columnPercent and tickPercent — see scale-position-math.md'];\n  }\n\n  const content = fs.readFileSync(path.join(projectRoot, scaleRel), 'utf8');\n  const issues: string[] = [];\n  if (needsDiscrete && !/columnPercent|0\\.5\\s*\\/\\s*m/.test(content)) {\n    issues.push(`${scaleRel}: RATING/CSAT graphics needs columnPercent — see scale-position-math.md`);\n  }\n  if (needsContinuous && !/tickPercent|anchorLabelPercentContinuous/.test(content)) {\n    issues.push(`${scaleRel}: SLIDER_MATRIX needs tickPercent (and anchorLabelPercentContinuous when anchors) — see scale-position-math.md`);\n  }\n  return issues;\n}\n\nexport function scanLayoutFormatIssues(projectRoot: string): string[] {\n  return [...scanBipolarAnchorHeaderIssues(projectRoot), ...scanCarouselScaleHeaderIssues(projectRoot)];\n}\n\nexport function scanInteractionIssues(projectRoot: string): string[] {\n  return [\n    ...scanLikertDisplayStyleMisuse(projectRoot),\n    ...scanCsatStarIconAntiPattern(projectRoot),\n    ...scanMcqOtherPickerIssues(projectRoot),\n    ...scanHeatmapMaxClicksIssues(projectRoot),\n    ...scanRatingGraphicsIndexMapIssues(projectRoot),\n    ...scanSliderDualHeaderIssues(projectRoot),\n    ...scanSliderPerRowTickBadges(projectRoot),\n    ...scanMatrixTrackTooltipDom(projectRoot),\n    ...scanCustomSliderPointerLeave(projectRoot),\n    ...scanScaleValuesPositionHelpers(projectRoot),\n  ];\n}\n\nexport function scanMcqOtherIssues(projectRoot: string): string[] {\n  if (readMcqOtherFlagFromPlan(projectRoot) !== true) return [];\n\n  const questionRel = findFirstExisting(projectRoot, QUESTION_CANDIDATES);\n  if (!questionRel) {\n    return [\n      'Question.tsx missing — survey has MCQ Other options; author MCQ handler with MCQ_OTHER_TEXT_CHANGE',\n    ];\n  }\n\n  const content = fs.readFileSync(path.join(projectRoot, questionRel), 'utf8');\n  if (/MCQ_OTHER_TEXT_CHANGE|buildMcqOptionLevelKey/.test(content)) return [];\n\n  return [\n    `${questionRel}: survey has MCQ Other options — wire MCQ_OTHER_TEXT_CHANGE + buildMcqOptionLevelKey — see 02-radio.md`,\n  ];\n}\n\nexport interface SourceScanResult {\n  stubMatches: string[];\n  internalSdkImports: string[];\n  nextImports: string[];\n  introStartIssues: string[];\n  hardcodedStyleIssues: string[];\n  endPageCtaIssues: string[];\n  matrixStatementIssues: string[];\n  matrixLayoutIssues: string[];\n  mcqOtherIssues: string[];\n}\n\nexport function scanProjectSource(projectRoot: string): SourceScanResult {\n  const stubMatches: string[] = [];\n  const internalSdkImports: string[] = [];\n  const nextImports: string[] = [];\n\n  for (const file of collectSourceFiles(projectRoot)) {\n    const content = fs.readFileSync(file, 'utf8');\n    const rel = path.relative(projectRoot, file);\n\n    if (content.includes('not yet implemented')) {\n      stubMatches.push(`${rel}: stub placeholder text`);\n    }\n    if (/@explorer02\\/cfm-survey-sdk\\/src|@repo\\/sdk\\/src/.test(content)) {\n      internalSdkImports.push(`${rel}: internal SDK import`);\n    }\n    if (/from\\s+['\"]next\\//.test(content)) {\n      nextImports.push(`${rel}: stale next/* import`);\n    }\n  }\n\n  const introStartIssues = scanIntroStartIssues(projectRoot);\n  const hardcodedStyleIssues = scanHardcodedStyleIssues(projectRoot);\n  const endPageCtaIssues = scanEndPageCtaIssues(projectRoot);\n  const matrixStatementIssues = scanMatrixStatementIssues(projectRoot);\n  const matrixLayoutIssues = scanMatrixLayoutIssues(projectRoot);\n  const mcqOtherIssues = scanMcqOtherIssues(projectRoot);\n\n  return {\n    stubMatches,\n    internalSdkImports,\n    nextImports,\n    introStartIssues,\n    hardcodedStyleIssues,\n    endPageCtaIssues,\n    matrixStatementIssues,\n    matrixLayoutIssues,\n    mcqOtherIssues,\n  };\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { colors } from './const';\nimport { resolveSdkPackageName } from './detect-framework';\nimport { runCommandSync } from './utils/exec';\n\nconst c = colors;\n\nexport const RANK_ORDER_PACKAGES = [\n  '@dnd-kit/core',\n  '@dnd-kit/sortable',\n  '@dnd-kit/utilities',\n] as const;\n\nexport const MCQ_OTHER_PICKER_PACKAGES = [\n  'react-international-phone',\n  'react-datepicker',\n  'date-fns',\n] as const;\n\nconst CORE_PEER_PACKAGES = ['@tanstack/react-query', 'react-icons'] as const;\n\n/** Tier 1 + Tier 2 — bundle ships all 11 question types including RANK_ORDER. */\nexport const BUNDLE_ALWAYS_PACKAGES = [\n  ...CORE_PEER_PACKAGES,\n  ...RANK_ORDER_PACKAGES,\n] as const;\n\nexport const BUNDLE_ALWAYS_DEV_PACKAGES = ['@types/node'] as const;\n\nexport interface BundleDepsManifest {\n  dependencies: Record<string, string>;\n  devDependencies: Record<string, string>;\n}\n\nfunction getSdkTemplatesRoot(): string {\n  return path.join(__dirname, '..', '..', 'templates');\n}\n\nexport function loadBundleDepsManifest(): BundleDepsManifest {\n  const manifestPath = path.join(getSdkTemplatesRoot(), 'vite-scaffold', 'package.deps.json');\n  if (fs.existsSync(manifestPath)) {\n    try {\n      const raw = JSON.parse(fs.readFileSync(manifestPath, 'utf8')) as BundleDepsManifest;\n      return {\n        dependencies: raw.dependencies ?? {},\n        devDependencies: raw.devDependencies ?? {},\n      };\n    } catch {\n      // fall through to defaults\n    }\n  }\n  return {\n    dependencies: {\n      '@dnd-kit/core': '^6.3.1',\n      '@dnd-kit/sortable': '^10.0.0',\n      '@dnd-kit/utilities': '^3.2.2',\n      '@tanstack/react-query': '^5.0.0',\n      'react-icons': '^5.5.0',\n    },\n    devDependencies: {\n      '@types/node': '^22.15.29',\n    },\n  };\n}\n\nexport interface MergeDepsResult {\n  merged: boolean;\n  addedDependencies: string[];\n  addedDevDependencies: string[];\n}\n\n/** Add missing dependency keys only — never overwrite existing versions. */\nexport function mergeDepsIntoPackageJson(projectRoot: string): MergeDepsResult {\n  const pkgPath = path.join(projectRoot, 'package.json');\n  if (!fs.existsSync(pkgPath)) {\n    return { merged: false, addedDependencies: [], addedDevDependencies: [] };\n  }\n\n  const manifest = loadBundleDepsManifest();\n  const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as Record<string, unknown>;\n  const deps = (pkg.dependencies as Record<string, string> | undefined) ?? {};\n  const devDeps = (pkg.devDependencies as Record<string, string> | undefined) ?? {};\n\n  const addedDependencies: string[] = [];\n  const addedDevDependencies: string[] = [];\n\n  for (const [name, version] of Object.entries(manifest.dependencies)) {\n    if (!deps[name]) {\n      deps[name] = version;\n      addedDependencies.push(name);\n    }\n  }\n  for (const [name, version] of Object.entries(manifest.devDependencies)) {\n    if (!devDeps[name]) {\n      devDeps[name] = version;\n      addedDevDependencies.push(name);\n    }\n  }\n\n  if (!addedDependencies.length && !addedDevDependencies.length) {\n    return { merged: false, addedDependencies, addedDevDependencies };\n  }\n\n  pkg.dependencies = deps;\n  pkg.devDependencies = devDeps;\n  fs.writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, 'utf8');\n  return { merged: true, addedDependencies, addedDevDependencies };\n}\n\nexport function getBundleAlwaysPackageNames(): string[] {\n  const manifest = loadBundleDepsManifest();\n  return [\n    ...Object.keys(manifest.dependencies),\n    ...Object.keys(manifest.devDependencies),\n  ];\n}\n\nexport interface InstallBundleDepsResult {\n  ok: boolean;\n  installed: string[];\n  skipped: boolean;\n}\n\n/** Merge package.json keys then npm install only missing packages (skip network when all present). */\nexport function installBundleDepsIfMissing(projectRoot: string): InstallBundleDepsResult {\n  const mergeResult = mergeDepsIntoPackageJson(projectRoot);\n\n  const packages = getBundleAlwaysPackageNames();\n  const missingFromPkg = getMissingPackages(projectRoot, packages);\n  const missingFromNodeModules = getUninstalledNodeModules(projectRoot, packages);\n  const missing = [...new Set([...missingFromPkg, ...missingFromNodeModules])];\n\n  if (!missing.length) {\n    console.log(`${c.green}OK:${c.reset} Bundle deps — all packages already installed`);\n    return { ok: true, installed: [], skipped: true };\n  }\n\n  const cmd = formatNpmInstallCommand(missing);\n  if (!cmd) {\n    return { ok: true, installed: [], skipped: true };\n  }\n\n  if (mergeResult.merged) {\n    console.log(\n      `${c.dim}Merged into package.json: ${[...mergeResult.addedDependencies, ...mergeResult.addedDevDependencies].join(', ')}${c.reset}`,\n    );\n  }\n\n  console.log(`${c.dim}Installing missing bundle deps: ${missing.join(', ')}${c.reset}`);\n  const ok = runCommandSync('npm', ['install', ...missing], { cwd: projectRoot });\n  if (!ok) {\n    console.log(`${c.red}FAIL:${c.reset} npm install failed — run manually: ${cmd}`);\n    return { ok: false, installed: missing, skipped: false };\n  }\n\n  console.log(`${c.green}OK:${c.reset} Installed bundle deps (${missing.join(', ')})`);\n  return { ok: true, installed: missing, skipped: false };\n}\n\nfunction readPackageJson(projectRoot: string): Record<string, unknown> | null {\n  const pkgPath = path.join(projectRoot, 'package.json');\n  if (!fs.existsSync(pkgPath)) return null;\n  try {\n    return JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as Record<string, unknown>;\n  } catch {\n    return null;\n  }\n}\n\nexport function readInstalledPackages(projectRoot: string): Set<string> {\n  const pkg = readPackageJson(projectRoot);\n  if (!pkg) return new Set();\n\n  const installed = new Set<string>();\n  for (const section of ['dependencies', 'devDependencies'] as const) {\n    const deps = pkg[section] as Record<string, string> | undefined;\n    if (!deps) continue;\n    for (const name of Object.keys(deps)) installed.add(name);\n  }\n  return installed;\n}\n\nexport function getCorePackages(projectRoot: string): string[] {\n  const pkg = readPackageJson(projectRoot);\n  const sdk =\n    resolveSdkPackageName({\n      dependencies: pkg?.dependencies as Record<string, string> | undefined,\n      devDependencies: pkg?.devDependencies as Record<string, string> | undefined,\n    }) ?? '@explorer02/cfm-survey-sdk';\n\n  return [sdk, ...CORE_PEER_PACKAGES];\n}\n\nexport function getSurveyTypeDeps(\n  surveyTypes: string[],\n  hasMcqOtherPickers = false,\n): string[] {\n  const packages: string[] = [];\n  if (surveyTypes.includes('RANK_ORDER')) {\n    packages.push(...RANK_ORDER_PACKAGES);\n  }\n  if (hasMcqOtherPickers) {\n    packages.push(...MCQ_OTHER_PICKER_PACKAGES);\n  }\n  return [...new Set(packages)];\n}\n\nexport function getMissingPackages(projectRoot: string, packages: string[]): string[] {\n  const installed = readInstalledPackages(projectRoot);\n  return packages.filter((p) => !installed.has(p));\n}\n\nfunction isPackageInNodeModules(projectRoot: string, packageName: string): boolean {\n  const parts = packageName.split('/');\n  const modPath = path.join(projectRoot, 'node_modules', ...parts);\n  return fs.existsSync(modPath);\n}\n\n/** Packages listed in package.json but absent from node_modules. */\nexport function getUninstalledNodeModules(\n  projectRoot: string,\n  packages: string[],\n): string[] {\n  const listed = readInstalledPackages(projectRoot);\n  return packages.filter((p) => listed.has(p) && !isPackageInNodeModules(projectRoot, p));\n}\n\nexport function formatNpmInstallCommand(\n  packages: string[],\n  dev = false,\n): string | null {\n  if (!packages.length) return null;\n  if (dev) return `npm install -D ${packages.join(' ')}`;\n  return `npm install ${packages.join(' ')}`;\n}\n\nexport function printInstallBlock(options: {\n  title: string;\n  packages: string[];\n  dev?: boolean;\n  source?: string;\n  projectRoot: string;\n}): boolean {\n  const missing = getMissingPackages(options.projectRoot, options.packages);\n  const border = '═'.repeat(56);\n\n  if (!missing.length) {\n    console.log(`${c.green}OK:${c.reset} ${options.title} — all packages already installed`);\n    return true;\n  }\n\n  const cmd = formatNpmInstallCommand(missing, options.dev);\n  console.log('');\n  console.log(border);\n  console.log(`  ${options.title}`);\n  console.log(border);\n  console.log('');\n  if (cmd) console.log(cmd);\n  if (options.source) console.log(`\\nSource: ${options.source}`);\n  console.log(border);\n  console.log('');\n  return false;\n}\n\nexport function printSurveyTypeInstallBlock(\n  projectRoot: string,\n  surveyTypes: string[],\n  hasMcqOtherPickers = false,\n): boolean {\n  const packages = getSurveyTypeDeps(surveyTypes, hasMcqOtherPickers);\n  if (!packages.length) {\n    console.log(\n      `${c.dim}Survey-type deps: none required for inventory [${surveyTypes.join(', ')}]${c.reset}`,\n    );\n    return true;\n  }\n\n  return printInstallBlock({\n    title: 'INSTALL SURVEY-TYPE DEPS (run once before Phase 6)',\n    packages,\n    projectRoot,\n    source: 'setup/conditional-deps.md',\n  });\n}\n\nexport function checkTailwindGlobalsImport(projectRoot: string): boolean {\n  const globalsCandidates = [\n    'src/app/globals.css',\n    'src/styles/globals.css',\n    'src/index.css',\n    'app/globals.css',\n  ];\n  for (const rel of globalsCandidates) {\n    const abs = path.join(projectRoot, rel);\n    if (!fs.existsSync(abs)) continue;\n    const content = fs.readFileSync(abs, 'utf8');\n    if (/@import\\s+[\"']tailwindcss[\"']/.test(content)) return true;\n  }\n  return false;\n}\n","import type { AnswerValue, SurveyAnswers } from '../submitSurvey/types';\n\n/** Structured metadata passed to SDK console log helpers. */\nexport type SdkLogMetadata = Record<string, unknown> | object;\n\n/** Standard error payload for SDK log helpers (Error instances or message strings). */\nexport type SdkLoggableError = Error | string;\n\n/** Before/after pair when a respondent changes an answer after navigating back. */\nexport type AnswerChangeDelta = {\n  oldValue: AnswerValue | null;\n  newValue: AnswerValue | null;\n};\n\n/** Per-question answer diffs detected on backtrack revisit. */\nexport type BacktrackChangedAnswers = Record<string, AnswerChangeDelta>;\n\n/** Snapshot of page answers stored when the user navigates back. */\nexport type BacktrackAnswersSnapshot = Partial<SurveyAnswers>;\n\nexport function getErrorMessage(err: unknown): string {\n  return err instanceof Error ? err.message : String(err);\n}\n\n/** Normalizes catch-boundary values into {@link SdkLoggableError}. */\nexport function toSdkLoggableError(err: unknown): SdkLoggableError {\n  return err instanceof Error ? err : String(err);\n}\n","/**\n * The API base URL for fetching survey configuration data.\n */\nexport const SURVEY_BASE_URL = 'https://custom-p0.feedbook.me/api/feedback/survey/cfm';\n","import { SURVEY_BASE_URL } from './constants';\n\n/**\n * Constructs the external URL used to call the remote survey service api.\n *\n * @param instanceId The instance identifier token.\n * @returns Fully constructed target URL.\n */\nexport function buildExternalSurveyUrl(instanceId: string): string {\n  return `${SURVEY_BASE_URL}?instanceId=${encodeURIComponent(instanceId)}&draftPreview=false`;\n}\n\n/**\n * High-level function that constructs the survey fetch URL.\n * Returns empty string when instanceId is missing — fetch must not run until INPUT 2 JWT is set.\n *\n * @returns Target URL for fetch requests, or '' when no instanceId.\n */\nexport function buildSurveyUrl(instanceId?: string): string {\n  const targetId =\n    typeof instanceId === 'string' && instanceId.trim().length > 0 ? instanceId.trim() : '';\n  if (!targetId) return '';\n  return buildExternalSurveyUrl(targetId);\n}\n","export type InstanceJwtPayload = {\n  surveyResponseId?: string;\n};\n\n/** Decoded JWT payload before field validation. */\ntype RawInstanceJwtPayload = {\n  surveyResponseId?: string;\n};\n\n/**\n * Decode the payload segment of an instance JWT without verification.\n */\nexport function decodeInstanceJwt(instanceId: string): InstanceJwtPayload | null {\n  const token = instanceId.trim();\n  if (!token) return null;\n\n  const parts = token.split('.');\n  if (parts.length < 2) return null;\n\n  try {\n    const base64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n    const padded = base64.padEnd(base64.length + ((4 - (base64.length % 4)) % 4), '=');\n    const json = atob(padded);\n    const parsed = JSON.parse(json);\n\n    if (typeof parsed !== 'object' || parsed === null) {\n      return null;\n    }\n\n    const payload = parsed as RawInstanceJwtPayload;\n    const surveyResponseId =\n      typeof payload.surveyResponseId === 'string' ? payload.surveyResponseId : undefined;\n\n    return { surveyResponseId };\n  } catch {\n    return null;\n  }\n}\n","import type { SurveyLanguage } from '../types/survey';\nimport type { ApiResponse } from '../internalTypes';\n\nconst LANGUAGE_DISPLAY_NAMES: Record<string, string> = {\n  en: 'English',\n  hi: 'Hindi',\n  de: 'Deutsch',\n  es: 'Español',\n  fr: 'Français',\n  bn: 'Bengali',\n  gu: 'Gujarati',\n  it: 'Italiano',\n  ja: '日本語',\n  ko: '한국어',\n  mr: 'Marathi',\n  pa: 'Punjabi',\n  ta: 'Tamil',\n  te: 'Telugu',\n  ur: 'Urdu',\n  zh: '中文',\n};\n\n/**\n * Resolves the full human-readable display name for a given language code.\n *\n * @param code The ISO language code (e.g. 'de', 'en').\n * @returns The resolved display name string.\n */\nexport function getLanguageName(code: string): string {\n  const norm = code.toLowerCase().trim();\n  return LANGUAGE_DISPLAY_NAMES[norm] || code.toUpperCase();\n}\n\n/**\n * Traverses all questions and translations to gather all unique languages supported by the survey.\n *\n * @param api The raw API response envelope containing the DTO pages.\n * @returns List of supported language objects with code and resolved names.\n */\nexport function extractSurveyLanguages(api: ApiResponse): SurveyLanguage[] {\n  const dto = api.cfmSurveyDTO;\n  const languagesSet = new Set<string>();\n  const defaultLanguage = dto?.baseLanguage ?? 'en';\n  languagesSet.add(defaultLanguage);\n\n  if (dto && Array.isArray(dto.surveyPages)) {\n    dto.surveyPages.forEach(page => {\n      (page.questionHolders ?? []).forEach(holder => {\n        const q = holder.question;\n        if (q && q.translations) {\n          Object.keys(q.translations).forEach(lang => {\n            languagesSet.add(lang);\n          });\n        }\n      });\n    });\n  }\n\n  return Array.from(languagesSet).map(lang => ({\n    code: lang,\n    name: getLanguageName(lang),\n  }));\n}\n","export const QUESTION_CONFIG_KEY = {\n  REQUIRED: 'REQUIRED',\n  REQUIRED_ERROR_MESSAGE: 'REQUIRED_ERROR_MESSAGE',\n  NOT_APPLICABLE_OPTIONS: 'NOT_APPLICABLE_OPTIONS',\n  ENABLE_NON_APPLICABLE: 'ENABLE_NON_APPLICABLE',\n  BUTTON_TYPE: 'BUTTON_TYPE',\n  SCALE_TYPE: 'SCALE_TYPE',\n  VIEW_VARIANT: 'VIEW_VARIANT',\n  NPS_BUTTON_VARIANT: 'NPS_BUTTON_VARIANT',\n  SHOW_SCALE_NUMBERS: 'SHOW_SCALE_NUMBERS',\n  TRANSPOSE_TABLE: 'TRANSPOSE_TABLE',\n  REPEAT_SCALE: 'REPEAT_SCALE',\n  ENABLE_SCALE: 'ENABLE_SCALE',\n  MATRIX_TYPE: 'MATRIX_TYPE',\n} as const;\n","/** Sprinklr draft surveys auto-populate QUESTION_HINT with this placeholder when unset. */\nconst SPRINKLR_DEFAULT_QUESTION_HINT = 'QUESTION HINT';\n\nexport function shouldShowQuestionHint(hint?: string | null): boolean {\n  if (!hint) return false;\n  const plain = hint.replace(/<[^>]*>/g, '').trim();\n  return plain.toUpperCase() !== SPRINKLR_DEFAULT_QUESTION_HINT;\n}\n","export function getConfigValue(\n  configs: { key: string; value?: string[] }[],\n  key: string\n): string | undefined {\n  return configs.find(c => c.key === key)?.value?.[0];\n}\n\nexport function getConfigFlag(\n  configs: { key: string; value?: string[] }[],\n  key: string\n): boolean {\n  return getConfigValue(configs, key)?.toLowerCase() === 'true';\n}\n\nexport function hasReverseScaleOrder(\n  configs: { key: string; value?: string[] }[],\n  raw: { additional?: { reverseScaleOrder?: boolean; reverseScale?: boolean } }\n): boolean {\n  return (\n    configs.some(c => c.key.includes('REVERSE') && c.value?.[0]?.toLowerCase() === 'true') ||\n    raw.additional?.reverseScaleOrder === true ||\n    raw.additional?.reverseScale === true\n  );\n}\n\nexport function hasNotApplicableOption(configs: { key: string; value?: string[] }[]): boolean {\n  return (\n    getConfigFlag(configs, 'NOT_APPLICABLE_OPTIONS') ||\n    getConfigFlag(configs, 'ENABLE_NON_APPLICABLE')\n  );\n}\n","import type { ApiQuestion, ApiQuestionSetting } from '../../../../internalTypes';\nimport { QUESTION_CONFIG_KEY } from '../../../../constants/questionConfigKeys';\nimport type { ContainerMedia } from '../../../../types/shared';\nimport { shouldShowQuestionHint } from '../../../../../surveyLogic/fields/questionHintUtils';\nimport { getConfigFlag } from './configUtils';\n\n/** Internal mapper output — not exported to SDK clients. */\nexport type ResolvedQuestionShell = {\n  id: string;\n  questionText: string;\n  questionDescription?: string;\n  questionHint?: string;\n  required: boolean;\n  requiredErrorMessage?: string;\n  questionNumber?: number;\n  containerMedia?: ContainerMedia;\n  referencedQuestionIds?: string[];\n};\n\nexport function resolveQuestionShell(\n  raw: ApiQuestion,\n  configs: ApiQuestionSetting[],\n  language?: string,\n  placeholders?: Record<string, string>\n): ResolvedQuestionShell {\n  const required = getConfigFlag(configs, QUESTION_CONFIG_KEY.REQUIRED);\n\n  const reqErrConfig = configs.find(c => c.key === QUESTION_CONFIG_KEY.REQUIRED_ERROR_MESSAGE);\n  let requiredErrorMessage = reqErrConfig?.value?.[0];\n  if (language && reqErrConfig?.translations?.[language]?.value?.[0]) {\n    requiredErrorMessage = reqErrConfig.translations[language].value![0];\n  }\n\n  let questionText =\n    (language && raw.translations?.[language]?.questionRichText) ||\n    (language && raw.translations?.[language]?.questionText) ||\n    raw.questionRichText ||\n    raw.questionText ||\n    '';\n\n  if (placeholders) {\n    questionText = questionText.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) =>\n      placeholders[key] !== undefined ? placeholders[key] : match\n    );\n  }\n\n  let questionDescription =\n    (language && raw.translations?.[language]?.descriptionRichText) ||\n    (language && raw.translations?.[language]?.description) ||\n    raw.descriptionRichText ||\n    raw.description ||\n    raw.descriptionText ||\n    (typeof raw.additional?.descriptionRichText === 'string' ? raw.additional.descriptionRichText : '') ||\n    (typeof raw.additional?.description === 'string' ? raw.additional.description : '') ||\n    '';\n\n  if (!questionDescription) {\n    const descConfig = configs.find(c => c.key.includes('DESCRIPTION'));\n    questionDescription = descConfig?.value?.[0] || '';\n    if (language && descConfig?.translations?.[language]?.valueRichText?.[0]) {\n      questionDescription = descConfig.translations[language].valueRichText![0];\n    } else if (language && descConfig?.translations?.[language]?.value?.[0]) {\n      questionDescription = descConfig.translations[language].value![0];\n    }\n  }\n\n  if (questionDescription && placeholders) {\n    questionDescription = questionDescription.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) =>\n      placeholders[key] !== undefined ? placeholders[key] : match\n    );\n  }\n\n  let questionHint = raw.questionHint;\n  const hintConfig = configs.find(c => c.key === 'QUESTION_HINT');\n  if (hintConfig?.value?.[0] && hintConfig.value[0] !== 'true' && hintConfig.value[0] !== 'false') {\n    questionHint = hintConfig.value[0];\n  }\n\n  const containerAssets = raw.questionContainerAssets;\n  const primaryAsset = containerAssets?.[0];\n  const url = primaryAsset?.source || primaryAsset?.mediaUrl || primaryAsset?.previewImageUrl;\n  const mimeType = primaryAsset?.mediaMimeType;\n\n  const alignConfig = configs.find(c => c.key === 'QUESTION_CONTAINER_MEDIA_ALIGNMENT');\n  const alignment = alignConfig?.value?.[0];\n\n  const sizeConfig = configs.find(c => c.key === 'TEXT_AND_MEDIA_SIZE');\n  const size = sizeConfig?.value?.[0] ? Number(sizeConfig.value[0]) : undefined;\n\n  const containerMedia: ContainerMedia | undefined =\n    url || mimeType || alignment || size !== undefined\n      ? {\n          ...(url ? { url } : {}),\n          ...(mimeType ? { mimeType } : {}),\n          ...(alignment ? { alignment } : {}),\n          ...(size !== undefined ? { size } : {}),\n        }\n      : undefined;\n\n  const associatedIds = raw.additionalInfo?.associatedPlaceholderQuestionIds;\n  const referencedQuestionIds = Array.isArray(associatedIds)\n    ? associatedIds.filter((id): id is string => typeof id === 'string' && id.length > 0)\n    : undefined;\n\n  return {\n    id: raw.id ?? '',\n    questionText,\n    ...(questionDescription ? { questionDescription } : {}),\n    ...(shouldShowQuestionHint(questionHint) ? { questionHint } : {}),\n    required,\n    ...(requiredErrorMessage ? { requiredErrorMessage } : {}),\n    ...(raw.questionNumber !== undefined ? { questionNumber: raw.questionNumber } : {}),\n    ...(containerMedia ? { containerMedia } : {}),\n    ...(referencedQuestionIds && referencedQuestionIds.length > 0\n      ? { referencedQuestionIds }\n      : {}),\n  };\n}\n","import type { ApiLogicFilter } from '../../../../internalTypes';\nimport type { ApiConditionEntity } from '../../../../internalTypes/apiControlConfig';\nimport type {\n  CustomFieldType,\n  LogicConditionEntity,\n  LogicFilterGroup,\n  LogicFilterLeaf,\n  LogicFilterNode,\n  LogicSubConditionEntity,\n} from '../../../../types/survey';\nimport type { ApiSubConditionEntity } from '../../../../internalTypes/apiControlConfig';\n\ntype ApiFilterGroup = ApiLogicFilter & { filters: ApiLogicFilter[] };\n\nconst CUSTOM_FIELD_TYPES = new Set<CustomFieldType>([\n  'TEXT',\n  'TEXT_MULTI',\n  'TEXTAREA',\n  'NUMBER',\n  'PICKLIST',\n  'PICKLIST_MULTISELECT',\n  'DATETIME',\n]);\n\nfunction hasNestedFilters(filter: ApiLogicFilter): filter is ApiFilterGroup {\n  return Array.isArray(filter.filters) && filter.filters.length > 0;\n}\n\nfunction isAndOrOperator(value: string | undefined): value is 'AND' | 'OR' {\n  return value === 'AND' || value === 'OR';\n}\n\nfunction isCustomFieldType(value: string | undefined): value is CustomFieldType {\n  return value !== undefined && CUSTOM_FIELD_TYPES.has(value as CustomFieldType);\n}\n\nfunction mapQuestionConditionEntity(\n  entity: ApiConditionEntity | undefined\n): Extract<LogicConditionEntity, { entityType: 'QUESTION' }> | null {\n  if (!entity?.id || entity.entityType !== 'QUESTION') {\n    return null;\n  }\n\n  return {\n    id: entity.id,\n    entityType: 'QUESTION',\n    ...(entity.answerType ? { answerType: entity.answerType } : {}),\n  };\n}\n\nfunction mapCustomFieldConditionEntity(\n  entity: ApiConditionEntity | undefined\n): Extract<LogicConditionEntity, { entityType: 'CUSTOM_FIELD' }> | null {\n  if (!entity?.id || entity.entityType !== 'CUSTOM_FIELD' || !isCustomFieldType(entity.fieldType)) {\n    return null;\n  }\n\n  return {\n    id: entity.id,\n    entityType: 'CUSTOM_FIELD',\n    fieldType: entity.fieldType,\n    ...(entity.assetClass ? { assetClass: entity.assetClass } : {}),\n  };\n}\n\nfunction mapConditionEntity(entity: ApiConditionEntity | undefined): LogicConditionEntity | null {\n  return mapQuestionConditionEntity(entity) ?? mapCustomFieldConditionEntity(entity);\n}\n\nfunction mapSubConditionEntity(\n  entity: ApiSubConditionEntity | undefined\n): LogicSubConditionEntity | null {\n  if (!entity?.id || entity.entityType !== 'OPTION') {\n    return null;\n  }\n\n  return {\n    id: entity.id,\n    entityType: 'OPTION',\n  };\n}\n\nfunction mapLogicFilterLeaf(raw: ApiLogicFilter): LogicFilterLeaf | null {\n  if (!raw.filterType || isAndOrOperator(raw.filterType)) {\n    return null;\n  }\n\n  const conditionEntity = mapConditionEntity(raw.details?.conditionEntity);\n  if (!conditionEntity) {\n    return null;\n  }\n\n  const subConditionEntity = mapSubConditionEntity(raw.details?.subConditionEntity);\n\n  const leaf: LogicFilterLeaf = {\n    filterType: raw.filterType,\n    details: {\n      conditionEntity,\n      ...(subConditionEntity ? { subConditionEntity } : {}),\n    },\n  };\n\n  const timezone = raw.details?.valueAdditional?.timezone;\n  if (timezone) {\n    leaf.details!.valueAdditional = { timezone };\n  }\n\n  if (raw.field) {\n    leaf.field = raw.field;\n  }\n\n  if (raw.values) {\n    leaf.values = raw.values;\n  }\n\n  return leaf;\n}\n\nfunction mapLogicFilterGroupNode(raw: ApiFilterGroup): LogicFilterGroup | null {\n  if (!isAndOrOperator(raw.filterType)) {\n    return null;\n  }\n\n  const childFilters = raw.filters\n    .map(child => mapLogicFilterNode(child))\n    .filter((node): node is LogicFilterNode => node !== null);\n\n  if (childFilters.length === 0) {\n    return null;\n  }\n\n  return {\n    filterType: raw.filterType,\n    filters: childFilters,\n  };\n}\n\nexport function mapLogicFilterNode(raw: ApiLogicFilter): LogicFilterNode | null {\n  if (hasNestedFilters(raw)) {\n    return mapLogicFilterGroupNode(raw);\n  }\n\n  return mapLogicFilterLeaf(raw);\n}\n\nfunction isLogicFilterGroup(node: LogicFilterNode): node is LogicFilterGroup {\n  return 'filters' in node;\n}\n\nexport function mapLogicFilterGroup(raw: ApiLogicFilter | undefined): LogicFilterGroup | null {\n  if (!raw) {\n    return null;\n  }\n\n  const node = mapLogicFilterNode(raw);\n  if (!node) {\n    return null;\n  }\n\n  if (isLogicFilterGroup(node)) {\n    return node;\n  }\n\n  // A single comparison rule is stored as a one-item AND group.\n  return {\n    filterType: 'AND',\n    filters: [node],\n  };\n}\n","import type { ApiSkipLogic } from '../../../../internalTypes';\nimport type { SkipLogic } from '../../../../types/survey';\nimport { mapLogicFilterGroup } from './mapLogicFilters';\n\nexport function mapSkipLogics(raw: ApiSkipLogic[] | undefined): SkipLogic[] | undefined {\n  if (!raw?.length) return undefined;\n\n  const mapped = raw\n    .map(item => {\n      const id = item.id?.trim();\n      const skipToId = item.skipTo?.id?.trim();\n      const entityType = item.skipTo?.entityType;\n      const condition = mapLogicFilterGroup(item.condition);\n\n      if (!id || !skipToId || !entityType || !condition) return null;\n      if (entityType !== 'QUESTION' && entityType !== 'END_OF_SURVEY') return null;\n\n      return {\n        id,\n        skipTo: { id: skipToId, entityType },\n        condition,\n      } satisfies SkipLogic;\n    })\n    .filter((item): item is SkipLogic => item !== null);\n\n  return mapped.length > 0 ? mapped : undefined;\n}\n","import type { ApiDisplayLogic } from '../../../../internalTypes';\nimport type { DisplayLogic } from '../../../../types/survey';\nimport { mapLogicFilterGroup } from './mapLogicFilters';\n\nexport function mapDisplayLogic(raw: ApiDisplayLogic | undefined): DisplayLogic | undefined {\n  if (!raw) return undefined;\n\n  const condition = mapLogicFilterGroup(raw.condition);\n  if (!condition) return undefined;\n\n  return {\n    condition,\n    isDynamicAppearanceEnabled: raw.isDynamicAppearanceEnabled === true,\n  };\n}\n","import type { ApiQuestion, ApiQuestionDisplayVariant } from '../../../../internalTypes';\nimport type { QuestionDisplayVariant } from '../../../../types/survey';\nimport { mapDisplayLogic } from './mapDisplayLogic';\n\nfunction resolveVariantText(\n  raw: ApiQuestionDisplayVariant,\n  language?: string,\n  placeholders?: Record<string, string>\n): string {\n  let questionText: string =\n    (language && raw.translations?.[language]?.questionRichText) ||\n    (language && raw.translations?.[language]?.questionText) ||\n    raw.questionRichText ||\n    raw.questionText ||\n    '';\n\n  if (placeholders) {\n    questionText = questionText.replace(/\\{\\{(\\w+)\\}\\}/g, (match: string, key: string) =>\n      placeholders[key] !== undefined ? placeholders[key] : match\n    );\n  }\n\n  return questionText;\n}\n\nexport function mapQuestionDisplayVariants(\n  raw: ApiQuestion,\n  language?: string,\n  placeholders?: Record<string, string>\n): QuestionDisplayVariant[] | undefined {\n  const variants = raw.questionDisplayVariants;\n  if (!variants?.length) return undefined;\n\n  const mapped: QuestionDisplayVariant[] = [];\n\n  for (const variant of variants) {\n    const id = variant.id;\n    if (!id) continue;\n\n    const questionText = resolveVariantText(variant, language, placeholders);\n    if (!questionText) continue;\n\n    const displayLogic = mapDisplayLogic(variant.controlConfig?.displayLogic);\n\n    if (!displayLogic) continue;\n\n    mapped.push({\n      id,\n      questionText,\n      ...(displayLogic ? { displayLogic } : {}),\n    });\n  }\n\n  return mapped.length > 0 ? mapped : undefined;\n}\n","import type {\n  DisplayLogic,\n  QuestionDisplayVariant,\n  SkipLogic,\n  SurveyQuestion,\n} from '../../../../types/survey';\nimport type { QuestionBeforeLogics } from './questionMapperTypes';\n\n/** Adds skip, display, and variant rules to a mapped question. */\nexport function attachQuestionLogics(\n  question: QuestionBeforeLogics,\n  skipLogics: SkipLogic[] | undefined,\n  displayLogic: DisplayLogic | undefined,\n  displayVariants: QuestionDisplayVariant[] | undefined\n): SurveyQuestion {\n  return {\n    ...question,\n    ...(skipLogics?.length ? { skipLogics } : {}),\n    ...(displayLogic ? { displayLogic } : {}),\n    ...(displayVariants?.length ? { displayVariants } : {}),\n  };\n}\n","export const QUESTION_TYPE = {\n  MCQ: 'MCQ',\n  TEXTFIELD: 'TEXTFIELD',\n  NPS_SCALE: 'NPS_SCALE',\n  CFM_MATRIX: 'CFM_MATRIX',\n  CSAT_MATRIX: 'CSAT_MATRIX',\n  RATING_MATRIX: 'RATING_MATRIX',\n  SLIDER_MATRIX: 'SLIDER_MATRIX',\n  FILE_UPLOAD: 'FILE_UPLOAD',\n  TEXT_AND_MEDIA: 'TEXT_AND_MEDIA',\n  HEATMAP: 'HEATMAP',\n  RANK_ORDER: 'RANK_ORDER',\n} as const;\n\nexport type QuestionType = (typeof QUESTION_TYPE)[keyof typeof QUESTION_TYPE];\n","import type { ApiQuestionSetting } from '../../../../internalTypes';\n\nexport type ChoiceRandomizationType = 'RANDOM_ORDER' | 'RANDOM_FLIP' | 'LIMITED_CHOICES';\n\nexport type ChoiceRandomizationConfig = {\n  enabled: true;\n  type: ChoiceRandomizationType;\n  numberOfChoices?: number;\n};\n\nfunction shuffleArray<T>(items: T[]): T[] {\n  const result = [...items];\n  for (let i = result.length - 1; i > 0; i -= 1) {\n    const j = Math.floor(Math.random() * (i + 1));\n    [result[i], result[j]] = [result[j], result[i]];\n  }\n  return result;\n}\n\nexport function parseChoiceRandomization(\n  configs: ApiQuestionSetting[]\n): ChoiceRandomizationConfig | undefined {\n  const choiceConfig = configs.find(config => config.key === 'CHOICE_RANDOMIZATION');\n  if (choiceConfig?.value?.[0]?.toLowerCase() === 'true') {\n    const rawType = choiceConfig.childConfigs\n      ?.find(config => config.key === 'RANDOMIZATION_TYPE')\n      ?.value?.[0]?.toUpperCase();\n    const type: ChoiceRandomizationType =\n      rawType === 'RANDOM_FLIP' || rawType === 'LIMITED_CHOICES' ? rawType : 'RANDOM_ORDER';\n    const numberRaw = choiceConfig.childConfigs\n      ?.find(config => config.key === 'NUMBER_OF_CHOICES')\n      ?.value?.[0];\n    const numberOfChoices = numberRaw ? Number(numberRaw) : undefined;\n\n    return {\n      enabled: true,\n      type,\n      ...(numberOfChoices !== undefined && Number.isFinite(numberOfChoices)\n        ? { numberOfChoices }\n        : {}),\n    };\n  }\n\n  const shuffleOrder =\n    configs.find(config => config.key === 'SHUFFLE_ORDER')?.value?.[0]?.toLowerCase() === 'true';\n  if (shuffleOrder) {\n    return { enabled: true, type: 'RANDOM_ORDER' };\n  }\n\n  return undefined;\n}\n\nexport function applyChoiceRandomization<T extends { id: string }>(\n  options: T[],\n  config: ChoiceRandomizationConfig | undefined,\n  pinnedOptionIds?: string[]\n): { options: T[]; shuffleOptions: boolean } {\n  if (!config?.enabled || options.length <= 1) {\n    return { options, shuffleOptions: false };\n  }\n\n  switch (config.type) {\n    case 'RANDOM_FLIP': {\n      const flipped = Math.random() < 0.5 ? [...options].reverse() : options;\n      return { options: flipped, shuffleOptions: true };\n    }\n    case 'LIMITED_CHOICES': {\n      const requestedCount = config.numberOfChoices ?? options.length;\n      const count = Math.min(Math.max(1, requestedCount), options.length);\n      if (count >= options.length) {\n        return { options: shuffleArray(options), shuffleOptions: true };\n      }\n\n      const pinnedSet = new Set(\n        (pinnedOptionIds ?? []).filter(id => options.some(option => option.id === id))\n      );\n      const pinned = options.filter(option => pinnedSet.has(option.id));\n      const remaining = options.filter(option => !pinnedSet.has(option.id));\n      const slotsLeft = Math.max(0, count - pinned.length);\n      const selectedRemaining = shuffleArray(remaining).slice(0, slotsLeft);\n\n      return {\n        options: shuffleArray([...pinned, ...selectedRemaining]),\n        shuffleOptions: true,\n      };\n    }\n    case 'RANDOM_ORDER':\n    default:\n      return { options: shuffleArray(options), shuffleOptions: true };\n  }\n}\n","import type { McqOption } from '../../../../types/mcq';\nimport {\n  applyChoiceRandomization,\n  type ChoiceRandomizationConfig,\n} from '../shared/choiceRandomization';\n\n/** Randomize regular MCQ options only; Other options stay last in original order. */\nexport function applyMcqChoiceRandomization(\n  options: McqOption[],\n  randomization: ChoiceRandomizationConfig | undefined,\n  defaultOptionIds?: string[]\n): { options: McqOption[]; shuffleOptions: boolean } {\n  const otherOptions = options.filter(option => option.otherOption);\n  const regularOptions = options.filter(option => !option.otherOption);\n\n  const regularDefaultIds = defaultOptionIds?.filter(id =>\n    regularOptions.some(option => option.id === id)\n  );\n\n  const { options: randomizedRegular, shuffleOptions } = applyChoiceRandomization(\n    regularOptions,\n    randomization,\n    regularDefaultIds\n  );\n\n  return {\n    options: [...randomizedRegular, ...otherOptions],\n    shuffleOptions,\n  };\n}\n","import type { ApiDisplayLogic } from '../../../../internalTypes';\nimport type { AnswerLogic } from '../../../../types/survey';\nimport { mapLogicFilterGroup } from './mapLogicFilters';\n\nexport function mapAnswerLogic(raw: ApiDisplayLogic | undefined): AnswerLogic | undefined {\n  if (!raw) {\n    return undefined;\n  }\n\n  const condition = mapLogicFilterGroup(raw.condition);\n  if (!condition) {\n    return undefined;\n  }\n\n  return { condition };\n}\n","import type { ApiAnswerOption } from '../../../../internalTypes';\nimport type { ApiQuestionSetting } from '../../../../internalTypes/apiQuestionSetting';\nimport type {\n  McqOtherContentType,\n  McqOtherDateFormat,\n  McqOtherOptionConfig,\n} from '../../../../types/mcq';\n\nfunction findConfig(configs: ApiQuestionSetting[] | undefined, key: string): ApiQuestionSetting | undefined {\n  return configs?.find(c => c.key === key);\n}\n\nfunction firstValue(config: ApiQuestionSetting | undefined): string | undefined {\n  return config?.value?.[0];\n}\n\nfunction parseNumber(raw: string | undefined): number | undefined {\n  if (raw === undefined || raw === '') return undefined;\n  const n = Number(raw);\n  return Number.isFinite(n) ? n : undefined;\n}\n\nfunction mapDateFormat(raw: string | undefined): McqOtherDateFormat {\n  const normalized = raw?.toLowerCase() ?? '';\n  if (normalized.includes('yyyy') && normalized.indexOf('yyyy') < normalized.indexOf('mm')) {\n    return 'YYYY/MM/DD';\n  }\n  if (normalized.startsWith('mm')) {\n    return 'MM/DD/YYYY';\n  }\n  return 'DD/MM/YYYY';\n}\n\nfunction mapContentType(raw: string | undefined): McqOtherContentType {\n  const upper = raw?.toUpperCase() ?? 'TEXT';\n  if (upper === 'PHONE_NUMBER' || upper === 'POSTAL_CODE' || upper === 'DATE' || upper === 'NUMERIC' || upper === 'EMAIL') {\n    return upper;\n  }\n  return 'TEXT';\n}\n\nfunction extractContentTypeConfig(otherConfig: ApiQuestionSetting): McqOtherOptionConfig | undefined {\n  const contentTypeConfig = findConfig(otherConfig.childConfigs, 'CONTENT_TYPE');\n  const contentType = mapContentType(firstValue(contentTypeConfig));\n  const contentChildren = contentTypeConfig?.childConfigs ?? [];\n  const errorMessage = firstValue(findConfig(contentChildren, 'ERROR_MESSAGE'));\n\n  const base = {\n    label: '',\n    helpText: '',\n    markRequired: false,\n    ...(errorMessage !== undefined ? { errorMessage } : {}),\n  };\n\n  switch (contentType) {\n    case 'TEXT': {\n      const minCharacters = parseNumber(firstValue(findConfig(contentChildren, 'MIN_CHARACTER_COUNT')));\n      const maxCharacters = parseNumber(firstValue(findConfig(contentChildren, 'MAX_CHARACTER_COUNT')));\n      return {\n        ...base,\n        contentType: 'TEXT',\n        ...(minCharacters !== undefined ? { minCharacters } : {}),\n        ...(maxCharacters !== undefined ? { maxCharacters } : {}),\n      };\n    }\n    case 'NUMERIC': {\n      const minNumber = parseNumber(firstValue(findConfig(contentChildren, 'MIN_NUMBER')));\n      const maxNumber = parseNumber(firstValue(findConfig(contentChildren, 'MAX_NUMBER')));\n      const decimalCount = parseNumber(firstValue(findConfig(contentChildren, 'DECIMAL_COUNT')));\n      return {\n        ...base,\n        contentType: 'NUMERIC',\n        ...(minNumber !== undefined ? { minNumber } : {}),\n        ...(maxNumber !== undefined ? { maxNumber } : {}),\n        ...(decimalCount !== undefined ? { decimalCount } : {}),\n      };\n    }\n    case 'EMAIL':\n      return { ...base, contentType: 'EMAIL' };\n    case 'PHONE_NUMBER':\n    case 'POSTAL_CODE': {\n      const countryCodes = findConfig(contentChildren, 'COUNTRY_CODE')?.value ?? [];\n      return {\n        ...base,\n        contentType,\n        countryCodes,\n      };\n    }\n    case 'DATE': {\n      const dateFormat = mapDateFormat(firstValue(findConfig(contentChildren, 'DATE_FORMAT')));\n      const dateRange = findConfig(contentChildren, 'DATE_RANGE')?.value ?? [];\n      const minDate = parseNumber(dateRange[0]);\n      const maxDate = parseNumber(dateRange[1]);\n      return {\n        ...base,\n        contentType: 'DATE',\n        dateFormat,\n        ...(minDate !== undefined ? { minDate } : {}),\n        ...(maxDate !== undefined ? { maxDate } : {}),\n      };\n    }\n    default:\n      return { ...base, contentType: 'TEXT' };\n  }\n}\n\nexport function extractOtherOptionConfig(\n  answerDetail: ApiAnswerOption,\n  fallbackLabel: string\n): McqOtherOptionConfig | undefined {\n  const otherConfig = answerDetail.answerDetailConfigs?.find(c => c.key === 'OTHER_OPTION');\n  if (firstValue(otherConfig)?.toLowerCase() !== 'true') {\n    return undefined;\n  }\n\n  const childConfigs = otherConfig?.childConfigs ?? [];\n  const label = firstValue(findConfig(childConfigs, 'LABEL')) ?? fallbackLabel;\n  const helpText = firstValue(findConfig(childConfigs, 'HELP_TEXT')) ?? '';\n  const markRequired = firstValue(findConfig(childConfigs, 'MARK_REQUIRED'))?.toLowerCase() === 'true';\n  const placeholder = answerDetail.inputPlaceholder;\n\n  const contentConfig = extractContentTypeConfig(otherConfig!);\n  if (!contentConfig) {\n    return undefined;\n  }\n\n  return {\n    ...contentConfig,\n    label,\n    helpText,\n    markRequired,\n    ...(placeholder ? { placeholder } : {}),\n  };\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport type { McqOption } from '../../../../types/mcq';\nimport { mapAnswerLogic } from '../shared/mapAnswerLogic';\nimport { extractOtherOptionConfig } from './extractOtherOptionConfig';\n\nexport function buildMcqOptions(question: ApiQuestion, language?: string): McqOption[] {\n  return (question.answerDetails ?? [])\n    .filter(a => !a.hidden && !a.additional?.isHintText)\n    .map((a, i) => {\n      const answerLogic = mapAnswerLogic(a.controlConfig?.displayLogic);\n      const optionLabel =\n        (language && a.translations?.[language]?.answerText) || a.answerText || '';\n      const otherOption = extractOtherOptionConfig(a, optionLabel);\n\n      return {\n        id: a.id ?? String(i),\n        optionLabel: otherOption?.label ?? optionLabel,\n        ...(answerLogic ? { answerLogic } : {}),\n        ...(otherOption ? { otherOption } : {}),\n      };\n    });\n}\n","import type { ApiQuestionSetting } from '../../../../internalTypes';\n\nexport type McqAnswerConditions = {\n  minSelections?: number;\n  maxSelections?: number;\n  answerConditionErrorMessage?: string;\n};\n\nexport function extractAnswerConditions(configs: ApiQuestionSetting[]): McqAnswerConditions {\n  const conditionConfig = configs.find(c => c.key === 'ANSWER_CONDITION');\n  if (conditionConfig?.value?.[0]?.toLowerCase() !== 'true') {\n    return {};\n  }\n\n  const minMaxConfig = conditionConfig.childConfigs?.find(c => c.key === 'MIN_MAX_ANSWER');\n  const minRaw = minMaxConfig?.childConfigs?.find(c => c.key === 'MIN_ANSWER')?.value?.[0];\n  const maxRaw = minMaxConfig?.childConfigs?.find(c => c.key === 'MAX_ANSWER')?.value?.[0];\n  const errorMessage = conditionConfig.childConfigs?.find(c => c.key === 'ERROR_MESSAGE')?.value?.[0];\n\n  const minSelections = minRaw !== undefined ? Number(minRaw) : undefined;\n  const maxSelections = maxRaw !== undefined ? Number(maxRaw) : undefined;\n\n  return {\n    ...(minSelections !== undefined && Number.isFinite(minSelections) ? { minSelections } : {}),\n    ...(maxSelections !== undefined && Number.isFinite(maxSelections) ? { maxSelections } : {}),\n    ...(errorMessage ? { answerConditionErrorMessage: errorMessage } : {}),\n  };\n}\n","import type { ApiQuestionSetting } from '../../../../internalTypes';\n\nexport function extractDefaultOptionIds(\n  configs: ApiQuestionSetting[],\n  validOptionIds?: string[]\n): string[] | undefined {\n  const defaultAnswerConfig = configs.find(c => c.key === 'DEFAULT_ANSWER');\n  if (defaultAnswerConfig?.value?.[0]?.toLowerCase() !== 'true') {\n    return undefined;\n  }\n\n  const defaultAnswersConfig = defaultAnswerConfig.childConfigs?.find(\n    c => c.key === 'DEFAULT_ANSWERS'\n  );\n  const ids = defaultAnswersConfig?.value?.filter(Boolean) ?? [];\n  if (ids.length === 0) {\n    return undefined;\n  }\n\n  if (validOptionIds && validOptionIds.length > 0) {\n    const validSet = new Set(validOptionIds);\n    const filtered = ids.filter(id => validSet.has(id));\n    return filtered.length > 0 ? filtered : undefined;\n  }\n\n  return ids;\n}\n","import type { McqQuestion } from '../../../../types/index';\nimport { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { parseChoiceRandomization } from '../shared/choiceRandomization';\nimport { applyMcqChoiceRandomization } from './applyMcqChoiceRandomization';\nimport { buildMcqOptions } from './buildMcqOptions';\nimport { extractAnswerConditions } from './extractAnswerConditions';\nimport { extractDefaultOptionIds } from './extractDefaultOptionIds';\n\nexport function mapMcqQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  language?: string\n): McqQuestion {\n  const configs = raw.questionConfigs ?? [];\n  const mcqVariant = configs.find(c => c.key === 'MCQ_VARIANT')?.value?.[0]?.toUpperCase() ?? 'SINGLESELECT';\n  const selectionMode = mcqVariant.includes('MULTI') ? 'multiple' : 'single';\n\n  const formatType = configs.find(c => c.key === 'MCQ_FORMAT_TYPE')?.value?.[0]?.toUpperCase() ?? 'LIST';\n  const displayFormat = formatType.includes('GRID') ? 'grid' : 'list';\n\n  const columnsConfig = configs.find(c => c.key === 'COLUMNS')?.value?.[0];\n  const columnCount = columnsConfig ? Number(columnsConfig) : undefined;\n\n  const builtOptions = buildMcqOptions(raw, language);\n  const defaultOptionIdsBeforeRandomization = extractDefaultOptionIds(\n    configs,\n    builtOptions.map(o => o.id)\n  );\n  const randomization = parseChoiceRandomization(configs);\n  const { options, shuffleOptions } = applyMcqChoiceRandomization(\n    builtOptions,\n    randomization,\n    defaultOptionIdsBeforeRandomization\n  );\n  const defaultOptionIds = extractDefaultOptionIds(\n    configs,\n    options.map(o => o.id)\n  );\n  const answerConditions = extractAnswerConditions(configs);\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.MCQ,\n    options,\n    selectionMode,\n    displayFormat,\n    shuffleOptions,\n    ...(columnCount !== undefined && Number.isFinite(columnCount) ? { columnCount } : {}),\n    ...(defaultOptionIds ? { defaultOptionIds } : {}),\n    ...answerConditions,\n    ...(raw.additionalInfo?.hasOptionLevelAnswers ? { hasOptionLevelAnswers: true } : {}),\n  };\n}\n","import type { SdkLogMetadata } from '../types/shared';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'success' | 'perf' | 'analytics';\n\nlet loggingEnabled = false;\n\n// CSS styles for console log level badges\nconst BADGE_STYLES: Record<LogLevel, string> = {\n  debug: 'background: #7f8c8d; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',\n  info: 'background: #2980b9; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',\n  warn: 'background: #f1c40f; color: #000; padding: 2px 5px; border-radius: 3px; font-weight: bold;',\n  error: 'background: #e74c3c; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',\n  success: 'background: #2ecc71; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',\n  perf: 'background: #9b59b6; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',\n  analytics: 'background: #e20074; color: #fff; padding: 2px 5px; border-radius: 3px; font-weight: bold;',\n};\n\n/**\n * Writes formatted badges and log details into the console if logging is enabled.\n * Note: analytics level logs are always printed regardless of debug settings.\n *\n * @param level Logging categorization level (debug, info, warn, error, success, analytics).\n * @param message Description message text.\n * @param meta Optional auxiliary metadata/payload.\n */\nfunction writeLog(level: LogLevel, message: string, meta?: SdkLogMetadata) {\n  if (!loggingEnabled && level !== 'analytics') return;\n\n  const timestamp = new Date().toLocaleTimeString();\n  const badge = `%c[SDK:${level.toUpperCase()}]`;\n  const style = BADGE_STYLES[level];\n\n  if (meta !== undefined) {\n    console.log(`[${timestamp}] ${badge}`, style, message, meta);\n  } else {\n    console.log(`[${timestamp}] ${badge}`, style, message);\n  }\n}\n\n/**\n * A central namespace containing logging helpers for debugging, warnings, success,\n * and API monitoring. Output logs are formatted with custom browser styles.\n */\nexport const sdkLogger = {\n  setEnabled: (val: boolean) => {\n    loggingEnabled = val;\n  },\n  isEnabled: () => {\n    return loggingEnabled;\n  },\n  debug: (msg: string, meta?: SdkLogMetadata) => writeLog('debug', msg, meta),\n  info: (msg: string, meta?: SdkLogMetadata) => writeLog('info', msg, meta),\n  warn: (msg: string, meta?: SdkLogMetadata) => writeLog('warn', msg, meta),\n  error: (msg: string, meta?: SdkLogMetadata) => writeLog('error', msg, meta),\n  success: (msg: string, meta?: SdkLogMetadata) => writeLog('success', msg, meta),\n  analytics: (msg: string, meta?: SdkLogMetadata) => writeLog('analytics', msg, meta),\n  perf: (metric: {\n    apiName: string;\n    durationMs: number;\n    status: number | string;\n    url: string;\n    requestSize?: string;\n    responseSize?: string;\n    payloadSize?: string;\n    success: boolean;\n  }) => {\n    writeLog(\n      'perf',\n      `${metric.apiName} completed in ${metric.durationMs.toFixed(2)}ms | Status: ${metric.status}`,\n      metric\n    );\n  },\n};\n","import { sdkLogger } from '../../logger/logger';\nimport type { Survey } from '../types';\nimport type { SdkLoggableError } from '../../types/shared';\n\nexport function logMapWarning(): void {\n  sdkLogger.warn('Cannot map survey: apiResponse is null or undefined');\n}\n\nexport function logMapSuccess(mappedSurvey: Survey): void {\n  sdkLogger.success('Mapped survey layout successfully', { mappedSurvey });\n}\n\nexport function logMapError(err: SdkLoggableError): void {\n  sdkLogger.error('Failed to map survey layout', { err });\n}\n\nexport function logUnknownAnswerType(answerType: string | undefined, questionId: string): void {\n  sdkLogger.warn('Unknown question answerType — falling back to MCQ mapper', {\n    answerType: answerType ?? '(missing)',\n    questionId,\n  });\n}\n","export const DISPLAY_STYLE = {\n  EMOJI: 'emoji',\n  STAR: 'star',\n  STANDARD: 'standard',\n  NUMBERED: 'numbered',\n  DROPDOWN: 'dropdown',\n  SELECTBOX: 'selectbox',\n  GRAPHICS: 'graphics',\n} as const;\n\nexport type DisplayStyle = (typeof DISPLAY_STYLE)[keyof typeof DISPLAY_STYLE];\n\nexport const API_STYLE_VALUE = {\n  EMOJI: 'EMOJI',\n  STAR: 'STAR',\n  RADIO: 'RADIO',\n  GRAPHIC: 'GRAPHIC',\n  SLIDER: 'SLIDER',\n  CSAT: 'CSAT',\n  SMILEY: 'SMILEY',\n  FACE: 'FACE',\n  DROP: 'DROP',\n  SELECT: 'SELECT',\n  NUMBER: 'NUMBER',\n} as const;\n\nexport const NPS_BUTTON_STYLE = {\n  EMOJI: 'emoji',\n  RADIO: 'radio',\n  NUMBERED: 'numbered',\n  STANDARD: 'standard',\n} as const;\n","import type { ApiAnswerDetail } from '../../../../internalTypes';\n\nexport function extractHintLabels(\n  answerDetails: ApiAnswerDetail[] = [],\n  language?: string\n): { minLabel?: string; midLabel?: string; maxLabel?: string } {\n  const hints = answerDetails\n    .filter(a => a.additional?.isHintText && !a.hidden)\n    .map(a => (language && a.translations?.[language]?.answerText) || a.answerText || '')\n    .filter(Boolean);\n\n  if (hints.length >= 3) {\n    return { minLabel: hints[0], midLabel: hints[1], maxLabel: hints[2] };\n  }\n  return { minLabel: hints[0], maxLabel: hints[1] };\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\n\ntype SelectableScalePoint = { id: string; optionLabel: string };\n\nexport function buildSelectableScalePoints(\n  question: ApiQuestion,\n  language?: string,\n  options?: { defaultCount?: number }\n): SelectableScalePoint[] {\n  const selectable = (question.answerDetails ?? []).filter(\n    a => !a.hidden && !a.additional?.isHintText\n  );\n\n  if (selectable.length > 0) {\n    return selectable.map((a, i) => ({\n      id: a.id ?? String(i),\n      optionLabel:\n        (language && a.translations?.[language]?.answerText) || a.answerText || String(i),\n    }));\n  }\n\n  if (options?.defaultCount !== undefined) {\n    return Array.from({ length: options.defaultCount }, (_, i) => ({\n      id: String(i),\n      optionLabel: String(i),\n    }));\n  }\n\n  return [];\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport { buildSelectableScalePoints } from '../matrix/buildSelectableScalePoints';\n\nexport function buildNpsScalePoints(\n  question: ApiQuestion,\n  language?: string\n): { id: string; optionLabel: string }[] {\n  return buildSelectableScalePoints(question, language, { defaultCount: 11 });\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport { QUESTION_CONFIG_KEY } from '../../../../constants/questionConfigKeys';\nimport { NPS_BUTTON_STYLE } from '../../../../constants/displayStyles';\nimport type { NpsQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { extractHintLabels } from '../labels/extractHintLabels';\nimport { buildNpsScalePoints } from './buildNpsScalePoints';\nimport { getConfigValue, hasReverseScaleOrder } from '../shared/configUtils';\n\nexport function mapNpsQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  configs: { key: string; value?: string[] }[],\n  language?: string\n): NpsQuestion {\n  const hintLabels = extractHintLabels(raw.answerDetails, language);\n  let { minLabel, maxLabel } = hintLabels;\n  const { midLabel } = hintLabels;\n  let options = buildNpsScalePoints(raw, language);\n\n  const reverseScaleOrder = hasReverseScaleOrder(configs, raw);\n  if (reverseScaleOrder) {\n    options = [...options].reverse();\n    if (minLabel !== undefined && maxLabel !== undefined) {\n      [minLabel, maxLabel] = [maxLabel, minLabel];\n    }\n  }\n\n  let midLabelIndex: number | undefined;\n  if (midLabel) {\n    midLabelIndex =\n      options.length === 11\n        ? reverseScaleOrder\n          ? 2.5\n          : 7.5\n        : (options.length - 1) / 2;\n  }\n\n  let buttonStyle: NpsQuestion['buttonStyle'] = NPS_BUTTON_STYLE.NUMBERED;\n  const variant = getConfigValue(configs, QUESTION_CONFIG_KEY.NPS_BUTTON_VARIANT)?.toLowerCase();\n  if (variant === NPS_BUTTON_STYLE.EMOJI) buttonStyle = NPS_BUTTON_STYLE.EMOJI;\n  else if (variant === NPS_BUTTON_STYLE.RADIO) buttonStyle = NPS_BUTTON_STYLE.STANDARD;\n\n  const showScaleNumbersRaw = getConfigValue(configs, QUESTION_CONFIG_KEY.SHOW_SCALE_NUMBERS);\n  const showScaleNumbers = showScaleNumbersRaw?.toLowerCase() !== 'false';\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.NPS_SCALE,\n    options,\n    ...(minLabel ? { minLabel } : {}),\n    ...(midLabel ? { midLabel } : {}),\n    ...(midLabelIndex !== undefined ? { midLabelIndex } : {}),\n    ...(maxLabel ? { maxLabel } : {}),\n    reverseScaleOrder: !!reverseScaleOrder,\n    buttonStyle,\n    showScaleNumbers,\n  };\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { TextInputQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\n\nexport function mapTextInputQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  configs: { key: string; value?: string[]; childConfigs?: { key: string; value?: string[] }[] }[],\n  language?: string\n): TextInputQuestion {\n  const contentTypeConfig = configs.find(c => c.key === 'CONTENT_TYPE');\n  const maxCharConfig = contentTypeConfig?.childConfigs?.find(\n    cc => cc.key === 'MAX_CHARACTER_COUNT'\n  );\n  const maxCharacterCount = maxCharConfig?.value?.[0] ? Number(maxCharConfig.value[0]) : undefined;\n\n  const contentType = contentTypeConfig?.value?.[0]?.toUpperCase() ?? 'LONG';\n  const inputVariant: 'short' | 'long' = contentType.includes('SHORT') ? 'short' : 'long';\n\n  const textDetail = raw.answerDetails?.[0];\n  const placeholder = textDetail\n    ? (language && textDetail.translations?.[language]?.answerText) || textDetail.answerText\n    : undefined;\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.TEXTFIELD,\n    inputVariant,\n    ...(maxCharacterCount !== undefined ? { maxCharacterCount } : {}),\n    ...(placeholder ? { placeholder } : {}),\n  };\n}\n","import type { ApiQuestionSetting } from '../../../../internalTypes/apiQuestionSetting';\n\nexport function detectMatrixFormat(configs: ApiQuestionSetting[]): 'standard' | 'carousel' | 'dropdown' {\n  const configsString = JSON.stringify(configs).toUpperCase();\n  if (configsString.includes('CAROUSEL')) return 'carousel';\n  if (configsString.includes('DROPDOWN')) return 'dropdown';\n  return 'standard';\n}\n","import type { ApiMatrixSubQuestion, ApiQuestion } from '../../../../internalTypes';\n\nexport function resolveSubQuestionText(\n  sub: ApiMatrixSubQuestion | ApiQuestion,\n  language?: string,\n  isBipolar?: boolean\n): string {\n  const subQ = sub as ApiQuestion;\n  if (isBipolar && subQ.answerDetails && subQ.answerDetails.length >= 2) {\n    const leftText =\n      (language && subQ.answerDetails[0].translations?.[language]?.answerText) ||\n      subQ.answerDetails[0].answerText ||\n      '';\n    if (leftText) return leftText;\n  }\n\n  const rawText =\n    (language && sub.translations?.[language]?.questionText) ||\n    sub.questionText ||\n    (sub as ApiMatrixSubQuestion).answerText ||\n    '';\n\n  if (isBipolar && rawText.includes(':')) {\n    return rawText.split(':')[0].trim();\n  }\n  return rawText;\n}\n","import type { ApiMatrixSubQuestion, ApiQuestion } from '../../../../internalTypes';\nimport type { CfmMatrixStatementRow } from '../../../../types/cfmMatrix';\nimport { resolveSubQuestionText } from '../matrix/resolveStatementText';\nimport { mapAnswerLogic } from '../shared/mapAnswerLogic';\n\nfunction resolveOppositeStatementText(\n  sub: ApiMatrixSubQuestion | ApiQuestion,\n  language?: string,\n  isBipolar?: boolean\n): string | undefined {\n  const subQ = sub as ApiQuestion;\n  if (isBipolar && subQ.answerDetails && subQ.answerDetails.length >= 2) {\n    const rightText =\n      (language && subQ.answerDetails[1].translations?.[language]?.answerText) ||\n      subQ.answerDetails[1].answerText ||\n      '';\n    if (rightText) return rightText;\n  }\n\n  const matrixAdditional = (sub as ApiMatrixSubQuestion).additional;\n  const text =\n    (language && (sub.translations?.[language] as { description?: string })?.description) ||\n    (sub as ApiQuestion).description ||\n    matrixAdditional?.rightLabel ||\n    matrixAdditional?.rightStatement ||\n    matrixAdditional?.rightText;\n\n  if (typeof text === 'string' && text.trim() !== '') {\n    return text;\n  }\n\n  const rawText =\n    (language && sub.translations?.[language]?.questionText) ||\n    sub.questionText ||\n    (sub as ApiMatrixSubQuestion).answerText ||\n    '';\n\n  if (isBipolar && rawText.includes(':')) {\n    return rawText.split(':').slice(1).join(':').trim();\n  }\n\n  return undefined;\n}\n\nexport function buildCfmStatementRows(\n  question: ApiQuestion,\n  language?: string,\n  isBipolar?: boolean\n): CfmMatrixStatementRow[] {\n  const rowSrc =\n    (question.matrixRowQuestions?.length ?? 0) > 0\n      ? question.matrixRowQuestions\n      : question.childSurveyQuestions;\n\n  if (rowSrc && rowSrc.length > 0) {\n    return rowSrc\n      .filter(sub => sub.id)\n      .map(sub => {\n        const answerLogic = mapAnswerLogic(sub.controlConfig?.displayLogic);\n        const oppositeStatementText = resolveOppositeStatementText(sub, language, isBipolar);\n        return {\n          id: sub.id!,\n          statementText: resolveSubQuestionText(sub, language, isBipolar),\n          ...(oppositeStatementText ? { oppositeStatementText } : {}),\n          ...(answerLogic ? { answerLogic } : {}),\n        };\n      });\n  }\n\n  return (question.answerDetails ?? [])\n    .filter(a => !a.hidden && !a.additional?.isHintText)\n    .map((a, i) => ({\n      id: `row_${i}`,\n      statementText: (language && a.translations?.[language]?.answerText) || a.answerText || '',\n    }));\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport type { ScaleColumn } from '../../../../types/shared';\nimport { mapAnswerLogic } from '../shared/mapAnswerLogic';\nimport { resolveSubQuestionText } from './resolveStatementText';\n\nexport function buildScaleColumns(question: ApiQuestion, language?: string): ScaleColumn[] {\n  if (question.matrixColumnQuestions && question.matrixColumnQuestions.length > 0) {\n    return question.matrixColumnQuestions\n      .filter(sub => sub.id)\n      .map(sub => {\n        const label =\n          (language && sub.translations?.[language]?.answerText) ||\n          sub.answerText ||\n          resolveSubQuestionText(sub, language);\n        const answerLogic = mapAnswerLogic(sub.controlConfig?.displayLogic);\n        return {\n          id: sub.id!,\n          label,\n          ...(answerLogic ? { answerLogic } : {}),\n        };\n      });\n  }\n\n  return (question.answerDetails ?? [])\n    .filter(a => !a.hidden && !a.additional?.isHintText)\n    .map((a, i) => {\n      const label = (language && a.translations?.[language]?.answerText) || a.answerText || '';\n      const answerLogic = mapAnswerLogic(a.controlConfig?.displayLogic);\n      return {\n        id: a.id ?? `col_${i}`,\n        label,\n        ...(answerLogic ? { answerLogic } : {}),\n      };\n    });\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { CfmMatrixQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { QUESTION_CONFIG_KEY } from '../../../../constants/questionConfigKeys';\nimport { detectMatrixFormat } from '../shared/detectMatrixFormat';\nimport { buildCfmStatementRows } from './buildCfmStatementRows';\nimport { buildScaleColumns } from '../matrix/buildScaleColumns';\nimport { getConfigFlag, getConfigValue, hasNotApplicableOption } from '../shared/configUtils';\n\nexport function mapCfmMatrixQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  language?: string\n): CfmMatrixQuestion {\n  const configs = raw.questionConfigs ?? [];\n  const matrixTypeValue = getConfigValue(configs, QUESTION_CONFIG_KEY.MATRIX_TYPE)?.toLowerCase();\n  const statementLayout = matrixTypeValue === 'bipolar' ? 'bipolar' : 'likert';\n  const isBipolar = statementLayout === 'bipolar';\n\n  const statementRows = buildCfmStatementRows(raw, language, isBipolar);\n  const scaleColumns = buildScaleColumns(raw, language);\n\n  const gridLayout = detectMatrixFormat(configs);\n\n  const hasMultiConfig = configs.some(\n    c =>\n      c.key.includes('MULTI') ||\n      c.value?.[0]?.toUpperCase().includes('MULTI') ||\n      (c.key.includes('ANSWER') && c.value?.[0]?.toUpperCase().includes('MULTI')) ||\n      (c.key.includes('SELECT') && c.value?.[0]?.toUpperCase().includes('MULTI'))\n  );\n  const selectionMode = hasMultiConfig ? 'multiple' : 'single';\n\n  const transposeTable = getConfigFlag(configs, QUESTION_CONFIG_KEY.TRANSPOSE_TABLE);\n  const repeatColumnHeaders = getConfigFlag(configs, QUESTION_CONFIG_KEY.REPEAT_SCALE);\n\n  const notApplicable = hasNotApplicableOption(configs);\n\n  const effectiveTranspose = notApplicable ? false : transposeTable;\n\n  if (notApplicable) {\n    scaleColumns.push({ id: 'na', label: 'N/A' });\n  }\n\n  const showColumnHeaders =\n    getConfigValue(configs, QUESTION_CONFIG_KEY.ENABLE_SCALE)?.toLowerCase() !== 'false';\n\n  let scaleAnchorLabels: string[] | undefined;\n  if (statementLayout === 'bipolar') {\n    scaleAnchorLabels = (raw.answerDetails ?? [])\n      .filter(a => a.additional?.isHintText && !a.hidden)\n      .map(a => (language && a.translations?.[language]?.answerText) || a.answerText || '')\n      .filter(Boolean);\n    if (scaleAnchorLabels.length === 0) scaleAnchorLabels = undefined;\n  }\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.CFM_MATRIX,\n    statementRows,\n    scaleColumns,\n    statementLayout,\n    selectionMode,\n    gridLayout,\n    transposeTable: effectiveTranspose,\n    repeatColumnHeaders: !!repeatColumnHeaders,\n    hasNotApplicableOption: notApplicable,\n    showColumnHeaders,\n    ...(scaleAnchorLabels ? { scaleAnchorLabels } : {}),\n  };\n}\n","import { QUESTION_CONFIG_KEY } from '../../../../constants/questionConfigKeys';\nimport { API_STYLE_VALUE, DISPLAY_STYLE, type DisplayStyle } from '../../../../constants/displayStyles';\nimport { getConfigValue } from './configUtils';\n\nexport function detectDisplayStyle(\n  configs: { key: string; value?: string[] }[],\n  dataSubType?: string\n): DisplayStyle {\n  const allConfigValues = configs.map(c => c.value?.[0] || '').join(' ').toUpperCase();\n  const searchString = `${allConfigValues} ${(dataSubType || '').toUpperCase()}`;\n\n  let buttonType = getConfigValue(configs, QUESTION_CONFIG_KEY.BUTTON_TYPE)?.toLowerCase();\n  if (buttonType === API_STYLE_VALUE.RADIO.toLowerCase()) {\n    buttonType = DISPLAY_STYLE.STANDARD;\n  }\n\n  const knownStyles: DisplayStyle[] = [\n    DISPLAY_STYLE.EMOJI,\n    DISPLAY_STYLE.STAR,\n    DISPLAY_STYLE.STANDARD,\n    DISPLAY_STYLE.NUMBERED,\n    DISPLAY_STYLE.DROPDOWN,\n    DISPLAY_STYLE.SELECTBOX,\n    DISPLAY_STYLE.GRAPHICS,\n  ];\n  if (buttonType && knownStyles.includes(buttonType as DisplayStyle)) {\n    return buttonType as DisplayStyle;\n  }\n\n  if (\n    searchString.includes(API_STYLE_VALUE.EMOJI) ||\n    searchString.includes(API_STYLE_VALUE.CSAT) ||\n    searchString.includes(API_STYLE_VALUE.SMILEY) ||\n    searchString.includes(API_STYLE_VALUE.FACE)\n  ) {\n    return DISPLAY_STYLE.EMOJI;\n  }\n  if (searchString.includes(API_STYLE_VALUE.STAR)) return DISPLAY_STYLE.STAR;\n  if (searchString.includes(API_STYLE_VALUE.GRAPHIC) || searchString.includes(API_STYLE_VALUE.SLIDER)) {\n    return DISPLAY_STYLE.GRAPHICS;\n  }\n  if (searchString.includes(API_STYLE_VALUE.DROP)) return DISPLAY_STYLE.DROPDOWN;\n  if (searchString.includes(API_STYLE_VALUE.SELECT)) return DISPLAY_STYLE.SELECTBOX;\n  if (searchString.includes(API_STYLE_VALUE.RADIO)) return DISPLAY_STYLE.STANDARD;\n  if (searchString.includes(API_STYLE_VALUE.NUMBER)) return DISPLAY_STYLE.NUMBERED;\n\n  return DISPLAY_STYLE.STANDARD;\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport type { StatementRow } from '../../../../types/shared';\nimport { resolveSubQuestionText } from './resolveStatementText';\nimport { mapAnswerLogic } from '../shared/mapAnswerLogic';\n\nexport function buildSimpleStatementRows(\n  question: ApiQuestion,\n  language?: string\n): StatementRow[] {\n  const rowSrc =\n    (question.matrixRowQuestions?.length ?? 0) > 0\n      ? question.matrixRowQuestions\n      : question.childSurveyQuestions;\n\n  if (rowSrc && rowSrc.length > 0) {\n    return rowSrc\n      .filter(sub => sub.id)\n      .map(sub => {\n        const answerLogic = mapAnswerLogic(sub.controlConfig?.displayLogic);\n        return {\n          id: sub.id!,\n          statementText: resolveSubQuestionText(sub, language),\n          ...(answerLogic ? { answerLogic } : {}),\n        };\n      });\n  }\n\n  return (question.answerDetails ?? [])\n    .filter(a => !a.hidden && !a.additional?.isHintText)\n    .map((a, i) => ({\n      id: `row_${i}`,\n      statementText: (language && a.translations?.[language]?.answerText) || a.answerText || '',\n    }));\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport type { ScaleColumn } from '../../../../types/shared';\nimport { hasNotApplicableOption, hasReverseScaleOrder } from '../shared/configUtils';\n\nexport type ResolvedMatrixScaleOptions = {\n  scaleColumns: ScaleColumn[];\n  scaleAnchorLabels: string[];\n  hasNotApplicableOption: boolean;\n  reverseScaleOrder: boolean;\n};\n\nexport function resolveMatrixScaleOptions(\n  raw: ApiQuestion,\n  configs: { key: string; value?: string[] }[],\n  language: string | undefined,\n  scaleColumns: ScaleColumn[]\n): ResolvedMatrixScaleOptions {\n  const notApplicable = hasNotApplicableOption(configs);\n  const reverseScaleOrder = hasReverseScaleOrder(configs, raw);\n\n  let scaleAnchorLabels = (raw.answerDetails ?? [])\n    .filter(a => a.additional?.isHintText && !a.hidden)\n    .map(a => (language && a.translations?.[language]?.answerText) || a.answerText || '')\n    .filter(Boolean);\n\n  let resolvedColumns = scaleColumns;\n  if (reverseScaleOrder) {\n    resolvedColumns = [...scaleColumns].reverse();\n    scaleAnchorLabels = [...scaleAnchorLabels].reverse();\n  }\n\n  if (notApplicable) {\n    resolvedColumns = [...resolvedColumns, { id: 'na', label: 'N/A' }];\n  }\n\n  return {\n    scaleColumns: resolvedColumns,\n    scaleAnchorLabels,\n    hasNotApplicableOption: notApplicable,\n    reverseScaleOrder,\n  };\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { CsatQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { detectDisplayStyle } from '../shared/detectDisplayStyle';\nimport { detectMatrixFormat } from '../shared/detectMatrixFormat';\nimport { buildScaleColumns } from '../matrix/buildScaleColumns';\nimport { buildSimpleStatementRows } from '../matrix/buildSimpleStatementRows';\nimport { resolveMatrixScaleOptions } from '../matrix/resolveMatrixScaleOptions';\n\nexport function mapCsatQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  language?: string\n): CsatQuestion {\n  const configs = raw.questionConfigs ?? [];\n  const { scaleColumns, scaleAnchorLabels, hasNotApplicableOption, reverseScaleOrder } =\n    resolveMatrixScaleOptions(raw, configs, language, buildScaleColumns(raw, language));\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.CSAT_MATRIX,\n    statementRows: buildSimpleStatementRows(raw, language),\n    scaleColumns,\n    displayStyle: detectDisplayStyle(configs, raw.dataSubType),\n    hasNotApplicableOption,\n    reverseScaleOrder,\n    gridLayout: detectMatrixFormat(configs),\n    ...(scaleAnchorLabels.length > 0 ? { scaleAnchorLabels } : {}),\n  };\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { RatingMatrixQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { detectDisplayStyle } from '../shared/detectDisplayStyle';\nimport { detectMatrixFormat } from '../shared/detectMatrixFormat';\nimport { extractHintLabels } from '../labels/extractHintLabels';\nimport { buildScaleColumns } from '../matrix/buildScaleColumns';\nimport { buildSimpleStatementRows } from '../matrix/buildSimpleStatementRows';\nimport { resolveMatrixScaleOptions } from '../matrix/resolveMatrixScaleOptions';\n\nexport function mapRatingMatrixQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  language?: string\n): RatingMatrixQuestion {\n  const configs = raw.questionConfigs ?? [];\n  const { scaleColumns, scaleAnchorLabels, hasNotApplicableOption, reverseScaleOrder } =\n    resolveMatrixScaleOptions(raw, configs, language, buildScaleColumns(raw, language));\n\n  const { minLabel, maxLabel } = extractHintLabels(raw.answerDetails, language);\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.RATING_MATRIX,\n    statementRows: buildSimpleStatementRows(raw, language),\n    scaleColumns,\n    ...(minLabel ? { minLabel } : {}),\n    ...(maxLabel ? { maxLabel } : {}),\n    displayStyle: detectDisplayStyle(configs, raw.dataSubType),\n    hasNotApplicableOption,\n    reverseScaleOrder,\n    gridLayout: detectMatrixFormat(configs),\n    ...(scaleAnchorLabels.length > 0 ? { scaleAnchorLabels } : {}),\n  };\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport type { SliderMatrixStatementRow } from '../../../../types/sliderMatrix';\nimport { buildSimpleStatementRows } from '../matrix/buildSimpleStatementRows';\n\nexport function buildSliderMatrixRows(\n  question: ApiQuestion,\n  language?: string\n): SliderMatrixStatementRow[] {\n  const baseMin = Number(question.additional?.sliderMin ?? 0);\n  const baseMax = Number(question.additional?.sliderMax ?? 10);\n  const baseStep = Number(question.additional?.sliderStep ?? 1);\n\n  const rows = buildSimpleStatementRows(question, language);\n\n  return rows.map(row => ({\n    ...row,\n    min: Number.isFinite(baseMin) ? baseMin : 0,\n    max: Number.isFinite(baseMax) ? baseMax : 10,\n    step: Number.isFinite(baseStep) && baseStep > 0 ? baseStep : 1,\n  }));\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { SliderMatrixQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { buildSliderMatrixRows } from './buildSliderMatrixRows';\n\nexport function mapSliderMatrixQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  language?: string\n): SliderMatrixQuestion {\n  const configs = raw.questionConfigs || [];\n  const sliderConfig = configs.find(c => c.key === 'SLIDER_TICKS_AND_VALUES');\n  const childConfigs = sliderConfig?.childConfigs || [];\n\n  const rawMin = childConfigs.find(c => c.key === 'TICK_START')?.value?.[0];\n  const rawMax = childConfigs.find(c => c.key === 'TICK_END')?.value?.[0];\n  const rawStep = childConfigs.find(c => c.key === 'STEP_SIZE')?.value?.[0];\n  const rawTicks = sliderConfig?.value?.[0];\n\n  const min = rawMin !== undefined ? Number(rawMin) : 0;\n  const max = rawMax !== undefined ? Number(rawMax) : 10;\n  const step = rawStep !== undefined ? Number(rawStep) : 1;\n  const tickCount = rawTicks !== undefined ? Number(rawTicks) : 10;\n\n  const enrichedRaw = {\n    ...raw,\n    additional: {\n      ...raw.additional,\n      sliderMin: min,\n      sliderMax: max,\n      sliderStep: step,\n    },\n  };\n\n  const statementRows = buildSliderMatrixRows(enrichedRaw, language);\n\n  const scaleAnchorLabels = (raw.answerDetails || [])\n    .filter(a => a.additional?.isHintText)\n    .map(a => (language && a.translations?.[language]?.answerText) || a.answerText || '')\n    .filter(Boolean);\n\n  const getFlag = (keys: string[]) => {\n    for (const key of keys) {\n      const c = configs.find(x => x.key === key) || childConfigs.find(x => x.key === key);\n      if (c?.value?.length) {\n        return c.value[0]?.toString().toLowerCase() === 'true';\n      }\n    }\n    return false;\n  };\n\n  const isGraphics = configs\n    .find(c => c.key === 'SCALE_TYPE' || c.key === 'VIEW_VARIANT')\n    ?.value?.[0]\n    ?.toUpperCase()\n    .includes('GRAPHIC');\n\n  const enableInputBox = getFlag(['ENABLE_INPUT_BOX', 'SHOW_INPUT_BOX', 'INPUT_BOX', 'ENABLE_INPUT']);\n  const displayValues = getFlag(['SHOW_VALUE', 'DISPLAY_VALUES']);\n  const hasNotApplicableOption = getFlag(['NOT_APPLICABLE', 'NOT_APPLICABLE_OPTIONS']);\n\n  const answerOptions = (raw.answerDetails || [])\n    .filter(a => !a.additional?.isHintText && !a.hidden)\n    .map(a => a.translations?.[language || '']?.answerText || a.answerText || '');\n\n  const marks: SliderMatrixQuestion['ticks']['marks'] = [];\n  if (tickCount > 1) {\n    const markStep = (max - min) / (tickCount - 1);\n    for (let i = 0; i < tickCount; i++) {\n      const tickPosition = Number((min + i * markStep).toFixed(2));\n      const tickLabel = answerOptions[i] || tickPosition.toString();\n      marks.push({ tickPosition, tickLabel });\n    }\n  }\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.SLIDER_MATRIX,\n    statementRows,\n    ticks: {\n      count: tickCount,\n      marks,\n    },\n    enableInputBox,\n    displayValues,\n    hasNotApplicableOption,\n    sliderStyle: isGraphics ? 'graphics' : 'standard',\n    ...(scaleAnchorLabels.length > 0 ? { scaleAnchorLabels } : {}),\n  };\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport type { QuestionMedia } from '../../../../types/shared';\n\nexport function buildMediaConfig(question: ApiQuestion): QuestionMedia {\n  const add = question.additional ?? {};\n\n  let url = (add['mediaUrl'] as string | undefined) ?? (add['previewUrl'] as string | undefined);\n  let mimeType = add['mediaMimeType'] as string | undefined;\n  const title = add['title'] as string | undefined;\n\n  const assets = question.questionContainerAssets;\n  if (Array.isArray(assets) && assets.length > 0) {\n    const asset = assets[0];\n    if (asset.source || asset.previewImageUrl) {\n      url = asset.source || asset.previewImageUrl;\n    }\n    if (asset.type) {\n      if (asset.type === 'PHOTO' || asset.type === 'IMAGE') mimeType = 'image/*';\n      else if (asset.type === 'VIDEO') mimeType = 'video/*';\n      else mimeType = asset.type;\n    }\n  }\n\n  const configs = question.questionConfigs || [];\n  const alignConfig = configs.find(c => c.key === 'TEXT_AND_MEDIA_ALIGNMENT');\n  const sizeConfig = configs.find(c => c.key === 'TEXT_AND_MEDIA_SIZE');\n  const alignment = alignConfig?.value?.[0];\n  const size = sizeConfig?.value?.[0] ? Number(sizeConfig.value[0]) : undefined;\n\n  return {\n    ...(url ? { url } : {}),\n    ...(mimeType ? { mimeType } : {}),\n    ...(title ? { title } : {}),\n    ...(alignment ? { alignment } : {}),\n    ...(size !== undefined ? { size } : {}),\n  };\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { TextAndMediaQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { buildMediaConfig } from './buildMediaConfig';\n\nexport function mapTextAndMediaQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell\n): TextAndMediaQuestion {\n  const media = buildMediaConfig(raw);\n  const { containerMedia: _containerMedia, ...shellFields } = shell;\n\n  let questionText = shell.questionText;\n  if (Array.isArray(raw.answerDetails)) {\n    const headerDetail = raw.answerDetails.find(\n      d => d.additional?.textAndMediaFieldType === 'HEADER'\n    );\n    if (headerDetail?.answerText) {\n      questionText = headerDetail.answerText;\n    }\n  }\n\n  const hasMedia = Object.keys(media).length > 0;\n\n  return {\n    ...shellFields,\n    questionText,\n    type: QUESTION_TYPE.TEXT_AND_MEDIA,\n    ...(hasMedia ? { media } : {}),\n  };\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { FileUploadQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\n\nexport function mapFileUploadQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  language?: string\n): FileUploadQuestion {\n  const configs = raw.questionConfigs || [];\n\n  const uploadMessageDetail = raw.answerDetails?.find(\n    a => a.additional?.fieldType === 'UPLOAD_MESSAGE'\n  );\n  const uploadMessage =\n    (language && uploadMessageDetail?.translations?.[language]?.answerText) ||\n    uploadMessageDetail?.answerText ||\n    '';\n\n  const supportedConfig = configs.find(c => c.key === 'SUPPORTED_FILE_FORMAT');\n  const supportedFileFormats =\n    supportedConfig?.value?.map(ext => ext.toUpperCase().replace(/^\\./, '')) || [];\n\n  const maxFileCountConfig = configs.find(c => c.key === 'MAX_FILE_COUNT');\n  const maxFileCount = maxFileCountConfig?.value?.[0]\n    ? Number(maxFileCountConfig.value[0])\n    : undefined;\n\n  const fileSizeLimitConfig = configs.find(c => c.key === 'FILE_SIZE_LIMIT');\n  const sizeLimitId = fileSizeLimitConfig?.childConfigs?.find(\n    cc => cc.key === 'SIZE_LIMIT_ID'\n  )?.value?.[0];\n  const sizeFormatId = fileSizeLimitConfig?.childConfigs?.find(\n    cc => cc.key === 'SIZE_FORMAT_ID'\n  )?.value?.[0];\n\n  const fileSizeLimit = sizeLimitId ? Number(sizeLimitId) : undefined;\n  const fileSizeLimitType: 'PER_FILE' | 'IN_TOTAL' =\n    sizeFormatId === 'IN_TOTAL' ? 'IN_TOTAL' : 'PER_FILE';\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.FILE_UPLOAD,\n    supportedFileFormats,\n    fileSizeLimitType,\n    ...(uploadMessage ? { uploadMessage } : {}),\n    ...(maxFileCount !== undefined ? { maxFileCount } : {}),\n    ...(fileSizeLimit !== undefined ? { fileSizeLimit } : {}),\n  };\n}\n","import type { HeatmapRegion } from '../../../../types/heatmap';\n\nexport type ApiHeatmapRegion = {\n  id: string;\n  label?: string;\n  coordinateX: number;\n  coordinateY: number;\n  width: number;\n  height: number;\n  color?: string;\n};\n\nexport function buildHeatmapRegions(\n  apiRegions: ApiHeatmapRegion[],\n  imageWidth: number,\n  imageHeight: number\n): { regions: HeatmapRegion[]; referenceWidth: number; referenceHeight: number } {\n  const referenceWidth =\n    imageWidth > 0\n      ? imageWidth\n      : Math.max(...apiRegions.map(region => region.coordinateX + region.width), 1);\n\n  const referenceHeight =\n    imageHeight > 0\n      ? imageHeight\n      : Math.max(...apiRegions.map(region => region.coordinateY + region.height), 1);\n\n  const regions: HeatmapRegion[] = apiRegions.map(region => ({\n    id: region.id,\n    label: region.label ?? region.id,\n    x: region.coordinateX / referenceWidth,\n    y: region.coordinateY / referenceHeight,\n    width: region.width / referenceWidth,\n    height: region.height / referenceHeight,\n    ...(region.color ? { color: region.color } : {}),\n  }));\n\n  return { regions, referenceWidth, referenceHeight };\n}\n","import { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { HeatmapQuestion } from '../../../../types/index';\nimport type { ApiQuestion } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport { buildHeatmapRegions } from './buildHeatmapRegions';\n\nexport function mapHeatmapQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell\n): HeatmapQuestion {\n  const metadata = raw.surveyHeatmapMetadata;\n  const asset = raw.questionAssets?.[0];\n  const imageUrl = asset?.source || asset?.previewImageUrl || '';\n\n  const rawMax = metadata?.totalClickAllowed ?? 20;\n  const maxClicksAllowed = Math.min(20, Math.max(1, rawMax));\n\n  const { regions, referenceWidth, referenceHeight } = buildHeatmapRegions(\n    metadata?.heatmapRegions ?? [],\n    metadata?.imageWidth ?? 0,\n    metadata?.imageHeight ?? 0\n  );\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.HEATMAP,\n    imageUrl,\n    regions,\n    maxClicksAllowed,\n    referenceWidth,\n    referenceHeight,\n  };\n}\n","import type { ApiQuestion } from '../../../../internalTypes';\nimport { mapAnswerLogic } from '../shared/mapAnswerLogic';\n\nexport function buildRankOrderOptions(\n  question: ApiQuestion,\n  language?: string\n): {\n  id: string;\n  optionLabel: string;\n  imageUrl?: string;\n  previewImageUrl?: string;\n  answerLogic?: ReturnType<typeof mapAnswerLogic>;\n}[] {\n  return (question.answerDetails ?? [])\n    .filter(answer => !answer.hidden && !answer.additional?.isHintText)\n    .map((answer, index) => {\n      const answerLogic = mapAnswerLogic(answer.controlConfig?.displayLogic);\n      const asset = answer.answerAsset;\n      const imageUrl = asset?.source || asset?.previewImageUrl;\n      const previewImageUrl = asset?.previewImageUrl || asset?.source;\n\n      return {\n        id: answer.id ?? String(index),\n        optionLabel:\n          (language && answer.translations?.[language]?.answerText) || answer.answerText || '',\n        ...(imageUrl ? { imageUrl } : {}),\n        ...(previewImageUrl ? { previewImageUrl } : {}),\n        ...(answerLogic ? { answerLogic } : {}),\n      };\n    });\n}\n","import type {\n  RankOrderInteractionMode,\n  RankOrderOptionDisplay,\n  RankOrderQuestion,\n} from '../../../../types/index';\nimport { QUESTION_TYPE } from '../../../../constants/questionTypes';\nimport type { ApiQuestion, ApiQuestionSetting } from '../../../../internalTypes';\nimport type { ResolvedQuestionShell } from '../shared/resolveQuestionShell';\nimport {\n  applyChoiceRandomization,\n  parseChoiceRandomization,\n} from '../shared/choiceRandomization';\nimport { buildRankOrderOptions } from './buildRankOrderOptions';\n\nfunction parseBooleanConfig(configs: ApiQuestionSetting[], key: string): boolean {\n  return configs.find(config => config.key === key)?.value?.[0]?.toLowerCase() === 'true';\n}\n\nfunction mapInteractionMode(rawValue: string | undefined): RankOrderInteractionMode {\n  if (rawValue?.toUpperCase() === 'DRAG_AND_DROP') {\n    return 'dragAndDrop';\n  }\n  return 'dropdown';\n}\n\nfunction mapOptionDisplay(rawValue: string | undefined): RankOrderOptionDisplay {\n  switch (rawValue?.toUpperCase()) {\n    case 'TEXT_ONLY':\n      return 'textOnly';\n    case 'IMAGE_ONLY':\n      return 'imageOnly';\n    case 'TEXT_AND_IMAGE':\n    default:\n      return 'textAndImage';\n  }\n}\n\nexport function mapRankOrderQuestion(\n  raw: ApiQuestion,\n  shell: ResolvedQuestionShell,\n  configs: ApiQuestionSetting[],\n  language?: string\n): RankOrderQuestion {\n  const answerTypeConfig = configs.find(config => config.key === 'RANK_ORDER_ANSWER_TYPE');\n  const optionTypeConfig = configs.find(config => config.key === 'OPTION_TYPE');\n\n  const builtOptions = buildRankOrderOptions(raw, language);\n  const randomization = parseChoiceRandomization(configs);\n  const { options, shuffleOptions } = applyChoiceRandomization(builtOptions, randomization);\n\n  return {\n    ...shell,\n    type: QUESTION_TYPE.RANK_ORDER,\n    options,\n    interactionMode: mapInteractionMode(answerTypeConfig?.value?.[0]),\n    optionDisplay: mapOptionDisplay(optionTypeConfig?.value?.[0]),\n    requireRankAll: parseBooleanConfig(configs, 'REQUIRE_RANK_ALL'),\n    shuffleOptions,\n  };\n}\n","import type { ApiQuestion } from '../../../internalTypes';\nimport type { QuestionBeforeLogics } from './shared/questionMapperTypes';\nimport { QUESTION_TYPE } from '../../../constants/questionTypes';\nimport { mapMcqQuestion } from './mcq/mapMcqQuestion';\nimport { mapNpsQuestion } from './nps/mapNpsQuestion';\nimport { mapTextInputQuestion } from './textInput/mapTextInputQuestion';\nimport { mapCfmMatrixQuestion } from './cfmMatrix/mapCfmMatrixQuestion';\nimport { mapCsatQuestion } from './csat/mapCsatQuestion';\nimport { mapRatingMatrixQuestion } from './ratingMatrix/mapRatingMatrixQuestion';\nimport { mapSliderMatrixQuestion } from './sliderMatrix/mapSliderMatrixQuestion';\nimport { mapTextAndMediaQuestion } from './textAndMedia/mapTextAndMediaQuestion';\nimport { mapFileUploadQuestion } from './fileUpload/mapFileUploadQuestion';\nimport { mapHeatmapQuestion } from './heatmap/mapHeatmapQuestion';\nimport { mapRankOrderQuestion } from './rankOrder/mapRankOrderQuestion';\nimport type { ResolvedQuestionShell } from './shared/resolveQuestionShell';\n\ntype QuestionMapperContext = {\n  raw: ApiQuestion;\n  shell: ResolvedQuestionShell;\n  configs: { key: string; value?: string[] }[];\n  language?: string;\n};\n\ntype QuestionMapperFn = (ctx: QuestionMapperContext) => QuestionBeforeLogics;\n\nconst mapMcq: QuestionMapperFn = ({ raw, shell, language }) =>\n  mapMcqQuestion(raw, shell, language);\n\nconst mapNps: QuestionMapperFn = ({ raw, shell, configs, language }) =>\n  mapNpsQuestion(raw, shell, configs, language);\n\nconst mapTextInput: QuestionMapperFn = ({ raw, shell, configs, language }) =>\n  mapTextInputQuestion(raw, shell, configs, language);\n\nconst mapCfmMatrix: QuestionMapperFn = ({ raw, shell, language }) =>\n  mapCfmMatrixQuestion(raw, shell, language);\n\nconst mapCsatMatrix: QuestionMapperFn = ({ raw, shell, language }) =>\n  mapCsatQuestion(raw, shell, language);\n\nconst mapRatingMatrix: QuestionMapperFn = ({ raw, shell, language }) =>\n  mapRatingMatrixQuestion(raw, shell, language);\n\nconst mapSliderMatrix: QuestionMapperFn = ({ raw, shell, language }) =>\n  mapSliderMatrixQuestion(raw, shell, language);\n\nconst mapTextAndMedia: QuestionMapperFn = ({ raw, shell }) =>\n  mapTextAndMediaQuestion(raw, shell);\n\nconst mapFileUpload: QuestionMapperFn = ({ raw, shell, language }) =>\n  mapFileUploadQuestion(raw, shell, language);\n\nconst mapHeatmap: QuestionMapperFn = ({ raw, shell }) => mapHeatmapQuestion(raw, shell);\n\nconst mapRankOrder: QuestionMapperFn = ({ raw, shell, configs, language }) =>\n  mapRankOrderQuestion(raw, shell, configs, language);\n\nexport const QUESTION_MAPPERS: Record<string, QuestionMapperFn> = {\n  [QUESTION_TYPE.MCQ]: mapMcq,\n  [QUESTION_TYPE.NPS_SCALE]: mapNps,\n  SCALE: mapNps,\n  [QUESTION_TYPE.TEXTFIELD]: mapTextInput,\n  [QUESTION_TYPE.CFM_MATRIX]: mapCfmMatrix,\n  [QUESTION_TYPE.CSAT_MATRIX]: mapCsatMatrix,\n  [QUESTION_TYPE.RATING_MATRIX]: mapRatingMatrix,\n  [QUESTION_TYPE.SLIDER_MATRIX]: mapSliderMatrix,\n  [QUESTION_TYPE.TEXT_AND_MEDIA]: mapTextAndMedia,\n  [QUESTION_TYPE.FILE_UPLOAD]: mapFileUpload,\n  [QUESTION_TYPE.HEATMAP]: mapHeatmap,\n  [QUESTION_TYPE.RANK_ORDER]: mapRankOrder,\n};\n\nexport function resolveQuestionMapper(answerType: string | undefined): QuestionMapperFn | undefined {\n  if (!answerType) return undefined;\n  return QUESTION_MAPPERS[answerType];\n}\n","import type { SurveyQuestion } from '../../../types/index';\nimport type { ApiQuestion } from '../../../internalTypes';\nimport { resolveQuestionShell } from './shared/resolveQuestionShell';\nimport { mapSkipLogics } from './shared/mapSkipLogics';\nimport { mapDisplayLogic } from './shared/mapDisplayLogic';\nimport { mapQuestionDisplayVariants } from './shared/mapQuestionDisplayVariants';\nimport { attachQuestionLogics } from './shared/attachQuestionLogics';\nimport type { QuestionBeforeLogics } from './shared/questionMapperTypes';\nimport { mapMcqQuestion } from './mcq/mapMcqQuestion';\nimport { logUnknownAnswerType } from '../../../logger/mapperLogger';\nimport { resolveQuestionMapper } from './registry';\n\nexport function mapQuestion(\n  raw: ApiQuestion,\n  language?: string,\n  placeholders?: Record<string, string>\n): SurveyQuestion {\n  const configs = raw.questionConfigs ?? [];\n  const shell = resolveQuestionShell(raw, configs, language, placeholders);\n  const skipLogics = mapSkipLogics(raw.controlConfig?.skipLogics);\n  const displayLogic = mapDisplayLogic(raw.controlConfig?.displayLogic);\n  const displayVariants = mapQuestionDisplayVariants(raw, language, placeholders);\n\n  const withLogics = (question: QuestionBeforeLogics): SurveyQuestion =>\n    attachQuestionLogics(question, skipLogics, displayLogic, displayVariants);\n\n  const mapper = resolveQuestionMapper(raw.answerType);\n  if (mapper) {\n    return withLogics(mapper({ raw, shell, configs, language }));\n  }\n\n  logUnknownAnswerType(raw.answerType, raw.id ?? shell.id);\n  return withLogics(mapMcqQuestion(raw, shell, language));\n}\n","import type { ApiCtaButton, ApiCtaConfig } from '../../../internalTypes';\nimport type { SpecialPageCtas, SurveyCtaButton, SurveyPageCtaConfig } from '../../../types/survey';\n\nexport type MapCtaButtonOptions = {\n  defaultLabel?: string;\n  defaultEnabled?: boolean;\n};\n\nexport function mapCtaButton(\n  api: ApiCtaButton | undefined,\n  language: string | undefined,\n  options: MapCtaButtonOptions = {}\n): SurveyCtaButton | undefined {\n  if (!api) return undefined;\n\n  const translation = language ? api.translations?.[language] : undefined;\n\n  const label =\n    translation?.buttonText?.trim() ||\n    api.buttonText?.trim() ||\n    options.defaultLabel?.trim() ||\n    '';\n\n  if (!label) return undefined;\n\n  const enabled = translation?.enabled ?? api.enabled ?? options.defaultEnabled ?? true;\n\n  const inputPlaceholder =\n    translation?.inputPlaceholder?.trim() || api.inputPlaceholder?.trim();\n\n  const ctaDescription =\n    translation?.ctaDescription?.trim() || api.ctaDescription?.trim();\n\n  return {\n    label,\n    enabled,\n    ...(api.url?.trim() ? { url: api.url.trim() } : {}),\n    ...(inputPlaceholder ? { inputPlaceholder } : {}),\n    ...(ctaDescription ? { ctaDescription } : {}),\n  };\n}\n\nexport function mapPageCtaConfig(\n  api: ApiCtaConfig | undefined,\n  language: string\n): SurveyPageCtaConfig | undefined {\n  if (!api) return undefined;\n\n  const next = mapCtaButton(api.next, language, { defaultLabel: 'Next' });\n  const previous = mapCtaButton(api.previous, language, { defaultLabel: 'Back' });\n\n  if (!next && !previous) return undefined;\n\n  return {\n    ...(next ? { next } : {}),\n    ...(previous ? { previous } : {}),\n  };\n}\n\nconst SPECIAL_PAGE_CTA_KEYS = [\n  'start',\n  'redirect',\n  'sendEmailResponse',\n  'resumptionNotification',\n  'reopenNotification',\n] as const satisfies ReadonlyArray<keyof SpecialPageCtas>;\n\nexport function mapSpecialPageCtas(\n  api: ApiCtaConfig | undefined,\n  language: string\n): SpecialPageCtas | undefined {\n  if (!api) return undefined;\n\n  const ctas: SpecialPageCtas = {};\n\n  const start =\n    mapCtaButton(api.others?.start, language) ??\n    mapCtaButton(api.start, language);\n  if (start) ctas.start = start;\n\n  for (const key of SPECIAL_PAGE_CTA_KEYS) {\n    if (key === 'start') continue;\n    const mapped = mapCtaButton(api.others?.[key], language);\n    if (mapped) ctas[key] = mapped;\n  }\n\n  return Object.keys(ctas).length > 0 ? ctas : undefined;\n}\n","import type { SurveyPage } from '../types/survey';\nimport type { ApiQuestion, ApiResponse } from '../internalTypes';\nimport { mapQuestion } from './mappers/question';\nimport { mapPageCtaConfig } from './mappers/survey/mapCtaButton';\n\n/**\n * Maps the raw DTO survey pages and their questions into UI-friendly structure.\n *\n * @param api The raw API response envelope containing survey DTO pages.\n * @param surveyLanguage The resolved target language.\n * @param placeholders Optional dictionary mapping placeholder keys to replacement values.\n * @returns Array of mapped SurveyPage objects.\n */\nexport function mapSurveyPages(\n  api: ApiResponse,\n  surveyLanguage: string,\n  placeholders?: Record<string, string>\n): SurveyPage[] {\n  const dto = api.cfmSurveyDTO;\n  if (!dto || !Array.isArray(dto.surveyPages)) {\n    return [];\n  }\n\n  return dto.surveyPages.map((page, index) => {\n    const questions = (page.questionHolders ?? [])\n      .map(holder => holder.question)\n      .filter((q): q is ApiQuestion => Boolean(q))\n      .map(q => mapQuestion(q, surveyLanguage, placeholders));\n\n    const cta = mapPageCtaConfig(page.ctaConfig, surveyLanguage);\n\n    return {\n      id: page.id ?? `page_${index}`,\n      title: page.title ?? `Page ${index + 1}`,\n      questions,\n      ...(cta ? { cta } : {}),\n    };\n  });\n}\n","import type { ApiResponse, ApiSpecialPage } from '../../../internalTypes';\nimport type { SpecialPage, SurveyPhaseFlags } from '../../../types/survey';\nimport { mapDisplayLogic } from '../question/shared/mapDisplayLogic';\nimport { mapSpecialPageCtas } from './mapCtaButton';\n\nfunction resolveSpecialPageText(\n  page: ApiSpecialPage | undefined,\n  language?: string\n): SpecialPage | undefined {\n  if (!page?.id || page.disabled) return undefined;\n\n  const translations = page.translations?.[language ?? ''];\n  const header =\n    translations?.headerRichText ||\n    translations?.header ||\n    page.headerRichText ||\n    page.header ||\n    page.title ||\n    '';\n\n  const description =\n    translations?.descriptionRichText ||\n    translations?.description ||\n    page.descriptionRichText ||\n    page.description;\n\n  const ctas = mapSpecialPageCtas(page.ctaConfig, language ?? '');\n  const ctaLabel = ctas?.start?.label;\n\n  if (!header.trim()) return undefined;\n\n  const displayLogic = mapDisplayLogic(page.controlConfig?.displayLogic);\n  const title = translations?.title || page.title;\n\n  return {\n    id: page.id,\n    header,\n    ...(title ? { title } : {}),\n    ...(description ? { description } : {}),\n    ...(ctaLabel ? { ctaLabel } : {}),\n    ...(ctas ? { ctas } : {}),\n    ...(page.disabled !== undefined ? { disabled: page.disabled } : {}),\n    ...(displayLogic ? { displayLogic } : {}),\n  };\n}\n\nexport function mapSpecialPages(api: ApiResponse, language?: string): {\n  introPage?: SpecialPage;\n  endPages: SpecialPage[];\n  pausedPage?: SpecialPage;\n  submittedPage?: SpecialPage;\n  expiredPage?: SpecialPage;\n  quotaFulfilledPage?: SpecialPage;\n} {\n  const dto = api.cfmSurveyDTO;\n  if (!dto) {\n    return { endPages: [] };\n  }\n\n  const endPages = (dto.endPages ?? [])\n    .map(page => resolveSpecialPageText(page, language))\n    .filter((page): page is SpecialPage => Boolean(page));\n\n  return {\n    introPage: resolveSpecialPageText(dto.introPage, language),\n    endPages,\n    pausedPage: resolveSpecialPageText(dto.pausedPage, language),\n    submittedPage: resolveSpecialPageText(dto.submittedPage, language),\n    expiredPage: resolveSpecialPageText(dto.expiredPage, language),\n    quotaFulfilledPage: resolveSpecialPageText(dto.quotaFulfilledPage, language),\n  };\n}\n\nexport function mapPhaseFlags(api: ApiResponse): SurveyPhaseFlags {\n  const dto = api.cfmSurveyDTO;\n  const statusPaused = dto?.status === 'PAUSED';\n\n  return {\n    expired: Boolean(api.expired),\n    alreadyFilled: Boolean(api.alreadyFilled || api.surveySubmitted),\n    quotaFulfilled: Boolean(api.quotaFulfilled),\n    paused: statusPaused,\n  };\n}\n\nexport function resolveInitialPhase(\n  survey: {\n    introPage?: SpecialPage;\n    phaseFlags: SurveyPhaseFlags;\n  }\n): import('../../../types/survey').SurveyPhase {\n  const { phaseFlags } = survey;\n\n  if (phaseFlags.expired) return { kind: 'expired' };\n  if (phaseFlags.quotaFulfilled) return { kind: 'quota_fulfilled' };\n  if (phaseFlags.alreadyFilled) return { kind: 'submitted' };\n  if (phaseFlags.paused) return { kind: 'paused' };\n  if (survey.introPage) return { kind: 'intro' };\n  return { kind: 'content', pageIndex: 0 };\n}\n","import type { Survey, SurveySession } from '../../../types';\nimport type { ApiQuestion, ApiResponse } from '../../../internalTypes';\nimport { decodeInstanceJwt } from '../../../../utils/decodeInstanceJwt';\nimport { extractSurveyLanguages } from '../../extractSurveyLanguages';\nimport { mapSurveyPages } from '../../mapSurveyPages';\nimport { mapPhaseFlags, mapSpecialPages } from './mapSpecialPages';\nimport { mapCtaButton } from './mapCtaButton';\n\nexport function extractQuestions(api: ApiResponse): ApiQuestion[] {\n  const surveyPages = api.cfmSurveyDTO?.surveyPages ?? [];\n  return surveyPages.flatMap(\n    page => page.questionHolders?.map(holder => holder.question).filter((q): q is ApiQuestion => Boolean(q)) ?? []\n  );\n}\n\nexport function extractSession(api: ApiResponse): SurveySession | null {\n  if (!api.instanceId?.trim()) return null;\n\n  const instanceId = api.instanceId.trim();\n  const jwtPayload = decodeInstanceJwt(instanceId);\n\n  return {\n    instanceId,\n    language: api.surveyLanguage ?? api.cfmSurveyDTO?.baseLanguage ?? 'en',\n    responseId: jwtPayload?.surveyResponseId,\n    ...(api.instanceCreatedTime !== undefined\n      ? { instanceCreatedTime: api.instanceCreatedTime }\n      : {}),\n  };\n}\n\nexport function resolveSurveyLanguage(api: ApiResponse, language?: string): string {\n  return language ?? api.surveyLanguage ?? api.cfmSurveyDTO?.baseLanguage ?? 'en';\n}\n\nexport function mapSurvey(api: ApiResponse, language?: string, placeholders?: Record<string, string>): Survey {\n  const surveyLanguage = resolveSurveyLanguage(api, language);\n  const languages = extractSurveyLanguages(api);\n  const pages = mapSurveyPages(api, surveyLanguage, placeholders);\n  const {\n    introPage,\n    endPages,\n    pausedPage,\n    submittedPage,\n    expiredPage,\n    quotaFulfilledPage,\n  } = mapSpecialPages(api, surveyLanguage);\n  const phaseFlags = mapPhaseFlags(api);\n  const submitCta = mapCtaButton(api.cfmSurveyDTO?.ctaConfig?.submit, surveyLanguage, {\n    defaultLabel: 'Submit',\n  });\n\n  return {\n    id: api.cfmSurveyDTO?.id ?? '',\n    language: surveyLanguage,\n    languages,\n    pages,\n    ...(submitCta ? { cta: { submit: submitCta } } : {}),\n    ...(introPage ? { introPage } : {}),\n    endPages,\n    ...(pausedPage ? { pausedPage } : {}),\n    ...(submittedPage ? { submittedPage } : {}),\n    ...(expiredPage ? { expiredPage } : {}),\n    ...(quotaFulfilledPage ? { quotaFulfilledPage } : {}),\n    phaseFlags,\n  };\n}\n","/** Minimal survey-ui-config types for CLI seed resolution (mirrors survey-wizard schema). */\n\nexport const QUESTION_TYPE_LITERALS = [\n  'MCQ',\n  'TEXTFIELD',\n  'NPS_SCALE',\n  'CFM_MATRIX',\n  'CSAT_MATRIX',\n  'RATING_MATRIX',\n  'SLIDER_MATRIX',\n  'FILE_UPLOAD',\n  'TEXT_AND_MEDIA',\n  'HEATMAP',\n  'RANK_ORDER',\n] as const;\n\nexport type QuestionTypeLiteral = (typeof QUESTION_TYPE_LITERALS)[number];\n\nexport interface LogoConfig {\n  fileName: string | null;\n  url?: string | null;\n}\n\nexport interface SurveyUiConfig {\n  version: string;\n  configuredAt?: string;\n  instanceId?: string;\n  surveyTypes: QuestionTypeLiteral[];\n  global: Record<string, unknown> & { logo?: LogoConfig };\n  questionTypes: Record<string, Record<string, unknown>>;\n  placeholders: Record<string, string>;\n  customFields?: Record<string, string>;\n  debug?: { enabled: boolean; sampleAnswers?: Record<string, unknown> };\n  partialSave?: { enabled: boolean; debounceMs?: number };\n  deploy: { target: 'aws' | 'vercel'; autoDeploy: boolean };\n}\n\nexport type SurveyUiConfigPartial = Partial<SurveyUiConfig> & {\n  global?: Record<string, unknown>;\n  questionTypes?: Record<string, Record<string, unknown>>;\n};\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { buildSurveyUrl } from '../fetchSurvey/utils/url';\nimport { mapSurvey } from '../fetchSurvey/utils/mappers/survey/mapSurvey';\nimport type { ApiResponse } from '../fetchSurvey/internalTypes';\nimport type { QuestionTypeLiteral } from './ui-config-types';\nimport { QUESTION_TYPE_LITERALS } from './ui-config-types';\n\nfunction parseEnvFile(content: string): Record<string, string> {\n  const out: Record<string, string> = {};\n  for (const line of content.split('\\n')) {\n    const trimmed = line.trim();\n    if (!trimmed || trimmed.startsWith('#')) continue;\n    const eq = trimmed.indexOf('=');\n    if (eq <= 0) continue;\n    const key = trimmed.slice(0, eq).trim();\n    let value = trimmed.slice(eq + 1).trim();\n    if (\n      (value.startsWith('\"') && value.endsWith('\"')) ||\n      (value.startsWith(\"'\") && value.endsWith(\"'\"))\n    ) {\n      value = value.slice(1, -1);\n    }\n    out[key] = value;\n  }\n  return out;\n}\n\nfunction loadEnvVars(projectRoot: string): Record<string, string> {\n  const merged: Record<string, string> = { ...process.env } as Record<string, string>;\n  for (const file of ['.env', '.env.local']) {\n    const abs = path.join(projectRoot, file);\n    if (!fs.existsSync(abs)) continue;\n    Object.assign(merged, parseEnvFile(fs.readFileSync(abs, 'utf8')));\n  }\n  return merged;\n}\n\nexport function resolveInstanceIdFromEnv(\n  projectRoot: string,\n  override?: string,\n): string | null {\n  if (override?.trim()) return override.trim();\n  const env = loadEnvVars(projectRoot);\n  const id =\n    env.VITE_CFM_INSTANCE_ID?.trim() ||\n    env.NEXT_PUBLIC_CFM_INSTANCE_ID?.trim() ||\n    env.CFM_INSTANCE_ID?.trim();\n  return id || null;\n}\n\nexport function extractSurveyDisplayName(api: ApiResponse): string | null {\n  const name = api.cfmSurveyDTO?.name?.trim();\n  return name || null;\n}\n\nexport function extractSurveyTypesFromSurvey(\n  survey: ReturnType<typeof mapSurvey>,\n): QuestionTypeLiteral[] {\n  const types = new Set<QuestionTypeLiteral>();\n  for (const page of survey.pages) {\n    for (const question of page.questions) {\n      const t = question.type;\n      if ((QUESTION_TYPE_LITERALS as readonly string[]).includes(t)) {\n        types.add(t as QuestionTypeLiteral);\n      }\n    }\n  }\n  return [...types].sort();\n}\n\nexport interface FetchSurveyInventoryResult {\n  instanceId: string;\n  surveyTypes: QuestionTypeLiteral[];\n}\n\nexport async function fetchSurveyTypesFromEnv(\n  projectRoot: string,\n  instanceIdOverride?: string,\n): Promise<FetchSurveyInventoryResult> {\n  const { instanceId, survey } = await fetchSurveyFromEnv(projectRoot, instanceIdOverride);\n  const surveyTypes = extractSurveyTypesFromSurvey(survey);\n\n  if (!surveyTypes.length) {\n    throw new Error('Survey fetch returned no question types — check instance ID');\n  }\n\n  return { instanceId, surveyTypes };\n}\n\nexport interface FetchSurveyResult {\n  instanceId: string;\n  survey: ReturnType<typeof mapSurvey>;\n  apiResponse: ApiResponse;\n}\n\nexport async function fetchSurveyFromEnv(\n  projectRoot: string,\n  instanceIdOverride?: string,\n): Promise<FetchSurveyResult> {\n  const instanceId = resolveInstanceIdFromEnv(projectRoot, instanceIdOverride);\n  if (!instanceId) {\n    throw new Error(\n      'no instance ID in env — paste JWT into .env (VITE_CFM_INSTANCE_ID) or .env.local (NEXT_PUBLIC_CFM_INSTANCE_ID). Fix: instance-id-quick-wire.md',\n    );\n  }\n\n  const url = buildSurveyUrl(instanceId);\n  let response: Response;\n  try {\n    response = await fetch(url, {\n      method: 'GET',\n      headers: { Accept: 'application/json' },\n    });\n  } catch (err) {\n    const msg = err instanceof Error ? err.message : String(err);\n    throw new Error(`Survey fetch network error: ${msg}`);\n  }\n\n  if (!response.ok) {\n    throw new Error(\n      `Survey fetch failed (${response.status}) — check JWT is fresh. Fix: instance-id-quick-wire.md`,\n    );\n  }\n\n  const apiResponse = (await response.json()) as ApiResponse;\n  const survey = mapSurvey(apiResponse);\n  return { instanceId, survey, apiResponse };\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Survey, SurveyQuestion } from '../fetchSurvey/types/survey';\nimport type {\n  LogicFilterGroup,\n  LogicFilterLeaf,\n  LogicFilterNode,\n} from '../fetchSurvey/types/logic';\nimport { QUESTION_TYPE } from '../fetchSurvey/constants/questionTypes';\nimport {\n  detectFramework,\n  resolveSdkPackageName,\n  type AgentFramework,\n} from './detect-framework';\nimport { extractSurveyTypesFromSurvey } from './fetch-survey-inventory';\n\nconst PLACEHOLDER_RE = /\\{\\{([^}]+)\\}\\}/g;\nconst CUSTOM_FIELD_ID_RE = /_c_[a-f0-9]+/gi;\n\nexport interface FrameworkSection {\n  framework: AgentFramework;\n  packageName: string | undefined;\n  frameworkLine: string;\n  packageLine: string;\n}\n\nexport interface ComponentInventoryRow {\n  componentFile: string;\n  requiredIf: string;\n  blocking?: boolean;\n}\n\nexport interface MatrixVariantRow {\n  questionId: string;\n  type: string;\n  displayStyle: string;\n  gridLayout: string;\n  statementLayout: string;\n  transposeTable: string;\n  selectionMode: string;\n  hasNotApplicableOption: string;\n  branchOn: string;\n  scaleAnchorLabelCount: string;\n}\n\nexport interface McqOtherInventoryRow {\n  questionId: string;\n  optionId: string;\n  contentType: string;\n  countryCodes: string;\n}\n\nexport interface CustomFieldRow {\n  id: string;\n  usedIn: string;\n}\n\nexport interface PlaceholderRow {\n  token: string;\n  key: string;\n  questionIds: string;\n}\n\nexport interface LogicInventoryRow {\n  questionId: string;\n  skipLogics: string;\n  displayLogic: string;\n  answerLogic: string;\n  customFieldRefs: string;\n}\n\nfunction isLogicGroup(node: LogicFilterNode): node is LogicFilterGroup {\n  return 'filters' in node && Array.isArray((node as LogicFilterGroup).filters);\n}\n\nfunction collectCustomFieldIdsFromLogic(nodes: LogicFilterNode[] | undefined, out: Set<string>): void {\n  if (!nodes) return;\n  for (const node of nodes) {\n    if (isLogicGroup(node)) {\n      collectCustomFieldIdsFromLogic(node.filters, out);\n      continue;\n    }\n    const leaf = node as LogicFilterLeaf;\n    const entity = leaf.details?.conditionEntity;\n    if (entity?.entityType === 'CUSTOM_FIELD') {\n      out.add(entity.id);\n    }\n  }\n}\n\nfunction collectCustomFieldIdsFromText(text: string | undefined, out: Set<string>): void {\n  if (!text) return;\n  const matches = text.match(CUSTOM_FIELD_ID_RE);\n  if (matches) {\n    for (const m of matches) out.add(m.toLowerCase() === m ? m : m);\n  }\n}\n\nfunction hasAnswerLogicOnQuestion(question: SurveyQuestion): boolean {\n  if (question.type === QUESTION_TYPE.MCQ || question.type === QUESTION_TYPE.RANK_ORDER) {\n    if (question.options?.some(o => o.answerLogic)) return true;\n  }\n  if ('statementRows' in question && question.statementRows?.some(r => r.answerLogic)) return true;\n  if ('scaleColumns' in question && question.scaleColumns?.some(c => c.answerLogic)) return true;\n  return false;\n}\n\nfunction matrixDisplayStyle(question: SurveyQuestion): string {\n  if (question.type === QUESTION_TYPE.CFM_MATRIX) {\n    return '—';\n  }\n  if ('displayStyle' in question && question.displayStyle) {\n    return String(question.displayStyle);\n  }\n  return '—';\n}\n\n/** Human-readable branch identifier for §3c branchOn column and layout-tasks labels. */\nexport function formatMatrixBranchOn(row: Pick<MatrixVariantRow, 'type' | 'displayStyle' | 'gridLayout' | 'statementLayout' | 'transposeTable'>): string {\n  const parts: string[] = [];\n\n  if (row.type === 'CFM_MATRIX') {\n    if (row.gridLayout && row.gridLayout !== '—' && row.gridLayout !== 'standard') {\n      parts.push(`question.gridLayout=${row.gridLayout}`);\n    }\n    if (/bipolar/i.test(row.statementLayout)) {\n      parts.push('question.statementLayout=bipolar');\n    }\n    if (/true/i.test(row.transposeTable)) {\n      parts.push('question.transposeTable=true');\n    }\n    if (!parts.length) {\n      parts.push('question.gridLayout=standard');\n    }\n    return parts.join(', ');\n  }\n\n  if (row.type === 'SLIDER_MATRIX') {\n    if (row.gridLayout && row.gridLayout !== '—' && row.gridLayout !== 'standard') {\n      parts.push(`question.gridLayout=${row.gridLayout}`);\n    }\n    return parts.length ? parts.join(', ') : 'question.gridLayout=standard';\n  }\n\n  if (row.displayStyle && row.displayStyle !== '—' && row.displayStyle !== 'standard') {\n    parts.push(`question.displayStyle=${row.displayStyle}`);\n  }\n  if (row.gridLayout && row.gridLayout !== '—' && row.gridLayout !== 'standard') {\n    parts.push(`question.gridLayout=${row.gridLayout}`);\n  }\n  if (!parts.length) {\n    parts.push(\n      row.displayStyle && row.displayStyle !== '—'\n        ? `question.displayStyle=${row.displayStyle}`\n        : 'question.displayStyle=standard',\n    );\n  }\n  return parts.join(', ');\n}\n\nconst COMPONENT_BY_TYPE: Record<string, { file: string; label: string; blocking?: boolean }[]> = {\n  [QUESTION_TYPE.CFM_MATRIX]: [{ file: 'LikertMatrixScale.tsx', label: 'CFM_MATRIX' }],\n  [QUESTION_TYPE.CSAT_MATRIX]: [{ file: 'CsatMatrixScale.tsx', label: 'CSAT_MATRIX or RATING_MATRIX' }],\n  [QUESTION_TYPE.RATING_MATRIX]: [{ file: 'CsatMatrixScale.tsx', label: 'CSAT_MATRIX or RATING_MATRIX' }],\n  [QUESTION_TYPE.SLIDER_MATRIX]: [\n    { file: 'SliderMatrixScale.tsx', label: 'SLIDER_MATRIX', blocking: true },\n    { file: 'CustomSliderTrack.tsx', label: 'SLIDER_MATRIX or matrix graphics' },\n  ],\n  [QUESTION_TYPE.FILE_UPLOAD]: [\n    { file: 'FileUploadScale.tsx', label: 'FILE_UPLOAD', blocking: true },\n  ],\n  [QUESTION_TYPE.NPS_SCALE]: [{ file: 'RatingScale.tsx', label: 'NPS_SCALE' }],\n  [QUESTION_TYPE.HEATMAP]: [\n    { file: 'HeatmapScale.tsx', label: 'HEATMAP' },\n    { file: 'lib/surveyUi/heatmapCoords.ts', label: 'HEATMAP' },\n  ],\n  [QUESTION_TYPE.RANK_ORDER]: [{ file: 'RankOrderScale.tsx', label: 'RANK_ORDER' }],\n};\n\nexport function surveyHasMcqOtherOption(survey: Survey): boolean {\n  for (const page of survey.pages) {\n    for (const question of page.questions) {\n      if (question.type !== QUESTION_TYPE.MCQ || !('options' in question)) continue;\n      if (question.options?.some((o) => o.otherOption)) return true;\n    }\n  }\n  return false;\n}\n\nconst MCQ_OTHER_PICKER_CONTENT_TYPES = new Set(['PHONE_NUMBER', 'POSTAL_CODE', 'DATE']);\n\nexport function surveyHasMcqOtherPickerTypes(survey: Survey): boolean {\n  for (const page of survey.pages) {\n    for (const question of page.questions) {\n      if (question.type !== QUESTION_TYPE.MCQ || !('options' in question)) continue;\n      for (const option of question.options ?? []) {\n        const contentType = option.otherOption?.contentType;\n        if (contentType && MCQ_OTHER_PICKER_CONTENT_TYPES.has(contentType)) return true;\n      }\n    }\n  }\n  return false;\n}\n\nexport function extractFrameworkSection(projectRoot: string): FrameworkSection {\n  const pkgPath = path.join(projectRoot, 'package.json');\n  const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as {\n    dependencies?: Record<string, string>;\n    devDependencies?: Record<string, string>;\n  };\n  const framework = detectFramework(pkg);\n  const packageName = resolveSdkPackageName(pkg);\n\n  const checks: Record<AgentFramework, string> = {\n    nextjs: '[x] Next.js App Router  [ ] Vite  [ ] CRA  [ ] Existing app',\n    vite: '[ ] Next.js App Router  [x] Vite  [ ] CRA  [ ] Existing app',\n    cra: '[ ] Next.js App Router  [ ] Vite  [x] CRA  [ ] Existing app',\n    unknown: '[ ] Next.js App Router  [ ] Vite  [ ] CRA  [x] Existing app',\n  };\n\n  return {\n    framework,\n    packageName,\n    frameworkLine: `- **Framework:** ${checks[framework]}`,\n    packageLine: `- **Package import name:** ${packageName ?? '(add @explorer02/cfm-survey-sdk or @repo/sdk)'}`,\n  };\n}\n\nexport function extractComponentInventory(survey: Survey): ComponentInventoryRow[] {\n  const types = new Set(extractSurveyTypesFromSurvey(survey));\n  const rows: ComponentInventoryRow[] = [\n    { componentFile: 'IntroPage.tsx', requiredIf: 'intro page' },\n    { componentFile: 'EndPage.tsx', requiredIf: 'end pages' },\n    { componentFile: 'PausedPage.tsx', requiredIf: survey.pausedPage ? 'paused flag' : 'paused flag (if enabled)' },\n  ];\n\n  const seen = new Set<string>();\n  for (const type of types) {\n    const entries = COMPONENT_BY_TYPE[type];\n    if (!entries) continue;\n    for (const entry of entries) {\n      const key = `${entry.file}:${entry.label}`;\n      if (seen.has(key)) continue;\n      seen.add(key);\n      rows.push({\n        componentFile: entry.file,\n        requiredIf: entry.label,\n        blocking: entry.blocking,\n      });\n    }\n  }\n\n  if (types.has(QUESTION_TYPE.NPS_SCALE) || [...types].some((t) => t.includes('MATRIX'))) {\n    rows.push({\n      componentFile: 'lib/surveyUi/scaleValues.ts + getAccentColor.ts',\n      requiredIf: 'NPS/matrix colors',\n    });\n  }\n  if (types.has(QUESTION_TYPE.CSAT_MATRIX) || types.has(QUESTION_TYPE.RATING_MATRIX)) {\n    rows.push({ componentFile: 'lib/surveyUi/icons.tsx', requiredIf: 'CSAT emoji/star' });\n  }\n\n  const hasDropdownMatrix = survey.pages.some((p) =>\n    p.questions.some(\n      (q) => 'gridLayout' in q && q.gridLayout === 'dropdown',\n    ),\n  );\n  if (hasDropdownMatrix) {\n    rows.push({ componentFile: 'MatrixDropdown.tsx', requiredIf: 'matrix dropdown/selectbox' });\n  }\n\n  return rows;\n}\n\nexport function extractMatrixVariants(survey: Survey): MatrixVariantRow[] {\n  const rows: MatrixVariantRow[] = [];\n  const matrixTypes = [\n    QUESTION_TYPE.CFM_MATRIX,\n    QUESTION_TYPE.CSAT_MATRIX,\n    QUESTION_TYPE.RATING_MATRIX,\n    QUESTION_TYPE.SLIDER_MATRIX,\n  ] as const;\n\n  for (const page of survey.pages) {\n    for (const question of page.questions) {\n      if (!matrixTypes.includes(question.type as (typeof matrixTypes)[number])) continue;\n      rows.push({\n        questionId: question.id,\n        type: question.type,\n        displayStyle: matrixDisplayStyle(question),\n        gridLayout:\n          'gridLayout' in question && question.gridLayout ? String(question.gridLayout) : '—',\n        statementLayout: 'statementLayout' in question ? String(question.statementLayout) : '—',\n        transposeTable: 'transposeTable' in question ? String(question.transposeTable) : '—',\n        selectionMode: 'selectionMode' in question ? String(question.selectionMode) : '—',\n        hasNotApplicableOption:\n          'hasNotApplicableOption' in question ? String(question.hasNotApplicableOption) : '—',\n        branchOn: '',\n        scaleAnchorLabelCount:\n          'scaleAnchorLabels' in question && question.scaleAnchorLabels?.length\n            ? String(question.scaleAnchorLabels.length)\n            : '—',\n      });\n    }\n  }\n  for (const row of rows) {\n    row.branchOn = formatMatrixBranchOn(row);\n  }\n  return rows;\n}\n\nexport function extractMcqOtherInventory(survey: Survey): McqOtherInventoryRow[] {\n  const rows: McqOtherInventoryRow[] = [];\n  for (const page of survey.pages) {\n    for (const question of page.questions) {\n      if (question.type !== QUESTION_TYPE.MCQ || !('options' in question)) continue;\n      for (const option of question.options ?? []) {\n        if (!option.otherOption) continue;\n        const contentType = option.otherOption.contentType ?? 'TEXT';\n        rows.push({\n          questionId: question.id,\n          optionId: option.id,\n          contentType,\n          countryCodes:\n            option.otherOption.countryCodes?.length\n              ? option.otherOption.countryCodes.join(', ')\n              : '—',\n        });\n      }\n    }\n  }\n  return rows;\n}\n\nexport function extractCustomFieldInventory(survey: Survey): CustomFieldRow[] {\n  const idToUses = new Map<string, Set<string>>();\n\n  const add = (id: string, use: string) => {\n    const normalized = id.startsWith('_c_') ? id : `_c_${id.replace(/^_c_/, '')}`;\n    const set = idToUses.get(normalized) ?? new Set<string>();\n    set.add(use);\n    idToUses.set(normalized, set);\n  };\n\n  const scanLogic = (nodes: LogicFilterNode[] | undefined, use: string) => {\n    const ids = new Set<string>();\n    collectCustomFieldIdsFromLogic(nodes, ids);\n    for (const id of ids) add(id, use);\n  };\n\n  for (const page of survey.pages) {\n    for (const question of page.questions) {\n      if (question.skipLogics?.length) {\n        for (const sl of question.skipLogics) scanLogic(sl.condition.filters, 'skip');\n      }\n      if (question.displayLogic) scanLogic(question.displayLogic.condition.filters, 'display');\n      if (question.displayVariants?.length) {\n        for (const v of question.displayVariants) {\n          if (v.displayLogic) scanLogic(v.displayLogic.condition.filters, 'display-variant');\n          collectCustomFieldIdsFromText(v.questionText, new Set());\n          const textIds = new Set<string>();\n          collectCustomFieldIdsFromText(v.questionText, textIds);\n          for (const id of textIds) add(id, 'copy');\n        }\n      }\n      collectCustomFieldIdsFromText(question.questionText, new Set());\n      const copyIds = new Set<string>();\n      collectCustomFieldIdsFromText(question.questionText, copyIds);\n      collectCustomFieldIdsFromText(question.questionDescription, copyIds);\n      for (const id of copyIds) add(id, 'copy');\n\n      if (question.type === QUESTION_TYPE.MCQ || question.type === QUESTION_TYPE.RANK_ORDER) {\n        for (const opt of question.options) {\n          if (opt.answerLogic) scanLogic(opt.answerLogic.condition.filters, 'answer');\n        }\n      }\n      if ('statementRows' in question) {\n        for (const row of question.statementRows) {\n          if (row.answerLogic) scanLogic(row.answerLogic.condition.filters, 'answer');\n        }\n      }\n      if ('scaleColumns' in question) {\n        for (const col of question.scaleColumns) {\n          if (col.answerLogic) scanLogic(col.answerLogic.condition.filters, 'answer');\n        }\n      }\n    }\n  }\n\n  for (const endPage of survey.endPages) {\n    if (endPage.displayLogic) scanLogic(endPage.displayLogic.condition.filters, 'end');\n    const copyIds = new Set<string>();\n    collectCustomFieldIdsFromText(endPage.header, copyIds);\n    collectCustomFieldIdsFromText(endPage.description, copyIds);\n    for (const id of copyIds) add(id, 'copy');\n  }\n\n  return [...idToUses.entries()]\n    .sort(([a], [b]) => a.localeCompare(b))\n    .map(([id, uses]) => ({ id, usedIn: [...uses].sort().join(', ') }));\n}\n\nexport function extractLogicInventory(survey: Survey): LogicInventoryRow[] {\n  const rows: LogicInventoryRow[] = [];\n\n  for (const page of survey.pages) {\n    for (const question of page.questions) {\n      const cfIds = new Set<string>();\n      if (question.skipLogics) {\n        for (const sl of question.skipLogics) collectCustomFieldIdsFromLogic(sl.condition.filters, cfIds);\n      }\n      if (question.displayLogic) {\n        collectCustomFieldIdsFromLogic(question.displayLogic.condition.filters, cfIds);\n      }\n      if (question.type === QUESTION_TYPE.MCQ || question.type === QUESTION_TYPE.RANK_ORDER) {\n        for (const opt of question.options) {\n          if (opt.answerLogic) collectCustomFieldIdsFromLogic(opt.answerLogic.condition.filters, cfIds);\n        }\n      }\n      if ('statementRows' in question) {\n        for (const row of question.statementRows) {\n          if (row.answerLogic) collectCustomFieldIdsFromLogic(row.answerLogic.condition.filters, cfIds);\n        }\n      }\n      if ('scaleColumns' in question) {\n        for (const col of question.scaleColumns) {\n          if (col.answerLogic) collectCustomFieldIdsFromLogic(col.answerLogic.condition.filters, cfIds);\n        }\n      }\n\n      const hasSkip = Boolean(question.skipLogics?.length);\n      const hasDisplay = Boolean(question.displayLogic);\n      const hasAnswer = hasAnswerLogicOnQuestion(question);\n\n      if (!hasSkip && !hasDisplay && !hasAnswer && cfIds.size === 0) continue;\n\n      rows.push({\n        questionId: question.id,\n        skipLogics: hasSkip ? 'yes' : '—',\n        displayLogic: hasDisplay ? 'yes' : '—',\n        answerLogic: hasAnswer ? 'yes' : '—',\n        customFieldRefs: cfIds.size ? [...cfIds].sort().join(', ') : '—',\n      });\n    }\n  }\n\n  return rows;\n}\n\nexport function extractPlaceholderTokens(survey: Survey): PlaceholderRow[] {\n  const tokenToQuestions = new Map<string, Set<string>>();\n\n  const scanText = (text: string | undefined, questionId: string) => {\n    if (!text) return;\n    let match: RegExpExecArray | null;\n    PLACEHOLDER_RE.lastIndex = 0;\n    while ((match = PLACEHOLDER_RE.exec(text)) !== null) {\n      const raw = match[1]?.trim();\n      if (!raw) continue;\n      const token = `{{${raw}}}`;\n      const set = tokenToQuestions.get(token) ?? new Set<string>();\n      set.add(questionId);\n      tokenToQuestions.set(token, set);\n    }\n  };\n\n  for (const page of survey.pages) {\n    for (const question of page.questions) {\n      scanText(question.questionText, question.id);\n      scanText(question.questionDescription, question.id);\n      if (question.displayVariants) {\n        for (const v of question.displayVariants) scanText(v.questionText, question.id);\n      }\n    }\n  }\n\n  return [...tokenToQuestions.entries()]\n    .sort(([a], [b]) => a.localeCompare(b))\n    .map(([token, qids]) => {\n      const key = token.startsWith('{{_c_')\n        ? `CUSTOM_FIELD_VALUES['${token.slice(2, -2)}']`\n        : token.startsWith('{{SURVEY_QUESTION')\n          ? '(resolved in hook — render question.questionText as-is)'\n          : `SURVEY_PLACEHOLDERS.${token.slice(2, -2)}`;\n      return {\n        token,\n        key,\n        questionIds: [...qids].sort().join(', '),\n      };\n    });\n}\n\nexport function formatComponentTableRows(rows: ComponentInventoryRow[]): string {\n  return rows\n    .map((r) => {\n      const block = r.blocking ? ' **blocking**' : '';\n      return `| \\`${r.componentFile}\\` | ${r.requiredIf}${block} | |`;\n    })\n    .join('\\n');\n}\n\nexport function formatMatrixTableRows(rows: MatrixVariantRow[]): string {\n  if (!rows.length) {\n    return '| (no matrix questions in fetch) | | | | | | | | | | |';\n  }\n  return rows\n    .map(\n      (r) =>\n        `| ${r.questionId} | ${r.type} | ${r.displayStyle} | ${r.gridLayout} | ${r.statementLayout} | ${r.transposeTable} | ${r.selectionMode} | ${r.hasNotApplicableOption} | ${r.branchOn} | ${r.scaleAnchorLabelCount} |`,\n    )\n    .join('\\n');\n}\n\nexport function formatMcqOtherTableRows(rows: McqOtherInventoryRow[]): string {\n  if (!rows.length) return '| (no MCQ Other options in fetch) | | | |';\n  return rows\n    .map((r) => `| ${r.questionId} | ${r.optionId} | ${r.contentType} | ${r.countryCodes} |`)\n    .join('\\n');\n}\n\nfunction isTruthyInventoryFlag(value: string | undefined): boolean {\n  if (!value) return false;\n  const v = value.trim().toLowerCase();\n  return v === 'true' || v === 'yes';\n}\n\n/** Fetch-driven layout action line for one §3c matrix row. */\nexport function formatLayoutActionForVariant(row: MatrixVariantRow): string {\n  const hasNa = isTruthyInventoryFlag(row.hasNotApplicableOption);\n  const parts: string[] = [];\n\n  if (row.type === 'CFM_MATRIX' && /dropdown/i.test(row.gridLayout)) {\n    parts.push('question.gridLayout === \"dropdown\" → MatrixDropdown per row');\n  } else if (row.type === 'CFM_MATRIX' && /bipolar/i.test(row.statementLayout)) {\n    parts.push('3-zone flex 25% | flex-1 | 25% with oppositeStatementText — NOT grid-only 0 0 25%');\n  } else if (/carousel/i.test(row.gridLayout)) {\n    parts.push('carousel: header + cell loops share same m and column order; card + nav + footer');\n  } else if (row.type === 'RATING_MATRIX' && /graphics/i.test(row.displayStyle)) {\n    parts.push(\n      'GraphicsColumnLabelsRow outside statementRows.map; CustomSliderTrack per row; findIndex from stored column id',\n    );\n  } else if (/dropdown|selectbox/i.test(row.displayStyle) && row.type !== 'CFM_MATRIX') {\n    parts.push('question.displayStyle → MatrixDropdown per row with onPanelOpenChange');\n  } else if (/transpose/i.test(row.transposeTable) && /true/i.test(row.transposeTable)) {\n    parts.push('transpose: scaleColumns=rows, statementRows=column headers');\n  } else {\n    const naSuffix = hasNa ? ' 56px' : '';\n    parts.push(\n      `grid cols = \\`180px repeat(m, 1fr)${naSuffix}\\`; cells loop nonNaScaleColumns + trailing NA when hasNA`,\n    );\n    if (/numbered/i.test(row.displayStyle)) {\n      parts.push('numbered: displayIdx+1 badge in cell — not col.label');\n    }\n    if (/star|emoji|standard/i.test(row.displayStyle)) {\n      parts.push('label i above cell i; anchors use % formula when scaleAnchorLabels set');\n    }\n  }\n\n  if (hasNa && !parts.some((p) => p.includes('NA'))) {\n    parts.push('N/A trailing column in header + every row');\n  }\n\n  return parts.join('; ');\n}\n\nexport const MCQ_OTHER_TASKS_FILENAME = 'mcq-other-tasks.md';\n\nexport function formatMcqOtherTasksMarkdown(\n  rows: McqOtherInventoryRow[],\n  hasPickers: boolean,\n): string {\n  const lines = [\n    '# MCQ Other tasks (blocking when pickers: yes)',\n    '',\n    '> Generated by `npx cfm-sdk sync-from-fetch`. Complete before `verify-interactions --from-fetch`.',\n    '> Cookbook: [`layout-cookbook/mcq.md`](node_modules/@explorer02/cfm-survey-sdk/templates/docs/00-integration/layout-cookbook/mcq.md)',\n    '',\n  ];\n\n  if (!hasPickers) {\n    lines.push('No phone/postal/date Other options in fetch — picker components optional.');\n    return `${lines.join('\\n')}\\n`;\n  }\n\n  lines.push('- [ ] **McqOtherCountrySelect.tsx** — PHONE_NUMBER + POSTAL_CODE');\n  lines.push('- [ ] **McqOtherDatePicker.tsx** — DATE');\n  lines.push('- [ ] **McqOtherInput.tsx** — branch on contentType; no `type=\"date\"`; no country `<select>`');\n  lines.push('- [ ] **package.json** — `react-international-phone`, `react-datepicker`, `date-fns`');\n  lines.push('- [ ] **globals.css** — picker CSS imports');\n  lines.push('');\n\n  for (const row of rows) {\n    if (!MCQ_OTHER_PICKER_CONTENT_TYPES.has(row.contentType)) continue;\n    lines.push(\n      `- [ ] **${row.questionId}** / option ${row.optionId} (${row.contentType})${row.countryCodes !== '—' ? ` — countries: ${row.countryCodes}` : ''}`,\n    );\n  }\n\n  return `${lines.join('\\n')}\\n`;\n}\n\nexport function formatLayoutTasksMarkdown(rows: MatrixVariantRow[]): string {\n  if (!rows.length) {\n    return `# Layout tasks (blocking)\n\n> Generated by \\`npx cfm-sdk sync-from-fetch\\`. No matrix questions in fetch.\n\n`;\n  }\n\n  const lines = [\n    '# Layout tasks (blocking)',\n    '',\n    '> Generated by `npx cfm-sdk sync-from-fetch`. Complete before `npx cfm-sdk verify-layout` and Phase 5b (visual skin).',\n    '> Cookbook: [`layout-cookbook.md`](node_modules/@explorer02/cfm-survey-sdk/templates/docs/00-integration/layout-cookbook.md)',\n    '',\n  ];\n\n  for (const row of rows) {\n    const branchLabel = row.branchOn ? `branch: ${row.branchOn}` : row.type;\n    lines.push(\n      `- [ ] **${row.questionId}** (${row.type} — ${branchLabel}): ${formatLayoutActionForVariant(row)}`,\n    );\n  }\n\n  return `${lines.join('\\n')}\\n`;\n}\n\nexport const LAYOUT_TASKS_FILENAME = 'layout-tasks.md';\n\nexport function formatCustomFieldTableRows(rows: CustomFieldRow[]): string {\n  if (!rows.length) return '| (no _c_ ids in fetch) | | | | | |';\n  return rows\n    .map((r) => `| ${r.id} | | ${r.usedIn} | | | |`)\n    .join('\\n');\n}\n\nexport function formatPlaceholderTableRows(rows: PlaceholderRow[]): string {\n  if (!rows.length) return '| (no {{TOKEN}} in fetch) | | | |';\n  return rows.map((r) => `| ${r.token} | ${r.key} | | ${r.questionIds} |`).join('\\n');\n}\n\nexport function formatLogicTableRows(rows: LogicInventoryRow[]): string {\n  if (!rows.length) return '| (no logic flags in fetch) | | | | |';\n  return rows\n    .map(\n      (r) =>\n        `| ${r.questionId} | ${r.skipLogics} | ${r.displayLogic} | ${r.answerLogic} | ${r.customFieldRefs} |`,\n    )\n    .join('\\n');\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { MatrixVariantRow } from './survey-inventory-extract';\n\nexport const LAYOUT_AUDIT_FILENAME = 'layout-audit.md';\n\nconst AUDIT_HEADER = `# Layout audit (HOOK 3 — blocking before preview)\n\n> Fill every row after code audit vs \\`implementation_plan.md\\` §3c. **Broken must be 0** before \\`npx cfm-sdk verify-layout\\` passes.\n> Template: [\\`reverification-hooks.md\\`](node_modules/@explorer02/cfm-survey-sdk/templates/docs/00-integration/reverification-hooks.md) §HOOK 3 audit report.\n\n## Verification summary\n\n| Status | Count | Meaning |\n| Broken | 0 | Must be 0 before preview |\n| Needs improvement | 0 | P2 polish — non-blocking |\n| OK | 0 | Code matches §3c variant |\n\n## Matrix format (per §3c row)\n\n| questionId | type | displayStyle | labelIndexMap | nonNaM | naTrailing | carouselParity | uxShell | Verdict | Doc anchor |\n|------------|------|--------------|---------------|--------|------------|----------------|---------|---------|------------|\n`;\n\nfunction auditRowCells(row: MatrixVariantRow): string {\n  return `| ${row.questionId} | ${row.type} | ${row.displayStyle} |  |  |  |  |  |  | layout-cookbook |`;\n}\n\nexport function buildLayoutAuditContent(variants: MatrixVariantRow[]): string {\n  if (!variants.length) {\n    return `${AUDIT_HEADER}| (no matrix questions in fetch) | | | | | | | | | | |\\n`;\n  }\n  const rows = variants.map(auditRowCells).join('\\n');\n  return `${AUDIT_HEADER}${rows}\\n`;\n}\n\nexport function writeLayoutAuditFile(projectRoot: string, variants: MatrixVariantRow[]): string {\n  const auditPath = path.join(projectRoot, LAYOUT_AUDIT_FILENAME);\n  fs.writeFileSync(auditPath, buildLayoutAuditContent(variants), 'utf8');\n  return auditPath;\n}\n\nexport interface LayoutAuditParseResult {\n  ok: boolean;\n  errors: string[];\n  brokenCount: number;\n  incompleteCount: number;\n}\n\nconst ALLOWED_VERDICTS = new Set(['ok', 'needs improvement']);\n\nexport function parseLayoutAuditFile(projectRoot: string): LayoutAuditParseResult {\n  const auditPath = path.join(projectRoot, LAYOUT_AUDIT_FILENAME);\n  const errors: string[] = [];\n\n  if (!fs.existsSync(auditPath)) {\n    return {\n      ok: false,\n      errors: [\n        `${LAYOUT_AUDIT_FILENAME} missing — run npx cfm-sdk sync-from-fetch to generate it, then complete HOOK 3 audit rows`,\n      ],\n      brokenCount: 0,\n      incompleteCount: 0,\n    };\n  }\n\n  const content = fs.readFileSync(auditPath, 'utf8');\n  const tableSection = content.split('## Matrix format')[1] ?? '';\n  const lines = tableSection.split('\\n').filter((l) => l.trim().startsWith('|'));\n\n  let brokenCount = 0;\n  let incompleteCount = 0;\n  let dataRows = 0;\n\n  for (const line of lines) {\n    if (line.includes('questionId')) continue;\n    if (/^[\\s|:-]+$/.test(line)) continue;\n    if (line.includes('(no matrix questions in fetch)')) continue;\n\n    const cells = line.split('|').map((c) => c.trim());\n    const dataCells = cells.slice(1, cells.at(-1) === '' ? -1 : undefined);\n    if (dataCells.length < 2) continue;\n\n    dataRows += 1;\n    const questionId = dataCells[0];\n    const verdict = (dataCells[8] ?? '').trim().toLowerCase();\n\n    if (!verdict) {\n      incompleteCount += 1;\n      errors.push(`${LAYOUT_AUDIT_FILENAME}: ${questionId} — Verdict column empty (set OK or Needs improvement)`);\n      continue;\n    }\n    if (verdict === 'broken') {\n      brokenCount += 1;\n      errors.push(`${LAYOUT_AUDIT_FILENAME}: ${questionId} — Verdict is Broken (fix before preview)`);\n      continue;\n    }\n    if (!ALLOWED_VERDICTS.has(verdict)) {\n      incompleteCount += 1;\n      errors.push(\n        `${LAYOUT_AUDIT_FILENAME}: ${questionId} — Verdict must be OK or Needs improvement (got \"${verdict}\")`,\n      );\n    }\n  }\n\n  if (dataRows === 0 && !content.includes('(no matrix questions in fetch)')) {\n    errors.push(`${LAYOUT_AUDIT_FILENAME}: no §3c audit rows found — fill Matrix format table`);\n  }\n\n  return {\n    ok: errors.length === 0,\n    errors,\n    brokenCount,\n    incompleteCount,\n  };\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { MatrixVariantRow } from './survey-inventory-extract';\nimport { formatLayoutTasksMarkdown, LAYOUT_TASKS_FILENAME } from './survey-inventory-extract';\n\nexport function writeLayoutTasksFile(projectRoot: string, variants: MatrixVariantRow[]): string {\n  const tasksPath = path.join(projectRoot, LAYOUT_TASKS_FILENAME);\n  fs.writeFileSync(tasksPath, formatLayoutTasksMarkdown(variants), 'utf8');\n  return tasksPath;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { McqOtherInventoryRow } from './survey-inventory-extract';\nimport { formatMcqOtherTasksMarkdown, MCQ_OTHER_TASKS_FILENAME } from './survey-inventory-extract';\n\nexport function writeMcqOtherTasksFile(\n  projectRoot: string,\n  rows: McqOtherInventoryRow[],\n  hasPickers: boolean,\n): string {\n  const tasksPath = path.join(projectRoot, MCQ_OTHER_TASKS_FILENAME);\n  fs.writeFileSync(tasksPath, formatMcqOtherTasksMarkdown(rows, hasPickers), 'utf8');\n  return tasksPath;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport type { Survey } from '../fetchSurvey/types/survey';\nimport { colors } from './const';\nimport { fetchSurveyFromEnv, extractSurveyTypesFromSurvey } from './fetch-survey-inventory';\nimport {\n  extractComponentInventory,\n  extractCustomFieldInventory,\n  extractFrameworkSection,\n  extractLogicInventory,\n  extractMatrixVariants,\n  extractMcqOtherInventory,\n  extractPlaceholderTokens,\n  formatComponentTableRows,\n  formatCustomFieldTableRows,\n  formatLogicTableRows,\n  formatMatrixTableRows,\n  formatMcqOtherTableRows,\n  formatPlaceholderTableRows,\n  surveyHasMcqOtherOption,\n  surveyHasMcqOtherPickerTypes,\n} from './survey-inventory-extract';\nimport { printSurveyTypeInstallBlock } from './install-manifest';\n\nconst c = colors;\n\nfunction replaceSectionTable(\n  content: string,\n  sectionHeading: string,\n  tableHeaderPattern: RegExp,\n  newRows: string,\n): string {\n  const headingIdx = content.indexOf(sectionHeading);\n  if (headingIdx < 0) return content;\n\n  const afterHeading = content.slice(headingIdx);\n  const headerMatch = afterHeading.match(tableHeaderPattern);\n  if (!headerMatch || headerMatch.index === undefined) return content;\n\n  const tableStart = headingIdx + headerMatch.index + headerMatch[0].length;\n  const rest = content.slice(tableStart);\n  const nextSection = rest.search(/\\n## |\\n##\\d/);\n  const tableBodyEnd = nextSection >= 0 ? tableStart + nextSection : content.length;\n\n  const before = content.slice(0, tableStart);\n  const after = content.slice(tableBodyEnd);\n  const rows = newRows.endsWith('\\n') ? newRows : `${newRows}\\n`;\n  return `${before}\\n${rows}${after}`;\n}\n\nfunction patchFrameworkSection(content: string, projectRoot: string): string {\n  const { frameworkLine, packageLine } = extractFrameworkSection(projectRoot);\n  let out = content.replace(\n    /- \\*\\*Framework:\\*\\* \\[ \\] Next\\.js App Router.*\\n/,\n    `${frameworkLine}\\n`,\n  );\n  out = out.replace(\n    /- \\*\\*Package import name:\\*\\*.*\\n/,\n    `${packageLine}\\n`,\n  );\n  return out;\n}\n\nexport function patchImplementationPlan(\n  content: string,\n  projectRoot: string,\n  survey: Survey,\n): string {\n  let out = patchFrameworkSection(content, projectRoot);\n\n  out = replaceSectionTable(\n    out,\n    '## 3b. Required Component Files (from fetched survey)',\n    /\\| Component file \\| Required if survey contains \\| Created\\? \\|\\n\\|[-| ]+\\|\\n/,\n    formatComponentTableRows(extractComponentInventory(survey)),\n  );\n\n  out = replaceSectionTable(\n    out,\n    '## 3c. Matrix variant inventory (from fetched survey)',\n    /\\| questionId \\| type \\| displayStyle \\| gridLayout \\| statementLayout \\| transposeTable \\| selectionMode \\| hasNA \\| branchOn \\| scaleAnchorLabelCount \\|\\n\\|[-| ]+\\|\\n/,\n    formatMatrixTableRows(extractMatrixVariants(survey)),\n  );\n\n  out = replaceSectionTable(\n    out,\n    '## 3c-b. MCQ Other inventory (from fetched survey)',\n    /\\| questionId \\| optionId \\| contentType \\| countryCodes \\|\\n\\|[-| ]+\\|\\n/,\n    formatMcqOtherTableRows(extractMcqOtherInventory(survey)),\n  );\n\n  const mcqOtherLine = `- **MCQ Other option in fetch:** ${surveyHasMcqOtherOption(survey) ? 'yes' : 'no'}`;\n  const mcqOtherPickersLine = `- **MCQ Other phone/postal/date pickers:** ${surveyHasMcqOtherPickerTypes(survey) ? 'yes — include react-international-phone react-datepicker date-fns in Phase 1 install' : 'no'}`;\n  if (out.includes('**MCQ Other option in fetch:**')) {\n    out = out.replace(/- \\*\\*MCQ Other option in fetch:\\*\\*.*\\n/, `${mcqOtherLine}\\n`);\n  } else {\n    out = out.replace(/(- \\*\\*instanceId:\\*\\*.*\\n)/, `$1${mcqOtherLine}\\n`);\n  }\n  if (out.includes('**MCQ Other phone/postal/date pickers:**')) {\n    out = out.replace(\n      /- \\*\\*MCQ Other phone\\/postal\\/date pickers:\\*\\*.*\\n/,\n      `${mcqOtherPickersLine}\\n`,\n    );\n  } else {\n    out = out.replace(\n      /(- \\*\\*MCQ Other option in fetch:\\*\\*.*\\n)/,\n      `$1${mcqOtherPickersLine}\\n`,\n    );\n  }\n\n  out = replaceSectionTable(\n    out,\n    '## 3d. Custom field inventory (mandatory when `_c_…` ids found)',\n    /\\| `_c_` id \\| fieldType \\| used in \\(skip\\/display\\/answer\\/end\\/copy token\\) \\| logic field \\(e\\.g\\. CASE_SENSITIVE_TEXT\\) \\| CRM value \\| populated in `lib\\/customFieldValues\\.ts`\\? \\|\\n\\|[-| ]+\\|\\n/,\n    formatCustomFieldTableRows(extractCustomFieldInventory(survey)),\n  );\n\n  out = replaceSectionTable(\n    out,\n    '## 3d-b. Placeholder inventory (from fetched question text)',\n    /\\| Token in fetch \\| Key in map \\| Example value \\| Question ids \\|\\n\\|[-| ]+\\|\\n/,\n    formatPlaceholderTableRows(extractPlaceholderTokens(survey)),\n  );\n\n  out = replaceSectionTable(\n    out,\n    '## 3e. Logic inventory (from fetched survey)',\n    /\\| questionId \\| skipLogics \\| displayLogic \\| answerLogic \\(options\\/rows\\/cols\\) \\| customField refs \\(`_c_…`\\) \\|\\n\\|[-| ]+\\|\\n/,\n    formatLogicTableRows(extractLogicInventory(survey)),\n  );\n\n  if (!out.includes('<!-- autofill:from-fetch -->')) {\n    out = out.replace(\n      '# Survey UI Implementation Plan\\n',\n      '# Survey UI Implementation Plan\\n\\n<!-- autofill:from-fetch -->\\n',\n    );\n  }\n\n  return out;\n}\n\nexport async function runFillImplementationPlan(options: {\n  projectRoot?: string;\n  instanceIdOverride?: string;\n  planPath?: string;\n}): Promise<{\n  planPath: string;\n  surveyTypes: string[];\n  hasMcqOtherPickers: boolean;\n  matrixVariants: ReturnType<typeof extractMatrixVariants>;\n  mcqOtherRows: ReturnType<typeof extractMcqOtherInventory>;\n}> {\n  const projectRoot = options.projectRoot ?? process.cwd();\n  const planPath = options.planPath ?? path.join(projectRoot, 'implementation_plan.md');\n\n  if (!fs.existsSync(planPath)) {\n    throw new Error(\n      `fill-implementation-plan: ${planPath} not found — copy survey-ui/implementation_plan.md to project root first`,\n    );\n  }\n\n  const { survey } = await fetchSurveyFromEnv(projectRoot, options.instanceIdOverride);\n  const surveyTypes = extractSurveyTypesFromSurvey(survey);\n  const original = fs.readFileSync(planPath, 'utf8');\n  const patched = patchImplementationPlan(original, projectRoot, survey);\n  fs.writeFileSync(planPath, patched, 'utf8');\n  return {\n    planPath,\n    surveyTypes,\n    hasMcqOtherPickers: surveyHasMcqOtherPickerTypes(survey),\n    matrixVariants: extractMatrixVariants(survey),\n    mcqOtherRows: extractMcqOtherInventory(survey),\n  };\n}\n\nexport async function fillImplementationPlanFromFetch(options: {\n  instanceIdOverride?: string;\n  projectRoot?: string;\n}): Promise<void> {\n  const projectRoot = options.projectRoot ?? process.cwd();\n  const { planPath, surveyTypes, hasMcqOtherPickers, matrixVariants, mcqOtherRows } = await runFillImplementationPlan({\n    instanceIdOverride: options.instanceIdOverride,\n    projectRoot,\n  });\n  const { writeLayoutAuditFile } = await import('./layout-audit');\n  const { writeLayoutTasksFile } = await import('./layout-tasks');\n  const { writeMcqOtherTasksFile } = await import('./mcq-other-tasks');\n  writeLayoutAuditFile(projectRoot, matrixVariants);\n  writeLayoutTasksFile(projectRoot, matrixVariants);\n  writeMcqOtherTasksFile(projectRoot, mcqOtherRows, hasMcqOtherPickers);\n  console.log(`${c.green}✅ Patched ${planPath} from live fetch (§0, §3b–§3e)${c.reset}`);\n  console.log(`${c.green}✅ Wrote layout-audit.md, layout-tasks.md, and mcq-other-tasks.md${c.reset}`);\n  printSurveyTypeInstallBlock(projectRoot, surveyTypes, hasMcqOtherPickers);\n  console.log(`${c.dim}Per-type docs: on-demand (verify failure)${c.reset}`);\n}\n","import { colors } from './const';\nimport { resolveLiveSurveyDevUrl } from './detect-framework';\nimport { runFillImplementationPlan } from './fill-implementation-plan';\nimport { writeLayoutAuditFile } from './layout-audit';\nimport { writeLayoutTasksFile } from './layout-tasks';\nimport { writeMcqOtherTasksFile } from './mcq-other-tasks';\nimport { printSurveyTypeInstallBlock } from './install-manifest';\nimport { resolveProjectRoot } from './resolve-project-root';\nimport { formatLayoutBlockedFooter } from './workflow-prompts';\nimport { getErrorMessage } from '../types/shared';\nimport * as path from 'path';\n\nconst c = colors;\n\nexport interface SyncFromFetchOptions {\n  projectRoot?: string;\n  instanceIdOverride?: string;\n}\n\n/** INPUT 2 post-smoke: fill the implementation plan from the live fetch (§0, §3b–§3e). */\nexport async function runSyncFromFetch(options: SyncFromFetchOptions = {}): Promise<number> {\n  const projectRoot = resolveProjectRoot(options.projectRoot);\n\n  console.log(`${c.bold}=== CFM SDK — sync-from-fetch ===${c.reset}`);\n  console.log(`${c.dim}Project: ${projectRoot}${c.reset}\\n`);\n\n  try {\n    const { planPath, surveyTypes, hasMcqOtherPickers, matrixVariants, mcqOtherRows } =\n      await runFillImplementationPlan({\n      projectRoot,\n      instanceIdOverride: options.instanceIdOverride,\n    });\n    console.log(`${c.green}✅ Patched ${planPath} from live fetch (§0, §3b–§3e)${c.reset}`);\n\n    const auditPath = writeLayoutAuditFile(projectRoot, matrixVariants);\n    const tasksPath = writeLayoutTasksFile(projectRoot, matrixVariants);\n    const mcqTasksPath = writeMcqOtherTasksFile(projectRoot, mcqOtherRows, hasMcqOtherPickers);\n    console.log(\n      `${c.green}✅ Wrote ${path.basename(auditPath)}, ${path.basename(tasksPath)}, and ${path.basename(mcqTasksPath)}${c.reset}`,\n    );\n\n    printSurveyTypeInstallBlock(projectRoot, surveyTypes, hasMcqOtherPickers);\n    console.log(\n      `${c.dim}Implement §3c layout branches — see layout-tasks.md · audit in layout-audit.md${c.reset}`,\n    );\n    const { warning } = await resolveLiveSurveyDevUrl(projectRoot);\n    if (warning) {\n      console.log(`${c.yellow}⚠️  ${warning}${c.reset}`);\n    }\n    console.log(`\\n${formatLayoutBlockedFooter()}\\n`);\n    console.log(`${c.dim}Next: npx cfm-sdk verify-layout --from-fetch${c.reset}`);\n    return 0;\n  } catch (err: unknown) {\n    console.error(`\\n${c.red}❌ ${getErrorMessage(err)}${c.reset}`);\n    console.error(\n      `${c.dim}Fallback: npx cfm-sdk fill-implementation-plan --from-fetch${c.reset}`,\n    );\n    return 1;\n  }\n}\n","import { colors } from './const';\nimport { parseLayoutAuditFile, LAYOUT_AUDIT_FILENAME } from './layout-audit';\nimport {\n  partitionMatrixLayoutIssues,\n  readMatrixVariantsFromPlan,\n  scanMatrixInventoryGap,\n  scanMatrixLayoutIssuesStrict,\n  scanInteractionIssues,\n  scanLayoutFormatIssues,\n} from './project-source-scan';\nimport { resolveProjectRoot } from './resolve-project-root';\nimport { formatLayoutBlockedFooter, formatPreviewReadyHandoffBlocks } from './workflow-prompts';\nimport { resolveLiveSurveyDevUrl } from './detect-framework';\nimport { writeLayoutVerifyPassed } from './workflow-state';\n\nconst c = colors;\n\nexport interface RunVerifyLayoutOptions {\n  projectRoot?: string;\n  fromFetch?: boolean;\n}\n\nfunction printMatrixGrepReminder(variants: ReturnType<typeof readMatrixVariantsFromPlan>): void {\n  if (!variants.length) return;\n  console.log(`${c.dim}Matrix grep block (each §3c row):${c.reset}`);\n  console.log(`${c.dim}  grep -rn \"nonNaScaleColumns\" src/lib/surveyUi/ src/components/${c.reset}`);\n  console.log(`${c.dim}  grep \"nonNaScaleColumns\" src/components/LikertMatrixScale.tsx${c.reset}`);\n  console.log(\n    `${c.dim}  grep -E \"scaleAnchorLabels|hasNotApplicableOption|gridLayout.*carousel\" src/components/CsatMatrixScale.tsx src/components/LikertMatrixScale.tsx${c.reset}`,\n  );\n  console.log(\n    `${c.dim}  grep -E \"justifyContent.*space-between|justify-between\" src/components/CsatMatrixScale.tsx src/components/LikertMatrixScale.tsx${c.reset}`,\n  );\n  for (const v of variants) {\n    console.log(\n      `${c.dim}  §3c ${v.questionId}: ${v.type} displayStyle=${v.displayStyle} gridLayout=${v.gridLayout} hasNA=${v.hasNotApplicableOption}${c.reset}`,\n    );\n  }\n}\n\nexport async function runVerifyLayout(options: RunVerifyLayoutOptions = {}): Promise<number> {\n  const projectRoot = resolveProjectRoot(options.projectRoot);\n\n  console.log(`${c.bold}=== CFM SDK — verify-layout ===${c.reset}`);\n  console.log(`${c.dim}Project: ${projectRoot}${c.reset}\\n`);\n\n  const inventoryGap = scanMatrixInventoryGap(projectRoot);\n  if (inventoryGap.length) {\n    console.log(`${c.red}FAIL:${c.reset} Matrix inventory not populated:`);\n    for (const m of inventoryGap) console.log(`  ${m}`);\n    console.log(`\\n${formatLayoutBlockedFooter()}\\n`);\n    return 1;\n  }\n\n  const variants = readMatrixVariantsFromPlan(projectRoot);\n  const layoutIssues = scanMatrixLayoutIssuesStrict(projectRoot);\n  const { blocking, nearMisses } = partitionMatrixLayoutIssues(layoutIssues);\n\n  for (const m of nearMisses) {\n    console.log(`${c.yellow}NEAR-MISS:${c.reset} ${m.slice('NEAR-MISS: '.length)}`);\n  }\n\n  if (blocking.length) {\n    console.log(`${c.red}FAIL:${c.reset} Matrix layout structure issues:`);\n    for (const m of blocking) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: layout-cookbook.md · reverification-hooks.md · layout-tasks.md${c.reset}`,\n    );\n    console.log(`\\n${formatLayoutBlockedFooter()}\\n`);\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} Matrix layout structure (strict) passed`);\n\n  const layoutFormatIssues = scanLayoutFormatIssues(projectRoot);\n  if (layoutFormatIssues.length) {\n    console.log(`${c.red}FAIL:${c.reset} Matrix layout format issues:`);\n    for (const m of layoutFormatIssues) console.log(`  ${m}`);\n    console.log(`\\n${formatLayoutBlockedFooter()}\\n`);\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} Matrix layout format (bipolar header / carousel header) passed`);\n\n  const interactionIssues = scanInteractionIssues(projectRoot);\n  if (interactionIssues.length) {\n    console.log(`${c.red}FAIL:${c.reset} Interaction / format contract issues:`);\n    for (const m of interactionIssues) console.log(`  ${m}`);\n    console.log(`\\n${formatLayoutBlockedFooter()}\\n`);\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} Interaction contracts passed`);\n\n  const audit = parseLayoutAuditFile(projectRoot);\n  if (!audit.ok) {\n    console.log(`${c.red}FAIL:${c.reset} ${LAYOUT_AUDIT_FILENAME} audit incomplete:`);\n    for (const m of audit.errors) console.log(`  ${m}`);\n    console.log(`\\n${formatLayoutBlockedFooter()}\\n`);\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} ${LAYOUT_AUDIT_FILENAME} — Broken = 0, all verdicts set`);\n\n  printMatrixGrepReminder(variants);\n\n  writeLayoutVerifyPassed(projectRoot);\n\n  console.log(\n    `\\n${c.green}Layout conformance OK${c.reset} — safe for Phase 5b (visual skin) and preview handoff.`,\n  );\n  console.log(`${c.dim}Next: Phase 5b → npx cfm-sdk verify-build${c.reset}`);\n\n  const { url: devUrl } = await resolveLiveSurveyDevUrl(projectRoot);\n  console.log(`\\n${formatPreviewReadyHandoffBlocks(devUrl)}\\n`);\n\n  return 0;\n}\n","import { colors } from './const';\nimport { scanInteractionIssues } from './project-source-scan';\nimport { resolveProjectRoot } from './resolve-project-root';\n\nconst c = colors;\n\nexport interface RunVerifyInteractionsOptions {\n  projectRoot?: string;\n  fromFetch?: boolean;\n}\n\nexport function runVerifyInteractions(options: RunVerifyInteractionsOptions = {}): number {\n  const projectRoot = resolveProjectRoot(options.projectRoot);\n\n  console.log(`${c.bold}=== CFM SDK — verify-interactions ===${c.reset}`);\n  console.log(`${c.dim}Project: ${projectRoot}${c.reset}\\n`);\n\n  const issues = scanInteractionIssues(projectRoot);\n  if (issues.length) {\n    console.log(`${c.red}FAIL:${c.reset} Interaction / format contract issues:`);\n    for (const m of issues) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: field-binding-map.md · client-lib-folder.md · layout-cookbook/mcq.md · agent-per-type-verification${c.reset}`,\n    );\n    return 1;\n  }\n\n  console.log(`${c.green}OK:${c.reset} Interaction contracts passed (Likert field names, star icons, MCQ pickers)`);\n  console.log(\n    `${c.dim}Reminder: load dev URL and confirm runtime smoke in client-checkpoints.md before preview${c.reset}`,\n  );\n  return 0;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { colors } from './const';\nimport { resolveProjectRoot } from './resolve-project-root';\nimport {\n  formatInput5HandoffBlocks,\n  formatDeployTargetLabel,\n} from './workflow-prompts';\nimport type { DeployTargetLabel } from './workflow-prompts';\nimport {\n  readWorkflowState,\n  recordDeployConfirmed,\n} from './workflow-state';\nimport { fetchSurveyFromEnv } from './fetch-survey-inventory';\nimport { getErrorMessage } from '../types/shared';\n\nconst c = colors;\n\nexport const SURVEY_DEPLOY_CONFIG_FILE = 'survey-deploy-config.json';\nconst LEGACY_SURVEY_UI_CONFIG_FILE = 'survey-ui-config.json';\n\nexport type DeployTarget = DeployTargetLabel;\n\nfunction deployConfigPath(projectRoot: string): string {\n  return path.join(projectRoot, SURVEY_DEPLOY_CONFIG_FILE);\n}\n\nfunction legacyConfigPath(projectRoot: string): string {\n  return path.join(projectRoot, LEGACY_SURVEY_UI_CONFIG_FILE);\n}\n\n/** Resolve deploy config file — prefers survey-deploy-config.json, falls back to legacy name. */\nfunction resolveConfigFile(projectRoot: string): string {\n  const deployPath = deployConfigPath(projectRoot);\n  if (fs.existsSync(deployPath)) {\n    return deployPath;\n  }\n  const legacyPath = legacyConfigPath(projectRoot);\n  if (fs.existsSync(legacyPath)) {\n    return legacyPath;\n  }\n  return deployPath;\n}\n\n/** Read deploy.target from project-root survey-deploy-config.json (fixed path, no search). */\nexport function readDeployTarget(projectRoot: string): DeployTarget {\n  const abs = resolveConfigFile(projectRoot);\n  if (!fs.existsSync(abs)) {\n    throw new Error(\n      `${SURVEY_DEPLOY_CONFIG_FILE} not found — run npx cfm-sdk seed-phase5 first`,\n    );\n  }\n\n  const raw = JSON.parse(fs.readFileSync(abs, 'utf8')) as {\n    deploy?: { target?: string };\n  };\n  return raw.deploy?.target === 'vercel' ? 'vercel' : 'aws';\n}\n\n/** Patch deploy.target only — writes survey-deploy-config.json; migrates from legacy file if needed. */\nexport function writeDeployTarget(projectRoot: string, target: DeployTarget): string {\n  const outPath = deployConfigPath(projectRoot);\n  const legacyPath = legacyConfigPath(projectRoot);\n\n  let raw: Record<string, unknown> = { deploy: { target: 'aws', autoDeploy: false } };\n  if (fs.existsSync(outPath)) {\n    raw = JSON.parse(fs.readFileSync(outPath, 'utf8')) as Record<string, unknown>;\n  } else if (fs.existsSync(legacyPath)) {\n    raw = JSON.parse(fs.readFileSync(legacyPath, 'utf8')) as Record<string, unknown>;\n  }\n\n  const deploy = (raw.deploy as Record<string, unknown> | undefined) ?? {};\n  deploy.target = target;\n  if (deploy.autoDeploy === undefined) {\n    deploy.autoDeploy = false;\n  }\n\n  const next = {\n    deploy: {\n      target: deploy.target,\n      autoDeploy: deploy.autoDeploy,\n    },\n  };\n\n  fs.writeFileSync(outPath, `${JSON.stringify(next, null, 2)}\\n`, 'utf8');\n  return outPath;\n}\n\nexport interface GetDeployTargetOptions {\n  projectRoot?: string;\n}\n\nexport function runGetDeployTarget(options: GetDeployTargetOptions = {}): number {\n  const projectRoot = resolveProjectRoot(options.projectRoot);\n  const target = readDeployTarget(projectRoot);\n  const label = formatDeployTargetLabel(target);\n\n  console.log(`${c.green}deploy.target:${c.reset} ${target}`);\n  console.log(`${c.dim}Platform: ${label} (from ${SURVEY_DEPLOY_CONFIG_FILE})${c.reset}`);\n  return 0;\n}\n\nexport interface SetDeployTargetOptions {\n  projectRoot?: string;\n  target?: string;\n  surveyId?: string;\n}\n\nexport async function runSetDeployTarget(options: SetDeployTargetOptions = {}): Promise<number> {\n  const raw = options.target?.toLowerCase().trim();\n  if (raw !== 'aws' && raw !== 'vercel') {\n    console.error(`${c.red}FAIL:${c.reset} Usage: npx cfm-sdk set-deploy-target aws|vercel`);\n    return 1;\n  }\n\n  const projectRoot = resolveProjectRoot(options.projectRoot);\n\n  const state = readWorkflowState(projectRoot);\n  if (!state?.coreVerifyPassedAt) {\n    console.error(\n      `\\n${c.red}Core verify not recorded. Run npx cfm-sdk verify-build successfully before set-deploy-target.${c.reset}`,\n    );\n    return 1;\n  }\n\n  const configFile = writeDeployTarget(projectRoot, raw);\n  const label = formatDeployTargetLabel(raw);\n\n  try {\n    recordDeployConfirmed(projectRoot);\n  } catch (err: unknown) {\n    console.error(`\\n${c.red}${getErrorMessage(err)}${c.reset}`);\n    return 1;\n  }\n\n  console.log(\n    `${c.green}OK:${c.reset} Wrote deploy.target=${raw} (${label}) → ${configFile}`,\n  );\n\n  if (raw === 'aws') {\n    let surveyId = options.surveyId?.trim() || '<survey-id>';\n    const instanceId = process.env.CFM_INSTANCE_ID?.trim();\n    if (instanceId && surveyId === '<survey-id>') {\n      try {\n        const { survey } = await fetchSurveyFromEnv(projectRoot, instanceId);\n        surveyId = survey.id;\n      } catch {\n        // keep placeholder — create-distribution will show real ID if key missing\n      }\n    }\n    console.log(`\\n${formatInput5HandoffBlocks(surveyId)}\\n`);\n    console.log(\n      `${c.dim}After client pastes key: npx cfm-sdk create-distribution --s3-key=<key>${c.reset}`,\n    );\n  } else {\n    console.log(`${c.dim}After client confirms deploy yes: npx cfm-sdk deploy${c.reset}`);\n  }\n\n  return 0;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { fetchSurveyFromEnv } from './fetch-survey-inventory';\nimport { resolveProjectRoot } from './resolve-project-root';\nimport { colors, DEFAULT_DISTRIBUTION_DASHBOARD_URL } from './const';\nimport { getErrorMessage } from '../types/shared';\nimport {\n  formatDistributionDoneHandoffBlocks,\n  formatInput5HandoffBlocks,\n} from './workflow-prompts';\nimport {\n  assertDistributionDeployAllowed,\n  recordDistributionS3Key,\n} from './workflow-state';\n\nconst c = colors;\nconst MAX_FILES = 500;\nconst MAX_FILE_BYTES = 52_428_800;\nconst REPORT_MAX_ATTEMPTS = 3;\nconst REPORT_RETRY_DELAY_MS = 2000;\n\nfunction requireEnv(name: string): string {\n  const value = process.env[name]?.trim();\n  if (!value) {\n    throw new Error(`Missing ${name}`);\n  }\n  return value.replace(/\\/+$/, '');\n}\n\nfunction resolveDashboardApi(): string {\n  return (\n    process.env.CFM_DASHBOARD_API?.trim() || DEFAULT_DISTRIBUTION_DASHBOARD_URL\n  ).replace(/\\/+$/, '');\n}\n\nfunction guessContentType(filePath: string): string {\n  const ext = path.extname(filePath).toLowerCase();\n  const map: Record<string, string> = {\n    '.html': 'text/html',\n    '.htm': 'text/html',\n    '.css': 'text/css',\n    '.js': 'application/javascript',\n    '.mjs': 'application/javascript',\n    '.json': 'application/json',\n    '.png': 'image/png',\n    '.jpg': 'image/jpeg',\n    '.jpeg': 'image/jpeg',\n    '.gif': 'image/gif',\n    '.svg': 'image/svg+xml',\n    '.webp': 'image/webp',\n    '.ico': 'image/x-icon',\n    '.woff': 'font/woff',\n    '.woff2': 'font/woff2',\n    '.ttf': 'font/ttf',\n    '.txt': 'text/plain',\n    '.xml': 'application/xml',\n    '.map': 'application/json',\n  };\n  return map[ext] || 'application/octet-stream';\n}\n\ntype DeployFile = { path: string; contentType: string; sizeBytes: number };\n\nfunction buildFileManifest(outDir: string): DeployFile[] {\n  const files: DeployFile[] = [];\n\n  function walk(dir: string) {\n    for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n      const full = path.join(dir, entry.name);\n      if (entry.isDirectory()) {\n        walk(full);\n        continue;\n      }\n      const rel = path.relative(outDir, full).split(path.sep).join('/');\n      const sizeBytes = fs.statSync(full).size;\n      if (sizeBytes <= 0 || sizeBytes > MAX_FILE_BYTES) {\n        throw new Error(`File size out of range: ${rel} (${sizeBytes} bytes)`);\n      }\n      files.push({\n        path: rel,\n        contentType: guessContentType(rel),\n        sizeBytes,\n      });\n    }\n  }\n\n  walk(outDir);\n  files.sort((a, b) => a.path.localeCompare(b.path));\n\n  if (files.length === 0) {\n    throw new Error(`No files found in ${outDir}`);\n  }\n  if (files.length > MAX_FILES) {\n    throw new Error(`${files.length} files exceeds API limit of ${MAX_FILES}`);\n  }\n  return files;\n}\n\ntype StartResponse = {\n  deployId: string;\n  s3Prefix: string;\n  uploads: Array<{ path: string; uploadUrl: string }>;\n};\n\ntype CompleteResponse = {\n  url: string;\n  deployId: string;\n  surveyId: string;\n  s3Prefix: string;\n  distributionS3Key?: string;\n};\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nasync function startDistributionUpload(\n  deployApiBase: string,\n  parentJwt: string,\n  s3Key: string,\n  files: DeployFile[],\n): Promise<StartResponse> {\n  const response = await fetch(`${deployApiBase}/deploy/start`, {\n    method: 'POST',\n    headers: {\n      Authorization: `Bearer ${parentJwt}`,\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({ files, distributionS3Key: s3Key }),\n  });\n  const body = await response.json().catch(() => ({}));\n  if (!response.ok) {\n    throw new Error(\n      typeof body?.message === 'string' ? body.message : `Deploy API error (${response.status})`,\n    );\n  }\n  return body as StartResponse;\n}\n\nasync function uploadFiles(\n  outDir: string,\n  uploads: Array<{ path: string; uploadUrl: string }>,\n  manifest: DeployFile[],\n): Promise<void> {\n  const mimeByPath = new Map(manifest.map((f) => [f.path, f.contentType]));\n  const failed: string[] = [];\n\n  for (const item of uploads) {\n    const filePath = path.join(outDir, item.path);\n    const contentType = mimeByPath.get(item.path) || 'application/octet-stream';\n    const body = fs.readFileSync(filePath);\n\n    const response = await fetch(item.uploadUrl, {\n      method: 'PUT',\n      headers: { 'Content-Type': contentType },\n      body,\n    });\n\n    if (!response.ok) {\n      failed.push(item.path);\n    }\n  }\n\n  if (failed.length > 0) {\n    throw new Error(\n      `${failed.length} upload(s) failed (${failed.slice(0, 3).join(', ')}${failed.length > 3 ? '…' : ''}) — rerun create-distribution (presigned URLs expire)`,\n    );\n  }\n}\n\nasync function completeDistributionUpload(\n  deployApiBase: string,\n  parentJwt: string,\n  deployId: string,\n): Promise<CompleteResponse> {\n  const response = await fetch(`${deployApiBase}/deploy/complete`, {\n    method: 'POST',\n    headers: {\n      Authorization: `Bearer ${parentJwt}`,\n      'Content-Type': 'application/json',\n    },\n    body: JSON.stringify({ deployId }),\n  });\n  const body = await response.json().catch(() => ({}));\n  if (!response.ok) {\n    throw new Error(\n      typeof body?.message === 'string' ? body.message : `Deploy API error (${response.status})`,\n    );\n  }\n  return body as CompleteResponse;\n}\n\nasync function reportToDashboardOnce(\n  dashboardApi: string,\n  payload: Record<string, unknown>,\n): Promise<{ ok: boolean; error?: string }> {\n  try {\n    const response = await fetch(`${dashboardApi}/api/distributions/report`, {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(payload),\n    });\n    if (!response.ok) {\n      const body = await response.json().catch(() => ({}));\n      return {\n        ok: false,\n        error: typeof body?.message === 'string' ? body.message : `HTTP ${response.status}`,\n      };\n    }\n    return { ok: true };\n  } catch (err) {\n    return { ok: false, error: getErrorMessage(err) };\n  }\n}\n\nasync function reportToDashboardWithRetries(\n  dashboardApi: string,\n  payload: Record<string, unknown>,\n): Promise<void> {\n  let lastError = 'unknown error';\n\n  for (let attempt = 1; attempt <= REPORT_MAX_ATTEMPTS; attempt += 1) {\n    const result = await reportToDashboardOnce(dashboardApi, payload);\n    if (result.ok) {\n      return;\n    }\n    lastError = result.error || lastError;\n    if (attempt < REPORT_MAX_ATTEMPTS) {\n      console.log(`  dashboard report attempt ${attempt} failed — retrying…`);\n      await sleep(REPORT_RETRY_DELAY_MS);\n    }\n  }\n\n  throw new Error(\n    `Dashboard sync failed after ${REPORT_MAX_ATTEMPTS} attempts (${lastError}). Re-run: cfm-sdk create-distribution --s3-key=${payload.s3Key}`,\n  );\n}\n\n/**\n * Upload the built static UI to a distribution path and sync status to the dashboard.\n *\n * The client generates the S3 key in the distribution dashboard; the agent uploads\n * OUT_DIR directly to sites/{surveyId}/distributions/{s3Key}/ and reports back.\n */\nexport async function runCreateDistribution(options: {\n  projectRoot?: string;\n  instanceIdOverride?: string;\n  s3Key?: string;\n}): Promise<number> {\n  try {\n    const projectRoot = options.projectRoot || resolveProjectRoot(process.cwd());\n    const deployApiBase = requireEnv('CFM_DEPLOY_API_BASE');\n    const outDir = process.env.OUT_DIR?.trim();\n\n    const instanceId =\n      options.instanceIdOverride?.trim() ||\n      process.env.CFM_INSTANCE_ID?.trim() ||\n      (() => {\n        throw new Error('Set CFM_INSTANCE_ID or pass --instance-id=');\n      })();\n\n    const s3Key = options.s3Key?.trim();\n    if (!s3Key) {\n      let surveyId = '<survey-id>';\n      try {\n        const instanceId =\n          options.instanceIdOverride?.trim() ||\n          process.env.CFM_INSTANCE_ID?.trim();\n        if (instanceId) {\n          const { survey } = await fetchSurveyFromEnv(projectRoot, instanceId);\n          surveyId = survey.id;\n        }\n      } catch {\n        // fall through with placeholder\n      }\n      console.error(\n        `\\n${formatInput5HandoffBlocks(surveyId)}\\n`,\n      );\n      return 1;\n    }\n\n    try {\n      assertDistributionDeployAllowed(projectRoot, s3Key);\n    } catch (err) {\n      console.error(`${c.red}${getErrorMessage(err)}${c.reset}`);\n      return 1;\n    }\n\n    if (!outDir) {\n      throw new Error('Missing OUT_DIR — set OUT_DIR to the absolute path of out/ or dist/');\n    }\n    if (!fs.existsSync(path.join(outDir, 'index.html'))) {\n      throw new Error(`Missing ${path.join(outDir, 'index.html')} — run build first`);\n    }\n\n    const { survey, apiResponse } = await fetchSurveyFromEnv(projectRoot, instanceId);\n    const surveyId = survey.id;\n    const surveyName = apiResponse.cfmSurveyDTO?.name?.trim() || surveyId;\n    const dashboardApi = resolveDashboardApi();\n\n    const manifest = buildFileManifest(outDir);\n\n    console.log(\n      `${c.cyan}→ Creating distribution${c.reset} for ${surveyName} (${surveyId}, s3Key: ${s3Key})`,\n    );\n    console.log(`  uploading ${manifest.length} files from ${outDir}…`);\n\n    const started = await startDistributionUpload(deployApiBase, instanceId, s3Key, manifest);\n    await uploadFiles(outDir, started.uploads, manifest);\n    console.log(`  uploads complete — finalizing deploy…`);\n\n    const completed = await completeDistributionUpload(\n      deployApiBase,\n      instanceId,\n      started.deployId,\n    );\n    const liveUrl = completed.url;\n\n    await reportToDashboardWithRetries(dashboardApi, {\n      surveyId,\n      surveyName,\n      s3Key,\n      status: 'deployed',\n      liveUrl,\n      jobId: started.deployId,\n    });\n\n    console.log(\n      `${c.green}✓ Dashboard updated${c.reset} (status: deployed, live URL set): ${dashboardApi}`,\n    );\n    console.log(`${c.green}✓ Distribution deployed${c.reset}: ${s3Key}`);\n    console.log(`\\n${formatDistributionDoneHandoffBlocks(liveUrl)}\\n`);\n    recordDistributionS3Key(projectRoot, s3Key);\n    return 0;\n  } catch (err) {\n    console.error(`${c.red}❌ create-distribution failed: ${getErrorMessage(err)}${c.reset}`);\n    return 1;\n  }\n}\n","import { colors } from './const';\nimport { checkNodeVersion } from './utils/nodeCheck';\nimport { checkVercelCli } from './utils/vercelCliCheck';\nimport { checkVercelLogin } from './utils/vercelLoginCheck';\nimport { runVercelDeploy } from './utils/vercelDeploy';\nimport { assertDeployAllowed } from './workflow-state';\nimport { resolveProjectRoot } from './resolve-project-root';\n\nexport async function runDeployment() {\n  assertDeployAllowed(resolveProjectRoot());\n\n  console.log(`\\n${colors.bold}${colors.cyan}🚀 Starting CFM Vercel Deployment...${colors.reset}\\n`);\n\n  await checkNodeVersion();\n  const { useNpx } = await checkVercelCli();\n  const hasToken = await checkVercelLogin(useNpx);\n  await runVercelDeploy(useNpx, hasToken);\n}\n","import { colors } from '../const';\nimport { hasCommand, runCommandSync } from './exec';\nimport { askQuestion } from './prompts';\n\nexport async function checkNodeVersion(): Promise<void> {\n  const majorVersion = parseInt(process.version.slice(1).split('.')[0], 10);\n  console.log(`${colors.dim}Step 1/4: Checking Node.js version (current: ${process.version})...${colors.reset}`);\n\n  if (majorVersion < 18) {\n    console.log(`⚠️  ${colors.yellow}Outdated Node.js version detected. v18.0.0 or higher is required.${colors.reset}`);\n    console.log(`${colors.dim}Note: If you already have a higher version installed via nvm, please run 'nvm use <version>' first.${colors.reset}\\n`);\n\n    const answer = await askQuestion(`Would you like to install/upgrade Node.js v18+ automatically? (y/N): `);\n    const installAutomatically = answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes';\n\n    if (!installAutomatically) {\n      console.log(`\\n❌ ${colors.red}Aborted. Please manually upgrade Node.js to v18+ and try again.${colors.reset}\\n`);\n      process.exit(1);\n    }\n    \n    const isWin = process.platform === 'win32';\n    const isMac = process.platform === 'darwin';\n\n    if (isWin) {\n      if (hasCommand('winget')) {\n        console.log(`\\n📦 ${colors.green}winget package manager found! Installing Node.js v18+ in background...${colors.reset}`);\n        const success = runCommandSync('winget', ['upgrade', 'OpenJS.NodeJS', '--silent', '--accept-package-agreements', '--accept-source-agreements']);\n        if (success) {\n          console.log(`\\n✔ ${colors.green}Node.js installation triggered successfully. Please restart your terminal/command-prompt for changes to take effect.${colors.reset}\\n`);\n          process.exit(0);\n        } else {\n          console.log(`\\n❌ ${colors.red}winget update failed. Please update Node.js manually at https://nodejs.org/${colors.reset}\\n`);\n          process.exit(1);\n        }\n      } else {\n        console.log(`\\n❌ ${colors.red}winget package manager is not installed on this system.${colors.reset}`);\n        console.log(`${colors.bold}👉 To proceed, please either:${colors.reset}`);\n        console.log(`   1. Install winget (App Installer) from the Microsoft Store.`);\n        console.log(`   2. Or manually download and install Node.js (v18+) from: https://nodejs.org/\\n`);\n        process.exit(1);\n      }\n    } else if (isMac) {\n      if (hasCommand('brew')) {\n        console.log(`\\n📦 ${colors.green}Homebrew package manager found! Installing Node.js v18+ in background...${colors.reset}`);\n        const success = runCommandSync('brew', ['install', 'node']);\n        if (success) {\n          console.log(`\\n✔ ${colors.green}Node.js installed successfully via Homebrew.${colors.reset}\\n`);\n        } else {\n          console.log(`\\n❌ ${colors.red}Homebrew installation failed. Please install Node.js manually at https://nodejs.org/${colors.reset}\\n`);\n          process.exit(1);\n        }\n      } else {\n        console.log(`\\n❌ ${colors.red}Homebrew package manager (brew) is not installed on this system.${colors.reset}`);\n        console.log(`${colors.bold}👉 To proceed, please either:${colors.reset}`);\n        console.log(`   1. Install Homebrew by running the following command in your terminal:`);\n        console.log(`      ${colors.cyan}/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"${colors.reset}`);\n        console.log(`   2. Or manually download and install Node.js (v18+) from: https://nodejs.org/\\n`);\n        process.exit(1);\n      }\n    } else {\n      console.log(`\\n❌ ${colors.red}Please install or update Node.js to v18+ using your system's package manager.${colors.reset}\\n`);\n      process.exit(1);\n    }\n  } else {\n    console.log(`✔ ${colors.green}Node.js version (v${majorVersion}) is sufficient.${colors.reset}`);\n  }\n}\n","import readline from 'readline/promises';\nimport { stdin as input, stdout as output } from 'process';\n\nexport async function askQuestion(query: string): Promise<string> {\n  const rl = readline.createInterface({ input, output });\n  try {\n    return (await rl.question(query)).trim();\n  } finally {\n    rl.close();\n  }\n}\n// rl.question(query): Prints the question (query) to the screen and waits.\n// await: Pauses the program right here. \n// The execution is frozen until the user types their answer and hits the [Enter] key.\n// .trim(): Removes any accidental whitespace (spaces or tabs) \n// from the beginning or end of the user's input (e.g., \"  yes  \" becomes \"yes\").\n// rl.close() (Crucial Step):\n// Closes the keyboard read stream and frees up system resources.\n// Why it's in finally: If you do not close readline,\n//  Node.js will think you still want to listen to the keyboard,\n// and the terminal process will freeze/hang forever even after your script finishes. \n// Placing it in finally guarantees it closes even if an error occurs.","import { colors } from '../const';\nimport { askQuestion } from './prompts';\nimport { hasCommand, runCommandSync } from './exec';\n\nexport type VercelCliContext = {\n  vercelCmd: string;\n  useNpx: boolean;\n}\n\nexport async function checkVercelCli(): Promise<VercelCliContext> {\n  console.log(`\\n${colors.dim}Step 2/4: Checking Vercel CLI...${colors.reset}`);\n  let vercelCmd = 'vercel';\n  let useNpx = false;\n\n  if (!hasCommand('vercel')) {\n    console.log(`❓ ${colors.yellow}Vercel CLI was not found on your system.${colors.reset}`);\n    const answer = await askQuestion(`👉 Would you like to install Vercel CLI globally? (Y/n): `);\n\n    if (answer.toLowerCase() === 'y' || answer === '') {\n      console.log(`\\n📥 ${colors.cyan}Installing Vercel CLI globally... (npm install -g vercel)${colors.reset}`);\n      const success = runCommandSync('npm', ['install', '-g', 'vercel']);\n      if (success && hasCommand('vercel')) {\n        console.log(`✔ ${colors.green}Vercel CLI installed successfully!${colors.reset}`);\n      }\n      else {\n        console.log(`\\n⚠️  ${colors.yellow}Global installation failed or permissions restricted.${colors.reset}`);\n        console.log(`ℹ ${colors.dim}Falling back: Running Vercel dynamically via npx.${colors.reset}`);\n        vercelCmd = 'npx --yes vercel';\n        useNpx = true;\n      }\n    }\n    else {\n      console.log(`ℹ ${colors.dim}Skipping global installation. Running Vercel dynamically via npx.${colors.reset}`);\n      vercelCmd = 'npx --yes vercel';\n      useNpx = true;\n    }\n  } else {\n    console.log(`✔ ${colors.green}Vercel CLI is installed!${colors.reset}`);\n  }\n\n  return { vercelCmd, useNpx };\n}\n","import { execSync } from 'child_process';\nimport type { ExecSyncOptions } from 'child_process';\nimport { colors } from '../const';\nimport { askQuestion } from './prompts';\nimport { runCommandInteractive } from './exec';\n\nconst ignoreShellOptions: ExecSyncOptions = {\n  stdio: 'ignore',\n  shell: process.platform === 'win32' ? 'cmd.exe' : '/bin/sh',\n};\n\nexport async function checkVercelLogin(useNpx: boolean): Promise<boolean> {\n  console.log(`\\n${colors.dim}Step 3/4: Checking Vercel Login...${colors.reset}`);\n  \n  const hasToken = !!process.env.VERCEL_TOKEN;\n  let loggedIn = false;\n\n  if (hasToken) {\n    console.log(`✔ ${colors.green}VERCEL_TOKEN environment variable detected. Skipping login check.${colors.reset}`);\n    loggedIn = true;\n  } else {\n    try {\n      // Execute vercel whoami to check active session\n      const checkCmd = useNpx ? 'npx --yes vercel whoami' : 'vercel whoami';\n      execSync(checkCmd, ignoreShellOptions);\n      loggedIn = true;\n      console.log(`✔ ${colors.green}Logged in!${colors.reset}`);\n    } catch {\n      loggedIn = false;\n    }\n  }\n\n  if (!loggedIn) {\n    console.log(`🔑 ${colors.yellow}Not logged in to Vercel.${colors.reset}`);\n    await askQuestion(`👉 Press [Enter] to login to Vercel... `);\n\n    const loginArgs = ['login'];\n    const loginCmd = useNpx ? 'npx' : 'vercel';\n    const finalArgs = useNpx ? ['--yes', 'vercel', ...loginArgs] : loginArgs;\n\n    const exitCode = await runCommandInteractive(loginCmd, finalArgs);\n    if (exitCode !== 0) {\n      throw new Error('Vercel login failed or was aborted.');\n    }\n    console.log(`\\n✔ ${colors.green}Logged in successfully!${colors.reset}`);\n  }\n\n  return hasToken;\n}\n","import { colors } from '../const';\nimport { runCommandInteractive } from './exec';\n\nexport async function runVercelDeploy(useNpx: boolean, hasToken: boolean): Promise<void> {\n  console.log(`\\n${colors.dim}Step 4/4: Deploying project to production...${colors.reset}`);\n  \n  const deployArgs = ['--prod', '--yes'];\n  if (hasToken) {\n    deployArgs.push('--token', process.env.VERCEL_TOKEN!);\n  }\n\n  const deployCmd = useNpx ? 'npx' : 'vercel';\n  const finalDeployArgs = useNpx ? ['--yes', 'vercel', ...deployArgs] : deployArgs;\n\n  console.log(`${colors.cyan}⚡ Running deployment in: ${process.cwd()}${colors.reset}\\n`);\n\n  const deployExitCode = await runCommandInteractive(deployCmd, finalDeployArgs);\n  if (deployExitCode !== 0) {\n    throw new Error('Vercel deployment failed.');\n  }\n\n  console.log(`\\n${colors.bold}${colors.green}🎉 Deployment completed successfully!${colors.reset}\\n`);\n}\n","import { colors } from './const';\nimport { formatDocBudgetHint } from './doc-read-audit';\nimport { resolveProjectRoot } from './resolve-project-root';\nimport { runScaffoldValidation } from './scaffold-validation';\n\nconst c = colors;\n\nexport interface RunScaffoldCheckOptions {\n  projectRoot?: string;\n}\n\nexport function runScaffoldCheck(options: RunScaffoldCheckOptions = {}): number {\n  const projectRoot = resolveProjectRoot(options.projectRoot);\n  console.log(`${c.bold}=== CFM SDK — scaffold-check (Phase 1 gate) ===${c.reset}`);\n  console.log(`${c.dim}Project: ${projectRoot}${c.reset}\\n`);\n\n  const result = runScaffoldValidation(projectRoot);\n\n  for (const warn of result.warnings) {\n    console.log(`${c.yellow}WARN:${c.reset} ${warn}`);\n  }\n\n  if (result.errors.length > 0) {\n    console.log(\n      `${c.red}FAIL:${c.reset} Framework scaffold incomplete (${result.framework}) — fix all items before authoring components:`,\n    );\n    for (const err of result.errors) {\n      console.log(`  - ${err}`);\n    }\n    console.log(`\\n${c.dim}Fix: setup/index.md · Next: npx cfm-sdk scaffold-check${c.reset}`);\n    return 1;\n  }\n\n  if (result.framework !== 'unknown') {\n    console.log(`${c.green}OK:${c.reset} Framework scaffold verified (${result.framework})`);\n  }\n\n  console.log(\n    `${c.dim}Core deps OK. Survey-type deps print after fill-implementation-plan --from-fetch.${c.reset}`,\n  );\n  console.log(\n    `${c.dim}Scaffold complete — run npx cfm-sdk seed-phase5 next.${c.reset}`,\n  );\n  console.log(`\\n${c.dim}${formatDocBudgetHint()}${c.reset}`);\n  console.log(`\\n${c.dim}Next: Phase 3–4 copy bundle + implementation_plan${c.reset}`);\n  return 0;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport {\n  detectFramework,\n  isAwsDeployTarget,\n  nextConfigHasStaticExport,\n  nextConfigIncludesTranspilePackages,\n  resolveSdkPackageName,\n  sourceHasUseClientDirective,\n  viteConfigHasRelativeBase,\n  type AgentFramework,\n} from './detect-framework';\n\nexport interface ScaffoldCheckResult {\n  ok: boolean;\n  framework: AgentFramework;\n  errors: string[];\n  warnings: string[];\n}\n\nfunction readPackageJson(projectRoot: string): Record<string, unknown> | null {\n  const pkgPath = path.join(projectRoot, 'package.json');\n  if (!fs.existsSync(pkgPath)) return null;\n  try {\n    return JSON.parse(fs.readFileSync(pkgPath, 'utf8')) as Record<string, unknown>;\n  } catch {\n    return null;\n  }\n}\n\nfunction findFirstExisting(projectRoot: string, candidates: string[]): string | null {\n  for (const rel of candidates) {\n    const abs = path.join(projectRoot, rel);\n    if (fs.existsSync(abs)) return rel;\n  }\n  return null;\n}\n\nfunction readTextFile(projectRoot: string, rel: string): string {\n  return fs.readFileSync(path.join(projectRoot, rel), 'utf8');\n}\n\nfunction isAwsDeploy(projectRoot: string): boolean {\n  if (process.env.CFM_DEPLOY_TARGET === 'aws') return true;\n  const candidates = ['survey-deploy-config.json', 'survey-ui-config.json'];\n  for (const name of candidates) {\n    const configPath = path.join(projectRoot, name);\n    if (!fs.existsSync(configPath)) continue;\n    try {\n      const raw = JSON.parse(fs.readFileSync(configPath, 'utf8')) as { deploy?: { target?: string } };\n      return isAwsDeployTarget(raw);\n    } catch {\n      return false;\n    }\n  }\n  return false;\n}\n\nfunction globalsHasTailwindImport(projectRoot: string): boolean {\n  const globalsCandidates = [\n    'src/app/globals.css',\n    'src/styles/globals.css',\n    'src/index.css',\n    'app/globals.css',\n  ];\n  for (const rel of globalsCandidates) {\n    const abs = path.join(projectRoot, rel);\n    if (!fs.existsSync(abs)) continue;\n    const content = fs.readFileSync(abs, 'utf8');\n    if (/@import\\s+[\"']tailwindcss[\"']/.test(content)) return true;\n  }\n  return false;\n}\n\nexport function runScaffoldValidation(projectRoot: string): ScaffoldCheckResult {\n  const errors: string[] = [];\n  const warnings: string[] = [];\n\n  const pkg = readPackageJson(projectRoot);\n  if (!pkg) {\n    return {\n      ok: false,\n      framework: 'unknown',\n      errors: ['package.json missing or invalid — cannot verify framework scaffold'],\n      warnings: [],\n    };\n  }\n\n  const deps = {\n    ...(pkg.dependencies as Record<string, string> | undefined),\n    ...(pkg.devDependencies as Record<string, string> | undefined),\n  };\n\n  const framework = detectFramework({\n    dependencies: pkg.dependencies as Record<string, string> | undefined,\n    devDependencies: pkg.devDependencies as Record<string, string> | undefined,\n  });\n\n  const sdkPkg = resolveSdkPackageName({\n    dependencies: pkg.dependencies as Record<string, string> | undefined,\n    devDependencies: pkg.devDependencies as Record<string, string> | undefined,\n  });\n\n  if (!sdkPkg) {\n    errors.push(\n      'Install @explorer02/cfm-survey-sdk (or @repo/sdk) — see setup/install.md',\n    );\n  }\n  if (!deps.react) {\n    errors.push('Install react — see setup/install.md');\n  }\n  if (!deps['@tanstack/react-query']) {\n    errors.push('Install @tanstack/react-query — see setup/install.md');\n  }\n  if (!deps['react-icons']) {\n    errors.push('Install react-icons — see setup/install.md');\n  }\n\n  if (framework === 'unknown') {\n    warnings.push('Framework not detected from package.json — add next, vite, or react-scripts');\n  }\n\n  const awsDeploy = isAwsDeploy(projectRoot);\n  const sdkPkgName = sdkPkg ?? '@explorer02/cfm-survey-sdk';\n\n  if (framework === 'nextjs') {\n    const nextConfig = findFirstExisting(projectRoot, [\n      'next.config.js',\n      'next.config.mjs',\n      'next.config.ts',\n    ]);\n    if (!nextConfig) {\n      errors.push(\n        `Create next.config.js with transpilePackages: ['${sdkPkgName}'] — see setup/nextjs.md`,\n      );\n    } else {\n      const source = readTextFile(projectRoot, nextConfig);\n      if (!nextConfigIncludesTranspilePackages(source, sdkPkgName)) {\n        errors.push(`Add transpilePackages: ['${sdkPkgName}'] to ${nextConfig}`);\n      }\n      if (awsDeploy) {\n        if (!nextConfigHasStaticExport(source)) {\n          errors.push(\n            `Add output: 'export' and assetPrefix: './' to ${nextConfig} for AWS deploy — see setup/nextjs-aws-export.md`,\n          );\n        }\n      }\n    }\n\n    const surveyPage = findFirstExisting(projectRoot, [\n      'src/components/SurveyPage.tsx',\n      'components/SurveyPage.tsx',\n      'app/components/SurveyPage.tsx',\n    ]);\n    if (surveyPage) {\n      const source = readTextFile(projectRoot, surveyPage);\n      if (!sourceHasUseClientDirective(source)) {\n        warnings.push(\n          `Add 'use client' to ${surveyPage} — required for Next.js App Router`,\n        );\n      }\n    }\n  }\n\n  if (framework === 'vite') {\n    const viteConfig = findFirstExisting(projectRoot, [\n      'vite.config.ts',\n      'vite.config.js',\n      'vite.config.mjs',\n    ]);\n    if (awsDeploy) {\n      if (!viteConfig) {\n        errors.push('Create vite.config.ts with base: \\'./\\' for AWS deploy — see setup/vite.md');\n      } else {\n        const source = readTextFile(projectRoot, viteConfig);\n        if (!viteConfigHasRelativeBase(source)) {\n          errors.push(`Add base: './' to ${viteConfig} for AWS deploy — see setup/vite.md`);\n        }\n      }\n    }\n  }\n\n  if (!fs.existsSync(path.join(projectRoot, 'survey-deploy-config.json'))\n    && !fs.existsSync(path.join(projectRoot, 'survey-ui-config.json'))) {\n    warnings.push('survey-deploy-config.json not found — expected after Phase 5 seed or before Step 7');\n  }\n\n  if (!globalsHasTailwindImport(projectRoot)) {\n    warnings.push(\n      'globals.css missing @import \"tailwindcss\" — required for Tailwind utility classes in survey UI',\n    );\n  }\n\n  const introPage = findFirstExisting(projectRoot, [\n    'src/components/IntroPage.tsx',\n    'components/IntroPage.tsx',\n    'app/components/IntroPage.tsx',\n  ]);\n  if (!introPage) {\n    warnings.push(\n      'IntroPage not found — author an intro page with a Start button that dispatches onAction START; see build-gate/intro-start-gate.md',\n    );\n  }\n\n  return {\n    ok: errors.length === 0,\n    framework,\n    errors,\n    warnings,\n  };\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { colors } from './const';\nimport { resolveProjectRoot } from './resolve-project-root';\nimport { runScaffoldValidation } from './scaffold-validation';\nimport { scanProjectSource, scanMatrixInventoryGap, partitionMatrixLayoutIssues, scanMatrixLayoutIssuesStrict, scanInteractionIssues } from './project-source-scan';\nimport { runCommandSync } from './utils/exec';\nimport {\n  CFM_NEXT_STEP_ASK_DEPLOY,\n  formatInput2HandoffBlocks,\n  formatInput4DeployHandoffBlocks,\n} from './workflow-prompts';\nimport { writeCoreVerifyPassed } from './workflow-state';\nimport { formatNpmInstallCommand, getMissingPackages } from './install-manifest';\n\nconst c = colors;\n\nconst FAST_REQUIRED_DEPS = ['@tanstack/react-query', '@dnd-kit/core'] as const;\n\nexport interface RunVerifyBuildOptions {\n  projectRoot?: string;\n  fast?: boolean;\n}\n\nfunction resolveVerifyScriptPath(projectRoot: string): string | null {\n  const copied = path.join(projectRoot, 'survey-ui', 'verify-agent-build.sh');\n  if (fs.existsSync(copied)) return copied;\n\n  const sdkScript = path.join(\n    __dirname,\n    '..',\n    '..',\n    'templates',\n    'docs',\n    'survey-ui',\n    'verify-agent-build.sh',\n  );\n  if (fs.existsSync(sdkScript)) return sdkScript;\n\n  return null;\n}\n\nexport function runVerifyBuildFast(projectRoot: string): number {\n  console.log(`${c.bold}=== CFM SDK — verify-build --fast (speed tool) ===${c.reset}`);\n  console.log(`${c.dim}Project: ${projectRoot}${c.reset}\\n`);\n\n  const scaffold = runScaffoldValidation(projectRoot);\n  for (const warn of scaffold.warnings) {\n    console.log(`${c.yellow}WARN:${c.reset} ${warn}`);\n  }\n  if (!scaffold.ok) {\n    console.log(`${c.red}FAIL:${c.reset} Scaffold incomplete:`);\n    for (const err of scaffold.errors) {\n      console.log(`  - ${err}`);\n    }\n    console.log(`\\n${c.dim}Fix: setup/index.md · Next: npx cfm-sdk verify-build --fast${c.reset}`);\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} Scaffold checks passed (${scaffold.framework})`);\n\n  const scan = scanProjectSource(projectRoot);\n  if (scan.stubMatches.length) {\n    console.log(`${c.red}FAIL:${c.reset} Stub placeholder text found:`);\n    for (const m of scan.stubMatches) console.log(`  ${m}`);\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} No stub placeholder text`);\n\n  if (scan.internalSdkImports.length) {\n    console.log(`${c.red}FAIL:${c.reset} Internal SDK imports found:`);\n    for (const m of scan.internalSdkImports) console.log(`  ${m}`);\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} No internal SDK imports`);\n\n  if (scan.nextImports.length) {\n    console.log(`${c.red}FAIL:${c.reset} Stale next/* imports found:`);\n    for (const m of scan.nextImports) console.log(`  ${m}`);\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} No next/* imports in project source`);\n\n  if (scan.introStartIssues.length) {\n    console.log(`${c.red}FAIL:${c.reset} Intro Start gate issues:`);\n    for (const m of scan.introStartIssues) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: phase-5-6-build-gate.md#intro-start-gate · Next: npx cfm-sdk verify-build --fast${c.reset}`,\n    );\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} Intro Start gate passed`);\n\n  if (scan.endPageCtaIssues.length) {\n    console.log(`${c.red}FAIL:${c.reset} End-page CTA filter issues:`);\n    for (const m of scan.endPageCtaIssues) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: 15-end-page.md · import endPageCtas from SDK · Next: npx cfm-sdk verify-build --fast${c.reset}`,\n    );\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} End-page CTA filter passed`);\n\n  if (scan.matrixStatementIssues.length) {\n    console.log(`${c.red}FAIL:${c.reset} Matrix statement label issues:`);\n    for (const m of scan.matrixStatementIssues) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: 04-csat.md / 09-slider-matrix.md · shouldShowMatrixStatementLabels · Next: npx cfm-sdk verify-build --fast${c.reset}`,\n    );\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} Matrix statement labels passed`);\n\n  const { blocking: matrixBlocking, nearMisses: matrixNearMisses } = partitionMatrixLayoutIssues(\n    scan.matrixLayoutIssues,\n  );\n  for (const m of matrixNearMisses) {\n    console.log(`${c.yellow}NEAR-MISS:${c.reset} ${m.slice('NEAR-MISS: '.length)}`);\n  }\n  if (matrixBlocking.length) {\n    console.log(`${c.red}FAIL:${c.reset} Matrix layout structure issues:`);\n    for (const m of matrixBlocking) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: layout-cookbook.md · agent-per-type-verification.md Format rows · Next: npx cfm-sdk verify-build --fast${c.reset}`,\n    );\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} Matrix layout structure passed`);\n\n  if (scan.mcqOtherIssues.length) {\n    console.log(`${c.red}FAIL:${c.reset} MCQ Other option issues:`);\n    for (const m of scan.mcqOtherIssues) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: 02-radio.md#other-option-typed-input · Next: npx cfm-sdk verify-build --fast${c.reset}`,\n    );\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} MCQ Other option gate passed`);\n\n  const interactionIssues = scanInteractionIssues(projectRoot);\n  if (interactionIssues.length) {\n    console.log(`${c.red}FAIL:${c.reset} Interaction / format contract issues:`);\n    for (const m of interactionIssues) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: field-binding-map.md · client-lib-folder.md · layout-cookbook/mcq.md · Next: npx cfm-sdk verify-interactions --from-fetch${c.reset}`,\n    );\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} Interaction contracts passed`);\n\n  // Styling is authored freely in the docs-only model — hardcoded colors are expected.\n  // The verify gate checks integration correctness (stubs, imports, intro gate), not styling.\n\n  const missingDeps = getMissingPackages(projectRoot, [...FAST_REQUIRED_DEPS]);\n  if (missingDeps.length) {\n    console.log(`${c.red}FAIL:${c.reset} Missing bundle dependencies in package.json:`);\n    for (const pkg of missingDeps) console.log(`  - ${pkg}`);\n    const cmd = formatNpmInstallCommand(missingDeps);\n    console.log(\n      `\\n${c.dim}Fix: npm install @explorer02/cfm-survey-sdk @tanstack/react-query react-icons @dnd-kit/core @dnd-kit/sortable @dnd-kit/utilities — or re-run npx cfm-sdk seed-phase5${c.reset}`,\n    );\n    if (cmd) console.log(`${c.dim}Quick: ${cmd}${c.reset}`);\n    return 1;\n  }\n  console.log(`${c.green}OK:${c.reset} Bundle deps present in package.json`);\n\n  const tsconfigPath = path.join(projectRoot, 'tsconfig.json');\n  if (!fs.existsSync(tsconfigPath)) {\n    console.log(`${c.yellow}WARN:${c.reset} tsconfig.json missing — skipping tsc --noEmit`);\n  } else {\n    console.log(`${c.dim}Running tsc --noEmit...${c.reset}`);\n    const ok = runCommandSync('npx', ['tsc', '--noEmit'], { cwd: projectRoot });\n    if (!ok) {\n      console.log(`\\n${c.red}FAIL:${c.reset} TypeScript check failed — fix errors above`);\n      console.log(`${c.dim}Next: npx cfm-sdk verify-build --fast${c.reset}`);\n      return 1;\n    }\n    console.log(`${c.green}OK:${c.reset} TypeScript check passed`);\n  }\n\n  console.log(\n    `\\n${c.green}Speed check passed${c.reset} — structural spine OK; not layout-perfect. After JWT run ${c.bold}npx cfm-sdk verify-layout${c.reset}`,\n  );\n  console.log(`Phase 6 still requires ${c.bold}npx cfm-sdk verify-build${c.reset}`);\n  console.log(`\\n${formatInput2HandoffBlocks()}\\n`);\n  return 0;\n}\n\nexport function runVerifyBuildFull(projectRoot: string): number {\n  console.log(`${c.bold}=== CFM SDK — verify-build (core) ===${c.reset}`);\n  console.log(`${c.dim}Project: ${projectRoot}${c.reset}\\n`);\n\n  const scriptPath = resolveVerifyScriptPath(projectRoot);\n  if (!scriptPath) {\n    console.log(\n      `${c.red}FAIL:${c.reset} verify-agent-build.sh not found — install the SDK package`,\n    );\n    return 1;\n  }\n\n  const ok = runCommandSync('bash', [scriptPath], { cwd: projectRoot });\n  if (!ok) {\n    console.log(`\\n${c.dim}Fix: phase-5-6-build-gate.md §8${c.reset}`);\n    return 1;\n  }\n\n  // Post-sync structural layout gate. This runs AFTER sync-from-fetch, so §3c must be\n  // populated — enforce the per-type matrix layout structure here (the --fast run happens\n  // before sync-from-fetch, where §3c is legitimately empty and these checks no-op).\n  const inventoryGap = scanMatrixInventoryGap(projectRoot);\n  if (inventoryGap.length) {\n    console.log(`${c.red}FAIL:${c.reset} Matrix inventory not populated:`);\n    for (const m of inventoryGap) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: npx cfm-sdk sync-from-fetch → fill implementation_plan.md §3c → npx cfm-sdk verify-build${c.reset}`,\n    );\n    return 1;\n  }\n\n  const scan = scanProjectSource(projectRoot);\n  const layoutIssuesStrict = scanMatrixLayoutIssuesStrict(projectRoot);\n  const { blocking: matrixBlocking, nearMisses: matrixNearMisses } = partitionMatrixLayoutIssues(\n    layoutIssuesStrict,\n  );\n  for (const m of matrixNearMisses) {\n    console.log(`${c.yellow}NEAR-MISS:${c.reset} ${m.slice('NEAR-MISS: '.length)}`);\n  }\n  const structural = [...scan.matrixStatementIssues, ...matrixBlocking, ...scanInteractionIssues(projectRoot)];\n  if (structural.length) {\n    console.log(`${c.red}FAIL:${c.reset} Matrix layout structure issues:`);\n    for (const m of structural) console.log(`  ${m}`);\n    console.log(\n      `\\n${c.dim}Fix: layout-cookbook.md · agent-per-type-verification.md · §3c variant per matrix question${c.reset}`,\n    );\n    return 1;\n  }\n\n  writeCoreVerifyPassed(projectRoot);\n  console.log(\n    `\\n${c.dim}Structural spine OK — not layout-perfect. HOOK 3 requires ${c.bold}npx cfm-sdk verify-layout${c.reset} before preview.${c.reset}`,\n  );\n  console.log(`\\n${CFM_NEXT_STEP_ASK_DEPLOY}`);\n  console.log(`\\n${formatInput4DeployHandoffBlocks()}\\n`);\n  return 0;\n}\n\nexport function runVerifyBuild(options: RunVerifyBuildOptions = {}): number {\n  const projectRoot = resolveProjectRoot(options.projectRoot);\n  if (options.fast) {\n    return runVerifyBuildFast(projectRoot);\n  }\n  return runVerifyBuildFull(projectRoot);\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { colors } from './const';\nimport { resolveProjectRoot } from './resolve-project-root';\nimport { installBundleDepsIfMissing } from './install-manifest';\nimport { writeViteScaffoldFilesIfMissing } from './vite-scaffold';\n\nconst c = colors;\n\nexport interface SeedPhase5Options {\n  projectRoot?: string;\n  scenarioB?: boolean;\n  fromMockup?: boolean;\n}\n\nfunction getSdkDocsRoot(): string {\n  return path.join(__dirname, '..', '..', 'templates', 'docs');\n}\n\nfunction copyImplementationPlanTemplate(projectRoot: string, sdkDocsRoot: string): string {\n  const dest = path.join(projectRoot, 'implementation_plan.md');\n  if (fs.existsSync(dest)) {\n    console.log(`${c.dim}   implementation_plan.md already exists — keeping${c.reset}`);\n    return dest;\n  }\n  const template = path.join(sdkDocsRoot, 'survey-ui', 'implementation_plan.md');\n  if (!fs.existsSync(template)) {\n    throw new Error('seed-phase5: survey-ui/implementation_plan.md template not found in SDK');\n  }\n  fs.copyFileSync(template, dest);\n  console.log(`${c.green}OK:${c.reset} Copied implementation_plan.md → project root`);\n  return dest;\n}\n\nfunction writeDeployConfigDefault(projectRoot: string): void {\n  const dest = path.join(projectRoot, 'survey-deploy-config.json');\n  if (fs.existsSync(dest)) {\n    console.log(`${c.dim}   survey-deploy-config.json already exists — keeping${c.reset}`);\n    return;\n  }\n  const defaultConfig = {\n    deploy: {\n      target: 'aws',\n      autoDeploy: false,\n    },\n  };\n  fs.writeFileSync(dest, `${JSON.stringify(defaultConfig, null, 2)}\\n`, 'utf8');\n  console.log(`${c.green}OK:${c.reset} Wrote survey-deploy-config.json → project root`);\n}\n\n/**\n * Docs-only model: seed-phase5 no longer copies a component bundle or generates\n * survey-theme.css. It prepares the project scaffold (framework files), installs\n * bundle dependencies, drops the implementation_plan template, and seeds\n * survey-deploy-config.json for Step 7 deploy target.\n */\nexport function runSeedPhase5(options: SeedPhase5Options = {}): number {\n  const projectRoot = resolveProjectRoot(options.projectRoot);\n  const sdkDocsRoot = getSdkDocsRoot();\n\n  console.log(`${c.bold}=== CFM SDK — seed-phase5 (scaffold) ===${c.reset}`);\n  console.log(`${c.dim}Project: ${projectRoot}${c.reset}\\n`);\n\n  copyImplementationPlanTemplate(projectRoot, sdkDocsRoot);\n  writeDeployConfigDefault(projectRoot);\n\n  const depsResult = installBundleDepsIfMissing(projectRoot);\n  if (!depsResult.ok) {\n    return 1;\n  }\n\n  writeViteScaffoldFilesIfMissing(projectRoot);\n\n  console.log(`\\n${c.green}Scaffold complete${c.reset} — no components copied (author from the docs)`);\n  console.log(`${c.dim}Agent tasks:${c.reset}`);\n  console.log(`${c.dim}  1. Author SurveyPage + one component per fetched question type (see 03-ui-specs/*)${c.reset}`);\n  console.log(`${c.dim}  2. Style to the client's design, or minimal-default-theme.md when none is given${c.reset}`);\n  console.log(`${c.dim}Next: npx cfm-sdk verify-build --fast${c.reset}`);\n  return 0;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { colors } from './const';\n\nconst c = colors;\n\nconst TSCONFIG_FILES = ['tsconfig.json', 'tsconfig.app.json', 'tsconfig.node.json'] as const;\n\nfunction getViteScaffoldRoot(): string {\n  return path.join(__dirname, '..', '..', 'templates', 'vite-scaffold');\n}\n\n/** Copy Vite tsconfig templates only when destination files are absent. */\nexport function writeViteScaffoldFilesIfMissing(projectRoot: string): string[] {\n  const scaffoldRoot = getViteScaffoldRoot();\n  const written: string[] = [];\n\n  for (const file of TSCONFIG_FILES) {\n    const src = path.join(scaffoldRoot, file);\n    const dest = path.join(projectRoot, file);\n    if (!fs.existsSync(src)) continue;\n    if (fs.existsSync(dest)) continue;\n    fs.copyFileSync(src, dest);\n    written.push(file);\n  }\n\n  if (written.length) {\n    console.log(\n      `${c.green}OK:${c.reset} Wrote Vite tsconfig scaffold (${written.join(', ')})`,\n    );\n  }\n\n  return written;\n}\n","#!/usr/bin/env node\n\nimport { runDeployment } from './deploy';\nimport { runScaffoldCheck } from './scaffold-check';\nimport { runVerifyBuild } from './verify-build';\nimport { runSeedPhase5 } from './seed-phase5';\nimport { colors } from './const';\nimport { getErrorMessage } from '../types/shared';\n\nconst c = colors;\nconst args = process.argv.slice(2);\nconst command = args[0];\n\nfunction printHelp(): void {\n  console.log(`\\n${c.bold}${c.cyan}CFM SDK CLI Tool${c.reset}`);\n  console.log(`\\nUsage:`);\n  console.log(`  npx cfm-sdk scaffold-check              – Phase 1 framework gate`);\n  console.log(`  npx cfm-sdk seed-phase5                 – Scaffold + install deps + implementation_plan (no bundle copy)`);\n  console.log(`  npx cfm-sdk verify-build                – Phase 6 core verify (includes npm run build)`);\n  console.log(`  npx cfm-sdk verify-build --fast         – Phase 5 speed check (required before INPUT 2)`);\n  console.log(`  npx cfm-sdk verify-layout --from-fetch  – HOOK 3 layout gate (required before preview)`);\n  console.log(`  npx cfm-sdk verify-interactions --from-fetch – pickers, star helper, CFM field names`);\n  console.log(`  npx cfm-sdk sync-from-fetch             – INPUT 2: plan from live fetch`);\n  console.log(`  npx cfm-sdk fill-implementation-plan --from-fetch – Auto-fill implementation_plan.md tables`);\n  console.log(`  npx cfm-sdk get-deploy-target             – Read deploy.target from survey-deploy-config.json`);\n  console.log(`  npx cfm-sdk set-deploy-target aws|vercel  – Write deploy.target after client confirms deploy`);\n  console.log(`  npx cfm-sdk deploy                      – Deploy to Vercel`);\n  console.log(`  npx cfm-sdk create-distribution --s3-key=<key>`);\n  console.log(`                                          – Upload OUT_DIR to distribution path; syncs https://distribution-dashboard-three.vercel.app`);\n  console.log(`  npx cfm-sdk doc-read-audit              – Audit fast-path doc read line budgets`);\n  console.log(`  npx cfm-sdk doc-read-audit --profile phase --phase-id 1`);\n}\n\nasync function main() {\n  if (!command || command === '--help' || command === '-h') {\n    printHelp();\n    process.exit(0);\n  }\n\n  if (command === 'scaffold-check') {\n    process.exit(runScaffoldCheck({}));\n  } else if (command === 'seed-phase5') {\n    process.exit(runSeedPhase5({}));\n  } else if (command === 'sync-from-fetch') {\n    const instanceArg = args.find((a) => a.startsWith('--instance-id='));\n    const instanceIdOverride = instanceArg?.split('=').slice(1).join('=');\n    const { runSyncFromFetch } = await import('./sync-from-fetch');\n    process.exit(await runSyncFromFetch({ instanceIdOverride }));\n  } else if (command === 'verify-layout') {\n    const fromFetch = args.includes('--from-fetch');\n    if (!fromFetch) {\n      console.error(\n        `${c.red}❌ Use: npx cfm-sdk verify-layout --from-fetch${c.reset}`,\n      );\n      process.exit(1);\n    }\n    const { runVerifyLayout } = await import('./verify-layout');\n    process.exit(await runVerifyLayout({}));\n  } else if (command === 'verify-interactions') {\n    const fromFetch = args.includes('--from-fetch');\n    if (!fromFetch) {\n      console.error(\n        `${c.red}❌ Use: npx cfm-sdk verify-interactions --from-fetch${c.reset}`,\n      );\n      process.exit(1);\n    }\n    const { runVerifyInteractions } = await import('./verify-interactions');\n    process.exit(runVerifyInteractions({}));\n  } else if (command === 'verify-build') {\n    const fast = args.includes('--fast');\n    process.exit(runVerifyBuild({ fast }));\n  } else if (command === 'fill-implementation-plan') {\n    const fromFetch = args.includes('--from-fetch');\n    const instanceArg = args.find((a) => a.startsWith('--instance-id='));\n    const instanceIdOverride = instanceArg?.split('=').slice(1).join('=');\n    if (!fromFetch) {\n      console.error(`${c.red}❌ Use: npx cfm-sdk fill-implementation-plan --from-fetch${c.reset}`);\n      process.exit(1);\n    }\n    try {\n      const { fillImplementationPlanFromFetch } = await import('./fill-implementation-plan');\n      await fillImplementationPlanFromFetch({ instanceIdOverride });\n    } catch (err: unknown) {\n      console.error(`\\n${c.red}❌ Error: ${getErrorMessage(err)}${c.reset}`);\n      console.error(`${c.dim}Fallback: fill §3b–§3e tables manually in implementation_plan.md${c.reset}`);\n      process.exit(1);\n    }\n  } else if (command === 'get-deploy-target') {\n    try {\n      const { runGetDeployTarget } = await import('./resolve-deploy-target');\n      process.exit(runGetDeployTarget({}));\n    } catch (err: unknown) {\n      console.error(`\\n${c.red}❌ Error: ${getErrorMessage(err)}${c.reset}`);\n      process.exit(1);\n    }\n  } else if (command === 'set-deploy-target') {\n    const target = args[1];\n    try {\n      const { runSetDeployTarget } = await import('./resolve-deploy-target');\n      process.exit(await runSetDeployTarget({ target }));\n    } catch (err: unknown) {\n      console.error(`\\n${c.red}❌ Error: ${getErrorMessage(err)}${c.reset}`);\n      process.exit(1);\n    }\n  } else if (command === 'deploy') {\n    try {\n      await runDeployment();\n    } catch (err: unknown) {\n      console.error(`\\n${c.red}❌ Error: ${getErrorMessage(err)}${c.reset}`);\n      process.exit(1);\n    }\n  } else if (command === 'create-distribution') {\n    const instanceArg = args.find((a) => a.startsWith('--instance-id='));\n    const s3KeyArg = args.find((a) => a.startsWith('--s3-key='));\n    const { runCreateDistribution } = await import('./create-distribution');\n    process.exit(\n      await runCreateDistribution({\n        instanceIdOverride: instanceArg?.split('=').slice(1).join('='),\n        s3Key: s3KeyArg?.split('=').slice(1).join('='),\n      }),\n    );\n  } else if (command === 'doc-read-audit') {\n    const { runDocReadAudit } = await import('./doc-read-audit');\n    const profileArg = args.find((a) => a.startsWith('--profile='));\n    const phaseIdArg = args.find((a) => a.startsWith('--phase-id='));\n    const profileFlag = args.indexOf('--profile');\n    const phaseIdFlag = args.indexOf('--phase-id');\n    let profile: 'fastPath' | 'phase' = 'fastPath';\n    let phaseId: string | undefined;\n    if (profileArg) {\n      const v = profileArg.split('=')[1];\n      if (v === 'phase' || v === 'fastPath') profile = v;\n    } else if (profileFlag >= 0) {\n      const v = args[profileFlag + 1];\n      if (v === 'phase' || v === 'fastPath') profile = v;\n    }\n    if (phaseIdArg) {\n      phaseId = phaseIdArg.split('=')[1];\n    } else if (phaseIdFlag >= 0) {\n      phaseId = args[phaseIdFlag + 1];\n    }\n    process.exit(\n      runDocReadAudit({\n        profile,\n        phaseId,\n        warnOnly: args.includes('--warn-only'),\n        ci: args.includes('--ci'),\n        writeInventory: args.includes('--write'),\n      }),\n    );\n  } else {\n    console.error(`${c.red}Unknown command: ${command}${c.reset}\\n`);\n    printHelp();\n    process.exit(1);\n  }\n}\n\nmain().catch((err: unknown) => {\n  console.error(`${c.red}❌ Fatal error: ${getErrorMessage(err)}${c.reset}`);\n  process.exit(1);\n});\n"],"mappings":"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","names":["colors","DEFAULT_DISTRIBUTION_DASHBOARD_URL","init_const","__esmMin","execSync","spawn","hasCommand","cmd","checkCmd","runCommandSync","args","options","fullCmd","inheritShellOptions","runCommandInteractive","resolve","code","init_exec","__esmMin","formatDeployTargetLabel","target","formatInput5ClientChat","surveyId","DEFAULT_DISTRIBUTION_DASHBOARD_URL","formatDistributionDoneClientChat","liveUrl","formatInput2BClientChat","devUrl","formatClientChatBlock","step","title","body","BORDER","CLIENT_CHAT_HEADER","formatAgentOnlyBlock","AGENT_ONLY_HEADER","formatInput2ClientChatBlock","INPUT_2_CLIENT_CHAT","formatInput2AgentBlock","formatInput2HandoffBlocks","formatInput2BHandoffBlocks","formatLayoutBlockedFooter","formatPreviewReadyHandoffBlocks","formatInput4AClientChatBlock","INPUT_4A_CLIENT_CHAT","formatInput4DeployAgentBlock","formatInput4DeployHandoffBlocks","formatInput5HandoffBlocks","formatDistributionDoneHandoffBlocks","formatDeployGateFailure","CFM_NEXT_STEP_ASK_DEPLOY","init_workflow_prompts","__esmMin","init_const","fs","path","statePath","projectRoot","WORKFLOW_STATE_FILE","isWorkflowGateSkipped","readWorkflowState","file","raw","writeWorkflowState","state","writeCoreVerifyPassed","existing","writeLayoutVerifyPassed","recordDeployConfirmed","next","recordDistributionS3Key","s3Key","formatDeployGateFailure","assertDeployAllowed","assertDistributionDeployAllowed","init_workflow_state","__esmMin","init_workflow_prompts","fs","path","hasSurveyProjectMarkers","root","pkgPath","pkg","deps","key","resolveProjectRoot","explicit","cwd","initCwd","init_resolve_project_root","__esmMin","doc_read_audit_exports","__export","auditDocPaths","formatDocBudgetHint","getSdkDocsRoot","loadManifest","runDocReadAudit","fs","path","normalizeRelPath","rel","tierForLines","lines","OK_MAX","WARN_MAX","resolveDocPath","docsRoot","normalized","candidates","abs","countLines","filePath","collectManifestPaths","manifest","profile","phaseId","paths","fp","p","phase","key","val","qt","entry","field","hintFor","relPath","SLOW_HINTS","relPaths","profileLabel","entries","tier","hint","a","b","slow","e","blockingSlow","MANDATORY_FAST_PATH_READS","totalLines","sum","manifestPath","options","label","result","c","tag","lineLabel","inventory","root","init_doc_read_audit","__esmMin","init_const","colors","fs","net","path","readPortFromEnv","raw","n","readViteDevPort","projectRoot","candidates","filePath","match","buildSurveyDevPortCandidates","ports","portFromEnv","pkgPath","pkg","framework","detectFramework","DEFAULT_PROBE_PORTS","probeLocalPort","port","timeoutMs","resolve","socket","onDone","alive","resolveLiveSurveyDevUrl","options","probe","resolveSurveyDevUrl","packageJson","deps","resolveSdkPackageName","SDK_PACKAGE_NAMES","name","isAwsDeployTarget","surveyUiConfig","nextConfigIncludesTranspilePackages","nextConfigSource","sdkPackageName","nextConfigHasStaticExport","viteConfigHasRelativeBase","viteConfigSource","sourceHasUseClientDirective","source","init_detect_framework","__esmMin","fs","path","collectSourceFiles","projectRoot","files","dir","SOURCE_DIRS","abs","walk","out","entry","findFirstExisting","candidates","rel","isAllowedStyleLine","line","trimmed","scanHardcodedStyleIssues","issues","AGENT_AUTHORED_STYLE_FILES","lines","HARDCODED_HEX","HARDCODED_RGB","scanIntroStartIssues","introRel","INTRO_PAGE_CANDIDATES","introContent","surveyRel","SURVEY_PAGE_CANDIDATES","surveyContent","endPageFiltersEmailCtAs","content","scanEndPageCtaIssues","endRel","END_PAGE_CANDIDATES","parseTruthyFlag","value","v","readMatrixVariantsFromPlan","planPath","section","rows","cells","c","readScaleValuesContent","file","matrixScaleFileForType","type","extractFunctionBody","name","re","stripHoverTooltipBlocks","source","numberedCellUsesColLabel","fn","body","stripped","anchorUsesJustifyBetweenWithoutAbsolute","anchorBlocks","block","hasJustify","hasAbsolute","likertMissingNonNaScaleColumns","likertNaInGridLoop","csatCarouselDuplicateLabels","carousel","csatNaHeaderGapWhenAnchors","showLabelsBlock","reservesNaSlot","hasNaHeaderText","likertBipolarStructureWeak","bipolarGridOnlyWithoutMiddleFlex","csatNaInGridLoop","ratingGraphicsUsesNumericIndex","graphicsLabelsInsideStatementLoop","matrixScaleFlexOnlyWithoutGrid","hasFlexCells","hasCellLoop","pushAutoFitIssue","variantId","strict","msg","MATRIX_NEAR_MISS_PREFIX","likertCarouselLacksBipolar","matrixFileHasAutoFitMinmax","carouselMissingNavSignals","isMatrixLayoutNearMiss","issue","partitionMatrixLayoutIssues","blocking","nearMisses","readMatrixFileContents","basename","MATRIX_RELATED_FILES","questionDispatcherContent","QUESTION_CANDIDATES","scanMatrixLayoutIssues","options","matrixBlob","MATRIX_SCALE_FILES","variants","hasBipolar","r","hasTranspose","hasRatingGraphics","hasDropdownStyle","likert","csat","question","scaleValuesContent","scaleValuesHasNonNa","matrixScalesUseNonNa","likertContent","csatContent","hasMultiColumnMatrix","carouselVariant","variant","scaleFile","scaleContent","likertContentForAnchor","scanMatrixLayoutIssuesStrict","scanMatrixInventoryGap","scanMatrixStatementIssues","readMcqOtherFlagFromPlan","match","readMcqOtherPickersFlagFromPlan","stripLineComments","findComponentFile","readPackageJsonContent","pkgPath","scanLikertDisplayStyleMisuse","likertRel","scanCsatStarIconAntiPattern","iconsPath","scanMcqOtherPickerIssues","countryRel","dateRel","inputRel","pkg","inputContent","parseAnchorLabelCount","n","surveyPlanHasType","extractLikertCarouselBlock","likertCarouselLacksScaleHeader","searchBlock","stmtIdx","firstMap","scanHeatmapMaxClicksIssues","heatmapRel","scanBipolarAnchorHeaderIssues","scanCarouselScaleHeaderIssues","scanRatingGraphicsIndexMapIssues","csatRel","graphicsBlock","trackRel","track","scanSliderDualHeaderIssues","sliderRel","hasAnchors","hasTicks","headerBlock","scanSliderPerRowTickBadges","rowLoop","scanMatrixTrackTooltipDom","parentFiles","parent","scanCustomSliderPointerLeave","hasLeaveDeactivate","hasCapture","scanScaleValuesPositionHelpers","needsDiscrete","needsContinuous","scaleRel","scanLayoutFormatIssues","scanInteractionIssues","scanMcqOtherIssues","questionRel","scanProjectSource","stubMatches","internalSdkImports","nextImports","introStartIssues","hardcodedStyleIssues","endPageCtaIssues","matrixStatementIssues","matrixLayoutIssues","mcqOtherIssues","init_project_source_scan","__esmMin","fs","path","getSdkTemplatesRoot","loadBundleDepsManifest","manifestPath","raw","mergeDepsIntoPackageJson","projectRoot","pkgPath","manifest","pkg","deps","devDeps","addedDependencies","addedDevDependencies","name","version","getBundleAlwaysPackageNames","installBundleDepsIfMissing","mergeResult","packages","missingFromPkg","getMissingPackages","missingFromNodeModules","getUninstalledNodeModules","missing","c","cmd","formatNpmInstallCommand","runCommandSync","readPackageJson","readInstalledPackages","installed","section","getSurveyTypeDeps","surveyTypes","hasMcqOtherPickers","RANK_ORDER_PACKAGES","MCQ_OTHER_PICKER_PACKAGES","p","isPackageInNodeModules","packageName","parts","modPath","listed","dev","printInstallBlock","options","border","printSurveyTypeInstallBlock","CORE_PEER_PACKAGES","BUNDLE_ALWAYS_PACKAGES","init_install_manifest","__esmMin","init_const","init_detect_framework","init_exec","colors","getErrorMessage","err","init_shared","__esmMin","SURVEY_BASE_URL","init_constants","__esmMin","buildExternalSurveyUrl","instanceId","SURVEY_BASE_URL","buildSurveyUrl","targetId","init_url","__esmMin","init_constants","init_decodeInstanceJwt","__esmMin","getLanguageName","code","norm","LANGUAGE_DISPLAY_NAMES","extractSurveyLanguages","api","dto","languagesSet","defaultLanguage","page","holder","q","lang","init_extractSurveyLanguages","__esmMin","QUESTION_CONFIG_KEY","init_questionConfigKeys","__esmMin","shouldShowQuestionHint","hint","SPRINKLR_DEFAULT_QUESTION_HINT","init_questionHintUtils","__esmMin","getConfigValue","configs","key","c","getConfigFlag","hasReverseScaleOrder","raw","hasNotApplicableOption","init_configUtils","__esmMin","resolveQuestionShell","raw","configs","language","placeholders","required","getConfigFlag","QUESTION_CONFIG_KEY","reqErrConfig","c","requiredErrorMessage","questionText","match","key","questionDescription","descConfig","questionHint","hintConfig","primaryAsset","url","mimeType","alignment","sizeConfig","size","containerMedia","associatedIds","referencedQuestionIds","id","shouldShowQuestionHint","init_resolveQuestionShell","__esmMin","init_questionConfigKeys","init_questionHintUtils","init_configUtils","hasNestedFilters","filter","isAndOrOperator","value","isCustomFieldType","CUSTOM_FIELD_TYPES","mapQuestionConditionEntity","entity","mapCustomFieldConditionEntity","mapConditionEntity","mapSubConditionEntity","mapLogicFilterLeaf","raw","conditionEntity","subConditionEntity","leaf","timezone","mapLogicFilterGroupNode","childFilters","child","mapLogicFilterNode","node","isLogicFilterGroup","mapLogicFilterGroup","init_mapLogicFilters","__esmMin","mapSkipLogics","raw","mapped","item","id","skipToId","entityType","condition","mapLogicFilterGroup","init_mapSkipLogics","__esmMin","init_mapLogicFilters","mapDisplayLogic","raw","condition","mapLogicFilterGroup","init_mapDisplayLogic","__esmMin","init_mapLogicFilters","resolveVariantText","raw","language","placeholders","questionText","match","key","mapQuestionDisplayVariants","variants","mapped","variant","id","displayLogic","mapDisplayLogic","init_mapQuestionDisplayVariants","__esmMin","init_mapDisplayLogic","attachQuestionLogics","question","skipLogics","displayLogic","displayVariants","init_attachQuestionLogics","__esmMin","QUESTION_TYPE","init_questionTypes","__esmMin","shuffleArray","items","result","i","j","parseChoiceRandomization","configs","choiceConfig","config","rawType","type","numberRaw","numberOfChoices","applyChoiceRandomization","options","pinnedOptionIds","requestedCount","count","pinnedSet","id","option","pinned","remaining","slotsLeft","selectedRemaining","init_choiceRandomization","__esmMin","applyMcqChoiceRandomization","options","randomization","defaultOptionIds","otherOptions","option","regularOptions","regularDefaultIds","id","randomizedRegular","shuffleOptions","applyChoiceRandomization","init_applyMcqChoiceRandomization","__esmMin","init_choiceRandomization","mapAnswerLogic","raw","condition","mapLogicFilterGroup","init_mapAnswerLogic","__esmMin","init_mapLogicFilters","findConfig","configs","key","c","firstValue","config","parseNumber","raw","n","mapDateFormat","normalized","mapContentType","upper","extractContentTypeConfig","otherConfig","contentTypeConfig","contentType","contentChildren","errorMessage","base","minCharacters","maxCharacters","minNumber","maxNumber","decimalCount","countryCodes","dateFormat","dateRange","minDate","maxDate","extractOtherOptionConfig","answerDetail","fallbackLabel","childConfigs","label","helpText","markRequired","placeholder","contentConfig","init_extractOtherOptionConfig","__esmMin","buildMcqOptions","question","language","a","i","answerLogic","mapAnswerLogic","optionLabel","otherOption","extractOtherOptionConfig","init_buildMcqOptions","__esmMin","init_mapAnswerLogic","init_extractOtherOptionConfig","extractAnswerConditions","configs","conditionConfig","c","minMaxConfig","minRaw","maxRaw","errorMessage","minSelections","maxSelections","init_extractAnswerConditions","__esmMin","extractDefaultOptionIds","configs","validOptionIds","defaultAnswerConfig","c","ids","validSet","filtered","id","init_extractDefaultOptionIds","__esmMin","mapMcqQuestion","raw","shell","language","configs","selectionMode","c","displayFormat","columnsConfig","columnCount","builtOptions","buildMcqOptions","defaultOptionIdsBeforeRandomization","extractDefaultOptionIds","o","randomization","parseChoiceRandomization","options","shuffleOptions","applyMcqChoiceRandomization","defaultOptionIds","answerConditions","extractAnswerConditions","QUESTION_TYPE","init_mapMcqQuestion","__esmMin","init_questionTypes","init_choiceRandomization","init_applyMcqChoiceRandomization","init_buildMcqOptions","init_extractAnswerConditions","init_extractDefaultOptionIds","writeLog","level","message","meta","loggingEnabled","timestamp","badge","style","BADGE_STYLES","sdkLogger","init_logger","__esmMin","val","msg","metric","logUnknownAnswerType","answerType","questionId","sdkLogger","init_mapperLogger","__esmMin","init_logger","DISPLAY_STYLE","API_STYLE_VALUE","NPS_BUTTON_STYLE","init_displayStyles","__esmMin","extractHintLabels","answerDetails","language","hints","a","init_extractHintLabels","__esmMin","buildSelectableScalePoints","question","language","options","selectable","a","i","_","init_buildSelectableScalePoints","__esmMin","buildNpsScalePoints","question","language","buildSelectableScalePoints","init_buildNpsScalePoints","__esmMin","init_buildSelectableScalePoints","mapNpsQuestion","raw","shell","configs","language","hintLabels","extractHintLabels","minLabel","maxLabel","midLabel","options","buildNpsScalePoints","reverseScaleOrder","hasReverseScaleOrder","midLabelIndex","buttonStyle","NPS_BUTTON_STYLE","variant","getConfigValue","QUESTION_CONFIG_KEY","showScaleNumbers","QUESTION_TYPE","init_mapNpsQuestion","__esmMin","init_questionTypes","init_questionConfigKeys","init_displayStyles","init_extractHintLabels","init_buildNpsScalePoints","init_configUtils","mapTextInputQuestion","raw","shell","configs","language","contentTypeConfig","c","maxCharConfig","cc","maxCharacterCount","inputVariant","textDetail","placeholder","QUESTION_TYPE","init_mapTextInputQuestion","__esmMin","init_questionTypes","detectMatrixFormat","configs","configsString","init_detectMatrixFormat","__esmMin","resolveSubQuestionText","sub","language","isBipolar","subQ","leftText","rawText","init_resolveStatementText","__esmMin","resolveOppositeStatementText","sub","language","isBipolar","subQ","rightText","matrixAdditional","text","rawText","buildCfmStatementRows","question","rowSrc","answerLogic","mapAnswerLogic","oppositeStatementText","resolveSubQuestionText","a","i","init_buildCfmStatementRows","__esmMin","init_resolveStatementText","init_mapAnswerLogic","buildScaleColumns","question","language","sub","label","resolveSubQuestionText","answerLogic","mapAnswerLogic","a","i","init_buildScaleColumns","__esmMin","init_mapAnswerLogic","init_resolveStatementText","mapCfmMatrixQuestion","raw","shell","language","configs","statementLayout","getConfigValue","QUESTION_CONFIG_KEY","statementRows","buildCfmStatementRows","scaleColumns","buildScaleColumns","gridLayout","detectMatrixFormat","selectionMode","c","transposeTable","getConfigFlag","repeatColumnHeaders","notApplicable","hasNotApplicableOption","effectiveTranspose","showColumnHeaders","scaleAnchorLabels","a","QUESTION_TYPE","init_mapCfmMatrixQuestion","__esmMin","init_questionTypes","init_questionConfigKeys","init_detectMatrixFormat","init_buildCfmStatementRows","init_buildScaleColumns","init_configUtils","detectDisplayStyle","configs","dataSubType","searchString","c","buttonType","getConfigValue","QUESTION_CONFIG_KEY","API_STYLE_VALUE","DISPLAY_STYLE","knownStyles","init_detectDisplayStyle","__esmMin","init_questionConfigKeys","init_displayStyles","init_configUtils","buildSimpleStatementRows","question","language","rowSrc","sub","answerLogic","mapAnswerLogic","resolveSubQuestionText","a","i","init_buildSimpleStatementRows","__esmMin","init_resolveStatementText","init_mapAnswerLogic","resolveMatrixScaleOptions","raw","configs","language","scaleColumns","notApplicable","hasNotApplicableOption","reverseScaleOrder","hasReverseScaleOrder","scaleAnchorLabels","resolvedColumns","init_resolveMatrixScaleOptions","__esmMin","init_configUtils","mapCsatQuestion","raw","shell","language","configs","scaleColumns","scaleAnchorLabels","hasNotApplicableOption","reverseScaleOrder","resolveMatrixScaleOptions","buildScaleColumns","QUESTION_TYPE","buildSimpleStatementRows","detectDisplayStyle","detectMatrixFormat","init_mapCsatQuestion","__esmMin","init_questionTypes","init_detectDisplayStyle","init_detectMatrixFormat","init_buildScaleColumns","init_buildSimpleStatementRows","init_resolveMatrixScaleOptions","mapRatingMatrixQuestion","raw","shell","language","configs","scaleColumns","scaleAnchorLabels","hasNotApplicableOption","reverseScaleOrder","resolveMatrixScaleOptions","buildScaleColumns","minLabel","maxLabel","extractHintLabels","QUESTION_TYPE","buildSimpleStatementRows","detectDisplayStyle","detectMatrixFormat","init_mapRatingMatrixQuestion","__esmMin","init_questionTypes","init_detectDisplayStyle","init_detectMatrixFormat","init_extractHintLabels","init_buildScaleColumns","init_buildSimpleStatementRows","init_resolveMatrixScaleOptions","buildSliderMatrixRows","question","language","baseMin","baseMax","baseStep","buildSimpleStatementRows","row","init_buildSliderMatrixRows","__esmMin","init_buildSimpleStatementRows","mapSliderMatrixQuestion","raw","shell","language","configs","sliderConfig","c","childConfigs","rawMin","rawMax","rawStep","rawTicks","min","max","step","tickCount","enrichedRaw","statementRows","buildSliderMatrixRows","scaleAnchorLabels","a","getFlag","keys","key","x","isGraphics","enableInputBox","displayValues","hasNotApplicableOption","answerOptions","marks","markStep","i","tickPosition","tickLabel","QUESTION_TYPE","init_mapSliderMatrixQuestion","__esmMin","init_questionTypes","init_buildSliderMatrixRows","buildMediaConfig","question","add","url","mimeType","title","assets","asset","configs","alignConfig","c","sizeConfig","alignment","size","init_buildMediaConfig","__esmMin","mapTextAndMediaQuestion","raw","shell","media","buildMediaConfig","_containerMedia","shellFields","questionText","headerDetail","d","hasMedia","QUESTION_TYPE","init_mapTextAndMediaQuestion","__esmMin","init_questionTypes","init_buildMediaConfig","mapFileUploadQuestion","raw","shell","language","configs","uploadMessageDetail","a","uploadMessage","supportedFileFormats","c","ext","maxFileCountConfig","maxFileCount","fileSizeLimitConfig","sizeLimitId","cc","sizeFormatId","fileSizeLimit","fileSizeLimitType","QUESTION_TYPE","init_mapFileUploadQuestion","__esmMin","init_questionTypes","buildHeatmapRegions","apiRegions","imageWidth","imageHeight","referenceWidth","region","referenceHeight","init_buildHeatmapRegions","__esmMin","mapHeatmapQuestion","raw","shell","metadata","asset","imageUrl","rawMax","maxClicksAllowed","regions","referenceWidth","referenceHeight","buildHeatmapRegions","QUESTION_TYPE","init_mapHeatmapQuestion","__esmMin","init_questionTypes","init_buildHeatmapRegions","buildRankOrderOptions","question","language","answer","index","answerLogic","mapAnswerLogic","asset","imageUrl","previewImageUrl","init_buildRankOrderOptions","__esmMin","init_mapAnswerLogic","parseBooleanConfig","configs","key","config","mapInteractionMode","rawValue","mapOptionDisplay","mapRankOrderQuestion","raw","shell","language","answerTypeConfig","optionTypeConfig","builtOptions","buildRankOrderOptions","randomization","parseChoiceRandomization","options","shuffleOptions","applyChoiceRandomization","QUESTION_TYPE","init_mapRankOrderQuestion","__esmMin","init_questionTypes","init_choiceRandomization","init_buildRankOrderOptions","resolveQuestionMapper","answerType","QUESTION_MAPPERS","mapMcq","mapNps","mapTextInput","mapCfmMatrix","mapCsatMatrix","mapRatingMatrix","mapSliderMatrix","mapTextAndMedia","mapFileUpload","mapHeatmap","mapRankOrder","init_registry","__esmMin","init_questionTypes","init_mapMcqQuestion","init_mapNpsQuestion","init_mapTextInputQuestion","init_mapCfmMatrixQuestion","init_mapCsatQuestion","init_mapRatingMatrixQuestion","init_mapSliderMatrixQuestion","init_mapTextAndMediaQuestion","init_mapFileUploadQuestion","init_mapHeatmapQuestion","init_mapRankOrderQuestion","raw","shell","language","mapMcqQuestion","configs","mapNpsQuestion","mapTextInputQuestion","mapCfmMatrixQuestion","mapCsatQuestion","mapRatingMatrixQuestion","mapSliderMatrixQuestion","mapTextAndMediaQuestion","mapFileUploadQuestion","mapHeatmapQuestion","mapRankOrderQuestion","QUESTION_TYPE","mapQuestion","raw","language","placeholders","configs","shell","resolveQuestionShell","skipLogics","mapSkipLogics","displayLogic","mapDisplayLogic","displayVariants","mapQuestionDisplayVariants","withLogics","question","attachQuestionLogics","mapper","resolveQuestionMapper","logUnknownAnswerType","mapMcqQuestion","init_question","__esmMin","init_resolveQuestionShell","init_mapSkipLogics","init_mapDisplayLogic","init_mapQuestionDisplayVariants","init_attachQuestionLogics","init_mapMcqQuestion","init_mapperLogger","init_registry","mapCtaButton","api","language","options","translation","label","enabled","inputPlaceholder","ctaDescription","mapPageCtaConfig","next","previous","mapSpecialPageCtas","ctas","start","key","SPECIAL_PAGE_CTA_KEYS","mapped","init_mapCtaButton","__esmMin","mapSurveyPages","api","surveyLanguage","placeholders","dto","page","index","questions","holder","q","mapQuestion","cta","mapPageCtaConfig","init_mapSurveyPages","__esmMin","init_question","init_mapCtaButton","resolveSpecialPageText","page","language","translations","header","description","ctas","mapSpecialPageCtas","ctaLabel","displayLogic","mapDisplayLogic","title","mapSpecialPages","api","dto","endPages","mapPhaseFlags","statusPaused","init_mapSpecialPages","__esmMin","init_mapDisplayLogic","init_mapCtaButton","resolveSurveyLanguage","api","language","mapSurvey","placeholders","surveyLanguage","languages","extractSurveyLanguages","pages","mapSurveyPages","introPage","endPages","pausedPage","submittedPage","expiredPage","quotaFulfilledPage","mapSpecialPages","phaseFlags","mapPhaseFlags","submitCta","mapCtaButton","init_mapSurvey","__esmMin","init_decodeInstanceJwt","init_extractSurveyLanguages","init_mapSurveyPages","init_mapSpecialPages","init_mapCtaButton","QUESTION_TYPE_LITERALS","init_ui_config_types","__esmMin","fs","path","parseEnvFile","content","out","line","trimmed","eq","key","value","loadEnvVars","projectRoot","merged","file","abs","resolveInstanceIdFromEnv","override","env","extractSurveyTypesFromSurvey","survey","types","page","question","t","QUESTION_TYPE_LITERALS","fetchSurveyFromEnv","instanceIdOverride","instanceId","url","buildSurveyUrl","response","err","msg","apiResponse","mapSurvey","init_fetch_survey_inventory","__esmMin","init_url","init_mapSurvey","init_ui_config_types","fs","path","isLogicGroup","node","collectCustomFieldIdsFromLogic","nodes","out","entity","collectCustomFieldIdsFromText","text","matches","CUSTOM_FIELD_ID_RE","m","hasAnswerLogicOnQuestion","question","QUESTION_TYPE","o","r","c","matrixDisplayStyle","formatMatrixBranchOn","row","parts","surveyHasMcqOtherOption","survey","page","surveyHasMcqOtherPickerTypes","option","contentType","MCQ_OTHER_PICKER_CONTENT_TYPES","extractFrameworkSection","projectRoot","pkgPath","pkg","framework","detectFramework","packageName","resolveSdkPackageName","extractComponentInventory","types","extractSurveyTypesFromSurvey","rows","seen","type","entries","COMPONENT_BY_TYPE","entry","key","t","p","q","extractMatrixVariants","matrixTypes","extractMcqOtherInventory","extractCustomFieldInventory","idToUses","add","id","use","normalized","set","scanLogic","ids","sl","v","textIds","copyIds","opt","col","endPage","a","b","uses","extractLogicInventory","cfIds","hasSkip","hasDisplay","hasAnswer","extractPlaceholderTokens","tokenToQuestions","scanText","questionId","match","PLACEHOLDER_RE","raw","token","qids","formatComponentTableRows","block","formatMatrixTableRows","formatMcqOtherTableRows","isTruthyInventoryFlag","value","formatLayoutActionForVariant","hasNa","naSuffix","formatMcqOtherTasksMarkdown","hasPickers","lines","formatLayoutTasksMarkdown","branchLabel","formatCustomFieldTableRows","formatPlaceholderTableRows","formatLogicTableRows","MCQ_OTHER_TASKS_FILENAME","LAYOUT_TASKS_FILENAME","init_survey_inventory_extract","__esmMin","init_questionTypes","init_detect_framework","init_fetch_survey_inventory","layout_audit_exports","__export","LAYOUT_AUDIT_FILENAME","buildLayoutAuditContent","parseLayoutAuditFile","writeLayoutAuditFile","fs","path","auditRowCells","row","variants","AUDIT_HEADER","rows","projectRoot","auditPath","errors","content","lines","l","brokenCount","incompleteCount","dataRows","line","cells","c","dataCells","questionId","verdict","ALLOWED_VERDICTS","init_layout_audit","__esmMin","layout_tasks_exports","__export","writeLayoutTasksFile","fs","path","projectRoot","variants","tasksPath","LAYOUT_TASKS_FILENAME","formatLayoutTasksMarkdown","init_layout_tasks","__esmMin","init_survey_inventory_extract","mcq_other_tasks_exports","__export","writeMcqOtherTasksFile","fs","path","projectRoot","rows","hasPickers","tasksPath","MCQ_OTHER_TASKS_FILENAME","formatMcqOtherTasksMarkdown","init_mcq_other_tasks","__esmMin","init_survey_inventory_extract","fill_implementation_plan_exports","__export","fillImplementationPlanFromFetch","patchImplementationPlan","runFillImplementationPlan","fs","path","replaceSectionTable","content","sectionHeading","tableHeaderPattern","newRows","headingIdx","headerMatch","tableStart","nextSection","tableBodyEnd","before","after","rows","patchFrameworkSection","projectRoot","frameworkLine","packageLine","extractFrameworkSection","out","survey","formatComponentTableRows","extractComponentInventory","formatMatrixTableRows","extractMatrixVariants","formatMcqOtherTableRows","extractMcqOtherInventory","mcqOtherLine","surveyHasMcqOtherOption","mcqOtherPickersLine","surveyHasMcqOtherPickerTypes","formatCustomFieldTableRows","extractCustomFieldInventory","formatPlaceholderTableRows","extractPlaceholderTokens","formatLogicTableRows","extractLogicInventory","options","planPath","fetchSurveyFromEnv","surveyTypes","extractSurveyTypesFromSurvey","original","patched","hasMcqOtherPickers","matrixVariants","mcqOtherRows","writeLayoutAuditFile","writeLayoutTasksFile","writeMcqOtherTasksFile","c","printSurveyTypeInstallBlock","init_fill_implementation_plan","__esmMin","init_const","init_fetch_survey_inventory","init_survey_inventory_extract","init_install_manifest","colors","sync_from_fetch_exports","__export","runSyncFromFetch","path","options","projectRoot","resolveProjectRoot","c","planPath","surveyTypes","hasMcqOtherPickers","matrixVariants","mcqOtherRows","runFillImplementationPlan","auditPath","writeLayoutAuditFile","tasksPath","writeLayoutTasksFile","mcqTasksPath","writeMcqOtherTasksFile","printSurveyTypeInstallBlock","warning","resolveLiveSurveyDevUrl","formatLayoutBlockedFooter","err","getErrorMessage","init_sync_from_fetch","__esmMin","init_const","init_detect_framework","init_fill_implementation_plan","init_layout_audit","init_layout_tasks","init_mcq_other_tasks","init_install_manifest","init_resolve_project_root","init_workflow_prompts","init_shared","colors","verify_layout_exports","__export","runVerifyLayout","printMatrixGrepReminder","variants","c","v","options","projectRoot","resolveProjectRoot","inventoryGap","scanMatrixInventoryGap","formatLayoutBlockedFooter","readMatrixVariantsFromPlan","layoutIssues","scanMatrixLayoutIssuesStrict","blocking","nearMisses","partitionMatrixLayoutIssues","layoutFormatIssues","scanLayoutFormatIssues","interactionIssues","scanInteractionIssues","audit","parseLayoutAuditFile","LAYOUT_AUDIT_FILENAME","writeLayoutVerifyPassed","devUrl","resolveLiveSurveyDevUrl","formatPreviewReadyHandoffBlocks","init_verify_layout","__esmMin","init_const","init_layout_audit","init_project_source_scan","init_resolve_project_root","init_workflow_prompts","init_detect_framework","init_workflow_state","colors","verify_interactions_exports","__export","runVerifyInteractions","options","projectRoot","resolveProjectRoot","c","issues","scanInteractionIssues","m","init_verify_interactions","__esmMin","init_const","init_project_source_scan","init_resolve_project_root","colors","resolve_deploy_target_exports","__export","SURVEY_DEPLOY_CONFIG_FILE","readDeployTarget","runGetDeployTarget","runSetDeployTarget","writeDeployTarget","fs","path","deployConfigPath","projectRoot","legacyConfigPath","LEGACY_SURVEY_UI_CONFIG_FILE","resolveConfigFile","deployPath","legacyPath","abs","target","outPath","raw","deploy","next","options","resolveProjectRoot","label","formatDeployTargetLabel","c","readWorkflowState","configFile","recordDeployConfirmed","err","getErrorMessage","surveyId","instanceId","survey","fetchSurveyFromEnv","formatInput5HandoffBlocks","init_resolve_deploy_target","__esmMin","init_const","init_resolve_project_root","init_workflow_prompts","init_workflow_state","init_fetch_survey_inventory","init_shared","colors","create_distribution_exports","__export","runCreateDistribution","fs","path","requireEnv","name","value","resolveDashboardApi","DEFAULT_DISTRIBUTION_DASHBOARD_URL","guessContentType","filePath","ext","buildFileManifest","outDir","files","walk","dir","entry","full","rel","sizeBytes","MAX_FILE_BYTES","a","b","MAX_FILES","startDistributionUpload","deployApiBase","parentJwt","s3Key","response","body","uploadFiles","uploads","manifest","mimeByPath","f","failed","item","contentType","completeDistributionUpload","deployId","reportToDashboardOnce","dashboardApi","payload","err","getErrorMessage","reportToDashboardWithRetries","lastError","attempt","REPORT_MAX_ATTEMPTS","result","sleep","REPORT_RETRY_DELAY_MS","options","projectRoot","resolveProjectRoot","instanceId","surveyId","survey","fetchSurveyFromEnv","formatInput5HandoffBlocks","assertDistributionDeployAllowed","c","apiResponse","surveyName","started","liveUrl","formatDistributionDoneHandoffBlocks","recordDistributionS3Key","init_create_distribution","__esmMin","init_fetch_survey_inventory","init_resolve_project_root","init_const","init_shared","init_workflow_prompts","init_workflow_state","colors","ms","resolve","init_const","init_const","init_exec","readline","input","output","askQuestion","query","rl","checkNodeVersion","majorVersion","colors","answer","askQuestion","isWin","isMac","hasCommand","runCommandSync","init_const","init_exec","checkVercelCli","colors","vercelCmd","useNpx","hasCommand","answer","askQuestion","runCommandSync","init_const","execSync","init_exec","ignoreShellOptions","checkVercelLogin","useNpx","colors","hasToken","loggedIn","execSync","askQuestion","loginArgs","loginCmd","finalArgs","runCommandInteractive","init_const","init_exec","runVercelDeploy","useNpx","hasToken","colors","deployArgs","deployCmd","finalDeployArgs","runCommandInteractive","init_workflow_state","init_resolve_project_root","runDeployment","assertDeployAllowed","resolveProjectRoot","colors","checkNodeVersion","useNpx","checkVercelCli","hasToken","checkVercelLogin","runVercelDeploy","init_const","init_doc_read_audit","init_resolve_project_root","init_detect_framework","fs","path","readPackageJson","projectRoot","pkgPath","findFirstExisting","candidates","rel","abs","readTextFile","isAwsDeploy","name","configPath","raw","isAwsDeployTarget","globalsHasTailwindImport","globalsCandidates","content","runScaffoldValidation","errors","warnings","pkg","deps","framework","detectFramework","sdkPkg","resolveSdkPackageName","awsDeploy","sdkPkgName","nextConfig","source","nextConfigIncludesTranspilePackages","nextConfigHasStaticExport","surveyPage","sourceHasUseClientDirective","viteConfig","viteConfigHasRelativeBase","c","colors","runScaffoldCheck","options","projectRoot","resolveProjectRoot","result","runScaffoldValidation","warn","err","formatDocBudgetHint","init_const","init_resolve_project_root","fs","path","init_project_source_scan","init_exec","init_workflow_prompts","init_workflow_state","init_install_manifest","colors","FAST_REQUIRED_DEPS","resolveVerifyScriptPath","projectRoot","copied","sdkScript","runVerifyBuildFast","scaffold","runScaffoldValidation","warn","err","scan","scanProjectSource","m","matrixBlocking","matrixNearMisses","partitionMatrixLayoutIssues","interactionIssues","scanInteractionIssues","missingDeps","getMissingPackages","pkg","cmd","formatNpmInstallCommand","tsconfigPath","runCommandSync","formatInput2HandoffBlocks","runVerifyBuildFull","scriptPath","inventoryGap","scanMatrixInventoryGap","layoutIssuesStrict","scanMatrixLayoutIssuesStrict","structural","writeCoreVerifyPassed","CFM_NEXT_STEP_ASK_DEPLOY","formatInput4DeployHandoffBlocks","runVerifyBuild","options","resolveProjectRoot","init_const","init_resolve_project_root","init_install_manifest","fs","path","init_const","fs","path","c","colors","TSCONFIG_FILES","getViteScaffoldRoot","writeViteScaffoldFilesIfMissing","projectRoot","scaffoldRoot","written","file","src","dest","c","colors","getSdkDocsRoot","copyImplementationPlanTemplate","projectRoot","sdkDocsRoot","dest","template","writeDeployConfigDefault","runSeedPhase5","options","resolveProjectRoot","installBundleDepsIfMissing","writeViteScaffoldFilesIfMissing","init_const","init_shared","c","colors","args","command","printHelp","main","runScaffoldCheck","runSeedPhase5","instanceIdOverride","a","runSyncFromFetch","runVerifyLayout","runVerifyInteractions","fast","runVerifyBuild","fromFetch","fillImplementationPlanFromFetch","err","getErrorMessage","runGetDeployTarget","target","runSetDeployTarget","runDeployment","instanceArg","s3KeyArg","runCreateDistribution","runDocReadAudit","profileArg","phaseIdArg","profileFlag","phaseIdFlag","profile","phaseId","v"]}