shadcn-ui/ui · warning

Manual review required for ${issues.length} item${ iss

Error message

Manual review required for ${issues.length} item${
      issues.length === 1 ? "" : "s"
    }:

What it means

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.

Source

Thrown at packages/shadcn/src/migrations/cn/index.ts:177

  )
}

function getDeclaredMajor(version?: string) {
  if (!version || /^(?:workspace|file|link|git|https?):/i.test(version)) {
    return null
  }

  const match = version.match(/(?:^|[^0-9])(\d+)(?:\.|$)/)
  return match ? Number(match[1]) : null
}

function printUnsupportedIssues(issues: CnMigrationIssue[], cwd: string) {
  if (!issues.length) {
    return
  }

  logger.break()
  logger.warn(
    `Manual review required for ${issues.length} item${
      issues.length === 1 ? "" : "s"
    }:`
  )
  for (const issue of issues) {
    const file = issue.file ? path.relative(cwd, issue.file) : "unknown file"
    const symbol = issue.symbol ? ` (${issue.symbol})` : ""
    logger.warn(`  - ${file}${symbol}: ${issue.reason}`)
  }
}

View on GitHub (pinned to 5c7072da67)

Solutions

  1. Read each listed issue (file, symbol, reason) and migrate those spots by hand to the new cn utility.
  2. Update custom cn wrappers to re-export the new `cn` package, then delete the manual item.
  3. Rerun the migration afterwards to confirm the manual-review list is empty.
  4. If an item is intentional legacy code, document it and leave it as-is — the warning is advisory.
Defensive patterns

Strategy: try-catch

Try / catch

await migrateCn({ cwd: process.cwd(), yes: true })
// the CLI prints 'Manual review required...' — capture output in CI and fail if present
if (cliOutput.includes('Manual review required')) {
  throw new Error('Migration finished but manual-review items remain')
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of shadcn-ui/ui@5c7072da67 (2026-09-07). Data as JSON: /api/errors/5b5094a5936dfb1e. Report an issue: GitHub.