magicpath-ai 2.3.2 → 2.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -0
- package/dist/cli.js +60 -57
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -61,6 +61,69 @@ magicpath-ai list-members --team "Acme Inc"
|
|
|
61
61
|
magicpath-ai list-members --team <teamId> -o json
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
+
### Skills
|
|
65
|
+
|
|
66
|
+
#### `skills list`
|
|
67
|
+
|
|
68
|
+
List skills available in your personal workspace, or in a team when `--team` is passed. Public MagicPath skills are included by default; pass `--owned-only` to show only skills you can edit.
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
magicpath-ai skills list
|
|
72
|
+
magicpath-ai skills list --team "Acme Inc"
|
|
73
|
+
magicpath-ai skills list --owned-only -o json
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
#### `skills get`
|
|
77
|
+
|
|
78
|
+
Show a skill by ID, slash command, or exact name. Use `--files` to list bundled package files, or `--file <path>` to print one bundled file.
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
magicpath-ai skills get my-skill
|
|
82
|
+
magicpath-ai skills get <skillId> --files
|
|
83
|
+
magicpath-ai skills get <skillId> --file reference/examples.md
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
#### `skills create`
|
|
87
|
+
|
|
88
|
+
Create an editable personal or team skill.
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
magicpath-ai skills create \
|
|
92
|
+
--name "Marketing page reviewer" \
|
|
93
|
+
--description "Use when reviewing landing page copy and layout." \
|
|
94
|
+
--instructions-file ./SKILL.md
|
|
95
|
+
|
|
96
|
+
magicpath-ai skills create --team "Acme Inc" --name "Team QA" --description "..." --instructions "..."
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
#### `skills import`
|
|
100
|
+
|
|
101
|
+
Import a `.zip` or `.skill` package. Imported package skills are read-only except for enabling or disabling them.
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
magicpath-ai skills import ./my-skill.skill
|
|
105
|
+
magicpath-ai skills import ./team-skill.zip --team "Acme Inc"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
#### `skills update`
|
|
109
|
+
|
|
110
|
+
Update an editable skill, or enable/disable any owned skill.
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
magicpath-ai skills update my-skill --description "Updated description"
|
|
114
|
+
magicpath-ai skills update <skillId> --instructions-file ./SKILL.md
|
|
115
|
+
magicpath-ai skills update <skillId> --disable
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
#### `skills delete`
|
|
119
|
+
|
|
120
|
+
Delete an editable skill. Pass `--team` for team skills and `-y` to skip the confirmation prompt.
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
magicpath-ai skills delete my-skill
|
|
124
|
+
magicpath-ai skills delete <skillId> --team "Acme Inc" -y
|
|
125
|
+
```
|
|
126
|
+
|
|
64
127
|
### Discovery
|
|
65
128
|
|
|
66
129
|
#### `search`
|
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{readFileSync as pr}from"fs";import{dirname as gr,join as ur}from"path";import{fileURLToPath as fr}from"url";import{program as N}from"commander";import Ge 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 bt(e){if(!(!e||typeof e!="object"))return e}function H(e){var n,t,o;if(e instanceof p)return e;if(Ge.isAxiosError(e)){let r=bt((n=e.response)==null?void 0:n.data),s=typeof(r==null?void 0:r.message)=="string"?r.message:e.response?`API error: ${e.response.status} ${e.response.statusText}`:e.message,i=typeof(r==null?void 0:r.code)=="string"?r.code:void 0,c=typeof((t=r==null?void 0:r.details)==null?void 0:t.billing_url)=="string"?r.details.billing_url:typeof((o=r==null?void 0:r.details)==null?void 0:o.billingUrl)=="string"?r.details.billingUrl:void 0,a=typeof(r==null?void 0:r.suggestion)=="string"?r.suggestion:c?"Upgrade to Pro from billing to keep using external agents.":void 0;return new p(s,{code:i,...a?{suggestion:a}:{}})}return e instanceof Error?new p(e.message):new p(String(e))}function vt(){Ge.interceptors.response.use(e=>e,e=>{var n;if(Ge.isAxiosError(e)){let t=bt((n=e.response)==null?void 0:n.data);if(typeof(t==null?void 0:t.code)=="string")return Promise.reject(H(e))}return Promise.reject(e)})}var xt=!1;function $t(e){xt=e}function x(){return xt}function v(e){console.log(JSON.stringify(e,null,2)),process.exit(0)}function A(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 J="0.0.0-dev";function Ct(e){J=e}import ne from"chalk";import ge from"fs-extra";import Ht from"path";import cn from"os";import Gt from"axios";var S=process.env.MAGICPATH_API_URL??"https://api.magicpath.ai";function $e(e,n){return`${S}/${e}/${n}`}function jt(e){return`${S}/v1/registry/${e}`}var rn=process.env.MAGICPATH_WEB_URL??"https://www.magicpath.ai";function Ve(e){return`${rn}${e}`}function Et(e){return Ve(`/files/${e}`)}function ze(e){return`${S}/auth/${e}`}function Je(){return`${S}/v1/external-agent/components`}function Be(e){return`${S}/v1/external-agent/components/${e}/context`}function At(e){return`${S}/v1/external-agent/components/${e}/start`}function Pt(e){return`${S}/v1/external-agent/components/${e}/revisions`}function Ke(e,n){return`${S}/v1/external-agent/components/${e}/revisions/${n}/files`}function Xe(e){return`${S}/v1/external-agent/jobs/${e}`}function Y(){return`${S}/users/me`}function qe(){return`${S}/users/me/projects`}function Tt(){return`${S}/users/me/assets/upload-url`}function St(){return`${S}/projects`}function Nt(e){return`${S}/projects/${e}`}function Rt(e){return`${S}/projects/${e}/components`}function Ze(e){return`${S}/projects/${e}/images`}function Ce(){return`${S}/users/me/design-systems`}function kt(e){return`${S}/design-systems/${e}`}function oe(){return`${S}/users/me/socket-rooms`}function Ot(){return`${S}/liveblocks/auth`}function Mt(e){return`${S}/components/${e}`}function Ut(){return`${S}/components/search`}function Ft(e){return`${S}/organizations/${e}`}function Ye(e){return`${S}/organizations/${e}/projects`}function je(e){return`${S}/organizations/${e}/design-systems`}var sn=[{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"}],Ee={"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 Dt(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 _t(e){if(e in Ee)return Ee[e];for(let n of Object.keys(Ee))if(e.startsWith(`${n}_`)||e.startsWith(`${n}-`))return Ee[n];return e}var Ae;function Lt(){return Ae||(Ae=an(),Ae)}function an(){let e=process.env.MAGICPATH_AGENT;if(e){let t=Dt(e);if(t)return{kind:"known-agent",slug:_t(t.slug),version:t.version}}for(let t of sn){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=Dt(n);if(t)return{kind:"known-agent",slug:_t(t.slug),version:t.version}}return process.stdin.isTTY?{kind:"interactive-human"}:{kind:"unknown-agent"}}function Wt(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 Vt=Ht.join(cn.homedir(),".magicpath"),Pe=Ht.join(Vt,"session.json");function Te(){try{if(!ge.existsSync(Pe))return null;let e=ge.readJsonSync(Pe);return e.accessToken&&e.refreshToken?e:null}catch{return null}}function zt(e){ge.ensureDirSync(Vt),ge.writeJsonSync(Pe,e)}function Qe(e,n){let t=Te();zt({accessToken:e,refreshToken:n,user:t==null?void 0:t.user})}function Q(){let e=Te();return e?{accessToken:e.accessToken,refreshToken:e.refreshToken}:null}function Jt(){try{ge.removeSync(Pe)}catch{}}function ln(e){try{let n=Te();n&&(n.user=e,zt(n))}catch{}}function Bt(){let e=Te();return(e==null?void 0:e.user)??null}function E(){let{type:e,version:n}=Wt(Lt()),t={"X-Client-Type":"cli","X-Client-Version":J};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=Q();if(!r)throw new Error("Not logged in. Run `magicpath-ai login` first.");return t.Authorization=`Bearer ${r.accessToken}`,t}function ue(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 ln(t),t}async function et(){let e=E(),n=await Gt.get(Y(),{headers:e}),t=n.data.user??n.data;return ue(t)}async function fe(e){let n=await Gt.get(Y(),{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 G(e,n){let t=await fe(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 Kt=["#95D5B2","#74C69D","#52B788","#40916C","#2D6A4F","#1B4332"];function mn(e){return ne.hex(Kt[Math.min(e,Kt.length-1)])}var tt=ne.hex("#2D6A4F"),dn=ne.hex("#1B4332"),pn=ne.hex("#E8F5E9"),ot=ne.hex("#888888"),gn=["\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"],un=["\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"],fn=gn.map((e,n)=>e+" "+un[n]);function hn(e){return e.map((n,t)=>{let o=mn(t),r="";for(let s of n)r+=s===" "?s:o(s);return r})}function Xt(e){let n=!!Q(),t=n?Bt():null;console.log();for(let s of hn(fn))console.log(s);if(console.log(),n&&t){let s=t.plan?` \xB7 ${t.plan}`:"";console.log(" "+tt("\u25CF")+" "+ne.bold(pn(t.name??"MagicPath User"))+dn(" "+(t.email??"")+s))}else console.log(" "+ot("\u25CB Not logged in \xB7 run")+" "+tt("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(" "+tt(s.padEnd(o))+ot(i));console.log(),console.log(" "+ot(`v${e} \u2500 magicpath-ai --help`)),console.log()}import Ne from"prompts";import lo from"ora";import{z as ie}from"zod";import ae from"path";import En from"os";import st from"fs-extra";import{pino as qt}from"pino";var re=qt();function se(){re=qt({level:"debug"}),re.debug({message:"DEBUG logger enabled. "})}var k={info:e=>{re.info(e)},debug:e=>{re.debug(e)},warn:e=>{re.warn(e)},error:e=>{re.error(e)}};import Zt from"axios";import Se from"path";import yn from"os";import{Readable as In}from"stream";import he from"fs-extra";import bn from"adm-zip";import{v4 as vn}from"uuid";async function xn(e){if(!(e instanceof In))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 $n(e){var n;if(e instanceof p)return e;if(Zt.isAxiosError(e)){let t=await xn((n=e.response)==null?void 0:n.data);if(t)try{let o=JSON.parse(t);return H({...e,response:{...e.response,data:o},isAxiosError:!0})}catch{}return H(e)}return new p("Failed to download project. Make sure your key is valid.")}async function Yt(e){let n=$e("v1","components/repository"),t=`${vn()}.zip`,o=Se.join(yn.tmpdir(),t);try{let r=await Zt({url:n,params:{key:e},method:"GET",responseType:"stream"});return await he.ensureDir(Se.dirname(o)),await new Promise(async(s,i)=>{try{r.data.pipe(he.createWriteStream(o)).on("error",i).once("close",()=>s(o))}catch(c){i(c)}}),o}catch(r){throw await $n(r)}}function nt(e){try{he.removeSync(e)}catch{}}function Qt(e,n,t){try{let o=Se.join(t,n),r=1;for(;he.existsSync(o);)r++,o=Se.join(t,`${n}-${r}`);return he.mkdirSync(o,{recursive:!0}),new bn(e).extractAllTo(o,!0),nt(e),o}catch{throw new p("Failed to extract project. Please try again.")}}import{execSync as rt}from"child_process";import to from"ora";import eo from"fs-extra";import Cn from"path";function oo(){try{return rt("yarn --version",{stdio:"ignore"}),"yarn"}catch{return"npm"}}function no(e){let n=oo(),t=to(`\u{1F4E6} Installing dependencies using ${n}...`).start();try{rt(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 jn(e){let n=Cn.join(e,"package.json");if(!eo.existsSync(n))return new Set;try{let t=eo.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 ro(e,n){if(e.length===0)return{installed:[],skipped:[]};let t=jn(n),o=e.filter(c=>!t.has(c)),r=e.filter(c=>t.has(c));if(o.length===0)return k.debug("All dependencies already installed"),{installed:[],skipped:r};let s=oo(),i=to(`\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 k.debug({command:a}),rt(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 so}from"child_process";import io from"ora";function ao(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=io(`\u{1F680} Opening project in ${t[n]}...`).start(),s=!1;try{for(let i of o[n]){if(s)break;try{so(`${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 zr}from"fs";import{dirname as Jr,join as Kr}from"path";import{fileURLToPath as Br}from"url";import{program as T}from"commander";import Be 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 At(e){if(!(!e||typeof e!="object"))return e}function D(e){var n,t,o;if(e instanceof p)return e;if(Be.isAxiosError(e)){let r=At((n=e.response)==null?void 0:n.data),s=typeof(r==null?void 0:r.message)=="string"?r.message:e.response?`API error: ${e.response.status} ${e.response.statusText}`:e.message,i=typeof(r==null?void 0:r.code)=="string"?r.code:void 0,c=typeof((t=r==null?void 0:r.details)==null?void 0:t.billing_url)=="string"?r.details.billing_url:typeof((o=r==null?void 0:r.details)==null?void 0:o.billingUrl)=="string"?r.details.billingUrl:void 0,a=typeof(r==null?void 0:r.suggestion)=="string"?r.suggestion:c?"Upgrade to Pro from billing to keep using external agents.":void 0;return new p(s,{code:i,...a?{suggestion:a}:{}})}return e instanceof Error?new p(e.message):new p(String(e))}function Tt(){Be.interceptors.response.use(e=>e,e=>{var n;if(Be.isAxiosError(e)){let t=At((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 Nt=!1;function Rt(e){Nt=e}function x(){return Nt}function b(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 K="0.0.0-dev";function Ot(e){K=e}import se from"chalk";import we from"fs-extra";import nn from"path";import Po from"os";import on from"axios";var A=process.env.MAGICPATH_API_URL??"https://api.magicpath.ai";function Ee(e,n){return`${A}/${e}/${n}`}function Ut(e){return`${A}/v1/registry/${e}`}var jo=process.env.MAGICPATH_WEB_URL??"https://www.magicpath.ai";function qe(e){return`${jo}${e}`}function Ft(e){return qe(`/files/${e}`)}function Xe(e){return`${A}/auth/${e}`}function Ze(){return`${A}/v1/external-agent/components`}function Ye(e){return`${A}/v1/external-agent/components/${e}/context`}function Mt(e){return`${A}/v1/external-agent/components/${e}/start`}function Dt(e){return`${A}/v1/external-agent/components/${e}/revisions`}function Qe(e,n){return`${A}/v1/external-agent/components/${e}/revisions/${n}/files`}function et(e){return`${A}/v1/external-agent/jobs/${e}`}function Q(){return`${A}/users/me`}function tt(){return`${A}/users/me/projects`}function nt(){return`${A}/users/me/skills`}function _t(){return`${A}/users/me/skills/import`}function Lt(){return`${A}/users/me/assets/upload-url`}function Wt(){return`${A}/projects`}function Ht(e){return`${A}/projects/${e}`}function Gt(e){return`${A}/projects/${e}/components`}function ot(e){return`${A}/projects/${e}/images`}function ke(){return`${A}/users/me/design-systems`}function Vt(e){return`${A}/design-systems/${e}`}function re(){return`${A}/users/me/socket-rooms`}function zt(){return`${A}/liveblocks/auth`}function Jt(e){return`${A}/components/${e}`}function Kt(){return`${A}/components/search`}function Bt(e){return`${A}/organizations/${e}`}function rt(e){return`${A}/organizations/${e}/projects`}function st(e){return`${A}/organizations/${e}/skills`}function qt(e){return`${A}/organizations/${e}/skills/import`}function Pe(e){return`${A}/organizations/${e}/design-systems`}function it(e){return`${A}/skills/${e}`}function Xt(e){return`${A}/skills/${e}/files`}function Zt(e,n){return`${A}/skills/${e}/files/content?path=${encodeURIComponent(n)}`}var Eo=[{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"}],Ae={"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 Yt(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 Qt(e){if(e in Ae)return Ae[e];for(let n of Object.keys(Ae))if(e.startsWith(`${n}_`)||e.startsWith(`${n}-`))return Ae[n];return e}var Te;function en(){return Te||(Te=ko(),Te)}function ko(){let e=process.env.MAGICPATH_AGENT;if(e){let t=Yt(e);if(t)return{kind:"known-agent",slug:Qt(t.slug),version:t.version}}for(let t of Eo){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=Yt(n);if(t)return{kind:"known-agent",slug:Qt(t.slug),version:t.version}}return process.stdin.isTTY?{kind:"interactive-human"}:{kind:"unknown-agent"}}function tn(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 rn=nn.join(Po.homedir(),".magicpath"),Ne=nn.join(rn,"session.json");function Re(){try{if(!we.existsSync(Ne))return null;let e=we.readJsonSync(Ne);return e.accessToken&&e.refreshToken?e:null}catch{return null}}function sn(e){we.ensureDirSync(rn),we.writeJsonSync(Ne,e)}function at(e,n){let t=Re();sn({accessToken:e,refreshToken:n,user:t==null?void 0:t.user})}function ee(){let e=Re();return e?{accessToken:e.accessToken,refreshToken:e.refreshToken}:null}function an(){try{we.removeSync(Ne)}catch{}}function Ao(e){try{let n=Re();n&&(n.user=e,sn(n))}catch{}}function cn(){let e=Re();return(e==null?void 0:e.user)??null}function j(){let{type:e,version:n}=tn(en()),t={"X-Client-Type":"cli","X-Client-Version":K};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=ee();if(!r)throw new Error("Not logged in. Run `magicpath-ai login` first.");return t.Authorization=`Bearer ${r.accessToken}`,t}function ye(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 Ao(t),t}async function ct(){let e=j(),n=await on.get(Q(),{headers:e}),t=n.data.user??n.data;return ye(t)}async function Ie(e){let n=await on.get(Q(),{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 _(e,n){let t=await Ie(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 ln=["#95D5B2","#74C69D","#52B788","#40916C","#2D6A4F","#1B4332"];function To(e){return se.hex(ln[Math.min(e,ln.length-1)])}var lt=se.hex("#2D6A4F"),No=se.hex("#1B4332"),Ro=se.hex("#E8F5E9"),mt=se.hex("#888888"),Oo=["\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"],Uo=["\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"],Fo=Oo.map((e,n)=>e+" "+Uo[n]);function Mo(e){return e.map((n,t)=>{let o=To(t),r="";for(let s of n)r+=s===" "?s:o(s);return r})}function mn(e){let n=!!ee(),t=n?cn():null;console.log();for(let s of Mo(Fo))console.log(s);if(console.log(),n&&t){let s=t.plan?` \xB7 ${t.plan}`:"";console.log(" "+lt("\u25CF")+" "+se.bold(Ro(t.name??"MagicPath User"))+No(" "+(t.email??"")+s))}else console.log(" "+mt("\u25CB Not logged in \xB7 run")+" "+lt("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(" "+lt(s.padEnd(o))+mt(i));console.log(),console.log(" "+mt(`v${e} \u2500 magicpath-ai --help`)),console.log()}import Ue from"prompts";import Sn from"ora";import{z as ce}from"zod";import le from"path";import Ko from"os";import gt from"fs-extra";import{pino as dn}from"pino";var ie=dn();function ae(){ie=dn({level:"debug"}),ie.debug({message:"DEBUG logger enabled. "})}var R={info:e=>{ie.info(e)},debug:e=>{ie.debug(e)},warn:e=>{ie.warn(e)},error:e=>{ie.error(e)}};import pn from"axios";import Oe from"path";import _o from"os";import{Readable as Lo}from"stream";import be from"fs-extra";import Wo from"adm-zip";import{v4 as Ho}from"uuid";async function Go(e){if(!(e instanceof Lo))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 Vo(e){var n;if(e instanceof p)return e;if(pn.isAxiosError(e)){let t=await Go((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 gn(e){let n=Ee("v1","components/repository"),t=`${Ho()}.zip`,o=Oe.join(_o.tmpdir(),t);try{let r=await pn({url:n,params:{key:e},method:"GET",responseType:"stream"});return await be.ensureDir(Oe.dirname(o)),await new Promise(async(s,i)=>{try{r.data.pipe(be.createWriteStream(o)).on("error",i).once("close",()=>s(o))}catch(c){i(c)}}),o}catch(r){throw await Vo(r)}}function dt(e){try{be.removeSync(e)}catch{}}function un(e,n,t){try{let o=Oe.join(t,n),r=1;for(;be.existsSync(o);)r++,o=Oe.join(t,`${n}-${r}`);return be.mkdirSync(o,{recursive:!0}),new Wo(e).extractAllTo(o,!0),dt(e),o}catch{throw new p("Failed to extract project. Please try again.")}}import{execSync as pt}from"child_process";import hn from"ora";import fn from"fs-extra";import zo from"path";function wn(){try{return pt("yarn --version",{stdio:"ignore"}),"yarn"}catch{return"npm"}}function yn(e){let n=wn(),t=hn(`\u{1F4E6} Installing dependencies using ${n}...`).start();try{pt(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 Jo(e){let n=zo.join(e,"package.json");if(!fn.existsSync(n))return new Set;try{let t=fn.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 In(e,n){if(e.length===0)return{installed:[],skipped:[]};let t=Jo(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=wn(),i=hn(`\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}),pt(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 bn}from"child_process";import $n from"ora";function xn(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=$n(`\u{1F680} Opening project in ${t[n]}...`).start(),s=!1;try{for(let i of o[n]){if(s)break;try{bn(`${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 pr}from"fs";import{dirname as gr,join as ur}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 vn(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=$n(`\u{1F4C1} Opening project in ${r}...`).start();try{bn(`${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 Bo=ce.object({key:ce.string(),debug:ce.boolean().default(!1),ide:ce.enum(["cursor","antigravity","vscode","webstorm"]).optional(),dir:ce.string().optional(),name:ce.string().optional()});function qo(e){let n=D(e);x()&&E(n),console.error(`
|
|
66
|
+
${n.message}`),process.exit(1)}function Cn(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=Bo.parse(n)}catch{throw new p("Invalid CLI options for clone command.")}t.debug&&ae();let o=x();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=le.resolve(t.dir),s=t.name,await gt.ensureDir(r);else{let g=Ko.homedir(),$=[{name:"Documents",path:le.join(g,"Documents")},{name:"Desktop",path:le.join(g,"Desktop")},{name:"Downloads",path:le.join(g,"Downloads")}],v=(await Promise.all($.map(async y=>{try{return await gt.pathExists(y.path)?y:null}catch{return null}}))).filter(y=>y!==null),w=[{title:`Right here (current folder: ${process.cwd()})`,value:process.cwd()},{title:`Home directory (${g})`,value:g}];v.forEach(y=>{w.push({title:y.name,value:y.path})}),w.push({title:"Other (specify custom path)",value:"custom"});let{targetDir:u}=await Ue({type:"select",name:"targetDir",message:"Where should we put your code?",choices:w,initial:0});if(r=u,u==="custom"){let{customPath:y}=await Ue({type:"text",name:"customPath",message:"Enter the full path where you want to create your project:",initial:g,validate:P=>{if(!P)return"Please enter a path";try{return le.resolve(P),!0}catch{return"Please enter a valid path"}}});if(!y)throw new p("Project creation cancelled");r=le.resolve(y);try{await gt.ensureDir(r)}catch{throw new p(`Failed to create or access directory: ${r}`)}}if(!r)throw new p("Download cancelled");if(s=(await Ue({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:Sn("\u{1F4E5} Downloading project...").start();try{i=await gn(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:Sn("\u{1F4E6} Unpacking project...").start(),l;try{l=un(i,s,r),a==null||a.succeed(`Project unpacked to ${s}`)}catch(g){throw a==null||a.fail("Failed to unpack project"),dt(i),g instanceof p?g:new p("Something went wrong!")}try{yn(l)}catch(g){throw g instanceof p?g:new p("Something went wrong!")}o&&b({projectDir:l});let d=[{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"}],m=0;if(t.ide){let g=d.findIndex($=>$.value===t.ide);g!==-1&&(m=g)}let f=await Ue({type:"select",name:"ide",message:"Which IDE would you like to open the project in?",choices:d,initial:m});if(f.ide&&f.ide!=="none")try{f.ide==="filemanager"?vn(l):xn(l,f.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){qo(t)}})}import ht from"prompts";import{z as M}from"zod";import X from"path";import dr from"fs-extra";var B=class extends p{constructor(){super("You must be logged in to install components.")}};import Xo from"ora";var jn="\x1B[38;2;32;140;80m",Zo="\x1B[0m",Yo=`${jn}\u2714${Zo}`;function k(e){let n=Xo(e),t=n.stopAndPersist.bind(n);return n.succeed=o=>t({symbol:Yo,text:o}),n}function En(){let e=process.stdout.write.bind(process.stdout),n=((t,...o)=>(typeof t=="string"&&(t=t.replace(/\x1b\[36m/g,jn)),e(t,...o)));return process.stdout.write=n,()=>{process.stdout.write=e}}import kn from"axios";import q from"fs-extra";import Z from"path";import{z as G}from"zod";var Qo=G.object({name:G.string(),path:G.string(),content:G.string()}),er=G.object({data:G.object({name:G.string(),generatedName:G.string(),files:G.array(Qo),utils:G.object({content:G.string()}),dependencies:G.array(G.string())})});function te(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),d=[],m=[];if(l){let g=l[1].split(/[;\n]/).filter($=>$.trim());for(let $ of g){let I=$.trim();if(!I||I.startsWith("//")||I.startsWith("/*"))continue;let v=I.match(/^(\w+)(\?)?:/);if(v){let w=v[1],u=!!v[2];if(w==="children")continue;u?m.push(w):d.push(w)}}}return{name:s,isDefault:i,propsType:l?c:void 0,requiredProps:d,optionalProps:m}}function me(e,n){return e.isDefault?`import ${e.name} from '${n}';`:`import { ${e.name} } from '${n}';`}function de(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 tr(e){let{componentName:n,importPath:t,exportInfo:o,fileName:r}=e,s=[`# ${n}`,"","## Import","","```tsx"];if(o){if(s.push(me(o,t)),s.push("```"),s.push(""),s.push("## Usage"),s.push(""),s.push("```tsx"),s.push(de(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 Pn(e,n){let t=tr(n),o=Z.join(e,"usage.md");q.writeFileSync(o,t,"utf8"),R.debug({message:"Wrote usage file",usagePath:o})}async function $e(e){var o,r,s;let n=Ut(e);R.debug({message:"Fetching component from registry",url:n});let t;try{t=j()}catch{throw new B}try{let i=await kn.get(n,{headers:t});return er.parse(i.data).data}catch(i){throw i instanceof p?i:kn.isAxiosError(i)?((o=i.response)==null?void 0:o.status)===401?new B:((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 An(e,n){let t=[];for(let o of e){let r=Z.join(n,o.path);q.existsSync(r)&&t.push(o.path)}return t}function nr(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 Tn(e,n,t=!1){q.ensureDirSync(n);for(let o of e){let r=Z.join(n,o.path),s=Z.dirname(r);q.ensureDirSync(s);let i=t?nr(o.content):o.content;q.writeFileSync(r,i,"utf8"),R.debug({message:"Wrote file",filePath:r})}}function Nn(e){let n=Z.join(e,"utils.ts");if(!q.existsSync(n))return!1;try{return q.readFileSync(n,"utf8").includes("export function cn")}catch{return!1}}function Rn(e,n){q.ensureDirSync(n);let t=Z.join(n,"utils.ts");q.writeFileSync(t,e,"utf8"),R.debug({message:"Wrote utils file",utilsPath:t})}var xe="src/components/magicpath",or="src/lib";function Fe(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 Me(e,n=process.cwd()){let t=e||xe;return Z.join(n,t)}function On(e=process.cwd()){return Z.join(e,or)}import rr from"http";import sr from"ora";import ut from"axios";import{exec as ir}from"child_process";var ar=12e4,Fn=`
|
|
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,74 +75,77 @@ 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
|
+
`,cr='<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>',lr='<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>',mr=`<!DOCTYPE html>
|
|
79
79
|
<html><head><meta charset="utf-8"><title>MagicPath CLI</title>
|
|
80
|
-
<style>${
|
|
80
|
+
<style>${Fn}</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">${cr}</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>`,Un=e=>`<!DOCTYPE html>
|
|
86
86
|
<html><head><meta charset="utf-8"><title>MagicPath CLI</title>
|
|
87
|
-
<style>${
|
|
87
|
+
<style>${Fn}</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">${lr}</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 ft(){return new Promise((e,n)=>{let t=!1,o,r=rr.createServer(async(c,a)=>{var m;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 d=l.searchParams.get("code");if(!d){a.writeHead(400,{"Content-Type":"text/html"}),a.end(Un("No authorization code received."));return}try{let f=await ut.post(Xe("extension/tokens"),{token:d}),{access_token:g,refresh_token:$}=f.data;at(g,$);try{await ct()}catch{}a.writeHead(200,{"Content-Type":"text/html"}),a.end(mr),s(),i.succeed("Logged in successfully!"),t=!0,e(!0)}catch(f){console.error(f);let g=ut.isAxiosError(f)&&((m=f.response)==null?void 0:m.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(Un(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=qe(`/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
|
|
96
|
-
${t.message}`),process.exit(1)),t}}),e.command("logout").description("Log out of your MagicPath account").action(()=>{
|
|
95
|
+
`);let d=process.platform;ir(`${d==="darwin"?"open":d==="win32"?"start":"xdg-open"} "${l}"`)});let i=sr("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))},ar)})}function Mn(e){e.command("login").description("Log in to your MagicPath account").option("--code <code>","Exchange an authorization code non-interactively").action(async n=>{try{if(n.code){let o=await ut.post(Xe("extension/tokens"),{token:n.code}),{access_token:r,refresh_token:s}=o.data;at(r,s);try{await ct()}catch{}x()&&b({authenticated:!0,method:"code"}),console.log("Logged in successfully!");return}x()&&(process.env.MAGICPATH_TOKEN&&b({authenticated:!0,method:"environment"}),ee()&&b({authenticated:!0,method:"stored"}),E(new Error("Not authenticated. Set MAGICPATH_TOKEN environment variable or run login interactively."))),await ft()||console.log("Login cancelled.")}catch(t){throw x()&&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(()=>{an(),x()&&b({loggedOut:!0}),console.log("Logged out successfully.")})}var pr=M.object({yes:M.boolean().default(!1),overwrite:M.boolean().default(!1),path:M.string().optional(),debug:M.boolean().default(!1),dryRun:M.boolean().default(!1)}),Oi=M.object({component:M.string(),generatedName:M.string(),filesWritten:M.array(M.string()),dependenciesInstalled:M.array(M.string()),importStatement:M.string().optional(),usage:M.string().optional(),dryRun:M.boolean()});function Dn(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: ${xe})`).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=pr.parse(t)}catch{throw new Error("Invalid CLI options for add command.")}o.debug&&ae();let r=x();r&&(o.yes=!0);let s=n.length>1;s&&(o.yes=!0),R.debug({generatedNames:n,options:o});let i=process.cwd(),c=X.join(i,"package.json");if(!dr.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
|
|
99
|
-
The following files already exist:`)
|
|
100
|
-
This will install:`),console.log(` Component: ${m.name}`),console.log(` Files: ${m.files.length} file(s) to ${X.relative(i
|
|
101
|
-
[Dry run] Would install:`),console.log(` Component: ${m.name}`),console.log(` Files: ${w.join(", ")}`),console.log(` Dependencies: ${m.dependencies.join(", ")||"none"}`),h&&console.log(` Import: ${h}`));continue}let P=r?null:
|
|
102
|
-
\u26A0\uFE0F ${
|
|
98
|
+
`);for(let l of n)try{let d=r?null:k(`Fetching component "${l}"...`).start(),m;try{m=await $e(l),d==null||d.succeed(`Found component: ${m.name}`)}catch(S){if(S instanceof B){if(d==null||d.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:C}=await ht({type:"confirm",name:"shouldLogin",message:"You need to be logged in to install components. Log in now?",initial:!0});if(!C){console.log("Installation cancelled.");return}if(!await ft()){console.log("Installation cancelled.");return}let H=k(`Fetching component "${l}"...`).start();try{m=await $e(l),H.succeed(`Found component: ${m.name}`)}catch(Pt){throw H.fail("Failed to fetch component"),Pt instanceof p?Pt:new p("Something went wrong!")}}else{if(d==null||d.fail("Failed to fetch component"),s){let C=S instanceof p?S.message:"Something went wrong!";a.push({component:l,generatedName:l,filesWritten:[],dependenciesInstalled:[],dryRun:o.dryRun,error:C}),r||console.log(` \u26A0\uFE0F Skipping "${l}": ${C}`);continue}throw S instanceof p?S:new p("Something went wrong!")}}let f=Me(o.path,i),g=Fe(m.name),$=X.join(f,g),I=On(i);R.debug({basePath:f,componentFolderName:g,componentsPath:$,utilsPath:I});let v=An(m.files,$);if(v.length>0&&!o.overwrite)if(r||(console.log(`
|
|
99
|
+
The following files already exist:`),v.forEach(S=>console.log(` - ${S}`))),o.yes){if(s){r||console.log(` \u26A0\uFE0F Skipping "${m.name}": files already exist. Use --overwrite.`),a.push({component:m.name,generatedName:m.generatedName,filesWritten:[],dependenciesInstalled:[],dryRun:o.dryRun,error:"Files already exist. Use --overwrite to replace."});continue}if(r)throw new p(`Files already exist: ${v.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:S}=await ht({type:"confirm",name:"shouldOverwrite",message:"Do you want to overwrite these files?",initial:!1});if(!S){console.log("Installation cancelled.");return}}if(!o.yes&&v.length===0){console.log(`
|
|
100
|
+
This will install:`),console.log(` Component: ${m.name}`),console.log(` Files: ${m.files.length} file(s) to ${X.relative(i,$)||"."}`),console.log(` Dependencies: ${m.dependencies.length} package(s)`);let{shouldProceed:S}=await ht({type:"confirm",name:"shouldProceed",message:"Proceed with installation?",initial:!0});if(!S){console.log("Installation cancelled.");return}}let w=m.files.map(S=>X.relative(i,X.join($,S.path))),u=m.files[0],h,y;if(u){let S=u.name.replace(/\.tsx?$/,""),C=o.path?`@/${o.path}/${g}/${S}`:`@/components/magicpath/${g}/${S}`,N=te(u.content);N?(h=me(N,C),y=de(N)):h=`import { ${S} } from '${C}';`}if(o.dryRun){let S=r?m.files.map(C=>({path:C.path,name:C.name,content:C.content})):void 0;!s&&r&&b({component:m.name,generatedName:m.generatedName,filesWritten:w,files:S,dependenciesInstalled:m.dependencies,importStatement:h,usage:y,dryRun:!0}),a.push({component:m.name,generatedName:m.generatedName,filesWritten:w,dependenciesInstalled:m.dependencies,importStatement:h,usage:y,dryRun:!0}),r||(console.log(`
|
|
101
|
+
[Dry run] Would install:`),console.log(` Component: ${m.name}`),console.log(` Files: ${w.join(", ")}`),console.log(` Dependencies: ${m.dependencies.join(", ")||"none"}`),h&&console.log(` Import: ${h}`));continue}let P=r?null:k("Writing component files...").start();try{Tn(m.files,$,!0),P==null||P.succeed(`Wrote ${m.files.length} file(s) to ${X.relative(i,$)||"."}`)}catch{if(P==null||P.fail("Failed to write component files"),s){a.push({component:m.name,generatedName:m.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(!Nn(I)&&m.utils.content){let S=r?null:k("Installing utilities...").start();try{Rn(m.utils.content,I),S==null||S.succeed(`Wrote utils.ts to ${X.relative(i,I)||"."}`)}catch(C){S==null||S.fail("Failed to write utils file"),R.debug({err:C}),r||console.log(" Warning: Could not write utils.ts. You may need to create it manually.")}}let W=[];if(m.dependencies.length>0)try{let{installed:S,skipped:C}=In(m.dependencies,i);W.push(...S),C.length>0&&R.debug({message:"Skipped already installed packages",skipped:C})}catch(S){S instanceof p&&(r||console.log(`
|
|
102
|
+
\u26A0\uFE0F ${S.message}`))}if(a.push({component:m.name,generatedName:m.generatedName,filesWritten:w,dependenciesInstalled:W,importStatement:h,usage:y,dryRun:!1}),!s&&r&&b({component:m.name,generatedName:m.generatedName,filesWritten:w,dependenciesInstalled:W,importStatement:h,usage:y,dryRun:!1}),r||(console.log(`
|
|
103
103
|
\u2705 Successfully added "${m.name}" to your project!`),s||console.log(`
|
|
104
|
-
Usage:`)),u){let
|
|
105
|
-
\u{1F4C4} Usage documentation written to ${X.relative(i,X.join(
|
|
106
|
-
${l.length} of ${a.length} component(s) added successfully.`),
|
|
107
|
-
${o.message}`),process.exit(1)),o}})}import
|
|
108
|
-
Name: ${c.name||"N/A"}`),console.log(` Email: ${c.email||"N/A"}`),i.id&&console.log(` ID: ${i.id}`),console.log(` Plan: ${c.plan}`)}catch(s){throw r==null||r.fail("Failed to fetch user info")
|
|
109
|
-
${o.message}`),process.exit(1)),o}})}import
|
|
110
|
-
No projects found.`);return}console.log("");let
|
|
111
|
-
Showing ${
|
|
112
|
-
${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=x(),r=parseInt(t.limit,10)||100;try{let
|
|
113
|
-
No components found.`);return}console.log("");let u=Math.max(4,...I.map(y=>(y.name||"").length)),h=Math.max(14,...I.map(y=>(y.generatedName||"").length));console.log(` ${"Name".padEnd(u)} ${"Generated Name".padEnd(h)} ${"Rev".padEnd(4)} ${"Views".padEnd(6)} ${"Likes".padEnd(6)} ${"Remixes".padEnd(7)} ${"Updated".padEnd(10)} ID`),console.log(` ${"\u2500".repeat(u)} ${"\u2500".repeat(h)} ${"\u2500".repeat(4)} ${"\u2500".repeat(6)} ${"\u2500".repeat(6)} ${"\u2500".repeat(7)} ${"\u2500".repeat(10)} ${"\u2500".repeat(20)}`);for(let y of I){let P=(y.name||"").padEnd(u),
|
|
114
|
-
More results available. Use --after ${
|
|
115
|
-
${
|
|
116
|
-
No components matching "${n}".`);return}console.log("");let
|
|
117
|
-
${c.message}`),process.exit(1)),c}})}import{z as
|
|
104
|
+
Usage:`)),u){let S=u.name.replace(/\.tsx?$/,""),C=o.path?`@/${o.path}/${g}/${S}`:`@/components/magicpath/${g}/${S}`,N=te(u.content);!s&&!r&&(N?(console.log(` ${me(N,C)}`),console.log(""),console.log(` ${de(N)}`),N.requiredProps.length>0&&(console.log(""),console.log(` Required props: ${N.requiredProps.join(", ")}`))):console.log(` import { ${S} } from '${C}';`));try{Pn($,{componentName:m.name,importPath:C,exportInfo:N,fileName:S}),!s&&!r&&console.log(`
|
|
105
|
+
\u{1F4C4} Usage documentation written to ${X.relative(i,X.join($,"usage.md"))}`)}catch(H){R.debug({err:H})}}}catch(d){if(s){let m=d instanceof Error?d.message:String(d);a.push({component:l,generatedName:l,filesWritten:[],dependenciesInstalled:[],dryRun:o.dryRun,error:m}),r||console.log(` \u26A0\uFE0F Failed "${l}": ${m}`);continue}throw d}if(s){r&&b({results:a,total:a.length,succeeded:a.filter(m=>!m.error).length,failed:a.filter(m=>m.error).length});let l=a.filter(m=>!m.error),d=a.filter(m=>m.error);console.log(`
|
|
106
|
+
${l.length} of ${a.length} component(s) added successfully.`),d.length>0&&console.log(` ${d.length} failed: ${d.map(m=>m.generatedName).join(", ")}`)}}catch(o){throw x()&&E(o),o instanceof p&&(console.error(`
|
|
107
|
+
${o.message}`),process.exit(1)),o}})}import _n from"axios";function Ln(e){e.command("whoami").description("Show the currently authenticated user").action(async()=>{var t;let n=x();try{let o;try{o=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 r=n?null:k("Fetching user info...").start();try{let s=await _n.get(Q(),{headers:o}),i=s.data.user??s.data;r==null||r.succeed("Authenticated");let c=ye(i);n&&b(i),console.log(`
|
|
108
|
+
Name: ${c.name||"N/A"}`),console.log(` Email: ${c.email||"N/A"}`),i.id&&console.log(` ID: ${i.id}`),console.log(` Plan: ${c.plan}`)}catch(s){throw r==null||r.fail("Failed to fetch user info"),_n.isAxiosError(s)?((t=s.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(s):s}}catch(o){throw n&&E(o),o instanceof p&&(console.error(`
|
|
109
|
+
${o.message}`),process.exit(1)),o}})}import wt from"axios";import De from"axios";function _e(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 Y(e,n){if(n!=null&&n.personal){let c=await De.get(`${tt()}`,{headers:e});return _e(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 De.get(`${rt(n.orgId)}`,{headers:{...e,"X-Organization-ID":n.orgId}});return _e(c).map(a=>({...a,ownerType:"team",ownerName:n.orgName??""}))}let t=await Ie(e),o=[De.get(`${tt()}`,{headers:e}).then(c=>_e(c).map(a=>{var l;return{...a,ownerType:"personal",ownerName:((l=a.owner)==null?void 0:l.email)??""}})),...t.map(c=>De.get(`${rt(c.id)}`,{headers:{...e,"X-Organization-ID":c.id}}).then(a=>_e(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)})}function Wn(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=x(),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=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 l=t?null:k("Fetching projects...").start();try{let d;if(n.personal)d={personal:!0};else if(n.team){let h=await _(n.team,a);d={orgId:h.id,orgName:h.name}}let m=await Y(a,d),f=m.length,g=m;if(r>0&&(g=g.slice(r)),o!==void 0&&(g=g.slice(0,o)),l==null||l.succeed(`Found ${f} project(s)`),t&&b({projects:g,pagination:{total:f,limit:o??f,offset:r,hasMore:r+g.length<f}}),g.length===0){console.log(`
|
|
110
|
+
No projects found.`);return}console.log("");let $=Math.max(4,...g.map(h=>(h.name||"").length)),I=Math.max(9,...g.map(h=>h.ownerType==="personal"?8:(h.ownerName||"").length)),v=7,w=10,u=10;console.log(` ${"Name".padEnd($)} ${"Type".padEnd(v)} ${"Components".padEnd(w)} ${"Workspace".padEnd(I)} Updated`),console.log(` ${"\u2500".repeat($)} ${"\u2500".repeat(v)} ${"\u2500".repeat(w)} ${"\u2500".repeat(I)} ${"\u2500".repeat(u)}`);for(let h of g){let y=(h.name||"").padEnd($),P=(h.isLibrary?"library":"project").padEnd(v),F=String(h.componentCount??((s=h._count)==null?void 0:s.components)??"?").padEnd(w),W=(h.ownerType==="personal"?"Personal":h.ownerName||"").padEnd(I),S=h.updatedAt?new Date(h.updatedAt).toISOString().slice(0,10):"";console.log(` ${y} ${P} ${F} ${W} ${S}`)}o!==void 0&&r+g.length<f&&console.log(`
|
|
111
|
+
Showing ${g.length} of ${f}. Use --offset ${r+g.length} to see more.`)}catch(d){throw l==null||l.fail("Failed to fetch projects"),d instanceof p?d:wt.isAxiosError(d)?((i=d.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=d.response)==null?void 0:c.status}`):d}}catch(a){throw t&&E(a),a instanceof p&&(console.error(`
|
|
112
|
+
${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=x(),r=parseInt(t.limit,10)||100;try{let d;try{d=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 m=o?null:k("Fetching components...").start();try{let f=new URLSearchParams({limit:String(r),revisionStatus:"COMPLETED",sortBy:t.sortBy,order:t.order});t.after&&f.set("after",t.after),t.createdBy&&f.set("createdBy",t.createdBy);let g=`${Gt(n)}?${f}`,$=await wt.get(g,{headers:d}),I=((s=$.data.data)==null?void 0:s.components)??$.data.components??$.data,v=((i=$.data.data)==null?void 0:i.pagination)??$.data.pagination,w=Array.isArray(I)?I.length:0;if(m==null||m.succeed(`Found ${w} component(s)`),o&&b({components:I,pagination:v??{limit:r,hasNext:!1,lastId:null}}),!Array.isArray(I)||I.length===0){console.log(`
|
|
113
|
+
No components found.`);return}console.log("");let u=Math.max(4,...I.map(y=>(y.name||"").length)),h=Math.max(14,...I.map(y=>(y.generatedName||"").length));console.log(` ${"Name".padEnd(u)} ${"Generated Name".padEnd(h)} ${"Rev".padEnd(4)} ${"Views".padEnd(6)} ${"Likes".padEnd(6)} ${"Remixes".padEnd(7)} ${"Updated".padEnd(10)} ID`),console.log(` ${"\u2500".repeat(u)} ${"\u2500".repeat(h)} ${"\u2500".repeat(4)} ${"\u2500".repeat(6)} ${"\u2500".repeat(6)} ${"\u2500".repeat(7)} ${"\u2500".repeat(10)} ${"\u2500".repeat(20)}`);for(let y of I){let P=(y.name||"").padEnd(u),F=(y.generatedName||"").padEnd(h),W=String(y.revisionCount??"?").padEnd(4),S=String(y.viewCount??0).padEnd(6),C=String(y.likeCount??0).padEnd(6),N=String(y.remixCount??0).padEnd(7),H=y.updatedAt?new Date(y.updatedAt).toISOString().slice(0,10):"";console.log(` ${P} ${F} ${W} ${S} ${C} ${N} ${H.padEnd(10)} ${y.id||""}`)}v!=null&&v.hasNext&&console.log(`
|
|
114
|
+
More results available. Use --after ${v.lastId} to see the next page.`)}catch(f){throw m==null||m.fail("Failed to fetch components"),wt.isAxiosError(f)?((c=f.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=f.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=f.response)==null?void 0:l.status}`):f}}catch(d){throw o&&E(d),d instanceof p&&(console.error(`
|
|
115
|
+
${d.message}`),process.exit(1)),d}})}import{execSync as gr}from"child_process";function Hn(e){e.command("setup-skills").description("Set up MagicPath for AI agents").action(async()=>{console.log("Installing MagicPath skills..."),gr("npx skills add https://github.com/MagicPathAI/agent-skills --skill magicpath -y",{stdio:"inherit"})})}import{exec as ur}from"child_process";function Le(e){return/^\d+$/.test(e)?{type:"project",url:Ft(e),projectId:e}:{type:"component",url:Ee("v1",e),generatedName:e}}function Gn(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=Le(n);x()&&b(t);let o=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";ur(`${o} ${t.url}`),console.log(`Opening ${t.url}`)})}function Vn(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=Le(n);if(x()){b(t);return}console.log(t.url)})}import fr from"axios";function zn(e){e.command("info").description("Show project and auth status (useful for agent context injection)").action(async()=>{let n=x();try{let t=null,o=!1,r=null;process.env.MAGICPATH_TOKEN?(t="environment",o=!0,r=j()):ee()&&(t="stored",o=!0,r=j());let s=null,i=null;if(o&&r)try{let l=await fr.get(Q(),{headers:r}),d=l.data.user??l.data,m=ye(d);s={id:d.id,name:m.name??"Unknown",email:m.email??""},i=(d.organizationUsers??[]).map(g=>({id:String(g.organization.id),name:g.organization.name,role:g.role}))}catch{}let c=null;if(o&&r)try{c=(await Y(r)).map(d=>{var m;return{id:d.id,name:d.name,componentCount:d.componentCount??((m=d._count)==null?void 0:m.components)??0,ownerType:d.ownerType,ownerName:d.ownerName}})}catch{}if(n&&b({auth:{authenticated:o,method:t,user:s},teams:i,projects:c,cli:{version:K,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"]}}),console.log(""),console.log(` MagicPath CLI v${K}`),console.log(""),o&&s?(console.log(` Authenticated: yes (${t})`),console.log(` User: ${s.name} <${s.email}>`)):o?(console.log(` Authenticated: yes (${t})`),console.log(" User: (could not fetch)")):(console.log(" Authenticated: no"),console.log(" Run `magicpath-ai login` to authenticate.")),i&&i.length>0){console.log(""),console.log(` Teams: ${i.length}`);for(let l of i)console.log(` - ${l.name} (${l.role.toLowerCase()})`)}if(console.log(""),c&&c.length>0){console.log(` Projects: ${c.length}`);for(let l of c){let d=l.ownerType==="personal"?"":` [${l.ownerName}]`;console.log(` - ${l.name} (${l.componentCount} components)${d}`)}}else o&&console.log(" Projects: none");console.log("")}catch(t){n&&E(t),console.error(`Error: ${t instanceof Error?t.message:String(t)}`),process.exit(1)}})}import Jn from"axios";function Kn(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=x(),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=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=o?null:k("Searching components...").start();try{let l=new URLSearchParams({q:n,limit:String(Math.min(Math.max(r,1),50))});if(t.personal)l.set("personal","true");else if(t.team){let u=await _(t.team,c);l.set("organizationId",u.id)}let d=await Jn.get(`${Kt()}?${l.toString()}`,{headers:c}),m=d.data.data??d.data,g=(Array.isArray(m==null?void 0:m.components)?m.components:[]).map(u=>{var h,y,P,F;return{name:u.name,generatedName:u.generatedName,id:String(u.id),projectName:((h=u.project)==null?void 0:h.name)??"",projectId:String(((y=u.project)==null?void 0:y.id)??""),previewImageUrl:u.previewImageUrl??null,ownerType:((P=u.project)==null?void 0:P.ownerType)==="team"?"team":"personal",ownerName:((F=u.project)==null?void 0:F.ownerName)??""}});if(a==null||a.succeed(`Found ${g.length} match(es) for "${n}"`),o&&b(g),g.length===0){console.log(`
|
|
116
|
+
No components matching "${n}".`);return}console.log("");let $=Math.max(4,...g.map(u=>u.name.length)),I=Math.max(13,...g.map(u=>u.generatedName.length)),v=Math.max(7,...g.map(u=>u.projectName.length)),w=Math.max(9,...g.map(u=>u.ownerType==="personal"?8:u.ownerName.length));console.log(` ${"Name".padEnd($)} ${"Generated Name".padEnd(I)} ${"Project".padEnd(v)} ${"Workspace".padEnd(w)}`),console.log(` ${"\u2500".repeat($)} ${"\u2500".repeat(I)} ${"\u2500".repeat(v)} ${"\u2500".repeat(w)}`);for(let u of g){let h=u.ownerType==="personal"?"Personal":u.ownerName;console.log(` ${u.name.padEnd($)} ${u.generatedName.padEnd(I)} ${u.projectName.padEnd(v)} ${h.padEnd(w)}`)}}catch(l){throw a==null||a.fail("Search failed"),l instanceof p?l:Jn.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(`
|
|
117
|
+
${c.message}`),process.exit(1)),c}})}import{z as L}from"zod";var Ra=L.object({generatedName:L.string().describe("The generated name of the component (e.g., wispy-river-5234)")}),Oa=L.object({component:L.string().describe("Component display name"),generatedName:L.string().describe("Component generated name"),files:L.array(L.object({path:L.string(),name:L.string(),content:L.string()})).describe("Component source files"),dependencies:L.array(L.string()).describe("Required packages"),importStatement:L.string().optional().describe("Import statement for the component"),usage:L.string().optional().describe("JSX usage example")});function Bn(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&&ae();let o=x();R.debug({generatedName:n,options:t});let r=o?null:k(`Fetching component "${n}"...`).start(),s;try{s=await $e(n),r==null||r.succeed(`Found component: ${s.name}`)}catch(m){throw r==null||r.fail("Failed to fetch component"),m instanceof B?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."}):m instanceof p?m:new p("Something went wrong!")}let i=Fe(s.name),c=s.files[0],a,l;if(c){let m=c.name.replace(/\.tsx?$/,""),f=`@/components/magicpath/${i}/${m}`,g=te(c.content);g?(a=me(g,f),l=de(g)):a=`import { ${m} } from '${f}';`}let d=s.files.map(m=>({path:m.path,name:m.name,content:m.content}));if(o){b({component:s.name,generatedName:s.generatedName,files:d,dependencies:s.dependencies,importStatement:a,usage:l});return}console.log(`
|
|
118
118
|
Component: ${s.name}`),console.log(` Files: ${s.files.map(m=>m.path).join(", ")}`),console.log(` Dependencies: ${s.dependencies.join(", ")||"none"}`),a&&console.log(` Import: ${a}`);for(let m of s.files)console.log(`
|
|
119
|
-
${"\u2500".repeat(60)}`),console.log(` ${m.path}`),console.log(`${"\u2500".repeat(60)}`),console.log(m.content)}catch(o){throw x()&&
|
|
120
|
-
${o.message}`),process.exit(1)),o}})}import
|
|
121
|
-
No MagicPath components found at ${
|
|
119
|
+
${"\u2500".repeat(60)}`),console.log(` ${m.path}`),console.log(`${"\u2500".repeat(60)}`),console.log(m.content)}catch(o){throw x()&&E(o),o instanceof p&&(console.error(`
|
|
120
|
+
${o.message}`),process.exit(1)),o}})}import ne from"path";import pe from"fs-extra";function hr(e,n){if(!pe.existsSync(e))return[];let t=pe.readdirSync(e,{withFileTypes:!0}),o=[];for(let r of t){if(!r.isDirectory())continue;let s=ne.join(e,r.name),i=pe.readdirSync(s).filter(d=>!pe.statSync(ne.join(s,d)).isDirectory()),c=i.find(d=>(d.endsWith(".tsx")||d.endsWith(".ts"))&&d!=="usage.md"&&!d.includes(".test.")&&!d.includes(".spec.")),a=null,l=null;if(c)try{let d=pe.readFileSync(ne.join(s,c),"utf8"),m=te(d);if(m){a=m.name;let f=c.replace(/\.tsx?$/,""),g=`@/components/magicpath/${r.name}/${f}`;m.isDefault?l=`import ${m.name} from '${g}';`:l=`import { ${m.name} } from '${g}';`}}catch{}o.push({name:a||r.name,folder:r.name,path:ne.relative(n,s),files:i.filter(d=>d!=="usage.md"),exportName:a,importStatement:l})}return o}function qn(e){e.command("list-installed").description("List MagicPath components installed in the current project").option("-p, --path <path>",`Custom components path (default: ${xe})`).action(async n=>{let t=x();try{let o=process.cwd(),r=Me(n.path,o);if(!pe.existsSync(r)){t&&b({components:[],total:0}),console.log(`
|
|
121
|
+
No MagicPath components found at ${ne.relative(o,r)||r}`);return}let s=hr(r,o);if(t&&b({components:s,total:s.length,componentsPath:ne.relative(o,r)}),s.length===0){console.log(`
|
|
122
122
|
No MagicPath components installed.`);return}console.log(`
|
|
123
|
-
${s.length} component(s) installed in ${
|
|
124
|
-
`);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&&
|
|
125
|
-
${o.message}`),process.exit(1)),o}})}import
|
|
126
|
-
No themes found.`);return}console.log("");let
|
|
127
|
-
${i.message}`),process.exit(1)),i}})}import
|
|
128
|
-
${h.charAt(0).toUpperCase()+h.slice(1)} Theme Variables:`);let P=Math.max(8,...Object.keys(y).map(
|
|
129
|
-
Fonts:`);for(let[h,y]of Object.entries(u.fonts)){let P=y.weights?Object.keys(y.weights).join(", "):"default";console.log(` ${h} (${y.source}, weights: ${P})`)}}}catch(
|
|
130
|
-
${m.message}`),process.exit(1)),m}})}import
|
|
131
|
-
No active canvas session found.`);return}let m=new Map;try{let u=await
|
|
132
|
-
Selected image(s):`);for(let u of
|
|
133
|
-
No active selection.`);if(f.length>0){console.log(" Active project(s):");for(let u of f){let h=u.ownerType==="team"&&u.ownerName?` [${u.ownerName}]`:"",y=u.name??`(unresolved project ${u.id})`;console.log(` ${y}${h}`)}}return}c==null||c.succeed(`Found ${I.length} selected component(s)`),n&&
|
|
134
|
-
Selected image(s):`);for(let u of
|
|
135
|
-
${i.message}`),process.exit(1)),i}})}import
|
|
136
|
-
No active canvas session found.`);return}let
|
|
137
|
-
${s.message}`),process.exit(1)),s}})}function
|
|
138
|
-
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&&
|
|
139
|
-
${t.message}`),process.exit(1)),t}})}import
|
|
140
|
-
No members found.`);return}console.log("");let
|
|
141
|
-
${i.message}`),process.exit(1)),i}})}import V from"axios";import
|
|
123
|
+
${s.length} component(s) installed in ${ne.relative(o,r)}:
|
|
124
|
+
`);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(`
|
|
125
|
+
${o.message}`),process.exit(1)),o}})}import Xn from"axios";function Zn(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=x();try{let i;try{i=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 c=t?null:k("Fetching themes...").start();try{let a=ke(),l=i;if(n.team){let w=await _(n.team,i);a=Pe(w.id),l={...i,"X-Organization-ID":w.id}}let d=await Xn.get(a,{headers:l}),m=((o=d.data.data)==null?void 0:o.design_systems)??d.data.design_systems??d.data,f=Array.isArray(m)?m:[];if(c==null||c.succeed(`Found ${f.length} theme(s)`),t&&b({themes:f.map(w=>({id:String(w.id),name:w.name,isPublic:w.isPublic,createdAt:w.createdAt,updatedAt:w.updatedAt}))}),f.length===0){console.log(`
|
|
126
|
+
No themes found.`);return}console.log("");let g=Math.max(4,...f.map(w=>(w.name||"").length)),$=Math.max(2,...f.map(w=>String(w.id).length)),I=6,v=10;console.log(` ${"Name".padEnd(g)} ${"ID".padEnd($)} ${"Public".padEnd(I)} Updated`),console.log(` ${"\u2500".repeat(g)} ${"\u2500".repeat($)} ${"\u2500".repeat(I)} ${"\u2500".repeat(v)}`);for(let w of f){let u=(w.name||"").padEnd(g),h=String(w.id).padEnd($),y=(w.isPublic?"yes":"no").padEnd(I),P=w.updatedAt?new Date(w.updatedAt).toISOString().slice(0,10):"";console.log(` ${u} ${h} ${y} ${P}`)}}catch(a){throw c==null||c.fail("Failed to fetch themes"),Xn.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(`
|
|
127
|
+
${i.message}`),process.exit(1)),i}})}import yt from"axios";function Yn(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,d;let o=x();try{let m;try{m=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 f=o?null:k("Fetching theme...").start();try{let g=n,$;if(!/^\d+$/.test(n)){let h=ke(),y=m;if(t.team){let N=await _(t.team,m);h=Pe(N.id),y={...m,"X-Organization-ID":N.id}}let P=await yt.get(h,{headers:y}),F=((r=P.data.data)==null?void 0:r.design_systems)??P.data.design_systems??P.data,W=Array.isArray(F)?F:[],S=n.toLowerCase(),C=W.find(N=>(N.name||"").toLowerCase()===S);if(!C)throw new p(`Theme "${n}" not found.`,{code:"NOT_FOUND",suggestion:"Run `magicpath-ai list-themes` to see available themes."});g=String(C.id),$=C.name}let I=await yt.get(Vt(g),{headers:m}),v=((s=I.data.data)==null?void 0:s.design_system)??I.data.design_system,w=v.name??$??g,u=v.data;f==null||f.succeed(`Theme: ${w}`),o&&b({id:String(v.id??g),name:w,theme:u.theme,defaultTheme:u.defaultTheme,prompt:u.prompt,fonts:u.fonts,version:u.version}),console.log(""),console.log(` Name: ${w}`),console.log(` ID: ${v.id??g}`),console.log(` Default Theme: ${u.defaultTheme??"light"}`),u.prompt&&console.log(` Prompt: ${u.prompt}`);for(let h of["light","dark"]){let y=(i=u.theme)==null?void 0:i[h];if(y&&Object.keys(y).length>0){console.log(`
|
|
128
|
+
${h.charAt(0).toUpperCase()+h.slice(1)} Theme Variables:`);let P=Math.max(8,...Object.keys(y).map(F=>F.length));console.log(` ${"Variable".padEnd(P)} Value`),console.log(` ${"\u2500".repeat(P)} ${"\u2500".repeat(30)}`);for(let[F,W]of Object.entries(y))console.log(` ${F.padEnd(P)} ${W}`)}}if(u.fonts&&Object.keys(u.fonts).length>0){console.log(`
|
|
129
|
+
Fonts:`);for(let[h,y]of Object.entries(u.fonts)){let P=y.weights?Object.keys(y.weights).join(", "):"default";console.log(` ${h} (${y.source}, weights: ${P})`)}}}catch(g){throw f==null||f.fail("Failed to fetch theme"),yt.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: ${(d=g.response)==null?void 0:d.status}`):(g instanceof p,g)}}catch(m){throw o&&E(m),m instanceof p&&(console.error(`
|
|
130
|
+
${m.message}`),process.exit(1)),m}})}import It from"axios";import{createClient as wr}from"@liveblocks/client";import yr from"ws";function We(e){let n=zt();return wr({polyfills:{fetch,WebSocket:yr},authEndpoint:async t=>await(await fetch(n,{method:"POST",headers:{...e,"Content-Type":"application/json"},body:JSON.stringify({room:t})})).json()})}async function He(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 Ge(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 Qn(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 ge(e){return e&&typeof e.toObject=="function"?e.toObject():e}function z(e){return typeof e=="string"&&e.trim().length>0?e:void 0}function Ir(e,n){let t=ge(n),o=ge(t==null?void 0:t.meta);return z(o==null?void 0:o.imageId)??(e.startsWith("asset:")?e.slice(6):void 0)}function br(e){return e.startsWith("shape:")?e.slice(6):e}async function Ve(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=ge(i);if(c.type!=="image"&&c.type!=="mp-image")continue;let a=ge(c.props)??{},l=z(a.assetId),d=l?o.get(l):null,m=ge(d),f=ge(m==null?void 0:m.props)??{},g=(l?Ir(l,d):void 0)??z(a.imageId)??z(a.serverId)??(s.startsWith("shape:")?s.slice(6):s);g&&r.push({imageId:g,shapeId:br(s),...z(f.name)||z(a.name)||z(a.altText)?{name:z(f.name)??z(a.name)??z(a.altText)}:{},...typeof a.w=="number"?{width:a.w}:{},...typeof a.h=="number"?{height:a.h}:{}})}return r}function eo(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=x();try{let i;try{i=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 c=n?null:k("Checking canvas selection...").start();try{let a=await It.get(re(),{headers:i}),l=((t=a.data.data)==null?void 0:t.socket_rooms)??a.data.socket_rooms,d=(l==null?void 0:l.projectRooms)??[];if(d.length===0){c==null||c.succeed("No active canvas session"),n&&b({projects:[],components:[],images:[]}),console.log(`
|
|
131
|
+
No active canvas session found.`);return}let m=new Map;try{let u=await Y(i);m=new Map(u.map(h=>[String(h.id),{name:h.name??"",ownerType:h.ownerType,ownerName:h.ownerName}]))}catch{}let f=d.map(u=>{let h=m.get(String(u.id));return h?{id:String(u.id),name:h.name,ownerType:h.ownerType,ownerName:h.ownerName}:{id:String(u.id),name:null,ownerType:null,ownerName:null}}),g=d.map(u=>{var h;return{projectId:u.id,projectName:((h=m.get(String(u.id)))==null?void 0:h.name)??"",roomId:u.room}}),$=We(i),I=[],v=[];for(let u of g){let h=null;try{let y=await He($,u.roomId);h=y.leave;let P=y.room,F=Ge(P);if(F.length===0)continue;let[W,S]=await Promise.all([Qn(P,F),Ve(P,F)]);v.push(...S.map(C=>({id:C.imageId,shapeId:C.shapeId,name:C.name??null,projectId:u.projectId,projectName:u.projectName,...C.width?{width:C.width}:{},...C.height?{height:C.height}:{}})));for(let C of W)try{let N=await It.get(Jt(C.serverId),{headers:i}),H=((o=N.data.data)==null?void 0:o.component)??N.data.component;I.push({id:C.serverId,name:(H==null?void 0:H.name)??C.name,generatedName:(H==null?void 0:H.generatedName)??null,clientId:C.clientId,projectId:u.projectId,projectName:u.projectName,selectedRevisionId:C.selectedRevisionId})}catch{I.push({id:C.serverId,name:C.name,generatedName:null,clientId:C.clientId,projectId:u.projectId,projectName:u.projectName,selectedRevisionId:C.selectedRevisionId})}}catch{}finally{h&&h()}}if(I.length===0){if(c==null||c.succeed(v.length>0?`Found ${v.length} selected image(s)`:"No components selected"),n&&b({projects:f,components:[],images:v}),v.length>0){console.log(`
|
|
132
|
+
Selected image(s):`);for(let u of v)console.log(` ${u.name??"Image"} (${u.id})`)}else console.log(`
|
|
133
|
+
No active selection.`);if(f.length>0){console.log(" Active project(s):");for(let u of f){let h=u.ownerType==="team"&&u.ownerName?` [${u.ownerName}]`:"",y=u.name??`(unresolved project ${u.id})`;console.log(` ${y}${h}`)}}return}c==null||c.succeed(`Found ${I.length} selected component(s)`),n&&b({projects:f,components:I,images:v});let w=new Map;for(let u of I){let h=u.projectId;w.has(h)||w.set(h,[]),w.get(h).push(u)}console.log("");for(let[,u]of w){console.log(` Selected in "${u[0].projectName}":`);for(let h of u){let y=h.generatedName?` (${h.generatedName})`:"";console.log(` ${h.name}${y}`)}}if(v.length>0){console.log(`
|
|
134
|
+
Selected image(s):`);for(let u of v)console.log(` ${u.name??"Image"} (${u.id})`)}}catch(a){throw c==null||c.fail("Failed to check selection"),It.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(`
|
|
135
|
+
${i.message}`),process.exit(1)),i}})}import to from"axios";function no(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;let n=x();try{let s;try{s=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 i=n?null:k("Checking active project...").start();try{let c=await to.get(re(),{headers:s}),a=((t=c.data.data)==null?void 0:t.socket_rooms)??c.data.socket_rooms,l=(a==null?void 0:a.projectRooms)??[];if(l.length===0){i==null||i.succeed("No active canvas session"),n&&b({projects:[]}),console.log(`
|
|
136
|
+
No active canvas session found.`);return}let d=await Y(s),m=new Map;for(let g of d)m.set(String(g.id),g);let f=[];for(let g of l){let $=String(g.id),I=m.get($);I?f.push({id:$,name:I.name??null,ownerType:I.ownerType,ownerName:I.ownerName}):f.push({id:$,name:null,ownerType:null,ownerName:null})}i==null||i.succeed(`Found ${f.length} active project${f.length===1?"":"s"}`),n&&b({projects:f}),console.log("");for(let g of f){let $=g.ownerType==="team"&&g.ownerName?` [${g.ownerName}]`:"",I=g.name??`(unresolved project ${g.id})`;console.log(` ${I}${$}`)}}catch(c){throw i==null||i.fail("Failed to check active project"),to.isAxiosError(c)?((o=c.response)==null?void 0:o.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: ${(r=c.response)==null?void 0:r.status}`):c}}catch(s){throw n&&E(s),s instanceof p&&(console.error(`
|
|
137
|
+
${s.message}`),process.exit(1)),s}})}function oo(e){e.command("list-teams").description("List teams you belong to").action(async()=>{let n=x();try{let t;try{t=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 o=n?null:k("Fetching teams...").start();try{let r=await Ie(t);if(o==null||o.succeed(`Found ${r.length} team(s)`),n&&b({teams:r}),r.length===0){console.log(`
|
|
138
|
+
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(`
|
|
139
|
+
${t.message}`),process.exit(1)),t}})}import ro from"axios";function so(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=x();try{let i;try{i=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 c=t?null:k("Fetching members...").start();try{let a=await _(n.team,i),l=await ro.get(Bt(a.id),{headers:{...i,"X-Organization-ID":a.id}}),f=((((o=l.data.data)==null?void 0:o.organization)??l.data.organization??l.data).users??[]).map(w=>{var u,h,y;return{id:String(((u=w.user)==null?void 0:u.id)??w.userId),displayName:((h=w.user)==null?void 0:h.displayName)??null,email:((y=w.user)==null?void 0:y.email)??null,role:w.role}});if(c==null||c.succeed(`${a.name}: ${f.length} member(s)`),t&&b({team:{id:a.id,name:a.name},members:f}),f.length===0){console.log(`
|
|
140
|
+
No members found.`);return}console.log("");let g=Math.max(4,...f.map(w=>(w.displayName||"").length)),$=Math.max(5,...f.map(w=>(w.email||"").length)),I=Math.max(2,...f.map(w=>w.id.length)),v=Math.max(4,...f.map(w=>w.role.length));console.log(` ${"Name".padEnd(g)} ${"Email".padEnd($)} ${"ID".padEnd(I)} Role`),console.log(` ${"\u2500".repeat(g)} ${"\u2500".repeat($)} ${"\u2500".repeat(I)} ${"\u2500".repeat(v)}`);for(let w of f)console.log(` ${(w.displayName||"").padEnd(g)} ${(w.email||"").padEnd($)} ${w.id.padEnd(I)} ${w.role}`)}catch(a){throw c==null||c.fail("Failed to fetch members"),a instanceof p?a:ro.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(`
|
|
141
|
+
${i.message}`),process.exit(1)),i}})}import V from"axios";import go from"crypto";import O from"fs-extra";import U from"path";var uo="magicpath-code.json",$r=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.",xr=/@tailwind\s+(base|components|utilities)\s*;/i,vr=/@import\s+(?:url\(\s*)?['"]tailwindcss['"]\s*\)?\s*;/i;function ue(e){return go.createHash("sha256").update(e).digest("hex")}function Sr(e){return go.createHash("sha256").update(e).digest("hex")}function vt(e){return $r.has(e)||e.startsWith("src/components/generated/")&&!e.endsWith("/")||e.startsWith("assets/")&&!e.endsWith("/")}function St(e){return e.startsWith("assets/")&&!e.endsWith("/")}function Cr(e){let n=U.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 ze(e){return U.join(e,uo)}function jr(e){let n=ze(e);if(!O.existsSync(n))throw new p(`No ${uo} found. Run \`magicpath-ai code context <componentId>\` or \`magicpath-ai code start --project <projectId>\` first.`);return O.readJsonSync(n)}function ve(e,n){O.ensureDirSync(e),O.writeJsonSync(ze(e),n,{spaces:2})}function bt(e,n){if(!vt(n.path))throw new p(`Refusing to write disallowed path from API: ${n.path}`);let t=U.join(e,n.path);O.ensureDirSync(U.dirname(t)),n.encoding==="base64"?O.writeFileSync(t,Buffer.from(n.content.replace(/\s/g,""),"base64")):O.writeFileSync(t,n.content,"utf8")}function Ce(e){let n=[],t=["src/App.tsx","src/index.css"],o=U.join(e,"src/components/generated");if(O.existsSync(o))for(let s of xt(o))t.push(U.relative(e,s).split(U.sep).join("/"));let r=U.join(e,"assets");if(O.existsSync(r))for(let s of xt(r))t.push(U.relative(e,s).split(U.sep).join("/"));for(let s of Array.from(new Set(t)).sort()){if(!vt(s))continue;let i=U.join(e,s);if(!(!O.existsSync(i)||!O.statSync(i).isFile()))if(St(s)){let c=O.readFileSync(i);n.push({path:s,content:c.toString("base64"),encoding:"base64",mimeType:Cr(s),sha256:Sr(c)})}else{let c=O.readFileSync(i,"utf8");n.push({path:s,content:c,encoding:"utf8",sha256:ue(c)})}}return n}function ao(e){let n=U.join(e,"src/index.css");if(!O.existsSync(n))throw new p(io);let t=O.readFileSync(n,"utf8");if(xr.test(t)||!vr.test(t))throw new p(io)}function xt(e){let n=[];for(let t of O.readdirSync(e,{withFileTypes:!0})){let o=U.join(e,t.name);t.isDirectory()?n.push(...xt(o)):t.isFile()&&n.push(o)}return n}function Er(e,n){if(n.mode==="create")return Ce(e);let t=new Map(n.editableFiles.map(o=>[o.path,o.sha256]));return Ce(e).map(o=>({...o,baseSha256:t.get(o.path)})).filter(o=>o.sha256!==o.baseSha256)}function kr(e,n){if(n.mode==="create")return[];let t=new Set(Ce(e).map(o=>o.path));return n.editableFiles.map(o=>o.path).filter(o=>!St(o)).filter(o=>!t.has(o))}async function co(e,n){let t=j();for(;;){let r=(await V.get(et(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 Se(e){let n=D(e);throw x()&&E(n),n}function lo(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 $t(e){let n=lo(e.width,"--width"),t=lo(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 Pr(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 mo(e){var t;let n;try{n=j()}catch{return[]}try{let o=await V.get(re(),{headers:n}),r=((t=o.data.data)==null?void 0:t.socket_rooms)??o.data.socket_rooms,s=(r==null?void 0:r.projectRooms)??[],i=e?s.filter(l=>String(l.id)===String(e)):s;if(i.length===0)return[];let c=We(n),a=[];for(let l of i){let d=null;try{let m=await He(c,l.room);d=m.leave;let f=Ge(m.room);if(f.length===0)continue;let g=await Ve(m.room,f);a.push(...g.filter($=>/^\d+$/.test($.imageId)).map($=>({imageId:$.imageId,...$.shapeId?{shapeId:$.shapeId}:{}})))}catch{}finally{d&&d()}}return Pr(a)}catch{return[]}}async function po(e,n){if(!(n!=null&&n.length))return[];let t=[];for(let o of n){if(!vt(o.assetPath)||!St(o.assetPath))throw new p(`Refusing to download selected image outside assets/: ${o.assetPath}`);let r=await V.get(o.accessUrl,{responseType:"arraybuffer"}),s=U.join(e,o.assetPath);O.ensureDirSync(U.dirname(s)),O.writeFileSync(s,Buffer.from(r.data)),t.push({...o,downloadedPath:s})}return t}function fo(e){let n=e.command("code").description("Create and edit canvas components from local code").addHelpText("after",`
|
|
142
142
|
Tailwind v4:
|
|
143
143
|
src/index.css must keep @import 'tailwindcss';.
|
|
144
144
|
Do not use @tailwind base/components/utilities; and do not replace the
|
|
145
145
|
template @theme inline, :root, or .dark token blocks. Append custom CSS below
|
|
146
146
|
the existing setup.
|
|
147
|
-
`);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=gt(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 d=await Ko(),I=(await V.post(At(t.component),{...t.revision?{revisionId:t.revision}:{},...d.length>0?{selectedImages:d}:{}},{headers:E()})).data.data;O.ensureDirSync(o);for(let h of I.editableFiles)pt(o,h);let $=await Xo(o,I.selectedImages),w={mode:"edit",componentId:I.component.id,projectId:I.component.projectId,selectedRevisionId:I.component.selectedRevisionId,baseRevisionId:I.component.baseRevisionId,jobId:I.jobId,generatedName:I.component.generatedName,name:I.component.name,selectedImages:$,editableFiles:I.editableFiles.map(h=>({path:h.path,sha256:pe(h.content)}))};Ie(o,w);let u={dir:o,manifestPath:We(o),...w,status:"pending",scaffoldedPaths:I.editableFiles.map(h=>h.path),selectedImages:$};x()&&v(u),console.log(`Started pending edit ${w.selectedRevisionId} for component ${w.componentId} in ${o}`);return}let s=t.project;if(!s)throw new p("Create sessions require --project.");let i=await Ko(s),a=(await V.post(Je(),{projectId:s,...t.name?{name:t.name}:{},...r?{dimensions:r}:{},...i.length>0?{selectedImages:i}:{}},{headers:E()})).data.data,l=a.editableFiles??[];O.ensureDirSync(o);for(let d of l)pt(o,d);let g=await Xo(o,a.selectedImages),m={mode:"create",componentId:a.componentId,projectId:s,selectedRevisionId:a.revisionId,jobId:a.jobId,generatedName:a.generatedName,name:t.name,dimensions:r,selectedImages:g,editableFiles:l.map(d=>({path:d.path,sha256:pe(d.content)}))};Ie(o,m);let f={dir:o,manifestPath:We(o),...m,status:"pending",scaffoldedPaths:l.map(d=>d.path),selectedImages:g};x()&&v(f),console.log(`Started pending component ${m.componentId} in ${o}`+(l.length>0?` (scaffolded ${l.length} file${l.length===1?"":"s"})`:""))}catch(o){be(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?`${Be(t)}?revisionId=${encodeURIComponent(o.revision)}`:Be(t),c=(await V.get(s,{headers:E()})).data.data;for(let l of c.editableFiles)pt(r,l);let a={dir:r,readOnly:!0,component:c.component,editableFiles:c.editableFiles.map(l=>({path:l.path,sha256:pe(l.content)}))};x()&&v(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){be(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=ir(o),s=gt(t);zo(o);let i=ar(o,r),c=cr(o,r);if(r.mode==="create"&&!i.some(m=>m.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 m={status:"unchanged",componentId:r.componentId,revisionId:r.selectedRevisionId};x()&&v(m),console.log("No editable file changes to submit.");return}let l=r.mode==="create"||!!r.baseRevisionId&&r.selectedRevisionId!==r.baseRevisionId?await V.post(Ke(r.componentId,r.selectedRevisionId),{files:i.map(m=>({path:m.path,content:m.content,encoding:m.encoding,mimeType:m.mimeType})),contextJobId:r.jobId,...s?{dimensions:s}:{},...r.mode==="edit"?{deletedPaths:c}:{}},{headers:E()}):await V.post(Pt(r.componentId),{baseRevisionId:r.baseRevisionId??r.selectedRevisionId,files:i.map(m=>({path:m.path,content:m.content,encoding:m.encoding,mimeType:m.mimeType,baseSha256:m.baseSha256})),deletedPaths:c,...s?{dimensions:s}:{}},{headers:E()}),g=l.data.data;if(t.wait&&(g=await Jo(l.data.data.jobId,Number(t.interval))),g.status==="completed"){let m=ve(o),f={...r,mode:"edit",jobId:l.data.data.jobId,selectedRevisionId:g.revisionId,baseRevisionId:g.revisionId,...s?{dimensions:s}:{},editableFiles:m.map(d=>({path:d.path,sha256:d.sha256??pe(d.content)}))};Ie(o,f)}x()&&v({...g,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}: ${g.status}`)}catch(o){be(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=gt(t);zo(o);let s=ve(o);if(!s.some(g=>g.path==="src/App.tsx"))throw new p("Create requires src/App.tsx in the working directory.");let i=await V.post(Je(),{projectId:t.project,...t.name?{name:t.name}:{},...r?{dimensions:r}:{}},{headers:E()}),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:[]};Ie(o,c);let a=await V.post(Ke(c.componentId,c.selectedRevisionId),{files:s.map(g=>({path:g.path,content:g.content,encoding:g.encoding,mimeType:g.mimeType})),contextJobId:c.jobId,...r?{dimensions:r}:{}},{headers:E()}),l=a.data.data;t.wait&&(l=await Jo(a.data.data.jobId,2e3)),l.status==="completed"&&Ie(o,{...c,mode:"edit",jobId:a.data.data.jobId,selectedRevisionId:l.revisionId,...r?{dimensions:r}:{},editableFiles:s.map(g=>({path:g.path,sha256:g.sha256??pe(g.content)}))}),x()&&v({...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){be(o)}}),n.command("status").description("Fetch external-agent build job status").argument("<jobId>","External agent job ID").action(async t=>{try{let o=await V.get(Xe(t),{headers:E()});x()&&v(o.data.data),console.log(`${t}: ${o.data.data.status}`)}catch(o){be(o)}})}import xe from"axios";import Qo from"fs";import wt from"path";import{imageSize as mr}from"image-size";var en=512;async function dr(e){if(/^https?:\/\//i.test(e)){let t=await xe.get(e,{responseType:"arraybuffer"}),o=wt.basename(new URL(e).pathname)||"image";return{buffer:Buffer.from(t.data),fileName:o}}let n=wt.resolve(e);if(!Qo.existsSync(n))throw new Error(`Image file not found: ${n}`);return{buffer:Qo.readFileSync(n),fileName:wt.basename(n)}}function He(e){if(e===void 0)return;let n=Number(e);if(!Number.isFinite(n))throw new Error(`Invalid number: ${e}`);return n}function tn(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=x(),i=s?null:T("Adding image to project...").start();try{let l=E(),{buffer:g,fileName:m}=await dr(o),f=He(r.width),d=He(r.height);if(f===void 0||d===void 0)try{let P=mr(g);f=f??P.width,d=d??P.height}catch{}f=f??en,d=d??en;let b={x:He(r.x)??0,y:He(r.y)??0,z:0,width:f,height:d},I=r.name??(m.replace(/\.[^/.]+$/,"")||m),$=await xe.get(Tt(),{headers:l,params:{filename:m,content_type:"image/*",make_public:"true"}}),{upload_url:w,upload_token:u}=$.data;await xe.put(w,g,{headers:{"Content-Type":"image/*","x-goog-acl":"public-read"}});let y=(a=(c=(await xe.post(Ze(t),{name:I,position:b,upload_token:u},{headers:l})).data)==null?void 0:c.data)==null?void 0:a.image;i==null||i.succeed("Image added to project"),s&&v({image:y}),console.log(`Added "${(y==null?void 0:y.name)??I}" (${(y==null?void 0:y.id)??"unknown id"})`),y!=null&&y.url&&console.log(y.url)}catch(l){i==null||i.fail("Failed to add image"),s&&A(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=x(),r=o?null:T("Fetching images...").start();try{let c=E(),l=((i=(s=(await xe.get(Ze(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&&v({images:l}),l.length===0){console.log("No images in this project.");return}for(let g of l)console.log(`- ${g.name} (${g.id})${g.url?` \u2014 ${g.url}`:""}`)}catch(c){r==null||r.fail("Failed to list images"),o&&A(c),console.error(c instanceof Error?c.message:String(c)),process.exit(1)}})}import yt from"axios";function on(e){var n;return((n=e==null?void 0:e.data)==null?void 0:n.project)??(e==null?void 0:e.project)??e}function nn(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=x();try{let c;try{c=E()}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:T("Creating project...").start();try{let l={...c},g=null;n.team&&(g=await G(n.team,c),l["X-Organization-ID"]=g.id);let m=await yt.post(St(),{},{headers:l}),f=on(m.data);if(n.name){let b=await yt.patch(Nt(String(f.id)),{data:{name:n.name}},{headers:l});f=on(b.data)}let d=g?{...f,ownerType:"team",ownerName:g.name}:{...f,ownerType:"personal",ownerName:((o=f.owner)==null?void 0:o.email)??""};a==null||a.succeed(`Created project "${d.name}"${g?` in ${g.name}`:""}`),t&&v({project:d}),console.log(""),console.log(` ID: ${d.id}`),console.log(` Name: ${d.name}`),console.log(` Workspace: ${g?g.name+" (team)":"personal"}`)}catch(l){throw a==null||a.fail("Failed to create project"),l instanceof p?l:yt.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&&A(c),c instanceof p&&(console.error(`
|
|
148
|
-
${c.message}`),process.exit(1)),c}})}var
|
|
147
|
+
`);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=U.resolve(t.dir),r=$t(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 mo(),I=(await V.post(Mt(t.component),{...t.revision?{revisionId:t.revision}:{},...g.length>0?{selectedImages:g}:{}},{headers:j()})).data.data;O.ensureDirSync(o);for(let h of I.editableFiles)bt(o,h);let v=await po(o,I.selectedImages),w={mode:"edit",componentId:I.component.id,projectId:I.component.projectId,selectedRevisionId:I.component.selectedRevisionId,baseRevisionId:I.component.baseRevisionId,jobId:I.jobId,generatedName:I.component.generatedName,name:I.component.name,selectedImages:v,editableFiles:I.editableFiles.map(h=>({path:h.path,sha256:ue(h.content)}))};ve(o,w);let u={dir:o,manifestPath:ze(o),...w,status:"pending",scaffoldedPaths:I.editableFiles.map(h=>h.path),selectedImages:v};x()&&b(u),console.log(`Started pending edit ${w.selectedRevisionId} for component ${w.componentId} in ${o}`);return}let s=t.project;if(!s)throw new p("Create sessions require --project.");let i=await mo(s),a=(await V.post(Ze(),{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)bt(o,g);let d=await po(o,a.selectedImages),m={mode:"create",componentId:a.componentId,projectId:s,selectedRevisionId:a.revisionId,jobId:a.jobId,generatedName:a.generatedName,name:t.name,dimensions:r,selectedImages:d,editableFiles:l.map(g=>({path:g.path,sha256:ue(g.content)}))};ve(o,m);let f={dir:o,manifestPath:ze(o),...m,status:"pending",scaffoldedPaths:l.map(g=>g.path),selectedImages:d};x()&&b(f),console.log(`Started pending component ${m.componentId} in ${o}`+(l.length>0?` (scaffolded ${l.length} file${l.length===1?"":"s"})`:""))}catch(o){Se(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=U.resolve(o.dir);O.ensureDirSync(r);let s=o.revision?`${Ye(t)}?revisionId=${encodeURIComponent(o.revision)}`:Ye(t),c=(await V.get(s,{headers:j()})).data.data;for(let l of c.editableFiles)bt(r,l);let a={dir:r,readOnly:!0,component:c.component,editableFiles:c.editableFiles.map(l=>({path:l.path,sha256:ue(l.content)}))};x()&&b(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){Se(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=U.resolve(t.dir),r=jr(o),s=$t(t);ao(o);let i=Er(o,r),c=kr(o,r);if(r.mode==="create"&&!i.some(m=>m.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 m={status:"unchanged",componentId:r.componentId,revisionId:r.selectedRevisionId};x()&&b(m),console.log("No editable file changes to submit.");return}let l=r.mode==="create"||!!r.baseRevisionId&&r.selectedRevisionId!==r.baseRevisionId?await V.post(Qe(r.componentId,r.selectedRevisionId),{files:i.map(m=>({path:m.path,content:m.content,encoding:m.encoding,mimeType:m.mimeType})),contextJobId:r.jobId,...s?{dimensions:s}:{},...r.mode==="edit"?{deletedPaths:c}:{}},{headers:j()}):await V.post(Dt(r.componentId),{baseRevisionId:r.baseRevisionId??r.selectedRevisionId,files:i.map(m=>({path:m.path,content:m.content,encoding:m.encoding,mimeType:m.mimeType,baseSha256:m.baseSha256})),deletedPaths:c,...s?{dimensions:s}:{}},{headers:j()}),d=l.data.data;if(t.wait&&(d=await co(l.data.data.jobId,Number(t.interval))),d.status==="completed"){let m=Ce(o),f={...r,mode:"edit",jobId:l.data.data.jobId,selectedRevisionId:d.revisionId,baseRevisionId:d.revisionId,...s?{dimensions:s}:{},editableFiles:m.map(g=>({path:g.path,sha256:g.sha256??ue(g.content)}))};ve(o,f)}x()&&b({...d,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}: ${d.status}`)}catch(o){Se(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=U.resolve(t.dir),r=$t(t);ao(o);let s=Ce(o);if(!s.some(d=>d.path==="src/App.tsx"))throw new p("Create requires src/App.tsx in the working directory.");let i=await V.post(Ze(),{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:[]};ve(o,c);let a=await V.post(Qe(c.componentId,c.selectedRevisionId),{files:s.map(d=>({path:d.path,content:d.content,encoding:d.encoding,mimeType:d.mimeType})),contextJobId:c.jobId,...r?{dimensions:r}:{}},{headers:j()}),l=a.data.data;t.wait&&(l=await co(a.data.data.jobId,2e3)),l.status==="completed"&&ve(o,{...c,mode:"edit",jobId:a.data.data.jobId,selectedRevisionId:l.revisionId,...r?{dimensions:r}:{},editableFiles:s.map(d=>({path:d.path,sha256:d.sha256??ue(d.content)}))}),x()&&b({...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){Se(o)}}),n.command("status").description("Fetch external-agent build job status").argument("<jobId>","External agent job ID").action(async t=>{try{let o=await V.get(et(t),{headers:j()});x()&&b(o.data.data),console.log(`${t}: ${o.data.data.status}`)}catch(o){Se(o)}})}import je from"axios";import ho from"fs";import Ct from"path";import{imageSize as Ar}from"image-size";var wo=512;async function Tr(e){if(/^https?:\/\//i.test(e)){let t=await je.get(e,{responseType:"arraybuffer"}),o=Ct.basename(new URL(e).pathname)||"image";return{buffer:Buffer.from(t.data),fileName:o}}let n=Ct.resolve(e);if(!ho.existsSync(n))throw new Error(`Image file not found: ${n}`);return{buffer:ho.readFileSync(n),fileName:Ct.basename(n)}}function Je(e){if(e===void 0)return;let n=Number(e);if(!Number.isFinite(n))throw new Error(`Invalid number: ${e}`);return n}function yo(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=x(),i=s?null:k("Adding image to project...").start();try{let l=j(),{buffer:d,fileName:m}=await Tr(o),f=Je(r.width),g=Je(r.height);if(f===void 0||g===void 0)try{let P=Ar(d);f=f??P.width,g=g??P.height}catch{}f=f??wo,g=g??wo;let $={x:Je(r.x)??0,y:Je(r.y)??0,z:0,width:f,height:g},I=r.name??(m.replace(/\.[^/.]+$/,"")||m),v=await je.get(Lt(),{headers:l,params:{filename:m,content_type:"image/*",make_public:"true"}}),{upload_url:w,upload_token:u}=v.data;await je.put(w,d,{headers:{"Content-Type":"image/*","x-goog-acl":"public-read"}});let y=(a=(c=(await je.post(ot(t),{name:I,position:$,upload_token:u},{headers:l})).data)==null?void 0:c.data)==null?void 0:a.image;i==null||i.succeed("Image added to project"),s&&b({image:y}),console.log(`Added "${(y==null?void 0:y.name)??I}" (${(y==null?void 0:y.id)??"unknown id"})`),y!=null&&y.url&&console.log(y.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=x(),r=o?null:k("Fetching images...").start();try{let c=j(),l=((i=(s=(await je.get(ot(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&&b({images:l}),l.length===0){console.log("No images in this project.");return}for(let d of l)console.log(`- ${d.name} (${d.id})${d.url?` \u2014 ${d.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 jt from"axios";function Io(e){var n;return((n=e==null?void 0:e.data)==null?void 0:n.project)??(e==null?void 0:e.project)??e}function bo(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=x();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:k("Creating project...").start();try{let l={...c},d=null;n.team&&(d=await _(n.team,c),l["X-Organization-ID"]=d.id);let m=await jt.post(Wt(),{},{headers:l}),f=Io(m.data);if(n.name){let $=await jt.patch(Ht(String(f.id)),{data:{name:n.name}},{headers:l});f=Io($.data)}let g=d?{...f,ownerType:"team",ownerName:d.name}:{...f,ownerType:"personal",ownerName:((o=f.owner)==null?void 0:o.email)??""};a==null||a.succeed(`Created project "${g.name}"${d?` in ${d.name}`:""}`),t&&b({project:g}),console.log(""),console.log(` ID: ${g.id}`),console.log(` Name: ${g.name}`),console.log(` Workspace: ${d?d.name+" (team)":"personal"}`)}catch(l){throw a==null||a.fail("Failed to create project"),l instanceof p?l:jt.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(`
|
|
148
|
+
${c.message}`),process.exit(1)),c}})}import $o from"fs-extra";import xo from"path";import oe from"axios";import Nr from"prompts";function Rr(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 Ke(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 Or(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 Ur(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 J(e){return String(e.id)}function kt(e){return e.isPublic?"Public":e.organizationId?"Team":"Personal"}function Fr(){try{return 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."})}}async function fe(e){let n=Fr();if(!e.team)return{headers:n,label:"personal",listUrl:nt(),createUrl:nt(),importUrl:_t()};let t=await _(e.team,n);return{headers:{...n,"X-Organization-ID":t.id},label:`${t.name} (team)`,listUrl:st(t.id),createUrl:st(t.id),importUrl:qt(t.id)}}async function vo(e){let n=await oe.get(e.listUrl,{headers:e.headers});return Rr(n.data)}function Mr(e){return e.trim().toLowerCase()}function Dr(e,n){let t=Mr(n);return J(e)===n||e.slug.toLowerCase()===t||e.name.toLowerCase()===t}async function Et(e,n,t){let r=(await vo(e)).filter(i=>Dr(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 So(e){if(e.instructions&&e.instructionsFile)throw new p("Use either --instructions or --instructions-file, not both.",{code:"INVALID_OPTIONS"});return e.instructionsFile?$o.readFileSync(xo.resolve(e.instructionsFile),"utf8"):e.instructions}function _r(e){let n=So(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 Lr(e){if(e.enable&&e.disable)throw new p("Use either --enable or --disable, not both.",{code:"INVALID_OPTIONS"});let n={},t=So(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 Wr(e){return e.toLowerCase().endsWith(".skill")?"application/octet-stream":"application/zip"}function Hr(e){if(e.length===0){console.log(`
|
|
149
|
+
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=>kt(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)} ${kt(s).padEnd(o)} ${(s.sourceFormat??"EDITOR").padEnd(r)} ${i.padEnd(7)} ${J(s)}`)}}function Gr(e){console.log(""),console.log(` Name: ${e.name}`),console.log(` ID: ${J(e)}`),console.log(` Slash: /${e.slug}`),console.log(` Source: ${kt(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 Vr(e){if(e.length===0){console.log(`
|
|
150
|
+
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 he(e,n){try{await n()}catch(t){let o=D(t);e&&E(o),console.error(`
|
|
151
|
+
${o.message}`),o.suggestion&&console.error(o.suggestion),process.exit(1)}}function Co(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=x();await he(o,async()=>{let r=await fe(t),s=o?null:k("Fetching skills...").start(),i=await vo(r),c=t.ownedOnly?i.filter(a=>!a.isPublic):i;s==null||s.succeed(`Found ${c.length} skill(s)`),o&&b({skills:c,workspace:r.label}),Hr(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=x();await he(r,async()=>{let s=await fe(o),i=r?null:k("Fetching skill...").start(),c=await Et(s,t),a,l;if(o.file){let d=await oe.get(Zt(J(c),o.file),{headers:s.headers});l=Ur(d.data)}else if(o.files){let d=await oe.get(Xt(J(c)),{headers:s.headers});a=Or(d.data)}if(i==null||i.succeed("Fetched skill"),r&&b({skill:c,...a?{files:a}:{},...l?{file:l}:{}}),l){console.log(l.content);return}Gr(c),a&&Vr(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=x();await he(o,async()=>{let r=_r(t),s=await fe(t),i=o?null:k("Creating skill...").start(),c=await oe.post(s.createUrl,r,{headers:s.headers}),a=Ke(c.data);i==null||i.succeed(`Created skill "${a.name}"`),o&&b({skill:a,workspace:s.label}),console.log(""),console.log(` Created: ${a.name}`),console.log(` ID: ${J(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=x();await he(r,async()=>{let s=await fe(o),i=xo.resolve(t),c=$o.readFileSync(i),a=r?null:k("Importing skill...").start(),l=await oe.post(s.importUrl,c,{headers:{...s.headers,"Content-Type":Wr(i)}}),d=Ke(l.data);a==null||a.succeed(`Imported skill "${d.name}"`),r&&b({skill:d,workspace:s.label}),console.log(""),console.log(` Imported: ${d.name}`),console.log(` ID: ${J(d)}`),console.log(` Slash: /${d.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=x();await he(r,async()=>{let s=Lr(o),i=await fe(o),c=r?null:k("Updating skill...").start(),a=await Et(i,t,{writable:!0}),l=await oe.patch(it(J(a)),s,{headers:i.headers}),d=Ke(l.data);c==null||c.succeed(`Updated skill "${d.name}"`),r&&b({skill:d,workspace:i.label}),console.log(""),console.log(` Updated: ${d.name}`),console.log(` ID: ${J(d)}`),console.log(` Slash: /${d.slug}`),console.log(` Enabled: ${d.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=x();await he(r,async()=>{let s=await fe(o),i=r?null:k("Finding skill...").start(),c=await Et(s,t,{writable:!0});if(i==null||i.stop(),!r&&!o.yes){let m=En();try{if(!(await Nr({type:"confirm",name:"confirmed",message:`Delete "${c.name}"?`,initial:!1})).confirmed){console.log("Cancelled.");return}}finally{m()}}let a=r?null:k("Deleting skill...").start(),l=await oe.delete(it(J(c)),{headers:s.headers}),d=Ke(l.data);a==null||a.succeed(`Deleted skill "${d.name}"`),r&&b({skill:d,workspace:s.label})})})}var qr=Jr(Br(import.meta.url)),Xr=JSON.parse(zr(Kr(qr,"..","package.json"),"utf8"));Ot(Xr.version);Tt();process.argv.length<=2&&(mn(K),process.exit(0));T.name("magicpath").description("").version(K).option("-o, --output <format>","Output format: json").hook("preAction",e=>{e.optsWithGlobals().output==="json"&&Rt(!0)});Cn(T);Dn(T);Mn(T);Ln(T);Wn(T);Hn(T);Gn(T);Vn(T);zn(T);Kn(T);qn(T);Bn(T);Zn(T);Yn(T);eo(T);no(T);oo(T);so(T);fo(T);yo(T);bo(T);Co(T);T.parse();
|