@axis-ds/cli 1.2.0 → 1.2.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.
@@ -84,7 +84,7 @@ ${result}`;
84
84
  console.log(chalk.bold("\uBC29\uBC95 3: \uCF54\uB4DC \uBCF5\uC0AC"));
85
85
  console.log(chalk.gray(" 1. v0.app\uC5D0\uC11C \uCF54\uB4DC \uD0ED \uC5F4\uAE30"));
86
86
  console.log(chalk.gray(" 2. \uD30C\uC77C\uBCC4\uB85C \uCF54\uB4DC \uBCF5\uC0AC"));
87
- console.log(chalk.gray(" 3. axis-cli v0 convert\uB85C \uBCC0\uD658\n"));
87
+ console.log(chalk.gray(" 3. npx @axis-ds/cli v0 convert\uB85C \uBCC0\uD658\n"));
88
88
  const { method } = await prompts({
89
89
  type: "select",
90
90
  name: "method",
@@ -118,7 +118,7 @@ ${result}`;
118
118
  console.log(chalk.bold("3. \uB85C\uCEEC\uC5D0\uC11C \uD074\uB860:"));
119
119
  console.log(chalk.cyan(" git clone https://github.com/your-org/v0-project.git\n"));
120
120
  console.log(chalk.bold("4. AXIS \uBCC0\uD658:"));
121
- console.log(chalk.cyan(" axis-cli v0 convert ./v0-project/components/*.tsx\n"));
121
+ console.log(chalk.cyan(" npx @axis-ds/cli v0 convert ./v0-project/components/*.tsx\n"));
122
122
  console.log(chalk.gray("\uD301: GitHub Actions\uB85C \uC790\uB3D9 \uBCC0\uD658 \uC6CC\uD06C\uD50C\uB85C\uB3C4 \uC124\uC815 \uAC00\uB2A5\uD569\uB2C8\uB2E4.\n"));
123
123
  }
124
124
  // ZIP 파일에서 변환
@@ -134,7 +134,7 @@ ${result}`;
134
134
  console.log(chalk.yellow("\nZIP \uBCC0\uD658 \uAE30\uB2A5\uC740 \uCD94\uD6C4 \uAD6C\uD604 \uC608\uC815\uC785\uB2C8\uB2E4."));
135
135
  console.log(chalk.gray("\uD604\uC7AC\uB294 \uC218\uB3D9\uC73C\uB85C \uC555\uCD95 \uD574\uC81C \uD6C4 convert \uBA85\uB839\uC5B4\uB97C \uC0AC\uC6A9\uD558\uC138\uC694:\n"));
136
136
  console.log(chalk.cyan(" unzip v0-project.zip -d ./v0-project"));
137
- console.log(chalk.cyan(" axis-cli v0 convert ./v0-project/components/*.tsx\n"));
137
+ console.log(chalk.cyan(" npx @axis-ds/cli v0 convert ./v0-project/components/*.tsx\n"));
138
138
  }
139
139
  // 클립보드에서 변환
140
140
  async convertFromClipboard() {
@@ -185,7 +185,7 @@ ${result}`;
185
185
  console.log(chalk.gray(" AI/LLM \uAD00\uB828 UI\uC5D0\uB294 @axis-ds/agentic-ui \uC0AC\uC6A9:"));
186
186
  console.log(chalk.cyan(" import { StreamingText } from '@axis-ds/agentic-ui'\n"));
187
187
  console.log(chalk.bold("5. \uC790\uB3D9 \uBCC0\uD658"));
188
- console.log(chalk.cyan(" axis-cli v0 convert <file.tsx>\n"));
188
+ console.log(chalk.cyan(" npx @axis-ds/cli v0 convert <file.tsx>\n"));
189
189
  }
190
190
  };
191
191
  function getV0Url(path2 = "") {
@@ -852,7 +852,7 @@ async function initSync(owner, repo, projectNumber) {
852
852
  console.log(chalk.gray(` \uD504\uB85C\uC81D\uD2B8: #${projectNumber}`));
853
853
  console.log();
854
854
  console.log(chalk.cyan("\uB2E4\uC74C \uBA85\uB839\uC5B4\uB85C \uB3D9\uAE30\uD654\uB97C \uC2DC\uC791\uD558\uC138\uC694:"));
855
- console.log(chalk.cyan(" npx axis-cli sync"));
855
+ console.log(chalk.cyan(" npx @axis-ds/cli sync"));
856
856
  console.log();
857
857
  } catch (error) {
858
858
  spinner.fail(`\uC624\uB958: ${error.message}`);
@@ -35,8 +35,8 @@ var MonetClient = class {
35
35
  );
36
36
  }
37
37
  console.log(chalk.gray("\n\uC0AC\uC6A9\uBC95:"));
38
- console.log(chalk.gray(" axis-cli monet browse <category> # \uCE74\uD14C\uACE0\uB9AC \uCEF4\uD3EC\uB10C\uD2B8 \uBCF4\uAE30"));
39
- console.log(chalk.gray(" axis-cli monet search <query> # \uCEF4\uD3EC\uB10C\uD2B8 \uAC80\uC0C9\n"));
38
+ console.log(chalk.gray(" npx @axis-ds/cli monet browse <category> # \uCE74\uD14C\uACE0\uB9AC \uCEF4\uD3EC\uB10C\uD2B8 \uBCF4\uAE30"));
39
+ console.log(chalk.gray(" npx @axis-ds/cli monet search <query> # \uCEF4\uD3EC\uB10C\uD2B8 \uAC80\uC0C9\n"));
40
40
  }
41
41
  // 컴포넌트 검색 (웹 URL 안내)
42
42
  async searchComponents(query) {
@@ -82,7 +82,7 @@ var MonetClient = class {
82
82
  console.log(chalk.gray("\n\uCEF4\uD3EC\uB10C\uD2B8 \uAC00\uC838\uC624\uAE30:"));
83
83
  console.log(chalk.gray(" 1. \uC6F9\uC5D0\uC11C \uCEF4\uD3EC\uB10C\uD2B8 \uC120\uD0DD"));
84
84
  console.log(chalk.gray(" 2. Copy Code \uBC84\uD2BC \uD074\uB9AD"));
85
- console.log(chalk.gray(" 3. axis-cli monet import \uC2E4\uD589\n"));
85
+ console.log(chalk.gray(" 3. npx @axis-ds/cli monet import \uC2E4\uD589\n"));
86
86
  }
87
87
  // 카테고리별 예시 컴포넌트
88
88
  getCategoryExamples(category) {
package/dist/index.js CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  MonetClient
4
- } from "./chunk-WRDOGNSG.js";
4
+ } from "./chunk-ZVVACWEW.js";
5
5
  import {
6
6
  V0Client
7
- } from "./chunk-GCOWKKXG.js";
7
+ } from "./chunk-AHQT77FJ.js";
8
8
  import {
9
9
  registerSyncCommand
10
- } from "./chunk-D26GW2HO.js";
10
+ } from "./chunk-QORBOSUA.js";
11
11
  import {
12
12
  fetchTemplateDetail,
13
13
  fetchTemplateIndex
@@ -15,12 +15,12 @@ import {
15
15
 
16
16
  // src/index.ts
17
17
  import { Command } from "commander";
18
- import chalk9 from "chalk";
18
+ import chalk11 from "chalk";
19
19
  import ora6 from "ora";
20
- import fs10 from "fs-extra";
21
- import path11 from "path";
20
+ import fs11 from "fs-extra";
21
+ import path12 from "path";
22
22
  import { createRequire as createRequire2 } from "module";
23
- import prompts2 from "prompts";
23
+ import prompts3 from "prompts";
24
24
 
25
25
  // src/library/base-collector.ts
26
26
  import crypto from "crypto";
@@ -484,11 +484,11 @@ var ShadcnCollector = class extends BaseCollector {
484
484
  /**
485
485
  * 파일 타입 추론
486
486
  */
487
- getFileType(path12) {
488
- if (path12.includes("hook") || path12.startsWith("use")) return "hook";
489
- if (path12.includes("util") || path12.includes("lib")) return "util";
490
- if (path12.endsWith(".css")) return "style";
491
- if (path12.endsWith(".d.ts") || path12.includes("types")) return "type";
487
+ getFileType(path13) {
488
+ if (path13.includes("hook") || path13.startsWith("use")) return "hook";
489
+ if (path13.includes("util") || path13.includes("lib")) return "util";
490
+ if (path13.endsWith(".css")) return "style";
491
+ if (path13.endsWith(".d.ts") || path13.includes("types")) return "type";
492
492
  return "component";
493
493
  }
494
494
  };
@@ -1474,7 +1474,7 @@ var LibraryCurator = class {
1474
1474
  const index = await this.loadIndex();
1475
1475
  if (!index) {
1476
1476
  console.log(chalk2.yellow("\n\u26A0\uFE0F \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC778\uB371\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."));
1477
- console.log(chalk2.gray(" axis-cli library collect \uBA85\uB839\uC5B4\uB85C \uC218\uC9D1\uC744 \uBA3C\uC800 \uC2E4\uD589\uD558\uC138\uC694.\n"));
1477
+ console.log(chalk2.gray(" npx @axis-ds/cli library collect \uBA85\uB839\uC5B4\uB85C \uC218\uC9D1\uC744 \uBA3C\uC800 \uC2E4\uD589\uD558\uC138\uC694.\n"));
1478
1478
  return;
1479
1479
  }
1480
1480
  console.log(chalk2.blue("\n\u{1F4CA} Library Curator - \uD1B5\uACC4\n"));
@@ -2985,74 +2985,357 @@ function registerThemeCommand(program2) {
2985
2985
  });
2986
2986
  }
2987
2987
 
2988
- // src/index.ts
2989
- var { version: CLI_VERSION } = createRequire2(import.meta.url)("../package.json");
2990
- var REGISTRY_URL = process.env.AXIS_REGISTRY_URL || "https://axis.minu.best/r";
2991
- var program = new Command();
2992
- program.name("axis").description("AXIS Design System CLI - shadcn \uD638\uD658 \uCEF4\uD3EC\uB10C\uD2B8 \uC124\uCE58 \uB3C4\uAD6C").version(CLI_VERSION);
2993
- program.command("init").description("\uD504\uB85C\uC81D\uD2B8\uC5D0 AXIS Design System \uCD08\uAE30\uD654").option("-y, --yes", "\uAE30\uBCF8\uAC12\uC73C\uB85C \uC790\uB3D9 \uC124\uC815").action(async (options) => {
2994
- console.log(chalk9.blue("\n\u{1F3A8} AXIS Design System \uCD08\uAE30\uD654\n"));
2995
- const config = options.yes ? {
2996
- componentsDir: "./src/components/ui",
2997
- tailwindConfig: "./tailwind.config.ts",
2998
- globalCss: "./src/app/globals.css"
2999
- } : await prompts2([
3000
- {
3001
- type: "text",
3002
- name: "componentsDir",
3003
- message: "\uCEF4\uD3EC\uB10C\uD2B8 \uB514\uB809\uD1A0\uB9AC:",
3004
- initial: "./src/components/ui"
3005
- },
3006
- {
3007
- type: "text",
3008
- name: "tailwindConfig",
3009
- message: "Tailwind \uC124\uC815 \uD30C\uC77C:",
3010
- initial: "./tailwind.config.ts"
3011
- },
3012
- {
3013
- type: "text",
3014
- name: "globalCss",
3015
- message: "\uAE00\uB85C\uBC8C CSS \uD30C\uC77C:",
3016
- initial: "./src/app/globals.css"
2988
+ // src/init/index.ts
2989
+ import chalk10 from "chalk";
2990
+ import prompts2 from "prompts";
2991
+
2992
+ // src/init/init.ts
2993
+ import { accessSync as accessSync2, constants as constants2, existsSync as existsSync3, readFileSync as readFileSync3, writeFileSync as writeFileSync2 } from "fs";
2994
+ import path11 from "path";
2995
+ import chalk9 from "chalk";
2996
+ import fs10 from "fs-extra";
2997
+ var CLSX_RANGE = "^2.1.1";
2998
+ var TAILWIND_MERGE_RANGES = {
2999
+ tailwind4: "^3.4.0",
3000
+ tailwind3: "^2.6.0"
3001
+ };
3002
+ var VERSION = String.raw`v?(\d+)(?:\.(\d+|[xX*]))?(?:\.(\d+|[xX*]))?(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?`;
3003
+ function versionParts(token) {
3004
+ const m = new RegExp(`^${VERSION}$`).exec(token);
3005
+ if (!m) return void 0;
3006
+ if (/^v?0\.0\.0-/.test(token)) return void 0;
3007
+ return { major: Number(m[1]), minor: m[2], patch: m[3] };
3008
+ }
3009
+ var isWild = (part) => part === void 0 || /^[xX*]$/.test(part);
3010
+ function comparatorBounds(op, v) {
3011
+ switch (op) {
3012
+ case ">=":
3013
+ return { lower: v.major };
3014
+ case ">":
3015
+ return { lower: isWild(v.minor) ? v.major + 1 : v.major };
3016
+ case "<=":
3017
+ return { upper: v.major };
3018
+ case "<": {
3019
+ const zeroOrWild = (part) => isWild(part) || Number(part) === 0;
3020
+ return { upper: zeroOrWild(v.minor) && zeroOrWild(v.patch) ? v.major - 1 : v.major };
3021
+ }
3022
+ default:
3023
+ return { lower: v.major, upper: v.major };
3024
+ }
3025
+ }
3026
+ function tailwindMajorBounds(range) {
3027
+ const r = range.trim();
3028
+ if (r === "" || r.includes("||")) return void 0;
3029
+ const simple = new RegExp(`^(?:\\^|~|=)?\\s*(${VERSION})$`).exec(r);
3030
+ if (simple) {
3031
+ const v = versionParts(simple[1]);
3032
+ return v ? { lower: v.major, upper: v.major } : void 0;
3033
+ }
3034
+ const hyphen = new RegExp(`^(${VERSION})\\s+-\\s+(${VERSION})$`).exec(r);
3035
+ if (hyphen) {
3036
+ const tokens2 = r.split(/\s+-\s+/);
3037
+ const a = versionParts(tokens2[0]);
3038
+ const b = versionParts(tokens2[1]);
3039
+ return a && b && a.major <= b.major ? { lower: a.major, upper: b.major } : void 0;
3040
+ }
3041
+ const tokens = r.replace(/(>=|<=|>|<|=)\s+/g, "$1").split(/\s+/);
3042
+ const lowers = [];
3043
+ const uppers = [];
3044
+ for (const t of tokens) {
3045
+ const c = /^(>=|<=|>|<|=)(.+)$/.exec(t);
3046
+ if (!c) return void 0;
3047
+ const v = versionParts(c[2]);
3048
+ if (v === void 0) return void 0;
3049
+ const b = comparatorBounds(c[1], v);
3050
+ if (b.lower !== void 0) lowers.push(b.lower);
3051
+ if (b.upper !== void 0) uppers.push(b.upper);
3052
+ }
3053
+ if (lowers.length === 0) return void 0;
3054
+ const lower = Math.max(...lowers);
3055
+ const upper = uppers.length > 0 ? Math.min(...uppers) : void 0;
3056
+ if (upper !== void 0 && upper < lower) return void 0;
3057
+ return upper !== void 0 ? { lower, upper } : { lower };
3058
+ }
3059
+ function majorWithin(major, bounds) {
3060
+ return major >= bounds.lower && (bounds.upper === void 0 || major <= bounds.upper);
3061
+ }
3062
+ function majorFromVersion(version) {
3063
+ if (typeof version !== "string") return void 0;
3064
+ const v = version.trim();
3065
+ const m = /^v?(\d+)\.\d+\.\d+(?:[-+][0-9A-Za-z.+-]*)?$/.exec(v);
3066
+ if (!m || /^v?0\.0\.0-/.test(v)) return void 0;
3067
+ return Number(m[1]);
3068
+ }
3069
+ function detectTailwind(baseDirInput, pkg) {
3070
+ const baseDir = path11.resolve(baseDirInput);
3071
+ const installedFile = path11.join(baseDir, "node_modules", "tailwindcss", "package.json");
3072
+ const declared = pkg ? hasDependency(pkg, "tailwindcss") : void 0;
3073
+ const bounds = declared !== void 0 ? tailwindMajorBounds(declared) : void 0;
3074
+ const declaredMajor = bounds?.lower;
3075
+ try {
3076
+ const installed = JSON.parse(readFileSync3(installedFile, "utf8"));
3077
+ const version = isPlainObject(installed) ? installed.version : void 0;
3078
+ const major = majorFromVersion(version);
3079
+ if (major !== void 0) {
3080
+ const found = { major, source: "installed", value: String(version) };
3081
+ if (declared !== void 0 && bounds !== void 0 && !majorWithin(major, bounds)) {
3082
+ found.mismatch = { declared, declaredMajor: bounds.lower };
3083
+ }
3084
+ return found;
3017
3085
  }
3018
- ]);
3086
+ } catch {
3087
+ }
3088
+ if (declared !== void 0) {
3089
+ if (declaredMajor !== void 0) return { major: declaredMajor, source: "declared", value: declared };
3090
+ return { source: "none", value: declared };
3091
+ }
3092
+ return { source: "none" };
3093
+ }
3094
+ function selectUtilsDependencies(tailwind) {
3095
+ return {
3096
+ clsx: CLSX_RANGE,
3097
+ "tailwind-merge": tailwind.major !== void 0 && tailwind.major >= 4 ? TAILWIND_MERGE_RANGES.tailwind4 : TAILWIND_MERGE_RANGES.tailwind3
3098
+ };
3099
+ }
3100
+ function tailwindWarnings(tailwind, installCommand) {
3101
+ const out = [];
3102
+ if (tailwind.source === "none" && tailwind.value !== void 0) {
3103
+ out.push(
3104
+ `! tailwindcss \uC120\uC5B8(${tailwind.value})\uC740 \uD310\uC815 \uBD88\uAC00 - \uAE30\uBCF8\uAC12 \uC0AC\uC6A9(Tailwind 3, tailwind-merge ${TAILWIND_MERGE_RANGES.tailwind3}). Tailwind 4 \uC774\uC0C1\uC774\uBA74 tailwind-merge \uB97C ${TAILWIND_MERGE_RANGES.tailwind4} \uC73C\uB85C \uBC14\uAFB8\uC138\uC694.`
3105
+ );
3106
+ }
3107
+ if (tailwind.mismatch) {
3108
+ out.push(
3109
+ `! \uC124\uCE58\uBCF8 tailwindcss ${tailwind.value}(major ${tailwind.major})\uC640 package.json \uC120\uC5B8 ${tailwind.mismatch.declared}(major ${tailwind.mismatch.declaredMajor})\uAC00 \uB2E4\uB984 - \uC124\uCE58\uBCF8\uC744 \uB530\uB790\uC2B5\uB2C8\uB2E4. ${installCommand} \uB4A4 tailwind-merge \uBC94\uC704\uB97C \uB2E4\uC2DC \uD655\uC778\uD558\uC138\uC694.`
3110
+ );
3111
+ }
3112
+ return out;
3113
+ }
3114
+ function describeTailwindBasis(tailwind) {
3115
+ if (tailwind.source === "installed") return `\uC124\uCE58\uB41C tailwindcss ${tailwind.value}`;
3116
+ if (tailwind.source === "declared") return `package.json \uC758 tailwindcss ${tailwind.value}`;
3117
+ if (tailwind.value !== void 0) {
3118
+ return `package.json \uC758 tailwindcss ${tailwind.value} \uB85C \uBC84\uC804\uC744 \uD310\uC815\uD558\uC9C0 \uBABB\uD574 \uAE30\uBCF8\uAC12(Tailwind 3)`;
3119
+ }
3120
+ return "tailwindcss \uB97C \uCC3E\uC9C0 \uBABB\uD574 \uAE30\uBCF8\uAC12(Tailwind 3)";
3121
+ }
3122
+ var UTILS_TS_CONTENT = `import { type ClassValue, clsx } from "clsx";
3123
+ import { twMerge } from "tailwind-merge";
3124
+
3125
+ export function cn(...inputs: ClassValue[]) {
3126
+ return twMerge(clsx(inputs));
3127
+ }
3128
+ `;
3129
+ var INIT_DEFAULTS = {
3130
+ componentsDir: "./src/components/ui",
3131
+ tailwindConfig: "./tailwind.config.ts",
3132
+ globalCss: "./src/app/globals.css"
3133
+ };
3134
+ var INIT_NEXT_STEP_COMMAND = "npx @axis-ds/cli add button";
3135
+ var BOM = "\uFEFF";
3136
+ function addCommandFor(installCommand, deps) {
3137
+ const specs = Object.entries(deps).map(([name, range]) => `"${name}@${range}"`).join(" ");
3138
+ if (installCommand.startsWith("yarn")) return `yarn add ${specs}`;
3139
+ if (installCommand.startsWith("npm")) return `npm install ${specs}`;
3140
+ return `pnpm add ${specs}`;
3141
+ }
3142
+ function planUtilsDependencies(baseDirInput) {
3143
+ const baseDir = path11.resolve(baseDirInput);
3144
+ const installCommand = detectInstallCommand(baseDir);
3145
+ const tailwind0 = detectTailwind(baseDir);
3146
+ const ranges0 = selectUtilsDependencies(tailwind0);
3147
+ const plan = {
3148
+ action: "no-package-json",
3149
+ added: [],
3150
+ present: [],
3151
+ ranges: ranges0,
3152
+ tailwind: tailwind0,
3153
+ installCommand,
3154
+ addCommand: addCommandFor(installCommand, ranges0)
3155
+ };
3156
+ const pkgFile = path11.join(baseDir, "package.json");
3157
+ if (!existsSync3(pkgFile)) return plan;
3158
+ const unwritable = (reason) => ({ ...plan, action: "unwritable", reason });
3159
+ let where;
3160
+ try {
3161
+ where = realPathInside(baseDir, pkgFile);
3162
+ } catch (err) {
3163
+ return unwritable(err.message);
3164
+ }
3165
+ if (!where.inside) return unwritable(`\uC2E4\uC81C \uC704\uCE58(${where.realPath})\uAC00 \uD504\uB85C\uC81D\uD2B8 \uB514\uB809\uD130\uB9AC \uBC16\uC785\uB2C8\uB2E4`);
3166
+ let text;
3167
+ try {
3168
+ text = readFileSync3(pkgFile, "utf8");
3169
+ } catch (err) {
3170
+ return unwritable(err.message);
3171
+ }
3172
+ const bom = text.startsWith(BOM) ? BOM : "";
3173
+ const body = bom ? text.slice(1) : text;
3174
+ let pkg;
3175
+ try {
3176
+ const parsed = JSON.parse(body);
3177
+ if (!isPlainObject(parsed)) throw new Error("\uCD5C\uC0C1\uC704\uAC00 \uAC1D\uCCB4\uAC00 \uC544\uB2D9\uB2C8\uB2E4");
3178
+ pkg = parsed;
3179
+ } catch (err) {
3180
+ return unwritable(`JSON \uC744 \uC77D\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: ${err.message}`);
3181
+ }
3182
+ plan.tailwind = detectTailwind(baseDir, pkg);
3183
+ plan.ranges = selectUtilsDependencies(plan.tailwind);
3184
+ plan.addCommand = addCommandFor(installCommand, plan.ranges);
3185
+ const missing = {};
3186
+ for (const [name, range] of Object.entries(plan.ranges)) {
3187
+ const declared = hasDependency(pkg, name);
3188
+ if (declared !== void 0) plan.present.push({ name, range: declared });
3189
+ else missing[name] = range;
3190
+ }
3191
+ plan.added = Object.keys(missing);
3192
+ plan.addCommand = addCommandFor(installCommand, plan.added.length > 0 ? missing : plan.ranges);
3193
+ if (plan.added.length === 0) return { ...plan, action: "present" };
3194
+ if (pkg.dependencies !== void 0 && !isPlainObject(pkg.dependencies)) {
3195
+ return unwritable("dependencies \uAC00 \uAC1D\uCCB4\uAC00 \uC544\uB2D9\uB2C8\uB2E4");
3196
+ }
3197
+ try {
3198
+ accessSync2(pkgFile, constants2.W_OK);
3199
+ } catch (err) {
3200
+ return unwritable(`\uC4F8 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4(${err.message})`);
3201
+ }
3202
+ const deps = { ...pkg.dependencies ?? {}, ...missing };
3203
+ const after = bom + formatJsonLike(body, { ...pkg, dependencies: deps });
3204
+ return { ...plan, action: "add", write: { file: pkgFile, before: text, after } };
3205
+ }
3206
+ var defaultWriteFile = (file, data) => writeFileSync2(file, data);
3207
+ function applyUtilsDependencies(baseDirInput, plan, writeFile = defaultWriteFile) {
3208
+ const w = plan.write;
3209
+ if (plan.action !== "add" || !w) return false;
3210
+ const baseDir = path11.resolve(baseDirInput);
3211
+ const current = existsSync3(w.file) ? readFileSync3(w.file, "utf8") : null;
3212
+ if (current !== w.before) {
3213
+ throw new Error(`${w.file} \uC774 \uACC4\uD68D \uB4A4\uC5D0 \uBC14\uB00C\uC5C8\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2E4\uD589\uD558\uC138\uC694.`);
3214
+ }
3215
+ const where = realPathInside(baseDir, w.file);
3216
+ if (!where.inside) {
3217
+ throw new Error(`${w.file} \uC758 \uC2E4\uC81C \uC704\uCE58(${where.realPath})\uAC00 \uD504\uB85C\uC81D\uD2B8 \uB514\uB809\uD130\uB9AC \uBC16\uC785\uB2C8\uB2E4. \uC4F0\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.`);
3218
+ }
3219
+ JSON.parse(w.after.startsWith(BOM) ? w.after.slice(1) : w.after);
3220
+ try {
3221
+ writeFile(w.file, w.after);
3222
+ } catch (err) {
3223
+ const cause = err.message;
3224
+ let restored;
3225
+ try {
3226
+ writeFile(w.file, w.before);
3227
+ if (readFileSync3(w.file, "utf8") !== w.before) throw new Error("\uB418\uB3CC\uB9B0 \uB0B4\uC6A9\uC774 \uC6D0\uB798 \uB0B4\uC6A9\uACFC \uB2E4\uB985\uB2C8\uB2E4");
3228
+ restored = "\uC6D0\uB798 \uB0B4\uC6A9\uC73C\uB85C \uB418\uB3CC\uB838\uC2B5\uB2C8\uB2E4";
3229
+ } catch (restoreErr) {
3230
+ restored = `\uC6D0\uB798 \uB0B4\uC6A9\uC73C\uB85C \uB418\uB3CC\uB9AC\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4(${restoreErr.message}). \uD30C\uC77C\uC774 \uC798\uB838\uAC70\uB098 \uBE44\uC5C8\uC744 \uC218 \uC788\uC73C\uB2C8 \uBC84\uC804 \uAD00\uB9AC \uB3C4\uAD6C \uB4F1\uC73C\uB85C \uBCF5\uAD6C\uD558\uC138\uC694`;
3231
+ }
3232
+ throw new Error(`${w.file} \uC744 \uC4F0\uB294 \uB3C4\uC911 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4(${cause}). ${restored}.`);
3233
+ }
3234
+ return true;
3235
+ }
3236
+ function reportDependencies(plan, log) {
3237
+ const presentText = plan.present.map((p) => `${p.name} (${p.range})`).join(", ");
3238
+ const basis = ` tailwind-merge \uBC94\uC704 \uAE30\uC900: ${describeTailwindBasis(plan.tailwind)}`;
3239
+ const logBasis = () => {
3240
+ log(chalk9.gray(basis));
3241
+ for (const w of tailwindWarnings(plan.tailwind, plan.installCommand)) log(chalk9.yellow(` ${w}`));
3242
+ };
3243
+ if (plan.action === "add") {
3244
+ const addedText = plan.added.map((n) => `${n}@${plan.ranges[n]}`).join(", ");
3245
+ log(chalk9.green(`\u2713 package.json dependencies \uC5D0 \uCD94\uAC00: ${addedText}`));
3246
+ if (plan.present.length > 0) log(chalk9.gray(` \uC774\uBBF8 \uC788\uC74C(\uBC84\uC804 \uC720\uC9C0): ${presentText}`));
3247
+ if (plan.added.includes("tailwind-merge")) logBasis();
3248
+ log(chalk9.yellow(` \uC124\uCE58\uB294 \uC2E4\uD589\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uC124\uCE58: ${chalk9.cyan(plan.installCommand)}`));
3249
+ } else if (plan.action === "present") {
3250
+ log(chalk9.green(`\u2713 utils.ts \uC758\uC874\uC131\uC774 package.json \uC5D0 \uC774\uBBF8 \uC788\uC2B5\uB2C8\uB2E4(\uBC84\uC804 \uC720\uC9C0): ${presentText}`));
3251
+ log(chalk9.yellow(` \uC124\uCE58\uB294 \uC2E4\uD589\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uC124\uCE58: ${chalk9.cyan(plan.installCommand)}`));
3252
+ } else if (plan.action === "no-package-json") {
3253
+ log(chalk9.yellow("! package.json \uC774 \uC5C6\uC5B4 utils.ts \uC758\uC874\uC131(clsx, tailwind-merge)\uC744 \uCD94\uAC00\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."));
3254
+ log(chalk9.yellow(` \uC124\uCE58: ${chalk9.cyan(plan.addCommand)}`));
3255
+ logBasis();
3256
+ } else {
3257
+ log(chalk9.yellow(`! package.json \uC744 \uBC14\uAFB8\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4(${plan.reason}).`));
3258
+ log(chalk9.yellow(` utils.ts \uC758\uC874\uC131 \uC124\uCE58: ${chalk9.cyan(plan.addCommand)}`));
3259
+ if (plan.addCommand.includes('"tailwind-merge@')) logBasis();
3260
+ }
3261
+ }
3262
+ async function runInit(baseDirInput, answers, registryUrl, log = console.log) {
3263
+ const baseDir = path11.resolve(baseDirInput);
3019
3264
  const axisConfig = createInitConfig(
3020
3265
  {
3021
- componentsDir: config.componentsDir,
3022
- tailwindConfig: config.tailwindConfig,
3023
- globalCss: config.globalCss
3266
+ componentsDir: answers.componentsDir,
3267
+ tailwindConfig: answers.tailwindConfig,
3268
+ globalCss: answers.globalCss
3024
3269
  },
3025
- REGISTRY_URL
3270
+ registryUrl
3026
3271
  );
3027
- await fs10.writeJSON("axis.config.json", axisConfig, { spaces: 2 });
3028
- console.log(chalk9.green("\u2713 axis.config.json \uC0DD\uC131 \uC644\uB8CC"));
3029
- const utilsPath = path11.join(config.componentsDir, "utils.ts");
3272
+ await fs10.writeJSON(path11.join(baseDir, "axis.config.json"), axisConfig, { spaces: 2 });
3273
+ log(chalk9.green("\u2713 axis.config.json \uC0DD\uC131 \uC644\uB8CC"));
3274
+ const utilsPath = path11.resolve(baseDir, answers.componentsDir, "utils.ts");
3030
3275
  await fs10.ensureDir(path11.dirname(utilsPath));
3031
- await fs10.writeFile(
3032
- utilsPath,
3033
- `import { type ClassValue, clsx } from "clsx";
3034
- import { twMerge } from "tailwind-merge";
3276
+ await fs10.writeFile(utilsPath, UTILS_TS_CONTENT);
3277
+ log(chalk9.green("\u2713 utils.ts \uC0DD\uC131 \uC644\uB8CC"));
3278
+ const plan = planUtilsDependencies(baseDir);
3279
+ try {
3280
+ applyUtilsDependencies(baseDir, plan);
3281
+ } catch (err) {
3282
+ log(chalk9.red(`\u2717 package.json \uC744 \uC4F0\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4: ${err.message}`));
3283
+ log(chalk9.yellow(" axis.config.json \uACFC utils.ts \uB294 \uC774\uBBF8 \uB9CC\uB4E4\uC5B4\uC84C\uC2B5\uB2C8\uB2E4."));
3284
+ log(chalk9.yellow(` utils.ts \uC758\uC874\uC131 \uC124\uCE58: ${chalk9.cyan(plan.addCommand)}`));
3285
+ process.exitCode = 1;
3286
+ return;
3287
+ }
3288
+ reportDependencies(plan, log);
3289
+ log(chalk9.blue("\n\uCD08\uAE30\uD654 \uC644\uB8CC! \uC774\uC81C \uB2E4\uC74C \uBA85\uB839\uC5B4\uB85C \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uCD94\uAC00\uD558\uC138\uC694:"));
3290
+ log(chalk9.cyan(` ${INIT_NEXT_STEP_COMMAND}
3291
+ `));
3292
+ }
3035
3293
 
3036
- export function cn(...inputs: ClassValue[]) {
3037
- return twMerge(clsx(inputs));
3294
+ // src/init/index.ts
3295
+ function registerInitCommand(program2, registryUrl) {
3296
+ program2.command("init").description("\uD504\uB85C\uC81D\uD2B8\uC5D0 AXIS Design System \uCD08\uAE30\uD654").option("-y, --yes", "\uAE30\uBCF8\uAC12\uC73C\uB85C \uC790\uB3D9 \uC124\uC815").action(async (options) => {
3297
+ console.log(chalk10.blue("\n\u{1F3A8} AXIS Design System \uCD08\uAE30\uD654\n"));
3298
+ const config = options.yes ? { ...INIT_DEFAULTS } : await prompts2([
3299
+ {
3300
+ type: "text",
3301
+ name: "componentsDir",
3302
+ message: "\uCEF4\uD3EC\uB10C\uD2B8 \uB514\uB809\uD1A0\uB9AC:",
3303
+ initial: INIT_DEFAULTS.componentsDir
3304
+ },
3305
+ {
3306
+ type: "text",
3307
+ name: "tailwindConfig",
3308
+ message: "Tailwind \uC124\uC815 \uD30C\uC77C:",
3309
+ initial: INIT_DEFAULTS.tailwindConfig
3310
+ },
3311
+ {
3312
+ type: "text",
3313
+ name: "globalCss",
3314
+ message: "\uAE00\uB85C\uBC8C CSS \uD30C\uC77C:",
3315
+ initial: INIT_DEFAULTS.globalCss
3316
+ }
3317
+ ]);
3318
+ await runInit(process.cwd(), config, registryUrl);
3319
+ });
3038
3320
  }
3039
- `
3040
- );
3041
- console.log(chalk9.green("\u2713 utils.ts \uC0DD\uC131 \uC644\uB8CC"));
3042
- console.log(chalk9.blue("\n\uCD08\uAE30\uD654 \uC644\uB8CC! \uC774\uC81C \uB2E4\uC74C \uBA85\uB839\uC5B4\uB85C \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uCD94\uAC00\uD558\uC138\uC694:"));
3043
- console.log(chalk9.cyan(" npx axis-cli add button\n"));
3044
- });
3321
+
3322
+ // src/index.ts
3323
+ var { version: CLI_VERSION } = createRequire2(import.meta.url)("../package.json");
3324
+ var REGISTRY_URL = process.env.AXIS_REGISTRY_URL || "https://axis.minu.best/r";
3325
+ var program = new Command();
3326
+ program.name("axis").description("AXIS Design System CLI - shadcn \uD638\uD658 \uCEF4\uD3EC\uB10C\uD2B8 \uC124\uCE58 \uB3C4\uAD6C").version(CLI_VERSION);
3327
+ registerInitCommand(program, REGISTRY_URL);
3045
3328
  program.command("add <component>").description("\uCEF4\uD3EC\uB10C\uD2B8 \uCD94\uAC00").option("--agentic", "Agentic UI \uCEF4\uD3EC\uB10C\uD2B8 \uCD94\uAC00").option("-y, --yes", "\uD655\uC778 \uC5C6\uC774 \uB36E\uC5B4\uC4F0\uAE30").action(async (component, options) => {
3046
3329
  const spinner = ora6(`${component} \uCEF4\uD3EC\uB10C\uD2B8 \uAC00\uC838\uC624\uB294 \uC911...`).start();
3047
3330
  try {
3048
- const configPath = path11.resolve("axis.config.json");
3049
- if (!await fs10.pathExists(configPath)) {
3331
+ const configPath = path12.resolve("axis.config.json");
3332
+ if (!await fs11.pathExists(configPath)) {
3050
3333
  spinner.fail(
3051
3334
  "axis.config.json\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\n \uD574\uACB0: \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8\uC5D0\uC11C 'npx @axis-ds/cli init'\uC744 \uC2E4\uD589\uD558\uC138\uC694.\n \uCC38\uACE0: https://axis.minu.best/docs/guides/quick-start"
3052
3335
  );
3053
3336
  process.exit(1);
3054
3337
  }
3055
- const config = await fs10.readJSON(configPath);
3338
+ const config = await fs11.readJSON(configPath);
3056
3339
  const category = options.agentic ? "agentic" : "ui";
3057
3340
  const componentInfo = await getComponentInfo(component, category);
3058
3341
  if (!componentInfo) {
@@ -3065,10 +3348,10 @@ program.command("add <component>").description("\uCEF4\uD3EC\uB10C\uD2B8 \uCD94\
3065
3348
  }
3066
3349
  spinner.text = `${component} \uCEF4\uD3EC\uB10C\uD2B8 \uC124\uCE58 \uC911...`;
3067
3350
  for (const file of componentInfo.files) {
3068
- const filePath = path11.join(config.componentsDir, file.path);
3069
- if (await fs10.pathExists(filePath)) {
3351
+ const filePath = path12.join(config.componentsDir, file.path);
3352
+ if (await fs11.pathExists(filePath)) {
3070
3353
  if (!options.yes) {
3071
- const { overwrite } = await prompts2({
3354
+ const { overwrite } = await prompts3({
3072
3355
  type: "confirm",
3073
3356
  name: "overwrite",
3074
3357
  message: `${file.path}\uC774(\uAC00) \uC774\uBBF8 \uC874\uC7AC\uD569\uB2C8\uB2E4. \uB36E\uC5B4\uC4F0\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?`,
@@ -3077,13 +3360,13 @@ program.command("add <component>").description("\uCEF4\uD3EC\uB10C\uD2B8 \uCD94\
3077
3360
  if (!overwrite) continue;
3078
3361
  }
3079
3362
  }
3080
- await fs10.ensureDir(path11.dirname(filePath));
3081
- await fs10.writeFile(filePath, file.content);
3363
+ await fs11.ensureDir(path12.dirname(filePath));
3364
+ await fs11.writeFile(filePath, file.content);
3082
3365
  }
3083
- spinner.succeed(chalk9.green(`${component} \uCEF4\uD3EC\uB10C\uD2B8 \uCD94\uAC00 \uC644\uB8CC`));
3366
+ spinner.succeed(chalk11.green(`${component} \uCEF4\uD3EC\uB10C\uD2B8 \uCD94\uAC00 \uC644\uB8CC`));
3084
3367
  if (componentInfo.dependencies.length > 0) {
3085
- console.log(chalk9.yellow("\n\uD544\uC694\uD55C \uC758\uC874\uC131:"));
3086
- console.log(chalk9.cyan(` pnpm add ${componentInfo.dependencies.join(" ")}`));
3368
+ console.log(chalk11.yellow("\n\uD544\uC694\uD55C \uC758\uC874\uC131:"));
3369
+ console.log(chalk11.cyan(` pnpm add ${componentInfo.dependencies.join(" ")}`));
3087
3370
  }
3088
3371
  } catch (error) {
3089
3372
  spinner.fail(
@@ -3095,7 +3378,7 @@ program.command("add <component>").description("\uCEF4\uD3EC\uB10C\uD2B8 \uCD94\
3095
3378
  }
3096
3379
  });
3097
3380
  program.command("list").description("\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uCEF4\uD3EC\uB10C\uD2B8 \uBAA9\uB85D").option("--category <type>", "\uCE74\uD14C\uACE0\uB9AC \uD544\uD130 (ui, agentic)").action(async (options) => {
3098
- console.log(chalk9.blue("\n\u{1F4E6} AXIS Design System \uCEF4\uD3EC\uB10C\uD2B8\n"));
3381
+ console.log(chalk11.blue("\n\u{1F4E6} AXIS Design System \uCEF4\uD3EC\uB10C\uD2B8\n"));
3099
3382
  const components = {
3100
3383
  ui: [
3101
3384
  { name: "button", description: "\uAE30\uBCF8 \uBC84\uD2BC \uCEF4\uD3EC\uB10C\uD2B8" },
@@ -3123,9 +3406,9 @@ program.command("list").description("\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uCEF4\uD3E
3123
3406
  ]
3124
3407
  };
3125
3408
  const showCategory = (category, items) => {
3126
- console.log(chalk9.bold(category === "ui" ? "Core UI" : "Agentic UI"));
3409
+ console.log(chalk11.bold(category === "ui" ? "Core UI" : "Agentic UI"));
3127
3410
  items.forEach((c) => {
3128
- console.log(` ${chalk9.cyan(c.name.padEnd(20))} ${chalk9.gray(c.description)}`);
3411
+ console.log(` ${chalk11.cyan(c.name.padEnd(20))} ${chalk11.gray(c.description)}`);
3129
3412
  });
3130
3413
  console.log();
3131
3414
  };
@@ -3135,8 +3418,8 @@ program.command("list").description("\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uCEF4\uD3E
3135
3418
  if (!options.category || options.category === "agentic") {
3136
3419
  showCategory("agentic", components.agentic);
3137
3420
  }
3138
- console.log(chalk9.gray("\uC0AC\uC6A9\uBC95: npx axis-cli add <component-name>"));
3139
- console.log(chalk9.gray("Agentic: npx axis-cli add <component-name> --agentic\n"));
3421
+ console.log(chalk11.gray("\uC0AC\uC6A9\uBC95: npx @axis-ds/cli add <component-name>"));
3422
+ console.log(chalk11.gray("Agentic: npx @axis-ds/cli add <component-name> --agentic\n"));
3140
3423
  });
3141
3424
  var monetCmd = program.command("monet").description("Monet Design \uCEF4\uD3EC\uB10C\uD2B8 \uAD00\uB9AC (https://monet.design)");
3142
3425
  monetCmd.command("list").alias("ls").description("Monet \uCE74\uD14C\uACE0\uB9AC \uBAA9\uB85D").action(async () => {
@@ -3156,24 +3439,24 @@ monetCmd.command("import").alias("i").description("\uD074\uB9BD\uBCF4\uB4DC\uC5D
3156
3439
  await client.importFromClipboard();
3157
3440
  });
3158
3441
  monetCmd.command("setup").description("Monet MCP \uC11C\uBC84 \uC124\uC815 \uC548\uB0B4").action(() => {
3159
- console.log(chalk9.blue("\n\u{1F527} Monet MCP \uC11C\uBC84 \uC124\uC815\n"));
3160
- console.log(chalk9.bold("1. API \uD0A4 \uBC1C\uAE09:"));
3161
- console.log(chalk9.cyan(" https://monet.design/mcp\n"));
3162
- console.log(chalk9.bold("2. \uD658\uACBD \uBCC0\uC218 \uC124\uC815:"));
3163
- console.log(chalk9.gray(" .env \uD30C\uC77C\uC5D0 \uCD94\uAC00:"));
3164
- console.log(chalk9.cyan(" MONET_API_KEY=your-api-key-here\n"));
3165
- console.log(chalk9.bold("3. Claude Code MCP \uC124\uC815:"));
3166
- console.log(chalk9.gray(" .claude/mcp.json\uC5D0\uC11C monet \uC11C\uBC84 \uD65C\uC131\uD654:\n"));
3442
+ console.log(chalk11.blue("\n\u{1F527} Monet MCP \uC11C\uBC84 \uC124\uC815\n"));
3443
+ console.log(chalk11.bold("1. API \uD0A4 \uBC1C\uAE09:"));
3444
+ console.log(chalk11.cyan(" https://monet.design/mcp\n"));
3445
+ console.log(chalk11.bold("2. \uD658\uACBD \uBCC0\uC218 \uC124\uC815:"));
3446
+ console.log(chalk11.gray(" .env \uD30C\uC77C\uC5D0 \uCD94\uAC00:"));
3447
+ console.log(chalk11.cyan(" MONET_API_KEY=your-api-key-here\n"));
3448
+ console.log(chalk11.bold("3. Claude Code MCP \uC124\uC815:"));
3449
+ console.log(chalk11.gray(" .claude/mcp.json\uC5D0\uC11C monet \uC11C\uBC84 \uD65C\uC131\uD654:\n"));
3167
3450
  console.log(
3168
- chalk9.cyan(` "monet": {
3451
+ chalk11.cyan(` "monet": {
3169
3452
  "url": "https://www.monet.design/api/remote/mcp",
3170
3453
  "headers": { "Authorization": "Bearer \${MONET_API_KEY}" },
3171
3454
  "disabled": false
3172
3455
  }
3173
3456
  `)
3174
3457
  );
3175
- console.log(chalk9.bold("4. Claude Code \uC7AC\uC2DC\uC791 \uD6C4 \uC0AC\uC6A9:"));
3176
- console.log(chalk9.gray(' "monet\uC5D0\uC11C hero \uCEF4\uD3EC\uB10C\uD2B8 \uCC3E\uC544\uC918"\n'));
3458
+ console.log(chalk11.bold("4. Claude Code \uC7AC\uC2DC\uC791 \uD6C4 \uC0AC\uC6A9:"));
3459
+ console.log(chalk11.gray(' "monet\uC5D0\uC11C hero \uCEF4\uD3EC\uB10C\uD2B8 \uCC3E\uC544\uC918"\n'));
3177
3460
  });
3178
3461
  var v0Cmd = program.command("v0").description("V0 (v0.app) \uCF54\uB4DC \uBCC0\uD658 \uBC0F \uD1B5\uD569");
3179
3462
  v0Cmd.command("convert <file>").alias("c").description("V0 \uCF54\uB4DC\uB97C AXIS \uC2A4\uD0C0\uC77C\uB85C \uBCC0\uD658").option("-o, --output <path>", "\uCD9C\uB825 \uD30C\uC77C \uACBD\uB85C").action(async (file, options) => {
@@ -3210,18 +3493,18 @@ libraryCmd.command("collect").alias("c").description("\uC678\uBD80 \uC18C\uC2A4\
3210
3493
  total += result.collected;
3211
3494
  failed += result.failed;
3212
3495
  }
3213
- console.log(chalk9.blue(`
3496
+ console.log(chalk11.blue(`
3214
3497
  \u{1F4CA} \uC218\uC9D1 \uC644\uB8CC: ${total}\uAC1C \uCEF4\uD3EC\uB10C\uD2B8`));
3215
3498
  if (failed > 0) {
3216
- console.log(chalk9.yellow(` \uC2E4\uD328: ${failed}\uAC1C`));
3499
+ console.log(chalk11.yellow(` \uC2E4\uD328: ${failed}\uAC1C`));
3217
3500
  }
3218
3501
  });
3219
3502
  libraryCmd.command("list").alias("ls").description("\uB77C\uC774\uBE0C\uB7EC\uB9AC \uCEF4\uD3EC\uB10C\uD2B8 \uBAA9\uB85D").option("-c, --category <category>", "\uCE74\uD14C\uACE0\uB9AC \uD544\uD130").option("-s, --source <source>", "\uC18C\uC2A4 \uD544\uD130").action(async (options) => {
3220
3503
  const curator = new LibraryCurator();
3221
3504
  const index = await curator.loadIndex();
3222
3505
  if (!index) {
3223
- console.log(chalk9.yellow("\n\u26A0\uFE0F \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC778\uB371\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."));
3224
- console.log(chalk9.gray(" \uD574\uACB0: npx @axis-ds/cli library collect \uBA85\uB839\uC5B4\uB85C \uC218\uC9D1\uC744 \uBA3C\uC800 \uC2E4\uD589\uD558\uC138\uC694.\n"));
3506
+ console.log(chalk11.yellow("\n\u26A0\uFE0F \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC778\uB371\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."));
3507
+ console.log(chalk11.gray(" \uD574\uACB0: npx @axis-ds/cli library collect \uBA85\uB839\uC5B4\uB85C \uC218\uC9D1\uC744 \uBA3C\uC800 \uC2E4\uD589\uD558\uC138\uC694.\n"));
3225
3508
  return;
3226
3509
  }
3227
3510
  let components = index.components;
@@ -3231,7 +3514,7 @@ libraryCmd.command("list").alias("ls").description("\uB77C\uC774\uBE0C\uB7EC\uB9
3231
3514
  if (options.source) {
3232
3515
  components = components.filter((c) => c.source.type === options.source);
3233
3516
  }
3234
- console.log(chalk9.blue(`
3517
+ console.log(chalk11.blue(`
3235
3518
  \u{1F4E6} Library Components (${components.length}\uAC1C)
3236
3519
  `));
3237
3520
  const byCategory = /* @__PURE__ */ new Map();
@@ -3243,14 +3526,14 @@ libraryCmd.command("list").alias("ls").description("\uB77C\uC774\uBE0C\uB7EC\uB9
3243
3526
  byCategory.get(cat).push(comp);
3244
3527
  }
3245
3528
  for (const [category, items] of byCategory) {
3246
- console.log(chalk9.bold(`${category} (${items.length})`));
3529
+ console.log(chalk11.bold(`${category} (${items.length})`));
3247
3530
  for (const item of items.slice(0, 10)) {
3248
3531
  console.log(
3249
- ` ${chalk9.cyan(item.name.padEnd(25))} ${chalk9.gray(item.source.type.padEnd(8))} ${chalk9.gray(item.description.slice(0, 40))}`
3532
+ ` ${chalk11.cyan(item.name.padEnd(25))} ${chalk11.gray(item.source.type.padEnd(8))} ${chalk11.gray(item.description.slice(0, 40))}`
3250
3533
  );
3251
3534
  }
3252
3535
  if (items.length > 10) {
3253
- console.log(chalk9.gray(` ... \uC678 ${items.length - 10}\uAC1C`));
3536
+ console.log(chalk11.gray(` ... \uC678 ${items.length - 10}\uAC1C`));
3254
3537
  }
3255
3538
  console.log();
3256
3539
  }
@@ -3262,21 +3545,21 @@ libraryCmd.command("search <query>").alias("s").description("\uCEF4\uD3EC\uB10C\
3262
3545
  source: options.source
3263
3546
  });
3264
3547
  if (results.length === 0) {
3265
- console.log(chalk9.yellow(`
3548
+ console.log(chalk11.yellow(`
3266
3549
  '${query}'\uC5D0 \uB300\uD55C \uAC80\uC0C9 \uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.
3267
3550
  `));
3268
3551
  return;
3269
3552
  }
3270
- console.log(chalk9.blue(`
3553
+ console.log(chalk11.blue(`
3271
3554
  \u{1F50D} '${query}' \uAC80\uC0C9 \uACB0\uACFC (${results.length}\uAC1C)
3272
3555
  `));
3273
3556
  for (const comp of results.slice(0, 20)) {
3274
3557
  console.log(
3275
- ` ${chalk9.cyan(comp.name.padEnd(25))} ${chalk9.gray(comp.source.type.padEnd(8))} ${chalk9.gray(comp.category.padEnd(12))} ${chalk9.gray(comp.description.slice(0, 30))}`
3558
+ ` ${chalk11.cyan(comp.name.padEnd(25))} ${chalk11.gray(comp.source.type.padEnd(8))} ${chalk11.gray(comp.category.padEnd(12))} ${chalk11.gray(comp.description.slice(0, 30))}`
3276
3559
  );
3277
3560
  }
3278
3561
  if (results.length > 20) {
3279
- console.log(chalk9.gray(`
3562
+ console.log(chalk11.gray(`
3280
3563
  ... \uC678 ${results.length - 20}\uAC1C`));
3281
3564
  }
3282
3565
  console.log();
@@ -3290,12 +3573,12 @@ libraryCmd.command("publish").description("\uC0AC\uC774\uD2B8\uC5D0 \uB77C\uC774
3290
3573
  const publisher2 = new Publisher();
3291
3574
  const index = await curator.loadIndex();
3292
3575
  if (!index) {
3293
- console.log(chalk9.yellow("\n\u26A0\uFE0F \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC778\uB371\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."));
3294
- console.log(chalk9.gray(" \uD574\uACB0: npx @axis-ds/cli library collect \uBA85\uB839\uC5B4\uB85C \uC218\uC9D1\uC744 \uBA3C\uC800 \uC2E4\uD589\uD558\uC138\uC694.\n"));
3576
+ console.log(chalk11.yellow("\n\u26A0\uFE0F \uB77C\uC774\uBE0C\uB7EC\uB9AC \uC778\uB371\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."));
3577
+ console.log(chalk11.gray(" \uD574\uACB0: npx @axis-ds/cli library collect \uBA85\uB839\uC5B4\uB85C \uC218\uC9D1\uC744 \uBA3C\uC800 \uC2E4\uD589\uD558\uC138\uC694.\n"));
3295
3578
  return;
3296
3579
  }
3297
- console.log(chalk9.blue("\n\u{1F4E4} Library \uBC30\uCE58\n"));
3298
- console.log(chalk9.gray(`\uCD1D ${index.stats.total}\uAC1C \uCEF4\uD3EC\uB10C\uD2B8
3580
+ console.log(chalk11.blue("\n\u{1F4E4} Library \uBC30\uCE58\n"));
3581
+ console.log(chalk11.gray(`\uCD1D ${index.stats.total}\uAC1C \uCEF4\uD3EC\uB10C\uD2B8
3299
3582
  `));
3300
3583
  if (options.clean) {
3301
3584
  await publisher2.clean(options.output);
@@ -3306,17 +3589,17 @@ libraryCmd.command("publish").description("\uC0AC\uC774\uD2B8\uC5D0 \uB77C\uC774
3306
3589
  generateSearchIndex: true
3307
3590
  });
3308
3591
  if (result.success) {
3309
- console.log(chalk9.green(`
3592
+ console.log(chalk11.green(`
3310
3593
  \u2713 \uBC30\uCE58 \uC644\uB8CC`));
3311
- console.log(chalk9.gray(` - \uCD9C\uB825 \uB514\uB809\uD1A0\uB9AC: ${result.outputDir}`));
3312
- console.log(chalk9.gray(` - \uC0DD\uC131\uB41C \uD30C\uC77C: ${result.files.length}\uAC1C`));
3313
- console.log(chalk9.gray(` - \uCE74\uD14C\uACE0\uB9AC: ${result.stats.categoriesPublished}\uAC1C`));
3314
- console.log(chalk9.gray(` - \uAC80\uC0C9 \uC778\uB371\uC2A4: ${result.stats.searchIndexSize}\uAC1C \uD56D\uBAA9`));
3594
+ console.log(chalk11.gray(` - \uCD9C\uB825 \uB514\uB809\uD1A0\uB9AC: ${result.outputDir}`));
3595
+ console.log(chalk11.gray(` - \uC0DD\uC131\uB41C \uD30C\uC77C: ${result.files.length}\uAC1C`));
3596
+ console.log(chalk11.gray(` - \uCE74\uD14C\uACE0\uB9AC: ${result.stats.categoriesPublished}\uAC1C`));
3597
+ console.log(chalk11.gray(` - \uAC80\uC0C9 \uC778\uB371\uC2A4: ${result.stats.searchIndexSize}\uAC1C \uD56D\uBAA9`));
3315
3598
  } else {
3316
- console.log(chalk9.red(`
3599
+ console.log(chalk11.red(`
3317
3600
  \u2717 \uBC30\uCE58 \uC2E4\uD328`));
3318
3601
  for (const error of result.errors) {
3319
- console.log(chalk9.red(` - ${error}`));
3602
+ console.log(chalk11.red(` - ${error}`));
3320
3603
  }
3321
3604
  }
3322
3605
  console.log();
package/dist/monet.d.ts CHANGED
@@ -4,9 +4,9 @@
4
4
  * Monet (https://monet.design) 컴포넌트를 검색하고 AXIS 프로젝트에 가져옵니다.
5
5
  *
6
6
  * 사용법:
7
- * axis-cli monet list # 카테고리 목록
8
- * axis-cli monet search <query> # 컴포넌트 검색
9
- * axis-cli monet add <id> # 컴포넌트 추가
7
+ * npx @axis-ds/cli monet list # 카테고리 목록
8
+ * npx @axis-ds/cli monet search <query> # 컴포넌트 검색
9
+ * npx @axis-ds/cli monet add <id> # 컴포넌트 추가
10
10
  */
11
11
  declare const MONET_CATEGORIES: readonly [{
12
12
  readonly id: "hero";
package/dist/monet.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  MonetClient,
4
4
  getMonetMcpConfig,
5
5
  getMonetUrl
6
- } from "./chunk-WRDOGNSG.js";
6
+ } from "./chunk-ZVVACWEW.js";
7
7
  export {
8
8
  MONET_CATEGORIES,
9
9
  MonetClient,
@@ -9,7 +9,7 @@ import {
9
9
  parseContent,
10
10
  parseProjectTodo,
11
11
  registerSyncCommand
12
- } from "../chunk-D26GW2HO.js";
12
+ } from "../chunk-QORBOSUA.js";
13
13
  export {
14
14
  GitHubClient,
15
15
  STATUS_MAP,
package/dist/v0.d.ts CHANGED
@@ -4,9 +4,9 @@
4
4
  * V0 (https://v0.app) 생성 코드를 AXIS 프로젝트에 통합합니다.
5
5
  *
6
6
  * 사용법:
7
- * axis-cli v0 convert <file> # V0 코드를 AXIS 스타일로 변환
8
- * axis-cli v0 import <url> # V0 URL에서 가져오기
9
- * axis-cli v0 setup # GitHub 연동 안내
7
+ * npx @axis-ds/cli v0 convert <file> # V0 코드를 AXIS 스타일로 변환
8
+ * npx @axis-ds/cli v0 import <url> # V0 URL에서 가져오기
9
+ * npx @axis-ds/cli v0 setup # GitHub 연동 안내
10
10
  */
11
11
  declare class V0Client {
12
12
  convertCode(code: string, options?: {
package/dist/v0.js CHANGED
@@ -2,7 +2,7 @@ import {
2
2
  V0Client,
3
3
  getV0Url,
4
4
  isV0Code
5
- } from "./chunk-GCOWKKXG.js";
5
+ } from "./chunk-AHQT77FJ.js";
6
6
  export {
7
7
  V0Client,
8
8
  getV0Url,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@axis-ds/cli",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "type": "module",
5
5
  "description": "AXIS Design System - CLI for adding components (shadcn compatible)",
6
6
  "publishConfig": {