@seed-design/cli 1.4.0-alpha.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/index.mjs CHANGED
@@ -1,17 +1,30 @@
1
1
  #!/usr/bin/env node
2
- import*as re from"@clack/prompts";import{cosmiconfig as pt}from"cosmiconfig";import{z as te}from"zod";import*as W from"@clack/prompts";import{ZodError as tt}from"zod";import et from"picocolors";var p=e=>et.cyan(e);var P=class extends Error{hint;details;constructor({message:t,hint:r,details:n=[],cause:o}){super(t,{cause:o}),this.name="CliError",this.hint=r,this.details=n}},E=class extends Error{constructor(t="\uC791\uC5C5\uC774 \uCDE8\uC18C\uB410\uC5B4\uC694."){super(t),this.name="CliCancelError"}};function F(e){return e instanceof E}function z(e){return!e||typeof e!="object"||!("verbose"in e)?!1:e.verbose===!0}function rt(e,t){if(e instanceof P)return{reason:e.message,hint:e.hint??t,details:e.details,stack:st(e.cause??e)};if(e instanceof tt){let r=e.issues.map(n=>`${n.path.join(".")||"(root)"}: ${n.message}`);return{reason:"\uC785\uB825\uAC12 \uB610\uB294 \uC124\uC815 \uD30C\uC77C \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC544\uC694.",hint:t,details:r,stack:e.stack}}if(e instanceof Error){let r=e,n=[];return(r.escapedCommand||r.command)&&n.push(`\uC2E4\uD589 \uBA85\uB839\uC5B4: ${r.escapedCommand??r.command}`),typeof r.exitCode=="number"&&n.push(`\uC885\uB8CC \uCF54\uB4DC: ${r.exitCode}`),r.stderr?.trim()?n.push(`stderr: ${r.stderr.trim()}`):r.stdout?.trim()&&n.push(`stdout: ${r.stdout.trim()}`),{reason:r.shortMessage??e.message,hint:t,details:n,stack:e.stack}}return typeof e=="string"?{reason:e,hint:t,details:[]}:{reason:"\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC5B4\uC694.",hint:t,details:[]}}function st(e){if(e instanceof Error)return e.stack}function V(e,{defaultMessage:t,defaultHint:r,verbose:n=!1}){let o=rt(e,r);W.log.error(t),W.log.error(`\uC6D0\uC778: ${o.reason}`);for(let s of o.details)W.log.info(s);o.hint&&W.log.info(`\uD574\uACB0 \uD78C\uD2B8: ${o.hint}`),n&&o.stack&&(W.log.message(p(`
3
- [verbose] stack trace`)),W.log.message(o.stack)),W.outro(p("\uC791\uC5C5\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694."))}import*as q from"@clack/prompts";import ct from"fs-extra";import Se from"path";import it from"findup-sync";import ot from"fs-extra";var nt="package.json";function at(e=process.cwd()){let t=it(nt,{cwd:e});if(!t)throw new Error("No package.json file found in the project.");return t}function Q(e=process.cwd()){let t=at(e);return ot.readJSONSync(t)}var K={rsc:!1,tsx:!0,framework:"react",path:"./seed-design",telemetry:!0};function $e(e){try{let t=Q(e),r={...t.dependencies,...t.devDependencies,...t.peerDependencies};if("@lynx-js/react"in r||"@seed-design/lynx-react"in r)return"lynx"}catch{}return"react"}async function Re(e){let t=$e(e);return await q.group({tsx:()=>q.confirm({message:`${p("TypeScript")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:K.tsx}),rsc:()=>q.confirm({message:`${p("React Server Components")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:K.rsc}),framework:()=>q.select({message:`\uC5B4\uB5A4 ${p("\uD504\uB808\uC784\uC6CC\uD06C")}\uB97C \uC0AC\uC6A9\uD558\uC2DC\uB098\uC694?`,initialValue:t,options:[{value:"react",label:"React"},{value:"lynx",label:"Lynx"}]}),path:()=>q.text({message:`${p("seed-design \uD3F4\uB354")} \uACBD\uB85C\uB97C \uC785\uB825\uD574\uC8FC\uC138\uC694. (\uAE30\uBCF8\uAC12\uC740 \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8\uC5D0 \uC0DD\uC131\uB429\uB2C8\uB2E4.)`,initialValue:K.path,defaultValue:K.path,placeholder:K.path}),telemetry:()=>q.confirm({message:`\uAC1C\uC120\uC744 \uC704\uD574 ${p("\uC775\uBA85 \uC0AC\uC6A9 \uB370\uC774\uD130")}\uB97C \uC218\uC9D1\uD560\uAE4C\uC694?`,initialValue:K.telemetry})},{onCancel:()=>{throw new E}})}async function ge({cwd:e,config:t}){let r=Se.resolve(e,"seed-design.json");return await ct.writeFile(r,`${JSON.stringify(t,null,2)}
4
- `,"utf-8"),{relativePath:Se.relative(process.cwd(),r),targetPath:r}}var Ee="seed-design",lt=pt(Ee,{searchPlaces:[`${Ee}.json`]}),ve=te.object({$schema:te.string().optional(),rsc:te.coerce.boolean().default(!1),tsx:te.coerce.boolean().default(!0),framework:te.enum(["react","lynx"]).default("react"),path:te.string(),telemetry:te.coerce.boolean().optional().default(!0)}).strict();async function ue(e){let t=await oe(e);if(t)return t;re.log.error("\uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8 \uACBD\uB85C\uC5D0 `seed-design.json` \uD30C\uC77C\uC774 \uC5C6\uC5B4\uC694.");let r=await re.confirm({message:"seed-design.json \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uC2DC\uACA0\uC5B4\uC694?"});if(re.isCancel(r)||!r)throw new E;try{return await ge({cwd:e,config:K}),re.log.message("seed-design.json \uD30C\uC77C\uC774 \uC0DD\uC131\uB410\uC5B4\uC694."),ve.parse(K)}catch(n){throw new P({message:"seed-design.json \uD30C\uC77C \uC0DD\uC131\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",hint:"\uB514\uB809\uD1A0\uB9AC \uC4F0\uAE30 \uAD8C\uD55C\uACFC \uACBD\uB85C\uB97C \uD655\uC778\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uBCF4\uC138\uC694.",cause:n})}}async function oe(e){let t=await lt.search(e);if(!t||t.isEmpty)return null;try{return ve.parse(t.config)}catch(r){throw new P({message:"seed-design.json \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC544\uC694.",hint:"https://seed-design.com/react/getting-started/cli/configuration \uBB38\uC11C\uB97C \uCC38\uACE0\uD574 \uC8FC\uC138\uC694.",cause:r})}}function ye({selectedItemKeys:e,publicRegistries:t}){let r=[],n=new Set;function o(s,i){let c=r.find(a=>a.registryId===s);if(!c?.items.some(a=>a.id===i.id)){if(c?c.items.push(i):r.push({registryId:s,items:[i]}),i.dependencies?.length)for(let a of i.dependencies)n.add(a);if(i.innerDependencies?.length)for(let a of i.innerDependencies)for(let w of a.itemIds){let C=t.find($=>$.id===a.registryId)?.items.find($=>$.id===w);if(!C)throw new Error(`Cannot find dependency item: ${a.registryId}:${w}`);o(a.registryId,C)}}}for(let s of e){let[i,...c]=s.split(":"),a=c.join(":");if(!i||!a)throw new Error(`Invalid snippet format: "${s}"`);let w=t.find(C=>C.id===i)?.items.find(C=>C.id===a);if(!w)throw new Error(`Cannot find snippet: "${s}"`);o(i,w)}return{registryItemsToAdd:r,npmDependenciesToAdd:n}}import*as Pe from"@clack/prompts";import{z as l}from"zod";var xe=l.object({id:l.string(),description:l.string().optional(),deprecated:l.boolean().optional(),hideFromCLICatalog:l.boolean().optional(),dependencies:l.array(l.string()).optional(),innerDependencies:l.array(l.object({registryId:l.string(),itemIds:l.array(l.string())})).optional(),snippets:l.array(l.object({path:l.string(),dependencies:l.record(l.string(),l.string()).optional(),content:l.string()}))}),Ie=l.object({id:l.string(),hideFromCLICatalog:l.boolean().optional(),items:l.array(xe.omit({snippets:!0}).extend({snippets:l.array(l.object({path:l.string(),dependencies:l.record(l.string(),l.string()).optional()}))}))}),Ae=l.array(l.object({id:l.string()})),mt=l.object({label:l.string(),path:l.string()}),dt=l.object({id:l.string(),title:l.string(),description:l.string().optional(),docUrl:l.string(),deprecated:l.boolean().optional(),snippetKey:l.string().optional(),snippets:l.array(mt).optional()}),ft=l.object({id:l.string(),label:l.string(),items:l.array(dt)}),gt=l.object({id:l.string(),label:l.string(),sections:l.array(ft)}),je=l.object({categories:l.array(gt)});async function Te({baseUrl:e}){let t=await fetch(`${e}/__docs__/index.json`);if(!t.ok)throw new P({message:`\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694: ${t.status} ${t.statusText}`});let r=await t.json(),{success:n,data:o,error:s}=je.safeParse(r);if(!n)throw new P({message:`\uBB38\uC11C \uBAA9\uB85D \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694: ${s?.message}`});return o}async function ne({baseUrl:e,framework:t}){let r=await fetch(`${e}/__registry__/${t}/index.json`);if(!r.ok)throw new Error(`Failed to fetch registries: ${r.status} ${r.statusText}`);let n=await r.json(),{success:o,data:s,error:i}=Ae.safeParse(n);if(!o)throw new Error(`Failed to parse registries: ${i?.message}`);return s}async function ae({baseUrl:e,framework:t,registryId:r}){let n=await fetch(`${e}/__registry__/${t}/${r}/index.json`);if(!n.ok)throw new Error(`Failed to fetch ${r} registry: ${n.status} ${n.statusText}`);let o=await n.json(),{success:s,data:i,error:c}=Ie.safeParse(o);if(!s)throw new Error(`Failed to parse ${r} registry: ${c?.message}`);return i}async function ut({baseUrl:e,framework:t,registryId:r,registryItemId:n}){let o=await fetch(`${e}/__registry__/${t}/${r}/${n}.json`);if(!o.ok)throw new Error(`Failed to fetch ${n}: ${o.status} ${o.statusText}`);let s=await o.json(),{success:i,data:c,error:a}=xe.safeParse(s);if(!i)throw new Error(`Failed to parse ${n}: ${a?.message}`);return c}async function _e({baseUrl:e,framework:t,registryId:r,registryItemIds:n}){return await Promise.all(n.map(async o=>{try{return await ut({baseUrl:e,framework:t,registryId:r,registryItemId:o})}catch(s){let i=await fetch(`${e}/__registry__/${t}/${r}/index.json`);if(!i.ok)throw new Error(`${r} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694: ${i.status} ${i.statusText}`);let c=await i.json(),{success:a,data:w}=Ie.safeParse(c);throw a?(Pe.log.error(`${o} \uC2A4\uB2C8\uD3AB\uC774 ${r} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC5C6\uC5B4\uC694.`),Pe.log.info(`${r} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC874\uC7AC\uD558\uB294 \uC2A4\uB2C8\uD3AB:
5
- ${w.items.map(C=>C.id).join(`
6
- `)}`),s):new Error(`Failed to parse registry index for ${r}`)}}))}import{promises as $t}from"fs";import{tmpdir as xt}from"os";import Me from"path";import{transformFromAstSync as yt}from"@babel/core";import ht from"@babel/plugin-transform-typescript";import*as he from"recast";import{parse as wt}from"@babel/parser";var bt={sourceType:"module",allowImportExportEverywhere:!0,allowReturnOutsideFunction:!0,startLine:1,tokens:!0,plugins:["asyncGenerators","bigInt","classPrivateMethods","classPrivateProperties","classProperties","classStaticBlock","decimal","decorators-legacy","doExpressions","dynamicImport","exportDefaultFrom","exportNamespaceFrom","functionBind","functionSent","importAssertions","importMeta","nullishCoalescingOperator","numericSeparator","objectRestSpread","optionalCatchBinding","optionalChaining",["pipelineOperator",{proposal:"minimal"}],["recordAndTuple",{syntaxType:"hash"}],"throwExpressions","topLevelAwait","v8intrinsic","typescript","jsx"]},De=async({sourceFile:e,config:t})=>{let r=e.getFullText();if(t.tsx)return r;let n=he.parse(r,{parser:{parse:s=>wt(s,bt)}}),o=yt(n,r,{cloneInputAst:!1,code:!1,ast:!0,plugins:[ht],configFile:!1});if(!o||!o.ast)throw new Error("Failed to transform JSX");return he.print(o.ast).code};import{SyntaxKind as Ct}from"ts-morph";var Oe=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let r=e.getFirstChildByKind(Ct.ExpressionStatement);if(!r)return e;let n=r.getExpression();if(!n)return e;let o=n.getText().trim();if(o!=='"use client"'&&o!=="'use client'")return e;let s=r.getText(),i=r.getFullText();if(s.trim()===i.trim())return e;let a=i.replace(s,"").replace(/^\s*\n/,"").replace(/\n\s*$/,"");return r.replaceWithText(a),e};import{Project as It,ScriptKind as Pt}from"ts-morph";var kt=[Oe],St=new It({compilerOptions:{}});async function Rt(e){let t=await $t.mkdtemp(Me.join(xt(),"seed-design-"));return Me.join(t,e)}async function Ke(e){let t=await Rt(e.filename),r=St.createSourceFile(t,e.raw,{scriptKind:Pt.TSX});for(let n of kt)n({sourceFile:r,...e});return await De({sourceFile:r,...e})}import*as L from"@clack/prompts";import ce from"fs-extra";import B from"path";import{createPatch as Et}from"diff";import vt from"@npmcli/disparity-colors";async function we({registryItemsToAdd:e,rootPath:t,cwd:r,baseUrl:n,framework:o,config:s,onDiff:i}){let c=[];for(let{registryId:a,items:w}of e){let C=B.join(t,a);ce.ensureDirSync(C);let $=await _e({baseUrl:n,framework:o,registryId:a,registryItemIds:w.map(u=>u.id)});for(let{id:u,snippets:A}of $){let g=await Promise.all(A.map(async f=>{let h=await Ke({filename:f.path,config:s,raw:f.content}),d=B.join(C,f.path);return s.tsx||(d=d.replace(/\.tsx$/,".jsx"),d=d.replace(/\.ts$/,".js")),{filePath:d,content:h,relativePath:B.relative(r,d),name:`${a}:${u}`}})),x=[];for(let f of g){let{filePath:h,content:d,relativePath:b}=f;if(await ce.ensureDir(B.dirname(h)),ce.existsSync(h)){let I=await ce.readFile(h,"utf-8");if(I===d){L.log.info(`${p(b)}: \uC774\uBBF8 \uCD5C\uC2E0 \uC0C1\uD0DC\uC608\uC694.`);continue}let U=B.basename(h),H=B.extname(h),ie=B.basename(h,H),de=Date.now(),k=`legacy-${ie}-${de}${H}`,m=await(async()=>{if(i)return i;let y=Et(b,I,d),j=vt(y);return L.log.message(`
7
- ${p(b)}: \uD604\uC7AC \uD30C\uC77C\uACFC \uBC1B\uC73C\uB824\uB294 \uD30C\uC77C\uC758 \uB0B4\uC6A9\uC774 \uB2EC\uB77C\uC694.
8
- `),L.log.message(j),L.select({message:"\uD604\uC7AC \uD30C\uC77C\uC5D0 \uC2A4\uD0C0\uC77C \uBCC0\uACBD, \uB85C\uAE45 \uB4F1 \uCEE4\uC2A4\uD130\uB9C8\uC774\uC9D5\uC774 \uC801\uC6A9\uB418\uC5B4 \uC788\uB294 \uACBD\uC6B0 \uC2E0\uADDC \uD30C\uC77C\uC5D0 \uB3D9\uC77C\uD55C \uCEE4\uC2A4\uD130\uB9C8\uC774\uC9D5\uC744 \uC801\uC6A9\uD558\uB294 \uAC83\uC744 \uAC80\uD1A0\uD574\uBCF4\uC138\uC694.",options:[{value:"overwrite",label:`${U} \uB36E\uC5B4\uC4F0\uAE30`},{value:"backup",label:`\uAE30\uC874 \uD30C\uC77C \uB0B4\uC6A9\uC744 ${k}\uC73C\uB85C \uC62E\uAE30\uACE0 ${U} \uBC1B\uAE30`},{value:"skip",label:"\uC0C8 \uD30C\uC77C \uBC1B\uC9C0 \uC54A\uACE0 \uADF8\uB300\uB85C \uB450\uAE30"}]})})();if(L.isCancel(m)||m==="skip"){L.log.info(`${p(b)}: \uD30C\uC77C\uC744 \uBC1B\uC9C0 \uC54A\uACE0 \uAC74\uB108\uB6F0\uC5C8\uC5B4\uC694.`);continue}if(m==="backup"){let y=B.dirname(h),j=B.join(y,k);await ce.rename(h,j),L.log.info(`${p(b)}: \uAE30\uC874 \uD30C\uC77C\uC744 ${p(B.relative(r,j))}\uB85C \uC62E\uACBC\uC5B4\uC694.`)}}await ce.writeFile(h,d),x.push(f)}if(x.length>0){let f=x.map(({name:h,relativePath:d})=>({name:h,path:d}));c.push(...f),L.log.success(`${p(`${a}:${u}`)} \uAD00\uB828 \uC2A4\uB2C8\uD3AB \uB2E4\uC6B4\uB85C\uB4DC \uC644\uB8CC: ${p(f.map(h=>h.path).join(", "))}`)}}}}import*as S from"@clack/prompts";import Yt from"path";import{z as ee}from"zod";var G="https://seed-design.io";import*as Ne from"@clack/prompts";import{execa as jt}from"execa";import{detect as At}from"@antfu/ni";async function Le(e){let t=await At({programmatic:!0,cwd:e});return t==="yarn@berry"?"yarn":t==="pnpm@6"?"pnpm":t==="bun"?"bun":t==="deno"?"deno":t??"npm"}async function be({cwd:e,deps:t,dev:r=!1}){let{start:n,stop:o}=Ne.spinner(),s=await Le(e),c={...Q(e).dependencies},a=new Set(t.filter(g=>!c[g])),w=new Set(t.filter(g=>c[g]));if(!a.size)return{installed:new Set,filtered:a};n("\uC758\uC874\uC131 \uC124\uCE58\uC911...");let u=[s==="npm"?"install":"add",r?"-D":null,...a].filter(Boolean),A=`${s} ${u.join(" ")}`;try{await jt(s,u,{cwd:e})}catch(g){throw o("\uC758\uC874\uC131 \uC124\uCE58\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694."),new P({message:"\uC758\uC874\uC131 \uC124\uCE58\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",hint:"\uB124\uD2B8\uC6CC\uD06C \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uACE0, \uC124\uCE58 \uBA85\uB839\uC5B4\uB97C \uC9C1\uC811 \uC2E4\uD589\uD574 \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",details:[`\uC2E4\uD589 \uBA85\uB839\uC5B4: ${A}`],cause:g})}return o("\uC758\uC874\uC131 \uC124\uCE58\uAC00 \uC644\uB8CC\uB410\uC5B4\uC694."),{installed:a,filtered:w}}import{randomUUID as Tt}from"node:crypto";import*as Fe from"@clack/prompts";var _t="seed_cli";async function Dt(e){if(process.env.DISABLE_TELEMETRY==="true"||process.env.SEED_DISABLE_TELEMETRY==="true")return!1;try{if((await oe(e))?.telemetry===!1)return!1}catch{}return!0}function Ot(){return Tt()}var Mt=Ot(),Ue=!1;async function Kt(e,{event:t,properties:r={}}){if(!await Dt(e))return;let o=`${_t}.${t}`;Ue||(Fe.log.info("\u{1F4CA} \uC0AC\uC6A9 \uB370\uC774\uD130 \uC218\uC9D1 \uC911 (\uBE44\uD65C\uC131\uD654: seed-design.json \uB610\uB294 DISABLE_TELEMETRY \uD658\uACBD \uBCC0\uC218)"),Ue=!0);try{let s="https://us.i.posthog.com/capture",i={"Content-Type":"application/json"},c={api_key:"phc_seod8HhifElOP1R92KmvsQybrtUmkOTgZBsq0mfCelR",event:o,distinct_id:Mt,properties:{...r,$process_person_profile:!1},timestamp:new Date().toISOString()},a=new AbortController,w=setTimeout(()=>a.abort(),5e3);try{await fetch(s,{method:"POST",headers:i,body:JSON.stringify(c),signal:a.signal})}finally{clearTimeout(w)}}catch{}}var N={track:Kt};import*as se from"@clack/prompts";import Lt from"fs-extra";import Nt from"path";import{intersects as Ut,satisfies as Ft,valid as Ve,validRange as qe}from"semver";var zt=["@seed-design/react","@seed-design/css"],Vt=["@seed-design/lynx-react","@seed-design/lynx-css"];function Z(e){return e==="lynx"?Vt:zt}var ze="workspace:",qt="npm:";function pe(e,t="react"){try{let r=Q(e),n={...r.dependencies,...r.devDependencies,...r.peerDependencies,...r.optionalDependencies},o={},s=Z(t);for(let i of s){let c=n[i];typeof c=="string"&&(o[i]=c)}return o}catch{return{}}}function le({publicRegistries:e,itemKeys:t,projectPackageVersions:r,framework:n="react"}){let o=Array.from(new Set(t)),s=new Map(e.flatMap(a=>a.items.map(w=>[`${a.id}:${w.id}`,w]))),i=[],c=Z(n);for(let a of o){let w=s.get(a);if(!w)continue;let C=Bt(w,n);for(let $ of c){let u=Array.from(C[$]??[]);if(!u.length)continue;let A=r[$];if(!A){i.push({itemKey:a,packageName:$,requiredRanges:u,type:"missing-package"});continue}let g=Gt(A);if(!g){i.push({itemKey:a,packageName:$,requiredRanges:u,installedVersionSpec:A,type:"invalid-version-spec"});continue}u.every(f=>Ht({currentVersionSpec:g,requiredRange:f}))||i.push({itemKey:a,packageName:$,requiredRanges:u,installedVersionSpec:A,type:"incompatible-version"})}}return{checkedItemKeys:o,projectPackageVersions:r,issues:i}}function me({report:e,title:t,framework:r="react"}){if(!e.issues.length)return;let n=Z(r);se.log.warn(t),se.log.info(`\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804: ${n.map(s=>`${s}@${p(e.projectPackageVersions[s]??"\uBBF8\uC124\uCE58")}`).join(", ")}`);let o=new Map;for(let s of e.issues){let i=o.get(s.itemKey)??[];i.push(s),o.set(s.itemKey,i)}for(let[s,i]of o.entries()){se.log.warn(p(s));for(let c of i){let a=c.requiredRanges.join(" | ");if(c.type==="missing-package"){se.log.info(` - ${c.packageName}: \uD328\uD0A4\uC9C0\uAC00 \uC124\uCE58\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC544\uC694. \uD544\uC694 \uBC94\uC704: ${a}`);continue}if(c.type==="invalid-version-spec"){se.log.info(` - ${c.packageName}: \uD604\uC7AC \uBC84\uC804 \uD615\uC2DD\uC744 \uD574\uC11D\uD558\uC9C0 \uBABB\uD588\uC5B4\uC694 (${c.installedVersionSpec}). \uD544\uC694 \uBC94\uC704: ${a}`);continue}se.log.info(` - ${c.packageName}: \uD604\uC7AC ${c.installedVersionSpec}, \uD544\uC694 \uBC94\uC704 ${a}`)}}}function Be({publicRegistries:e,rootPath:t}){let r=[];for(let n of e)for(let o of n.items)o.snippets.some(i=>Jt(i.path).some(c=>Lt.existsSync(Nt.join(t,n.id,c))))&&r.push(`${n.id}:${o.id}`);return r}function Bt(e,t="react"){let r=Z(t),n=Object.fromEntries(r.map(o=>[o,new Set]));for(let o of e.snippets)for(let[s,i]of Object.entries(o.dependencies??{}))Wt(s,t)&&n[s].add(i);return n}function Gt(e){let t=e.trim();if(t.startsWith(ze)&&(t=t.slice(ze.length).trim()),t.startsWith(qt)){let r=t.split("@").at(-1);if(!r)return null;t=r}return!t||t==="*"?null:Ve(t)||qe(t)?t:null}function Ht({currentVersionSpec:e,requiredRange:t}){let r=qe(t);return r?Ve(e)?Ft(e,r,{includePrerelease:!0}):Ut(e,r,{includePrerelease:!0}):!1}function Jt(e){let t=new Set([e]);return e.endsWith(".tsx")&&t.add(`${e.slice(0,-4)}.jsx`),e.endsWith(".ts")&&t.add(`${e.slice(0,-3)}.js`),e.endsWith(".jsx")&&t.add(`${e.slice(0,-4)}.tsx`),e.endsWith(".js")&&t.add(`${e.slice(0,-3)}.ts`),Array.from(t)}function Wt(e,t="react"){return Z(t).includes(e)}var Xt=ee.object({itemIds:ee.array(ee.string()).optional(),all:ee.boolean(),cwd:ee.string(),baseUrl:ee.string().optional(),framework:ee.enum(["react","lynx"]).optional(),onDiff:ee.enum(["overwrite","backup"]).optional()}),Ge=e=>{e.command("add [...item-ids]","add items").option("-a, --all","[Deprecated] Add all items",{default:!1}).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",{default:process.cwd()}).option("-u, --baseUrl <baseUrl>","the base url of the registry. defaults to the current directory.",{default:G}).option("-f, --framework <framework>","\uD504\uB808\uC784\uC6CC\uD06C (react \uB610\uB294 lynx)").option("--on-diff <mode>","Action when file differs: overwrite or backup").example("seed-design add ui:action-button").example("seed-design add ui:alert-dialog").action(async(t,r)=>{let n=Date.now(),o=z(r);S.intro("seed-design add");try{let s=Xt.safeParse({itemIds:t,...r});if(!s.success)throw s.error;let{data:{all:i,...c}}=s;if(i)throw new P({message:"`--all` \uC635\uC158\uC740 \uB354 \uC774\uC0C1 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC544\uC694. \uB300\uC2E0 `seed-design add-all` \uBA85\uB839\uC5B4\uB97C \uC0AC\uC6A9\uD574\uC8FC\uC138\uC694."});let a=c.cwd,w=c.baseUrl,C=await ue(a),$=c.framework??C.framework,u=Yt.resolve(a,C.path),{start:A,stop:g}=S.spinner();A("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let x=await(async()=>{try{let m=await Promise.all((await ne({baseUrl:w,framework:$})).map(async({id:y})=>ae({baseUrl:w,framework:$,registryId:y})));return g("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),m}catch(m){throw g("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),m}})(),f=await(async()=>{if(c.itemIds?.length)return c.itemIds;let m=await S.multiselect({message:"\uCD94\uAC00\uD560 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694 (\uC2A4\uD398\uC774\uC2A4 \uBC14\uB85C \uC5EC\uB7EC \uAC1C \uC120\uD0DD \uAC00\uB2A5)",options:x.filter(({hideFromCLICatalog:y})=>!y).flatMap(({id:y,items:j})=>j.filter(({hideFromCLICatalog:M})=>!M).sort((M,_)=>M.id.localeCompare(_.id)).map(({id:M,description:_,deprecated:J})=>({label:`${J?"(deprecated) ":""}${p(y)}:${M}`,value:`${y}:${M}`,hint:_,deprecated:J,registryItemCount:j.length}))).sort((y,j)=>y.deprecated!==j.deprecated?y.deprecated?1:-1:j.registryItemCount-y.registryItemCount)});if(S.isCancel(m))throw new E;return m})();if(!f?.length)throw new E("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC120\uD0DD\uB418\uC9C0 \uC54A\uC558\uC5B4\uC694.");S.log.message(`\uC120\uD0DD\uB41C \uD56D\uBAA9: ${p(f.join(", "))}`);let h=[];for(let m of f){let[y,...j]=m.split(":"),M=j.join(":");if(!y||!M)throw new P({message:`${p(m)}: \uD56D\uBAA9 \uC774\uB984\uC774 \uC798\uBABB\uB418\uC5C8\uC5B4\uC694.`,hint:`${p("ui:action-button")}\uACFC \uAC19\uC740 \uD615\uC2DD\uC73C\uB85C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});let _=x.find(J=>J.id===y)?.items.find(J=>J.id===M);if(!_)throw new P({message:`${p(m)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});if(_.deprecated){let J=await S.confirm({message:`${p(_.id)}: deprecated \uB418\uC5C8\uC5B4\uC694. \uCD94\uAC00\uD560\uAE4C\uC694?`,initialValue:!1});if(S.isCancel(J))throw new E;if(J===!1){S.log.info(`${p(_.id)}: \uCD94\uAC00\uD558\uC9C0 \uC54A\uC744\uAC8C\uC694.`);continue}}h.push(m)}let{registryItemsToAdd:d,npmDependenciesToAdd:b}=ye({selectedItemKeys:h,publicRegistries:x}),I=le({publicRegistries:x,itemKeys:d.flatMap(({registryId:m,items:y})=>y.map(j=>`${m}:${j.id}`)),projectPackageVersions:pe(c.cwd,$),framework:$});me({report:I,title:"\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804\uACFC \uD638\uD658\uB418\uC9C0 \uC54A\uC744 \uC218 \uC788\uB294 \uC2A4\uB2C8\uD3AB\uC774 \uC788\uC5B4\uC694.",framework:$}),S.log.info(`\uCD94\uAC00\uD560 \uD56D\uBAA9: ${p(d.map(m=>m.items.map(y=>`${m.registryId}:${y.id}`).join(", ")).join(", ")||"\uC5C6\uC74C")}
2
+ import*as me from"@clack/prompts";import{cosmiconfig as It}from"cosmiconfig";import{z as le}from"zod";import*as te from"@clack/prompts";import{ZodError as ut}from"zod";import gt from"picocolors";var m=e=>gt.cyan(e);var $=class extends Error{hint;details;constructor({message:t,hint:r,details:n=[],cause:o}){super(t,{cause:o}),this.name="CliError",this.hint=r,this.details=n}},D=class extends Error{constructor(t="\uC791\uC5C5\uC774 \uCDE8\uC18C\uB410\uC5B4\uC694."){super(t),this.name="CliCancelError"}};function G(e){return e instanceof D}function Y(e){return!e||typeof e!="object"||!("verbose"in e)?!1:e.verbose===!0}function yt(e,t){if(e instanceof $)return{reason:e.message,hint:e.hint??t,details:e.details,stack:ht(e.cause??e)};if(e instanceof ut){let r=e.issues.map(n=>`${n.path.join(".")||"(root)"}: ${n.message}`);return{reason:"\uC785\uB825\uAC12 \uB610\uB294 \uC124\uC815 \uD30C\uC77C \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC544\uC694.",hint:t,details:r,stack:e.stack}}if(e instanceof Error){let r=e,n=[];return(r.escapedCommand||r.command)&&n.push(`\uC2E4\uD589 \uBA85\uB839\uC5B4: ${r.escapedCommand??r.command}`),typeof r.exitCode=="number"&&n.push(`\uC885\uB8CC \uCF54\uB4DC: ${r.exitCode}`),r.stderr?.trim()?n.push(`stderr: ${r.stderr.trim()}`):r.stdout?.trim()&&n.push(`stdout: ${r.stdout.trim()}`),{reason:r.shortMessage??e.message,hint:t,details:n,stack:e.stack}}return typeof e=="string"?{reason:e,hint:t,details:[]}:{reason:"\uC54C \uC218 \uC5C6\uB294 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC5B4\uC694.",hint:t,details:[]}}function ht(e){if(e instanceof Error)return e.stack}function Q(e,{defaultMessage:t,defaultHint:r,verbose:n=!1}){let o=yt(e,r);te.log.error(t),te.log.error(`\uC6D0\uC778: ${o.reason}`);for(let i of o.details)te.log.info(i);o.hint&&te.log.info(`\uD574\uACB0 \uD78C\uD2B8: ${o.hint}`),n&&o.stack&&(te.log.message(m(`
3
+ [verbose] stack trace`)),te.log.message(o.stack)),te.outro(m("\uC791\uC5C5\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694."))}import*as X from"@clack/prompts";import xt from"fs-extra";import Ae from"path";import wt from"findup-sync";import bt from"fs-extra";var Ct="package.json";function $t(e=process.cwd()){let t=wt(Ct,{cwd:e});if(!t)throw new Error("No package.json file found in the project.");return t}function ie(e=process.cwd()){let t=$t(e);return bt.readJSONSync(t)}var H={rsc:!1,tsx:!0,framework:"react",path:"./seed-design",telemetry:!0};function Re(e){try{let t=ie(e),r={...t.dependencies,...t.devDependencies,...t.peerDependencies};if("@lynx-js/react"in r||"@seed-design/lynx-react"in r)return"lynx"}catch{}return"react"}async function De(e){let t=Re(e);return await X.group({tsx:()=>X.confirm({message:`${m("TypeScript")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:H.tsx}),rsc:()=>X.confirm({message:`${m("React Server Components")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:H.rsc}),framework:()=>X.select({message:`\uC5B4\uB5A4 ${m("\uD504\uB808\uC784\uC6CC\uD06C")}\uB97C \uC0AC\uC6A9\uD558\uC2DC\uB098\uC694?`,initialValue:t,options:[{value:"react",label:"React"},{value:"lynx",label:"Lynx"}]}),path:()=>X.text({message:`${m("seed-design \uD3F4\uB354")} \uACBD\uB85C\uB97C \uC785\uB825\uD574\uC8FC\uC138\uC694. (\uAE30\uBCF8\uAC12\uC740 \uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8\uC5D0 \uC0DD\uC131\uB429\uB2C8\uB2E4.)`,initialValue:H.path,defaultValue:H.path,placeholder:H.path}),telemetry:()=>X.confirm({message:`\uAC1C\uC120\uC744 \uC704\uD574 ${m("\uC775\uBA85 \uC0AC\uC6A9 \uB370\uC774\uD130")}\uB97C \uC218\uC9D1\uD560\uAE4C\uC694?`,initialValue:H.telemetry})},{onCancel:()=>{throw new D}})}async function Ce({cwd:e,config:t}){let r=Ae.resolve(e,"seed-design.json");return await xt.writeFile(r,`${JSON.stringify(t,null,2)}
4
+ `,"utf-8"),{relativePath:Ae.relative(process.cwd(),r),targetPath:r}}var Oe="seed-design",kt=It(Oe,{searchPlaces:[`${Oe}.json`]}),Le=le.object({$schema:le.string().optional(),rsc:le.coerce.boolean().default(!1),tsx:le.coerce.boolean().default(!0),framework:le.enum(["react","lynx"]).default("react"),path:le.string(),telemetry:le.coerce.boolean().optional().default(!0)}).strict();async function $e(e){let t=await ne(e);if(t)return t;me.log.error("\uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8 \uACBD\uB85C\uC5D0 `seed-design.json` \uD30C\uC77C\uC774 \uC5C6\uC5B4\uC694.");let r=await me.confirm({message:"seed-design.json \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uC2DC\uACA0\uC5B4\uC694?"});if(me.isCancel(r)||!r)throw new D;try{return await Ce({cwd:e,config:H}),me.log.message("seed-design.json \uD30C\uC77C\uC774 \uC0DD\uC131\uB410\uC5B4\uC694."),Le.parse(H)}catch(n){throw new $({message:"seed-design.json \uD30C\uC77C \uC0DD\uC131\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",hint:"\uB514\uB809\uD1A0\uB9AC \uC4F0\uAE30 \uAD8C\uD55C\uACFC \uACBD\uB85C\uB97C \uD655\uC778\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uBCF4\uC138\uC694.",cause:n})}}async function ne(e){let t=await kt.search(e);if(!t||t.isEmpty)return null;try{return Le.parse(t.config)}catch(r){throw new $({message:"seed-design.json \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC544\uC694.",hint:"https://seed-design.com/react/getting-started/cli/configuration \uBB38\uC11C\uB97C \uCC38\uACE0\uD574 \uC8FC\uC138\uC694.",cause:r})}}function xe({selectedItemKeys:e,publicRegistries:t}){let r=[],n=new Set;function o(i,s){let a=r.find(c=>c.registryId===i);if(!a?.items.some(c=>c.id===s.id)){if(a?a.items.push(s):r.push({registryId:i,items:[s]}),s.dependencies?.length)for(let c of s.dependencies)n.add(c);if(s.innerDependencies?.length)for(let c of s.innerDependencies)for(let p of c.itemIds){let y=t.find(w=>w.id===c.registryId)?.items.find(w=>w.id===p);if(!y)throw new Error(`Cannot find dependency item: ${c.registryId}:${p}`);o(c.registryId,y)}}}for(let i of e){let[s,...a]=i.split(":"),c=a.join(":");if(!s||!c)throw new Error(`Invalid snippet format: "${i}"`);let p=t.find(y=>y.id===s)?.items.find(y=>y.id===c);if(!p)throw new Error(`Cannot find snippet: "${i}"`);o(s,p)}return{registryItemsToAdd:r,npmDependenciesToAdd:n}}import*as _e from"@clack/prompts";import{z as d}from"zod";var ve=d.object({id:d.string(),description:d.string().optional(),deprecated:d.boolean().optional(),hideFromCLICatalog:d.boolean().optional(),dependencies:d.array(d.string()).optional(),innerDependencies:d.array(d.object({registryId:d.string(),itemIds:d.array(d.string())})).optional(),snippets:d.array(d.object({path:d.string(),dependencies:d.record(d.string(),d.string()).optional(),content:d.string()}))}),Te=d.object({id:d.string(),hideFromCLICatalog:d.boolean().optional(),items:d.array(ve.omit({snippets:!0}).extend({snippets:d.array(d.object({path:d.string(),dependencies:d.record(d.string(),d.string()).optional()}))}))}),Me=d.array(d.object({id:d.string()})),Pt=d.object({label:d.string(),path:d.string()}),St=d.object({id:d.string(),title:d.string(),description:d.string().optional(),docUrl:d.string(),deprecated:d.boolean().optional(),snippetKey:d.string().optional(),snippets:d.array(Pt).optional()}),Et=d.object({id:d.string(),label:d.string(),items:d.array(St)}),Rt=d.object({id:d.string(),label:d.string(),sections:d.array(Et)}),Ue=d.object({categories:d.array(Rt)});var vt=1e4;async function Fe(e,t=vt){let r=new AbortController,n=setTimeout(()=>r.abort(),t);try{return await fetch(e,{signal:r.signal})}catch(o){throw o instanceof Error&&o.name==="AbortError"?new $({message:`\uC694\uCCAD \uC2DC\uAC04\uC774 \uCD08\uACFC\uB418\uC5C8\uC5B4\uC694 (${t}ms): ${e}`,hint:"\uB124\uD2B8\uC6CC\uD06C \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uACE0 \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uC8FC\uC138\uC694."}):o}finally{clearTimeout(n)}}async function je({baseUrl:e}){let t=await fetch(`${e}/__docs__/index.json`);if(!t.ok)throw new $({message:`\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694: ${t.status} ${t.statusText}`});let r=await t.json(),{success:n,data:o,error:i}=Ue.safeParse(r);if(!n)throw new $({message:`\uBB38\uC11C \uBAA9\uB85D \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694: ${i?.message}`});return o}async function de({baseUrl:e,framework:t}){let r=await fetch(`${e}/__registry__/${t}/index.json`);if(!r.ok)throw new Error(`Failed to fetch registries: ${r.status} ${r.statusText}`);let n=await r.json(),{success:o,data:i,error:s}=Me.safeParse(n);if(!o)throw new Error(`Failed to parse registries: ${s?.message}`);return i}async function fe({baseUrl:e,framework:t,registryId:r}){let n=await fetch(`${e}/__registry__/${t}/${r}/index.json`);if(!n.ok)throw new Error(`Failed to fetch ${r} registry: ${n.status} ${n.statusText}`);let o=await n.json(),{success:i,data:s,error:a}=Te.safeParse(o);if(!i)throw new Error(`Failed to parse ${r} registry: ${a?.message}`);return s}async function Tt({baseUrl:e,framework:t,registryId:r,registryItemId:n}){let o=await fetch(`${e}/__registry__/${t}/${r}/${n}.json`);if(!o.ok)throw new Error(`Failed to fetch ${n}: ${o.status} ${o.statusText}`);let i=await o.json(),{success:s,data:a,error:c}=ve.safeParse(i);if(!s)throw new Error(`Failed to parse ${n}: ${c?.message}`);return a}async function Ke({url:e}){let t=await Fe(e);if(!t.ok)throw new $({message:`llms.txt\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694: ${t.status} ${t.statusText}`,hint:`${e} \uC5D0 \uC811\uADFC\uD560 \uC218 \uC788\uB294\uC9C0 \uD655\uC778\uD574\uC8FC\uC138\uC694.`});return t.text()}async function Ne({baseUrl:e,query:t}){let r=t.startsWith("/")?t.slice(1):t,n=[`${e}/llms/${r}.txt`,`${e}/llms/${r}/llms.txt`],o;for(let i of n){let s;try{s=await Fe(i)}catch(a){o=a;continue}if(s.ok)return s.text();if(s.status===404){o=new $({message:`llms.txt\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694: ${r}`,hint:`\uB2E4\uC74C \uACBD\uB85C\uB97C \uC2DC\uB3C4\uD588\uC5B4\uC694:
5
+ ${n.map(a=>` - ${a}`).join(`
6
+ `)}`});continue}throw new $({message:`llms.txt \uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC5B4\uC694: ${s.status} ${s.statusText}`,hint:`URL: ${i}`})}throw o??new $({message:`llms.txt\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694: ${r}`,hint:`\uB2E4\uC74C \uACBD\uB85C\uB97C \uC2DC\uB3C4\uD588\uC5B4\uC694:
7
+ ${n.map(i=>` - ${i}`).join(`
8
+ `)}`})}async function ze({baseUrl:e,framework:t,registryId:r,registryItemIds:n}){return await Promise.all(n.map(async o=>{try{return await Tt({baseUrl:e,framework:t,registryId:r,registryItemId:o})}catch(i){let s=await fetch(`${e}/__registry__/${t}/${r}/index.json`);if(!s.ok)throw new Error(`${r} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694: ${s.status} ${s.statusText}`);let a=await s.json(),{success:c,data:p}=Te.safeParse(a);throw c?(_e.log.error(`${o} \uC2A4\uB2C8\uD3AB\uC774 ${r} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC5C6\uC5B4\uC694.`),_e.log.info(`${r} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC874\uC7AC\uD558\uB294 \uC2A4\uB2C8\uD3AB:
9
+ ${p.items.map(y=>y.id).join(`
10
+ `)}`),i):new Error(`Failed to parse registry index for ${r}`)}}))}import{promises as Lt}from"fs";import{tmpdir as Mt}from"os";import qe from"path";import{transformFromAstSync as _t}from"@babel/core";import jt from"@babel/plugin-transform-typescript";import*as Ie from"recast";import{parse as At}from"@babel/parser";var Dt={sourceType:"module",allowImportExportEverywhere:!0,allowReturnOutsideFunction:!0,startLine:1,tokens:!0,plugins:["asyncGenerators","bigInt","classPrivateMethods","classPrivateProperties","classProperties","classStaticBlock","decimal","decorators-legacy","doExpressions","dynamicImport","exportDefaultFrom","exportNamespaceFrom","functionBind","functionSent","importAssertions","importMeta","nullishCoalescingOperator","numericSeparator","objectRestSpread","optionalCatchBinding","optionalChaining",["pipelineOperator",{proposal:"minimal"}],["recordAndTuple",{syntaxType:"hash"}],"throwExpressions","topLevelAwait","v8intrinsic","typescript","jsx"]},Ve=async({sourceFile:e,config:t})=>{let r=e.getFullText();if(t.tsx)return r;let n=Ie.parse(r,{parser:{parse:i=>At(i,Dt)}}),o=_t(n,r,{cloneInputAst:!1,code:!1,ast:!0,plugins:[jt],configFile:!1});if(!o||!o.ast)throw new Error("Failed to transform JSX");return Ie.print(o.ast).code};import{SyntaxKind as Ot}from"ts-morph";var Be=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let r=e.getFirstChildByKind(Ot.ExpressionStatement);if(!r)return e;let n=r.getExpression();if(!n)return e;let o=n.getText().trim();if(o!=='"use client"'&&o!=="'use client'")return e;let i=r.getText(),s=r.getFullText();if(i.trim()===s.trim())return e;let c=s.replace(i,"").replace(/^\s*\n/,"").replace(/\n\s*$/,"");return r.replaceWithText(c),e};import{Project as Ut,ScriptKind as Ft}from"ts-morph";var Kt=[Be],Nt=new Ut({compilerOptions:{}});async function zt(e){let t=await Lt.mkdtemp(qe.join(Mt(),"seed-design-"));return qe.join(t,e)}async function Ge(e){let t=await zt(e.filename),r=Nt.createSourceFile(t,e.raw,{scriptKind:Ft.TSX});for(let n of Kt)n({sourceFile:r,...e});return await Ve({sourceFile:r,...e})}import*as J from"@clack/prompts";import ge from"fs-extra";import Z from"path";import{createPatch as Vt}from"diff";import Bt from"@npmcli/disparity-colors";async function ke({registryItemsToAdd:e,rootPath:t,cwd:r,baseUrl:n,framework:o,config:i,onDiff:s}){let a=[];for(let{registryId:c,items:p}of e){let y=Z.join(t,c);ge.ensureDirSync(y);let w=await ze({baseUrl:n,framework:o,registryId:c,registryItemIds:p.map(g=>g.id)});for(let{id:g,snippets:x}of w){let I=await Promise.all(x.map(async E=>{let C=await Ge({filename:E.path,config:i,raw:E.content}),h=Z.join(y,E.path);return i.tsx||(h=h.replace(/\.tsx$/,".jsx"),h=h.replace(/\.ts$/,".js")),{filePath:h,content:C,relativePath:Z.relative(r,h),name:`${c}:${g}`}})),v=[];for(let E of I){let{filePath:C,content:h,relativePath:u}=E;if(await ge.ensureDir(Z.dirname(C)),ge.existsSync(C)){let b=await ge.readFile(C,"utf-8");if(b===h){J.log.info(`${m(u)}: \uC774\uBBF8 \uCD5C\uC2E0 \uC0C1\uD0DC\uC608\uC694.`);continue}let k=Z.basename(C),z=Z.extname(C),W=Z.basename(C,z),P=Date.now(),V=`legacy-${W}-${P}${z}`,U=await(async()=>{if(s)return s;let S=Vt(u,b,h),l=Bt(S);return J.log.message(`
11
+ ${m(u)}: \uD604\uC7AC \uD30C\uC77C\uACFC \uBC1B\uC73C\uB824\uB294 \uD30C\uC77C\uC758 \uB0B4\uC6A9\uC774 \uB2EC\uB77C\uC694.
12
+ `),J.log.message(l),J.select({message:"\uD604\uC7AC \uD30C\uC77C\uC5D0 \uC2A4\uD0C0\uC77C \uBCC0\uACBD, \uB85C\uAE45 \uB4F1 \uCEE4\uC2A4\uD130\uB9C8\uC774\uC9D5\uC774 \uC801\uC6A9\uB418\uC5B4 \uC788\uB294 \uACBD\uC6B0 \uC2E0\uADDC \uD30C\uC77C\uC5D0 \uB3D9\uC77C\uD55C \uCEE4\uC2A4\uD130\uB9C8\uC774\uC9D5\uC744 \uC801\uC6A9\uD558\uB294 \uAC83\uC744 \uAC80\uD1A0\uD574\uBCF4\uC138\uC694.",options:[{value:"overwrite",label:`${k} \uB36E\uC5B4\uC4F0\uAE30`},{value:"backup",label:`\uAE30\uC874 \uD30C\uC77C \uB0B4\uC6A9\uC744 ${V}\uC73C\uB85C \uC62E\uAE30\uACE0 ${k} \uBC1B\uAE30`},{value:"skip",label:"\uC0C8 \uD30C\uC77C \uBC1B\uC9C0 \uC54A\uACE0 \uADF8\uB300\uB85C \uB450\uAE30"}]})})();if(J.isCancel(U)||U==="skip"){J.log.info(`${m(u)}: \uD30C\uC77C\uC744 \uBC1B\uC9C0 \uC54A\uACE0 \uAC74\uB108\uB6F0\uC5C8\uC5B4\uC694.`);continue}if(U==="backup"){let S=Z.dirname(C),l=Z.join(S,V);await ge.rename(C,l),J.log.info(`${m(u)}: \uAE30\uC874 \uD30C\uC77C\uC744 ${m(Z.relative(r,l))}\uB85C \uC62E\uACBC\uC5B4\uC694.`)}}await ge.writeFile(C,h),v.push(E)}if(v.length>0){let E=v.map(({name:C,relativePath:h})=>({name:C,path:h}));a.push(...E),J.log.success(`${m(`${c}:${g}`)} \uAD00\uB828 \uC2A4\uB2C8\uD3AB \uB2E4\uC6B4\uB85C\uB4DC \uC644\uB8CC: ${m(E.map(C=>C.path).join(", "))}`)}}}}import*as j from"@clack/prompts";import dr from"path";import{z as re}from"zod";var K="https://seed-design.io";var He={"1.0":"https://v1-0.seed-design.io","1.1":"https://v1-1.seed-design.io","1.2":"https://v1-2.seed-design.io"};function Pe(e){let t=e.seedReactVersion?.trim();if(!t)return null;let r=He[t];if(!r)throw new $({message:`\uC9C0\uC6D0\uD558\uC9C0 \uC54A\uB294 SEED React \uBC84\uC804\uC774\uC5D0\uC694: "${e.seedReactVersion}"`,hint:`\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uBC84\uC804: ${Object.keys(He).join(", ")}`});return{framework:"react",baseUrl:r}}import*as We from"@clack/prompts";import{execa as Gt}from"execa";import{detect as qt}from"@antfu/ni";async function Je(e){let t=await qt({programmatic:!0,cwd:e});return t==="yarn@berry"?"yarn":t==="pnpm@6"?"pnpm":t==="bun"?"bun":t==="deno"?"deno":t??"npm"}async function Se({cwd:e,deps:t,dev:r=!1}){let{start:n,stop:o}=We.spinner(),i=await Je(e),a={...ie(e).dependencies},c=new Set(t.filter(I=>!a[I])),p=new Set(t.filter(I=>a[I]));if(!c.size)return{installed:new Set,filtered:c};n("\uC758\uC874\uC131 \uC124\uCE58\uC911...");let g=[i==="npm"?"install":"add",r?"-D":null,...c].filter(I=>!!I),x=`${i} ${g.join(" ")}`;try{await Gt(i,g,{cwd:e})}catch(I){throw o("\uC758\uC874\uC131 \uC124\uCE58\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694."),new $({message:"\uC758\uC874\uC131 \uC124\uCE58\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",hint:"\uB124\uD2B8\uC6CC\uD06C \uC0C1\uD0DC\uB97C \uD655\uC778\uD558\uACE0, \uC124\uCE58 \uBA85\uB839\uC5B4\uB97C \uC9C1\uC811 \uC2E4\uD589\uD574 \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",details:[`\uC2E4\uD589 \uBA85\uB839\uC5B4: ${x}`],cause:I})}return o("\uC758\uC874\uC131 \uC124\uCE58\uAC00 \uC644\uB8CC\uB410\uC5B4\uC694."),{installed:c,filtered:p}}import{randomUUID as Ht}from"node:crypto";import*as Qe from"@clack/prompts";var Jt="seed_cli";async function Wt(e){if(process.env.DISABLE_TELEMETRY==="true"||process.env.SEED_DISABLE_TELEMETRY==="true")return!1;try{if((await ne(e))?.telemetry===!1)return!1}catch{}return!0}function Yt(){return Ht()}var Qt=Yt(),Ye=!1;function Xe(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0))}function Xt(e){return e instanceof Error&&e.name?e.name:typeof e=="object"&&e!==null?e.constructor?.name??"Object":typeof e}async function Ze(e,{event:t,properties:r={}}){if(!await Wt(e))return;let o=`${Jt}.${t}`;Ye||(Qe.log.info("\u{1F4CA} \uC0AC\uC6A9 \uB370\uC774\uD130 \uC218\uC9D1 \uC911 (\uBE44\uD65C\uC131\uD654: seed-design.json \uB610\uB294 DISABLE_TELEMETRY \uD658\uACBD \uBCC0\uC218)"),Ye=!0);try{let i="https://us.i.posthog.com/capture",s={"Content-Type":"application/json"},a={api_key:"phc_seod8HhifElOP1R92KmvsQybrtUmkOTgZBsq0mfCelR",event:o,distinct_id:Qt,properties:{...r,$process_person_profile:!1},timestamp:new Date().toISOString()},c=new AbortController,p=setTimeout(()=>c.abort(),5e3);try{await fetch(i,{method:"POST",headers:s,body:JSON.stringify(a),signal:c.signal})}finally{clearTimeout(p)}}catch{}}async function et(e,{command:t,status:r,result:n,properties:o={}}){await Ze(e,{event:t,properties:Xe({status:r,result:n,...o})})}async function Zt(e,{command:t,error:r,result:n,properties:o={}}){await et(e,{command:t,status:"failed",result:n,properties:Xe({error_type:Xt(r),...o})})}var R={track:Ze,trackCommandFailure:Zt,trackCommandOutcome:et};import*as pe from"@clack/prompts";import er from"fs-extra";import tr from"path";import{intersects as rr,satisfies as sr,valid as rt,validRange as st}from"semver";var or=["@seed-design/react","@seed-design/css"],ir=["@seed-design/lynx-react","@seed-design/lynx-css"];function ae(e){return e==="lynx"?ir:or}var tt="workspace:",nr="npm:";function ue(e,t="react"){try{let r=ie(e),n={...r.dependencies,...r.devDependencies,...r.peerDependencies,...r.optionalDependencies},o={},i=ae(t);for(let s of i){let a=n[s];typeof a=="string"&&(o[s]=a)}return o}catch{return{}}}function ye({publicRegistries:e,itemKeys:t,projectPackageVersions:r,framework:n="react"}){let o=Array.from(new Set(t)),i=new Map(e.flatMap(c=>c.items.map(p=>[`${c.id}:${p.id}`,p]))),s=[],a=ae(n);for(let c of o){let p=i.get(c);if(!p)continue;let y=ar(p,n);for(let w of a){let g=Array.from(y[w]??[]);if(!g.length)continue;let x=r[w];if(!x){s.push({itemKey:c,packageName:w,requiredRanges:g,type:"missing-package"});continue}let I=cr(x);if(!I){s.push({itemKey:c,packageName:w,requiredRanges:g,installedVersionSpec:x,type:"invalid-version-spec"});continue}g.every(E=>lr({currentVersionSpec:I,requiredRange:E}))||s.push({itemKey:c,packageName:w,requiredRanges:g,installedVersionSpec:x,type:"incompatible-version"})}}return{checkedItemKeys:o,projectPackageVersions:r,issues:s}}function he({report:e,title:t,framework:r="react"}){if(!e.issues.length)return;let n=ae(r);pe.log.warn(t),pe.log.info(`\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804: ${n.map(i=>`${i}@${m(e.projectPackageVersions[i]??"\uBBF8\uC124\uCE58")}`).join(", ")}`);let o=new Map;for(let i of e.issues){let s=o.get(i.itemKey)??[];s.push(i),o.set(i.itemKey,s)}for(let[i,s]of o.entries()){pe.log.warn(m(i));for(let a of s){let c=a.requiredRanges.join(" | ");if(a.type==="missing-package"){pe.log.info(` - ${a.packageName}: \uD328\uD0A4\uC9C0\uAC00 \uC124\uCE58\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC544\uC694. \uD544\uC694 \uBC94\uC704: ${c}`);continue}if(a.type==="invalid-version-spec"){pe.log.info(` - ${a.packageName}: \uD604\uC7AC \uBC84\uC804 \uD615\uC2DD\uC744 \uD574\uC11D\uD558\uC9C0 \uBABB\uD588\uC5B4\uC694 (${a.installedVersionSpec}). \uD544\uC694 \uBC94\uC704: ${c}`);continue}pe.log.info(` - ${a.packageName}: \uD604\uC7AC ${a.installedVersionSpec}, \uD544\uC694 \uBC94\uC704 ${c}`)}}}function ot({publicRegistries:e,rootPath:t}){let r=[];for(let n of e)for(let o of n.items)o.snippets.some(s=>mr(s.path).some(a=>er.existsSync(tr.join(t,n.id,a))))&&r.push(`${n.id}:${o.id}`);return r}function ar(e,t="react"){let r=ae(t),n=Object.fromEntries(r.map(o=>[o,new Set]));for(let o of e.snippets)for(let[i,s]of Object.entries(o.dependencies??{}))pr(i,t)&&n[i].add(s);return n}function cr(e){let t=e.trim();if(t.startsWith(tt)&&(t=t.slice(tt.length).trim()),t.startsWith(nr)){let r=t.split("@").at(-1);if(!r)return null;t=r}return!t||t==="*"?null:rt(t)||st(t)?t:null}function lr({currentVersionSpec:e,requiredRange:t}){let r=st(t);return r?rt(e)?sr(e,r,{includePrerelease:!0}):rr(e,r,{includePrerelease:!0}):!1}function mr(e){let t=new Set([e]);return e.endsWith(".tsx")&&t.add(`${e.slice(0,-4)}.jsx`),e.endsWith(".ts")&&t.add(`${e.slice(0,-3)}.js`),e.endsWith(".jsx")&&t.add(`${e.slice(0,-4)}.tsx`),e.endsWith(".js")&&t.add(`${e.slice(0,-3)}.ts`),Array.from(t)}function pr(e,t="react"){return ae(t).includes(e)}var fr=re.object({itemIds:re.array(re.string()).optional(),all:re.boolean(),cwd:re.string(),baseUrl:re.string().default(K),seedReactVersion:re.string().optional(),framework:re.enum(["react","lynx"]).optional(),onDiff:re.enum(["overwrite","backup"]).optional()}),it=e=>{e.command("add [...item-ids]","add items").option("-a, --all","[Deprecated] Add all items",{default:!1}).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",{default:process.cwd()}).option("-u, --baseUrl <baseUrl>","the base url of the registry. defaults to the current directory.",{default:K}).option("--seed-react-version <version>","\uC9C0\uC815\uD55C SEED React \uBC84\uC804\uC758 \uB808\uC9C0\uC2A4\uD2B8\uB9AC \uC0AC\uC6A9 (\uC608: 1.2)").option("-f, --framework <framework>","\uD504\uB808\uC784\uC6CC\uD06C (react \uB610\uB294 lynx)").option("--on-diff <mode>","Action when file differs: overwrite or backup").example("seed-design add ui:action-button").example("seed-design add ui:alert-dialog").action(async(t,r)=>{let n=Date.now(),o=Y(r),i=typeof r?.cwd=="string"?r.cwd:process.cwd();j.intro("seed-design add");try{let s=fr.safeParse({itemIds:t,...r});if(!s.success)throw s.error;let{data:{all:a,...c}}=s;if(a)throw new $({message:"`--all` \uC635\uC158\uC740 \uB354 \uC774\uC0C1 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC544\uC694. \uB300\uC2E0 `seed-design add-all` \uBA85\uB839\uC5B4\uB97C \uC0AC\uC6A9\uD574\uC8FC\uC138\uC694."});let p=c.cwd,y=Pe(c),w=y?.baseUrl??c.baseUrl,g=await $e(p),x=y?.framework??c.framework??g.framework,I=dr.resolve(p,g.path),{start:v,stop:E}=j.spinner();v("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let C=await(async()=>{try{let l=await Promise.all((await de({baseUrl:w,framework:x})).map(async({id:f})=>fe({baseUrl:w,framework:x,registryId:f})));return E("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),l}catch(l){throw E("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),l}})(),h=await(async()=>{if(c.itemIds?.length)return c.itemIds;let l=await j.multiselect({message:"\uCD94\uAC00\uD560 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694 (\uC2A4\uD398\uC774\uC2A4 \uBC14\uB85C \uC5EC\uB7EC \uAC1C \uC120\uD0DD \uAC00\uB2A5)",options:C.filter(({hideFromCLICatalog:f})=>!f).flatMap(({id:f,items:T})=>T.filter(({hideFromCLICatalog:_})=>!_).sort((_,L)=>_.id.localeCompare(L.id)).map(({id:_,description:L,deprecated:M})=>({label:`${M?"(deprecated) ":""}${m(f)}:${_}`,value:`${f}:${_}`,hint:L,deprecated:M,registryItemCount:T.length}))).sort((f,T)=>f.deprecated!==T.deprecated?f.deprecated?1:-1:T.registryItemCount-f.registryItemCount)});if(j.isCancel(l))throw new D;return l})();if(!h?.length)throw new D("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC120\uD0DD\uB418\uC9C0 \uC54A\uC558\uC5B4\uC694.");j.log.message(`\uC120\uD0DD\uB41C \uD56D\uBAA9: ${m(h.join(", "))}`);let u=[];for(let l of h){let[f,...T]=l.split(":"),_=T.join(":");if(!f||!_)throw new $({message:`${m(l)}: \uD56D\uBAA9 \uC774\uB984\uC774 \uC798\uBABB\uB418\uC5C8\uC5B4\uC694.`,hint:`${m("ui:action-button")}\uACFC \uAC19\uC740 \uD615\uC2DD\uC73C\uB85C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});let L=C.find(M=>M.id===f)?.items.find(M=>M.id===_);if(!L)throw new $({message:`${m(l)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});if(L.deprecated){let M=await j.confirm({message:`${m(L.id)}: deprecated \uB418\uC5C8\uC5B4\uC694. \uCD94\uAC00\uD560\uAE4C\uC694?`,initialValue:!1});if(j.isCancel(M))throw new D;if(M===!1){j.log.info(`${m(L.id)}: \uCD94\uAC00\uD558\uC9C0 \uC54A\uC744\uAC8C\uC694.`);continue}}u.push(l)}let{registryItemsToAdd:b,npmDependenciesToAdd:k}=xe({selectedItemKeys:u,publicRegistries:C}),z=ye({publicRegistries:C,itemKeys:b.flatMap(({registryId:l,items:f})=>f.map(T=>`${l}:${T.id}`)),projectPackageVersions:ue(c.cwd,x),framework:x});he({report:z,title:"\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804\uACFC \uD638\uD658\uB418\uC9C0 \uC54A\uC744 \uC218 \uC788\uB294 \uC2A4\uB2C8\uD3AB\uC774 \uC788\uC5B4\uC694.",framework:x}),j.log.info(`\uCD94\uAC00\uD560 \uD56D\uBAA9: ${m(b.map(l=>l.items.map(f=>`${l.registryId}:${f.id}`).join(", ")).join(", ")||"\uC5C6\uC74C")}
9
13
 
10
- \uC124\uCE58\uD560 \uC758\uC874\uC131: ${p(Array.from(b).join(", ")||"\uC5C6\uC74C")}`),await we({registryItemsToAdd:d,rootPath:u,cwd:a,baseUrl:w,framework:$,config:C,onDiff:c.onDiff});let{installed:U,filtered:H}=await be({cwd:a,deps:Array.from(b)});U.size===0&&S.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),U.size&&(S.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${p(Array.from(U).join(", "))}`),H.size&&S.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${p(Array.from(H).join(", "))}`)),S.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let ie=Date.now()-n,de=new Set(d.map(m=>m.registryId)),k=f.some(m=>{let[y,...j]=m.split(":"),M=j.join(":");return x.find(_=>_.id===y)?.items.find(_=>_.id===M)?.deprecated});try{await N.track(c.cwd,{event:"add",properties:{items_count:h.length,registries:Array.from(de),has_deprecated:k,dependencies_count:b.size,duration_ms:ie}})}catch(m){o&&console.error("[Telemetry] add tracking failed:",m)}}catch(s){F(s)&&(S.outro(p(s.message)),process.exit(0)),V(s,{defaultMessage:"\uCD94\uAC00\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:o}),process.exit(1)}})};import*as v from"@clack/prompts";import Qt from"path";import{z as Y}from"zod";var Zt=Y.object({registryIds:Y.array(Y.string()).optional(),all:Y.boolean(),includeDeprecated:Y.boolean().optional(),cwd:Y.string(),baseUrl:Y.string().optional(),framework:Y.enum(["react","lynx"]).optional(),onDiff:Y.enum(["overwrite","backup"]).optional()}),He=e=>{e.command("add-all [...registry-ids]","add all items from registries").option("-a, --all","Add all items from all registries",{default:!1}).option("--include-deprecated","Include deprecated items when used with `--all`",{default:!1}).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",{default:process.cwd()}).option("-u, --baseUrl <baseUrl>","the base url of the registry. defaults to the current directory.",{default:G}).option("-f, --framework <framework>","\uD504\uB808\uC784\uC6CC\uD06C (react \uB610\uB294 lynx)").option("--on-diff <mode>","Action when file differs: overwrite or backup").example("seed-design add-all ui --include-deprecated").example("seed-design add-all ui lib breeze").action(async(t,r)=>{let n=Date.now(),o=z(r);v.intro("seed-design add-all");try{let s=Zt.safeParse({registryIds:t,...r});if(!s.success)throw s.error;let{data:i}=s,c=i.cwd,a=i.baseUrl,w=await ue(c),C=i.framework??w.framework,$=Qt.resolve(c,w.path),{start:u,stop:A}=v.spinner();u("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let g=await(async()=>{try{let k=await Promise.all((await ne({baseUrl:a,framework:C})).map(async({id:m})=>ae({baseUrl:a,framework:C,registryId:m})));return A("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),k}catch(k){throw A("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),k}})(),x=await(async()=>{if(i.all){let m=g.map(y=>y.id);return v.log.message(`\uBAA8\uB4E0 \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${p(m.join(", "))}`),m}if(i.registryIds?.length){let m=g.map(y=>y.id);for(let y of i.registryIds)if(!m.includes(y))throw new P({message:`\uB808\uC9C0\uC2A4\uD2B8\uB9AC '${y}'\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,details:[`\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uB808\uC9C0\uC2A4\uD2B8\uB9AC: ${m.join(", ")}`]});return v.log.message(`\uC120\uD0DD\uB41C \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${p(i.registryIds.join(", "))}`),i.registryIds}let k=await v.multiselect({message:"\uCD94\uAC00\uD560 \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694 (\uC2A4\uD398\uC774\uC2A4 \uBC14\uB85C \uC5EC\uB7EC \uAC1C \uC120\uD0DD \uAC00\uB2A5)",options:g.filter(({hideFromCLICatalog:m})=>!m).sort((m,y)=>y.items.length-m.items.length).map(m=>{let y=m.items[0]?.id,j=y?`${m.items.length}\uAC1C \uD56D\uBAA9 (${y} \uB4F1)`:`${m.items.length}\uAC1C \uD56D\uBAA9 (\uD56D\uBAA9 \uC5C6\uC74C)`;return{label:m.id,value:m.id,hint:j}})});if(v.isCancel(k))throw new E;return v.log.message(`\uC120\uD0DD\uB41C \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${p(k.join(", "))}`),k})(),f=g.filter(k=>x.includes(k.id)),h=f.flatMap(k=>k.items.filter(m=>m.deprecated?i.includeDeprecated:!0).map(m=>`${k.id}:${m.id}`)),d=f.reduce((k,m)=>k+m.items.filter(y=>y.deprecated).length,0);if(!i.includeDeprecated&&d>0&&v.log.info(`${d}\uAC1C\uC758 deprecated \uD56D\uBAA9\uC740 \uC81C\uC678\uB418\uC5C8\uC5B4\uC694. --include-deprecated \uC635\uC158\uC744 \uC0AC\uC6A9\uD558\uBA74 \uCD94\uAC00\uD560 \uC218 \uC788\uC5B4\uC694.`),!h.length)throw new E("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC5B4\uC694.");v.log.message(`\uCD1D ${p(h.length.toString())}\uAC1C\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4.`);let{registryItemsToAdd:b,npmDependenciesToAdd:I}=ye({selectedItemKeys:h,publicRegistries:g}),U=le({publicRegistries:g,itemKeys:b.flatMap(({registryId:k,items:m})=>m.map(y=>`${k}:${y.id}`)),projectPackageVersions:pe(i.cwd,C),framework:C});me({report:U,title:"\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804\uACFC \uD638\uD658\uB418\uC9C0 \uC54A\uC744 \uC218 \uC788\uB294 \uC2A4\uB2C8\uD3AB\uC774 \uC788\uC5B4\uC694.",framework:C}),await we({registryItemsToAdd:b,rootPath:$,cwd:c,baseUrl:a,framework:C,config:w,onDiff:i.onDiff});let{installed:H,filtered:ie}=await be({cwd:c,deps:Array.from(I)});H.size===0&&v.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),H.size&&(v.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${p(Array.from(H).join(", "))}`),ie.size&&v.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${p(Array.from(ie).join(", "))}`)),v.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let de=Date.now()-n;try{await N.track(i.cwd,{event:"add-all",properties:{registries:x,items_count:h.length,include_deprecated:i.includeDeprecated||!1,dependencies_count:I.size,duration_ms:de}})}catch(k){o&&console.error("[Telemetry] add-all tracking failed:",k)}}catch(s){F(s)&&(v.outro(p(s.message)),process.exit(0)),V(s,{defaultMessage:"\uCD94\uAC00\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:o}),process.exit(1)}})};import*as T from"@clack/prompts";import Je from"path";import{z as D}from"zod";var er=D.object({itemIds:D.array(D.string()).optional(),component:D.union([D.string(),D.array(D.string())]).optional(),all:D.boolean(),registry:D.string().optional(),cwd:D.string(),baseUrl:D.string().optional(),framework:D.enum(["react","lynx"]).optional()});function tr({itemIds:e,component:t}){let r=s=>s.trim().replace(/\s+/g,"-"),n=(e??[]).map(r).filter(Boolean),o=(Array.isArray(t)?t:[t]).filter(s=>!!s).flatMap(s=>s.split(",")).map(r).filter(Boolean);return Array.from(new Set([...n,...o]))}function rr({publicRegistries:e,targetInputs:t,defaultRegistry:r}){let n=e.filter(s=>typeof s.id=="string"&&Array.isArray(s.items)).flatMap(s=>s.items.filter(i=>typeof i.id=="string").map(i=>`${s.id}:${i.id}`)),o=new Set;for(let s of t){let i=s.includes(":")?s:r?`${r}:${s}`:(()=>{let c=n.filter(a=>a.endsWith(`:${s}`));if(!c.length)throw new P({message:`${p(s)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,hint:`${p("ui:action-button")}\uCC98\uB7FC registry\uB97C \uD3EC\uD568\uD574\uC11C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});if(c.length>1)throw new P({message:`${p(s)}: \uAC19\uC740 \uC774\uB984\uC758 \uD56D\uBAA9\uC774 \uC5EC\uB7EC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC788\uC5B4\uC694.`,details:c.map(a=>`- ${a}`),hint:`${p("ui:action-button")}\uCC98\uB7FC registry\uB97C \uD3EC\uD568\uD574\uC11C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});return c[0]})();if(!n.includes(i))throw new P({message:`${p(i)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});o.add(i)}return Array.from(o)}var We=e=>{e.command("compat [...item-ids]","check snippet compatibility").option("-c, --component <component>","\uAC80\uC0AC\uD560 \uCEF4\uD3EC\uB10C\uD2B8. \uC5EC\uB7EC \uBC88 \uB610\uB294 \uC27C\uD45C\uB85C \uC9C0\uC815 \uAC00\uB2A5").option("-a, --all","\uBAA8\uB4E0 registry \uD56D\uBAA9\uC744 \uAC80\uC0AC",{default:!1}).option("-r, --registry <registryId>","\uCEF4\uD3EC\uB10C\uD2B8 shorthand \uC785\uB825 \uC2DC \uAE30\uBCF8 registry").option("--cwd <cwd>","the working directory. defaults to the current directory.",{default:process.cwd()}).option("-u, --baseUrl <baseUrl>","the base url of the registry. defaults to the current directory.",{default:G}).option("-f, --framework <framework>","\uD504\uB808\uC784\uC6CC\uD06C (react \uB610\uB294 lynx)").example("seed-design compat").example("seed-design compat -c action-button").example("seed-design compat ui:action-button ui:alert-dialog").example("seed-design compat --all").action(async(t,r)=>{let n=Date.now(),o=z(r);T.intro("seed-design compat");try{let s=er.safeParse({itemIds:t,...r});if(!s.success)throw s.error;let{data:i}=s,c=await oe(i.cwd),a=i.framework??c?.framework??"react",{start:w,stop:C}=T.spinner();w("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let $=await(async()=>{try{let d=await Promise.all((await ne({baseUrl:i.baseUrl,framework:a})).map(async({id:b})=>ae({baseUrl:i.baseUrl,framework:a,registryId:b})));return C("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),d}catch(d){throw C("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),d}})(),u=tr({itemIds:i.itemIds,component:i.component}),A=i.all?$.flatMap(b=>b.items.map(I=>`${b.id}:${I.id}`)):u.length>0?rr({publicRegistries:$,targetInputs:u,defaultRegistry:i.registry}):oe(i.cwd),g=Array.isArray(A)?A:await(async()=>{let d=await A;if(!d)throw new P({message:"seed-design.json \uD30C\uC77C\uC774 \uC5C6\uC5B4 \uC124\uCE58\uB41C \uC2A4\uB2C8\uD3AB \uACBD\uB85C\uB97C \uC54C \uC218 \uC5C6\uC5B4\uC694.",hint:"`seed-design init`\uC73C\uB85C \uC124\uC815\uC744 \uB9CC\uB4E0 \uB4A4 \uC2E4\uD589\uD558\uAC70\uB098, `--all`/`-c`\uB85C \uAC80\uC0AC \uB300\uC0C1\uC744 \uC9C1\uC811 \uC9C0\uC815\uD574\uC8FC\uC138\uC694."});let b=Je.resolve(i.cwd,d.path),I=Be({publicRegistries:$,rootPath:b});return I.length?I:(T.log.info(`${p(Je.relative(i.cwd,b)||d.path)}\uC5D0\uC11C \uC124\uCE58\uB41C \uC2A4\uB2C8\uD3AB\uC744 \uCC3E\uC9C0 \uBABB\uD588\uC5B4\uC694.`),[])})();g.length||(T.outro("\uAC80\uC0AC\uD560 \uC2A4\uB2C8\uD3AB\uC774 \uC5C6\uC5B4\uC694."),process.exit(0));let x=pe(i.cwd,a),f=le({publicRegistries:$,itemKeys:g,projectPackageVersions:x,framework:a});if(T.log.info(`\uAC80\uC0AC \uB300\uC0C1: ${p(f.checkedItemKeys.join(", "))}`),!f.issues.length){let d=Z(a);T.outro(`\uBAA8\uB4E0 \uC2A4\uB2C8\uD3AB\uC774 \uD604\uC7AC ${d.join(", ")}\uC640 \uD638\uD658\uB3FC\uC694.`);try{await N.track(i.cwd,{event:"compat",properties:{checked_items_count:f.checkedItemKeys.length,incompatible_items_count:0,duration_ms:Date.now()-n}})}catch(b){o&&console.error("[Telemetry] compat tracking failed:",b)}process.exit(0)}me({report:f,title:"\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804\uACFC \uD638\uD658\uB418\uC9C0 \uC54A\uB294 \uC2A4\uB2C8\uD3AB\uC744 \uCC3E\uC558\uC5B4\uC694.",framework:a});let h=Z(a);T.log.info(`\uD544\uC694\uD55C \uBC84\uC804\uC73C\uB85C ${h.join(" \uB610\uB294 ")}\uB97C \uB9DE\uCD98 \uB4A4 \uB2E4\uC2DC \uC2E4\uD589\uD574\uBCF4\uC138\uC694.`),T.outro("\uD638\uD658\uC131 \uC774\uC288\uAC00 \uC788\uC5B4\uC694.");try{await N.track(i.cwd,{event:"compat",properties:{checked_items_count:f.checkedItemKeys.length,incompatible_items_count:new Set(f.issues.map(d=>d.itemKey)).size,issue_count:f.issues.length,duration_ms:Date.now()-n}})}catch(d){o&&console.error("[Telemetry] compat tracking failed:",d)}process.exit(1)}catch(s){F(s)&&(T.outro(p(s.message)),process.exit(0)),V(s,{defaultMessage:"\uD638\uD658\uC131 \uAC80\uC0AC\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:o}),process.exit(1)}})};import*as R from"@clack/prompts";import{z as ke}from"zod";var sr="https://raw.githubusercontent.com/daangn/seed-design/refs/heads/dev/docs/registry",ir=ke.object({query:ke.string().optional(),baseUrl:ke.string().optional()});function Ye(e,t){return`${sr}/${e}/${t}`}function or(e,t){let r=`${t}${e.docUrl}`,n=`${t}/llms${e.docUrl}.txt`,o=[e.id,`- docs: ${r}`,`- llms.txt: ${n}`];if(e.snippetKey&&e.snippets&&e.snippets.length>0){let[s]=e.snippetKey.split(":");if(s==="ui"||s==="breeze")if(e.snippets.length===1)o.push(`- snippet: ${Ye(s,e.snippets[0].path)}`);else{o.push("- snippet:");for(let i of e.snippets)o.push(` - ${i.label}: ${Ye(s,i.path)}`)}}R.log.message(o.join(`
11
- `))}function nr(e){return e.split("/").map(t=>t.trim()).filter(Boolean)}function ar(e,t){let r=t.toLowerCase();return e.flatMap(n=>n.sections.flatMap(o=>o.items.filter(s=>s.id.toLowerCase().includes(r)||s.title.toLowerCase().includes(r)).map(s=>({item:s,categoryLabel:n.label,sectionLabel:o.label}))))}async function fe(e){let t=await R.select({message:"\uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(r=>({label:`${r.deprecated?"(deprecated) ":""}${r.title}`,value:r,hint:r.description}))});if(R.isCancel(t))throw new E;return t}async function Xe(e){let t=await R.select({message:"\uC139\uC158\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(r=>({label:r.label,value:r,hint:`${r.items.length}\uAC1C \uD56D\uBAA9`}))});if(R.isCancel(t))throw new E;return t}async function cr(e){let t=await R.select({message:"\uCE74\uD14C\uACE0\uB9AC\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(r=>({label:r.label,value:r,hint:`${r.sections.reduce((n,o)=>n+o.items.length,0)}\uAC1C \uD56D\uBAA9`}))});if(R.isCancel(t))throw new E;return t}var Qe=e=>{e.command("docs [query]","\uBB38\uC11C \uB9C1\uD06C, llms.txt \uB9C1\uD06C, \uC2A4\uB2C8\uD3AB \uB9C1\uD06C\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4").option("-u, --baseUrl <baseUrl>",`\uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uAE30\uBCF8 URL (\uAE30\uBCF8\uAC12: ${G})`,{default:G}).example("seed-design docs").example("seed-design docs action-button").example("seed-design docs react").example("seed-design docs react/components").example("seed-design docs react/components/action-button").action(async(t,r)=>{let n=Date.now(),o=z(r);R.intro("seed-design docs");try{let s=ir.safeParse({query:t,...r});if(!s.success)throw s.error;let{data:i}=s,c=i.baseUrl??G,{start:a,stop:w}=R.spinner();a("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let C=await(async()=>{try{let g=await Te({baseUrl:c});return w("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC654\uC5B4\uC694."),g}catch(g){throw w("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),g}})(),{categories:$}=C,u;if(i.query){let g=nr(i.query),x=$.find(f=>f.id===g[0]);if(x&&g.length>=2){let f=x.sections.find(h=>h.id===g[1]);if(f&&g.length>=3){let h=f.items.find(d=>d.id===g[2]);if(h)u=h;else{let d=g[2].toLowerCase(),b=f.items.filter(I=>I.id.toLowerCase().includes(d)||I.title.toLowerCase().includes(d));if(b.length===0)throw new P({message:`${p(i.query)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,hint:`\`seed-design docs ${x.id}/${f.id}\`\uB85C \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694.`});b.length===1?u=b[0]:u=await fe(b)}}else if(f)u=await fe(f.items);else{let h=g[1].toLowerCase(),d=x.sections.flatMap(b=>b.items.filter(I=>I.id.toLowerCase().includes(h)||I.title.toLowerCase().includes(h)).map(I=>({item:I,sectionLabel:b.label})));if(d.length===0)throw new P({message:`${p(i.query)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,hint:`\`seed-design docs ${x.id}\`\uB85C \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694.`});if(d.length===1)u=d[0].item;else{let b=await R.select({message:`${p(g[1])}\uC5D0 \uD574\uB2F9\uD558\uB294 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`,options:d.map(({item:I,sectionLabel:U})=>({label:`[${U}] ${I.title}`,value:I,hint:I.description}))});if(R.isCancel(b))throw new E;u=b}}}else if(x)if(x.sections.length===1)u=await fe(x.sections[0].items);else{let f=await Xe(x.sections);u=await fe(f.items)}else{let f=ar($,i.query);if(f.length===0)throw new P({message:`${p(i.query)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,hint:"`seed-design docs`\uB85C \uC804\uCCB4 \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694."});if(f.length===1)u=f[0].item;else{let h=await R.select({message:`${p(i.query)}\uC5D0 \uD574\uB2F9\uD558\uB294 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`,options:f.map(({item:d,categoryLabel:b,sectionLabel:I})=>({label:`[${b} > ${I}] ${d.title}`,value:d,hint:d.description}))});if(R.isCancel(h))throw new E;u=h}}}else{let g=await cr($),x;g.sections.length===1?x=g.sections[0]:x=await Xe(g.sections),u=await fe(x.items)}or(u,c),R.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let A=Date.now()-n;try{await N.track(process.cwd(),{event:"docs",properties:{query:i.query??null,item_id:u.id,has_snippet:!!(u.snippets&&u.snippets.length>0),duration_ms:A}})}catch(g){o&&console.error("[Telemetry] docs tracking failed:",g)}}catch(s){F(s)&&(R.outro(p(s.message)),process.exit(0)),V(s,{defaultMessage:"\uBB38\uC11C \uC870\uD68C\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:o}),process.exit(1)}})};import*as O from"@clack/prompts";import{z as Ce}from"zod";import pr from"dedent";var lr=Ce.object({cwd:Ce.string(),yes:Ce.boolean().optional(),default:Ce.boolean().optional()}),Ze=e=>{e.command("init","seed-design.json \uD30C\uC77C \uC0DD\uC131").option("-c, --cwd <cwd>","\uC791\uC5C5 \uB514\uB809\uD1A0\uB9AC. \uAE30\uBCF8\uAC12\uC740 \uD604\uC7AC \uB514\uB809\uD1A0\uB9AC.",{default:process.cwd()}).option("-y, --yes","\uBAA8\uB4E0 \uC9C8\uBB38\uC5D0 \uB300\uD574 \uAE30\uBCF8\uAC12\uC73C\uB85C \uB2F5\uBCC0\uD569\uB2C8\uB2E4.").option("--default","Deprecated. --yes\uC640 \uB3D9\uC77C\uD558\uAC8C \uAE30\uBCF8\uAC12\uC73C\uB85C \uC0DD\uC131\uD569\uB2C8\uB2E4.").action(async t=>{let r=Date.now(),n=z(t);O.intro("seed-design.json \uD30C\uC77C \uC0DD\uC131");try{let o=lr.safeParse(t);if(!o.success)throw o.error;let s=o.data,i=s.yes||s.default,c=i?{...K,framework:$e(s.cwd)}:await Re(s.cwd),{start:a,stop:w}=O.spinner();a("seed-design.json \uD30C\uC77C \uC0DD\uC131\uC911...");let C=await(async()=>{try{return(await ge({cwd:s.cwd,config:c})).relativePath}catch(u){throw w("seed-design.json \uD30C\uC77C \uC0DD\uC131\uC774 \uC911\uB2E8\uB410\uC5B4\uC694."),u}})();w(`seed-design.json \uD30C\uC77C\uC774 ${p(C)}\uC5D0 \uC0DD\uC131\uB410\uC5B4\uC694.`),O.log.info(p("seed-design add {component} \uBA85\uB839\uC5B4\uB85C \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uCD94\uAC00\uD574\uBCF4\uC138\uC694!")),O.log.info(p("seed-design add \uBA85\uB839\uC5B4\uB85C \uCD94\uAC00\uD560 \uC218 \uC788\uB294 \uBAA8\uB4E0 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.")),O.note(pr(`SEED Design CLI\uB294 \uAC1C\uC120\uC744 \uC704\uD574 \uC775\uBA85 \uC0AC\uC6A9 \uB370\uC774\uD130\uB97C \uC218\uC9D1\uD574\uC694.
14
+ \uC124\uCE58\uD560 \uC758\uC874\uC131: ${m(Array.from(k).join(", ")||"\uC5C6\uC74C")}`),await ke({registryItemsToAdd:b,rootPath:I,cwd:p,baseUrl:w,framework:x,config:g,onDiff:c.onDiff});let{installed:W,filtered:P}=await Se({cwd:p,deps:Array.from(k)});W.size===0&&j.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),W.size&&(j.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${m(Array.from(W).join(", "))}`),P.size&&j.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${m(Array.from(P).join(", "))}`)),j.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let V=Date.now()-n,U=new Set(b.map(l=>l.registryId)),S=h.some(l=>{let[f,...T]=l.split(":"),_=T.join(":");return C.find(L=>L.id===f)?.items.find(L=>L.id===_)?.deprecated});try{await R.trackCommandOutcome(c.cwd,{command:"add",status:"completed",properties:{items_count:u.length,registries:Array.from(U),has_deprecated:S,dependencies_count:k.size,duration_ms:V}})}catch(l){o&&console.error("[Telemetry] add \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",l)}}catch(s){if(G(s)){try{await R.trackCommandOutcome(i,{command:"add",status:"cancelled",properties:{duration_ms:Date.now()-n}})}catch(a){o&&console.error("[Telemetry] add \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}j.outro(m(s.message)),process.exit(0)}try{await R.trackCommandFailure(i,{command:"add",error:s,properties:{duration_ms:Date.now()-n}})}catch(a){o&&console.error("[Telemetry] add \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}Q(s,{defaultMessage:"\uCD94\uAC00\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:o}),process.exit(1)}})};import*as O from"@clack/prompts";import gr from"path";import{z as ee}from"zod";var ur=ee.object({registryIds:ee.array(ee.string()).optional(),all:ee.boolean(),includeDeprecated:ee.boolean().optional(),cwd:ee.string(),baseUrl:ee.string().default(K),seedReactVersion:ee.string().optional(),framework:ee.enum(["react","lynx"]).optional(),onDiff:ee.enum(["overwrite","backup"]).optional()}),nt=e=>{e.command("add-all [...registry-ids]","add all items from registries").option("-a, --all","Add all items from all registries",{default:!1}).option("--include-deprecated","Include deprecated items when used with `--all`",{default:!1}).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",{default:process.cwd()}).option("-u, --baseUrl <baseUrl>","the base url of the registry. defaults to the current directory.",{default:K}).option("--seed-react-version <version>","\uC9C0\uC815\uD55C SEED React \uBC84\uC804\uC758 \uB808\uC9C0\uC2A4\uD2B8\uB9AC \uC0AC\uC6A9 (\uC608: 1.2)").option("-f, --framework <framework>","\uD504\uB808\uC784\uC6CC\uD06C (react \uB610\uB294 lynx)").option("--on-diff <mode>","Action when file differs: overwrite or backup").example("seed-design add-all ui --include-deprecated").example("seed-design add-all ui lib breeze").action(async(t,r)=>{let n=Date.now(),o=Y(r),i=typeof r?.cwd=="string"?r.cwd:process.cwd();O.intro("seed-design add-all");try{let s=ur.safeParse({registryIds:t,...r});if(!s.success)throw s.error;let{data:a}=s,c=a.cwd,p=Pe(a),y=p?.baseUrl??a.baseUrl,w=await $e(c),g=p?.framework??a.framework??w.framework,x=gr.resolve(c,w.path),{start:I,stop:v}=O.spinner();I("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let E=await(async()=>{try{let S=await Promise.all((await de({baseUrl:y,framework:g})).map(async({id:l})=>fe({baseUrl:y,framework:g,registryId:l})));return v("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),S}catch(S){throw v("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),S}})(),C=await(async()=>{if(a.all){let l=E.map(f=>f.id);return O.log.message(`\uBAA8\uB4E0 \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${m(l.join(", "))}`),l}if(a.registryIds?.length){let l=E.map(f=>f.id);for(let f of a.registryIds)if(!l.includes(f))throw new $({message:`\uB808\uC9C0\uC2A4\uD2B8\uB9AC '${f}'\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,details:[`\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uB808\uC9C0\uC2A4\uD2B8\uB9AC: ${l.join(", ")}`]});return O.log.message(`\uC120\uD0DD\uB41C \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${m(a.registryIds.join(", "))}`),a.registryIds}let S=await O.multiselect({message:"\uCD94\uAC00\uD560 \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694 (\uC2A4\uD398\uC774\uC2A4 \uBC14\uB85C \uC5EC\uB7EC \uAC1C \uC120\uD0DD \uAC00\uB2A5)",options:E.filter(({hideFromCLICatalog:l})=>!l).sort((l,f)=>f.items.length-l.items.length).map(l=>{let f=l.items[0]?.id,T=f?`${l.items.length}\uAC1C \uD56D\uBAA9 (${f} \uB4F1)`:`${l.items.length}\uAC1C \uD56D\uBAA9 (\uD56D\uBAA9 \uC5C6\uC74C)`;return{label:l.id,value:l.id,hint:T}})});if(O.isCancel(S))throw new D;return O.log.message(`\uC120\uD0DD\uB41C \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${m(S.join(", "))}`),S})(),h=E.filter(S=>C.includes(S.id)),u=h.flatMap(S=>S.items.filter(l=>l.deprecated?a.includeDeprecated:!0).map(l=>`${S.id}:${l.id}`)),b=h.reduce((S,l)=>S+l.items.filter(f=>f.deprecated).length,0);if(!a.includeDeprecated&&b>0&&O.log.info(`${b}\uAC1C\uC758 deprecated \uD56D\uBAA9\uC740 \uC81C\uC678\uB418\uC5C8\uC5B4\uC694. --include-deprecated \uC635\uC158\uC744 \uC0AC\uC6A9\uD558\uBA74 \uCD94\uAC00\uD560 \uC218 \uC788\uC5B4\uC694.`),!u.length)throw new D("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC5B4\uC694.");O.log.message(`\uCD1D ${m(u.length.toString())}\uAC1C\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4.`);let{registryItemsToAdd:k,npmDependenciesToAdd:z}=xe({selectedItemKeys:u,publicRegistries:E}),W=ye({publicRegistries:E,itemKeys:k.flatMap(({registryId:S,items:l})=>l.map(f=>`${S}:${f.id}`)),projectPackageVersions:ue(a.cwd,g),framework:g});he({report:W,title:"\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804\uACFC \uD638\uD658\uB418\uC9C0 \uC54A\uC744 \uC218 \uC788\uB294 \uC2A4\uB2C8\uD3AB\uC774 \uC788\uC5B4\uC694.",framework:g}),await ke({registryItemsToAdd:k,rootPath:x,cwd:c,baseUrl:y,framework:g,config:w,onDiff:a.onDiff});let{installed:P,filtered:V}=await Se({cwd:c,deps:Array.from(z)});P.size===0&&O.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),P.size&&(O.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${m(Array.from(P).join(", "))}`),V.size&&O.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${m(Array.from(V).join(", "))}`)),O.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let U=Date.now()-n;try{await R.trackCommandOutcome(a.cwd,{command:"add-all",status:"completed",properties:{registries:C,items_count:u.length,include_deprecated:a.includeDeprecated||!1,dependencies_count:z.size,duration_ms:U}})}catch(S){o&&console.error("[Telemetry] add-all \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",S)}}catch(s){if(G(s)){try{await R.trackCommandOutcome(i,{command:"add-all",status:"cancelled",properties:{duration_ms:Date.now()-n}})}catch(a){o&&console.error("[Telemetry] add-all \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}O.outro(m(s.message)),process.exit(0)}try{await R.trackCommandFailure(i,{command:"add-all",error:s,properties:{duration_ms:Date.now()-n}})}catch(a){o&&console.error("[Telemetry] add-all \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}Q(s,{defaultMessage:"\uCD94\uAC00\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:o}),process.exit(1)}})};import*as N from"@clack/prompts";import at from"path";import{z as B}from"zod";var yr=B.object({itemIds:B.array(B.string()).optional(),component:B.union([B.string(),B.array(B.string())]).optional(),all:B.boolean(),registry:B.string().optional(),cwd:B.string(),baseUrl:B.string().default(K),framework:B.enum(["react","lynx"]).optional()});function hr({itemIds:e,component:t}){let r=i=>i.trim().replace(/\s+/g,"-"),n=(e??[]).map(r).filter(Boolean),o=(Array.isArray(t)?t:[t]).filter(i=>!!i).flatMap(i=>i.split(",")).map(r).filter(Boolean);return Array.from(new Set([...n,...o]))}function wr({publicRegistries:e,targetInputs:t,defaultRegistry:r}){let n=e.filter(i=>typeof i.id=="string"&&Array.isArray(i.items)).flatMap(i=>i.items.filter(s=>typeof s.id=="string").map(s=>`${i.id}:${s.id}`)),o=new Set;for(let i of t){let s=i.includes(":")?i:r?`${r}:${i}`:(()=>{let a=n.filter(c=>c.endsWith(`:${i}`));if(!a.length)throw new $({message:`${m(i)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,hint:`${m("ui:action-button")}\uCC98\uB7FC registry\uB97C \uD3EC\uD568\uD574\uC11C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});if(a.length>1)throw new $({message:`${m(i)}: \uAC19\uC740 \uC774\uB984\uC758 \uD56D\uBAA9\uC774 \uC5EC\uB7EC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC788\uC5B4\uC694.`,details:a.map(c=>`- ${c}`),hint:`${m("ui:action-button")}\uCC98\uB7FC registry\uB97C \uD3EC\uD568\uD574\uC11C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});return a[0]})();if(!n.includes(s))throw new $({message:`${m(s)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});o.add(s)}return Array.from(o)}var ct=e=>{e.command("compat [...item-ids]","check snippet compatibility").option("-c, --component <component>","\uAC80\uC0AC\uD560 \uCEF4\uD3EC\uB10C\uD2B8. \uC5EC\uB7EC \uBC88 \uB610\uB294 \uC27C\uD45C\uB85C \uC9C0\uC815 \uAC00\uB2A5").option("-a, --all","\uBAA8\uB4E0 registry \uD56D\uBAA9\uC744 \uAC80\uC0AC",{default:!1}).option("-r, --registry <registryId>","\uCEF4\uD3EC\uB10C\uD2B8 shorthand \uC785\uB825 \uC2DC \uAE30\uBCF8 registry").option("--cwd <cwd>","the working directory. defaults to the current directory.",{default:process.cwd()}).option("-u, --baseUrl <baseUrl>","the base url of the registry. defaults to the current directory.",{default:K}).option("-f, --framework <framework>","\uD504\uB808\uC784\uC6CC\uD06C (react \uB610\uB294 lynx)").example("seed-design compat").example("seed-design compat -c action-button").example("seed-design compat ui:action-button ui:alert-dialog").example("seed-design compat --all").action(async(t,r)=>{let n=Date.now(),o=Y(r),i=typeof r?.cwd=="string"?r.cwd:process.cwd();N.intro("seed-design compat");try{let s=yr.safeParse({itemIds:t,...r});if(!s.success)throw s.error;let{data:a}=s,c=await ne(a.cwd),p=a.framework??c?.framework??"react",{start:y,stop:w}=N.spinner();y("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let g=await(async()=>{try{let u=await Promise.all((await de({baseUrl:a.baseUrl,framework:p})).map(async({id:b})=>fe({baseUrl:a.baseUrl,framework:p,registryId:b})));return w("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),u}catch(u){throw w("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),u}})(),x=hr({itemIds:a.itemIds,component:a.component}),I=a.all?g.flatMap(b=>b.items.map(k=>`${b.id}:${k.id}`)):x.length>0?wr({publicRegistries:g,targetInputs:x,defaultRegistry:a.registry}):ne(a.cwd),v=Array.isArray(I)?I:await(async()=>{let u=await I;if(!u)throw new $({message:"seed-design.json \uD30C\uC77C\uC774 \uC5C6\uC5B4 \uC124\uCE58\uB41C \uC2A4\uB2C8\uD3AB \uACBD\uB85C\uB97C \uC54C \uC218 \uC5C6\uC5B4\uC694.",hint:"`seed-design init`\uC73C\uB85C \uC124\uC815\uC744 \uB9CC\uB4E0 \uB4A4 \uC2E4\uD589\uD558\uAC70\uB098, `--all`/`-c`\uB85C \uAC80\uC0AC \uB300\uC0C1\uC744 \uC9C1\uC811 \uC9C0\uC815\uD574\uC8FC\uC138\uC694."});let b=at.resolve(a.cwd,u.path),k=ot({publicRegistries:g,rootPath:b});return k.length?k:(N.log.info(`${m(at.relative(a.cwd,b)||u.path)}\uC5D0\uC11C \uC124\uCE58\uB41C \uC2A4\uB2C8\uD3AB\uC744 \uCC3E\uC9C0 \uBABB\uD588\uC5B4\uC694.`),[])})();if(!v.length){try{await R.trackCommandOutcome(a.cwd,{command:"compat",status:"completed",result:"empty",properties:{duration_ms:Date.now()-n}})}catch(u){o&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",u)}N.outro("\uAC80\uC0AC\uD560 \uC2A4\uB2C8\uD3AB\uC774 \uC5C6\uC5B4\uC694."),process.exit(0)}let E=ue(a.cwd,p),C=ye({publicRegistries:g,itemKeys:v,projectPackageVersions:E,framework:p});if(N.log.info(`\uAC80\uC0AC \uB300\uC0C1: ${m(C.checkedItemKeys.join(", "))}`),!C.issues.length){let u=ae(p);N.outro(`\uBAA8\uB4E0 \uC2A4\uB2C8\uD3AB\uC774 \uD604\uC7AC ${u.join(", ")}\uC640 \uD638\uD658\uB3FC\uC694.`);try{await R.trackCommandOutcome(a.cwd,{command:"compat",status:"completed",result:"compatible",properties:{checked_items_count:C.checkedItemKeys.length,incompatible_items_count:0,duration_ms:Date.now()-n}})}catch(b){o&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",b)}process.exit(0)}he({report:C,title:"\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804\uACFC \uD638\uD658\uB418\uC9C0 \uC54A\uB294 \uC2A4\uB2C8\uD3AB\uC744 \uCC3E\uC558\uC5B4\uC694.",framework:p});let h=ae(p);N.log.info(`\uD544\uC694\uD55C \uBC84\uC804\uC73C\uB85C ${h.join(" \uB610\uB294 ")}\uB97C \uB9DE\uCD98 \uB4A4 \uB2E4\uC2DC \uC2E4\uD589\uD574\uBCF4\uC138\uC694.`),N.outro("\uD638\uD658\uC131 \uC774\uC288\uAC00 \uC788\uC5B4\uC694.");try{await R.trackCommandOutcome(a.cwd,{command:"compat",status:"completed",result:"incompatible",properties:{checked_items_count:C.checkedItemKeys.length,incompatible_items_count:new Set(C.issues.map(u=>u.itemKey)).size,issue_count:C.issues.length,duration_ms:Date.now()-n}})}catch(u){o&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",u)}process.exit(1)}catch(s){if(G(s)){try{await R.trackCommandOutcome(i,{command:"compat",status:"cancelled",properties:{duration_ms:Date.now()-n}})}catch(a){o&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}N.outro(m(s.message)),process.exit(0)}try{await R.trackCommandFailure(i,{command:"compat",error:s,properties:{duration_ms:Date.now()-n}})}catch(a){o&&console.error("[Telemetry] compat \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",a)}Q(s,{defaultMessage:"\uD638\uD658\uC131 \uAC80\uC0AC\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:o}),process.exit(1)}})};import*as A from"@clack/prompts";import{z as se}from"zod";var br="https://raw.githubusercontent.com/daangn/seed-design/refs/heads/dev/docs/registry",Cr=se.object({query:se.union([se.string(),se.array(se.string())]).optional().transform(e=>{let r=(Array.isArray(e)?e.join(" "):e)?.trim();return r||void 0}),baseUrl:se.string().optional(),cwd:se.string().default(process.cwd()),framework:se.enum(["react","lynx"]).optional(),raw:se.boolean()});function lt(e,t){return`${br}/${e}/${t}`}function $r(e,t){let r=`${t}${e.docUrl}`,n=`${t}/llms${e.docUrl}.txt`,o=[e.id,`- docs: ${r}`,`- llms.txt: ${n}`];if(e.snippetKey&&e.snippets&&e.snippets.length>0){let[i]=e.snippetKey.split(":");if(i)if(e.snippets.length===1)o.push(`- snippet: ${lt(i,e.snippets[0].path)}`);else{o.push("- snippet:");for(let s of e.snippets)o.push(` - ${s.label}: ${lt(i,s.path)}`)}}A.log.message(o.join(`
15
+ `))}function xr(e,t){let r=e.length,n=t.length,o=Array.from({length:r+1},(i,s)=>Array.from({length:n+1},(a,c)=>s===0?c:c===0?s:0));for(let i=1;i<=r;i++)for(let s=1;s<=n;s++)o[i][s]=Math.min(o[i-1][s]+1,o[i][s-1]+1,o[i-1][s-1]+(e[i-1]!==t[s-1]?1:0));return o[r][n]}function ce(e,t,r=3){let n=e.toLowerCase();return t.map(o=>({value:o,dist:xr(n,o.toLowerCase())})).filter(({dist:o})=>o>0&&o<=r).sort((o,i)=>o.dist-i.dist).map(({value:o})=>o)}function Ir(e,t){if(e.length===0)return;let r=[],n=t.map(s=>s.id),o=ce(e[0],n);if(o.length===0){let s=t.flatMap(p=>p.sections.flatMap(y=>y.items.map(w=>`${p.id}/${y.id}/${w.id}`))),a=e.join("/"),c=ce(a,s,5);c.length>0&&r.push(...c.slice(0,3))}else{let s=t.find(a=>a.id===o[0]);if(s&&e.length>=2){let a=s.sections.map(p=>p.id),c=ce(e[1],a);if(c.length>0){let p=s.sections.find(y=>y.id===c[0]);if(p&&e.length>=3){let y=p.items.map(g=>g.id),w=ce(e[2],y);for(let g of w.slice(0,3))r.push(`${s.id}/${p.id}/${g}`)}else for(let y of c.slice(0,3))r.push(`${s.id}/${y}`)}else{let p=s.sections.flatMap(w=>w.items.map(g=>({path:`${s.id}/${w.id}/${g.id}`,id:g.id}))),y=ce(e[1],p.map(w=>w.id));for(let w of y.slice(0,3)){let g=p.find(x=>x.id===w);g&&r.push(g.path)}}}else for(let a of o.slice(0,3))r.push(a)}if(r.length===0)return;let i=["","\u{1F4A1} \uC774\uAC83\uC744 \uC758\uBBF8\uD588\uB098\uC694?"];for(let s of r)i.push(` - ${s}`);return i.join(`
16
+ `)}function pt(e){return e.split(/[\/\s]+/).map(t=>t.trim()).filter(Boolean)}function kr(e){let[,t]=e.split(":");return t??e}function Pr({query:e,framework:t,categoryIds:r}){if(!e)return;let n=pt(e).map(kr);if(!n.length)return;let[o]=n;return!r.includes(o)&&t&&r.includes(t)?[t,...n].join("/"):n.join("/")}function Sr(e,t){let r=t.toLowerCase();return e.flatMap(n=>n.sections.flatMap(o=>o.items.filter(i=>i.id.toLowerCase().includes(r)||i.title.toLowerCase().includes(r)).map(i=>({item:i,categoryLabel:n.label,sectionLabel:o.label}))))}async function we(e){let t=await A.select({message:"\uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(r=>({label:`${r.deprecated?"(deprecated) ":""}${r.title}`,value:r,hint:r.description}))});if(A.isCancel(t))throw new D;return t}async function mt(e){let t=await A.select({message:"\uC139\uC158\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(r=>({label:r.label,value:r,hint:`${r.items.length}\uAC1C \uD56D\uBAA9`}))});if(A.isCancel(t))throw new D;return t}async function Er(e){let t=await A.select({message:"\uCE74\uD14C\uACE0\uB9AC\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(r=>({label:r.label,value:r,hint:`${r.sections.reduce((n,o)=>n+o.items.length,0)}\uAC1C \uD56D\uBAA9`}))});if(A.isCancel(t))throw new D;return t}var dt=e=>{e.command("docs [...query]","\uBB38\uC11C \uB9C1\uD06C, llms.txt \uB9C1\uD06C, \uC2A4\uB2C8\uD3AB \uB9C1\uD06C\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4").option("-u, --baseUrl <baseUrl>",`\uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uAE30\uBCF8 URL (\uAE30\uBCF8\uAC12: ${K})`,{default:K}).option("--cwd <cwd>","the working directory. defaults to the current directory.",{default:process.cwd()}).option("-f, --framework <framework>","\uD504\uB808\uC784\uC6CC\uD06C (react \uB610\uB294 lynx)").option("--raw","llms.txt \uB0B4\uC6A9\uC744 \uC9C1\uC811 \uAC00\uC838\uC640 \uCD9C\uB825\uD569\uB2C8\uB2E4. LLM \uD30C\uC774\uD504\uC5D0 \uC720\uC6A9\uD569\uB2C8\uB2E4.",{default:!1}).example("seed-design docs").example("seed-design docs action-button").example("seed-design docs react").example("seed-design docs lynx action-button").example("seed-design docs react/components").example("seed-design docs react/components/action-button").example("seed-design docs react/updates/changelog --raw").action(async(t,r)=>{let n=Date.now(),o=Y(r),i=r.raw??!1,s=process.cwd();i||A.intro("seed-design docs");try{let a=Cr.safeParse({query:t,...r});if(!a.success)throw a.error;let{data:c}=a;s=c.cwd;let p=c.baseUrl??K,y=await ne(c.cwd).catch(()=>null),w=c.framework??y?.framework;if(c.raw&&!c.query)throw new $({message:"--raw \uBAA8\uB4DC\uC5D0\uC11C\uB294 \uCFFC\uB9AC\uAC00 \uD544\uC694\uD574\uC694.",hint:"\uC608: `seed-design docs react/updates/changelog --raw`"});let g=await(async()=>{if(i)return await je({baseUrl:p});let{start:h,stop:u}=A.spinner();h("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");try{let b=await je({baseUrl:p});return u("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC654\uC5B4\uC694."),b}catch(b){throw u("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),b}})(),{categories:x}=g,I=Pr({query:c.query,framework:w,categoryIds:x.map(h=>h.id)}),v,E=async()=>{if(I){let b=pt(I);if(i&&b.length>3)return;let k=x.find(P=>P.id===b[0]);if(k&&b.length>=2){let P=k.sections.find(l=>l.id===b[1]);if(P&&b.length>=3){let l=P.items.find(_=>_.id===b[2]);if(l)return l;let f=b[2].toLowerCase(),T=P.items.filter(_=>_.id.toLowerCase().includes(f)||_.title.toLowerCase().includes(f));if(T.length===0){let _=ce(b[2],P.items.map(M=>M.id)),L=_.length>0?`
17
+
18
+ \u{1F4A1} \uC774\uAC83\uC744 \uC758\uBBF8\uD588\uB098\uC694?
19
+ ${_.slice(0,3).map(M=>` - ${k.id}/${P.id}/${M}`).join(`
20
+ `)}`:"";throw new $({message:`${m(I)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.${L}`,hint:`\`seed-design docs ${k.id}/${P.id}\`\uB85C \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694.`})}return T.length===1?T[0]:await we(T)}if(P)return await we(P.items);let V=b[1].toLowerCase(),U=k.sections.flatMap(l=>l.items.filter(f=>f.id.toLowerCase().includes(V)||f.title.toLowerCase().includes(V)).map(f=>({item:f,sectionLabel:l.label})));if(U.length===0){let l=k.sections.map(F=>F.id),f=ce(b[1],l),T=k.sections.flatMap(F=>F.items.map(be=>({path:`${k.id}/${F.id}/${be.id}`,id:be.id}))),_=ce(b[1],T.map(F=>F.id)),L=[...f.slice(0,2).map(F=>`${k.id}/${F}`),..._.slice(0,2).map(F=>T.find(be=>be.id===F)?.path).filter(F=>F!=null)],M=L.length>0?`
21
+
22
+ \u{1F4A1} \uC774\uAC83\uC744 \uC758\uBBF8\uD588\uB098\uC694?
23
+ ${L.map(F=>` - ${F}`).join(`
24
+ `)}`:"";throw new $({message:`${m(I)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.${M}`,hint:`\`seed-design docs ${k.id}\`\uB85C \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694.`})}if(U.length===1)return U[0].item;let S=await A.select({message:`${m(b[1])}\uC5D0 \uD574\uB2F9\uD558\uB294 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`,options:U.map(({item:l,sectionLabel:f})=>({label:`[${f}] ${l.title}`,value:l,hint:l.description}))});if(A.isCancel(S))throw new D;return S}if(k){if(k.sections.length===1)return await we(k.sections[0].items);let P=await mt(k.sections);return await we(P.items)}let z=Sr(x,I);if(z.length===0){let P=Ir(b,x);throw new $({message:`${m(I)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.${P??""}`,hint:"`seed-design docs`\uB85C \uC804\uCCB4 \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694."})}if(z.length===1)return z[0].item;let W=await A.select({message:`${m(I)}\uC5D0 \uD574\uB2F9\uD558\uB294 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`,options:z.map(({item:P,categoryLabel:V,sectionLabel:U})=>({label:`[${V} > ${U}] ${P.title}`,value:P,hint:P.description}))});if(A.isCancel(W))throw new D;return W}let h=await Er(x),u;return h.sections.length===1?u=h.sections[0]:u=await mt(h.sections),await we(u.items)};if(i)try{v=await E()}catch(h){if(G(h))throw h}else v=await E();if(i){let h;if(v){let u=`${p}/llms${v.docUrl}.txt`;h=await Ke({url:u})}else h=await Ne({baseUrl:p,query:I});console.log(h)}else $r(v,p),A.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let C=Date.now()-n;try{await R.trackCommandOutcome(s,{command:"docs",status:"completed",properties:{query:c.query??null,item_id:v?.id??c.query??null,has_snippet:!!(v?.snippets&&v.snippets.length>0),raw_mode:i,duration_ms:C}})}catch(h){o&&console.error("[Telemetry] docs \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",h)}}catch(a){if(G(a)){try{await R.trackCommandOutcome(s,{command:"docs",status:"cancelled",properties:{raw_mode:i,duration_ms:Date.now()-n}})}catch(c){o&&console.error("[Telemetry] docs \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",c)}i||A.outro(m(a.message)),process.exit(0)}try{await R.trackCommandFailure(s,{command:"docs",error:a,properties:{raw_mode:i,duration_ms:Date.now()-n}})}catch(c){o&&console.error("[Telemetry] docs \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",c)}if(i){let c=a instanceof Error?a.message:String(a);console.error(c),process.exit(1)}Q(a,{defaultMessage:"\uBB38\uC11C \uC870\uD68C\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:o}),process.exit(1)}})};import*as q from"@clack/prompts";import{z as Ee}from"zod";import Rr from"dedent";var vr=Ee.object({cwd:Ee.string(),yes:Ee.boolean().optional(),default:Ee.boolean().optional()}),ft=e=>{e.command("init","seed-design.json \uD30C\uC77C \uC0DD\uC131").option("-c, --cwd <cwd>","\uC791\uC5C5 \uB514\uB809\uD1A0\uB9AC. \uAE30\uBCF8\uAC12\uC740 \uD604\uC7AC \uB514\uB809\uD1A0\uB9AC.",{default:process.cwd()}).option("-y, --yes","\uBAA8\uB4E0 \uC9C8\uBB38\uC5D0 \uB300\uD574 \uAE30\uBCF8\uAC12\uC73C\uB85C \uB2F5\uBCC0\uD569\uB2C8\uB2E4.").option("--default","Deprecated. --yes\uC640 \uB3D9\uC77C\uD558\uAC8C \uAE30\uBCF8\uAC12\uC73C\uB85C \uC0DD\uC131\uD569\uB2C8\uB2E4.").action(async t=>{let r=Date.now(),n=Y(t),o=typeof t?.cwd=="string"?t.cwd:process.cwd();q.intro("seed-design.json \uD30C\uC77C \uC0DD\uC131");try{let i=vr.safeParse(t);if(!i.success)throw i.error;let s=i.data,a=s.yes||s.default,c=a?{...H,framework:Re(s.cwd)}:await De(s.cwd),{start:p,stop:y}=q.spinner();p("seed-design.json \uD30C\uC77C \uC0DD\uC131\uC911...");let w=await(async()=>{try{return(await Ce({cwd:s.cwd,config:c})).relativePath}catch(x){throw y("seed-design.json \uD30C\uC77C \uC0DD\uC131\uC774 \uC911\uB2E8\uB410\uC5B4\uC694."),x}})();y(`seed-design.json \uD30C\uC77C\uC774 ${m(w)}\uC5D0 \uC0DD\uC131\uB410\uC5B4\uC694.`),q.log.info(m("seed-design add {component} \uBA85\uB839\uC5B4\uB85C \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uCD94\uAC00\uD574\uBCF4\uC138\uC694!")),q.log.info(m("seed-design add \uBA85\uB839\uC5B4\uB85C \uCD94\uAC00\uD560 \uC218 \uC788\uB294 \uBAA8\uB4E0 \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.")),q.note(Rr(`SEED Design CLI\uB294 \uAC1C\uC120\uC744 \uC704\uD574 \uC775\uBA85 \uC0AC\uC6A9 \uB370\uC774\uD130\uB97C \uC218\uC9D1\uD574\uC694.
12
25
 
13
26
  \uBE44\uD65C\uC131\uD654\uD558\uB824\uBA74:
14
- \u2022 seed-design.json\uC5D0\uC11C ${p('"telemetry": false')}\uB85C \uC124\uC815
15
- \u2022 ${p("DISABLE_TELEMETRY=true")} \uD658\uACBD \uBCC0\uC218 \uC124\uC815
27
+ \u2022 seed-design.json\uC5D0\uC11C ${m('"telemetry": false')}\uB85C \uC124\uC815
28
+ \u2022 ${m("DISABLE_TELEMETRY=true")} \uD658\uACBD \uBCC0\uC218 \uC124\uC815
16
29
 
17
- \uC790\uC138\uD55C \uB0B4\uC6A9: https://seed-design.com/react/getting-started/cli/configuration#telemetry`),"Telemetry \uC548\uB0B4"),O.outro("\uC791\uC5C5\uC774 \uC644\uB8CC\uB410\uC5B4\uC694.");let $=Date.now()-r;try{await N.track(s.cwd,{event:"init",properties:{tsx:c.tsx,rsc:c.rsc,telemetry:c.telemetry,yes_option:i,duration_ms:$}})}catch(u){n&&console.error("[Telemetry] init tracking failed:",u)}}catch(o){F(o)&&(O.outro(p(o.message)),process.exit(0)),V(o,{defaultMessage:"seed-design.json \uD30C\uC77C \uC0DD\uC131\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:n}),process.exit(1)}})};import{cac as mr}from"cac";var dr="seed-design",X=mr(dr);async function fr(){let e=Q();X.option("--verbose","\uC624\uB958 \uC0C1\uC138 \uC815\uBCF4\uB97C \uCD9C\uB825\uD569\uB2C8\uB2E4."),Ge(X),He(X),We(X),Qe(X),Ze(X),X.version(e.version||"1.0.0","-v, --version"),X.help(),X.parse()}fr();
30
+ \uC790\uC138\uD55C \uB0B4\uC6A9: https://seed-design.com/react/getting-started/cli/configuration#telemetry`),"Telemetry \uC548\uB0B4"),q.outro("\uC791\uC5C5\uC774 \uC644\uB8CC\uB410\uC5B4\uC694.");let g=Date.now()-r;try{await R.trackCommandOutcome(s.cwd,{command:"init",status:"completed",properties:{tsx:c.tsx,rsc:c.rsc,telemetry:c.telemetry,yes_option:a,duration_ms:g}})}catch(x){n&&console.error("[Telemetry] init \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",x)}}catch(i){if(G(i)){try{await R.trackCommandOutcome(o,{command:"init",status:"cancelled",properties:{duration_ms:Date.now()-r}})}catch(s){n&&console.error("[Telemetry] init \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",s)}q.outro(m(i.message)),process.exit(0)}try{await R.trackCommandFailure(o,{command:"init",error:i,properties:{duration_ms:Date.now()-r}})}catch(s){n&&console.error("[Telemetry] init \uC774\uBCA4\uD2B8 \uC804\uC1A1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694:",s)}Q(i,{defaultMessage:"seed-design.json \uD30C\uC77C \uC0DD\uC131\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694.",defaultHint:"`--verbose` \uC635\uC158\uC73C\uB85C \uC0C1\uC138 \uC624\uB958\uB97C \uD655\uC778\uD574\uBCF4\uC138\uC694.",verbose:n}),process.exit(1)}})};import{cac as Tr}from"cac";var _r="seed-design",oe=Tr(_r);async function jr(){let e=ie();oe.option("--verbose","\uC624\uB958 \uC0C1\uC138 \uC815\uBCF4\uB97C \uCD9C\uB825\uD569\uB2C8\uB2E4."),it(oe),nt(oe),ct(oe),dt(oe),ft(oe),oe.version(e.version||"1.0.0","-v, --version"),oe.help(),oe.parse()}jr();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seed-design/cli",
3
- "version": "1.4.0-alpha.0",
3
+ "version": "1.5.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -16,7 +16,7 @@
16
16
  "src"
17
17
  ],
18
18
  "engines": {
19
- "node": ">=18"
19
+ "node": ">=20.19.0"
20
20
  },
21
21
  "scripts": {
22
22
  "build": "ENV=prod bun ./build.mjs",
@@ -30,7 +30,7 @@
30
30
  "@babel/plugin-transform-typescript": "^7.27.0",
31
31
  "@clack/prompts": "^1.0.0",
32
32
  "@npmcli/disparity-colors": "^3.0.1",
33
- "cac": "^6.7.14",
33
+ "cac": "^7.0.0",
34
34
  "cosmiconfig": "^9.0.0",
35
35
  "dedent": "^1.7.0",
36
36
  "diff": "^8.0.3",
@@ -45,11 +45,13 @@
45
45
  },
46
46
  "devDependencies": {
47
47
  "@types/babel__core": "^7.20.5",
48
+ "@types/findup-sync": "^4.0.5",
48
49
  "@types/fs-extra": "^11.0.4",
50
+ "@types/node": "^25.0.0",
49
51
  "dotenv": "^17.2.3",
50
52
  "esbuild": "^0.27.0",
51
53
  "type-fest": "^5.0.0",
52
- "typescript": "^5.9.2"
54
+ "typescript": "^6.0.0"
53
55
  },
54
56
  "publishConfig": {
55
57
  "access": "public"
@@ -10,6 +10,7 @@ import type { CAC } from "cac";
10
10
  import { BASE_URL } from "../constants";
11
11
  import { analytics } from "../utils/analytics";
12
12
  import { highlight } from "../utils/color";
13
+ import { resolveSeedVersion } from "../utils/registry-source";
13
14
  import {
14
15
  analyzeRegistryItemCompatibility,
15
16
  getProjectSeedPackageVersionSpecs,
@@ -29,7 +30,8 @@ const addAllOptionsSchema = z.object({
29
30
  all: z.boolean(),
30
31
  includeDeprecated: z.boolean().optional(),
31
32
  cwd: z.string(),
32
- baseUrl: z.string().optional(),
33
+ baseUrl: z.string().default(BASE_URL),
34
+ seedReactVersion: z.string().optional(),
33
35
  framework: z.enum(["react", "lynx"]).optional(),
34
36
  onDiff: z.enum(["overwrite", "backup"]).optional(),
35
37
  });
@@ -51,6 +53,7 @@ export const addAllCommand = (cli: CAC) => {
51
53
  "the base url of the registry. defaults to the current directory.",
52
54
  { default: BASE_URL },
53
55
  )
56
+ .option("--seed-react-version <version>", "지정한 SEED React 버전의 레지스트리 사용 (예: 1.2)")
54
57
  .option("-f, --framework <framework>", "프레임워크 (react 또는 lynx)")
55
58
  .option("--on-diff <mode>", "Action when file differs: overwrite or backup")
56
59
  .example("seed-design add-all ui --include-deprecated")
@@ -58,6 +61,7 @@ export const addAllCommand = (cli: CAC) => {
58
61
  .action(async (registryIds, opts) => {
59
62
  const startTime = Date.now();
60
63
  const verbose = isVerboseMode(opts);
64
+ const trackCwd = typeof opts?.cwd === "string" ? opts.cwd : process.cwd();
61
65
  p.intro("seed-design add-all");
62
66
 
63
67
  try {
@@ -69,9 +73,10 @@ export const addAllCommand = (cli: CAC) => {
69
73
  const { data: options } = parsed;
70
74
 
71
75
  const cwd = options.cwd;
72
- const baseUrl = options.baseUrl;
76
+ const versionSource = resolveSeedVersion(options);
77
+ const baseUrl = versionSource?.baseUrl ?? options.baseUrl;
73
78
  const config = await getConfig(cwd);
74
- const framework = options.framework ?? config.framework;
79
+ const framework = versionSource?.framework ?? options.framework ?? config.framework;
75
80
  const rootPath = path.resolve(cwd, config.path);
76
81
 
77
82
  const { start, stop } = p.spinner();
@@ -233,8 +238,9 @@ export const addAllCommand = (cli: CAC) => {
233
238
  // add-all 성공 이벤트 추적
234
239
  const duration = Date.now() - startTime;
235
240
  try {
236
- await analytics.track(options.cwd, {
237
- event: "add-all",
241
+ await analytics.trackCommandOutcome(options.cwd, {
242
+ command: "add-all",
243
+ status: "completed",
238
244
  properties: {
239
245
  registries: selectedRegistryIds,
240
246
  items_count: itemKeys.length,
@@ -245,15 +251,42 @@ export const addAllCommand = (cli: CAC) => {
245
251
  });
246
252
  } catch (telemetryError) {
247
253
  if (verbose) {
248
- console.error("[Telemetry] add-all tracking failed:", telemetryError);
254
+ console.error("[Telemetry] add-all 이벤트 전송에 실패했어요:", telemetryError);
249
255
  }
250
256
  }
251
257
  } catch (error) {
252
258
  if (isCliCancelError(error)) {
259
+ try {
260
+ await analytics.trackCommandOutcome(trackCwd, {
261
+ command: "add-all",
262
+ status: "cancelled",
263
+ properties: {
264
+ duration_ms: Date.now() - startTime,
265
+ },
266
+ });
267
+ } catch (telemetryError) {
268
+ if (verbose) {
269
+ console.error("[Telemetry] add-all 이벤트 전송에 실패했어요:", telemetryError);
270
+ }
271
+ }
253
272
  p.outro(highlight(error.message));
254
273
  process.exit(0);
255
274
  }
256
275
 
276
+ try {
277
+ await analytics.trackCommandFailure(trackCwd, {
278
+ command: "add-all",
279
+ error,
280
+ properties: {
281
+ duration_ms: Date.now() - startTime,
282
+ },
283
+ });
284
+ } catch (telemetryError) {
285
+ if (verbose) {
286
+ console.error("[Telemetry] add-all 이벤트 전송에 실패했어요:", telemetryError);
287
+ }
288
+ }
289
+
257
290
  handleCliError(error, {
258
291
  defaultMessage: "추가에 실패했어요.",
259
292
  defaultHint: "`--verbose` 옵션으로 상세 오류를 확인해보세요.",
@@ -9,6 +9,7 @@ import { z } from "zod";
9
9
  import type { CAC } from "cac";
10
10
  import { BASE_URL } from "../constants";
11
11
  import { highlight } from "../utils/color";
12
+ import { resolveSeedVersion } from "../utils/registry-source";
12
13
  import { installDependencies } from "../utils/install";
13
14
  import { analytics } from "../utils/analytics";
14
15
  import {
@@ -31,7 +32,8 @@ const addOptionsSchema = z.object({
31
32
  */
32
33
  all: z.boolean(),
33
34
  cwd: z.string(),
34
- baseUrl: z.string().optional(),
35
+ baseUrl: z.string().default(BASE_URL),
36
+ seedReactVersion: z.string().optional(),
35
37
  framework: z.enum(["react", "lynx"]).optional(),
36
38
  onDiff: z.enum(["overwrite", "backup"]).optional(),
37
39
  });
@@ -50,6 +52,7 @@ export const addCommand = (cli: CAC) => {
50
52
  "the base url of the registry. defaults to the current directory.",
51
53
  { default: BASE_URL },
52
54
  )
55
+ .option("--seed-react-version <version>", "지정한 SEED React 버전의 레지스트리 사용 (예: 1.2)")
53
56
  .option("-f, --framework <framework>", "프레임워크 (react 또는 lynx)")
54
57
  .option("--on-diff <mode>", "Action when file differs: overwrite or backup")
55
58
  .example("seed-design add ui:action-button")
@@ -57,6 +60,7 @@ export const addCommand = (cli: CAC) => {
57
60
  .action(async (itemIds, opts) => {
58
61
  const startTime = Date.now();
59
62
  const verbose = isVerboseMode(opts);
63
+ const trackCwd = typeof opts?.cwd === "string" ? opts.cwd : process.cwd();
60
64
  p.intro("seed-design add");
61
65
 
62
66
  try {
@@ -77,9 +81,10 @@ export const addCommand = (cli: CAC) => {
77
81
  }
78
82
 
79
83
  const cwd = options.cwd;
80
- const baseUrl = options.baseUrl;
84
+ const versionSource = resolveSeedVersion(options);
85
+ const baseUrl = versionSource?.baseUrl ?? options.baseUrl;
81
86
  const config = await getConfig(cwd);
82
- const framework = options.framework ?? config.framework;
87
+ const framework = versionSource?.framework ?? options.framework ?? config.framework;
83
88
  const rootPath = path.resolve(cwd, config.path);
84
89
 
85
90
  const { start, stop } = p.spinner();
@@ -254,8 +259,9 @@ export const addCommand = (cli: CAC) => {
254
259
  });
255
260
 
256
261
  try {
257
- await analytics.track(options.cwd, {
258
- event: "add",
262
+ await analytics.trackCommandOutcome(options.cwd, {
263
+ command: "add",
264
+ status: "completed",
259
265
  properties: {
260
266
  items_count: filteredItemKeys.length,
261
267
  registries: Array.from(uniqueRegistries),
@@ -266,15 +272,42 @@ export const addCommand = (cli: CAC) => {
266
272
  });
267
273
  } catch (telemetryError) {
268
274
  if (verbose) {
269
- console.error("[Telemetry] add tracking failed:", telemetryError);
275
+ console.error("[Telemetry] add 이벤트 전송에 실패했어요:", telemetryError);
270
276
  }
271
277
  }
272
278
  } catch (error) {
273
279
  if (isCliCancelError(error)) {
280
+ try {
281
+ await analytics.trackCommandOutcome(trackCwd, {
282
+ command: "add",
283
+ status: "cancelled",
284
+ properties: {
285
+ duration_ms: Date.now() - startTime,
286
+ },
287
+ });
288
+ } catch (telemetryError) {
289
+ if (verbose) {
290
+ console.error("[Telemetry] add 이벤트 전송에 실패했어요:", telemetryError);
291
+ }
292
+ }
274
293
  p.outro(highlight(error.message));
275
294
  process.exit(0);
276
295
  }
277
296
 
297
+ try {
298
+ await analytics.trackCommandFailure(trackCwd, {
299
+ command: "add",
300
+ error,
301
+ properties: {
302
+ duration_ms: Date.now() - startTime,
303
+ },
304
+ });
305
+ } catch (telemetryError) {
306
+ if (verbose) {
307
+ console.error("[Telemetry] add 이벤트 전송에 실패했어요:", telemetryError);
308
+ }
309
+ }
310
+
278
311
  handleCliError(error, {
279
312
  defaultMessage: "추가에 실패했어요.",
280
313
  defaultHint: "`--verbose` 옵션으로 상세 오류를 확인해보세요.",