@axis-ds/mcp 1.4.0 → 1.4.1

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 +169 -30
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -873,10 +873,45 @@ var RegistryClient = class {
873
873
  // ../axis-registry-core/src/project.ts
874
874
  import { existsSync as existsSync2, readFileSync as readFileSync3, statSync } from "fs";
875
875
  import path3 from "path";
876
- function detectInstallCommand(baseDir) {
877
- if (existsSync2(path3.join(baseDir, "pnpm-lock.yaml"))) return "pnpm install";
878
- if (existsSync2(path3.join(baseDir, "yarn.lock"))) return "yarn install";
879
- if (existsSync2(path3.join(baseDir, "package-lock.json"))) return "npm install";
876
+ var LOCKFILE_COMMANDS = [
877
+ ["pnpm-lock.yaml", "pnpm install"],
878
+ ["yarn.lock", "yarn install"],
879
+ ["package-lock.json", "npm install"]
880
+ ];
881
+ function lockfileCommandAt(dir) {
882
+ return LOCKFILE_COMMANDS.find(([file]) => existsSync2(path3.join(dir, file)))?.[1];
883
+ }
884
+ function isWorkspaceRootDir(dir) {
885
+ if (isFile(path3.join(dir, "pnpm-workspace.yaml"))) return true;
886
+ let parsed;
887
+ try {
888
+ parsed = JSON.parse(readFileSync3(path3.join(dir, "package.json"), "utf8"));
889
+ } catch {
890
+ return false;
891
+ }
892
+ if (!isPlainObject(parsed)) return false;
893
+ const ws = parsed.workspaces;
894
+ return Array.isArray(ws) || isPlainObject(ws) && Array.isArray(ws.packages);
895
+ }
896
+ function findWorkspaceRoot(baseDirInput) {
897
+ let dir = path3.resolve(baseDirInput);
898
+ for (; ; ) {
899
+ if (isWorkspaceRootDir(dir)) return dir;
900
+ if (existsSync2(path3.join(dir, ".git"))) return void 0;
901
+ const parent = path3.dirname(dir);
902
+ if (parent === dir) return void 0;
903
+ dir = parent;
904
+ }
905
+ }
906
+ function detectInstallCommand(baseDirInput) {
907
+ const baseDir = path3.resolve(baseDirInput);
908
+ const own = lockfileCommandAt(baseDir);
909
+ if (own !== void 0) return own;
910
+ const root = findWorkspaceRoot(baseDir);
911
+ if (root !== void 0 && root !== baseDir) {
912
+ const fromRoot = lockfileCommandAt(root);
913
+ if (fromRoot !== void 0) return fromRoot;
914
+ }
880
915
  return "pnpm install";
881
916
  }
882
917
  function hasDependency(pkg, name) {
@@ -975,8 +1010,8 @@ function compareExactVersions(a, b) {
975
1010
  }
976
1011
 
977
1012
  // ../axis-registry-core/src/template/tailwind-core.ts
978
- import { existsSync as existsSync3, lstatSync, readdirSync, readFileSync as readFileSync4 } from "fs";
979
- import { extname, join as join2, resolve } from "path";
1013
+ import { existsSync as existsSync3, lstatSync, readdirSync, readFileSync as readFileSync4, realpathSync } from "fs";
1014
+ import { basename, dirname as dirname2, extname, isAbsolute, join as join2, relative, resolve, sep } from "path";
980
1015
  function hasDependency2(pkg, name) {
981
1016
  for (const field of ["dependencies", "devDependencies"]) {
982
1017
  const deps = pkg[field];
@@ -1519,6 +1554,92 @@ function contentGlobToRegExp(glob) {
1519
1554
  }
1520
1555
  return new RegExp(`^${re}$`);
1521
1556
  }
1557
+ function leadingParentSegments(p) {
1558
+ const s = p.trim().replace(/\\/g, "/").replace(/^\.\//, "");
1559
+ return (/^(?:\.\.\/)*/.exec(s)?.[0].length ?? 0) / 3;
1560
+ }
1561
+ function isAbsoluteGlob(glob) {
1562
+ const t = glob.trim();
1563
+ return t.startsWith("/") || /^[A-Za-z]:[\\/]/.test(t);
1564
+ }
1565
+ var MAX_BRACE_EXPANSION = 256;
1566
+ function expandBraces(glob) {
1567
+ const open = glob.indexOf("{");
1568
+ if (open === -1) return [glob];
1569
+ let depth = 0;
1570
+ let close = -1;
1571
+ const commas = [];
1572
+ for (let i = open; i < glob.length; i++) {
1573
+ const c = glob[i];
1574
+ if (c === "{") depth++;
1575
+ else if (c === "}") {
1576
+ depth--;
1577
+ if (depth === 0) {
1578
+ close = i;
1579
+ break;
1580
+ }
1581
+ } else if (c === "," && depth === 1) commas.push(i);
1582
+ }
1583
+ const head = glob.slice(0, open + 1);
1584
+ if (close === -1 || commas.length === 0) {
1585
+ return expandBraces(glob.slice(open + 1))?.map((r) => head + r);
1586
+ }
1587
+ const parts = [];
1588
+ let from = open + 1;
1589
+ for (const c of [...commas, close]) {
1590
+ parts.push(glob.slice(from, c));
1591
+ from = c + 1;
1592
+ }
1593
+ const prefix = glob.slice(0, open);
1594
+ const suffix = glob.slice(close + 1);
1595
+ const out = [];
1596
+ for (const part of parts) {
1597
+ const expanded = expandBraces(prefix + part + suffix);
1598
+ if (expanded === void 0) return void 0;
1599
+ out.push(...expanded);
1600
+ if (out.length > MAX_BRACE_EXPANSION) return void 0;
1601
+ }
1602
+ return out;
1603
+ }
1604
+ function realpathPosix(p) {
1605
+ let cur = p;
1606
+ const tail = [];
1607
+ for (let i = 0; i < 64; i++) {
1608
+ try {
1609
+ return [realpathSync(cur), ...tail].join(sep).split(sep).join("/");
1610
+ } catch {
1611
+ const parent = dirname2(cur);
1612
+ if (parent === cur) return void 0;
1613
+ tail.unshift(basename(cur));
1614
+ cur = parent;
1615
+ }
1616
+ }
1617
+ return void 0;
1618
+ }
1619
+ function contentGlobBranchCovers(glob, sample, baseDir) {
1620
+ if (isAbsoluteGlob(glob)) {
1621
+ const re = contentGlobToRegExp(glob.trim().replace(/\\/g, "/"));
1622
+ const absSample = resolve(baseDir, sample);
1623
+ if (re.test(absSample.split(sep).join("/"))) return true;
1624
+ const real = realpathPosix(absSample);
1625
+ return real !== void 0 && re.test(real);
1626
+ }
1627
+ return leadingParentSegments(glob) === leadingParentSegments(sample) && contentGlobToRegExp(glob).test(sample);
1628
+ }
1629
+ function contentGlobCovers(glob, sample, baseDir) {
1630
+ const branches = expandBraces(glob.trim()) ?? [glob];
1631
+ return branches.some((b) => contentGlobBranchCovers(b, sample, baseDir));
1632
+ }
1633
+ var CONTENT_PARENT_PATH_NOTE = "\uC0C1\uC704 \uACBD\uB85C\uB294 Tailwind 3 \uAC00 \uBE4C\uB4DC\uB97C \uC2E4\uD589\uD55C \uB514\uB809\uD130\uB9AC \uAE30\uC900\uC73C\uB85C \uD480\uB824\uC694. \uBAA8\uB178\uB808\uD3EC \uB8E8\uD2B8 \uB4F1 \uC571 \uB514\uB809\uD130\uB9AC \uBC16\uC5D0\uC11C \uBE4C\uB4DC\uD558\uBA74 content: { relative: true, files: [...] } \uB85C \uC124\uC815 \uD30C\uC77C \uAE30\uC900\uC73C\uB85C \uBC14\uAFB8\uC138\uC694";
1634
+ function packageContentTarget(baseDir, name) {
1635
+ const found = isPnpProject(baseDir) ? void 0 : findInstalledPackage(baseDir, name);
1636
+ const rel2 = found === void 0 ? void 0 : relative(baseDir, found.dir);
1637
+ const relDir = rel2 === void 0 || rel2 === "" || isAbsolute(rel2) ? `node_modules/${name}` : rel2.split(sep).join("/");
1638
+ return {
1639
+ sample: `${relDir}/dist/index.js`,
1640
+ suggest: `${relDir.startsWith("../") ? "" : "./"}${relDir}/dist/**/*.{js,mjs}`
1641
+ };
1642
+ }
1522
1643
  function balancedSlice(src, start) {
1523
1644
  const open = src[start];
1524
1645
  const close = open === "[" ? "]" : "}";
@@ -1580,17 +1701,17 @@ function inspectTailwindContent(baseDirInput) {
1580
1701
  }
1581
1702
  for (const name of TAILWIND4_COMPONENT_PACKAGES) {
1582
1703
  if (pkg !== void 0 && hasDependency2(pkg, name) !== void 0) {
1583
- targets.push({ label: name, sample: `node_modules/${name}/dist/index.js`, suggest: `./node_modules/${name}/dist/**/*.{js,mjs}` });
1704
+ targets.push({ label: name, ...packageContentTarget(baseDir, name) });
1584
1705
  }
1585
1706
  }
1586
1707
  if (targets.length === 0) return null;
1587
1708
  const read = readTailwindContent(readFileSync4(join2(baseDir, configFile), "utf8"));
1588
- const patterns = (read?.globs ?? []).filter((g) => !g.trim().startsWith("!")).map(contentGlobToRegExp);
1709
+ const globs = (read?.globs ?? []).filter((g) => !g.trim().startsWith("!"));
1589
1710
  return {
1590
1711
  configFile,
1591
1712
  unreadable: read === void 0,
1592
1713
  dynamic: read?.dynamic ?? false,
1593
- targets: targets.map((t) => ({ ...t, covered: patterns.some((re) => re.test(t.sample)) }))
1714
+ targets: targets.map((t) => ({ ...t, covered: globs.some((g) => contentGlobCovers(g, t.sample, baseDir)) }))
1594
1715
  };
1595
1716
  }
1596
1717
  function checkTailwindContent(baseDir) {
@@ -1605,17 +1726,18 @@ function checkTailwindContent(baseDir) {
1605
1726
  };
1606
1727
  }
1607
1728
  const list = missing.map((t) => `${t.label} \u2192 "${t.suggest}"`).join(" \xB7 ");
1729
+ const note = missing.some((t) => t.suggest.startsWith("../")) ? ` (${CONTENT_PARENT_PATH_NOTE})` : "";
1608
1730
  if (r.unreadable || r.dynamic) {
1609
1731
  return {
1610
1732
  name: "tailwind.content",
1611
1733
  severity: "warn",
1612
- message: `${r.configFile}\uC758 content \uB97C \uC815\uC801\uC73C\uB85C \uB2E4 \uC77D\uC9C0 \uBABB\uD574 \uD655\uC778\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4: ${list}`
1734
+ message: `${r.configFile}\uC758 content \uB97C \uC815\uC801\uC73C\uB85C \uB2E4 \uC77D\uC9C0 \uBABB\uD574 \uD655\uC778\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4: ${list}${note}`
1613
1735
  };
1614
1736
  }
1615
1737
  return {
1616
1738
  name: "tailwind.content",
1617
1739
  severity: "fail",
1618
- message: `${r.configFile}\uC758 content \uAC00 \uCEF4\uD3EC\uB10C\uD2B8 \uACBD\uB85C\uB97C \uB36E\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4(\uD074\uB798\uC2A4\uAC00 \uC0DD\uC131\uB418\uC9C0 \uC54A\uC74C): ${list}`
1740
+ message: `${r.configFile}\uC758 content \uAC00 \uCEF4\uD3EC\uB10C\uD2B8 \uACBD\uB85C\uB97C \uB36E\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4(\uD074\uB798\uC2A4\uAC00 \uC0DD\uC131\uB418\uC9C0 \uC54A\uC74C): ${list}${note}`
1619
1741
  };
1620
1742
  }
1621
1743
  var ANIMATION_PLUGIN_TAILWIND3 = "tailwindcss-animate";
@@ -1769,7 +1891,7 @@ function selectUtilsDependencies(tailwind) {
1769
1891
  }
1770
1892
 
1771
1893
  // ../axis-registry-core/src/add/safe-write.ts
1772
- import { constants as fsConstants, existsSync as existsSync4, lstatSync as lstatSync2, realpathSync, statSync as statSync2 } from "fs";
1894
+ import { constants as fsConstants, existsSync as existsSync4, lstatSync as lstatSync2, realpathSync as realpathSync2, statSync as statSync2 } from "fs";
1773
1895
  import path4 from "path";
1774
1896
  import fs2 from "fs-extra";
1775
1897
  var NEW_FILE_FLAGS = fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL | (fsConstants.O_NOFOLLOW ?? 0);
@@ -1796,12 +1918,12 @@ function nearestExisting(p) {
1796
1918
  return cur;
1797
1919
  }
1798
1920
  function escapeReason(root, target, options = {}) {
1799
- const realRoot = realpathSync(root);
1921
+ const realRoot = realpathSync2(root);
1800
1922
  if (!isSameOrInside(path4.resolve(root), path4.resolve(target)) || path4.resolve(target) === path4.resolve(root)) {
1801
1923
  return `\uACBD\uB85C\uAC00 \uD504\uB85C\uC81D\uD2B8 \uB514\uB809\uD130\uB9AC \uBC16\uC785\uB2C8\uB2E4(${target})`;
1802
1924
  }
1803
1925
  const anchor = nearestExisting(path4.dirname(target));
1804
- const realAnchor = realpathSync(anchor);
1926
+ const realAnchor = realpathSync2(anchor);
1805
1927
  if (!isSameOrInside(realRoot, realAnchor)) {
1806
1928
  return `\uC0C1\uC704 \uB514\uB809\uD130\uB9AC\uC758 \uC2E4\uC81C \uC704\uCE58(${realAnchor})\uAC00 \uD504\uB85C\uC81D\uD2B8 \uB514\uB809\uD130\uB9AC \uBC16\uC785\uB2C8\uB2E4`;
1807
1929
  }
@@ -1816,7 +1938,7 @@ function escapeReason(root, target, options = {}) {
1816
1938
  const shown = path4.relative(path4.resolve(root), path4.resolve(target)).split(path4.sep).join("/");
1817
1939
  let realTarget;
1818
1940
  try {
1819
- realTarget = realpathSync(target);
1941
+ realTarget = realpathSync2(target);
1820
1942
  } catch {
1821
1943
  return `\uAE30\uC874 \uD30C\uC77C ${shown} \uC774 \uAE68\uC9C4 \uC2EC\uBCFC\uB9AD \uB9C1\uD06C\uB77C \uB530\uB77C\uAC08 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4(\uB9C1\uD06C\uB97C \uC9C0\uC6B0\uAC70\uB098 \uACE0\uCE5C \uB4A4 \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694)`;
1822
1944
  }
@@ -1849,8 +1971,8 @@ function isSymlink(p) {
1849
1971
  function outsideLinkTarget(root, target) {
1850
1972
  if (!isSymlink(target)) return null;
1851
1973
  try {
1852
- const realTarget = realpathSync(target);
1853
- return isSameOrInside(realpathSync(root), realTarget) ? null : realTarget;
1974
+ const realTarget = realpathSync2(target);
1975
+ return isSameOrInside(realpathSync2(root), realTarget) ? null : realTarget;
1854
1976
  } catch {
1855
1977
  return null;
1856
1978
  }
@@ -1867,10 +1989,10 @@ function hardLinkMessage(shownPath, nlink) {
1867
1989
  return `\uAE30\uC874 \uD30C\uC77C ${shownPath} \uC774 \uB2E4\uB978 \uACBD\uB85C\uC640 \uD558\uB4DC\uB9C1\uD06C\uB85C \uC774\uC5B4\uC9C4 \uD30C\uC77C\uC774\uB77C(\uB9C1\uD06C \uC218 ${nlink}) \uB36E\uC5B4\uC4F0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB36E\uC5B4\uC4F0\uBA74 \uC774\uC5B4\uC9C4 \uB2E4\uB978 \uACBD\uB85C\uC758 \uB0B4\uC6A9\uB3C4 \uBC14\uB01D\uB2C8\uB2E4. \uD558\uB4DC\uB9C1\uD06C\uB97C \uB04A\uC740(\uD30C\uC77C\uC744 \uBCF5\uC0AC\uD574 \uBC14\uAFBC) \uB4A4 \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694`;
1868
1990
  }
1869
1991
  function writtenOutside(root, target) {
1870
- const realRoot = realpathSync(root);
1992
+ const realRoot = realpathSync2(root);
1871
1993
  let realTarget;
1872
1994
  try {
1873
- realTarget = realpathSync(target);
1995
+ realTarget = realpathSync2(target);
1874
1996
  } catch {
1875
1997
  return target;
1876
1998
  }
@@ -1904,8 +2026,8 @@ async function writeNoFollow(target, content, mode) {
1904
2026
  return actual;
1905
2027
  }
1906
2028
  function checkParentInside(root, target) {
1907
- const realRoot = realpathSync(root);
1908
- const realParent = realpathSync(path4.dirname(target));
2029
+ const realRoot = realpathSync2(root);
2030
+ const realParent = realpathSync2(path4.dirname(target));
1909
2031
  if (!isSameOrInside(realRoot, realParent)) {
1910
2032
  return `\uBD80\uBAA8 \uB514\uB809\uD130\uB9AC\uC758 \uC2E4\uC81C \uC704\uCE58(${realParent})\uAC00 \uD504\uB85C\uC81D\uD2B8 \uB514\uB809\uD130\uB9AC \uBC16\uC785\uB2C8\uB2E4`;
1911
2033
  }
@@ -4427,7 +4549,7 @@ import path9 from "path";
4427
4549
  // src/tools/brand-core.ts
4428
4550
  import { existsSync as existsSync8, readFileSync as readFileSync8, statSync as statSync5 } from "fs";
4429
4551
  import { createRequire } from "module";
4430
- import { dirname as dirname3, join as join4, relative, resolve as resolve3, sep } from "path";
4552
+ import { dirname as dirname4, join as join4, relative as relative2, resolve as resolve3, sep as sep2 } from "path";
4431
4553
  var TOKENS_PACKAGE = "@axis-ds/tokens";
4432
4554
  var MIN_BRAND_TOKENS_VERSION = "1.3.0";
4433
4555
  var TOKENS_DEPENDENCY_MIN_VERSION = "1.6.0";
@@ -4457,7 +4579,7 @@ function findTokensPackageJson(baseDir) {
4457
4579
  for (; ; ) {
4458
4580
  const candidate = join4(dir, "node_modules", TOKENS_PACKAGE, "package.json");
4459
4581
  if (existsSync8(candidate)) return candidate;
4460
- const parent = dirname3(dir);
4582
+ const parent = dirname4(dir);
4461
4583
  if (parent === dir) return void 0;
4462
4584
  dir = parent;
4463
4585
  }
@@ -4541,7 +4663,7 @@ function inspectBrandImport(baseDir) {
4541
4663
  if (!location.path) {
4542
4664
  return { ...base, state: "css-missing", imports: [] };
4543
4665
  }
4544
- const cssFile = relative(root, location.path).split(sep).join("/");
4666
+ const cssFile = relative2(root, location.path).split(sep2).join("/");
4545
4667
  const imports = [...new Set(findBrandImports(readFileSync8(location.path, "utf8")))];
4546
4668
  let state;
4547
4669
  if (imports.includes(brand)) state = "match";
@@ -4657,7 +4779,7 @@ function findBrandActivation(baseDir) {
4657
4779
  const providerTexts = [];
4658
4780
  for (const m of text.matchAll(/from\s+["']\.\/(providers?)["']/g)) {
4659
4781
  for (const ext of [".tsx", ".jsx", ".ts", ".js"]) {
4660
- const rel2 = `${dirname3(candidate)}/${m[1]}${ext}`;
4782
+ const rel2 = `${dirname4(candidate)}/${m[1]}${ext}`;
4661
4783
  const p = join4(root, rel2);
4662
4784
  if (isFile2(p)) providerTexts.push({ rel: rel2, text: stripJsLikeComments(readFileSync8(p, "utf8")) });
4663
4785
  }
@@ -4740,6 +4862,16 @@ function declaredAxisPackages(pkg) {
4740
4862
  }
4741
4863
  return out;
4742
4864
  }
4865
+ function workspaceRootPackage(baseDir) {
4866
+ const root = findWorkspaceRoot(baseDir);
4867
+ if (root === void 0 || root === baseDir) return void 0;
4868
+ try {
4869
+ const parsed = JSON.parse(readFileSync9(join5(root, "package.json"), "utf8"));
4870
+ return isPlainObject(parsed) ? parsed : void 0;
4871
+ } catch {
4872
+ return void 0;
4873
+ }
4874
+ }
4743
4875
  function checkDependencies(baseDirInput) {
4744
4876
  const baseDir = resolve4(baseDirInput);
4745
4877
  let pkg;
@@ -4753,13 +4885,17 @@ function checkDependencies(baseDirInput) {
4753
4885
  }
4754
4886
  return { name: "dependencies", severity: "fail", message: "package.json \uC744 \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4(JSON \uD655\uC778)" };
4755
4887
  }
4756
- const missingRequired = REQUIRED_DEPENDENCIES.filter((d) => !hasDependency(pkg, d));
4888
+ const rootPkg = workspaceRootPackage(baseDir);
4889
+ const fromRoot = (d) => !hasDependency(pkg, d) && rootPkg !== void 0 && Boolean(hasDependency(rootPkg, d));
4890
+ const missingRequired = REQUIRED_DEPENDENCIES.filter((d) => !hasDependency(pkg, d) && !fromRoot(d));
4757
4891
  if (missingRequired.length > 0) {
4758
4892
  return { name: "dependencies", severity: "fail", message: `\uD544\uC218 \uC758\uC874\uC131 \uB204\uB77D: ${missingRequired.join(", ")}` };
4759
4893
  }
4760
- const missingRecommended = RECOMMENDED_DEPENDENCIES.filter((d) => !hasDependency(pkg, d));
4894
+ const missingRecommended = RECOMMENDED_DEPENDENCIES.filter((d) => !hasDependency(pkg, d) && !fromRoot(d));
4895
+ const rootDeclared = [...REQUIRED_DEPENDENCIES, ...RECOMMENDED_DEPENDENCIES].filter((d) => fromRoot(d));
4896
+ const rootNote = rootDeclared.length > 0 ? `\uC6CC\uD06C\uC2A4\uD398\uC774\uC2A4 \uB8E8\uD2B8\uC5D0 \uC120\uC5B8: ${rootDeclared.join(", ")}` : void 0;
4761
4897
  const targets = [
4762
- ...[...REQUIRED_DEPENDENCIES, ...RECOMMENDED_DEPENDENCIES].filter((d) => hasDependency(pkg, d) !== void 0),
4898
+ ...[...REQUIRED_DEPENDENCIES, ...RECOMMENDED_DEPENDENCIES].filter((d) => hasDependency(pkg, d) !== void 0 || fromRoot(d)),
4763
4899
  ...declaredAxisPackages(pkg)
4764
4900
  ];
4765
4901
  const pnp = isPnpProject(baseDir);
@@ -4769,11 +4905,14 @@ function checkDependencies(baseDirInput) {
4769
4905
  if (notInstalled.length > 0) {
4770
4906
  problems.push(`\uC120\uC5B8\uB410\uC9C0\uB9CC \uC124\uCE58\uB418\uC9C0 \uC54A\uC740 \uC758\uC874\uC131: ${notInstalled.join(", ")} \u2192 ${detectInstallCommand(baseDir)}`);
4771
4907
  }
4772
- if (problems.length > 0) return { name: "dependencies", severity: "warn", message: problems.join(" / ") };
4908
+ if (problems.length > 0) {
4909
+ return { name: "dependencies", severity: "warn", message: problems.join(" / ") + (rootNote ? ` (${rootNote})` : "") };
4910
+ }
4911
+ const note = rootNote ? `, ${rootNote}` : "";
4773
4912
  return {
4774
4913
  name: "dependencies",
4775
4914
  severity: "pass",
4776
- message: pnp ? `\uD544\uC218 \uBC0F \uAD8C\uC7A5 \uC758\uC874\uC131\uC774 \uC120\uC5B8\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4 (Plug'n'Play \uB77C \uC124\uCE58\uBCF8\uC740 \uD655\uC778\uD558\uC9C0 \uC54A\uC74C, ${targets.length}\uAC1C)` : `\uD544\uC218 \uBC0F \uAD8C\uC7A5 \uC758\uC874\uC131\uC774 \uC120\uC5B8 \xB7 \uC124\uCE58\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4 (${targets.length}\uAC1C \uD655\uC778)`
4915
+ message: pnp ? `\uD544\uC218 \uBC0F \uAD8C\uC7A5 \uC758\uC874\uC131\uC774 \uC120\uC5B8\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4 (Plug'n'Play \uB77C \uC124\uCE58\uBCF8\uC740 \uD655\uC778\uD558\uC9C0 \uC54A\uC74C, ${targets.length}\uAC1C${note})` : `\uD544\uC218 \uBC0F \uAD8C\uC7A5 \uC758\uC874\uC131\uC774 \uC120\uC5B8 \xB7 \uC124\uCE58\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4 (${targets.length}\uAC1C \uD655\uC778${note})`
4777
4916
  };
4778
4917
  }
4779
4918
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axis-ds/mcp",
3
- "version": "1.4.0",
3
+ "version": "1.4.1",
4
4
  "type": "module",
5
5
  "description": "AXIS Design System - MCP Server for AI-assisted component discovery",
6
6
  "bin": {