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