@seed-design/cli 1.3.1 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/index.mjs CHANGED
@@ -1,30 +1,30 @@
1
1
  #!/usr/bin/env node
2
- import*as se from"@clack/prompts";import{cosmiconfig as ut}from"cosmiconfig";import{z as oe}from"zod";import*as Y from"@clack/prompts";import{ZodError as dt}from"zod";import lt from"picocolors";var a=e=>lt.cyan(e);var I=class extends Error{hint;details;constructor({message:t,hint:s,details:n=[],cause:o}){super(t,{cause:o}),this.name="CliError",this.hint=s,this.details=n}},E=class extends Error{constructor(t="\uC791\uC5C5\uC774 \uCDE8\uC18C\uB410\uC5B4\uC694."){super(t),this.name="CliCancelError"}};function L(e){return e instanceof E}function K(e){return!e||typeof e!="object"||!("verbose"in e)?!1:e.verbose===!0}function mt(e,t){if(e instanceof I)return{reason:e.message,hint:e.hint??t,details:e.details,stack:gt(e.cause??e)};if(e instanceof dt){let s=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:s,stack:e.stack}}if(e instanceof Error){let s=e,n=[];return(s.escapedCommand||s.command)&&n.push(`\uC2E4\uD589 \uBA85\uB839\uC5B4: ${s.escapedCommand??s.command}`),typeof s.exitCode=="number"&&n.push(`\uC885\uB8CC \uCF54\uB4DC: ${s.exitCode}`),s.stderr?.trim()?n.push(`stderr: ${s.stderr.trim()}`):s.stdout?.trim()&&n.push(`stdout: ${s.stdout.trim()}`),{reason:s.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 gt(e){if(e instanceof Error)return e.stack}function O(e,{defaultMessage:t,defaultHint:s,verbose:n=!1}){let o=mt(e,s);Y.log.error(t),Y.log.error(`\uC6D0\uC778: ${o.reason}`);for(let r of o.details)Y.log.info(r);o.hint&&Y.log.info(`\uD574\uACB0 \uD78C\uD2B8: ${o.hint}`),n&&o.stack&&(Y.log.message(a(`
3
- [verbose] stack trace`)),Y.log.message(o.stack)),Y.outro(a("\uC791\uC5C5\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694."))}import*as Q from"@clack/prompts";import ft from"fs-extra";import je from"path";var q={rsc:!1,tsx:!0,path:"./seed-design",telemetry:!0};async function Te(){return await Q.group({tsx:()=>Q.confirm({message:`${a("TypeScript")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:q.tsx}),rsc:()=>Q.confirm({message:`${a("React Server Components")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:q.rsc}),path:()=>Q.text({message:`${a("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:q.path,defaultValue:q.path,placeholder:q.path}),telemetry:()=>Q.confirm({message:`\uAC1C\uC120\uC744 \uC704\uD574 ${a("\uC775\uBA85 \uC0AC\uC6A9 \uB370\uC774\uD130")}\uB97C \uC218\uC9D1\uD560\uAE4C\uC694?`,initialValue:q.telemetry})},{onCancel:()=>{throw new E}})}async function he({cwd:e,config:t}){let s=je.resolve(e,"seed-design.json");return await ft.writeFile(s,`${JSON.stringify(t,null,2)}
4
- `,"utf-8"),{relativePath:je.relative(process.cwd(),s),targetPath:s}}var De="seed-design",ht=ut(De,{searchPlaces:[`${De}.json`]}),Ae=oe.object({$schema:oe.string().optional(),rsc:oe.coerce.boolean().default(!1),tsx:oe.coerce.boolean().default(!0),path:oe.string(),telemetry:oe.coerce.boolean().optional().default(!0)}).strict();async function ye(e){let t=await ge(e);if(t)return t;se.log.error("\uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8 \uACBD\uB85C\uC5D0 `seed-design.json` \uD30C\uC77C\uC774 \uC5C6\uC5B4\uC694.");let s=await se.confirm({message:"seed-design.json \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uC2DC\uACA0\uC5B4\uC694?"});if(se.isCancel(s)||!s)throw new E;try{return await he({cwd:e,config:q}),se.log.message("seed-design.json \uD30C\uC77C\uC774 \uC0DD\uC131\uB410\uC5B4\uC694."),Ae.parse(q)}catch(n){throw new I({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 ge(e){let t=await ht.search(e);if(!t||t.isEmpty)return null;try{return Ae.parse(t.config)}catch(s){throw new I({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:s})}}function we({selectedItemKeys:e,publicRegistries:t}){let s=[],n=new Set;function o(r,i){let c=s.find(m=>m.registryId===r);if(!c?.items.some(m=>m.id===i.id)){if(c?c.items.push(i):s.push({registryId:r,items:[i]}),i.dependencies?.length)for(let m of i.dependencies)n.add(m);if(i.innerDependencies?.length)for(let m of i.innerDependencies)for(let p of m.itemIds){let y=t.find(h=>h.id===m.registryId)?.items.find(h=>h.id===p);if(!y)throw new Error(`Cannot find dependency item: ${m.registryId}:${p}`);o(m.registryId,y)}}}for(let r of e){let[i,...c]=r.split(":"),m=c.join(":");if(!i||!m)throw new Error(`Invalid snippet format: "${r}"`);let p=t.find(y=>y.id===i)?.items.find(y=>y.id===m);if(!p)throw new Error(`Cannot find snippet: "${r}"`);o(i,p)}return{registryItemsToAdd:s,npmDependenciesToAdd:n}}import*as Ee from"@clack/prompts";import{z as u}from"zod";var Se=u.object({id:u.string(),description:u.string().optional(),deprecated:u.boolean().optional(),hideFromCLICatalog:u.boolean().optional(),dependencies:u.array(u.string()).optional(),innerDependencies:u.array(u.object({registryId:u.string(),itemIds:u.array(u.string())})).optional(),snippets:u.array(u.object({path:u.string(),dependencies:u.record(u.string(),u.string()).optional(),content:u.string()}))}),Re=u.object({id:u.string(),hideFromCLICatalog:u.boolean().optional(),items:u.array(Se.omit({snippets:!0}).extend({snippets:u.array(u.object({path:u.string(),dependencies:u.record(u.string(),u.string()).optional()}))}))}),_e=u.array(u.object({id:u.string()})),yt=u.object({label:u.string(),path:u.string()}),wt=u.object({id:u.string(),title:u.string(),description:u.string().optional(),docUrl:u.string(),deprecated:u.boolean().optional(),snippetKey:u.string().optional(),snippets:u.array(yt).optional()}),bt=u.object({id:u.string(),label:u.string(),items:u.array(wt)}),$t=u.object({id:u.string(),label:u.string(),sections:u.array(bt)}),Oe=u.object({categories:u.array($t)});var Ct=1e4;async function Ue(e,t=Ct){let s=new AbortController,n=setTimeout(()=>s.abort(),t);try{return await fetch(e,{signal:s.signal})}catch(o){throw o instanceof Error&&o.name==="AbortError"?new I({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 Me({baseUrl:e}){let t=await fetch(`${e}/__docs__/index.json`);if(!t.ok)throw new I({message:`\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694: ${t.status} ${t.statusText}`});let s=await t.json(),{success:n,data:o,error:r}=Oe.safeParse(s);if(!n)throw new I({message:`\uBB38\uC11C \uBAA9\uB85D \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694: ${r?.message}`});return o}async function ne({baseUrl:e}){let t=await fetch(`${e}/__registry__/index.json`);if(!t.ok)throw new Error(`Failed to fetch registries: ${t.status} ${t.statusText}`);let s=await t.json(),{success:n,data:o,error:r}=_e.safeParse(s);if(!n)throw new Error(`Failed to parse registries: ${r?.message}`);return o}async function ae({baseUrl:e,registryId:t}){let s=await fetch(`${e}/__registry__/${t}/index.json`);if(!s.ok)throw new Error(`Failed to fetch ${t} registry: ${s.status} ${s.statusText}`);let n=await s.json(),{success:o,data:r,error:i}=Re.safeParse(n);if(!o)throw new Error(`Failed to parse ${t} registry: ${i?.message}`);return r}async function It({baseUrl:e,registryId:t,registryItemId:s}){let n=await fetch(`${e}/__registry__/${t}/${s}.json`);if(!n.ok)throw new Error(`Failed to fetch ${s}: ${n.status} ${n.statusText}`);let o=await n.json(),{success:r,data:i,error:c}=Se.safeParse(o);if(!r)throw new Error(`Failed to parse ${s}: ${c?.message}`);return i}async function Ve(e){let t=await Ue(`https://registry.npmjs.org/${e}/latest`);if(!t.ok)throw new I({message:`${e}\uC758 \uCD5C\uC2E0 \uBC84\uC804\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694: ${t.status} ${t.statusText}`});let s=await t.json();if(!s||typeof s!="object"||typeof s.version!="string")throw new I({message:`${e} \uCD5C\uC2E0 \uBC84\uC804 \uC751\uB2F5 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC544\uC694.`});return s.version}async function Le({baseUrl:e,packageSlug:t,version:s}){let n=`${e}/llms/react/updates/changelog/${t}/${encodeURIComponent(s)}.txt`,o=await Ue(n);if(!o.ok)throw new I({message:`\uBCC0\uACBD\uC0AC\uD56D\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694: ${o.status} ${o.statusText}`,hint:`${n} \uC5D0 \uC811\uADFC\uD560 \uC218 \uC788\uB294\uC9C0 \uD655\uC778\uD574\uC8FC\uC138\uC694.`});return o.text()}async function Ke({baseUrl:e,registryId:t,registryItemIds:s}){return await Promise.all(s.map(async n=>{try{return await It({baseUrl:e,registryId:t,registryItemId:n})}catch(o){let r=await fetch(`${e}/__registry__/${t}/index.json`);if(!r.ok)throw new Error(`${t} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694: ${r.status} ${r.statusText}`);let i=await r.json(),{success:c,data:m}=Re.safeParse(i);throw c?(Ee.log.error(`${n} \uC2A4\uB2C8\uD3AB\uC774 ${t} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC5C6\uC5B4\uC694.`),Ee.log.info(`${t} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC874\uC7AC\uD558\uB294 \uC2A4\uB2C8\uD3AB:
5
- ${m.items.map(p=>p.id).join(`
6
- `)}`),o):new Error(`Failed to parse registry index for ${t}`)}}))}import{promises as Et}from"fs";import{tmpdir as vt}from"os";import Fe from"path";import{transformFromAstSync as xt}from"@babel/core";import Pt from"@babel/plugin-transform-typescript";import*as be from"recast";import{parse as kt}from"@babel/parser";var St={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"]},Ne=async({sourceFile:e,config:t})=>{let s=e.getFullText();if(t.tsx)return s;let n=be.parse(s,{parser:{parse:r=>kt(r,St)}}),o=xt(n,s,{cloneInputAst:!1,code:!1,ast:!0,plugins:[Pt],configFile:!1});if(!o||!o.ast)throw new Error("Failed to transform JSX");return be.print(o.ast).code};import{SyntaxKind as Rt}from"ts-morph";var ze=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let s=e.getFirstChildByKind(Rt.ExpressionStatement);if(!s)return e;let n=s.getExpression();if(!n)return e;let o=n.getText().trim();if(o!=='"use client"'&&o!=="'use client'")return e;let r=s.getText(),i=s.getFullText();if(r.trim()===i.trim())return e;let m=i.replace(r,"").replace(/^\s*\n/,"").replace(/\n\s*$/,"");return s.replaceWithText(m),e};import{Project as jt,ScriptKind as Tt}from"ts-morph";var Dt=[ze],At=new jt({compilerOptions:{}});async function _t(e){let t=await Et.mkdtemp(Fe.join(vt(),"seed-design-"));return Fe.join(t,e)}async function qe(e){let t=await _t(e.filename),s=At.createSourceFile(t,e.raw,{scriptKind:Tt.TSX});for(let n of Dt)n({sourceFile:s,...e});return await Ne({sourceFile:s,...e})}import*as B from"@clack/prompts";import ce from"fs-extra";import G from"path";import{createPatch as Ot}from"diff";import Ut from"@npmcli/disparity-colors";async function $e({registryItemsToAdd:e,rootPath:t,cwd:s,baseUrl:n,config:o,onDiff:r}){let i=[];for(let{registryId:c,items:m}of e){let p=G.join(t,c);ce.ensureDirSync(p);let y=await Ke({baseUrl:n,registryId:c,registryItemIds:m.map(h=>h.id)});for(let{id:h,snippets:w}of y){let R=await Promise.all(w.map(async d=>{let g=await qe({filename:d.path,config:o,raw:d.content}),$=G.join(p,d.path);return o.tsx||($=$.replace(/\.tsx$/,".jsx"),$=$.replace(/\.ts$/,".js")),{filePath:$,content:g,relativePath:G.relative(s,$),name:`${c}:${h}`}})),f=[];for(let d of R){let{filePath:g,content:$,relativePath:P}=d;if(await ce.ensureDir(G.dirname(g)),ce.existsSync(g)){let C=await ce.readFile(g,"utf-8");if(C===$){B.log.info(`${a(P)}: \uC774\uBBF8 \uCD5C\uC2E0 \uC0C1\uD0DC\uC608\uC694.`);continue}let x=G.basename(g),k=G.extname(g),_=G.basename(g,k),X=Date.now(),S=`legacy-${_}-${X}${k}`,l=await(async()=>{if(r)return r;let b=Ot(P,C,$),A=Ut(b);return B.log.message(`
7
- ${a(P)}: \uD604\uC7AC \uD30C\uC77C\uACFC \uBC1B\uC73C\uB824\uB294 \uD30C\uC77C\uC758 \uB0B4\uC6A9\uC774 \uB2EC\uB77C\uC694.
8
- `),B.log.message(A),B.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:`${x} \uB36E\uC5B4\uC4F0\uAE30`},{value:"backup",label:`\uAE30\uC874 \uD30C\uC77C \uB0B4\uC6A9\uC744 ${S}\uC73C\uB85C \uC62E\uAE30\uACE0 ${x} \uBC1B\uAE30`},{value:"skip",label:"\uC0C8 \uD30C\uC77C \uBC1B\uC9C0 \uC54A\uACE0 \uADF8\uB300\uB85C \uB450\uAE30"}]})})();if(B.isCancel(l)||l==="skip"){B.log.info(`${a(P)}: \uD30C\uC77C\uC744 \uBC1B\uC9C0 \uC54A\uACE0 \uAC74\uB108\uB6F0\uC5C8\uC5B4\uC694.`);continue}if(l==="backup"){let b=G.dirname(g),A=G.join(b,S);await ce.rename(g,A),B.log.info(`${a(P)}: \uAE30\uC874 \uD30C\uC77C\uC744 ${a(G.relative(s,A))}\uB85C \uC62E\uACBC\uC5B4\uC694.`)}}await ce.writeFile(g,$),f.push(d)}if(f.length>0){let d=f.map(({name:g,relativePath:$})=>({name:g,path:$}));i.push(...d),B.log.success(`${a(`${c}:${h}`)} \uAD00\uB828 \uC2A4\uB2C8\uD3AB \uB2E4\uC6B4\uB85C\uB4DC \uC644\uB8CC: ${a(d.map(g=>g.path).join(", "))}`)}}}}import*as v from"@clack/prompts";import os from"path";import{z as ie}from"zod";var N="https://seed-design.io";import*as He from"@clack/prompts";import{execa as zt}from"execa";import{detect as Mt}from"@antfu/ni";async function Be(e){let t=await Mt({programmatic:!0,cwd:e});return t==="yarn@berry"?"yarn":t==="pnpm@6"?"pnpm":t==="bun"?"bun":t==="deno"?"deno":t??"npm"}import Vt from"findup-sync";import Lt from"fs-extra";var Kt="package.json";function Nt(e=process.cwd()){let t=Vt(Kt,{cwd:e});if(!t)throw new Error("No package.json file found in the project.");return t}function Z(e=process.cwd()){let t=Nt(e);return Lt.readJSONSync(t)}async function Ce({cwd:e,deps:t,dev:s=!1}){let{start:n,stop:o}=He.spinner(),r=await Be(e),c={...Z(e).dependencies},m=new Set(t.filter(f=>!c[f])),p=new Set(t.filter(f=>c[f]));if(!m.size)return{installed:new Set,filtered:m};n("\uC758\uC874\uC131 \uC124\uCE58\uC911...");let w=[r==="npm"?"install":"add",s?"-D":null,...m].filter(Boolean),R=`${r} ${w.join(" ")}`;try{await zt(r,w,{cwd:e})}catch(f){throw o("\uC758\uC874\uC131 \uC124\uCE58\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694."),new I({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: ${R}`],cause:f})}return o("\uC758\uC874\uC131 \uC124\uCE58\uAC00 \uC644\uB8CC\uB410\uC5B4\uC694."),{installed:m,filtered:p}}import{randomUUID as Ft}from"node:crypto";import*as We from"@clack/prompts";var qt="seed_cli";async function Bt(e){if(process.env.DISABLE_TELEMETRY==="true"||process.env.SEED_DISABLE_TELEMETRY==="true")return!1;try{if((await ge(e))?.telemetry===!1)return!1}catch{}return!0}function Ht(){return Ft()}var Gt=Ht(),Ge=!1;async function Wt(e,{event:t,properties:s={}}){if(!await Bt(e))return;let o=`${qt}.${t}`;Ge||(We.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)"),Ge=!0);try{let r="https://us.i.posthog.com/capture",i={"Content-Type":"application/json"},c={api_key:"phc_seod8HhifElOP1R92KmvsQybrtUmkOTgZBsq0mfCelR",event:o,distinct_id:Gt,properties:{...s,$process_person_profile:!1},timestamp:new Date().toISOString()},m=new AbortController,p=setTimeout(()=>m.abort(),5e3);try{await fetch(r,{method:"POST",headers:i,body:JSON.stringify(c),signal:m.signal})}finally{clearTimeout(p)}}catch{}}var U={track:Wt};import*as re from"@clack/prompts";import Jt from"fs-extra";import Yt from"path";import{intersects as Xt,satisfies as Qt,valid as Ye,validRange as Xe}from"semver";var fe=["@seed-design/react","@seed-design/css"],Je="workspace:",Zt="npm:";function pe(e){try{let t=Z(e),s={...t.dependencies,...t.devDependencies,...t.peerDependencies,...t.optionalDependencies},n={};for(let o of fe){let r=s[o];typeof r=="string"&&(n[o]=r)}return n}catch{return{}}}function le({publicRegistries:e,itemKeys:t,projectPackageVersions:s}){let n=Array.from(new Set(t)),o=new Map(e.flatMap(i=>i.items.map(c=>[`${i.id}:${c.id}`,c]))),r=[];for(let i of n){let c=o.get(i);if(!c)continue;let m=es(c);for(let p of fe){let y=Array.from(m[p]??[]);if(!y.length)continue;let h=s[p];if(!h){r.push({itemKey:i,packageName:p,requiredRanges:y,type:"missing-package"});continue}let w=ts(h);if(!w){r.push({itemKey:i,packageName:p,requiredRanges:y,installedVersionSpec:h,type:"invalid-version-spec"});continue}y.every(f=>ss({currentVersionSpec:w,requiredRange:f}))||r.push({itemKey:i,packageName:p,requiredRanges:y,installedVersionSpec:h,type:"incompatible-version"})}}return{checkedItemKeys:n,projectPackageVersions:s,issues:r}}function de({report:e,title:t}){if(!e.issues.length)return;re.log.warn(t),re.log.info(`\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804: ${fe.map(n=>`${n}@${a(e.projectPackageVersions[n]??"\uBBF8\uC124\uCE58")}`).join(", ")}`);let s=new Map;for(let n of e.issues){let o=s.get(n.itemKey)??[];o.push(n),s.set(n.itemKey,o)}for(let[n,o]of s.entries()){re.log.warn(a(n));for(let r of o){let i=r.requiredRanges.join(" | ");if(r.type==="missing-package"){re.log.info(` - ${r.packageName}: \uD328\uD0A4\uC9C0\uAC00 \uC124\uCE58\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC544\uC694. \uD544\uC694 \uBC94\uC704: ${i}`);continue}if(r.type==="invalid-version-spec"){re.log.info(` - ${r.packageName}: \uD604\uC7AC \uBC84\uC804 \uD615\uC2DD\uC744 \uD574\uC11D\uD558\uC9C0 \uBABB\uD588\uC5B4\uC694 (${r.installedVersionSpec}). \uD544\uC694 \uBC94\uC704: ${i}`);continue}re.log.info(` - ${r.packageName}: \uD604\uC7AC ${r.installedVersionSpec}, \uD544\uC694 \uBC94\uC704 ${i}`)}}}function Qe({publicRegistries:e,rootPath:t}){let s=[];for(let n of e)for(let o of n.items)o.snippets.some(i=>rs(i.path).some(c=>Jt.existsSync(Yt.join(t,n.id,c))))&&s.push(`${n.id}:${o.id}`);return s}function es(e){let t=Object.fromEntries(fe.map(s=>[s,new Set]));for(let s of e.snippets)for(let[n,o]of Object.entries(s.dependencies??{}))is(n)&&t[n].add(o);return t}function ts(e){let t=e.trim();if(t.startsWith(Je)&&(t=t.slice(Je.length).trim()),t.startsWith(Zt)){let s=t.split("@").at(-1);if(!s)return null;t=s}return!t||t==="*"?null:Ye(t)||Xe(t)?t:null}function ss({currentVersionSpec:e,requiredRange:t}){let s=Xe(t);return s?Ye(e)?Qt(e,s,{includePrerelease:!0}):Xt(e,s,{includePrerelease:!0}):!1}function rs(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 is(e){return fe.includes(e)}var ns=ie.object({itemIds:ie.array(ie.string()).optional(),all:ie.boolean(),cwd:ie.string(),baseUrl:ie.string().optional(),onDiff:ie.enum(["overwrite","backup"]).optional()}),Ze=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:N}).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,s)=>{let n=Date.now(),o=K(s);v.intro("seed-design add");try{let r=ns.safeParse({itemIds:t,...s});if(!r.success)throw r.error;let{data:{all:i,...c}}=r;if(i)throw new I({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 m=c.cwd,p=c.baseUrl,y=await ye(m),h=os.resolve(m,y.path),{start:w,stop:R}=v.spinner();w("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let f=await(async()=>{try{let l=await Promise.all((await ne({baseUrl:p})).map(async({id:b})=>ae({baseUrl:p,registryId:b})));return R("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),l}catch(l){throw R("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),l}})(),d=await(async()=>{if(c.itemIds?.length)return c.itemIds;let l=await v.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:f.filter(({hideFromCLICatalog:b})=>!b).flatMap(({id:b,items:A})=>A.filter(({hideFromCLICatalog:F})=>!F).sort((F,V)=>F.id.localeCompare(V.id)).map(({id:F,description:V,deprecated:J})=>({label:`${J?"(deprecated) ":""}${a(b)}:${F}`,value:`${b}:${F}`,hint:V,deprecated:J,registryItemCount:A.length}))).sort((b,A)=>b.deprecated!==A.deprecated?b.deprecated?1:-1:A.registryItemCount-b.registryItemCount)});if(v.isCancel(l))throw new E;return l})();if(!d?.length)throw new E("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC120\uD0DD\uB418\uC9C0 \uC54A\uC558\uC5B4\uC694.");v.log.message(`\uC120\uD0DD\uB41C \uD56D\uBAA9: ${a(d.join(", "))}`);let g=[];for(let l of d){let[b,...A]=l.split(":"),F=A.join(":");if(!b||!F)throw new I({message:`${a(l)}: \uD56D\uBAA9 \uC774\uB984\uC774 \uC798\uBABB\uB418\uC5C8\uC5B4\uC694.`,hint:`${a("ui:action-button")}\uACFC \uAC19\uC740 \uD615\uC2DD\uC73C\uB85C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});let V=f.find(J=>J.id===b)?.items.find(J=>J.id===F);if(!V)throw new I({message:`${a(l)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});if(V.deprecated){let J=await v.confirm({message:`${a(V.id)}: deprecated \uB418\uC5C8\uC5B4\uC694. \uCD94\uAC00\uD560\uAE4C\uC694?`,initialValue:!1});if(v.isCancel(J))throw new E;if(J===!1){v.log.info(`${a(V.id)}: \uCD94\uAC00\uD558\uC9C0 \uC54A\uC744\uAC8C\uC694.`);continue}}g.push(l)}let{registryItemsToAdd:$,npmDependenciesToAdd:P}=we({selectedItemKeys:g,publicRegistries:f}),C=le({publicRegistries:f,itemKeys:$.flatMap(({registryId:l,items:b})=>b.map(A=>`${l}:${A.id}`)),projectPackageVersions:pe(c.cwd)});de({report:C,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."}),v.log.info(`\uCD94\uAC00\uD560 \uD56D\uBAA9: ${a($.map(l=>l.items.map(b=>`${l.registryId}:${b.id}`).join(", ")).join(", ")||"\uC5C6\uC74C")}
2
+ import*as ee from"@clack/prompts";import{cosmiconfig as ct}from"cosmiconfig";import{z as re}from"zod";import*as J from"@clack/prompts";import{ZodError as it}from"zod";import rt from"picocolors";var p=e=>rt.cyan(e);var I=class extends Error{hint;details;constructor({message:t,hint:s,details:n=[],cause:o}){super(t,{cause:o}),this.name="CliError",this.hint=s,this.details=n}},v=class extends Error{constructor(t="\uC791\uC5C5\uC774 \uCDE8\uC18C\uB410\uC5B4\uC694."){super(t),this.name="CliCancelError"}};function U(e){return e instanceof v}function q(e){return!e||typeof e!="object"||!("verbose"in e)?!1:e.verbose===!0}function ot(e,t){if(e instanceof I)return{reason:e.message,hint:e.hint??t,details:e.details,stack:nt(e.cause??e)};if(e instanceof it){let s=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:s,stack:e.stack}}if(e instanceof Error){let s=e,n=[];return(s.escapedCommand||s.command)&&n.push(`\uC2E4\uD589 \uBA85\uB839\uC5B4: ${s.escapedCommand??s.command}`),typeof s.exitCode=="number"&&n.push(`\uC885\uB8CC \uCF54\uB4DC: ${s.exitCode}`),s.stderr?.trim()?n.push(`stderr: ${s.stderr.trim()}`):s.stdout?.trim()&&n.push(`stdout: ${s.stdout.trim()}`),{reason:s.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 nt(e){if(e instanceof Error)return e.stack}function B(e,{defaultMessage:t,defaultHint:s,verbose:n=!1}){let o=ot(e,s);J.log.error(t),J.log.error(`\uC6D0\uC778: ${o.reason}`);for(let r of o.details)J.log.info(r);o.hint&&J.log.info(`\uD574\uACB0 \uD78C\uD2B8: ${o.hint}`),n&&o.stack&&(J.log.message(p(`
3
+ [verbose] stack trace`)),J.log.message(o.stack)),J.outro(p("\uC791\uC5C5\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694."))}import*as X from"@clack/prompts";import at from"fs-extra";import Ee from"path";var K={rsc:!1,tsx:!0,path:"./seed-design",telemetry:!0};async function ke(){return await X.group({tsx:()=>X.confirm({message:`${p("TypeScript")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:K.tsx}),rsc:()=>X.confirm({message:`${p("React Server Components")}\uB97C \uC0AC\uC6A9\uC911\uC774\uC2E0\uAC00\uC694?`,initialValue:K.rsc}),path:()=>X.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:()=>X.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 v}})}async function ue({cwd:e,config:t}){let s=Ee.resolve(e,"seed-design.json");return await at.writeFile(s,`${JSON.stringify(t,null,2)}
4
+ `,"utf-8"),{relativePath:Ee.relative(process.cwd(),s),targetPath:s}}var ve="seed-design",lt=ct(ve,{searchPlaces:[`${ve}.json`]}),je=re.object({$schema:re.string().optional(),rsc:re.coerce.boolean().default(!1),tsx:re.coerce.boolean().default(!0),path:re.string(),telemetry:re.coerce.boolean().optional().default(!0)}).strict();async function ye(e){let t=await me(e);if(t)return t;ee.log.error("\uD504\uB85C\uC81D\uD2B8 \uB8E8\uD2B8 \uACBD\uB85C\uC5D0 `seed-design.json` \uD30C\uC77C\uC774 \uC5C6\uC5B4\uC694.");let s=await ee.confirm({message:"seed-design.json \uD30C\uC77C\uC744 \uC0DD\uC131\uD558\uC2DC\uACA0\uC5B4\uC694?"});if(ee.isCancel(s)||!s)throw new v;try{return await ue({cwd:e,config:K}),ee.log.message("seed-design.json \uD30C\uC77C\uC774 \uC0DD\uC131\uB410\uC5B4\uC694."),je.parse(K)}catch(n){throw new I({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 me(e){let t=await lt.search(e);if(!t||t.isEmpty)return null;try{return je.parse(t.config)}catch(s){throw new I({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:s})}}function he({selectedItemKeys:e,publicRegistries:t}){let s=[],n=new Set;function o(r,i){let a=s.find(l=>l.registryId===r);if(!a?.items.some(l=>l.id===i.id)){if(a?a.items.push(i):s.push({registryId:r,items:[i]}),i.dependencies?.length)for(let l of i.dependencies)n.add(l);if(i.innerDependencies?.length)for(let l of i.innerDependencies)for(let f of l.itemIds){let h=t.find(u=>u.id===l.registryId)?.items.find(u=>u.id===f);if(!h)throw new Error(`Cannot find dependency item: ${l.registryId}:${f}`);o(l.registryId,h)}}}for(let r of e){let[i,...a]=r.split(":"),l=a.join(":");if(!i||!l)throw new Error(`Invalid snippet format: "${r}"`);let f=t.find(h=>h.id===i)?.items.find(h=>h.id===l);if(!f)throw new Error(`Cannot find snippet: "${r}"`);o(i,f)}return{registryItemsToAdd:s,npmDependenciesToAdd:n}}import*as Se from"@clack/prompts";import{z as m}from"zod";var xe=m.object({id:m.string(),description:m.string().optional(),deprecated:m.boolean().optional(),hideFromCLICatalog:m.boolean().optional(),dependencies:m.array(m.string()).optional(),innerDependencies:m.array(m.object({registryId:m.string(),itemIds:m.array(m.string())})).optional(),snippets:m.array(m.object({path:m.string(),dependencies:m.record(m.string(),m.string()).optional(),content:m.string()}))}),Pe=m.object({id:m.string(),hideFromCLICatalog:m.boolean().optional(),items:m.array(xe.omit({snippets:!0}).extend({snippets:m.array(m.object({path:m.string(),dependencies:m.record(m.string(),m.string()).optional()}))}))}),Te=m.array(m.object({id:m.string()})),pt=m.object({label:m.string(),path:m.string()}),mt=m.object({id:m.string(),title:m.string(),description:m.string().optional(),docUrl:m.string(),deprecated:m.boolean().optional(),snippetKey:m.string().optional(),snippets:m.array(pt).optional()}),dt=m.object({id:m.string(),label:m.string(),items:m.array(mt)}),ft=m.object({id:m.string(),label:m.string(),sections:m.array(dt)}),Ae=m.object({categories:m.array(ft)});var gt=1e4;async function _e(e,t=gt){let s=new AbortController,n=setTimeout(()=>s.abort(),t);try{return await fetch(e,{signal:s.signal})}catch(o){throw o instanceof Error&&o.name==="AbortError"?new I({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 Re({baseUrl:e}){let t=await fetch(`${e}/__docs__/index.json`);if(!t.ok)throw new I({message:`\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694: ${t.status} ${t.statusText}`});let s=await t.json(),{success:n,data:o,error:r}=Ae.safeParse(s);if(!n)throw new I({message:`\uBB38\uC11C \uBAA9\uB85D \uD30C\uC2F1\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694: ${r?.message}`});return o}async function ie({baseUrl:e}){let t=await fetch(`${e}/__registry__/index.json`);if(!t.ok)throw new Error(`Failed to fetch registries: ${t.status} ${t.statusText}`);let s=await t.json(),{success:n,data:o,error:r}=Te.safeParse(s);if(!n)throw new Error(`Failed to parse registries: ${r?.message}`);return o}async function oe({baseUrl:e,registryId:t}){let s=await fetch(`${e}/__registry__/${t}/index.json`);if(!s.ok)throw new Error(`Failed to fetch ${t} registry: ${s.status} ${s.statusText}`);let n=await s.json(),{success:o,data:r,error:i}=Pe.safeParse(n);if(!o)throw new Error(`Failed to parse ${t} registry: ${i?.message}`);return r}async function ut({baseUrl:e,registryId:t,registryItemId:s}){let n=await fetch(`${e}/__registry__/${t}/${s}.json`);if(!n.ok)throw new Error(`Failed to fetch ${s}: ${n.status} ${n.statusText}`);let o=await n.json(),{success:r,data:i,error:a}=xe.safeParse(o);if(!r)throw new Error(`Failed to parse ${s}: ${a?.message}`);return i}async function De({url:e}){let t=await _e(e);if(!t.ok)throw new I({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 Oe({baseUrl:e,query:t}){let s=t.startsWith("/")?t.slice(1):t,n=[`${e}/llms/${s}.txt`,`${e}/llms/${s}/llms.txt`],o;for(let r of n){let i;try{i=await _e(r)}catch(a){o=a;continue}if(i.ok)return i.text();if(i.status===404){o=new I({message:`llms.txt\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694: ${s}`,hint:`\uB2E4\uC74C \uACBD\uB85C\uB97C \uC2DC\uB3C4\uD588\uC5B4\uC694:
5
+ ${n.map(a=>` - ${a}`).join(`
6
+ `)}`});continue}throw new I({message:`llms.txt \uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC5B4\uC694: ${i.status} ${i.statusText}`,hint:`URL: ${r}`})}throw o??new I({message:`llms.txt\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694: ${s}`,hint:`\uB2E4\uC74C \uACBD\uB85C\uB97C \uC2DC\uB3C4\uD588\uC5B4\uC694:
7
+ ${n.map(r=>` - ${r}`).join(`
8
+ `)}`})}async function Me({baseUrl:e,registryId:t,registryItemIds:s}){return await Promise.all(s.map(async n=>{try{return await ut({baseUrl:e,registryId:t,registryItemId:n})}catch(o){let r=await fetch(`${e}/__registry__/${t}/index.json`);if(!r.ok)throw new Error(`${t} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694: ${r.status} ${r.statusText}`);let i=await r.json(),{success:a,data:l}=Pe.safeParse(i);throw a?(Se.log.error(`${n} \uC2A4\uB2C8\uD3AB\uC774 ${t} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC5C6\uC5B4\uC694.`),Se.log.info(`${t} \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC874\uC7AC\uD558\uB294 \uC2A4\uB2C8\uD3AB:
9
+ ${l.items.map(f=>f.id).join(`
10
+ `)}`),o):new Error(`Failed to parse registry index for ${t}`)}}))}import{promises as Ct}from"fs";import{tmpdir as It}from"os";import Ke from"path";import{transformFromAstSync as yt}from"@babel/core";import ht from"@babel/plugin-transform-typescript";import*as we 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"]},Le=async({sourceFile:e,config:t})=>{let s=e.getFullText();if(t.tsx)return s;let n=we.parse(s,{parser:{parse:r=>wt(r,bt)}}),o=yt(n,s,{cloneInputAst:!1,code:!1,ast:!0,plugins:[ht],configFile:!1});if(!o||!o.ast)throw new Error("Failed to transform JSX");return we.print(o.ast).code};import{SyntaxKind as $t}from"ts-morph";var Ue=async({sourceFile:e,config:t})=>{if(t.rsc)return e;let s=e.getFirstChildByKind($t.ExpressionStatement);if(!s)return e;let n=s.getExpression();if(!n)return e;let o=n.getText().trim();if(o!=='"use client"'&&o!=="'use client'")return e;let r=s.getText(),i=s.getFullText();if(r.trim()===i.trim())return e;let l=i.replace(r,"").replace(/^\s*\n/,"").replace(/\n\s*$/,"");return s.replaceWithText(l),e};import{Project as xt,ScriptKind as Pt}from"ts-morph";var St=[Ue],Rt=new xt({compilerOptions:{}});async function Et(e){let t=await Ct.mkdtemp(Ke.join(It(),"seed-design-"));return Ke.join(t,e)}async function Fe(e){let t=await Et(e.filename),s=Rt.createSourceFile(t,e.raw,{scriptKind:Pt.TSX});for(let n of St)n({sourceFile:s,...e});return await Le({sourceFile:s,...e})}import*as F from"@clack/prompts";import ne from"fs-extra";import H from"path";import{createPatch as kt}from"diff";import vt from"@npmcli/disparity-colors";async function be({registryItemsToAdd:e,rootPath:t,cwd:s,baseUrl:n,config:o,onDiff:r}){let i=[];for(let{registryId:a,items:l}of e){let f=H.join(t,a);ne.ensureDirSync(f);let h=await Me({baseUrl:n,registryId:a,registryItemIds:l.map(u=>u.id)});for(let{id:u,snippets:C}of h){let k=await Promise.all(C.map(async w=>{let d=await Fe({filename:w.path,config:o,raw:w.content}),b=H.join(f,w.path);return o.tsx||(b=b.replace(/\.tsx$/,".jsx"),b=b.replace(/\.ts$/,".js")),{filePath:b,content:d,relativePath:H.relative(s,b),name:`${a}:${u}`}})),y=[];for(let w of k){let{filePath:d,content:b,relativePath:A}=w;if(await ne.ensureDir(H.dirname(d)),ne.existsSync(d)){let V=await ne.readFile(d,"utf-8");if(V===b){F.log.info(`${p(A)}: \uC774\uBBF8 \uCD5C\uC2E0 \uC0C1\uD0DC\uC608\uC694.`);continue}let P=H.basename(d),D=H.extname(d),O=H.basename(d,D),Y=Date.now(),$=`legacy-${O}-${Y}${D}`,c=await(async()=>{if(r)return r;let g=kt(A,V,b),x=vt(g);return F.log.message(`
11
+ ${p(A)}: \uD604\uC7AC \uD30C\uC77C\uACFC \uBC1B\uC73C\uB824\uB294 \uD30C\uC77C\uC758 \uB0B4\uC6A9\uC774 \uB2EC\uB77C\uC694.
12
+ `),F.log.message(x),F.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:`${P} \uB36E\uC5B4\uC4F0\uAE30`},{value:"backup",label:`\uAE30\uC874 \uD30C\uC77C \uB0B4\uC6A9\uC744 ${$}\uC73C\uB85C \uC62E\uAE30\uACE0 ${P} \uBC1B\uAE30`},{value:"skip",label:"\uC0C8 \uD30C\uC77C \uBC1B\uC9C0 \uC54A\uACE0 \uADF8\uB300\uB85C \uB450\uAE30"}]})})();if(F.isCancel(c)||c==="skip"){F.log.info(`${p(A)}: \uD30C\uC77C\uC744 \uBC1B\uC9C0 \uC54A\uACE0 \uAC74\uB108\uB6F0\uC5C8\uC5B4\uC694.`);continue}if(c==="backup"){let g=H.dirname(d),x=H.join(g,$);await ne.rename(d,x),F.log.info(`${p(A)}: \uAE30\uC874 \uD30C\uC77C\uC744 ${p(H.relative(s,x))}\uB85C \uC62E\uACBC\uC5B4\uC694.`)}}await ne.writeFile(d,b),y.push(w)}if(y.length>0){let w=y.map(({name:d,relativePath:b})=>({name:d,path:b}));i.push(...w),F.log.success(`${p(`${a}:${u}`)} \uAD00\uB828 \uC2A4\uB2C8\uD3AB \uB2E4\uC6B4\uB85C\uB4DC \uC644\uB8CC: ${p(w.map(d=>d.path).join(", "))}`)}}}}import*as R from"@clack/prompts";import Qt from"path";import{z as se}from"zod";var G="https://seed-design.io";import*as ze from"@clack/prompts";import{execa as Ot}from"execa";import{detect as jt}from"@antfu/ni";async function Ne(e){let t=await jt({programmatic:!0,cwd:e});return t==="yarn@berry"?"yarn":t==="pnpm@6"?"pnpm":t==="bun"?"bun":t==="deno"?"deno":t??"npm"}import Tt from"findup-sync";import At from"fs-extra";var _t="package.json";function Dt(e=process.cwd()){let t=Tt(_t,{cwd:e});if(!t)throw new Error("No package.json file found in the project.");return t}function ae(e=process.cwd()){let t=Dt(e);return At.readJSONSync(t)}async function $e({cwd:e,deps:t,dev:s=!1}){let{start:n,stop:o}=ze.spinner(),r=await Ne(e),a={...ae(e).dependencies},l=new Set(t.filter(y=>!a[y])),f=new Set(t.filter(y=>a[y]));if(!l.size)return{installed:new Set,filtered:l};n("\uC758\uC874\uC131 \uC124\uCE58\uC911...");let C=[r==="npm"?"install":"add",s?"-D":null,...l].filter(Boolean),k=`${r} ${C.join(" ")}`;try{await Ot(r,C,{cwd:e})}catch(y){throw o("\uC758\uC874\uC131 \uC124\uCE58\uC5D0 \uC2E4\uD328\uD588\uC5B4\uC694."),new I({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: ${k}`],cause:y})}return o("\uC758\uC874\uC131 \uC124\uCE58\uAC00 \uC644\uB8CC\uB410\uC5B4\uC694."),{installed:l,filtered:f}}import{randomUUID as Mt}from"node:crypto";import*as qe from"@clack/prompts";var Lt="seed_cli";async function Ut(e){if(process.env.DISABLE_TELEMETRY==="true"||process.env.SEED_DISABLE_TELEMETRY==="true")return!1;try{if((await me(e))?.telemetry===!1)return!1}catch{}return!0}function Kt(){return Mt()}var Ft=Kt(),Ve=!1;async function Nt(e,{event:t,properties:s={}}){if(!await Ut(e))return;let o=`${Lt}.${t}`;Ve||(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)"),Ve=!0);try{let r="https://us.i.posthog.com/capture",i={"Content-Type":"application/json"},a={api_key:"phc_seod8HhifElOP1R92KmvsQybrtUmkOTgZBsq0mfCelR",event:o,distinct_id:Ft,properties:{...s,$process_person_profile:!1},timestamp:new Date().toISOString()},l=new AbortController,f=setTimeout(()=>l.abort(),5e3);try{await fetch(r,{method:"POST",headers:i,body:JSON.stringify(a),signal:l.signal})}finally{clearTimeout(f)}}catch{}}var N={track:Nt};import*as te from"@clack/prompts";import zt from"fs-extra";import Vt from"path";import{intersects as qt,satisfies as Bt,valid as He,validRange as Ge}from"semver";var de=["@seed-design/react","@seed-design/css"],Be="workspace:",Ht="npm:";function ce(e){try{let t=ae(e),s={...t.dependencies,...t.devDependencies,...t.peerDependencies,...t.optionalDependencies},n={};for(let o of de){let r=s[o];typeof r=="string"&&(n[o]=r)}return n}catch{return{}}}function le({publicRegistries:e,itemKeys:t,projectPackageVersions:s}){let n=Array.from(new Set(t)),o=new Map(e.flatMap(i=>i.items.map(a=>[`${i.id}:${a.id}`,a]))),r=[];for(let i of n){let a=o.get(i);if(!a)continue;let l=Gt(a);for(let f of de){let h=Array.from(l[f]??[]);if(!h.length)continue;let u=s[f];if(!u){r.push({itemKey:i,packageName:f,requiredRanges:h,type:"missing-package"});continue}let C=Jt(u);if(!C){r.push({itemKey:i,packageName:f,requiredRanges:h,installedVersionSpec:u,type:"invalid-version-spec"});continue}h.every(y=>Wt({currentVersionSpec:C,requiredRange:y}))||r.push({itemKey:i,packageName:f,requiredRanges:h,installedVersionSpec:u,type:"incompatible-version"})}}return{checkedItemKeys:n,projectPackageVersions:s,issues:r}}function pe({report:e,title:t}){if(!e.issues.length)return;te.log.warn(t),te.log.info(`\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804: ${de.map(n=>`${n}@${p(e.projectPackageVersions[n]??"\uBBF8\uC124\uCE58")}`).join(", ")}`);let s=new Map;for(let n of e.issues){let o=s.get(n.itemKey)??[];o.push(n),s.set(n.itemKey,o)}for(let[n,o]of s.entries()){te.log.warn(p(n));for(let r of o){let i=r.requiredRanges.join(" | ");if(r.type==="missing-package"){te.log.info(` - ${r.packageName}: \uD328\uD0A4\uC9C0\uAC00 \uC124\uCE58\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC544\uC694. \uD544\uC694 \uBC94\uC704: ${i}`);continue}if(r.type==="invalid-version-spec"){te.log.info(` - ${r.packageName}: \uD604\uC7AC \uBC84\uC804 \uD615\uC2DD\uC744 \uD574\uC11D\uD558\uC9C0 \uBABB\uD588\uC5B4\uC694 (${r.installedVersionSpec}). \uD544\uC694 \uBC94\uC704: ${i}`);continue}te.log.info(` - ${r.packageName}: \uD604\uC7AC ${r.installedVersionSpec}, \uD544\uC694 \uBC94\uC704 ${i}`)}}}function Je({publicRegistries:e,rootPath:t}){let s=[];for(let n of e)for(let o of n.items)o.snippets.some(i=>Yt(i.path).some(a=>zt.existsSync(Vt.join(t,n.id,a))))&&s.push(`${n.id}:${o.id}`);return s}function Gt(e){let t=Object.fromEntries(de.map(s=>[s,new Set]));for(let s of e.snippets)for(let[n,o]of Object.entries(s.dependencies??{}))Xt(n)&&t[n].add(o);return t}function Jt(e){let t=e.trim();if(t.startsWith(Be)&&(t=t.slice(Be.length).trim()),t.startsWith(Ht)){let s=t.split("@").at(-1);if(!s)return null;t=s}return!t||t==="*"?null:He(t)||Ge(t)?t:null}function Wt({currentVersionSpec:e,requiredRange:t}){let s=Ge(t);return s?He(e)?Bt(e,s,{includePrerelease:!0}):qt(e,s,{includePrerelease:!0}):!1}function Yt(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 Xt(e){return de.includes(e)}var Zt=se.object({itemIds:se.array(se.string()).optional(),all:se.boolean(),cwd:se.string(),baseUrl:se.string().optional(),onDiff:se.enum(["overwrite","backup"]).optional()}),We=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("--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,s)=>{let n=Date.now(),o=q(s);R.intro("seed-design add");try{let r=Zt.safeParse({itemIds:t,...s});if(!r.success)throw r.error;let{data:{all:i,...a}}=r;if(i)throw new I({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 l=a.cwd,f=a.baseUrl,h=await ye(l),u=Qt.resolve(l,h.path),{start:C,stop:k}=R.spinner();C("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let y=await(async()=>{try{let c=await Promise.all((await ie({baseUrl:f})).map(async({id:g})=>oe({baseUrl:f,registryId:g})));return k("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),c}catch(c){throw k("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),c}})(),w=await(async()=>{if(a.itemIds?.length)return a.itemIds;let c=await R.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:y.filter(({hideFromCLICatalog:g})=>!g).flatMap(({id:g,items:x})=>x.filter(({hideFromCLICatalog:_})=>!_).sort((_,T)=>_.id.localeCompare(T.id)).map(({id:_,description:T,deprecated:S})=>({label:`${S?"(deprecated) ":""}${p(g)}:${_}`,value:`${g}:${_}`,hint:T,deprecated:S,registryItemCount:x.length}))).sort((g,x)=>g.deprecated!==x.deprecated?g.deprecated?1:-1:x.registryItemCount-g.registryItemCount)});if(R.isCancel(c))throw new v;return c})();if(!w?.length)throw new v("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC120\uD0DD\uB418\uC9C0 \uC54A\uC558\uC5B4\uC694.");R.log.message(`\uC120\uD0DD\uB41C \uD56D\uBAA9: ${p(w.join(", "))}`);let d=[];for(let c of w){let[g,...x]=c.split(":"),_=x.join(":");if(!g||!_)throw new I({message:`${p(c)}: \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 T=y.find(S=>S.id===g)?.items.find(S=>S.id===_);if(!T)throw new I({message:`${p(c)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});if(T.deprecated){let S=await R.confirm({message:`${p(T.id)}: deprecated \uB418\uC5C8\uC5B4\uC694. \uCD94\uAC00\uD560\uAE4C\uC694?`,initialValue:!1});if(R.isCancel(S))throw new v;if(S===!1){R.log.info(`${p(T.id)}: \uCD94\uAC00\uD558\uC9C0 \uC54A\uC744\uAC8C\uC694.`);continue}}d.push(c)}let{registryItemsToAdd:b,npmDependenciesToAdd:A}=he({selectedItemKeys:d,publicRegistries:y}),V=le({publicRegistries:y,itemKeys:b.flatMap(({registryId:c,items:g})=>g.map(x=>`${c}:${x.id}`)),projectPackageVersions:ce(a.cwd)});pe({report:V,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."}),R.log.info(`\uCD94\uAC00\uD560 \uD56D\uBAA9: ${p(b.map(c=>c.items.map(g=>`${c.registryId}:${g.id}`).join(", ")).join(", ")||"\uC5C6\uC74C")}
9
13
 
10
- \uC124\uCE58\uD560 \uC758\uC874\uC131: ${a(Array.from(P).join(", ")||"\uC5C6\uC74C")}`),await $e({registryItemsToAdd:$,rootPath:h,cwd:m,baseUrl:p,config:y,onDiff:c.onDiff});let{installed:x,filtered:k}=await Ce({cwd:m,deps:Array.from(P)});x.size===0&&v.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),x.size&&(v.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${a(Array.from(x).join(", "))}`),k.size&&v.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${a(Array.from(k).join(", "))}`)),v.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let _=Date.now()-n,X=new Set($.map(l=>l.registryId)),S=d.some(l=>{let[b,...A]=l.split(":"),F=A.join(":");return f.find(V=>V.id===b)?.items.find(V=>V.id===F)?.deprecated});try{await U.track(c.cwd,{event:"add",properties:{items_count:g.length,registries:Array.from(X),has_deprecated:S,dependencies_count:P.size,duration_ms:_}})}catch(l){o&&console.error("[Telemetry] add tracking failed:",l)}}catch(r){L(r)&&(v.outro(a(r.message)),process.exit(0)),O(r,{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 as from"path";import{z as ee}from"zod";var cs=ee.object({registryIds:ee.array(ee.string()).optional(),all:ee.boolean(),includeDeprecated:ee.boolean().optional(),cwd:ee.string(),baseUrl:ee.string().optional(),onDiff:ee.enum(["overwrite","backup"]).optional()}),et=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:N}).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,s)=>{let n=Date.now(),o=K(s);T.intro("seed-design add-all");try{let r=cs.safeParse({registryIds:t,...s});if(!r.success)throw r.error;let{data:i}=r,c=i.cwd,m=i.baseUrl,p=await ye(c),y=as.resolve(c,p.path),{start:h,stop:w}=T.spinner();h("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let R=await(async()=>{try{let S=await Promise.all((await ne({baseUrl:m})).map(async({id:l})=>ae({baseUrl:m,registryId:l})));return w("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),S}catch(S){throw w("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),S}})(),f=await(async()=>{if(i.all){let l=R.map(b=>b.id);return T.log.message(`\uBAA8\uB4E0 \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${a(l.join(", "))}`),l}if(i.registryIds?.length){let l=R.map(b=>b.id);for(let b of i.registryIds)if(!l.includes(b))throw new I({message:`\uB808\uC9C0\uC2A4\uD2B8\uB9AC '${b}'\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,details:[`\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uB808\uC9C0\uC2A4\uD2B8\uB9AC: ${l.join(", ")}`]});return T.log.message(`\uC120\uD0DD\uB41C \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${a(i.registryIds.join(", "))}`),i.registryIds}let S=await T.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:R.filter(({hideFromCLICatalog:l})=>!l).sort((l,b)=>b.items.length-l.items.length).map(l=>{let b=l.items[0]?.id,A=b?`${l.items.length}\uAC1C \uD56D\uBAA9 (${b} \uB4F1)`:`${l.items.length}\uAC1C \uD56D\uBAA9 (\uD56D\uBAA9 \uC5C6\uC74C)`;return{label:l.id,value:l.id,hint:A}})});if(T.isCancel(S))throw new E;return T.log.message(`\uC120\uD0DD\uB41C \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${a(S.join(", "))}`),S})(),d=R.filter(S=>f.includes(S.id)),g=d.flatMap(S=>S.items.filter(l=>l.deprecated?i.includeDeprecated:!0).map(l=>`${S.id}:${l.id}`)),$=d.reduce((S,l)=>S+l.items.filter(b=>b.deprecated).length,0);if(!i.includeDeprecated&&$>0&&T.log.info(`${$}\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.`),!g.length)throw new E("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC5B4\uC694.");T.log.message(`\uCD1D ${a(g.length.toString())}\uAC1C\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4.`);let{registryItemsToAdd:P,npmDependenciesToAdd:C}=we({selectedItemKeys:g,publicRegistries:R}),x=le({publicRegistries:R,itemKeys:P.flatMap(({registryId:S,items:l})=>l.map(b=>`${S}:${b.id}`)),projectPackageVersions:pe(i.cwd)});de({report:x,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."}),await $e({registryItemsToAdd:P,rootPath:y,cwd:c,baseUrl:m,config:p,onDiff:i.onDiff});let{installed:k,filtered:_}=await Ce({cwd:c,deps:Array.from(C)});k.size===0&&T.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),k.size&&(T.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${a(Array.from(k).join(", "))}`),_.size&&T.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${a(Array.from(_).join(", "))}`)),T.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let X=Date.now()-n;try{await U.track(i.cwd,{event:"add-all",properties:{registries:f,items_count:g.length,include_deprecated:i.includeDeprecated||!1,dependencies_count:C.size,duration_ms:X}})}catch(S){o&&console.error("[Telemetry] add-all tracking failed:",S)}}catch(r){L(r)&&(T.outro(a(r.message)),process.exit(0)),O(r,{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 M from"@clack/prompts";import tt from"path";import{z as H}from"zod";var ps=H.object({itemIds:H.array(H.string()).optional(),component:H.union([H.string(),H.array(H.string())]).optional(),all:H.boolean(),registry:H.string().optional(),cwd:H.string(),baseUrl:H.string().optional()});function ls({itemIds:e,component:t}){let s=r=>r.trim().replace(/\s+/g,"-"),n=(e??[]).map(s).filter(Boolean),o=(Array.isArray(t)?t:[t]).filter(r=>!!r).flatMap(r=>r.split(",")).map(s).filter(Boolean);return Array.from(new Set([...n,...o]))}function ds({publicRegistries:e,targetInputs:t,defaultRegistry:s}){let n=e.filter(r=>typeof r.id=="string"&&Array.isArray(r.items)).flatMap(r=>r.items.filter(i=>typeof i.id=="string").map(i=>`${r.id}:${i.id}`)),o=new Set;for(let r of t){let i=r.includes(":")?r:s?`${s}:${r}`:(()=>{let c=n.filter(m=>m.endsWith(`:${r}`));if(!c.length)throw new I({message:`${a(r)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,hint:`${a("ui:action-button")}\uCC98\uB7FC registry\uB97C \uD3EC\uD568\uD574\uC11C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});if(c.length>1)throw new I({message:`${a(r)}: \uAC19\uC740 \uC774\uB984\uC758 \uD56D\uBAA9\uC774 \uC5EC\uB7EC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC788\uC5B4\uC694.`,details:c.map(m=>`- ${m}`),hint:`${a("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 I({message:`${a(i)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});o.add(i)}return Array.from(o)}var st=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:N}).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,s)=>{let n=Date.now(),o=K(s);M.intro("seed-design compat");try{let r=ps.safeParse({itemIds:t,...s});if(!r.success)throw r.error;let{data:i}=r,{start:c,stop:m}=M.spinner();c("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let p=await(async()=>{try{let d=await Promise.all((await ne({baseUrl:i.baseUrl})).map(async({id:g})=>ae({baseUrl:i.baseUrl,registryId:g})));return m("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),d}catch(d){throw m("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),d}})(),y=ls({itemIds:i.itemIds,component:i.component}),h=i.all?p.flatMap(g=>g.items.map($=>`${g.id}:${$.id}`)):y.length>0?ds({publicRegistries:p,targetInputs:y,defaultRegistry:i.registry}):ge(i.cwd),w=Array.isArray(h)?h:await(async()=>{let d=await h;if(!d)throw new I({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 g=tt.resolve(i.cwd,d.path),$=Qe({publicRegistries:p,rootPath:g});return $.length?$:(M.log.info(`${a(tt.relative(i.cwd,g)||d.path)}\uC5D0\uC11C \uC124\uCE58\uB41C \uC2A4\uB2C8\uD3AB\uC744 \uCC3E\uC9C0 \uBABB\uD588\uC5B4\uC694.`),[])})();w.length||(M.outro("\uAC80\uC0AC\uD560 \uC2A4\uB2C8\uD3AB\uC774 \uC5C6\uC5B4\uC694."),process.exit(0));let R=pe(i.cwd),f=le({publicRegistries:p,itemKeys:w,projectPackageVersions:R});if(M.log.info(`\uAC80\uC0AC \uB300\uC0C1: ${a(f.checkedItemKeys.join(", "))}`),!f.issues.length){M.outro("\uBAA8\uB4E0 \uC2A4\uB2C8\uD3AB\uC774 \uD604\uC7AC @seed-design/react, @seed-design/css\uC640 \uD638\uD658\uB3FC\uC694.");try{await U.track(i.cwd,{event:"compat",properties:{checked_items_count:f.checkedItemKeys.length,incompatible_items_count:0,duration_ms:Date.now()-n}})}catch(d){o&&console.error("[Telemetry] compat tracking failed:",d)}process.exit(0)}de({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."}),M.log.info("\uD544\uC694\uD55C \uBC84\uC804\uC73C\uB85C @seed-design/react \uB610\uB294 @seed-design/css\uB97C \uB9DE\uCD98 \uB4A4 \uB2E4\uC2DC \uC2E4\uD589\uD574\uBCF4\uC138\uC694."),M.outro("\uD638\uD658\uC131 \uC774\uC288\uAC00 \uC788\uC5B4\uC694.");try{await U.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(r){L(r)&&(M.outro(a(r.message)),process.exit(0)),O(r,{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 j from"@clack/prompts";import{z as ve}from"zod";var ms="https://raw.githubusercontent.com/daangn/seed-design/refs/heads/dev/docs/registry",gs=ve.object({query:ve.string().optional(),baseUrl:ve.string().optional()});function rt(e,t){return`${ms}/${e}/${t}`}function fs(e,t){let s=`${t}${e.docUrl}`,n=`${t}/llms${e.docUrl}.txt`,o=[e.id,`- docs: ${s}`,`- llms.txt: ${n}`];if(e.snippetKey&&e.snippets&&e.snippets.length>0){let[r]=e.snippetKey.split(":");if(r==="ui"||r==="breeze")if(e.snippets.length===1)o.push(`- snippet: ${rt(r,e.snippets[0].path)}`);else{o.push("- snippet:");for(let i of e.snippets)o.push(` - ${i.label}: ${rt(r,i.path)}`)}}j.log.message(o.join(`
11
- `))}function us(e,t){let s=e.length,n=t.length,o=Array.from({length:s+1},(r,i)=>Array.from({length:n+1},(c,m)=>i===0?m:m===0?i:0));for(let r=1;r<=s;r++)for(let i=1;i<=n;i++)o[r][i]=Math.min(o[r-1][i]+1,o[r][i-1]+1,o[r-1][i-1]+(e[r-1]!==t[i-1]?1:0));return o[s][n]}function te(e,t,s=3){let n=e.toLowerCase();return t.map(o=>({value:o,dist:us(n,o.toLowerCase())})).filter(({dist:o})=>o>0&&o<=s).sort((o,r)=>o.dist-r.dist).map(({value:o})=>o)}function hs(e,t){if(e.length===0)return;let s=[],n=t.map(i=>i.id),o=te(e[0],n);if(o.length===0){let i=t.flatMap(p=>p.sections.flatMap(y=>y.items.map(h=>`${p.id}/${y.id}/${h.id}`))),c=e.join("/"),m=te(c,i,5);m.length>0&&s.push(...m.slice(0,3))}else{let i=t.find(c=>c.id===o[0]);if(i&&e.length>=2){let c=i.sections.map(p=>p.id),m=te(e[1],c);if(m.length>0){let p=i.sections.find(y=>y.id===m[0]);if(p&&e.length>=3){let y=p.items.map(w=>w.id),h=te(e[2],y);for(let w of h.slice(0,3))s.push(`${i.id}/${p.id}/${w}`)}else for(let y of m.slice(0,3))s.push(`${i.id}/${y}`)}else{let p=i.sections.flatMap(h=>h.items.map(w=>({path:`${i.id}/${h.id}/${w.id}`,id:w.id}))),y=te(e[1],p.map(h=>h.id));for(let h of y.slice(0,3)){let w=p.find(R=>R.id===h);w&&s.push(w.path)}}}else for(let c of o.slice(0,3))s.push(c)}if(s.length===0)return;let r=["","\u{1F4A1} \uC774\uAC83\uC744 \uC758\uBBF8\uD588\uB098\uC694?"];for(let i of s)r.push(` - ${i}`);return r.join(`
12
- `)}function ys(e){return e.split("/").map(t=>t.trim()).filter(Boolean)}function ws(e,t){let s=t.toLowerCase();return e.flatMap(n=>n.sections.flatMap(o=>o.items.filter(r=>r.id.toLowerCase().includes(s)||r.title.toLowerCase().includes(s)).map(r=>({item:r,categoryLabel:n.label,sectionLabel:o.label}))))}async function ue(e){let t=await j.select({message:"\uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(s=>({label:`${s.deprecated?"(deprecated) ":""}${s.title}`,value:s,hint:s.description}))});if(j.isCancel(t))throw new E;return t}async function it(e){let t=await j.select({message:"\uC139\uC158\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(s=>({label:s.label,value:s,hint:`${s.items.length}\uAC1C \uD56D\uBAA9`}))});if(j.isCancel(t))throw new E;return t}async function bs(e){let t=await j.select({message:"\uCE74\uD14C\uACE0\uB9AC\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(s=>({label:s.label,value:s,hint:`${s.sections.reduce((n,o)=>n+o.items.length,0)}\uAC1C \uD56D\uBAA9`}))});if(j.isCancel(t))throw new E;return t}var ot=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: ${N})`,{default:N}).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,s)=>{let n=Date.now(),o=K(s);j.intro("seed-design docs");try{let r=gs.safeParse({query:t,...s});if(!r.success)throw r.error;let{data:i}=r,c=i.baseUrl??N,{start:m,stop:p}=j.spinner();m("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let y=await(async()=>{try{let f=await Me({baseUrl:c});return p("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC654\uC5B4\uC694."),f}catch(f){throw p("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),f}})(),{categories:h}=y,w;if(i.query){let f=ys(i.query),d=h.find(g=>g.id===f[0]);if(d&&f.length>=2){let g=d.sections.find($=>$.id===f[1]);if(g&&f.length>=3){let $=g.items.find(P=>P.id===f[2]);if($)w=$;else{let P=f[2].toLowerCase(),C=g.items.filter(x=>x.id.toLowerCase().includes(P)||x.title.toLowerCase().includes(P));if(C.length===0){let x=te(f[2],g.items.map(_=>_.id)),k=x.length>0?`
14
+ \uC124\uCE58\uD560 \uC758\uC874\uC131: ${p(Array.from(A).join(", ")||"\uC5C6\uC74C")}`),await be({registryItemsToAdd:b,rootPath:u,cwd:l,baseUrl:f,config:h,onDiff:a.onDiff});let{installed:P,filtered:D}=await $e({cwd:l,deps:Array.from(A)});P.size===0&&R.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),P.size&&(R.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${p(Array.from(P).join(", "))}`),D.size&&R.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${p(Array.from(D).join(", "))}`)),R.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let O=Date.now()-n,Y=new Set(b.map(c=>c.registryId)),$=w.some(c=>{let[g,...x]=c.split(":"),_=x.join(":");return y.find(T=>T.id===g)?.items.find(T=>T.id===_)?.deprecated});try{await N.track(a.cwd,{event:"add",properties:{items_count:d.length,registries:Array.from(Y),has_deprecated:$,dependencies_count:A.size,duration_ms:O}})}catch(c){o&&console.error("[Telemetry] add tracking failed:",c)}}catch(r){U(r)&&(R.outro(p(r.message)),process.exit(0)),B(r,{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 j from"@clack/prompts";import es from"path";import{z as Q}from"zod";var ts=Q.object({registryIds:Q.array(Q.string()).optional(),all:Q.boolean(),includeDeprecated:Q.boolean().optional(),cwd:Q.string(),baseUrl:Q.string().optional(),onDiff:Q.enum(["overwrite","backup"]).optional()}),Ye=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("--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,s)=>{let n=Date.now(),o=q(s);j.intro("seed-design add-all");try{let r=ts.safeParse({registryIds:t,...s});if(!r.success)throw r.error;let{data:i}=r,a=i.cwd,l=i.baseUrl,f=await ye(a),h=es.resolve(a,f.path),{start:u,stop:C}=j.spinner();u("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let k=await(async()=>{try{let $=await Promise.all((await ie({baseUrl:l})).map(async({id:c})=>oe({baseUrl:l,registryId:c})));return C("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),$}catch($){throw C("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),$}})(),y=await(async()=>{if(i.all){let c=k.map(g=>g.id);return j.log.message(`\uBAA8\uB4E0 \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${p(c.join(", "))}`),c}if(i.registryIds?.length){let c=k.map(g=>g.id);for(let g of i.registryIds)if(!c.includes(g))throw new I({message:`\uB808\uC9C0\uC2A4\uD2B8\uB9AC '${g}'\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`,details:[`\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uB808\uC9C0\uC2A4\uD2B8\uB9AC: ${c.join(", ")}`]});return j.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 $=await j.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:k.filter(({hideFromCLICatalog:c})=>!c).sort((c,g)=>g.items.length-c.items.length).map(c=>{let g=c.items[0]?.id,x=g?`${c.items.length}\uAC1C \uD56D\uBAA9 (${g} \uB4F1)`:`${c.items.length}\uAC1C \uD56D\uBAA9 (\uD56D\uBAA9 \uC5C6\uC74C)`;return{label:c.id,value:c.id,hint:x}})});if(j.isCancel($))throw new v;return j.log.message(`\uC120\uD0DD\uB41C \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4: ${p($.join(", "))}`),$})(),w=k.filter($=>y.includes($.id)),d=w.flatMap($=>$.items.filter(c=>c.deprecated?i.includeDeprecated:!0).map(c=>`${$.id}:${c.id}`)),b=w.reduce(($,c)=>$+c.items.filter(g=>g.deprecated).length,0);if(!i.includeDeprecated&&b>0&&j.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.`),!d.length)throw new v("\uCD94\uAC00\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC5B4\uC694.");j.log.message(`\uCD1D ${p(d.length.toString())}\uAC1C\uC758 \uD56D\uBAA9\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4.`);let{registryItemsToAdd:A,npmDependenciesToAdd:V}=he({selectedItemKeys:d,publicRegistries:k}),P=le({publicRegistries:k,itemKeys:A.flatMap(({registryId:$,items:c})=>c.map(g=>`${$}:${g.id}`)),projectPackageVersions:ce(i.cwd)});pe({report:P,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."}),await be({registryItemsToAdd:A,rootPath:h,cwd:a,baseUrl:l,config:f,onDiff:i.onDiff});let{installed:D,filtered:O}=await $e({cwd:a,deps:Array.from(V)});D.size===0&&j.log.message("\uBAA8\uB4E0 \uC758\uC874\uC131\uC774 \uC774\uBBF8 \uC124\uCE58\uB418\uC5B4 \uC788\uC5B4\uC694."),D.size&&(j.log.message(`\uC758\uC874\uC131 \uC124\uCE58 \uC644\uB8CC: ${p(Array.from(D).join(", "))}`),O.size&&j.log.message(`\uC124\uCE58\uD558\uC9C0 \uC54A\uC740 \uC758\uC874\uC131 (\uC774\uBBF8 \uC124\uCE58\uB428): ${p(Array.from(O).join(", "))}`)),j.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let Y=Date.now()-n;try{await N.track(i.cwd,{event:"add-all",properties:{registries:y,items_count:d.length,include_deprecated:i.includeDeprecated||!1,dependencies_count:V.size,duration_ms:Y}})}catch($){o&&console.error("[Telemetry] add-all tracking failed:",$)}}catch(r){U(r)&&(j.outro(p(r.message)),process.exit(0)),B(r,{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 M from"@clack/prompts";import Xe from"path";import{z}from"zod";var ss=z.object({itemIds:z.array(z.string()).optional(),component:z.union([z.string(),z.array(z.string())]).optional(),all:z.boolean(),registry:z.string().optional(),cwd:z.string(),baseUrl:z.string().optional()});function rs({itemIds:e,component:t}){let s=r=>r.trim().replace(/\s+/g,"-"),n=(e??[]).map(s).filter(Boolean),o=(Array.isArray(t)?t:[t]).filter(r=>!!r).flatMap(r=>r.split(",")).map(s).filter(Boolean);return Array.from(new Set([...n,...o]))}function is({publicRegistries:e,targetInputs:t,defaultRegistry:s}){let n=e.filter(r=>typeof r.id=="string"&&Array.isArray(r.items)).flatMap(r=>r.items.filter(i=>typeof i.id=="string").map(i=>`${r.id}:${i.id}`)),o=new Set;for(let r of t){let i=r.includes(":")?r:s?`${s}:${r}`:(()=>{let a=n.filter(l=>l.endsWith(`:${r}`));if(!a.length)throw new I({message:`${p(r)}: \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(a.length>1)throw new I({message:`${p(r)}: \uAC19\uC740 \uC774\uB984\uC758 \uD56D\uBAA9\uC774 \uC5EC\uB7EC \uB808\uC9C0\uC2A4\uD2B8\uB9AC\uC5D0 \uC788\uC5B4\uC694.`,details:a.map(l=>`- ${l}`),hint:`${p("ui:action-button")}\uCC98\uB7FC registry\uB97C \uD3EC\uD568\uD574\uC11C \uC785\uB825\uD574\uBCF4\uC138\uC694.`});return a[0]})();if(!n.includes(i))throw new I({message:`${p(i)}: \uD56D\uBAA9\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.`});o.add(i)}return Array.from(o)}var Qe=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}).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,s)=>{let n=Date.now(),o=q(s);M.intro("seed-design compat");try{let r=ss.safeParse({itemIds:t,...s});if(!r.success)throw r.error;let{data:i}=r,{start:a,stop:l}=M.spinner();a("Registry\uB97C \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let f=await(async()=>{try{let w=await Promise.all((await ie({baseUrl:i.baseUrl})).map(async({id:d})=>oe({baseUrl:i.baseUrl,registryId:d})));return l("Registry\uB97C \uAC00\uC838\uC654\uC5B4\uC694."),w}catch(w){throw l("Registry\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),w}})(),h=rs({itemIds:i.itemIds,component:i.component}),u=i.all?f.flatMap(d=>d.items.map(b=>`${d.id}:${b.id}`)):h.length>0?is({publicRegistries:f,targetInputs:h,defaultRegistry:i.registry}):me(i.cwd),C=Array.isArray(u)?u:await(async()=>{let w=await u;if(!w)throw new I({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 d=Xe.resolve(i.cwd,w.path),b=Je({publicRegistries:f,rootPath:d});return b.length?b:(M.log.info(`${p(Xe.relative(i.cwd,d)||w.path)}\uC5D0\uC11C \uC124\uCE58\uB41C \uC2A4\uB2C8\uD3AB\uC744 \uCC3E\uC9C0 \uBABB\uD588\uC5B4\uC694.`),[])})();C.length||(M.outro("\uAC80\uC0AC\uD560 \uC2A4\uB2C8\uD3AB\uC774 \uC5C6\uC5B4\uC694."),process.exit(0));let k=ce(i.cwd),y=le({publicRegistries:f,itemKeys:C,projectPackageVersions:k});if(M.log.info(`\uAC80\uC0AC \uB300\uC0C1: ${p(y.checkedItemKeys.join(", "))}`),!y.issues.length){M.outro("\uBAA8\uB4E0 \uC2A4\uB2C8\uD3AB\uC774 \uD604\uC7AC @seed-design/react, @seed-design/css\uC640 \uD638\uD658\uB3FC\uC694.");try{await N.track(i.cwd,{event:"compat",properties:{checked_items_count:y.checkedItemKeys.length,incompatible_items_count:0,duration_ms:Date.now()-n}})}catch(w){o&&console.error("[Telemetry] compat tracking failed:",w)}process.exit(0)}pe({report:y,title:"\uD604\uC7AC \uD504\uB85C\uC81D\uD2B8 \uBC84\uC804\uACFC \uD638\uD658\uB418\uC9C0 \uC54A\uB294 \uC2A4\uB2C8\uD3AB\uC744 \uCC3E\uC558\uC5B4\uC694."}),M.log.info("\uD544\uC694\uD55C \uBC84\uC804\uC73C\uB85C @seed-design/react \uB610\uB294 @seed-design/css\uB97C \uB9DE\uCD98 \uB4A4 \uB2E4\uC2DC \uC2E4\uD589\uD574\uBCF4\uC138\uC694."),M.outro("\uD638\uD658\uC131 \uC774\uC288\uAC00 \uC788\uC5B4\uC694.");try{await N.track(i.cwd,{event:"compat",properties:{checked_items_count:y.checkedItemKeys.length,incompatible_items_count:new Set(y.issues.map(w=>w.itemKey)).size,issue_count:y.issues.length,duration_ms:Date.now()-n}})}catch(w){o&&console.error("[Telemetry] compat tracking failed:",w)}process.exit(1)}catch(r){U(r)&&(M.outro(p(r.message)),process.exit(0)),B(r,{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 E from"@clack/prompts";import{z as Ce}from"zod";var os="https://raw.githubusercontent.com/daangn/seed-design/refs/heads/dev/docs/registry",ns=Ce.object({query:Ce.string().optional(),baseUrl:Ce.string().optional(),raw:Ce.boolean()});function Ze(e,t){return`${os}/${e}/${t}`}function as(e,t){let s=`${t}${e.docUrl}`,n=`${t}/llms${e.docUrl}.txt`,o=[e.id,`- docs: ${s}`,`- llms.txt: ${n}`];if(e.snippetKey&&e.snippets&&e.snippets.length>0){let[r]=e.snippetKey.split(":");if(r==="ui"||r==="breeze")if(e.snippets.length===1)o.push(`- snippet: ${Ze(r,e.snippets[0].path)}`);else{o.push("- snippet:");for(let i of e.snippets)o.push(` - ${i.label}: ${Ze(r,i.path)}`)}}E.log.message(o.join(`
15
+ `))}function cs(e,t){let s=e.length,n=t.length,o=Array.from({length:s+1},(r,i)=>Array.from({length:n+1},(a,l)=>i===0?l:l===0?i:0));for(let r=1;r<=s;r++)for(let i=1;i<=n;i++)o[r][i]=Math.min(o[r-1][i]+1,o[r][i-1]+1,o[r-1][i-1]+(e[r-1]!==t[i-1]?1:0));return o[s][n]}function Z(e,t,s=3){let n=e.toLowerCase();return t.map(o=>({value:o,dist:cs(n,o.toLowerCase())})).filter(({dist:o})=>o>0&&o<=s).sort((o,r)=>o.dist-r.dist).map(({value:o})=>o)}function ls(e,t){if(e.length===0)return;let s=[],n=t.map(i=>i.id),o=Z(e[0],n);if(o.length===0){let i=t.flatMap(f=>f.sections.flatMap(h=>h.items.map(u=>`${f.id}/${h.id}/${u.id}`))),a=e.join("/"),l=Z(a,i,5);l.length>0&&s.push(...l.slice(0,3))}else{let i=t.find(a=>a.id===o[0]);if(i&&e.length>=2){let a=i.sections.map(f=>f.id),l=Z(e[1],a);if(l.length>0){let f=i.sections.find(h=>h.id===l[0]);if(f&&e.length>=3){let h=f.items.map(C=>C.id),u=Z(e[2],h);for(let C of u.slice(0,3))s.push(`${i.id}/${f.id}/${C}`)}else for(let h of l.slice(0,3))s.push(`${i.id}/${h}`)}else{let f=i.sections.flatMap(u=>u.items.map(C=>({path:`${i.id}/${u.id}/${C.id}`,id:C.id}))),h=Z(e[1],f.map(u=>u.id));for(let u of h.slice(0,3)){let C=f.find(k=>k.id===u);C&&s.push(C.path)}}}else for(let a of o.slice(0,3))s.push(a)}if(s.length===0)return;let r=["","\u{1F4A1} \uC774\uAC83\uC744 \uC758\uBBF8\uD588\uB098\uC694?"];for(let i of s)r.push(` - ${i}`);return r.join(`
16
+ `)}function ps(e){return e.split("/").map(t=>t.trim()).filter(Boolean)}function ms(e,t){let s=t.toLowerCase();return e.flatMap(n=>n.sections.flatMap(o=>o.items.filter(r=>r.id.toLowerCase().includes(s)||r.title.toLowerCase().includes(s)).map(r=>({item:r,categoryLabel:n.label,sectionLabel:o.label}))))}async function fe(e){let t=await E.select({message:"\uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(s=>({label:`${s.deprecated?"(deprecated) ":""}${s.title}`,value:s,hint:s.description}))});if(E.isCancel(t))throw new v;return t}async function et(e){let t=await E.select({message:"\uC139\uC158\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(s=>({label:s.label,value:s,hint:`${s.items.length}\uAC1C \uD56D\uBAA9`}))});if(E.isCancel(t))throw new v;return t}async function ds(e){let t=await E.select({message:"\uCE74\uD14C\uACE0\uB9AC\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:e.map(s=>({label:s.label,value:s,hint:`${s.sections.reduce((n,o)=>n+o.items.length,0)}\uAC1C \uD56D\uBAA9`}))});if(E.isCancel(t))throw new v;return t}var tt=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}).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 react/components").example("seed-design docs react/components/action-button").example("seed-design docs react/updates/changelog --raw").action(async(t,s)=>{let n=Date.now(),o=q(s),r=s.raw??!1;r||E.intro("seed-design docs");try{let i=ns.safeParse({query:t,...s});if(!i.success)throw i.error;let{data:a}=i,l=a.baseUrl??G;if(a.raw&&!a.query)throw new I({message:"--raw \uBAA8\uB4DC\uC5D0\uC11C\uB294 \uCFFC\uB9AC\uAC00 \uD544\uC694\uD574\uC694.",hint:"\uC608: `seed-design docs react/updates/changelog --raw`"});let f=await(async()=>{if(r)return await Re({baseUrl:l});let{start:y,stop:w}=E.spinner();y("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");try{let d=await Re({baseUrl:l});return w("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC654\uC5B4\uC694."),d}catch(d){throw w("\uBB38\uC11C \uBAA9\uB85D\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),d}})(),{categories:h}=f,u,C=async()=>{if(a.query){let d=ps(a.query);if(r&&d.length>3)return;let b=h.find(P=>P.id===d[0]);if(b&&d.length>=2){let P=b.sections.find($=>$.id===d[1]);if(P&&d.length>=3){let $=P.items.find(x=>x.id===d[2]);if($)return $;let c=d[2].toLowerCase(),g=P.items.filter(x=>x.id.toLowerCase().includes(c)||x.title.toLowerCase().includes(c));if(g.length===0){let x=Z(d[2],P.items.map(T=>T.id)),_=x.length>0?`
13
17
 
14
18
  \u{1F4A1} \uC774\uAC83\uC744 \uC758\uBBF8\uD588\uB098\uC694?
15
- ${x.slice(0,3).map(_=>` - ${d.id}/${g.id}/${_}`).join(`
16
- `)}`:"";throw new I({message:`${a(i.query)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.${k}`,hint:`\`seed-design docs ${d.id}/${g.id}\`\uB85C \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694.`})}C.length===1?w=C[0]:w=await ue(C)}}else if(g)w=await ue(g.items);else{let $=f[1].toLowerCase(),P=d.sections.flatMap(C=>C.items.filter(x=>x.id.toLowerCase().includes($)||x.title.toLowerCase().includes($)).map(x=>({item:x,sectionLabel:C.label})));if(P.length===0){let C=d.sections.map(l=>l.id),x=te(f[1],C),k=d.sections.flatMap(l=>l.items.map(b=>({path:`${d.id}/${l.id}/${b.id}`,id:b.id}))),_=te(f[1],k.map(l=>l.id)),X=[...x.slice(0,2).map(l=>`${d.id}/${l}`),..._.slice(0,2).map(l=>k.find(b=>b.id===l)?.path).filter(l=>l!=null)],S=X.length>0?`
19
+ ${x.slice(0,3).map(T=>` - ${b.id}/${P.id}/${T}`).join(`
20
+ `)}`:"";throw new I({message:`${p(a.query)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.${_}`,hint:`\`seed-design docs ${b.id}/${P.id}\`\uB85C \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694.`})}return g.length===1?g[0]:await fe(g)}if(P)return await fe(P.items);let D=d[1].toLowerCase(),O=b.sections.flatMap($=>$.items.filter(c=>c.id.toLowerCase().includes(D)||c.title.toLowerCase().includes(D)).map(c=>({item:c,sectionLabel:$.label})));if(O.length===0){let $=b.sections.map(S=>S.id),c=Z(d[1],$),g=b.sections.flatMap(S=>S.items.map(ge=>({path:`${b.id}/${S.id}/${ge.id}`,id:ge.id}))),x=Z(d[1],g.map(S=>S.id)),_=[...c.slice(0,2).map(S=>`${b.id}/${S}`),...x.slice(0,2).map(S=>g.find(ge=>ge.id===S)?.path).filter(S=>S!=null)],T=_.length>0?`
17
21
 
18
22
  \u{1F4A1} \uC774\uAC83\uC744 \uC758\uBBF8\uD588\uB098\uC694?
19
- ${X.map(l=>` - ${l}`).join(`
20
- `)}`:"";throw new I({message:`${a(i.query)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.${S}`,hint:`\`seed-design docs ${d.id}\`\uB85C \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694.`})}if(P.length===1)w=P[0].item;else{let C=await j.select({message:`${a(f[1])}\uC5D0 \uD574\uB2F9\uD558\uB294 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`,options:P.map(({item:x,sectionLabel:k})=>({label:`[${k}] ${x.title}`,value:x,hint:x.description}))});if(j.isCancel(C))throw new E;w=C}}}else if(d)if(d.sections.length===1)w=await ue(d.sections[0].items);else{let g=await it(d.sections);w=await ue(g.items)}else{let g=ws(h,i.query);if(g.length===0){let $=hs(f,h);throw new I({message:`${a(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(g.length===1)w=g[0].item;else{let $=await j.select({message:`${a(i.query)}\uC5D0 \uD574\uB2F9\uD558\uB294 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`,options:g.map(({item:P,categoryLabel:C,sectionLabel:x})=>({label:`[${C} > ${x}] ${P.title}`,value:P,hint:P.description}))});if(j.isCancel($))throw new E;w=$}}}else{let f=await bs(h),d;f.sections.length===1?d=f.sections[0]:d=await it(f.sections),w=await ue(d.items)}fs(w,c),j.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let R=Date.now()-n;try{await U.track(process.cwd(),{event:"docs",properties:{query:i.query??null,item_id:w.id,has_snippet:!!(w.snippets&&w.snippets.length>0),duration_ms:R}})}catch(f){o&&console.error("[Telemetry] docs tracking failed:",f)}}catch(r){L(r)&&(j.outro(a(r.message)),process.exit(0)),O(r,{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 z from"@clack/prompts";import{z as Ie}from"zod";import $s from"dedent";var Cs=Ie.object({cwd:Ie.string(),yes:Ie.boolean().optional(),default:Ie.boolean().optional()}),nt=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 s=Date.now(),n=K(t);z.intro("seed-design.json \uD30C\uC77C \uC0DD\uC131");try{let o=Cs.safeParse(t);if(!o.success)throw o.error;let r=o.data,i=r.yes||r.default,c=i?q:await Te(),{start:m,stop:p}=z.spinner();m("seed-design.json \uD30C\uC77C \uC0DD\uC131\uC911...");let y=await(async()=>{try{return(await he({cwd:r.cwd,config:c})).relativePath}catch(w){throw p("seed-design.json \uD30C\uC77C \uC0DD\uC131\uC774 \uC911\uB2E8\uB410\uC5B4\uC694."),w}})();p(`seed-design.json \uD30C\uC77C\uC774 ${a(y)}\uC5D0 \uC0DD\uC131\uB410\uC5B4\uC694.`),z.log.info(a("seed-design add {component} \uBA85\uB839\uC5B4\uB85C \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uCD94\uAC00\uD574\uBCF4\uC138\uC694!")),z.log.info(a("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.")),z.note($s(`SEED Design CLI\uB294 \uAC1C\uC120\uC744 \uC704\uD574 \uC775\uBA85 \uC0AC\uC6A9 \uB370\uC774\uD130\uB97C \uC218\uC9D1\uD574\uC694.
23
+ ${_.map(S=>` - ${S}`).join(`
24
+ `)}`:"";throw new I({message:`${p(a.query)}: \uBB38\uC11C\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.${T}`,hint:`\`seed-design docs ${b.id}\`\uB85C \uBAA9\uB85D\uC744 \uD655\uC778\uD574\uBCF4\uC138\uC694.`})}if(O.length===1)return O[0].item;let Y=await E.select({message:`${p(d[1])}\uC5D0 \uD574\uB2F9\uD558\uB294 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`,options:O.map(({item:$,sectionLabel:c})=>({label:`[${c}] ${$.title}`,value:$,hint:$.description}))});if(E.isCancel(Y))throw new v;return Y}if(b){if(b.sections.length===1)return await fe(b.sections[0].items);let P=await et(b.sections);return await fe(P.items)}let A=ms(h,a.query);if(A.length===0){let P=ls(d,h);throw new I({message:`${p(a.query)}: \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(A.length===1)return A[0].item;let V=await E.select({message:`${p(a.query)}\uC5D0 \uD574\uB2F9\uD558\uB294 \uD56D\uBAA9\uC744 \uC120\uD0DD\uD574\uC8FC\uC138\uC694`,options:A.map(({item:P,categoryLabel:D,sectionLabel:O})=>({label:`[${D} > ${O}] ${P.title}`,value:P,hint:P.description}))});if(E.isCancel(V))throw new v;return V}let y=await ds(h),w;return y.sections.length===1?w=y.sections[0]:w=await et(y.sections),await fe(w.items)};if(r)try{u=await C()}catch(y){if(U(y))throw y}else u=await C();if(r){let y;if(u){let w=`${l}/llms${u.docUrl}.txt`;y=await De({url:w})}else y=await Oe({baseUrl:l,query:a.query});console.log(y)}else as(u,l),E.outro("\uC644\uB8CC\uD588\uC5B4\uC694.");let k=Date.now()-n;try{await N.track(process.cwd(),{event:"docs",properties:{query:a.query??null,item_id:u?.id??a.query??null,has_snippet:!!(u?.snippets&&u.snippets.length>0),duration_ms:k}})}catch(y){o&&console.error("[Telemetry] docs tracking failed:",y)}}catch(i){if(U(i)&&(r||E.outro(p(i.message)),process.exit(0)),r){let a=i instanceof Error?i.message:String(i);console.error(a),process.exit(1)}B(i,{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 L from"@clack/prompts";import{z as Ie}from"zod";import fs from"dedent";var gs=Ie.object({cwd:Ie.string(),yes:Ie.boolean().optional(),default:Ie.boolean().optional()}),st=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 s=Date.now(),n=q(t);L.intro("seed-design.json \uD30C\uC77C \uC0DD\uC131");try{let o=gs.safeParse(t);if(!o.success)throw o.error;let r=o.data,i=r.yes||r.default,a=i?K:await ke(),{start:l,stop:f}=L.spinner();l("seed-design.json \uD30C\uC77C \uC0DD\uC131\uC911...");let h=await(async()=>{try{return(await ue({cwd:r.cwd,config:a})).relativePath}catch(C){throw f("seed-design.json \uD30C\uC77C \uC0DD\uC131\uC774 \uC911\uB2E8\uB410\uC5B4\uC694."),C}})();f(`seed-design.json \uD30C\uC77C\uC774 ${p(h)}\uC5D0 \uC0DD\uC131\uB410\uC5B4\uC694.`),L.log.info(p("seed-design add {component} \uBA85\uB839\uC5B4\uB85C \uCEF4\uD3EC\uB10C\uD2B8\uB97C \uCD94\uAC00\uD574\uBCF4\uC138\uC694!")),L.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.")),L.note(fs(`SEED Design CLI\uB294 \uAC1C\uC120\uC744 \uC704\uD574 \uC775\uBA85 \uC0AC\uC6A9 \uB370\uC774\uD130\uB97C \uC218\uC9D1\uD574\uC694.
21
25
 
22
26
  \uBE44\uD65C\uC131\uD654\uD558\uB824\uBA74:
23
- \u2022 seed-design.json\uC5D0\uC11C ${a('"telemetry": false')}\uB85C \uC124\uC815
24
- \u2022 ${a("DISABLE_TELEMETRY=true")} \uD658\uACBD \uBCC0\uC218 \uC124\uC815
27
+ \u2022 seed-design.json\uC5D0\uC11C ${p('"telemetry": false')}\uB85C \uC124\uC815
28
+ \u2022 ${p("DISABLE_TELEMETRY=true")} \uD658\uACBD \uBCC0\uC218 \uC124\uC815
25
29
 
26
- \uC790\uC138\uD55C \uB0B4\uC6A9: https://seed-design.com/react/getting-started/cli/configuration#telemetry`),"Telemetry \uC548\uB0B4"),z.outro("\uC791\uC5C5\uC774 \uC644\uB8CC\uB410\uC5B4\uC694.");let h=Date.now()-s;try{await U.track(r.cwd,{event:"init",properties:{tsx:c.tsx,rsc:c.rsc,telemetry:c.telemetry,yes_option:i,duration_ms:h}})}catch(w){n&&console.error("[Telemetry] init tracking failed:",w)}}catch(o){L(o)&&(z.outro(a(o.message)),process.exit(0)),O(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*as D from"@clack/prompts";import{coerce as Is,valid as xs}from"semver";import{z as me}from"zod";var ke="@seed-design/",Ps=me.object({packageName:me.string().optional(),cwd:me.string(),baseUrl:me.string(),raw:me.boolean(),all:me.boolean()});function ks(e){return e.startsWith(ke)?e:`${ke}${e}`}function Ss(e){return e.replace(ke,"")}function Rs(e){let t=Z(e),s={...t.dependencies,...t.devDependencies,...t.peerDependencies,...t.optionalDependencies},n={};for(let[o,r]of Object.entries(s))o.startsWith(ke)&&r&&(n[o]=r);return n}function Es(e){let t=e.trim();if(t.startsWith("workspace:")&&(t=t.slice(10).trim()),t.startsWith("npm:")){let n=t.lastIndexOf("@");n>4&&(t=t.slice(n+1))}if(xs(t))return t;let s=Is(t);return s?s.version:null}async function xe({targetPackage:e,currentVersionSpec:t,baseUrl:s}){let n=Es(t);if(!n)throw new I({message:`${e}\uC758 \uBC84\uC804\uC744 \uD30C\uC2F1\uD560 \uC218 \uC5C6\uC5B4\uC694: ${t}`,hint:"package.json\uC5D0\uC11C \uBC84\uC804 \uD615\uC2DD\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694."});let o=await Ve(e);if(n===o)return{package:e,currentVersion:n,latestVersion:o,upToDate:!0,changelog:null};let r=Ss(e),i=await Le({baseUrl:s,packageSlug:r,version:n});return{package:e,currentVersion:n,latestVersion:o,upToDate:!1,changelog:i}}function at(e){e.error?console.error(`## ${e.package}
27
-
28
- Error: ${e.error}
29
- `):e.upToDate?console.log(`${e.package}@${e.currentVersion} is already up to date.
30
- `):(console.log(e.changelog),console.log(""))}function ct(e){e.error?D.log.error(`${a(e.package)}: ${e.error}`):e.upToDate?D.log.info(`${a(e.package)}: ${a(e.currentVersion)} \u2014 \uC774\uBBF8 \uCD5C\uC2E0 \uBC84\uC804\uC774\uC5D0\uC694.`):(D.log.info(`${a(e.package)}: ${a(e.currentVersion)} \u2192 ${a(e.latestVersion)}`),D.log.message(e.changelog??""),D.log.info(`\uC5C5\uADF8\uB808\uC774\uB4DC\uD558\uB824\uBA74: ${a(`bun add ${e.package}@${e.latestVersion}`)}`))}async function Pe(e,t,s){try{for(let n of t)await U.track(e,{event:"upgrade",properties:{package:n.package,current_version:n.currentVersion,latest_version:n.latestVersion,up_to_date:n.upToDate,duration_ms:Date.now()-s}})}catch{}}var pt=e=>{e.command("upgrade [package-name]","\uD328\uD0A4\uC9C0\uC758 \uD604\uC7AC \uBC84\uC804\uACFC \uCD5C\uC2E0 \uBC84\uC804 \uC0AC\uC774\uC758 \uBCC0\uACBD\uC0AC\uD56D\uC744 \uD655\uC778\uD569\uB2C8\uB2E4").option("-c, --cwd <cwd>","\uC791\uC5C5 \uB514\uB809\uD1A0\uB9AC. \uAE30\uBCF8\uAC12\uC740 \uD604\uC7AC \uB514\uB809\uD1A0\uB9AC\uC785\uB2C8\uB2E4.",{default:process.cwd()}).option("-u, --baseUrl <baseUrl>","changelog\uB97C \uC870\uD68C\uD560 base URL\uC785\uB2C8\uB2E4.",{default:N}).option("--raw","UI \uC5C6\uC774 \uC21C\uC218 \uB9C8\uD06C\uB2E4\uC6B4\uB9CC \uCD9C\uB825\uD569\uB2C8\uB2E4. LLM \uD30C\uC774\uD504\uC5D0 \uC720\uC6A9\uD569\uB2C8\uB2E4.",{default:!1}).option("-a, --all","\uC124\uCE58\uB41C \uBAA8\uB4E0 @seed-design \uD328\uD0A4\uC9C0\uC758 \uBCC0\uACBD\uC0AC\uD56D\uC744 \uD655\uC778\uD569\uB2C8\uB2E4.",{default:!1}).example("seed-design upgrade").example("seed-design upgrade react").example("seed-design upgrade --all").example("seed-design upgrade --all --raw").action(async(t,s)=>{let n=Date.now(),o=K(s),r=Ps.safeParse({packageName:t,...s});r.success||(s.raw&&(console.error(r.error.message),process.exit(1)),D.intro("seed-design upgrade"),O(r.error,{defaultMessage:"\uC5C5\uADF8\uB808\uC774\uB4DC \uD655\uC778\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));let{data:i}=r,{raw:c,all:m}=i;c||D.intro("seed-design upgrade");try{let p=Rs(i.cwd),y=Object.keys(p);if(y.length===0)throw new I({message:"\uD504\uB85C\uC81D\uD2B8\uC5D0 \uC124\uCE58\uB41C @seed-design \uD328\uD0A4\uC9C0\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC5B4\uC694.",hint:"`bun add @seed-design/react`\uB85C \uD328\uD0A4\uC9C0\uB97C \uC124\uCE58\uD574\uBCF4\uC138\uC694."});if(i.packageName&&m)throw new I({message:"\uD328\uD0A4\uC9C0\uBA85\uACFC --all \uC635\uC158\uC744 \uB3D9\uC2DC\uC5D0 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC5B4\uC694.",hint:"`seed-design upgrade --all` \uB610\uB294 `seed-design upgrade react` \uC911 \uD558\uB098\uB9CC \uC0AC\uC6A9\uD574\uC8FC\uC138\uC694."});if(m){if(c){let C=await Promise.all(y.map(k=>xe({targetPackage:k,currentVersionSpec:p[k],baseUrl:i.baseUrl}).catch(_=>({package:k,currentVersion:p[k],latestVersion:"unknown",upToDate:!1,changelog:null,error:_ instanceof Error?_.message:String(_)}))));for(let k of C)at(k);await Pe(i.cwd,C,n);let x=C.some(k=>"error"in k&&!!k.error);process.exit(x?1:0)}let{start:d,stop:g}=D.spinner();d("\uBAA8\uB4E0 \uD328\uD0A4\uC9C0\uC758 \uBCC0\uACBD\uC0AC\uD56D\uC744 \uAC00\uC838\uC624\uACE0 \uC788\uC5B4\uC694...");let $=await Promise.all(y.map(C=>xe({targetPackage:C,currentVersionSpec:p[C],baseUrl:i.baseUrl}).catch(x=>({package:C,currentVersion:p[C],latestVersion:"unknown",upToDate:!1,changelog:null,error:x instanceof Error?x.message:String(x)}))));g("\uBCC0\uACBD\uC0AC\uD56D\uC744 \uAC00\uC838\uC654\uC5B4\uC694.");for(let C of $)ct(C);D.outro("\uC644\uB8CC\uD588\uC5B4\uC694."),await Pe(i.cwd,$,n);let P=$.some(C=>"error"in C&&!!C.error);process.exit(P?1:0)}let h;if(i.packageName){if(h=ks(i.packageName),!p[h])throw new I({message:`${a(h)}: \uD504\uB85C\uC81D\uD2B8\uC5D0 \uC124\uCE58\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC544\uC694.`,hint:`\uC124\uCE58\uB41C \uD328\uD0A4\uC9C0: ${y.map(d=>a(d)).join(", ")}`})}else{if(c)throw new I({message:"--raw \uBAA8\uB4DC\uC5D0\uC11C\uB294 \uD328\uD0A4\uC9C0\uBA85 \uB610\uB294 --all \uC635\uC158\uC774 \uD544\uC694\uD574\uC694.",hint:"\uC608: `seed-design upgrade react --raw` \uB610\uB294 `seed-design upgrade --all --raw`"});if(y.length===1)h=y[0];else{let d=await D.select({message:"\uBCC0\uACBD\uC0AC\uD56D\uC744 \uD655\uC778\uD560 \uD328\uD0A4\uC9C0\uB97C \uC120\uD0DD\uD574\uC8FC\uC138\uC694",options:y.map(g=>({label:g,value:g,hint:p[g]}))});if(D.isCancel(d))throw new E;h=d}}if(c){let d=await xe({targetPackage:h,currentVersionSpec:p[h],baseUrl:i.baseUrl});at(d),await Pe(i.cwd,[d],n),process.exit(0)}let{start:w,stop:R}=D.spinner();w("\uCD5C\uC2E0 \uBC84\uC804\uC744 \uD655\uC778\uD558\uACE0 \uC788\uC5B4\uC694...");let f;try{f=await xe({targetPackage:h,currentVersionSpec:p[h],baseUrl:i.baseUrl}),R("\uBCC0\uACBD\uC0AC\uD56D\uC744 \uAC00\uC838\uC654\uC5B4\uC694.")}catch(d){throw R("\uBCC0\uACBD\uC0AC\uD56D\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC5B4\uC694."),d}ct(f),D.outro("\uC644\uB8CC\uD588\uC5B4\uC694."),await Pe(i.cwd,[f],n)}catch(p){if(L(p)&&(c||D.outro(a(p.message)),process.exit(0)),c){let y=p instanceof Error?p.message:String(p);console.error(y),process.exit(1)}O(p,{defaultMessage:"\uC5C5\uADF8\uB808\uC774\uB4DC \uD655\uC778\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{cac as vs}from"cac";var js="seed-design",W=vs(js);async function Ts(){let e=Z();W.option("--verbose","\uC624\uB958 \uC0C1\uC138 \uC815\uBCF4\uB97C \uCD9C\uB825\uD569\uB2C8\uB2E4."),Ze(W),et(W),st(W),ot(W),nt(W),pt(W),W.version(e.version||"1.0.0","-v, --version"),W.help(),W.parse()}Ts();
30
+ \uC790\uC138\uD55C \uB0B4\uC6A9: https://seed-design.com/react/getting-started/cli/configuration#telemetry`),"Telemetry \uC548\uB0B4"),L.outro("\uC791\uC5C5\uC774 \uC644\uB8CC\uB410\uC5B4\uC694.");let u=Date.now()-s;try{await N.track(r.cwd,{event:"init",properties:{tsx:a.tsx,rsc:a.rsc,telemetry:a.telemetry,yes_option:i,duration_ms:u}})}catch(C){n&&console.error("[Telemetry] init tracking failed:",C)}}catch(o){U(o)&&(L.outro(p(o.message)),process.exit(0)),B(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 us}from"cac";var ys="seed-design",W=us(ys);async function hs(){let e=ae();W.option("--verbose","\uC624\uB958 \uC0C1\uC138 \uC815\uBCF4\uB97C \uCD9C\uB825\uD569\uB2C8\uB2E4."),We(W),Ye(W),Qe(W),tt(W),st(W),W.version(e.version||"1.0.0","-v, --version"),W.help(),W.parse()}hs();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seed-design/cli",
3
- "version": "1.3.1",
3
+ "version": "1.3.2",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,4 +1,4 @@
1
- import { fetchDocsIndex } from "@/src/utils/fetch";
1
+ import { fetchDocsIndex, fetchLlmsTxt, tryFetchLlmsTxt } from "@/src/utils/fetch";
2
2
  import * as p from "@clack/prompts";
3
3
  import type { CAC } from "cac";
4
4
  import { z } from "zod";
@@ -20,6 +20,7 @@ const GITHUB_SNIPPET_BASE =
20
20
  const docsOptionsSchema = z.object({
21
21
  query: z.string().optional(),
22
22
  baseUrl: z.string().optional(),
23
+ raw: z.boolean(),
23
24
  });
24
25
 
25
26
  function buildSnippetUrl(registryId: string, snippetPath: string): string {
@@ -232,15 +233,21 @@ export const docsCommand = (cli: CAC) => {
232
233
  .option("-u, --baseUrl <baseUrl>", `레지스트리의 기본 URL (기본값: ${BASE_URL})`, {
233
234
  default: BASE_URL,
234
235
  })
236
+ .option("--raw", "llms.txt 내용을 직접 가져와 출력합니다. LLM 파이프에 유용합니다.", {
237
+ default: false,
238
+ })
235
239
  .example("seed-design docs")
236
240
  .example("seed-design docs action-button")
237
241
  .example("seed-design docs react")
238
242
  .example("seed-design docs react/components")
239
243
  .example("seed-design docs react/components/action-button")
244
+ .example("seed-design docs react/updates/changelog --raw")
240
245
  .action(async (query, opts) => {
241
246
  const startTime = Date.now();
242
247
  const verbose = isVerboseMode(opts);
243
- p.intro("seed-design docs");
248
+ const raw = opts.raw ?? false;
249
+
250
+ if (!raw) p.intro("seed-design docs");
244
251
 
245
252
  try {
246
253
  const parsed = docsOptionsSchema.safeParse({ query, ...opts });
@@ -251,10 +258,19 @@ export const docsCommand = (cli: CAC) => {
251
258
  const { data: options } = parsed;
252
259
  const baseUrl = options.baseUrl ?? BASE_URL;
253
260
 
254
- const { start, stop } = p.spinner();
255
- start("문서 목록을 가져오고 있어요...");
261
+ if (options.raw && !options.query) {
262
+ throw new CliError({
263
+ message: "--raw 모드에서는 쿼리가 필요해요.",
264
+ hint: "예: `seed-design docs react/updates/changelog --raw`",
265
+ });
266
+ }
256
267
 
257
268
  const docsIndex = await (async () => {
269
+ if (raw) {
270
+ return await fetchDocsIndex({ baseUrl });
271
+ }
272
+ const { start, stop } = p.spinner();
273
+ start("문서 목록을 가져오고 있어요...");
258
274
  try {
259
275
  const index = await fetchDocsIndex({ baseUrl });
260
276
  stop("문서 목록을 가져왔어요.");
@@ -266,23 +282,31 @@ export const docsCommand = (cli: CAC) => {
266
282
  })();
267
283
 
268
284
  const { categories } = docsIndex;
269
- let selectedItem: DocsItem;
285
+ let selectedItem: DocsItem | undefined;
270
286
 
271
- if (options.query) {
272
- const segments = parseQueryPath(options.query);
287
+ // In --raw mode, wrap index resolution in try-catch to allow fallback to direct URL
288
+ const resolveFromIndex = async (): Promise<DocsItem | undefined> => {
289
+ if (options.query) {
290
+ const segments = parseQueryPath(options.query);
273
291
 
274
- // Try to resolve as path: category / section / item
275
- const matchedCategory = categories.find((c) => c.id === segments[0]);
292
+ // Deep paths (more than category/section/item) can't be resolved from index
293
+ // e.g., react/updates/changelog/react/1.2.9 skip to fallback in --raw mode
294
+ if (raw && segments.length > 3) {
295
+ return undefined;
296
+ }
297
+
298
+ // Try to resolve as path: category / section / item
299
+ const matchedCategory = categories.find((c) => c.id === segments[0]);
276
300
 
277
- if (matchedCategory && segments.length >= 2) {
278
- const matchedSection = matchedCategory.sections.find((s) => s.id === segments[1]);
301
+ if (matchedCategory && segments.length >= 2) {
302
+ const matchedSection = matchedCategory.sections.find((s) => s.id === segments[1]);
279
303
 
280
- if (matchedSection && segments.length >= 3) {
281
- // Full path: category/section/item
282
- const matchedItem = matchedSection.items.find((i) => i.id === segments[2]);
283
- if (matchedItem) {
284
- selectedItem = matchedItem;
285
- } else {
304
+ if (matchedSection && segments.length >= 3) {
305
+ // Full path: category/section/item
306
+ const matchedItem = matchedSection.items.find((i) => i.id === segments[2]);
307
+ if (matchedItem) {
308
+ return matchedItem;
309
+ }
286
310
  // Item not found in section — search within the section
287
311
  const q = segments[2].toLowerCase();
288
312
  const matched = matchedSection.items.filter(
@@ -306,15 +330,14 @@ export const docsCommand = (cli: CAC) => {
306
330
  });
307
331
  }
308
332
  if (matched.length === 1) {
309
- selectedItem = matched[0];
310
- } else {
311
- selectedItem = await selectItem(matched);
333
+ return matched[0];
312
334
  }
335
+ return await selectItem(matched);
336
+ }
337
+ if (matchedSection) {
338
+ // category/section — select item within section
339
+ return await selectItem(matchedSection.items);
313
340
  }
314
- } else if (matchedSection) {
315
- // category/section — select item within section
316
- selectedItem = await selectItem(matchedSection.items);
317
- } else {
318
341
  // category/??? — search within category
319
342
  const q = segments[1].toLowerCase();
320
343
  const matched = matchedCategory.sections.flatMap((s) =>
@@ -329,7 +352,10 @@ export const docsCommand = (cli: CAC) => {
329
352
  const sectionIds = matchedCategory.sections.map((s) => s.id);
330
353
  const similarSections = findSimilar(segments[1], sectionIds);
331
354
  const allItemIds = matchedCategory.sections.flatMap((s) =>
332
- s.items.map((i) => ({ path: `${matchedCategory.id}/${s.id}/${i.id}`, id: i.id })),
355
+ s.items.map((i) => ({
356
+ path: `${matchedCategory.id}/${s.id}/${i.id}`,
357
+ id: i.id,
358
+ })),
333
359
  );
334
360
  const similarItems = findSimilar(
335
361
  segments[1],
@@ -352,29 +378,27 @@ export const docsCommand = (cli: CAC) => {
352
378
  });
353
379
  }
354
380
  if (matched.length === 1) {
355
- selectedItem = matched[0].item;
356
- } else {
357
- const selected = await p.select({
358
- message: `${highlight(segments[1])}에 해당하는 항목을 선택해주세요`,
359
- options: matched.map(({ item, sectionLabel }) => ({
360
- label: `[${sectionLabel}] ${item.title}`,
361
- value: item,
362
- hint: item.description,
363
- })),
364
- });
365
- if (p.isCancel(selected)) throw new CliCancelError();
366
- selectedItem = selected;
381
+ return matched[0].item;
367
382
  }
383
+ const selected = await p.select({
384
+ message: `${highlight(segments[1])}에 해당하는 항목을 선택해주세요`,
385
+ options: matched.map(({ item, sectionLabel }) => ({
386
+ label: `[${sectionLabel}] ${item.title}`,
387
+ value: item,
388
+ hint: item.description,
389
+ })),
390
+ });
391
+ if (p.isCancel(selected)) throw new CliCancelError();
392
+ return selected;
368
393
  }
369
- } else if (matchedCategory) {
370
- // Single segment matching a category — drill into it
371
- if (matchedCategory.sections.length === 1) {
372
- selectedItem = await selectItem(matchedCategory.sections[0].items);
373
- } else {
394
+ if (matchedCategory) {
395
+ // Single segment matching a category — drill into it
396
+ if (matchedCategory.sections.length === 1) {
397
+ return await selectItem(matchedCategory.sections[0].items);
398
+ }
374
399
  const section = await selectSection(matchedCategory.sections);
375
- selectedItem = await selectItem(section.items);
400
+ return await selectItem(section.items);
376
401
  }
377
- } else {
378
402
  // No category match — global search
379
403
  const matched = searchAllItems(categories, options.query);
380
404
 
@@ -386,22 +410,21 @@ export const docsCommand = (cli: CAC) => {
386
410
  });
387
411
  }
388
412
  if (matched.length === 1) {
389
- selectedItem = matched[0].item;
390
- } else {
391
- const selected = await p.select({
392
- message: `${highlight(options.query)}에 해당하는 항목을 선택해주세요`,
393
- options: matched.map(({ item, categoryLabel, sectionLabel }) => ({
394
- label: `[${categoryLabel} > ${sectionLabel}] ${item.title}`,
395
- value: item,
396
- hint: item.description,
397
- })),
398
- });
399
- if (p.isCancel(selected)) throw new CliCancelError();
400
- selectedItem = selected;
413
+ return matched[0].item;
401
414
  }
415
+ const selected = await p.select({
416
+ message: `${highlight(options.query)}에 해당하는 항목을 선택해주세요`,
417
+ options: matched.map(({ item, categoryLabel, sectionLabel }) => ({
418
+ label: `[${categoryLabel} > ${sectionLabel}] ${item.title}`,
419
+ value: item,
420
+ hint: item.description,
421
+ })),
422
+ });
423
+ if (p.isCancel(selected)) throw new CliCancelError();
424
+ return selected;
402
425
  }
403
- } else {
404
- // Full interactive flow: category → section → item
426
+
427
+ // No query — full interactive flow: category → section → item
405
428
  const category = await selectCategory(categories);
406
429
 
407
430
  let section: DocsSection;
@@ -411,11 +434,34 @@ export const docsCommand = (cli: CAC) => {
411
434
  section = await selectSection(category.sections);
412
435
  }
413
436
 
414
- selectedItem = await selectItem(section.items);
437
+ return await selectItem(section.items);
438
+ };
439
+
440
+ // In --raw mode, swallow index resolution errors and fall back to direct URL fetch
441
+ if (raw) {
442
+ try {
443
+ selectedItem = await resolveFromIndex();
444
+ } catch (error) {
445
+ if (isCliCancelError(error)) throw error;
446
+ // index miss in raw mode → will use fallback
447
+ }
448
+ } else {
449
+ selectedItem = await resolveFromIndex();
415
450
  }
416
451
 
417
- printDocsResult(selectedItem, baseUrl);
418
- p.outro("완료했어요.");
452
+ if (raw) {
453
+ let content: string;
454
+ if (selectedItem) {
455
+ const llmsUrl = `${baseUrl}/llms${selectedItem.docUrl}.txt`;
456
+ content = await fetchLlmsTxt({ url: llmsUrl });
457
+ } else {
458
+ content = await tryFetchLlmsTxt({ baseUrl, query: options.query! });
459
+ }
460
+ console.log(content);
461
+ } else {
462
+ printDocsResult(selectedItem!, baseUrl);
463
+ p.outro("완료했어요.");
464
+ }
419
465
 
420
466
  const duration = Date.now() - startTime;
421
467
  try {
@@ -423,8 +469,8 @@ export const docsCommand = (cli: CAC) => {
423
469
  event: "docs",
424
470
  properties: {
425
471
  query: options.query ?? null,
426
- item_id: selectedItem.id,
427
- has_snippet: !!(selectedItem.snippets && selectedItem.snippets.length > 0),
472
+ item_id: selectedItem?.id ?? options.query ?? null,
473
+ has_snippet: !!(selectedItem?.snippets && selectedItem.snippets.length > 0),
428
474
  duration_ms: duration,
429
475
  },
430
476
  });
@@ -435,10 +481,16 @@ export const docsCommand = (cli: CAC) => {
435
481
  }
436
482
  } catch (error) {
437
483
  if (isCliCancelError(error)) {
438
- p.outro(highlight(error.message));
484
+ if (!raw) p.outro(highlight(error.message));
439
485
  process.exit(0);
440
486
  }
441
487
 
488
+ if (raw) {
489
+ const msg = error instanceof Error ? error.message : String(error);
490
+ console.error(msg);
491
+ process.exit(1);
492
+ }
493
+
442
494
  handleCliError(error, {
443
495
  defaultMessage: "문서 조회에 실패했어요.",
444
496
  defaultHint: "`--verbose` 옵션으로 상세 오류를 확인해보세요.",
package/src/index.ts CHANGED
@@ -5,7 +5,7 @@ import { addAllCommand } from "@/src/commands/add-all";
5
5
  import { compatCommand } from "@/src/commands/compat";
6
6
  import { docsCommand } from "@/src/commands/docs";
7
7
  import { initCommand } from "@/src/commands/init";
8
- import { upgradeCommand } from "@/src/commands/upgrade";
8
+
9
9
  import { getPackageInfo } from "@/src/utils/get-package-info";
10
10
  import { cac } from "cac";
11
11
 
@@ -23,7 +23,6 @@ async function main() {
23
23
  compatCommand(CLI);
24
24
  docsCommand(CLI);
25
25
  initCommand(CLI);
26
- upgradeCommand(CLI);
27
26
 
28
27
  CLI.version(packageInfo.version || "1.0.0", "-v, --version");
29
28
  CLI.help();
@@ -121,44 +121,76 @@ async function fetchRegistryItem({
121
121
  return parsedItem;
122
122
  }
123
123
 
124
- export async function fetchLatestVersion(packageName: string): Promise<string> {
125
- const response = await fetchWithTimeout(`https://registry.npmjs.org/${packageName}/latest`);
124
+ export async function fetchLlmsTxt({ url }: { url: string }): Promise<string> {
125
+ const response = await fetchWithTimeout(url);
126
126
 
127
127
  if (!response.ok) {
128
128
  throw new CliError({
129
- message: `${packageName}의 최신 버전을 가져오지 못했어요: ${response.status} ${response.statusText}`,
129
+ message: `llms.txt를 가져오지 못했어요: ${response.status} ${response.statusText}`,
130
+ hint: `${url} 에 접근할 수 있는지 확인해주세요.`,
130
131
  });
131
132
  }
132
133
 
133
- const data = await response.json();
134
- if (!data || typeof data !== "object" || typeof data.version !== "string") {
135
- throw new CliError({
136
- message: `${packageName} 최신 버전 응답 형식이 올바르지 않아요.`,
137
- });
138
- }
139
- return data.version;
134
+ return response.text();
140
135
  }
141
136
 
142
- export async function fetchChangelog({
137
+ /**
138
+ * Try fetching llms.txt content with fallback URL patterns.
139
+ * 1. {baseUrl}/llms/{query}.txt
140
+ * 2. {baseUrl}/llms/{query}/llms.txt (for package changelog index)
141
+ */
142
+ export async function tryFetchLlmsTxt({
143
143
  baseUrl,
144
- packageSlug,
145
- version,
144
+ query,
146
145
  }: {
147
146
  baseUrl: string;
148
- packageSlug: string;
149
- version: string;
147
+ query: string;
150
148
  }): Promise<string> {
151
- const url = `${baseUrl}/llms/react/updates/changelog/${packageSlug}/${encodeURIComponent(version)}.txt`;
152
- const response = await fetchWithTimeout(url);
149
+ const normalizedQuery = query.startsWith("/") ? query.slice(1) : query;
150
+
151
+ const urls = [
152
+ `${baseUrl}/llms/${normalizedQuery}.txt`,
153
+ `${baseUrl}/llms/${normalizedQuery}/llms.txt`,
154
+ ];
155
+
156
+ let lastError: unknown;
157
+
158
+ for (const url of urls) {
159
+ let response: Response;
160
+ try {
161
+ response = await fetchWithTimeout(url);
162
+ } catch (error) {
163
+ lastError = error;
164
+ continue;
165
+ }
153
166
 
154
- if (!response.ok) {
167
+ if (response.ok) {
168
+ return response.text();
169
+ }
170
+
171
+ // 404 → try next URL candidate
172
+ if (response.status === 404) {
173
+ lastError = new CliError({
174
+ message: `llms.txt를 찾을 수 없어요: ${normalizedQuery}`,
175
+ hint: `다음 경로를 시도했어요:\n${urls.map((u) => ` - ${u}`).join("\n")}`,
176
+ });
177
+ continue;
178
+ }
179
+
180
+ // Non-404 errors (5xx, 401, etc.) — propagate immediately
155
181
  throw new CliError({
156
- message: `변경사항을 가져오지 못했어요: ${response.status} ${response.statusText}`,
157
- hint: `${url} 에 접근할 수 있는지 확인해주세요.`,
182
+ message: `llms.txt 요청이 실패했어요: ${response.status} ${response.statusText}`,
183
+ hint: `URL: ${url}`,
158
184
  });
159
185
  }
160
186
 
161
- return response.text();
187
+ throw (
188
+ lastError ??
189
+ new CliError({
190
+ message: `llms.txt를 찾을 수 없어요: ${normalizedQuery}`,
191
+ hint: `다음 경로를 시도했어요:\n${urls.map((u) => ` - ${u}`).join("\n")}`,
192
+ })
193
+ );
162
194
  }
163
195
 
164
196
  export async function fetchRegistryItems({
@@ -1,387 +0,0 @@
1
- import { getPackageInfo } from "@/src/utils/get-package-info";
2
- import * as p from "@clack/prompts";
3
- import { coerce, valid } from "semver";
4
- import { z } from "zod";
5
-
6
- import type { CAC } from "cac";
7
- import { BASE_URL } from "../constants";
8
- import { analytics } from "../utils/analytics";
9
- import { highlight } from "../utils/color";
10
- import {
11
- CliCancelError,
12
- CliError,
13
- handleCliError,
14
- isCliCancelError,
15
- isVerboseMode,
16
- } from "../utils/error";
17
- import { fetchChangelog, fetchLatestVersion } from "../utils/fetch";
18
-
19
- const SEED_SCOPE = "@seed-design/";
20
-
21
- const upgradeOptionsSchema = z.object({
22
- packageName: z.string().optional(),
23
- cwd: z.string(),
24
- baseUrl: z.string(),
25
- raw: z.boolean(),
26
- all: z.boolean(),
27
- });
28
-
29
- function toFullPackageName(input: string): string {
30
- return input.startsWith(SEED_SCOPE) ? input : `${SEED_SCOPE}${input}`;
31
- }
32
-
33
- function toSlug(packageName: string): string {
34
- return packageName.replace(SEED_SCOPE, "");
35
- }
36
-
37
- function findInstalledSeedPackages(cwd: string): Record<string, string> {
38
- const packageInfo = getPackageInfo(cwd);
39
- const allDeps = {
40
- ...packageInfo.dependencies,
41
- ...packageInfo.devDependencies,
42
- ...packageInfo.peerDependencies,
43
- ...packageInfo.optionalDependencies,
44
- };
45
-
46
- const seedPackages: Record<string, string> = {};
47
- for (const [name, version] of Object.entries(allDeps)) {
48
- if (name.startsWith(SEED_SCOPE) && version) {
49
- seedPackages[name] = version;
50
- }
51
- }
52
-
53
- return seedPackages;
54
- }
55
-
56
- function resolveExactVersion(versionSpec: string): string | null {
57
- let normalized = versionSpec.trim();
58
-
59
- if (normalized.startsWith("workspace:")) {
60
- normalized = normalized.slice("workspace:".length).trim();
61
- }
62
-
63
- if (normalized.startsWith("npm:")) {
64
- const lastAt = normalized.lastIndexOf("@");
65
- if (lastAt > 4) {
66
- normalized = normalized.slice(lastAt + 1);
67
- }
68
- }
69
-
70
- if (valid(normalized)) return normalized;
71
-
72
- const coerced = coerce(normalized);
73
- if (coerced) return coerced.version;
74
-
75
- return null;
76
- }
77
-
78
- interface UpgradeOneResult {
79
- package: string;
80
- currentVersion: string;
81
- latestVersion: string;
82
- upToDate: boolean;
83
- changelog: string | null;
84
- }
85
-
86
- async function upgradeOne({
87
- targetPackage,
88
- currentVersionSpec,
89
- baseUrl,
90
- }: {
91
- targetPackage: string;
92
- currentVersionSpec: string;
93
- baseUrl: string;
94
- }): Promise<UpgradeOneResult> {
95
- const currentVersion = resolveExactVersion(currentVersionSpec);
96
-
97
- if (!currentVersion) {
98
- throw new CliError({
99
- message: `${targetPackage}의 버전을 파싱할 수 없어요: ${currentVersionSpec}`,
100
- hint: "package.json에서 버전 형식을 확인해주세요.",
101
- });
102
- }
103
-
104
- const latestVersion = await fetchLatestVersion(targetPackage);
105
-
106
- if (currentVersion === latestVersion) {
107
- return {
108
- package: targetPackage,
109
- currentVersion,
110
- latestVersion,
111
- upToDate: true,
112
- changelog: null,
113
- };
114
- }
115
-
116
- const slug = toSlug(targetPackage);
117
- const changelog = await fetchChangelog({
118
- baseUrl,
119
- packageSlug: slug,
120
- version: currentVersion,
121
- });
122
-
123
- return {
124
- package: targetPackage,
125
- currentVersion,
126
- latestVersion,
127
- upToDate: false,
128
- changelog,
129
- };
130
- }
131
-
132
- function printResultRaw(result: UpgradeOneResult & { error?: string }) {
133
- if (result.error) {
134
- console.error(`## ${result.package}\n\nError: ${result.error}\n`);
135
- } else if (result.upToDate) {
136
- console.log(`${result.package}@${result.currentVersion} is already up to date.\n`);
137
- } else {
138
- console.log(result.changelog);
139
- console.log("");
140
- }
141
- }
142
-
143
- function printResultInteractive(result: UpgradeOneResult & { error?: string }) {
144
- if (result.error) {
145
- p.log.error(`${highlight(result.package)}: ${result.error}`);
146
- } else if (result.upToDate) {
147
- p.log.info(
148
- `${highlight(result.package)}: ${highlight(result.currentVersion)} — 이미 최신 버전이에요.`,
149
- );
150
- } else {
151
- p.log.info(
152
- `${highlight(result.package)}: ${highlight(result.currentVersion)} → ${highlight(result.latestVersion)}`,
153
- );
154
- p.log.message(result.changelog ?? "");
155
- p.log.info(
156
- `업그레이드하려면: ${highlight(`bun add ${result.package}@${result.latestVersion}`)}`,
157
- );
158
- }
159
- }
160
-
161
- async function trackResults(cwd: string, results: UpgradeOneResult[], startTime: number) {
162
- try {
163
- for (const result of results) {
164
- await analytics.track(cwd, {
165
- event: "upgrade",
166
- properties: {
167
- package: result.package,
168
- current_version: result.currentVersion,
169
- latest_version: result.latestVersion,
170
- up_to_date: result.upToDate,
171
- duration_ms: Date.now() - startTime,
172
- },
173
- });
174
- }
175
- } catch {}
176
- }
177
-
178
- export const upgradeCommand = (cli: CAC) => {
179
- cli
180
- .command(
181
- "upgrade [package-name]",
182
- "패키지의 현재 버전과 최신 버전 사이의 변경사항을 확인합니다",
183
- )
184
- .option("-c, --cwd <cwd>", "작업 디렉토리. 기본값은 현재 디렉토리입니다.", {
185
- default: process.cwd(),
186
- })
187
- .option("-u, --baseUrl <baseUrl>", "changelog를 조회할 base URL입니다.", { default: BASE_URL })
188
- .option("--raw", "UI 없이 순수 마크다운만 출력합니다. LLM 파이프에 유용합니다.", {
189
- default: false,
190
- })
191
- .option("-a, --all", "설치된 모든 @seed-design 패키지의 변경사항을 확인합니다.", {
192
- default: false,
193
- })
194
- .example("seed-design upgrade")
195
- .example("seed-design upgrade react")
196
- .example("seed-design upgrade --all")
197
- .example("seed-design upgrade --all --raw")
198
- .action(async (packageName, opts) => {
199
- const startTime = Date.now();
200
- const verbose = isVerboseMode(opts);
201
- const parsed = upgradeOptionsSchema.safeParse({ packageName, ...opts });
202
- if (!parsed.success) {
203
- if (opts.raw) {
204
- console.error(parsed.error.message);
205
- process.exit(1);
206
- }
207
- p.intro("seed-design upgrade");
208
- handleCliError(parsed.error, {
209
- defaultMessage: "업그레이드 확인에 실패했어요.",
210
- defaultHint: "`--verbose` 옵션으로 상세 오류를 확인해보세요.",
211
- verbose,
212
- });
213
- process.exit(1);
214
- }
215
-
216
- const { data: options } = parsed;
217
- const { raw, all } = options;
218
-
219
- if (!raw) p.intro("seed-design upgrade");
220
-
221
- try {
222
- const seedPackages = findInstalledSeedPackages(options.cwd);
223
- const packageNames = Object.keys(seedPackages);
224
-
225
- if (packageNames.length === 0) {
226
- throw new CliError({
227
- message: "프로젝트에 설치된 @seed-design 패키지를 찾을 수 없어요.",
228
- hint: "`bun add @seed-design/react`로 패키지를 설치해보세요.",
229
- });
230
- }
231
-
232
- if (options.packageName && all) {
233
- throw new CliError({
234
- message: "패키지명과 --all 옵션을 동시에 사용할 수 없어요.",
235
- hint: "`seed-design upgrade --all` 또는 `seed-design upgrade react` 중 하나만 사용해주세요.",
236
- });
237
- }
238
-
239
- // --all: iterate all packages
240
- if (all) {
241
- if (raw) {
242
- const results = await Promise.all(
243
- packageNames.map((name) =>
244
- upgradeOne({
245
- targetPackage: name,
246
- currentVersionSpec: seedPackages[name],
247
- baseUrl: options.baseUrl,
248
- }).catch((error): UpgradeOneResult & { error: string } => ({
249
- package: name,
250
- currentVersion: seedPackages[name],
251
- latestVersion: "unknown",
252
- upToDate: false,
253
- changelog: null,
254
- error: error instanceof Error ? error.message : String(error),
255
- })),
256
- ),
257
- );
258
-
259
- for (const result of results) {
260
- printResultRaw(result);
261
- }
262
-
263
- await trackResults(options.cwd, results, startTime);
264
- const hasErrors = results.some((r) => "error" in r && Boolean(r.error));
265
- process.exit(hasErrors ? 1 : 0);
266
- }
267
-
268
- // --all interactive
269
- const { start, stop } = p.spinner();
270
- start("모든 패키지의 변경사항을 가져오고 있어요...");
271
- const results = await Promise.all(
272
- packageNames.map((name) =>
273
- upgradeOne({
274
- targetPackage: name,
275
- currentVersionSpec: seedPackages[name],
276
- baseUrl: options.baseUrl,
277
- }).catch((error): UpgradeOneResult & { error: string } => ({
278
- package: name,
279
- currentVersion: seedPackages[name],
280
- latestVersion: "unknown",
281
- upToDate: false,
282
- changelog: null,
283
- error: error instanceof Error ? error.message : String(error),
284
- })),
285
- ),
286
- );
287
- stop("변경사항을 가져왔어요.");
288
-
289
- for (const result of results) {
290
- printResultInteractive(result);
291
- }
292
-
293
- p.outro("완료했어요.");
294
- await trackResults(options.cwd, results, startTime);
295
- const hasErrors = results.some((r) => "error" in r && Boolean(r.error));
296
- process.exit(hasErrors ? 1 : 0);
297
- }
298
-
299
- // resolve target package
300
- let targetPackage: string;
301
-
302
- if (options.packageName) {
303
- targetPackage = toFullPackageName(options.packageName);
304
-
305
- if (!seedPackages[targetPackage]) {
306
- throw new CliError({
307
- message: `${highlight(targetPackage)}: 프로젝트에 설치되어 있지 않아요.`,
308
- hint: `설치된 패키지: ${packageNames.map((n) => highlight(n)).join(", ")}`,
309
- });
310
- }
311
- } else {
312
- // no package, no --all: interactive select
313
- if (raw) {
314
- throw new CliError({
315
- message: "--raw 모드에서는 패키지명 또는 --all 옵션이 필요해요.",
316
- hint: "예: `seed-design upgrade react --raw` 또는 `seed-design upgrade --all --raw`",
317
- });
318
- }
319
-
320
- if (packageNames.length === 1) {
321
- targetPackage = packageNames[0];
322
- } else {
323
- const selected = await p.select({
324
- message: "변경사항을 확인할 패키지를 선택해주세요",
325
- options: packageNames.map((name) => ({
326
- label: name,
327
- value: name,
328
- hint: seedPackages[name],
329
- })),
330
- });
331
- if (p.isCancel(selected)) throw new CliCancelError();
332
- targetPackage = selected;
333
- }
334
- }
335
-
336
- // single package
337
- if (raw) {
338
- const result = await upgradeOne({
339
- targetPackage,
340
- currentVersionSpec: seedPackages[targetPackage],
341
- baseUrl: options.baseUrl,
342
- });
343
- printResultRaw(result);
344
- await trackResults(options.cwd, [result], startTime);
345
- process.exit(0);
346
- }
347
-
348
- // single package interactive
349
- const { start, stop } = p.spinner();
350
- start("최신 버전을 확인하고 있어요...");
351
- let result: UpgradeOneResult;
352
- try {
353
- result = await upgradeOne({
354
- targetPackage,
355
- currentVersionSpec: seedPackages[targetPackage],
356
- baseUrl: options.baseUrl,
357
- });
358
- stop("변경사항을 가져왔어요.");
359
- } catch (error) {
360
- stop("변경사항을 가져오지 못했어요.");
361
- throw error;
362
- }
363
-
364
- printResultInteractive(result);
365
- p.outro("완료했어요.");
366
- await trackResults(options.cwd, [result], startTime);
367
- } catch (error) {
368
- if (isCliCancelError(error)) {
369
- if (!raw) p.outro(highlight(error.message));
370
- process.exit(0);
371
- }
372
-
373
- if (raw) {
374
- const msg = error instanceof Error ? error.message : String(error);
375
- console.error(msg);
376
- process.exit(1);
377
- }
378
-
379
- handleCliError(error, {
380
- defaultMessage: "업그레이드 확인에 실패했어요.",
381
- defaultHint: "`--verbose` 옵션으로 상세 오류를 확인해보세요.",
382
- verbose,
383
- });
384
- process.exit(1);
385
- }
386
- });
387
- };