@easbot/skills 0.3.2 → 0.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/dist/index.cjs CHANGED
@@ -22,7 +22,7 @@ ${s.replace(/^\r?\n/u,"")}`}async function ms(t,e,s){await promises.mkdir(e,{rec
22
22
  - For SSH: ssh-add -l (to check loaded keys)
23
23
  - For HTTPS: gh auth status (if using GitHub CLI)`,t,true,false)}if(r&&l&&Nl(t)){try{if(await Pl(s),await cr(l,s,e))return s}catch{}try{return await Pl(s),await Il({GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes"}).clone(l.sshUrl,s,n),s}catch{}}try{await promises.rm(s,{recursive:!0,force:!0});}catch{}throw r?new Me(ur(t,l,i),t,false,true):new Me(`Failed to clone ${t}: ${i}`,t,false,false)}}async function tt(t){let e=path.normalize(path.resolve(t)),s=path.normalize(path.resolve(os$1.tmpdir()));if(!e.startsWith(s+path.sep)&&e!==s)throw new Error("Attempted to clean up directory outside of temp directory");await promises.rm(t,{recursive:true,force:true});}var dr="https://add-skill.vercel.sh/t",pr="https://add-skill.vercel.sh/audit",on=null,rn=null;function cn(t){rn=t;}function gr(){return !!(process.env.CI||process.env.GITHUB_ACTIONS||process.env.GITLAB_CI||process.env.CIRCLECI||process.env.TRAVIS||process.env.BUILDKITE||process.env.JENKINS_URL||process.env.TEAMCITY_VERSION)}function mr(){return !process.env.DISABLE_TELEMETRY&&!process.env.DO_NOT_TRACK}function $s(t){on=t;}async function un(t,e,s=3e3){if(e.length===0)return null;try{let n=new URLSearchParams({source:t,skills:e.join(",")}),l=new AbortController,o=setTimeout(()=>l.abort(),s),i=await fetch(`${pr}?${n.toString()}`,{signal:l.signal});return clearTimeout(o),i.ok?await i.json():null}catch{return null}}var an=[];function he(t){if(mr())try{let e=new URLSearchParams;on&&e.set("v",on),gr()&&e.set("ci","1"),rn&&e.set("agent",rn);for(let[n,l]of Object.entries(t))l!=null&&e.set(n,String(l));let s=fetch(`${dr}?${e.toString()}`).catch(()=>{}).then(()=>{});an.push(s);}catch{}}async function fr(t=5e3){if(an.length===0)return;let e=new Promise(s=>setTimeout(s,t));await Promise.race([Promise.all(an),e]);}var Lt=null,kr={cursor:"cursor","cursor-cli":"cursor",claude:"claude-code",cowork:"claude-code",devin:"universal",replit:"replit",gemini:"gemini-cli",codex:"codex",antigravity:"antigravity","augment-cli":"augment",opencode:"opencode","github-copilot":"github-copilot"};async function Xe(){return Lt||(Lt=await detectAgent.determineAgent(),Lt.isAgent&&cn(Lt.agent.name),Lt)}async function Xt(){return (await Xe()).isAgent}async function yr(){let t=await Xe();return t.isAgent?t.agent.name:null}function Yt(t){return kr[t]??null}var dn=class{constructor(){chunkEOOPF3RI_cjs.a(this,"providers",[]);}register(e){if(this.providers.some(s=>s.id===e.id))throw new Error(`Provider with id "${e.id}" already registered`);this.providers.push(e);}findProvider(e){for(let s of this.providers)if(s.match(e).matches)return s;return null}getProviders(){return [...this.providers]}},Zt=new dn;function El(t){Zt.register(t);}function Cl(t){return Zt.findProvider(t)}function Rl(){return Zt.getProviders()}var _l="https://schemas.agentskills.io/discovery/0.2.0/schema.json",$r=50*1024*1024,vr=1e3,Qt=class{constructor(){chunkEOOPF3RI_cjs.a(this,"id","well-known");chunkEOOPF3RI_cjs.a(this,"displayName","Well-Known Skills");chunkEOOPF3RI_cjs.a(this,"WELL_KNOWN_PATHS",[".well-known/agent-skills",".well-known/skills"]);chunkEOOPF3RI_cjs.a(this,"INDEX_FILE","index.json");}match(e){if(!e.startsWith("http://")&&!e.startsWith("https://"))return {matches:false};try{let s=new URL(e);return ["github.com","gitlab.com","huggingface.co"].includes(s.hostname)?{matches:!1}:{matches:!0,sourceIdentifier:`wellknown/${s.hostname}`}}catch{return {matches:false}}}async fetchIndex(e){return (await this.fetchIndexCandidates(e))[0]??null}async fetchIndexCandidates(e){try{let s=new URL(e),n=s.pathname.replace(/\/$/,""),l=[];for(let i of this.WELL_KNOWN_PATHS)l.push({indexUrl:`${s.protocol}//${s.host}${n}/${i}/${this.INDEX_FILE}`,baseUrl:`${s.protocol}//${s.host}${n}`,wellKnownPath:i}),n&&n!==""&&l.push({indexUrl:`${s.protocol}//${s.host}/${i}/${this.INDEX_FILE}`,baseUrl:`${s.protocol}//${s.host}`,wellKnownPath:i});let o=[];for(let{indexUrl:i,baseUrl:a,wellKnownPath:r}of l)try{let h=await fetch(i);if(!h.ok)continue;let u=await h.json(),m=this.normalizeIndex(u,i,r);if(!m)continue;o.push({index:m.index,entries:m.entries,resolvedBaseUrl:a,resolvedWellKnownPath:r,indexUrl:i});}catch{}return o}catch{return []}}normalizeIndex(e,s,n){if(!e||typeof e!="object")return null;let l=e;if(!Array.isArray(l.skills))return null;let o=l.$schema;if(o===_l){let r=[],h=[];for(let u of l.skills){if(!this.isValidSkillEntryV2(u))continue;let m=new URL(u.url,s).toString();r.push({version:"0.2.0",name:u.name,description:u.description,type:u.type,artifactUrl:m,digest:u.digest,indexEntry:u}),h.push(u);}return r.length===0?null:{index:{$schema:_l,skills:h},entries:r}}if(o!==void 0)return null;let i=[],a=[];for(let r of l.skills){if(!this.isValidSkillEntryV1(r))return null;i.push(r),a.push({version:"0.1.0",name:r.name,description:r.description,files:r.files,baseUrl:this.getLegacySkillBaseUrl(s,n),wellKnownPath:n,indexEntry:r});}return {index:{skills:i},entries:a}}getLegacySkillBaseUrl(e,s){let n=new URL(e),l=`/${s}/${this.INDEX_FILE}`;return `${n.protocol}//${n.host}${n.pathname.slice(0,-l.length)}`}isValidSkillName(e){return !(typeof e!="string"||e.length===0||e.length>64||!/^[a-z0-9-]+$/.test(e)||e.startsWith("-")||e.endsWith("-")||e.includes("--"))}isSafeLegacyFilePath(e){return !(typeof e!="string"||e.length===0||e.startsWith("/")||e.startsWith("\\")||e.includes("..")||e.includes("\0"))}isValidSkillEntryV1(e){if(!e||typeof e!="object")return false;let s=e;if(!this.isValidSkillName(s.name)||typeof s.description!="string"||!s.description||!Array.isArray(s.files)||s.files.length===0)return false;for(let l of s.files)if(!this.isSafeLegacyFilePath(l))return false;return s.files.some(l=>typeof l=="string"&&l.toLowerCase()==="skill.md")}isValidSkillEntryV2(e){if(!e||typeof e!="object")return false;let s=e;if(!this.isValidSkillName(s.name)||typeof s.description!="string"||!s.description||s.description.length>1024||s.type!=="skill-md"&&s.type!=="archive"||typeof s.url!="string"||!s.url||typeof s.digest!="string"||!/^sha256:[a-f0-9]{64}$/.test(s.digest))return false;try{new URL(s.url,"https://example.com/.well-known/agent-skills/index.json");}catch{return false}return true}async fetchSkill(e){try{let s=new URL(e),n=await this.fetchIndexCandidates(e);for(let l of n){let{entries:o}=l,i=null,a=s.pathname.match(/\/.well-known\/(?:agent-skills|skills)\/([^/]+)\/?$/);if(a?.[1]&&a[1]!=="index.json"?i=a[1]:o.length===1&&(i=o[0].name),!i)continue;let r=o.find(u=>u.name===i);if(!r)continue;let h=await this.fetchSkillByEntry(r);if(h)return h}return null}catch{return null}}async fetchSkillByEntry(e,s,n){return typeof e=="string"?s?this.fetchLegacySkillByEntry({version:"0.1.0",name:s.name,description:s.description,files:s.files,baseUrl:e,wellKnownPath:n??this.WELL_KNOWN_PATHS[0],indexEntry:s}):null:e.version==="0.1.0"?this.fetchLegacySkillByEntry(e):this.fetchArtifactSkillByEntry(e)}async fetchLegacySkillByEntry(e){try{let s=`${e.baseUrl.replace(/\/$/,"")}/${e.wellKnownPath}/${e.name}`,n=`${s}/SKILL.md`,l=await fetch(n);if(!l.ok)return null;let o=await l.text(),{data:i}=chunkEOOPF3RI_cjs.c(o);if(typeof i.name!="string"||typeof i.description!="string")return null;let a=new Map;a.set("SKILL.md",o);let h=e.files.filter(m=>m.toLowerCase()!=="skill.md").map(async m=>{try{let d=`${s}/${m}`,g=await fetch(d);if(g.ok){let c=await g.arrayBuffer();return {path:m,content:new Uint8Array(c)}}}catch{}return null}),u=await Promise.all(h);for(let m of u)m&&a.set(m.path,m.content);return this.createSkill({name:i.name,description:i.description,content:o,installName:e.name,sourceUrl:n,metadata:i.metadata,files:a,indexEntry:e.indexEntry})}catch{return null}}async fetchArtifactSkillByEntry(e){try{let s=await fetch(e.artifactUrl);if(!s.ok)return null;let n=s.headers.get("content-type")??"",l=new Uint8Array(await s.arrayBuffer());if(this.computeDigest(l)!==e.digest)return null;if(e.type==="skill-md"){let h=new TextDecoder().decode(l),{data:u}=chunkEOOPF3RI_cjs.c(h);if(typeof u.name!="string"||typeof u.description!="string")return null;let m=new Map;return m.set("SKILL.md",h),this.createSkill({name:u.name,description:u.description,content:h,installName:e.name,sourceUrl:e.artifactUrl,metadata:u.metadata,files:m,indexEntry:e.indexEntry})}let o=this.extractArchive(l,e.artifactUrl,n),i=o.get("SKILL.md");if(!i)return null;let a=typeof i=="string"?i:new TextDecoder().decode(i);o.set("SKILL.md",a);let{data:r}=chunkEOOPF3RI_cjs.c(a);return typeof r.name!="string"||typeof r.description!="string"?null:this.createSkill({name:r.name,description:r.description,content:a,installName:e.name,sourceUrl:e.artifactUrl,metadata:r.metadata,files:o,indexEntry:e.indexEntry})}catch{return null}}createSkill(e){return {name:chunkEOOPF3RI_cjs.e(e.name),description:chunkEOOPF3RI_cjs.e(e.description),content:e.content,installName:e.installName,sourceUrl:e.sourceUrl,metadata:e.metadata&&typeof e.metadata=="object"?e.metadata:void 0,files:e.files,indexEntry:e.indexEntry}}async fetchAllSkills(e){try{let s=await this.fetchIndexCandidates(e);for(let n of s){let l=n.entries.map(a=>this.fetchSkillByEntry(a)),i=(await Promise.all(l)).filter(a=>a!==null);if(i.length>0)return i}return []}catch{return []}}computeDigest(e){return `sha256:${crypto.createHash("sha256").update(e).digest("hex")}`}extractArchive(e,s,n){if(this.isZipArchive(e,s,n))return this.extractZip(e);if(this.isTarGzArchive(e,s,n))return this.extractTarGz(e);throw new Error("Unsupported archive format")}isZipArchive(e,s,n){return n.includes("application/zip")||s.toLowerCase().endsWith(".zip")||e[0]===80&&e[1]===75}isTarGzArchive(e,s,n){let l=s.toLowerCase();return n.includes("application/gzip")||n.includes("application/x-gzip")||l.endsWith(".tar.gz")||l.endsWith(".tgz")||e[0]===31&&e[1]===139}normalizeArchivePath(e){if(!e||e.includes("\0")||e.startsWith("/")||e.startsWith("\\")||/^[A-Za-z]:/.test(e)||e.includes("\\"))return null;let s=e.split("/").filter(Boolean);return s.length===0||s.some(n=>n==="."||n==="..")?null:s.join("/")}addArchiveFile(e,s,n,l){let o=this.normalizeArchivePath(s);if(!o)throw new Error(`Unsafe archive path: ${s}`);if(l.bytes+=n.byteLength,l.bytes>$r)throw new Error("Archive exceeds maximum unpacked size");if(e.size>=vr)throw new Error("Archive contains too many files");e.set(o,n);}extractTarGz(e){let s=zlib.gunzipSync(Buffer.from(e)),n=new Map,l={bytes:0},o=0;for(;o+512<=s.length;){let i=s.subarray(o,o+512);if(i.every(c=>c===0))break;let a=this.readTarString(i,0,100),r=this.readTarString(i,124,12).trim(),h=i[156],u=this.readTarString(i,345,155),m=u?`${u}/${a}`:a,d=Number.parseInt(r||"0",8);if(!Number.isFinite(d)||d<0)throw new Error("Invalid tar entry size");if(o+=512,h===50||h===49)throw new Error("Archive links are not supported");if(h===0||h===48){let c=s.subarray(o,o+d);this.addArchiveFile(n,m,new Uint8Array(c),l);}o+=Math.ceil(d/512)*512;}if(!n.has("SKILL.md"))throw new Error("Archive missing root SKILL.md");return n}readTarString(e,s,n){let l=e.subarray(s,s+n),o=l.indexOf(0);return new TextDecoder().decode(o>=0?l.subarray(0,o):l)}extractZip(e){let s=Buffer.from(e),n=this.findZipEndOfCentralDirectory(s);if(n<0)throw new Error("Invalid zip archive");let l=s.readUInt16LE(n+10),o=s.readUInt32LE(n+16),i=new Map,a={bytes:0},r=o;for(let h=0;h<l;h++){if(s.readUInt32LE(r)!==33639248)throw new Error("Invalid zip directory");let u=s.readUInt16LE(r+8),m=s.readUInt16LE(r+10),d=s.readUInt32LE(r+20),g=s.readUInt32LE(r+24),c=s.readUInt16LE(r+28),f=s.readUInt16LE(r+30),x=s.readUInt16LE(r+32),A=s.readUInt32LE(r+38),$=s.readUInt32LE(r+42),E=r+46,D=s.subarray(E,E+c),F=new TextDecoder(u&2048?"utf-8":void 0).decode(D);if(r=E+c+f+x,F.endsWith("/"))continue;if(u&1)throw new Error("Encrypted zip entries are not supported");let L=A>>>16&61440;if(L===40960||L===4096)throw new Error("Archive links are not supported");if(s.readUInt32LE($)!==67324752)throw new Error("Invalid zip local header");let w=s.readUInt16LE($+26),N=s.readUInt16LE($+28),U=$+30+w+N,M=s.subarray(U,U+d),B;if(m===0)B=M;else if(m===8)B=zlib.inflateRawSync(M);else throw new Error(`Unsupported zip compression method: ${m}`);if(B.byteLength!==g)throw new Error("Zip entry size mismatch");this.addArchiveFile(i,F,new Uint8Array(B),a);}if(!i.has("SKILL.md"))throw new Error("Archive missing root SKILL.md");return i}findZipEndOfCentralDirectory(e){let s=Math.max(0,e.length-65535-22);for(let n=e.length-22;n>=s;n--)if(e.readUInt32LE(n)===101010256)return n;return -1}toRawUrl(e){try{let s=new URL(e);if(e.toLowerCase().endsWith("/skill.md"))return e;let n=this.WELL_KNOWN_PATHS[0],l=s.pathname.match(/\/.well-known\/(?:agent-skills|skills)\/([^/]+)\/?$/);if(l?.[1]){let i=s.pathname.replace(/\/.well-known\/(?:agent-skills|skills)\/.*$/,"");return `${s.protocol}//${s.host}${i}/${n}/${l[1]}/SKILL.md`}let o=s.pathname.replace(/\/$/,"");return `${s.protocol}//${s.host}${o}/${n}/${this.INDEX_FILE}`}catch{return e}}getSourceIdentifier(e){try{return new URL(e).hostname.replace(/^www\./,"")}catch{return "unknown"}}async hasSkillsIndex(e){return await this.fetchIndex(e)!==null}},ut=new Qt;var Nr=".agents",gn=".skill-lock.json",Ul=3;function hn(){let t=kt(),e=Te(),s=process.env.XDG_STATE_HOME;return s?path.join(s,"skills",gn):t?path.join(t,"skills",gn):path.join(e||os$1.homedir(),Nr,gn)}async function Ae(){let t=hn();try{let e=await promises.readFile(t,"utf-8"),s=JSON.parse(e);return typeof s.version!="number"||!s.skills||s.version<Ul?mn():s}catch{return mn()}}async function es(t){let e=hn();await promises.mkdir(path.dirname(e),{recursive:true});let s=JSON.stringify(t,null,2);await promises.writeFile(e,s,"utf-8");}function Er(t){return crypto.createHash("sha256").update(t,"utf-8").digest("hex")}var fn=false;function Cr(){fn=false;}function st(){if(process.env.GITHUB_TOKEN)return process.env.GITHUB_TOKEN;if(process.env.GH_TOKEN)return process.env.GH_TOKEN;fn||(process.stderr.write(`${k__default.default.yellow("\u2502")} ${k__default.default.yellow("GitHub rate limit reached")} \u2014 using your ${k__default.default.cyan("gh")} login to continue.
24
24
  ${k__default.default.yellow("\u2502")} ${k__default.default.dim(`Tip: set ${k__default.default.cyan("GITHUB_TOKEN")} to avoid this prompt, or use ${k__default.default.cyan("--full-depth")} to clone instead.
25
- `)}`),fn=true);try{let t=child_process.execSync("gh auth token",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(t)return t}catch{}return null}async function Rr(t,e,s,n){let{fetchRepoTree:l,getSkillFolderHashFromTree:o}=await import('./chunks/blob-BHATBRFW.cjs'),i=await l(t,n,s??void 0);return i?o(i,e):null}async function vs(t,e){let s=await Ae(),n=new Date().toISOString(),l=s.skills[t];s.skills[t]={...e,installedAt:l?.installedAt??n,updatedAt:n},await es(s);}async function kn(t){let e=await Ae();return t in e.skills?(delete e.skills[t],await es(e),true):false}async function yn(t){return (await Ae()).skills[t]??null}async function bn(){return (await Ae()).skills}async function _r(){let t=await Ae(),e=new Map;for(let[s,n]of Object.entries(t.skills)){let l=e.get(n.source);l?l.skills.push(s):e.set(n.source,{skills:[s],entry:n});}return e}function mn(){return {version:Ul,skills:{},dismissed:{}}}async function wn(t){return (await Ae()).dismissed?.[t]===true}async function It(t){let e=await Ae();e.dismissed||(e.dismissed={}),e.dismissed[t]=true,await es(e);}async function xs(){return (await Ae()).lastSelectedAgents}async function As(t){let e=await Ae();e.lastSelectedAgents=t,await es(e);}var Ol={version:"0.3.2"};var Ml=t=>typeof t=="symbol",Wl="eve agent";async function Kr(t){let e=Jt(t);return e?vt(e.owner,e.repo):false}function Hr(t,e){return t.startsWith("git@")||t.startsWith("ssh://")?t:e}function vn(t){$s(t);}function Fl(t){switch(t){case "critical":return k__default.default.red(k__default.default.bold("Critical Risk"));case "high":return k__default.default.red("High Risk");case "medium":return k__default.default.yellow("Med Risk");case "low":return k__default.default.green("Low Risk");case "safe":return k__default.default.green("Safe");default:return k__default.default.dim("--")}}function zr(t){if(!t)return k__default.default.dim("--");let e=t.alerts??0;return e>0?k__default.default.red(`${e} alert${e!==1?"s":""}`):k__default.default.green("0 alerts")}function Pt(t,e){let s=chunkEOOPF3RI_cjs.d(t),n=Math.max(0,e-s.length);return t+" ".repeat(n)}function Gr(t,e,s){if(!t)return [];if(!e.some(a=>{let r=t[a.slug];return r&&Object.keys(r).length>0}))return [];let l=Math.min(Math.max(...e.map(a=>a.displayName.length)),36),o=[],i=Pt("",l+2)+Pt(k__default.default.dim("Gen"),18)+Pt(k__default.default.dim("Socket"),18)+k__default.default.dim("Snyk");o.push(i);for(let a of e){let r=t[a.slug],h=a.displayName.length>l?a.displayName.slice(0,l-1)+"\u2026":a.displayName,u=r?.ath?Fl(r.ath.risk):k__default.default.dim("--"),m=r?.socket?zr(r.socket):k__default.default.dim("--"),d=r?.snyk?Fl(r.snyk.risk):k__default.default.dim("--");o.push(Pt(k__default.default.cyan(h),l+2)+Pt(u,18)+Pt(m,18)+d);}return o.push(""),o.push(`${k__default.default.dim("Details:")} ${k__default.default.dim(`https://skills.sh/${s}`)}`),o}function Dt(t,e){let s=os$1.homedir();return t===s||t.startsWith(s+path.sep)?"~"+t.slice(s.length):t===e||t.startsWith(e+path.sep)?"."+t.slice(e.length):t}function Br(t){let e=crypto.createHash("sha256");return e.update("SKILL.md"),e.update(t),e.digest("hex")}function me(t,e=5){if(t.length<=e)return t.join(", ");let s=t.slice(0,e),n=t.length-e;return `${s.join(", ")} +${n} more`}function Vr(t){let e=t.map(n=>k__default.default.cyan(ne(n))),s=me(e,3);return chunkEOOPF3RI_cjs.d(s).length<=80?s:`${t.length} selected skills`}function qr(t){return `Detected an eve project. Install ${Vr(t)} for your ${Wl} to use?`}function xn(t){let e=[],s=[];for(let n of t)be(n)?e.push(T[n].displayName):s.push(T[n].displayName);return {universal:e,symlinked:s}}function Jr(t,e){let s=[],{universal:n,symlinked:l}=xn(t);if(e==="symlink")n.length>0&&s.push(` ${k__default.default.green("universal:")} ${me(n)}`),l.length>0&&s.push(` ${k__default.default.dim("symlink \u2192")} ${me(l)}`);else {let o=t.map(i=>T[i].displayName);s.push(` ${k__default.default.dim("copy \u2192")} ${me(o)}`);}return s}function Is(t){let e=T[t.agent].displayName;return t.subagent?`${e} (${t.subagent})`:e}function jl(t){return t.subagent?`${t.agent}:${t.subagent}`:t.agent}function Xr(t,e){let s=[];for(let n of t)if(n==="eve")for(let l of e)s.push({agent:n,subagent:l});else s.push({agent:n});return s}function Yr(t,e){let s=[],n=t.filter(a=>!a.subagent).map(a=>a.agent),l=t.filter(a=>a.subagent).map(Is),{universal:o,symlinked:i}=xn(n);if(e==="symlink")o.length>0&&s.push(` ${k__default.default.green("universal:")} ${me(o)}`),i.length>0&&s.push(` ${k__default.default.dim("symlink \u2192")} ${me(i)}`),l.length>0&&s.push(` ${k__default.default.dim("copy \u2192")} ${me(l)}`);else {let a=t.map(Is);s.push(` ${k__default.default.dim("copy \u2192")} ${me(a)}`);}return s}function Sn(t){let e=Ve(),s=[...t];for(let n of e)s.includes(n)||s.push(n);return s}function Kl(t,e){let s=[],{universal:n}=xn(e),o=t.filter(a=>!a.symlinkFailed&&!a.skipped&&!n.includes(a.agent)).map(a=>a.agent),i=t.filter(a=>a.symlinkFailed&&!a.skipped).map(a=>a.agent);return n.length>0&&s.push(` ${k__default.default.green("universal:")} ${me(n)}`),o.length>0&&s.push(` ${k__default.default.dim("symlinked:")} ${me(o)}`),i.length>0&&s.push(` ${k__default.default.yellow("copied:")} ${me(i)}`),s}function Hl(t){return y__namespace.multiselect({...t,options:t.options,message:`${t.message} ${k__default.default.dim("(space to toggle)")}`})}async function zl(t,e){let s;try{s=await xs();}catch{}let n=e.map(r=>r.value),o=["claude-code","opencode","codex"].filter(r=>n.includes(r)),i=[];s&&s.length>0&&(i=s.filter(r=>n.includes(r))),i.length===0&&(i=o);let a=await At({message:t,items:e,initialSelected:i,required:true});if(!Ml(a))try{await As(a);}catch{}return a}async function $n(t){let e=u=>!t.global||T[u].globalSkillsDir,s=Ve().filter(e),n=Kt().filter(e),l=yt().filter(u=>u!=="eve"&&e(u)),o={title:"Universal (.agents/skills)",items:n.map(u=>({value:u,label:T[u].displayName})),hiddenCount:s.length-n.length},i=l.map(u=>({value:u,label:T[u].displayName,hint:t.global?T[u].globalSkillsDir:T[u].skillsDir})),a;try{a=await xs();}catch{}let r=a?a.filter(u=>l.includes(u)&&!s.includes(u)):[],h=await At({message:"Which agents do you want to install to?",items:i,initialSelected:r,lockedSection:o});if(!Ml(h))try{await As(h);}catch{}return h}var Zr=Ol.version;$s(Zr);async function Qr(t,e,s,n){n.start("Discovering skills from well-known endpoint...");let l=await ut.fetchAllSkills(e);l.length===0&&(n.stop(k__default.default.red("No skills found")),y__namespace.outro(k__default.default.red("No skills found at this URL. Make sure the server has a /.well-known/agent-skills/index.json or /.well-known/skills/index.json file.")),process.exit(1)),n.stop(`Found ${k__default.default.green(l.length)} skill${l.length>1?"s":""}`);for(let w of l)y__namespace.log.info(`Skill: ${k__default.default.cyan(w.installName)}`),y__namespace.log.message(k__default.default.dim(w.description)),w.files.size>1&&y__namespace.log.message(k__default.default.dim(` Files: ${Array.from(w.files.keys()).join(", ")}`));if(s.list){console.log(),y__namespace.log.step(k__default.default.bold("Available Skills"));for(let w of l)y__namespace.log.message(` ${k__default.default.cyan(w.installName)}`),y__namespace.log.message(` ${k__default.default.dim(w.description)}`),w.files.size>1&&y__namespace.log.message(` ${k__default.default.dim(`Files: ${w.files.size}`)}`);console.log(),y__namespace.outro("Run without --list to install"),process.exit(0);}let o;if(s.skill?.includes("*"))o=l,y__namespace.log.info(`Installing all ${l.length} skills`);else if(s.skill&&s.skill.length>0){if(o=l.filter(w=>s.skill.some(N=>w.installName.toLowerCase()===N.toLowerCase()||w.name.toLowerCase()===N.toLowerCase())),o.length===0){y__namespace.log.error(`No matching skills found for: ${s.skill.join(", ")}`),y__namespace.log.info("Available skills:");for(let w of l)y__namespace.log.message(` - ${w.installName}`);process.exit(1);}}else if(l.length===1){o=l;let w=l[0];y__namespace.log.info(`Skill: ${k__default.default.cyan(w.installName)}`);}else if(s.yes)o=l,y__namespace.log.info(`Installing all ${l.length} skills`);else {let w=l.map(U=>({value:U,label:U.installName,hint:U.description.length>60?U.description.slice(0,57)+"...":U.description})),N=await Hl({message:"Select skills to install",options:w,required:true});y__namespace.isCancel(N)&&(y__namespace.cancel("Installation cancelled"),process.exit(0)),o=N;}let i,a=Object.keys(T);if(s.agent?.includes("*"))i=a,y__namespace.log.info(`Installing to all ${i.length} agents`);else if(s.agent&&s.agent.length>0){let w=s.agent.filter(N=>!a.includes(N));w.length>0&&(y__namespace.log.error(`Invalid agents: ${w.join(", ")}`),y__namespace.log.info(`Valid agents: ${a.join(", ")}`),process.exit(1)),i=s.agent;}else {n.start("Loading agents...");let w=await Ue(),N=Object.keys(T).length;if(n.stop(`${N} agents`),w.length===0)if(s.yes)i=a,y__namespace.log.info("Installing to all agents");else {y__namespace.log.info("Select agents to install skills to");let U=Object.entries(T).map(([B,de])=>({value:B,label:de.displayName})),M=await zl("Which agents do you want to install to?",U);y__namespace.isCancel(M)&&(y__namespace.cancel("Installation cancelled"),process.exit(0)),i=M;}else if(w.length===1||s.yes)if(i=Sn(w),w.length===1){let U=w[0];y__namespace.log.info(`Installing to: ${k__default.default.cyan(T[U].displayName)}`);}else y__namespace.log.info(`Installing to: ${w.map(U=>k__default.default.cyan(T[U].displayName)).join(", ")}`);else {let U=await $n({global:s.global});y__namespace.isCancel(U)&&(y__namespace.cancel("Installation cancelled"),process.exit(0)),i=U;}}let r=s.global??false,h=i.some(w=>T[w].globalSkillsDir!==void 0);if(s.global===void 0&&!s.yes&&h){let w=await y__namespace.select({message:"Installation scope",options:[{value:false,label:"Project",hint:"Install in current directory (committed with your project)"},{value:true,label:"Global",hint:"Install in home directory (available across all projects)"}]});y__namespace.isCancel(w)&&(y__namespace.cancel("Installation cancelled"),process.exit(0)),r=w;}let u=s.copy?"copy":"symlink",m=new Set(i.map(w=>T[w].skillsDir));if(!s.copy&&!s.yes&&m.size>1){let w=await y__namespace.select({message:"Installation method",options:[{value:"symlink",label:"Symlink (Recommended)",hint:"Single source of truth, easy updates"},{value:"copy",label:"Copy to all agents",hint:"Independent copies for each agent"}]});y__namespace.isCancel(w)&&(y__namespace.cancel("Installation cancelled"),process.exit(0)),u=w;}else m.size<=1&&(u="copy");let d=process.cwd(),g=[];i.map(w=>T[w].displayName);let f=await Promise.all(o.flatMap(w=>i.map(async N=>({skillName:w.installName,agent:N,installed:await qt(w.installName,N,{global:r})})))),x=new Map;for(let{skillName:w,agent:N,installed:U}of f)x.has(w)||x.set(w,new Map),x.get(w).set(N,U);for(let w of o){g.length>0&&g.push("");let N=qe(w.installName,{global:r}),U=Dt(N,d);g.push(`${k__default.default.cyan(U)}`),g.push(...Jr(i,u)),w.files.size>1&&g.push(` ${k__default.default.dim("files:")} ${w.files.size}`);let M=x.get(w.installName),B=i.filter(de=>M?.get(de)).map(de=>T[de].displayName);B.length>0&&g.push(` ${k__default.default.yellow("overwrites:")} ${me(B)}`);}if(console.log(),y__namespace.note(g.join(`
25
+ `)}`),fn=true);try{let t=child_process.execSync("gh auth token",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(t)return t}catch{}return null}async function Rr(t,e,s,n){let{fetchRepoTree:l,getSkillFolderHashFromTree:o}=await import('./chunks/blob-BHATBRFW.cjs'),i=await l(t,n,s??void 0);return i?o(i,e):null}async function vs(t,e){let s=await Ae(),n=new Date().toISOString(),l=s.skills[t];s.skills[t]={...e,installedAt:l?.installedAt??n,updatedAt:n},await es(s);}async function kn(t){let e=await Ae();return t in e.skills?(delete e.skills[t],await es(e),true):false}async function yn(t){return (await Ae()).skills[t]??null}async function bn(){return (await Ae()).skills}async function _r(){let t=await Ae(),e=new Map;for(let[s,n]of Object.entries(t.skills)){let l=e.get(n.source);l?l.skills.push(s):e.set(n.source,{skills:[s],entry:n});}return e}function mn(){return {version:Ul,skills:{},dismissed:{}}}async function wn(t){return (await Ae()).dismissed?.[t]===true}async function It(t){let e=await Ae();e.dismissed||(e.dismissed={}),e.dismissed[t]=true,await es(e);}async function xs(){return (await Ae()).lastSelectedAgents}async function As(t){let e=await Ae();e.lastSelectedAgents=t,await es(e);}var Ol={version:"0.3.3"};var Ml=t=>typeof t=="symbol",Wl="eve agent";async function Kr(t){let e=Jt(t);return e?vt(e.owner,e.repo):false}function Hr(t,e){return t.startsWith("git@")||t.startsWith("ssh://")?t:e}function vn(t){$s(t);}function Fl(t){switch(t){case "critical":return k__default.default.red(k__default.default.bold("Critical Risk"));case "high":return k__default.default.red("High Risk");case "medium":return k__default.default.yellow("Med Risk");case "low":return k__default.default.green("Low Risk");case "safe":return k__default.default.green("Safe");default:return k__default.default.dim("--")}}function zr(t){if(!t)return k__default.default.dim("--");let e=t.alerts??0;return e>0?k__default.default.red(`${e} alert${e!==1?"s":""}`):k__default.default.green("0 alerts")}function Pt(t,e){let s=chunkEOOPF3RI_cjs.d(t),n=Math.max(0,e-s.length);return t+" ".repeat(n)}function Gr(t,e,s){if(!t)return [];if(!e.some(a=>{let r=t[a.slug];return r&&Object.keys(r).length>0}))return [];let l=Math.min(Math.max(...e.map(a=>a.displayName.length)),36),o=[],i=Pt("",l+2)+Pt(k__default.default.dim("Gen"),18)+Pt(k__default.default.dim("Socket"),18)+k__default.default.dim("Snyk");o.push(i);for(let a of e){let r=t[a.slug],h=a.displayName.length>l?a.displayName.slice(0,l-1)+"\u2026":a.displayName,u=r?.ath?Fl(r.ath.risk):k__default.default.dim("--"),m=r?.socket?zr(r.socket):k__default.default.dim("--"),d=r?.snyk?Fl(r.snyk.risk):k__default.default.dim("--");o.push(Pt(k__default.default.cyan(h),l+2)+Pt(u,18)+Pt(m,18)+d);}return o.push(""),o.push(`${k__default.default.dim("Details:")} ${k__default.default.dim(`https://skills.sh/${s}`)}`),o}function Dt(t,e){let s=os$1.homedir();return t===s||t.startsWith(s+path.sep)?"~"+t.slice(s.length):t===e||t.startsWith(e+path.sep)?"."+t.slice(e.length):t}function Br(t){let e=crypto.createHash("sha256");return e.update("SKILL.md"),e.update(t),e.digest("hex")}function me(t,e=5){if(t.length<=e)return t.join(", ");let s=t.slice(0,e),n=t.length-e;return `${s.join(", ")} +${n} more`}function Vr(t){let e=t.map(n=>k__default.default.cyan(ne(n))),s=me(e,3);return chunkEOOPF3RI_cjs.d(s).length<=80?s:`${t.length} selected skills`}function qr(t){return `Detected an eve project. Install ${Vr(t)} for your ${Wl} to use?`}function xn(t){let e=[],s=[];for(let n of t)be(n)?e.push(T[n].displayName):s.push(T[n].displayName);return {universal:e,symlinked:s}}function Jr(t,e){let s=[],{universal:n,symlinked:l}=xn(t);if(e==="symlink")n.length>0&&s.push(` ${k__default.default.green("universal:")} ${me(n)}`),l.length>0&&s.push(` ${k__default.default.dim("symlink \u2192")} ${me(l)}`);else {let o=t.map(i=>T[i].displayName);s.push(` ${k__default.default.dim("copy \u2192")} ${me(o)}`);}return s}function Is(t){let e=T[t.agent].displayName;return t.subagent?`${e} (${t.subagent})`:e}function jl(t){return t.subagent?`${t.agent}:${t.subagent}`:t.agent}function Xr(t,e){let s=[];for(let n of t)if(n==="eve")for(let l of e)s.push({agent:n,subagent:l});else s.push({agent:n});return s}function Yr(t,e){let s=[],n=t.filter(a=>!a.subagent).map(a=>a.agent),l=t.filter(a=>a.subagent).map(Is),{universal:o,symlinked:i}=xn(n);if(e==="symlink")o.length>0&&s.push(` ${k__default.default.green("universal:")} ${me(o)}`),i.length>0&&s.push(` ${k__default.default.dim("symlink \u2192")} ${me(i)}`),l.length>0&&s.push(` ${k__default.default.dim("copy \u2192")} ${me(l)}`);else {let a=t.map(Is);s.push(` ${k__default.default.dim("copy \u2192")} ${me(a)}`);}return s}function Sn(t){let e=Ve(),s=[...t];for(let n of e)s.includes(n)||s.push(n);return s}function Kl(t,e){let s=[],{universal:n}=xn(e),o=t.filter(a=>!a.symlinkFailed&&!a.skipped&&!n.includes(a.agent)).map(a=>a.agent),i=t.filter(a=>a.symlinkFailed&&!a.skipped).map(a=>a.agent);return n.length>0&&s.push(` ${k__default.default.green("universal:")} ${me(n)}`),o.length>0&&s.push(` ${k__default.default.dim("symlinked:")} ${me(o)}`),i.length>0&&s.push(` ${k__default.default.yellow("copied:")} ${me(i)}`),s}function Hl(t){return y__namespace.multiselect({...t,options:t.options,message:`${t.message} ${k__default.default.dim("(space to toggle)")}`})}async function zl(t,e){let s;try{s=await xs();}catch{}let n=e.map(r=>r.value),o=["claude-code","opencode","codex"].filter(r=>n.includes(r)),i=[];s&&s.length>0&&(i=s.filter(r=>n.includes(r))),i.length===0&&(i=o);let a=await At({message:t,items:e,initialSelected:i,required:true});if(!Ml(a))try{await As(a);}catch{}return a}async function $n(t){let e=u=>!t.global||T[u].globalSkillsDir,s=Ve().filter(e),n=Kt().filter(e),l=yt().filter(u=>u!=="eve"&&e(u)),o={title:"Universal (.agents/skills)",items:n.map(u=>({value:u,label:T[u].displayName})),hiddenCount:s.length-n.length},i=l.map(u=>({value:u,label:T[u].displayName,hint:t.global?T[u].globalSkillsDir:T[u].skillsDir})),a;try{a=await xs();}catch{}let r=a?a.filter(u=>l.includes(u)&&!s.includes(u)):[],h=await At({message:"Which agents do you want to install to?",items:i,initialSelected:r,lockedSection:o});if(!Ml(h))try{await As(h);}catch{}return h}var Zr=Ol.version;$s(Zr);async function Qr(t,e,s,n){n.start("Discovering skills from well-known endpoint...");let l=await ut.fetchAllSkills(e);l.length===0&&(n.stop(k__default.default.red("No skills found")),y__namespace.outro(k__default.default.red("No skills found at this URL. Make sure the server has a /.well-known/agent-skills/index.json or /.well-known/skills/index.json file.")),process.exit(1)),n.stop(`Found ${k__default.default.green(l.length)} skill${l.length>1?"s":""}`);for(let w of l)y__namespace.log.info(`Skill: ${k__default.default.cyan(w.installName)}`),y__namespace.log.message(k__default.default.dim(w.description)),w.files.size>1&&y__namespace.log.message(k__default.default.dim(` Files: ${Array.from(w.files.keys()).join(", ")}`));if(s.list){console.log(),y__namespace.log.step(k__default.default.bold("Available Skills"));for(let w of l)y__namespace.log.message(` ${k__default.default.cyan(w.installName)}`),y__namespace.log.message(` ${k__default.default.dim(w.description)}`),w.files.size>1&&y__namespace.log.message(` ${k__default.default.dim(`Files: ${w.files.size}`)}`);console.log(),y__namespace.outro("Run without --list to install"),process.exit(0);}let o;if(s.skill?.includes("*"))o=l,y__namespace.log.info(`Installing all ${l.length} skills`);else if(s.skill&&s.skill.length>0){if(o=l.filter(w=>s.skill.some(N=>w.installName.toLowerCase()===N.toLowerCase()||w.name.toLowerCase()===N.toLowerCase())),o.length===0){y__namespace.log.error(`No matching skills found for: ${s.skill.join(", ")}`),y__namespace.log.info("Available skills:");for(let w of l)y__namespace.log.message(` - ${w.installName}`);process.exit(1);}}else if(l.length===1){o=l;let w=l[0];y__namespace.log.info(`Skill: ${k__default.default.cyan(w.installName)}`);}else if(s.yes)o=l,y__namespace.log.info(`Installing all ${l.length} skills`);else {let w=l.map(U=>({value:U,label:U.installName,hint:U.description.length>60?U.description.slice(0,57)+"...":U.description})),N=await Hl({message:"Select skills to install",options:w,required:true});y__namespace.isCancel(N)&&(y__namespace.cancel("Installation cancelled"),process.exit(0)),o=N;}let i,a=Object.keys(T);if(s.agent?.includes("*"))i=a,y__namespace.log.info(`Installing to all ${i.length} agents`);else if(s.agent&&s.agent.length>0){let w=s.agent.filter(N=>!a.includes(N));w.length>0&&(y__namespace.log.error(`Invalid agents: ${w.join(", ")}`),y__namespace.log.info(`Valid agents: ${a.join(", ")}`),process.exit(1)),i=s.agent;}else {n.start("Loading agents...");let w=await Ue(),N=Object.keys(T).length;if(n.stop(`${N} agents`),w.length===0)if(s.yes)i=a,y__namespace.log.info("Installing to all agents");else {y__namespace.log.info("Select agents to install skills to");let U=Object.entries(T).map(([B,de])=>({value:B,label:de.displayName})),M=await zl("Which agents do you want to install to?",U);y__namespace.isCancel(M)&&(y__namespace.cancel("Installation cancelled"),process.exit(0)),i=M;}else if(w.length===1||s.yes)if(i=Sn(w),w.length===1){let U=w[0];y__namespace.log.info(`Installing to: ${k__default.default.cyan(T[U].displayName)}`);}else y__namespace.log.info(`Installing to: ${w.map(U=>k__default.default.cyan(T[U].displayName)).join(", ")}`);else {let U=await $n({global:s.global});y__namespace.isCancel(U)&&(y__namespace.cancel("Installation cancelled"),process.exit(0)),i=U;}}let r=s.global??false,h=i.some(w=>T[w].globalSkillsDir!==void 0);if(s.global===void 0&&!s.yes&&h){let w=await y__namespace.select({message:"Installation scope",options:[{value:false,label:"Project",hint:"Install in current directory (committed with your project)"},{value:true,label:"Global",hint:"Install in home directory (available across all projects)"}]});y__namespace.isCancel(w)&&(y__namespace.cancel("Installation cancelled"),process.exit(0)),r=w;}let u=s.copy?"copy":"symlink",m=new Set(i.map(w=>T[w].skillsDir));if(!s.copy&&!s.yes&&m.size>1){let w=await y__namespace.select({message:"Installation method",options:[{value:"symlink",label:"Symlink (Recommended)",hint:"Single source of truth, easy updates"},{value:"copy",label:"Copy to all agents",hint:"Independent copies for each agent"}]});y__namespace.isCancel(w)&&(y__namespace.cancel("Installation cancelled"),process.exit(0)),u=w;}else m.size<=1&&(u="copy");let d=process.cwd(),g=[];i.map(w=>T[w].displayName);let f=await Promise.all(o.flatMap(w=>i.map(async N=>({skillName:w.installName,agent:N,installed:await qt(w.installName,N,{global:r})})))),x=new Map;for(let{skillName:w,agent:N,installed:U}of f)x.has(w)||x.set(w,new Map),x.get(w).set(N,U);for(let w of o){g.length>0&&g.push("");let N=qe(w.installName,{global:r}),U=Dt(N,d);g.push(`${k__default.default.cyan(U)}`),g.push(...Jr(i,u)),w.files.size>1&&g.push(` ${k__default.default.dim("files:")} ${w.files.size}`);let M=x.get(w.installName),B=i.filter(de=>M?.get(de)).map(de=>T[de].displayName);B.length>0&&g.push(` ${k__default.default.yellow("overwrites:")} ${me(B)}`);}if(console.log(),y__namespace.note(g.join(`
26
26
  `),"Installation Summary"),!s.yes){let w=await y__namespace.confirm({message:"Proceed with installation?"});(y__namespace.isCancel(w)||!w)&&(y__namespace.cancel("Installation cancelled"),process.exit(0));}let A=ut.getSourceIdentifier(e),$=Kr(A).catch(()=>null);n.start("Installing skills...");let E=[];for(let w of o)for(let N of i){let U=await Qs(w,N,{global:r,mode:u});E.push({skill:w.installName,agent:T[N].displayName,...U});}n.stop("Installation complete"),console.log();let D=E.filter(w=>w.success),F=E.filter(w=>!w.success),C={};for(let w of o)C[w.installName]=w.sourceUrl;if(await $!==true&&he({event:"install",source:A,skills:o.map(w=>w.installName).join(","),agents:i.join(","),...r&&{global:"1"},skillFiles:JSON.stringify(C),sourceType:"well-known"}),D.length>0&&r){let w=new Set(D.map(N=>N.skill));for(let N of o)if(w.has(N.installName))try{await vs(N.installName,{source:A,sourceType:"well-known",sourceUrl:N.sourceUrl,skillFolderHash:""});}catch{}}if(D.length>0&&!r){let w=new Set(D.map(N=>N.skill));for(let N of o)if(w.has(N.installName))try{let U=D.find(B=>B.skill===N.installName),M=U?.canonicalPath||U?.path;if(M){let B=await Fe(M);await bt(N.installName,{source:A,sourceType:"well-known",computedHash:B},d);}}catch{}}if(D.length>0){let w=new Map;for(let te of D){let ee=w.get(te.skill)||[];ee.push(te),w.set(te.skill,ee);}let N=w.size,U=D.filter(te=>te.mode==="symlink"&&te.symlinkFailed),M=U.map(te=>te.agent),B=[];for(let[te,ee]of w){let we=ee[0];if(we.mode==="copy"){B.push(`${k__default.default.green("\u2713")} ${te} ${k__default.default.dim("(copied)")}`);for(let pe of ee){let Pe=Dt(pe.path,d);B.push(` ${k__default.default.dim("\u2192")} ${Pe}`);}}else {if(we.canonicalPath){let pe=Dt(we.canonicalPath,d);B.push(`${k__default.default.green("\u2713")} ${pe}`);}else B.push(`${k__default.default.green("\u2713")} ${te}`);B.push(...Kl(ee,i));}}let de=k__default.default.green(`Installed ${N} skill${N!==1?"s":""}`);y__namespace.note(B.join(`
27
27
  `),de),U.length>0&&(y__namespace.log.warn(k__default.default.yellow(`Symlinks failed for: ${me(M)}`)),y__namespace.log.message(k__default.default.dim(" Files were copied instead. On Windows, enable Developer Mode for symlink support.")));}if(F.length>0){console.log(),y__namespace.log.error(k__default.default.red(`Failed to install ${F.length}`));for(let w of F)y__namespace.log.message(` ${k__default.default.red("\u2717")} ${w.skill} \u2192 ${w.agent}: ${k__default.default.dim(w.error)}`);}console.log(),y__namespace.outro(k__default.default.green("Done!")+k__default.default.dim(" Review skills before use; they run with full agent permissions.")),await Gl(s,i);}async function nt(t,e={}){let s=t[0],n=false,l=()=>{n||(y__namespace.log.message(k__default.default.dim("Tip: use the --yes (-y) and --global (-g) flags to install without prompts.")),n=true);};s||(console.log(),console.log(k__default.default.bgRed(k__default.default.white(k__default.default.bold(" ERROR ")))+" "+k__default.default.red("Missing required argument: source")),console.log(),console.log(k__default.default.dim(" Usage:")),console.log(` ${k__default.default.cyan("easbot skills add")} ${k__default.default.yellow("<source>")} ${k__default.default.dim("[options]")}`),console.log(),console.log(k__default.default.dim(" Example:")),console.log(` ${k__default.default.cyan("easbot skills add")} ${k__default.default.yellow("houjallen/agent-skills")}`),console.log(),process.exit(1)),e.all&&(e.skill=["*"],e.agent=["*"],e.yes=true);let o=await Xe();if(o.isAgent&&(e.yes=true,!e.agent||e.agent.length===0)){let a=Yt(o.agent.name);a&&(e.agent=Sn([a]));}console.log(),o.isAgent||y__namespace.intro(k__default.default.bgCyan(k__default.default.black(" skills "))),o.isAgent?y__namespace.log.info(k__default.default.bgCyan(k__default.default.black(k__default.default.bold(` ${o.agent.name} `)))+" Agent detected \u2014 installing non-interactively"):process.stdin.isTTY||l();let i=null;try{let a=y__namespace.spinner();a.start("Parsing source...");let r=ct(s);a.stop(`Source: ${r.type==="local"?r.localPath:r.url}${r.ref?` @ ${k__default.default.yellow(r.ref)}`:""}${r.subpath?` (${r.subpath})`:""}${r.skillFilter?` ${k__default.default.dim("@")}${k__default.default.cyan(r.skillFilter)}`:""}`);let h=Je(r),u=(()=>{if(!h)return Promise.resolve(null);let S=Jt(h);return S?vt(S.owner,S.repo).catch(()=>null):Promise.resolve(null)})();if(r.type==="well-known"){await Qr(s,r.url,e,a);return}r.skillFilter&&(e.skill=e.skill||[],e.skill.includes(r.skillFilter)||e.skill.push(r.skillFilter));let m=!!(e.skill&&e.skill.length>0),d,g=null;if(r.type==="local")a.start("Validating local path..."),fs$1.existsSync(r.localPath)||(a.stop(k__default.default.red("Path not found")),y__namespace.outro(k__default.default.red(`Local path does not exist: ${r.localPath}`)),process.exit(1)),a.stop("Local path validated"),a.start("Discovering skills..."),d=await $e(r.localPath,r.subpath,{includeInternal:m,fullDepth:e.fullDepth});else if(r.type==="github"&&!e.fullDepth){let S=["vercel","houjallen","heygen-com"],_=Je(r),O=_?.split("/")[0]?.toLowerCase(),R=!!_&&Object.hasOwn(chunkEOOPF3RI_cjs.f,_.toLowerCase());_&&O&&(R||S.includes(O))&&(a.start("Fetching skills..."),g=await chunkEOOPF3RI_cjs.l(_,{subpath:r.subpath,skillFilter:r.skillFilter,ref:r.ref,getToken:st,includeInternal:m}),g||a.stop(k__default.default.dim("Falling back to clone..."))),g?(d=g.skills,a.stop(`Found ${k__default.default.green(d.length)} skill${d.length>1?"s":""}`)):(a.start("Cloning repository..."),i=await We(r.url,r.ref),a.stop("Repository cloned"),a.start("Discovering skills..."),d=await $e(i,r.subpath,{includeInternal:m,fullDepth:e.fullDepth}));}else a.start("Cloning repository..."),i=await We(r.url,r.ref),a.stop("Repository cloned"),a.start("Discovering skills..."),d=await $e(i,r.subpath,{includeInternal:m,fullDepth:e.fullDepth});if(d.length===0&&(a.stop(k__default.default.red("No skills found")),y__namespace.outro(k__default.default.red("No valid skills found. Skills require a SKILL.md with name and description.")),await ke(i),process.exit(1)),g||a.stop(`Found ${k__default.default.green(d.length)} skill${d.length>1?"s":""}`),e.list){console.log(),y__namespace.log.step(k__default.default.bold("Available Skills"));let S={},_=[];for(let R of d)if(R.pluginName){let K=R.pluginName;S[K]||(S[K]=[]),S[K].push(R);}else _.push(R);let O=Object.keys(S).sort();for(let R of O){let K=R.split("-").map(H=>H.charAt(0).toUpperCase()+H.slice(1)).join(" ");console.log(k__default.default.bold(K));for(let H of S[R])y__namespace.log.message(` ${k__default.default.cyan(ne(H))}`),y__namespace.log.message(` ${k__default.default.dim(H.description)}`);console.log();}if(_.length>0){O.length>0&&console.log(k__default.default.bold("General"));for(let R of _)y__namespace.log.message(` ${k__default.default.cyan(ne(R))}`),y__namespace.log.message(` ${k__default.default.dim(R.description)}`);}console.log(),y__namespace.outro("Use --skill <name> to install specific skills"),await ke(i),process.exit(0);}let c;if(e.skill?.includes("*"))c=d,y__namespace.log.info(`Installing all ${d.length} skills`);else if(e.skill&&e.skill.length>0){if(c=zt(d,e.skill),c.length===0){y__namespace.log.error(`No matching skills found for: ${e.skill.join(", ")}`),y__namespace.log.info("Available skills:");for(let S of d)y__namespace.log.message(` - ${ne(S)}`);await ke(i),process.exit(1);}y__namespace.log.info(`Selected ${c.length} skill${c.length!==1?"s":""}: ${c.map(S=>k__default.default.cyan(ne(S))).join(", ")}`);}else if(d.length===1){c=d;let S=d[0];y__namespace.log.info(`Skill: ${k__default.default.cyan(ne(S))}`),y__namespace.log.message(k__default.default.dim(S.description));}else if(e.yes)c=d,y__namespace.log.info(`Installing all ${d.length} skills`);else {let S=[...d].sort((R,K)=>R.pluginName&&!K.pluginName?-1:!R.pluginName&&K.pluginName?1:R.pluginName&&K.pluginName&&R.pluginName!==K.pluginName?R.pluginName.localeCompare(K.pluginName):ne(R).localeCompare(ne(K))),_=S.some(R=>R.pluginName),O;if(_){let R=H=>H.split("-").map(q=>q.charAt(0).toUpperCase()+q.slice(1)).join(" "),K={};for(let H of S){let q=H.pluginName?R(H.pluginName):"Other";K[q]||(K[q]=[]),K[q].push({value:H,label:ne(H),hint:H.description.length>60?H.description.slice(0,57)+"...":H.description});}O=await y__namespace.groupMultiselect({message:`Select skills to install ${k__default.default.dim("(space to toggle)")}`,options:K,required:!0});}else {let R=S.map(K=>({value:K,label:ne(K),hint:K.description.length>60?K.description.slice(0,57)+"...":K.description}));O=await Hl({message:"Select skills to install",options:R,required:!0});}y__namespace.isCancel(O)&&(y__namespace.cancel("Installation cancelled"),await ke(i),process.exit(0)),c=O;}let f=Je(r),x=f?un(f,c.map(S=>ne(S))):Promise.resolve(null),A,$=Object.keys(T);if(e.agent?.includes("*"))A=$,y__namespace.log.info(`Installing to all ${A.length} agents`);else if(e.agent&&e.agent.length>0){let S=e.agent.filter(_=>!$.includes(_));S.length>0&&(y__namespace.log.error(`Invalid agents: ${S.join(", ")}`),y__namespace.log.info(`Valid agents: ${$.join(", ")}`),await ke(i),process.exit(1)),A=e.agent;}else {a.start("Loading agents...");let S=await Ue(),_=Object.keys(T).length;if(a.stop(`${_} agents`),S.includes("eve")&&(e.yes||!o.isAgent)){let O=e.yes?!0:await y__namespace.confirm({message:qr(c),initialValue:!0});if(y__namespace.isCancel(O)&&(y__namespace.cancel("Installation cancelled"),await ke(i),process.exit(0)),O)A=["eve"],y__namespace.log.info(`Installing to: ${k__default.default.cyan(Wl)}`);else {let R=await $n({global:e.global});y__namespace.isCancel(R)&&(y__namespace.cancel("Installation cancelled"),await ke(i),process.exit(0)),A=R;}}else if(S.length===0)if(e.yes)A=$,y__namespace.log.info("Installing to all agents");else {y__namespace.log.info("Select agents to install skills to");let O=Object.entries(T).filter(([K])=>K!=="eve").map(([K,H])=>({value:K,label:H.displayName})),R=await zl("Which agents do you want to install to?",O);y__namespace.isCancel(R)&&(y__namespace.cancel("Installation cancelled"),await ke(i),process.exit(0)),A=R;}else if(S.length===1||e.yes)if(A=Sn(S),S.length===1){let O=S[0];y__namespace.log.info(`Installing to: ${k__default.default.cyan(T[O].displayName)}`);}else y__namespace.log.info(`Installing to: ${S.map(O=>k__default.default.cyan(T[O].displayName)).join(", ")}`);else {let O=await $n({global:e.global});y__namespace.isCancel(O)&&(y__namespace.cancel("Installation cancelled"),await ke(i),process.exit(0)),A=O;}}e.subagent&&e.subagent.length>0&&!A.includes("eve")&&(A=[...A,"eve"]);let E=[void 0];if(A.includes("eve")){let S=Qe(process.cwd());if(e.subagent&&e.subagent.length>0)E=e.subagent.map(_=>_==="root"||_==="."?void 0:_);else if(S.length>0&&!e.yes){let _=[{value:"",label:"Root agent",hint:"agent/skills"},...S.map(R=>({value:R,label:R,hint:`agent/subagents/${R}/skills`}))],O=await y__namespace.multiselect({message:"Where should Eve skills be installed?",options:_,initialValues:[""],required:!0});y__namespace.isCancel(O)&&(y__namespace.cancel("Installation cancelled"),await ke(i),process.exit(0)),E=O.map(R=>R===""?void 0:R);}}let D=Xr(A,E),F=e.global??!1,C=A.some(S=>T[S].globalSkillsDir!==void 0);if(e.global===void 0&&!e.yes&&C){let S=await y__namespace.select({message:"Installation scope",options:[{value:!1,label:"Project",hint:"Install in current directory (committed with your project)"},{value:!0,label:"Global",hint:"Install in home directory (available across all projects)"}]});y__namespace.isCancel(S)&&(y__namespace.cancel("Installation cancelled"),await ke(i),process.exit(0)),F=S;}let L=e.copy?"copy":"symlink",w=D.every(S=>S.agent==="eve"),N=new Set(D.map(S=>S.subagent?`eve:subagent:${S.subagent}`:T[S.agent].skillsDir));if(!e.copy&&!e.yes&&N.size>1&&!w){let S=await y__namespace.select({message:"Installation method",options:[{value:"symlink",label:"Symlink (Recommended)",hint:"Single source of truth, easy updates"},{value:"copy",label:"Copy to all agents",hint:"Independent copies for each agent"}]});y__namespace.isCancel(S)&&(y__namespace.cancel("Installation cancelled"),await ke(i),process.exit(0)),L=S;}else (N.size<=1||w)&&(L="copy");let U=process.cwd(),M=[],B=await Promise.all(c.flatMap(S=>D.map(async _=>({skillName:S.name,target:_,installed:await qt(S.name,_.agent,{global:F,eveSubagent:_.subagent})})))),de=new Map;for(let{skillName:S,target:_,installed:O}of B)de.has(S)||de.set(S,new Map),de.get(S).set(jl(_),O);let te={},ee=[];for(let S of c)if(S.pluginName){let _=S.pluginName;te[_]||(te[_]=[]),te[_].push(S);}else ee.push(S);let we=S=>{for(let _ of S){M.length>0&&M.push("");let O=D.length===1?qe(_.name,{global:F,agent:D[0].agent,eveSubagent:D[0].subagent}):qe(_.name,{global:F}),R=Dt(O,U);M.push(`${k__default.default.cyan(R)}`),M.push(...Yr(D,L));let K=de.get(_.name),H=D.filter(q=>K?.get(jl(q))).map(Is);H.length>0&&M.push(` ${k__default.default.yellow("overwrites:")} ${me(H)}`);}},pe=Object.keys(te).sort();for(let S of pe){let _=S.split("-").map(O=>O.charAt(0).toUpperCase()+O.slice(1)).join(" ");M.push(""),M.push(k__default.default.bold(_)),we(te[S]);}ee.length>0&&(pe.length>0&&(M.push(""),M.push(k__default.default.bold("General"))),we(ee)),console.log(),y__namespace.note(M.join(`
28
28
  `),"Installation Summary");try{let S=await x;if(S&&f){let _=Gr(S,c.map(O=>({slug:ne(O),displayName:ne(O)})),f);_.length>0&&y__namespace.note(_.join(`
package/dist/index.mjs CHANGED
@@ -22,7 +22,7 @@ ${s.replace(/^\r?\n/u,"")}`}async function fs(t,e,s){await mkdir(e,{recursive:tr
22
22
  - For SSH: ssh-add -l (to check loaded keys)
23
23
  - For HTTPS: gh auth status (if using GitHub CLI)`,t,true,false)}if(r&&l&&El(t)){try{if(await Dl(s),await ur(l,s,e))return s}catch{}try{return await Dl(s),await Pl({GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND??"ssh -o BatchMode=yes"}).clone(l.sshUrl,s,n),s}catch{}}try{await rm(s,{recursive:!0,force:!0});}catch{}throw r?new We(dr(t,l,i),t,false,true):new We(`Failed to clone ${t}: ${i}`,t,false,false)}}async function st(t){let e=normalize(resolve(t)),s=normalize(resolve(tmpdir()));if(!e.startsWith(s+sep)&&e!==s)throw new Error("Attempted to clean up directory outside of temp directory");await rm(t,{recursive:true,force:true});}var pr="https://add-skill.vercel.sh/t",gr="https://add-skill.vercel.sh/audit",rn=null,an=null;function un(t){an=t;}function mr(){return !!(process.env.CI||process.env.GITHUB_ACTIONS||process.env.GITLAB_CI||process.env.CIRCLECI||process.env.TRAVIS||process.env.BUILDKITE||process.env.JENKINS_URL||process.env.TEAMCITY_VERSION)}function fr(){return !process.env.DISABLE_TELEMETRY&&!process.env.DO_NOT_TRACK}function vs(t){rn=t;}async function dn(t,e,s=3e3){if(e.length===0)return null;try{let n=new URLSearchParams({source:t,skills:e.join(",")}),l=new AbortController,o=setTimeout(()=>l.abort(),s),i=await fetch(`${gr}?${n.toString()}`,{signal:l.signal});return clearTimeout(o),i.ok?await i.json():null}catch{return null}}var cn=[];function ke(t){if(fr())try{let e=new URLSearchParams;rn&&e.set("v",rn),mr()&&e.set("ci","1"),an&&e.set("agent",an);for(let[n,l]of Object.entries(t))l!=null&&e.set(n,String(l));let s=fetch(`${pr}?${e.toString()}`).catch(()=>{}).then(()=>{});cn.push(s);}catch{}}async function hr(t=5e3){if(cn.length===0)return;let e=new Promise(s=>setTimeout(s,t));await Promise.race([Promise.all(cn),e]);}var It=null,yr={cursor:"cursor","cursor-cli":"cursor",claude:"claude-code",cowork:"claude-code",devin:"universal",replit:"replit",gemini:"gemini-cli",codex:"codex",antigravity:"antigravity","augment-cli":"augment",opencode:"opencode","github-copilot":"github-copilot"};async function Ye(){return It||(It=await determineAgent(),It.isAgent&&un(It.agent.name),It)}async function Yt(){return (await Ye()).isAgent}async function br(){let t=await Ye();return t.isAgent?t.agent.name:null}function Zt(t){return yr[t]??null}var pn=class{constructor(){a(this,"providers",[]);}register(e){if(this.providers.some(s=>s.id===e.id))throw new Error(`Provider with id "${e.id}" already registered`);this.providers.push(e);}findProvider(e){for(let s of this.providers)if(s.match(e).matches)return s;return null}getProviders(){return [...this.providers]}},Qt=new pn;function Cl(t){Qt.register(t);}function Rl(t){return Qt.findProvider(t)}function _l(){return Qt.getProviders()}var Ul="https://schemas.agentskills.io/discovery/0.2.0/schema.json",vr=50*1024*1024,xr=1e3,es=class{constructor(){a(this,"id","well-known");a(this,"displayName","Well-Known Skills");a(this,"WELL_KNOWN_PATHS",[".well-known/agent-skills",".well-known/skills"]);a(this,"INDEX_FILE","index.json");}match(e){if(!e.startsWith("http://")&&!e.startsWith("https://"))return {matches:false};try{let s=new URL(e);return ["github.com","gitlab.com","huggingface.co"].includes(s.hostname)?{matches:!1}:{matches:!0,sourceIdentifier:`wellknown/${s.hostname}`}}catch{return {matches:false}}}async fetchIndex(e){return (await this.fetchIndexCandidates(e))[0]??null}async fetchIndexCandidates(e){try{let s=new URL(e),n=s.pathname.replace(/\/$/,""),l=[];for(let i of this.WELL_KNOWN_PATHS)l.push({indexUrl:`${s.protocol}//${s.host}${n}/${i}/${this.INDEX_FILE}`,baseUrl:`${s.protocol}//${s.host}${n}`,wellKnownPath:i}),n&&n!==""&&l.push({indexUrl:`${s.protocol}//${s.host}/${i}/${this.INDEX_FILE}`,baseUrl:`${s.protocol}//${s.host}`,wellKnownPath:i});let o=[];for(let{indexUrl:i,baseUrl:a,wellKnownPath:r}of l)try{let h=await fetch(i);if(!h.ok)continue;let u=await h.json(),m=this.normalizeIndex(u,i,r);if(!m)continue;o.push({index:m.index,entries:m.entries,resolvedBaseUrl:a,resolvedWellKnownPath:r,indexUrl:i});}catch{}return o}catch{return []}}normalizeIndex(e,s,n){if(!e||typeof e!="object")return null;let l=e;if(!Array.isArray(l.skills))return null;let o=l.$schema;if(o===Ul){let r=[],h=[];for(let u of l.skills){if(!this.isValidSkillEntryV2(u))continue;let m=new URL(u.url,s).toString();r.push({version:"0.2.0",name:u.name,description:u.description,type:u.type,artifactUrl:m,digest:u.digest,indexEntry:u}),h.push(u);}return r.length===0?null:{index:{$schema:Ul,skills:h},entries:r}}if(o!==void 0)return null;let i=[],a=[];for(let r of l.skills){if(!this.isValidSkillEntryV1(r))return null;i.push(r),a.push({version:"0.1.0",name:r.name,description:r.description,files:r.files,baseUrl:this.getLegacySkillBaseUrl(s,n),wellKnownPath:n,indexEntry:r});}return {index:{skills:i},entries:a}}getLegacySkillBaseUrl(e,s){let n=new URL(e),l=`/${s}/${this.INDEX_FILE}`;return `${n.protocol}//${n.host}${n.pathname.slice(0,-l.length)}`}isValidSkillName(e){return !(typeof e!="string"||e.length===0||e.length>64||!/^[a-z0-9-]+$/.test(e)||e.startsWith("-")||e.endsWith("-")||e.includes("--"))}isSafeLegacyFilePath(e){return !(typeof e!="string"||e.length===0||e.startsWith("/")||e.startsWith("\\")||e.includes("..")||e.includes("\0"))}isValidSkillEntryV1(e){if(!e||typeof e!="object")return false;let s=e;if(!this.isValidSkillName(s.name)||typeof s.description!="string"||!s.description||!Array.isArray(s.files)||s.files.length===0)return false;for(let l of s.files)if(!this.isSafeLegacyFilePath(l))return false;return s.files.some(l=>typeof l=="string"&&l.toLowerCase()==="skill.md")}isValidSkillEntryV2(e){if(!e||typeof e!="object")return false;let s=e;if(!this.isValidSkillName(s.name)||typeof s.description!="string"||!s.description||s.description.length>1024||s.type!=="skill-md"&&s.type!=="archive"||typeof s.url!="string"||!s.url||typeof s.digest!="string"||!/^sha256:[a-f0-9]{64}$/.test(s.digest))return false;try{new URL(s.url,"https://example.com/.well-known/agent-skills/index.json");}catch{return false}return true}async fetchSkill(e){try{let s=new URL(e),n=await this.fetchIndexCandidates(e);for(let l of n){let{entries:o}=l,i=null,a=s.pathname.match(/\/.well-known\/(?:agent-skills|skills)\/([^/]+)\/?$/);if(a?.[1]&&a[1]!=="index.json"?i=a[1]:o.length===1&&(i=o[0].name),!i)continue;let r=o.find(u=>u.name===i);if(!r)continue;let h=await this.fetchSkillByEntry(r);if(h)return h}return null}catch{return null}}async fetchSkillByEntry(e,s,n){return typeof e=="string"?s?this.fetchLegacySkillByEntry({version:"0.1.0",name:s.name,description:s.description,files:s.files,baseUrl:e,wellKnownPath:n??this.WELL_KNOWN_PATHS[0],indexEntry:s}):null:e.version==="0.1.0"?this.fetchLegacySkillByEntry(e):this.fetchArtifactSkillByEntry(e)}async fetchLegacySkillByEntry(e){try{let s=`${e.baseUrl.replace(/\/$/,"")}/${e.wellKnownPath}/${e.name}`,n=`${s}/SKILL.md`,l=await fetch(n);if(!l.ok)return null;let o=await l.text(),{data:i}=b$1(o);if(typeof i.name!="string"||typeof i.description!="string")return null;let a=new Map;a.set("SKILL.md",o);let h=e.files.filter(m=>m.toLowerCase()!=="skill.md").map(async m=>{try{let d=`${s}/${m}`,g=await fetch(d);if(g.ok){let c=await g.arrayBuffer();return {path:m,content:new Uint8Array(c)}}}catch{}return null}),u=await Promise.all(h);for(let m of u)m&&a.set(m.path,m.content);return this.createSkill({name:i.name,description:i.description,content:o,installName:e.name,sourceUrl:n,metadata:i.metadata,files:a,indexEntry:e.indexEntry})}catch{return null}}async fetchArtifactSkillByEntry(e){try{let s=await fetch(e.artifactUrl);if(!s.ok)return null;let n=s.headers.get("content-type")??"",l=new Uint8Array(await s.arrayBuffer());if(this.computeDigest(l)!==e.digest)return null;if(e.type==="skill-md"){let h=new TextDecoder().decode(l),{data:u}=b$1(h);if(typeof u.name!="string"||typeof u.description!="string")return null;let m=new Map;return m.set("SKILL.md",h),this.createSkill({name:u.name,description:u.description,content:h,installName:e.name,sourceUrl:e.artifactUrl,metadata:u.metadata,files:m,indexEntry:e.indexEntry})}let o=this.extractArchive(l,e.artifactUrl,n),i=o.get("SKILL.md");if(!i)return null;let a=typeof i=="string"?i:new TextDecoder().decode(i);o.set("SKILL.md",a);let{data:r}=b$1(a);return typeof r.name!="string"||typeof r.description!="string"?null:this.createSkill({name:r.name,description:r.description,content:a,installName:e.name,sourceUrl:e.artifactUrl,metadata:r.metadata,files:o,indexEntry:e.indexEntry})}catch{return null}}createSkill(e){return {name:d(e.name),description:d(e.description),content:e.content,installName:e.installName,sourceUrl:e.sourceUrl,metadata:e.metadata&&typeof e.metadata=="object"?e.metadata:void 0,files:e.files,indexEntry:e.indexEntry}}async fetchAllSkills(e){try{let s=await this.fetchIndexCandidates(e);for(let n of s){let l=n.entries.map(a=>this.fetchSkillByEntry(a)),i=(await Promise.all(l)).filter(a=>a!==null);if(i.length>0)return i}return []}catch{return []}}computeDigest(e){return `sha256:${createHash("sha256").update(e).digest("hex")}`}extractArchive(e,s,n){if(this.isZipArchive(e,s,n))return this.extractZip(e);if(this.isTarGzArchive(e,s,n))return this.extractTarGz(e);throw new Error("Unsupported archive format")}isZipArchive(e,s,n){return n.includes("application/zip")||s.toLowerCase().endsWith(".zip")||e[0]===80&&e[1]===75}isTarGzArchive(e,s,n){let l=s.toLowerCase();return n.includes("application/gzip")||n.includes("application/x-gzip")||l.endsWith(".tar.gz")||l.endsWith(".tgz")||e[0]===31&&e[1]===139}normalizeArchivePath(e){if(!e||e.includes("\0")||e.startsWith("/")||e.startsWith("\\")||/^[A-Za-z]:/.test(e)||e.includes("\\"))return null;let s=e.split("/").filter(Boolean);return s.length===0||s.some(n=>n==="."||n==="..")?null:s.join("/")}addArchiveFile(e,s,n,l){let o=this.normalizeArchivePath(s);if(!o)throw new Error(`Unsafe archive path: ${s}`);if(l.bytes+=n.byteLength,l.bytes>vr)throw new Error("Archive exceeds maximum unpacked size");if(e.size>=xr)throw new Error("Archive contains too many files");e.set(o,n);}extractTarGz(e){let s=gunzipSync(Buffer.from(e)),n=new Map,l={bytes:0},o=0;for(;o+512<=s.length;){let i=s.subarray(o,o+512);if(i.every(c=>c===0))break;let a=this.readTarString(i,0,100),r=this.readTarString(i,124,12).trim(),h=i[156],u=this.readTarString(i,345,155),m=u?`${u}/${a}`:a,d=Number.parseInt(r||"0",8);if(!Number.isFinite(d)||d<0)throw new Error("Invalid tar entry size");if(o+=512,h===50||h===49)throw new Error("Archive links are not supported");if(h===0||h===48){let c=s.subarray(o,o+d);this.addArchiveFile(n,m,new Uint8Array(c),l);}o+=Math.ceil(d/512)*512;}if(!n.has("SKILL.md"))throw new Error("Archive missing root SKILL.md");return n}readTarString(e,s,n){let l=e.subarray(s,s+n),o=l.indexOf(0);return new TextDecoder().decode(o>=0?l.subarray(0,o):l)}extractZip(e){let s=Buffer.from(e),n=this.findZipEndOfCentralDirectory(s);if(n<0)throw new Error("Invalid zip archive");let l=s.readUInt16LE(n+10),o=s.readUInt32LE(n+16),i=new Map,a={bytes:0},r=o;for(let h=0;h<l;h++){if(s.readUInt32LE(r)!==33639248)throw new Error("Invalid zip directory");let u=s.readUInt16LE(r+8),m=s.readUInt16LE(r+10),d=s.readUInt32LE(r+20),g=s.readUInt32LE(r+24),c=s.readUInt16LE(r+28),f=s.readUInt16LE(r+30),x=s.readUInt16LE(r+32),A=s.readUInt32LE(r+38),$=s.readUInt32LE(r+42),E=r+46,D=s.subarray(E,E+c),F=new TextDecoder(u&2048?"utf-8":void 0).decode(D);if(r=E+c+f+x,F.endsWith("/"))continue;if(u&1)throw new Error("Encrypted zip entries are not supported");let L=A>>>16&61440;if(L===40960||L===4096)throw new Error("Archive links are not supported");if(s.readUInt32LE($)!==67324752)throw new Error("Invalid zip local header");let w=s.readUInt16LE($+26),N=s.readUInt16LE($+28),U=$+30+w+N,M=s.subarray(U,U+d),G;if(m===0)G=M;else if(m===8)G=inflateRawSync(M);else throw new Error(`Unsupported zip compression method: ${m}`);if(G.byteLength!==g)throw new Error("Zip entry size mismatch");this.addArchiveFile(i,F,new Uint8Array(G),a);}if(!i.has("SKILL.md"))throw new Error("Archive missing root SKILL.md");return i}findZipEndOfCentralDirectory(e){let s=Math.max(0,e.length-65535-22);for(let n=e.length-22;n>=s;n--)if(e.readUInt32LE(n)===101010256)return n;return -1}toRawUrl(e){try{let s=new URL(e);if(e.toLowerCase().endsWith("/skill.md"))return e;let n=this.WELL_KNOWN_PATHS[0],l=s.pathname.match(/\/.well-known\/(?:agent-skills|skills)\/([^/]+)\/?$/);if(l?.[1]){let i=s.pathname.replace(/\/.well-known\/(?:agent-skills|skills)\/.*$/,"");return `${s.protocol}//${s.host}${i}/${n}/${l[1]}/SKILL.md`}let o=s.pathname.replace(/\/$/,"");return `${s.protocol}//${s.host}${o}/${n}/${this.INDEX_FILE}`}catch{return e}}getSourceIdentifier(e){try{return new URL(e).hostname.replace(/^www\./,"")}catch{return "unknown"}}async hasSkillsIndex(e){return await this.fetchIndex(e)!==null}},dt=new es;var Er=".agents",mn=".skill-lock.json",Ol=3;function kn(){let t=yt(),e=Ne(),s=process.env.XDG_STATE_HOME;return s?join(s,"skills",mn):t?join(t,"skills",mn):join(e||homedir(),Er,mn)}async function Le(){let t=kn();try{let e=await readFile(t,"utf-8"),s=JSON.parse(e);return typeof s.version!="number"||!s.skills||s.version<Ol?fn():s}catch{return fn()}}async function ts(t){let e=kn();await mkdir(dirname(e),{recursive:true});let s=JSON.stringify(t,null,2);await writeFile(e,s,"utf-8");}function Cr(t){return createHash("sha256").update(t,"utf-8").digest("hex")}var hn=false;function Rr(){hn=false;}function nt(){if(process.env.GITHUB_TOKEN)return process.env.GITHUB_TOKEN;if(process.env.GH_TOKEN)return process.env.GH_TOKEN;hn||(process.stderr.write(`${k.yellow("\u2502")} ${k.yellow("GitHub rate limit reached")} \u2014 using your ${k.cyan("gh")} login to continue.
24
24
  ${k.yellow("\u2502")} ${k.dim(`Tip: set ${k.cyan("GITHUB_TOKEN")} to avoid this prompt, or use ${k.cyan("--full-depth")} to clone instead.
25
- `)}`),hn=true);try{let t=execSync("gh auth token",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(t)return t}catch{}return null}async function _r(t,e,s,n){let{fetchRepoTree:l,getSkillFolderHashFromTree:o}=await import('./chunks/blob-SJSODFTU.mjs'),i=await l(t,n,s??void 0);return i?o(i,e):null}async function xs(t,e){let s=await Le(),n=new Date().toISOString(),l=s.skills[t];s.skills[t]={...e,installedAt:l?.installedAt??n,updatedAt:n},await ts(s);}async function yn(t){let e=await Le();return t in e.skills?(delete e.skills[t],await ts(e),true):false}async function bn(t){return (await Le()).skills[t]??null}async function wn(){return (await Le()).skills}async function Ur(){let t=await Le(),e=new Map;for(let[s,n]of Object.entries(t.skills)){let l=e.get(n.source);l?l.skills.push(s):e.set(n.source,{skills:[s],entry:n});}return e}function fn(){return {version:Ol,skills:{},dismissed:{}}}async function Sn(t){return (await Le()).dismissed?.[t]===true}async function Pt(t){let e=await Le();e.dismissed||(e.dismissed={}),e.dismissed[t]=true,await ts(e);}async function As(){return (await Le()).lastSelectedAgents}async function Ls(t){let e=await Le();e.lastSelectedAgents=t,await ts(e);}var Fl={version:"0.3.2"};var Wl=t=>typeof t=="symbol",Kl="eve agent";async function Hr(t){let e=Xt(t);return e?xt(e.owner,e.repo):false}function zr(t,e){return t.startsWith("git@")||t.startsWith("ssh://")?t:e}function xn(t){vs(t);}function jl(t){switch(t){case "critical":return k.red(k.bold("Critical Risk"));case "high":return k.red("High Risk");case "medium":return k.yellow("Med Risk");case "low":return k.green("Low Risk");case "safe":return k.green("Safe");default:return k.dim("--")}}function Gr(t){if(!t)return k.dim("--");let e=t.alerts??0;return e>0?k.red(`${e} alert${e!==1?"s":""}`):k.green("0 alerts")}function Dt(t,e){let s=c(t),n=Math.max(0,e-s.length);return t+" ".repeat(n)}function Br(t,e,s){if(!t)return [];if(!e.some(a=>{let r=t[a.slug];return r&&Object.keys(r).length>0}))return [];let l=Math.min(Math.max(...e.map(a=>a.displayName.length)),36),o=[],i=Dt("",l+2)+Dt(k.dim("Gen"),18)+Dt(k.dim("Socket"),18)+k.dim("Snyk");o.push(i);for(let a of e){let r=t[a.slug],h=a.displayName.length>l?a.displayName.slice(0,l-1)+"\u2026":a.displayName,u=r?.ath?jl(r.ath.risk):k.dim("--"),m=r?.socket?Gr(r.socket):k.dim("--"),d=r?.snyk?jl(r.snyk.risk):k.dim("--");o.push(Dt(k.cyan(h),l+2)+Dt(u,18)+Dt(m,18)+d);}return o.push(""),o.push(`${k.dim("Details:")} ${k.dim(`https://skills.sh/${s}`)}`),o}function Tt(t,e){let s=homedir();return t===s||t.startsWith(s+sep)?"~"+t.slice(s.length):t===e||t.startsWith(e+sep)?"."+t.slice(e.length):t}function Vr(t){let e=createHash("sha256");return e.update("SKILL.md"),e.update(t),e.digest("hex")}function fe(t,e=5){if(t.length<=e)return t.join(", ");let s=t.slice(0,e),n=t.length-e;return `${s.join(", ")} +${n} more`}function qr(t){let e=t.map(n=>k.cyan(le(n))),s=fe(e,3);return c(s).length<=80?s:`${t.length} selected skills`}function Jr(t){return `Detected an eve project. Install ${qr(t)} for your ${Kl} to use?`}function An(t){let e=[],s=[];for(let n of t)we(n)?e.push(T[n].displayName):s.push(T[n].displayName);return {universal:e,symlinked:s}}function Xr(t,e){let s=[],{universal:n,symlinked:l}=An(t);if(e==="symlink")n.length>0&&s.push(` ${k.green("universal:")} ${fe(n)}`),l.length>0&&s.push(` ${k.dim("symlink \u2192")} ${fe(l)}`);else {let o=t.map(i=>T[i].displayName);s.push(` ${k.dim("copy \u2192")} ${fe(o)}`);}return s}function Ps(t){let e=T[t.agent].displayName;return t.subagent?`${e} (${t.subagent})`:e}function Ml(t){return t.subagent?`${t.agent}:${t.subagent}`:t.agent}function Yr(t,e){let s=[];for(let n of t)if(n==="eve")for(let l of e)s.push({agent:n,subagent:l});else s.push({agent:n});return s}function Zr(t,e){let s=[],n=t.filter(a=>!a.subagent).map(a=>a.agent),l=t.filter(a=>a.subagent).map(Ps),{universal:o,symlinked:i}=An(n);if(e==="symlink")o.length>0&&s.push(` ${k.green("universal:")} ${fe(o)}`),i.length>0&&s.push(` ${k.dim("symlink \u2192")} ${fe(i)}`),l.length>0&&s.push(` ${k.dim("copy \u2192")} ${fe(l)}`);else {let a=t.map(Ps);s.push(` ${k.dim("copy \u2192")} ${fe(a)}`);}return s}function $n(t){let e=qe(),s=[...t];for(let n of e)s.includes(n)||s.push(n);return s}function Hl(t,e){let s=[],{universal:n}=An(e),o=t.filter(a=>!a.symlinkFailed&&!a.skipped&&!n.includes(a.agent)).map(a=>a.agent),i=t.filter(a=>a.symlinkFailed&&!a.skipped).map(a=>a.agent);return n.length>0&&s.push(` ${k.green("universal:")} ${fe(n)}`),o.length>0&&s.push(` ${k.dim("symlinked:")} ${fe(o)}`),i.length>0&&s.push(` ${k.yellow("copied:")} ${fe(i)}`),s}function zl(t){return y.multiselect({...t,options:t.options,message:`${t.message} ${k.dim("(space to toggle)")}`})}async function Gl(t,e){let s;try{s=await As();}catch{}let n=e.map(r=>r.value),o=["claude-code","opencode","codex"].filter(r=>n.includes(r)),i=[];s&&s.length>0&&(i=s.filter(r=>n.includes(r))),i.length===0&&(i=o);let a=await Lt({message:t,items:e,initialSelected:i,required:true});if(!Wl(a))try{await Ls(a);}catch{}return a}async function vn(t){let e=u=>!t.global||T[u].globalSkillsDir,s=qe().filter(e),n=Ht().filter(e),l=bt().filter(u=>u!=="eve"&&e(u)),o={title:"Universal (.agents/skills)",items:n.map(u=>({value:u,label:T[u].displayName})),hiddenCount:s.length-n.length},i=l.map(u=>({value:u,label:T[u].displayName,hint:t.global?T[u].globalSkillsDir:T[u].skillsDir})),a;try{a=await As();}catch{}let r=a?a.filter(u=>l.includes(u)&&!s.includes(u)):[],h=await Lt({message:"Which agents do you want to install to?",items:i,initialSelected:r,lockedSection:o});if(!Wl(h))try{await Ls(h);}catch{}return h}var Qr=Fl.version;vs(Qr);async function ea(t,e,s,n){n.start("Discovering skills from well-known endpoint...");let l=await dt.fetchAllSkills(e);l.length===0&&(n.stop(k.red("No skills found")),y.outro(k.red("No skills found at this URL. Make sure the server has a /.well-known/agent-skills/index.json or /.well-known/skills/index.json file.")),process.exit(1)),n.stop(`Found ${k.green(l.length)} skill${l.length>1?"s":""}`);for(let w of l)y.log.info(`Skill: ${k.cyan(w.installName)}`),y.log.message(k.dim(w.description)),w.files.size>1&&y.log.message(k.dim(` Files: ${Array.from(w.files.keys()).join(", ")}`));if(s.list){console.log(),y.log.step(k.bold("Available Skills"));for(let w of l)y.log.message(` ${k.cyan(w.installName)}`),y.log.message(` ${k.dim(w.description)}`),w.files.size>1&&y.log.message(` ${k.dim(`Files: ${w.files.size}`)}`);console.log(),y.outro("Run without --list to install"),process.exit(0);}let o;if(s.skill?.includes("*"))o=l,y.log.info(`Installing all ${l.length} skills`);else if(s.skill&&s.skill.length>0){if(o=l.filter(w=>s.skill.some(N=>w.installName.toLowerCase()===N.toLowerCase()||w.name.toLowerCase()===N.toLowerCase())),o.length===0){y.log.error(`No matching skills found for: ${s.skill.join(", ")}`),y.log.info("Available skills:");for(let w of l)y.log.message(` - ${w.installName}`);process.exit(1);}}else if(l.length===1){o=l;let w=l[0];y.log.info(`Skill: ${k.cyan(w.installName)}`);}else if(s.yes)o=l,y.log.info(`Installing all ${l.length} skills`);else {let w=l.map(U=>({value:U,label:U.installName,hint:U.description.length>60?U.description.slice(0,57)+"...":U.description})),N=await zl({message:"Select skills to install",options:w,required:true});y.isCancel(N)&&(y.cancel("Installation cancelled"),process.exit(0)),o=N;}let i,a=Object.keys(T);if(s.agent?.includes("*"))i=a,y.log.info(`Installing to all ${i.length} agents`);else if(s.agent&&s.agent.length>0){let w=s.agent.filter(N=>!a.includes(N));w.length>0&&(y.log.error(`Invalid agents: ${w.join(", ")}`),y.log.info(`Valid agents: ${a.join(", ")}`),process.exit(1)),i=s.agent;}else {n.start("Loading agents...");let w=await Oe(),N=Object.keys(T).length;if(n.stop(`${N} agents`),w.length===0)if(s.yes)i=a,y.log.info("Installing to all agents");else {y.log.info("Select agents to install skills to");let U=Object.entries(T).map(([G,pe])=>({value:G,label:pe.displayName})),M=await Gl("Which agents do you want to install to?",U);y.isCancel(M)&&(y.cancel("Installation cancelled"),process.exit(0)),i=M;}else if(w.length===1||s.yes)if(i=$n(w),w.length===1){let U=w[0];y.log.info(`Installing to: ${k.cyan(T[U].displayName)}`);}else y.log.info(`Installing to: ${w.map(U=>k.cyan(T[U].displayName)).join(", ")}`);else {let U=await vn({global:s.global});y.isCancel(U)&&(y.cancel("Installation cancelled"),process.exit(0)),i=U;}}let r=s.global??false,h=i.some(w=>T[w].globalSkillsDir!==void 0);if(s.global===void 0&&!s.yes&&h){let w=await y.select({message:"Installation scope",options:[{value:false,label:"Project",hint:"Install in current directory (committed with your project)"},{value:true,label:"Global",hint:"Install in home directory (available across all projects)"}]});y.isCancel(w)&&(y.cancel("Installation cancelled"),process.exit(0)),r=w;}let u=s.copy?"copy":"symlink",m=new Set(i.map(w=>T[w].skillsDir));if(!s.copy&&!s.yes&&m.size>1){let w=await y.select({message:"Installation method",options:[{value:"symlink",label:"Symlink (Recommended)",hint:"Single source of truth, easy updates"},{value:"copy",label:"Copy to all agents",hint:"Independent copies for each agent"}]});y.isCancel(w)&&(y.cancel("Installation cancelled"),process.exit(0)),u=w;}else m.size<=1&&(u="copy");let d=process.cwd(),g=[];i.map(w=>T[w].displayName);let f=await Promise.all(o.flatMap(w=>i.map(async N=>({skillName:w.installName,agent:N,installed:await Jt(w.installName,N,{global:r})})))),x=new Map;for(let{skillName:w,agent:N,installed:U}of f)x.has(w)||x.set(w,new Map),x.get(w).set(N,U);for(let w of o){g.length>0&&g.push("");let N=Je(w.installName,{global:r}),U=Tt(N,d);g.push(`${k.cyan(U)}`),g.push(...Xr(i,u)),w.files.size>1&&g.push(` ${k.dim("files:")} ${w.files.size}`);let M=x.get(w.installName),G=i.filter(pe=>M?.get(pe)).map(pe=>T[pe].displayName);G.length>0&&g.push(` ${k.yellow("overwrites:")} ${fe(G)}`);}if(console.log(),y.note(g.join(`
25
+ `)}`),hn=true);try{let t=execSync("gh auth token",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}).trim();if(t)return t}catch{}return null}async function _r(t,e,s,n){let{fetchRepoTree:l,getSkillFolderHashFromTree:o}=await import('./chunks/blob-SJSODFTU.mjs'),i=await l(t,n,s??void 0);return i?o(i,e):null}async function xs(t,e){let s=await Le(),n=new Date().toISOString(),l=s.skills[t];s.skills[t]={...e,installedAt:l?.installedAt??n,updatedAt:n},await ts(s);}async function yn(t){let e=await Le();return t in e.skills?(delete e.skills[t],await ts(e),true):false}async function bn(t){return (await Le()).skills[t]??null}async function wn(){return (await Le()).skills}async function Ur(){let t=await Le(),e=new Map;for(let[s,n]of Object.entries(t.skills)){let l=e.get(n.source);l?l.skills.push(s):e.set(n.source,{skills:[s],entry:n});}return e}function fn(){return {version:Ol,skills:{},dismissed:{}}}async function Sn(t){return (await Le()).dismissed?.[t]===true}async function Pt(t){let e=await Le();e.dismissed||(e.dismissed={}),e.dismissed[t]=true,await ts(e);}async function As(){return (await Le()).lastSelectedAgents}async function Ls(t){let e=await Le();e.lastSelectedAgents=t,await ts(e);}var Fl={version:"0.3.3"};var Wl=t=>typeof t=="symbol",Kl="eve agent";async function Hr(t){let e=Xt(t);return e?xt(e.owner,e.repo):false}function zr(t,e){return t.startsWith("git@")||t.startsWith("ssh://")?t:e}function xn(t){vs(t);}function jl(t){switch(t){case "critical":return k.red(k.bold("Critical Risk"));case "high":return k.red("High Risk");case "medium":return k.yellow("Med Risk");case "low":return k.green("Low Risk");case "safe":return k.green("Safe");default:return k.dim("--")}}function Gr(t){if(!t)return k.dim("--");let e=t.alerts??0;return e>0?k.red(`${e} alert${e!==1?"s":""}`):k.green("0 alerts")}function Dt(t,e){let s=c(t),n=Math.max(0,e-s.length);return t+" ".repeat(n)}function Br(t,e,s){if(!t)return [];if(!e.some(a=>{let r=t[a.slug];return r&&Object.keys(r).length>0}))return [];let l=Math.min(Math.max(...e.map(a=>a.displayName.length)),36),o=[],i=Dt("",l+2)+Dt(k.dim("Gen"),18)+Dt(k.dim("Socket"),18)+k.dim("Snyk");o.push(i);for(let a of e){let r=t[a.slug],h=a.displayName.length>l?a.displayName.slice(0,l-1)+"\u2026":a.displayName,u=r?.ath?jl(r.ath.risk):k.dim("--"),m=r?.socket?Gr(r.socket):k.dim("--"),d=r?.snyk?jl(r.snyk.risk):k.dim("--");o.push(Dt(k.cyan(h),l+2)+Dt(u,18)+Dt(m,18)+d);}return o.push(""),o.push(`${k.dim("Details:")} ${k.dim(`https://skills.sh/${s}`)}`),o}function Tt(t,e){let s=homedir();return t===s||t.startsWith(s+sep)?"~"+t.slice(s.length):t===e||t.startsWith(e+sep)?"."+t.slice(e.length):t}function Vr(t){let e=createHash("sha256");return e.update("SKILL.md"),e.update(t),e.digest("hex")}function fe(t,e=5){if(t.length<=e)return t.join(", ");let s=t.slice(0,e),n=t.length-e;return `${s.join(", ")} +${n} more`}function qr(t){let e=t.map(n=>k.cyan(le(n))),s=fe(e,3);return c(s).length<=80?s:`${t.length} selected skills`}function Jr(t){return `Detected an eve project. Install ${qr(t)} for your ${Kl} to use?`}function An(t){let e=[],s=[];for(let n of t)we(n)?e.push(T[n].displayName):s.push(T[n].displayName);return {universal:e,symlinked:s}}function Xr(t,e){let s=[],{universal:n,symlinked:l}=An(t);if(e==="symlink")n.length>0&&s.push(` ${k.green("universal:")} ${fe(n)}`),l.length>0&&s.push(` ${k.dim("symlink \u2192")} ${fe(l)}`);else {let o=t.map(i=>T[i].displayName);s.push(` ${k.dim("copy \u2192")} ${fe(o)}`);}return s}function Ps(t){let e=T[t.agent].displayName;return t.subagent?`${e} (${t.subagent})`:e}function Ml(t){return t.subagent?`${t.agent}:${t.subagent}`:t.agent}function Yr(t,e){let s=[];for(let n of t)if(n==="eve")for(let l of e)s.push({agent:n,subagent:l});else s.push({agent:n});return s}function Zr(t,e){let s=[],n=t.filter(a=>!a.subagent).map(a=>a.agent),l=t.filter(a=>a.subagent).map(Ps),{universal:o,symlinked:i}=An(n);if(e==="symlink")o.length>0&&s.push(` ${k.green("universal:")} ${fe(o)}`),i.length>0&&s.push(` ${k.dim("symlink \u2192")} ${fe(i)}`),l.length>0&&s.push(` ${k.dim("copy \u2192")} ${fe(l)}`);else {let a=t.map(Ps);s.push(` ${k.dim("copy \u2192")} ${fe(a)}`);}return s}function $n(t){let e=qe(),s=[...t];for(let n of e)s.includes(n)||s.push(n);return s}function Hl(t,e){let s=[],{universal:n}=An(e),o=t.filter(a=>!a.symlinkFailed&&!a.skipped&&!n.includes(a.agent)).map(a=>a.agent),i=t.filter(a=>a.symlinkFailed&&!a.skipped).map(a=>a.agent);return n.length>0&&s.push(` ${k.green("universal:")} ${fe(n)}`),o.length>0&&s.push(` ${k.dim("symlinked:")} ${fe(o)}`),i.length>0&&s.push(` ${k.yellow("copied:")} ${fe(i)}`),s}function zl(t){return y.multiselect({...t,options:t.options,message:`${t.message} ${k.dim("(space to toggle)")}`})}async function Gl(t,e){let s;try{s=await As();}catch{}let n=e.map(r=>r.value),o=["claude-code","opencode","codex"].filter(r=>n.includes(r)),i=[];s&&s.length>0&&(i=s.filter(r=>n.includes(r))),i.length===0&&(i=o);let a=await Lt({message:t,items:e,initialSelected:i,required:true});if(!Wl(a))try{await Ls(a);}catch{}return a}async function vn(t){let e=u=>!t.global||T[u].globalSkillsDir,s=qe().filter(e),n=Ht().filter(e),l=bt().filter(u=>u!=="eve"&&e(u)),o={title:"Universal (.agents/skills)",items:n.map(u=>({value:u,label:T[u].displayName})),hiddenCount:s.length-n.length},i=l.map(u=>({value:u,label:T[u].displayName,hint:t.global?T[u].globalSkillsDir:T[u].skillsDir})),a;try{a=await As();}catch{}let r=a?a.filter(u=>l.includes(u)&&!s.includes(u)):[],h=await Lt({message:"Which agents do you want to install to?",items:i,initialSelected:r,lockedSection:o});if(!Wl(h))try{await Ls(h);}catch{}return h}var Qr=Fl.version;vs(Qr);async function ea(t,e,s,n){n.start("Discovering skills from well-known endpoint...");let l=await dt.fetchAllSkills(e);l.length===0&&(n.stop(k.red("No skills found")),y.outro(k.red("No skills found at this URL. Make sure the server has a /.well-known/agent-skills/index.json or /.well-known/skills/index.json file.")),process.exit(1)),n.stop(`Found ${k.green(l.length)} skill${l.length>1?"s":""}`);for(let w of l)y.log.info(`Skill: ${k.cyan(w.installName)}`),y.log.message(k.dim(w.description)),w.files.size>1&&y.log.message(k.dim(` Files: ${Array.from(w.files.keys()).join(", ")}`));if(s.list){console.log(),y.log.step(k.bold("Available Skills"));for(let w of l)y.log.message(` ${k.cyan(w.installName)}`),y.log.message(` ${k.dim(w.description)}`),w.files.size>1&&y.log.message(` ${k.dim(`Files: ${w.files.size}`)}`);console.log(),y.outro("Run without --list to install"),process.exit(0);}let o;if(s.skill?.includes("*"))o=l,y.log.info(`Installing all ${l.length} skills`);else if(s.skill&&s.skill.length>0){if(o=l.filter(w=>s.skill.some(N=>w.installName.toLowerCase()===N.toLowerCase()||w.name.toLowerCase()===N.toLowerCase())),o.length===0){y.log.error(`No matching skills found for: ${s.skill.join(", ")}`),y.log.info("Available skills:");for(let w of l)y.log.message(` - ${w.installName}`);process.exit(1);}}else if(l.length===1){o=l;let w=l[0];y.log.info(`Skill: ${k.cyan(w.installName)}`);}else if(s.yes)o=l,y.log.info(`Installing all ${l.length} skills`);else {let w=l.map(U=>({value:U,label:U.installName,hint:U.description.length>60?U.description.slice(0,57)+"...":U.description})),N=await zl({message:"Select skills to install",options:w,required:true});y.isCancel(N)&&(y.cancel("Installation cancelled"),process.exit(0)),o=N;}let i,a=Object.keys(T);if(s.agent?.includes("*"))i=a,y.log.info(`Installing to all ${i.length} agents`);else if(s.agent&&s.agent.length>0){let w=s.agent.filter(N=>!a.includes(N));w.length>0&&(y.log.error(`Invalid agents: ${w.join(", ")}`),y.log.info(`Valid agents: ${a.join(", ")}`),process.exit(1)),i=s.agent;}else {n.start("Loading agents...");let w=await Oe(),N=Object.keys(T).length;if(n.stop(`${N} agents`),w.length===0)if(s.yes)i=a,y.log.info("Installing to all agents");else {y.log.info("Select agents to install skills to");let U=Object.entries(T).map(([G,pe])=>({value:G,label:pe.displayName})),M=await Gl("Which agents do you want to install to?",U);y.isCancel(M)&&(y.cancel("Installation cancelled"),process.exit(0)),i=M;}else if(w.length===1||s.yes)if(i=$n(w),w.length===1){let U=w[0];y.log.info(`Installing to: ${k.cyan(T[U].displayName)}`);}else y.log.info(`Installing to: ${w.map(U=>k.cyan(T[U].displayName)).join(", ")}`);else {let U=await vn({global:s.global});y.isCancel(U)&&(y.cancel("Installation cancelled"),process.exit(0)),i=U;}}let r=s.global??false,h=i.some(w=>T[w].globalSkillsDir!==void 0);if(s.global===void 0&&!s.yes&&h){let w=await y.select({message:"Installation scope",options:[{value:false,label:"Project",hint:"Install in current directory (committed with your project)"},{value:true,label:"Global",hint:"Install in home directory (available across all projects)"}]});y.isCancel(w)&&(y.cancel("Installation cancelled"),process.exit(0)),r=w;}let u=s.copy?"copy":"symlink",m=new Set(i.map(w=>T[w].skillsDir));if(!s.copy&&!s.yes&&m.size>1){let w=await y.select({message:"Installation method",options:[{value:"symlink",label:"Symlink (Recommended)",hint:"Single source of truth, easy updates"},{value:"copy",label:"Copy to all agents",hint:"Independent copies for each agent"}]});y.isCancel(w)&&(y.cancel("Installation cancelled"),process.exit(0)),u=w;}else m.size<=1&&(u="copy");let d=process.cwd(),g=[];i.map(w=>T[w].displayName);let f=await Promise.all(o.flatMap(w=>i.map(async N=>({skillName:w.installName,agent:N,installed:await Jt(w.installName,N,{global:r})})))),x=new Map;for(let{skillName:w,agent:N,installed:U}of f)x.has(w)||x.set(w,new Map),x.get(w).set(N,U);for(let w of o){g.length>0&&g.push("");let N=Je(w.installName,{global:r}),U=Tt(N,d);g.push(`${k.cyan(U)}`),g.push(...Xr(i,u)),w.files.size>1&&g.push(` ${k.dim("files:")} ${w.files.size}`);let M=x.get(w.installName),G=i.filter(pe=>M?.get(pe)).map(pe=>T[pe].displayName);G.length>0&&g.push(` ${k.yellow("overwrites:")} ${fe(G)}`);}if(console.log(),y.note(g.join(`
26
26
  `),"Installation Summary"),!s.yes){let w=await y.confirm({message:"Proceed with installation?"});(y.isCancel(w)||!w)&&(y.cancel("Installation cancelled"),process.exit(0));}let A=dt.getSourceIdentifier(e),$=Hr(A).catch(()=>null);n.start("Installing skills...");let E=[];for(let w of o)for(let N of i){let U=await en(w,N,{global:r,mode:u});E.push({skill:w.installName,agent:T[N].displayName,...U});}n.stop("Installation complete"),console.log();let D=E.filter(w=>w.success),F=E.filter(w=>!w.success),C={};for(let w of o)C[w.installName]=w.sourceUrl;if(await $!==true&&ke({event:"install",source:A,skills:o.map(w=>w.installName).join(","),agents:i.join(","),...r&&{global:"1"},skillFiles:JSON.stringify(C),sourceType:"well-known"}),D.length>0&&r){let w=new Set(D.map(N=>N.skill));for(let N of o)if(w.has(N.installName))try{await xs(N.installName,{source:A,sourceType:"well-known",sourceUrl:N.sourceUrl,skillFolderHash:""});}catch{}}if(D.length>0&&!r){let w=new Set(D.map(N=>N.skill));for(let N of o)if(w.has(N.installName))try{let U=D.find(G=>G.skill===N.installName),M=U?.canonicalPath||U?.path;if(M){let G=await je(M);await wt(N.installName,{source:A,sourceType:"well-known",computedHash:G},d);}}catch{}}if(D.length>0){let w=new Map;for(let se of D){let te=w.get(se.skill)||[];te.push(se),w.set(se.skill,te);}let N=w.size,U=D.filter(se=>se.mode==="symlink"&&se.symlinkFailed),M=U.map(se=>se.agent),G=[];for(let[se,te]of w){let Se=te[0];if(Se.mode==="copy"){G.push(`${k.green("\u2713")} ${se} ${k.dim("(copied)")}`);for(let ge of te){let De=Tt(ge.path,d);G.push(` ${k.dim("\u2192")} ${De}`);}}else {if(Se.canonicalPath){let ge=Tt(Se.canonicalPath,d);G.push(`${k.green("\u2713")} ${ge}`);}else G.push(`${k.green("\u2713")} ${se}`);G.push(...Hl(te,i));}}let pe=k.green(`Installed ${N} skill${N!==1?"s":""}`);y.note(G.join(`
27
27
  `),pe),U.length>0&&(y.log.warn(k.yellow(`Symlinks failed for: ${fe(M)}`)),y.log.message(k.dim(" Files were copied instead. On Windows, enable Developer Mode for symlink support.")));}if(F.length>0){console.log(),y.log.error(k.red(`Failed to install ${F.length}`));for(let w of F)y.log.message(` ${k.red("\u2717")} ${w.skill} \u2192 ${w.agent}: ${k.dim(w.error)}`);}console.log(),y.outro(k.green("Done!")+k.dim(" Review skills before use; they run with full agent permissions.")),await Bl(s,i);}async function lt(t,e$1={}){let s=t[0],n=false,l=()=>{n||(y.log.message(k.dim("Tip: use the --yes (-y) and --global (-g) flags to install without prompts.")),n=true);};s||(console.log(),console.log(k.bgRed(k.white(k.bold(" ERROR ")))+" "+k.red("Missing required argument: source")),console.log(),console.log(k.dim(" Usage:")),console.log(` ${k.cyan("easbot skills add")} ${k.yellow("<source>")} ${k.dim("[options]")}`),console.log(),console.log(k.dim(" Example:")),console.log(` ${k.cyan("easbot skills add")} ${k.yellow("houjallen/agent-skills")}`),console.log(),process.exit(1)),e$1.all&&(e$1.skill=["*"],e$1.agent=["*"],e$1.yes=true);let o=await Ye();if(o.isAgent&&(e$1.yes=true,!e$1.agent||e$1.agent.length===0)){let a=Zt(o.agent.name);a&&(e$1.agent=$n([a]));}console.log(),o.isAgent||y.intro(k.bgCyan(k.black(" skills "))),o.isAgent?y.log.info(k.bgCyan(k.black(k.bold(` ${o.agent.name} `)))+" Agent detected \u2014 installing non-interactively"):process.stdin.isTTY||l();let i$1=null;try{let a=y.spinner();a.start("Parsing source...");let r=ut(s);a.stop(`Source: ${r.type==="local"?r.localPath:r.url}${r.ref?` @ ${k.yellow(r.ref)}`:""}${r.subpath?` (${r.subpath})`:""}${r.skillFilter?` ${k.dim("@")}${k.cyan(r.skillFilter)}`:""}`);let h$1=Xe(r),u=(()=>{if(!h$1)return Promise.resolve(null);let S=Xt(h$1);return S?xt(S.owner,S.repo).catch(()=>null):Promise.resolve(null)})();if(r.type==="well-known"){await ea(s,r.url,e$1,a);return}r.skillFilter&&(e$1.skill=e$1.skill||[],e$1.skill.includes(r.skillFilter)||e$1.skill.push(r.skillFilter));let m=!!(e$1.skill&&e$1.skill.length>0),d,g=null;if(r.type==="local")a.start("Validating local path..."),existsSync(r.localPath)||(a.stop(k.red("Path not found")),y.outro(k.red(`Local path does not exist: ${r.localPath}`)),process.exit(1)),a.stop("Local path validated"),a.start("Discovering skills..."),d=await ve(r.localPath,r.subpath,{includeInternal:m,fullDepth:e$1.fullDepth});else if(r.type==="github"&&!e$1.fullDepth){let S=["vercel","houjallen","heygen-com"],_=Xe(r),O=_?.split("/")[0]?.toLowerCase(),R=!!_&&Object.hasOwn(e,_.toLowerCase());_&&O&&(R||S.includes(O))&&(a.start("Fetching skills..."),g=await k$1(_,{subpath:r.subpath,skillFilter:r.skillFilter,ref:r.ref,getToken:nt,includeInternal:m}),g||a.stop(k.dim("Falling back to clone..."))),g?(d=g.skills,a.stop(`Found ${k.green(d.length)} skill${d.length>1?"s":""}`)):(a.start("Cloning repository..."),i$1=await Ke(r.url,r.ref),a.stop("Repository cloned"),a.start("Discovering skills..."),d=await ve(i$1,r.subpath,{includeInternal:m,fullDepth:e$1.fullDepth}));}else a.start("Cloning repository..."),i$1=await Ke(r.url,r.ref),a.stop("Repository cloned"),a.start("Discovering skills..."),d=await ve(i$1,r.subpath,{includeInternal:m,fullDepth:e$1.fullDepth});if(d.length===0&&(a.stop(k.red("No skills found")),y.outro(k.red("No valid skills found. Skills require a SKILL.md with name and description.")),await ye(i$1),process.exit(1)),g||a.stop(`Found ${k.green(d.length)} skill${d.length>1?"s":""}`),e$1.list){console.log(),y.log.step(k.bold("Available Skills"));let S={},_=[];for(let R of d)if(R.pluginName){let K=R.pluginName;S[K]||(S[K]=[]),S[K].push(R);}else _.push(R);let O=Object.keys(S).sort();for(let R of O){let K=R.split("-").map(H=>H.charAt(0).toUpperCase()+H.slice(1)).join(" ");console.log(k.bold(K));for(let H of S[R])y.log.message(` ${k.cyan(le(H))}`),y.log.message(` ${k.dim(H.description)}`);console.log();}if(_.length>0){O.length>0&&console.log(k.bold("General"));for(let R of _)y.log.message(` ${k.cyan(le(R))}`),y.log.message(` ${k.dim(R.description)}`);}console.log(),y.outro("Use --skill <name> to install specific skills"),await ye(i$1),process.exit(0);}let c;if(e$1.skill?.includes("*"))c=d,y.log.info(`Installing all ${d.length} skills`);else if(e$1.skill&&e$1.skill.length>0){if(c=Gt(d,e$1.skill),c.length===0){y.log.error(`No matching skills found for: ${e$1.skill.join(", ")}`),y.log.info("Available skills:");for(let S of d)y.log.message(` - ${le(S)}`);await ye(i$1),process.exit(1);}y.log.info(`Selected ${c.length} skill${c.length!==1?"s":""}: ${c.map(S=>k.cyan(le(S))).join(", ")}`);}else if(d.length===1){c=d;let S=d[0];y.log.info(`Skill: ${k.cyan(le(S))}`),y.log.message(k.dim(S.description));}else if(e$1.yes)c=d,y.log.info(`Installing all ${d.length} skills`);else {let S=[...d].sort((R,K)=>R.pluginName&&!K.pluginName?-1:!R.pluginName&&K.pluginName?1:R.pluginName&&K.pluginName&&R.pluginName!==K.pluginName?R.pluginName.localeCompare(K.pluginName):le(R).localeCompare(le(K))),_=S.some(R=>R.pluginName),O;if(_){let R=H=>H.split("-").map(J=>J.charAt(0).toUpperCase()+J.slice(1)).join(" "),K={};for(let H of S){let J=H.pluginName?R(H.pluginName):"Other";K[J]||(K[J]=[]),K[J].push({value:H,label:le(H),hint:H.description.length>60?H.description.slice(0,57)+"...":H.description});}O=await y.groupMultiselect({message:`Select skills to install ${k.dim("(space to toggle)")}`,options:K,required:!0});}else {let R=S.map(K=>({value:K,label:le(K),hint:K.description.length>60?K.description.slice(0,57)+"...":K.description}));O=await zl({message:"Select skills to install",options:R,required:!0});}y.isCancel(O)&&(y.cancel("Installation cancelled"),await ye(i$1),process.exit(0)),c=O;}let f=Xe(r),x=f?dn(f,c.map(S=>le(S))):Promise.resolve(null),A,$=Object.keys(T);if(e$1.agent?.includes("*"))A=$,y.log.info(`Installing to all ${A.length} agents`);else if(e$1.agent&&e$1.agent.length>0){let S=e$1.agent.filter(_=>!$.includes(_));S.length>0&&(y.log.error(`Invalid agents: ${S.join(", ")}`),y.log.info(`Valid agents: ${$.join(", ")}`),await ye(i$1),process.exit(1)),A=e$1.agent;}else {a.start("Loading agents...");let S=await Oe(),_=Object.keys(T).length;if(a.stop(`${_} agents`),S.includes("eve")&&(e$1.yes||!o.isAgent)){let O=e$1.yes?!0:await y.confirm({message:Jr(c),initialValue:!0});if(y.isCancel(O)&&(y.cancel("Installation cancelled"),await ye(i$1),process.exit(0)),O)A=["eve"],y.log.info(`Installing to: ${k.cyan(Kl)}`);else {let R=await vn({global:e$1.global});y.isCancel(R)&&(y.cancel("Installation cancelled"),await ye(i$1),process.exit(0)),A=R;}}else if(S.length===0)if(e$1.yes)A=$,y.log.info("Installing to all agents");else {y.log.info("Select agents to install skills to");let O=Object.entries(T).filter(([K])=>K!=="eve").map(([K,H])=>({value:K,label:H.displayName})),R=await Gl("Which agents do you want to install to?",O);y.isCancel(R)&&(y.cancel("Installation cancelled"),await ye(i$1),process.exit(0)),A=R;}else if(S.length===1||e$1.yes)if(A=$n(S),S.length===1){let O=S[0];y.log.info(`Installing to: ${k.cyan(T[O].displayName)}`);}else y.log.info(`Installing to: ${S.map(O=>k.cyan(T[O].displayName)).join(", ")}`);else {let O=await vn({global:e$1.global});y.isCancel(O)&&(y.cancel("Installation cancelled"),await ye(i$1),process.exit(0)),A=O;}}e$1.subagent&&e$1.subagent.length>0&&!A.includes("eve")&&(A=[...A,"eve"]);let E=[void 0];if(A.includes("eve")){let S=et(process.cwd());if(e$1.subagent&&e$1.subagent.length>0)E=e$1.subagent.map(_=>_==="root"||_==="."?void 0:_);else if(S.length>0&&!e$1.yes){let _=[{value:"",label:"Root agent",hint:"agent/skills"},...S.map(R=>({value:R,label:R,hint:`agent/subagents/${R}/skills`}))],O=await y.multiselect({message:"Where should Eve skills be installed?",options:_,initialValues:[""],required:!0});y.isCancel(O)&&(y.cancel("Installation cancelled"),await ye(i$1),process.exit(0)),E=O.map(R=>R===""?void 0:R);}}let D=Yr(A,E),F=e$1.global??!1,C=A.some(S=>T[S].globalSkillsDir!==void 0);if(e$1.global===void 0&&!e$1.yes&&C){let S=await y.select({message:"Installation scope",options:[{value:!1,label:"Project",hint:"Install in current directory (committed with your project)"},{value:!0,label:"Global",hint:"Install in home directory (available across all projects)"}]});y.isCancel(S)&&(y.cancel("Installation cancelled"),await ye(i$1),process.exit(0)),F=S;}let L=e$1.copy?"copy":"symlink",w=D.every(S=>S.agent==="eve"),N=new Set(D.map(S=>S.subagent?`eve:subagent:${S.subagent}`:T[S.agent].skillsDir));if(!e$1.copy&&!e$1.yes&&N.size>1&&!w){let S=await y.select({message:"Installation method",options:[{value:"symlink",label:"Symlink (Recommended)",hint:"Single source of truth, easy updates"},{value:"copy",label:"Copy to all agents",hint:"Independent copies for each agent"}]});y.isCancel(S)&&(y.cancel("Installation cancelled"),await ye(i$1),process.exit(0)),L=S;}else (N.size<=1||w)&&(L="copy");let U=process.cwd(),M=[],G=await Promise.all(c.flatMap(S=>D.map(async _=>({skillName:S.name,target:_,installed:await Jt(S.name,_.agent,{global:F,eveSubagent:_.subagent})})))),pe=new Map;for(let{skillName:S,target:_,installed:O}of G)pe.has(S)||pe.set(S,new Map),pe.get(S).set(Ml(_),O);let se={},te=[];for(let S of c)if(S.pluginName){let _=S.pluginName;se[_]||(se[_]=[]),se[_].push(S);}else te.push(S);let Se=S=>{for(let _ of S){M.length>0&&M.push("");let O=D.length===1?Je(_.name,{global:F,agent:D[0].agent,eveSubagent:D[0].subagent}):Je(_.name,{global:F}),R=Tt(O,U);M.push(`${k.cyan(R)}`),M.push(...Zr(D,L));let K=pe.get(_.name),H=D.filter(J=>K?.get(Ml(J))).map(Ps);H.length>0&&M.push(` ${k.yellow("overwrites:")} ${fe(H)}`);}},ge=Object.keys(se).sort();for(let S of ge){let _=S.split("-").map(O=>O.charAt(0).toUpperCase()+O.slice(1)).join(" ");M.push(""),M.push(k.bold(_)),Se(se[S]);}te.length>0&&(ge.length>0&&(M.push(""),M.push(k.bold("General"))),Se(te)),console.log(),y.note(M.join(`
28
28
  `),"Installation Summary");try{let S=await x;if(S&&f){let _=Br(S,c.map(O=>({slug:le(O),displayName:le(O)})),f);_.length>0&&y.note(_.join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@easbot/skills",
3
- "version": "0.3.2",
3
+ "version": "0.3.3",
4
4
  "description": "Skills management system for EAS Agent ecosystem (add / remove / list / find / update / sync / use)",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -51,9 +51,9 @@
51
51
  "xdg-basedir": "^5.1.0",
52
52
  "yaml": "^2.9.0",
53
53
  "zod": "^4.4.3",
54
- "@easbot/utils": "0.3.2",
55
- "@easbot/types": "0.3.2",
56
- "@easbot/mcp": "0.3.2"
54
+ "@easbot/utils": "0.3.3",
55
+ "@easbot/types": "0.3.3",
56
+ "@easbot/mcp": "0.3.3"
57
57
  },
58
58
  "devDependencies": {
59
59
  "@biomejs/biome": "^2.4.14",