@complexthings/superpowers-agent 8.2.2 → 8.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,13 +1,13 @@
1
1
  #!/bin/sh
2
2
  // 2>/dev/null; exec "$(command -v bun 2>/dev/null || echo node)" "$0" "$@"
3
- import{relative as Wq,dirname as Eq,join as _Q}from"path";import{existsSync as f$}from"fs";import{homedir as a$,platform as rq}from"os";import{join as I,parse as sq,dirname as l$}from"path";import{existsSync as f}from"fs";import{fileURLToPath as tq}from"url";var eq=tq(import.meta.url),E$=l$(eq),$Q=()=>{let $=a$();switch(rq()){case"darwin":return I($,"Library","Application Support","Code","User");case"win32":return I($,"AppData","Roaming","Code","User");case"linux":return I($,".config","Code","User");default:return I($,".config","Code","User")}},qQ=()=>{let $=process.cwd(),q=sq($).root;while($!==q){if(f(I($,".agents")))return $;$=l$($)}return process.cwd()},E={home:a$(),vscodeUserDir:$Q(),projectRoot:qQ(),get projectClaudeSkills(){return I(this.projectRoot,".claude","skills")},get projectAgentsSkills(){return I(this.projectRoot,".agents","skills")},get projectCopilotSkills(){return I(this.projectRoot,".copilot","skills")},get projectOpencodeSkills(){return I(this.projectRoot,".opencode","skill")},get projectCursorSkills(){return I(this.projectRoot,".cursor","skills")},get projectGeminiSkills(){return I(this.projectRoot,".gemini","skills")},get projectCodexSkills(){return I(this.projectRoot,".codex","skills")},get projectSkillsDir(){return I(this.projectRoot,"skills")},get homePersonalSkills(){return I(this.home,".agents","skills")},get homeClaudeSkills(){return I(this.home,".claude","skills")},get homeCopilotSkills(){return I(this.home,".copilot","skills")},get homeOpencodeSkills(){return I(this.home,".config","opencode","skill")},get homeCursorSkills(){return I(this.home,".cursor","skills")},get homeGeminiSkills(){return I(this.home,".gemini","skills")},get homeCodexSkills(){return I(this.home,".codex","skills")},get bootstrap(){return I(this.projectRoot,".agents","superpowers-bootstrap.md")},get superpowersRepo(){let $=I(E$,"..","..","..");if(f(I($,"skills"))&&f(I($,".agents","superpowers-agent")))return $;let q=I(E$,"..");if(f(I(q,"skills"))&&f(I(q,".agents","superpowers-agent")))return q;return I(this.home,".agents","superpowers")},get homeSuperpowersSkills(){return I(this.superpowersRepo,"skills")},get isSuperpowersRepo(){let $=I(E$,"..","..","..");if(f(I($,"skills"))&&f(I($,".agents","superpowers-agent")))return!0;let q=I(E$,"..");return f(I(q,"skills"))&&f(I(q,".agents","superpowers-agent"))}};import{readFileSync as i$}from"fs";var e=($)=>{try{let Q=i$($,"utf8").split(`
4
- `),X={name:"",description:"",whenToUse:""},Z=!1;for(let Y of Q){if(Y.trim()==="---"){if(Z)break;Z=!0;continue}if(Z){let H=Y.match(/^(\w+):\s*(.*)$/);if(H){let[,W,K]=H,z={name:"name",description:"description",when_to_use:"whenToUse"};if(z[W])X[z[W]]=K.trim()}}}return X}catch{return{name:"",description:"",whenToUse:""}}},o$=($)=>{try{let q=i$($,"utf8"),Q=e($),X=q.split(`
5
- `),Z=!1,Y=!1,H=[];for(let W of X){if(W.trim()==="---"){if(Z){Y=!0;continue}Z=!0;continue}if(Y||!Z)H.push(W)}return{content:H.join(`
6
- `).trim(),frontmatter:Q}}catch(q){throw Error(`Error reading skill file: ${q.message}`)}};import{existsSync as C$,readdirSync as t$,statSync as e$}from"fs";import{join as N$,relative as GX}from"path";import{readFileSync as QQ,existsSync as XQ}from"fs";import{join as r$}from"path";var $$=($)=>{let q=r$($,"skill.json");if(!XQ(q))return null;try{let Q=QQ(q,"utf8");return JSON.parse(Q)}catch(Q){return null}};var M$=($)=>{if($.startsWith("superpowers:"))return{type:"superpowers",path:$.substring(12).replace(/^skills\//,"")};if($.startsWith("claude:"))return{type:"claude",path:$.substring(7).replace(/^skills\//,"")};if($.startsWith("copilot:"))return{type:"copilot",path:$.substring(8).replace(/^skills\//,"")};if($.startsWith("opencode:"))return{type:"opencode",path:$.substring(9).replace(/^skills\//,"")};if($.startsWith("cursor:"))return{type:"cursor",path:$.substring(7).replace(/^skills\//,"")};if($.startsWith("gemini:"))return{type:"gemini",path:$.substring(7).replace(/^skills\//,"")};return{type:null,path:$.replace(/^skills\//,"")}},s$=($,q)=>{let Q=$$($);if(!Q||!Q.helpers||!Array.isArray(Q.helpers))return null;let X=Q.helpers,Z=q.toLowerCase(),Y=null,H=0;for(let W of X){let K=W.toLowerCase();if(K===Z){Y=W;break}if(K.includes(Z)){let G=Z.length/K.length;if(G>H)H=G,Y=W}let z=W.split("/").pop().split(".")[0].toLowerCase();if(Z.includes(z)){let G=z.length/Z.length;if(G>H)H=G,Y=W}}return Y?r$($,Y):null},q$={project:{dir:"projectAgentsSkills",prefix:""},claude:{dir:"projectClaudeSkills",prefix:"claude:"},copilot:{dir:"projectCopilotSkills",prefix:"copilot:"},opencode:{dir:"projectOpencodeSkills",prefix:"opencode:"},cursor:{dir:"projectCursorSkills",prefix:"cursor:"},gemini:{dir:"projectGeminiSkills",prefix:"gemini:"},personal:{dir:"homePersonalSkills",prefix:""},personalClaude:{dir:"homeClaudeSkills",prefix:"claude:"},personalCopilot:{dir:"homeCopilotSkills",prefix:"copilot:"},personalOpencode:{dir:"homeOpencodeSkills",prefix:"opencode:"},personalCursor:{dir:"homeCursorSkills",prefix:"cursor:"},personalGemini:{dir:"homeGeminiSkills",prefix:"gemini:"},superpowers:{dir:"homeSuperpowersSkills",prefix:"superpowers:"}};var z$=($,q,Q=null)=>{let X=[];if(!C$($))return X;let Z=(Y,H)=>{if(Q!==null&&H>Q)return;try{let W=t$(Y,{withFileTypes:!0});for(let K of W){if(K.name==="node_modules"||K.name===".git"||K.name.startsWith("."))continue;let z=N$(Y,K.name),G=K.isDirectory();if(K.isSymbolicLink())try{G=e$(z).isDirectory()}catch{continue}if(!G)continue;let _=N$(z,"SKILL.md");if(C$(_))X.push(z);if(Q===null||H<Q)Z(z,H+1)}}catch{}};return Z($,0),X};var $q=($,q)=>{if(!C$($))return[];let Q=[],X=q.toLowerCase().replace(/\\/g,"/"),Z=(Y,H="")=>{try{let W=t$(Y,{withFileTypes:!0});for(let K of W){let z=N$(Y,K.name),G=H?`${H}/${K.name}`:K.name,_=K.isDirectory();if(K.isSymbolicLink())try{_=e$(z).isDirectory()}catch{continue}if(_&&(K.name==="node_modules"||K.name===".git"||K.name.startsWith(".")))continue;if(_)Z(z,G);else if(K.name==="SKILL.md"){let V=H.toLowerCase().replace(/\\/g,"/");if(V===X||V.endsWith("/"+X)||V.endsWith(X))Q.push({file:z,path:H})}}}catch(W){}};return Z($),Q},qq=($,q,Q)=>{let X={project:"project skills (.agents/skills/)",claude:"claude skills (.claude/skills/)",copilot:"copilot skills (.copilot/skills/)",opencode:"opencode skills (.opencode/skill/)",cursor:"cursor skills (.cursor/skills/)",gemini:"gemini skills (.gemini/skills/)",personal:"personal skills (~/.agents/skills/)",personalClaude:"personal claude skills (~/.claude/skills/)",personalCopilot:"personal copilot skills (~/.copilot/skills/)",personalOpencode:"personal opencode skills (~/.config/opencode/skill/)",personalCursor:"personal cursor skills (~/.cursor/skills/)",personalGemini:"personal gemini skills (~/.gemini/skills/)",superpowers:"superpowers skills (~/.agents/superpowers/skills/)"}[Q];console.log(`Error: Multiple skills match "${$}" in ${X}:
7
- `);for(let Z of q){let H=q$[Q].prefix+Z.path;try{let W=e(Z.file),K=W.description||W.whenToUse||"(no description)";console.log(` ${H}`),console.log(` ${K}
3
+ import{relative as wQ,dirname as JQ,join as MX}from"path";import{existsSync as g$}from"fs";import{homedir as XQ,platform as qX}from"os";import{join as J,parse as HX,dirname as YQ}from"path";import{existsSync as a}from"fs";import{fileURLToPath as WX}from"url";var zX=WX(import.meta.url),L$=YQ(zX),EX=()=>{let $=XQ();switch(qX()){case"darwin":return J($,"Library","Application Support","Code","User");case"win32":return J($,"AppData","Roaming","Code","User");case"linux":return J($,".config","Code","User");default:return J($,".config","Code","User")}},KX=()=>{let $=process.cwd(),Q=HX($).root;while($!==Q){if(a(J($,".agents")))return $;$=YQ($)}return process.cwd()},z={home:XQ(),vscodeUserDir:EX(),projectRoot:KX(),get projectClaudeSkills(){return J(this.projectRoot,".claude","skills")},get projectAgentsSkills(){return J(this.projectRoot,".agents","skills")},get projectCopilotSkills(){return J(this.projectRoot,".copilot","skills")},get projectOpencodeSkills(){return J(this.projectRoot,".opencode","skill")},get projectCursorSkills(){return J(this.projectRoot,".cursor","skills")},get projectGeminiSkills(){return J(this.projectRoot,".gemini","skills")},get projectCodexSkills(){return J(this.projectRoot,".codex","skills")},get projectSkillsDir(){return J(this.projectRoot,"skills")},get homePersonalSkills(){return J(this.home,".agents","skills")},get homeClaudeSkills(){return J(this.home,".claude","skills")},get homeCopilotSkills(){return J(this.home,".copilot","skills")},get homeOpencodeSkills(){return J(this.home,".config","opencode","skill")},get homeCursorSkills(){return J(this.home,".cursor","skills")},get homeGeminiSkills(){return J(this.home,".gemini","skills")},get homeCodexSkills(){return J(this.home,".codex","skills")},get bootstrap(){return J(this.projectRoot,".agents","superpowers-bootstrap.md")},get superpowersRepo(){let $=J(L$,"..","..","..");if(a(J($,"skills"))&&a(J($,".agents","superpowers-agent")))return $;let Q=J(L$,"..");if(a(J(Q,"skills"))&&a(J(Q,".agents","superpowers-agent")))return Q;return J(this.home,".agents","superpowers")},get homeSuperpowersSkills(){return J(this.superpowersRepo,"skills")},get isSuperpowersRepo(){let $=J(L$,"..","..","..");if(a(J($,"skills"))&&a(J($,".agents","superpowers-agent")))return!0;let Q=J(L$,"..");return a(J(Q,"skills"))&&a(J(Q,".agents","superpowers-agent"))}};import{readFileSync as ZQ}from"fs";var H$=($)=>{try{let X=ZQ($,"utf8").split(`
4
+ `),Y={name:"",description:"",whenToUse:""},Z=!1;for(let q of X){if(q.trim()==="---"){if(Z)break;Z=!0;continue}if(Z){let H=q.match(/^(\w+):\s*(.*)$/);if(H){let[,W,K]=H,E={name:"name",description:"description",when_to_use:"whenToUse"};if(E[W])Y[E[W]]=K.trim()}}}return Y}catch{return{name:"",description:"",whenToUse:""}}},qQ=($)=>{try{let Q=ZQ($,"utf8"),X=H$($),Y=Q.split(`
5
+ `),Z=!1,q=!1,H=[];for(let W of Y){if(W.trim()==="---"){if(Z){q=!0;continue}Z=!0;continue}if(q||!Z)H.push(W)}return{content:H.join(`
6
+ `).trim(),frontmatter:X}}catch(Q){throw Error(`Error reading skill file: ${Q.message}`)}};import{existsSync as x$,readdirSync as zQ,statSync as EQ}from"fs";import{join as D$,relative as vY}from"path";import{readFileSync as BX,existsSync as _X}from"fs";import{join as HQ}from"path";var W$=($)=>{let Q=HQ($,"skill.json");if(!_X(Q))return null;try{let X=BX(Q,"utf8");return JSON.parse(X)}catch(X){return null}};var F$=($)=>{if($.startsWith("superpowers:"))return{type:"superpowers",path:$.substring(12).replace(/^skills\//,"")};if($.startsWith("claude:"))return{type:"claude",path:$.substring(7).replace(/^skills\//,"")};if($.startsWith("copilot:"))return{type:"copilot",path:$.substring(8).replace(/^skills\//,"")};if($.startsWith("opencode:"))return{type:"opencode",path:$.substring(9).replace(/^skills\//,"")};if($.startsWith("cursor:"))return{type:"cursor",path:$.substring(7).replace(/^skills\//,"")};if($.startsWith("gemini:"))return{type:"gemini",path:$.substring(7).replace(/^skills\//,"")};return{type:null,path:$.replace(/^skills\//,"")}},WQ=($,Q)=>{let X=W$($);if(!X||!X.helpers||!Array.isArray(X.helpers))return null;let Y=X.helpers,Z=Q.toLowerCase(),q=null,H=0;for(let W of Y){let K=W.toLowerCase();if(K===Z){q=W;break}if(K.includes(Z)){let G=Z.length/K.length;if(G>H)H=G,q=W}let E=W.split("/").pop().split(".")[0].toLowerCase();if(Z.includes(E)){let G=E.length/Z.length;if(G>H)H=G,q=W}}return q?HQ($,q):null},z$={project:{dir:"projectAgentsSkills",prefix:""},claude:{dir:"projectClaudeSkills",prefix:"claude:"},copilot:{dir:"projectCopilotSkills",prefix:"copilot:"},opencode:{dir:"projectOpencodeSkills",prefix:"opencode:"},cursor:{dir:"projectCursorSkills",prefix:"cursor:"},gemini:{dir:"projectGeminiSkills",prefix:"gemini:"},personal:{dir:"homePersonalSkills",prefix:""},personalClaude:{dir:"homeClaudeSkills",prefix:"claude:"},personalCopilot:{dir:"homeCopilotSkills",prefix:"copilot:"},personalOpencode:{dir:"homeOpencodeSkills",prefix:"opencode:"},personalCursor:{dir:"homeCursorSkills",prefix:"cursor:"},personalGemini:{dir:"homeGeminiSkills",prefix:"gemini:"},superpowers:{dir:"homeSuperpowersSkills",prefix:"superpowers:"}};var O$=($,Q,X=null)=>{let Y=[];if(!x$($))return Y;let Z=(q,H)=>{if(X!==null&&H>X)return;try{let W=zQ(q,{withFileTypes:!0});for(let K of W){if(K.name==="node_modules"||K.name===".git"||K.name.startsWith("."))continue;let E=D$(q,K.name),G=K.isDirectory();if(K.isSymbolicLink())try{G=EQ(E).isDirectory()}catch{continue}if(!G)continue;let B=D$(E,"SKILL.md");if(x$(B))Y.push(E);if(X===null||H<X)Z(E,H+1)}}catch{}};return Z($,0),Y};var KQ=($,Q)=>{if(!x$($))return[];let X=[],Y=Q.toLowerCase().replace(/\\/g,"/"),Z=(q,H="")=>{try{let W=zQ(q,{withFileTypes:!0});for(let K of W){let E=D$(q,K.name),G=H?`${H}/${K.name}`:K.name,B=K.isDirectory();if(K.isSymbolicLink())try{B=EQ(E).isDirectory()}catch{continue}if(B&&(K.name==="node_modules"||K.name===".git"||K.name.startsWith(".")))continue;if(B)Z(E,G);else if(K.name==="SKILL.md"){let V=H.toLowerCase().replace(/\\/g,"/");if(V===Y||V.endsWith("/"+Y)||V.endsWith(Y))X.push({file:E,path:H})}}}catch(W){}};return Z($),X},BQ=($,Q,X)=>{let Y={project:"project skills (.agents/skills/)",claude:"claude skills (.claude/skills/)",copilot:"copilot skills (.copilot/skills/)",opencode:"opencode skills (.opencode/skill/)",cursor:"cursor skills (.cursor/skills/)",gemini:"gemini skills (.gemini/skills/)",personal:"personal skills (~/.agents/skills/)",personalClaude:"personal claude skills (~/.claude/skills/)",personalCopilot:"personal copilot skills (~/.copilot/skills/)",personalOpencode:"personal opencode skills (~/.config/opencode/skill/)",personalCursor:"personal cursor skills (~/.cursor/skills/)",personalGemini:"personal gemini skills (~/.gemini/skills/)",superpowers:"superpowers skills (~/.agents/superpowers/skills/)"}[X];console.log(`Error: Multiple skills match "${$}" in ${Y}:
7
+ `);for(let Z of Q){let H=z$[X].prefix+Z.path;try{let W=H$(Z.file),K=W.description||W.whenToUse||"(no description)";console.log(` ${H}`),console.log(` ${K}
8
8
  `)}catch(W){console.log(` ${H}`),console.log(` (unable to read description)
9
- `)}}console.log("Please be more specific. Examples:");for(let Z of q.slice(0,2)){let Y=q$[Q].prefix;console.log(` superpowers-agent execute ${Y}${Z.path}`)}};import{existsSync as F$}from"fs";import{join as YQ,relative as ZQ}from"path";var HQ=($)=>{let{type:q,path:Q}=M$($),X={superpowers:[E.homeSuperpowersSkills],claude:[E.projectClaudeSkills,E.homeClaudeSkills],copilot:[E.projectCopilotSkills,E.homeCopilotSkills],opencode:[E.projectOpencodeSkills,E.homeOpencodeSkills],gemini:[E.projectGeminiSkills,E.homeGeminiSkills],project:[E.projectAgentsSkills],personal:[E.homePersonalSkills]},Z;if(q)Z=(X[q]||[]).map((H)=>({type:q,dir:H}));else if(E.isSuperpowersRepo&&F$(E.projectSkillsDir))Z=[{type:"project",dir:E.projectSkillsDir},{type:"project",dir:E.projectAgentsSkills},{type:"claude",dir:E.projectClaudeSkills},{type:"copilot",dir:E.projectCopilotSkills},{type:"opencode",dir:E.projectOpencodeSkills},{type:"gemini",dir:E.projectGeminiSkills},{type:"personal",dir:E.homePersonalSkills},{type:"personalClaude",dir:E.homeClaudeSkills},{type:"personalCopilot",dir:E.homeCopilotSkills},{type:"personalOpencode",dir:E.homeOpencodeSkills},{type:"personalGemini",dir:E.homeGeminiSkills},{type:"superpowers",dir:E.homeSuperpowersSkills}];else Z=[{type:"project",dir:E.projectAgentsSkills},{type:"claude",dir:E.projectClaudeSkills},{type:"copilot",dir:E.projectCopilotSkills},{type:"opencode",dir:E.projectOpencodeSkills},{type:"gemini",dir:E.projectGeminiSkills},{type:"personal",dir:E.homePersonalSkills},{type:"personalClaude",dir:E.homeClaudeSkills},{type:"personalCopilot",dir:E.homeCopilotSkills},{type:"personalOpencode",dir:E.homeOpencodeSkills},{type:"personalGemini",dir:E.homeGeminiSkills},{type:"superpowers",dir:E.homeSuperpowersSkills}];for(let{type:Y,dir:H}of Z){let W=$q(H,Q);if(W.length===1)return{skillFile:W[0].file,sourceType:Y,actualSkillPath:W[0].path};if(W.length>1)qq(Q,W,Y)}return null},m=($)=>{let q=HQ($);if(q)return q;let{type:Q,path:X}=M$($),Z={superpowers:[E.homeSuperpowersSkills],claude:[E.projectClaudeSkills,E.homeClaudeSkills],copilot:[E.projectCopilotSkills,E.homeCopilotSkills],opencode:[E.projectOpencodeSkills,E.homeOpencodeSkills],gemini:[E.projectGeminiSkills,E.homeGeminiSkills],project:[E.projectAgentsSkills],personal:[E.homePersonalSkills]},Y;if(Q)Y=(Z[Q]||[]).map((W)=>({type:Q,dir:W}));else if(E.isSuperpowersRepo&&F$(E.projectSkillsDir))Y=[{type:"project",dir:E.projectSkillsDir},{type:"project",dir:E.projectAgentsSkills},{type:"claude",dir:E.projectClaudeSkills},{type:"copilot",dir:E.projectCopilotSkills},{type:"opencode",dir:E.projectOpencodeSkills},{type:"gemini",dir:E.projectGeminiSkills},{type:"personal",dir:E.homePersonalSkills},{type:"personalClaude",dir:E.homeClaudeSkills},{type:"personalCopilot",dir:E.homeCopilotSkills},{type:"personalOpencode",dir:E.homeOpencodeSkills},{type:"personalGemini",dir:E.homeGeminiSkills},{type:"superpowers",dir:E.homeSuperpowersSkills}];else Y=[{type:"project",dir:E.projectAgentsSkills},{type:"claude",dir:E.projectClaudeSkills},{type:"copilot",dir:E.projectCopilotSkills},{type:"opencode",dir:E.projectOpencodeSkills},{type:"gemini",dir:E.projectGeminiSkills},{type:"personal",dir:E.homePersonalSkills},{type:"personalClaude",dir:E.homeClaudeSkills},{type:"personalCopilot",dir:E.homeCopilotSkills},{type:"personalOpencode",dir:E.homeOpencodeSkills},{type:"personalGemini",dir:E.homeGeminiSkills},{type:"superpowers",dir:E.homeSuperpowersSkills}];for(let{type:H,dir:W}of Y){if(!F$(W))continue;let K=z$(W,H,null);for(let z of K){let G=$$(z);if(G&&G.aliases&&Array.isArray(G.aliases)){let _=X.toLowerCase();for(let V of G.aliases)if(V.toLowerCase()===_){let B=YQ(z,"SKILL.md"),U=ZQ(W,z);return{skillFile:B,sourceType:H,actualSkillPath:U}}}}}return null};import{readFileSync as Qq,writeFileSync as Xq,existsSync as R$}from"fs";import{join as h}from"path";import{execSync as WQ}from"child_process";var x$=()=>({auto_update:!0,last_update_check:null,last_updated_commit:null}),Q$=()=>{let $=h(E.superpowersRepo,".config.json");try{if(!R$($))return x$();let q=Qq($,"utf8");return{...x$(),...JSON.parse(q)}}catch{return x$()}},Yq=($)=>{let q=h(E.superpowersRepo,".config.json"),X={...Q$(),...$};try{Xq(q,JSON.stringify(X,null,2))}catch(Z){console.log(`Warning: couldn't save config: ${Z.message}`)}},p=($)=>{let q=$?h(E.home,".agents","config.json"):h(process.cwd(),".agents","config.json");if(!R$(q))return{};try{let Q=Qq(q,"utf8");return JSON.parse(Q)}catch(Q){return{}}},a=($,q)=>{let Q=q?h(E.home,".agents"):h(process.cwd(),".agents"),X=h(Q,"config.json");try{if(!R$(Q))WQ(`mkdir -p "${Q}"`,{stdio:"pipe"});return Xq(X,JSON.stringify($,null,2),"utf8"),!0}catch(Z){throw Error(`Failed to write config: ${Z.message}`)}},k=($=!1)=>{return p($).repositories||{}},Zq=($,q,Q)=>{let X=p(Q);if(!X.repositories)X.repositories={};X.repositories[$]=q,a(X,Q)};import{readFileSync as EQ}from"fs";import{join as D$,dirname as zQ}from"path";import{fileURLToPath as KQ}from"url";import{existsSync as Hq}from"fs";import{execSync as BQ}from"child_process";var GQ=KQ(import.meta.url),j$=zQ(GQ),R=()=>{try{let $=D$(j$,"package.json");if(!Hq($))$=D$(j$,"..","package.json");if(!Hq($))$=D$(j$,"..","..","package.json");return JSON.parse(EQ($,"utf8")).version||"0.0.0"}catch{return"0.0.0"}},D=()=>{let $=R();console.log(`^^SAV:${$}^^`)},K$=async()=>{try{let q=BQ('curl -sS "https://registry.npmjs.org/@complexthings/superpowers-agent/latest"',{encoding:"utf8",timeout:1e4}),Q=JSON.parse(q);if(!Q.version)return R();return Q.version}catch($){throw Error(`Failed to fetch remote version: ${$.message}`)}},B$=($,q)=>{let Q=$.split(".").map(Number),X=q.split(".").map(Number);for(let Z=0;Z<3;Z++){let Y=Q[Z]||0,H=X[Z]||0;if(Y>H)return!0;if(Y<H)return!1}return!1};var OQ={project:{dir:"projectAgentsSkills",prefix:""},claude:{dir:"projectClaudeSkills",prefix:"claude:"},copilot:{dir:"projectCopilotSkills",prefix:"copilot:"},opencode:{dir:"projectOpencodeSkills",prefix:"opencode:"},gemini:{dir:"projectGeminiSkills",prefix:"gemini:"},personal:{dir:"homePersonalSkills",prefix:""},personalClaude:{dir:"homeClaudeSkills",prefix:"claude:"},personalCopilot:{dir:"homeCopilotSkills",prefix:"copilot:"},personalOpencode:{dir:"homeOpencodeSkills",prefix:"opencode:"},personalGemini:{dir:"homeGeminiSkills",prefix:"gemini:"},superpowers:{dir:"homeSuperpowersSkills",prefix:"superpowers:"}},VQ=($,q)=>{let Q=_Q($,"SKILL.md"),{dir:X,prefix:Z}=OQ[q],Y=Wq(E[X],$).replace(/\\/g,"/");console.log(`${Z}${Y}`);let{description:H,whenToUse:W}=e(Q);if(H)console.log(` ${H}`);if(W)console.log(` When to use: ${W}`);console.log("")},l=()=>{D();let $=new Set,q=[{type:"project",dir:E.projectAgentsSkills,maxDepth:null},{type:"claude",dir:E.projectClaudeSkills,maxDepth:null},{type:"copilot",dir:E.projectCopilotSkills,maxDepth:null},{type:"opencode",dir:E.projectOpencodeSkills,maxDepth:null},{type:"gemini",dir:E.projectGeminiSkills,maxDepth:null},{type:"personal",dir:E.homePersonalSkills,maxDepth:null},{type:"personalClaude",dir:E.homeClaudeSkills,maxDepth:null},{type:"personalCopilot",dir:E.homeCopilotSkills,maxDepth:null},{type:"personalOpencode",dir:E.homeOpencodeSkills,maxDepth:null},{type:"personalGemini",dir:E.homeGeminiSkills,maxDepth:null},{type:"superpowers",dir:E.homeSuperpowersSkills,maxDepth:null}];for(let{type:Q,dir:X,maxDepth:Z}of q){let Y=z$(X,Q,Z);for(let H of Y){let W=Wq(X,H);if(!$.has(W))$.add(W),VQ(H,Q)}}console.log(`Usage:
10
- superpowers-agent execute <skill-name> # Load a specific skill`)},zq=()=>{D();let $=process.argv[3];if(!$){console.log(`Usage: superpowers-agent execute <skill-name-or-alias>
9
+ `)}}console.log("Please be more specific. Examples:");for(let Z of Q.slice(0,2)){let q=z$[X].prefix;console.log(` superpowers-agent execute ${q}${Z.path}`)}};import{existsSync as R$}from"fs";import{join as VX,relative as GX}from"path";var LX=($)=>{let{type:Q,path:X}=F$($),Y={superpowers:[z.homeSuperpowersSkills],claude:[z.projectClaudeSkills,z.homeClaudeSkills],copilot:[z.projectCopilotSkills,z.homeCopilotSkills],opencode:[z.projectOpencodeSkills,z.homeOpencodeSkills],gemini:[z.projectGeminiSkills,z.homeGeminiSkills],project:[z.projectAgentsSkills],personal:[z.homePersonalSkills]},Z;if(Q)Z=(Y[Q]||[]).map((H)=>({type:Q,dir:H}));else if(z.isSuperpowersRepo&&R$(z.projectSkillsDir))Z=[{type:"project",dir:z.projectSkillsDir},{type:"project",dir:z.projectAgentsSkills},{type:"claude",dir:z.projectClaudeSkills},{type:"copilot",dir:z.projectCopilotSkills},{type:"opencode",dir:z.projectOpencodeSkills},{type:"gemini",dir:z.projectGeminiSkills},{type:"personal",dir:z.homePersonalSkills},{type:"personalClaude",dir:z.homeClaudeSkills},{type:"personalCopilot",dir:z.homeCopilotSkills},{type:"personalOpencode",dir:z.homeOpencodeSkills},{type:"personalGemini",dir:z.homeGeminiSkills},{type:"superpowers",dir:z.homeSuperpowersSkills}];else Z=[{type:"project",dir:z.projectAgentsSkills},{type:"claude",dir:z.projectClaudeSkills},{type:"copilot",dir:z.projectCopilotSkills},{type:"opencode",dir:z.projectOpencodeSkills},{type:"gemini",dir:z.projectGeminiSkills},{type:"personal",dir:z.homePersonalSkills},{type:"personalClaude",dir:z.homeClaudeSkills},{type:"personalCopilot",dir:z.homeCopilotSkills},{type:"personalOpencode",dir:z.homeOpencodeSkills},{type:"personalGemini",dir:z.homeGeminiSkills},{type:"superpowers",dir:z.homeSuperpowersSkills}];for(let{type:q,dir:H}of Z){let W=KQ(H,X);if(W.length===1)return{skillFile:W[0].file,sourceType:q,actualSkillPath:W[0].path};if(W.length>1)BQ(X,W,q)}return null},r=($)=>{let Q=LX($);if(Q)return Q;let{type:X,path:Y}=F$($),Z={superpowers:[z.homeSuperpowersSkills],claude:[z.projectClaudeSkills,z.homeClaudeSkills],copilot:[z.projectCopilotSkills,z.homeCopilotSkills],opencode:[z.projectOpencodeSkills,z.homeOpencodeSkills],gemini:[z.projectGeminiSkills,z.homeGeminiSkills],project:[z.projectAgentsSkills],personal:[z.homePersonalSkills]},q;if(X)q=(Z[X]||[]).map((W)=>({type:X,dir:W}));else if(z.isSuperpowersRepo&&R$(z.projectSkillsDir))q=[{type:"project",dir:z.projectSkillsDir},{type:"project",dir:z.projectAgentsSkills},{type:"claude",dir:z.projectClaudeSkills},{type:"copilot",dir:z.projectCopilotSkills},{type:"opencode",dir:z.projectOpencodeSkills},{type:"gemini",dir:z.projectGeminiSkills},{type:"personal",dir:z.homePersonalSkills},{type:"personalClaude",dir:z.homeClaudeSkills},{type:"personalCopilot",dir:z.homeCopilotSkills},{type:"personalOpencode",dir:z.homeOpencodeSkills},{type:"personalGemini",dir:z.homeGeminiSkills},{type:"superpowers",dir:z.homeSuperpowersSkills}];else q=[{type:"project",dir:z.projectAgentsSkills},{type:"claude",dir:z.projectClaudeSkills},{type:"copilot",dir:z.projectCopilotSkills},{type:"opencode",dir:z.projectOpencodeSkills},{type:"gemini",dir:z.projectGeminiSkills},{type:"personal",dir:z.homePersonalSkills},{type:"personalClaude",dir:z.homeClaudeSkills},{type:"personalCopilot",dir:z.homeCopilotSkills},{type:"personalOpencode",dir:z.homeOpencodeSkills},{type:"personalGemini",dir:z.homeGeminiSkills},{type:"superpowers",dir:z.homeSuperpowersSkills}];for(let{type:H,dir:W}of q){if(!R$(W))continue;let K=O$(W,H,null);for(let E of K){let G=W$(E);if(G&&G.aliases&&Array.isArray(G.aliases)){let B=Y.toLowerCase();for(let V of G.aliases)if(V.toLowerCase()===B){let _=VX(E,"SKILL.md"),w=GX(W,E);return{skillFile:_,sourceType:H,actualSkillPath:w}}}}}return null};import{readFileSync as _Q,writeFileSync as VQ,existsSync as f$}from"fs";import{join as s}from"path";import{execSync as OX}from"child_process";var j$=()=>({auto_update:!0,last_update_check:null,last_updated_commit:null}),E$=()=>{let $=s(z.superpowersRepo,".config.json");try{if(!f$($))return j$();let Q=_Q($,"utf8");return{...j$(),...JSON.parse(Q)}}catch{return j$()}},GQ=($)=>{let Q=s(z.superpowersRepo,".config.json"),Y={...E$(),...$};try{VQ(Q,JSON.stringify(Y,null,2))}catch(Z){console.log(`Warning: couldn't save config: ${Z.message}`)}},g=($)=>{let Q=$?s(z.home,".agents","config.json"):s(process.cwd(),".agents","config.json");if(!f$(Q))return{};try{let X=_Q(Q,"utf8");return JSON.parse(X)}catch(X){return{}}},m=($,Q)=>{let X=Q?s(z.home,".agents"):s(process.cwd(),".agents"),Y=s(X,"config.json");try{if(!f$(X))OX(`mkdir -p "${X}"`,{stdio:"pipe"});return VQ(Y,JSON.stringify($,null,2),"utf8"),!0}catch(Z){throw Error(`Failed to write config: ${Z.message}`)}},h=($=!1)=>{return g($).repositories||{}},LQ=($,Q,X)=>{let Y=g(X);if(!Y.repositories)Y.repositories={};Y.repositories[$]=Q,m(Y,X)};function OQ($=!0){return g($).installedSkills||{}}function P$($,Q=!0){let X=g(Q);if(X.installedSkills)delete X.installedSkills[$];m(X,Q)}function UQ(){return g(!0).installedAgents||{}}import{readFileSync as UX}from"fs";import{join as y$,dirname as IX}from"path";import{fileURLToPath as wX}from"url";import{existsSync as IQ}from"fs";import{execSync as JX}from"child_process";var TX=wX(import.meta.url),S$=IX(TX),d=()=>{try{let $=y$(S$,"package.json");if(!IQ($))$=y$(S$,"..","package.json");if(!IQ($))$=y$(S$,"..","..","package.json");return JSON.parse(UX($,"utf8")).version||"0.0.0"}catch{return"0.0.0"}},p=()=>{let $=d();console.log(`^^SAV:${$}^^`)},U$=async()=>{try{let Q=JX('curl -sS "https://registry.npmjs.org/@complexthings/superpowers-agent/latest"',{encoding:"utf8",timeout:1e4}),X=JSON.parse(Q);if(!X.version)return d();return X.version}catch($){throw Error(`Failed to fetch remote version: ${$.message}`)}},I$=($,Q)=>{let X=$.split(".").map(Number),Y=Q.split(".").map(Number);for(let Z=0;Z<3;Z++){let q=X[Z]||0,H=Y[Z]||0;if(q>H)return!0;if(q<H)return!1}return!1};var vX={project:{dir:"projectAgentsSkills",prefix:""},claude:{dir:"projectClaudeSkills",prefix:"claude:"},copilot:{dir:"projectCopilotSkills",prefix:"copilot:"},opencode:{dir:"projectOpencodeSkills",prefix:"opencode:"},gemini:{dir:"projectGeminiSkills",prefix:"gemini:"},personal:{dir:"homePersonalSkills",prefix:""},personalClaude:{dir:"homeClaudeSkills",prefix:"claude:"},personalCopilot:{dir:"homeCopilotSkills",prefix:"copilot:"},personalOpencode:{dir:"homeOpencodeSkills",prefix:"opencode:"},personalGemini:{dir:"homeGeminiSkills",prefix:"gemini:"},superpowers:{dir:"homeSuperpowersSkills",prefix:"superpowers:"}},AX=($,Q)=>{let X=MX($,"SKILL.md"),{dir:Y,prefix:Z}=vX[Q],q=wQ(z[Y],$).replace(/\\/g,"/");console.log(`${Z}${q}`);let{description:H,whenToUse:W}=H$(X);if(H)console.log(` ${H}`);if(W)console.log(` When to use: ${W}`);console.log("")},t=()=>{p();let $=new Set,Q=[{type:"project",dir:z.projectAgentsSkills,maxDepth:null},{type:"claude",dir:z.projectClaudeSkills,maxDepth:null},{type:"copilot",dir:z.projectCopilotSkills,maxDepth:null},{type:"opencode",dir:z.projectOpencodeSkills,maxDepth:null},{type:"gemini",dir:z.projectGeminiSkills,maxDepth:null},{type:"personal",dir:z.homePersonalSkills,maxDepth:null},{type:"personalClaude",dir:z.homeClaudeSkills,maxDepth:null},{type:"personalCopilot",dir:z.homeCopilotSkills,maxDepth:null},{type:"personalOpencode",dir:z.homeOpencodeSkills,maxDepth:null},{type:"personalGemini",dir:z.homeGeminiSkills,maxDepth:null},{type:"superpowers",dir:z.homeSuperpowersSkills,maxDepth:null}];for(let{type:X,dir:Y,maxDepth:Z}of Q){let q=O$(Y,X,Z);for(let H of q){let W=wQ(Y,H);if(!$.has(W))$.add(W),AX(H,X)}}console.log(`Usage:
10
+ superpowers-agent execute <skill-name> # Load a specific skill`)},TQ=()=>{p();let $=process.argv[3];if(!$){console.log(`Usage: superpowers-agent execute <skill-name-or-alias>
11
11
 
12
12
  Examples:
13
13
  superpowers-agent execute brainstorming
@@ -17,26 +17,26 @@ Examples:
17
17
 
18
18
  Description:
19
19
  Instructs the agent to execute the specified skill.
20
- Supports skill aliases defined in skill.json files.`);return}let q=m($);if(!q){console.log(`Error: Skill not found: ${$}
20
+ Supports skill aliases defined in skill.json files.`);return}let Q=r($);if(!Q){console.log(`Error: Skill not found: ${$}
21
21
 
22
- Available skills:`),l();return}let{skillFile:Q,sourceType:X}=q,Z=process.cwd(),Y=Q.startsWith(Z),H=f$(E.projectAgentsSkills)||f$(E.projectClaudeSkills);if(Y)console.log(`Open this file with your Read Tool: ${Q}
22
+ Available skills:`),t();return}let{skillFile:X,sourceType:Y}=Q,Z=process.cwd(),q=X.startsWith(Z),H=g$(z.projectAgentsSkills)||g$(z.projectClaudeSkills);if(q)console.log(`Open this file with your Read Tool: ${X}
23
23
 
24
24
  <IMPORTANT>
25
25
  USE YOUR Read Tool to process this file. DO NOT use \`cat\` or print commands.
26
- </IMPORTANT>`);else if(H&&X!=="project")console.log(`Open this file with your Read Tool: ${Q}
26
+ </IMPORTANT>`);else if(H&&Y!=="project")console.log(`Open this file with your Read Tool: ${X}
27
27
 
28
28
  <IMPORTANT>
29
29
  1. Try using your Read Tool first
30
- 2. If your Read tool fails (file outside workspace), use: cat "${Q}"
30
+ 2. If your Read tool fails (file outside workspace), use: cat "${X}"
31
31
  3. Consider using workspace-local skills for better tool compatibility
32
32
  Run: superpowers-agent setup-skills
33
- </IMPORTANT>`);else console.log(`Open this file with your Read Tool: ${Q}
33
+ </IMPORTANT>`);else console.log(`Open this file with your Read Tool: ${X}
34
34
 
35
35
  <IMPORTANT>
36
36
  1. Try using your Read Tool first
37
- 2. If your Read tool fails (file outside workspace), use: cat "${Q}"
37
+ 2. If your Read tool fails (file outside workspace), use: cat "${X}"
38
38
  3. NEVER skip loading the skill content
39
- </IMPORTANT>`)},Kq=()=>{let $=process.argv[3];if(!$){console.log(`Usage: superpowers-agent path <skill-name-or-alias>
39
+ </IMPORTANT>`)},MQ=()=>{let $=process.argv[3];if(!$){console.log(`Usage: superpowers-agent path <skill-name-or-alias>
40
40
 
41
41
  Examples:
42
42
  superpowers-agent path brainstorming
@@ -46,9 +46,9 @@ Examples:
46
46
 
47
47
  Description:
48
48
  Outputs the file system path of the specified SKILL.md file.
49
- Supports skill aliases defined in skill.json files.`);return}let q=m($);if(!q){console.log(`Error: Skill not found: ${$}
49
+ Supports skill aliases defined in skill.json files.`);return}let Q=r($);if(!Q){console.log(`Error: Skill not found: ${$}
50
50
 
51
- Available skills:`),l();return}let{skillFile:Q}=q;console.log(Q)},Bq=()=>{let $=process.argv[3];if(!$){console.log(`Usage: superpowers-agent dir <skill-name>
51
+ Available skills:`),t();return}let{skillFile:X}=Q;console.log(X)},vQ=()=>{let $=process.argv[3];if(!$){console.log(`Usage: superpowers-agent dir <skill-name>
52
52
 
53
53
  Examples:
54
54
  superpowers-agent dir brainstorming
@@ -58,9 +58,9 @@ Examples:
58
58
 
59
59
  Description:
60
60
  Returns the directory path where the specified skill is located.
61
- Supports skill aliases defined in skill.json files.`);return}let q=m($);if(!q){console.log(`Error: Skill not found: ${$}
61
+ Supports skill aliases defined in skill.json files.`);return}let Q=r($);if(!Q){console.log(`Error: Skill not found: ${$}
62
62
 
63
- Available skills:`),l();return}let{skillFile:Q}=q,X=Eq(Q);console.log(X)},Gq=()=>{D();let $=process.argv[3],q=process.argv[4];if(!$||!q){console.log(`Usage: superpowers-agent get-helpers <skill-name> <helper-search-term>
63
+ Available skills:`),t();return}let{skillFile:X}=Q,Y=JQ(X);console.log(Y)},AQ=()=>{p();let $=process.argv[3],Q=process.argv[4];if(!$||!Q){console.log(`Usage: superpowers-agent get-helpers <skill-name> <helper-search-term>
64
64
 
65
65
  Examples:
66
66
  superpowers-agent get-helpers block-collection search-block
@@ -72,71 +72,71 @@ Description:
72
72
  Returns the full path to the best matching helper file.
73
73
 
74
74
  The command uses the skill's aliases if available, so you can use
75
- short names like "block-collection" instead of the full path.`);return}let Q=m($);if(!Q){console.log(`Error: Skill not found: ${$}
75
+ short names like "block-collection" instead of the full path.`);return}let X=r($);if(!X){console.log(`Error: Skill not found: ${$}
76
76
 
77
- Available skills:`),l();return}let{skillFile:X}=Q,Z=Eq(X),Y=$$(Z);if(!Y){console.log(`Error: No skill.json found for skill: ${$}
78
- Location: ${Z}`);return}if(!Y.helpers||!Array.isArray(Y.helpers)||Y.helpers.length===0){console.log(`Error: No helpers defined in skill.json for skill: ${$}
79
- Location: ${Z}`);return}let H=s$(Z,q);if(!H){console.log(`Error: No helper found matching "${q}" in skill: ${$}`),console.log(`
80
- Available helpers:`);for(let W of Y.helpers)console.log(` - ${W}`);return}if(!f$(H)){console.log(`Error: Helper file not found: ${H}
81
- Defined in skill.json but missing from filesystem`);return}console.log(H)},_q=()=>{let $=Q$();console.log("Current configuration:"),console.log(JSON.stringify($,null,2))},Oq=()=>{let $=process.argv[3],q=process.argv[4];if(!$||q===void 0){console.log(`Usage: .agents/superpowers-agent config-set <key> <value>
77
+ Available skills:`),t();return}let{skillFile:Y}=X,Z=JQ(Y),q=W$(Z);if(!q){console.log(`Error: No skill.json found for skill: ${$}
78
+ Location: ${Z}`);return}if(!q.helpers||!Array.isArray(q.helpers)||q.helpers.length===0){console.log(`Error: No helpers defined in skill.json for skill: ${$}
79
+ Location: ${Z}`);return}let H=WQ(Z,Q);if(!H){console.log(`Error: No helper found matching "${Q}" in skill: ${$}`),console.log(`
80
+ Available helpers:`);for(let W of q.helpers)console.log(` - ${W}`);return}if(!g$(H)){console.log(`Error: Helper file not found: ${H}
81
+ Defined in skill.json but missing from filesystem`);return}console.log(H)},bQ=()=>{let $=E$();console.log("Current configuration:"),console.log(JSON.stringify($,null,2))},CQ=()=>{let $=process.argv[3],Q=process.argv[4];if(!$||Q===void 0){console.log(`Usage: .agents/superpowers-agent config-set <key> <value>
82
82
 
83
83
  Available keys:
84
84
  auto_update (true/false) - Enable/disable automatic updates during bootstrap
85
85
 
86
86
  Examples:
87
87
  .agents/superpowers-agent config-set auto_update false
88
- .agents/superpowers-agent config-set auto_update true`);return}let Q=q;if(q==="true")Q=!0;else if(q==="false")Q=!1;let X={};X[$]=Q,Yq(X),console.log(`✓ Set ${$} = ${Q}`)},Vq=()=>{D();let $=k(!0),q=k(!1),Q=[];for(let[Y,H]of Object.entries($))Q.push({alias:Y,url:H,source:"global"});for(let[Y,H]of Object.entries(q)){let W=Q.findIndex((K)=>K.alias===Y);if(W>=0)Q[W]={alias:Y,url:H,source:"project"};else Q.push({alias:Y,url:H,source:"project"})}if(Q.length===0){console.log(`No repository aliases configured.
88
+ .agents/superpowers-agent config-set auto_update true`);return}let X=Q;if(Q==="true")X=!0;else if(Q==="false")X=!1;let Y={};Y[$]=X,GQ(Y),console.log(`✓ Set ${$} = ${X}`)},NQ=()=>{p();let $=h(!0),Q=h(!1),X=[];for(let[q,H]of Object.entries($))X.push({alias:q,url:H,source:"global"});for(let[q,H]of Object.entries(Q)){let W=X.findIndex((K)=>K.alias===q);if(W>=0)X[W]={alias:q,url:H,source:"project"};else X.push({alias:q,url:H,source:"project"})}if(X.length===0){console.log(`No repository aliases configured.
89
89
 
90
90
  Add a repository using:
91
- superpowers-agent add-repository <git-url> [--as=@alias]`);return}let X=Math.max(5,...Q.map((Y)=>Y.alias.length)),Z=Math.max(3,...Q.map((Y)=>Y.url.length));console.log(`Repositories:
92
- `),console.log(`${"Alias".padEnd(X)} ${"URL".padEnd(Z)} Source`);for(let Y of Q)console.log(`${Y.alias.padEnd(X)} ${Y.url.padEnd(Z)} (${Y.source})`);console.log(`
93
- Total: ${Q.length} repository alias(es)`)};var G$=async()=>{try{let $=R(),q=await K$();return{hasUpdates:B$(q,$),localVersion:$,remoteVersion:q}}catch{return{hasUpdates:!1,localVersion:R(),remoteVersion:"",error:!0}}};import{execSync as IQ}from"child_process";var P$=async({skipReinstall:$=!1}={})=>{console.log(`# Checking for Superpowers updates...
94
- `);let q=await G$();if(q.error){console.log("⚠️ Could not check for updates (network issue)");return}if(!q.hasUpdates){console.log(`✓ Already up to date (v${q.localVersion})`);return}if(console.log(`\uD83D\uDCE6 Update available: v${q.localVersion} → v${q.remoteVersion}
91
+ superpowers-agent add-repository <git-url> [--as=@alias]`);return}let Y=Math.max(5,...X.map((q)=>q.alias.length)),Z=Math.max(3,...X.map((q)=>q.url.length));console.log(`Repositories:
92
+ `),console.log(`${"Alias".padEnd(Y)} ${"URL".padEnd(Z)} Source`);for(let q of X)console.log(`${q.alias.padEnd(Y)} ${q.url.padEnd(Z)} (${q.source})`);console.log(`
93
+ Total: ${X.length} repository alias(es)`)};var w$=async()=>{try{let $=d(),Q=await U$();return{hasUpdates:I$(Q,$),localVersion:$,remoteVersion:Q}}catch{return{hasUpdates:!1,localVersion:d(),remoteVersion:"",error:!0}}};import{execSync as bX}from"child_process";var k$=async({skipReinstall:$=!1}={})=>{console.log(`# Checking for Superpowers updates...
94
+ `);let Q=await w$();if(Q.error){console.log("⚠️ Could not check for updates (network issue)");return}if(!Q.hasUpdates){console.log(`✓ Already up to date (v${Q.localVersion})`);return}if(console.log(`\uD83D\uDCE6 Update available: v${Q.localVersion} → v${Q.remoteVersion}
95
95
  `),$){console.log(" Skipping install (--no-reinstall flag set)"),console.log(` Run manually: npm install -g @complexthings/superpowers-agent
96
96
  `);return}console.log(` Installing update...
97
- `);try{IQ("npm install -g @complexthings/superpowers-agent",{stdio:"inherit"}),console.log(`
98
- ✓ Update complete!`)}catch(Q){console.log(`
99
- ✗ Update failed: ${Q.message}`),console.log(" Try running manually: npm install -g @complexthings/superpowers-agent"),process.exit(1)}},Iq=async()=>{D();let $=R();console.log(`Current version: ${$}`);try{let q=await K$();if(console.log(`Latest version: ${q}`),B$(q,$))console.log("Update available: Yes"),process.exit(1);else console.log("You are up to date"),process.exit(0)}catch(q){console.log(`Error checking for updates: ${q.message}`),process.exit(1)}},Uq=()=>{let $=R();console.log($)};import{existsSync as J,readFileSync as u,writeFileSync as s,rmSync as DQ}from"fs";import{join as v,dirname as fq,parse as r}from"path";import{execSync as F}from"child_process";import{platform as jQ}from"os";import{execSync as UQ}from"child_process";var X$=($)=>{try{return UQ(`which ${$}`,{stdio:"pipe",timeout:2000}),!0}catch{return!1}};var L={opencode:{check:()=>X$("opencode"),cli:!0,name:"OpenCode",installUrl:"https://opencode.ai/docs/installation",bootstrapCommand:"install-opencode-commands"},claude:{check:()=>X$("claude"),cli:!0,name:"Claude Code",installUrl:"https://code.claude.com/docs/en/installation",bootstrapCommand:"install-claude-commands"},gemini:{check:()=>X$("gemini"),cli:!0,name:"Gemini",installUrl:"https://cloud.google.com/gemini/docs/cli/install",bootstrapCommand:"install-gemini-commands"},codex:{check:()=>X$("codex"),cli:!0,name:"Codex",installUrl:"https://developers.openai.com/codex/docs/installation",bootstrapCommand:"install-codex-prompts"},cursor:{check:()=>!0,cli:!1,name:"Cursor",bootstrapCommand:"install-cursor-commands"},copilot:{check:()=>!0,cli:!1,name:"GitHub Copilot",bootstrapCommand:"install-copilot-prompts"}},Lq=()=>{let $=[];if(L.copilot.check())$.push("github-copilot");if(L.cursor.check())$.push("cursor");if(L.claude.check())$.push("claude-code");if(L.opencode.check())$.push("opencode");if(L.gemini.check())$.push("gemini");if(L.codex.check())$.push("codex");return $};import{existsSync as Jq,readdirSync as LQ}from"fs";import{join as i}from"path";import{execSync as _$}from"child_process";var O$=()=>{let $=i(E.superpowersRepo,"hooks","cursor"),q=i(E.home,".cursor","hooks"),Q=i($,"hooks.json"),X=i(E.home,".cursor","hooks.json");if(!Jq($)){console.log("⚠️ No Cursor hooks to install (source directory not found).");return}try{if(!Jq(q))_$(`mkdir -p "${q}"`,{stdio:"pipe"})}catch(H){console.log(`Error creating Cursor hooks directory: ${H.message}`);return}try{_$(`cp "${Q}" "${X}"`,{stdio:"pipe"}),console.log(" ✓ Installed hooks.json")}catch(H){console.log(` ✗ Failed to install hooks.json: ${H.message}`);return}let Z;try{Z=LQ($).filter((H)=>H.endsWith(".sh"))}catch(H){console.log(`Error reading hooks directory: ${H.message}`);return}if(Z.length===0){console.log("⚠️ No hook scripts found to install.");return}console.log("Installing Cursor hooks...");let Y=0;for(let H of Z)try{let W=i($,H),K=i(q,H);_$(`cp "${W}" "${K}"`,{stdio:"pipe"}),_$(`chmod +x "${K}"`,{stdio:"pipe"}),console.log(` ✓ Installed ${H}`),Y++}catch(W){console.log(` ✗ Failed to install ${H}: ${W.message}`)}if(Y>0)console.log(`
100
- ✓ Installed ${Y} hook(s) to ${q}
97
+ `);try{bX("npm install -g @complexthings/superpowers-agent",{stdio:"inherit"}),console.log(`
98
+ ✓ Update complete!`)}catch(X){console.log(`
99
+ ✗ Update failed: ${X.message}`),console.log(" Try running manually: npm install -g @complexthings/superpowers-agent"),process.exit(1)}},FQ=async()=>{p();let $=d();console.log(`Current version: ${$}`);try{let Q=await U$();if(console.log(`Latest version: ${Q}`),I$(Q,$))console.log("Update available: Yes"),process.exit(1);else console.log("You are up to date"),process.exit(0)}catch(Q){console.log(`Error checking for updates: ${Q.message}`),process.exit(1)}},xQ=()=>{let $=d();console.log($)};import{existsSync as v,readFileSync as o,writeFileSync as Y$,rmSync as dX}from"fs";import{join as A,dirname as cQ,parse as X$}from"path";import{execSync as y}from"child_process";import{platform as mX}from"os";import{execSync as CX}from"child_process";var K$=($)=>{try{return CX(`which ${$}`,{stdio:"pipe",timeout:2000}),!0}catch{return!1}};var M={opencode:{check:()=>K$("opencode"),cli:!0,name:"OpenCode",installUrl:"https://opencode.ai/docs/installation",bootstrapCommand:"install-opencode-commands"},claude:{check:()=>K$("claude"),cli:!0,name:"Claude Code",installUrl:"https://code.claude.com/docs/en/installation",bootstrapCommand:"install-claude-commands"},gemini:{check:()=>K$("gemini"),cli:!0,name:"Gemini",installUrl:"https://cloud.google.com/gemini/docs/cli/install",bootstrapCommand:"install-gemini-commands"},codex:{check:()=>K$("codex"),cli:!0,name:"Codex",installUrl:"https://developers.openai.com/codex/docs/installation",bootstrapCommand:"install-codex-prompts"},cursor:{check:()=>!0,cli:!1,name:"Cursor",bootstrapCommand:"install-cursor-commands"},copilot:{check:()=>!0,cli:!1,name:"GitHub Copilot",bootstrapCommand:"install-copilot-prompts"}},DQ=()=>{let $=[];if(M.copilot.check())$.push("github-copilot");if(M.cursor.check())$.push("cursor");if(M.claude.check())$.push("claude-code");if(M.opencode.check())$.push("opencode");if(M.gemini.check())$.push("gemini");if(M.codex.check())$.push("codex");return $};import{existsSync as RQ,readdirSync as NX}from"fs";import{join as e}from"path";import{execSync as J$}from"child_process";var T$=()=>{let $=e(z.superpowersRepo,"hooks","cursor"),Q=e(z.home,".cursor","hooks"),X=e($,"hooks.json"),Y=e(z.home,".cursor","hooks.json");if(!RQ($)){console.log("⚠️ No Cursor hooks to install (source directory not found).");return}try{if(!RQ(Q))J$(`mkdir -p "${Q}"`,{stdio:"pipe"})}catch(H){console.log(`Error creating Cursor hooks directory: ${H.message}`);return}try{J$(`cp "${X}" "${Y}"`,{stdio:"pipe"}),console.log(" ✓ Installed hooks.json")}catch(H){console.log(` ✗ Failed to install hooks.json: ${H.message}`);return}let Z;try{Z=NX($).filter((H)=>H.endsWith(".sh"))}catch(H){console.log(`Error reading hooks directory: ${H.message}`);return}if(Z.length===0){console.log("⚠️ No hook scripts found to install.");return}console.log("Installing Cursor hooks...");let q=0;for(let H of Z)try{let W=e($,H),K=e(Q,H);J$(`cp "${W}" "${K}"`,{stdio:"pipe"}),J$(`chmod +x "${K}"`,{stdio:"pipe"}),console.log(` ✓ Installed ${H}`),q++}catch(W){console.log(` ✗ Failed to install ${H}: ${W.message}`)}if(q>0)console.log(`
100
+ ✓ Installed ${q} hook(s) to ${Q}
101
101
  Cursor will now check for skills before each prompt submission
102
- Restart Cursor for hooks to take effect`)};import{existsSync as y$,readdirSync as HY,lstatSync as JQ,symlinkSync as vq,unlinkSync as vQ,mkdirSync as wQ,readlinkSync as TQ}from"fs";import{join as S$,dirname as EY}from"path";import{platform as AQ}from"os";var g$=($)=>{try{return JQ($).isSymbolicLink()}catch{return!1}},bQ=($,q)=>{try{if(!g$($))return!1;return TQ($)===q}catch{return!1}},wq=()=>{let $=S$(E.superpowersRepo,".opencode","plugins","superpowers-agent.js"),q=S$(E.home,".config","opencode","plugins"),Q=S$(q,"superpowers-agent.js");if(console.log("Installing OpenCode plugin symlink..."),!y$($))return console.log("⚠️ Source plugin not found, skipping symlink creation"),console.log(` Expected at: ${$}`),{created:!1,error:"Source plugin not found"};if(bQ(Q,$))return console.log("✓ Plugin symlink already exists and is correct"),{created:!1,existed:!0};if(y$(Q)&&!g$(Q))return console.log("⚠️ Warning: A file already exists at the destination path"),console.log(` Path: ${Q}`),console.log(" Skipping symlink creation to avoid overwriting existing file"),console.log(" To use superpowers-agent plugin, manually remove or rename the existing file"),{created:!1,error:"File already exists at destination"};if(!y$(q))try{wQ(q,{recursive:!0}),console.log(`✓ Created ${q.replace(E.home,"~")}`)}catch(Z){return console.log(`⚠️ Failed to create plugins directory: ${Z.message}`),{created:!1,error:`Failed to create directory: ${Z.message}`}}if(g$(Q))try{vQ(Q)}catch(Z){return console.log(`⚠️ Failed to remove existing symlink: ${Z.message}`),{created:!1,error:`Failed to remove existing symlink: ${Z.message}`}}let X=AQ();try{if(X==="win32")vq($,Q,"file");else vq($,Q);let Z=$.replace(E.home,"~"),Y=Q.replace(E.home,"~");return console.log(`✓ Created symlink: ${Y}`),console.log(` -> ${Z}`),{created:!0}}catch(Z){if(X==="win32"&&Z.code==="EPERM")return console.log("⚠️ Windows requires Developer Mode or admin privileges for symlinks"),console.log(" Enable Developer Mode: Settings > Update & Security > For developers"),{created:!1,error:"Windows symlink permission denied"};return console.log(`⚠️ Failed to create symlink: ${Z.message}`),{created:!1,error:`Failed to create symlink: ${Z.message}`}}};import{existsSync as A,readdirSync as Tq,lstatSync as MQ,symlinkSync as V$,unlinkSync as Aq,mkdirSync as o,readlinkSync as CQ}from"fs";import{join as O,dirname as NQ,basename as FQ}from"path";import{homedir as C,platform as bq}from"os";var Mq=[{name:"claude",parentDir:()=>O(C(),".claude"),skillsDir:()=>O(C(),".claude","skills"),superpowersTarget:"superpowers"},{name:"copilot",parentDir:()=>O(C(),".copilot"),skillsDir:()=>O(C(),".copilot","skills"),superpowersTarget:"superpowers"},{name:"opencode",parentDir:()=>O(C(),".config","opencode"),skillsDir:()=>O(C(),".config","opencode","skill"),superpowersTarget:"superpowers"},{name:"cursor",parentDir:()=>O(C(),".cursor"),skillsDir:()=>O(C(),".cursor","skills"),superpowersTarget:"superpowers"},{name:"gemini",parentDir:()=>O(C(),".gemini"),skillsDir:()=>O(C(),".gemini","skills"),superpowersTarget:"superpowers"},{name:"codex",parentDir:()=>O(C(),".codex"),skillsDir:()=>O(C(),".codex","skills"),superpowersTarget:"superpowers"}],xQ=[{name:"claude",agentDir:($)=>O($,".claude"),skillsDir:($)=>O($,".claude","skills"),detect:($)=>A(O($,".claude"))},{name:"copilot",agentDir:($)=>O($,".github"),skillsDir:($)=>O($,".github","skills"),detect:($)=>{let q=A(O($,".github")),Q=A(O($,"AGENTS.md"))||A(O($,".agents","AGENTS.md"));return q&&Q}},{name:"opencode",agentDir:($)=>O($,".opencode"),skillsDir:($)=>O($,".opencode","skill"),detect:($)=>{let q=A(O($,".opencode")),Q=A(O($,"AGENTS.md"))||A(O($,".agents","AGENTS.md"))||A(O($,".opencode","AGENTS.md"));return q&&Q}},{name:"cursor",agentDir:($)=>O($,".cursor"),skillsDir:($)=>O($,".cursor","skills"),detect:($)=>A(O($,".cursor"))},{name:"gemini",agentDir:($)=>O($,".gemini"),skillsDir:($)=>O($,".gemini","skills"),detect:($)=>{let q=A(O($,".gemini")),Q=A(O($,"GEMINI.md"))||A(O($,".agents","GEMINI.md"));return q&&Q}},{name:"codex",agentDir:($)=>O($,".codex"),skillsDir:($)=>O($,".codex","skills"),detect:($)=>{let q=A(O($,".codex")),Q=A(O($,"AGENTS.md"))||A(O($,".agents","AGENTS.md"));return q&&Q}}],I$=($)=>{try{return MQ($).isSymbolicLink()}catch{return!1}},Cq=($,q)=>{try{if(!I$($))return!1;return CQ($)===q}catch{return!1}},Y$=($,q)=>{if(!A($))return{created:!1,existed:!1,error:`Source does not exist: ${$}`};if(Cq(q,$))return{created:!1,existed:!0};if(A(q)||I$(q))if(I$(q))try{Aq(q)}catch(Z){return{created:!1,existed:!1,error:`Failed to remove existing symlink: ${Z.message}`}}else return{created:!1,existed:!1,error:`Target exists and is not a symlink: ${q}`};let Q=NQ(q);if(!A(Q))try{o(Q,{recursive:!0})}catch(Z){return{created:!1,existed:!1,error:`Failed to create parent directory: ${Z.message}`}}let X=bq();try{if(X==="win32")V$($,q,"junction");else V$($,q,"dir");return{created:!0,existed:!1}}catch(Z){if(X==="win32"&&Z.code==="EPERM")return{created:!1,existed:!1,error:"Windows requires Developer Mode or admin privileges for symlinks. Enable Developer Mode: Settings > Update & Security > For developers"};return{created:!1,existed:!1,error:`Failed to create symlink: ${Z.message}`}}};var Nq=($,q,Q="skills")=>{let X=p(!0);if(!X.symlinks)X.symlinks={};if(!X.symlinks[$])X.symlinks[$]={superpowers:null,skills:[]};if(Q==="superpowers")X.symlinks[$].superpowers=q;else{let Z=X.symlinks[$].skills||[];if(!Z.includes(q))Z.push(q),X.symlinks[$].skills=Z}a(X,!0)};var RQ=($,q={})=>{let Q=E.homeSuperpowersSkills,X=O($.skillsDir(),$.superpowersTarget),Z=Y$(Q,X);if(Z.created){Nq($.name,X,"superpowers");let Y=Q.replace(C(),"~"),H=X.replace(C(),"~");return console.log(` ✓ Created ${H} -> ${Y}`),{created:!0}}else if(Z.existed)return{created:!1,existed:!0};else if(Z.error)return console.log(` ⚠️ ${$.name} superpowers: ${Z.error}`),{created:!1,error:Z.error};return{created:!1}},Fq=($,q={})=>{let Q=E.homePersonalSkills;if(!A(Q))return{created:0,existed:0};let X;try{X=Tq(Q,{withFileTypes:!0}).filter((Y)=>Y.isDirectory()&&!Y.name.startsWith(".")).map((Y)=>Y.name)}catch{return{created:0,existed:0}}if(X.length===0)return{created:0,existed:0};let Z={created:0,existed:0,names:[]};for(let Y of X){let H=O(Q,Y),W=O($.skillsDir(),Y),K=Y$(H,W);if(K.created)Nq($.name,W,"skills"),Z.created++,Z.names.push(Y);else if(K.existed)Z.existed++;else if(K.error)console.log(` ⚠️ ${Y}: ${K.error}`)}if(Z.created>0)console.log(` ✓ Synced ${Z.created} personal skill(s): ${Z.names.join(", ")}`);return Z},xq=($={})=>{let{force:q=!1,forceAgents:Q=new Set}=$;for(let X of Mq){let Z=q||Q.has(X.name),Y=X.parentDir(),H=X.skillsDir();if(!A(Y))if(Z)try{o(Y,{recursive:!0}),console.log(`✓ Created ${Y.replace(C(),"~")}`)}catch(W){console.log(`⚠️ Failed to create ${Y.replace(C(),"~")}: ${W.message}`);continue}else{console.log(`⚠️ Skipping ${X.name} (${Y.replace(C(),"~")} not found)`),console.log(" Use --force or --force-<agent> to create directory");continue}if(!A(H))try{o(H,{recursive:!0})}catch(W){console.log(`⚠️ Failed to create skills directory for ${X.name}: ${W.message}`);continue}console.log(`${X.name}:`),RQ(X,$),Fq(X,$)}},k$=($={})=>{let{force:q=!1}=$;for(let Q of Mq){let X=Q.parentDir(),Z=Q.skillsDir();if(!A(X)){if(!q)continue;try{o(X,{recursive:!0})}catch{continue}}if(!A(Z))try{o(Z,{recursive:!0})}catch{continue}Fq(Q,$)}};var Rq=($,q=[])=>{let Q;try{Q=Tq($,{withFileTypes:!0})}catch{return q}let X=!1,Z=[];for(let Y of Q){if(!Y.isDirectory()&&Y.name==="SKILL.md")X=!0;if(Y.isDirectory()&&!Y.name.startsWith("."))Z.push(O($,Y.name))}if(X)q.push($);for(let Y of Z)Rq(Y,q);return q},Dq=()=>{let $=E.homeSuperpowersSkills,q=E.homePersonalSkills;if(!A($))return{created:0,existed:0,updated:0,errors:[`Skills directory not found: ${$}`]};if(!A(q))try{o(q,{recursive:!0})}catch(Z){return{created:0,existed:0,updated:0,errors:[`Failed to create ${q}: ${Z.message}`]}}let Q=Rq($),X={created:0,existed:0,updated:0,errors:[]};for(let Z of Q){let Y=FQ(Z),H=O(q,Y);if(Cq(H,Z)){X.existed++;continue}if(I$(H))try{Aq(H),X.updated++}catch(K){X.errors.push(`Failed to remove stale symlink ${H}: ${K.message}`);continue}else if(A(H)){X.errors.push(`Skipped ${H}: path exists and is not a symlink`);continue}let W=bq();try{if(W==="win32")V$(Z,H,"junction");else V$(Z,H,"dir");let K=H.replace(C(),"~"),z=Z.replace(C(),"~");console.log(` ✓ ${K} -> ${z}`),X.created++}catch(K){X.errors.push(`Failed to create symlink ${H}: ${K.message}`)}}return X},jq=($={})=>{let q=$.projectRoot||process.cwd(),Q=O(q,".agents","skills");if(!A(Q))return{created:0,existed:0,skipped:0,errors:[]};let X={created:0,existed:0,skipped:0,errors:[]};for(let Z of xQ){if(!Z.detect(q)){X.skipped++;continue}let Y=Z.skillsDir(q),H=Z.agentDir(q);if(!A(H)){X.skipped++;continue}let W=Y$(Q,Y);if(W.created){let K=Y.replace(q,".");console.log(` ✓ Created ${K} -> .agents/skills`),X.created++}else if(W.existed)X.existed++;else if(W.error)console.log(` ⚠️ ${Z.name}: ${W.error}`),X.errors.push({platform:Z.name,error:W.error})}return X};var fQ=()=>{let $=v(E.superpowersRepo,".agents","templates","TOOLS.md.template");if(J($))try{return u($,"utf8").trim()}catch(q){return"### Using Tools\n\nUse your native skill tool. Fallback: `superpowers-agent find-skills`"}return""},Z$=($,q,Q,X=!0)=>{let Z=J($);if(!Z&&!X)return{updated:!1,created:!1,skipped:!0};let Y=fQ(),H=q.replace(/\{\{TOOL_MAPPINGS\}\}/g,Y),W=new Date().toISOString().split("T")[0];H=H.replace(/\{\{DATE\}\}/g,W),H=H.replace(/\{\{SUPERPOWERS_PATH\}\}/g,E.superpowersRepo);let K=`<!-- SUPERPOWERS_SKILLS_START -->
102
+ Restart Cursor for hooks to take effect`)};import{existsSync as u$,readdirSync as UZ,lstatSync as FX,symlinkSync as jQ,unlinkSync as xX,mkdirSync as DX,readlinkSync as RX}from"fs";import{join as d$,dirname as wZ}from"path";import{platform as jX}from"os";var m$=($)=>{try{return FX($).isSymbolicLink()}catch{return!1}},fX=($,Q)=>{try{if(!m$($))return!1;return RX($)===Q}catch{return!1}},fQ=()=>{let $=d$(z.superpowersRepo,".opencode","plugins","superpowers-agent.js"),Q=d$(z.home,".config","opencode","plugins"),X=d$(Q,"superpowers-agent.js");if(console.log("Installing OpenCode plugin symlink..."),!u$($))return console.log("⚠️ Source plugin not found, skipping symlink creation"),console.log(` Expected at: ${$}`),{created:!1,error:"Source plugin not found"};if(fX(X,$))return console.log("✓ Plugin symlink already exists and is correct"),{created:!1,existed:!0};if(u$(X)&&!m$(X))return console.log("⚠️ Warning: A file already exists at the destination path"),console.log(` Path: ${X}`),console.log(" Skipping symlink creation to avoid overwriting existing file"),console.log(" To use superpowers-agent plugin, manually remove or rename the existing file"),{created:!1,error:"File already exists at destination"};if(!u$(Q))try{DX(Q,{recursive:!0}),console.log(`✓ Created ${Q.replace(z.home,"~")}`)}catch(Z){return console.log(`⚠️ Failed to create plugins directory: ${Z.message}`),{created:!1,error:`Failed to create directory: ${Z.message}`}}if(m$(X))try{xX(X)}catch(Z){return console.log(`⚠️ Failed to remove existing symlink: ${Z.message}`),{created:!1,error:`Failed to remove existing symlink: ${Z.message}`}}let Y=jX();try{if(Y==="win32")jQ($,X,"file");else jQ($,X);let Z=$.replace(z.home,"~"),q=X.replace(z.home,"~");return console.log(`✓ Created symlink: ${q}`),console.log(` -> ${Z}`),{created:!0}}catch(Z){if(Y==="win32"&&Z.code==="EPERM")return console.log("⚠️ Windows requires Developer Mode or admin privileges for symlinks"),console.log(" Enable Developer Mode: Settings > Update & Security > For developers"),{created:!1,error:"Windows symlink permission denied"};return console.log(`⚠️ Failed to create symlink: ${Z.message}`),{created:!1,error:`Failed to create symlink: ${Z.message}`}}};import{existsSync as C,readdirSync as PQ,lstatSync as PX,symlinkSync as M$,unlinkSync as h$,mkdirSync as $$,readlinkSync as yX}from"fs";import{join as U,dirname as SX,basename as gX}from"path";import{homedir as D,platform as yQ}from"os";var v$=[{name:"claude",parentDir:()=>U(D(),".claude"),skillsDir:()=>U(D(),".claude","skills"),superpowersTarget:"superpowers"},{name:"copilot",parentDir:()=>U(D(),".copilot"),skillsDir:()=>U(D(),".copilot","skills"),superpowersTarget:"superpowers"},{name:"opencode",parentDir:()=>U(D(),".config","opencode"),skillsDir:()=>U(D(),".config","opencode","skill"),superpowersTarget:"superpowers"},{name:"cursor",parentDir:()=>U(D(),".cursor"),skillsDir:()=>U(D(),".cursor","skills"),superpowersTarget:"superpowers"},{name:"gemini",parentDir:()=>U(D(),".gemini"),skillsDir:()=>U(D(),".gemini","skills"),superpowersTarget:"superpowers"},{name:"codex",parentDir:()=>U(D(),".codex"),skillsDir:()=>U(D(),".codex","skills"),superpowersTarget:"superpowers"}],kX=[{name:"claude",agentDir:($)=>U($,".claude"),skillsDir:($)=>U($,".claude","skills"),detect:($)=>C(U($,".claude"))},{name:"copilot",agentDir:($)=>U($,".github"),skillsDir:($)=>U($,".github","skills"),detect:($)=>{let Q=C(U($,".github")),X=C(U($,"AGENTS.md"))||C(U($,".agents","AGENTS.md"));return Q&&X}},{name:"opencode",agentDir:($)=>U($,".opencode"),skillsDir:($)=>U($,".opencode","skill"),detect:($)=>{let Q=C(U($,".opencode")),X=C(U($,"AGENTS.md"))||C(U($,".agents","AGENTS.md"))||C(U($,".opencode","AGENTS.md"));return Q&&X}},{name:"cursor",agentDir:($)=>U($,".cursor"),skillsDir:($)=>U($,".cursor","skills"),detect:($)=>C(U($,".cursor"))},{name:"gemini",agentDir:($)=>U($,".gemini"),skillsDir:($)=>U($,".gemini","skills"),detect:($)=>{let Q=C(U($,".gemini")),X=C(U($,"GEMINI.md"))||C(U($,".agents","GEMINI.md"));return Q&&X}},{name:"codex",agentDir:($)=>U($,".codex"),skillsDir:($)=>U($,".codex","skills"),detect:($)=>{let Q=C(U($,".codex")),X=C(U($,"AGENTS.md"))||C(U($,".agents","AGENTS.md"));return Q&&X}}],Q$=($)=>{try{return PX($).isSymbolicLink()}catch{return!1}},SQ=($,Q)=>{try{if(!Q$($))return!1;return yX($)===Q}catch{return!1}},B$=($,Q)=>{if(!C($))return{created:!1,existed:!1,error:`Source does not exist: ${$}`};if(SQ(Q,$))return{created:!1,existed:!0};if(C(Q)||Q$(Q))if(Q$(Q))try{h$(Q)}catch(Z){return{created:!1,existed:!1,error:`Failed to remove existing symlink: ${Z.message}`}}else return{created:!1,existed:!1,error:`Target exists and is not a symlink: ${Q}`};let X=SX(Q);if(!C(X))try{$$(X,{recursive:!0})}catch(Z){return{created:!1,existed:!1,error:`Failed to create parent directory: ${Z.message}`}}let Y=yQ();try{if(Y==="win32")M$($,Q,"junction");else M$($,Q,"dir");return{created:!0,existed:!1}}catch(Z){if(Y==="win32"&&Z.code==="EPERM")return{created:!1,existed:!1,error:"Windows requires Developer Mode or admin privileges for symlinks. Enable Developer Mode: Settings > Update & Security > For developers"};return{created:!1,existed:!1,error:`Failed to create symlink: ${Z.message}`}}},p$=($)=>{if(!C($)&&!Q$($))return{removed:!1,error:"Symlink does not exist"};if(!Q$($))return{removed:!1,error:"Target is not a symlink"};try{return h$($),{removed:!0}}catch(Q){return{removed:!1,error:`Failed to remove symlink: ${Q.message}`}}},gQ=($,Q,X="skills")=>{let Y=g(!0);if(!Y.symlinks)Y.symlinks={};if(!Y.symlinks[$])Y.symlinks[$]={superpowers:null,skills:[]};if(X==="superpowers")Y.symlinks[$].superpowers=Q;else{let Z=Y.symlinks[$].skills||[];if(!Z.includes(Q))Z.push(Q),Y.symlinks[$].skills=Z}m(Y,!0)},kQ=($,Q,X="skills")=>{let Y=g(!0);if(!Y.symlinks||!Y.symlinks[$])return;if(X==="superpowers")Y.symlinks[$].superpowers=null;else{let Z=Y.symlinks[$].skills||[];Y.symlinks[$].skills=Z.filter((q)=>q!==Q)}m(Y,!0)};var uX=($,Q={})=>{let X=z.homeSuperpowersSkills,Y=U($.skillsDir(),$.superpowersTarget),Z=B$(X,Y);if(Z.created){gQ($.name,Y,"superpowers");let q=X.replace(D(),"~"),H=Y.replace(D(),"~");return console.log(` ✓ Created ${H} -> ${q}`),{created:!0}}else if(Z.existed)return{created:!1,existed:!0};else if(Z.error)return console.log(` ⚠️ ${$.name} superpowers: ${Z.error}`),{created:!1,error:Z.error};return{created:!1}},uQ=($,Q={})=>{let X=z.homePersonalSkills;if(!C(X))return{created:0,existed:0};let Y;try{Y=PQ(X,{withFileTypes:!0}).filter((q)=>q.isDirectory()&&!q.name.startsWith(".")).map((q)=>q.name)}catch{return{created:0,existed:0}}if(Y.length===0)return{created:0,existed:0};let Z={created:0,existed:0,names:[]};for(let q of Y){let H=U(X,q),W=U($.skillsDir(),q),K=B$(H,W);if(K.created)gQ($.name,W,"skills"),Z.created++,Z.names.push(q);else if(K.existed)Z.existed++;else if(K.error)console.log(` ⚠️ ${q}: ${K.error}`)}if(Z.created>0)console.log(` ✓ Synced ${Z.created} personal skill(s): ${Z.names.join(", ")}`);return Z},dQ=($={})=>{let{force:Q=!1,forceAgents:X=new Set}=$;for(let Y of v$){let Z=Q||X.has(Y.name),q=Y.parentDir(),H=Y.skillsDir();if(!C(q))if(Z)try{$$(q,{recursive:!0}),console.log(`✓ Created ${q.replace(D(),"~")}`)}catch(W){console.log(`⚠️ Failed to create ${q.replace(D(),"~")}: ${W.message}`);continue}else{console.log(`⚠️ Skipping ${Y.name} (${q.replace(D(),"~")} not found)`),console.log(" Use --force or --force-<agent> to create directory");continue}if(!C(H))try{$$(H,{recursive:!0})}catch(W){console.log(`⚠️ Failed to create skills directory for ${Y.name}: ${W.message}`);continue}console.log(`${Y.name}:`),uX(Y,$),uQ(Y,$)}},c$=($={})=>{let{force:Q=!1}=$;for(let X of v$){let Y=X.parentDir(),Z=X.skillsDir();if(!C(Y)){if(!Q)continue;try{$$(Y,{recursive:!0})}catch{continue}}if(!C(Z))try{$$(Z,{recursive:!0})}catch{continue}uQ(X,$)}};var mQ=($,Q=[])=>{let X;try{X=PQ($,{withFileTypes:!0})}catch{return Q}let Y=!1,Z=[];for(let q of X){if(!q.isDirectory()&&q.name==="SKILL.md")Y=!0;if(q.isDirectory()&&!q.name.startsWith("."))Z.push(U($,q.name))}if(Y)Q.push($);for(let q of Z)mQ(q,Q);return Q},hQ=()=>{let $=z.homeSuperpowersSkills,Q=z.homePersonalSkills;if(!C($))return{created:0,existed:0,updated:0,errors:[`Skills directory not found: ${$}`]};if(!C(Q))try{$$(Q,{recursive:!0})}catch(Z){return{created:0,existed:0,updated:0,errors:[`Failed to create ${Q}: ${Z.message}`]}}let X=mQ($),Y={created:0,existed:0,updated:0,errors:[]};for(let Z of X){let q=gX(Z),H=U(Q,q);if(SQ(H,Z)){Y.existed++;continue}if(Q$(H))try{h$(H),Y.updated++}catch(K){Y.errors.push(`Failed to remove stale symlink ${H}: ${K.message}`);continue}else if(C(H)){Y.errors.push(`Skipped ${H}: path exists and is not a symlink`);continue}let W=yQ();try{if(W==="win32")M$(Z,H,"junction");else M$(Z,H,"dir");let K=H.replace(D(),"~"),E=Z.replace(D(),"~");console.log(` ✓ ${K} -> ${E}`),Y.created++}catch(K){Y.errors.push(`Failed to create symlink ${H}: ${K.message}`)}}return Y},pQ=($={})=>{let Q=$.projectRoot||process.cwd(),X=U(Q,".agents","skills");if(!C(X))return{created:0,existed:0,skipped:0,errors:[]};let Y={created:0,existed:0,skipped:0,errors:[]};for(let Z of kX){if(!Z.detect(Q)){Y.skipped++;continue}let q=Z.skillsDir(Q),H=Z.agentDir(Q);if(!C(H)){Y.skipped++;continue}let W=B$(X,q);if(W.created){let K=q.replace(Q,".");console.log(` ✓ Created ${K} -> .agents/skills`),Y.created++}else if(W.existed)Y.existed++;else if(W.error)console.log(` ⚠️ ${Z.name}: ${W.error}`),Y.errors.push({platform:Z.name,error:W.error})}return Y};var hX=()=>{let $=A(z.superpowersRepo,".agents","templates","TOOLS.md.template");if(v($))try{return o($,"utf8").trim()}catch(Q){return"### Using Tools\n\nUse your native skill tool. Fallback: `superpowers-agent find-skills`"}return""},_$=($,Q,X,Y=!0)=>{let Z=v($);if(!Z&&!Y)return{updated:!1,created:!1,skipped:!0};let q=hX(),H=Q.replace(/\{\{TOOL_MAPPINGS\}\}/g,q),W=new Date().toISOString().split("T")[0];H=H.replace(/\{\{DATE\}\}/g,W),H=H.replace(/\{\{SUPERPOWERS_PATH\}\}/g,z.superpowersRepo);let K=`<!-- SUPERPOWERS_SKILLS_START -->
103
103
  ${H}
104
- <!-- SUPERPOWERS_SKILLS_END -->`;if(Z){let z=new Date().toISOString().split("T")[0],G=`${$}.backup-${z}`;try{F(`cp "${$}" "${G}"`,{stdio:"pipe"})}catch(w){return{updated:!1,error:!0,message:`Failed to backup: ${w.message}`}}let _;try{_=u($,"utf8")}catch(w){return{updated:!1,error:!0,message:`Failed to read: ${w.message}`}}let V="<!-- SUPERPOWERS_SKILLS_START -->",B="<!-- SUPERPOWERS_SKILLS_END -->",U;if(_.includes(V)&&_.includes(B)){let w=new RegExp(`${V}[\\s\\S]*?${B}`,"g");U=_.replace(w,K)}else{let w=_.match(/^#\s+.+$/m);if(w){let M=_.indexOf(`
105
- `,w.index)+1;U=_.slice(0,M)+`
104
+ <!-- SUPERPOWERS_SKILLS_END -->`;if(Z){let E=new Date().toISOString().split("T")[0],G=`${$}.backup-${E}`;try{y(`cp "${$}" "${G}"`,{stdio:"pipe"})}catch(L){return{updated:!1,error:!0,message:`Failed to backup: ${L.message}`}}let B;try{B=o($,"utf8")}catch(L){return{updated:!1,error:!0,message:`Failed to read: ${L.message}`}}let V="<!-- SUPERPOWERS_SKILLS_START -->",_="<!-- SUPERPOWERS_SKILLS_END -->",w;if(B.includes(V)&&B.includes(_)){let L=new RegExp(`${V}[\\s\\S]*?${_}`,"g");w=B.replace(L,K)}else{let L=B.match(/^#\s+.+$/m);if(L){let T=B.indexOf(`
105
+ `,L.index)+1;w=B.slice(0,T)+`
106
106
  `+K+`
107
- `+_.slice(M)}else U=K+`
107
+ `+B.slice(T)}else w=K+`
108
108
 
109
- `+_}try{return s($,U,"utf8"),{updated:!0,created:!1,backup:G}}catch(w){return{updated:!1,error:!0,message:`Failed to write: ${w.message}`}}}else try{let z=fq($);if(!J(z))F(`mkdir -p "${z}"`,{stdio:"pipe"});let V=`# ${r($).base.toUpperCase()}
109
+ `+B}try{return Y$($,w,"utf8"),{updated:!0,created:!1,backup:G}}catch(L){return{updated:!1,error:!0,message:`Failed to write: ${L.message}`}}}else try{let E=cQ($);if(!v(E))y(`mkdir -p "${E}"`,{stdio:"pipe"});let V=`# ${X$($).base.toUpperCase()}
110
110
 
111
- `+K;return s($,V,"utf8"),{updated:!1,created:!0}}catch(z){return{updated:!1,created:!1,error:!0,message:`Failed to create: ${z.message}`}}},PQ=()=>{console.log("Installing Unix aliases...");let $=v(E.superpowersRepo,".agents","superpowers-agent"),q=v(E.home,".local","bin"),Q=v(q,"superpowers-agent"),X=v(q,"superpowers");if(!J($)){console.log("⚠️ superpowers-agent executable not found");return}if(!J(q))try{F(`mkdir -p "${q}"`,{stdio:"pipe"}),console.log(`✓ Created ${q}`)}catch(Y){console.log(`⚠️ Failed to create ${q}: ${Y.message}`);return}try{if(J(Q))F(`rm "${Q}"`,{stdio:"pipe"});F(`ln -s "${$}" "${Q}"`,{stdio:"pipe"}),console.log(`✓ Created symlink: superpowers-agent -> ${$}`)}catch(Y){console.log(`⚠️ Failed to create superpowers-agent symlink: ${Y.message}`)}try{if(J(X))F(`rm "${X}"`,{stdio:"pipe"});F(`ln -s "${$}" "${X}"`,{stdio:"pipe"}),console.log(`✓ Created symlink: superpowers -> ${$}`)}catch(Y){console.log(`⚠️ Failed to create superpowers symlink: ${Y.message}`)}if(!(process.env.PATH||"").includes(q))console.log(`
112
- ⚠️ Warning: ${q} is not in your PATH`),console.log(" Add this to your shell profile (~/.bashrc, ~/.zshrc, etc.):"),console.log(` export PATH="$HOME/.local/bin:$PATH"
113
- `)},yQ=()=>{console.log("Installing Windows aliases..."),console.log("✓ Windows alias installation (implementation pending)")},u$=()=>{let $=jQ();if(console.log(`## Installing Universal Aliases
114
- `),$==="win32")return yQ();else return PQ()},SQ=($)=>{let q=v(E.superpowersRepo,".github","copilot-instructions.md"),Q=v(E.superpowersRepo,"skills","meta","using-superpowers","SKILL.md"),X=v($,".github","copilot-instructions.md"),Z="<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->",Y="<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->";if(!J(q))return{error:!0,message:"Source template not found"};if(!J(Q))return{error:!0,message:"using-superpowers SKILL.md not found"};let H,W;try{H=u(q,"utf8"),W=u(Q,"utf8")}catch(G){return{error:!0,message:`Failed to read source files: ${G.message}`}}let K=H.replace("${content}",W);if(!K.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->")||!K.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->"))return{error:!0,message:"Template is missing required markers"};let z=fq(X);try{if(!J(z))F(`mkdir -p "${z}"`,{stdio:"pipe"})}catch(G){return{error:!0,message:`Failed to create .github directory: ${G.message}`}}if(J(X)){let G;try{G=u(X,"utf8")}catch(B){return{error:!0,message:`Failed to read existing file: ${B.message}`}}let _=new Date().toISOString().replace(/[:.]/g,"-"),V=`${X}.backup-${_}`;try{F(`cp "${X}" "${V}"`,{stdio:"pipe"})}catch(B){return{error:!0,message:`Failed to backup: ${B.message}`}}if(G.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->")&&G.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->")){let B=new RegExp("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->[\\s\\S]*?<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->","g"),U=G.replace(B,K.trim());try{return s(X,U,"utf8"),{updated:!0,backup:V}}catch(w){return{error:!0,message:`Failed to update: ${w.message}`}}}else{let B=G.trimEnd()+`
111
+ `+K;return Y$($,V,"utf8"),{updated:!1,created:!0}}catch(E){return{updated:!1,created:!1,error:!0,message:`Failed to create: ${E.message}`}}},pX=()=>{console.log("Installing Unix aliases...");let $=A(z.superpowersRepo,".agents","superpowers-agent"),Q=A(z.home,".local","bin"),X=A(Q,"superpowers-agent"),Y=A(Q,"superpowers");if(!v($)){console.log("⚠️ superpowers-agent executable not found");return}if(!v(Q))try{y(`mkdir -p "${Q}"`,{stdio:"pipe"}),console.log(`✓ Created ${Q}`)}catch(q){console.log(`⚠️ Failed to create ${Q}: ${q.message}`);return}try{if(v(X))y(`rm "${X}"`,{stdio:"pipe"});y(`ln -s "${$}" "${X}"`,{stdio:"pipe"}),console.log(`✓ Created symlink: superpowers-agent -> ${$}`)}catch(q){console.log(`⚠️ Failed to create superpowers-agent symlink: ${q.message}`)}try{if(v(Y))y(`rm "${Y}"`,{stdio:"pipe"});y(`ln -s "${$}" "${Y}"`,{stdio:"pipe"}),console.log(`✓ Created symlink: superpowers -> ${$}`)}catch(q){console.log(`⚠️ Failed to create superpowers symlink: ${q.message}`)}if(!(process.env.PATH||"").includes(Q))console.log(`
112
+ ⚠️ Warning: ${Q} is not in your PATH`),console.log(" Add this to your shell profile (~/.bashrc, ~/.zshrc, etc.):"),console.log(` export PATH="$HOME/.local/bin:$PATH"
113
+ `)},cX=()=>{console.log("Installing Windows aliases..."),console.log("✓ Windows alias installation (implementation pending)")},n$=()=>{let $=mX();if(console.log(`## Installing Universal Aliases
114
+ `),$==="win32")return cX();else return pX()},nX=($)=>{let Q=A(z.superpowersRepo,".github","copilot-instructions.md"),X=A(z.superpowersRepo,"skills","meta","using-superpowers","SKILL.md"),Y=A($,".github","copilot-instructions.md"),Z="<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->",q="<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->";if(!v(Q))return{error:!0,message:"Source template not found"};if(!v(X))return{error:!0,message:"using-superpowers SKILL.md not found"};let H,W;try{H=o(Q,"utf8"),W=o(X,"utf8")}catch(G){return{error:!0,message:`Failed to read source files: ${G.message}`}}let K=H.replace("${content}",W);if(!K.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->")||!K.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->"))return{error:!0,message:"Template is missing required markers"};let E=cQ(Y);try{if(!v(E))y(`mkdir -p "${E}"`,{stdio:"pipe"})}catch(G){return{error:!0,message:`Failed to create .github directory: ${G.message}`}}if(v(Y)){let G;try{G=o(Y,"utf8")}catch(_){return{error:!0,message:`Failed to read existing file: ${_.message}`}}let B=new Date().toISOString().replace(/[:.]/g,"-"),V=`${Y}.backup-${B}`;try{y(`cp "${Y}" "${V}"`,{stdio:"pipe"})}catch(_){return{error:!0,message:`Failed to backup: ${_.message}`}}if(G.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->")&&G.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->")){let _=new RegExp("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->[\\s\\S]*?<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->","g"),w=G.replace(_,K.trim());try{return Y$(Y,w,"utf8"),{updated:!0,backup:V}}catch(L){return{error:!0,message:`Failed to update: ${L.message}`}}}else{let _=G.trimEnd()+`
115
115
 
116
116
  `+K.trim()+`
117
- `;try{return s(X,B,"utf8"),{updated:!0,backup:V}}catch(U){return{error:!0,message:`Failed to append: ${U.message}`}}}}else try{return s(X,K,"utf8"),{created:!0}}catch(G){return{error:!0,message:`Failed to create: ${G.message}`}}},Pq=()=>{D(),console.log(`# Setting up Superpowers skills for this project
118
- `);let $=process.cwd(),q=v($,".agents"),Q=v(q,"skills"),X=v($,"AGENTS.md"),Z=v(q,"AGENTS.md"),Y=J(X)?X:Z,H=v(E.superpowersRepo,".agents","templates","AGENTS.md.template");if(!J(H)){console.log(`✗ Error: AGENTS.md template not found
117
+ `;try{return Y$(Y,_,"utf8"),{updated:!0,backup:V}}catch(w){return{error:!0,message:`Failed to append: ${w.message}`}}}}else try{return Y$(Y,K,"utf8"),{created:!0}}catch(G){return{error:!0,message:`Failed to create: ${G.message}`}}},nQ=()=>{p(),console.log(`# Setting up Superpowers skills for this project
118
+ `);let $=process.cwd(),Q=A($,".agents"),X=A(Q,"skills"),Y=A($,"AGENTS.md"),Z=A(Q,"AGENTS.md"),q=v(Y)?Y:Z,H=A(z.superpowersRepo,".agents","templates","AGENTS.md.template");if(!v(H)){console.log(`✗ Error: AGENTS.md template not found
119
119
  Expected at: ${H}
120
- Please update your Superpowers installation`);return}if(!J(q))try{F(`mkdir -p "${q}"`,{stdio:"pipe"}),console.log("✓ Created .agents/ directory")}catch(T){console.log(`✗ Failed to create .agents/ directory: ${T.message}`);return}else console.log("✓ .agents/ directory exists");if(!J(Q))try{F(`mkdir -p "${Q}"`,{stdio:"pipe"}),F(`touch "${v(Q,".gitkeep")}"`,{stdio:"pipe"}),console.log("✓ Created .agents/skills/ directory")}catch(T){console.log(`✗ Failed to create skills directory: ${T.message}`);return}else console.log("✓ .agents/skills/ directory exists");let W=v(q,"docs"),K=v(W,"SUPERPOWERS.md"),z=v(E.superpowersRepo,".agents","templates","SUPERPOWERS.md.template");if(!J(W))try{F(`mkdir -p "${W}"`,{stdio:"pipe"}),console.log("✓ Created .agents/docs/ directory")}catch(T){console.log(`⚠️ Failed to create docs directory: ${T.message}`)}else console.log("✓ .agents/docs/ directory exists");let G=J(Y);if(G){let T=new Date().toISOString().split("T")[0],W$=`${Y}.backup-${T}`;try{F(`cp "${Y}" "${W$}"`,{stdio:"pipe"}),console.log(`✓ Backed up existing AGENTS.md to ${r(W$).base}`)}catch(oq){console.log(`✗ Failed to backup AGENTS.md: ${oq.message}`);return}}let _;try{_=u(H,"utf8")}catch(T){console.log(`✗ Failed to read template: ${T.message}`);return}let V=R();if(_=_.replace(/\{\{VERSION\}\}/g,V),J(z))try{let T=u(z,"utf8"),W$=new Date().toISOString().split("T")[0];T=T.replace(/\{\{VERSION\}\}/g,V),T=T.replace(/\{\{DATE\}\}/g,W$),s(K,T,"utf8"),console.log("✓ Created .agents/docs/SUPERPOWERS.md")}catch(T){console.log(`⚠️ Failed to create SUPERPOWERS.md: ${T.message}`)}else console.log("⚠️ SUPERPOWERS.md.template not found");let B=[],U=v($,".github","copilot-instructions.md"),w=v(E.home,".github","copilot-instructions.md");if(J(U)||J(w)||L.copilot.check())B.push("github-copilot");let M=v($,"CLAUDE.md"),d=v(q,"CLAUDE.md");if(J(M)||J(d)||L.claude.check())B.push("claude-code");let P=v($,"GEMINI.md"),c$=v(q,"GEMINI.md");if(J(P)||J(c$)||L.gemini.check())B.push("gemini");if(L.cursor.check())B.push("cursor");if(L.opencode.check())B.push("opencode");if(L.codex.check())B.push("codex");console.log(`
121
- Detected platforms for project: ${B.join(", ")||"none"}
122
- `);let iq=B.filter((T)=>["github-copilot","cursor","opencode","codex"].includes(T)),t=Z$(Y,_,iq,!G);if(t.created)console.log(`✓ Created AGENTS.md with platform tool mappings (${Y===X?"root":".agents/"})`);else if(t.updated)console.log(`✓ Updated AGENTS.md with platform tool mappings (${Y===X?"root":".agents/"})`);else if(t.error)console.log("⚠️ Failed to update AGENTS.md");let A$=J(M)?M:d,y=Z$(A$,_,["claude-code"],!1);if(y.created)console.log(`✓ Created CLAUDE.md with Claude Code tool mappings (${A$===M?"root":".agents/"})`);else if(y.updated){if(console.log(`✓ Updated CLAUDE.md with Claude Code tool mappings (${A$===M?"root":".agents/"})`),y.backup)console.log(` Backed up to ${r(y.backup).base}`)}else if(y.skipped)console.log("ℹ️ Skipped CLAUDE.md (does not exist)");else if(y.error)console.log("⚠️ Failed to update CLAUDE.md");let b$=J(P)?P:c$,S=Z$(b$,_,["gemini"],!1);if(S.created)console.log(`✓ Created GEMINI.md with Gemini tool mappings (${b$===P?"root":".agents/"})`);else if(S.updated){if(console.log(`✓ Updated GEMINI.md with Gemini tool mappings (${b$===P?"root":".agents/"})`),S.backup)console.log(` Backed up to ${r(S.backup).base}`)}else if(S.skipped)console.log("ℹ️ Skipped GEMINI.md (does not exist)");else if(S.error)console.log("⚠️ Failed to update GEMINI.md");let H$=v($,".github","copilot-instructions.md"),j={skipped:!0};if(B.includes("github-copilot")){if(j=SQ($),j.created)console.log("✓ Created .github/copilot-instructions.md with Superpowers instructions");else if(j.updated){if(console.log("✓ Updated .github/copilot-instructions.md with Superpowers instructions"),j.backup)console.log(` Backed up to ${r(j.backup).base}`)}else if(j.error)console.log(`⚠️ Failed to update .github/copilot-instructions.md: ${j.message||""}`)}else console.log("ℹ️ Skipped .github/copilot-instructions.md (GitHub Copilot not detected)");let n$=!J(X)&&!J(Z);if(J(H$)&&n$){let T=Z$(H$,_,["github-copilot"],!1);if(T.updated){if(console.log("✓ Updated .github/copilot-instructions.md with GitHub Copilot tool mappings"),T.backup)console.log(` Backed up to ${r(T.backup).base}`)}else if(T.error)console.log("⚠️ Failed to update .github/copilot-instructions.md with tool mappings")}else if(J(H$)&&!n$)console.log("ℹ️ Skipped .github/copilot-instructions.md tool mappings (AGENTS.md exists, using that instead)");else if(!J(H$)&&!B.includes("github-copilot"))console.log("ℹ️ Skipped .github/copilot-instructions.md tool mappings (does not exist)");console.log(`
120
+ Please update your Superpowers installation`);return}if(!v(Q))try{y(`mkdir -p "${Q}"`,{stdio:"pipe"}),console.log("✓ Created .agents/ directory")}catch(b){console.log(`✗ Failed to create .agents/ directory: ${b.message}`);return}else console.log("✓ .agents/ directory exists");if(!v(X))try{y(`mkdir -p "${X}"`,{stdio:"pipe"}),y(`touch "${A(X,".gitkeep")}"`,{stdio:"pipe"}),console.log("✓ Created .agents/skills/ directory")}catch(b){console.log(`✗ Failed to create skills directory: ${b.message}`);return}else console.log("✓ .agents/skills/ directory exists");let W=A(Q,"docs"),K=A(W,"SUPERPOWERS.md"),E=A(z.superpowersRepo,".agents","templates","SUPERPOWERS.md.template");if(!v(W))try{y(`mkdir -p "${W}"`,{stdio:"pipe"}),console.log("✓ Created .agents/docs/ directory")}catch(b){console.log(`⚠️ Failed to create docs directory: ${b.message}`)}else console.log("✓ .agents/docs/ directory exists");let G=v(q);if(G){let b=new Date().toISOString().split("T")[0],G$=`${q}.backup-${b}`;try{y(`cp "${q}" "${G$}"`,{stdio:"pipe"}),console.log(`✓ Backed up existing AGENTS.md to ${X$(G$).base}`)}catch(ZX){console.log(`✗ Failed to backup AGENTS.md: ${ZX.message}`);return}}let B;try{B=o(H,"utf8")}catch(b){console.log(`✗ Failed to read template: ${b.message}`);return}let V=d();if(B=B.replace(/\{\{VERSION\}\}/g,V),v(E))try{let b=o(E,"utf8"),G$=new Date().toISOString().split("T")[0];b=b.replace(/\{\{VERSION\}\}/g,V),b=b.replace(/\{\{DATE\}\}/g,G$),Y$(K,b,"utf8"),console.log("✓ Created .agents/docs/SUPERPOWERS.md")}catch(b){console.log(`⚠️ Failed to create SUPERPOWERS.md: ${b.message}`)}else console.log("⚠️ SUPERPOWERS.md.template not found");let _=[],w=A($,".github","copilot-instructions.md"),L=A(z.home,".github","copilot-instructions.md");if(v(w)||v(L)||M.copilot.check())_.push("github-copilot");let T=A($,"CLAUDE.md"),x=A(Q,"CLAUDE.md");if(v(T)||v(x)||M.claude.check())_.push("claude-code");let f=A($,"GEMINI.md"),R=A(Q,"GEMINI.md");if(v(f)||v(R)||M.gemini.check())_.push("gemini");if(M.cursor.check())_.push("cursor");if(M.opencode.check())_.push("opencode");if(M.codex.check())_.push("codex");console.log(`
121
+ Detected platforms for project: ${_.join(", ")||"none"}
122
+ `);let QQ=_.filter((b)=>["github-copilot","cursor","opencode","codex"].includes(b)),O=_$(q,B,QQ,!G);if(O.created)console.log(`✓ Created AGENTS.md with platform tool mappings (${q===Y?"root":".agents/"})`);else if(O.updated)console.log(`✓ Updated AGENTS.md with platform tool mappings (${q===Y?"root":".agents/"})`);else if(O.error)console.log("⚠️ Failed to update AGENTS.md");let I=v(T)?T:x,P=_$(I,B,["claude-code"],!1);if(P.created)console.log(`✓ Created CLAUDE.md with Claude Code tool mappings (${I===T?"root":".agents/"})`);else if(P.updated){if(console.log(`✓ Updated CLAUDE.md with Claude Code tool mappings (${I===T?"root":".agents/"})`),P.backup)console.log(` Backed up to ${X$(P.backup).base}`)}else if(P.skipped)console.log("ℹ️ Skipped CLAUDE.md (does not exist)");else if(P.error)console.log("⚠️ Failed to update CLAUDE.md");let k=v(f)?f:R,u=_$(k,B,["gemini"],!1);if(u.created)console.log(`✓ Created GEMINI.md with Gemini tool mappings (${k===f?"root":".agents/"})`);else if(u.updated){if(console.log(`✓ Updated GEMINI.md with Gemini tool mappings (${k===f?"root":".agents/"})`),u.backup)console.log(` Backed up to ${X$(u.backup).base}`)}else if(u.skipped)console.log("ℹ️ Skipped GEMINI.md (does not exist)");else if(u.error)console.log("⚠️ Failed to update GEMINI.md");let c=A($,".github","copilot-instructions.md"),S={skipped:!0};if(_.includes("github-copilot")){if(S=nX($),S.created)console.log("✓ Created .github/copilot-instructions.md with Superpowers instructions");else if(S.updated){if(console.log("✓ Updated .github/copilot-instructions.md with Superpowers instructions"),S.backup)console.log(` Backed up to ${X$(S.backup).base}`)}else if(S.error)console.log(`⚠️ Failed to update .github/copilot-instructions.md: ${S.message||""}`)}else console.log("ℹ️ Skipped .github/copilot-instructions.md (GitHub Copilot not detected)");let q$=!v(Y)&&!v(Z);if(v(c)&&q$){let b=_$(c,B,["github-copilot"],!1);if(b.updated){if(console.log("✓ Updated .github/copilot-instructions.md with GitHub Copilot tool mappings"),b.backup)console.log(` Backed up to ${X$(b.backup).base}`)}else if(b.error)console.log("⚠️ Failed to update .github/copilot-instructions.md with tool mappings")}else if(v(c)&&!q$)console.log("ℹ️ Skipped .github/copilot-instructions.md tool mappings (AGENTS.md exists, using that instead)");else if(!v(c)&&!_.includes("github-copilot"))console.log("ℹ️ Skipped .github/copilot-instructions.md tool mappings (does not exist)");console.log(`
123
123
  ## Syncing Project Skill Symlinks
124
- `);let n=jq({projectRoot:$});if(n.created>0)console.log(`
125
- ✓ Created ${n.created} project skill symlink(s)`);else if(n.existed>0)console.log("ℹ️ Project skill symlinks already exist");else if(n.errors.length>0)console.log("⚠️ Some symlinks could not be created");else console.log("ℹ️ No agent directories detected for symlinking");let g=`
124
+ `);let n=pQ({projectRoot:$});if(n.created>0)console.log(`
125
+ ✓ Created ${n.created} project skill symlink(s)`);else if(n.existed>0)console.log("ℹ️ Project skill symlinks already exist");else if(n.errors.length>0)console.log("⚠️ Some symlinks could not be created");else console.log("ℹ️ No agent directories detected for symlinking");let l=`
126
126
  # Setup complete!
127
127
 
128
128
  Your project now has:
129
- - .agents/ directory structure`;if(t.updated||t.created)g+=`
130
- - AGENTS.md with universal skills instructions`;if(y.updated||y.created)g+=`
131
- - CLAUDE.md with Claude Code skills instructions`;if(S.updated||S.created)g+=`
132
- - GEMINI.md with Gemini skills instructions`;if(j.updated||j.created)g+=`
133
- - .github/copilot-instructions.md with Superpowers instructions`;if(n.created>0)g+=`
134
- - ${n.created} project skill symlink(s) to agent directories`;g+=`
135
- - .agents/skills/ ready for project-specific skills`,g+=`
129
+ - .agents/ directory structure`;if(O.updated||O.created)l+=`
130
+ - AGENTS.md with universal skills instructions`;if(P.updated||P.created)l+=`
131
+ - CLAUDE.md with Claude Code skills instructions`;if(u.updated||u.created)l+=`
132
+ - GEMINI.md with Gemini skills instructions`;if(S.updated||S.created)l+=`
133
+ - .github/copilot-instructions.md with Superpowers instructions`;if(n.created>0)l+=`
134
+ - ${n.created} project skill symlink(s) to agent directories`;l+=`
135
+ - .agents/skills/ ready for project-specific skills`,l+=`
136
136
  - .agents/docs/SUPERPOWERS.md for detailed reference
137
- `,console.log(g)},gQ=()=>{let $=[...["brainstorming.prompt.md","execute-plan.prompt.md","write-plan.prompt.md","setup-skills.prompt.md","create-meta-prompt.md","finding-skills.prompt.md","skills.prompt.md","use-skill.prompt.md","using-a-skill.prompt.md"].map((Q)=>v(E.vscodeUserDir,"prompts",Q)),...["brainstorming.md","create-meta-prompt.md","execute-plan.md","finding-skills.md","skills.md","use-skill.md","using-a-skill.md","write-plan.md","setup-skills.md"].map((Q)=>v(E.home,".cursor","commands",Q)),...["brainstorm.md","create-meta-prompt.md","execute-plan.md","finding-skills.md","skills.md","use-skill.md","using-a-skill.md","write-plan.md","setup-skills.md"].map((Q)=>v(E.home,".claude","commands",Q)),...["brainstorm.md","create-meta-prompt.md","execute-plan.md","finding-skills.md","skills.md","use-skill.md","using-a-skill.md","write-plan.md","setup-skills.md"].map((Q)=>v(E.home,".config","opencode","command",Q)),...["brainstorm.md","create-meta-prompt.md","execute-plan.md","finding-skills.md","skills.md","use-skill.md","using-a-skill.md","write-plan.md","setup-skills.md"].map((Q)=>v(E.home,".codex","prompts",Q)),...["brainstorm-with-superpowers.toml","create-meta-prompt.toml","execute-plan.toml","finding-skills.toml","skills.toml","use-skill.toml","using-a-skill.toml","write-plan.toml","setup-skills.toml"].map((Q)=>v(E.home,".gemini","commands",Q))],q=0;for(let Q of $)if(J(Q))try{DQ(Q),q++}catch(X){console.log(` ⚠️ Could not remove ${Q}: ${X.message}`)}if(q>0)console.log(`✓ Removed ${q} legacy prompt/command file${q!==1?"s":""}`);else console.log("✓ No legacy prompt/command files found")},yq=async()=>{D(),console.log(`# Superpowers Bootstrap for Agents
137
+ `,console.log(l)},aX=()=>{let $=[...["brainstorming.prompt.md","execute-plan.prompt.md","write-plan.prompt.md","setup-skills.prompt.md","create-meta-prompt.md","finding-skills.prompt.md","skills.prompt.md","use-skill.prompt.md","using-a-skill.prompt.md"].map((X)=>A(z.vscodeUserDir,"prompts",X)),...["brainstorming.md","create-meta-prompt.md","execute-plan.md","finding-skills.md","skills.md","use-skill.md","using-a-skill.md","write-plan.md","setup-skills.md"].map((X)=>A(z.home,".cursor","commands",X)),...["brainstorm.md","create-meta-prompt.md","execute-plan.md","finding-skills.md","skills.md","use-skill.md","using-a-skill.md","write-plan.md","setup-skills.md"].map((X)=>A(z.home,".claude","commands",X)),...["brainstorm.md","create-meta-prompt.md","execute-plan.md","finding-skills.md","skills.md","use-skill.md","using-a-skill.md","write-plan.md","setup-skills.md"].map((X)=>A(z.home,".config","opencode","command",X)),...["brainstorm.md","create-meta-prompt.md","execute-plan.md","finding-skills.md","skills.md","use-skill.md","using-a-skill.md","write-plan.md","setup-skills.md"].map((X)=>A(z.home,".codex","prompts",X)),...["brainstorm-with-superpowers.toml","create-meta-prompt.toml","execute-plan.toml","finding-skills.toml","skills.toml","use-skill.toml","using-a-skill.toml","write-plan.toml","setup-skills.toml"].map((X)=>A(z.home,".gemini","commands",X))],Q=0;for(let X of $)if(v(X))try{dX(X),Q++}catch(Y){console.log(` ⚠️ Could not remove ${X}: ${Y.message}`)}if(Q>0)console.log(`✓ Removed ${Q} legacy prompt/command file${Q!==1?"s":""}`);else console.log("✓ No legacy prompt/command files found")},aQ=async()=>{p(),console.log(`# Superpowers Bootstrap for Agents
138
138
  # ==================================
139
- `);let $=process.argv.includes("--no-update"),Q=new Set(["copilot","cursor","codex","gemini","claude","opencode"].filter((H)=>process.argv.includes(`--force-${H}`))),X=Q.size>0;if(!$){let H=Q$(),W=await G$();if(W.error)console.log(`## Update Check
139
+ `);let $=process.argv.includes("--no-update"),X=new Set(["copilot","cursor","codex","gemini","claude","opencode"].filter((H)=>process.argv.includes(`--force-${H}`))),Y=X.size>0;if(!$){let H=E$(),W=await w$();if(W.error)console.log(`## Update Check
140
140
 
141
141
  ⚠️ Could not check for updates (network issue)
142
142
 
@@ -145,58 +145,58 @@ Your project now has:
145
145
  `),console.log(`⚠️ Update available: v${W.localVersion} → v${W.remoteVersion}
146
146
  To update, run: \`npm install -g @complexthings/superpowers-agent\``),console.log(`
147
147
  ---
148
- `)}if(!X)u$(),console.log(`---
149
- `);if(!X)console.log(`## Cleaning Up Legacy Files
150
- `),gQ(),console.log(`
148
+ `)}if(!Y)n$(),console.log(`---
149
+ `);if(!Y)console.log(`## Cleaning Up Legacy Files
150
+ `),aX(),console.log(`
151
151
  ---
152
- `);if(!X||Q.has("copilot"))console.log(`## GitHub Copilot Integration
152
+ `);if(!Y||X.has("copilot"))console.log(`## GitHub Copilot Integration
153
153
  `),console.log("✓ Skill symlinks handled in sync step below"),console.log(`
154
154
  ---
155
- `);if(!X||Q.has("cursor"))console.log(`## Cursor Integration
156
- `),O$(),console.log(`
155
+ `);if(!Y||X.has("cursor"))console.log(`## Cursor Integration
156
+ `),T$(),console.log(`
157
157
  ---
158
- `);if(!X||Q.has("codex")){if(console.log(`## OpenAI Codex Integration
159
- `),!L.codex.check())console.log(`⚠️ Skipped (${L.codex.name} CLI not detected)
158
+ `);if(!Y||X.has("codex")){if(console.log(`## OpenAI Codex Integration
159
+ `),!M.codex.check())console.log(`⚠️ Skipped (${M.codex.name} CLI not detected)
160
160
  \uD83D\uDCA1 To enable Codex integration:
161
- 1. Install Codex: ${L.codex.installUrl}
162
- 2. Run: superpowers-agent ${L.codex.bootstrapCommand}`);else console.log("✓ Skill symlinks handled in sync step below");console.log(`
161
+ 1. Install Codex: ${M.codex.installUrl}
162
+ 2. Run: superpowers-agent ${M.codex.bootstrapCommand}`);else console.log("✓ Skill symlinks handled in sync step below");console.log(`
163
163
  ---
164
- `)}if(!X||Q.has("gemini")){if(console.log(`## Gemini Integration
165
- `),!L.gemini.check())console.log(`⚠️ Skipped (${L.gemini.name} CLI not detected)
164
+ `)}if(!Y||X.has("gemini")){if(console.log(`## Gemini Integration
165
+ `),!M.gemini.check())console.log(`⚠️ Skipped (${M.gemini.name} CLI not detected)
166
166
  \uD83D\uDCA1 To enable Gemini integration:
167
- 1. Install Gemini: ${L.gemini.installUrl}
168
- 2. Run: superpowers-agent ${L.gemini.bootstrapCommand}`);else console.log("✓ Skill symlinks handled in sync step below");console.log(`
167
+ 1. Install Gemini: ${M.gemini.installUrl}
168
+ 2. Run: superpowers-agent ${M.gemini.bootstrapCommand}`);else console.log("✓ Skill symlinks handled in sync step below");console.log(`
169
169
  ---
170
- `)}if(!X||Q.has("claude")){if(console.log(`## Claude Code Integration
171
- `),!L.claude.check())console.log(`⚠️ Skipped (${L.claude.name} CLI not detected)
170
+ `)}if(!Y||X.has("claude")){if(console.log(`## Claude Code Integration
171
+ `),!M.claude.check())console.log(`⚠️ Skipped (${M.claude.name} CLI not detected)
172
172
  \uD83D\uDCA1 To enable Claude Code integration:
173
- 1. Install Claude Code: ${L.claude.installUrl}
174
- 2. Run: superpowers-agent ${L.claude.bootstrapCommand}`);else console.log("✓ Skill symlinks handled in sync step below");console.log(`
173
+ 1. Install Claude Code: ${M.claude.installUrl}
174
+ 2. Run: superpowers-agent ${M.claude.bootstrapCommand}`);else console.log("✓ Skill symlinks handled in sync step below");console.log(`
175
175
  ---
176
- `)}if(!X||Q.has("opencode")){if(console.log(`## OpenCode Integration
177
- `),L.opencode.check())wq();else console.log(`⚠️ Skipped (${L.opencode.name} CLI not detected)
176
+ `)}if(!Y||X.has("opencode")){if(console.log(`## OpenCode Integration
177
+ `),M.opencode.check())fQ();else console.log(`⚠️ Skipped (${M.opencode.name} CLI not detected)
178
178
  \uD83D\uDCA1 To enable OpenCode integration:
179
- 1. Install OpenCode: ${L.opencode.installUrl}
180
- 2. Run: superpowers-agent ${L.opencode.bootstrapCommand}`);console.log(`
179
+ 1. Install OpenCode: ${M.opencode.installUrl}
180
+ 2. Run: superpowers-agent ${M.opencode.bootstrapCommand}`);console.log(`
181
181
  ---
182
- `)}if(!X){console.log(`## Generating Platform-Specific Files
183
- `);let H=Lq();console.log(`Detected platforms: ${H.join(", ")||"none"}
184
- `);let W=v(E.superpowersRepo,".agents","templates","AGENTS.md.template"),K="";try{K=u(W,"utf8")}catch(z){console.log(`⚠️ Could not read AGENTS.md template: ${z.message}
185
- `)}if(K){let z=R();K=K.replace(/\{\{VERSION\}\}/g,z);let G=v(E.home,".agents","AGENTS.md"),_=Z$(G,K,H,!0);if(_.created)console.log(`✓ Created ${G}`);else if(_.updated)console.log(`✓ Updated ${G}`)}console.log(`
182
+ `)}if(!Y){console.log(`## Generating Platform-Specific Files
183
+ `);let H=DQ();console.log(`Detected platforms: ${H.join(", ")||"none"}
184
+ `);let W=A(z.superpowersRepo,".agents","templates","AGENTS.md.template"),K="";try{K=o(W,"utf8")}catch(E){console.log(`⚠️ Could not read AGENTS.md template: ${E.message}
185
+ `)}if(K){let E=d();K=K.replace(/\{\{VERSION\}\}/g,E);let G=A(z.home,".agents","AGENTS.md"),B=_$(G,K,H,!0);if(B.created)console.log(`✓ Created ${G}`);else if(B.updated)console.log(`✓ Updated ${G}`)}console.log(`
186
186
  ---
187
187
  `)}console.log(`## Syncing Skill Symlinks
188
- `);let Z=process.argv.includes("--force");xq({force:Z,forceAgents:Q}),console.log(`
188
+ `);let Z=process.argv.includes("--force");dQ({force:Z,forceAgents:X}),console.log(`
189
189
  ## Syncing Repo Skills -> ~/.agents/skills/
190
- `);let Y=Dq();if(Y.created>0||Y.updated>0)console.log(` ✓ ${Y.created} created, ${Y.updated} updated, ${Y.existed} already current`);else if(Y.errors.length>0)for(let H of Y.errors)console.log(` ⚠️ ${H}`);else console.log(` ✓ ${Y.existed} skill symlinks already up to date`);console.log(`
190
+ `);let q=hQ();if(q.created>0||q.updated>0)console.log(` ✓ ${q.created} created, ${q.updated} updated, ${q.existed} already current`);else if(q.errors.length>0)for(let H of q.errors)console.log(` ⚠️ ${H}`);else console.log(` ✓ ${q.existed} skill symlinks already up to date`);console.log(`
191
191
  ---
192
192
  `),console.log(`# Bootstrap Complete!
193
193
  `),console.log("✓ All integrations installed"),console.log("✓ Skills system ready"),console.log(`✓ Skill symlinks synced
194
- `),console.log("Next steps:"),console.log(" - Run `superpowers-agent find-skills` to see available skills"),console.log(" - Run `superpowers-agent setup-skills` in your project directory")};import{existsSync as x,readFileSync as v$,mkdirSync as lQ,rmSync as iQ,cpSync as oQ}from"fs";import{join as b,dirname as w$,parse as L$,sep as rQ}from"path";import{execSync as N}from"child_process";import{homedir as c}from"os";import{readFileSync as uQ,existsSync as h$,unlinkSync as dQ,lstatSync as mQ,mkdirSync as hQ}from"fs";import{join as pQ,dirname as cQ}from"path";import{join as U$}from"path";import{homedir as kQ}from"os";var d$={github:{name:"github",sourceDir:".github/agents",sourceExt:".agent.md",getDestDir:()=>U$(E.vscodeUserDir,"prompts"),destExt:".agent.md"},opencode:{name:"opencode",sourceDir:".opencode/agents",sourceExt:".md",getDestDir:()=>U$(kQ(),".config","opencode","agents"),destExt:".md"}};function Sq($,q,Q){let X=d$[q];if(!X)return null;return U$($,X.sourceDir,`${Q}${X.sourceExt}`)}function gq($,q){let Q=d$[$];if(!Q)return null;return U$(Q.getDestDir(),`${q}${Q.destExt}`)}function m$(){return Object.keys(d$)}function nQ($){if(!$||typeof $!=="object")return{valid:!1,error:"agents.json must be a JSON object"};if(!$.version||typeof $.version!=="string")return{valid:!1,error:'agents.json must have a "version" string field'};if(!$.agents||typeof $.agents!=="object")return{valid:!1,error:'agents.json must have an "agents" object field'};let q=m$(),Q=[];for(let[X,Z]of Object.entries($.agents)){if(!q.includes(X)){Q.push(X);continue}if(!Array.isArray(Z))return{valid:!1,error:`agents.${X} must be an array of agent names`};for(let Y of Z)if(typeof Y!=="string")return{valid:!1,error:`agents.${X} must contain only string agent names`}}return{valid:!0,data:$,skippedPlatforms:Q}}function aQ($,q){if(!h$($))return{installed:!1,error:`Source file not found: ${$}`};if(h$(q))try{if(!mQ(q).isSymbolicLink())dQ(q)}catch(X){}hQ(cQ(q),{recursive:!0});let Q=Y$($,q);if(Q.error)return{installed:!1,error:Q.error};return{installed:!0}}function p$($,q={}){let Q=pQ($,"agents.json");if(!h$(Q))return;let X;try{X=JSON.parse(uQ(Q,"utf8"))}catch(B){console.log(`
195
- ⚠ Could not parse agents.json: ${B.message}`);return}let Z=nQ(X);if(!Z.valid){console.log(`
196
- ⚠ Invalid agents.json: ${Z.error}`);return}for(let B of Z.skippedPlatforms)console.log(` ⚠ Skipping unknown platform: ${B}`);let Y=X.repository||"unknown",H=X.version,W=q.isUpdate?"Updating":"Installing",K=q.isUpdate?"Updated":"Installed";console.log(`
197
- \uD83D\uDCE6 Found agents.json (${Y} v${H})`);let z=m$(),G=0,_=0,V=[];for(let[B,U]of Object.entries(X.agents)){if(!z.includes(B))continue;console.log(`
198
- ${W} ${B} agents:`);for(let w of U){let M=Sq($,B,w),d=gq(B,w),P=aQ(M,d);if(P.installed)console.log(` ✓ ${w}`),V.push({platformKey:B,agentName:w,sourcePath:M,destPath:d}),G++;else console.log(` ✗ ${w}: ${P.error}`),_++}}if(V.length>0){let B=p(!0);if(!B.installedAgents)B.installedAgents={};if(!B.installedAgents[Y])B.installedAgents[Y]={version:H,agents:{}};B.installedAgents[Y].version=H;for(let{platformKey:U,agentName:w,sourcePath:M,destPath:d}of V){if(!B.installedAgents[Y].agents[U])B.installedAgents[Y].agents[U]={};B.installedAgents[Y].agents[U][w]={source:M,destination:d,installedAt:new Date().toISOString()}}a(B,!0)}if(G>0)console.log(`
199
- ${K} ${G} agent(s)${_>0?` (${_} failed)`:""}`)}var kq=($,q)=>{if(q.type==="local"){let X=$;for(let Z=0;Z<10;Z++){if(x(b(X,"agents.json")))return X;let Y=w$(X);if(Y===X)break;X=Y}return $}let Q=b(".agents","tmp");if($.includes(Q)){let X=$.indexOf(Q),Y=$.substring(X+Q.length+1).split(rQ)[0];return b($.substring(0,X),".agents","tmp",Y)}return $},uq=($,q)=>{let Q=b(c(),".agents","repos"),X=q.replace(/^@/,"").replace(/[^a-zA-Z0-9_-]/g,"_"),Z=b(Q,X);try{if(lQ(Q,{recursive:!0}),x(Z))iQ(Z,{recursive:!0,force:!0});return oQ($,Z,{recursive:!0}),Z}catch(Y){return console.log(` Warning: Could not persist repository for agents: ${Y.message}`),null}},dq=($)=>{let q=$.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/tree\/([^/]+)\/(.+)$/);if(q){let[,Z,Y,H,W]=q;return{type:"git-tree",repoUrl:`https://github.com/${Z}/${Y}.git`,branch:H,path:W,original:$}}let Q=$.match(/^git@github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/);if(Q){let[,Z,Y]=Q;return{type:"git-repo",repoUrl:`git@github.com:${Z}/${Y}.git`,branch:null,path:null,original:$}}let X=$.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/);if(X){let[,Z,Y]=X;return{type:"git-repo",repoUrl:`https://github.com/${Z}/${Y}.git`,branch:null,path:null,original:$}}if(x($))return{type:"local",path:$,original:$};return null},mq=($)=>{let q=$.includes("--global")||$.includes("-g"),Q=$.includes("--project")||$.includes("-p");if(q)return b(c(),".agents","skills");if(Q)return b(process.cwd(),".agents","skills");let X=b(process.cwd(),".agents","config.json"),Z=b(c(),".agents","config.json");for(let Y of[X,Z])if(x(Y))try{if(JSON.parse(v$(Y,"utf8")).installLocation==="project")return b(process.cwd(),".agents","skills")}catch(H){}return b(c(),".agents","skills")},hq=($,q)=>{let Q=b(c(),".agents","tmp",`skill-install-${Date.now()}`);try{if(N(`mkdir -p "${Q}"`,{stdio:"pipe"}),q)N(`git clone --branch ${q} --depth 1 "${$}" "${Q}"`,{stdio:"pipe",timeout:30000});else N(`git clone --depth 1 "${$}" "${Q}"`,{stdio:"pipe",timeout:30000});return Q}catch(X){try{N(`rm -rf "${Q}"`,{stdio:"pipe"})}catch{}throw Error(`Failed to clone repository: ${X.message}`)}},T$=($)=>{let q=b($,"skill.json");if(!x(q))return null;try{let Q=v$(q,"utf8");return JSON.parse(Q)}catch(Q){throw Error(`Failed to read skill.json: ${Q.message}`)}},J$=($,q,Q,X)=>{let Z=b($,q);if(!x(Z)){X.errors.push(`Skill directory not found: ${q}`);return}let Y=T$(Z);if(!Y){X.errors.push(`No skill.json found in: ${q}`);return}let H=Y.name||q,W=b(Q,H),K=w$(W);try{N(`mkdir -p "${K}"`,{stdio:"pipe"})}catch(z){X.errors.push(`Failed to create directory ${K}: ${z.message}`);return}try{if(x(W))N(`rm -rf "${W}"`,{stdio:"pipe"});N(`cp -R "${Z}" "${W}"`,{stdio:"pipe"}),X.installed.push({name:H,path:W,title:Y.title||Y.description||H})}catch(z){X.errors.push(`Failed to install ${q}: ${z.message}`)}},pq=()=>{let $=process.argv.slice(3),q=$.find((z)=>!z.startsWith("-")),Q=$.filter((z)=>z.startsWith("-"));if(!q){console.log(`Usage: superpowers-agent add <url-or-path|@alias> [skill-path] [options]
194
+ `),console.log("Next steps:"),console.log(" - Run `superpowers-agent find-skills` to see available skills"),console.log(" - Run `superpowers-agent setup-skills` in your project directory")};import{existsSync as F,readFileSync as C$,mkdirSync as XY,rmSync as s$,cpSync as YY,lstatSync as ZY}from"fs";import{join as N,dirname as N$,parse as V$,sep as qY}from"path";import{execSync as j}from"child_process";import{homedir as i}from"os";import{createInterface as HY}from"readline";import{readFileSync as lX,existsSync as l$,unlinkSync as oX,lstatSync as rX,mkdirSync as sX}from"fs";import{join as tX,dirname as eX}from"path";import{join as A$}from"path";import{homedir as iX}from"os";var a$={github:{name:"github",sourceDir:".github/agents",sourceExt:".agent.md",getDestDir:()=>A$(z.vscodeUserDir,"prompts"),destExt:".agent.md"},opencode:{name:"opencode",sourceDir:".opencode/agents",sourceExt:".md",getDestDir:()=>A$(iX(),".config","opencode","agents"),destExt:".md"}};function iQ($,Q,X){let Y=a$[Q];if(!Y)return null;return A$($,Y.sourceDir,`${X}${Y.sourceExt}`)}function lQ($,Q){let X=a$[$];if(!X)return null;return A$(X.getDestDir(),`${Q}${X.destExt}`)}function i$(){return Object.keys(a$)}function $Y($){if(!$||typeof $!=="object")return{valid:!1,error:"agents.json must be a JSON object"};if(!$.version||typeof $.version!=="string")return{valid:!1,error:'agents.json must have a "version" string field'};if(!$.agents||typeof $.agents!=="object")return{valid:!1,error:'agents.json must have an "agents" object field'};let Q=i$(),X=[];for(let[Y,Z]of Object.entries($.agents)){if(!Q.includes(Y)){X.push(Y);continue}if(!Array.isArray(Z))return{valid:!1,error:`agents.${Y} must be an array of agent names`};for(let q of Z)if(typeof q!=="string")return{valid:!1,error:`agents.${Y} must contain only string agent names`}}return{valid:!0,data:$,skippedPlatforms:X}}function QY($,Q){if(!l$($))return{installed:!1,error:`Source file not found: ${$}`};if(l$(Q))try{if(!rX(Q).isSymbolicLink())oX(Q)}catch(Y){}sX(eX(Q),{recursive:!0});let X=B$($,Q);if(X.error)return{installed:!1,error:X.error};return{installed:!0}}function o$($,Q={}){let X=tX($,"agents.json");if(!l$(X))return;let Y;try{Y=JSON.parse(lX(X,"utf8"))}catch(_){console.log(`
195
+ ⚠ Could not parse agents.json: ${_.message}`);return}let Z=$Y(Y);if(!Z.valid){console.log(`
196
+ ⚠ Invalid agents.json: ${Z.error}`);return}for(let _ of Z.skippedPlatforms)console.log(` ⚠ Skipping unknown platform: ${_}`);let q=Y.repository||"unknown",H=Y.version,W=Q.isUpdate?"Updating":"Installing",K=Q.isUpdate?"Updated":"Installed";console.log(`
197
+ \uD83D\uDCE6 Found agents.json (${q} v${H})`);let E=i$(),G=0,B=0,V=[];for(let[_,w]of Object.entries(Y.agents)){if(!E.includes(_))continue;console.log(`
198
+ ${W} ${_} agents:`);for(let L of w){let T=iQ($,_,L),x=lQ(_,L),f=QY(T,x);if(f.installed)console.log(` ✓ ${L}`),V.push({platformKey:_,agentName:L,sourcePath:T,destPath:x}),G++;else console.log(` ✗ ${L}: ${f.error}`),B++}}if(V.length>0){let _=g(!0);if(!_.installedAgents)_.installedAgents={};if(!_.installedAgents[q])_.installedAgents[q]={version:H,agents:{}};_.installedAgents[q].version=H;for(let{platformKey:w,agentName:L,sourcePath:T,destPath:x}of V){if(!_.installedAgents[q].agents[w])_.installedAgents[q].agents[w]={};_.installedAgents[q].agents[w][L]={source:T,destination:x,installedAt:new Date().toISOString()}}m(_,!0)}if(G>0)console.log(`
199
+ ${K} ${G} agent(s)${B>0?` (${B} failed)`:""}`)}var oQ=($,Q)=>{if(Q.type==="local"){let Y=$;for(let Z=0;Z<10;Z++){if(F(N(Y,"agents.json")))return Y;let q=N$(Y);if(q===Y)break;Y=q}return $}let X=N(".agents","tmp");if($.includes(X)){let Y=$.indexOf(X),q=$.substring(Y+X.length+1).split(qY)[0];return N($.substring(0,Y),".agents","tmp",q)}return $},rQ=($,Q)=>{let X=N(i(),".agents","repos"),Y=Q.replace(/^@/,"").replace(/[^a-zA-Z0-9_-]/g,"_"),Z=N(X,Y);try{if(XY(X,{recursive:!0}),F(Z))s$(Z,{recursive:!0,force:!0});return YY($,Z,{recursive:!0}),Z}catch(q){return console.log(` Warning: Could not persist repository for agents: ${q.message}`),null}},t$=($)=>{let Q=$.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/tree\/([^/]+)\/(.+)$/);if(Q){let[,Z,q,H,W]=Q;return{type:"git-tree",repoUrl:`https://github.com/${Z}/${q}.git`,branch:H,path:W,original:$}}let X=$.match(/^git@github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/);if(X){let[,Z,q]=X;return{type:"git-repo",repoUrl:`git@github.com:${Z}/${q}.git`,branch:null,path:null,original:$}}let Y=$.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/);if(Y){let[,Z,q]=Y;return{type:"git-repo",repoUrl:`https://github.com/${Z}/${q}.git`,branch:null,path:null,original:$}}if(F($))return{type:"local",path:$,original:$};return null},e$=($)=>{let Q=$.includes("--global")||$.includes("-g"),X=$.includes("--project")||$.includes("-p");if(Q)return N(i(),".agents","skills");if(X)return N(process.cwd(),".agents","skills");let Y=N(process.cwd(),".agents","config.json"),Z=N(i(),".agents","config.json");for(let q of[Y,Z])if(F(q))try{if(JSON.parse(C$(q,"utf8")).installLocation==="project")return N(process.cwd(),".agents","skills")}catch(H){}return N(i(),".agents","skills")},$Q=($,Q)=>{let X=N(i(),".agents","tmp",`skill-install-${Date.now()}`);try{if(j(`mkdir -p "${X}"`,{stdio:"pipe"}),Q)j(`git clone --branch ${Q} --depth 1 "${$}" "${X}"`,{stdio:"pipe",timeout:30000});else j(`git clone --depth 1 "${$}" "${X}"`,{stdio:"pipe",timeout:30000});return X}catch(Y){try{j(`rm -rf "${X}"`,{stdio:"pipe"})}catch{}throw Error(`Failed to clone repository: ${Y.message}`)}},Z$=($)=>{let Q=N($,"skill.json");if(!F(Q))return null;try{let X=C$(Q,"utf8");return JSON.parse(X)}catch(X){throw Error(`Failed to read skill.json: ${X.message}`)}},b$=($,Q,X,Y)=>{let Z=N($,Q);if(!F(Z)){Y.errors.push(`Skill directory not found: ${Q}`);return}let q=Z$(Z);if(!q){Y.errors.push(`No skill.json found in: ${Q}`);return}let H=q.name||Q,W=N(X,H),K=N$(W);try{j(`mkdir -p "${K}"`,{stdio:"pipe"})}catch(E){Y.errors.push(`Failed to create directory ${K}: ${E.message}`);return}try{if(F(W))j(`rm -rf "${W}"`,{stdio:"pipe"});j(`cp -R "${Z}" "${W}"`,{stdio:"pipe"}),Y.installed.push({name:H,path:W,title:q.title||q.description||H})}catch(E){Y.errors.push(`Failed to install ${Q}: ${E.message}`)}},sQ=($,Q,X,Y,Z=null)=>{let q=g(Y);if(!q.installedSkills)q.installedSkills={};let H={source:$,installBase:Q,installedAt:new Date().toISOString(),skills:X.installed.map((W)=>({name:W.name,path:W.path}))};if(q.installedSkills[$]=H,Z&&Z!==$)q.installedSkills[Z]=H;m(q,Y)},tQ=()=>{let $=process.argv.slice(3),Q=$.find((B)=>!B.startsWith("-")),X=$.filter((B)=>B.startsWith("-"));if(!Q){console.log(`Usage: superpowers-agent add <url-or-path|@alias> [skill-path] [options]
200
200
 
201
201
  Options:
202
202
  --global, -g Install skills globally in ~/.agents/skills/ (default)
@@ -215,22 +215,22 @@ Description:
215
215
  Installs skill(s) from a Git repository, local directory, or repository alias.
216
216
  Supports repositories with single or multiple skills.
217
217
  Reads skill.json to determine skill names and installation paths.
218
-
218
+
219
219
  Repository aliases can be added using:
220
220
  superpowers-agent add-repository <git-url> [--as=@alias]`);return}console.log(`Installing skill(s)...
221
- `);let X=null,Z=null;if(q.startsWith("@")){let z=q;Z=$.find((B,U)=>U>0&&!B.startsWith("-")&&B!==z);let G=k(!1),_=k(!0);if(G[z])X=G[z],console.log(`Using project repository alias: ${z}`);else if(_[z])X=_[z],console.log(`Using global repository alias: ${z}`);else{console.log(`Error: Repository alias not found: ${z}`),console.log(`
222
- Available aliases:`);let B={..._,...G};if(Object.keys(B).length===0)console.log(" (none)"),console.log(`
223
- Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[U,w]of Object.entries(B))console.log(` ${U} -> ${w}`);return}let V=x(X);if(Z)if(V)q=b(X,Z),console.log(`Repository path: ${X}`),console.log(`Skill path: ${Z}
224
- `);else q=`${X}/tree/main/${Z}`,console.log(`Repository URL: ${X}`),console.log(`Skill path: ${Z}
225
- `);else if(q=X,V)console.log(`Repository path: ${X}
226
- `);else console.log(`Repository URL: ${X}
227
- `)}let Y=dq(q);if(!Y){console.log(`Error: Invalid URL or path not found: ${q}`);return}let H=mq(Q);console.log(`Install location: ${H}
228
- `);let W,K=!1;try{if(Y.type==="git-repo"||Y.type==="git-tree"){if(console.log(`Cloning repository: ${Y.repoUrl}`),Y.branch)console.log(`Branch: ${Y.branch}`);if(W=hq(Y.repoUrl,Y.branch),K=!0,Y.path){if(W=b(W,Y.path),!x(W))throw Error(`Path not found in repository: ${Y.path}`)}console.log("")}else W=Y.path;let z=T$(W);if(!z)throw Error("No skill.json found in source directory");let G={installed:[],errors:[],source:Y.original};if(z.skills&&Array.isArray(z.skills)){console.log(`Found ${z.skills.length} skill(s) to install
229
- `);for(let B of z.skills)J$(W,B,H,G)}else{let B=z.name||L$(W).base;J$(w$(W),L$(W).base,H,G)}let _=kq(W,Y),V=b(_,"agents.json");if(x(V)){let B=_;if(K){let U;try{U=JSON.parse(v$(V,"utf8"))}catch{}let w=U?.repository||Y.original,M=uq(_,w);if(M)B=M}p$(B,{isUpdate:!1})}if(K&&W)try{let B=W.split("/.agents/tmp/")[0]+"/.agents/tmp/"+W.split("/.agents/tmp/")[1].split("/")[0];N(`rm -rf "${B}"`,{stdio:"pipe"})}catch{}if(console.log(`
230
- **Successfully installed skills:**`),console.log(`- Source: ${G.source}`),G.installed.length>0)for(let B of G.installed)console.log(` - Installed: ${B.name} at ${B.path}`),console.log(` ${B.title}`);if(G.errors.length>0){console.log(`
231
- **Errors:**`);for(let B of G.errors)console.log(` - ${B}`)}if(G.installed.length===0&&G.errors.length===0)console.log(" No skills were installed");if(G.installed.length>0)console.log(`
232
- **Syncing skill symlinks...**`),k$()}catch(z){if(K&&W)try{let G=W.split("/.agents/tmp/")[0]+"/.agents/tmp/"+W.split("/.agents/tmp/")[1].split("/")[0];N(`rm -rf "${G}"`,{stdio:"pipe"})}catch{}console.log(`
233
- Error: ${z.message}`)}},cq=()=>{let $=process.argv.slice(3),q=$.find((z)=>!z.startsWith("-")),Q=$.filter((z)=>z.startsWith("-"));if(!q){console.log(`Usage: superpowers-agent pull <url-or-path|@alias> [skill-path] [options]
221
+ `);let Y=!X.includes("--project")&&!X.includes("-p"),Z=null,q=null,H=null;if(Q.startsWith("@")){let B=Q;H=B,q=$.find((L,T)=>T>0&&!L.startsWith("-")&&L!==B);let V=h(!1),_=h(!0);if(V[B])Z=V[B],console.log(`Using project repository alias: ${B}`);else if(_[B])Z=_[B],console.log(`Using global repository alias: ${B}`);else{console.log(`Error: Repository alias not found: ${B}`),console.log(`
222
+ Available aliases:`);let L={..._,...V};if(Object.keys(L).length===0)console.log(" (none)"),console.log(`
223
+ Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[T,x]of Object.entries(L))console.log(` ${T} -> ${x}`);return}let w=F(Z);if(q)if(w)Q=N(Z,q),console.log(`Repository path: ${Z}`),console.log(`Skill path: ${q}
224
+ `);else Q=`${Z}/tree/main/${q}`,console.log(`Repository URL: ${Z}`),console.log(`Skill path: ${q}
225
+ `);else if(Q=Z,w)console.log(`Repository path: ${Z}
226
+ `);else console.log(`Repository URL: ${Z}
227
+ `)}let W=t$(Q);if(!W){console.log(`Error: Invalid URL or path not found: ${Q}`);return}let K=e$(X);console.log(`Install location: ${K}
228
+ `);let E,G=!1;try{if(W.type==="git-repo"||W.type==="git-tree"){if(console.log(`Cloning repository: ${W.repoUrl}`),W.branch)console.log(`Branch: ${W.branch}`);if(E=$Q(W.repoUrl,W.branch),G=!0,W.path){if(E=N(E,W.path),!F(E))throw Error(`Path not found in repository: ${W.path}`)}console.log("")}else E=W.path;let B=Z$(E);if(!B)throw Error("No skill.json found in source directory");let V={installed:[],errors:[],source:W.original};if(B.skills&&Array.isArray(B.skills)){console.log(`Found ${B.skills.length} skill(s) to install
229
+ `);for(let L of B.skills)b$(E,L,K,V)}else{let L=B.name||V$(E).base;b$(N$(E),V$(E).base,K,V)}let _=oQ(E,W),w=N(_,"agents.json");if(F(w)){let L=_;if(G){let T;try{T=JSON.parse(C$(w,"utf8"))}catch{}let x=T?.repository||W.original,f=rQ(_,x);if(f)L=f}o$(L,{isUpdate:!1})}if(G&&E)try{let L=E.split("/.agents/tmp/")[0]+"/.agents/tmp/"+E.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${L}"`,{stdio:"pipe"})}catch{}if(console.log(`
230
+ **Successfully installed skills:**`),console.log(`- Source: ${V.source}`),V.installed.length>0)for(let L of V.installed)console.log(` - Installed: ${L.name} at ${L.path}`),console.log(` ${L.title}`);if(V.errors.length>0){console.log(`
231
+ **Errors:**`);for(let L of V.errors)console.log(` - ${L}`)}if(V.installed.length===0&&V.errors.length===0)console.log(" No skills were installed");if(V.installed.length>0)console.log(`
232
+ **Syncing skill symlinks...**`),c$(),sQ(W.original,K,V,Y,H)}catch(B){if(G&&E)try{let V=E.split("/.agents/tmp/")[0]+"/.agents/tmp/"+E.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${V}"`,{stdio:"pipe"})}catch{}console.log(`
233
+ Error: ${B.message}`)}},eQ=()=>{let $=process.argv.slice(3),Q=$.find((B)=>!B.startsWith("-")),X=$.filter((B)=>B.startsWith("-"));if(!Q){console.log(`Usage: superpowers-agent pull <url-or-path|@alias> [skill-path] [options]
234
234
 
235
235
  Options:
236
236
  --global, -g Update skills globally in ~/.agents/skills/ (default)
@@ -255,19 +255,31 @@ Description:
255
255
 
256
256
  Repository aliases can be added using:
257
257
  superpowers-agent add-repository <git-url> [--as=@alias]`);return}console.log(`Updating skill(s)...
258
- `);let X=null,Z=null;if(q.startsWith("@")){let z=q;Z=$.find((B,U)=>U>0&&!B.startsWith("-")&&B!==z);let G=k(!1),_=k(!0);if(G[z])X=G[z],console.log(`Using project repository alias: ${z}`);else if(_[z])X=_[z],console.log(`Using global repository alias: ${z}`);else{console.log(`Error: Repository alias not found: ${z}`),console.log(`
259
- Available aliases:`);let B={..._,...G};if(Object.keys(B).length===0)console.log(" (none)"),console.log(`
260
- Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[U,w]of Object.entries(B))console.log(` ${U} -> ${w}`);return}let V=x(X);if(Z)if(V)q=b(X,Z),console.log(`Repository path: ${X}`),console.log(`Skill path: ${Z}
261
- `);else q=`${X}/tree/main/${Z}`,console.log(`Repository URL: ${X}`),console.log(`Skill path: ${Z}
262
- `);else if(q=X,V)console.log(`Repository path: ${X}
263
- `);else console.log(`Repository URL: ${X}
264
- `)}let Y=dq(q);if(!Y){console.log(`Error: Invalid URL or path not found: ${q}`);return}let H=mq(Q);console.log(`Install location: ${H}
265
- `);let W,K=!1;try{if(Y.type==="git-repo"||Y.type==="git-tree"){if(console.log(`Cloning repository: ${Y.repoUrl}`),Y.branch)console.log(`Branch: ${Y.branch}`);if(W=hq(Y.repoUrl,Y.branch),K=!0,Y.path){if(W=b(W,Y.path),!x(W))throw Error(`Path not found in repository: ${Y.path}`)}console.log("")}else W=Y.path;let z=T$(W);if(!z)throw Error("No skill.json found in source directory");let G={installed:[],errors:[],source:Y.original};if(z.skills&&Array.isArray(z.skills)){console.log(`Found ${z.skills.length} skill(s) to update
266
- `);for(let B of z.skills)J$(W,B,H,G)}else{let B=z.name||L$(W).base;J$(w$(W),L$(W).base,H,G)}let _=kq(W,Y),V=b(_,"agents.json");if(x(V)){let B=_;if(K){let U;try{U=JSON.parse(v$(V,"utf8"))}catch{}let w=U?.repository||Y.original,M=uq(_,w);if(M)B=M}p$(B,{isUpdate:!0})}if(K&&W)try{let B=W.split("/.agents/tmp/")[0]+"/.agents/tmp/"+W.split("/.agents/tmp/")[1].split("/")[0];N(`rm -rf "${B}"`,{stdio:"pipe"})}catch{}if(console.log(`
267
- **Successfully updated skills:**`),console.log(`- Source: ${G.source}`),G.installed.length>0)for(let B of G.installed)console.log(` - Updated: ${B.name} at ${B.path}`),console.log(` ${B.title}`);if(G.errors.length>0){console.log(`
268
- **Errors:**`);for(let B of G.errors)console.log(` - ${B}`)}if(G.installed.length===0&&G.errors.length===0)console.log(" No skills were updated");if(G.installed.length>0)console.log(`
269
- **Syncing skill symlinks...**`),k$()}catch(z){if(K&&W)try{let G=W.split("/.agents/tmp/")[0]+"/.agents/tmp/"+W.split("/.agents/tmp/")[1].split("/")[0];N(`rm -rf "${G}"`,{stdio:"pipe"})}catch{}console.log(`
270
- Error: ${z.message}`)}},nq=()=>{let $=process.argv.slice(3),q=$.find((z)=>!z.startsWith("-")),Q=$.filter((z)=>z.startsWith("-"));if(!q){console.log(`Usage: superpowers-agent add-repository <git-url> [options]
258
+ `);let Y=!X.includes("--project")&&!X.includes("-p"),Z=null,q=null,H=null;if(Q.startsWith("@")){let B=Q;H=B,q=$.find((L,T)=>T>0&&!L.startsWith("-")&&L!==B);let V=h(!1),_=h(!0);if(V[B])Z=V[B],console.log(`Using project repository alias: ${B}`);else if(_[B])Z=_[B],console.log(`Using global repository alias: ${B}`);else{console.log(`Error: Repository alias not found: ${B}`),console.log(`
259
+ Available aliases:`);let L={..._,...V};if(Object.keys(L).length===0)console.log(" (none)"),console.log(`
260
+ Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[T,x]of Object.entries(L))console.log(` ${T} -> ${x}`);return}let w=F(Z);if(q)if(w)Q=N(Z,q),console.log(`Repository path: ${Z}`),console.log(`Skill path: ${q}
261
+ `);else Q=`${Z}/tree/main/${q}`,console.log(`Repository URL: ${Z}`),console.log(`Skill path: ${q}
262
+ `);else if(Q=Z,w)console.log(`Repository path: ${Z}
263
+ `);else console.log(`Repository URL: ${Z}
264
+ `)}let W=t$(Q);if(!W){console.log(`Error: Invalid URL or path not found: ${Q}`);return}let K=e$(X);console.log(`Install location: ${K}
265
+ `);let E,G=!1;try{if(W.type==="git-repo"||W.type==="git-tree"){if(console.log(`Cloning repository: ${W.repoUrl}`),W.branch)console.log(`Branch: ${W.branch}`);if(E=$Q(W.repoUrl,W.branch),G=!0,W.path){if(E=N(E,W.path),!F(E))throw Error(`Path not found in repository: ${W.path}`)}console.log("")}else E=W.path;let B=Z$(E);if(!B)throw Error("No skill.json found in source directory");let V={installed:[],errors:[],source:W.original};if(B.skills&&Array.isArray(B.skills)){console.log(`Found ${B.skills.length} skill(s) to update
266
+ `);for(let L of B.skills)b$(E,L,K,V)}else{let L=B.name||V$(E).base;b$(N$(E),V$(E).base,K,V)}let _=oQ(E,W),w=N(_,"agents.json");if(F(w)){let L=_;if(G){let T;try{T=JSON.parse(C$(w,"utf8"))}catch{}let x=T?.repository||W.original,f=rQ(_,x);if(f)L=f}o$(L,{isUpdate:!0})}if(G&&E)try{let L=E.split("/.agents/tmp/")[0]+"/.agents/tmp/"+E.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${L}"`,{stdio:"pipe"})}catch{}if(console.log(`
267
+ **Successfully updated skills:**`),console.log(`- Source: ${V.source}`),V.installed.length>0)for(let L of V.installed)console.log(` - Updated: ${L.name} at ${L.path}`),console.log(` ${L.title}`);if(V.errors.length>0){console.log(`
268
+ **Errors:**`);for(let L of V.errors)console.log(` - ${L}`)}if(V.installed.length===0&&V.errors.length===0)console.log(" No skills were updated");if(V.installed.length>0)console.log(`
269
+ **Syncing skill symlinks...**`),c$(),sQ(W.original,K,V,Y,H)}catch(B){if(G&&E)try{let V=E.split("/.agents/tmp/")[0]+"/.agents/tmp/"+E.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${V}"`,{stdio:"pipe"})}catch{}console.log(`
270
+ Error: ${B.message}`)}},WY=($)=>new Promise((Q)=>{let X=HY({input:process.stdin,output:process.stdout});X.question($,(Y)=>{X.close(),Q(Y.trim())})}),r$=($)=>{try{return ZY($).isSymbolicLink()}catch{return!1}},$X=async()=>{let $=process.argv.slice(3),Q=$.find((O)=>!O.startsWith("-")),X=$.filter((O)=>O.startsWith("-"));if(!Q){console.log(`Usage: superpowers-agent rm <url-or-path|@alias> [options]
271
+
272
+ Options:
273
+ --global, -g Remove globally installed skills (default)
274
+ --project, -p Remove project-installed skills
275
+
276
+ Examples:
277
+ superpowers-agent rm https://github.com/example/skills
278
+ superpowers-agent rm @myrepo
279
+ superpowers-agent rm ~/my-local-skills`);return}let Y=!X.includes("--project")&&!X.includes("-p"),Z=Q,q=null;if(Q.startsWith("@")){q=Q;let O=h(!1),I=h(!0);if(O[Q])Z=O[Q];else if(I[Q])Z=I[Q];else{console.log(`Error: Repository alias not found: ${Q}`);return}}let H=OQ(Y),W=H[Q]||H[Z],K=W?.installBase||e$(X),E=[];if(W)E=W.skills;else{console.log(`No tracking data found. Attempting to re-resolve skills from source...
280
+ `);let O=t$(Z);if(!O){console.log(`Error: Invalid URL or path not found: ${Z}`);return}let I,P=!1;try{if(O.type==="git-repo"||O.type==="git-tree"){if(console.log(`Cloning repository: ${O.repoUrl}`),I=$Q(O.repoUrl,O.branch),P=!0,O.path){if(I=N(I,O.path),!F(I))throw Error(`Path not found in repository: ${O.path}`)}}else I=O.path;let k=Z$(I);if(!k)throw Error("No skill.json found in source");let u=k.skills&&Array.isArray(k.skills)?k.skills:[k.name||V$(I).base];for(let c of u){let S=c;if(k.skills){let q$=N(I,c);if(F(q$)){let n=Z$(q$);if(n?.name)S=n.name}}E.push({name:S,path:N(K,S)})}if(P)try{let c=I.split("/.agents/tmp/")[0]+"/.agents/tmp/"+I.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${c}"`,{stdio:"pipe"})}catch{}}catch(k){if(P&&I)try{let u=I.split("/.agents/tmp/")[0]+"/.agents/tmp/"+I.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${u}"`,{stdio:"pipe"})}catch{}console.log(`Error resolving source: ${k.message}`);return}}let G=E.filter((O)=>F(O.path)||r$(O.path)),B=[];for(let O of E)for(let I of v$){let P=N(I.skillsDir(),O.name);if(F(P)||r$(P))B.push({platform:I.name,path:P})}let V=UQ(),_=q||Z,w=[];if(V[_]){for(let[,O]of Object.entries(V[_].agents||{}))for(let[,I]of Object.entries(O))if(I.destination&&(F(I.destination)||r$(I.destination)))w.push({path:I.destination})}let L=_.replace(/^@/,"").replace(/[^a-zA-Z0-9_-]/g,"_"),T=N(i(),".agents","repos",L),x=F(T),f=i(),R=(O)=>O.replace(f,"~");if(G.length===0&&B.length===0&&w.length===0&&!x){console.log("Nothing to remove.");return}if(console.log("Will remove:"),G.length>0){console.log(" Skills:");for(let O of G)console.log(` ${R(O.path)}`)}if(B.length>0){console.log(" Platform symlinks:");for(let O of B)console.log(` ${R(O.path)}`)}if(w.length>0){console.log(" Agents:");for(let O of w)console.log(` ${R(O.path)}`)}if(x)console.log(" Persisted repo:"),console.log(` ${R(T)}`);if((await WY(`
281
+ Proceed? [y/N] `)).toLowerCase()!=="y"){console.log("Aborted.");return}for(let O of B){let I=p$(O.path);if(I.removed)console.log(`Removed symlink: ${R(O.path)}`),kQ(O.platform,O.path,"skills");else if(I.error==="Symlink does not exist")console.log(`Already removed: ${R(O.path)}`);else console.log(`Warning: ${R(O.path)}: ${I.error}`)}for(let O of w){let I=p$(O.path);if(I.removed)console.log(`Removed agent: ${R(O.path)}`);else if(I.error==="Symlink does not exist")console.log(`Already removed: ${R(O.path)}`);else console.log(`Warning: ${R(O.path)}: ${I.error}`)}if(x)try{s$(T,{recursive:!0,force:!0}),console.log(`Removed persisted repo: ${R(T)}`)}catch(O){console.log(`Warning: Failed to remove persisted repo: ${O.message}`)}for(let O of G){if(!F(O.path)){console.log(`Already removed: ${R(O.path)}`);continue}try{s$(O.path,{recursive:!0,force:!0}),console.log(`Removed skill: ${R(O.path)}`)}catch(I){console.log(`Warning: Failed to remove ${R(O.path)}: ${I.message}`)}}if(P$(Q,Y),Z!==Q)P$(Z,Y);if(V[_]){let O=g(!0);if(O.installedAgents)delete O.installedAgents[_],m(O,!0)}console.log(`
282
+ Done.`)},QX=()=>{let $=process.argv.slice(3),Q=$.find((E)=>!E.startsWith("-")),X=$.filter((E)=>E.startsWith("-"));if(!Q){console.log(`Usage: superpowers-agent add-repository <git-url> [options]
271
283
 
272
284
  Options:
273
285
  --global, -g Add repository globally in ~/.agents/config.json (default)
@@ -285,9 +297,9 @@ Description:
285
297
  The repository's skill.json will be read to determine the default alias.
286
298
  Use --as to specify a custom alias.
287
299
  After adding, you can install skills using: superpowers-agent add @alias path/to/skill`);return}console.log(`Adding repository...
288
- `);let X=Q.some((z)=>z==="--global"||z==="-g"),Z=Q.some((z)=>z==="--project"||z==="-p"),Y=Q.find((z)=>z.startsWith("--as=")),H=Y?Y.split("=")[1]:null,W=Z?!1:!0,K;try{console.log(`Cloning repository: ${q}`),K=b(c(),".agents","tmp",`repo-add-${Date.now()}`),N(`mkdir -p "${K}"`,{stdio:"pipe"}),N(`git clone --depth 1 "${q}" "${K}"`,{stdio:"pipe",timeout:30000}),console.log("");let z=T$(K);if(!z)throw Error("No skill.json found in repository");let G;if(H)G=H;else if(z.repository)G=z.repository;else{let B=q.match(/\/([^/]+?)(?:\.git)?$/);if(B)G="@"+B[1];else throw Error("Could not determine repository alias. Use --as=@alias to specify manually.")}Zq(G,q,W),N(`rm -rf "${K}"`,{stdio:"pipe"});let _=W?"globally":"in project",V=W?b(c(),".agents","config.json"):b(process.cwd(),".agents","config.json");console.log(`✓ Repository added ${_}`),console.log(` Alias: ${G}`),console.log(` URL: ${q}`),console.log(` Config: ${V}`),console.log(`
289
- You can now install skills using:`),console.log(` superpowers-agent add ${G} <path-to-skill>`)}catch(z){if(K)try{N(`rm -rf "${K}"`,{stdio:"pipe"})}catch{}console.log(`
290
- Error: ${z.message}`)}};import{dirname as sQ}from"path";var aq=($)=>{if(!$){console.log(`Usage: superpowers-agent use-skill <skill-name>
300
+ `);let Y=X.some((E)=>E==="--global"||E==="-g"),Z=X.some((E)=>E==="--project"||E==="-p"),q=X.find((E)=>E.startsWith("--as=")),H=q?q.split("=")[1]:null,W=Z?!1:!0,K;try{console.log(`Cloning repository: ${Q}`),K=N(i(),".agents","tmp",`repo-add-${Date.now()}`),j(`mkdir -p "${K}"`,{stdio:"pipe"}),j(`git clone --depth 1 "${Q}" "${K}"`,{stdio:"pipe",timeout:30000}),console.log("");let E=Z$(K);if(!E)throw Error("No skill.json found in repository");let G;if(H)G=H;else if(E.repository)G=E.repository;else{let _=Q.match(/\/([^/]+?)(?:\.git)?$/);if(_)G="@"+_[1];else throw Error("Could not determine repository alias. Use --as=@alias to specify manually.")}LQ(G,Q,W),j(`rm -rf "${K}"`,{stdio:"pipe"});let B=W?"globally":"in project",V=W?N(i(),".agents","config.json"):N(process.cwd(),".agents","config.json");console.log(`✓ Repository added ${B}`),console.log(` Alias: ${G}`),console.log(` URL: ${Q}`),console.log(` Config: ${V}`),console.log(`
301
+ You can now install skills using:`),console.log(` superpowers-agent add ${G} <path-to-skill>`)}catch(E){if(K)try{j(`rm -rf "${K}"`,{stdio:"pipe"})}catch{}console.log(`
302
+ Error: ${E.message}`)}};import{dirname as zY}from"path";var XX=($)=>{if(!$){console.log(`Usage: superpowers-agent use-skill <skill-name>
291
303
 
292
304
  Examples (smart matching):
293
305
  superpowers-agent use-skill brainstorming # Matches superpowers:collaboration/brainstorming
@@ -302,15 +314,15 @@ Examples (explicit paths):
302
314
  Smart matching:
303
315
  - Type just the skill name or any suffix of the path
304
316
  - Priority: .agents/skills/ > .claude/skills/ > ~/.agents/skills/ > ~/.agents/superpowers/skills/
305
- - If multiple skills match at same priority, you'll see them with descriptions`);return}let q=m($);if(!q){console.log(`Error: Skill not found: ${$}
317
+ - If multiple skills match at same priority, you'll see them with descriptions`);return}let Q=r($);if(!Q){console.log(`Error: Skill not found: ${$}
306
318
 
307
- Available skills:`),console.log("Run: superpowers-agent find-skills");return}let{skillFile:Q,sourceType:X,actualSkillPath:Z}=q;try{let{content:Y,frontmatter:H}=o$(Q),W=q$[X].prefix+Z,K=sQ(Q),z=`# ${H.name||W}`;if(H.description)z+=`
308
- # ${H.description}`;if(H.whenToUse)z+=`
309
- # When to use: ${H.whenToUse}`;z+=`
319
+ Available skills:`),console.log("Run: superpowers-agent find-skills");return}let{skillFile:X,sourceType:Y,actualSkillPath:Z}=Q;try{let{content:q,frontmatter:H}=qQ(X),W=z$[Y].prefix+Z,K=zY(X),E=`# ${H.name||W}`;if(H.description)E+=`
320
+ # ${H.description}`;if(H.whenToUse)E+=`
321
+ # When to use: ${H.whenToUse}`;E+=`
310
322
  # Supporting tools and docs are in ${K}
311
323
  # ============================================
312
324
 
313
- ${Y}`,console.log(z)}catch(Y){console.log(Y.message)}};var lq={bootstrap:yq,version:Uq,"check-updates":()=>{Iq().catch(($)=>{console.error($.message),process.exit(1)})},update:()=>{let $=process.argv.includes("--no-reinstall");P$({skipReinstall:$})},"config-get":_q,"config-set":Oq,"setup-skills":Pq,"use-skill":()=>aq(process.argv[3]),execute:zq,"find-skills":l,add:pq,"add-repository":nq,"list-repositories":Vq,pull:cq,dir:Bq,path:Kq,"get-helpers":Gq,"install-cursor-hooks":O$,"install-aliases":u$,default:()=>{console.log(`Superpowers for Agents
325
+ ${q}`,console.log(E)}catch(q){console.log(q.message)}};var YX={bootstrap:aQ,version:xQ,"check-updates":()=>{FQ().catch(($)=>{console.error($.message),process.exit(1)})},update:()=>{let $=process.argv.includes("--no-reinstall");k$({skipReinstall:$})},"config-get":bQ,"config-set":CQ,"setup-skills":nQ,"use-skill":()=>XX(process.argv[3]),execute:TQ,"find-skills":t,add:tQ,"add-repository":QX,"list-repositories":NQ,pull:eQ,rm:$X,dir:vQ,path:MQ,"get-helpers":AQ,"install-cursor-hooks":T$,"install-aliases":n$,default:()=>{console.log(`Superpowers for Agents
314
326
  Usage:
315
327
  superpowers-agent bootstrap [--no-update] [--force] # Run complete bootstrap
316
328
  superpowers-agent version # Show current version
@@ -325,6 +337,7 @@ Usage:
325
337
  superpowers-agent add-repository <git-url> [--as=@alias] [opts] # Add repository alias
326
338
  superpowers-agent list-repositories # List configured repository aliases
327
339
  superpowers-agent pull <url-or-path|@alias> [path] [options] # Update skills
340
+ superpowers-agent rm <url-or-path|@alias> [options] # Remove skills
328
341
  superpowers-agent dir <skill-name> # Get skill directory
329
342
  superpowers-agent path <skill-name> # Get skill file path
330
343
  superpowers-agent execute <skill-name> # Execute a skill
@@ -333,4 +346,4 @@ Usage:
333
346
  superpowers-agent install-aliases # Install universal aliases (superpowers, superpowers-agent)
334
347
 
335
348
  Documentation: https://github.com/complexthings/superpowers
336
- `)}},tQ=process.argv[2]||"default",eQ=lq[tQ]||lq.default;try{let $=eQ();if($&&typeof $.then==="function")$.catch((q)=>{console.error(`Error: ${q.message}`),process.exit(1)})}catch($){console.error(`Error: ${$.message}`),process.exit(1)}
349
+ `)}},EY=process.argv[2]||"default",KY=YX[EY]||YX.default;try{let $=KY();if($&&typeof $.then==="function")$.catch((Q)=>{console.error(`Error: ${Q.message}`),process.exit(1)})}catch($){console.error(`Error: ${$.message}`),process.exit(1)}