{"record":{"id":"5b5094a5936dfb1e","repo":"shadcn-ui/ui","slug":"manual-review-required-for-issues-length-item","errorCode":null,"errorMessage":"Manual review required for ${issues.length} item${\n      issues.length === 1 ? \"\" : \"s\"\n    }:","messagePattern":"Manual review required for (.+?) item(.+?):","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/shadcn/src/migrations/cn/index.ts","lineNumber":177,"sourceCode":"  )\n}\n\nfunction getDeclaredMajor(version?: string) {\n  if (!version || /^(?:workspace|file|link|git|https?):/i.test(version)) {\n    return null\n  }\n\n  const match = version.match(/(?:^|[^0-9])(\\d+)(?:\\.|$)/)\n  return match ? Number(match[1]) : null\n}\n\nfunction printUnsupportedIssues(issues: CnMigrationIssue[], cwd: string) {\n  if (!issues.length) {\n    return\n  }\n\n  logger.break()\n  logger.warn(\n    `Manual review required for ${issues.length} item${\n      issues.length === 1 ? \"\" : \"s\"\n    }:`\n  )\n  for (const issue of issues) {\n    const file = issue.file ? path.relative(cwd, issue.file) : \"unknown file\"\n    const symbol = issue.symbol ? ` (${issue.symbol})` : \"\"\n    logger.warn(`  - ${file}${symbol}: ${issue.reason}`)\n  }\n}\n","sourceCodeStart":159,"sourceCodeEnd":188,"githubUrl":"https://github.com/shadcn-ui/ui/blob/5c7072da672b0048bc6771e3204063a2537df91a/packages/shadcn/src/migrations/cn/index.ts#L159-L188","documentation":"When the cn transformer encounters constructs it cannot safely migrate (unsupported clsx/tailwind-merge usage), it collects them as CnMigrationIssue entries. printUnsupportedIssues is called after the migration (or after finding no supported usage) and logs a warning header with the count of items needing manual review, followed by one line per issue. This is a diagnostic warning, not a thrown error; the migration still completes for the files it could change.","triggerScenarios":"Any migrateCn run where at least one transformed file reports result.unsupported issues — e.g. dynamic imports of clsx/tailwind-merge, non-standard cn definitions, re-exports the transformer cannot rewrite.","commonSituations":"Custom cn() wrappers in utils.ts that the transformer leaves alone; conditional or aliased imports of tailwind-merge (twMerge); code generated patterns the AST rules don't cover; large legacy codebases with unusual class-merge helpers.","solutions":["Read each listed issue (file, symbol, reason) and migrate those spots by hand to the new cn utility.","Update custom cn wrappers to re-export the new `cn` package, then delete the manual item.","Rerun the migration afterwards to confirm the manual-review list is empty.","If an item is intentional legacy code, document it and leave it as-is — the warning is advisory."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"await migrateCn({ cwd: process.cwd(), yes: true })\n// the CLI prints 'Manual review required...' — capture output in CI and fail if present\nif (cliOutput.includes('Manual review required')) {\n  throw new Error('Migration finished but manual-review items remain')\n}","preventionTips":["Keep cn() helpers in the standard shape the transformer understands.","Avoid aliasing or dynamically importing clsx/tailwind-merge.","Run the migration on a branch and diff every reported item.","Treat the warning list as a checklist — rerun until it is empty."],"tags":["manual-review","migration","diagnostic"],"backgroundTag":"manual-review-required","analyzedSha":"5c7072da672b0048bc6771e3204063a2537df91a","analyzedAt":"2026-09-07T00:08:47.579Z","contentChangedAt":"2026-09-07T00:08:47.579Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}