@complexthings/superpowers-agent 9.2.0 → 9.2.1

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 _Q,dirname as GQ,join as TX}from"path";import{existsSync as D$}from"fs";import{homedir as r$,platform as WX}from"os";import{join as w,parse as zX,dirname as s$}from"path";import{existsSync as d}from"fs";import{fileURLToPath as HX}from"url";var EX=HX(import.meta.url),K$=s$(EX),KX=()=>{let $=r$();switch(WX()){case"darwin":return w($,"Library","Application Support","Code","User");case"win32":return w($,"AppData","Roaming","Code","User");case"linux":return w($,".config","Code","User");default:return w($,".config","Code","User")}},BX=()=>{let $=process.cwd(),Q=zX($).root;while($!==Q){if(d(w($,".agents")))return $;$=s$($)}return process.cwd()},H={home:r$(),vscodeUserDir:KX(),projectRoot:BX(),get projectClaudeSkills(){return w(this.projectRoot,".claude","skills")},get projectAgentsSkills(){return w(this.projectRoot,".agents","skills")},get projectCopilotSkills(){return w(this.projectRoot,".copilot","skills")},get projectOpencodeSkills(){return w(this.projectRoot,".opencode","skill")},get projectSkillsDir(){return w(this.projectRoot,"skills")},get homePersonalSkills(){return w(this.home,".agents","skills")},get homeClaudeSkills(){return w(this.home,".claude","skills")},get homeCopilotSkills(){return w(this.home,".copilot","skills")},get claudeSettings(){return w(this.home,".claude","settings.json")},get copilotHooksDir(){return process.env.COPILOT_HOME?w(process.env.COPILOT_HOME,"hooks"):w(this.home,".copilot","hooks")},get homeOpencodeSkills(){return w(this.home,".config","opencode","skill")},get bootstrap(){return w(this.projectRoot,".agents","superpowers-bootstrap.md")},get superpowersRepo(){let $=w(K$,"..","..","..");if(d(w($,"skills"))&&d(w($,".agents","superpowers-agent")))return $;let Q=w(K$,"..");if(d(w(Q,"skills"))&&d(w(Q,".agents","superpowers-agent")))return Q;return w(this.home,".agents","superpowers")},get homeSuperpowersSkills(){return w(this.superpowersRepo,"skills")},get isSuperpowersRepo(){let $=w(K$,"..","..","..");if(d(w($,"skills"))&&d(w($,".agents","superpowers-agent")))return!0;let Q=w(K$,"..");return d(w(Q,"skills"))&&d(w(Q,".agents","superpowers-agent"))}};import{readFileSync as t$}from"fs";var X$=($)=>{try{let X=t$($,"utf8").split(`
4
- `),Z={name:"",description:"",whenToUse:""},Y=!1;for(let q of X){if(q.trim()==="---"){if(Y)break;Y=!0;continue}if(Y){let z=q.match(/^(\w+):\s*(.*)$/);if(z){let[,W,K]=z,E={name:"name",description:"description",when_to_use:"whenToUse"};if(E[W])Z[E[W]]=K.trim()}}}return Z}catch{return{name:"",description:"",whenToUse:""}}},M$=($)=>{try{let Q=t$($,"utf8"),X=X$($),Z=Q.split(`
5
- `),Y=!1,q=!1,z=[];for(let W of Z){if(W.trim()==="---"){if(Y){q=!0;continue}Y=!0;continue}if(q||!Y)z.push(W)}return{content:z.join(`
6
- `).trim(),frontmatter:X}}catch(Q){throw Error(`Error reading skill file: ${Q.message}`)}};import{existsSync as T$,readdirSync as QQ,statSync as XQ}from"fs";import{join as v$,relative as lY}from"path";import{readFileSync as _X,existsSync as GX}from"fs";import{join as e$}from"path";var Y$=($)=>{let Q=e$($,"skill.json");if(!GX(Q))return null;try{let X=_X(Q,"utf8");return JSON.parse(X)}catch(X){return null}};var A$=($)=>{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\//,"")};return{type:null,path:$.replace(/^skills\//,"")}},$Q=($,Q)=>{let X=Y$($);if(!X||!X.helpers||!Array.isArray(X.helpers))return null;let Z=X.helpers,Y=Q.toLowerCase(),q=null,z=0;for(let W of Z){let K=W.toLowerCase();if(K===Y){q=W;break}if(K.includes(Y)){let B=Y.length/K.length;if(B>z)z=B,q=W}let E=W.split("/").pop().split(".")[0].toLowerCase();if(Y.includes(E)){let B=E.length/Y.length;if(B>z)z=B,q=W}}return q?e$($,q):null},r={project:{dir:"projectAgentsSkills",prefix:""},claude:{dir:"projectClaudeSkills",prefix:"claude:"},copilot:{dir:"projectCopilotSkills",prefix:"copilot:"},opencode:{dir:"projectOpencodeSkills",prefix:"opencode:"},personal:{dir:"homePersonalSkills",prefix:""},personalClaude:{dir:"homeClaudeSkills",prefix:"claude:"},personalCopilot:{dir:"homeCopilotSkills",prefix:"copilot:"},personalOpencode:{dir:"homeOpencodeSkills",prefix:"opencode:"},superpowers:{dir:"homeSuperpowersSkills",prefix:"superpowers:"}};var B$=($,Q,X=null)=>{let Z=[];if(!T$($))return Z;let Y=(q,z)=>{if(X!==null&&z>X)return;try{let W=QQ(q,{withFileTypes:!0});for(let K of W){if(K.name==="node_modules"||K.name===".git"||K.name.startsWith("."))continue;let E=v$(q,K.name),B=K.isDirectory();if(K.isSymbolicLink())try{B=XQ(E).isDirectory()}catch{continue}if(!B)continue;let _=v$(E,"SKILL.md");if(T$(_))Z.push(E);if(X===null||z<X)Y(E,z+1)}}catch{}};return Y($,0),Z};var YQ=($,Q)=>{if(!T$($))return[];let X=[],Z=Q.toLowerCase().replace(/\\/g,"/"),Y=(q,z="")=>{try{let W=QQ(q,{withFileTypes:!0});for(let K of W){let E=v$(q,K.name),B=z?`${z}/${K.name}`:K.name,_=K.isDirectory();if(K.isSymbolicLink())try{_=XQ(E).isDirectory()}catch{continue}if(_&&(K.name==="node_modules"||K.name===".git"||K.name.startsWith(".")))continue;if(_)Y(E,B);else if(K.name==="SKILL.md"){let G=z.toLowerCase().replace(/\\/g,"/");if(G===Z||G.endsWith("/"+Z)||G.endsWith(Z))X.push({file:E,path:z})}}}catch(W){}};return Y($),X},ZQ=($,Q,X)=>{let Z={project:"project skills (.agents/skills/)",claude:"claude skills (.claude/skills/)",copilot:"copilot skills (.copilot/skills/)",opencode:"opencode skills (.opencode/skill/)",personal:"personal skills (~/.agents/skills/)",personalClaude:"personal claude skills (~/.claude/skills/)",personalCopilot:"personal copilot skills (~/.copilot/skills/)",personalOpencode:"personal opencode skills (~/.config/opencode/skill/)",superpowers:"superpowers skills (~/.agents/superpowers/skills/)"}[X];console.log(`Error: Multiple skills match "${$}" in ${Z}:
7
- `);for(let Y of Q){let z=r[X].prefix+Y.path;try{let W=X$(Y.file),K=W.description||W.whenToUse||"(no description)";console.log(` ${z}`),console.log(` ${K}
3
+ import{relative as _X,dirname as GX,join as TY}from"path";import{existsSync as DQ}from"fs";import{homedir as sQ,platform as WY}from"os";import{join as O,parse as zY,dirname as tQ}from"path";import{existsSync as d}from"fs";import{fileURLToPath as HY}from"url";var BY=HY(import.meta.url),KQ=tQ(BY),KY=()=>{let Q=sQ();switch(WY()){case"darwin":return O(Q,"Library","Application Support","Code","User");case"win32":return O(Q,"AppData","Roaming","Code","User");case"linux":return O(Q,".config","Code","User");default:return O(Q,".config","Code","User")}},EY=()=>{let Q=process.cwd(),X=zY(Q).root;while(Q!==X){if(d(O(Q,".agents")))return Q;Q=tQ(Q)}return process.cwd()},H={home:sQ(),vscodeUserDir:KY(),projectRoot:EY(),get projectClaudeSkills(){return O(this.projectRoot,".claude","skills")},get projectAgentsSkills(){return O(this.projectRoot,".agents","skills")},get projectCopilotSkills(){return O(this.projectRoot,".copilot","skills")},get projectOpencodeSkills(){return O(this.projectRoot,".opencode","skill")},get projectSkillsDir(){return O(this.projectRoot,"skills")},get homePersonalSkills(){return O(this.home,".agents","skills")},get homeClaudeSkills(){return O(this.home,".claude","skills")},get homeCopilotSkills(){return O(this.home,".copilot","skills")},get claudeSettings(){return O(this.home,".claude","settings.json")},get copilotHooksDir(){return process.env.COPILOT_HOME?O(process.env.COPILOT_HOME,"hooks"):O(this.home,".copilot","hooks")},get homeOpencodeSkills(){return O(this.home,".config","opencode","skill")},get bootstrap(){return O(this.projectRoot,".agents","superpowers-bootstrap.md")},get superpowersRepo(){let Q=O(KQ,"..","..","..");if(d(O(Q,"skills"))&&d(O(Q,".agents","superpowers-agent")))return Q;let X=O(KQ,"..");if(d(O(X,"skills"))&&d(O(X,".agents","superpowers-agent")))return X;return O(this.home,".agents","superpowers")},get homeSuperpowersSkills(){return O(this.superpowersRepo,"skills")},get isSuperpowersRepo(){let Q=O(KQ,"..","..","..");if(d(O(Q,"skills"))&&d(O(Q,".agents","superpowers-agent")))return!0;let X=O(KQ,"..");return d(O(X,"skills"))&&d(O(X,".agents","superpowers-agent"))}};import{readFileSync as eQ}from"fs";var $Q=(Q)=>{try{let Y=eQ(Q,"utf8").split(`
4
+ `),$={name:"",description:"",whenToUse:""},Z=!1;for(let q of Y){if(q.trim()==="---"){if(Z)break;Z=!0;continue}if(Z){let z=q.match(/^(\w+):\s*(.*)$/);if(z){let[,W,K]=z,B={name:"name",description:"description",when_to_use:"whenToUse"};if(B[W])$[B[W]]=K.trim()}}}return $}catch{return{name:"",description:"",whenToUse:""}}},MQ=(Q)=>{try{let X=eQ(Q,"utf8"),Y=$Q(Q),$=X.split(`
5
+ `),Z=!1,q=!1,z=[];for(let W of $){if(W.trim()==="---"){if(Z){q=!0;continue}Z=!0;continue}if(q||!Z)z.push(W)}return{content:z.join(`
6
+ `).trim(),frontmatter:Y}}catch(X){throw Error(`Error reading skill file: ${X.message}`)}};import{existsSync as TQ,readdirSync as YX,statSync as ZX}from"fs";import{join as vQ,relative as lZ}from"path";import{readFileSync as VY,existsSync as _Y}from"fs";import{join as QX}from"path";var qQ=(Q)=>{let X=QX(Q,"skill.json");if(!_Y(X))return null;try{let Y=VY(X,"utf8");return JSON.parse(Y)}catch(Y){return null}};var AQ=(Q)=>{if(Q.startsWith("superpowers:"))return{type:"superpowers",path:Q.substring(12).replace(/^skills\//,"")};if(Q.startsWith("claude:"))return{type:"claude",path:Q.substring(7).replace(/^skills\//,"")};if(Q.startsWith("copilot:"))return{type:"copilot",path:Q.substring(8).replace(/^skills\//,"")};if(Q.startsWith("opencode:"))return{type:"opencode",path:Q.substring(9).replace(/^skills\//,"")};return{type:null,path:Q.replace(/^skills\//,"")}},XX=(Q,X)=>{let Y=qQ(Q);if(!Y||!Y.helpers||!Array.isArray(Y.helpers))return null;let $=Y.helpers,Z=X.toLowerCase(),q=null,z=0;for(let W of $){let K=W.toLowerCase();if(K===Z){q=W;break}if(K.includes(Z)){let E=Z.length/K.length;if(E>z)z=E,q=W}let B=W.split("/").pop().split(".")[0].toLowerCase();if(Z.includes(B)){let E=B.length/Z.length;if(E>z)z=E,q=W}}return q?QX(Q,q):null},s={project:{dir:"projectAgentsSkills",prefix:""},claude:{dir:"projectClaudeSkills",prefix:"claude:"},copilot:{dir:"projectCopilotSkills",prefix:"copilot:"},opencode:{dir:"projectOpencodeSkills",prefix:"opencode:"},personal:{dir:"homePersonalSkills",prefix:""},personalClaude:{dir:"homeClaudeSkills",prefix:"claude:"},personalCopilot:{dir:"homeCopilotSkills",prefix:"copilot:"},personalOpencode:{dir:"homeOpencodeSkills",prefix:"opencode:"},superpowers:{dir:"homeSuperpowersSkills",prefix:"superpowers:"}};var EQ=(Q,X,Y=null)=>{let $=[];if(!TQ(Q))return $;let Z=(q,z)=>{if(Y!==null&&z>Y)return;try{let W=YX(q,{withFileTypes:!0});for(let K of W){if(K.name==="node_modules"||K.name===".git"||K.name.startsWith("."))continue;let B=vQ(q,K.name),E=K.isDirectory();if(K.isSymbolicLink())try{E=ZX(B).isDirectory()}catch{continue}if(!E)continue;let V=vQ(B,"SKILL.md");if(TQ(V))$.push(B);if(Y===null||z<Y)Z(B,z+1)}}catch{}};return Z(Q,0),$};var $X=(Q,X)=>{if(!TQ(Q))return[];let Y=[],$=X.toLowerCase().replace(/\\/g,"/"),Z=(q,z="")=>{try{let W=YX(q,{withFileTypes:!0});for(let K of W){let B=vQ(q,K.name),E=z?`${z}/${K.name}`:K.name,V=K.isDirectory();if(K.isSymbolicLink())try{V=ZX(B).isDirectory()}catch{continue}if(V&&(K.name==="node_modules"||K.name===".git"||K.name.startsWith(".")))continue;if(V)Z(B,E);else if(K.name==="SKILL.md"){let _=z.toLowerCase().replace(/\\/g,"/");if(_===$||_.endsWith("/"+$)||_.endsWith($))Y.push({file:B,path:z})}}}catch(W){}};return Z(Q),Y},qX=(Q,X,Y)=>{let $={project:"project skills (.agents/skills/)",claude:"claude skills (.claude/skills/)",copilot:"copilot skills (.copilot/skills/)",opencode:"opencode skills (.opencode/skill/)",personal:"personal skills (~/.agents/skills/)",personalClaude:"personal claude skills (~/.claude/skills/)",personalCopilot:"personal copilot skills (~/.copilot/skills/)",personalOpencode:"personal opencode skills (~/.config/opencode/skill/)",superpowers:"superpowers skills (~/.agents/superpowers/skills/)"}[Y];console.log(`Error: Multiple skills match "${Q}" in ${$}:
7
+ `);for(let Z of X){let z=s[Y].prefix+Z.path;try{let W=$Q(Z.file),K=W.description||W.whenToUse||"(no description)";console.log(` ${z}`),console.log(` ${K}
8
8
  `)}catch(W){console.log(` ${z}`),console.log(` (unable to read description)
9
- `)}}console.log("Please be more specific. Examples:");for(let Y of Q.slice(0,2)){let q=r[X].prefix;console.log(` superpowers-agent execute ${q}${Y.path}`)}};import{existsSync as N$}from"fs";import{join as VX,relative as LX}from"path";var UX=($)=>{let{type:Q,path:X}=A$($),Z={superpowers:[H.homeSuperpowersSkills],claude:[H.projectClaudeSkills,H.homeClaudeSkills],copilot:[H.projectCopilotSkills,H.homeCopilotSkills],opencode:[H.projectOpencodeSkills,H.homeOpencodeSkills],project:[H.projectAgentsSkills],personal:[H.homePersonalSkills]},Y;if(Q)Y=(Z[Q]||[]).map((z)=>({type:Q,dir:z}));else if(H.isSuperpowersRepo&&N$(H.projectSkillsDir))Y=[{type:"project",dir:H.projectSkillsDir},{type:"project",dir:H.projectAgentsSkills},{type:"claude",dir:H.projectClaudeSkills},{type:"copilot",dir:H.projectCopilotSkills},{type:"opencode",dir:H.projectOpencodeSkills},{type:"personal",dir:H.homePersonalSkills},{type:"personalClaude",dir:H.homeClaudeSkills},{type:"personalCopilot",dir:H.homeCopilotSkills},{type:"personalOpencode",dir:H.homeOpencodeSkills},{type:"superpowers",dir:H.homeSuperpowersSkills}];else Y=[{type:"project",dir:H.projectAgentsSkills},{type:"claude",dir:H.projectClaudeSkills},{type:"copilot",dir:H.projectCopilotSkills},{type:"opencode",dir:H.projectOpencodeSkills},{type:"personal",dir:H.homePersonalSkills},{type:"personalClaude",dir:H.homeClaudeSkills},{type:"personalCopilot",dir:H.homeCopilotSkills},{type:"personalOpencode",dir:H.homeOpencodeSkills},{type:"superpowers",dir:H.homeSuperpowersSkills}];for(let{type:q,dir:z}of Y){let W=YQ(z,X);if(W.length===1)return{skillFile:W[0].file,sourceType:q,actualSkillPath:W[0].path};if(W.length>1)ZQ(X,W,q)}return null},m=($)=>{let Q=UX($);if(Q)return Q;let{type:X,path:Z}=A$($),Y={superpowers:[H.homeSuperpowersSkills],claude:[H.projectClaudeSkills,H.homeClaudeSkills],copilot:[H.projectCopilotSkills,H.homeCopilotSkills],opencode:[H.projectOpencodeSkills,H.homeOpencodeSkills],project:[H.projectAgentsSkills],personal:[H.homePersonalSkills]},q;if(X)q=(Y[X]||[]).map((W)=>({type:X,dir:W}));else if(H.isSuperpowersRepo&&N$(H.projectSkillsDir))q=[{type:"project",dir:H.projectSkillsDir},{type:"project",dir:H.projectAgentsSkills},{type:"claude",dir:H.projectClaudeSkills},{type:"copilot",dir:H.projectCopilotSkills},{type:"opencode",dir:H.projectOpencodeSkills},{type:"personal",dir:H.homePersonalSkills},{type:"personalClaude",dir:H.homeClaudeSkills},{type:"personalCopilot",dir:H.homeCopilotSkills},{type:"personalOpencode",dir:H.homeOpencodeSkills},{type:"superpowers",dir:H.homeSuperpowersSkills}];else q=[{type:"project",dir:H.projectAgentsSkills},{type:"claude",dir:H.projectClaudeSkills},{type:"copilot",dir:H.projectCopilotSkills},{type:"opencode",dir:H.projectOpencodeSkills},{type:"personal",dir:H.homePersonalSkills},{type:"personalClaude",dir:H.homeClaudeSkills},{type:"personalCopilot",dir:H.homeCopilotSkills},{type:"personalOpencode",dir:H.homeOpencodeSkills},{type:"superpowers",dir:H.homeSuperpowersSkills}];for(let{type:z,dir:W}of q){if(!N$(W))continue;let K=B$(W,z,null);for(let E of K){let B=Y$(E);if(B&&B.aliases&&Array.isArray(B.aliases)){let _=Z.toLowerCase();for(let G of B.aliases)if(G.toLowerCase()===_){let V=VX(E,"SKILL.md"),I=LX(W,E);return{skillFile:V,sourceType:z,actualSkillPath:I}}}}}return null};import{readFileSync as qQ,writeFileSync as WQ,existsSync as C$}from"fs";import{join as i}from"path";import{execSync as IX}from"child_process";var b$=()=>({auto_update:!0,last_update_check:null,last_updated_commit:null}),Z$=()=>{let $=i(H.superpowersRepo,".config.json");try{if(!C$($))return b$();let Q=qQ($,"utf8");return{...b$(),...JSON.parse(Q)}}catch{return b$()}},zQ=($)=>{let Q=i(H.superpowersRepo,".config.json"),Z={...Z$(),...$};try{WQ(Q,JSON.stringify(Z,null,2))}catch(Y){console.log(`Warning: couldn't save config: ${Y.message}`)}},y=($)=>{let Q=$?i(H.home,".agents","config.json"):i(process.cwd(),".agents","config.json");if(!C$(Q))return{};try{let X=qQ(Q,"utf8");return JSON.parse(X)}catch(X){return{}}},h=($,Q)=>{let X=Q?i(H.home,".agents"):i(process.cwd(),".agents"),Z=i(X,"config.json");try{if(!C$(X))IX(`mkdir -p "${X}"`,{stdio:"pipe"});return WQ(Z,JSON.stringify($,null,2),"utf8"),!0}catch(Y){throw Error(`Failed to write config: ${Y.message}`)}},k=($=!1)=>{return y($).repositories||{}},HQ=($,Q,X)=>{let Z=y(X);if(!Z.repositories)Z.repositories={};Z.repositories[$]=Q,h(Z,X)};function EQ($=!0){return y($).installedSkills||{}}function F$($,Q=!0){let X=y(Q);if(X.installedSkills)delete X.installedSkills[$];h(X,Q)}function KQ(){return y(!0).installedAgents||{}}import{readFileSync as JX}from"fs";import{join as j$,dirname as OX}from"path";import{fileURLToPath as wX}from"url";import{existsSync as BQ}from"fs";import{execSync as MX}from"child_process";var AX=wX(import.meta.url),x$=OX(AX),P=()=>{try{let $=j$(x$,"package.json");if(!BQ($))$=j$(x$,"..","package.json");if(!BQ($))$=j$(x$,"..","..","package.json");return JSON.parse(JX($,"utf8")).version||"0.0.0"}catch{return"0.0.0"}},u=()=>{let $=P();console.log(`^^SAV:${$}^^`)},_$=async()=>{try{let Q=MX('curl -sS "https://registry.npmjs.org/@complexthings/superpowers-agent/latest"',{encoding:"utf8",timeout:1e4}),X=JSON.parse(Q);if(!X.version)return P();return X.version}catch($){throw Error(`Failed to fetch remote version: ${$.message}`)}},G$=($,Q)=>{let X=$.split(".").map(Number),Z=Q.split(".").map(Number);for(let Y=0;Y<3;Y++){let q=X[Y]||0,z=Z[Y]||0;if(q>z)return!0;if(q<z)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:"},personal:{dir:"homePersonalSkills",prefix:""},personalClaude:{dir:"homeClaudeSkills",prefix:"claude:"},personalCopilot:{dir:"homeCopilotSkills",prefix:"copilot:"},personalOpencode:{dir:"homeOpencodeSkills",prefix:"opencode:"},superpowers:{dir:"homeSuperpowersSkills",prefix:"superpowers:"}},NX=($,Q)=>{let X=TX($,"SKILL.md"),{dir:Z,prefix:Y}=vX[Q],q=_Q(H[Z],$).replace(/\\/g,"/");console.log(`${Y}${q}`);let{description:z,whenToUse:W}=X$(X);if(z)console.log(` ${z}`);if(W)console.log(` When to use: ${W}`);console.log("")},s=()=>{u();let $=new Set,Q=[{type:"project",dir:H.projectAgentsSkills,maxDepth:null},{type:"claude",dir:H.projectClaudeSkills,maxDepth:null},{type:"copilot",dir:H.projectCopilotSkills,maxDepth:null},{type:"opencode",dir:H.projectOpencodeSkills,maxDepth:null},{type:"personal",dir:H.homePersonalSkills,maxDepth:null},{type:"personalClaude",dir:H.homeClaudeSkills,maxDepth:null},{type:"personalCopilot",dir:H.homeCopilotSkills,maxDepth:null},{type:"personalOpencode",dir:H.homeOpencodeSkills,maxDepth:null},{type:"superpowers",dir:H.homeSuperpowersSkills,maxDepth:null}];for(let{type:X,dir:Z,maxDepth:Y}of Q){let q=B$(Z,X,Y);for(let z of q){let W=_Q(Z,z);if(!$.has(W))$.add(W),NX(z,X)}}console.log(`Usage:
10
- superpowers-agent execute <skill-name> # Load a specific skill`)},VQ=()=>{u();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 X.slice(0,2)){let q=s[Y].prefix;console.log(` superpowers-agent execute ${q}${Z.path}`)}};import{existsSync as CQ}from"fs";import{join as GY,relative as UY}from"path";var IY=(Q)=>{let{type:X,path:Y}=AQ(Q),$={superpowers:[H.homeSuperpowersSkills],claude:[H.projectClaudeSkills,H.homeClaudeSkills],copilot:[H.projectCopilotSkills,H.homeCopilotSkills],opencode:[H.projectOpencodeSkills,H.homeOpencodeSkills],project:[H.projectAgentsSkills],personal:[H.homePersonalSkills]},Z;if(X)Z=($[X]||[]).map((z)=>({type:X,dir:z}));else if(H.isSuperpowersRepo&&CQ(H.projectSkillsDir))Z=[{type:"project",dir:H.projectSkillsDir},{type:"project",dir:H.projectAgentsSkills},{type:"claude",dir:H.projectClaudeSkills},{type:"copilot",dir:H.projectCopilotSkills},{type:"opencode",dir:H.projectOpencodeSkills},{type:"personal",dir:H.homePersonalSkills},{type:"personalClaude",dir:H.homeClaudeSkills},{type:"personalCopilot",dir:H.homeCopilotSkills},{type:"personalOpencode",dir:H.homeOpencodeSkills},{type:"superpowers",dir:H.homeSuperpowersSkills}];else Z=[{type:"project",dir:H.projectAgentsSkills},{type:"claude",dir:H.projectClaudeSkills},{type:"copilot",dir:H.projectCopilotSkills},{type:"opencode",dir:H.projectOpencodeSkills},{type:"personal",dir:H.homePersonalSkills},{type:"personalClaude",dir:H.homeClaudeSkills},{type:"personalCopilot",dir:H.homeCopilotSkills},{type:"personalOpencode",dir:H.homeOpencodeSkills},{type:"superpowers",dir:H.homeSuperpowersSkills}];for(let{type:q,dir:z}of Z){let W=$X(z,Y);if(W.length===1)return{skillFile:W[0].file,sourceType:q,actualSkillPath:W[0].path};if(W.length>1)qX(Y,W,q)}return null},m=(Q)=>{let X=IY(Q);if(X)return X;let{type:Y,path:$}=AQ(Q),Z={superpowers:[H.homeSuperpowersSkills],claude:[H.projectClaudeSkills,H.homeClaudeSkills],copilot:[H.projectCopilotSkills,H.homeCopilotSkills],opencode:[H.projectOpencodeSkills,H.homeOpencodeSkills],project:[H.projectAgentsSkills],personal:[H.homePersonalSkills]},q;if(Y)q=(Z[Y]||[]).map((W)=>({type:Y,dir:W}));else if(H.isSuperpowersRepo&&CQ(H.projectSkillsDir))q=[{type:"project",dir:H.projectSkillsDir},{type:"project",dir:H.projectAgentsSkills},{type:"claude",dir:H.projectClaudeSkills},{type:"copilot",dir:H.projectCopilotSkills},{type:"opencode",dir:H.projectOpencodeSkills},{type:"personal",dir:H.homePersonalSkills},{type:"personalClaude",dir:H.homeClaudeSkills},{type:"personalCopilot",dir:H.homeCopilotSkills},{type:"personalOpencode",dir:H.homeOpencodeSkills},{type:"superpowers",dir:H.homeSuperpowersSkills}];else q=[{type:"project",dir:H.projectAgentsSkills},{type:"claude",dir:H.projectClaudeSkills},{type:"copilot",dir:H.projectCopilotSkills},{type:"opencode",dir:H.projectOpencodeSkills},{type:"personal",dir:H.homePersonalSkills},{type:"personalClaude",dir:H.homeClaudeSkills},{type:"personalCopilot",dir:H.homeCopilotSkills},{type:"personalOpencode",dir:H.homeOpencodeSkills},{type:"superpowers",dir:H.homeSuperpowersSkills}];for(let{type:z,dir:W}of q){if(!CQ(W))continue;let K=EQ(W,z,null);for(let B of K){let E=qQ(B);if(E&&E.aliases&&Array.isArray(E.aliases)){let V=$.toLowerCase();for(let _ of E.aliases)if(_.toLowerCase()===V){let U=GY(B,"SKILL.md"),L=UY(W,B);return{skillFile:U,sourceType:z,actualSkillPath:L}}}}}return null};import{readFileSync as WX,writeFileSync as zX,existsSync as NQ}from"fs";import{join as l}from"path";import{execSync as LY}from"child_process";var bQ=()=>({auto_update:!0,last_update_check:null,last_updated_commit:null}),WQ=()=>{let Q=l(H.superpowersRepo,".config.json");try{if(!NQ(Q))return bQ();let X=WX(Q,"utf8");return{...bQ(),...JSON.parse(X)}}catch{return bQ()}},HX=(Q)=>{let X=l(H.superpowersRepo,".config.json"),$={...WQ(),...Q};try{zX(X,JSON.stringify($,null,2))}catch(Z){console.log(`Warning: couldn't save config: ${Z.message}`)}},y=(Q)=>{let X=Q?l(H.home,".agents","config.json"):l(process.cwd(),".agents","config.json");if(!NQ(X))return{};try{let Y=WX(X,"utf8");return JSON.parse(Y)}catch(Y){return{}}},h=(Q,X)=>{let Y=X?l(H.home,".agents"):l(process.cwd(),".agents"),$=l(Y,"config.json");try{if(!NQ(Y))LY(`mkdir -p "${Y}"`,{stdio:"pipe"});return zX($,JSON.stringify(Q,null,2),"utf8"),!0}catch(Z){throw Error(`Failed to write config: ${Z.message}`)}},k=(Q=!1)=>{return y(Q).repositories||{}},BX=(Q,X,Y)=>{let $=y(Y);if(!$.repositories)$.repositories={};$.repositories[Q]=X,h($,Y)};function KX(Q=!0){return y(Q).installedSkills||{}}function FQ(Q,X=!0){let Y=y(X);if(Y.installedSkills)delete Y.installedSkills[Q];h(Y,X)}function EX(){return y(!0).installedAgents||{}}import{readFileSync as JY}from"fs";import{join as jQ,dirname as wY}from"path";import{fileURLToPath as OY}from"url";import{existsSync as VX}from"fs";import{execSync as MY}from"child_process";var AY=OY(import.meta.url),xQ=wY(AY),P=()=>{try{let Q=jQ(xQ,"package.json");if(!VX(Q))Q=jQ(xQ,"..","package.json");if(!VX(Q))Q=jQ(xQ,"..","..","package.json");return JSON.parse(JY(Q,"utf8")).version||"0.0.0"}catch{return"0.0.0"}},u=()=>{let Q=P();console.log(`^^SAV:${Q}^^`)},VQ=async()=>{try{let X=MY('curl -sS "https://registry.npmjs.org/@complexthings/superpowers-agent/latest"',{encoding:"utf8",timeout:1e4}),Y=JSON.parse(X);if(!Y.version)return P();return Y.version}catch(Q){throw Error(`Failed to fetch remote version: ${Q.message}`)}},_Q=(Q,X)=>{let Y=Q.split(".").map(Number),$=X.split(".").map(Number);for(let Z=0;Z<3;Z++){let q=Y[Z]||0,z=$[Z]||0;if(q>z)return!0;if(q<z)return!1}return!1};var vY={project:{dir:"projectAgentsSkills",prefix:""},claude:{dir:"projectClaudeSkills",prefix:"claude:"},copilot:{dir:"projectCopilotSkills",prefix:"copilot:"},opencode:{dir:"projectOpencodeSkills",prefix:"opencode:"},personal:{dir:"homePersonalSkills",prefix:""},personalClaude:{dir:"homeClaudeSkills",prefix:"claude:"},personalCopilot:{dir:"homeCopilotSkills",prefix:"copilot:"},personalOpencode:{dir:"homeOpencodeSkills",prefix:"opencode:"},superpowers:{dir:"homeSuperpowersSkills",prefix:"superpowers:"}},CY=(Q,X)=>{let Y=TY(Q,"SKILL.md"),{dir:$,prefix:Z}=vY[X],q=_X(H[$],Q).replace(/\\/g,"/");console.log(`${Z}${q}`);let{description:z,whenToUse:W}=$Q(Y);if(z)console.log(` ${z}`);if(W)console.log(` When to use: ${W}`);console.log("")},t=()=>{u();let Q=new Set,X=[{type:"project",dir:H.projectAgentsSkills,maxDepth:null},{type:"claude",dir:H.projectClaudeSkills,maxDepth:null},{type:"copilot",dir:H.projectCopilotSkills,maxDepth:null},{type:"opencode",dir:H.projectOpencodeSkills,maxDepth:null},{type:"personal",dir:H.homePersonalSkills,maxDepth:null},{type:"personalClaude",dir:H.homeClaudeSkills,maxDepth:null},{type:"personalCopilot",dir:H.homeCopilotSkills,maxDepth:null},{type:"personalOpencode",dir:H.homeOpencodeSkills,maxDepth:null},{type:"superpowers",dir:H.homeSuperpowersSkills,maxDepth:null}];for(let{type:Y,dir:$,maxDepth:Z}of X){let q=EQ($,Y,Z);for(let z of q){let W=_X($,z);if(!Q.has(W))Q.add(W),CY(z,Y)}}console.log(`Usage:
10
+ superpowers-agent execute <skill-name> # Load a specific skill`)},UX=()=>{u();let Q=process.argv[3];if(!Q){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 X=m(Q);if(!X){console.log(`Error: Skill not found: ${Q}
21
21
 
22
- Available skills:`),s();return}let{skillFile:X,sourceType:Z}=Q,Y=process.cwd(),q=X.startsWith(Y),z=D$(H.projectAgentsSkills)||D$(H.projectClaudeSkills);if(q)console.log(`Open this file with your Read Tool: ${X}
22
+ Available skills:`),t();return}let{skillFile:Y,sourceType:$}=X,Z=process.cwd(),q=Y.startsWith(Z),z=DQ(H.projectAgentsSkills)||DQ(H.projectClaudeSkills);if(q)console.log(`Open this file with your Read Tool: ${Y}
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(z&&Z!=="project")console.log(`Open this file with your Read Tool: ${X}
26
+ </IMPORTANT>`);else if(z&&$!=="project")console.log(`Open this file with your Read Tool: ${Y}
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 "${X}"
30
+ 2. If your Read tool fails (file outside workspace), use: cat "${Y}"
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: ${X}
33
+ </IMPORTANT>`);else console.log(`Open this file with your Read Tool: ${Y}
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 "${X}"
37
+ 2. If your Read tool fails (file outside workspace), use: cat "${Y}"
38
38
  3. NEVER skip loading the skill content
39
- </IMPORTANT>`)},LQ=()=>{let $=process.argv[3];if(!$){console.log(`Usage: superpowers-agent path <skill-name-or-alias>
39
+ </IMPORTANT>`)},IX=()=>{let Q=process.argv[3];if(!Q){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 X=m(Q);if(!X){console.log(`Error: Skill not found: ${Q}
50
50
 
51
- Available skills:`),s();return}let{skillFile:X}=Q;console.log(X)},UQ=()=>{let $=process.argv[3];if(!$){console.log(`Usage: superpowers-agent dir <skill-name>
51
+ Available skills:`),t();return}let{skillFile:Y}=X;console.log(Y)},LX=()=>{let Q=process.argv[3];if(!Q){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 X=m(Q);if(!X){console.log(`Error: Skill not found: ${Q}
62
62
 
63
- Available skills:`),s();return}let{skillFile:X}=Q,Z=GQ(X);console.log(Z)},IQ=()=>{u();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:Y}=X,$=GX(Y);console.log($)},JX=()=>{u();let Q=process.argv[3],X=process.argv[4];if(!Q||!X){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,69 +72,69 @@ 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 X=m($);if(!X){console.log(`Error: Skill not found: ${$}
75
+ short names like "block-collection" instead of the full path.`);return}let Y=m(Q);if(!Y){console.log(`Error: Skill not found: ${Q}
76
76
 
77
- Available skills:`),s();return}let{skillFile:Z}=X,Y=GQ(Z),q=Y$(Y);if(!q){console.log(`Error: No skill.json found for skill: ${$}
78
- Location: ${Y}`);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: ${Y}`);return}let z=$Q(Y,Q);if(!z){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(!D$(z)){console.log(`Error: Helper file not found: ${z}
81
- Defined in skill.json but missing from filesystem`);return}console.log(z)},JQ=()=>{let $=Z$();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,Z=GX($),q=qQ(Z);if(!q){console.log(`Error: No skill.json found for skill: ${Q}
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: ${Q}
79
+ Location: ${Z}`);return}let z=XX(Z,X);if(!z){console.log(`Error: No helper found matching "${X}" in skill: ${Q}`),console.log(`
80
+ Available helpers:`);for(let W of q.helpers)console.log(` - ${W}`);return}if(!DQ(z)){console.log(`Error: Helper file not found: ${z}
81
+ Defined in skill.json but missing from filesystem`);return}console.log(z)},wX=()=>{let Q=WQ();console.log("Current configuration:"),console.log(JSON.stringify(Q,null,2))},OX=()=>{let Q=process.argv[3],X=process.argv[4];if(!Q||X===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 X=Q;if(Q==="true")X=!0;else if(Q==="false")X=!1;let Z={};Z[$]=X,zQ(Z),console.log(`✓ Set ${$} = ${X}`)},wQ=()=>{u();let $=k(!0),Q=k(!1),X=[];for(let[q,z]of Object.entries($))X.push({alias:q,url:z,source:"global"});for(let[q,z]of Object.entries(Q)){let W=X.findIndex((K)=>K.alias===q);if(W>=0)X[W]={alias:q,url:z,source:"project"};else X.push({alias:q,url:z,source:"project"})}if(X.length===0){console.log(`No repository aliases configured.
88
+ .agents/superpowers-agent config-set auto_update true`);return}let Y=X;if(X==="true")Y=!0;else if(X==="false")Y=!1;let $={};$[Q]=Y,HX($),console.log(`✓ Set ${Q} = ${Y}`)},MX=()=>{u();let Q=k(!0),X=k(!1),Y=[];for(let[q,z]of Object.entries(Q))Y.push({alias:q,url:z,source:"global"});for(let[q,z]of Object.entries(X)){let W=Y.findIndex((K)=>K.alias===q);if(W>=0)Y[W]={alias:q,url:z,source:"project"};else Y.push({alias:q,url:z,source:"project"})}if(Y.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 Z=Math.max(5,...X.map((q)=>q.alias.length)),Y=Math.max(3,...X.map((q)=>q.url.length));console.log(`Repositories:
92
- `),console.log(`${"Alias".padEnd(Z)} ${"URL".padEnd(Y)} Source`);for(let q of X)console.log(`${q.alias.padEnd(Z)} ${q.url.padEnd(Y)} (${q.source})`);console.log(`
93
- Total: ${X.length} repository alias(es)`)};var V$=async()=>{try{let $=P(),Q=await _$();return{hasUpdates:G$(Q,$),localVersion:$,remoteVersion:Q}}catch{return{hasUpdates:!1,localVersion:P(),remoteVersion:"",error:!0}}};import{execSync as MQ}from"child_process";var R$=async({skipReinstall:$=!1}={})=>{console.log(`# Checking for Superpowers updates...
94
- `);let Q=await V$();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
- `),$){console.log(" Skipping install (--no-reinstall flag set)"),console.log(` Run manually: npm install -g @complexthings/superpowers-agent
91
+ superpowers-agent add-repository <git-url> [--as=@alias]`);return}let $=Math.max(5,...Y.map((q)=>q.alias.length)),Z=Math.max(3,...Y.map((q)=>q.url.length));console.log(`Repositories:
92
+ `),console.log(`${"Alias".padEnd($)} ${"URL".padEnd(Z)} Source`);for(let q of Y)console.log(`${q.alias.padEnd($)} ${q.url.padEnd(Z)} (${q.source})`);console.log(`
93
+ Total: ${Y.length} repository alias(es)`)};var GQ=async()=>{try{let Q=P(),X=await VQ();return{hasUpdates:_Q(X,Q),localVersion:Q,remoteVersion:X}}catch{return{hasUpdates:!1,localVersion:P(),remoteVersion:"",error:!0}}};import{execSync as AX}from"child_process";var RQ=async({skipReinstall:Q=!1}={})=>{console.log(`# Checking for Superpowers updates...
94
+ `);let X=await GQ();if(X.error){console.log("⚠️ Could not check for updates (network issue)");return}if(!X.hasUpdates){console.log(`✓ Already up to date (v${X.localVersion})`);return}if(console.log(`\uD83D\uDCE6 Update available: v${X.localVersion} → v${X.remoteVersion}
95
+ `),Q){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{MQ("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)}console.log(`
97
+ `);try{AX("npm install -g @complexthings/superpowers-agent",{stdio:"inherit"}),console.log(`
98
+ ✓ Update complete!`)}catch(Y){console.log(`
99
+ ✗ Update failed: ${Y.message}`),console.log(" Try running manually: npm install -g @complexthings/superpowers-agent"),process.exit(1)}console.log(`
100
100
  Running bootstrap to complete setup...
101
- `);try{MQ("superpowers-agent bootstrap --no-update",{stdio:"inherit"}),console.log(`
102
- ✓ Bootstrap complete!`)}catch(X){console.log(`
103
- ⚠️ Bootstrap step failed: ${X.message}`),console.log(" The update installed successfully. Run manually to finish setup:"),console.log(" superpowers-agent bootstrap")}},AQ=async()=>{u();let $=P();console.log(`Current version: ${$}`);try{let Q=await _$();if(console.log(`Latest version: ${Q}`),G$(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)}},TQ=()=>{let $=P();console.log($)};import{existsSync as A,readFileSync as a,writeFileSync as $$,rmSync as mQ,lstatSync as EY}from"fs";import{join as v,dirname as hQ,parse as e}from"path";import{execSync as R}from"child_process";import{platform as KY}from"os";import{execSync as bX}from"child_process";var q$=($)=>{try{return bX(`which ${$}`,{stdio:"pipe",timeout:2000}),!0}catch{return!1}};var D={opencode:{check:()=>q$("opencode"),cli:!0,name:"OpenCode",installUrl:"https://opencode.ai/docs/installation",bootstrapCommand:"install-opencode-commands"},claude:{check:()=>q$("claude"),cli:!0,name:"Claude Code",installUrl:"https://code.claude.com/docs/en/installation",bootstrapCommand:"install-claude-commands"},copilot:{check:()=>!0,cli:!1,name:"GitHub Copilot",bootstrapCommand:"install-copilot-prompts"}},vQ=()=>{let $=[];if(D.copilot.check())$.push("github-copilot");if(D.claude.check())$.push("claude-code");if(D.opencode.check())$.push("opencode");return $};import{existsSync as f$,readdirSync as gZ,lstatSync as CX,symlinkSync as NQ,unlinkSync as FX,mkdirSync as jX,readlinkSync as xX}from"fs";import{join as y$,dirname as uZ}from"path";import{platform as DX}from"os";var S$=($)=>{try{return CX($).isSymbolicLink()}catch{return!1}},RX=($,Q)=>{try{if(!S$($))return!1;return xX($)===Q}catch{return!1}},bQ=()=>{let $=y$(H.superpowersRepo,".opencode","plugins","superpowers-agent.js"),Q=y$(H.home,".config","opencode","plugins"),X=y$(Q,"superpowers-agent.js");if(console.log("Installing OpenCode plugin symlink..."),!f$($))return console.log("⚠️ Source plugin not found, skipping symlink creation"),console.log(` Expected at: ${$}`),{created:!1,error:"Source plugin not found"};if(RX(X,$))return console.log("✓ Plugin symlink already exists and is correct"),{created:!1,existed:!0};if(f$(X)&&!S$(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(!f$(Q))try{jX(Q,{recursive:!0}),console.log(`✓ Created ${Q.replace(H.home,"~")}`)}catch(Y){return console.log(`⚠️ Failed to create plugins directory: ${Y.message}`),{created:!1,error:`Failed to create directory: ${Y.message}`}}if(S$(X))try{FX(X)}catch(Y){return console.log(`⚠️ Failed to remove existing symlink: ${Y.message}`),{created:!1,error:`Failed to remove existing symlink: ${Y.message}`}}let Z=DX();try{if(Z==="win32")NQ($,X,"file");else NQ($,X);let Y=$.replace(H.home,"~"),q=X.replace(H.home,"~");return console.log(`✓ Created symlink: ${q}`),console.log(` -> ${Y}`),{created:!0}}catch(Y){if(Z==="win32"&&Y.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: ${Y.message}`),{created:!1,error:`Failed to create symlink: ${Y.message}`}}};import{existsSync as CQ,readdirSync as cZ,readFileSync as fX,writeFileSync as yX,mkdirSync as SX,copyFileSync as PX}from"fs";import{join as oZ,dirname as gX}from"path";var kX="superpowers-agent session-context",uX="superpowers-agent session-context --format=claude 2>/dev/null || true",dX="startup|resume|clear|compact",FQ=($=H.claudeSettings)=>{let Q={},X=!1,Z;if(CQ($)){X=!0;let B;try{B=fX($,"utf8")}catch(G){return{error:!0,message:`Failed to read settings.json: ${G.message}`}}try{Q=B.trim()?JSON.parse(B):{}}catch(G){return{error:!0,message:`settings.json is not valid JSON, leaving it untouched: ${G.message}`}}let _=new Date().toISOString().split("T")[0];Z=`${$}.backup-${_}`;try{PX($,Z)}catch(G){return{error:!0,message:`Failed to back up settings.json: ${G.message}`}}}if(typeof Q!=="object"||Q===null||Array.isArray(Q))return{error:!0,message:"settings.json root is not an object"};Q.hooks=Q.hooks||{};let Y=Array.isArray(Q.hooks.SessionStart)?Q.hooks.SessionStart:[],q=(B)=>{try{return JSON.stringify(B).includes(kX)}catch{return!1}},z=Y.some(q),W=Y.filter((B)=>!q(B)),K={matcher:dX,hooks:[{type:"command",command:uX}]};Q.hooks.SessionStart=[...W,K];let E=gX($);if(!CQ(E))try{SX(E,{recursive:!0})}catch(B){return{error:!0,message:`Failed to create ${E}: ${B.message}`}}try{yX($,JSON.stringify(Q,null,2)+`
104
- `,"utf8")}catch(B){return{error:!0,message:`Failed to write settings.json: ${B.message}`}}if(!X)return{created:!0};if(z)return{existed:!0,updated:!0,backup:Z};return{updated:!0,backup:Z}};import{existsSync as P$,readdirSync as rZ,readFileSync as mX,writeFileSync as hX,mkdirSync as pX}from"fs";import{join as cX}from"path";var nX="superpowers.json",oX=()=>({version:1,hooks:{sessionStart:[{type:"command",bash:"superpowers-agent session-context --format=copilot 2>/dev/null || true",powershell:"superpowers-agent session-context --format=copilot 2>$null; exit 0",timeoutSec:15}]}}),jQ=($=H.copilotHooksDir)=>{let Q=cX($,nX),X=JSON.stringify(oX(),null,2)+`
105
- `;if(P$(Q)){let Y;try{Y=mX(Q,"utf8")}catch(q){return{error:!0,message:`Failed to read ${Q}: ${q.message}`}}if(Y===X)return{existed:!0,path:Q}}if(!P$($))try{pX($,{recursive:!0})}catch(Y){return{error:!0,message:`Failed to create ${$}: ${Y.message}`}}let Z=P$(Q);try{hX(Q,X,"utf8")}catch(Y){return{error:!0,message:`Failed to write ${Q}: ${Y.message}`}}return Z?{updated:!0,path:Q}:{created:!0,path:Q}};import{existsSync as l,readdirSync as iX,lstatSync as lX,symlinkSync as L$,unlinkSync as g$,mkdirSync as xQ,readlinkSync as aX}from"fs";import{join as n,dirname as rX,basename as sX}from"path";import{homedir as o,platform as DQ}from"os";var U$=[{name:"claude",parentDir:()=>n(o(),".claude"),skillsDir:()=>n(o(),".claude","skills")},{name:"copilot",parentDir:()=>n(o(),".copilot"),skillsDir:()=>n(o(),".copilot","skills")},{name:"opencode",parentDir:()=>n(o(),".config","opencode"),skillsDir:()=>n(o(),".config","opencode","skill")}],t=($)=>{try{return lX($).isSymbolicLink()}catch{return!1}},RQ=($,Q)=>{try{if(!t($))return!1;return aX($)===Q}catch{return!1}},fQ=($,Q)=>{if(!l($))return{created:!1,existed:!1,error:`Source does not exist: ${$}`};if(RQ(Q,$))return{created:!1,existed:!0};if(l(Q)||t(Q))if(t(Q))try{g$(Q)}catch(Y){return{created:!1,existed:!1,error:`Failed to remove existing symlink: ${Y.message}`}}else return{created:!1,existed:!1,error:`Target exists and is not a symlink: ${Q}`};let X=rX(Q);if(!l(X))try{xQ(X,{recursive:!0})}catch(Y){return{created:!1,existed:!1,error:`Failed to create parent directory: ${Y.message}`}}let Z=DQ();try{if(Z==="win32")L$($,Q,"junction");else L$($,Q,"dir");return{created:!0,existed:!1}}catch(Y){if(Z==="win32"&&Y.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: ${Y.message}`}}},k$=($)=>{if(!l($)&&!t($))return{removed:!1,error:"Symlink does not exist"};if(!t($))return{removed:!1,error:"Target is not a symlink"};try{return g$($),{removed:!0}}catch(Q){return{removed:!1,error:`Failed to remove symlink: ${Q.message}`}}};var yQ=($,Q,X="skills")=>{let Z=y(!0);if(!Z.symlinks||!Z.symlinks[$])return;if(X==="superpowers")Z.symlinks[$].superpowers=null;else{let Y=Z.symlinks[$].skills||[];Z.symlinks[$].skills=Y.filter((q)=>q!==Q)}h(Z,!0)};var SQ=($,Q=[])=>{let X;try{X=iX($,{withFileTypes:!0})}catch{return Q}let Z=!1,Y=[];for(let q of X){if(!q.isDirectory()&&q.name==="SKILL.md")Z=!0;if(q.isDirectory()&&!q.name.startsWith("."))Y.push(n($,q.name))}if(Z)Q.push($);for(let q of Y)SQ(q,Q);return Q},PQ=()=>{let $=H.homeSuperpowersSkills,Q=H.homePersonalSkills;if(!l($))return{created:0,existed:0,updated:0,errors:[`Skills directory not found: ${$}`]};if(!l(Q))try{xQ(Q,{recursive:!0})}catch(Y){return{created:0,existed:0,updated:0,errors:[`Failed to create ${Q}: ${Y.message}`]}}let X=SQ($),Z={created:0,existed:0,updated:0,errors:[]};for(let Y of X){let q=sX(Y),z=n(Q,q);if(RQ(z,Y)){Z.existed++;continue}if(t(z))try{g$(z),Z.updated++}catch(K){Z.errors.push(`Failed to remove stale symlink ${z}: ${K.message}`);continue}else if(l(z)){Z.errors.push(`Skipped ${z}: path exists and is not a symlink`);continue}let W=DQ();try{if(W==="win32")L$(Y,z,"junction");else L$(Y,z,"dir");let K=z.replace(o(),"~"),E=Y.replace(o(),"~");console.log(` ✓ ${K} -> ${E}`),Z.created++}catch(K){Z.errors.push(`Failed to create symlink ${z}: ${K.message}`)}}return Z};import{existsSync as gQ,readdirSync as tX,lstatSync as eX,unlinkSync as $Y,realpathSync as kQ}from"fs";import{join as x}from"path";import{homedir as uQ}from"os";var QY=($)=>{try{return kQ($)}catch{return $}},XY=($)=>{try{return eX($).isSymbolicLink()}catch{return!1}},YY=($)=>{try{return kQ($)}catch{return null}},ZY=($,Q)=>{let X=Q.endsWith("/")?Q:Q+"/";return $.startsWith(X)||$===Q},qY=($,Q)=>Q.some((X)=>ZY($,X)),WY=($)=>{try{return gQ(x($,"skill.json"))}catch{return!1}},zY=({platformDirs:$,managedSkillRoots:Q})=>{let X=[],Z=0,Y=Q.map(QY);for(let q of $){if(!gQ(q))continue;let z;try{z=tX(q)}catch{continue}for(let W of z){let K=x(q,W);if(!XY(K))continue;let E=YY(K);if(!E||!qY(E,Y)){Z++;continue}if(!WY(E)){Z++;continue}try{$Y(K),X.push(K)}catch{Z++}}}return{removed:X,skipped:Z}},HY=($)=>{let Q=uQ(),X=[x(Q,".claude","skills"),x(Q,".copilot","skills"),x(Q,".config","opencode","skill"),x(Q,".cursor","skills"),x(Q,".gemini","skills"),x(Q,".codex","skills")];if(!$)return X;let Z=[x($,".claude","skills"),x($,".github","skills"),x($,".opencode","skill"),x($,".cursor","skills"),x($,".gemini","skills"),x($,".codex","skills")];return[...X,...Z]},dQ=($={})=>{let Q=uQ(),X=[x(Q,".agents","skills"),...$.projectRoot?[x($.projectRoot,".agents","skills")]:[]],Z=HY($.projectRoot);return zY({platformDirs:Z,managedSkillRoots:X})};var I$=($,Q,X,Z=!0)=>{let Y=A($);if(!Y&&!Z)return{updated:!1,created:!1,skipped:!0};let q=Q,z=new Date().toISOString().split("T")[0];q=q.replace(/\{\{DATE\}\}/g,z),q=q.replace(/\{\{SUPERPOWERS_PATH\}\}/g,H.superpowersRepo);let W=`<!-- SUPERPOWERS_SKILLS_START -->
101
+ `);try{AX("superpowers-agent bootstrap --no-update",{stdio:"inherit"}),console.log(`
102
+ ✓ Bootstrap complete!`)}catch(Y){console.log(`
103
+ ⚠️ Bootstrap step failed: ${Y.message}`),console.log(" The update installed successfully. Run manually to finish setup:"),console.log(" superpowers-agent bootstrap")}},TX=async()=>{u();let Q=P();console.log(`Current version: ${Q}`);try{let X=await VQ();if(console.log(`Latest version: ${X}`),_Q(X,Q))console.log("Update available: Yes"),process.exit(1);else console.log("You are up to date"),process.exit(0)}catch(X){console.log(`Error checking for updates: ${X.message}`),process.exit(1)}},vX=()=>{let Q=P();console.log(Q)};import{existsSync as A,readFileSync as r,writeFileSync as XQ,rmSync as hX,lstatSync as BZ}from"fs";import{join as v,dirname as pX,parse as QQ}from"path";import{execSync as f}from"child_process";import{platform as KZ}from"os";import{execSync as bY}from"child_process";var zQ=(Q)=>{try{return bY(`which ${Q}`,{stdio:"pipe",timeout:2000}),!0}catch{return!1}};var R={opencode:{check:()=>zQ("opencode"),cli:!0,name:"OpenCode",installUrl:"https://opencode.ai/docs/installation",bootstrapCommand:"install-opencode-commands"},claude:{check:()=>zQ("claude"),cli:!0,name:"Claude Code",installUrl:"https://code.claude.com/docs/en/installation",bootstrapCommand:"install-claude-commands"},copilot:{check:()=>!0,cli:!1,name:"GitHub Copilot",bootstrapCommand:"install-copilot-prompts"}},CX=()=>{let Q=[];if(R.copilot.check())Q.push("github-copilot");if(R.claude.check())Q.push("claude-code");if(R.opencode.check())Q.push("opencode");return Q};import{existsSync as fQ,readdirSync as g0,lstatSync as NY,symlinkSync as bX,unlinkSync as FY,mkdirSync as jY,readlinkSync as xY}from"fs";import{join as SQ,dirname as u0}from"path";import{platform as DY}from"os";var yQ=(Q)=>{try{return NY(Q).isSymbolicLink()}catch{return!1}},RY=(Q,X)=>{try{if(!yQ(Q))return!1;return xY(Q)===X}catch{return!1}},NX=()=>{let Q=SQ(H.superpowersRepo,".opencode","plugins","superpowers-agent.js"),X=SQ(H.home,".config","opencode","plugins"),Y=SQ(X,"superpowers-agent.js");if(console.log("Installing OpenCode plugin symlink..."),!fQ(Q))return console.log("⚠️ Source plugin not found, skipping symlink creation"),console.log(` Expected at: ${Q}`),{created:!1,error:"Source plugin not found"};if(RY(Y,Q))return console.log("✓ Plugin symlink already exists and is correct"),{created:!1,existed:!0};if(fQ(Y)&&!yQ(Y))return console.log("⚠️ Warning: A file already exists at the destination path"),console.log(` Path: ${Y}`),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(!fQ(X))try{jY(X,{recursive:!0}),console.log(`✓ Created ${X.replace(H.home,"~")}`)}catch(Z){return console.log(`⚠️ Failed to create plugins directory: ${Z.message}`),{created:!1,error:`Failed to create directory: ${Z.message}`}}if(yQ(Y))try{FY(Y)}catch(Z){return console.log(`⚠️ Failed to remove existing symlink: ${Z.message}`),{created:!1,error:`Failed to remove existing symlink: ${Z.message}`}}let $=DY();try{if($==="win32")bX(Q,Y,"file");else bX(Q,Y);let Z=Q.replace(H.home,"~"),q=Y.replace(H.home,"~");return console.log(`✓ Created symlink: ${q}`),console.log(` -> ${Z}`),{created:!0}}catch(Z){if($==="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 FX,readdirSync as c0,readFileSync as fY,writeFileSync as SY,mkdirSync as yY,copyFileSync as PY}from"fs";import{join as o0,dirname as gY}from"path";var kY="superpowers-agent session-context",uY="superpowers-agent session-context --format=claude 2>/dev/null || true",dY="startup|resume|clear|compact",jX=(Q=H.claudeSettings)=>{let X={},Y=!1,$;if(FX(Q)){Y=!0;let E;try{E=fY(Q,"utf8")}catch(_){return{error:!0,message:`Failed to read settings.json: ${_.message}`}}try{X=E.trim()?JSON.parse(E):{}}catch(_){return{error:!0,message:`settings.json is not valid JSON, leaving it untouched: ${_.message}`}}let V=new Date().toISOString().split("T")[0];$=`${Q}.backup-${V}`;try{PY(Q,$)}catch(_){return{error:!0,message:`Failed to back up settings.json: ${_.message}`}}}if(typeof X!=="object"||X===null||Array.isArray(X))return{error:!0,message:"settings.json root is not an object"};X.hooks=X.hooks||{};let Z=Array.isArray(X.hooks.SessionStart)?X.hooks.SessionStart:[],q=(E)=>{try{return JSON.stringify(E).includes(kY)}catch{return!1}},z=Z.some(q),W=Z.filter((E)=>!q(E)),K={matcher:dY,hooks:[{type:"command",command:uY}]};X.hooks.SessionStart=[...W,K];let B=gY(Q);if(!FX(B))try{yY(B,{recursive:!0})}catch(E){return{error:!0,message:`Failed to create ${B}: ${E.message}`}}try{SY(Q,JSON.stringify(X,null,2)+`
104
+ `,"utf8")}catch(E){return{error:!0,message:`Failed to write settings.json: ${E.message}`}}if(!Y)return{created:!0};if(z)return{existed:!0,updated:!0,backup:$};return{updated:!0,backup:$}};import{existsSync as PQ,readdirSync as r0,readFileSync as mY,writeFileSync as hY,mkdirSync as pY}from"fs";import{join as cY}from"path";var nY="superpowers.json",oY=()=>({version:1,hooks:{sessionStart:[{type:"command",bash:"superpowers-agent session-context --format=copilot 2>/dev/null || true",powershell:"superpowers-agent session-context --format=copilot 2>$null; exit 0",timeoutSec:15}]}}),xX=(Q=H.copilotHooksDir)=>{let X=cY(Q,nY),Y=JSON.stringify(oY(),null,2)+`
105
+ `;if(PQ(X)){let Z;try{Z=mY(X,"utf8")}catch(q){return{error:!0,message:`Failed to read ${X}: ${q.message}`}}if(Z===Y)return{existed:!0,path:X}}if(!PQ(Q))try{pY(Q,{recursive:!0})}catch(Z){return{error:!0,message:`Failed to create ${Q}: ${Z.message}`}}let $=PQ(X);try{hY(X,Y,"utf8")}catch(Z){return{error:!0,message:`Failed to write ${X}: ${Z.message}`}}return $?{updated:!0,path:X}:{created:!0,path:X}};import{existsSync as a,readdirSync as iY,lstatSync as lY,symlinkSync as UQ,unlinkSync as gQ,mkdirSync as DX,readlinkSync as aY}from"fs";import{join as n,dirname as rY,basename as sY}from"path";import{homedir as o,platform as RX}from"os";var IQ=[{name:"claude",parentDir:()=>n(o(),".claude"),skillsDir:()=>n(o(),".claude","skills")},{name:"copilot",parentDir:()=>n(o(),".copilot"),skillsDir:()=>n(o(),".copilot","skills")},{name:"opencode",parentDir:()=>n(o(),".config","opencode"),skillsDir:()=>n(o(),".config","opencode","skill")}],e=(Q)=>{try{return lY(Q).isSymbolicLink()}catch{return!1}},fX=(Q,X)=>{try{if(!e(Q))return!1;return aY(Q)===X}catch{return!1}},SX=(Q,X)=>{if(!a(Q))return{created:!1,existed:!1,error:`Source does not exist: ${Q}`};if(fX(X,Q))return{created:!1,existed:!0};if(a(X)||e(X))if(e(X))try{gQ(X)}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: ${X}`};let Y=rY(X);if(!a(Y))try{DX(Y,{recursive:!0})}catch(Z){return{created:!1,existed:!1,error:`Failed to create parent directory: ${Z.message}`}}let $=RX();try{if($==="win32")UQ(Q,X,"junction");else UQ(Q,X,"dir");return{created:!0,existed:!1}}catch(Z){if($==="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}`}}},kQ=(Q)=>{if(!a(Q)&&!e(Q))return{removed:!1,error:"Symlink does not exist"};if(!e(Q))return{removed:!1,error:"Target is not a symlink"};try{return gQ(Q),{removed:!0}}catch(X){return{removed:!1,error:`Failed to remove symlink: ${X.message}`}}};var yX=(Q,X,Y="skills")=>{let $=y(!0);if(!$.symlinks||!$.symlinks[Q])return;if(Y==="superpowers")$.symlinks[Q].superpowers=null;else{let Z=$.symlinks[Q].skills||[];$.symlinks[Q].skills=Z.filter((q)=>q!==X)}h($,!0)};var PX=(Q,X=[])=>{let Y;try{Y=iY(Q,{withFileTypes:!0})}catch{return X}let $=!1,Z=[];for(let q of Y){if(!q.isDirectory()&&q.name==="SKILL.md")$=!0;if(q.isDirectory()&&!q.name.startsWith("."))Z.push(n(Q,q.name))}if($)X.push(Q);for(let q of Z)PX(q,X);return X},gX=()=>{let Q=H.homeSuperpowersSkills,X=H.homePersonalSkills;if(!a(Q))return{created:0,existed:0,updated:0,errors:[`Skills directory not found: ${Q}`]};if(!a(X))try{DX(X,{recursive:!0})}catch(Z){return{created:0,existed:0,updated:0,errors:[`Failed to create ${X}: ${Z.message}`]}}let Y=PX(Q),$={created:0,existed:0,updated:0,errors:[]};for(let Z of Y){let q=sY(Z),z=n(X,q);if(fX(z,Z)){$.existed++;continue}if(e(z))try{gQ(z),$.updated++}catch(K){$.errors.push(`Failed to remove stale symlink ${z}: ${K.message}`);continue}else if(a(z)){$.errors.push(`Skipped ${z}: path exists and is not a symlink`);continue}let W=RX();try{if(W==="win32")UQ(Z,z,"junction");else UQ(Z,z,"dir");let K=z.replace(o(),"~"),B=Z.replace(o(),"~");console.log(` ✓ ${K} -> ${B}`),$.created++}catch(K){$.errors.push(`Failed to create symlink ${z}: ${K.message}`)}}return $};import{existsSync as kX,readdirSync as tY,lstatSync as eY,unlinkSync as QZ,realpathSync as uX}from"fs";import{join as D}from"path";import{homedir as dX}from"os";var XZ=(Q)=>{try{return uX(Q)}catch{return Q}},YZ=(Q)=>{try{return eY(Q).isSymbolicLink()}catch{return!1}},ZZ=(Q)=>{try{return uX(Q)}catch{return null}},$Z=(Q,X)=>{let Y=X.endsWith("/")?X:X+"/";return Q.startsWith(Y)||Q===X},qZ=(Q,X)=>X.some((Y)=>$Z(Q,Y)),WZ=(Q)=>{try{return kX(D(Q,"skill.json"))}catch{return!1}},zZ=({platformDirs:Q,managedSkillRoots:X})=>{let Y=[],$=0,Z=X.map(XZ);for(let q of Q){if(!kX(q))continue;let z;try{z=tY(q)}catch{continue}for(let W of z){let K=D(q,W);if(!YZ(K))continue;let B=ZZ(K);if(!B||!qZ(B,Z)){$++;continue}if(!WZ(B)){$++;continue}try{QZ(K),Y.push(K)}catch{$++}}}return{removed:Y,skipped:$}},HZ=(Q)=>{let X=dX(),Y=[D(X,".claude","skills"),D(X,".copilot","skills"),D(X,".config","opencode","skill"),D(X,".cursor","skills"),D(X,".gemini","skills"),D(X,".codex","skills")];if(!Q)return Y;let $=[D(Q,".claude","skills"),D(Q,".github","skills"),D(Q,".opencode","skill"),D(Q,".cursor","skills"),D(Q,".gemini","skills"),D(Q,".codex","skills")];return[...Y,...$]},mX=(Q={})=>{let X=dX(),Y=[D(X,".agents","skills"),...Q.projectRoot?[D(Q.projectRoot,".agents","skills")]:[]],$=HZ(Q.projectRoot);return zZ({platformDirs:$,managedSkillRoots:Y})};var LQ=(Q,X,Y,$=!0)=>{let Z=A(Q);if(!Z&&!$)return{updated:!1,created:!1,skipped:!0};let q=X,z=new Date().toISOString().split("T")[0];q=q.replace(/\{\{DATE\}\}/g,z),q=q.replace(/\{\{SUPERPOWERS_PATH\}\}/g,H.superpowersRepo);let W=`<!-- SUPERPOWERS_SKILLS_START -->
106
106
  ${q}
107
- <!-- SUPERPOWERS_SKILLS_END -->`;if(Y){let K=new Date().toISOString().split("T")[0],E=`${$}.backup-${K}`;try{R(`cp "${$}" "${E}"`,{stdio:"pipe"})}catch(I){return{updated:!1,error:!0,message:`Failed to backup: ${I.message}`}}let B;try{B=a($,"utf8")}catch(I){return{updated:!1,error:!0,message:`Failed to read: ${I.message}`}}let _="<!-- SUPERPOWERS_SKILLS_START -->",G="<!-- SUPERPOWERS_SKILLS_END -->",V;if(B.includes(_)&&B.includes(G)){let I=new RegExp(`${_}[\\s\\S]*?${G}`,"g");V=B.replace(I,W)}else{let I=B.match(/^#\s+.+$/m);if(I){let U=B.indexOf(`
108
- `,I.index)+1;V=B.slice(0,U)+`
107
+ <!-- SUPERPOWERS_SKILLS_END -->`;if(Z){let K=new Date().toISOString().split("T")[0],B=`${Q}.backup-${K}`;try{f(`cp "${Q}" "${B}"`,{stdio:"pipe"})}catch(L){return{updated:!1,error:!0,message:`Failed to backup: ${L.message}`}}let E;try{E=r(Q,"utf8")}catch(L){return{updated:!1,error:!0,message:`Failed to read: ${L.message}`}}let V="<!-- SUPERPOWERS_SKILLS_START -->",_="<!-- SUPERPOWERS_SKILLS_END -->",U;if(E.includes(V)&&E.includes(_)){let L=new RegExp(`${V}[\\s\\S]*?${_}`,"g");U=E.replace(L,W)}else{let L=E.match(/^#\s+.+$/m);if(L){let I=E.indexOf(`
108
+ `,L.index)+1;U=E.slice(0,I)+`
109
109
  `+W+`
110
- `+B.slice(U)}else V=W+`
110
+ `+E.slice(I)}else U=W+`
111
111
 
112
- `+B}try{return $$($,V,"utf8"),{updated:!0,created:!1,backup:E}}catch(I){return{updated:!1,error:!0,message:`Failed to write: ${I.message}`}}}else try{let K=hQ($);if(!A(K))R(`mkdir -p "${K}"`,{stdio:"pipe"});let _=`# ${e($).base.toUpperCase()}
112
+ `+E}try{return XQ(Q,U,"utf8"),{updated:!0,created:!1,backup:B}}catch(L){return{updated:!1,error:!0,message:`Failed to write: ${L.message}`}}}else try{let K=pX(Q);if(!A(K))f(`mkdir -p "${K}"`,{stdio:"pipe"});let V=`# ${QQ(Q).base.toUpperCase()}
113
113
 
114
- `+W;return $$($,_,"utf8"),{updated:!1,created:!0}}catch(K){return{updated:!1,created:!1,error:!0,message:`Failed to create: ${K.message}`}}},BY=()=>{console.log("Installing Unix aliases...");let $=v(H.superpowersRepo,".agents","superpowers-agent"),Q=v(H.home,".local","bin"),X=v(Q,"superpowers-agent"),Z=v(Q,"superpowers");if(!A($)){console.log("⚠️ superpowers-agent executable not found");return}if(!A(Q))try{R(`mkdir -p "${Q}"`,{stdio:"pipe"}),console.log(`✓ Created ${Q}`)}catch(q){console.log(`⚠️ Failed to create ${Q}: ${q.message}`);return}try{if(A(X))R(`rm "${X}"`,{stdio:"pipe"});R(`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(A(Z))R(`rm "${Z}"`,{stdio:"pipe"});R(`ln -s "${$}" "${Z}"`,{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(`
115
- ⚠️ 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"
116
- `)},_Y=()=>{console.log("Installing Windows aliases..."),console.log("✓ Windows alias installation (implementation pending)")},u$=()=>{let $=KY();if(console.log(`## Installing Universal Aliases
117
- `),$==="win32")return _Y();else return BY()},GY=($)=>{let Q=v(H.superpowersRepo,".github","copilot-instructions.md"),X=v(H.superpowersRepo,"skills","meta","using-superpowers","SKILL.md"),Z=v($,".github","copilot-instructions.md"),Y="<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->",q="<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->";if(!A(Q))return{error:!0,message:"Source template not found"};if(!A(X))return{error:!0,message:"using-superpowers SKILL.md not found"};let z,W;try{z=a(Q,"utf8"),W=a(X,"utf8")}catch(B){return{error:!0,message:`Failed to read source files: ${B.message}`}}let K=z.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=hQ(Z);try{if(!A(E))R(`mkdir -p "${E}"`,{stdio:"pipe"})}catch(B){return{error:!0,message:`Failed to create .github directory: ${B.message}`}}if(A(Z)){let B;try{B=a(Z,"utf8")}catch(V){return{error:!0,message:`Failed to read existing file: ${V.message}`}}let _=new Date().toISOString().replace(/[:.]/g,"-"),G=`${Z}.backup-${_}`;try{R(`cp "${Z}" "${G}"`,{stdio:"pipe"})}catch(V){return{error:!0,message:`Failed to backup: ${V.message}`}}if(B.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->")&&B.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->")){let V=new RegExp("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->[\\s\\S]*?<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->","g"),I=B.replace(V,K.trim());try{return $$(Z,I,"utf8"),{updated:!0,backup:G}}catch(U){return{error:!0,message:`Failed to update: ${U.message}`}}}else{let V=B.trimEnd()+`
114
+ `+W;return XQ(Q,V,"utf8"),{updated:!1,created:!0}}catch(K){return{updated:!1,created:!1,error:!0,message:`Failed to create: ${K.message}`}}},EZ=()=>{console.log("Installing Unix aliases...");let Q=v(H.superpowersRepo,".agents","superpowers-agent"),X=v(H.home,".local","bin"),Y=v(X,"superpowers-agent"),$=v(X,"superpowers");if(!A(Q)){console.log("⚠️ superpowers-agent executable not found");return}if(!A(X))try{f(`mkdir -p "${X}"`,{stdio:"pipe"}),console.log(`✓ Created ${X}`)}catch(q){console.log(`⚠️ Failed to create ${X}: ${q.message}`);return}try{if(A(Y))f(`rm "${Y}"`,{stdio:"pipe"});f(`ln -s "${Q}" "${Y}"`,{stdio:"pipe"}),console.log(`✓ Created symlink: superpowers-agent -> ${Q}`)}catch(q){console.log(`⚠️ Failed to create superpowers-agent symlink: ${q.message}`)}try{if(A($))f(`rm "${$}"`,{stdio:"pipe"});f(`ln -s "${Q}" "${$}"`,{stdio:"pipe"}),console.log(`✓ Created symlink: superpowers -> ${Q}`)}catch(q){console.log(`⚠️ Failed to create superpowers symlink: ${q.message}`)}if(!(process.env.PATH||"").includes(X))console.log(`
115
+ ⚠️ Warning: ${X} is not in your PATH`),console.log(" Add this to your shell profile (~/.bashrc, ~/.zshrc, etc.):"),console.log(` export PATH="$HOME/.local/bin:$PATH"
116
+ `)},VZ=()=>{console.log("Installing Windows aliases..."),console.log("✓ Windows alias installation (implementation pending)")},uQ=()=>{let Q=KZ();if(console.log(`## Installing Universal Aliases
117
+ `),Q==="win32")return VZ();else return EZ()},_Z=(Q)=>{let X=v(H.superpowersRepo,".github","copilot-instructions.md"),Y=v(H.superpowersRepo,"skills","meta","using-superpowers","SKILL.md"),$=v(Q,".github","copilot-instructions.md"),Z="<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->",q="<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->";if(!A(X))return{error:!0,message:"Source template not found"};if(!A(Y))return{error:!0,message:"using-superpowers SKILL.md not found"};let z,W;try{z=r(X,"utf8"),W=r(Y,"utf8")}catch(E){return{error:!0,message:`Failed to read source files: ${E.message}`}}let K=z.replace("${content}",W);if(!K.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->")||!K.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->"))return{error:!0,message:"Template is missing required markers"};let B=pX($);try{if(!A(B))f(`mkdir -p "${B}"`,{stdio:"pipe"})}catch(E){return{error:!0,message:`Failed to create .github directory: ${E.message}`}}if(A($)){let E;try{E=r($,"utf8")}catch(U){return{error:!0,message:`Failed to read existing file: ${U.message}`}}let V=new Date().toISOString().replace(/[:.]/g,"-"),_=`${$}.backup-${V}`;try{f(`cp "${$}" "${_}"`,{stdio:"pipe"})}catch(U){return{error:!0,message:`Failed to backup: ${U.message}`}}if(E.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->")&&E.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->")){let U=new RegExp("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->[\\s\\S]*?<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->","g"),L=E.replace(U,K.trim());try{return XQ($,L,"utf8"),{updated:!0,backup:_}}catch(I){return{error:!0,message:`Failed to update: ${I.message}`}}}else{let U=E.trimEnd()+`
118
118
 
119
119
  `+K.trim()+`
120
- `;try{return $$(Z,V,"utf8"),{updated:!0,backup:G}}catch(I){return{error:!0,message:`Failed to append: ${I.message}`}}}}else try{return $$(Z,K,"utf8"),{created:!0}}catch(B){return{error:!0,message:`Failed to create: ${B.message}`}}},pQ=()=>{u(),console.log(`# Setting up Superpowers skills for this project
121
- `);let $=process.cwd(),Q=v($,".agents"),X=v(Q,"skills"),Z=v($,"AGENTS.md"),Y=v(Q,"AGENTS.md"),q=A(Z)?Z:Y,z=v(H.superpowersRepo,".agents","templates","AGENTS.md.template");if(!A(z)){console.log(`✗ Error: AGENTS.md template not found
120
+ `;try{return XQ($,U,"utf8"),{updated:!0,backup:_}}catch(L){return{error:!0,message:`Failed to append: ${L.message}`}}}}else try{return XQ($,K,"utf8"),{created:!0}}catch(E){return{error:!0,message:`Failed to create: ${E.message}`}}},cX=()=>{u(),console.log(`# Setting up Superpowers skills for this project
121
+ `);let Q=process.cwd(),X=v(Q,".agents"),Y=v(X,"skills"),$=v(Q,"AGENTS.md"),Z=v(X,"AGENTS.md"),q=A($)?$:Z,z=v(H.superpowersRepo,".agents","templates","AGENTS.md.template");if(!A(z)){console.log(`✗ Error: AGENTS.md template not found
122
122
  Expected at: ${z}
123
- Please update your Superpowers installation`);return}if(!A(Q))try{R(`mkdir -p "${Q}"`,{stdio:"pipe"}),console.log("✓ Created .agents/ directory")}catch(O){console.log(`✗ Failed to create .agents/ directory: ${O.message}`);return}else console.log("✓ .agents/ directory exists");if(!A(X))try{R(`mkdir -p "${X}"`,{stdio:"pipe"}),R(`touch "${v(X,".gitkeep")}"`,{stdio:"pipe"}),console.log("✓ Created .agents/skills/ directory")}catch(O){console.log(`✗ Failed to create skills directory: ${O.message}`);return}else console.log("✓ .agents/skills/ directory exists");let W=v(Q,"docs"),K=v(W,"SUPERPOWERS.md"),E=v(H.superpowersRepo,".agents","templates","SUPERPOWERS.md.template");if(!A(W))try{R(`mkdir -p "${W}"`,{stdio:"pipe"}),console.log("✓ Created .agents/docs/ directory")}catch(O){console.log(`⚠️ Failed to create docs directory: ${O.message}`)}else console.log("✓ .agents/docs/ directory exists");let B=A(q);if(B){let O=new Date().toISOString().split("T")[0],c=`${q}.backup-${O}`;try{R(`cp "${q}" "${c}"`,{stdio:"pipe"}),console.log(`✓ Backed up existing AGENTS.md to ${e(c).base}`)}catch(E$){console.log(`✗ Failed to backup AGENTS.md: ${E$.message}`);return}}let _;try{_=a(z,"utf8")}catch(O){console.log(`✗ Failed to read template: ${O.message}`);return}let G=P();if(_=_.replace(/\{\{VERSION\}\}/g,G),A(E))try{let O=a(E,"utf8"),c=new Date().toISOString().split("T")[0];O=O.replace(/\{\{VERSION\}\}/g,G),O=O.replace(/\{\{DATE\}\}/g,c),$$(K,O,"utf8"),console.log("✓ Created .agents/docs/SUPERPOWERS.md")}catch(O){console.log(`⚠️ Failed to create SUPERPOWERS.md: ${O.message}`)}else console.log("⚠️ SUPERPOWERS.md.template not found");let V=[],I=v($,".github","copilot-instructions.md"),U=v(H.home,".github","copilot-instructions.md");if(A(I)||A(U)||D.copilot.check())V.push("github-copilot");let M=v($,"CLAUDE.md"),C=v(Q,"CLAUDE.md");if(A(M)||A(C)||D.claude.check())V.push("claude-code");if(D.opencode.check())V.push("opencode");console.log(`
124
- Detected platforms for project: ${V.join(", ")||"none"}
125
- `);let f=V.filter((O)=>["github-copilot","opencode"].includes(O)),N=I$(q,_,f,!B);if(N.created)console.log(`✓ Created AGENTS.md with platform tool mappings (${q===Z?"root":".agents/"})`);else if(N.updated)console.log(`✓ Updated AGENTS.md with platform tool mappings (${q===Z?"root":".agents/"})`);else if(N.error)console.log("⚠️ Failed to update AGENTS.md");let H$=A(M)?M:C,L=I$(H$,_,["claude-code"],!1);if(L.created)console.log(`✓ Created CLAUDE.md with Claude Code tool mappings (${H$===M?"root":".agents/"})`);else if(L.updated){if(console.log(`✓ Updated CLAUDE.md with Claude Code tool mappings (${H$===M?"root":".agents/"})`),L.backup)console.log(` Backed up to ${e(L.backup).base}`)}else if(L.skipped)console.log("ℹ️ Skipped CLAUDE.md (does not exist)");else if(L.error)console.log("⚠️ Failed to update CLAUDE.md");let J=v($,".github","copilot-instructions.md"),F={skipped:!0};if(V.includes("github-copilot")){if(F=GY($),F.created)console.log("✓ Created .github/copilot-instructions.md with Superpowers instructions");else if(F.updated){if(console.log("✓ Updated .github/copilot-instructions.md with Superpowers instructions"),F.backup)console.log(` Backed up to ${e(F.backup).base}`)}else if(F.error)console.log(`⚠️ Failed to update .github/copilot-instructions.md: ${F.message||""}`)}else console.log("ℹ️ Skipped .github/copilot-instructions.md (GitHub Copilot not detected)");let S=!A(Z)&&!A(Y);if(A(J)&&S){let O=I$(J,_,["github-copilot"],!1);if(O.updated){if(console.log("✓ Updated .github/copilot-instructions.md with GitHub Copilot tool mappings"),O.backup)console.log(` Backed up to ${e(O.backup).base}`)}else if(O.error)console.log("⚠️ Failed to update .github/copilot-instructions.md with tool mappings")}else if(A(J)&&!S)console.log("ℹ️ Skipped .github/copilot-instructions.md tool mappings (AGENTS.md exists, using that instead)");else if(!A(J)&&!V.includes("github-copilot"))console.log("ℹ️ Skipped .github/copilot-instructions.md tool mappings (does not exist)");let g=`
123
+ Please update your Superpowers installation`);return}if(!A(X))try{f(`mkdir -p "${X}"`,{stdio:"pipe"}),console.log("✓ Created .agents/ directory")}catch(w){console.log(`✗ Failed to create .agents/ directory: ${w.message}`);return}else console.log("✓ .agents/ directory exists");if(!A(Y))try{f(`mkdir -p "${Y}"`,{stdio:"pipe"}),f(`touch "${v(Y,".gitkeep")}"`,{stdio:"pipe"}),console.log("✓ Created .agents/skills/ directory")}catch(w){console.log(`✗ Failed to create skills directory: ${w.message}`);return}else console.log("✓ .agents/skills/ directory exists");let W=v(X,"docs"),K=v(W,"SUPERPOWERS.md"),B=v(H.superpowersRepo,".agents","templates","SUPERPOWERS.md.template");if(!A(W))try{f(`mkdir -p "${W}"`,{stdio:"pipe"}),console.log("✓ Created .agents/docs/ directory")}catch(w){console.log(`⚠️ Failed to create docs directory: ${w.message}`)}else console.log("✓ .agents/docs/ directory exists");let E=A(q);if(E){let w=new Date().toISOString().split("T")[0],c=`${q}.backup-${w}`;try{f(`cp "${q}" "${c}"`,{stdio:"pipe"}),console.log(`✓ Backed up existing AGENTS.md to ${QQ(c).base}`)}catch(BQ){console.log(`✗ Failed to backup AGENTS.md: ${BQ.message}`);return}}let V;try{V=r(z,"utf8")}catch(w){console.log(`✗ Failed to read template: ${w.message}`);return}let _=P();if(V=V.replace(/\{\{VERSION\}\}/g,_),A(B))try{let w=r(B,"utf8"),c=new Date().toISOString().split("T")[0];w=w.replace(/\{\{VERSION\}\}/g,_),w=w.replace(/\{\{DATE\}\}/g,c),XQ(K,w,"utf8"),console.log("✓ Created .agents/docs/SUPERPOWERS.md")}catch(w){console.log(`⚠️ Failed to create SUPERPOWERS.md: ${w.message}`)}else console.log("⚠️ SUPERPOWERS.md.template not found");let U=[],L=v(Q,".github","copilot-instructions.md"),I=v(H.home,".github","copilot-instructions.md");if(A(L)||A(I)||R.copilot.check())U.push("github-copilot");let M=v(Q,"CLAUDE.md"),N=v(X,"CLAUDE.md");if(A(M)||A(N)||R.claude.check())U.push("claude-code");if(R.opencode.check())U.push("opencode");console.log(`
124
+ Detected platforms for project: ${U.join(", ")||"none"}
125
+ `);let S=U.filter((w)=>["github-copilot","opencode"].includes(w)),C=LQ(q,V,S,!E);if(C.created)console.log(`✓ Created AGENTS.md with platform tool mappings (${q===$?"root":".agents/"})`);else if(C.updated)console.log(`✓ Updated AGENTS.md with platform tool mappings (${q===$?"root":".agents/"})`);else if(C.error)console.log("⚠️ Failed to update AGENTS.md");let i=A(M)?M:N,G=LQ(i,V,["claude-code"],!1);if(G.created)console.log(`✓ Created CLAUDE.md with Claude Code tool mappings (${i===M?"root":".agents/"})`);else if(G.updated){if(console.log(`✓ Updated CLAUDE.md with Claude Code tool mappings (${i===M?"root":".agents/"})`),G.backup)console.log(` Backed up to ${QQ(G.backup).base}`)}else if(G.skipped)console.log("ℹ️ Skipped CLAUDE.md (does not exist)");else if(G.error)console.log("⚠️ Failed to update CLAUDE.md");let J=v(Q,".github","copilot-instructions.md"),F={skipped:!0};if(U.includes("github-copilot")){if(F=_Z(Q),F.created)console.log("✓ Created .github/copilot-instructions.md with Superpowers instructions");else if(F.updated){if(console.log("✓ Updated .github/copilot-instructions.md with Superpowers instructions"),F.backup)console.log(` Backed up to ${QQ(F.backup).base}`)}else if(F.error)console.log(`⚠️ Failed to update .github/copilot-instructions.md: ${F.message||""}`)}else console.log("ℹ️ Skipped .github/copilot-instructions.md (GitHub Copilot not detected)");let x=!A($)&&!A(Z);if(A(J)&&x){let w=LQ(J,V,["github-copilot"],!1);if(w.updated){if(console.log("✓ Updated .github/copilot-instructions.md with GitHub Copilot tool mappings"),w.backup)console.log(` Backed up to ${QQ(w.backup).base}`)}else if(w.error)console.log("⚠️ Failed to update .github/copilot-instructions.md with tool mappings")}else if(A(J)&&!x)console.log("ℹ️ Skipped .github/copilot-instructions.md tool mappings (AGENTS.md exists, using that instead)");else if(!A(J)&&!U.includes("github-copilot"))console.log("ℹ️ Skipped .github/copilot-instructions.md tool mappings (does not exist)");let g=`
126
126
  # Setup complete!
127
127
 
128
128
  Your project now has:
129
- - .agents/ directory structure`;if(N.updated||N.created)g+=`
130
- - AGENTS.md with universal skills instructions`;if(L.updated||L.created)g+=`
129
+ - .agents/ directory structure`;if(C.updated||C.created)g+=`
130
+ - AGENTS.md with universal skills instructions`;if(G.updated||G.created)g+=`
131
131
  - CLAUDE.md with Claude Code skills instructions`;if(F.updated||F.created)g+=`
132
132
  - .github/copilot-instructions.md with Superpowers instructions`;g+=`
133
133
  - .agents/skills/ ready for project-specific skills`,g+=`
134
134
  - .agents/docs/SUPERPOWERS.md for detailed reference
135
- `,console.log(g)},VY=()=>{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)=>v(H.vscodeUserDir,"prompts",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)=>v(H.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)=>v(H.home,".config","opencode","command",X))],Q=0;for(let X of $)if(A(X))try{mQ(X),Q++}catch(Z){console.log(` ⚠️ Could not remove ${X}: ${Z.message}`)}if(Q>0)console.log(`✓ Removed ${Q} legacy prompt/command file${Q!==1?"s":""}`);else console.log("✓ No legacy prompt/command files found")},LY=()=>{let $=0;for(let Q of U$){let X=Q.skillsDir(),Z=v(X,"superpowers");try{if(EY(Z).isSymbolicLink())mQ(Z),console.log(`✓ Removed legacy superpowers symlink from ${X.replace(H.home,"~")}`),$++}catch{}}if($===0)console.log("✓ No legacy superpowers directory symlinks found")},cQ=async()=>{u(),console.log(`# Superpowers Bootstrap for Agents
135
+ `,console.log(g)},GZ=()=>{let Q=[...["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((Y)=>v(H.vscodeUserDir,"prompts",Y)),...["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((Y)=>v(H.home,".claude","commands",Y)),...["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((Y)=>v(H.home,".config","opencode","command",Y))],X=0;for(let Y of Q)if(A(Y))try{hX(Y),X++}catch($){console.log(` ⚠️ Could not remove ${Y}: ${$.message}`)}if(X>0)console.log(`✓ Removed ${X} legacy prompt/command file${X!==1?"s":""}`);else console.log("✓ No legacy prompt/command files found")},UZ=()=>{let Q=0;for(let X of IQ){let Y=X.skillsDir(),$=v(Y,"superpowers");try{if(BZ($).isSymbolicLink())hX($),console.log(`✓ Removed legacy superpowers symlink from ${Y.replace(H.home,"~")}`),Q++}catch{}}if(Q===0)console.log("✓ No legacy superpowers directory symlinks found")},nX=async()=>{u(),console.log(`# Superpowers Bootstrap for Agents
136
136
  # ==================================
137
- `);let $=process.argv.includes("--no-update"),X=new Set(["copilot","claude","opencode"].filter((z)=>process.argv.includes(`--force-${z}`))),Z=X.size>0;if(!$){let z=Z$(),W=await V$();if(W.error)console.log(`## Update Check
137
+ `);let Q=process.argv.includes("--no-update"),Y=new Set(["copilot","claude","opencode"].filter((z)=>process.argv.includes(`--force-${z}`))),$=Y.size>0;if(!Q){let z=WQ(),W=await GQ();if(W.error)console.log(`## Update Check
138
138
 
139
139
  ⚠️ Could not check for updates (network issue)
140
140
 
@@ -143,47 +143,47 @@ Your project now has:
143
143
  `),console.log(`⚠️ Update available: v${W.localVersion} → v${W.remoteVersion}
144
144
  To update, run: \`npm install -g @complexthings/superpowers-agent\``),console.log(`
145
145
  ---
146
- `)}if(!Z)u$(),console.log(`---
147
- `);if(!Z)console.log(`## Cleaning Up Legacy Files
148
- `),VY(),console.log(`
146
+ `)}if(!$)uQ(),console.log(`---
147
+ `);if(!$)console.log(`## Cleaning Up Legacy Files
148
+ `),GZ(),console.log(`
149
149
  ---
150
- `);if(!Z||X.has("copilot")){if(console.log(`## GitHub Copilot Integration
151
- `),console.log("✓ Skill symlinks handled in sync step below"),q$("copilot")||A(v(H.home,".copilot"))||X.has("copilot")){let W=jQ();if(W.created)console.log(`✓ Installed Copilot sessionStart hook -> ${W.path.replace(H.home,"~")}`);else if(W.updated)console.log(`✓ Updated Copilot sessionStart hook -> ${W.path.replace(H.home,"~")}`);else if(W.existed)console.log("✓ Copilot sessionStart hook already up to date");else if(W.error)console.log(`⚠️ Failed to install Copilot sessionStart hook: ${W.message}`)}else console.log("ℹ️ Skipped Copilot sessionStart hook (Copilot CLI not detected; run with --force-copilot to install anyway)");console.log(`
150
+ `);if(!$||Y.has("copilot")){if(console.log(`## GitHub Copilot Integration
151
+ `),console.log("✓ Skill symlinks handled in sync step below"),zQ("copilot")||A(v(H.home,".copilot"))||Y.has("copilot")){let W=xX();if(W.created)console.log(`✓ Installed Copilot sessionStart hook -> ${W.path.replace(H.home,"~")}`);else if(W.updated)console.log(`✓ Updated Copilot sessionStart hook -> ${W.path.replace(H.home,"~")}`);else if(W.existed)console.log("✓ Copilot sessionStart hook already up to date");else if(W.error)console.log(`⚠️ Failed to install Copilot sessionStart hook: ${W.message}`)}else console.log("ℹ️ Skipped Copilot sessionStart hook (Copilot CLI not detected; run with --force-copilot to install anyway)");console.log(`
152
152
  ---
153
- `)}if(!Z||X.has("claude")){if(console.log(`## Claude Code Integration
154
- `),!D.claude.check()&&!X.has("claude"))console.log(`⚠️ Skipped (${D.claude.name} CLI not detected)
153
+ `)}if(!$||Y.has("claude")){if(console.log(`## Claude Code Integration
154
+ `),!R.claude.check()&&!Y.has("claude"))console.log(`⚠️ Skipped (${R.claude.name} CLI not detected)
155
155
  \uD83D\uDCA1 To enable Claude Code integration:
156
- 1. Install Claude Code: ${D.claude.installUrl}
157
- 2. Run: superpowers-agent bootstrap --force-claude`);else{console.log("✓ Skill symlinks handled in sync step below");let W=FQ();if(W.created)console.log(`✓ Installed SessionStart hook -> ${H.claudeSettings.replace(H.home,"~")}`);else if(W.updated){if(console.log(`✓ ${W.existed?"Refreshed":"Added"} SessionStart hook in ${H.claudeSettings.replace(H.home,"~")}`),W.backup)console.log(` Backed up to ${e(W.backup).base}`)}else if(W.error)console.log(`⚠️ Failed to install SessionStart hook: ${W.message}`)}console.log(`
156
+ 1. Install Claude Code: ${R.claude.installUrl}
157
+ 2. Run: superpowers-agent bootstrap --force-claude`);else{console.log("✓ Skill symlinks handled in sync step below");let W=jX();if(W.created)console.log(`✓ Installed SessionStart hook -> ${H.claudeSettings.replace(H.home,"~")}`);else if(W.updated){if(console.log(`✓ ${W.existed?"Refreshed":"Added"} SessionStart hook in ${H.claudeSettings.replace(H.home,"~")}`),W.backup)console.log(` Backed up to ${QQ(W.backup).base}`)}else if(W.error)console.log(`⚠️ Failed to install SessionStart hook: ${W.message}`)}console.log(`
158
158
  ---
159
- `)}if(!Z||X.has("opencode")){if(console.log(`## OpenCode Integration
160
- `),D.opencode.check())bQ();else console.log(`⚠️ Skipped (${D.opencode.name} CLI not detected)
159
+ `)}if(!$||Y.has("opencode")){if(console.log(`## OpenCode Integration
160
+ `),R.opencode.check())NX();else console.log(`⚠️ Skipped (${R.opencode.name} CLI not detected)
161
161
  \uD83D\uDCA1 To enable OpenCode integration:
162
- 1. Install OpenCode: ${D.opencode.installUrl}
163
- 2. Run: superpowers-agent ${D.opencode.bootstrapCommand}`);console.log(`
162
+ 1. Install OpenCode: ${R.opencode.installUrl}
163
+ 2. Run: superpowers-agent ${R.opencode.bootstrapCommand}`);console.log(`
164
164
  ---
165
- `)}if(!Z){console.log(`## Generating Platform-Specific Files
166
- `);let z=vQ();console.log(`Detected platforms: ${z.join(", ")||"none"}
167
- `);let W=v(H.superpowersRepo,".agents","templates","AGENTS.md.template"),K="";try{K=a(W,"utf8")}catch(E){console.log(`⚠️ Could not read AGENTS.md template: ${E.message}
168
- `)}if(K){let E=P();K=K.replace(/\{\{VERSION\}\}/g,E);let B=v(H.home,".agents","AGENTS.md"),_=I$(B,K,z,!0);if(_.created)console.log(`✓ Created ${B}`);else if(_.updated)console.log(`✓ Updated ${B}`)}console.log(`
165
+ `)}if(!$){console.log(`## Generating Platform-Specific Files
166
+ `);let z=CX();console.log(`Detected platforms: ${z.join(", ")||"none"}
167
+ `);let W=v(H.superpowersRepo,".agents","templates","AGENTS.md.template"),K="";try{K=r(W,"utf8")}catch(B){console.log(`⚠️ Could not read AGENTS.md template: ${B.message}
168
+ `)}if(K){let B=P();K=K.replace(/\{\{VERSION\}\}/g,B);let E=v(H.home,".agents","AGENTS.md"),V=LQ(E,K,z,!0);if(V.created)console.log(`✓ Created ${E}`);else if(V.updated)console.log(`✓ Updated ${E}`)}console.log(`
169
169
  ---
170
170
  `)}console.log(`## Cleaning Up Legacy Superpowers Dir Symlinks
171
- `),LY(),console.log(`
171
+ `),UZ(),console.log(`
172
172
  ---
173
173
  `),console.log(`## Syncing Repo Skills -> ~/.agents/skills/
174
- `);let Y=PQ();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 z of Y.errors)console.log(` ⚠️ ${z}`);else console.log(` ✓ ${Y.existed} skill symlinks already up to date`);console.log(`
174
+ `);let Z=gX();if(Z.created>0||Z.updated>0)console.log(` ✓ ${Z.created} created, ${Z.updated} updated, ${Z.existed} already current`);else if(Z.errors.length>0)for(let z of Z.errors)console.log(` ⚠️ ${z}`);else console.log(` ✓ ${Z.existed} skill symlinks already up to date`);console.log(`
175
175
  ---
176
176
  `),console.log(`## Cleaning Up Stale Platform Skill Symlinks
177
- `);let q=dQ({projectRoot:process.cwd()});if(q.removed.length>0){console.log(` ✓ Removed ${q.removed.length} stale skill symlink(s):`);for(let z of q.removed)console.log(` - ${z}`)}else console.log(" ✓ No stale platform skill symlinks found");console.log(`
177
+ `);let q=mX({projectRoot:process.cwd()});if(q.removed.length>0){console.log(` ✓ Removed ${q.removed.length} stale skill symlink(s):`);for(let z of q.removed)console.log(` - ${z}`)}else console.log(" ✓ No stale platform skill symlinks found");console.log(`
178
178
  ---
179
179
  `),console.log(`# Bootstrap Complete!
180
180
  `),console.log("✓ All integrations installed"),console.log("✓ Skills system ready"),console.log(`✓ Skill symlinks synced
181
- `),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 b,readFileSync as O$,mkdirSync as vY,rmSync as n$,cpSync as NY,lstatSync as bY}from"fs";import{join as T,dirname as w$,parse as z$,sep as CY}from"path";import{execSync as j}from"child_process";import{homedir as p}from"os";import{createInterface as FY}from"readline";import{readFileSync as UY,existsSync as h$,unlinkSync as IY,lstatSync as JY,mkdirSync as OY}from"fs";import{join as wY,dirname as MY}from"path";import{join as W$}from"path";import{homedir as nQ}from"os";var d$={github:{name:"github",sourceDir:".github/agents",sourceExt:".agent.md",getDestDir:()=>W$(H.vscodeUserDir,"prompts"),destExt:".agent.md"},opencode:{name:"opencode",sourceDir:".opencode/agents",sourceExt:".md",getDestDir:()=>W$(nQ(),".config","opencode","agents"),destExt:".md"},claude:{name:"claude",sourceDir:".claude/agents",sourceExt:".md",getDestDir:()=>W$(nQ(),".claude","agents"),destExt:".md"}};function oQ($,Q,X){let Z=d$[Q];if(!Z)return null;return W$($,Z.sourceDir,`${X}${Z.sourceExt}`)}function iQ($,Q){let X=d$[$];if(!X)return null;return W$(X.getDestDir(),`${Q}${X.destExt}`)}function m$(){return Object.keys(d$)}function AY($){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$(),X=[];for(let[Z,Y]of Object.entries($.agents)){if(!Q.includes(Z)){X.push(Z);continue}if(!Array.isArray(Y))return{valid:!1,error:`agents.${Z} must be an array of agent names`};for(let q of Y)if(typeof q!=="string")return{valid:!1,error:`agents.${Z} must contain only string agent names`}}return{valid:!0,data:$,skippedPlatforms:X}}function TY($,Q){if(!h$($))return{installed:!1,error:`Source file not found: ${$}`};if(h$(Q))try{if(!JY(Q).isSymbolicLink())IY(Q)}catch(Z){}OY(MY(Q),{recursive:!0});let X=fQ($,Q);if(X.error)return{installed:!1,error:X.error};return{installed:!0}}function p$($,Q={}){let X=wY($,"agents.json");if(!h$(X))return;let Z;try{Z=JSON.parse(UY(X,"utf8"))}catch(V){console.log(`
182
- ⚠ Could not parse agents.json: ${V.message}`);return}let Y=AY(Z);if(!Y.valid){console.log(`
183
- ⚠ Invalid agents.json: ${Y.error}`);return}for(let V of Y.skippedPlatforms)console.log(` ⚠ Skipping unknown platform: ${V}`);let q=Z.repository||"unknown",z=Z.version,W=Q.isUpdate?"Updating":"Installing",K=Q.isUpdate?"Updated":"Installed";console.log(`
184
- \uD83D\uDCE6 Found agents.json (${q} v${z})`);let E=m$(),B=0,_=0,G=[];for(let[V,I]of Object.entries(Z.agents)){if(!E.includes(V))continue;console.log(`
185
- ${W} ${V} agents:`);for(let U of I){let M=oQ($,V,U),C=iQ(V,U),f=TY(M,C);if(f.installed)console.log(` ✓ ${U}`),G.push({platformKey:V,agentName:U,sourcePath:M,destPath:C}),B++;else console.log(` ✗ ${U}: ${f.error}`),_++}}if(G.length>0){let V=y(!0);if(!V.installedAgents)V.installedAgents={};if(!V.installedAgents[q])V.installedAgents[q]={version:z,agents:{}};V.installedAgents[q].version=z;for(let{platformKey:I,agentName:U,sourcePath:M,destPath:C}of G){if(!V.installedAgents[q].agents[I])V.installedAgents[q].agents[I]={};V.installedAgents[q].agents[I][U]={source:M,destination:C,installedAt:new Date().toISOString()}}h(V,!0)}if(B>0)console.log(`
186
- ${K} ${B} agent(s)${_>0?` (${_} failed)`:""}`)}var lQ=($,Q)=>{if(Q.type==="local"){let Z=$;for(let Y=0;Y<10;Y++){if(b(T(Z,"agents.json")))return Z;let q=w$(Z);if(q===Z)break;Z=q}return $}let X=T(".agents","tmp");if($.includes(X)){let Z=$.indexOf(X),q=$.substring(Z+X.length+1).split(CY)[0];return T($.substring(0,Z),".agents","tmp",q)}return $},aQ=($,Q)=>{let X=T(p(),".agents","repos"),Z=Q.replace(/^@/,"").replace(/[^a-zA-Z0-9_-]/g,"_"),Y=T(X,Z);try{if(vY(X,{recursive:!0}),b(Y))n$(Y,{recursive:!0,force:!0});return NY($,Y,{recursive:!0}),Y}catch(q){return console.log(` Warning: Could not persist repository for agents: ${q.message}`),null}},o$=($)=>{let Q=$.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/tree\/([^/]+)\/(.+)$/);if(Q){let[,Y,q,z,W]=Q;return{type:"git-tree",repoUrl:`https://github.com/${Y}/${q}.git`,branch:z,path:W,original:$}}let X=$.match(/^git@github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/);if(X){let[,Y,q]=X;return{type:"git-repo",repoUrl:`git@github.com:${Y}/${q}.git`,branch:null,path:null,original:$}}let Z=$.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/);if(Z){let[,Y,q]=Z;return{type:"git-repo",repoUrl:`https://github.com/${Y}/${q}.git`,branch:null,path:null,original:$}}if(b($))return{type:"local",path:$,original:$};return null},i$=($)=>{let Q=$.includes("--global")||$.includes("-g"),X=$.includes("--project")||$.includes("-p");if(Q)return T(p(),".agents","skills");if(X)return T(process.cwd(),".agents","skills");let Z=T(process.cwd(),".agents","config.json"),Y=T(p(),".agents","config.json");for(let q of[Z,Y])if(b(q))try{if(JSON.parse(O$(q,"utf8")).installLocation==="project")return T(process.cwd(),".agents","skills")}catch(z){}return T(p(),".agents","skills")},l$=($,Q)=>{let X=T(p(),".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(Z){try{j(`rm -rf "${X}"`,{stdio:"pipe"})}catch{}throw Error(`Failed to clone repository: ${Z.message}`)}},Q$=($)=>{let Q=T($,"skill.json");if(!b(Q))return null;try{let X=O$(Q,"utf8");return JSON.parse(X)}catch(X){throw Error(`Failed to read skill.json: ${X.message}`)}},J$=($,Q,X,Z)=>{let Y=T($,Q);if(!b(Y)){Z.errors.push(`Skill directory not found: ${Q}`);return}let q=Q$(Y);if(!q){Z.errors.push(`No skill.json found in: ${Q}`);return}let z=q.name||Q,W=z.split("/").pop()||z,K=T(X,W),E=w$(K);try{j(`mkdir -p "${E}"`,{stdio:"pipe"})}catch(B){Z.errors.push(`Failed to create directory ${E}: ${B.message}`);return}try{if(b(K))j(`rm -rf "${K}"`,{stdio:"pipe"});j(`cp -R "${Y}" "${K}"`,{stdio:"pipe"}),Z.installed.push({name:W,path:K,title:q.title||q.description||W})}catch(B){Z.errors.push(`Failed to install ${Q}: ${B.message}`)}},rQ=($,Q,X,Z,Y=null)=>{let q=y(Z);if(!q.installedSkills)q.installedSkills={};let z={source:$,installBase:Q,installedAt:new Date().toISOString(),skills:X.installed.map((W)=>({name:W.name,path:W.path}))};if(q.installedSkills[$]=z,Y&&Y!==$)q.installedSkills[Y]=z;h(q,Z)},sQ=()=>{let $=process.argv.slice(3),Q=$.find((_)=>!_.startsWith("-")),X=$.filter((_)=>_.startsWith("-"));if(!Q){console.log(`Usage: superpowers-agent add <url-or-path|@alias> [skill-path] [options]
181
+ `),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 b,readFileSync as wQ,mkdirSync as vZ,rmSync as oQ,cpSync as CZ,lstatSync as bZ}from"fs";import{join as T,dirname as OQ,parse as HQ,sep as NZ}from"path";import{execSync as j}from"child_process";import{homedir as p}from"os";import{createInterface as FZ}from"readline";import{readFileSync as IZ,existsSync as pQ,unlinkSync as LZ,lstatSync as JZ,mkdirSync as wZ}from"fs";import{join as OZ,dirname as MZ}from"path";import{join as YQ}from"path";import{homedir as dQ}from"os";var mQ={github:{name:"github",sourceDir:".github/agents",sourceExt:".agent.md",getDestDir:()=>YQ(H.vscodeUserDir,"prompts"),getExtraDestDirs:()=>[YQ(dQ(),".copilot","agents")],destExt:".agent.md"},opencode:{name:"opencode",sourceDir:".opencode/agents",sourceExt:".md",getDestDir:()=>YQ(dQ(),".config","opencode","agents"),destExt:".md"},claude:{name:"claude",sourceDir:".claude/agents",sourceExt:".md",getDestDir:()=>YQ(dQ(),".claude","agents"),destExt:".md"}};function oX(Q,X,Y){let $=mQ[X];if(!$)return null;return YQ(Q,$.sourceDir,`${Y}${$.sourceExt}`)}function iX(Q,X){let Y=mQ[Q];if(!Y)return[];return[Y.getDestDir(),...Y.getExtraDestDirs?Y.getExtraDestDirs():[]].map((Z)=>YQ(Z,`${X}${Y.destExt}`))}function hQ(){return Object.keys(mQ)}function AZ(Q){if(!Q||typeof Q!=="object")return{valid:!1,error:"agents.json must be a JSON object"};if(!Q.version||typeof Q.version!=="string")return{valid:!1,error:'agents.json must have a "version" string field'};if(!Q.agents||typeof Q.agents!=="object")return{valid:!1,error:'agents.json must have an "agents" object field'};let X=hQ(),Y=[];for(let[$,Z]of Object.entries(Q.agents)){if(!X.includes($)){Y.push($);continue}if(!Array.isArray(Z))return{valid:!1,error:`agents.${$} must be an array of agent names`};for(let q of Z)if(typeof q!=="string")return{valid:!1,error:`agents.${$} must contain only string agent names`}}return{valid:!0,data:Q,skippedPlatforms:Y}}function TZ(Q,X){if(!pQ(Q))return{installed:!1,error:`Source file not found: ${Q}`};if(pQ(X))try{if(!JZ(X).isSymbolicLink())LZ(X)}catch($){}wZ(MZ(X),{recursive:!0});let Y=SX(Q,X);if(Y.error)return{installed:!1,error:Y.error};return{installed:!0}}function cQ(Q,X={}){let Y=OZ(Q,"agents.json");if(!pQ(Y))return;let $;try{$=JSON.parse(IZ(Y,"utf8"))}catch(U){console.log(`
182
+ ⚠ Could not parse agents.json: ${U.message}`);return}let Z=AZ($);if(!Z.valid){console.log(`
183
+ ⚠ Invalid agents.json: ${Z.error}`);return}for(let U of Z.skippedPlatforms)console.log(` ⚠ Skipping unknown platform: ${U}`);let q=$.repository||"unknown",z=$.version,W=X.isUpdate?"Updating":"Installing",K=X.isUpdate?"Updated":"Installed";console.log(`
184
+ \uD83D\uDCE6 Found agents.json (${q} v${z})`);let B=hQ(),E=0,V=0,_=[];for(let[U,L]of Object.entries($.agents)){if(!B.includes(U))continue;console.log(`
185
+ ${W} ${U} agents:`);for(let I of L){let M=oX(Q,U,I),N=iX(U,I),S=[],C=[];for(let i of N){let G=TZ(M,i);if(G.installed)S.push(i);else C.push(G.error)}if(S.length>0)console.log(` ✓ ${I}`),_.push({platformKey:U,agentName:I,sourcePath:M,destPaths:S}),E++;else console.log(` ✗ ${I}: ${C.join("; ")}`),V++}}if(_.length>0){let U=y(!0);if(!U.installedAgents)U.installedAgents={};if(!U.installedAgents[q])U.installedAgents[q]={version:z,agents:{}};U.installedAgents[q].version=z;for(let{platformKey:L,agentName:I,sourcePath:M,destPaths:N}of _){if(!U.installedAgents[q].agents[L])U.installedAgents[q].agents[L]={};U.installedAgents[q].agents[L][I]={source:M,destination:N[0],destinations:N,installedAt:new Date().toISOString()}}h(U,!0)}if(E>0)console.log(`
186
+ ${K} ${E} agent(s)${V>0?` (${V} failed)`:""}`)}var lX=(Q,X)=>{if(X.type==="local"){let $=Q;for(let Z=0;Z<10;Z++){if(b(T($,"agents.json")))return $;let q=OQ($);if(q===$)break;$=q}return Q}let Y=T(".agents","tmp");if(Q.includes(Y)){let $=Q.indexOf(Y),q=Q.substring($+Y.length+1).split(NZ)[0];return T(Q.substring(0,$),".agents","tmp",q)}return Q},aX=(Q,X)=>{let Y=T(p(),".agents","repos"),$=X.replace(/^@/,"").replace(/[^a-zA-Z0-9_-]/g,"_"),Z=T(Y,$);try{if(vZ(Y,{recursive:!0}),b(Z))oQ(Z,{recursive:!0,force:!0});return CZ(Q,Z,{recursive:!0}),Z}catch(q){return console.log(` Warning: Could not persist repository for agents: ${q.message}`),null}},iQ=(Q)=>{let X=Q.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/tree\/([^/]+)\/(.+)$/);if(X){let[,Z,q,z,W]=X;return{type:"git-tree",repoUrl:`https://github.com/${Z}/${q}.git`,branch:z,path:W,original:Q}}let Y=Q.match(/^git@github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/);if(Y){let[,Z,q]=Y;return{type:"git-repo",repoUrl:`git@github.com:${Z}/${q}.git`,branch:null,path:null,original:Q}}let $=Q.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/);if($){let[,Z,q]=$;return{type:"git-repo",repoUrl:`https://github.com/${Z}/${q}.git`,branch:null,path:null,original:Q}}if(b(Q))return{type:"local",path:Q,original:Q};return null},lQ=(Q)=>{let X=Q.includes("--global")||Q.includes("-g"),Y=Q.includes("--project")||Q.includes("-p");if(X)return T(p(),".agents","skills");if(Y)return T(process.cwd(),".agents","skills");let $=T(process.cwd(),".agents","config.json"),Z=T(p(),".agents","config.json");for(let q of[$,Z])if(b(q))try{if(JSON.parse(wQ(q,"utf8")).installLocation==="project")return T(process.cwd(),".agents","skills")}catch(z){}return T(p(),".agents","skills")},aQ=(Q,X)=>{let Y=T(p(),".agents","tmp",`skill-install-${Date.now()}`);try{if(j(`mkdir -p "${Y}"`,{stdio:"pipe"}),X)j(`git clone --branch ${X} --depth 1 "${Q}" "${Y}"`,{stdio:"pipe",timeout:30000});else j(`git clone --depth 1 "${Q}" "${Y}"`,{stdio:"pipe",timeout:30000});return Y}catch($){try{j(`rm -rf "${Y}"`,{stdio:"pipe"})}catch{}throw Error(`Failed to clone repository: ${$.message}`)}},ZQ=(Q)=>{let X=T(Q,"skill.json");if(!b(X))return null;try{let Y=wQ(X,"utf8");return JSON.parse(Y)}catch(Y){throw Error(`Failed to read skill.json: ${Y.message}`)}},JQ=(Q,X,Y,$)=>{let Z=T(Q,X);if(!b(Z)){$.errors.push(`Skill directory not found: ${X}`);return}let q=ZQ(Z);if(!q){$.errors.push(`No skill.json found in: ${X}`);return}let z=q.name||X,W=z.split("/").pop()||z,K=T(Y,W),B=OQ(K);try{j(`mkdir -p "${B}"`,{stdio:"pipe"})}catch(E){$.errors.push(`Failed to create directory ${B}: ${E.message}`);return}try{if(b(K))j(`rm -rf "${K}"`,{stdio:"pipe"});j(`cp -R "${Z}" "${K}"`,{stdio:"pipe"}),$.installed.push({name:W,path:K,title:q.title||q.description||W})}catch(E){$.errors.push(`Failed to install ${X}: ${E.message}`)}},rX=(Q,X,Y,$,Z=null)=>{let q=y($);if(!q.installedSkills)q.installedSkills={};let z={source:Q,installBase:X,installedAt:new Date().toISOString(),skills:Y.installed.map((W)=>({name:W.name,path:W.path}))};if(q.installedSkills[Q]=z,Z&&Z!==Q)q.installedSkills[Z]=z;h(q,$)},sX=()=>{let Q=process.argv.slice(3),X=Q.find((V)=>!V.startsWith("-")),Y=Q.filter((V)=>V.startsWith("-"));if(!X){console.log(`Usage: superpowers-agent add <url-or-path|@alias> [skill-path] [options]
187
187
 
188
188
  Options:
189
189
  --global, -g Install skills globally in ~/.agents/skills/ (default)
@@ -205,18 +205,18 @@ Description:
205
205
 
206
206
  Repository aliases can be added using:
207
207
  superpowers-agent add-repository <git-url> [--as=@alias]`);return}console.log(`Installing skill(s)...
208
- `);let Z=!X.includes("--project")&&!X.includes("-p"),Y=null,q=null,z=null;if(Q.startsWith("@")){let _=Q;z=_,q=$.find((U,M)=>M>0&&!U.startsWith("-")&&U!==_);let G=k(!1),V=k(!0);if(G[_])Y=G[_],console.log(`Using project repository alias: ${_}`);else if(V[_])Y=V[_],console.log(`Using global repository alias: ${_}`);else{console.log(`Error: Repository alias not found: ${_}`),console.log(`
209
- Available aliases:`);let U={...V,...G};if(Object.keys(U).length===0)console.log(" (none)"),console.log(`
210
- Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[M,C]of Object.entries(U))console.log(` ${M} -> ${C}`);return}let I=b(Y);if(q)if(I)Q=T(Y,q),console.log(`Repository path: ${Y}`),console.log(`Skill path: ${q}
211
- `);else Q=Y,console.log(`Repository URL: ${Y}`),console.log(`Skill path: ${q}
212
- `);else if(Q=Y,I)console.log(`Repository path: ${Y}
213
- `);else console.log(`Repository URL: ${Y}
214
- `)}let W=o$(Q);if(!W){console.log(`Error: Invalid URL or path not found: ${Q}`);return}if(q&&W.type==="git-repo"&&!W.path)W.path=q;let K=i$(X);console.log(`Install location: ${K}
215
- `);let E,B=!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=l$(W.repoUrl,W.branch),B=!0,W.path){if(E=T(E,W.path),!b(E))throw Error(`Path not found in repository: ${W.path}`)}console.log("")}else E=W.path;let _=Q$(E);if(!_)throw Error("No skill.json found in source directory");let G={installed:[],errors:[],source:W.original};if(_.skills&&Array.isArray(_.skills)){console.log(`Found ${_.skills.length} skill(s) to install
216
- `);for(let U of _.skills)J$(E,U,K,G)}else{let U=_.name||z$(E).base;J$(w$(E),z$(E).base,K,G)}let V=lQ(E,W),I=T(V,"agents.json");if(b(I)){let U=V;if(B){let M;try{M=JSON.parse(O$(I,"utf8"))}catch{}let C=M?.repository||W.original,f=aQ(V,C);if(f)U=f}p$(U,{isUpdate:!1})}if(B&&E)try{let U=E.split("/.agents/tmp/")[0]+"/.agents/tmp/"+E.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${U}"`,{stdio:"pipe"})}catch{}if(console.log(`
217
- **Successfully installed skills:**`),console.log(`- Source: ${G.source}`),G.installed.length>0)for(let U of G.installed)console.log(` - Installed: ${U.name} at ${U.path}`),console.log(` ${U.title}`);if(G.errors.length>0){console.log(`
218
- **Errors:**`);for(let U of G.errors)console.log(` - ${U}`)}if(G.installed.length===0&&G.errors.length===0)console.log(" No skills were installed");if(G.installed.length>0)rQ(W.original,K,G,Z,z)}catch(_){if(B&&E)try{let G=E.split("/.agents/tmp/")[0]+"/.agents/tmp/"+E.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${G}"`,{stdio:"pipe"})}catch{}console.log(`
219
- Error: ${_.message}`)}},tQ=()=>{let $=process.argv.slice(3),Q=$.find((_)=>!_.startsWith("-")),X=$.filter((_)=>_.startsWith("-"));if(!Q){console.log(`Usage: superpowers-agent pull <url-or-path|@alias> [skill-path] [options]
208
+ `);let $=!Y.includes("--project")&&!Y.includes("-p"),Z=null,q=null,z=null;if(X.startsWith("@")){let V=X;z=V,q=Q.find((I,M)=>M>0&&!I.startsWith("-")&&I!==V);let _=k(!1),U=k(!0);if(_[V])Z=_[V],console.log(`Using project repository alias: ${V}`);else if(U[V])Z=U[V],console.log(`Using global repository alias: ${V}`);else{console.log(`Error: Repository alias not found: ${V}`),console.log(`
209
+ Available aliases:`);let I={...U,..._};if(Object.keys(I).length===0)console.log(" (none)"),console.log(`
210
+ Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[M,N]of Object.entries(I))console.log(` ${M} -> ${N}`);return}let L=b(Z);if(q)if(L)X=T(Z,q),console.log(`Repository path: ${Z}`),console.log(`Skill path: ${q}
211
+ `);else X=Z,console.log(`Repository URL: ${Z}`),console.log(`Skill path: ${q}
212
+ `);else if(X=Z,L)console.log(`Repository path: ${Z}
213
+ `);else console.log(`Repository URL: ${Z}
214
+ `)}let W=iQ(X);if(!W){console.log(`Error: Invalid URL or path not found: ${X}`);return}if(q&&W.type==="git-repo"&&!W.path)W.path=q;let K=lQ(Y);console.log(`Install location: ${K}
215
+ `);let B,E=!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(B=aQ(W.repoUrl,W.branch),E=!0,W.path){if(B=T(B,W.path),!b(B))throw Error(`Path not found in repository: ${W.path}`)}console.log("")}else B=W.path;let V=ZQ(B);if(!V)throw Error("No skill.json found in source directory");let _={installed:[],errors:[],source:W.original};if(V.skills&&Array.isArray(V.skills)){console.log(`Found ${V.skills.length} skill(s) to install
216
+ `);for(let I of V.skills)JQ(B,I,K,_)}else{let I=V.name||HQ(B).base;JQ(OQ(B),HQ(B).base,K,_)}let U=lX(B,W),L=T(U,"agents.json");if(b(L)){let I=U;if(E){let M;try{M=JSON.parse(wQ(L,"utf8"))}catch{}let N=M?.repository||W.original,S=aX(U,N);if(S)I=S}cQ(I,{isUpdate:!1})}if(E&&B)try{let I=B.split("/.agents/tmp/")[0]+"/.agents/tmp/"+B.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${I}"`,{stdio:"pipe"})}catch{}if(console.log(`
217
+ **Successfully installed skills:**`),console.log(`- Source: ${_.source}`),_.installed.length>0)for(let I of _.installed)console.log(` - Installed: ${I.name} at ${I.path}`),console.log(` ${I.title}`);if(_.errors.length>0){console.log(`
218
+ **Errors:**`);for(let I of _.errors)console.log(` - ${I}`)}if(_.installed.length===0&&_.errors.length===0)console.log(" No skills were installed");if(_.installed.length>0)rX(W.original,K,_,$,z)}catch(V){if(E&&B)try{let _=B.split("/.agents/tmp/")[0]+"/.agents/tmp/"+B.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${_}"`,{stdio:"pipe"})}catch{}console.log(`
219
+ Error: ${V.message}`)}},tX=()=>{let Q=process.argv.slice(3),X=Q.find((V)=>!V.startsWith("-")),Y=Q.filter((V)=>V.startsWith("-"));if(!X){console.log(`Usage: superpowers-agent pull <url-or-path|@alias> [skill-path] [options]
220
220
 
221
221
  Options:
222
222
  --global, -g Update skills globally in ~/.agents/skills/ (default)
@@ -241,18 +241,18 @@ Description:
241
241
 
242
242
  Repository aliases can be added using:
243
243
  superpowers-agent add-repository <git-url> [--as=@alias]`);return}console.log(`Updating skill(s)...
244
- `);let Z=!X.includes("--project")&&!X.includes("-p"),Y=null,q=null,z=null;if(Q.startsWith("@")){let _=Q;z=_,q=$.find((U,M)=>M>0&&!U.startsWith("-")&&U!==_);let G=k(!1),V=k(!0);if(G[_])Y=G[_],console.log(`Using project repository alias: ${_}`);else if(V[_])Y=V[_],console.log(`Using global repository alias: ${_}`);else{console.log(`Error: Repository alias not found: ${_}`),console.log(`
245
- Available aliases:`);let U={...V,...G};if(Object.keys(U).length===0)console.log(" (none)"),console.log(`
246
- Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[M,C]of Object.entries(U))console.log(` ${M} -> ${C}`);return}let I=b(Y);if(q)if(I)Q=T(Y,q),console.log(`Repository path: ${Y}`),console.log(`Skill path: ${q}
247
- `);else Q=Y,console.log(`Repository URL: ${Y}`),console.log(`Skill path: ${q}
248
- `);else if(Q=Y,I)console.log(`Repository path: ${Y}
249
- `);else console.log(`Repository URL: ${Y}
250
- `)}let W=o$(Q);if(!W){console.log(`Error: Invalid URL or path not found: ${Q}`);return}if(q&&W.type==="git-repo"&&!W.path)W.path=q;let K=i$(X);console.log(`Install location: ${K}
251
- `);let E,B=!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=l$(W.repoUrl,W.branch),B=!0,W.path){if(E=T(E,W.path),!b(E))throw Error(`Path not found in repository: ${W.path}`)}console.log("")}else E=W.path;let _=Q$(E);if(!_)throw Error("No skill.json found in source directory");let G={installed:[],errors:[],source:W.original};if(_.skills&&Array.isArray(_.skills)){console.log(`Found ${_.skills.length} skill(s) to update
252
- `);for(let U of _.skills)J$(E,U,K,G)}else{let U=_.name||z$(E).base;J$(w$(E),z$(E).base,K,G)}let V=lQ(E,W),I=T(V,"agents.json");if(b(I)){let U=V;if(B){let M;try{M=JSON.parse(O$(I,"utf8"))}catch{}let C=M?.repository||W.original,f=aQ(V,C);if(f)U=f}p$(U,{isUpdate:!0})}if(B&&E)try{let U=E.split("/.agents/tmp/")[0]+"/.agents/tmp/"+E.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${U}"`,{stdio:"pipe"})}catch{}if(console.log(`
253
- **Successfully updated skills:**`),console.log(`- Source: ${G.source}`),G.installed.length>0)for(let U of G.installed)console.log(` - Updated: ${U.name} at ${U.path}`),console.log(` ${U.title}`);if(G.errors.length>0){console.log(`
254
- **Errors:**`);for(let U of G.errors)console.log(` - ${U}`)}if(G.installed.length===0&&G.errors.length===0)console.log(" No skills were updated");if(G.installed.length>0)rQ(W.original,K,G,Z,z)}catch(_){if(B&&E)try{let G=E.split("/.agents/tmp/")[0]+"/.agents/tmp/"+E.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${G}"`,{stdio:"pipe"})}catch{}console.log(`
255
- Error: ${_.message}`)}},jY=($)=>new Promise((Q)=>{let X=FY({input:process.stdin,output:process.stdout});X.question($,(Z)=>{X.close(),Q(Z.trim())})}),c$=($)=>{try{return bY($).isSymbolicLink()}catch{return!1}},eQ=async()=>{let $=process.argv.slice(3),Q=$.find((L)=>!L.startsWith("-")),X=$.filter((L)=>L.startsWith("-"));if(!Q){console.log(`Usage: superpowers-agent rm <url-or-path|@alias> [options]
244
+ `);let $=!Y.includes("--project")&&!Y.includes("-p"),Z=null,q=null,z=null;if(X.startsWith("@")){let V=X;z=V,q=Q.find((I,M)=>M>0&&!I.startsWith("-")&&I!==V);let _=k(!1),U=k(!0);if(_[V])Z=_[V],console.log(`Using project repository alias: ${V}`);else if(U[V])Z=U[V],console.log(`Using global repository alias: ${V}`);else{console.log(`Error: Repository alias not found: ${V}`),console.log(`
245
+ Available aliases:`);let I={...U,..._};if(Object.keys(I).length===0)console.log(" (none)"),console.log(`
246
+ Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[M,N]of Object.entries(I))console.log(` ${M} -> ${N}`);return}let L=b(Z);if(q)if(L)X=T(Z,q),console.log(`Repository path: ${Z}`),console.log(`Skill path: ${q}
247
+ `);else X=Z,console.log(`Repository URL: ${Z}`),console.log(`Skill path: ${q}
248
+ `);else if(X=Z,L)console.log(`Repository path: ${Z}
249
+ `);else console.log(`Repository URL: ${Z}
250
+ `)}let W=iQ(X);if(!W){console.log(`Error: Invalid URL or path not found: ${X}`);return}if(q&&W.type==="git-repo"&&!W.path)W.path=q;let K=lQ(Y);console.log(`Install location: ${K}
251
+ `);let B,E=!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(B=aQ(W.repoUrl,W.branch),E=!0,W.path){if(B=T(B,W.path),!b(B))throw Error(`Path not found in repository: ${W.path}`)}console.log("")}else B=W.path;let V=ZQ(B);if(!V)throw Error("No skill.json found in source directory");let _={installed:[],errors:[],source:W.original};if(V.skills&&Array.isArray(V.skills)){console.log(`Found ${V.skills.length} skill(s) to update
252
+ `);for(let I of V.skills)JQ(B,I,K,_)}else{let I=V.name||HQ(B).base;JQ(OQ(B),HQ(B).base,K,_)}let U=lX(B,W),L=T(U,"agents.json");if(b(L)){let I=U;if(E){let M;try{M=JSON.parse(wQ(L,"utf8"))}catch{}let N=M?.repository||W.original,S=aX(U,N);if(S)I=S}cQ(I,{isUpdate:!0})}if(E&&B)try{let I=B.split("/.agents/tmp/")[0]+"/.agents/tmp/"+B.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${I}"`,{stdio:"pipe"})}catch{}if(console.log(`
253
+ **Successfully updated skills:**`),console.log(`- Source: ${_.source}`),_.installed.length>0)for(let I of _.installed)console.log(` - Updated: ${I.name} at ${I.path}`),console.log(` ${I.title}`);if(_.errors.length>0){console.log(`
254
+ **Errors:**`);for(let I of _.errors)console.log(` - ${I}`)}if(_.installed.length===0&&_.errors.length===0)console.log(" No skills were updated");if(_.installed.length>0)rX(W.original,K,_,$,z)}catch(V){if(E&&B)try{let _=B.split("/.agents/tmp/")[0]+"/.agents/tmp/"+B.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${_}"`,{stdio:"pipe"})}catch{}console.log(`
255
+ Error: ${V.message}`)}},jZ=(Q)=>new Promise((X)=>{let Y=FZ({input:process.stdin,output:process.stdout});Y.question(Q,($)=>{Y.close(),X($.trim())})}),nQ=(Q)=>{try{return bZ(Q).isSymbolicLink()}catch{return!1}},eX=async()=>{let Q=process.argv.slice(3),X=Q.find((G)=>!G.startsWith("-")),Y=Q.filter((G)=>G.startsWith("-"));if(!X){console.log(`Usage: superpowers-agent rm <url-or-path|@alias> [options]
256
256
 
257
257
  Options:
258
258
  --global, -g Remove globally installed skills (default)
@@ -261,10 +261,10 @@ Options:
261
261
  Examples:
262
262
  superpowers-agent rm https://github.com/example/skills
263
263
  superpowers-agent rm @myrepo
264
- superpowers-agent rm ~/my-local-skills`);return}let Z=!X.includes("--project")&&!X.includes("-p"),Y=Q,q=null;if(Q.startsWith("@")){q=Q;let L=k(!1),J=k(!0);if(L[Q])Y=L[Q];else if(J[Q])Y=J[Q];else{console.log(`Error: Repository alias not found: ${Q}`);return}}let z=EQ(Z),W=z[Q]||z[Y],K=W?.installBase||i$(X),E=[];if(W)E=W.skills;else{console.log(`No tracking data found. Attempting to re-resolve skills from source...
265
- `);let L=o$(Y);if(!L){console.log(`Error: Invalid URL or path not found: ${Y}`);return}let J,F=!1;try{if(L.type==="git-repo"||L.type==="git-tree"){if(console.log(`Cloning repository: ${L.repoUrl}`),J=l$(L.repoUrl,L.branch),F=!0,L.path){if(J=T(J,L.path),!b(J))throw Error(`Path not found in repository: ${L.path}`)}}else J=L.path;let S=Q$(J);if(!S)throw Error("No skill.json found in source");let g=S.skills&&Array.isArray(S.skills)?S.skills:[S.name||z$(J).base];for(let O of g){let c=O;if(S.skills){let E$=T(J,O);if(b(E$)){let a$=Q$(E$);if(a$?.name)c=a$.name}}E.push({name:c,path:T(K,c)})}if(F)try{let O=J.split("/.agents/tmp/")[0]+"/.agents/tmp/"+J.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${O}"`,{stdio:"pipe"})}catch{}}catch(S){if(F&&J)try{let g=J.split("/.agents/tmp/")[0]+"/.agents/tmp/"+J.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${g}"`,{stdio:"pipe"})}catch{}console.log(`Error resolving source: ${S.message}`);return}}let B=E.filter((L)=>b(L.path)||c$(L.path)),_=[];for(let L of E)for(let J of U$){let F=T(J.skillsDir(),L.name);if(b(F)||c$(F))_.push({platform:J.name,path:F})}let G=KQ(),V=q||Y,I=[];if(G[V]){for(let[,L]of Object.entries(G[V].agents||{}))for(let[,J]of Object.entries(L))if(J.destination&&(b(J.destination)||c$(J.destination)))I.push({path:J.destination})}let U=V.replace(/^@/,"").replace(/[^a-zA-Z0-9_-]/g,"_"),M=T(p(),".agents","repos",U),C=b(M),f=p(),N=(L)=>L.replace(f,"~");if(B.length===0&&_.length===0&&I.length===0&&!C){console.log("Nothing to remove.");return}if(console.log("Will remove:"),B.length>0){console.log(" Skills:");for(let L of B)console.log(` ${N(L.path)}`)}if(_.length>0){console.log(" Platform symlinks:");for(let L of _)console.log(` ${N(L.path)}`)}if(I.length>0){console.log(" Agents:");for(let L of I)console.log(` ${N(L.path)}`)}if(C)console.log(" Persisted repo:"),console.log(` ${N(M)}`);if((await jY(`
266
- Proceed? [y/N] `)).toLowerCase()!=="y"){console.log("Aborted.");return}for(let L of _){let J=k$(L.path);if(J.removed)console.log(`Removed symlink: ${N(L.path)}`),yQ(L.platform,L.path,"skills");else if(J.error==="Symlink does not exist")console.log(`Already removed: ${N(L.path)}`);else console.log(`Warning: ${N(L.path)}: ${J.error}`)}for(let L of I){let J=k$(L.path);if(J.removed)console.log(`Removed agent: ${N(L.path)}`);else if(J.error==="Symlink does not exist")console.log(`Already removed: ${N(L.path)}`);else console.log(`Warning: ${N(L.path)}: ${J.error}`)}if(C)try{n$(M,{recursive:!0,force:!0}),console.log(`Removed persisted repo: ${N(M)}`)}catch(L){console.log(`Warning: Failed to remove persisted repo: ${L.message}`)}for(let L of B){if(!b(L.path)){console.log(`Already removed: ${N(L.path)}`);continue}try{n$(L.path,{recursive:!0,force:!0}),console.log(`Removed skill: ${N(L.path)}`)}catch(J){console.log(`Warning: Failed to remove ${N(L.path)}: ${J.message}`)}}if(F$(Q,Z),Y!==Q)F$(Y,Z);if(G[V]){let L=y(!0);if(L.installedAgents)delete L.installedAgents[V],h(L,!0)}console.log(`
267
- Done.`)},$X=()=>{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]
264
+ superpowers-agent rm ~/my-local-skills`);return}let $=!Y.includes("--project")&&!Y.includes("-p"),Z=X,q=null;if(X.startsWith("@")){q=X;let G=k(!1),J=k(!0);if(G[X])Z=G[X];else if(J[X])Z=J[X];else{console.log(`Error: Repository alias not found: ${X}`);return}}let z=KX($),W=z[X]||z[Z],K=W?.installBase||lQ(Y),B=[];if(W)B=W.skills;else{console.log(`No tracking data found. Attempting to re-resolve skills from source...
265
+ `);let G=iQ(Z);if(!G){console.log(`Error: Invalid URL or path not found: ${Z}`);return}let J,F=!1;try{if(G.type==="git-repo"||G.type==="git-tree"){if(console.log(`Cloning repository: ${G.repoUrl}`),J=aQ(G.repoUrl,G.branch),F=!0,G.path){if(J=T(J,G.path),!b(J))throw Error(`Path not found in repository: ${G.path}`)}}else J=G.path;let x=ZQ(J);if(!x)throw Error("No skill.json found in source");let g=x.skills&&Array.isArray(x.skills)?x.skills:[x.name||HQ(J).base];for(let w of g){let c=w;if(x.skills){let BQ=T(J,w);if(b(BQ)){let rQ=ZQ(BQ);if(rQ?.name)c=rQ.name}}B.push({name:c,path:T(K,c)})}if(F)try{let w=J.split("/.agents/tmp/")[0]+"/.agents/tmp/"+J.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${w}"`,{stdio:"pipe"})}catch{}}catch(x){if(F&&J)try{let g=J.split("/.agents/tmp/")[0]+"/.agents/tmp/"+J.split("/.agents/tmp/")[1].split("/")[0];j(`rm -rf "${g}"`,{stdio:"pipe"})}catch{}console.log(`Error resolving source: ${x.message}`);return}}let E=B.filter((G)=>b(G.path)||nQ(G.path)),V=[];for(let G of B)for(let J of IQ){let F=T(J.skillsDir(),G.name);if(b(F)||nQ(F))V.push({platform:J.name,path:F})}let _=EX(),U=q||Z,L=[];if(_[U])for(let[,G]of Object.entries(_[U].agents||{}))for(let[,J]of Object.entries(G)){let F=J.destinations||(J.destination?[J.destination]:[]);for(let x of F)if(x&&(b(x)||nQ(x)))L.push({path:x})}let I=U.replace(/^@/,"").replace(/[^a-zA-Z0-9_-]/g,"_"),M=T(p(),".agents","repos",I),N=b(M),S=p(),C=(G)=>G.replace(S,"~");if(E.length===0&&V.length===0&&L.length===0&&!N){console.log("Nothing to remove.");return}if(console.log("Will remove:"),E.length>0){console.log(" Skills:");for(let G of E)console.log(` ${C(G.path)}`)}if(V.length>0){console.log(" Platform symlinks:");for(let G of V)console.log(` ${C(G.path)}`)}if(L.length>0){console.log(" Agents:");for(let G of L)console.log(` ${C(G.path)}`)}if(N)console.log(" Persisted repo:"),console.log(` ${C(M)}`);if((await jZ(`
266
+ Proceed? [y/N] `)).toLowerCase()!=="y"){console.log("Aborted.");return}for(let G of V){let J=kQ(G.path);if(J.removed)console.log(`Removed symlink: ${C(G.path)}`),yX(G.platform,G.path,"skills");else if(J.error==="Symlink does not exist")console.log(`Already removed: ${C(G.path)}`);else console.log(`Warning: ${C(G.path)}: ${J.error}`)}for(let G of L){let J=kQ(G.path);if(J.removed)console.log(`Removed agent: ${C(G.path)}`);else if(J.error==="Symlink does not exist")console.log(`Already removed: ${C(G.path)}`);else console.log(`Warning: ${C(G.path)}: ${J.error}`)}if(N)try{oQ(M,{recursive:!0,force:!0}),console.log(`Removed persisted repo: ${C(M)}`)}catch(G){console.log(`Warning: Failed to remove persisted repo: ${G.message}`)}for(let G of E){if(!b(G.path)){console.log(`Already removed: ${C(G.path)}`);continue}try{oQ(G.path,{recursive:!0,force:!0}),console.log(`Removed skill: ${C(G.path)}`)}catch(J){console.log(`Warning: Failed to remove ${C(G.path)}: ${J.message}`)}}if(FQ(X,$),Z!==X)FQ(Z,$);if(_[U]){let G=y(!0);if(G.installedAgents)delete G.installedAgents[U],h(G,!0)}console.log(`
267
+ Done.`)},QY=()=>{let Q=process.argv.slice(3),X=Q.find((B)=>!B.startsWith("-")),Y=Q.filter((B)=>B.startsWith("-"));if(!X){console.log(`Usage: superpowers-agent add-repository <git-url> [options]
268
268
 
269
269
  Options:
270
270
  --global, -g Add repository globally in ~/.agents/config.json (default)
@@ -282,15 +282,15 @@ Description:
282
282
  The repository's skill.json will be read to determine the default alias.
283
283
  Use --as to specify a custom alias.
284
284
  After adding, you can install skills using: superpowers-agent add @alias path/to/skill`);return}console.log(`Adding repository...
285
- `);let Z=X.some((E)=>E==="--global"||E==="-g"),Y=X.some((E)=>E==="--project"||E==="-p"),q=X.find((E)=>E.startsWith("--as=")),z=q?q.split("=")[1]:null,W=Y?!1:!0,K;try{console.log(`Cloning repository: ${Q}`),K=T(p(),".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=Q$(K);if(!E)throw Error("No skill.json found in repository");let B;if(z)B=z;else if(E.repository)B=E.repository;else{let V=Q.match(/\/([^/]+?)(?:\.git)?$/);if(V)B="@"+V[1];else throw Error("Could not determine repository alias. Use --as=@alias to specify manually.")}HQ(B,Q,W),j(`rm -rf "${K}"`,{stdio:"pipe"});let _=W?"globally":"in project",G=W?T(p(),".agents","config.json"):T(process.cwd(),".agents","config.json");console.log(`✓ Repository added ${_}`),console.log(` Alias: ${B}`),console.log(` URL: ${Q}`),console.log(` Config: ${G}`),console.log(`
286
- You can now install skills using:`),console.log(` superpowers-agent add ${B} <path-to-skill>`)}catch(E){if(K)try{j(`rm -rf "${K}"`,{stdio:"pipe"})}catch{}console.log(`
287
- Error: ${E.message}`)}};import{dirname as QX}from"path";var XX=($,Q,X)=>{let{content:Z,frontmatter:Y}=M$($),q=r[Q].prefix+X,z=QX($),W=`# ${Y.name||q}`;if(Y.description)W+=`
288
- # ${Y.description}`;if(Y.whenToUse)W+=`
289
- # When to use: ${Y.whenToUse}`;return W+=`
285
+ `);let $=Y.some((B)=>B==="--global"||B==="-g"),Z=Y.some((B)=>B==="--project"||B==="-p"),q=Y.find((B)=>B.startsWith("--as=")),z=q?q.split("=")[1]:null,W=Z?!1:!0,K;try{console.log(`Cloning repository: ${X}`),K=T(p(),".agents","tmp",`repo-add-${Date.now()}`),j(`mkdir -p "${K}"`,{stdio:"pipe"}),j(`git clone --depth 1 "${X}" "${K}"`,{stdio:"pipe",timeout:30000}),console.log("");let B=ZQ(K);if(!B)throw Error("No skill.json found in repository");let E;if(z)E=z;else if(B.repository)E=B.repository;else{let U=X.match(/\/([^/]+?)(?:\.git)?$/);if(U)E="@"+U[1];else throw Error("Could not determine repository alias. Use --as=@alias to specify manually.")}BX(E,X,W),j(`rm -rf "${K}"`,{stdio:"pipe"});let V=W?"globally":"in project",_=W?T(p(),".agents","config.json"):T(process.cwd(),".agents","config.json");console.log(`✓ Repository added ${V}`),console.log(` Alias: ${E}`),console.log(` URL: ${X}`),console.log(` Config: ${_}`),console.log(`
286
+ You can now install skills using:`),console.log(` superpowers-agent add ${E} <path-to-skill>`)}catch(B){if(K)try{j(`rm -rf "${K}"`,{stdio:"pipe"})}catch{}console.log(`
287
+ Error: ${B.message}`)}};import{dirname as XY}from"path";var YY=(Q,X,Y)=>{let{content:$,frontmatter:Z}=MQ(Q),q=s[X].prefix+Y,z=XY(Q),W=`# ${Z.name||q}`;if(Z.description)W+=`
288
+ # ${Z.description}`;if(Z.whenToUse)W+=`
289
+ # When to use: ${Z.whenToUse}`;return W+=`
290
290
  # Supporting tools and docs are in ${z}
291
291
  # ============================================
292
292
 
293
- ${Z}`,W},YX=($)=>{if(!$){console.log(`Usage: superpowers-agent use-skill <skill-name>
293
+ ${$}`,W},ZY=(Q)=>{if(!Q){console.log(`Usage: superpowers-agent use-skill <skill-name>
294
294
 
295
295
  Examples (smart matching):
296
296
  superpowers-agent use-skill brainstorming # Matches superpowers:collaboration/brainstorming
@@ -305,24 +305,24 @@ Examples (explicit paths):
305
305
  Smart matching:
306
306
  - Type just the skill name or any suffix of the path
307
307
  - Priority: .agents/skills/ > .claude/skills/ > ~/.agents/skills/ > ~/.agents/superpowers/skills/
308
- - 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: ${$}
308
+ - If multiple skills match at same priority, you'll see them with descriptions`);return}let X=m(Q);if(!X){console.log(`Error: Skill not found: ${Q}
309
309
 
310
- Available skills:`),console.log("Run: superpowers-agent find-skills");return}let{skillFile:X,sourceType:Z,actualSkillPath:Y}=Q;try{let{content:q,frontmatter:z}=M$(X),W=r[Z].prefix+Y,K=QX(X),E=`# ${z.name||W}`;if(z.description)E+=`
311
- # ${z.description}`;if(z.whenToUse)E+=`
312
- # When to use: ${z.whenToUse}`;E+=`
310
+ Available skills:`),console.log("Run: superpowers-agent find-skills");return}let{skillFile:Y,sourceType:$,actualSkillPath:Z}=X;try{let{content:q,frontmatter:z}=MQ(Y),W=s[$].prefix+Z,K=XY(Y),B=`# ${z.name||W}`;if(z.description)B+=`
311
+ # ${z.description}`;if(z.whenToUse)B+=`
312
+ # When to use: ${z.whenToUse}`;B+=`
313
313
  # Supporting tools and docs are in ${K}
314
314
  # ============================================
315
315
 
316
- ${q}`,console.log(E)}catch(q){console.log(q.message)}};var xY=`You have superpowers.
316
+ ${q}`,console.log(B)}catch(q){console.log(q.message)}};var xZ=`You have superpowers.
317
317
 
318
- **IMPORTANT: The using-superpowers skill content is included below. It is ALREADY LOADED - you are currently following it. Do NOT use the skill tool to load "using-superpowers" again - that would be redundant.**`,DY="---\n\n**YOU MUST read and use the `leveraging-cli-tools` skill** the moment a task involves using BASH, searching code, parsing JSON/YAML, finding files, structural refactors, data wrangling, or any command that floods your context with verbose output (logs, CI logs, test runs). Load it with your skill tool BEFORE you reach for grep/find/sed or before you read large command output. It routes you to high-performance tools (rg, jq, fd, yq, ast-grep, gh, sd) and reduces output to just the signal — cutting token cost and latency 5-50x. Skipping it wastes tokens and time on work the right tool does instantly.",RY=()=>{let $=m("using-superpowers");if(!$)return null;let Q;try{Q=XX($.skillFile,$.sourceType,$.actualSkillPath)}catch{return null}return`<EXTREMELY_IMPORTANT>
319
- ${xY}
318
+ **IMPORTANT: The using-superpowers skill content is included below. It is ALREADY LOADED - you are currently following it. Do NOT use the skill tool to load "using-superpowers" again - that would be redundant.**`,DZ="---\n\n**YOU MUST read and use the `leveraging-cli-tools` skill** the moment a task involves using BASH, searching code, parsing JSON/YAML, finding files, structural refactors, data wrangling, or any command that floods your context with verbose output (logs, CI logs, test runs). Load it with your skill tool BEFORE you reach for grep/find/sed or before you read large command output. It routes you to high-performance tools (rg, jq, fd, yq, ast-grep, gh, sd) and reduces output to just the signal — cutting token cost and latency 5-50x. Skipping it wastes tokens and time on work the right tool does instantly.",RZ=()=>{let Q=m("using-superpowers");if(!Q)return null;let X;try{X=YY(Q.skillFile,Q.sourceType,Q.actualSkillPath)}catch{return null}return`<EXTREMELY_IMPORTANT>
319
+ ${xZ}
320
320
 
321
- ${Q}
321
+ ${X}
322
322
 
323
- ${DY}
324
- </EXTREMELY_IMPORTANT>`},fY=($="raw")=>{let Q=RY();if($==="claude")return JSON.stringify({hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:Q||""}});if($==="copilot")return JSON.stringify({additionalContext:Q||""});return Q||""},ZX=()=>{let $=process.argv.find((X)=>X.startsWith("--format=")),Q=$?$.split("=")[1]:"raw";process.stdout.write(fY(Q)+`
325
- `)};var qX={bootstrap:cQ,version:TQ,"check-updates":()=>{AQ().catch(($)=>{console.error($.message),process.exit(1)})},update:()=>{let $=process.argv.includes("--no-reinstall");R$({skipReinstall:$})},"config-get":JQ,"config-set":OQ,"setup-skills":pQ,"use-skill":()=>YX(process.argv[3]),"session-context":ZX,execute:VQ,"find-skills":s,add:sQ,"add-repository":$X,"list-repositories":wQ,pull:tQ,rm:eQ,dir:UQ,path:LQ,"get-helpers":IQ,"install-aliases":u$,default:()=>{console.log(`Superpowers for Agents
323
+ ${DZ}
324
+ </EXTREMELY_IMPORTANT>`},fZ=(Q="raw")=>{let X=RZ();if(Q==="claude")return JSON.stringify({hookSpecificOutput:{hookEventName:"SessionStart",additionalContext:X||""}});if(Q==="copilot")return JSON.stringify({additionalContext:X||""});return X||""},$Y=()=>{let Q=process.argv.find((Y)=>Y.startsWith("--format=")),X=Q?Q.split("=")[1]:"raw";process.stdout.write(fZ(X)+`
325
+ `)};var qY={bootstrap:nX,version:vX,"check-updates":()=>{TX().catch((Q)=>{console.error(Q.message),process.exit(1)})},update:()=>{let Q=process.argv.includes("--no-reinstall");RQ({skipReinstall:Q})},"config-get":wX,"config-set":OX,"setup-skills":cX,"use-skill":()=>ZY(process.argv[3]),"session-context":$Y,execute:UX,"find-skills":t,add:sX,"add-repository":QY,"list-repositories":MX,pull:tX,rm:eX,dir:LX,path:IX,"get-helpers":JX,"install-aliases":uQ,default:()=>{console.log(`Superpowers for Agents
326
326
  Usage:
327
327
  superpowers-agent bootstrap [--no-update] [--force] # Run complete bootstrap
328
328
  superpowers-agent version # Show current version
@@ -346,4 +346,4 @@ Usage:
346
346
  superpowers-agent install-aliases # Install universal aliases (superpowers, superpowers-agent)
347
347
 
348
348
  Documentation: https://github.com/complexthings/superpowers
349
- `)}},yY=process.argv[2]||"default",SY=qX[yY]||qX.default;try{let $=SY();if($&&typeof $.then==="function")$.catch((Q)=>{console.error(`Error: ${Q.message}`),process.exit(1)})}catch($){console.error(`Error: ${$.message}`),process.exit(1)}
349
+ `)}},SZ=process.argv[2]||"default",yZ=qY[SZ]||qY.default;try{let Q=yZ();if(Q&&typeof Q.then==="function")Q.catch((X)=>{console.error(`Error: ${X.message}`),process.exit(1)})}catch(Q){console.error(`Error: ${Q.message}`),process.exit(1)}
@@ -1,3 +1,111 @@
1
1
  <!-- SUPERPOWERS_-_INSTRUCTIONS_START -->
2
- ${content}
2
+ ---
3
+ name: using-superpowers
4
+ description: "Use when starting any conversation - establishes how to find and use skills, requiring Skill tool invocation before ANY response including clarifying questions. CRITICAL: this skill is already loaded in your context — do NOT invoke it again. It defines the foundational rule: if a skill might apply, you must invoke it first."
5
+ ---
6
+
7
+ # Using Superpowers
8
+
9
+ Superpowers is a skills system that gives you access to proven workflows, encoded as SKILL.md files. Skills prevent you from reinventing solved problems and repeating known mistakes. This skill establishes the foundational rule for how to use the entire system.
10
+
11
+ ## The Core Rule
12
+
13
+ **Before any response or action, check whether a skill applies — then invoke it.**
14
+
15
+ This means BEFORE writing code, BEFORE asking clarifying questions, BEFORE exploring files. Even a 1% chance a skill might apply means you invoke it to check. If the invoked skill turns out not to fit the situation, you don't need to follow it — but you must check.
16
+
17
+ Why this matters: skills encode hard-won workflows for tasks like debugging, TDD, and brainstorming. Skipping the check means you may skip a workflow that would have prevented a costly mistake.
18
+
19
+ ## How to Discover and Invoke Skills
20
+
21
+ Skills appear in your context as an available-skills list — scan it at the start of every task. That list is the same workflow library no matter which agent platform you run on (Claude Code, Copilot, OpenCode, Pi, or anything else); only the tools around it differ.
22
+
23
+ To load a skill's full instructions:
24
+
25
+ - **If your platform has a native skill-loading tool**, call it with the skill's name.
26
+ - **If it doesn't**, load the skill the way you'd open any file: read its SKILL.md directly with your file-read tool. Find the path in the skills list, or via the CLI fallback below.
27
+
28
+ Either path has the same result — the skill's content enters your context and you follow it directly. Don't assume a native tool exists; if you can't find one, read the file. The point is to get the skill's content in front of you, not to use any particular mechanism.
29
+
30
+ **CLI fallback** (use when the skills list isn't already in your context):
31
+
32
+ ```bash
33
+ superpowers-agent find-skills # list all skills
34
+ superpowers-agent find-skills | grep test # filter by topic
35
+ superpowers-agent execute <skill-name> # print a skill to load and follow
36
+ ```
37
+
38
+ **Announce when using a skill:**
39
+ > "Using Skill: [name] to [purpose]"
40
+
41
+ This keeps the conversation clear and lets the user know which workflow you're following.
42
+
43
+ ## Skill Priority
44
+
45
+ When several skills could apply, load them in order of how much each reframes the problem — broadest understanding first, narrowest execution last. Loading a skill is cheap (you are only reading); committing to the wrong workflow is expensive.
46
+
47
+ 1. **Domain / context skills first.** A skill about the specific technology or domain you are working in teaches you the territory — and often tells you which approach fits, or that a generic workflow does not. Read it before you commit to a process, and before you brainstorm or plan: knowing the territory makes the brainstorm sharper and can rule a planning skill in or out. A domain skill outranks even an intent-gathering skill like brainstorming.
48
+ 2. **Process / approach skills next.** brainstorming, planning, systematic-debugging, test-driven-development — chosen *informed by* what the domain skill told you.
49
+ 3. **Implementation skills last.** Step-by-step execution guides, once the approach is set.
50
+
51
+ Why this order: if you lock into a planning or process workflow before reading the domain skill, you may follow steps that do not fit the problem — and by the time you read the domain skill you are already mid-workflow and cannot switch cleanly. Read first, the domain skill can still redirect you to the right process, or tell you to skip one.
52
+
53
+ **Worked example** — "Let's build a subscription checkout on Stripe," with a Stripe domain skill, a payment-flow planning skill, and a Stripe-checkout implementation skill available:
54
+
55
+ → `stripe-payments-domain` (learn the territory; it may change how you plan) → `planning-payment-flows` (map states and failure modes) → `implementing-stripe-checkout` (execute).
56
+
57
+ When no domain skill applies, the leading process skill comes first: "Fix this bug" → `systematic-debugging`, then any domain or implementation skill it points you to.
58
+
59
+ The first skill you load may change the rest of the plan — reassess after each one rather than committing to the whole sequence up front.
60
+
61
+ ## Mapping Skill Instructions to Your Tools
62
+
63
+ A skill may name a tool using one platform's vocabulary — a todo tracker, a subagent dispatcher, a file editor, a shell, a search tool, a web fetcher. Map each to the closest equivalent your environment provides and use it. If your platform has no equivalent for something a skill calls for, perform the action inline yourself. The skill's intent is what matters, not the specific tool name it happens to use.
64
+
65
+ ## Red Flags — You're Rationalizing
66
+
67
+ These thoughts mean STOP and check for a skill first:
68
+
69
+ | Thought | Reality |
70
+ |---------|---------|
71
+ | "This is just a simple question" | Questions are tasks. Check for skills. |
72
+ | "I need more context first" | Skill check comes BEFORE clarifying questions. |
73
+ | "Let me explore the codebase first" | Skills tell you HOW to explore. Check first. |
74
+ | "I can check git/files quickly" | Files lack conversation context. Check for skills. |
75
+ | "Let me gather information first" | Skills tell you HOW to gather information. |
76
+ | "This doesn't need a formal skill" | If a skill exists, use it. |
77
+ | "I remember this skill" | Skills evolve. Read current version. |
78
+ | "This doesn't count as a task" | Action = task. Check for skills. |
79
+ | "The skill is overkill" | Simple things become complex. Use it. |
80
+ | "I'll just do this one thing first" | Check BEFORE doing anything. |
81
+ | "This feels productive" | Undisciplined action wastes time. Skills prevent this. |
82
+ | "I know what that means" | Knowing the concept ≠ using the skill. Invoke it. |
83
+
84
+ ## Skill Types
85
+
86
+ **Rigid skills** (TDD, systematic-debugging): Follow exactly. The structure is the value — adapting away the discipline defeats the purpose.
87
+
88
+ **Flexible skills** (patterns, guides): Adapt principles to context. The skill itself will indicate when flexibility is appropriate.
89
+
90
+ ## Checklists
91
+
92
+ If a skill contains a checklist, create a task or todo entry for each item using your platform's task-tracking tool. Mental tracking causes steps to get skipped. Every time.
93
+
94
+ ## User Instructions
95
+
96
+ Instructions say WHAT, not HOW. "Add X" or "Fix Y" doesn't mean skip workflows. A specific instruction is when skill discipline matters most.
97
+
98
+ ## Version Monitoring
99
+
100
+ At conversation start (periodically thereafter, e.g. once per day), check your version:
101
+ 1. **CURRENT_VERSION** — run a `superpowers-agent version` command and extract `X.Y.Z` from the `X.Y.Z` string in its output.
102
+ 2. **NPM_LATEST_VERSION** — run `npm view @complexthings/superpowers-agent version`.
103
+ 3. Compare by **semver precedence, not string comparison** (e.g. `9.2.1` > `9.0.1`). If NPM_LATEST_VERSION is newer, tell the user — do not run these yourself:
104
+ > Your superpowers-agent has updates (`CURRENT_VERSION` → `NPM_LATEST_VERSION`). Run:
105
+ > ```sh
106
+ > npm install -g @complexthings/superpowers-agent
107
+ > superpowers-agent update && superpowers-agent bootstrap && superpowers-agent setup-skills
108
+ > ```
109
+ If versions match, or either lookup fails (e.g. no network), continue silently.
110
+
3
111
  <!-- SUPERPOWERS_-_INSTRUCTIONS_END -->
package/AGENTS.md CHANGED
@@ -8,41 +8,24 @@ Skills extend your capabilities with proven workflows.
8
8
  ### Discover Skills First
9
9
 
10
10
  **Before starting any task**, check for relevant skills:
11
- 1. Use your native skill tool to list available skills
12
- 2. Review skill frontmatter/descriptions to identify relevant ones
13
- 3. `superpowers-agent find-skills [PATTERN]` for superpowers skills
11
+ 1. Use your native skill tool to list available skills.
12
+ 2. Review skill descriptions/frontmatter to identify relevant ones.
14
13
 
15
- ### Load Just-In-Time
14
+ ### Skill Loading Rules
16
15
 
17
- Only read the full skill content when you're ready to execute it:
18
- 1. **Load fully** when about to use (not before)
19
- 2. **Follow exactly** as written
20
- 3. **Announce:** "Using Skill: {Name} to {Purpose}"
16
+ - Load skills **JIT only** never preload to "understand" them.
17
+ - Follow skill instructions **exactly as written** no skimming, no shortcuts.
18
+ - If a skill has a checklist, create a todo for **each item** no mental tracking.
19
+ - Simple tasks benefit from skills as much as complex ones.
21
20
 
22
- ### Using Tools with Skills
23
-
24
- **1. Native Skill Tool:** Use your platform's native skill tool for loading skills.
25
-
26
- **2. Symlinked Skills:** Superpowers skills are symlinked to your platform's skills directory.
27
-
28
- **3. Fallback:** If a skill isn't found via native tool, use `superpowers-agent find-skills [PATTERN]`
29
-
30
- **4. Tool Equivalence:** When skills reference tools you don't have, use your equivalent:
31
- - File operations -> your Read/Write/Edit tools
32
- - Terminal commands -> your Bash/Shell tool
33
- - Search operations -> your Grep/Glob/Search tools
34
- - Task management -> your TodoWrite/TodoRead tools
35
- - Subagent dispatch -> your Task/Agent tool (or execute the work yourself)
36
- - Web fetching -> your WebFetch/Fetch tool
37
-
38
- ### Version Monitoring
21
+ **Skill priority (highest to lowest):** Project → Personal
39
22
 
40
- **Bootstrapped:** ^^SAV:7.1.2^^
23
+ ### Using Tools with Skills
41
24
 
42
- If superpowers-agent commands show a different version, inform user:
43
- ```
44
- superpowers-agent update && superpowers-agent bootstrap && superpowers-agent setup-skills
45
- ```
25
+ 1. **Native skill tool** load skills via your platform's native skill tool.
26
+ 2. **Symlinked skills** — Superpowers skills are symlinked into your platform's skills directory.
27
+ 3. **Fallback** if a skill isn't found via the native tool, run `superpowers-agent find-skills [PATTERN]`.
28
+ 4. **Tool equivalence** — when a skill references a tool you don't have, substitute your equivalent.
46
29
 
47
30
  ### Why Skills Matter
48
31
 
@@ -52,10 +35,22 @@ Skills encode proven techniques that prevent mistakes. Not using them means repe
52
35
 
53
36
  ---
54
37
 
55
- **Detailed reference for `superpowers-agent` if needed by agents:** `.agents/docs/SUPERPOWERS.md`
38
+ ## Version Check
56
39
 
57
- *Generated by Superpowers on 2026-03-13*
40
+ Periodically, e.g. once per day check the version of superpowers-agent:
41
+ 1. **CURRENT_VERSION** — run a `superpowers-agent` command and extract `X.Y.Z` from the `^^SAV:X.Y.Z^^` string in its output.
42
+ 2. **NPM_LATEST_VERSION** — run `npm view @complexthings/superpowers-agent version`.
43
+ 3. Compare by **semver precedence, not string comparison** (e.g. `9.10.0` > `9.9.0`). If NPM_LATEST_VERSION is newer, tell the user — do not run these yourself:
44
+ > Your superpowers-agent has updates (`CURRENT_VERSION` → `NPM_LATEST_VERSION`). Run:
45
+ > ```sh
46
+ > npm install -g @complexthings/superpowers-agent
47
+ > superpowers-agent update && superpowers-agent bootstrap && superpowers-agent setup-skills
48
+ > ```
49
+ If versions match, or either lookup fails (e.g. no network), continue silently.
50
+
51
+ ---
58
52
 
53
+ *Generated by Superpowers on 2026-06-01*
59
54
  <!-- SUPERPOWERS_SKILLS_END -->
60
55
 
61
56
  ## What This Project Is
package/README.md CHANGED
@@ -6,6 +6,14 @@ A comprehensive skills library of proven techniques, patterns, and workflows for
6
6
 
7
7
  ## What's New
8
8
 
9
+ **v9.2.1 (June 1, 2026):**
10
+
11
+ - **GitHub agents now reach the Copilot CLI** — `add` and `pull` now also symlink GitHub agents (`.github/agents/<name>.agent.md`) into `~/.copilot/agents/`, alongside the existing VS Code `prompts/` install, so the same agents are usable by the GitHub Copilot CLI. `rm` cleans up both locations.
12
+ - **npm-based version monitoring** — the `using-superpowers` skill and `AGENTS.md` template now check for updates by querying the npm registry (`npm view @complexthings/superpowers-agent version`) and comparing by semver precedence, prompting you to update only when npm is actually newer (replaces the old bundled-version-string comparison).
13
+ - **Smarter skill-priority guidance** — `using-superpowers` now tells agents to load domain/context skills first, then process skills (brainstorming, planning, debugging, TDD), then implementation skills, so the domain skill can shape which process fits.
14
+ - **`leveraging-cli-tools` nudge broadened** — the session-start context now also points agents at the skill whenever a task involves using Bash.
15
+ - **Template cleanup** — removed `TOOLS.md.template` and the `{{TOOL_MAPPINGS}}` bootstrap placeholder; tool-equivalence guidance now lives inline in the refreshed `AGENTS.md`/`SUPERPOWERS.md` templates. `AGENTS.md` skill priority simplified to Project → Personal.
16
+
9
17
  **v9.1.0 (May 30, 2026):**
10
18
 
11
19
  - **Session-start hooks installed by `bootstrap`** — `bootstrap` now installs a Claude Code `SessionStart` hook into `~/.claude/settings.json` and a GitHub Copilot CLI `sessionStart` hook at `~/.copilot/hooks/superpowers.json`, so the Superpowers context is injected at the start of every session. The Claude merge is idempotent and preserves your other hooks/settings. (This replaces the old Claude Code plugin hook, which has been removed.)
@@ -51,29 +59,6 @@ A comprehensive skills library of proven techniques, patterns, and workflows for
51
59
  - 📋 **Smart Copilot Instructions** - `bootstrap` and `update` now process `~/.github/copilot-instructions.md` as a template, injecting the `using-superpowers` skill content and supporting marker-based idempotent updates with automatic backups
52
60
  - 📊 **Mermaid Flowcharts** - Replaced DOT-format flowcharts with Mermaid syntax across 8 skills for better rendering in GitHub, VS Code, and agent contexts
53
61
 
54
- **v6.5.0 (January 24, 2026):**
55
-
56
- - 🔄 **Upstream Sync** - Ported advanced features from Jesse Vincent's [obra/superpowers](https://github.com/obra/superpowers) v4.1.1:
57
- - **OpenCode Plugin** (`.opencode/plugins/superpowers-agent.js`) - Session bootstrap injection via system prompt transform
58
- - **using-superpowers Skill** - Behavioral enforcement with Red Flags rationalization table (12 anti-patterns)
59
- - **Two-Stage Code Review** - Spec compliance review + code quality review workflow
60
- - **Test Infrastructure** (`tests/`) - Agent-agnostic test scripts for skill triggering
61
-
62
- - 🔌 **OpenCode Plugin** - Native plugin for OpenCode that injects superpowers context at every session start using `experimental.chat.system.transform` hook
63
-
64
- - 📋 **Two-Stage Review Process** - Updated `subagent-driven-development` skill with spec reviewer and code quality reviewer prompts for comprehensive code review
65
-
66
- **v6.4.x (January 23-24, 2026):**
67
-
68
- - 📐 **Context Optimization** - Reduced AGENTS.md context size by ~60-70% with separate SUPERPOWERS.md reference file
69
- - 🔗 **Project-Level Symlinks** - `setup-skills` now creates symlinks from agent directories to `.agents/skills`
70
-
71
- **Previous Releases:**
72
-
73
- - **v6.3.x** - Codex platform support, native skill tools, extended symlinks for OpenCode/Cursor/Gemini
74
- - **v6.0.0** - Complete codebase modernization with 90% bundle reduction
75
- - **v5.4.0** - Dynamic tool mappings, automated platform detection
76
-
77
62
  **Key Features:**
78
63
 
79
64
  - 🎯 **Smart Skill Matching** - Just type `superpowers execute brainstorming` instead of full paths
@@ -272,8 +257,9 @@ Repositories can include an `agents.json` manifest to automatically install AI a
272
257
 
273
258
  | Platform | Source Directory | Destination |
274
259
  |----------|----------------|-------------|
275
- | `github` | `.github/agents/<name>.agent.md` | VS Code `prompts/` directory |
260
+ | `github` | `.github/agents/<name>.agent.md` | VS Code `prompts/` directory **and** `~/.copilot/agents/` (GitHub Copilot CLI) |
276
261
  | `opencode` | `.opencode/agents/<name>.md` | `~/.config/opencode/agents/` |
262
+ | `claude` | `.claude/agents/<name>.md` | `~/.claude/agents/` |
277
263
 
278
264
  **How it works:**
279
265
  1. After skills are installed, the system checks for `agents.json` at the repository root
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@complexthings/superpowers-agent",
3
- "version": "9.2.0",
3
+ "version": "9.2.1",
4
4
  "description": "Superpowers agent CLI — skills system for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -99,7 +99,7 @@ Instructions say WHAT, not HOW. "Add X" or "Fix Y" doesn't mean skip workflows.
99
99
  At conversation start (periodically thereafter, e.g. once per day), check your version:
100
100
  1. **CURRENT_VERSION** — run a `superpowers-agent version` command and extract `X.Y.Z` from the `X.Y.Z` string in its output.
101
101
  2. **NPM_LATEST_VERSION** — run `npm view @complexthings/superpowers-agent version`.
102
- 3. Compare by **semver precedence, not string comparison** (e.g. `9.2.0` > `9.0.1`). If NPM_LATEST_VERSION is newer, tell the user — do not run these yourself:
102
+ 3. Compare by **semver precedence, not string comparison** (e.g. `9.2.1` > `9.0.1`). If NPM_LATEST_VERSION is newer, tell the user — do not run these yourself:
103
103
  > Your superpowers-agent has updates (`CURRENT_VERSION` → `NPM_LATEST_VERSION`). Run:
104
104
  > ```sh
105
105
  > npm install -g @complexthings/superpowers-agent