magicpath-ai 2.5.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +56 -56
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{readFileSync as es}from"fs";import{dirname as ts,join as ns}from"path";import{fileURLToPath as os}from"url";import{program as N}from"commander";import st from"axios";var p=class extends Error{code;suggestion;constructor(n,t){super(n),this.code=t==null?void 0:t.code,this.suggestion=t==null?void 0:t.suggestion}};function Lt(e){if(!(!e||typeof e!="object"))return e}function D(e){var n,t;if(e instanceof p)return e;if(st.isAxiosError(e)){let o=Lt((n=e.response)==null?void 0:n.data),r=typeof(o==null?void 0:o.message)=="string"?o.message:e.response?`API error: ${e.response.status} ${e.response.statusText}`:e.message,s=typeof(o==null?void 0:o.code)=="string"?o.code:void 0,i=typeof((t=o==null?void 0:o.details)==null?void 0:t.suggestion)=="string"?o.details.suggestion:typeof(o==null?void 0:o.suggestion)=="string"?o.suggestion:void 0;return new p(r,{code:s,...i?{suggestion:i}:{}})}return e instanceof Error?new p(e.message):new p(String(e))}function Wt(){st.interceptors.response.use(e=>e,e=>{var n;if(st.isAxiosError(e)){let t=Lt((n=e.response)==null?void 0:n.data);if(typeof(t==null?void 0:t.code)=="string")return Promise.reject(D(e))}return Promise.reject(e)})}var Ht=!1;function Gt(e){Ht=e}function v(){return Ht}function x(e){console.log(JSON.stringify(e,null,2)),process.exit(0)}function E(e){let t={error:e instanceof Error?e.message:String(e)};e instanceof p&&(e.code&&(t.code=e.code),e.suggestion&&(t.suggestion=e.suggestion)),console.error(JSON.stringify(t,null,2)),process.exit(1)}var q="0.0.0-dev";function zt(e){q=e}import le from"chalk";import ve from"fs-extra";import pn from"path";import _o from"os";import gn from"axios";var T=process.env.MAGICPATH_API_URL??"https://api.magicpath.ai";function Oe(e,n){return`${T}/${e}/${n}`}function Vt(e){return`${T}/v1/registry/${e}`}var Mo=process.env.MAGICPATH_WEB_URL??"https://www.magicpath.ai";function Ue(e){return`${Mo}${e}`}function Jt(e){return Ue(`/files/${e}`)}function Me(e,n){return Ue(`/projects/${e}?guest=${encodeURIComponent(n)}`)}function Fe(e){return`${T}/auth/${e}`}function it(){return`${T}/v1/external-agent/components`}function at(e){return`${T}/v1/external-agent/components/${e}/context`}function Bt(e){return`${T}/v1/external-agent/components/${e}/start`}function Kt(e){return`${T}/v1/external-agent/components/${e}/revisions`}function ct(e,n){return`${T}/v1/external-agent/components/${e}/revisions/${n}/files`}function lt(e){return`${T}/v1/external-agent/jobs/${e}`}function te(){return`${T}/users/me`}function mt(){return`${T}/users/me/projects`}function dt(){return`${T}/users/me/skills`}function qt(){return`${T}/users/me/skills/import`}function Xt(){return`${T}/users/me/assets/upload-url`}function Yt(){return`${T}/projects`}function ie(e){return`${T}/projects/${e}`}function Zt(e){return`${T}/projects/${e}/components`}function pt(e){return`${T}/projects/${e}/images`}function De(){return`${T}/users/me/design-systems`}function Qt(e){return`${T}/design-systems/${e}`}function ae(){return`${T}/users/me/socket-rooms`}function en(){return`${T}/liveblocks/auth`}function tn(e){return`${T}/components/${e}`}function nn(){return`${T}/components/search`}function on(e){return`${T}/organizations/${e}`}function gt(e){return`${T}/organizations/${e}/projects`}function ut(e){return`${T}/organizations/${e}/skills`}function rn(e){return`${T}/organizations/${e}/skills/import`}function _e(e){return`${T}/organizations/${e}/design-systems`}function ft(e){return`${T}/skills/${e}`}function sn(e){return`${T}/skills/${e}/files`}function an(e,n){return`${T}/skills/${e}/files/content?path=${encodeURIComponent(n)}`}var Fo=[{type:"claude-code",envVar:"CLAUDECODE"},{type:"cursor",envVar:"CURSOR_TRACE_ID"},{type:"cursor",envVar:"CURSOR_AGENT"},{type:"codex",envVar:"CODEX_SANDBOX"},{type:"codex",envVar:"CODEX_THREAD_ID"},{type:"codex",envVar:"CODEX_CI"},{type:"gemini",envVar:"GEMINI_CLI"},{type:"antigravity",envVar:"ANTIGRAVITY_AGENT"},{type:"augment",envVar:"AUGMENT_AGENT"},{type:"opencode",envVar:"OPENCODE_CLIENT"},{type:"copilot",envVar:"COPILOT_MODEL"},{type:"cline",envVar:"CLINE_ACTIVE"},{type:"replit",envVar:"REPL_ID"},{type:"goose",envVar:"GOOSE_TERMINAL"}],Le={"claude-code":"claude-code",claude:"claude-code",cursor:"cursor","cursor-agent":"cursor",codex:"codex","codex-cli":"codex",gemini:"gemini","gemini-cli":"gemini",antigravity:"antigravity",augment:"augment",opencode:"opencode",copilot:"copilot","github-copilot":"copilot","github-copilot-cli":"copilot",cline:"cline",replit:"replit",v0:"v0",devin:"devin",aider:"aider",goose:"goose",amp:"amp"};function cn(e){let n=e.trim();if(!n)return null;let t=n.indexOf("@");if(t===-1)return{slug:n.toLowerCase()};let o=n.slice(0,t).trim().toLowerCase(),r=n.slice(t+1).trim()||void 0;return o?{slug:o,version:r}:null}function ln(e){if(e in Le)return Le[e];for(let n of Object.keys(Le))if(e.startsWith(`${n}_`)||e.startsWith(`${n}-`))return Le[n];return e}var We;function mn(){return We||(We=Do(),We)}function Do(){let e=process.env.MAGICPATH_AGENT;if(e){let t=cn(e);if(t)return{kind:"known-agent",slug:ln(t.slug),version:t.version}}for(let t of Fo){let o=process.env[t.envVar];if(o&&o!=="0"&&o.toLowerCase()!=="false")return{kind:"known-agent",slug:t.type}}let n=process.env.AI_AGENT;if(n){let t=cn(n);if(t)return{kind:"known-agent",slug:ln(t.slug),version:t.version}}return process.stdin.isTTY?{kind:"interactive-human"}:{kind:"unknown-agent"}}function dn(e){switch(e.kind){case"known-agent":return{type:e.slug,version:e.version};case"interactive-human":return{type:"interactive"};case"unknown-agent":return{}}}var un=pn.join(_o.homedir(),".magicpath"),He=pn.join(un,"session.json");function ne(){try{if(!ve.existsSync(He))return null;let e=ve.readJsonSync(He);return e.accessToken&&(e.refreshToken||e.guest)?e:null}catch{return null}}function ht(e){ve.ensureDirSync(un),ve.writeJsonSync(He,e)}function wt(e,n){let t=ne();ht({accessToken:e,refreshToken:n,user:t==null?void 0:t.user})}function fn(e,n){ht({accessToken:e,guest:n})}function ce(){let e=ne();return e?{accessToken:e.accessToken,refreshToken:e.refreshToken}:null}function V(){let e=ne();return(e==null?void 0:e.guest)??null}function hn(){let e=ne();return e!=null&&e.guest?Me(e.guest.projectId,e.accessToken):null}function wn(){try{ve.removeSync(He)}catch{}}function Lo(e){try{let n=ne();n&&(n.user=e,ht(n))}catch{}}function yn(){let e=ne();return(e==null?void 0:e.user)??null}function j(){let{type:e,version:n}=dn(mn()),t={"X-Client-Type":"cli","X-Client-Version":q};e&&(t["X-Agent-Type"]=e),n&&(t["X-Agent-Version"]=n);let o=process.env.MAGICPATH_TOKEN;if(o)return t.Authorization=`Bearer ${o}`,t;let r=ne();if(!r)throw new Error("Not logged in. Run `magicpath-ai login` first.");if(r.guest&&Date.parse(r.guest.expiresAt)<Date.now())throw new p("Your guest session has expired. Sign up at https://magicpath.ai to keep building.",{code:"GUEST_EXPIRED",suggestion:"Sign up at https://magicpath.ai or start a new guest project from the MagicPath site."});return t.Authorization=`Bearer ${r.accessToken}`,t}function Se(e){var o,r;let n=(o=e.subscription)!=null&&o.active?(r=e.subscription.type)!=null&&r.startsWith("PRO")?"Pro":"Creator":"Free",t={name:e.name||e.firstName||e.displayName,email:e.email,plan:n};return Lo(t),t}async function yt(){let e=j(),n=await gn.get(te(),{headers:e}),t=n.data.user??n.data;return Se(t)}async function Ce(e){let n=await gn.get(te(),{headers:e});return((n.data.user??n.data).organizationUsers??[]).map(r=>({id:String(r.organization.id),name:r.organization.name,role:r.role}))}async function L(e,n){let t=await Ce(n),o=t.find(i=>i.id===e);if(o)return{id:o.id,name:o.name};let r=e.toLowerCase(),s=t.find(i=>i.name.toLowerCase()===r);if(s)return{id:s.id,name:s.name};throw new p(`Team "${e}" not found.`,{code:"TEAM_NOT_FOUND",suggestion:"Run `magicpath-ai list-teams` to see your teams."})}var In=["#95D5B2","#74C69D","#52B788","#40916C","#2D6A4F","#1B4332"];function Wo(e){return le.hex(In[Math.min(e,In.length-1)])}var It=le.hex("#2D6A4F"),Ho=le.hex("#1B4332"),Go=le.hex("#E8F5E9"),bt=le.hex("#888888"),zo=["\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557","\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D","\u2588\u2588\u2554\u2588\u2588\u2588\u2588\u2554\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 ","\u2588\u2588\u2551\u255A\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2551 ","\u2588\u2588\u2551 \u255A\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557","\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D"],Vo=["\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557","\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2551 \u2588\u2588\u2551","\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551","\u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551","\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551","\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D"],Jo=zo.map((e,n)=>e+" "+Vo[n]);function Bo(e){return e.map((n,t)=>{let o=Wo(t),r="";for(let s of n)r+=s===" "?s:o(s);return r})}function bn(e){let n=!!ce(),t=n?yn():null;console.log();for(let s of Bo(Jo))console.log(s);if(console.log(),n&&t){let s=t.plan?` \xB7 ${t.plan}`:"";console.log(" "+It("\u25CF")+" "+le.bold(Go(t.name??"MagicPath User"))+Ho(" "+(t.email??"")+s))}else console.log(" "+bt("\u25CB Not logged in \xB7 run")+" "+It("magicpath-ai login"));console.log();let o=20,r=[["search <query>","Search components"],["add <name>","Add to project"],["list-projects","Your projects"],["setup-skills","Set up AI agents"]];for(let[s,i]of r)console.log(" "+It(s.padEnd(o))+bt(i));console.log(),console.log(" "+bt(`v${e} \u2500 magicpath-ai --help`)),console.log()}import ze from"prompts";import On from"ora";import{z as pe}from"zod";import ge from"path";import or from"os";import vt from"fs-extra";import{pino as $n}from"pino";var me=$n();function de(){me=$n({level:"debug"}),me.debug({message:"DEBUG logger enabled. "})}var R={info:e=>{me.info(e)},debug:e=>{me.debug(e)},warn:e=>{me.warn(e)},error:e=>{me.error(e)}};import xn from"axios";import Ge from"path";import qo from"os";import{Readable as Xo}from"stream";import je from"fs-extra";import Yo from"adm-zip";import{v4 as Zo}from"uuid";async function Qo(e){if(!(e instanceof Xo))return;let n=[];return new Promise((t,o)=>{e.on("data",r=>{n.push(Buffer.isBuffer(r)?r:Buffer.from(r))}),e.on("error",o),e.on("end",()=>t(Buffer.concat(n).toString("utf8")))})}async function er(e){var n;if(e instanceof p)return e;if(xn.isAxiosError(e)){let t=await Qo((n=e.response)==null?void 0:n.data);if(t)try{let o=JSON.parse(t);return D({...e,response:{...e.response,data:o},isAxiosError:!0})}catch{}return D(e)}return new p("Failed to download project. Make sure your key is valid.")}async function vn(e){let n=Oe("v1","components/repository"),t=`${Zo()}.zip`,o=Ge.join(qo.tmpdir(),t);try{let r=await xn({url:n,params:{key:e},method:"GET",responseType:"stream"});return await je.ensureDir(Ge.dirname(o)),await new Promise(async(s,i)=>{try{r.data.pipe(je.createWriteStream(o)).on("error",i).once("close",()=>s(o))}catch(c){i(c)}}),o}catch(r){throw await er(r)}}function $t(e){try{je.removeSync(e)}catch{}}function Sn(e,n,t){try{let o=Ge.join(t,n),r=1;for(;je.existsSync(o);)r++,o=Ge.join(t,`${n}-${r}`);return je.mkdirSync(o,{recursive:!0}),new Yo(e).extractAllTo(o,!0),$t(e),o}catch{throw new p("Failed to extract project. Please try again.")}}import{execSync as xt}from"child_process";import jn from"ora";import Cn from"fs-extra";import tr from"path";function En(){try{return xt("yarn --version",{stdio:"ignore"}),"yarn"}catch{return"npm"}}function An(e){let n=En(),t=jn(`\u{1F4E6} Installing dependencies using ${n}...`).start();try{xt(n==="yarn"?"yarn install":"npm install",{cwd:e,stdio:"ignore"}),t.succeed("Dependencies installed successfully!")}catch{throw t.fail("Failed to install dependencies"),new p("Failed to install dependencies. Please check your internet connection and try again.")}}function nr(e){let n=tr.join(e,"package.json");if(!Cn.existsSync(n))return new Set;try{let t=Cn.readJsonSync(n),o=new Set;return t.dependencies&&Object.keys(t.dependencies).forEach(r=>o.add(r)),t.devDependencies&&Object.keys(t.devDependencies).forEach(r=>o.add(r)),o}catch{return new Set}}function Pn(e,n){if(e.length===0)return{installed:[],skipped:[]};let t=nr(n),o=e.filter(c=>!t.has(c)),r=e.filter(c=>t.has(c));if(o.length===0)return R.debug("All dependencies already installed"),{installed:[],skipped:r};let s=En(),i=jn(`\u{1F4E6} Installing ${o.length} package${o.length>1?"s":""} using ${s}...`).start();try{let c=o.join(" "),a=s==="yarn"?`yarn add ${c}`:`npm install ${c}`;return R.debug({command:a}),xt(a,{cwd:n,stdio:"ignore"}),i.succeed(`Installed ${o.length} package${o.length>1?"s":""}`),{installed:o,skipped:r}}catch{throw i.fail("Failed to install packages"),new p(`Failed to install packages: ${o.join(", ")}. Please install them manually.`)}}import{execSync as kn}from"child_process";import Tn from"ora";function Nn(e,n){let t={cursor:"Cursor",antigravity:"Antigravity",vscode:"VS Code",webstorm:"WebStorm"},o={cursor:["cursor","code"],antigravity:["agy","antigravity"],vscode:["code"],webstorm:["webstorm","web"]},r=Tn(`\u{1F680} Opening project in ${t[n]}...`).start(),s=!1;try{for(let i of o[n]){if(s)break;try{kn(`${i} .`,{cwd:e,stdio:"ignore"}),s=!0}catch{s=!1}}if(!s)throw new Error("Failed to open with command.");r.succeed(`Project opened in ${t[n]}!`)}catch{r.fail(`Failed to open ${t[n]}`);let i={cursor:`\u274C Cursor command not found!
|
|
2
|
+
import{readFileSync as rs}from"fs";import{dirname as ss,join as is}from"path";import{fileURLToPath as as}from"url";import{program as N}from"commander";import at from"axios";var p=class extends Error{code;suggestion;constructor(n,t){super(n),this.code=t==null?void 0:t.code,this.suggestion=t==null?void 0:t.suggestion}};function Wt(e){if(!(!e||typeof e!="object"))return e}function D(e){var n,t;if(e instanceof p)return e;if(at.isAxiosError(e)){let o=Wt((n=e.response)==null?void 0:n.data),r=typeof(o==null?void 0:o.message)=="string"?o.message:e.response?`API error: ${e.response.status} ${e.response.statusText}`:e.message,s=typeof(o==null?void 0:o.code)=="string"?o.code:void 0,i=typeof((t=o==null?void 0:o.details)==null?void 0:t.suggestion)=="string"?o.details.suggestion:typeof(o==null?void 0:o.suggestion)=="string"?o.suggestion:void 0;return new p(r,{code:s,...i?{suggestion:i}:{}})}return e instanceof Error?new p(e.message):new p(String(e))}function Gt(){at.interceptors.response.use(e=>e,e=>{var n;if(at.isAxiosError(e)){let t=Wt((n=e.response)==null?void 0:n.data);if(typeof(t==null?void 0:t.code)=="string")return Promise.reject(D(e))}return Promise.reject(e)})}var Ht=!1;function zt(e){Ht=e}function v(){return Ht}function x(e){console.log(JSON.stringify(e,null,2)),process.exit(0)}function E(e){let t={error:e instanceof Error?e.message:String(e)};e instanceof p&&(e.code&&(t.code=e.code),e.suggestion&&(t.suggestion=e.suggestion)),console.error(JSON.stringify(t,null,2)),process.exit(1)}var q="0.0.0-dev";function Vt(e){q=e}import me from"chalk";import Ce from"fs-extra";import un from"path";import Lo from"os";import fn from"axios";var T=process.env.MAGICPATH_API_URL??"https://api.magicpath.ai";function Me(e,n){return`${T}/${e}/${n}`}function Jt(e){return`${T}/v1/registry/${e}`}var Fo=process.env.MAGICPATH_WEB_URL??"https://www.magicpath.ai";function Fe(e){return`${Fo}${e}`}function Bt(e){return Fe(`/files/${e}`)}function De(e,n){return Fe(`/projects/${e}?guest=${encodeURIComponent(n)}`)}function _e(e){return`${T}/auth/${e}`}function ct(){return`${T}/v1/external-agent/components`}function lt(e){return`${T}/v1/external-agent/components/${e}/context`}function Kt(e){return`${T}/v1/external-agent/components/${e}/start`}function qt(e){return`${T}/v1/external-agent/components/${e}/revisions`}function mt(e,n){return`${T}/v1/external-agent/components/${e}/revisions/${n}/files`}function dt(e){return`${T}/v1/external-agent/jobs/${e}`}function te(){return`${T}/users/me`}function pt(){return`${T}/users/me/projects`}function gt(){return`${T}/users/me/skills`}function Xt(){return`${T}/users/me/skills/import`}function Yt(){return`${T}/users/me/assets/upload-url`}function Zt(){return`${T}/projects`}function ae(e){return`${T}/projects/${e}`}function Qt(e){return`${T}/projects/${e}/components`}function ut(e){return`${T}/projects/${e}/images`}function en(){return`${T}/images/generate`}function Le(){return`${T}/users/me/design-systems`}function tn(e){return`${T}/design-systems/${e}`}function ce(){return`${T}/users/me/socket-rooms`}function nn(){return`${T}/liveblocks/auth`}function on(e){return`${T}/components/${e}`}function rn(){return`${T}/components/search`}function sn(e){return`${T}/organizations/${e}`}function ft(e){return`${T}/organizations/${e}/projects`}function ht(e){return`${T}/organizations/${e}/skills`}function an(e){return`${T}/organizations/${e}/skills/import`}function We(e){return`${T}/organizations/${e}/design-systems`}function wt(e){return`${T}/skills/${e}`}function cn(e){return`${T}/skills/${e}/files`}function ln(e,n){return`${T}/skills/${e}/files/content?path=${encodeURIComponent(n)}`}var Do=[{type:"claude-code",envVar:"CLAUDECODE"},{type:"cursor",envVar:"CURSOR_TRACE_ID"},{type:"cursor",envVar:"CURSOR_AGENT"},{type:"codex",envVar:"CODEX_SANDBOX"},{type:"codex",envVar:"CODEX_THREAD_ID"},{type:"codex",envVar:"CODEX_CI"},{type:"gemini",envVar:"GEMINI_CLI"},{type:"antigravity",envVar:"ANTIGRAVITY_AGENT"},{type:"augment",envVar:"AUGMENT_AGENT"},{type:"opencode",envVar:"OPENCODE_CLIENT"},{type:"copilot",envVar:"COPILOT_MODEL"},{type:"cline",envVar:"CLINE_ACTIVE"},{type:"replit",envVar:"REPL_ID"},{type:"goose",envVar:"GOOSE_TERMINAL"}],Ge={"claude-code":"claude-code",claude:"claude-code",cursor:"cursor","cursor-agent":"cursor",codex:"codex","codex-cli":"codex",gemini:"gemini","gemini-cli":"gemini",antigravity:"antigravity",augment:"augment",opencode:"opencode",copilot:"copilot","github-copilot":"copilot","github-copilot-cli":"copilot",cline:"cline",replit:"replit",v0:"v0",devin:"devin",aider:"aider",goose:"goose",amp:"amp"};function mn(e){let n=e.trim();if(!n)return null;let t=n.indexOf("@");if(t===-1)return{slug:n.toLowerCase()};let o=n.slice(0,t).trim().toLowerCase(),r=n.slice(t+1).trim()||void 0;return o?{slug:o,version:r}:null}function dn(e){if(e in Ge)return Ge[e];for(let n of Object.keys(Ge))if(e.startsWith(`${n}_`)||e.startsWith(`${n}-`))return Ge[n];return e}var He;function pn(){return He||(He=_o(),He)}function _o(){let e=process.env.MAGICPATH_AGENT;if(e){let t=mn(e);if(t)return{kind:"known-agent",slug:dn(t.slug),version:t.version}}for(let t of Do){let o=process.env[t.envVar];if(o&&o!=="0"&&o.toLowerCase()!=="false")return{kind:"known-agent",slug:t.type}}let n=process.env.AI_AGENT;if(n){let t=mn(n);if(t)return{kind:"known-agent",slug:dn(t.slug),version:t.version}}return process.stdin.isTTY?{kind:"interactive-human"}:{kind:"unknown-agent"}}function gn(e){switch(e.kind){case"known-agent":return{type:e.slug,version:e.version};case"interactive-human":return{type:"interactive"};case"unknown-agent":return{}}}var hn=un.join(Lo.homedir(),".magicpath"),ze=un.join(hn,"session.json");function ne(){try{if(!Ce.existsSync(ze))return null;let e=Ce.readJsonSync(ze);return e.accessToken&&(e.refreshToken||e.guest)?e:null}catch{return null}}function yt(e){Ce.ensureDirSync(hn),Ce.writeJsonSync(ze,e)}function It(e,n){let t=ne();yt({accessToken:e,refreshToken:n,user:t==null?void 0:t.user})}function wn(e,n){yt({accessToken:e,guest:n})}function le(){let e=ne();return e?{accessToken:e.accessToken,refreshToken:e.refreshToken}:null}function V(){let e=ne();return(e==null?void 0:e.guest)??null}function yn(){let e=ne();return e!=null&&e.guest?De(e.guest.projectId,e.accessToken):null}function In(){try{Ce.removeSync(ze)}catch{}}function Wo(e){try{let n=ne();n&&(n.user=e,yt(n))}catch{}}function bn(){let e=ne();return(e==null?void 0:e.user)??null}function C(){let{type:e,version:n}=gn(pn()),t={"X-Client-Type":"cli","X-Client-Version":q};e&&(t["X-Agent-Type"]=e),n&&(t["X-Agent-Version"]=n);let o=process.env.MAGICPATH_TOKEN;if(o)return t.Authorization=`Bearer ${o}`,t;let r=ne();if(!r)throw new Error("Not logged in. Run `magicpath-ai login` first.");if(r.guest&&Date.parse(r.guest.expiresAt)<Date.now())throw new p("Your guest session has expired. Sign up at https://magicpath.ai to keep building.",{code:"GUEST_EXPIRED",suggestion:"Sign up at https://magicpath.ai or start a new guest project from the MagicPath site."});return t.Authorization=`Bearer ${r.accessToken}`,t}function Ee(e){var o,r;let n=(o=e.subscription)!=null&&o.active?(r=e.subscription.type)!=null&&r.startsWith("PRO")?"Pro":"Creator":"Free",t={name:e.name||e.firstName||e.displayName,email:e.email,plan:n};return Wo(t),t}async function bt(){let e=C(),n=await fn.get(te(),{headers:e}),t=n.data.user??n.data;return Ee(t)}async function Pe(e){let n=await fn.get(te(),{headers:e});return((n.data.user??n.data).organizationUsers??[]).map(r=>({id:String(r.organization.id),name:r.organization.name,role:r.role}))}async function L(e,n){let t=await Pe(n),o=t.find(i=>i.id===e);if(o)return{id:o.id,name:o.name};let r=e.toLowerCase(),s=t.find(i=>i.name.toLowerCase()===r);if(s)return{id:s.id,name:s.name};throw new p(`Team "${e}" not found.`,{code:"TEAM_NOT_FOUND",suggestion:"Run `magicpath-ai list-teams` to see your teams."})}var $n=["#95D5B2","#74C69D","#52B788","#40916C","#2D6A4F","#1B4332"];function Go(e){return me.hex($n[Math.min(e,$n.length-1)])}var $t=me.hex("#2D6A4F"),Ho=me.hex("#1B4332"),zo=me.hex("#E8F5E9"),xt=me.hex("#888888"),Vo=["\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557","\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D","\u2588\u2588\u2554\u2588\u2588\u2588\u2588\u2554\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2551 ","\u2588\u2588\u2551\u255A\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551\u2588\u2588\u2551 ","\u2588\u2588\u2551 \u255A\u2550\u255D \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2551\u255A\u2588\u2588\u2588\u2588\u2588\u2588\u2557","\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u255D"],Jo=["\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557","\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u255A\u2550\u2550\u2588\u2588\u2554\u2550\u2550\u255D\u2588\u2588\u2551 \u2588\u2588\u2551","\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551","\u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551","\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551","\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D"],Bo=Vo.map((e,n)=>e+" "+Jo[n]);function Ko(e){return e.map((n,t)=>{let o=Go(t),r="";for(let s of n)r+=s===" "?s:o(s);return r})}function xn(e){let n=!!le(),t=n?bn():null;console.log();for(let s of Ko(Bo))console.log(s);if(console.log(),n&&t){let s=t.plan?` \xB7 ${t.plan}`:"";console.log(" "+$t("\u25CF")+" "+me.bold(zo(t.name??"MagicPath User"))+Ho(" "+(t.email??"")+s))}else console.log(" "+xt("\u25CB Not logged in \xB7 run")+" "+$t("magicpath-ai login"));console.log();let o=20,r=[["search <query>","Search components"],["add <name>","Add to project"],["list-projects","Your projects"],["setup-skills","Set up AI agents"]];for(let[s,i]of r)console.log(" "+$t(s.padEnd(o))+xt(i));console.log(),console.log(" "+xt(`v${e} \u2500 magicpath-ai --help`)),console.log()}import Je from"prompts";import Mn from"ora";import{z as ge}from"zod";import ue from"path";import rr from"os";import jt from"fs-extra";import{pino as vn}from"pino";var de=vn();function pe(){de=vn({level:"debug"}),de.debug({message:"DEBUG logger enabled. "})}var R={info:e=>{de.info(e)},debug:e=>{de.debug(e)},warn:e=>{de.warn(e)},error:e=>{de.error(e)}};import Sn from"axios";import Ve from"path";import Xo from"os";import{Readable as Yo}from"stream";import Ae from"fs-extra";import Zo from"adm-zip";import{v4 as Qo}from"uuid";async function er(e){if(!(e instanceof Yo))return;let n=[];return new Promise((t,o)=>{e.on("data",r=>{n.push(Buffer.isBuffer(r)?r:Buffer.from(r))}),e.on("error",o),e.on("end",()=>t(Buffer.concat(n).toString("utf8")))})}async function tr(e){var n;if(e instanceof p)return e;if(Sn.isAxiosError(e)){let t=await er((n=e.response)==null?void 0:n.data);if(t)try{let o=JSON.parse(t);return D({...e,response:{...e.response,data:o},isAxiosError:!0})}catch{}return D(e)}return new p("Failed to download project. Make sure your key is valid.")}async function jn(e){let n=Me("v1","components/repository"),t=`${Qo()}.zip`,o=Ve.join(Xo.tmpdir(),t);try{let r=await Sn({url:n,params:{key:e},method:"GET",responseType:"stream"});return await Ae.ensureDir(Ve.dirname(o)),await new Promise(async(s,i)=>{try{r.data.pipe(Ae.createWriteStream(o)).on("error",i).once("close",()=>s(o))}catch(c){i(c)}}),o}catch(r){throw await tr(r)}}function vt(e){try{Ae.removeSync(e)}catch{}}function Cn(e,n,t){try{let o=Ve.join(t,n),r=1;for(;Ae.existsSync(o);)r++,o=Ve.join(t,`${n}-${r}`);return Ae.mkdirSync(o,{recursive:!0}),new Zo(e).extractAllTo(o,!0),vt(e),o}catch{throw new p("Failed to extract project. Please try again.")}}import{execSync as St}from"child_process";import Pn from"ora";import En from"fs-extra";import nr from"path";function An(){try{return St("yarn --version",{stdio:"ignore"}),"yarn"}catch{return"npm"}}function kn(e){let n=An(),t=Pn(`\u{1F4E6} Installing dependencies using ${n}...`).start();try{St(n==="yarn"?"yarn install":"npm install",{cwd:e,stdio:"ignore"}),t.succeed("Dependencies installed successfully!")}catch{throw t.fail("Failed to install dependencies"),new p("Failed to install dependencies. Please check your internet connection and try again.")}}function or(e){let n=nr.join(e,"package.json");if(!En.existsSync(n))return new Set;try{let t=En.readJsonSync(n),o=new Set;return t.dependencies&&Object.keys(t.dependencies).forEach(r=>o.add(r)),t.devDependencies&&Object.keys(t.devDependencies).forEach(r=>o.add(r)),o}catch{return new Set}}function Tn(e,n){if(e.length===0)return{installed:[],skipped:[]};let t=or(n),o=e.filter(c=>!t.has(c)),r=e.filter(c=>t.has(c));if(o.length===0)return R.debug("All dependencies already installed"),{installed:[],skipped:r};let s=An(),i=Pn(`\u{1F4E6} Installing ${o.length} package${o.length>1?"s":""} using ${s}...`).start();try{let c=o.join(" "),a=s==="yarn"?`yarn add ${c}`:`npm install ${c}`;return R.debug({command:a}),St(a,{cwd:n,stdio:"ignore"}),i.succeed(`Installed ${o.length} package${o.length>1?"s":""}`),{installed:o,skipped:r}}catch{throw i.fail("Failed to install packages"),new p(`Failed to install packages: ${o.join(", ")}. Please install them manually.`)}}import{execSync as Nn}from"child_process";import Rn from"ora";function On(e,n){let t={cursor:"Cursor",antigravity:"Antigravity",vscode:"VS Code",webstorm:"WebStorm"},o={cursor:["cursor","code"],antigravity:["agy","antigravity"],vscode:["code"],webstorm:["webstorm","web"]},r=Rn(`\u{1F680} Opening project in ${t[n]}...`).start(),s=!1;try{for(let i of o[n]){if(s)break;try{Nn(`${i} .`,{cwd:e,stdio:"ignore"}),s=!0}catch{s=!1}}if(!s)throw new Error("Failed to open with command.");r.succeed(`Project opened in ${t[n]}!`)}catch{r.fail(`Failed to open ${t[n]}`);let i={cursor:`\u274C Cursor command not found!
|
|
3
3
|
|
|
4
4
|
\u{1F527} To fix this, you need to install the Cursor command line tools:
|
|
5
5
|
|
|
@@ -62,10 +62,10 @@ import{readFileSync as es}from"fs";import{dirname as ts,join as ns}from"path";im
|
|
|
62
62
|
export PATH="/Applications/WebStorm.app/Contents/MacOS:$PATH"
|
|
63
63
|
- Or create an alias: alias webstorm="open -na 'WebStorm.app'"
|
|
64
64
|
|
|
65
|
-
\u{1F4D6} More help: https://www.jetbrains.com/help/webstorm/working-with-the-ide-features-from-command-line.html`};throw new p(i[n])}}function
|
|
66
|
-
${n.message}`),process.exit(1)}function
|
|
67
|
-
\u{1F389} Done! Your project is ready to go at: ${l}`)}catch(t){
|
|
68
|
-
`)}function
|
|
65
|
+
\u{1F4D6} More help: https://www.jetbrains.com/help/webstorm/working-with-the-ide-features-from-command-line.html`};throw new p(i[n])}}function Un(e){let n=process.platform,t;switch(n){case"darwin":t="open";break;case"win32":t="explorer";break;default:t="xdg-open";break}let r={darwin:"Finder",win32:"File Explorer",linux:"File Manager"}[n]||"File Manager",s=Rn(`\u{1F4C1} Opening project in ${r}...`).start();try{Nn(`${t} "${e}"`,{stdio:"ignore"}),s.succeed(`Project opened in ${r}!`)}catch{throw s.fail(`Failed to open ${r}`),new p(`Failed to open project in ${r}. The file manager may not be available.`)}}var sr=ge.object({key:ge.string(),debug:ge.boolean().default(!1),ide:ge.enum(["cursor","antigravity","vscode","webstorm"]).optional(),dir:ge.string().optional(),name:ge.string().optional()});function ir(e){let n=D(e);v()&&E(n),console.error(`
|
|
66
|
+
${n.message}`),process.exit(1)}function Fn(e){e.command("clone").description("\u2728 Instantly bring your MagicPath project to your local playground. Edit, remix, and create in your own vibe.").requiredOption("-k, --key <accessKey>","\u{1F511} One-time magic access key to unlock and download your project").option("-d, --debug","Get verbose debug logs in the CLI").option("-i, --ide <ide>","Pre-select IDE to open project in (cursor, antigravity, vscode, webstorm)").option("--dir <directory>","Target directory for non-interactive use").option("--name <projectName>","Project name for non-interactive use").action(async n=>{try{let t;try{t=sr.parse(n)}catch{throw new p("Invalid CLI options for clone command.")}t.debug&&pe();let o=v();o&&(!t.dir||!t.name)&&E(new Error("In JSON mode, --dir and --name are required for clone.")),R.debug({options:n}),R.debug({options:t});let r,s;if(t.dir&&t.name)r=ue.resolve(t.dir),s=t.name,await jt.ensureDir(r);else{let g=rr.homedir(),h=[{name:"Documents",path:ue.join(g,"Documents")},{name:"Desktop",path:ue.join(g,"Desktop")},{name:"Downloads",path:ue.join(g,"Downloads")}],y=(await Promise.all(h.map(async f=>{try{return await jt.pathExists(f.path)?f:null}catch{return null}}))).filter(f=>f!==null),I=[{title:`Right here (current folder: ${process.cwd()})`,value:process.cwd()},{title:`Home directory (${g})`,value:g}];y.forEach(f=>{I.push({title:f.name,value:f.path})}),I.push({title:"Other (specify custom path)",value:"custom"});let{targetDir:b}=await Je({type:"select",name:"targetDir",message:"Where should we put your code?",choices:I,initial:0});if(r=b,b==="custom"){let{customPath:f}=await Je({type:"text",name:"customPath",message:"Enter the full path where you want to create your project:",initial:g,validate:S=>{if(!S)return"Please enter a path";try{return ue.resolve(S),!0}catch{return"Please enter a valid path"}}});if(!f)throw new p("Project creation cancelled");r=ue.resolve(f);try{await jt.ensureDir(r)}catch{throw new p(`Failed to create or access directory: ${r}`)}}if(!r)throw new p("Download cancelled");if(s=(await Je({type:"text",name:"projectName",message:"What would you like to name your project?",initial:"magicpath-project"})).projectName,!s)throw new p("Project creation cancelled")}let i,c=o?null:Mn("\u{1F4E5} Downloading project...").start();try{i=await jn(t.key),R.debug({filename:i}),c==null||c.succeed("Project downloaded")}catch(g){throw c==null||c.fail("Download failed"),g instanceof p?g:new p("Something went wrong!")}let a=o?null:Mn("\u{1F4E6} Unpacking project...").start(),l;try{l=Cn(i,s,r),a==null||a.succeed(`Project unpacked to ${s}`)}catch(g){throw a==null||a.fail("Failed to unpack project"),vt(i),g instanceof p?g:new p("Something went wrong!")}try{kn(l)}catch(g){throw g instanceof p?g:new p("Something went wrong!")}o&&x({projectDir:l});let m=[{title:"Cursor",value:"cursor"},{title:"Antigravity",value:"antigravity"},{title:"VS Code",value:"vscode"},{title:"WebStorm",value:"webstorm"},{title:"Open in file manager",value:"filemanager"},{title:"None (just finish)",value:"none"}],d=0;if(t.ide){let g=m.findIndex(h=>h.value===t.ide);g!==-1&&(d=g)}let u=await Je({type:"select",name:"ide",message:"Which IDE would you like to open the project in?",choices:m,initial:d});if(u.ide&&u.ide!=="none")try{u.ide==="filemanager"?Un(l):On(l,u.ide)}catch(g){R.debug({err:g}),g instanceof p?console.log(g.message):console.log("\u26A0\uFE0F Opening failed, but your project is ready!")}console.log(`
|
|
67
|
+
\u{1F389} Done! Your project is ready to go at: ${l}`)}catch(t){ir(t)}})}import Et from"prompts";import{z as _}from"zod";import Z from"path";import xr from"fs-extra";var X=class extends p{constructor(){super("You must be logged in to install components.")}};import ar from"ora";var Dn="\x1B[38;2;32;140;80m",cr="\x1B[0m",lr=`${Dn}\u2714${cr}`;function P(e){let n=ar(e),t=n.stopAndPersist.bind(n);return n.succeed=o=>t({symbol:lr,text:o}),n}function _n(){let e=process.stdout.write.bind(process.stdout),n=((t,...o)=>(typeof t=="string"&&(t=t.replace(/\x1b\[36m/g,Dn)),e(t,...o)));return process.stdout.write=n,()=>{process.stdout.write=e}}import Ln from"axios";import Y from"fs-extra";import Q from"path";import{z as G}from"zod";var mr=G.object({name:G.string(),path:G.string(),content:G.string()}),dr=G.object({data:G.object({name:G.string(),generatedName:G.string(),files:G.array(mr),utils:G.object({content:G.string()}),dependencies:G.array(G.string())})});function oe(e){let n=e.match(/export\s+default\s+function\s+([A-Z][a-zA-Z0-9]*)/),t=e.match(/export\s+default\s+([A-Z][a-zA-Z0-9]*)\s*[;\n]/),o=e.match(/export\s+function\s+([A-Z][a-zA-Z0-9]*)/),r=e.match(/export\s+const\s+([A-Z][a-zA-Z0-9]*)\s*[=:]/),s=null,i=!1;if(n?(s=n[1],i=!0):t?(s=t[1],i=!0):o?s=o[1]:r&&(s=r[1]),!s)return null;let c=`${s}Props`,a=new RegExp(`(?:interface|type)\\s+${c}\\s*(?:=\\s*)?\\{([^}]*)\\}`,"s"),l=e.match(a),m=[],d=[];if(l){let g=l[1].split(/[;\n]/).filter(h=>h.trim());for(let h of g){let w=h.trim();if(!w||w.startsWith("//")||w.startsWith("/*"))continue;let y=w.match(/^(\w+)(\?)?:/);if(y){let I=y[1],b=!!y[2];if(I==="children")continue;b?d.push(I):m.push(I)}}}return{name:s,isDefault:i,propsType:l?c:void 0,requiredProps:m,optionalProps:d}}function fe(e,n){return e.isDefault?`import ${e.name} from '${n}';`:`import { ${e.name} } from '${n}';`}function he(e){let{name:n,requiredProps:t,optionalProps:o}=e;if(t.length===0&&o.length===0)return`<${n} />`;let r=t.map(s=>`${s}={/* TODO */}`).join(" ");return r?`<${n} ${r} />`:`<${n} />`}function pr(e){let{componentName:n,importPath:t,exportInfo:o,fileName:r}=e,s=[`# ${n}`,"","## Import","","```tsx"];if(o){if(s.push(fe(o,t)),s.push("```"),s.push(""),s.push("## Usage"),s.push(""),s.push("```tsx"),s.push(he(o)),s.push("```"),o.requiredProps.length>0){s.push(""),s.push("## Required Props"),s.push("");for(let i of o.requiredProps)s.push(`- \`${i}\``)}if(o.optionalProps.length>0){s.push(""),s.push("## Optional Props"),s.push("");for(let i of o.optionalProps)s.push(`- \`${i}\``)}}else s.push(`import { ${r} } from '${t}';`),s.push("```");return s.push(""),s.join(`
|
|
68
|
+
`)}function Wn(e,n){let t=pr(n),o=Q.join(e,"usage.md");Y.writeFileSync(o,t,"utf8"),R.debug({message:"Wrote usage file",usagePath:o})}async function ke(e){var o,r,s;let n=Jt(e);R.debug({message:"Fetching component from registry",url:n});let t;try{t=C()}catch{throw new X}try{let i=await Ln.get(n,{headers:t});return dr.parse(i.data).data}catch(i){throw i instanceof p?i:Ln.isAxiosError(i)?((o=i.response)==null?void 0:o.status)===401?new X:((r=i.response)==null?void 0:r.status)===403?new p("A Pro subscription is required to install components. Visit https://www.magicpath.ai/documentation/help/plans to see the plans available.",{code:"FORBIDDEN",suggestion:"Upgrade to a Pro subscription at https://www.magicpath.ai/documentation/help/plans"}):((s=i.response)==null?void 0:s.status)===404?new p(`Component "${e}" not found. Please check the name and try again.`,{code:"NOT_FOUND",suggestion:"Run `magicpath-ai search <query>` to find available components."}):D(i):new p("Failed to fetch component. Please check your internet connection and try again.")}}function Gn(e,n){let t=[];for(let o of e){let r=Q.join(n,o.path);Y.existsSync(r)&&t.push(o.path)}return t}function gr(e,n=1){let t="../".repeat(n),o=e;return o=o.replace(/((?:import|export)(?:\s+type)?\s+(?:(?:\{[^}]*\}|\*\s+as\s+\w+|\w+)(?:\s*,\s*(?:\{[^}]*\}|\*\s+as\s+\w+|\w+))*\s+from\s+)?['"])(\.\.\/)([^'"]+['"])/g,(r,s,i,c)=>`${s}${t}${i}${c}`),o=o.replace(/(import\s*\(\s*['"])(\.\.\/)([^'"]+['"]\s*\))/g,(r,s,i,c)=>`${s}${t}${i}${c}`),o=o.replace(/(require\s*\(\s*['"])(\.\.\/)([^'"]+['"]\s*\))/g,(r,s,i,c)=>`${s}${t}${i}${c}`),o}function Hn(e,n,t=!1){Y.ensureDirSync(n);for(let o of e){let r=Q.join(n,o.path),s=Q.dirname(r);Y.ensureDirSync(s);let i=t?gr(o.content):o.content;Y.writeFileSync(r,i,"utf8"),R.debug({message:"Wrote file",filePath:r})}}function zn(e){let n=Q.join(e,"utils.ts");if(!Y.existsSync(n))return!1;try{return Y.readFileSync(n,"utf8").includes("export function cn")}catch{return!1}}function Vn(e,n){Y.ensureDirSync(n);let t=Q.join(n,"utils.ts");Y.writeFileSync(t,e,"utf8"),R.debug({message:"Wrote utils file",utilsPath:t})}var Te="src/components/magicpath",ur="src/lib";function Be(e){return e.trim().replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase().replace(/[\s_]+/g,"-").replace(/[^a-z0-9-]/g,"").replace(/-+/g,"-").replace(/^-+|-+$/g,"")||"component"}function Ke(e,n=process.cwd()){let t=e||Te;return Q.join(n,t)}function Jn(e=process.cwd()){return Q.join(e,ur)}import fr from"http";import hr from"ora";import qe from"axios";import{exec as wr}from"child_process";var yr=12e4,Kn=`
|
|
69
69
|
*{margin:0;padding:0;box-sizing:border-box}
|
|
70
70
|
body{font-family:Geist,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;background:#fff;color:#1a1a1a;padding:1rem}
|
|
71
71
|
.card{position:relative;width:100%;max-width:32rem;background:#fff;border-radius:1.5rem;box-shadow:0 1px 3px rgba(0,0,0,.1),0 8px 10px -1px rgba(0,0,0,.1);overflow:hidden}
|
|
@@ -75,80 +75,80 @@ body{font-family:Geist,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;di
|
|
|
75
75
|
.icon-box svg{width:2rem;height:2rem}
|
|
76
76
|
h1{font-size:1.5rem;font-weight:600;margin-bottom:.5rem;text-align:center}
|
|
77
77
|
p{color:#999;font-size:.9rem;text-align:center;max-width:24rem;line-height:1.5}
|
|
78
|
-
`,
|
|
78
|
+
`,Ir='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="#085C34"><path stroke-linecap="round" stroke-linejoin="round" d="M9 12.75 11.25 15 15 9.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"/></svg>',br='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="#dc2626"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 3.75h.008v.008H12v-.008Z"/></svg>',$r=`<!DOCTYPE html>
|
|
79
79
|
<html><head><meta charset="utf-8"><title>MagicPath CLI</title>
|
|
80
|
-
<style>${
|
|
80
|
+
<style>${Kn}</style>
|
|
81
81
|
</head><body><div class="card"><div class="gradient"></div><div class="content">
|
|
82
|
-
<div class="icon-box">${
|
|
82
|
+
<div class="icon-box">${Ir}</div>
|
|
83
83
|
<h1>Logged in!</h1>
|
|
84
84
|
<p>You can close this tab and return to your terminal.</p>
|
|
85
|
-
</div></div></body></html>`,
|
|
85
|
+
</div></div></body></html>`,Bn=e=>`<!DOCTYPE html>
|
|
86
86
|
<html><head><meta charset="utf-8"><title>MagicPath CLI</title>
|
|
87
|
-
<style>${
|
|
87
|
+
<style>${Kn}</style>
|
|
88
88
|
</head><body><div class="card"><div class="gradient"></div><div class="content">
|
|
89
|
-
<div class="icon-box">${
|
|
89
|
+
<div class="icon-box">${br}</div>
|
|
90
90
|
<h1>Login failed</h1>
|
|
91
91
|
<p>${e}</p>
|
|
92
|
-
</div></div></body></html>`;async function
|
|
92
|
+
</div></div></body></html>`;async function Ct(){return new Promise((e,n)=>{let t=!1,o,r=fr.createServer(async(c,a)=>{var d;let l=new URL(c.url||"/","http://localhost");if(l.pathname!=="/callback"){a.writeHead(404,{"Content-Type":"text/plain"}),a.end("Not found");return}let m=l.searchParams.get("code");if(!m){a.writeHead(400,{"Content-Type":"text/html"}),a.end(Bn("No authorization code received."));return}try{let u=await qe.post(_e("extension/tokens"),{token:m}),{access_token:g,refresh_token:h}=u.data;It(g,h);try{await bt()}catch{}a.writeHead(200,{"Content-Type":"text/html"}),a.end($r),s(),i.succeed("Logged in successfully!"),t=!0,e(!0)}catch(u){console.error(u);let g=qe.isAxiosError(u)&&((d=u.response)==null?void 0:d.status)===400?"Invalid or expired authorization code. Please try again.":"Failed to exchange code. Please try again.";a.writeHead(400,{"Content-Type":"text/html"}),a.end(Bn(g)),s(),i.fail("Login failed"),t=!0,n(new p(g))}});function s(){clearTimeout(o),r.close()}r.listen(0,"127.0.0.1",()=>{let c=r.address();if(!c||typeof c=="string"){t=!0,n(new p("Failed to start local auth server."));return}let a=c.port,l=Fe(`/auth/cli?port=${a}`);console.log(`
|
|
93
93
|
Opening your browser to log in...
|
|
94
94
|
`),console.log(`If the browser doesn't open, visit: ${l}
|
|
95
|
-
`);let m=process.platform;
|
|
96
|
-
${t.message}`),process.exit(1)),t}}),e.command("logout").description("Log out of your MagicPath account").action(()=>{
|
|
95
|
+
`);let m=process.platform;wr(`${m==="darwin"?"open":m==="win32"?"start":"xdg-open"} "${l}"`)});let i=hr("Waiting for browser login...").start();o=setTimeout(()=>{t||(s(),i.fail("Login timed out"),console.log("\nTip: You can also log in with `magicpath-ai login --code <code>`."),t=!0,e(!1))},yr)})}function qn(e){e.command("login").description("Log in to your MagicPath account").option("--code <code>","Exchange an authorization code non-interactively").option("--guest-code <code>","Connect to a guest project using a one-time pairing code (no account needed)").action(async n=>{try{if(n.guestCode){let o;try{o=await qe.post(_e("guest/tokens"),{code:n.guestCode})}catch(l){throw D(l)}let{access_token:r,session_id:s,project_id:i,expires_at:c}=o.data;wn(r,{sessionId:String(s),projectId:String(i),expiresAt:String(c)});let a=De(String(i),r);v()&&x({authenticated:!0,guest:!0,projectId:String(i),expiresAt:String(c),canvasUrl:a}),console.log("Connected to your guest project!"),console.log(` Project ID: ${i}`),console.log(` Canvas: ${a}`),console.log(" Changes you make will appear live on the canvas.");return}if(n.code){let o=await qe.post(_e("extension/tokens"),{token:n.code}),{access_token:r,refresh_token:s}=o.data;It(r,s);try{await bt()}catch{}v()&&x({authenticated:!0,method:"code"}),console.log("Logged in successfully!");return}v()&&(process.env.MAGICPATH_TOKEN&&x({authenticated:!0,method:"environment"}),le()&&x({authenticated:!0,method:"stored"}),E(new Error("Not authenticated. Set MAGICPATH_TOKEN environment variable or run login interactively."))),await Ct()||console.log("Login cancelled.")}catch(t){throw v()&&E(t),t instanceof p&&(console.error(`
|
|
96
|
+
${t.message}`),process.exit(1)),t}}),e.command("logout").description("Log out of your MagicPath account").action(()=>{In(),v()&&x({loggedOut:!0}),console.log("Logged out successfully.")})}var vr=_.object({yes:_.boolean().default(!1),overwrite:_.boolean().default(!1),path:_.string().optional(),debug:_.boolean().default(!1),dryRun:_.boolean().default(!1)}),Bi=_.object({component:_.string(),generatedName:_.string(),filesWritten:_.array(_.string()),dependenciesInstalled:_.array(_.string()),importStatement:_.string().optional(),usage:_.string().optional(),dryRun:_.boolean()});function Xn(e){e.command("add").description("Add a MagicPath component to your project").argument("<generatedNames...>","One or more generated names of components (e.g., wispy-river-5234 bold-moon-2031)").option("-y, --yes","Skip confirmation prompts",!1).option("--overwrite","Overwrite existing files",!1).option("-p, --path <path>",`Custom path for components (default: ${Te})`).option("-d, --debug","Enable debug logging",!1).option("--dry-run","Show what would happen without writing files",!1).action(async(n,t)=>{try{let o;try{o=vr.parse(t)}catch{throw new Error("Invalid CLI options for add command.")}o.debug&&pe();let r=v();r&&(o.yes=!0);let s=n.length>1;s&&(o.yes=!0),R.debug({generatedNames:n,options:o});let i=process.cwd(),c=Z.join(i,"package.json");if(!xr.existsSync(c))throw new p("No package.json found. Please run this command from the root of your React project.",{code:"MISSING_PACKAGE_JSON",suggestion:"Run this command from the root of your project where package.json is located."});let a=[];s&&!r&&console.log(`
|
|
97
97
|
Adding ${n.length} components...
|
|
98
|
-
`);for(let l of n)try{let m=r?null:
|
|
99
|
-
The following files already exist:`),
|
|
100
|
-
This will install:`),console.log(` Component: ${d.name}`),console.log(` Files: ${d.files.length} file(s) to ${Z.relative(i,h)||"."}`),console.log(` Dependencies: ${d.dependencies.length} package(s)`);let{shouldProceed:
|
|
101
|
-
[Dry run] Would install:`),console.log(` Component: ${d.name}`),console.log(` Files: ${
|
|
102
|
-
\u26A0\uFE0F ${
|
|
98
|
+
`);for(let l of n)try{let m=r?null:P(`Fetching component "${l}"...`).start(),d;try{d=await ke(l),m==null||m.succeed(`Found component: ${d.name}`)}catch(j){if(j instanceof X){if(m==null||m.fail("Not logged in"),r||s)throw new p("Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.",{code:"NOT_AUTHENTICATED",suggestion:"Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable."});let{shouldLogin:k}=await Et({type:"confirm",name:"shouldLogin",message:"You need to be logged in to install components. Log in now?",initial:!0});if(!k){console.log("Installation cancelled.");return}if(!await Ct()){console.log("Installation cancelled.");return}let H=P(`Fetching component "${l}"...`).start();try{d=await ke(l),H.succeed(`Found component: ${d.name}`)}catch(Lt){throw H.fail("Failed to fetch component"),Lt instanceof p?Lt:new p("Something went wrong!")}}else{if(m==null||m.fail("Failed to fetch component"),s){let k=j instanceof p?j.message:"Something went wrong!";a.push({component:l,generatedName:l,filesWritten:[],dependenciesInstalled:[],dryRun:o.dryRun,error:k}),r||console.log(` \u26A0\uFE0F Skipping "${l}": ${k}`);continue}throw j instanceof p?j:new p("Something went wrong!")}}let u=Ke(o.path,i),g=Be(d.name),h=Z.join(u,g),w=Jn(i);R.debug({basePath:u,componentFolderName:g,componentsPath:h,utilsPath:w});let y=Gn(d.files,h);if(y.length>0&&!o.overwrite)if(r||(console.log(`
|
|
99
|
+
The following files already exist:`),y.forEach(j=>console.log(` - ${j}`))),o.yes){if(s){r||console.log(` \u26A0\uFE0F Skipping "${d.name}": files already exist. Use --overwrite.`),a.push({component:d.name,generatedName:d.generatedName,filesWritten:[],dependenciesInstalled:[],dryRun:o.dryRun,error:"Files already exist. Use --overwrite to replace."});continue}if(r)throw new p(`Files already exist: ${y.join(", ")}. Use --overwrite to replace.`,{code:"FILES_EXIST",suggestion:"Pass `--overwrite` to replace existing files."});console.log("Use --overwrite to replace existing files.");return}else{let{shouldOverwrite:j}=await Et({type:"confirm",name:"shouldOverwrite",message:"Do you want to overwrite these files?",initial:!1});if(!j){console.log("Installation cancelled.");return}}if(!o.yes&&y.length===0){console.log(`
|
|
100
|
+
This will install:`),console.log(` Component: ${d.name}`),console.log(` Files: ${d.files.length} file(s) to ${Z.relative(i,h)||"."}`),console.log(` Dependencies: ${d.dependencies.length} package(s)`);let{shouldProceed:j}=await Et({type:"confirm",name:"shouldProceed",message:"Proceed with installation?",initial:!0});if(!j){console.log("Installation cancelled.");return}}let I=d.files.map(j=>Z.relative(i,Z.join(h,j.path))),b=d.files[0],$,f;if(b){let j=b.name.replace(/\.tsx?$/,""),k=o.path?`@/${o.path}/${g}/${j}`:`@/components/magicpath/${g}/${j}`,F=oe(b.content);F?($=fe(F,k),f=he(F)):$=`import { ${j} } from '${k}';`}if(o.dryRun){let j=r?d.files.map(k=>({path:k.path,name:k.name,content:k.content})):void 0;!s&&r&&x({component:d.name,generatedName:d.generatedName,filesWritten:I,files:j,dependenciesInstalled:d.dependencies,importStatement:$,usage:f,dryRun:!0}),a.push({component:d.name,generatedName:d.generatedName,filesWritten:I,dependenciesInstalled:d.dependencies,importStatement:$,usage:f,dryRun:!0}),r||(console.log(`
|
|
101
|
+
[Dry run] Would install:`),console.log(` Component: ${d.name}`),console.log(` Files: ${I.join(", ")}`),console.log(` Dependencies: ${d.dependencies.join(", ")||"none"}`),$&&console.log(` Import: ${$}`));continue}let S=r?null:P("Writing component files...").start();try{Hn(d.files,h,!0),S==null||S.succeed(`Wrote ${d.files.length} file(s) to ${Z.relative(i,h)||"."}`)}catch{if(S==null||S.fail("Failed to write component files"),s){a.push({component:d.name,generatedName:d.generatedName,filesWritten:[],dependenciesInstalled:[],dryRun:!1,error:"Failed to write component files."});continue}throw new p("Failed to write component files. Please check permissions and try again.")}if(!zn(w)&&d.utils.content){let j=r?null:P("Installing utilities...").start();try{Vn(d.utils.content,w),j==null||j.succeed(`Wrote utils.ts to ${Z.relative(i,w)||"."}`)}catch(k){j==null||j.fail("Failed to write utils file"),R.debug({err:k}),r||console.log(" Warning: Could not write utils.ts. You may need to create it manually.")}}let A=[];if(d.dependencies.length>0)try{let{installed:j,skipped:k}=Tn(d.dependencies,i);A.push(...j),k.length>0&&R.debug({message:"Skipped already installed packages",skipped:k})}catch(j){j instanceof p&&(r||console.log(`
|
|
102
|
+
\u26A0\uFE0F ${j.message}`))}if(a.push({component:d.name,generatedName:d.generatedName,filesWritten:I,dependenciesInstalled:A,importStatement:$,usage:f,dryRun:!1}),!s&&r&&x({component:d.name,generatedName:d.generatedName,filesWritten:I,dependenciesInstalled:A,importStatement:$,usage:f,dryRun:!1}),r||(console.log(`
|
|
103
103
|
\u2705 Successfully added "${d.name}" to your project!`),s||console.log(`
|
|
104
|
-
Usage:`)),b){let
|
|
105
|
-
\u{1F4C4} Usage documentation written to ${Z.relative(i,Z.join(h,"usage.md"))}`)}catch(
|
|
104
|
+
Usage:`)),b){let j=b.name.replace(/\.tsx?$/,""),k=o.path?`@/${o.path}/${g}/${j}`:`@/components/magicpath/${g}/${j}`,F=oe(b.content);!s&&!r&&(F?(console.log(` ${fe(F,k)}`),console.log(""),console.log(` ${he(F)}`),F.requiredProps.length>0&&(console.log(""),console.log(` Required props: ${F.requiredProps.join(", ")}`))):console.log(` import { ${j} } from '${k}';`));try{Wn(h,{componentName:d.name,importPath:k,exportInfo:F,fileName:j}),!s&&!r&&console.log(`
|
|
105
|
+
\u{1F4C4} Usage documentation written to ${Z.relative(i,Z.join(h,"usage.md"))}`)}catch(H){R.debug({err:H})}}}catch(m){if(s){let d=m instanceof Error?m.message:String(m);a.push({component:l,generatedName:l,filesWritten:[],dependenciesInstalled:[],dryRun:o.dryRun,error:d}),r||console.log(` \u26A0\uFE0F Failed "${l}": ${d}`);continue}throw m}if(s){r&&x({results:a,total:a.length,succeeded:a.filter(d=>!d.error).length,failed:a.filter(d=>d.error).length});let l=a.filter(d=>!d.error),m=a.filter(d=>d.error);console.log(`
|
|
106
106
|
${l.length} of ${a.length} component(s) added successfully.`),m.length>0&&console.log(` ${m.length} failed: ${m.map(d=>d.generatedName).join(", ")}`)}}catch(o){throw v()&&E(o),o instanceof p&&(console.error(`
|
|
107
|
-
${o.message}`),process.exit(1)),o}})}import
|
|
107
|
+
${o.message}`),process.exit(1)),o}})}import Yn from"axios";function Zn(e){e.command("whoami").description("Show the currently authenticated user").action(async()=>{var t;let n=v();try{let o=V();if(o){let i=yn();n&&x({authenticated:!0,guest:!0,projectId:o.projectId,expiresAt:o.expiresAt,canvasUrl:i}),console.log(`
|
|
108
108
|
Guest session (no account)`),console.log(` Project ID: ${o.projectId}`),i&&console.log(` Canvas: ${i}`),console.log(` Expires: ${o.expiresAt}`),console.log(`
|
|
109
|
-
Sign up at https://magicpath.ai to keep this project.`);return}let r;try{r=
|
|
110
|
-
Name: ${a.name||"N/A"}`),console.log(` Email: ${a.email||"N/A"}`),c.id&&console.log(` ID: ${c.id}`),console.log(` Plan: ${a.plan}`)}catch(i){throw s==null||s.fail("Failed to fetch user info"),
|
|
111
|
-
${o.message}`),process.exit(1)),o}})}import
|
|
112
|
-
No projects found.`);return}console.log("");let w=Math.max(4,...h.map(f=>(f.name||"").length)),
|
|
113
|
-
Showing ${h.length} of ${g}. Use --offset ${r+h.length} to see more.`)}catch(m){throw l==null||l.fail("Failed to fetch projects"),m instanceof p?m:
|
|
114
|
-
${a.message}`),process.exit(1)),a}}),e.command("list-components").description("List components in a project").argument("<projectId>","The project ID").option("--limit <n>","Maximum number of results","100").option("--after <id>","Cursor: fetch components after this ID (for pagination)").option("--sort-by <field>","Sort by field (name, createdAt)","name").option("--order <dir>","Sort direction (asc, desc)","asc").option("--created-by <userId>","Filter to components created or edited by this user ID").action(async(n,t)=>{var s,i,c,a,l;let o=v(),r=parseInt(t.limit,10)||100;try{let m;try{m=
|
|
115
|
-
No components found.`);return}console.log("");let b=Math.max(4,...w.map(f=>(f.name||"").length)),$=Math.max(14,...w.map(f=>(f.generatedName||"").length));console.log(` ${"Name".padEnd(b)} ${"Generated Name".padEnd($)} ${"Rev".padEnd(4)} ${"Views".padEnd(6)} ${"Likes".padEnd(6)} ${"Remixes".padEnd(7)} ${"Updated".padEnd(10)} ID`),console.log(` ${"\u2500".repeat(b)} ${"\u2500".repeat($)} ${"\u2500".repeat(4)} ${"\u2500".repeat(6)} ${"\u2500".repeat(6)} ${"\u2500".repeat(7)} ${"\u2500".repeat(10)} ${"\u2500".repeat(20)}`);for(let f of w){let S=(f.name||"").padEnd(b),U=(f.generatedName||"").padEnd($),
|
|
116
|
-
More results available. Use --after ${
|
|
117
|
-
${m.message}`),process.exit(1)),m}})}import{execSync as
|
|
118
|
-
No components matching "${n}".`);return}console.log("");let w=Math.max(4,...h.map($=>$.name.length)),
|
|
119
|
-
${c.message}`),process.exit(1)),c}})}import{z as W}from"zod";var
|
|
109
|
+
Sign up at https://magicpath.ai to keep this project.`);return}let r;try{r=C()}catch{throw new p("Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.",{code:"NOT_AUTHENTICATED",suggestion:"Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable."})}let s=n?null:P("Fetching user info...").start();try{let i=await Yn.get(te(),{headers:r}),c=i.data.user??i.data;s==null||s.succeed("Authenticated");let a=Ee(c);n&&x(c),console.log(`
|
|
110
|
+
Name: ${a.name||"N/A"}`),console.log(` Email: ${a.email||"N/A"}`),c.id&&console.log(` ID: ${c.id}`),console.log(` Plan: ${a.plan}`)}catch(i){throw s==null||s.fail("Failed to fetch user info"),Yn.isAxiosError(i)?((t=i.response)==null?void 0:t.status)===401?new p("Token is invalid or expired. Run `magicpath-ai login` to re-authenticate.",{code:"TOKEN_EXPIRED",suggestion:"Run `magicpath-ai login` to re-authenticate."}):D(i):i}}catch(o){throw n&&E(o),o instanceof p&&(console.error(`
|
|
111
|
+
${o.message}`),process.exit(1)),o}})}import Pt from"axios";import Xe from"axios";function Ye(e){var t;let n=((t=e.data.data)==null?void 0:t.projects)??e.data.projects??e.data;return Array.isArray(n)?n:[]}async function ee(e,n){if(n!=null&&n.personal){let c=await Xe.get(`${pt()}`,{headers:e});return Ye(c).map(a=>{var l;return{...a,ownerType:"personal",ownerName:((l=a.owner)==null?void 0:l.email)??""}})}if(n!=null&&n.orgId){let c=await Xe.get(`${ft(n.orgId)}`,{headers:{...e,"X-Organization-ID":n.orgId}});return Ye(c).map(a=>({...a,ownerType:"team",ownerName:n.orgName??""}))}let t=await Pe(e),o=[Xe.get(`${pt()}`,{headers:e}).then(c=>Ye(c).map(a=>{var l;return{...a,ownerType:"personal",ownerName:((l=a.owner)==null?void 0:l.email)??""}})),...t.map(c=>Xe.get(`${ft(c.id)}`,{headers:{...e,"X-Organization-ID":c.id}}).then(a=>Ye(a).map(l=>({...l,ownerType:"team",ownerName:c.name}))).catch(()=>[]))],s=(await Promise.all(o)).flat(),i=new Set;return s.filter(c=>{let a=String(c.id);return i.has(a)?!1:(i.add(a),!0)})}var Ne="MAGICPATH_TEAM_ID";function we(){var n;let e=(n=process.env[Ne])==null?void 0:n.trim();return e||null}function J(e){return e??we()??void 0}function Ze(){let e=we();if(e)throw new p(`--personal is not available: team mode is enforced (${Ne}=${e}).`,{code:"TEAM_MODE_ENFORCED",suggestion:`Run the command against the enforced team instead, or unset ${Ne}.`})}function ye(e){let n=we();if(n&&e!==n)throw new p(`Team mismatch: team mode is enforced (${Ne}=${n}) but this command targeted team ${e}.`,{code:"TEAM_MODE_ENFORCED",suggestion:`Target the enforced team, or unset ${Ne}.`})}function Qn(e){e.command("list-projects").description("List all projects (personal and team)").option("--limit <n>","Maximum number of results").option("--offset <n>","Number of results to skip","0").option("--team <nameOrId>","Filter to a specific team").option("--personal","Show only personal projects").action(async n=>{var s,i,c;let t=v(),o=n.limit?parseInt(n.limit,10):void 0,r=parseInt(n.offset,10)||0;try{if(n.team&&n.personal)throw new p("Cannot use --team and --personal together.",{code:"INVALID_OPTIONS",suggestion:"Use --team to filter by team, or --personal for personal projects only."});let a;try{a=C()}catch{throw new p("Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.",{code:"NOT_AUTHENTICATED",suggestion:"Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable."})}let l=t?null:P("Fetching projects...").start();try{n.personal&&Ze();let m=n.personal?void 0:J(n.team),d;if(n.personal)d={personal:!0};else if(m){let f=await L(m,a);ye(f.id),d={orgId:f.id,orgName:f.name}}let u=await ee(a,d),g=u.length,h=u;if(r>0&&(h=h.slice(r)),o!==void 0&&(h=h.slice(0,o)),l==null||l.succeed(`Found ${g} project(s)`),t&&x({projects:h,pagination:{total:g,limit:o??g,offset:r,hasMore:r+h.length<g}}),h.length===0){console.log(`
|
|
112
|
+
No projects found.`);return}console.log("");let w=Math.max(4,...h.map(f=>(f.name||"").length)),y=Math.max(9,...h.map(f=>f.ownerType==="personal"?8:(f.ownerName||"").length)),I=7,b=10,$=10;console.log(` ${"Name".padEnd(w)} ${"Type".padEnd(I)} ${"Components".padEnd(b)} ${"Workspace".padEnd(y)} Updated`),console.log(` ${"\u2500".repeat(w)} ${"\u2500".repeat(I)} ${"\u2500".repeat(b)} ${"\u2500".repeat(y)} ${"\u2500".repeat($)}`);for(let f of h){let S=(f.name||"").padEnd(w),U=(f.isLibrary?"library":"project").padEnd(I),A=String(f.componentCount??((s=f._count)==null?void 0:s.components)??"?").padEnd(b),j=(f.ownerType==="personal"?"Personal":f.ownerName||"").padEnd(y),k=f.updatedAt?new Date(f.updatedAt).toISOString().slice(0,10):"";console.log(` ${S} ${U} ${A} ${j} ${k}`)}o!==void 0&&r+h.length<g&&console.log(`
|
|
113
|
+
Showing ${h.length} of ${g}. Use --offset ${r+h.length} to see more.`)}catch(m){throw l==null||l.fail("Failed to fetch projects"),m instanceof p?m:Pt.isAxiosError(m)?((i=m.response)==null?void 0:i.status)===401?new p("Token is invalid or expired. Run `magicpath-ai login`.",{code:"TOKEN_EXPIRED",suggestion:"Run `magicpath-ai login` to re-authenticate."}):new p(`API error: ${(c=m.response)==null?void 0:c.status}`):m}}catch(a){throw t&&E(a),a instanceof p&&(console.error(`
|
|
114
|
+
${a.message}`),process.exit(1)),a}}),e.command("list-components").description("List components in a project").argument("<projectId>","The project ID").option("--limit <n>","Maximum number of results","100").option("--after <id>","Cursor: fetch components after this ID (for pagination)").option("--sort-by <field>","Sort by field (name, createdAt)","name").option("--order <dir>","Sort direction (asc, desc)","asc").option("--created-by <userId>","Filter to components created or edited by this user ID").action(async(n,t)=>{var s,i,c,a,l;let o=v(),r=parseInt(t.limit,10)||100;try{let m;try{m=C()}catch{throw new p("Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.",{code:"NOT_AUTHENTICATED",suggestion:"Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable."})}let d=o?null:P("Fetching components...").start();try{let u=new URLSearchParams({limit:String(r),revisionStatus:"COMPLETED",sortBy:t.sortBy,order:t.order});t.after&&u.set("after",t.after),t.createdBy&&u.set("createdBy",t.createdBy);let g=`${Qt(n)}?${u}`,h=await Pt.get(g,{headers:m}),w=((s=h.data.data)==null?void 0:s.components)??h.data.components??h.data,y=((i=h.data.data)==null?void 0:i.pagination)??h.data.pagination,I=Array.isArray(w)?w.length:0;if(d==null||d.succeed(`Found ${I} component(s)`),o&&x({components:w,pagination:y??{limit:r,hasNext:!1,lastId:null}}),!Array.isArray(w)||w.length===0){console.log(`
|
|
115
|
+
No components found.`);return}console.log("");let b=Math.max(4,...w.map(f=>(f.name||"").length)),$=Math.max(14,...w.map(f=>(f.generatedName||"").length));console.log(` ${"Name".padEnd(b)} ${"Generated Name".padEnd($)} ${"Rev".padEnd(4)} ${"Views".padEnd(6)} ${"Likes".padEnd(6)} ${"Remixes".padEnd(7)} ${"Updated".padEnd(10)} ID`),console.log(` ${"\u2500".repeat(b)} ${"\u2500".repeat($)} ${"\u2500".repeat(4)} ${"\u2500".repeat(6)} ${"\u2500".repeat(6)} ${"\u2500".repeat(7)} ${"\u2500".repeat(10)} ${"\u2500".repeat(20)}`);for(let f of w){let S=(f.name||"").padEnd(b),U=(f.generatedName||"").padEnd($),A=String(f.revisionCount??"?").padEnd(4),j=String(f.viewCount??0).padEnd(6),k=String(f.likeCount??0).padEnd(6),F=String(f.remixCount??0).padEnd(7),H=f.updatedAt?new Date(f.updatedAt).toISOString().slice(0,10):"";console.log(` ${S} ${U} ${A} ${j} ${k} ${F} ${H.padEnd(10)} ${f.id||""}`)}y!=null&&y.hasNext&&console.log(`
|
|
116
|
+
More results available. Use --after ${y.lastId} to see the next page.`)}catch(u){throw d==null||d.fail("Failed to fetch components"),Pt.isAxiosError(u)?((c=u.response)==null?void 0:c.status)===401?new p("Token is invalid or expired. Run `magicpath-ai login`.",{code:"TOKEN_EXPIRED",suggestion:"Run `magicpath-ai login` to re-authenticate."}):((a=u.response)==null?void 0:a.status)===404?new p(`Project "${n}" not found.`,{code:"NOT_FOUND",suggestion:"Run `magicpath-ai list-projects` to see available projects."}):new p(`API error: ${(l=u.response)==null?void 0:l.status}`):u}}catch(m){throw o&&E(m),m instanceof p&&(console.error(`
|
|
117
|
+
${m.message}`),process.exit(1)),m}})}import{execSync as Sr}from"child_process";function eo(e){e.command("setup-skills").description("Set up MagicPath for AI agents").action(async()=>{console.log("Installing MagicPath skills..."),Sr("npx skills add https://github.com/MagicPathAI/agent-skills --skill magicpath -y",{stdio:"inherit"})})}import{exec as jr}from"child_process";function Qe(e){return/^\d+$/.test(e)?{type:"project",url:Bt(e),projectId:e}:{type:"component",url:Me("v1",e),generatedName:e}}function to(e){e.command("view").alias("view-component").description("Open a component preview or a project in the browser").argument("<identifier>","A component generatedName (e.g., wispy-river-5234) or a project id").action(n=>{let t=Qe(n);v()&&x(t);let o=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";jr(`${o} ${t.url}`),console.log(`Opening ${t.url}`)})}function no(e){e.command("share").description("Get a shareable URL for a component or a project").argument("<identifier>","A component generatedName (e.g., wispy-river-5234) or a project id").action(n=>{let t=Qe(n);if(v()){x(t);return}console.log(t.url)})}import oo from"axios";function ro(e){e.command("info").description("Show project and auth status (useful for agent context injection)").action(async()=>{var t,o;let n=v();try{let r=null,s=!1,i=null;process.env.MAGICPATH_TOKEN?(r="environment",s=!0,i=C()):le()&&(r="stored",s=!0,i=C());let c=s&&i?V():null,a=null,l=null;if(s&&i&&!c)try{let u=await oo.get(te(),{headers:i}),g=u.data.user??u.data,h=Ee(g);a={id:g.id,name:h.name??"Unknown",email:h.email??""},l=(g.organizationUsers??[]).map(y=>({id:String(y.organization.id),name:y.organization.name,role:y.role}))}catch{}let m=null;if(c&&i){let u=null,g=0;try{let h=await oo.get(ae(c.projectId),{headers:i}),w=((t=h.data.data)==null?void 0:t.project)??h.data.project??h.data;u=(w==null?void 0:w.name)??null,g=(w==null?void 0:w.componentCount)??((o=w==null?void 0:w._count)==null?void 0:o.components)??0}catch{}m=[{id:c.projectId,name:u??"Guest project",componentCount:g,ownerType:"personal",ownerName:""}]}else if(s&&i)try{m=(await ee(i)).map(g=>{var h;return{id:g.id,name:g.name,componentCount:g.componentCount??((h=g._count)==null?void 0:h.components)??0,ownerType:g.ownerType,ownerName:g.ownerName}})}catch{}let d={auth:{authenticated:s,method:r,guest:!!c,user:a},teamMode:we()?{enforced:!0,teamId:we()}:{enforced:!1},teams:l,projects:m,cli:{version:q,commands:["add","view","share","search","inspect","list-projects","list-components","list-teams","list-members","list-themes","get-theme","list-installed","selection","active-project","code","image","login","logout","whoami","info","clone","setup-skills"]}};if(n&&x(d),console.log(""),console.log(` MagicPath CLI v${q}`),console.log(""),c?console.log(" Authenticated: yes (guest session)"):s&&a?(console.log(` Authenticated: yes (${r})`),console.log(` User: ${a.name} <${a.email}>`)):s?(console.log(` Authenticated: yes (${r})`),console.log(" User: (could not fetch)")):(console.log(" Authenticated: no"),console.log(" Run `magicpath-ai login` to authenticate.")),l&&l.length>0){console.log(""),console.log(` Teams: ${l.length}`);for(let u of l)console.log(` - ${u.name} (${u.role.toLowerCase()})`)}if(console.log(""),m&&m.length>0){console.log(` Projects: ${m.length}`);for(let u of m){let g=u.ownerType==="personal"?"":` [${u.ownerName}]`;console.log(` - ${u.name} (${u.componentCount} components)${g}`)}}else s&&console.log(" Projects: none");console.log("")}catch(r){n&&E(r),console.error(`Error: ${r instanceof Error?r.message:String(r)}`),process.exit(1)}})}import so from"axios";function io(e){e.command("search").description("Search component names across all projects").argument("<query>","Search query (case-insensitive substring match)").option("--limit <n>","Maximum number of results","20").option("--team <nameOrId>","Search only within a specific team").option("--personal","Search only personal projects").action(async(n,t)=>{var s,i;let o=v(),r=parseInt(t.limit,10)||20;try{if(t.team&&t.personal)throw new p("Cannot use --team and --personal together.",{code:"INVALID_OPTIONS",suggestion:"Use --team to filter by team, or --personal for personal projects only."});let c;try{c=C()}catch{throw new p("Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.",{code:"NOT_AUTHENTICATED",suggestion:"Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable."})}let a=o?null:P("Searching components...").start();try{let l=new URLSearchParams({q:n,limit:String(Math.min(Math.max(r,1),50))});t.personal&&Ze();let m=t.personal?void 0:J(t.team);if(t.personal)l.set("personal","true");else if(m){let $=await L(m,c);ye($.id),l.set("organizationId",$.id)}let d=await so.get(`${rn()}?${l.toString()}`,{headers:c}),u=d.data.data??d.data,h=(Array.isArray(u==null?void 0:u.components)?u.components:[]).map($=>{var f,S,U,A;return{name:$.name,generatedName:$.generatedName,id:String($.id),projectName:((f=$.project)==null?void 0:f.name)??"",projectId:String(((S=$.project)==null?void 0:S.id)??""),previewImageUrl:$.previewImageUrl??null,ownerType:((U=$.project)==null?void 0:U.ownerType)==="team"?"team":"personal",ownerName:((A=$.project)==null?void 0:A.ownerName)??""}});if(a==null||a.succeed(`Found ${h.length} match(es) for "${n}"`),o&&x(h),h.length===0){console.log(`
|
|
118
|
+
No components matching "${n}".`);return}console.log("");let w=Math.max(4,...h.map($=>$.name.length)),y=Math.max(13,...h.map($=>$.generatedName.length)),I=Math.max(7,...h.map($=>$.projectName.length)),b=Math.max(9,...h.map($=>$.ownerType==="personal"?8:$.ownerName.length));console.log(` ${"Name".padEnd(w)} ${"Generated Name".padEnd(y)} ${"Project".padEnd(I)} ${"Workspace".padEnd(b)}`),console.log(` ${"\u2500".repeat(w)} ${"\u2500".repeat(y)} ${"\u2500".repeat(I)} ${"\u2500".repeat(b)}`);for(let $ of h){let f=$.ownerType==="personal"?"Personal":$.ownerName;console.log(` ${$.name.padEnd(w)} ${$.generatedName.padEnd(y)} ${$.projectName.padEnd(I)} ${f.padEnd(b)}`)}}catch(l){throw a==null||a.fail("Search failed"),l instanceof p?l:so.isAxiosError(l)?((s=l.response)==null?void 0:s.status)===401?new p("Token is invalid or expired. Run `magicpath-ai login`."):new p(`API error: ${(i=l.response)==null?void 0:i.status}`):l}}catch(c){throw o&&E(c),c instanceof p&&(console.error(`
|
|
119
|
+
${c.message}`),process.exit(1)),c}})}import{z as W}from"zod";var Ya=W.object({generatedName:W.string().describe("The generated name of the component (e.g., wispy-river-5234)")}),Za=W.object({component:W.string().describe("Component display name"),generatedName:W.string().describe("Component generated name"),files:W.array(W.object({path:W.string(),name:W.string(),content:W.string()})).describe("Component source files"),dependencies:W.array(W.string()).describe("Required packages"),importStatement:W.string().optional().describe("Import statement for the component"),usage:W.string().optional().describe("JSX usage example")});function ao(e){e.command("inspect").description("Inspect a MagicPath component's source code without installing").argument("<generatedName>","Generated name of the component (e.g., wispy-river-5234)").option("-d, --debug","Enable debug logging",!1).action(async(n,t)=>{try{t.debug&&pe();let o=v();R.debug({generatedName:n,options:t});let r=o?null:P(`Fetching component "${n}"...`).start(),s;try{s=await ke(n),r==null||r.succeed(`Found component: ${s.name}`)}catch(d){throw r==null||r.fail("Failed to fetch component"),d instanceof X?new p("Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.",{code:"NOT_AUTHENTICATED",suggestion:"Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable."}):d instanceof p?d:new p("Something went wrong!")}let i=Be(s.name),c=s.files[0],a,l;if(c){let d=c.name.replace(/\.tsx?$/,""),u=`@/components/magicpath/${i}/${d}`,g=oe(c.content);g?(a=fe(g,u),l=he(g)):a=`import { ${d} } from '${u}';`}let m=s.files.map(d=>({path:d.path,name:d.name,content:d.content}));if(o){x({component:s.name,generatedName:s.generatedName,files:m,dependencies:s.dependencies,importStatement:a,usage:l});return}console.log(`
|
|
120
120
|
Component: ${s.name}`),console.log(` Files: ${s.files.map(d=>d.path).join(", ")}`),console.log(` Dependencies: ${s.dependencies.join(", ")||"none"}`),a&&console.log(` Import: ${a}`);for(let d of s.files)console.log(`
|
|
121
121
|
${"\u2500".repeat(60)}`),console.log(` ${d.path}`),console.log(`${"\u2500".repeat(60)}`),console.log(d.content)}catch(o){throw v()&&E(o),o instanceof p&&(console.error(`
|
|
122
|
-
${o.message}`),process.exit(1)),o}})}import re from"path";import
|
|
122
|
+
${o.message}`),process.exit(1)),o}})}import re from"path";import Ie from"fs-extra";function Cr(e,n){if(!Ie.existsSync(e))return[];let t=Ie.readdirSync(e,{withFileTypes:!0}),o=[];for(let r of t){if(!r.isDirectory())continue;let s=re.join(e,r.name),i=Ie.readdirSync(s).filter(m=>!Ie.statSync(re.join(s,m)).isDirectory()),c=i.find(m=>(m.endsWith(".tsx")||m.endsWith(".ts"))&&m!=="usage.md"&&!m.includes(".test.")&&!m.includes(".spec.")),a=null,l=null;if(c)try{let m=Ie.readFileSync(re.join(s,c),"utf8"),d=oe(m);if(d){a=d.name;let u=c.replace(/\.tsx?$/,""),g=`@/components/magicpath/${r.name}/${u}`;d.isDefault?l=`import ${d.name} from '${g}';`:l=`import { ${d.name} } from '${g}';`}}catch{}o.push({name:a||r.name,folder:r.name,path:re.relative(n,s),files:i.filter(m=>m!=="usage.md"),exportName:a,importStatement:l})}return o}function co(e){e.command("list-installed").description("List MagicPath components installed in the current project").option("-p, --path <path>",`Custom components path (default: ${Te})`).action(async n=>{let t=v();try{let o=process.cwd(),r=Ke(n.path,o);if(!Ie.existsSync(r)){t&&x({components:[],total:0}),console.log(`
|
|
123
123
|
No MagicPath components found at ${re.relative(o,r)||r}`);return}let s=Cr(r,o);if(t&&x({components:s,total:s.length,componentsPath:re.relative(o,r)}),s.length===0){console.log(`
|
|
124
124
|
No MagicPath components installed.`);return}console.log(`
|
|
125
125
|
${s.length} component(s) installed in ${re.relative(o,r)}:
|
|
126
126
|
`);let i=Math.max(9,...s.map(l=>l.name.length)),c=Math.max(6,...s.map(l=>l.folder.length)),a=5;console.log(` ${"Component".padEnd(i)} ${"Folder".padEnd(c)} ${"Files".padEnd(a)}`),console.log(` ${"\u2500".repeat(i)} ${"\u2500".repeat(c)} ${"\u2500".repeat(a)}`);for(let l of s)console.log(` ${l.name.padEnd(i)} ${l.folder.padEnd(c)} ${String(l.files.length).padEnd(a)}`)}catch(o){throw t&&E(o),o instanceof p&&(console.error(`
|
|
127
|
-
${o.message}`),process.exit(1)),o}})}import
|
|
128
|
-
No themes found.`);return}console.log("");let h=Math.max(4,...g.map(b=>(b.name||"").length)),w=Math.max(2,...g.map(b=>String(b.id).length)),
|
|
129
|
-
${i.message}`),process.exit(1)),i}})}import
|
|
130
|
-
${$.charAt(0).toUpperCase()+$.slice(1)} Theme Variables:`);let S=Math.max(8,...Object.keys(f).map(U=>U.length));console.log(` ${"Variable".padEnd(S)} Value`),console.log(` ${"\u2500".repeat(S)} ${"\u2500".repeat(30)}`);for(let[U,
|
|
131
|
-
Fonts:`);for(let[$,f]of Object.entries(b.fonts)){let S=f.weights?Object.keys(f.weights).join(", "):"default";console.log(` ${$} (${f.source}, weights: ${S})`)}}}catch(g){throw u==null||u.fail("Failed to fetch theme"),
|
|
132
|
-
${d.message}`),process.exit(1)),d}})}import
|
|
133
|
-
No active canvas session found.`);return}let $=new Map;try{let f=await ee(i);$=new Map(f.map(S=>[String(S.id),{name:S.name??"",ownerType:S.ownerType,ownerName:S.ownerName}]))}catch{}a=b.map(f=>{let S=$.get(String(f.id));return S?{id:String(f.id),name:S.name,ownerType:S.ownerType,ownerName:S.ownerName}:{id:String(f.id),name:null,ownerType:null,ownerName:null}}),l=b.map(f=>{var S;return{projectId:f.id,projectName:((S=$.get(String(f.id)))==null?void 0:S.name)??"",roomId:f.room}})}let d=m?i.Authorization.replace(/^Bearer\s+/i,""):void 0,u=
|
|
134
|
-
Selected image(s):`);for(let
|
|
135
|
-
No active selection.`);if(a.length>0){console.log(" Active project(s):");for(let
|
|
136
|
-
Selected image(s):`);for(let
|
|
137
|
-
${i.message}`),process.exit(1)),i}})}import
|
|
138
|
-
${m??`(guest project ${c.projectId})`}`);return}let a=n?null:
|
|
139
|
-
No active canvas session found.`);return}let u=await ee(i),g=new Map;for(let w of u)g.set(String(w.id),w);let h=[];for(let w of d){let
|
|
140
|
-
${i.message}`),process.exit(1)),i}})}function
|
|
127
|
+
${o.message}`),process.exit(1)),o}})}import lo from"axios";function mo(e){e.command("list-themes").description("List all themes (design systems)").option("--team <nameOrId>","List themes for a specific team").action(async n=>{var o,r,s;let t=v();try{let i;try{i=C()}catch{throw new p("Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.",{code:"NOT_AUTHENTICATED",suggestion:"Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable."})}let c=t?null:P("Fetching themes...").start();try{let a=Le(),l=i,m=J(n.team);if(m){let b=await L(m,i);a=We(b.id),l={...i,"X-Organization-ID":b.id}}let d=await lo.get(a,{headers:l}),u=((o=d.data.data)==null?void 0:o.design_systems)??d.data.design_systems??d.data,g=Array.isArray(u)?u:[];if(c==null||c.succeed(`Found ${g.length} theme(s)`),t&&x({themes:g.map(b=>({id:String(b.id),name:b.name,isPublic:b.isPublic,createdAt:b.createdAt,updatedAt:b.updatedAt}))}),g.length===0){console.log(`
|
|
128
|
+
No themes found.`);return}console.log("");let h=Math.max(4,...g.map(b=>(b.name||"").length)),w=Math.max(2,...g.map(b=>String(b.id).length)),y=6,I=10;console.log(` ${"Name".padEnd(h)} ${"ID".padEnd(w)} ${"Public".padEnd(y)} Updated`),console.log(` ${"\u2500".repeat(h)} ${"\u2500".repeat(w)} ${"\u2500".repeat(y)} ${"\u2500".repeat(I)}`);for(let b of g){let $=(b.name||"").padEnd(h),f=String(b.id).padEnd(w),S=(b.isPublic?"yes":"no").padEnd(y),U=b.updatedAt?new Date(b.updatedAt).toISOString().slice(0,10):"";console.log(` ${$} ${f} ${S} ${U}`)}}catch(a){throw c==null||c.fail("Failed to fetch themes"),lo.isAxiosError(a)?((r=a.response)==null?void 0:r.status)===401?new p("Token is invalid or expired. Run `magicpath-ai login`.",{code:"TOKEN_EXPIRED",suggestion:"Run `magicpath-ai login` to re-authenticate."}):new p(`API error: ${(s=a.response)==null?void 0:s.status}`):a}}catch(i){throw t&&E(i),i instanceof p&&(console.error(`
|
|
129
|
+
${i.message}`),process.exit(1)),i}})}import At from"axios";function po(e){e.command("get-theme").description("Get a theme definition (CSS variables, fonts, styling prompt)").argument("<themeIdOrName>","Theme ID (numeric) or name (case-insensitive match)").option("--team <nameOrId>","Look up theme within a specific team").action(async(n,t)=>{var r,s,i,c,a,l,m;let o=v();try{let d;try{d=C()}catch{throw new p("Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.",{code:"NOT_AUTHENTICATED",suggestion:"Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable."})}let u=o?null:P("Fetching theme...").start();try{let g=n,h;if(!/^\d+$/.test(n)){let $=Le(),f=d,S=J(t.team);if(S){let H=await L(S,d);$=We(H.id),f={...d,"X-Organization-ID":H.id}}let U=await At.get($,{headers:f}),A=((r=U.data.data)==null?void 0:r.design_systems)??U.data.design_systems??U.data,j=Array.isArray(A)?A:[],k=n.toLowerCase(),F=j.find(H=>(H.name||"").toLowerCase()===k);if(!F)throw new p(`Theme "${n}" not found.`,{code:"NOT_FOUND",suggestion:"Run `magicpath-ai list-themes` to see available themes."});g=String(F.id),h=F.name}let w=await At.get(tn(g),{headers:d}),y=((s=w.data.data)==null?void 0:s.design_system)??w.data.design_system,I=y.name??h??g,b=y.data;u==null||u.succeed(`Theme: ${I}`),o&&x({id:String(y.id??g),name:I,theme:b.theme,defaultTheme:b.defaultTheme,prompt:b.prompt,fonts:b.fonts,version:b.version}),console.log(""),console.log(` Name: ${I}`),console.log(` ID: ${y.id??g}`),console.log(` Default Theme: ${b.defaultTheme??"light"}`),b.prompt&&console.log(` Prompt: ${b.prompt}`);for(let $ of["light","dark"]){let f=(i=b.theme)==null?void 0:i[$];if(f&&Object.keys(f).length>0){console.log(`
|
|
130
|
+
${$.charAt(0).toUpperCase()+$.slice(1)} Theme Variables:`);let S=Math.max(8,...Object.keys(f).map(U=>U.length));console.log(` ${"Variable".padEnd(S)} Value`),console.log(` ${"\u2500".repeat(S)} ${"\u2500".repeat(30)}`);for(let[U,A]of Object.entries(f))console.log(` ${U.padEnd(S)} ${A}`)}}if(b.fonts&&Object.keys(b.fonts).length>0){console.log(`
|
|
131
|
+
Fonts:`);for(let[$,f]of Object.entries(b.fonts)){let S=f.weights?Object.keys(f.weights).join(", "):"default";console.log(` ${$} (${f.source}, weights: ${S})`)}}}catch(g){throw u==null||u.fail("Failed to fetch theme"),At.isAxiosError(g)?((c=g.response)==null?void 0:c.status)===401?new p("Token is invalid or expired. Run `magicpath-ai login`.",{code:"TOKEN_EXPIRED",suggestion:"Run `magicpath-ai login` to re-authenticate."}):((a=g.response)==null?void 0:a.status)===404||((l=g.response)==null?void 0:l.status)===403?new p(`Theme "${n}" not found or not accessible.`,{code:"NOT_FOUND",suggestion:"Run `magicpath-ai list-themes` to see available themes."}):new p(`API error: ${(m=g.response)==null?void 0:m.status}`):(g instanceof p,g)}}catch(d){throw o&&E(d),d instanceof p&&(console.error(`
|
|
132
|
+
${d.message}`),process.exit(1)),d}})}import kt from"axios";import{createClient as Er}from"@liveblocks/client";import Pr from"ws";function et(e,n){let t=nn();return Er({polyfills:{fetch,WebSocket:Pr},authEndpoint:async o=>await(await fetch(t,{method:"POST",headers:{...e,"Content-Type":"application/json"},body:JSON.stringify(n?{room:o,token:n}:{room:o})})).json()})}async function tt(e,n,t=1e4){let{room:o,leave:r}=e.enterRoom(n,{initialPresence:{}});return await new Promise((s,i)=>{let c=setTimeout(()=>{i(new Error(`Timed out connecting to room ${n}`))},t),a=o.subscribe("status",l=>{l==="connected"&&(clearTimeout(c),a(),s())});o.getStatus()==="connected"&&(clearTimeout(c),a(),s())}),await new Promise(s=>{if(o.getOthers().length>0){s();return}let c=setTimeout(()=>{a(),s()},3e3),a=o.subscribe("others",l=>{l.length>0&&(clearTimeout(c),a(),s())})}),{room:o,leave:r}}function nt(e){var o,r;let n=e.getOthers(),t=[];for(let s of n){let i=(o=s.presence)==null?void 0:o.presence;(r=i==null?void 0:i.selectedShapeIds)!=null&&r.length&&t.push(...i.selectedShapeIds)}return[...new Set(t)]}async function go(e,n){let{root:t}=await e.getStorage(),o=t.get("records");if(!o)return[];let r=[];for(let s of n){let i=o.get(s);if(!i)continue;let c=typeof i.toObject=="function"?i.toObject():i;if(c.type==="mp-component"&&c.props){let a=typeof c.props.toObject=="function"?c.props.toObject():c.props;a.serverId&&r.push({serverId:a.serverId,clientId:a.clientId??s.replace("shape:",""),name:a.name??"Unknown",selectedRevisionId:typeof a.selectedRevisionId=="string"&&a.selectedRevisionId.length>0?a.selectedRevisionId:null})}}return r}function be(e){return e&&typeof e.toObject=="function"?e.toObject():e}function B(e){return typeof e=="string"&&e.trim().length>0?e:void 0}function Ar(e,n){let t=be(n),o=be(t==null?void 0:t.meta);return B(o==null?void 0:o.imageId)??(e.startsWith("asset:")?e.slice(6):void 0)}function kr(e){return e.startsWith("shape:")?e.slice(6):e}async function ot(e,n){let{root:t}=await e.getStorage(),o=t.get("records");if(!o)return[];let r=[];for(let s of n){let i=o.get(s);if(!i)continue;let c=be(i);if(c.type!=="image"&&c.type!=="mp-image")continue;let a=be(c.props)??{},l=B(a.assetId),m=l?o.get(l):null,d=be(m),u=be(d==null?void 0:d.props)??{},g=(l?Ar(l,m):void 0)??B(a.imageId)??B(a.serverId)??(s.startsWith("shape:")?s.slice(6):s);g&&r.push({imageId:g,shapeId:kr(s),...B(u.name)||B(a.name)||B(a.altText)?{name:B(u.name)??B(a.name)??B(a.altText)}:{},...typeof a.w=="number"?{width:a.w}:{},...typeof a.h=="number"?{height:a.h}:{}})}return r}function uo(e){e.command("selection").description("Get the currently selected component(s) from the web app canvas").action(async()=>{var t,o,r,s;let n=v();try{let i;try{i=C()}catch{throw new p("Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.",{code:"NOT_AUTHENTICATED",suggestion:"Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable."})}let c=n?null:P("Checking canvas selection...").start();try{let a,l,m=V();if(m)a=[{id:m.projectId,name:null,ownerType:null,ownerName:null}],l=[{projectId:m.projectId,projectName:"",roomId:`project:${m.projectId}`}];else{let y=await kt.get(ce(),{headers:i}),I=((t=y.data.data)==null?void 0:t.socket_rooms)??y.data.socket_rooms,b=(I==null?void 0:I.projectRooms)??[];if(b.length===0){c==null||c.succeed("No active canvas session"),n&&x({projects:[],components:[],images:[]}),console.log(`
|
|
133
|
+
No active canvas session found.`);return}let $=new Map;try{let f=await ee(i);$=new Map(f.map(S=>[String(S.id),{name:S.name??"",ownerType:S.ownerType,ownerName:S.ownerName}]))}catch{}a=b.map(f=>{let S=$.get(String(f.id));return S?{id:String(f.id),name:S.name,ownerType:S.ownerType,ownerName:S.ownerName}:{id:String(f.id),name:null,ownerType:null,ownerName:null}}),l=b.map(f=>{var S;return{projectId:f.id,projectName:((S=$.get(String(f.id)))==null?void 0:S.name)??"",roomId:f.room}})}let d=m?i.Authorization.replace(/^Bearer\s+/i,""):void 0,u=et(i,d),g=[],h=[];for(let y of l){let I=null;try{let b=await tt(u,y.roomId);I=b.leave;let $=b.room,f=nt($);if(f.length===0)continue;let[S,U]=await Promise.all([go($,f),ot($,f)]);h.push(...U.map(A=>({id:A.imageId,shapeId:A.shapeId,name:A.name??null,projectId:y.projectId,projectName:y.projectName,...A.width?{width:A.width}:{},...A.height?{height:A.height}:{}})));for(let A of S)try{let j=await kt.get(on(A.serverId),{headers:i}),k=((o=j.data.data)==null?void 0:o.component)??j.data.component;g.push({id:A.serverId,name:(k==null?void 0:k.name)??A.name,generatedName:(k==null?void 0:k.generatedName)??null,clientId:A.clientId,projectId:y.projectId,projectName:y.projectName,selectedRevisionId:A.selectedRevisionId})}catch{g.push({id:A.serverId,name:A.name,generatedName:null,clientId:A.clientId,projectId:y.projectId,projectName:y.projectName,selectedRevisionId:A.selectedRevisionId})}}catch{}finally{I&&I()}}if(g.length===0){if(c==null||c.succeed(h.length>0?`Found ${h.length} selected image(s)`:"No components selected"),n&&x({projects:a,components:[],images:h}),h.length>0){console.log(`
|
|
134
|
+
Selected image(s):`);for(let y of h)console.log(` ${y.name??"Image"} (${y.id})`)}else console.log(`
|
|
135
|
+
No active selection.`);if(a.length>0){console.log(" Active project(s):");for(let y of a){let I=y.ownerType==="team"&&y.ownerName?` [${y.ownerName}]`:"",b=y.name??`(unresolved project ${y.id})`;console.log(` ${b}${I}`)}}return}c==null||c.succeed(`Found ${g.length} selected component(s)`),n&&x({projects:a,components:g,images:h});let w=new Map;for(let y of g){let I=y.projectId;w.has(I)||w.set(I,[]),w.get(I).push(y)}console.log("");for(let[,y]of w){console.log(` Selected in "${y[0].projectName}":`);for(let I of y){let b=I.generatedName?` (${I.generatedName})`:"";console.log(` ${I.name}${b}`)}}if(h.length>0){console.log(`
|
|
136
|
+
Selected image(s):`);for(let y of h)console.log(` ${y.name??"Image"} (${y.id})`)}}catch(a){throw c==null||c.fail("Failed to check selection"),kt.isAxiosError(a)?((r=a.response)==null?void 0:r.status)===401?new p("Token is invalid or expired. Run `magicpath-ai login`.",{code:"TOKEN_EXPIRED",suggestion:"Run `magicpath-ai login` to re-authenticate."}):new p(`API error: ${(s=a.response)==null?void 0:s.status}`):a}}catch(i){throw n&&E(i),i instanceof p&&(console.error(`
|
|
137
|
+
${i.message}`),process.exit(1)),i}})}import Tt from"axios";function fo(e){e.command("active-project").description("Get the project(s) the user currently has open in the MagicPath web app").action(async()=>{var t,o,r,s;let n=v();try{let i;try{i=C()}catch{throw new p("Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.",{code:"NOT_AUTHENTICATED",suggestion:"Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable."})}let c=V();if(c){let l=n?null:P("Resolving guest project...").start(),m=null;try{let u=await Tt.get(ae(c.projectId),{headers:i}),g=((t=u.data.data)==null?void 0:t.project)??u.data.project??u.data;m=(g==null?void 0:g.name)??null}catch{}let d=[{id:c.projectId,name:m,ownerType:null,ownerName:null}];l==null||l.succeed("Guest project"),n&&x({projects:d,guest:!0}),console.log(`
|
|
138
|
+
${m??`(guest project ${c.projectId})`}`);return}let a=n?null:P("Checking active project...").start();try{let l=await Tt.get(ce(),{headers:i}),m=((o=l.data.data)==null?void 0:o.socket_rooms)??l.data.socket_rooms,d=(m==null?void 0:m.projectRooms)??[];if(d.length===0){a==null||a.succeed("No active canvas session"),n&&x({projects:[]}),console.log(`
|
|
139
|
+
No active canvas session found.`);return}let u=await ee(i),g=new Map;for(let w of u)g.set(String(w.id),w);let h=[];for(let w of d){let y=String(w.id),I=g.get(y);I?h.push({id:y,name:I.name??null,ownerType:I.ownerType,ownerName:I.ownerName}):h.push({id:y,name:null,ownerType:null,ownerName:null})}a==null||a.succeed(`Found ${h.length} active project${h.length===1?"":"s"}`),n&&x({projects:h}),console.log("");for(let w of h){let y=w.ownerType==="team"&&w.ownerName?` [${w.ownerName}]`:"",I=w.name??`(unresolved project ${w.id})`;console.log(` ${I}${y}`)}}catch(l){throw a==null||a.fail("Failed to check active project"),Tt.isAxiosError(l)?((r=l.response)==null?void 0:r.status)===401?new p("Token is invalid or expired. Run `magicpath-ai login`.",{code:"TOKEN_EXPIRED",suggestion:"Run `magicpath-ai login` to re-authenticate."}):new p(`API error: ${(s=l.response)==null?void 0:s.status}`):l}}catch(i){throw n&&E(i),i instanceof p&&(console.error(`
|
|
140
|
+
${i.message}`),process.exit(1)),i}})}function ho(e){e.command("list-teams").description("List teams you belong to").action(async()=>{let n=v();try{let t;try{t=C()}catch{throw new p("Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.",{code:"NOT_AUTHENTICATED",suggestion:"Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable."})}let o=n?null:P("Fetching teams...").start();try{let r=await Pe(t);if(o==null||o.succeed(`Found ${r.length} team(s)`),n&&x({teams:r}),r.length===0){console.log(`
|
|
141
141
|
No teams found.`);return}console.log("");let s=Math.max(4,...r.map(a=>a.name.length)),i=Math.max(2,...r.map(a=>a.id.length)),c=Math.max(4,...r.map(a=>a.role.length));console.log(` ${"Name".padEnd(s)} ${"ID".padEnd(i)} Role`),console.log(` ${"\u2500".repeat(s)} ${"\u2500".repeat(i)} ${"\u2500".repeat(c)}`);for(let a of r)console.log(` ${a.name.padEnd(s)} ${a.id.padEnd(i)} ${a.role}`)}catch(r){throw o==null||o.fail("Failed to fetch teams"),r instanceof p,r}}catch(t){throw n&&E(t),t instanceof p&&(console.error(`
|
|
142
|
-
${t.message}`),process.exit(1)),t}})}import
|
|
143
|
-
No members found.`);return}console.log("");let g=Math.max(4,...u.map(
|
|
144
|
-
${i.message}`),process.exit(1)),i}})}import z from"axios";import
|
|
142
|
+
${t.message}`),process.exit(1)),t}})}import wo from"axios";function yo(e){e.command("list-members").description("List members of a team").requiredOption("--team <nameOrId>","Team name or ID").action(async n=>{var o,r,s;let t=v();try{let i;try{i=C()}catch{throw new p("Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.",{code:"NOT_AUTHENTICATED",suggestion:"Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable."})}let c=t?null:P("Fetching members...").start();try{let a=await L(n.team,i),l=await wo.get(sn(a.id),{headers:{...i,"X-Organization-ID":a.id}}),u=((((o=l.data.data)==null?void 0:o.organization)??l.data.organization??l.data).users??[]).map(I=>{var b,$,f;return{id:String(((b=I.user)==null?void 0:b.id)??I.userId),displayName:(($=I.user)==null?void 0:$.displayName)??null,email:((f=I.user)==null?void 0:f.email)??null,role:I.role}});if(c==null||c.succeed(`${a.name}: ${u.length} member(s)`),t&&x({team:{id:a.id,name:a.name},members:u}),u.length===0){console.log(`
|
|
143
|
+
No members found.`);return}console.log("");let g=Math.max(4,...u.map(I=>(I.displayName||"").length)),h=Math.max(5,...u.map(I=>(I.email||"").length)),w=Math.max(2,...u.map(I=>I.id.length)),y=Math.max(4,...u.map(I=>I.role.length));console.log(` ${"Name".padEnd(g)} ${"Email".padEnd(h)} ${"ID".padEnd(w)} Role`),console.log(` ${"\u2500".repeat(g)} ${"\u2500".repeat(h)} ${"\u2500".repeat(w)} ${"\u2500".repeat(y)}`);for(let I of u)console.log(` ${(I.displayName||"").padEnd(g)} ${(I.email||"").padEnd(h)} ${I.id.padEnd(w)} ${I.role}`)}catch(a){throw c==null||c.fail("Failed to fetch members"),a instanceof p?a:wo.isAxiosError(a)?((r=a.response)==null?void 0:r.status)===401?new p("Token is invalid or expired. Run `magicpath-ai login`.",{code:"TOKEN_EXPIRED",suggestion:"Run `magicpath-ai login` to re-authenticate."}):new p(`API error: ${(s=a.response)==null?void 0:s.status}`):a}}catch(i){throw t&&E(i),i instanceof p&&(console.error(`
|
|
144
|
+
${i.message}`),process.exit(1)),i}})}import z from"axios";import jo from"crypto";import O from"fs-extra";import M from"path";var Co="magicpath-code.json",Tr=new Set(["src/App.tsx","src/index.css"]),Io="This component uses Tailwind v4. Replace @tailwind base/components/utilities; with @import 'tailwindcss';. Preserve the existing src/index.css Tailwind setup and append custom CSS below it.",Nr=/@tailwind\s+(base|components|utilities)\s*;/i,Rr=/@import\s+(?:url\(\s*)?['"]tailwindcss['"]\s*\)?\s*;/i;function $e(e){return jo.createHash("sha256").update(e).digest("hex")}function Or(e){return jo.createHash("sha256").update(e).digest("hex")}function Ut(e){return Tr.has(e)||e.startsWith("src/components/generated/")&&!e.endsWith("/")||e.startsWith("assets/")&&!e.endsWith("/")}function Mt(e){return e.startsWith("assets/")&&!e.endsWith("/")}function Ur(e){let n=M.extname(e).toLowerCase();return{".avif":"image/avif",".gif":"image/gif",".jpeg":"image/jpeg",".jpg":"image/jpeg",".png":"image/png",".svg":"image/svg+xml",".webp":"image/webp"}[n]}function rt(e){return M.join(e,Co)}function Mr(e){let n=rt(e);if(!O.existsSync(n))throw new p(`No ${Co} found. Run \`magicpath-ai code context <componentId>\` or \`magicpath-ai code start --project <projectId>\` first.`);return O.readJsonSync(n)}function Re(e,n){O.ensureDirSync(e),O.writeJsonSync(rt(e),n,{spaces:2})}function Nt(e,n){if(!Ut(n.path))throw new p(`Refusing to write disallowed path from API: ${n.path}`);let t=M.join(e,n.path);O.ensureDirSync(M.dirname(t)),n.encoding==="base64"?O.writeFileSync(t,Buffer.from(n.content.replace(/\s/g,""),"base64")):O.writeFileSync(t,n.content,"utf8")}function Ue(e){let n=[],t=["src/App.tsx","src/index.css"],o=M.join(e,"src/components/generated");if(O.existsSync(o))for(let s of Ot(o))t.push(M.relative(e,s).split(M.sep).join("/"));let r=M.join(e,"assets");if(O.existsSync(r))for(let s of Ot(r))t.push(M.relative(e,s).split(M.sep).join("/"));for(let s of Array.from(new Set(t)).sort()){if(!Ut(s))continue;let i=M.join(e,s);if(!(!O.existsSync(i)||!O.statSync(i).isFile()))if(Mt(s)){let c=O.readFileSync(i);n.push({path:s,content:c.toString("base64"),encoding:"base64",mimeType:Ur(s),sha256:Or(c)})}else{let c=O.readFileSync(i,"utf8");n.push({path:s,content:c,encoding:"utf8",sha256:$e(c)})}}return n}function bo(e){let n=M.join(e,"src/index.css");if(!O.existsSync(n))throw new p(Io);let t=O.readFileSync(n,"utf8");if(Nr.test(t)||!Rr.test(t))throw new p(Io)}function Ot(e){let n=[];for(let t of O.readdirSync(e,{withFileTypes:!0})){let o=M.join(e,t.name);t.isDirectory()?n.push(...Ot(o)):t.isFile()&&n.push(o)}return n}function Fr(e,n){if(n.mode==="create")return Ue(e);let t=new Map(n.editableFiles.map(o=>[o.path,o.sha256]));return Ue(e).map(o=>({...o,baseSha256:t.get(o.path)})).filter(o=>o.sha256!==o.baseSha256)}function Dr(e,n){if(n.mode==="create")return[];let t=new Set(Ue(e).map(o=>o.path));return n.editableFiles.map(o=>o.path).filter(o=>!Mt(o)).filter(o=>!t.has(o))}async function $o(e,n){let t=C();for(;;){let r=(await z.get(dt(e),{headers:t})).data.data;if(r.status==="completed"||r.status==="failed"||r.status==="cancelled")return r;await new Promise(s=>setTimeout(s,n))}}function Oe(e){let n=D(e);throw v()&&E(n),n}function xo(e,n){if(e===void 0)return;let t=Number(e);if(!Number.isFinite(t)||t<=0)throw new p(`${n} must be a positive number.`);return t}function Rt(e){let n=xo(e.width,"--width"),t=xo(e.height,"--height");if(n===void 0!=(t===void 0))throw new p("Pass both --width and --height, or neither.");return n===void 0||t===void 0?void 0:{width:n,height:t}}function _r(e){let n=new Map;for(let t of e)n.has(t.imageId)||n.set(t.imageId,t);return Array.from(n.values())}async function vo(e){var t;let n;try{n=C()}catch{return[]}try{let o=V(),r;if(o)r=[{id:o.projectId,room:`project:${o.projectId}`}];else{let a=await z.get(ce(),{headers:n}),l=((t=a.data.data)==null?void 0:t.socket_rooms)??a.data.socket_rooms,m=(l==null?void 0:l.projectRooms)??[];r=e?m.filter(d=>String(d.id)===String(e)):m}if(r.length===0)return[];let s=o?n.Authorization.replace(/^Bearer\s+/i,""):void 0,i=et(n,s),c=[];for(let a of r){let l=null;try{let m=await tt(i,a.room);l=m.leave;let d=nt(m.room);if(d.length===0)continue;let u=await ot(m.room,d);c.push(...u.filter(g=>/^\d+$/.test(g.imageId)).map(g=>({imageId:g.imageId,...g.shapeId?{shapeId:g.shapeId}:{}})))}catch{}finally{l&&l()}}return _r(c)}catch{return[]}}async function So(e,n){if(!(n!=null&&n.length))return[];let t=[];for(let o of n){if(!Ut(o.assetPath)||!Mt(o.assetPath))throw new p(`Refusing to download selected image outside assets/: ${o.assetPath}`);let r=await z.get(o.accessUrl,{responseType:"arraybuffer"}),s=M.join(e,o.assetPath);O.ensureDirSync(M.dirname(s)),O.writeFileSync(s,Buffer.from(r.data)),t.push({...o,downloadedPath:s})}return t}function Eo(e){let n=e.command("code").description("Create and edit canvas components from local code").addHelpText("after",`
|
|
145
145
|
Tailwind v4:
|
|
146
146
|
src/index.css must keep @import 'tailwindcss';.
|
|
147
147
|
Do not use @tailwind base/components/utilities; and do not replace the
|
|
148
148
|
template @theme inline, :root, or .dark token blocks. Append custom CSS below
|
|
149
149
|
the existing setup.
|
|
150
|
-
`);n.command("start").description("Start a pending create or edit session before writing code").option("--project <projectId>","Target MagicPath project ID for create").option("--component <componentId>","Existing MagicPath component ID for edit").option("--revision <revisionId>","Start editing this revision. Defaults to the component's currently selected revision.").option("--dir <dir>","Working directory to initialize",".").option("--name <name>","Component name").option("--width <px>","Canvas component width for create").option("--height <px>","Canvas component height for create").action(async t=>{try{let o=M.resolve(t.dir),r=Tt(t);if(!!t.project==!!t.component)throw new p("Run code start with exactly one of --project for create or --component for edit.");if(t.component){if(r)throw new p("Use --width and --height with code submit when resizing an existing component.");let g=await $o(),w=(await z.post(Bt(t.component),{...t.revision?{revisionId:t.revision}:{},...g.length>0?{selectedImages:g}:{}},{headers:j()})).data.data;O.ensureDirSync(o);for(let $ of w.editableFiles)kt(o,$);let I=await xo(o,w.selectedImages),y={mode:"edit",componentId:w.component.id,projectId:w.component.projectId,selectedRevisionId:w.component.selectedRevisionId,baseRevisionId:w.component.baseRevisionId,jobId:w.jobId,generatedName:w.component.generatedName,name:w.component.name,selectedImages:I,editableFiles:w.editableFiles.map($=>({path:$.path,sha256:be($.content)}))};ke(o,y);let b={dir:o,manifestPath:nt(o),...y,status:"pending",scaffoldedPaths:w.editableFiles.map($=>$.path),selectedImages:I};v()&&x(b),console.log(`Started pending edit ${y.selectedRevisionId} for component ${y.componentId} in ${o}`);return}let s=t.project;if(!s)throw new p("Create sessions require --project.");let i=await $o(s),a=(await z.post(it(),{projectId:s,...t.name?{name:t.name}:{},...r?{dimensions:r}:{},...i.length>0?{selectedImages:i}:{}},{headers:j()})).data.data,l=a.editableFiles??[];O.ensureDirSync(o);for(let g of l)kt(o,g);let m=await xo(o,a.selectedImages),d={mode:"create",componentId:a.componentId,projectId:s,selectedRevisionId:a.revisionId,jobId:a.jobId,generatedName:a.generatedName,name:t.name,dimensions:r,selectedImages:m,editableFiles:l.map(g=>({path:g.path,sha256:be(g.content)}))};ke(o,d);let u={dir:o,manifestPath:nt(o),...d,status:"pending",scaffoldedPaths:l.map(g=>g.path),selectedImages:m};v()&&x(u),console.log(`Started pending component ${d.componentId} in ${o}`+(l.length>0?` (scaffolded ${l.length} file${l.length===1?"":"s"})`:""))}catch(o){Te(o)}}),n.command("context").description("Fetch editable files for an existing MagicPath component").argument("<componentId>","MagicPath component ID").option("--dir <dir>","Working directory to write",".").option("--revision <revisionId>","Pull this revision of the component. Defaults to the component's currently selected revision.").action(async(t,o)=>{try{let r=M.resolve(o.dir);O.ensureDirSync(r);let s=o.revision?`${at(t)}?revisionId=${encodeURIComponent(o.revision)}`:at(t),c=(await z.get(s,{headers:j()})).data.data;for(let l of c.editableFiles)kt(r,l);let a={dir:r,readOnly:!0,component:c.component,editableFiles:c.editableFiles.map(l=>({path:l.path,sha256:be(l.content)}))};v()&&x(a),console.log(`Fetched ${c.editableFiles.length} read-only editable file(s) into ${r}. Run \`magicpath-ai code start --component ${t} --dir ${r}\` before submitting edits.`)}catch(r){Te(r)}}),n.command("submit").description("Submit changed editable files for the component in this working directory").option("--dir <dir>","Working directory containing magicpath-code.json",".").option("--wait","Wait for the build job to finish",!1).option("--interval <ms>","Polling interval when --wait is set","2000").option("--width <px>","Updated canvas component width").option("--height <px>","Updated canvas component height").action(async t=>{try{let o=M.resolve(t.dir),r=Ur(o),s=Tt(t);yo(o);let i=Mr(o,r),c=Fr(o,r);if(r.mode==="create"&&!i.some(d=>d.path==="src/App.tsx"))throw new p("Create submit requires src/App.tsx in the working directory.");if(i.length===0&&c.length===0&&!s){let d={status:"unchanged",componentId:r.componentId,revisionId:r.selectedRevisionId};v()&&x(d),console.log("No editable file changes to submit.");return}let l=r.mode==="create"||!!r.baseRevisionId&&r.selectedRevisionId!==r.baseRevisionId?await z.post(ct(r.componentId,r.selectedRevisionId),{files:i.map(d=>({path:d.path,content:d.content,encoding:d.encoding,mimeType:d.mimeType})),contextJobId:r.jobId,...s?{dimensions:s}:{},...r.mode==="edit"?{deletedPaths:c}:{}},{headers:j()}):await z.post(Kt(r.componentId),{baseRevisionId:r.baseRevisionId??r.selectedRevisionId,files:i.map(d=>({path:d.path,content:d.content,encoding:d.encoding,mimeType:d.mimeType,baseSha256:d.baseSha256})),deletedPaths:c,...s?{dimensions:s}:{}},{headers:j()}),m=l.data.data;if(t.wait&&(m=await Io(l.data.data.jobId,Number(t.interval))),m.status==="completed"){let d=Ne(o),u={...r,mode:"edit",jobId:l.data.data.jobId,selectedRevisionId:m.revisionId,baseRevisionId:m.revisionId,...s?{dimensions:s}:{},editableFiles:d.map(g=>({path:g.path,sha256:g.sha256??be(g.content)}))};ke(o,u)}v()&&x({...m,jobId:l.data.data.jobId,deletedPaths:c,...s?{dimensions:s}:{}}),console.log(`Submitted ${i.length} file(s)`+(c.length>0?` and ${c.length} deletion(s)`:"")+`. Job ${l.data.data.jobId}: ${m.status}`)}catch(o){Te(o)}}),n.command("create").description("Create a new MagicPath component from local editable files").requiredOption("--project <projectId>","Target MagicPath project ID").option("--dir <dir>","Working directory containing src/App.tsx",".").option("--name <name>","Component name").option("--wait","Wait for the build job to finish",!1).option("--width <px>","Canvas component width").option("--height <px>","Canvas component height").action(async t=>{try{let o=M.resolve(t.dir),r=Tt(t);yo(o);let s=Ne(o);if(!s.some(m=>m.path==="src/App.tsx"))throw new p("Create requires src/App.tsx in the working directory.");let i=await z.post(it(),{projectId:t.project,...t.name?{name:t.name}:{},...r?{dimensions:r}:{}},{headers:j()}),c={mode:"create",componentId:i.data.data.componentId,projectId:t.project,selectedRevisionId:i.data.data.revisionId,jobId:i.data.data.jobId,generatedName:i.data.data.generatedName,name:t.name,dimensions:r,editableFiles:[]};ke(o,c);let a=await z.post(ct(c.componentId,c.selectedRevisionId),{files:s.map(m=>({path:m.path,content:m.content,encoding:m.encoding,mimeType:m.mimeType})),contextJobId:c.jobId,...r?{dimensions:r}:{}},{headers:j()}),l=a.data.data;t.wait&&(l=await Io(a.data.data.jobId,2e3)),l.status==="completed"&&ke(o,{...c,mode:"edit",jobId:a.data.data.jobId,selectedRevisionId:l.revisionId,...r?{dimensions:r}:{},editableFiles:s.map(m=>({path:m.path,sha256:m.sha256??be(m.content)}))}),v()&&x({...l,jobId:a.data.data.jobId,...r?{dimensions:r}:{}}),console.log(`Created component ${a.data.data.componentId}. Job ${a.data.data.jobId}: ${l.status}`)}catch(o){Te(o)}}),n.command("status").description("Fetch external-agent build job status").argument("<jobId>","External agent job ID").action(async t=>{try{let o=await z.get(lt(t),{headers:j()});v()&&x(o.data.data),console.log(`${t}: ${o.data.data.status}`)}catch(o){Te(o)}})}import Re from"axios";import jo from"fs";import Ut from"path";import{imageSize as _r}from"image-size";var Eo=512;async function Lr(e){if(/^https?:\/\//i.test(e)){let t=await Re.get(e,{responseType:"arraybuffer"}),o=Ut.basename(new URL(e).pathname)||"image";return{buffer:Buffer.from(t.data),fileName:o}}let n=Ut.resolve(e);if(!jo.existsSync(n))throw new Error(`Image file not found: ${n}`);return{buffer:jo.readFileSync(n),fileName:Ut.basename(n)}}function ot(e){if(e===void 0)return;let n=Number(e);if(!Number.isFinite(n))throw new Error(`Invalid number: ${e}`);return n}function Ao(e){let n=e.command("image").description("Add and list images on a project canvas");n.command("add").description("Add an image to a project canvas from a local file path or a URL").argument("<projectId>","The id of the project to add the image to").argument("<pathOrUrl>","A local image file path or an http(s) URL").option("--name <name>","Display name for the image (defaults to the file name)").option("--x <x>","Canvas x position (default 0)").option("--y <y>","Canvas y position (default 0)").option("--width <width>","Width in canvas units (defaults to the intrinsic width)").option("--height <height>","Height in canvas units (defaults to the intrinsic height)").action(async(t,o,r)=>{var c,a;let s=v(),i=s?null:A("Adding image to project...").start();try{let l=j(),{buffer:m,fileName:d}=await Lr(o),u=ot(r.width),g=ot(r.height);if(u===void 0||g===void 0)try{let S=_r(m);u=u??S.width,g=g??S.height}catch{}u=u??Eo,g=g??Eo;let h={x:ot(r.x)??0,y:ot(r.y)??0,z:0,width:u,height:g},w=r.name??(d.replace(/\.[^/.]+$/,"")||d),I=await Re.get(Xt(),{headers:l,params:{filename:d,content_type:"image/*",make_public:"true"}}),{upload_url:y,upload_token:b}=I.data;await Re.put(y,m,{headers:{"Content-Type":"image/*","x-goog-acl":"public-read"}});let f=(a=(c=(await Re.post(pt(t),{name:w,position:h,upload_token:b},{headers:l})).data)==null?void 0:c.data)==null?void 0:a.image;i==null||i.succeed("Image added to project"),s&&x({image:f}),console.log(`Added "${(f==null?void 0:f.name)??w}" (${(f==null?void 0:f.id)??"unknown id"})`),f!=null&&f.url&&console.log(f.url)}catch(l){i==null||i.fail("Failed to add image"),s&&E(l),console.error(l instanceof Error?l.message:String(l)),process.exit(1)}}),n.command("list").description("List the images on a project canvas").argument("<projectId>","The id of the project").action(async t=>{var s,i;let o=v(),r=o?null:A("Fetching images...").start();try{let c=j(),l=((i=(s=(await Re.get(pt(t),{headers:c})).data)==null?void 0:s.data)==null?void 0:i.images)??[];if(r==null||r.succeed(`Found ${l.length} image(s)`),o&&x({images:l}),l.length===0){console.log("No images in this project.");return}for(let m of l)console.log(`- ${m.name} (${m.id})${m.url?` \u2014 ${m.url}`:""}`)}catch(c){r==null||r.fail("Failed to list images"),o&&E(c),console.error(c instanceof Error?c.message:String(c)),process.exit(1)}})}import Mt from"axios";function Po(e){var n;return((n=e==null?void 0:e.data)==null?void 0:n.project)??(e==null?void 0:e.project)??e}function ko(e){e.command("create-project").description("Create a new project (personal or in a team)").option("--name <name>","Project name (defaults to an auto-generated name)").option("--team <nameOrId>","Create the project in this team").action(async n=>{var o,r,s,i;let t=v();try{let c;try{c=j()}catch{throw new p("Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.",{code:"NOT_AUTHENTICATED",suggestion:"Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable."})}let a=t?null:A("Creating project...").start();try{let l={...c},m=null,d=J(n.team);d&&(m=await L(d,c),we(m.id),l["X-Organization-ID"]=m.id);let u=await Mt.post(Yt(),{},{headers:l}),g=Po(u.data);if(n.name){let w=await Mt.patch(ie(String(g.id)),{data:{name:n.name}},{headers:l});g=Po(w.data)}let h=m?{...g,ownerType:"team",ownerName:m.name}:{...g,ownerType:"personal",ownerName:((o=g.owner)==null?void 0:o.email)??""};a==null||a.succeed(`Created project "${h.name}"${m?` in ${m.name}`:""}`),t&&x({project:h}),console.log(""),console.log(` ID: ${h.id}`),console.log(` Name: ${h.name}`),console.log(` Workspace: ${m?m.name+" (team)":"personal"}`)}catch(l){throw a==null||a.fail("Failed to create project"),l instanceof p?l:Mt.isAxiosError(l)?((r=l.response)==null?void 0:r.status)===401?new p("Token is invalid or expired. Run `magicpath-ai login`.",{code:"TOKEN_EXPIRED",suggestion:"Run `magicpath-ai login` to re-authenticate."}):((s=l.response)==null?void 0:s.status)===403?new p("Not allowed to create a project in this workspace.",{code:"FORBIDDEN",suggestion:"Verify you are a member of the team and have permission to create projects."}):new p(`API error: ${(i=l.response)==null?void 0:i.status}`):l}}catch(c){throw t&&E(c),c instanceof p&&(console.error(`
|
|
151
|
-
${c.message}`),process.exit(1)),c}})}import
|
|
152
|
-
No skills found.`);return}console.log("");let n=Math.max(4,...e.map(s=>s.name.length)),t=Math.max(5,...e.map(s=>s.slug.length)),o=Math.max(6,...e.map(s=>
|
|
153
|
-
No bundled files.`);return}console.log("");let n=Math.max(4,...e.map(t=>t.path.length));console.log(` ${"Path".padEnd(n)} Size`),console.log(` ${"-".repeat(n)} ----`);for(let t of e)console.log(` ${t.path.padEnd(n)} ${t.size}`)}async function
|
|
154
|
-
${o.message}`),o.suggestion&&console.error(o.suggestion),process.exit(1)}}function
|
|
150
|
+
`);n.command("start").description("Start a pending create or edit session before writing code").option("--project <projectId>","Target MagicPath project ID for create").option("--component <componentId>","Existing MagicPath component ID for edit").option("--revision <revisionId>","Start editing this revision. Defaults to the component's currently selected revision.").option("--dir <dir>","Working directory to initialize",".").option("--name <name>","Component name").option("--width <px>","Canvas component width for create").option("--height <px>","Canvas component height for create").action(async t=>{try{let o=M.resolve(t.dir),r=Rt(t);if(!!t.project==!!t.component)throw new p("Run code start with exactly one of --project for create or --component for edit.");if(t.component){if(r)throw new p("Use --width and --height with code submit when resizing an existing component.");let g=await vo(),w=(await z.post(Kt(t.component),{...t.revision?{revisionId:t.revision}:{},...g.length>0?{selectedImages:g}:{}},{headers:C()})).data.data;O.ensureDirSync(o);for(let $ of w.editableFiles)Nt(o,$);let y=await So(o,w.selectedImages),I={mode:"edit",componentId:w.component.id,projectId:w.component.projectId,selectedRevisionId:w.component.selectedRevisionId,baseRevisionId:w.component.baseRevisionId,jobId:w.jobId,generatedName:w.component.generatedName,name:w.component.name,selectedImages:y,editableFiles:w.editableFiles.map($=>({path:$.path,sha256:$e($.content)}))};Re(o,I);let b={dir:o,manifestPath:rt(o),...I,status:"pending",scaffoldedPaths:w.editableFiles.map($=>$.path),selectedImages:y};v()&&x(b),console.log(`Started pending edit ${I.selectedRevisionId} for component ${I.componentId} in ${o}`);return}let s=t.project;if(!s)throw new p("Create sessions require --project.");let i=await vo(s),a=(await z.post(ct(),{projectId:s,...t.name?{name:t.name}:{},...r?{dimensions:r}:{},...i.length>0?{selectedImages:i}:{}},{headers:C()})).data.data,l=a.editableFiles??[];O.ensureDirSync(o);for(let g of l)Nt(o,g);let m=await So(o,a.selectedImages),d={mode:"create",componentId:a.componentId,projectId:s,selectedRevisionId:a.revisionId,jobId:a.jobId,generatedName:a.generatedName,name:t.name,dimensions:r,selectedImages:m,editableFiles:l.map(g=>({path:g.path,sha256:$e(g.content)}))};Re(o,d);let u={dir:o,manifestPath:rt(o),...d,status:"pending",scaffoldedPaths:l.map(g=>g.path),selectedImages:m};v()&&x(u),console.log(`Started pending component ${d.componentId} in ${o}`+(l.length>0?` (scaffolded ${l.length} file${l.length===1?"":"s"})`:""))}catch(o){Oe(o)}}),n.command("context").description("Fetch editable files for an existing MagicPath component").argument("<componentId>","MagicPath component ID").option("--dir <dir>","Working directory to write",".").option("--revision <revisionId>","Pull this revision of the component. Defaults to the component's currently selected revision.").action(async(t,o)=>{try{let r=M.resolve(o.dir);O.ensureDirSync(r);let s=o.revision?`${lt(t)}?revisionId=${encodeURIComponent(o.revision)}`:lt(t),c=(await z.get(s,{headers:C()})).data.data;for(let l of c.editableFiles)Nt(r,l);let a={dir:r,readOnly:!0,component:c.component,editableFiles:c.editableFiles.map(l=>({path:l.path,sha256:$e(l.content)}))};v()&&x(a),console.log(`Fetched ${c.editableFiles.length} read-only editable file(s) into ${r}. Run \`magicpath-ai code start --component ${t} --dir ${r}\` before submitting edits.`)}catch(r){Oe(r)}}),n.command("submit").description("Submit changed editable files for the component in this working directory").option("--dir <dir>","Working directory containing magicpath-code.json",".").option("--wait","Wait for the build job to finish",!1).option("--interval <ms>","Polling interval when --wait is set","2000").option("--width <px>","Updated canvas component width").option("--height <px>","Updated canvas component height").action(async t=>{try{let o=M.resolve(t.dir),r=Mr(o),s=Rt(t);bo(o);let i=Fr(o,r),c=Dr(o,r);if(r.mode==="create"&&!i.some(d=>d.path==="src/App.tsx"))throw new p("Create submit requires src/App.tsx in the working directory.");if(i.length===0&&c.length===0&&!s){let d={status:"unchanged",componentId:r.componentId,revisionId:r.selectedRevisionId};v()&&x(d),console.log("No editable file changes to submit.");return}let l=r.mode==="create"||!!r.baseRevisionId&&r.selectedRevisionId!==r.baseRevisionId?await z.post(mt(r.componentId,r.selectedRevisionId),{files:i.map(d=>({path:d.path,content:d.content,encoding:d.encoding,mimeType:d.mimeType})),contextJobId:r.jobId,...s?{dimensions:s}:{},...r.mode==="edit"?{deletedPaths:c}:{}},{headers:C()}):await z.post(qt(r.componentId),{baseRevisionId:r.baseRevisionId??r.selectedRevisionId,files:i.map(d=>({path:d.path,content:d.content,encoding:d.encoding,mimeType:d.mimeType,baseSha256:d.baseSha256})),deletedPaths:c,...s?{dimensions:s}:{}},{headers:C()}),m=l.data.data;if(t.wait&&(m=await $o(l.data.data.jobId,Number(t.interval))),m.status==="completed"){let d=Ue(o),u={...r,mode:"edit",jobId:l.data.data.jobId,selectedRevisionId:m.revisionId,baseRevisionId:m.revisionId,...s?{dimensions:s}:{},editableFiles:d.map(g=>({path:g.path,sha256:g.sha256??$e(g.content)}))};Re(o,u)}v()&&x({...m,jobId:l.data.data.jobId,deletedPaths:c,...s?{dimensions:s}:{}}),console.log(`Submitted ${i.length} file(s)`+(c.length>0?` and ${c.length} deletion(s)`:"")+`. Job ${l.data.data.jobId}: ${m.status}`)}catch(o){Oe(o)}}),n.command("create").description("Create a new MagicPath component from local editable files").requiredOption("--project <projectId>","Target MagicPath project ID").option("--dir <dir>","Working directory containing src/App.tsx",".").option("--name <name>","Component name").option("--wait","Wait for the build job to finish",!1).option("--width <px>","Canvas component width").option("--height <px>","Canvas component height").action(async t=>{try{let o=M.resolve(t.dir),r=Rt(t);bo(o);let s=Ue(o);if(!s.some(m=>m.path==="src/App.tsx"))throw new p("Create requires src/App.tsx in the working directory.");let i=await z.post(ct(),{projectId:t.project,...t.name?{name:t.name}:{},...r?{dimensions:r}:{}},{headers:C()}),c={mode:"create",componentId:i.data.data.componentId,projectId:t.project,selectedRevisionId:i.data.data.revisionId,jobId:i.data.data.jobId,generatedName:i.data.data.generatedName,name:t.name,dimensions:r,editableFiles:[]};Re(o,c);let a=await z.post(mt(c.componentId,c.selectedRevisionId),{files:s.map(m=>({path:m.path,content:m.content,encoding:m.encoding,mimeType:m.mimeType})),contextJobId:c.jobId,...r?{dimensions:r}:{}},{headers:C()}),l=a.data.data;t.wait&&(l=await $o(a.data.data.jobId,2e3)),l.status==="completed"&&Re(o,{...c,mode:"edit",jobId:a.data.data.jobId,selectedRevisionId:l.revisionId,...r?{dimensions:r}:{},editableFiles:s.map(m=>({path:m.path,sha256:m.sha256??$e(m.content)}))}),v()&&x({...l,jobId:a.data.data.jobId,...r?{dimensions:r}:{}}),console.log(`Created component ${a.data.data.componentId}. Job ${a.data.data.jobId}: ${l.status}`)}catch(o){Oe(o)}}),n.command("status").description("Fetch external-agent build job status").argument("<jobId>","External agent job ID").action(async t=>{try{let o=await z.get(dt(t),{headers:C()});v()&&x(o.data.data),console.log(`${t}: ${o.data.data.status}`)}catch(o){Oe(o)}})}import xe from"axios";import ve from"fs";import se from"path";import{imageSize as Lr}from"image-size";var Po=512;async function Wr(e){if(/^https?:\/\//i.test(e)){let t=await xe.get(e,{responseType:"arraybuffer"}),o=se.basename(new URL(e).pathname)||"image";return{buffer:Buffer.from(t.data),fileName:o}}let n=se.resolve(e);if(!ve.existsSync(n))throw new Error(`Image file not found: ${n}`);return{buffer:ve.readFileSync(n),fileName:se.basename(n)}}function st(e){if(e===void 0)return;let n=Number(e);if(!Number.isFinite(n))throw new Error(`Invalid number: ${e}`);return n}var Gr={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".webp":"image/webp",".gif":"image/gif"},Hr={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/gif":".gif"};function zr(e,n){return[...n,e]}function Ao(e){let n=e.command("image").description("Generate images and add or list images on a project canvas");n.command("generate").description("Generate an image with AI (optionally editing reference images), hosted by MagicPath and saved locally").requiredOption("--prompt <text>","What to generate (max 4000 chars)").option("--aspect-ratio <ratio>","One of 1:1, 16:9, 9:16, 4:3, 3:4 (defaults to the model default)").option("--ref <path>","Local reference image to edit/restyle (repeatable, up to 3)",zr,[]).option("--out <path>","Where to write the image (defaults to ./magicpath-image-<timestamp>.<ext>)").action(async t=>{var s,i;let o=v(),r=o?null:P("Generating image...").start();try{let c=C(),a=t.ref.map(h=>{let w=se.resolve(h);if(!ve.existsSync(w))throw new p(`Reference image not found: ${w}`,{code:"REF_NOT_FOUND"});let y=Gr[se.extname(w).toLowerCase()];if(!y)throw new p(`Unsupported reference image type: ${w}`,{code:"REF_UNSUPPORTED",suggestion:"Use PNG, JPEG, WebP, or GIF reference images."});return{data:ve.readFileSync(w).toString("base64"),mimetype:y}}),m=(i=(s=(await xe.post(en(),{prompt:t.prompt,...t.aspectRatio?{aspect_ratio:t.aspectRatio}:{},...a.length?{reference_images:a}:{}},{headers:c,maxBodyLength:1/0,maxContentLength:1/0})).data)==null?void 0:s.data)==null?void 0:i.image;if(!(m!=null&&m.data)||!(m!=null&&m.mimetype))throw new p("Image generation returned no image.",{code:"GENERATION_FAILED"});let d=Hr[m.mimetype]??".png",u=se.resolve(t.out??`magicpath-image-${Date.now()}${d}`);ve.mkdirSync(se.dirname(u),{recursive:!0}),ve.writeFileSync(u,Buffer.from(m.data,"base64"));let g={path:u,url:m.url??null,mimetype:m.mimetype,size:m.size??null,revisedPrompt:m.revised_prompt??null};r==null||r.succeed("Image generated"),o&&x({image:g}),console.log(` Saved: ${g.path}`),g.url&&console.log(` Hosted: ${g.url}`),g.revisedPrompt&&console.log(` Prompt: ${g.revisedPrompt}`)}catch(c){r==null||r.fail("Image generation failed"),E(c)}}),n.command("add").description("Add an image to a project canvas from a local file path or a URL").argument("<projectId>","The id of the project to add the image to").argument("<pathOrUrl>","A local image file path or an http(s) URL").option("--name <name>","Display name for the image (defaults to the file name)").option("--x <x>","Canvas x position (default 0)").option("--y <y>","Canvas y position (default 0)").option("--width <width>","Width in canvas units (defaults to the intrinsic width)").option("--height <height>","Height in canvas units (defaults to the intrinsic height)").action(async(t,o,r)=>{var c,a;let s=v(),i=s?null:P("Adding image to project...").start();try{let l=C(),{buffer:m,fileName:d}=await Wr(o),u=st(r.width),g=st(r.height);if(u===void 0||g===void 0)try{let S=Lr(m);u=u??S.width,g=g??S.height}catch{}u=u??Po,g=g??Po;let h={x:st(r.x)??0,y:st(r.y)??0,z:0,width:u,height:g},w=r.name??(d.replace(/\.[^/.]+$/,"")||d),y=await xe.get(Yt(),{headers:l,params:{filename:d,content_type:"image/*",make_public:"true"}}),{upload_url:I,upload_token:b}=y.data;await xe.put(I,m,{headers:{"Content-Type":"image/*","x-goog-acl":"public-read"}});let f=(a=(c=(await xe.post(ut(t),{name:w,position:h,upload_token:b},{headers:l})).data)==null?void 0:c.data)==null?void 0:a.image;i==null||i.succeed("Image added to project"),s&&x({image:f}),console.log(`Added "${(f==null?void 0:f.name)??w}" (${(f==null?void 0:f.id)??"unknown id"})`),f!=null&&f.url&&console.log(f.url)}catch(l){i==null||i.fail("Failed to add image"),s&&E(l),console.error(l instanceof Error?l.message:String(l)),process.exit(1)}}),n.command("list").description("List the images on a project canvas").argument("<projectId>","The id of the project").action(async t=>{var s,i;let o=v(),r=o?null:P("Fetching images...").start();try{let c=C(),l=((i=(s=(await xe.get(ut(t),{headers:c})).data)==null?void 0:s.data)==null?void 0:i.images)??[];if(r==null||r.succeed(`Found ${l.length} image(s)`),o&&x({images:l}),l.length===0){console.log("No images in this project.");return}for(let m of l)console.log(`- ${m.name} (${m.id})${m.url?` \u2014 ${m.url}`:""}`)}catch(c){r==null||r.fail("Failed to list images"),o&&E(c),console.error(c instanceof Error?c.message:String(c)),process.exit(1)}})}import Ft from"axios";function ko(e){var n;return((n=e==null?void 0:e.data)==null?void 0:n.project)??(e==null?void 0:e.project)??e}function To(e){e.command("create-project").description("Create a new project (personal or in a team)").option("--name <name>","Project name (defaults to an auto-generated name)").option("--team <nameOrId>","Create the project in this team").action(async n=>{var o,r,s,i;let t=v();try{let c;try{c=C()}catch{throw new p("Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.",{code:"NOT_AUTHENTICATED",suggestion:"Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable."})}let a=t?null:P("Creating project...").start();try{let l={...c},m=null,d=J(n.team);d&&(m=await L(d,c),ye(m.id),l["X-Organization-ID"]=m.id);let u=await Ft.post(Zt(),{},{headers:l}),g=ko(u.data);if(n.name){let w=await Ft.patch(ae(String(g.id)),{data:{name:n.name}},{headers:l});g=ko(w.data)}let h=m?{...g,ownerType:"team",ownerName:m.name}:{...g,ownerType:"personal",ownerName:((o=g.owner)==null?void 0:o.email)??""};a==null||a.succeed(`Created project "${h.name}"${m?` in ${m.name}`:""}`),t&&x({project:h}),console.log(""),console.log(` ID: ${h.id}`),console.log(` Name: ${h.name}`),console.log(` Workspace: ${m?m.name+" (team)":"personal"}`)}catch(l){throw a==null||a.fail("Failed to create project"),l instanceof p?l:Ft.isAxiosError(l)?((r=l.response)==null?void 0:r.status)===401?new p("Token is invalid or expired. Run `magicpath-ai login`.",{code:"TOKEN_EXPIRED",suggestion:"Run `magicpath-ai login` to re-authenticate."}):((s=l.response)==null?void 0:s.status)===403?new p("Not allowed to create a project in this workspace.",{code:"FORBIDDEN",suggestion:"Verify you are a member of the team and have permission to create projects."}):new p(`API error: ${(i=l.response)==null?void 0:i.status}`):l}}catch(c){throw t&&E(c),c instanceof p&&(console.error(`
|
|
151
|
+
${c.message}`),process.exit(1)),c}})}import No from"fs-extra";import Ro from"path";import ie from"axios";import Vr from"prompts";function Jr(e){var t;let n=((t=e==null?void 0:e.data)==null?void 0:t.skills)??(e==null?void 0:e.skills)??e;if(!Array.isArray(n))throw new p("Unexpected skills response from MagicPath.",{code:"INVALID_RESPONSE"});return n}function it(e){var t;let n=((t=e==null?void 0:e.data)==null?void 0:t.skill)??(e==null?void 0:e.skill)??e;if(!n||typeof n!="object")throw new p("Unexpected skill response from MagicPath.",{code:"INVALID_RESPONSE"});return n}function Br(e){var t;let n=((t=e==null?void 0:e.data)==null?void 0:t.files)??(e==null?void 0:e.files)??e;if(!Array.isArray(n))throw new p("Unexpected skill files response from MagicPath.",{code:"INVALID_RESPONSE"});return n}function Kr(e){var t;let n=((t=e==null?void 0:e.data)==null?void 0:t.file)??(e==null?void 0:e.file)??e;if(!n||typeof n!="object")throw new p("Unexpected skill file response from MagicPath.",{code:"INVALID_RESPONSE"});return n}function K(e){return String(e.id)}function _t(e){return e.isPublic?"Public":e.organizationId?"Team":"Personal"}function qr(){try{return C()}catch{throw new p("Not authenticated. Set MAGICPATH_TOKEN or run `magicpath-ai login`.",{code:"NOT_AUTHENTICATED",suggestion:"Run `magicpath-ai login` or set the MAGICPATH_TOKEN environment variable."})}}async function Se(e){let n=qr();if(!e.team)return{headers:n,label:"personal",listUrl:gt(),createUrl:gt(),importUrl:Xt()};let t=await L(e.team,n);return{headers:{...n,"X-Organization-ID":t.id},label:`${t.name} (team)`,listUrl:ht(t.id),createUrl:ht(t.id),importUrl:an(t.id)}}async function Oo(e){let n=await ie.get(e.listUrl,{headers:e.headers});return Jr(n.data)}function Xr(e){return e.trim().toLowerCase()}function Yr(e,n){let t=Xr(n);return K(e)===n||e.slug.toLowerCase()===t||e.name.toLowerCase()===t}async function Dt(e,n,t){let r=(await Oo(e)).filter(i=>Yr(i,n)),s=t!=null&&t.writable?r.filter(i=>!i.isPublic):r;if(s.length===1)return s[0];throw s.length>1?new p(`Multiple skills matched "${n}".`,{code:"AMBIGUOUS_SKILL",suggestion:"Use the skill ID instead of the name or slash command."}):new p(`Skill "${n}" not found.`,{code:"SKILL_NOT_FOUND",suggestion:t!=null&&t.writable?"Run `magicpath-ai skills list --owned-only` to see editable skills.":"Run `magicpath-ai skills list` to see available skills."})}function Uo(e){if(e.instructions&&e.instructionsFile)throw new p("Use either --instructions or --instructions-file, not both.",{code:"INVALID_OPTIONS"});return e.instructionsFile?No.readFileSync(Ro.resolve(e.instructionsFile),"utf8"):e.instructions}function Zr(e){let n=Uo(e);if(!e.name||!e.description||!n)throw new p("Creating a skill requires --name, --description, and --instructions or --instructions-file.",{code:"MISSING_FIELDS"});return{name:e.name,description:e.description,instructions:n}}function Qr(e){if(e.enable&&e.disable)throw new p("Use either --enable or --disable, not both.",{code:"INVALID_OPTIONS"});let n={},t=Uo(e);if(e.name&&(n.name=e.name),e.description&&(n.description=e.description),t&&(n.instructions=t),e.enable&&(n.enabled=!0),e.disable&&(n.enabled=!1),Object.keys(n).length===0)throw new p("Updating a skill requires at least one field.",{code:"MISSING_FIELDS",suggestion:"Pass --name, --description, --instructions, --instructions-file, --enable, or --disable."});return n}function es(e){return e.toLowerCase().endsWith(".skill")?"application/octet-stream":"application/zip"}function ts(e){if(e.length===0){console.log(`
|
|
152
|
+
No skills found.`);return}console.log("");let n=Math.max(4,...e.map(s=>s.name.length)),t=Math.max(5,...e.map(s=>s.slug.length)),o=Math.max(6,...e.map(s=>_t(s).length)),r=Math.max(6,...e.map(s=>(s.sourceFormat??"EDITOR").length));console.log(` ${"Name".padEnd(n)} ${"Slash".padEnd(t)} ${"Source".padEnd(o)} ${"Format".padEnd(r)} Enabled ID`),console.log(` ${"-".repeat(n)} ${"-".repeat(t)} ${"-".repeat(o)} ${"-".repeat(r)} ------- --`);for(let s of e){let i=s.enabled===!1?"no":"yes";console.log(` ${s.name.padEnd(n)} ${s.slug.padEnd(t)} ${_t(s).padEnd(o)} ${(s.sourceFormat??"EDITOR").padEnd(r)} ${i.padEnd(7)} ${K(s)}`)}}function ns(e){console.log(""),console.log(` Name: ${e.name}`),console.log(` ID: ${K(e)}`),console.log(` Slash: /${e.slug}`),console.log(` Source: ${_t(e)}`),console.log(` Format: ${e.sourceFormat??"EDITOR"}`),console.log(` Enabled: ${e.enabled===!1?"no":"yes"}`),console.log(""),console.log(" Description:"),console.log(` ${e.description}`),console.log(""),console.log(" Instructions:"),console.log(e.instructions)}function os(e){if(e.length===0){console.log(`
|
|
153
|
+
No bundled files.`);return}console.log("");let n=Math.max(4,...e.map(t=>t.path.length));console.log(` ${"Path".padEnd(n)} Size`),console.log(` ${"-".repeat(n)} ----`);for(let t of e)console.log(` ${t.path.padEnd(n)} ${t.size}`)}async function je(e,n){try{await n()}catch(t){let o=D(t);e&&E(o),console.error(`
|
|
154
|
+
${o.message}`),o.suggestion&&console.error(o.suggestion),process.exit(1)}}function Mo(e){let n=e.command("skills").description("Manage MagicPath skills");n.command("list").description("List skills in your personal workspace or a team").option("--team <nameOrId>","List skills for this team").option("--owned-only","Hide public MagicPath skills",!1).action(async t=>{let o=v();await je(o,async()=>{let r=await Se(t),s=o?null:P("Fetching skills...").start(),i=await Oo(r),c=t.ownedOnly?i.filter(a=>!a.isPublic):i;s==null||s.succeed(`Found ${c.length} skill(s)`),o&&x({skills:c,workspace:r.label}),ts(c)})}),n.command("get").description("Show a skill by ID, slash command, or exact name").argument("<skill>","Skill ID, slash command, or exact name").option("--team <nameOrId>","Look up a team skill").option("--files","Also list bundled files",!1).option("--file <path>","Print a bundled file from the skill").action(async(t,o)=>{let r=v();await je(r,async()=>{let s=await Se(o),i=r?null:P("Fetching skill...").start(),c=await Dt(s,t),a,l;if(o.file){let m=await ie.get(ln(K(c),o.file),{headers:s.headers});l=Kr(m.data)}else if(o.files){let m=await ie.get(cn(K(c)),{headers:s.headers});a=Br(m.data)}if(i==null||i.succeed("Fetched skill"),r&&x({skill:c,...a?{files:a}:{},...l?{file:l}:{}}),l){console.log(l.content);return}ns(c),a&&os(a)})}),n.command("create").description("Create an editable skill").requiredOption("--name <name>","Skill name").requiredOption("--description <text>","Skill description").option("--instructions <text>","Skill instructions").option("--instructions-file <path>","Read skill instructions from a file").option("--team <nameOrId>","Create the skill in this team").action(async t=>{let o=v();await je(o,async()=>{let r=Zr(t),s=await Se(t),i=o?null:P("Creating skill...").start(),c=await ie.post(s.createUrl,r,{headers:s.headers}),a=it(c.data);i==null||i.succeed(`Created skill "${a.name}"`),o&&x({skill:a,workspace:s.label}),console.log(""),console.log(` Created: ${a.name}`),console.log(` ID: ${K(a)}`),console.log(` Slash: /${a.slug}`),console.log(` Workspace: ${s.label}`)})}),n.command("import").description("Import a .zip or .skill package").argument("<archivePath>","Path to the .zip or .skill package").option("--team <nameOrId>","Import the skill into this team").action(async(t,o)=>{let r=v();await je(r,async()=>{let s=await Se(o),i=Ro.resolve(t),c=No.readFileSync(i),a=r?null:P("Importing skill...").start(),l=await ie.post(s.importUrl,c,{headers:{...s.headers,"Content-Type":es(i)}}),m=it(l.data);a==null||a.succeed(`Imported skill "${m.name}"`),r&&x({skill:m,workspace:s.label}),console.log(""),console.log(` Imported: ${m.name}`),console.log(` ID: ${K(m)}`),console.log(` Slash: /${m.slug}`),console.log(` Workspace: ${s.label}`)})}),n.command("update").description("Update an editable skill by ID, slash command, or exact name").argument("<skill>","Skill ID, slash command, or exact name").option("--name <name>","New skill name").option("--description <text>","New skill description").option("--instructions <text>","New skill instructions").option("--instructions-file <path>","Read new skill instructions from a file").option("--enable","Enable the skill for chat",!1).option("--disable","Disable the skill for chat",!1).option("--team <nameOrId>","Update a team skill").action(async(t,o)=>{let r=v();await je(r,async()=>{let s=Qr(o),i=await Se(o),c=r?null:P("Updating skill...").start(),a=await Dt(i,t,{writable:!0}),l=await ie.patch(wt(K(a)),s,{headers:i.headers}),m=it(l.data);c==null||c.succeed(`Updated skill "${m.name}"`),r&&x({skill:m,workspace:i.label}),console.log(""),console.log(` Updated: ${m.name}`),console.log(` ID: ${K(m)}`),console.log(` Slash: /${m.slug}`),console.log(` Enabled: ${m.enabled===!1?"no":"yes"}`)})}),n.command("delete").description("Delete an editable skill by ID, slash command, or exact name").argument("<skill>","Skill ID, slash command, or exact name").option("-y, --yes","Skip confirmation prompt",!1).option("--team <nameOrId>","Delete a team skill").action(async(t,o)=>{let r=v();await je(r,async()=>{let s=await Se(o),i=r?null:P("Finding skill...").start(),c=await Dt(s,t,{writable:!0});if(i==null||i.stop(),!r&&!o.yes){let d=_n();try{if(!(await Vr({type:"confirm",name:"confirmed",message:`Delete "${c.name}"?`,initial:!1})).confirmed){console.log("Cancelled.");return}}finally{d()}}let a=r?null:P("Deleting skill...").start(),l=await ie.delete(wt(K(c)),{headers:s.headers}),m=it(l.data);a==null||a.succeed(`Deleted skill "${m.name}"`),r&&x({skill:m,workspace:s.label})})})}var cs=ss(as(import.meta.url)),ls=JSON.parse(rs(is(cs,"..","package.json"),"utf8"));Vt(ls.version);Gt();process.argv.length<=2&&(xn(q),process.exit(0));N.name("magicpath").description("").version(q).option("-o, --output <format>","Output format: json").hook("preAction",e=>{e.optsWithGlobals().output==="json"&&zt(!0)});Fn(N);Xn(N);qn(N);Zn(N);Qn(N);eo(N);to(N);no(N);ro(N);io(N);co(N);ao(N);mo(N);po(N);uo(N);fo(N);ho(N);yo(N);Eo(N);Ao(N);To(N);Mo(N);N.parse();
|