@ant-design/cli 6.3.3 → 6.3.5-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -1
- package/README.zh-CN.md +22 -1
- package/data/v4.json.gz +0 -0
- package/data/v5.json.gz +0 -0
- package/data/v6.3.4.json.gz +0 -0
- package/data/v6.json.gz +0 -0
- package/data/versions.json +1 -1
- package/dist/index.js +887 -612
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
- package/skills/antd/SKILL.md +19 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/data/loader.ts","../src/data/version.ts","../src/output/formatter.ts","../src/commands/list.ts","../src/types.ts","../src/output/error.ts","../src/commands/info.ts","../src/commands/doc.ts","../src/commands/demo.ts","../src/commands/token.ts","../src/commands/semantic.ts","../src/commands/changelog.ts","../src/commands/doctor.ts","../src/utils/scan.ts","../src/commands/usage.ts","../src/commands/lint.ts","../src/commands/migrate-v4-to-v5.ts","../src/commands/migrate-v5-to-v6.ts","../src/commands/migrate.ts","../src/utils/issue.ts","../src/commands/bug.ts","../src/utils/update-check.ts"],"sourcesContent":["import { Command, Option } from 'commander';\nimport { registerListCommand } from './commands/list.js';\nimport { registerInfoCommand } from './commands/info.js';\nimport { registerDocCommand } from './commands/doc.js';\nimport { registerDemoCommand } from './commands/demo.js';\nimport { registerTokenCommand } from './commands/token.js';\nimport { registerSemanticCommand } from './commands/semantic.js';\nimport { registerChangelogCommand } from './commands/changelog.js';\nimport { registerDoctorCommand } from './commands/doctor.js';\nimport { registerUsageCommand } from './commands/usage.js';\nimport { registerLintCommand } from './commands/lint.js';\nimport { registerMigrateCommand } from './commands/migrate.js';\nimport { registerBugCommand, registerBugCliCommand } from './commands/bug.js';\nimport { checkForUpdate } from './utils/update-check.js';\n\ndeclare const __CLI_VERSION__: string;\nconst CLI_VERSION = __CLI_VERSION__;\n\nconst program = new Command();\n\nprogram\n .name('antd')\n .description('CLI tool for querying antd knowledge and analyzing antd usage')\n .option('--format <format>', 'Output format: json, text, or markdown', 'text')\n .option('--version <version>', 'Target antd version (e.g. 5.20.0)')\n .option('--lang <lang>', 'Output language: en or zh', 'en')\n .option('--detail', 'Full information output', false);\n\n// -V for CLI version (--version is used for antd version targeting)\nprogram.addOption(new Option('-V, --cli-version', 'Output the CLI version number'));\n\n// Knowledge Query commands\nregisterListCommand(program);\nregisterInfoCommand(program);\nregisterDocCommand(program);\nregisterDemoCommand(program);\nregisterTokenCommand(program);\nregisterSemanticCommand(program);\nregisterChangelogCommand(program);\n\n// Project Analysis commands\nregisterDoctorCommand(program);\nregisterUsageCommand(program);\nregisterLintCommand(program);\nregisterMigrateCommand(program);\n\n// Issue Reporting commands\nregisterBugCommand(program);\nregisterBugCliCommand(program);\n\nprogram.hook('postAction', async () => {\n await checkForUpdate();\n});\n\n// Handle -V before subcommand dispatch\nconst idx = process.argv.indexOf('-V');\nconst idx2 = process.argv.indexOf('--cli-version');\nif (idx !== -1 || idx2 !== -1) {\n // eslint-disable-next-line no-console\n console.log(CLI_VERSION);\n process.exit(0);\n}\n\nprogram.parse();\n","import { readFileSync, existsSync } from 'node:fs';\nimport { gunzipSync } from 'node:zlib';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { MetadataStore, ComponentData } from '../types.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nfunction getDataPath(): string {\n // Check for a known file to confirm the correct directory\n // Works from both dist/ and src/data/\n // Probe for both .json.gz (published package) and .json (local dev) formats\n const candidates = [\n join(__dirname, '..', 'data'), // from dist/\n join(__dirname, '..', '..', 'data'), // from src/data/\n ];\n return candidates.find((p) =>\n existsSync(join(p, 'v5.json.gz')) || existsSync(join(p, 'v5.json'))\n ) ?? candidates[0];\n}\n\n/** Read a JSON data file, supporting both .json.gz and plain .json formats. */\nfunction readDataFile(filePath: string): string {\n const gzPath = filePath + '.gz';\n if (existsSync(gzPath)) {\n return gunzipSync(readFileSync(gzPath)).toString('utf-8');\n }\n return readFileSync(filePath, 'utf-8');\n}\n\n/** Deduplicate props by name (keep first occurrence). */\nfunction normalizeStore(store: MetadataStore): MetadataStore {\n for (const comp of store.components) {\n const seen = new Set<string>();\n comp.props = comp.props.filter((p) => {\n if (seen.has(p.name)) return false;\n seen.add(p.name);\n return true;\n });\n }\n return store;\n}\n\nexport function loadMetadata(majorVersion: string): MetadataStore {\n const dataPath = join(getDataPath(), `${majorVersion}.json`);\n try {\n return normalizeStore(JSON.parse(readDataFile(dataPath)) as MetadataStore);\n } catch (err) {\n if (err instanceof SyntaxError) {\n process.stderr.write(`[antd-cli] Warning: data file may be corrupted: ${dataPath}\\n`);\n }\n return {\n version: majorVersion,\n majorVersion,\n components: [],\n };\n }\n}\n\n/**\n * Load metadata for the most accurate historical snapshot matching the given full semver version.\n *\n * Resolution order:\n * 1. Exact minor match in versions.json (e.g. \"4.3\" → \"4.3.4\" → data/v4.3.4.json)\n * 2. Nearest earlier minor (e.g. requested 4.2.5 but only 4.1.x exists → use 4.1.x)\n * 3. Fall back to loadMetadata(majorVersion) (i.e. data/v4.json)\n */\nexport function loadMetadataForVersion(version: string): MetadataStore {\n const parts = version.split('.');\n const major = parts[0];\n const majorVersion = `v${major}`;\n\n // If not a recognisable major.minor.patch string, fall back immediately\n if (!parts[1]) {\n return loadMetadata(majorVersion);\n }\n\n const minorKey = `${major}.${parts[1]}`; // e.g. \"4.3\"\n\n // Load versions index\n const versionsPath = join(getDataPath(), 'versions.json');\n let versionsIndex: Record<string, Record<string, string>> = {};\n try {\n versionsIndex = JSON.parse(readFileSync(versionsPath, 'utf-8'));\n } catch {\n return loadMetadata(majorVersion);\n }\n\n const majorIndex = versionsIndex[majorVersion] ?? {};\n\n // Helper: try to load a snapshot by tag string (e.g. \"4.3.4\")\n function tryLoadSnapshot(tag: string): MetadataStore | null {\n const snapshotPath = join(getDataPath(), `v${tag}.json`);\n if (!existsSync(snapshotPath) && !existsSync(snapshotPath + '.gz')) return null;\n try {\n return normalizeStore(JSON.parse(readDataFile(snapshotPath)) as MetadataStore);\n } catch {\n return null;\n }\n }\n\n // 1. Exact minor match\n if (majorIndex[minorKey]) {\n const result = tryLoadSnapshot(majorIndex[minorKey]);\n if (result) return result;\n }\n\n // 2. Nearest earlier minor\n const requestedMinor = parseInt(parts[1], 10);\n const availableMinors = Object.keys(majorIndex)\n .filter((k) => k.startsWith(`${major}.`))\n .sort((a, b) => parseInt(a.split('.')[1], 10) - parseInt(b.split('.')[1], 10));\n\n let bestMinorKey: string | undefined;\n for (const m of availableMinors) {\n if (parseInt(m.split('.')[1], 10) <= requestedMinor) {\n bestMinorKey = m;\n }\n }\n\n if (bestMinorKey && majorIndex[bestMinorKey]) {\n const result = tryLoadSnapshot(majorIndex[bestMinorKey]);\n if (result) return result;\n }\n\n // 3. Fall back to latest major snapshot\n return loadMetadata(majorVersion);\n}\n\nexport function findComponent(\n store: MetadataStore,\n name: string,\n): ComponentData | undefined {\n return store.components.find(\n (c) => c.name.toLowerCase() === name.toLowerCase(),\n );\n}\n\nexport function getAllComponentNames(store: MetadataStore): string[] {\n return store.components.map((c) => c.name);\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface VersionInfo {\n version: string;\n majorVersion: string;\n source: 'flag' | 'node_modules' | 'package.json' | 'fallback';\n}\n\nconst FALLBACK_VERSION = '5.24.0';\nconst FALLBACK_MAJOR = 'v5';\n\nexport function detectVersion(flagVersion?: string): VersionInfo {\n // 1. --version flag\n if (flagVersion) {\n return {\n version: flagVersion,\n majorVersion: toMajor(flagVersion),\n source: 'flag',\n };\n }\n\n // 2. node_modules/antd/package.json\n const nmPath = join(process.cwd(), 'node_modules', 'antd', 'package.json');\n if (existsSync(nmPath)) {\n try {\n const pkg = JSON.parse(readFileSync(nmPath, 'utf-8'));\n if (pkg.version) {\n return {\n version: pkg.version,\n majorVersion: toMajor(pkg.version),\n source: 'node_modules',\n };\n }\n } catch {\n // ignore parse errors\n }\n }\n\n // 3. Project package.json dependencies\n const pkgPath = join(process.cwd(), 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n const depVersion =\n pkg.dependencies?.antd || pkg.devDependencies?.antd || pkg.peerDependencies?.antd;\n if (depVersion) {\n const cleaned = depVersion.replace(/[\\^~>=<\\s]/g, '');\n return {\n version: cleaned,\n majorVersion: toMajor(cleaned),\n source: 'package.json',\n };\n }\n } catch {\n // ignore parse errors\n }\n }\n\n // 4. Fallback to latest\n return {\n version: FALLBACK_VERSION,\n majorVersion: FALLBACK_MAJOR,\n source: 'fallback',\n };\n}\n\nfunction toMajor(version: string): string {\n const major = version.split('.')[0];\n return `v${major}`;\n}\n\n/** Simple semver comparison. Returns -1, 0, or 1. */\nexport function compare(a: string, b: string): number {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n const na = pa[i] || 0;\n const nb = pb[i] || 0;\n if (na < nb) return -1;\n if (na > nb) return 1;\n }\n return 0;\n}\n\n/** Check if a string looks like a valid semver. */\nexport function valid(version: string): boolean {\n return /^\\d+\\.\\d+\\.\\d+/.test(version);\n}\n\n/**\n * Check if a version string satisfies a semver range.\n * Supports: >=, >, ^, ~, exact x.y.z, bare x, bare x.y\n * Returns true for unrecognized range formats (fail-open).\n */\nexport function satisfies(version: string, range: string): boolean {\n range = range.trim();\n version = version.trim();\n\n if (range.startsWith('>=')) {\n const bound = range.slice(2).trim();\n return compare(version, bound) >= 0;\n }\n if (range.startsWith('>')) {\n const bound = range.slice(1).trim();\n return compare(version, bound) > 0;\n }\n if (range.startsWith('^')) {\n const bound = range.slice(1).trim();\n const vParts = version.split('.').map(Number);\n const bParts = bound.split('.').map(Number);\n if (vParts[0] !== bParts[0]) return false;\n return compare(version, bound) >= 0;\n }\n if (range.startsWith('~')) {\n const bound = range.slice(1).trim();\n const vParts = version.split('.').map(Number);\n const bParts = bound.split('.').map(Number);\n if (vParts[0] !== bParts[0] || vParts[1] !== bParts[1]) return false;\n return compare(version, bound) >= 0;\n }\n // bare major (e.g. \"5\") or major.minor (e.g. \"5.1\")\n const parts = range.split('.');\n if (parts.length <= 2 && parts.every(p => /^\\d+$/.test(p))) {\n const vParts = version.split('.').map(Number);\n const rParts = parts.map(Number);\n if (vParts[0] !== rParts[0]) return false;\n if (rParts.length === 2 && vParts[1] !== rParts[1]) return false;\n return true;\n }\n // exact version (x.y.z)\n if (/^\\d+\\.\\d+\\.\\d+/.test(range)) {\n return compare(version, range) === 0;\n }\n // Unrecognized range — fail-open\n return true;\n}\n","import type { OutputFormat } from '../types.js';\n\nfunction formatOutput(data: unknown, format: OutputFormat): string {\n switch (format) {\n case 'json':\n return JSON.stringify(data, null, 2);\n case 'markdown':\n return formatAsMarkdown(data);\n case 'text':\n default:\n return formatAsText(data);\n }\n}\n\nfunction formatAsText(data: unknown): string {\n if (typeof data === 'string') return data;\n if (Array.isArray(data)) return data.map((item) => formatAsText(item)).join('\\n');\n if (typeof data === 'object' && data !== null) {\n return Object.entries(data)\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return `${key}:\\n${value.map((v) => ` ${formatAsText(v)}`).join('\\n')}`;\n }\n return `${key}: ${value}`;\n })\n .join('\\n');\n }\n return String(data);\n}\n\nfunction formatAsMarkdown(data: unknown): string {\n if (typeof data === 'string') return data;\n if (typeof data === 'object' && data !== null) {\n return '```json\\n' + JSON.stringify(data, null, 2) + '\\n```';\n }\n return String(data);\n}\n\nexport function formatTable(\n headers: string[],\n rows: string[][],\n format: OutputFormat,\n): string {\n if (format === 'json') {\n return JSON.stringify(\n rows.map((row) => {\n const obj: Record<string, string> = {};\n headers.forEach((h, i) => {\n obj[h] = row[i];\n });\n return obj;\n }),\n null,\n 2,\n );\n }\n\n if (format === 'markdown') {\n // Escape pipe characters in cell content to avoid breaking markdown tables\n const escPipe = (s: string) => s.replace(/\\|/g, '\\\\|');\n const headerLine = '| ' + headers.map(escPipe).join(' | ') + ' |';\n const separator = '| ' + headers.map(() => '---').join(' | ') + ' |';\n const bodyLines = rows.map((row) => '| ' + row.map(escPipe).join(' | ') + ' |');\n return [headerLine, separator, ...bodyLines].join('\\n');\n }\n\n // Text format: aligned columns\n const colWidths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] || '').length)),\n );\n const headerLine = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');\n const separator = colWidths.map((w) => '-'.repeat(w)).join(' ');\n const bodyLines = rows.map((row) =>\n row.map((cell, i) => (cell || '').padEnd(colWidths[i])).join(' '),\n );\n return [headerLine, separator, ...bodyLines].join('\\n');\n}\n\nexport function output(data: unknown, format: OutputFormat): void {\n console.log(formatOutput(data, format));\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { loadMetadataForVersion } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { formatTable, output } from '../output/formatter.js';\n\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .description('List all components with bilingual names, descriptions, and first-supported version')\n .action(() => {\n const opts = program.opts<GlobalOptions>();\n const versionInfo = detectVersion(opts.version);\n const store = loadMetadataForVersion(versionInfo.version);\n\n if (store.components.length === 0) {\n console.log('No component data available.');\n return;\n }\n\n if (opts.format === 'json') {\n const data = store.components.map((c) => ({\n name: c.name,\n nameZh: c.nameZh ?? '',\n description: c.description,\n descriptionZh: c.descriptionZh ?? '',\n since: c.since ?? '',\n }));\n output(data, 'json');\n return;\n }\n\n if (opts.format === 'markdown') {\n const lines: string[] = [\n `# antd Components (${versionInfo.version})`,\n '',\n '| Component | 组件名 | Description | Since |',\n '|-----------|--------|-------------|-------|',\n ];\n for (const c of store.components) {\n const desc = c.description || c.descriptionZh || '';\n lines.push(`| **${c.name}** | ${c.nameZh ?? ''} | ${desc} | ${c.since ?? ''} |`);\n }\n console.log(lines.join('\\n'));\n return;\n }\n\n // Text format\n const headers = ['Component', '组件名', 'Description', 'Since'];\n const rows = store.components.map((c) => [\n c.name,\n c.nameZh ?? '',\n c.description,\n c.since ?? '',\n ]);\n console.log(formatTable(headers, rows, 'text'));\n });\n}\n","export interface PropData {\n name: string;\n type: string;\n default: string;\n description?: string;\n descriptionZh?: string;\n since?: string;\n deprecated?: boolean | string;\n required?: boolean;\n}\n\nexport interface DemoData {\n name: string;\n title: string;\n titleZh?: string;\n description: string;\n descriptionZh?: string;\n code: string;\n}\n\nexport interface TokenData {\n name: string;\n type: string;\n default: string;\n description?: string;\n descriptionZh?: string;\n}\n\nexport interface SemanticKey {\n key: string;\n description: string;\n descriptionZh?: string;\n}\n\nexport interface ComponentData {\n name: string;\n nameZh?: string;\n since?: string;\n category: string;\n categoryZh?: string;\n description: string;\n descriptionZh?: string;\n whenToUse?: string;\n whenToUseZh?: string;\n props: PropData[];\n methods?: { name: string; description: string; type: string }[];\n demos?: DemoData[];\n tokens?: TokenData[];\n semanticStructure?: SemanticKey[];\n related?: string[];\n faq?: { question: string; answer: string }[];\n subComponents?: string[];\n subComponentProps?: Record<string, PropData[]>;\n doc?: string;\n docZh?: string;\n}\n\n/** Pick the right text based on language. Falls back to English. */\nexport function localize(en: string | undefined, zh: string | undefined, lang: string): string {\n if (lang === 'zh' && zh) return zh;\n return en || '';\n}\n\nexport interface ChangelogEntry {\n version: string;\n date: string;\n changes: {\n component: string;\n type: 'feature' | 'fix' | 'style' | 'deprecation' | 'breaking' | 'other';\n description: string;\n }[];\n}\n\nexport interface MetadataStore {\n version: string;\n majorVersion: string;\n components: ComponentData[];\n globalTokens?: TokenData[];\n changelog?: ChangelogEntry[];\n}\n\nexport type OutputFormat = 'json' | 'text' | 'markdown';\n\nexport interface GlobalOptions {\n format: OutputFormat;\n version?: string;\n lang: 'en' | 'zh';\n detail: boolean;\n}\n\nexport interface CLIError {\n error: true;\n code: string;\n message: string;\n suggestion?: string;\n}\n","import type { CLIError } from '../types.js';\n\nexport const ErrorCodes = {\n COMPONENT_NOT_FOUND: 'COMPONENT_NOT_FOUND',\n VERSION_NOT_FOUND: 'VERSION_NOT_FOUND',\n NO_PROJECT_DETECTED: 'NO_PROJECT_DETECTED',\n METADATA_FETCH_FAILED: 'METADATA_FETCH_FAILED',\n UNSUPPORTED_VERSION_FEATURE: 'UNSUPPORTED_VERSION_FEATURE',\n DEMO_NOT_FOUND: 'DEMO_NOT_FOUND',\n INVALID_ARGUMENT: 'INVALID_ARGUMENT',\n TITLE_REQUIRED: 'TITLE_REQUIRED',\n GH_NOT_FOUND: 'GH_NOT_FOUND',\n GH_SUBMIT_FAILED: 'GH_SUBMIT_FAILED',\n} as const;\n\nexport function createError(code: string, message: string, suggestion?: string): CLIError {\n return { error: true, code, message, suggestion };\n}\n\nexport function printError(err: CLIError, format: string): void {\n if (format === 'json') {\n console.error(JSON.stringify(err, null, 2));\n } else {\n console.error(`Error: ${err.message}`);\n if (err.suggestion) {\n console.error(`Suggestion: ${err.suggestion}`);\n }\n }\n}\n\nexport function fuzzyMatch(input: string, candidates: string[]): string | undefined {\n if (candidates.length === 0) return undefined;\n const lower = input.toLowerCase();\n\n // Exact match (case-insensitive)\n const exact = candidates.find((c) => c.toLowerCase() === lower);\n if (exact) return exact;\n\n // Prefix match\n const prefix = candidates.find((c) => c.toLowerCase().startsWith(lower));\n if (prefix) return prefix;\n\n // Contains match\n const contains = candidates.find((c) => c.toLowerCase().includes(lower));\n if (contains) return contains;\n\n // Levenshtein distance for close matches\n // Tie-break by preferring candidates that start with the same letter as input\n let best: string | undefined;\n let bestDist = Infinity;\n for (const candidate of candidates) {\n const dist = levenshtein(lower, candidate.toLowerCase());\n if (dist <= 3) {\n const sameFirstLetter = lower[0] === candidate[0]?.toLowerCase();\n const bestSameFirstLetter = best ? lower[0] === best[0]?.toLowerCase() : false;\n if (dist < bestDist || (dist === bestDist && sameFirstLetter && !bestSameFirstLetter)) {\n bestDist = dist;\n best = candidate;\n }\n }\n }\n return best;\n}\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] =\n a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1]\n : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n }\n }\n return dp[m][n];\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions, PropData } from '../types.js';\nimport { localize } from '../types.js';\nimport { loadMetadataForVersion, findComponent, getAllComponentNames } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { createError, printError, fuzzyMatch, ErrorCodes } from '../output/error.js';\nimport { formatTable, output } from '../output/formatter.js';\n\nfunction mapProps(props: PropData[], lang: string, detail: boolean) {\n return props.map((p) =>\n detail\n ? [p.name, p.type, p.default, p.since ?? '-', localize(p.description, p.descriptionZh, lang) || '-']\n : [p.name, p.type, p.default, p.since ?? '-'],\n );\n}\n\nexport function registerInfoCommand(program: Command): void {\n program\n .command('info <component>')\n .description('Query component API: props, type definitions, default values')\n .action((component: string) => {\n const opts = program.opts<GlobalOptions>();\n const lang = opts.lang;\n const versionInfo = detectVersion(opts.version);\n const store = loadMetadataForVersion(versionInfo.version);\n const comp = findComponent(store, component);\n\n if (!comp) {\n const names = getAllComponentNames(store);\n const suggestion = fuzzyMatch(component, names);\n const err = createError(\n ErrorCodes.COMPONENT_NOT_FOUND,\n `Component '${component}' not found`,\n suggestion ? `Did you mean '${suggestion}'?` : undefined,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n const desc = localize(comp.description, comp.descriptionZh, lang);\n const whenToUse = localize(comp.whenToUse, comp.whenToUseZh, lang);\n\n if (opts.format === 'json') {\n if (opts.detail) {\n output(\n {\n name: comp.name,\n nameZh: comp.nameZh ?? '',\n description: desc,\n whenToUse: whenToUse || '',\n props: comp.props.map((p) => ({\n ...p,\n description: localize(p.description, p.descriptionZh, lang),\n })),\n subComponentProps: comp.subComponentProps\n ? Object.fromEntries(\n Object.entries(comp.subComponentProps).map(([name, props]) => [\n name,\n props.map((p) => ({ ...p, description: localize(p.description, p.descriptionZh, lang) })),\n ]),\n )\n : undefined,\n methods: comp.methods || [],\n related: comp.related || [],\n faq: comp.faq || [],\n },\n 'json',\n );\n } else {\n output(\n {\n name: comp.name,\n nameZh: comp.nameZh ?? '',\n description: desc,\n props: comp.props.map((p) => ({\n name: p.name,\n type: p.type,\n default: p.default,\n since: p.since ?? '',\n })),\n subComponentProps: comp.subComponentProps\n ? Object.fromEntries(\n Object.entries(comp.subComponentProps).map(([name, props]) => [\n name,\n props.map((p) => ({ name: p.name, type: p.type, default: p.default })),\n ]),\n )\n : undefined,\n },\n 'json',\n );\n }\n return;\n }\n\n // Text/markdown format\n const fmt = opts.format === 'markdown' ? 'markdown' : 'text';\n const nameLabel = comp.nameZh ? `${comp.name} (${comp.nameZh})` : comp.name;\n console.log(`${nameLabel} — ${desc}`);\n if (opts.detail && whenToUse) {\n console.log(`\\nWhen to use: ${whenToUse}`);\n }\n console.log('');\n\n const headers = opts.detail\n ? ['Property', 'Type', 'Default', 'Since', 'Description']\n : ['Property', 'Type', 'Default', 'Since'];\n\n console.log(formatTable(headers, mapProps(comp.props, lang, opts.detail), fmt));\n\n if (comp.subComponentProps) {\n for (const [subName, subProps] of Object.entries(comp.subComponentProps)) {\n console.log(`\\n${subName}`);\n console.log('');\n console.log(formatTable(headers, mapProps(subProps, lang, opts.detail), fmt));\n }\n }\n\n if (opts.detail && comp.related && comp.related.length > 0) {\n console.log(`\\nRelated: ${comp.related.join(', ')}`);\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { localize } from '../types.js';\nimport { loadMetadataForVersion, findComponent, getAllComponentNames } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { createError, printError, fuzzyMatch, ErrorCodes } from '../output/error.js';\nimport { output } from '../output/formatter.js';\n\nexport function registerDocCommand(program: Command): void {\n program\n .command('doc <component>')\n .description('Output the full API documentation for a component in markdown')\n .action((component: string) => {\n const opts = program.opts<GlobalOptions>();\n const lang = opts.lang;\n const versionInfo = detectVersion(opts.version);\n const store = loadMetadataForVersion(versionInfo.version);\n const comp = findComponent(store, component);\n\n if (!comp) {\n const names = getAllComponentNames(store);\n const suggestion = fuzzyMatch(component, names);\n const err = createError(\n ErrorCodes.COMPONENT_NOT_FOUND,\n `Component '${component}' not found`,\n suggestion ? `Did you mean '${suggestion}'?` : undefined,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n const doc = localize(comp.doc, comp.docZh, lang);\n\n if (!doc) {\n const err = createError(\n 'DOC_NOT_AVAILABLE',\n `Documentation not available for '${comp.name}'`,\n 'Try upgrading to a newer version of the CLI',\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n if (opts.format === 'json') {\n output({ name: comp.name, doc }, 'json');\n return;\n }\n\n process.stdout.write(doc + '\\n');\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { loadMetadataForVersion, findComponent, getAllComponentNames } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { createError, printError, fuzzyMatch, ErrorCodes } from '../output/error.js';\nimport { output } from '../output/formatter.js';\n\nexport function registerDemoCommand(program: Command): void {\n program\n .command('demo <component> [name]')\n .description('Get demo source code for a component')\n .action((component: string, name?: string) => {\n const opts = program.opts<GlobalOptions>();\n const versionInfo = detectVersion(opts.version);\n const store = loadMetadataForVersion(versionInfo.version);\n const comp = findComponent(store, component);\n\n if (!comp) {\n const names = getAllComponentNames(store);\n const suggestion = fuzzyMatch(component, names);\n const err = createError(\n ErrorCodes.COMPONENT_NOT_FOUND,\n `Component '${component}' not found`,\n suggestion ? `Did you mean '${suggestion}'?` : undefined,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n const demos = comp.demos || [];\n\n if (!name) {\n // List all demos\n if (opts.format === 'json') {\n output(\n {\n component: comp.name,\n demos: demos.map((d) => ({\n name: d.name,\n title: d.title,\n description: d.description,\n })),\n },\n 'json',\n );\n } else {\n console.log(`${comp.name} Demos:`);\n console.log('');\n for (const demo of demos) {\n console.log(` ${demo.name} — ${demo.title}`);\n console.log(` ${demo.description}`);\n }\n if (demos.length === 0) {\n console.log(' No demos available.');\n }\n }\n return;\n }\n\n // Find specific demo\n const demo = demos.find((d) => d.name.toLowerCase() === name.toLowerCase());\n if (!demo) {\n const demoNames = demos.map((d) => d.name);\n const suggestion = fuzzyMatch(name, demoNames);\n const err = createError(\n ErrorCodes.DEMO_NOT_FOUND,\n `Demo '${name}' not found for ${comp.name}`,\n suggestion\n ? `Did you mean '${suggestion}'?`\n : `Available demos: ${demoNames.join(', ') || 'none'}`,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n if (opts.format === 'json') {\n output(\n {\n component: comp.name,\n demo: demo.name,\n title: demo.title,\n description: demo.description,\n code: demo.code,\n },\n 'json',\n );\n } else {\n console.log(`${comp.name} / ${demo.title}`);\n console.log(`${demo.description}`);\n console.log('');\n console.log(demo.code);\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { localize } from '../types.js';\nimport { loadMetadataForVersion, findComponent, getAllComponentNames } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { createError, printError, fuzzyMatch, ErrorCodes } from '../output/error.js';\nimport { formatTable, output } from '../output/formatter.js';\n\nexport function registerTokenCommand(program: Command): void {\n program\n .command('token [component]')\n .description('Query Design Tokens (global or component-level)')\n .action((component?: string) => {\n const opts = program.opts<GlobalOptions>();\n const versionInfo = detectVersion(opts.version);\n\n if (versionInfo.majorVersion === 'v4') {\n const err = createError(\n ErrorCodes.UNSUPPORTED_VERSION_FEATURE,\n 'Design Token system is not available in antd v4',\n 'Upgrade to antd v5+ to use Design Tokens',\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n const store = loadMetadataForVersion(versionInfo.version);\n\n if (!component) {\n const globalTokens = store.globalTokens || [];\n if (globalTokens.length === 0) {\n console.log('No global token data available.');\n return;\n }\n\n if (opts.format === 'json') {\n output({ tokens: globalTokens }, 'json');\n return;\n }\n\n console.log('Global Design Tokens:');\n console.log('');\n const headers = ['Token', 'Type', 'Default', 'Description'];\n const rows = globalTokens.map((t) => [\n t.name,\n t.type,\n t.default,\n localize(t.description, t.descriptionZh, opts.lang) || '-',\n ]);\n console.log(formatTable(headers, rows, opts.format === 'markdown' ? 'markdown' : 'text'));\n return;\n }\n\n const comp = findComponent(store, component);\n if (!comp) {\n const names = getAllComponentNames(store);\n const suggestion = fuzzyMatch(component, names);\n const err = createError(\n ErrorCodes.COMPONENT_NOT_FOUND,\n `Component '${component}' not found`,\n suggestion ? `Did you mean '${suggestion}'?` : undefined,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n const tokens = comp.tokens || [];\n if (tokens.length === 0) {\n console.log(`No component tokens available for ${comp.name}.`);\n return;\n }\n\n if (opts.format === 'json') {\n output({ component: comp.name, tokens }, 'json');\n return;\n }\n\n console.log(`${comp.name} Component Tokens:`);\n console.log('');\n const headers = ['Token', 'Type', 'Default'];\n const rows = tokens.map((t) => [t.name, t.type, t.default]);\n console.log(formatTable(headers, rows, opts.format === 'markdown' ? 'markdown' : 'text'));\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { loadMetadataForVersion, findComponent, getAllComponentNames } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { createError, printError, fuzzyMatch, ErrorCodes } from '../output/error.js';\nimport { output } from '../output/formatter.js';\n\nexport function registerSemanticCommand(program: Command): void {\n program\n .command('semantic <component>')\n .description('Query the semantic customization structure of a component')\n .action((component: string) => {\n const opts = program.opts<GlobalOptions>();\n const versionInfo = detectVersion(opts.version);\n const store = loadMetadataForVersion(versionInfo.version);\n const comp = findComponent(store, component);\n\n if (!comp) {\n const names = getAllComponentNames(store);\n const suggestion = fuzzyMatch(component, names);\n const err = createError(\n ErrorCodes.COMPONENT_NOT_FOUND,\n `Component '${component}' not found`,\n suggestion ? `Did you mean '${suggestion}'?` : undefined,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n const structure = comp.semanticStructure || [];\n if (structure.length === 0) {\n console.log(`No semantic structure data available for ${comp.name}.`);\n return;\n }\n\n if (opts.format === 'json') {\n output({ name: comp.name, semanticStructure: structure }, 'json');\n return;\n }\n\n console.log(`${comp.name} Semantic Structure:`);\n for (let i = 0; i < structure.length; i++) {\n const prefix = i === structure.length - 1 ? '└──' : '├──';\n console.log(`${prefix} ${structure[i].key} # ${structure[i].description}`);\n }\n console.log('');\n console.log('Usage:');\n console.log(` <${comp.name} classNames={{ ${structure[0]?.key}: 'my-${structure[0]?.key}' }} />`);\n console.log(` <${comp.name} styles={{ ${structure[0]?.key}: { background: '#fff' } }} />`);\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions, ComponentData, PropData, ChangelogEntry } from '../types.js';\nimport { loadMetadataForVersion, findComponent, getAllComponentNames } from '../data/loader.js';\nimport { detectVersion, compare } from '../data/version.js';\nimport { output } from '../output/formatter.js';\nimport { createError, printError, fuzzyMatch, ErrorCodes } from '../output/error.js';\n\n// ── Changelog logic ──\n\nfunction parseVersionRange(version: string): { from: string; to: string } | { exact: string } {\n if (version.includes('..')) {\n const [from, to] = version.split('..');\n return { from, to };\n }\n return { exact: version };\n}\n\nfunction filterEntries(changelog: ChangelogEntry[], versionArg?: string): ChangelogEntry[] {\n if (!versionArg) return changelog.slice(0, 5);\n\n const parsed = parseVersionRange(versionArg);\n if ('exact' in parsed) {\n return changelog.filter((e) => e.version === parsed.exact);\n }\n return changelog.filter(\n (e) => compare(e.version, parsed.from) >= 0 && compare(e.version, parsed.to) <= 0,\n );\n}\n\nconst EMOJI_MAP: Record<string, string> = {\n feature: '🆕',\n fix: '🐞',\n style: '💄',\n deprecation: '🗑',\n breaking: '🔥',\n other: '🛠',\n};\n\nfunction printChangelog(entries: ChangelogEntry[], format: string, versionArg?: string): void {\n if (format === 'json') {\n output(versionArg ? entries : { latest: entries }, 'json');\n return;\n }\n for (const entry of entries) {\n console.log(`## ${entry.version} (${entry.date})`);\n console.log('');\n for (const change of entry.changes) {\n const emoji = EMOJI_MAP[change.type] || '•';\n console.log(` ${emoji} ${change.component} ${change.description}`);\n }\n console.log('');\n }\n}\n\n// ── API diff logic ──\n\ninterface PropDiff {\n name: string;\n type?: string;\n replacement?: string;\n change?: string;\n}\n\ninterface ComponentDiff {\n component: string;\n added: PropDiff[];\n removed: PropDiff[];\n changed: PropDiff[];\n}\n\nfunction diffProps(\n oldProps: PropData[],\n newProps: PropData[],\n): { added: PropDiff[]; removed: PropDiff[]; changed: PropDiff[] } {\n const oldMap = new Map(oldProps.map((p) => [p.name, p]));\n const newMap = new Map(newProps.map((p) => [p.name, p]));\n\n const added: PropDiff[] = [];\n const removed: PropDiff[] = [];\n const changed: PropDiff[] = [];\n\n for (const [name, prop] of newMap) {\n if (!oldMap.has(name)) {\n added.push({ name, type: prop.type });\n } else {\n const oldProp = oldMap.get(name)!;\n if (oldProp.type !== prop.type) {\n changed.push({ name, change: `${oldProp.type} → ${prop.type}` });\n }\n }\n }\n\n for (const [name, prop] of oldMap) {\n if (!newMap.has(name)) {\n const possibleRename = [...newMap.values()].find(\n (p) => p.type === prop.type && !oldMap.has(p.name),\n );\n removed.push({ name, type: prop.type, replacement: possibleRename?.name });\n }\n }\n\n return { added, removed, changed };\n}\n\nfunction runApiDiff(\n v1: string,\n v2: string,\n component: string | undefined,\n opts: GlobalOptions,\n): void {\n const store1 = loadMetadataForVersion(v1);\n const store2 = loadMetadataForVersion(v2);\n\n if (store1.components.length === 0) {\n printError(createError(ErrorCodes.VERSION_NOT_FOUND, `No data available for version ${v1}`), opts.format);\n process.exitCode = 1;\n return;\n }\n if (store2.components.length === 0) {\n printError(createError(ErrorCodes.VERSION_NOT_FOUND, `No data available for version ${v2}`), opts.format);\n process.exitCode = 1;\n return;\n }\n\n const componentsToCompare: string[] = component\n ? [component]\n : [...new Set([...getAllComponentNames(store1), ...getAllComponentNames(store2)])];\n\n if (component) {\n const c1 = findComponent(store1, component);\n const c2 = findComponent(store2, component);\n if (!c1 && !c2) {\n const allNames = [...new Set([...getAllComponentNames(store1), ...getAllComponentNames(store2)])];\n const suggestion = fuzzyMatch(component, allNames);\n printError(\n createError(ErrorCodes.COMPONENT_NOT_FOUND, `Component '${component}' not found in either version`, suggestion ? `Did you mean '${suggestion}'?` : undefined),\n opts.format,\n );\n process.exitCode = 1;\n return;\n }\n }\n\n const diffs: ComponentDiff[] = [];\n for (const name of componentsToCompare) {\n const c1 = findComponent(store1, name);\n const c2 = findComponent(store2, name);\n\n if (!c1 && c2) {\n diffs.push({ component: name, added: c2.props.map((p) => ({ name: p.name, type: p.type })), removed: [], changed: [] });\n } else if (c1 && !c2) {\n diffs.push({ component: name, added: [], removed: c1.props.map((p) => ({ name: p.name, type: p.type })), changed: [] });\n } else if (c1 && c2) {\n const { added, removed, changed } = diffProps(c1.props, c2.props);\n if (added.length > 0 || removed.length > 0 || changed.length > 0) {\n diffs.push({ component: name, added, removed, changed });\n }\n }\n }\n\n if (opts.format === 'json') {\n const result = component && diffs.length > 0\n ? { from: v1, to: v2, ...diffs[0] }\n : { from: v1, to: v2, diffs };\n output(result, 'json');\n return;\n }\n\n if (diffs.length === 0) {\n console.log(`No API differences found between ${v1} and ${v2}.`);\n return;\n }\n\n console.log(`API Diff: ${v1} → ${v2}`);\n console.log('');\n for (const diff of diffs) {\n console.log(` ${diff.component}:`);\n for (const p of diff.added) console.log(` + ${p.name}: ${p.type}`);\n for (const p of diff.removed) {\n const note = p.replacement ? ` (replaced by ${p.replacement})` : '';\n console.log(` - ${p.name}: ${p.type}${note}`);\n }\n for (const p of diff.changed) console.log(` ~ ${p.name}: ${p.change}`);\n console.log('');\n }\n}\n\n// ── Command registration ──\n\nexport function registerChangelogCommand(program: Command): void {\n program\n .command('changelog [v1] [v2] [component]')\n .description('Query changelog or compare API differences between versions')\n .action((v1?: string, v2?: string, component?: string) => {\n const opts = program.opts<GlobalOptions>();\n\n // Determine mode:\n // antd changelog → latest changelog\n // antd changelog 5.21.0 → single version changelog\n // antd changelog 5.20.0..5.22.0 → version range changelog\n // antd changelog 5.20.0 5.22.0 → API diff between two versions\n // antd changelog 5.20.0 5.22.0 Btn → API diff for specific component\n\n const isChangelogMode = !v2 || (v1 && v1.includes('..'));\n\n if (isChangelogMode) {\n // Changelog mode — infer major version from the version argument if not explicitly overridden\n // For ranges like \"6.1.0..6.3.0\", extract the left-hand version to determine major\n // For ranges like \"5.20.0..5.22.0\", use the \"to\" version (right side) so we load\n // a snapshot that contains all entries up to that version.\n const v1ForDetect = v1?.includes('..') ? v1.split('..')[1] : v1;\n const versionForDetect = opts.version ?? (v1ForDetect && /^\\d+\\.\\d+\\.\\d+$/.test(v1ForDetect) ? v1ForDetect : undefined);\n const versionInfo = detectVersion(versionForDetect);\n const store = loadMetadataForVersion(versionInfo.version);\n const changelog = store.changelog || [];\n\n if (changelog.length === 0) {\n console.log('No changelog data available.');\n return;\n }\n\n const entries = filterEntries(changelog, v1);\n if (entries.length === 0) {\n const err = createError(\n ErrorCodes.VERSION_NOT_FOUND,\n `No changelog entries found for \"${v1}\"`,\n `Available versions: ${changelog.map((e) => e.version).join(', ')}`,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n printChangelog(entries, opts.format, v1);\n } else {\n // API diff mode — validate version order\n if (compare(v1!, v2!) > 0) {\n const err = createError(\n ErrorCodes.INVALID_ARGUMENT,\n `Version order is invalid: \"${v1}\" is newer than \"${v2}\"`,\n `Did you mean: antd changelog ${v2} ${v1}${component ? ' ' + component : ''}?`,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n runApiDiff(v1!, v2!, component, opts);\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { readFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { output } from '../output/formatter.js';\nimport { readJson } from '../utils/scan.js';\nimport { satisfies } from '../data/version.js';\n\ninterface CheckResult {\n name: string;\n status: 'pass' | 'warn' | 'fail';\n severity?: 'warning' | 'error';\n message: string;\n suggestion?: string;\n}\n\n/** Pre-read context shared across all checks to avoid repeated file I/O. */\ninterface DoctorContext {\n cwd: string;\n antdPkg: any | null;\n antdMajor: number;\n projectPkg: any | null;\n reactPkg: any | null;\n cssinjsPkg: any | null;\n iconsPkg: any | null;\n ecosystemPackages: EcosystemPackage[];\n}\n\ninterface EcosystemPackage {\n name: string; // e.g. \"@ant-design/pro-components\"\n shortName: string; // e.g. \"pro-components\"\n version: string;\n peerDependencies: Record<string, string>;\n peerDependenciesMeta: Record<string, { optional?: boolean }>;\n}\n\n/**\n * Read the installed version of a package from node_modules.\n * Returns null if not installed. Handles scoped packages (e.g. \"@ant-design/cssinjs\").\n */\nfunction getInstalledVersion(cwd: string, pkgName: string): string | null {\n const pkg = readJson(join(cwd, 'node_modules', pkgName, 'package.json'));\n return pkg?.version ?? null;\n}\n\n/**\n * Scan node_modules/@ant-design/ for all installed scoped packages that declare peerDependencies.\n * Packages with no peerDependencies are skipped (no check emitted for them).\n * Note: antd itself lives at node_modules/antd/, not here, so it will never appear in this scan.\n */\nfunction scanEcosystemPackages(cwd: string): EcosystemPackage[] {\n const scopeDir = join(cwd, 'node_modules', '@ant-design');\n let entries: string[];\n try {\n entries = readdirSync(scopeDir);\n } catch {\n return [];\n }\n\n const result: EcosystemPackage[] = [];\n for (const entry of entries) {\n if (entry.startsWith('.')) continue;\n const pkg = readJson(join(scopeDir, entry, 'package.json'));\n if (!pkg?.version) continue;\n const peerDeps: Record<string, string> = pkg.peerDependencies ?? {};\n if (Object.keys(peerDeps).length === 0) continue;\n result.push({\n name: `@ant-design/${entry}`,\n shortName: entry,\n version: pkg.version,\n peerDependencies: peerDeps,\n peerDependenciesMeta: pkg.peerDependenciesMeta ?? {},\n });\n }\n return result;\n}\n\nfunction buildContext(cwd: string): DoctorContext {\n const antdPkg = readJson(join(cwd, 'node_modules', 'antd', 'package.json'));\n const antdMajor = antdPkg ? parseInt(antdPkg.version.split('.')[0], 10) : 0;\n const projectPkg = readJson(join(cwd, 'package.json'));\n const reactPkg = readJson(join(cwd, 'node_modules', 'react', 'package.json'));\n const cssinjsPkg = readJson(join(cwd, 'node_modules', '@ant-design', 'cssinjs', 'package.json'));\n const iconsPkg = readJson(join(cwd, 'node_modules', '@ant-design', 'icons', 'package.json'));\n const ecosystemPackages = scanEcosystemPackages(cwd);\n return { cwd, antdPkg, antdMajor, projectPkg, reactPkg, cssinjsPkg, iconsPkg, ecosystemPackages };\n}\n\nfunction checkAntdInstalled(ctx: DoctorContext): CheckResult {\n if (!ctx.antdPkg) {\n return {\n name: 'antd-installed',\n status: 'fail',\n severity: 'error',\n message: 'antd is not installed in node_modules',\n suggestion: 'Run `npm install antd` or `yarn add antd`',\n };\n }\n return {\n name: 'antd-installed',\n status: 'pass',\n message: `antd ${ctx.antdPkg.version || 'unknown'} is installed`,\n };\n}\n\nfunction checkReactCompat(ctx: DoctorContext): CheckResult {\n if (!ctx.antdPkg || !ctx.reactPkg) {\n return {\n name: 'react-compat',\n status: 'warn',\n severity: 'warning',\n message: 'Cannot verify React compatibility — antd or react not found in node_modules',\n };\n }\n\n const reactMajor = parseInt(ctx.reactPkg.version.split('.')[0], 10);\n\n if (ctx.antdMajor >= 5 && reactMajor < 18) {\n return {\n name: 'react-compat',\n status: 'fail',\n severity: 'error',\n message: `React ${ctx.reactPkg.version} may not be compatible with antd ${ctx.antdPkg.version}`,\n suggestion: 'antd 5.x requires React 18+. Consider upgrading React.',\n };\n }\n\n return {\n name: 'react-compat',\n status: 'pass',\n message: `React ${ctx.reactPkg.version} is compatible with antd ${ctx.antdPkg.version}`,\n };\n}\n\n/**\n * Scans top-level node_modules and one level of nested node_modules for\n * installations of pkgPath (e.g. 'dayjs' or '@ant-design/cssinjs').\n * Returns a deduplicated array of distinct version strings found.\n * If the package is not installed anywhere, returns [].\n */\nfunction findDuplicateVersions(cwd: string, pkgPath: string): string[] {\n const versions: string[] = [];\n\n // 1. Top-level install\n const topPkg = readJson(join(cwd, 'node_modules', pkgPath, 'package.json'));\n if (topPkg?.version) versions.push(topPkg.version);\n\n // 2. One level of nesting: node_modules/*/node_modules/<pkgPath>\n const nmDir = join(cwd, 'node_modules');\n try {\n const entries = readdirSync(nmDir);\n for (const entry of entries) {\n if (entry.startsWith('.') || entry === pkgPath) continue;\n const nestedPkg = readJson(join(nmDir, entry, 'node_modules', pkgPath, 'package.json'));\n if (nestedPkg?.version) versions.push(nestedPkg.version);\n }\n } catch {\n // ignore read errors (e.g. node_modules doesn't exist)\n }\n\n // Deduplicate\n return [...new Set(versions)];\n}\n\nfunction checkDuplicateInstall(ctx: DoctorContext): CheckResult {\n const versions = findDuplicateVersions(ctx.cwd, 'antd');\n\n if (versions.length > 1) {\n return {\n name: 'duplicate-install',\n status: 'fail',\n severity: 'error',\n message: `Found ${versions.length} antd installations: ${versions.join(', ')}`,\n suggestion: 'Run `npm dedupe` or check your dependency tree',\n };\n }\n\n return {\n name: 'duplicate-install',\n status: 'pass',\n message: 'No duplicate antd installations detected',\n };\n}\n\nfunction checkThemeConfig(ctx: DoctorContext): CheckResult {\n if (ctx.antdMajor >= 5) {\n // Check for old Less variable customization (should not exist in v5+)\n const lessOverrides = readJson(join(ctx.cwd, 'theme', 'antd.less'));\n const modifyVars = ctx.projectPkg?.theme;\n if (lessOverrides !== null || modifyVars) {\n return {\n name: 'theme-config',\n status: 'warn',\n severity: 'warning',\n message: 'Found Less-based theme customization, but antd v5+ uses Design Tokens',\n suggestion: 'Migrate Less variables to ConfigProvider theme tokens. See https://ant.design/docs/react/migrate-less-variables',\n };\n }\n }\n\n return {\n name: 'theme-config',\n status: 'pass',\n message: 'No theme configuration issues detected',\n };\n}\n\nfunction checkBabelPlugins(ctx: DoctorContext): CheckResult {\n const babelConfigs = ['.babelrc', 'babel.config.js', 'babel.config.json'];\n\n let hasBabelPluginImport = false;\n\n for (const configName of babelConfigs) {\n try {\n const content = readFileSync(join(ctx.cwd, configName), 'utf-8');\n if (content.includes('babel-plugin-import') || content.includes('import, { libraryName')) {\n hasBabelPluginImport = true;\n break;\n }\n } catch { /* file doesn't exist or can't be read */ }\n }\n\n // Also check package.json babel config\n if (!hasBabelPluginImport && ctx.projectPkg?.babel) {\n const babelStr = JSON.stringify(ctx.projectPkg.babel);\n if (babelStr.includes('babel-plugin-import')) {\n hasBabelPluginImport = true;\n }\n }\n\n if (hasBabelPluginImport && ctx.antdMajor >= 5) {\n return {\n name: 'babel-plugin',\n status: 'warn',\n severity: 'warning',\n message: 'babel-plugin-import is configured but not needed for antd v5+',\n suggestion: 'antd v5+ supports tree-shaking natively. Remove babel-plugin-import for antd to reduce build complexity.',\n };\n }\n\n return {\n name: 'babel-plugin',\n status: 'pass',\n message: 'No problematic Babel/webpack antd plugins detected',\n };\n}\n\nfunction checkDayjsDuplicate(ctx: DoctorContext): CheckResult {\n const versions = findDuplicateVersions(ctx.cwd, 'dayjs');\n\n if (versions.length > 1) {\n return {\n name: 'dayjs-duplicate',\n status: 'fail',\n severity: 'error',\n message: `Found ${versions.length} dayjs installations: ${versions.join(', ')}`,\n suggestion: 'Run `npm dedupe` or check your monorepo hoisting config',\n };\n }\n\n return {\n name: 'dayjs-duplicate',\n status: 'pass',\n message: 'No duplicate dayjs installations detected',\n };\n}\n\nfunction checkCssinjsDuplicate(ctx: DoctorContext): CheckResult {\n const versions = findDuplicateVersions(ctx.cwd, '@ant-design/cssinjs');\n\n if (versions.length > 1) {\n return {\n name: 'cssinjs-duplicate',\n status: 'fail',\n severity: 'error',\n message: `Found ${versions.length} @ant-design/cssinjs installations: ${versions.join(', ')}`,\n suggestion: 'Run `npm dedupe` or check your monorepo hoisting config',\n };\n }\n\n return {\n name: 'cssinjs-duplicate',\n status: 'pass',\n message: 'No duplicate @ant-design/cssinjs installations detected',\n };\n}\n\nfunction checkCssinjsCompat(ctx: DoctorContext): CheckResult {\n const range = ctx.antdPkg?.peerDependencies?.['@ant-design/cssinjs'];\n\n if (!ctx.antdPkg || !range) {\n return {\n name: 'cssinjs-compat',\n status: 'pass',\n message: 'No @ant-design/cssinjs peer dependency required by this antd version',\n };\n }\n\n if (!ctx.cssinjsPkg) {\n return {\n name: 'cssinjs-compat',\n status: 'warn',\n severity: 'warning',\n message: `antd ${ctx.antdPkg.version} requires @ant-design/cssinjs but it is not installed`,\n suggestion: 'Run `npm install @ant-design/cssinjs`',\n };\n }\n\n if (!satisfies(ctx.cssinjsPkg.version, range)) {\n return {\n name: 'cssinjs-compat',\n status: 'fail',\n severity: 'error',\n message: `@ant-design/cssinjs ${ctx.cssinjsPkg.version} is not compatible with antd ${ctx.antdPkg.version} (requires ${range})`,\n suggestion: `Run \\`npm install @ant-design/cssinjs\\` (requires ${range})`,\n };\n }\n\n return {\n name: 'cssinjs-compat',\n status: 'pass',\n message: `@ant-design/cssinjs ${ctx.cssinjsPkg.version} is compatible with antd ${ctx.antdPkg.version}`,\n };\n}\n\nfunction checkIconsCompat(ctx: DoctorContext): CheckResult {\n const range = ctx.antdPkg?.peerDependencies?.['@ant-design/icons'];\n\n if (!ctx.antdPkg || !range) {\n return {\n name: 'icons-compat',\n status: 'pass',\n message: 'No @ant-design/icons peer dependency declared',\n };\n }\n\n if (!ctx.iconsPkg) {\n return {\n name: 'icons-compat',\n status: 'pass',\n message: '@ant-design/icons is not installed (optional)',\n };\n }\n\n if (!satisfies(ctx.iconsPkg.version, range)) {\n return {\n name: 'icons-compat',\n status: 'warn',\n severity: 'warning',\n message: `@ant-design/icons ${ctx.iconsPkg.version} may not be compatible with antd ${ctx.antdPkg.version} (requires ${range})`,\n suggestion: `Run \\`npm install @ant-design/icons\\` (requires ${range})`,\n };\n }\n\n return {\n name: 'icons-compat',\n status: 'pass',\n message: `@ant-design/icons ${ctx.iconsPkg.version} is compatible with antd ${ctx.antdPkg.version}`,\n };\n}\n\nfunction checkCssInJs(ctx: DoctorContext): CheckResult {\n if (!ctx.cssinjsPkg) {\n return {\n name: 'cssinjs',\n status: 'warn',\n severity: 'warning',\n message: 'No @ant-design/cssinjs found, SSR style extraction will not work',\n suggestion: 'Install @ant-design/cssinjs if you need SSR support',\n };\n }\n return {\n name: 'cssinjs',\n status: 'pass',\n message: '@ant-design/cssinjs is installed',\n };\n}\n\nfunction checkEcosystemPeerDeps(ctx: DoctorContext): CheckResult[] {\n return ctx.ecosystemPackages.map((pkg) => {\n const failures: string[] = []; // installed but version doesn't satisfy range\n const warnings: string[] = []; // not installed at all\n const failureSuggestions: string[] = [];\n const warningSuggestions: string[] = [];\n\n for (const [dep, range] of Object.entries(pkg.peerDependencies)) {\n const installedVersion = getInstalledVersion(ctx.cwd, dep);\n\n if (installedVersion === null) {\n warnings.push(`${dep} is not installed (requires ${range})`);\n warningSuggestions.push(dep);\n } else if (!satisfies(installedVersion, range)) {\n failures.push(`${dep} requires ${range} (installed: ${installedVersion})`);\n failureSuggestions.push(`npm install ${dep}@\"${range}\"`);\n }\n }\n\n if (failures.length > 0) {\n const allIssues = [...failures, ...warnings].join('; ');\n const suggestionCmds = [...failureSuggestions];\n if (warningSuggestions.length > 0) {\n suggestionCmds.push(`npm install ${warningSuggestions.join(' ')}`);\n }\n return {\n name: `ecosystem-compat:${pkg.shortName}`,\n status: 'fail' as const,\n severity: 'error' as const,\n message: `${pkg.name} ${pkg.version} peerDep issues: ${allIssues}`,\n suggestion: `Run: ${suggestionCmds.join(' && ')}`,\n };\n }\n\n if (warnings.length > 0) {\n return {\n name: `ecosystem-compat:${pkg.shortName}`,\n status: 'warn' as const,\n severity: 'warning' as const,\n message: `${pkg.name} ${pkg.version} peerDep issues: ${warnings.join('; ')}`,\n suggestion: `Run \\`npm install ${warningSuggestions.join(' ')}\\``,\n };\n }\n\n return {\n name: `ecosystem-compat:${pkg.shortName}`,\n status: 'pass' as const,\n message: `${pkg.name} ${pkg.version} satisfies all peerDependencies`,\n };\n });\n}\n\nexport function registerDoctorCommand(program: Command): void {\n program\n .command('doctor')\n .description('Diagnose project-level antd configuration issues')\n .action(() => {\n const opts = program.opts<GlobalOptions>();\n const ctx = buildContext(process.cwd());\n\n const checks: CheckResult[] = [\n checkAntdInstalled(ctx),\n checkReactCompat(ctx),\n checkDuplicateInstall(ctx),\n checkDayjsDuplicate(ctx),\n checkCssinjsDuplicate(ctx),\n checkCssinjsCompat(ctx),\n checkIconsCompat(ctx),\n checkThemeConfig(ctx),\n checkBabelPlugins(ctx),\n checkCssInJs(ctx),\n ...checkEcosystemPeerDeps(ctx),\n ];\n\n const summary = {\n pass: checks.filter((c) => c.status === 'pass').length,\n warn: checks.filter((c) => c.status === 'warn').length,\n fail: checks.filter((c) => c.status === 'fail').length,\n };\n\n if (opts.format === 'json') {\n output({ checks, summary }, 'json');\n return;\n }\n\n const ICONS = { pass: '✓', warn: '⚠', fail: '✗' };\n console.log('antd Doctor\\n');\n\n for (const check of checks) {\n const icon = ICONS[check.status];\n console.log(` ${icon} [${check.name}] ${check.message}`);\n if (check.suggestion) {\n console.log(` → ${check.suggestion}`);\n }\n }\n\n console.log('');\n console.log(`Summary: ${summary.pass} passed, ${summary.warn} warnings, ${summary.fail} failed`);\n });\n}\n","import { readFileSync, readdirSync, statSync } from 'node:fs';\nimport { join, extname } from 'node:path';\n\nexport const SCAN_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx']);\nexport const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'build', '.next']);\n\n/** Match: import { Button, Form } from 'antd' or 'antd/es/...' */\nexport const ANTD_IMPORT_RE = /import\\s+\\{([^}]+)\\}\\s+from\\s+['\"]antd(?:\\/[^'\"]*)?['\"]/g;\n\n/**\n * Recursively collect source files from a directory or return a single file.\n */\nexport function collectFiles(dir: string): string[] {\n const files: string[] = [];\n try {\n const stat = statSync(dir);\n if (stat.isFile()) return [dir];\n } catch {\n return [];\n }\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name.startsWith('.umi') || SKIP_DIRS.has(entry.name)) continue;\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...collectFiles(fullPath));\n } else if (SCAN_EXTENSIONS.has(extname(entry.name))) {\n files.push(fullPath);\n }\n }\n } catch {\n // ignore permission errors etc\n }\n return files;\n}\n\n/**\n * Extract antd component names from import statements in source code.\n */\nexport function parseAntdImports(content: string): string[] {\n const names: string[] = [];\n ANTD_IMPORT_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = ANTD_IMPORT_RE.exec(content)) !== null) {\n const parsed = match[1].split(',')\n .map((n) => n.trim())\n .filter((n) => Boolean(n) && !/^type\\s/.test(n));\n names.push(...parsed);\n }\n return names;\n}\n\n/**\n * Read and parse a JSON file, returning null on failure.\n */\nexport function readJson(path: string): any | null {\n try {\n return JSON.parse(readFileSync(path, 'utf-8'));\n } catch {\n return null;\n }\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { readFileSync } from 'node:fs';\nimport { output } from '../output/formatter.js';\nimport { collectFiles, parseAntdImports } from '../utils/scan.js';\nimport { loadMetadataForVersion } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\n\ninterface ComponentUsage {\n name: string;\n imports: number;\n files: string[];\n subComponents?: Record<string, number>;\n}\n\n// Match: Form.Item, Table.Column etc\nconst SUB_COMPONENT_RE = /\\b(\\w+)\\.(\\w+)\\b/g;\n\nfunction scanFile(filePath: string): Map<string, { count: number; subComponents: Map<string, number> }> {\n const result = new Map<string, { count: number; subComponents: Map<string, number> }>();\n\n let content: string;\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch {\n return result;\n }\n\n const importedNames = parseAntdImports(content);\n\n for (const name of importedNames) {\n if (!result.has(name)) {\n result.set(name, { count: 0, subComponents: new Map() });\n }\n result.get(name)!.count++;\n }\n\n // Find sub-component usage (e.g. Form.Item) — only count capitalized children\n // to exclude method/hook calls like Form.useForm, Modal.confirm, App.useApp\n SUB_COMPONENT_RE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = SUB_COMPONENT_RE.exec(content)) !== null) {\n const [, parent, child] = match;\n if (importedNames.includes(parent) && /^[A-Z]/.test(child)) {\n const entry = result.get(parent)!;\n const subKey = `${parent}.${child}`;\n entry.subComponents.set(subKey, (entry.subComponents.get(subKey) || 0) + 1);\n }\n }\n\n return result;\n}\n\nexport function registerUsageCommand(program: Command): void {\n program\n .command('usage [dir]')\n .description('Scan project for antd component/API usage statistics')\n .option('-f, --filter <component>', 'Filter results to a specific component (e.g. Button)')\n .action((dir?: string, cmdOpts?: { filter?: string }) => {\n const opts = program.opts<GlobalOptions>();\n const targetDir = dir || '.';\n const filterName = cmdOpts?.filter?.toLowerCase();\n\n const versionInfo = detectVersion(opts.version);\n const store = loadMetadataForVersion(versionInfo.version);\n const knownComponents = new Set(store.components.map((c) => c.name));\n // Also include sub-component leaf names that are directly importable\n // (e.g. Row, Col from Grid.Row, Grid.Col)\n for (const comp of store.components) {\n for (const subKey of Object.keys(comp.subComponentProps ?? {})) {\n const leaf = subKey.split('.').pop();\n if (leaf) knownComponents.add(leaf);\n }\n }\n\n const files = collectFiles(targetDir);\n const aggregated = new Map<string, { imports: number; files: Set<string>; subComponents: Map<string, number> }>();\n\n for (const file of files) {\n const fileUsage = scanFile(file);\n for (const [name, data] of fileUsage) {\n if (!aggregated.has(name)) {\n aggregated.set(name, { imports: 0, files: new Set(), subComponents: new Map() });\n }\n const agg = aggregated.get(name)!;\n agg.imports += data.count;\n agg.files.add(file);\n for (const [sub, count] of data.subComponents) {\n agg.subComponents.set(sub, (agg.subComponents.get(sub) || 0) + count);\n }\n }\n }\n\n const toUsage = ([name, data]: [string, { imports: number; files: Set<string>; subComponents: Map<string, number> }]): ComponentUsage => {\n const usage: ComponentUsage = {\n name,\n imports: data.imports,\n files: [...data.files],\n };\n if (data.subComponents.size > 0) {\n usage.subComponents = Object.fromEntries(data.subComponents);\n }\n return usage;\n };\n\n const allEntries = [...aggregated.entries()]\n .filter(([name]) => !filterName || name.toLowerCase() === filterName)\n .sort((a, b) => b[1].imports - a[1].imports);\n\n const components: ComponentUsage[] = allEntries\n .filter(([name]) => knownComponents.has(name))\n .map(toUsage);\n\n const nonComponents: ComponentUsage[] = allEntries\n .filter(([name]) => !knownComponents.has(name))\n .map(toUsage);\n\n const totalImports = components.reduce((sum, c) => sum + c.imports, 0);\n\n if (opts.format === 'json') {\n output({\n scanned: files.length,\n components,\n nonComponents,\n summary: { totalComponents: components.length, totalImports },\n }, 'json');\n return;\n }\n\n console.log(`Scanned ${files.length} files in ${targetDir}\\n`);\n\n if (components.length === 0 && nonComponents.length === 0) {\n console.log('No antd imports found.');\n return;\n }\n\n if (components.length > 0) {\n for (const comp of components) {\n console.log(` ${comp.name} — ${comp.imports} imports across ${comp.files.length} files`);\n if (comp.subComponents) {\n for (const [sub, count] of Object.entries(comp.subComponents)) {\n console.log(` ${sub}: ${count} usages`);\n }\n }\n }\n console.log(`\\nTotal: ${components.length} components, ${totalImports} imports`);\n }\n\n if (nonComponents.length > 0) {\n console.log(`\\nNon-component antd exports (${nonComponents.length}):`);\n for (const item of nonComponents) {\n console.log(` ${item.name} — ${item.imports} imports across ${item.files.length} files`);\n }\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { readFileSync } from 'node:fs';\nimport { loadMetadataForVersion } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { output } from '../output/formatter.js';\nimport { collectFiles, parseAntdImports } from '../utils/scan.js';\n\ninterface LintIssue {\n file: string;\n line: number;\n rule: string;\n severity: 'warning' | 'error';\n message: string;\n}\n\n/** Escape special RegExp characters in a string. */\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n// Build a map of deprecated props from metadata\nfunction getDeprecatedProps(store: ReturnType<typeof loadMetadataForVersion>): Map<string, { prop: string; since: string; message: string }[]> {\n const result = new Map<string, { prop: string; since: string; message: string }[]>();\n for (const comp of store.components) {\n const deprecated = comp.props.filter((p) => p.deprecated);\n if (deprecated.length > 0) {\n result.set(comp.name, deprecated.map((p) => {\n const sinceStr = typeof p.deprecated === 'string' ? ` (since ${p.deprecated})` : '';\n // Use description directly as it contains replacement info like \"use X instead\"\n const desc = p.description ? `. ${p.description}` : '';\n return {\n prop: p.name,\n since: typeof p.deprecated === 'string' ? p.deprecated : 'unknown',\n message: `\\`${p.name}\\` is deprecated${sinceStr}${desc}`,\n };\n }));\n }\n }\n return result;\n}\n\n/** Check if a pattern exists within `lookahead` lines starting from index `i`. */\nfunction hasNearbyMatch(lines: string[], i: number, lookahead: number, pattern: RegExp): boolean {\n const end = Math.min(i + lookahead, lines.length);\n for (let j = i; j < end; j++) {\n if (pattern.test(lines[j])) return true;\n }\n return false;\n}\n\nfunction lintFile(\n filePath: string,\n deprecatedMap: Map<string, { prop: string; since: string; message: string }[]>,\n only?: string,\n): LintIssue[] {\n const issues: LintIssue[] = [];\n let content: string;\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch {\n return [];\n }\n\n const lines = content.split('\\n');\n const importedComponents = parseAntdImports(content);\n\n if (importedComponents.length === 0) return [];\n\n // Build per-component deprecated prop regexes once\n const deprecatedChecks: { compName: string; dep: { prop: string; since: string; message: string }; regex: RegExp }[] = [];\n if (!only || only === 'deprecated') {\n for (const compName of importedComponents) {\n const deprecations = deprecatedMap.get(compName);\n if (!deprecations) continue;\n for (const dep of deprecations) {\n deprecatedChecks.push({ compName, dep, regex: new RegExp(`\\\\b${escapeRegExp(dep.prop)}\\\\b\\\\s*[=({]`) });\n }\n }\n }\n\n const hasImage = importedComponents.includes('Image');\n const hasSelect = importedComponents.includes('Select') || importedComponents.includes('TreeSelect');\n const hasButton = importedComponents.includes('Button');\n const hasCheckbox = importedComponents.includes('Checkbox');\n const hasDivider = importedComponents.includes('Divider');\n const hasMenu = importedComponents.includes('Menu');\n const hasQRCode = importedComponents.includes('QRCode');\n const hasRadio = importedComponents.includes('Radio');\n const hasTreeSelect = importedComponents.includes('TreeSelect');\n const hasTypography = importedComponents.includes('Typography');\n\n // Single pass over all lines\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // Deprecated prop checks\n for (const { compName, dep, regex } of deprecatedChecks) {\n if (regex.test(line)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'deprecated',\n severity: 'warning',\n message: `${compName} ${dep.message}`,\n });\n }\n }\n\n // Deprecated component checks\n if (!only || only === 'deprecated') {\n if (/<BackTop\\b/.test(line)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'deprecated',\n severity: 'warning',\n message: '`BackTop` is deprecated, use `FloatButton.BackTop` instead',\n });\n }\n\n if (hasButton && /<Button\\.Group\\b/.test(line)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'deprecated',\n severity: 'warning',\n message: '`Button.Group` is deprecated, use `Space.Compact` instead',\n });\n }\n\n if (/<Input\\.Group\\b/.test(line)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'deprecated',\n severity: 'warning',\n message: '`Input.Group` is deprecated, use `Space.Compact` instead',\n });\n }\n }\n\n // Accessibility checks\n if (!only || only === 'a11y') {\n if (hasImage && /<Image\\b/.test(line) && !hasNearbyMatch(lines, i, 5, /alt\\s*=/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'a11y',\n severity: 'warning',\n message: 'Image component is missing `alt` prop for accessibility',\n });\n }\n\n if (/<\\w+Icon\\b/.test(line) && /onClick\\s*=/.test(line) && !hasNearbyMatch(lines, i, 3, /aria-label\\s*=/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'a11y',\n severity: 'warning',\n message: 'Clickable icon should have `aria-label` for screen readers',\n });\n }\n }\n\n // Usage checks (prop combination mistakes)\n if (!only || only === 'usage') {\n // Form.Item: shouldUpdate and dependencies should not be used together\n if (/Form\\.Item\\b/.test(line)) {\n if (hasNearbyMatch(lines, i, 10, /shouldUpdate\\s*[=]/) && hasNearbyMatch(lines, i, 10, /dependencies\\s*[=]/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'usage',\n severity: 'warning',\n message: '`shouldUpdate` and `dependencies` should not be used together on Form.Item',\n });\n }\n }\n\n // Button: ghost cannot be used with type=\"link\" or type=\"text\"\n if (hasButton && /<Button\\b/.test(line)) {\n if (hasNearbyMatch(lines, i, 5, /\\bghost\\b/) &&\n hasNearbyMatch(lines, i, 5, /type\\s*=\\s*['\"{](?:link|text)['\"}\\s]/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'usage',\n severity: 'warning',\n message: 'Button `ghost` prop cannot be used with `type=\"link\"` or `type=\"text\"`',\n });\n }\n }\n\n // Checkbox: value is not a valid prop, did you mean checked?\n if (hasCheckbox && /<Checkbox\\b/.test(line) && !/Checkbox\\.Group/.test(line)) {\n if (hasNearbyMatch(lines, i, 5, /\\bvalue\\s*=/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'usage',\n severity: 'warning',\n message: 'Checkbox `value` is not a valid prop outside Checkbox.Group, did you mean `checked`?',\n });\n }\n }\n\n // Divider: children not working in vertical mode\n if (hasDivider && /<Divider\\b/.test(line)) {\n if (hasNearbyMatch(lines, i, 5, /type\\s*=\\s*['\"{]vertical['\"}]/) &&\n (!hasNearbyMatch(lines, i, 3, /\\/>/) || hasNearbyMatch(lines, i, 5, /\\bchildren\\s*=/))) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'usage',\n severity: 'warning',\n message: 'Divider `children` are not supported in `type=\"vertical\"` mode',\n });\n }\n }\n\n // Select: maxCount only works with mode=\"multiple\" or mode=\"tags\"\n if (hasSelect && /<Select\\b/.test(line)) {\n if (hasNearbyMatch(lines, i, 10, /maxCount\\s*=/) &&\n !hasNearbyMatch(lines, i, 10, /mode\\s*=\\s*['\"{](?:multiple|tags)['\"}]/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'usage',\n severity: 'warning',\n message: 'Select `maxCount` only works with `mode=\"multiple\"` or `mode=\"tags\"`',\n });\n }\n }\n\n // Menu: inlineCollapsed should only be used when mode is inline\n if (hasMenu && /<Menu\\b/.test(line)) {\n if (hasNearbyMatch(lines, i, 10, /inlineCollapsed\\s*=/) &&\n !hasNearbyMatch(lines, i, 10, /mode\\s*=\\s*['\"{]inline['\"}]/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'usage',\n severity: 'warning',\n message: 'Menu `inlineCollapsed` should only be used with `mode=\"inline\"`',\n });\n }\n }\n\n // QRCode: missing value prop\n if (hasQRCode && /<QRCode\\b/.test(line) && !hasNearbyMatch(lines, i, 10, /\\bvalue\\s*=/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'usage',\n severity: 'warning',\n message: 'QRCode is missing required `value` prop',\n });\n }\n\n // Typography.Link: ellipsis only supports boolean\n if (hasTypography && /<Typography\\.Link\\b/.test(line)) {\n if (hasNearbyMatch(lines, i, 5, /ellipsis\\s*=\\s*\\{\\{/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'usage',\n severity: 'warning',\n message: 'Typography.Link `ellipsis` only supports boolean value, not object config',\n });\n }\n }\n\n // Typography.Text: ellipsis does not support expandable or rows\n if (hasTypography && /<Typography\\.Text\\b/.test(line)) {\n if (hasNearbyMatch(lines, i, 10, /ellipsis\\s*=\\s*\\{\\{/) &&\n hasNearbyMatch(lines, i, 10, /\\b(?:expandable|rows)\\s*[=:]/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'usage',\n severity: 'warning',\n message: 'Typography.Text `ellipsis` does not support `expandable` or `rows`',\n });\n }\n }\n\n // Radio: optionType is only supported on Radio.Group\n if (hasRadio && /<Radio\\b/.test(line) && !/<Radio\\.Group\\b/.test(line)) {\n if (hasNearbyMatch(lines, i, 5, /optionType\\s*=/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'usage',\n severity: 'warning',\n message: '`optionType` is only supported on Radio.Group, not Radio',\n });\n }\n }\n\n // TreeSelect: multiple={false} is ignored when treeCheckable is true\n if (hasTreeSelect && /<TreeSelect\\b/.test(line)) {\n if (hasNearbyMatch(lines, i, 10, /multiple\\s*=\\s*\\{?\\s*false/) &&\n hasNearbyMatch(lines, i, 10, /treeCheckable\\b/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'usage',\n severity: 'warning',\n message: 'TreeSelect `multiple={false}` is ignored when `treeCheckable` is true',\n });\n }\n }\n }\n\n // Performance checks\n if (!only || only === 'performance') {\n if (hasSelect && /<(?:Select|TreeSelect)\\b/.test(line) && hasNearbyMatch(lines, i, 10, /virtual\\s*=\\s*\\{?\\s*false/)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'performance',\n severity: 'warning',\n message: 'Disabling `virtual` scroll on Select may cause performance issues with large datasets',\n });\n }\n\n if (/import\\s+antd\\b/.test(line) || /import\\s+\\*\\s+as\\s+\\w+\\s+from\\s+['\"]antd['\"]/.test(line)) {\n issues.push({\n file: filePath,\n line: i + 1,\n rule: 'performance',\n severity: 'error',\n message: 'Avoid wildcard import from antd. Use named imports: `import { Button } from \\'antd\\'`',\n });\n }\n }\n }\n\n return issues;\n}\n\nexport function registerLintCommand(program: Command): void {\n program\n .command('lint [target]')\n .description('Check antd usage against best practices')\n .option('--only <category>', 'Only check specific category (deprecated, a11y, usage, performance)')\n .action((target: string | undefined, cmdOpts: { only?: string }) => {\n const opts = program.opts<GlobalOptions>();\n const targetPath = target || '.';\n const versionInfo = detectVersion(opts.version);\n const store = loadMetadataForVersion(versionInfo.version);\n const deprecatedMap = getDeprecatedProps(store);\n\n const files = collectFiles(targetPath);\n const allIssues: LintIssue[] = [];\n\n for (const file of files) {\n allIssues.push(...lintFile(file, deprecatedMap, cmdOpts.only));\n }\n\n const summary = {\n total: allIssues.length,\n deprecated: allIssues.filter((i) => i.rule === 'deprecated').length,\n a11y: allIssues.filter((i) => i.rule === 'a11y').length,\n usage: allIssues.filter((i) => i.rule === 'usage').length,\n performance: allIssues.filter((i) => i.rule === 'performance').length,\n };\n\n if (opts.format === 'json') {\n output({ issues: allIssues, summary }, 'json');\n return;\n }\n\n if (allIssues.length === 0) {\n console.log(`Scanned ${files.length} files. No issues found.`);\n return;\n }\n\n console.log(`Scanned ${files.length} files. Found ${allIssues.length} issues:\\n`);\n\n for (const issue of allIssues) {\n const icon = issue.severity === 'error' ? '✗' : '⚠';\n console.log(` ${icon} ${issue.file}:${issue.line} [${issue.rule}]`);\n console.log(` ${issue.message}`);\n }\n\n console.log(`\\nSummary: ${summary.deprecated} deprecated, ${summary.a11y} a11y, ${summary.usage} usage, ${summary.performance} performance`);\n });\n}\n","import type { MigrationStep } from './migrate.js';\n\nexport const V4_TO_V5_STEPS: MigrationStep[] = [\n // Global changes\n {\n component: 'Global',\n breaking: true,\n description: 'Design token system replaces Less variables. All Less variable overrides must be migrated to CSS-in-JS tokens via ConfigProvider.',\n autoFixable: false,\n guide: 'https://ant.design/docs/react/migrate-less-variables',\n migrationGuide: `1. Remove all Less variable overrides (modifyVars, less-loader theme config)\n2. Wrap your app with ConfigProvider and pass a theme object\n3. Map Less variables to Design Tokens (e.g. @primary-color → token.colorPrimary)\n4. Remove babel-plugin-import if present (v5 supports tree-shaking natively)`,\n before: `// webpack.config.js or .umirc.ts\ntheme: { '@primary-color': '#1890ff' }\n\n// or .less file\n@import '~antd/dist/antd.less';\n@primary-color: #1890ff;`,\n after: `import { ConfigProvider } from 'antd';\n<ConfigProvider theme={{ token: { colorPrimary: '#1890ff' } }}>\n <App />\n</ConfigProvider>`,\n },\n {\n component: 'Global',\n breaking: true,\n description: 'Component styles no longer include CSS reset. Wrap app with <App /> component to restore.',\n autoFixable: false,\n guide: 'https://ant.design/components/app',\n searchPattern: `import\\\\s*\\\\{[^}]*\\\\}\\\\s*from\\\\s*['\"]antd['\"]`,\n migrationGuide: `1. Import App component from antd\n2. Wrap your root component with <App />\n3. Use App.useApp() hook to access message, notification, modal instances`,\n before: `import { Button } from 'antd';\n\nconst MyApp = () => <Button>Click</Button>;`,\n after: `import { App, Button } from 'antd';\n\nconst MyApp = () => (\n <App>\n <Button>Click</Button>\n </App>\n);`,\n },\n {\n component: 'Global',\n breaking: true,\n description: 'Moment.js replaced by Day.js. All date-related components (DatePicker, TimePicker, Calendar) now use Day.js.',\n autoFixable: true,\n codemod: 'v5-removed-component-migration',\n searchPattern: `import\\\\s+moment\\\\s+from\\\\s+['\"]moment['\"]`,\n migrationGuide: `1. Replace moment imports with dayjs\n2. dayjs API is mostly compatible with moment\n3. If you need locale support, import dayjs locale separately\n4. If you need plugins (isBetween, etc.), import and extend dayjs`,\n before: `import moment from 'moment';\n<DatePicker value={moment('2024-01-01')} />`,\n after: `import dayjs from 'dayjs';\n<DatePicker value={dayjs('2024-01-01')} />`,\n },\n {\n component: 'Global',\n breaking: true,\n description: 'babel-plugin-import is no longer needed. antd v5 supports tree-shaking natively.',\n autoFixable: false,\n searchPattern: `babel-plugin-import`,\n migrationGuide: `1. Remove babel-plugin-import from babel config\n2. Remove related configuration in .babelrc, babel.config.js, or package.json\n3. Direct imports like \\`import { Button } from 'antd'\\` work without the plugin`,\n },\n {\n component: 'Global',\n breaking: true,\n description: '`antd/dist/antd.css` and `antd/dist/antd.less` removed. CSS-in-JS generates styles automatically.',\n autoFixable: true,\n codemod: 'v5-removed-component-migration',\n searchPattern: `import\\\\s+['\"]antd/dist/antd\\\\.(css|less)['\"]`,\n migrationGuide: `Remove the global CSS/Less import. Styles are now injected via CSS-in-JS automatically.`,\n before: `import 'antd/dist/antd.css';\n// or\nimport 'antd/dist/antd.less';`,\n after: `// No global import needed — styles are auto-injected`,\n },\n\n // Prop renames (visible → open)\n {\n component: 'Modal',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Modal[^>]*\\\\bvisible\\\\b`,\n before: `<Modal visible={show} onCancel={onClose}>`,\n after: `<Modal open={show} onCancel={onClose}>`,\n migrationGuide: `Search for \\`<Modal\\` with \\`visible\\` prop and rename to \\`open\\`. Also applies to Modal.confirm, Modal.info, etc.`,\n },\n {\n component: 'Drawer',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Drawer[^>]*\\\\bvisible\\\\b`,\n before: `<Drawer visible={show} onClose={onClose}>`,\n after: `<Drawer open={show} onClose={onClose}>`,\n },\n {\n component: 'Tooltip',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Tooltip[^>]*\\\\bvisible\\\\b`,\n before: `<Tooltip visible={show}>`,\n after: `<Tooltip open={show}>`,\n },\n {\n component: 'Popover',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Popover[^>]*\\\\bvisible\\\\b`,\n before: `<Popover visible={show}>`,\n after: `<Popover open={show}>`,\n },\n {\n component: 'Popconfirm',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Popconfirm[^>]*\\\\bvisible\\\\b`,\n before: `<Popconfirm visible={show}>`,\n after: `<Popconfirm open={show}>`,\n },\n {\n component: 'Dropdown',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Dropdown[^>]*\\\\bvisible\\\\b`,\n before: `<Dropdown visible={show}>`,\n after: `<Dropdown open={show}>`,\n },\n {\n component: 'Tag',\n breaking: true,\n description: 'Prop `visible` removed. Use conditional rendering instead.',\n autoFixable: false,\n searchPattern: `<Tag[^>]*\\\\bvisible\\\\b`,\n before: `<Tag visible={show}>Tag</Tag>`,\n after: `{show && <Tag>Tag</Tag>}`,\n migrationGuide: `Replace \\`visible\\` prop with conditional rendering using \\`{condition && <Tag>...</Tag>}\\`.`,\n },\n\n // dropdownClassName → popupClassName\n {\n component: 'Select',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Select[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<Select dropdownClassName=\"my-dropdown\" />`,\n after: `<Select popupClassName=\"my-dropdown\" />`,\n },\n {\n component: 'Select',\n breaking: true,\n description: 'Prop `dropdownMatchSelectWidth` renamed to `popupMatchSelectWidth`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Select[^>]*\\\\bdropdownMatchSelectWidth\\\\b`,\n before: `<Select dropdownMatchSelectWidth={false} />`,\n after: `<Select popupMatchSelectWidth={false} />`,\n },\n {\n component: 'TreeSelect',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<TreeSelect[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<TreeSelect dropdownClassName=\"my-dropdown\" />`,\n after: `<TreeSelect popupClassName=\"my-dropdown\" />`,\n },\n {\n component: 'Cascader',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Cascader[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<Cascader dropdownClassName=\"my-dropdown\" />`,\n after: `<Cascader popupClassName=\"my-dropdown\" />`,\n },\n {\n component: 'AutoComplete',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<AutoComplete[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<AutoComplete dropdownClassName=\"my-dropdown\" />`,\n after: `<AutoComplete popupClassName=\"my-dropdown\" />`,\n },\n {\n component: 'DatePicker',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<DatePicker[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<DatePicker dropdownClassName=\"my-popup\" />`,\n after: `<DatePicker popupClassName=\"my-popup\" />`,\n },\n {\n component: 'TimePicker',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<TimePicker[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<TimePicker dropdownClassName=\"my-popup\" />`,\n after: `<TimePicker popupClassName=\"my-popup\" />`,\n },\n {\n component: 'Mentions',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Mentions[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<Mentions dropdownClassName=\"my-dropdown\" />`,\n after: `<Mentions popupClassName=\"my-dropdown\" />`,\n },\n\n // Removed components\n {\n component: 'Comment',\n breaking: true,\n description: 'Removed from antd. Use @ant-design/compatible instead.',\n autoFixable: false,\n guide: 'https://ant.design/docs/react/migration-v5',\n searchPattern: `import\\\\s*\\\\{[^}]*\\\\bComment\\\\b[^}]*\\\\}\\\\s*from\\\\s*['\"]antd['\"]`,\n migrationGuide: `1. Install @ant-design/compatible: npm install @ant-design/compatible\n2. Change import from 'antd' to '@ant-design/compatible'`,\n before: `import { Comment } from 'antd';`,\n after: `import { Comment } from '@ant-design/compatible';`,\n },\n {\n component: 'PageHeader',\n breaking: true,\n description: 'Removed from antd. Use @ant-design/pro-components instead.',\n autoFixable: false,\n guide: 'https://ant.design/docs/react/migration-v5',\n searchPattern: `import\\\\s*\\\\{[^}]*\\\\bPageHeader\\\\b[^}]*\\\\}\\\\s*from\\\\s*['\"]antd['\"]`,\n migrationGuide: `1. Install @ant-design/pro-components: npm install @ant-design/pro-components\n2. Change import from 'antd' to '@ant-design/pro-components'`,\n before: `import { PageHeader } from 'antd';`,\n after: `import { PageHeader } from '@ant-design/pro-components';`,\n },\n {\n component: 'BackTop',\n breaking: true,\n description: 'Removed. Use FloatButton.BackTop instead.',\n autoFixable: true,\n codemod: 'v5-removed-component-migration',\n searchPattern: `import\\\\s*\\\\{[^}]*\\\\bBackTop\\\\b[^}]*\\\\}\\\\s*from\\\\s*['\"]antd['\"]`,\n before: `import { BackTop } from 'antd';\n<BackTop />`,\n after: `import { FloatButton } from 'antd';\n<FloatButton.BackTop />`,\n },\n\n // API changes\n {\n component: 'message',\n breaking: true,\n description: 'Static methods `message.xxx()` deprecated. Use `App.useApp()` hook instead for context support.',\n autoFixable: false,\n searchPattern: `\\\\bmessage\\\\.(success|error|warning|info|loading|open)\\\\(`,\n migrationGuide: `1. Wrap app with <App /> component\n2. Use const { message } = App.useApp(); in functional components\n3. Replace static message.xxx() calls with the hook-provided instance`,\n before: `import { message } from 'antd';\nmessage.success('Done!');`,\n after: `import { App } from 'antd';\nconst MyComponent = () => {\n const { message } = App.useApp();\n message.success('Done!');\n};`,\n },\n {\n component: 'notification',\n breaking: true,\n description: 'Static methods `notification.xxx()` deprecated. Use `App.useApp()` hook instead.',\n autoFixable: false,\n searchPattern: `\\\\bnotification\\\\.(success|error|warning|info|open)\\\\(`,\n migrationGuide: `Same pattern as message — use App.useApp() to get notification instance.`,\n before: `import { notification } from 'antd';\nnotification.success({ message: 'Done!' });`,\n after: `import { App } from 'antd';\nconst MyComponent = () => {\n const { notification } = App.useApp();\n notification.success({ message: 'Done!' });\n};`,\n },\n {\n component: 'Modal',\n breaking: true,\n description: 'Static methods `Modal.confirm()` etc. deprecated. Use `App.useApp()` hook instead.',\n autoFixable: false,\n searchPattern: `\\\\bModal\\\\.(confirm|info|success|error|warning)\\\\(`,\n migrationGuide: `Same pattern as message/notification — use App.useApp() to get modal instance.`,\n before: `import { Modal } from 'antd';\nModal.confirm({ title: 'Sure?' });`,\n after: `import { App } from 'antd';\nconst MyComponent = () => {\n const { modal } = App.useApp();\n modal.confirm({ title: 'Sure?' });\n};`,\n },\n\n // Table\n {\n component: 'Table',\n breaking: true,\n description: 'Column `filterDropdown` render args changed. `confirm({ closeDropdown: false })` replaced by separate `close` function.',\n autoFixable: false,\n searchPattern: `filterDropdown.*closeDropdown`,\n migrationGuide: `Update filterDropdown render function signature to use the new \\`close\\` parameter instead of \\`confirm({ closeDropdown: false })\\`.`,\n before: `filterDropdown: ({ confirm }) => (\n <Button onClick={() => confirm({ closeDropdown: false })}>Filter</Button>\n)`,\n after: `filterDropdown: ({ confirm, close }) => (\n <Button onClick={() => close()}>Filter</Button>\n)`,\n },\n\n // Form\n {\n component: 'Form',\n breaking: false,\n description: 'Prop `labelCol` and `wrapperCol` can now be set globally via ConfigProvider.',\n autoFixable: false,\n migrationGuide: `Optional improvement: move repeated labelCol/wrapperCol config to ConfigProvider for consistency.`,\n },\n\n // Slider\n {\n component: 'Slider',\n breaking: true,\n description: 'Tooltip-related APIs converged into `tooltip` property. `tooltipVisible` → `tooltip.open`, `tipFormatter` → `tooltip.formatter`, etc.',\n autoFixable: false,\n searchPattern: `<Slider[^>]*\\\\b(tooltipVisible|tipFormatter|tooltipPlacement|getTooltipPopupContainer)\\\\b`,\n before: `<Slider tooltipVisible={show} tipFormatter={(v) => \\`\\${v}%\\`} />`,\n after: `<Slider tooltip={{ open: show, formatter: (v) => \\`\\${v}%\\` }} />`,\n migrationGuide: `Migrate Slider tooltip props:\n- tooltipVisible → tooltip.open\n- tipFormatter → tooltip.formatter\n- tooltipPlacement → tooltip.placement\n- getTooltipPopupContainer → tooltip.getPopupContainer`,\n },\n\n // Table filterDropdownVisible\n {\n component: 'Table',\n breaking: true,\n description: 'Column prop `filterDropdownVisible` renamed to `filterDropdownOpen`.',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `filterDropdownVisible`,\n before: `{ title: 'Name', dataIndex: 'name', filterDropdownVisible: visible }`,\n after: `{ title: 'Name', dataIndex: 'name', filterDropdownOpen: visible }`,\n migrationGuide: `Search for \\`filterDropdownVisible\\` in Table column definitions and rename to \\`filterDropdownOpen\\`.`,\n },\n\n // Drawer style/className migration\n {\n component: 'Drawer',\n breaking: true,\n description: 'Drawer `style` and `className` now apply to the panel node. Use `rootStyle` and `rootClassName` for the wrapper.',\n autoFixable: false,\n searchPattern: `<Drawer[^>]*\\\\b(style|className)\\\\s*=`,\n migrationGuide: `In v5, Drawer \\`style\\` and \\`className\\` are migrated to the Drawer panel node.\nIf you were using them to style the wrapper/mask, replace with \\`rootStyle\\` and \\`rootClassName\\`.`,\n before: `<Drawer className=\"my-drawer\" style={{ zIndex: 1000 }}>`,\n after: `<Drawer rootClassName=\"my-drawer\" rootStyle={{ zIndex: 1000 }}>`,\n },\n\n // Notification close → destroy\n {\n component: 'notification',\n breaking: true,\n description: 'Static method `notification.close()` renamed to `notification.destroy()`. Static config options restricted.',\n autoFixable: false,\n searchPattern: `\\\\bnotification\\\\.close\\\\(`,\n before: `notification.close(key);`,\n after: `notification.destroy(key);`,\n migrationGuide: `1. Rename notification.close() to notification.destroy()\n2. Static methods no longer allow dynamic prefixCls, maxCount, top, bottom, getContainer in open()\n3. Use useNotification hook if you need different configurations`,\n },\n\n // message.warn removed\n {\n component: 'message',\n breaking: true,\n description: '`message.warn()` completely removed. Use `message.warning()` instead.',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `\\\\bmessage\\\\.warn\\\\(`,\n before: `message.warn('Something went wrong');`,\n after: `message.warning('Something went wrong');`,\n migrationGuide: `Search for \\`message.warn(\\` and replace with \\`message.warning(\\`.`,\n },\n\n // IE not supported\n {\n component: 'Global',\n breaking: true,\n description: 'IE browser is no longer supported. v5 uses CSS-in-JS and modern CSS features.',\n autoFixable: false,\n migrationGuide: `If your project needs IE support, you cannot upgrade to v5. Consider using @ant-design/cssinjs StyleProvider for :where selector compatibility with older browsers.`,\n },\n];\n","import type { MigrationStep } from './migrate.js';\n\nexport const V5_TO_V6_STEPS: MigrationStep[] = [\n // ─── Global / Environment ───────────────────────────────────────────────────\n\n {\n component: 'Global',\n breaking: true,\n description: 'React >= 18 required. React 17 and earlier are no longer supported.',\n autoFixable: false,\n migrationGuide: `1. Upgrade React to 18 or above\n2. Remove @ant-design/v5-patch-for-react-19 if present (no longer needed)`,\n searchPattern: `@ant-design/v5-patch-for-react-19`,\n before: `import '@ant-design/v5-patch-for-react-19';`,\n after: `// Remove this import — no longer needed in v6`,\n },\n {\n component: 'Global',\n breaking: true,\n description: '@ant-design/icons must be upgraded to v6. Icons v6 is not compatible with antd v5.',\n autoFixable: false,\n migrationGuide: `1. Run: npm install @ant-design/icons@6\n2. @ant-design/icons@6 is NOT compatible with antd@5 — upgrade both together\n3. If build errors occur, verify icon package version matches antd version`,\n },\n {\n component: 'Global',\n breaking: true,\n description: 'CSS variables enabled by default. Only modern browsers supported, IE is not supported.',\n autoFixable: false,\n migrationGuide: `Verify your target browsers support CSS variables. IE and some older domestic browsers may have issues.`,\n },\n {\n component: 'Global',\n breaking: false,\n description: 'DOM structure of many components optimized. Custom styles targeting internal DOM nodes may need adjustment.',\n autoFixable: false,\n migrationGuide: `If your project has CSS that targets component internal DOM nodes (specific selectors or hierarchy), inspect and adjust after upgrading.`,\n },\n\n // ─── Button ─────────────────────────────────────────────────────────────────\n\n {\n component: 'Button',\n breaking: true,\n description: 'Prop `type` split into `color` and `variant` for styling. `type=\"primary\"` → `color=\"primary\" variant=\"solid\"`.',\n autoFixable: true,\n codemod: 'v6-type-to-variant',\n searchPattern: `<Button[^>]*\\\\btype\\\\s*=\\\\s*['\"](?:primary|dashed|link|text)['\"]`,\n migrationGuide: `Button type prop is decomposed:\n- type=\"primary\" → color=\"primary\" variant=\"solid\" (or just keep type=\"primary\" as alias)\n- type=\"dashed\" → variant=\"dashed\"\n- type=\"link\" → variant=\"link\"\n- type=\"text\" → variant=\"text\"\n- type=\"default\" → no change needed`,\n before: `<Button type=\"primary\">Submit</Button>\n<Button type=\"dashed\">Dashed</Button>\n<Button type=\"link\">Link</Button>\n<Button type=\"text\">Text</Button>`,\n after: `<Button color=\"primary\" variant=\"solid\">Submit</Button>\n<Button variant=\"dashed\">Dashed</Button>\n<Button variant=\"link\">Link</Button>\n<Button variant=\"text\">Text</Button>`,\n },\n {\n component: 'Button',\n breaking: true,\n description: 'Prop `danger` removed. Use `color=\"danger\"` instead.',\n autoFixable: true,\n codemod: 'v6-danger-migration',\n searchPattern: `<Button[^>]*\\\\bdanger\\\\b`,\n before: `<Button danger>Delete</Button>\n<Button type=\"primary\" danger>Delete</Button>`,\n after: `<Button color=\"danger\">Delete</Button>\n<Button color=\"danger\" variant=\"solid\">Delete</Button>`,\n migrationGuide: `Search for all Button components with \\`danger\\` prop. Replace with \\`color=\"danger\"\\`. If the button also had \\`type=\"primary\"\\`, add \\`variant=\"solid\"\\`.`,\n },\n {\n component: 'Button',\n breaking: true,\n description: 'Prop `ghost` removed. Use `variant=\"outlined\"` instead.',\n autoFixable: true,\n codemod: 'v6-ghost-migration',\n searchPattern: `<Button[^>]*\\\\bghost\\\\b`,\n before: `<Button ghost>Ghost</Button>\n<Button type=\"primary\" ghost>Ghost Primary</Button>`,\n after: `<Button variant=\"outlined\">Ghost</Button>\n<Button color=\"primary\" variant=\"outlined\">Ghost Primary</Button>`,\n migrationGuide: `Search for all Button components with \\`ghost\\` prop. Replace with \\`variant=\"outlined\"\\`. Preserve the color from the original \\`type\\` prop.`,\n },\n {\n component: 'Button',\n breaking: false,\n description: '`iconPosition` deprecated, use `iconPlacement` instead.',\n autoFixable: true,\n codemod: 'v6-props-changed-migration',\n searchPattern: `<Button[^>]*\\\\biconPosition\\\\b`,\n before: `<Button iconPosition=\"end\">Click</Button>`,\n after: `<Button iconPlacement=\"end\">Click</Button>`,\n },\n {\n component: 'Button.Group',\n breaking: false,\n description: '`Button.Group` deprecated, use `Space.Compact` instead.',\n autoFixable: false,\n searchPattern: `Button\\\\.Group`,\n before: `<Button.Group><Button>A</Button><Button>B</Button></Button.Group>`,\n after: `<Space.Compact><Button>A</Button><Button>B</Button></Space.Compact>`,\n },\n\n // ─── Alert ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Alert',\n breaking: false,\n description: '`closeText` deprecated → `closable.closeIcon`; `message` deprecated → `title`.',\n autoFixable: false,\n searchPattern: `<Alert[^>]*\\\\b(closeText|message)\\\\s*=`,\n migrationGuide: `- closeText=\"Close\" → closable={{ closeIcon: \"Close\" }}\n- message=\"Title\" → title=\"Title\"`,\n },\n\n // ─── Anchor ─────────────────────────────────────────────────────────────────\n\n {\n component: 'Anchor',\n breaking: false,\n description: '`Anchor` children usage deprecated, use `items` prop instead.',\n autoFixable: false,\n searchPattern: `<Anchor>\\\\s*<Anchor\\\\.Link`,\n migrationGuide: `Replace Anchor children with items prop array.`,\n },\n\n // ─── AutoComplete ───────────────────────────────────────────────────────────\n\n {\n component: 'AutoComplete',\n breaking: false,\n description: 'Multiple deprecated props: `dropdownMatchSelectWidth` → `popupMatchSelectWidth`, `dropdownClassName` → `classNames.popup.root`, `dropdownRender` → `popupRender`, `dataSource` → `options`.',\n autoFixable: false,\n searchPattern: `<AutoComplete[^>]*\\\\b(dropdownMatchSelectWidth|dropdownClassName|dropdownStyle|dropdownRender|onDropdownVisibleChange|dataSource)\\\\b`,\n migrationGuide: `- dropdownMatchSelectWidth → popupMatchSelectWidth\n- dropdownClassName / popupClassName → classNames.popup.root\n- dropdownStyle → styles.popup.root\n- dropdownRender → popupRender\n- onDropdownVisibleChange → onOpenChange\n- dataSource → options`,\n },\n\n // ─── Avatar.Group ───────────────────────────────────────────────────────────\n\n {\n component: 'Avatar.Group',\n breaking: false,\n description: '`maxCount`/`maxStyle`/`maxPopoverPlacement`/`maxPopoverTrigger` deprecated, use `max` prop object.',\n autoFixable: false,\n searchPattern: `<Avatar\\\\.Group[^>]*\\\\b(maxCount|maxStyle|maxPopoverPlacement|maxPopoverTrigger)\\\\b`,\n before: `<Avatar.Group maxCount={3} maxStyle={{ color: 'red' }}>`,\n after: `<Avatar.Group max={{ count: 3, style: { color: 'red' } }}>`,\n },\n\n // ─── Breadcrumb ─────────────────────────────────────────────────────────────\n\n {\n component: 'Breadcrumb',\n breaking: false,\n description: '`routes` deprecated → `items`; `Breadcrumb.Item` / `Breadcrumb.Separator` deprecated → `items`.',\n autoFixable: false,\n searchPattern: `(Breadcrumb\\\\.Item|Breadcrumb\\\\.Separator|<Breadcrumb[^>]*\\\\broutes\\\\b)`,\n migrationGuide: `Replace Breadcrumb children or routes prop with items array.`,\n },\n\n // ─── Calendar ───────────────────────────────────────────────────────────────\n\n {\n component: 'Calendar',\n breaking: false,\n description: '`dateFullCellRender`/`dateCellRender`/`monthFullCellRender`/`monthCellRender` deprecated → `fullCellRender`/`cellRender`.',\n autoFixable: false,\n searchPattern: `<Calendar[^>]*\\\\b(dateFullCellRender|dateCellRender|monthFullCellRender|monthCellRender)\\\\b`,\n },\n\n // ─── Card ───────────────────────────────────────────────────────────────────\n\n {\n component: 'Card',\n breaking: false,\n description: '`headStyle` → `styles.header`; `bodyStyle` → `styles.body`; `bordered` → `variant`.',\n autoFixable: false,\n searchPattern: `<Card[^>]*\\\\b(headStyle|bodyStyle|bordered)\\\\b`,\n migrationGuide: `- headStyle → styles.header\n- bodyStyle → styles.body\n- bordered={false} → variant=\"borderless\"`,\n },\n\n // ─── Cascader ───────────────────────────────────────────────────────────────\n\n {\n component: 'Cascader',\n breaking: false,\n description: 'Multiple deprecated props: `dropdownClassName` → `classNames.popup.root`, `bordered` → `variant`, `onPopupVisibleChange` → `onOpenChange`.',\n autoFixable: false,\n searchPattern: `<Cascader[^>]*\\\\b(dropdownClassName|dropdownStyle|dropdownRender|dropdownMenuColumnStyle|onDropdownVisibleChange|onPopupVisibleChange|bordered)\\\\b`,\n },\n\n // ─── Collapse ───────────────────────────────────────────────────────────────\n\n {\n component: 'Collapse',\n breaking: false,\n description: '`destroyInactivePanel` → `destroyOnHidden`; `expandIconPosition` → `expandIconPlacement`.',\n autoFixable: false,\n searchPattern: `<Collapse[^>]*\\\\b(destroyInactivePanel|expandIconPosition)\\\\b`,\n },\n\n // ─── DatePicker ─────────────────────────────────────────────────────────────\n\n {\n component: 'DatePicker',\n breaking: false,\n description: 'Multiple deprecated props: `popupClassName` → `classNames.popup.root`, `bordered` → `variant`, `onSelect` → `onCalendarChange`.',\n autoFixable: false,\n searchPattern: `<(DatePicker|RangePicker)[^>]*\\\\b(dropdownClassName|popupClassName|popupStyle|bordered|onSelect)\\\\b`,\n },\n\n // ─── Descriptions ──────────────────────────────────────────────────────────\n\n {\n component: 'Descriptions',\n breaking: false,\n description: '`labelStyle` → `styles.label`; `contentStyle` → `styles.content`.',\n autoFixable: false,\n searchPattern: `<Descriptions[^>]*\\\\b(labelStyle|contentStyle)\\\\b`,\n },\n\n // ─── Divider ────────────────────────────────────────────────────────────────\n\n {\n component: 'Divider',\n breaking: false,\n description: '`type` deprecated → `orientation`; `orientationMargin` → `styles.content.margin`.',\n autoFixable: false,\n searchPattern: `<Divider[^>]*\\\\b(type\\\\s*=|orientationMargin)\\\\b`,\n },\n\n // ─── Drawer ─────────────────────────────────────────────────────────────────\n\n {\n component: 'Drawer',\n breaking: false,\n description: 'Style props deprecated: `headerStyle`/`bodyStyle`/`footerStyle`/`maskStyle`/`drawerStyle`/`contentWrapperStyle` → `styles.*`; `width`/`height` → `size`; `destroyInactivePanel` → `destroyOnHidden`.',\n autoFixable: false,\n searchPattern: `<Drawer[^>]*\\\\b(headerStyle|bodyStyle|footerStyle|contentWrapperStyle|maskStyle|drawerStyle|destroyInactivePanel)\\\\b`,\n migrationGuide: `- headerStyle → styles.header\n- bodyStyle → styles.body\n- footerStyle → styles.footer\n- contentWrapperStyle → styles.wrapper\n- maskStyle → styles.mask\n- drawerStyle → styles.section\n- width/height → size\n- destroyInactivePanel → destroyOnHidden`,\n },\n\n // ─── Dropdown ───────────────────────────────────────────────────────────────\n\n {\n component: 'Dropdown',\n breaking: false,\n description: '`overlayClassName` → `classNames.root`; `overlayStyle` → `styles.root`; `destroyPopupOnHide` → `destroyOnHidden`. `Dropdown.Button` deprecated → `Space.Compact + Dropdown + Button`.',\n autoFixable: false,\n searchPattern: `(Dropdown\\\\.Button|<Dropdown[^>]*\\\\b(overlayClassName|overlayStyle|destroyPopupOnHide|dropdownRender)\\\\b)`,\n },\n\n // ─── Form ───────────────────────────────────────────────────────────────────\n\n {\n component: 'Form',\n breaking: true,\n description: '`onFinish` no longer includes all Form.List data. Unregistered Form.Item fields are excluded.',\n autoFixable: false,\n migrationGuide: `In v5, Form.List was treated as a single Field, causing onFinish to include all data.\nIn v6, only registered Form.Item fields are included.\nYou no longer need getFieldsValue({ strict: true }) to filter.`,\n before: `const onFinish = (values) => {\n const realValues = getFieldsValue({ strict: true });\n};`,\n after: `const onFinish = (values) => {\n const realValues = values; // Already filtered in v6\n};`,\n },\n\n // ─── Image ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Image',\n breaking: false,\n description: '`visible` → `open`; `onVisibleChange` → `onOpenChange`; `wrapperStyle` → `styles.root`; `maskClassName` → `classNames.cover`; `toolbarRender` → `actionsRender`.',\n autoFixable: false,\n searchPattern: `<Image[^>]*\\\\b(visible|onVisibleChange|wrapperStyle|maskClassName|rootClassName|toolbarRender)\\\\b`,\n },\n\n // ─── Input.Group ────────────────────────────────────────────────────────────\n\n {\n component: 'Input.Group',\n breaking: false,\n description: '`Input.Group` deprecated, use `Space.Compact` instead.',\n autoFixable: false,\n searchPattern: `Input\\\\.Group`,\n before: `<Input.Group compact><Input /><Input /></Input.Group>`,\n after: `<Space.Compact><Input /><Input /></Space.Compact>`,\n },\n\n // ─── Menu ───────────────────────────────────────────────────────────────────\n\n {\n component: 'Menu',\n breaking: false,\n description: '`children` deprecated, use `items` prop instead.',\n autoFixable: false,\n searchPattern: `<Menu>\\\\s*<Menu\\\\.Item`,\n },\n\n // ─── Modal ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Modal',\n breaking: false,\n description: '`bodyStyle` → `styles.body`; `maskStyle` → `styles.mask`; `destroyOnClose` → `destroyOnHidden`.',\n autoFixable: false,\n searchPattern: `<Modal[^>]*\\\\b(bodyStyle|maskStyle|destroyOnClose)\\\\b`,\n },\n\n // ─── Notification ──────────────────────────────────────────────────────────\n\n {\n component: 'notification',\n breaking: false,\n description: '`btn` deprecated → `actions`; `message` deprecated → `title`.',\n autoFixable: false,\n searchPattern: `notification\\\\.(open|success|error|info|warning)\\\\(\\\\{[^}]*(\\\\bbtn\\\\b|\\\\bmessage\\\\b)`,\n },\n\n // ─── Progress ───────────────────────────────────────────────────────────────\n\n {\n component: 'Progress',\n breaking: false,\n description: '`strokeWidth`/`width` → `size`; `trailColor` → `railColor`; `gapPosition` → `gapPlacement`.',\n autoFixable: false,\n searchPattern: `<Progress[^>]*\\\\b(strokeWidth|trailColor|gapPosition)\\\\b`,\n },\n\n // ─── Select ─────────────────────────────────────────────────────────────────\n\n {\n component: 'Select',\n breaking: false,\n description: 'Multiple deprecated props: `dropdownClassName` → `classNames.popup.root`, `dropdownRender` → `popupRender`, `bordered` → `variant`, `onDropdownVisibleChange` → `onOpenChange`.',\n autoFixable: false,\n searchPattern: `<Select[^>]*\\\\b(dropdownClassName|dropdownStyle|dropdownRender|onDropdownVisibleChange|bordered)\\\\b`,\n },\n\n // ─── Slider ─────────────────────────────────────────────────────────────────\n\n {\n component: 'Slider',\n breaking: false,\n description: 'Tooltip props deprecated: `tooltipPrefixCls` → `tooltip.prefixCls`, `tipFormatter` → `tooltip.formatter`, `tooltipVisible` → `tooltip.open`, `tooltipPlacement` → `tooltip.placement`.',\n autoFixable: false,\n searchPattern: `<Slider[^>]*\\\\b(tooltipPrefixCls|tipFormatter|tooltipVisible|tooltipPlacement|getTooltipPopupContainer)\\\\b`,\n },\n\n // ─── Space ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Space',\n breaking: false,\n description: '`direction` → `orientation`; `split` → `separator`.',\n autoFixable: false,\n searchPattern: `<Space[^>]*\\\\b(direction|split)\\\\s*=`,\n },\n\n // ─── Steps ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Steps',\n breaking: false,\n description: '`labelPlacement` → `titlePlacement`; `progressDot` → `type=\"dot\"`; `direction` → `orientation`; `items.description` → `items.content`.',\n autoFixable: false,\n searchPattern: `<Steps[^>]*\\\\b(labelPlacement|progressDot|direction)\\\\b`,\n },\n\n // ─── Table ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Table',\n breaking: false,\n description: '`pagination.position` → `pagination.placement`; `filterDropdownOpen` → `filterDropdownProps.open`; `onFilterDropdownOpenChange` → `filterDropdownProps.onOpenChange`.',\n autoFixable: false,\n searchPattern: `(filterDropdownOpen|onFilterDropdownOpenChange|filterCheckall)`,\n },\n\n // ─── Tabs ───────────────────────────────────────────────────────────────────\n\n {\n component: 'Tabs',\n breaking: false,\n description: '`tabPosition` → `tabPlacement`; `destroyInactiveTabPane` → `destroyOnHidden`; `Tabs.TabPane` deprecated → `items`.',\n autoFixable: false,\n searchPattern: `(Tabs\\\\.TabPane|<Tabs[^>]*\\\\b(tabPosition|destroyInactiveTabPane)\\\\b)`,\n },\n\n // ─── Tag ────────────────────────────────────────────────────────────────────\n\n {\n component: 'Tag',\n breaking: true,\n description: 'Default trailing margin removed. `bordered={false}` → `variant=\"filled\"`; `color=\"xxx-inverse\"` → `variant=\"solid\"`.',\n autoFixable: false,\n searchPattern: `<Tag[^>]*\\\\b(bordered|color\\\\s*=\\\\s*['\"][^'\"]*-inverse)`,\n migrationGuide: `- Tag trailing margin removed. Add margin via ConfigProvider tag.styles if needed.\n- bordered={false} → variant=\"filled\"\n- color=\"xxx-inverse\" → variant=\"solid\"`,\n },\n\n // ─── Timeline ───────────────────────────────────────────────────────────────\n\n {\n component: 'Timeline',\n breaking: false,\n description: '`Timeline.Item` deprecated → `items`; `pending`/`pendingDot` deprecated → `items`; `mode=left|right` → `mode=start|end`.',\n autoFixable: false,\n searchPattern: `(Timeline\\\\.Item|<Timeline[^>]*\\\\b(pending|pendingDot|mode\\\\s*=\\\\s*['\"](?:left|right))\\\\b)`,\n },\n\n // ─── Tooltip ────────────────────────────────────────────────────────────────\n\n {\n component: 'Tooltip',\n breaking: false,\n description: '`overlayStyle` → `styles.root`; `overlayInnerStyle` → `styles.container`; `overlayClassName` → `classNames.root`; `destroyTooltipOnHide` → `destroyOnHidden`.',\n autoFixable: false,\n searchPattern: `<Tooltip[^>]*\\\\b(overlayStyle|overlayInnerStyle|overlayClassName|destroyTooltipOnHide)\\\\b`,\n },\n\n // ─── Transfer ───────────────────────────────────────────────────────────────\n\n {\n component: 'Transfer',\n breaking: false,\n description: '`listStyle` → `styles.section`; `operationStyle` → `styles.actions`; `operations` → `actions`.',\n autoFixable: false,\n searchPattern: `<Transfer[^>]*\\\\b(listStyle|operationStyle|operations)\\\\b`,\n },\n\n // ─── TreeSelect ─────────────────────────────────────────────────────────────\n\n {\n component: 'TreeSelect',\n breaking: false,\n description: 'Multiple deprecated props: `dropdownClassName` → `classNames.popup.root`, `dropdownRender` → `popupRender`, `bordered` → `variant`, `onDropdownVisibleChange` → `onOpenChange`.',\n autoFixable: false,\n searchPattern: `<TreeSelect[^>]*\\\\b(dropdownClassName|dropdownStyle|dropdownRender|onDropdownVisibleChange|bordered)\\\\b`,\n },\n\n // ─── Overlay: Modal, Drawer mask blur ──────────────────────────────────────\n\n {\n component: 'Global',\n breaking: false,\n description: 'Modal/Drawer mask blur enabled by default. Disable via ConfigProvider if undesired.',\n autoFixable: false,\n migrationGuide: `If you don't want the mask blur effect:\n<ConfigProvider modal={{ mask: { blur: false } }} drawer={{ mask: { blur: false } }}>\n <App />\n</ConfigProvider>`,\n },\n];\n","import type { Command } from 'commander';\nimport type { GlobalOptions, OutputFormat } from '../types.js';\nimport { output } from '../output/formatter.js';\nimport { printError, createError, ErrorCodes } from '../output/error.js';\nimport { V4_TO_V5_STEPS } from './migrate-v4-to-v5.js';\nimport { V5_TO_V6_STEPS } from './migrate-v5-to-v6.js';\n\nexport interface MigrationStep {\n component: string;\n breaking: boolean;\n description: string;\n autoFixable: boolean;\n codemod?: string;\n guide?: string;\n /** Pattern to search for in source files (regex string) */\n searchPattern?: string;\n /** Before/after code examples for agents */\n before?: string;\n after?: string;\n /** Detailed migration instructions for agents */\n migrationGuide?: string;\n}\n\n// ─── Migration Guide Registry ────────────────────────────────────────────────\n\nconst MIGRATION_GUIDES: Record<string, MigrationStep[]> = {\n '4-5': V4_TO_V5_STEPS,\n '5-6': V5_TO_V6_STEPS,\n};\n\n// ─── Output Formatters ──────────────────────────────────────────────────────\n\nfunction formatText(from: string, to: string, steps: MigrationStep[]): void {\n const autoFixable = steps.filter((s) => s.autoFixable).length;\n const manual = steps.length - autoFixable;\n\n console.log(`Migration Guide: v${from} → v${to}\\n`);\n\n // Group by component\n const grouped = groupByComponent(steps);\n for (const [comp, compSteps] of grouped) {\n console.log(` ${comp}:`);\n for (const step of compSteps) {\n const icon = step.autoFixable ? '🔧' : '📝';\n const breaking = step.breaking ? ' [BREAKING]' : '';\n console.log(` ${icon}${breaking} ${step.description}`);\n if (step.guide) console.log(` Guide: ${step.guide}`);\n }\n console.log('');\n }\n\n console.log(`Total: ${steps.length} steps (${autoFixable} auto-fixable, ${manual} manual)`);\n}\n\nfunction formatMarkdown(from: string, to: string, steps: MigrationStep[]): void {\n const lines: string[] = [];\n const autoFixable = steps.filter((s) => s.autoFixable).length;\n const manual = steps.length - autoFixable;\n\n lines.push(`# Migration Guide: antd v${from} → v${to}`);\n lines.push('');\n lines.push(`> ${steps.length} total steps: ${autoFixable} auto-fixable, ${manual} manual`);\n lines.push('');\n\n const grouped = groupByComponent(steps);\n for (const [comp, compSteps] of grouped) {\n lines.push(`## ${comp}`);\n lines.push('');\n for (const step of compSteps) {\n const badge = step.breaking ? '**BREAKING**' : 'non-breaking';\n const fix = step.autoFixable ? '🔧 auto-fixable' : '📝 manual';\n lines.push(`### ${step.description}`);\n lines.push('');\n lines.push(`${badge} | ${fix}`);\n lines.push('');\n\n if (step.migrationGuide) {\n lines.push(step.migrationGuide);\n lines.push('');\n }\n\n if (step.before && step.after) {\n lines.push('**Before:**');\n lines.push('```tsx');\n lines.push(step.before);\n lines.push('```');\n lines.push('');\n lines.push('**After:**');\n lines.push('```tsx');\n lines.push(step.after);\n lines.push('```');\n lines.push('');\n }\n\n if (step.searchPattern) {\n lines.push(`**Search pattern:** \\`${step.searchPattern}\\``);\n lines.push('');\n }\n\n if (step.guide) {\n lines.push(`**Reference:** ${step.guide}`);\n lines.push('');\n }\n }\n }\n\n console.log(lines.join('\\n'));\n}\n\nfunction formatJson(from: string, to: string, steps: MigrationStep[]): void {\n const autoFixable = steps.filter((s) => s.autoFixable).length;\n const manual = steps.length - autoFixable;\n output({\n from,\n to,\n steps,\n summary: { total: steps.length, autoFixable, manual },\n }, 'json');\n}\n\nfunction formatApplyPrompt(from: string, to: string, steps: MigrationStep[], dir: string, format: OutputFormat): void {\n const fixableSteps = steps.filter((s) => s.autoFixable && s.searchPattern);\n const manualSteps = steps.filter((s) => !s.autoFixable);\n\n if (format === 'json') {\n output({\n from,\n to,\n targetDir: dir,\n autoFixSteps: fixableSteps.map((s) => ({\n component: s.component,\n description: s.description,\n searchPattern: s.searchPattern,\n before: s.before,\n after: s.after,\n migrationGuide: s.migrationGuide,\n })),\n manualSteps: manualSteps.map((s) => ({\n component: s.component,\n description: s.description,\n guide: s.guide,\n migrationGuide: s.migrationGuide,\n before: s.before,\n after: s.after,\n })),\n summary: {\n totalAutoFix: fixableSteps.length,\n totalManual: manualSteps.length,\n },\n }, 'json');\n return;\n }\n\n const lines: string[] = [];\n lines.push(`# Auto-Migration Prompt: antd v${from} → v${to}`);\n lines.push(`# Target directory: ${dir}`);\n lines.push('');\n lines.push('## Instructions for Code Agent');\n lines.push('');\n lines.push(`Scan all .ts/.tsx/.js/.jsx files in \\`${dir}\\` and apply the following migrations.`);\n lines.push('For each file changed, verify the fix compiles correctly before moving on.');\n lines.push('');\n\n if (fixableSteps.length > 0) {\n lines.push('## Auto-fixable Changes');\n lines.push('');\n for (let i = 0; i < fixableSteps.length; i++) {\n const step = fixableSteps[i];\n lines.push(`### ${i + 1}. ${step.component}: ${step.description}`);\n lines.push('');\n if (step.searchPattern) {\n lines.push(`**Search regex:** \\`${step.searchPattern}\\``);\n lines.push('');\n }\n if (step.migrationGuide) {\n lines.push(step.migrationGuide);\n lines.push('');\n }\n if (step.before && step.after) {\n lines.push('**Before:**');\n lines.push('```tsx');\n lines.push(step.before);\n lines.push('```');\n lines.push('**After:**');\n lines.push('```tsx');\n lines.push(step.after);\n lines.push('```');\n lines.push('');\n }\n }\n }\n\n if (manualSteps.length > 0) {\n lines.push('## Manual Changes (require human review)');\n lines.push('');\n for (let i = 0; i < manualSteps.length; i++) {\n const step = manualSteps[i];\n lines.push(`### ${i + 1}. ${step.component}: ${step.description}`);\n lines.push('');\n if (step.migrationGuide) {\n lines.push(step.migrationGuide);\n lines.push('');\n }\n if (step.before && step.after) {\n lines.push('**Before:**');\n lines.push('```tsx');\n lines.push(step.before);\n lines.push('```');\n lines.push('**After:**');\n lines.push('```tsx');\n lines.push(step.after);\n lines.push('```');\n lines.push('');\n }\n if (step.guide) {\n lines.push(`**Reference:** ${step.guide}`);\n lines.push('');\n }\n }\n }\n\n console.log(lines.join('\\n'));\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction groupByComponent(steps: MigrationStep[]): Map<string, MigrationStep[]> {\n const map = new Map<string, MigrationStep[]>();\n for (const step of steps) {\n const arr = map.get(step.component) || [];\n arr.push(step);\n map.set(step.component, arr);\n }\n return map;\n}\n\n// ─── Command Registration ────────────────────────────────────────────────────\n\nexport function registerMigrateCommand(program: Command): void {\n program\n .command('migrate <from> <to>')\n .description('Version migration guide with optional auto-fix')\n .option('--component <name>', 'Component-specific migration guide')\n .option('--apply <dir>', 'Generate migration prompts for scanning a directory')\n .option('--confirm', 'Confirm auto-fix (required with --apply)')\n .action((rawFrom: string, rawTo: string, cmdOpts: { component?: string; apply?: string; confirm?: boolean }) => {\n const opts = program.opts<GlobalOptions>();\n const from = rawFrom.replace(/^v/i, '');\n const to = rawTo.replace(/^v/i, '');\n const key = `${from}-${to}`;\n let steps = MIGRATION_GUIDES[key];\n\n if (!steps) {\n const err = createError(\n ErrorCodes.INVALID_ARGUMENT,\n `No migration guide available for v${from} → v${to}`,\n `Available migrations: ${Object.keys(MIGRATION_GUIDES).map((k) => `v${k.replace('-', ' → v')}`).join(', ')}`,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n if (cmdOpts.component) {\n steps = steps.filter((s) => s.component.toLowerCase() === cmdOpts.component!.toLowerCase());\n if (steps.length === 0) {\n const err = createError(\n ErrorCodes.COMPONENT_NOT_FOUND,\n `No migration steps found for ${cmdOpts.component} from v${from} to v${to}`,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n }\n\n // --apply mode: generate agent-consumable migration prompt\n if (cmdOpts.apply) {\n formatApplyPrompt(from, to, steps, cmdOpts.apply, opts.format);\n return;\n }\n\n // Standard guide output\n switch (opts.format) {\n case 'json':\n formatJson(from, to, steps);\n break;\n case 'markdown':\n formatMarkdown(from, to, steps);\n break;\n case 'text':\n default:\n formatText(from, to, steps);\n break;\n }\n });\n}\n","import { platform, release } from 'node:os';\nimport { execFileSync } from 'node:child_process';\nimport { readJson } from './scan.js';\nimport { join } from 'node:path';\n\ndeclare const __CLI_VERSION__: string;\n\nexport interface AntdEnv {\n antd: string;\n react: string;\n system: string;\n browser: string;\n}\n\nexport interface CliEnv {\n cli: string;\n node: string;\n system: string;\n}\n\nfunction getSystem(): string {\n return `${platform()} ${release()}`;\n}\n\nexport function collectAntdEnv(cwd: string, versionOverride?: string): AntdEnv {\n const antdPkg = readJson(join(cwd, 'node_modules', 'antd', 'package.json'));\n const reactPkg = readJson(join(cwd, 'node_modules', 'react', 'package.json'));\n\n return {\n antd: versionOverride || antdPkg?.version || 'unknown',\n react: reactPkg?.version || 'unknown',\n system: getSystem(),\n browser: '-',\n };\n}\n\nexport function collectCliEnv(): CliEnv {\n let cliVersion: string;\n try {\n cliVersion = __CLI_VERSION__;\n } catch (err) {\n console.error('Failed to get CLI version:', err);\n cliVersion = 'unknown';\n }\n return {\n cli: cliVersion,\n node: process.version,\n system: getSystem(),\n };\n}\n\nconst PLACEHOLDER = '_No response_';\nconst MAX_URL_LENGTH = 8000;\nconst FOOTER = '\\n\\n---\\n<sub>Generated by [@ant-design/cli](https://github.com/ant-design/ant-design-cli)</sub>';\n\nexport interface AntdIssueFields {\n reproduction?: string;\n steps?: string;\n expected?: string;\n actual?: string;\n extra?: string;\n env: AntdEnv;\n}\n\nexport interface CliIssueFields {\n description?: string;\n steps?: string;\n expected?: string;\n actual?: string;\n extra?: string;\n env: CliEnv;\n}\n\nexport function buildAntdIssueBody(fields: AntdIssueFields): string {\n const reproduction = fields.reproduction || PLACEHOLDER;\n const steps = fields.steps || PLACEHOLDER;\n const expected = fields.expected || PLACEHOLDER;\n const actual = fields.actual || PLACEHOLDER;\n const extra = fields.extra || '';\n\n let body = `<!-- generated by @ant-design/cli. DO NOT REMOVE -->\n\n### Reproduction link\n\n[${reproduction}](${reproduction})\n\n### Steps to reproduce\n\n${steps}\n\n### What is expected?\n\n${expected}\n\n### What is actually happening?\n\n${actual}\n\n| Environment | Info |\n| --- | --- |\n| antd | ${fields.env.antd} |\n| React | ${fields.env.react} |\n| System | ${fields.env.system} |\n| Browser | ${fields.env.browser} |`;\n\n if (extra) {\n body += `\\n\\n---\\n${extra}`;\n }\n\n body += FOOTER;\n\n return body;\n}\n\nexport function buildCliIssueBody(fields: CliIssueFields): string {\n const description = fields.description || PLACEHOLDER;\n const steps = fields.steps || PLACEHOLDER;\n const expected = fields.expected || PLACEHOLDER;\n const actual = fields.actual || PLACEHOLDER;\n const extra = fields.extra || '';\n\n let body = `### Description\n\n${description}\n\n### Steps to Reproduce\n\n${steps}\n\n### Expected Behavior\n\n${expected}\n\n### Actual Behavior\n\n${actual}\n\n### Environment\n\n| Info | Value |\n|------|-------|\n| @ant-design/cli | ${fields.env.cli} |\n| Node | ${fields.env.node} |\n| System | ${fields.env.system} |`;\n\n if (extra) {\n body += `\\n\\n---\\n${extra}`;\n }\n\n body += FOOTER;\n\n return body;\n}\n\nexport function checkGhAvailable(): boolean {\n try {\n execFileSync('gh', ['--version'], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface SubmitResult {\n issueNumber: number;\n url: string;\n}\n\nexport function submitViaGh(repo: string, title: string, body: string): SubmitResult {\n const result = execFileSync('gh', ['issue', 'create', '--repo', repo, '--title', title, '--body', body], {\n encoding: 'utf-8',\n timeout: 30000,\n }).trim();\n\n // gh issue create outputs the issue URL, e.g. https://github.com/org/repo/issues/123\n const match = result.match(/\\/issues\\/(\\d+)/);\n const issueNumber = match ? parseInt(match[1], 10) : 0;\n\n return {\n issueNumber,\n url: result,\n };\n}\n\nexport function buildIssueUrl(repo: string, title: string, body: string): string {\n const baseUrl = `https://github.com/${repo}/issues/new`;\n const params = new URLSearchParams({ title, body });\n let url = `${baseUrl}?${params.toString()}`;\n\n if (url.length > MAX_URL_LENGTH) {\n const truncationNote = '\\n\\n(Content truncated. Please add remaining details after opening.)';\n let lo = 0;\n let hi = body.length;\n while (lo < hi) {\n const mid = Math.ceil((lo + hi) / 2);\n const truncated = body.slice(0, mid) + truncationNote;\n const testParams = new URLSearchParams({ title, body: truncated });\n const testUrl = `${baseUrl}?${testParams.toString()}`;\n if (testUrl.length <= MAX_URL_LENGTH) {\n lo = mid;\n } else {\n hi = mid - 1;\n }\n }\n const truncatedBody = body.slice(0, lo) + truncationNote;\n const finalParams = new URLSearchParams({ title, body: truncatedBody });\n url = `${baseUrl}?${finalParams.toString()}`;\n }\n\n return url;\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { createError, ErrorCodes, printError } from '../output/error.js';\nimport { output } from '../output/formatter.js';\nimport {\n collectAntdEnv,\n collectCliEnv,\n buildAntdIssueBody,\n buildCliIssueBody,\n buildIssueUrl,\n checkGhAvailable,\n submitViaGh,\n} from '../utils/issue.js';\n\nconst ANTD_REPO = 'ant-design/ant-design';\nconst CLI_REPO = 'ant-design/ant-design-cli';\n\nexport function registerBugCommand(program: Command): void {\n program\n .command('bug')\n .description('Report a bug to the antd repository')\n .option('--title <title>', 'Issue title')\n .option('--reproduction <url>', 'Reproduction link')\n .option('--steps <text>', 'Steps to reproduce')\n .option('--expected <text>', 'Expected behavior')\n .option('--actual <text>', 'Actual behavior')\n .option('--extra <text>', 'Additional comments')\n .option('--submit', 'Submit via gh CLI instead of previewing', false)\n .action((cmdOpts) => {\n const opts = program.opts<GlobalOptions>();\n\n if (!cmdOpts.title) {\n printError(\n createError(ErrorCodes.TITLE_REQUIRED, '--title is required', 'Provide --title <title>'),\n opts.format,\n );\n process.exit(1);\n }\n\n const env = collectAntdEnv(process.cwd(), opts.version);\n const body = buildAntdIssueBody({\n reproduction: cmdOpts.reproduction,\n steps: cmdOpts.steps,\n expected: cmdOpts.expected,\n actual: cmdOpts.actual,\n extra: cmdOpts.extra,\n env,\n });\n const title = cmdOpts.title;\n\n if (cmdOpts.submit) {\n if (!checkGhAvailable()) {\n printError(\n createError(ErrorCodes.GH_NOT_FOUND, 'gh CLI is not installed or not in PATH', 'Install GitHub CLI: https://cli.github.com/ — or remove --submit to get a pre-filled URL instead'),\n opts.format,\n );\n process.exit(1);\n }\n try {\n const result = submitViaGh(ANTD_REPO, title, body);\n if (opts.format === 'json') {\n output({ repo: ANTD_REPO, title, issueNumber: result.issueNumber, url: result.url }, 'json');\n } else {\n console.log(`Issue created: ${result.url}`);\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n printError(\n createError(ErrorCodes.GH_SUBMIT_FAILED, `Failed to create issue: ${message}`, 'Check your gh authentication with `gh auth status`'),\n opts.format,\n );\n process.exit(2);\n }\n return;\n }\n\n // Preview mode\n const url = buildIssueUrl(ANTD_REPO, title, body);\n\n if (opts.format === 'json') {\n output({ repo: ANTD_REPO, title, body, url }, 'json');\n } else if (opts.format === 'markdown') {\n console.log(body);\n } else {\n console.log(`Repository: ${ANTD_REPO}`);\n console.log(`Title: ${title}`);\n console.log('');\n console.log('--- Issue Body ---');\n console.log(body);\n console.log('--- End ---');\n console.log('');\n console.log('To submit, re-run with --submit flag.');\n }\n });\n}\n\nexport function registerBugCliCommand(program: Command): void {\n program\n .command('bug-cli')\n .description('Report a bug to the ant-design-cli repository')\n .option('--title <title>', 'Issue title')\n .option('--description <desc>', 'Problem description')\n .option('--steps <text>', 'Steps to reproduce')\n .option('--expected <text>', 'Expected behavior')\n .option('--actual <text>', 'Actual behavior')\n .option('--extra <text>', 'Additional comments')\n .option('--submit', 'Submit via gh CLI instead of previewing', false)\n .action((cmdOpts) => {\n const opts = program.opts<GlobalOptions>();\n\n if (!cmdOpts.title) {\n printError(\n createError(ErrorCodes.TITLE_REQUIRED, '--title is required', 'Provide --title <title>'),\n opts.format,\n );\n process.exit(1);\n }\n\n const env = collectCliEnv();\n const body = buildCliIssueBody({\n description: cmdOpts.description,\n steps: cmdOpts.steps,\n expected: cmdOpts.expected,\n actual: cmdOpts.actual,\n extra: cmdOpts.extra,\n env,\n });\n const title = cmdOpts.title;\n\n if (cmdOpts.submit) {\n if (!checkGhAvailable()) {\n printError(\n createError(ErrorCodes.GH_NOT_FOUND, 'gh CLI is not installed or not in PATH', 'Install GitHub CLI: https://cli.github.com/ — or remove --submit to get a pre-filled URL instead'),\n opts.format,\n );\n process.exit(1);\n }\n try {\n const result = submitViaGh(CLI_REPO, title, body);\n if (opts.format === 'json') {\n output({ repo: CLI_REPO, title, issueNumber: result.issueNumber, url: result.url }, 'json');\n } else {\n console.log(`Issue created: ${result.url}`);\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n printError(\n createError(ErrorCodes.GH_SUBMIT_FAILED, `Failed to create issue: ${message}`, 'Check your gh authentication with `gh auth status`'),\n opts.format,\n );\n process.exit(2);\n }\n return;\n }\n\n // Preview mode\n const url = buildIssueUrl(CLI_REPO, title, body);\n\n if (opts.format === 'json') {\n output({ repo: CLI_REPO, title, body, url }, 'json');\n } else if (opts.format === 'markdown') {\n console.log(body);\n } else {\n console.log(`Repository: ${CLI_REPO}`);\n console.log(`Title: ${title}`);\n console.log('');\n console.log('--- Issue Body ---');\n console.log(body);\n console.log('--- End ---');\n console.log('');\n console.log('To submit, re-run with --submit flag.');\n }\n });\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { get } from 'node:https';\nimport { compare, valid } from '../data/version.js';\n\ndeclare const __CLI_VERSION__: string;\n\ninterface UpdateCache {\n lastChecked: number;\n latestVersion: string;\n}\n\nconst CACHE_DIR = join(homedir(), '.config', 'antd-cli');\nconst CACHE_FILE = join(CACHE_DIR, 'update-check.json');\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\nfunction readCache(): UpdateCache | null {\n try {\n if (!existsSync(CACHE_FILE)) return null;\n return JSON.parse(readFileSync(CACHE_FILE, 'utf-8')) as UpdateCache;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(cache: UpdateCache): void {\n try {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n writeFileSync(CACHE_FILE, JSON.stringify(cache), 'utf-8');\n } catch {\n // ignore write errors\n }\n}\n\nfunction fetchLatestVersion(): Promise<string | null> {\n return new Promise((resolve) => {\n const req = get(\n 'https://registry.npmjs.org/@ant-design/cli/latest',\n { timeout: 3000 },\n (res) => {\n if (res.statusCode !== 200) {\n res.resume();\n resolve(null);\n return;\n }\n let data = '';\n res.on('data', (chunk: Buffer) => {\n data += chunk.toString();\n });\n res.on('end', () => {\n try {\n const json = JSON.parse(data) as { version?: string };\n resolve(json.version ?? null);\n } catch {\n resolve(null);\n }\n });\n }\n );\n req.on('error', () => resolve(null));\n req.on('timeout', () => {\n req.destroy();\n resolve(null);\n });\n });\n}\n\nfunction printUpdateNotice(currentVersion: string, latestVersion: string): void {\n const line = ` Update available: ${currentVersion} → ${latestVersion} `;\n const install = ' Run: npm i -g @ant-design/cli ';\n const width = Math.max(line.length, install.length);\n const pad = (s: string) => s + ' '.repeat(width - s.length);\n const bar = '─'.repeat(width);\n\n process.stderr.write(`\\n╭${bar}╮\\n`);\n process.stderr.write(`│${pad(line)}│\\n`);\n process.stderr.write(`│${pad(install)}│\\n`);\n process.stderr.write(`╰${bar}╯\\n`);\n}\n\nexport async function checkForUpdate(): Promise<void> {\n // Skip in CI or when explicitly disabled\n if (process.env.CI || process.env.NO_UPDATE_CHECK) return;\n\n const currentVersion = __CLI_VERSION__;\n if (!valid(currentVersion)) return;\n\n const now = Date.now();\n const cache = readCache();\n\n let latestVersion = cache?.latestVersion ?? null;\n\n // Fetch if no cache or cache is stale\n if (!cache || now - cache.lastChecked > CHECK_INTERVAL_MS) {\n const fetched = await fetchLatestVersion();\n writeCache({\n lastChecked: now,\n latestVersion: fetched ?? latestVersion ?? currentVersion,\n });\n if (fetched) latestVersion = fetched;\n }\n\n if (latestVersion && valid(latestVersion) && compare(currentVersion, latestVersion) < 0) {\n printUpdateNotice(currentVersion, latestVersion);\n }\n}\n"],"mappings":"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","names":["readFileSync","existsSync","join","headerLine","separator","bodyLines","program","program","program","program","demo","program","headers","rows","program","program","readFileSync","readdirSync","join","readFileSync","join","join","readdirSync","readFileSync","program","readFileSync","readFileSync","program","readFileSync","readFileSync","program","program","join","program","readFileSync","existsSync","join","join","existsSync","readFileSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/data/loader.ts","../src/output/error.ts","../src/data/version.ts","../src/output/formatter.ts","../src/commands/list.ts","../src/types.ts","../src/commands/info.ts","../src/commands/doc.ts","../src/commands/demo.ts","../src/commands/token.ts","../src/commands/semantic.ts","../src/commands/changelog.ts","../src/commands/doctor.ts","../src/utils/scan.ts","../src/commands/usage.ts","../src/commands/lint.ts","../src/commands/migrate-v4-to-v5.ts","../src/commands/migrate-v5-to-v6.ts","../src/commands/migrate.ts","../src/utils/issue.ts","../src/commands/bug.ts","../src/commands/mcp.ts","../src/mcp/tools.ts","../src/mcp/prompts.ts","../src/utils/update-check.ts"],"sourcesContent":["import { Command, Option } from 'commander';\nimport { registerListCommand } from './commands/list.js';\nimport { registerInfoCommand } from './commands/info.js';\nimport { registerDocCommand } from './commands/doc.js';\nimport { registerDemoCommand } from './commands/demo.js';\nimport { registerTokenCommand } from './commands/token.js';\nimport { registerSemanticCommand } from './commands/semantic.js';\nimport { registerChangelogCommand } from './commands/changelog.js';\nimport { registerDoctorCommand } from './commands/doctor.js';\nimport { registerUsageCommand } from './commands/usage.js';\nimport { registerLintCommand } from './commands/lint.js';\nimport { registerMigrateCommand } from './commands/migrate.js';\nimport { registerBugCommand, registerBugCliCommand } from './commands/bug.js';\nimport { registerMcpCommand } from './commands/mcp.js';\nimport { checkForUpdate } from './utils/update-check.js';\n\ndeclare const __CLI_VERSION__: string;\nconst CLI_VERSION = __CLI_VERSION__;\n\nconst program = new Command();\n\nprogram\n .name('antd')\n .description('CLI tool for querying antd knowledge and analyzing antd usage')\n .option('--format <format>', 'Output format: json, text, or markdown', 'text')\n .option('--version <version>', 'Target antd version (e.g. 5.20.0)')\n .option('--lang <lang>', 'Output language: en or zh', 'en')\n .option('--detail', 'Full information output', false);\n\n// -V for CLI version (--version is used for antd version targeting)\nprogram.addOption(new Option('-V, --cli-version', 'Output the CLI version number'));\n\n// Knowledge Query commands\nregisterListCommand(program);\nregisterInfoCommand(program);\nregisterDocCommand(program);\nregisterDemoCommand(program);\nregisterTokenCommand(program);\nregisterSemanticCommand(program);\nregisterChangelogCommand(program);\n\n// Project Analysis commands\nregisterDoctorCommand(program);\nregisterUsageCommand(program);\nregisterLintCommand(program);\nregisterMigrateCommand(program);\n\n// MCP server\nregisterMcpCommand(program);\n\n// Issue Reporting commands\nregisterBugCommand(program);\nregisterBugCliCommand(program);\n\nprogram.hook('postAction', async () => {\n await checkForUpdate();\n});\n\n// Handle -V before subcommand dispatch\nconst idx = process.argv.indexOf('-V');\nconst idx2 = process.argv.indexOf('--cli-version');\nif (idx !== -1 || idx2 !== -1) {\n // eslint-disable-next-line no-console\n console.log(CLI_VERSION);\n await checkForUpdate();\n process.exit(0);\n}\n\nprogram.parse();\n","import { readFileSync, existsSync } from 'node:fs';\nimport { gunzipSync } from 'node:zlib';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { MetadataStore, ComponentData, CLIError } from '../types.js';\nimport { createError, fuzzyMatch, ErrorCodes } from '../output/error.js';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\nlet cachedDataPath: string | undefined;\n\nfunction getDataPath(): string {\n if (cachedDataPath) return cachedDataPath;\n // Check for a known file to confirm the correct directory\n // Works from both dist/ and src/data/\n // Probe for both .json.gz (published package) and .json (local dev) formats\n const candidates = [\n join(__dirname, '..', 'data'), // from dist/\n join(__dirname, '..', '..', 'data'), // from src/data/\n ];\n cachedDataPath = candidates.find((p) =>\n existsSync(join(p, 'v5.json.gz')) || existsSync(join(p, 'v5.json'))\n ) ?? candidates[0];\n return cachedDataPath;\n}\n\n/** Read a JSON data file, supporting both .json.gz and plain .json formats. */\nfunction readDataFile(filePath: string): string {\n const gzPath = filePath + '.gz';\n if (existsSync(gzPath)) {\n return gunzipSync(readFileSync(gzPath)).toString('utf-8');\n }\n return readFileSync(filePath, 'utf-8');\n}\n\n/** Deduplicate props by name (keep first occurrence). */\nfunction normalizeStore(store: MetadataStore): MetadataStore {\n for (const comp of store.components) {\n const seen = new Set<string>();\n comp.props = comp.props.filter((p) => {\n if (seen.has(p.name)) return false;\n seen.add(p.name);\n return true;\n });\n }\n return store;\n}\n\nexport function loadMetadata(majorVersion: string): MetadataStore {\n const dataPath = join(getDataPath(), `${majorVersion}.json`);\n try {\n return normalizeStore(JSON.parse(readDataFile(dataPath)) as MetadataStore);\n } catch (err) {\n if (err instanceof SyntaxError) {\n process.stderr.write(`[antd-cli] Warning: data file may be corrupted: ${dataPath}\\n`);\n }\n return {\n version: majorVersion,\n majorVersion,\n components: [],\n };\n }\n}\n\n/**\n * Load metadata for the most accurate historical snapshot matching the given full semver version.\n *\n * Resolution order:\n * 1. Exact minor match in versions.json (e.g. \"4.3\" → \"4.3.4\" → data/v4.3.4.json)\n * 2. Nearest earlier minor (e.g. requested 4.2.5 but only 4.1.x exists → use 4.1.x)\n * 3. Fall back to loadMetadata(majorVersion) (i.e. data/v4.json)\n */\nconst metadataCache = new Map<string, MetadataStore>();\n\nexport function loadMetadataForVersion(version: string): MetadataStore {\n const cached = metadataCache.get(version);\n if (cached) return cached;\n\n const result = loadMetadataForVersionUncached(version);\n metadataCache.set(version, result);\n return result;\n}\n\nfunction loadMetadataForVersionUncached(version: string): MetadataStore {\n const parts = version.split('.');\n const major = parts[0];\n const majorVersion = `v${major}`;\n\n // If not a recognisable major.minor.patch string, fall back immediately\n if (!parts[1]) {\n return loadMetadata(majorVersion);\n }\n\n const minorKey = `${major}.${parts[1]}`; // e.g. \"4.3\"\n\n // Load versions index\n const versionsPath = join(getDataPath(), 'versions.json');\n let versionsIndex: Record<string, Record<string, string>> = {};\n try {\n versionsIndex = JSON.parse(readFileSync(versionsPath, 'utf-8'));\n } catch {\n return loadMetadata(majorVersion);\n }\n\n const majorIndex = versionsIndex[majorVersion] ?? {};\n\n // Helper: try to load a snapshot by tag string (e.g. \"4.3.4\")\n function tryLoadSnapshot(tag: string): MetadataStore | null {\n const snapshotPath = join(getDataPath(), `v${tag}.json`);\n if (!existsSync(snapshotPath) && !existsSync(snapshotPath + '.gz')) return null;\n try {\n return normalizeStore(JSON.parse(readDataFile(snapshotPath)) as MetadataStore);\n } catch {\n return null;\n }\n }\n\n // 1. Exact minor match\n if (majorIndex[minorKey]) {\n const result = tryLoadSnapshot(majorIndex[minorKey]);\n if (result) return result;\n }\n\n // 2. Nearest earlier minor\n const requestedMinor = parseInt(parts[1], 10);\n const availableMinors = Object.keys(majorIndex)\n .filter((k) => k.startsWith(`${major}.`))\n .sort((a, b) => parseInt(a.split('.')[1], 10) - parseInt(b.split('.')[1], 10));\n\n let bestMinorKey: string | undefined;\n for (const m of availableMinors) {\n if (parseInt(m.split('.')[1], 10) <= requestedMinor) {\n bestMinorKey = m;\n }\n }\n\n if (bestMinorKey && majorIndex[bestMinorKey]) {\n const result = tryLoadSnapshot(majorIndex[bestMinorKey]);\n if (result) return result;\n }\n\n // 3. Fall back to latest major snapshot\n return loadMetadata(majorVersion);\n}\n\nexport function findComponent(\n store: MetadataStore,\n name: string,\n): ComponentData | undefined {\n return store.components.find(\n (c) => c.name.toLowerCase() === name.toLowerCase(),\n );\n}\n\nexport function getAllComponentNames(store: MetadataStore): string[] {\n return store.components.map((c) => c.name);\n}\n\n/**\n * Load metadata for a version, find a component, and return both.\n * Returns CLIError with fuzzy-match suggestion if the component is not found.\n */\nexport function resolveComponent(\n component: string,\n version: string,\n): { store: MetadataStore; comp: ComponentData } | CLIError {\n const store = loadMetadataForVersion(version);\n const comp = findComponent(store, component);\n if (!comp) {\n const names = getAllComponentNames(store);\n const suggestion = fuzzyMatch(component, names);\n return createError(\n ErrorCodes.COMPONENT_NOT_FOUND,\n `Component '${component}' not found`,\n suggestion ? `Did you mean '${suggestion}'?` : undefined,\n );\n }\n return { store, comp };\n}\n","import type { CLIError } from '../types.js';\n\nexport const ErrorCodes = {\n COMPONENT_NOT_FOUND: 'COMPONENT_NOT_FOUND',\n VERSION_NOT_FOUND: 'VERSION_NOT_FOUND',\n NO_PROJECT_DETECTED: 'NO_PROJECT_DETECTED',\n METADATA_FETCH_FAILED: 'METADATA_FETCH_FAILED',\n UNSUPPORTED_VERSION_FEATURE: 'UNSUPPORTED_VERSION_FEATURE',\n DEMO_NOT_FOUND: 'DEMO_NOT_FOUND',\n INVALID_ARGUMENT: 'INVALID_ARGUMENT',\n TITLE_REQUIRED: 'TITLE_REQUIRED',\n GH_NOT_FOUND: 'GH_NOT_FOUND',\n GH_SUBMIT_FAILED: 'GH_SUBMIT_FAILED',\n DOC_NOT_AVAILABLE: 'DOC_NOT_AVAILABLE',\n UNKNOWN_TOOL: 'UNKNOWN_TOOL',\n} as const;\n\nexport function createError(code: string, message: string, suggestion?: string): CLIError {\n return { error: true, code, message, suggestion };\n}\n\nexport function printError(err: CLIError, format: string): void {\n if (format === 'json') {\n console.error(JSON.stringify(err, null, 2));\n } else {\n console.error(`Error: ${err.message}`);\n if (err.suggestion) {\n console.error(`Suggestion: ${err.suggestion}`);\n }\n }\n}\n\nexport function fuzzyMatch(input: string, candidates: string[]): string | undefined {\n if (candidates.length === 0) return undefined;\n const lower = input.toLowerCase();\n\n // Exact match (case-insensitive)\n const exact = candidates.find((c) => c.toLowerCase() === lower);\n if (exact) return exact;\n\n // Prefix match\n const prefix = candidates.find((c) => c.toLowerCase().startsWith(lower));\n if (prefix) return prefix;\n\n // Contains match\n const contains = candidates.find((c) => c.toLowerCase().includes(lower));\n if (contains) return contains;\n\n // Levenshtein distance for close matches\n // Tie-break by preferring candidates that start with the same letter as input\n let best: string | undefined;\n let bestDist = Infinity;\n for (const candidate of candidates) {\n const dist = levenshtein(lower, candidate.toLowerCase());\n if (dist <= 3) {\n const sameFirstLetter = lower[0] === candidate[0]?.toLowerCase();\n const bestSameFirstLetter = best ? lower[0] === best[0]?.toLowerCase() : false;\n if (dist < bestDist || (dist === bestDist && sameFirstLetter && !bestSameFirstLetter)) {\n bestDist = dist;\n best = candidate;\n }\n }\n }\n return best;\n}\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0));\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] =\n a[i - 1] === b[j - 1]\n ? dp[i - 1][j - 1]\n : 1 + Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]);\n }\n }\n return dp[m][n];\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface VersionInfo {\n version: string;\n majorVersion: string;\n source: 'flag' | 'node_modules' | 'package.json' | 'fallback';\n}\n\nconst FALLBACK_VERSION = '5.24.0';\nconst FALLBACK_MAJOR = 'v5';\n\nexport function detectVersion(flagVersion?: string): VersionInfo {\n // 1. --version flag\n if (flagVersion) {\n return {\n version: flagVersion,\n majorVersion: toMajor(flagVersion),\n source: 'flag',\n };\n }\n\n // 2. node_modules/antd/package.json\n const nmPath = join(process.cwd(), 'node_modules', 'antd', 'package.json');\n if (existsSync(nmPath)) {\n try {\n const pkg = JSON.parse(readFileSync(nmPath, 'utf-8'));\n if (pkg.version) {\n return {\n version: pkg.version,\n majorVersion: toMajor(pkg.version),\n source: 'node_modules',\n };\n }\n } catch {\n // ignore parse errors\n }\n }\n\n // 3. Project package.json dependencies\n const pkgPath = join(process.cwd(), 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n const depVersion =\n pkg.dependencies?.antd || pkg.devDependencies?.antd || pkg.peerDependencies?.antd;\n if (depVersion) {\n const cleaned = depVersion.replace(/[\\^~>=<\\s]/g, '');\n return {\n version: cleaned,\n majorVersion: toMajor(cleaned),\n source: 'package.json',\n };\n }\n } catch {\n // ignore parse errors\n }\n }\n\n // 4. Fallback to latest\n return {\n version: FALLBACK_VERSION,\n majorVersion: FALLBACK_MAJOR,\n source: 'fallback',\n };\n}\n\nfunction toMajor(version: string): string {\n const major = version.split('.')[0];\n return `v${major}`;\n}\n\n/** Simple semver comparison. Returns -1, 0, or 1. */\nexport function compare(a: string, b: string): number {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n const na = pa[i] || 0;\n const nb = pb[i] || 0;\n if (na < nb) return -1;\n if (na > nb) return 1;\n }\n return 0;\n}\n\n/** Check if a string looks like a valid semver. */\nexport function valid(version: string): boolean {\n return /^\\d+\\.\\d+\\.\\d+/.test(version);\n}\n\n/**\n * Check if a version string satisfies a semver range.\n * Supports: >=, >, ^, ~, exact x.y.z, bare x, bare x.y\n * Returns true for unrecognized range formats (fail-open).\n */\nexport function satisfies(version: string, range: string): boolean {\n range = range.trim();\n version = version.trim();\n\n if (range.startsWith('>=')) {\n const bound = range.slice(2).trim();\n return compare(version, bound) >= 0;\n }\n if (range.startsWith('>')) {\n const bound = range.slice(1).trim();\n return compare(version, bound) > 0;\n }\n if (range.startsWith('^')) {\n const bound = range.slice(1).trim();\n const vParts = version.split('.').map(Number);\n const bParts = bound.split('.').map(Number);\n if (vParts[0] !== bParts[0]) return false;\n return compare(version, bound) >= 0;\n }\n if (range.startsWith('~')) {\n const bound = range.slice(1).trim();\n const vParts = version.split('.').map(Number);\n const bParts = bound.split('.').map(Number);\n if (vParts[0] !== bParts[0] || vParts[1] !== bParts[1]) return false;\n return compare(version, bound) >= 0;\n }\n // bare major (e.g. \"5\") or major.minor (e.g. \"5.1\")\n const parts = range.split('.');\n if (parts.length <= 2 && parts.every(p => /^\\d+$/.test(p))) {\n const vParts = version.split('.').map(Number);\n const rParts = parts.map(Number);\n if (vParts[0] !== rParts[0]) return false;\n if (rParts.length === 2 && vParts[1] !== rParts[1]) return false;\n return true;\n }\n // exact version (x.y.z)\n if (/^\\d+\\.\\d+\\.\\d+/.test(range)) {\n return compare(version, range) === 0;\n }\n // Unrecognized range — fail-open\n return true;\n}\n","import type { OutputFormat } from '../types.js';\n\nfunction formatOutput(data: unknown, format: OutputFormat): string {\n switch (format) {\n case 'json':\n return JSON.stringify(data, null, 2);\n case 'markdown':\n return formatAsMarkdown(data);\n case 'text':\n default:\n return formatAsText(data);\n }\n}\n\nfunction formatAsText(data: unknown): string {\n if (typeof data === 'string') return data;\n if (Array.isArray(data)) return data.map((item) => formatAsText(item)).join('\\n');\n if (typeof data === 'object' && data !== null) {\n return Object.entries(data)\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return `${key}:\\n${value.map((v) => ` ${formatAsText(v)}`).join('\\n')}`;\n }\n return `${key}: ${value}`;\n })\n .join('\\n');\n }\n return String(data);\n}\n\nfunction formatAsMarkdown(data: unknown): string {\n if (typeof data === 'string') return data;\n if (typeof data === 'object' && data !== null) {\n return '```json\\n' + JSON.stringify(data, null, 2) + '\\n```';\n }\n return String(data);\n}\n\nexport function formatTable(\n headers: string[],\n rows: string[][],\n format: OutputFormat,\n): string {\n if (format === 'json') {\n return JSON.stringify(\n rows.map((row) => {\n const obj: Record<string, string> = {};\n headers.forEach((h, i) => {\n obj[h] = row[i];\n });\n return obj;\n }),\n null,\n 2,\n );\n }\n\n if (format === 'markdown') {\n // Escape pipe characters in cell content to avoid breaking markdown tables\n const escPipe = (s: string) => s.replace(/\\|/g, '\\\\|');\n const headerLine = '| ' + headers.map(escPipe).join(' | ') + ' |';\n const separator = '| ' + headers.map(() => '---').join(' | ') + ' |';\n const bodyLines = rows.map((row) => '| ' + row.map(escPipe).join(' | ') + ' |');\n return [headerLine, separator, ...bodyLines].join('\\n');\n }\n\n // Text format: aligned columns\n const colWidths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] || '').length)),\n );\n const headerLine = headers.map((h, i) => h.padEnd(colWidths[i])).join(' ');\n const separator = colWidths.map((w) => '-'.repeat(w)).join(' ');\n const bodyLines = rows.map((row) =>\n row.map((cell, i) => (cell || '').padEnd(colWidths[i])).join(' '),\n );\n return [headerLine, separator, ...bodyLines].join('\\n');\n}\n\nexport function output(data: unknown, format: OutputFormat): void {\n console.log(formatOutput(data, format));\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { loadMetadataForVersion } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { formatTable, output } from '../output/formatter.js';\n\nexport interface ComponentSummary {\n name: string;\n nameZh: string;\n description: string;\n descriptionZh: string;\n since: string;\n category: string;\n}\n\n/**\n * Core function: list all components for a given antd version.\n * Returns an array of ComponentSummary objects. Never writes to stdout.\n */\nexport function listComponents(opts: { version: string }): ComponentSummary[] {\n const store = loadMetadataForVersion(opts.version);\n return store.components.map((c) => ({\n name: c.name,\n nameZh: c.nameZh ?? '',\n description: c.description,\n descriptionZh: c.descriptionZh ?? '',\n since: c.since ?? '',\n category: c.category ?? '',\n }));\n}\n\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .description('List all components with bilingual names, descriptions, and first-supported version')\n .action(() => {\n const opts = program.opts<GlobalOptions>();\n const versionInfo = detectVersion(opts.version);\n const components = listComponents({ version: versionInfo.version });\n\n if (components.length === 0) {\n if (opts.format === 'json') {\n output([], 'json');\n } else {\n console.log('No component data available.');\n }\n return;\n }\n\n if (opts.format === 'json') {\n output(components, 'json');\n return;\n }\n\n if (opts.format === 'markdown') {\n const lines: string[] = [\n `# antd Components (${versionInfo.version})`,\n '',\n '| Component | 组件名 | Description | Since |',\n '|-----------|--------|-------------|-------|',\n ];\n for (const c of components) {\n const desc = c.description || c.descriptionZh || '';\n lines.push(`| **${c.name}** | ${c.nameZh} | ${desc} | ${c.since} |`);\n }\n console.log(lines.join('\\n'));\n return;\n }\n\n // Text format\n const headers = ['Component', '组件名', 'Description', 'Since'];\n const rows = components.map((c) => [\n c.name,\n c.nameZh,\n c.description,\n c.since,\n ]);\n console.log(formatTable(headers, rows, 'text'));\n });\n}\n","export interface PropData {\n name: string;\n type: string;\n default: string;\n description?: string;\n descriptionZh?: string;\n since?: string;\n deprecated?: boolean | string;\n required?: boolean;\n}\n\nexport interface DemoData {\n name: string;\n title: string;\n titleZh?: string;\n description: string;\n descriptionZh?: string;\n code: string;\n}\n\nexport interface TokenData {\n name: string;\n type: string;\n default: string;\n description?: string;\n descriptionZh?: string;\n}\n\nexport interface SemanticKey {\n key: string;\n description: string;\n descriptionZh?: string;\n}\n\nexport interface ComponentData {\n name: string;\n nameZh?: string;\n since?: string;\n category: string;\n categoryZh?: string;\n description: string;\n descriptionZh?: string;\n whenToUse?: string;\n whenToUseZh?: string;\n props: PropData[];\n methods?: { name: string; description: string; type: string }[];\n demos?: DemoData[];\n tokens?: TokenData[];\n semanticStructure?: SemanticKey[];\n related?: string[];\n faq?: { question: string; answer: string }[];\n subComponents?: string[];\n subComponentProps?: Record<string, PropData[]>;\n doc?: string;\n docZh?: string;\n}\n\n/** Pick the right text based on language. Falls back to English. */\nexport function localize(en: string | undefined, zh: string | undefined, lang: string): string {\n if (lang === 'zh' && zh) return zh;\n return en || '';\n}\n\nexport interface ChangelogEntry {\n version: string;\n date: string;\n changes: {\n component: string;\n type: 'feature' | 'fix' | 'style' | 'deprecation' | 'breaking' | 'other';\n description: string;\n }[];\n}\n\nexport interface MetadataStore {\n version: string;\n majorVersion: string;\n components: ComponentData[];\n globalTokens?: TokenData[];\n changelog?: ChangelogEntry[];\n}\n\nexport type OutputFormat = 'json' | 'text' | 'markdown';\n\nexport interface GlobalOptions {\n format: OutputFormat;\n version?: string;\n lang: 'en' | 'zh';\n detail: boolean;\n}\n\nexport interface CLIError {\n error: true;\n code: string;\n message: string;\n suggestion?: string;\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions, PropData, CLIError } from '../types.js';\nimport { localize } from '../types.js';\nimport { resolveComponent } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { printError } from '../output/error.js';\nimport { formatTable, output } from '../output/formatter.js';\n\nexport interface ComponentInfoConcise {\n name: string;\n nameZh: string;\n description: string;\n props: { name: string; type: string; default: string; since: string }[];\n subComponentProps?: Record<string, { name: string; type: string; default: string }[]>;\n}\n\nexport interface ComponentInfoDetail {\n name: string;\n nameZh: string;\n description: string;\n whenToUse: string;\n props: (PropData & { description: string })[];\n subComponentProps?: Record<string, (PropData & { description: string })[]>;\n methods: { name: string; description: string; type: string }[];\n related: string[];\n faq: { question: string; answer: string }[];\n}\n\n/**\n * Core function: get component info.\n * Returns component data or CLIError. Never writes to stdout.\n */\nexport function getComponentInfo(\n component: string,\n opts: { lang: string; version: string; detail: boolean },\n): ComponentInfoConcise | ComponentInfoDetail | CLIError {\n const resolved = resolveComponent(component, opts.version);\n if ('error' in resolved) return resolved;\n const { comp } = resolved;\n\n const desc = localize(comp.description, comp.descriptionZh, opts.lang);\n const whenToUse = localize(comp.whenToUse, comp.whenToUseZh, opts.lang);\n\n if (opts.detail) {\n return {\n name: comp.name,\n nameZh: comp.nameZh ?? '',\n description: desc,\n whenToUse: whenToUse || '',\n props: comp.props.map((p) => ({\n ...p,\n description: localize(p.description, p.descriptionZh, opts.lang),\n })),\n subComponentProps: comp.subComponentProps\n ? Object.fromEntries(\n Object.entries(comp.subComponentProps).map(([name, props]) => [\n name,\n props.map((p) => ({ ...p, description: localize(p.description, p.descriptionZh, opts.lang) })),\n ]),\n )\n : undefined,\n methods: comp.methods || [],\n related: comp.related || [],\n faq: comp.faq || [],\n };\n }\n\n return {\n name: comp.name,\n nameZh: comp.nameZh ?? '',\n description: desc,\n props: comp.props.map((p) => ({\n name: p.name,\n type: p.type,\n default: p.default,\n since: p.since ?? '',\n })),\n subComponentProps: comp.subComponentProps\n ? Object.fromEntries(\n Object.entries(comp.subComponentProps).map(([name, props]) => [\n name,\n props.map((p) => ({ name: p.name, type: p.type, default: p.default })),\n ]),\n )\n : undefined,\n };\n}\n\nexport function registerInfoCommand(program: Command): void {\n program\n .command('info <component>')\n .description('Query component API: props, type definitions, default values')\n .action((component: string) => {\n const opts = program.opts<GlobalOptions>();\n const lang = opts.lang;\n const versionInfo = detectVersion(opts.version);\n const result = getComponentInfo(component, {\n lang,\n version: versionInfo.version,\n detail: opts.detail,\n });\n\n if ('error' in result) {\n printError(result, opts.format);\n process.exitCode = 1;\n return;\n }\n\n if (opts.format === 'json') {\n output(result, 'json');\n return;\n }\n\n // Text/markdown format — use result fields to avoid re-loading metadata\n const fmt = opts.format === 'markdown' ? 'markdown' : 'text';\n const nameLabel = result.nameZh ? `${result.name} (${result.nameZh})` : result.name;\n console.log(`${nameLabel} — ${result.description}`);\n if (opts.detail && 'whenToUse' in result && result.whenToUse) {\n console.log(`\\nWhen to use: ${result.whenToUse}`);\n }\n console.log('');\n\n const headers = opts.detail\n ? ['Property', 'Type', 'Default', 'Since', 'Description']\n : ['Property', 'Type', 'Default', 'Since'];\n\n const rows: string[][] = result.props.map((p): string[] => {\n const s = ('since' in p && p.since) ? String(p.since) : '-';\n return opts.detail && 'description' in p\n ? [p.name, p.type, p.default, s, (p as { description: string }).description || '-']\n : [p.name, p.type, p.default, s];\n });\n console.log(formatTable(headers, rows, fmt));\n\n if (result.subComponentProps) {\n for (const [subName, subProps] of Object.entries(result.subComponentProps)) {\n console.log(`\\n${subName}`);\n console.log('');\n const subRows: string[][] = subProps.map((p): string[] => {\n const prop = p as { name: string; type: string; default: string; since?: string; description?: string };\n return opts.detail\n ? [prop.name, prop.type, prop.default, prop.since || '-', prop.description || '-']\n : [prop.name, prop.type, prop.default, prop.since || '-'];\n });\n console.log(formatTable(headers, subRows, fmt));\n }\n }\n\n if (opts.detail && 'related' in result && result.related.length > 0) {\n console.log(`\\nRelated: ${result.related.join(', ')}`);\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions, CLIError } from '../types.js';\nimport { localize } from '../types.js';\nimport { resolveComponent } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { createError, printError, ErrorCodes } from '../output/error.js';\nimport { output } from '../output/formatter.js';\n\nexport interface ComponentDoc {\n name: string;\n doc: string;\n}\n\n/**\n * Core function: get component documentation in markdown.\n * Returns { name, doc } or CLIError. Never writes to stdout.\n */\nexport function getComponentDoc(\n component: string,\n opts: { lang: string; version: string },\n): ComponentDoc | CLIError {\n const resolved = resolveComponent(component, opts.version);\n if ('error' in resolved) return resolved;\n const { comp } = resolved;\n\n const doc = localize(comp.doc, comp.docZh, opts.lang);\n\n if (!doc) {\n return createError(\n ErrorCodes.DOC_NOT_AVAILABLE,\n `Documentation not available for '${comp.name}'`,\n 'Try upgrading to a newer version of the CLI',\n );\n }\n\n return { name: comp.name, doc };\n}\n\nexport function registerDocCommand(program: Command): void {\n program\n .command('doc <component>')\n .description('Output the full API documentation for a component in markdown')\n .action((component: string) => {\n const opts = program.opts<GlobalOptions>();\n const lang = opts.lang;\n const versionInfo = detectVersion(opts.version);\n const result = getComponentDoc(component, {\n lang,\n version: versionInfo.version,\n });\n\n if ('error' in result) {\n printError(result, opts.format);\n process.exitCode = 1;\n return;\n }\n\n if (opts.format === 'json') {\n output({ name: result.name, doc: result.doc }, 'json');\n return;\n }\n\n process.stdout.write(result.doc + '\\n');\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions, CLIError } from '../types.js';\nimport { resolveComponent } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { createError, printError, fuzzyMatch, ErrorCodes } from '../output/error.js';\nimport { output } from '../output/formatter.js';\n\nexport interface DemoListResult {\n component: string;\n demos: { name: string; title: string; description: string }[];\n}\n\nexport interface DemoResult {\n component: string;\n demo: string;\n title: string;\n description: string;\n code: string;\n}\n\n/**\n * Core function: get component demos.\n * If name is omitted, returns list of all demos.\n * If name is provided, returns specific demo with code.\n * Returns data or CLIError. Never writes to stdout.\n */\nexport function getComponentDemo(\n component: string,\n opts: { version: string; name?: string },\n): DemoListResult | DemoResult | CLIError {\n const resolved = resolveComponent(component, opts.version);\n if ('error' in resolved) return resolved;\n const { comp } = resolved;\n\n const demos = comp.demos || [];\n\n if (!opts.name) {\n return {\n component: comp.name,\n demos: demos.map((d) => ({\n name: d.name,\n title: d.title,\n description: d.description,\n })),\n };\n }\n\n const demo = demos.find((d) => d.name.toLowerCase() === opts.name!.toLowerCase());\n if (!demo) {\n const demoNames = demos.map((d) => d.name);\n const suggestion = fuzzyMatch(opts.name, demoNames);\n return createError(\n ErrorCodes.DEMO_NOT_FOUND,\n `Demo '${opts.name}' not found for ${comp.name}`,\n suggestion\n ? `Did you mean '${suggestion}'?`\n : `Available demos: ${demoNames.join(', ') || 'none'}`,\n );\n }\n\n return {\n component: comp.name,\n demo: demo.name,\n title: demo.title,\n description: demo.description,\n code: demo.code,\n };\n}\n\nexport function registerDemoCommand(program: Command): void {\n program\n .command('demo <component> [name]')\n .description('Get demo source code for a component')\n .action((component: string, name?: string) => {\n const opts = program.opts<GlobalOptions>();\n const versionInfo = detectVersion(opts.version);\n const result = getComponentDemo(component, {\n version: versionInfo.version,\n name,\n });\n\n if ('error' in result) {\n printError(result, opts.format);\n process.exitCode = 1;\n return;\n }\n\n if ('code' in result) {\n // Single demo result\n if (opts.format === 'json') {\n output(result, 'json');\n } else {\n console.log(`${result.component} / ${result.title}`);\n console.log(`${result.description}`);\n console.log('');\n console.log(result.code);\n }\n } else {\n // Demo list result\n if (opts.format === 'json') {\n output(result, 'json');\n } else {\n console.log(`${result.component} Demos:`);\n console.log('');\n for (const demo of result.demos) {\n console.log(` ${demo.name} — ${demo.title}`);\n console.log(` ${demo.description}`);\n }\n if (result.demos.length === 0) {\n console.log(' No demos available.');\n }\n }\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions, CLIError, TokenData } from '../types.js';\nimport { localize } from '../types.js';\nimport { loadMetadataForVersion, resolveComponent } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { createError, printError, ErrorCodes } from '../output/error.js';\nimport { formatTable, output } from '../output/formatter.js';\n\nexport interface GlobalTokensResult {\n tokens: TokenData[];\n}\n\nexport interface ComponentTokensResult {\n component: string;\n tokens: TokenData[];\n}\n\n/**\n * Core function: get design tokens (global or component-level).\n * Returns token data or CLIError. Never writes to stdout.\n */\nexport function getTokens(\n component: string | undefined,\n opts: { lang: string; version: string },\n): GlobalTokensResult | ComponentTokensResult | CLIError {\n const major = `v${opts.version.split('.')[0]}`;\n\n if (major === 'v4') {\n return createError(\n ErrorCodes.UNSUPPORTED_VERSION_FEATURE,\n 'Design Token system is not available in antd v4',\n 'Upgrade to antd v5+ to use Design Tokens',\n );\n }\n\n if (!component) {\n const store = loadMetadataForVersion(opts.version);\n const globalTokens = store.globalTokens || [];\n return { tokens: globalTokens };\n }\n\n const resolved = resolveComponent(component, opts.version);\n if ('error' in resolved) return resolved;\n const { comp } = resolved;\n\n const tokens = comp.tokens || [];\n return { component: comp.name, tokens };\n}\n\nexport function registerTokenCommand(program: Command): void {\n program\n .command('token [component]')\n .description('Query Design Tokens (global or component-level)')\n .action((component?: string) => {\n const opts = program.opts<GlobalOptions>();\n const versionInfo = detectVersion(opts.version);\n const result = getTokens(component, {\n lang: opts.lang,\n version: versionInfo.version,\n });\n\n if ('error' in result) {\n printError(result, opts.format);\n process.exitCode = 1;\n return;\n }\n\n if ('component' in result) {\n // Component tokens\n if (result.tokens.length === 0) {\n console.log(`No component tokens available for ${result.component}.`);\n return;\n }\n if (opts.format === 'json') {\n output(result, 'json');\n return;\n }\n console.log(`${result.component} Component Tokens:`);\n console.log('');\n const headers = ['Token', 'Type', 'Default'];\n const rows = result.tokens.map((t) => [t.name, t.type, t.default]);\n console.log(formatTable(headers, rows, opts.format === 'markdown' ? 'markdown' : 'text'));\n } else {\n // Global tokens\n if (result.tokens.length === 0) {\n console.log('No global token data available.');\n return;\n }\n if (opts.format === 'json') {\n output(result, 'json');\n return;\n }\n console.log('Global Design Tokens:');\n console.log('');\n const headers = ['Token', 'Type', 'Default', 'Description'];\n const rows = result.tokens.map((t) => [\n t.name,\n t.type,\n t.default,\n localize(t.description, t.descriptionZh, opts.lang) || '-',\n ]);\n console.log(formatTable(headers, rows, opts.format === 'markdown' ? 'markdown' : 'text'));\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions, CLIError, SemanticKey } from '../types.js';\nimport { resolveComponent } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { printError } from '../output/error.js';\nimport { output } from '../output/formatter.js';\n\nexport interface SemanticStructureResult {\n name: string;\n semanticStructure: SemanticKey[];\n}\n\n/**\n * Core function: get semantic customization structure of a component.\n * Returns data or CLIError. Never writes to stdout.\n */\nexport function getSemanticStructure(\n component: string,\n opts: { version: string },\n): SemanticStructureResult | CLIError {\n const resolved = resolveComponent(component, opts.version);\n if ('error' in resolved) return resolved;\n const { comp } = resolved;\n\n const structure = comp.semanticStructure || [];\n return { name: comp.name, semanticStructure: structure };\n}\n\nexport function registerSemanticCommand(program: Command): void {\n program\n .command('semantic <component>')\n .description('Query the semantic customization structure of a component')\n .action((component: string) => {\n const opts = program.opts<GlobalOptions>();\n const versionInfo = detectVersion(opts.version);\n const result = getSemanticStructure(component, {\n version: versionInfo.version,\n });\n\n if ('error' in result) {\n printError(result, opts.format);\n process.exitCode = 1;\n return;\n }\n\n if (result.semanticStructure.length === 0) {\n console.log(`No semantic structure data available for ${result.name}.`);\n return;\n }\n\n if (opts.format === 'json') {\n output(result, 'json');\n return;\n }\n\n console.log(`${result.name} Semantic Structure:`);\n const structure = result.semanticStructure;\n for (let i = 0; i < structure.length; i++) {\n const prefix = i === structure.length - 1 ? '└──' : '├──';\n console.log(`${prefix} ${structure[i].key} # ${structure[i].description}`);\n }\n console.log('');\n console.log('Usage:');\n console.log(` <${result.name} classNames={{ ${structure[0]?.key}: 'my-${structure[0]?.key}' }} />`);\n console.log(` <${result.name} styles={{ ${structure[0]?.key}: { background: '#fff' } }} />`);\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions, ComponentData, PropData, ChangelogEntry, CLIError } from '../types.js';\nimport { loadMetadataForVersion, findComponent, getAllComponentNames } from '../data/loader.js';\nimport { detectVersion, compare } from '../data/version.js';\nimport { output } from '../output/formatter.js';\nimport { createError, printError, fuzzyMatch, ErrorCodes } from '../output/error.js';\n\n// ── Changelog logic ──\n\nfunction parseVersionRange(version: string): { from: string; to: string } | { exact: string } {\n if (version.includes('..')) {\n const [from, to] = version.split('..');\n return { from, to };\n }\n return { exact: version };\n}\n\nfunction filterEntries(changelog: ChangelogEntry[], versionArg?: string): ChangelogEntry[] {\n if (!versionArg) return changelog.slice(0, 5);\n\n const parsed = parseVersionRange(versionArg);\n if ('exact' in parsed) {\n return changelog.filter((e) => e.version === parsed.exact);\n }\n return changelog.filter(\n (e) => compare(e.version, parsed.from) >= 0 && compare(e.version, parsed.to) <= 0,\n );\n}\n\nconst EMOJI_MAP: Record<string, string> = {\n feature: '🆕',\n fix: '🐞',\n style: '💄',\n deprecation: '🗑',\n breaking: '🔥',\n other: '🛠',\n};\n\n// ── API diff logic ──\n\nexport interface PropDiff {\n name: string;\n type?: string;\n replacement?: string;\n change?: string;\n}\n\nexport interface ComponentDiff {\n component: string;\n added: PropDiff[];\n removed: PropDiff[];\n changed: PropDiff[];\n}\n\nexport interface ChangelogResult {\n entries: ChangelogEntry[];\n versionArg?: string;\n}\n\nexport interface DiffResult {\n from: string;\n to: string;\n diffs: ComponentDiff[];\n component?: string;\n}\n\nfunction diffProps(\n oldProps: PropData[],\n newProps: PropData[],\n): { added: PropDiff[]; removed: PropDiff[]; changed: PropDiff[] } {\n const oldMap = new Map(oldProps.map((p) => [p.name, p]));\n const newMap = new Map(newProps.map((p) => [p.name, p]));\n\n const added: PropDiff[] = [];\n const removed: PropDiff[] = [];\n const changed: PropDiff[] = [];\n\n for (const [name, prop] of newMap) {\n if (!oldMap.has(name)) {\n added.push({ name, type: prop.type });\n } else {\n const oldProp = oldMap.get(name)!;\n if (oldProp.type !== prop.type) {\n changed.push({ name, change: `${oldProp.type} → ${prop.type}` });\n }\n }\n }\n\n for (const [name, prop] of oldMap) {\n if (!newMap.has(name)) {\n const possibleRename = [...newMap.values()].find(\n (p) => p.type === prop.type && !oldMap.has(p.name),\n );\n removed.push({ name, type: prop.type, replacement: possibleRename?.name });\n }\n }\n\n return { added, removed, changed };\n}\n\n/**\n * Core function: query changelog entries.\n * Returns changelog data or CLIError. Never writes to stdout.\n */\nexport function queryChangelog(opts: {\n snapshotVersion: string;\n entryFilter?: string;\n}): ChangelogResult | CLIError {\n const store = loadMetadataForVersion(opts.snapshotVersion);\n const changelog = store.changelog || [];\n\n if (changelog.length === 0) {\n return createError(\n ErrorCodes.VERSION_NOT_FOUND,\n 'No changelog data available',\n );\n }\n\n const entries = filterEntries(changelog, opts.entryFilter);\n if (entries.length === 0) {\n return createError(\n ErrorCodes.VERSION_NOT_FOUND,\n `No changelog entries found for \"${opts.entryFilter}\"`,\n `Available versions: ${changelog.map((e) => e.version).join(', ')}`,\n );\n }\n\n return { entries, versionArg: opts.entryFilter };\n}\n\n/**\n * Core function: diff API between two versions.\n * Returns diff data or CLIError. Never writes to stdout.\n */\nexport function diffChangelog(opts: {\n v1: string;\n v2: string;\n component?: string;\n}): DiffResult | CLIError {\n // Validate version order\n if (compare(opts.v1, opts.v2) > 0) {\n return createError(\n ErrorCodes.INVALID_ARGUMENT,\n `Version order is invalid: \"${opts.v1}\" is newer than \"${opts.v2}\"`,\n `Swap the versions: v1=${opts.v2}, v2=${opts.v1}`,\n );\n }\n\n const store1 = loadMetadataForVersion(opts.v1);\n const store2 = loadMetadataForVersion(opts.v2);\n\n if (store1.components.length === 0) {\n return createError(ErrorCodes.VERSION_NOT_FOUND, `No data available for version ${opts.v1}`);\n }\n if (store2.components.length === 0) {\n return createError(ErrorCodes.VERSION_NOT_FOUND, `No data available for version ${opts.v2}`);\n }\n\n const componentsToCompare: string[] = opts.component\n ? [opts.component]\n : [...new Set([...getAllComponentNames(store1), ...getAllComponentNames(store2)])];\n\n if (opts.component) {\n const c1 = findComponent(store1, opts.component);\n const c2 = findComponent(store2, opts.component);\n if (!c1 && !c2) {\n const allNames = [...new Set([...getAllComponentNames(store1), ...getAllComponentNames(store2)])];\n const suggestion = fuzzyMatch(opts.component, allNames);\n return createError(\n ErrorCodes.COMPONENT_NOT_FOUND,\n `Component '${opts.component}' not found in either version`,\n suggestion ? `Did you mean '${suggestion}'?` : undefined,\n );\n }\n }\n\n const diffs: ComponentDiff[] = [];\n for (const name of componentsToCompare) {\n const c1 = findComponent(store1, name);\n const c2 = findComponent(store2, name);\n\n if (!c1 && c2) {\n diffs.push({ component: name, added: c2.props.map((p) => ({ name: p.name, type: p.type })), removed: [], changed: [] });\n } else if (c1 && !c2) {\n diffs.push({ component: name, added: [], removed: c1.props.map((p) => ({ name: p.name, type: p.type })), changed: [] });\n } else if (c1 && c2) {\n const { added, removed, changed } = diffProps(c1.props, c2.props);\n if (added.length > 0 || removed.length > 0 || changed.length > 0) {\n diffs.push({ component: name, added, removed, changed });\n }\n }\n }\n\n return { from: opts.v1, to: opts.v2, diffs, component: opts.component };\n}\n\n// ── Printing helpers (CLI only) ──\n\nfunction printChangelogEntries(entries: ChangelogEntry[], format: string, versionArg?: string): void {\n if (format === 'json') {\n output(versionArg ? entries : { latest: entries }, 'json');\n return;\n }\n for (const entry of entries) {\n console.log(`## ${entry.version} (${entry.date})`);\n console.log('');\n for (const change of entry.changes) {\n const emoji = EMOJI_MAP[change.type] || '•';\n console.log(` ${emoji} ${change.component} ${change.description}`);\n }\n console.log('');\n }\n}\n\nfunction printApiDiff(result: DiffResult, format: string): void {\n if (format === 'json') {\n const jsonResult = result.component && result.diffs.length > 0\n ? { from: result.from, to: result.to, ...result.diffs[0] }\n : { from: result.from, to: result.to, diffs: result.diffs };\n output(jsonResult, 'json');\n return;\n }\n\n if (result.diffs.length === 0) {\n console.log(`No API differences found between ${result.from} and ${result.to}.`);\n return;\n }\n\n console.log(`API Diff: ${result.from} → ${result.to}`);\n console.log('');\n for (const diff of result.diffs) {\n console.log(` ${diff.component}:`);\n for (const p of diff.added) console.log(` + ${p.name}: ${p.type}`);\n for (const p of diff.removed) {\n const note = p.replacement ? ` (replaced by ${p.replacement})` : '';\n console.log(` - ${p.name}: ${p.type}${note}`);\n }\n for (const p of diff.changed) console.log(` ~ ${p.name}: ${p.change}`);\n console.log('');\n }\n}\n\n// ── Command registration ──\n\nexport function registerChangelogCommand(program: Command): void {\n program\n .command('changelog [v1] [v2] [component]')\n .description('Query changelog or compare API differences between versions')\n .action((v1?: string, v2?: string, component?: string) => {\n const opts = program.opts<GlobalOptions>();\n\n const isChangelogMode = !v2 || (v1 && v1.includes('..'));\n\n if (isChangelogMode) {\n const v1ForDetect = v1?.includes('..') ? v1.split('..')[1] : v1;\n const versionForDetect = opts.version ?? (v1ForDetect && /^\\d+\\.\\d+\\.\\d+$/.test(v1ForDetect) ? v1ForDetect : undefined);\n const versionInfo = detectVersion(versionForDetect);\n\n const result = queryChangelog({\n snapshotVersion: versionInfo.version,\n entryFilter: v1,\n });\n\n if ('error' in result) {\n // Special case: \"No changelog data available\" should just print a message, not a structured error\n if (result.code === ErrorCodes.VERSION_NOT_FOUND && !result.suggestion) {\n console.log('No changelog data available.');\n return;\n }\n printError(result, opts.format);\n process.exitCode = 1;\n return;\n }\n\n printChangelogEntries(result.entries, opts.format, result.versionArg);\n } else {\n const result = diffChangelog({ v1: v1!, v2: v2!, component });\n\n if ('error' in result) {\n printError(result, opts.format);\n process.exitCode = 1;\n return;\n }\n\n printApiDiff(result, opts.format);\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { readFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { output } from '../output/formatter.js';\nimport { readJson } from '../utils/scan.js';\nimport { satisfies } from '../data/version.js';\n\ninterface CheckResult {\n name: string;\n status: 'pass' | 'warn' | 'fail';\n severity?: 'warning' | 'error';\n message: string;\n suggestion?: string;\n}\n\n/** Pre-read context shared across all checks to avoid repeated file I/O. */\ninterface DoctorContext {\n cwd: string;\n antdPkg: any | null;\n antdMajor: number;\n projectPkg: any | null;\n reactPkg: any | null;\n cssinjsPkg: any | null;\n iconsPkg: any | null;\n ecosystemPackages: EcosystemPackage[];\n}\n\ninterface EcosystemPackage {\n name: string; // e.g. \"@ant-design/pro-components\"\n shortName: string; // e.g. \"pro-components\"\n version: string;\n peerDependencies: Record<string, string>;\n peerDependenciesMeta: Record<string, { optional?: boolean }>;\n}\n\n/**\n * Read the installed version of a package from node_modules.\n * Returns null if not installed. Handles scoped packages (e.g. \"@ant-design/cssinjs\").\n */\nfunction getInstalledVersion(cwd: string, pkgName: string): string | null {\n const pkg = readJson(join(cwd, 'node_modules', pkgName, 'package.json'));\n return pkg?.version ?? null;\n}\n\n/**\n * Scan node_modules/@ant-design/ for all installed scoped packages that declare peerDependencies.\n * Packages with no peerDependencies are skipped (no check emitted for them).\n * Note: antd itself lives at node_modules/antd/, not here, so it will never appear in this scan.\n */\nfunction scanEcosystemPackages(cwd: string): EcosystemPackage[] {\n const scopeDir = join(cwd, 'node_modules', '@ant-design');\n let entries: string[];\n try {\n entries = readdirSync(scopeDir);\n } catch {\n return [];\n }\n\n const result: EcosystemPackage[] = [];\n for (const entry of entries) {\n if (entry.startsWith('.')) continue;\n const pkg = readJson(join(scopeDir, entry, 'package.json'));\n if (!pkg?.version) continue;\n const peerDeps: Record<string, string> = pkg.peerDependencies ?? {};\n if (Object.keys(peerDeps).length === 0) continue;\n result.push({\n name: `@ant-design/${entry}`,\n shortName: entry,\n version: pkg.version,\n peerDependencies: peerDeps,\n peerDependenciesMeta: pkg.peerDependenciesMeta ?? {},\n });\n }\n return result;\n}\n\nfunction buildContext(cwd: string): DoctorContext {\n const antdPkg = readJson(join(cwd, 'node_modules', 'antd', 'package.json'));\n const antdMajor = antdPkg ? parseInt(antdPkg.version.split('.')[0], 10) : 0;\n const projectPkg = readJson(join(cwd, 'package.json'));\n const reactPkg = readJson(join(cwd, 'node_modules', 'react', 'package.json'));\n const cssinjsPkg = readJson(join(cwd, 'node_modules', '@ant-design', 'cssinjs', 'package.json'));\n const iconsPkg = readJson(join(cwd, 'node_modules', '@ant-design', 'icons', 'package.json'));\n const ecosystemPackages = scanEcosystemPackages(cwd);\n return { cwd, antdPkg, antdMajor, projectPkg, reactPkg, cssinjsPkg, iconsPkg, ecosystemPackages };\n}\n\nfunction checkAntdInstalled(ctx: DoctorContext): CheckResult {\n if (!ctx.antdPkg) {\n return {\n name: 'antd-installed',\n status: 'fail',\n severity: 'error',\n message: 'antd is not installed in node_modules',\n suggestion: 'Run `npm install antd` or `yarn add antd`',\n };\n }\n return {\n name: 'antd-installed',\n status: 'pass',\n message: `antd ${ctx.antdPkg.version || 'unknown'} is installed`,\n };\n}\n\nfunction checkReactCompat(ctx: DoctorContext): CheckResult {\n if (!ctx.antdPkg || !ctx.reactPkg) {\n return {\n name: 'react-compat',\n status: 'warn',\n severity: 'warning',\n message: 'Cannot verify React compatibility — antd or react not found in node_modules',\n };\n }\n\n const reactMajor = parseInt(ctx.reactPkg.version.split('.')[0], 10);\n\n if (ctx.antdMajor >= 5 && reactMajor < 18) {\n return {\n name: 'react-compat',\n status: 'fail',\n severity: 'error',\n message: `React ${ctx.reactPkg.version} may not be compatible with antd ${ctx.antdPkg.version}`,\n suggestion: 'antd 5.x requires React 18+. Consider upgrading React.',\n };\n }\n\n return {\n name: 'react-compat',\n status: 'pass',\n message: `React ${ctx.reactPkg.version} is compatible with antd ${ctx.antdPkg.version}`,\n };\n}\n\n/**\n * Scans top-level node_modules and one level of nested node_modules for\n * installations of pkgPath (e.g. 'dayjs' or '@ant-design/cssinjs').\n * Returns a deduplicated array of distinct version strings found.\n * If the package is not installed anywhere, returns [].\n */\nfunction findDuplicateVersions(cwd: string, pkgPath: string): string[] {\n const versions: string[] = [];\n\n // 1. Top-level install\n const topPkg = readJson(join(cwd, 'node_modules', pkgPath, 'package.json'));\n if (topPkg?.version) versions.push(topPkg.version);\n\n // 2. One level of nesting: node_modules/*/node_modules/<pkgPath>\n const nmDir = join(cwd, 'node_modules');\n try {\n const entries = readdirSync(nmDir);\n for (const entry of entries) {\n if (entry.startsWith('.') || entry === pkgPath) continue;\n const nestedPkg = readJson(join(nmDir, entry, 'node_modules', pkgPath, 'package.json'));\n if (nestedPkg?.version) versions.push(nestedPkg.version);\n }\n } catch {\n // ignore read errors (e.g. node_modules doesn't exist)\n }\n\n // Deduplicate\n return [...new Set(versions)];\n}\n\nfunction checkDuplicateInstall(ctx: DoctorContext): CheckResult {\n const versions = findDuplicateVersions(ctx.cwd, 'antd');\n\n if (versions.length > 1) {\n return {\n name: 'duplicate-install',\n status: 'fail',\n severity: 'error',\n message: `Found ${versions.length} antd installations: ${versions.join(', ')}`,\n suggestion: 'Run `npm dedupe` or check your dependency tree',\n };\n }\n\n return {\n name: 'duplicate-install',\n status: 'pass',\n message: 'No duplicate antd installations detected',\n };\n}\n\nfunction checkThemeConfig(ctx: DoctorContext): CheckResult {\n if (ctx.antdMajor >= 5) {\n // Check for old Less variable customization (should not exist in v5+)\n const lessOverrides = readJson(join(ctx.cwd, 'theme', 'antd.less'));\n const modifyVars = ctx.projectPkg?.theme;\n if (lessOverrides !== null || modifyVars) {\n return {\n name: 'theme-config',\n status: 'warn',\n severity: 'warning',\n message: 'Found Less-based theme customization, but antd v5+ uses Design Tokens',\n suggestion: 'Migrate Less variables to ConfigProvider theme tokens. See https://ant.design/docs/react/migrate-less-variables',\n };\n }\n }\n\n return {\n name: 'theme-config',\n status: 'pass',\n message: 'No theme configuration issues detected',\n };\n}\n\nfunction checkBabelPlugins(ctx: DoctorContext): CheckResult {\n const babelConfigs = ['.babelrc', 'babel.config.js', 'babel.config.json'];\n\n let hasBabelPluginImport = false;\n\n for (const configName of babelConfigs) {\n try {\n const content = readFileSync(join(ctx.cwd, configName), 'utf-8');\n if (content.includes('babel-plugin-import') || content.includes('import, { libraryName')) {\n hasBabelPluginImport = true;\n break;\n }\n } catch { /* file doesn't exist or can't be read */ }\n }\n\n // Also check package.json babel config\n if (!hasBabelPluginImport && ctx.projectPkg?.babel) {\n const babelStr = JSON.stringify(ctx.projectPkg.babel);\n if (babelStr.includes('babel-plugin-import')) {\n hasBabelPluginImport = true;\n }\n }\n\n if (hasBabelPluginImport && ctx.antdMajor >= 5) {\n return {\n name: 'babel-plugin',\n status: 'warn',\n severity: 'warning',\n message: 'babel-plugin-import is configured but not needed for antd v5+',\n suggestion: 'antd v5+ supports tree-shaking natively. Remove babel-plugin-import for antd to reduce build complexity.',\n };\n }\n\n return {\n name: 'babel-plugin',\n status: 'pass',\n message: 'No problematic Babel/webpack antd plugins detected',\n };\n}\n\nfunction checkDayjsDuplicate(ctx: DoctorContext): CheckResult {\n const versions = findDuplicateVersions(ctx.cwd, 'dayjs');\n\n if (versions.length > 1) {\n return {\n name: 'dayjs-duplicate',\n status: 'fail',\n severity: 'error',\n message: `Found ${versions.length} dayjs installations: ${versions.join(', ')}`,\n suggestion: 'Run `npm dedupe` or check your monorepo hoisting config',\n };\n }\n\n return {\n name: 'dayjs-duplicate',\n status: 'pass',\n message: 'No duplicate dayjs installations detected',\n };\n}\n\nfunction checkCssinjsDuplicate(ctx: DoctorContext): CheckResult {\n const versions = findDuplicateVersions(ctx.cwd, '@ant-design/cssinjs');\n\n if (versions.length > 1) {\n return {\n name: 'cssinjs-duplicate',\n status: 'fail',\n severity: 'error',\n message: `Found ${versions.length} @ant-design/cssinjs installations: ${versions.join(', ')}`,\n suggestion: 'Run `npm dedupe` or check your monorepo hoisting config',\n };\n }\n\n return {\n name: 'cssinjs-duplicate',\n status: 'pass',\n message: 'No duplicate @ant-design/cssinjs installations detected',\n };\n}\n\nfunction checkCssinjsCompat(ctx: DoctorContext): CheckResult {\n const range = ctx.antdPkg?.peerDependencies?.['@ant-design/cssinjs'];\n\n if (!ctx.antdPkg || !range) {\n return {\n name: 'cssinjs-compat',\n status: 'pass',\n message: 'No @ant-design/cssinjs peer dependency required by this antd version',\n };\n }\n\n if (!ctx.cssinjsPkg) {\n return {\n name: 'cssinjs-compat',\n status: 'warn',\n severity: 'warning',\n message: `antd ${ctx.antdPkg.version} requires @ant-design/cssinjs but it is not installed`,\n suggestion: 'Run `npm install @ant-design/cssinjs`',\n };\n }\n\n if (!satisfies(ctx.cssinjsPkg.version, range)) {\n return {\n name: 'cssinjs-compat',\n status: 'fail',\n severity: 'error',\n message: `@ant-design/cssinjs ${ctx.cssinjsPkg.version} is not compatible with antd ${ctx.antdPkg.version} (requires ${range})`,\n suggestion: `Run \\`npm install @ant-design/cssinjs\\` (requires ${range})`,\n };\n }\n\n return {\n name: 'cssinjs-compat',\n status: 'pass',\n message: `@ant-design/cssinjs ${ctx.cssinjsPkg.version} is compatible with antd ${ctx.antdPkg.version}`,\n };\n}\n\nfunction checkIconsCompat(ctx: DoctorContext): CheckResult {\n const range = ctx.antdPkg?.peerDependencies?.['@ant-design/icons'];\n\n if (!ctx.antdPkg || !range) {\n return {\n name: 'icons-compat',\n status: 'pass',\n message: 'No @ant-design/icons peer dependency declared',\n };\n }\n\n if (!ctx.iconsPkg) {\n return {\n name: 'icons-compat',\n status: 'pass',\n message: '@ant-design/icons is not installed (optional)',\n };\n }\n\n if (!satisfies(ctx.iconsPkg.version, range)) {\n return {\n name: 'icons-compat',\n status: 'warn',\n severity: 'warning',\n message: `@ant-design/icons ${ctx.iconsPkg.version} may not be compatible with antd ${ctx.antdPkg.version} (requires ${range})`,\n suggestion: `Run \\`npm install @ant-design/icons\\` (requires ${range})`,\n };\n }\n\n return {\n name: 'icons-compat',\n status: 'pass',\n message: `@ant-design/icons ${ctx.iconsPkg.version} is compatible with antd ${ctx.antdPkg.version}`,\n };\n}\n\nfunction checkCssInJs(ctx: DoctorContext): CheckResult {\n if (!ctx.cssinjsPkg) {\n return {\n name: 'cssinjs',\n status: 'warn',\n severity: 'warning',\n message: 'No @ant-design/cssinjs found, SSR style extraction will not work',\n suggestion: 'Install @ant-design/cssinjs if you need SSR support',\n };\n }\n return {\n name: 'cssinjs',\n status: 'pass',\n message: '@ant-design/cssinjs is installed',\n };\n}\n\nfunction checkEcosystemPeerDeps(ctx: DoctorContext): CheckResult[] {\n return ctx.ecosystemPackages.map((pkg) => {\n const failures: string[] = []; // installed but version doesn't satisfy range\n const warnings: string[] = []; // not installed at all\n const failureSuggestions: string[] = [];\n const warningSuggestions: string[] = [];\n\n for (const [dep, range] of Object.entries(pkg.peerDependencies)) {\n const installedVersion = getInstalledVersion(ctx.cwd, dep);\n\n if (installedVersion === null) {\n warnings.push(`${dep} is not installed (requires ${range})`);\n warningSuggestions.push(dep);\n } else if (!satisfies(installedVersion, range)) {\n failures.push(`${dep} requires ${range} (installed: ${installedVersion})`);\n failureSuggestions.push(`npm install ${dep}@\"${range}\"`);\n }\n }\n\n if (failures.length > 0) {\n const allIssues = [...failures, ...warnings].join('; ');\n const suggestionCmds = [...failureSuggestions];\n if (warningSuggestions.length > 0) {\n suggestionCmds.push(`npm install ${warningSuggestions.join(' ')}`);\n }\n return {\n name: `ecosystem-compat:${pkg.shortName}`,\n status: 'fail' as const,\n severity: 'error' as const,\n message: `${pkg.name} ${pkg.version} peerDep issues: ${allIssues}`,\n suggestion: `Run: ${suggestionCmds.join(' && ')}`,\n };\n }\n\n if (warnings.length > 0) {\n return {\n name: `ecosystem-compat:${pkg.shortName}`,\n status: 'warn' as const,\n severity: 'warning' as const,\n message: `${pkg.name} ${pkg.version} peerDep issues: ${warnings.join('; ')}`,\n suggestion: `Run \\`npm install ${warningSuggestions.join(' ')}\\``,\n };\n }\n\n return {\n name: `ecosystem-compat:${pkg.shortName}`,\n status: 'pass' as const,\n message: `${pkg.name} ${pkg.version} satisfies all peerDependencies`,\n };\n });\n}\n\nexport function registerDoctorCommand(program: Command): void {\n program\n .command('doctor')\n .description('Diagnose project-level antd configuration issues')\n .action(() => {\n const opts = program.opts<GlobalOptions>();\n const ctx = buildContext(process.cwd());\n\n const checks: CheckResult[] = [\n checkAntdInstalled(ctx),\n checkReactCompat(ctx),\n checkDuplicateInstall(ctx),\n checkDayjsDuplicate(ctx),\n checkCssinjsDuplicate(ctx),\n checkCssinjsCompat(ctx),\n checkIconsCompat(ctx),\n checkThemeConfig(ctx),\n checkBabelPlugins(ctx),\n checkCssInJs(ctx),\n ...checkEcosystemPeerDeps(ctx),\n ];\n\n const summary = {\n pass: checks.filter((c) => c.status === 'pass').length,\n warn: checks.filter((c) => c.status === 'warn').length,\n fail: checks.filter((c) => c.status === 'fail').length,\n };\n\n if (opts.format === 'json') {\n output({ checks, summary }, 'json');\n return;\n }\n\n const ICONS = { pass: '✓', warn: '⚠', fail: '✗' };\n console.log('antd Doctor\\n');\n\n for (const check of checks) {\n const icon = ICONS[check.status];\n console.log(` ${icon} [${check.name}] ${check.message}`);\n if (check.suggestion) {\n console.log(` → ${check.suggestion}`);\n }\n }\n\n console.log('');\n console.log(`Summary: ${summary.pass} passed, ${summary.warn} warnings, ${summary.fail} failed`);\n });\n}\n","import { readFileSync, readdirSync, statSync } from 'node:fs';\nimport { join, extname } from 'node:path';\n\nexport const SCAN_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx']);\nexport const SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'build', '.next']);\n\n/**\n * Recursively collect source files from a directory or return a single file.\n */\nexport function collectFiles(dir: string): string[] {\n const files: string[] = [];\n try {\n const stat = statSync(dir);\n if (stat.isFile()) return [dir];\n } catch {\n return [];\n }\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name.startsWith('.umi') || SKIP_DIRS.has(entry.name)) continue;\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...collectFiles(fullPath));\n } else if (SCAN_EXTENSIONS.has(extname(entry.name))) {\n files.push(fullPath);\n }\n }\n } catch {\n // ignore permission errors etc\n }\n return files;\n}\n\n/** Get the component name from a JSX element name AST node (e.g. \"Button\", \"Typography.Text\"). */\nexport function getJSXElementName(name: any): string {\n if (name.type === 'JSXMemberExpression') {\n return getJSXElementName(name.object) + '.' + name.property.name;\n }\n if (name.type === 'JSXIdentifier') {\n return name.name;\n }\n return '';\n}\n\n/**\n * Read and parse a JSON file, returning null on failure.\n */\nexport function readJson(path: string): any | null {\n try {\n return JSON.parse(readFileSync(path, 'utf-8'));\n } catch {\n return null;\n }\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { readFileSync } from 'node:fs';\nimport { parseSync, Visitor } from 'oxc-parser';\nimport { output } from '../output/formatter.js';\nimport { collectFiles, getJSXElementName } from '../utils/scan.js';\nimport { loadMetadataForVersion } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\n\ninterface ComponentUsage {\n name: string;\n imports: number;\n files: string[];\n subComponents?: Record<string, number>;\n}\n\nfunction scanFile(filePath: string): Map<string, { count: number; subComponents: Map<string, number> }> {\n const result = new Map<string, { count: number; subComponents: Map<string, number> }>();\n\n let content: string;\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch {\n return result;\n }\n\n if (!content.includes('antd')) return result;\n\n const parsed = parseSync(filePath, content);\n if (parsed.errors.length > 0) return result;\n\n const importedNames = new Set<string>();\n\n const visitor = new Visitor({\n ImportDeclaration(node: any) {\n const source = node.source.value;\n if (source !== 'antd' && !source.startsWith('antd/')) return;\n if (node.importKind === 'type') return;\n\n for (const spec of node.specifiers) {\n if (spec.type === 'ImportSpecifier') {\n if (spec.importKind === 'type') continue;\n const name = spec.imported?.name || spec.local?.name;\n if (name) {\n importedNames.add(name);\n if (!result.has(name)) {\n result.set(name, { count: 0, subComponents: new Map() });\n }\n result.get(name)!.count++;\n }\n }\n }\n },\n\n // Detect sub-component JSX usage: <Form.Item>, <Table.Column>, etc.\n JSXOpeningElement(node: any) {\n const fullName = getJSXElementName(node.name);\n if (!fullName.includes('.')) return;\n const [parent] = fullName.split('.');\n if (importedNames.has(parent)) {\n const entry = result.get(parent);\n if (entry) {\n entry.subComponents.set(fullName, (entry.subComponents.get(fullName) || 0) + 1);\n }\n }\n },\n });\n visitor.visit(parsed.program);\n\n return result;\n}\n\nexport function registerUsageCommand(program: Command): void {\n program\n .command('usage [dir]')\n .description('Scan project for antd component/API usage statistics')\n .option('-f, --filter <component>', 'Filter results to a specific component (e.g. Button)')\n .action((dir?: string, cmdOpts?: { filter?: string }) => {\n const opts = program.opts<GlobalOptions>();\n const targetDir = dir || '.';\n const filterName = cmdOpts?.filter?.toLowerCase();\n\n const versionInfo = detectVersion(opts.version);\n const store = loadMetadataForVersion(versionInfo.version);\n const knownComponents = new Set(store.components.map((c) => c.name));\n for (const comp of store.components) {\n for (const subKey of Object.keys(comp.subComponentProps ?? {})) {\n const leaf = subKey.split('.').pop();\n if (leaf) knownComponents.add(leaf);\n }\n }\n\n const files = collectFiles(targetDir);\n const aggregated = new Map<string, { imports: number; files: Set<string>; subComponents: Map<string, number> }>();\n\n for (const file of files) {\n const fileUsage = scanFile(file);\n for (const [name, data] of fileUsage) {\n if (!aggregated.has(name)) {\n aggregated.set(name, { imports: 0, files: new Set(), subComponents: new Map() });\n }\n const agg = aggregated.get(name)!;\n agg.imports += data.count;\n agg.files.add(file);\n for (const [sub, count] of data.subComponents) {\n agg.subComponents.set(sub, (agg.subComponents.get(sub) || 0) + count);\n }\n }\n }\n\n const toUsage = ([name, data]: [string, { imports: number; files: Set<string>; subComponents: Map<string, number> }]): ComponentUsage => {\n const usage: ComponentUsage = {\n name,\n imports: data.imports,\n files: [...data.files],\n };\n if (data.subComponents.size > 0) {\n usage.subComponents = Object.fromEntries(data.subComponents);\n }\n return usage;\n };\n\n const allEntries = [...aggregated.entries()]\n .filter(([name]) => !filterName || name.toLowerCase() === filterName)\n .sort((a, b) => b[1].imports - a[1].imports);\n\n const components: ComponentUsage[] = allEntries\n .filter(([name]) => knownComponents.has(name))\n .map(toUsage);\n\n const nonComponents: ComponentUsage[] = allEntries\n .filter(([name]) => !knownComponents.has(name))\n .map(toUsage);\n\n const totalImports = components.reduce((sum, c) => sum + c.imports, 0);\n\n if (opts.format === 'json') {\n output({\n scanned: files.length,\n components,\n nonComponents,\n summary: { totalComponents: components.length, totalImports },\n }, 'json');\n return;\n }\n\n console.log(`Scanned ${files.length} files in ${targetDir}\\n`);\n\n if (components.length === 0 && nonComponents.length === 0) {\n console.log('No antd imports found.');\n return;\n }\n\n if (components.length > 0) {\n for (const comp of components) {\n console.log(` ${comp.name} — ${comp.imports} imports across ${comp.files.length} files`);\n if (comp.subComponents) {\n for (const [sub, count] of Object.entries(comp.subComponents)) {\n console.log(` ${sub}: ${count} usages`);\n }\n }\n }\n console.log(`\\nTotal: ${components.length} components, ${totalImports} imports`);\n }\n\n if (nonComponents.length > 0) {\n console.log(`\\nNon-component antd exports (${nonComponents.length}):`);\n for (const item of nonComponents) {\n console.log(` ${item.name} — ${item.imports} imports across ${item.files.length} files`);\n }\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { readFileSync } from 'node:fs';\nimport { parseSync, Visitor } from 'oxc-parser';\nimport { loadMetadataForVersion } from '../data/loader.js';\nimport { detectVersion } from '../data/version.js';\nimport { output } from '../output/formatter.js';\nimport { collectFiles, getJSXElementName } from '../utils/scan.js';\n\nexport interface LintIssue {\n file: string;\n line: number;\n rule: string;\n severity: 'warning' | 'error';\n message: string;\n}\n\ntype DeprecatedInfo = { prop: string; since: string; message: string };\n\nfunction getDeprecatedProps(store: ReturnType<typeof loadMetadataForVersion>): Map<string, DeprecatedInfo[]> {\n const result = new Map<string, DeprecatedInfo[]>();\n for (const comp of store.components) {\n const deprecated = comp.props.filter((p) => p.deprecated);\n if (deprecated.length > 0) {\n result.set(comp.name, deprecated.map((p) => {\n const sinceStr = typeof p.deprecated === 'string' ? ` (since ${p.deprecated})` : '';\n const desc = p.description ? `. ${p.description}` : '';\n return {\n prop: p.name,\n since: typeof p.deprecated === 'string' ? p.deprecated : 'unknown',\n message: `\\`${p.name}\\` is deprecated${sinceStr}${desc}`,\n };\n }));\n }\n }\n return result;\n}\n\n// --- AST helpers ---\n\nfunction findAttr(attrs: any[], name: string): any | null {\n return attrs.find((a: any) => a.type === 'JSXAttribute' && a.name?.name === name) ?? null;\n}\n\nfunction hasAttr(attrs: any[], name: string): boolean {\n return findAttr(attrs, name) !== null;\n}\n\nfunction getStringAttrValue(attrs: any[], name: string): string | null {\n const a = findAttr(attrs, name);\n if (!a) return null;\n if (a.value?.type === 'Literal' && typeof a.value.value === 'string') {\n return a.value.value;\n }\n if (a.value?.type === 'JSXExpressionContainer' &&\n a.value.expression?.type === 'Literal' &&\n typeof a.value.expression.value === 'string') {\n return a.value.expression.value;\n }\n return null;\n}\n\nfunction isBooleanFalse(attrs: any[], name: string): boolean {\n const a = findAttr(attrs, name);\n if (!a) return false;\n return a.value?.type === 'JSXExpressionContainer' &&\n a.value.expression?.type === 'Literal' &&\n a.value.expression.value === false;\n}\n\nfunction isObjectExpression(attrs: any[], name: string): boolean {\n const a = findAttr(attrs, name);\n if (!a) return false;\n return a.value?.type === 'JSXExpressionContainer' &&\n a.value.expression?.type === 'ObjectExpression';\n}\n\nfunction getObjectExpressionKeys(attrs: any[], name: string): string[] {\n const a = findAttr(attrs, name);\n if (!a) return [];\n if (a.value?.type === 'JSXExpressionContainer' &&\n a.value.expression?.type === 'ObjectExpression') {\n return a.value.expression.properties\n .filter((p: any) => p.type === 'Property' && p.key)\n .map((p: any) => p.key.name || p.key.value)\n .filter(Boolean);\n }\n return [];\n}\n\nfunction lintFile(\n filePath: string,\n deprecatedMap: Map<string, DeprecatedInfo[]>,\n only?: string,\n): LintIssue[] {\n let content: string;\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch {\n return [];\n }\n\n // Fast pre-check: skip files that don't reference antd at all\n if (!content.includes('antd')) return [];\n\n const result = parseSync(filePath, content);\n if (result.errors.length > 0) return [];\n\n const issues: LintIssue[] = [];\n const importedComponents = new Set<string>();\n\n const report = (rule: string, severity: LintIssue['severity'], line: number, message: string) => {\n issues.push({ file: filePath, line, rule, severity, message });\n };\n\n // Single pass: collect imports and check all rules\n const visitor = new Visitor({\n ImportDeclaration(node: any) {\n const source = node.source.value;\n if (source !== 'antd' && !source.startsWith('antd/')) return;\n\n if (node.importKind === 'type') return;\n\n for (const spec of node.specifiers) {\n if (spec.type === 'ImportSpecifier') {\n if (spec.importKind === 'type') continue;\n const name = spec.imported?.name || spec.local?.name;\n if (name) importedComponents.add(name);\n }\n\n if ((!only || only === 'performance') &&\n (spec.type === 'ImportDefaultSpecifier' || spec.type === 'ImportNamespaceSpecifier')) {\n report('performance', 'error', node.loc?.start?.line ?? 0,\n 'Avoid wildcard import from antd. Use named imports: `import { Button } from \\'antd\\'`');\n }\n }\n },\n\n JSXOpeningElement(node: any) {\n const compName = getJSXElementName(node.name);\n if (!compName) return;\n const attrs = node.attributes || [];\n const line = node.loc?.start?.line ?? 0;\n\n // --- Deprecated checks ---\n if (!only || only === 'deprecated') {\n if (compName === 'BackTop' && importedComponents.has('BackTop')) {\n report('deprecated', 'warning', line, '`BackTop` is deprecated, use `FloatButton.BackTop` instead');\n }\n if (compName === 'Button.Group' && importedComponents.has('Button')) {\n report('deprecated', 'warning', line, '`Button.Group` is deprecated, use `Space.Compact` instead');\n }\n if (compName === 'Input.Group' && importedComponents.has('Input')) {\n report('deprecated', 'warning', line, '`Input.Group` is deprecated, use `Space.Compact` instead');\n }\n\n const baseName = compName.includes('.') ? compName.split('.')[0] : compName;\n if (importedComponents.has(baseName) || importedComponents.has(compName)) {\n const deprecations = deprecatedMap.get(compName);\n if (deprecations) {\n for (const attr of attrs) {\n if (attr.type !== 'JSXAttribute') continue;\n const propName = attr.name?.name;\n const dep = deprecations.find((d) => d.prop === propName);\n if (dep) {\n report('deprecated', 'warning', attr.loc?.start?.line ?? line, `${compName} ${dep.message}`);\n }\n }\n }\n }\n }\n\n // --- Accessibility checks ---\n if (!only || only === 'a11y') {\n if (compName === 'Image' && importedComponents.has('Image')) {\n if (!hasAttr(attrs, 'alt')) {\n report('a11y', 'warning', line, 'Image component is missing `alt` prop for accessibility');\n }\n }\n\n if (compName.endsWith('Icon') && hasAttr(attrs, 'onClick') && !hasAttr(attrs, 'aria-label')) {\n report('a11y', 'warning', line, 'Clickable icon should have `aria-label` for screen readers');\n }\n }\n\n // --- Usage checks ---\n if (!only || only === 'usage') {\n if (compName === 'Form.Item' && importedComponents.has('Form')) {\n if (hasAttr(attrs, 'shouldUpdate') && hasAttr(attrs, 'dependencies')) {\n report('usage', 'warning', line, '`shouldUpdate` and `dependencies` should not be used together on Form.Item');\n }\n }\n\n if (compName === 'Button' && importedComponents.has('Button')) {\n if (hasAttr(attrs, 'ghost')) {\n const typeVal = getStringAttrValue(attrs, 'type');\n if (typeVal === 'link' || typeVal === 'text') {\n report('usage', 'warning', line, 'Button `ghost` prop cannot be used with `type=\"link\"` or `type=\"text\"`');\n }\n }\n }\n\n if (compName === 'Checkbox' && importedComponents.has('Checkbox')) {\n if (hasAttr(attrs, 'value')) {\n report('usage', 'warning', line, 'Checkbox `value` is not a valid prop outside Checkbox.Group, did you mean `checked`?');\n }\n }\n\n if (compName === 'Divider' && importedComponents.has('Divider')) {\n const typeVal = getStringAttrValue(attrs, 'type');\n if (typeVal === 'vertical' && (!node.selfClosing || hasAttr(attrs, 'children'))) {\n report('usage', 'warning', line, 'Divider `children` are not supported in `type=\"vertical\"` mode');\n }\n }\n\n if (compName === 'Select' && importedComponents.has('Select')) {\n if (hasAttr(attrs, 'maxCount')) {\n const modeVal = getStringAttrValue(attrs, 'mode');\n if (modeVal !== 'multiple' && modeVal !== 'tags') {\n report('usage', 'warning', line, 'Select `maxCount` only works with `mode=\"multiple\"` or `mode=\"tags\"`');\n }\n }\n }\n\n if (compName === 'Menu' && importedComponents.has('Menu')) {\n if (hasAttr(attrs, 'inlineCollapsed')) {\n const modeVal = getStringAttrValue(attrs, 'mode');\n if (modeVal !== 'inline') {\n report('usage', 'warning', line, 'Menu `inlineCollapsed` should only be used with `mode=\"inline\"`');\n }\n }\n }\n\n if (compName === 'QRCode' && importedComponents.has('QRCode')) {\n if (!hasAttr(attrs, 'value')) {\n report('usage', 'warning', line, 'QRCode is missing required `value` prop');\n }\n }\n\n if (compName === 'Typography.Link' && importedComponents.has('Typography')) {\n if (isObjectExpression(attrs, 'ellipsis')) {\n report('usage', 'warning', line, 'Typography.Link `ellipsis` only supports boolean value, not object config');\n }\n }\n\n if (compName === 'Typography.Text' && importedComponents.has('Typography')) {\n if (isObjectExpression(attrs, 'ellipsis')) {\n const keys = getObjectExpressionKeys(attrs, 'ellipsis');\n if (keys.includes('expandable') || keys.includes('rows')) {\n report('usage', 'warning', line, 'Typography.Text `ellipsis` does not support `expandable` or `rows`');\n }\n }\n }\n\n if (compName === 'Radio' && importedComponents.has('Radio')) {\n if (hasAttr(attrs, 'optionType')) {\n report('usage', 'warning', line, '`optionType` is only supported on Radio.Group, not Radio');\n }\n }\n\n if (compName === 'TreeSelect' && importedComponents.has('TreeSelect')) {\n if (isBooleanFalse(attrs, 'multiple') && hasAttr(attrs, 'treeCheckable')) {\n report('usage', 'warning', line, 'TreeSelect `multiple={false}` is ignored when `treeCheckable` is true');\n }\n }\n }\n\n // --- Performance checks ---\n if (!only || only === 'performance') {\n if ((compName === 'Select' && importedComponents.has('Select')) ||\n (compName === 'TreeSelect' && importedComponents.has('TreeSelect'))) {\n if (isBooleanFalse(attrs, 'virtual')) {\n report('performance', 'warning', line, 'Disabling `virtual` scroll on Select may cause performance issues with large datasets');\n }\n }\n }\n },\n });\n visitor.visit(result.program);\n\n return issues;\n}\n\nexport function registerLintCommand(program: Command): void {\n program\n .command('lint [target]')\n .description('Check antd usage against best practices')\n .option('--only <category>', 'Only check specific category (deprecated, a11y, usage, performance)')\n .action((target: string | undefined, cmdOpts: { only?: string }) => {\n const opts = program.opts<GlobalOptions>();\n const targetPath = target || '.';\n const versionInfo = detectVersion(opts.version);\n const store = loadMetadataForVersion(versionInfo.version);\n const deprecatedMap = getDeprecatedProps(store);\n\n const files = collectFiles(targetPath);\n const allIssues: LintIssue[] = [];\n\n for (const file of files) {\n allIssues.push(...lintFile(file, deprecatedMap, cmdOpts.only));\n }\n\n const summary = {\n total: allIssues.length,\n deprecated: allIssues.filter((i) => i.rule === 'deprecated').length,\n a11y: allIssues.filter((i) => i.rule === 'a11y').length,\n usage: allIssues.filter((i) => i.rule === 'usage').length,\n performance: allIssues.filter((i) => i.rule === 'performance').length,\n };\n\n if (opts.format === 'json') {\n output({ issues: allIssues, summary }, 'json');\n return;\n }\n\n if (allIssues.length === 0) {\n console.log(`Scanned ${files.length} files. No issues found.`);\n return;\n }\n\n console.log(`Scanned ${files.length} files. Found ${allIssues.length} issues:\\n`);\n\n for (const issue of allIssues) {\n const icon = issue.severity === 'error' ? '✗' : '⚠';\n console.log(` ${icon} ${issue.file}:${issue.line} [${issue.rule}]`);\n console.log(` ${issue.message}`);\n }\n\n console.log(`\\nSummary: ${summary.deprecated} deprecated, ${summary.a11y} a11y, ${summary.usage} usage, ${summary.performance} performance`);\n });\n}\n","import type { MigrationStep } from './migrate.js';\n\nexport const V4_TO_V5_STEPS: MigrationStep[] = [\n // Global changes\n {\n component: 'Global',\n breaking: true,\n description: 'Design token system replaces Less variables. All Less variable overrides must be migrated to CSS-in-JS tokens via ConfigProvider.',\n autoFixable: false,\n guide: 'https://ant.design/docs/react/migrate-less-variables',\n migrationGuide: `1. Remove all Less variable overrides (modifyVars, less-loader theme config)\n2. Wrap your app with ConfigProvider and pass a theme object\n3. Map Less variables to Design Tokens (e.g. @primary-color → token.colorPrimary)\n4. Remove babel-plugin-import if present (v5 supports tree-shaking natively)`,\n before: `// webpack.config.js or .umirc.ts\ntheme: { '@primary-color': '#1890ff' }\n\n// or .less file\n@import '~antd/dist/antd.less';\n@primary-color: #1890ff;`,\n after: `import { ConfigProvider } from 'antd';\n<ConfigProvider theme={{ token: { colorPrimary: '#1890ff' } }}>\n <App />\n</ConfigProvider>`,\n },\n {\n component: 'Global',\n breaking: true,\n description: 'Component styles no longer include CSS reset. Wrap app with <App /> component to restore.',\n autoFixable: false,\n guide: 'https://ant.design/components/app',\n searchPattern: `import\\\\s*\\\\{[^}]*\\\\}\\\\s*from\\\\s*['\"]antd['\"]`,\n migrationGuide: `1. Import App component from antd\n2. Wrap your root component with <App />\n3. Use App.useApp() hook to access message, notification, modal instances`,\n before: `import { Button } from 'antd';\n\nconst MyApp = () => <Button>Click</Button>;`,\n after: `import { App, Button } from 'antd';\n\nconst MyApp = () => (\n <App>\n <Button>Click</Button>\n </App>\n);`,\n },\n {\n component: 'Global',\n breaking: true,\n description: 'Moment.js replaced by Day.js. All date-related components (DatePicker, TimePicker, Calendar) now use Day.js.',\n autoFixable: true,\n codemod: 'v5-removed-component-migration',\n searchPattern: `import\\\\s+moment\\\\s+from\\\\s+['\"]moment['\"]`,\n migrationGuide: `1. Replace moment imports with dayjs\n2. dayjs API is mostly compatible with moment\n3. If you need locale support, import dayjs locale separately\n4. If you need plugins (isBetween, etc.), import and extend dayjs`,\n before: `import moment from 'moment';\n<DatePicker value={moment('2024-01-01')} />`,\n after: `import dayjs from 'dayjs';\n<DatePicker value={dayjs('2024-01-01')} />`,\n },\n {\n component: 'Global',\n breaking: true,\n description: 'babel-plugin-import is no longer needed. antd v5 supports tree-shaking natively.',\n autoFixable: false,\n searchPattern: `babel-plugin-import`,\n migrationGuide: `1. Remove babel-plugin-import from babel config\n2. Remove related configuration in .babelrc, babel.config.js, or package.json\n3. Direct imports like \\`import { Button } from 'antd'\\` work without the plugin`,\n },\n {\n component: 'Global',\n breaking: true,\n description: '`antd/dist/antd.css` and `antd/dist/antd.less` removed. CSS-in-JS generates styles automatically.',\n autoFixable: true,\n codemod: 'v5-removed-component-migration',\n searchPattern: `import\\\\s+['\"]antd/dist/antd\\\\.(css|less)['\"]`,\n migrationGuide: `Remove the global CSS/Less import. Styles are now injected via CSS-in-JS automatically.`,\n before: `import 'antd/dist/antd.css';\n// or\nimport 'antd/dist/antd.less';`,\n after: `// No global import needed — styles are auto-injected`,\n },\n\n // Prop renames (visible → open)\n {\n component: 'Modal',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Modal[^>]*\\\\bvisible\\\\b`,\n before: `<Modal visible={show} onCancel={onClose}>`,\n after: `<Modal open={show} onCancel={onClose}>`,\n migrationGuide: `Search for \\`<Modal\\` with \\`visible\\` prop and rename to \\`open\\`. Also applies to Modal.confirm, Modal.info, etc.`,\n },\n {\n component: 'Drawer',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Drawer[^>]*\\\\bvisible\\\\b`,\n before: `<Drawer visible={show} onClose={onClose}>`,\n after: `<Drawer open={show} onClose={onClose}>`,\n },\n {\n component: 'Tooltip',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Tooltip[^>]*\\\\bvisible\\\\b`,\n before: `<Tooltip visible={show}>`,\n after: `<Tooltip open={show}>`,\n },\n {\n component: 'Popover',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Popover[^>]*\\\\bvisible\\\\b`,\n before: `<Popover visible={show}>`,\n after: `<Popover open={show}>`,\n },\n {\n component: 'Popconfirm',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Popconfirm[^>]*\\\\bvisible\\\\b`,\n before: `<Popconfirm visible={show}>`,\n after: `<Popconfirm open={show}>`,\n },\n {\n component: 'Dropdown',\n breaking: true,\n description: 'Prop `visible` renamed to `open`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Dropdown[^>]*\\\\bvisible\\\\b`,\n before: `<Dropdown visible={show}>`,\n after: `<Dropdown open={show}>`,\n },\n {\n component: 'Tag',\n breaking: true,\n description: 'Prop `visible` removed. Use conditional rendering instead.',\n autoFixable: false,\n searchPattern: `<Tag[^>]*\\\\bvisible\\\\b`,\n before: `<Tag visible={show}>Tag</Tag>`,\n after: `{show && <Tag>Tag</Tag>}`,\n migrationGuide: `Replace \\`visible\\` prop with conditional rendering using \\`{condition && <Tag>...</Tag>}\\`.`,\n },\n\n // dropdownClassName → popupClassName\n {\n component: 'Select',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Select[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<Select dropdownClassName=\"my-dropdown\" />`,\n after: `<Select popupClassName=\"my-dropdown\" />`,\n },\n {\n component: 'Select',\n breaking: true,\n description: 'Prop `dropdownMatchSelectWidth` renamed to `popupMatchSelectWidth`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Select[^>]*\\\\bdropdownMatchSelectWidth\\\\b`,\n before: `<Select dropdownMatchSelectWidth={false} />`,\n after: `<Select popupMatchSelectWidth={false} />`,\n },\n {\n component: 'TreeSelect',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<TreeSelect[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<TreeSelect dropdownClassName=\"my-dropdown\" />`,\n after: `<TreeSelect popupClassName=\"my-dropdown\" />`,\n },\n {\n component: 'Cascader',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Cascader[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<Cascader dropdownClassName=\"my-dropdown\" />`,\n after: `<Cascader popupClassName=\"my-dropdown\" />`,\n },\n {\n component: 'AutoComplete',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<AutoComplete[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<AutoComplete dropdownClassName=\"my-dropdown\" />`,\n after: `<AutoComplete popupClassName=\"my-dropdown\" />`,\n },\n {\n component: 'DatePicker',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<DatePicker[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<DatePicker dropdownClassName=\"my-popup\" />`,\n after: `<DatePicker popupClassName=\"my-popup\" />`,\n },\n {\n component: 'TimePicker',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<TimePicker[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<TimePicker dropdownClassName=\"my-popup\" />`,\n after: `<TimePicker popupClassName=\"my-popup\" />`,\n },\n {\n component: 'Mentions',\n breaking: true,\n description: 'Prop `dropdownClassName` renamed to `popupClassName`',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `<Mentions[^>]*\\\\bdropdownClassName\\\\b`,\n before: `<Mentions dropdownClassName=\"my-dropdown\" />`,\n after: `<Mentions popupClassName=\"my-dropdown\" />`,\n },\n\n // Removed components\n {\n component: 'Comment',\n breaking: true,\n description: 'Removed from antd. Use @ant-design/compatible instead.',\n autoFixable: false,\n guide: 'https://ant.design/docs/react/migration-v5',\n searchPattern: `import\\\\s*\\\\{[^}]*\\\\bComment\\\\b[^}]*\\\\}\\\\s*from\\\\s*['\"]antd['\"]`,\n migrationGuide: `1. Install @ant-design/compatible: npm install @ant-design/compatible\n2. Change import from 'antd' to '@ant-design/compatible'`,\n before: `import { Comment } from 'antd';`,\n after: `import { Comment } from '@ant-design/compatible';`,\n },\n {\n component: 'PageHeader',\n breaking: true,\n description: 'Removed from antd. Use @ant-design/pro-components instead.',\n autoFixable: false,\n guide: 'https://ant.design/docs/react/migration-v5',\n searchPattern: `import\\\\s*\\\\{[^}]*\\\\bPageHeader\\\\b[^}]*\\\\}\\\\s*from\\\\s*['\"]antd['\"]`,\n migrationGuide: `1. Install @ant-design/pro-components: npm install @ant-design/pro-components\n2. Change import from 'antd' to '@ant-design/pro-components'`,\n before: `import { PageHeader } from 'antd';`,\n after: `import { PageHeader } from '@ant-design/pro-components';`,\n },\n {\n component: 'BackTop',\n breaking: true,\n description: 'Removed. Use FloatButton.BackTop instead.',\n autoFixable: true,\n codemod: 'v5-removed-component-migration',\n searchPattern: `import\\\\s*\\\\{[^}]*\\\\bBackTop\\\\b[^}]*\\\\}\\\\s*from\\\\s*['\"]antd['\"]`,\n before: `import { BackTop } from 'antd';\n<BackTop />`,\n after: `import { FloatButton } from 'antd';\n<FloatButton.BackTop />`,\n },\n\n // API changes\n {\n component: 'message',\n breaking: true,\n description: 'Static methods `message.xxx()` deprecated. Use `App.useApp()` hook instead for context support.',\n autoFixable: false,\n searchPattern: `\\\\bmessage\\\\.(success|error|warning|info|loading|open)\\\\(`,\n migrationGuide: `1. Wrap app with <App /> component\n2. Use const { message } = App.useApp(); in functional components\n3. Replace static message.xxx() calls with the hook-provided instance`,\n before: `import { message } from 'antd';\nmessage.success('Done!');`,\n after: `import { App } from 'antd';\nconst MyComponent = () => {\n const { message } = App.useApp();\n message.success('Done!');\n};`,\n },\n {\n component: 'notification',\n breaking: true,\n description: 'Static methods `notification.xxx()` deprecated. Use `App.useApp()` hook instead.',\n autoFixable: false,\n searchPattern: `\\\\bnotification\\\\.(success|error|warning|info|open)\\\\(`,\n migrationGuide: `Same pattern as message — use App.useApp() to get notification instance.`,\n before: `import { notification } from 'antd';\nnotification.success({ message: 'Done!' });`,\n after: `import { App } from 'antd';\nconst MyComponent = () => {\n const { notification } = App.useApp();\n notification.success({ message: 'Done!' });\n};`,\n },\n {\n component: 'Modal',\n breaking: true,\n description: 'Static methods `Modal.confirm()` etc. deprecated. Use `App.useApp()` hook instead.',\n autoFixable: false,\n searchPattern: `\\\\bModal\\\\.(confirm|info|success|error|warning)\\\\(`,\n migrationGuide: `Same pattern as message/notification — use App.useApp() to get modal instance.`,\n before: `import { Modal } from 'antd';\nModal.confirm({ title: 'Sure?' });`,\n after: `import { App } from 'antd';\nconst MyComponent = () => {\n const { modal } = App.useApp();\n modal.confirm({ title: 'Sure?' });\n};`,\n },\n\n // Table\n {\n component: 'Table',\n breaking: true,\n description: 'Column `filterDropdown` render args changed. `confirm({ closeDropdown: false })` replaced by separate `close` function.',\n autoFixable: false,\n searchPattern: `filterDropdown.*closeDropdown`,\n migrationGuide: `Update filterDropdown render function signature to use the new \\`close\\` parameter instead of \\`confirm({ closeDropdown: false })\\`.`,\n before: `filterDropdown: ({ confirm }) => (\n <Button onClick={() => confirm({ closeDropdown: false })}>Filter</Button>\n)`,\n after: `filterDropdown: ({ confirm, close }) => (\n <Button onClick={() => close()}>Filter</Button>\n)`,\n },\n\n // Form\n {\n component: 'Form',\n breaking: false,\n description: 'Prop `labelCol` and `wrapperCol` can now be set globally via ConfigProvider.',\n autoFixable: false,\n migrationGuide: `Optional improvement: move repeated labelCol/wrapperCol config to ConfigProvider for consistency.`,\n },\n\n // Slider\n {\n component: 'Slider',\n breaking: true,\n description: 'Tooltip-related APIs converged into `tooltip` property. `tooltipVisible` → `tooltip.open`, `tipFormatter` → `tooltip.formatter`, etc.',\n autoFixable: false,\n searchPattern: `<Slider[^>]*\\\\b(tooltipVisible|tipFormatter|tooltipPlacement|getTooltipPopupContainer)\\\\b`,\n before: `<Slider tooltipVisible={show} tipFormatter={(v) => \\`\\${v}%\\`} />`,\n after: `<Slider tooltip={{ open: show, formatter: (v) => \\`\\${v}%\\` }} />`,\n migrationGuide: `Migrate Slider tooltip props:\n- tooltipVisible → tooltip.open\n- tipFormatter → tooltip.formatter\n- tooltipPlacement → tooltip.placement\n- getTooltipPopupContainer → tooltip.getPopupContainer`,\n },\n\n // Table filterDropdownVisible\n {\n component: 'Table',\n breaking: true,\n description: 'Column prop `filterDropdownVisible` renamed to `filterDropdownOpen`.',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `filterDropdownVisible`,\n before: `{ title: 'Name', dataIndex: 'name', filterDropdownVisible: visible }`,\n after: `{ title: 'Name', dataIndex: 'name', filterDropdownOpen: visible }`,\n migrationGuide: `Search for \\`filterDropdownVisible\\` in Table column definitions and rename to \\`filterDropdownOpen\\`.`,\n },\n\n // Drawer style/className migration\n {\n component: 'Drawer',\n breaking: true,\n description: 'Drawer `style` and `className` now apply to the panel node. Use `rootStyle` and `rootClassName` for the wrapper.',\n autoFixable: false,\n searchPattern: `<Drawer[^>]*\\\\b(style|className)\\\\s*=`,\n migrationGuide: `In v5, Drawer \\`style\\` and \\`className\\` are migrated to the Drawer panel node.\nIf you were using them to style the wrapper/mask, replace with \\`rootStyle\\` and \\`rootClassName\\`.`,\n before: `<Drawer className=\"my-drawer\" style={{ zIndex: 1000 }}>`,\n after: `<Drawer rootClassName=\"my-drawer\" rootStyle={{ zIndex: 1000 }}>`,\n },\n\n // Notification close → destroy\n {\n component: 'notification',\n breaking: true,\n description: 'Static method `notification.close()` renamed to `notification.destroy()`. Static config options restricted.',\n autoFixable: false,\n searchPattern: `\\\\bnotification\\\\.close\\\\(`,\n before: `notification.close(key);`,\n after: `notification.destroy(key);`,\n migrationGuide: `1. Rename notification.close() to notification.destroy()\n2. Static methods no longer allow dynamic prefixCls, maxCount, top, bottom, getContainer in open()\n3. Use useNotification hook if you need different configurations`,\n },\n\n // message.warn removed\n {\n component: 'message',\n breaking: true,\n description: '`message.warn()` completely removed. Use `message.warning()` instead.',\n autoFixable: true,\n codemod: 'v5-props-changed-migration',\n searchPattern: `\\\\bmessage\\\\.warn\\\\(`,\n before: `message.warn('Something went wrong');`,\n after: `message.warning('Something went wrong');`,\n migrationGuide: `Search for \\`message.warn(\\` and replace with \\`message.warning(\\`.`,\n },\n\n // IE not supported\n {\n component: 'Global',\n breaking: true,\n description: 'IE browser is no longer supported. v5 uses CSS-in-JS and modern CSS features.',\n autoFixable: false,\n migrationGuide: `If your project needs IE support, you cannot upgrade to v5. Consider using @ant-design/cssinjs StyleProvider for :where selector compatibility with older browsers.`,\n },\n];\n","import type { MigrationStep } from './migrate.js';\n\nexport const V5_TO_V6_STEPS: MigrationStep[] = [\n // ─── Global / Environment ───────────────────────────────────────────────────\n\n {\n component: 'Global',\n breaking: true,\n description: 'React >= 18 required. React 17 and earlier are no longer supported.',\n autoFixable: false,\n migrationGuide: `1. Upgrade React to 18 or above\n2. Remove @ant-design/v5-patch-for-react-19 if present (no longer needed)`,\n searchPattern: `@ant-design/v5-patch-for-react-19`,\n before: `import '@ant-design/v5-patch-for-react-19';`,\n after: `// Remove this import — no longer needed in v6`,\n },\n {\n component: 'Global',\n breaking: true,\n description: '@ant-design/icons must be upgraded to v6. Icons v6 is not compatible with antd v5.',\n autoFixable: false,\n migrationGuide: `1. Run: npm install @ant-design/icons@6\n2. @ant-design/icons@6 is NOT compatible with antd@5 — upgrade both together\n3. If build errors occur, verify icon package version matches antd version`,\n },\n {\n component: 'Global',\n breaking: true,\n description: 'CSS variables enabled by default. Only modern browsers supported, IE is not supported.',\n autoFixable: false,\n migrationGuide: `Verify your target browsers support CSS variables. IE and some older domestic browsers may have issues.`,\n },\n {\n component: 'Global',\n breaking: false,\n description: 'DOM structure of many components optimized. Custom styles targeting internal DOM nodes may need adjustment.',\n autoFixable: false,\n migrationGuide: `If your project has CSS that targets component internal DOM nodes (specific selectors or hierarchy), inspect and adjust after upgrading.`,\n },\n\n // ─── Button ─────────────────────────────────────────────────────────────────\n\n {\n component: 'Button',\n breaking: true,\n description: 'Prop `type` split into `color` and `variant` for styling. `type=\"primary\"` → `color=\"primary\" variant=\"solid\"`.',\n autoFixable: true,\n codemod: 'v6-type-to-variant',\n searchPattern: `<Button[^>]*\\\\btype\\\\s*=\\\\s*['\"](?:primary|dashed|link|text)['\"]`,\n migrationGuide: `Button type prop is decomposed:\n- type=\"primary\" → color=\"primary\" variant=\"solid\" (or just keep type=\"primary\" as alias)\n- type=\"dashed\" → variant=\"dashed\"\n- type=\"link\" → variant=\"link\"\n- type=\"text\" → variant=\"text\"\n- type=\"default\" → no change needed`,\n before: `<Button type=\"primary\">Submit</Button>\n<Button type=\"dashed\">Dashed</Button>\n<Button type=\"link\">Link</Button>\n<Button type=\"text\">Text</Button>`,\n after: `<Button color=\"primary\" variant=\"solid\">Submit</Button>\n<Button variant=\"dashed\">Dashed</Button>\n<Button variant=\"link\">Link</Button>\n<Button variant=\"text\">Text</Button>`,\n },\n {\n component: 'Button',\n breaking: true,\n description: 'Prop `danger` removed. Use `color=\"danger\"` instead.',\n autoFixable: true,\n codemod: 'v6-danger-migration',\n searchPattern: `<Button[^>]*\\\\bdanger\\\\b`,\n before: `<Button danger>Delete</Button>\n<Button type=\"primary\" danger>Delete</Button>`,\n after: `<Button color=\"danger\">Delete</Button>\n<Button color=\"danger\" variant=\"solid\">Delete</Button>`,\n migrationGuide: `Search for all Button components with \\`danger\\` prop. Replace with \\`color=\"danger\"\\`. If the button also had \\`type=\"primary\"\\`, add \\`variant=\"solid\"\\`.`,\n },\n {\n component: 'Button',\n breaking: true,\n description: 'Prop `ghost` removed. Use `variant=\"outlined\"` instead.',\n autoFixable: true,\n codemod: 'v6-ghost-migration',\n searchPattern: `<Button[^>]*\\\\bghost\\\\b`,\n before: `<Button ghost>Ghost</Button>\n<Button type=\"primary\" ghost>Ghost Primary</Button>`,\n after: `<Button variant=\"outlined\">Ghost</Button>\n<Button color=\"primary\" variant=\"outlined\">Ghost Primary</Button>`,\n migrationGuide: `Search for all Button components with \\`ghost\\` prop. Replace with \\`variant=\"outlined\"\\`. Preserve the color from the original \\`type\\` prop.`,\n },\n {\n component: 'Button',\n breaking: false,\n description: '`iconPosition` deprecated, use `iconPlacement` instead.',\n autoFixable: true,\n codemod: 'v6-props-changed-migration',\n searchPattern: `<Button[^>]*\\\\biconPosition\\\\b`,\n before: `<Button iconPosition=\"end\">Click</Button>`,\n after: `<Button iconPlacement=\"end\">Click</Button>`,\n },\n {\n component: 'Button.Group',\n breaking: false,\n description: '`Button.Group` deprecated, use `Space.Compact` instead.',\n autoFixable: false,\n searchPattern: `Button\\\\.Group`,\n before: `<Button.Group><Button>A</Button><Button>B</Button></Button.Group>`,\n after: `<Space.Compact><Button>A</Button><Button>B</Button></Space.Compact>`,\n },\n\n // ─── Alert ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Alert',\n breaking: false,\n description: '`closeText` deprecated → `closable.closeIcon`; `message` deprecated → `title`.',\n autoFixable: false,\n searchPattern: `<Alert[^>]*\\\\b(closeText|message)\\\\s*=`,\n migrationGuide: `- closeText=\"Close\" → closable={{ closeIcon: \"Close\" }}\n- message=\"Title\" → title=\"Title\"`,\n },\n\n // ─── Anchor ─────────────────────────────────────────────────────────────────\n\n {\n component: 'Anchor',\n breaking: false,\n description: '`Anchor` children usage deprecated, use `items` prop instead.',\n autoFixable: false,\n searchPattern: `<Anchor>\\\\s*<Anchor\\\\.Link`,\n migrationGuide: `Replace Anchor children with items prop array.`,\n },\n\n // ─── AutoComplete ───────────────────────────────────────────────────────────\n\n {\n component: 'AutoComplete',\n breaking: false,\n description: 'Multiple deprecated props: `dropdownMatchSelectWidth` → `popupMatchSelectWidth`, `dropdownClassName` → `classNames.popup.root`, `dropdownRender` → `popupRender`, `dataSource` → `options`.',\n autoFixable: false,\n searchPattern: `<AutoComplete[^>]*\\\\b(dropdownMatchSelectWidth|dropdownClassName|dropdownStyle|dropdownRender|onDropdownVisibleChange|dataSource)\\\\b`,\n migrationGuide: `- dropdownMatchSelectWidth → popupMatchSelectWidth\n- dropdownClassName / popupClassName → classNames.popup.root\n- dropdownStyle → styles.popup.root\n- dropdownRender → popupRender\n- onDropdownVisibleChange → onOpenChange\n- dataSource → options`,\n },\n\n // ─── Avatar.Group ───────────────────────────────────────────────────────────\n\n {\n component: 'Avatar.Group',\n breaking: false,\n description: '`maxCount`/`maxStyle`/`maxPopoverPlacement`/`maxPopoverTrigger` deprecated, use `max` prop object.',\n autoFixable: false,\n searchPattern: `<Avatar\\\\.Group[^>]*\\\\b(maxCount|maxStyle|maxPopoverPlacement|maxPopoverTrigger)\\\\b`,\n before: `<Avatar.Group maxCount={3} maxStyle={{ color: 'red' }}>`,\n after: `<Avatar.Group max={{ count: 3, style: { color: 'red' } }}>`,\n },\n\n // ─── Breadcrumb ─────────────────────────────────────────────────────────────\n\n {\n component: 'Breadcrumb',\n breaking: false,\n description: '`routes` deprecated → `items`; `Breadcrumb.Item` / `Breadcrumb.Separator` deprecated → `items`.',\n autoFixable: false,\n searchPattern: `(Breadcrumb\\\\.Item|Breadcrumb\\\\.Separator|<Breadcrumb[^>]*\\\\broutes\\\\b)`,\n migrationGuide: `Replace Breadcrumb children or routes prop with items array.`,\n },\n\n // ─── Calendar ───────────────────────────────────────────────────────────────\n\n {\n component: 'Calendar',\n breaking: false,\n description: '`dateFullCellRender`/`dateCellRender`/`monthFullCellRender`/`monthCellRender` deprecated → `fullCellRender`/`cellRender`.',\n autoFixable: false,\n searchPattern: `<Calendar[^>]*\\\\b(dateFullCellRender|dateCellRender|monthFullCellRender|monthCellRender)\\\\b`,\n },\n\n // ─── Card ───────────────────────────────────────────────────────────────────\n\n {\n component: 'Card',\n breaking: false,\n description: '`headStyle` → `styles.header`; `bodyStyle` → `styles.body`; `bordered` → `variant`.',\n autoFixable: false,\n searchPattern: `<Card[^>]*\\\\b(headStyle|bodyStyle|bordered)\\\\b`,\n migrationGuide: `- headStyle → styles.header\n- bodyStyle → styles.body\n- bordered={false} → variant=\"borderless\"`,\n },\n\n // ─── Cascader ───────────────────────────────────────────────────────────────\n\n {\n component: 'Cascader',\n breaking: false,\n description: 'Multiple deprecated props: `dropdownClassName` → `classNames.popup.root`, `bordered` → `variant`, `onPopupVisibleChange` → `onOpenChange`.',\n autoFixable: false,\n searchPattern: `<Cascader[^>]*\\\\b(dropdownClassName|dropdownStyle|dropdownRender|dropdownMenuColumnStyle|onDropdownVisibleChange|onPopupVisibleChange|bordered)\\\\b`,\n },\n\n // ─── Collapse ───────────────────────────────────────────────────────────────\n\n {\n component: 'Collapse',\n breaking: false,\n description: '`destroyInactivePanel` → `destroyOnHidden`; `expandIconPosition` → `expandIconPlacement`.',\n autoFixable: false,\n searchPattern: `<Collapse[^>]*\\\\b(destroyInactivePanel|expandIconPosition)\\\\b`,\n },\n\n // ─── DatePicker ─────────────────────────────────────────────────────────────\n\n {\n component: 'DatePicker',\n breaking: false,\n description: 'Multiple deprecated props: `popupClassName` → `classNames.popup.root`, `bordered` → `variant`, `onSelect` → `onCalendarChange`.',\n autoFixable: false,\n searchPattern: `<(DatePicker|RangePicker)[^>]*\\\\b(dropdownClassName|popupClassName|popupStyle|bordered|onSelect)\\\\b`,\n },\n\n // ─── Descriptions ──────────────────────────────────────────────────────────\n\n {\n component: 'Descriptions',\n breaking: false,\n description: '`labelStyle` → `styles.label`; `contentStyle` → `styles.content`.',\n autoFixable: false,\n searchPattern: `<Descriptions[^>]*\\\\b(labelStyle|contentStyle)\\\\b`,\n },\n\n // ─── Divider ────────────────────────────────────────────────────────────────\n\n {\n component: 'Divider',\n breaking: false,\n description: '`type` deprecated → `orientation`; `orientationMargin` → `styles.content.margin`.',\n autoFixable: false,\n searchPattern: `<Divider[^>]*\\\\b(type\\\\s*=|orientationMargin)\\\\b`,\n },\n\n // ─── Drawer ─────────────────────────────────────────────────────────────────\n\n {\n component: 'Drawer',\n breaking: false,\n description: 'Style props deprecated: `headerStyle`/`bodyStyle`/`footerStyle`/`maskStyle`/`drawerStyle`/`contentWrapperStyle` → `styles.*`; `width`/`height` → `size`; `destroyInactivePanel` → `destroyOnHidden`.',\n autoFixable: false,\n searchPattern: `<Drawer[^>]*\\\\b(headerStyle|bodyStyle|footerStyle|contentWrapperStyle|maskStyle|drawerStyle|destroyInactivePanel)\\\\b`,\n migrationGuide: `- headerStyle → styles.header\n- bodyStyle → styles.body\n- footerStyle → styles.footer\n- contentWrapperStyle → styles.wrapper\n- maskStyle → styles.mask\n- drawerStyle → styles.section\n- width/height → size\n- destroyInactivePanel → destroyOnHidden`,\n },\n\n // ─── Dropdown ───────────────────────────────────────────────────────────────\n\n {\n component: 'Dropdown',\n breaking: false,\n description: '`overlayClassName` → `classNames.root`; `overlayStyle` → `styles.root`; `destroyPopupOnHide` → `destroyOnHidden`. `Dropdown.Button` deprecated → `Space.Compact + Dropdown + Button`.',\n autoFixable: false,\n searchPattern: `(Dropdown\\\\.Button|<Dropdown[^>]*\\\\b(overlayClassName|overlayStyle|destroyPopupOnHide|dropdownRender)\\\\b)`,\n },\n\n // ─── Form ───────────────────────────────────────────────────────────────────\n\n {\n component: 'Form',\n breaking: true,\n description: '`onFinish` no longer includes all Form.List data. Unregistered Form.Item fields are excluded.',\n autoFixable: false,\n migrationGuide: `In v5, Form.List was treated as a single Field, causing onFinish to include all data.\nIn v6, only registered Form.Item fields are included.\nYou no longer need getFieldsValue({ strict: true }) to filter.`,\n before: `const onFinish = (values) => {\n const realValues = getFieldsValue({ strict: true });\n};`,\n after: `const onFinish = (values) => {\n const realValues = values; // Already filtered in v6\n};`,\n },\n\n // ─── Image ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Image',\n breaking: false,\n description: '`visible` → `open`; `onVisibleChange` → `onOpenChange`; `wrapperStyle` → `styles.root`; `maskClassName` → `classNames.cover`; `toolbarRender` → `actionsRender`.',\n autoFixable: false,\n searchPattern: `<Image[^>]*\\\\b(visible|onVisibleChange|wrapperStyle|maskClassName|rootClassName|toolbarRender)\\\\b`,\n },\n\n // ─── Input.Group ────────────────────────────────────────────────────────────\n\n {\n component: 'Input.Group',\n breaking: false,\n description: '`Input.Group` deprecated, use `Space.Compact` instead.',\n autoFixable: false,\n searchPattern: `Input\\\\.Group`,\n before: `<Input.Group compact><Input /><Input /></Input.Group>`,\n after: `<Space.Compact><Input /><Input /></Space.Compact>`,\n },\n\n // ─── Menu ───────────────────────────────────────────────────────────────────\n\n {\n component: 'Menu',\n breaking: false,\n description: '`children` deprecated, use `items` prop instead.',\n autoFixable: false,\n searchPattern: `<Menu>\\\\s*<Menu\\\\.Item`,\n },\n\n // ─── Modal ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Modal',\n breaking: false,\n description: '`bodyStyle` → `styles.body`; `maskStyle` → `styles.mask`; `destroyOnClose` → `destroyOnHidden`.',\n autoFixable: false,\n searchPattern: `<Modal[^>]*\\\\b(bodyStyle|maskStyle|destroyOnClose)\\\\b`,\n },\n\n // ─── Notification ──────────────────────────────────────────────────────────\n\n {\n component: 'notification',\n breaking: false,\n description: '`btn` deprecated → `actions`; `message` deprecated → `title`.',\n autoFixable: false,\n searchPattern: `notification\\\\.(open|success|error|info|warning)\\\\(\\\\{[^}]*(\\\\bbtn\\\\b|\\\\bmessage\\\\b)`,\n },\n\n // ─── Progress ───────────────────────────────────────────────────────────────\n\n {\n component: 'Progress',\n breaking: false,\n description: '`strokeWidth`/`width` → `size`; `trailColor` → `railColor`; `gapPosition` → `gapPlacement`.',\n autoFixable: false,\n searchPattern: `<Progress[^>]*\\\\b(strokeWidth|trailColor|gapPosition)\\\\b`,\n },\n\n // ─── Select ─────────────────────────────────────────────────────────────────\n\n {\n component: 'Select',\n breaking: false,\n description: 'Multiple deprecated props: `dropdownClassName` → `classNames.popup.root`, `dropdownRender` → `popupRender`, `bordered` → `variant`, `onDropdownVisibleChange` → `onOpenChange`.',\n autoFixable: false,\n searchPattern: `<Select[^>]*\\\\b(dropdownClassName|dropdownStyle|dropdownRender|onDropdownVisibleChange|bordered)\\\\b`,\n },\n\n // ─── Slider ─────────────────────────────────────────────────────────────────\n\n {\n component: 'Slider',\n breaking: false,\n description: 'Tooltip props deprecated: `tooltipPrefixCls` → `tooltip.prefixCls`, `tipFormatter` → `tooltip.formatter`, `tooltipVisible` → `tooltip.open`, `tooltipPlacement` → `tooltip.placement`.',\n autoFixable: false,\n searchPattern: `<Slider[^>]*\\\\b(tooltipPrefixCls|tipFormatter|tooltipVisible|tooltipPlacement|getTooltipPopupContainer)\\\\b`,\n },\n\n // ─── Space ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Space',\n breaking: false,\n description: '`direction` → `orientation`; `split` → `separator`.',\n autoFixable: false,\n searchPattern: `<Space[^>]*\\\\b(direction|split)\\\\s*=`,\n },\n\n // ─── Steps ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Steps',\n breaking: false,\n description: '`labelPlacement` → `titlePlacement`; `progressDot` → `type=\"dot\"`; `direction` → `orientation`; `items.description` → `items.content`.',\n autoFixable: false,\n searchPattern: `<Steps[^>]*\\\\b(labelPlacement|progressDot|direction)\\\\b`,\n },\n\n // ─── Table ──────────────────────────────────────────────────────────────────\n\n {\n component: 'Table',\n breaking: false,\n description: '`pagination.position` → `pagination.placement`; `filterDropdownOpen` → `filterDropdownProps.open`; `onFilterDropdownOpenChange` → `filterDropdownProps.onOpenChange`.',\n autoFixable: false,\n searchPattern: `(filterDropdownOpen|onFilterDropdownOpenChange|filterCheckall)`,\n },\n\n // ─── Tabs ───────────────────────────────────────────────────────────────────\n\n {\n component: 'Tabs',\n breaking: false,\n description: '`tabPosition` → `tabPlacement`; `destroyInactiveTabPane` → `destroyOnHidden`; `Tabs.TabPane` deprecated → `items`.',\n autoFixable: false,\n searchPattern: `(Tabs\\\\.TabPane|<Tabs[^>]*\\\\b(tabPosition|destroyInactiveTabPane)\\\\b)`,\n },\n\n // ─── Tag ────────────────────────────────────────────────────────────────────\n\n {\n component: 'Tag',\n breaking: true,\n description: 'Default trailing margin removed. `bordered={false}` → `variant=\"filled\"`; `color=\"xxx-inverse\"` → `variant=\"solid\"`.',\n autoFixable: false,\n searchPattern: `<Tag[^>]*\\\\b(bordered|color\\\\s*=\\\\s*['\"][^'\"]*-inverse)`,\n migrationGuide: `- Tag trailing margin removed. Add margin via ConfigProvider tag.styles if needed.\n- bordered={false} → variant=\"filled\"\n- color=\"xxx-inverse\" → variant=\"solid\"`,\n },\n\n // ─── Timeline ───────────────────────────────────────────────────────────────\n\n {\n component: 'Timeline',\n breaking: false,\n description: '`Timeline.Item` deprecated → `items`; `pending`/`pendingDot` deprecated → `items`; `mode=left|right` → `mode=start|end`.',\n autoFixable: false,\n searchPattern: `(Timeline\\\\.Item|<Timeline[^>]*\\\\b(pending|pendingDot|mode\\\\s*=\\\\s*['\"](?:left|right))\\\\b)`,\n },\n\n // ─── Tooltip ────────────────────────────────────────────────────────────────\n\n {\n component: 'Tooltip',\n breaking: false,\n description: '`overlayStyle` → `styles.root`; `overlayInnerStyle` → `styles.container`; `overlayClassName` → `classNames.root`; `destroyTooltipOnHide` → `destroyOnHidden`.',\n autoFixable: false,\n searchPattern: `<Tooltip[^>]*\\\\b(overlayStyle|overlayInnerStyle|overlayClassName|destroyTooltipOnHide)\\\\b`,\n },\n\n // ─── Transfer ───────────────────────────────────────────────────────────────\n\n {\n component: 'Transfer',\n breaking: false,\n description: '`listStyle` → `styles.section`; `operationStyle` → `styles.actions`; `operations` → `actions`.',\n autoFixable: false,\n searchPattern: `<Transfer[^>]*\\\\b(listStyle|operationStyle|operations)\\\\b`,\n },\n\n // ─── TreeSelect ─────────────────────────────────────────────────────────────\n\n {\n component: 'TreeSelect',\n breaking: false,\n description: 'Multiple deprecated props: `dropdownClassName` → `classNames.popup.root`, `dropdownRender` → `popupRender`, `bordered` → `variant`, `onDropdownVisibleChange` → `onOpenChange`.',\n autoFixable: false,\n searchPattern: `<TreeSelect[^>]*\\\\b(dropdownClassName|dropdownStyle|dropdownRender|onDropdownVisibleChange|bordered)\\\\b`,\n },\n\n // ─── Overlay: Modal, Drawer mask blur ──────────────────────────────────────\n\n {\n component: 'Global',\n breaking: false,\n description: 'Modal/Drawer mask blur enabled by default. Disable via ConfigProvider if undesired.',\n autoFixable: false,\n migrationGuide: `If you don't want the mask blur effect:\n<ConfigProvider modal={{ mask: { blur: false } }} drawer={{ mask: { blur: false } }}>\n <App />\n</ConfigProvider>`,\n },\n];\n","import type { Command } from 'commander';\nimport type { GlobalOptions, OutputFormat } from '../types.js';\nimport { output } from '../output/formatter.js';\nimport { printError, createError, ErrorCodes } from '../output/error.js';\nimport { V4_TO_V5_STEPS } from './migrate-v4-to-v5.js';\nimport { V5_TO_V6_STEPS } from './migrate-v5-to-v6.js';\n\nexport interface MigrationStep {\n component: string;\n breaking: boolean;\n description: string;\n autoFixable: boolean;\n codemod?: string;\n guide?: string;\n /** Pattern to search for in source files (regex string) */\n searchPattern?: string;\n /** Before/after code examples for agents */\n before?: string;\n after?: string;\n /** Detailed migration instructions for agents */\n migrationGuide?: string;\n}\n\n// ─── Migration Guide Registry ────────────────────────────────────────────────\n\nconst MIGRATION_GUIDES: Record<string, MigrationStep[]> = {\n '4-5': V4_TO_V5_STEPS,\n '5-6': V5_TO_V6_STEPS,\n};\n\n// ─── Output Formatters ──────────────────────────────────────────────────────\n\nfunction formatText(from: string, to: string, steps: MigrationStep[]): void {\n const autoFixable = steps.filter((s) => s.autoFixable).length;\n const manual = steps.length - autoFixable;\n\n console.log(`Migration Guide: v${from} → v${to}\\n`);\n\n // Group by component\n const grouped = groupByComponent(steps);\n for (const [comp, compSteps] of grouped) {\n console.log(` ${comp}:`);\n for (const step of compSteps) {\n const icon = step.autoFixable ? '🔧' : '📝';\n const breaking = step.breaking ? ' [BREAKING]' : '';\n console.log(` ${icon}${breaking} ${step.description}`);\n if (step.guide) console.log(` Guide: ${step.guide}`);\n }\n console.log('');\n }\n\n console.log(`Total: ${steps.length} steps (${autoFixable} auto-fixable, ${manual} manual)`);\n}\n\nfunction formatMarkdown(from: string, to: string, steps: MigrationStep[]): void {\n const lines: string[] = [];\n const autoFixable = steps.filter((s) => s.autoFixable).length;\n const manual = steps.length - autoFixable;\n\n lines.push(`# Migration Guide: antd v${from} → v${to}`);\n lines.push('');\n lines.push(`> ${steps.length} total steps: ${autoFixable} auto-fixable, ${manual} manual`);\n lines.push('');\n\n const grouped = groupByComponent(steps);\n for (const [comp, compSteps] of grouped) {\n lines.push(`## ${comp}`);\n lines.push('');\n for (const step of compSteps) {\n const badge = step.breaking ? '**BREAKING**' : 'non-breaking';\n const fix = step.autoFixable ? '🔧 auto-fixable' : '📝 manual';\n lines.push(`### ${step.description}`);\n lines.push('');\n lines.push(`${badge} | ${fix}`);\n lines.push('');\n\n if (step.migrationGuide) {\n lines.push(step.migrationGuide);\n lines.push('');\n }\n\n if (step.before && step.after) {\n lines.push('**Before:**');\n lines.push('```tsx');\n lines.push(step.before);\n lines.push('```');\n lines.push('');\n lines.push('**After:**');\n lines.push('```tsx');\n lines.push(step.after);\n lines.push('```');\n lines.push('');\n }\n\n if (step.searchPattern) {\n lines.push(`**Search pattern:** \\`${step.searchPattern}\\``);\n lines.push('');\n }\n\n if (step.guide) {\n lines.push(`**Reference:** ${step.guide}`);\n lines.push('');\n }\n }\n }\n\n console.log(lines.join('\\n'));\n}\n\nfunction formatJson(from: string, to: string, steps: MigrationStep[]): void {\n const autoFixable = steps.filter((s) => s.autoFixable).length;\n const manual = steps.length - autoFixable;\n output({\n from,\n to,\n steps,\n summary: { total: steps.length, autoFixable, manual },\n }, 'json');\n}\n\nfunction formatApplyPrompt(from: string, to: string, steps: MigrationStep[], dir: string, format: OutputFormat): void {\n const fixableSteps = steps.filter((s) => s.autoFixable && s.searchPattern);\n const manualSteps = steps.filter((s) => !s.autoFixable);\n\n if (format === 'json') {\n output({\n from,\n to,\n targetDir: dir,\n autoFixSteps: fixableSteps.map((s) => ({\n component: s.component,\n description: s.description,\n searchPattern: s.searchPattern,\n before: s.before,\n after: s.after,\n migrationGuide: s.migrationGuide,\n })),\n manualSteps: manualSteps.map((s) => ({\n component: s.component,\n description: s.description,\n guide: s.guide,\n migrationGuide: s.migrationGuide,\n before: s.before,\n after: s.after,\n })),\n summary: {\n totalAutoFix: fixableSteps.length,\n totalManual: manualSteps.length,\n },\n }, 'json');\n return;\n }\n\n const lines: string[] = [];\n lines.push(`# Auto-Migration Prompt: antd v${from} → v${to}`);\n lines.push(`# Target directory: ${dir}`);\n lines.push('');\n lines.push('## Instructions for Code Agent');\n lines.push('');\n lines.push(`Scan all .ts/.tsx/.js/.jsx files in \\`${dir}\\` and apply the following migrations.`);\n lines.push('For each file changed, verify the fix compiles correctly before moving on.');\n lines.push('');\n\n if (fixableSteps.length > 0) {\n lines.push('## Auto-fixable Changes');\n lines.push('');\n for (let i = 0; i < fixableSteps.length; i++) {\n const step = fixableSteps[i];\n lines.push(`### ${i + 1}. ${step.component}: ${step.description}`);\n lines.push('');\n if (step.searchPattern) {\n lines.push(`**Search regex:** \\`${step.searchPattern}\\``);\n lines.push('');\n }\n if (step.migrationGuide) {\n lines.push(step.migrationGuide);\n lines.push('');\n }\n if (step.before && step.after) {\n lines.push('**Before:**');\n lines.push('```tsx');\n lines.push(step.before);\n lines.push('```');\n lines.push('**After:**');\n lines.push('```tsx');\n lines.push(step.after);\n lines.push('```');\n lines.push('');\n }\n }\n }\n\n if (manualSteps.length > 0) {\n lines.push('## Manual Changes (require human review)');\n lines.push('');\n for (let i = 0; i < manualSteps.length; i++) {\n const step = manualSteps[i];\n lines.push(`### ${i + 1}. ${step.component}: ${step.description}`);\n lines.push('');\n if (step.migrationGuide) {\n lines.push(step.migrationGuide);\n lines.push('');\n }\n if (step.before && step.after) {\n lines.push('**Before:**');\n lines.push('```tsx');\n lines.push(step.before);\n lines.push('```');\n lines.push('**After:**');\n lines.push('```tsx');\n lines.push(step.after);\n lines.push('```');\n lines.push('');\n }\n if (step.guide) {\n lines.push(`**Reference:** ${step.guide}`);\n lines.push('');\n }\n }\n }\n\n console.log(lines.join('\\n'));\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\nfunction groupByComponent(steps: MigrationStep[]): Map<string, MigrationStep[]> {\n const map = new Map<string, MigrationStep[]>();\n for (const step of steps) {\n const arr = map.get(step.component) || [];\n arr.push(step);\n map.set(step.component, arr);\n }\n return map;\n}\n\n// ─── Command Registration ────────────────────────────────────────────────────\n\nexport function registerMigrateCommand(program: Command): void {\n program\n .command('migrate <from> <to>')\n .description('Version migration guide with optional auto-fix')\n .option('--component <name>', 'Component-specific migration guide')\n .option('--apply <dir>', 'Generate migration prompts for scanning a directory')\n .option('--confirm', 'Confirm auto-fix (required with --apply)')\n .action((rawFrom: string, rawTo: string, cmdOpts: { component?: string; apply?: string; confirm?: boolean }) => {\n const opts = program.opts<GlobalOptions>();\n const from = rawFrom.replace(/^v/i, '');\n const to = rawTo.replace(/^v/i, '');\n const key = `${from}-${to}`;\n let steps = MIGRATION_GUIDES[key];\n\n if (!steps) {\n const err = createError(\n ErrorCodes.INVALID_ARGUMENT,\n `No migration guide available for v${from} → v${to}`,\n `Available migrations: ${Object.keys(MIGRATION_GUIDES).map((k) => `v${k.replace('-', ' → v')}`).join(', ')}`,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n\n if (cmdOpts.component) {\n steps = steps.filter((s) => s.component.toLowerCase() === cmdOpts.component!.toLowerCase());\n if (steps.length === 0) {\n const err = createError(\n ErrorCodes.COMPONENT_NOT_FOUND,\n `No migration steps found for ${cmdOpts.component} from v${from} to v${to}`,\n );\n printError(err, opts.format);\n process.exitCode = 1;\n return;\n }\n }\n\n // --apply mode: generate agent-consumable migration prompt\n if (cmdOpts.apply) {\n formatApplyPrompt(from, to, steps, cmdOpts.apply, opts.format);\n return;\n }\n\n // Standard guide output\n switch (opts.format) {\n case 'json':\n formatJson(from, to, steps);\n break;\n case 'markdown':\n formatMarkdown(from, to, steps);\n break;\n case 'text':\n default:\n formatText(from, to, steps);\n break;\n }\n });\n}\n","import { platform, release } from 'node:os';\nimport { execFileSync } from 'node:child_process';\nimport { readJson } from './scan.js';\nimport { join } from 'node:path';\n\ndeclare const __CLI_VERSION__: string;\n\nexport interface AntdEnv {\n antd: string;\n react: string;\n system: string;\n browser: string;\n}\n\nexport interface CliEnv {\n cli: string;\n node: string;\n system: string;\n}\n\nfunction getSystem(): string {\n return `${platform()} ${release()}`;\n}\n\nexport function collectAntdEnv(cwd: string, versionOverride?: string): AntdEnv {\n const antdPkg = readJson(join(cwd, 'node_modules', 'antd', 'package.json'));\n const reactPkg = readJson(join(cwd, 'node_modules', 'react', 'package.json'));\n\n return {\n antd: versionOverride || antdPkg?.version || 'unknown',\n react: reactPkg?.version || 'unknown',\n system: getSystem(),\n browser: '-',\n };\n}\n\nexport function collectCliEnv(): CliEnv {\n let cliVersion: string;\n try {\n cliVersion = __CLI_VERSION__;\n } catch (err) {\n console.error('Failed to get CLI version:', err);\n cliVersion = 'unknown';\n }\n return {\n cli: cliVersion,\n node: process.version,\n system: getSystem(),\n };\n}\n\nconst PLACEHOLDER = '_No response_';\nconst MAX_URL_LENGTH = 8000;\nconst FOOTER = '\\n\\n---\\n<sub>Generated by [@ant-design/cli](https://github.com/ant-design/ant-design-cli)</sub>';\n\nexport interface AntdIssueFields {\n reproduction?: string;\n steps?: string;\n expected?: string;\n actual?: string;\n extra?: string;\n env: AntdEnv;\n}\n\nexport interface CliIssueFields {\n description?: string;\n steps?: string;\n expected?: string;\n actual?: string;\n extra?: string;\n env: CliEnv;\n}\n\nexport function buildAntdIssueBody(fields: AntdIssueFields): string {\n const reproduction = fields.reproduction || PLACEHOLDER;\n const steps = fields.steps || PLACEHOLDER;\n const expected = fields.expected || PLACEHOLDER;\n const actual = fields.actual || PLACEHOLDER;\n const extra = fields.extra || '';\n\n let body = `<!-- generated by ant-design-issue-helper. DO NOT REMOVE -->\n\n### Reproduction link\n\n[${reproduction}](${reproduction})\n\n### Steps to reproduce\n\n${steps}\n\n### What is expected?\n\n${expected}\n\n### What is actually happening?\n\n${actual}\n\n| Environment | Info |\n| --- | --- |\n| antd | ${fields.env.antd} |\n| React | ${fields.env.react} |\n| System | ${fields.env.system} |\n| Browser | ${fields.env.browser} |`;\n\n if (extra) {\n body += `\\n\\n---\\n${extra}`;\n }\n\n body += FOOTER;\n\n return body;\n}\n\nexport function buildCliIssueBody(fields: CliIssueFields): string {\n const description = fields.description || PLACEHOLDER;\n const steps = fields.steps || PLACEHOLDER;\n const expected = fields.expected || PLACEHOLDER;\n const actual = fields.actual || PLACEHOLDER;\n const extra = fields.extra || '';\n\n let body = `### Description\n\n${description}\n\n### Steps to Reproduce\n\n${steps}\n\n### Expected Behavior\n\n${expected}\n\n### Actual Behavior\n\n${actual}\n\n### Environment\n\n| Info | Value |\n|------|-------|\n| @ant-design/cli | ${fields.env.cli} |\n| Node | ${fields.env.node} |\n| System | ${fields.env.system} |`;\n\n if (extra) {\n body += `\\n\\n---\\n${extra}`;\n }\n\n body += FOOTER;\n\n return body;\n}\n\nexport function checkGhAvailable(): boolean {\n try {\n execFileSync('gh', ['--version'], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface SubmitResult {\n issueNumber: number;\n url: string;\n}\n\nexport function submitViaGh(repo: string, title: string, body: string): SubmitResult {\n const result = execFileSync('gh', ['issue', 'create', '--repo', repo, '--title', title, '--body', body], {\n encoding: 'utf-8',\n timeout: 30000,\n }).trim();\n\n // gh issue create outputs the issue URL, e.g. https://github.com/org/repo/issues/123\n const match = result.match(/\\/issues\\/(\\d+)/);\n const issueNumber = match ? parseInt(match[1], 10) : 0;\n\n return {\n issueNumber,\n url: result,\n };\n}\n\nexport function buildIssueUrl(repo: string, title: string, body: string): string {\n const baseUrl = `https://github.com/${repo}/issues/new`;\n const params = new URLSearchParams({ title, body });\n let url = `${baseUrl}?${params.toString()}`;\n\n if (url.length > MAX_URL_LENGTH) {\n const truncationNote = '\\n\\n(Content truncated. Please add remaining details after opening.)';\n let lo = 0;\n let hi = body.length;\n while (lo < hi) {\n const mid = Math.ceil((lo + hi) / 2);\n const truncated = body.slice(0, mid) + truncationNote;\n const testParams = new URLSearchParams({ title, body: truncated });\n const testUrl = `${baseUrl}?${testParams.toString()}`;\n if (testUrl.length <= MAX_URL_LENGTH) {\n lo = mid;\n } else {\n hi = mid - 1;\n }\n }\n const truncatedBody = body.slice(0, lo) + truncationNote;\n const finalParams = new URLSearchParams({ title, body: truncatedBody });\n url = `${baseUrl}?${finalParams.toString()}`;\n }\n\n return url;\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { createError, ErrorCodes, printError } from '../output/error.js';\nimport { output } from '../output/formatter.js';\nimport {\n collectAntdEnv,\n collectCliEnv,\n buildAntdIssueBody,\n buildCliIssueBody,\n buildIssueUrl,\n checkGhAvailable,\n submitViaGh,\n} from '../utils/issue.js';\n\nconst ANTD_REPO = 'ant-design/ant-design';\nconst CLI_REPO = 'ant-design/ant-design-cli';\n\nexport function registerBugCommand(program: Command): void {\n program\n .command('bug')\n .description('Report a bug to the antd repository')\n .option('--title <title>', 'Issue title')\n .option('--reproduction <url>', 'Reproduction link')\n .option('--steps <text>', 'Steps to reproduce')\n .option('--expected <text>', 'Expected behavior')\n .option('--actual <text>', 'Actual behavior')\n .option('--extra <text>', 'Additional comments')\n .option('--submit', 'Submit via gh CLI instead of previewing', false)\n .action((cmdOpts) => {\n const opts = program.opts<GlobalOptions>();\n\n if (!cmdOpts.title) {\n printError(\n createError(ErrorCodes.TITLE_REQUIRED, '--title is required', 'Provide --title <title>'),\n opts.format,\n );\n process.exit(1);\n }\n\n const env = collectAntdEnv(process.cwd(), opts.version);\n const body = buildAntdIssueBody({\n reproduction: cmdOpts.reproduction,\n steps: cmdOpts.steps,\n expected: cmdOpts.expected,\n actual: cmdOpts.actual,\n extra: cmdOpts.extra,\n env,\n });\n const title = cmdOpts.title;\n\n if (cmdOpts.submit) {\n if (!checkGhAvailable()) {\n printError(\n createError(ErrorCodes.GH_NOT_FOUND, 'gh CLI is not installed or not in PATH', 'Install GitHub CLI: https://cli.github.com/ — or remove --submit to get a pre-filled URL instead'),\n opts.format,\n );\n process.exit(1);\n }\n try {\n const result = submitViaGh(ANTD_REPO, title, body);\n if (opts.format === 'json') {\n output({ repo: ANTD_REPO, title, issueNumber: result.issueNumber, url: result.url }, 'json');\n } else {\n console.log(`Issue created: ${result.url}`);\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n printError(\n createError(ErrorCodes.GH_SUBMIT_FAILED, `Failed to create issue: ${message}`, 'Check your gh authentication with `gh auth status`'),\n opts.format,\n );\n process.exit(2);\n }\n return;\n }\n\n // Preview mode\n const url = buildIssueUrl(ANTD_REPO, title, body);\n\n if (opts.format === 'json') {\n output({ repo: ANTD_REPO, title, body, url }, 'json');\n } else if (opts.format === 'markdown') {\n console.log(body);\n } else {\n console.log(`Repository: ${ANTD_REPO}`);\n console.log(`Title: ${title}`);\n console.log('');\n console.log('--- Issue Body ---');\n console.log(body);\n console.log('--- End ---');\n console.log('');\n console.log('To submit, re-run with --submit flag.');\n }\n });\n}\n\nexport function registerBugCliCommand(program: Command): void {\n program\n .command('bug-cli')\n .description('Report a bug to the ant-design-cli repository')\n .option('--title <title>', 'Issue title')\n .option('--description <desc>', 'Problem description')\n .option('--steps <text>', 'Steps to reproduce')\n .option('--expected <text>', 'Expected behavior')\n .option('--actual <text>', 'Actual behavior')\n .option('--extra <text>', 'Additional comments')\n .option('--submit', 'Submit via gh CLI instead of previewing', false)\n .action((cmdOpts) => {\n const opts = program.opts<GlobalOptions>();\n\n if (!cmdOpts.title) {\n printError(\n createError(ErrorCodes.TITLE_REQUIRED, '--title is required', 'Provide --title <title>'),\n opts.format,\n );\n process.exit(1);\n }\n\n const env = collectCliEnv();\n const body = buildCliIssueBody({\n description: cmdOpts.description,\n steps: cmdOpts.steps,\n expected: cmdOpts.expected,\n actual: cmdOpts.actual,\n extra: cmdOpts.extra,\n env,\n });\n const title = cmdOpts.title;\n\n if (cmdOpts.submit) {\n if (!checkGhAvailable()) {\n printError(\n createError(ErrorCodes.GH_NOT_FOUND, 'gh CLI is not installed or not in PATH', 'Install GitHub CLI: https://cli.github.com/ — or remove --submit to get a pre-filled URL instead'),\n opts.format,\n );\n process.exit(1);\n }\n try {\n const result = submitViaGh(CLI_REPO, title, body);\n if (opts.format === 'json') {\n output({ repo: CLI_REPO, title, issueNumber: result.issueNumber, url: result.url }, 'json');\n } else {\n console.log(`Issue created: ${result.url}`);\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n printError(\n createError(ErrorCodes.GH_SUBMIT_FAILED, `Failed to create issue: ${message}`, 'Check your gh authentication with `gh auth status`'),\n opts.format,\n );\n process.exit(2);\n }\n return;\n }\n\n // Preview mode\n const url = buildIssueUrl(CLI_REPO, title, body);\n\n if (opts.format === 'json') {\n output({ repo: CLI_REPO, title, body, url }, 'json');\n } else if (opts.format === 'markdown') {\n console.log(body);\n } else {\n console.log(`Repository: ${CLI_REPO}`);\n console.log(`Title: ${title}`);\n console.log('');\n console.log('--- Issue Body ---');\n console.log(body);\n console.log('--- End ---');\n console.log('');\n console.log('To submit, re-run with --submit flag.');\n }\n });\n}\n","import type { Command } from 'commander';\nimport type { GlobalOptions } from '../types.js';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListPromptsRequestSchema,\n GetPromptRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { detectVersion } from '../data/version.js';\nimport { TOOL_DEFINITIONS, createToolHandler } from '../mcp/tools.js';\nimport { ANTD_EXPERT_PROMPT, ANTD_PAGE_GENERATOR_PROMPT } from '../mcp/prompts.js';\n\ndeclare const __CLI_VERSION__: string;\n\nexport function registerMcpCommand(program: Command): void {\n program\n .command('mcp')\n .description('Start MCP (Model Context Protocol) server for AI assistant integration')\n .action(async () => {\n const opts = program.opts<GlobalOptions>();\n const versionInfo = detectVersion(opts.version);\n\n const server = new Server(\n { name: 'antd', version: __CLI_VERSION__ },\n { capabilities: { tools: {}, prompts: {} } },\n );\n\n const handleTool = createToolHandler({\n version: versionInfo.version,\n lang: opts.lang,\n });\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOL_DEFINITIONS,\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: params } = request.params;\n return handleTool(name, (params as Record<string, unknown>) ?? {});\n });\n\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts: [\n {\n name: 'antd-expert',\n description: 'General Ant Design expert assistant prompt',\n },\n {\n name: 'antd-page-generator',\n description: 'Ant Design page generation assistant prompt',\n },\n ],\n }));\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const { name } = request.params;\n if (name === 'antd-expert') {\n return {\n messages: [{ role: 'user' as const, content: { type: 'text' as const, text: ANTD_EXPERT_PROMPT } }],\n };\n }\n if (name === 'antd-page-generator') {\n return {\n messages: [{ role: 'user' as const, content: { type: 'text' as const, text: ANTD_PAGE_GENERATOR_PROMPT } }],\n };\n }\n throw new Error(`Unknown prompt: ${name}`);\n });\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n });\n}\n","import { listComponents } from '../commands/list.js';\nimport { getComponentInfo } from '../commands/info.js';\nimport { getComponentDoc } from '../commands/doc.js';\nimport { getComponentDemo } from '../commands/demo.js';\nimport { getTokens } from '../commands/token.js';\nimport { getSemanticStructure } from '../commands/semantic.js';\nimport { queryChangelog, diffChangelog } from '../commands/changelog.js';\nimport { createError, ErrorCodes } from '../output/error.js';\n\nexport interface McpContext {\n version: string;\n lang: string;\n}\n\nfunction toMcpResult(data: unknown) {\n if (data && typeof data === 'object' && 'error' in data && (data as { error: unknown }).error === true) {\n return { content: [{ type: 'text' as const, text: JSON.stringify(data) }], isError: true };\n }\n return { content: [{ type: 'text' as const, text: JSON.stringify(data) }] };\n}\n\nexport const TOOL_DEFINITIONS = [\n {\n name: 'antd_list',\n description: 'List all available antd components with names, categories, and descriptions.',\n inputSchema: {\n type: 'object' as const,\n properties: {},\n required: [] as string[],\n },\n },\n {\n name: 'antd_info',\n description: 'Get component API information including props, types, and default values.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n component: { type: 'string', description: 'Component name (e.g. Button, Table)' },\n detail: { type: 'boolean', description: 'Include full detail (whenToUse, methods, related, faq)' },\n },\n required: ['component'],\n },\n },\n {\n name: 'antd_doc',\n description: 'Get the full markdown documentation for a component.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n component: { type: 'string', description: 'Component name (e.g. Button, Table)' },\n },\n required: ['component'],\n },\n },\n {\n name: 'antd_demo',\n description: 'Get demo source code for a component. Without a name, lists all demos; with a name, returns specific demo code.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n component: { type: 'string', description: 'Component name (e.g. Button, Table)' },\n name: { type: 'string', description: 'Demo name to get specific demo code' },\n },\n required: ['component'],\n },\n },\n {\n name: 'antd_token',\n description: 'Query design tokens. Without a component, returns global tokens; with a component, returns component-level tokens.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n component: { type: 'string', description: 'Component name for component-level tokens' },\n },\n required: [] as string[],\n },\n },\n {\n name: 'antd_semantic',\n description: 'Query the semantic customization structure (classNames/styles) of a component.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n component: { type: 'string', description: 'Component name (e.g. Button, Table)' },\n },\n required: ['component'],\n },\n },\n {\n name: 'antd_changelog',\n description: 'Query changelog entries or diff API between two versions. Provide v1+v2 for diff mode, or version for changelog query mode.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n version: { type: 'string', description: 'Version or range filter for changelog query (e.g. 5.20.0 or 5.18.0..5.20.0)' },\n v1: { type: 'string', description: 'Start version for API diff (e.g. 5.18.0)' },\n v2: { type: 'string', description: 'End version for API diff (e.g. 5.20.0)' },\n component: { type: 'string', description: 'Filter diff to a specific component' },\n },\n required: [] as string[],\n },\n },\n];\n\nexport function createToolHandler(ctx: McpContext) {\n return async (name: string, params: Record<string, unknown>) => {\n switch (name) {\n case 'antd_list': {\n const components = listComponents({ version: ctx.version });\n // Trim to MCP-friendly fields only\n const trimmed = components.map(({ name, nameZh, category, description }) => ({\n name,\n nameZh,\n category,\n description,\n }));\n return toMcpResult(trimmed);\n }\n\n case 'antd_info': {\n const result = getComponentInfo(params.component as string, {\n lang: ctx.lang,\n version: ctx.version,\n detail: (params.detail as boolean) ?? false,\n });\n return toMcpResult(result);\n }\n\n case 'antd_doc': {\n const result = getComponentDoc(params.component as string, {\n lang: ctx.lang,\n version: ctx.version,\n });\n return toMcpResult(result);\n }\n\n case 'antd_demo': {\n const result = getComponentDemo(params.component as string, {\n version: ctx.version,\n name: params.name as string | undefined,\n });\n return toMcpResult(result);\n }\n\n case 'antd_token': {\n const result = getTokens(params.component as string | undefined, {\n lang: ctx.lang,\n version: ctx.version,\n });\n return toMcpResult(result);\n }\n\n case 'antd_semantic': {\n const result = getSemanticStructure(params.component as string, {\n version: ctx.version,\n });\n return toMcpResult(result);\n }\n\n case 'antd_changelog': {\n const v1 = params.v1 as string | undefined;\n const v2 = params.v2 as string | undefined;\n\n if ((v1 && !v2) || (!v1 && v2)) {\n return toMcpResult(\n createError(\n ErrorCodes.INVALID_ARGUMENT,\n 'Both v1 and v2 are required for diff mode',\n 'Provide both versions (v1 + v2), or omit both to use query mode',\n ),\n );\n }\n\n if (v1 && v2) {\n const result = diffChangelog({\n v1,\n v2,\n component: params.component as string | undefined,\n });\n return toMcpResult(result);\n }\n\n // Changelog query mode\n const result = queryChangelog({\n snapshotVersion: ctx.version,\n entryFilter: params.version as string | undefined,\n });\n return toMcpResult(result);\n }\n\n default:\n return toMcpResult(\n createError(ErrorCodes.UNKNOWN_TOOL, `Unknown tool: ${name}`),\n );\n }\n };\n}\n","const SHARED_TOOL_WORKFLOW = `## Tool usage workflow\n1. Use **antd_list** to discover available components\n2. Use **antd_info** to get component props and API details\n3. Use **antd_doc** to read full component documentation\n4. Use **antd_demo** to get example code for a component\n\n## Additional tools\n- Use **antd_token** for querying design tokens (global or component-level) for theming\n- Use **antd_semantic** for querying semantic classNames/styles customization structure\n- Use **antd_changelog** for querying version changes and cross-version API diffs\n\n## Rules\n- Avoid duplicate tool calls — do not call the same tool with the same parameters twice\n- Always query component docs before generating code that uses the component\n- Prefer reading real documentation over guessing API usage`;\n\nexport const ANTD_EXPERT_PROMPT = `You are an expert assistant for Ant Design (antd), a React UI component library.\n\n${SHARED_TOOL_WORKFLOW}\n`;\n\nexport const ANTD_PAGE_GENERATOR_PROMPT = `You are an expert Ant Design page generator. Your job is to produce complete, runnable React pages using antd components.\n\n${SHARED_TOOL_WORKFLOW}\n- Before generating code, fetch ALL relevant component docs and examples\n- Produce complete, runnable code with all necessary imports\n- Include proper TypeScript types when applicable\n`;\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { get } from 'node:https';\nimport { compare, valid } from '../data/version.js';\n\ndeclare const __CLI_VERSION__: string;\n\ninterface UpdateCache {\n lastChecked: number;\n latestVersion: string;\n}\n\nconst CACHE_DIR = join(homedir(), '.config', 'antd-cli');\nconst CACHE_FILE = join(CACHE_DIR, 'update-check.json');\nconst CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000; // 24 hours\n\nfunction readCache(): UpdateCache | null {\n try {\n if (!existsSync(CACHE_FILE)) return null;\n return JSON.parse(readFileSync(CACHE_FILE, 'utf-8')) as UpdateCache;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(cache: UpdateCache): void {\n try {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n writeFileSync(CACHE_FILE, JSON.stringify(cache), 'utf-8');\n } catch {\n // ignore write errors\n }\n}\n\nfunction fetchLatestVersion(): Promise<string | null> {\n return new Promise((resolve) => {\n const req = get(\n 'https://registry.npmjs.org/@ant-design/cli/latest',\n { timeout: 3000 },\n (res) => {\n if (res.statusCode !== 200) {\n res.resume();\n resolve(null);\n return;\n }\n let data = '';\n res.on('data', (chunk: Buffer) => {\n data += chunk.toString();\n });\n res.on('end', () => {\n try {\n const json = JSON.parse(data) as { version?: string };\n resolve(json.version ?? null);\n } catch {\n resolve(null);\n }\n });\n }\n );\n req.on('error', () => resolve(null));\n req.on('timeout', () => {\n req.destroy();\n resolve(null);\n });\n });\n}\n\nfunction printUpdateNotice(currentVersion: string, latestVersion: string): void {\n const line = ` Update available: ${currentVersion} → ${latestVersion} `;\n const install = ' Run: npm i -g @ant-design/cli ';\n const width = Math.max(line.length, install.length);\n const pad = (s: string) => s + ' '.repeat(width - s.length);\n const bar = '─'.repeat(width);\n\n process.stderr.write(`\\n╭${bar}╮\\n`);\n process.stderr.write(`│${pad(line)}│\\n`);\n process.stderr.write(`│${pad(install)}│\\n`);\n process.stderr.write(`╰${bar}╯\\n`);\n}\n\nexport async function checkForUpdate(): Promise<void> {\n // Skip in CI or when explicitly disabled\n if (process.env.CI || process.env.NO_UPDATE_CHECK) return;\n\n const currentVersion = __CLI_VERSION__;\n if (!valid(currentVersion)) return;\n\n const now = Date.now();\n const cache = readCache();\n\n let latestVersion = cache?.latestVersion ?? null;\n\n // Fetch if no cache or cache is stale\n if (!cache || now - cache.lastChecked > CHECK_INTERVAL_MS) {\n const fetched = await fetchLatestVersion();\n writeCache({\n lastChecked: now,\n latestVersion: fetched ?? latestVersion ?? currentVersion,\n });\n if (fetched) latestVersion = fetched;\n }\n\n if (latestVersion && valid(latestVersion) && compare(currentVersion, latestVersion) < 0) {\n printUpdateNotice(currentVersion, latestVersion);\n }\n}\n"],"mappings":"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","names":["readFileSync","existsSync","join","headerLine","separator","bodyLines","program","program","program","program","program","program","program","readFileSync","readdirSync","join","readFileSync","join","join","readdirSync","readFileSync","program","readFileSync","readFileSync","program","readFileSync","parseSync","Visitor","readFileSync","parseSync","Visitor","program","program","join","program","name","result","program","readFileSync","existsSync","join","join","existsSync","readFileSync"]}
|