@axis-ds/cli 1.7.3 → 1.7.4

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 CHANGED
@@ -107,7 +107,7 @@ axis theme add ontology
107
107
  - dependencies 항목(1.6.1 부터): `tailwindcss` 선언이 없으면 FAIL, `clsx` · `tailwind-merge` 선언이 없으면 WARN(종전과 같음). 여기에 선언된 `tailwindcss` · `clsx` · `tailwind-merge` · `@axis-ds/*` 가 `node_modules` 에 없으면 「선언됐지만 설치되지 않은 의존성」 WARN 과 lockfile 에 맞는 설치 명령을 냅니다. 상위 디렉터리의 `node_modules`(모노레포 호이스팅)도 찾고, Plug'n'Play(`.pnp.cjs`)는 설치본을 읽지 않고 선언 기준입니다. 1.6.0 까지는 선언만 보고 「모두 설치되어 있습니다」였습니다.
108
108
  - 해당할 때만 더하는 항목(1.6.0 부터, brand 항목 뒤 이 순서):
109
109
  - `brand.activation`: `brand` 가 있을 때 루트 레이아웃(`app/layout.tsx` · `src/app/layout.tsx` · `pages/_app` 등, 그 레이아웃이 import 하는 같은 디렉터리의 `./providers` 한 단계 포함)에 `data-brand` · `setBrand(` · `defaultBrand=` 가 없으면 WARN 입니다(휴리스틱, `ThemeProvider` 단독은 켜는 코드가 아님). 1.6.1 부터 마크업 `data-brand` 와 `ThemeProvider` 만 있고 `setBrand(` · `defaultBrand=` 가 없으면 설치본(없으면 선언) `@axis-ds/theme` 가 1.7.0 미만이거나 판정할 수 없을 때 WARN 입니다(1.6.2 이하는 마운트 때 속성을 지움).
110
- - `tailwind.content`: Tailwind 3 설정 파일이 있고 `componentsDir` 나 선언된 `@axis-ds/ui-react` · `@axis-ds/agentic-ui` 가 있을 때, `content` 의 문자열 glob 이 그 경로를 덮지 않으면 FAIL 입니다(그 경로의 클래스가 생성되지 않음). `content` 를 정적으로 다 읽지 못하면(변수 · 펼침) WARN 입니다. 패키지 경로는 프로젝트 디렉터리부터 상위로 찾은 설치본 위치 기준이라, npm workspaces · pnpm hoisted 처럼 루트에만 설치된 앱은 `../../node_modules/@axis-ds/ui-react/dist/**/*.{js,mjs}` 를 안내합니다(1.7.1 부터, 설치본이 없거나 Plug'n'Play 면 `./node_modules/...`). `**` 는 `../` 를 넘지 않는 것으로, 절대경로 glob 은 실제 위치와 비교해 판정합니다. 상위 경로는 Tailwind 3 가 빌드를 실행한 디렉터리 기준으로 풀리므로 모노레포 루트에서 빌드하면 `content: { relative: true, files: [...] }` 를 쓰세요(판정은 프로젝트 디렉터리에서 빌드한다고 보고 함).
110
+ - `tailwind.content`: Tailwind 3 설정 파일이 있고 `componentsDir` 나 선언된 `@axis-ds/ui-react` · `@axis-ds/agentic-ui` 가 있을 때, `content` 의 문자열 glob 이 그 경로를 덮지 않으면 FAIL 입니다(그 경로의 클래스가 생성되지 않음). `content` 를 정적으로 다 읽지 못하면(변수 · 펼침) WARN 입니다. 패키지 경로는 프로젝트 디렉터리부터 상위로 찾은 설치본 위치 기준이라, npm workspaces · pnpm hoisted 처럼 루트에만 설치된 앱은 `../../node_modules/@axis-ds/ui-react/dist/**/*.{js,mjs}` 를 안내합니다(1.7.1 부터, 설치본이 없거나 Plug'n'Play 면 `./node_modules/...`). `**` 는 `../` 를 넘지 않는 것으로, 절대경로 glob 은 실제 위치와 비교해 판정합니다. 1.7.4 부터 pnpm 기본 레이아웃처럼 앱 설치본이 링크이면 실경로가 같은 상위 설치본(`../../node_modules/...`)과 `.pnpm` 스토어 실경로를 상대 경로로 쓴 glob 도 인정하고, 실경로가 다른 상위 설치본을 가리키면 FAIL 문구에 그 이유를 붙입니다. 상위 경로는 Tailwind 3 가 빌드를 실행한 디렉터리 기준으로 풀리므로 모노레포 루트에서 빌드하면 `content: { relative: true, files: [...] }` 를 쓰세요(판정은 프로젝트 디렉터리에서 빌드한다고 보고 함).
111
111
  - `animation`: `@axis-ds/ui-react` 선언이나 `componentsDir` 의 `animate-in` 류 클래스가 있을 때 애니메이션 플러그인(Tailwind 3 `tailwindcss-animate` 선언 + 설치본 + `plugins` 배열 참조, Tailwind 4 `@import "tw-animate-css"`)이 없으면 WARN 입니다. 1.6.1 부터 Tailwind 3 은 `plugins` 배열 안의 `require("tailwindcss-animate")` 나 그 패키지를 받은 식별자(`import animate from` · `const animate = require(...)`)만 인정합니다(import 만 있거나 다른 곳의 같은 문자열은 아님). 배열을 정적으로 다 읽지 못하면(펼침 · 단축 속성) 「확인하지 못함」 WARN 입니다.
112
112
  - FAIL 이 하나라도 있으면 종료 코드 1 로 끝납니다. WARN 만 있으면 0 입니다(1.3.0 부터, 이전에는 결과와 관계없이 0).
113
113
  - MCP `axis.check_project` 도 같은 항목 · 문구를 냅니다.
package/dist/index.js CHANGED
@@ -2543,13 +2543,61 @@ function contentGlobCovers(glob, sample, baseDirInput) {
2543
2543
  return branches.some((b) => contentGlobBranchCovers(b, sample, baseDir));
2544
2544
  }
2545
2545
  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";
2546
+ function relDirOf(baseDir, dir) {
2547
+ const rel3 = relative(baseDir, dir);
2548
+ return rel3 === "" || isAbsolute(rel3) ? void 0 : rel3.split(sep).join("/");
2549
+ }
2550
+ function realDir(dir) {
2551
+ try {
2552
+ return realpathSync(dir);
2553
+ } catch {
2554
+ return void 0;
2555
+ }
2556
+ }
2557
+ function packageVersion(dir) {
2558
+ try {
2559
+ const parsed = JSON.parse(readFileSync(join(dir, "package.json"), "utf8"));
2560
+ return isPlainObject2(parsed) && typeof parsed.version === "string" ? parsed.version : void 0;
2561
+ } catch {
2562
+ return void 0;
2563
+ }
2564
+ }
2546
2565
  function packageContentTarget(baseDir, name) {
2547
2566
  const found = isPnpProject(baseDir) ? void 0 : findInstalledPackage(baseDir, name);
2548
- const rel3 = found === void 0 ? void 0 : relative(baseDir, found.dir);
2549
- const relDir = rel3 === void 0 || rel3 === "" || isAbsolute(rel3) ? `node_modules/${name}` : rel3.split(sep).join("/");
2567
+ const relDir = (found === void 0 ? void 0 : relDirOf(baseDir, found.dir)) ?? `node_modules/${name}`;
2568
+ const alternates = [];
2569
+ const others = [];
2570
+ const real = found === void 0 ? void 0 : realDir(found.dir);
2571
+ if (found !== void 0 && real !== void 0) {
2572
+ const relReal = relDirOf(baseDir, real);
2573
+ if (relReal !== void 0 && relReal !== relDir) alternates.push(`${relReal}/dist/index.js`);
2574
+ let dir = dirname(resolve(found.dir, ...name.split("/").map(() => ".."), ".."));
2575
+ for (; ; ) {
2576
+ const candidate = join(dir, "node_modules", ...name.split("/"));
2577
+ const rel3 = existsSync(join(candidate, "package.json")) ? relDirOf(baseDir, candidate) : void 0;
2578
+ if (rel3 !== void 0) {
2579
+ const candidateReal = realDir(candidate);
2580
+ if (candidateReal === real) alternates.push(`${rel3}/dist/index.js`);
2581
+ else {
2582
+ const theirs = packageVersion(candidate);
2583
+ const ours = found.version ?? packageVersion(found.dir);
2584
+ const versions = theirs === void 0 || ours === void 0 ? "" : theirs === ours ? `(\uBC84\uC804\uC740 ${ours} \uB85C \uAC19\uC74C)` : `(${theirs}, \uC571 ${ours})`;
2585
+ others.push({
2586
+ sample: `${rel3}/dist/index.js`,
2587
+ note: `\uC0C1\uC704 \uACBD\uB85C ${rel3} \uB294 \uC571\uC774 \uC4F0\uB294 \uC124\uCE58\uBCF8\uACFC \uB2E4\uB978 \uC124\uCE58\uBCF8${versions}\uC774\uB77C \uB36E\uC74C\uC73C\uB85C \uBCF4\uC9C0 \uC54A\uC544\uC694`
2588
+ });
2589
+ }
2590
+ }
2591
+ const parent = dirname(dir);
2592
+ if (parent === dir) break;
2593
+ dir = parent;
2594
+ }
2595
+ }
2550
2596
  return {
2551
2597
  sample: `${relDir}/dist/index.js`,
2552
- suggest: `${relDir.startsWith("../") ? "" : "./"}${relDir}/dist/**/*.{js,mjs}`
2598
+ suggest: `${relDir.startsWith("../") ? "" : "./"}${relDir}/dist/**/*.{js,mjs}`,
2599
+ alternates,
2600
+ others
2553
2601
  };
2554
2602
  }
2555
2603
  function balancedSlice(src, start) {
@@ -2623,7 +2671,12 @@ function inspectTailwindContent(baseDirInput) {
2623
2671
  configFile,
2624
2672
  unreadable: read === void 0,
2625
2673
  dynamic: read?.dynamic ?? false,
2626
- targets: targets.map((t) => ({ ...t, covered: globs.some((g) => contentGlobCovers(g, t.sample, baseDir)) }))
2674
+ targets: targets.map(({ alternates = [], others = [], ...t }) => {
2675
+ const covers = (sample) => globs.some((g) => contentGlobCovers(g, sample, baseDir));
2676
+ const covered = [t.sample, ...alternates].some(covers);
2677
+ const note = covered ? void 0 : others.find((o) => covers(o.sample))?.note;
2678
+ return note === void 0 ? { ...t, covered } : { ...t, covered, note };
2679
+ })
2627
2680
  };
2628
2681
  }
2629
2682
  function checkTailwindContent(baseDir) {
@@ -2637,7 +2690,7 @@ function checkTailwindContent(baseDir) {
2637
2690
  message: `${r.configFile}\uC758 content \uAC00 ${r.targets.map((t) => t.label).join(" \xB7 ")} \uB97C \uB36E\uC2B5\uB2C8\uB2E4`
2638
2691
  };
2639
2692
  }
2640
- const list = missing.map((t) => `${t.label} \u2192 "${t.suggest}"`).join(" \xB7 ");
2693
+ const list = missing.map((t) => `${t.label} \u2192 "${t.suggest}"${t.note === void 0 ? "" : ` (${t.note})`}`).join(" \xB7 ");
2641
2694
  const note = missing.some((t) => t.suggest.startsWith("../")) ? ` (${CONTENT_PARENT_PATH_NOTE})` : "";
2642
2695
  if (r.unreadable || r.dynamic) {
2643
2696
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axis-ds/cli",
3
- "version": "1.7.3",
3
+ "version": "1.7.4",
4
4
  "type": "module",
5
5
  "description": "AXIS Design System - CLI for adding components (shadcn compatible)",
6
6
  "publishConfig": {