@complexthings/superpowers-agent 8.4.1 → 9.0.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/skills/caveman/SKILL.md +49 -0
- package/.agents/skills/diagnose/SKILL.md +117 -0
- package/.agents/skills/diagnose/scripts/hitl-loop.template.sh +41 -0
- package/.agents/skills/grill-with-docs/ADR-FORMAT.md +47 -0
- package/.agents/skills/grill-with-docs/CONTEXT-FORMAT.md +63 -0
- package/.agents/skills/grill-with-docs/SKILL.md +90 -0
- package/.agents/skills/handoff/SKILL.md +15 -0
- package/.agents/skills/improve-codebase-architecture/DEEPENING.md +37 -0
- package/.agents/skills/improve-codebase-architecture/HTML-REPORT.md +123 -0
- package/.agents/skills/improve-codebase-architecture/INTERFACE-DESIGN.md +44 -0
- package/.agents/skills/improve-codebase-architecture/LANGUAGE.md +53 -0
- package/.agents/skills/improve-codebase-architecture/SKILL.md +81 -0
- package/.agents/skills/karpathy-guidelines/SKILL.md +75 -0
- package/.agents/skills/prototype/LOGIC.md +79 -0
- package/.agents/skills/prototype/SKILL.md +30 -0
- package/.agents/skills/prototype/UI.md +112 -0
- package/.agents/skills/review/SKILL.md +78 -0
- package/.agents/skills/setup-matt-pocock-skills/SKILL.md +125 -0
- package/.agents/skills/setup-matt-pocock-skills/domain.md +51 -0
- package/.agents/skills/setup-matt-pocock-skills/issue-tracker-github.md +22 -0
- package/.agents/skills/setup-matt-pocock-skills/issue-tracker-gitlab.md +23 -0
- package/.agents/skills/setup-matt-pocock-skills/issue-tracker-local.md +19 -0
- package/.agents/skills/setup-matt-pocock-skills/triage-labels.md +15 -0
- package/.agents/skills/tdd/SKILL.md +109 -0
- package/.agents/skills/tdd/deep-modules.md +33 -0
- package/.agents/skills/tdd/interface-design.md +31 -0
- package/.agents/skills/tdd/mocking.md +59 -0
- package/.agents/skills/tdd/refactoring.md +10 -0
- package/.agents/skills/tdd/tests.md +61 -0
- package/.agents/skills/to-issues/SKILL.md +83 -0
- package/.agents/skills/to-prd/SKILL.md +76 -0
- package/.agents/skills/triage/AGENT-BRIEF.md +168 -0
- package/.agents/skills/triage/OUT-OF-SCOPE.md +101 -0
- package/.agents/skills/triage/SKILL.md +103 -0
- package/.agents/skills/ubiquitous-language/SKILL.md +93 -0
- package/.agents/skills/zoom-out/SKILL.md +7 -0
- package/.agents/superpowers-agent +120 -140
- package/.github/copilot-instructions.md +3 -0
- package/.github/workflows/main.yaml +1 -1
- package/AGENTS.md +97 -0
- package/README.md +32 -94
- package/package.json +3 -5
- package/skills/collaboration/leveraging-cli-tools/SKILL.md +48 -101
- package/skills/meta/create-agents-md/SKILL.md +182 -0
- package/skills/meta/create-agents-md/skill.json +9 -0
- package/skills/meta/writing-prompts/SKILL.md +64 -287
- package/skills/meta/writing-prompts/references/platforms.md +114 -0
|
@@ -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
|
|
4
|
-
`),
|
|
5
|
-
`),
|
|
6
|
-
`).trim(),frontmatter:X}}catch(Q){throw Error(`Error reading skill file: ${Q.message}`)}};import{existsSync as
|
|
7
|
-
`);for(let
|
|
8
|
-
`)}catch(
|
|
9
|
-
`)}}console.log("Please be more specific. Examples:");for(let
|
|
10
|
-
superpowers-agent execute <skill-name> # Load a specific skill`)},
|
|
3
|
+
import{relative as B1,dirname as _1,join as w2}from"path";import{existsSync as x$}from"fs";import{homedir as r$,platform as e1}from"os";import{join as A,parse as $2,dirname as l$}from"path";import{existsSync as d}from"fs";import{fileURLToPath as Q2}from"url";var X2=Q2(import.meta.url),E$=l$(X2),Y2=()=>{let $=r$();switch(e1()){case"darwin":return A($,"Library","Application Support","Code","User");case"win32":return A($,"AppData","Roaming","Code","User");case"linux":return A($,".config","Code","User");default:return A($,".config","Code","User")}},Z2=()=>{let $=process.cwd(),Q=$2($).root;while($!==Q){if(d(A($,".agents")))return $;$=l$($)}return process.cwd()},E={home:r$(),vscodeUserDir:Y2(),projectRoot:Z2(),get projectClaudeSkills(){return A(this.projectRoot,".claude","skills")},get projectAgentsSkills(){return A(this.projectRoot,".agents","skills")},get projectCopilotSkills(){return A(this.projectRoot,".copilot","skills")},get projectOpencodeSkills(){return A(this.projectRoot,".opencode","skill")},get projectSkillsDir(){return A(this.projectRoot,"skills")},get homePersonalSkills(){return A(this.home,".agents","skills")},get homeClaudeSkills(){return A(this.home,".claude","skills")},get homeCopilotSkills(){return A(this.home,".copilot","skills")},get homeOpencodeSkills(){return A(this.home,".config","opencode","skill")},get bootstrap(){return A(this.projectRoot,".agents","superpowers-bootstrap.md")},get superpowersRepo(){let $=A(E$,"..","..","..");if(d(A($,"skills"))&&d(A($,".agents","superpowers-agent")))return $;let Q=A(E$,"..");if(d(A(Q,"skills"))&&d(A(Q,".agents","superpowers-agent")))return Q;return A(this.home,".agents","superpowers")},get homeSuperpowersSkills(){return A(this.superpowersRepo,"skills")},get isSuperpowersRepo(){let $=A(E$,"..","..","..");if(d(A($,"skills"))&&d(A($,".agents","superpowers-agent")))return!0;let Q=A(E$,"..");return d(A(Q,"skills"))&&d(A(Q,".agents","superpowers-agent"))}};import{readFileSync as a$}from"fs";var $$=($)=>{try{let X=a$($,"utf8").split(`
|
|
4
|
+
`),Z={name:"",description:"",whenToUse:""},Y=!1;for(let H of X){if(H.trim()==="---"){if(Y)break;Y=!0;continue}if(Y){let W=H.match(/^(\w+):\s*(.*)$/);if(W){let[,q,K]=W,z={name:"name",description:"description",when_to_use:"whenToUse"};if(z[q])Z[z[q]]=K.trim()}}}return Z}catch{return{name:"",description:"",whenToUse:""}}},s$=($)=>{try{let Q=a$($,"utf8"),X=$$($),Z=Q.split(`
|
|
5
|
+
`),Y=!1,H=!1,W=[];for(let q of Z){if(q.trim()==="---"){if(Y){H=!0;continue}Y=!0;continue}if(H||!Y)W.push(q)}return{content:W.join(`
|
|
6
|
+
`).trim(),frontmatter:X}}catch(Q){throw Error(`Error reading skill file: ${Q.message}`)}};import{existsSync as A$,readdirSync as $1,statSync as Q1}from"fs";import{join as M$,relative as v3}from"path";import{readFileSync as H2,existsSync as q2}from"fs";import{join as t$}from"path";var Q$=($)=>{let Q=t$($,"skill.json");if(!q2(Q))return null;try{let X=H2(Q,"utf8");return JSON.parse(X)}catch(X){return null}};var J$=($)=>{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\//,"")}},e$=($,Q)=>{let X=Q$($);if(!X||!X.helpers||!Array.isArray(X.helpers))return null;let Z=X.helpers,Y=Q.toLowerCase(),H=null,W=0;for(let q of Z){let K=q.toLowerCase();if(K===Y){H=q;break}if(K.includes(Y)){let _=Y.length/K.length;if(_>W)W=_,H=q}let z=q.split("/").pop().split(".")[0].toLowerCase();if(Y.includes(z)){let _=z.length/Y.length;if(_>W)W=_,H=q}}return H?t$($,H):null},X$={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 K$=($,Q,X=null)=>{let Z=[];if(!A$($))return Z;let Y=(H,W)=>{if(X!==null&&W>X)return;try{let q=$1(H,{withFileTypes:!0});for(let K of q){if(K.name==="node_modules"||K.name===".git"||K.name.startsWith("."))continue;let z=M$(H,K.name),_=K.isDirectory();if(K.isSymbolicLink())try{_=Q1(z).isDirectory()}catch{continue}if(!_)continue;let B=M$(z,"SKILL.md");if(A$(B))Z.push(z);if(X===null||W<X)Y(z,W+1)}}catch{}};return Y($,0),Z};var X1=($,Q)=>{if(!A$($))return[];let X=[],Z=Q.toLowerCase().replace(/\\/g,"/"),Y=(H,W="")=>{try{let q=$1(H,{withFileTypes:!0});for(let K of q){let z=M$(H,K.name),_=W?`${W}/${K.name}`:K.name,B=K.isDirectory();if(K.isSymbolicLink())try{B=Q1(z).isDirectory()}catch{continue}if(B&&(K.name==="node_modules"||K.name===".git"||K.name.startsWith(".")))continue;if(B)Y(z,_);else if(K.name==="SKILL.md"){let G=W.toLowerCase().replace(/\\/g,"/");if(G===Z||G.endsWith("/"+Z)||G.endsWith(Z))X.push({file:z,path:W})}}}catch(q){}};return Y($),X},Y1=($,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 W=X$[X].prefix+Y.path;try{let q=$$(Y.file),K=q.description||q.whenToUse||"(no description)";console.log(` ${W}`),console.log(` ${K}
|
|
8
|
+
`)}catch(q){console.log(` ${W}`),console.log(` (unable to read description)
|
|
9
|
+
`)}}console.log("Please be more specific. Examples:");for(let Y of Q.slice(0,2)){let H=X$[X].prefix;console.log(` superpowers-agent execute ${H}${Y.path}`)}};import{existsSync as T$}from"fs";import{join as W2,relative as z2}from"path";var E2=($)=>{let{type:Q,path:X}=J$($),Z={superpowers:[E.homeSuperpowersSkills],claude:[E.projectClaudeSkills,E.homeClaudeSkills],copilot:[E.projectCopilotSkills,E.homeCopilotSkills],opencode:[E.projectOpencodeSkills,E.homeOpencodeSkills],project:[E.projectAgentsSkills],personal:[E.homePersonalSkills]},Y;if(Q)Y=(Z[Q]||[]).map((W)=>({type:Q,dir:W}));else if(E.isSuperpowersRepo&&T$(E.projectSkillsDir))Y=[{type:"project",dir:E.projectSkillsDir},{type:"project",dir:E.projectAgentsSkills},{type:"claude",dir:E.projectClaudeSkills},{type:"copilot",dir:E.projectCopilotSkills},{type:"opencode",dir:E.projectOpencodeSkills},{type:"personal",dir:E.homePersonalSkills},{type:"personalClaude",dir:E.homeClaudeSkills},{type:"personalCopilot",dir:E.homeCopilotSkills},{type:"personalOpencode",dir:E.homeOpencodeSkills},{type:"superpowers",dir:E.homeSuperpowersSkills}];else Y=[{type:"project",dir:E.projectAgentsSkills},{type:"claude",dir:E.projectClaudeSkills},{type:"copilot",dir:E.projectCopilotSkills},{type:"opencode",dir:E.projectOpencodeSkills},{type:"personal",dir:E.homePersonalSkills},{type:"personalClaude",dir:E.homeClaudeSkills},{type:"personalCopilot",dir:E.homeCopilotSkills},{type:"personalOpencode",dir:E.homeOpencodeSkills},{type:"superpowers",dir:E.homeSuperpowersSkills}];for(let{type:H,dir:W}of Y){let q=X1(W,X);if(q.length===1)return{skillFile:q[0].file,sourceType:H,actualSkillPath:q[0].path};if(q.length>1)Y1(X,q,H)}return null},i=($)=>{let Q=E2($);if(Q)return Q;let{type:X,path:Z}=J$($),Y={superpowers:[E.homeSuperpowersSkills],claude:[E.projectClaudeSkills,E.homeClaudeSkills],copilot:[E.projectCopilotSkills,E.homeCopilotSkills],opencode:[E.projectOpencodeSkills,E.homeOpencodeSkills],project:[E.projectAgentsSkills],personal:[E.homePersonalSkills]},H;if(X)H=(Y[X]||[]).map((q)=>({type:X,dir:q}));else if(E.isSuperpowersRepo&&T$(E.projectSkillsDir))H=[{type:"project",dir:E.projectSkillsDir},{type:"project",dir:E.projectAgentsSkills},{type:"claude",dir:E.projectClaudeSkills},{type:"copilot",dir:E.projectCopilotSkills},{type:"opencode",dir:E.projectOpencodeSkills},{type:"personal",dir:E.homePersonalSkills},{type:"personalClaude",dir:E.homeClaudeSkills},{type:"personalCopilot",dir:E.homeCopilotSkills},{type:"personalOpencode",dir:E.homeOpencodeSkills},{type:"superpowers",dir:E.homeSuperpowersSkills}];else H=[{type:"project",dir:E.projectAgentsSkills},{type:"claude",dir:E.projectClaudeSkills},{type:"copilot",dir:E.projectCopilotSkills},{type:"opencode",dir:E.projectOpencodeSkills},{type:"personal",dir:E.homePersonalSkills},{type:"personalClaude",dir:E.homeClaudeSkills},{type:"personalCopilot",dir:E.homeCopilotSkills},{type:"personalOpencode",dir:E.homeOpencodeSkills},{type:"superpowers",dir:E.homeSuperpowersSkills}];for(let{type:W,dir:q}of H){if(!T$(q))continue;let K=K$(q,W,null);for(let z of K){let _=Q$(z);if(_&&_.aliases&&Array.isArray(_.aliases)){let B=Z.toLowerCase();for(let G of _.aliases)if(G.toLowerCase()===B){let V=W2(z,"SKILL.md"),I=z2(q,z);return{skillFile:V,sourceType:W,actualSkillPath:I}}}}}return null};import{readFileSync as Z1,writeFileSync as H1,existsSync as v$}from"fs";import{join as r}from"path";import{execSync as K2}from"child_process";var C$=()=>({auto_update:!0,last_update_check:null,last_updated_commit:null}),Y$=()=>{let $=r(E.superpowersRepo,".config.json");try{if(!v$($))return C$();let Q=Z1($,"utf8");return{...C$(),...JSON.parse(Q)}}catch{return C$()}},q1=($)=>{let Q=r(E.superpowersRepo,".config.json"),Z={...Y$(),...$};try{H1(Q,JSON.stringify(Z,null,2))}catch(Y){console.log(`Warning: couldn't save config: ${Y.message}`)}},y=($)=>{let Q=$?r(E.home,".agents","config.json"):r(process.cwd(),".agents","config.json");if(!v$(Q))return{};try{let X=Z1(Q,"utf8");return JSON.parse(X)}catch(X){return{}}},m=($,Q)=>{let X=Q?r(E.home,".agents"):r(process.cwd(),".agents"),Z=r(X,"config.json");try{if(!v$(X))K2(`mkdir -p "${X}"`,{stdio:"pipe"});return H1(Z,JSON.stringify($,null,2),"utf8"),!0}catch(Y){throw Error(`Failed to write config: ${Y.message}`)}},P=($=!1)=>{return y($).repositories||{}},W1=($,Q,X)=>{let Z=y(X);if(!Z.repositories)Z.repositories={};Z.repositories[$]=Q,m(Z,X)};function z1($=!0){return y($).installedSkills||{}}function b$($,Q=!0){let X=y(Q);if(X.installedSkills)delete X.installedSkills[$];m(X,Q)}function E1(){return y(!0).installedAgents||{}}import{readFileSync as B2}from"fs";import{join as N$,dirname as _2}from"path";import{fileURLToPath as G2}from"url";import{existsSync as K1}from"fs";import{execSync as V2}from"child_process";var L2=G2(import.meta.url),F$=_2(L2),g=()=>{try{let $=N$(F$,"package.json");if(!K1($))$=N$(F$,"..","package.json");if(!K1($))$=N$(F$,"..","..","package.json");return JSON.parse(B2($,"utf8")).version||"0.0.0"}catch{return"0.0.0"}},k=()=>{let $=g();console.log(`^^SAV:${$}^^`)},B$=async()=>{try{let Q=V2('curl -sS "https://registry.npmjs.org/@complexthings/superpowers-agent/latest"',{encoding:"utf8",timeout:1e4}),X=JSON.parse(Q);if(!X.version)return g();return X.version}catch($){throw Error(`Failed to fetch remote version: ${$.message}`)}},_$=($,Q)=>{let X=$.split(".").map(Number),Z=Q.split(".").map(Number);for(let Y=0;Y<3;Y++){let H=X[Y]||0,W=Z[Y]||0;if(H>W)return!0;if(H<W)return!1}return!1};var U2={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:"}},I2=($,Q)=>{let X=w2($,"SKILL.md"),{dir:Z,prefix:Y}=U2[Q],H=B1(E[Z],$).replace(/\\/g,"/");console.log(`${Y}${H}`);let{description:W,whenToUse:q}=$$(X);if(W)console.log(` ${W}`);if(q)console.log(` When to use: ${q}`);console.log("")},a=()=>{k();let $=new Set,Q=[{type:"project",dir:E.projectAgentsSkills,maxDepth:null},{type:"claude",dir:E.projectClaudeSkills,maxDepth:null},{type:"copilot",dir:E.projectCopilotSkills,maxDepth:null},{type:"opencode",dir:E.projectOpencodeSkills,maxDepth:null},{type:"personal",dir:E.homePersonalSkills,maxDepth:null},{type:"personalClaude",dir:E.homeClaudeSkills,maxDepth:null},{type:"personalCopilot",dir:E.homeCopilotSkills,maxDepth:null},{type:"personalOpencode",dir:E.homeOpencodeSkills,maxDepth:null},{type:"superpowers",dir:E.homeSuperpowersSkills,maxDepth:null}];for(let{type:X,dir:Z,maxDepth:Y}of Q){let H=K$(Z,X,Y);for(let W of H){let q=B1(Z,W);if(!$.has(q))$.add(q),I2(W,X)}}console.log(`Usage:
|
|
10
|
+
superpowers-agent execute <skill-name> # Load a specific skill`)},G1=()=>{k();let $=process.argv[3];if(!$){console.log(`Usage: superpowers-agent execute <skill-name-or-alias>
|
|
11
11
|
|
|
12
12
|
Examples:
|
|
13
13
|
superpowers-agent execute brainstorming
|
|
@@ -17,13 +17,13 @@ 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=
|
|
20
|
+
Supports skill aliases defined in skill.json files.`);return}let Q=i($);if(!Q){console.log(`Error: Skill not found: ${$}
|
|
21
21
|
|
|
22
|
-
Available skills:`),
|
|
22
|
+
Available skills:`),a();return}let{skillFile:X,sourceType:Z}=Q,Y=process.cwd(),H=X.startsWith(Y),W=x$(E.projectAgentsSkills)||x$(E.projectClaudeSkills);if(H)console.log(`Open this file with your Read Tool: ${X}
|
|
23
23
|
|
|
24
24
|
<IMPORTANT>
|
|
25
25
|
USE YOUR Read Tool to process this file. DO NOT use \`cat\` or print commands.
|
|
26
|
-
</IMPORTANT>`);else if(
|
|
26
|
+
</IMPORTANT>`);else if(W&&Z!=="project")console.log(`Open this file with your Read Tool: ${X}
|
|
27
27
|
|
|
28
28
|
<IMPORTANT>
|
|
29
29
|
1. Try using your Read Tool first
|
|
@@ -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>`)},V1=()=>{let $=process.argv[3];if(!$){console.log(`Usage: superpowers-agent path <skill-name-or-alias>
|
|
40
40
|
|
|
41
41
|
Examples:
|
|
42
42
|
superpowers-agent path brainstorming
|
|
@@ -46,9 +46,9 @@ Examples:
|
|
|
46
46
|
|
|
47
47
|
Description:
|
|
48
48
|
Outputs the file system path of the specified SKILL.md file.
|
|
49
|
-
Supports skill aliases defined in skill.json files.`);return}let Q=
|
|
49
|
+
Supports skill aliases defined in skill.json files.`);return}let Q=i($);if(!Q){console.log(`Error: Skill not found: ${$}
|
|
50
50
|
|
|
51
|
-
Available skills:`),
|
|
51
|
+
Available skills:`),a();return}let{skillFile:X}=Q;console.log(X)},L1=()=>{let $=process.argv[3];if(!$){console.log(`Usage: superpowers-agent dir <skill-name>
|
|
52
52
|
|
|
53
53
|
Examples:
|
|
54
54
|
superpowers-agent dir brainstorming
|
|
@@ -58,9 +58,9 @@ Examples:
|
|
|
58
58
|
|
|
59
59
|
Description:
|
|
60
60
|
Returns the directory path where the specified skill is located.
|
|
61
|
-
Supports skill aliases defined in skill.json files.`);return}let Q=
|
|
61
|
+
Supports skill aliases defined in skill.json files.`);return}let Q=i($);if(!Q){console.log(`Error: Skill not found: ${$}
|
|
62
62
|
|
|
63
|
-
Available skills:`),
|
|
63
|
+
Available skills:`),a();return}let{skillFile:X}=Q,Z=_1(X);console.log(Z)},w1=()=>{k();let $=process.argv[3],Q=process.argv[4];if(!$||!Q){console.log(`Usage: superpowers-agent get-helpers <skill-name> <helper-search-term>
|
|
64
64
|
|
|
65
65
|
Examples:
|
|
66
66
|
superpowers-agent get-helpers block-collection search-block
|
|
@@ -72,133 +72,116 @@ 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=
|
|
75
|
+
short names like "block-collection" instead of the full path.`);return}let X=i($);if(!X){console.log(`Error: Skill not found: ${$}
|
|
76
76
|
|
|
77
|
-
Available skills:`),
|
|
78
|
-
Location: ${
|
|
79
|
-
Location: ${
|
|
80
|
-
Available helpers:`);for(let
|
|
81
|
-
Defined in skill.json but missing from filesystem`);return}console.log(
|
|
77
|
+
Available skills:`),a();return}let{skillFile:Z}=X,Y=_1(Z),H=Q$(Y);if(!H){console.log(`Error: No skill.json found for skill: ${$}
|
|
78
|
+
Location: ${Y}`);return}if(!H.helpers||!Array.isArray(H.helpers)||H.helpers.length===0){console.log(`Error: No helpers defined in skill.json for skill: ${$}
|
|
79
|
+
Location: ${Y}`);return}let W=e$(Y,Q);if(!W){console.log(`Error: No helper found matching "${Q}" in skill: ${$}`),console.log(`
|
|
80
|
+
Available helpers:`);for(let q of H.helpers)console.log(` - ${q}`);return}if(!x$(W)){console.log(`Error: Helper file not found: ${W}
|
|
81
|
+
Defined in skill.json but missing from filesystem`);return}console.log(W)},U1=()=>{let $=Y$();console.log("Current configuration:"),console.log(JSON.stringify($,null,2))},I1=()=>{let $=process.argv[3],Q=process.argv[4];if(!$||Q===void 0){console.log(`Usage: .agents/superpowers-agent config-set <key> <value>
|
|
82
82
|
|
|
83
83
|
Available keys:
|
|
84
84
|
auto_update (true/false) - Enable/disable automatic updates during bootstrap
|
|
85
85
|
|
|
86
86
|
Examples:
|
|
87
87
|
.agents/superpowers-agent config-set auto_update false
|
|
88
|
-
.agents/superpowers-agent config-set auto_update true`);return}let X=Q;if(Q==="true")X=!0;else if(Q==="false")X=!1;let
|
|
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,q1(Z),console.log(`✓ Set ${$} = ${X}`)},O1=()=>{k();let $=P(!0),Q=P(!1),X=[];for(let[H,W]of Object.entries($))X.push({alias:H,url:W,source:"global"});for(let[H,W]of Object.entries(Q)){let q=X.findIndex((K)=>K.alias===H);if(q>=0)X[q]={alias:H,url:W,source:"project"};else X.push({alias:H,url:W,source:"project"})}if(X.length===0){console.log(`No repository aliases configured.
|
|
89
89
|
|
|
90
90
|
Add a repository using:
|
|
91
|
-
superpowers-agent add-repository <git-url> [--as=@alias]`);return}let
|
|
92
|
-
`),console.log(`${"Alias".padEnd(
|
|
93
|
-
Total: ${X.length} repository alias(es)`)};var
|
|
94
|
-
`);let Q=await
|
|
91
|
+
superpowers-agent add-repository <git-url> [--as=@alias]`);return}let Z=Math.max(5,...X.map((H)=>H.alias.length)),Y=Math.max(3,...X.map((H)=>H.url.length));console.log(`Repositories:
|
|
92
|
+
`),console.log(`${"Alias".padEnd(Z)} ${"URL".padEnd(Y)} Source`);for(let H of X)console.log(`${H.alias.padEnd(Z)} ${H.url.padEnd(Y)} (${H.source})`);console.log(`
|
|
93
|
+
Total: ${X.length} repository alias(es)`)};var G$=async()=>{try{let $=g(),Q=await B$();return{hasUpdates:_$(Q,$),localVersion:$,remoteVersion:Q}}catch{return{hasUpdates:!1,localVersion:g(),remoteVersion:"",error:!0}}};import{execSync as J1}from"child_process";var D$=async({skipReinstall:$=!1}={})=>{console.log(`# Checking for Superpowers updates...
|
|
94
|
+
`);let Q=await G$();if(Q.error){console.log("⚠️ Could not check for updates (network issue)");return}if(!Q.hasUpdates){console.log(`✓ Already up to date (v${Q.localVersion})`);return}if(console.log(`\uD83D\uDCE6 Update available: v${Q.localVersion} → v${Q.remoteVersion}
|
|
95
95
|
`),$){console.log(" Skipping install (--no-reinstall flag set)"),console.log(` Run manually: npm install -g @complexthings/superpowers-agent
|
|
96
96
|
`);return}console.log(` Installing update...
|
|
97
|
-
`);try{
|
|
97
|
+
`);try{J1("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)}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
${H}
|
|
104
|
-
|
|
105
|
-
`,
|
|
99
|
+
✗ Update failed: ${X.message}`),console.log(" Try running manually: npm install -g @complexthings/superpowers-agent"),process.exit(1)}console.log(`
|
|
100
|
+
Running bootstrap to complete setup...
|
|
101
|
+
`);try{J1("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")}},A1=async()=>{k();let $=g();console.log(`Current version: ${$}`);try{let Q=await B$();if(console.log(`Latest version: ${Q}`),_$(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)}},M1=()=>{let $=g();console.log($)};import{existsSync as M,readFileSync as o,writeFileSync as t,rmSync as u1,lstatSync as p2}from"fs";import{join as C,dirname as P1,parse as Z$}from"path";import{execSync as R}from"child_process";import{platform as h2}from"os";import{execSync as O2}from"child_process";var j$=($)=>{try{return O2(`which ${$}`,{stdio:"pipe",timeout:2000}),!0}catch{return!1}};var D={opencode:{check:()=>j$("opencode"),cli:!0,name:"OpenCode",installUrl:"https://opencode.ai/docs/installation",bootstrapCommand:"install-opencode-commands"},claude:{check:()=>j$("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"}},T1=()=>{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 R$,readdirSync as VQ,lstatSync as J2,symlinkSync as C1,unlinkSync as A2,mkdirSync as M2,readlinkSync as T2}from"fs";import{join as S$,dirname as wQ}from"path";import{platform as C2}from"os";var y$=($)=>{try{return J2($).isSymbolicLink()}catch{return!1}},v2=($,Q)=>{try{if(!y$($))return!1;return T2($)===Q}catch{return!1}},v1=()=>{let $=S$(E.superpowersRepo,".opencode","plugins","superpowers-agent.js"),Q=S$(E.home,".config","opencode","plugins"),X=S$(Q,"superpowers-agent.js");if(console.log("Installing OpenCode plugin symlink..."),!R$($))return console.log("⚠️ Source plugin not found, skipping symlink creation"),console.log(` Expected at: ${$}`),{created:!1,error:"Source plugin not found"};if(v2(X,$))return console.log("✓ Plugin symlink already exists and is correct"),{created:!1,existed:!0};if(R$(X)&&!y$(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(!R$(Q))try{M2(Q,{recursive:!0}),console.log(`✓ Created ${Q.replace(E.home,"~")}`)}catch(Y){return console.log(`⚠️ Failed to create plugins directory: ${Y.message}`),{created:!1,error:`Failed to create directory: ${Y.message}`}}if(y$(X))try{A2(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=C2();try{if(Z==="win32")C1($,X,"file");else C1($,X);let Y=$.replace(E.home,"~"),H=X.replace(E.home,"~");return console.log(`✓ Created symlink: ${H}`),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 l,readdirSync as b2,lstatSync as N2,symlinkSync as V$,unlinkSync as f$,mkdirSync as b1,readlinkSync as F2}from"fs";import{join as c,dirname as x2,basename as D2}from"path";import{homedir as n,platform as N1}from"os";var L$=[{name:"claude",parentDir:()=>c(n(),".claude"),skillsDir:()=>c(n(),".claude","skills")},{name:"copilot",parentDir:()=>c(n(),".copilot"),skillsDir:()=>c(n(),".copilot","skills")},{name:"opencode",parentDir:()=>c(n(),".config","opencode"),skillsDir:()=>c(n(),".config","opencode","skill")}],s=($)=>{try{return N2($).isSymbolicLink()}catch{return!1}},F1=($,Q)=>{try{if(!s($))return!1;return F2($)===Q}catch{return!1}},x1=($,Q)=>{if(!l($))return{created:!1,existed:!1,error:`Source does not exist: ${$}`};if(F1(Q,$))return{created:!1,existed:!0};if(l(Q)||s(Q))if(s(Q))try{f$(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=x2(Q);if(!l(X))try{b1(X,{recursive:!0})}catch(Y){return{created:!1,existed:!1,error:`Failed to create parent directory: ${Y.message}`}}let Z=N1();try{if(Z==="win32")V$($,Q,"junction");else V$($,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}`}}},g$=($)=>{if(!l($)&&!s($))return{removed:!1,error:"Symlink does not exist"};if(!s($))return{removed:!1,error:"Target is not a symlink"};try{return f$($),{removed:!0}}catch(Q){return{removed:!1,error:`Failed to remove symlink: ${Q.message}`}}};var D1=($,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((H)=>H!==Q)}m(Z,!0)};var j1=($,Q=[])=>{let X;try{X=b2($,{withFileTypes:!0})}catch{return Q}let Z=!1,Y=[];for(let H of X){if(!H.isDirectory()&&H.name==="SKILL.md")Z=!0;if(H.isDirectory()&&!H.name.startsWith("."))Y.push(c($,H.name))}if(Z)Q.push($);for(let H of Y)j1(H,Q);return Q},R1=()=>{let $=E.homeSuperpowersSkills,Q=E.homePersonalSkills;if(!l($))return{created:0,existed:0,updated:0,errors:[`Skills directory not found: ${$}`]};if(!l(Q))try{b1(Q,{recursive:!0})}catch(Y){return{created:0,existed:0,updated:0,errors:[`Failed to create ${Q}: ${Y.message}`]}}let X=j1($),Z={created:0,existed:0,updated:0,errors:[]};for(let Y of X){let H=D2(Y),W=c(Q,H);if(F1(W,Y)){Z.existed++;continue}if(s(W))try{f$(W),Z.updated++}catch(K){Z.errors.push(`Failed to remove stale symlink ${W}: ${K.message}`);continue}else if(l(W)){Z.errors.push(`Skipped ${W}: path exists and is not a symlink`);continue}let q=N1();try{if(q==="win32")V$(Y,W,"junction");else V$(Y,W,"dir");let K=W.replace(n(),"~"),z=Y.replace(n(),"~");console.log(` ✓ ${K} -> ${z}`),Z.created++}catch(K){Z.errors.push(`Failed to create symlink ${W}: ${K.message}`)}}return Z};import{existsSync as S1,readdirSync as j2,lstatSync as R2,unlinkSync as S2,realpathSync as y1}from"fs";import{join as j}from"path";import{homedir as f1}from"os";var y2=($)=>{try{return y1($)}catch{return $}},f2=($)=>{try{return R2($).isSymbolicLink()}catch{return!1}},g2=($)=>{try{return y1($)}catch{return null}},u2=($,Q)=>{let X=Q.endsWith("/")?Q:Q+"/";return $.startsWith(X)||$===Q},P2=($,Q)=>Q.some((X)=>u2($,X)),k2=($)=>{try{return S1(j($,"skill.json"))}catch{return!1}},d2=({platformDirs:$,managedSkillRoots:Q})=>{let X=[],Z=0,Y=Q.map(y2);for(let H of $){if(!S1(H))continue;let W;try{W=j2(H)}catch{continue}for(let q of W){let K=j(H,q);if(!f2(K))continue;let z=g2(K);if(!z||!P2(z,Y)){Z++;continue}if(!k2(z)){Z++;continue}try{S2(K),X.push(K)}catch{Z++}}}return{removed:X,skipped:Z}},m2=($)=>{let Q=f1(),X=[j(Q,".claude","skills"),j(Q,".copilot","skills"),j(Q,".config","opencode","skill"),j(Q,".cursor","skills"),j(Q,".gemini","skills"),j(Q,".codex","skills")];if(!$)return X;let Z=[j($,".claude","skills"),j($,".github","skills"),j($,".opencode","skill"),j($,".cursor","skills"),j($,".gemini","skills"),j($,".codex","skills")];return[...X,...Z]},g1=($={})=>{let Q=f1(),X=[j(Q,".agents","skills"),...$.projectRoot?[j($.projectRoot,".agents","skills")]:[]],Z=m2($.projectRoot);return d2({platformDirs:Z,managedSkillRoots:X})};var c2=()=>{let $=C(E.superpowersRepo,".agents","templates","TOOLS.md.template");if(M($))try{return o($,"utf8").trim()}catch(Q){return"### Using Tools\n\nUse your native skill tool. Fallback: `superpowers-agent find-skills`"}return""},w$=($,Q,X,Z=!0)=>{let Y=M($);if(!Y&&!Z)return{updated:!1,created:!1,skipped:!0};let H=c2(),W=Q.replace(/\{\{TOOL_MAPPINGS\}\}/g,H),q=new Date().toISOString().split("T")[0];W=W.replace(/\{\{DATE\}\}/g,q),W=W.replace(/\{\{SUPERPOWERS_PATH\}\}/g,E.superpowersRepo);let K=`<!-- SUPERPOWERS_SKILLS_START -->
|
|
104
|
+
${W}
|
|
105
|
+
<!-- SUPERPOWERS_SKILLS_END -->`;if(Y){let z=new Date().toISOString().split("T")[0],_=`${$}.backup-${z}`;try{R(`cp "${$}" "${_}"`,{stdio:"pipe"})}catch(w){return{updated:!1,error:!0,message:`Failed to backup: ${w.message}`}}let B;try{B=o($,"utf8")}catch(w){return{updated:!1,error:!0,message:`Failed to read: ${w.message}`}}let G="<!-- SUPERPOWERS_SKILLS_START -->",V="<!-- SUPERPOWERS_SKILLS_END -->",I;if(B.includes(G)&&B.includes(V)){let w=new RegExp(`${G}[\\s\\S]*?${V}`,"g");I=B.replace(w,K)}else{let w=B.match(/^#\s+.+$/m);if(w){let J=B.indexOf(`
|
|
106
|
+
`,w.index)+1;I=B.slice(0,J)+`
|
|
106
107
|
`+K+`
|
|
107
|
-
`+B.slice(
|
|
108
|
+
`+B.slice(J)}else I=K+`
|
|
108
109
|
|
|
109
|
-
`+B}try{return
|
|
110
|
+
`+B}try{return t($,I,"utf8"),{updated:!0,created:!1,backup:_}}catch(w){return{updated:!1,error:!0,message:`Failed to write: ${w.message}`}}}else try{let z=P1($);if(!M(z))R(`mkdir -p "${z}"`,{stdio:"pipe"});let G=`# ${Z$($).base.toUpperCase()}
|
|
110
111
|
|
|
111
|
-
`+K;return
|
|
112
|
+
`+K;return t($,G,"utf8"),{updated:!1,created:!0}}catch(z){return{updated:!1,created:!1,error:!0,message:`Failed to create: ${z.message}`}}},n2=()=>{console.log("Installing Unix aliases...");let $=C(E.superpowersRepo,".agents","superpowers-agent"),Q=C(E.home,".local","bin"),X=C(Q,"superpowers-agent"),Z=C(Q,"superpowers");if(!M($)){console.log("⚠️ superpowers-agent executable not found");return}if(!M(Q))try{R(`mkdir -p "${Q}"`,{stdio:"pipe"}),console.log(`✓ Created ${Q}`)}catch(H){console.log(`⚠️ Failed to create ${Q}: ${H.message}`);return}try{if(M(X))R(`rm "${X}"`,{stdio:"pipe"});R(`ln -s "${$}" "${X}"`,{stdio:"pipe"}),console.log(`✓ Created symlink: superpowers-agent -> ${$}`)}catch(H){console.log(`⚠️ Failed to create superpowers-agent symlink: ${H.message}`)}try{if(M(Z))R(`rm "${Z}"`,{stdio:"pipe"});R(`ln -s "${$}" "${Z}"`,{stdio:"pipe"}),console.log(`✓ Created symlink: superpowers -> ${$}`)}catch(H){console.log(`⚠️ Failed to create superpowers symlink: ${H.message}`)}if(!(process.env.PATH||"").includes(Q))console.log(`
|
|
112
113
|
⚠️ 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
|
-
`)},
|
|
114
|
-
`),$==="win32")return
|
|
114
|
+
`)},o2=()=>{console.log("Installing Windows aliases..."),console.log("✓ Windows alias installation (implementation pending)")},u$=()=>{let $=h2();if(console.log(`## Installing Universal Aliases
|
|
115
|
+
`),$==="win32")return o2();else return n2()},i2=($)=>{let Q=C(E.superpowersRepo,".github","copilot-instructions.md"),X=C(E.superpowersRepo,"skills","meta","using-superpowers","SKILL.md"),Z=C($,".github","copilot-instructions.md"),Y="<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->",H="<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->";if(!M(Q))return{error:!0,message:"Source template not found"};if(!M(X))return{error:!0,message:"using-superpowers SKILL.md not found"};let W,q;try{W=o(Q,"utf8"),q=o(X,"utf8")}catch(_){return{error:!0,message:`Failed to read source files: ${_.message}`}}let K=W.replace("${content}",q);if(!K.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_START -->")||!K.includes("<!-- SUPERPOWERS_-_INSTRUCTIONS_END -->"))return{error:!0,message:"Template is missing required markers"};let z=P1(Z);try{if(!M(z))R(`mkdir -p "${z}"`,{stdio:"pipe"})}catch(_){return{error:!0,message:`Failed to create .github directory: ${_.message}`}}if(M(Z)){let _;try{_=o(Z,"utf8")}catch(V){return{error:!0,message:`Failed to read existing file: ${V.message}`}}let B=new Date().toISOString().replace(/[:.]/g,"-"),G=`${Z}.backup-${B}`;try{R(`cp "${Z}" "${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"),I=_.replace(V,K.trim());try{return t(Z,I,"utf8"),{updated:!0,backup:G}}catch(w){return{error:!0,message:`Failed to update: ${w.message}`}}}else{let V=_.trimEnd()+`
|
|
115
116
|
|
|
116
117
|
`+K.trim()+`
|
|
117
|
-
`;try{return Z
|
|
118
|
-
`);let $=process.cwd(),Q=
|
|
119
|
-
Expected at: ${
|
|
120
|
-
Please update your Superpowers installation`);return}if(!
|
|
118
|
+
`;try{return t(Z,V,"utf8"),{updated:!0,backup:G}}catch(I){return{error:!0,message:`Failed to append: ${I.message}`}}}}else try{return t(Z,K,"utf8"),{created:!0}}catch(_){return{error:!0,message:`Failed to create: ${_.message}`}}},k1=()=>{k(),console.log(`# Setting up Superpowers skills for this project
|
|
119
|
+
`);let $=process.cwd(),Q=C($,".agents"),X=C(Q,"skills"),Z=C($,"AGENTS.md"),Y=C(Q,"AGENTS.md"),H=M(Z)?Z:Y,W=C(E.superpowersRepo,".agents","templates","AGENTS.md.template");if(!M(W)){console.log(`✗ Error: AGENTS.md template not found
|
|
120
|
+
Expected at: ${W}
|
|
121
|
+
Please update your Superpowers installation`);return}if(!M(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(!M(X))try{R(`mkdir -p "${X}"`,{stdio:"pipe"}),R(`touch "${C(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 q=C(Q,"docs"),K=C(q,"SUPERPOWERS.md"),z=C(E.superpowersRepo,".agents","templates","SUPERPOWERS.md.template");if(!M(q))try{R(`mkdir -p "${q}"`,{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 _=M(H);if(_){let O=new Date().toISOString().split("T")[0],h=`${H}.backup-${O}`;try{R(`cp "${H}" "${h}"`,{stdio:"pipe"}),console.log(`✓ Backed up existing AGENTS.md to ${Z$(h).base}`)}catch(z$){console.log(`✗ Failed to backup AGENTS.md: ${z$.message}`);return}}let B;try{B=o(W,"utf8")}catch(O){console.log(`✗ Failed to read template: ${O.message}`);return}let G=g();if(B=B.replace(/\{\{VERSION\}\}/g,G),M(z))try{let O=o(z,"utf8"),h=new Date().toISOString().split("T")[0];O=O.replace(/\{\{VERSION\}\}/g,G),O=O.replace(/\{\{DATE\}\}/g,h),t(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=C($,".github","copilot-instructions.md"),w=C(E.home,".github","copilot-instructions.md");if(M(I)||M(w)||D.copilot.check())V.push("github-copilot");let J=C($,"CLAUDE.md"),N=C(Q,"CLAUDE.md");if(M(J)||M(N)||D.claude.check())V.push("claude-code");if(D.opencode.check())V.push("opencode");console.log(`
|
|
121
122
|
Detected platforms for project: ${V.join(", ")||"none"}
|
|
122
|
-
`);let
|
|
123
|
-
## Syncing Project Skill Symlinks
|
|
124
|
-
`);let n=hQ({projectRoot:$});if(n.created>0)console.log(`
|
|
125
|
-
✓ Created ${n.created} project skill symlink(s)`);else if(n.existed>0)console.log("ℹ️ Project skill symlinks already exist");else if(n.errors.length>0)console.log("⚠️ Some symlinks could not be created");else console.log("ℹ️ No agent directories detected for symlinking");let l=`
|
|
123
|
+
`);let S=V.filter((O)=>["github-copilot","opencode"].includes(O)),v=w$(H,B,S,!_);if(v.created)console.log(`✓ Created AGENTS.md with platform tool mappings (${H===Z?"root":".agents/"})`);else if(v.updated)console.log(`✓ Updated AGENTS.md with platform tool mappings (${H===Z?"root":".agents/"})`);else if(v.error)console.log("⚠️ Failed to update AGENTS.md");let W$=M(J)?J:N,L=w$(W$,B,["claude-code"],!1);if(L.created)console.log(`✓ Created CLAUDE.md with Claude Code tool mappings (${W$===J?"root":".agents/"})`);else if(L.updated){if(console.log(`✓ Updated CLAUDE.md with Claude Code tool mappings (${W$===J?"root":".agents/"})`),L.backup)console.log(` Backed up to ${Z$(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 U=C($,".github","copilot-instructions.md"),F={skipped:!0};if(V.includes("github-copilot")){if(F=i2($),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 ${Z$(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 f=!M(Z)&&!M(Y);if(M(U)&&f){let O=w$(U,B,["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 ${Z$(O.backup).base}`)}else if(O.error)console.log("⚠️ Failed to update .github/copilot-instructions.md with tool mappings")}else if(M(U)&&!f)console.log("ℹ️ Skipped .github/copilot-instructions.md tool mappings (AGENTS.md exists, using that instead)");else if(!M(U)&&!V.includes("github-copilot"))console.log("ℹ️ Skipped .github/copilot-instructions.md tool mappings (does not exist)");let u=`
|
|
126
124
|
# Setup complete!
|
|
127
125
|
|
|
128
126
|
Your project now has:
|
|
129
|
-
- .agents/ directory structure`;if(
|
|
130
|
-
- AGENTS.md with universal skills instructions`;if(
|
|
131
|
-
- CLAUDE.md with Claude Code skills instructions`;if(
|
|
132
|
-
-
|
|
133
|
-
- .
|
|
134
|
-
- ${n.created} project skill symlink(s) to agent directories`;l+=`
|
|
135
|
-
- .agents/skills/ ready for project-specific skills`,l+=`
|
|
127
|
+
- .agents/ directory structure`;if(v.updated||v.created)u+=`
|
|
128
|
+
- AGENTS.md with universal skills instructions`;if(L.updated||L.created)u+=`
|
|
129
|
+
- CLAUDE.md with Claude Code skills instructions`;if(F.updated||F.created)u+=`
|
|
130
|
+
- .github/copilot-instructions.md with Superpowers instructions`;u+=`
|
|
131
|
+
- .agents/skills/ ready for project-specific skills`,u+=`
|
|
136
132
|
- .agents/docs/SUPERPOWERS.md for detailed reference
|
|
137
|
-
`,console.log(
|
|
133
|
+
`,console.log(u)},r2=()=>{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)=>C(E.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)=>C(E.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)=>C(E.home,".config","opencode","command",X))],Q=0;for(let X of $)if(M(X))try{u1(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")},l2=()=>{let $=0;for(let Q of L$){let X=Q.skillsDir(),Z=C(X,"superpowers");try{if(p2(Z).isSymbolicLink())u1(Z),console.log(`✓ Removed legacy superpowers symlink from ${X.replace(E.home,"~")}`),$++}catch{}}if($===0)console.log("✓ No legacy superpowers directory symlinks found")},d1=async()=>{k(),console.log(`# Superpowers Bootstrap for Agents
|
|
138
134
|
# ==================================
|
|
139
|
-
`);let $=process.argv.includes("--no-update"),X=new Set(["copilot","
|
|
135
|
+
`);let $=process.argv.includes("--no-update"),X=new Set(["copilot","claude","opencode"].filter((W)=>process.argv.includes(`--force-${W}`))),Z=X.size>0;if(!$){let W=Y$(),q=await G$();if(q.error)console.log(`## Update Check
|
|
140
136
|
|
|
141
137
|
⚠️ Could not check for updates (network issue)
|
|
142
138
|
|
|
143
139
|
---
|
|
144
|
-
`);else if(
|
|
145
|
-
`),console.log(`⚠️ Update available: v${
|
|
140
|
+
`);else if(q.hasUpdates)console.log(`## Update Available
|
|
141
|
+
`),console.log(`⚠️ Update available: v${q.localVersion} → v${q.remoteVersion}
|
|
146
142
|
To update, run: \`npm install -g @complexthings/superpowers-agent\``),console.log(`
|
|
147
143
|
---
|
|
148
|
-
`)}if(!
|
|
149
|
-
`);if(!
|
|
150
|
-
`),
|
|
144
|
+
`)}if(!Z)u$(),console.log(`---
|
|
145
|
+
`);if(!Z)console.log(`## Cleaning Up Legacy Files
|
|
146
|
+
`),r2(),console.log(`
|
|
151
147
|
---
|
|
152
|
-
`);if(!
|
|
148
|
+
`);if(!Z||X.has("copilot"))console.log(`## GitHub Copilot Integration
|
|
153
149
|
`),console.log("✓ Skill symlinks handled in sync step below"),console.log(`
|
|
154
150
|
---
|
|
155
|
-
`);if(!
|
|
156
|
-
`)
|
|
157
|
-
---
|
|
158
|
-
`);if(!Y||X.has("codex")){if(console.log(`## OpenAI Codex Integration
|
|
159
|
-
`),!M.codex.check())console.log(`⚠️ Skipped (${M.codex.name} CLI not detected)
|
|
160
|
-
\uD83D\uDCA1 To enable Codex integration:
|
|
161
|
-
1. Install Codex: ${M.codex.installUrl}
|
|
162
|
-
2. Run: superpowers-agent ${M.codex.bootstrapCommand}`);else console.log("✓ Skill symlinks handled in sync step below");console.log(`
|
|
163
|
-
---
|
|
164
|
-
`)}if(!Y||X.has("gemini")){if(console.log(`## Gemini Integration
|
|
165
|
-
`),!M.gemini.check())console.log(`⚠️ Skipped (${M.gemini.name} CLI not detected)
|
|
166
|
-
\uD83D\uDCA1 To enable Gemini integration:
|
|
167
|
-
1. Install Gemini: ${M.gemini.installUrl}
|
|
168
|
-
2. Run: superpowers-agent ${M.gemini.bootstrapCommand}`);else console.log("✓ Skill symlinks handled in sync step below");console.log(`
|
|
169
|
-
---
|
|
170
|
-
`)}if(!Y||X.has("claude")){if(console.log(`## Claude Code Integration
|
|
171
|
-
`),!M.claude.check())console.log(`⚠️ Skipped (${M.claude.name} CLI not detected)
|
|
151
|
+
`);if(!Z||X.has("claude")){if(console.log(`## Claude Code Integration
|
|
152
|
+
`),!D.claude.check())console.log(`⚠️ Skipped (${D.claude.name} CLI not detected)
|
|
172
153
|
\uD83D\uDCA1 To enable Claude Code integration:
|
|
173
|
-
1. Install Claude Code: ${
|
|
174
|
-
2. Run: superpowers-agent ${
|
|
154
|
+
1. Install Claude Code: ${D.claude.installUrl}
|
|
155
|
+
2. Run: superpowers-agent ${D.claude.bootstrapCommand}`);else console.log("✓ Skill symlinks handled in sync step below");console.log(`
|
|
175
156
|
---
|
|
176
|
-
`)}if(!
|
|
177
|
-
`),
|
|
157
|
+
`)}if(!Z||X.has("opencode")){if(console.log(`## OpenCode Integration
|
|
158
|
+
`),D.opencode.check())v1();else console.log(`⚠️ Skipped (${D.opencode.name} CLI not detected)
|
|
178
159
|
\uD83D\uDCA1 To enable OpenCode integration:
|
|
179
|
-
1. Install OpenCode: ${
|
|
180
|
-
2. Run: superpowers-agent ${
|
|
160
|
+
1. Install OpenCode: ${D.opencode.installUrl}
|
|
161
|
+
2. Run: superpowers-agent ${D.opencode.bootstrapCommand}`);console.log(`
|
|
181
162
|
---
|
|
182
|
-
`)}if(!
|
|
183
|
-
`);let
|
|
184
|
-
`);let
|
|
185
|
-
`)}if(K){let
|
|
163
|
+
`)}if(!Z){console.log(`## Generating Platform-Specific Files
|
|
164
|
+
`);let W=T1();console.log(`Detected platforms: ${W.join(", ")||"none"}
|
|
165
|
+
`);let q=C(E.superpowersRepo,".agents","templates","AGENTS.md.template"),K="";try{K=o(q,"utf8")}catch(z){console.log(`⚠️ Could not read AGENTS.md template: ${z.message}
|
|
166
|
+
`)}if(K){let z=g();K=K.replace(/\{\{VERSION\}\}/g,z);let _=C(E.home,".agents","AGENTS.md"),B=w$(_,K,W,!0);if(B.created)console.log(`✓ Created ${_}`);else if(B.updated)console.log(`✓ Updated ${_}`)}console.log(`
|
|
186
167
|
---
|
|
187
168
|
`)}console.log(`## Cleaning Up Legacy Superpowers Dir Symlinks
|
|
188
|
-
`),
|
|
169
|
+
`),l2(),console.log(`
|
|
189
170
|
---
|
|
190
171
|
`),console.log(`## Syncing Repo Skills -> ~/.agents/skills/
|
|
191
|
-
`);let
|
|
172
|
+
`);let Y=R1();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 W of Y.errors)console.log(` ⚠️ ${W}`);else console.log(` ✓ ${Y.existed} skill symlinks already up to date`);console.log(`
|
|
173
|
+
---
|
|
174
|
+
`),console.log(`## Cleaning Up Stale Platform Skill Symlinks
|
|
175
|
+
`);let H=g1({projectRoot:process.cwd()});if(H.removed.length>0){console.log(` ✓ Removed ${H.removed.length} stale skill symlink(s):`);for(let W of H.removed)console.log(` - ${W}`)}else console.log(" ✓ No stale platform skill symlinks found");console.log(`
|
|
192
176
|
---
|
|
193
|
-
`),console.log(
|
|
194
|
-
`);let q=process.argv.includes("--force");uQ({force:q,forceAgents:X}),console.log(`# Bootstrap Complete!
|
|
177
|
+
`),console.log(`# Bootstrap Complete!
|
|
195
178
|
`),console.log("✓ All integrations installed"),console.log("✓ Skills system ready"),console.log(`✓ Skill symlinks synced
|
|
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
|
|
197
|
-
⚠ Could not parse agents.json: ${V.message}`);return}let
|
|
198
|
-
⚠ Invalid agents.json: ${
|
|
199
|
-
\uD83D\uDCE6 Found agents.json (${
|
|
200
|
-
${
|
|
201
|
-
${K} ${_} agent(s)${B>0?` (${B} failed)`:""}`)}var
|
|
179
|
+
`),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 I$,mkdirSync as Z3,rmSync as h$,cpSync as H3,lstatSync as q3}from"fs";import{join as T,dirname as O$,parse as q$,sep as W3}from"path";import{execSync as x}from"child_process";import{homedir as p}from"os";import{createInterface as z3}from"readline";import{readFileSync as a2,existsSync as d$,unlinkSync as s2,lstatSync as t2,mkdirSync as e2}from"fs";import{join as $3,dirname as Q3}from"path";import{join as H$}from"path";import{homedir as m1}from"os";var P$={github:{name:"github",sourceDir:".github/agents",sourceExt:".agent.md",getDestDir:()=>H$(E.vscodeUserDir,"prompts"),destExt:".agent.md"},opencode:{name:"opencode",sourceDir:".opencode/agents",sourceExt:".md",getDestDir:()=>H$(m1(),".config","opencode","agents"),destExt:".md"},claude:{name:"claude",sourceDir:".claude/agents",sourceExt:".md",getDestDir:()=>H$(m1(),".claude","agents"),destExt:".md"}};function p1($,Q,X){let Z=P$[Q];if(!Z)return null;return H$($,Z.sourceDir,`${X}${Z.sourceExt}`)}function h1($,Q){let X=P$[$];if(!X)return null;return H$(X.getDestDir(),`${Q}${X.destExt}`)}function k$(){return Object.keys(P$)}function X3($){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=k$(),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 H of Y)if(typeof H!=="string")return{valid:!1,error:`agents.${Z} must contain only string agent names`}}return{valid:!0,data:$,skippedPlatforms:X}}function Y3($,Q){if(!d$($))return{installed:!1,error:`Source file not found: ${$}`};if(d$(Q))try{if(!t2(Q).isSymbolicLink())s2(Q)}catch(Z){}e2(Q3(Q),{recursive:!0});let X=x1($,Q);if(X.error)return{installed:!1,error:X.error};return{installed:!0}}function m$($,Q={}){let X=$3($,"agents.json");if(!d$(X))return;let Z;try{Z=JSON.parse(a2(X,"utf8"))}catch(V){console.log(`
|
|
180
|
+
⚠ Could not parse agents.json: ${V.message}`);return}let Y=X3(Z);if(!Y.valid){console.log(`
|
|
181
|
+
⚠ Invalid agents.json: ${Y.error}`);return}for(let V of Y.skippedPlatforms)console.log(` ⚠ Skipping unknown platform: ${V}`);let H=Z.repository||"unknown",W=Z.version,q=Q.isUpdate?"Updating":"Installing",K=Q.isUpdate?"Updated":"Installed";console.log(`
|
|
182
|
+
\uD83D\uDCE6 Found agents.json (${H} v${W})`);let z=k$(),_=0,B=0,G=[];for(let[V,I]of Object.entries(Z.agents)){if(!z.includes(V))continue;console.log(`
|
|
183
|
+
${q} ${V} agents:`);for(let w of I){let J=p1($,V,w),N=h1(V,w),S=Y3(J,N);if(S.installed)console.log(` ✓ ${w}`),G.push({platformKey:V,agentName:w,sourcePath:J,destPath:N}),_++;else console.log(` ✗ ${w}: ${S.error}`),B++}}if(G.length>0){let V=y(!0);if(!V.installedAgents)V.installedAgents={};if(!V.installedAgents[H])V.installedAgents[H]={version:W,agents:{}};V.installedAgents[H].version=W;for(let{platformKey:I,agentName:w,sourcePath:J,destPath:N}of G){if(!V.installedAgents[H].agents[I])V.installedAgents[H].agents[I]={};V.installedAgents[H].agents[I][w]={source:J,destination:N,installedAt:new Date().toISOString()}}m(V,!0)}if(_>0)console.log(`
|
|
184
|
+
${K} ${_} agent(s)${B>0?` (${B} failed)`:""}`)}var c1=($,Q)=>{if(Q.type==="local"){let Z=$;for(let Y=0;Y<10;Y++){if(b(T(Z,"agents.json")))return Z;let H=O$(Z);if(H===Z)break;Z=H}return $}let X=T(".agents","tmp");if($.includes(X)){let Z=$.indexOf(X),H=$.substring(Z+X.length+1).split(W3)[0];return T($.substring(0,Z),".agents","tmp",H)}return $},n1=($,Q)=>{let X=T(p(),".agents","repos"),Z=Q.replace(/^@/,"").replace(/[^a-zA-Z0-9_-]/g,"_"),Y=T(X,Z);try{if(Z3(X,{recursive:!0}),b(Y))h$(Y,{recursive:!0,force:!0});return H3($,Y,{recursive:!0}),Y}catch(H){return console.log(` Warning: Could not persist repository for agents: ${H.message}`),null}},c$=($)=>{let Q=$.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+)\/tree\/([^/]+)\/(.+)$/);if(Q){let[,Y,H,W,q]=Q;return{type:"git-tree",repoUrl:`https://github.com/${Y}/${H}.git`,branch:W,path:q,original:$}}let X=$.match(/^git@github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/);if(X){let[,Y,H]=X;return{type:"git-repo",repoUrl:`git@github.com:${Y}/${H}.git`,branch:null,path:null,original:$}}let Z=$.match(/^https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\.git)?$/);if(Z){let[,Y,H]=Z;return{type:"git-repo",repoUrl:`https://github.com/${Y}/${H}.git`,branch:null,path:null,original:$}}if(b($))return{type:"local",path:$,original:$};return null},n$=($)=>{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 H of[Z,Y])if(b(H))try{if(JSON.parse(I$(H,"utf8")).installLocation==="project")return T(process.cwd(),".agents","skills")}catch(W){}return T(p(),".agents","skills")},o$=($,Q)=>{let X=T(p(),".agents","tmp",`skill-install-${Date.now()}`);try{if(x(`mkdir -p "${X}"`,{stdio:"pipe"}),Q)x(`git clone --branch ${Q} --depth 1 "${$}" "${X}"`,{stdio:"pipe",timeout:30000});else x(`git clone --depth 1 "${$}" "${X}"`,{stdio:"pipe",timeout:30000});return X}catch(Z){try{x(`rm -rf "${X}"`,{stdio:"pipe"})}catch{}throw Error(`Failed to clone repository: ${Z.message}`)}},e=($)=>{let Q=T($,"skill.json");if(!b(Q))return null;try{let X=I$(Q,"utf8");return JSON.parse(X)}catch(X){throw Error(`Failed to read skill.json: ${X.message}`)}},U$=($,Q,X,Z)=>{let Y=T($,Q);if(!b(Y)){Z.errors.push(`Skill directory not found: ${Q}`);return}let H=e(Y);if(!H){Z.errors.push(`No skill.json found in: ${Q}`);return}let W=H.name||Q,q=W.split("/").pop()||W,K=T(X,q),z=O$(K);try{x(`mkdir -p "${z}"`,{stdio:"pipe"})}catch(_){Z.errors.push(`Failed to create directory ${z}: ${_.message}`);return}try{if(b(K))x(`rm -rf "${K}"`,{stdio:"pipe"});x(`cp -R "${Y}" "${K}"`,{stdio:"pipe"}),Z.installed.push({name:q,path:K,title:H.title||H.description||q})}catch(_){Z.errors.push(`Failed to install ${Q}: ${_.message}`)}},o1=($,Q,X,Z,Y=null)=>{let H=y(Z);if(!H.installedSkills)H.installedSkills={};let W={source:$,installBase:Q,installedAt:new Date().toISOString(),skills:X.installed.map((q)=>({name:q.name,path:q.path}))};if(H.installedSkills[$]=W,Y&&Y!==$)H.installedSkills[Y]=W;m(H,Z)},i1=()=>{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]
|
|
202
185
|
|
|
203
186
|
Options:
|
|
204
187
|
--global, -g Install skills globally in ~/.agents/skills/ (default)
|
|
@@ -220,19 +203,18 @@ Description:
|
|
|
220
203
|
|
|
221
204
|
Repository aliases can be added using:
|
|
222
205
|
superpowers-agent add-repository <git-url> [--as=@alias]`);return}console.log(`Installing skill(s)...
|
|
223
|
-
`);let
|
|
224
|
-
Available aliases:`);let
|
|
225
|
-
Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[
|
|
226
|
-
`);else Q=
|
|
227
|
-
`);else if(Q=
|
|
228
|
-
`);else console.log(`Repository URL: ${
|
|
229
|
-
`)}let
|
|
230
|
-
`);let
|
|
231
|
-
`);for(let
|
|
232
|
-
**Successfully installed skills:**`),console.log(`- Source: ${G.source}`),G.installed.length>0)for(let
|
|
233
|
-
**Errors:**`);for(let
|
|
234
|
-
|
|
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]
|
|
206
|
+
`);let Z=!X.includes("--project")&&!X.includes("-p"),Y=null,H=null,W=null;if(Q.startsWith("@")){let B=Q;W=B,H=$.find((w,J)=>J>0&&!w.startsWith("-")&&w!==B);let G=P(!1),V=P(!0);if(G[B])Y=G[B],console.log(`Using project repository alias: ${B}`);else if(V[B])Y=V[B],console.log(`Using global repository alias: ${B}`);else{console.log(`Error: Repository alias not found: ${B}`),console.log(`
|
|
207
|
+
Available aliases:`);let w={...V,...G};if(Object.keys(w).length===0)console.log(" (none)"),console.log(`
|
|
208
|
+
Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[J,N]of Object.entries(w))console.log(` ${J} -> ${N}`);return}let I=b(Y);if(H)if(I)Q=T(Y,H),console.log(`Repository path: ${Y}`),console.log(`Skill path: ${H}
|
|
209
|
+
`);else Q=Y,console.log(`Repository URL: ${Y}`),console.log(`Skill path: ${H}
|
|
210
|
+
`);else if(Q=Y,I)console.log(`Repository path: ${Y}
|
|
211
|
+
`);else console.log(`Repository URL: ${Y}
|
|
212
|
+
`)}let q=c$(Q);if(!q){console.log(`Error: Invalid URL or path not found: ${Q}`);return}if(H&&q.type==="git-repo"&&!q.path)q.path=H;let K=n$(X);console.log(`Install location: ${K}
|
|
213
|
+
`);let z,_=!1;try{if(q.type==="git-repo"||q.type==="git-tree"){if(console.log(`Cloning repository: ${q.repoUrl}`),q.branch)console.log(`Branch: ${q.branch}`);if(z=o$(q.repoUrl,q.branch),_=!0,q.path){if(z=T(z,q.path),!b(z))throw Error(`Path not found in repository: ${q.path}`)}console.log("")}else z=q.path;let B=e(z);if(!B)throw Error("No skill.json found in source directory");let G={installed:[],errors:[],source:q.original};if(B.skills&&Array.isArray(B.skills)){console.log(`Found ${B.skills.length} skill(s) to install
|
|
214
|
+
`);for(let w of B.skills)U$(z,w,K,G)}else{let w=B.name||q$(z).base;U$(O$(z),q$(z).base,K,G)}let V=c1(z,q),I=T(V,"agents.json");if(b(I)){let w=V;if(_){let J;try{J=JSON.parse(I$(I,"utf8"))}catch{}let N=J?.repository||q.original,S=n1(V,N);if(S)w=S}m$(w,{isUpdate:!1})}if(_&&z)try{let w=z.split("/.agents/tmp/")[0]+"/.agents/tmp/"+z.split("/.agents/tmp/")[1].split("/")[0];x(`rm -rf "${w}"`,{stdio:"pipe"})}catch{}if(console.log(`
|
|
215
|
+
**Successfully installed skills:**`),console.log(`- Source: ${G.source}`),G.installed.length>0)for(let w of G.installed)console.log(` - Installed: ${w.name} at ${w.path}`),console.log(` ${w.title}`);if(G.errors.length>0){console.log(`
|
|
216
|
+
**Errors:**`);for(let w of G.errors)console.log(` - ${w}`)}if(G.installed.length===0&&G.errors.length===0)console.log(" No skills were installed");if(G.installed.length>0)o1(q.original,K,G,Z,W)}catch(B){if(_&&z)try{let G=z.split("/.agents/tmp/")[0]+"/.agents/tmp/"+z.split("/.agents/tmp/")[1].split("/")[0];x(`rm -rf "${G}"`,{stdio:"pipe"})}catch{}console.log(`
|
|
217
|
+
Error: ${B.message}`)}},r1=()=>{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]
|
|
236
218
|
|
|
237
219
|
Options:
|
|
238
220
|
--global, -g Update skills globally in ~/.agents/skills/ (default)
|
|
@@ -257,19 +239,18 @@ Description:
|
|
|
257
239
|
|
|
258
240
|
Repository aliases can be added using:
|
|
259
241
|
superpowers-agent add-repository <git-url> [--as=@alias]`);return}console.log(`Updating skill(s)...
|
|
260
|
-
`);let
|
|
261
|
-
Available aliases:`);let
|
|
262
|
-
Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[
|
|
263
|
-
`);else Q=
|
|
264
|
-
`);else if(Q=
|
|
265
|
-
`);else console.log(`Repository URL: ${
|
|
266
|
-
`)}let
|
|
267
|
-
`);let
|
|
268
|
-
`);for(let
|
|
269
|
-
**Successfully updated skills:**`),console.log(`- Source: ${G.source}`),G.installed.length>0)for(let
|
|
270
|
-
**Errors:**`);for(let
|
|
271
|
-
|
|
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]
|
|
242
|
+
`);let Z=!X.includes("--project")&&!X.includes("-p"),Y=null,H=null,W=null;if(Q.startsWith("@")){let B=Q;W=B,H=$.find((w,J)=>J>0&&!w.startsWith("-")&&w!==B);let G=P(!1),V=P(!0);if(G[B])Y=G[B],console.log(`Using project repository alias: ${B}`);else if(V[B])Y=V[B],console.log(`Using global repository alias: ${B}`);else{console.log(`Error: Repository alias not found: ${B}`),console.log(`
|
|
243
|
+
Available aliases:`);let w={...V,...G};if(Object.keys(w).length===0)console.log(" (none)"),console.log(`
|
|
244
|
+
Add a repository using:`),console.log(" superpowers-agent add-repository <git-url>");else for(let[J,N]of Object.entries(w))console.log(` ${J} -> ${N}`);return}let I=b(Y);if(H)if(I)Q=T(Y,H),console.log(`Repository path: ${Y}`),console.log(`Skill path: ${H}
|
|
245
|
+
`);else Q=Y,console.log(`Repository URL: ${Y}`),console.log(`Skill path: ${H}
|
|
246
|
+
`);else if(Q=Y,I)console.log(`Repository path: ${Y}
|
|
247
|
+
`);else console.log(`Repository URL: ${Y}
|
|
248
|
+
`)}let q=c$(Q);if(!q){console.log(`Error: Invalid URL or path not found: ${Q}`);return}if(H&&q.type==="git-repo"&&!q.path)q.path=H;let K=n$(X);console.log(`Install location: ${K}
|
|
249
|
+
`);let z,_=!1;try{if(q.type==="git-repo"||q.type==="git-tree"){if(console.log(`Cloning repository: ${q.repoUrl}`),q.branch)console.log(`Branch: ${q.branch}`);if(z=o$(q.repoUrl,q.branch),_=!0,q.path){if(z=T(z,q.path),!b(z))throw Error(`Path not found in repository: ${q.path}`)}console.log("")}else z=q.path;let B=e(z);if(!B)throw Error("No skill.json found in source directory");let G={installed:[],errors:[],source:q.original};if(B.skills&&Array.isArray(B.skills)){console.log(`Found ${B.skills.length} skill(s) to update
|
|
250
|
+
`);for(let w of B.skills)U$(z,w,K,G)}else{let w=B.name||q$(z).base;U$(O$(z),q$(z).base,K,G)}let V=c1(z,q),I=T(V,"agents.json");if(b(I)){let w=V;if(_){let J;try{J=JSON.parse(I$(I,"utf8"))}catch{}let N=J?.repository||q.original,S=n1(V,N);if(S)w=S}m$(w,{isUpdate:!0})}if(_&&z)try{let w=z.split("/.agents/tmp/")[0]+"/.agents/tmp/"+z.split("/.agents/tmp/")[1].split("/")[0];x(`rm -rf "${w}"`,{stdio:"pipe"})}catch{}if(console.log(`
|
|
251
|
+
**Successfully updated skills:**`),console.log(`- Source: ${G.source}`),G.installed.length>0)for(let w of G.installed)console.log(` - Updated: ${w.name} at ${w.path}`),console.log(` ${w.title}`);if(G.errors.length>0){console.log(`
|
|
252
|
+
**Errors:**`);for(let w of G.errors)console.log(` - ${w}`)}if(G.installed.length===0&&G.errors.length===0)console.log(" No skills were updated");if(G.installed.length>0)o1(q.original,K,G,Z,W)}catch(B){if(_&&z)try{let G=z.split("/.agents/tmp/")[0]+"/.agents/tmp/"+z.split("/.agents/tmp/")[1].split("/")[0];x(`rm -rf "${G}"`,{stdio:"pipe"})}catch{}console.log(`
|
|
253
|
+
Error: ${B.message}`)}},E3=($)=>new Promise((Q)=>{let X=z3({input:process.stdin,output:process.stdout});X.question($,(Z)=>{X.close(),Q(Z.trim())})}),p$=($)=>{try{return q3($).isSymbolicLink()}catch{return!1}},l1=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]
|
|
273
254
|
|
|
274
255
|
Options:
|
|
275
256
|
--global, -g Remove globally installed skills (default)
|
|
@@ -278,10 +259,10 @@ Options:
|
|
|
278
259
|
Examples:
|
|
279
260
|
superpowers-agent rm https://github.com/example/skills
|
|
280
261
|
superpowers-agent rm @myrepo
|
|
281
|
-
superpowers-agent rm ~/my-local-skills`);return}let
|
|
282
|
-
`);let
|
|
283
|
-
Proceed? [y/N] `)).toLowerCase()!=="y"){console.log("Aborted.");return}for(let
|
|
284
|
-
Done.`)},
|
|
262
|
+
superpowers-agent rm ~/my-local-skills`);return}let Z=!X.includes("--project")&&!X.includes("-p"),Y=Q,H=null;if(Q.startsWith("@")){H=Q;let L=P(!1),U=P(!0);if(L[Q])Y=L[Q];else if(U[Q])Y=U[Q];else{console.log(`Error: Repository alias not found: ${Q}`);return}}let W=z1(Z),q=W[Q]||W[Y],K=q?.installBase||n$(X),z=[];if(q)z=q.skills;else{console.log(`No tracking data found. Attempting to re-resolve skills from source...
|
|
263
|
+
`);let L=c$(Y);if(!L){console.log(`Error: Invalid URL or path not found: ${Y}`);return}let U,F=!1;try{if(L.type==="git-repo"||L.type==="git-tree"){if(console.log(`Cloning repository: ${L.repoUrl}`),U=o$(L.repoUrl,L.branch),F=!0,L.path){if(U=T(U,L.path),!b(U))throw Error(`Path not found in repository: ${L.path}`)}}else U=L.path;let f=e(U);if(!f)throw Error("No skill.json found in source");let u=f.skills&&Array.isArray(f.skills)?f.skills:[f.name||q$(U).base];for(let O of u){let h=O;if(f.skills){let z$=T(U,O);if(b(z$)){let i$=e(z$);if(i$?.name)h=i$.name}}z.push({name:h,path:T(K,h)})}if(F)try{let O=U.split("/.agents/tmp/")[0]+"/.agents/tmp/"+U.split("/.agents/tmp/")[1].split("/")[0];x(`rm -rf "${O}"`,{stdio:"pipe"})}catch{}}catch(f){if(F&&U)try{let u=U.split("/.agents/tmp/")[0]+"/.agents/tmp/"+U.split("/.agents/tmp/")[1].split("/")[0];x(`rm -rf "${u}"`,{stdio:"pipe"})}catch{}console.log(`Error resolving source: ${f.message}`);return}}let _=z.filter((L)=>b(L.path)||p$(L.path)),B=[];for(let L of z)for(let U of L$){let F=T(U.skillsDir(),L.name);if(b(F)||p$(F))B.push({platform:U.name,path:F})}let G=E1(),V=H||Y,I=[];if(G[V]){for(let[,L]of Object.entries(G[V].agents||{}))for(let[,U]of Object.entries(L))if(U.destination&&(b(U.destination)||p$(U.destination)))I.push({path:U.destination})}let w=V.replace(/^@/,"").replace(/[^a-zA-Z0-9_-]/g,"_"),J=T(p(),".agents","repos",w),N=b(J),S=p(),v=(L)=>L.replace(S,"~");if(_.length===0&&B.length===0&&I.length===0&&!N){console.log("Nothing to remove.");return}if(console.log("Will remove:"),_.length>0){console.log(" Skills:");for(let L of _)console.log(` ${v(L.path)}`)}if(B.length>0){console.log(" Platform symlinks:");for(let L of B)console.log(` ${v(L.path)}`)}if(I.length>0){console.log(" Agents:");for(let L of I)console.log(` ${v(L.path)}`)}if(N)console.log(" Persisted repo:"),console.log(` ${v(J)}`);if((await E3(`
|
|
264
|
+
Proceed? [y/N] `)).toLowerCase()!=="y"){console.log("Aborted.");return}for(let L of B){let U=g$(L.path);if(U.removed)console.log(`Removed symlink: ${v(L.path)}`),D1(L.platform,L.path,"skills");else if(U.error==="Symlink does not exist")console.log(`Already removed: ${v(L.path)}`);else console.log(`Warning: ${v(L.path)}: ${U.error}`)}for(let L of I){let U=g$(L.path);if(U.removed)console.log(`Removed agent: ${v(L.path)}`);else if(U.error==="Symlink does not exist")console.log(`Already removed: ${v(L.path)}`);else console.log(`Warning: ${v(L.path)}: ${U.error}`)}if(N)try{h$(J,{recursive:!0,force:!0}),console.log(`Removed persisted repo: ${v(J)}`)}catch(L){console.log(`Warning: Failed to remove persisted repo: ${L.message}`)}for(let L of _){if(!b(L.path)){console.log(`Already removed: ${v(L.path)}`);continue}try{h$(L.path,{recursive:!0,force:!0}),console.log(`Removed skill: ${v(L.path)}`)}catch(U){console.log(`Warning: Failed to remove ${v(L.path)}: ${U.message}`)}}if(b$(Q,Z),Y!==Q)b$(Y,Z);if(G[V]){let L=y(!0);if(L.installedAgents)delete L.installedAgents[V],m(L,!0)}console.log(`
|
|
265
|
+
Done.`)},a1=()=>{let $=process.argv.slice(3),Q=$.find((z)=>!z.startsWith("-")),X=$.filter((z)=>z.startsWith("-"));if(!Q){console.log(`Usage: superpowers-agent add-repository <git-url> [options]
|
|
285
266
|
|
|
286
267
|
Options:
|
|
287
268
|
--global, -g Add repository globally in ~/.agents/config.json (default)
|
|
@@ -299,9 +280,9 @@ Description:
|
|
|
299
280
|
The repository's skill.json will be read to determine the default alias.
|
|
300
281
|
Use --as to specify a custom alias.
|
|
301
282
|
After adding, you can install skills using: superpowers-agent add @alias path/to/skill`);return}console.log(`Adding repository...
|
|
302
|
-
`);let
|
|
303
|
-
You can now install skills using:`),console.log(` superpowers-agent add ${_} <path-to-skill>`)}catch(
|
|
304
|
-
Error: ${
|
|
283
|
+
`);let Z=X.some((z)=>z==="--global"||z==="-g"),Y=X.some((z)=>z==="--project"||z==="-p"),H=X.find((z)=>z.startsWith("--as=")),W=H?H.split("=")[1]:null,q=Y?!1:!0,K;try{console.log(`Cloning repository: ${Q}`),K=T(p(),".agents","tmp",`repo-add-${Date.now()}`),x(`mkdir -p "${K}"`,{stdio:"pipe"}),x(`git clone --depth 1 "${Q}" "${K}"`,{stdio:"pipe",timeout:30000}),console.log("");let z=e(K);if(!z)throw Error("No skill.json found in repository");let _;if(W)_=W;else if(z.repository)_=z.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.")}W1(_,Q,q),x(`rm -rf "${K}"`,{stdio:"pipe"});let B=q?"globally":"in project",G=q?T(p(),".agents","config.json"):T(process.cwd(),".agents","config.json");console.log(`✓ Repository added ${B}`),console.log(` Alias: ${_}`),console.log(` URL: ${Q}`),console.log(` Config: ${G}`),console.log(`
|
|
284
|
+
You can now install skills using:`),console.log(` superpowers-agent add ${_} <path-to-skill>`)}catch(z){if(K)try{x(`rm -rf "${K}"`,{stdio:"pipe"})}catch{}console.log(`
|
|
285
|
+
Error: ${z.message}`)}};import{dirname as K3}from"path";var s1=($)=>{if(!$){console.log(`Usage: superpowers-agent use-skill <skill-name>
|
|
305
286
|
|
|
306
287
|
Examples (smart matching):
|
|
307
288
|
superpowers-agent use-skill brainstorming # Matches superpowers:collaboration/brainstorming
|
|
@@ -316,15 +297,15 @@ Examples (explicit paths):
|
|
|
316
297
|
Smart matching:
|
|
317
298
|
- Type just the skill name or any suffix of the path
|
|
318
299
|
- Priority: .agents/skills/ > .claude/skills/ > ~/.agents/skills/ > ~/.agents/superpowers/skills/
|
|
319
|
-
- If multiple skills match at same priority, you'll see them with descriptions`);return}let Q=
|
|
300
|
+
- If multiple skills match at same priority, you'll see them with descriptions`);return}let Q=i($);if(!Q){console.log(`Error: Skill not found: ${$}
|
|
320
301
|
|
|
321
|
-
Available skills:`),console.log("Run: superpowers-agent find-skills");return}let{skillFile:X,sourceType:
|
|
322
|
-
# ${
|
|
323
|
-
# When to use: ${
|
|
302
|
+
Available skills:`),console.log("Run: superpowers-agent find-skills");return}let{skillFile:X,sourceType:Z,actualSkillPath:Y}=Q;try{let{content:H,frontmatter:W}=s$(X),q=X$[Z].prefix+Y,K=K3(X),z=`# ${W.name||q}`;if(W.description)z+=`
|
|
303
|
+
# ${W.description}`;if(W.whenToUse)z+=`
|
|
304
|
+
# When to use: ${W.whenToUse}`;z+=`
|
|
324
305
|
# Supporting tools and docs are in ${K}
|
|
325
306
|
# ============================================
|
|
326
307
|
|
|
327
|
-
${
|
|
308
|
+
${H}`,console.log(z)}catch(H){console.log(H.message)}};var t1={bootstrap:d1,version:M1,"check-updates":()=>{A1().catch(($)=>{console.error($.message),process.exit(1)})},update:()=>{let $=process.argv.includes("--no-reinstall");D$({skipReinstall:$})},"config-get":U1,"config-set":I1,"setup-skills":k1,"use-skill":()=>s1(process.argv[3]),execute:G1,"find-skills":a,add:i1,"add-repository":a1,"list-repositories":O1,pull:r1,rm:l1,dir:L1,path:V1,"get-helpers":w1,"install-aliases":u$,default:()=>{console.log(`Superpowers for Agents
|
|
328
309
|
Usage:
|
|
329
310
|
superpowers-agent bootstrap [--no-update] [--force] # Run complete bootstrap
|
|
330
311
|
superpowers-agent version # Show current version
|
|
@@ -344,8 +325,7 @@ Usage:
|
|
|
344
325
|
superpowers-agent path <skill-name> # Get skill file path
|
|
345
326
|
superpowers-agent execute <skill-name> # Execute a skill
|
|
346
327
|
superpowers-agent get-helpers <skill> <search-term> # Get helper file path
|
|
347
|
-
superpowers-agent install-cursor-hooks # Install Cursor hooks
|
|
348
328
|
superpowers-agent install-aliases # Install universal aliases (superpowers, superpowers-agent)
|
|
349
329
|
|
|
350
330
|
Documentation: https://github.com/complexthings/superpowers
|
|
351
|
-
`)}},
|
|
331
|
+
`)}},B3=process.argv[2]||"default",_3=t1[B3]||t1.default;try{let $=_3();if($&&typeof $.then==="function")$.catch((Q)=>{console.error(`Error: ${Q.message}`),process.exit(1)})}catch($){console.error(`Error: ${$.message}`),process.exit(1)}
|