@axis-ds/mcp 1.2.0 → 1.2.2

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.
Files changed (2) hide show
  1. package/dist/index.js +434 -52
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -2313,6 +2313,438 @@ function getBrand(baseDir, name) {
2313
2313
  };
2314
2314
  }
2315
2315
 
2316
+ // src/tools/tailwind-core.ts
2317
+ import { existsSync as existsSync5, readFileSync as readFileSync6 } from "fs";
2318
+ import { join as join5, resolve as resolve3 } from "path";
2319
+ function hasDependency(pkg, name) {
2320
+ for (const field of ["dependencies", "devDependencies"]) {
2321
+ const deps = pkg[field];
2322
+ if (typeof deps === "object" && deps !== null && name in deps) {
2323
+ return String(deps[name]);
2324
+ }
2325
+ }
2326
+ return void 0;
2327
+ }
2328
+ function isPlainObject(value) {
2329
+ return typeof value === "object" && value !== null && !Array.isArray(value);
2330
+ }
2331
+ var VERSION = String.raw`v?(\d+)(?:\.(\d+|[xX*]))?(?:\.(\d+|[xX*]))?(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?`;
2332
+ function versionParts(token) {
2333
+ const m = new RegExp(`^${VERSION}$`).exec(token);
2334
+ if (!m) return void 0;
2335
+ if (/^v?0\.0\.0-/.test(token)) return void 0;
2336
+ return { major: Number(m[1]), minor: m[2], patch: m[3] };
2337
+ }
2338
+ var isWild = (part) => part === void 0 || /^[xX*]$/.test(part);
2339
+ function comparatorBounds(op, v) {
2340
+ switch (op) {
2341
+ case ">=":
2342
+ return { lower: v.major };
2343
+ case ">":
2344
+ return { lower: isWild(v.minor) ? v.major + 1 : v.major };
2345
+ case "<=":
2346
+ return { upper: v.major };
2347
+ case "<": {
2348
+ const zeroOrWild = (part) => isWild(part) || Number(part) === 0;
2349
+ return { upper: zeroOrWild(v.minor) && zeroOrWild(v.patch) ? v.major - 1 : v.major };
2350
+ }
2351
+ default:
2352
+ return { lower: v.major, upper: v.major };
2353
+ }
2354
+ }
2355
+ function tailwindMajorBounds(range) {
2356
+ const r = range.trim();
2357
+ if (r === "" || r.includes("||")) return void 0;
2358
+ const simple = new RegExp(`^(?:\\^|~|=)?\\s*(${VERSION})$`).exec(r);
2359
+ if (simple) {
2360
+ const v = versionParts(simple[1]);
2361
+ return v ? { lower: v.major, upper: v.major } : void 0;
2362
+ }
2363
+ const hyphen = new RegExp(`^(${VERSION})\\s+-\\s+(${VERSION})$`).exec(r);
2364
+ if (hyphen) {
2365
+ const tokens2 = r.split(/\s+-\s+/);
2366
+ const a = versionParts(tokens2[0]);
2367
+ const b = versionParts(tokens2[1]);
2368
+ return a && b && a.major <= b.major ? { lower: a.major, upper: b.major } : void 0;
2369
+ }
2370
+ const tokens = r.replace(/(>=|<=|>|<|=)\s+/g, "$1").split(/\s+/);
2371
+ const lowers = [];
2372
+ const uppers = [];
2373
+ for (const t of tokens) {
2374
+ const c = /^(>=|<=|>|<|=)(.+)$/.exec(t);
2375
+ if (!c) return void 0;
2376
+ const v = versionParts(c[2]);
2377
+ if (v === void 0) return void 0;
2378
+ const b = comparatorBounds(c[1], v);
2379
+ if (b.lower !== void 0) lowers.push(b.lower);
2380
+ if (b.upper !== void 0) uppers.push(b.upper);
2381
+ }
2382
+ if (lowers.length === 0) return void 0;
2383
+ const lower = Math.max(...lowers);
2384
+ const upper = uppers.length > 0 ? Math.min(...uppers) : void 0;
2385
+ if (upper !== void 0 && upper < lower) return void 0;
2386
+ return upper !== void 0 ? { lower, upper } : { lower };
2387
+ }
2388
+ function majorWithin(major, bounds) {
2389
+ return major >= bounds.lower && (bounds.upper === void 0 || major <= bounds.upper);
2390
+ }
2391
+ function majorFromVersion(version) {
2392
+ if (typeof version !== "string") return void 0;
2393
+ const v = version.trim();
2394
+ const m = /^v?(\d+)\.\d+\.\d+(?:[-+][0-9A-Za-z.+-]*)?$/.exec(v);
2395
+ if (!m || /^v?0\.0\.0-/.test(v)) return void 0;
2396
+ return Number(m[1]);
2397
+ }
2398
+ function detectTailwind(baseDirInput, pkg) {
2399
+ const baseDir = resolve3(baseDirInput);
2400
+ const installedFile = join5(baseDir, "node_modules", "tailwindcss", "package.json");
2401
+ const declared = pkg ? hasDependency(pkg, "tailwindcss") : void 0;
2402
+ const bounds = declared !== void 0 ? tailwindMajorBounds(declared) : void 0;
2403
+ const declaredMajor = bounds?.lower;
2404
+ try {
2405
+ const installed = JSON.parse(readFileSync6(installedFile, "utf8"));
2406
+ const version = isPlainObject(installed) ? installed.version : void 0;
2407
+ const major = majorFromVersion(version);
2408
+ if (major !== void 0) {
2409
+ const found = { major, source: "installed", value: String(version) };
2410
+ if (declared !== void 0 && bounds !== void 0 && !majorWithin(major, bounds)) {
2411
+ found.mismatch = { declared, declaredMajor: bounds.lower };
2412
+ }
2413
+ return found;
2414
+ }
2415
+ } catch {
2416
+ }
2417
+ if (declared !== void 0) {
2418
+ if (declaredMajor !== void 0) return { major: declaredMajor, source: "declared", value: declared };
2419
+ return { source: "none", value: declared };
2420
+ }
2421
+ return { source: "none" };
2422
+ }
2423
+ var TAILWIND_CONFIG_FILES = [
2424
+ "tailwind.config.ts",
2425
+ "tailwind.config.js",
2426
+ "tailwind.config.mjs",
2427
+ "tailwind.config.cjs"
2428
+ ];
2429
+ var TAILWIND_CSS_CANDIDATES = [
2430
+ "globals.css",
2431
+ "app/globals.css",
2432
+ "src/app/globals.css",
2433
+ "src/globals.css",
2434
+ "styles/globals.css"
2435
+ ];
2436
+ var TAILWIND_IMPORT = /@import\s+(?:url\(\s*)?["']tailwindcss["']/;
2437
+ function stripCssComments(css) {
2438
+ return css.replace(/\/\*[\s\S]*?\*\//g, "");
2439
+ }
2440
+ function hasTailwindImport(css) {
2441
+ return TAILWIND_IMPORT.test(stripCssComments(css));
2442
+ }
2443
+ var TOKENS_TAILWIND4_ENTRY = "@axis-ds/tokens/css/tailwind4";
2444
+ var TOKENS_TAILWIND4_IMPORT_LINE = `@import "${TOKENS_TAILWIND4_ENTRY}";`;
2445
+ var TOKENS_TAILWIND4_IMPORT = /@import\s+(?:url\(\s*)?["']@axis-ds\/tokens\/css\/tailwind4["']/;
2446
+ function hasTokensTailwind4Import(css) {
2447
+ return TOKENS_TAILWIND4_IMPORT.test(stripCssComments(css));
2448
+ }
2449
+ var TOKENS_CSS_IMPORT = /@import\s+(?:url\(\s*)?["'](@axis-ds\/tokens\/css(?:\/shadcn|\/tailwind4)?)["']/;
2450
+ function findTokensCssImport(css) {
2451
+ return TOKENS_CSS_IMPORT.exec(stripCssComments(css))?.[1];
2452
+ }
2453
+ function checkGlobalsCss(baseDirInput) {
2454
+ const baseDir = resolve3(baseDirInput);
2455
+ for (const candidate of TAILWIND_CSS_CANDIDATES) {
2456
+ const file = join5(baseDir, candidate);
2457
+ if (!existsSync5(file)) continue;
2458
+ const content = readFileSync6(file, "utf8");
2459
+ if (content.includes("--background") && content.includes("--primary")) {
2460
+ return { name: "globals.css", severity: "pass", message: `${candidate}\uC5D0 AXIS CSS \uBCC0\uC218\uAC00 \uC815\uC758\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4` };
2461
+ }
2462
+ const imported = findTokensCssImport(content);
2463
+ if (imported !== void 0) {
2464
+ return { name: "globals.css", severity: "pass", message: `${candidate}\uC5D0 AXIS CSS \uBCC0\uC218\uAC00 \uC788\uC2B5\uB2C8\uB2E4 (${imported} import)` };
2465
+ }
2466
+ return { name: "globals.css", severity: "warn", message: `${candidate}\uC5D0 AXIS CSS \uBCC0\uC218\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4` };
2467
+ }
2468
+ return { name: "globals.css", severity: "fail", message: "globals.css \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4" };
2469
+ }
2470
+ var TAILWIND4_MIN_AXIS_VERSION = "1.4.0";
2471
+ var TAILWIND4_AXIS_PACKAGES = ["@axis-ds/tokens", "@axis-ds/ui-react", "@axis-ds/agentic-ui"];
2472
+ function lowerOf(token) {
2473
+ const v = versionParts(token);
2474
+ if (!v) return void 0;
2475
+ const num = (part) => isWild(part) ? 0 : Number(part);
2476
+ const pre = /^v?\d+(?:\.(?:\d+|[xX*]))?(?:\.(?:\d+|[xX*]))?-/.test(token);
2477
+ return { core: [v.major, num(v.minor), num(v.patch)], pre };
2478
+ }
2479
+ function compareLower(a, b) {
2480
+ for (let i = 0; i < 3; i++) {
2481
+ if (a.core[i] !== b.core[i]) return a.core[i] - b.core[i];
2482
+ }
2483
+ return Number(b.pre) - Number(a.pre);
2484
+ }
2485
+ function rangeLowerVersion(range) {
2486
+ const r = range.trim();
2487
+ if (r === "" || r.includes("||")) return void 0;
2488
+ const simple = new RegExp(`^(?:\\^|~|=)?\\s*(${VERSION})$`).exec(r);
2489
+ if (simple) return lowerOf(simple[1]);
2490
+ if (new RegExp(`^(${VERSION})\\s+-\\s+(${VERSION})$`).test(r)) {
2491
+ const [a, b] = r.split(/\s+-\s+/);
2492
+ return lowerOf(b) ? lowerOf(a) : void 0;
2493
+ }
2494
+ const tokens = r.replace(/(>=|<=|>|<|=)\s+/g, "$1").split(/\s+/);
2495
+ let lower;
2496
+ for (const t of tokens) {
2497
+ const c = /^(>=|<=|>|<|=)(.+)$/.exec(t);
2498
+ if (!c) return void 0;
2499
+ const v = versionParts(c[2]);
2500
+ const low = lowerOf(c[2]);
2501
+ if (!v || !low) return void 0;
2502
+ let candidate;
2503
+ if (c[1] === ">=" || c[1] === "=") candidate = low;
2504
+ else if (c[1] === ">") {
2505
+ if (isWild(v.minor)) candidate = { core: [v.major + 1, 0, 0], pre: false };
2506
+ else if (isWild(v.patch)) candidate = { core: [v.major, Number(v.minor) + 1, 0], pre: false };
2507
+ else candidate = { core: [v.major, Number(v.minor), Number(v.patch) + 1], pre: false };
2508
+ }
2509
+ if (candidate && (!lower || compareLower(candidate, lower) > 0)) lower = candidate;
2510
+ }
2511
+ return lower;
2512
+ }
2513
+ function rangeLowerAtLeast(range, min) {
2514
+ const lower = rangeLowerVersion(range);
2515
+ const target = lowerOf(min);
2516
+ if (!lower || !target) return void 0;
2517
+ return compareLower(lower, target) >= 0;
2518
+ }
2519
+ function exactVersion(version) {
2520
+ if (typeof version !== "string") return void 0;
2521
+ const v = version.trim();
2522
+ if (!/^v?\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(v) || /^v?0\.0\.0-/.test(v)) return void 0;
2523
+ return v;
2524
+ }
2525
+ function installedVersion(baseDir, name) {
2526
+ try {
2527
+ const parsed = JSON.parse(readFileSync6(join5(baseDir, "node_modules", ...name.split("/"), "package.json"), "utf8"));
2528
+ return isPlainObject(parsed) ? exactVersion(parsed.version) : void 0;
2529
+ } catch {
2530
+ return void 0;
2531
+ }
2532
+ }
2533
+ function axisPackagesBelowTailwind4(pkg, baseDirInput) {
2534
+ if (!pkg) return [];
2535
+ const baseDir = baseDirInput !== void 0 ? resolve3(baseDirInput) : void 0;
2536
+ const out = [];
2537
+ const min = lowerOf(TAILWIND4_MIN_AXIS_VERSION);
2538
+ for (const name of TAILWIND4_AXIS_PACKAGES) {
2539
+ const range = hasDependency(pkg, name);
2540
+ if (range === void 0 || range.trim().startsWith("workspace:")) continue;
2541
+ const installed = baseDir !== void 0 ? installedVersion(baseDir, name) : void 0;
2542
+ const installedLower = installed !== void 0 ? lowerOf(installed) : void 0;
2543
+ if (installed !== void 0 && installedLower !== void 0) {
2544
+ if (compareLower(installedLower, min) < 0) out.push({ name, range, status: "below", source: "installed", installed });
2545
+ continue;
2546
+ }
2547
+ const atLeast = rangeLowerAtLeast(range, TAILWIND4_MIN_AXIS_VERSION);
2548
+ if (atLeast === false) out.push({ name, range, status: "below", source: "declared" });
2549
+ else if (atLeast === void 0) out.push({ name, range, status: "unknown", source: "declared" });
2550
+ }
2551
+ return out;
2552
+ }
2553
+ function axisPackageVersionLabel(issue) {
2554
+ return issue.source === "installed" ? `${issue.name} \uC124\uCE58\uBCF8 ${issue.installed}` : `${issue.name} ${issue.range}`;
2555
+ }
2556
+ var declaredList = (issues) => issues.map(axisPackageVersionLabel).join(" \xB7 ");
2557
+ function tailwind4VersionNote(issues) {
2558
+ const below = issues.filter((i) => i.status === "below");
2559
+ const unknown = issues.filter((i) => i.status === "unknown");
2560
+ let note = "";
2561
+ if (below.length > 0) note += ` (${TAILWIND4_MIN_AXIS_VERSION} \uC774\uC0C1 \uD544\uC694: ${declaredList(below)})`;
2562
+ if (unknown.length > 0) note += ` (\uC124\uCE58\uB41C \uBC84\uC804\uC774 ${TAILWIND4_MIN_AXIS_VERSION} \uC774\uC0C1\uC778\uC9C0 \uD655\uC778\uD558\uC138\uC694: ${declaredList(unknown)})`;
2563
+ return note;
2564
+ }
2565
+ var TAILWIND4_COMPONENT_PACKAGES = ["@axis-ds/ui-react", "@axis-ds/agentic-ui"];
2566
+ function componentTailwindImportLine(name) {
2567
+ return `@import "${name}/tailwind.css";`;
2568
+ }
2569
+ var escapeRegExp = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
2570
+ function hasComponentTailwindImport(css, name) {
2571
+ const re = new RegExp(`@import\\s+(?:url\\(\\s*)?["']${escapeRegExp(name)}/tailwind\\.css["']`);
2572
+ return re.test(stripCssComments(css));
2573
+ }
2574
+ function hasComponentSource(css, name) {
2575
+ const re = new RegExp(`@source\\s+(["'])(?!@axis-ds/)[^"'\\n]*${escapeRegExp(name)}(?:[/\\\\][^"'\\n]*)?\\1`);
2576
+ return re.test(stripCssComments(css));
2577
+ }
2578
+ var CREATE_NEXT_APP_DEFAULTS = [
2579
+ {
2580
+ prefix: ":root \uC0C9\uAC12",
2581
+ pattern: /(?<![\w-])(--(?:background|foreground))\s*:\s*(?:#[0-9a-fA-F]{3,8}\b|(?:rgba?|hsla?|hwb|oklch|oklab|lab|lch|color)\()/g,
2582
+ item: (m) => m[1]
2583
+ },
2584
+ {
2585
+ prefix: "@theme",
2586
+ pattern: /(?<![\w-])(--color-(?:background|foreground))\s*:\s*var\(\s*(--(?:background|foreground))\s*\)/g,
2587
+ item: (m) => `${m[1]}: var(${m[2]})`
2588
+ },
2589
+ {
2590
+ prefix: "@theme",
2591
+ pattern: /(?<![\w-])(--font-(?:sans|mono))\s*:\s*var\(\s*(--font-geist-(?:sans|mono))\s*\)/g,
2592
+ item: (m) => `${m[1]}: var(${m[2]})`
2593
+ },
2594
+ {
2595
+ prefix: "body",
2596
+ pattern: /(?<![\w-])(background|background-color|color)\s*:\s*var\(\s*(--(?:background|foreground))\s*\)/g,
2597
+ item: (m) => `${m[1]}: var(${m[2]})`
2598
+ }
2599
+ ];
2600
+ function findCreateNextAppDefaults(css) {
2601
+ const body = stripCssComments(css);
2602
+ const labels = [];
2603
+ for (const d of CREATE_NEXT_APP_DEFAULTS) {
2604
+ const items = [];
2605
+ for (const m of body.matchAll(d.pattern)) {
2606
+ const item = d.item(m);
2607
+ if (!items.includes(item)) items.push(item);
2608
+ }
2609
+ if (items.length > 0) labels.push(`${d.prefix} ${items.join(", ")}`);
2610
+ }
2611
+ return labels;
2612
+ }
2613
+ function stripJsComments(src) {
2614
+ let out = "";
2615
+ let i = 0;
2616
+ const n = src.length;
2617
+ while (i < n) {
2618
+ const c = src[i];
2619
+ const d = src[i + 1];
2620
+ if (c === '"' || c === "'" || c === "`") {
2621
+ let j = i + 1;
2622
+ while (j < n && src[j] !== c) {
2623
+ if (src[j] === "\\") j++;
2624
+ else if (c !== "`" && src[j] === "\n") break;
2625
+ j++;
2626
+ }
2627
+ out += src.slice(i, j + 1);
2628
+ i = j + 1;
2629
+ continue;
2630
+ }
2631
+ if (c === "/" && d === "/") {
2632
+ const end = src.indexOf("\n", i);
2633
+ i = end === -1 ? n : end;
2634
+ continue;
2635
+ }
2636
+ if (c === "/" && d === "*") {
2637
+ const end = src.indexOf("*/", i + 2);
2638
+ i = end === -1 ? n : end + 2;
2639
+ out += " ";
2640
+ continue;
2641
+ }
2642
+ out += c;
2643
+ i++;
2644
+ }
2645
+ return out;
2646
+ }
2647
+ var TOKENS_TAILWIND3_PRESET = "@axis-ds/tokens/tailwind";
2648
+ var PRESET_REFERENCE = /(?:\brequire\s*\(\s*|\bimport\s*\(\s*|\bfrom\s*|\bimport\s+)(["'])@axis-ds\/tokens\/tailwind\1/;
2649
+ function hasTokensPresetReference(source) {
2650
+ return PRESET_REFERENCE.test(stripJsComments(source));
2651
+ }
2652
+ var PRESET_PASS_SUFFIX = `\uC5D0 AXIS \uD1A0\uD070\uC774 \uC124\uC815\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4 (${TOKENS_TAILWIND3_PRESET} preset)`;
2653
+ function readPackageJson(baseDir) {
2654
+ try {
2655
+ const parsed = JSON.parse(readFileSync6(join5(baseDir, "package.json"), "utf8"));
2656
+ return isPlainObject(parsed) ? parsed : void 0;
2657
+ } catch {
2658
+ return void 0;
2659
+ }
2660
+ }
2661
+ function tailwind4Issues(css, pkg, versions) {
2662
+ const issues = [];
2663
+ const hasEntry = hasTokensTailwind4Import(css);
2664
+ if (!hasEntry) issues.push(`AXIS \uD1A0\uD070 \uC9C4\uC785\uC810\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 \u2192 ${TOKENS_TAILWIND4_IMPORT_LINE}`);
2665
+ const missing = TAILWIND4_COMPONENT_PACKAGES.filter(
2666
+ (name) => pkg !== void 0 && hasDependency(pkg, name) !== void 0 && !hasComponentTailwindImport(css, name) && !hasComponentSource(css, name)
2667
+ );
2668
+ if (missing.length > 0) {
2669
+ issues.push(`\uCEF4\uD3EC\uB10C\uD2B8 \uC2A4\uCE94 \uACBD\uB85C(tailwind.css)\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4 \u2192 ${missing.map(componentTailwindImportLine).join(" ")}`);
2670
+ }
2671
+ if (hasEntry) {
2672
+ const defaults = findCreateNextAppDefaults(css);
2673
+ if (defaults.length > 0) issues.push(`create-next-app \uAE30\uBCF8 \uC815\uC758\uAC00 \uB0A8\uC544 \uC788\uC2B5\uB2C8\uB2E4(${defaults.join(" \xB7 ")}) \u2192 \uC9C0\uC6B0\uC138\uC694`);
2674
+ if (versions.some((v) => v.name === TAILWIND4_AXIS_PACKAGES[0])) {
2675
+ issues.push(`AXIS \uD1A0\uD070 \uC9C4\uC785\uC810\uC774 \uC788\uC9C0\uB9CC ${TAILWIND4_AXIS_PACKAGES[0]} \uBC84\uC804 \uD655\uC778\uC774 \uD544\uC694\uD569\uB2C8\uB2E4`);
2676
+ }
2677
+ }
2678
+ for (const name of TAILWIND4_COMPONENT_PACKAGES) {
2679
+ if (hasComponentTailwindImport(css, name) && versions.some((v) => v.name === name)) {
2680
+ issues.push(`${name}/tailwind.css import \uAC00 \uC788\uC9C0\uB9CC ${name} \uBC84\uC804 \uD655\uC778\uC774 \uD544\uC694\uD569\uB2C8\uB2E4`);
2681
+ }
2682
+ }
2683
+ return issues;
2684
+ }
2685
+ function checkTailwindSetup(baseDirInput) {
2686
+ const baseDir = resolve3(baseDirInput);
2687
+ const pkg = readPackageJson(baseDir);
2688
+ const tailwind = detectTailwind(baseDir, pkg);
2689
+ if (tailwind.major !== void 0 && tailwind.major >= 4) {
2690
+ const label = `Tailwind ${tailwind.major}`;
2691
+ for (const candidate of TAILWIND_CSS_CANDIDATES) {
2692
+ const file = join5(baseDir, candidate);
2693
+ if (!existsSync5(file)) continue;
2694
+ const css = readFileSync6(file, "utf8");
2695
+ if (!hasTailwindImport(css)) {
2696
+ return {
2697
+ name: "tailwind.config",
2698
+ severity: "warn",
2699
+ message: `${label}: ${candidate}\uC5D0 @import "tailwindcss" \uAC00 \uC5C6\uC2B5\uB2C8\uB2E4`
2700
+ };
2701
+ }
2702
+ const versions = axisPackagesBelowTailwind4(pkg, baseDir);
2703
+ const issues = tailwind4Issues(css, pkg, versions);
2704
+ if (issues.length > 0) {
2705
+ return {
2706
+ name: "tailwind.config",
2707
+ severity: "warn",
2708
+ message: `${label}: ${candidate}\uC5D0 ${issues.join(" / ")}${tailwind4VersionNote(versions)}`
2709
+ };
2710
+ }
2711
+ return {
2712
+ name: "tailwind.config",
2713
+ severity: "pass",
2714
+ message: `${label}: ${candidate}\uC5D0 @import "tailwindcss" \uC640 AXIS \uD1A0\uD070 \uC9C4\uC785\uC810\uC774 \uC788\uC2B5\uB2C8\uB2E4`
2715
+ };
2716
+ }
2717
+ return {
2718
+ name: "tailwind.config",
2719
+ severity: "warn",
2720
+ message: `${label}: @import "tailwindcss" \uB97C \uD655\uC778\uD560 CSS \uD30C\uC77C\uC744 \uCC3E\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4`
2721
+ };
2722
+ }
2723
+ const [tsFile, ...otherFiles] = TAILWIND_CONFIG_FILES;
2724
+ const tsPath = join5(baseDir, tsFile);
2725
+ if (existsSync5(tsPath)) {
2726
+ const content = readFileSync6(tsPath, "utf8");
2727
+ const hasTokens = content.includes("--background") || content.includes("hsl(var(");
2728
+ if (hasTokens) {
2729
+ return { name: "tailwind.config", severity: "pass", message: "tailwind.config.ts\uC5D0 AXIS \uD1A0\uD070\uC774 \uC124\uC815\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4" };
2730
+ }
2731
+ if (hasTokensPresetReference(content)) {
2732
+ return { name: "tailwind.config", severity: "pass", message: `tailwind.config.ts${PRESET_PASS_SUFFIX}` };
2733
+ }
2734
+ return { name: "tailwind.config", severity: "warn", message: "tailwind.config.ts\uC5D0 AXIS \uD1A0\uD070 \uC124\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4" };
2735
+ }
2736
+ for (const file of otherFiles) {
2737
+ const path5 = join5(baseDir, file);
2738
+ if (existsSync5(path5)) {
2739
+ if (hasTokensPresetReference(readFileSync6(path5, "utf8"))) {
2740
+ return { name: "tailwind.config", severity: "pass", message: `${file}${PRESET_PASS_SUFFIX}` };
2741
+ }
2742
+ return { name: "tailwind.config", severity: "warn", message: `${file} \uC874\uC7AC (TypeScript \uAD8C\uC7A5)` };
2743
+ }
2744
+ }
2745
+ return { name: "tailwind.config", severity: "fail", message: "tailwind.config \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4" };
2746
+ }
2747
+
2316
2748
  // src/tools/template.ts
2317
2749
  var TEMPLATE_REGISTRY_URL = process.env.AXIS_TEMPLATE_URL || "https://axis.minu.best/templates";
2318
2750
  async function fetchTemplateIndex() {
@@ -2473,58 +2905,8 @@ async function handleCheckProject(params) {
2473
2905
  severity: configExists ? "pass" : "fail",
2474
2906
  message: configExists ? "axis.config.json \uD30C\uC77C\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4" : "axis.config.json \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 \u2192 'axis init'\uC744 \uC2E4\uD589\uD558\uC138\uC694"
2475
2907
  });
2476
- const twTs = path3.join(baseDir, "tailwind.config.ts");
2477
- const twJs = path3.join(baseDir, "tailwind.config.js");
2478
- if (await fs3.pathExists(twTs)) {
2479
- const content = await fs3.readFile(twTs, "utf-8");
2480
- const hasTokens = content.includes("--background") || content.includes("hsl(var(");
2481
- results.push({
2482
- name: "tailwind.config",
2483
- severity: hasTokens ? "pass" : "warn",
2484
- message: hasTokens ? "tailwind.config.ts\uC5D0 AXIS \uD1A0\uD070\uC774 \uC124\uC815\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4" : "tailwind.config.ts\uC5D0 AXIS \uD1A0\uD070 \uC124\uC815\uC774 \uC5C6\uC2B5\uB2C8\uB2E4"
2485
- });
2486
- } else if (await fs3.pathExists(twJs)) {
2487
- results.push({
2488
- name: "tailwind.config",
2489
- severity: "warn",
2490
- message: "tailwind.config.js \uC874\uC7AC (TypeScript \uAD8C\uC7A5)"
2491
- });
2492
- } else {
2493
- results.push({
2494
- name: "tailwind.config",
2495
- severity: "fail",
2496
- message: "tailwind.config \uD30C\uC77C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4"
2497
- });
2498
- }
2499
- const cssCandidates = [
2500
- "globals.css",
2501
- "app/globals.css",
2502
- "src/app/globals.css",
2503
- "src/globals.css",
2504
- "styles/globals.css"
2505
- ];
2506
- let cssFound = false;
2507
- for (const candidate of cssCandidates) {
2508
- const fullPath = path3.join(baseDir, candidate);
2509
- if (await fs3.pathExists(fullPath)) {
2510
- const content = await fs3.readFile(fullPath, "utf-8");
2511
- const hasTokens = content.includes("--background") && content.includes("--primary");
2512
- results.push({
2513
- name: "globals.css",
2514
- severity: hasTokens ? "pass" : "warn",
2515
- message: hasTokens ? `${candidate}\uC5D0 AXIS CSS \uBCC0\uC218\uAC00 \uC815\uC758\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4` : `${candidate}\uC5D0 AXIS CSS \uBCC0\uC218\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4`
2516
- });
2517
- cssFound = true;
2518
- break;
2519
- }
2520
- }
2521
- if (!cssFound) {
2522
- results.push({
2523
- name: "globals.css",
2524
- severity: "fail",
2525
- message: "globals.css \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4"
2526
- });
2527
- }
2908
+ results.push(checkTailwindSetup(baseDir));
2909
+ results.push(checkGlobalsCss(baseDir));
2528
2910
  const utilsCandidates = [
2529
2911
  "lib/utils.ts",
2530
2912
  "src/lib/utils.ts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axis-ds/mcp",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "type": "module",
5
5
  "description": "AXIS Design System - MCP Server for AI-assisted component discovery",
6
6
  "bin": {